@workflow/core 5.0.0-beta.35 → 5.0.0-beta.37

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 (137) hide show
  1. package/dist/capabilities.d.ts +6 -0
  2. package/dist/capabilities.d.ts.map +1 -1
  3. package/dist/capabilities.js +13 -1
  4. package/dist/classify-error.d.ts.map +1 -1
  5. package/dist/classify-error.js +5 -2
  6. package/dist/create-hook.d.ts +41 -22
  7. package/dist/create-hook.d.ts.map +1 -1
  8. package/dist/create-hook.js +1 -1
  9. package/dist/describe-error.d.ts.map +1 -1
  10. package/dist/describe-error.js +12 -1
  11. package/dist/encryption.d.ts +15 -2
  12. package/dist/encryption.d.ts.map +1 -1
  13. package/dist/encryption.js +28 -7
  14. package/dist/flushable-stream.d.ts +55 -0
  15. package/dist/flushable-stream.d.ts.map +1 -1
  16. package/dist/flushable-stream.js +106 -4
  17. package/dist/global.d.ts +2 -0
  18. package/dist/global.d.ts.map +1 -1
  19. package/dist/global.js +1 -1
  20. package/dist/index.d.ts +1 -1
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +2 -2
  23. package/dist/log-format.js +3 -3
  24. package/dist/private.d.ts +82 -50
  25. package/dist/private.d.ts.map +1 -1
  26. package/dist/private.js +149 -22
  27. package/dist/replay-payload-cache.d.ts +57 -0
  28. package/dist/replay-payload-cache.d.ts.map +1 -0
  29. package/dist/replay-payload-cache.js +143 -0
  30. package/dist/runtime/constants.d.ts +11 -0
  31. package/dist/runtime/constants.d.ts.map +1 -1
  32. package/dist/runtime/constants.js +26 -1
  33. package/dist/runtime/count-step-started-events.d.ts +52 -0
  34. package/dist/runtime/count-step-started-events.d.ts.map +1 -0
  35. package/dist/runtime/count-step-started-events.js +72 -0
  36. package/dist/runtime/get-port-lazy.js +4 -4
  37. package/dist/runtime/helpers.d.ts +47 -16
  38. package/dist/runtime/helpers.d.ts.map +1 -1
  39. package/dist/runtime/helpers.js +97 -28
  40. package/dist/runtime/resume-hook.d.ts +6 -3
  41. package/dist/runtime/resume-hook.d.ts.map +1 -1
  42. package/dist/runtime/resume-hook.js +180 -58
  43. package/dist/runtime/run.d.ts.map +1 -1
  44. package/dist/runtime/run.js +3 -3
  45. package/dist/runtime/runs.d.ts.map +1 -1
  46. package/dist/runtime/runs.js +5 -3
  47. package/dist/runtime/start.d.ts.map +1 -1
  48. package/dist/runtime/start.js +65 -18
  49. package/dist/runtime/step-executor.d.ts +48 -8
  50. package/dist/runtime/step-executor.d.ts.map +1 -1
  51. package/dist/runtime/step-executor.js +90 -20
  52. package/dist/runtime/suspension-handler.js +3 -3
  53. package/dist/runtime/world.d.ts +2 -7
  54. package/dist/runtime/world.d.ts.map +1 -1
  55. package/dist/runtime/world.js +3 -10
  56. package/dist/runtime.d.ts +1 -1
  57. package/dist/runtime.d.ts.map +1 -1
  58. package/dist/runtime.js +398 -184
  59. package/dist/sealed-box.d.ts +167 -0
  60. package/dist/sealed-box.d.ts.map +1 -0
  61. package/dist/sealed-box.js +571 -0
  62. package/dist/serialization/client.d.ts +3 -3
  63. package/dist/serialization/client.d.ts.map +1 -1
  64. package/dist/serialization/client.js +1 -1
  65. package/dist/serialization/codec.d.ts +6 -4
  66. package/dist/serialization/codec.d.ts.map +1 -1
  67. package/dist/serialization/codec.js +1 -1
  68. package/dist/serialization/encryption.d.ts +118 -17
  69. package/dist/serialization/encryption.d.ts.map +1 -1
  70. package/dist/serialization/encryption.js +131 -15
  71. package/dist/serialization/step.d.ts +4 -4
  72. package/dist/serialization/step.d.ts.map +1 -1
  73. package/dist/serialization/step.js +2 -2
  74. package/dist/serialization/types.d.ts +20 -0
  75. package/dist/serialization/types.d.ts.map +1 -1
  76. package/dist/serialization/types.js +11 -1
  77. package/dist/serialization-format.d.ts +44 -4
  78. package/dist/serialization-format.d.ts.map +1 -1
  79. package/dist/serialization-format.js +66 -9
  80. package/dist/serialization.d.ts +61 -21
  81. package/dist/serialization.d.ts.map +1 -1
  82. package/dist/serialization.js +556 -200
  83. package/dist/set-attributes.d.ts +2 -7
  84. package/dist/set-attributes.d.ts.map +1 -1
  85. package/dist/set-attributes.js +1 -6
  86. package/dist/step/context-storage.d.ts +2 -2
  87. package/dist/step/context-storage.d.ts.map +1 -1
  88. package/dist/step/context-storage.js +2 -2
  89. package/dist/step/writable-stream.d.ts.map +1 -1
  90. package/dist/step/writable-stream.js +14 -3
  91. package/dist/step.d.ts.map +1 -1
  92. package/dist/step.js +87 -22
  93. package/dist/symbols.d.ts +26 -0
  94. package/dist/symbols.d.ts.map +1 -1
  95. package/dist/symbols.js +27 -1
  96. package/dist/telemetry/semantic-conventions.d.ts +4 -4
  97. package/dist/telemetry/semantic-conventions.js +2 -2
  98. package/dist/version.d.ts +1 -1
  99. package/dist/version.js +2 -2
  100. package/dist/vm/index.d.ts.map +1 -1
  101. package/dist/vm/index.js +76 -9
  102. package/dist/workflow/abort-controller.d.ts +1 -1
  103. package/dist/workflow/abort-controller.d.ts.map +1 -1
  104. package/dist/workflow/abort-controller.js +38 -3
  105. package/dist/workflow/hook.d.ts.map +1 -1
  106. package/dist/workflow/hook.js +85 -30
  107. package/dist/workflow/index.d.ts +1 -1
  108. package/dist/workflow/index.d.ts.map +1 -1
  109. package/dist/workflow/index.js +2 -2
  110. package/dist/workflow/set-attributes.d.ts +0 -9
  111. package/dist/workflow/set-attributes.d.ts.map +1 -1
  112. package/dist/workflow/set-attributes.js +1 -6
  113. package/dist/workflow/sleep.d.ts.map +1 -1
  114. package/dist/workflow/sleep.js +21 -9
  115. package/dist/workflow.d.ts +14 -11
  116. package/dist/workflow.d.ts.map +1 -1
  117. package/dist/workflow.js +37 -92
  118. package/docs/api-reference/create-hook.mdx +43 -2
  119. package/docs/api-reference/define-hook.mdx +26 -24
  120. package/docs/api-reference/fatal-error.mdx +29 -7
  121. package/docs/api-reference/fetch.mdx +3 -4
  122. package/docs/api-reference/set-attributes.mdx +0 -4
  123. package/docs/api-reference/sleep.mdx +1 -1
  124. package/docs/foundations/hooks.mdx +1 -1
  125. package/docs/foundations/idempotency.mdx +16 -9
  126. package/docs/how-it-works/cancellation.mdx +2 -2
  127. package/docs/how-it-works/code-transform.mdx +19 -15
  128. package/docs/how-it-works/encryption.mdx +3 -3
  129. package/docs/how-it-works/event-sourcing.mdx +6 -6
  130. package/docs/how-it-works/framework-integrations.mdx +96 -342
  131. package/package.json +6 -6
  132. package/dist/runtime/step-handler.d.ts +0 -2
  133. package/dist/runtime/step-handler.d.ts.map +0 -1
  134. package/dist/runtime/step-handler.js +0 -839
  135. package/dist/step-hydration-cache.d.ts +0 -148
  136. package/dist/step-hydration-cache.d.ts.map +0 -1
  137. package/dist/step-hydration-cache.js +0 -171
@@ -1,11 +1,11 @@
1
- import { HookConflictError, ReplayDivergenceError } from '@workflow/errors';
2
- import { withResolvers } from '@workflow/utils';
1
+ import { FatalError, HookConflictError, ReplayDivergenceError, } from '@workflow/errors';
2
+ import { WORKFLOW_DESERIALIZE } from '@workflow/serde';
3
+ import { parseDurationToDate, withResolvers, } from '@workflow/utils';
4
+ import { getSerializationClass, RUN_CLASS_ID } from '../class-serialization.js';
3
5
  import { EventConsumerResult } from '../events-consumer.js';
4
6
  import { WorkflowSuspension } from '../global.js';
5
7
  import { webhookLogger } from '../logger.js';
6
8
  import { awaitEarlierDeliveries, registerDeliveryBarrier, scheduleWhenIdle, } from '../private.js';
7
- import { WORKFLOW_DESERIALIZE } from '@workflow/serde';
8
- import { getSerializationClass, RUN_CLASS_ID } from '../class-serialization.js';
9
9
  import { hydrateStepReturnValue } from '../serialization.js';
