@workflow/core 5.0.0-beta.42 → 5.0.0-beta.43

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 (40) hide show
  1. package/dist/create-hook.d.ts +9 -5
  2. package/dist/create-hook.d.ts.map +1 -1
  3. package/dist/create-hook.js +1 -1
  4. package/dist/private.d.ts +31 -12
  5. package/dist/private.d.ts.map +1 -1
  6. package/dist/private.js +147 -23
  7. package/dist/runtime/constants.d.ts +27 -0
  8. package/dist/runtime/constants.d.ts.map +1 -1
  9. package/dist/runtime/constants.js +33 -1
  10. package/dist/runtime/quickjs-entrypoint.d.ts +2 -0
  11. package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
  12. package/dist/runtime/quickjs-entrypoint.js +3 -2
  13. package/dist/runtime/run.d.ts.map +1 -1
  14. package/dist/runtime/run.js +54 -29
  15. package/dist/runtime/step-executor.d.ts +49 -1
  16. package/dist/runtime/step-executor.d.ts.map +1 -1
  17. package/dist/runtime/step-executor.js +67 -8
  18. package/dist/runtime/step-latency.d.ts +6 -0
  19. package/dist/runtime/step-latency.d.ts.map +1 -1
  20. package/dist/runtime/step-latency.js +3 -1
  21. package/dist/runtime/suspension-handler.d.ts +81 -1
  22. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  23. package/dist/runtime/suspension-handler.js +501 -15
  24. package/dist/runtime.d.ts.map +1 -1
  25. package/dist/runtime.js +126 -16
  26. package/dist/serialization.d.ts +10 -2
  27. package/dist/serialization.d.ts.map +1 -1
  28. package/dist/serialization.js +48 -6
  29. package/dist/telemetry.d.ts +6 -0
  30. package/dist/telemetry.d.ts.map +1 -1
  31. package/dist/telemetry.js +22 -1
  32. package/dist/version.d.ts +1 -1
  33. package/dist/version.js +2 -2
  34. package/dist/workflow/create-hook.js +2 -2
  35. package/dist/workflow/hook.js +3 -3
  36. package/dist/workflow.js +16 -8
  37. package/docs/foundations/hooks.mdx +2 -2
  38. package/docs/foundations/streaming.mdx +24 -0
  39. package/docs/how-it-works/event-sourcing.mdx +39 -1
  40. package/package.json +4 -4
