@workflow/core 5.0.0-beta.36 → 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 (112) 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/encryption.d.ts +15 -2
  5. package/dist/encryption.d.ts.map +1 -1
  6. package/dist/encryption.js +28 -7
  7. package/dist/flushable-stream.d.ts +26 -0
  8. package/dist/flushable-stream.d.ts.map +1 -1
  9. package/dist/flushable-stream.js +63 -187
  10. package/dist/index.d.ts +1 -1
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +2 -2
  13. package/dist/log-format.js +3 -3
  14. package/dist/private.d.ts +76 -33
  15. package/dist/private.d.ts.map +1 -1
  16. package/dist/private.js +149 -22
  17. package/dist/replay-payload-cache.d.ts +3 -2
  18. package/dist/replay-payload-cache.d.ts.map +1 -1
  19. package/dist/replay-payload-cache.js +8 -2
  20. package/dist/runtime/count-step-started-events.d.ts +52 -0
  21. package/dist/runtime/count-step-started-events.d.ts.map +1 -0
  22. package/dist/runtime/count-step-started-events.js +72 -0
  23. package/dist/runtime/helpers.d.ts +41 -12
  24. package/dist/runtime/helpers.d.ts.map +1 -1
  25. package/dist/runtime/helpers.js +75 -22
  26. package/dist/runtime/resume-hook.d.ts +2 -2
  27. package/dist/runtime/resume-hook.d.ts.map +1 -1
  28. package/dist/runtime/resume-hook.js +174 -55
  29. package/dist/runtime/run.d.ts.map +1 -1
  30. package/dist/runtime/run.js +3 -3
  31. package/dist/runtime/runs.d.ts.map +1 -1
  32. package/dist/runtime/runs.js +5 -3
  33. package/dist/runtime/start.d.ts.map +1 -1
  34. package/dist/runtime/start.js +65 -18
  35. package/dist/runtime/step-executor.d.ts +9 -8
  36. package/dist/runtime/step-executor.d.ts.map +1 -1
  37. package/dist/runtime/step-executor.js +17 -17
  38. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  39. package/dist/runtime/suspension-handler.js +2 -3
  40. package/dist/runtime/world.d.ts +2 -7
  41. package/dist/runtime/world.d.ts.map +1 -1
  42. package/dist/runtime/world.js +3 -10
  43. package/dist/runtime.d.ts +1 -1
  44. package/dist/runtime.d.ts.map +1 -1
  45. package/dist/runtime.js +74 -122
  46. package/dist/sealed-box.d.ts +167 -0
  47. package/dist/sealed-box.d.ts.map +1 -0
  48. package/dist/sealed-box.js +571 -0
  49. package/dist/serialization/client.d.ts +3 -3
  50. package/dist/serialization/client.d.ts.map +1 -1
  51. package/dist/serialization/client.js +1 -1
  52. package/dist/serialization/codec.d.ts +6 -4
  53. package/dist/serialization/codec.d.ts.map +1 -1
  54. package/dist/serialization/codec.js +1 -1
  55. package/dist/serialization/encryption.d.ts +118 -17
  56. package/dist/serialization/encryption.d.ts.map +1 -1
  57. package/dist/serialization/encryption.js +131 -15
  58. package/dist/serialization/step.d.ts +4 -4
  59. package/dist/serialization/step.d.ts.map +1 -1
  60. package/dist/serialization/step.js +2 -2
  61. package/dist/serialization/types.d.ts +20 -0
  62. package/dist/serialization/types.d.ts.map +1 -1
  63. package/dist/serialization/types.js +11 -1
  64. package/dist/serialization-format.d.ts +44 -4
  65. package/dist/serialization-format.d.ts.map +1 -1
  66. package/dist/serialization-format.js +66 -9
  67. package/dist/serialization.d.ts +21 -21
  68. package/dist/serialization.d.ts.map +1 -1
  69. package/dist/serialization.js +496 -174
  70. package/dist/set-attributes.d.ts +2 -7
  71. package/dist/set-attributes.d.ts.map +1 -1
  72. package/dist/set-attributes.js +1 -6
  73. package/dist/step/context-storage.d.ts +2 -2
  74. package/dist/step/context-storage.d.ts.map +1 -1
  75. package/dist/step/context-storage.js +2 -2
  76. package/dist/step/writable-stream.d.ts.map +1 -1
  77. package/dist/step/writable-stream.js +14 -3
  78. package/dist/step.d.ts.map +1 -1
  79. package/dist/step.js +79 -8
  80. package/dist/symbols.d.ts +23 -10
  81. package/dist/symbols.d.ts.map +1 -1
  82. package/dist/symbols.js +24 -11
  83. package/dist/telemetry/semantic-conventions.d.ts +4 -4
  84. package/dist/telemetry/semantic-conventions.js +2 -2
  85. package/dist/version.d.ts +1 -1
  86. package/dist/version.js +2 -2
  87. package/dist/vm/index.d.ts.map +1 -1
  88. package/dist/vm/index.js +76 -9
  89. package/dist/workflow/abort-controller.d.ts +1 -1
  90. package/dist/workflow/abort-controller.d.ts.map +1 -1
  91. package/dist/workflow/abort-controller.js +36 -2
  92. package/dist/workflow/hook.d.ts.map +1 -1
  93. package/dist/workflow/hook.js +64 -24
  94. package/dist/workflow/index.d.ts +1 -1
  95. package/dist/workflow/index.d.ts.map +1 -1
  96. package/dist/workflow/index.js +2 -2
  97. package/dist/workflow/set-attributes.d.ts +0 -9
  98. package/dist/workflow/set-attributes.d.ts.map +1 -1
  99. package/dist/workflow/set-attributes.js +1 -6
  100. package/dist/workflow/sleep.d.ts.map +1 -1
  101. package/dist/workflow/sleep.js +21 -9
  102. package/dist/workflow.d.ts +2 -2
  103. package/dist/workflow.d.ts.map +1 -1
  104. package/dist/workflow.js +22 -83
  105. package/docs/api-reference/set-attributes.mdx +0 -4
  106. package/docs/how-it-works/cancellation.mdx +2 -2
  107. package/docs/how-it-works/code-transform.mdx +19 -15
  108. package/docs/how-it-works/framework-integrations.mdx +95 -341
  109. package/package.json +6 -6
  110. package/dist/runtime/step-handler.d.ts +0 -2
  111. package/dist/runtime/step-handler.d.ts.map +0 -1
  112. package/dist/runtime/step-handler.js +0 -839
@@ -1,7 +1,7 @@
1
1
  import { WorkflowRuntimeError } from '@workflow/errors';
2
2
  import { withResolvers } from '@workflow/utils';
3
3
  import { envNumber } from '@workflow/world';
4
- import { STREAM_WRITE_BATCH_SYMBOL } from './symbols.js';
4
+ import { STREAM_DRAIN_SYMBOL } from './symbols.js';
5
5
  /**
6
6
  * Flow-control knob: upper bound on chunks read-but-not-yet-durably-written
7
7
  * while coalescing. Once this many chunks are outstanding the producer stops
@@ -15,7 +15,7 @@ import { STREAM_WRITE_BATCH_SYMBOL } from './symbols.js';
15
15
  * limit — batch sizing enforces that independently.
16
16
  */
17
17
  export const MAX_INFLIGHT_CHUNKS = 1000;