10
10
  /**
11
11
  * Constructs a `Run` handle for the run that owns a conflicting hook
@@ -49,15 +49,27 @@ export function createCreateHook(ctx) {
49
49
  if (options.token === '') {
50
50
  throw new Error('`createHook()` was called with an empty string token. Pass a non-empty token, or omit the `token` option to use a randomly generated one.');
51
51
  }
52
+ if (options.isWebhook === true &&
53
+ options.experimental_minRetention !== undefined) {
54
+ throw new Error('Webhook hooks do not support `experimental_minRetention`. Use a non-webhook `createHook()` with `resumeHook()`.');
55
+ }
56
+ if (options.experimental_minRetention !== undefined &&
57
+ ctx.worldCapabilities?.hookRetention?.active !== true) {
58
+ throw new FatalError('The configured World does not support `experimental_minRetention` for Hooks.');
59
+ }
52
60
  // Generate hook ID and token
53
61
  const correlationId = `hook_${ctx.generateUlid()}`;
54
62
  const token = options.token ?? ctx.generateNanoid();
63
+ const tokenRetentionUntil = options.experimental_minRetention === undefined
64
+ ? undefined
65
+ : parseDurationToDate(options.experimental_minRetention);
55
66
  // Add hook creation to invocations queue (using Map for O(1) operations)
56
67
  const isWebhook = options.isWebhook ?? false;
57
68
  ctx.invocationsQueue.set(correlationId, {
58
69
  type: 'hook',
59
70
  correlationId,
60
71
  token,
72
+ tokenRetentionUntil,
61
73
  metadata: options.metadata,
62
74
  isWebhook,
63
75
  });
@@ -117,6 +129,7 @@ export function createCreateHook(ctx) {
117
129
  const queueItem = ctx.invocationsQueue.get(correlationId);
118
130
  if (queueItem && queueItem.type === 'hook') {
119
131
  queueItem.hasCreatedEvent = true;
132
+ queueItem.tokenRetentionUntil = event.eventData.tokenRetentionUntil;
120
133
  }
121
134
  hasCreated = true;
122
135
  const pendingGetConflictPromises = getConflictPromises.slice();
@@ -170,27 +183,53 @@ export function createCreateHook(ctx) {
170
183
  }
171
184
  if (event.eventType === 'hook_received') {
172
185
  // Register a 'hook' delivery barrier at this event's log index so a
173
- // later-in-log `wait_completed` is delivered only after this hook,
174
- // and so this hook is delivered only after every earlier-in-log
175
- // `wait_completed` — keeping any `Promise.race` against a wait
176
- // deterministic and aligned with the committed event log, regardless
177
- // of microtask-hop count, hydration time, or race-argument order.
186
+ // later-in-log `wait_completed` or step result is delivered only after
187
+ // this hook, and so this hook is delivered only after every
188
+ // earlier-in-log `wait_completed` and step result — keeping any
189
+ // `Promise.race` (or concurrent-branch ULID allocation) deterministic
190
+ // and aligned with the committed event log, regardless of
191
+ // microtask-hop count, hydration time, or race-argument order.
178
192
  // See `ctx.pendingDeliveryBarriers`.
193
+ //
194
+ // The barrier is registered ARMED only when a consumer is already
195
+ // awaiting, so this payload is committed to reaching the workflow. A
196
+ // buffered payload is registered unarmed and armed by `claim()`: until
197
+ // a consumer takes it, a later step result must not be ordered behind
198
+ // it (see `awaitEarlierDeliveries`).
179
199
  const eventIndex = ctx.eventsConsumer.eventIndex;
180
- const barrier = registerDeliveryBarrier(ctx, eventIndex, 'hook');
181
- if (promises.length > 0) {
200
+ const hasWaitingConsumer = promises.length > 0;
201
+ const barrier = registerDeliveryBarrier(ctx, eventIndex, 'hook', {
202
+ armed: hasWaitingConsumer,
203
+ });
204
+ if (hasWaitingConsumer) {
205
+ // A consumer is already awaiting, so this payload's delivery is
206
+ // pinned to this log position: capture the deferral HERE, while
207
+ // consuming the event, not at the end of the hydration slot below —
208
+ // same reasoning as step.ts. An earlier step or hook whose slot runs
209
+ // first on this serial queue has usually delivered, and so
210
+ // deregistered its barrier, before this slot ends. Read then, it
211
+ // would be invisible and this payload would skip both the gate AND
212
+ // `awaitEarlierDeliveries`' macrotask yield, letting it overtake the
213
+ // branch that earlier delivery just woke. Every event in one drain
214
+ // window is consumed before any slot runs, so capturing at
215
+ // consumption time sees all of them.
216
+ //
217
+ // The BUFFERED branch below deliberately does NOT do this — see the
218
+ // comment on `claim()`.
219
+ const earlierDelivered = awaitEarlierDeliveries(ctx, eventIndex, 'hook');
182
220
  const next = promises.shift();
183
221
  if (next) {
184
- // A consumer is already awaiting. Hydrate through a promiseQueue
185
- // slot (so async deserialization stays in event-log order), then
186
- // defer behind earlier waits before resolving. The deferral runs
187
- // OFF the serial queue (it may wait on an earlier wait delivery
188
- // and blocking a queue slot on that would deadlock the queue).
222
+ // Hydrate through a promiseQueue slot (so async deserialization
223
+ // stays in event-log order), then defer behind earlier waits and
224
+ // steps before resolving. The deferral runs OFF the serial queue
225
+ // (it may wait on an earlier wait or step delivery and blocking a
226
+ // queue slot on that would deadlock the queue).
189
227
  ctx.pendingDeliveries++;
190
228
  let hydrateOutcome;
191
229
  ctx.promiseQueue = ctx.promiseQueue.then(async () => {
192
230
  try {
193
- const payload = await hydrateStepReturnValue(event.eventData.payload, ctx.runId, ctx.encryptionKey, ctx.globalThis);
231
+ const prepared = await ctx.replayPayloadCache.prepareEventPayload(event.eventId, 'payload', event.eventData.payload);
232
+ const payload = await hydrateStepReturnValue(event.eventData.payload, ctx.runId, ctx.encryptionKey, ctx.globalThis, {}, prepared);
194
233
  hydrateOutcome = { ok: true, value: payload };
195
234
  }
196
235
  catch (error) {
@@ -199,7 +238,7 @@ export function createCreateHook(ctx) {
199
238
  finally {
200
239
  ctx.pendingDeliveries--;
201
240
  }
202
- void awaitEarlierDeliveries(ctx, eventIndex, ['wait']).then(() => {
241
+ void earlierDelivered.then(() => {
203
242
  barrier.markDelivered();
204
243
  if (hydrateOutcome.ok) {
205
244
  next.resolve(hydrateOutcome.value);
@@ -222,19 +261,35 @@ export function createCreateHook(ctx) {
222
261
  // the consumer-facing promise on demand.
223
262
  let outcome;
224
263
  const hydrated = withResolvers();
225
- const claim = () => hydrated.promise
226
- .then(() => awaitEarlierDeliveries(ctx, eventIndex, ['wait']))
227
- .then(() => {
228
- barrier.markDelivered();
229
- if (outcome && !outcome.ok) {
230
- throw outcome.error;
231
- }
232
- return outcome.value;
233
- });
264
+ const claim = () => {
265
+ // A consumer has taken this payload, so its delivery no longer
266
+ // waits on workflow code: later step results may now be ordered
267
+ // behind it.
268
+ barrier.arm();
269
+ // Unlike every other delivery, the deferral is evaluated HERE, at
270
+ // claim time, rather than when the event was consumed. A buffered
271
+ // payload's delivery genuinely happens when the workflow reads the
272
+ // hook, which may be many deliveries later; a consumption-time
273
+ // snapshot would make the claim wait on — and pay the macrotask
274
+ // yield for — barriers that were relevant to a moment this payload
275
+ // never participated in. That is not theoretical: it stalls the
276
+ // second payload in the e2e `hookWithSleepWorkflow` long enough
277
+ // for the run to suspend before delivering it.
278
+ return hydrated.promise
279
+ .then(() => awaitEarlierDeliveries(ctx, eventIndex, 'hook'))
280
+ .then(() => {
281
+ barrier.markDelivered();
282
+ if (outcome && !outcome.ok) {
283
+ throw outcome.error;
284
+ }
285
+ return outcome.value;
286
+ });
287
+ };
234
288
  ctx.pendingDeliveries++;
235
289
  ctx.promiseQueue = ctx.promiseQueue.then(async () => {
236
290
  try {
237
- const payload = await hydrateStepReturnValue(event.eventData.payload, ctx.runId, ctx.encryptionKey, ctx.globalThis);
291
+ const prepared = await ctx.replayPayloadCache.prepareEventPayload(event.eventId, 'payload', event.eventData.payload);
292
+ const payload = await hydrateStepReturnValue(event.eventData.payload, ctx.runId, ctx.encryptionKey, ctx.globalThis, {}, prepared);
238
293
  outcome = { ok: true, value: payload };
239
294
  }
240
295
  catch (error) {
@@ -282,7 +337,7 @@ export function createCreateHook(ctx) {
282
337
  // The payload was hydrated through a promiseQueue slot at its log
283
338
  // position (buffering branch above). `claim()` builds the
284
339
  // consumer-facing promise from that outcome, deferring behind any
285
- // earlier-in-log wait and marking this hook delivered — so
340
+ // earlier-in-log wait or step and marking this hook delivered — so
286
341
  // resolution order stays anchored to the event log, not this later
287
342
  // claim site.
288
343
  return nextDelivery.claim();
@@ -387,4 +442,4 @@ export function createCreateHook(ctx) {
387
442
  return hook;
388
443
  };
389
444
  }
390
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9vay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93b3JrZmxvdy9ob29rLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzVFLE9BQU8sRUFBNkIsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHM0UsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2xELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDN0MsT0FBTyxFQUNMLHNCQUFzQixFQUN0Qix1QkFBdUIsRUFDdkIsZ0JBQWdCLEdBRWpCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVoRixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUU3RDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILFNBQVMsb0JBQW9CLENBQzNCLEdBQWdDLEVBQ2hDLGdCQUFvQztJQUVwQyxJQUFJLE9BQU8sZ0JBQWdCLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDekMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsTUFBTSxRQUFRLEdBQUcscUJBQXFCLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxVQUFVLENBSXRELENBQUM7SUFDZCxNQUFNLFdBQVcsR0FBSSxRQUFnQixFQUFFLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUM5RCxJQUFJLE9BQU8sV0FBVyxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ3RDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNELE9B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RUFBc0U7WUFDdEUsSUFBSSxDQUNGLFdBQXFFLEVBQ3JFLFVBQXVFO2dCQUV2RSxPQUFPLGlCQUFpQixFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUMzRCxDQUFDO1lBRUQsMkRBQTJEO1lBQzNELEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQztnQkFDM0IsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUNuQixNQUFNLE1BQU0sSUFBSSxDQUFDO2dCQUNuQixDQUFDO1lBQ0gsQ0FBQztZQUVELE9BQU8sRUFBRSxXQUFXO1lBRXBCLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFdBQVc7U0FDOUIsQ0FBQztRQUVGLHFFQUFxRTtRQUNyRSxvRUFBb0U7UUFDcEUsaUNBQWlDO1FBQ2pDLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUNoRCxJQUFJLFNBQVMsSUFBSSxTQUFTLEtBQUssTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzdDLElBQVksQ0FBQyxTQUFTLENBQUMsR0FBRyxXQUFXLENBQUM7UUFDekMsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEhvb2tDb25mbGljdEVycm9yLCBSZXBsYXlEaXZlcmdlbmNlRXJyb3IgfSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7IHR5cGUgUHJvbWlzZVdpdGhSZXNvbHZlcnMsIHdpdGhSZXNvbHZlcnMgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBIb29rQ29uZmxpY3RFdmVudCB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgdHlwZSB7IEhvb2ssIEhvb2tPcHRpb25zIH0gZnJvbSAnLi4vY3JlYXRlLWhvb2suanMnO1xuaW1wb3J0IHsgRXZlbnRDb25zdW1lclJlc3VsdCB9IGZyb20gJy4uL2V2ZW50cy1jb25zdW1lci5qcyc7XG5pbXBvcnQgeyBXb3JrZmxvd1N1c3BlbnNpb24gfSBmcm9tICcuLi9nbG9iYWwuanMnO1xuaW1wb3J0IHsgd2ViaG9va0xvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQge1xuICBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzLFxuICByZWdpc3RlckRlbGl2ZXJ5QmFycmllcixcbiAgc2NoZWR1bGVXaGVuSWRsZSxcbiAgdHlwZSBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQsXG59IGZyb20gJy4uL3ByaXZhdGUuanMnO1xuaW1wb3J0IHsgV09SS0ZMT1dfREVTRVJJQUxJWkUgfSBmcm9tICdAd29ya2Zsb3cvc2VyZGUnO1xuaW1wb3J0IHsgZ2V0U2VyaWFsaXphdGlvbkNsYXNzLCBSVU5fQ0xBU1NfSUQgfSBmcm9tICcuLi9jbGFzcy1zZXJpYWxpemF0aW9uLmpzJztcbmltcG9ydCB0eXBlIHsgUnVuIH0gZnJvbSAnLi4vcnVudGltZS9ydW4uanMnO1xuaW1wb3J0IHsgaHlkcmF0ZVN0ZXBSZXR1cm5WYWx1ZSB9IGZyb20gJy4uL3NlcmlhbGl6YXRpb24uanMnO1xuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBgUnVuYCBoYW5kbGUgZm9yIHRoZSBydW4gdGhhdCBvd25zIGEgY29uZmxpY3RpbmcgaG9va1xuICogdG9rZW4sIGZvciByZXNvbHV0aW9uIHRocm91Z2ggYGhvb2suZ2V0Q29uZmxpY3QoKWAuXG4gKlxuICogVGhlIGluc3RhbmNlIGlzIGNyZWF0ZWQgdGhyb3VnaCB0aGUgc2VyaWFsaXphdGlvbiBjbGFzcyByZWdpc3RyeSBvblxuICogdGhlIFZNJ3MgZ2xvYmFsVGhpcyDigJQgdGhlIHNhbWUgY2hhbm5lbCB0aGF0IHJldml2ZXMgc2VyaWFsaXplZCBgUnVuYFxuICogaW5zdGFuY2VzIChlLmcuIGBzdGFydCgpYCByZXR1cm4gdmFsdWVzIGNyb3NzaW5nIGZyb20gYSBzdGVwIGludG8gdGhlXG4gKiB3b3JrZmxvdykuIFRoZSByZWdpc3RlcmVkIGNsYXNzIGlzIHRoZSBWTSBidW5kbGUncyBwbHVnaW4tY29tcGlsZWRcbiAqIGBSdW5gLCB3aG9zZSBtZXRob2RzIGFyZSBkdXJhYmxlIHN0ZXAgcHJveGllcyDigJQgc2FmZSB0byBjYWxsIGZyb21cbiAqIHdvcmtmbG93IGNvZGUg4oCUIGFuZCBjb25zdHJ1Y3Rpb24gZ29lcyB0aHJvdWdoIGl0c1xuICogYFdPUktGTE9XX0RFU0VSSUFMSVpFYCBob29rLCBleGFjdGx5IGFzIHRoZSBgSW5zdGFuY2VgIHJldml2ZXIgd291bGQuXG4gKlxuICogUmV0dXJucyBgbnVsbGAgd2hlbiBhIHJlYWwgYFJ1bmAgY2Fubm90IGJlIGNvbnN0cnVjdGVkOiB0aGUgY29uZmxpY3RcbiAqIGV2ZW50IGxhY2tzIGBjb25mbGljdGluZ1J1bklkYCAod3JpdHRlbiBieSBhbiBvbGQgd29ybGQpLCBvciB0aGUgVk0nc1xuICogcmVnaXN0cnkgaGFzIG5vIGBSdW5gIChhIGNvbnRleHQgdGhhdCBuZXZlciBldmFsdWF0ZWQgdGhlXG4gKiB3b3JrZmxvdy1tb2RlIGBjcmVhdGUtaG9va2AgbW9kdWxlLCB3aGljaCBhbGlhc2VzIGl0IHVuZGVyXG4gKiBgUlVOX0NMQVNTX0lEYCkuIGBnZXRDb25mbGljdGAgYXdhaXRlcnMgdGhlbiByZWplY3Qgd2l0aFxuICogYEhvb2tDb25mbGljdEVycm9yYCBpbnN0ZWFkIG9mIHJlc29sdmluZyB3aXRoIGEgdmFsdWUgdGhhdCBkb2Vzbid0XG4gKiBob25vciB0aGUgYFJ1bmAgY29udHJhY3QuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUNvbmZsaWN0aW5nUnVuKFxuICBjdHg6IFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dCxcbiAgY29uZmxpY3RpbmdSdW5JZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBSdW48dW5rbm93bj4gfCBudWxsIHtcbiAgaWYgKHR5cGVvZiBjb25mbGljdGluZ1J1bklkICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IFJ1bkNsYXNzID0gZ2V0U2VyaWFsaXphdGlvbkNsYXNzKFJVTl9DTEFTU19JRCwgY3R4Lmdsb2JhbFRoaXMpIGFzXG4gICAgfCAoYWJzdHJhY3QgbmV3IChcbiAgICAgICAgLi4uYXJnczogbmV2ZXJcbiAgICAgICkgPT4gUnVuPHVua25vd24+KVxuICAgIHwgdW5kZWZpbmVkO1xuICBjb25zdCBkZXNlcmlhbGl6ZSA9IChSdW5DbGFzcyBhcyBhbnkpPy5bV09SS0ZMT1dfREVTRVJJQUxJWkVdO1xuICBpZiAodHlwZW9mIGRlc2VyaWFsaXplICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIGRlc2VyaWFsaXplLmNhbGwoUnVuQ2xhc3MsIHsgcnVuSWQ6IGNvbmZsaWN0aW5nUnVuSWQgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDcmVhdGVIb29rKGN0eDogV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBjcmVhdGVIb29rSW1wbDxUID0gYW55PihvcHRpb25zOiBIb29rT3B0aW9ucyA9IHt9KTogSG9vazxUPiB7XG4gICAgLy8gUmVqZWN0IGFuIGV4cGxpY2l0IGVtcHR5LXN0cmluZyB0b2tlbi4gQSB0b2tlbiBtdXN0IGVpdGhlciBiZSBvbWl0dGVkXG4gICAgLy8gKG9yIGB1bmRlZmluZWRgL2BudWxsYCkgdG8gZ2V0IGEgcmFuZG9tbHkgZ2VuZXJhdGVkIG9uZSwgb3IgYmUgYW5cbiAgICAvLyBleHBsaWNpdCBub24tZW1wdHkgc3RyaW5nLiBBbiBlbXB0eSBzdHJpbmcgaXMgYWxtb3N0IGFsd2F5cyBhblxuICAgIC8vIGFjY2lkZW50YWwgdmFsdWUgKGUuZy4gYW4gdW5zZXQgdmFyaWFibGUpIGFuZCB3b3VsZCBvdGhlcndpc2Ugc2xpcFxuICAgIC8vIHRocm91Z2ggdGhlIGA/P2AgYmVsb3cg4oCUIHdoaWNoIG9ubHkgZmFsbHMgYmFjayBmb3IgbnVsbGlzaCB2YWx1ZXMg4oCUIGFuZFxuICAgIC8vIGJlIHVzZWQgYXMgYSBtZWFuaW5nbGVzcywgbm9uLWRldGVybWluaXN0aWMgdG9rZW4uXG4gICAgaWYgKG9wdGlvbnMudG9rZW4gPT09ICcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdgY3JlYXRlSG9vaygpYCB3YXMgY2FsbGVkIHdpdGggYW4gZW1wdHkgc3RyaW5nIHRva2VuLiBQYXNzIGEgbm9uLWVtcHR5IHRva2VuLCBvciBvbWl0IHRoZSBgdG9rZW5gIG9wdGlvbiB0byB1c2UgYSByYW5kb21seSBnZW5lcmF0ZWQgb25lLidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gR2VuZXJhdGUgaG9vayBJRCBhbmQgdG9rZW5cbiAgICBjb25zdCBjb3JyZWxhdGlvbklkID0gYGhvb2tfJHtjdHguZ2VuZXJhdGVVbGlkKCl9YDtcbiAgICBjb25zdCB0b2tlbiA9IG9wdGlvbnMudG9rZW4gPz8gY3R4LmdlbmVyYXRlTmFub2lkKCk7XG5cbiAgICAvLyBBZGQgaG9vayBjcmVhdGlvbiB0byBpbnZvY2F0aW9ucyBxdWV1ZSAodXNpbmcgTWFwIGZvciBPKDEpIG9wZXJhdGlvbnMpXG4gICAgY29uc3QgaXNXZWJob29rID0gb3B0aW9ucy5pc1dlYmhvb2sgPz8gZmFsc2U7XG5cbiAgICBjdHguaW52b2NhdGlvbnNRdWV1ZS5zZXQoY29ycmVsYXRpb25JZCwge1xuICAgICAgdHlwZTogJ2hvb2snLFxuICAgICAgY29ycmVsYXRpb25JZCxcbiAgICAgIHRva2VuLFxuICAgICAgbWV0YWRhdGE6IG9wdGlvbnMubWV0YWRhdGEsXG4gICAgICBpc1dlYmhvb2ssXG4gICAgfSk7XG5cbiAgICAvLyBRdWV1ZSBvZiBidWZmZXJlZCBob29rIHBheWxvYWRzIChyZWNlaXZlZCBiZWZvcmUgdGhlIHdvcmtmbG93IGF3YWl0ZWRcbiAgICAvLyB0aGUgaG9vaykuIEVhY2ggZW50cnkncyBgY2xhaW0oKWAgYnVpbGRzIHRoZSBjb25zdW1lci1mYWNpbmcgcHJvbWlzZVxuICAgIC8vIGZyb20gdGhlIGNhcHR1cmVkIGh5ZHJhdGlvbiBvdXRjb21lIGFuZCBvcmRlcnMgaXQgZGV0ZXJtaW5pc3RpY2FsbHkgYnlcbiAgICAvLyBldmVudC1sb2cgcG9zaXRpb24gYWdhaW5zdCBhbnkgY29uY3VycmVudCBicmFuY2gtZGVjaWRpbmcgcmVzb2x1dGlvblxuICAgIC8vIChzZWUgYGN0eC5wZW5kaW5nRGVsaXZlcnlCYXJyaWVyc2ApLlxuICAgIGNvbnN0IHBheWxvYWRzUXVldWU6IHsgY2xhaW06ICgpID0+IFByb21pc2U8VD4gfVtdID0gW107XG5cbiAgICAvLyBRdWV1ZSBvZiBwcm9taXNlcyB0aGF0IHJlc29sdmUgdG8gdGhlIG5leHQgaG9vayBwYXlsb2FkXG4gICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+W10gPSBbXTtcblxuICAgIC8vIFF1ZXVlIG9mIHByb21pc2VzIHRoYXQgcmVzb2x2ZSBvbmNlIGhvb2sgcmVnaXN0cmF0aW9uIGlzIGNvbmZpcm1lZFxuICAgIC8vICh3aXRoIGBudWxsYCkgb3IgYSB0b2tlbiBjb25mbGljdCBpcyBkZXRlY3RlZCAod2l0aCB0aGUgY29uZmxpY3RpbmdcbiAgICAvLyBgUnVuYCkuIFRoZXNlIGJhY2sgdGhlIGBob29rLmdldENvbmZsaWN0KClgIGdldHRlci5cbiAgICBjb25zdCBnZXRDb25mbGljdFByb21pc2VzOiBQcm9taXNlV2l0aFJlc29sdmVyczxSdW48dW5rbm93bj4gfCBudWxsPltdID0gW107XG5cbiAgICBsZXQgZXZlbnRMb2dFbXB0eSA9IGZhbHNlO1xuXG4gICAgLy8gVHJhY2sgaWYgdGhlIGV2ZW50IGxvZyBjb25maXJtcyBob29rIGNyZWF0aW9uIGhhcHBlbmVkXG4gICAgbGV0IGhhc0NyZWF0ZWQgPSBmYWxzZTtcblxuICAgIC8vIFRyYWNrIGlmIHRoZSBldmVudCBsb2cgY29uZmlybXMgZGlzcG9zYWwgaGFwcGVuZWQgKHJlcGxheSBuby1vcClcbiAgICBsZXQgaGFzRGlzcG9zZWRFdmVudCA9IGZhbHNlO1xuXG4gICAgLy8gVHJhY2sgaWYgd2UgaGF2ZSBhIGNvbmZsaWN0IHNvIHdlIGNhbiByZWplY3QgZnV0dXJlIGF3YWl0c1xuICAgIGxldCBoYXNDb25mbGljdCA9IGZhbHNlO1xuICAgIGxldCBjb25mbGljdEVycm9yUmVmOiBIb29rQ29uZmxpY3RFcnJvciB8IG51bGwgPSBudWxsO1xuICAgIC8vIFRoZSBjb25mbGljdGluZyBydW4gaGFuZGxlLCBzaGFyZWQgYnkgZXZlcnkgYGdldENvbmZsaWN0YCBhd2FpdCBzb1xuICAgIC8vIHJlcGVhdGVkIGF3YWl0cyBvYnNlcnZlIHRoZSBzYW1lIGluc3RhbmNlIGRldGVybWluaXN0aWNhbGx5LlxuICAgIGxldCBjb25mbGljdFJ1blJlZjogUnVuPHVua25vd24+IHwgbnVsbCA9IG51bGw7XG5cbiAgICB3ZWJob29rTG9nZ2VyLmRlYnVnKCdIb29rIGNvbnN1bWVyIHNldHVwJywgeyBjb3JyZWxhdGlvbklkLCB0b2tlbiB9KTtcbiAgICBjdHguZXZlbnRzQ29uc3VtZXIuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIGV2ZW50cyBhbmQgdGhlcmUgYXJlIHByb21pc2VzIHdhaXRpbmcsXG4gICAgICAvLyBpdCBtZWFucyB0aGUgaG9vayBoYXMgYmVlbiBhd2FpdGVkLCBidXQgYW4gaW5jb21pbmcgcGF5bG9hZCBoYXMgbm90IHlldCBiZWVuIHJlY2VpdmVkLlxuICAgICAgLy8gSW4gdGhpcyBjYXNlLCB0aGUgd29ya2Zsb3cgc2hvdWxkIGJlIHN1c3BlbmRlZCB1bnRpbCB0aGUgaG9vayBpcyByZXN1bWVkLlxuICAgICAgaWYgKCFldmVudCkge1xuICAgICAgICBldmVudExvZ0VtcHR5ID0gdHJ1ZTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgKHByb21pc2VzLmxlbmd0aCA+IDAgJiYgcGF5bG9hZHNRdWV1ZS5sZW5ndGggPT09IDApIHx8XG4gICAgICAgICAgKGdldENvbmZsaWN0UHJvbWlzZXMubGVuZ3RoID4gMCAmJiAhaGFzQ3JlYXRlZCAmJiAhaGFzQ29uZmxpY3QpXG4gICAgICAgICkge1xuICAgICAgICAgIHNjaGVkdWxlV2hlbklkbGUoY3R4LCAoKSA9PiB7XG4gICAgICAgICAgICBjdHgub25Xb3JrZmxvd0Vycm9yKFxuICAgICAgICAgICAgICBuZXcgV29ya2Zsb3dTdXNwZW5zaW9uKGN0eC5pbnZvY2F0aW9uc1F1ZXVlLCBjdHguZ2xvYmFsVGhpcylcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuTm90Q29uc3VtZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5jb3JyZWxhdGlvbklkICE9PSBjb3JyZWxhdGlvbklkKSB7XG4gICAgICAgIC8vIFdlJ3JlIG5vdCBpbnRlcmVzdGVkIGluIHRoaXMgZXZlbnQgLSB0aGUgY29ycmVsYXRpb25JZCBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IGVudGl0eVxuICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Ob3RDb25zdW1lZDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXZlbnRUb2tlbiA9XG4gICAgICAgICdldmVudERhdGEnIGluIGV2ZW50ICYmIGV2ZW50LmV2ZW50RGF0YSAmJiAndG9rZW4nIGluIGV2ZW50LmV2ZW50RGF0YVxuICAgICAgICAgID8gZXZlbnQuZXZlbnREYXRhLnRva2VuXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmICh0eXBlb2YgZXZlbnRUb2tlbiA9PT0gJ3N0cmluZycgJiYgZXZlbnRUb2tlbiAhPT0gdG9rZW4pIHtcbiAgICAgICAgY3R4LnByb21pc2VRdWV1ZSA9IGN0eC5wcm9taXNlUXVldWUudGhlbigoKSA9PiB7XG4gICAgICAgICAgY3R4Lm9uV29ya2Zsb3dFcnJvcihcbiAgICAgICAgICAgIG5ldyBSZXBsYXlEaXZlcmdlbmNlRXJyb3IoXG4gICAgICAgICAgICAgIGBSZXBsYXkgZGl2ZXJnZW5jZTogaG9vayBldmVudCAke2V2ZW50LmV2ZW50VHlwZX0gZm9yICR7Y29ycmVsYXRpb25JZH0gYmVsb25ncyB0byB0b2tlbiBcIiR7ZXZlbnRUb2tlbn1cIiwgYnV0IHRoZSBjdXJyZW50IGhvb2sgY29uc3VtZXIgZXhwZWN0cyBcIiR7dG9rZW59XCJgLFxuICAgICAgICAgICAgICB7IGV2ZW50SWQ6IGV2ZW50LmV2ZW50SWQgfVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5GaW5pc2hlZDtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgZm9yIGhvb2tfY3JlYXRlZCBldmVudCB0byBtYXJrIHRoaXMgaG9vayBhcyBhbHJlYWR5IGNyZWF0ZWRcbiAgICAgIGlmIChldmVudC5ldmVudFR5cGUgPT09ICdob29rX2NyZWF0ZWQnKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlSXRlbSA9IGN0eC5pbnZvY2F0aW9uc1F1ZXVlLmdldChjb3JyZWxhdGlvbklkKTtcbiAgICAgICAgaWYgKHF1ZXVlSXRlbSAmJiBxdWV1ZUl0ZW0udHlwZSA9PT0gJ2hvb2snKSB7XG4gICAgICAgICAgcXVldWVJdGVtLmhhc0NyZWF0ZWRFdmVudCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaGFzQ3JlYXRlZCA9IHRydWU7XG5cbiAgICAgICAgY29uc3QgcGVuZGluZ0dldENvbmZsaWN0UHJvbWlzZXMgPSBnZXRDb25mbGljdFByb21pc2VzLnNsaWNlKCk7XG4gICAgICAgIGdldENvbmZsaWN0UHJvbWlzZXMubGVuZ3RoID0gMDtcbiAgICAgICAgY3R4LnByb21pc2VRdWV1ZSA9IGN0eC5wcm9taXNlUXVldWUudGhlbigoKSA9PiB7XG4gICAgICAgICAgZm9yIChjb25zdCByZXNvbHZlciBvZiBwZW5kaW5nR2V0Q29uZmxpY3RQcm9taXNlcykge1xuICAgICAgICAgICAgcmVzb2x2ZXIucmVzb2x2ZShudWxsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkNvbnN1bWVkO1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgaG9va19jb25mbGljdCBldmVudCAtIGFub3RoZXIgd29ya2Zsb3cgaXMgdXNpbmcgdGhpcyB0b2tlblxuICAgICAgaWYgKGV2ZW50LmV2ZW50VHlwZSA9PT0gJ2hvb2tfY29uZmxpY3QnKSB7XG4gICAgICAgIC8vIFJlbW92ZSB0aGlzIGhvb2sgZnJvbSB0aGUgaW52b2NhdGlvbnMgcXVldWVcbiAgICAgICAgY3R4Lmludm9jYXRpb25zUXVldWUuZGVsZXRlKGNvcnJlbGF0aW9uSWQpO1xuXG4gICAgICAgIC8vIFN0b3JlIHRoZSBjb25mbGljdCBldmVudCBzbyB3ZSBjYW4gcmVqZWN0IGFueSBhd2FpdGVkIHByb21pc2VzLlxuICAgICAgICAvLyBDaGFpbiB0aHJvdWdoIHByb21pc2VRdWV1ZSB0byBlbnN1cmUgZGV0ZXJtaW5pc3RpYyBvcmRlcmluZy5cbiAgICAgICAgY29uc3QgY29uZmxpY3RFdmVudCA9IGV2ZW50IGFzIEhvb2tDb25mbGljdEV2ZW50O1xuICAgICAgICBjb25zdCBjb25mbGljdEVycm9yID0gbmV3IEhvb2tDb25mbGljdEVycm9yKFxuICAgICAgICAgIGNvbmZsaWN0RXZlbnQuZXZlbnREYXRhLnRva2VuLFxuICAgICAgICAgIGNvbmZsaWN0RXZlbnQuZXZlbnREYXRhLmNvbmZsaWN0aW5nUnVuSWRcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBNYXJrIHRoYXQgd2UgaGF2ZSBhIGNvbmZsaWN0IHNvIGZ1dHVyZSBhd2FpdHMgYWxzbyByZWplY3RcbiAgICAgICAgaGFzQ29uZmxpY3QgPSB0cnVlO1xuICAgICAgICBjb25mbGljdEVycm9yUmVmID0gY29uZmxpY3RFcnJvcjtcbiAgICAgICAgY29uZmxpY3RSdW5SZWYgPSBjcmVhdGVDb25mbGljdGluZ1J1bihcbiAgICAgICAgICBjdHgsXG4gICAgICAgICAgY29uZmxpY3RFdmVudC5ldmVudERhdGEuY29uZmxpY3RpbmdSdW5JZFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIENhcHR1cmUgYW5kIGRyYWluIHBlbmRpbmcgcHJvbWlzZXMgc3luY2hyb25vdXNseSBzbyB0aGUgbnVsbCBldmVudFxuICAgICAgICAvLyBoYW5kbGVyIHdvbid0IHNlZSB0aGVtIGFuZCB0cmlnZ2VyIGEgc3B1cmlvdXMgV29ya2Zsb3dTdXNwZW5zaW9uLlxuICAgICAgICAvLyBUaGUgYWN0dWFsIHNldHRsZW1lbnRzIGFyZSBkZWZlcnJlZCB0aHJvdWdoIHByb21pc2VRdWV1ZSBmb3JcbiAgICAgICAgLy8gb3JkZXJpbmcuIFBheWxvYWQgYXdhaXRlcnMgcmVqZWN0IHdpdGggSG9va0NvbmZsaWN0RXJyb3IsIHdoaWxlXG4gICAgICAgIC8vIGBnZXRDb25mbGljdGAgYXdhaXRlcnMgcmVzb2x2ZSB3aXRoIHRoZSBjb25mbGljdGluZyBydW4gc28gdGhlXG4gICAgICAgIC8vIHdvcmtmbG93IGNhbiBicmFuY2ggb24gdGhlIGNvbmZsaWN0IHdpdGhvdXQgdGhyb3dpbmcuIFdoZW4gbm9cbiAgICAgICAgLy8gcmVhbCBgUnVuYCBjYW4gYmUgY29uc3RydWN0ZWQgKHNlZSBgY3JlYXRlQ29uZmxpY3RpbmdSdW5gKSxcbiAgICAgICAgLy8gYGdldENvbmZsaWN0YCBhd2FpdGVycyByZWplY3Qgd2l0aCB0aGUgSG9va0NvbmZsaWN0RXJyb3IgaW5zdGVhZFxuICAgICAgICAvLyBvZiByZXNvbHZpbmcgd2l0aCBhIHZhbHVlIHRoYXQgZG9lc24ndCBob25vciB0aGUgYFJ1bmAgY29udHJhY3QuXG4gICAgICAgIGNvbnN0IHBlbmRpbmdQcm9taXNlcyA9IHByb21pc2VzLnNsaWNlKCk7XG4gICAgICAgIHByb21pc2VzLmxlbmd0aCA9IDA7XG4gICAgICAgIGNvbnN0IHBlbmRpbmdHZXRDb25mbGljdFByb21pc2VzID0gZ2V0Q29uZmxpY3RQcm9taXNlcy5zbGljZSgpO1xuICAgICAgICBnZXRDb25mbGljdFByb21pc2VzLmxlbmd0aCA9IDA7XG5cbiAgICAgICAgY3R4LnByb21pc2VRdWV1ZSA9IGN0eC5wcm9taXNlUXVldWUudGhlbigoKSA9PiB7XG4gICAgICAgICAgZm9yIChjb25zdCByZXNvbHZlciBvZiBwZW5kaW5nUHJvbWlzZXMpIHtcbiAgICAgICAgICAgIHJlc29sdmVyLnJlamVjdChjb25mbGljdEVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChjb25zdCByZXNvbHZlciBvZiBwZW5kaW5nR2V0Q29uZmxpY3RQcm9taXNlcykge1xuICAgICAgICAgICAgaWYgKGNvbmZsaWN0UnVuUmVmKSB7XG4gICAgICAgICAgICAgIHJlc29sdmVyLnJlc29sdmUoY29uZmxpY3RSdW5SZWYpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZXIucmVqZWN0KGNvbmZsaWN0RXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuQ29uc3VtZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5ldmVudFR5cGUgPT09ICdob29rX3JlY2VpdmVkJykge1xuICAgICAgICAvLyBSZWdpc3RlciBhICdob29rJyBkZWxpdmVyeSBiYXJyaWVyIGF0IHRoaXMgZXZlbnQncyBsb2cgaW5kZXggc28gYVxuICAgICAgICAvLyBsYXRlci1pbi1sb2cgYHdhaXRfY29tcGxldGVkYCBpcyBkZWxpdmVyZWQgb25seSBhZnRlciB0aGlzIGhvb2ssXG4gICAgICAgIC8vIGFuZCBzbyB0aGlzIGhvb2sgaXMgZGVsaXZlcmVkIG9ubHkgYWZ0ZXIgZXZlcnkgZWFybGllci1pbi1sb2dcbiAgICAgICAgLy8gYHdhaXRfY29tcGxldGVkYCDigJQga2VlcGluZyBhbnkgYFByb21pc2UucmFjZWAgYWdhaW5zdCBhIHdhaXRcbiAgICAgICAgLy8gZGV0ZXJtaW5pc3RpYyBhbmQgYWxpZ25lZCB3aXRoIHRoZSBjb21taXR0ZWQgZXZlbnQgbG9nLCByZWdhcmRsZXNzXG4gICAgICAgIC8vIG9mIG1pY3JvdGFzay1ob3AgY291bnQsIGh5ZHJhdGlvbiB0aW1lLCBvciByYWNlLWFyZ3VtZW50IG9yZGVyLlxuICAgICAgICAvLyBTZWUgYGN0eC5wZW5kaW5nRGVsaXZlcnlCYXJyaWVyc2AuXG4gICAgICAgIGNvbnN0IGV2ZW50SW5kZXggPSBjdHguZXZlbnRzQ29uc3VtZXIuZXZlbnRJbmRleDtcbiAgICAgICAgY29uc3QgYmFycmllciA9IHJlZ2lzdGVyRGVsaXZlcnlCYXJyaWVyKGN0eCwgZXZlbnRJbmRleCwgJ2hvb2snKTtcblxuICAgICAgICBpZiAocHJvbWlzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IG5leHQgPSBwcm9taXNlcy5zaGlmdCgpO1xuICAgICAgICAgIGlmIChuZXh0KSB7XG4gICAgICAgICAgICAvLyBBIGNvbnN1bWVyIGlzIGFscmVhZHkgYXdhaXRpbmcuIEh5ZHJhdGUgdGhyb3VnaCBhIHByb21pc2VRdWV1ZVxuICAgICAgICAgICAgLy8gc2xvdCAoc28gYXN5bmMgZGVzZXJpYWxpemF0aW9uIHN0YXlzIGluIGV2ZW50LWxvZyBvcmRlciksIHRoZW5cbiAgICAgICAgICAgIC8vIGRlZmVyIGJlaGluZCBlYXJsaWVyIHdhaXRzIGJlZm9yZSByZXNvbHZpbmcuIFRoZSBkZWZlcnJhbCBydW5zXG4gICAgICAgICAgICAvLyBPRkYgdGhlIHNlcmlhbCBxdWV1ZSAoaXQgbWF5IHdhaXQgb24gYW4gZWFybGllciB3YWl0IGRlbGl2ZXJ5XG4gICAgICAgICAgICAvLyBhbmQgYmxvY2tpbmcgYSBxdWV1ZSBzbG90IG9uIHRoYXQgd291bGQgZGVhZGxvY2sgdGhlIHF1ZXVlKS5cbiAgICAgICAgICAgIGN0eC5wZW5kaW5nRGVsaXZlcmllcysrO1xuICAgICAgICAgICAgbGV0IGh5ZHJhdGVPdXRjb21lOlxuICAgICAgICAgICAgICB8IHsgb2s6IHRydWU7IHZhbHVlOiBUIH1cbiAgICAgICAgICAgICAgfCB7IG9rOiBmYWxzZTsgZXJyb3I6IHVua25vd24gfTtcbiAgICAgICAgICAgIGN0eC5wcm9taXNlUXVldWUgPSBjdHgucHJvbWlzZVF1ZXVlLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSBhd2FpdCBoeWRyYXRlU3RlcFJldHVyblZhbHVlKFxuICAgICAgICAgICAgICAgICAgZXZlbnQuZXZlbnREYXRhLnBheWxvYWQsXG4gICAgICAgICAgICAgICAgICBjdHgucnVuSWQsXG4gICAgICAgICAgICAgICAgICBjdHguZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgICAgIGN0eC5nbG9iYWxUaGlzXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBoeWRyYXRlT3V0Y29tZSA9IHsgb2s6IHRydWUsIHZhbHVlOiBwYXlsb2FkIGFzIFQgfTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBoeWRyYXRlT3V0Y29tZSA9IHsgb2s6IGZhbHNlLCBlcnJvciB9O1xuICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIGN0eC5wZW5kaW5nRGVsaXZlcmllcy0tO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHZvaWQgYXdhaXRFYXJsaWVyRGVsaXZlcmllcyhjdHgsIGV2ZW50SW5kZXgsIFsnd2FpdCddKS50aGVuKFxuICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgIGJhcnJpZXIubWFya0RlbGl2ZXJlZCgpO1xuICAgICAgICAgICAgICAgICAgaWYgKGh5ZHJhdGVPdXRjb21lLm9rKSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHQucmVzb2x2ZShoeWRyYXRlT3V0Y29tZS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBuZXh0LnJlamVjdChoeWRyYXRlT3V0Y29tZS5lcnJvcik7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vIGNvbnN1bWVyIGlzIGF3YWl0aW5nIHlldC4gSHlkcmF0ZSB0aHJvdWdoIGEgcHJvbWlzZVF1ZXVlIHNsb3RcbiAgICAgICAgICAvLyBhdCB0aGlzIGxvZyBwb3NpdGlvbiBhbmQgcGFyayB0aGUgT1VUQ09NRSAodmFsdWUgb3IgZXJyb3IpIGZvciBhXG4gICAgICAgICAgLy8gbGF0ZXIgYGl0ZXJhdG9yLm5leHQoKWAgLyBgYXdhaXQgaG9va2AgY2xhaW0uIFdlIGNhcHR1cmUgdGhlXG4gICAgICAgICAgLy8gb3V0Y29tZSByYXRoZXIgdGhhbiBlYWdlcmx5IHJlc29sdmluZy9yZWplY3RpbmcgYSBwcm9taXNlIG5vXG4gICAgICAgICAgLy8gY29uc3VtZXIgaGFzIGF0dGFjaGVkIHRvIOKAlCBhIHJlamVjdGVkIHVuY2xhaW1lZCBwcm9taXNlIChlLmcuIGFcbiAgICAgICAgICAvLyBidWZmZXJlZCBlbmNyeXB0ZWQgcGF5bG9hZCB3aXRoIG5vIGtleSkgd291bGQgb3RoZXJ3aXNlIHN1cmZhY2VcbiAgICAgICAgICAvLyBhcyBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uIGFuZCBjcmFzaCB0aGUgcHJvY2Vzcy4gYGNsYWltKClgIGJ1aWxkc1xuICAgICAgICAgIC8vIHRoZSBjb25zdW1lci1mYWNpbmcgcHJvbWlzZSBvbiBkZW1hbmQuXG4gICAgICAgICAgbGV0IG91dGNvbWU6XG4gICAgICAgICAgICB8IHsgb2s6IHRydWU7IHZhbHVlOiBUIH1cbiAgICAgICAgICAgIHwgeyBvazogZmFsc2U7IGVycm9yOiB1bmtub3duIH1cbiAgICAgICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgICAgIGNvbnN0IGh5ZHJhdGVkID0gd2l0aFJlc29sdmVyczx2b2lkPigpO1xuXG4gICAgICAgICAgY29uc3QgY2xhaW0gPSAoKTogUHJvbWlzZTxUPiA9PlxuICAgICAgICAgICAgaHlkcmF0ZWQucHJvbWlzZVxuICAgICAgICAgICAgICAudGhlbigoKSA9PiBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzKGN0eCwgZXZlbnRJbmRleCwgWyd3YWl0J10pKVxuICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgYmFycmllci5tYXJrRGVsaXZlcmVkKCk7XG4gICAgICAgICAgICAgICAgaWYgKG91dGNvbWUgJiYgIW91dGNvbWUub2spIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IG91dGNvbWUuZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAob3V0Y29tZSBhcyB7IG9rOiB0cnVlOyB2YWx1ZTogVCB9KS52YWx1ZTtcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjdHgucGVuZGluZ0RlbGl2ZXJpZXMrKztcbiAgICAgICAgICBjdHgucHJvbWlzZVF1ZXVlID0gY3R4LnByb21pc2VRdWV1ZS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSBhd2FpdCBoeWRyYXRlU3RlcFJldHVyblZhbHVlKFxuICAgICAgICAgICAgICAgIGV2ZW50LmV2ZW50RGF0YS5wYXlsb2FkLFxuICAgICAgICAgICAgICAgIGN0eC5ydW5JZCxcbiAgICAgICAgICAgICAgICBjdHguZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgICBjdHguZ2xvYmFsVGhpc1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBvdXRjb21lID0geyBvazogdHJ1ZSwgdmFsdWU6IHBheWxvYWQgYXMgVCB9O1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgb3V0Y29tZSA9IHsgb2s6IGZhbHNlLCBlcnJvciB9O1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgY3R4LnBlbmRpbmdEZWxpdmVyaWVzLS07XG4gICAgICAgICAgICAgIGh5ZHJhdGVkLnJlc29sdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBwYXlsb2Fkc1F1ZXVlLnB1c2goeyBjbGFpbSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkNvbnN1bWVkO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQuZXZlbnRUeXBlID09PSAnaG9va19kaXNwb3NlZCcpIHtcbiAgICAgICAgLy8gVGVybWluYWwgc3RhdGUgLSByZW1vdmUgZnJvbSBxdWV1ZSAobGlrZSBzdGVwX2NvbXBsZXRlZC93YWl0X2NvbXBsZXRlZClcbiAgICAgICAgY3R4Lmludm9jYXRpb25zUXVldWUuZGVsZXRlKGNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAvLyBNYXJrIHRoYXQgdGhlIGV2ZW50IGxvZyBjb25maXJtcyBkaXNwb3NhbCBoYXBwZW5lZFxuICAgICAgICBoYXNEaXNwb3NlZEV2ZW50ID0gdHJ1ZTtcbiAgICAgICAgLy8gV2UncmUgZG9uZSBwcm9jZXNzaW5nIGFueSBtb3JlIGV2ZW50cyBmb3IgdGhpcyBob29rXG4gICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkZpbmlzaGVkO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGlzIHJlcGxheSBpbnN0YWxsZWQgYSBkaWZmZXJlbnQgY29uc3VtZXIgdGhhbiB0aGUgc3RvcmVkIGV2ZW50IG5lZWRzLlxuICAgICAgY3R4LnByb21pc2VRdWV1ZSA9IGN0eC5wcm9taXNlUXVldWUudGhlbigoKSA9PiB7XG4gICAgICAgIGN0eC5vbldvcmtmbG93RXJyb3IoXG4gICAgICAgICAgbmV3IFJlcGxheURpdmVyZ2VuY2VFcnJvcihcbiAgICAgICAgICAgIGBSZXBsYXkgZGl2ZXJnZW5jZTogVW5leHBlY3RlZCBldmVudCB0eXBlIGZvciBob29rICR7Y29ycmVsYXRpb25JZH0gKHRva2VuOiAke3Rva2VufSkgXCIke2V2ZW50LmV2ZW50VHlwZX1cImAsXG4gICAgICAgICAgICB7IGV2ZW50SWQ6IGV2ZW50LmV2ZW50SWQgfVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuRmluaXNoZWQ7XG4gICAgfSk7XG5cbiAgICAvLyBUcmFjayBpZiB0aGUgaG9vayBoYXMgYmVlbiBkaXNwb3NlZFxuICAgIGxldCBpc0Rpc3Bvc2VkID0gZmFsc2U7XG5cbiAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IHByb21pc2UgdGhhdCB3YWl0cyBmb3IgdGhlIG5leHQgaG9vayBwYXlsb2FkXG4gICAgZnVuY3Rpb24gY3JlYXRlSG9va1Byb21pc2UoKTogUHJvbWlzZTxUPiB7XG4gICAgICBjb25zdCByZXNvbHZlcnMgPSB3aXRoUmVzb2x2ZXJzPFQ+KCk7XG5cbiAgICAgIC8vIElmIHdlIGhhdmUgYSBjb25mbGljdCwgcmVqZWN0IHRocm91Z2ggdGhlIHByb21pc2VRdWV1ZSB0byBtYWludGFpblxuICAgICAgLy8gZGV0ZXJtaW5pc3RpYyBvcmRlcmluZyB3aXRoIGFueSBwcmlvciBxdWV1ZWQgcmVzb2x1dGlvbnMuXG4gICAgICBpZiAoaGFzQ29uZmxpY3QgJiYgY29uZmxpY3RFcnJvclJlZikge1xuICAgICAgICBjdHgucHJvbWlzZVF1ZXVlID0gY3R4LnByb21pc2VRdWV1ZS50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXNvbHZlcnMucmVqZWN0KGNvbmZsaWN0RXJyb3JSZWYpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVycy5wcm9taXNlO1xuICAgICAgfVxuXG4gICAgICBpZiAocGF5bG9hZHNRdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IG5leHREZWxpdmVyeSA9IHBheWxvYWRzUXVldWUuc2hpZnQoKTtcbiAgICAgICAgaWYgKG5leHREZWxpdmVyeSkge1xuICAgICAgICAgIC8vIFRoZSBwYXlsb2FkIHdhcyBoeWRyYXRlZCB0aHJvdWdoIGEgcHJvbWlzZVF1ZXVlIHNsb3QgYXQgaXRzIGxvZ1xuICAgICAgICAgIC8vIHBvc2l0aW9uIChidWZmZXJpbmcgYnJhbmNoIGFib3ZlKS4gYGNsYWltKClgIGJ1aWxkcyB0aGVcbiAgICAgICAgICAvLyBjb25zdW1lci1mYWNpbmcgcHJvbWlzZSBmcm9tIHRoYXQgb3V0Y29tZSwgZGVmZXJyaW5nIGJlaGluZCBhbnlcbiAgICAgICAgICAvLyBlYXJsaWVyLWluLWxvZyB3YWl0IGFuZCBtYXJraW5nIHRoaXMgaG9vayBkZWxpdmVyZWQg4oCUIHNvXG4gICAgICAgICAgLy8gcmVzb2x1dGlvbiBvcmRlciBzdGF5cyBhbmNob3JlZCB0byB0aGUgZXZlbnQgbG9nLCBub3QgdGhpcyBsYXRlclxuICAgICAgICAgIC8vIGNsYWltIHNpdGUuXG4gICAgICAgICAgcmV0dXJuIG5leHREZWxpdmVyeS5jbGFpbSgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudExvZ0VtcHR5KSB7XG4gICAgICAgIHNjaGVkdWxlV2hlbklkbGUoY3R4LCAoKSA9PiB7XG4gICAgICAgICAgY3R4Lm9uV29ya2Zsb3dFcnJvcihcbiAgICAgICAgICAgIG5ldyBXb3JrZmxvd1N1c3BlbnNpb24oY3R4Lmludm9jYXRpb25zUXVldWUsIGN0eC5nbG9iYWxUaGlzKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBwcm9taXNlcy5wdXNoKHJlc29sdmVycyk7XG5cbiAgICAgIHJldHVybiByZXNvbHZlcnMucHJvbWlzZTtcbiAgICB9XG5cbiAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGhvb2snc1xuICAgIC8vIHJlZ2lzdHJhdGlvbiBvdXRjb21lOiB0aGUgY29uZmxpY3RpbmcgYFJ1bmAgd2hlbiB0aGUgdG9rZW4gaXMgb3duZWRcbiAgICAvLyBieSBhbm90aGVyIGFjdGl2ZSBob29rLCBgbnVsbGAgb25jZSB0aGlzIGhvb2sncyByZWdpc3RyYXRpb24gaXNcbiAgICAvLyBjb21taXR0ZWQuIEJvdGggZmFzdC1wYXRocyBzZXR0bGUgdGhyb3VnaCBgY3R4LnByb21pc2VRdWV1ZWAgc29cbiAgICAvLyByZXNvbHV0aW9uIG9yZGVyIGFsd2F5cyBtYXRjaGVzIGV2ZW50LWxvZyBvcmRlci5cbiAgICBmdW5jdGlvbiBjcmVhdGVHZXRDb25mbGljdFByb21pc2UoKTogUHJvbWlzZTxSdW48dW5rbm93bj4gfCBudWxsPiB7XG4gICAgICBjb25zdCByZXNvbHZlcnMgPSB3aXRoUmVzb2x2ZXJzPFJ1bjx1bmtub3duPiB8IG51bGw+KCk7XG5cbiAgICAgIGlmIChoYXNDcmVhdGVkKSB7XG4gICAgICAgIGN0eC5wcm9taXNlUXVldWUgPSBjdHgucHJvbWlzZVF1ZXVlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJlc29sdmVycy5yZXNvbHZlKG51bGwpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVycy5wcm9taXNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaGFzQ29uZmxpY3QpIHtcbiAgICAgICAgY3R4LnByb21pc2VRdWV1ZSA9IGN0eC5wcm9taXNlUXVldWUudGhlbigoKSA9PiB7XG4gICAgICAgICAgaWYgKGNvbmZsaWN0UnVuUmVmKSB7XG4gICAgICAgICAgICByZXNvbHZlcnMucmVzb2x2ZShjb25mbGljdFJ1blJlZik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc29sdmVycy5yZWplY3QoY29uZmxpY3RFcnJvclJlZik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVycy5wcm9taXNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBxdWV1ZUl0ZW0gPSBjdHguaW52b2NhdGlvbnNRdWV1ZS5nZXQoY29ycmVsYXRpb25JZCk7XG4gICAgICBpZiAocXVldWVJdGVtICYmIHF1ZXVlSXRlbS50eXBlID09PSAnaG9vaycpIHtcbiAgICAgICAgcXVldWVJdGVtLmhhc0NvbmZsaWN0QXdhaXRlciA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudExvZ0VtcHR5KSB7XG4gICAgICAgIHNjaGVkdWxlV2hlbklkbGUoY3R4LCAoKSA9PiB7XG4gICAgICAgICAgY3R4Lm9uV29ya2Zsb3dFcnJvcihcbiAgICAgICAgICAgIG5ldyBXb3JrZmxvd1N1c3BlbnNpb24oY3R4Lmludm9jYXRpb25zUXVldWUsIGN0eC5nbG9iYWxUaGlzKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBnZXRDb25mbGljdFByb21pc2VzLnB1c2gocmVzb2x2ZXJzKTtcbiAgICAgIHJldHVybiByZXNvbHZlcnMucHJvbWlzZTtcbiAgICB9XG5cbiAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZGlzcG9zZSB0aGUgaG9va1xuICAgIGZ1bmN0aW9uIGRpc3Bvc2VIb29rKCk6IHZvaWQge1xuICAgICAgaWYgKGlzRGlzcG9zZWQpIHtcbiAgICAgICAgcmV0dXJuOyAvLyBBbHJlYWR5IGRpc3Bvc2VkLCBub3RoaW5nIHRvIGRvXG4gICAgICB9XG4gICAgICBpc0Rpc3Bvc2VkID0gdHJ1ZTtcblxuICAgICAgLy8gSWYgdGhlIGV2ZW50IGxvZyBhbHJlYWR5IGNvbnRhaW5zIGhvb2tfZGlzcG9zZWQsIHRoaXMgaXMgYSByZXBsYXkg4oCUIG5vLW9wXG4gICAgICBpZiAoaGFzRGlzcG9zZWRFdmVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCBkaXNwb3NlZCBmbGFnIG9uIHRoZSBleGlzdGluZyBxdWV1ZSBpdGVtXG4gICAgICBjb25zdCBxdWV1ZUl0ZW0gPSBjdHguaW52b2NhdGlvbnNRdWV1ZS5nZXQoY29ycmVsYXRpb25JZCk7XG4gICAgICBpZiAocXVldWVJdGVtICYmIHF1ZXVlSXRlbS50eXBlID09PSAnaG9vaycpIHtcbiAgICAgICAgcXVldWVJdGVtLmRpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gRHJhaW4gYW55IHBlbmRpbmcgcHJvbWlzZXMgdGhhdCBhcmUgd2FpdGluZyBmb3IgcGF5bG9hZHMuXG4gICAgICAvLyBXaXRob3V0IHRoaXMsIHByb21pc2VzIGNyZWF0ZWQgYnkgYGF3YWl0IGhvb2tgIG9yIHRoZSBhc3luYyBpdGVyYXRvcidzXG4gICAgICAvLyBgeWllbGQgYXdhaXQgdGhpc2Agd291bGQgaGFuZyBmb3JldmVyIHNpbmNlIHRoZSBldmVudCBjb25zdW1lciB3aWxsXG4gICAgICAvLyBuZXZlciBkZWxpdmVyIGFub3RoZXIgaG9va19yZWNlaXZlZCBhZnRlciBkaXNwb3NhbC5cbiAgICAgIGlmIChwcm9taXNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHByb21pc2VzLmxlbmd0aCA9IDA7XG4gICAgICAgIHNjaGVkdWxlV2hlbklkbGUoY3R4LCAoKSA9PiB7XG4gICAgICAgICAgY3R4Lm9uV29ya2Zsb3dFcnJvcihcbiAgICAgICAgICAgIG5ldyBXb3JrZmxvd1N1c3BlbnNpb24oY3R4Lmludm9jYXRpb25zUXVldWUsIGN0eC5nbG9iYWxUaGlzKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB3ZWJob29rTG9nZ2VyLmRlYnVnKCdIb29rIGRpc3Bvc2VkJywgeyBjb3JyZWxhdGlvbklkLCB0b2tlbiB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBob29rOiBIb29rPFQ+ID0ge1xuICAgICAgdG9rZW4sXG5cbiAgICAgIGdldENvbmZsaWN0KCk6IFByb21pc2U8UnVuPHVua25vd24+IHwgbnVsbD4ge1xuICAgICAgICByZXR1cm4gY3JlYXRlR2V0Q29uZmxpY3RQcm9taXNlKCk7XG4gICAgICB9LFxuXG4gICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vVGhlblByb3BlcnR5OiBJbnRlbnRpb25hbGx5IHRoZW5hYmxlXG4gICAgICB0aGVuPFRSZXN1bHQxID0gVCwgVFJlc3VsdDIgPSBuZXZlcj4oXG4gICAgICAgIG9uZnVsZmlsbGVkPzogKCh2YWx1ZTogVCkgPT4gVFJlc3VsdDEgfCBQcm9taXNlTGlrZTxUUmVzdWx0MT4pIHwgbnVsbCxcbiAgICAgICAgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+KSB8IG51bGxcbiAgICAgICk6IFByb21pc2U8VFJlc3VsdDEgfCBUUmVzdWx0Mj4ge1xuICAgICAgICByZXR1cm4gY3JlYXRlSG9va1Byb21pc2UoKS50aGVuKG9uZnVsZmlsbGVkLCBvbnJlamVjdGVkKTtcbiAgICAgIH0sXG5cbiAgICAgIC8vIFN1cHBvcnQgYGZvciBhd2FpdCAoY29uc3QgcGF5bG9hZCBvZiBob29rKSB7IOKApiB9YCBzeW50YXhcbiAgICAgIGFzeW5jICpbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgICB3aGlsZSAoIWlzRGlzcG9zZWQpIHtcbiAgICAgICAgICB5aWVsZCBhd2FpdCB0aGlzO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICBkaXNwb3NlOiBkaXNwb3NlSG9vayxcblxuICAgICAgW1N5bWJvbC5kaXNwb3NlXTogZGlzcG9zZUhvb2ssXG4gICAgfTtcblxuICAgIC8vIEFsc28gcmVnaXN0ZXIgd2l0aCB0aGUgVk0ncyBTeW1ib2wuZGlzcG9zZSBzbyBgdXNpbmdgIHdvcmtzIGluc2lkZVxuICAgIC8vIHRoZSB3b3JrZmxvdyBzYW5kYm94ICh0aGUgVk0gbWF5IGhhdmUgYSBwb2x5ZmlsbGVkIFN5bWJvbC5kaXNwb3NlXG4gICAgLy8gdGhhdCBkaWZmZXJzIGZyb20gdGhlIGhvc3QncykuXG4gICAgY29uc3Qgdm1EaXNwb3NlID0gY3R4Lmdsb2JhbFRoaXMuU3ltYm9sLmRpc3Bvc2U7XG4gICAgaWYgKHZtRGlzcG9zZSAmJiB2bURpc3Bvc2UgIT09IFN5bWJvbC5kaXNwb3NlKSB7XG4gICAgICAoaG9vayBhcyBhbnkpW3ZtRGlzcG9zZV0gPSBkaXNwb3NlSG9vaztcbiAgICB9XG5cbiAgICByZXR1cm4gaG9vaztcbiAgfTtcbn1cbiJdfQ==
445
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9vay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93b3JrZmxvdy9ob29rLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxVQUFVLEVBQ1YsaUJBQWlCLEVBQ2pCLHFCQUFxQixHQUN0QixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZELE9BQU8sRUFFTCxtQkFBbUIsRUFDbkIsYUFBYSxHQUNkLE1BQU0saUJBQWlCLENBQUM7QUFFekIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRWhGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNsRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdDLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsdUJBQXVCLEVBQ3ZCLGdCQUFnQixHQUVqQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUU3RDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILFNBQVMsb0JBQW9CLENBQzNCLEdBQWdDLEVBQ2hDLGdCQUFvQztJQUVwQyxJQUFJLE9BQU8sZ0JBQWdCLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDekMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsTUFBTSxRQUFRLEdBQUcscUJBQXFCLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxVQUFVLENBSXRELENBQUM7SUFDZCxNQUFNLFdBQVcsR0FBSSxRQUFnQixFQUFFLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUM5RCxJQUFJLE9BQU8sV0FBVyxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ3RDLE9BQU8sSUFB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QUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDaEQsSUFBSSxTQUFTLElBQUksU0FBUyxLQUFLLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUM3QyxJQUFZLENBQUMsU0FBUyxDQUFDLEdBQUcsV0FBVyxDQUFDO1FBQ3pDLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBGYXRhbEVycm9yLFxuICBIb29rQ29uZmxpY3RFcnJvcixcbiAgUmVwbGF5RGl2ZXJnZW5jZUVycm9yLFxufSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7IFdPUktGTE9XX0RFU0VSSUFMSVpFIH0gZnJvbSAnQHdvcmtmbG93L3NlcmRlJztcbmltcG9ydCB7XG4gIHR5cGUgUHJvbWlzZVdpdGhSZXNvbHZlcnMsXG4gIHBhcnNlRHVyYXRpb25Ub0RhdGUsXG4gIHdpdGhSZXNvbHZlcnMsXG59IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5pbXBvcnQgdHlwZSB7IEhvb2tDb25mbGljdEV2ZW50IH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IGdldFNlcmlhbGl6YXRpb25DbGFzcywgUlVOX0NMQVNTX0lEIH0gZnJvbSAnLi4vY2xhc3Mtc2VyaWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7IEhvb2ssIEhvb2tPcHRpb25zIH0gZnJvbSAnLi4vY3JlYXRlLWhvb2suanMnO1xuaW1wb3J0IHsgRXZlbnRDb25zdW1lclJlc3VsdCB9IGZyb20gJy4uL2V2ZW50cy1jb25zdW1lci5qcyc7XG5pbXBvcnQgeyBXb3JrZmxvd1N1c3BlbnNpb24gfSBmcm9tICcuLi9nbG9iYWwuanMnO1xuaW1wb3J0IHsgd2ViaG9va0xvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQge1xuICBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzLFxuICByZWdpc3RlckRlbGl2ZXJ5QmFycmllcixcbiAgc2NoZWR1bGVXaGVuSWRsZSxcbiAgdHlwZSBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQsXG59IGZyb20gJy4uL3ByaXZhdGUuanMnO1xuaW1wb3J0IHR5cGUgeyBSdW4gfSBmcm9tICcuLi9ydW50aW1lL3J1bi5qcyc7XG5pbXBvcnQgeyBoeWRyYXRlU3RlcFJldHVyblZhbHVlIH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi5qcyc7XG5cbi8qKlxuICogQ29uc3RydWN0cyBhIGBSdW5gIGhhbmRsZSBmb3IgdGhlIHJ1biB0aGF0IG93bnMgYSBjb25mbGljdGluZyBob29rXG4gKiB0b2tlbiwgZm9yIHJlc29sdXRpb24gdGhyb3VnaCBgaG9vay5nZXRDb25mbGljdCgpYC5cbiAqXG4gKiBUaGUgaW5zdGFuY2UgaXMgY3JlYXRlZCB0aHJvdWdoIHRoZSBzZXJpYWxpemF0aW9uIGNsYXNzIHJlZ2lzdHJ5IG9uXG4gKiB0aGUgVk0ncyBnbG9iYWxUaGlzIOKAlCB0aGUgc2FtZSBjaGFubmVsIHRoYXQgcmV2aXZlcyBzZXJpYWxpemVkIGBSdW5gXG4gKiBpbnN0YW5jZXMgKGUuZy4gYHN0YXJ0KClgIHJldHVybiB2YWx1ZXMgY3Jvc3NpbmcgZnJvbSBhIHN0ZXAgaW50byB0aGVcbiAqIHdvcmtmbG93KS4gVGhlIHJlZ2lzdGVyZWQgY2xhc3MgaXMgdGhlIFZNIGJ1bmRsZSdzIHBsdWdpbi1jb21waWxlZFxuICogYFJ1bmAsIHdob3NlIG1ldGhvZHMgYXJlIGR1cmFibGUgc3RlcCBwcm94aWVzIOKAlCBzYWZlIHRvIGNhbGwgZnJvbVxuICogd29ya2Zsb3cgY29kZSDigJQgYW5kIGNvbnN0cnVjdGlvbiBnb2VzIHRocm91Z2ggaXRzXG4gKiBgV09SS0ZMT1dfREVTRVJJQUxJWkVgIGhvb2ssIGV4YWN0bHkgYXMgdGhlIGBJbnN0YW5jZWAgcmV2aXZlciB3b3VsZC5cbiAqXG4gKiBSZXR1cm5zIGBudWxsYCB3aGVuIGEgcmVhbCBgUnVuYCBjYW5ub3QgYmUgY29uc3RydWN0ZWQ6IHRoZSBjb25mbGljdFxuICogZXZlbnQgbGFja3MgYGNvbmZsaWN0aW5nUnVuSWRgICh3cml0dGVuIGJ5IGFuIG9sZCB3b3JsZCksIG9yIHRoZSBWTSdzXG4gKiByZWdpc3RyeSBoYXMgbm8gYFJ1bmAgKGEgY29udGV4dCB0aGF0IG5ldmVyIGV2YWx1YXRlZCB0aGVcbiAqIHdvcmtmbG93LW1vZGUgYGNyZWF0ZS1ob29rYCBtb2R1bGUsIHdoaWNoIGFsaWFzZXMgaXQgdW5kZXJcbiAqIGBSVU5fQ0xBU1NfSURgKS4gYGdldENvbmZsaWN0YCBhd2FpdGVycyB0aGVuIHJlamVjdCB3aXRoXG4gKiBgSG9va0NvbmZsaWN0RXJyb3JgIGluc3RlYWQgb2YgcmVzb2x2aW5nIHdpdGggYSB2YWx1ZSB0aGF0IGRvZXNuJ3RcbiAqIGhvbm9yIHRoZSBgUnVuYCBjb250cmFjdC5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ29uZmxpY3RpbmdSdW4oXG4gIGN0eDogV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0LFxuICBjb25mbGljdGluZ1J1bklkOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IFJ1bjx1bmtub3duPiB8IG51bGwge1xuICBpZiAodHlwZW9mIGNvbmZsaWN0aW5nUnVuSWQgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgUnVuQ2xhc3MgPSBnZXRTZXJpYWxpemF0aW9uQ2xhc3MoUlVOX0NMQVNTX0lELCBjdHguZ2xvYmFsVGhpcykgYXNcbiAgICB8IChhYnN0cmFjdCBuZXcgKFxuICAgICAgICAuLi5hcmdzOiBuZXZlclxuICAgICAgKSA9PiBSdW48dW5rbm93bj4pXG4gICAgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGRlc2VyaWFsaXplID0gKFJ1bkNsYXNzIGFzIGFueSk/LltXT1JLRkxPV19ERVNFUklBTElaRV07XG4gIGlmICh0eXBlb2YgZGVzZXJpYWxpemUgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gZGVzZXJpYWxpemUuY2FsbChSdW5DbGFzcywgeyBydW5JZDogY29uZmxpY3RpbmdSdW5JZCB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNyZWF0ZUhvb2soY3R4OiBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNyZWF0ZUhvb2tJbXBsPFQgPSBhbnk+KG9wdGlvbnM6IEhvb2tPcHRpb25zID0ge30pOiBIb29rPFQ+IHtcbiAgICAvLyBSZWplY3QgYW4gZXhwbGljaXQgZW1wdHktc3RyaW5nIHRva2VuLiBBIHRva2VuIG11c3QgZWl0aGVyIGJlIG9taXR0ZWRcbiAgICAvLyAob3IgYHVuZGVmaW5lZGAvYG51bGxgKSB0byBnZXQgYSByYW5kb21seSBnZW5lcmF0ZWQgb25lLCBvciBiZSBhblxuICAgIC8vIGV4cGxpY2l0IG5vbi1lbXB0eSBzdHJpbmcuIEFuIGVtcHR5IHN0cmluZyBpcyBhbG1vc3QgYWx3YXlzIGFuXG4gICAgLy8gYWNjaWRlbnRhbCB2YWx1ZSAoZS5nLiBhbiB1bnNldCB2YXJpYWJsZSkgYW5kIHdvdWxkIG90aGVyd2lzZSBzbGlwXG4gICAgLy8gdGhyb3VnaCB0aGUgYD8/YCBiZWxvdyDigJQgd2hpY2ggb25seSBmYWxscyBiYWNrIGZvciBudWxsaXNoIHZhbHVlcyDigJQgYW5kXG4gICAgLy8gYmUgdXNlZCBhcyBhIG1lYW5pbmdsZXNzLCBub24tZGV0ZXJtaW5pc3RpYyB0b2tlbi5cbiAgICBpZiAob3B0aW9ucy50b2tlbiA9PT0gJycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ2BjcmVhdGVIb29rKClgIHdhcyBjYWxsZWQgd2l0aCBhbiBlbXB0eSBzdHJpbmcgdG9rZW4uIFBhc3MgYSBub24tZW1wdHkgdG9rZW4sIG9yIG9taXQgdGhlIGB0b2tlbmAgb3B0aW9uIHRvIHVzZSBhIHJhbmRvbWx5IGdlbmVyYXRlZCBvbmUuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBvcHRpb25zLmlzV2ViaG9vayA9PT0gdHJ1ZSAmJlxuICAgICAgb3B0aW9ucy5leHBlcmltZW50YWxfbWluUmV0ZW50aW9uICE9PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1dlYmhvb2sgaG9va3MgZG8gbm90IHN1cHBvcnQgYGV4cGVyaW1lbnRhbF9taW5SZXRlbnRpb25gLiBVc2UgYSBub24td2ViaG9vayBgY3JlYXRlSG9vaygpYCB3aXRoIGByZXN1bWVIb29rKClgLidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgb3B0aW9ucy5leHBlcmltZW50YWxfbWluUmV0ZW50aW9uICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIGN0eC53b3JsZENhcGFiaWxpdGllcz8uaG9va1JldGVudGlvbj8uYWN0aXZlICE9PSB0cnVlXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRmF0YWxFcnJvcihcbiAgICAgICAgJ1RoZSBjb25maWd1cmVkIFdvcmxkIGRvZXMgbm90IHN1cHBvcnQgYGV4cGVyaW1lbnRhbF9taW5SZXRlbnRpb25gIGZvciBIb29rcy4nXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEdlbmVyYXRlIGhvb2sgSUQgYW5kIHRva2VuXG4gICAgY29uc3QgY29ycmVsYXRpb25JZCA9IGBob29rXyR7Y3R4LmdlbmVyYXRlVWxpZCgpfWA7XG4gICAgY29uc3QgdG9rZW4gPSBvcHRpb25zLnRva2VuID8/IGN0eC5nZW5lcmF0ZU5hbm9pZCgpO1xuICAgIGNvbnN0IHRva2VuUmV0ZW50aW9uVW50aWwgPVxuICAgICAgb3B0aW9ucy5leHBlcmltZW50YWxfbWluUmV0ZW50aW9uID09PSB1bmRlZmluZWRcbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiBwYXJzZUR1cmF0aW9uVG9EYXRlKG9wdGlvbnMuZXhwZXJpbWVudGFsX21pblJldGVudGlvbik7XG5cbiAgICAvLyBBZGQgaG9vayBjcmVhdGlvbiB0byBpbnZvY2F0aW9ucyBxdWV1ZSAodXNpbmcgTWFwIGZvciBPKDEpIG9wZXJhdGlvbnMpXG4gICAgY29uc3QgaXNXZWJob29rID0gb3B0aW9ucy5pc1dlYmhvb2sgPz8gZmFsc2U7XG5cbiAgICBjdHguaW52b2NhdGlvbnNRdWV1ZS5zZXQoY29ycmVsYXRpb25JZCwge1xuICAgICAgdHlwZTogJ2hvb2snLFxuICAgICAgY29ycmVsYXRpb25JZCxcbiAgICAgIHRva2VuLFxuICAgICAgdG9rZW5SZXRlbnRpb25VbnRpbCxcbiAgICAgIG1ldGFkYXRhOiBvcHRpb25zLm1ldGFkYXRhLFxuICAgICAgaXNXZWJob29rLFxuICAgIH0pO1xuXG4gICAgLy8gUXVldWUgb2YgYnVmZmVyZWQgaG9vayBwYXlsb2FkcyAocmVjZWl2ZWQgYmVmb3JlIHRoZSB3b3JrZmxvdyBhd2FpdGVkXG4gICAgLy8gdGhlIGhvb2spLiBFYWNoIGVudHJ5J3MgYGNsYWltKClgIGJ1aWxkcyB0aGUgY29uc3VtZXItZmFjaW5nIHByb21pc2VcbiAgICAvLyBmcm9tIHRoZSBjYXB0dXJlZCBoeWRyYXRpb24gb3V0Y29tZSBhbmQgb3JkZXJzIGl0IGRldGVybWluaXN0aWNhbGx5IGJ5XG4gICAgLy8gZXZlbnQtbG9nIHBvc2l0aW9uIGFnYWluc3QgYW55IGNvbmN1cnJlbnQgYnJhbmNoLWRlY2lkaW5nIHJlc29sdXRpb25cbiAgICAvLyAoc2VlIGBjdHgucGVuZGluZ0RlbGl2ZXJ5QmFycmllcnNgKS5cbiAgICBjb25zdCBwYXlsb2Fkc1F1ZXVlOiB7IGNsYWltOiAoKSA9PiBQcm9taXNlPFQ+IH1bXSA9IFtdO1xuXG4gICAgLy8gUXVldWUgb2YgcHJvbWlzZXMgdGhhdCByZXNvbHZlIHRvIHRoZSBuZXh0IGhvb2sgcGF5bG9hZFxuICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlV2l0aFJlc29sdmVyczxUPltdID0gW107XG5cbiAgICAvLyBRdWV1ZSBvZiBwcm9taXNlcyB0aGF0IHJlc29sdmUgb25jZSBob29rIHJlZ2lzdHJhdGlvbiBpcyBjb25maXJtZWRcbiAgICAvLyAod2l0aCBgbnVsbGApIG9yIGEgdG9rZW4gY29uZmxpY3QgaXMgZGV0ZWN0ZWQgKHdpdGggdGhlIGNvbmZsaWN0aW5nXG4gICAgLy8gYFJ1bmApLiBUaGVzZSBiYWNrIHRoZSBgaG9vay5nZXRDb25mbGljdCgpYCBnZXR0ZXIuXG4gICAgY29uc3QgZ2V0Q29uZmxpY3RQcm9taXNlczogUHJvbWlzZVdpdGhSZXNvbHZlcnM8UnVuPHVua25vd24+IHwgbnVsbD5bXSA9IFtdO1xuXG4gICAgbGV0IGV2ZW50TG9nRW1wdHkgPSBmYWxzZTtcblxuICAgIC8vIFRyYWNrIGlmIHRoZSBldmVudCBsb2cgY29uZmlybXMgaG9vayBjcmVhdGlvbiBoYXBwZW5lZFxuICAgIGxldCBoYXNDcmVhdGVkID0gZmFsc2U7XG5cbiAgICAvLyBUcmFjayBpZiB0aGUgZXZlbnQgbG9nIGNvbmZpcm1zIGRpc3Bvc2FsIGhhcHBlbmVkIChyZXBsYXkgbm8tb3ApXG4gICAgbGV0IGhhc0Rpc3Bvc2VkRXZlbnQgPSBmYWxzZTtcblxuICAgIC8vIFRyYWNrIGlmIHdlIGhhdmUgYSBjb25mbGljdCBzbyB3ZSBjYW4gcmVqZWN0IGZ1dHVyZSBhd2FpdHNcbiAgICBsZXQgaGFzQ29uZmxpY3QgPSBmYWxzZTtcbiAgICBsZXQgY29uZmxpY3RFcnJvclJlZjogSG9va0NvbmZsaWN0RXJyb3IgfCBudWxsID0gbnVsbDtcbiAgICAvLyBUaGUgY29uZmxpY3RpbmcgcnVuIGhhbmRsZSwgc2hhcmVkIGJ5IGV2ZXJ5IGBnZXRDb25mbGljdGAgYXdhaXQgc29cbiAgICAvLyByZXBlYXRlZCBhd2FpdHMgb2JzZXJ2ZSB0aGUgc2FtZSBpbnN0YW5jZSBkZXRlcm1pbmlzdGljYWxseS5cbiAgICBsZXQgY29uZmxpY3RSdW5SZWY6IFJ1bjx1bmtub3duPiB8IG51bGwgPSBudWxsO1xuXG4gICAgd2ViaG9va0xvZ2dlci5kZWJ1ZygnSG9vayBjb25zdW1lciBzZXR1cCcsIHsgY29ycmVsYXRpb25JZCwgdG9rZW4gfSk7XG4gICAgY3R4LmV2ZW50c0NvbnN1bWVyLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBldmVudHMgYW5kIHRoZXJlIGFyZSBwcm9taXNlcyB3YWl0aW5nLFxuICAgICAgLy8gaXQgbWVhbnMgdGhlIGhvb2sgaGFzIGJlZW4gYXdhaXRlZCwgYnV0IGFuIGluY29taW5nIHBheWxvYWQgaGFzIG5vdCB5ZXQgYmVlbiByZWNlaXZlZC5cbiAgICAgIC8vIEluIHRoaXMgY2FzZSwgdGhlIHdvcmtmbG93IHNob3VsZCBiZSBzdXNwZW5kZWQgdW50aWwgdGhlIGhvb2sgaXMgcmVzdW1lZC5cbiAgICAgIGlmICghZXZlbnQpIHtcbiAgICAgICAgZXZlbnRMb2dFbXB0eSA9IHRydWU7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIChwcm9taXNlcy5sZW5ndGggPiAwICYmIHBheWxvYWRzUXVldWUubGVuZ3RoID09PSAwKSB8fFxuICAgICAgICAgIChnZXRDb25mbGljdFByb21pc2VzLmxlbmd0aCA+IDAgJiYgIWhhc0NyZWF0ZWQgJiYgIWhhc0NvbmZsaWN0KVxuICAgICAgICApIHtcbiAgICAgICAgICBzY2hlZHVsZVdoZW5JZGxlKGN0eCwgKCkgPT4ge1xuICAgICAgICAgICAgY3R4Lm9uV29ya2Zsb3dFcnJvcihcbiAgICAgICAgICAgICAgbmV3IFdvcmtmbG93U3VzcGVuc2lvbihjdHguaW52b2NhdGlvbnNRdWV1ZSwgY3R4Lmdsb2JhbFRoaXMpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0Lk5vdENvbnN1bWVkO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQuY29ycmVsYXRpb25JZCAhPT0gY29ycmVsYXRpb25JZCkge1xuICAgICAgICAvLyBXZSdyZSBub3QgaW50ZXJlc3RlZCBpbiB0aGlzIGV2ZW50IC0gdGhlIGNvcnJlbGF0aW9uSWQgYmVsb25ncyB0byBhIGRpZmZlcmVudCBlbnRpdHlcbiAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuTm90Q29uc3VtZWQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV2ZW50VG9rZW4gPVxuICAgICAgICAnZXZlbnREYXRhJyBpbiBldmVudCAmJiBldmVudC5ldmVudERhdGEgJiYgJ3Rva2VuJyBpbiBldmVudC5ldmVudERhdGFcbiAgICAgICAgICA/IGV2ZW50LmV2ZW50RGF0YS50b2tlblxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAodHlwZW9mIGV2ZW50VG9rZW4gPT09ICdzdHJpbmcnICYmIGV2ZW50VG9rZW4gIT09IHRva2VuKSB7XG4gICAgICAgIGN0eC5wcm9taXNlUXVldWUgPSBjdHgucHJvbWlzZVF1ZXVlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIGN0eC5vbldvcmtmbG93RXJyb3IoXG4gICAgICAgICAgICBuZXcgUmVwbGF5RGl2ZXJnZW5jZUVycm9yKFxuICAgICAgICAgICAgICBgUmVwbGF5IGRpdmVyZ2VuY2U6IGhvb2sgZXZlbnQgJHtldmVudC5ldmVudFR5cGV9IGZvciAke2NvcnJlbGF0aW9uSWR9IGJlbG9uZ3MgdG8gdG9rZW4gXCIke2V2ZW50VG9rZW59XCIsIGJ1dCB0aGUgY3VycmVudCBob29rIGNvbnN1bWVyIGV4cGVjdHMgXCIke3Rva2VufVwiYCxcbiAgICAgICAgICAgICAgeyBldmVudElkOiBldmVudC5ldmVudElkIH1cbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuRmluaXNoZWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGZvciBob29rX2NyZWF0ZWQgZXZlbnQgdG8gbWFyayB0aGlzIGhvb2sgYXMgYWxyZWFkeSBjcmVhdGVkXG4gICAgICBpZiAoZXZlbnQuZXZlbnRUeXBlID09PSAnaG9va19jcmVhdGVkJykge1xuICAgICAgICBjb25zdCBxdWV1ZUl0ZW0gPSBjdHguaW52b2NhdGlvbnNRdWV1ZS5nZXQoY29ycmVsYXRpb25JZCk7XG4gICAgICAgIGlmIChxdWV1ZUl0ZW0gJiYgcXVldWVJdGVtLnR5cGUgPT09ICdob29rJykge1xuICAgICAgICAgIHF1ZXVlSXRlbS5oYXNDcmVhdGVkRXZlbnQgPSB0cnVlO1xuICAgICAgICAgIHF1ZXVlSXRlbS50b2tlblJldGVudGlvblVudGlsID0gZXZlbnQuZXZlbnREYXRhLnRva2VuUmV0ZW50aW9uVW50aWw7XG4gICAgICAgIH1cbiAgICAgICAgaGFzQ3JlYXRlZCA9IHRydWU7XG5cbiAgICAgICAgY29uc3QgcGVuZGluZ0dldENvbmZsaWN0UHJvbWlzZXMgPSBnZXRDb25mbGljdFByb21pc2VzLnNsaWNlKCk7XG4gICAgICAgIGdldENvbmZsaWN0UHJvbWlzZXMubGVuZ3RoID0gMDtcbiAgICAgICAgY3R4LnByb21pc2VRdWV1ZSA9IGN0eC5wcm9taXNlUXVldWUudGhlbigoKSA9PiB7XG4gICAgICAgICAgZm9yIChjb25zdCByZXNvbHZlciBvZiBwZW5kaW5nR2V0Q29uZmxpY3RQcm9taXNlcykge1xuICAgICAgICAgICAgcmVzb2x2ZXIucmVzb2x2ZShudWxsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkNvbnN1bWVkO1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgaG9va19jb25mbGljdCBldmVudCAtIGFub3RoZXIgd29ya2Zsb3cgaXMgdXNpbmcgdGhpcyB0b2tlblxuICAgICAgaWYgKGV2ZW50LmV2ZW50VHlwZSA9PT0gJ2hvb2tfY29uZmxpY3QnKSB7XG4gICAgICAgIC8vIFJlbW92ZSB0aGlzIGhvb2sgZnJvbSB0aGUgaW52b2NhdGlvbnMgcXVldWVcbiAgICAgICAgY3R4Lmludm9jYXRpb25zUXVldWUuZGVsZXRlKGNvcnJlbGF0aW9uSWQpO1xuXG4gICAgICAgIC8vIFN0b3JlIHRoZSBjb25mbGljdCBldmVudCBzbyB3ZSBjYW4gcmVqZWN0IGFueSBhd2FpdGVkIHByb21pc2VzLlxuICAgICAgICAvLyBDaGFpbiB0aHJvdWdoIHByb21pc2VRdWV1ZSB0byBlbnN1cmUgZGV0ZXJtaW5pc3RpYyBvcmRlcmluZy5cbiAgICAgICAgY29uc3QgY29uZmxpY3RFdmVudCA9IGV2ZW50IGFzIEhvb2tDb25mbGljdEV2ZW50O1xuICAgICAgICBjb25zdCBjb25mbGljdEVycm9yID0gbmV3IEhvb2tDb25mbGljdEVycm9yKFxuICAgICAgICAgIGNvbmZsaWN0RXZlbnQuZXZlbnREYXRhLnRva2VuLFxuICAgICAgICAgIGNvbmZsaWN0RXZlbnQuZXZlbnREYXRhLmNvbmZsaWN0aW5nUnVuSWRcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBNYXJrIHRoYXQgd2UgaGF2ZSBhIGNvbmZsaWN0IHNvIGZ1dHVyZSBhd2FpdHMgYWxzbyByZWplY3RcbiAgICAgICAgaGFzQ29uZmxpY3QgPSB0cnVlO1xuICAgICAgICBjb25mbGljdEVycm9yUmVmID0gY29uZmxpY3RFcnJvcjtcbiAgICAgICAgY29uZmxpY3RSdW5SZWYgPSBjcmVhdGVDb25mbGljdGluZ1J1bihcbiAgICAgICAgICBjdHgsXG4gICAgICAgICAgY29uZmxpY3RFdmVudC5ldmVudERhdGEuY29uZmxpY3RpbmdSdW5JZFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIENhcHR1cmUgYW5kIGRyYWluIHBlbmRpbmcgcHJvbWlzZXMgc3luY2hyb25vdXNseSBzbyB0aGUgbnVsbCBldmVudFxuICAgICAgICAvLyBoYW5kbGVyIHdvbid0IHNlZSB0aGVtIGFuZCB0cmlnZ2VyIGEgc3B1cmlvdXMgV29ya2Zsb3dTdXNwZW5zaW9uLlxuICAgICAgICAvLyBUaGUgYWN0dWFsIHNldHRsZW1lbnRzIGFyZSBkZWZlcnJlZCB0aHJvdWdoIHByb21pc2VRdWV1ZSBmb3JcbiAgICAgICAgLy8gb3JkZXJpbmcuIFBheWxvYWQgYXdhaXRlcnMgcmVqZWN0IHdpdGggSG9va0NvbmZsaWN0RXJyb3IsIHdoaWxlXG4gICAgICAgIC8vIGBnZXRDb25mbGljdGAgYXdhaXRlcnMgcmVzb2x2ZSB3aXRoIHRoZSBjb25mbGljdGluZyBydW4gc28gdGhlXG4gICAgICAgIC8vIHdvcmtmbG93IGNhbiBicmFuY2ggb24gdGhlIGNvbmZsaWN0IHdpdGhvdXQgdGhyb3dpbmcuIFdoZW4gbm9cbiAgICAgICAgLy8gcmVhbCBgUnVuYCBjYW4gYmUgY29uc3RydWN0ZWQgKHNlZSBgY3JlYXRlQ29uZmxpY3RpbmdSdW5gKSxcbiAgICAgICAgLy8gYGdldENvbmZsaWN0YCBhd2FpdGVycyByZWplY3Qgd2l0aCB0aGUgSG9va0NvbmZsaWN0RXJyb3IgaW5zdGVhZFxuICAgICAgICAvLyBvZiByZXNvbHZpbmcgd2l0aCBhIHZhbHVlIHRoYXQgZG9lc24ndCBob25vciB0aGUgYFJ1bmAgY29udHJhY3QuXG4gICAgICAgIGNvbnN0IHBlbmRpbmdQcm9taXNlcyA9IHByb21pc2VzLnNsaWNlKCk7XG4gICAgICAgIHByb21pc2VzLmxlbmd0aCA9IDA7XG4gICAgICAgIGNvbnN0IHBlbmRpbmdHZXRDb25mbGljdFByb21pc2VzID0gZ2V0Q29uZmxpY3RQcm9taXNlcy5zbGljZSgpO1xuICAgICAgICBnZXRDb25mbGljdFByb21pc2VzLmxlbmd0aCA9IDA7XG5cbiAgICAgICAgY3R4LnByb21pc2VRdWV1ZSA9IGN0eC5wcm9taXNlUXVldWUudGhlbigoKSA9PiB7XG4gICAgICAgICAgZm9yIChjb25zdCByZXNvbHZlciBvZiBwZW5kaW5nUHJvbWlzZXMpIHtcbiAgICAgICAgICAgIHJlc29sdmVyLnJlamVjdChjb25mbGljdEVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChjb25zdCByZXNvbHZlciBvZiBwZW5kaW5nR2V0Q29uZmxpY3RQcm9taXNlcykge1xuICAgICAgICAgICAgaWYgKGNvbmZsaWN0UnVuUmVmKSB7XG4gICAgICAgICAgICAgIHJlc29sdmVyLnJlc29sdmUoY29uZmxpY3RSdW5SZWYpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZXIucmVqZWN0KGNvbmZsaWN0RXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuQ29uc3VtZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5ldmVudFR5cGUgPT09ICdob29rX3JlY2VpdmVkJykge1xuICAgICAgICAvLyBSZWdpc3RlciBhICdob29rJyBkZWxpdmVyeSBiYXJyaWVyIGF0IHRoaXMgZXZlbnQncyBsb2cgaW5kZXggc28gYVxuICAgICAgICAvLyBsYXRlci1pbi1sb2cgYHdhaXRfY29tcGxldGVkYCBvciBzdGVwIHJlc3VsdCBpcyBkZWxpdmVyZWQgb25seSBhZnRlclxuICAgICAgICAvLyB0aGlzIGhvb2ssIGFuZCBzbyB0aGlzIGhvb2sgaXMgZGVsaXZlcmVkIG9ubHkgYWZ0ZXIgZXZlcnlcbiAgICAgICAgLy8gZWFybGllci1pbi1sb2cgYHdhaXRfY29tcGxldGVkYCBhbmQgc3RlcCByZXN1bHQg4oCUIGtlZXBpbmcgYW55XG4gICAgICAgIC8vIGBQcm9taXNlLnJhY2VgIChvciBjb25jdXJyZW50LWJyYW5jaCBVTElEIGFsbG9jYXRpb24pIGRldGVybWluaXN0aWNcbiAgICAgICAgLy8gYW5kIGFsaWduZWQgd2l0aCB0aGUgY29tbWl0dGVkIGV2ZW50IGxvZywgcmVnYXJkbGVzcyBvZlxuICAgICAgICAvLyBtaWNyb3Rhc2staG9wIGNvdW50LCBoeWRyYXRpb24gdGltZSwgb3IgcmFjZS1hcmd1bWVudCBvcmRlci5cbiAgICAgICAgLy8gU2VlIGBjdHgucGVuZGluZ0RlbGl2ZXJ5QmFycmllcnNgLlxuICAgICAgICAvL1xuICAgICAgICAvLyBUaGUgYmFycmllciBpcyByZWdpc3RlcmVkIEFSTUVEIG9ubHkgd2hlbiBhIGNvbnN1bWVyIGlzIGFscmVhZHlcbiAgICAgICAgLy8gYXdhaXRpbmcsIHNvIHRoaXMgcGF5bG9hZCBpcyBjb21taXR0ZWQgdG8gcmVhY2hpbmcgdGhlIHdvcmtmbG93LiBBXG4gICAgICAgIC8vIGJ1ZmZlcmVkIHBheWxvYWQgaXMgcmVnaXN0ZXJlZCB1bmFybWVkIGFuZCBhcm1lZCBieSBgY2xhaW0oKWA6IHVudGlsXG4gICAgICAgIC8vIGEgY29uc3VtZXIgdGFrZXMgaXQsIGEgbGF0ZXIgc3RlcCByZXN1bHQgbXVzdCBub3QgYmUgb3JkZXJlZCBiZWhpbmRcbiAgICAgICAgLy8gaXQgKHNlZSBgYXdhaXRFYXJsaWVyRGVsaXZlcmllc2ApLlxuICAgICAgICBjb25zdCBldmVudEluZGV4ID0gY3R4LmV2ZW50c0NvbnN1bWVyLmV2ZW50SW5kZXg7XG4gICAgICAgIGNvbnN0IGhhc1dhaXRpbmdDb25zdW1lciA9IHByb21pc2VzLmxlbmd0aCA+IDA7XG4gICAgICAgIGNvbnN0IGJhcnJpZXIgPSByZWdpc3RlckRlbGl2ZXJ5QmFycmllcihjdHgsIGV2ZW50SW5kZXgsICdob29rJywge1xuICAgICAgICAgIGFybWVkOiBoYXNXYWl0aW5nQ29uc3VtZXIsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChoYXNXYWl0aW5nQ29uc3VtZXIpIHtcbiAgICAgICAgICAvLyBBIGNvbnN1bWVyIGlzIGFscmVhZHkgYXdhaXRpbmcsIHNvIHRoaXMgcGF5bG9hZCdzIGRlbGl2ZXJ5IGlzXG4gICAgICAgICAgLy8gcGlubmVkIHRvIHRoaXMgbG9nIHBvc2l0aW9uOiBjYXB0dXJlIHRoZSBkZWZlcnJhbCBIRVJFLCB3aGlsZVxuICAgICAgICAgIC8vIGNvbnN1bWluZyB0aGUgZXZlbnQsIG5vdCBhdCB0aGUgZW5kIG9mIHRoZSBoeWRyYXRpb24gc2xvdCBiZWxvdyDigJRcbiAgICAgICAgICAvLyBzYW1lIHJlYXNvbmluZyBhcyBzdGVwLnRzLiBBbiBlYXJsaWVyIHN0ZXAgb3IgaG9vayB3aG9zZSBzbG90IHJ1bnNcbiAgICAgICAgICAvLyBmaXJzdCBvbiB0aGlzIHNlcmlhbCBxdWV1ZSBoYXMgdXN1YWxseSBkZWxpdmVyZWQsIGFuZCBzb1xuICAgICAgICAgIC8vIGRlcmVnaXN0ZXJlZCBpdHMgYmFycmllciwgYmVmb3JlIHRoaXMgc2xvdCBlbmRzLiBSZWFkIHRoZW4sIGl0XG4gICAgICAgICAgLy8gd291bGQgYmUgaW52aXNpYmxlIGFuZCB0aGlzIHBheWxvYWQgd291bGQgc2tpcCBib3RoIHRoZSBnYXRlIEFORFxuICAgICAgICAgIC8vIGBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzYCcgbWFjcm90YXNrIHlpZWxkLCBsZXR0aW5nIGl0IG92ZXJ0YWtlIHRoZVxuICAgICAgICAgIC8vIGJyYW5jaCB0aGF0IGVhcmxpZXIgZGVsaXZlcnkganVzdCB3b2tlLiBFdmVyeSBldmVudCBpbiBvbmUgZHJhaW5cbiAgICAgICAgICAvLyB3aW5kb3cgaXMgY29uc3VtZWQgYmVmb3JlIGFueSBzbG90IHJ1bnMsIHNvIGNhcHR1cmluZyBhdFxuICAgICAgICAgIC8vIGNvbnN1bXB0aW9uIHRpbWUgc2VlcyBhbGwgb2YgdGhlbS5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIFRoZSBCVUZGRVJFRCBicmFuY2ggYmVsb3cgZGVsaWJlcmF0ZWx5IGRvZXMgTk9UIGRvIHRoaXMg4oCUIHNlZSB0aGVcbiAgICAgICAgICAvLyBjb21tZW50IG9uIGBjbGFpbSgpYC5cbiAgICAgICAgICBjb25zdCBlYXJsaWVyRGVsaXZlcmVkID0gYXdhaXRFYXJsaWVyRGVsaXZlcmllcyhcbiAgICAgICAgICAgIGN0eCxcbiAgICAgICAgICAgIGV2ZW50SW5kZXgsXG4gICAgICAgICAgICAnaG9vaydcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IG5leHQgPSBwcm9taXNlcy5zaGlmdCgpO1xuICAgICAgICAgIGlmIChuZXh0KSB7XG4gICAgICAgICAgICAvLyBIeWRyYXRlIHRocm91Z2ggYSBwcm9taXNlUXVldWUgc2xvdCAoc28gYXN5bmMgZGVzZXJpYWxpemF0aW9uXG4gICAgICAgICAgICAvLyBzdGF5cyBpbiBldmVudC1sb2cgb3JkZXIpLCB0aGVuIGRlZmVyIGJlaGluZCBlYXJsaWVyIHdhaXRzIGFuZFxuICAgICAgICAgICAgLy8gc3RlcHMgYmVmb3JlIHJlc29sdmluZy4gVGhlIGRlZmVycmFsIHJ1bnMgT0ZGIHRoZSBzZXJpYWwgcXVldWVcbiAgICAgICAgICAgIC8vIChpdCBtYXkgd2FpdCBvbiBhbiBlYXJsaWVyIHdhaXQgb3Igc3RlcCBkZWxpdmVyeSBhbmQgYmxvY2tpbmcgYVxuICAgICAgICAgICAgLy8gcXVldWUgc2xvdCBvbiB0aGF0IHdvdWxkIGRlYWRsb2NrIHRoZSBxdWV1ZSkuXG4gICAgICAgICAgICBjdHgucGVuZGluZ0RlbGl2ZXJpZXMrKztcbiAgICAgICAgICAgIGxldCBoeWRyYXRlT3V0Y29tZTpcbiAgICAgICAgICAgICAgfCB7IG9rOiB0cnVlOyB2YWx1ZTogVCB9XG4gICAgICAgICAgICAgIHwgeyBvazogZmFsc2U7IGVycm9yOiB1bmtub3duIH07XG4gICAgICAgICAgICBjdHgucHJvbWlzZVF1ZXVlID0gY3R4LnByb21pc2VRdWV1ZS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmVwYXJlZCA9XG4gICAgICAgICAgICAgICAgICBhd2FpdCBjdHgucmVwbGF5UGF5bG9hZENhY2hlLnByZXBhcmVFdmVudFBheWxvYWQoXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LmV2ZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICdwYXlsb2FkJyxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuZXZlbnREYXRhLnBheWxvYWRcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IGh5ZHJhdGVTdGVwUmV0dXJuVmFsdWUoXG4gICAgICAgICAgICAgICAgICBldmVudC5ldmVudERhdGEucGF5bG9hZCxcbiAgICAgICAgICAgICAgICAgIGN0eC5ydW5JZCxcbiAgICAgICAgICAgICAgICAgIGN0eC5lbmNyeXB0aW9uS2V5LFxuICAgICAgICAgICAgICAgICAgY3R4Lmdsb2JhbFRoaXMsXG4gICAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICAgIHByZXBhcmVkXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBoeWRyYXRlT3V0Y29tZSA9IHsgb2s6IHRydWUsIHZhbHVlOiBwYXlsb2FkIGFzIFQgfTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBoeWRyYXRlT3V0Y29tZSA9IHsgb2s6IGZhbHNlLCBlcnJvciB9O1xuICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIGN0eC5wZW5kaW5nRGVsaXZlcmllcy0tO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHZvaWQgZWFybGllckRlbGl2ZXJlZC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBiYXJyaWVyLm1hcmtEZWxpdmVyZWQoKTtcbiAgICAgICAgICAgICAgICBpZiAoaHlkcmF0ZU91dGNvbWUub2spIHtcbiAgICAgICAgICAgICAgICAgIG5leHQucmVzb2x2ZShoeWRyYXRlT3V0Y29tZS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIG5leHQucmVqZWN0KGh5ZHJhdGVPdXRjb21lLmVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vIGNvbnN1bWVyIGlzIGF3YWl0aW5nIHlldC4gSHlkcmF0ZSB0aHJvdWdoIGEgcHJvbWlzZVF1ZXVlIHNsb3RcbiAgICAgICAgICAvLyBhdCB0aGlzIGxvZyBwb3NpdGlvbiBhbmQgcGFyayB0aGUgT1VUQ09NRSAodmFsdWUgb3IgZXJyb3IpIGZvciBhXG4gICAgICAgICAgLy8gbGF0ZXIgYGl0ZXJhdG9yLm5leHQoKWAgLyBgYXdhaXQgaG9va2AgY2xhaW0uIFdlIGNhcHR1cmUgdGhlXG4gICAgICAgICAgLy8gb3V0Y29tZSByYXRoZXIgdGhhbiBlYWdlcmx5IHJlc29sdmluZy9yZWplY3RpbmcgYSBwcm9taXNlIG5vXG4gICAgICAgICAgLy8gY29uc3VtZXIgaGFzIGF0dGFjaGVkIHRvIOKAlCBhIHJlamVjdGVkIHVuY2xhaW1lZCBwcm9taXNlIChlLmcuIGFcbiAgICAgICAgICAvLyBidWZmZXJlZCBlbmNyeXB0ZWQgcGF5bG9hZCB3aXRoIG5vIGtleSkgd291bGQgb3RoZXJ3aXNlIHN1cmZhY2VcbiAgICAgICAgICAvLyBhcyBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uIGFuZCBjcmFzaCB0aGUgcHJvY2Vzcy4gYGNsYWltKClgIGJ1aWxkc1xuICAgICAgICAgIC8vIHRoZSBjb25zdW1lci1mYWNpbmcgcHJvbWlzZSBvbiBkZW1hbmQuXG4gICAgICAgICAgbGV0IG91dGNvbWU6XG4gICAgICAgICAgICB8IHsgb2s6IHRydWU7IHZhbHVlOiBUIH1cbiAgICAgICAgICAgIHwgeyBvazogZmFsc2U7IGVycm9yOiB1bmtub3duIH1cbiAgICAgICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgICAgIGNvbnN0IGh5ZHJhdGVkID0gd2l0aFJlc29sdmVyczx2b2lkPigpO1xuXG4gICAgICAgICAgY29uc3QgY2xhaW0gPSAoKTogUHJvbWlzZTxUPiA9PiB7XG4gICAgICAgICAgICAvLyBBIGNvbnN1bWVyIGhhcyB0YWtlbiB0aGlzIHBheWxvYWQsIHNvIGl0cyBkZWxpdmVyeSBubyBsb25nZXJcbiAgICAgICAgICAgIC8vIHdhaXRzIG9uIHdvcmtmbG93IGNvZGU6IGxhdGVyIHN0ZXAgcmVzdWx0cyBtYXkgbm93IGJlIG9yZGVyZWRcbiAgICAgICAgICAgIC8vIGJlaGluZCBpdC5cbiAgICAgICAgICAgIGJhcnJpZXIuYXJtKCk7XG4gICAgICAgICAgICAvLyBVbmxpa2UgZXZlcnkgb3RoZXIgZGVsaXZlcnksIHRoZSBkZWZlcnJhbCBpcyBldmFsdWF0ZWQgSEVSRSwgYXRcbiAgICAgICAgICAgIC8vIGNsYWltIHRpbWUsIHJhdGhlciB0aGFuIHdoZW4gdGhlIGV2ZW50IHdhcyBjb25zdW1lZC4gQSBidWZmZXJlZFxuICAgICAgICAgICAgLy8gcGF5bG9hZCdzIGRlbGl2ZXJ5IGdlbnVpbmVseSBoYXBwZW5zIHdoZW4gdGhlIHdvcmtmbG93IHJlYWRzIHRoZVxuICAgICAgICAgICAgLy8gaG9vaywgd2hpY2ggbWF5IGJlIG1hbnkgZGVsaXZlcmllcyBsYXRlcjsgYSBjb25zdW1wdGlvbi10aW1lXG4gICAgICAgICAgICAvLyBzbmFwc2hvdCB3b3VsZCBtYWtlIHRoZSBjbGFpbSB3YWl0IG9uIOKAlCBhbmQgcGF5IHRoZSBtYWNyb3Rhc2tcbiAgICAgICAgICAgIC8vIHlpZWxkIGZvciDigJQgYmFycmllcnMgdGhhdCB3ZXJlIHJlbGV2YW50IHRvIGEgbW9tZW50IHRoaXMgcGF5bG9hZFxuICAgICAgICAgICAgLy8gbmV2ZXIgcGFydGljaXBhdGVkIGluLiBUaGF0IGlzIG5vdCB0aGVvcmV0aWNhbDogaXQgc3RhbGxzIHRoZVxuICAgICAgICAgICAgLy8gc2Vjb25kIHBheWxvYWQgaW4gdGhlIGUyZSBgaG9va1dpdGhTbGVlcFdvcmtmbG93YCBsb25nIGVub3VnaFxuICAgICAgICAgICAgLy8gZm9yIHRoZSBydW4gdG8gc3VzcGVuZCBiZWZvcmUgZGVsaXZlcmluZyBpdC5cbiAgICAgICAgICAgIHJldHVybiBoeWRyYXRlZC5wcm9taXNlXG4gICAgICAgICAgICAgIC50aGVuKCgpID0+IGF3YWl0RWFybGllckRlbGl2ZXJpZXMoY3R4LCBldmVudEluZGV4LCAnaG9vaycpKVxuICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgYmFycmllci5tYXJrRGVsaXZlcmVkKCk7XG4gICAgICAgICAgICAgICAgaWYgKG91dGNvbWUgJiYgIW91dGNvbWUub2spIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IG91dGNvbWUuZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAob3V0Y29tZSBhcyB7IG9rOiB0cnVlOyB2YWx1ZTogVCB9KS52YWx1ZTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGN0eC5wZW5kaW5nRGVsaXZlcmllcysrO1xuICAgICAgICAgIGN0eC5wcm9taXNlUXVldWUgPSBjdHgucHJvbWlzZVF1ZXVlLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgcHJlcGFyZWQgPSBhd2FpdCBjdHgucmVwbGF5UGF5bG9hZENhY2hlLnByZXBhcmVFdmVudFBheWxvYWQoXG4gICAgICAgICAgICAgICAgZXZlbnQuZXZlbnRJZCxcbiAgICAgICAgICAgICAgICAncGF5bG9hZCcsXG4gICAgICAgICAgICAgICAgZXZlbnQuZXZlbnREYXRhLnBheWxvYWRcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IGh5ZHJhdGVTdGVwUmV0dXJuVmFsdWUoXG4gICAgICAgICAgICAgICAgZXZlbnQuZXZlbnREYXRhLnBheWxvYWQsXG4gICAgICAgICAgICAgICAgY3R4LnJ1bklkLFxuICAgICAgICAgICAgICAgIGN0eC5lbmNyeXB0aW9uS2V5LFxuICAgICAgICAgICAgICAgIGN0eC5nbG9iYWxUaGlzLFxuICAgICAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgICAgIHByZXBhcmVkXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIG91dGNvbWUgPSB7IG9rOiB0cnVlLCB2YWx1ZTogcGF5bG9hZCBhcyBUIH07XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBvdXRjb21lID0geyBvazogZmFsc2UsIGVycm9yIH07XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICBjdHgucGVuZGluZ0RlbGl2ZXJpZXMtLTtcbiAgICAgICAgICAgICAgaHlkcmF0ZWQucmVzb2x2ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHBheWxvYWRzUXVldWUucHVzaCh7IGNsYWltIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuQ29uc3VtZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5ldmVudFR5cGUgPT09ICdob29rX2Rpc3Bvc2VkJykge1xuICAgICAgICAvLyBUZXJtaW5hbCBzdGF0ZSAtIHJlbW92ZSBmcm9tIHF1ZXVlIChsaWtlIHN0ZXBfY29tcGxldGVkL3dhaXRfY29tcGxldGVkKVxuICAgICAgICBjdHguaW52b2NhdGlvbnNRdWV1ZS5kZWxldGUoY29ycmVsYXRpb25JZCk7XG4gICAgICAgIC8vIE1hcmsgdGhhdCB0aGUgZXZlbnQgbG9nIGNvbmZpcm1zIGRpc3Bvc2FsIGhhcHBlbmVkXG4gICAgICAgIGhhc0Rpc3Bvc2VkRXZlbnQgPSB0cnVlO1xuICAgICAgICAvLyBXZSdyZSBkb25lIHByb2Nlc3NpbmcgYW55IG1vcmUgZXZlbnRzIGZvciB0aGlzIGhvb2tcbiAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuRmluaXNoZWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoaXMgcmVwbGF5IGluc3RhbGxlZCBhIGRpZmZlcmVudCBjb25zdW1lciB0aGFuIHRoZSBzdG9yZWQgZXZlbnQgbmVlZHMuXG4gICAgICBjdHgucHJvbWlzZVF1ZXVlID0gY3R4LnByb21pc2VRdWV1ZS50aGVuKCgpID0+IHtcbiAgICAgICAgY3R4Lm9uV29ya2Zsb3dFcnJvcihcbiAgICAgICAgICBuZXcgUmVwbGF5RGl2ZXJnZW5jZUVycm9yKFxuICAgICAgICAgICAgYFJlcGxheSBkaXZlcmdlbmNlOiBVbmV4cGVjdGVkIGV2ZW50IHR5cGUgZm9yIGhvb2sgJHtjb3JyZWxhdGlvbklkfSAodG9rZW46ICR7dG9rZW59KSBcIiR7ZXZlbnQuZXZlbnRUeXBlfVwiYCxcbiAgICAgICAgICAgIHsgZXZlbnRJZDogZXZlbnQuZXZlbnRJZCB9XG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5GaW5pc2hlZDtcbiAgICB9KTtcblxuICAgIC8vIFRyYWNrIGlmIHRoZSBob29rIGhhcyBiZWVuIGRpc3Bvc2VkXG4gICAgbGV0IGlzRGlzcG9zZWQgPSBmYWxzZTtcblxuICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgcHJvbWlzZSB0aGF0IHdhaXRzIGZvciB0aGUgbmV4dCBob29rIHBheWxvYWRcbiAgICBmdW5jdGlvbiBjcmVhdGVIb29rUHJvbWlzZSgpOiBQcm9taXNlPFQ+IHtcbiAgICAgIGNvbnN0IHJlc29sdmVycyA9IHdpdGhSZXNvbHZlcnM8VD4oKTtcblxuICAgICAgLy8gSWYgd2UgaGF2ZSBhIGNvbmZsaWN0LCByZWplY3QgdGhyb3VnaCB0aGUgcHJvbWlzZVF1ZXVlIHRvIG1haW50YWluXG4gICAgICAvLyBkZXRlcm1pbmlzdGljIG9yZGVyaW5nIHdpdGggYW55IHByaW9yIHF1ZXVlZCByZXNvbHV0aW9ucy5cbiAgICAgIGlmIChoYXNDb25mbGljdCAmJiBjb25mbGljdEVycm9yUmVmKSB7XG4gICAgICAgIGN0eC5wcm9taXNlUXVldWUgPSBjdHgucHJvbWlzZVF1ZXVlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJlc29sdmVycy5yZWplY3QoY29uZmxpY3RFcnJvclJlZik7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZXJzLnByb21pc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXlsb2Fkc1F1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgbmV4dERlbGl2ZXJ5ID0gcGF5bG9hZHNRdWV1ZS5zaGlmdCgpO1xuICAgICAgICBpZiAobmV4dERlbGl2ZXJ5KSB7XG4gICAgICAgICAgLy8gVGhlIHBheWxvYWQgd2FzIGh5ZHJhdGVkIHRocm91Z2ggYSBwcm9taXNlUXVldWUgc2xvdCBhdCBpdHMgbG9nXG4gICAgICAgICAgLy8gcG9zaXRpb24gKGJ1ZmZlcmluZyBicmFuY2ggYWJvdmUpLiBgY2xhaW0oKWAgYnVpbGRzIHRoZVxuICAgICAgICAgIC8vIGNvbnN1bWVyLWZhY2luZyBwcm9taXNlIGZyb20gdGhhdCBvdXRjb21lLCBkZWZlcnJpbmcgYmVoaW5kIGFueVxuICAgICAgICAgIC8vIGVhcmxpZXItaW4tbG9nIHdhaXQgb3Igc3RlcCBhbmQgbWFya2luZyB0aGlzIGhvb2sgZGVsaXZlcmVkIOKAlCBzb1xuICAgICAgICAgIC8vIHJlc29sdXRpb24gb3JkZXIgc3RheXMgYW5jaG9yZWQgdG8gdGhlIGV2ZW50IGxvZywgbm90IHRoaXMgbGF0ZXJcbiAgICAgICAgICAvLyBjbGFpbSBzaXRlLlxuICAgICAgICAgIHJldHVybiBuZXh0RGVsaXZlcnkuY2xhaW0oKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnRMb2dFbXB0eSkge1xuICAgICAgICBzY2hlZHVsZVdoZW5JZGxlKGN0eCwgKCkgPT4ge1xuICAgICAgICAgIGN0eC5vbldvcmtmbG93RXJyb3IoXG4gICAgICAgICAgICBuZXcgV29ya2Zsb3dTdXNwZW5zaW9uKGN0eC5pbnZvY2F0aW9uc1F1ZXVlLCBjdHguZ2xvYmFsVGhpcylcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcHJvbWlzZXMucHVzaChyZXNvbHZlcnMpO1xuXG4gICAgICByZXR1cm4gcmVzb2x2ZXJzLnByb21pc2U7XG4gICAgfVxuXG4gICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBob29rJ3NcbiAgICAvLyByZWdpc3RyYXRpb24gb3V0Y29tZTogdGhlIGNvbmZsaWN0aW5nIGBSdW5gIHdoZW4gdGhlIHRva2VuIGlzIG93bmVkXG4gICAgLy8gYnkgYW5vdGhlciBhY3RpdmUgaG9vaywgYG51bGxgIG9uY2UgdGhpcyBob29rJ3MgcmVnaXN0cmF0aW9uIGlzXG4gICAgLy8gY29tbWl0dGVkLiBCb3RoIGZhc3QtcGF0aHMgc2V0dGxlIHRocm91Z2ggYGN0eC5wcm9taXNlUXVldWVgIHNvXG4gICAgLy8gcmVzb2x1dGlvbiBvcmRlciBhbHdheXMgbWF0Y2hlcyBldmVudC1sb2cgb3JkZXIuXG4gICAgZnVuY3Rpb24gY3JlYXRlR2V0Q29uZmxpY3RQcm9taXNlKCk6IFByb21pc2U8UnVuPHVua25vd24+IHwgbnVsbD4ge1xuICAgICAgY29uc3QgcmVzb2x2ZXJzID0gd2l0aFJlc29sdmVyczxSdW48dW5rbm93bj4gfCBudWxsPigpO1xuXG4gICAgICBpZiAoaGFzQ3JlYXRlZCkge1xuICAgICAgICBjdHgucHJvbWlzZVF1ZXVlID0gY3R4LnByb21pc2VRdWV1ZS50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXNvbHZlcnMucmVzb2x2ZShudWxsKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXNvbHZlcnMucHJvbWlzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc0NvbmZsaWN0KSB7XG4gICAgICAgIGN0eC5wcm9taXNlUXVldWUgPSBjdHgucHJvbWlzZVF1ZXVlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIGlmIChjb25mbGljdFJ1blJlZikge1xuICAgICAgICAgICAgcmVzb2x2ZXJzLnJlc29sdmUoY29uZmxpY3RSdW5SZWYpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlcnMucmVqZWN0KGNvbmZsaWN0RXJyb3JSZWYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXNvbHZlcnMucHJvbWlzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcXVldWVJdGVtID0gY3R4Lmludm9jYXRpb25zUXVldWUuZ2V0KGNvcnJlbGF0aW9uSWQpO1xuICAgICAgaWYgKHF1ZXVlSXRlbSAmJiBxdWV1ZUl0ZW0udHlwZSA9PT0gJ2hvb2snKSB7XG4gICAgICAgIHF1ZXVlSXRlbS5oYXNDb25mbGljdEF3YWl0ZXIgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnRMb2dFbXB0eSkge1xuICAgICAgICBzY2hlZHVsZVdoZW5JZGxlKGN0eCwgKCkgPT4ge1xuICAgICAgICAgIGN0eC5vbldvcmtmbG93RXJyb3IoXG4gICAgICAgICAgICBuZXcgV29ya2Zsb3dTdXNwZW5zaW9uKGN0eC5pbnZvY2F0aW9uc1F1ZXVlLCBjdHguZ2xvYmFsVGhpcylcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgZ2V0Q29uZmxpY3RQcm9taXNlcy5wdXNoKHJlc29sdmVycyk7XG4gICAgICByZXR1cm4gcmVzb2x2ZXJzLnByb21pc2U7XG4gICAgfVxuXG4gICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGRpc3Bvc2UgdGhlIGhvb2tcbiAgICBmdW5jdGlvbiBkaXNwb3NlSG9vaygpOiB2b2lkIHtcbiAgICAgIGlmIChpc0Rpc3Bvc2VkKSB7XG4gICAgICAgIHJldHVybjsgLy8gQWxyZWFkeSBkaXNwb3NlZCwgbm90aGluZyB0byBkb1xuICAgICAgfVxuICAgICAgaXNEaXNwb3NlZCA9IHRydWU7XG5cbiAgICAgIC8vIElmIHRoZSBldmVudCBsb2cgYWxyZWFkeSBjb250YWlucyBob29rX2Rpc3Bvc2VkLCB0aGlzIGlzIGEgcmVwbGF5IOKAlCBuby1vcFxuICAgICAgaWYgKGhhc0Rpc3Bvc2VkRXZlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgZGlzcG9zZWQgZmxhZyBvbiB0aGUgZXhpc3RpbmcgcXVldWUgaXRlbVxuICAgICAgY29uc3QgcXVldWVJdGVtID0gY3R4Lmludm9jYXRpb25zUXVldWUuZ2V0KGNvcnJlbGF0aW9uSWQpO1xuICAgICAgaWYgKHF1ZXVlSXRlbSAmJiBxdWV1ZUl0ZW0udHlwZSA9PT0gJ2hvb2snKSB7XG4gICAgICAgIHF1ZXVlSXRlbS5kaXNwb3NlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIERyYWluIGFueSBwZW5kaW5nIHByb21pc2VzIHRoYXQgYXJlIHdhaXRpbmcgZm9yIHBheWxvYWRzLlxuICAgICAgLy8gV2l0aG91dCB0aGlzLCBwcm9taXNlcyBjcmVhdGVkIGJ5IGBhd2FpdCBob29rYCBvciB0aGUgYXN5bmMgaXRlcmF0b3Inc1xuICAgICAgLy8gYHlpZWxkIGF3YWl0IHRoaXNgIHdvdWxkIGhhbmcgZm9yZXZlciBzaW5jZSB0aGUgZXZlbnQgY29uc3VtZXIgd2lsbFxuICAgICAgLy8gbmV2ZXIgZGVsaXZlciBhbm90aGVyIGhvb2tfcmVjZWl2ZWQgYWZ0ZXIgZGlzcG9zYWwuXG4gICAgICBpZiAocHJvbWlzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBwcm9taXNlcy5sZW5ndGggPSAwO1xuICAgICAgICBzY2hlZHVsZVdoZW5JZGxlKGN0eCwgKCkgPT4ge1xuICAgICAgICAgIGN0eC5vbldvcmtmbG93RXJyb3IoXG4gICAgICAgICAgICBuZXcgV29ya2Zsb3dTdXNwZW5zaW9uKGN0eC5pbnZvY2F0aW9uc1F1ZXVlLCBjdHguZ2xvYmFsVGhpcylcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgd2ViaG9va0xvZ2dlci5kZWJ1ZygnSG9vayBkaXNwb3NlZCcsIHsgY29ycmVsYXRpb25JZCwgdG9rZW4gfSk7XG4gICAgfVxuXG4gICAgY29uc3QgaG9vazogSG9vazxUPiA9IHtcbiAgICAgIHRva2VuLFxuXG4gICAgICBnZXRDb25mbGljdCgpOiBQcm9taXNlPFJ1bjx1bmtub3duPiB8IG51bGw+IHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUdldENvbmZsaWN0UHJvbWlzZSgpO1xuICAgICAgfSxcblxuICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub1RoZW5Qcm9wZXJ0eTogSW50ZW50aW9uYWxseSB0aGVuYWJsZVxuICAgICAgdGhlbjxUUmVzdWx0MSA9IFQsIFRSZXN1bHQyID0gbmV2ZXI+KFxuICAgICAgICBvbmZ1bGZpbGxlZD86ICgodmFsdWU6IFQpID0+IFRSZXN1bHQxIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDE+KSB8IG51bGwsXG4gICAgICAgIG9ucmVqZWN0ZWQ/OiAoKHJlYXNvbjogYW55KSA9PiBUUmVzdWx0MiB8IFByb21pc2VMaWtlPFRSZXN1bHQyPikgfCBudWxsXG4gICAgICApOiBQcm9taXNlPFRSZXN1bHQxIHwgVFJlc3VsdDI+IHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUhvb2tQcm9taXNlKCkudGhlbihvbmZ1bGZpbGxlZCwgb25yZWplY3RlZCk7XG4gICAgICB9LFxuXG4gICAgICAvLyBTdXBwb3J0IGBmb3IgYXdhaXQgKGNvbnN0IHBheWxvYWQgb2YgaG9vaykgeyDigKYgfWAgc3ludGF4XG4gICAgICBhc3luYyAqW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICAgICAgd2hpbGUgKCFpc0Rpc3Bvc2VkKSB7XG4gICAgICAgICAgeWllbGQgYXdhaXQgdGhpcztcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgZGlzcG9zZTogZGlzcG9zZUhvb2ssXG5cbiAgICAgIFtTeW1ib2wuZGlzcG9zZV06IGRpc3Bvc2VIb29rLFxuICAgIH07XG5cbiAgICAvLyBBbHNvIHJlZ2lzdGVyIHdpdGggdGhlIFZNJ3MgU3ltYm9sLmRpc3Bvc2Ugc28gYHVzaW5nYCB3b3JrcyBpbnNpZGVcbiAgICAvLyB0aGUgd29ya2Zsb3cgc2FuZGJveCAodGhlIFZNIG1heSBoYXZlIGEgcG9seWZpbGxlZCBTeW1ib2wuZGlzcG9zZVxuICAgIC8vIHRoYXQgZGlmZmVycyBmcm9tIHRoZSBob3N0J3MpLlxuICAgIGNvbnN0IHZtRGlzcG9zZSA9IGN0eC5nbG9iYWxUaGlzLlN5bWJvbC5kaXNwb3NlO1xuICAgIGlmICh2bURpc3Bvc2UgJiYgdm1EaXNwb3NlICE9PSBTeW1ib2wuZGlzcG9zZSkge1xuICAgICAgKGhvb2sgYXMgYW55KVt2bURpc3Bvc2VdID0gZGlzcG9zZUhvb2s7XG4gICAgfVxuXG4gICAgcmV0dXJuIGhvb2s7XG4gIH07XG59XG4iXX0=
@@ -5,7 +5,7 @@ export { sleep } from '../sleep.js';
5
5
  export { createHook, createWebhook } from './create-hook.js';
6
6
  export { defineHook } from './define-hook.js';
7
7
  export { getWorkflowMetadata } from './get-workflow-metadata.js';
8
- export { experimental_setAttributes, type SetAttributesOptions, setAttributes, } from './set-attributes.js';
8
+ export { type SetAttributesOptions, setAttributes, } from './set-attributes.js';
9
9
  export { getWritable } from './writable-stream.js';
10
10
  export declare function getStepMetadata(): StepMetadata;
11
11
  export declare function resumeHook(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workflow/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEjE,OAAO,EACL,UAAU,EACV,cAAc,EACd,KAAK,qBAAqB,GAC3B,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EACL,0BAA0B,EAC1B,KAAK,oBAAoB,EACzB,aAAa,GACd,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAInD,wBAAgB,eAAe,IAAI,YAAY,CAM9C;AACD,wBAAgB,UAAU,SAMzB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workflow/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEjE,OAAO,EACL,UAAU,EACV,cAAc,EACd,KAAK,qBAAqB,GAC3B,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EACL,KAAK,oBAAoB,EACzB,aAAa,GACd,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAInD,wBAAgB,eAAe,IAAI,YAAY,CAM9C;AACD,wBAAgB,UAAU,SAMzB"}
@@ -4,7 +4,7 @@ export { sleep } from '../sleep.js';
4
4
  export { createHook, createWebhook } from './create-hook.js';
5
5
  export { defineHook } from './define-hook.js';
6
6
  export { getWorkflowMetadata } from './get-workflow-metadata.js';
7
- export { experimental_setAttributes, setAttributes, } from './set-attributes.js';
7
+ export { setAttributes, } from './set-attributes.js';
8
8
  export { getWritable } from './writable-stream.js';
9
9
  // workflows can't use these functions, but we still need to provide
10
10
  // the export so bundling doesn't fail when step and workflow are in same file
@@ -14,4 +14,4 @@ export function getStepMetadata() {
14
14
  export function resumeHook() {
15
15
  throwUnavailableInWorkflowContext('resumeHook()', 'https://workflow-sdk.dev/docs/api-reference/workflow-api/resume-hook', resumeHook);
16
16
  }
17
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd29ya2Zsb3cvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixpQ0FBaUMsR0FDbEMsTUFBTSxzQkFBc0IsQ0FBQztBQUc5QixPQUFPLEVBQ0wsVUFBVSxFQUNWLGNBQWMsR0FFZixNQUFNLGtCQUFrQixDQUFDO0FBRTFCLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDcEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDOUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDakUsT0FBTyxFQUNMLDBCQUEwQixFQUUxQixhQUFhLEdBQ2QsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFbkQsb0VBQW9FO0FBQ3BFLDhFQUE4RTtBQUM5RSxNQUFNLFVBQVUsZUFBZTtJQUM3QixxQkFBcUIsQ0FDbkIsbUJBQW1CLEVBQ25CLHdFQUF3RSxFQUN4RSxlQUFlLENBQ2hCLENBQUM7QUFDSixDQUFDO0FBQ0QsTUFBTSxVQUFVLFVBQVU7SUFDeEIsaUNBQWlDLENBQy9CLGNBQWMsRUFDZCxzRUFBc0UsRUFDdEUsVUFBVSxDQUNYLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdGhyb3dOb3RJblN0ZXBDb250ZXh0LFxuICB0aHJvd1VuYXZhaWxhYmxlSW5Xb3JrZmxvd0NvbnRleHQsXG59IGZyb20gJy4uL2NvbnRleHQtZXJyb3JzLmpzJztcbmltcG9ydCB0eXBlIHsgU3RlcE1ldGFkYXRhIH0gZnJvbSAnLi4vc3RlcC9nZXQtc3RlcC1tZXRhZGF0YS5qcyc7XG5cbmV4cG9ydCB7XG4gIEZhdGFsRXJyb3IsXG4gIFJldHJ5YWJsZUVycm9yLFxuICB0eXBlIFJldHJ5YWJsZUVycm9yT3B0aW9ucyxcbn0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5leHBvcnQgdHlwZSB7IEhvb2ssIEhvb2tPcHRpb25zIH0gZnJvbSAnLi4vY3JlYXRlLWhvb2suanMnO1xuZXhwb3J0IHsgc2xlZXAgfSBmcm9tICcuLi9zbGVlcC5qcyc7XG5leHBvcnQgeyBjcmVhdGVIb29rLCBjcmVhdGVXZWJob29rIH0gZnJvbSAnLi9jcmVhdGUtaG9vay5qcyc7XG5leHBvcnQgeyBkZWZpbmVIb29rIH0gZnJvbSAnLi9kZWZpbmUtaG9vay5qcyc7XG5leHBvcnQgeyBnZXRXb3JrZmxvd01ldGFkYXRhIH0gZnJvbSAnLi9nZXQtd29ya2Zsb3ctbWV0YWRhdGEuanMnO1xuZXhwb3J0IHtcbiAgZXhwZXJpbWVudGFsX3NldEF0dHJpYnV0ZXMsXG4gIHR5cGUgU2V0QXR0cmlidXRlc09wdGlvbnMsXG4gIHNldEF0dHJpYnV0ZXMsXG59IGZyb20gJy4vc2V0LWF0dHJpYnV0ZXMuanMnO1xuZXhwb3J0IHsgZ2V0V3JpdGFibGUgfSBmcm9tICcuL3dyaXRhYmxlLXN0cmVhbS5qcyc7XG5cbi8vIHdvcmtmbG93cyBjYW4ndCB1c2UgdGhlc2UgZnVuY3Rpb25zLCBidXQgd2Ugc3RpbGwgbmVlZCB0byBwcm92aWRlXG4vLyB0aGUgZXhwb3J0IHNvIGJ1bmRsaW5nIGRvZXNuJ3QgZmFpbCB3aGVuIHN0ZXAgYW5kIHdvcmtmbG93IGFyZSBpbiBzYW1lIGZpbGVcbmV4cG9ydCBmdW5jdGlvbiBnZXRTdGVwTWV0YWRhdGEoKTogU3RlcE1ldGFkYXRhIHtcbiAgdGhyb3dOb3RJblN0ZXBDb250ZXh0KFxuICAgICdnZXRTdGVwTWV0YWRhdGEoKScsXG4gICAgJ2h0dHBzOi8vd29ya2Zsb3ctc2RrLmRldi9kb2NzL2FwaS1yZWZlcmVuY2Uvd29ya2Zsb3cvZ2V0LXN0ZXAtbWV0YWRhdGEnLFxuICAgIGdldFN0ZXBNZXRhZGF0YVxuICApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlc3VtZUhvb2soKSB7XG4gIHRocm93VW5hdmFpbGFibGVJbldvcmtmbG93Q29udGV4dChcbiAgICAncmVzdW1lSG9vaygpJyxcbiAgICAnaHR0cHM6Ly93b3JrZmxvdy1zZGsuZGV2L2RvY3MvYXBpLXJlZmVyZW5jZS93b3JrZmxvdy1hcGkvcmVzdW1lLWhvb2snLFxuICAgIHJlc3VtZUhvb2tcbiAgKTtcbn1cbiJdfQ==
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd29ya2Zsb3cvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixpQ0FBaUMsR0FDbEMsTUFBTSxzQkFBc0IsQ0FBQztBQUc5QixPQUFPLEVBQ0wsVUFBVSxFQUNWLGNBQWMsR0FFZixNQUFNLGtCQUFrQixDQUFDO0FBRTFCLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDcEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDOUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDakUsT0FBTyxFQUVMLGFBQWEsR0FDZCxNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVuRCxvRUFBb0U7QUFDcEUsOEVBQThFO0FBQzlFLE1BQU0sVUFBVSxlQUFlO0lBQzdCLHFCQUFxQixDQUNuQixtQkFBbUIsRUFDbkIsd0VBQXdFLEVBQ3hFLGVBQWUsQ0FDaEIsQ0FBQztBQUNKLENBQUM7QUFDRCxNQUFNLFVBQVUsVUFBVTtJQUN4QixpQ0FBaUMsQ0FDL0IsY0FBYyxFQUNkLHNFQUFzRSxFQUN0RSxVQUFVLENBQ1gsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICB0aHJvd05vdEluU3RlcENvbnRleHQsXG4gIHRocm93VW5hdmFpbGFibGVJbldvcmtmbG93Q29udGV4dCxcbn0gZnJvbSAnLi4vY29udGV4dC1lcnJvcnMuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGVwTWV0YWRhdGEgfSBmcm9tICcuLi9zdGVwL2dldC1zdGVwLW1ldGFkYXRhLmpzJztcblxuZXhwb3J0IHtcbiAgRmF0YWxFcnJvcixcbiAgUmV0cnlhYmxlRXJyb3IsXG4gIHR5cGUgUmV0cnlhYmxlRXJyb3JPcHRpb25zLFxufSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmV4cG9ydCB0eXBlIHsgSG9vaywgSG9va09wdGlvbnMgfSBmcm9tICcuLi9jcmVhdGUtaG9vay5qcyc7XG5leHBvcnQgeyBzbGVlcCB9IGZyb20gJy4uL3NsZWVwLmpzJztcbmV4cG9ydCB7IGNyZWF0ZUhvb2ssIGNyZWF0ZVdlYmhvb2sgfSBmcm9tICcuL2NyZWF0ZS1ob29rLmpzJztcbmV4cG9ydCB7IGRlZmluZUhvb2sgfSBmcm9tICcuL2RlZmluZS1ob29rLmpzJztcbmV4cG9ydCB7IGdldFdvcmtmbG93TWV0YWRhdGEgfSBmcm9tICcuL2dldC13b3JrZmxvdy1tZXRhZGF0YS5qcyc7XG5leHBvcnQge1xuICB0eXBlIFNldEF0dHJpYnV0ZXNPcHRpb25zLFxuICBzZXRBdHRyaWJ1dGVzLFxufSBmcm9tICcuL3NldC1hdHRyaWJ1dGVzLmpzJztcbmV4cG9ydCB7IGdldFdyaXRhYmxlIH0gZnJvbSAnLi93cml0YWJsZS1zdHJlYW0uanMnO1xuXG4vLyB3b3JrZmxvd3MgY2FuJ3QgdXNlIHRoZXNlIGZ1bmN0aW9ucywgYnV0IHdlIHN0aWxsIG5lZWQgdG8gcHJvdmlkZVxuLy8gdGhlIGV4cG9ydCBzbyBidW5kbGluZyBkb2Vzbid0IGZhaWwgd2hlbiBzdGVwIGFuZCB3b3JrZmxvdyBhcmUgaW4gc2FtZSBmaWxlXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RlcE1ldGFkYXRhKCk6IFN0ZXBNZXRhZGF0YSB7XG4gIHRocm93Tm90SW5TdGVwQ29udGV4dChcbiAgICAnZ2V0U3RlcE1ldGFkYXRhKCknLFxuICAgICdodHRwczovL3dvcmtmbG93LXNkay5kZXYvZG9jcy9hcGktcmVmZXJlbmNlL3dvcmtmbG93L2dldC1zdGVwLW1ldGFkYXRhJyxcbiAgICBnZXRTdGVwTWV0YWRhdGFcbiAgKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZXN1bWVIb29rKCkge1xuICB0aHJvd1VuYXZhaWxhYmxlSW5Xb3JrZmxvd0NvbnRleHQoXG4gICAgJ3Jlc3VtZUhvb2soKScsXG4gICAgJ2h0dHBzOi8vd29ya2Zsb3ctc2RrLmRldi9kb2NzL2FwaS1yZWZlcmVuY2Uvd29ya2Zsb3ctYXBpL3Jlc3VtZS1ob29rJyxcbiAgICByZXN1bWVIb29rXG4gICk7XG59XG4iXX0=
@@ -20,10 +20,6 @@ export interface SetAttributesOptions {
20
20
  */
