@workflow/core 5.0.0-beta.4 → 5.0.0-beta.40

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 (325) hide show
  1. package/dist/attribute-changes.d.ts +7 -0
  2. package/dist/attribute-changes.d.ts.map +1 -0
  3. package/dist/attribute-changes.js +25 -0
  4. package/dist/capabilities.d.ts +33 -1
  5. package/dist/capabilities.d.ts.map +1 -1
  6. package/dist/capabilities.js +71 -4
  7. package/dist/capture-stack.d.ts +16 -0
  8. package/dist/capture-stack.d.ts.map +1 -0
  9. package/dist/capture-stack.js +21 -0
  10. package/dist/class-serialization.d.ts +32 -0
  11. package/dist/class-serialization.d.ts.map +1 -1
  12. package/dist/class-serialization.js +37 -1
  13. package/dist/classify-error.d.ts +26 -3
  14. package/dist/classify-error.d.ts.map +1 -1
  15. package/dist/classify-error.js +109 -6
  16. package/dist/context-errors.d.ts +27 -0
  17. package/dist/context-errors.d.ts.map +1 -0
  18. package/dist/context-errors.js +101 -0
  19. package/dist/context-violation-error.d.ts +97 -0
  20. package/dist/context-violation-error.d.ts.map +1 -0
  21. package/dist/context-violation-error.js +149 -0
  22. package/dist/correlation-id.d.ts +109 -0
  23. package/dist/correlation-id.d.ts.map +1 -0
  24. package/dist/correlation-id.js +139 -0
  25. package/dist/create-hook.d.ts +62 -4
  26. package/dist/create-hook.d.ts.map +1 -1
  27. package/dist/create-hook.js +4 -3
  28. package/dist/define-hook.d.ts.map +1 -1
  29. package/dist/define-hook.js +20 -5
  30. package/dist/describe-error.d.ts +70 -0
  31. package/dist/describe-error.d.ts.map +1 -0
  32. package/dist/describe-error.js +189 -0
  33. package/dist/encryption.d.ts +37 -3
  34. package/dist/encryption.d.ts.map +1 -1
  35. package/dist/encryption.js +97 -31
  36. package/dist/events-consumer.d.ts +26 -1
  37. package/dist/events-consumer.d.ts.map +1 -1
  38. package/dist/events-consumer.js +105 -18
  39. package/dist/flushable-stream.d.ts +65 -10
  40. package/dist/flushable-stream.d.ts.map +1 -1
  41. package/dist/flushable-stream.js +131 -18
  42. package/dist/global.d.ts +37 -1
  43. package/dist/global.d.ts.map +1 -1
  44. package/dist/global.js +21 -3
  45. package/dist/index.d.ts +1 -0
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +2 -1
  48. package/dist/log-format.d.ts +25 -0
  49. package/dist/log-format.d.ts.map +1 -0
  50. package/dist/log-format.js +250 -0
  51. package/dist/logger.d.ts +29 -30
  52. package/dist/logger.d.ts.map +1 -1
  53. package/dist/logger.js +82 -32
  54. package/dist/private.d.ts +178 -9
  55. package/dist/private.d.ts.map +1 -1
  56. package/dist/private.js +273 -9
  57. package/dist/replay-payload-cache.d.ts +68 -0
  58. package/dist/replay-payload-cache.d.ts.map +1 -0
  59. package/dist/replay-payload-cache.js +160 -0
  60. package/dist/runtime/compute-instance.d.ts +12 -0
  61. package/dist/runtime/compute-instance.d.ts.map +1 -0
  62. package/dist/runtime/compute-instance.js +13 -0
  63. package/dist/runtime/constants.d.ts +237 -0
  64. package/dist/runtime/constants.d.ts.map +1 -1
  65. package/dist/runtime/constants.js +405 -15
  66. package/dist/runtime/count-step-started-events.d.ts +52 -0
  67. package/dist/runtime/count-step-started-events.d.ts.map +1 -0
  68. package/dist/runtime/count-step-started-events.js +72 -0
  69. package/dist/runtime/deployment-guard.d.ts +99 -0
  70. package/dist/runtime/deployment-guard.d.ts.map +1 -0
  71. package/dist/runtime/deployment-guard.js +154 -0
  72. package/dist/runtime/get-port-lazy.d.ts +25 -0
  73. package/dist/runtime/get-port-lazy.d.ts.map +1 -0
  74. package/dist/runtime/get-port-lazy.js +92 -0
  75. package/dist/runtime/get-world-lazy.d.ts +23 -0
  76. package/dist/runtime/get-world-lazy.d.ts.map +1 -0
  77. package/dist/runtime/get-world-lazy.js +46 -0
  78. package/dist/runtime/helpers.d.ts +219 -10
  79. package/dist/runtime/helpers.d.ts.map +1 -1
  80. package/dist/runtime/helpers.js +414 -40
  81. package/dist/runtime/quickjs-assets.generated.d.ts +14 -0
  82. package/dist/runtime/quickjs-assets.generated.d.ts.map +1 -0
  83. package/dist/runtime/quickjs-assets.generated.js +30 -0
  84. package/dist/runtime/quickjs-entrypoint.d.ts +124 -0
  85. package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -0
  86. package/dist/runtime/quickjs-entrypoint.js +1429 -0
  87. package/dist/runtime/quickjs-runtime.d.ts +193 -0
  88. package/dist/runtime/quickjs-runtime.d.ts.map +1 -0
  89. package/dist/runtime/quickjs-runtime.js +1944 -0
  90. package/dist/runtime/replay-budget.d.ts +98 -0
  91. package/dist/runtime/replay-budget.d.ts.map +1 -0
  92. package/dist/runtime/replay-budget.js +192 -0
  93. package/dist/runtime/replay-recovery-reporter.d.ts +36 -0
  94. package/dist/runtime/replay-recovery-reporter.d.ts.map +1 -0
  95. package/dist/runtime/replay-recovery-reporter.js +64 -0
  96. package/dist/runtime/resume-hook.d.ts +27 -4
  97. package/dist/runtime/resume-hook.d.ts.map +1 -1
  98. package/dist/runtime/resume-hook.js +448 -76
  99. package/dist/runtime/run-id-time.d.ts +19 -0
  100. package/dist/runtime/run-id-time.d.ts.map +1 -0
  101. package/dist/runtime/run-id-time.js +42 -0
  102. package/dist/runtime/run.d.ts +8 -2
  103. package/dist/runtime/run.d.ts.map +1 -1
  104. package/dist/runtime/run.js +62 -15
  105. package/dist/runtime/runs.d.ts +54 -3
  106. package/dist/runtime/runs.d.ts.map +1 -1
  107. package/dist/runtime/runs.js +117 -10
  108. package/dist/runtime/start.d.ts +70 -1
  109. package/dist/runtime/start.d.ts.map +1 -1
  110. package/dist/runtime/start.js +312 -54
  111. package/dist/runtime/step-executor.d.ts +177 -0
  112. package/dist/runtime/step-executor.d.ts.map +1 -0
  113. package/dist/runtime/step-executor.js +949 -0
  114. package/dist/runtime/step-latency.d.ts +197 -0
  115. package/dist/runtime/step-latency.d.ts.map +1 -0
  116. package/dist/runtime/step-latency.js +207 -0
  117. package/dist/runtime/step-ownership.d.ts +72 -0
  118. package/dist/runtime/step-ownership.d.ts.map +1 -0
  119. package/dist/runtime/step-ownership.js +114 -0
  120. package/dist/runtime/step-single-flight.d.ts +12 -0
  121. package/dist/runtime/step-single-flight.d.ts.map +1 -0
  122. package/dist/runtime/step-single-flight.js +69 -0
  123. package/dist/runtime/suspension-handler.d.ts +102 -7
  124. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  125. package/dist/runtime/suspension-handler.js +439 -140
  126. package/dist/runtime/vm-mode.d.ts +44 -0
  127. package/dist/runtime/vm-mode.d.ts.map +1 -0
  128. package/dist/runtime/vm-mode.js +62 -0
  129. package/dist/runtime/vm-serde-bundle.generated.d.ts +14 -0
  130. package/dist/runtime/vm-serde-bundle.generated.d.ts.map +1 -0
  131. package/dist/runtime/vm-serde-bundle.generated.js +16 -0
  132. package/dist/runtime/wait-continuation.d.ts +84 -0
  133. package/dist/runtime/wait-continuation.d.ts.map +1 -0
  134. package/dist/runtime/wait-continuation.js +105 -0
  135. package/dist/runtime/wait-until.d.ts +18 -0
  136. package/dist/runtime/wait-until.d.ts.map +1 -0
  137. package/dist/runtime/wait-until.js +42 -0
  138. package/dist/runtime/world-compatibility.d.ts +5 -0
  139. package/dist/runtime/world-compatibility.d.ts.map +1 -0
  140. package/dist/runtime/world-compatibility.js +12 -0
  141. package/dist/runtime/world-init.d.ts +50 -0
  142. package/dist/runtime/world-init.d.ts.map +1 -0
  143. package/dist/runtime/world-init.js +50 -0
  144. package/dist/runtime/world.d.ts +14 -2
  145. package/dist/runtime/world.d.ts.map +1 -1
  146. package/dist/runtime/world.js +101 -26
  147. package/dist/runtime.d.ts +17 -12
  148. package/dist/runtime.d.ts.map +1 -1
  149. package/dist/runtime.js +3078 -327
  150. package/dist/schemas.d.ts +1 -1
  151. package/dist/schemas.d.ts.map +1 -1
  152. package/dist/schemas.js +1 -1
  153. package/dist/sealed-box.d.ts +167 -0
  154. package/dist/sealed-box.d.ts.map +1 -0
  155. package/dist/sealed-box.js +571 -0
  156. package/dist/serialization/client.d.ts +17 -0
  157. package/dist/serialization/client.d.ts.map +1 -0
  158. package/dist/serialization/client.js +48 -0
  159. package/dist/serialization/codec-devalue-vm.d.ts +9 -0
  160. package/dist/serialization/codec-devalue-vm.d.ts.map +1 -0
  161. package/dist/serialization/codec-devalue-vm.js +137 -0
  162. package/dist/serialization/codec-devalue.d.ts +14 -0
  163. package/dist/serialization/codec-devalue.d.ts.map +1 -0
  164. package/dist/serialization/codec-devalue.js +105 -0
  165. package/dist/serialization/codec.d.ts +125 -0
  166. package/dist/serialization/codec.d.ts.map +1 -0
  167. package/dist/serialization/codec.js +17 -0
  168. package/dist/serialization/compression.d.ts +104 -0
  169. package/dist/serialization/compression.d.ts.map +1 -0
  170. package/dist/serialization/compression.js +260 -0
  171. package/dist/serialization/encryption.d.ts +134 -0
  172. package/dist/serialization/encryption.d.ts.map +1 -0
  173. package/dist/serialization/encryption.js +186 -0
  174. package/dist/serialization/errors.d.ts +34 -0
  175. package/dist/serialization/errors.d.ts.map +1 -0
  176. package/dist/serialization/errors.js +59 -0
  177. package/dist/serialization/format.d.ts +60 -0
  178. package/dist/serialization/format.d.ts.map +1 -0
  179. package/dist/serialization/format.js +97 -0
  180. package/dist/serialization/hardened.d.ts +155 -0
  181. package/dist/serialization/hardened.d.ts.map +1 -0
  182. package/dist/serialization/hardened.js +523 -0
  183. package/dist/serialization/index.d.ts +20 -0
  184. package/dist/serialization/index.d.ts.map +1 -0
  185. package/dist/serialization/index.js +22 -0
  186. package/dist/serialization/reducers/class-vm.d.ts +20 -0
  187. package/dist/serialization/reducers/class-vm.d.ts.map +1 -0
  188. package/dist/serialization/reducers/class-vm.js +77 -0
  189. package/dist/serialization/reducers/class.d.ts +11 -0
  190. package/dist/serialization/reducers/class.d.ts.map +1 -0
  191. package/dist/serialization/reducers/class.js +73 -0
  192. package/dist/serialization/reducers/common-vm.d.ts +15 -0
  193. package/dist/serialization/reducers/common-vm.d.ts.map +1 -0
  194. package/dist/serialization/reducers/common-vm.js +579 -0
  195. package/dist/serialization/reducers/common.d.ts +16 -0
  196. package/dist/serialization/reducers/common.d.ts.map +1 -0
  197. package/dist/serialization/reducers/common.js +478 -0
  198. package/dist/serialization/reducers/step-function-vm.d.ts +44 -0
  199. package/dist/serialization/reducers/step-function-vm.d.ts.map +1 -0
  200. package/dist/serialization/reducers/step-function-vm.js +97 -0
  201. package/dist/serialization/reducers/step-function.d.ts +35 -0
  202. package/dist/serialization/reducers/step-function.d.ts.map +1 -0
  203. package/dist/serialization/reducers/step-function.js +104 -0
  204. package/dist/serialization/step.d.ts +17 -0
  205. package/dist/serialization/step.d.ts.map +1 -0
  206. package/dist/serialization/step.js +48 -0
  207. package/dist/serialization/types.d.ts +273 -0
  208. package/dist/serialization/types.d.ts.map +1 -0
  209. package/dist/serialization/types.js +35 -0
  210. package/dist/serialization/vm-bundle-entry.d.ts +12 -0
  211. package/dist/serialization/vm-bundle-entry.d.ts.map +1 -0
  212. package/dist/serialization/vm-bundle-entry.js +58 -0
  213. package/dist/serialization/workflow-vm.d.ts +24 -0
  214. package/dist/serialization/workflow-vm.d.ts.map +1 -0
  215. package/dist/serialization/workflow-vm.js +66 -0
  216. package/dist/serialization/workflow.d.ts +29 -0
  217. package/dist/serialization/workflow.d.ts.map +1 -0
  218. package/dist/serialization/workflow.js +54 -0
  219. package/dist/serialization-format.d.ts +60 -4
  220. package/dist/serialization-format.d.ts.map +1 -1
  221. package/dist/serialization-format.js +276 -56
  222. package/dist/serialization.d.ts +374 -221
  223. package/dist/serialization.d.ts.map +1 -1
  224. package/dist/serialization.js +2300 -783
  225. package/dist/set-attributes.d.ts +13 -0
  226. package/dist/set-attributes.d.ts.map +1 -0
  227. package/dist/set-attributes.js +60 -0
  228. package/dist/sleep.d.ts.map +1 -1
  229. package/dist/sleep.js +3 -2
  230. package/dist/source-map.d.ts +25 -0
  231. package/dist/source-map.d.ts.map +1 -1
  232. package/dist/source-map.js +148 -10
  233. package/dist/step/context-storage.d.ts +61 -2
  234. package/dist/step/context-storage.d.ts.map +1 -1
  235. package/dist/step/context-storage.js +7 -5
  236. package/dist/step/get-closure-vars.d.ts.map +1 -1
  237. package/dist/step/get-closure-vars.js +3 -2
  238. package/dist/step/get-step-metadata.d.ts.map +1 -1
  239. package/dist/step/get-step-metadata.js +3 -2
  240. package/dist/step/get-workflow-metadata.d.ts.map +1 -1
  241. package/dist/step/get-workflow-metadata.js +3 -2
  242. package/dist/step/writable-stream.d.ts.map +1 -1
  243. package/dist/step/writable-stream.js +71 -7
  244. package/dist/step.d.ts.map +1 -1
  245. package/dist/step.js +226 -30
  246. package/dist/symbols.d.ts +54 -0
  247. package/dist/symbols.d.ts.map +1 -1
  248. package/dist/symbols.js +55 -1
  249. package/dist/telemetry/semantic-conventions.d.ts +242 -2
  250. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  251. package/dist/telemetry/semantic-conventions.js +173 -1
  252. package/dist/telemetry.d.ts +73 -0
  253. package/dist/telemetry.d.ts.map +1 -1
  254. package/dist/telemetry.js +153 -16
  255. package/dist/types.d.ts +6 -0
  256. package/dist/types.d.ts.map +1 -1
  257. package/dist/types.js +23 -1
  258. package/dist/util.d.ts +16 -6
  259. package/dist/util.d.ts.map +1 -1
  260. package/dist/util.js +25 -16
  261. package/dist/version.d.ts +1 -1
  262. package/dist/version.d.ts.map +1 -1
  263. package/dist/version.js +2 -2
  264. package/dist/vm/index.d.ts.map +1 -1
  265. package/dist/vm/index.js +77 -9
  266. package/dist/vm/script-cache.d.ts +28 -0
  267. package/dist/vm/script-cache.d.ts.map +1 -0
  268. package/dist/vm/script-cache.js +140 -0
  269. package/dist/workflow/abort-controller.d.ts +65 -0
  270. package/dist/workflow/abort-controller.d.ts.map +1 -0
  271. package/dist/workflow/abort-controller.js +314 -0
  272. package/dist/workflow/attribute-dispatcher.d.ts +6 -0
  273. package/dist/workflow/attribute-dispatcher.d.ts.map +1 -0
  274. package/dist/workflow/attribute-dispatcher.js +48 -0
  275. package/dist/workflow/create-hook.d.ts.map +1 -1
  276. package/dist/workflow/create-hook.js +25 -3
  277. package/dist/workflow/define-hook.d.ts +1 -1
  278. package/dist/workflow/define-hook.d.ts.map +1 -1
  279. package/dist/workflow/define-hook.js +8 -4
  280. package/dist/workflow/get-workflow-metadata.d.ts.map +1 -1
  281. package/dist/workflow/get-workflow-metadata.js +14 -3
  282. package/dist/workflow/hook.d.ts.map +1 -1
  283. package/dist/workflow/hook.js +303 -37
  284. package/dist/workflow/index.d.ts +1 -0
  285. package/dist/workflow/index.d.ts.map +1 -1
  286. package/dist/workflow/index.js +5 -3
  287. package/dist/workflow/set-attributes.d.ts +68 -0
  288. package/dist/workflow/set-attributes.d.ts.map +1 -0
  289. package/dist/workflow/set-attributes.js +60 -0
  290. package/dist/workflow/sleep.d.ts.map +1 -1
  291. package/dist/workflow/sleep.js +58 -9
  292. package/dist/workflow/world-init-stub.d.ts +15 -0
  293. package/dist/workflow/world-init-stub.d.ts.map +1 -0
  294. package/dist/workflow/world-init-stub.js +15 -0
  295. package/dist/workflow.d.ts +69 -3
  296. package/dist/workflow.d.ts.map +1 -1
  297. package/dist/workflow.js +791 -554
  298. package/docs/api-reference/create-hook.mdx +79 -0
  299. package/docs/api-reference/create-webhook.mdx +1 -0
  300. package/docs/api-reference/define-hook.mdx +26 -24
  301. package/docs/api-reference/fatal-error.mdx +29 -7
  302. package/docs/api-reference/fetch.mdx +8 -4
  303. package/docs/api-reference/index.mdx +3 -0
  304. package/docs/api-reference/set-attributes.mdx +61 -0
  305. package/docs/api-reference/sleep.mdx +1 -1
  306. package/docs/foundations/cancellation.mdx +459 -0
  307. package/docs/foundations/errors-and-retries.mdx +7 -3
  308. package/docs/foundations/hooks.mdx +29 -0
  309. package/docs/foundations/idempotency.mdx +243 -11
  310. package/docs/foundations/index.mdx +1 -23
  311. package/docs/foundations/meta.json +3 -1
  312. package/docs/foundations/serialization.mdx +77 -41
  313. package/docs/foundations/starting-workflows.mdx +79 -2
  314. package/docs/foundations/streaming.mdx +14 -23
  315. package/docs/foundations/versioning.mdx +263 -0
  316. package/docs/how-it-works/cancellation.mdx +287 -0
  317. package/docs/how-it-works/code-transform.mdx +21 -17
  318. package/docs/how-it-works/encryption.mdx +5 -5
  319. package/docs/how-it-works/event-sourcing.mdx +6 -6
  320. package/docs/how-it-works/framework-integrations.mdx +96 -337
  321. package/docs/how-it-works/meta.json +2 -1
  322. package/package.json +31 -13
  323. package/dist/runtime/step-handler.d.ts +0 -2
  324. package/dist/runtime/step-handler.d.ts.map +0 -1
  325. package/dist/runtime/step-handler.js +0 -678
