@decaf-ts/integrations 0.3.7 → 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 (417) 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/cjs/nest/index.cjs +2 -3
  76. package/lib/esm/graph/engine/constants.js +62 -0
  77. package/lib/esm/graph/engine/decorators.js +2 -0
  78. package/lib/esm/graph/engine/errors/GraphCycleError.js +15 -0
  79. package/lib/esm/graph/engine/errors/GraphExecutionError.js +22 -0
  80. package/lib/esm/graph/engine/errors/GraphInputError.js +15 -0
  81. package/lib/esm/graph/engine/errors/GraphLoopLimitError.js +15 -0
  82. package/lib/esm/graph/engine/errors/GraphPinningError.js +15 -0
  83. package/lib/esm/graph/engine/errors/GraphPortError.js +15 -0
  84. package/lib/esm/graph/engine/errors/GraphStoreError.js +15 -0
  85. package/lib/esm/graph/engine/errors/GraphTopologyError.js +15 -0
  86. package/lib/esm/graph/engine/errors/index.js +14 -0
  87. package/lib/esm/graph/engine/events/GraphExecutionEvent.js +2 -0
  88. package/lib/esm/graph/engine/events/GraphExecutionEventEmitter.js +35 -0
  89. package/lib/esm/graph/engine/events/GraphExecutionEventFactory.js +32 -0
  90. package/lib/esm/graph/engine/events/GraphExecutionObserver.js +2 -0
  91. package/lib/esm/graph/engine/events/index.js +10 -0
  92. package/lib/esm/graph/engine/execution/CodeSandboxEvaluator.js +18 -0
  93. package/lib/esm/graph/engine/execution/GraphExecutionContext.js +74 -0
  94. package/lib/esm/graph/engine/execution/GraphExecutionEngine.js +403 -0
  95. package/lib/esm/graph/engine/execution/GraphExecutionFrame.js +27 -0
  96. package/lib/esm/graph/engine/execution/GraphExecutionResult.js +26 -0
  97. package/lib/esm/graph/engine/execution/GraphNodeExecutor.js +2 -0
  98. package/lib/esm/graph/engine/execution/SwitchGraphNodeExecutor.js +98 -0
  99. package/lib/esm/graph/engine/execution/index.js +13 -0
  100. package/lib/esm/graph/engine/index.js +67 -0
  101. package/lib/esm/graph/engine/loops/ConditionExpressionEvaluator.js +82 -0
  102. package/lib/esm/graph/engine/loops/ForeachGraphNodeExecutor.js +80 -0
  103. package/lib/esm/graph/engine/loops/GraphConditionEvaluator.js +80 -0
  104. package/lib/esm/graph/engine/loops/GraphLoopExecutionContext.js +11 -0
  105. package/lib/esm/graph/engine/loops/UntilGraphNodeExecutor.js +72 -0
  106. package/lib/esm/graph/engine/loops/WhileGraphNodeExecutor.js +73 -0
  107. package/lib/esm/graph/engine/loops/index.js +12 -0
  108. package/lib/esm/graph/engine/pinning/GraphPinningDependencyResolver.js +23 -0
  109. package/lib/esm/graph/engine/pinning/GraphPinningMetadata.js +15 -0
  110. package/lib/esm/graph/engine/pinning/GraphPinningPolicy.js +29 -0
  111. package/lib/esm/graph/engine/pinning/GraphPinningService.js +186 -0
  112. package/lib/esm/graph/engine/pinning/index.js +10 -0
  113. package/lib/esm/graph/engine/planning/GraphExecutionPlan.js +2 -0
  114. package/lib/esm/graph/engine/planning/GraphExecutionPlanEdge.js +7 -0
  115. package/lib/esm/graph/engine/planning/GraphExecutionPlanLayer.js +2 -0
  116. package/lib/esm/graph/engine/planning/GraphExecutionPlanNode.js +2 -0
  117. package/lib/esm/graph/engine/planning/GraphExecutionPlanner.js +192 -0
  118. package/lib/esm/graph/engine/planning/GraphRelationResolver.js +167 -0
  119. package/lib/esm/graph/engine/planning/GraphTopology.js +52 -0
  120. package/lib/esm/graph/engine/planning/index.js +13 -0
  121. package/lib/esm/graph/engine/registry/GraphNodeExecutorRegistry.js +39 -0
  122. package/lib/esm/graph/engine/registry/GraphNodeExecutorResolver.js +22 -0
  123. package/lib/esm/graph/engine/registry/index.js +8 -0
  124. package/lib/esm/graph/engine/snapshots/GraphExecutionSnapshotMapper.js +48 -0
  125. package/lib/esm/graph/engine/snapshots/index.js +7 -0
  126. package/lib/esm/graph/engine/store/GraphCachedValue.js +2 -0
  127. package/lib/esm/graph/engine/store/GraphValueKey.js +7 -0
  128. package/lib/esm/graph/engine/store/GraphValueStore.js +71 -0
  129. package/lib/esm/graph/engine/store/GraphValueStoreAdapter.js +2 -0
  130. package/lib/esm/graph/engine/store/InMemoryGraphValueStoreAdapter.js +64 -0
  131. package/lib/esm/graph/engine/store/index.js +11 -0
  132. package/lib/esm/graph/engine/types.js +2 -0
  133. package/lib/esm/graph/engine/validation/GraphDefinitionValidator.js +28 -0
  134. package/lib/esm/graph/engine/validation/GraphPortSchemaResolver.js +53 -0
  135. package/lib/esm/graph/engine/validation/GraphValueValidator.js +47 -0
  136. package/lib/esm/graph/engine/validation/index.js +9 -0
  137. package/lib/esm/graph/index.js +9 -59
  138. package/lib/esm/graph/shared/constants.js +56 -0
  139. package/lib/esm/graph/shared/index.js +19 -0
  140. package/lib/esm/graph/shared/nodes/agent.js +101 -0
  141. package/lib/esm/graph/shared/nodes/base.js +30 -0
  142. package/lib/esm/graph/shared/nodes/category-styles.js +34 -0
  143. package/lib/esm/graph/shared/nodes/flow-control.js +455 -0
  144. package/lib/esm/graph/shared/nodes/index.js +18 -0
  145. package/lib/esm/graph/shared/nodes/triggers.js +241 -0
  146. package/lib/esm/graph/shared/types.js +2 -0
  147. package/lib/esm/index.js +3 -3
  148. package/lib/esm/nest/index.js +1 -2
  149. package/lib/types/graph/engine/constants.d.cts +59 -0
  150. package/lib/types/graph/engine/constants.d.mts +59 -0
  151. package/lib/types/graph/{execution → engine/execution}/GraphExecutionResult.d.cts +1 -1
  152. package/lib/types/graph/{execution → engine/execution}/GraphExecutionResult.d.mts +1 -1
  153. package/lib/types/graph/engine/index.d.cts +61 -0
  154. package/lib/types/graph/engine/index.d.mts +61 -0
  155. package/lib/types/graph/{loops → engine/loops}/ConditionExpressionEvaluator.d.cts +1 -1
  156. package/lib/types/graph/{loops → engine/loops}/ConditionExpressionEvaluator.d.mts +1 -1
  157. package/lib/types/graph/{loops → engine/loops}/GraphConditionEvaluator.d.cts +2 -1
  158. package/lib/types/graph/{loops → engine/loops}/GraphConditionEvaluator.d.mts +2 -1
  159. package/lib/types/graph/{types.d.cts → engine/types.d.cts} +8 -116
  160. package/lib/types/graph/{types.d.mts → engine/types.d.mts} +8 -116
  161. package/lib/types/graph/index.d.cts +8 -53
  162. package/lib/types/graph/index.d.mts +8 -53
  163. package/lib/types/graph/shared/constants.d.cts +53 -0
  164. package/lib/types/graph/shared/constants.d.mts +53 -0
  165. package/lib/types/graph/shared/index.d.cts +18 -0
  166. package/lib/types/graph/shared/index.d.mts +18 -0
  167. package/lib/types/graph/shared/types.d.cts +121 -0
  168. package/lib/types/graph/shared/types.d.mts +121 -0
  169. package/lib/types/index.d.cts +2 -2
  170. package/lib/types/index.d.mts +2 -2
  171. package/lib/types/nest/index.d.cts +0 -1
  172. package/lib/types/nest/index.d.mts +0 -1
  173. package/package.json +25 -3
  174. package/lib/cjs/graph/constants.cjs +0 -94
  175. package/lib/cjs/graph/decorators.cjs +0 -4
  176. package/lib/cjs/graph/errors/GraphCycleError.cjs +0 -20
  177. package/lib/cjs/graph/errors/GraphExecutionError.cjs +0 -27
  178. package/lib/cjs/graph/errors/GraphInputError.cjs +0 -20
  179. package/lib/cjs/graph/errors/GraphLoopLimitError.cjs +0 -20
  180. package/lib/cjs/graph/errors/GraphPinningError.cjs +0 -20
  181. package/lib/cjs/graph/errors/GraphPortError.cjs +0 -20
  182. package/lib/cjs/graph/errors/GraphStoreError.cjs +0 -20
  183. package/lib/cjs/graph/errors/GraphTopologyError.cjs +0 -20
  184. package/lib/cjs/graph/events/GraphExecutionEvent.cjs +0 -4
  185. package/lib/cjs/graph/events/GraphExecutionEventEmitter.cjs +0 -40
  186. package/lib/cjs/graph/events/GraphExecutionEventFactory.cjs +0 -37
  187. package/lib/cjs/graph/events/GraphExecutionObserver.cjs +0 -4
  188. package/lib/cjs/graph/execution/CodeSandboxEvaluator.cjs +0 -4
  189. package/lib/cjs/graph/execution/GraphExecutionContext.cjs +0 -79
  190. package/lib/cjs/graph/execution/GraphExecutionEngine.cjs +0 -407
  191. package/lib/cjs/graph/execution/GraphExecutionFrame.cjs +0 -32
  192. package/lib/cjs/graph/execution/GraphExecutionResult.cjs +0 -30
  193. package/lib/cjs/graph/execution/GraphNodeExecutor.cjs +0 -4
  194. package/lib/cjs/graph/execution/SwitchGraphNodeExecutor.cjs +0 -103
  195. package/lib/cjs/graph/loops/ConditionExpressionEvaluator.cjs +0 -87
  196. package/lib/cjs/graph/loops/ForeachGraphNodeExecutor.cjs +0 -84
  197. package/lib/cjs/graph/loops/GraphConditionEvaluator.cjs +0 -85
  198. package/lib/cjs/graph/loops/GraphLoopExecutionContext.cjs +0 -16
  199. package/lib/cjs/graph/loops/UntilGraphNodeExecutor.cjs +0 -76
  200. package/lib/cjs/graph/loops/WhileGraphNodeExecutor.cjs +0 -77
  201. package/lib/cjs/graph/nodes/base.cjs +0 -35
  202. package/lib/cjs/graph/nodes/category-styles.cjs +0 -38
  203. package/lib/cjs/graph/nodes/flow-control.cjs +0 -464
  204. package/lib/cjs/graph/nodes/triggers.cjs +0 -250
  205. package/lib/cjs/graph/pinning/GraphPinningDependencyResolver.cjs +0 -28
  206. package/lib/cjs/graph/pinning/GraphPinningMetadata.cjs +0 -20
  207. package/lib/cjs/graph/pinning/GraphPinningPolicy.cjs +0 -34
  208. package/lib/cjs/graph/pinning/GraphPinningService.cjs +0 -191
  209. package/lib/cjs/graph/planning/GraphExecutionPlan.cjs +0 -4
  210. package/lib/cjs/graph/planning/GraphExecutionPlanEdge.cjs +0 -4
  211. package/lib/cjs/graph/planning/GraphExecutionPlanLayer.cjs +0 -4
  212. package/lib/cjs/graph/planning/GraphExecutionPlanNode.cjs +0 -4
  213. package/lib/cjs/graph/planning/GraphExecutionPlanner.cjs +0 -197
  214. package/lib/cjs/graph/planning/GraphRelationResolver.cjs +0 -172
  215. package/lib/cjs/graph/planning/GraphTopology.cjs +0 -57
  216. package/lib/cjs/graph/registry/GraphNodeExecutorRegistry.cjs +0 -44
  217. package/lib/cjs/graph/registry/GraphNodeExecutorResolver.cjs +0 -27
  218. package/lib/cjs/graph/snapshots/GraphExecutionSnapshotMapper.cjs +0 -53
  219. package/lib/cjs/graph/store/GraphCachedValue.cjs +0 -4
  220. package/lib/cjs/graph/store/GraphValueKey.cjs +0 -4
  221. package/lib/cjs/graph/store/GraphValueStore.cjs +0 -76
  222. package/lib/cjs/graph/store/GraphValueStoreAdapter.cjs +0 -4
  223. package/lib/cjs/graph/store/InMemoryGraphValueStoreAdapter.cjs +0 -69
  224. package/lib/cjs/graph/types.cjs +0 -4
  225. package/lib/cjs/graph/validation/GraphDefinitionValidator.cjs +0 -33
  226. package/lib/cjs/graph/validation/GraphPortSchemaResolver.cjs +0 -58
  227. package/lib/cjs/graph/validation/GraphValueValidator.cjs +0 -52
  228. package/lib/esm/graph/constants.js +0 -106
  229. package/lib/esm/graph/decorators.js +0 -2
  230. package/lib/esm/graph/errors/GraphCycleError.js +0 -15
  231. package/lib/esm/graph/errors/GraphExecutionError.js +0 -22
  232. package/lib/esm/graph/errors/GraphInputError.js +0 -15
  233. package/lib/esm/graph/errors/GraphLoopLimitError.js +0 -15
  234. package/lib/esm/graph/errors/GraphPinningError.js +0 -15
  235. package/lib/esm/graph/errors/GraphPortError.js +0 -15
  236. package/lib/esm/graph/errors/GraphStoreError.js +0 -15
  237. package/lib/esm/graph/errors/GraphTopologyError.js +0 -15
  238. package/lib/esm/graph/errors/index.js +0 -14
  239. package/lib/esm/graph/events/GraphExecutionEvent.js +0 -2
  240. package/lib/esm/graph/events/GraphExecutionEventEmitter.js +0 -35
  241. package/lib/esm/graph/events/GraphExecutionEventFactory.js +0 -32
  242. package/lib/esm/graph/events/GraphExecutionObserver.js +0 -2
  243. package/lib/esm/graph/events/index.js +0 -10
  244. package/lib/esm/graph/execution/CodeSandboxEvaluator.js +0 -18
  245. package/lib/esm/graph/execution/GraphExecutionContext.js +0 -74
  246. package/lib/esm/graph/execution/GraphExecutionEngine.js +0 -402
  247. package/lib/esm/graph/execution/GraphExecutionFrame.js +0 -27
  248. package/lib/esm/graph/execution/GraphExecutionResult.js +0 -26
  249. package/lib/esm/graph/execution/GraphNodeExecutor.js +0 -2
  250. package/lib/esm/graph/execution/SwitchGraphNodeExecutor.js +0 -98
  251. package/lib/esm/graph/execution/index.js +0 -13
  252. package/lib/esm/graph/loops/ConditionExpressionEvaluator.js +0 -82
  253. package/lib/esm/graph/loops/ForeachGraphNodeExecutor.js +0 -79
  254. package/lib/esm/graph/loops/GraphConditionEvaluator.js +0 -80
  255. package/lib/esm/graph/loops/GraphLoopExecutionContext.js +0 -11
  256. package/lib/esm/graph/loops/UntilGraphNodeExecutor.js +0 -71
  257. package/lib/esm/graph/loops/WhileGraphNodeExecutor.js +0 -72
  258. package/lib/esm/graph/loops/index.js +0 -12
  259. package/lib/esm/graph/nodes/agent.js +0 -101
  260. package/lib/esm/graph/nodes/base.js +0 -30
  261. package/lib/esm/graph/nodes/category-styles.js +0 -34
  262. package/lib/esm/graph/nodes/flow-control.js +0 -455
  263. package/lib/esm/graph/nodes/index.js +0 -18
  264. package/lib/esm/graph/nodes/triggers.js +0 -241
  265. package/lib/esm/graph/pinning/GraphPinningDependencyResolver.js +0 -23
  266. package/lib/esm/graph/pinning/GraphPinningMetadata.js +0 -15
  267. package/lib/esm/graph/pinning/GraphPinningPolicy.js +0 -29
  268. package/lib/esm/graph/pinning/GraphPinningService.js +0 -186
  269. package/lib/esm/graph/pinning/index.js +0 -10
  270. package/lib/esm/graph/planning/GraphExecutionPlan.js +0 -2
  271. package/lib/esm/graph/planning/GraphExecutionPlanEdge.js +0 -7
  272. package/lib/esm/graph/planning/GraphExecutionPlanLayer.js +0 -2
  273. package/lib/esm/graph/planning/GraphExecutionPlanNode.js +0 -2
  274. package/lib/esm/graph/planning/GraphExecutionPlanner.js +0 -192
  275. package/lib/esm/graph/planning/GraphRelationResolver.js +0 -167
  276. package/lib/esm/graph/planning/GraphTopology.js +0 -52
  277. package/lib/esm/graph/planning/index.js +0 -13
  278. package/lib/esm/graph/registry/GraphNodeExecutorRegistry.js +0 -39
  279. package/lib/esm/graph/registry/GraphNodeExecutorResolver.js +0 -22
  280. package/lib/esm/graph/registry/index.js +0 -8
  281. package/lib/esm/graph/snapshots/GraphExecutionSnapshotMapper.js +0 -48
  282. package/lib/esm/graph/snapshots/index.js +0 -7
  283. package/lib/esm/graph/store/GraphCachedValue.js +0 -2
  284. package/lib/esm/graph/store/GraphValueKey.js +0 -7
  285. package/lib/esm/graph/store/GraphValueStore.js +0 -71
  286. package/lib/esm/graph/store/GraphValueStoreAdapter.js +0 -2
  287. package/lib/esm/graph/store/InMemoryGraphValueStoreAdapter.js +0 -64
  288. package/lib/esm/graph/store/index.js +0 -11
  289. package/lib/esm/graph/types.js +0 -2
  290. package/lib/esm/graph/validation/GraphDefinitionValidator.js +0 -28
  291. package/lib/esm/graph/validation/GraphPortSchemaResolver.js +0 -53
  292. package/lib/esm/graph/validation/GraphValueValidator.js +0 -47
  293. package/lib/esm/graph/validation/index.js +0 -9
  294. package/lib/types/graph/constants.d.cts +0 -101
  295. package/lib/types/graph/constants.d.mts +0 -101
  296. /package/lib/types/graph/{decorators.d.cts → engine/decorators.d.cts} +0 -0
  297. /package/lib/types/graph/{decorators.d.mts → engine/decorators.d.mts} +0 -0
  298. /package/lib/types/graph/{errors → engine/errors}/GraphCycleError.d.cts +0 -0
  299. /package/lib/types/graph/{errors → engine/errors}/GraphCycleError.d.mts +0 -0
  300. /package/lib/types/graph/{errors → engine/errors}/GraphExecutionError.d.cts +0 -0
  301. /package/lib/types/graph/{errors → engine/errors}/GraphExecutionError.d.mts +0 -0
  302. /package/lib/types/graph/{errors → engine/errors}/GraphInputError.d.cts +0 -0
  303. /package/lib/types/graph/{errors → engine/errors}/GraphInputError.d.mts +0 -0
  304. /package/lib/types/graph/{errors → engine/errors}/GraphLoopLimitError.d.cts +0 -0
  305. /package/lib/types/graph/{errors → engine/errors}/GraphLoopLimitError.d.mts +0 -0
  306. /package/lib/types/graph/{errors → engine/errors}/GraphPinningError.d.cts +0 -0
  307. /package/lib/types/graph/{errors → engine/errors}/GraphPinningError.d.mts +0 -0
  308. /package/lib/types/graph/{errors → engine/errors}/GraphPortError.d.cts +0 -0
  309. /package/lib/types/graph/{errors → engine/errors}/GraphPortError.d.mts +0 -0
  310. /package/lib/types/graph/{errors → engine/errors}/GraphStoreError.d.cts +0 -0
  311. /package/lib/types/graph/{errors → engine/errors}/GraphStoreError.d.mts +0 -0
  312. /package/lib/types/graph/{errors → engine/errors}/GraphTopologyError.d.cts +0 -0
  313. /package/lib/types/graph/{errors → engine/errors}/GraphTopologyError.d.mts +0 -0
  314. /package/lib/types/graph/{errors → engine/errors}/index.d.cts +0 -0
  315. /package/lib/types/graph/{errors → engine/errors}/index.d.mts +0 -0
  316. /package/lib/types/graph/{events → engine/events}/GraphExecutionEvent.d.cts +0 -0
  317. /package/lib/types/graph/{events → engine/events}/GraphExecutionEvent.d.mts +0 -0
  318. /package/lib/types/graph/{events → engine/events}/GraphExecutionEventEmitter.d.cts +0 -0
  319. /package/lib/types/graph/{events → engine/events}/GraphExecutionEventEmitter.d.mts +0 -0
  320. /package/lib/types/graph/{events → engine/events}/GraphExecutionEventFactory.d.cts +0 -0
  321. /package/lib/types/graph/{events → engine/events}/GraphExecutionEventFactory.d.mts +0 -0
  322. /package/lib/types/graph/{events → engine/events}/GraphExecutionObserver.d.cts +0 -0
  323. /package/lib/types/graph/{events → engine/events}/GraphExecutionObserver.d.mts +0 -0
  324. /package/lib/types/graph/{events → engine/events}/index.d.cts +0 -0
  325. /package/lib/types/graph/{events → engine/events}/index.d.mts +0 -0
  326. /package/lib/types/graph/{execution → engine/execution}/CodeSandboxEvaluator.d.cts +0 -0
  327. /package/lib/types/graph/{execution → engine/execution}/CodeSandboxEvaluator.d.mts +0 -0
  328. /package/lib/types/graph/{execution → engine/execution}/GraphExecutionContext.d.cts +0 -0
  329. /package/lib/types/graph/{execution → engine/execution}/GraphExecutionContext.d.mts +0 -0
  330. /package/lib/types/graph/{execution → engine/execution}/GraphExecutionEngine.d.cts +0 -0
  331. /package/lib/types/graph/{execution → engine/execution}/GraphExecutionEngine.d.mts +0 -0
  332. /package/lib/types/graph/{execution → engine/execution}/GraphExecutionFrame.d.cts +0 -0
  333. /package/lib/types/graph/{execution → engine/execution}/GraphExecutionFrame.d.mts +0 -0
  334. /package/lib/types/graph/{execution → engine/execution}/GraphNodeExecutor.d.cts +0 -0
  335. /package/lib/types/graph/{execution → engine/execution}/GraphNodeExecutor.d.mts +0 -0
  336. /package/lib/types/graph/{execution → engine/execution}/SwitchGraphNodeExecutor.d.cts +0 -0
  337. /package/lib/types/graph/{execution → engine/execution}/SwitchGraphNodeExecutor.d.mts +0 -0
  338. /package/lib/types/graph/{execution → engine/execution}/index.d.cts +0 -0
  339. /package/lib/types/graph/{execution → engine/execution}/index.d.mts +0 -0
  340. /package/lib/types/graph/{loops → engine/loops}/ForeachGraphNodeExecutor.d.cts +0 -0
  341. /package/lib/types/graph/{loops → engine/loops}/ForeachGraphNodeExecutor.d.mts +0 -0
  342. /package/lib/types/graph/{loops → engine/loops}/GraphLoopExecutionContext.d.cts +0 -0
  343. /package/lib/types/graph/{loops → engine/loops}/GraphLoopExecutionContext.d.mts +0 -0
  344. /package/lib/types/graph/{loops → engine/loops}/UntilGraphNodeExecutor.d.cts +0 -0
  345. /package/lib/types/graph/{loops → engine/loops}/UntilGraphNodeExecutor.d.mts +0 -0
  346. /package/lib/types/graph/{loops → engine/loops}/WhileGraphNodeExecutor.d.cts +0 -0
  347. /package/lib/types/graph/{loops → engine/loops}/WhileGraphNodeExecutor.d.mts +0 -0
  348. /package/lib/types/graph/{loops → engine/loops}/index.d.cts +0 -0
  349. /package/lib/types/graph/{loops → engine/loops}/index.d.mts +0 -0
  350. /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningDependencyResolver.d.cts +0 -0
  351. /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningDependencyResolver.d.mts +0 -0
  352. /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningMetadata.d.cts +0 -0
  353. /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningMetadata.d.mts +0 -0
  354. /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningPolicy.d.cts +0 -0
  355. /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningPolicy.d.mts +0 -0
  356. /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningService.d.cts +0 -0
  357. /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningService.d.mts +0 -0
  358. /package/lib/types/graph/{pinning → engine/pinning}/index.d.cts +0 -0
  359. /package/lib/types/graph/{pinning → engine/pinning}/index.d.mts +0 -0
  360. /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlan.d.cts +0 -0
  361. /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlan.d.mts +0 -0
  362. /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanEdge.d.cts +0 -0
  363. /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanEdge.d.mts +0 -0
  364. /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanLayer.d.cts +0 -0
  365. /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanLayer.d.mts +0 -0
  366. /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanNode.d.cts +0 -0
  367. /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanNode.d.mts +0 -0
  368. /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanner.d.cts +0 -0
  369. /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanner.d.mts +0 -0
  370. /package/lib/types/graph/{planning → engine/planning}/GraphRelationResolver.d.cts +0 -0
  371. /package/lib/types/graph/{planning → engine/planning}/GraphRelationResolver.d.mts +0 -0
  372. /package/lib/types/graph/{planning → engine/planning}/GraphTopology.d.cts +0 -0
  373. /package/lib/types/graph/{planning → engine/planning}/GraphTopology.d.mts +0 -0
  374. /package/lib/types/graph/{planning → engine/planning}/index.d.cts +0 -0
  375. /package/lib/types/graph/{planning → engine/planning}/index.d.mts +0 -0
  376. /package/lib/types/graph/{registry → engine/registry}/GraphNodeExecutorRegistry.d.cts +0 -0
  377. /package/lib/types/graph/{registry → engine/registry}/GraphNodeExecutorRegistry.d.mts +0 -0
  378. /package/lib/types/graph/{registry → engine/registry}/GraphNodeExecutorResolver.d.cts +0 -0
  379. /package/lib/types/graph/{registry → engine/registry}/GraphNodeExecutorResolver.d.mts +0 -0
  380. /package/lib/types/graph/{registry → engine/registry}/index.d.cts +0 -0
  381. /package/lib/types/graph/{registry → engine/registry}/index.d.mts +0 -0
  382. /package/lib/types/graph/{snapshots → engine/snapshots}/GraphExecutionSnapshotMapper.d.cts +0 -0
  383. /package/lib/types/graph/{snapshots → engine/snapshots}/GraphExecutionSnapshotMapper.d.mts +0 -0
  384. /package/lib/types/graph/{snapshots → engine/snapshots}/index.d.cts +0 -0
  385. /package/lib/types/graph/{snapshots → engine/snapshots}/index.d.mts +0 -0
  386. /package/lib/types/graph/{store → engine/store}/GraphCachedValue.d.cts +0 -0
  387. /package/lib/types/graph/{store → engine/store}/GraphCachedValue.d.mts +0 -0
  388. /package/lib/types/graph/{store → engine/store}/GraphValueKey.d.cts +0 -0
  389. /package/lib/types/graph/{store → engine/store}/GraphValueKey.d.mts +0 -0
  390. /package/lib/types/graph/{store → engine/store}/GraphValueStore.d.cts +0 -0
  391. /package/lib/types/graph/{store → engine/store}/GraphValueStore.d.mts +0 -0
  392. /package/lib/types/graph/{store → engine/store}/GraphValueStoreAdapter.d.cts +0 -0
  393. /package/lib/types/graph/{store → engine/store}/GraphValueStoreAdapter.d.mts +0 -0
  394. /package/lib/types/graph/{store → engine/store}/InMemoryGraphValueStoreAdapter.d.cts +0 -0
  395. /package/lib/types/graph/{store → engine/store}/InMemoryGraphValueStoreAdapter.d.mts +0 -0
  396. /package/lib/types/graph/{store → engine/store}/index.d.cts +0 -0
  397. /package/lib/types/graph/{store → engine/store}/index.d.mts +0 -0
  398. /package/lib/types/graph/{validation → engine/validation}/GraphDefinitionValidator.d.cts +0 -0
  399. /package/lib/types/graph/{validation → engine/validation}/GraphDefinitionValidator.d.mts +0 -0
  400. /package/lib/types/graph/{validation → engine/validation}/GraphPortSchemaResolver.d.cts +0 -0
  401. /package/lib/types/graph/{validation → engine/validation}/GraphPortSchemaResolver.d.mts +0 -0
  402. /package/lib/types/graph/{validation → engine/validation}/GraphValueValidator.d.cts +0 -0
  403. /package/lib/types/graph/{validation → engine/validation}/GraphValueValidator.d.mts +0 -0
  404. /package/lib/types/graph/{validation → engine/validation}/index.d.cts +0 -0
  405. /package/lib/types/graph/{validation → engine/validation}/index.d.mts +0 -0
  406. /package/lib/types/graph/{nodes → shared/nodes}/agent.d.cts +0 -0
  407. /package/lib/types/graph/{nodes → shared/nodes}/agent.d.mts +0 -0
  408. /package/lib/types/graph/{nodes → shared/nodes}/base.d.cts +0 -0
  409. /package/lib/types/graph/{nodes → shared/nodes}/base.d.mts +0 -0
  410. /package/lib/types/graph/{nodes → shared/nodes}/category-styles.d.cts +0 -0
  411. /package/lib/types/graph/{nodes → shared/nodes}/category-styles.d.mts +0 -0
  412. /package/lib/types/graph/{nodes → shared/nodes}/flow-control.d.cts +0 -0
  413. /package/lib/types/graph/{nodes → shared/nodes}/flow-control.d.mts +0 -0
  414. /package/lib/types/graph/{nodes → shared/nodes}/index.d.cts +0 -0
  415. /package/lib/types/graph/{nodes → shared/nodes}/index.d.mts +0 -0
  416. /package/lib/types/graph/{nodes → shared/nodes}/triggers.d.cts +0 -0
  417. /package/lib/types/graph/{nodes → shared/nodes}/triggers.d.mts +0 -0