package/dist/private.js CHANGED
@@ -237,18 +237,18 @@ function computeResolvesOnItsOwn(barriers, index, entry, memo) {
237
237
  * in log order; {@link hasParkedCommittedDelivery} deliberately reports such a
238
238
  * step as not self-resolving so that idle stays reachable.
239
239
  *
240
- * "The whole chain then delivers in log order" rests on the PAYLOAD's safety
241
- * net observing idle before the net of the wait parked behind it. If the
242
- * wait's net fired first, the step's gate would open while the wait was still
243
- * parked on the payload barrier and the inversion above would reappear. Within
244
- * one drain window that order is structural, and carried by FIFO of the
245
- * safety-net polls: nets arm via `setTimeout` in log order during synchronous
246
- * consumption, each polling round re-arms through `promiseQueue.then(...)` in
247
- * the order the checks ran, and each net that fires flips
248
- * {@link hasParkedCommittedDelivery} back to true, re-blocking the rest until
249
- * the released delivery completes. Replay where divergence manifests
250
- * always consumes the log in one window. Do not "optimize" the net scheduling
251
- * in a way that breaks that per-window FIFO.
240
+ * "The whole chain then delivers in log order" rests on the PAYLOAD's barrier
241
+ * being retired before that of anything parked behind it. That order is
242
+ * structural: safety-net retirements go through one per-context dispenser that
243
+ * only ever retires the lowest-index entry at delivery idle, and every
244
+ * retirement that wakes a chain flips {@link hasParkedCommittedDelivery} back
245
+ * to true, re-blocking the dispenser until the chain has drained see
246
+ * {@link ensureBarrierSafetyNet}. (This used to rest on the FIFO of one idle
247
+ * poll per barrier, which held for a single parked segment but decayed to
248
+ * timing noise with several — the release order, and therefore the ULIDs
249
+ * drawn by the woken branches, then depended on how much log the replay had
250
+ * loaded. storm-log-replay.test.ts replays a production log corrupted exactly
251
+ * that way.)
252
252
  */
253
253
  export async function awaitEarlierDeliveries(ctx, eventIndex, kind) {
254
254
  // Defensive: tolerate contexts that predate this field (test harnesses).
@@ -313,12 +313,6 @@ export function registerDeliveryBarrier(ctx, eventIndex, kind, options = {}) {
313
313
  }
314
314
  let done = false;
315
315
  const { promise, resolve } = withResolvers();
316
- const entry = {
317
- kind,
318
- delivered: promise,
319
- armed: options.armed ?? true,
320
- };
321
- barriers.set(eventIndex, entry);
322
316
  const finish = () => {
323
317
  if (done) {
324
318
  return;
@@ -329,12 +323,22 @@ export function registerDeliveryBarrier(ctx, eventIndex, kind, options = {}) {
329
323
  }
330
324
  resolve();
331
325
  };
326
+ const entry = {
327
+ kind,
328
+ delivered: promise,
329
+ armed: options.armed ?? true,
330
+ retire: finish,
331
+ };
332
+ barriers.set(eventIndex, entry);
332
333
  // Safety net: if this delivery is never delivered to the workflow (its
333
334
  // branch was not taken / the run is suspending, or a buffered hook payload
334
335
  // is only claimed after a later delivery the workflow is still waiting on),
335
- // resolve at idle so a later delivery gated on it cannot deadlock and the
336
- // registry cannot leak an entry per abandoned delivery.
337
- scheduleWhenIdle(ctx, finish);
336
+ // it is retired at idle so a later delivery gated on it cannot deadlock and
337
+ // the registry cannot leak an entry per abandoned delivery. Retirement goes
338
+ // through the context's single ordered dispenser rather than a per-barrier
339
+ // idle poll — see {@link ensureBarrierSafetyNet} for why the ORDER of these
340
+ // retirements is load-bearing.
341
+ ensureBarrierSafetyNet(ctx);
338
342
  return {
339
343
  markDelivered: finish,
340
344
  arm: () => {
@@ -342,6 +346,113 @@ export function registerDeliveryBarrier(ctx, eventIndex, kind, options = {}) {
342
346
  },
343
347
  };
344
348
  }
349
+ /**
350
+ * Contexts whose barrier safety-net dispenser is currently armed. Module-level
351
+ * so the context interface (constructed literally by many test harnesses)
352
+ * needs no new field; entries drop with the context.
353
+ */
354
+ const activeBarrierSafetyNets = new WeakSet();
355
+ /**
356
+ * The barrier registry's safety net: ONE idle-gated dispenser per context that
357
+ * retires, at each observation of delivery idle, only the LOWEST-index entry
358
+ * still registered, then yields so the chain it released can run before the
359
+ * next retirement is considered.
360
+ *
361
+ * Why one ordered dispenser and not a poll per barrier (which is what this
362
+ * replaced): the order of safety-net retirements decides the delivery order of
363
+ * every chain parked behind an unclaimed buffered hook payload — a hook the
364
+ * workflow never reads (a fire-and-forget `createHook`) parks every later
365
+ * armed wait/hook behind a barrier that only this net can retire. Per-barrier
366
+ * polls fire in whatever order their re-arm cycles land, and each re-arm
367
+ * attaches to a `promiseQueue` that grows between checks, so with several
368
+ * parked segments the release order decays to timing noise. Draws (`useStep`
369
+ * correlation ids) then depend on which segment happened to release first —
370
+ * concretely, on how MUCH log the replay loaded, since that decides what is in
371
+ * the registry. That is the mechanism behind slot-mode CORRUPTED_EVENT_LOG on
372
+ * storm-shaped runs (see storm-log-replay.test.ts, built from a production
373
+ * log): two replays of the same run holding different-length prefixes bound
374
+ * the same correlation ordinal to different steps.
375
+ *
376
+ * Retiring lowest-first is not merely tidy, it is the only order that cannot
377
+ * invert the log: every gate points from a higher index to a strictly lower
378
+ * one, so at delivery idle the lowest undelivered entry gates on nothing
379
+ * still registered — it is the head of every parked chain (in practice, the
380
+ * unclaimed payload itself). Releasing it lets the chain above deliver
381
+ * through the ordinary barrier order; anything the release wakes flips
382
+ * {@link hasParkedCommittedDelivery} back to true, which re-blocks this
383
+ * dispenser until the chain has fully drained. A higher entry must never be
384
+ * retired while a lower one is registered — that is exactly the inversion
385
+ * described on {@link awaitEarlierDeliveries}.
386
+ *
387
+ * The dispenser goes dormant when the registry empties and is re-armed by the
388
+ * next registration, so an idle context holds no live timer.
389
+ */
390
+ function ensureBarrierSafetyNet(ctx) {
391
+ const barriers = ctx.pendingDeliveryBarriers;
392
+ if (!barriers || activeBarrierSafetyNets.has(ctx)) {
393
+ return;
394
+ }
395
+ activeBarrierSafetyNets.add(ctx);
396
+ const rearm = () => {
397
+ setTimeout(check, 0);
398
+ };
399
+ // A rejected promiseQueue settles immediately and forever, so re-arming
400
+ // through it at the normal cadence would degenerate into a busy loop on an
401
+ // abandoned context. Back off instead: correctness only needs the dispenser
402
+ // to still exist, since the registry gates suspension via isDeliveryIdle
403
+ // and a dead dispenser would wedge the run.
404
+ const rearmAfterRejection = () => {
405
+ setTimeout(check, 50);
406
+ };
407
+ const check = () => {
408
+ if (barriers.size === 0) {
409
+ // Dormant. The next registerDeliveryBarrier re-arms.
410
+ activeBarrierSafetyNets.delete(ctx);
411
+ return;
412
+ }
413
+ if (!canRetireAbandonedBarriers(ctx)) {
414
+ // A delivery is hydrating or committed-but-parked on its deferral; let
415
+ // the queue drain and re-check a tick later (same cadence as
416
+ // scheduleWhenIdle).
417
+ ctx.promiseQueue.then(rearm, rearmAfterRejection);
418
+ return;
419
+ }
420
+ // Idle with entries left: nothing remaining delivers on its own, so
421
+ // release parked chains from the head — lowest index first, one at a
422
+ // time, re-reading idle between retirements. A retirement that wakes a
423
+ // chain flips {@link hasParkedCommittedDelivery} synchronously (it is
424
+ // computed from the registry this loop just mutated), which stops the
425
+ // sweep so the chain delivers before anything above it is released. A
426
+ // retirement that wakes nothing (a stale payload no delivery gates on)
427
+ // keeps the sweep going, so a backlog of those drains in ONE idle
428
+ // observation — pacing them one per timer tick would hold consumed-but-
429
+ // undelivered events hostage long enough to trip the events consumer's
430
+ // unconsumed-event deadline and fail healthy replays.
431
+ while (barriers.size > 0 && canRetireAbandonedBarriers(ctx)) {
432
+ let lowestIndex;
433
+ let lowestEntry;
434
+ for (const [index, entry] of barriers) {
435
+ if (lowestIndex === undefined || index < lowestIndex) {
436
+ lowestIndex = index;
437
+ lowestEntry = entry;
438
+ }
439
+ }
440
+ lowestEntry?.retire();
441
+ }
442
+ setTimeout(check, 0);
443
+ };
444
+ setTimeout(check, 0);
445
+ }
446
+ /**
447
+ * Whether the safety-net dispenser may retire abandoned barriers right now:
448
+ * no hydration in flight and no committed delivery still working through its
449
+ * detached deferral. This is deliberately WEAKER than {@link isDeliveryIdle}:
450
+ * the dispenser is what empties the registry, so gating it on registry
451
+ * emptiness would gate its own work.
452
+ */
453
+ function canRetireAbandonedBarriers(ctx) {
454
+ return ctx.pendingDeliveries === 0 && !hasParkedCommittedDelivery(ctx);
455
+ }
345
456
  /**
346
457
  * Whether some registered branch-deciding delivery is going to reach the
347
458
  * workflow without any further help (it is armed and not transitively parked
@@ -401,9 +512,22 @@ export function hasParkedCommittedDelivery(ctx) {
401
512
  * what it has and has not done yet says nothing about the run. Two callers
402
513
  * read it, for the two such decisions: {@link scheduleWhenIdle} for the
403
514
  * suspension, and the events consumer's unconsumed-event check for divergence.
515
+ *
516
+ * A non-empty barrier registry counts as in flight, even when every remaining
517
+ * entry is parked behind an unclaimed buffered payload. Those entries only
518
+ * move when the safety-net dispenser retires them (lowest-first, see
519
+ * {@link ensureBarrierSafetyNet}), and the deliveries they release are real
520
+ * workflow reactions — a suspension raised before they run would be computed
521
+ * from a VM that has not seen them, scheduling none of their follow-up work
522
+ * and leaving the run dormant (the vercel/workflow#3183 shape). The dispenser
523
+ * itself is gated on {@link canRetireAbandonedBarriers}, the weaker predicate
524
+ * without the registry term, precisely so it can do the draining that this
525
+ * predicate waits for; registry size strictly decreases at each retirement,
526
+ * so idle is always reached.
404
527
  */
405
528
  export function isDeliveryIdle(ctx) {
406
- return ctx.pendingDeliveries === 0 && !hasParkedCommittedDelivery(ctx);
529
+ return (ctx.pendingDeliveries === 0 &&
530
+ (!ctx.pendingDeliveryBarriers || ctx.pendingDeliveryBarriers.size === 0));
407
531
  }
408
532
  /**
409
533
  * Schedule a callback to fire only after all pending data deliveries
@@ -442,4 +566,4 @@ export function scheduleWhenIdle(ctx, fn) {
442
566
  };
443
567
  setTimeout(check, 0);
444
568
  }
445
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpdmF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wcml2YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBZ0JoRCxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsaUNBQWlDLENBQUMsQ0FBQztBQUV6RSxNQUFNLGFBQWEsR0FFZixVQUFVLENBQUM7QUFFZix3REFBd0Q7QUFDeEQsTUFBTSxlQUFlLEdBQUcsQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsS0FBSyxJQUFJLEdBQUcsRUFHbkUsQ0FBQyxDQUFDO0FBRUwsTUFBTSwyQkFBMkIsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUMxQyxpQ0FBaUM7SUFDakMseUJBQXlCO0lBQ3pCLHlCQUF5QjtDQUMxQixDQUFDLENBQUM7QUFFSCxTQUFTLHdCQUF3QixDQUFDLE1BQWM7SUFDOUMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUM5QyxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUU1QyxNQUFNLFFBQVEsR0FBRyxDQUFDLGVBQXVCLEVBQUUsRUFBRTtRQUMzQyxJQUFJLGVBQWUsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUNuQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDekMsQ0FBQztJQUNILENB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LEVBQUUsS0FBSyxDQUFDLElBQUksUUFBUSxFQUFFLENBQUM7UUFDdEMsSUFBSSxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxhQUFhLENBQUMsRUFBRSxDQUFDO1lBQzVELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsR0FBZ0M7SUFDN0QsT0FBTyxHQUFHLENBQUMsaUJBQWlCLEtBQUssQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDekUsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FDOUIsR0FBZ0MsRUFDaEMsRUFBYztJQUVkLE1BQU0sS0FBSyxHQUFHLEdBQUcsRUFBRTtRQUNqQixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDekIsdUVBQXVFO1lBQ3ZFLHFFQUFxRTtZQUNyRSxxRUFBcUU7WUFDckUsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO2dCQUN6QixVQUFVLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQzthQUFNLENBQUM7WUFDTixFQUFFLEVBQUUsQ0FBQztRQUNQLENBQUM7SUFDSCxDQUFDLENBQUM7SUFDRixVQUFVLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFV0aWxzIHVzZWQgYnkgdGhlIGJ1bmRsZXIgd2hlbiB0cmFuc2Zvcm1pbmcgY29kZVxuICovXG5cbmltcG9ydCB7IHdpdGhSZXNvbHZlcnMgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBXb3JsZENhcGFiaWxpdGllcyB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgdHlwZSB7IEV2ZW50c0NvbnN1bWVyIH0gZnJvbSAnLi9ldmVudHMtY29uc3VtZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBRdWV1ZUl0ZW0gfSBmcm9tICcuL2dsb2JhbC5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlcGxheVBheWxvYWRDYWNoZSB9IGZyb20gJy4vcmVwbGF5LXBheWxvYWQtY2FjaGUuanMnO1xuaW1wb3J0IHR5cGUgeyBTZXJpYWxpemFibGUgfSBmcm9tICcuL3NjaGVtYXMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYXlsb2FkS2V5IH0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL2VuY3J5cHRpb24uanMnO1xuXG5leHBvcnQgdHlwZSBTdGVwRnVuY3Rpb248XG4gIEFyZ3MgZXh0ZW5kcyBTZXJpYWxpemFibGVbXSA9IGFueVtdLFxuICBSZXN1bHQgZXh0ZW5kcyBTZXJpYWxpemFibGUgfCB1bmtub3duID0gdW5rbm93bixcbj4gPSAoKC4uLmFyZ3M6IEFyZ3MpID0+IFByb21pc2U8UmVzdWx0PikgJiB7XG4gIG1heFJldHJpZXM/OiBudW1iZXI7XG4gIHN0ZXBJZD86IHN0cmluZztcbn07XG5cbmNvbnN0IFJlZ2lzdGVyZWRTdGVwc0tleSA9IFN5bWJvbC5mb3IoJ0B3b3JrZmxvdy9jb3JlLy9yZWdpc3RlcmVkU3RlcHMnKTtcblxuY29uc3QgZ2xvYmFsU3ltYm9sczogdHlwZW9mIGdsb2JhbFRoaXMgJiB7XG4gIFtSZWdpc3RlcmVkU3RlcHNLZXldPzogTWFwPHN0cmluZywgU3RlcEZ1bmN0aW9uPjtcbn0gPSBnbG9iYWxUaGlzO1xuXG4vLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vQXNzaWduSW5FeHByZXNzaW9uczogL1xuY29uc3QgcmVnaXN0ZXJlZFN0ZXBzID0gKGdsb2JhbFN5bWJvbHNbUmVnaXN0ZXJlZFN0ZXBzS2V5XSA/Pz0gbmV3IE1hcDxcbiAgc3RyaW5nLFxuICBTdGVwRnVuY3Rpb25cbj4oKSk7XG5cbmNvbnN0IEJVSUxUSU5fUkVTUE9OU0VfU1RFUF9OQU1FUyA9IG5ldyBTZXQoW1xuICAnX19idWlsdGluX3Jlc3BvbnNlX2FycmF5X2J1ZmZlcicsXG4gICdfX2J1aWx0aW5fcmVzcG9uc2VfanNvbicsXG4gICdfX2J1aWx0aW5fcmVzcG9uc2VfdGV4dCcsXG5dKTtcblxuZnVuY3Rpb24gZ2V0U3RlcElkQWxpYXNDYW5kaWRhdGVzKHN0ZXBJZDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBwYXJ0cyA9IHN0ZXBJZC5zcGxpdCgnLy8nKTtcbiAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMyB8fCBwYXJ0c1swXSAhPT0gJ3N0ZXAnKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgbW9kdWxlUGF0aCA9IHBhcnRzWzFdO1xuICBjb25zdCBmbk5hbWUgPSBwYXJ0c1syXTtcbiAgY29uc3QgbW9kdWxlUGF0aEFsaWFzZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBjb25zdCBhZGRBbGlhcyA9IChhbGlhc01vZHVsZVBhdGg6IHN0cmluZykgPT4ge1xuICAgIGlmIChhbGlhc01vZHVsZVBhdGggIT09IG1vZHVsZVBhdGgpIHtcbiAgICAgIG1vZHVsZVBhdGhBbGlhc2VzLmFkZChhbGlhc01vZHVsZVBhdGgpO1xuICAgIH1cbiAgfTtcblxuICBpZiAobW9kdWxlUGF0aC5zdGFydHNXaXRoKCcuL3dvcmtmbG93cy8nKSkge1xuICAgIGNvbnN0IHdvcmtmbG93UmVsYXRpdmVQYXRoID0gbW9kdWxlUGF0aC5zbGljZSgnLi8nLmxlbmd0aCk7XG4gICAgYWRkQWxpYXMoYC4vZXhhbXBsZS8ke3dvcmtmbG93UmVsYXRpdmVQYXRofWApO1xuICAgIGFkZEFsaWFzKGAuL3NyYy8ke3dvcmtmbG93UmVsYXRpdmVQYXRofWApO1xuICB9IGVsc2UgaWYgKG1vZHVsZVBhdGguc3RhcnRzV2l0aCgnLi9leGFtcGxlL3dvcmtmbG93cy8nKSkge1xuICAgIGNvbnN0IHdvcmtmbG93UmVsYXRpdmVQYXRoID0gbW9kdWxlUGF0aC5zbGljZSgnLi9leGFtcGxlLycubGVuZ3RoKTtcbiAgICBhZGRBbGlhcyhgLi8ke3dvcmtmbG93UmVsYXRpdmVQYXRofWApO1xuICAgIGFkZEFsaWFzKGAuL3NyYy8ke3dvcmtmbG93UmVsYXRpdmVQYXRofWApO1xuICB9IGVsc2UgaWYgKG1vZHVsZVBhdGguc3RhcnRzV2l0aCgnLi9zcmMvd29ya2Zsb3dzLycpKSB7XG4gICAgY29uc3Qgd29ya2Zsb3dSZWxhdGl2ZVBhdGggPSBtb2R1bGVQYXRoLnNsaWNlKCcuL3NyYy8nLmxlbmd0aCk7XG4gICAgYWRkQWxpYXMoYC4vJHt3b3JrZmxvd1JlbGF0aXZlUGF0aH1gKTtcbiAgICBhZGRBbGlhcyhgLi9leGFtcGxlLyR7d29ya2Zsb3dSZWxhdGl2ZVBhdGh9YCk7XG4gIH1cblxuICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICBtb2R1bGVQYXRoQWxpYXNlcyxcbiAgICAoYWxpYXNNb2R1bGVQYXRoKSA9PiBgc3RlcC8vJHthbGlhc01vZHVsZVBhdGh9Ly8ke2ZuTmFtZX1gXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldEJ1aWx0aW5SZXNwb25zZVN0ZXBBbGlhcyhzdGVwSWQ6IHN0cmluZyk6IFN0ZXBGdW5jdGlvbiB8IHVuZGVmaW5lZCB7XG4gIGlmICghQlVJTFRJTl9SRVNQT05TRV9TVEVQX05BTUVTLmhhcyhzdGVwSWQpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGZvciAoY29uc3QgW3JlZ2lzdGVyZWRTdGVwSWQsIHN0ZXBGbl0gb2YgcmVnaXN0ZXJlZFN0ZXBzLmVudHJpZXMoKSkge1xuICAgIGlmIChyZWdpc3RlcmVkU3RlcElkLmVuZHNXaXRoKGAvLyR7c3RlcElkfWApKSB7XG4gICAgICByZXR1cm4gc3RlcEZuO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgYSBzdGVwIGZ1bmN0aW9uIHRvIGJlIHNlcnZlZCBpbiB0aGUgc2VydmVyIGJ1bmRsZS5cbiAqIEFsc28gc2V0cyB0aGUgc3RlcElkIHByb3BlcnR5IG9uIHRoZSBmdW5jdGlvbiBmb3Igc2VyaWFsaXphdGlvbiBzdXBwb3J0LlxuICpcbiAqIE5vdGU6IFRoZSBTV0MgY29tcGlsZXIgcGx1Z2luIG5vIGxvbmdlciBnZW5lcmF0ZXMgY2FsbHMgdG8gdGhpcyBmdW5jdGlvbi5cbiAqIFN0ZXAgcmVnaXN0cmF0aW9uIGlzIG5vdyBpbmxpbmVkIGFzIGEgc2VsZi1jb250YWluZWQgSUlGRSB0aGF0IHdyaXRlc1xuICogZGlyZWN0bHkgdG8gdGhlIGdsb2JhbCBNYXAgYXQgU3ltYm9sLmZvcihcIkB3b3JrZmxvdy9jb3JlLy9yZWdpc3RlcmVkU3RlcHNcIikuXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGtlcHQgZm9yIGludGVybmFsL3Rlc3QgdXNlIG9ubHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclN0ZXBGdW5jdGlvbihzdGVwSWQ6IHN0cmluZywgc3RlcEZuOiBTdGVwRnVuY3Rpb24pIHtcbiAgcmVnaXN0ZXJlZFN0ZXBzLnNldChzdGVwSWQsIHN0ZXBGbik7XG4gIHN0ZXBGbi5zdGVwSWQgPSBzdGVwSWQ7XG59XG5cbi8qKlxuICogRmluZCBhIHJlZ2lzdGVyZWQgc3RlcCBmdW5jdGlvbiBieSBuYW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdGVwRnVuY3Rpb24oc3RlcElkOiBzdHJpbmcpOiBTdGVwRnVuY3Rpb24gfCB1bmRlZmluZWQge1xuICBjb25zdCBkaXJlY3RNYXRjaCA9IHJlZ2lzdGVyZWRTdGVwcy5nZXQoc3RlcElkKTtcbiAgaWYgKGRpcmVjdE1hdGNoKSB7XG4gICAgcmV0dXJuIGRpcmVjdE1hdGNoO1xuICB9XG5cbiAgLy8gU3VwcG9ydCBlcXVpdmFsZW50IHdvcmtmbG93IHBhdGggYWxpYXNlcyBpbiBtaXhlZCBzeW1saW5rIGVudmlyb25tZW50cy5cbiAgZm9yIChjb25zdCBhbGlhc1N0ZXBJZCBvZiBnZXRTdGVwSWRBbGlhc0NhbmRpZGF0ZXMoc3RlcElkKSkge1xuICAgIGNvbnN0IGFsaWFzTWF0Y2ggPSByZWdpc3RlcmVkU3RlcHMuZ2V0KGFsaWFzU3RlcElkKTtcbiAgICBpZiAoYWxpYXNNYXRjaCkge1xuICAgICAgcmV0dXJuIGFsaWFzTWF0Y2g7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgYnVpbHRpbkFsaWFzTWF0Y2ggPSBnZXRCdWlsdGluUmVzcG9uc2VTdGVwQWxpYXMoc3RlcElkKTtcbiAgaWYgKGJ1aWx0aW5BbGlhc01hdGNoKSB7XG4gICAgcmV0dXJuIGJ1aWx0aW5BbGlhc01hdGNoO1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLy8gTm90ZTogX19wcml2YXRlX2dldENsb3N1cmVWYXJzIGlzIG5vIGxvbmdlciByZS1leHBvcnRlZCBoZXJlLlxuLy8gVGhlIFNXQyBjb21waWxlciBwbHVnaW4gbm93IGlubGluZXMgY2xvc3VyZSB2YXJpYWJsZSBhY2Nlc3MgYXMgYVxuLy8gc2VsZi1jb250YWluZWQgSUlGRSB0aGF0IHJlYWRzIGRpcmVjdGx5IGZyb20gdGhlIGdsb2JhbCBBc3luY0xvY2FsU3RvcmFnZVxuLy8gYXQgU3ltYm9sLmZvcihcIldPUktGTE9XX1NURVBfQ09OVEVYVF9TVE9SQUdFXCIpLlxuXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dCB7XG4gIHJ1bklkOiBzdHJpbmc7XG4gIGVuY3J5cHRpb25LZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQ7XG4gIHdvcmxkQ2FwYWJpbGl0aWVzPzogV29ybGRDYXBhYmlsaXRpZXM7XG4gIGdsb2JhbFRoaXM6IHR5cGVvZiBnbG9iYWxUaGlzO1xuICAvKipcbiAgICogSW5jcmVtZW50cyB3aGVuIGEgc3VzcGVuc2lvbiBpcyBhY2NlcHRlZCBhbmQgb24gZXZlcnkgcmV0YWluZWQtc2Vzc2lvblxuICAgKiByZXN1bWUuIFNURVAgc3VzcGVuc2lvbiBzaWduYWxzIGNhcHR1cmUgaXQgd2hlbiBzY2hlZHVsZWQgYW5kIG5vLW9wIGlmXG4gICAqIGl0IG1vdmVkIChzZWUgc3RlcC50cykg4oCUIHRoaXMgZHJvcHMgc2FtZS1ib3VuZGFyeSBzaWJsaW5nIHNpZ25hbHMgYW5kXG4gICAqIHRpbWVycyBxdWV1ZWQgYXQgYm91bmRhcnkgTiB0aGF0IHdvdWxkIGZpcmUgYWZ0ZXIgdGhlIHNlc3Npb24gcmVzdW1lZFxuICAgKiBpbnRvIGJvdW5kYXJ5IE4rMS4gU2xlZXAvaG9vay9hdHRyaWJ1dGUgc2lnbmFscyBhcmUgaW50ZW50aW9uYWxseVxuICAgKiB1bmd1YXJkZWQ6IHRoZWlyIHByZXNlbmNlIG1ha2VzIHRoZSBib3VuZGFyeSB1bnJldGFpbmFibGUsIHNvIGEgbGF0ZVxuICAgKiBzaWduYWwgY29ycmVjdGx5IGRlbW90ZXMgdGhlIHNlc3Npb24gKHdvcmtmbG93LnRzIGBvbldvcmtmbG93RXJyb3JgKS5cbiAgICovXG4gIHN1c3BlbnNpb25HZW5lcmF0aW9uOiBudW1iZXI7XG4gIGV2ZW50c0NvbnN1bWVyOiBFdmVudHNDb25zdW1lcjtcbiAgLyoqXG4gICAqIE1hcCBvZiBwZW5kaW5nIGludm9jYXRpb25zIGtleWVkIGJ5IGNvcnJlbGF0aW9uSWQuXG4gICAqIFVzaW5nIE1hcCBpbnN0ZWFkIG9mIEFycmF5IGZvciBPKDEpIGxvb2t1cC9kZWxldGUgb3BlcmF0aW9ucy5cbiAgICovXG4gIGludm9jYXRpb25zUXVldWU6IE1hcDxzdHJpbmcsIFF1ZXVlSXRlbT47XG4gIG9uV29ya2Zsb3dFcnJvcjogKGVycm9yOiBFcnJvcikgPT4gdm9pZDtcbiAgLyoqXG4gICAqIE1pbnRzIHRoZSBVTElEIGJvZHkgb2YgYSBjb3JyZWxhdGlvbiBpZC4gRXZlcnkgZW50aXR5IGEgcmVwbGF5IGNyZWF0ZXNcbiAgICogZHJhd3MgZnJvbSB0aGlzIG9uZSBtb25vdG9uaWMgc2VxdWVuY2UsIHNvIGFuIGlkIGlzIGFuIG9yZGluYWwgb3ZlciB0aGVcbiAgICogd2hvbGUgcnVuIGFuZCBib3RoIHJlcGxheXMgb2YgYSBydW4gbXVzdCBkcmF3IGluIHRoZSBzYW1lIG9yZGVyLlxuICAgKi9cbiAgZ2VuZXJhdGVVbGlkOiAoKSA9PiBzdHJpbmc7XG4gIGdlbmVyYXRlTmFub2lkOiAoKSA9PiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTZXF1ZW50aWFsIHByb21pc2UgcXVldWUgdGhhdCBlbnN1cmVzIGFsbCBldmVudC1kcml2ZW4gcHJvbWlzZSByZXNvbHV0aW9uc1xuICAgKiAoc3RlcCByZXN1bHRzLCBob29rIHBheWxvYWRzLCBmYWlsdXJlcywgc3VzcGVuc2lvbnMpIGhhcHBlbiBpbiBldmVudCBsb2dcbiAgICogb3JkZXIuIEV2ZXJ5IHJlc29sdmUsIHJlamVjdCwgb3Igd29ya2Zsb3cgZXJyb3IgaXMgY2hhaW5lZCB0aHJvdWdoIHRoaXNcbiAgICogcXVldWUgc28gdGhhdCBldmVuIGlmIGluZGl2aWR1YWwgb3BlcmF0aW9ucyB0YWtlIHZhcmlhYmxlIHRpbWUgKGUuZy4sXG4gICAqIGFzeW5jIGRlY3J5cHRpb24pLCBwcm9taXNlcyByZXNvbHZlIGRldGVybWluaXN0aWNhbGx5LlxuICAgKi9cbiAgcHJvbWlzZVF1ZXVlOiBQcm9taXNlPHZvaWQ+O1xuICAvKipcbiAgICogQ291bnRlciBvZiBpbi1mbGlnaHQgYXN5bmMgZGF0YSBkZWxpdmVyeSBvcGVyYXRpb25zIChzdGVwIHJlc3VsdFxuICAgKiBoeWRyYXRpb24sIGhvb2sgcGF5bG9hZCBoeWRyYXRpb24sIGFib3J0IHNpZ25hbCBoeWRyYXRpb24pLiBTdXNwZW5zaW9uc1xuICAgKiBtdXN0IHdhaXQgZm9yIHRoaXMgdG8gcmVhY2ggMCBiZWZvcmUgZmlyaW5nLCB0byBhdm9pZCBwcmVlbXB0aW5nIGRhdGFcbiAgICogZGVsaXZlcnkg4oCUIGUuZy4gZGVoeWRyYXRpbmcgYSBzdGVwJ3MgYXJndW1lbnRzIHdoaWxlIGFuIGFib3J0IHRoYXQgc2hvdWxkXG4gICAqIGJlIHJlZmxlY3RlZCBpbiB0aG9zZSBhcmd1bWVudHMgaXMgc3RpbGwgaHlkcmF0aW5nIGl0cyByZWFzb24uXG4gICAqL1xuICBwZW5kaW5nRGVsaXZlcmllczogbnVtYmVyO1xuICAvKipcbiAgICogT3JkZXJlZCByZWdpc3RyeSBvZiBpbi1mbGlnaHQgXCJicmFuY2gtZGVjaWRpbmdcIiBkZWxpdmVyaWVzIOKAlCB0aGVcbiAgICogcmVzb2x1dGlvbnMgYSB3b3JrZmxvdyB0eXBpY2FsbHkgYFByb21pc2UucmFjZWBzIG9uLCBvciBhd2FpdHMgZnJvbVxuICAgKiBpbmRlcGVuZGVudCBjb25jdXJyZW50IGJyYW5jaGVzOiBob29rIHBheWxvYWRzIChgaG9va19yZWNlaXZlZGApLCB3YWl0XG4gICAqIGNvbXBsZXRpb25zIChgd2FpdF9jb21wbGV0ZWRgKSwgYW5kIHN0ZXAgcmVzdWx0cyAoYHN0ZXBfY29tcGxldGVkYCAvXG4gICAqIGBzdGVwX2ZhaWxlZGApLiBLZXllZCBieSB0aGUgZGVsaXZlcnkncyBwb3NpdGlvbiAoaW5kZXgpIGluIHRoZSBjb25zdW1lZFxuICAgKiBldmVudCBsb2cuXG4gICAqXG4gICAqIFRoZSBwcm9ibGVtOiBlYWNoIG9mIHRoZXNlIHJlc29sdXRpb25zIHJlYWNoZXMgd29ya2Zsb3cgY29kZSBhZnRlciBhXG4gICAqIGRpZmZlcmVudCwgd29ya2xvYWQtZGVwZW5kZW50IG51bWJlciBvZiBtaWNyb3Rhc2sgaG9wcy4gQSBidWZmZXJlZCBob29rXG4gICAqIHBheWxvYWQgaXMgb2JzZXJ2ZWQgdmlhIHRoZSBhc3luYyBob29rIGl0ZXJhdG9yIChgeWllbGQgYXdhaXQgdGhpc2ApLFxuICAgKiBjb3N0aW5nIGV4dHJhIGhvcHM7IGEgYHdhaXRfY29tcGxldGVkYCByZXNvbHZlcyB3aXRoIGZld2VyLCBhbmQgYSByZXVzZWRcbiAgICogc2xlZXAgY2FuIHJlc29sdmUgaW4gYW4gZW50aXJlbHkgZWFybGllciBsb29wIGl0ZXJhdGlvbjsgYSBzdGVwIHJlc3VsdCBpc1xuICAgKiBnYXRlZCBvbiBoeWRyYXRpb24gd2hvc2UgY29zdCB2YXJpZXMgYmV0d2VlbiByZXBsYXlzIG9mIHRoZSBTQU1FXG4gICAqIGludm9jYXRpb24g4oCUIHRoZSBmaXJzdCByZXBsYXkgcGF5cyB0aGUgZnVsbCBkZWNyeXB0L2RlY29tcHJlc3MvcmV2aXZlLFxuICAgKiB3aGlsZSBsYXRlciByZXBsYXlzIHNoYXJpbmcgdGhlIGludm9jYXRpb24ncyBgUmVwbGF5UGF5bG9hZENhY2hlYFxuICAgKiBtZW1vLWhpdCBzbWFsbCBwcmltaXRpdmUgcmVzdWx0cyBhbmQgcmVzb2x2ZSBpbiBvbmUgb3IgdHdvIGhvcHMuIEVpdGhlclxuICAgKiB3YXksIHRoZSByZXNvbHV0aW9uIHRoYXQgdGhlIGNvbW1pdHRlZCBldmVudCBsb2cgb3JkZXJlZCBmaXJzdCBjYW4gbG9zZSBhXG4gICAqIGBQcm9taXNlLnJhY2VgIChvciBhIGB1c2VTdGVwYCBVTElEIGFsbG9jYXRpb24pIHRvIGEgZmFzdGVyLSBvclxuICAgKiBhbHJlYWR5LXJlc29sdmVkIGNvbXBldGl0b3IsIGRpdmVyZ2luZyBmcm9tIHRoZSBsb2cgYW5kIHN1cmZhY2luZyBhc1xuICAgKiBgQ29ycnVwdGVkRXZlbnRMb2dFcnJvcmAuXG4gICAqXG4gICAqIFRoZSBmaXggaXMgYSBzdHJpY3QsIGRldGVybWluaXN0aWMgZGVsaXZlcnkgb3JkZXIgYW5jaG9yZWQgb25cbiAgICogZXZlbnQtbG9nIHBvc2l0aW9uOiBhIGRlbGl2ZXJ5IGRvZXMgbm90IHJlc29sdmUgdG8gdGhlIHdvcmtmbG93IHVudGlsXG4gICAqIGV2ZXJ5IHJlbGV2YW50IGVhcmxpZXItaW4tbG9nIGRlbGl2ZXJ5IGhhcyBiZWVuIGRlbGl2ZXJlZC4gQmVjYXVzZSB0aGVcbiAgICogZ2F0ZSBpcyBcInRoZSBlYXJsaWVyIGRlbGl2ZXJ5IHJlc29sdmVkXCIsIG5vdCBcIndvbiBhIHRpbWluZyByYWNlXCIsIHRoZVxuICAgKiBvdXRjb21lIGlzIGluZGVwZW5kZW50IG9mIG1pY3JvdGFzayBob3BzLCBoeWRyYXRpb24vZGVjcnlwdGlvbiB0aW1lLFxuICAgKiBhbmQgYFByb21pc2UucmFjZWAgYXJndW1lbnQgb3JkZXIuIFdoaWNoIGVhcmxpZXIga2luZHMgYSBkZWxpdmVyeSBkZWZlcnNcbiAgICogYmVoaW5kIGlzIHNwZWxsZWQgb3V0IG9uIHtAbGluayBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzfS5cbiAgICpcbiAgICogSW5kZXggaXMgdXNlZCByYXRoZXIgdGhhbiB0aGUgYGV2ZW50SWRgIHN0cmluZyBiZWNhdXNlIGBldmVudElkYCBpcyBhblxuICAgKiBvcGFxdWUsIHdvcmxkLWFzc2lnbmVkIHZhbHVlIG5vdCBndWFyYW50ZWVkIHRvIHNvcnQgaW4gY3JlYXRpb24gb3JkZXJcbiAgICogKG9ubHkgdGhlIGJ1bmRsZWQgVUxJRCB3b3JsZHMgaGFwcGVuIHRvKS5cbiAgICpcbiAgICogT3B0aW9uYWwgc28gb2xkZXIvb3V0LW9mLXRyZWUgY29udGV4dHMgKGFuZCBsaWdodHdlaWdodCB0ZXN0IGhhcm5lc3NlcylcbiAgICogdGhhdCBkbyBub3QgaW5pdGlhbGl6ZSBpdCBkZWdyYWRlIGdyYWNlZnVsbHkgdG8gdGhlIHByZXZpb3VzIGJlaGF2aW9yLlxuICAgKi9cbiAgcGVuZGluZ0RlbGl2ZXJ5QmFycmllcnM/OiBNYXA8bnVtYmVyLCBEZWxpdmVyeUJhcnJpZXJFbnRyeT47XG4gIC8qKlxuICAgKiBJbnZvY2F0aW9uLXNjb3BlZCBjYWNoZSBvZiBwcmVwYXJlZCBzZXJpYWxpemVkIHBheWxvYWRzIGFuZCBpbW11dGFibGUgZmluYWxcbiAgICogdmFsdWVzLiBQcmVwYXJlZCBieXRlcyBzdXJ2aXZlIGZyZXNoIHJlcGxheSBWTXM7IG9iamVjdCBncmFwaHMgZG8gbm90LlxuICAgKi9cbiAgcmVwbGF5UGF5bG9hZENhY2hlOiBSZXBsYXlQYXlsb2FkQ2FjaGU7XG59XG5cbi8qKiBUaGUga2luZCBvZiBicmFuY2gtZGVjaWRpbmcgZGVsaXZlcnkgYSBiYXJyaWVyIHJlcHJlc2VudHMuICovXG5leHBvcnQgdHlwZSBEZWxpdmVyeUtpbmQgPSAnaG9vaycgfCAnd2FpdCcgfCAnc3RlcCc7XG5cbmludGVyZmFjZSBEZWxpdmVyeUJhcnJpZXJFbnRyeSB7XG4gIGtpbmQ6IERlbGl2ZXJ5S2luZDtcbiAgLyoqIFJlc29sdmVzIG9uY2UgdGhpcyBkZWxpdmVyeSBoYXMgcmVzb2x2ZWQgdG8gdGhlIHdvcmtmbG93LiAqL1xuICBkZWxpdmVyZWQ6IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgZGVsaXZlcnkgaXMgY29tbWl0dGVkIHRvIHJlYWNoaW5nIHRoZSB3b3JrZmxvdyB3aXRob3V0IGFueVxuICAgKiBmdXJ0aGVyIGFjdGlvbiBieSB3b3JrZmxvdyBjb2RlLiBUcnVlIGZvciB3YWl0IGNvbXBsZXRpb25zIGFuZCBzdGVwXG4gICAqIHJlc3VsdHMsIHdoaWNoIGFsd2F5cyByZXNvbHZlIGZyb20gdGhlaXIgb3duIGNoYWluLCBhbmQgZm9yIGEgaG9vayBwYXlsb2FkXG4gICAqIHRoYXQgYWxyZWFkeSBoYWQgYSB3YWl0aW5nIGNvbnN1bWVyIHdoZW4gaXQgd2FzIGNvbnN1bWVkLlxuICAgKlxuICAgKiBGYWxzZSBmb3IgYSBCVUZGRVJFRCBob29rIHBheWxvYWQgbm8gY29uc3VtZXIgaGFzIGNsYWltZWQgeWV0OiBpdCBpc1xuICAgKiBkZWxpdmVyZWQgYnkgYGNsYWltKClgLCBpLmUuIHdoZW5ldmVyIHRoZSB3b3JrZmxvdyBuZXh0IHJlYWRzIHRoZSBob29rIOKAlFxuICAgKiB3aGljaCBtYXkgYmUgY2F1c2FsbHkgKmFmdGVyKiBhIGxhdGVyLWluLWxvZyBkZWxpdmVyeS4gYGFybSgpYCBmbGlwcyBpdFxuICAgKiBvbmNlIGEgY29uc3VtZXIgdGFrZXMgdGhlIHBheWxvYWQuXG4gICAqL1xuICBhcm1lZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBXaGljaCBlYXJsaWVyIGtpbmRzIGVhY2ggZGVsaXZlcnkga2luZCBkZWZlcnMgYmVoaW5kLiBDaG9zZW4gc28gdGhhdCBubyBraW5kXG4gKiBibG9ja3Mgb24gYSBwZWVyIGl0IGRvZXMgbm90IG5lZWQgdG86XG4gKlxuICogIC0gYSBob29rIGRlZmVycyBiZWhpbmQgZWFybGllciBIT09LUywgV0FJVFMgYW5kIFNURVBTO1xuICogIC0gYSB3YWl0IGRlZmVycyBiZWhpbmQgZWFybGllciBIT09LUyBhbmQgU1RFUFMg4oCUIG5vdCBlYXJsaWVyIHdhaXRzLCBzaW5jZSBhXG4gKiAgICB3YWl0IG5ldmVyIG5lZWRzIHRvIHF1ZXVlIGJlaGluZCBhbm90aGVyIHdhaXQ7XG4gKiAgLSBhIHN0ZXAgZGVmZXJzIGJlaGluZCBlYXJsaWVyIFdBSVRTLCBIT09LUyBhbmQgU1RFUFMuXG4gKlxuICogVGhlIHN0ZXAtYmVoaW5kLXN0ZXAgZWRnZSBpcyBub3QgcmVkdW5kYW50IHdpdGggdGhlIHNlcmlhbCBgcHJvbWlzZVF1ZXVlYC5cbiAqIFRoZSBxdWV1ZSBmaXhlcyB0aGUgb3JkZXIgaW4gd2hpY2ggc3RlcCByZXN1bHRzIGFyZSBIWURSQVRFRCwgYnV0IGEgc3RlcCBub1xuICogbG9uZ2VyIHJlc29sdmVzIGluc2lkZSBpdHMgcXVldWUgc2xvdCDigJQgaXQgY2FwdHVyZXMgdGhlIG91dGNvbWUgdGhlcmUgYW5kXG4gKiByZXNvbHZlcyBmcm9tIGEgZGV0YWNoZWQgY29udGludWF0aW9uIG9uY2UgaXRzIGJhcnJpZXIgY2xlYXJzLiBUd28gc3RlcHNcbiAqIGFncmVlIG9uIHRoYXQgY29udGludWF0aW9uJ3Mgb3JkZXJpbmcgb25seSB3aGlsZSB0aGV5IGRlZmVyIGJlaGluZCB0aGUgc2FtZVxuICogc2V0LCB3aGljaCBob2xkcyB3aGVuIHRoZXkgYXJlIGNvbnN1bWVkIGluIHRoZSBzYW1lIGRyYWluIHdpbmRvdyBidXQgbm90XG4gKiBhY3Jvc3Mgd2luZG93czogYSBzdGVwIGNvbnN1bWVkIGxhdGVyIGNhbiBtaXNzIGEgd2FpdC9ob29rIGJhcnJpZXIgdGhhdCBhblxuICogZWFybGllciBzdGVwIGlzIHN0aWxsIHBhcmtlZCBvbiwgYmVjYXVzZSB0aGUgYmFycmllciByZXRpcmVkIGluIGJldHdlZW4uIFRoZVxuICogZWFybGllciBzdGVwIGlzIHRoZW4gd2FpdGluZyBvdXQgdGhlIG1hY3JvdGFzayB5aWVsZCBiZWxvdyB3aGlsZSB0aGUgbGF0ZXJcbiAqIG9uZSByZXNvbHZlcyBvbiBtaWNyb3Rhc2tzLCBhbmQgb3ZlcnRha2VzIGl0IOKAlCBzZWVcbiAqIGBkZWxpdmVyeS1iYXJyaWVyLWNvdmVyYWdlLnRlc3QudHNgLiBEZWZlcnJpbmcgYmVoaW5kIGVhcmxpZXIgc3RlcHNcbiAqIGNsb3NlcyB0aGF0IHdpbmRvdyBzdHJ1Y3R1cmFsbHk6IHRoZSBlYXJsaWVyIHN0ZXAncyBiYXJyaWVyIGlzIHN0aWxsXG4gKiByZWdpc3RlcmVkIHByZWNpc2VseSBiZWNhdXNlIGl0IGhhcyBub3QgZGVsaXZlcmVkIHlldC5cbiAqXG4gKiBFdmVyeSBlZGdlIHBvaW50cyBmcm9tIGEgbGF0ZXIgbG9nIGluZGV4IHRvIGEgc3RyaWN0bHkgZWFybGllciBvbmUsIHNvIHRoZVxuICogd2FpdC1mb3IgZ3JhcGggY2FuIG5ldmVyIGNvbnRhaW4gYSBjeWNsZS5cbiAqL1xuY29uc3QgREVGRVJfQkVISU5EOiBSZWNvcmQ8RGVsaXZlcnlLaW5kLCByZWFkb25seSBEZWxpdmVyeUtpbmRbXT4gPSB7XG4gIGhvb2s6IFsnaG9vaycsICd3YWl0JywgJ3N0ZXAnXSxcbiAgd2FpdDogWydob29rJywgJ3N0ZXAnXSxcbiAgc3RlcDogWyd3YWl0JywgJ2hvb2snLCAnc3RlcCddLFxufTtcblxuLyoqXG4gKiBXaGV0aGVyIGEgZGVsaXZlcnkgb2YgYGtpbmRgIGF0IGxvZyBpbmRleCBgaW5kZXhgIGdhdGVzIG9uIHRoZSBlYXJsaWVyXG4gKiByZWdpc3RyeSBlbnRyeSBgb3RoZXJgIChhdCBgb3RoZXJJbmRleGApLlxuICpcbiAqIFNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHRoYXQgcXVlc3Rpb24sIGNhbGxlZCBieSBib3RoXG4gKiB7QGxpbmsgYXdhaXRFYXJsaWVyRGVsaXZlcmllc30gKHdoaWNoIGF3YWl0cyB3aGF0IGl0IGdhdGVzIG9uKSBhbmRcbiAqIHtAbGluayBjb21wdXRlUmVzb2x2ZXNPbkl0c093bn0gKHdoaWNoIHJlY3Vyc2VzIGludG8gd2hhdCBpdCBnYXRlcyBvbikuXG4gKiBUaG9zZSB0d28gTVVTVCBhZ3JlZSBleGFjdGx5LCBhbmQgdGhlIGRvYyBibG9jayBvblxuICoge0BsaW5rIGF3YWl0RWFybGllckRlbGl2ZXJpZXN9IHN0YWtlcyBkZWFkbG9jay1mcmVlZG9tIG9uIGl0LCBzbyB0aGVcbiAqIGNvbmRpdGlvbiBsaXZlcyBoZXJlIHJhdGhlciB0aGFuIGJlaW5nIHNwZWxsZWQgb3V0IHR3aWNlLlxuICovXG5mdW5jdGlvbiBnYXRlc09uKFxuICBraW5kOiBEZWxpdmVyeUtpbmQsXG4gIGluZGV4OiBudW1iZXIsXG4gIG90aGVySW5kZXg6IG51bWJlcixcbiAgb3RoZXI6IERlbGl2ZXJ5QmFycmllckVudHJ5XG4pOiBib29sZWFuIHtcbiAgaWYgKG90aGVySW5kZXggPj0gaW5kZXggfHwgIURFRkVSX0JFSElORFtraW5kXS5pbmNsdWRlcyhvdGhlci5raW5kKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvLyBBIHN0ZXAgc2tpcHMgYW4gVU5BUk1FRCBlYXJsaWVyIGVudHJ5IChhbiB1bmNsYWltZWQgYnVmZmVyZWQgaG9va1xuICAvLyBwYXlsb2FkKSDigJQgc2VlIHRoZSBhc3ltbWV0cnkgZGVzY3JpYmVkIG9uIGBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzYC4gVGhlXG4gIC8vIHNraXAgaXMgZGlyZWN0LCBuZXZlciB0cmFuc2l0aXZlOiBhcm1lZCBlbnRyaWVzIGFyZSBzdGlsbCBnYXRlZCBvbiwgZXZlblxuICAvLyB3aGVuIHRoZXkgYXJlIHRoZW1zZWx2ZXMgcGFya2VkIGJlaGluZCBzdWNoIGEgcGF5bG9hZC5cbiAgcmV0dXJuICEoa2luZCA9PT0gJ3N0ZXAnICYmICFvdGhlci5hcm1lZCk7XG59XG5cbi8qKlxuICogV2hldGhlciBgZW50cnlgIHdpbGwgcmVzb2x2ZSBvbiBpdHMgb3duIOKAlCBpdCBpcyBhcm1lZCwgYW5kIGV2ZXJ5IGVhcmxpZXJcbiAqIGRlbGl2ZXJ5IGl0IGFjdHVhbGx5IGdhdGVzIG9uICh7QGxpbmsgZ2F0ZXNPbn0pIHdpbGwgbGlrZXdpc2UgcmVzb2x2ZSBvbiBpdHNcbiAqIG93bi5cbiAqXG4gKiBBIHN0ZXAgZG9lcyBub3QgZ2F0ZSBvbiBhbiB1bmNsYWltZWQgYnVmZmVyZWQgcGF5bG9hZCwgc28gc3VjaCBhIHBheWxvYWRcbiAqIGNhbm5vdCBrZWVwIGl0IGZyb20gcmVzb2x2aW5nLiBBIHN0ZXAgRE9FUyBnYXRlIG9uIGVhcmxpZXIgYXJtZWQgd2FpdHMgYW5kXG4gKiBob29rcywgc28gb25lIHBhcmtlZCBiZWhpbmQgYW4gdW5jbGFpbWVkIHBheWxvYWQgbWFrZXMgdGhlIHN0ZXBcbiAqIG5vbi1zZWxmLXJlc29sdmluZyBpbiB0dXJuLiBEaXNhZ3JlZWluZyB3aXRoIHtAbGluayBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzfVxuICogaGVyZSB3b3VsZCBub3QgYmUgYSBjb3NtZXRpYyBwcm9ibGVtOiB0aGlzIHByZWRpY2F0ZSBpcyB3aGF0XG4gKiB7QGxpbmsgaGFzUGFya2VkQ29tbWl0dGVkRGVsaXZlcnl9IHVzZXMgdG8gZGVjaWRlIHdoZXRoZXIgaWRsZSBpcyByZWFjaGFibGUsXG4gKiBhbmQgYW4gZW50cnkgcmVwb3J0ZWQgc2VsZi1yZXNvbHZpbmcgd2hpbGUgaXQgaXMgaW4gZmFjdCBwYXJrZWQgYmVoaW5kIGFcbiAqIHBheWxvYWQgdGhhdCBvbmx5IHRoZSBpZGxlIHNhZmV0eSBuZXQgY2FuIHJldGlyZSB3b3VsZCBnYXRlIGl0cyBvd25cbiAqIHJldGlyZW1lbnQuXG4gKlxuICogUmVjdXJzaW9uIHRlcm1pbmF0ZXMgYmVjYXVzZSBldmVyeSBlZGdlIHBvaW50cyB0byBhIHN0cmljdGx5IHNtYWxsZXIgaW5kZXguXG4gKiBgbWVtb2Aga2VlcHMgdGhlIHdhbGsgbGluZWFyIGluIHJlZ2lzdHJ5IHNpemUsIGFuZCB0aGUgcmVnaXN0cnkgaXMgbm90IHNtYWxsXG4gKiBieSBjb25zdHJ1Y3Rpb24g4oCUIGBFdmVudHNDb25zdW1lcmAgZHJhaW5zIGNvbnNlY3V0aXZlbHkgY29uc3VtYWJsZSBldmVudHNcbiAqIHN5bmNocm9ub3VzbHkgd2hpbGUgYmFycmllcnMgb25seSByZXRpcmUgb24gbWljcm90YXNrLWRyaXZlbiBkZWxpdmVyaWVzLCBzb1xuICogYSBmYW4tb3V0IG9mIGBQcm9taXNlLnJhY2UoW2hvb2ssIHNsZWVwXSlgIGJyYW5jaGVzIGFjY3VtdWxhdGVzIG9uZSBiYXJyaWVyXG4gKiBwZXIgYnJhbmNoIHBlciBraW5kLiBUaGUgbWVtbyBNVVNUIGJlIHBlci1jYWxsOiBgYXJtZWRgIG11dGF0ZXMgYmV0d2VlblxuICogY2FsbHMgYXMgYnVmZmVyZWQgcGF5bG9hZHMgYXJlIGNsYWltZWQuXG4gKlxuICogVGhlIG1lbW8gaXMgYW4gb3B0aW1pemF0aW9uLCBub3QgYSBjb3JyZWN0bmVzcyByZXF1aXJlbWVudC4gSXQgb25jZSB3YXMgb25lOlxuICogYGF3YWl0RWFybGllckRlbGl2ZXJpZXNgIHVzZWQgdG8gcnVuIHRoaXMgd2FsayBmb3IgZXZlcnkgZWFybGllciBlbnRyeSBvZiBhXG4gKiBzdGVwIGRlbGl2ZXJ5LCB3aXRoIG5vIGVhcmx5IGV4aXQsIHdoaWNoIHVubWVtb2l6ZWQgaXMgVChuKSA9IM6jIFQoaikg4oCUXG4gKiBtZWFzdXJlZCBhdCA0LjNlOCByZWN1cnNpdmUgY2FsbHMgKDg0cykgZm9yIDQwIGFsdGVybmF0aW5nIGFybWVkIGhvb2svd2FpdFxuICogYmFycmllcnMuIFRoYXQgY2FsbCBzaXRlIGlzIGdvbmU7IGEgc3RlcCBub3cgdGVzdHMgYGFybWVkYCBkaXJlY3RseS4gVGhlIG9uZVxuICogc3Vydml2aW5nIGNhbGxlciwge0BsaW5rIGhhc1BhcmtlZENvbW1pdHRlZERlbGl2ZXJ5fSwgY2Fubm90IHJlYWNoIHRoYXRcbiAqIHNoYXBlOiBpdCByZXR1cm5zIGF0IHRoZSBGSVJTVCBzZWxmLXJlc29sdmluZyBlbnRyeSwgc28gaXQgb25seSBldmVyXG4gKiBhZHZhbmNlcyBwYXN0IGVudHJpZXMgdGhhdCBhcmUgbm9uLXNlbGYtcmVzb2x2aW5nLCBhbmQgdGhvc2Ugc2hvcnQtY2lyY3VpdFxuICogb24gdGhlaXIgZmlyc3QgZmFsc2UgY2hpbGQuIEV2ZXJ5IGVudHJ5IGl0IGV2YWx1YXRlcyB0aGVyZWZvcmUgaGFzXG4gKiBhbGwtZmFsc2UgcHJlZGVjZXNzb3JzIGFuZCByZXR1cm5zIGFmdGVyIG9uZSBjaGlsZCwgZGVnZW5lcmF0aW5nIHRoZSB3YWxrIHRvXG4gKiBhIGNoYWluIChtZWFzdXJlZDogOTggY2FsbHMgdW5tZW1vaXplZCBmb3IgdGhlIHdvcnN0IDQwLWJhcnJpZXIgc2hhcGUsIDFcbiAqIGNhbGwgZm9yIHRoZSByZWdpc3RyeSBhYm92ZSkuIERvIG5vdCByZXN0b3JlIGFuIGV4cG9uZW50aWFsIGNsYWltIGhlcmVcbiAqIHdpdGhvdXQgcmVzdG9yaW5nIGEgY2FsbGVyIHRoYXQgY2FuIHByb2R1Y2UgaXQuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVzT25JdHNPd24oXG4gIGJhcnJpZXJzOiBNYXA8bnVtYmVyLCBEZWxpdmVyeUJhcnJpZXJFbnRyeT4sXG4gIGluZGV4OiBudW1iZXIsXG4gIGVudHJ5OiBEZWxpdmVyeUJhcnJpZXJFbnRyeSxcbiAgbWVtbzogTWFwPG51bWJlciwgYm9vbGVhbj5cbik6IGJvb2xlYW4ge1xuICBjb25zdCBjYWNoZWQgPSBtZW1vLmdldChpbmRleCk7XG4gIGlmIChjYWNoZWQgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBjYWNoZWQ7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gY29tcHV0ZVJlc29sdmVzT25JdHNPd24oYmFycmllcnMsIGluZGV4LCBlbnRyeSwgbWVtbyk7XG4gIG1lbW8uc2V0KGluZGV4LCByZXN1bHQpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBjb21wdXRlUmVzb2x2ZXNPbkl0c093bihcbiAgYmFycmllcnM6IE1hcDxudW1iZXIsIERlbGl2ZXJ5QmFycmllckVudHJ5PixcbiAgaW5kZXg6IG51bWJlcixcbiAgZW50cnk6IERlbGl2ZXJ5QmFycmllckVudHJ5LFxuICBtZW1vOiBNYXA8bnVtYmVyLCBib29sZWFuPlxuKTogYm9vbGVhbiB7XG4gIGlmICghZW50cnkuYXJtZWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZm9yIChjb25zdCBbb3RoZXJJbmRleCwgb3RoZXJdIG9mIGJhcnJpZXJzKSB7XG4gICAgaWYgKCFnYXRlc09uKGVudHJ5LmtpbmQsIGluZGV4LCBvdGhlckluZGV4LCBvdGhlcikpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoIXJlc29sdmVzT25JdHNPd24oYmFycmllcnMsIG90aGVySW5kZXgsIG90aGVyLCBtZW1vKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBBd2FpdHMsIGluIHN0cmljdCBldmVudC1sb2cgb3JkZXIsIGV2ZXJ5IHN0aWxsLXJlZ2lzdGVyZWQgZGVsaXZlcnkgdGhhdCBpc1xuICogZWFybGllciBpbiB0aGUgbG9nIHRoYW4gYGV2ZW50SW5kZXhgIGFuZCB0aGF0IGEgZGVsaXZlcnkgb2YgYGtpbmRgIGRlZmVyc1xuICogYmVoaW5kIChzZWUge0BsaW5rIERFRkVSX0JFSElORH0pLCBzbyB0aGF0IHRoaXMgcmVzb2x1dGlvbiBpcyBoYW5kZWQgdG8gdGhlXG4gKiB3b3JrZmxvdyBvbmx5IGFmdGVyIGFsbCByZWxldmFudCBlYXJsaWVyLWluLWxvZyBkZWxpdmVyaWVzIGhhdmUgYmVlbi4gVGhpc1xuICogaXMgd2hhdCBrZWVwcyBhIGBQcm9taXNlLnJhY2VgIOKAlCBvciB0aGUgVUxJRCBhIGZvbGxvdy11cCBgdXNlU3RlcGAgZHJhd3Mgb25cbiAqIGEgY29uY3VycmVudCBicmFuY2gg4oCUIGRldGVybWluaXN0aWMgYW5kIGFsaWduZWQgd2l0aCB0aGUgY29tbWl0dGVkIGV2ZW50XG4gKiBsb2csIGluZGVwZW5kZW50IG9mIG1pY3JvdGFzay1ob3AgY291bnRzLCBoeWRyYXRpb24gdGltZSwgb3IgcmFjZS1hcmd1bWVudFxuICogb3JkZXIuIFdoZW4gdGhpcyBkZWxpdmVyeSBkb2VzIGhhdmUgdG8gd2FpdCwgaXQgYWxzbyB5aWVsZHMgYSBtYWNyb3Rhc2tcbiAqIGFmdGVyd2FyZHMgc28gdGhlIGVhcmxpZXIgZGVsaXZlcnkncyBjb25zdW1lciBjYW4gcnVuIHRvIGl0cyBvd24gbmV4dFxuICogc3VzcGVuc2lvbiBwb2ludCBmaXJzdDsgc2VlIHRoZSBjb21tZW50IGF0IHRoYXQgYGF3YWl0YCBmb3Igd2h5IG9yZGVyaW5nIHRoZVxuICogYHJlc29sdmUoKWAgY2FsbHMgYWxvbmUgaXMgbm90IGVub3VnaC5cbiAqXG4gKiBXaGF0IGNvdW50cyBhcyBcImRlZmVycyBiZWhpbmRcIiBpcyB7QGxpbmsgZ2F0ZXNPbn0sIHNoYXJlZCB3aXRoXG4gKiB7QGxpbmsgY29tcHV0ZVJlc29sdmVzT25JdHNPd259IHNvIHRoZSB0d28gY2Fubm90IGRyaWZ0LlxuICpcbiAqIE9uZSBhc3ltbWV0cnk6IGEgU1RFUCByZXN1bHQgc2tpcHMgYW55IGVhcmxpZXIgZGVsaXZlcnkgdGhhdCBpcyBVTkFSTUVELFxuICogaS5lLiBhIGJ1ZmZlcmVkIGhvb2sgcGF5bG9hZCBubyBjb25zdW1lciBoYXMgY2xhaW1lZC4gU3VjaCBhIHBheWxvYWQgaXNcbiAqIGRlbGl2ZXJlZCBvbmx5IHdoZW4gdGhlIHdvcmtmbG93IG5leHQgcmVhZHMgdGhlIGhvb2ssIGFuZCByZWFjaGluZyB0aGF0IHJlYWRcbiAqIHZlcnkgY29tbW9ubHkgcmVxdWlyZXMgdGhlIHN0ZXAgcmVzdWx0IGl0c2VsZiAoYGF3YWl0IHN0ZXBYKClgIGJlZm9yZSB0aGVcbiAqIHJlYWQpLiBHYXRpbmcgdGhlIHN0ZXAgb24gaXQgd291bGQgc3RhbGwgdGhlIHdvcmtmbG93IHVudGlsIHRoZSBiYXJyaWVyJ3NcbiAqIGlkbGUgc2FmZXR5IG5ldCBmaXJlcywgd2hpY2ggdGhlbiByZWxlYXNlcyBldmVyeSBkZWxpdmVyeSBxdWV1ZWQgYmVoaW5kIHRoYXRcbiAqIHBheWxvYWQgYXQgb25jZSDigJQgbG9zaW5nIGV4YWN0bHkgdGhlIHJhY2UgdGhpcyBvcmRlcmluZyBleGlzdHMgdG8gcHJvdGVjdC5cbiAqIFdhaXRzIGFuZCBob29rcyBrZWVwIGdhdGluZyBvbiB1bmNsYWltZWQgcGF5bG9hZHM6IGZvciB0aGVtLCB3YWl0aW5nIGZvciB0aGVcbiAqIGNsYWltIElTIHRoZSBvcmRlcmluZyBndWFyYW50ZWUgKGEgYHdhaXRfY29tcGxldGVkYCBtdXN0IG5vdCBwcmVlbXB0IGFcbiAqIHBheWxvYWQgdGhlIGxvZyBvcmRlcmVkIGZpcnN0KS5cbiAqXG4gKiBUaGUgc2tpcCBpcyBkaXJlY3QsIG5ldmVyIHRyYW5zaXRpdmUuIEEgc3RlcCBzdGlsbCBnYXRlcyBvbiBhbiBlYXJsaWVyIEFSTUVEXG4gKiB3YWl0IG9yIGhvb2ssIGluY2x1ZGluZyBvbmUgdGhhdCBpcyBpdHNlbGYgcGFya2VkIGJlaGluZCBhbiB1bmNsYWltZWRcbiAqIHBheWxvYWQuIFNraXBwaW5nIHRob3NlIHRvbyB3b3VsZCBpbnZlcnQgbG9nIG9yZGVyIGZvciB0aGUgY29tbW9uZXN0IHNoYXBlXG4gKiB0aGVyZSBpczogYSB3b3JrZmxvdyB0aGF0IGNyZWF0ZXMgYSBob29rIGl0IGRvZXMgbm90IHJlYWQgb24gdGhpcyBicmFuY2gsXG4gKiByYWNlcyBgc3RlcGAgYWdhaW5zdCBgc2xlZXBgLCBhbmQgaGFzIHRoZSBsb2cgc2F5IHRoZSBzbGVlcCB3b24uIFRoZSBzdGVwXG4gKiB3b3VsZCB0aGVuIG92ZXJ0YWtlIHRoZSB3YWl0LCBib3RoIGJyYW5jaGVzIHdvdWxkIHN3YXAgdGhlIGNvcnJlbGF0aW9uIGlkc1xuICogdGhleSBkcmF3IG5leHQsIGFuZCByZXBsYXkgd291bGQgZGl2ZXJnZSDigJQgc2VlXG4gKiBgc3RlcC1kZWxpdmVyeS1vcmRlcmluZy50ZXN0LnRzYC4gV2FpdGluZyBpbnN0ZWFkIGlzIHNhZmUgYmVjYXVzZSB0aGVcbiAqIHBheWxvYWQncyBvd24gaWRsZSBzYWZldHkgbmV0IHJldGlyZXMgaXQgYW5kIHRoZSB3aG9sZSBjaGFpbiB0aGVuIGRlbGl2ZXJzXG4gKiBpbiBsb2cgb3JkZXI7IHtAbGluayBoYXNQYXJrZWRDb21taXR0ZWREZWxpdmVyeX0gZGVsaWJlcmF0ZWx5IHJlcG9ydHMgc3VjaCBhXG4gKiBzdGVwIGFzIG5vdCBzZWxmLXJlc29sdmluZyBzbyB0aGF0IGlkbGUgc3RheXMgcmVhY2hhYmxlLlxuICpcbiAqIFwiVGhlIHdob2xlIGNoYWluIHRoZW4gZGVsaXZlcnMgaW4gbG9nIG9yZGVyXCIgcmVzdHMgb24gdGhlIFBBWUxPQUQncyBzYWZldHlcbiAqIG5ldCBvYnNlcnZpbmcgaWRsZSBiZWZvcmUgdGhlIG5ldCBvZiB0aGUgd2FpdCBwYXJrZWQgYmVoaW5kIGl0LiBJZiB0aGVcbiAqIHdhaXQncyBuZXQgZmlyZWQgZmlyc3QsIHRoZSBzdGVwJ3MgZ2F0ZSB3b3VsZCBvcGVuIHdoaWxlIHRoZSB3YWl0IHdhcyBzdGlsbFxuICogcGFya2VkIG9uIHRoZSBwYXlsb2FkIGJhcnJpZXIgYW5kIHRoZSBpbnZlcnNpb24gYWJvdmUgd291bGQgcmVhcHBlYXIuIFdpdGhpblxuICogb25lIGRyYWluIHdpbmRvdyB0aGF0IG9yZGVyIGlzIHN0cnVjdHVyYWwsIGFuZCBjYXJyaWVkIGJ5IEZJRk8gb2YgdGhlXG4gKiBzYWZldHktbmV0IHBvbGxzOiBuZXRzIGFybSB2aWEgYHNldFRpbWVvdXRgIGluIGxvZyBvcmRlciBkdXJpbmcgc3luY2hyb25vdXNcbiAqIGNvbnN1bXB0aW9uLCBlYWNoIHBvbGxpbmcgcm91bmQgcmUtYXJtcyB0aHJvdWdoIGBwcm9taXNlUXVldWUudGhlbiguLi4pYCBpblxuICogdGhlIG9yZGVyIHRoZSBjaGVja3MgcmFuLCBhbmQgZWFjaCBuZXQgdGhhdCBmaXJlcyBmbGlwc1xuICoge0BsaW5rIGhhc1BhcmtlZENvbW1pdHRlZERlbGl2ZXJ5fSBiYWNrIHRvIHRydWUsIHJlLWJsb2NraW5nIHRoZSByZXN0IHVudGlsXG4gKiB0aGUgcmVsZWFzZWQgZGVsaXZlcnkgY29tcGxldGVzLiBSZXBsYXkg4oCUIHdoZXJlIGRpdmVyZ2VuY2UgbWFuaWZlc3RzIOKAlFxuICogYWx3YXlzIGNvbnN1bWVzIHRoZSBsb2cgaW4gb25lIHdpbmRvdy4gRG8gbm90IFwib3B0aW1pemVcIiB0aGUgbmV0IHNjaGVkdWxpbmdcbiAqIGluIGEgd2F5IHRoYXQgYnJlYWtzIHRoYXQgcGVyLXdpbmRvdyBGSUZPLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXdhaXRFYXJsaWVyRGVsaXZlcmllcyhcbiAgY3R4OiBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQsXG4gIGV2ZW50SW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAga2luZDogRGVsaXZlcnlLaW5kXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gRGVmZW5zaXZlOiB0b2xlcmF0ZSBjb250ZXh0cyB0aGF0IHByZWRhdGUgdGhpcyBmaWVsZCAodGVzdCBoYXJuZXNzZXMpLlxuICBpZiAoXG4gICAgZXZlbnRJbmRleCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgIWN0eC5wZW5kaW5nRGVsaXZlcnlCYXJyaWVycyB8fFxuICAgIGN0eC5wZW5kaW5nRGVsaXZlcnlCYXJyaWVycy5zaXplID09PSAwXG4gICkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBiYXJyaWVycyA9IGN0eC5wZW5kaW5nRGVsaXZlcnlCYXJyaWVycztcbiAgY29uc3QgZWFybGllcjogUHJvbWlzZTx2b2lkPltdID0gW107XG4gIGZvciAoY29uc3QgW2luZGV4LCBlbnRyeV0gb2YgYmFycmllcnMpIHtcbiAgICBpZiAoIWdhdGVzT24oa2luZCwgZXZlbnRJbmRleCwgaW5kZXgsIGVudHJ5KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGVhcmxpZXIucHVzaChlbnRyeS5kZWxpdmVyZWQpO1xuICB9XG4gIGlmIChlYXJsaWVyLmxlbmd0aCA+IDApIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChlYXJsaWVyKTtcbiAgICAvLyBBbiBlYXJsaWVyIGRlbGl2ZXJ5IGJlaW5nIFwiZGVsaXZlcmVkXCIgb25seSBtZWFucyBpdHMgYHJlc29sdmUoKWAgcmFuLlxuICAgIC8vIFRoZSBicmFuY2ggaXQgd29rZSBtYXkgbmVlZCBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIGZ1cnRoZXIgbWljcm90YXNrXG4gICAgLy8gaG9wcyBiZWZvcmUgaXQgcmVhY2hlcyBpdHMgbmV4dCBgdXNlU3RlcGAgY2FsbCBhbmQgZHJhd3MgYSBVTElEIOKAlCBhXG4gICAgLy8gYGZvciBhd2FpdGAgb3ZlciBhIGhvb2ssIGZvciBpbnN0YW5jZSwgcmVzdW1lcyB0aGUgZ2VuZXJhdG9yLCBzZXR0bGVzXG4gICAgLy8gdGhlIHByb21pc2UgZnJvbSBgbmV4dCgpYCwgYW5kIG9ubHkgdGhlbiBydW5zIHRoZSBsb29wIGJvZHkuIFJlc29sdmluZ1xuICAgIC8vIHRoaXMgZGVsaXZlcnkgb24gYSBtaWNyb3Rhc2sgd291bGQgbGV0IGl0IG92ZXJ0YWtlIHRoYXQgYnJhbmNoIGFuZFxuICAgIC8vIHJlb3JkZXIgdGhlIFVMSUQgYWxsb2NhdGlvbiBhbnl3YXksIHR1cm5pbmcgdGhlIGd1YXJhbnRlZSBiZWxvdyBpbnRvIGFcbiAgICAvLyBob3AtY291bnQgcmFjZSB0aGF0IGhvbGRzIG9ubHkgZm9yIHRoZSBzaG9ydGVzdCBjb25zdW1lcnMuXG4gICAgLy9cbiAgICAvLyBZaWVsZGluZyBhIG1hY3JvdGFzayBsZXRzIHRoZSBlYXJsaWVyIGJyYW5jaCdzIGVudGlyZSBtaWNyb3Rhc2sgY2hhaW5cbiAgICAvLyBkcmFpbiBmaXJzdCwgd2hhdGV2ZXIgaXRzIGxlbmd0aCwgc28gbG9nIG9yZGVyIHN1cnZpdmVzIHJlZ2FyZGxlc3Mgb2ZcbiAgICAvLyBob3cgdGhlIHdvcmtmbG93IGNvbnN1bWVzIHRoZSBlYXJsaWVyIGRlbGl2ZXJ5LiBPbmx5IGRlbGl2ZXJpZXMgdGhhdFxuICAgIC8vIGFjdHVhbGx5IGhhZCB0byBkZWZlciBwYXkgdGhpcywgc28gdGhlIGNvbW1vbiBzaW5nbGUtZGVsaXZlcnkgZHJhaW4gaXNcbiAgICAvLyB1bmFmZmVjdGVkLlxuICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDApKTtcbiAgfVxufVxuXG4vKiogSGFuZGxlIGZvciBhIHJlZ2lzdGVyZWQgYnJhbmNoLWRlY2lkaW5nIGRlbGl2ZXJ5IGJhcnJpZXIuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbGl2ZXJ5QmFycmllciB7XG4gIC8qKlxuICAgKiBNYXJrIHRoaXMgZGVsaXZlcnkgYXMgZGVsaXZlcmVkIHRvIHRoZSB3b3JrZmxvdy4gUmVzb2x2ZXMgaXRzXG4gICAqIGBkZWxpdmVyZWRgIHByb21pc2Ugc28gYW55IGxhdGVyLWluLWxvZyBkZWxpdmVyeSBnYXRlZCBvbiBpdCAodmlhXG4gICAqIHtAbGluayBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzfSkgbWF5IHByb2NlZWQsIGFuZCByZW1vdmVzIGl0IGZyb20gdGhlXG4gICAqIHJlZ2lzdHJ5LiBJZGVtcG90ZW50LlxuICAgKi9cbiAgbWFya0RlbGl2ZXJlZDogKCkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIE1hcmsgdGhpcyBkZWxpdmVyeSBhcyBjb21taXR0ZWQgdG8gaGFwcGVuaW5nLCBmb3IgYSBiYXJyaWVyIHJlZ2lzdGVyZWRcbiAgICogdW5hcm1lZCAoYSBidWZmZXJlZCBob29rIHBheWxvYWQpIG9uY2UgYSBjb25zdW1lciBoYXMgY2xhaW1lZCBpdC4gRnJvbVxuICAgKiB0aGVuIG9uIGEgbGF0ZXIgc3RlcCByZXN1bHQgbWF5IGJlIG9yZGVyZWQgYmVoaW5kIGl0LiBJZGVtcG90ZW50LlxuICAgKi9cbiAgYXJtOiAoKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVyIGEgYnJhbmNoLWRlY2lkaW5nIGRlbGl2ZXJ5IGF0IGl0cyBldmVudC1sb2cgaW5kZXggc28gdGhhdCBsYXRlclxuICogZGVsaXZlcmllcyBjYW4gYmUgb3JkZXJlZCBzdHJpY3RseSBhZnRlciBpdC4gUmV0dXJucyBhbiBpbmVydCBoYW5kbGUgd2hlblxuICogYHBlbmRpbmdEZWxpdmVyeUJhcnJpZXJzYCBpcyBub3QgaW5pdGlhbGl6ZWQuXG4gKlxuICogUGFzcyBgYXJtZWQ6IGZhbHNlYCBmb3IgYSBkZWxpdmVyeSB3aG9zZSByZXNvbHV0aW9uIHdhaXRzIG9uIHdvcmtmbG93IGNvZGVcbiAqIGFza2luZyBmb3IgaXQgKGEgYnVmZmVyZWQgaG9vayBwYXlsb2FkKTsgY2FsbCBgYXJtKClgIHdoZW4gaXQgZG9lcy5cbiAqXG4gKiBUbyBndWFyYW50ZWUgYSBsYXRlciBkZWxpdmVyeSBnYXRlZCBvbiB0aGlzIG9uZSBjYW4gbmV2ZXIgaGFuZyB3aGVuIHRoaXNcbiAqIGRlbGl2ZXJ5IGlzIGFiYW5kb25lZCAodGhlIHdvcmtmbG93IHRvb2sgYSBkaWZmZXJlbnQgYnJhbmNoIG9yIGlzXG4gKiBzdXNwZW5kaW5nIGFuZCBuZXZlciBvYnNlcnZlcyBpdCksIHRoZSBiYXJyaWVyIGF1dG8tcmVzb2x2ZXMgYXQgaWRsZS5cbiAqXG4gKiBJTlZBUklBTlQgcmVxdWlyZWQgb2YgZXZlcnkgY2FsbCBzaXRlOiBhIGJhcnJpZXIgdGhhdCBpcyBldmVyIGBhcm1lZGAgbXVzdFxuICogYmUgcGFpcmVkIHdpdGggYSBkZWxpdmVyeSBjaGFpbiB0aGF0IHJ1bnMgdW5jb25kaXRpb25hbGx5IOKAlCBhdHRhY2hlZCB3aGVuXG4gKiB0aGUgZXZlbnQgaXMgY29uc3VtZWQgKHdhaXRzLCBzdGVwIHJlc3VsdHMsIHdhaXRpbmctY29uc3VtZXIgaG9vayBwYXlsb2FkcyxcbiAqIGFib3J0cyksIG9yIGJ5IHRoZSBgY2xhaW0oKWAgd2hvc2UgaW52b2NhdGlvbiBpcyB3aGF0IGFybXMgaXQgKGJ1ZmZlcmVkXG4gKiBob29rIHBheWxvYWRzKS4gVGhlIGlkbGUgY2hlY2sgKHtAbGluayBzY2hlZHVsZVdoZW5JZGxlfSkgcmVmdXNlcyB0b1xuICogb2JzZXJ2ZSBpZGxlIHdoaWxlIGFuIGFybWVkLCBzZWxmLXJlc29sdmluZyBiYXJyaWVyIGlzIHVuZGVsaXZlcmVkLCBhbmQgdGhlXG4gKiBzYWZldHkgbmV0IGJlbG93IGlzIGl0c2VsZiBpZGxlLWdhdGVkIOKAlCBzbyBhbiBhcm1lZCBiYXJyaWVyIHdpdGggbm9cbiAqIHVuY29uZGl0aW9uYWwgY2hhaW4gd291bGQgbGl2ZWxvY2sgZXZlcnkgaWRsZSBjaGVjayBpbiB0aGUgcnVuLCBpbmNsdWRpbmdcbiAqIGl0cyBvd24gcmV0aXJlbWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRGVsaXZlcnlCYXJyaWVyKFxuICBjdHg6IFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dCxcbiAgZXZlbnRJbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICBraW5kOiBEZWxpdmVyeUtpbmQsXG4gIG9wdGlvbnM6IHsgYXJtZWQ/OiBib29sZWFuIH0gPSB7fVxuKTogRGVsaXZlcnlCYXJyaWVyIHtcbiAgY29uc3QgYmFycmllcnMgPSBjdHgucGVuZGluZ0RlbGl2ZXJ5QmFycmllcnM7XG4gIGlmICghYmFycmllcnMgfHwgZXZlbnRJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHsgbWFya0RlbGl2ZXJlZDogKCkgPT4ge30sIGFybTogKCkgPT4ge30gfTtcbiAgfVxuXG4gIGxldCBkb25lID0gZmFsc2U7XG4gIGNvbnN0IHsgcHJvbWlzZSwgcmVzb2x2ZSB9ID0gd2l0aFJlc29sdmVyczx2b2lkPigpO1xuICBjb25zdCBlbnRyeTogRGVsaXZlcnlCYXJyaWVyRW50cnkgPSB7XG4gICAga2luZCxcbiAgICBkZWxpdmVyZWQ6IHByb21pc2UsXG4gICAgYXJtZWQ6IG9wdGlvbnMuYXJtZWQgPz8gdHJ1ZSxcbiAgfTtcbiAgYmFycmllcnMuc2V0KGV2ZW50SW5kZXgsIGVudHJ5KTtcblxuICBjb25zdCBmaW5pc2ggPSAoKSA9PiB7XG4gICAgaWYgKGRvbmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZG9uZSA9IHRydWU7XG4gICAgaWYgKGJhcnJpZXJzLmdldChldmVudEluZGV4KSA9PT0gZW50cnkpIHtcbiAgICAgIGJhcnJpZXJzLmRlbGV0ZShldmVudEluZGV4KTtcbiAgICB9XG4gICAgcmVzb2x2ZSgpO1xuICB9O1xuXG4gIC8vIFNhZmV0eSBuZXQ6IGlmIHRoaXMgZGVsaXZlcnkgaXMgbmV2ZXIgZGVsaXZlcmVkIHRvIHRoZSB3b3JrZmxvdyAoaXRzXG4gIC8vIGJyYW5jaCB3YXMgbm90IHRha2VuIC8gdGhlIHJ1biBpcyBzdXNwZW5kaW5nLCBvciBhIGJ1ZmZlcmVkIGhvb2sgcGF5bG9hZFxuICAvLyBpcyBvbmx5IGNsYWltZWQgYWZ0ZXIgYSBsYXRlciBkZWxpdmVyeSB0aGUgd29ya2Zsb3cgaXMgc3RpbGwgd2FpdGluZyBvbiksXG4gIC8vIHJlc29sdmUgYXQgaWRsZSBzbyBhIGxhdGVyIGRlbGl2ZXJ5IGdhdGVkIG9uIGl0IGNhbm5vdCBkZWFkbG9jayBhbmQgdGhlXG4gIC8vIHJlZ2lzdHJ5IGNhbm5vdCBsZWFrIGFuIGVudHJ5IHBlciBhYmFuZG9uZWQgZGVsaXZlcnkuXG4gIHNjaGVkdWxlV2hlbklkbGUoY3R4LCBmaW5pc2gpO1xuXG4gIHJldHVybiB7XG4gICAgbWFya0RlbGl2ZXJlZDogZmluaXNoLFxuICAgIGFybTogKCkgPT4ge1xuICAgICAgZW50cnkuYXJtZWQgPSB0cnVlO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogV2hldGhlciBzb21lIHJlZ2lzdGVyZWQgYnJhbmNoLWRlY2lkaW5nIGRlbGl2ZXJ5IGlzIGdvaW5nIHRvIHJlYWNoIHRoZVxuICogd29ya2Zsb3cgd2l0aG91dCBhbnkgZnVydGhlciBoZWxwIChpdCBpcyBhcm1lZCBhbmQgbm90IHRyYW5zaXRpdmVseSBwYXJrZWRcbiAqIGJlaGluZCBhbiB1bmNsYWltZWQgYnVmZmVyZWQgcGF5bG9hZCDigJQgc2VlIHtAbGluayByZXNvbHZlc09uSXRzT3dufSkgYnV0XG4gKiBoYXMgbm90IGJlZW4gaGFuZGVkIG92ZXIgeWV0LlxuICpcbiAqIFRoaXMgaXMgdGhlIGRlbGl2ZXJ5IHN0YXRlIGBwZW5kaW5nRGVsaXZlcmllc2AgY2Fubm90IHNlZS4gVGhhdCBjb3VudGVyXG4gKiBjb3ZlcnMgdGhlIGh5ZHJhdGlvbiB3aW5kb3cgaW5zaWRlIGEgc2VyaWFsIGBwcm9taXNlUXVldWVgIHNsb3QgYW5kIGlzXG4gKiByZWxlYXNlZCB0aGVyZSwgd2hpbGUgdGhlIGRlbGl2ZXJ5J3MgYHJlc29sdmUoKWAgcnVucyBsYXRlciwgZnJvbSBhXG4gKiBkZXRhY2hlZCBjb250aW51YXRpb24gYmVoaW5kIHtAbGluayBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzfSDigJQgaW5jbHVkaW5nIGl0c1xuICogbWFjcm90YXNrIHlpZWxkIHdoZW5ldmVyIHRoZSBkZWxpdmVyeSBoYWQgdG8gZGVmZXIuIFJlcGxheWluZyBhIGJhdGNoIG9mIE5cbiAqIHBhcmFsbGVsIHN0ZXAgcmVzdWx0cyBjb25zdW1lZCBpbiBvbmUgZHJhaW4gd2luZG93IGxlYXZlcyBOLTEgb2YgdGhlbVxuICogcGFya2VkIG9uIHRoYXQgeWllbGQgd2l0aCBgcGVuZGluZ0RlbGl2ZXJpZXNgIGFscmVhZHkgYXQgMC4gQW4gaWRsZSBjaGVja1xuICogYXJtZWQgZHVyaW5nIHRoZSBzYW1lIHdpbmRvdyAoYSBwZW5kaW5nIGBzbGVlcCgpYCBhcm1zIG9uZSBvbiBldmVyeSByZXBsYXkpXG4gKiBjb3VsZCB0aGVuIG9ic2VydmUgXCJpZGxlXCIgbWlkLWRlZmVycmFsIGFuZCByYWlzZSBhIGBXb3JrZmxvd1N1c3BlbnNpb25gXG4gKiBCRUZPUkUgdGhlIHdvcmtmbG93J3Mgb3duIGNvbnRpbnVhdGlvbnMgcmFuIOKAlCBhIHN1c3BlbnNpb24gY2Fycnlpbmcgbm9uZSBvZlxuICogdGhlIGZvbGxvdy11cCB3b3JrIHRoZSBiYXRjaCB3YXMgYWJvdXQgdG8gY3JlYXRlLCB3aGljaCB0aGUgcnVudGltZVxuICogZHV0aWZ1bGx5IHNjaGVkdWxlcyBhcyBub3RoaW5nLCBsZWF2aW5nIHRoZSBydW4gZG9ybWFudCB1bnRpbCBhbiB1bnJlbGF0ZWRcbiAqIHRpbWVyIGZpcmVzICh2ZXJjZWwvd29ya2Zsb3cjMzE4MykuXG4gKlxuICogRGVsaXZlcmllcyB0aGF0IGRvIE5PVCByZXNvbHZlIG9uIHRoZWlyIG93biBtdXN0IGJlIGV4Y2x1ZGVkLCBub3QgZm9yXG4gKiBhY2N1cmFjeSBidXQgZm9yIHRlcm1pbmF0aW9uOiBhbiB1bmNsYWltZWQgYnVmZmVyZWQgaG9vayBwYXlsb2FkIGlzIHJldGlyZWRcbiAqIEJZIHRoZSBpZGxlIHNhZmV0eSBuZXQgaW4ge0BsaW5rIHJlZ2lzdGVyRGVsaXZlcnlCYXJyaWVyfSwgc28gY291bnRpbmcgaXRcbiAqIGhlcmUgd291bGQgZ2F0ZSBpdHMgb3duIHJldGlyZW1lbnQuIFRoYXQgcmVhc29uaW5nIGV4dGVuZHMgdG8gd2hhdGV2ZXIgaXNcbiAqIHBhcmtlZCBiZWhpbmQgc3VjaCBhIHBheWxvYWQg4oCUIGEgd2FpdCwgYW5kIGEgc3RlcCBnYXRpbmcgb24gdGhhdCB3YWl0IOKAlCBmb3JcbiAqIHRoZSBzYW1lIHJlYXNvbjogdGhlIHdob2xlIGNoYWluIG1vdmVzIG9ubHkgb25jZSB0aGUgbmV0IGZpcmVzLCBhbmQgaXRcbiAqIGNhbm5vdCBmaXJlIHdoaWxlIHRoZSBjaGFpbiBpcyBjb3VudGVkLiBTZWxmLXJlc29sdmluZyBkZWxpdmVyaWVzIGFsd2F5c1xuICogZGVsaXZlciBmcm9tIHRoZWlyIG93biBjaGFpbnMgKHNlZSB0aGUgSU5WQVJJQU5UIG9uXG4gKiB7QGxpbmsgcmVnaXN0ZXJEZWxpdmVyeUJhcnJpZXJ9KSBhbmQgbmV2ZXIgbmVlZCB0aGF0IG5ldCwgc28gd2FpdGluZyBvblxuICogdGhlbSBpcyBkZWFkbG9jay1mcmVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzUGFya2VkQ29tbWl0dGVkRGVsaXZlcnkoXG4gIGN0eDogV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0XG4pOiBib29sZWFuIHtcbiAgY29uc3QgYmFycmllcnMgPSBjdHgucGVuZGluZ0RlbGl2ZXJ5QmFycmllcnM7XG4gIGlmICghYmFycmllcnMgfHwgYmFycmllcnMuc2l6ZSA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvLyBTaGFyZWQgYWNyb3NzIHRoaXMgY2FsbCBvbmx5IOKAlCBzZWUgYHJlc29sdmVzT25JdHNPd25gLlxuICBjb25zdCBzZWxmUmVzb2x2aW5nID0gbmV3IE1hcDxudW1iZXIsIGJvb2xlYW4+KCk7XG4gIGZvciAoY29uc3QgW2luZGV4LCBlbnRyeV0gb2YgYmFycmllcnMpIHtcbiAgICBpZiAocmVzb2x2ZXNPbkl0c093bihiYXJyaWVycywgaW5kZXgsIGVudHJ5LCBzZWxmUmVzb2x2aW5nKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIG5vIGRhdGEgZGVsaXZlcnkgKHN0ZXAgcmVzdWx0LCBob29rIHBheWxvYWQpIGlzIGluIGZsaWdodCByaWdodCBub3cuXG4gKlxuICogXCJJbiBmbGlnaHRcIiBpcyB0d28gZGlzdGluY3Qgd2luZG93cywgZWFjaCB3aXRoIGl0cyBvd24gZ3VhcmQ6XG4gKiBgcGVuZGluZ0RlbGl2ZXJpZXMgPiAwYCBjb3ZlcnMgaHlkcmF0aW9uIGluc2lkZSB0aGUgc2VyaWFsIHF1ZXVlIHNsb3RzLCBhbmRcbiAqIHtAbGluayBoYXNQYXJrZWRDb21taXR0ZWREZWxpdmVyeX0gY292ZXJzIHRoZSBkZXRhY2hlZCBnYXAgYmV0d2VlbiBhIHNsb3RcbiAqIHJlbGVhc2luZyB0aGF0IGNvdW50ZXIgYW5kIHRoZSBkZWxpdmVyeSdzIGByZXNvbHZlKClgIGFjdHVhbGx5IHJ1bm5pbmcg4oCUXG4gKiBkZWxpYmVyYXRlbHkgb3V0c2lkZSBgcGVuZGluZ0RlbGl2ZXJpZXNgIChzZWUgc3RlcC50cyksIGFuZCBpbnZpc2libGUgdG8gaXQuXG4gKlxuICogQW55dGhpbmcgdGhhdCBkZWNpZGVzIGEgcmVwbGF5IGlzIG92ZXIsIG9yIHRoYXQgYSByZXBsYXkgd2VudCB3cm9uZywgaGFzIHRvXG4gKiBjb25zdWx0IHRoaXMgZmlyc3Q6IHdoaWxlIGl0IGlzIGZhbHNlIHRoZSB3b3JrZmxvdyBWTSBpcyBtaWQtcmVhY3Rpb24sIHNvXG4gKiB3aGF0IGl0IGhhcyBhbmQgaGFzIG5vdCBkb25lIHlldCBzYXlzIG5vdGhpbmcgYWJvdXQgdGhlIHJ1bi4gVHdvIGNhbGxlcnNcbiAqIHJlYWQgaXQsIGZvciB0aGUgdHdvIHN1Y2ggZGVjaXNpb25zOiB7QGxpbmsgc2NoZWR1bGVXaGVuSWRsZX0gZm9yIHRoZVxuICogc3VzcGVuc2lvbiwgYW5kIHRoZSBldmVudHMgY29uc3VtZXIncyB1bmNvbnN1bWVkLWV2ZW50IGNoZWNrIGZvciBkaXZlcmdlbmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEZWxpdmVyeUlkbGUoY3R4OiBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQpOiBib29sZWFuIHtcbiAgcmV0dXJuIGN0eC5wZW5kaW5nRGVsaXZlcmllcyA9PT0gMCAmJiAhaGFzUGFya2VkQ29tbWl0dGVkRGVsaXZlcnkoY3R4KTtcbn1cblxuLyoqXG4gKiBTY2hlZHVsZSBhIGNhbGxiYWNrIHRvIGZpcmUgb25seSBhZnRlciBhbGwgcGVuZGluZyBkYXRhIGRlbGl2ZXJpZXNcbiAqIChzdGVwIHJlc3VsdHMsIGhvb2sgcGF5bG9hZHMpIGFuZCBhc3luYyBkZXNlcmlhbGl6YXRpb24gaGF2ZSBjb21wbGV0ZWQuXG4gKiBVc2VzIGEgcG9sbGluZyBsb29wOiBzZXRUaW1lb3V0KDApIOKGkiBjaGVjayBwZW5kaW5nRGVsaXZlcmllcyBhbmQgdGhlXG4gKiBiYXJyaWVyIHJlZ2lzdHJ5IOKGkiBpZiBhbnl0aGluZyBpcyBzdGlsbCBpbiBmbGlnaHQsIHdhaXQgZm9yIHByb21pc2VRdWV1ZSDihpJcbiAqIHJlcGVhdC4gVGhpcyBoYW5kbGVzIHRoZSBtdWx0aS1yb3VuZCBkZWxpdmVyeSBwYXR0ZXJuIHdoZXJlIGVhY2ggaG9va1xuICogcGF5bG9hZCBkZWxpdmVyeSBjeWNsZSBhcHBlbmRzIG5ldyBhc3luYyB3b3JrIHRvIHRoZSBwcm9taXNlUXVldWUuIFdoYXRcbiAqIGNvdW50cyBhcyBpbiBmbGlnaHQgaXMge0BsaW5rIGlzRGVsaXZlcnlJZGxlfS5cbiAqXG4gKiBUaGUgaW5pdGlhbCBgc2V0VGltZW91dCgwKWAgbWFjcm90YXNrIGlzIGxvYWQtYmVhcmluZyBhbmQgbXVzdCBOT1QgYmVcbiAqIGRvd25ncmFkZWQgdG8gYSBtaWNyb3Rhc2sgKGBxdWV1ZU1pY3JvdGFza2AvYFByb21pc2UucmVzb2x2ZSgpLnRoZW5gKS5cbiAqIGBwZW5kaW5nRGVsaXZlcmllc2Agb25seSBndWFyZHMgdGhlIGhvc3Qtc2lkZSBoeWRyYXRpb24gd2luZG93OyBiZXR3ZWVuIGFcbiAqIGRlbGl2ZXJ5J3MgYHJlc29sdmUoKWAgYW5kIHRoZSB3b3JrZmxvdyBWTSBib2R5IHJ1bm5pbmcgaXRzIGNvbnRpbnVhdGlvbiB0b1xuICogcmVnaXN0ZXIgdGhlIG5leHQgc3Vic2NyaWJlciwgYHBlbmRpbmdEZWxpdmVyaWVzYCBpcyBhbHJlYWR5IDAgZXZlbiB0aG91Z2hcbiAqIHRoZSBWTSBpcyBtaWQtcmVhY3Rpb24uIE5vZGUgZG9lcyBub3QgZ3VhcmFudGVlIGEgbWljcm90YXNrIHNjaGVkdWxlZCBpblxuICogdGhlIGhvc3QgY29udGV4dCBzZXR0bGVzIGFmdGVyIHRoZSBjcm9zcy1WTSBwcm9taXNlIGNoYWluIChyZXNvbHZlIGluIGhvc3RcbiAqIOKGkiB3b3JrZmxvdyBjb2RlIGluIFZNIOKGkiBzdWJzY3JpYmUgYmFjayBpbiBob3N0KTsgdGhlIG1hY3JvdGFzayBib3VuZGFyeVxuICogZ2l2ZXMgdGhhdCBjaGFpbiB0aW1lIHRvIHJ1biwgc28gdGhlIHN1c3BlbnNpb24gZG9lcyBub3QgcHJlZW1wdCBhIHNpYmxpbmdcbiAqIGRlbGl2ZXJ5IHN0aWxsIGluIGZsaWdodC4gRW1waXJpY2FsbHksIHJlcGxhY2luZyBpdCB3aXRoIGBxdWV1ZU1pY3JvdGFza2BcbiAqIGJyZWFrcyBob29rL3NsZWVwIGBQcm9taXNlLnJhY2VgIG9yZGVyaW5nIChDb3JydXB0ZWRFdmVudExvZ0Vycm9yKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjaGVkdWxlV2hlbklkbGUoXG4gIGN0eDogV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0LFxuICBmbjogKCkgPT4gdm9pZFxuKTogdm9pZCB7XG4gIGNvbnN0IGNoZWNrID0gKCkgPT4ge1xuICAgIGlmICghaXNEZWxpdmVyeUlkbGUoY3R4KSkge1xuICAgICAgLy8gQSBkZWxpdmVyeSBpcyBzdGlsbCBoeWRyYXRpbmcsIG9yIGlzIGNvbW1pdHRlZCBidXQgcGFya2VkIGJlaGluZCBpdHNcbiAgICAgIC8vIGRlZmVycmFsICh3aG9zZSByZXNvbHZlIHJ1bnMgb24gYSBkZXRhY2hlZCB0aW1lciwgbm90IHRoaXMgcXVldWUpLlxuICAgICAgLy8gRWl0aGVyIHdheTogbGV0IHRoZSBxdWV1ZSBkcmFpbiwgdGhlbiByZS1jaGVjayBhIHRpbWVyIHRpY2sgbGF0ZXIuXG4gICAgICBjdHgucHJvbWlzZVF1ZXVlLnRoZW4oKCkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KGNoZWNrLCAwKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmbigpO1xuICAgIH1cbiAgfTtcbiAgc2V0VGltZW91dChjaGVjaywgMCk7XG59XG4iXX0=
569
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpdmF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wcml2YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBZ0JoRCxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsaUNBQWlDLENBQUMsQ0FBQztBQUV6RSxNQUFNLGFBQWEsR0FFZixVQUFVLENBQUM7QUFFZix3REFBd0Q7QUFDeEQsTUFBTSxlQUFlLEdBQUcsQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsS0FBSyxJQUFJLEdBQUcsRUFHbkUsQ0FBQyxDQUFDO0FBRUwsTUFBTSwyQkFBMkIsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUMxQyxpQ0FBaUM7SUFDakMseUJBQXlCO0lBQ3pCLHlCQUF5QjtDQUMxQixDQUFDLENBQUM7QUFFSCxTQUFTLHdCQUF3QixDQUFDLE1BQWM7SUFDOUMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUM5QyxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUU1QyxNQUFNLFFBQVEsR0FBRyxDQUFDLGVBQXVCLEVBQUUsRUFBRTtRQUMzQyxJQUFJLGVBQWUsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUNuQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDekMsQ0FBQztJQUNILENBQUMsQ0FBQztJQUVGLElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1FBQzFDLE1BQU0sb0JBQW9CLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0QsUUFBUSxDQUFDLGFBQWEsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO1FBQzlDLFFBQVEsQ0FBQyxTQUFTLG9CQUFvQixFQUFFLENBQUMsQ0FBQztJQUM1QyxDQUFDO1NBQU0sSUFBSSxVQUFVLENBQUMsVUFBVSxDQUFDLHNCQUFzQixDQUFDLEVBQUUsQ0FBQztRQUN6RCxNQUFNLG9CQUFvQixHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25FLFFBQVEsQ0FBQyxLQUFLLG9CQUFvQixFQUFFLENBQUMsQ0FBQztRQUN0QyxRQUFRLENBQUMsU0FBUyxvQkFBb0IsRUFBRSxDQUFDLENBQUM7SUFDNUMsQ0FBQztTQUFNLElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUM7UUFDckQsTUFBTSxvQkFBb0IsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMvRCxRQUFRLENBQUMsS0FBSyxvQkFBb0IsRUFBRSxDQUFDLENBQUM7UUFDdEMsUUFBUSxDQUFDLGFBQWEsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQ2YsaUJBQWlCLEVBQ2pCLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQyxTQUFTLGVBQWUsS0FBSyxNQUFNLEVBQUUsQ0FDM0QsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLDJCQUEyQixDQUFDLE1BQWM7SUFDakQsSUFBSSxDQUFDLDJCQUEyQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQzdDLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxLQUFLLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsSUFBSSxlQUFlLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztRQUNuRSxJQUFJLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxLQUFLLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUM3QyxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxNQUFjLEVBQUUsTUFBb0I7SUFDdkUsZUFBZSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDcEMsTUFBTSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7QUFDekIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxNQUFjO0lBQzVDLE1BQU0sV0FBVyxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEQsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNoQixPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBRUQsMEVBQTBFO0lBQzFFLEtBQUssTUFBTSxXQUFXLElBQUksd0JBQXdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUMzRCxNQUFNLFVBQVUsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3BELElBQUksVUFBVSxFQUFFLENBQUM7WUFDZixPQUFPLFVBQVUsQ0FBQztRQUNwQixDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0saUJBQWlCLEdBQUcsMkJBQTJCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUQsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1FBQ3RCLE9BQU8saUJBQWlCLENBQUM7SUFDM0IsQ0FBQztJQUVELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUE2SEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5Qkc7QUFDSCxNQUFNLFlBQVksR0FBa0Q7SUFDbEUsSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUM7SUFDOUIsSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQztJQUN0QixJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQztDQUMvQixDQUFDO0FBRUY7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQVMsT0FBTyxDQUNkLElBQWtCLEVBQ2xCLEtBQWEsRUFDYixVQUFrQixFQUNsQixLQUEyQjtJQUUzQixJQUFJLFVBQVUsSUFBSSxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3BFLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNELG9FQUFvRTtJQUNwRSwwRUFBMEU7SUFDMUUsMkVBQTJFO0lBQzNFLHlEQUF5RDtJQUN6RCxPQUFPLENBQUMsQ0FBQyxJQUFJLEtBQUssTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzVDLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0NHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FDdkIsUUFBMkMsRUFDM0MsS0FBYSxFQUNiLEtBQTJCLEVBQzNCLElBQTBCO0lBRTFCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0IsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDekIsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUNELE1BQU0sTUFBTSxHQUFHLHVCQUF1QixDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3JFLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3hCLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxTQUFTLHVCQUF1QixDQUM5QixRQUEyQyxFQUMzQyxLQUFhLEVBQ2IsS0FBMkIsRUFDM0IsSUFBMEI7SUFFMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNqQixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDRCxLQUFLLE1BQU0sQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLElBQUksUUFBUSxFQUFFLENBQUM7UUFDM0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNuRCxTQUFTO1FBQ1gsQ0FBQztRQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3pELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbURHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxzQkFBc0IsQ0FDMUMsR0FBZ0MsRUFDaEMsVUFBOEIsRUFDOUIsSUFBa0I7SUFFbEIseUVBQXlFO0lBQ3pFLElBQ0UsVUFBVSxLQUFLLFNBQVM7UUFDeEIsQ0FBQyxHQUFHLENBQUMsdUJBQXVCO1FBQzVCLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUN0QyxDQUFDO1FBQ0QsT0FBTztJQUNULENBQUM7SUFDRCxNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsdUJBQXVCLENBQUM7SUFDN0MsTUFBTSxPQUFPLEdBQW9CLEVBQUUsQ0FBQztJQUNwQyxLQUFLLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksUUFBUSxFQUFFLENBQUM7UUFDdEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzdDLFNBQVM7UUFDWCxDQUFDO1FBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUNELElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN2QixNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0Isd0VBQXdFO1FBQ3hFLHVFQUF1RTtRQUN2RSxzRUFBc0U7UUFDdEUsd0VBQXdFO1FBQ3hFLHlFQUF5RTtRQUN6RSxxRUFBcUU7UUFDckUseUVBQXlFO1FBQ3pFLDZEQUE2RDtRQUM3RCxFQUFFO1FBQ0Ysd0VBQXdFO1FBQ3hFLHdFQUF3RTtRQUN4RSx1RUFBdUU7UUFDdkUseUVBQXlFO1FBQ3pFLGNBQWM7UUFDZCxNQUFNLElBQUksT0FBTyxDQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0QsQ0FBQztBQUNILENBQUM7QUFtQkQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUNILE1BQU0sVUFBVSx1QkFBdUIsQ0FDckMsR0FBZ0MsRUFDaEMsVUFBOEIsRUFDOUIsSUFBa0IsRUFDbEIsVUFBK0IsRUFBRTtJQUVqQyxNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsdUJBQXVCLENBQUM7SUFDN0MsSUFBSSxDQUFDLFFBQVEsSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDMUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQUUsR0FBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFFLENBQUMsRUFBRSxDQUFDO0lBQ3BELENBQUM7SUFFRCxJQUFJLElBQUksR0FBRyxLQUFLLENBQUM7SUFDakIsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsR0FBRyxhQUFhLEVBQVEsQ0FBQztJQUVuRCxNQUFNLE1BQU0sR0FBRyxHQUFHLEVBQUU7UUFDbEIsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNULE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNaLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUN2QyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzlCLENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUMsQ0FBQztJQUVGLE1BQU0sS0FBSyxHQUF5QjtRQUNsQyxJQUFJO1FBQ0osU0FBUyxFQUFFLE9BQU87UUFDbEIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLElBQUksSUFBSTtRQUM1QixNQUFNLEVBQUUsTUFBTTtLQUNmLENBQUM7SUFDRixRQUFRLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUVoQyx1RUFBdUU7SUFDdkUsMkVBQTJFO0lBQzNFLDRFQUE0RTtJQUM1RSw0RUFBNEU7SUFDNUUsNEVBQTRFO0lBQzVFLDJFQUEyRTtJQUMzRSw0RUFBNEU7SUFDNUUsK0JBQStCO0lBQy9CLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRTVCLE9BQU87UUFDTCxhQUFhLEVBQUUsTUFBTTtRQUNyQixHQUFHLEVBQUUsR0FBRyxFQUFFO1lBQ1IsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDckIsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxPQUFPLEVBQStCLENBQUM7QUFFM0U7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQ0c7QUFDSCxTQUFTLHNCQUFzQixDQUFDLEdBQWdDO0lBQzlELE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQztJQUM3QyxJQUFJLENBQUMsUUFBUSxJQUFJLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2xELE9BQU87SUFDVCxDQUFDO0lBQ0QsdUJBQXVCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pDLE1BQU0sS0FBSyxHQUFHLEdBQUcsRUFBRTtRQUNqQixVQUFVLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3ZCLENBQUMsQ0FBQztJQUNGLHdFQUF3RTtJQUN4RSwyRUFBMkU7SUFDM0UsNEVBQTRFO0lBQzVFLHlFQUF5RTtJQUN6RSw0Q0FBNEM7SUFDNUMsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLEVBQUU7UUFDL0IsVUFBVSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN4QixDQUFDLENBQUM7SUFDRixNQUFNLEtBQUssR0FBRyxHQUFHLEVBQUU7UUFDakIsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3hCLHFEQUFxRDtZQUNyRCx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDcEMsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsMEJBQTBCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNyQyx1RUFBdUU7WUFDdkUsNkRBQTZEO1lBQzdELHFCQUFxQjtZQUNyQixHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztZQUNsRCxPQUFPO1FBQ1QsQ0FBQztRQUNELG9FQUFvRTtRQUNwRSxxRUFBcUU7UUFDckUsdUVBQXVFO1FBQ3ZFLHNFQUFzRTtRQUN0RSxzRUFBc0U7UUFDdEUsc0VBQXNFO1FBQ3RFLHVFQUF1RTtRQUN2RSxrRUFBa0U7UUFDbEUsd0VBQXdFO1FBQ3hFLHVFQUF1RTtRQUN2RSxzREFBc0Q7UUFDdEQsT0FBTyxRQUFRLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSwwQkFBMEIsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzVELElBQUksV0FBK0IsQ0FBQztZQUNwQyxJQUFJLFdBQTZDLENBQUM7WUFDbEQsS0FBSyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUN0QyxJQUFJLFdBQVcsS0FBSyxTQUFTLElBQUksS0FBSyxHQUFHLFdBQVcsRUFBRSxDQUFDO29CQUNyRCxXQUFXLEdBQUcsS0FBSyxDQUFDO29CQUNwQixXQUFXLEdBQUcsS0FBSyxDQUFDO2dCQUN0QixDQUFDO1lBQ0gsQ0FBQztZQUNELFdBQVcsRUFBRSxNQUFNLEVBQUUsQ0FBQztRQUN4QixDQUFDO1FBQ0QsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN2QixDQUFDLENBQUM7SUFDRixVQUFVLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLDBCQUEwQixDQUFDLEdBQWdDO0lBQ2xFLE9BQU8sR0FBRyxDQUFDLGlCQUFpQixLQUFLLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3pFLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBOEJHO0FBQ0gsTUFBTSxVQUFVLDBCQUEwQixDQUN4QyxHQUFnQztJQUVoQyxNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsdUJBQXVCLENBQUM7SUFDN0MsSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3JDLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNELHlEQUF5RDtJQUN6RCxNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBbUIsQ0FBQztJQUNqRCxLQUFLLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksUUFBUSxFQUFFLENBQUM7UUFDdEMsSUFBSSxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxhQUFhLENBQUMsRUFBRSxDQUFDO1lBQzVELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQkc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLEdBQWdDO0lBQzdELE9BQU8sQ0FDTCxHQUFHLENBQUMsaUJBQWlCLEtBQUssQ0FBQztRQUMzQixDQUFDLENBQUMsR0FBRyxDQUFDLHVCQUF1QixJQUFJLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQ3pFLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUM5QixHQUFnQyxFQUNoQyxFQUFjO0lBRWQsTUFBTSxLQUFLLEdBQUcsR0FBRyxFQUFFO1FBQ2pCLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN6Qix1RUFBdUU7WUFDdkUscUVBQXFFO1lBQ3JFLHFFQUFxRTtZQUNyRSxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQ3pCLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdkIsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNOLEVBQUUsRUFBRSxDQUFDO1FBQ1AsQ0FBQztJQUNILENBQUMsQ0FBQztJQUNGLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDdkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVXRpbHMgdXNlZCBieSB0aGUgYnVuZGxlciB3aGVuIHRyYW5zZm9ybWluZyBjb2RlXG4gKi9cblxuaW1wb3J0IHsgd2l0aFJlc29sdmVycyB9IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5pbXBvcnQgdHlwZSB7IFdvcmxkQ2FwYWJpbGl0aWVzIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB0eXBlIHsgRXZlbnRzQ29uc3VtZXIgfSBmcm9tICcuL2V2ZW50cy1jb25zdW1lci5qcyc7XG5pbXBvcnQgdHlwZSB7IFF1ZXVlSXRlbSB9IGZyb20gJy4vZ2xvYmFsLmpzJztcbmltcG9ydCB0eXBlIHsgUmVwbGF5UGF5bG9hZENhY2hlIH0gZnJvbSAnLi9yZXBsYXktcGF5bG9hZC1jYWNoZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFNlcmlhbGl6YWJsZSB9IGZyb20gJy4vc2NoZW1hcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBheWxvYWRLZXkgfSBmcm9tICcuL3NlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi5qcyc7XG5cbmV4cG9ydCB0eXBlIFN0ZXBGdW5jdGlvbjxcbiAgQXJncyBleHRlbmRzIFNlcmlhbGl6YWJsZVtdID0gYW55W10sXG4gIFJlc3VsdCBleHRlbmRzIFNlcmlhbGl6YWJsZSB8IHVua25vd24gPSB1bmtub3duLFxuPiA9ICgoLi4uYXJnczogQXJncykgPT4gUHJvbWlzZTxSZXN1bHQ+KSAmIHtcbiAgbWF4UmV0cmllcz86IG51bWJlcjtcbiAgc3RlcElkPzogc3RyaW5nO1xufTtcblxuY29uc3QgUmVnaXN0ZXJlZFN0ZXBzS2V5ID0gU3ltYm9sLmZvcignQHdvcmtmbG93L2NvcmUvL3JlZ2lzdGVyZWRTdGVwcycpO1xuXG5jb25zdCBnbG9iYWxTeW1ib2xzOiB0eXBlb2YgZ2xvYmFsVGhpcyAmIHtcbiAgW1JlZ2lzdGVyZWRTdGVwc0tleV0/OiBNYXA8c3RyaW5nLCBTdGVwRnVuY3Rpb24+O1xufSA9IGdsb2JhbFRoaXM7XG5cbi8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9Bc3NpZ25JbkV4cHJlc3Npb25zOiAvXG5jb25zdCByZWdpc3RlcmVkU3RlcHMgPSAoZ2xvYmFsU3ltYm9sc1tSZWdpc3RlcmVkU3RlcHNLZXldID8/PSBuZXcgTWFwPFxuICBzdHJpbmcsXG4gIFN0ZXBGdW5jdGlvblxuPigpKTtcblxuY29uc3QgQlVJTFRJTl9SRVNQT05TRV9TVEVQX05BTUVTID0gbmV3IFNldChbXG4gICdfX2J1aWx0aW5fcmVzcG9uc2VfYXJyYXlfYnVmZmVyJyxcbiAgJ19fYnVpbHRpbl9yZXNwb25zZV9qc29uJyxcbiAgJ19fYnVpbHRpbl9yZXNwb25zZV90ZXh0Jyxcbl0pO1xuXG5mdW5jdGlvbiBnZXRTdGVwSWRBbGlhc0NhbmRpZGF0ZXMoc3RlcElkOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHBhcnRzID0gc3RlcElkLnNwbGl0KCcvLycpO1xuICBpZiAocGFydHMubGVuZ3RoICE9PSAzIHx8IHBhcnRzWzBdICE9PSAnc3RlcCcpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBtb2R1bGVQYXRoID0gcGFydHNbMV07XG4gIGNvbnN0IGZuTmFtZSA9IHBhcnRzWzJdO1xuICBjb25zdCBtb2R1bGVQYXRoQWxpYXNlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGNvbnN0IGFkZEFsaWFzID0gKGFsaWFzTW9kdWxlUGF0aDogc3RyaW5nKSA9PiB7XG4gICAgaWYgKGFsaWFzTW9kdWxlUGF0aCAhPT0gbW9kdWxlUGF0aCkge1xuICAgICAgbW9kdWxlUGF0aEFsaWFzZXMuYWRkKGFsaWFzTW9kdWxlUGF0aCk7XG4gICAgfVxuICB9O1xuXG4gIGlmIChtb2R1bGVQYXRoLnN0YXJ0c1dpdGgoJy4vd29ya2Zsb3dzLycpKSB7XG4gICAgY29uc3Qgd29ya2Zsb3dSZWxhdGl2ZVBhdGggPSBtb2R1bGVQYXRoLnNsaWNlKCcuLycubGVuZ3RoKTtcbiAgICBhZGRBbGlhcyhgLi9leGFtcGxlLyR7d29ya2Zsb3dSZWxhdGl2ZVBhdGh9YCk7XG4gICAgYWRkQWxpYXMoYC4vc3JjLyR7d29ya2Zsb3dSZWxhdGl2ZVBhdGh9YCk7XG4gIH0gZWxzZSBpZiAobW9kdWxlUGF0aC5zdGFydHNXaXRoKCcuL2V4YW1wbGUvd29ya2Zsb3dzLycpKSB7XG4gICAgY29uc3Qgd29ya2Zsb3dSZWxhdGl2ZVBhdGggPSBtb2R1bGVQYXRoLnNsaWNlKCcuL2V4YW1wbGUvJy5sZW5ndGgpO1xuICAgIGFkZEFsaWFzKGAuLyR7d29ya2Zsb3dSZWxhdGl2ZVBhdGh9YCk7XG4gICAgYWRkQWxpYXMoYC4vc3JjLyR7d29ya2Zsb3dSZWxhdGl2ZVBhdGh9YCk7XG4gIH0gZWxzZSBpZiAobW9kdWxlUGF0aC5zdGFydHNXaXRoKCcuL3NyYy93b3JrZmxvd3MvJykpIHtcbiAgICBjb25zdCB3b3JrZmxvd1JlbGF0aXZlUGF0aCA9IG1vZHVsZVBhdGguc2xpY2UoJy4vc3JjLycubGVuZ3RoKTtcbiAgICBhZGRBbGlhcyhgLi8ke3dvcmtmbG93UmVsYXRpdmVQYXRofWApO1xuICAgIGFkZEFsaWFzKGAuL2V4YW1wbGUvJHt3b3JrZmxvd1JlbGF0aXZlUGF0aH1gKTtcbiAgfVxuXG4gIHJldHVybiBBcnJheS5mcm9tKFxuICAgIG1vZHVsZVBhdGhBbGlhc2VzLFxuICAgIChhbGlhc01vZHVsZVBhdGgpID0+IGBzdGVwLy8ke2FsaWFzTW9kdWxlUGF0aH0vLyR7Zm5OYW1lfWBcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0QnVpbHRpblJlc3BvbnNlU3RlcEFsaWFzKHN0ZXBJZDogc3RyaW5nKTogU3RlcEZ1bmN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFCVUlMVElOX1JFU1BPTlNFX1NURVBfTkFNRVMuaGFzKHN0ZXBJZCkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgZm9yIChjb25zdCBbcmVnaXN0ZXJlZFN0ZXBJZCwgc3RlcEZuXSBvZiByZWdpc3RlcmVkU3RlcHMuZW50cmllcygpKSB7XG4gICAgaWYgKHJlZ2lzdGVyZWRTdGVwSWQuZW5kc1dpdGgoYC8vJHtzdGVwSWR9YCkpIHtcbiAgICAgIHJldHVybiBzdGVwRm47XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZWdpc3RlciBhIHN0ZXAgZnVuY3Rpb24gdG8gYmUgc2VydmVkIGluIHRoZSBzZXJ2ZXIgYnVuZGxlLlxuICogQWxzbyBzZXRzIHRoZSBzdGVwSWQgcHJvcGVydHkgb24gdGhlIGZ1bmN0aW9uIGZvciBzZXJpYWxpemF0aW9uIHN1cHBvcnQuXG4gKlxuICogTm90ZTogVGhlIFNXQyBjb21waWxlciBwbHVnaW4gbm8gbG9uZ2VyIGdlbmVyYXRlcyBjYWxscyB0byB0aGlzIGZ1bmN0aW9uLlxuICogU3RlcCByZWdpc3RyYXRpb24gaXMgbm93IGlubGluZWQgYXMgYSBzZWxmLWNvbnRhaW5lZCBJSUZFIHRoYXQgd3JpdGVzXG4gKiBkaXJlY3RseSB0byB0aGUgZ2xvYmFsIE1hcCBhdCBTeW1ib2wuZm9yKFwiQHdvcmtmbG93L2NvcmUvL3JlZ2lzdGVyZWRTdGVwc1wiKS5cbiAqIFRoaXMgZnVuY3Rpb24gaXMga2VwdCBmb3IgaW50ZXJuYWwvdGVzdCB1c2Ugb25seS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyU3RlcEZ1bmN0aW9uKHN0ZXBJZDogc3RyaW5nLCBzdGVwRm46IFN0ZXBGdW5jdGlvbikge1xuICByZWdpc3RlcmVkU3RlcHMuc2V0KHN0ZXBJZCwgc3RlcEZuKTtcbiAgc3RlcEZuLnN0ZXBJZCA9IHN0ZXBJZDtcbn1cblxuLyoqXG4gKiBGaW5kIGEgcmVnaXN0ZXJlZCBzdGVwIGZ1bmN0aW9uIGJ5IG5hbWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0ZXBGdW5jdGlvbihzdGVwSWQ6IHN0cmluZyk6IFN0ZXBGdW5jdGlvbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRpcmVjdE1hdGNoID0gcmVnaXN0ZXJlZFN0ZXBzLmdldChzdGVwSWQpO1xuICBpZiAoZGlyZWN0TWF0Y2gpIHtcbiAgICByZXR1cm4gZGlyZWN0TWF0Y2g7XG4gIH1cblxuICAvLyBTdXBwb3J0IGVxdWl2YWxlbnQgd29ya2Zsb3cgcGF0aCBhbGlhc2VzIGluIG1peGVkIHN5bWxpbmsgZW52aXJvbm1lbnRzLlxuICBmb3IgKGNvbnN0IGFsaWFzU3RlcElkIG9mIGdldFN0ZXBJZEFsaWFzQ2FuZGlkYXRlcyhzdGVwSWQpKSB7XG4gICAgY29uc3QgYWxpYXNNYXRjaCA9IHJlZ2lzdGVyZWRTdGVwcy5nZXQoYWxpYXNTdGVwSWQpO1xuICAgIGlmIChhbGlhc01hdGNoKSB7XG4gICAgICByZXR1cm4gYWxpYXNNYXRjaDtcbiAgICB9XG4gIH1cblxuICBjb25zdCBidWlsdGluQWxpYXNNYXRjaCA9IGdldEJ1aWx0aW5SZXNwb25zZVN0ZXBBbGlhcyhzdGVwSWQpO1xuICBpZiAoYnVpbHRpbkFsaWFzTWF0Y2gpIHtcbiAgICByZXR1cm4gYnVpbHRpbkFsaWFzTWF0Y2g7XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vLyBOb3RlOiBfX3ByaXZhdGVfZ2V0Q2xvc3VyZVZhcnMgaXMgbm8gbG9uZ2VyIHJlLWV4cG9ydGVkIGhlcmUuXG4vLyBUaGUgU1dDIGNvbXBpbGVyIHBsdWdpbiBub3cgaW5saW5lcyBjbG9zdXJlIHZhcmlhYmxlIGFjY2VzcyBhcyBhXG4vLyBzZWxmLWNvbnRhaW5lZCBJSUZFIHRoYXQgcmVhZHMgZGlyZWN0bHkgZnJvbSB0aGUgZ2xvYmFsIEFzeW5jTG9jYWxTdG9yYWdlXG4vLyBhdCBTeW1ib2wuZm9yKFwiV09SS0ZMT1dfU1RFUF9DT05URVhUX1NUT1JBR0VcIikuXG5cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0IHtcbiAgcnVuSWQ6IHN0cmluZztcbiAgZW5jcnlwdGlvbktleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZDtcbiAgd29ybGRDYXBhYmlsaXRpZXM/OiBXb3JsZENhcGFiaWxpdGllcztcbiAgZ2xvYmFsVGhpczogdHlwZW9mIGdsb2JhbFRoaXM7XG4gIC8qKlxuICAgKiBJbmNyZW1lbnRzIHdoZW4gYSBzdXNwZW5zaW9uIGlzIGFjY2VwdGVkIGFuZCBvbiBldmVyeSByZXRhaW5lZC1zZXNzaW9uXG4gICAqIHJlc3VtZS4gU1RFUCBzdXNwZW5zaW9uIHNpZ25hbHMgY2FwdHVyZSBpdCB3aGVuIHNjaGVkdWxlZCBhbmQgbm8tb3AgaWZcbiAgICogaXQgbW92ZWQgKHNlZSBzdGVwLnRzKSDigJQgdGhpcyBkcm9wcyBzYW1lLWJvdW5kYXJ5IHNpYmxpbmcgc2lnbmFscyBhbmRcbiAgICogdGltZXJzIHF1ZXVlZCBhdCBib3VuZGFyeSBOIHRoYXQgd291bGQgZmlyZSBhZnRlciB0aGUgc2Vzc2lvbiByZXN1bWVkXG4gICAqIGludG8gYm91bmRhcnkgTisxLiBTbGVlcC9ob29rL2F0dHJpYnV0ZSBzaWduYWxzIGFyZSBpbnRlbnRpb25hbGx5XG4gICAqIHVuZ3VhcmRlZDogdGhlaXIgcHJlc2VuY2UgbWFrZXMgdGhlIGJvdW5kYXJ5IHVucmV0YWluYWJsZSwgc28gYSBsYXRlXG4gICAqIHNpZ25hbCBjb3JyZWN0bHkgZGVtb3RlcyB0aGUgc2Vzc2lvbiAod29ya2Zsb3cudHMgYG9uV29ya2Zsb3dFcnJvcmApLlxuICAgKi9cbiAgc3VzcGVuc2lvbkdlbmVyYXRpb246IG51bWJlcjtcbiAgZXZlbnRzQ29uc3VtZXI6IEV2ZW50c0NvbnN1bWVyO1xuICAvKipcbiAgICogTWFwIG9mIHBlbmRpbmcgaW52b2NhdGlvbnMga2V5ZWQgYnkgY29ycmVsYXRpb25JZC5cbiAgICogVXNpbmcgTWFwIGluc3RlYWQgb2YgQXJyYXkgZm9yIE8oMSkgbG9va3VwL2RlbGV0ZSBvcGVyYXRpb25zLlxuICAgKi9cbiAgaW52b2NhdGlvbnNRdWV1ZTogTWFwPHN0cmluZywgUXVldWVJdGVtPjtcbiAgb25Xb3JrZmxvd0Vycm9yOiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xuICAvKipcbiAgICogTWludHMgdGhlIFVMSUQgYm9keSBvZiBhIGNvcnJlbGF0aW9uIGlkLiBFdmVyeSBlbnRpdHkgYSByZXBsYXkgY3JlYXRlc1xuICAgKiBkcmF3cyBmcm9tIHRoaXMgb25lIG1vbm90b25pYyBzZXF1ZW5jZSwgc28gYW4gaWQgaXMgYW4gb3JkaW5hbCBvdmVyIHRoZVxuICAgKiB3aG9sZSBydW4gYW5kIGJvdGggcmVwbGF5cyBvZiBhIHJ1biBtdXN0IGRyYXcgaW4gdGhlIHNhbWUgb3JkZXIuXG4gICAqL1xuICBnZW5lcmF0ZVVsaWQ6ICgpID0+IHN0cmluZztcbiAgZ2VuZXJhdGVOYW5vaWQ6ICgpID0+IHN0cmluZztcbiAgLyoqXG4gICAqIFNlcXVlbnRpYWwgcHJvbWlzZSBxdWV1ZSB0aGF0IGVuc3VyZXMgYWxsIGV2ZW50LWRyaXZlbiBwcm9taXNlIHJlc29sdXRpb25zXG4gICAqIChzdGVwIHJlc3VsdHMsIGhvb2sgcGF5bG9hZHMsIGZhaWx1cmVzLCBzdXNwZW5zaW9ucykgaGFwcGVuIGluIGV2ZW50IGxvZ1xuICAgKiBvcmRlci4gRXZlcnkgcmVzb2x2ZSwgcmVqZWN0LCBvciB3b3JrZmxvdyBlcnJvciBpcyBjaGFpbmVkIHRocm91Z2ggdGhpc1xuICAgKiBxdWV1ZSBzbyB0aGF0IGV2ZW4gaWYgaW5kaXZpZHVhbCBvcGVyYXRpb25zIHRha2UgdmFyaWFibGUgdGltZSAoZS5nLixcbiAgICogYXN5bmMgZGVjcnlwdGlvbiksIHByb21pc2VzIHJlc29sdmUgZGV0ZXJtaW5pc3RpY2FsbHkuXG4gICAqL1xuICBwcm9taXNlUXVldWU6IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBDb3VudGVyIG9mIGluLWZsaWdodCBhc3luYyBkYXRhIGRlbGl2ZXJ5IG9wZXJhdGlvbnMgKHN0ZXAgcmVzdWx0XG4gICAqIGh5ZHJhdGlvbiwgaG9vayBwYXlsb2FkIGh5ZHJhdGlvbiwgYWJvcnQgc2lnbmFsIGh5ZHJhdGlvbikuIFN1c3BlbnNpb25zXG4gICAqIG11c3Qgd2FpdCBmb3IgdGhpcyB0byByZWFjaCAwIGJlZm9yZSBmaXJpbmcsIHRvIGF2b2lkIHByZWVtcHRpbmcgZGF0YVxuICAgKiBkZWxpdmVyeSDigJQgZS5nLiBkZWh5ZHJhdGluZyBhIHN0ZXAncyBhcmd1bWVudHMgd2hpbGUgYW4gYWJvcnQgdGhhdCBzaG91bGRcbiAgICogYmUgcmVmbGVjdGVkIGluIHRob3NlIGFyZ3VtZW50cyBpcyBzdGlsbCBoeWRyYXRpbmcgaXRzIHJlYXNvbi5cbiAgICovXG4gIHBlbmRpbmdEZWxpdmVyaWVzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBPcmRlcmVkIHJlZ2lzdHJ5IG9mIGluLWZsaWdodCBcImJyYW5jaC1kZWNpZGluZ1wiIGRlbGl2ZXJpZXMg4oCUIHRoZVxuICAgKiByZXNvbHV0aW9ucyBhIHdvcmtmbG93IHR5cGljYWxseSBgUHJvbWlzZS5yYWNlYHMgb24sIG9yIGF3YWl0cyBmcm9tXG4gICAqIGluZGVwZW5kZW50IGNvbmN1cnJlbnQgYnJhbmNoZXM6IGhvb2sgcGF5bG9hZHMgKGBob29rX3JlY2VpdmVkYCksIHdhaXRcbiAgICogY29tcGxldGlvbnMgKGB3YWl0X2NvbXBsZXRlZGApLCBhbmQgc3RlcCByZXN1bHRzIChgc3RlcF9jb21wbGV0ZWRgIC9cbiAgICogYHN0ZXBfZmFpbGVkYCkuIEtleWVkIGJ5IHRoZSBkZWxpdmVyeSdzIHBvc2l0aW9uIChpbmRleCkgaW4gdGhlIGNvbnN1bWVkXG4gICAqIGV2ZW50IGxvZy5cbiAgICpcbiAgICogVGhlIHByb2JsZW06IGVhY2ggb2YgdGhlc2UgcmVzb2x1dGlvbnMgcmVhY2hlcyB3b3JrZmxvdyBjb2RlIGFmdGVyIGFcbiAgICogZGlmZmVyZW50LCB3b3JrbG9hZC1kZXBlbmRlbnQgbnVtYmVyIG9mIG1pY3JvdGFzayBob3BzLiBBIGJ1ZmZlcmVkIGhvb2tcbiAgICogcGF5bG9hZCBpcyBvYnNlcnZlZCB2aWEgdGhlIGFzeW5jIGhvb2sgaXRlcmF0b3IgKGB5aWVsZCBhd2FpdCB0aGlzYCksXG4gICAqIGNvc3RpbmcgZXh0cmEgaG9wczsgYSBgd2FpdF9jb21wbGV0ZWRgIHJlc29sdmVzIHdpdGggZmV3ZXIsIGFuZCBhIHJldXNlZFxuICAgKiBzbGVlcCBjYW4gcmVzb2x2ZSBpbiBhbiBlbnRpcmVseSBlYXJsaWVyIGxvb3AgaXRlcmF0aW9uOyBhIHN0ZXAgcmVzdWx0IGlzXG4gICAqIGdhdGVkIG9uIGh5ZHJhdGlvbiB3aG9zZSBjb3N0IHZhcmllcyBiZXR3ZWVuIHJlcGxheXMgb2YgdGhlIFNBTUVcbiAgICogaW52b2NhdGlvbiDigJQgdGhlIGZpcnN0IHJlcGxheSBwYXlzIHRoZSBmdWxsIGRlY3J5cHQvZGVjb21wcmVzcy9yZXZpdmUsXG4gICAqIHdoaWxlIGxhdGVyIHJlcGxheXMgc2hhcmluZyB0aGUgaW52b2NhdGlvbidzIGBSZXBsYXlQYXlsb2FkQ2FjaGVgXG4gICAqIG1lbW8taGl0IHNtYWxsIHByaW1pdGl2ZSByZXN1bHRzIGFuZCByZXNvbHZlIGluIG9uZSBvciB0d28gaG9wcy4gRWl0aGVyXG4gICAqIHdheSwgdGhlIHJlc29sdXRpb24gdGhhdCB0aGUgY29tbWl0dGVkIGV2ZW50IGxvZyBvcmRlcmVkIGZpcnN0IGNhbiBsb3NlIGFcbiAgICogYFByb21pc2UucmFjZWAgKG9yIGEgYHVzZVN0ZXBgIFVMSUQgYWxsb2NhdGlvbikgdG8gYSBmYXN0ZXItIG9yXG4gICAqIGFscmVhZHktcmVzb2x2ZWQgY29tcGV0aXRvciwgZGl2ZXJnaW5nIGZyb20gdGhlIGxvZyBhbmQgc3VyZmFjaW5nIGFzXG4gICAqIGBDb3JydXB0ZWRFdmVudExvZ0Vycm9yYC5cbiAgICpcbiAgICogVGhlIGZpeCBpcyBhIHN0cmljdCwgZGV0ZXJtaW5pc3RpYyBkZWxpdmVyeSBvcmRlciBhbmNob3JlZCBvblxuICAgKiBldmVudC1sb2cgcG9zaXRpb246IGEgZGVsaXZlcnkgZG9lcyBub3QgcmVzb2x2ZSB0byB0aGUgd29ya2Zsb3cgdW50aWxcbiAgICogZXZlcnkgcmVsZXZhbnQgZWFybGllci1pbi1sb2cgZGVsaXZlcnkgaGFzIGJlZW4gZGVsaXZlcmVkLiBCZWNhdXNlIHRoZVxuICAgKiBnYXRlIGlzIFwidGhlIGVhcmxpZXIgZGVsaXZlcnkgcmVzb2x2ZWRcIiwgbm90IFwid29uIGEgdGltaW5nIHJhY2VcIiwgdGhlXG4gICAqIG91dGNvbWUgaXMgaW5kZXBlbmRlbnQgb2YgbWljcm90YXNrIGhvcHMsIGh5ZHJhdGlvbi9kZWNyeXB0aW9uIHRpbWUsXG4gICAqIGFuZCBgUHJvbWlzZS5yYWNlYCBhcmd1bWVudCBvcmRlci4gV2hpY2ggZWFybGllciBraW5kcyBhIGRlbGl2ZXJ5IGRlZmVyc1xuICAgKiBiZWhpbmQgaXMgc3BlbGxlZCBvdXQgb24ge0BsaW5rIGF3YWl0RWFybGllckRlbGl2ZXJpZXN9LlxuICAgKlxuICAgKiBJbmRleCBpcyB1c2VkIHJhdGhlciB0aGFuIHRoZSBgZXZlbnRJZGAgc3RyaW5nIGJlY2F1c2UgYGV2ZW50SWRgIGlzIGFuXG4gICAqIG9wYXF1ZSwgd29ybGQtYXNzaWduZWQgdmFsdWUgbm90IGd1YXJhbnRlZWQgdG8gc29ydCBpbiBjcmVhdGlvbiBvcmRlclxuICAgKiAob25seSB0aGUgYnVuZGxlZCBVTElEIHdvcmxkcyBoYXBwZW4gdG8pLlxuICAgKlxuICAgKiBPcHRpb25hbCBzbyBvbGRlci9vdXQtb2YtdHJlZSBjb250ZXh0cyAoYW5kIGxpZ2h0d2VpZ2h0IHRlc3QgaGFybmVzc2VzKVxuICAgKiB0aGF0IGRvIG5vdCBpbml0aWFsaXplIGl0IGRlZ3JhZGUgZ3JhY2VmdWxseSB0byB0aGUgcHJldmlvdXMgYmVoYXZpb3IuXG4gICAqL1xuICBwZW5kaW5nRGVsaXZlcnlCYXJyaWVycz86IE1hcDxudW1iZXIsIERlbGl2ZXJ5QmFycmllckVudHJ5PjtcbiAgLyoqXG4gICAqIEludm9jYXRpb24tc2NvcGVkIGNhY2hlIG9mIHByZXBhcmVkIHNlcmlhbGl6ZWQgcGF5bG9hZHMgYW5kIGltbXV0YWJsZSBmaW5hbFxuICAgKiB2YWx1ZXMuIFByZXBhcmVkIGJ5dGVzIHN1cnZpdmUgZnJlc2ggcmVwbGF5IFZNczsgb2JqZWN0IGdyYXBocyBkbyBub3QuXG4gICAqL1xuICByZXBsYXlQYXlsb2FkQ2FjaGU6IFJlcGxheVBheWxvYWRDYWNoZTtcbn1cblxuLyoqIFRoZSBraW5kIG9mIGJyYW5jaC1kZWNpZGluZyBkZWxpdmVyeSBhIGJhcnJpZXIgcmVwcmVzZW50cy4gKi9cbmV4cG9ydCB0eXBlIERlbGl2ZXJ5S2luZCA9ICdob29rJyB8ICd3YWl0JyB8ICdzdGVwJztcblxuaW50ZXJmYWNlIERlbGl2ZXJ5QmFycmllckVudHJ5IHtcbiAga2luZDogRGVsaXZlcnlLaW5kO1xuICAvKiogUmVzb2x2ZXMgb25jZSB0aGlzIGRlbGl2ZXJ5IGhhcyByZXNvbHZlZCB0byB0aGUgd29ya2Zsb3cuICovXG4gIGRlbGl2ZXJlZDogUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBkZWxpdmVyeSBpcyBjb21taXR0ZWQgdG8gcmVhY2hpbmcgdGhlIHdvcmtmbG93IHdpdGhvdXQgYW55XG4gICAqIGZ1cnRoZXIgYWN0aW9uIGJ5IHdvcmtmbG93IGNvZGUuIFRydWUgZm9yIHdhaXQgY29tcGxldGlvbnMgYW5kIHN0ZXBcbiAgICogcmVzdWx0cywgd2hpY2ggYWx3YXlzIHJlc29sdmUgZnJvbSB0aGVpciBvd24gY2hhaW4sIGFuZCBmb3IgYSBob29rIHBheWxvYWRcbiAgICogdGhhdCBhbHJlYWR5IGhhZCBhIHdhaXRpbmcgY29uc3VtZXIgd2hlbiBpdCB3YXMgY29uc3VtZWQuXG4gICAqXG4gICAqIEZhbHNlIGZvciBhIEJVRkZFUkVEIGhvb2sgcGF5bG9hZCBubyBjb25zdW1lciBoYXMgY2xhaW1lZCB5ZXQ6IGl0IGlzXG4gICAqIGRlbGl2ZXJlZCBieSBgY2xhaW0oKWAsIGkuZS4gd2hlbmV2ZXIgdGhlIHdvcmtmbG93IG5leHQgcmVhZHMgdGhlIGhvb2sg4oCUXG4gICAqIHdoaWNoIG1heSBiZSBjYXVzYWxseSAqYWZ0ZXIqIGEgbGF0ZXItaW4tbG9nIGRlbGl2ZXJ5LiBgYXJtKClgIGZsaXBzIGl0XG4gICAqIG9uY2UgYSBjb25zdW1lciB0YWtlcyB0aGUgcGF5bG9hZC5cbiAgICovXG4gIGFybWVkOiBib29sZWFuO1xuICAvKipcbiAgICogUmV0aXJlIHRoaXMgZW50cnk6IHJlc29sdmUgYGRlbGl2ZXJlZGAgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSByZWdpc3RyeSxcbiAgICogZXhhY3RseSBhcyBgbWFya0RlbGl2ZXJlZGAgd291bGQuIENhbGxlZCBvbmx5IGJ5IHRoZSBjb250ZXh0J3Mgc2FmZXR5LW5ldFxuICAgKiBkaXNwZW5zZXIgKHtAbGluayBlbnN1cmVCYXJyaWVyU2FmZXR5TmV0fSksIGFuZCBvbmx5IG9uIHRoZSBsb3dlc3QtaW5kZXhcbiAgICogZW50cnkgYXQgZGVsaXZlcnkgaWRsZS4gSWRlbXBvdGVudC5cbiAgICovXG4gIHJldGlyZTogKCkgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBXaGljaCBlYXJsaWVyIGtpbmRzIGVhY2ggZGVsaXZlcnkga2luZCBkZWZlcnMgYmVoaW5kLiBDaG9zZW4gc28gdGhhdCBubyBraW5kXG4gKiBibG9ja3Mgb24gYSBwZWVyIGl0IGRvZXMgbm90IG5lZWQgdG86XG4gKlxuICogIC0gYSBob29rIGRlZmVycyBiZWhpbmQgZWFybGllciBIT09LUywgV0FJVFMgYW5kIFNURVBTO1xuICogIC0gYSB3YWl0IGRlZmVycyBiZWhpbmQgZWFybGllciBIT09LUyBhbmQgU1RFUFMg4oCUIG5vdCBlYXJsaWVyIHdhaXRzLCBzaW5jZSBhXG4gKiAgICB3YWl0IG5ldmVyIG5lZWRzIHRvIHF1ZXVlIGJlaGluZCBhbm90aGVyIHdhaXQ7XG4gKiAgLSBhIHN0ZXAgZGVmZXJzIGJlaGluZCBlYXJsaWVyIFdBSVRTLCBIT09LUyBhbmQgU1RFUFMuXG4gKlxuICogVGhlIHN0ZXAtYmVoaW5kLXN0ZXAgZWRnZSBpcyBub3QgcmVkdW5kYW50IHdpdGggdGhlIHNlcmlhbCBgcHJvbWlzZVF1ZXVlYC5cbiAqIFRoZSBxdWV1ZSBmaXhlcyB0aGUgb3JkZXIgaW4gd2hpY2ggc3RlcCByZXN1bHRzIGFyZSBIWURSQVRFRCwgYnV0IGEgc3RlcCBub1xuICogbG9uZ2VyIHJlc29sdmVzIGluc2lkZSBpdHMgcXVldWUgc2xvdCDigJQgaXQgY2FwdHVyZXMgdGhlIG91dGNvbWUgdGhlcmUgYW5kXG4gKiByZXNvbHZlcyBmcm9tIGEgZGV0YWNoZWQgY29udGludWF0aW9uIG9uY2UgaXRzIGJhcnJpZXIgY2xlYXJzLiBUd28gc3RlcHNcbiAqIGFncmVlIG9uIHRoYXQgY29udGludWF0aW9uJ3Mgb3JkZXJpbmcgb25seSB3aGlsZSB0aGV5IGRlZmVyIGJlaGluZCB0aGUgc2FtZVxuICogc2V0LCB3aGljaCBob2xkcyB3aGVuIHRoZXkgYXJlIGNvbnN1bWVkIGluIHRoZSBzYW1lIGRyYWluIHdpbmRvdyBidXQgbm90XG4gKiBhY3Jvc3Mgd2luZG93czogYSBzdGVwIGNvbnN1bWVkIGxhdGVyIGNhbiBtaXNzIGEgd2FpdC9ob29rIGJhcnJpZXIgdGhhdCBhblxuICogZWFybGllciBzdGVwIGlzIHN0aWxsIHBhcmtlZCBvbiwgYmVjYXVzZSB0aGUgYmFycmllciByZXRpcmVkIGluIGJldHdlZW4uIFRoZVxuICogZWFybGllciBzdGVwIGlzIHRoZW4gd2FpdGluZyBvdXQgdGhlIG1hY3JvdGFzayB5aWVsZCBiZWxvdyB3aGlsZSB0aGUgbGF0ZXJcbiAqIG9uZSByZXNvbHZlcyBvbiBtaWNyb3Rhc2tzLCBhbmQgb3ZlcnRha2VzIGl0IOKAlCBzZWVcbiAqIGBkZWxpdmVyeS1iYXJyaWVyLWNvdmVyYWdlLnRlc3QudHNgLiBEZWZlcnJpbmcgYmVoaW5kIGVhcmxpZXIgc3RlcHNcbiAqIGNsb3NlcyB0aGF0IHdpbmRvdyBzdHJ1Y3R1cmFsbHk6IHRoZSBlYXJsaWVyIHN0ZXAncyBiYXJyaWVyIGlzIHN0aWxsXG4gKiByZWdpc3RlcmVkIHByZWNpc2VseSBiZWNhdXNlIGl0IGhhcyBub3QgZGVsaXZlcmVkIHlldC5cbiAqXG4gKiBFdmVyeSBlZGdlIHBvaW50cyBmcm9tIGEgbGF0ZXIgbG9nIGluZGV4IHRvIGEgc3RyaWN0bHkgZWFybGllciBvbmUsIHNvIHRoZVxuICogd2FpdC1mb3IgZ3JhcGggY2FuIG5ldmVyIGNvbnRhaW4gYSBjeWNsZS5cbiAqL1xuY29uc3QgREVGRVJfQkVISU5EOiBSZWNvcmQ8RGVsaXZlcnlLaW5kLCByZWFkb25seSBEZWxpdmVyeUtpbmRbXT4gPSB7XG4gIGhvb2s6IFsnaG9vaycsICd3YWl0JywgJ3N0ZXAnXSxcbiAgd2FpdDogWydob29rJywgJ3N0ZXAnXSxcbiAgc3RlcDogWyd3YWl0JywgJ2hvb2snLCAnc3RlcCddLFxufTtcblxuLyoqXG4gKiBXaGV0aGVyIGEgZGVsaXZlcnkgb2YgYGtpbmRgIGF0IGxvZyBpbmRleCBgaW5kZXhgIGdhdGVzIG9uIHRoZSBlYXJsaWVyXG4gKiByZWdpc3RyeSBlbnRyeSBgb3RoZXJgIChhdCBgb3RoZXJJbmRleGApLlxuICpcbiAqIFNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHRoYXQgcXVlc3Rpb24sIGNhbGxlZCBieSBib3RoXG4gKiB7QGxpbmsgYXdhaXRFYXJsaWVyRGVsaXZlcmllc30gKHdoaWNoIGF3YWl0cyB3aGF0IGl0IGdhdGVzIG9uKSBhbmRcbiAqIHtAbGluayBjb21wdXRlUmVzb2x2ZXNPbkl0c093bn0gKHdoaWNoIHJlY3Vyc2VzIGludG8gd2hhdCBpdCBnYXRlcyBvbikuXG4gKiBUaG9zZSB0d28gTVVTVCBhZ3JlZSBleGFjdGx5LCBhbmQgdGhlIGRvYyBibG9jayBvblxuICoge0BsaW5rIGF3YWl0RWFybGllckRlbGl2ZXJpZXN9IHN0YWtlcyBkZWFkbG9jay1mcmVlZG9tIG9uIGl0LCBzbyB0aGVcbiAqIGNvbmRpdGlvbiBsaXZlcyBoZXJlIHJhdGhlciB0aGFuIGJlaW5nIHNwZWxsZWQgb3V0IHR3aWNlLlxuICovXG5mdW5jdGlvbiBnYXRlc09uKFxuICBraW5kOiBEZWxpdmVyeUtpbmQsXG4gIGluZGV4OiBudW1iZXIsXG4gIG90aGVySW5kZXg6IG51bWJlcixcbiAgb3RoZXI6IERlbGl2ZXJ5QmFycmllckVudHJ5XG4pOiBib29sZWFuIHtcbiAgaWYgKG90aGVySW5kZXggPj0gaW5kZXggfHwgIURFRkVSX0JFSElORFtraW5kXS5pbmNsdWRlcyhvdGhlci5raW5kKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvLyBBIHN0ZXAgc2tpcHMgYW4gVU5BUk1FRCBlYXJsaWVyIGVudHJ5IChhbiB1bmNsYWltZWQgYnVmZmVyZWQgaG9va1xuICAvLyBwYXlsb2FkKSDigJQgc2VlIHRoZSBhc3ltbWV0cnkgZGVzY3JpYmVkIG9uIGBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzYC4gVGhlXG4gIC8vIHNraXAgaXMgZGlyZWN0LCBuZXZlciB0cmFuc2l0aXZlOiBhcm1lZCBlbnRyaWVzIGFyZSBzdGlsbCBnYXRlZCBvbiwgZXZlblxuICAvLyB3aGVuIHRoZXkgYXJlIHRoZW1zZWx2ZXMgcGFya2VkIGJlaGluZCBzdWNoIGEgcGF5bG9hZC5cbiAgcmV0dXJuICEoa2luZCA9PT0gJ3N0ZXAnICYmICFvdGhlci5hcm1lZCk7XG59XG5cbi8qKlxuICogV2hldGhlciBgZW50cnlgIHdpbGwgcmVzb2x2ZSBvbiBpdHMgb3duIOKAlCBpdCBpcyBhcm1lZCwgYW5kIGV2ZXJ5IGVhcmxpZXJcbiAqIGRlbGl2ZXJ5IGl0IGFjdHVhbGx5IGdhdGVzIG9uICh7QGxpbmsgZ2F0ZXNPbn0pIHdpbGwgbGlrZXdpc2UgcmVzb2x2ZSBvbiBpdHNcbiAqIG93bi5cbiAqXG4gKiBBIHN0ZXAgZG9lcyBub3QgZ2F0ZSBvbiBhbiB1bmNsYWltZWQgYnVmZmVyZWQgcGF5bG9hZCwgc28gc3VjaCBhIHBheWxvYWRcbiAqIGNhbm5vdCBrZWVwIGl0IGZyb20gcmVzb2x2aW5nLiBBIHN0ZXAgRE9FUyBnYXRlIG9uIGVhcmxpZXIgYXJtZWQgd2FpdHMgYW5kXG4gKiBob29rcywgc28gb25lIHBhcmtlZCBiZWhpbmQgYW4gdW5jbGFpbWVkIHBheWxvYWQgbWFrZXMgdGhlIHN0ZXBcbiAqIG5vbi1zZWxmLXJlc29sdmluZyBpbiB0dXJuLiBEaXNhZ3JlZWluZyB3aXRoIHtAbGluayBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzfVxuICogaGVyZSB3b3VsZCBub3QgYmUgYSBjb3NtZXRpYyBwcm9ibGVtOiB0aGlzIHByZWRpY2F0ZSBpcyB3aGF0XG4gKiB7QGxpbmsgaGFzUGFya2VkQ29tbWl0dGVkRGVsaXZlcnl9IHVzZXMgdG8gZGVjaWRlIHdoZXRoZXIgaWRsZSBpcyByZWFjaGFibGUsXG4gKiBhbmQgYW4gZW50cnkgcmVwb3J0ZWQgc2VsZi1yZXNvbHZpbmcgd2hpbGUgaXQgaXMgaW4gZmFjdCBwYXJrZWQgYmVoaW5kIGFcbiAqIHBheWxvYWQgdGhhdCBvbmx5IHRoZSBpZGxlIHNhZmV0eSBuZXQgY2FuIHJldGlyZSB3b3VsZCBnYXRlIGl0cyBvd25cbiAqIHJldGlyZW1lbnQuXG4gKlxuICogUmVjdXJzaW9uIHRlcm1pbmF0ZXMgYmVjYXVzZSBldmVyeSBlZGdlIHBvaW50cyB0byBhIHN0cmljdGx5IHNtYWxsZXIgaW5kZXguXG4gKiBgbWVtb2Aga2VlcHMgdGhlIHdhbGsgbGluZWFyIGluIHJlZ2lzdHJ5IHNpemUsIGFuZCB0aGUgcmVnaXN0cnkgaXMgbm90IHNtYWxsXG4gKiBieSBjb25zdHJ1Y3Rpb24g4oCUIGBFdmVudHNDb25zdW1lcmAgZHJhaW5zIGNvbnNlY3V0aXZlbHkgY29uc3VtYWJsZSBldmVudHNcbiAqIHN5bmNocm9ub3VzbHkgd2hpbGUgYmFycmllcnMgb25seSByZXRpcmUgb24gbWljcm90YXNrLWRyaXZlbiBkZWxpdmVyaWVzLCBzb1xuICogYSBmYW4tb3V0IG9mIGBQcm9taXNlLnJhY2UoW2hvb2ssIHNsZWVwXSlgIGJyYW5jaGVzIGFjY3VtdWxhdGVzIG9uZSBiYXJyaWVyXG4gKiBwZXIgYnJhbmNoIHBlciBraW5kLiBUaGUgbWVtbyBNVVNUIGJlIHBlci1jYWxsOiBgYXJtZWRgIG11dGF0ZXMgYmV0d2VlblxuICogY2FsbHMgYXMgYnVmZmVyZWQgcGF5bG9hZHMgYXJlIGNsYWltZWQuXG4gKlxuICogVGhlIG1lbW8gaXMgYW4gb3B0aW1pemF0aW9uLCBub3QgYSBjb3JyZWN0bmVzcyByZXF1aXJlbWVudC4gSXQgb25jZSB3YXMgb25lOlxuICogYGF3YWl0RWFybGllckRlbGl2ZXJpZXNgIHVzZWQgdG8gcnVuIHRoaXMgd2FsayBmb3IgZXZlcnkgZWFybGllciBlbnRyeSBvZiBhXG4gKiBzdGVwIGRlbGl2ZXJ5LCB3aXRoIG5vIGVhcmx5IGV4aXQsIHdoaWNoIHVubWVtb2l6ZWQgaXMgVChuKSA9IM6jIFQoaikg4oCUXG4gKiBtZWFzdXJlZCBhdCA0LjNlOCByZWN1cnNpdmUgY2FsbHMgKDg0cykgZm9yIDQwIGFsdGVybmF0aW5nIGFybWVkIGhvb2svd2FpdFxuICogYmFycmllcnMuIFRoYXQgY2FsbCBzaXRlIGlzIGdvbmU7IGEgc3RlcCBub3cgdGVzdHMgYGFybWVkYCBkaXJlY3RseS4gVGhlIG9uZVxuICogc3Vydml2aW5nIGNhbGxlciwge0BsaW5rIGhhc1BhcmtlZENvbW1pdHRlZERlbGl2ZXJ5fSwgY2Fubm90IHJlYWNoIHRoYXRcbiAqIHNoYXBlOiBpdCByZXR1cm5zIGF0IHRoZSBGSVJTVCBzZWxmLXJlc29sdmluZyBlbnRyeSwgc28gaXQgb25seSBldmVyXG4gKiBhZHZhbmNlcyBwYXN0IGVudHJpZXMgdGhhdCBhcmUgbm9uLXNlbGYtcmVzb2x2aW5nLCBhbmQgdGhvc2Ugc2hvcnQtY2lyY3VpdFxuICogb24gdGhlaXIgZmlyc3QgZmFsc2UgY2hpbGQuIEV2ZXJ5IGVudHJ5IGl0IGV2YWx1YXRlcyB0aGVyZWZvcmUgaGFzXG4gKiBhbGwtZmFsc2UgcHJlZGVjZXNzb3JzIGFuZCByZXR1cm5zIGFmdGVyIG9uZSBjaGlsZCwgZGVnZW5lcmF0aW5nIHRoZSB3YWxrIHRvXG4gKiBhIGNoYWluIChtZWFzdXJlZDogOTggY2FsbHMgdW5tZW1vaXplZCBmb3IgdGhlIHdvcnN0IDQwLWJhcnJpZXIgc2hhcGUsIDFcbiAqIGNhbGwgZm9yIHRoZSByZWdpc3RyeSBhYm92ZSkuIERvIG5vdCByZXN0b3JlIGFuIGV4cG9uZW50aWFsIGNsYWltIGhlcmVcbiAqIHdpdGhvdXQgcmVzdG9yaW5nIGEgY2FsbGVyIHRoYXQgY2FuIHByb2R1Y2UgaXQuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVzT25JdHNPd24oXG4gIGJhcnJpZXJzOiBNYXA8bnVtYmVyLCBEZWxpdmVyeUJhcnJpZXJFbnRyeT4sXG4gIGluZGV4OiBudW1iZXIsXG4gIGVudHJ5OiBEZWxpdmVyeUJhcnJpZXJFbnRyeSxcbiAgbWVtbzogTWFwPG51bWJlciwgYm9vbGVhbj5cbik6IGJvb2xlYW4ge1xuICBjb25zdCBjYWNoZWQgPSBtZW1vLmdldChpbmRleCk7XG4gIGlmIChjYWNoZWQgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBjYWNoZWQ7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gY29tcHV0ZVJlc29sdmVzT25JdHNPd24oYmFycmllcnMsIGluZGV4LCBlbnRyeSwgbWVtbyk7XG4gIG1lbW8uc2V0KGluZGV4LCByZXN1bHQpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBjb21wdXRlUmVzb2x2ZXNPbkl0c093bihcbiAgYmFycmllcnM6IE1hcDxudW1iZXIsIERlbGl2ZXJ5QmFycmllckVudHJ5PixcbiAgaW5kZXg6IG51bWJlcixcbiAgZW50cnk6IERlbGl2ZXJ5QmFycmllckVudHJ5LFxuICBtZW1vOiBNYXA8bnVtYmVyLCBib29sZWFuPlxuKTogYm9vbGVhbiB7XG4gIGlmICghZW50cnkuYXJtZWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZm9yIChjb25zdCBbb3RoZXJJbmRleCwgb3RoZXJdIG9mIGJhcnJpZXJzKSB7XG4gICAgaWYgKCFnYXRlc09uKGVudHJ5LmtpbmQsIGluZGV4LCBvdGhlckluZGV4LCBvdGhlcikpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoIXJlc29sdmVzT25JdHNPd24oYmFycmllcnMsIG90aGVySW5kZXgsIG90aGVyLCBtZW1vKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBBd2FpdHMsIGluIHN0cmljdCBldmVudC1sb2cgb3JkZXIsIGV2ZXJ5IHN0aWxsLXJlZ2lzdGVyZWQgZGVsaXZlcnkgdGhhdCBpc1xuICogZWFybGllciBpbiB0aGUgbG9nIHRoYW4gYGV2ZW50SW5kZXhgIGFuZCB0aGF0IGEgZGVsaXZlcnkgb2YgYGtpbmRgIGRlZmVyc1xuICogYmVoaW5kIChzZWUge0BsaW5rIERFRkVSX0JFSElORH0pLCBzbyB0aGF0IHRoaXMgcmVzb2x1dGlvbiBpcyBoYW5kZWQgdG8gdGhlXG4gKiB3b3JrZmxvdyBvbmx5IGFmdGVyIGFsbCByZWxldmFudCBlYXJsaWVyLWluLWxvZyBkZWxpdmVyaWVzIGhhdmUgYmVlbi4gVGhpc1xuICogaXMgd2hhdCBrZWVwcyBhIGBQcm9taXNlLnJhY2VgIOKAlCBvciB0aGUgVUxJRCBhIGZvbGxvdy11cCBgdXNlU3RlcGAgZHJhd3Mgb25cbiAqIGEgY29uY3VycmVudCBicmFuY2gg4oCUIGRldGVybWluaXN0aWMgYW5kIGFsaWduZWQgd2l0aCB0aGUgY29tbWl0dGVkIGV2ZW50XG4gKiBsb2csIGluZGVwZW5kZW50IG9mIG1pY3JvdGFzay1ob3AgY291bnRzLCBoeWRyYXRpb24gdGltZSwgb3IgcmFjZS1hcmd1bWVudFxuICogb3JkZXIuIFdoZW4gdGhpcyBkZWxpdmVyeSBkb2VzIGhhdmUgdG8gd2FpdCwgaXQgYWxzbyB5aWVsZHMgYSBtYWNyb3Rhc2tcbiAqIGFmdGVyd2FyZHMgc28gdGhlIGVhcmxpZXIgZGVsaXZlcnkncyBjb25zdW1lciBjYW4gcnVuIHRvIGl0cyBvd24gbmV4dFxuICogc3VzcGVuc2lvbiBwb2ludCBmaXJzdDsgc2VlIHRoZSBjb21tZW50IGF0IHRoYXQgYGF3YWl0YCBmb3Igd2h5IG9yZGVyaW5nIHRoZVxuICogYHJlc29sdmUoKWAgY2FsbHMgYWxvbmUgaXMgbm90IGVub3VnaC5cbiAqXG4gKiBXaGF0IGNvdW50cyBhcyBcImRlZmVycyBiZWhpbmRcIiBpcyB7QGxpbmsgZ2F0ZXNPbn0sIHNoYXJlZCB3aXRoXG4gKiB7QGxpbmsgY29tcHV0ZVJlc29sdmVzT25JdHNPd259IHNvIHRoZSB0d28gY2Fubm90IGRyaWZ0LlxuICpcbiAqIE9uZSBhc3ltbWV0cnk6IGEgU1RFUCByZXN1bHQgc2tpcHMgYW55IGVhcmxpZXIgZGVsaXZlcnkgdGhhdCBpcyBVTkFSTUVELFxuICogaS5lLiBhIGJ1ZmZlcmVkIGhvb2sgcGF5bG9hZCBubyBjb25zdW1lciBoYXMgY2xhaW1lZC4gU3VjaCBhIHBheWxvYWQgaXNcbiAqIGRlbGl2ZXJlZCBvbmx5IHdoZW4gdGhlIHdvcmtmbG93IG5leHQgcmVhZHMgdGhlIGhvb2ssIGFuZCByZWFjaGluZyB0aGF0IHJlYWRcbiAqIHZlcnkgY29tbW9ubHkgcmVxdWlyZXMgdGhlIHN0ZXAgcmVzdWx0IGl0c2VsZiAoYGF3YWl0IHN0ZXBYKClgIGJlZm9yZSB0aGVcbiAqIHJlYWQpLiBHYXRpbmcgdGhlIHN0ZXAgb24gaXQgd291bGQgc3RhbGwgdGhlIHdvcmtmbG93IHVudGlsIHRoZSBiYXJyaWVyJ3NcbiAqIGlkbGUgc2FmZXR5IG5ldCBmaXJlcywgd2hpY2ggdGhlbiByZWxlYXNlcyBldmVyeSBkZWxpdmVyeSBxdWV1ZWQgYmVoaW5kIHRoYXRcbiAqIHBheWxvYWQgYXQgb25jZSDigJQgbG9zaW5nIGV4YWN0bHkgdGhlIHJhY2UgdGhpcyBvcmRlcmluZyBleGlzdHMgdG8gcHJvdGVjdC5cbiAqIFdhaXRzIGFuZCBob29rcyBrZWVwIGdhdGluZyBvbiB1bmNsYWltZWQgcGF5bG9hZHM6IGZvciB0aGVtLCB3YWl0aW5nIGZvciB0aGVcbiAqIGNsYWltIElTIHRoZSBvcmRlcmluZyBndWFyYW50ZWUgKGEgYHdhaXRfY29tcGxldGVkYCBtdXN0IG5vdCBwcmVlbXB0IGFcbiAqIHBheWxvYWQgdGhlIGxvZyBvcmRlcmVkIGZpcnN0KS5cbiAqXG4gKiBUaGUgc2tpcCBpcyBkaXJlY3QsIG5ldmVyIHRyYW5zaXRpdmUuIEEgc3RlcCBzdGlsbCBnYXRlcyBvbiBhbiBlYXJsaWVyIEFSTUVEXG4gKiB3YWl0IG9yIGhvb2ssIGluY2x1ZGluZyBvbmUgdGhhdCBpcyBpdHNlbGYgcGFya2VkIGJlaGluZCBhbiB1bmNsYWltZWRcbiAqIHBheWxvYWQuIFNraXBwaW5nIHRob3NlIHRvbyB3b3VsZCBpbnZlcnQgbG9nIG9yZGVyIGZvciB0aGUgY29tbW9uZXN0IHNoYXBlXG4gKiB0aGVyZSBpczogYSB3b3JrZmxvdyB0aGF0IGNyZWF0ZXMgYSBob29rIGl0IGRvZXMgbm90IHJlYWQgb24gdGhpcyBicmFuY2gsXG4gKiByYWNlcyBgc3RlcGAgYWdhaW5zdCBgc2xlZXBgLCBhbmQgaGFzIHRoZSBsb2cgc2F5IHRoZSBzbGVlcCB3b24uIFRoZSBzdGVwXG4gKiB3b3VsZCB0aGVuIG92ZXJ0YWtlIHRoZSB3YWl0LCBib3RoIGJyYW5jaGVzIHdvdWxkIHN3YXAgdGhlIGNvcnJlbGF0aW9uIGlkc1xuICogdGhleSBkcmF3IG5leHQsIGFuZCByZXBsYXkgd291bGQgZGl2ZXJnZSDigJQgc2VlXG4gKiBgc3RlcC1kZWxpdmVyeS1vcmRlcmluZy50ZXN0LnRzYC4gV2FpdGluZyBpbnN0ZWFkIGlzIHNhZmUgYmVjYXVzZSB0aGVcbiAqIHBheWxvYWQncyBvd24gaWRsZSBzYWZldHkgbmV0IHJldGlyZXMgaXQgYW5kIHRoZSB3aG9sZSBjaGFpbiB0aGVuIGRlbGl2ZXJzXG4gKiBpbiBsb2cgb3JkZXI7IHtAbGluayBoYXNQYXJrZWRDb21taXR0ZWREZWxpdmVyeX0gZGVsaWJlcmF0ZWx5IHJlcG9ydHMgc3VjaCBhXG4gKiBzdGVwIGFzIG5vdCBzZWxmLXJlc29sdmluZyBzbyB0aGF0IGlkbGUgc3RheXMgcmVhY2hhYmxlLlxuICpcbiAqIFwiVGhlIHdob2xlIGNoYWluIHRoZW4gZGVsaXZlcnMgaW4gbG9nIG9yZGVyXCIgcmVzdHMgb24gdGhlIFBBWUxPQUQncyBiYXJyaWVyXG4gKiBiZWluZyByZXRpcmVkIGJlZm9yZSB0aGF0IG9mIGFueXRoaW5nIHBhcmtlZCBiZWhpbmQgaXQuIFRoYXQgb3JkZXIgaXNcbiAqIHN0cnVjdHVyYWw6IHNhZmV0eS1uZXQgcmV0aXJlbWVudHMgZ28gdGhyb3VnaCBvbmUgcGVyLWNvbnRleHQgZGlzcGVuc2VyIHRoYXRcbiAqIG9ubHkgZXZlciByZXRpcmVzIHRoZSBsb3dlc3QtaW5kZXggZW50cnkgYXQgZGVsaXZlcnkgaWRsZSwgYW5kIGV2ZXJ5XG4gKiByZXRpcmVtZW50IHRoYXQgd2FrZXMgYSBjaGFpbiBmbGlwcyB7QGxpbmsgaGFzUGFya2VkQ29tbWl0dGVkRGVsaXZlcnl9IGJhY2tcbiAqIHRvIHRydWUsIHJlLWJsb2NraW5nIHRoZSBkaXNwZW5zZXIgdW50aWwgdGhlIGNoYWluIGhhcyBkcmFpbmVkIOKAlCBzZWVcbiAqIHtAbGluayBlbnN1cmVCYXJyaWVyU2FmZXR5TmV0fS4gKFRoaXMgdXNlZCB0byByZXN0IG9uIHRoZSBGSUZPIG9mIG9uZSBpZGxlXG4gKiBwb2xsIHBlciBiYXJyaWVyLCB3aGljaCBoZWxkIGZvciBhIHNpbmdsZSBwYXJrZWQgc2VnbWVudCBidXQgZGVjYXllZCB0b1xuICogdGltaW5nIG5vaXNlIHdpdGggc2V2ZXJhbCDigJQgdGhlIHJlbGVhc2Ugb3JkZXIsIGFuZCB0aGVyZWZvcmUgdGhlIFVMSURzXG4gKiBkcmF3biBieSB0aGUgd29rZW4gYnJhbmNoZXMsIHRoZW4gZGVwZW5kZWQgb24gaG93IG11Y2ggbG9nIHRoZSByZXBsYXkgaGFkXG4gKiBsb2FkZWQuIHN0b3JtLWxvZy1yZXBsYXkudGVzdC50cyByZXBsYXlzIGEgcHJvZHVjdGlvbiBsb2cgY29ycnVwdGVkIGV4YWN0bHlcbiAqIHRoYXQgd2F5LilcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGF3YWl0RWFybGllckRlbGl2ZXJpZXMoXG4gIGN0eDogV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0LFxuICBldmVudEluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQsXG4gIGtpbmQ6IERlbGl2ZXJ5S2luZFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIERlZmVuc2l2ZTogdG9sZXJhdGUgY29udGV4dHMgdGhhdCBwcmVkYXRlIHRoaXMgZmllbGQgKHRlc3QgaGFybmVzc2VzKS5cbiAgaWYgKFxuICAgIGV2ZW50SW5kZXggPT09IHVuZGVmaW5lZCB8fFxuICAgICFjdHgucGVuZGluZ0RlbGl2ZXJ5QmFycmllcnMgfHxcbiAgICBjdHgucGVuZGluZ0RlbGl2ZXJ5QmFycmllcnMuc2l6ZSA9PT0gMFxuICApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgYmFycmllcnMgPSBjdHgucGVuZGluZ0RlbGl2ZXJ5QmFycmllcnM7XG4gIGNvbnN0IGVhcmxpZXI6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtpbmRleCwgZW50cnldIG9mIGJhcnJpZXJzKSB7XG4gICAgaWYgKCFnYXRlc09uKGtpbmQsIGV2ZW50SW5kZXgsIGluZGV4LCBlbnRyeSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBlYXJsaWVyLnB1c2goZW50cnkuZGVsaXZlcmVkKTtcbiAgfVxuICBpZiAoZWFybGllci5sZW5ndGggPiAwKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoZWFybGllcik7XG4gICAgLy8gQW4gZWFybGllciBkZWxpdmVyeSBiZWluZyBcImRlbGl2ZXJlZFwiIG9ubHkgbWVhbnMgaXRzIGByZXNvbHZlKClgIHJhbi5cbiAgICAvLyBUaGUgYnJhbmNoIGl0IHdva2UgbWF5IG5lZWQgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBmdXJ0aGVyIG1pY3JvdGFza1xuICAgIC8vIGhvcHMgYmVmb3JlIGl0IHJlYWNoZXMgaXRzIG5leHQgYHVzZVN0ZXBgIGNhbGwgYW5kIGRyYXdzIGEgVUxJRCDigJQgYVxuICAgIC8vIGBmb3IgYXdhaXRgIG92ZXIgYSBob29rLCBmb3IgaW5zdGFuY2UsIHJlc3VtZXMgdGhlIGdlbmVyYXRvciwgc2V0dGxlc1xuICAgIC8vIHRoZSBwcm9taXNlIGZyb20gYG5leHQoKWAsIGFuZCBvbmx5IHRoZW4gcnVucyB0aGUgbG9vcCBib2R5LiBSZXNvbHZpbmdcbiAgICAvLyB0aGlzIGRlbGl2ZXJ5IG9uIGEgbWljcm90YXNrIHdvdWxkIGxldCBpdCBvdmVydGFrZSB0aGF0IGJyYW5jaCBhbmRcbiAgICAvLyByZW9yZGVyIHRoZSBVTElEIGFsbG9jYXRpb24gYW55d2F5LCB0dXJuaW5nIHRoZSBndWFyYW50ZWUgYmVsb3cgaW50byBhXG4gICAgLy8gaG9wLWNvdW50IHJhY2UgdGhhdCBob2xkcyBvbmx5IGZvciB0aGUgc2hvcnRlc3QgY29uc3VtZXJzLlxuICAgIC8vXG4gICAgLy8gWWllbGRpbmcgYSBtYWNyb3Rhc2sgbGV0cyB0aGUgZWFybGllciBicmFuY2gncyBlbnRpcmUgbWljcm90YXNrIGNoYWluXG4gICAgLy8gZHJhaW4gZmlyc3QsIHdoYXRldmVyIGl0cyBsZW5ndGgsIHNvIGxvZyBvcmRlciBzdXJ2aXZlcyByZWdhcmRsZXNzIG9mXG4gICAgLy8gaG93IHRoZSB3b3JrZmxvdyBjb25zdW1lcyB0aGUgZWFybGllciBkZWxpdmVyeS4gT25seSBkZWxpdmVyaWVzIHRoYXRcbiAgICAvLyBhY3R1YWxseSBoYWQgdG8gZGVmZXIgcGF5IHRoaXMsIHNvIHRoZSBjb21tb24gc2luZ2xlLWRlbGl2ZXJ5IGRyYWluIGlzXG4gICAgLy8gdW5hZmZlY3RlZC5cbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAwKSk7XG4gIH1cbn1cblxuLyoqIEhhbmRsZSBmb3IgYSByZWdpc3RlcmVkIGJyYW5jaC1kZWNpZGluZyBkZWxpdmVyeSBiYXJyaWVyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWxpdmVyeUJhcnJpZXIge1xuICAvKipcbiAgICogTWFyayB0aGlzIGRlbGl2ZXJ5IGFzIGRlbGl2ZXJlZCB0byB0aGUgd29ya2Zsb3cuIFJlc29sdmVzIGl0c1xuICAgKiBgZGVsaXZlcmVkYCBwcm9taXNlIHNvIGFueSBsYXRlci1pbi1sb2cgZGVsaXZlcnkgZ2F0ZWQgb24gaXQgKHZpYVxuICAgKiB7QGxpbmsgYXdhaXRFYXJsaWVyRGVsaXZlcmllc30pIG1heSBwcm9jZWVkLCBhbmQgcmVtb3ZlcyBpdCBmcm9tIHRoZVxuICAgKiByZWdpc3RyeS4gSWRlbXBvdGVudC5cbiAgICovXG4gIG1hcmtEZWxpdmVyZWQ6ICgpID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBNYXJrIHRoaXMgZGVsaXZlcnkgYXMgY29tbWl0dGVkIHRvIGhhcHBlbmluZywgZm9yIGEgYmFycmllciByZWdpc3RlcmVkXG4gICAqIHVuYXJtZWQgKGEgYnVmZmVyZWQgaG9vayBwYXlsb2FkKSBvbmNlIGEgY29uc3VtZXIgaGFzIGNsYWltZWQgaXQuIEZyb21cbiAgICogdGhlbiBvbiBhIGxhdGVyIHN0ZXAgcmVzdWx0IG1heSBiZSBvcmRlcmVkIGJlaGluZCBpdC4gSWRlbXBvdGVudC5cbiAgICovXG4gIGFybTogKCkgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBSZWdpc3RlciBhIGJyYW5jaC1kZWNpZGluZyBkZWxpdmVyeSBhdCBpdHMgZXZlbnQtbG9nIGluZGV4IHNvIHRoYXQgbGF0ZXJcbiAqIGRlbGl2ZXJpZXMgY2FuIGJlIG9yZGVyZWQgc3RyaWN0bHkgYWZ0ZXIgaXQuIFJldHVybnMgYW4gaW5lcnQgaGFuZGxlIHdoZW5cbiAqIGBwZW5kaW5nRGVsaXZlcnlCYXJyaWVyc2AgaXMgbm90IGluaXRpYWxpemVkLlxuICpcbiAqIFBhc3MgYGFybWVkOiBmYWxzZWAgZm9yIGEgZGVsaXZlcnkgd2hvc2UgcmVzb2x1dGlvbiB3YWl0cyBvbiB3b3JrZmxvdyBjb2RlXG4gKiBhc2tpbmcgZm9yIGl0IChhIGJ1ZmZlcmVkIGhvb2sgcGF5bG9hZCk7IGNhbGwgYGFybSgpYCB3aGVuIGl0IGRvZXMuXG4gKlxuICogVG8gZ3VhcmFudGVlIGEgbGF0ZXIgZGVsaXZlcnkgZ2F0ZWQgb24gdGhpcyBvbmUgY2FuIG5ldmVyIGhhbmcgd2hlbiB0aGlzXG4gKiBkZWxpdmVyeSBpcyBhYmFuZG9uZWQgKHRoZSB3b3JrZmxvdyB0b29rIGEgZGlmZmVyZW50IGJyYW5jaCBvciBpc1xuICogc3VzcGVuZGluZyBhbmQgbmV2ZXIgb2JzZXJ2ZXMgaXQpLCB0aGUgYmFycmllciBhdXRvLXJlc29sdmVzIGF0IGlkbGUuXG4gKlxuICogSU5WQVJJQU5UIHJlcXVpcmVkIG9mIGV2ZXJ5IGNhbGwgc2l0ZTogYSBiYXJyaWVyIHRoYXQgaXMgZXZlciBgYXJtZWRgIG11c3RcbiAqIGJlIHBhaXJlZCB3aXRoIGEgZGVsaXZlcnkgY2hhaW4gdGhhdCBydW5zIHVuY29uZGl0aW9uYWxseSDigJQgYXR0YWNoZWQgd2hlblxuICogdGhlIGV2ZW50IGlzIGNvbnN1bWVkICh3YWl0cywgc3RlcCByZXN1bHRzLCB3YWl0aW5nLWNvbnN1bWVyIGhvb2sgcGF5bG9hZHMsXG4gKiBhYm9ydHMpLCBvciBieSB0aGUgYGNsYWltKClgIHdob3NlIGludm9jYXRpb24gaXMgd2hhdCBhcm1zIGl0IChidWZmZXJlZFxuICogaG9vayBwYXlsb2FkcykuIFRoZSBpZGxlIGNoZWNrICh7QGxpbmsgc2NoZWR1bGVXaGVuSWRsZX0pIHJlZnVzZXMgdG9cbiAqIG9ic2VydmUgaWRsZSB3aGlsZSBhbiBhcm1lZCwgc2VsZi1yZXNvbHZpbmcgYmFycmllciBpcyB1bmRlbGl2ZXJlZCwgYW5kIHRoZVxuICogc2FmZXR5IG5ldCBiZWxvdyBpcyBpdHNlbGYgaWRsZS1nYXRlZCDigJQgc28gYW4gYXJtZWQgYmFycmllciB3aXRoIG5vXG4gKiB1bmNvbmRpdGlvbmFsIGNoYWluIHdvdWxkIGxpdmVsb2NrIGV2ZXJ5IGlkbGUgY2hlY2sgaW4gdGhlIHJ1biwgaW5jbHVkaW5nXG4gKiBpdHMgb3duIHJldGlyZW1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckRlbGl2ZXJ5QmFycmllcihcbiAgY3R4OiBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQsXG4gIGV2ZW50SW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAga2luZDogRGVsaXZlcnlLaW5kLFxuICBvcHRpb25zOiB7IGFybWVkPzogYm9vbGVhbiB9ID0ge31cbik6IERlbGl2ZXJ5QmFycmllciB7XG4gIGNvbnN0IGJhcnJpZXJzID0gY3R4LnBlbmRpbmdEZWxpdmVyeUJhcnJpZXJzO1xuICBpZiAoIWJhcnJpZXJzIHx8IGV2ZW50SW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB7IG1hcmtEZWxpdmVyZWQ6ICgpID0+IHt9LCBhcm06ICgpID0+IHt9IH07XG4gIH1cblxuICBsZXQgZG9uZSA9IGZhbHNlO1xuICBjb25zdCB7IHByb21pc2UsIHJlc29sdmUgfSA9IHdpdGhSZXNvbHZlcnM8dm9pZD4oKTtcblxuICBjb25zdCBmaW5pc2ggPSAoKSA9PiB7XG4gICAgaWYgKGRvbmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZG9uZSA9IHRydWU7XG4gICAgaWYgKGJhcnJpZXJzLmdldChldmVudEluZGV4KSA9PT0gZW50cnkpIHtcbiAgICAgIGJhcnJpZXJzLmRlbGV0ZShldmVudEluZGV4KTtcbiAgICB9XG4gICAgcmVzb2x2ZSgpO1xuICB9O1xuXG4gIGNvbnN0IGVudHJ5OiBEZWxpdmVyeUJhcnJpZXJFbnRyeSA9IHtcbiAgICBraW5kLFxuICAgIGRlbGl2ZXJlZDogcHJvbWlzZSxcbiAgICBhcm1lZDogb3B0aW9ucy5hcm1lZCA/PyB0cnVlLFxuICAgIHJldGlyZTogZmluaXNoLFxuICB9O1xuICBiYXJyaWVycy5zZXQoZXZlbnRJbmRleCwgZW50cnkpO1xuXG4gIC8vIFNhZmV0eSBuZXQ6IGlmIHRoaXMgZGVsaXZlcnkgaXMgbmV2ZXIgZGVsaXZlcmVkIHRvIHRoZSB3b3JrZmxvdyAoaXRzXG4gIC8vIGJyYW5jaCB3YXMgbm90IHRha2VuIC8gdGhlIHJ1biBpcyBzdXNwZW5kaW5nLCBvciBhIGJ1ZmZlcmVkIGhvb2sgcGF5bG9hZFxuICAvLyBpcyBvbmx5IGNsYWltZWQgYWZ0ZXIgYSBsYXRlciBkZWxpdmVyeSB0aGUgd29ya2Zsb3cgaXMgc3RpbGwgd2FpdGluZyBvbiksXG4gIC8vIGl0IGlzIHJldGlyZWQgYXQgaWRsZSBzbyBhIGxhdGVyIGRlbGl2ZXJ5IGdhdGVkIG9uIGl0IGNhbm5vdCBkZWFkbG9jayBhbmRcbiAgLy8gdGhlIHJlZ2lzdHJ5IGNhbm5vdCBsZWFrIGFuIGVudHJ5IHBlciBhYmFuZG9uZWQgZGVsaXZlcnkuIFJldGlyZW1lbnQgZ29lc1xuICAvLyB0aHJvdWdoIHRoZSBjb250ZXh0J3Mgc2luZ2xlIG9yZGVyZWQgZGlzcGVuc2VyIHJhdGhlciB0aGFuIGEgcGVyLWJhcnJpZXJcbiAgLy8gaWRsZSBwb2xsIOKAlCBzZWUge0BsaW5rIGVuc3VyZUJhcnJpZXJTYWZldHlOZXR9IGZvciB3aHkgdGhlIE9SREVSIG9mIHRoZXNlXG4gIC8vIHJldGlyZW1lbnRzIGlzIGxvYWQtYmVhcmluZy5cbiAgZW5zdXJlQmFycmllclNhZmV0eU5ldChjdHgpO1xuXG4gIHJldHVybiB7XG4gICAgbWFya0RlbGl2ZXJlZDogZmluaXNoLFxuICAgIGFybTogKCkgPT4ge1xuICAgICAgZW50cnkuYXJtZWQgPSB0cnVlO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogQ29udGV4dHMgd2hvc2UgYmFycmllciBzYWZldHktbmV0IGRpc3BlbnNlciBpcyBjdXJyZW50bHkgYXJtZWQuIE1vZHVsZS1sZXZlbFxuICogc28gdGhlIGNvbnRleHQgaW50ZXJmYWNlIChjb25zdHJ1Y3RlZCBsaXRlcmFsbHkgYnkgbWFueSB0ZXN0IGhhcm5lc3NlcylcbiAqIG5lZWRzIG5vIG5ldyBmaWVsZDsgZW50cmllcyBkcm9wIHdpdGggdGhlIGNvbnRleHQuXG4gKi9cbmNvbnN0IGFjdGl2ZUJhcnJpZXJTYWZldHlOZXRzID0gbmV3IFdlYWtTZXQ8V29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0PigpO1xuXG4vKipcbiAqIFRoZSBiYXJyaWVyIHJlZ2lzdHJ5J3Mgc2FmZXR5IG5ldDogT05FIGlkbGUtZ2F0ZWQgZGlzcGVuc2VyIHBlciBjb250ZXh0IHRoYXRcbiAqIHJldGlyZXMsIGF0IGVhY2ggb2JzZXJ2YXRpb24gb2YgZGVsaXZlcnkgaWRsZSwgb25seSB0aGUgTE9XRVNULWluZGV4IGVudHJ5XG4gKiBzdGlsbCByZWdpc3RlcmVkLCB0aGVuIHlpZWxkcyBzbyB0aGUgY2hhaW4gaXQgcmVsZWFzZWQgY2FuIHJ1biBiZWZvcmUgdGhlXG4gKiBuZXh0IHJldGlyZW1lbnQgaXMgY29uc2lkZXJlZC5cbiAqXG4gKiBXaHkgb25lIG9yZGVyZWQgZGlzcGVuc2VyIGFuZCBub3QgYSBwb2xsIHBlciBiYXJyaWVyICh3aGljaCBpcyB3aGF0IHRoaXNcbiAqIHJlcGxhY2VkKTogdGhlIG9yZGVyIG9mIHNhZmV0eS1uZXQgcmV0aXJlbWVudHMgZGVjaWRlcyB0aGUgZGVsaXZlcnkgb3JkZXIgb2ZcbiAqIGV2ZXJ5IGNoYWluIHBhcmtlZCBiZWhpbmQgYW4gdW5jbGFpbWVkIGJ1ZmZlcmVkIGhvb2sgcGF5bG9hZCDigJQgYSBob29rIHRoZVxuICogd29ya2Zsb3cgbmV2ZXIgcmVhZHMgKGEgZmlyZS1hbmQtZm9yZ2V0IGBjcmVhdGVIb29rYCkgcGFya3MgZXZlcnkgbGF0ZXJcbiAqIGFybWVkIHdhaXQvaG9vayBiZWhpbmQgYSBiYXJyaWVyIHRoYXQgb25seSB0aGlzIG5ldCBjYW4gcmV0aXJlLiBQZXItYmFycmllclxuICogcG9sbHMgZmlyZSBpbiB3aGF0ZXZlciBvcmRlciB0aGVpciByZS1hcm0gY3ljbGVzIGxhbmQsIGFuZCBlYWNoIHJlLWFybVxuICogYXR0YWNoZXMgdG8gYSBgcHJvbWlzZVF1ZXVlYCB0aGF0IGdyb3dzIGJldHdlZW4gY2hlY2tzLCBzbyB3aXRoIHNldmVyYWxcbiAqIHBhcmtlZCBzZWdtZW50cyB0aGUgcmVsZWFzZSBvcmRlciBkZWNheXMgdG8gdGltaW5nIG5vaXNlLiBEcmF3cyAoYHVzZVN0ZXBgXG4gKiBjb3JyZWxhdGlvbiBpZHMpIHRoZW4gZGVwZW5kIG9uIHdoaWNoIHNlZ21lbnQgaGFwcGVuZWQgdG8gcmVsZWFzZSBmaXJzdCDigJRcbiAqIGNvbmNyZXRlbHksIG9uIGhvdyBNVUNIIGxvZyB0aGUgcmVwbGF5IGxvYWRlZCwgc2luY2UgdGhhdCBkZWNpZGVzIHdoYXQgaXMgaW5cbiAqIHRoZSByZWdpc3RyeS4gVGhhdCBpcyB0aGUgbWVjaGFuaXNtIGJlaGluZCBzbG90LW1vZGUgQ09SUlVQVEVEX0VWRU5UX0xPRyBvblxuICogc3Rvcm0tc2hhcGVkIHJ1bnMgKHNlZSBzdG9ybS1sb2ctcmVwbGF5LnRlc3QudHMsIGJ1aWx0IGZyb20gYSBwcm9kdWN0aW9uXG4gKiBsb2cpOiB0d28gcmVwbGF5cyBvZiB0aGUgc2FtZSBydW4gaG9sZGluZyBkaWZmZXJlbnQtbGVuZ3RoIHByZWZpeGVzIGJvdW5kXG4gKiB0aGUgc2FtZSBjb3JyZWxhdGlvbiBvcmRpbmFsIHRvIGRpZmZlcmVudCBzdGVwcy5cbiAqXG4gKiBSZXRpcmluZyBsb3dlc3QtZmlyc3QgaXMgbm90IG1lcmVseSB0aWR5LCBpdCBpcyB0aGUgb25seSBvcmRlciB0aGF0IGNhbm5vdFxuICogaW52ZXJ0IHRoZSBsb2c6IGV2ZXJ5IGdhdGUgcG9pbnRzIGZyb20gYSBoaWdoZXIgaW5kZXggdG8gYSBzdHJpY3RseSBsb3dlclxuICogb25lLCBzbyBhdCBkZWxpdmVyeSBpZGxlIHRoZSBsb3dlc3QgdW5kZWxpdmVyZWQgZW50cnkgZ2F0ZXMgb24gbm90aGluZ1xuICogc3RpbGwgcmVnaXN0ZXJlZCDigJQgaXQgaXMgdGhlIGhlYWQgb2YgZXZlcnkgcGFya2VkIGNoYWluIChpbiBwcmFjdGljZSwgdGhlXG4gKiB1bmNsYWltZWQgcGF5bG9hZCBpdHNlbGYpLiBSZWxlYXNpbmcgaXQgbGV0cyB0aGUgY2hhaW4gYWJvdmUgZGVsaXZlclxuICogdGhyb3VnaCB0aGUgb3JkaW5hcnkgYmFycmllciBvcmRlcjsgYW55dGhpbmcgdGhlIHJlbGVhc2Ugd2FrZXMgZmxpcHNcbiAqIHtAbGluayBoYXNQYXJrZWRDb21taXR0ZWREZWxpdmVyeX0gYmFjayB0byB0cnVlLCB3aGljaCByZS1ibG9ja3MgdGhpc1xuICogZGlzcGVuc2VyIHVudGlsIHRoZSBjaGFpbiBoYXMgZnVsbHkgZHJhaW5lZC4gQSBoaWdoZXIgZW50cnkgbXVzdCBuZXZlciBiZVxuICogcmV0aXJlZCB3aGlsZSBhIGxvd2VyIG9uZSBpcyByZWdpc3RlcmVkIOKAlCB0aGF0IGlzIGV4YWN0bHkgdGhlIGludmVyc2lvblxuICogZGVzY3JpYmVkIG9uIHtAbGluayBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzfS5cbiAqXG4gKiBUaGUgZGlzcGVuc2VyIGdvZXMgZG9ybWFudCB3aGVuIHRoZSByZWdpc3RyeSBlbXB0aWVzIGFuZCBpcyByZS1hcm1lZCBieSB0aGVcbiAqIG5leHQgcmVnaXN0cmF0aW9uLCBzbyBhbiBpZGxlIGNvbnRleHQgaG9sZHMgbm8gbGl2ZSB0aW1lci5cbiAqL1xuZnVuY3Rpb24gZW5zdXJlQmFycmllclNhZmV0eU5ldChjdHg6IFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dCk6IHZvaWQge1xuICBjb25zdCBiYXJyaWVycyA9IGN0eC5wZW5kaW5nRGVsaXZlcnlCYXJyaWVycztcbiAgaWYgKCFiYXJyaWVycyB8fCBhY3RpdmVCYXJyaWVyU2FmZXR5TmV0cy5oYXMoY3R4KSkge1xuICAgIHJldHVybjtcbiAgfVxuICBhY3RpdmVCYXJyaWVyU2FmZXR5TmV0cy5hZGQoY3R4KTtcbiAgY29uc3QgcmVhcm0gPSAoKSA9PiB7XG4gICAgc2V0VGltZW91dChjaGVjaywgMCk7XG4gIH07XG4gIC8vIEEgcmVqZWN0ZWQgcHJvbWlzZVF1ZXVlIHNldHRsZXMgaW1tZWRpYXRlbHkgYW5kIGZvcmV2ZXIsIHNvIHJlLWFybWluZ1xuICAvLyB0aHJvdWdoIGl0IGF0IHRoZSBub3JtYWwgY2FkZW5jZSB3b3VsZCBkZWdlbmVyYXRlIGludG8gYSBidXN5IGxvb3Agb24gYW5cbiAgLy8gYWJhbmRvbmVkIGNvbnRleHQuIEJhY2sgb2ZmIGluc3RlYWQ6IGNvcnJlY3RuZXNzIG9ubHkgbmVlZHMgdGhlIGRpc3BlbnNlclxuICAvLyB0byBzdGlsbCBleGlzdCwgc2luY2UgdGhlIHJlZ2lzdHJ5IGdhdGVzIHN1c3BlbnNpb24gdmlhIGlzRGVsaXZlcnlJZGxlXG4gIC8vIGFuZCBhIGRlYWQgZGlzcGVuc2VyIHdvdWxkIHdlZGdlIHRoZSBydW4uXG4gIGNvbnN0IHJlYXJtQWZ0ZXJSZWplY3Rpb24gPSAoKSA9PiB7XG4gICAgc2V0VGltZW91dChjaGVjaywgNTApO1xuICB9O1xuICBjb25zdCBjaGVjayA9ICgpID0+IHtcbiAgICBpZiAoYmFycmllcnMuc2l6ZSA9PT0gMCkge1xuICAgICAgLy8gRG9ybWFudC4gVGhlIG5leHQgcmVnaXN0ZXJEZWxpdmVyeUJhcnJpZXIgcmUtYXJtcy5cbiAgICAgIGFjdGl2ZUJhcnJpZXJTYWZldHlOZXRzLmRlbGV0ZShjdHgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWNhblJldGlyZUFiYW5kb25lZEJhcnJpZXJzKGN0eCkpIHtcbiAgICAgIC8vIEEgZGVsaXZlcnkgaXMgaHlkcmF0aW5nIG9yIGNvbW1pdHRlZC1idXQtcGFya2VkIG9uIGl0cyBkZWZlcnJhbDsgbGV0XG4gICAgICAvLyB0aGUgcXVldWUgZHJhaW4gYW5kIHJlLWNoZWNrIGEgdGljayBsYXRlciAoc2FtZSBjYWRlbmNlIGFzXG4gICAgICAvLyBzY2hlZHVsZVdoZW5JZGxlKS5cbiAgICAgIGN0eC5wcm9taXNlUXVldWUudGhlbihyZWFybSwgcmVhcm1BZnRlclJlamVjdGlvbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIElkbGUgd2l0aCBlbnRyaWVzIGxlZnQ6IG5vdGhpbmcgcmVtYWluaW5nIGRlbGl2ZXJzIG9uIGl0cyBvd24sIHNvXG4gICAgLy8gcmVsZWFzZSBwYXJrZWQgY2hhaW5zIGZyb20gdGhlIGhlYWQg4oCUIGxvd2VzdCBpbmRleCBmaXJzdCwgb25lIGF0IGFcbiAgICAvLyB0aW1lLCByZS1yZWFkaW5nIGlkbGUgYmV0d2VlbiByZXRpcmVtZW50cy4gQSByZXRpcmVtZW50IHRoYXQgd2FrZXMgYVxuICAgIC8vIGNoYWluIGZsaXBzIHtAbGluayBoYXNQYXJrZWRDb21taXR0ZWREZWxpdmVyeX0gc3luY2hyb25vdXNseSAoaXQgaXNcbiAgICAvLyBjb21wdXRlZCBmcm9tIHRoZSByZWdpc3RyeSB0aGlzIGxvb3AganVzdCBtdXRhdGVkKSwgd2hpY2ggc3RvcHMgdGhlXG4gICAgLy8gc3dlZXAgc28gdGhlIGNoYWluIGRlbGl2ZXJzIGJlZm9yZSBhbnl0aGluZyBhYm92ZSBpdCBpcyByZWxlYXNlZC4gQVxuICAgIC8vIHJldGlyZW1lbnQgdGhhdCB3YWtlcyBub3RoaW5nIChhIHN0YWxlIHBheWxvYWQgbm8gZGVsaXZlcnkgZ2F0ZXMgb24pXG4gICAgLy8ga2VlcHMgdGhlIHN3ZWVwIGdvaW5nLCBzbyBhIGJhY2tsb2cgb2YgdGhvc2UgZHJhaW5zIGluIE9ORSBpZGxlXG4gICAgLy8gb2JzZXJ2YXRpb24g4oCUIHBhY2luZyB0aGVtIG9uZSBwZXIgdGltZXIgdGljayB3b3VsZCBob2xkIGNvbnN1bWVkLWJ1dC1cbiAgICAvLyB1bmRlbGl2ZXJlZCBldmVudHMgaG9zdGFnZSBsb25nIGVub3VnaCB0byB0cmlwIHRoZSBldmVudHMgY29uc3VtZXInc1xuICAgIC8vIHVuY29uc3VtZWQtZXZlbnQgZGVhZGxpbmUgYW5kIGZhaWwgaGVhbHRoeSByZXBsYXlzLlxuICAgIHdoaWxlIChiYXJyaWVycy5zaXplID4gMCAmJiBjYW5SZXRpcmVBYmFuZG9uZWRCYXJyaWVycyhjdHgpKSB7XG4gICAgICBsZXQgbG93ZXN0SW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgIGxldCBsb3dlc3RFbnRyeTogRGVsaXZlcnlCYXJyaWVyRW50cnkgfCB1bmRlZmluZWQ7XG4gICAgICBmb3IgKGNvbnN0IFtpbmRleCwgZW50cnldIG9mIGJhcnJpZXJzKSB7XG4gICAgICAgIGlmIChsb3dlc3RJbmRleCA9PT0gdW5kZWZpbmVkIHx8IGluZGV4IDwgbG93ZXN0SW5kZXgpIHtcbiAgICAgICAgICBsb3dlc3RJbmRleCA9IGluZGV4O1xuICAgICAgICAgIGxvd2VzdEVudHJ5ID0gZW50cnk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxvd2VzdEVudHJ5Py5yZXRpcmUoKTtcbiAgICB9XG4gICAgc2V0VGltZW91dChjaGVjaywgMCk7XG4gIH07XG4gIHNldFRpbWVvdXQoY2hlY2ssIDApO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHNhZmV0eS1uZXQgZGlzcGVuc2VyIG1heSByZXRpcmUgYWJhbmRvbmVkIGJhcnJpZXJzIHJpZ2h0IG5vdzpcbiAqIG5vIGh5ZHJhdGlvbiBpbiBmbGlnaHQgYW5kIG5vIGNvbW1pdHRlZCBkZWxpdmVyeSBzdGlsbCB3b3JraW5nIHRocm91Z2ggaXRzXG4gKiBkZXRhY2hlZCBkZWZlcnJhbC4gVGhpcyBpcyBkZWxpYmVyYXRlbHkgV0VBS0VSIHRoYW4ge0BsaW5rIGlzRGVsaXZlcnlJZGxlfTpcbiAqIHRoZSBkaXNwZW5zZXIgaXMgd2hhdCBlbXB0aWVzIHRoZSByZWdpc3RyeSwgc28gZ2F0aW5nIGl0IG9uIHJlZ2lzdHJ5XG4gKiBlbXB0aW5lc3Mgd291bGQgZ2F0ZSBpdHMgb3duIHdvcmsuXG4gKi9cbmZ1bmN0aW9uIGNhblJldGlyZUFiYW5kb25lZEJhcnJpZXJzKGN0eDogV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0KTogYm9vbGVhbiB7XG4gIHJldHVybiBjdHgucGVuZGluZ0RlbGl2ZXJpZXMgPT09IDAgJiYgIWhhc1BhcmtlZENvbW1pdHRlZERlbGl2ZXJ5KGN0eCk7XG59XG5cbi8qKlxuICogV2hldGhlciBzb21lIHJlZ2lzdGVyZWQgYnJhbmNoLWRlY2lkaW5nIGRlbGl2ZXJ5IGlzIGdvaW5nIHRvIHJlYWNoIHRoZVxuICogd29ya2Zsb3cgd2l0aG91dCBhbnkgZnVydGhlciBoZWxwIChpdCBpcyBhcm1lZCBhbmQgbm90IHRyYW5zaXRpdmVseSBwYXJrZWRcbiAqIGJlaGluZCBhbiB1bmNsYWltZWQgYnVmZmVyZWQgcGF5bG9hZCDigJQgc2VlIHtAbGluayByZXNvbHZlc09uSXRzT3dufSkgYnV0XG4gKiBoYXMgbm90IGJlZW4gaGFuZGVkIG92ZXIgeWV0LlxuICpcbiAqIFRoaXMgaXMgdGhlIGRlbGl2ZXJ5IHN0YXRlIGBwZW5kaW5nRGVsaXZlcmllc2AgY2Fubm90IHNlZS4gVGhhdCBjb3VudGVyXG4gKiBjb3ZlcnMgdGhlIGh5ZHJhdGlvbiB3aW5kb3cgaW5zaWRlIGEgc2VyaWFsIGBwcm9taXNlUXVldWVgIHNsb3QgYW5kIGlzXG4gKiByZWxlYXNlZCB0aGVyZSwgd2hpbGUgdGhlIGRlbGl2ZXJ5J3MgYHJlc29sdmUoKWAgcnVucyBsYXRlciwgZnJvbSBhXG4gKiBkZXRhY2hlZCBjb250aW51YXRpb24gYmVoaW5kIHtAbGluayBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzfSDigJQgaW5jbHVkaW5nIGl0c1xuICogbWFjcm90YXNrIHlpZWxkIHdoZW5ldmVyIHRoZSBkZWxpdmVyeSBoYWQgdG8gZGVmZXIuIFJlcGxheWluZyBhIGJhdGNoIG9mIE5cbiAqIHBhcmFsbGVsIHN0ZXAgcmVzdWx0cyBjb25zdW1lZCBpbiBvbmUgZHJhaW4gd2luZG93IGxlYXZlcyBOLTEgb2YgdGhlbVxuICogcGFya2VkIG9uIHRoYXQgeWllbGQgd2l0aCBgcGVuZGluZ0RlbGl2ZXJpZXNgIGFscmVhZHkgYXQgMC4gQW4gaWRsZSBjaGVja1xuICogYXJtZWQgZHVyaW5nIHRoZSBzYW1lIHdpbmRvdyAoYSBwZW5kaW5nIGBzbGVlcCgpYCBhcm1zIG9uZSBvbiBldmVyeSByZXBsYXkpXG4gKiBjb3VsZCB0aGVuIG9ic2VydmUgXCJpZGxlXCIgbWlkLWRlZmVycmFsIGFuZCByYWlzZSBhIGBXb3JrZmxvd1N1c3BlbnNpb25gXG4gKiBCRUZPUkUgdGhlIHdvcmtmbG93J3Mgb3duIGNvbnRpbnVhdGlvbnMgcmFuIOKAlCBhIHN1c3BlbnNpb24gY2Fycnlpbmcgbm9uZSBvZlxuICogdGhlIGZvbGxvdy11cCB3b3JrIHRoZSBiYXRjaCB3YXMgYWJvdXQgdG8gY3JlYXRlLCB3aGljaCB0aGUgcnVudGltZVxuICogZHV0aWZ1bGx5IHNjaGVkdWxlcyBhcyBub3RoaW5nLCBsZWF2aW5nIHRoZSBydW4gZG9ybWFudCB1bnRpbCBhbiB1bnJlbGF0ZWRcbiAqIHRpbWVyIGZpcmVzICh2ZXJjZWwvd29ya2Zsb3cjMzE4MykuXG4gKlxuICogRGVsaXZlcmllcyB0aGF0IGRvIE5PVCByZXNvbHZlIG9uIHRoZWlyIG93biBtdXN0IGJlIGV4Y2x1ZGVkLCBub3QgZm9yXG4gKiBhY2N1cmFjeSBidXQgZm9yIHRlcm1pbmF0aW9uOiBhbiB1bmNsYWltZWQgYnVmZmVyZWQgaG9vayBwYXlsb2FkIGlzIHJldGlyZWRcbiAqIEJZIHRoZSBpZGxlIHNhZmV0eSBuZXQgaW4ge0BsaW5rIHJlZ2lzdGVyRGVsaXZlcnlCYXJyaWVyfSwgc28gY291bnRpbmcgaXRcbiAqIGhlcmUgd291bGQgZ2F0ZSBpdHMgb3duIHJldGlyZW1lbnQuIFRoYXQgcmVhc29uaW5nIGV4dGVuZHMgdG8gd2hhdGV2ZXIgaXNcbiAqIHBhcmtlZCBiZWhpbmQgc3VjaCBhIHBheWxvYWQg4oCUIGEgd2FpdCwgYW5kIGEgc3RlcCBnYXRpbmcgb24gdGhhdCB3YWl0IOKAlCBmb3JcbiAqIHRoZSBzYW1lIHJlYXNvbjogdGhlIHdob2xlIGNoYWluIG1vdmVzIG9ubHkgb25jZSB0aGUgbmV0IGZpcmVzLCBhbmQgaXRcbiAqIGNhbm5vdCBmaXJlIHdoaWxlIHRoZSBjaGFpbiBpcyBjb3VudGVkLiBTZWxmLXJlc29sdmluZyBkZWxpdmVyaWVzIGFsd2F5c1xuICogZGVsaXZlciBmcm9tIHRoZWlyIG93biBjaGFpbnMgKHNlZSB0aGUgSU5WQVJJQU5UIG9uXG4gKiB7QGxpbmsgcmVnaXN0ZXJEZWxpdmVyeUJhcnJpZXJ9KSBhbmQgbmV2ZXIgbmVlZCB0aGF0IG5ldCwgc28gd2FpdGluZyBvblxuICogdGhlbSBpcyBkZWFkbG9jay1mcmVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzUGFya2VkQ29tbWl0dGVkRGVsaXZlcnkoXG4gIGN0eDogV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0XG4pOiBib29sZWFuIHtcbiAgY29uc3QgYmFycmllcnMgPSBjdHgucGVuZGluZ0RlbGl2ZXJ5QmFycmllcnM7XG4gIGlmICghYmFycmllcnMgfHwgYmFycmllcnMuc2l6ZSA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvLyBTaGFyZWQgYWNyb3NzIHRoaXMgY2FsbCBvbmx5IOKAlCBzZWUgYHJlc29sdmVzT25JdHNPd25gLlxuICBjb25zdCBzZWxmUmVzb2x2aW5nID0gbmV3IE1hcDxudW1iZXIsIGJvb2xlYW4+KCk7XG4gIGZvciAoY29uc3QgW2luZGV4LCBlbnRyeV0gb2YgYmFycmllcnMpIHtcbiAgICBpZiAocmVzb2x2ZXNPbkl0c093bihiYXJyaWVycywgaW5kZXgsIGVudHJ5LCBzZWxmUmVzb2x2aW5nKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIG5vIGRhdGEgZGVsaXZlcnkgKHN0ZXAgcmVzdWx0LCBob29rIHBheWxvYWQpIGlzIGluIGZsaWdodCByaWdodCBub3cuXG4gKlxuICogXCJJbiBmbGlnaHRcIiBpcyB0d28gZGlzdGluY3Qgd2luZG93cywgZWFjaCB3aXRoIGl0cyBvd24gZ3VhcmQ6XG4gKiBgcGVuZGluZ0RlbGl2ZXJpZXMgPiAwYCBjb3ZlcnMgaHlkcmF0aW9uIGluc2lkZSB0aGUgc2VyaWFsIHF1ZXVlIHNsb3RzLCBhbmRcbiAqIHtAbGluayBoYXNQYXJrZWRDb21taXR0ZWREZWxpdmVyeX0gY292ZXJzIHRoZSBkZXRhY2hlZCBnYXAgYmV0d2VlbiBhIHNsb3RcbiAqIHJlbGVhc2luZyB0aGF0IGNvdW50ZXIgYW5kIHRoZSBkZWxpdmVyeSdzIGByZXNvbHZlKClgIGFjdHVhbGx5IHJ1bm5pbmcg4oCUXG4gKiBkZWxpYmVyYXRlbHkgb3V0c2lkZSBgcGVuZGluZ0RlbGl2ZXJpZXNgIChzZWUgc3RlcC50cyksIGFuZCBpbnZpc2libGUgdG8gaXQuXG4gKlxuICogQW55dGhpbmcgdGhhdCBkZWNpZGVzIGEgcmVwbGF5IGlzIG92ZXIsIG9yIHRoYXQgYSByZXBsYXkgd2VudCB3cm9uZywgaGFzIHRvXG4gKiBjb25zdWx0IHRoaXMgZmlyc3Q6IHdoaWxlIGl0IGlzIGZhbHNlIHRoZSB3b3JrZmxvdyBWTSBpcyBtaWQtcmVhY3Rpb24sIHNvXG4gKiB3aGF0IGl0IGhhcyBhbmQgaGFzIG5vdCBkb25lIHlldCBzYXlzIG5vdGhpbmcgYWJvdXQgdGhlIHJ1bi4gVHdvIGNhbGxlcnNcbiAqIHJlYWQgaXQsIGZvciB0aGUgdHdvIHN1Y2ggZGVjaXNpb25zOiB7QGxpbmsgc2NoZWR1bGVXaGVuSWRsZX0gZm9yIHRoZVxuICogc3VzcGVuc2lvbiwgYW5kIHRoZSBldmVudHMgY29uc3VtZXIncyB1bmNvbnN1bWVkLWV2ZW50IGNoZWNrIGZvciBkaXZlcmdlbmNlLlxuICpcbiAqIEEgbm9uLWVtcHR5IGJhcnJpZXIgcmVnaXN0cnkgY291bnRzIGFzIGluIGZsaWdodCwgZXZlbiB3aGVuIGV2ZXJ5IHJlbWFpbmluZ1xuICogZW50cnkgaXMgcGFya2VkIGJlaGluZCBhbiB1bmNsYWltZWQgYnVmZmVyZWQgcGF5bG9hZC4gVGhvc2UgZW50cmllcyBvbmx5XG4gKiBtb3ZlIHdoZW4gdGhlIHNhZmV0eS1uZXQgZGlzcGVuc2VyIHJldGlyZXMgdGhlbSAobG93ZXN0LWZpcnN0LCBzZWVcbiAqIHtAbGluayBlbnN1cmVCYXJyaWVyU2FmZXR5TmV0fSksIGFuZCB0aGUgZGVsaXZlcmllcyB0aGV5IHJlbGVhc2UgYXJlIHJlYWxcbiAqIHdvcmtmbG93IHJlYWN0aW9ucyDigJQgYSBzdXNwZW5zaW9uIHJhaXNlZCBiZWZvcmUgdGhleSBydW4gd291bGQgYmUgY29tcHV0ZWRcbiAqIGZyb20gYSBWTSB0aGF0IGhhcyBub3Qgc2VlbiB0aGVtLCBzY2hlZHVsaW5nIG5vbmUgb2YgdGhlaXIgZm9sbG93LXVwIHdvcmtcbiAqIGFuZCBsZWF2aW5nIHRoZSBydW4gZG9ybWFudCAodGhlIHZlcmNlbC93b3JrZmxvdyMzMTgzIHNoYXBlKS4gVGhlIGRpc3BlbnNlclxuICogaXRzZWxmIGlzIGdhdGVkIG9uIHtAbGluayBjYW5SZXRpcmVBYmFuZG9uZWRCYXJyaWVyc30sIHRoZSB3ZWFrZXIgcHJlZGljYXRlXG4gKiB3aXRob3V0IHRoZSByZWdpc3RyeSB0ZXJtLCBwcmVjaXNlbHkgc28gaXQgY2FuIGRvIHRoZSBkcmFpbmluZyB0aGF0IHRoaXNcbiAqIHByZWRpY2F0ZSB3YWl0cyBmb3I7IHJlZ2lzdHJ5IHNpemUgc3RyaWN0bHkgZGVjcmVhc2VzIGF0IGVhY2ggcmV0aXJlbWVudCxcbiAqIHNvIGlkbGUgaXMgYWx3YXlzIHJlYWNoZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RlbGl2ZXJ5SWRsZShjdHg6IFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGN0eC5wZW5kaW5nRGVsaXZlcmllcyA9PT0gMCAmJlxuICAgICghY3R4LnBlbmRpbmdEZWxpdmVyeUJhcnJpZXJzIHx8IGN0eC5wZW5kaW5nRGVsaXZlcnlCYXJyaWVycy5zaXplID09PSAwKVxuICApO1xufVxuXG4vKipcbiAqIFNjaGVkdWxlIGEgY2FsbGJhY2sgdG8gZmlyZSBvbmx5IGFmdGVyIGFsbCBwZW5kaW5nIGRhdGEgZGVsaXZlcmllc1xuICogKHN0ZXAgcmVzdWx0cywgaG9vayBwYXlsb2FkcykgYW5kIGFzeW5jIGRlc2VyaWFsaXphdGlvbiBoYXZlIGNvbXBsZXRlZC5cbiAqIFVzZXMgYSBwb2xsaW5nIGxvb3A6IHNldFRpbWVvdXQoMCkg4oaSIGNoZWNrIHBlbmRpbmdEZWxpdmVyaWVzIGFuZCB0aGVcbiAqIGJhcnJpZXIgcmVnaXN0cnkg4oaSIGlmIGFueXRoaW5nIGlzIHN0aWxsIGluIGZsaWdodCwgd2FpdCBmb3IgcHJvbWlzZVF1ZXVlIOKGklxuICogcmVwZWF0LiBUaGlzIGhhbmRsZXMgdGhlIG11bHRpLXJvdW5kIGRlbGl2ZXJ5IHBhdHRlcm4gd2hlcmUgZWFjaCBob29rXG4gKiBwYXlsb2FkIGRlbGl2ZXJ5IGN5Y2xlIGFwcGVuZHMgbmV3IGFzeW5jIHdvcmsgdG8gdGhlIHByb21pc2VRdWV1ZS4gV2hhdFxuICogY291bnRzIGFzIGluIGZsaWdodCBpcyB7QGxpbmsgaXNEZWxpdmVyeUlkbGV9LlxuICpcbiAqIFRoZSBpbml0aWFsIGBzZXRUaW1lb3V0KDApYCBtYWNyb3Rhc2sgaXMgbG9hZC1iZWFyaW5nIGFuZCBtdXN0IE5PVCBiZVxuICogZG93bmdyYWRlZCB0byBhIG1pY3JvdGFzayAoYHF1ZXVlTWljcm90YXNrYC9gUHJvbWlzZS5yZXNvbHZlKCkudGhlbmApLlxuICogYHBlbmRpbmdEZWxpdmVyaWVzYCBvbmx5IGd1YXJkcyB0aGUgaG9zdC1zaWRlIGh5ZHJhdGlvbiB3aW5kb3c7IGJldHdlZW4gYVxuICogZGVsaXZlcnkncyBgcmVzb2x2ZSgpYCBhbmQgdGhlIHdvcmtmbG93IFZNIGJvZHkgcnVubmluZyBpdHMgY29udGludWF0aW9uIHRvXG4gKiByZWdpc3RlciB0aGUgbmV4dCBzdWJzY3JpYmVyLCBgcGVuZGluZ0RlbGl2ZXJpZXNgIGlzIGFscmVhZHkgMCBldmVuIHRob3VnaFxuICogdGhlIFZNIGlzIG1pZC1yZWFjdGlvbi4gTm9kZSBkb2VzIG5vdCBndWFyYW50ZWUgYSBtaWNyb3Rhc2sgc2NoZWR1bGVkIGluXG4gKiB0aGUgaG9zdCBjb250ZXh0IHNldHRsZXMgYWZ0ZXIgdGhlIGNyb3NzLVZNIHByb21pc2UgY2hhaW4gKHJlc29sdmUgaW4gaG9zdFxuICog4oaSIHdvcmtmbG93IGNvZGUgaW4gVk0g4oaSIHN1YnNjcmliZSBiYWNrIGluIGhvc3QpOyB0aGUgbWFjcm90YXNrIGJvdW5kYXJ5XG4gKiBnaXZlcyB0aGF0IGNoYWluIHRpbWUgdG8gcnVuLCBzbyB0aGUgc3VzcGVuc2lvbiBkb2VzIG5vdCBwcmVlbXB0IGEgc2libGluZ1xuICogZGVsaXZlcnkgc3RpbGwgaW4gZmxpZ2h0LiBFbXBpcmljYWxseSwgcmVwbGFjaW5nIGl0IHdpdGggYHF1ZXVlTWljcm90YXNrYFxuICogYnJlYWtzIGhvb2svc2xlZXAgYFByb21pc2UucmFjZWAgb3JkZXJpbmcgKENvcnJ1cHRlZEV2ZW50TG9nRXJyb3IpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2NoZWR1bGVXaGVuSWRsZShcbiAgY3R4OiBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQsXG4gIGZuOiAoKSA9PiB2b2lkXG4pOiB2b2lkIHtcbiAgY29uc3QgY2hlY2sgPSAoKSA9PiB7XG4gICAgaWYgKCFpc0RlbGl2ZXJ5SWRsZShjdHgpKSB7XG4gICAgICAvLyBBIGRlbGl2ZXJ5IGlzIHN0aWxsIGh5ZHJhdGluZywgb3IgaXMgY29tbWl0dGVkIGJ1dCBwYXJrZWQgYmVoaW5kIGl0c1xuICAgICAgLy8gZGVmZXJyYWwgKHdob3NlIHJlc29sdmUgcnVucyBvbiBhIGRldGFjaGVkIHRpbWVyLCBub3QgdGhpcyBxdWV1ZSkuXG4gICAgICAvLyBFaXRoZXIgd2F5OiBsZXQgdGhlIHF1ZXVlIGRyYWluLCB0aGVuIHJlLWNoZWNrIGEgdGltZXIgdGljayBsYXRlci5cbiAgICAgIGN0eC5wcm9taXNlUXVldWUudGhlbigoKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoY2hlY2ssIDApO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZuKCk7XG4gICAgfVxuICB9O1xuICBzZXRUaW1lb3V0KGNoZWNrLCAwKTtcbn1cbiJdfQ==
@@ -120,6 +120,33 @@ export declare const MAX_RESILIENT_STEP_INPUT_BYTES: number;
120
120
  * latency the parallel publish saves.
121
121
  */
122
122
  export declare function isResilientStepDispatchEnabled(): boolean;
123
+ /**
124
+ * Whether batched event transitions are enabled: the suspension handler folds
125
+ * a clean fan-out's `step_created` + `wait_created` writes into one
126
+ * `world.events.createBatch` call (one durable write, per-event outcomes)
127
+ * instead of one write per event. Only engages when the World implements the
128
+ * optional `events.createBatch` AND the run is on slot identity
129
+ * (specVersion >= 6) AND the suspension carries no attribute/hook writes and
130
+ * no resilient step dispatch — everything else keeps the single-event path
131
+ * byte-for-byte.
132
+ *
133
+ * Reads `process.env.WORKFLOW_BATCH_TRANSITIONS` lazily. Default **ON**;
134
+ * disabled only by an explicit `'0'` / `'false'` (case-insensitive) — the
135
+ * operator escape hatch that restores the exact prior one-write-per-event
136
+ * path, mirroring `WORKFLOW_TURBO`'s kill-switch shape.
137
+ */
138
+ export declare function isBatchTransitionsEnabled(): boolean;
139
+ /**
140
+ * Ceiling on events per `createBatch` call from the batched fan-out fold.
141
+ * Mirrors the server's transaction budgets with a comfortable margin: each
142
+ * fan-out event costs 2 transaction items server-side (entity + event row)
143
+ * against the 100-item DynamoDB cap, and inline payloads count against a
144
+ * 768 KB byte budget — 32 events stays well under both, and a fan-out larger
145
+ * than this simply commits in successive batches (split batches lose
146
+ * cross-batch atomicity, which is exactly today's per-event-write crash
147
+ * surface — every batch still converges on retry via per-event 409s).
148
+ */
149
+ export declare const MAX_BATCH_FANOUT_EVENTS = 32;
123
150
  /**
124
151
  * Optional client-side override for the server-supplied per-run event ceiling.
125
152
  * When set to a positive integer, the runtime clamps the server's limit *down*
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/runtime/constants.ts"],"names":[],"mappings":"AAqBA,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAW9C;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,iBAAiB,SAAU,CAAC;AAEzC,2DAA2D;AAC3D,eAAO,MAAM,qBAAqB,QAAS,CAAC;AAE5C;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,SAAU,CAAC;AAgB7C;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CA6B3C;AAED;;;;;GAKG;AACH,wBAAgB,oCAAoC,IAAI,IAAI,CAE3D;AAMD,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAE5C;;;GAGG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,CAMnD;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC,8EAA8E;AAC9E,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC;;;GAGG;AACH,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAKvC;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CA2B1C;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,8BAA8B,QAAa,CAAC;AAEzD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,8BAA8B,IAAI,OAAO,CAExD;AAID;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,SAAS,CAezD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,8BAA8B,IAAI,OAAO,CAIxD;AAED;;;;;;;;GAQG;AACH,wBAAgB,yCAAyC,IAAI,OAAO,CAInE;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAIxC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gCAAgC,IAAI,OAAO,CAI1D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAI9C;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,IAAI,OAAO,CAIlD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAElD;;;;GAIG;AACH,eAAO,MAAM,kCAAkC,MAAM,CAAC;AAEtD;;;;;GAKG;AACH,wBAAgB,8BAA8B,IAAI,MAAM,CAMvD;AAKD,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAE/C;;;GAGG;AACH,wBAAgB,6BAA6B,IAAI,MAAM,CAMtD;AAQD,eAAO,MAAM,mCAAmC,IAAI,CAAC;AAErD;;;GAGG;AACH,wBAAgB,mCAAmC,IAAI,MAAM,CAM5D;AASD,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAEhD;;;GAGG;AACH,wBAAgB,+BAA+B,IAAI,MAAM,CAMxD;AAMD,eAAO,MAAM,mCAAmC,IAAI,CAAC;AAErD;;;GAGG;AACH,wBAAgB,mCAAmC,IAAI,MAAM,CAM5D;AAKD,eAAO,MAAM,+BAA+B,IAAI,CAAC;AAEjD;;;;GAIG;AACH,wBAAgB,+BAA+B,IAAI,MAAM,CAMxD"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/runtime/constants.ts"],"names":[],"mappings":"AAqBA,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAW9C;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,iBAAiB,SAAU,CAAC;AAEzC,2DAA2D;AAC3D,eAAO,MAAM,qBAAqB,QAAS,CAAC;AAE5C;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,SAAU,CAAC;AAgB7C;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CA6B3C;AAED;;;;;GAKG;AACH,wBAAgB,oCAAoC,IAAI,IAAI,CAE3D;AAMD,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAE5C;;;GAGG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,CAMnD;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC,8EAA8E;AAC9E,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC;;;GAGG;AACH,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAKvC;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CA2B1C;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,8BAA8B,QAAa,CAAC;AAEzD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,8BAA8B,IAAI,OAAO,CAExD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,yBAAyB,IAAI,OAAO,CAInD;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAI1C;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,SAAS,CAezD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,8BAA8B,IAAI,OAAO,CAIxD;AAED;;;;;;;;GAQG;AACH,wBAAgB,yCAAyC,IAAI,OAAO,CAInE;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAIxC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gCAAgC,IAAI,OAAO,CAI1D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAI9C;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,IAAI,OAAO,CAIlD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAElD;;;;GAIG;AACH,eAAO,MAAM,kCAAkC,MAAM,CAAC;AAEtD;;;;;GAKG;AACH,wBAAgB,8BAA8B,IAAI,MAAM,CAMvD;AAKD,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAE/C;;;GAGG;AACH,wBAAgB,6BAA6B,IAAI,MAAM,CAMtD;AAQD,eAAO,MAAM,mCAAmC,IAAI,CAAC;AAErD;;;GAGG;AACH,wBAAgB,mCAAmC,IAAI,MAAM,CAM5D;AASD,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAEhD;;;GAGG;AACH,wBAAgB,+BAA+B,IAAI,MAAM,CAMxD;AAMD,eAAO,MAAM,mCAAmC,IAAI,CAAC;AAErD;;;GAGG;AACH,wBAAgB,mCAAmC,IAAI,MAAM,CAM5D;AAKD,eAAO,MAAM,+BAA+B,IAAI,CAAC;AAEjD;;;;GAIG;AACH,wBAAgB,+BAA+B,IAAI,MAAM,CAMxD"}