18
- const getMaxInflightChunks = () => envNumber('WORKFLOW_STREAM_MAX_INFLIGHT_CHUNKS', MAX_INFLIGHT_CHUNKS, {
18
+ export const getMaxInflightChunks = () => envNumber('WORKFLOW_STREAM_MAX_INFLIGHT_CHUNKS', MAX_INFLIGHT_CHUNKS, {
19
19
  integer: true,
20
20
  min: 1,
21
21
  });
@@ -26,7 +26,7 @@ const getMaxInflightChunks = () => envNumber('WORKFLOW_STREAM_MAX_INFLIGHT_CHUNK
26
26
  * the backpressure knob above. Override: `WORKFLOW_STREAM_MAX_CHUNKS_PER_BATCH`.
27
27
  */
28
28
  export const MAX_CHUNKS_PER_BATCH = 1000;
29
- const getMaxChunksPerBatch = () => envNumber('WORKFLOW_STREAM_MAX_CHUNKS_PER_BATCH', MAX_CHUNKS_PER_BATCH, {
29
+ export const getMaxChunksPerBatch = () => envNumber('WORKFLOW_STREAM_MAX_CHUNKS_PER_BATCH', MAX_CHUNKS_PER_BATCH, {
30
30
  integer: true,
31
31
  min: 1,
32
32
  });
@@ -39,7 +39,19 @@ const getMaxChunksPerBatch = () => envNumber('WORKFLOW_STREAM_MAX_CHUNKS_PER_BAT
39
39
  * out alone). Default 1 MiB. Override: `WORKFLOW_STREAM_MAX_BYTES_PER_BATCH`.
40
40
  */
41
41
  export const MAX_BYTES_PER_BATCH = 1024 * 1024;
42
- const getMaxBytesPerBatch = () => envNumber('WORKFLOW_STREAM_MAX_BYTES_PER_BATCH', MAX_BYTES_PER_BATCH, {
42
+ export const getMaxBytesPerBatch = () => envNumber('WORKFLOW_STREAM_MAX_BYTES_PER_BATCH', MAX_BYTES_PER_BATCH, {
43
+ integer: true,
44
+ min: 1,
45
+ });
46
+ /**
47
+ * Buffer bound (bytes) for the server writable's group-commit buffer — the
48
+ * byte-denominated counterpart of {@link MAX_INFLIGHT_CHUNKS}. `write()`
49
+ * blocks once this much data is buffered-but-not-durable, so a fast producer
50
+ * of large chunks can't grow client memory without bound. Default 8 MiB
51
+ * (eight request-sized groups). Override: `WORKFLOW_STREAM_MAX_BUFFERED_BYTES`.
52
+ */
53
+ export const MAX_BUFFERED_BYTES = 8 * 1024 * 1024;
54
+ export const getMaxBufferedBytes = () => envNumber('WORKFLOW_STREAM_MAX_BUFFERED_BYTES', MAX_BUFFERED_BYTES, {
43
55
  integer: true,
44
56
  min: 1,
45
57
  });
@@ -134,6 +146,23 @@ function isReadableUnlockedNotClosed(readable) {
134
146
  }
135
147
  return true;
136
148
  }
149
+ /**
150
+ * Settle the flushable completion after the sink's durability barrier.
151
+ *
152
+ * Lock release means the producer is done *writing*; with a group-commit
153
+ * sink, accepted chunks may still be client-buffered or in a request that is
154
+ * in flight. Awaiting the barrier here keeps the completion's meaning —
155
+ * "everything written so far is durable" — identical to the pre-batching
156
+ * behavior where each write() was individually durable.
157
+ */
158
+ function resolveAfterDrain(state) {
159
+ const barrier = state.drainBarrier;
160
+ if (!barrier) {
161
+ state.resolve();
162
+ return;
163
+ }
164
+ barrier().then(() => state.resolve(), (err) => state.reject(err));
165
+ }
137
166
  /**
138
167
  * Polls a WritableStream to check if the user has released their lock.
139
168
  * Resolves the done promise when lock is released and no pending ops remain.
@@ -159,9 +188,9 @@ export function pollWritableLock(writable, state) {
159
188
  // Check if lock is released (not closed) and no pending ops
160
189
  if (isWritableUnlockedNotClosed(writable) && state.pendingOps === 0) {
161
190
  state.doneResolved = true;
162
- state.resolve();
163
191
  clearInterval(intervalId);
164
192
  state.writablePollingInterval = undefined;
193
+ resolveAfterDrain(state);
165
194
  }
166
195
  }, getLockPollIntervalMs());
167
196
  state.writablePollingInterval = intervalId;
@@ -191,9 +220,9 @@ export function pollReadableLock(readable, state) {
191
220
  // Check if lock is released (not closed) and no pending ops
192
221
  if (isReadableUnlockedNotClosed(readable) && state.pendingOps === 0) {
193
222
  state.doneResolved = true;
194
- state.resolve();
195
223
  clearInterval(intervalId);
196
224
  state.readablePollingInterval = undefined;
225
+ resolveAfterDrain(state);
197
226
  }
198
227
  }, getLockPollIntervalMs());
199
228
  state.readablePollingInterval = intervalId;
@@ -210,22 +239,26 @@ export function pollReadableLock(readable, state) {
210
239
  * @returns Promise that resolves when stream ends (not when done promise resolves)
211
240
  */
212
241
  export function flushablePipe(source, sink, state) {
213
- // When the sink can accept a batch of chunks in one durable write (server
214
- // writables do), coalesce chunks that arrive while a previous batch is still
215
- // in flight into a single server write. Without this, the WHATWG
216
- // `WritableStream` contract serializes the sink one chunk per write() and the
217
- // per-chunk `await writer.write()` in the fallback means the sink's buffer
218
- // never holds more than one chunk — so its `writeMulti` batching path never
219
- // engages and every chunk becomes its own server round trip.
220
- const batchWrite = sink[STREAM_WRITE_BATCH_SYMBOL];
221
- return typeof batchWrite === 'function'
222
- ? flushablePipeCoalescing(source, sink, state, batchWrite)
223
- : flushablePipePerChunk(source, sink, state);
242
+ // Batching lives in the sink (`WorkflowServerWritableStream` group-commits
243
+ // its buffer), so this pipe is a plain per-chunk pump regardless of path —
244
+ // its only responsibilities are lock-release completion and durability
245
+ // tracking. Group-commit sinks ack write() on buffer entry; adopt their
246
+ // durability barrier so the lock-release completion still means
247
+ // "everything written is durable" (see resolveAfterDrain).
248
+ const drain = sink[STREAM_DRAIN_SYMBOL];
249
+ if (typeof drain === 'function') {
250
+ state.drainBarrier = drain;
251
+ }
252
+ return flushablePipePerChunk(source, sink, state);
224
253
  }
225
254
  /**
226
- * Per-chunk variant of {@link flushablePipe}: awaits each `writer.write()`
227
- * before reading the next chunk. Used for sinks without a durable batch write
228
- * (plain `WritableStream`s, `TransformStream` writables on the read path).
255
+ * The pump behind {@link flushablePipe}: awaits each `writer.write()` before
256
+ * reading the next chunk. Against a group-commit sink, write() acks on buffer
257
+ * entry, so this loop feeds the sink as fast as the producer emits (bounded
258
+ * by the sink's buffer bound) and batching happens inside the sink; against a
259
+ * plain sink each write is individually durable, as before. The source-done
260
+ * path closes the sink, which drains it, so completion always implies
261
+ * durability.
229
262
  */
230
263
  async function flushablePipePerChunk(source, sink, state) {
231
264
  const reader = source.getReader();
@@ -273,6 +306,15 @@ async function flushablePipePerChunk(source, sink, state) {
273
306
  catch (err) {
274
307
  state.streamEnded = true;
275
308
  cancelReason = err;
309
+ // Against an early-ack sink, chunks can still be buffered or in flight
310
+ // when the pipe fails (pendingOps only counts un-acked writes). Deliver
311
+ // that accepted prefix before settling the failure: once the state
312
+ // rejects, the step may persist its failure and the invocation finish,
313
+ // and anything still client-side would be lost. The original pipe error
314
+ // stays primary — a drain failure is already sticky on the sink.
315
+ if (state.drainBarrier) {
316
+ await state.drainBarrier().catch(() => { });
317
+ }
276
318
  if (!state.doneResolved) {
277
319
  state.doneResolved = true;
278
320
  state.reject(err);
@@ -294,170 +336,4 @@ async function flushablePipePerChunk(source, sink, state) {
294
336
  writer.releaseLock();
295
337
  }
296
338
  }
297
- function wake(ctx, which) {
298
- const resolve = ctx[which];
299
- if (resolve) {
300
- ctx[which] = null;
301
- resolve();
302
- }
303
- }
304
- /**
305
- * How many leading queued chunks fit in one `writeMulti` without crossing the
306
- * chunk-count or byte wire limits. Always returns at least 1 so a single chunk
307
- * larger than the byte cap still makes progress (alone).
308
- */
309
- function nextBatchSize(ctx) {
310
- let count = 0;
311
- let bytes = 0;
312
- for (const chunk of ctx.queue) {
313
- if (count >= ctx.maxChunksPerBatch)
314
- break;
315
- if (count > 0 && bytes + chunk.byteLength > ctx.maxBytesPerBatch)
316
- break;
317
- count++;
318
- bytes += chunk.byteLength;
319
- }
320
- return count;
321
- }
322
- /**
323
- * Consumer loop: drains the queue one batch at a time, awaiting each batch so it
324
- * is durable on the server before its chunks leave `pendingOps`. It takes as
325
- * much of the queue as the wire limits allow each round, so chunks that arrived
326
- * while the previous batch was in flight coalesce into the next server write.
327
- *
328
- * `pendingOps` is decremented only after `batchWrite` *succeeds*: on failure the
329
- * chunks stay retained in the sink's buffer (see `WorkflowServerWritableStream`)
330
- * and are therefore still "read but not durable", so they must keep counting.
331
- * A throw propagates out of the loop; the pipe's producer then tears down.
332
- */
333
- async function drainBatches(ctx) {
334
- while (true) {
335
- if (ctx.queue.length === 0) {
336
- if (ctx.sourceDone)
337
- return;
338
- await new Promise((resolve) => {
339
- ctx.wakeConsumer = resolve;
340
- });
341
- continue;
342
- }
343
- const count = nextBatchSize(ctx);
344
- const batch = ctx.queue.slice(0, count);
345
- ctx.queue = ctx.queue.slice(count);
346
- await ctx.batchWrite(batch);
347
- ctx.state.pendingOps -= batch.length;
348
- // Relieve producer backpressure now that this batch is durable.
349
- wake(ctx, 'wakeProducer');
350
- }
351
- }
352
- /**
353
- * Await the next chunk while a batch write is in flight, racing three outcomes:
354
- * a read result, the sink closing under us, or a server-write failure from the
355
- * consumer (surfaced promptly even while blocked on the read). On normal
356
- * completion the consumer only settles after the producer sets `sourceDone`, so
357
- * its branch throws only on real failure.
358
- */
359
- function readNextChunk(reader, writer, consumer) {
360
- return Promise.race([
361
- reader.read(),
362
- writer.closed.then(() => {
363
- throw new WorkflowRuntimeError('Writable stream closed prematurely');
364
- }),
365
- consumer.then(() => {
366
- throw new WorkflowRuntimeError('Stream consumer ended prematurely');
367
- }, (err) => {
368
- throw err;
369
- }),
370
- ]);
371
- }
372
- /**
373
- * Backpressure: once too many chunks are outstanding, stop reading until the
374
- * consumer drains a batch. Racing the consumer avoids a deadlock if it ends or
375
- * fails while we wait.
376
- */
377
- async function awaitBackpressureRelief(ctx, consumer, maxInflight) {
378
- if (ctx.state.pendingOps < maxInflight)
379
- return;
380
- await Promise.race([
381
- new Promise((resolve) => {
382
- ctx.wakeProducer = resolve;
383
- }),
384
- consumer.then(() => undefined, () => undefined),
385
- ]);
386
- }
387
- /**
388
- * Batching variant of {@link flushablePipe} for sinks that expose a durable
389
- * batch write ({@link STREAM_WRITE_BATCH_SYMBOL}). A producer reads from
390
- * `source` into a queue; {@link drainBatches} coalesces queued chunks into as
391
- * few server writes as possible — turning a fast burst of chunks into a handful
392
- * of round trips instead of one per chunk.
393
- *
394
- * Durability is preserved exactly as in the per-chunk path: `state.pendingOps`
395
- * counts chunks that have been read but not yet durably written, so the
396
- * lock-release completion (`pollWritableLock` / `pollReadableLock`) never fires
397
- * while data is still queued or in flight, and the source-done path awaits every
398
- * batch before closing.
399
- */
400
- async function flushablePipeCoalescing(source, sink, state, batchWrite) {
401
- const reader = source.getReader();
402
- const writer = sink.getWriter();
403
- const maxInflight = getMaxInflightChunks();
404
- let cancelReason;
405
- const ctx = {
406
- state,
407
- batchWrite,
408
- queue: [],
409
- sourceDone: false,
410
- wakeConsumer: null,
411
- wakeProducer: null,
412
- maxChunksPerBatch: getMaxChunksPerBatch(),
413
- maxBytesPerBatch: getMaxBytesPerBatch(),
414
- };
415
- const consumer = drainBatches(ctx);
416
- try {
417
- while (!state.streamEnded) {
418
- const readResult = await readNextChunk(reader, writer, consumer);
419
- if (state.streamEnded)
420
- return;
421
- if (readResult.done) {
422
- // Signal end-of-source and wait for every queued/in-flight batch to
423
- // reach the server before closing, so no chunk is dropped.
424
- ctx.sourceDone = true;
425
- wake(ctx, 'wakeConsumer');
426
- await consumer;
427
- state.streamEnded = true;
428
- await writer.close();
429
- if (!state.doneResolved) {
430
- state.doneResolved = true;
431
- state.resolve();
432
- }
433
- return;
434
- }
435
- // Count the chunk as pending the moment it is read — it stays counted
436
- // until its batch is durably written.
437
- ctx.queue.push(readResult.value);
438
- state.pendingOps++;
439
- wake(ctx, 'wakeConsumer');
440
- await awaitBackpressureRelief(ctx, consumer, maxInflight);
441
- }
442
- }
443
- catch (err) {
444
- state.streamEnded = true;
445
- cancelReason = err;
446
- // Let the consumer settle so its rejection (if any) is observed here rather
447
- // than surfacing as an unhandled rejection.
448
- ctx.sourceDone = true;
449
- wake(ctx, 'wakeConsumer');
450
- await consumer.catch(() => { });
451
- if (!state.doneResolved) {
452
- state.doneResolved = true;
453
- state.reject(err);
454
- }
455
- throw err;
456
- }
457
- finally {
458
- reader.cancel(cancelReason).catch(() => { });
459
- reader.releaseLock();
460
- writer.releaseLock();
461
- }
462
- }
463
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmx1c2hhYmxlLXN0cmVhbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9mbHVzaGFibGUtc3RyZWFtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3hELE9BQU8sRUFBNkIsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQVN6RDs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQztBQUV4QyxNQUFNLG9CQUFvQixHQUFHLEdBQVcsRUFBRSxDQUN4QyxTQUFTLENBQUMscUNBQXFDLEVBQUUsbUJBQW1CLEVBQUU7SUFDcEUsT0FBTyxFQUFFLElBQUk7SUFDYixHQUFHLEVBQUUsQ0FBQztDQUNQLENBQUMsQ0FBQztBQUVMOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDO0FBRXpDLE1BQU0sb0JBQW9CLEdBQUcsR0FBVyxFQUFFLENBQ3hDLFNBQVMsQ0FBQyxzQ0FBc0MsRUFBRSxvQkFBb0IsRUFBRTtJQUN0RSxPQUFPLEVBQUUsSUFBSTtJQUNiLEdBQUcsRUFBRSxDQUFDO0NBQ1AsQ0FBQyxDQUFDO0FBRUw7Ozs7Ozs7R0FPRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFFL0MsTUFBTSxtQkFBbUIsR0FBRyxHQUFXLEVBQUUsQ0FDdkMsU0FBUyxDQUFDLHFDQUFxQyxFQUFFLG1CQUFtQixFQUFFO0lBQ3BFLE9BQU8sRUFBRSxJQUFJO0lBQ2IsR0FBRyxFQUFFLENBQUM7Q0FDUCxDQUFDLENBQUM7QUFFTDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFD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QztRQUMvQixJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3hCLEtBQUssQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQzFCLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDcEIsQ0FBQztRQUNELE1BQU0sR0FBRyxDQUFDO0lBQ1osQ0FBQztZQUFTLENBQUM7UUFDVCxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQztRQUM1QyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckIsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV29ya2Zsb3dSdW50aW1lRXJyb3IgfSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7IHR5cGUgUHJvbWlzZVdpdGhSZXNvbHZlcnMsIHdpdGhSZXNvbHZlcnMgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHsgZW52TnVtYmVyIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IFNUUkVBTV9XUklURV9CQVRDSF9TWU1CT0wgfSBmcm9tICcuL3N5bWJvbHMuanMnO1xuXG4vKipcbiAqIEEgYmF0Y2hlZCwgZHVyYWJsZSB3cml0ZSBlbnRyeSBwb2ludCBhIHNpbmsgbWF5IGV4cG9zZSB1bmRlclxuICoge0BsaW5rIFNUUkVBTV9XUklURV9CQVRDSF9TWU1CT0x9LiBSZXNvbHZlcyBvbmNlIGV2ZXJ5IGNodW5rIGluIHRoZSBiYXRjaFxuICogaGFzIHJlYWNoZWQgdGhlIHNlcnZlci4gU2VlIGBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtYC5cbiAqL1xudHlwZSBCYXRjaFdyaXRlID0gKGNodW5rczogVWludDhBcnJheVtdKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4vKipcbiAqIEZsb3ctY29udHJvbCBrbm9iOiB1cHBlciBib3VuZCBvbiBjaHVua3MgcmVhZC1idXQtbm90LXlldC1kdXJhYmx5LXdyaXR0ZW5cbiAqIHdoaWxlIGNvYWxlc2NpbmcuIE9uY2UgdGhpcyBtYW55IGNodW5rcyBhcmUgb3V0c3RhbmRpbmcgdGhlIHByb2R1Y2VyIHN0b3BzXG4gKiByZWFkaW5nIHVudGlsIHRoZSBjb25zdW1lciBkcmFpbnMgYSBiYXRjaCwgc28gYSBmYXN0IHByb2R1Y2VyIHBhaXJlZCB3aXRoIGFcbiAqIHNsb3cgc2VydmVyIGNhbid0IGdyb3cgdGhlIGluLW1lbW9yeSBxdWV1ZSB3aXRob3V0IGJvdW5kLiBPdmVycmlkZTpcbiAqIGBXT1JLRkxPV19TVFJFQU1fTUFYX0lORkxJR0hUX0NIVU5LU2AuXG4gKlxuICogVGhpcyBpcyBkZWxpYmVyYXRlbHkgZGlzdGluY3QgZnJvbSB0aGUgcGVyLXJlcXVlc3QgYmF0Y2ggY2FwcyBiZWxvdzogdGhpc1xuICogYm91bmRzIGhvdyBtdWNoIGlzICpidWZmZXJlZCosIHRob3NlIGJvdW5kIGhvdyBtdWNoIGdvZXMgb3V0IGluIG9uZVxuICogYHdyaXRlTXVsdGlgLiBSYWlzaW5nIHRoaXMgbXVzdCBuZXZlciBsZXQgYSBzaW5nbGUgcmVxdWVzdCBleGNlZWQgYSB3aXJlXG4gKiBsaW1pdCDigJQgYmF0Y2ggc2l6aW5nIGVuZm9yY2VzIHRoYXQgaW5kZXBlbmRlbnRseS5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9JTkZMSUdIVF9DSFVOS1MgPSAxMDAwO1xuXG5jb25zdCBnZXRNYXhJbmZsaWdodENodW5rcyA9ICgpOiBudW1iZXIgPT5cbiAgZW52TnVtYmVyKCdXT1JLRkxPV19TVFJFQU1fTUFYX0lORkxJR0hUX0NIVU5LUycsIE1BWF9JTkZMSUdIVF9DSFVOS1MsIHtcbiAgICBpbnRlZ2VyOiB0cnVlLFxuICAgIG1pbjogMSxcbiAgfSk7XG5cbi8qKlxuICogV2lyZSBsaW1pdDogbWF4aW11bSBudW1iZXIgb2YgY2h1bmtzIGluIGEgc2luZ2xlIGNvYWxlc2NlZCBgd3JpdGVNdWx0aWAuXG4gKiBUaGUgc2VydmVyIGVuZm9yY2VzIGEgcGVyLW11bHRpLXdyaXRlIGNodW5rIGNhcCAoMSwwMDAgdG9kYXkpOyBhIGJhdGNoIGlzXG4gKiBzcGxpdCBhdCB0aGlzIGJvdW5kIHNvIGl0IGNhbiBuZXZlciBiZSByZWplY3RlZCB3aG9sZXNhbGUsIGluZGVwZW5kZW50bHkgb2ZcbiAqIHRoZSBiYWNrcHJlc3N1cmUga25vYiBhYm92ZS4gT3ZlcnJpZGU6IGBXT1JLRkxPV19TVFJFQU1fTUFYX0NIVU5LU19QRVJfQkFUQ0hgLlxuICovXG5leHBvcnQgY29uc3QgTUFYX0NIVU5LU19QRVJfQkFUQ0ggPSAxMDAwO1xuXG5jb25zdCBnZXRNYXhDaHVua3NQZXJCYXRjaCA9ICgpOiBudW1iZXIgPT5cbiAgZW52TnVtYmVyKCdXT1JLRkxPV19TVFJFQU1fTUFYX0NIVU5LU19QRVJfQkFUQ0gnLCBNQVhfQ0hVTktTX1BFUl9CQVRDSCwge1xuICAgIGludGVnZXI6IHRydWUsXG4gICAgbWluOiAxLFxuICB9KTtcblxuLyoqXG4gKiBXaXJlIGxpbWl0OiBtYXhpbXVtIGN1bXVsYXRpdmUgYnl0ZXMgaW4gYSBzaW5nbGUgY29hbGVzY2VkIGB3cml0ZU11bHRpYC5cbiAqIENodW5rICpjb3VudCogYWxvbmUgaXMgbm90IGVub3VnaCDigJQgMSwwMDAgc21hbGwgY2h1bmtzIGFyZSB+MTAwS0IgYnV0IDEsMDAwXG4gKiBmaWxlLXNpemVkIGNodW5rcyBjYW4gYmUgaHVuZHJlZHMgb2YgTUIsIHdoaWNoIHBsYXRmb3JtIHJlcXVlc3QtYm9keSBsaW1pdHNcbiAqIHJlamVjdCBsb25nIGJlZm9yZSB0aGUgY291bnQgY2FwIG1hdHRlcnMuIEEgYmF0Y2ggaXMgc3BsaXQgb25jZSBhZGRpbmcgdGhlXG4gKiBuZXh0IGNodW5rIHdvdWxkIGV4Y2VlZCB0aGlzIChhIHNpbmdsZSBjaHVuayBsYXJnZXIgdGhhbiB0aGUgY2FwIHN0aWxsIGdvZXNcbiAqIG91dCBhbG9uZSkuIERlZmF1bHQgMSBNaUIuIE92ZXJyaWRlOiBgV09SS0ZMT1dfU1RSRUFNX01BWF9CWVRFU19QRVJfQkFUQ0hgLlxuICovXG5leHBvcnQgY29uc3QgTUFYX0JZVEVTX1BFUl9CQVRDSCA9IDEwMjQgKiAxMDI0O1xuXG5jb25zdCBnZXRNYXhCeXRlc1BlckJhdGNoID0gKCk6IG51bWJlciA9PlxuICBlbnZOdW1iZXIoJ1dPUktGTE9XX1NUUkVBTV9NQVhfQllURVNfUEVSX0JBVENIJywgTUFYX0JZVEVTX1BFUl9CQVRDSCwge1xuICAgIGludGVnZXI6IHRydWUsXG4gICAgbWluOiAxLFxuICB9KTtcblxuLyoqXG4gKiBQb2xsaW5nIGludGVydmFsIChpbiBtcykgZm9yIGxvY2sgcmVsZWFzZSBkZXRlY3Rpb24uXG4gKlxuICogVGhlIFdlYiBTdHJlYW1zIEFQSSBkb2VzIG5vdCBleHBvc2UgYW4gZXZlbnQgZm9yIFwibG9jayByZWxlYXNlZCBidXQgc3RyZWFtXG4gKiBzdGlsbCBvcGVuXCI7IHdlIGNhbiBvbmx5IGRpc3Rpbmd1aXNoIHRoYXQgc3RhdGUgYnkgcGVyaW9kaWNhbGx5IGF0dGVtcHRpbmdcbiAqIHRvIGFjcXVpcmUgYSByZWFkZXIvd3JpdGVyLiBGb3IgdGhhdCByZWFzb24gd2UgdXNlIHBvbGxpbmcgaW5zdGVhZCBvZiBhXG4gKiBmdWxseSBldmVudC1kcml2ZW4gYXBwcm9hY2ggaGVyZS5cbiAqXG4gKiAxMG1zIGlzIGNob3NlbiBzbyB0aGUgcG9sbGluZyB0aWNrIGFsbW9zdCBuZXZlciBzaXRzIG9uIHRoZSBjcml0aWNhbCBwYXRoOlxuICogdGhlIFYyIHN0ZXAtZXhlY3V0b3IncyBgb3BzU2V0dGxlZGAgcmFjZSB3YWl0cyBmb3IgdGhpcyBzdGF0ZSB0byByZXNvbHZlXG4gKiBhZnRlciBlYWNoIHN0ZXAgYm9keSByZXR1cm5zLCBzbyBhIGNvYXJzZXIgaW50ZXJ2YWwgKHRoZSBwcmV2aW91cyAxMDBtcylcbiAqIGFkZHMgdmlzaWJsZSBwZXItc3RlcCBsYXRlbmN5IHRvIHN0cmVhbWluZyB3b3JrZmxvd3MuIFdpdGggYSB1bmlmb3JtbHlcbiAqIGRpc3RyaWJ1dGVkIG9mZnNldCBiZXR3ZWVuIHN0ZXAgcmV0dXJuIGFuZCB0aGUgbmV4dCB0aWNrLCB0aGUgZXhwZWN0ZWRcbiAqIHdhaXQgaXMgaGFsZiB0aGUgaW50ZXJ2YWwg4oCUIHNvIDEwbXMgbWVhbnMgfjVtcyBhdmVyYWdlIHdhaXQgcGVyIHN0ZXBcbiAqIGluc3RlYWQgb2YgfjUwbXMuIFRoZSBwZXItdGljayB3b3JrIGlzIGB3cml0YWJsZS5sb2NrZWRgIHBsdXMgYVxuICogYGdldFdyaXRlcigpYC9gcmVsZWFzZUxvY2soKWAgcHJvYmUsIGJvdGggbWljcm9zZWNvbmQtc2NhbGU7IDEww5cgbW9yZVxuICogdGlja3MgZHVyaW5nIGEgc3RyZWFtJ3MgbGlmZXRpbWUgaXMgbm90IG1lYXN1cmFibGUgaW4gcHJhY3RpY2UuXG4gKi9cbmV4cG9ydCBjb25zdCBMT0NLX1BPTExfSU5URVJWQUxfTVMgPSAxMDtcblxuLyoqIEVmZmVjdGl2ZSBsb2NrLXBvbGwgaW50ZXJ2YWwuIE92ZXJyaWRlOiBgV09SS0ZMT1dfTE9DS19QT0xMX0lOVEVSVkFMX01TYC4gKi9cbmNvbnN0IGdldExvY2tQb2xsSW50ZXJ2YWxNcyA9ICgpOiBudW1iZXIgPT5cbiAgZW52TnVtYmVyKCdXT1JLRkxPV19MT0NLX1BPTExfSU5URVJWQUxfTVMnLCBMT0NLX1BPTExfSU5URVJWQUxfTVMsIHtcbiAgICBpbnRlZ2VyOiB0cnVlLFxuICAgIG1pbjogMSxcbiAgfSk7XG5cbi8qKlxuICogU3RhdGUgdHJhY2tlciBmb3IgZmx1c2hhYmxlIHN0cmVhbSBvcGVyYXRpb25zLlxuICogUmVzb2x2ZXMgd2hlbiBlaXRoZXI6XG4gKiAxLiBTdHJlYW0gY29tcGxldGVzIChjbG9zZS9lcnJvciksIE9SXG4gKiAyLiBMb2NrIGlzIHJlbGVhc2VkIEFORCBhbGwgcGVuZGluZyBvcGVyYXRpb25zIGFyZSBmbHVzaGVkXG4gKlxuICogTm90ZTogYGRvbmVSZXNvbHZlZGAgYW5kIGBzdHJlYW1FbmRlZGAgYXJlIHNlcGFyYXRlOlxuICogLSBgZG9uZVJlc29sdmVkYDogVGhlIGBkb25lYCBwcm9taXNlIGhhcyBiZWVuIHJlc29sdmVkIChzdGVwIGNhbiBjb21wbGV0ZSlcbiAqIC0gYHN0cmVhbUVuZGVkYDogVGhlIHVuZGVybHlpbmcgc3RyZWFtIGhhcyBhY3R1YWxseSBjbG9zZWQvZXJyb3JlZFxuICpcbiAqIE9uY2UgYGRvbmVSZXNvbHZlZGAgaXMgc2V0IHRvIHRydWUsIHRoZSBgZG9uZWAgcHJvbWlzZSB3aWxsIG5vdCByZXNvbHZlXG4gKiBhZ2Fpbi4gUmUtYWNxdWlyaW5nIGxvY2tzIGFmdGVyIHJlbGVhc2UgaXMgbm90IHN1cHBvcnRlZCBhcyBhIHdheSB0b1xuICogdHJpZ2dlciBhZGRpdGlvbmFsIGNvbXBsZXRpb24gc2lnbmFsaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZsdXNoYWJsZVN0cmVhbVN0YXRlIGV4dGVuZHMgUHJvbWlzZVdpdGhSZXNvbHZlcnM8dm9pZD4ge1xuICAvKiogTnVtYmVyIG9mIHdyaXRlIG9wZXJhdGlvbnMgY3VycmVudGx5IGluIGZsaWdodCB0byB0aGUgc2VydmVyICovXG4gIHBlbmRpbmdPcHM6IG51bWJlcjtcbiAgLyoqIFdoZXRoZXIgdGhlIGBkb25lYCBwcm9taXNlIGhhcyBiZWVuIHJlc29sdmVkICovXG4gIGRvbmVSZXNvbHZlZDogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhlIHVuZGVybHlpbmcgc3RyZWFtIGhhcyBhY3R1YWxseSBjbG9zZWQvZXJyb3JlZCAqL1xuICBzdHJlYW1FbmRlZDogYm9vbGVhbjtcbiAgLyoqIEludGVydmFsIElEIGZvciB3cml0YWJsZSBsb2NrIHBvbGxpbmcgKGlmIGFjdGl2ZSkgKi9cbiAgd3JpdGFibGVQb2xsaW5nSW50ZXJ2YWw/OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD47XG4gIC8qKiBJbnRlcnZhbCBJRCBmb3IgcmVhZGFibGUgbG9jayBwb2xsaW5nIChpZiBhY3RpdmUpICovXG4gIHJlYWRhYmxlUG9sbGluZ0ludGVydmFsPzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRmx1c2hhYmxlU3RhdGUoKTogRmx1c2hhYmxlU3RyZWFtU3RhdGUge1xuICBjb25zdCBzdGF0ZTogRmx1c2hhYmxlU3RyZWFtU3RhdGUgPSB7XG4gICAgLi4ud2l0aFJlc29sdmVyczx2b2lkPigpLFxuICAgIHBlbmRpbmdPcHM6IDAsXG4gICAgZG9uZVJlc29sdmVkOiBmYWxzZSxcbiAgICBzdHJlYW1FbmRlZDogZmFsc2UsXG4gIH07XG5cbiAgLy8gVGhlIHJ1bnRpbWUgYXdhaXRzIHRoaXMgcHJvbWlzZSBhZnRlciB1c2VyIGNvZGUgcmV0dXJucy4gT2JzZXJ2ZSBlYXJseVxuICAvLyBzdHJlYW0gZmFpbHVyZXMgbm93IHNvIHRoZXkgZG8gbm90IGJlY29tZSB1bmhhbmRsZWQgcmVqZWN0aW9ucyBmaXJzdC5cbiAgc3RhdGUucHJvbWlzZS5jYXRjaCgoKSA9PiB7fSk7XG5cbiAgcmV0dXJuIHN0YXRlO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIFdyaXRhYmxlU3RyZWFtIGlzIHVubG9ja2VkICh1c2VyIHJlbGVhc2VkIGxvY2spIHZzIGNsb3NlZC5cbiAqIFdoZW4gYSBzdHJlYW0gaXMgY2xvc2VkLCAubG9ja2VkIGlzIGZhbHNlIGJ1dCBnZXRXcml0ZXIoKSB0aHJvd3MuXG4gKiBXZSBvbmx5IHdhbnQgdG8gcmVzb2x2ZSB2aWEgcG9sbGluZyB3aGVuIHRoZSBzdHJlYW0gaXMgdW5sb2NrZWQsIG5vdCBjbG9zZWQuXG4gKiBJZiBjbG9zZWQsIHRoZSBwdW1wIHdpbGwgaGFuZGxlIHJlc29sdXRpb24gdmlhIHRoZSBzdHJlYW0gZW5kaW5nIG5hdHVyYWxseS5cbiAqL1xuZnVuY3Rpb24gaXNXcml0YWJsZVVubG9ja2VkTm90Q2xvc2VkKHdyaXRhYmxlOiBXcml0YWJsZVN0cmVhbSk6IGJvb2xlYW4ge1xuICBpZiAod3JpdGFibGUubG9ja2VkKSByZXR1cm4gZmFsc2U7XG5cbiAgbGV0IHdyaXRlcjogV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyIHwgdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIC8vIFRyeSB0byBhY3F1aXJlIHdyaXRlciAtIGlmIHN1Y2Nlc3NmdWwsIHN0cmVhbSBpcyB1bmxvY2tlZCAobm90IGNsb3NlZClcbiAgICB3cml0ZXIgPSB3cml0YWJsZS5nZXRXcml0ZXIoKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZ2V0V3JpdGVyKCkgdGhyb3dzIGlmIHN0cmVhbSBpcyBjbG9zZWQvZXJyb3JlZCAtIGxldCBwdW1wIGhhbmRsZSBpdFxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgd3JpdGVyLnJlbGVhc2VMb2NrKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIElmIHJlbGVhc2VMb2NrKCkgdGhyb3dzIGZvciBhbnkgcmVhc29uLCBjb25zZXJ2YXRpdmVseSB0cmVhdCB0aGVcbiAgICAvLyBzdHJlYW0gYXMgY2xvc2VkL2Vycm9yZWQgc28gY2FsbGVycyBkb24ndCBhc3N1bWUgaXQncyBzYWZlIHRvIHVzZS5cbiAgICAvLyBUaGUgcHVtcCB3aWxsIG9ic2VydmUgdGhlIGZhaWx1cmUgdmlhIHRoZSBzdHJlYW0ncyBlbmQgc3RhdGUuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgUmVhZGFibGVTdHJlYW0gaXMgdW5sb2NrZWQgKHVzZXIgcmVsZWFzZWQgbG9jaykgdnMgY2xvc2VkLlxuICovXG5mdW5jdGlvbiBpc1JlYWRhYmxlVW5sb2NrZWROb3RDbG9zZWQocmVhZGFibGU6IFJlYWRhYmxlU3RyZWFtKTogYm9vbGVhbiB7XG4gIGlmIChyZWFkYWJsZS5sb2NrZWQpIHJldHVybiBmYWxzZTtcblxuICBsZXQgcmVhZGVyOiBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIgfCB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgLy8gVHJ5IHRvIGFjcXVpcmUgcmVhZGVyIC0gaWYgc3VjY2Vzc2Z1bCwgc3RyZWFtIGlzIHVubG9ja2VkIChub3QgY2xvc2VkKVxuICAgIHJlYWRlciA9IHJlYWRhYmxlLmdldFJlYWRlcigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBnZXRSZWFkZXIoKSB0aHJvd3MgaWYgc3RyZWFtIGlzIGNsb3NlZC9lcnJvcmVkIC0gbGV0IHB1bXAgaGFuZGxlIGl0XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZWFkZXIucmVsZWFzZUxvY2soKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gSWYgcmVsZWFzZUxvY2soKSB0aHJvd3MgZm9yIGFueSByZWFzb24sIGNvbnNlcnZhdGl2ZWx5IHRyZWF0IHRoZVxuICAgIC8vIHN0cmVhbSBhcyBjbG9zZWQvZXJyb3JlZCBzbyBjYWxsZXJzIGRvbid0IGFzc3VtZSBpdCdzIHNhZmUgdG8gdXNlLlxuICAgIC8vIFRoZSBwdW1wIHdpbGwgb2JzZXJ2ZSB0aGUgZmFpbHVyZSB2aWEgdGhlIHN0cmVhbSdzIGVuZCBzdGF0ZS5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBQb2xscyBhIFdyaXRhYmxlU3RyZWFtIHRvIGNoZWNrIGlmIHRoZSB1c2VyIGhhcyByZWxlYXNlZCB0aGVpciBsb2NrLlxuICogUmVzb2x2ZXMgdGhlIGRvbmUgcHJvbWlzZSB3aGVuIGxvY2sgaXMgcmVsZWFzZWQgYW5kIG5vIHBlbmRpbmcgb3BzIHJlbWFpbi5cbiAqXG4gKiBOb3RlOiBPbmx5IHJlc29sdmVzIGlmIHN0cmVhbSBpcyB1bmxvY2tlZCBidXQgTk9UIGNsb3NlZC4gSWYgdGhlIHVzZXIgY2xvc2VzXG4gKiB0aGUgc3RyZWFtLCB0aGUgcHVtcCB3aWxsIGhhbmRsZSByZXNvbHV0aW9uIHZpYSB0aGUgc3RyZWFtIGVuZGluZyBuYXR1cmFsbHkuXG4gKlxuICogUHJvdGVjdGlvbjogSWYgcG9sbGluZyBpcyBhbHJlYWR5IGFjdGl2ZSBvbiB0aGlzIHN0YXRlLCB0aGUgZXhpc3RpbmcgaW50ZXJ2YWxcbiAqIGlzIHVzZWQgdG8gYXZvaWQgY3JlYXRpbmcgbXVsdGlwbGUgc2ltdWx0YW5lb3VzIHBvbGxpbmcgb3BlcmF0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvbGxXcml0YWJsZUxvY2soXG4gIHdyaXRhYmxlOiBXcml0YWJsZVN0cmVhbSxcbiAgc3RhdGU6IEZsdXNoYWJsZVN0cmVhbVN0YXRlXG4pOiB2b2lkIHtcbiAgLy8gUHJldmVudCBtdWx0aXBsZSBzaW11bHRhbmVvdXMgcG9sbGluZyBvbiB0aGUgc2FtZSBzdGF0ZVxuICBpZiAoc3RhdGUud3JpdGFibGVQb2xsaW5nSW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGludGVydmFsSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgLy8gU3RvcCBwb2xsaW5nIGlmIGFscmVhZHkgcmVzb2x2ZWQgb3Igc3RyZWFtIGVuZGVkXG4gICAgaWYgKHN0YXRlLmRvbmVSZXNvbHZlZCB8fCBzdGF0ZS5zdHJlYW1FbmRlZCkge1xuICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcbiAgICAgIHN0YXRlLndyaXRhYmxlUG9sbGluZ0ludGVydmFsID0gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGxvY2sgaXMgcmVsZWFzZWQgKG5vdCBjbG9zZWQpIGFuZCBubyBwZW5kaW5nIG9wc1xuICAgIGlmIChpc1dyaXRhYmxlVW5sb2NrZWROb3RDbG9zZWQod3JpdGFibGUpICYmIHN0YXRlLnBlbmRpbmdPcHMgPT09IDApIHtcbiAgICAgIHN0YXRlLmRvbmVSZXNvbHZlZCA9IHRydWU7XG4gICAgICBzdGF0ZS5yZXNvbHZlKCk7XG4gICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpO1xuICAgICAgc3RhdGUud3JpdGFibGVQb2xsaW5nSW50ZXJ2YWwgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9LCBnZXRMb2NrUG9sbEludGVydmFsTXMoKSk7XG5cbiAgc3RhdGUud3JpdGFibGVQb2xsaW5nSW50ZXJ2YWwgPSBpbnRlcnZhbElkO1xufVxuXG4vKipcbiAqIFBvbGxzIGEgUmVhZGFibGVTdHJlYW0gdG8gY2hlY2sgaWYgdGhlIHVzZXIgaGFzIHJlbGVhc2VkIHRoZWlyIGxvY2suXG4gKiBSZXNvbHZlcyB0aGUgZG9uZSBwcm9taXNlIHdoZW4gbG9jayBpcyByZWxlYXNlZCBhbmQgbm8gcGVuZGluZyBvcHMgcmVtYWluLlxuICpcbiAqIE5vdGU6IE9ubHkgcmVzb2x2ZXMgaWYgc3RyZWFtIGlzIHVubG9ja2VkIGJ1dCBOT1QgY2xvc2VkLiBJZiB0aGUgdXNlciBjbG9zZXNcbiAqIHRoZSBzdHJlYW0sIHRoZSBwdW1wIHdpbGwgaGFuZGxlIHJlc29sdXRpb24gdmlhIHRoZSBzdHJlYW0gZW5kaW5nIG5hdHVyYWxseS5cbiAqXG4gKiBQcm90ZWN0aW9uOiBJZiBwb2xsaW5nIGlzIGFscmVhZHkgYWN0aXZlIG9uIHRoaXMgc3RhdGUsIHRoZSBleGlzdGluZyBpbnRlcnZhbFxuICogaXMgdXNlZCB0byBhdm9pZCBjcmVhdGluZyBtdWx0aXBsZSBzaW11bHRhbmVvdXMgcG9sbGluZyBvcGVyYXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcG9sbFJlYWRhYmxlTG9jayhcbiAgcmVhZGFibGU6IFJlYWRhYmxlU3RyZWFtLFxuICBzdGF0ZTogRmx1c2hhYmxlU3RyZWFtU3RhdGVcbik6IHZvaWQge1xuICAvLyBQcmV2ZW50IG11bHRpcGxlIHNpbXVsdGFuZW91cyBwb2xsaW5nIG9uIHRoZSBzYW1lIHN0YXRlXG4gIGlmIChzdGF0ZS5yZWFkYWJsZVBvbGxpbmdJbnRlcnZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgaW50ZXJ2YWxJZCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAvLyBTdG9wIHBvbGxpbmcgaWYgYWxyZWFkeSByZXNvbHZlZCBvciBzdHJlYW0gZW5kZWRcbiAgICBpZiAoc3RhdGUuZG9uZVJlc29sdmVkIHx8IHN0YXRlLnN0cmVhbUVuZGVkKSB7XG4gICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpO1xuICAgICAgc3RhdGUucmVhZGFibGVQb2xsaW5nSW50ZXJ2YWwgPSB1bmRlZmluZWQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgbG9jayBpcyByZWxlYXNlZCAobm90IGNsb3NlZCkgYW5kIG5vIHBlbmRpbmcgb3BzXG4gICAgaWYgKGlzUmVhZGFibGVVbmxvY2tlZE5vdENsb3NlZChyZWFkYWJsZSkgJiYgc3RhdGUucGVuZGluZ09wcyA9PT0gMCkge1xuICAgICAgc3RhdGUuZG9uZVJlc29sdmVkID0gdHJ1ZTtcbiAgICAgIHN0YXRlLnJlc29sdmUoKTtcbiAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XG4gICAgICBzdGF0ZS5yZWFkYWJsZVBvbGxpbmdJbnRlcnZhbCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0sIGdldExvY2tQb2xsSW50ZXJ2YWxNcygpKTtcblxuICBzdGF0ZS5yZWFkYWJsZVBvbGxpbmdJbnRlcnZhbCA9IGludGVydmFsSWQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZsdXNoYWJsZSBwaXBlIGZyb20gYSBSZWFkYWJsZVN0cmVhbSB0byBhIFdyaXRhYmxlU3RyZWFtLlxuICogVW5saWtlIHBpcGVUbygpLCB0aGlzIHJlc29sdmVzIHdoZW46XG4gKiAxLiBUaGUgc291cmNlIHN0cmVhbSBjb21wbGV0ZXMgKGNsb3NlL2Vycm9yKSwgT1JcbiAqIDIuIFRoZSB1c2VyIHJlbGVhc2VzIHRoZWlyIGxvY2sgb24gdXNlclN0cmVhbSBBTkQgYWxsIHBlbmRpbmcgd3JpdGVzIGFyZSBmbHVzaGVkXG4gKlxuICogQHBhcmFtIHNvdXJjZSAtIFRoZSByZWFkYWJsZSBzdHJlYW0gdG8gcmVhZCBmcm9tIChlLmcuLCB0cmFuc2Zvcm0ncyByZWFkYWJsZSlcbiAqIEBwYXJhbSBzaW5rIC0gVGhlIHdyaXRhYmxlIHN0cmVhbSB0byB3cml0ZSB0byAoZS5nLiwgc2VydmVyIHdyaXRhYmxlKVxuICogQHBhcmFtIHN0YXRlIC0gVGhlIGZsdXNoYWJsZSBzdGF0ZSB0cmFja2VyXG4gKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBzdHJlYW0gZW5kcyAobm90IHdoZW4gZG9uZSBwcm9taXNlIHJlc29sdmVzKVxuICovXG5leHBvcnQgZnVuY3Rpb24gZmx1c2hhYmxlUGlwZShcbiAgc291cmNlOiBSZWFkYWJsZVN0cmVhbSxcbiAgc2luazogV3JpdGFibGVTdHJlYW0sXG4gIHN0YXRlOiBGbHVzaGFibGVTdHJlYW1TdGF0ZVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIFdoZW4gdGhlIHNpbmsgY2FuIGFjY2VwdCBhIGJhdGNoIG9mIGNodW5rcyBpbiBvbmUgZHVyYWJsZSB3cml0ZSAoc2VydmVyXG4gIC8vIHdyaXRhYmxlcyBkbyksIGNvYWxlc2NlIGNodW5rcyB0aGF0IGFycml2ZSB3aGlsZSBhIHByZXZpb3VzIGJhdGNoIGlzIHN0aWxsXG4gIC8vIGluIGZsaWdodCBpbnRvIGEgc2luZ2xlIHNlcnZlciB3cml0ZS4gV2l0aG91dCB0aGlzLCB0aGUgV0hBVFdHXG4gIC8vIGBXcml0YWJsZVN0cmVhbWAgY29udHJhY3Qgc2VyaWFsaXplcyB0aGUgc2luayBvbmUgY2h1bmsgcGVyIHdyaXRlKCkgYW5kIHRoZVxuICAvLyBwZXItY2h1bmsgYGF3YWl0IHdyaXRlci53cml0ZSgpYCBpbiB0aGUgZmFsbGJhY2sgbWVhbnMgdGhlIHNpbmsncyBidWZmZXJcbiAgLy8gbmV2ZXIgaG9sZHMgbW9yZSB0aGFuIG9uZSBjaHVuayDigJQgc28gaXRzIGB3cml0ZU11bHRpYCBiYXRjaGluZyBwYXRoIG5ldmVyXG4gIC8vIGVuZ2FnZXMgYW5kIGV2ZXJ5IGNodW5rIGJlY29tZXMgaXRzIG93biBzZXJ2ZXIgcm91bmQgdHJpcC5cbiAgY29uc3QgYmF0Y2hXcml0ZSA9IChzaW5rIGFzIHsgW1NUUkVBTV9XUklURV9CQVRDSF9TWU1CT0xdPzogQmF0Y2hXcml0ZSB9KVtcbiAgICBTVFJFQU1fV1JJVEVfQkFUQ0hfU1lNQk9MXG4gIF07XG4gIHJldHVybiB0eXBlb2YgYmF0Y2hXcml0ZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gZmx1c2hhYmxlUGlwZUNvYWxlc2Npbmcoc291cmNlLCBzaW5rLCBzdGF0ZSwgYmF0Y2hXcml0ZSlcbiAgICA6IGZsdXNoYWJsZVBpcGVQZXJDaHVuayhzb3VyY2UsIHNpbmssIHN0YXRlKTtcbn1cblxuLyoqXG4gKiBQZXItY2h1bmsgdmFyaWFudCBvZiB7QGxpbmsgZmx1c2hhYmxlUGlwZX06IGF3YWl0cyBlYWNoIGB3cml0ZXIud3JpdGUoKWBcbiAqIGJlZm9yZSByZWFkaW5nIHRoZSBuZXh0IGNodW5rLiBVc2VkIGZvciBzaW5rcyB3aXRob3V0IGEgZHVyYWJsZSBiYXRjaCB3cml0ZVxuICogKHBsYWluIGBXcml0YWJsZVN0cmVhbWBzLCBgVHJhbnNmb3JtU3RyZWFtYCB3cml0YWJsZXMgb24gdGhlIHJlYWQgcGF0aCkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZsdXNoYWJsZVBpcGVQZXJDaHVuayhcbiAgc291cmNlOiBSZWFkYWJsZVN0cmVhbSxcbiAgc2luazogV3JpdGFibGVTdHJlYW0sXG4gIHN0YXRlOiBGbHVzaGFibGVTdHJlYW1TdGF0ZVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlYWRlciA9IHNvdXJjZS5nZXRSZWFkZXIoKTtcbiAgY29uc3Qgd3JpdGVyID0gc2luay5nZXRXcml0ZXIoKTtcbiAgbGV0IGNhbmNlbFJlYXNvbjogdW5rbm93bjtcblxuICB0cnkge1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAvLyBDaGVjayBpZiBzdHJlYW0gaGFzIGVuZGVkXG4gICAgICBpZiAoc3RhdGUuc3RyZWFtRW5kZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBSZWFkIGZyb20gc291cmNlIC0gZG9uJ3QgY291bnQgYXMgcGVuZGluZyBvcCBzaW5jZSB3ZSdyZSBqdXN0IHdhaXRpbmcgZm9yIGRhdGFcbiAgICAgIC8vIFRoZSBpbXBvcnRhbnQgb3BzIGFyZSB3cml0ZXMgdG8gdGhlIHNpbmsgKHNlcnZlcilcbiAgICAgIGNvbnN0IHJlYWRSZXN1bHQgPSBhd2FpdCBQcm9taXNlLnJhY2UoW1xuICAgICAgICByZWFkZXIucmVhZCgpLFxuICAgICAgICB3cml0ZXIuY2xvc2VkLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcignV3JpdGFibGUgc3RyZWFtIGNsb3NlZCBwcmVtYXR1cmVseScpO1xuICAgICAgICB9KSxcbiAgICAgIF0pO1xuXG4gICAgICAvLyBDaGVjayBpZiBzdHJlYW0gaGFzIGVuZGVkIChlLmcuLCBkdWUgdG8gZXJyb3IgaW4gYW5vdGhlciBwYXRoKSBiZWZvcmUgcHJvY2Vzc2luZ1xuICAgICAgaWYgKHN0YXRlLnN0cmVhbUVuZGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlYWRSZXN1bHQuZG9uZSkge1xuICAgICAgICAvLyBTb3VyY2Ugc3RyZWFtIGNvbXBsZXRlZCAtIGNsb3NlIHNpbmsgYW5kIHJlc29sdmVcbiAgICAgICAgc3RhdGUuc3RyZWFtRW5kZWQgPSB0cnVlO1xuICAgICAgICBhd2FpdCB3cml0ZXIuY2xvc2UoKTtcbiAgICAgICAgLy8gUmVzb2x2ZSBkb25lIHByb21pc2UgaWYgbm90IGFscmVhZHkgcmVzb2x2ZWRcbiAgICAgICAgaWYgKCFzdGF0ZS5kb25lUmVzb2x2ZWQpIHtcbiAgICAgICAgICBzdGF0ZS5kb25lUmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICAgIHN0YXRlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIENvdW50IHdyaXRlIGFzIGEgcGVuZGluZyBvcCAtIHRoaXMgaXMgd2hhdCB3ZSBuZWVkIHRvIGZsdXNoXG4gICAgICBzdGF0ZS5wZW5kaW5nT3BzKys7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB3cml0ZXIud3JpdGUocmVhZFJlc3VsdC52YWx1ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzdGF0ZS5wZW5kaW5nT3BzLS07XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBzdGF0ZS5zdHJlYW1FbmRlZCA9IHRydWU7XG4gICAgY2FuY2VsUmVhc29uID0gZXJyO1xuICAgIGlmICghc3RhdGUuZG9uZVJlc29sdmVkKSB7XG4gICAgICBzdGF0ZS5kb25lUmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgc3RhdGUucmVqZWN0KGVycik7XG4gICAgfVxuICAgIC8vIFByb3BhZ2F0ZSBlcnJvciB0aHJvdWdoIGZsdXNoYWJsZVBpcGUncyBvd24gcHJvbWlzZSBhcyB3ZWxsLlxuICAgIC8vIENhbGxlcnMgdGhhdCByZWx5IG9uIHRoZSBGbHVzaGFibGVTdHJlYW1TdGF0ZSBzaG91bGQgdXNlIGBzdGF0ZS5wcm9taXNlYCxcbiAgICAvLyB3aGlsZSBvdGhlciBjYWxsZXJzIG1heSBkZXBlbmQgb24gdGhpcyByZWplY3Rpb24uIFNvbWUga25vd24gY2FsbGVyc1xuICAgIC8vIGV4cGxpY2l0bHkgaWdub3JlIHRoaXMgcmVqZWN0aW9uIChgLmNhdGNoKCgpID0+IHt9KWApIGFuZCByZWx5IHNvbGVseVxuICAgIC8vIG9uIGBzdGF0ZS5yZWplY3QoZXJyKWAgZm9yIGVycm9yIGhhbmRsaW5nLlxuICAgIHRocm93IGVycjtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBDYW5jZWwgdGhlIHVwc3RyZWFtIHJlYWRlciBzbyB0aGUgc291cmNlIGtub3dzIHRvIHN0b3AgZ2VuZXJhdGluZyBkYXRhLlxuICAgIC8vIFVzZXMgY2FuY2VsUmVhc29uIChzZXQgaW4gdGhlIGNhdGNoIGJsb2NrKSBzbyB0aGUgc291cmNlIHJlY2VpdmVzIGNvbnRleHRcbiAgICAvLyBhYm91dCB3aHkgaXQgd2FzIGNhbmNlbGxlZC4gT24gbm9ybWFsIGNvbXBsZXRpb24gY2FuY2VsUmVhc29uIGlzIHVuZGVmaW5lZCxcbiAgICAvLyB3aGljaCBpcyBhIGhhcm1sZXNzIG5vLW9wIG9uIGFuIGFscmVhZHktZG9uZSByZWFkZXIuXG4gICAgcmVhZGVyLmNhbmNlbChjYW5jZWxSZWFzb24pLmNhdGNoKCgpID0+IHt9KTtcbiAgICByZWFkZXIucmVsZWFzZUxvY2soKTtcbiAgICB3cml0ZXIucmVsZWFzZUxvY2soKTtcbiAgfVxufVxuXG4vKipcbiAqIFNoYXJlZCwgbXV0YWJsZSBjb29yZGluYXRpb24gc3RhdGUgYmV0d2VlbiB0aGUgY29hbGVzY2luZyBwaXBlJ3MgcHJvZHVjZXJcbiAqIChyZWFkcyBmcm9tIHNvdXJjZSBpbnRvIGBxdWV1ZWApIGFuZCBjb25zdW1lciAoZHJhaW5zIGBxdWV1ZWAgaW4gYmF0Y2hlcykuXG4gKi9cbmludGVyZmFjZSBDb2FsZXNjZUNvbnRleHQge1xuICBzdGF0ZTogRmx1c2hhYmxlU3RyZWFtU3RhdGU7XG4gIGJhdGNoV3JpdGU6IEJhdGNoV3JpdGU7XG4gIC8qKiBDaHVua3MgcmVhZCBidXQgbm90IHlldCBoYW5kZWQgdG8gYSBiYXRjaCB3cml0ZS4gKi9cbiAgcXVldWU6IFVpbnQ4QXJyYXlbXTtcbiAgLyoqIFNldCBvbmNlIHRoZSBzb3VyY2UgaGFzIHJlcG9ydGVkIGBkb25lYC4gKi9cbiAgc291cmNlRG9uZTogYm9vbGVhbjtcbiAgLyoqIFJlc29sdmVyIHRoYXQgd2FrZXMgdGhlIGNvbnN1bWVyIHdoZW4gdGhlIHF1ZXVlIGdyb3dzIG9yIHRoZSBzb3VyY2UgZW5kcy4gKi9cbiAgd2FrZUNvbnN1bWVyOiAoKCkgPT4gdm9pZCkgfCBudWxsO1xuICAvKiogUmVzb2x2ZXIgdGhhdCB3YWtlcyB0aGUgcHJvZHVjZXIgd2hlbiB0aGUgY29uc3VtZXIgcmVsaWV2ZXMgYmFja3ByZXNzdXJlLiAqL1xuICB3YWtlUHJvZHVjZXI6ICgoKSA9PiB2b2lkKSB8IG51bGw7XG4gIC8qKiBXaXJlIGxpbWl0OiBtYXggY2h1bmtzIHBlciBjb2FsZXNjZWQgYHdyaXRlTXVsdGlgLiAqL1xuICBtYXhDaHVua3NQZXJCYXRjaDogbnVtYmVyO1xuICAvKiogV2lyZSBsaW1pdDogbWF4IGN1bXVsYXRpdmUgYnl0ZXMgcGVyIGNvYWxlc2NlZCBgd3JpdGVNdWx0aWAuICovXG4gIG1heEJ5dGVzUGVyQmF0Y2g6IG51bWJlcjtcbn1cblxuZnVuY3Rpb24gd2FrZShjdHg6IENvYWxlc2NlQ29udGV4dCwgd2hpY2g6ICd3YWtlQ29uc3VtZXInIHwgJ3dha2VQcm9kdWNlcicpIHtcbiAgY29uc3QgcmVzb2x2ZSA9IGN0eFt3aGljaF07XG4gIGlmIChyZXNvbHZlKSB7XG4gICAgY3R4W3doaWNoXSA9IG51bGw7XG4gICAgcmVzb2x2ZSgpO1xuICB9XG59XG5cbi8qKlxuICogSG93IG1hbnkgbGVhZGluZyBxdWV1ZWQgY2h1bmtzIGZpdCBpbiBvbmUgYHdyaXRlTXVsdGlgIHdpdGhvdXQgY3Jvc3NpbmcgdGhlXG4gKiBjaHVuay1jb3VudCBvciBieXRlIHdpcmUgbGltaXRzLiBBbHdheXMgcmV0dXJucyBhdCBsZWFzdCAxIHNvIGEgc2luZ2xlIGNodW5rXG4gKiBsYXJnZXIgdGhhbiB0aGUgYnl0ZSBjYXAgc3RpbGwgbWFrZXMgcHJvZ3Jlc3MgKGFsb25lKS5cbiAqL1xuZnVuY3Rpb24gbmV4dEJhdGNoU2l6ZShjdHg6IENvYWxlc2NlQ29udGV4dCk6IG51bWJlciB7XG4gIGxldCBjb3VudCA9IDA7XG4gIGxldCBieXRlcyA9IDA7XG4gIGZvciAoY29uc3QgY2h1bmsgb2YgY3R4LnF1ZXVlKSB7XG4gICAgaWYgKGNvdW50ID49IGN0eC5tYXhDaHVua3NQZXJCYXRjaCkgYnJlYWs7XG4gICAgaWYgKGNvdW50ID4gMCAmJiBieXRlcyArIGNodW5rLmJ5dGVMZW5ndGggPiBjdHgubWF4Qnl0ZXNQZXJCYXRjaCkgYnJlYWs7XG4gICAgY291bnQrKztcbiAgICBieXRlcyArPSBjaHVuay5ieXRlTGVuZ3RoO1xuICB9XG4gIHJldHVybiBjb3VudDtcbn1cblxuLyoqXG4gKiBDb25zdW1lciBsb29wOiBkcmFpbnMgdGhlIHF1ZXVlIG9uZSBiYXRjaCBhdCBhIHRpbWUsIGF3YWl0aW5nIGVhY2ggYmF0Y2ggc28gaXRcbiAqIGlzIGR1cmFibGUgb24gdGhlIHNlcnZlciBiZWZvcmUgaXRzIGNodW5rcyBsZWF2ZSBgcGVuZGluZ09wc2AuIEl0IHRha2VzIGFzXG4gKiBtdWNoIG9mIHRoZSBxdWV1ZSBhcyB0aGUgd2lyZSBsaW1pdHMgYWxsb3cgZWFjaCByb3VuZCwgc28gY2h1bmtzIHRoYXQgYXJyaXZlZFxuICogd2hpbGUgdGhlIHByZXZpb3VzIGJhdGNoIHdhcyBpbiBmbGlnaHQgY29hbGVzY2UgaW50byB0aGUgbmV4dCBzZXJ2ZXIgd3JpdGUuXG4gKlxuICogYHBlbmRpbmdPcHNgIGlzIGRlY3JlbWVudGVkIG9ubHkgYWZ0ZXIgYGJhdGNoV3JpdGVgICpzdWNjZWVkcyo6IG9uIGZhaWx1cmUgdGhlXG4gKiBjaHVua3Mgc3RheSByZXRhaW5lZCBpbiB0aGUgc2luaydzIGJ1ZmZlciAoc2VlIGBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtYClcbiAqIGFuZCBhcmUgdGhlcmVmb3JlIHN0aWxsIFwicmVhZCBidXQgbm90IGR1cmFibGVcIiwgc28gdGhleSBtdXN0IGtlZXAgY291bnRpbmcuXG4gKiBBIHRocm93IHByb3BhZ2F0ZXMgb3V0IG9mIHRoZSBsb29wOyB0aGUgcGlwZSdzIHByb2R1Y2VyIHRoZW4gdGVhcnMgZG93bi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZHJhaW5CYXRjaGVzKGN0eDogQ29hbGVzY2VDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgaWYgKGN0eC5xdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgIGlmIChjdHguc291cmNlRG9uZSkgcmV0dXJuO1xuICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgY3R4Lndha2VDb25zdW1lciA9IHJlc29sdmU7XG4gICAgICB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBjb3VudCA9IG5leHRCYXRjaFNpemUoY3R4KTtcbiAgICBjb25zdCBiYXRjaCA9IGN0eC5xdWV1ZS5zbGljZSgwLCBjb3VudCk7XG4gICAgY3R4LnF1ZXVlID0gY3R4LnF1ZXVlLnNsaWNlKGNvdW50KTtcbiAgICBhd2FpdCBjdHguYmF0Y2hXcml0ZShiYXRjaCk7XG4gICAgY3R4LnN0YXRlLnBlbmRpbmdPcHMgLT0gYmF0Y2gubGVuZ3RoO1xuICAgIC8vIFJlbGlldmUgcHJvZHVjZXIgYmFja3ByZXNzdXJlIG5vdyB0aGF0IHRoaXMgYmF0Y2ggaXMgZHVyYWJsZS5cbiAgICB3YWtlKGN0eCwgJ3dha2VQcm9kdWNlcicpO1xuICB9XG59XG5cbi8qKlxuICogQXdhaXQgdGhlIG5leHQgY2h1bmsgd2hpbGUgYSBiYXRjaCB3cml0ZSBpcyBpbiBmbGlnaHQsIHJhY2luZyB0aHJlZSBvdXRjb21lczpcbiAqIGEgcmVhZCByZXN1bHQsIHRoZSBzaW5rIGNsb3NpbmcgdW5kZXIgdXMsIG9yIGEgc2VydmVyLXdyaXRlIGZhaWx1cmUgZnJvbSB0aGVcbiAqIGNvbnN1bWVyIChzdXJmYWNlZCBwcm9tcHRseSBldmVuIHdoaWxlIGJsb2NrZWQgb24gdGhlIHJlYWQpLiBPbiBub3JtYWxcbiAqIGNvbXBsZXRpb24gdGhlIGNvbnN1bWVyIG9ubHkgc2V0dGxlcyBhZnRlciB0aGUgcHJvZHVjZXIgc2V0cyBgc291cmNlRG9uZWAsIHNvXG4gKiBpdHMgYnJhbmNoIHRocm93cyBvbmx5IG9uIHJlYWwgZmFpbHVyZS5cbiAqL1xuZnVuY3Rpb24gcmVhZE5leHRDaHVuayhcbiAgcmVhZGVyOiBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIsXG4gIHdyaXRlcjogV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyLFxuICBjb25zdW1lcjogUHJvbWlzZTx2b2lkPlxuKTogUHJvbWlzZTxBd2FpdGVkPFJldHVyblR5cGU8UmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyWydyZWFkJ10+Pj4ge1xuICByZXR1cm4gUHJvbWlzZS5yYWNlKFtcbiAgICByZWFkZXIucmVhZCgpLFxuICAgIHdyaXRlci5jbG9zZWQudGhlbigoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoJ1dyaXRhYmxlIHN0cmVhbSBjbG9zZWQgcHJlbWF0dXJlbHknKTtcbiAgICB9KSxcbiAgICBjb25zdW1lci50aGVuKFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoJ1N0cmVhbSBjb25zdW1lciBlbmRlZCBwcmVtYXR1cmVseScpO1xuICAgICAgfSxcbiAgICAgIChlcnIpID0+IHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICksXG4gIF0pO1xufVxuXG4vKipcbiAqIEJhY2twcmVzc3VyZTogb25jZSB0b28gbWFueSBjaHVua3MgYXJlIG91dHN0YW5kaW5nLCBzdG9wIHJlYWRpbmcgdW50aWwgdGhlXG4gKiBjb25zdW1lciBkcmFpbnMgYSBiYXRjaC4gUmFjaW5nIHRoZSBjb25zdW1lciBhdm9pZHMgYSBkZWFkbG9jayBpZiBpdCBlbmRzIG9yXG4gKiBmYWlscyB3aGlsZSB3ZSB3YWl0LlxuICovXG5hc3luYyBmdW5jdGlvbiBhd2FpdEJhY2twcmVzc3VyZVJlbGllZihcbiAgY3R4OiBDb2FsZXNjZUNvbnRleHQsXG4gIGNvbnN1bWVyOiBQcm9taXNlPHZvaWQ+LFxuICBtYXhJbmZsaWdodDogbnVtYmVyXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGN0eC5zdGF0ZS5wZW5kaW5nT3BzIDwgbWF4SW5mbGlnaHQpIHJldHVybjtcbiAgYXdhaXQgUHJvbWlzZS5yYWNlKFtcbiAgICBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgY3R4Lndha2VQcm9kdWNlciA9IHJlc29sdmU7XG4gICAgfSksXG4gICAgY29uc3VtZXIudGhlbihcbiAgICAgICgpID0+IHVuZGVmaW5lZCxcbiAgICAgICgpID0+IHVuZGVmaW5lZFxuICAgICksXG4gIF0pO1xufVxuXG4vKipcbiAqIEJhdGNoaW5nIHZhcmlhbnQgb2Yge0BsaW5rIGZsdXNoYWJsZVBpcGV9IGZvciBzaW5rcyB0aGF0IGV4cG9zZSBhIGR1cmFibGVcbiAqIGJhdGNoIHdyaXRlICh7QGxpbmsgU1RSRUFNX1dSSVRFX0JBVENIX1NZTUJPTH0pLiBBIHByb2R1Y2VyIHJlYWRzIGZyb21cbiAqIGBzb3VyY2VgIGludG8gYSBxdWV1ZTsge0BsaW5rIGRyYWluQmF0Y2hlc30gY29hbGVzY2VzIHF1ZXVlZCBjaHVua3MgaW50byBhc1xuICogZmV3IHNlcnZlciB3cml0ZXMgYXMgcG9zc2libGUg4oCUIHR1cm5pbmcgYSBmYXN0IGJ1cnN0IG9mIGNodW5rcyBpbnRvIGEgaGFuZGZ1bFxuICogb2Ygcm91bmQgdHJpcHMgaW5zdGVhZCBvZiBvbmUgcGVyIGNodW5rLlxuICpcbiAqIER1cmFiaWxpdHkgaXMgcHJlc2VydmVkIGV4YWN0bHkgYXMgaW4gdGhlIHBlci1jaHVuayBwYXRoOiBgc3RhdGUucGVuZGluZ09wc2BcbiAqIGNvdW50cyBjaHVua3MgdGhhdCBoYXZlIGJlZW4gcmVhZCBidXQgbm90IHlldCBkdXJhYmx5IHdyaXR0ZW4sIHNvIHRoZVxuICogbG9jay1yZWxlYXNlIGNvbXBsZXRpb24gKGBwb2xsV3JpdGFibGVMb2NrYCAvIGBwb2xsUmVhZGFibGVMb2NrYCkgbmV2ZXIgZmlyZXNcbiAqIHdoaWxlIGRhdGEgaXMgc3RpbGwgcXVldWVkIG9yIGluIGZsaWdodCwgYW5kIHRoZSBzb3VyY2UtZG9uZSBwYXRoIGF3YWl0cyBldmVyeVxuICogYmF0Y2ggYmVmb3JlIGNsb3NpbmcuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZsdXNoYWJsZVBpcGVDb2FsZXNjaW5nKFxuICBzb3VyY2U6IFJlYWRhYmxlU3RyZWFtLFxuICBzaW5rOiBXcml0YWJsZVN0cmVhbSxcbiAgc3RhdGU6IEZsdXNoYWJsZVN0cmVhbVN0YXRlLFxuICBiYXRjaFdyaXRlOiBCYXRjaFdyaXRlXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVhZGVyID0gc291cmNlLmdldFJlYWRlcigpO1xuICBjb25zdCB3cml0ZXIgPSBzaW5rLmdldFdyaXRlcigpO1xuICBjb25zdCBtYXhJbmZsaWdodCA9IGdldE1heEluZmxpZ2h0Q2h1bmtzKCk7XG4gIGxldCBjYW5jZWxSZWFzb246IHVua25vd247XG5cbiAgY29uc3QgY3R4OiBDb2FsZXNjZUNvbnRleHQgPSB7XG4gICAgc3RhdGUsXG4gICAgYmF0Y2hXcml0ZSxcbiAgICBxdWV1ZTogW10sXG4gICAgc291cmNlRG9uZTogZmFsc2UsXG4gICAgd2FrZUNvbnN1bWVyOiBudWxsLFxuICAgIHdha2VQcm9kdWNlcjogbnVsbCxcbiAgICBtYXhDaHVua3NQZXJCYXRjaDogZ2V0TWF4Q2h1bmtzUGVyQmF0Y2goKSxcbiAgICBtYXhCeXRlc1BlckJhdGNoOiBnZXRNYXhCeXRlc1BlckJhdGNoKCksXG4gIH07XG4gIGNvbnN0IGNvbnN1bWVyID0gZHJhaW5CYXRjaGVzKGN0eCk7XG5cbiAgdHJ5IHtcbiAgICB3aGlsZSAoIXN0YXRlLnN0cmVhbUVuZGVkKSB7XG4gICAgICBjb25zdCByZWFkUmVzdWx0ID0gYXdhaXQgcmVhZE5leHRDaHVuayhyZWFkZXIsIHdyaXRlciwgY29uc3VtZXIpO1xuICAgICAgaWYgKHN0YXRlLnN0cmVhbUVuZGVkKSByZXR1cm47XG5cbiAgICAgIGlmIChyZWFkUmVzdWx0LmRvbmUpIHtcbiAgICAgICAgLy8gU2lnbmFsIGVuZC1vZi1zb3VyY2UgYW5kIHdhaXQgZm9yIGV2ZXJ5IHF1ZXVlZC9pbi1mbGlnaHQgYmF0Y2ggdG9cbiAgICAgICAgLy8gcmVhY2ggdGhlIHNlcnZlciBiZWZvcmUgY2xvc2luZywgc28gbm8gY2h1bmsgaXMgZHJvcHBlZC5cbiAgICAgICAgY3R4LnNvdXJjZURvbmUgPSB0cnVlO1xuICAgICAgICB3YWtlKGN0eCwgJ3dha2VDb25zdW1lcicpO1xuICAgICAgICBhd2FpdCBjb25zdW1lcjtcbiAgICAgICAgc3RhdGUuc3RyZWFtRW5kZWQgPSB0cnVlO1xuICAgICAgICBhd2FpdCB3cml0ZXIuY2xvc2UoKTtcbiAgICAgICAgaWYgKCFzdGF0ZS5kb25lUmVzb2x2ZWQpIHtcbiAgICAgICAgICBzdGF0ZS5kb25lUmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICAgIHN0YXRlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIENvdW50IHRoZSBjaHVuayBhcyBwZW5kaW5nIHRoZSBtb21lbnQgaXQgaXMgcmVhZCDigJQgaXQgc3RheXMgY291bnRlZFxuICAgICAgLy8gdW50aWwgaXRzIGJhdGNoIGlzIGR1cmFibHkgd3JpdHRlbi5cbiAgICAgIGN0eC5xdWV1ZS5wdXNoKHJlYWRSZXN1bHQudmFsdWUgYXMgVWludDhBcnJheSk7XG4gICAgICBzdGF0ZS5wZW5kaW5nT3BzKys7XG4gICAgICB3YWtlKGN0eCwgJ3dha2VDb25zdW1lcicpO1xuXG4gICAgICBhd2FpdCBhd2FpdEJhY2twcmVzc3VyZVJlbGllZihjdHgsIGNvbnN1bWVyLCBtYXhJbmZsaWdodCk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBzdGF0ZS5zdHJlYW1FbmRlZCA9IHRydWU7XG4gICAgY2FuY2VsUmVhc29uID0gZXJyO1xuICAgIC8vIExldCB0aGUgY29uc3VtZXIgc2V0dGxlIHNvIGl0cyByZWplY3Rpb24gKGlmIGFueSkgaXMgb2JzZXJ2ZWQgaGVyZSByYXRoZXJcbiAgICAvLyB0aGFuIHN1cmZhY2luZyBhcyBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uLlxuICAgIGN0eC5zb3VyY2VEb25lID0gdHJ1ZTtcbiAgICB3YWtlKGN0eCwgJ3dha2VDb25zdW1lcicpO1xuICAgIGF3YWl0IGNvbnN1bWVyLmNhdGNoKCgpID0+IHt9KTtcbiAgICBpZiAoIXN0YXRlLmRvbmVSZXNvbHZlZCkge1xuICAgICAgc3RhdGUuZG9uZVJlc29sdmVkID0gdHJ1ZTtcbiAgICAgIHN0YXRlLnJlamVjdChlcnIpO1xuICAgIH1cbiAgICB0aHJvdyBlcnI7XG4gIH0gZmluYWxseSB7XG4gICAgcmVhZGVyLmNhbmNlbChjYW5jZWxSZWFzb24pLmNhdGNoKCgpID0+IHt9KTtcbiAgICByZWFkZXIucmVsZWFzZUxvY2soKTtcbiAgICB3cml0ZXIucmVsZWFzZUxvY2soKTtcbiAgfVxufVxuIl19
339
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmx1c2hhYmxlLXN0cmVhbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9mbHVzaGFibGUtc3RyZWFtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3hELE9BQU8sRUFBNkIsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQVNuRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQztBQUV4QyxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxHQUFXLEVBQUUsQ0FDL0MsU0FBUyxDQUFDLHFDQUFxQyxFQUFFLG1CQUFtQixFQUFFO0lBQ3BFLE9BQU8sRUFBRSxJQUFJO0lBQ2IsR0FBRyxFQUFFLENBQUM7Q0FDUCxDQUFDLENBQUM7QUFFTDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQztBQUV6QyxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxHQUFXLEVBQUUsQ0FDL0MsU0FBUyxDQUFDLHNDQUFzQyxFQUFFLG9CQUFvQixFQUFFO0lBQ3RFLE9BQU8sRUFBRSxJQUFJO0lBQ2IsR0FBRyxFQUFFLENBQUM7Q0FDUCxDQUFDLENBQUM7QUFFTDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUUvQyxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxHQUFXLEVBQUUsQ0FDOUMsU0FBUyxDQUFDLHFDQUFxQyxFQUFFLG1CQUFtQixFQUFFO0lBQ3BFLE9BQU8sRUFBRSxJQUFJO0lBQ2IsR0FBRyxFQUFFLENBQUM7Q0FDUCxDQUFDLENBQUM7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ZXJyb3JzJztcbmltcG9ydCB7IHR5cGUgUHJvbWlzZVdpdGhSZXNvbHZlcnMsIHdpdGhSZXNvbHZlcnMgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHsgZW52TnVtYmVyIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IFNUUkVBTV9EUkFJTl9TWU1CT0wgfSBmcm9tICcuL3N5bWJvbHMuanMnO1xuXG4vKipcbiAqIEEgZHVyYWJpbGl0eSBiYXJyaWVyIGEgc2luayBtYXkgZXhwb3NlIHVuZGVyIHtAbGluayBTVFJFQU1fRFJBSU5fU1lNQk9MfTpcbiAqIHJlc29sdmVzIG9uY2UgZXZlcnkgY2h1bmsgdGhlIHNpbmsgaGFzIGFjY2VwdGVkIGlzIGR1cmFibHkgd3JpdHRlbiwgcmVqZWN0c1xuICogaWYgYW55IHNlcnZlciB3cml0ZSBmYWlsZWQuIFNlZSBgV29ya2Zsb3dTZXJ2ZXJXcml0YWJsZVN0cmVhbWAuXG4gKi9cbnR5cGUgRHJhaW5CYXJyaWVyID0gKCkgPT4gUHJvbWlzZTx2b2lkPjtcblxuLyoqXG4gKiBGbG93LWNvbnRyb2wga25vYjogdXBwZXIgYm91bmQgb24gY2h1bmtzIHJlYWQtYnV0LW5vdC15ZXQtZHVyYWJseS13cml0dGVuXG4gKiB3aGlsZSBjb2FsZXNjaW5nLiBPbmNlIHRoaXMgbWFueSBjaHVua3MgYXJlIG91dHN0YW5kaW5nIHRoZSBwcm9kdWNlciBzdG9wc1xuICogcmVhZGluZyB1bnRpbCB0aGUgY29uc3VtZXIgZHJhaW5zIGEgYmF0Y2gsIHNvIGEgZmFzdCBwcm9kdWNlciBwYWlyZWQgd2l0aCBhXG4gKiBzbG93IHNlcnZlciBjYW4ndCBncm93IHRoZSBpbi1tZW1vcnkgcXVldWUgd2l0aG91dCBib3VuZC4gT3ZlcnJpZGU6XG4gKiBgV09SS0ZMT1dfU1RSRUFNX01BWF9JTkZMSUdIVF9DSFVOS1NgLlxuICpcbiAqIFRoaXMgaXMgZGVsaWJlcmF0ZWx5IGRpc3RpbmN0IGZyb20gdGhlIHBlci1yZXF1ZXN0IGJhdGNoIGNhcHMgYmVsb3c6IHRoaXNcbiAqIGJvdW5kcyBob3cgbXVjaCBpcyAqYnVmZmVyZWQqLCB0aG9zZSBib3VuZCBob3cgbXVjaCBnb2VzIG91dCBpbiBvbmVcbiAqIGB3cml0ZU11bHRpYC4gUmFpc2luZyB0aGlzIG11c3QgbmV2ZXIgbGV0IGEgc2luZ2xlIHJlcXVlc3QgZXhjZWVkIGEgd2lyZVxuICogbGltaXQg4oCUIGJhdGNoIHNpemluZyBlbmZvcmNlcyB0aGF0IGluZGVwZW5kZW50bHkuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfSU5GTElHSFRfQ0hVTktTID0gMTAwMDtcblxuZXhwb3J0IGNvbnN0IGdldE1heEluZmxpZ2h0Q2h1bmtzID0gKCk6IG51bWJlciA9PlxuICBlbnZOdW1iZXIoJ1dPUktGTE9XX1NUUkVBTV9NQVhfSU5GTElHSFRfQ0hVTktTJywgTUFYX0lORkxJR0hUX0NIVU5LUywge1xuICAgIGludGVnZXI6IHRydWUsXG4gICAgbWluOiAxLFxuICB9KTtcblxuLyoqXG4gKiBXaXJlIGxpbWl0OiBtYXhpbXVtIG51bWJlciBvZiBjaHVua3MgaW4gYSBzaW5nbGUgY29hbGVzY2VkIGB3cml0ZU11bHRpYC5cbiAqIFRoZSBzZXJ2ZXIgZW5mb3JjZXMgYSBwZXItbXVsdGktd3JpdGUgY2h1bmsgY2FwICgxLDAwMCB0b2RheSk7IGEgYmF0Y2ggaXNcbiAqIHNwbGl0IGF0IHRoaXMgYm91bmQgc28gaXQgY2FuIG5ldmVyIGJlIHJlamVjdGVkIHdob2xlc2FsZSwgaW5kZXBlbmRlbnRseSBvZlxuICogdGhlIGJhY2twcmVzc3VyZSBrbm9iIGFib3ZlLiBPdmVycmlkZTogYFdPUktGTE9XX1NUUkVBTV9NQVhfQ0hVTktTX1BFUl9CQVRDSGAuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfQ0hVTktTX1BFUl9CQVRDSCA9IDEwMDA7XG5cbmV4cG9ydCBjb25zdCBnZXRNYXhDaHVua3NQZXJCYXRjaCA9ICgpOiBudW1iZXIgPT5cbiAgZW52TnVtYmVyKCdXT1JLRkxPV19TVFJFQU1fTUFYX0NIVU5LU19QRVJfQkFUQ0gnLCBNQVhfQ0hVTktTX1BFUl9CQVRDSCwge1xuICAgIGludGVnZXI6IHRydWUsXG4gICAgbWluOiAxLFxuICB9KTtcblxuLyoqXG4gKiBXaXJlIGxpbWl0OiBtYXhpbXVtIGN1bXVsYXRpdmUgYnl0ZXMgaW4gYSBzaW5nbGUgY29hbGVzY2VkIGB3cml0ZU11bHRpYC5cbiAqIENodW5rICpjb3VudCogYWxvbmUgaXMgbm90IGVub3VnaCDigJQgMSwwMDAgc21hbGwgY2h1bmtzIGFyZSB+MTAwS0IgYnV0IDEsMDAwXG4gKiBmaWxlLXNpemVkIGNodW5rcyBjYW4gYmUgaHVuZHJlZHMgb2YgTUIsIHdoaWNoIHBsYXRmb3JtIHJlcXVlc3QtYm9keSBsaW1pdHNcbiAqIHJlamVjdCBsb25nIGJlZm9yZSB0aGUgY291bnQgY2FwIG1hdHRlcnMuIEEgYmF0Y2ggaXMgc3BsaXQgb25jZSBhZGRpbmcgdGhlXG4gKiBuZXh0IGNodW5rIHdvdWxkIGV4Y2VlZCB0aGlzIChhIHNpbmdsZSBjaHVuayBsYXJnZXIgdGhhbiB0aGUgY2FwIHN0aWxsIGdvZXNcbiAqIG91dCBhbG9uZSkuIERlZmF1bHQgMSBNaUIuIE92ZXJyaWRlOiBgV09SS0ZMT1dfU1RSRUFNX01BWF9CWVRFU19QRVJfQkFUQ0hgLlxuICovXG5leHBvcnQgY29uc3QgTUFYX0JZVEVTX1BFUl9CQVRDSCA9IDEwMjQgKiAxMDI0O1xuXG5leHBvcnQgY29uc3QgZ2V0TWF4Qnl0ZXNQZXJCYXRjaCA9ICgpOiBudW1iZXIgPT5cbiAgZW52TnVtYmVyKCdXT1JLRkxPV19TVFJFQU1fTUFYX0JZVEVTX1BFUl9CQVRDSCcsIE1BWF9CWVRFU19QRVJfQkFUQ0gsIHtcbiAgICBpbnRlZ2VyOiB0cnVlLFxuICAgIG1pbjogMSxcbiAgfSk7XG5cbi8qKlxuICogQnVmZmVyIGJvdW5kIChieXRlcykgZm9yIHRoZSBzZXJ2ZXIgd3JpdGFibGUncyBncm91cC1jb21taXQgYnVmZmVyIOKAlCB0aGVcbiAqIGJ5dGUtZGVub21pbmF0ZWQgY291bnRlcnBhcnQgb2Yge0BsaW5rIE1BWF9JTkZMSUdIVF9DSFVOS1N9LiBgd3JpdGUoKWBcbiAqIGJsb2NrcyBvbmNlIHRoaXMgbXVjaCBkYXRhIGlzIGJ1ZmZlcmVkLWJ1dC1ub3QtZHVyYWJsZSwgc28gYSBmYXN0IHByb2R1Y2VyXG4gKiBvZiBsYXJnZSBjaHVua3MgY2FuJ3QgZ3JvdyBjbGllbnQgbWVtb3J5IHdpdGhvdXQgYm91bmQuIERlZmF1bHQgOCBNaUJcbiAqIChlaWdodCByZXF1ZXN0LXNpemVkIGdyb3VwcykuIE92ZXJyaWRlOiBgV09SS0ZMT1dfU1RSRUFNX01BWF9CVUZGRVJFRF9CWVRFU2AuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfQlVGRkVSRURfQllURVMgPSA4ICogMTAyNCAqIDEwMjQ7XG5cbmV4cG9ydCBjb25zdCBnZXRNYXhCdWZmZXJlZEJ5dGVzID0gKCk6IG51bWJlciA9PlxuICBlbnZOdW1iZXIoJ1dPUktGTE9XX1NUUkVBTV9NQVhfQlVGRkVSRURfQllURVMnLCBNQVhfQlVGRkVSRURfQllURVMsIHtcbiAgICBpbnRlZ2VyOiB0cnVlLFxuICAgIG1pbjogMSxcbiAgfSk7XG5cbi8qKlxuICogUG9sbGluZyBpbnRlcnZhbCAoaW4gbXMpIGZvciBsb2NrIHJlbGVhc2UgZGV0ZWN0aW9uLlxuICpcbiAqIFRoZSBXZWIgU3RyZWFtcyBBUEkgZG9lcyBub3QgZXhwb3NlIGFuIGV2ZW50IGZvciBcImxvY2sgcmVsZWFzZWQgYnV0IHN0cmVhbVxuICogc3RpbGwgb3BlblwiOyB3ZSBjYW4gb25seSBkaXN0aW5ndWlzaCB0aGF0IHN0YXRlIGJ5IHBlcmlvZGljYWxseSBhdHRlbXB0aW5nXG4gKiB0byBhY3F1aXJlIGEgcmVhZGVyL3dyaXRlci4gRm9yIHRoYXQgcmVhc29uIHdlIHVzZSBwb2xsaW5nIGluc3RlYWQgb2YgYVxuICogZnVsbHkgZXZlbnQtZHJpdmVuIGFwcHJvYWNoIGhlcmUuXG4gKlxuICogMTBtcyBpcyBjaG9zZW4gc28gdGhlIHBvbGxpbmcgdGljayBhbG1vc3QgbmV2ZXIgc2l0cyBvbiB0aGUgY3JpdGljYWwgcGF0aDpcbiAqIHRoZSBWMiBzdGVwLWV4ZWN1dG9yJ3MgYG9wc1NldHRsZWRgIHJhY2Ugd2FpdHMgZm9yIHRoaXMgc3RhdGUgdG8gcmVzb2x2ZVxuICogYWZ0ZXIgZWFjaCBzdGVwIGJvZHkgcmV0dXJucywgc28gYSBjb2Fyc2VyIGludGVydmFsICh0aGUgcHJldmlvdXMgMTAwbXMpXG4gKiBhZGRzIHZpc2libGUgcGVyLXN0ZXAgbGF0ZW5jeSB0byBzdHJlYW1pbmcgd29ya2Zsb3dzLiBXaXRoIGEgdW5pZm9ybWx5XG4gKiBkaXN0cmlidXRlZCBvZmZzZXQgYmV0d2VlbiBzdGVwIHJldHVybiBhbmQgdGhlIG5leHQgdGljaywgdGhlIGV4cGVjdGVkXG4gKiB3YWl0IGlzIGhhbGYgdGhlIGludGVydmFsIOKAlCBzbyAxMG1zIG1lYW5zIH41bXMgYXZlcmFnZSB3YWl0IHBlciBzdGVwXG4gKiBpbnN0ZWFkIG9mIH41MG1zLiBUaGUgcGVyLXRpY2sgd29yayBpcyBgd3JpdGFibGUubG9ja2VkYCBwbHVzIGFcbiAqIGBnZXRXcml0ZXIoKWAvYHJlbGVhc2VMb2NrKClgIHByb2JlLCBib3RoIG1pY3Jvc2Vjb25kLXNjYWxlOyAxMMOXIG1vcmVcbiAqIHRpY2tzIGR1cmluZyBhIHN0cmVhbSdzIGxpZmV0aW1lIGlzIG5vdCBtZWFzdXJhYmxlIGluIHByYWN0aWNlLlxuICovXG5leHBvcnQgY29uc3QgTE9DS19QT0xMX0lOVEVSVkFMX01TID0gMTA7XG5cbi8qKiBFZmZlY3RpdmUgbG9jay1wb2xsIGludGVydmFsLiBPdmVycmlkZTogYFdPUktGTE9XX0xPQ0tfUE9MTF9JTlRFUlZBTF9NU2AuICovXG5jb25zdCBnZXRMb2NrUG9sbEludGVydmFsTXMgPSAoKTogbnVtYmVyID0+XG4gIGVudk51bWJlcignV09SS0ZMT1dfTE9DS19QT0xMX0lOVEVSVkFMX01TJywgTE9DS19QT0xMX0lOVEVSVkFMX01TLCB7XG4gICAgaW50ZWdlcjogdHJ1ZSxcbiAgICBtaW46IDEsXG4gIH0pO1xuXG4vKipcbiAqIFN0YXRlIHRyYWNrZXIgZm9yIGZsdXNoYWJsZSBzdHJlYW0gb3BlcmF0aW9ucy5cbiAqIFJlc29sdmVzIHdoZW4gZWl0aGVyOlxuICogMS4gU3RyZWFtIGNvbXBsZXRlcyAoY2xvc2UvZXJyb3IpLCBPUlxuICogMi4gTG9jayBpcyByZWxlYXNlZCBBTkQgYWxsIHBlbmRpbmcgb3BlcmF0aW9ucyBhcmUgZmx1c2hlZFxuICpcbiAqIE5vdGU6IGBkb25lUmVzb2x2ZWRgIGFuZCBgc3RyZWFtRW5kZWRgIGFyZSBzZXBhcmF0ZTpcbiAqIC0gYGRvbmVSZXNvbHZlZGA6IFRoZSBgZG9uZWAgcHJvbWlzZSBoYXMgYmVlbiByZXNvbHZlZCAoc3RlcCBjYW4gY29tcGxldGUpXG4gKiAtIGBzdHJlYW1FbmRlZGA6IFRoZSB1bmRlcmx5aW5nIHN0cmVhbSBoYXMgYWN0dWFsbHkgY2xvc2VkL2Vycm9yZWRcbiAqXG4gKiBPbmNlIGBkb25lUmVzb2x2ZWRgIGlzIHNldCB0byB0cnVlLCB0aGUgYGRvbmVgIHByb21pc2Ugd2lsbCBub3QgcmVzb2x2ZVxuICogYWdhaW4uIFJlLWFjcXVpcmluZyBsb2NrcyBhZnRlciByZWxlYXNlIGlzIG5vdCBzdXBwb3J0ZWQgYXMgYSB3YXkgdG9cbiAqIHRyaWdnZXIgYWRkaXRpb25hbCBjb21wbGV0aW9uIHNpZ25hbGluZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGbHVzaGFibGVTdHJlYW1TdGF0ZSBleHRlbmRzIFByb21pc2VXaXRoUmVzb2x2ZXJzPHZvaWQ+IHtcbiAgLyoqIE51bWJlciBvZiB3cml0ZSBvcGVyYXRpb25zIGN1cnJlbnRseSBpbiBmbGlnaHQgdG8gdGhlIHNlcnZlciAqL1xuICBwZW5kaW5nT3BzOiBudW1iZXI7XG4gIC8qKiBXaGV0aGVyIHRoZSBgZG9uZWAgcHJvbWlzZSBoYXMgYmVlbiByZXNvbHZlZCAqL1xuICBkb25lUmVzb2x2ZWQ6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSBoYXMgYWN0dWFsbHkgY2xvc2VkL2Vycm9yZWQgKi9cbiAgc3RyZWFtRW5kZWQ6IGJvb2xlYW47XG4gIC8qKiBJbnRlcnZhbCBJRCBmb3Igd3JpdGFibGUgbG9jayBwb2xsaW5nIChpZiBhY3RpdmUpICovXG4gIHdyaXRhYmxlUG9sbGluZ0ludGVydmFsPzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+O1xuICAvKiogSW50ZXJ2YWwgSUQgZm9yIHJlYWRhYmxlIGxvY2sgcG9sbGluZyAoaWYgYWN0aXZlKSAqL1xuICByZWFkYWJsZVBvbGxpbmdJbnRlcnZhbD86IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPjtcbiAgLyoqXG4gICAqIER1cmFiaWxpdHkgYmFycmllciBvZiB0aGUgcGlwZSdzIHNpbmssIHdoZW4gaXQgYWNrcyB3cml0ZXMgb24gYnVmZmVyXG4gICAqIGVudHJ5IChzZWUge0BsaW5rIFNUUkVBTV9EUkFJTl9TWU1CT0x9KS4gTG9jay1yZWxlYXNlIGNvbXBsZXRpb24gYXdhaXRzXG4gICAqIHRoaXMgYmVmb3JlIHJlc29sdmluZyBzbyBgcGVuZGluZ09wcyA9PT0gMGAgKGZhc3QsIGJ1ZmZlcmVkIGFja3MpIGNhbid0XG4gICAqIGNvbXBsZXRlIGEgc3RlcCB3aGlsZSBkYXRhIGlzIHN0aWxsIGNsaWVudC1zaWRlLlxuICAgKi9cbiAgZHJhaW5CYXJyaWVyPzogRHJhaW5CYXJyaWVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRmx1c2hhYmxlU3RhdGUoKTogRmx1c2hhYmxlU3RyZWFtU3RhdGUge1xuICBjb25zdCBzdGF0ZTogRmx1c2hhYmxlU3RyZWFtU3RhdGUgPSB7XG4gICAgLi4ud2l0aFJlc29sdmVyczx2b2lkPigpLFxuICAgIHBlbmRpbmdPcHM6IDAsXG4gICAgZG9uZVJlc29sdmVkOiBmYWxzZSxcbiAgICBzdHJlYW1FbmRlZDogZmFsc2UsXG4gIH07XG5cbiAgLy8gVGhlIHJ1bnRpbWUgYXdhaXRzIHRoaXMgcHJvbWlzZSBhZnRlciB1c2VyIGNvZGUgcmV0dXJucy4gT2JzZXJ2ZSBlYXJseVxuICAvLyBzdHJlYW0gZmFpbHVyZXMgbm93IHNvIHRoZXkgZG8gbm90IGJlY29tZSB1bmhhbmRsZWQgcmVqZWN0aW9ucyBmaXJzdC5cbiAgc3RhdGUucHJvbWlzZS5jYXRjaCgoKSA9PiB7fSk7XG5cbiAgcmV0dXJuIHN0YXRlO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIFdyaXRhYmxlU3RyZWFtIGlzIHVubG9ja2VkICh1c2VyIHJlbGVhc2VkIGxvY2spIHZzIGNsb3NlZC5cbiAqIFdoZW4gYSBzdHJlYW0gaXMgY2xvc2VkLCAubG9ja2VkIGlzIGZhbHNlIGJ1dCBnZXRXcml0ZXIoKSB0aHJvd3MuXG4gKiBXZSBvbmx5IHdhbnQgdG8gcmVzb2x2ZSB2aWEgcG9sbGluZyB3aGVuIHRoZSBzdHJlYW0gaXMgdW5sb2NrZWQsIG5vdCBjbG9zZWQuXG4gKiBJZiBjbG9zZWQsIHRoZSBwdW1wIHdpbGwgaGFuZGxlIHJlc29sdXRpb24gdmlhIHRoZSBzdHJlYW0gZW5kaW5nIG5hdHVyYWxseS5cbiAqL1xuZnVuY3Rpb24gaXNXcml0YWJsZVVubG9ja2VkTm90Q2xvc2VkKHdyaXRhYmxlOiBXcml0YWJsZVN0cmVhbSk6IGJvb2xlYW4ge1xuICBpZiAod3JpdGFibGUubG9ja2VkKSByZXR1cm4gZmFsc2U7XG5cbiAgbGV0IHdyaXRlcjogV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyIHwgdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIC8vIFRyeSB0byBhY3F1aXJlIHdyaXRlciAtIGlmIHN1Y2Nlc3NmdWwsIHN0cmVhbSBpcyB1bmxvY2tlZCAobm90IGNsb3NlZClcbiAgICB3cml0ZXIgPSB3cml0YWJsZS5nZXRXcml0ZXIoKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZ2V0V3JpdGVyKCkgdGhyb3dzIGlmIHN0cmVhbSBpcyBjbG9zZWQvZXJyb3JlZCAtIGxldCBwdW1wIGhhbmRsZSBpdFxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgd3JpdGVyLnJlbGVhc2VMb2NrKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIElmIHJlbGVhc2VMb2NrKCkgdGhyb3dzIGZvciBhbnkgcmVhc29uLCBjb25zZXJ2YXRpdmVseSB0cmVhdCB0aGVcbiAgICAvLyBzdHJlYW0gYXMgY2xvc2VkL2Vycm9yZWQgc28gY2FsbGVycyBkb24ndCBhc3N1bWUgaXQncyBzYWZlIHRvIHVzZS5cbiAgICAvLyBUaGUgcHVtcCB3aWxsIG9ic2VydmUgdGhlIGZhaWx1cmUgdmlhIHRoZSBzdHJlYW0ncyBlbmQgc3RhdGUuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgUmVhZGFibGVTdHJlYW0gaXMgdW5sb2NrZWQgKHVzZXIgcmVsZWFzZWQgbG9jaykgdnMgY2xvc2VkLlxuICovXG5mdW5jdGlvbiBpc1JlYWRhYmxlVW5sb2NrZWROb3RDbG9zZWQocmVhZGFibGU6IFJlYWRhYmxlU3RyZWFtKTogYm9vbGVhbiB7XG4gIGlmIChyZWFkYWJsZS5sb2NrZWQpIHJldHVybiBmYWxzZTtcblxuICBsZXQgcmVhZGVyOiBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIgfCB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgLy8gVHJ5IHRvIGFjcXVpcmUgcmVhZGVyIC0gaWYgc3VjY2Vzc2Z1bCwgc3RyZWFtIGlzIHVubG9ja2VkIChub3QgY2xvc2VkKVxuICAgIHJlYWRlciA9IHJlYWRhYmxlLmdldFJlYWRlcigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBnZXRSZWFkZXIoKSB0aHJvd3MgaWYgc3RyZWFtIGlzIGNsb3NlZC9lcnJvcmVkIC0gbGV0IHB1bXAgaGFuZGxlIGl0XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZWFkZXIucmVsZWFzZUxvY2soKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gSWYgcmVsZWFzZUxvY2soKSB0aHJvd3MgZm9yIGFueSByZWFzb24sIGNvbnNlcnZhdGl2ZWx5IHRyZWF0IHRoZVxuICAgIC8vIHN0cmVhbSBhcyBjbG9zZWQvZXJyb3JlZCBzbyBjYWxsZXJzIGRvbid0IGFzc3VtZSBpdCdzIHNhZmUgdG8gdXNlLlxuICAgIC8vIFRoZSBwdW1wIHdpbGwgb2JzZXJ2ZSB0aGUgZmFpbHVyZSB2aWEgdGhlIHN0cmVhbSdzIGVuZCBzdGF0ZS5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBTZXR0bGUgdGhlIGZsdXNoYWJsZSBjb21wbGV0aW9uIGFmdGVyIHRoZSBzaW5rJ3MgZHVyYWJpbGl0eSBiYXJyaWVyLlxuICpcbiAqIExvY2sgcmVsZWFzZSBtZWFucyB0aGUgcHJvZHVjZXIgaXMgZG9uZSAqd3JpdGluZyo7IHdpdGggYSBncm91cC1jb21taXRcbiAqIHNpbmssIGFjY2VwdGVkIGNodW5rcyBtYXkgc3RpbGwgYmUgY2xpZW50LWJ1ZmZlcmVkIG9yIGluIGEgcmVxdWVzdCB0aGF0IGlzXG4gKiBpbiBmbGlnaHQuIEF3YWl0aW5nIHRoZSBiYXJyaWVyIGhlcmUga2VlcHMgdGhlIGNvbXBsZXRpb24ncyBtZWFuaW5nIOKAlFxuICogXCJldmVyeXRoaW5nIHdyaXR0ZW4gc28gZmFyIGlzIGR1cmFibGVcIiDigJQgaWRlbnRpY2FsIHRvIHRoZSBwcmUtYmF0Y2hpbmdcbiAqIGJlaGF2aW9yIHdoZXJlIGVhY2ggd3JpdGUoKSB3YXMgaW5kaXZpZHVhbGx5IGR1cmFibGUuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVBZnRlckRyYWluKHN0YXRlOiBGbHVzaGFibGVTdHJlYW1TdGF0ZSk6IHZvaWQge1xuICBjb25zdCBiYXJyaWVyID0gc3RhdGUuZHJhaW5CYXJyaWVyO1xuICBpZiAoIWJhcnJpZXIpIHtcbiAgICBzdGF0ZS5yZXNvbHZlKCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGJhcnJpZXIoKS50aGVuKFxuICAgICgpID0+IHN0YXRlLnJlc29sdmUoKSxcbiAgICAoZXJyKSA9PiBzdGF0ZS5yZWplY3QoZXJyKVxuICApO1xufVxuXG4vKipcbiAqIFBvbGxzIGEgV3JpdGFibGVTdHJlYW0gdG8gY2hlY2sgaWYgdGhlIHVzZXIgaGFzIHJlbGVhc2VkIHRoZWlyIGxvY2suXG4gKiBSZXNvbHZlcyB0aGUgZG9uZSBwcm9taXNlIHdoZW4gbG9jayBpcyByZWxlYXNlZCBhbmQgbm8gcGVuZGluZyBvcHMgcmVtYWluLlxuICpcbiAqIE5vdGU6IE9ubHkgcmVzb2x2ZXMgaWYgc3RyZWFtIGlzIHVubG9ja2VkIGJ1dCBOT1QgY2xvc2VkLiBJZiB0aGUgdXNlciBjbG9zZXNcbiAqIHRoZSBzdHJlYW0sIHRoZSBwdW1wIHdpbGwgaGFuZGxlIHJlc29sdXRpb24gdmlhIHRoZSBzdHJlYW0gZW5kaW5nIG5hdHVyYWxseS5cbiAqXG4gKiBQcm90ZWN0aW9uOiBJZiBwb2xsaW5nIGlzIGFscmVhZHkgYWN0aXZlIG9uIHRoaXMgc3RhdGUsIHRoZSBleGlzdGluZyBpbnRlcnZhbFxuICogaXMgdXNlZCB0byBhdm9pZCBjcmVhdGluZyBtdWx0aXBsZSBzaW11bHRhbmVvdXMgcG9sbGluZyBvcGVyYXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcG9sbFdyaXRhYmxlTG9jayhcbiAgd3JpdGFibGU6IFdyaXRhYmxlU3RyZWFtLFxuICBzdGF0ZTogRmx1c2hhYmxlU3RyZWFtU3RhdGVcbik6IHZvaWQge1xuICAvLyBQcmV2ZW50IG11bHRpcGxlIHNpbXVsdGFuZW91cyBwb2xsaW5nIG9uIHRoZSBzYW1lIHN0YXRlXG4gIGlmIChzdGF0ZS53cml0YWJsZVBvbGxpbmdJbnRlcnZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgaW50ZXJ2YWxJZCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAvLyBTdG9wIHBvbGxpbmcgaWYgYWxyZWFkeSByZXNvbHZlZCBvciBzdHJlYW0gZW5kZWRcbiAgICBpZiAoc3RhdGUuZG9uZVJlc29sdmVkIHx8IHN0YXRlLnN0cmVhbUVuZGVkKSB7XG4gICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpO1xuICAgICAgc3RhdGUud3JpdGFibGVQb2xsaW5nSW50ZXJ2YWwgPSB1bmRlZmluZWQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgbG9jayBpcyByZWxlYXNlZCAobm90IGNsb3NlZCkgYW5kIG5vIHBlbmRpbmcgb3BzXG4gICAgaWYgKGlzV3JpdGFibGVVbmxvY2tlZE5vdENsb3NlZCh3cml0YWJsZSkgJiYgc3RhdGUucGVuZGluZ09wcyA9PT0gMCkge1xuICAgICAgc3RhdGUuZG9uZVJlc29sdmVkID0gdHJ1ZTtcbiAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XG4gICAgICBzdGF0ZS53cml0YWJsZVBvbGxpbmdJbnRlcnZhbCA9IHVuZGVmaW5lZDtcbiAgICAgIHJlc29sdmVBZnRlckRyYWluKHN0YXRlKTtcbiAgICB9XG4gIH0sIGdldExvY2tQb2xsSW50ZXJ2YWxNcygpKTtcblxuICBzdGF0ZS53cml0YWJsZVBvbGxpbmdJbnRlcnZhbCA9IGludGVydmFsSWQ7XG59XG5cbi8qKlxuICogUG9sbHMgYSBSZWFkYWJsZVN0cmVhbSB0byBjaGVjayBpZiB0aGUgdXNlciBoYXMgcmVsZWFzZWQgdGhlaXIgbG9jay5cbiAqIFJlc29sdmVzIHRoZSBkb25lIHByb21pc2Ugd2hlbiBsb2NrIGlzIHJlbGVhc2VkIGFuZCBubyBwZW5kaW5nIG9wcyByZW1haW4uXG4gKlxuICogTm90ZTogT25seSByZXNvbHZlcyBpZiBzdHJlYW0gaXMgdW5sb2NrZWQgYnV0IE5PVCBjbG9zZWQuIElmIHRoZSB1c2VyIGNsb3Nlc1xuICogdGhlIHN0cmVhbSwgdGhlIHB1bXAgd2lsbCBoYW5kbGUgcmVzb2x1dGlvbiB2aWEgdGhlIHN0cmVhbSBlbmRpbmcgbmF0dXJhbGx5LlxuICpcbiAqIFByb3RlY3Rpb246IElmIHBvbGxpbmcgaXMgYWxyZWFkeSBhY3RpdmUgb24gdGhpcyBzdGF0ZSwgdGhlIGV4aXN0aW5nIGludGVydmFsXG4gKiBpcyB1c2VkIHRvIGF2b2lkIGNyZWF0aW5nIG11bHRpcGxlIHNpbXVsdGFuZW91cyBwb2xsaW5nIG9wZXJhdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwb2xsUmVhZGFibGVMb2NrKFxuICByZWFkYWJsZTogUmVhZGFibGVTdHJlYW0sXG4gIHN0YXRlOiBGbHVzaGFibGVTdHJlYW1TdGF0ZVxuKTogdm9pZCB7XG4gIC8vIFByZXZlbnQgbXVsdGlwbGUgc2ltdWx0YW5lb3VzIHBvbGxpbmcgb24gdGhlIHNhbWUgc3RhdGVcbiAgaWYgKHN0YXRlLnJlYWRhYmxlUG9sbGluZ0ludGVydmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBpbnRlcnZhbElkID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgIC8vIFN0b3AgcG9sbGluZyBpZiBhbHJlYWR5IHJlc29sdmVkIG9yIHN0cmVhbSBlbmRlZFxuICAgIGlmIChzdGF0ZS5kb25lUmVzb2x2ZWQgfHwgc3RhdGUuc3RyZWFtRW5kZWQpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XG4gICAgICBzdGF0ZS5yZWFkYWJsZVBvbGxpbmdJbnRlcnZhbCA9IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBsb2NrIGlzIHJlbGVhc2VkIChub3QgY2xvc2VkKSBhbmQgbm8gcGVuZGluZyBvcHNcbiAgICBpZiAoaXNSZWFkYWJsZVVubG9ja2VkTm90Q2xvc2VkKHJlYWRhYmxlKSAmJiBzdGF0ZS5wZW5kaW5nT3BzID09PSAwKSB7XG4gICAgICBzdGF0ZS5kb25lUmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcbiAgICAgIHN0YXRlLnJlYWRhYmxlUG9sbGluZ0ludGVydmFsID0gdW5kZWZpbmVkO1xuICAgICAgcmVzb2x2ZUFmdGVyRHJhaW4oc3RhdGUpO1xuICAgIH1cbiAgfSwgZ2V0TG9ja1BvbGxJbnRlcnZhbE1zKCkpO1xuXG4gIHN0YXRlLnJlYWRhYmxlUG9sbGluZ0ludGVydmFsID0gaW50ZXJ2YWxJZDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZmx1c2hhYmxlIHBpcGUgZnJvbSBhIFJlYWRhYmxlU3RyZWFtIHRvIGEgV3JpdGFibGVTdHJlYW0uXG4gKiBVbmxpa2UgcGlwZVRvKCksIHRoaXMgcmVzb2x2ZXMgd2hlbjpcbiAqIDEuIFRoZSBzb3VyY2Ugc3RyZWFtIGNvbXBsZXRlcyAoY2xvc2UvZXJyb3IpLCBPUlxuICogMi4gVGhlIHVzZXIgcmVsZWFzZXMgdGhlaXIgbG9jayBvbiB1c2VyU3RyZWFtIEFORCBhbGwgcGVuZGluZyB3cml0ZXMgYXJlIGZsdXNoZWRcbiAqXG4gKiBAcGFyYW0gc291cmNlIC0gVGhlIHJlYWRhYmxlIHN0cmVhbSB0byByZWFkIGZyb20gKGUuZy4sIHRyYW5zZm9ybSdzIHJlYWRhYmxlKVxuICogQHBhcmFtIHNpbmsgLSBUaGUgd3JpdGFibGUgc3RyZWFtIHRvIHdyaXRlIHRvIChlLmcuLCBzZXJ2ZXIgd3JpdGFibGUpXG4gKiBAcGFyYW0gc3RhdGUgLSBUaGUgZmx1c2hhYmxlIHN0YXRlIHRyYWNrZXJcbiAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHN0cmVhbSBlbmRzIChub3Qgd2hlbiBkb25lIHByb21pc2UgcmVzb2x2ZXMpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbHVzaGFibGVQaXBlKFxuICBzb3VyY2U6IFJlYWRhYmxlU3RyZWFtLFxuICBzaW5rOiBXcml0YWJsZVN0cmVhbSxcbiAgc3RhdGU6IEZsdXNoYWJsZVN0cmVhbVN0YXRlXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gQmF0Y2hpbmcgbGl2ZXMgaW4gdGhlIHNpbmsgKGBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtYCBncm91cC1jb21taXRzXG4gIC8vIGl0cyBidWZmZXIpLCBzbyB0aGlzIHBpcGUgaXMgYSBwbGFpbiBwZXItY2h1bmsgcHVtcCByZWdhcmRsZXNzIG9mIHBhdGgg4oCUXG4gIC8vIGl0cyBvbmx5IHJlc3BvbnNpYmlsaXRpZXMgYXJlIGxvY2stcmVsZWFzZSBjb21wbGV0aW9uIGFuZCBkdXJhYmlsaXR5XG4gIC8vIHRyYWNraW5nLiBHcm91cC1jb21taXQgc2lua3MgYWNrIHdyaXRlKCkgb24gYnVmZmVyIGVudHJ5OyBhZG9wdCB0aGVpclxuICAvLyBkdXJhYmlsaXR5IGJhcnJpZXIgc28gdGhlIGxvY2stcmVsZWFzZSBjb21wbGV0aW9uIHN0aWxsIG1lYW5zXG4gIC8vIFwiZXZlcnl0aGluZyB3cml0dGVuIGlzIGR1cmFibGVcIiAoc2VlIHJlc29sdmVBZnRlckRyYWluKS5cbiAgY29uc3QgZHJhaW4gPSAoc2luayBhcyB7IFtTVFJFQU1fRFJBSU5fU1lNQk9MXT86IERyYWluQmFycmllciB9KVtcbiAgICBTVFJFQU1fRFJBSU5fU1lNQk9MXG4gIF07XG4gIGlmICh0eXBlb2YgZHJhaW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICBzdGF0ZS5kcmFpbkJhcnJpZXIgPSBkcmFpbjtcbiAgfVxuICByZXR1cm4gZmx1c2hhYmxlUGlwZVBlckNodW5rKHNvdXJjZSwgc2luaywgc3RhdGUpO1xufVxuXG4vKipcbiAqIFRoZSBwdW1wIGJlaGluZCB7QGxpbmsgZmx1c2hhYmxlUGlwZX06IGF3YWl0cyBlYWNoIGB3cml0ZXIud3JpdGUoKWAgYmVmb3JlXG4gKiByZWFkaW5nIHRoZSBuZXh0IGNodW5rLiBBZ2FpbnN0IGEgZ3JvdXAtY29tbWl0IHNpbmssIHdyaXRlKCkgYWNrcyBvbiBidWZmZXJcbiAqIGVudHJ5LCBzbyB0aGlzIGxvb3AgZmVlZHMgdGhlIHNpbmsgYXMgZmFzdCBhcyB0aGUgcHJvZHVjZXIgZW1pdHMgKGJvdW5kZWRcbiAqIGJ5IHRoZSBzaW5rJ3MgYnVmZmVyIGJvdW5kKSBhbmQgYmF0Y2hpbmcgaGFwcGVucyBpbnNpZGUgdGhlIHNpbms7IGFnYWluc3QgYVxuICogcGxhaW4gc2luayBlYWNoIHdyaXRlIGlzIGluZGl2aWR1YWxseSBkdXJhYmxlLCBhcyBiZWZvcmUuIFRoZSBzb3VyY2UtZG9uZVxuICogcGF0aCBjbG9zZXMgdGhlIHNpbmssIHdoaWNoIGRyYWlucyBpdCwgc28gY29tcGxldGlvbiBhbHdheXMgaW1wbGllc1xuICogZHVyYWJpbGl0eS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmx1c2hhYmxlUGlwZVBlckNodW5rKFxuICBzb3VyY2U6IFJlYWRhYmxlU3RyZWFtLFxuICBzaW5rOiBXcml0YWJsZVN0cmVhbSxcbiAgc3RhdGU6IEZsdXNoYWJsZVN0cmVhbVN0YXRlXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVhZGVyID0gc291cmNlLmdldFJlYWRlcigpO1xuICBjb25zdCB3cml0ZXIgPSBzaW5rLmdldFdyaXRlcigpO1xuICBsZXQgY2FuY2VsUmVhc29uOiB1bmtub3duO1xuXG4gIHRyeSB7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIC8vIENoZWNrIGlmIHN0cmVhbSBoYXMgZW5kZWRcbiAgICAgIGlmIChzdGF0ZS5zdHJlYW1FbmRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFJlYWQgZnJvbSBzb3VyY2UgLSBkb24ndCBjb3VudCBhcyBwZW5kaW5nIG9wIHNpbmNlIHdlJ3JlIGp1c3Qgd2FpdGluZyBmb3IgZGF0YVxuICAgICAgLy8gVGhlIGltcG9ydGFudCBvcHMgYXJlIHdyaXRlcyB0byB0aGUgc2luayAoc2VydmVyKVxuICAgICAgY29uc3QgcmVhZFJlc3VsdCA9IGF3YWl0IFByb21pc2UucmFjZShbXG4gICAgICAgIHJlYWRlci5yZWFkKCksXG4gICAgICAgIHdyaXRlci5jbG9zZWQudGhlbigoKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKCdXcml0YWJsZSBzdHJlYW0gY2xvc2VkIHByZW1hdHVyZWx5Jyk7XG4gICAgICAgIH0pLFxuICAgICAgXSk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHN0cmVhbSBoYXMgZW5kZWQgKGUuZy4sIGR1ZSB0byBlcnJvciBpbiBhbm90aGVyIHBhdGgpIGJlZm9yZSBwcm9jZXNzaW5nXG4gICAgICBpZiAoc3RhdGUuc3RyZWFtRW5kZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVhZFJlc3VsdC5kb25lKSB7XG4gICAgICAgIC8vIFNvdXJjZSBzdHJlYW0gY29tcGxldGVkIC0gY2xvc2Ugc2luayBhbmQgcmVzb2x2ZVxuICAgICAgICBzdGF0ZS5zdHJlYW1FbmRlZCA9IHRydWU7XG4gICAgICAgIGF3YWl0IHdyaXRlci5jbG9zZSgpO1xuICAgICAgICAvLyBSZXNvbHZlIGRvbmUgcHJvbWlzZSBpZiBub3QgYWxyZWFkeSByZXNvbHZlZFxuICAgICAgICBpZiAoIXN0YXRlLmRvbmVSZXNvbHZlZCkge1xuICAgICAgICAgIHN0YXRlLmRvbmVSZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgc3RhdGUucmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gQ291bnQgd3JpdGUgYXMgYSBwZW5kaW5nIG9wIC0gdGhpcyBpcyB3aGF0IHdlIG5lZWQgdG8gZmx1c2hcbiAgICAgIHN0YXRlLnBlbmRpbmdPcHMrKztcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHdyaXRlci53cml0ZShyZWFkUmVzdWx0LnZhbHVlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHN0YXRlLnBlbmRpbmdPcHMtLTtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHN0YXRlLnN0cmVhbUVuZGVkID0gdHJ1ZTtcbiAgICBjYW5jZWxSZWFzb24gPSBlcnI7XG4gICAgLy8gQWdhaW5zdCBhbiBlYXJseS1hY2sgc2luaywgY2h1bmtzIGNhbiBzdGlsbCBiZSBidWZmZXJlZCBvciBpbiBmbGlnaHRcbiAgICAvLyB3aGVuIHRoZSBwaXBlIGZhaWxzIChwZW5kaW5nT3BzIG9ubHkgY291bnRzIHVuLWFja2VkIHdyaXRlcykuIERlbGl2ZXJcbiAgICAvLyB0aGF0IGFjY2VwdGVkIHByZWZpeCBiZWZvcmUgc2V0dGxpbmcgdGhlIGZhaWx1cmU6IG9uY2UgdGhlIHN0YXRlXG4gICAgLy8gcmVqZWN0cywgdGhlIHN0ZXAgbWF5IHBlcnNpc3QgaXRzIGZhaWx1cmUgYW5kIHRoZSBpbnZvY2F0aW9uIGZpbmlzaCxcbiAgICAvLyBhbmQgYW55dGhpbmcgc3RpbGwgY2xpZW50LXNpZGUgd291bGQgYmUgbG9zdC4gVGhlIG9yaWdpbmFsIHBpcGUgZXJyb3JcbiAgICAvLyBzdGF5cyBwcmltYXJ5IOKAlCBhIGRyYWluIGZhaWx1cmUgaXMgYWxyZWFkeSBzdGlja3kgb24gdGhlIHNpbmsuXG4gICAgaWYgKHN0YXRlLmRyYWluQmFycmllcikge1xuICAgICAgYXdhaXQgc3RhdGUuZHJhaW5CYXJyaWVyKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgIH1cbiAgICBpZiAoIXN0YXRlLmRvbmVSZXNvbHZlZCkge1xuICAgICAgc3RhdGUuZG9uZVJlc29sdmVkID0gdHJ1ZTtcbiAgICAgIHN0YXRlLnJlamVjdChlcnIpO1xuICAgIH1cbiAgICAvLyBQcm9wYWdhdGUgZXJyb3IgdGhyb3VnaCBmbHVzaGFibGVQaXBlJ3Mgb3duIHByb21pc2UgYXMgd2VsbC5cbiAgICAvLyBDYWxsZXJzIHRoYXQgcmVseSBvbiB0aGUgRmx1c2hhYmxlU3RyZWFtU3RhdGUgc2hvdWxkIHVzZSBgc3RhdGUucHJvbWlzZWAsXG4gICAgLy8gd2hpbGUgb3RoZXIgY2FsbGVycyBtYXkgZGVwZW5kIG9uIHRoaXMgcmVqZWN0aW9uLiBTb21lIGtub3duIGNhbGxlcnNcbiAgICAvLyBleHBsaWNpdGx5IGlnbm9yZSB0aGlzIHJlamVjdGlvbiAoYC5jYXRjaCgoKSA9PiB7fSlgKSBhbmQgcmVseSBzb2xlbHlcbiAgICAvLyBvbiBgc3RhdGUucmVqZWN0KGVycilgIGZvciBlcnJvciBoYW5kbGluZy5cbiAgICB0aHJvdyBlcnI7XG4gIH0gZmluYWxseSB7XG4gICAgLy8gQ2FuY2VsIHRoZSB1cHN0cmVhbSByZWFkZXIgc28gdGhlIHNvdXJjZSBrbm93cyB0byBzdG9wIGdlbmVyYXRpbmcgZGF0YS5cbiAgICAvLyBVc2VzIGNhbmNlbFJlYXNvbiAoc2V0IGluIHRoZSBjYXRjaCBibG9jaykgc28gdGhlIHNvdXJjZSByZWNlaXZlcyBjb250ZXh0XG4gICAgLy8gYWJvdXQgd2h5IGl0IHdhcyBjYW5jZWxsZWQuIE9uIG5vcm1hbCBjb21wbGV0aW9uIGNhbmNlbFJlYXNvbiBpcyB1bmRlZmluZWQsXG4gICAgLy8gd2hpY2ggaXMgYSBoYXJtbGVzcyBuby1vcCBvbiBhbiBhbHJlYWR5LWRvbmUgcmVhZGVyLlxuICAgIHJlYWRlci5jYW5jZWwoY2FuY2VsUmVhc29uKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgcmVhZGVyLnJlbGVhc2VMb2NrKCk7XG4gICAgd3JpdGVyLnJlbGVhc2VMb2NrKCk7XG4gIH1cbn1cbiJdfQ==
package/dist/index.d.ts CHANGED
@@ -12,7 +12,7 @@
12
12
  export { FatalError, RetryableError, type RetryableErrorOptions, } from '@workflow/errors';
13
13
  export { createHook, createWebhook, type Hook, type HookOptions, type RequestWithResponse, type Webhook, type WebhookOptions, } from './create-hook.js';
14
14
  export { defineHook, type TypedHook } from './define-hook.js';
15
- export { experimental_setAttributes, type SetAttributesOptions, setAttributes, } from './set-attributes.js';
15
+ export { type SetAttributesOptions, setAttributes, } from './set-attributes.js';
16
16
  export { sleep } from './sleep.js';
17
17
  export { getStepMetadata, type StepMetadata, } from './step/get-step-metadata.js';
18
18
  export { getWorkflowMetadata, type WorkflowMetadata, } from './step/get-workflow-metadata.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EACL,UAAU,EACV,cAAc,EACd,KAAK,qBAAqB,GAC3B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,UAAU,EACV,aAAa,EACb,KAAK,IAAI,EACT,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,KAAK,OAAO,EACZ,KAAK,cAAc,GACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EACL,0BAA0B,EAC1B,KAAK,oBAAoB,EACzB,aAAa,GACd,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EACL,eAAe,EACf,KAAK,YAAY,GAClB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,mBAAmB,EACnB,KAAK,gBAAgB,GACtB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,WAAW,EACX,KAAK,6BAA6B,GACnC,MAAM,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EACL,UAAU,EACV,cAAc,EACd,KAAK,qBAAqB,GAC3B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,UAAU,EACV,aAAa,EACb,KAAK,IAAI,EACT,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,KAAK,OAAO,EACZ,KAAK,cAAc,GACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EACL,KAAK,oBAAoB,EACzB,aAAa,GACd,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EACL,eAAe,EACf,KAAK,YAAY,GAClB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,mBAAmB,EACnB,KAAK,gBAAgB,GACtB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,WAAW,EACX,KAAK,6BAA6B,GACnC,MAAM,2BAA2B,CAAC"}
package/dist/index.js CHANGED
@@ -12,9 +12,9 @@
12
12
  export { FatalError, RetryableError, } from '@workflow/errors';
13
13
  export { createHook, createWebhook, } from './create-hook.js';
14
14
  export { defineHook } from './define-hook.js';
15
- export { experimental_setAttributes, setAttributes, } from './set-attributes.js';
15
+ export { setAttributes, } from './set-attributes.js';
16
16
  export { sleep } from './sleep.js';
17
17
  export { getStepMetadata, } from './step/get-step-metadata.js';
18
18
  export { getWorkflowMetadata, } from './step/get-workflow-metadata.js';
19
19
  export { getWritable, } from './step/writable-stream.js';
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7R0FVRztBQUVILE9BQU8sRUFDTCxVQUFVLEVBQ1YsY0FBYyxHQUVmLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUNMLFVBQVUsRUFDVixhQUFhLEdBTWQsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsVUFBVSxFQUFrQixNQUFNLGtCQUFrQixDQUFDO0FBQzlELE9BQU8sRUFDTCwwQkFBMEIsRUFFMUIsYUFBYSxHQUNkLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNuQyxPQUFPLEVBQ0wsZUFBZSxHQUVoQixNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sRUFDTCxtQkFBbUIsR0FFcEIsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLEVBQ0wsV0FBVyxHQUVaLE1BQU0sMkJBQTJCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEp1c3QgdGhlIGNvcmUgdXRpbGl0aWVzIHRoYXQgYXJlIG1lYW50IHRvIGJlIGltcG9ydGVkIGJ5IHVzZXJcbiAqIHN0ZXBzL3dvcmtmbG93cy4gVGhpcyBhbGxvd3MgdGhlIGJ1bmRsZXIgdG8gdHJlZS1zaGFrZSBhbmQgbGltaXQgd2hhdCBnb2VzXG4gKiBpbnRvIHRoZSBmaW5hbCB1c2VyIGJ1bmRsZXMuIExvZ2ljIGZvciBydW5uaW5nL2hhbmRsaW5nIHN0ZXBzL3dvcmtmbG93c1xuICogc2hvdWxkIGxpdmUgaW4gcnVudGltZS4gRXZlbnR1YWxseSB0aGVzZSBtaWdodCBiZSBzZXBhcmF0ZSBwYWNrYWdlc1xuICogYHdvcmtmbG93YCBhbmQgYHdvcmtmbG93L3J1bnRpbWVgP1xuICpcbiAqIEV2ZXJ5dGhpbmcgaGVyZSB3aWxsIGdldCByZS1leHBvcnRlZCB1bmRlciB0aGUgJ3dvcmtmbG93JyB0b3AgbGV2ZWwgcGFja2FnZS5cbiAqIFRoaXMgc2hvdWxkIGJlIGEgbWluaW1hbCBzZXQgb2YgQVBJcyBzbyAqKmRvIG5vdCBhbnl0aGluZyBoZXJlKiogdW5sZXNzIGl0J3NcbiAqIG5lZWRlZCBmb3IgdXNlcmxhbmQgd29ya2Zsb3cgY29kZS5cbiAqL1xuXG5leHBvcnQge1xuICBGYXRhbEVycm9yLFxuICBSZXRyeWFibGVFcnJvcixcbiAgdHlwZSBSZXRyeWFibGVFcnJvck9wdGlvbnMsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuZXhwb3J0IHtcbiAgY3JlYXRlSG9vayxcbiAgY3JlYXRlV2ViaG9vayxcbiAgdHlwZSBIb29rLFxuICB0eXBlIEhvb2tPcHRpb25zLFxuICB0eXBlIFJlcXVlc3RXaXRoUmVzcG9uc2UsXG4gIHR5cGUgV2ViaG9vayxcbiAgdHlwZSBXZWJob29rT3B0aW9ucyxcbn0gZnJvbSAnLi9jcmVhdGUtaG9vay5qcyc7XG5leHBvcnQgeyBkZWZpbmVIb29rLCB0eXBlIFR5cGVkSG9vayB9IGZyb20gJy4vZGVmaW5lLWhvb2suanMnO1xuZXhwb3J0IHtcbiAgZXhwZXJpbWVudGFsX3NldEF0dHJpYnV0ZXMsXG4gIHR5cGUgU2V0QXR0cmlidXRlc09wdGlvbnMsXG4gIHNldEF0dHJpYnV0ZXMsXG59IGZyb20gJy4vc2V0LWF0dHJpYnV0ZXMuanMnO1xuZXhwb3J0IHsgc2xlZXAgfSBmcm9tICcuL3NsZWVwLmpzJztcbmV4cG9ydCB7XG4gIGdldFN0ZXBNZXRhZGF0YSxcbiAgdHlwZSBTdGVwTWV0YWRhdGEsXG59IGZyb20gJy4vc3RlcC9nZXQtc3RlcC1tZXRhZGF0YS5qcyc7XG5leHBvcnQge1xuICBnZXRXb3JrZmxvd01ldGFkYXRhLFxuICB0eXBlIFdvcmtmbG93TWV0YWRhdGEsXG59IGZyb20gJy4vc3RlcC9nZXQtd29ya2Zsb3ctbWV0YWRhdGEuanMnO1xuZXhwb3J0IHtcbiAgZ2V0V3JpdGFibGUsXG4gIHR5cGUgV29ya2Zsb3dXcml0YWJsZVN0cmVhbU9wdGlvbnMsXG59IGZyb20gJy4vc3RlcC93cml0YWJsZS1zdHJlYW0uanMnO1xuIl19
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7R0FVRztBQUVILE9BQU8sRUFDTCxVQUFVLEVBQ1YsY0FBYyxHQUVmLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUNMLFVBQVUsRUFDVixhQUFhLEdBTWQsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsVUFBVSxFQUFrQixNQUFNLGtCQUFrQixDQUFDO0FBQzlELE9BQU8sRUFFTCxhQUFhLEdBQ2QsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sRUFDTCxlQUFlLEdBRWhCLE1BQU0sNkJBQTZCLENBQUM7QUFDckMsT0FBTyxFQUNMLG1CQUFtQixHQUVwQixNQUFNLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sRUFDTCxXQUFXLEdBRVosTUFBTSwyQkFBMkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSnVzdCB0aGUgY29yZSB1dGlsaXRpZXMgdGhhdCBhcmUgbWVhbnQgdG8gYmUgaW1wb3J0ZWQgYnkgdXNlclxuICogc3RlcHMvd29ya2Zsb3dzLiBUaGlzIGFsbG93cyB0aGUgYnVuZGxlciB0byB0cmVlLXNoYWtlIGFuZCBsaW1pdCB3aGF0IGdvZXNcbiAqIGludG8gdGhlIGZpbmFsIHVzZXIgYnVuZGxlcy4gTG9naWMgZm9yIHJ1bm5pbmcvaGFuZGxpbmcgc3RlcHMvd29ya2Zsb3dzXG4gKiBzaG91bGQgbGl2ZSBpbiBydW50aW1lLiBFdmVudHVhbGx5IHRoZXNlIG1pZ2h0IGJlIHNlcGFyYXRlIHBhY2thZ2VzXG4gKiBgd29ya2Zsb3dgIGFuZCBgd29ya2Zsb3cvcnVudGltZWA/XG4gKlxuICogRXZlcnl0aGluZyBoZXJlIHdpbGwgZ2V0IHJlLWV4cG9ydGVkIHVuZGVyIHRoZSAnd29ya2Zsb3cnIHRvcCBsZXZlbCBwYWNrYWdlLlxuICogVGhpcyBzaG91bGQgYmUgYSBtaW5pbWFsIHNldCBvZiBBUElzIHNvICoqZG8gbm90IGFueXRoaW5nIGhlcmUqKiB1bmxlc3MgaXQnc1xuICogbmVlZGVkIGZvciB1c2VybGFuZCB3b3JrZmxvdyBjb2RlLlxuICovXG5cbmV4cG9ydCB7XG4gIEZhdGFsRXJyb3IsXG4gIFJldHJ5YWJsZUVycm9yLFxuICB0eXBlIFJldHJ5YWJsZUVycm9yT3B0aW9ucyxcbn0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5leHBvcnQge1xuICBjcmVhdGVIb29rLFxuICBjcmVhdGVXZWJob29rLFxuICB0eXBlIEhvb2ssXG4gIHR5cGUgSG9va09wdGlvbnMsXG4gIHR5cGUgUmVxdWVzdFdpdGhSZXNwb25zZSxcbiAgdHlwZSBXZWJob29rLFxuICB0eXBlIFdlYmhvb2tPcHRpb25zLFxufSBmcm9tICcuL2NyZWF0ZS1ob29rLmpzJztcbmV4cG9ydCB7IGRlZmluZUhvb2ssIHR5cGUgVHlwZWRIb29rIH0gZnJvbSAnLi9kZWZpbmUtaG9vay5qcyc7XG5leHBvcnQge1xuICB0eXBlIFNldEF0dHJpYnV0ZXNPcHRpb25zLFxuICBzZXRBdHRyaWJ1dGVzLFxufSBmcm9tICcuL3NldC1hdHRyaWJ1dGVzLmpzJztcbmV4cG9ydCB7IHNsZWVwIH0gZnJvbSAnLi9zbGVlcC5qcyc7XG5leHBvcnQge1xuICBnZXRTdGVwTWV0YWRhdGEsXG4gIHR5cGUgU3RlcE1ldGFkYXRhLFxufSBmcm9tICcuL3N0ZXAvZ2V0LXN0ZXAtbWV0YWRhdGEuanMnO1xuZXhwb3J0IHtcbiAgZ2V0V29ya2Zsb3dNZXRhZGF0YSxcbiAgdHlwZSBXb3JrZmxvd01ldGFkYXRhLFxufSBmcm9tICcuL3N0ZXAvZ2V0LXdvcmtmbG93LW1ldGFkYXRhLmpzJztcbmV4cG9ydCB7XG4gIGdldFdyaXRhYmxlLFxuICB0eXBlIFdvcmtmbG93V3JpdGFibGVTdHJlYW1PcHRpb25zLFxufSBmcm9tICcuL3N0ZXAvd3JpdGFibGUtc3RyZWFtLmpzJztcbiJdfQ==