@@ -57,12 +57,33 @@ export const WorkflowRunStatus = SemanticConvention('workflow.run.status');
57
57
  export const WorkflowStartedAt = SemanticConvention('workflow.started_at');
58
58
  /** Number of events processed during workflow execution */
59
59
  export const WorkflowEventsCount = SemanticConvention('workflow.events.count');
60
+ /** Whether workflow execution starts with replay or resumes a retained VM */
61
+ export const WorkflowExecutionMode = SemanticConvention('workflow.execution.mode');
60
62
  /** Number of arguments passed to the workflow */
61
63
  export const WorkflowArgumentsCount = SemanticConvention('workflow.arguments.count');
62
64
  /** Type of the workflow result */
63
65
  export const WorkflowResultType = SemanticConvention('workflow.result.type');
64
66
  /** Whether trace context was propagated to this workflow execution */
65
67
  export const WorkflowTracePropagated = SemanticConvention('workflow.trace.propagated');
68
+ // QuickJS VM engine attributes
69
+ /** The VM engine executing the workflow function for this invocation */
70
+ export const WorkflowVm = SemanticConvention('workflow.vm');
71
+ /** Outcome of a QuickJS VM workflow invocation */
72
+ export const QuickJSOutcome = SemanticConvention('workflow.vm.outcome');
73
+ /** Whether preloaded events from `events.create('run_started')` were used */
74
+ export const QuickJSEventsPreloaded = SemanticConvention('workflow.vm.events.preloaded');
75
+ /** Total number of events fetched from the world for this invocation */
76
+ export const QuickJSEventsFetchedCount = SemanticConvention('workflow.vm.events.fetched_count');
77
+ /** Number of pages required to fetch all events */
78
+ export const QuickJSEventsFetchedPages = SemanticConvention('workflow.vm.events.fetched_pages');
79
+ /** Number of pending VM operations captured at suspension */
80
+ export const QuickJSPendingOpsCount = SemanticConvention('workflow.vm.pending_ops_count');
81
+ /** Number of steps executed inline (live-VM continuation) this invocation */
82
+ export const QuickJSInlineSteps = SemanticConvention('quickjs.inline_steps');
83
+ /** Active trace-correlation mode for this invocation (linked or continuous) */
84
+ export const WorkflowTraceMode = SemanticConvention('workflow.trace.mode');
85
+ /** Whether this workflow invocation is using the turbo first-delivery path */
86
+ export const WorkflowTurbo = SemanticConvention('workflow.turbo');
66
87
  /** Name of the error that caused workflow failure */
67
88
  export const WorkflowErrorName = SemanticConvention('workflow.error.name');
68
89
  /** Error message when workflow fails */
@@ -75,6 +96,36 @@ export const WorkflowStepsCreated = SemanticConvention('workflow.steps.created')
75
96
  export const WorkflowHooksCreated = SemanticConvention('workflow.hooks.created');
76
97
  /** Number of waits created during workflow execution */
77
98
  export const WorkflowWaitsCreated = SemanticConvention('workflow.waits.created');
99
+ /**
100
+ * Number of inline-owned steps this invocation re-executed because it is a
101
+ * redelivery of their owning queue message (crash recovery for inline
102
+ * steps — see the inline step ownership changelog, workflow#2780).
103
+ */
104
+ export const WorkflowOwnedRecoverySteps = SemanticConvention('workflow.inline_ownership.owned_recovery_steps');
105
+ /**
106
+ * Number of pending steps for which this replay suppressed the immediate
107
+ * requeue (another invocation inline-owns them under a live lease) and
108
+ * ensured a delayed backstop wake instead.
109
+ */
110
+ export const WorkflowBackstopWakesArmed = SemanticConvention('workflow.inline_ownership.backstop_wakes_armed');
111
+ // Route attributes
112
+ /** The workflow runtime route being handled */
113
+ export const WorkflowRouteType = SemanticConvention('workflow.route.type');
114
+ /** Whether this route invocation reused an already-created request handler */
115
+ export const WorkflowRouteHandlerCached = SemanticConvention('workflow.route.handler_cached');
116
+ /** Number of times this in-memory route handler has been invoked */
117
+ export const WorkflowRouteInvocationCount = SemanticConvention('workflow.route.invocation_count');
118
+ /** Time since this route entrypoint was constructed, in milliseconds */
119
+ export const WorkflowRouteEntrypointAgeMs = SemanticConvention('workflow.route.entrypoint_age_ms');
120
+ /** Time spent evaluating the generated route module body before creating the entrypoint */
121
+ export const WorkflowRouteModuleBodyInitMs = SemanticConvention('workflow.route.module_body_init_ms');
122
+ /**
123
+ * Compute instance handling this route — the synthesized `COMPUTE_INSTANCE_ID`.
124
+ * Uses OTEL `faas.instance` (execution-environment id, reused across
125
+ * invocations to the same function):
126
+ * https://opentelemetry.io/docs/specs/semconv/attributes-registry/faas/
127
+ */
128
+ export const FaasInstance = SemanticConvention('faas.instance');
78
129
  // Step attributes
79
130
  /** Name of the step function being executed */
80
131
  export const StepName = SemanticConvention('step.name');
@@ -88,6 +139,45 @@ export const StepStatus = SemanticConvention('step.status');
88
139
  export const StepMaxRetries = SemanticConvention('step.max_retries');
89
140
  /** Whether trace context was propagated to this step execution */
90
141
  export const StepTracePropagated = SemanticConvention('step.trace.propagated');
142
+ /**
143
+ * Client-measured time-to-first-step latency in milliseconds: run creation →
144
+ * this step's body beginning to execute, minus pre-step hook-creation time.
145
+ * Only present on the run's first step execution when it qualified for
146
+ * measurement (see runtime/step-latency.ts).
147
+ */
148
+ export const StepTtfsMs = SemanticConvention('step.ttfs_ms');
149
+ /**
150
+ * Client-measured step-to-step overhead in milliseconds: the previous step's
151
+ * terminal event → this step's body beginning to execute. Only present when
152
+ * the two steps ran back-to-back.
153
+ */
154
+ export const StepStsoMs = SemanticConvention('step.stso_ms');
155
+ /**
156
+ * Client-measured run_started-to-first-step latency in milliseconds: the
157
+ * `run_started` response landing (or, under turbo, the local run synthesis
158
+ * instant) → this step's start POST being issued. A sub-window of ttfs that
159
+ * isolates replay overhead from the run-creation queue hop. Only present on
160
+ * the run's first step execution when it qualified for measurement (see
161
+ * runtime/step-latency.ts).
162
+ */
163
+ export const StepRsfsMs = SemanticConvention('step.rsfs_ms');
164
+ /**
165
+ * Client-measured synchronous workflow-function replay duration in
166
+ * milliseconds, excluding awaited network I/O, of only the FINAL replay pass
167
+ * within the rsfs window — the pass that reached and scheduled the first
168
+ * step. Not accumulated across earlier pre-first-step passes (e.g. a
169
+ * workflow-body `setAttributes()` detour replays more than once, and a
170
+ * redelivery omits earlier invocations' work entirely), so this must not be
171
+ * read as "the replay portion of rsfs" — step.rsfs_ms covers the whole
172
+ * window. Only present alongside step.rsfs_ms and only for the run's first
173
+ * step (see runtime/step-latency.ts).
174
+ */
175
+ export const StepFinalSchedulingReplayMs = SemanticConvention('step.final_scheduling_replay_ms');
176
+ /**
177
+ * Runtime startup-latency optimizations active for the ttfs/stso measurement
178
+ * (e.g. 'turbo', 'lazyStepStart', 'optimisticStart').
179
+ */
180
+ export const StepLatencyOptimizations = SemanticConvention('step.latency_optimizations');
91
181
  /** Whether the step was skipped during execution */
92
182
  export const StepSkipped = SemanticConvention('step.skipped');
93
183
  /** Reason why the step was skipped */
@@ -123,6 +213,12 @@ export const QueueOverheadMs = SemanticConvention('workflow.queue.overhead_ms');
123
213
  // Deployment attributes
124
214
  /** Unique identifier for the deployment environment */
125
215
  export const DeploymentId = SemanticConvention('deployment.id');
216
+ /** The deployment a run is pinned to, set only on a misrouted delivery. */
217
+ export const WorkflowRunPinnedDeploymentId = SemanticConvention('workflow.deployment.pinned_id');
218
+ /** Re-route attempts for this misrouted delivery, including this one. */
219
+ export const WorkflowDeploymentMismatchRetryCount = SemanticConvention('workflow.deployment_mismatch.retry_count');
220
+ /** Whether the misrouted delivery was re-routed instead of failing the run. */
221
+ export const WorkflowDeploymentMismatchRecovered = SemanticConvention('workflow.deployment_mismatch.recovered');
126
222
  // Hook attributes
127
223
  /** Token identifying a specific hook */
128
224
  export const HookToken = SemanticConvention('workflow.hook.token');
@@ -130,6 +226,52 @@ export const HookToken = SemanticConvention('workflow.hook.token');
130
226
  export const HookId = SemanticConvention('workflow.hook.id');
131
227
  /** Whether a hook was found by its token */
132
228
  export const HookFound = SemanticConvention('workflow.hook.found');
229
+ /**
230
+ * Producer-side signal (on the `hook.resume` span) that the direct
231
+ * `hook_received` write failed transiently but the queue dispatch succeeded, so
232
+ * the resume is recovered via the consumer's re-ensure. Corresponds to
233
+ * `ResumedHook.resilientResume === true`.
234
+ */
235
+ export const HookResilientResume = SemanticConvention('workflow.hook.resilient_resume');
236
+ /**
237
+ * Consumer-side signal (on the workflow execution span) that this replay
238
+ * materialized the `hook_received` event from the queue message's `hookInput`
239
+ * because the producer's direct write had not landed — the completion of the
240
+ * recovery path {@link HookResilientResume} began.
241
+ *
242
+ * Legacy / non-atomic re-ensure signal only. Atomic lazy resumes
243
+ * (resumeId + digest) go through the hoisted preload write instead, whose
244
+ * response cannot tell whether the producer or the consumer won the
245
+ * `(runId, resumeId)` claim — so this attribute is deliberately NOT emitted
246
+ * for them (emitting `true` unconditionally would count every producer-won
247
+ * resume as a recovery). The producer-begin ({@link HookResilientResume}) /
248
+ * consumer-materialized pairing is therefore no longer complete for atomic
249
+ * lazy resumptions; use {@link HookResumeSetupSource} to observe that path.
250
+ */
251
+ export const HookResilientResumeMaterialized = SemanticConvention('workflow.hook.resilient_resume_materialized');
252
+ /**
253
+ * Consumer-side signal (on the workflow execution span) of how a lazy hook
254
+ * resume initialized its replay state:
255
+ *
256
+ * - `hook_received_stream` — the hoisted `hook_received` write returned a
257
+ * usable replay preload (run + complete event log), so the invocation
258
+ * skipped both the `run_started` write and the initial `events.list`.
259
+ * - `hook_received_fallback` — the hoisted write succeeded but returned no
260
+ * usable preload (a CBOR response from an older server, a World that
261
+ * ignored the opt-in, a bounded `hasMore` page, or a preload that failed
262
+ * validation); the invocation fell back to the `run_started` setup without
263
+ * re-posting the hook.
264
+ *
265
+ * Absent on legacy hook deliveries (no resumeId/digest) and on every other
266
+ * delivery kind, which take the `run_started` setup unconditionally.
267
+ *
268
+ * This is a latency/setup-path signal: it says which requests initialized
269
+ * the invocation, NOT that this consumer created the `hook_received` event
270
+ * (the hoisted write may equally have converged on the producer's — claim
271
+ * ownership is not observable client-side; cf.
272
+ * {@link HookResilientResumeMaterialized}).
273
+ */
274
+ export const HookResumeSetupSource = SemanticConvention('workflow.resume_setup_source');
133
275
  // Webhook attributes
134
276
  /** Number of webhook handlers triggered */
135
277
  export const WebhookHandlersTriggered = SemanticConvention('webhook.handlers.triggered');