21
21
  allowReservedAttributes?: boolean;
22
22
  }
23
- /**
24
- * @deprecated Use {@link SetAttributesOptions} instead.
25
- */
26
- export type ExperimentalSetAttributesOptions = SetAttributesOptions;
27
23
  /**
28
24
  * Attach plaintext string key/value metadata to the current workflow run.
29
25
  *
@@ -69,9 +65,4 @@ export type ExperimentalSetAttributesOptions = SetAttributesOptions;
69
65
  * ```
70
66
  */
71
67
  export declare function setAttributes(attrs: Record<string, string | undefined>, options?: SetAttributesOptions): Promise<void>;
72
- /**
73
- * @deprecated The feature is no longer experimental — use
74
- * {@link setAttributes} instead.
75
- */
76
- export declare const experimental_setAttributes: typeof setAttributes;
77
68
  //# sourceMappingURL=set-attributes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"set-attributes.d.ts","sourceRoot":"","sources":["../../src/workflow/set-attributes.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;;;;;;;;;;;;OAeG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,MAAM,gCAAgC,GAAG,oBAAoB,CAAC;AAEpE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACzC,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,IAAI,CAAC,CAsBf;AAED;;;GAGG;AACH,eAAO,MAAM,0BAA0B,sBAAgB,CAAC"}