@@ -1,407 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.GraphExecutionEngine = void 0;
4
- const constants_js_1 = require("./../constants.cjs");
5
- const GraphExecutionEventEmitter_js_1 = require("./../events/GraphExecutionEventEmitter.cjs");
6
- const GraphExecutionEventFactory_js_1 = require("./../events/GraphExecutionEventFactory.cjs");
7
- const GraphExecutionPlanner_js_1 = require("./../planning/GraphExecutionPlanner.cjs");
8
- const InMemoryGraphValueStoreAdapter_js_1 = require("./../store/InMemoryGraphValueStoreAdapter.cjs");
9
- const GraphValueStore_js_1 = require("./../store/GraphValueStore.cjs");
10
- const GraphPinningService_js_1 = require("./../pinning/GraphPinningService.cjs");
11
- const GraphPinningPolicy_js_1 = require("./../pinning/GraphPinningPolicy.cjs");
12
- const GraphPinningDependencyResolver_js_1 = require("./../pinning/GraphPinningDependencyResolver.cjs");
13
- const GraphExecutionContext_js_1 = require("./GraphExecutionContext.cjs");
14
- const GraphExecutionFrame_js_1 = require("./GraphExecutionFrame.cjs");
15
- const GraphExecutionResult_js_1 = require("./GraphExecutionResult.cjs");
16
- /**
17
- * Reference graph execution engine.
18
- *
19
- * Executes a {@link GraphWorkflowDefinition} by:
20
- * 1. Planning the workflow into topological layers.
21
- * 2. Seeding workflow inputs into the value store.
22
- * 3. Executing nodes layer-by-layer with configurable concurrency.
23
- * 4. Routing values along edges.
24
- * 5. Emitting structured events through Decaf's Observable pipeline.
25
- * 6. Returning a complete {@link GraphExecutionResult}.
26
- */
27
- class GraphExecutionEngine {
28
- constructor(config) {
29
- this.emitter = config.eventEmitter ?? new GraphExecutionEventEmitter_js_1.GraphExecutionEventEmitter();
30
- this.planner = config.planner ?? new GraphExecutionPlanner_js_1.GraphExecutionPlanner();
31
- this.valueStoreAdapter =
32
- config.valueStoreAdapter ?? new InMemoryGraphValueStoreAdapter_js_1.InMemoryGraphValueStoreAdapter();
33
- this.defaultOptions = config.defaultOptions ?? {};
34
- this.codeSandboxEvaluator = config.codeSandboxEvaluator;
35
- this.config = config;
36
- config.onEngineCreated?.(this);
37
- }
38
- observe(observer) {
39
- return this.emitter.observe(observer);
40
- }
41
- unObserve(observer) {
42
- this.emitter.unObserve(observer);
43
- }
44
- async updateObservers(event) {
45
- await this.emitter.updateObservers(event);
46
- }
47
- /**
48
- * Executes a workflow with the given inputs and options.
49
- */
50
- async execute(workflow, inputs = {}, options = {}) {
51
- const opts = this.mergeOptions(options);
52
- const runId = opts.runId ?? this.generateRunId();
53
- const path = opts.path ?? [];
54
- const eventFactory = new GraphExecutionEventFactory_js_1.GraphExecutionEventFactory();
55
- const valueStore = new GraphValueStore_js_1.GraphValueStore(this.valueStoreAdapter);
56
- valueStore.seedWorkflowInputs(inputs);
57
- const plan = this.planner.plan(workflow);
58
- const frame = new GraphExecutionFrame_js_1.GraphExecutionFrame(runId, plan, valueStore, eventFactory);
59
- const emitFn = async (partial) => {
60
- await this.emitEvent(frame, {
61
- type: partial.type ?? constants_js_1.GraphExecutionEventType.NODE_OUTPUT,
62
- runId,
63
- parentRunId: opts.parentRunId,
64
- workflowId: workflow.name,
65
- nodeId: partial.nodeId,
66
- path: partial.path ?? path,
67
- ...partial,
68
- });
69
- };
70
- await this.emitEvent(frame, {
71
- type: constants_js_1.GraphExecutionEventType.WORKFLOW_STARTED,
72
- runId,
73
- parentRunId: opts.parentRunId,
74
- workflowId: workflow.name,
75
- path,
76
- status: constants_js_1.GraphExecutionStatus.RUNNING,
77
- payload: { inputs },
78
- });
79
- await this.emitEvent(frame, {
80
- type: constants_js_1.GraphExecutionEventType.WORKFLOW_PLANNED,
81
- runId,
82
- parentRunId: opts.parentRunId,
83
- workflowId: workflow.name,
84
- path,
85
- status: constants_js_1.GraphExecutionStatus.PLANNING,
86
- payload: { layers: plan.layers.length, nodes: plan.nodes.length },
87
- });
88
- try {
89
- for (const layer of plan.layers) {
90
- await this.executeLayer(frame, plan, layer.nodes, opts, emitFn);
91
- }
92
- frame.finish();
93
- await this.emitEvent(frame, {
94
- type: constants_js_1.GraphExecutionEventType.WORKFLOW_COMPLETED,
95
- runId,
96
- parentRunId: opts.parentRunId,
97
- workflowId: workflow.name,
98
- path,
99
- status: constants_js_1.GraphExecutionStatus.SUCCEEDED,
100
- payload: { outputs: valueStore.getWorkflowValues() },
101
- });
102
- return (0, GraphExecutionResult_js_1.buildGraphExecutionResult)(frame, workflow, inputs, constants_js_1.GraphExecutionStatus.SUCCEEDED, opts.metadata);
103
- }
104
- catch (error) {
105
- frame.finish();
106
- const errorPayload = this.toErrorPayload(error);
107
- await this.emitEvent(frame, {
108
- type: constants_js_1.GraphExecutionEventType.WORKFLOW_FAILED,
109
- runId,
110
- parentRunId: opts.parentRunId,
111
- workflowId: workflow.name,
112
- path,
113
- status: constants_js_1.GraphExecutionStatus.FAILED,
114
- error: errorPayload,
115
- });
116
- return (0, GraphExecutionResult_js_1.buildGraphExecutionResult)(frame, workflow, inputs, constants_js_1.GraphExecutionStatus.FAILED, opts.metadata);
117
- }
118
- }
119
- /**
120
- * Pins a node and its upstream dependencies after a completed run.
121
- *
122
- * Delegates to {@link GraphPinningService}. The plan and result must come
123
- * from a prior successful execution of the same workflow.
124
- */
125
- async pinNode(options) {
126
- const service = this.createPinningService();
127
- await service.pinNode(options);
128
- await this.emitPinningEvent(options.nodeId, constants_js_1.GraphExecutionEventType.NODE_PINNED);
129
- }
130
- /**
131
- * Unpins a node by its fingerprint.
132
- */
133
- async unpinNode(options) {
134
- const service = this.createPinningService();
135
- await service.unpinNode(options);
136
- await this.emitPinningEvent(options.nodeId, constants_js_1.GraphExecutionEventType.NODE_UNPINNED);
137
- }
138
- /**
139
- * Creates a {@link GraphPinningService} backed by this engine's value store
140
- * adapter.
141
- */
142
- createPinningService() {
143
- const store = new GraphValueStore_js_1.GraphValueStore(this.valueStoreAdapter);
144
- return new GraphPinningService_js_1.GraphPinningService(store, new GraphPinningPolicy_js_1.GraphPinningPolicy(), new GraphPinningDependencyResolver_js_1.GraphPinningDependencyResolver());
145
- }
146
- /**
147
- * Emits a pinning-related event to all observers.
148
- */
149
- async emitPinningEvent(nodeId, type) {
150
- const factory = new GraphExecutionEventFactory_js_1.GraphExecutionEventFactory();
151
- const event = factory.create({
152
- id: "",
153
- sequence: 0,
154
- timestamp: new Date(),
155
- runId: "pinning",
156
- workflowId: "",
157
- type,
158
- nodeId,
159
- path: [],
160
- });
161
- await this.emitter.updateObservers(event);
162
- }
163
- /**
164
- * Executes a layer of nodes with the configured concurrency.
165
- */
166
- async executeLayer(frame, plan, nodes, opts, emitFn) {
167
- const concurrency = Math.max(1, opts.concurrency ?? constants_js_1.GRAPH_DEFAULT_CONCURRENCY);
168
- const queue = [...nodes];
169
- while (queue.length > 0) {
170
- const batch = queue.splice(0, concurrency);
171
- await Promise.all(batch.map((node) => this.executeNode(frame, plan, node, opts, emitFn)));
172
- }
173
- }
174
- /**
175
- * Executes a single node.
176
- */
177
- async executeNode(frame, plan, planNode, opts, emitFn) {
178
- const startedAt = new Date();
179
- const nodePath = [...(opts.path ?? []), planNode.id];
180
- await this.emitEvent(frame, {
181
- type: constants_js_1.GraphExecutionEventType.NODE_STARTED,
182
- runId: frame.runId,
183
- workflowId: plan.workflowId,
184
- nodeId: planNode.id,
185
- path: nodePath,
186
- status: constants_js_1.GraphExecutionStatus.RUNNING,
187
- });
188
- const inputs = this.resolveNodeInputs(frame, plan, planNode);
189
- // Cache-hit: check for a pinned value before executing the node
190
- if (opts.usePinnedValues) {
191
- const cached = await this.tryPinnedValue(frame, plan, planNode, inputs);
192
- if (cached) {
193
- frame.valueStore.setNodeOutputs(planNode.id, cached.outputs);
194
- this.routeOutgoingEdges(frame, plan, planNode, cached.outputs);
195
- const finishedAt = new Date();
196
- const result = {
197
- nodeId: planNode.id,
198
- status: constants_js_1.GraphExecutionStatus.CACHED,
199
- inputs,
200
- outputs: cached.outputs,
201
- startedAt,
202
- finishedAt,
203
- fromCache: true,
204
- pinned: true,
205
- events: [],
206
- };
207
- frame.recordNodeResult(result);
208
- await this.emitEvent(frame, {
209
- type: constants_js_1.GraphExecutionEventType.NODE_CACHE_HIT,
210
- runId: frame.runId,
211
- workflowId: plan.workflowId,
212
- nodeId: planNode.id,
213
- path: nodePath,
214
- status: constants_js_1.GraphExecutionStatus.CACHED,
215
- payload: { outputs: cached.outputs },
216
- });
217
- await this.emitEvent(frame, {
218
- type: constants_js_1.GraphExecutionEventType.NODE_COMPLETED,
219
- runId: frame.runId,
220
- workflowId: plan.workflowId,
221
- nodeId: planNode.id,
222
- path: nodePath,
223
- status: constants_js_1.GraphExecutionStatus.SUCCEEDED,
224
- payload: { outputs: cached.outputs, fromCache: true },
225
- });
226
- return;
227
- }
228
- }
229
- try {
230
- const executor = this.config.registry.resolve(planNode.kind);
231
- const context = new GraphExecutionContext_js_1.GraphExecutionContext(frame.runId, opts.parentRunId, plan.workflow, planNode.definition, nodePath, emitFn, opts.metadata);
232
- const outputs = await executor.execute(inputs, context);
233
- const resolvedOutputs = outputs ?? {};
234
- frame.valueStore.setNodeOutputs(planNode.id, resolvedOutputs);
235
- this.routeOutgoingEdges(frame, plan, planNode, resolvedOutputs);
236
- const finishedAt = new Date();
237
- const result = {
238
- nodeId: planNode.id,
239
- status: constants_js_1.GraphExecutionStatus.SUCCEEDED,
240
- inputs,
241
- outputs: resolvedOutputs,
242
- startedAt,
243
- finishedAt,
244
- events: [],
245
- };
246
- frame.recordNodeResult(result);
247
- await this.emitEvent(frame, {
248
- type: constants_js_1.GraphExecutionEventType.NODE_COMPLETED,
249
- runId: frame.runId,
250
- workflowId: plan.workflowId,
251
- nodeId: planNode.id,
252
- path: nodePath,
253
- status: constants_js_1.GraphExecutionStatus.SUCCEEDED,
254
- payload: { outputs: resolvedOutputs },
255
- });
256
- }
257
- catch (error) {
258
- const finishedAt = new Date();
259
- const errorPayload = this.toErrorPayload(error);
260
- const result = {
261
- nodeId: planNode.id,
262
- status: constants_js_1.GraphExecutionStatus.FAILED,
263
- inputs,
264
- error: errorPayload,
265
- startedAt,
266
- finishedAt,
267
- events: [],
268
- };
269
- frame.recordNodeResult(result);
270
- await this.emitEvent(frame, {
271
- type: constants_js_1.GraphExecutionEventType.NODE_FAILED,
272
- runId: frame.runId,
273
- workflowId: plan.workflowId,
274
- nodeId: planNode.id,
275
- path: nodePath,
276
- status: constants_js_1.GraphExecutionStatus.FAILED,
277
- error: errorPayload,
278
- });
279
- if (opts.failFast ?? true)
280
- throw error;
281
- }
282
- }
283
- /**
284
- * Resolves a node's input values from incoming edges.
285
- */
286
- resolveNodeInputs(frame, plan, planNode) {
287
- const inputs = {};
288
- const incoming = plan.incomingByNode.get(planNode.id) ?? [];
289
- for (const edge of incoming) {
290
- inputs[edge.targetPort] = frame.valueStore.getPort(edge.sourceNodeId, edge.sourcePort);
291
- }
292
- return inputs;
293
- }
294
- /**
295
- * Attempts to read a pinned value for the node. Returns the cached outputs
296
- * when a valid pinned value exists, or `undefined` to proceed with normal
297
- * execution.
298
- */
299
- async tryPinnedValue(frame, plan, planNode, inputs) {
300
- const policy = new GraphPinningPolicy_js_1.GraphPinningPolicy();
301
- if (!policy.shouldUsePinnedValue(planNode))
302
- return undefined;
303
- const service = this.createPinningService();
304
- const depFingerprints = this.computeDependencyFingerprints(frame, plan, planNode.id);
305
- return service.readPinnedValue(plan.workflow, planNode, inputs, depFingerprints);
306
- }
307
- /**
308
- * Recursively computes fingerprints for all upstream dependencies of a node
309
- * using the results already accumulated in the frame.
310
- */
311
- computeDependencyFingerprints(frame, plan, nodeId) {
312
- const service = this.createPinningService();
313
- const depResolver = new GraphPinningDependencyResolver_js_1.GraphPinningDependencyResolver();
314
- const deps = depResolver.getDependencies(plan, nodeId);
315
- const fingerprints = {};
316
- for (const dep of deps) {
317
- const node = plan.nodes.find((n) => n.id === dep);
318
- if (node) {
319
- const depResult = frame.nodeResults.get(dep);
320
- const inputs = depResult?.inputs ?? {};
321
- const nestedDeps = this.computeDependencyFingerprints(frame, plan, dep);
322
- fingerprints[dep] = service.computeFingerprint(plan.workflow, node, inputs, nestedDeps);
323
- }
324
- }
325
- return fingerprints;
326
- }
327
- /**
328
- * Routes a node's outputs to downstream inputs and workflow outputs.
329
- */
330
- routeOutgoingEdges(frame, plan, planNode, outputs) {
331
- const outgoing = plan.outgoingByNode.get(planNode.id) ?? [];
332
- for (const edge of outgoing) {
333
- const value = outputs[edge.sourcePort];
334
- if (edge.targetNodeId === constants_js_1.GRAPH_WORKFLOW_BOUNDARY) {
335
- frame.valueStore.setWorkflowOutput(edge.targetPort, value);
336
- }
337
- this.emitEvent(frame, {
338
- type: constants_js_1.GraphExecutionEventType.EDGE_VALUE_ROUTED,
339
- runId: frame.runId,
340
- workflowId: plan.workflowId,
341
- edgeId: edge.id,
342
- nodeId: planNode.id,
343
- path: [],
344
- payload: { edge, value },
345
- }).catch(() => {
346
- // observer failures must not crash
347
- });
348
- }
349
- }
350
- /**
351
- * Emits an event, records it in the frame, and dispatches to observers.
352
- */
353
- async emitEvent(frame, partial) {
354
- const event = frame.eventFactory.create({
355
- id: "",
356
- sequence: 0,
357
- timestamp: new Date(),
358
- ...partial,
359
- });
360
- frame.appendEvent(event);
361
- await this.emitter.updateObservers(event);
362
- }
363
- /**
364
- * Merges default options with the given options.
365
- */
366
- mergeOptions(options) {
367
- return {
368
- concurrency: constants_js_1.GRAPH_DEFAULT_CONCURRENCY,
369
- failFast: true,
370
- validateInputs: true,
371
- validateOutputs: true,
372
- usePinnedValues: true,
373
- writeThroughCache: false,
374
- path: [],
375
- metadata: {},
376
- ...this.defaultOptions,
377
- ...options,
378
- };
379
- }
380
- /**
381
- * Generates a unique run id.
382
- */
383
- generateRunId() {
384
- return (globalThis.crypto?.randomUUID?.() ??
385
- `graph-run-${Date.now()}-${Math.random().toString(36).slice(2)}`);
386
- }
387
- /**
388
- * Converts an error into a serialized payload.
389
- */
390
- toErrorPayload(error) {
391
- if (error instanceof Error) {
392
- return {
393
- name: error.name,
394
- message: error.message,
395
- stack: error.stack,
396
- code: error.graphCode ??
397
- (typeof error.code === "number"
398
- ? String(error.code)
399
- : error.code),
400
- };
401
- }
402
- return { name: "UnknownError", message: String(error) };
403
- }
404
- }
405
- exports.GraphExecutionEngine = GraphExecutionEngine;
406
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JhcGhFeGVjdXRpb25FbmdpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZ3JhcGgvZXhlY3V0aW9uL0dyYXBoRXhlY3V0aW9uRW5naW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVFBLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIsdUJBQXVCLEVBQ3ZCLHVCQUF1QixFQUN2QixvQkFBb0IsR0FDckIsMEJBQXFCO0FBYXRCLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxrREFBNkM7QUFDbEYsT0FBTyxFQUFFLDBCQUEwQixFQUFFLGtEQUE2QztBQUVsRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsK0NBQTBDO0FBSTFFLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxxREFBZ0Q7QUFDekYsT0FBTyxFQUFFLGVBQWUsRUFBRSxzQ0FBaUM7QUFFM0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLDRDQUF1QztBQUNyRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsMkNBQXNDO0FBQ25FLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSx1REFBa0Q7QUFDM0YsT0FBTyxFQUFFLHFCQUFxQixFQUFFLG1DQUFnQztBQUNoRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsaUNBQThCO0FBQzVELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxrQ0FBK0I7QUE0Qm5FOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLE9BQU8sb0JBQW9CO0lBUy9CLFlBQVksTUFBa0M7UUFDNUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsWUFBWSxJQUFJLElBQUksMEJBQTBCLEVBQUUsQ0FBQztRQUN2RSxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLElBQUksSUFBSSxxQkFBcUIsRUFBRSxDQUFDO1FBQzdELElBQUksQ0FBQyxpQkFBaUI7WUFDcEIsTUFBTSxDQUFDLGlCQUFpQixJQUFJLElBQUksOEJBQThCLEVBQUUsQ0FBQztRQUNuRSxJQUFJLENBQUMsY0FB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QUFlLEVBQUUsSUFBSTtZQUNyQixlQUFlLEVBQUUsSUFBSTtZQUNyQixpQkFBaUIsRUFBRSxLQUFLO1lBQ3hCLElBQUksRUFBRSxFQUFFO1lBQ1IsUUFBUSxFQUFFLEVBQUU7WUFDWixHQUFHLElBQUksQ0FBQyxjQUFjO1lBQ3RCLEdBQUcsT0FBTztTQUNYLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSyxhQUFhO1FBQ25CLE9BQU8sQ0FDTCxVQUFVLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxFQUFFO1lBQ2pDLGFBQWEsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQ2pFLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSyxjQUFjLENBQUMsS0FBYztRQUNuQyxJQUFJLEtBQUssWUFBWSxLQUFLLEVBQUUsQ0FBQztZQUMzQixPQUFPO2dCQUNMLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtnQkFDaEIsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO2dCQUN0QixLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUs7Z0JBQ2xCLElBQUksRUFDRCxLQUFhLENBQUMsU0FBUztvQkFDeEIsQ0FBQyxPQUFRLEtBQWEsQ0FBQyxJQUFJLEtBQUssUUFBUTt3QkFDdEMsQ0FBQyxDQUFDLE1BQU0sQ0FBRSxLQUFhLENBQUMsSUFBSSxDQUFDO3dCQUM3QixDQUFDLENBQUUsS0FBYSxDQUFDLElBQUksQ0FBQzthQUMzQixDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztJQUMxRCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBtb2R1bGUgaW50ZWdyYXRpb25zL2dyYXBoL2V4ZWN1dGlvbi9HcmFwaEV4ZWN1dGlvbkVuZ2luZVxuICogQHN1bW1hcnkgUmVmZXJlbmNlIGdyYXBoIGV4ZWN1dGlvbiBlbmdpbmUuXG4gKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgZ3JhcGggd29ya2Zsb3dzIGRlY2xhcmVkIHdpdGggYEBkZWNhZi10cy91aS1kZWNvcmF0b3JzL2dyYXBoYCwgZW1pdHMgZXZlbnRzIHRocm91Z2ggRGVjYWYncyBPYnNlcnZhYmxlIHBpcGVsaW5lLCBzdXBwb3J0cyBwYXJhbGxlbCBub2RlIGV4ZWN1dGlvbiB3aXRoaW4gdG9wb2xvZ2ljYWwgbGF5ZXJzLCBhbmQgcmV0dXJucyBhIGNvbXBsZXRlIGV4ZWN1dGlvbiByZXN1bHQuXG4gKi9cbmltcG9ydCB0eXBlIHsgT2JzZXJ2YWJsZSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBHcmFwaFdvcmtmbG93RGVmaW5pdGlvbiB9IGZyb20gXCJAZGVjYWYtdHMvdWktZGVjb3JhdG9ycy9ncmFwaFwiO1xuXG5pbXBvcnQge1xuICBHUkFQSF9ERUZBVUxUX0NPTkNVUlJFTkNZLFxuICBHUkFQSF9XT1JLRkxPV19CT1VOREFSWSxcbiAgR3JhcGhFeGVjdXRpb25FdmVudFR5cGUsXG4gIEdyYXBoRXhlY3V0aW9uU3RhdHVzLFxufSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEdyYXBoRXhlY3V0aW9uRXJyb3JQYXlsb2FkLFxuICBHcmFwaEV4ZWN1dGlvbkV2ZW50LFxuICBHcmFwaEV4ZWN1dGlvbk9wdGlvbnMsXG4gIEdyYXBoRXhlY3V0aW9uUmVzdWx0LFxuICBHcmFwaEV4ZWN1dGlvblZhbHVlcyxcbiAgR3JhcGhOb2RlRXhlY3V0aW9uUmVzdWx0LFxuICBHcmFwaFBpbk5vZGVPcHRpb25zLFxuICBHcmFwaFVucGluTm9kZU9wdGlvbnMsXG4gIEdyYXBoUnVuSWQsXG59IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBHcmFwaEV4ZWN1dGlvbk9ic2VydmVyIH0gZnJvbSBcIi4uL2V2ZW50cy9HcmFwaEV4ZWN1dGlvbk9ic2VydmVyXCI7XG5pbXBvcnQgeyBHcmFwaEV4ZWN1dGlvbkV2ZW50RW1pdHRlciB9IGZyb20gXCIuLi9ldmVudHMvR3JhcGhFeGVjdXRpb25FdmVudEVtaXR0ZXJcIjtcbmltcG9ydCB7IEdyYXBoRXhlY3V0aW9uRXZlbnRGYWN0b3J5IH0gZnJvbSBcIi4uL2V2ZW50cy9HcmFwaEV4ZWN1dGlvbkV2ZW50RmFjdG9yeVwiO1xuaW1wb3J0IHR5cGUgeyBHcmFwaE5vZGVFeGVjdXRvclJlZ2lzdHJ5IH0gZnJvbSBcIi4uL3JlZ2lzdHJ5L0dyYXBoTm9kZUV4ZWN1dG9yUmVnaXN0cnlcIjtcbmltcG9ydCB7IEdyYXBoRXhlY3V0aW9uUGxhbm5lciB9IGZyb20gXCIuLi9wbGFubmluZy9HcmFwaEV4ZWN1dGlvblBsYW5uZXJcIjtcbmltcG9ydCB0eXBlIHsgR3JhcGhFeGVjdXRpb25QbGFuIH0gZnJvbSBcIi4uL3BsYW5uaW5nL0dyYXBoRXhlY3V0aW9uUGxhblwiO1xuaW1wb3J0IHR5cGUgeyBHcmFwaEV4ZWN1dGlvblBsYW5Ob2RlIH0gZnJvbSBcIi4uL3BsYW5uaW5nL0dyYXBoRXhlY3V0aW9uUGxhbk5vZGVcIjtcbmltcG9ydCB0eXBlIHsgR3JhcGhWYWx1ZVN0b3JlQWRhcHRlciB9IGZyb20gXCIuLi9zdG9yZS9HcmFwaFZhbHVlU3RvcmVBZGFwdGVyXCI7XG5pbXBvcnQgeyBJbk1lbW9yeUdyYXBoVmFsdWVTdG9yZUFkYXB0ZXIgfSBmcm9tIFwiLi4vc3RvcmUvSW5NZW1vcnlHcmFwaFZhbHVlU3RvcmVBZGFwdGVyXCI7XG5pbXBvcnQgeyBHcmFwaFZhbHVlU3RvcmUgfSBmcm9tIFwiLi4vc3RvcmUvR3JhcGhWYWx1ZVN0b3JlXCI7XG5pbXBvcnQgdHlwZSB7IEdyYXBoQ2FjaGVkVmFsdWUgfSBmcm9tIFwiLi4vc3RvcmUvR3JhcGhDYWNoZWRWYWx1ZVwiO1xuaW1wb3J0IHsgR3JhcGhQaW5uaW5nU2VydmljZSB9IGZyb20gXCIuLi9waW5uaW5nL0dyYXBoUGlubmluZ1NlcnZpY2VcIjtcbmltcG9ydCB7IEdyYXBoUGlubmluZ1BvbGljeSB9IGZyb20gXCIuLi9waW5uaW5nL0dyYXBoUGlubmluZ1BvbGljeVwiO1xuaW1wb3J0IHsgR3JhcGhQaW5uaW5nRGVwZW5kZW5jeVJlc29sdmVyIH0gZnJvbSBcIi4uL3Bpbm5pbmcvR3JhcGhQaW5uaW5nRGVwZW5kZW5jeVJlc29sdmVyXCI7XG5pbXBvcnQgeyBHcmFwaEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiLi9HcmFwaEV4ZWN1dGlvbkNvbnRleHRcIjtcbmltcG9ydCB7IEdyYXBoRXhlY3V0aW9uRnJhbWUgfSBmcm9tIFwiLi9HcmFwaEV4ZWN1dGlvbkZyYW1lXCI7XG5pbXBvcnQgeyBidWlsZEdyYXBoRXhlY3V0aW9uUmVzdWx0IH0gZnJvbSBcIi4vR3JhcGhFeGVjdXRpb25SZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgQ29kZVNhbmRib3hFdmFsdWF0b3IgfSBmcm9tIFwiLi9Db2RlU2FuZGJveEV2YWx1YXRvclwiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHRoZSB7QGxpbmsgR3JhcGhFeGVjdXRpb25FbmdpbmV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdyYXBoRXhlY3V0aW9uRW5naW5lQ29uZmlnIHtcbiAgcmVnaXN0cnk6IEdyYXBoTm9kZUV4ZWN1dG9yUmVnaXN0cnk7XG4gIHBsYW5uZXI/OiBHcmFwaEV4ZWN1dGlvblBsYW5uZXI7XG4gIHZhbHVlU3RvcmVBZGFwdGVyPzogR3JhcGhWYWx1ZVN0b3JlQWRhcHRlcjtcbiAgZXZlbnRFbWl0dGVyPzogR3JhcGhFeGVjdXRpb25FdmVudEVtaXR0ZXI7XG4gIGRlZmF1bHRPcHRpb25zPzogUGFydGlhbDxHcmFwaEV4ZWN1dGlvbk9wdGlvbnM+O1xuICAvKipcbiAgICogT3B0aW9uYWwgcGx1Z2dhYmxlIGNvZGUgc2FuZGJveCBldmFsdWF0b3IgZm9yIGNvZGUtYmFzZWQgY29uZGl0aW9uc1xuICAgKiAoREVDQUYtMzIgwqcyMi40KS4gV2hlbiBhYnNlbnQsIGNvZGUgY29uZGl0aW9ucyB0aHJvd1xuICAgKiBgR1JBUEhfQ09ERV9TQU5EQk9YX05PVF9DT05GSUdVUkVEYC4gRG93bnN0cmVhbSBwcm9qZWN0cyAoZS5nLiBBTEZSRUQpXG4gICAqIHN1cHBseSB0aGUgYWN0dWFsIFZNIHNhbmRib3ggaW1wbGVtZW50YXRpb24uXG4gICAqL1xuICBjb2RlU2FuZGJveEV2YWx1YXRvcj86IENvZGVTYW5kYm94RXZhbHVhdG9yO1xuICAvKipcbiAgICogT3B0aW9uYWwgY2FsbGJhY2sgaW52b2tlZCBhdCB0aGUgZW5kIG9mIGVuZ2luZSBjb25zdHJ1Y3Rpb24gd2l0aCB0aGVcbiAgICogZnVsbHktaW5pdGlhbGlzZWQgZW5naW5lIGluc3RhbmNlLiBVc2UgdGhpcyB0byByZWdpc3RlciBleGVjdXRvcnMgdGhhdFxuICAgKiBuZWVkIGEgYmFjay1yZWZlcmVuY2UgdG8gdGhlIGVuZ2luZSAoZS5nLiBsb29wIGV4ZWN1dG9ycyB0aGF0IGV4ZWN1dGVcbiAgICogc3ViLXdvcmtmbG93cyB0aHJvdWdoIHRoZSBzYW1lIGVuZ2luZSkuXG4gICAqL1xuICBvbkVuZ2luZUNyZWF0ZWQ/OiAoZW5naW5lOiBHcmFwaEV4ZWN1dGlvbkVuZ2luZSkgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBSZWZlcmVuY2UgZ3JhcGggZXhlY3V0aW9uIGVuZ2luZS5cbiAqXG4gKiBFeGVjdXRlcyBhIHtAbGluayBHcmFwaFdvcmtmbG93RGVmaW5pdGlvbn0gYnk6XG4gKiAxLiBQbGFubmluZyB0aGUgd29ya2Zsb3cgaW50byB0b3BvbG9naWNhbCBsYXllcnMuXG4gKiAyLiBTZWVkaW5nIHdvcmtmbG93IGlucHV0cyBpbnRvIHRoZSB2YWx1ZSBzdG9yZS5cbiAqIDMuIEV4ZWN1dGluZyBub2RlcyBsYXllci1ieS1sYXllciB3aXRoIGNvbmZpZ3VyYWJsZSBjb25jdXJyZW5jeS5cbiAqIDQuIFJvdXRpbmcgdmFsdWVzIGFsb25nIGVkZ2VzLlxuICogNS4gRW1pdHRpbmcgc3RydWN0dXJlZCBldmVudHMgdGhyb3VnaCBEZWNhZidzIE9ic2VydmFibGUgcGlwZWxpbmUuXG4gKiA2LiBSZXR1cm5pbmcgYSBjb21wbGV0ZSB7QGxpbmsgR3JhcGhFeGVjdXRpb25SZXN1bHR9LlxuICovXG5leHBvcnQgY2xhc3MgR3JhcGhFeGVjdXRpb25FbmdpbmVcbiAgaW1wbGVtZW50cyBPYnNlcnZhYmxlPFtHcmFwaEV4ZWN1dGlvbk9ic2VydmVyXSwgW0dyYXBoRXhlY3V0aW9uRXZlbnRdPiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZW1pdHRlcjogR3JhcGhFeGVjdXRpb25FdmVudEVtaXR0ZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGxhbm5lcjogR3JhcGhFeGVjdXRpb25QbGFubmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHZhbHVlU3RvcmVBZGFwdGVyOiBHcmFwaFZhbHVlU3RvcmVBZGFwdGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRPcHRpb25zOiBQYXJ0aWFsPEdyYXBoRXhlY3V0aW9uT3B0aW9ucz47XG4gIC8qKiBQbHVnZ2FibGUgY29kZSBzYW5kYm94IGV2YWx1YXRvciAowqcyMi40KTsgbWF5IGJlIHVuZGVmaW5lZC4gKi9cbiAgcmVhZG9ubHkgY29kZVNhbmRib3hFdmFsdWF0b3I/OiBDb2RlU2FuZGJveEV2YWx1YXRvcjtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IEdyYXBoRXhlY3V0aW9uRW5naW5lQ29uZmlnKSB7XG4gICAgdGhpcy5lbWl0dGVyID0gY29uZmlnLmV2ZW50RW1pdHRlciA/PyBuZXcgR3JhcGhFeGVjdXRpb25FdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLnBsYW5uZXIgPSBjb25maWcucGxhbm5lciA/PyBuZXcgR3JhcGhFeGVjdXRpb25QbGFubmVyKCk7XG4gICAgdGhpcy52YWx1ZVN0b3JlQWRhcHRlciA9XG4gICAgICBjb25maWcudmFsdWVTdG9yZUFkYXB0ZXIgPz8gbmV3IEluTWVtb3J5R3JhcGhWYWx1ZVN0b3JlQWRhcHRlcigpO1xuICAgIHRoaXMuZGVmYXVsdE9wdGlvbnMgPSBjb25maWcuZGVmYXVsdE9wdGlvbnMgPz8ge307XG4gICAgdGhpcy5jb2RlU2FuZGJveEV2YWx1YXRvciA9IGNvbmZpZy5jb2RlU2FuZGJveEV2YWx1YXRvcjtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICBjb25maWcub25FbmdpbmVDcmVhdGVkPy4odGhpcyk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogR3JhcGhFeGVjdXRpb25FbmdpbmVDb25maWc7XG5cbiAgb2JzZXJ2ZShvYnNlcnZlcjogR3JhcGhFeGVjdXRpb25PYnNlcnZlcik6ICgpID0+IHZvaWQge1xuICAgIHJldHVybiB0aGlzLmVtaXR0ZXIub2JzZXJ2ZShvYnNlcnZlcik7XG4gIH1cblxuICB1bk9ic2VydmUob2JzZXJ2ZXI6IEdyYXBoRXhlY3V0aW9uT2JzZXJ2ZXIpOiB2b2lkIHtcbiAgICB0aGlzLmVtaXR0ZXIudW5PYnNlcnZlKG9ic2VydmVyKTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZU9ic2VydmVycyhldmVudDogR3JhcGhFeGVjdXRpb25FdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZW1pdHRlci51cGRhdGVPYnNlcnZlcnMoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGEgd29ya2Zsb3cgd2l0aCB0aGUgZ2l2ZW4gaW5wdXRzIGFuZCBvcHRpb25zLlxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZShcbiAgICB3b3JrZmxvdzogR3JhcGhXb3JrZmxvd0RlZmluaXRpb24sXG4gICAgaW5wdXRzOiBHcmFwaEV4ZWN1dGlvblZhbHVlcyA9IHt9LFxuICAgIG9wdGlvbnM6IEdyYXBoRXhlY3V0aW9uT3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8R3JhcGhFeGVjdXRpb25SZXN1bHQ+IHtcbiAgICBjb25zdCBvcHRzID0gdGhpcy5tZXJnZU9wdGlvbnMob3B0aW9ucyk7XG4gICAgY29uc3QgcnVuSWQgPSBvcHRzLnJ1bklkID8/IHRoaXMuZ2VuZXJhdGVSdW5JZCgpO1xuICAgIGNvbnN0IHBhdGggPSBvcHRzLnBhdGggPz8gW107XG4gICAgY29uc3QgZXZlbnRGYWN0b3J5ID0gbmV3IEdyYXBoRXhlY3V0aW9uRXZlbnRGYWN0b3J5KCk7XG4gICAgY29uc3QgdmFsdWVTdG9yZSA9IG5ldyBHcmFwaFZhbHVlU3RvcmUodGhpcy52YWx1ZVN0b3JlQWRhcHRlcik7XG4gICAgdmFsdWVTdG9yZS5zZWVkV29ya2Zsb3dJbnB1dHMoaW5wdXRzKTtcblxuICAgIGNvbnN0IHBsYW4gPSB0aGlzLnBsYW5uZXIucGxhbih3b3JrZmxvdyk7XG4gICAgY29uc3QgZnJhbWUgPSBuZXcgR3JhcGhFeGVjdXRpb25GcmFtZShcbiAgICAgIHJ1bklkLFxuICAgICAgcGxhbixcbiAgICAgIHZhbHVlU3RvcmUsXG4gICAgICBldmVudEZhY3RvcnlcbiAgICApO1xuXG4gICAgY29uc3QgZW1pdEZuID0gYXN5bmMgKHBhcnRpYWw6IFBhcnRpYWw8R3JhcGhFeGVjdXRpb25FdmVudD4pID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuZW1pdEV2ZW50KGZyYW1lLCB7XG4gICAgICAgIHR5cGU6IHBhcnRpYWwudHlwZSA/PyBHcmFwaEV4ZWN1dGlvbkV2ZW50VHlwZS5OT0RFX09VVFBVVCxcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIHBhcmVudFJ1bklkOiBvcHRzLnBhcmVudFJ1bklkLFxuICAgICAgICB3b3JrZmxvd0lkOiB3b3JrZmxvdy5uYW1lLFxuICAgICAgICBub2RlSWQ6IHBhcnRpYWwubm9kZUlkLFxuICAgICAgICBwYXRoOiBwYXJ0aWFsLnBhdGggPz8gcGF0aCxcbiAgICAgICAgLi4ucGFydGlhbCxcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBhd2FpdCB0aGlzLmVtaXRFdmVudChmcmFtZSwge1xuICAgICAgdHlwZTogR3JhcGhFeGVjdXRpb25FdmVudFR5cGUuV09SS0ZMT1dfU1RBUlRFRCxcbiAgICAgIHJ1bklkLFxuICAgICAgcGFyZW50UnVuSWQ6IG9wdHMucGFyZW50UnVuSWQsXG4gICAgICB3b3JrZmxvd0lkOiB3b3JrZmxvdy5uYW1lLFxuICAgICAgcGF0aCxcbiAgICAgIHN0YXR1czogR3JhcGhFeGVjdXRpb25TdGF0dXMuUlVOTklORyxcbiAgICAgIHBheWxvYWQ6IHsgaW5wdXRzIH0sXG4gICAgfSk7XG5cbiAgICBhd2FpdCB0aGlzLmVtaXRFdmVudChmcmFtZSwge1xuICAgICAgdHlwZTogR3JhcGhFeGVjdXRpb25FdmVudFR5cGUuV09SS0ZMT1dfUExBTk5FRCxcbiAgICAgIHJ1bklkLFxuICAgICAgcGFyZW50UnVuSWQ6IG9wdHMucGFyZW50UnVuSWQsXG4gICAgICB3b3JrZmxvd0lkOiB3b3JrZmxvdy5uYW1lLFxuICAgICAgcGF0aCxcbiAgICAgIHN0YXR1czogR3JhcGhFeGVjdXRpb25TdGF0dXMuUExBTk5JTkcsXG4gICAgICBwYXlsb2FkOiB7IGxheWVyczogcGxhbi5sYXllcnMubGVuZ3RoLCBub2RlczogcGxhbi5ub2Rlcy5sZW5ndGggfSxcbiAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHBsYW4ubGF5ZXJzKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZUxheWVyKGZyYW1lLCBwbGFuLCBsYXllci5ub2Rlcywgb3B0cywgZW1pdEZuKTtcbiAgICAgIH1cblxuICAgICAgZnJhbWUuZmluaXNoKCk7XG5cbiAgICAgIGF3YWl0IHRoaXMuZW1pdEV2ZW50KGZyYW1lLCB7XG4gICAgICAgIHR5cGU6IEdyYXBoRXhlY3V0aW9uRXZlbnRUeXBlLldPUktGTE9XX0NPTVBMRVRFRCxcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIHBhcmVudFJ1bklkOiBvcHRzLnBhcmVudFJ1bklkLFxuICAgICAgICB3b3JrZmxvd0lkOiB3b3JrZmxvdy5uYW1lLFxuICAgICAgICBwYXRoLFxuICAgICAgICBzdGF0dXM6IEdyYXBoRXhlY3V0aW9uU3RhdHVzLlNVQ0NFRURFRCxcbiAgICAgICAgcGF5bG9hZDogeyBvdXRwdXRzOiB2YWx1ZVN0b3JlLmdldFdvcmtmbG93VmFsdWVzKCkgfSxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYnVpbGRHcmFwaEV4ZWN1dGlvblJlc3VsdChcbiAgICAgICAgZnJhbWUsXG4gICAgICAgIHdvcmtmbG93LFxuICAgICAgICBpbnB1dHMsXG4gICAgICAgIEdyYXBoRXhlY3V0aW9uU3RhdHVzLlNVQ0NFRURFRCxcbiAgICAgICAgb3B0cy5tZXRhZGF0YVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZnJhbWUuZmluaXNoKCk7XG4gICAgICBjb25zdCBlcnJvclBheWxvYWQgPSB0aGlzLnRvRXJyb3JQYXlsb2FkKGVycm9yKTtcblxuICAgICAgYXdhaXQgdGhpcy5lbWl0RXZlbnQoZnJhbWUsIHtcbiAgICAgICAgdHlwZTogR3JhcGhFeGVjdXRpb25FdmVudFR5cGUuV09SS0ZMT1dfRkFJTEVELFxuICAgICAgICBydW5JZCxcbiAgICAgICAgcGFyZW50UnVuSWQ6IG9wdHMucGFyZW50UnVuSWQsXG4gICAgICAgIHdvcmtmbG93SWQ6IHdvcmtmbG93Lm5hbWUsXG4gICAgICAgIHBhdGgsXG4gICAgICAgIHN0YXR1czogR3JhcGhFeGVjdXRpb25TdGF0dXMuRkFJTEVELFxuICAgICAgICBlcnJvcjogZXJyb3JQYXlsb2FkLFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBidWlsZEdyYXBoRXhlY3V0aW9uUmVzdWx0KFxuICAgICAgICBmcmFtZSxcbiAgICAgICAgd29ya2Zsb3csXG4gICAgICAgIGlucHV0cyxcbiAgICAgICAgR3JhcGhFeGVjdXRpb25TdGF0dXMuRkFJTEVELFxuICAgICAgICBvcHRzLm1ldGFkYXRhXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQaW5zIGEgbm9kZSBhbmQgaXRzIHVwc3RyZWFtIGRlcGVuZGVuY2llcyBhZnRlciBhIGNvbXBsZXRlZCBydW4uXG4gICAqXG4gICAqIERlbGVnYXRlcyB0byB7QGxpbmsgR3JhcGhQaW5uaW5nU2VydmljZX0uIFRoZSBwbGFuIGFuZCByZXN1bHQgbXVzdCBjb21lXG4gICAqIGZyb20gYSBwcmlvciBzdWNjZXNzZnVsIGV4ZWN1dGlvbiBvZiB0aGUgc2FtZSB3b3JrZmxvdy5cbiAgICovXG4gIGFzeW5jIHBpbk5vZGUob3B0aW9uczogR3JhcGhQaW5Ob2RlT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLmNyZWF0ZVBpbm5pbmdTZXJ2aWNlKCk7XG4gICAgYXdhaXQgc2VydmljZS5waW5Ob2RlKG9wdGlvbnMpO1xuICAgIGF3YWl0IHRoaXMuZW1pdFBpbm5pbmdFdmVudChvcHRpb25zLm5vZGVJZCwgR3JhcGhFeGVjdXRpb25FdmVudFR5cGUuTk9ERV9QSU5ORUQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucGlucyBhIG5vZGUgYnkgaXRzIGZpbmdlcnByaW50LlxuICAgKi9cbiAgYXN5bmMgdW5waW5Ob2RlKG9wdGlvbnM6IEdyYXBoVW5waW5Ob2RlT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLmNyZWF0ZVBpbm5pbmdTZXJ2aWNlKCk7XG4gICAgYXdhaXQgc2VydmljZS51bnBpbk5vZGUob3B0aW9ucyk7XG4gICAgYXdhaXQgdGhpcy5lbWl0UGlubmluZ0V2ZW50KG9wdGlvbnMubm9kZUlkLCBHcmFwaEV4ZWN1dGlvbkV2ZW50VHlwZS5OT0RFX1VOUElOTkVEKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEge0BsaW5rIEdyYXBoUGlubmluZ1NlcnZpY2V9IGJhY2tlZCBieSB0aGlzIGVuZ2luZSdzIHZhbHVlIHN0b3JlXG4gICAqIGFkYXB0ZXIuXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZVBpbm5pbmdTZXJ2aWNlKCk6IEdyYXBoUGlubmluZ1NlcnZpY2Uge1xuICAgIGNvbnN0IHN0b3JlID0gbmV3IEdyYXBoVmFsdWVTdG9yZSh0aGlzLnZhbHVlU3RvcmVBZGFwdGVyKTtcbiAgICByZXR1cm4gbmV3IEdyYXBoUGlubmluZ1NlcnZpY2UoXG4gICAgICBzdG9yZSxcbiAgICAgIG5ldyBHcmFwaFBpbm5pbmdQb2xpY3koKSxcbiAgICAgIG5ldyBHcmFwaFBpbm5pbmdEZXBlbmRlbmN5UmVzb2x2ZXIoKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgYSBwaW5uaW5nLXJlbGF0ZWQgZXZlbnQgdG8gYWxsIG9ic2VydmVycy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW1pdFBpbm5pbmdFdmVudChcbiAgICBub2RlSWQ6IHN0cmluZyxcbiAgICB0eXBlOiBHcmFwaEV4ZWN1dGlvbkV2ZW50VHlwZVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBmYWN0b3J5ID0gbmV3IEdyYXBoRXhlY3V0aW9uRXZlbnRGYWN0b3J5KCk7XG4gICAgY29uc3QgZXZlbnQgPSBmYWN0b3J5LmNyZWF0ZSh7XG4gICAgICBpZDogXCJcIixcbiAgICAgIHNlcXVlbmNlOiAwLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxuICAgICAgcnVuSWQ6IFwicGlubmluZ1wiLFxuICAgICAgd29ya2Zsb3dJZDogXCJcIixcbiAgICAgIHR5cGUsXG4gICAgICBub2RlSWQsXG4gICAgICBwYXRoOiBbXSxcbiAgICB9IGFzIE9taXQ8R3JhcGhFeGVjdXRpb25FdmVudCwgXCJpZFwiIHwgXCJzZXF1ZW5jZVwiIHwgXCJ0aW1lc3RhbXBcIj4pO1xuICAgIGF3YWl0IHRoaXMuZW1pdHRlci51cGRhdGVPYnNlcnZlcnMoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGEgbGF5ZXIgb2Ygbm9kZXMgd2l0aCB0aGUgY29uZmlndXJlZCBjb25jdXJyZW5jeS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZUxheWVyKFxuICAgIGZyYW1lOiBHcmFwaEV4ZWN1dGlvbkZyYW1lLFxuICAgIHBsYW46IEdyYXBoRXhlY3V0aW9uUGxhbixcbiAgICBub2RlczogR3JhcGhFeGVjdXRpb25QbGFuTm9kZVtdLFxuICAgIG9wdHM6IEdyYXBoRXhlY3V0aW9uT3B0aW9ucyxcbiAgICBlbWl0Rm46IChldmVudDogUGFydGlhbDxHcmFwaEV4ZWN1dGlvbkV2ZW50PikgPT4gUHJvbWlzZTx2b2lkPlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjb25jdXJyZW5jeSA9IE1hdGgubWF4KFxuICAgICAgMSxcbiAgICAgIG9wdHMuY29uY3VycmVuY3kgPz8gR1JBUEhfREVGQVVMVF9DT05DVVJSRU5DWVxuICAgICk7XG4gICAgY29uc3QgcXVldWUgPSBbLi4ubm9kZXNdO1xuXG4gICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGJhdGNoID0gcXVldWUuc3BsaWNlKDAsIGNvbmN1cnJlbmN5KTtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBiYXRjaC5tYXAoKG5vZGUpID0+IHRoaXMuZXhlY3V0ZU5vZGUoZnJhbWUsIHBsYW4sIG5vZGUsIG9wdHMsIGVtaXRGbikpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhIHNpbmdsZSBub2RlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlTm9kZShcbiAgICBmcmFtZTogR3JhcGhFeGVjdXRpb25GcmFtZSxcbiAgICBwbGFuOiBHcmFwaEV4ZWN1dGlvblBsYW4sXG4gICAgcGxhbk5vZGU6IEdyYXBoRXhlY3V0aW9uUGxhbk5vZGUsXG4gICAgb3B0czogR3JhcGhFeGVjdXRpb25PcHRpb25zLFxuICAgIGVtaXRGbjogKGV2ZW50OiBQYXJ0aWFsPEdyYXBoRXhlY3V0aW9uRXZlbnQ+KSA9PiBQcm9taXNlPHZvaWQ+XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3Qgbm9kZVBhdGggPSBbLi4uKG9wdHMucGF0aCA/PyBbXSksIHBsYW5Ob2RlLmlkXTtcblxuICAgIGF3YWl0IHRoaXMuZW1pdEV2ZW50KGZyYW1lLCB7XG4gICAgICB0eXBlOiBHcmFwaEV4ZWN1dGlvbkV2ZW50VHlwZS5OT0RFX1NUQVJURUQsXG4gICAgICBydW5JZDogZnJhbWUucnVuSWQsXG4gICAgICB3b3JrZmxvd0lkOiBwbGFuLndvcmtmbG93SWQsXG4gICAgICBub2RlSWQ6IHBsYW5Ob2RlLmlkLFxuICAgICAgcGF0aDogbm9kZVBhdGgsXG4gICAgICBzdGF0dXM6IEdyYXBoRXhlY3V0aW9uU3RhdHVzLlJVTk5JTkcsXG4gICAgfSk7XG5cbiAgICBjb25zdCBpbnB1dHMgPSB0aGlzLnJlc29sdmVOb2RlSW5wdXRzKGZyYW1lLCBwbGFuLCBwbGFuTm9kZSk7XG5cbiAgICAvLyBDYWNoZS1oaXQ6IGNoZWNrIGZvciBhIHBpbm5lZCB2YWx1ZSBiZWZvcmUgZXhlY3V0aW5nIHRoZSBub2RlXG4gICAgaWYgKG9wdHMudXNlUGlubmVkVmFsdWVzKSB7XG4gICAgICBjb25zdCBjYWNoZWQgPSBhd2FpdCB0aGlzLnRyeVBpbm5lZFZhbHVlKGZyYW1lLCBwbGFuLCBwbGFuTm9kZSwgaW5wdXRzKTtcbiAgICAgIGlmIChjYWNoZWQpIHtcbiAgICAgICAgZnJhbWUudmFsdWVTdG9yZS5zZXROb2RlT3V0cHV0cyhwbGFuTm9kZS5pZCwgY2FjaGVkLm91dHB1dHMpO1xuICAgICAgICB0aGlzLnJvdXRlT3V0Z29pbmdFZGdlcyhmcmFtZSwgcGxhbiwgcGxhbk5vZGUsIGNhY2hlZC5vdXRwdXRzKTtcblxuICAgICAgICBjb25zdCBmaW5pc2hlZEF0ID0gbmV3IERhdGUoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBHcmFwaE5vZGVFeGVjdXRpb25SZXN1bHQgPSB7XG4gICAgICAgICAgbm9kZUlkOiBwbGFuTm9kZS5pZCxcbiAgICAgICAgICBzdGF0dXM6IEdyYXBoRXhlY3V0aW9uU3RhdHVzLkNBQ0hFRCxcbiAgICAgICAgICBpbnB1dHMsXG4gICAgICAgICAgb3V0cHV0czogY2FjaGVkLm91dHB1dHMsXG4gICAgICAgICAgc3RhcnRlZEF0LFxuICAgICAgICAgIGZpbmlzaGVkQXQsXG4gICAgICAgICAgZnJvbUNhY2hlOiB0cnVlLFxuICAgICAgICAgIHBpbm5lZDogdHJ1ZSxcbiAgICAgICAgICBldmVudHM6IFtdLFxuICAgICAgICB9O1xuICAgICAgICBmcmFtZS5yZWNvcmROb2RlUmVzdWx0KHJlc3VsdCk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5lbWl0RXZlbnQoZnJhbWUsIHtcbiAgICAgICAgICB0eXBlOiBHcmFwaEV4ZWN1dGlvbkV2ZW50VHlwZS5OT0RFX0NBQ0hFX0hJVCxcbiAgICAgICAgICBydW5JZDogZnJhbWUucnVuSWQsXG4gICAgICAgICAgd29ya2Zsb3dJZDogcGxhbi53b3JrZmxvd0lkLFxuICAgICAgICAgIG5vZGVJZDogcGxhbk5vZGUuaWQsXG4gICAgICAgICAgcGF0aDogbm9kZVBhdGgsXG4gICAgICAgICAgc3RhdHVzOiBHcmFwaEV4ZWN1dGlvblN0YXR1cy5DQUNIRUQsXG4gICAgICAgICAgcGF5bG9hZDogeyBvdXRwdXRzOiBjYWNoZWQub3V0cHV0cyB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBhd2FpdCB0aGlzLmVtaXRFdmVudChmcmFtZSwge1xuICAgICAgICAgIHR5cGU6IEdyYXBoRXhlY3V0aW9uRXZlbnRUeXBlLk5PREVfQ09NUExFVEVELFxuICAgICAgICAgIHJ1bklkOiBmcmFtZS5ydW5JZCxcbiAgICAgICAgICB3b3JrZmxvd0lkOiBwbGFuLndvcmtmbG93SWQsXG4gICAgICAgICAgbm9kZUlkOiBwbGFuTm9kZS5pZCxcbiAgICAgICAgICBwYXRoOiBub2RlUGF0aCxcbiAgICAgICAgICBzdGF0dXM6IEdyYXBoRXhlY3V0aW9uU3RhdHVzLlNVQ0NFRURFRCxcbiAgICAgICAgICBwYXlsb2FkOiB7IG91dHB1dHM6IGNhY2hlZC5vdXRwdXRzLCBmcm9tQ2FjaGU6IHRydWUgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZXhlY3V0b3IgPSB0aGlzLmNvbmZpZy5yZWdpc3RyeS5yZXNvbHZlKHBsYW5Ob2RlLmtpbmQpO1xuICAgICAgY29uc3QgY29udGV4dCA9IG5ldyBHcmFwaEV4ZWN1dGlvbkNvbnRleHQoXG4gICAgICAgIGZyYW1lLnJ1bklkLFxuICAgICAgICBvcHRzLnBhcmVudFJ1bklkLFxuICAgICAgICBwbGFuLndvcmtmbG93LFxuICAgICAgICBwbGFuTm9kZS5kZWZpbml0aW9uLFxuICAgICAgICBub2RlUGF0aCxcbiAgICAgICAgZW1pdEZuLFxuICAgICAgICBvcHRzLm1ldGFkYXRhXG4gICAgICApO1xuXG4gICAgICBjb25zdCBvdXRwdXRzID0gYXdhaXQgZXhlY3V0b3IuZXhlY3V0ZShpbnB1dHMsIGNvbnRleHQpO1xuICAgICAgY29uc3QgcmVzb2x2ZWRPdXRwdXRzID0gb3V0cHV0cyA/PyB7fTtcblxuICAgICAgZnJhbWUudmFsdWVTdG9yZS5zZXROb2RlT3V0cHV0cyhwbGFuTm9kZS5pZCwgcmVzb2x2ZWRPdXRwdXRzKTtcbiAgICAgIHRoaXMucm91dGVPdXRnb2luZ0VkZ2VzKGZyYW1lLCBwbGFuLCBwbGFuTm9kZSwgcmVzb2x2ZWRPdXRwdXRzKTtcblxuICAgICAgY29uc3QgZmluaXNoZWRBdCA9IG5ldyBEYXRlKCk7XG4gICAgICBjb25zdCByZXN1bHQ6IEdyYXBoTm9kZUV4ZWN1dGlvblJlc3VsdCA9IHtcbiAgICAgICAgbm9kZUlkOiBwbGFuTm9kZS5pZCxcbiAgICAgICAgc3RhdHVzOiBHcmFwaEV4ZWN1dGlvblN0YXR1cy5TVUNDRUVERUQsXG4gICAgICAgIGlucHV0cyxcbiAgICAgICAgb3V0cHV0czogcmVzb2x2ZWRPdXRwdXRzLFxuICAgICAgICBzdGFydGVkQXQsXG4gICAgICAgIGZpbmlzaGVkQXQsXG4gICAgICAgIGV2ZW50czogW10sXG4gICAgICB9O1xuICAgICAgZnJhbWUucmVjb3JkTm9kZVJlc3VsdChyZXN1bHQpO1xuXG4gICAgICBhd2FpdCB0aGlzLmVtaXRFdmVudChmcmFtZSwge1xuICAgICAgICB0eXBlOiBHcmFwaEV4ZWN1dGlvbkV2ZW50VHlwZS5OT0RFX0NPTVBMRVRFRCxcbiAgICAgICAgcnVuSWQ6IGZyYW1lLnJ1bklkLFxuICAgICAgICB3b3JrZmxvd0lkOiBwbGFuLndvcmtmbG93SWQsXG4gICAgICAgIG5vZGVJZDogcGxhbk5vZGUuaWQsXG4gICAgICAgIHBhdGg6IG5vZGVQYXRoLFxuICAgICAgICBzdGF0dXM6IEdyYXBoRXhlY3V0aW9uU3RhdHVzLlNVQ0NFRURFRCxcbiAgICAgICAgcGF5bG9hZDogeyBvdXRwdXRzOiByZXNvbHZlZE91dHB1dHMgfSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBmaW5pc2hlZEF0ID0gbmV3IERhdGUoKTtcbiAgICAgIGNvbnN0IGVycm9yUGF5bG9hZCA9IHRoaXMudG9FcnJvclBheWxvYWQoZXJyb3IpO1xuICAgICAgY29uc3QgcmVzdWx0OiBHcmFwaE5vZGVFeGVjdXRpb25SZXN1bHQgPSB7XG4gICAgICAgIG5vZGVJZDogcGxhbk5vZGUuaWQsXG4gICAgICAgIHN0YXR1czogR3JhcGhFeGVjdXRpb25TdGF0dXMuRkFJTEVELFxuICAgICAgICBpbnB1dHMsXG4gICAgICAgIGVycm9yOiBlcnJvclBheWxvYWQsXG4gICAgICAgIHN0YXJ0ZWRBdCxcbiAgICAgICAgZmluaXNoZWRBdCxcbiAgICAgICAgZXZlbnRzOiBbXSxcbiAgICAgIH07XG4gICAgICBmcmFtZS5yZWNvcmROb2RlUmVzdWx0KHJlc3VsdCk7XG5cbiAgICAgIGF3YWl0IHRoaXMuZW1pdEV2ZW50KGZyYW1lLCB7XG4gICAgICAgIHR5cGU6IEdyYXBoRXhlY3V0aW9uRXZlbnRUeXBlLk5PREVfRkFJTEVELFxuICAgICAgICBydW5JZDogZnJhbWUucnVuSWQsXG4gICAgICAgIHdvcmtmbG93SWQ6IHBsYW4ud29ya2Zsb3dJZCxcbiAgICAgICAgbm9kZUlkOiBwbGFuTm9kZS5pZCxcbiAgICAgICAgcGF0aDogbm9kZVBhdGgsXG4gICAgICAgIHN0YXR1czogR3JhcGhFeGVjdXRpb25TdGF0dXMuRkFJTEVELFxuICAgICAgICBlcnJvcjogZXJyb3JQYXlsb2FkLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChvcHRzLmZhaWxGYXN0ID8/IHRydWUpIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhIG5vZGUncyBpbnB1dCB2YWx1ZXMgZnJvbSBpbmNvbWluZyBlZGdlcy5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZU5vZGVJbnB1dHMoXG4gICAgZnJhbWU6IEdyYXBoRXhlY3V0aW9uRnJhbWUsXG4gICAgcGxhbjogR3JhcGhFeGVjdXRpb25QbGFuLFxuICAgIHBsYW5Ob2RlOiBHcmFwaEV4ZWN1dGlvblBsYW5Ob2RlXG4gICk6IEdyYXBoRXhlY3V0aW9uVmFsdWVzIHtcbiAgICBjb25zdCBpbnB1dHM6IEdyYXBoRXhlY3V0aW9uVmFsdWVzID0ge307XG4gICAgY29uc3QgaW5jb21pbmcgPSBwbGFuLmluY29taW5nQnlOb2RlLmdldChwbGFuTm9kZS5pZCkgPz8gW107XG4gICAgZm9yIChjb25zdCBlZGdlIG9mIGluY29taW5nKSB7XG4gICAgICBpbnB1dHNbZWRnZS50YXJnZXRQb3J0XSA9IGZyYW1lLnZhbHVlU3RvcmUuZ2V0UG9ydChcbiAgICAgICAgZWRnZS5zb3VyY2VOb2RlSWQsXG4gICAgICAgIGVkZ2Uuc291cmNlUG9ydFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGlucHV0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRlbXB0cyB0byByZWFkIGEgcGlubmVkIHZhbHVlIGZvciB0aGUgbm9kZS4gUmV0dXJucyB0aGUgY2FjaGVkIG91dHB1dHNcbiAgICogd2hlbiBhIHZhbGlkIHBpbm5lZCB2YWx1ZSBleGlzdHMsIG9yIGB1bmRlZmluZWRgIHRvIHByb2NlZWQgd2l0aCBub3JtYWxcbiAgICogZXhlY3V0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB0cnlQaW5uZWRWYWx1ZShcbiAgICBmcmFtZTogR3JhcGhFeGVjdXRpb25GcmFtZSxcbiAgICBwbGFuOiBHcmFwaEV4ZWN1dGlvblBsYW4sXG4gICAgcGxhbk5vZGU6IEdyYXBoRXhlY3V0aW9uUGxhbk5vZGUsXG4gICAgaW5wdXRzOiBHcmFwaEV4ZWN1dGlvblZhbHVlc1xuICApOiBQcm9taXNlPEdyYXBoQ2FjaGVkVmFsdWUgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBwb2xpY3kgPSBuZXcgR3JhcGhQaW5uaW5nUG9saWN5KCk7XG4gICAgaWYgKCFwb2xpY3kuc2hvdWxkVXNlUGlubmVkVmFsdWUocGxhbk5vZGUpKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IHRoaXMuY3JlYXRlUGlubmluZ1NlcnZpY2UoKTtcbiAgICBjb25zdCBkZXBGaW5nZXJwcmludHMgPSB0aGlzLmNvbXB1dGVEZXBlbmRlbmN5RmluZ2VycHJpbnRzKGZyYW1lLCBwbGFuLCBwbGFuTm9kZS5pZCk7XG4gICAgcmV0dXJuIHNlcnZpY2UucmVhZFBpbm5lZFZhbHVlKFxuICAgICAgcGxhbi53b3JrZmxvdyxcbiAgICAgIHBsYW5Ob2RlLFxuICAgICAgaW5wdXRzLFxuICAgICAgZGVwRmluZ2VycHJpbnRzXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWN1cnNpdmVseSBjb21wdXRlcyBmaW5nZXJwcmludHMgZm9yIGFsbCB1cHN0cmVhbSBkZXBlbmRlbmNpZXMgb2YgYSBub2RlXG4gICAqIHVzaW5nIHRoZSByZXN1bHRzIGFscmVhZHkgYWNjdW11bGF0ZWQgaW4gdGhlIGZyYW1lLlxuICAgKi9cbiAgcHJpdmF0ZSBjb21wdXRlRGVwZW5kZW5jeUZpbmdlcnByaW50cyhcbiAgICBmcmFtZTogR3JhcGhFeGVjdXRpb25GcmFtZSxcbiAgICBwbGFuOiBHcmFwaEV4ZWN1dGlvblBsYW4sXG4gICAgbm9kZUlkOiBzdHJpbmdcbiAgKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgY29uc3Qgc2VydmljZSA9IHRoaXMuY3JlYXRlUGlubmluZ1NlcnZpY2UoKTtcbiAgICBjb25zdCBkZXBSZXNvbHZlciA9IG5ldyBHcmFwaFBpbm5pbmdEZXBlbmRlbmN5UmVzb2x2ZXIoKTtcbiAgICBjb25zdCBkZXBzID0gZGVwUmVzb2x2ZXIuZ2V0RGVwZW5kZW5jaWVzKHBsYW4sIG5vZGVJZCk7XG4gICAgY29uc3QgZmluZ2VycHJpbnRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgZm9yIChjb25zdCBkZXAgb2YgZGVwcykge1xuICAgICAgY29uc3Qgbm9kZSA9IHBsYW4ubm9kZXMuZmluZCgobikgPT4gbi5pZCA9PT0gZGVwKTtcbiAgICAgIGlmIChub2RlKSB7XG4gICAgICAgIGNvbnN0IGRlcFJlc3VsdCA9IGZyYW1lLm5vZGVSZXN1bHRzLmdldChkZXApO1xuICAgICAgICBjb25zdCBpbnB1dHMgPSBkZXBSZXN1bHQ/LmlucHV0cyA/PyB7fTtcbiAgICAgICAgY29uc3QgbmVzdGVkRGVwcyA9IHRoaXMuY29tcHV0ZURlcGVuZGVuY3lGaW5nZXJwcmludHMoZnJhbWUsIHBsYW4sIGRlcCk7XG4gICAgICAgIGZpbmdlcnByaW50c1tkZXBdID0gc2VydmljZS5jb21wdXRlRmluZ2VycHJpbnQoXG4gICAgICAgICAgcGxhbi53b3JrZmxvdyxcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIGlucHV0cyxcbiAgICAgICAgICBuZXN0ZWREZXBzXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmaW5nZXJwcmludHM7XG4gIH1cblxuICAvKipcbiAgICogUm91dGVzIGEgbm9kZSdzIG91dHB1dHMgdG8gZG93bnN0cmVhbSBpbnB1dHMgYW5kIHdvcmtmbG93IG91dHB1dHMuXG4gICAqL1xuICBwcml2YXRlIHJvdXRlT3V0Z29pbmdFZGdlcyhcbiAgICBmcmFtZTogR3JhcGhFeGVjdXRpb25GcmFtZSxcbiAgICBwbGFuOiBHcmFwaEV4ZWN1dGlvblBsYW4sXG4gICAgcGxhbk5vZGU6IEdyYXBoRXhlY3V0aW9uUGxhbk5vZGUsXG4gICAgb3V0cHV0czogR3JhcGhFeGVjdXRpb25WYWx1ZXNcbiAgKTogdm9pZCB7XG4gICAgY29uc3Qgb3V0Z29pbmcgPSBwbGFuLm91dGdvaW5nQnlOb2RlLmdldChwbGFuTm9kZS5pZCkgPz8gW107XG4gICAgZm9yIChjb25zdCBlZGdlIG9mIG91dGdvaW5nKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IG91dHB1dHNbZWRnZS5zb3VyY2VQb3J0XTtcbiAgICAgIGlmIChlZGdlLnRhcmdldE5vZGVJZCA9PT0gR1JBUEhfV09SS0ZMT1dfQk9VTkRBUlkpIHtcbiAgICAgICAgZnJhbWUudmFsdWVTdG9yZS5zZXRXb3JrZmxvd091dHB1dChlZGdlLnRhcmdldFBvcnQsIHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZW1pdEV2ZW50KGZyYW1lLCB7XG4gICAgICAgIHR5cGU6IEdyYXBoRXhlY3V0aW9uRXZlbnRUeXBlLkVER0VfVkFMVUVfUk9VVEVELFxuICAgICAgICBydW5JZDogZnJhbWUucnVuSWQsXG4gICAgICAgIHdvcmtmbG93SWQ6IHBsYW4ud29ya2Zsb3dJZCxcbiAgICAgICAgZWRnZUlkOiBlZGdlLmlkLFxuICAgICAgICBub2RlSWQ6IHBsYW5Ob2RlLmlkLFxuICAgICAgICBwYXRoOiBbXSxcbiAgICAgICAgcGF5bG9hZDogeyBlZGdlLCB2YWx1ZSB9LFxuICAgICAgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAvLyBvYnNlcnZlciBmYWlsdXJlcyBtdXN0IG5vdCBjcmFzaFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGFuIGV2ZW50LCByZWNvcmRzIGl0IGluIHRoZSBmcmFtZSwgYW5kIGRpc3BhdGNoZXMgdG8gb2JzZXJ2ZXJzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbWl0RXZlbnQoXG4gICAgZnJhbWU6IEdyYXBoRXhlY3V0aW9uRnJhbWUsXG4gICAgcGFydGlhbDogUGFydGlhbDxHcmFwaEV4ZWN1dGlvbkV2ZW50PiAmIHtcbiAgICAgIHR5cGU6IEdyYXBoRXhlY3V0aW9uRXZlbnRUeXBlO1xuICAgICAgcnVuSWQ6IEdyYXBoUnVuSWQ7XG4gICAgICB3b3JrZmxvd0lkOiBzdHJpbmc7XG4gICAgICBwYXRoOiBzdHJpbmdbXTtcbiAgICB9XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGV2ZW50ID0gZnJhbWUuZXZlbnRGYWN0b3J5LmNyZWF0ZSh7XG4gICAgICBpZDogXCJcIixcbiAgICAgIHNlcXVlbmNlOiAwLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxuICAgICAgLi4ucGFydGlhbCxcbiAgICB9IGFzIE9taXQ8R3JhcGhFeGVjdXRpb25FdmVudCwgXCJpZFwiIHwgXCJzZXF1ZW5jZVwiIHwgXCJ0aW1lc3RhbXBcIj4pO1xuICAgIGZyYW1lLmFwcGVuZEV2ZW50KGV2ZW50KTtcbiAgICBhd2FpdCB0aGlzLmVtaXR0ZXIudXBkYXRlT2JzZXJ2ZXJzKGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXJnZXMgZGVmYXVsdCBvcHRpb25zIHdpdGggdGhlIGdpdmVuIG9wdGlvbnMuXG4gICAqL1xuICBwcml2YXRlIG1lcmdlT3B0aW9ucyhcbiAgICBvcHRpb25zOiBHcmFwaEV4ZWN1dGlvbk9wdGlvbnNcbiAgKTogR3JhcGhFeGVjdXRpb25PcHRpb25zIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29uY3VycmVuY3k6IEdSQVBIX0RFRkFVTFRfQ09OQ1VSUkVOQ1ksXG4gICAgICBmYWlsRmFzdDogdHJ1ZSxcbiAgICAgIHZhbGlkYXRlSW5wdXRzOiB0cnVlLFxuICAgICAgdmFsaWRhdGVPdXRwdXRzOiB0cnVlLFxuICAgICAgdXNlUGlubmVkVmFsdWVzOiB0cnVlLFxuICAgICAgd3JpdGVUaHJvdWdoQ2FjaGU6IGZhbHNlLFxuICAgICAgcGF0aDogW10sXG4gICAgICBtZXRhZGF0YToge30sXG4gICAgICAuLi50aGlzLmRlZmF1bHRPcHRpb25zLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIHVuaXF1ZSBydW4gaWQuXG4gICAqL1xuICBwcml2YXRlIGdlbmVyYXRlUnVuSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKFxuICAgICAgZ2xvYmFsVGhpcy5jcnlwdG8/LnJhbmRvbVVVSUQ/LigpID8/XG4gICAgICBgZ3JhcGgtcnVuLSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKX1gXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhbiBlcnJvciBpbnRvIGEgc2VyaWFsaXplZCBwYXlsb2FkLlxuICAgKi9cbiAgcHJpdmF0ZSB0b0Vycm9yUGF5bG9hZChlcnJvcjogdW5rbm93bik6IEdyYXBoRXhlY3V0aW9uRXJyb3JQYXlsb2FkIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogZXJyb3IubmFtZSxcbiAgICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSxcbiAgICAgICAgc3RhY2s6IGVycm9yLnN0YWNrLFxuICAgICAgICBjb2RlOlxuICAgICAgICAgIChlcnJvciBhcyBhbnkpLmdyYXBoQ29kZSA/P1xuICAgICAgICAgICh0eXBlb2YgKGVycm9yIGFzIGFueSkuY29kZSA9PT0gXCJudW1iZXJcIlxuICAgICAgICAgICAgPyBTdHJpbmcoKGVycm9yIGFzIGFueSkuY29kZSlcbiAgICAgICAgICAgIDogKGVycm9yIGFzIGFueSkuY29kZSksXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4geyBuYW1lOiBcIlVua25vd25FcnJvclwiLCBtZXNzYWdlOiBTdHJpbmcoZXJyb3IpIH07XG4gIH1cbn1cbiJdfQ==
407
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JhcGhFeGVjdXRpb25FbmdpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJHcmFwaEV4ZWN1dGlvbkVuZ2luZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxvREFBdUk7QUFDdkksNkZBQXVGO0FBQ3ZGLDZGQUF1RjtBQUN2RixxRkFBK0U7QUFDL0Usb0dBQThGO0FBQzlGLHNFQUFnRTtBQUNoRSxnRkFBMEU7QUFDMUUsOEVBQXdFO0FBQ3hFLHNHQUFnRztBQUNoRyx5RUFBbUU7QUFDbkUscUVBQStEO0FBQy9ELHVFQUFzRTtBQUN0RTs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBYSxvQkFBb0I7SUFDN0IsWUFBWSxNQUFNO1FBQ2QsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsWUFBWSxJQUFJLElBQUksMERBQTBCLEVBQUUsQ0FBQztRQUN2RSxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLElBQUksSUFBSSxnREFBcUIsRUFBRSxDQUFDO1FBQzdELElBQUksQ0FBQyxpQkFBaUI7WUFDbEIsTUFBTSxDQUFDLGlCQUFpQixJQUFJLElBQUksa0VBQThCLEVBQUUsQ0FBQztRQUNyRSxJQUFJLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxjQUFjLElBQUksRUFBRSxDQUFDO1FBQ2xELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUM7UUFDeEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsTUFBTSxDQUFDLGVBQWUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFDRCxPQUFPLENBQUMsUUFBUTtRQUNaLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUNELFNBQVMsQ0FBQyxRQUFRO1FBQ2QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7SUFD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QUksS0FBSyxZQUFZLEtBQUssRUFBRSxDQUFDO1lBQ3pCLE9BQU87Z0JBQ0gsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO2dCQUNoQixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87Z0JBQ3RCLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSztnQkFDbEIsSUFBSSxFQUFFLEtBQUssQ0FBQyxTQUFTO29CQUNqQixDQUFDLE9BQU8sS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRO3dCQUMzQixDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7d0JBQ3BCLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO2FBQ3hCLENBQUM7UUFDTixDQUFDO1FBQ0QsT0FBTyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO0lBQzVELENBQUM7Q0FDSjtBQXpYRCxvREF5WEM7QUFDRCxrcjBDQUFrcjBDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgR1JBUEhfREVGQVVMVF9DT05DVVJSRU5DWSwgR1JBUEhfV09SS0ZMT1dfQk9VTkRBUlksIEdyYXBoRXhlY3V0aW9uRXZlbnRUeXBlLCBHcmFwaEV4ZWN1dGlvblN0YXR1cywgfSBmcm9tIFwiLi8uLi9jb25zdGFudHMuanNcIjtcbmltcG9ydCB7IEdyYXBoRXhlY3V0aW9uRXZlbnRFbWl0dGVyIH0gZnJvbSBcIi4vLi4vZXZlbnRzL0dyYXBoRXhlY3V0aW9uRXZlbnRFbWl0dGVyLmpzXCI7XG5pbXBvcnQgeyBHcmFwaEV4ZWN1dGlvbkV2ZW50RmFjdG9yeSB9IGZyb20gXCIuLy4uL2V2ZW50cy9HcmFwaEV4ZWN1dGlvbkV2ZW50RmFjdG9yeS5qc1wiO1xuaW1wb3J0IHsgR3JhcGhFeGVjdXRpb25QbGFubmVyIH0gZnJvbSBcIi4vLi4vcGxhbm5pbmcvR3JhcGhFeGVjdXRpb25QbGFubmVyLmpzXCI7XG5pbXBvcnQgeyBJbk1lbW9yeUdyYXBoVmFsdWVTdG9yZUFkYXB0ZXIgfSBmcm9tIFwiLi8uLi9zdG9yZS9Jbk1lbW9yeUdyYXBoVmFsdWVTdG9yZUFkYXB0ZXIuanNcIjtcbmltcG9ydCB7IEdyYXBoVmFsdWVTdG9yZSB9IGZyb20gXCIuLy4uL3N0b3JlL0dyYXBoVmFsdWVTdG9yZS5qc1wiO1xuaW1wb3J0IHsgR3JhcGhQaW5uaW5nU2VydmljZSB9IGZyb20gXCIuLy4uL3Bpbm5pbmcvR3JhcGhQaW5uaW5nU2VydmljZS5qc1wiO1xuaW1wb3J0IHsgR3JhcGhQaW5uaW5nUG9saWN5IH0gZnJvbSBcIi4vLi4vcGlubmluZy9HcmFwaFBpbm5pbmdQb2xpY3kuanNcIjtcbmltcG9ydCB7IEdyYXBoUGlubmluZ0RlcGVuZGVuY3lSZXNvbHZlciB9IGZyb20gXCIuLy4uL3Bpbm5pbmcvR3JhcGhQaW5uaW5nRGVwZW5kZW5jeVJlc29sdmVyLmpzXCI7XG5pbXBvcnQgeyBHcmFwaEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiLi9HcmFwaEV4ZWN1dGlvbkNvbnRleHQuanNcIjtcbmltcG9ydCB7IEdyYXBoRXhlY3V0aW9uRnJhbWUgfSBmcm9tIFwiLi9HcmFwaEV4ZWN1dGlvbkZyYW1lLmpzXCI7XG5pbXBvcnQgeyBidWlsZEdyYXBoRXhlY3V0aW9uUmVzdWx0IH0gZnJvbSBcIi4vR3JhcGhFeGVjdXRpb25SZXN1bHQuanNcIjtcbi8qKlxuICogUmVmZXJlbmNlIGdyYXBoIGV4ZWN1dGlvbiBlbmdpbmUuXG4gKlxuICogRXhlY3V0ZXMgYSB7QGxpbmsgR3JhcGhXb3JrZmxvd0RlZmluaXRpb259IGJ5OlxuICogMS4gUGxhbm5pbmcgdGhlIHdvcmtmbG93IGludG8gdG9wb2xvZ2ljYWwgbGF5ZXJzLlxuICogMi4gU2VlZGluZyB3b3JrZmxvdyBpbnB1dHMgaW50byB0aGUgdmFsdWUgc3RvcmUuXG4gKiAzLiBFeGVjdXRpbmcgbm9kZXMgbGF5ZXItYnktbGF5ZXIgd2l0aCBjb25maWd1cmFibGUgY29uY3VycmVuY3kuXG4gKiA0LiBSb3V0aW5nIHZhbHVlcyBhbG9uZyBlZGdlcy5cbiAqIDUuIEVtaXR0aW5nIHN0cnVjdHVyZWQgZXZlbnRzIHRocm91Z2ggRGVjYWYncyBPYnNlcnZhYmxlIHBpcGVsaW5lLlxuICogNi4gUmV0dXJuaW5nIGEgY29tcGxldGUge0BsaW5rIEdyYXBoRXhlY3V0aW9uUmVzdWx0fS5cbiAqL1xuZXhwb3J0IGNsYXNzIEdyYXBoRXhlY3V0aW9uRW5naW5lIHtcbiAgICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICAgICAgdGhpcy5lbWl0dGVyID0gY29uZmlnLmV2ZW50RW1pdHRlciA/PyBuZXcgR3JhcGhFeGVjdXRpb25FdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5wbGFubmVyID0gY29uZmlnLnBsYW5uZXIgPz8gbmV3IEdyYXBoRXhlY3V0aW9uUGxhbm5lcigpO1xuICAgICAgICB0aGlzLnZhbHVlU3RvcmVBZGFwdGVyID1cbiAgICAgICAgICAgIGNvbmZpZy52YWx1ZVN0b3JlQWRhcHRlciA/PyBuZXcgSW5NZW1vcnlHcmFwaFZhbHVlU3RvcmVBZGFwdGVyKCk7XG4gICAgICAgIHRoaXMuZGVmYXVsdE9wdGlvbnMgPSBjb25maWcuZGVmYXVsdE9wdGlvbnMgPz8ge307XG4gICAgICAgIHRoaXMuY29kZVNhbmRib3hFdmFsdWF0b3IgPSBjb25maWcuY29kZVNhbmRib3hFdmFsdWF0b3I7XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgICAgICBjb25maWcub25FbmdpbmVDcmVhdGVkPy4odGhpcyk7XG4gICAgfVxuICAgIG9ic2VydmUob2JzZXJ2ZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1pdHRlci5vYnNlcnZlKG9ic2VydmVyKTtcbiAgICB9XG4gICAgdW5PYnNlcnZlKG9ic2VydmVyKSB7XG4gICAgICAgIHRoaXMuZW1pdHRlci51bk9ic2VydmUob2JzZXJ2ZXIpO1xuICAgIH1cbiAgICBhc3luYyB1cGRhdGVPYnNlcnZlcnMoZXZlbnQpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbWl0dGVyLnVwZGF0ZU9ic2VydmVycyhldmVudCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIGEgd29ya2Zsb3cgd2l0aCB0aGUgZ2l2ZW4gaW5wdXRzIGFuZCBvcHRpb25zLlxuICAgICAqL1xuICAgIGFzeW5jIGV4ZWN1dGUod29ya2Zsb3csIGlucHV0cyA9IHt9LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMubWVyZ2VPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBydW5JZCA9IG9wdHMucnVuSWQgPz8gdGhpcy5nZW5lcmF0ZVJ1bklkKCk7XG4gICAgICAgIGNvbnN0IHBhdGggPSBvcHRzLnBhdGggPz8gW107XG4gICAgICAgIGNvbnN0IGV2ZW50RmFjdG9yeSA9IG5ldyBHcmFwaEV4ZWN1dGlvbkV2ZW50RmFjdG9yeSgpO1xuICAgICAgICBjb25zdCB2YWx1ZVN0b3JlID0gbmV3IEdyYXBoVmFsdWVTdG9yZSh0aGlzLnZhbHVlU3RvcmVBZGFwdGVyKTtcbiAgICAgICAgdmFsdWVTdG9yZS5zZWVkV29ya2Zsb3dJbnB1dHMoaW5wdXRzKTtcbiAgICAgICAgY29uc3QgcGxhbiA9IHRoaXMucGxhbm5lci5wbGFuKHdvcmtmbG93KTtcbiAgICAgICAgY29uc3QgZnJhbWUgPSBuZXcgR3JhcGhFeGVjdXRpb25GcmFtZShydW5JZCwgcGxhbiwgdmFsdWVTdG9yZSwgZXZlbnRGYWN0b3J5KTtcbiAgICAgICAgY29uc3QgZW1pdEZuID0gYXN5bmMgKHBhcnRpYWwpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZW1pdEV2ZW50KGZyYW1lLCB7XG4gICAgICAgICAgICAgICAgdHlwZTogcGFydGlhbC50eXBlID8/IEdyYXBoRXhlY3V0aW9uRXZlbnRUeXBlLk5PREVfT1VUUFVULFxuICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgIHBhcmVudFJ1bklkOiBvcHRzLnBhcmVudFJ1bklkLFxuICAgICAgICAgICAgICAgIHdvcmtmbG93SWQ6IHdvcmtmbG93Lm5hbWUsXG4gICAgICAgICAgICAgICAgbm9kZUlkOiBwYXJ0aWFsLm5vZGVJZCxcbiAgICAgICAgICAgICAgICBwYXRoOiBwYXJ0aWFsLnBhdGggPz8gcGF0aCxcbiAgICAgICAgICAgICAgICAuLi5wYXJ0aWFsLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdEV2ZW50KGZyYW1lLCB7XG4gICAgICAgICAgICB0eXBlOiBHcmFwaEV4ZWN1dGlvbkV2ZW50VHlwZS5XT1JLRkxPV19TVEFSVEVELFxuICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICBwYXJlbnRSdW5JZDogb3B0cy5wYXJlbnRSdW5JZCxcbiAgICAgICAgICAgIHdvcmtmbG93SWQ6IHdvcmtmbG93Lm5hbWUsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgc3RhdHVzOiBHcmFwaEV4ZWN1dGlvblN0YXR1cy5SVU5OSU5HLFxuICAgICAgICAgICAgcGF5bG9hZDogeyBpbnB1dHMgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdEV2ZW50KGZyYW1lLCB7XG4gICAgICAgICAgICB0eXBlOiBHcmFwaEV4ZWN1dGlvbkV2ZW50VHlwZS5XT1JLRkxPV19QTEFOTkVELFxuICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICBwYXJlbnRSdW5JZDogb3B0cy5wYXJlbnRSdW5JZCxcbiAgICAgICAgICAgIHdvcmtmbG93SWQ6IHdvcmtmbG93Lm5hbWUsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgc3RhdHVzOiBHcmFwaEV4ZWN1dGlvblN0YXR1cy5QTEFOTklORyxcbiAgICAgICAgICAgIHBheWxvYWQ6IHsgbGF5ZXJzOiBwbGFuLmxheWVycy5sZW5ndGgsIG5vZGVzOiBwbGFuLm5vZGVzLmxlbmd0aCB9LFxuICAgICAgICB9KTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgcGxhbi5sYXllcnMpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmV4ZWN1dGVMYXllcihmcmFtZSwgcGxhbiwgbGF5ZXIubm9kZXMsIG9wdHMsIGVtaXRGbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmcmFtZS5maW5pc2goKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZW1pdEV2ZW50KGZyYW1lLCB7XG4gICAgICAgICAgICAgICAgdHlwZTogR3JhcGhFeGVjdXRpb25FdmVudFR5cGUuV09SS0ZMT1dfQ09NUExFVEVELFxuICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgIHBhcmVudFJ1bklkOiBvcHRzLnBhcmVudFJ1bklkLFxuICAgICAgICAgICAgICAgIHdvcmtmbG93SWQ6IHdvcmtmbG93Lm5hbWUsXG4gICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgICBzdGF0dXM6IEdyYXBoRXhlY3V0aW9uU3RhdHVzLlNVQ0NFRURFRCxcbiAgICAgICAgICAgICAgICBwYXlsb2FkOiB7IG91dHB1dHM6IHZhbHVlU3RvcmUuZ2V0V29ya2Zsb3dWYWx1ZXMoKSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gYnVpbGRHcmFwaEV4ZWN1dGlvblJlc3VsdChmcmFtZSwgd29ya2Zsb3csIGlucHV0cywgR3JhcGhFeGVjdXRpb25TdGF0dXMuU1VDQ0VFREVELCBvcHRzLm1ldGFkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGZyYW1lLmZpbmlzaCgpO1xuICAgICAgICAgICAgY29uc3QgZXJyb3JQYXlsb2FkID0gdGhpcy50b0Vycm9yUGF5bG9hZChlcnJvcik7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmVtaXRFdmVudChmcmFtZSwge1xuICAgICAgICAgICAgICAgIHR5cGU6IEdyYXBoRXhlY3V0aW9uRXZlbnRUeXBlLldPUktGTE9XX0ZBSUxFRCxcbiAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICBwYXJlbnRSdW5JZDogb3B0cy5wYXJlbnRSdW5JZCxcbiAgICAgICAgICAgICAgICB3b3JrZmxvd0lkOiB3b3JrZmxvdy5uYW1lLFxuICAgICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBHcmFwaEV4ZWN1dGlvblN0YXR1cy5GQUlMRUQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yUGF5bG9hZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGJ1aWxkR3JhcGhFeGVjdXRpb25SZXN1bHQoZnJhbWUsIHdvcmtmbG93LCBpbnB1dHMsIEdyYXBoRXhlY3V0aW9uU3RhdHVzLkZBSUxFRCwgb3B0cy5tZXRhZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUGlucyBhIG5vZGUgYW5kIGl0cyB1cHN0cmVhbSBkZXBlbmRlbmNpZXMgYWZ0ZXIgYSBjb21wbGV0ZWQgcnVuLlxuICAgICAqXG4gICAgICogRGVsZWdhdGVzIHRvIHtAbGluayBHcmFwaFBpbm5pbmdTZXJ2aWNlfS4gVGhlIHBsYW4gYW5kIHJlc3VsdCBtdXN0IGNvbWVcbiAgICAgKiBmcm9tIGEgcHJpb3Igc3VjY2Vzc2Z1bCBleGVjdXRpb24gb2YgdGhlIHNhbWUgd29ya2Zsb3cuXG4gICAgICovXG4gICAgYXN5bmMgcGluTm9kZShvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLmNyZWF0ZVBpbm5pbmdTZXJ2aWNlKCk7XG4gICAgICAgIGF3YWl0IHNlcnZpY2UucGluTm9kZShvcHRpb25zKTtcbiAgICAgICAgYXdhaXQgdGhpcy5lbWl0UGlubmluZ0V2ZW50KG9wdGlvbnMubm9kZUlkLCBHcmFwaEV4ZWN1dGlvbkV2ZW50VHlwZS5OT0RFX1BJTk5FRCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVucGlucyBhIG5vZGUgYnkgaXRzIGZpbmdlcnByaW50LlxuICAgICAqL1xuICAgIGFzeW5jIHVucGluTm9kZShvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLmNyZWF0ZVBpbm5pbmdTZXJ2aWNlKCk7XG4gICAgICAgIGF3YWl0IHNlcnZpY2UudW5waW5Ob2RlKG9wdGlvbnMpO1xuICAgICAgICBhd2FpdCB0aGlzLmVtaXRQaW5uaW5nRXZlbnQob3B0aW9ucy5ub2RlSWQsIEdyYXBoRXhlY3V0aW9uRXZlbnRUeXBlLk5PREVfVU5QSU5ORUQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEge0BsaW5rIEdyYXBoUGlubmluZ1NlcnZpY2V9IGJhY2tlZCBieSB0aGlzIGVuZ2luZSdzIHZhbHVlIHN0b3JlXG4gICAgICogYWRhcHRlci5cbiAgICAgKi9cbiAgICBjcmVhdGVQaW5uaW5nU2VydmljZSgpIHtcbiAgICAgICAgY29uc3Qgc3RvcmUgPSBuZXcgR3JhcGhWYWx1ZVN0b3JlKHRoaXMudmFsdWVTdG9yZUFkYXB0ZXIpO1xuICAgICAgICByZXR1cm4gbmV3IEdyYXBoUGlubmluZ1NlcnZpY2Uoc3RvcmUsIG5ldyBHcmFwaFBpbm5pbmdQb2xpY3koKSwgbmV3IEdyYXBoUGlubmluZ0RlcGVuZGVuY3lSZXNvbHZlcigpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW1pdHMgYSBwaW5uaW5nLXJlbGF0ZWQgZXZlbnQgdG8gYWxsIG9ic2VydmVycy5cbiAgICAgKi9cbiAgICBhc3luYyBlbWl0UGlubmluZ0V2ZW50KG5vZGVJZCwgdHlwZSkge1xuICAgICAgICBjb25zdCBmYWN0b3J5ID0gbmV3IEdyYXBoRXhlY3V0aW9uRXZlbnRGYWN0b3J5KCk7XG4gICAgICAgIGNvbnN0IGV2ZW50ID0gZmFjdG9yeS5jcmVhdGUoe1xuICAgICAgICAgICAgaWQ6IFwiXCIsXG4gICAgICAgICAgICBzZXF1ZW5jZTogMCxcbiAgICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgIHJ1bklkOiBcInBpbm5pbmdcIixcbiAgICAgICAgICAgIHdvcmtmbG93SWQ6IFwiXCIsXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgbm9kZUlkLFxuICAgICAgICAgICAgcGF0aDogW10sXG4gICAgICAgIH0pO1xuICAgICAgICBhd2FpdCB0aGlzLmVtaXR0ZXIudXBkYXRlT2JzZXJ2ZXJzKGV2ZW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgYSBsYXllciBvZiBub2RlcyB3aXRoIHRoZSBjb25maWd1cmVkIGNvbmN1cnJlbmN5LlxuICAgICAqL1xuICAgIGFzeW5jIGV4ZWN1dGVMYXllcihmcmFtZSwgcGxhbiwgbm9kZXMsIG9wdHMsIGVtaXRGbikge1xuICAgICAgICBjb25zdCBjb25jdXJyZW5jeSA9IE1hdGgubWF4KDEsIG9wdHMuY29uY3VycmVuY3kgPz8gR1JBUEhfREVGQVVMVF9DT05DVVJSRU5DWSk7XG4gICAgICAgIGNvbnN0IHF1ZXVlID0gWy4uLm5vZGVzXTtcbiAgICAgICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGJhdGNoID0gcXVldWUuc3BsaWNlKDAsIGNvbmN1cnJlbmN5KTtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKGJhdGNoLm1hcCgobm9kZSkgPT4gdGhpcy5leGVjdXRlTm9kZShmcmFtZSwgcGxhbiwgbm9kZSwgb3B0cywgZW1pdEZuKSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIGEgc2luZ2xlIG5vZGUuXG4gICAgICovXG4gICAgYXN5bmMgZXhlY3V0ZU5vZGUoZnJhbWUsIHBsYW4sIHBsYW5Ob2RlLCBvcHRzLCBlbWl0Rm4pIHtcbiAgICAgICAgY29uc3Qgc3RhcnRlZEF0ID0gbmV3IERhdGUoKTtcbiAgICAgICAgY29uc3Qgbm9kZVBhdGggPSBbLi4uKG9wdHMucGF0aCA/PyBbXSksIHBsYW5Ob2RlLmlkXTtcbiAgICAgICAgYXdhaXQgdGhpcy5lbWl0RXZlbnQoZnJhbWUsIHtcbiAgICAgICAgICAgIHR5cGU6IEdyYXBoRXhlY3V0aW9uRXZlbnRUeXBlLk5PREVfU1RBUlRFRCxcbiAgICAgICAgICAgIHJ1bklkOiBmcmFtZS5ydW5JZCxcbiAgICAgICAgICAgIHdvcmtmbG93SWQ6IHBsYW4ud29ya2Zsb3dJZCxcbiAgICAgICAgICAgIG5vZGVJZDogcGxhbk5vZGUuaWQsXG4gICAgICAgICAgICBwYXRoOiBub2RlUGF0aCxcbiAgICAgICAgICAgIHN0YXR1czogR3JhcGhFeGVjdXRpb25TdGF0dXMuUlVOTklORyxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGlucHV0cyA9IHRoaXMucmVzb2x2ZU5vZGVJbnB1dHMoZnJhbWUsIHBsYW4sIHBsYW5Ob2RlKTtcbiAgICAgICAgLy8gQ2FjaGUtaGl0OiBjaGVjayBmb3IgYSBwaW5uZWQgdmFsdWUgYmVmb3JlIGV4ZWN1dGluZyB0aGUgbm9kZVxuICAgICAgICBpZiAob3B0cy51c2VQaW5uZWRWYWx1ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlZCA9IGF3YWl0IHRoaXMudHJ5UGlubmVkVmFsdWUoZnJhbWUsIHBsYW4sIHBsYW5Ob2RlLCBpbnB1dHMpO1xuICAgICAgICAgICAgaWYgKGNhY2hlZCkge1xuICAgICAgICAgICAgICAgIGZyYW1lLnZhbHVlU3RvcmUuc2V0Tm9kZU91dHB1dHMocGxhbk5vZGUuaWQsIGNhY2hlZC5vdXRwdXRzKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJvdXRlT3V0Z29pbmdFZGdlcyhmcmFtZSwgcGxhbiwgcGxhbk5vZGUsIGNhY2hlZC5vdXRwdXRzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmaW5pc2hlZEF0ID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVJZDogcGxhbk5vZGUuaWQsXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogR3JhcGhFeGVjdXRpb25TdGF0dXMuQ0FDSEVELFxuICAgICAgICAgICAgICAgICAgICBpbnB1dHMsXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dHM6IGNhY2hlZC5vdXRwdXRzLFxuICAgICAgICAgICAgICAgICAgICBzdGFydGVkQXQsXG4gICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkQXQsXG4gICAgICAgICAgICAgICAgICAgIGZyb21DYWNoZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgcGlubmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBldmVudHM6IFtdLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgZnJhbWUucmVjb3JkTm9kZVJlc3VsdChyZXN1bHQpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZW1pdEV2ZW50KGZyYW1lLCB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IEdyYXBoRXhlY3V0aW9uRXZlbnRUeXBlLk5PREVfQ0FDSEVfSElULFxuICAgICAgICAgICAgICAgICAgICBydW5JZDogZnJhbWUucnVuSWQsXG4gICAgICAgICAgICAgICAgICAgIHdvcmtmbG93SWQ6IHBsYW4ud29ya2Zsb3dJZCxcbiAgICAgICAgICAgICAgICAgICAgbm9kZUlkOiBwbGFuTm9kZS5pZCxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogbm9kZVBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogR3JhcGhFeGVjdXRpb25TdGF0dXMuQ0FDSEVELFxuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7IG91dHB1dHM6IGNhY2hlZC5vdXRwdXRzIH0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5lbWl0RXZlbnQoZnJhbWUsIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogR3JhcGhFeGVjdXRpb25FdmVudFR5cGUuTk9ERV9DT01QTEVURUQsXG4gICAgICAgICAgICAgICAgICAgIHJ1bklkOiBmcmFtZS5ydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dJZDogcGxhbi53b3JrZmxvd0lkLFxuICAgICAgICAgICAgICAgICAgICBub2RlSWQ6IHBsYW5Ob2RlLmlkLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBub2RlUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBHcmFwaEV4ZWN1dGlvblN0YXR1cy5TVUNDRUVERUQsXG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsgb3V0cHV0czogY2FjaGVkLm91dHB1dHMsIGZyb21DYWNoZTogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZXhlY3V0b3IgPSB0aGlzLmNvbmZpZy5yZWdpc3RyeS5yZXNvbHZlKHBsYW5Ob2RlLmtpbmQpO1xuICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IG5ldyBHcmFwaEV4ZWN1dGlvbkNvbnRleHQoZnJhbWUucnVuSWQsIG9wdHMucGFyZW50UnVuSWQsIHBsYW4ud29ya2Zsb3csIHBsYW5Ob2RlLmRlZmluaXRpb24sIG5vZGVQYXRoLCBlbWl0Rm4sIG9wdHMubWV0YWRhdGEpO1xuICAgICAgICAgICAgY29uc3Qgb3V0cHV0cyA9IGF3YWl0IGV4ZWN1dG9yLmV4ZWN1dGUoaW5wdXRzLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkT3V0cHV0cyA9IG91dHB1dHMgPz8ge307XG4gICAgICAgICAgICBmcmFtZS52YWx1ZVN0b3JlLnNldE5vZGVPdXRwdXRzKHBsYW5Ob2RlLmlkLCByZXNvbHZlZE91dHB1dHMpO1xuICAgICAgICAgICAgdGhpcy5yb3V0ZU91dGdvaW5nRWRnZXMoZnJhbWUsIHBsYW4sIHBsYW5Ob2RlLCByZXNvbHZlZE91dHB1dHMpO1xuICAgICAgICAgICAgY29uc3QgZmluaXNoZWRBdCA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgbm9kZUlkOiBwbGFuTm9kZS5pZCxcbiAgICAgICAgICAgICAgICBzdGF0dXM6IEdyYXBoRXhlY3V0aW9uU3RhdHVzLlNVQ0NFRURFRCxcbiAgICAgICAgICAgICAgICBpbnB1dHMsXG4gICAgICAgICAgICAgICAgb3V0cHV0czogcmVzb2x2ZWRPdXRwdXRzLFxuICAgICAgICAgICAgICAgIHN0YXJ0ZWRBdCxcbiAgICAgICAgICAgICAgICBmaW5pc2hlZEF0LFxuICAgICAgICAgICAgICAgIGV2ZW50czogW10sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZnJhbWUucmVjb3JkTm9kZVJlc3VsdChyZXN1bHQpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5lbWl0RXZlbnQoZnJhbWUsIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBHcmFwaEV4ZWN1dGlvbkV2ZW50VHlwZS5OT0RFX0NPTVBMRVRFRCxcbiAgICAgICAgICAgICAgICBydW5JZDogZnJhbWUucnVuSWQsXG4gICAgICAgICAgICAgICAgd29ya2Zsb3dJZDogcGxhbi53b3JrZmxvd0lkLFxuICAgICAgICAgICAgICAgIG5vZGVJZDogcGxhbk5vZGUuaWQsXG4gICAgICAgICAgICAgICAgcGF0aDogbm9kZVBhdGgsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBHcmFwaEV4ZWN1dGlvblN0YXR1cy5TVUNDRUVERUQsXG4gICAgICAgICAgICAgICAgcGF5bG9hZDogeyBvdXRwdXRzOiByZXNvbHZlZE91dHB1dHMgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc3QgZmluaXNoZWRBdCA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICBjb25zdCBlcnJvclBheWxvYWQgPSB0aGlzLnRvRXJyb3JQYXlsb2FkKGVycm9yKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICBub2RlSWQ6IHBsYW5Ob2RlLmlkLFxuICAgICAgICAgICAgICAgIHN0YXR1czogR3JhcGhFeGVjdXRpb25TdGF0dXMuRkFJTEVELFxuICAgICAgICAgICAgICAgIGlucHV0cyxcbiAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3JQYXlsb2FkLFxuICAgICAgICAgICAgICAgIHN0YXJ0ZWRBdCxcbiAgICAgICAgICAgICAgICBmaW5pc2hlZEF0LFxuICAgICAgICAgICAgICAgIGV2ZW50czogW10sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZnJhbWUucmVjb3JkTm9kZVJlc3VsdChyZXN1bHQpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5lbWl0RXZlbnQoZnJhbWUsIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBHcmFwaEV4ZWN1dGlvbkV2ZW50VHlwZS5OT0RFX0ZBSUxFRCxcbiAgICAgICAgICAgICAgICBydW5JZDogZnJhbWUucnVuSWQsXG4gICAgICAgICAgICAgICAgd29ya2Zsb3dJZDogcGxhbi53b3JrZmxvd0lkLFxuICAgICAgICAgICAgICAgIG5vZGVJZDogcGxhbk5vZGUuaWQsXG4gICAgICAgICAgICAgICAgcGF0aDogbm9kZVBhdGgsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBHcmFwaEV4ZWN1dGlvblN0YXR1cy5GQUlMRUQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yUGF5bG9hZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKG9wdHMuZmFpbEZhc3QgPz8gdHJ1ZSlcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlcyBhIG5vZGUncyBpbnB1dCB2YWx1ZXMgZnJvbSBpbmNvbWluZyBlZGdlcy5cbiAgICAgKi9cbiAgICByZXNvbHZlTm9kZUlucHV0cyhmcmFtZSwgcGxhbiwgcGxhbk5vZGUpIHtcbiAgICAgICAgY29uc3QgaW5wdXRzID0ge307XG4gICAgICAgIGNvbnN0IGluY29taW5nID0gcGxhbi5pbmNvbWluZ0J5Tm9kZS5nZXQocGxhbk5vZGUuaWQpID8/IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGVkZ2Ugb2YgaW5jb21pbmcpIHtcbiAgICAgICAgICAgIGlucHV0c1tlZGdlLnRhcmdldFBvcnRdID0gZnJhbWUudmFsdWVTdG9yZS5nZXRQb3J0KGVkZ2Uuc291cmNlTm9kZUlkLCBlZGdlLnNvdXJjZVBvcnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbnB1dHM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEF0dGVtcHRzIHRvIHJlYWQgYSBwaW5uZWQgdmFsdWUgZm9yIHRoZSBub2RlLiBSZXR1cm5zIHRoZSBjYWNoZWQgb3V0cHV0c1xuICAgICAqIHdoZW4gYSB2YWxpZCBwaW5uZWQgdmFsdWUgZXhpc3RzLCBvciBgdW5kZWZpbmVkYCB0byBwcm9jZWVkIHdpdGggbm9ybWFsXG4gICAgICogZXhlY3V0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIHRyeVBpbm5lZFZhbHVlKGZyYW1lLCBwbGFuLCBwbGFuTm9kZSwgaW5wdXRzKSB7XG4gICAgICAgIGNvbnN0IHBvbGljeSA9IG5ldyBHcmFwaFBpbm5pbmdQb2xpY3koKTtcbiAgICAgICAgaWYgKCFwb2xpY3kuc2hvdWxkVXNlUGlubmVkVmFsdWUocGxhbk5vZGUpKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3Qgc2VydmljZSA9IHRoaXMuY3JlYXRlUGlubmluZ1NlcnZpY2UoKTtcbiAgICAgICAgY29uc3QgZGVwRmluZ2VycHJpbnRzID0gdGhpcy5jb21wdXRlRGVwZW5kZW5jeUZpbmdlcnByaW50cyhmcmFtZSwgcGxhbiwgcGxhbk5vZGUuaWQpO1xuICAgICAgICByZXR1cm4gc2VydmljZS5yZWFkUGlubmVkVmFsdWUocGxhbi53b3JrZmxvdywgcGxhbk5vZGUsIGlucHV0cywgZGVwRmluZ2VycHJpbnRzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVjdXJzaXZlbHkgY29tcHV0ZXMgZmluZ2VycHJpbnRzIGZvciBhbGwgdXBzdHJlYW0gZGVwZW5kZW5jaWVzIG9mIGEgbm9kZVxuICAgICAqIHVzaW5nIHRoZSByZXN1bHRzIGFscmVhZHkgYWNjdW11bGF0ZWQgaW4gdGhlIGZyYW1lLlxuICAgICAqL1xuICAgIGNvbXB1dGVEZXBlbmRlbmN5RmluZ2VycHJpbnRzKGZyYW1lLCBwbGFuLCBub2RlSWQpIHtcbiAgICAgICAgY29uc3Qgc2VydmljZSA9IHRoaXMuY3JlYXRlUGlubmluZ1NlcnZpY2UoKTtcbiAgICAgICAgY29uc3QgZGVwUmVzb2x2ZXIgPSBuZXcgR3JhcGhQaW5uaW5nRGVwZW5kZW5jeVJlc29sdmVyKCk7XG4gICAgICAgIGNvbnN0IGRlcHMgPSBkZXBSZXNvbHZlci5nZXREZXBlbmRlbmNpZXMocGxhbiwgbm9kZUlkKTtcbiAgICAgICAgY29uc3QgZmluZ2VycHJpbnRzID0ge307XG4gICAgICAgIGZvciAoY29uc3QgZGVwIG9mIGRlcHMpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBwbGFuLm5vZGVzLmZpbmQoKG4pID0+IG4uaWQgPT09IGRlcCk7XG4gICAgICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlcFJlc3VsdCA9IGZyYW1lLm5vZGVSZXN1bHRzLmdldChkZXApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0cyA9IGRlcFJlc3VsdD8uaW5wdXRzID8/IHt9O1xuICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZERlcHMgPSB0aGlzLmNvbXB1dGVEZXBlbmRlbmN5RmluZ2VycHJpbnRzKGZyYW1lLCBwbGFuLCBkZXApO1xuICAgICAgICAgICAgICAgIGZpbmdlcnByaW50c1tkZXBdID0gc2VydmljZS5jb21wdXRlRmluZ2VycHJpbnQocGxhbi53b3JrZmxvdywgbm9kZSwgaW5wdXRzLCBuZXN0ZWREZXBzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmluZ2VycHJpbnRzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSb3V0ZXMgYSBub2RlJ3Mgb3V0cHV0cyB0byBkb3duc3RyZWFtIGlucHV0cyBhbmQgd29ya2Zsb3cgb3V0cHV0cy5cbiAgICAgKi9cbiAgICByb3V0ZU91dGdvaW5nRWRnZXMoZnJhbWUsIHBsYW4sIHBsYW5Ob2RlLCBvdXRwdXRzKSB7XG4gICAgICAgIGNvbnN0IG91dGdvaW5nID0gcGxhbi5vdXRnb2luZ0J5Tm9kZS5nZXQocGxhbk5vZGUuaWQpID8/IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGVkZ2Ugb2Ygb3V0Z29pbmcpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gb3V0cHV0c1tlZGdlLnNvdXJjZVBvcnRdO1xuICAgICAgICAgICAgaWYgKGVkZ2UudGFyZ2V0Tm9kZUlkID09PSBHUkFQSF9XT1JLRkxPV19CT1VOREFSWSkge1xuICAgICAgICAgICAgICAgIGZyYW1lLnZhbHVlU3RvcmUuc2V0V29ya2Zsb3dPdXRwdXQoZWRnZS50YXJnZXRQb3J0LCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmVtaXRFdmVudChmcmFtZSwge1xuICAgICAgICAgICAgICAgIHR5cGU6IEdyYXBoRXhlY3V0aW9uRXZlbnRUeXBlLkVER0VfVkFMVUVfUk9VVEVELFxuICAgICAgICAgICAgICAgIHJ1bklkOiBmcmFtZS5ydW5JZCxcbiAgICAgICAgICAgICAgICB3b3JrZmxvd0lkOiBwbGFuLndvcmtmbG93SWQsXG4gICAgICAgICAgICAgICAgZWRnZUlkOiBlZGdlLmlkLFxuICAgICAgICAgICAgICAgIG5vZGVJZDogcGxhbk5vZGUuaWQsXG4gICAgICAgICAgICAgICAgcGF0aDogW10sXG4gICAgICAgICAgICAgICAgcGF5bG9hZDogeyBlZGdlLCB2YWx1ZSB9LFxuICAgICAgICAgICAgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIG9ic2VydmVyIGZhaWx1cmVzIG11c3Qgbm90IGNyYXNoXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbWl0cyBhbiBldmVudCwgcmVjb3JkcyBpdCBpbiB0aGUgZnJhbWUsIGFuZCBkaXNwYXRjaGVzIHRvIG9ic2VydmVycy5cbiAgICAgKi9cbiAgICBhc3luYyBlbWl0RXZlbnQoZnJhbWUsIHBhcnRpYWwpIHtcbiAgICAgICAgY29uc3QgZXZlbnQgPSBmcmFtZS5ldmVudEZhY3RvcnkuY3JlYXRlKHtcbiAgICAgICAgICAgIGlkOiBcIlwiLFxuICAgICAgICAgICAgc2VxdWVuY2U6IDAsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAuLi5wYXJ0aWFsLFxuICAgICAgICB9KTtcbiAgICAgICAgZnJhbWUuYXBwZW5kRXZlbnQoZXZlbnQpO1xuICAgICAgICBhd2FpdCB0aGlzLmVtaXR0ZXIudXBkYXRlT2JzZXJ2ZXJzKGV2ZW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWVyZ2VzIGRlZmF1bHQgb3B0aW9ucyB3aXRoIHRoZSBnaXZlbiBvcHRpb25zLlxuICAgICAqL1xuICAgIG1lcmdlT3B0aW9ucyhvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb25jdXJyZW5jeTogR1JBUEhfREVGQVVMVF9DT05DVVJSRU5DWSxcbiAgICAgICAgICAgIGZhaWxGYXN0OiB0cnVlLFxuICAgICAgICAgICAgdmFsaWRhdGVJbnB1dHM6IHRydWUsXG4gICAgICAgICAgICB2YWxpZGF0ZU91dHB1dHM6IHRydWUsXG4gICAgICAgICAgICB1c2VQaW5uZWRWYWx1ZXM6IHRydWUsXG4gICAgICAgICAgICB3cml0ZVRocm91Z2hDYWNoZTogZmFsc2UsXG4gICAgICAgICAgICBwYXRoOiBbXSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7fSxcbiAgICAgICAgICAgIC4uLnRoaXMuZGVmYXVsdE9wdGlvbnMsXG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgYSB1bmlxdWUgcnVuIGlkLlxuICAgICAqL1xuICAgIGdlbmVyYXRlUnVuSWQoKSB7XG4gICAgICAgIHJldHVybiAoZ2xvYmFsVGhpcy5jcnlwdG8/LnJhbmRvbVVVSUQ/LigpID8/XG4gICAgICAgICAgICBgZ3JhcGgtcnVuLSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKX1gKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYW4gZXJyb3IgaW50byBhIHNlcmlhbGl6ZWQgcGF5bG9hZC5cbiAgICAgKi9cbiAgICB0b0Vycm9yUGF5bG9hZChlcnJvcikge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBlcnJvci5uYW1lLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgc3RhY2s6IGVycm9yLnN0YWNrLFxuICAgICAgICAgICAgICAgIGNvZGU6IGVycm9yLmdyYXBoQ29kZSA/P1xuICAgICAgICAgICAgICAgICAgICAodHlwZW9mIGVycm9yLmNvZGUgPT09IFwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gU3RyaW5nKGVycm9yLmNvZGUpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGVycm9yLmNvZGUpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBuYW1lOiBcIlVua25vd25FcnJvclwiLCBtZXNzYWdlOiBTdHJpbmcoZXJyb3IpIH07XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKbWFXeGxJam9pUjNKaGNHaEZlR1ZqZFhScGIyNUZibWRwYm1VdWFuTWlMQ0p6YjNWeVkyVlNiMjkwSWpvaUlpd2ljMjkxY21ObGN5STZXeUl1TGk4dUxpOHVMaTh1TGk5emNtTXZaM0poY0dndlpYaGxZM1YwYVc5dUwwZHlZWEJvUlhobFkzVjBhVzl1Ulc1bmFXNWxMblJ6SWwwc0ltNWhiV1Z6SWpwYlhTd2liV0Z3Y0dsdVozTWlPaUpCUVZGQkxFOUJRVThzUlVGRFRDeDVRa0ZCZVVJc1JVRkRla0lzZFVKQlFYVkNMRVZCUTNaQ0xIVkNRVUYxUWl4RlFVTjJRaXh2UWtGQmIwSXNSMEZEY2tJc01FSkJRWEZDTzBGQllYUkNMRTlCUVU4c1JVRkJSU3d3UWtGQk1FSXNSVUZCUlN4clJFRkJOa003UVVGRGJFWXNUMEZCVHl4RlFVRkZMREJDUVVFd1FpeEZRVUZGTEd0RVFVRTJRenRCUVVWc1JpeFBRVUZQTEVWQlFVVXNjVUpCUVhGQ0xFVkJRVVVzSzBOQlFUQkRPMEZCU1RGRkxFOUJRVThzUlVGQlJTdzRRa0ZCT0VJc1JVRkJSU3h4UkVGQlowUTdRVUZEZWtZc1QwRkJUeXhGUVVGRkxHVkJRV1VzUlVGQlJTeHpRMEZCYVVNN1FVRkZNMFFzVDBGQlR5eEZRVUZGTEcxQ1FVRnRRaXhGUVVGRkxEUkRRVUYxUXp0QlFVTnlSU3hQUVVGUExFVkJRVVVzYTBKQlFXdENMRVZCUVVVc01rTkJRWE5ETzBGQlEyNUZMRTlCUVU4c1JVRkJSU3c0UWtGQk9FSXNSVUZCUlN4MVJFRkJhMFE3UVVGRE0wWXNUMEZCVHl4RlFVRkZMSEZDUVVGeFFpeEZRVUZGTEcxRFFVRm5RenRCUVVOb1JTeFBRVUZQTEVWQlFVVXNiVUpCUVcxQ0xFVkJRVVVzYVVOQlFUaENPMEZCUXpWRUxFOUJRVThzUlVGQlJTeDVRa0ZCZVVJc1JVRkJSU3hyUTBGQkswSTdRVUUwUW01Rk96czdPenM3T3pzN08wZEJWVWM3UVVGRFNDeE5RVUZOTEU5QlFVOHNiMEpCUVc5Q08wbEJVeTlDTEZsQlFWa3NUVUZCYTBNN1VVRkROVU1zU1VGQlNTeERRVUZETEU5QlFVOHNSMEZCUnl4TlFVRk5MRU5CUVVNc1dVRkJXU3hKUVVGSkxFbEJRVWtzTUVKQlFUQkNMRVZCUVVVc1EwRkJRenRSUVVOMlJTeEpRVUZKTEVOQlFVTXNUMEZCVHl4SFFVRkhMRTFCUVUwc1EwRkJReXhQUVVGUExFbEJRVWtzU1VGQlNTeHhRa0ZCY1VJc1JVRkJSU3hEUVVGRE8xRkJRemRFTEVsQlFVa3NRMEZCUXl4cFFrRkJhVUk3V1VGRGNFSXNUVUZCVFN4RFFVRkRMR2xDUVVGcFFpeEpRVUZKTEVsQlFVa3NPRUpCUVRoQ0xFVkJRVVVzUTBGQlF6dFJRVU51UlN4SlFVRkpMRU5CUVVNc1kwRkJZeXhIUVVGSExFMUJRVTBzUTBGQlF5eGpRVUZqTEVsQlFVa3NSVUZCUlN4RFFVRkRPMUZCUTJ4RUxFbEJRVWtzUTBGQlF5eHZRa0ZCYjBJc1IwRkJSeXhOUVVGTkxFTkJRVU1zYjBKQlFXOUNMRU5CUVVNN1VVRkRlRVFzU1VGQlNTeERRVUZETEUxQlFVMHNSMEZCUnl4TlFVRk5MRU5CUVVNN1VVRkRja0lzVFVGQlRTeERRVUZETEdWQlFXVXNSVUZCUlN4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRE8wbEJRMnBETEVOQlFVTTdTVUZKUkN4UFFVRlBMRU5CUVVNc1VVRkJaME03VVVGRGRFTXNUMEZCVHl4SlFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExFOUJRVThzUTBGQlF5eFJRVUZSTEVOQlFVTXNRMEZCUXp0SlFVTjRReXhEUVVGRE8wbEJSVVFzVTBGQlV5eERRVUZETEZGQlFXZERPMUZCUTNoRExFbEJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNVMEZCVXl4RFFVRkRMRkZCUVZFc1EwRkJReXhEUVVGRE8wbEJRMjVETEVOQlFVTTdTVUZGUkN4TFFVRkxMRU5CUVVNc1pVRkJaU3hEUVVGRExFdEJRVEJDTzFGQlF6bERMRTFCUVUwc1NVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eGxRVUZsTEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNN1NVRkROVU1zUTBGQlF6dEpRVVZFT3p0UFFVVkhPMGxCUTBnc1MwRkJTeXhEUVVGRExFOUJRVThzUTBGRFdDeFJRVUZwUXl4RlFVTnFReXhUUVVFclFpeEZRVUZGTEVWQlEycERMRlZCUVdsRExFVkJRVVU3VVVGRmJrTXNUVUZCVFN4SlFVRkpMRWRCUVVjc1NVRkJTU3hEUVVGRExGbEJRVmtzUTBGQlF5eFBRVUZQTEVOQlFVTXNRMEZCUXp0UlFVTjRReXhOUVVGTkxFdEJRVXNzUjBGQlJ5eEpRVUZKTEVOQlFVTXNTMEZCU3l4SlFVRkpMRWxCUVVrc1EwRkJReXhoUVVGaExFVkJRVVVzUTBGQlF6dFJRVU5xUkN4TlFVRk5MRWxCUVVrc1IwRkJSeXhKUVVGSkxFTkJRVU1zU1VGQlNTeEpRVUZKTEVWQlFVVXNRMEZCUXp0UlFVTTNRaXhOUVVGTkxGbEJRVmtzUjBGQlJ5eEpRVUZKTERCQ1FVRXdRaXhGUVVGRkxFTkJRVU03VVVGRGRFUXNUVUZCVFN4VlFVRlZMRWRCUVVjc1NVRkJTU3hsUVVGbExFTkJRVU1zU1VGQlNTeERRVUZETEdsQ1FVRnBRaXhEUVVGRExFTkJRVU03VVVGREwwUXNWVUZCVlN4RFFVRkRMR3RDUVVGclFpeERRVUZETEUxQlFVMHNRMEZCUXl4RFFVRkRPMUZCUlhSRExFMUJRVTBzU1VGQlNTeEhRVUZITEVsQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eERRVUZETzFGQlEzcERMRTFCUVUwc1MwRkJTeXhIUVVGSExFbEJRVWtzYlVKQlFXMUNMRU5CUTI1RExFdEJRVXNzUlVGRFRDeEpRVUZKTEVWQlEwb3NWVUZCVlN4RlFVTldMRmxCUVZrc1EwRkRZaXhEUVVGRE8xRkJSVVlzVFVGQlRTeE5RVUZOTEVkQlFVY3NTMEZCU3l4RlFVRkZMRTlCUVhGRExFVkJRVVVzUlVGQlJUdFpRVU0zUkN4TlFVRk5MRWxCUVVrc1EwRkJReXhUUVVGVExFTkJRVU1zUzBGQlN5eEZRVUZGTzJkQ1FVTXhRaXhKUVVGSkxFVkJRVVVzVDBGQlR5eERRVUZETEVsQlFVa3NTVUZCU1N4MVFrRkJkVUlzUTBGQlF5eFhRVUZYTzJkQ1FVTjZSQ3hMUVVGTE8yZENRVU5NTEZkQlFWY3NSVUZCUlN4SlFVRkpMRU5CUVVNc1YwRkJWenRuUWtGRE4wSXNWVUZCVlN4RlFVRkZMRkZCUVZFc1EwRkJReXhKUVVGSk8yZENRVU42UWl4TlFVRk5MRVZCUVVVc1QwRkJUeXhEUVVGRExFMUJRVTA3WjBKQlEzUkNMRWxCUVVrc1JVRkJSU3hQUVVGUExFTkJRVU1zU1VGQlNTeEpRVUZKTEVsQlFVazdaMEpCUXpGQ0xFZEJRVWNzVDBGQlR6dGhRVU5ZTEVOQlFVTXNRMEZCUXp0UlFVTk1MRU5CUVVNc1EwRkJRenRSUVVWR0xFMUJRVTBzU1VGQlNTeERRVUZETEZOQlFWTXNRMEZCUXl4TFFVRkxMRVZCUVVVN1dVRkRNVUlzU1VGQlNTeEZRVUZGTEhWQ1FVRjFRaXhEUVVGRExHZENRVUZuUWp0WlFVTTVReXhMUVVGTE8xbEJRMHdzVjBGQlZ5eEZRVUZGTEVsQlFVa3NRMEZCUXl4WFFVRlhPMWxCUXpkQ0xGVkJRVlVzUlVGQlJTeFJRVUZSTEVOQlFVTXNTVUZCU1R0WlFVTjZRaXhKUVVGSk8xbEJRMG9zVFVGQlRTeEZRVUZGTEc5Q1FVRnZRaXhEUVVGRExFOUJRVTg3V1VGRGNFTXNUMEZCVHl4RlFVRkZMRVZCUVVVc1RVRkJUU3hGUVVGRk8xTkJRM0JDTEVOQlFVTXNRMEZCUXp0UlFVVklMRTFCUVUwc1NVRkJTU3hEUVVGRExGTkJRVk1zUTBGQlF5eExRVUZMTEVWQlFVVTdXVUZETVVJc1NVRkJTU3hGUVVGRkxIVkNRVUYxUWl4RFFVRkRMR2RDUVVGblFqdFpRVU01UXl4TFFVRkxPMWxCUTB3c1YwRkJWeXhGUVVGRkxFbEJRVWtzUTBGQlF5eFhRVUZYTzFsQlF6ZENMRlZCUVZVc1JVRkJSU3hSUVVGUkxFTkJRVU1zU1VGQlNUdFpRVU42UWl4SlFVRkpPMWxCUTBvc1RVRkJUU3hGUVVGRkxHOUNRVUZ2UWl4RFFVRkRMRkZCUVZFN1dVRkRja01zVDBGQlR5eEZRVUZGTEVWQlFVVXNUVUZCVFN4RlFVRkZMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zVFVGQlRTeEZRVUZGTEV0QlFVc3NSVUZCUlN4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFMUJRVTBzUlVGQlJUdFRRVU5zUlN4RFFVRkRMRU5CUVVNN1VVRkZTQ3hKUVVGSkxFTkJRVU03V1VGRFNDeExRVUZMTEUxQlFVMHNTMEZCU3l4SlFVRkpMRWxCUVVrc1EwRkJReXhOUVVGTkxFVkJRVVVzUTBGQlF6dG5Ra0ZEYUVNc1RVRkJUU3hKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEV0QlFVc3NSVUZCUlN4SlFVRkpMRVZCUVVVc1MwRkJTeXhEUVVGRExFdEJRVXNzUlVGQlJTeEpRVUZKTEVWQlFVVXNUVUZCVFN4RFFVRkRMRU5CUVVNN1dVRkRiRVVzUTBGQlF6dFpRVVZFTEV0QlFVc3NRMEZCUXl4TlFVRk5MRVZCUVVVc1EwRkJRenRaUVVWbUxFMUJRVTBzU1VGQlNTeERRVUZETEZOQlFWTXNRMEZCUXl4TFFVRkxMRVZCUVVVN1owSkJRekZDTEVsQlFVa3NSVUZCUlN4MVFrRkJkVUlzUTBGQlF5eHJRa0ZCYTBJN1owSkJRMmhFTEV0QlFVczdaMEpCUTB3c1YwRkJWeXhGUVVGRkxFbEJRVWtzUTBGQlF5eFhRVUZYTzJkQ1FVTTNRaXhWUVVGVkxFVkJRVVVzVVVGQlVTeERRVUZETEVsQlFVazdaMEpCUTNwQ0xFbEJRVWs3WjBKQlEwb3NUVUZCVFN4RlFVRkZMRzlDUVVGdlFpeERRVUZETEZOQlFWTTdaMEpCUTNSRExFOUJRVThzUlVGQlJTeEZRVUZGTEU5QlFVOHNSVUZCUlN4VlFVRlZMRU5CUVVNc2FVSkJRV2xDTEVWQlFVVXNSVUZCUlR0aFFVTnlSQ3hEUVVGRExFTkJRVU03V1VGRlNDeFBRVUZQTEhsQ1FVRjVRaXhEUVVNNVFpeExRVUZMTEVWQlEwd3NVVUZCVVN4RlFVTlNMRTFCUVUwc1JVRkRUaXh2UWtGQmIwSXNRMEZCUXl4VFFVRlRMRVZCUXpsQ0xFbEJRVWtzUTBGQlF5eFJRVUZSTEVOQlEyUXNRMEZCUXp0UlFVTktMRU5CUVVNN1VVRkJReXhQUVVGUExFdEJRVXNzUlVGQlJTeERRVUZETzFsQlEyWXNTMEZCU3l4RFFVRkRMRTFCUVUwc1JVRkJSU3hEUVVGRE8xbEJRMllzVFVGQlRTeFpRVUZaTEVkQlFVY3NTVUZCU1N4RFFVRkRMR05CUVdNc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF6dFpRVVZvUkN4TlFVRk5MRWxCUVVrc1EwRkJReXhUUVVGVExFTkJRVU1zUzBGQlN5eEZRVUZGTzJkQ1FVTXhRaXhKUVVGSkxFVkJRVVVzZFVKQlFYVkNMRU5CUVVNc1pVRkJaVHRuUWtGRE4wTXNTMEZCU3p0blFrRkRUQ3hYUVVGWExFVkJRVVVzU1VGQlNTeERRVUZETEZkQlFWYzdaMEpCUXpkQ0xGVkJRVlVzUlVGQlJTeFJRVUZSTEVOQlFVTXNTVUZCU1R0blFrRkRla0lzU1VGQlNUdG5Ra0ZEU2l4TlFVRk5MRVZCUVVVc2IwSkJRVzlDTEVOQlFVTXNUVUZCVFR0blFrRkRia01zUzBGQlN5eEZRVUZGTEZsQlFWazdZVUZEY0VJc1EwRkJReXhEUVVGRE8xbEJSVWdzVDBGQlR5eDVRa0ZCZVVJc1EwRkRPVUlzUzBGQlN5eEZRVU5NTEZGQlFWRXNSVUZEVWl4TlFVRk5MRVZCUTA0c2IwSkJRVzlDTEVOQlFVTXNUVUZCVFN4RlFVTXpRaXhKUVVGSkxFTkJRVU1zVVVGQlVTeERRVU5rTEVOQlFVTTdVVUZEU2l4RFFVRkRPMGxCUTBnc1EwRkJRenRKUVVWRU96czdPenRQUVV0SE8wbEJRMGdzUzBGQlN5eERRVUZETEU5QlFVOHNRMEZCUXl4UFFVRTBRanRSUVVONFF5eE5RVUZOTEU5QlFVOHNSMEZCUnl4SlFVRkpMRU5CUVVNc2IwSkJRVzlDTEVWQlFVVXNRMEZCUXp0UlFVTTFReXhOUVVGTkxFOUJRVThzUTBGQlF5eFBRVUZQTEVOQlFVTXNUMEZCVHl4RFFVRkRMRU5CUVVNN1VVRkRMMElzVFVGQlRTeEpRVUZKTEVOQlFVTXNaMEpCUVdkQ0xFTkJRVU1zVDBGQlR5eERRVUZETEUxQlFVMHNSVUZCUlN4MVFrRkJkVUlzUTBGQlF5eFhRVUZYTEVOQlFVTXNRMEZCUXp0SlFVTnVSaXhEUVVGRE8wbEJSVVE3TzA5QlJVYzdTVUZEU0N4TFFVRkxMRU5CUVVNc1UwRkJVeXhEUVVGRExFOUJRVGhDTzFGQlF6VkRMRTFCUVUwc1QwRkJUeXhIUVVGSExFbEJRVWtzUTBGQlF5eHZRa0ZCYjBJc1JVRkJSU3hEUVVGRE8xRkJRelZETEUxQlFVMHNUMEZCVHl4RFFVRkRMRk5CUVZNc1EwRkJReXhQUVVGUExFTkJRVU1zUTBGQlF6dFJRVU5xUXl4TlFVRk5MRWxCUVVrc1EwRkJReXhuUWtGQlowSXNRMEZCUXl4UFFVRlBMRU5CUVVNc1RVRkJUU3hGUVVGRkxIVkNRVUYxUWl4RFFVRkRMR0ZCUVdFc1EwRkJReXhEUVVGRE8wbEJRM0pHTEVOQlFVTTdTVUZGUkRzN08wOUJSMGM3U1VGRFN5eHZRa0ZCYjBJN1VVRkRNVUlzVFVGQlRTeExRVUZMTEVkQlFVY3NTVUZCU1N4bFFVRmxMRU5CUVVNc1NVRkJTU3hEUVVGRExHbENRVUZwUWl4RFFVRkRMRU5CUVVNN1VVRkRNVVFzVDBGQlR5eEpRVUZKTEcxQ1FVRnRRaXhEUVVNMVFpeExRVUZMTEVWQlEwd3NTVUZCU1N4clFrRkJhMElzUlVGQlJTeEZRVU40UWl4SlFVRkpMRGhDUVVFNFFpeEZRVUZGTEVOQlEzSkRMRU5CUVVNN1NVRkRTaXhEUVVGRE8wbEJSVVE3TzA5QlJVYzdTVUZEU3l4TFFVRkxMRU5CUVVNc1owSkJRV2RDTEVOQlF6VkNMRTFCUVdNc1JVRkRaQ3hKUVVFMlFqdFJRVVUzUWl4TlFVRk5MRTlCUVU4c1IwRkJSeXhKUVVGSkxEQkNRVUV3UWl4RlFVRkZMRU5CUVVNN1VVRkRha1FzVFVGQlRTeExRVUZMTEVkQlFVY3NUMEZCVHl4RFFVRkRMRTFCUVUwc1EwRkJRenRaUVVNelFpeEZRVUZGTEVWQlFVVXNSVUZCUlR0WlFVTk9MRkZCUVZFc1JVRkJSU3hEUVVGRE8xbEJRMWdzVTBGQlV5eEZRVUZGTEVsQlFVa3NTVUZCU1N4RlFVRkZPMWxCUTNKQ0xFdEJRVXNzUlVGQlJTeFRRVUZUTzFsQlEyaENMRlZCUVZVc1JVRkJSU3hGUVVGRk8xbEJRMlFzU1VGQlNUdFpRVU5LTEUxQlFVMDdXVUZEVGl4SlFVRkpMRVZCUVVVc1JVRkJSVHRUUVVOeFJDeERRVUZETEVOQlFVTTdVVUZEYWtVc1RVRkJUU3hKUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEdWQlFXVXNRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJRenRKUVVNMVF5eERRVUZETzBsQlJVUTdPMDlCUlVjN1NVRkRTeXhMUVVGTExFTkJRVU1zV1VGQldTeERRVU40UWl4TFFVRXdRaXhGUVVNeFFpeEpRVUYzUWl4RlFVTjRRaXhMUVVFclFpeEZRVU12UWl4SlFVRXlRaXhGUVVNelFpeE5RVUU0UkR0UlFVVTVSQ3hOUVVGTkxGZEJRVmNzUjBGQlJ5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVTXhRaXhEUVVGRExFVkJRMFFzU1VGQlNTeERRVUZETEZkQlFWY3NTVUZCU1N4NVFrRkJlVUlzUTBGRE9VTXNRMEZCUXp0UlFVTkdMRTFCUVUwc1MwRkJTeXhIUVVGSExFTkJRVU1zUjBGQlJ5eExRVUZMTEVOQlFVTXNRMEZCUXp0UlFVVjZRaXhQUVVGUExFdEJRVXNzUTBGQlF5eE5RVUZOTEVkQlFVY3NRMEZCUXl4RlFVRkZMRU5CUVVNN1dVRkRlRUlzVFVGQlRTeExRVUZMTEVkQlFVY3NTMEZCU3l4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRExFVkJRVVVzVjBGQlZ5eERRVUZETEVOQlFVTTdXVUZETTBNc1RVRkJUU3hQUVVGUExFTkJRVU1zUjBGQlJ5eERRVU5tTEV0QlFVc3NRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJReXhKUVVGSkxFVkJRVVVzUlVGQlJTeERRVUZETEVsQlFVa3NRMEZCUXl4WFFVRlhMRU5CUVVNc1MwRkJTeXhGUVVGRkxFbEJRVWtzUlVGQlJTeEpRVUZKTEVWQlFVVXNTVUZCU1N4RlFVRkZMRTFCUVUwc1EwRkJReXhEUVVGRExFTkJRM1pGTEVOQlFVTTdVVUZEU2l4RFFVRkRPMGxCUTBnc1EwRkJRenRKUVVWRU96dFBRVVZITzBsQlEwc3NTMEZCU3l4RFFVRkRMRmRCUVZjc1EwRkRka0lzUzBGQk1FSXNSVUZETVVJc1NVRkJkMElzUlVGRGVFSXNVVUZCWjBNc1JVRkRhRU1zU1VGQk1rSXNSVUZETTBJc1RVRkJPRVE3VVVGRk9VUXNUVUZCVFN4VFFVRlRMRWRCUVVjc1NVRkJTU3hKUVVGSkxFVkJRVVVzUTBGQlF6dFJRVU0zUWl4TlFVRk5MRkZCUVZFc1IwRkJSeXhEUVVGRExFZEJRVWNzUTBGQlF5eEpRVUZKTEVOQlFVTXNTVUZCU1N4SlFVRkpMRVZCUVVVc1EwRkJReXhGUVVGRkxGRkJRVkVzUTBGQlF5eEZRVUZGTEVOQlFVTXNRMEZCUXp0UlFVVnlSQ3hOUVVGTkxFbEJRVWtzUTBGQlF5eFRRVUZUTEVOQlFVTXNTMEZCU3l4RlFVRkZPMWxCUXpGQ0xFbEJRVWtzUlVGQlJTeDFRa0ZCZFVJc1EwRkJReXhaUVVGWk8xbEJRekZETEV0QlFVc3NSVUZCUlN4TFFVRkxMRU5CUVVNc1MwRkJTenRaUVVOc1FpeFZRVUZWTEVWQlFVVXNTVUZCU1N4RFFVRkRMRlZCUVZVN1dVRkRNMElzVFVGQlRTeEZRVUZGTEZGQlFWRXNRMEZCUXl4RlFVRkZPMWxCUTI1Q0xFbEJRVWtzUlVGQlJTeFJRVUZSTzFsQlEyUXNUVUZCVFN4RlFVRkZMRzlDUVVGdlFpeERRVUZETEU5QlFVODdVMEZEY2tNc1EwRkJReXhEUVVGRE8xRkJSVWdzVFVGQlRTeE5RVUZOTEVkQlFVY3NTVUZCU1N4RFFVRkRMR2xDUVVGcFFpeERRVUZETEV0QlFVc3NSVUZCUlN4SlFVRkpMRVZCUVVVc1VVRkJVU3hEUVVGRExFTkJRVU03VVVGRk4wUXNaMFZCUVdkRk8xRkJRMmhGTEVsQlFVa3NTVUZCU1N4RFFVRkRMR1ZCUVdVc1JVRkJSU3hEUVVGRE8xbEJRM3BDTEUxQlFVMHNUVUZCVFN4SFFVRkhMRTFCUVUwc1NVRkJTU3hEUVVGRExHTkJRV01zUTBGQlF5eExRVUZMTEVWQlFVVXNTVUZCU1N4RlFVRkZMRkZCUVZFc1JVRkJSU3hOUVVGTkxFTkJRVU1zUTBGQlF6dFpRVU40UlN4SlFVRkpMRTFCUVUwc1JVRkJSU3hEUVVGRE8yZENRVU5ZTEV0QlFVc3NRMEZCUXl4VlFVRlZMRU5CUVVNc1kwRkJZeXhEUVVGRExGRkJRVkVzUTBGQlF5eEZRVUZGTEVWQlFVVXNUVUZCVFN4RFFVRkRMRTlCUVU4c1EwRkJReXhEUVVGRE8yZENRVU0zUkN4SlFVRkpMRU5CUVVNc2EwSkJRV3RDTEVOQlFVTXNTMEZCU3l4RlFVRkZMRWxCUVVrc1JVRkJSU3hSUVVGUkxFVkJRVVVzVFVGQlRTeERRVUZETEU5QlFVOHNRMEZCUXl4RFFVRkRPMmRDUVVVdlJDeE5RVUZOTEZWQlFWVXNSMEZCUnl4SlFVRkpMRWxCUVVrc1JVRkJSU3hEUVVGRE8yZENRVU01UWl4TlFVRk5MRTFCUVUwc1IwRkJOa0k3YjBKQlEzWkRMRTFCUVUwc1JVRkJSU3hSUVVGUkxFTkJRVU1zUlVGQlJUdHZRa0ZEYmtJc1RVRkJUU3hGUVVGRkxHOUNRVUZ2UWl4RFFVRkRMRTFCUVUwN2IwSkJRMjVETEUxQlFVMDdiMEpCUTA0c1QwRkJUeXhGUVVGRkxFMUJRVTBzUTBGQlF5eFBRVUZQTzI5Q1FVTjJRaXhUUVVGVE8yOUNRVU5VTEZWQlFWVTdiMEpCUTFZc1UwRkJVeXhGUVVGRkxFbEJRVWs3YjBKQlEyWXNUVUZCVFN4RlFVRkZMRWxCUVVrN2IwSkJRMW9zVFVGQlRTeEZRVUZGTEVWQlFVVTdhVUpCUTFnc1EwRkJRenRuUWtGRFJpeExRVUZMTEVOQlFVTXNaMEpCUVdkQ0xFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTTdaMEpCUlM5Q0xFMUJRVTBzU1VGQlNTeERRVUZETEZOQlFWTXNRMEZCUXl4TFFVRkxMRVZCUVVVN2IwSkJRekZDTEVsQlFVa3NSVUZCUlN4MVFrRkJkVUlzUTBGQlF5eGpRVUZqTzI5Q1FVTTFReXhMUVVGTExFVkJRVVVzUzBGQlN5eERRVUZETEV0QlFVczdiMEpCUTJ4Q0xGVkJRVlVzUlVGQlJTeEpRVUZKTEVOQlFVTXNWVUZCVlR0dlFrRkRNMElzVFVGQlRTeEZRVUZGTEZGQlFWRXNRMEZCUXl4RlFVRkZPMjlDUVVOdVFpeEpRVUZKTEVWQlFVVXNVVUZCVVR0dlFrRkRaQ3hOUVVGTkxFVkJRVVVzYjBKQlFXOUNMRU5CUVVNc1RVRkJUVHR2UWtGRGJrTXNUMEZCVHl4RlFVRkZMRVZCUVVVc1QwRkJUeXhGUVVGRkxFMUJRVTBzUTBGQlF5eFBRVUZQTEVWQlFVVTdhVUpCUTNKRExFTkJRVU1zUTBGQlF6dG5Ra0ZGU0N4TlFVRk5MRWxCUVVrc1EwRkJReXhUUVVGVExFTkJRVU1zUzBGQlN5eEZRVUZGTzI5Q1FVTXhRaXhKUVVGSkxFVkJRVVVzZFVKQlFYVkNMRU5CUVVNc1kwRkJZenR2UWtGRE5VTXNTMEZCU3l4RlFVRkZMRXRCUVVzc1EwRkJReXhMUVVGTE8yOUNRVU5zUWl4VlFVRlZMRVZCUVVVc1NVRkJTU3hEUVVGRExGVkJRVlU3YjBKQlF6TkNMRTFCUVUwc1JVRkJSU3hSUVVGUkxFTkJRVU1zUlVGQlJUdHZRa0ZEYmtJc1NVRkJTU3hGUVVGRkxGRkJRVkU3YjBKQlEyUXNUVUZCVFN4RlFVRkZMRzlDUVVGdlFpeERRVUZETEZOQlFWTTdiMEpCUTNSRExFOUJRVThzUlVGQlJTeEZRVUZGTEU5QlFVOHNSVUZCUlN4TlFVRk5MRU5CUVVNc1QwRkJUeXhGUVVGRkxGTkJRVk1zUlVGQlJTeEpRVUZKTEVWQlFVVTdhVUpCUTNSRUxFTkJRVU1zUTBGQlF6dG5Ra0ZEU0N4UFFVRlBPMWxCUTFRc1EwRkJRenRSUVVOSUxFTkJRVU03VVVGRlJDeEpRVUZKTEVOQlFVTTdXVUZEU0N4TlFVRk5MRkZCUVZFc1IwRkJSeXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEZGQlFWRXNRMEZCUXl4UFFVRlBMRU5CUVVNc1VVRkJVU3hEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETzFsQlF6ZEVMRTFCUVUwc1QwRkJUeXhIUVVGSExFbEJRVWtzY1VKQlFYRkNMRU5CUTNaRExFdEJRVXNzUTBGQlF5eExRVUZMTEVWQlExZ3NTVUZCU1N4RFFVRkRMRmRCUVZjc1JVRkRhRUlzU1VGQlNTeERRVUZETEZGQlFWRXNSVUZEWWl4UlFVRlJMRU5CUVVNc1ZVRkJWU3hGUVVOdVFpeFJRVUZSTEVWQlExSXNUVUZCVFN4RlFVTk9MRWxCUVVrc1EwRkJReXhSUVVGUkxFTkJRMlFzUTBGQlF6dFpRVVZHTEUxQlFVMHNUMEZCVHl4SFFVRkhMRTFCUVUwc1VVRkJVU3hEUVVGRExFOUJRVThzUTBGQlF5eE5RVUZOTEVWQlFVVXNUMEZCVHl4RFFVRkRMRU5CUVVNN1dVRkRlRVFzVFVGQlRTeGxRVUZsTEVkQlFVY3NUMEZCVHl4SlFVRkpMRVZCUVVVc1EwRkJRenRaUVVWMFF5eExRVUZMTEVOQlFVTXNWVUZCVlN4RFFVRkRMR05CUVdNc1EwRkJReXhSUVVGUkxFTkJRVU1zUlVGQlJTeEZRVUZGTEdWQlFXVXNRMEZCUXl4RFFVRkRPMWxCUXpsRUxFbEJRVWtzUTBGQlF5eHJRa0ZCYTBJc1EwRkJReXhMUVVGTExFVkJRVVVzU1VGQlNTeEZRVUZGTEZGQlFWRXNSVUZCUlN4bFFVRmxMRU5CUVVNc1EwRkJRenRaUVVWb1JTeE5RVUZOTEZWQlFWVXNSMEZCUnl4SlFVRkpMRWxCUVVrc1JVRkJSU3hEUVVGRE8xbEJRemxDTEUxQlFVMHNUVUZCVFN4SFFVRTJRanRuUWtGRGRrTXNUVUZCVFN4RlFVRkZMRkZCUVZFc1EwRkJReXhGUVVGRk8yZENRVU51UWl4TlFVRk5MRVZCUVVVc2IwSkJRVzlDTEVOQlFVTXNVMEZCVXp0blFrRkRkRU1zVFVGQlRUdG5Ra0ZEVGl4UFFVRlBMRVZCUVVVc1pVRkJaVHRuUWtGRGVFSXNVMEZCVXp0blFrRkRWQ3hWUVVGVk8yZENRVU5XTEUxQlFVMHNSVUZCUlN4RlFVRkZPMkZCUTFnc1EwRkJRenRaUVVOR0xFdEJRVXNzUTBGQlF5eG5Ra0ZCWjBJc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF6dFpRVVV2UWl4TlFVRk5MRWxCUVVrc1EwRkJReXhUUVVGVExFTkJRVU1zUzBGQlN5eEZRVUZGTzJkQ1FVTXhRaXhKUVVGSkxFVkJRVVVzZFVKQlFYVkNMRU5CUVVNc1kwRkJZenRuUWtGRE5VTXNTMEZCU3l4RlFVRkZMRXRCUVVzc1EwRkJReXhMUVVGTE8yZENRVU5zUWl4VlFVRlZMRVZCUVVVc1NVRkJTU3hEUVVGRExGVkJRVlU3WjBKQlF6TkNMRTFCUVUwc1JVRkJSU3hSUVVGUkxFTkJRVU1zUlVGQlJUdG5Ra0ZEYmtJc1NVRkJTU3hGUVVGRkxGRkJRVkU3WjBKQlEyUXNUVUZCVFN4RlFVRkZMRzlDUVVGdlFpeERRVUZETEZOQlFWTTdaMEpCUTNSRExFOUJRVThzUlVGQlJTeEZRVUZGTEU5QlFVOHNSVUZCUlN4bFFVRmxMRVZCUVVVN1lVRkRkRU1zUTBGQlF5eERRVUZETzFGQlEwd3NRMEZCUXp0UlFVRkRMRTlCUVU4c1MwRkJTeXhGUVVGRkxFTkJRVU03V1VGRFppeE5RVUZOTEZWQlFWVXNSMEZCUnl4SlFVRkpMRWxCUVVrc1JVRkJSU3hEUVVGRE8xbEJRemxDTEUxQlFVMHNXVUZCV1N4SFFVRkhMRWxCUVVrc1EwRkJReXhqUVVGakxFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTTdXVUZEYUVRc1RVRkJUU3hOUVVGTkxFZEJRVFpDTzJkQ1FVTjJReXhOUVVGTkxFVkJRVVVzVVVGQlVTeERRVUZETEVWQlFVVTdaMEpCUTI1Q0xFMUJRVTBzUlVGQlJTeHZRa0ZCYjBJc1EwRkJReXhOUVVGTk8yZENRVU51UXl4TlFVRk5PMmRDUVVOT0xFdEJRVXNzUlVGQlJTeFpRVUZaTzJkQ1FVTnVRaXhUUVVGVE8yZENRVU5VTEZWQlFWVTdaMEpCUTFZc1RVRkJUU3hGUVVGRkxFVkJRVVU3WVVGRFdDeERRVUZETzFsQlEwWXNTMEZCU3l4RFFVRkRMR2RDUVVGblFpeERRVUZETEUxQlFVMHNRMEZCUXl4RFFVRkRPMWxCUlM5Q0xFMUJRVTBzU1VGQlNTeERRVUZETEZOQlFWTXNRMEZCUXl4TFFVRkxMRVZCUVVVN1owSkJRekZDTEVsQlFVa3NSVUZCUlN4MVFrRkJkVUlzUTBGQlF5eFhRVUZYTzJkQ1FVTjZReXhMUVVGTExFVkJRVVVzUzBGQlN5eERRVUZETEV0QlFVczdaMEpCUTJ4Q0xGVkJRVlVzUlVGQlJTeEpRVUZKTEVOQlFVTXNWVUZCVlR0blFrRkRNMElzVFVGQlRTeEZRVUZGTEZGQlFWRXNRMEZCUXl4RlFVRkZPMmRDUVVOdVFpeEpRVUZKTEVWQlFVVXNVVUZCVVR0blFrRkRaQ3hOUVVGTkxFVkJRVVVzYjBKQlFXOUNMRU5CUVVNc1RVRkJUVHRuUWtGRGJrTXNTMEZCU3l4RlFVRkZMRmxCUVZrN1lVRkRjRUlzUTBGQlF5eERRVUZETzFsQlJVZ3NTVUZCU1N4SlFVRkpMRU5CUVVNc1VVRkJVU3hKUVVGSkxFbEJRVWs3WjBKQlFVVXNUVUZCVFN4TFFVRkxMRU5CUVVNN1VVRkRla01zUTBGQlF6dEpRVU5JTEVOQlFVTTdTVUZGUkRzN1QwRkZSenRKUVVOTExHbENRVUZwUWl4RFFVTjJRaXhMUVVFd1FpeEZRVU14UWl4SlFVRjNRaXhGUVVONFFpeFJRVUZuUXp0UlFVVm9ReXhOUVVGTkxFMUJRVTBzUjBGQmVVSXNSVUZCUlN4RFFVRkRPMUZCUTNoRExFMUJRVTBzVVVGQlVTeEhRVUZITEVsQlFVa3NRMEZCUXl4alFVRmpMRU5CUVVNc1IwRkJSeXhEUVVGRExGRkJRVkVzUTBGQlF5eEZRVUZGTEVOQlFVTXNTVUZCU1N4RlFVRkZMRU5CUVVNN1VVRkROVVFzUzBGQlN5eE5RVUZOTEVsQlFVa3NTVUZCU1N4UlFVRlJMRVZCUVVVc1EwRkJRenRaUVVNMVFpeE5RVUZOTEVOQlFVTXNTVUZCU1N4RFFVRkRMRlZCUVZVc1EwRkJReXhIUVVGSExFdEJRVXNzUTBGQlF5eFZRVUZWTEVOQlFVTXNUMEZCVHl4RFFVTm9SQ3hKUVVGSkxFTkJRVU1zV1VGQldTeEZRVU5xUWl4SlFVRkpMRU5CUVVNc1ZVRkJWU3hEUVVOb1FpeERRVUZETzFGQlEwb3NRMEZCUXp0UlFVTkVMRTlCUVU4c1RVRkJUU3hEUVVGRE8wbEJRMmhDTEVOQlFVTTdTVUZGUkRzN096dFBRVWxITzBsQlEwc3NTMEZCU3l4RFFVRkRMR05CUVdNc1EwRkRNVUlzUzBGQk1FSXNSVUZETVVJc1NVRkJkMElzUlVGRGVFSXNVVUZCWjBNc1JVRkRhRU1zVFVGQk5FSTdVVUZGTlVJc1RVRkJUU3hOUVVGTkxFZEJRVWNzU1VGQlNTeHJRa0ZCYTBJc1JVRkJSU3hEUVVGRE8xRkJRM2hETEVsQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc2IwSkJRVzlDTEVOQlFVTXNVVUZCVVN4RFFVRkRPMWxCUVVVc1QwRkJUeXhUUVVGVExFTkJRVU03VVVGRk4wUXNUVUZCVFN4UFFVRlBMRWRCUVVjc1NVRkJTU3hEUVVGRExHOUNRVUZ2UWl4RlFVRkZMRU5CUVVNN1VVRkROVU1zVFVGQlRTeGxRVUZsTEVkQlFVY3NTVUZCU1N4RFFVRkRMRFpDUVVFMlFpeERRVUZETEV0QlFVc3NSVUZCUlN4SlFVRkpMRVZCUVVVc1VVRkJVU3hEUVVGRExFVkJRVVVzUTBGQlF5eERRVUZETzFGQlEzSkdMRTlCUVU4c1QwRkJUeXhEUVVGRExHVkJRV1VzUTBGRE5VSXNTVUZCU1N4RFFVRkRMRkZCUVZFc1JVRkRZaXhSUVVGUkxFVkJRMUlzVFVGQlRTeEZRVU5PTEdWQlFXVXNRMEZEYUVJc1EwRkJRenRKUVVOS0xFTkJRVU03U1VGRlJEczdPMDlCUjBjN1NVRkRTeXcyUWtGQk5rSXNRMEZEYmtNc1MwRkJNRUlzUlVGRE1VSXNTVUZCZDBJc1JVRkRlRUlzVFVGQll6dFJRVVZrTEUxQlFVMHNUMEZCVHl4SFFVRkhMRWxCUVVrc1EwRkJReXh2UWtGQmIwSXNSVUZCUlN4RFFVRkRPMUZCUXpWRExFMUJRVTBzVjBGQlZ5eEhRVUZITEVsQlFVa3NPRUpCUVRoQ0xFVkJRVVVzUTBGQlF6dFJRVU42UkN4TlFVRk5MRWxCUVVrc1IwRkJSeXhYUVVGWExFTkJRVU1zWlVGQlpTeERRVUZETEVsQlFVa3NSVUZCUlN4TlFVRk5MRU5CUVVNc1EwRkJRenRSUVVOMlJDeE5RVUZOTEZsQlFWa3NSMEZCTWtJc1JVRkJSU3hEUVVGRE8xRkJRMmhFTEV0QlFVc3NUVUZCVFN4SFFVRkhMRWxCUVVrc1NVRkJTU3hGUVVGRkxFTkJRVU03V1VGRGRrSXNUVUZCVFN4SlFVRkpMRWRCUVVjc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eEpRVUZKTEVOQlFVTXNRMEZCUXl4RFFVRkRMRVZCUVVVc1JVRkJSU3hEUVVGRExFTkJRVU1zUTBGQlF5eEZRVUZGTEV0QlFVc3NSMEZCUnl4RFFVRkRMRU5CUVVNN1dVRkRiRVFzU1VGQlNTeEpRVUZKTEVWQlFVVXNRMEZCUXp0blFrRkRWQ3hOUVVGTkxGTkJRVk1zUjBGQlJ5eExRVUZMTEVOQlFVTXNWMEZCVnl4RFFVRkRMRWRCUVVjc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF6dG5Ra0ZETjBNc1RVRkJUU3hOUVVGTkxFZEJRVWNzVTBGQlV5eEZRVUZGTEUxQlFVMHNTVUZCU1N4RlFVRkZMRU5CUVVNN1owSkJRM1pETEUxQlFVMHNWVUZCVlN4SFFVRkhMRWxCUVVrc1EwRkJReXcyUWtGQk5rSXNRMEZCUXl4TFFVRkxMRVZCUVVVc1NVRkJTU3hGUVVGRkxFZEJRVWNzUTBGQlF5eERRVUZETzJkQ1FVTjRSU3haUVVGWkxFTkJRVU1zUjBGQlJ5eERRVUZETEVkQlFVY3NUMEZCVHl4RFFVRkRMR3RDUVVGclFpeERRVU0xUXl4SlFVRkpMRU5CUVVNc1VVRkJVU3hGUVVOaUxFbEJRVWtzUlVGRFNpeE5RVUZOTEVWQlEwNHNWVUZCVlN4RFFVTllMRU5CUVVNN1dVRkRTaXhEUVVGRE8xRkJRMGdzUTBGQlF6dFJRVU5FTEU5QlFVOHNXVUZCV1N4RFFVRkRPMGxCUTNSQ0xFTkJRVU03U1VGRlJEczdUMEZGUnp0SlFVTkxMR3RDUVVGclFpeERRVU40UWl4TFFVRXdRaXhGUVVNeFFpeEpRVUYzUWl4RlFVTjRRaXhSUVVGblF5eEZRVU5vUXl4UFFVRTJRanRSUVVVM1FpeE5RVUZOTEZGQlFWRXNSMEZCUnl4SlFVRkpMRU5CUVVNc1kwRkJZeXhEUVVGRExFZEJRVWNzUTBGQlF5eFJRVUZSTEVOQlFVTXNSVUZCUlN4RFFVRkRMRWxCUVVrc1JVRkJSU3hEUVVGRE8xRkJRelZFTEV0QlFVc3NUVUZCVFN4SlFVRkpMRWxCUVVrc1VVRkJVU3hGUVVGRkxFTkJRVU03V1VGRE5VSXNUVUZCVFN4TFFVRkxMRWRCUVVjc1QwRkJUeXhEUVVGRExFbEJRVWtzUTBGQlF5eFZRVUZWTEVOQlFVTXNRMEZCUXp0WlFVTjJReXhKUVVGSkxFbEJRVWtzUTBGQlF5eFpRVUZaTEV0QlFVc3NkVUpCUVhWQ0xFVkJRVVVzUTBGQlF6dG5Ra0ZEYkVRc1MwRkJTeXhEUVVGRExGVkJRVlVzUTBGQlF5eHBRa0ZCYVVJc1EwRkJReXhKUVVGSkxFTkJRVU1zVlVGQlZTeEZRVUZGTEV0QlFVc3NRMEZCUXl4RFFVRkRPMWxCUXpkRUxFTkJRVU03V1VGRFJDeEpRVUZKTEVOQlFVTXNVMEZCVXl4RFFVRkRMRXRCUVVzc1JVRkJSVHRuUWtGRGNFSXNTVUZCU1N4RlFVRkZMSFZDUVVGMVFpeERRVUZETEdsQ1FVRnBRanRuUWtGREwwTXNTMEZCU3l4RlFVRkZMRXRCUVVzc1EwRkJReXhMUVVGTE8yZENRVU5zUWl4VlFVRlZMRVZCUVVVc1NVRkJTU3hEUVVGRExGVkJRVlU3WjBKQlF6TkNMRTFCUVUwc1JVRkJSU3hKUVVGSkxFTkJRVU1zUlVGQlJUdG5Ra0ZEWml4TlFVRk5MRVZCUVVVc1VVRkJVU3hEUVVGRExFVkJRVVU3WjBKQlEyNUNMRWxCUVVrc1JVRkJSU3hGUVVGRk8yZENRVU5TTEU5QlFVOHNSVUZCUlN4RlFVRkZMRWxCUVVrc1JVRkJSU3hMUVVGTExFVkJRVVU3WVVGRGVrSXNRMEZCUXl4RFFVRkRMRXRCUVVzc1EwRkJReXhIUVVGSExFVkJRVVU3WjBKQlExb3NiVU5CUVcxRE8xbEJRM0pETEVOQlFVTXNRMEZCUXl4RFFVRkRPMUZCUTB3c1EwRkJRenRKUVVOSUxFTkJRVU03U1VGRlJEczdUMEZGUnp0SlFVTkxMRXRCUVVzc1EwRkJReXhUUVVGVExFTkJRM0pDTEV0QlFUQkNMRVZCUXpGQ0xFOUJTME03VVVGRlJDeE5RVUZOTEV0QlFVc3NSMEZCUnl4TFFVRkxMRU5CUVVNc1dVRkJXU3hEUVVGRExFMUJRVTBzUTBGQlF6dFpRVU4wUXl4RlFVRkZMRVZCUVVVc1JVRkJSVHRaUVVOT0xGRkJRVkVzUlVGQlJTeERRVUZETzFsQlExZ3NVMEZCVXl4RlFVRkZMRWxCUVVrc1NVRkJTU3hGUVVGRk8xbEJRM0pDTEVkQlFVY3NUMEZCVHp0VFFVTnRSQ3hEUVVGRExFTkJRVU03VVVGRGFrVXNTMEZCU3l4RFFVRkRMRmRCUVZjc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF6dFJRVU42UWl4TlFVRk5MRWxCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zWlVGQlpTeERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRPMGxCUXpWRExFTkJRVU03U1VGRlJEczdUMEZGUnp0SlFVTkxMRmxCUVZrc1EwRkRiRUlzVDBGQk9FSTdVVUZGT1VJc1QwRkJUenRaUVVOTUxGZEJRVmNzUlVGQlJTeDVRa0ZCZVVJN1dVRkRkRU1zVVVGQlVTeEZRVUZGTEVsQlFVazdXVUZEWkN4alFVRmpMRVZCUVVVc1NVRkJTVHRaUVVOd1FpeGxRVUZsTEVWQlFVVXNTVUZCU1R0WlFVTnlRaXhsUVVGbExFVkJRVVVzU1VGQlNUdFpRVU55UWl4cFFrRkJhVUlzUlVGQlJTeExRVUZMTzFsQlEzaENMRWxCUVVrc1JVRkJSU3hGUVVGRk8xbEJRMUlzVVVGQlVTeEZRVUZGTEVWQlFVVTdXVUZEV2l4SFFVRkhMRWxCUVVrc1EwRkJReXhqUVVGak8xbEJRM1JDTEVkQlFVY3NUMEZCVHp0VFFVTllMRU5CUVVNN1NVRkRTaXhEUVVGRE8wbEJSVVE3TzA5QlJVYzdTVUZEU3l4aFFVRmhPMUZCUTI1Q0xFOUJRVThzUTBGRFRDeFZRVUZWTEVOQlFVTXNUVUZCVFN4RlFVRkZMRlZCUVZVc1JVRkJSU3hGUVVGRk8xbEJRMnBETEdGQlFXRXNTVUZCU1N4RFFVRkRMRWRCUVVjc1JVRkJSU3hKUVVGSkxFbEJRVWtzUTBGQlF5eE5RVUZOTEVWQlFVVXNRMEZCUXl4UlFVRlJMRU5CUVVNc1JVRkJSU3hEUVVGRExFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTXNRMEZCUXl4RlFVRkZMRU5CUTJwRkxFTkJRVU03U1VGRFNpeERRVUZETzBsQlJVUTdPMDlCUlVjN1NVRkRTeXhqUVVGakxFTkJRVU1zUzBGQll6dFJRVU51UXl4SlFVRkpMRXRCUVVzc1dVRkJXU3hMUVVGTExFVkJRVVVzUTBGQlF6dFpRVU16UWl4UFFVRlBPMmRDUVVOTUxFbEJRVWtzUlVGQlJTeExRVUZMTEVOQlFVTXNTVUZCU1R0blFrRkRhRUlzVDBGQlR5eEZRVUZGTEV0QlFVc3NRMEZCUXl4UFFVRlBPMmRDUVVOMFFpeExRVUZMTEVWQlFVVXNTMEZCU3l4RFFVRkRMRXRCUVVzN1owSkJRMnhDTEVsQlFVa3NSVUZEUkN4TFFVRmhMRU5CUVVNc1UwRkJVenR2UWtGRGVFSXNRMEZCUXl4UFFVRlJMRXRCUVdFc1EwRkJReXhKUVVGSkxFdEJRVXNzVVVGQlVUdDNRa0ZEZEVNc1EwRkJReXhEUVVGRExFMUJRVTBzUTBGQlJTeExRVUZoTEVOQlFVTXNTVUZCU1N4RFFVRkRPM2RDUVVNM1FpeERRVUZETEVOQlFVVXNTMEZCWVN4RFFVRkRMRWxCUVVrc1EwRkJRenRoUVVNelFpeERRVUZETzFGQlEwb3NRMEZCUXp0UlFVTkVMRTlCUVU4c1JVRkJSU3hKUVVGSkxFVkJRVVVzWTBGQll5eEZRVUZGTEU5QlFVOHNSVUZCUlN4TlFVRk5MRU5CUVVNc1MwRkJTeXhEUVVGRExFVkJRVVVzUTBGQlF6dEpRVU14UkN4RFFVRkRPME5CUTBZaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SXZLaXBjYmlBcUlFQnRiMlIxYkdVZ2FXNTBaV2R5WVhScGIyNXpMMmR5WVhCb0wyVjRaV04xZEdsdmJpOUhjbUZ3YUVWNFpXTjFkR2x2YmtWdVoybHVaVnh1SUNvZ1FITjFiVzFoY25rZ1VtVm1aWEpsYm1ObElHZHlZWEJvSUdWNFpXTjFkR2x2YmlCbGJtZHBibVV1WEc0Z0tpQkFaR1Z6WTNKcGNIUnBiMjRnUlhobFkzVjBaWE1nWjNKaGNHZ2dkMjl5YTJac2IzZHpJR1JsWTJ4aGNtVmtJSGRwZEdnZ1lFQmtaV05oWmkxMGN5OTFhUzFrWldOdmNtRjBiM0p6TDJkeVlYQm9ZQ3dnWlcxcGRITWdaWFpsYm5SeklIUm9jbTkxWjJnZ1JHVmpZV1luY3lCUFluTmxjblpoWW14bElIQnBjR1ZzYVc1bExDQnpkWEJ3YjNKMGN5QndZWEpoYkd4bGJDQnViMlJsSUdWNFpXTjFkR2x2YmlCM2FYUm9hVzRnZEc5d2IyeHZaMmxqWVd3Z2JHRjVaWEp6TENCaGJtUWdjbVYwZFhKdWN5QmhJR052YlhCc1pYUmxJR1Y0WldOMWRHbHZiaUJ5WlhOMWJIUXVYRzRnS2k5Y2JtbHRjRzl5ZENCMGVYQmxJSHNnVDJKelpYSjJZV0pzWlNCOUlHWnliMjBnWENKQVpHVmpZV1l0ZEhNdlkyOXlaVndpTzF4dWFXMXdiM0owSUhSNWNHVWdleUJIY21Gd2FGZHZjbXRtYkc5M1JHVm1hVzVwZEdsdmJpQjlJR1p5YjIwZ1hDSkFaR1ZqWVdZdGRITXZkV2t0WkdWamIzSmhkRzl5Y3k5bmNtRndhRndpTzF4dVhHNXBiWEJ2Y25RZ2UxeHVJQ0JIVWtGUVNGOUVSVVpCVlV4VVgwTlBUa05WVWxKRlRrTlpMRnh1SUNCSFVrRlFTRjlYVDFKTFJreFBWMTlDVDFWT1JFRlNXU3hjYmlBZ1IzSmhjR2hGZUdWamRYUnBiMjVGZG1WdWRGUjVjR1VzWEc0Z0lFZHlZWEJvUlhobFkzVjBhVzl1VTNSaGRIVnpMRnh1ZlNCbWNtOXRJRndpTGk0dlkyOXVjM1JoYm5SelhDSTdYRzVwYlhCdmNuUWdkSGx3WlNCN1hHNGdJRWR5WVhCb1JYaGxZM1YwYVc5dVJYSnliM0pRWVhsc2IyRmtMRnh1SUNCSGNtRndhRVY0WldOMWRHbHZia1YyWlc1MExGeHVJQ0JIY21Gd2FFVjRaV04xZEdsdmJrOXdkR2x2Ym5Nc1hHNGdJRWR5WVhCb1JYaGxZM1YwYVc5dVVtVnpkV3gwTEZ4dUlDQkhjbUZ3YUVWNFpXTjFkR2x2YmxaaGJIVmxjeXhjYmlBZ1IzSmhjR2hPYjJSbFJYaGxZM1YwYVc5dVVtVnpkV3gwTEZ4dUlDQkhjbUZ3YUZCcGJrNXZaR1ZQY0hScGIyNXpMRnh1SUNCSGNtRndhRlZ1Y0dsdVRtOWtaVTl3ZEdsdmJuTXNYRzRnSUVkeVlYQm9VblZ1U1dRc1hHNTlJR1p5YjIwZ1hDSXVMaTkwZVhCbGMxd2lPMXh1YVcxd2IzSjBJSFI1Y0dVZ2V5QkhjbUZ3YUVWNFpXTjFkR2x2Yms5aWMyVnlkbVZ5SUgwZ1puSnZiU0JjSWk0dUwyVjJaVzUwY3k5SGNtRndhRVY0WldOMWRHbHZiazlpYzJWeWRtVnlYQ0k3WEc1cGJYQnZjblFnZXlCSGNtRndhRVY0WldOMWRHbHZia1YyWlc1MFJXMXBkSFJsY2lCOUlHWnliMjBnWENJdUxpOWxkbVZ1ZEhNdlIzSmhjR2hGZUdWamRYUnBiMjVGZG1WdWRFVnRhWFIwWlhKY0lqdGNibWx0Y0c5eWRDQjdJRWR5WVhCb1JYaGxZM1YwYVc5dVJYWmxiblJHWVdOMGIzSjVJSDBnWm5KdmJTQmNJaTR1TDJWMlpXNTBjeTlIY21Gd2FFVjRaV04xZEdsdmJrVjJaVzUwUm1GamRHOXllVndpTzF4dWFXMXdiM0owSUhSNWNHVWdleUJIY21Gd2FFNXZaR1ZGZUdWamRYUnZjbEpsWjJsemRISjVJSDBnWm5KdmJTQmNJaTR1TDNKbFoybHpkSEo1TDBkeVlYQm9UbTlrWlVWNFpXTjFkRzl5VW1WbmFYTjBjbmxjSWp0Y2JtbHRjRzl5ZENCN0lFZHlZWEJvUlhobFkzVjBhVzl1VUd4aGJtNWxjaUI5SUdaeWIyMGdYQ0l1TGk5d2JHRnVibWx1Wnk5SGNtRndhRVY0WldOMWRHbHZibEJzWVc1dVpYSmNJanRjYm1sdGNHOXlkQ0IwZVhCbElIc2dSM0poY0doRmVHVmpkWFJwYjI1UWJHRnVJSDBnWm5KdmJTQmNJaTR1TDNCc1lXNXVhVzVuTDBkeVlYQm9SWGhsWTNWMGFXOXVVR3hoYmx3aU8xeHVhVzF3YjNKMElIUjVjR1VnZXlCSGNtRndhRVY0WldOMWRHbHZibEJzWVc1T2IyUmxJSDBnWm5KdmJTQmNJaTR1TDNCc1lXNXVhVzVuTDBkeVlYQm9SWGhsWTNWMGFXOXVVR3hoYms1dlpHVmNJanRjYm1sdGNHOXlkQ0IwZVhCbElIc2dSM0poY0doV1lXeDFaVk4wYjNKbFFXUmhjSFJsY2lCOUlHWnliMjBnWENJdUxpOXpkRzl5WlM5SGNtRndhRlpoYkhWbFUzUnZjbVZCWkdGd2RHVnlYQ0k3WEc1cGJYQnZjblFnZXlCSmJrMWxiVzl5ZVVkeVlYQm9WbUZzZFdWVGRHOXlaVUZrWVhCMFpYSWdmU0JtY205dElGd2lMaTR2YzNSdmNtVXZTVzVOWlcxdmNubEhjbUZ3YUZaaGJIVmxVM1J2Y21WQlpHRndkR1Z5WENJN1hHNXBiWEJ2Y25RZ2V5QkhjbUZ3YUZaaGJIVmxVM1J2Y21VZ2ZTQm1jbTl0SUZ3aUxpNHZjM1J2Y21VdlIzSmhjR2hXWVd4MVpWTjBiM0psWENJN1hHNXBiWEJ2Y25RZ2RIbHdaU0I3SUVkeVlYQm9RMkZqYUdWa1ZtRnNkV1VnZlNCbWNtOXRJRndpTGk0dmMzUnZjbVV2UjNKaGNHaERZV05vWldSV1lXeDFaVndpTzF4dWFXMXdiM0owSUhzZ1IzSmhjR2hRYVc1dWFXNW5VMlZ5ZG1salpTQjlJR1p5YjIwZ1hDSXVMaTl3YVc1dWFXNW5MMGR5WVhCb1VHbHVibWx1WjFObGNuWnBZMlZjSWp0Y2JtbHRjRzl5ZENCN0lFZHlZWEJvVUdsdWJtbHVaMUJ2YkdsamVTQjlJR1p5YjIwZ1hDSXVMaTl3YVc1dWFXNW5MMGR5WVhCb1VHbHVibWx1WjFCdmJHbGplVndpTzF4dWFXMXdiM0owSUhzZ1IzSmhjR2hRYVc1dWFXNW5SR1Z3Wlc1a1pXNWplVkpsYzI5c2RtVnlJSDBnWm5KdmJTQmNJaTR1TDNCcGJtNXBibWN2UjNKaGNHaFFhVzV1YVc1blJHVndaVzVrWlc1amVWSmxjMjlzZG1WeVhDSTdYRzVwYlhCdmNuUWdleUJIY21Gd2FFVjRaV04xZEdsdmJrTnZiblJsZUhRZ2ZTQm1jbTl0SUZ3aUxpOUhjbUZ3YUVWNFpXTjFkR2x2YmtOdmJuUmxlSFJjSWp0Y2JtbHRjRzl5ZENCN0lFZHlZWEJvUlhobFkzVjBhVzl1Um5KaGJXVWdmU0JtY205dElGd2lMaTlIY21Gd2FFVjRaV04xZEdsdmJrWnlZVzFsWENJN1hHNXBiWEJ2Y25RZ2V5QmlkV2xzWkVkeVlYQm9SWGhsWTNWMGFXOXVVbVZ6ZFd4MElIMGdabkp2YlNCY0lpNHZSM0poY0doRmVHVmpkWFJwYjI1U1pYTjFiSFJjSWp0Y2JtbHRjRzl5ZENCMGVYQmxJSHNnUTI5a1pWTmhibVJpYjNoRmRtRnNkV0YwYjNJZ2ZTQm1jbTl0SUZ3aUxpOURiMlJsVTJGdVpHSnZlRVYyWVd4MVlYUnZjbHdpTzF4dVhHNHZLaXBjYmlBcUlFTnZibVpwWjNWeVlYUnBiMjRnWm05eUlIUm9aU0I3UUd4cGJtc2dSM0poY0doRmVHVmpkWFJwYjI1RmJtZHBibVY5TGx4dUlDb3ZYRzVsZUhCdmNuUWdhVzUwWlhKbVlXTmxJRWR5WVhCb1JYaGxZM1YwYVc5dVJXNW5hVzVsUTI5dVptbG5JSHRjYmlBZ2NtVm5hWE4wY25rNklFZHlZWEJvVG05a1pVVjRaV04xZEc5eVVtVm5hWE4wY25rN1hHNGdJSEJzWVc1dVpYSS9PaUJIY21Gd2FFVjRaV04xZEdsdmJsQnNZVzV1WlhJN1hHNGdJSFpoYkhWbFUzUnZjbVZCWkdGd2RHVnlQem9nUjNKaGNHaFdZV3gxWlZOMGIzSmxRV1JoY0hSbGNqdGNiaUFnWlhabGJuUkZiV2wwZEdWeVB6b2dSM0poY0doRmVHVmpkWFJwYjI1RmRtVnVkRVZ0YVhSMFpYSTdYRzRnSUdSbFptRjFiSFJQY0hScGIyNXpQem9nVUdGeWRHbGhiRHhIY21Gd2FFVjRaV04xZEdsdmJrOXdkR2x2Ym5NK08xeHVJQ0F2S2lwY2JpQWdJQ29nVDNCMGFXOXVZV3dnY0d4MVoyZGhZbXhsSUdOdlpHVWdjMkZ1WkdKdmVDQmxkbUZzZFdGMGIzSWdabTl5SUdOdlpHVXRZbUZ6WldRZ1kyOXVaR2wwYVc5dWMxeHVJQ0FnS2lBb1JFVkRRVVl0TXpJZ3dxY3lNaTQwS1M0Z1YyaGxiaUJoWW5ObGJuUXNJR052WkdVZ1kyOXVaR2wwYVc5dWN5QjBhSEp2ZDF4dUlDQWdLaUJnUjFKQlVFaGZRMDlFUlY5VFFVNUVRazlZWDA1UFZGOURUMDVHU1VkVlVrVkVZQzRnUkc5M2JuTjBjbVZoYlNCd2NtOXFaV04wY3lBb1pTNW5MaUJCVEVaU1JVUXBYRzRnSUNBcUlITjFjSEJzZVNCMGFHVWdZV04wZFdGc0lGWk5JSE5oYm1SaWIzZ2dhVzF3YkdWdFpXNTBZWFJwYjI0dVhHNGdJQ0FxTDF4dUlDQmpiMlJsVTJGdVpHSnZlRVYyWVd4MVlYUnZjajg2SUVOdlpHVlRZVzVrWW05NFJYWmhiSFZoZEc5eU8xeHVJQ0F2S2lwY2JpQWdJQ29nVDNCMGFXOXVZV3dnWTJGc2JHSmhZMnNnYVc1MmIydGxaQ0JoZENCMGFHVWdaVzVrSUc5bUlHVnVaMmx1WlNCamIyNXpkSEoxWTNScGIyNGdkMmwwYUNCMGFHVmNiaUFnSUNvZ1puVnNiSGt0YVc1cGRHbGhiR2x6WldRZ1pXNW5hVzVsSUdsdWMzUmhibU5sTGlCVmMyVWdkR2hwY3lCMGJ5QnlaV2RwYzNSbGNpQmxlR1ZqZFhSdmNuTWdkR2hoZEZ4dUlDQWdLaUJ1WldWa0lHRWdZbUZqYXkxeVpXWmxjbVZ1WTJVZ2RHOGdkR2hsSUdWdVoybHVaU0FvWlM1bkxpQnNiMjl3SUdWNFpXTjFkRzl5Y3lCMGFHRjBJR1Y0WldOMWRHVmNiaUFnSUNvZ2MzVmlMWGR2Y210bWJHOTNjeUIwYUhKdmRXZG9JSFJvWlNCellXMWxJR1Z1WjJsdVpTa3VYRzRnSUNBcUwxeHVJQ0J2YmtWdVoybHVaVU55WldGMFpXUS9PaUFvWlc1bmFXNWxPaUJIY21Gd2FFVjRaV04xZEdsdmJrVnVaMmx1WlNrZ1BUNGdkbTlwWkR0Y2JuMWNibHh1THlvcVhHNGdLaUJTWldabGNtVnVZMlVnWjNKaGNHZ2daWGhsWTNWMGFXOXVJR1Z1WjJsdVpTNWNiaUFxWEc0Z0tpQkZlR1ZqZFhSbGN5QmhJSHRBYkdsdWF5QkhjbUZ3YUZkdmNtdG1iRzkzUkdWbWFXNXBkR2x2Ym4wZ1luazZYRzRnS2lBeExpQlFiR0Z1Ym1sdVp5QjBhR1VnZDI5eWEyWnNiM2NnYVc1MGJ5QjBiM0J2Ykc5bmFXTmhiQ0JzWVhsbGNuTXVYRzRnS2lBeUxpQlRaV1ZrYVc1bklIZHZjbXRtYkc5M0lHbHVjSFYwY3lCcGJuUnZJSFJvWlNCMllXeDFaU0J6ZEc5eVpTNWNiaUFxSURNdUlFVjRaV04xZEdsdVp5QnViMlJsY3lCc1lYbGxjaTFpZVMxc1lYbGxjaUIzYVhSb0lHTnZibVpwWjNWeVlXSnNaU0JqYjI1amRYSnlaVzVqZVM1Y2JpQXFJRFF1SUZKdmRYUnBibWNnZG1Gc2RXVnpJR0ZzYjI1bklHVmtaMlZ6TGx4dUlDb2dOUzRnUlcxcGRIUnBibWNnYzNSeWRXTjBkWEpsWkNCbGRtVnVkSE1nZEdoeWIzVm5hQ0JFWldOaFppZHpJRTlpYzJWeWRtRmliR1VnY0dsd1pXeHBibVV1WEc0Z0tpQTJMaUJTWlhSMWNtNXBibWNnWVNCamIyMXdiR1YwWlNCN1FHeHBibXNnUjNKaGNHaEZlR1ZqZFhScGIyNVNaWE4xYkhSOUxseHVJQ292WEc1bGVIQnZjblFnWTJ4aGMzTWdSM0poY0doRmVHVmpkWFJwYjI1RmJtZHBibVZjYmlBZ2FXMXdiR1Z0Wlc1MGN5QlBZbk5sY25aaFlteGxQRnRIY21Gd2FFVjRaV04xZEdsdmJrOWljMlZ5ZG1WeVhTd2dXMGR5WVhCb1JYaGxZM1YwYVc5dVJYWmxiblJkUGlCN1hHNGdJSEJ5YVhaaGRHVWdjbVZoWkc5dWJIa2daVzFwZEhSbGNqb2dSM0poY0doRmVHVmpkWFJwYjI1RmRtVnVkRVZ0YVhSMFpYSTdYRzRnSUhCeWFYWmhkR1VnY21WaFpHOXViSGtnY0d4aGJtNWxjam9nUjNKaGNHaEZlR1ZqZFhScGIyNVFiR0Z1Ym1WeU8xeHVJQ0J3Y21sMllYUmxJSEpsWVdSdmJteDVJSFpoYkhWbFUzUnZjbVZCWkdGd2RHVnlPaUJIY21Gd2FGWmhiSFZsVTNSdmNtVkJaR0Z3ZEdWeU8xeHVJQ0J3Y21sMllYUmxJSEpsWVdSdmJteDVJR1JsWm1GMWJIUlBjSFJwYjI1ek9pQlFZWEowYVdGc1BFZHlZWEJvUlhobFkzVjBhVzl1VDNCMGFXOXVjejQ3WEc0Z0lDOHFLaUJRYkhWbloyRmliR1VnWTI5a1pTQnpZVzVrWW05NElHVjJZV3gxWVhSdmNpQW93cWN5TWk0MEtUc2diV0Y1SUdKbElIVnVaR1ZtYVc1bFpDNGdLaTljYmlBZ2NtVmhaRzl1YkhrZ1kyOWtaVk5oYm1SaWIzaEZkbUZzZFdGMGIzSS9PaUJEYjJSbFUyRnVaR0p2ZUVWMllXeDFZWFJ2Y2p0Y2JseHVJQ0JqYjI1emRISjFZM1J2Y2loamIyNW1hV2M2SUVkeVlYQm9SWGhsWTNWMGFXOXVSVzVuYVc1bFEyOXVabWxuS1NCN1hHNGdJQ0FnZEdocGN5NWxiV2wwZEdWeUlEMGdZMjl1Wm1sbkxtVjJaVzUwUlcxcGRIUmxjaUEvUHlCdVpYY2dSM0poY0doRmVHVmpkWFJwYjI1RmRtVnVkRVZ0YVhSMFpYSW9LVHRjYmlBZ0lDQjBhR2x6TG5Cc1lXNXVaWElnUFNCamIyNW1hV2N1Y0d4aGJtNWxjaUEvUHlCdVpYY2dSM0poY0doRmVHVmpkWFJwYjI1UWJHRnVibVZ5S0NrN1hHNGdJQ0FnZEdocGN5NTJZV3gxWlZOMGIzSmxRV1JoY0hSbGNpQTlYRzRnSUNBZ0lDQmpiMjVtYVdjdWRtRnNkV1ZUZEc5eVpVRmtZWEIwWlhJZ1B6OGdibVYzSUVsdVRXVnRiM0o1UjNKaGNHaFdZV3gxWlZOMGIzSmxRV1JoY0hSbGNpZ3BPMXh1SUNBZ0lIUm9hWE11WkdWbVlYVnNkRTl3ZEdsdmJuTWdQU0JqYjI1bWFXY3VaR1ZtWVhWc2RFOXdkR2x2Ym5NZ1B6OGdlMzA3WEc0Z0lDQWdkR2hwY3k1amIyUmxVMkZ1WkdKdmVFVjJZV3gxWVhSdmNpQTlJR052Ym1acFp5NWpiMlJsVTJGdVpHSnZlRVYyWVd4MVlYUnZjanRjYmlBZ0lDQjBhR2x6TG1OdmJtWnBaeUE5SUdOdmJtWnBaenRjYmlBZ0lDQmpiMjVtYVdjdWIyNUZibWRwYm1WRGNtVmhkR1ZrUHk0b2RHaHBjeWs3WEc0Z0lIMWNibHh1SUNCd2NtbDJZWFJsSUhKbFlXUnZibXg1SUdOdmJtWnBaem9nUjNKaGNHaEZlR1ZqZFhScGIyNUZibWRwYm1WRGIyNW1hV2M3WEc1Y2JpQWdiMkp6WlhKMlpTaHZZbk5sY25abGNqb2dSM0poY0doRmVHVmpkWFJwYjI1UFluTmxjblpsY2lrNklDZ3BJRDArSUhadmFXUWdlMXh1SUNBZ0lISmxkSFZ5YmlCMGFHbHpMbVZ0YVhSMFpYSXViMkp6WlhKMlpTaHZZbk5sY25abGNpazdYRzRnSUgxY2JseHVJQ0IxYms5aWMyVnlkbVVvYjJKelpYSjJaWEk2SUVkeVlYQm9SWGhsWTNWMGFXOXVUMkp6WlhKMlpYSXBPaUIyYjJsa0lIdGNiaUFnSUNCMGFHbHpMbVZ0YVhSMFpYSXVkVzVQWW5ObGNuWmxLRzlpYzJWeWRtVnlLVHRjYmlBZ2ZWeHVYRzRnSUdGemVXNWpJSFZ3WkdGMFpVOWljMlZ5ZG1WeWN5aGxkbVZ1ZERvZ1IzSmhjR2hGZUdWamRYUnBiMjVGZG1WdWRDazZJRkJ5YjIxcGMyVThkbTlwWkQ0Z2UxeHVJQ0FnSUdGM1lXbDBJSFJvYVhNdVpXMXBkSFJsY2k1MWNHUmhkR1ZQWW5ObGNuWmxjbk1vWlhabGJuUXBPMXh1SUNCOVhHNWNiaUFnTHlvcVhHNGdJQ0FxSUVWNFpXTjFkR1Z6SUdFZ2QyOXlhMlpzYjNjZ2QybDBhQ0IwYUdVZ1oybDJaVzRnYVc1d2RYUnpJR0Z1WkNCdmNIUnBiMjV6TGx4dUlDQWdLaTljYmlBZ1lYTjVibU1nWlhobFkzVjBaU2hjYmlBZ0lDQjNiM0pyWm14dmR6b2dSM0poY0doWGIzSnJabXh2ZDBSbFptbHVhWFJwYjI0c1hHNGdJQ0FnYVc1d2RYUnpPaUJIY21Gd2FFVjRaV04xZEdsdmJsWmhiSFZsY3lBOUlIdDlMRnh1SUNBZ0lHOXdkR2x2Ym5NNklFZHlZWEJvUlhobFkzVjBhVzl1VDNCMGFXOXVjeUE5SUh0OVhHNGdJQ2s2SUZCeWIyMXBjMlU4UjNKaGNHaEZlR1ZqZFhScGIyNVNaWE4xYkhRK0lIdGNiaUFnSUNCamIyNXpkQ0J2Y0hSeklEMGdkR2hwY3k1dFpYSm5aVTl3ZEdsdmJuTW9iM0IwYVc5dWN5azdYRzRnSUNBZ1kyOXVjM1FnY25WdVNXUWdQU0J2Y0hSekxuSjFia2xrSUQ4L0lIUm9hWE11WjJWdVpYSmhkR1ZTZFc1SlpDZ3BPMXh1SUNBZ0lHTnZibk4wSUhCaGRHZ2dQU0J2Y0hSekxuQmhkR2dnUHo4Z1cxMDdYRzRnSUNBZ1kyOXVjM1FnWlhabGJuUkdZV04wYjNKNUlEMGdibVYzSUVkeVlYQm9SWGhsWTNWMGFXOXVSWFpsYm5SR1lXTjBiM0o1S0NrN1hHNGdJQ0FnWTI5dWMzUWdkbUZzZFdWVGRHOXlaU0E5SUc1bGR5QkhjbUZ3YUZaaGJIVmxVM1J2Y21Vb2RHaHBjeTUyWVd4MVpWTjBiM0psUVdSaGNIUmxjaWs3WEc0Z0lDQWdkbUZzZFdWVGRHOXlaUzV6WldWa1YyOXlhMlpzYjNkSmJuQjFkSE1vYVc1d2RYUnpLVHRjYmx4dUlDQWdJR052Ym5OMElIQnNZVzRnUFNCMGFHbHpMbkJzWVc1dVpYSXVjR3hoYmloM2IzSnJabXh2ZHlrN1hHNGdJQ0FnWTI5dWMzUWdabkpoYldVZ1BTQnVaWGNnUjNKaGNHaEZlR1ZqZFhScGIyNUdjbUZ0WlNoY2JpQWdJQ0FnSUhKMWJrbGtMRnh1SUNBZ0lDQWdjR3hoYml4Y2JpQWdJQ0FnSUhaaGJIVmxVM1J2Y21Vc1hHNGdJQ0FnSUNCbGRtVnVkRVpoWTNSdmNubGNiaUFnSUNBcE8xeHVYRzRnSUNBZ1kyOXVjM1FnWlcxcGRFWnVJRDBnWVhONWJtTWdLSEJoY25ScFlXdzZJRkJoY25ScFlXdzhSM0poY0doRmVHVmpkWFJwYjI1RmRtVnVkRDRwSUQwK0lIdGNiaUFnSUNBZ0lHRjNZV2wwSUhSb2FYTXVaVzFwZEVWMlpXNTBLR1p5WVcxbExDQjdYRzRnSUNBZ0lDQWdJSFI1Y0dVNklIQmhjblJwWVd3dWRIbHdaU0EvUHlCSGNtRndhRVY0WldOMWRHbHZia1YyWlc1MFZIbHdaUzVPVDBSRlgwOVZWRkJWVkN4Y2JpQWdJQ0FnSUNBZ2NuVnVTV1FzWEc0Z0lDQWdJQ0FnSUhCaGNtVnVkRkoxYmtsa09pQnZjSFJ6TG5CaGNtVnVkRkoxYmtsa0xGeHVJQ0FnSUNBZ0lDQjNiM0pyWm14dmQwbGtPaUIzYjNKclpteHZkeTV1WVcxbExGeHVJQ0FnSUNBZ0lDQnViMlJsU1dRNklIQmhjblJwWVd3dWJtOWtaVWxrTEZ4dUlDQWdJQ0FnSUNCd1lYUm9PaUJ3WVhKMGFXRnNMbkJoZEdnZ1B6OGdjR0YwYUN4Y2JpQWdJQ0FnSUNBZ0xpNHVjR0Z5ZEdsaGJDeGNiaUFnSUNBZ0lIMHBPMXh1SUNBZ0lIMDdYRzVjYmlBZ0lDQmhkMkZwZENCMGFHbHpMbVZ0YVhSRmRtVnVkQ2htY21GdFpTd2dlMXh1SUNBZ0lDQWdkSGx3WlRvZ1IzSmhjR2hGZUdWamRYUnBiMjVGZG1WdWRGUjVjR1V1VjA5U1MwWk1UMWRmVTFSQlVsUkZSQ3hjYmlBZ0lDQWdJSEoxYmtsa0xGeHVJQ0FnSUNBZ2NHRnlaVzUwVW5WdVNXUTZJRzl3ZEhNdWNHRnlaVzUwVW5WdVNXUXNYRzRnSUNBZ0lDQjNiM0pyWm14dmQwbGtPaUIzYjNKclpteHZkeTV1WVcxbExGeHVJQ0FnSUNBZ2NHRjBhQ3hjYmlBZ0lDQWdJSE4wWVhSMWN6b2dSM0poY0doRmVHVmpkWFJwYjI1VGRHRjBkWE11VWxWT1RrbE9SeXhjYmlBZ0lDQWdJSEJoZVd4dllXUTZJSHNnYVc1d2RYUnpJSDBzWEc0Z0lDQWdmU2s3WEc1Y2JpQWdJQ0JoZDJGcGRDQjBhR2x6TG1WdGFYUkZkbVZ1ZENobWNtRnRaU3dnZTF4dUlDQWdJQ0FnZEhsd1pUb2dSM0poY0doRmVHVmpkWFJwYjI1RmRtVnVkRlI1Y0dVdVYwOVNTMFpNVDFkZlVFeEJUazVGUkN4Y2JpQWdJQ0FnSUhKMWJrbGtMRnh1SUNBZ0lDQWdjR0Z5Wlc1MFVuVnVTV1E2SUc5d2RITXVjR0Z5Wlc1MFVuVnVTV1FzWEc0Z0lDQWdJQ0IzYjNKclpteHZkMGxrT2lCM2IzSnJabXh2ZHk1dVlXMWxMRnh1SUNBZ0lDQWdjR0YwYUN4Y2JpQWdJQ0FnSUhOMFlYUjFjem9nUjNKaGNHaEZlR1ZqZFhScGIyNVRkR0YwZFhNdVVFeEJUazVKVGtjc1hHNGdJQ0FnSUNCd1lYbHNiMkZrT2lCN0lHeGhlV1Z5Y3pvZ2NHeGhiaTVzWVhsbGNuTXViR1Z1WjNSb0xDQnViMlJsY3pvZ2NHeGhiaTV1YjJSbGN5NXNaVzVuZEdnZ2ZTeGNiaUFnSUNCOUtUdGNibHh1SUNBZ0lIUnllU0I3WEc0Z0lDQWdJQ0JtYjNJZ0tHTnZibk4wSUd4aGVXVnlJRzltSUhCc1lXNHViR0Y1WlhKektTQjdYRzRnSUNBZ0lDQWdJR0YzWVdsMElIUm9hWE11WlhobFkzVjBaVXhoZVdWeUtHWnlZVzFsTENCd2JHRnVMQ0JzWVhsbGNpNXViMlJsY3l3Z2IzQjBjeXdnWlcxcGRFWnVLVHRjYmlBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnWm5KaGJXVXVabWx1YVhOb0tDazdYRzVjYmlBZ0lDQWdJR0YzWVdsMElIUm9hWE11WlcxcGRFVjJaVzUwS0daeVlXMWxMQ0I3WEc0Z0lDQWdJQ0FnSUhSNWNHVTZJRWR5WVhCb1JYaGxZM1YwYVc5dVJYWmxiblJVZVhCbExsZFBVa3RHVEU5WFgwTlBUVkJNUlZSRlJDeGNiaUFnSUNBZ0lDQWdjblZ1U1dRc1hHNGdJQ0FnSUNBZ0lIQmhjbVZ1ZEZKMWJrbGtPaUJ2Y0hSekxuQmhjbVZ1ZEZKMWJrbGtMRnh1SUNBZ0lDQWdJQ0IzYjNKclpteHZkMGxrT2lCM2IzSnJabXh2ZHk1dVlXMWxMRnh1SUNBZ0lDQWdJQ0J3WVhSb0xGeHVJQ0FnSUNBZ0lDQnpkR0YwZFhNNklFZHlZWEJvUlhobFkzVjBhVzl1VTNSaGRIVnpMbE5WUTBORlJVUkZSQ3hjYmlBZ0lDQWdJQ0FnY0dGNWJHOWhaRG9nZXlCdmRYUndkWFJ6T2lCMllXeDFaVk4wYjNKbExtZGxkRmR2Y210bWJHOTNWbUZzZFdWektDa2dmU3hjYmlBZ0lDQWdJSDBwTzF4dVhHNGdJQ0FnSUNCeVpYUjFjbTRnWW5WcGJHUkhjbUZ3YUVWNFpXTjFkR2x2YmxKbGMzVnNkQ2hjYmlBZ0lDQWdJQ0FnWm5KaGJXVXNYRzRnSUNBZ0lDQWdJSGR2Y210bWJHOTNMRnh1SUNBZ0lDQWdJQ0JwYm5CMWRITXNYRzRnSUNBZ0lDQWdJRWR5WVhCb1JYaGxZM1YwYVc5dVUzUmhkSFZ6TGxOVlEwTkZSVVJGUkN4Y2JpQWdJQ0FnSUNBZ2IzQjBjeTV0WlhSaFpHRjBZVnh1SUNBZ0lDQWdLVHRjYmlBZ0lDQjlJR05oZEdOb0lDaGxjbkp2Y2lrZ2UxeHVJQ0FnSUNBZ1puSmhiV1V1Wm1sdWFYTm9LQ2s3WEc0Z0lDQWdJQ0JqYjI1emRDQmxjbkp2Y2xCaGVXeHZZV1FnUFNCMGFHbHpMblJ2UlhKeWIzSlFZWGxzYjJGa0tHVnljbTl5S1R0Y2JseHVJQ0FnSUNBZ1lYZGhhWFFnZEdocGN5NWxiV2wwUlhabGJuUW9abkpoYldVc0lIdGNiaUFnSUNBZ0lDQWdkSGx3WlRvZ1IzSmhjR2hGZUdWamRYUnBiMjVGZG1WdWRGUjVjR1V1VjA5U1MwWk1UMWRmUmtGSlRFVkVMRnh1SUNBZ0lDQWdJQ0J5ZFc1SlpDeGNiaUFnSUNBZ0lDQWdjR0Z5Wlc1MFVuVnVTV1E2SUc5d2RITXVjR0Z5Wlc1MFVuVnVTV1FzWEc0Z0lDQWdJQ0FnSUhkdmNtdG1iRzkzU1dRNklIZHZjbXRtYkc5M0xtNWhiV1VzWEc0Z0lDQWdJQ0FnSUhCaGRHZ3NYRzRnSUNBZ0lDQWdJSE4wWVhSMWN6b2dSM0poY0doRmVHVmpkWFJwYjI1VGRHRjBkWE11UmtGSlRFVkVMRnh1SUNBZ0lDQWdJQ0JsY25KdmNqb2daWEp5YjNKUVlYbHNiMkZrTEZ4dUlDQWdJQ0FnZlNrN1hHNWNiaUFnSUNBZ0lISmxkSFZ5YmlCaWRXbHNaRWR5WVhCb1JYaGxZM1YwYVc5dVVtVnpkV3gwS0Z4dUlDQWdJQ0FnSUNCbWNtRnRaU3hjYmlBZ0lDQWdJQ0FnZDI5eWEyWnNiM2NzWEc0Z0lDQWdJQ0FnSUdsdWNIVjBjeXhjYmlBZ0lDQWdJQ0FnUjNKaGNHaEZlR1ZqZFhScGIyNVRkR0YwZFhNdVJrRkpURVZFTEZ4dUlDQWdJQ0FnSUNCdmNIUnpMbTFsZEdGa1lYUmhYRzRnSUNBZ0lDQXBPMXh1SUNBZ0lIMWNiaUFnZlZ4dVhHNGdJQzhxS2x4dUlDQWdLaUJRYVc1eklHRWdibTlrWlNCaGJtUWdhWFJ6SUhWd2MzUnlaV0Z0SUdSbGNHVnVaR1Z1WTJsbGN5QmhablJsY2lCaElHTnZiWEJzWlhSbFpDQnlkVzR1WEc0Z0lDQXFYRzRnSUNBcUlFUmxiR1ZuWVhSbGN5QjBieUI3UUd4cGJtc2dSM0poY0doUWFXNXVhVzVuVTJWeWRtbGpaWDB1SUZSb1pTQndiR0Z1SUdGdVpDQnlaWE4xYkhRZ2JYVnpkQ0JqYjIxbFhHNGdJQ0FxSUdaeWIyMGdZU0J3Y21sdmNpQnpkV05qWlhOelpuVnNJR1Y0WldOMWRHbHZiaUJ2WmlCMGFHVWdjMkZ0WlNCM2IzSnJabXh2ZHk1Y2JpQWdJQ292WEc0Z0lHRnplVzVqSUhCcGJrNXZaR1VvYjNCMGFXOXVjem9nUjNKaGNHaFFhVzVPYjJSbFQzQjBhVzl1Y3lrNklGQnliMjFwYzJVOGRtOXBaRDRnZTF4dUlDQWdJR052Ym5OMElITmxjblpwWTJVZ1BTQjBhR2x6TG1OeVpXRjBaVkJwYm01cGJtZFRaWEoyYVdObEtDazdYRzRnSUNBZ1lYZGhhWFFnYzJWeWRtbGpaUzV3YVc1T2IyUmxLRzl3ZEdsdmJuTXBPMXh1SUNBZ0lHRjNZV2wwSUhSb2FYTXVaVzFwZEZCcGJtNXBibWRGZG1WdWRDaHZjSFJwYjI1ekxtNXZaR1ZKWkN3Z1IzSmhjR2hGZUdWamRYUnBiMjVGZG1WdWRGUjVjR1V1VGs5RVJWOVFTVTVPUlVRcE8xeHVJQ0I5WEc1Y2JpQWdMeW9xWEc0Z0lDQXFJRlZ1Y0dsdWN5QmhJRzV2WkdVZ1lua2dhWFJ6SUdacGJtZGxjbkJ5YVc1MExseHVJQ0FnS2k5Y2JpQWdZWE41Ym1NZ2RXNXdhVzVPYjJSbEtHOXdkR2x2Ym5NNklFZHlZWEJvVlc1d2FXNU9iMlJsVDNCMGFXOXVjeWs2SUZCeWIyMXBjMlU4ZG05cFpENGdlMXh1SUNBZ0lHTnZibk4wSUhObGNuWnBZMlVnUFNCMGFHbHpMbU55WldGMFpWQnBibTVwYm1kVFpYSjJhV05sS0NrN1hHNGdJQ0FnWVhkaGFYUWdjMlZ5ZG1salpTNTFibkJwYms1dlpHVW9iM0IwYVc5dWN5azdYRzRnSUNBZ1lYZGhhWFFnZEdocGN5NWxiV2wwVUdsdWJtbHVaMFYyWlc1MEtHOXdkR2x2Ym5NdWJtOWtaVWxrTENCSGNtRndhRVY0WldOMWRHbHZia1YyWlc1MFZIbHdaUzVPVDBSRlgxVk9VRWxPVGtWRUtUdGNiaUFnZlZ4dVhHNGdJQzhxS2x4dUlDQWdLaUJEY21WaGRHVnpJR0VnZTBCc2FXNXJJRWR5WVhCb1VHbHVibWx1WjFObGNuWnBZMlY5SUdKaFkydGxaQ0JpZVNCMGFHbHpJR1Z1WjJsdVpTZHpJSFpoYkhWbElITjBiM0psWEc0Z0lDQXFJR0ZrWVhCMFpYSXVYRzRnSUNBcUwxeHVJQ0J3Y21sMllYUmxJR055WldGMFpWQnBibTVwYm1kVFpYSjJhV05sS0NrNklFZHlZWEJvVUdsdWJtbHVaMU5sY25acFkyVWdlMXh1SUNBZ0lHTnZibk4wSUhOMGIzSmxJRDBnYm1WM0lFZHlZWEJvVm1Gc2RXVlRkRzl5WlNoMGFHbHpMblpoYkhWbFUzUnZjbVZCWkdGd2RHVnlLVHRjYmlBZ0lDQnlaWFIxY200Z2JtVjNJRWR5WVhCb1VHbHVibWx1WjFObGNuWnBZMlVvWEc0Z0lDQWdJQ0J6ZEc5eVpTeGNiaUFnSUNBZ0lHNWxkeUJIY21Gd2FGQnBibTVwYm1kUWIyeHBZM2tvS1N4Y2JpQWdJQ0FnSUc1bGR5QkhjbUZ3YUZCcGJtNXBibWRFWlhCbGJtUmxibU41VW1WemIyeDJaWElvS1Z4dUlDQWdJQ2s3WEc0Z0lIMWNibHh1SUNBdktpcGNiaUFnSUNvZ1JXMXBkSE1nWVNCd2FXNXVhVzVuTFhKbGJHRjBaV1FnWlhabGJuUWdkRzhnWVd4c0lHOWljMlZ5ZG1WeWN5NWNiaUFnSUNvdlhHNGdJSEJ5YVhaaGRHVWdZWE41Ym1NZ1pXMXBkRkJwYm01cGJtZEZkbVZ1ZENoY2JpQWdJQ0J1YjJSbFNXUTZJSE4wY21sdVp5eGNiaUFnSUNCMGVYQmxPaUJIY21Gd2FFVjRaV04xZEdsdmJrVjJaVzUwVkhsd1pWeHVJQ0FwT2lCUWNtOXRhWE5sUEhadmFXUStJSHRjYmlBZ0lDQmpiMjV6ZENCbVlXTjBiM0o1SUQwZ2JtVjNJRWR5WVhCb1JYaGxZM1YwYVc5dVJYWmxiblJHWVdOMGIzSjVLQ2s3WEc0Z0lDQWdZMjl1YzNRZ1pYWmxiblFnUFNCbVlXTjBiM0o1TG1OeVpXRjBaU2g3WEc0Z0lDQWdJQ0JwWkRvZ1hDSmNJaXhjYmlBZ0lDQWdJSE5sY1hWbGJtTmxPaUF3TEZ4dUlDQWdJQ0FnZEdsdFpYTjBZVzF3T2lCdVpYY2dSR0YwWlNncExGeHVJQ0FnSUNBZ2NuVnVTV1E2SUZ3aWNHbHVibWx1WjF3aUxGeHVJQ0FnSUNBZ2QyOXlhMlpzYjNkSlpEb2dYQ0pjSWl4Y2JpQWdJQ0FnSUhSNWNHVXNYRzRnSUNBZ0lDQnViMlJsU1dRc1hHNGdJQ0FnSUNCd1lYUm9PaUJiWFN4Y2JpQWdJQ0I5SUdGeklFOXRhWFE4UjNKaGNHaEZlR1ZqZFhScGIyNUZkbVZ1ZEN3Z1hDSnBaRndpSUh3Z1hDSnpaWEYxWlc1alpWd2lJSHdnWENKMGFXMWxjM1JoYlhCY0lqNHBPMXh1SUNBZ0lHRjNZV2wwSUhSb2FYTXVaVzFwZEhSbGNpNTFjR1JoZEdWUFluTmxjblpsY25Nb1pYWmxiblFwTzF4dUlDQjlYRzVjYmlBZ0x5b3FYRzRnSUNBcUlFVjRaV04xZEdWeklHRWdiR0Y1WlhJZ2IyWWdibTlrWlhNZ2QybDBhQ0IwYUdVZ1kyOXVabWxuZFhKbFpDQmpiMjVqZFhKeVpXNWplUzVjYmlBZ0lDb3ZYRzRnSUhCeWFYWmhkR1VnWVhONWJtTWdaWGhsWTNWMFpVeGhlV1Z5S0Z4dUlDQWdJR1p5WVcxbE9pQkhjbUZ3YUVWNFpXTjFkR2x2YmtaeVlXMWxMRnh1SUNBZ0lIQnNZVzQ2SUVkeVlYQm9SWGhsWTNWMGFXOXVVR3hoYml4Y2JpQWdJQ0J1YjJSbGN6b2dSM0poY0doRmVHVmpkWFJwYjI1UWJHRnVUbTlrWlZ0ZExGeHVJQ0FnSUc5d2RITTZJRWR5WVhCb1JYaGxZM1YwYVc5dVQzQjBhVzl1Y3l4Y2JpQWdJQ0JsYldsMFJtNDZJQ2hsZG1WdWREb2dVR0Z5ZEdsaGJEeEhjbUZ3YUVWNFpXTjFkR2x2YmtWMlpXNTBQaWtnUFQ0Z1VISnZiV2x6WlR4MmIybGtQbHh1SUNBcE9pQlFjbTl0YVhObFBIWnZhV1ErSUh0Y2JpQWdJQ0JqYjI1emRDQmpiMjVqZFhKeVpXNWplU0E5SUUxaGRHZ3ViV0Y0S0Z4dUlDQWdJQ0FnTVN4Y2JpQWdJQ0FnSUc5d2RITXVZMjl1WTNWeWNtVnVZM2tnUHo4Z1IxSkJVRWhmUkVWR1FWVk1WRjlEVDA1RFZWSlNSVTVEV1Z4dUlDQWdJQ2s3WEc0Z0lDQWdZMjl1YzNRZ2NYVmxkV1VnUFNCYkxpNHVibTlrWlhOZE8xeHVYRzRnSUNBZ2QyaHBiR1VnS0hGMVpYVmxMbXhsYm1kMGFDQStJREFwSUh0Y2JpQWdJQ0FnSUdOdmJuTjBJR0poZEdOb0lEMGdjWFZsZFdVdWMzQnNhV05sS0RBc0lHTnZibU4xY25KbGJtTjVLVHRjYmlBZ0lDQWdJR0YzWVdsMElGQnliMjFwYzJVdVlXeHNLRnh1SUNBZ0lDQWdJQ0JpWVhSamFDNXRZWEFvS0c1dlpHVXBJRDArSUhSb2FYTXVaWGhsWTNWMFpVNXZaR1VvWm5KaGJXVXNJSEJzWVc0c0lHNXZaR1VzSUc5d2RITXNJR1Z0YVhSR2Jpa3BYRzRnSUNBZ0lDQXBPMXh1SUNBZ0lIMWNiaUFnZlZ4dVhHNGdJQzhxS2x4dUlDQWdLaUJGZUdWamRYUmxjeUJoSUhOcGJtZHNaU0J1YjJSbExseHVJQ0FnS2k5Y2JpQWdjSEpwZG1GMFpTQmhjM2x1WXlCbGVHVmpkWFJsVG05a1pTaGNiaUFnSUNCbWNtRnRaVG9nUjNKaGNHaEZlR1ZqZFhScGIyNUdjbUZ0WlN4Y2JpQWdJQ0J3YkdGdU9pQkhjbUZ3YUVWNFpXTjFkR2x2YmxCc1lXNHNYRzRnSUNBZ2NHeGhiazV2WkdVNklFZHlZWEJvUlhobFkzVjBhVzl1VUd4aGJrNXZaR1VzWEc0Z0lDQWdiM0IwY3pvZ1IzSmhjR2hGZUdWamRYUnBiMjVQY0hScGIyNXpMRnh1SUNBZ0lHVnRhWFJHYmpvZ0tHVjJaVzUwT2lCUVlYSjBhV0ZzUEVkeVlYQm9SWGhsWTNWMGFXOXVSWFpsYm5RK0tTQTlQaUJRY205dGFYTmxQSFp2YVdRK1hHNGdJQ2s2SUZCeWIyMXBjMlU4ZG05cFpENGdlMXh1SUNBZ0lHTnZibk4wSUhOMFlYSjBaV1JCZENBOUlHNWxkeUJFWVhSbEtDazdYRzRnSUNBZ1kyOXVjM1FnYm05a1pWQmhkR2dnUFNCYkxpNHVLRzl3ZEhNdWNHRjBhQ0EvUHlCYlhTa3NJSEJzWVc1T2IyUmxMbWxrWFR0Y2JseHVJQ0FnSUdGM1lXbDBJSFJvYVhNdVpXMXBkRVYyWlc1MEtHWnlZVzFsTENCN1hHNGdJQ0FnSUNCMGVYQmxPaUJIY21Gd2FFVjRaV04xZEdsdmJrVjJaVzUwVkhsd1pTNU9UMFJGWDFOVVFWSlVSVVFzWEc0Z0lDQWdJQ0J5ZFc1SlpEb2dabkpoYldVdWNuVnVTV1FzWEc0Z0lDQWdJQ0IzYjNKclpteHZkMGxrT2lCd2JHRnVMbmR2Y210bWJHOTNTV1FzWEc0Z0lDQWdJQ0J1YjJSbFNXUTZJSEJzWVc1T2IyUmxMbWxrTEZ4dUlDQWdJQ0FnY0dGMGFEb2dibTlrWlZCaGRHZ3NYRzRnSUNBZ0lDQnpkR0YwZFhNNklFZHlZWEJvUlhobFkzVjBhVzl1VTNSaGRIVnpMbEpWVGs1SlRrY3NYRzRnSUNBZ2ZTazdYRzVjYmlBZ0lDQmpiMjV6ZENCcGJuQjFkSE1nUFNCMGFHbHpMbkpsYzI5c2RtVk9iMlJsU1c1d2RYUnpLR1p5WVcxbExDQndiR0Z1TENCd2JHRnVUbTlrWlNrN1hHNWNiaUFnSUNBdkx5QkRZV05vWlMxb2FYUTZJR05vWldOcklHWnZjaUJoSUhCcGJtNWxaQ0IyWVd4MVpTQmlaV1p2Y21VZ1pYaGxZM1YwYVc1bklIUm9aU0J1YjJSbFhHNGdJQ0FnYVdZZ0tHOXdkSE11ZFhObFVHbHVibVZrVm1Gc2RXVnpLU0I3WEc0Z0lDQWdJQ0JqYjI1emRDQmpZV05vWldRZ1BTQmhkMkZwZENCMGFHbHpMblJ5ZVZCcGJtNWxaRlpoYkhWbEtHWnlZVzFsTENCd2JHRnVMQ0J3YkdGdVRtOWtaU3dnYVc1d2RYUnpLVHRjYmlBZ0lDQWdJR2xtSUNoallXTm9aV1FwSUh0Y2JpQWdJQ0FnSUNBZ1puSmhiV1V1ZG1Gc2RXVlRkRzl5WlM1elpYUk9iMlJsVDNWMGNIVjBjeWh3YkdGdVRtOWtaUzVwWkN3Z1kyRmphR1ZrTG05MWRIQjFkSE1wTzF4dUlDQWdJQ0FnSUNCMGFHbHpMbkp2ZFhSbFQzVjBaMjlwYm1kRlpHZGxjeWhtY21GdFpTd2djR3hoYml3Z2NHeGhiazV2WkdVc0lHTmhZMmhsWkM1dmRYUndkWFJ6S1R0Y2JseHVJQ0FnSUNBZ0lDQmpiMjV6ZENCbWFXNXBjMmhsWkVGMElEMGdibVYzSUVSaGRHVW9LVHRjYmlBZ0lDQWdJQ0FnWTI5dWMzUWdjbVZ6ZFd4ME9pQkhjbUZ3YUU1dlpHVkZlR1ZqZFhScGIyNVNaWE4xYkhRZ1BTQjdYRzRnSUNBZ0lDQWdJQ0FnYm05a1pVbGtPaUJ3YkdGdVRtOWtaUzVwWkN4Y2JpQWdJQ0FnSUNBZ0lDQnpkR0YwZFhNNklFZHlZWEJvUlhobFkzVjBhVzl1VTNSaGRIVnpMa05CUTBoRlJDeGNiaUFnSUNBZ0lDQWdJQ0JwYm5CMWRITXNYRzRnSUNBZ0lDQWdJQ0FnYjNWMGNIVjBjem9nWTJGamFHVmtMbTkxZEhCMWRITXNYRzRnSUNBZ0lDQWdJQ0FnYzNSaGNuUmxaRUYwTEZ4dUlDQWdJQ0FnSUNBZ0lHWnBibWx6YUdWa1FYUXNYRzRnSUNBZ0lDQWdJQ0FnWm5KdmJVTmhZMmhsT2lCMGNuVmxMRnh1SUNBZ0lDQWdJQ0FnSUhCcGJtNWxaRG9nZEhKMVpTeGNiaUFnSUNBZ0lDQWdJQ0JsZG1WdWRITTZJRnRkTEZ4dUlDQWdJQ0FnSUNCOU8xeHVJQ0FnSUNBZ0lDQm1jbUZ0WlM1eVpXTnZjbVJPYjJSbFVtVnpkV3gwS0hKbGMzVnNkQ2s3WEc1Y2JpQWdJQ0FnSUNBZ1lYZGhhWFFnZEdocGN5NWxiV2wwUlhabGJuUW9abkpoYldVc0lIdGNiaUFnSUNBZ0lDQWdJQ0IwZVhCbE9pQkhjbUZ3YUVWNFpXTjFkR2x2YmtWMlpXNTBWSGx3WlM1T1QwUkZYME5CUTBoRlgwaEpWQ3hjYmlBZ0lDQWdJQ0FnSUNCeWRXNUpaRG9nWm5KaGJXVXVjblZ1U1dRc1hHNGdJQ0FnSUNBZ0lDQWdkMjl5YTJac2IzZEpaRG9nY0d4aGJpNTNiM0pyWm14dmQwbGtMRnh1SUNBZ0lDQWdJQ0FnSUc1dlpHVkpaRG9nY0d4aGJrNXZaR1V1YVdRc1hHNGdJQ0FnSUNBZ0lDQWdjR0YwYURvZ2JtOWtaVkJoZEdnc1hHNGdJQ0FnSUNBZ0lDQWdjM1JoZEhWek9pQkhjbUZ3YUVWNFpXTjFkR2x2YmxOMFlYUjFjeTVEUVVOSVJVUXNYRzRnSUNBZ0lDQWdJQ0FnY0dGNWJHOWhaRG9nZXlCdmRYUndkWFJ6T2lCallXTm9aV1F1YjNWMGNIVjBjeUI5TEZ4dUlDQWdJQ0FnSUNCOUtUdGNibHh1SUNBZ0lDQWdJQ0JoZDJGcGRDQjBhR2x6TG1WdGFYUkZkbVZ1ZENobWNtRnRaU3dnZTF4dUlDQWdJQ0FnSUNBZ0lIUjVjR1U2SUVkeVlYQm9SWGhsWTNWMGFXOXVSWFpsYm5SVWVYQmxMazVQUkVWZlEwOU5VRXhGVkVWRUxGeHVJQ0FnSUNBZ0lDQWdJSEoxYmtsa09pQm1jbUZ0WlM1eWRXNUpaQ3hjYmlBZ0lDQWdJQ0FnSUNCM2IzSnJabXh2ZDBsa09pQndiR0Z1TG5kdmNtdG1iRzkzU1dRc1hHNGdJQ0FnSUNBZ0lDQWdibTlrWlVsa09pQndiR0Z1VG05a1pTNXBaQ3hjYmlBZ0lDQWdJQ0FnSUNCd1lYUm9PaUJ1YjJSbFVHRjBhQ3hjYmlBZ0lDQWdJQ0FnSUNCemRHRjBkWE02SUVkeVlYQm9SWGhsWTNWMGFXOXVVM1JoZEhWekxsTlZRME5GUlVSRlJDeGNiaUFnSUNBZ0lDQWdJQ0J3WVhsc2IyRmtPaUI3SUc5MWRIQjFkSE02SUdOaFkyaGxaQzV2ZFhSd2RYUnpMQ0JtY205dFEyRmphR1U2SUhSeWRXVWdmU3hjYmlBZ0lDQWdJQ0FnZlNrN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5Ymp0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc1Y2JpQWdJQ0IwY25rZ2UxeHVJQ0FnSUNBZ1kyOXVjM1FnWlhobFkzVjBiM0lnUFNCMGFHbHpMbU52Ym1acFp5NXlaV2RwYzNSeWVTNXlaWE52YkhabEtIQnNZVzVPYjJSbExtdHBibVFwTzF4dUlDQWdJQ0FnWTI5dWMzUWdZMjl1ZEdWNGRDQTlJRzVsZHlCSGNtRndhRVY0WldOMWRHbHZia052Ym5SbGVIUW9YRzRnSUNBZ0lDQWdJR1p5WVcxbExuSjFia2xrTEZ4dUlDQWdJQ0FnSUNCdmNIUnpMbkJoY21WdWRGSjFia2xrTEZ4dUlDQWdJQ0FnSUNCd2JHRnVMbmR2Y210bWJHOTNMRnh1SUNBZ0lDQWdJQ0J3YkdGdVRtOWtaUzVrWldacGJtbDBhVzl1TEZ4dUlDQWdJQ0FnSUNCdWIyUmxVR0YwYUN4Y2JpQWdJQ0FnSUNBZ1pXMXBkRVp1TEZ4dUlDQWdJQ0FnSUNCdmNIUnpMbTFsZEdGa1lYUmhYRzRnSUNBZ0lDQXBPMXh1WEc0Z0lDQWdJQ0JqYjI1emRDQnZkWFJ3ZFhSeklEMGdZWGRoYVhRZ1pYaGxZM1YwYjNJdVpYaGxZM1YwWlNocGJuQjFkSE1zSUdOdmJuUmxlSFFwTzF4dUlDQWdJQ0FnWTI5dWMzUWdjbVZ6YjJ4MlpXUlBkWFJ3ZFhSeklEMGdiM1YwY0hWMGN5QS9QeUI3ZlR0Y2JseHVJQ0FnSUNBZ1puSmhiV1V1ZG1Gc2RXVlRkRzl5WlM1elpYUk9iMlJsVDNWMGNIVjBjeWh3YkdGdVRtOWtaUzVwWkN3Z2NtVnpiMngyWldSUGRYUndkWFJ6S1R0Y2JpQWdJQ0FnSUhSb2FYTXVjbTkxZEdWUGRYUm5iMmx1WjBWa1oyVnpLR1p5WVcxbExDQndiR0Z1TENCd2JHRnVUbTlrWlN3Z2NtVnpiMngyWldSUGRYUndkWFJ6S1R0Y2JseHVJQ0FnSUNBZ1kyOXVjM1FnWm1sdWFYTm9aV1JCZENBOUlHNWxkeUJFWVhSbEtDazdYRzRnSUNBZ0lDQmpiMjV6ZENCeVpYTjFiSFE2SUVkeVlYQm9UbTlrWlVWNFpXTjFkR2x2YmxKbGMzVnNkQ0E5SUh0Y2JpQWdJQ0FnSUNBZ2JtOWtaVWxrT2lCd2JHRnVUbTlrWlM1cFpDeGNiaUFnSUNBZ0lDQWdjM1JoZEhWek9pQkhjbUZ3YUVWNFpXTjFkR2x2YmxOMFlYUjFjeTVUVlVORFJVVkVSVVFzWEc0Z0lDQWdJQ0FnSUdsdWNIVjBjeXhjYmlBZ0lDQWdJQ0FnYjNWMGNIVjBjem9nY21WemIyeDJaV1JQZFhSd2RYUnpMRnh1SUNBZ0lDQWdJQ0J6ZEdGeWRHVmtRWFFzWEc0Z0lDQWdJQ0FnSUdacGJtbHphR1ZrUVhRc1hHNGdJQ0FnSUNBZ0lHVjJaVzUwY3pvZ1cxMHNYRzRnSUNBZ0lDQjlPMXh1SUNBZ0lDQWdabkpoYldVdWNtVmpiM0prVG05a1pWSmxjM1ZzZENoeVpYTjFiSFFwTzF4dVhHNGdJQ0FnSUNCaGQyRnBkQ0IwYUdsekxtVnRhWFJGZG1WdWRDaG1jbUZ0WlN3Z2UxeHVJQ0FnSUNBZ0lDQjBlWEJsT2lCSGNtRndhRVY0WldOMWRHbHZia1YyWlc1MFZIbHdaUzVPVDBSRlgwTlBUVkJNUlZSRlJDeGNiaUFnSUNBZ0lDQWdjblZ1U1dRNklHWnlZVzFsTG5KMWJrbGtMRnh1SUNBZ0lDQWdJQ0IzYjNKclpteHZkMGxrT2lCd2JHRnVMbmR2Y210bWJHOTNTV1FzWEc0Z0lDQWdJQ0FnSUc1dlpHVkpaRG9nY0d4aGJrNXZaR1V1YVdRc1hHNGdJQ0FnSUNBZ0lIQmhkR2c2SUc1dlpHVlFZWFJvTEZ4dUlDQWdJQ0FnSUNCemRHRjBkWE02SUVkeVlYQm9SWGhsWTNWMGFXOXVVM1JoZEhWekxsTlZRME5GUlVSRlJDeGNiaUFnSUNBZ0lDQWdjR0Y1Ykc5aFpEb2dleUJ2ZFhSd2RYUnpPaUJ5WlhOdmJIWmxaRTkxZEhCMWRITWdmU3hjYmlBZ0lDQWdJSDBwTzF4dUlDQWdJSDBnWTJGMFkyZ2dLR1Z5Y205eUtTQjdYRzRnSUNBZ0lDQmpiMjV6ZENCbWFXNXBjMmhsWkVGMElEMGdibVYzSUVSaGRHVW9LVHRjYmlBZ0lDQWdJR052Ym5OMElHVnljbTl5VUdGNWJHOWhaQ0E5SUhSb2FYTXVkRzlGY25KdmNsQmhlV3h2WVdRb1pYSnliM0lwTzF4dUlDQWdJQ0FnWTI5dWMzUWdjbVZ6ZFd4ME9pQkhjbUZ3YUU1dlpHVkZlR1ZqZFhScGIyNVNaWE4xYkhRZ1BTQjdYRzRnSUNBZ0lDQWdJRzV2WkdWSlpEb2djR3hoYms1dlpHVXVhV1FzWEc0Z0lDQWdJQ0FnSUhOMFlYUjFjem9nUjNKaGNHaEZlR1ZqZFhScGIyNVRkR0YwZFhNdVJrRkpURVZFTEZ4dUlDQWdJQ0FnSUNCcGJuQjFkSE1zWEc0Z0lDQWdJQ0FnSUdWeWNtOXlPaUJsY25KdmNsQmhlV3h2WVdRc1hHNGdJQ0FnSUNBZ0lITjBZWEowWldSQmRDeGNiaUFnSUNBZ0lDQWdabWx1YVhOb1pXUkJkQ3hjYmlBZ0lDQWdJQ0FnWlhabGJuUnpPaUJiWFN4Y2JpQWdJQ0FnSUgwN1hHNGdJQ0FnSUNCbWNtRnRaUzV5WldOdmNtUk9iMlJsVW1WemRXeDBLSEpsYzNWc2RDazdYRzVjYmlBZ0lDQWdJR0YzWVdsMElIUm9hWE11WlcxcGRFVjJaVzUwS0daeVlXMWxMQ0I3WEc0Z0lDQWdJQ0FnSUhSNWNHVTZJRWR5WVhCb1JYaGxZM1YwYVc5dVJYWmxiblJVZVhCbExrNVBSRVZmUmtGSlRFVkVMRnh1SUNBZ0lDQWdJQ0J5ZFc1SlpEb2dabkpoYldVdWNuVnVTV1FzWEc0Z0lDQWdJQ0FnSUhkdmNtdG1iRzkzU1dRNklIQnNZVzR1ZDI5eWEyWnNiM2RKWkN4Y2JpQWdJQ0FnSUNBZ2JtOWtaVWxrT2lCd2JHRnVUbTlrWlM1cFpDeGNiaUFnSUNBZ0lDQWdjR0YwYURvZ2JtOWtaVkJoZEdnc1hHNGdJQ0FnSUNBZ0lITjBZWFIxY3pvZ1IzSmhjR2hGZUdWamRYUnBiMjVUZEdGMGRYTXVSa0ZKVEVWRUxGeHVJQ0FnSUNBZ0lDQmxjbkp2Y2pvZ1pYSnliM0pRWVhsc2IyRmtMRnh1SUNBZ0lDQWdmU2s3WEc1Y2JpQWdJQ0FnSUdsbUlDaHZjSFJ6TG1aaGFXeEdZWE4wSUQ4L0lIUnlkV1VwSUhSb2NtOTNJR1Z5Y205eU8xeHVJQ0FnSUgxY2JpQWdmVnh1WEc0Z0lDOHFLbHh1SUNBZ0tpQlNaWE52YkhabGN5QmhJRzV2WkdVbmN5QnBibkIxZENCMllXeDFaWE1nWm5KdmJTQnBibU52YldsdVp5QmxaR2RsY3k1Y2JpQWdJQ292WEc0Z0lIQnlhWFpoZEdVZ2NtVnpiMngyWlU1dlpHVkpibkIxZEhNb1hHNGdJQ0FnWm5KaGJXVTZJRWR5WVhCb1JYaGxZM1YwYVc5dVJuSmhiV1VzWEc0Z0lDQWdjR3hoYmpvZ1IzSmhjR2hGZUdWamRYUnBiMjVRYkdGdUxGeHVJQ0FnSUhCc1lXNU9iMlJsT2lCSGNtRndhRVY0WldOMWRHbHZibEJzWVc1T2IyUmxYRzRnSUNrNklFZHlZWEJvUlhobFkzVjBhVzl1Vm1Gc2RXVnpJSHRjYmlBZ0lDQmpiMjV6ZENCcGJuQjFkSE02SUVkeVlYQm9SWGhsWTNWMGFXOXVWbUZzZFdWeklEMGdlMzA3WEc0Z0lDQWdZMjl1YzNRZ2FXNWpiMjFwYm1jZ1BTQndiR0Z1TG1sdVkyOXRhVzVuUW5sT2IyUmxMbWRsZENod2JHRnVUbTlrWlM1cFpDa2dQejhnVzEwN1hHNGdJQ0FnWm05eUlDaGpiMjV6ZENCbFpHZGxJRzltSUdsdVkyOXRhVzVuS1NCN1hHNGdJQ0FnSUNCcGJuQjFkSE5iWldSblpTNTBZWEpuWlhSUWIzSjBYU0E5SUdaeVlXMWxMblpoYkhWbFUzUnZjbVV1WjJWMFVHOXlkQ2hjYmlBZ0lDQWdJQ0FnWldSblpTNXpiM1Z5WTJWT2IyUmxTV1FzWEc0Z0lDQWdJQ0FnSUdWa1oyVXVjMjkxY21ObFVHOXlkRnh1SUNBZ0lDQWdLVHRjYmlBZ0lDQjlYRzRnSUNBZ2NtVjBkWEp1SUdsdWNIVjBjenRjYmlBZ2ZWeHVYRzRnSUM4cUtseHVJQ0FnS2lCQmRIUmxiWEIwY3lCMGJ5QnlaV0ZrSUdFZ2NHbHVibVZrSUhaaGJIVmxJR1p2Y2lCMGFHVWdibTlrWlM0Z1VtVjBkWEp1Y3lCMGFHVWdZMkZqYUdWa0lHOTFkSEIxZEhOY2JpQWdJQ29nZDJobGJpQmhJSFpoYkdsa0lIQnBibTVsWkNCMllXeDFaU0JsZUdsemRITXNJRzl5SUdCMWJtUmxabWx1WldSZ0lIUnZJSEJ5YjJObFpXUWdkMmwwYUNCdWIzSnRZV3hjYmlBZ0lDb2daWGhsWTNWMGFXOXVMbHh1SUNBZ0tpOWNiaUFnY0hKcGRtRjBaU0JoYzNsdVl5QjBjbmxRYVc1dVpXUldZV3gxWlNoY2JpQWdJQ0JtY21GdFpUb2dSM0poY0doRmVHVmpkWFJwYjI1R2NtRnRaU3hjYmlBZ0lDQndiR0Z1T2lCSGNtRndhRVY0WldOMWRHbHZibEJzWVc0c1hHNGdJQ0FnY0d4aGJrNXZaR1U2SUVkeVlYQm9SWGhsWTNWMGFXOXVVR3hoYms1dlpHVXNYRzRnSUNBZ2FXNXdkWFJ6T2lCSGNtRndhRVY0WldOMWRHbHZibFpoYkhWbGMxeHVJQ0FwT2lCUWNtOXRhWE5sUEVkeVlYQm9RMkZqYUdWa1ZtRnNkV1VnZkNCMWJtUmxabWx1WldRK0lIdGNiaUFnSUNCamIyNXpkQ0J3YjJ4cFkza2dQU0J1WlhjZ1IzSmhjR2hRYVc1dWFXNW5VRzlzYVdONUtDazdYRzRnSUNBZ2FXWWdLQ0Z3YjJ4cFkza3VjMmh2ZFd4a1ZYTmxVR2x1Ym1Wa1ZtRnNkV1VvY0d4aGJrNXZaR1VwS1NCeVpYUjFjbTRnZFc1a1pXWnBibVZrTzF4dVhHNGdJQ0FnWTI5dWMzUWdjMlZ5ZG1salpTQTlJSFJvYVhNdVkzSmxZWFJsVUdsdWJtbHVaMU5sY25acFkyVW9LVHRjYmlBZ0lDQmpiMjV6ZENCa1pYQkdhVzVuWlhKd2NtbHVkSE1nUFNCMGFHbHpMbU52YlhCMWRHVkVaWEJsYm1SbGJtTjVSbWx1WjJWeWNISnBiblJ6S0daeVlXMWxMQ0J3YkdGdUxDQndiR0Z1VG05a1pTNXBaQ2s3WEc0Z0lDQWdjbVYwZFhKdUlITmxjblpwWTJVdWNtVmhaRkJwYm01bFpGWmhiSFZsS0Z4dUlDQWdJQ0FnY0d4aGJpNTNiM0pyWm14dmR5eGNiaUFnSUNBZ0lIQnNZVzVPYjJSbExGeHVJQ0FnSUNBZ2FXNXdkWFJ6TEZ4dUlDQWdJQ0FnWkdWd1JtbHVaMlZ5Y0hKcGJuUnpYRzRnSUNBZ0tUdGNiaUFnZlZ4dVhHNGdJQzhxS2x4dUlDQWdLaUJTWldOMWNuTnBkbVZzZVNCamIyMXdkWFJsY3lCbWFXNW5aWEp3Y21sdWRITWdabTl5SUdGc2JDQjFjSE4wY21WaGJTQmtaWEJsYm1SbGJtTnBaWE1nYjJZZ1lTQnViMlJsWEc0Z0lDQXFJSFZ6YVc1bklIUm9aU0J5WlhOMWJIUnpJR0ZzY21WaFpIa2dZV05qZFcxMWJHRjBaV1FnYVc0Z2RHaGxJR1p5WVcxbExseHVJQ0FnS2k5Y2JpQWdjSEpwZG1GMFpTQmpiMjF3ZFhSbFJHVndaVzVrWlc1amVVWnBibWRsY25CeWFXNTBjeWhjYmlBZ0lDQm1jbUZ0WlRvZ1IzSmhjR2hGZUdWamRYUnBiMjVHY21GdFpTeGNiaUFnSUNCd2JHRnVPaUJIY21Gd2FFVjRaV04xZEdsdmJsQnNZVzRzWEc0Z0lDQWdibTlrWlVsa09pQnpkSEpwYm1kY2JpQWdLVG9nVW1WamIzSmtQSE4wY21sdVp5d2djM1J5YVc1blBpQjdYRzRnSUNBZ1kyOXVjM1FnYzJWeWRtbGpaU0E5SUhSb2FYTXVZM0psWVhSbFVHbHVibWx1WjFObGNuWnBZMlVvS1R0Y2JpQWdJQ0JqYjI1emRDQmtaWEJTWlhOdmJIWmxjaUE5SUc1bGR5QkhjbUZ3YUZCcGJtNXBibWRFWlhCbGJtUmxibU41VW1WemIyeDJaWElvS1R0Y2JpQWdJQ0JqYjI1emRDQmtaWEJ6SUQwZ1pHVndVbVZ6YjJ4MlpYSXVaMlYwUkdWd1pXNWtaVzVqYVdWektIQnNZVzRzSUc1dlpHVkpaQ2s3WEc0Z0lDQWdZMjl1YzNRZ1ptbHVaMlZ5Y0hKcGJuUnpPaUJTWldOdmNtUThjM1J5YVc1bkxDQnpkSEpwYm1jK0lEMGdlMzA3WEc0Z0lDQWdabTl5SUNoamIyNXpkQ0JrWlhBZ2IyWWdaR1Z3Y3lrZ2UxeHVJQ0FnSUNBZ1kyOXVjM1FnYm05a1pTQTlJSEJzWVc0dWJtOWtaWE11Wm1sdVpDZ29iaWtnUFQ0Z2JpNXBaQ0E5UFQwZ1pHVndLVHRjYmlBZ0lDQWdJR2xtSUNodWIyUmxLU0I3WEc0Z0lDQWdJQ0FnSUdOdmJuTjBJR1JsY0ZKbGMzVnNkQ0E5SUdaeVlXMWxMbTV2WkdWU1pYTjFiSFJ6TG1kbGRDaGtaWEFwTzF4dUlDQWdJQ0FnSUNCamIyNXpkQ0JwYm5CMWRITWdQU0JrWlhCU1pYTjFiSFEvTG1sdWNIVjBjeUEvUHlCN2ZUdGNiaUFnSUNBZ0lDQWdZMjl1YzNRZ2JtVnpkR1ZrUkdWd2N5QTlJSFJvYVhNdVkyOXRjSFYwWlVSbGNHVnVaR1Z1WTNsR2FXNW5aWEp3Y21sdWRITW9abkpoYldVc0lIQnNZVzRzSUdSbGNDazdYRzRnSUNBZ0lDQWdJR1pwYm1kbGNuQnlhVzUwYzF0a1pYQmRJRDBnYzJWeWRtbGpaUzVqYjIxd2RYUmxSbWx1WjJWeWNISnBiblFvWEc0Z0lDQWdJQ0FnSUNBZ2NHeGhiaTUzYjNKclpteHZkeXhjYmlBZ0lDQWdJQ0FnSUNCdWIyUmxMRnh1SUNBZ0lDQWdJQ0FnSUdsdWNIVjBjeXhjYmlBZ0lDQWdJQ0FnSUNCdVpYTjBaV1JFWlhCelhHNGdJQ0FnSUNBZ0lDazdYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZWeHVJQ0FnSUhKbGRIVnliaUJtYVc1blpYSndjbWx1ZEhNN1hHNGdJSDFjYmx4dUlDQXZLaXBjYmlBZ0lDb2dVbTkxZEdWeklHRWdibTlrWlNkeklHOTFkSEIxZEhNZ2RHOGdaRzkzYm5OMGNtVmhiU0JwYm5CMWRITWdZVzVrSUhkdmNtdG1iRzkzSUc5MWRIQjFkSE11WEc0Z0lDQXFMMXh1SUNCd2NtbDJZWFJsSUhKdmRYUmxUM1YwWjI5cGJtZEZaR2RsY3loY2JpQWdJQ0JtY21GdFpUb2dSM0poY0doRmVHVmpkWFJwYjI1R2NtRnRaU3hjYmlBZ0lDQndiR0Z1T2lCSGNtRndhRVY0WldOMWRHbHZibEJzWVc0c1hHNGdJQ0FnY0d4aGJrNXZaR1U2SUVkeVlYQm9SWGhsWTNWMGFXOXVVR3hoYms1dlpHVXNYRzRnSUNBZ2IzVjBjSFYwY3pvZ1IzSmhjR2hGZUdWamRYUnBiMjVXWVd4MVpYTmNiaUFnS1RvZ2RtOXBaQ0I3WEc0Z0lDQWdZMjl1YzNRZ2IzVjBaMjlwYm1jZ1BTQndiR0Z1TG05MWRHZHZhVzVuUW5sT2IyUmxMbWRsZENod2JHRnVUbTlrWlM1cFpDa2dQejhnVzEwN1hHNGdJQ0FnWm05eUlDaGpiMjV6ZENCbFpHZGxJRzltSUc5MWRHZHZhVzVuS1NCN1hHNGdJQ0FnSUNCamIyNXpkQ0IyWVd4MVpTQTlJRzkxZEhCMWRITmJaV1JuWlM1emIzVnlZMlZRYjNKMFhUdGNiaUFnSUNBZ0lHbG1JQ2hsWkdkbExuUmhjbWRsZEU1dlpHVkpaQ0E5UFQwZ1IxSkJVRWhmVjA5U1MwWk1UMWRmUWs5VlRrUkJVbGtwSUh0Y2JpQWdJQ0FnSUNBZ1puSmhiV1V1ZG1Gc2RXVlRkRzl5WlM1elpYUlhiM0pyWm14dmQwOTFkSEIxZENobFpHZGxMblJoY21kbGRGQnZjblFzSUhaaGJIVmxLVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQWdJSFJvYVhNdVpXMXBkRVYyWlc1MEtHWnlZVzFsTENCN1hHNGdJQ0FnSUNBZ0lIUjVjR1U2SUVkeVlYQm9SWGhsWTNWMGFXOXVSWFpsYm5SVWVYQmxMa1ZFUjBWZlZrRk1WVVZmVWs5VlZFVkVMRnh1SUNBZ0lDQWdJQ0J5ZFc1SlpEb2dabkpoYldVdWNuVnVTV1FzWEc0Z0lDQWdJQ0FnSUhkdmNtdG1iRzkzU1dRNklIQnNZVzR1ZDI5eWEyWnNiM2RKWkN4Y2JpQWdJQ0FnSUNBZ1pXUm5aVWxrT2lCbFpHZGxMbWxrTEZ4dUlDQWdJQ0FnSUNCdWIyUmxTV1E2SUhCc1lXNU9iMlJsTG1sa0xGeHVJQ0FnSUNBZ0lDQndZWFJvT2lCYlhTeGNiaUFnSUNBZ0lDQWdjR0Y1Ykc5aFpEb2dleUJsWkdkbExDQjJZV3gxWlNCOUxGeHVJQ0FnSUNBZ2ZTa3VZMkYwWTJnb0tDa2dQVDRnZTF4dUlDQWdJQ0FnSUNBdkx5QnZZbk5sY25abGNpQm1ZV2xzZFhKbGN5QnRkWE4wSUc1dmRDQmpjbUZ6YUZ4dUlDQWdJQ0FnZlNrN1hHNGdJQ0FnZlZ4dUlDQjlYRzVjYmlBZ0x5b3FYRzRnSUNBcUlFVnRhWFJ6SUdGdUlHVjJaVzUwTENCeVpXTnZjbVJ6SUdsMElHbHVJSFJvWlNCbWNtRnRaU3dnWVc1a0lHUnBjM0JoZEdOb1pYTWdkRzhnYjJKelpYSjJaWEp6TGx4dUlDQWdLaTljYmlBZ2NISnBkbUYwWlNCaGMzbHVZeUJsYldsMFJYWmxiblFvWEc0Z0lDQWdabkpoYldVNklFZHlZWEJvUlhobFkzVjBhVzl1Um5KaGJXVXNYRzRnSUNBZ2NHRnlkR2xoYkRvZ1VHRnlkR2xoYkR4SGNtRndhRVY0WldOMWRHbHZia1YyWlc1MFBpQW1JSHRjYmlBZ0lDQWdJSFI1Y0dVNklFZHlZWEJvUlhobFkzVjBhVzl1UlhabGJuUlVlWEJsTzF4dUlDQWdJQ0FnY25WdVNXUTZJRWR5WVhCb1VuVnVTV1E3WEc0Z0lDQWdJQ0IzYjNKclpteHZkMGxrT2lCemRISnBibWM3WEc0Z0lDQWdJQ0J3WVhSb09pQnpkSEpwYm1kYlhUdGNiaUFnSUNCOVhHNGdJQ2s2SUZCeWIyMXBjMlU4ZG05cFpENGdlMXh1SUNBZ0lHTnZibk4wSUdWMlpXNTBJRDBnWm5KaGJXVXVaWFpsYm5SR1lXTjBiM0o1TG1OeVpXRjBaU2g3WEc0Z0lDQWdJQ0JwWkRvZ1hDSmNJaXhjYmlBZ0lDQWdJSE5sY1hWbGJtTmxPaUF3TEZ4dUlDQWdJQ0FnZEdsdFpYTjBZVzF3T2lCdVpYY2dSR0YwWlNncExGeHVJQ0FnSUNBZ0xpNHVjR0Z5ZEdsaGJDeGNiaUFnSUNCOUlHRnpJRTl0YVhROFIzSmhjR2hGZUdWamRYUnBiMjVGZG1WdWRDd2dYQ0pwWkZ3aUlId2dYQ0p6WlhGMVpXNWpaVndpSUh3Z1hDSjBhVzFsYzNSaGJYQmNJajRwTzF4dUlDQWdJR1p5WVcxbExtRndjR1Z1WkVWMlpXNTBLR1YyWlc1MEtUdGNiaUFnSUNCaGQyRnBkQ0IwYUdsekxtVnRhWFIwWlhJdWRYQmtZWFJsVDJKelpYSjJaWEp6S0dWMlpXNTBLVHRjYmlBZ2ZWeHVYRzRnSUM4cUtseHVJQ0FnS2lCTlpYSm5aWE1nWkdWbVlYVnNkQ0J2Y0hScGIyNXpJSGRwZEdnZ2RHaGxJR2RwZG1WdUlHOXdkR2x2Ym5NdVhHNGdJQ0FxTDF4dUlDQndjbWwyWVhSbElHMWxjbWRsVDNCMGFXOXVjeWhjYmlBZ0lDQnZjSFJwYjI1ek9pQkhjbUZ3YUVWNFpXTjFkR2x2Yms5d2RHbHZibk5jYmlBZ0tUb2dSM0poY0doRmVHVmpkWFJwYjI1UGNIUnBiMjV6SUh0Y2JpQWdJQ0J5WlhSMWNtNGdlMXh1SUNBZ0lDQWdZMjl1WTNWeWNtVnVZM2s2SUVkU1FWQklYMFJGUmtGVlRGUmZRMDlPUTFWU1VrVk9RMWtzWEc0Z0lDQWdJQ0JtWVdsc1JtRnpkRG9nZEhKMVpTeGNiaUFnSUNBZ0lIWmhiR2xrWVhSbFNXNXdkWFJ6T2lCMGNuVmxMRnh1SUNBZ0lDQWdkbUZzYVdSaGRHVlBkWFJ3ZFhSek9pQjBjblZsTEZ4dUlDQWdJQ0FnZFhObFVHbHVibVZrVm1Gc2RXVnpPaUIwY25WbExGeHVJQ0FnSUNBZ2QzSnBkR1ZVYUhKdmRXZG9RMkZqYUdVNklHWmhiSE5sTEZ4dUlDQWdJQ0FnY0dGMGFEb2dXMTBzWEc0Z0lDQWdJQ0J0WlhSaFpHRjBZVG9nZTMwc1hHNGdJQ0FnSUNBdUxpNTBhR2x6TG1SbFptRjFiSFJQY0hScGIyNXpMRnh1SUNBZ0lDQWdMaTR1YjNCMGFXOXVjeXhjYmlBZ0lDQjlPMXh1SUNCOVhHNWNiaUFnTHlvcVhHNGdJQ0FxSUVkbGJtVnlZWFJsY3lCaElIVnVhWEYxWlNCeWRXNGdhV1F1WEc0Z0lDQXFMMXh1SUNCd2NtbDJZWFJsSUdkbGJtVnlZWFJsVW5WdVNXUW9LVG9nYzNSeWFXNW5JSHRjYmlBZ0lDQnlaWFIxY200Z0tGeHVJQ0FnSUNBZ1oyeHZZbUZzVkdocGN5NWpjbmx3ZEc4L0xuSmhibVJ2YlZWVlNVUS9MaWdwSUQ4L1hHNGdJQ0FnSUNCZ1ozSmhjR2d0Y25WdUxTUjdSR0YwWlM1dWIzY29LWDB0Skh0TllYUm9MbkpoYm1SdmJTZ3BMblJ2VTNSeWFXNW5LRE0yS1M1emJHbGpaU2d5S1gxZ1hHNGdJQ0FnS1R0Y2JpQWdmVnh1WEc0Z0lDOHFLbHh1SUNBZ0tpQkRiMjUyWlhKMGN5QmhiaUJsY25KdmNpQnBiblJ2SUdFZ2MyVnlhV0ZzYVhwbFpDQndZWGxzYjJGa0xseHVJQ0FnS2k5Y2JpQWdjSEpwZG1GMFpTQjBiMFZ5Y205eVVHRjViRzloWkNobGNuSnZjam9nZFc1cmJtOTNiaWs2SUVkeVlYQm9SWGhsWTNWMGFXOXVSWEp5YjNKUVlYbHNiMkZrSUh0Y2JpQWdJQ0JwWmlBb1pYSnliM0lnYVc1emRHRnVZMlZ2WmlCRmNuSnZjaWtnZTF4dUlDQWdJQ0FnY21WMGRYSnVJSHRjYmlBZ0lDQWdJQ0FnYm1GdFpUb2daWEp5YjNJdWJtRnRaU3hjYmlBZ0lDQWdJQ0FnYldWemMyRm5aVG9nWlhKeWIzSXViV1Z6YzJGblpTeGNiaUFnSUNBZ0lDQWdjM1JoWTJzNklHVnljbTl5TG5OMFlXTnJMRnh1SUNBZ0lDQWdJQ0JqYjJSbE9seHVJQ0FnSUNBZ0lDQWdJQ2hsY25KdmNpQmhjeUJoYm5rcExtZHlZWEJvUTI5a1pTQS9QMXh1SUNBZ0lDQWdJQ0FnSUNoMGVYQmxiMllnS0dWeWNtOXlJR0Z6SUdGdWVTa3VZMjlrWlNBOVBUMGdYQ0p1ZFcxaVpYSmNJbHh1SUNBZ0lDQWdJQ0FnSUNBZ1B5QlRkSEpwYm1jb0tHVnljbTl5SUdGeklHRnVlU2t1WTI5a1pTbGNiaUFnSUNBZ0lDQWdJQ0FnSURvZ0tHVnljbTl5SUdGeklHRnVlU2t1WTI5a1pTa3NYRzRnSUNBZ0lDQjlPMXh1SUNBZ0lIMWNiaUFnSUNCeVpYUjFjbTRnZXlCdVlXMWxPaUJjSWxWdWEyNXZkMjVGY25KdmNsd2lMQ0J0WlhOellXZGxPaUJUZEhKcGJtY29aWEp5YjNJcElIMDdYRzRnSUgxY2JuMWNiaUpkZlE9PSJdfQ==