@@ -142,6 +284,8 @@ export const WorkflowSuspensionWaitCount = SemanticConvention('workflow.suspensi
142
284
  // See: https://opentelemetry.io/docs/specs/semconv/http/http-spans/
143
285
  /** HTTP request method (standard OTEL: http.request.method) */
144
286
  export const HttpRequestMethod = SemanticConvention('http.request.method');
287
+ /** Route pattern for the request (standard OTEL: http.route) */
288
+ export const HttpRoute = SemanticConvention('http.route');
145
289
  /** Full URL of the request (standard OTEL: url.full) */
146
290
  export const UrlFull = SemanticConvention('url.full');
147
291
  /** Server hostname (standard OTEL: server.address) */
@@ -165,6 +309,34 @@ export const QueueDeserializeTimeMs = SemanticConvention('workflow.queue.deseria
165
309
  export const QueueExecutionTimeMs = SemanticConvention('workflow.queue.execution_time_ms');
166
310
  /** Time spent serializing the response in milliseconds */
167
311
  export const QueueSerializeTimeMs = SemanticConvention('workflow.queue.serialize_time_ms');
312
+ // Payload compression attributes (zstd preferred, gzip fallback; specVersion >= 5)
313
+ //
314
+ // Sizes are measured at the compression boundary: before encryption on the
315
+ // write path and after decryption on the read path. They therefore reflect
316
+ // compression's effect, not the at-rest size (which also includes the
317
+ // ~28-byte `encr` envelope and, on some backends, base64 expansion).
318
+ /** Whether this serialize/deserialize was a write or read. */
319
+ export const SerializationOperation = SemanticConvention('workflow.serialization.operation');
320
+ /** Whether a compression codec was applied (write) / present (read). */
321
+ export const SerializationCompressed = SemanticConvention('workflow.serialization.compressed');
322
+ /** Which compression codec applied / was present (`zstd`, `gzip`, or `none`). */
323
+ export const SerializationCodec = SemanticConvention('workflow.serialization.codec');
324
+ /** Logical (uncompressed, devalue-prefixed) payload size in bytes. */
325
+ export const SerializationUncompressedBytes = SemanticConvention('workflow.serialization.uncompressed_bytes');
326
+ /** Stored (post-compression, pre-encryption) payload size in bytes. */
327
+ export const SerializationStoredBytes = SemanticConvention('workflow.serialization.stored_bytes');
328
+ /** Fraction of bytes saved by compression (0..1); set only when compressed. */
329
+ export const SerializationCompressionRatio = SemanticConvention('workflow.serialization.compression_ratio');
330
+ /**
331
+ * Number of workflow (guest) code executions serialization could not avoid
332
+ * (getters, proxies, custom serializers); set only when non-zero.
333
+ */
334
+ export const SerializationGuestCodeExecutions = SemanticConvention('workflow.serialization.guest_code_executions');
335
+ /**
336
+ * Deduplicated `kind (detail)` descriptions of the guest-code executions;
337
+ * set only when non-zero.
338
+ */
339
+ export const SerializationGuestCodeDetails = SemanticConvention('workflow.serialization.guest_code_details');
168
340
  // RPC/Peer Service attributes - For service maps and dependency tracking
169
341
  // See: https://opentelemetry.io/docs/specs/semconv/rpc/rpc-spans/
170
342
  /** The remote service name for Datadog service maps (Datadog-specific: peer.service) */
@@ -181,4 +353,4 @@ export const RpcMethod = SemanticConvention('rpc.method');
181
353
  export const ErrorRetryable = SemanticConvention('error.retryable');
182
354
  /** Error category (workflow-specific: fatal, retryable, transient) */
183
355
  export const ErrorCategory = SemanticConvention('error.category');
184
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VtYW50aWMtY29udmVudGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUNHO0FBSUg7Ozs7R0FJRztBQUNILFNBQVMsa0JBQWtCLENBQUksR0FBRyxLQUFlO0lBQy9DLE9BQU8sQ0FBQyxLQUFRLEVBQUUsRUFBRSxDQUNsQixNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBVSxDQUFDLENBQUMsQ0FBQztBQUNwRSxDQUFDO0FBRUQsc0JBQXNCO0FBRXRCLDhDQUE4QztBQUM5QyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsa0JBQWtCLENBQVMsZUFBZSxDQUFDLENBQUM7QUFFeEUsb0RBQW9EO0FBQ3BELE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLGtCQUFrQixDQUVqRCxvQkFBb0IsQ0FBQyxDQUFDO0FBRXhCLDZEQUE2RDtBQUM3RCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsa0JBQWtCLENBQVMsaUJBQWlCLENBQUMsQ0FBQztBQUUzRSx5Q0FBeUM7QUFDekMsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsa0JBQWtCLENBRWpELHFCQUFxQixDQUFDLENBQUM7QUFFekIscUVBQXFFO0FBQ3JFLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLGtCQUFrQixDQUNqRCxxQkFBcUIsQ0FDdEIsQ0FBQztBQUVGLDJEQUEyRDtBQUMzRCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxrQkFBa0IsQ0FDbkQsdUJBQXVCLENBQ3hCLENBQUM7QUFFRixpREFBaUQ7QUFDakQsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsa0JBQWtC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a0IsQ0FDdEQsb0NBQW9DLENBQ3JDLENBQUM7QUFFRiw2REFBNkQ7QUFDN0QsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsa0JBQWtCLENBQ3BELGtDQUFrQyxDQUNuQyxDQUFDO0FBRUYsMERBQTBEO0FBQzFELE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLGtCQUFrQixDQUNwRCxrQ0FBa0MsQ0FDbkMsQ0FBQztBQUVGLHlFQUF5RTtBQUN6RSxrRUFBa0U7QUFFbEUsd0ZBQXdGO0FBQ3hGLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBUyxjQUFjLENBQUMsQ0FBQztBQUV0RSx3REFBd0Q7QUFDeEQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLGtCQUFrQixDQUFTLFlBQVksQ0FBQyxDQUFDO0FBRWxFLG9EQUFvRDtBQUNwRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsa0JBQWtCLENBQVMsYUFBYSxDQUFDLENBQUM7QUFFcEUsa0RBQWtEO0FBQ2xELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxrQkFBa0IsQ0FBUyxZQUFZLENBQUMsQ0FBQztBQUVsRSxxREFBcUQ7QUFDckQsZ0ZBQWdGO0FBRWhGLHlEQUF5RDtBQUN6RCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsa0JBQWtCLENBQVUsaUJBQWlCLENBQUMsQ0FBQztBQUU3RSxzRUFBc0U7QUFDdEUsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLGtCQUFrQixDQUU3QyxnQkFBZ0IsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBPcGVuVGVsZW1ldHJ5IHNlbWFudGljIGNvbnZlbnRpb25zIGZvciBWZXJjZWwgV29ya2Zsb3cgdGVsZW1ldHJ5LlxuICpcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHN0YW5kYXJkaXplZCB0ZWxlbWV0cnkgYXR0cmlidXRlcyBmb2xsb3dpbmcgT3BlblRlbGVtZXRyeSBzZW1hbnRpYyBjb252ZW50aW9uc1xuICogZm9yIGluc3RydW1lbnRpbmcgd29ya2Zsb3cgZXhlY3V0aW9uLCBzdGVwIHByb2Nlc3NpbmcsIGFuZCByZWxhdGVkIG9wZXJhdGlvbnMuIEVhY2ggZXhwb3J0ZWQgZnVuY3Rpb25cbiAqIGNyZWF0ZXMgYSBwcm9wZXJseSBmb3JtYXR0ZWQgYXR0cmlidXRlIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHdpdGggT3BlblRlbGVtZXRyeSBzcGFucy5cbiAqXG4gKiBUaGUgc2VtYW50aWMgY29udmVudGlvbnMgYXJlIG9yZ2FuaXplZCBpbnRvIHNldmVyYWwgY2F0ZWdvcmllczpcbiAqIC0gKipXb3JrZmxvdyBhdHRyaWJ1dGVzKio6IFRyYWNrIHdvcmtmbG93IGxpZmVjeWNsZSwgc3RhdHVzLCBhbmQgbWV0YWRhdGFcbiAqIC0gKipTdGVwIGF0dHJpYnV0ZXMqKjogTW9uaXRvciBpbmRpdmlkdWFsIHN0ZXAgZXhlY3V0aW9uLCByZXRyaWVzLCBhbmQgcmVzdWx0c1xuICogLSAqKlF1ZXVlIGF0dHJpYnV0ZXMqKjogSW5zdHJ1bWVudCBtZXNzYWdlIHF1ZXVlIG9wZXJhdGlvbnNcbiAqIC0gKipEZXBsb3ltZW50IGF0dHJpYnV0ZXMqKjogQ2FwdHVyZSBkZXBsb3ltZW50IGVudmlyb25tZW50IGluZm9ybWF0aW9uXG4gKlxuICogQWxsIGF0dHJpYnV0ZSBmdW5jdGlvbnMgYXJlIHR5cGUtc2FmZSBhbmQgbGV2ZXJhZ2UgZXhpc3RpbmcgYmFja2VuZCB0eXBlcyB0byBlbnN1cmVcbiAqIGNvbnNpc3RlbmN5IGJldHdlZW4gdGVsZW1ldHJ5IGRhdGEgYW5kIGFjdHVhbCBzeXN0ZW0gc3RhdGUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCAqIGFzIEF0dHJpYnV0ZSBmcm9tICcuL3RlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy5qcyc7XG4gKlxuICogLy8gU2V0IHdvcmtmbG93IGF0dHJpYnV0ZXMgb24gYSBzcGFuXG4gKiBzcGFuLnNldEF0dHJpYnV0ZXMoe1xuICogICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dOYW1lKCdteS13b3JrZmxvdycpLFxuICogICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dPcGVyYXRpb24oJ3N0YXJ0JyksXG4gKiAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cygncnVubmluZycpLFxuICogfSk7XG4gKlxuICogLy8gU2V0IHN0ZXAgYXR0cmlidXRlc1xuICogc3Bhbi5zZXRBdHRyaWJ1dGVzKHtcbiAqICAgLi4uQXR0cmlidXRlLlN0ZXBOYW1lKCdwcm9jZXNzLWRhdGEnKSxcbiAqICAgLi4uQXR0cmlidXRlLlN0ZXBTdGF0dXMoJ2NvbXBsZXRlZCcpLFxuICogICAuLi5BdHRyaWJ1dGUuU3RlcEF0dGVtcHQoMSksXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vb3BlbnRlbGVtZXRyeS5pby9kb2NzL3NwZWNzL3NlbWNvbnYvfSBPcGVuVGVsZW1ldHJ5IFNlbWFudGljIENvbnZlbnRpb25zXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IE1lc3NhZ2VJZCwgU3RlcCwgV29ya2Zsb3dSdW4gfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBzZW1hbnRpYyBjb252ZW50aW9uIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhbiBhdHRyaWJ1dGUgb2JqZWN0LlxuICogQHBhcmFtIG5hbWUgLSBUaGUgYXR0cmlidXRlIG5hbWUgZm9sbG93aW5nIE9wZW5UZWxlbWV0cnkgc2VtYW50aWMgY29udmVudGlvbnNcbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIHZhbHVlIGFuZCByZXR1cm5zIGFuIGF0dHJpYnV0ZSBvYmplY3RcbiAqL1xuZnVuY3Rpb24gU2VtYW50aWNDb252ZW50aW9uPFQ+KC4uLm5hbWVzOiBzdHJpbmdbXSkge1xuICByZXR1cm4gKHZhbHVlOiBUKSA9PlxuICAgIE9iamVjdC5mcm9tRW50cmllcyhuYW1lcy5tYXAoKG5hbWUpID0+IFtuYW1lLCB2YWx1ZV0gYXMgY29uc3QpKTtcbn1cblxuLy8gV29ya2Zsb3cgYXR0cmlidXRlc1xuXG4vKiogVGhlIG5hbWUgb2YgdGhlIHdvcmtmbG93IGJlaW5nIGV4ZWN1dGVkICovXG5leHBvcnQgY29uc3QgV29ya2Zsb3dOYW1lID0gU2VtYW50aWNDb252ZW50aW9uPHN0cmluZz4oJ3dvcmtmbG93Lm5hbWUnKTtcblxuLyoqIFRoZSBvcGVyYXRpb24gYmVpbmcgcGVyZm9ybWVkIG9uIHRoZSB3b3JrZmxvdyAqL1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93T3BlcmF0aW9uID0gU2VtYW50aWNDb252ZW50aW9uPFxuICAnc3RhcnQnIHwgJ2V4ZWN1dGUnIHwgJ3J1bidcbj4oJ3dvcmtmbG93Lm9wZXJhdGlvbicpO1xuXG4vKiogVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc3BlY2lmaWMgd29ya2Zsb3cgcnVuIGluc3RhbmNlICovXG5leHBvcnQgY29uc3QgV29ya2Zsb3dSdW5JZCA9IFNlbWFudGljQ29udmVudGlvbjxzdHJpbmc+KCd3b3JrZmxvdy5ydW4uaWQnKTtcblxuLyoqIEN1cnJlbnQgc3RhdHVzIG9mIHRoZSB3b3JrZmxvdyBydW4gKi9cbmV4cG9ydCBjb25zdCBXb3JrZmxvd1J1blN0YXR1cyA9IFNlbWFudGljQ29udmVudGlvbjxcbiAgV29ya2Zsb3dSdW5bJ3N0YXR1cyddIHwgJ3dvcmtmbG93X3N1c3BlbmRlZCdcbj4oJ3dvcmtmbG93LnJ1bi5zdGF0dXMnKTtcblxuLyoqIFRpbWVzdGFtcCB3aGVuIHRoZSB3b3JrZmxvdyBleGVjdXRpb24gc3RhcnRlZCAoVW5peCB0aW1lc3RhbXApICovXG5leHBvcnQgY29uc3QgV29ya2Zsb3dTdGFydGVkQXQgPSBTZW1hbnRpY0NvbnZlbnRpb248bnVtYmVyPihcbiAgJ3dvcmtmbG93LnN0YXJ0ZWRfYXQnXG4pO1xuXG4vKiogTnVtYmVyIG9mIGV2ZW50cyBwcm9jZXNzZWQgZHVyaW5nIHdvcmtmbG93IGV4ZWN1dGlvbiAqL1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93RXZlbnRzQ291bnQgPSBTZW1hbnRpY0NvbnZlbnRpb248bnVtYmVyPihcbiAgJ3dvcmtmbG93LmV2ZW50cy5jb3VudCdcbik7XG5cbi8qKiBOdW1iZXIgb2YgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgd29ya2Zsb3cgKi9cbmV4cG9ydCBjb25zdCBXb3JrZmxvd0FyZ3VtZW50c0NvdW50ID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oXG4gICd3b3JrZmxvdy5hcmd1bWVudHMuY291bnQnXG4pO1xuXG4vKiogVHlwZSBvZiB0aGUgd29ya2Zsb3cgcmVzdWx0ICovXG5leHBvcnQgY29uc3QgV29ya2Zsb3dSZXN1bHRUeXBlID0gU2VtYW50aWNDb252ZW50aW9uPHN0cmluZz4oXG4gICd3b3JrZmxvdy5yZXN1bHQudHlwZSdcbik7XG5cbi8qKiBXaGV0aGVyIHRyYWNlIGNvbnRleHQgd2FzIHByb3BhZ2F0ZWQgdG8gdGhpcyB3b3JrZmxvdyBleGVjdXRpb24gKi9cbmV4cG9ydCBjb25zdCBXb3JrZmxvd1RyYWNlUHJvcGFnYXRlZCA9IFNlbWFudGljQ29udmVudGlvbjxib29sZWFuPihcbiAgJ3dvcmtmbG93LnRyYWNlLnByb3BhZ2F0ZWQnXG4pO1xuXG4vKiogTmFtZSBvZiB0aGUgZXJyb3IgdGhhdCBjYXVzZWQgd29ya2Zsb3cgZmFpbHVyZSAqL1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93RXJyb3JOYW1lID0gU2VtYW50aWNDb252ZW50aW9uPHN0cmluZz4oXG4gICd3b3JrZmxvdy5lcnJvci5uYW1lJ1xuKTtcblxuLyoqIEVycm9yIG1lc3NhZ2Ugd2hlbiB3b3JrZmxvdyBmYWlscyAqL1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93RXJyb3JNZXNzYWdlID0gU2VtYW50aWNDb252ZW50aW9uPHN0cmluZz4oXG4gICd3b3JrZmxvdy5lcnJvci5tZXNzYWdlJ1xuKTtcblxuLyoqIEVycm9yIGNsYXNzaWZpY2F0aW9uIGNvZGUgKFVTRVJfRVJST1IsIFJVTlRJTUVfRVJST1IsIGV0Yy4pICovXG5leHBvcnQgY29uc3QgV29ya2Zsb3dFcnJvckNvZGUgPSBTZW1hbnRpY0NvbnZlbnRpb248c3RyaW5nPihcbiAgJ3dvcmtmbG93LmVycm9yLmNvZGUnXG4pO1xuXG4vKiogTnVtYmVyIG9mIHN0ZXBzIGNyZWF0ZWQgZHVyaW5nIHdvcmtmbG93IGV4ZWN1dGlvbiAqL1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93U3RlcHNDcmVhdGVkID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oXG4gICd3b3JrZmxvdy5zdGVwcy5jcmVhdGVkJ1xuKTtcblxuLyoqIE51bWJlciBvZiBob29rcyBjcmVhdGVkIGR1cmluZyB3b3JrZmxvdyBleGVjdXRpb24gKi9cbmV4cG9ydCBjb25zdCBXb3JrZmxvd0hvb2tzQ3JlYXRlZCA9IFNlbWFudGljQ29udmVudGlvbjxudW1iZXI+KFxuICAnd29ya2Zsb3cuaG9va3MuY3JlYXRlZCdcbik7XG5cbi8qKiBOdW1iZXIgb2Ygd2FpdHMgY3JlYXRlZCBkdXJpbmcgd29ya2Zsb3cgZXhlY3V0aW9uICovXG5leHBvcnQgY29uc3QgV29ya2Zsb3dXYWl0c0NyZWF0ZWQgPSBTZW1hbnRpY0NvbnZlbnRpb248bnVtYmVyPihcbiAgJ3dvcmtmbG93LndhaXRzLmNyZWF0ZWQnXG4pO1xuXG4vLyBTdGVwIGF0dHJpYnV0ZXNcblxuLyoqIE5hbWUgb2YgdGhlIHN0ZXAgZnVuY3Rpb24gYmVpbmcgZXhlY3V0ZWQgKi9cbmV4cG9ydCBjb25zdCBTdGVwTmFtZSA9IFNlbWFudGljQ29udmVudGlvbjxzdHJpbmc+KCdzdGVwLm5hbWUnKTtcblxuLyoqIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgc3RlcCBpbnN0YW5jZSAqL1xuZXhwb3J0IGNvbnN0IFN0ZXBJZCA9IFNlbWFudGljQ29udmVudGlvbjxzdHJpbmc+KCdzdGVwLmlkJyk7XG5cbi8qKiBDdXJyZW50IGF0dGVtcHQgbnVtYmVyIGZvciBzdGVwIGV4ZWN1dGlvbiAoc3RhcnRzIGF0IDEpICovXG5leHBvcnQgY29uc3QgU3RlcEF0dGVtcHQgPSBTZW1hbnRpY0NvbnZlbnRpb248bnVtYmVyPignc3RlcC5hdHRlbXB0Jyk7XG5cbi8qKiBDdXJyZW50IHN0YXR1cyBvZiB0aGUgc3RlcCAqL1xuZXhwb3J0IGNvbnN0IFN0ZXBTdGF0dXMgPSBTZW1hbnRpY0NvbnZlbnRpb248U3RlcFsnc3RhdHVzJ10+KCdzdGVwLnN0YXR1cycpO1xuXG4vKiogTWF4aW11bSBudW1iZXIgb2YgcmV0cmllcyBhbGxvd2VkIGZvciB0aGlzIHN0ZXAgKi9cbmV4cG9ydCBjb25zdCBTdGVwTWF4UmV0cmllcyA9IFNlbWFudGljQ29udmVudGlvbjxudW1iZXI+KCdzdGVwLm1heF9yZXRyaWVzJyk7XG5cbi8qKiBXaGV0aGVyIHRyYWNlIGNvbnRleHQgd2FzIHByb3BhZ2F0ZWQgdG8gdGhpcyBzdGVwIGV4ZWN1dGlvbiAqL1xuZXhwb3J0IGNvbnN0IFN0ZXBUcmFjZVByb3BhZ2F0ZWQgPSBTZW1hbnRpY0NvbnZlbnRpb248Ym9vbGVhbj4oXG4gICdzdGVwLnRyYWNlLnByb3BhZ2F0ZWQnXG4pO1xuXG4vKiogV2hldGhlciB0aGUgc3RlcCB3YXMgc2tpcHBlZCBkdXJpbmcgZXhlY3V0aW9uICovXG5leHBvcnQgY29uc3QgU3RlcFNraXBwZWQgPSBTZW1hbnRpY0NvbnZlbnRpb248Ym9vbGVhbj4oJ3N0ZXAuc2tpcHBlZCcpO1xuXG4vKiogUmVhc29uIHdoeSB0aGUgc3RlcCB3YXMgc2tpcHBlZCAqL1xuZXhwb3J0IGNvbnN0IFN0ZXBTa2lwUmVhc29uID1cbiAgU2VtYW50aWNDb252ZW50aW9uPFN0ZXBbJ3N0YXR1cyddPignc3RlcC5za2lwX3JlYXNvbicpO1xuXG4vKiogTnVtYmVyIG9mIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIHN0ZXAgZnVuY3Rpb24gKi9cbmV4cG9ydCBjb25zdCBTdGVwQXJndW1lbnRzQ291bnQgPSBTZW1hbnRpY0NvbnZlbnRpb248bnVtYmVyPihcbiAgJ3N0ZXAuYXJndW1lbnRzLmNvdW50J1xuKTtcblxuLyoqIFR5cGUgb2YgdGhlIHN0ZXAgcmVzdWx0ICovXG5leHBvcnQgY29uc3QgU3RlcFJlc3VsdFR5cGUgPSBTZW1hbnRpY0NvbnZlbnRpb248c3RyaW5nPignc3RlcC5yZXN1bHQudHlwZScpO1xuXG4vKiogTmFtZSBvZiB0aGUgZXJyb3IgdGhhdCBjYXVzZWQgc3RlcCBmYWlsdXJlICovXG5leHBvcnQgY29uc3QgU3RlcEVycm9yTmFtZSA9IFNlbWFudGljQ29udmVudGlvbjxzdHJpbmc+KCdzdGVwLmVycm9yLm5hbWUnKTtcblxuLyoqIEVycm9yIG1lc3NhZ2Ugd2hlbiBzdGVwIGZhaWxzICovXG5leHBvcnQgY29uc3QgU3RlcEVycm9yTWVzc2FnZSA9XG4gIFNlbWFudGljQ29udmVudGlvbjxzdHJpbmc+KCdzdGVwLmVycm9yLm1lc3NhZ2UnKTtcblxuLyoqIFdoZXRoZXIgdGhlIHN0ZXAgZmFpbGVkIHdpdGggYSBmYXRhbCBlcnJvciAobm8gcmV0cmllcykgKi9cbmV4cG9ydCBjb25zdCBTdGVwRmF0YWxFcnJvciA9IFNlbWFudGljQ29udmVudGlvbjxib29sZWFuPignc3RlcC5mYXRhbF9lcnJvcicpO1xuXG4vKiogV2hldGhlciBhbGwgcmV0cnkgYXR0ZW1wdHMgaGF2ZSBiZWVuIGV4aGF1c3RlZCAqL1xuZXhwb3J0IGNvbnN0IFN0ZXBSZXRyeUV4aGF1c3RlZCA9IFNlbWFudGljQ29udmVudGlvbjxib29sZWFuPihcbiAgJ3N0ZXAucmV0cnkuZXhoYXVzdGVkJ1xuKTtcblxuLyoqIE51bWJlciBvZiBzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIG5leHQgcmV0cnkgYXR0ZW1wdCAqL1xuZXhwb3J0IGNvbnN0IFN0ZXBSZXRyeVRpbWVvdXRTZWNvbmRzID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oXG4gICdzdGVwLnJldHJ5LnRpbWVvdXRfc2Vjb25kcydcbik7XG5cbi8qKiBXaGV0aGVyIHRoZSBzdGVwIHdpbGwgYmUgcmV0cmllZCBhZnRlciB0aGlzIGZhaWx1cmUgKi9cbmV4cG9ydCBjb25zdCBTdGVwUmV0cnlXaWxsUmV0cnkgPSBTZW1hbnRpY0NvbnZlbnRpb248Ym9vbGVhbj4oXG4gICdzdGVwLnJldHJ5LndpbGxfcmV0cnknXG4pO1xuXG4vLyBRdWV1ZS9NZXNzYWdpbmcgYXR0cmlidXRlcyAtIFN0YW5kYXJkIE9URUwgbWVzc2FnaW5nIGNvbnZlbnRpb25zXG4vLyBTZWU6IGh0dHBzOi8vb3BlbnRlbGVtZXRyeS5pby9kb2NzL3NwZWNzL3NlbWNvbnYvbWVzc2FnaW5nL21lc3NhZ2luZy1zcGFucy9cblxuLyoqIE1lc3NhZ2luZyBzeXN0ZW0gaWRlbnRpZmllciAoc3RhbmRhcmQgT1RFTDogbWVzc2FnaW5nLnN5c3RlbSkgKi9cbmV4cG9ydCBjb25zdCBNZXNzYWdpbmdTeXN0ZW0gPSBTZW1hbnRpY0NvbnZlbnRpb248c3RyaW5nPignbWVzc2FnaW5nLnN5c3RlbScpO1xuXG4vKiogRGVzdGluYXRpb24gbmFtZS9xdWV1ZSBuYW1lIChzdGFuZGFyZCBPVEVMOiBtZXNzYWdpbmcuZGVzdGluYXRpb24ubmFtZSkgKi9cbmV4cG9ydCBjb25zdCBNZXNzYWdpbmdEZXN0aW5hdGlvbk5hbWUgPSBTZW1hbnRpY0NvbnZlbnRpb248c3RyaW5nPihcbiAgJ21lc3NhZ2luZy5kZXN0aW5hdGlvbi5uYW1lJ1xuKTtcblxuLyoqIFRoZSBtZXNzYWdlIGlkIGJlaW5nIGhhbmRsZWQgKHN0YW5kYXJkIE9URUw6IG1lc3NhZ2luZy5tZXNzYWdlLmlkKSAqL1xuZXhwb3J0IGNvbnN0IE1lc3NhZ2luZ01lc3NhZ2VJZCA9IFNlbWFudGljQ29udmVudGlvbjxNZXNzYWdlSWQ+KFxuICAnbWVzc2FnaW5nLm1lc3NhZ2UuaWQnXG4pO1xuXG4vKiogT3BlcmF0aW9uIHR5cGUgKHN0YW5kYXJkIE9URUw6IG1lc3NhZ2luZy5vcGVyYXRpb24udHlwZSkgKi9cbmV4cG9ydCBjb25zdCBNZXNzYWdpbmdPcGVyYXRpb25UeXBlID0gU2VtYW50aWNDb252ZW50aW9uPFxuICAncHVibGlzaCcgfCAncmVjZWl2ZScgfCAncHJvY2Vzcydcbj4oJ21lc3NhZ2luZy5vcGVyYXRpb24udHlwZScpO1xuXG4vKiogVGltZSB0YWtlbiB0byBlbnF1ZXVlIHRoZSBtZXNzYWdlIGluIG1pbGxpc2Vjb25kcyAod29ya2Zsb3ctc3BlY2lmaWMpICovXG5leHBvcnQgY29uc3QgUXVldWVPdmVyaGVhZE1zID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oXG4gICd3b3JrZmxvdy5xdWV1ZS5vdmVyaGVhZF9tcydcbik7XG5cbi8vIERlcGxveW1lbnQgYXR0cmlidXRlc1xuXG4vKiogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBkZXBsb3ltZW50IGVudmlyb25tZW50ICovXG5leHBvcnQgY29uc3QgRGVwbG95bWVudElkID0gU2VtYW50aWNDb252ZW50aW9uPHN0cmluZz4oJ2RlcGxveW1lbnQuaWQnKTtcblxuLy8gSG9vayBhdHRyaWJ1dGVzXG5cbi8qKiBUb2tlbiBpZGVudGlmeWluZyBhIHNwZWNpZmljIGhvb2sgKi9cbmV4cG9ydCBjb25zdCBIb29rVG9rZW4gPSBTZW1hbnRpY0NvbnZlbnRpb248c3RyaW5nPignd29ya2Zsb3cuaG9vay50b2tlbicpO1xuXG4vKiogVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgaG9vayBpbnN0YW5jZSAqL1xuZXhwb3J0IGNvbnN0IEhvb2tJZCA9IFNlbWFudGljQ29udmVudGlvbjxzdHJpbmc+KCd3b3JrZmxvdy5ob29rLmlkJyk7XG5cbi8qKiBXaGV0aGVyIGEgaG9vayB3YXMgZm91bmQgYnkgaXRzIHRva2VuICovXG5leHBvcnQgY29uc3QgSG9va0ZvdW5kID0gU2VtYW50aWNDb252ZW50aW9uPGJvb2xlYW4+KCd3b3JrZmxvdy5ob29rLmZvdW5kJyk7XG5cbi8vIFdlYmhvb2sgYXR0cmlidXRlc1xuXG4vKiogTnVtYmVyIG9mIHdlYmhvb2sgaGFuZGxlcnMgdHJpZ2dlcmVkICovXG5leHBvcnQgY29uc3QgV2ViaG9va0hhbmRsZXJzVHJpZ2dlcmVkID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oXG4gICd3ZWJob29rLmhhbmRsZXJzLnRyaWdnZXJlZCdcbik7XG5cbi8vIFN1c3BlbnNpb24gYXR0cmlidXRlc1xuXG5leHBvcnQgY29uc3QgV29ya2Zsb3dTdXNwZW5zaW9uU3RhdGUgPSBTZW1hbnRpY0NvbnZlbnRpb248J3N1c3BlbmRlZCc+KFxuICAnd29ya2Zsb3cuc3VzcGVuc2lvbi5zdGF0ZSdcbik7XG5leHBvcnQgY29uc3QgV29ya2Zsb3dTdXNwZW5zaW9uSG9va0NvdW50ID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oXG4gICd3b3JrZmxvdy5zdXNwZW5zaW9uLmhvb2tfY291bnQnXG4pO1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93U3VzcGVuc2lvblN0ZXBDb3VudCA9IFNlbWFudGljQ29udmVudGlvbjxudW1iZXI+KFxuICAnd29ya2Zsb3cuc3VzcGVuc2lvbi5zdGVwX2NvdW50J1xuKTtcbmV4cG9ydCBjb25zdCBXb3JrZmxvd1N1c3BlbnNpb25XYWl0Q291bnQgPSBTZW1hbnRpY0NvbnZlbnRpb248bnVtYmVyPihcbiAgJ3dvcmtmbG93LnN1c3BlbnNpb24ud2FpdF9jb3VudCdcbik7XG5cbi8vIFdvcmxkL1N0b3JhZ2UgYXR0cmlidXRlcyAtIFN0YW5kYXJkIE9URUwgSFRUUCBjb252ZW50aW9uc1xuLy8gU2VlOiBodHRwczovL29wZW50ZWxlbWV0cnkuaW8vZG9jcy9zcGVjcy9zZW1jb252L2h0dHAvaHR0cC1zcGFucy9cblxuLyoqIEhUVFAgcmVxdWVzdCBtZXRob2QgKHN0YW5kYXJkIE9URUw6IGh0dHAucmVxdWVzdC5tZXRob2QpICovXG5leHBvcnQgY29uc3QgSHR0cFJlcXVlc3RNZXRob2QgPSBTZW1hbnRpY0NvbnZlbnRpb248c3RyaW5nPihcbiAgJ2h0dHAucmVxdWVzdC5tZXRob2QnXG4pO1xuXG4vKiogRnVsbCBVUkwgb2YgdGhlIHJlcXVlc3QgKHN0YW5kYXJkIE9URUw6IHVybC5mdWxsKSAqL1xuZXhwb3J0IGNvbnN0IFVybEZ1bGwgPSBTZW1hbnRpY0NvbnZlbnRpb248c3RyaW5nPigndXJsLmZ1bGwnKTtcblxuLyoqIFNlcnZlciBob3N0bmFtZSAoc3RhbmRhcmQgT1RFTDogc2VydmVyLmFkZHJlc3MpICovXG5leHBvcnQgY29uc3QgU2VydmVyQWRkcmVzcyA9IFNlbWFudGljQ29udmVudGlvbjxzdHJpbmc+KCdzZXJ2ZXIuYWRkcmVzcycpO1xuXG4vKiogU2VydmVyIHBvcnQgKHN0YW5kYXJkIE9URUw6IHNlcnZlci5wb3J0KSAqL1xuZXhwb3J0IGNvbnN0IFNlcnZlclBvcnQgPSBTZW1hbnRpY0NvbnZlbnRpb248bnVtYmVyPignc2VydmVyLnBvcnQnKTtcblxuLyoqIEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGNvZGUgKHN0YW5kYXJkIE9URUw6IGh0dHAucmVzcG9uc2Uuc3RhdHVzX2NvZGUpICovXG5leHBvcnQgY29uc3QgSHR0cFJlc3BvbnNlU3RhdHVzQ29kZSA9IFNlbWFudGljQ29udmVudGlvbjxudW1iZXI+KFxuICAnaHR0cC5yZXNwb25zZS5zdGF0dXNfY29kZSdcbik7XG5cbi8qKiBFcnJvciB0eXBlIHdoZW4gcmVxdWVzdCBmYWlscyAoc3RhbmRhcmQgT1RFTDogZXJyb3IudHlwZSkgKi9cbmV4cG9ydCBjb25zdCBFcnJvclR5cGUgPSBTZW1hbnRpY0NvbnZlbnRpb248c3RyaW5nPignZXJyb3IudHlwZScpO1xuXG4vLyBXb3JsZC1zcGVjaWZpYyBjdXN0b20gYXR0cmlidXRlcyAoZm9yIHdvcmtmbG93LXNwZWNpZmljIGNvbnRleHQpXG5cbi8qKiBGb3JtYXQgdXNlZCBmb3IgcGFyc2luZyByZXNwb25zZSBib2R5IChjYm9yIG9yIGpzb24pICovXG5leHBvcnQgY29uc3QgV29ybGRQYXJzZUZvcm1hdCA9IFNlbWFudGljQ29udmVudGlvbjwnY2JvcicgfCAnanNvbic+KFxuICAnd29ya2Zsb3cud29ybGQucGFyc2UuZm9ybWF0J1xuKTtcblxuLy8gRXZlbnQgbG9hZGluZyBhdHRyaWJ1dGVzXG5cbi8qKiBOdW1iZXIgb2YgcGFnaW5hdGlvbiBwYWdlcyBsb2FkZWQgd2hlbiBmZXRjaGluZyB3b3JrZmxvdyBldmVudHMgKi9cbmV4cG9ydCBjb25zdCBXb3JrZmxvd0V2ZW50c1BhZ2VzTG9hZGVkID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oXG4gICd3b3JrZmxvdy5ldmVudHMucGFnZXNfbG9hZGVkJ1xuKTtcblxuLy8gUXVldWUgdGltaW5nIGJyZWFrZG93biBhdHRyaWJ1dGVzICh3b3JrZmxvdy1zcGVjaWZpYylcblxuLyoqIFRpbWUgc3BlbnQgZGVzZXJpYWxpemluZyB0aGUgcXVldWUgbWVzc2FnZSBpbiBtaWxsaXNlY29uZHMgKi9cbmV4cG9ydCBjb25zdCBRdWV1ZURlc2VyaWFsaXplVGltZU1zID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oXG4gICd3b3JrZmxvdy5xdWV1ZS5kZXNlcmlhbGl6ZV90aW1lX21zJ1xuKTtcblxuLyoqIFRpbWUgc3BlbnQgZXhlY3V0aW5nIHRoZSBoYW5kbGVyIGxvZ2ljIGluIG1pbGxpc2Vjb25kcyAqL1xuZXhwb3J0IGNvbnN0IFF1ZXVlRXhlY3V0aW9uVGltZU1zID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oXG4gICd3b3JrZmxvdy5xdWV1ZS5leGVjdXRpb25fdGltZV9tcydcbik7XG5cbi8qKiBUaW1lIHNwZW50IHNlcmlhbGl6aW5nIHRoZSByZXNwb25zZSBpbiBtaWxsaXNlY29uZHMgKi9cbmV4cG9ydCBjb25zdCBRdWV1ZVNlcmlhbGl6ZVRpbWVNcyA9IFNlbWFudGljQ29udmVudGlvbjxudW1iZXI+KFxuICAnd29ya2Zsb3cucXVldWUuc2VyaWFsaXplX3RpbWVfbXMnXG4pO1xuXG4vLyBSUEMvUGVlciBTZXJ2aWNlIGF0dHJpYnV0ZXMgLSBGb3Igc2VydmljZSBtYXBzIGFuZCBkZXBlbmRlbmN5IHRyYWNraW5nXG4vLyBTZWU6IGh0dHBzOi8vb3BlbnRlbGVtZXRyeS5pby9kb2NzL3NwZWNzL3NlbWNvbnYvcnBjL3JwYy1zcGFucy9cblxuLyoqIFRoZSByZW1vdGUgc2VydmljZSBuYW1lIGZvciBEYXRhZG9nIHNlcnZpY2UgbWFwcyAoRGF0YWRvZy1zcGVjaWZpYzogcGVlci5zZXJ2aWNlKSAqL1xuZXhwb3J0IGNvbnN0IFBlZXJTZXJ2aWNlID0gU2VtYW50aWNDb252ZW50aW9uPHN0cmluZz4oJ3BlZXIuc2VydmljZScpO1xuXG4vKiogUlBDIHN5c3RlbSBpZGVudGlmaWVyIChzdGFuZGFyZCBPVEVMOiBycGMuc3lzdGVtKSAqL1xuZXhwb3J0IGNvbnN0IFJwY1N5c3RlbSA9IFNlbWFudGljQ29udmVudGlvbjxzdHJpbmc+KCdycGMuc3lzdGVtJyk7XG5cbi8qKiBSUEMgc2VydmljZSBuYW1lIChzdGFuZGFyZCBPVEVMOiBycGMuc2VydmljZSkgKi9cbmV4cG9ydCBjb25zdCBScGNTZXJ2aWNlID0gU2VtYW50aWNDb252ZW50aW9uPHN0cmluZz4oJ3JwYy5zZXJ2aWNlJyk7XG5cbi8qKiBSUEMgbWV0aG9kIG5hbWUgKHN0YW5kYXJkIE9URUw6IHJwYy5tZXRob2QpICovXG5leHBvcnQgY29uc3QgUnBjTWV0aG9kID0gU2VtYW50aWNDb252ZW50aW9uPHN0cmluZz4oJ3JwYy5tZXRob2QnKTtcblxuLy8gRXJyb3IgYXR0cmlidXRlcyAtIFN0YW5kYXJkIE9URUwgZXJyb3IgY29udmVudGlvbnNcbi8vIFNlZTogaHR0cHM6Ly9vcGVudGVsZW1ldHJ5LmlvL2RvY3Mvc3BlY3Mvc2VtY29udi9leGNlcHRpb25zL2V4Y2VwdGlvbnMtc3BhbnMvXG5cbi8qKiBXaGV0aGVyIHRoZSBlcnJvciBpcyByZXRyeWFibGUgKHdvcmtmbG93LXNwZWNpZmljKSAqL1xuZXhwb3J0IGNvbnN0IEVycm9yUmV0cnlhYmxlID0gU2VtYW50aWNDb252ZW50aW9uPGJvb2xlYW4+KCdlcnJvci5yZXRyeWFibGUnKTtcblxuLyoqIEVycm9yIGNhdGVnb3J5ICh3b3JrZmxvdy1zcGVjaWZpYzogZmF0YWwsIHJldHJ5YWJsZSwgdHJhbnNpZW50KSAqL1xuZXhwb3J0IGNvbnN0IEVycm9yQ2F0ZWdvcnkgPSBTZW1hbnRpY0NvbnZlbnRpb248XG4gICdmYXRhbCcgfCAncmV0cnlhYmxlJyB8ICd0cmFuc2llbnQnXG4+KCdlcnJvci5jYXRlZ29yeScpO1xuIl19
356
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VtYW50aWMtY29udmVudGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUNHO0FBSUg7Ozs7R0FJRztBQUNILFNBQVMsa0JBQWtCLENBQUksR0FBRyxLQUFlO0lBQy9DLE9BQU8sQ0FBQyxLQUFRLEVBQUUsRUFBRSxDQUNsQixNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBVSxDQUFDLENBQUMsQ0FBQztBQUNwRSxDQUFDO0FBRUQsc0JBQXNCO0FBRXRCLDhDQUE4QztBQUM5QyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsa0JBQWtCLENBQVMsZUFBZSxDQUFDLENBQUM7QUFFeEUsb0RBQW9EO0FBQ3BELE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLGtCQUFrQixDQUVqRCxvQkFBb0IsQ0FBQyxDQUFDO0FBRXhCLDZEQUE2RDtBQUM3RCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsa0JBQWtCLENBQVMsaUJBQWlCLENBQUMsQ0FBQztBQUUzRSx5Q0FBeUM7QUFDekMsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsa0JBQWtCLENBRWpELHFCQUFxQixDQUFDLENBQUM7QUFFekIscUVBQXFFO0FBQ3JFLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLGtCQUFrQixDQUNqRCxxQkFBcUIsQ0FDdEIsQ0FBQztBQUVGLDJEQUEyRDtBQUMzRCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxrQkFBa0IsQ0FDbkQsdUJBQXVCLENBQ3hCLENBQUM7QUFFRiw2RUFBNkU7QUFDN0UsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsa0JBQWtC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QU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxrQkFBa0IsQ0FFN0MsZ0JBQWdCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogT3BlblRlbGVtZXRyeSBzZW1hbnRpYyBjb252ZW50aW9ucyBmb3IgVmVyY2VsIFdvcmtmbG93IHRlbGVtZXRyeS5cbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBzdGFuZGFyZGl6ZWQgdGVsZW1ldHJ5IGF0dHJpYnV0ZXMgZm9sbG93aW5nIE9wZW5UZWxlbWV0cnkgc2VtYW50aWMgY29udmVudGlvbnNcbiAqIGZvciBpbnN0cnVtZW50aW5nIHdvcmtmbG93IGV4ZWN1dGlvbiwgc3RlcCBwcm9jZXNzaW5nLCBhbmQgcmVsYXRlZCBvcGVyYXRpb25zLiBFYWNoIGV4cG9ydGVkIGZ1bmN0aW9uXG4gKiBjcmVhdGVzIGEgcHJvcGVybHkgZm9ybWF0dGVkIGF0dHJpYnV0ZSBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIE9wZW5UZWxlbWV0cnkgc3BhbnMuXG4gKlxuICogVGhlIHNlbWFudGljIGNvbnZlbnRpb25zIGFyZSBvcmdhbml6ZWQgaW50byBzZXZlcmFsIGNhdGVnb3JpZXM6XG4gKiAtICoqV29ya2Zsb3cgYXR0cmlidXRlcyoqOiBUcmFjayB3b3JrZmxvdyBsaWZlY3ljbGUsIHN0YXR1cywgYW5kIG1ldGFkYXRhXG4gKiAtICoqU3RlcCBhdHRyaWJ1dGVzKio6IE1vbml0b3IgaW5kaXZpZHVhbCBzdGVwIGV4ZWN1dGlvbiwgcmV0cmllcywgYW5kIHJlc3VsdHNcbiAqIC0gKipRdWV1ZSBhdHRyaWJ1dGVzKio6IEluc3RydW1lbnQgbWVzc2FnZSBxdWV1ZSBvcGVyYXRpb25zXG4gKiAtICoqRGVwbG95bWVudCBhdHRyaWJ1dGVzKio6IENhcHR1cmUgZGVwbG95bWVudCBlbnZpcm9ubWVudCBpbmZvcm1hdGlvblxuICpcbiAqIEFsbCBhdHRyaWJ1dGUgZnVuY3Rpb25zIGFyZSB0eXBlLXNhZmUgYW5kIGxldmVyYWdlIGV4aXN0aW5nIGJhY2tlbmQgdHlwZXMgdG8gZW5zdXJlXG4gKiBjb25zaXN0ZW5jeSBiZXR3ZWVuIHRlbGVtZXRyeSBkYXRhIGFuZCBhY3R1YWwgc3lzdGVtIHN0YXRlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgKiBhcyBBdHRyaWJ1dGUgZnJvbSAnLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuICpcbiAqIC8vIFNldCB3b3JrZmxvdyBhdHRyaWJ1dGVzIG9uIGEgc3BhblxuICogc3Bhbi5zZXRBdHRyaWJ1dGVzKHtcbiAqICAgLi4uQXR0cmlidXRlLldvcmtmbG93TmFtZSgnbXktd29ya2Zsb3cnKSxcbiAqICAgLi4uQXR0cmlidXRlLldvcmtmbG93T3BlcmF0aW9uKCdzdGFydCcpLFxuICogICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5TdGF0dXMoJ3J1bm5pbmcnKSxcbiAqIH0pO1xuICpcbiAqIC8vIFNldCBzdGVwIGF0dHJpYnV0ZXNcbiAqIHNwYW4uc2V0QXR0cmlidXRlcyh7XG4gKiAgIC4uLkF0dHJpYnV0ZS5TdGVwTmFtZSgncHJvY2Vzcy1kYXRhJyksXG4gKiAgIC4uLkF0dHJpYnV0ZS5TdGVwU3RhdHVzKCdjb21wbGV0ZWQnKSxcbiAqICAgLi4uQXR0cmlidXRlLlN0ZXBBdHRlbXB0KDEpLFxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAc2VlIHtAbGluayBodHRwczovL29wZW50ZWxlbWV0cnkuaW8vZG9jcy9zcGVjcy9zZW1jb252L30gT3BlblRlbGVtZXRyeSBTZW1hbnRpYyBDb252ZW50aW9uc1xuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBNZXNzYWdlSWQsIFN0ZXAsIFdvcmtmbG93UnVuIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgc2VtYW50aWMgY29udmVudGlvbiBmdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gYXR0cmlidXRlIG9iamVjdC5cbiAqIEBwYXJhbSBuYW1lIC0gVGhlIGF0dHJpYnV0ZSBuYW1lIGZvbGxvd2luZyBPcGVuVGVsZW1ldHJ5IHNlbWFudGljIGNvbnZlbnRpb25zXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSB2YWx1ZSBhbmQgcmV0dXJucyBhbiBhdHRyaWJ1dGUgb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIFNlbWFudGljQ29udmVudGlvbjxUPiguLi5uYW1lczogc3RyaW5nW10pIHtcbiAgcmV0dXJuICh2YWx1ZTogVCkgPT5cbiAgICBPYmplY3QuZnJvbUVudHJpZXMobmFtZXMubWFwKChuYW1lKSA9PiBbbmFtZSwgdmFsdWVdIGFzIGNvbnN0KSk7XG59XG5cbi8vIFdvcmtmbG93IGF0dHJpYnV0ZXNcblxuLyoqIFRoZSBuYW1lIG9mIHRoZSB3b3JrZmxvdyBiZWluZyBleGVjdXRlZCAqL1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93TmFtZSA9IFNlbWFudGljQ29udmVudGlvbjxzdHJpbmc+KCd3b3JrZmxvdy5uYW1lJyk7XG5cbi8qKiBUaGUgb3BlcmF0aW9uIGJlaW5nIHBlcmZvcm1lZCBvbiB0aGUgd29ya2Zsb3cgKi9cbmV4cG9ydCBjb25zdCBXb3JrZmxvd09wZXJhdGlvbiA9IFNlbWFudGljQ29udmVudGlvbjxcbiAgJ3N0YXJ0JyB8ICdleGVjdXRlJyB8ICdleGVjdXRlX3YyJyB8ICdydW4nXG4+KCd3b3JrZmxvdy5vcGVyYXRpb24nKTtcblxuLyoqIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNwZWNpZmljIHdvcmtmbG93IHJ1biBpbnN0YW5jZSAqL1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93UnVuSWQgPSBTZW1hbnRpY0NvbnZlbnRpb248c3RyaW5nPignd29ya2Zsb3cucnVuLmlkJyk7XG5cbi8qKiBDdXJyZW50IHN0YXR1cyBvZiB0aGUgd29ya2Zsb3cgcnVuICovXG5leHBvcnQgY29uc3QgV29ya2Zsb3dSdW5TdGF0dXMgPSBTZW1hbnRpY0NvbnZlbnRpb248XG4gIFdvcmtmbG93UnVuWydzdGF0dXMnXSB8ICd3b3JrZmxvd19zdXNwZW5kZWQnXG4+KCd3b3JrZmxvdy5ydW4uc3RhdHVzJyk7XG5cbi8qKiBUaW1lc3RhbXAgd2hlbiB0aGUgd29ya2Zsb3cgZXhlY3V0aW9uIHN0YXJ0ZWQgKFVuaXggdGltZXN0YW1wKSAqL1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93U3RhcnRlZEF0ID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oXG4gICd3b3JrZmxvdy5zdGFydGVkX2F0J1xuKTtcblxuLyoqIE51bWJlciBvZiBldmVudHMgcHJvY2Vzc2VkIGR1cmluZyB3b3JrZmxvdyBleGVjdXRpb24gKi9cbmV4cG9ydCBjb25zdCBXb3JrZmxvd0V2ZW50c0NvdW50ID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oXG4gICd3b3JrZmxvdy5ldmVudHMuY291bnQnXG4pO1xuXG4vKiogV2hldGhlciB3b3JrZmxvdyBleGVjdXRpb24gc3RhcnRzIHdpdGggcmVwbGF5IG9yIHJlc3VtZXMgYSByZXRhaW5lZCBWTSAqL1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93RXhlY3V0aW9uTW9kZSA9IFNlbWFudGljQ29udmVudGlvbjwncmVwbGF5JyB8ICdyZXRhaW5lZCc+KFxuICAnd29ya2Zsb3cuZXhlY3V0aW9uLm1vZGUnXG4pO1xuXG4vKiogTnVtYmVyIG9mIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIHdvcmtmbG93ICovXG5leHBvcnQgY29uc3QgV29ya2Zsb3dBcmd1bWVudHNDb3VudCA9IFNlbWFudGljQ29udmVudGlvbjxudW1iZXI+KFxuICAnd29ya2Zsb3cuYXJndW1lbnRzLmNvdW50J1xuKTtcblxuLyoqIFR5cGUgb2YgdGhlIHdvcmtmbG93IHJlc3VsdCAqL1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93UmVzdWx0VHlwZSA9IFNlbWFudGljQ29udmVudGlvbjxzdHJpbmc+KFxuICAnd29ya2Zsb3cucmVzdWx0LnR5cGUnXG4pO1xuXG4vKiogV2hldGhlciB0cmFjZSBjb250ZXh0IHdhcyBwcm9wYWdhdGVkIHRvIHRoaXMgd29ya2Zsb3cgZXhlY3V0aW9uICovXG5leHBvcnQgY29uc3QgV29ya2Zsb3dUcmFjZVByb3BhZ2F0ZWQgPSBTZW1hbnRpY0NvbnZlbnRpb248Ym9vbGVhbj4oXG4gICd3b3JrZmxvdy50cmFjZS5wcm9wYWdhdGVkJ1xuKTtcblxuLy8gUXVpY2tKUyBWTSBlbmdpbmUgYXR0cmlidXRlc1xuXG4vKiogVGhlIFZNIGVuZ2luZSBleGVjdXRpbmcgdGhlIHdvcmtmbG93IGZ1bmN0aW9uIGZvciB0aGlzIGludm9jYXRpb24gKi9cbmV4cG9ydCBjb25zdCBXb3JrZmxvd1ZtID0gU2VtYW50aWNDb252ZW50aW9uPCdub2RlJyB8ICdxdWlja2pzJz4oJ3dvcmtmbG93LnZtJyk7XG5cbi8qKiBPdXRjb21lIG9mIGEgUXVpY2tKUyBWTSB3b3JrZmxvdyBpbnZvY2F0aW9uICovXG5leHBvcnQgY29uc3QgUXVpY2tKU091dGNvbWUgPSBTZW1hbnRpY0NvbnZlbnRpb248XG4gICdjb21wbGV0ZWQnIHwgJ3N1c3BlbmRlZCcgfCAnZmFpbGVkJ1xuPignd29ya2Zsb3cudm0ub3V0Y29tZScpO1xuXG4vKiogV2hldGhlciBwcmVsb2FkZWQgZXZlbnRzIGZyb20gYGV2ZW50cy5jcmVhdGUoJ3J1bl9zdGFydGVkJylgIHdlcmUgdXNlZCAqL1xuZXhwb3J0IGNvbnN0IFF1aWNrSlNFdmVudHNQcmVsb2FkZWQgPSBTZW1hbnRpY0NvbnZlbnRpb248Ym9vbGVhbj4oXG4gICd3b3JrZmxvdy52bS5ldmVudHMucHJlbG9hZGVkJ1xuKTtcblxuLyoqIFRvdGFsIG51bWJlciBvZiBldmVudHMgZmV0Y2hlZCBmcm9tIHRoZSB3b3JsZCBmb3IgdGhpcyBpbnZvY2F0aW9uICovXG5leHBvcnQgY29uc3QgUXVpY2tKU0V2ZW50c0ZldGNoZWRDb3VudCA9IFNlbWFudGljQ29udmVudGlvbjxudW1iZXI+KFxuICAnd29ya2Zsb3cudm0uZXZlbnRzLmZldGNoZWRfY291bnQnXG4pO1xuXG4vKiogTnVtYmVyIG9mIHBhZ2VzIHJlcXVpcmVkIHRvIGZldGNoIGFsbCBldmVudHMgKi9cbmV4cG9ydCBjb25zdCBRdWlja0pTRXZlbnRzRmV0Y2hlZFBhZ2VzID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oXG4gICd3b3JrZmxvdy52bS5ldmVudHMuZmV0Y2hlZF9wYWdlcydcbik7XG5cbi8qKiBOdW1iZXIgb2YgcGVuZGluZyBWTSBvcGVyYXRpb25zIGNhcHR1cmVkIGF0IHN1c3BlbnNpb24gKi9cbmV4cG9ydCBjb25zdCBRdWlja0pTUGVuZGluZ09wc0NvdW50ID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oXG4gICd3b3JrZmxvdy52bS5wZW5kaW5nX29wc19jb3VudCdcbik7XG5cbi8qKiBOdW1iZXIgb2Ygc3RlcHMgZXhlY3V0ZWQgaW5saW5lIChsaXZlLVZNIGNvbnRpbnVhdGlvbikgdGhpcyBpbnZvY2F0aW9uICovXG5leHBvcnQgY29uc3QgUXVpY2tKU0lubGluZVN0ZXBzID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oXG4gICdxdWlja2pzLmlubGluZV9zdGVwcydcbik7XG5cbi8qKiBBY3RpdmUgdHJhY2UtY29ycmVsYXRpb24gbW9kZSBmb3IgdGhpcyBpbnZvY2F0aW9uIChsaW5rZWQgb3IgY29udGludW91cykgKi9cbmV4cG9ydCBjb25zdCBXb3JrZmxvd1RyYWNlTW9kZSA9IFNlbWFudGljQ29udmVudGlvbjwnbGlua2VkJyB8ICdjb250aW51b3VzJz4oXG4gICd3b3JrZmxvdy50cmFjZS5tb2RlJ1xuKTtcblxuLyoqIFdoZXRoZXIgdGhpcyB3b3JrZmxvdyBpbnZvY2F0aW9uIGlzIHVzaW5nIHRoZSB0dXJibyBmaXJzdC1kZWxpdmVyeSBwYXRoICovXG5leHBvcnQgY29uc3QgV29ya2Zsb3dUdXJibyA9IFNlbWFudGljQ29udmVudGlvbjxib29sZWFuPignd29ya2Zsb3cudHVyYm8nKTtcblxuLyoqIE5hbWUgb2YgdGhlIGVycm9yIHRoYXQgY2F1c2VkIHdvcmtmbG93IGZhaWx1cmUgKi9cbmV4cG9ydCBjb25zdCBXb3JrZmxvd0Vycm9yTmFtZSA9IFNlbWFudGljQ29udmVudGlvbjxzdHJpbmc+KFxuICAnd29ya2Zsb3cuZXJyb3IubmFtZSdcbik7XG5cbi8qKiBFcnJvciBtZXNzYWdlIHdoZW4gd29ya2Zsb3cgZmFpbHMgKi9cbmV4cG9ydCBjb25zdCBXb3JrZmxvd0Vycm9yTWVzc2FnZSA9IFNlbWFudGljQ29udmVudGlvbjxzdHJpbmc+KFxuICAnd29ya2Zsb3cuZXJyb3IubWVzc2FnZSdcbik7XG5cbi8qKiBFcnJvciBjbGFzc2lmaWNhdGlvbiBjb2RlIChVU0VSX0VSUk9SLCBSVU5USU1FX0VSUk9SLCBldGMuKSAqL1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93RXJyb3JDb2RlID0gU2VtYW50aWNDb252ZW50aW9uPHN0cmluZz4oXG4gICd3b3JrZmxvdy5lcnJvci5jb2RlJ1xuKTtcblxuLyoqIE51bWJlciBvZiBzdGVwcyBjcmVhdGVkIGR1cmluZyB3b3JrZmxvdyBleGVjdXRpb24gKi9cbmV4cG9ydCBjb25zdCBXb3JrZmxvd1N0ZXBzQ3JlYXRlZCA9IFNlbWFudGljQ29udmVudGlvbjxudW1iZXI+KFxuICAnd29ya2Zsb3cuc3RlcHMuY3JlYXRlZCdcbik7XG5cbi8qKiBOdW1iZXIgb2YgaG9va3MgY3JlYXRlZCBkdXJpbmcgd29ya2Zsb3cgZXhlY3V0aW9uICovXG5leHBvcnQgY29uc3QgV29ya2Zsb3dIb29rc0NyZWF0ZWQgPSBTZW1hbnRpY0NvbnZlbnRpb248bnVtYmVyPihcbiAgJ3dvcmtmbG93Lmhvb2tzLmNyZWF0ZWQnXG4pO1xuXG4vKiogTnVtYmVyIG9mIHdhaXRzIGNyZWF0ZWQgZHVyaW5nIHdvcmtmbG93IGV4ZWN1dGlvbiAqL1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93V2FpdHNDcmVhdGVkID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oXG4gICd3b3JrZmxvdy53YWl0cy5jcmVhdGVkJ1xuKTtcblxuLyoqXG4gKiBOdW1iZXIgb2YgaW5saW5lLW93bmVkIHN0ZXBzIHRoaXMgaW52b2NhdGlvbiByZS1leGVjdXRlZCBiZWNhdXNlIGl0IGlzIGFcbiAqIHJlZGVsaXZlcnkgb2YgdGhlaXIgb3duaW5nIHF1ZXVlIG1lc3NhZ2UgKGNyYXNoIHJlY292ZXJ5IGZvciBpbmxpbmVcbiAqIHN0ZXBzIOKAlCBzZWUgdGhlIGlubGluZSBzdGVwIG93bmVyc2hpcCBjaGFuZ2Vsb2csIHdvcmtmbG93IzI3ODApLlxuICovXG5leHBvcnQgY29uc3QgV29ya2Zsb3dPd25lZFJlY292ZXJ5U3RlcHMgPSBTZW1hbnRpY0NvbnZlbnRpb248bnVtYmVyPihcbiAgJ3dvcmtmbG93LmlubGluZV9vd25lcnNoaXAub3duZWRfcmVjb3Zlcnlfc3RlcHMnXG4pO1xuXG4vKipcbiAqIE51bWJlciBvZiBwZW5kaW5nIHN0ZXBzIGZvciB3aGljaCB0aGlzIHJlcGxheSBzdXBwcmVzc2VkIHRoZSBpbW1lZGlhdGVcbiAqIHJlcXVldWUgKGFub3RoZXIgaW52b2NhdGlvbiBpbmxpbmUtb3ducyB0aGVtIHVuZGVyIGEgbGl2ZSBsZWFzZSkgYW5kXG4gKiBlbnN1cmVkIGEgZGVsYXllZCBiYWNrc3RvcCB3YWtlIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjb25zdCBXb3JrZmxvd0JhY2tzdG9wV2FrZXNBcm1lZCA9IFNlbWFudGljQ29udmVudGlvbjxudW1iZXI+KFxuICAnd29ya2Zsb3cuaW5saW5lX293bmVyc2hpcC5iYWNrc3RvcF93YWtlc19hcm1lZCdcbik7XG5cbi8vIFJvdXRlIGF0dHJpYnV0ZXNcblxuLyoqIFRoZSB3b3JrZmxvdyBydW50aW1lIHJvdXRlIGJlaW5nIGhhbmRsZWQgKi9cbmV4cG9ydCBjb25zdCBXb3JrZmxvd1JvdXRlVHlwZSA9IFNlbWFudGljQ29udmVudGlvbjwnZmxvdyc+KFxuICAnd29ya2Zsb3cucm91dGUudHlwZSdcbik7XG5cbi8qKiBXaGV0aGVyIHRoaXMgcm91dGUgaW52b2NhdGlvbiByZXVzZWQgYW4gYWxyZWFkeS1jcmVhdGVkIHJlcXVlc3QgaGFuZGxlciAqL1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93Um91dGVIYW5kbGVyQ2FjaGVkID0gU2VtYW50aWNDb252ZW50aW9uPGJvb2xlYW4+KFxuICAnd29ya2Zsb3cucm91dGUuaGFuZGxlcl9jYWNoZWQnXG4pO1xuXG4vKiogTnVtYmVyIG9mIHRpbWVzIHRoaXMgaW4tbWVtb3J5IHJvdXRlIGhhbmRsZXIgaGFzIGJlZW4gaW52b2tlZCAqL1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93Um91dGVJbnZvY2F0aW9uQ291bnQgPSBTZW1hbnRpY0NvbnZlbnRpb248bnVtYmVyPihcbiAgJ3dvcmtmbG93LnJvdXRlLmludm9jYXRpb25fY291bnQnXG4pO1xuXG4vKiogVGltZSBzaW5jZSB0aGlzIHJvdXRlIGVudHJ5cG9pbnQgd2FzIGNvbnN0cnVjdGVkLCBpbiBtaWxsaXNlY29uZHMgKi9cbmV4cG9ydCBjb25zdCBXb3JrZmxvd1JvdXRlRW50cnlwb2ludEFnZU1zID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oXG4gICd3b3JrZmxvdy5yb3V0ZS5lbnRyeXBvaW50X2FnZV9tcydcbik7XG5cbi8qKiBUaW1lIHNwZW50IGV2YWx1YXRpbmcgdGhlIGdlbmVyYXRlZCByb3V0ZSBtb2R1bGUgYm9keSBiZWZvcmUgY3JlYXRpbmcgdGhlIGVudHJ5cG9pbnQgKi9cbmV4cG9ydCBjb25zdCBXb3JrZmxvd1JvdXRlTW9kdWxlQm9keUluaXRNcyA9IFNlbWFudGljQ29udmVudGlvbjxudW1iZXI+KFxuICAnd29ya2Zsb3cucm91dGUubW9kdWxlX2JvZHlfaW5pdF9tcydcbik7XG5cbi8qKlxuICogQ29tcHV0ZSBpbnN0YW5jZSBoYW5kbGluZyB0aGlzIHJvdXRlIOKAlCB0aGUgc3ludGhlc2l6ZWQgYENPTVBVVEVfSU5TVEFOQ0VfSURgLlxuICogVXNlcyBPVEVMIGBmYWFzLmluc3RhbmNlYCAoZXhlY3V0aW9uLWVudmlyb25tZW50IGlkLCByZXVzZWQgYWNyb3NzXG4gKiBpbnZvY2F0aW9ucyB0byB0aGUgc2FtZSBmdW5jdGlvbik6XG4gKiBodHRwczovL29wZW50ZWxlbWV0cnkuaW8vZG9jcy9zcGVjcy9zZW1jb252L2F0dHJpYnV0ZXMtcmVnaXN0cnkvZmFhcy9cbiAqL1xuZXhwb3J0IGNvbnN0IEZhYXNJbnN0YW5jZSA9IFNlbWFudGljQ29udmVudGlvbjxzdHJpbmc+KCdmYWFzLmluc3RhbmNlJyk7XG5cbi8vIFN0ZXAgYXR0cmlidXRlc1xuXG4vKiogTmFtZSBvZiB0aGUgc3RlcCBmdW5jdGlvbiBiZWluZyBleGVjdXRlZCAqL1xuZXhwb3J0IGNvbnN0IFN0ZXBOYW1lID0gU2VtYW50aWNDb252ZW50aW9uPHN0cmluZz4oJ3N0ZXAubmFtZScpO1xuXG4vKiogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBzdGVwIGluc3RhbmNlICovXG5leHBvcnQgY29uc3QgU3RlcElkID0gU2VtYW50aWNDb252ZW50aW9uPHN0cmluZz4oJ3N0ZXAuaWQnKTtcblxuLyoqIEN1cnJlbnQgYXR0ZW1wdCBudW1iZXIgZm9yIHN0ZXAgZXhlY3V0aW9uIChzdGFydHMgYXQgMSkgKi9cbmV4cG9ydCBjb25zdCBTdGVwQXR0ZW1wdCA9IFNlbWFudGljQ29udmVudGlvbjxudW1iZXI+KCdzdGVwLmF0dGVtcHQnKTtcblxuLyoqIEN1cnJlbnQgc3RhdHVzIG9mIHRoZSBzdGVwICovXG5leHBvcnQgY29uc3QgU3RlcFN0YXR1cyA9IFNlbWFudGljQ29udmVudGlvbjxTdGVwWydzdGF0dXMnXT4oJ3N0ZXAuc3RhdHVzJyk7XG5cbi8qKiBNYXhpbXVtIG51bWJlciBvZiByZXRyaWVzIGFsbG93ZWQgZm9yIHRoaXMgc3RlcCAqL1xuZXhwb3J0IGNvbnN0IFN0ZXBNYXhSZXRyaWVzID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oJ3N0ZXAubWF4X3JldHJpZXMnKTtcblxuLyoqIFdoZXRoZXIgdHJhY2UgY29udGV4dCB3YXMgcHJvcGFnYXRlZCB0byB0aGlzIHN0ZXAgZXhlY3V0aW9uICovXG5leHBvcnQgY29uc3QgU3RlcFRyYWNlUHJvcGFnYXRlZCA9IFNlbWFudGljQ29udmVudGlvbjxib29sZWFuPihcbiAgJ3N0ZXAudHJhY2UucHJvcGFnYXRlZCdcbik7XG5cbi8qKlxuICogQ2xpZW50LW1lYXN1cmVkIHRpbWUtdG8tZmlyc3Qtc3RlcCBsYXRlbmN5IGluIG1pbGxpc2Vjb25kczogcnVuIGNyZWF0aW9uIOKGklxuICogdGhpcyBzdGVwJ3MgYm9keSBiZWdpbm5pbmcgdG8gZXhlY3V0ZSwgbWludXMgcHJlLXN0ZXAgaG9vay1jcmVhdGlvbiB0aW1lLlxuICogT25seSBwcmVzZW50IG9uIHRoZSBydW4ncyBmaXJzdCBzdGVwIGV4ZWN1dGlvbiB3aGVuIGl0IHF1YWxpZmllZCBmb3JcbiAqIG1lYXN1cmVtZW50IChzZWUgcnVudGltZS9zdGVwLWxhdGVuY3kudHMpLlxuICovXG5leHBvcnQgY29uc3QgU3RlcFR0ZnNNcyA9IFNlbWFudGljQ29udmVudGlvbjxudW1iZXI+KCdzdGVwLnR0ZnNfbXMnKTtcblxuLyoqXG4gKiBDbGllbnQtbWVhc3VyZWQgc3RlcC10by1zdGVwIG92ZXJoZWFkIGluIG1pbGxpc2Vjb25kczogdGhlIHByZXZpb3VzIHN0ZXAnc1xuICogdGVybWluYWwgZXZlbnQg4oaSIHRoaXMgc3RlcCdzIGJvZHkgYmVnaW5uaW5nIHRvIGV4ZWN1dGUuIE9ubHkgcHJlc2VudCB3aGVuXG4gKiB0aGUgdHdvIHN0ZXBzIHJhbiBiYWNrLXRvLWJhY2suXG4gKi9cbmV4cG9ydCBjb25zdCBTdGVwU3Rzb01zID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oJ3N0ZXAuc3Rzb19tcycpO1xuXG4vKipcbiAqIENsaWVudC1tZWFzdXJlZCBydW5fc3RhcnRlZC10by1maXJzdC1zdGVwIGxhdGVuY3kgaW4gbWlsbGlzZWNvbmRzOiB0aGVcbiAqIGBydW5fc3RhcnRlZGAgcmVzcG9uc2UgbGFuZGluZyAob3IsIHVuZGVyIHR1cmJvLCB0aGUgbG9jYWwgcnVuIHN5bnRoZXNpc1xuICogaW5zdGFudCkg4oaSIHRoaXMgc3RlcCdzIHN0YXJ0IFBPU1QgYmVpbmcgaXNzdWVkLiBBIHN1Yi13aW5kb3cgb2YgdHRmcyB0aGF0XG4gKiBpc29sYXRlcyByZXBsYXkgb3ZlcmhlYWQgZnJvbSB0aGUgcnVuLWNyZWF0aW9uIHF1ZXVlIGhvcC4gT25seSBwcmVzZW50IG9uXG4gKiB0aGUgcnVuJ3MgZmlyc3Qgc3RlcCBleGVjdXRpb24gd2hlbiBpdCBxdWFsaWZpZWQgZm9yIG1lYXN1cmVtZW50IChzZWVcbiAqIHJ1bnRpbWUvc3RlcC1sYXRlbmN5LnRzKS5cbiAqL1xuZXhwb3J0IGNvbnN0IFN0ZXBSc2ZzTXMgPSBTZW1hbnRpY0NvbnZlbnRpb248bnVtYmVyPignc3RlcC5yc2ZzX21zJyk7XG5cbi8qKlxuICogQ2xpZW50LW1lYXN1cmVkIHN5bmNocm9ub3VzIHdvcmtmbG93LWZ1bmN0aW9uIHJlcGxheSBkdXJhdGlvbiBpblxuICogbWlsbGlzZWNvbmRzLCBleGNsdWRpbmcgYXdhaXRlZCBuZXR3b3JrIEkvTywgb2Ygb25seSB0aGUgRklOQUwgcmVwbGF5IHBhc3NcbiAqIHdpdGhpbiB0aGUgcnNmcyB3aW5kb3cg4oCUIHRoZSBwYXNzIHRoYXQgcmVhY2hlZCBhbmQgc2NoZWR1bGVkIHRoZSBmaXJzdFxuICogc3RlcC4gTm90IGFjY3VtdWxhdGVkIGFjcm9zcyBlYXJsaWVyIHByZS1maXJzdC1zdGVwIHBhc3NlcyAoZS5nLiBhXG4gKiB3b3JrZmxvdy1ib2R5IGBzZXRBdHRyaWJ1dGVzKClgIGRldG91ciByZXBsYXlzIG1vcmUgdGhhbiBvbmNlLCBhbmQgYVxuICogcmVkZWxpdmVyeSBvbWl0cyBlYXJsaWVyIGludm9jYXRpb25zJyB3b3JrIGVudGlyZWx5KSwgc28gdGhpcyBtdXN0IG5vdCBiZVxuICogcmVhZCBhcyBcInRoZSByZXBsYXkgcG9ydGlvbiBvZiByc2ZzXCIg4oCUIHN0ZXAucnNmc19tcyBjb3ZlcnMgdGhlIHdob2xlXG4gKiB3aW5kb3cuIE9ubHkgcHJlc2VudCBhbG9uZ3NpZGUgc3RlcC5yc2ZzX21zIGFuZCBvbmx5IGZvciB0aGUgcnVuJ3MgZmlyc3RcbiAqIHN0ZXAgKHNlZSBydW50aW1lL3N0ZXAtbGF0ZW5jeS50cykuXG4gKi9cbmV4cG9ydCBjb25zdCBTdGVwRmluYWxTY2hlZHVsaW5nUmVwbGF5TXMgPSBTZW1hbnRpY0NvbnZlbnRpb248bnVtYmVyPihcbiAgJ3N0ZXAuZmluYWxfc2NoZWR1bGluZ19yZXBsYXlfbXMnXG4pO1xuXG4vKipcbiAqIFJ1bnRpbWUgc3RhcnR1cC1sYXRlbmN5IG9wdGltaXphdGlvbnMgYWN0aXZlIGZvciB0aGUgdHRmcy9zdHNvIG1lYXN1cmVtZW50XG4gKiAoZS5nLiAndHVyYm8nLCAnbGF6eVN0ZXBTdGFydCcsICdvcHRpbWlzdGljU3RhcnQnKS5cbiAqL1xuZXhwb3J0IGNvbnN0IFN0ZXBMYXRlbmN5T3B0aW1pemF0aW9ucyA9IFNlbWFudGljQ29udmVudGlvbjxzdHJpbmdbXT4oXG4gICdzdGVwLmxhdGVuY3lfb3B0aW1pemF0aW9ucydcbik7XG5cbi8qKiBXaGV0aGVyIHRoZSBzdGVwIHdhcyBza2lwcGVkIGR1cmluZyBleGVjdXRpb24gKi9cbmV4cG9ydCBjb25zdCBTdGVwU2tpcHBlZCA9IFNlbWFudGljQ29udmVudGlvbjxib29sZWFuPignc3RlcC5za2lwcGVkJyk7XG5cbi8qKiBSZWFzb24gd2h5IHRoZSBzdGVwIHdhcyBza2lwcGVkICovXG5leHBvcnQgY29uc3QgU3RlcFNraXBSZWFzb24gPVxuICBTZW1hbnRpY0NvbnZlbnRpb248U3RlcFsnc3RhdHVzJ10+KCdzdGVwLnNraXBfcmVhc29uJyk7XG5cbi8qKiBOdW1iZXIgb2YgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgc3RlcCBmdW5jdGlvbiAqL1xuZXhwb3J0IGNvbnN0IFN0ZXBBcmd1bWVudHNDb3VudCA9IFNlbWFudGljQ29udmVudGlvbjxudW1iZXI+KFxuICAnc3RlcC5hcmd1bWVudHMuY291bnQnXG4pO1xuXG4vKiogVHlwZSBvZiB0aGUgc3RlcCByZXN1bHQgKi9cbmV4cG9ydCBjb25zdCBTdGVwUmVzdWx0VHlwZSA9IFNlbWFudGljQ29udmVudGlvbjxzdHJpbmc+KCdzdGVwLnJlc3VsdC50eXBlJyk7XG5cbi8qKiBOYW1lIG9mIHRoZSBlcnJvciB0aGF0IGNhdXNlZCBzdGVwIGZhaWx1cmUgKi9cbmV4cG9ydCBjb25zdCBTdGVwRXJyb3JOYW1lID0gU2VtYW50aWNDb252ZW50aW9uPHN0cmluZz4oJ3N0ZXAuZXJyb3IubmFtZScpO1xuXG4vKiogRXJyb3IgbWVzc2FnZSB3aGVuIHN0ZXAgZmFpbHMgKi9cbmV4cG9ydCBjb25zdCBTdGVwRXJyb3JNZXNzYWdlID1cbiAgU2VtYW50aWNDb252ZW50aW9uPHN0cmluZz4oJ3N0ZXAuZXJyb3IubWVzc2FnZScpO1xuXG4vKiogV2hldGhlciB0aGUgc3RlcCBmYWlsZWQgd2l0aCBhIGZhdGFsIGVycm9yIChubyByZXRyaWVzKSAqL1xuZXhwb3J0IGNvbnN0IFN0ZXBGYXRhbEVycm9yID0gU2VtYW50aWNDb252ZW50aW9uPGJvb2xlYW4+KCdzdGVwLmZhdGFsX2Vycm9yJyk7XG5cbi8qKiBXaGV0aGVyIGFsbCByZXRyeSBhdHRlbXB0cyBoYXZlIGJlZW4gZXhoYXVzdGVkICovXG5leHBvcnQgY29uc3QgU3RlcFJldHJ5RXhoYXVzdGVkID0gU2VtYW50aWNDb252ZW50aW9uPGJvb2xlYW4+KFxuICAnc3RlcC5yZXRyeS5leGhhdXN0ZWQnXG4pO1xuXG4vKiogTnVtYmVyIG9mIHNlY29uZHMgdG8gd2FpdCBiZWZvcmUgbmV4dCByZXRyeSBhdHRlbXB0ICovXG5leHBvcnQgY29uc3QgU3RlcFJldHJ5VGltZW91dFNlY29uZHMgPSBTZW1hbnRpY0NvbnZlbnRpb248bnVtYmVyPihcbiAgJ3N0ZXAucmV0cnkudGltZW91dF9zZWNvbmRzJ1xuKTtcblxuLyoqIFdoZXRoZXIgdGhlIHN0ZXAgd2lsbCBiZSByZXRyaWVkIGFmdGVyIHRoaXMgZmFpbHVyZSAqL1xuZXhwb3J0IGNvbnN0IFN0ZXBSZXRyeVdpbGxSZXRyeSA9IFNlbWFudGljQ29udmVudGlvbjxib29sZWFuPihcbiAgJ3N0ZXAucmV0cnkud2lsbF9yZXRyeSdcbik7XG5cbi8vIFF1ZXVlL01lc3NhZ2luZyBhdHRyaWJ1dGVzIC0gU3RhbmRhcmQgT1RFTCBtZXNzYWdpbmcgY29udmVudGlvbnNcbi8vIFNlZTogaHR0cHM6Ly9vcGVudGVsZW1ldHJ5LmlvL2RvY3Mvc3BlY3Mvc2VtY29udi9tZXNzYWdpbmcvbWVzc2FnaW5nLXNwYW5zL1xuXG4vKiogTWVzc2FnaW5nIHN5c3RlbSBpZGVudGlmaWVyIChzdGFuZGFyZCBPVEVMOiBtZXNzYWdpbmcuc3lzdGVtKSAqL1xuZXhwb3J0IGNvbnN0IE1lc3NhZ2luZ1N5c3RlbSA9IFNlbWFudGljQ29udmVudGlvbjxzdHJpbmc+KCdtZXNzYWdpbmcuc3lzdGVtJyk7XG5cbi8qKiBEZXN0aW5hdGlvbiBuYW1lL3F1ZXVlIG5hbWUgKHN0YW5kYXJkIE9URUw6IG1lc3NhZ2luZy5kZXN0aW5hdGlvbi5uYW1lKSAqL1xuZXhwb3J0IGNvbnN0IE1lc3NhZ2luZ0Rlc3RpbmF0aW9uTmFtZSA9IFNlbWFudGljQ29udmVudGlvbjxzdHJpbmc+KFxuICAnbWVzc2FnaW5nLmRlc3RpbmF0aW9uLm5hbWUnXG4pO1xuXG4vKiogVGhlIG1lc3NhZ2UgaWQgYmVpbmcgaGFuZGxlZCAoc3RhbmRhcmQgT1RFTDogbWVzc2FnaW5nLm1lc3NhZ2UuaWQpICovXG5leHBvcnQgY29uc3QgTWVzc2FnaW5nTWVzc2FnZUlkID0gU2VtYW50aWNDb252ZW50aW9uPE1lc3NhZ2VJZD4oXG4gICdtZXNzYWdpbmcubWVzc2FnZS5pZCdcbik7XG5cbi8qKiBPcGVyYXRpb24gdHlwZSAoc3RhbmRhcmQgT1RFTDogbWVzc2FnaW5nLm9wZXJhdGlvbi50eXBlKSAqL1xuZXhwb3J0IGNvbnN0IE1lc3NhZ2luZ09wZXJhdGlvblR5cGUgPSBTZW1hbnRpY0NvbnZlbnRpb248XG4gICdwdWJsaXNoJyB8ICdyZWNlaXZlJyB8ICdwcm9jZXNzJ1xuPignbWVzc2FnaW5nLm9wZXJhdGlvbi50eXBlJyk7XG5cbi8qKiBUaW1lIHRha2VuIHRvIGVucXVldWUgdGhlIG1lc3NhZ2UgaW4gbWlsbGlzZWNvbmRzICh3b3JrZmxvdy1zcGVjaWZpYykgKi9cbmV4cG9ydCBjb25zdCBRdWV1ZU92ZXJoZWFkTXMgPSBTZW1hbnRpY0NvbnZlbnRpb248bnVtYmVyPihcbiAgJ3dvcmtmbG93LnF1ZXVlLm92ZXJoZWFkX21zJ1xuKTtcblxuLy8gRGVwbG95bWVudCBhdHRyaWJ1dGVzXG5cbi8qKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGRlcGxveW1lbnQgZW52aXJvbm1lbnQgKi9cbmV4cG9ydCBjb25zdCBEZXBsb3ltZW50SWQgPSBTZW1hbnRpY0NvbnZlbnRpb248c3RyaW5nPignZGVwbG95bWVudC5pZCcpO1xuXG4vKiogVGhlIGRlcGxveW1lbnQgYSBydW4gaXMgcGlubmVkIHRvLCBzZXQgb25seSBvbiBhIG1pc3JvdXRlZCBkZWxpdmVyeS4gKi9cbmV4cG9ydCBjb25zdCBXb3JrZmxvd1J1blBpbm5lZERlcGxveW1lbnRJZCA9IFNlbWFudGljQ29udmVudGlvbjxzdHJpbmc+KFxuICAnd29ya2Zsb3cuZGVwbG95bWVudC5waW5uZWRfaWQnXG4pO1xuXG4vKiogUmUtcm91dGUgYXR0ZW1wdHMgZm9yIHRoaXMgbWlzcm91dGVkIGRlbGl2ZXJ5LCBpbmNsdWRpbmcgdGhpcyBvbmUuICovXG5leHBvcnQgY29uc3QgV29ya2Zsb3dEZXBsb3ltZW50TWlzbWF0Y2hSZXRyeUNvdW50ID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oXG4gICd3b3JrZmxvdy5kZXBsb3ltZW50X21pc21hdGNoLnJldHJ5X2NvdW50J1xuKTtcblxuLyoqIFdoZXRoZXIgdGhlIG1pc3JvdXRlZCBkZWxpdmVyeSB3YXMgcmUtcm91dGVkIGluc3RlYWQgb2YgZmFpbGluZyB0aGUgcnVuLiAqL1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93RGVwbG95bWVudE1pc21hdGNoUmVjb3ZlcmVkID0gU2VtYW50aWNDb252ZW50aW9uPGJvb2xlYW4+KFxuICAnd29ya2Zsb3cuZGVwbG95bWVudF9taXNtYXRjaC5yZWNvdmVyZWQnXG4pO1xuXG4vLyBIb29rIGF0dHJpYnV0ZXNcblxuLyoqIFRva2VuIGlkZW50aWZ5aW5nIGEgc3BlY2lmaWMgaG9vayAqL1xuZXhwb3J0IGNvbnN0IEhvb2tUb2tlbiA9IFNlbWFudGljQ29udmVudGlvbjxzdHJpbmc+KCd3b3JrZmxvdy5ob29rLnRva2VuJyk7XG5cbi8qKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBob29rIGluc3RhbmNlICovXG5leHBvcnQgY29uc3QgSG9va0lkID0gU2VtYW50aWNDb252ZW50aW9uPHN0cmluZz4oJ3dvcmtmbG93Lmhvb2suaWQnKTtcblxuLyoqIFdoZXRoZXIgYSBob29rIHdhcyBmb3VuZCBieSBpdHMgdG9rZW4gKi9cbmV4cG9ydCBjb25zdCBIb29rRm91bmQgPSBTZW1hbnRpY0NvbnZlbnRpb248Ym9vbGVhbj4oJ3dvcmtmbG93Lmhvb2suZm91bmQnKTtcblxuLyoqXG4gKiBQcm9kdWNlci1zaWRlIHNpZ25hbCAob24gdGhlIGBob29rLnJlc3VtZWAgc3BhbikgdGhhdCB0aGUgZGlyZWN0XG4gKiBgaG9va19yZWNlaXZlZGAgd3JpdGUgZmFpbGVkIHRyYW5zaWVudGx5IGJ1dCB0aGUgcXVldWUgZGlzcGF0Y2ggc3VjY2VlZGVkLCBzb1xuICogdGhlIHJlc3VtZSBpcyByZWNvdmVyZWQgdmlhIHRoZSBjb25zdW1lcidzIHJlLWVuc3VyZS4gQ29ycmVzcG9uZHMgdG9cbiAqIGBSZXN1bWVkSG9vay5yZXNpbGllbnRSZXN1bWUgPT09IHRydWVgLlxuICovXG5leHBvcnQgY29uc3QgSG9va1Jlc2lsaWVudFJlc3VtZSA9IFNlbWFudGljQ29udmVudGlvbjxib29sZWFuPihcbiAgJ3dvcmtmbG93Lmhvb2sucmVzaWxpZW50X3Jlc3VtZSdcbik7XG5cbi8qKlxuICogQ29uc3VtZXItc2lkZSBzaWduYWwgKG9uIHRoZSB3b3JrZmxvdyBleGVjdXRpb24gc3BhbikgdGhhdCB0aGlzIHJlcGxheVxuICogbWF0ZXJpYWxpemVkIHRoZSBgaG9va19yZWNlaXZlZGAgZXZlbnQgZnJvbSB0aGUgcXVldWUgbWVzc2FnZSdzIGBob29rSW5wdXRgXG4gKiBiZWNhdXNlIHRoZSBwcm9kdWNlcidzIGRpcmVjdCB3cml0ZSBoYWQgbm90IGxhbmRlZCDigJQgdGhlIGNvbXBsZXRpb24gb2YgdGhlXG4gKiByZWNvdmVyeSBwYXRoIHtAbGluayBIb29rUmVzaWxpZW50UmVzdW1lfSBiZWdhbi5cbiAqXG4gKiBMZWdhY3kgLyBub24tYXRvbWljIHJlLWVuc3VyZSBzaWduYWwgb25seS4gQXRvbWljIGxhenkgcmVzdW1lc1xuICogKHJlc3VtZUlkICsgZGlnZXN0KSBnbyB0aHJvdWdoIHRoZSBob2lzdGVkIHByZWxvYWQgd3JpdGUgaW5zdGVhZCwgd2hvc2VcbiAqIHJlc3BvbnNlIGNhbm5vdCB0ZWxsIHdoZXRoZXIgdGhlIHByb2R1Y2VyIG9yIHRoZSBjb25zdW1lciB3b24gdGhlXG4gKiBgKHJ1bklkLCByZXN1bWVJZClgIGNsYWltIOKAlCBzbyB0aGlzIGF0dHJpYnV0ZSBpcyBkZWxpYmVyYXRlbHkgTk9UIGVtaXR0ZWRcbiAqIGZvciB0aGVtIChlbWl0dGluZyBgdHJ1ZWAgdW5jb25kaXRpb25hbGx5IHdvdWxkIGNvdW50IGV2ZXJ5IHByb2R1Y2VyLXdvblxuICogcmVzdW1lIGFzIGEgcmVjb3ZlcnkpLiBUaGUgcHJvZHVjZXItYmVnaW4gKHtAbGluayBIb29rUmVzaWxpZW50UmVzdW1lfSkgL1xuICogY29uc3VtZXItbWF0ZXJpYWxpemVkIHBhaXJpbmcgaXMgdGhlcmVmb3JlIG5vIGxvbmdlciBjb21wbGV0ZSBmb3IgYXRvbWljXG4gKiBsYXp5IHJlc3VtcHRpb25zOyB1c2Uge0BsaW5rIEhvb2tSZXN1bWVTZXR1cFNvdXJjZX0gdG8gb2JzZXJ2ZSB0aGF0IHBhdGguXG4gKi9cbmV4cG9ydCBjb25zdCBIb29rUmVzaWxpZW50UmVzdW1lTWF0ZXJpYWxpemVkID0gU2VtYW50aWNDb252ZW50aW9uPGJvb2xlYW4+KFxuICAnd29ya2Zsb3cuaG9vay5yZXNpbGllbnRfcmVzdW1lX21hdGVyaWFsaXplZCdcbik7XG5cbi8qKlxuICogQ29uc3VtZXItc2lkZSBzaWduYWwgKG9uIHRoZSB3b3JrZmxvdyBleGVjdXRpb24gc3Bhbikgb2YgaG93IGEgbGF6eSBob29rXG4gKiByZXN1bWUgaW5pdGlhbGl6ZWQgaXRzIHJlcGxheSBzdGF0ZTpcbiAqXG4gKiAtIGBob29rX3JlY2VpdmVkX3N0cmVhbWAg4oCUIHRoZSBob2lzdGVkIGBob29rX3JlY2VpdmVkYCB3cml0ZSByZXR1cm5lZCBhXG4gKiAgIHVzYWJsZSByZXBsYXkgcHJlbG9hZCAocnVuICsgY29tcGxldGUgZXZlbnQgbG9nKSwgc28gdGhlIGludm9jYXRpb25cbiAqICAgc2tpcHBlZCBib3RoIHRoZSBgcnVuX3N0YXJ0ZWRgIHdyaXRlIGFuZCB0aGUgaW5pdGlhbCBgZXZlbnRzLmxpc3RgLlxuICogLSBgaG9va19yZWNlaXZlZF9mYWxsYmFja2Ag4oCUIHRoZSBob2lzdGVkIHdyaXRlIHN1Y2NlZWRlZCBidXQgcmV0dXJuZWQgbm9cbiAqICAgdXNhYmxlIHByZWxvYWQgKGEgQ0JPUiByZXNwb25zZSBmcm9tIGFuIG9sZGVyIHNlcnZlciwgYSBXb3JsZCB0aGF0XG4gKiAgIGlnbm9yZWQgdGhlIG9wdC1pbiwgYSBib3VuZGVkIGBoYXNNb3JlYCBwYWdlLCBvciBhIHByZWxvYWQgdGhhdCBmYWlsZWRcbiAqICAgdmFsaWRhdGlvbik7IHRoZSBpbnZvY2F0aW9uIGZlbGwgYmFjayB0byB0aGUgYHJ1bl9zdGFydGVkYCBzZXR1cCB3aXRob3V0XG4gKiAgIHJlLXBvc3RpbmcgdGhlIGhvb2suXG4gKlxuICogQWJzZW50IG9uIGxlZ2FjeSBob29rIGRlbGl2ZXJpZXMgKG5vIHJlc3VtZUlkL2RpZ2VzdCkgYW5kIG9uIGV2ZXJ5IG90aGVyXG4gKiBkZWxpdmVyeSBraW5kLCB3aGljaCB0YWtlIHRoZSBgcnVuX3N0YXJ0ZWRgIHNldHVwIHVuY29uZGl0aW9uYWxseS5cbiAqXG4gKiBUaGlzIGlzIGEgbGF0ZW5jeS9zZXR1cC1wYXRoIHNpZ25hbDogaXQgc2F5cyB3aGljaCByZXF1ZXN0cyBpbml0aWFsaXplZFxuICogdGhlIGludm9jYXRpb24sIE5PVCB0aGF0IHRoaXMgY29uc3VtZXIgY3JlYXRlZCB0aGUgYGhvb2tfcmVjZWl2ZWRgIGV2ZW50XG4gKiAodGhlIGhvaXN0ZWQgd3JpdGUgbWF5IGVxdWFsbHkgaGF2ZSBjb252ZXJnZWQgb24gdGhlIHByb2R1Y2VyJ3Mg4oCUIGNsYWltXG4gKiBvd25lcnNoaXAgaXMgbm90IG9ic2VydmFibGUgY2xpZW50LXNpZGU7IGNmLlxuICoge0BsaW5rIEhvb2tSZXNpbGllbnRSZXN1bWVNYXRlcmlhbGl6ZWR9KS5cbiAqL1xuZXhwb3J0IGNvbnN0IEhvb2tSZXN1bWVTZXR1cFNvdXJjZSA9IFNlbWFudGljQ29udmVudGlvbjxzdHJpbmc+KFxuICAnd29ya2Zsb3cucmVzdW1lX3NldHVwX3NvdXJjZSdcbik7XG5cbi8vIFdlYmhvb2sgYXR0cmlidXRlc1xuXG4vKiogTnVtYmVyIG9mIHdlYmhvb2sgaGFuZGxlcnMgdHJpZ2dlcmVkICovXG5leHBvcnQgY29uc3QgV2ViaG9va0hhbmRsZXJzVHJpZ2dlcmVkID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oXG4gICd3ZWJob29rLmhhbmRsZXJzLnRyaWdnZXJlZCdcbik7XG5cbi8vIFN1c3BlbnNpb24gYXR0cmlidXRlc1xuXG5leHBvcnQgY29uc3QgV29ya2Zsb3dTdXNwZW5zaW9uU3RhdGUgPSBTZW1hbnRpY0NvbnZlbnRpb248J3N1c3BlbmRlZCc+KFxuICAnd29ya2Zsb3cuc3VzcGVuc2lvbi5zdGF0ZSdcbik7XG5leHBvcnQgY29uc3QgV29ya2Zsb3dTdXNwZW5zaW9uSG9va0NvdW50ID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oXG4gICd3b3JrZmxvdy5zdXNwZW5zaW9uLmhvb2tfY291bnQnXG4pO1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93U3VzcGVuc2lvblN0ZXBDb3VudCA9IFNlbWFudGljQ29udmVudGlvbjxudW1iZXI+KFxuICAnd29ya2Zsb3cuc3VzcGVuc2lvbi5zdGVwX2NvdW50J1xuKTtcbmV4cG9ydCBjb25zdCBXb3JrZmxvd1N1c3BlbnNpb25XYWl0Q291bnQgPSBTZW1hbnRpY0NvbnZlbnRpb248bnVtYmVyPihcbiAgJ3dvcmtmbG93LnN1c3BlbnNpb24ud2FpdF9jb3VudCdcbik7XG5cbi8vIFdvcmxkL1N0b3JhZ2UgYXR0cmlidXRlcyAtIFN0YW5kYXJkIE9URUwgSFRUUCBjb252ZW50aW9uc1xuLy8gU2VlOiBodHRwczovL29wZW50ZWxlbWV0cnkuaW8vZG9jcy9zcGVjcy9zZW1jb252L2h0dHAvaHR0cC1zcGFucy9cblxuLyoqIEhUVFAgcmVxdWVzdCBtZXRob2QgKHN0YW5kYXJkIE9URUw6IGh0dHAucmVxdWVzdC5tZXRob2QpICovXG5leHBvcnQgY29uc3QgSHR0cFJlcXVlc3RNZXRob2QgPSBTZW1hbnRpY0NvbnZlbnRpb248c3RyaW5nPihcbiAgJ2h0dHAucmVxdWVzdC5tZXRob2QnXG4pO1xuXG4vKiogUm91dGUgcGF0dGVybiBmb3IgdGhlIHJlcXVlc3QgKHN0YW5kYXJkIE9URUw6IGh0dHAucm91dGUpICovXG5leHBvcnQgY29uc3QgSHR0cFJvdXRlID0gU2VtYW50aWNDb252ZW50aW9uPHN0cmluZz4oJ2h0dHAucm91dGUnKTtcblxuLyoqIEZ1bGwgVVJMIG9mIHRoZSByZXF1ZXN0IChzdGFuZGFyZCBPVEVMOiB1cmwuZnVsbCkgKi9cbmV4cG9ydCBjb25zdCBVcmxGdWxsID0gU2VtYW50aWNDb252ZW50aW9uPHN0cmluZz4oJ3VybC5mdWxsJyk7XG5cbi8qKiBTZXJ2ZXIgaG9zdG5hbWUgKHN0YW5kYXJkIE9URUw6IHNlcnZlci5hZGRyZXNzKSAqL1xuZXhwb3J0IGNvbnN0IFNlcnZlckFkZHJlc3MgPSBTZW1hbnRpY0NvbnZlbnRpb248c3RyaW5nPignc2VydmVyLmFkZHJlc3MnKTtcblxuLyoqIFNlcnZlciBwb3J0IChzdGFuZGFyZCBPVEVMOiBzZXJ2ZXIucG9ydCkgKi9cbmV4cG9ydCBjb25zdCBTZXJ2ZXJQb3J0ID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oJ3NlcnZlci5wb3J0Jyk7XG5cbi8qKiBIVFRQIHJlc3BvbnNlIHN0YXR1cyBjb2RlIChzdGFuZGFyZCBPVEVMOiBodHRwLnJlc3BvbnNlLnN0YXR1c19jb2RlKSAqL1xuZXhwb3J0IGNvbnN0IEh0dHBSZXNwb25zZVN0YXR1c0NvZGUgPSBTZW1hbnRpY0NvbnZlbnRpb248bnVtYmVyPihcbiAgJ2h0dHAucmVzcG9uc2Uuc3RhdHVzX2NvZGUnXG4pO1xuXG4vKiogRXJyb3IgdHlwZSB3aGVuIHJlcXVlc3QgZmFpbHMgKHN0YW5kYXJkIE9URUw6IGVycm9yLnR5cGUpICovXG5leHBvcnQgY29uc3QgRXJyb3JUeXBlID0gU2VtYW50aWNDb252ZW50aW9uPHN0cmluZz4oJ2Vycm9yLnR5cGUnKTtcblxuLy8gV29ybGQtc3BlY2lmaWMgY3VzdG9tIGF0dHJpYnV0ZXMgKGZvciB3b3JrZmxvdy1zcGVjaWZpYyBjb250ZXh0KVxuXG4vKiogRm9ybWF0IHVzZWQgZm9yIHBhcnNpbmcgcmVzcG9uc2UgYm9keSAoY2JvciBvciBqc29uKSAqL1xuZXhwb3J0IGNvbnN0IFdvcmxkUGFyc2VGb3JtYXQgPSBTZW1hbnRpY0NvbnZlbnRpb248J2Nib3InIHwgJ2pzb24nPihcbiAgJ3dvcmtmbG93LndvcmxkLnBhcnNlLmZvcm1hdCdcbik7XG5cbi8vIEV2ZW50IGxvYWRpbmcgYXR0cmlidXRlc1xuXG4vKiogTnVtYmVyIG9mIHBhZ2luYXRpb24gcGFnZXMgbG9hZGVkIHdoZW4gZmV0Y2hpbmcgd29ya2Zsb3cgZXZlbnRzICovXG5leHBvcnQgY29uc3QgV29ya2Zsb3dFdmVudHNQYWdlc0xvYWRlZCA9IFNlbWFudGljQ29udmVudGlvbjxudW1iZXI+KFxuICAnd29ya2Zsb3cuZXZlbnRzLnBhZ2VzX2xvYWRlZCdcbik7XG5cbi8vIFF1ZXVlIHRpbWluZyBicmVha2Rvd24gYXR0cmlidXRlcyAod29ya2Zsb3ctc3BlY2lmaWMpXG5cbi8qKiBUaW1lIHNwZW50IGRlc2VyaWFsaXppbmcgdGhlIHF1ZXVlIG1lc3NhZ2UgaW4gbWlsbGlzZWNvbmRzICovXG5leHBvcnQgY29uc3QgUXVldWVEZXNlcmlhbGl6ZVRpbWVNcyA9IFNlbWFudGljQ29udmVudGlvbjxudW1iZXI+KFxuICAnd29ya2Zsb3cucXVldWUuZGVzZXJpYWxpemVfdGltZV9tcydcbik7XG5cbi8qKiBUaW1lIHNwZW50IGV4ZWN1dGluZyB0aGUgaGFuZGxlciBsb2dpYyBpbiBtaWxsaXNlY29uZHMgKi9cbmV4cG9ydCBjb25zdCBRdWV1ZUV4ZWN1dGlvblRpbWVNcyA9IFNlbWFudGljQ29udmVudGlvbjxudW1iZXI+KFxuICAnd29ya2Zsb3cucXVldWUuZXhlY3V0aW9uX3RpbWVfbXMnXG4pO1xuXG4vKiogVGltZSBzcGVudCBzZXJpYWxpemluZyB0aGUgcmVzcG9uc2UgaW4gbWlsbGlzZWNvbmRzICovXG5leHBvcnQgY29uc3QgUXVldWVTZXJpYWxpemVUaW1lTXMgPSBTZW1hbnRpY0NvbnZlbnRpb248bnVtYmVyPihcbiAgJ3dvcmtmbG93LnF1ZXVlLnNlcmlhbGl6ZV90aW1lX21zJ1xuKTtcblxuLy8gUGF5bG9hZCBjb21wcmVzc2lvbiBhdHRyaWJ1dGVzICh6c3RkIHByZWZlcnJlZCwgZ3ppcCBmYWxsYmFjazsgc3BlY1ZlcnNpb24gPj0gNSlcbi8vXG4vLyBTaXplcyBhcmUgbWVhc3VyZWQgYXQgdGhlIGNvbXByZXNzaW9uIGJvdW5kYXJ5OiBiZWZvcmUgZW5jcnlwdGlvbiBvbiB0aGVcbi8vIHdyaXRlIHBhdGggYW5kIGFmdGVyIGRlY3J5cHRpb24gb24gdGhlIHJlYWQgcGF0aC4gVGhleSB0aGVyZWZvcmUgcmVmbGVjdFxuLy8gY29tcHJlc3Npb24ncyBlZmZlY3QsIG5vdCB0aGUgYXQtcmVzdCBzaXplICh3aGljaCBhbHNvIGluY2x1ZGVzIHRoZVxuLy8gfjI4LWJ5dGUgYGVuY3JgIGVudmVsb3BlIGFuZCwgb24gc29tZSBiYWNrZW5kcywgYmFzZTY0IGV4cGFuc2lvbikuXG5cbi8qKiBXaGV0aGVyIHRoaXMgc2VyaWFsaXplL2Rlc2VyaWFsaXplIHdhcyBhIHdyaXRlIG9yIHJlYWQuICovXG5leHBvcnQgY29uc3QgU2VyaWFsaXphdGlvbk9wZXJhdGlvbiA9IFNlbWFudGljQ29udmVudGlvbjxcbiAgJ3NlcmlhbGl6ZScgfCAnZGVzZXJpYWxpemUnXG4+KCd3b3JrZmxvdy5zZXJpYWxpemF0aW9uLm9wZXJhdGlvbicpO1xuXG4vKiogV2hldGhlciBhIGNvbXByZXNzaW9uIGNvZGVjIHdhcyBhcHBsaWVkICh3cml0ZSkgLyBwcmVzZW50IChyZWFkKS4gKi9cbmV4cG9ydCBjb25zdCBTZXJpYWxpemF0aW9uQ29tcHJlc3NlZCA9IFNlbWFudGljQ29udmVudGlvbjxib29sZWFuPihcbiAgJ3dvcmtmbG93LnNlcmlhbGl6YXRpb24uY29tcHJlc3NlZCdcbik7XG5cbi8qKiBXaGljaCBjb21wcmVzc2lvbiBjb2RlYyBhcHBsaWVkIC8gd2FzIHByZXNlbnQgKGB6c3RkYCwgYGd6aXBgLCBvciBgbm9uZWApLiAqL1xuZXhwb3J0IGNvbnN0IFNlcmlhbGl6YXRpb25Db2RlYyA9IFNlbWFudGljQ29udmVudGlvbjwnenN0ZCcgfCAnZ3ppcCcgfCAnbm9uZSc+KFxuICAnd29ya2Zsb3cuc2VyaWFsaXphdGlvbi5jb2RlYydcbik7XG5cbi8qKiBMb2dpY2FsICh1bmNvbXByZXNzZWQsIGRldmFsdWUtcHJlZml4ZWQpIHBheWxvYWQgc2l6ZSBpbiBieXRlcy4gKi9cbmV4cG9ydCBjb25zdCBTZXJpYWxpemF0aW9uVW5jb21wcmVzc2VkQnl0ZXMgPSBTZW1hbnRpY0NvbnZlbnRpb248bnVtYmVyPihcbiAgJ3dvcmtmbG93LnNlcmlhbGl6YXRpb24udW5jb21wcmVzc2VkX2J5dGVzJ1xuKTtcblxuLyoqIFN0b3JlZCAocG9zdC1jb21wcmVzc2lvbiwgcHJlLWVuY3J5cHRpb24pIHBheWxvYWQgc2l6ZSBpbiBieXRlcy4gKi9cbmV4cG9ydCBjb25zdCBTZXJpYWxpemF0aW9uU3RvcmVkQnl0ZXMgPSBTZW1hbnRpY0NvbnZlbnRpb248bnVtYmVyPihcbiAgJ3dvcmtmbG93LnNlcmlhbGl6YXRpb24uc3RvcmVkX2J5dGVzJ1xuKTtcblxuLyoqIEZyYWN0aW9uIG9mIGJ5dGVzIHNhdmVkIGJ5IGNvbXByZXNzaW9uICgwLi4xKTsgc2V0IG9ubHkgd2hlbiBjb21wcmVzc2VkLiAqL1xuZXhwb3J0IGNvbnN0IFNlcmlhbGl6YXRpb25Db21wcmVzc2lvblJhdGlvID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oXG4gICd3b3JrZmxvdy5zZXJpYWxpemF0aW9uLmNvbXByZXNzaW9uX3JhdGlvJ1xuKTtcblxuLyoqXG4gKiBOdW1iZXIgb2Ygd29ya2Zsb3cgKGd1ZXN0KSBjb2RlIGV4ZWN1dGlvbnMgc2VyaWFsaXphdGlvbiBjb3VsZCBub3QgYXZvaWRcbiAqIChnZXR0ZXJzLCBwcm94aWVzLCBjdXN0b20gc2VyaWFsaXplcnMpOyBzZXQgb25seSB3aGVuIG5vbi16ZXJvLlxuICovXG5leHBvcnQgY29uc3QgU2VyaWFsaXphdGlvbkd1ZXN0Q29kZUV4ZWN1dGlvbnMgPSBTZW1hbnRpY0NvbnZlbnRpb248bnVtYmVyPihcbiAgJ3dvcmtmbG93LnNlcmlhbGl6YXRpb24uZ3Vlc3RfY29kZV9leGVjdXRpb25zJ1xuKTtcblxuLyoqXG4gKiBEZWR1cGxpY2F0ZWQgYGtpbmQgKGRldGFpbClgIGRlc2NyaXB0aW9ucyBvZiB0aGUgZ3Vlc3QtY29kZSBleGVjdXRpb25zO1xuICogc2V0IG9ubHkgd2hlbiBub24temVyby5cbiAqL1xuZXhwb3J0IGNvbnN0IFNlcmlhbGl6YXRpb25HdWVzdENvZGVEZXRhaWxzID0gU2VtYW50aWNDb252ZW50aW9uPHN0cmluZ1tdPihcbiAgJ3dvcmtmbG93LnNlcmlhbGl6YXRpb24uZ3Vlc3RfY29kZV9kZXRhaWxzJ1xuKTtcblxuLy8gUlBDL1BlZXIgU2VydmljZSBhdHRyaWJ1dGVzIC0gRm9yIHNlcnZpY2UgbWFwcyBhbmQgZGVwZW5kZW5jeSB0cmFja2luZ1xuLy8gU2VlOiBodHRwczovL29wZW50ZWxlbWV0cnkuaW8vZG9jcy9zcGVjcy9zZW1jb252L3JwYy9ycGMtc3BhbnMvXG5cbi8qKiBUaGUgcmVtb3RlIHNlcnZpY2UgbmFtZSBmb3IgRGF0YWRvZyBzZXJ2aWNlIG1hcHMgKERhdGFkb2ctc3BlY2lmaWM6IHBlZXIuc2VydmljZSkgKi9cbmV4cG9ydCBjb25zdCBQZWVyU2VydmljZSA9IFNlbWFudGljQ29udmVudGlvbjxzdHJpbmc+KCdwZWVyLnNlcnZpY2UnKTtcblxuLyoqIFJQQyBzeXN0ZW0gaWRlbnRpZmllciAoc3RhbmRhcmQgT1RFTDogcnBjLnN5c3RlbSkgKi9cbmV4cG9ydCBjb25zdCBScGNTeXN0ZW0gPSBTZW1hbnRpY0NvbnZlbnRpb248c3RyaW5nPigncnBjLnN5c3RlbScpO1xuXG4vKiogUlBDIHNlcnZpY2UgbmFtZSAoc3RhbmRhcmQgT1RFTDogcnBjLnNlcnZpY2UpICovXG5leHBvcnQgY29uc3QgUnBjU2VydmljZSA9IFNlbWFudGljQ29udmVudGlvbjxzdHJpbmc+KCdycGMuc2VydmljZScpO1xuXG4vKiogUlBDIG1ldGhvZCBuYW1lIChzdGFuZGFyZCBPVEVMOiBycGMubWV0aG9kKSAqL1xuZXhwb3J0IGNvbnN0IFJwY01ldGhvZCA9IFNlbWFudGljQ29udmVudGlvbjxzdHJpbmc+KCdycGMubWV0aG9kJyk7XG5cbi8vIEVycm9yIGF0dHJpYnV0ZXMgLSBTdGFuZGFyZCBPVEVMIGVycm9yIGNvbnZlbnRpb25zXG4vLyBTZWU6IGh0dHBzOi8vb3BlbnRlbGVtZXRyeS5pby9kb2NzL3NwZWNzL3NlbWNvbnYvZXhjZXB0aW9ucy9leGNlcHRpb25zLXNwYW5zL1xuXG4vKiogV2hldGhlciB0aGUgZXJyb3IgaXMgcmV0cnlhYmxlICh3b3JrZmxvdy1zcGVjaWZpYykgKi9cbmV4cG9ydCBjb25zdCBFcnJvclJldHJ5YWJsZSA9IFNlbWFudGljQ29udmVudGlvbjxib29sZWFuPignZXJyb3IucmV0cnlhYmxlJyk7XG5cbi8qKiBFcnJvciBjYXRlZ29yeSAod29ya2Zsb3ctc3BlY2lmaWM6IGZhdGFsLCByZXRyeWFibGUsIHRyYW5zaWVudCkgKi9cbmV4cG9ydCBjb25zdCBFcnJvckNhdGVnb3J5ID0gU2VtYW50aWNDb252ZW50aW9uPFxuICAnZmF0YWwnIHwgJ3JldHJ5YWJsZScgfCAndHJhbnNpZW50J1xuPignZXJyb3IuY2F0ZWdvcnknKTtcbiJdfQ==
@@ -1,5 +1,59 @@
1
1
  import type * as api from '@opentelemetry/api';
2
2
  import type { Span, SpanKind, SpanOptions } from '@opentelemetry/api';
3
+ import { WorkflowSuspension } from './global.js';
4
+ /**
5
+ * Controls how workflow/step queue-handler spans relate to the run-origin
6
+ * trace context carried in queue messages:
7
+ *
8
+ * - `'linked'` (default): each invocation starts a NEW root trace; the
9
+ * run-origin context (and the incoming delivery context) are attached as
10
+ * span links. This keeps traces bounded per invocation instead of
11
+ * stitching a long-lived run into one giant trace.
12
+ * - `'continuous'`: the restored run-origin context becomes the parent of
13
+ * the invocation span (legacy behavior), producing a single trace that
14
+ * spans the entire run.
15
+ */
16
+ export type WorkflowTraceMode = 'linked' | 'continuous';
17
+ /**
18
+ * Resolves the active trace mode from the `WORKFLOW_TRACE_MODE` env var.
19
+ * Defaults to `'linked'`; any value other than `'continuous'` selects it.
20
+ * Unrecognized non-empty values (e.g. typos like `continous`) emit a
21
+ * one-time warning so silent fallback to `linked` is at least visible.
22
+ */
23
+ export declare function getWorkflowTraceMode(): WorkflowTraceMode;
24
+ /**
25
+ * Returns whether a serialized trace carrier is usable, i.e. present and
26
+ * non-empty. `serializeTraceCarrier()` returns `{}` when no OTEL SDK is
27
+ * registered or no span is active, and `start()` always attaches the
28
+ * carrier to the first queue message — so an empty carrier must be treated
29
+ * the same as an absent one wherever the trace-mode logic branches.
30
+ */
31
+ export declare function isUsableTraceCarrier(carrier: Record<string, string> | undefined): carrier is Record<string, string>;
32
+ /**
33
+ * Returns the trace carrier to attach to messages the current invocation
34
+ * enqueues. In `linked` mode the ORIGINAL run-origin carrier is forwarded
35
+ * unchanged (when usable) so every future invocation links back to the same
36
+ * origin; otherwise — `continuous` mode, or no usable incoming carrier —
37
+ * the current (active) context is serialized, so the trace keeps chaining
38
+ * (continuous) or the first instrumented invocation becomes the de-facto
39
+ * origin (linked).
40
+ */
41
+ export declare function getNextTraceCarrier(traceMode: WorkflowTraceMode, incomingCarrier: Record<string, string> | undefined): Promise<Record<string, string>>;
42
+ /**
43
+ * Builds the span links for a queue-delivered invocation span
44
+ * (`workflow.execute` / `step.execute`):
45
+ *
46
+ * - In `linked` mode the invocation span is a CHILD of the local delivery
47
+ * (flow-route) context, so the only link is to the run-origin context
48
+ * from the message's trace carrier — connecting this bounded per-invocation
49
+ * trace back to where the run was started. The run-origin context is a
50
+ * link, never a parent, and re-enqueues forward the original carrier
51
+ * unchanged, so the whole run is never stitched into one giant trace.
52
+ * The link is skipped when the carrier is absent, empty, or invalid.
53
+ * - In `continuous` mode the run-origin context is restored as the parent
54
+ * instead, and the link points at the incoming delivery context.
55
+ */
56
+ export declare function buildInvocationSpanLinks(traceMode: WorkflowTraceMode, incomingCarrier: Record<string, string> | undefined): Promise<api.Link[] | undefined>;
3
57
  /**
4
58
  * Serializes the current trace context into a format that can be passed through queues
5
59
  * @returns A record of strings representing the trace context
@@ -19,6 +73,18 @@ export declare function deserializeTraceCarrier(traceCarrier: Record<string, str
19
73
  */
20
74
  export declare function withTraceContext<T>(traceCarrier: Record<string, string> | undefined, fn: () => Promise<T>): Promise<T>;
21
75
  export declare function trace<T>(spanName: string, ...args: [fn: (span?: Span) => Promise<T>] | [opts: SpanOptions, fn: (span?: Span) => Promise<T>]): Promise<T>;
76
+ /**
77
+ * Emit a span whose start is back-dated to `startEpochMs` and whose end is now,
78
+ * so its duration reflects an interval only measurable at its end (e.g.
79
+ * time-to-first-chunk, known when the first chunk arrives). Unlike `trace()`,
80
+ * this records an already-elapsed span in one shot rather than wrapping a
81
+ * callback. No-op when OpenTelemetry is not available.
82
+ */
83
+ export declare function recordElapsedSpan(spanName: string, startEpochMs: number, opts?: SpanOptions): Promise<void>;
84
+ /**
85
+ * Applies the workflow suspension algebraic effect to an active span.
86
+ */
87
+ export declare function applyWorkflowSuspensionToSpan(error: WorkflowSuspension, span: api.Span): void;
22
88
  export declare function getSpanContextForTraceCarrier(carrier: Record<string, string>): Promise<api.SpanContext | undefined>;
23
89
  export declare function getActiveSpan(): Promise<api.Span | undefined>;
24
90
  /**
@@ -31,6 +97,13 @@ export declare function instrumentObject<T extends object>(prefix: string, o: T)
31
97
  export declare function getSpanKind(field: keyof typeof SpanKind): Promise<api.SpanKind | undefined>;
32
98
  export declare function withOtel<T>(fn: (otel: typeof api) => T): Promise<Awaited<T> | undefined>;
33
99
  export declare function linkToCurrentContext(): Promise<[api.Link] | undefined>;
100
+ /**
101
+ * Builds a span link pointing at the span context embedded in a serialized
102
+ * trace carrier (e.g. the run-origin context flowing through queue
103
+ * messages). Returns `undefined` when OTEL is unavailable, the carrier is
104
+ * absent, or it does not contain a valid span context.
105
+ */
106
+ export declare function linkToTraceCarrier(carrier: Record<string, string> | undefined): Promise<api.Link | undefined>;
34
107
  /**
35
108
  * Workflow context to propagate via baggage
36
109
  */
@@ -1 +1 @@
1
- {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,oBAAoB,CAAC;AAC/C,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAUtE;;;GAGG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAO7E;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,oCAMrC;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EACtC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EAChD,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC,CAcZ;AAiBD,wBAAsB,KAAK,CAAC,CAAC,EAC3B,QAAQ,EAAE,MAAM,EAChB,GAAG,IAAI,EACH,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,GACjC,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,GACvD,OAAO,CAAC,CAAC,CAAC,CA4BZ;AAwBD,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,wCAQhC;AAED,wBAAsB,aAAa,kCAElC;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAa1E;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,OAAO,QAAQ,qCAE7D;AAED,wBAAsB,QAAQ,CAAC,CAAC,EAC9B,EAAE,EAAE,CAAC,IAAI,EAAE,OAAO,GAAG,KAAK,CAAC,GAC1B,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAIjC;AAED,wBAAgB,oBAAoB,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAMtE;AAMD;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,CAAC,EACzC,OAAO,EAAE,sBAAsB,EAC/B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC,CAiBZ;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CACjD,sBAAsB,GAAG,SAAS,CACnC,CAgBA"}
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"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"}