1
+ {"version":3,"file":"set-attributes.d.ts","sourceRoot":"","sources":["../../src/workflow/set-attributes.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;;;;;;;;;;;;OAeG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACzC,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,IAAI,CAAC,CAsBf"}
@@ -57,9 +57,4 @@ export async function setAttributes(attrs, options = {}) {
57
57
  }
58
58
  await dispatchSetAttributes(changes, allowReservedAttributes ? { allowReservedAttributes: true } : {});
59
59
  }
60
- /**
61
- * @deprecated The feature is no longer experimental — use
62
- * {@link setAttributes} instead.
63
- */
64
- export const experimental_setAttributes = setAttributes;
65
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0LWF0dHJpYnV0ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd29ya2Zsb3cvc2V0LWF0dHJpYnV0ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTlDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQThCeEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyQ0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGFBQWEsQ0FDakMsS0FBeUMsRUFDekMsVUFBZ0MsRUFBRTtJQUVsQyxNQUFNLE9BQU8sR0FBRyx5QkFBeUIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDMUQsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPO0lBQ2pDLE1BQU0sdUJBQXVCLEdBQUcsT0FBTyxDQUFDLHVCQUF1QixLQUFLLElBQUksQ0FBQztJQUN6RSxNQUFNLHFCQUFxQixHQUFJLFVBQXNDLENBQ25FLHVCQUF1QixDQU1aLENBQUM7SUFDZCxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUMzQixNQUFNLElBQUksVUFBVSxDQUNsQiw2REFBNkQ7WUFDM0QsaUVBQWlFLENBQ3BFLENBQUM7SUFDSixDQUFDO0lBQ0QsTUFBTSxxQkFBcUIsQ0FDekIsT0FBTyxFQUNQLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxFQUFFLHVCQUF1QixFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQ2pFLENBQUM7QUFDSixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsYUFBYSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRmF0YWxFcnJvciB9IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHR5cGUgeyBBdHRyaWJ1dGVDaGFuZ2UgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgbm9ybWFsaXplQXR0cmlidXRlQ2hhbmdlcyB9IGZyb20gJy4uL2F0dHJpYnV0ZS1jaGFuZ2VzLmpzJztcbmltcG9ydCB7IFdPUktGTE9XX1NFVF9BVFRSSUJVVEVTIH0gZnJvbSAnLi4vc3ltYm9scy5qcyc7XG5cbi8qKlxuICogT3B0aW9ucyBhY2NlcHRlZCBieSBgc2V0QXR0cmlidXRlc2AuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2V0QXR0cmlidXRlc09wdGlvbnMge1xuICAvKipcbiAgICogUGVybWl0IGF0dHJpYnV0ZSBrZXlzIHRoYXQgc3RhcnQgd2l0aCB0aGUgcmVzZXJ2ZWQgYCRgIHByZWZpeC5cbiAgICogKipEZWZhdWx0OiBgZmFsc2VgLioqXG4gICAqXG4gICAqIFRoZSBgJGAgbmFtZXNwYWNlIGlzIHJlc2VydmVkIGZvciBmcmFtZXdvcmsgYW5kIGxpYnJhcnkgY29kZSB0aGF0XG4gICAqIGlzIGJ1aWx0IG9uIHRvcCBvZiB0aGUgd29ya2Zsb3cgU0RLICh0ZWxlbWV0cnksIGFnZW50IG1ldGFkYXRhLFxuICAgKiBwbGF0Zm9ybS1lbWl0dGVkIHRhZ3MsIGV0Yy4pLiBVc2VyIGNvZGUgTVVTVCBOT1Qgd3JpdGUga2V5cyBpblxuICAgKiB0aGlzIG5hbWVzcGFjZTsgdmFsaWRhdGlvbiByZWplY3RzIHRoZW0gc28gYWNjaWRlbnRhbCBjb2xsaXNpb25zXG4gICAqIHdpdGggdG9vbGluZy1vd25lZCBrZXlzIGNhbid0IHNsaXAgdGhyb3VnaC5cbiAgICpcbiAgICogT25seSBmbGlwIHRoaXMgdG8gYHRydWVgIGlmIHlvdXIgY2FsbGVyIGlzIGl0c2VsZiBhIGZyYW1ld29yayBvclxuICAgKiBsaWJyYXJ5IHRoYXQgb3ducyBhIGAkYC1wcmVmaXhlZCBzdWItbmFtZXNwYWNlIGFuZCBrbm93cyB0aGVcbiAgICogY29udmVudGlvbnMgb2YgYW55IG90aGVyIHRvb2xzIHdyaXRpbmcgaW50byBpdC4gTWlzdXNlIGNhblxuICAgKiBjb25mbGljdCB3aXRoIG9ic2VydmFiaWxpdHkgc3VyZmFjZXMsIGFnZW50IGRhc2hib2FyZHMsIG9yIGZ1dHVyZVxuICAgKiBwbGF0Zm9ybSBmZWF0dXJlcyB0aGF0IHJlbHkgb24gdGhlIHJlc2VydmVkIG5hbWVzcGFjZS5cbiAgICovXG4gIGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFNldEF0dHJpYnV0ZXNPcHRpb25zfSBpbnN0ZWFkLlxuICovXG5leHBvcnQgdHlwZSBFeHBlcmltZW50YWxTZXRBdHRyaWJ1dGVzT3B0aW9ucyA9IFNldEF0dHJpYnV0ZXNPcHRpb25zO1xuXG4vKipcbiAqIEF0dGFjaCBwbGFpbnRleHQgc3RyaW5nIGtleS92YWx1ZSBtZXRhZGF0YSB0byB0aGUgY3VycmVudCB3b3JrZmxvdyBydW4uXG4gKlxuICogQ2FsbGFibGUgb25seSBmcm9tIGEgd29ya2Zsb3cgYm9keSAoYCd1c2Ugd29ya2Zsb3cnYCkuIFRoZSBjYWxsIGlzXG4gKiBkaXNwYXRjaGVkIGFzIGEgbmF0aXZlIGBhdHRyX3NldGAgZXZlbnQgYW5kIG1hdGVyaWFsaXplZCBvbiB0aGUgcnVuLlxuICpcbiAqIFZhbGlkYXRpb24gcnVucyBpbiB0aGUgVk0gKGNoZWFwLCBkZXRlcm1pbmlzdGljKSBiZWZvcmUgZXZlbnRcbiAqIGRpc3BhdGNoIC0gdmlvbGF0aW9ucyB0aHJvdyBgRmF0YWxFcnJvcmAgd2l0aG91dCB3cml0aW5nIGFuIGV2ZW50LiBBblxuICogZW1wdHkgcmVjb3JkIGlzIGEgbm8tb3AuIGB2YWx1ZTogdW5kZWZpbmVkYCByZW1vdmVzIHRoZSBrZXkgZnJvbSB0aGVcbiAqIHJ1bidzIGF0dHJpYnV0ZSBtYXAuXG4gKlxuICogKipSZXNlcnZlZCBuYW1lc3BhY2UuKiogS2V5cyBzdGFydGluZyB3aXRoIGAkYCBhcmUgcmVzZXJ2ZWQgZm9yXG4gKiBmcmFtZXdvcmsvbGlicmFyeSBjb2RlICh0ZWxlbWV0cnksIGFnZW50IG1ldGFkYXRhLCBldGMuKS4gVXNlciBjb2RlXG4gKiB0cnlpbmcgdG8gd3JpdGUgYSBgJGAtcHJlZml4ZWQga2V5IHRocm93cyBgRmF0YWxFcnJvcmAuIElmIHlvdSBhcmUgYVxuICogZnJhbWV3b3JrIGF1dGhvciBhbmQgbmVlZCB0byBzZXQgYSByZXNlcnZlZCBrZXksIHBhc3NcbiAqIGB7IGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzOiB0cnVlIH1gIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQg4oCUIHNlZVxuICogYFNldEF0dHJpYnV0ZXNPcHRpb25zYCBmb3IgdGhlIHRyYWRlLW9mZnMuXG4gKlxuICogKipXQVJOSU5HKio6IENhbGxpbmcgZS5nLlxuICogYFByb21pc2UuYWxsKFtzZXRBdHRyaWJ1dGVzKHsgYTogJzEnIH0pLCBzZXRBdHRyaWJ1dGVzKHsgYTogJzInIH0pXSlgXG4gKiBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBvcmRlcmVkIGNvbnNpc3RlbnRseSwgYnV0IHRoZSBlcXVpdmFsZW50XG4gKiBzZXF1ZW50aWFsIGAudGhlbigpYCBjaGFpbiBpcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IHNldEF0dHJpYnV0ZXMgfSBmcm9tICd3b3JrZmxvdyc7XG4gKlxuICogZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG15V29ya2Zsb3coKSB7XG4gKiAgICd1c2Ugd29ya2Zsb3cnO1xuICogICBhd2FpdCBzZXRBdHRyaWJ1dGVzKHsgcGhhc2U6ICdpbml0JyB9KTtcbiAqICAgLy8gLi4uIHdvcmsgLi4uXG4gKiAgIGF3YWl0IHNldEF0dHJpYnV0ZXMoeyBwaGFzZTogJ2RvbmUnLCBvcmRlcklkOiAnb3JkXzEyMycgfSk7XG4gKiAgIGF3YWl0IHNldEF0dHJpYnV0ZXMoeyBvcmRlcklkOiB1bmRlZmluZWQgfSk7IC8vIHJlbW92ZVxuICogfVxuICogYGBgXG4gKlxuICogQGV4YW1wbGUgRnJhbWV3b3JrIC8gbGlicmFyeSBjb2RlIHdyaXRpbmcgaW50byB0aGUgcmVzZXJ2ZWQgbmFtZXNwYWNlLlxuICogYGBgdHNcbiAqIGF3YWl0IHNldEF0dHJpYnV0ZXMoXG4gKiAgIHsgJyRhZ2VudC5raW5kJzogJ2R1cmFibGUtYWdlbnQnIH0sXG4gKiAgIHsgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM6IHRydWUgfVxuICogKTtcbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0QXR0cmlidXRlcyhcbiAgYXR0cnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sXG4gIG9wdGlvbnM6IFNldEF0dHJpYnV0ZXNPcHRpb25zID0ge31cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjaGFuZ2VzID0gbm9ybWFsaXplQXR0cmlidXRlQ2hhbmdlcyhhdHRycywgb3B0aW9ucyk7XG4gIGlmIChjaGFuZ2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICBjb25zdCBhbGxvd1Jlc2VydmVkQXR0cmlidXRlcyA9IG9wdGlvbnMuYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXMgPT09IHRydWU7XG4gIGNvbnN0IGRpc3BhdGNoU2V0QXR0cmlidXRlcyA9IChnbG9iYWxUaGlzIGFzIFJlY29yZDxzeW1ib2wsIHVua25vd24+KVtcbiAgICBXT1JLRkxPV19TRVRfQVRUUklCVVRFU1xuICBdIGFzXG4gICAgfCAoKFxuICAgICAgICBjaGFuZ2VzOiBBdHRyaWJ1dGVDaGFuZ2VbXSxcbiAgICAgICAgb3B0aW9ucz86IHsgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM/OiBib29sZWFuIH1cbiAgICAgICkgPT4gUHJvbWlzZTx2b2lkPilcbiAgICB8IHVuZGVmaW5lZDtcbiAgaWYgKCFkaXNwYXRjaFNldEF0dHJpYnV0ZXMpIHtcbiAgICB0aHJvdyBuZXcgRmF0YWxFcnJvcihcbiAgICAgICdzZXRBdHRyaWJ1dGVzKCkgY2FsbGVkIG91dHNpZGUgYSB3b3JrZmxvdyBydW50aW1lIGNvbnRleHQuICcgK1xuICAgICAgICAnSXQgbXVzdCBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gYSB3b3JrZmxvdyBib2R5IChgdXNlIHdvcmtmbG93YCkuJ1xuICAgICk7XG4gIH1cbiAgYXdhaXQgZGlzcGF0Y2hTZXRBdHRyaWJ1dGVzKFxuICAgIGNoYW5nZXMsXG4gICAgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXMgPyB7IGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzOiB0cnVlIH0gOiB7fVxuICApO1xufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkIFRoZSBmZWF0dXJlIGlzIG5vIGxvbmdlciBleHBlcmltZW50YWwg4oCUIHVzZVxuICoge0BsaW5rIHNldEF0dHJpYnV0ZXN9IGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjb25zdCBleHBlcmltZW50YWxfc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG4iXX0=
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0LWF0dHJpYnV0ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd29ya2Zsb3cvc2V0LWF0dHJpYnV0ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTlDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQXlCeEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyQ0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGFBQWEsQ0FDakMsS0FBeUMsRUFDekMsVUFBZ0MsRUFBRTtJQUVsQyxNQUFNLE9BQU8sR0FBRyx5QkFBeUIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDMUQsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPO0lBQ2pDLE1BQU0sdUJBQXVCLEdBQUcsT0FBTyxDQUFDLHVCQUF1QixLQUFLLElBQUksQ0FBQztJQUN6RSxNQUFNLHFCQUFxQixHQUFJLFVBQXNDLENBQ25FLHVCQUF1QixDQU1aLENBQUM7SUFDZCxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUMzQixNQUFNLElBQUksVUFBVSxDQUNsQiw2REFBNkQ7WUFDM0QsaUVBQWlFLENBQ3BFLENBQUM7SUFDSixDQUFDO0lBQ0QsTUFBTSxxQkFBcUIsQ0FDekIsT0FBTyxFQUNQLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxFQUFFLHVCQUF1QixFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQ2pFLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRmF0YWxFcnJvciB9IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHR5cGUgeyBBdHRyaWJ1dGVDaGFuZ2UgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgbm9ybWFsaXplQXR0cmlidXRlQ2hhbmdlcyB9IGZyb20gJy4uL2F0dHJpYnV0ZS1jaGFuZ2VzLmpzJztcbmltcG9ydCB7IFdPUktGTE9XX1NFVF9BVFRSSUJVVEVTIH0gZnJvbSAnLi4vc3ltYm9scy5qcyc7XG5cbi8qKlxuICogT3B0aW9ucyBhY2NlcHRlZCBieSBgc2V0QXR0cmlidXRlc2AuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2V0QXR0cmlidXRlc09wdGlvbnMge1xuICAvKipcbiAgICogUGVybWl0IGF0dHJpYnV0ZSBrZXlzIHRoYXQgc3RhcnQgd2l0aCB0aGUgcmVzZXJ2ZWQgYCRgIHByZWZpeC5cbiAgICogKipEZWZhdWx0OiBgZmFsc2VgLioqXG4gICAqXG4gICAqIFRoZSBgJGAgbmFtZXNwYWNlIGlzIHJlc2VydmVkIGZvciBmcmFtZXdvcmsgYW5kIGxpYnJhcnkgY29kZSB0aGF0XG4gICAqIGlzIGJ1aWx0IG9uIHRvcCBvZiB0aGUgd29ya2Zsb3cgU0RLICh0ZWxlbWV0cnksIGFnZW50IG1ldGFkYXRhLFxuICAgKiBwbGF0Zm9ybS1lbWl0dGVkIHRhZ3MsIGV0Yy4pLiBVc2VyIGNvZGUgTVVTVCBOT1Qgd3JpdGUga2V5cyBpblxuICAgKiB0aGlzIG5hbWVzcGFjZTsgdmFsaWRhdGlvbiByZWplY3RzIHRoZW0gc28gYWNjaWRlbnRhbCBjb2xsaXNpb25zXG4gICAqIHdpdGggdG9vbGluZy1vd25lZCBrZXlzIGNhbid0IHNsaXAgdGhyb3VnaC5cbiAgICpcbiAgICogT25seSBmbGlwIHRoaXMgdG8gYHRydWVgIGlmIHlvdXIgY2FsbGVyIGlzIGl0c2VsZiBhIGZyYW1ld29yayBvclxuICAgKiBsaWJyYXJ5IHRoYXQgb3ducyBhIGAkYC1wcmVmaXhlZCBzdWItbmFtZXNwYWNlIGFuZCBrbm93cyB0aGVcbiAgICogY29udmVudGlvbnMgb2YgYW55IG90aGVyIHRvb2xzIHdyaXRpbmcgaW50byBpdC4gTWlzdXNlIGNhblxuICAgKiBjb25mbGljdCB3aXRoIG9ic2VydmFiaWxpdHkgc3VyZmFjZXMsIGFnZW50IGRhc2hib2FyZHMsIG9yIGZ1dHVyZVxuICAgKiBwbGF0Zm9ybSBmZWF0dXJlcyB0aGF0IHJlbHkgb24gdGhlIHJlc2VydmVkIG5hbWVzcGFjZS5cbiAgICovXG4gIGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBdHRhY2ggcGxhaW50ZXh0IHN0cmluZyBrZXkvdmFsdWUgbWV0YWRhdGEgdG8gdGhlIGN1cnJlbnQgd29ya2Zsb3cgcnVuLlxuICpcbiAqIENhbGxhYmxlIG9ubHkgZnJvbSBhIHdvcmtmbG93IGJvZHkgKGAndXNlIHdvcmtmbG93J2ApLiBUaGUgY2FsbCBpc1xuICogZGlzcGF0Y2hlZCBhcyBhIG5hdGl2ZSBgYXR0cl9zZXRgIGV2ZW50IGFuZCBtYXRlcmlhbGl6ZWQgb24gdGhlIHJ1bi5cbiAqXG4gKiBWYWxpZGF0aW9uIHJ1bnMgaW4gdGhlIFZNIChjaGVhcCwgZGV0ZXJtaW5pc3RpYykgYmVmb3JlIGV2ZW50XG4gKiBkaXNwYXRjaCAtIHZpb2xhdGlvbnMgdGhyb3cgYEZhdGFsRXJyb3JgIHdpdGhvdXQgd3JpdGluZyBhbiBldmVudC4gQW5cbiAqIGVtcHR5IHJlY29yZCBpcyBhIG5vLW9wLiBgdmFsdWU6IHVuZGVmaW5lZGAgcmVtb3ZlcyB0aGUga2V5IGZyb20gdGhlXG4gKiBydW4ncyBhdHRyaWJ1dGUgbWFwLlxuICpcbiAqICoqUmVzZXJ2ZWQgbmFtZXNwYWNlLioqIEtleXMgc3RhcnRpbmcgd2l0aCBgJGAgYXJlIHJlc2VydmVkIGZvclxuICogZnJhbWV3b3JrL2xpYnJhcnkgY29kZSAodGVsZW1ldHJ5LCBhZ2VudCBtZXRhZGF0YSwgZXRjLikuIFVzZXIgY29kZVxuICogdHJ5aW5nIHRvIHdyaXRlIGEgYCRgLXByZWZpeGVkIGtleSB0aHJvd3MgYEZhdGFsRXJyb3JgLiBJZiB5b3UgYXJlIGFcbiAqIGZyYW1ld29yayBhdXRob3IgYW5kIG5lZWQgdG8gc2V0IGEgcmVzZXJ2ZWQga2V5LCBwYXNzXG4gKiBgeyBhbGxvd1Jlc2VydmVkQXR0cmlidXRlczogdHJ1ZSB9YCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IOKAlCBzZWVcbiAqIGBTZXRBdHRyaWJ1dGVzT3B0aW9uc2AgZm9yIHRoZSB0cmFkZS1vZmZzLlxuICpcbiAqICoqV0FSTklORyoqOiBDYWxsaW5nIGUuZy5cbiAqIGBQcm9taXNlLmFsbChbc2V0QXR0cmlidXRlcyh7IGE6ICcxJyB9KSwgc2V0QXR0cmlidXRlcyh7IGE6ICcyJyB9KV0pYFxuICogaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgb3JkZXJlZCBjb25zaXN0ZW50bHksIGJ1dCB0aGUgZXF1aXZhbGVudFxuICogc2VxdWVudGlhbCBgLnRoZW4oKWAgY2hhaW4gaXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBzZXRBdHRyaWJ1dGVzIH0gZnJvbSAnd29ya2Zsb3cnO1xuICpcbiAqIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBteVdvcmtmbG93KCkge1xuICogICAndXNlIHdvcmtmbG93JztcbiAqICAgYXdhaXQgc2V0QXR0cmlidXRlcyh7IHBoYXNlOiAnaW5pdCcgfSk7XG4gKiAgIC8vIC4uLiB3b3JrIC4uLlxuICogICBhd2FpdCBzZXRBdHRyaWJ1dGVzKHsgcGhhc2U6ICdkb25lJywgb3JkZXJJZDogJ29yZF8xMjMnIH0pO1xuICogICBhd2FpdCBzZXRBdHRyaWJ1dGVzKHsgb3JkZXJJZDogdW5kZWZpbmVkIH0pOyAvLyByZW1vdmVcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIEZyYW1ld29yayAvIGxpYnJhcnkgY29kZSB3cml0aW5nIGludG8gdGhlIHJlc2VydmVkIG5hbWVzcGFjZS5cbiAqIGBgYHRzXG4gKiBhd2FpdCBzZXRBdHRyaWJ1dGVzKFxuICogICB7ICckYWdlbnQua2luZCc6ICdkdXJhYmxlLWFnZW50JyB9LFxuICogICB7IGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzOiB0cnVlIH1cbiAqICk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldEF0dHJpYnV0ZXMoXG4gIGF0dHJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+LFxuICBvcHRpb25zOiBTZXRBdHRyaWJ1dGVzT3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY2hhbmdlcyA9IG5vcm1hbGl6ZUF0dHJpYnV0ZUNoYW5nZXMoYXR0cnMsIG9wdGlvbnMpO1xuICBpZiAoY2hhbmdlcy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgY29uc3QgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXMgPSBvcHRpb25zLmFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzID09PSB0cnVlO1xuICBjb25zdCBkaXNwYXRjaFNldEF0dHJpYnV0ZXMgPSAoZ2xvYmFsVGhpcyBhcyBSZWNvcmQ8c3ltYm9sLCB1bmtub3duPilbXG4gICAgV09SS0ZMT1dfU0VUX0FUVFJJQlVURVNcbiAgXSBhc1xuICAgIHwgKChcbiAgICAgICAgY2hhbmdlczogQXR0cmlidXRlQ2hhbmdlW10sXG4gICAgICAgIG9wdGlvbnM/OiB7IGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzPzogYm9vbGVhbiB9XG4gICAgICApID0+IFByb21pc2U8dm9pZD4pXG4gICAgfCB1bmRlZmluZWQ7XG4gIGlmICghZGlzcGF0Y2hTZXRBdHRyaWJ1dGVzKSB7XG4gICAgdGhyb3cgbmV3IEZhdGFsRXJyb3IoXG4gICAgICAnc2V0QXR0cmlidXRlcygpIGNhbGxlZCBvdXRzaWRlIGEgd29ya2Zsb3cgcnVudGltZSBjb250ZXh0LiAnICtcbiAgICAgICAgJ0l0IG11c3QgYmUgY2FsbGVkIGZyb20gd2l0aGluIGEgd29ya2Zsb3cgYm9keSAoYHVzZSB3b3JrZmxvd2ApLidcbiAgICApO1xuICB9XG4gIGF3YWl0IGRpc3BhdGNoU2V0QXR0cmlidXRlcyhcbiAgICBjaGFuZ2VzLFxuICAgIGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzID8geyBhbGxvd1Jlc2VydmVkQXR0cmlidXRlczogdHJ1ZSB9IDoge31cbiAgKTtcbn1cbiJdfQ==
@@ -1 +1 @@
1
- {"version":3,"file":"sleep.d.ts","sourceRoot":"","sources":["../../src/workflow/sleep.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAGtC,OAAO,EAIL,KAAK,2BAA2B,EACjC,MAAM,eAAe,CAAC;AAEvB,wBAAgB,WAAW,CAAC,GAAG,EAAE,2BAA2B,IAExD,OAAO,WAAW,GAAG,IAAI,GAAG,MAAM,KACjC,OAAO,CAAC,IAAI,CAAC,CAoHjB"}
1
+ {"version":3,"file":"sleep.d.ts","sourceRoot":"","sources":["../../src/workflow/sleep.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAGtC,OAAO,EAIL,KAAK,2BAA2B,EACjC,MAAM,eAAe,CAAC;AAEvB,wBAAgB,WAAW,CAAC,GAAG,EAAE,2BAA2B,IAExD,OAAO,WAAW,GAAG,IAAI,GAAG,MAAM,KACjC,OAAO,CAAC,IAAI,CAAC,CAoIjB"}