footprintjs 10.6.0 → 10.7.0

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 (54) hide show
  1. package/CLAUDE.md +2 -1
  2. package/dist/esm/index.d.ts +12 -2
  3. package/dist/esm/index.js +5 -3
  4. package/dist/esm/lib/attempt/backoff.d.ts +96 -0
  5. package/dist/esm/lib/attempt/backoff.js +173 -0
  6. package/dist/esm/lib/attempt/deadline.d.ts +0 -5
  7. package/dist/esm/lib/attempt/deadline.js +2 -27
  8. package/dist/esm/lib/attempt/index.d.ts +6 -4
  9. package/dist/esm/lib/attempt/index.js +6 -5
  10. package/dist/esm/lib/attempt/runner.js +3 -2
  11. package/dist/esm/lib/detach/drivers/setTimeout.d.ts +4 -2
  12. package/dist/esm/lib/detach/drivers/setTimeout.js +12 -2
  13. package/dist/esm/lib/detach/flush.d.ts +6 -1
  14. package/dist/esm/lib/detach/flush.js +8 -6
  15. package/dist/esm/lib/observer-queue/deferredDispatcher.d.ts +8 -1
  16. package/dist/esm/lib/observer-queue/deferredDispatcher.js +13 -6
  17. package/dist/esm/lib/recorder/AttemptRecorder.js +8 -9
  18. package/dist/esm/lib/runner/FlowChartExecutor.d.ts +7 -2
  19. package/dist/esm/lib/runner/FlowChartExecutor.js +8 -3
  20. package/dist/esm/lib/runner/captureHistory.js +6 -4
  21. package/dist/esm/lib/runner/deadline.js +3 -2
  22. package/dist/esm/lib/runner/recordSink.d.ts +2 -1
  23. package/dist/esm/lib/runner/recordSink.js +12 -7
  24. package/dist/esm/lib/sinks/fileSink.js +7 -6
  25. package/dist/esm/lib/sinks/indexedIO.js +5 -3
  26. package/dist/esm/lib/timers/longTimeout.d.ts +37 -0
  27. package/dist/esm/lib/timers/longTimeout.js +56 -0
  28. package/dist/index.js +8 -3
  29. package/dist/lib/attempt/backoff.js +178 -0
  30. package/dist/lib/attempt/deadline.js +4 -30
  31. package/dist/lib/attempt/index.js +9 -6
  32. package/dist/lib/attempt/runner.js +4 -3
  33. package/dist/lib/detach/drivers/setTimeout.js +12 -2
  34. package/dist/lib/detach/flush.js +8 -6
  35. package/dist/lib/observer-queue/deferredDispatcher.js +13 -6
  36. package/dist/lib/recorder/AttemptRecorder.js +8 -9
  37. package/dist/lib/runner/FlowChartExecutor.js +8 -3
  38. package/dist/lib/runner/captureHistory.js +6 -4
  39. package/dist/lib/runner/deadline.js +3 -2
  40. package/dist/lib/runner/recordSink.js +12 -7
  41. package/dist/lib/sinks/fileSink.js +7 -6
  42. package/dist/lib/sinks/indexedIO.js +5 -3
  43. package/dist/lib/timers/longTimeout.js +60 -0
  44. package/dist/types/index.d.ts +12 -2
  45. package/dist/types/lib/attempt/backoff.d.ts +96 -0
  46. package/dist/types/lib/attempt/deadline.d.ts +0 -5
  47. package/dist/types/lib/attempt/index.d.ts +6 -4
  48. package/dist/types/lib/detach/drivers/setTimeout.d.ts +4 -2
  49. package/dist/types/lib/detach/flush.d.ts +6 -1
  50. package/dist/types/lib/observer-queue/deferredDispatcher.d.ts +8 -1
  51. package/dist/types/lib/runner/FlowChartExecutor.d.ts +7 -2
  52. package/dist/types/lib/runner/recordSink.d.ts +2 -1
  53. package/dist/types/lib/timers/longTimeout.d.ts +37 -0
  54. package/package.json +2 -2
package/CLAUDE.md CHANGED
@@ -18,7 +18,8 @@ Entry points: `footprintjs` (engine API), `/recorders`, `/trace` (engine recorde
18
18
  | reactive/ | TypedScope deep Proxy over the facade — four write laws + the honest boundary (what `find`/`for…of` hands back is raw and WARNED ABOUT in dev mode, not intercepted; a proxy held past its stage IS refused — `ScopeFacade` · `assertLive`); handles.ts = the registry of every proxy the factories built → the value behind it, asked wherever an app value enters the record (the set traps since 9.24.0 — no JSON round-trip any more; fan-out `resolveItems`, subflow in/out mappers, `$setValue`/`$update`/`$batchArray` since 9.23.3, after a fan-out over object items seeded the handle and lost every child); see src/lib/reactive/README.md |
19
19
  | decide/ | decide()/select() evidence capture |
20
20
  | filter/ | `evaluator.ts · evaluateFilter` — the ONE filter-rule law, shared by decide() and the attempt rule table; its own leaf module since P2 (10.1), because in decide/ it made attempt/ reach scope/ and `scope.$call` closed an attempt ⇄ decide ⇄ scope module cycle |
21
- | attempt/ | the ONE retry loop and its record (10.1, docs/design/2026-10-time-and-failure-evidence.md): `runner.ts · runAttempts` runs a policy and makes one frozen `AttemptRecord` per try (timing, outcome, category, the retry-or-stop decision as `DecisionEvidence`) + an `AttemptSummary`; `decision.ts · retryRules` = the one rule table as `decide()` rules (first match, labels ARE the reasons) + `decideAttempt`, decide()'s evaluation without a scope (filter rows from `filter/evaluator`; a property test pins equal evidence); `category.ts · errorCategory` = the one classifier (seven fixed values); `errors.ts`, `anySignal.ts`. L5 beside decide/, but `types.ts` (with `decide/types.ts`) is an L0 leaf because `StageSnapshot` (L4) names it. `RetryPolicy` is declared here, re-exported by engine/types.ts |
21
+ | attempt/ | the ONE retry loop and its record (10.1, docs/design/2026-10-time-and-failure-evidence.md): `runner.ts · runAttempts` runs a policy and makes one frozen `AttemptRecord` per try (timing, outcome, category, the retry-or-stop decision as `DecisionEvidence`) + an `AttemptSummary`; `decision.ts · retryRules` = the one rule table as `decide()` rules (first match, labels ARE the reasons) + `decideAttempt`, decide()'s evaluation without a scope (filter rows from `filter/evaluator`; a property test pins equal evidence); `category.ts · errorCategory` = the one classifier (seven fixed values); `errors.ts`, `anySignal.ts`; `backoff.ts · exponentialBackoff` / `statedWaitFirst` build the function `RetryPolicy.backoffMs` takes (exponential ceiling, `'none'`/`'equal'`/`'full'` jitter from an injectable `random`, a stated wait first — the cap stays `maxBackoffMs`, so the budget still counts it). L5 beside decide/, but `types.ts` (with `decide/types.ts`) is an L0 leaf because `StageSnapshot` (L4) names it. `RetryPolicy` is declared here, re-exported by engine/types.ts |
22
+ | timers/ | the ONE long-timer law, a neutral L0 leaf folder (like `ids/`): `longTimeout.ts · setLongTimeout(fn, ms, { unref? })` — `Infinity` arms no timer; a delay past 2^31 − 1 ms is waited in chunks, never 1 ms; anything not a number > 0 is due at once. Every caller-supplied wait in `src/` arms it (the runner's caps, waits and deadline, the observer queue's `drain` at L1, `flushAllDetached`, `flushRecord`, the file sink, the indexed reader, the `attempts()` recorder, capture history, the `setTimeout` detach driver). `test/architecture/timer-law.test.ts` refuses, outside it: a raw `setTimeout` / `setInterval` whose delay is not a literal a host timer holds (or a constant on its named allow-list), any indirect reach of one (alias, `globalThis['setTimeout']`, `.call`, destructuring, `Reflect.apply`), a `timers` / `timers/promises` import, `scheduler.wait`, and `AbortSignal.timeout` past 2^31 − 1 or non-literal; see src/lib/timers/README.md |
22
23
  | recorder/ | engine stores (KeyedStore/SequenceStore/BoundaryStateStore), CombinedRecorder routing, and built-in Topology/InOut/ControlDep/Quality recorders. `CommitRangeIndex` is owned and exported by foottrace. `attemptSeries.ts` = the ONE predicate every built-in recorder uses for attempt rows (P1c, 10.1: a series that RETRIED, GAVE UP or TIMED OUT; a first-time success adds no row anywhere, so no-retry runs stay byte-identical) — it lives here, not in attempt/, because a recorder → attempt runtime edge closes the attempt⇄decide⇄recorder⇄scope module cycle. Quality/Debug see `onAttempt` only through `attachCombinedRecorder` |
23
24
  | pause/ | PauseSignal / FlowchartCheckpoint types + `interrupt(scope, payload)` (throws InterruptSignal; converted to PauseSignal at the StageRunner boundary, `pausedBy:'interrupt'`) |
24
25
  | engine/ | FlowchartTraverser + handlers/; narrative/ = the whole FlowRecorder channel (dispatcher + 9 strategies), not just text; `lib/ids/branchSegment.ts` (moved to the `ids/` leaf in 9.37.0) = the ONE owner of the generated-segment grammar (`<stageId>~<index>`, marker `~` RESERVED); `executeStage` (:720) = the ONE funnel every stage fn passes through — and therefore the ONE owner of the declarative `retry` loop; `handlers/ResumeEntry.ts` = the ONE owner of a resume's ONE-SHOT re-entry (M2, 9.28.0: start + one hop per subflow on the pause path, each level's dispatcher continuation read from the chart, waiting sibling pauses queued at their fan-out) |
@@ -75,9 +75,19 @@ export type { AttemptOutcomeCounts, AttemptRef } from './lib/recorder/attemptSer
75
75
  *
76
76
  * `attempt()` — the attempt runner for code that is not a stage (records go to its `onAttempt`); `errorCategory`
77
77
  * — the one failure classifier (seven fixed categories); `retryRules` — the one retry rule table, as `decide()`
78
- * rules; the attempt contract's two errors.
78
+ * rules; the attempt contract's two errors; `exponentialBackoff` / `statedWaitFirst` — deterministic builders of
79
+ * the function a `RetryPolicy.backoffMs` takes (`BackoffSpec.maxDelayMs` caps the schedule before the jitter draw; the
80
+ * policy's `maxBackoffMs` still caps every wait after it).
79
81
  */
80
- export { attempt, AttemptTimeoutError, errorCategory, retryRules, UnknownEffectError } from './lib/attempt/index.js';
82
+ export { attempt, AttemptTimeoutError, errorCategory, exponentialBackoff, retryRules, statedWaitFirst, UnknownEffectError, } from './lib/attempt/index.js';
83
+ /**
84
+ * @category Attempts
85
+ *
86
+ * What the backoff builders take and build: an exponential schedule (`BackoffSpec`, its `BackoffJitter`), the
87
+ * `RetryPolicy.backoffMs` function they return (`BackoffFunction`), and the reader of a stated wait
88
+ * (`StatedWaitReader` — a parsed `Retry-After`, in milliseconds).
89
+ */
90
+ export type { BackoffFunction, BackoffJitter, BackoffSpec, StatedWaitReader } from './lib/attempt/index.js';
81
91
  /**
82
92
  * @category Correlation
83
93
  *
package/dist/esm/index.js CHANGED
@@ -27,9 +27,11 @@ export { decide, select } from './lib/decide/index.js';
27
27
  *
28
28
  * `attempt()` — the attempt runner for code that is not a stage (records go to its `onAttempt`); `errorCategory`
29
29
  * — the one failure classifier (seven fixed categories); `retryRules` — the one retry rule table, as `decide()`
30
- * rules; the attempt contract's two errors.
30
+ * rules; the attempt contract's two errors; `exponentialBackoff` / `statedWaitFirst` — deterministic builders of
31
+ * the function a `RetryPolicy.backoffMs` takes (`BackoffSpec.maxDelayMs` caps the schedule before the jitter draw; the
32
+ * policy's `maxBackoffMs` still caps every wait after it).
31
33
  */
32
- export { attempt, AttemptTimeoutError, errorCategory, retryRules, UnknownEffectError } from './lib/attempt/index.js';
34
+ export { attempt, AttemptTimeoutError, errorCategory, exponentialBackoff, retryRules, statedWaitFirst, UnknownEffectError, } from './lib/attempt/index.js';
33
35
  export { formatTraceparent, parseTraceparent, TraceparentError } from './lib/attempt/index.js';
34
36
  /** @category Run */
35
37
  export { RecordSinkError } from './lib/runner/index.js';
@@ -95,4 +97,4 @@ export { extractErrorInfo, formatErrorInfo } from './lib/engine/index.js';
95
97
  */
96
98
  export { disableDevMode, enableDevMode, isDevMode } from './lib/devMode.js';
97
99
  export { stringifySnapshot } from './lib/runner/stringifySnapshot.js';
98
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFTSCw0QkFBNEI7QUFDNUIsT0FBTyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBc0N4RixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFRbkQsNEJBQTRCO0FBQzVCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQW9CM0MsbUNBQW1DO0FBQ25DLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFpRHZEOzs7Ozs7R0FNRztBQUNILE9BQU8sRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBV3JILE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBZ0MvRixvQkFBb0I7QUFDcEIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBUXhELG9CQUFvQjtBQUNwQixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxvQkFBb0I7QUFDcEIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBcUJuRCwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXRELCtCQUErQjtBQUMvQixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFckQsb0NBQW9DO0FBQ3BDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBbUM1RCxxRUFBcUU7QUFDckUsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixzQkFBc0IsRUFDdEIsa0JBQWtCLEVBQ2xCLFdBQVcsR0FDWixNQUFNLHlCQUF5QixDQUFDO0FBa0RqQywrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFLOUQsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTdELCtCQUErQjtBQUMvQixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUV0RSwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFdkUsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXpFLCtCQUErQjtBQUMvQixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVqRSwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFdEUsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXBFLCtCQUErQjtBQUMvQixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQW1CdEUsdUNBQXVDO0FBQ3ZDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTdFLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUsK0VBQStFO0FBRS9FLDhCQUE4QjtBQUM5QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQTBCNUQsNkJBQTZCO0FBQzdCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQWdFakQsc0NBQXNDO0FBQ3RDLE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTNFLHNDQUFzQztBQUN0QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUscUJBQXFCLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFTckcsZ0NBQWdDO0FBQ2hDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRSwrRUFBK0U7QUFDL0UsaURBQWlEO0FBQ2pELCtFQUErRTtBQUUvRTs7Ozs7Ozs7Ozs7R0FXRztBQUNILE9BQU8sRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBMEI1RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRm9vdFByaW50IOKAlCBQdWJsaWMgQVBJICh2MylcbiAqXG4gKiBUaGUgZmxvd2NoYXJ0IHBhdHRlcm4gZm9yIGJhY2tlbmQgY29kZS5cbiAqIEJ1aWxkIOKGkiBSdW4g4oaSIE9ic2VydmUuXG4gKlxuICogKipUaGUgY29tbW9uIGltcG9ydCBwYXRoczoqKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IGZsb3dDaGFydCwgZGVjaWRlLCBuYXJyYXRpdmUgfSBmcm9tICdmb290cHJpbnRqcyc7ICAgICAgICAgICAvLyBtYWluIOKAlCBzdGFydCBoZXJlXG4gKiBpbXBvcnQgeyBtZXRyaWNzLCBkZWJ1ZywgbWFuaWZlc3QgfSAgICAgZnJvbSAnZm9vdHByaW50anMvcmVjb3JkZXJzJzsgLy8gcmVjb3JkZXIgZmFjdG9yaWVzXG4gKiBpbXBvcnQgeyBzdGF0ZUF0LCBjYXVzYWxDaGFpbiB9IGZyb20gJ2Zvb3R0cmFjZSc7ICAgICAvLyByZWFkIGEgZmluaXNoZWQgcnVuXG4gKiBpbXBvcnQgeyBSZWNvcmRGcmFtZSwgRXZlbnRMb2cgfSBmcm9tICdmb290dHJhY2Uvd3JpdGUnOyAgICAgLy8gd3JpdGUgYSByZWNvcmQgeW91cnNlbGZcbiAqIGltcG9ydCB7IFN0YWdlQ29udGV4dCB9ICAgICAgICAgICAgICAgICBmcm9tICdmb290cHJpbnRqcy9hZHZhbmNlZCc7ICAvLyBlbmdpbmUgaW50ZXJuYWxzXG4gKiBgYGBcbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUXVpY2sgU3RhcnQg4oCUIEV2ZXJ5dGhpbmcgeW91IG5lZWQgZm9yIDkwJSBvZiB1c2UgY2FzZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBRdWljayBTdGFydCAqL1xuZXhwb3J0IHR5cGUgeyBGbG93Q2hhcnQsIFN0YWdlRnVuY3Rpb24gYXMgU3RhZ2VIYW5kbGVyLCBTdHJlYW1IYW5kbGVycyB9IGZyb20gJy4vbGliL2J1aWxkZXIvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFF1aWNrIFN0YXJ0ICovXG5leHBvcnQgeyBmbG93Q2hhcnQsIEZsb3dDaGFydEJ1aWxkZXIsIGZsb3dDaGFydFNlbGVjdG9yIH0gZnJvbSAnLi9saWIvYnVpbGRlci9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IFF1aWNrIFN0YXJ0XG4gKlxuICogQ29uZmlnIGZvciBgLmFkZFBhcmFsbGVsRm9yRWFjaCgpYCDigJQgb25lIGJyYW5jaCBwZXIgaXRlbSwgYnJhbmNoIGNvdW50XG4gKiBkZWNpZGVkIGF0IHJ1biB0aW1lIGZyb20gdGhlIHBheWxvYWQuIGBtYXhCcmFuY2hlc2AgYW5kIGBpbnRvYCBhcmUgcmVxdWlyZWRcbiAqIG9uIHB1cnBvc2UgKHNlZSBkb2NzL2Rlc2lnbi9leGVjdXRpb24tY29udHJvbC5tZCkuXG4gKi9cbmV4cG9ydCB0eXBlIHsgQnJhbmNoQ2hhcnQsIFBhcmFsbGVsRm9yRWFjaENvbmZpZywgUmV0cnlQb2xpY3kgfSBmcm9tICcuL2xpYi9idWlsZGVyL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBRdWljayBTdGFydCDigJQgYnVpbGQtdGltZSBvYnNlcnZlciAodHdpbiBvZiBGbG93UmVjb3JkZXIpICovXG5leHBvcnQgdHlwZSB7XG4gIFN0cnVjdHVyZURlY2lkZXJDb21wbGV0ZUV2ZW50LFxuICBTdHJ1Y3R1cmVFZGdlQWRkZWRFdmVudCxcbiAgU3RydWN0dXJlRWRnZUtpbmQsXG4gIFN0cnVjdHVyZUxvb3BFZGdlQWRkZWRFdmVudCxcbiAgU3RydWN0dXJlUmVjb3JkZXIsXG4gIFN0cnVjdHVyZVN0YWdlQWRkZWRFdmVudCxcbiAgU3RydWN0dXJlU3RhZ2VUYWdnZWRFdmVudCxcbiAgU3RydWN0dXJlU3ViZmxvd01vdW50ZWRFdmVudCxcbn0gZnJvbSAnLi9saWIvYnVpbGRlci9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IFRpbWUgQnVkZ2V0XG4gKlxuICogYHRpbWVCdWRnZXQoY2hhcnQpYCDigJQgdGhlIHNsb3dlc3QgYSBjaGFydCBjYW4gdGFrZSwgZnJvbSBpdHMgZGVjbGFyZWQgcmV0cnkgcG9saWNpZXMgKGBhdHRlbXB0cyDDlyB0aW1lb3V0TXNgIHBsdXNcbiAqIHRoZSB3YWl0cywgc3VtbWVkIGFsb25nIHRoZSBzbG93ZXN0IHBhdGgpLCBhbmQgZXZlcnkgc3RhZ2UgdGhhdCBtYWtlcyBhIHBhdGggdW5ib3VuZGVkLCBieSBuYW1lLiBgLmJ1ZGdldChtcylgXG4gKiBkZWNsYXJlcyB0aGUgY2FsbGVyJ3MgY29udHJhY3Q7IGBidWlsZCgpYCByZWZ1c2VzIGEgY2hhcnQgdGhhdCBjYW5ub3Qga2VlcCBpdC4gQWxzbyBgY2hhcnQudGltZUJ1ZGdldCgpYC5cbiAqL1xuZXhwb3J0IHR5cGUge1xuICBCdWRnZXRBc3N1bXB0aW9ucyxcbiAgQnVkZ2V0U3RlcCxcbiAgVGltZUJ1ZGdldE9wdGlvbnMsXG4gIFRpbWVCdWRnZXRSZXBvcnQsXG4gIFVuYm91bmRlZFJlYXNvbixcbiAgVW5ib3VuZGVkU3RhZ2UsXG59IGZyb20gJy4vbGliL2J1ZGdldC9pbmRleC5qcyc7XG5leHBvcnQgeyB0aW1lQnVkZ2V0IH0gZnJvbSAnLi9saWIvYnVkZ2V0L2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBRdWljayBTdGFydCAqL1xuZXhwb3J0IHR5cGUgeyBUeXBlZFN0YWdlRnVuY3Rpb24gfSBmcm9tICcuL2xpYi9idWlsZGVyL3R5cGVkRmxvd0NoYXJ0LmpzJztcblxuLyoqIEBjYXRlZ29yeSBRdWljayBTdGFydCAqL1xuZXhwb3J0IHR5cGUgeyBTY29wZU1ldGhvZHMsIFR5cGVkU2NvcGUgfSBmcm9tICcuL2xpYi9yZWFjdGl2ZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgUXVpY2sgU3RhcnQgKi9cbmV4cG9ydCB7IG5hcnJhdGl2ZSB9IGZyb20gJy4vcmVjb3JkZXJzLmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRGVjaXNpb24gQnJhbmNoaW5nIOKAlCBkZWNpZGUoKSAvIHNlbGVjdCgpIHdpdGggZXZpZGVuY2UgY2FwdHVyZVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IERlY2lzaW9uIEJyYW5jaGluZyAqL1xuZXhwb3J0IHR5cGUge1xuICBEZWNpZGVSdWxlLFxuICBEZWNpc2lvbkV2aWRlbmNlLFxuICBEZWNpc2lvblJlc3VsdCxcbiAgRGVmYXVsdEJyYW5jaCxcbiAgRmlsdGVyT3BzLFxuICBSdWxlRXZpZGVuY2UsXG4gIFNlbGVjdGlvbkV2aWRlbmNlLFxuICBTZWxlY3Rpb25SZXN1bHQsXG4gIFdoZW5DbGF1c2UsXG4gIFdoZXJlRmlsdGVyLFxufSBmcm9tICcuL2xpYi9kZWNpZGUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IERlY2lzaW9uIEJyYW5jaGluZyAqL1xuZXhwb3J0IHsgZGVjaWRlLCBzZWxlY3QgfSBmcm9tICcuL2xpYi9kZWNpZGUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IEVycm9ycyAqL1xuZXhwb3J0IHR5cGUgeyBUZXJtaW5hbEZhaWx1cmVDb250ZXh0IH0gZnJvbSAnLi9saWIvZXJyb3JzL3Rlcm1pbmFsRmFpbHVyZS5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEF0dGVtcHRzIOKAlCBldmVyeSB0cnkgb2YgYSByZXRyaWVkIHN0YWdlLCBhbmQgdGhlIGRlY2lzaW9uIHRoYXQgZm9sbG93ZWQgaXRcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBAY2F0ZWdvcnkgQXR0ZW1wdHNcbiAqXG4gKiBPbmUgYEF0dGVtcHRSZWNvcmRgIHBlciBhdHRlbXB0IG9mIGEgc3RhZ2Ugd2l0aCBhIGRlY2xhcmVkIGByZXRyeWAgcG9saWN5LCBhIGB0aW1lb3V0TXNgLCBvciBhIHJ1biBkZWFkbGluZSDigJRcbiAqIHRpbWluZywgb3V0Y29tZSwgZmFpbHVyZSBjYXRlZ29yeSwgYW5kIHRoZSByZXRyeS1vci1zdG9wIGRlY2lzaW9uIGFzIGBEZWNpc2lvbkV2aWRlbmNlYCDigJQgb24gdGhlIHN0YWdlJ3NcbiAqIGV4ZWN1dGlvbi10cmVlIG5vZGUgKGBTdGFnZVNuYXBzaG90LmF0dGVtcHRzYCAvIGBhdHRlbXB0U3VtbWFyeWApIGFuZCBvbiBgRmxvd1JlY29yZGVyLm9uQXR0ZW1wdGAuXG4gKiBBIGNhbGwgYSBzdGFnZSBtYWtlcyB0aHJvdWdoIGBzY29wZS4kY2FsbGAgaXMgcmVjb3JkZWQgdGhlIHNhbWUgd2F5IChraW5kIGAnY2FsbCdgKSwgYW5kIHNvIGlzIGFuIFNESydzIG93biByZXRyeVxuICogYW4gYWRhcHRlciByZXBvcnRzIHRocm91Z2ggYG9ic2VydmVkKClgIChgT2JzZXJ2ZWRBdHRlbXB0YCwga2luZCBgJ29ic2VydmVkJ2ApLiBgQXR0ZW1wdENvbnRleHRgIGlzIHdoYXRcbiAqIGBzY29wZS4kYXR0ZW1wdCgpYCByZXR1cm5zLCBhbmQgd2hhdCBhIGNhbGwncyBmdW5jdGlvbiBnZXRzICh0aGUgYXR0ZW1wdCdzIHNpZ25hbCwgdGhlIHRpbWUgbGVmdCwgYG9ic2VydmVkYCk7XG4gKiBgTGF0ZVdyaXRlYCBpcyBhIHdyaXRlIChvciBjYWxsKSBhbiBlbmRlZCBhdHRlbXB0IHRyaWVkIChgU3RhZ2VTbmFwc2hvdC5sYXRlV3JpdGVzYCkuIEEgc3RhZ2UgdGhhdCBjaGFuZ2VzIGFuXG4gKiBvdXRzaWRlIHN5c3RlbSBkZWNsYXJlcyBpdCAoYFN0YWdlVG91Y2hlc2AsIGAudG91Y2hlcygpYCksIGFuZCBhIGNhbGwgZG9lcyAoYENhbGxPcHRpb25zYCk6IGV2ZXJ5IGF0dGVtcHQgdGhlblxuICogY2FycmllcyBpdHMgYEF0dGVtcHRFZmZlY3RgLCBhbmQgdGhlIGtleSBydWxlIGlzIGhhbmRlZCBhbiBgSWRlbXBvdGVuY3lLZXlDb250ZXh0YCBvbmNlIHBlciBleGVjdXRpb24uXG4gKi9cbmV4cG9ydCB0eXBlIHtcbiAgQXR0ZW1wdENhdGVnb3J5LFxuICBBdHRlbXB0Q29udGV4dCxcbiAgQXR0ZW1wdEVmZmVjdCxcbiAgQXR0ZW1wdEVycm9yLFxuICBBdHRlbXB0SW5wdXRzLFxuICBBdHRlbXB0S2luZCxcbiAgQXR0ZW1wdE5leHQsXG4gIEF0dGVtcHRPcHRpb25zLFxuICBBdHRlbXB0T3V0Y29tZSxcbiAgQXR0ZW1wdFJlYXNvbixcbiAgQXR0ZW1wdFJlY29yZCxcbiAgQXR0ZW1wdFN1bW1hcnksXG4gIENhbGxPcHRpb25zLFxuICBJZGVtcG90ZW5jeUtleUNvbnRleHQsXG4gIExhdGVXcml0ZSxcbiAgT2JzZXJ2ZWRBdHRlbXB0LFxuICBTdGFnZVRvdWNoZXMsXG4gIFVua25vd25FZmZlY3RJbml0LFxufSBmcm9tICcuL2xpYi9hdHRlbXB0L2luZGV4LmpzJztcbi8qKlxuICogQGNhdGVnb3J5IEF0dGVtcHRzXG4gKlxuICogQW4gYXR0ZW1wdCBieSBuYW1lIChgc2VyaWVzYCArIGBhdHRlbXB0YCkgYW5kIHBlci1vdXRjb21lIGNvdW50cyDigJQgd2hhdCByZWNvcmRlciByb3dzIGhvbGQgb2YgYXR0ZW1wdHMuXG4gKi9cbmV4cG9ydCB0eXBlIHsgQXR0ZW1wdE91dGNvbWVDb3VudHMsIEF0dGVtcHRSZWYgfSBmcm9tICcuL2xpYi9yZWNvcmRlci9hdHRlbXB0U2VyaWVzLmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgQXR0ZW1wdHNcbiAqXG4gKiBgYXR0ZW1wdCgpYCDigJQgdGhlIGF0dGVtcHQgcnVubmVyIGZvciBjb2RlIHRoYXQgaXMgbm90IGEgc3RhZ2UgKHJlY29yZHMgZ28gdG8gaXRzIGBvbkF0dGVtcHRgKTsgYGVycm9yQ2F0ZWdvcnlgXG4gKiDigJQgdGhlIG9uZSBmYWlsdXJlIGNsYXNzaWZpZXIgKHNldmVuIGZpeGVkIGNhdGVnb3JpZXMpOyBgcmV0cnlSdWxlc2Ag4oCUIHRoZSBvbmUgcmV0cnkgcnVsZSB0YWJsZSwgYXMgYGRlY2lkZSgpYFxuICogcnVsZXM7IHRoZSBhdHRlbXB0IGNvbnRyYWN0J3MgdHdvIGVycm9ycy5cbiAqL1xuZXhwb3J0IHsgYXR0ZW1wdCwgQXR0ZW1wdFRpbWVvdXRFcnJvciwgZXJyb3JDYXRlZ29yeSwgcmV0cnlSdWxlcywgVW5rbm93bkVmZmVjdEVycm9yIH0gZnJvbSAnLi9saWIvYXR0ZW1wdC9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IENvcnJlbGF0aW9uXG4gKlxuICogVGhlIHJ1bidzIGNvcnJlbGF0aW9uICgxMC4xKTogYGVudi50cmFjZXBhcmVudGAgKFczQywgcGFyc2VkIHN0cmljdGx5KSBvciBgZW52LnRyYWNlSWRgICsgYGVudi5vcGVyYXRpb25JZGBcbiAqIGJlY29tZSBPTkUgZnJvemVuIGBSdW5Db3JyZWxhdGlvbmAgcGVyIHJ1biDigJQgb24gYGdldFNuYXBzaG90KCkuY29ycmVsYXRpb25gLCBldmVyeSBmbG93IGV2ZW50J3NcbiAqIGB0cmF2ZXJzYWxDb250ZXh0LmNvcnJlbGF0aW9uYCBhbmQgZXZlcnkgc2NvcGUgYW5kIGVtaXQgZXZlbnQncyBgY29ycmVsYXRpb25gLiBgcGFyc2VUcmFjZXBhcmVudGAgL1xuICogYGZvcm1hdFRyYWNlcGFyZW50YCBhcmUgdGhlIFczQyBjb2RlYzsgYSByZWZ1c2VkIGhlYWRlciB0aHJvd3MgYFRyYWNlcGFyZW50RXJyb3JgIHdpdGggYSBuYW1lZCBgcmVhc29uYC5cbiAqL1xuZXhwb3J0IHR5cGUgeyBQYXJzZWRUcmFjZXBhcmVudCwgUnVuQ29ycmVsYXRpb24sIFRyYWNlcGFyZW50RmllbGRzLCBUcmFjZXBhcmVudFJlZnVzYWwgfSBmcm9tICcuL2xpYi9hdHRlbXB0L2luZGV4LmpzJztcbmV4cG9ydCB7IGZvcm1hdFRyYWNlcGFyZW50LCBwYXJzZVRyYWNlcGFyZW50LCBUcmFjZXBhcmVudEVycm9yIH0gZnJvbSAnLi9saWIvYXR0ZW1wdC9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFJ1biDigJQgRXhlY3V0ZSBjaGFydHMgYW5kIGNvbGxlY3QgcmVzdWx0c1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IFJ1biAqL1xuZXhwb3J0IHR5cGUge1xuICBDYXB0dXJlSGlzdG9yeU9wdGlvbnMsXG4gIENhcHR1cmVIaXN0b3J5UmVjZWlwdCxcbiAgQ2FwdHVyZUhpc3RvcnlTdGF0dXMsXG4gIENhcHR1cmVIaXN0b3J5VGFyZ2V0LFxufSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuZXhwb3J0IHR5cGUgeyBSdW5SZXN1bHQgfSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFJ1biAqL1xuZXhwb3J0IHR5cGUgeyBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnMgfSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuXG4vKipcbiAqIFRoZSBjcmFzaC1zYWZlIHJlY29yZCAoMTAuMSk6IHRoZSBleGVjdXRvcidzIGBzaW5rYCBvcHRpb24sIGl0cyBhY2NvdW50aW5nIG9uIGBnZXRTbmFwc2hvdCgpLnNpbmtgLFxuICogYGV4ZWN1dG9yLmZsdXNoUmVjb3JkKClgJ3MgcmVzdWx0LCBhbmQgdGhlIGVycm9yIGEgcnVuIHdpdGggYG9uRmFpbHVyZTogJ2ZhaWwnYCByZWplY3RzIHdpdGguIFRoZSBwb3J0XG4gKiAoYFJlY29yZFNpbmtgLCBgbWVtb3J5U2lua2ApIGlzIGBmb290dHJhY2Uvd3JpdGVgJ3M7IHRoZSBmaWxlIGFkYXB0ZXIgaXMgYGZvb3RwcmludGpzL3NpbmtzYC5cbiAqIEBjYXRlZ29yeSBSdW5cbiAqL1xuZXhwb3J0IHR5cGUge1xuICBSZWNvcmRGbHVzaFJlc3VsdCxcbiAgUmVjb3JkU2lua0ZhaWx1cmVNb2RlLFxuICBSZWNvcmRTaW5rRmx1c2hNb2RlLFxuICBSZWNvcmRTaW5rT3B0aW9uLFxuICBSZWNvcmRTaW5rT3B0aW9ucyxcbiAgUmVjb3JkU2lua1N0YXRzLFxufSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuLyoqIEBjYXRlZ29yeSBSdW4gKi9cbmV4cG9ydCB7IFJlY29yZFNpbmtFcnJvciB9IGZyb20gJy4vbGliL3J1bm5lci9pbmRleC5qcyc7XG5cbi8qKlxuICogVGhlIGZvdXIgb2JzZXJ2YWJpbGl0eSBkaWFscyBgRmxvd0NoYXJ0RXhlY3V0b3JPcHRpb25zYCBpbmhlcml0cy5cbiAqIEBjYXRlZ29yeSBSdW5cbiAqL1xuZXhwb3J0IHR5cGUgeyBSdW5EaWFscyB9IGZyb20gJy4vbGliL21lbW9yeS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgUnVuICovXG5leHBvcnQgeyBGbG93Q2hhcnRFeGVjdXRvciB9IGZyb20gJy4vbGliL3J1bm5lci9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgUnVuICovXG5leHBvcnQgeyBSdW5Db250ZXh0IH0gZnJvbSAnLi9saWIvcnVubmVyL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBSdW4gKi9cbmV4cG9ydCB0eXBlIHsgQ2hhcnRPcGVuQVBJT3B0aW9ucywgTUNQVG9vbERlc2NyaXB0aW9uLCBSdW5uYWJsZUZsb3dDaGFydCB9IGZyb20gJy4vbGliL3J1bm5lci9SdW5uYWJsZUNoYXJ0LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gT2JzZXJ2ZSDigJQgRGF0YSAoc2NvcGUgcmVjb3JkZXJzLCBmaXJlIGR1cmluZyBzdGFnZSBleGVjdXRpb24pXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRGF0YSAqL1xuZXhwb3J0IHR5cGUge1xuICBDb21taXRFdmVudCxcbiAgRXJyb3JFdmVudCxcbiAgUmVhZEV2ZW50LFxuICBSZWRhY3Rpb25Qb2xpY3ksXG4gIFJlZGFjdGlvblJlcG9ydCxcbiAgU2NvcGVSZWNvcmRlcixcbiAgU3RhZ2VFdmVudCxcbiAgV3JpdGVFdmVudCxcbn0gZnJvbSAnLi9saWIvc2NvcGUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIERhdGEgKi9cbmV4cG9ydCB7IE1ldHJpY1JlY29yZGVyIH0gZnJvbSAnLi9saWIvc2NvcGUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIERhdGEgKi9cbmV4cG9ydCB7IERlYnVnUmVjb3JkZXIgfSBmcm9tICcuL2xpYi9zY29wZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgT3BlcmF0aW9uICovXG5leHBvcnQgeyBSZWNvcmRlck9wZXJhdGlvbiB9IGZyb20gJy4vbGliL3JlY29yZGVyL2luZGV4LmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRGVsaXZlcnkgdGllciAoUkZDLTAwMSBkZWZlcnJlZCBvYnNlcnZlcnMpXG4gKlxuICogRXZlcnkgYGF0dGFjaCpSZWNvcmRlcmAgY2FsbCBhY2NlcHRzIGFuIG9wdGlvbnMgYmFnOlxuICogYGV4ZWN1dG9yLmF0dGFjaFNjb3BlUmVjb3JkZXIocmVjLCB7IGRlbGl2ZXJ5OiAnZGVmZXJyZWQnIH0pYCB0YWtlcyB0aGVcbiAqIHJlY29yZGVyIE9VVCBvZiB0aGUgZW5naW5lJ3MgaG90IHBhdGgg4oCUIGV2ZW50cyBhcmUgY2FwdHVyZWQgaW50byBvbmVcbiAqIGJvdW5kZWQsIHRvdGFsbHktb3JkZXJlZCBxdWV1ZSBhbmQgZGVsaXZlcmVkIGF0IHRoZSBuZXh0IG1pY3JvdGFza1xuICogY2hlY2twb2ludCAoXCJvbmUgYmVhdCBiZWhpbmRcIikuIE9taXQgYGRlbGl2ZXJ5YCBmb3IgdGhlIGhpc3RvcmljYWxcbiAqIHN5bmNocm9ub3VzIGNhbGwgKGJ5dGUtaWRlbnRpY2FsIHRvIHByZXZpb3VzIHJlbGVhc2VzKS4gQWNjb3VudGluZ1xuICogc3VyZmFjZXMgb24gYHNuYXBzaG90Lm9ic2VydmVyU3RhdHNgOyBgZXhlY3V0b3IuZHJhaW5PYnNlcnZlcnMoKWAgc2V0dGxlc1xuICogYXN5bmMgbGlzdGVuZXJzIGJlZm9yZSBzaHV0ZG93bi4gU2VlIGBkb2NzL2d1aWRlcy9vYnNlcnZlcnMtZGVmZXJyZWQubWRgLlxuICovXG5leHBvcnQgdHlwZSB7XG4gIEF0dGFjaFJlY29yZGVyT3B0aW9ucyxcbiAgT2JzZXJ2ZXJEZWxpdmVyeSxcbiAgT2JzZXJ2ZXJEcmFpblJlc3VsdCxcbiAgT2JzZXJ2ZXJTdGF0cyxcbn0gZnJvbSAnLi9saWIvcnVubmVyL2luZGV4LmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRGVsaXZlcnkgdGllciAoUkZDLTAwMSBkZWZlcnJlZCBvYnNlcnZlcnMpXG4gKlxuICogYENhcHR1cmVQb2xpY3lgIOKAlCBob3cgYSBkZWZlcnJlZCBldmVudCdzIHBheWxvYWQgaXMgbWF0ZXJpYWxpemVkIGF0XG4gKiBjYXB0dXJlIHRpbWUgKGAnY2xvbmUnYCBieSBkZWZhdWx0IGZvciBhdHRhY2ggb3B0aW9ucyAvIGAnc3VtbWFyeSdgIC8gYCdyZWYnYCkuIGBPdmVyZmxvd1BvbGljeWBcbiAqIOKAlCB3aGF0IGEgc2F0dXJhdGVkIHF1ZXVlIGRvZXMgKGAnZHJvcC1vbGRlc3QnYCBkZWZhdWx0IC8gYCdzYW1wbGUnYCAvXG4gKiBgJ2Jsb2NrJ2ApLiBgRGlzcGF0Y2hlclN0YXRzYCAvIGBMaXN0ZW5lclN0YXRzYCDigJQgdGhlIGFjY291bnRpbmcgc2hhcGVzXG4gKiBlbWJlZGRlZCBpbiBgT2JzZXJ2ZXJTdGF0c2AuIFR5cGVzIG9ubHkg4oCUIHRoZSBvYnNlcnZlci1xdWV1ZSBtb2R1bGVcbiAqIGl0c2VsZiBpcyBpbnRlcm5hbDsgY29uc3VtZXJzIHVzZSB0aGUgYXR0YWNoIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCB0eXBlIHsgQ2FwdHVyZVBvbGljeSwgRGlzcGF0Y2hlclN0YXRzLCBMaXN0ZW5lclN0YXRzLCBPdmVyZmxvd1BvbGljeSB9IGZyb20gJy4vbGliL29ic2VydmVyLXF1ZXVlL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBDb21iaW5lZCAoYm90aCBkYXRhLWZsb3cgYW5kIGNvbnRyb2wtZmxvdykgKi9cbmV4cG9ydCB0eXBlIHsgQ29tYmluZWRSZWNvcmRlciB9IGZyb20gJy4vbGliL3JlY29yZGVyL2luZGV4LmpzJztcbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgQ29tYmluZWQgKGJvdGggZGF0YS1mbG93IGFuZCBjb250cm9sLWZsb3cpICovXG5leHBvcnQge1xuICBoYXNFbWl0UmVjb3JkZXJNZXRob2RzLFxuICBoYXNGbG93UmVjb3JkZXJNZXRob2RzLFxuICBoYXNSZWNvcmRlck1ldGhvZHMsXG4gIGlzRmxvd0V2ZW50LFxufSBmcm9tICcuL2xpYi9yZWNvcmRlci9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEVtaXQgKHVzZXItYXV0aG9yZWQgc3RydWN0dXJlZCBldmVudHMpXG4gKlxuICogVGhpcmQgb2JzZXJ2ZXIgY2hhbm5lbCAoYWxvbmdzaWRlIGBTY29wZVJlY29yZGVyYCBhbmQgYEZsb3dSZWNvcmRlcmApLiBDb25zdW1lclxuICogY29kZSBjYWxscyBgc2NvcGUuJGVtaXQobmFtZSwgcGF5bG9hZClgIGZyb20gaW5zaWRlIGEgc3RhZ2U7IGV2ZXJ5IGF0dGFjaGVkXG4gKiBgRW1pdFJlY29yZGVyLm9uRW1pdChldmVudClgIGZpcmVzIHN5bmNocm9ub3VzbHkgd2l0aCBzdGFnZS1jb250ZXh0XG4gKiBlbnJpY2htZW50LiBQYXNzLXRocm91Z2gg4oCUIG5vIGJ1ZmZlcmluZywgemVybyBhbGxvY2F0aW9uIHdoZW4gbm8gcmVjb3JkZXJcbiAqIGlzIGF0dGFjaGVkLlxuICovXG5leHBvcnQgdHlwZSB7IEVtaXRFdmVudCwgRW1pdFJlY29yZGVyIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvaW5kZXguanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBPYnNlcnZlIOKAlCBGbG93IChGbG93UmVjb3JkZXIsIGZpcmVzIGFmdGVyIHN0YWdlIGV4ZWN1dGlvbilcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgdHlwZSB7XG4gIEZsb3dBdHRlbXB0RXZlbnQsXG4gIEZsb3dCcmVha0V2ZW50LFxuICBGbG93RGVjaXNpb25FdmVudCxcbiAgRmxvd0Vycm9yRXZlbnQsXG4gIEZsb3dGb3JrRXZlbnQsXG4gIEZsb3dMb29wRXZlbnQsXG4gIEZsb3dOZXh0RXZlbnQsXG4gIEZsb3dSZWNvcmRlcixcbiAgRmxvd1J1bkV2ZW50LFxuICBGbG93UnVuRmFpbGVkRXZlbnQsXG4gIEZsb3dTZWxlY3RlZEV2ZW50LFxuICBGbG93U3RhZ2VFdmVudCxcbiAgRmxvd1N0YWdlUmV0cnlFdmVudCxcbiAgRmxvd1N1YmZsb3dFdmVudCxcbiAgRmxvd1N1YmZsb3dSZWdpc3RlcmVkRXZlbnQsXG4gIEZsb3dUaHJvdHRsZWRFdmVudCxcbiAgUmVzdW1lTGluayxcbiAgVHJhdmVyc2FsQ29udGV4dCxcbn0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgdHlwZSB7IENvbWJpbmVkTmFycmF0aXZlRW50cnkgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93XG4gKlxuICogYE5hcnJhdGl2ZUZvcm1hdHRlcmAg4oCUIHBsdWdnYWJsZSBmb3JtYXR0ZXIgdGhhdCBjb252ZXJ0cyBldmVudCBjb250ZXh0XG4gKiBvYmplY3RzIGludG8gdGhlIHRleHQgbGluZXMgb2YgdGhlIG5hcnJhdGl2ZS5cbiAqL1xuZXhwb3J0IHR5cGUgeyBOYXJyYXRpdmVGb3JtYXR0ZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB7IE5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHR5cGUgeyBNYW5pZmVzdEF0dGVtcHRSb3csIE1hbmlmZXN0RW50cnkgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB7IE1hbmlmZXN0Rmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgeyBBZGFwdGl2ZU5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHsgTWlsZXN0b25lTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgeyBQcm9ncmVzc2l2ZU5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHsgUkxFTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgeyBTZXBhcmF0ZU5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHsgU2lsZW50TmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgeyBXaW5kb3dlZE5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFNlbGYtRGVzY3JpYmluZyDigJQgLmNvbnRyYWN0KCksIHRvT3BlbkFQSSgpLCB0b01DUFRvb2woKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IFNlbGYtRGVzY3JpYmluZyAqL1xuZXhwb3J0IHR5cGUgeyBKc29uU2NoZW1hIH0gZnJvbSAnLi9saWIvY29udHJhY3QvaW5kZXguanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBTbmFwc2hvdCAmIENvbXBvc2l0aW9uIOKAlCBTdWJmbG93IG5hdmlnYXRpb24gYW5kIENvbXBvc2FibGVSdW5uZXJcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBTbmFwc2hvdCAmIENvbXBvc2l0aW9uICovXG5leHBvcnQgdHlwZSB7IENvbXBvc2FibGVSdW5uZXIgfSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFNuYXBzaG90ICYgQ29tcG9zaXRpb24gKi9cbmV4cG9ydCB0eXBlIHsgUmVjb3JkZXJTbmFwc2hvdCwgUnVudGltZVNuYXBzaG90LCBTdWJ0cmVlU25hcHNob3QgfSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFNuYXBzaG90ICYgQ29tcG9zaXRpb24gKi9cbmV4cG9ydCB7IGdldFN1YnRyZWVTbmFwc2hvdCwgbGlzdFN1YmZsb3dQYXRocyB9IGZyb20gJy4vbGliL3J1bm5lci9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFNjb3BlUmVjb3JkZXIgQ29tcG9zaXRpb24g4oCUIEJ1bmRsZSBtdWx0aXBsZSByZWNvcmRlcnMgaW50byBkb21haW4gcHJlc2V0c1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IFNjb3BlUmVjb3JkZXIgKi9cbmV4cG9ydCB7IENvbXBvc2l0ZVJlY29yZGVyIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvaW5kZXguanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQYXVzZS9SZXN1bWUg4oCUIFNlcmlhbGl6YWJsZSBjaGVja3BvaW50cyBmb3IgbG9uZy1ydW5uaW5nIG9yIGh1bWFuLWluLXRoZS1sb29wIGZsb3dzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgUGF1c2UvUmVzdW1lICovXG4vKiogQGNhdGVnb3J5IFBhdXNlL1Jlc3VtZSAqL1xuZXhwb3J0IHR5cGUge1xuICBGbG93Y2hhcnRDaGVja3BvaW50LFxuICBQYXVzYWJsZUhhbmRsZXIsXG4gIFBhdXNlZEV4ZWN1dGlvbixcbiAgUGVuZGluZ1BhdXNlLFxuICBSZWRhY3Rpb25NYXJrcyxcbn0gZnJvbSAnLi9saWIvcGF1c2UvaW5kZXguanMnO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBQYXVzZS9SZXN1bWVcbiAqXG4gKiBgaW50ZXJydXB0KHNjb3BlLCB7IHJlYXNvbiwgZXhwZWN0cz8gfSlgIOKAlCBzdG9wIG1pZC1zdGFnZSB0byBhc2sgYSBxdWVzdGlvbixcbiAqIGFuZCBnZXQgdGhlIGFuc3dlciBiYWNrIGF0IHRoZSBzYW1lIGNhbGwgc2l0ZSB3aGVuIHRoZSBydW4gcmVzdW1lcy4gUmVzdW1lXG4gKiByZS1lbnRlcnMgdGhlIHN0YWdlIGZyb20gaXRzIFRPUCAoc3RhZ2VzIGFyZSBhdG9taWMpLCBzbyBrZWVwIHRoZSBoYWxmXG4gKiBiZWZvcmUgdGhlIGNhbGwgaWRlbXBvdGVudC5cbiAqL1xuZXhwb3J0IHR5cGUgeyBJbnRlcnJ1cHRQYXlsb2FkIH0gZnJvbSAnLi9saWIvcGF1c2UvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFBhdXNlL1Jlc3VtZSAqL1xuZXhwb3J0IHsgaW50ZXJydXB0IH0gZnJvbSAnLi9saWIvcGF1c2UvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFNjb3BlUmVjb3JkZXIgKi9cbmV4cG9ydCB0eXBlIHsgQ29tcG9zaXRlU25hcHNob3QgfSBmcm9tICcuL2xpYi9yZWNvcmRlci9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENvbmZpZ3VyYXRpb24g4oCUIFR5cGVzIHBhc3NlZCB0byBGbG93Q2hhcnRFeGVjdXRvciBhbmQgcnVuKClcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBDb25maWd1cmF0aW9uICovXG5leHBvcnQgdHlwZSB7IEV4ZWN1dGlvbkVudiwgRXhlY3V0b3JSZXN1bHQsIFBhdXNlZFJlc3VsdCwgUnVuT3B0aW9ucyB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgQ29uZmlndXJhdGlvbiAqL1xuZXhwb3J0IHR5cGUgeyBTY29wZUZhY3RvcnkgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBDb25maWd1cmF0aW9uXG4gKlxuICogUmVhZC10cmFja2luZyBwb2xpY3kgZm9yIGBTdGFnZVNuYXBzaG90LnN0YWdlUmVhZHNgICgjMTQpOlxuICogYCdmdWxsJ2AgKGRlZmF1bHQg4oCUIHBlci1yZWFkIHZhbHVlIGNsb25lLCBoaXN0b3JpY2FsIGJlaGF2aW9yKSAvXG4gKiBgJ3N1bW1hcnknYCAoY2hlYXAgYFJlYWRTdW1tYXJ5TWFya2VyYCBwZXIgcmVhZCkgLyBgJ29mZidgIChubyB0cmFja2luZyxcbiAqIHplcm8gcGVyLXJlYWQgY2xvbmUpLiBQYXNzIGFzIGBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHsgcmVhZFRyYWNraW5nIH0pYFxuICogb3IgY2FsbCBgZXhlY3V0b3Iuc2V0UmVhZFRyYWNraW5nKG1vZGUpYCBiZWZvcmUgYHJ1bigpYC5cbiAqL1xuZXhwb3J0IHR5cGUgeyBSZWFkU3VtbWFyeU1hcmtlciwgUmVhZFRyYWNraW5nTW9kZSB9IGZyb20gJy4vbGliL21lbW9yeS9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IENvbmZpZ3VyYXRpb25cbiAqXG4gKiBXcml0ZS10cmFja2luZyBwb2xpY3kgZm9yIGBTdGFnZVNuYXBzaG90LnN0YWdlV3JpdGVzYCAoIzEzYy1BKSDigJQgdGhlXG4gKiBzaWJsaW5nIG9mIGBSZWFkVHJhY2tpbmdNb2RlYDsgYm90aCBhbGlhcyB0aGUgc2hhcmVkIGBSZXRlbnRpb25Qb2xpY3lgXG4gKiBmYW1pbHkgZnJvbSBgbGliL2NhcHR1cmVgLiBgJ2Z1bGwnYCAoZGVmYXVsdCDigJQgcGVyLXdyaXRlIHZhbHVlIGNsb25lLFxuICogaGlzdG9yaWNhbCBiZWhhdmlvcikgLyBgJ3N1bW1hcnknYCAoY2hlYXAgYFdyaXRlU3VtbWFyeU1hcmtlcmAgcGVyIHdyaXRlKVxuICogLyBgJ29mZidgIChubyB0cmFja2luZzsgYHN0YWdlV3JpdGVzYCBhYnNlbnQgYW5kIHRoZSBgb25Db21taXRgIG11dGF0aW9uc1xuICogcGF5bG9hZCBpcyBlbXB0eSDigJQgd3JpdGVzIHRoZW1zZWx2ZXMgc3RpbGwgY29tbWl0LCBhbmQgdGhlIGNvbW1pdCBsb2cgaXNcbiAqIHVuYWZmZWN0ZWQpLiBQYXNzIGFzIGBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHsgd3JpdGVUcmFja2luZyB9KWAgb3JcbiAqIGNhbGwgYGV4ZWN1dG9yLnNldFdyaXRlVHJhY2tpbmcobW9kZSlgIGJlZm9yZSBgcnVuKClgLlxuICovXG5leHBvcnQgdHlwZSB7IFJldGVudGlvblBvbGljeSwgV3JpdGVTdW1tYXJ5TWFya2VyLCBXcml0ZVRyYWNraW5nTW9kZSB9IGZyb20gJy4vbGliL21lbW9yeS9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IENvbmZpZ3VyYXRpb25cbiAqXG4gKiBDb21taXQtdmFsdWVzIGVuY29kaW5nIGZvciB0aGUgQ09NTUlUIExPRyAoIzEzYy1CKSDigJQgdGhlIHRoaXJkIGRpYWwgb2ZcbiAqIHRoZSBmYW1pbHksIGFuZCB0aGUgb25seSBMT1NTTEVTUyBvbmUgKGl0IGNoYW5nZXMgdGhlIGxvZydzIGVuY29kaW5nLFxuICogbmV2ZXIgaXRzIGluZm9ybWF0aW9uKS4gYCdmdWxsJ2AgKGRlZmF1bHQg4oCUIGV2ZXJ5IHN1cnZpdmluZyBgc2V0YCBzdG9yZXNcbiAqIHRoZSBmdWxsIGZpbmFsIHZhbHVlLCBieXRlLWlkZW50aWNhbCB0byBoaXN0b3J5KSAvIGAnZGVsdGEnYCAoYXJyYXlcbiAqIG5ldC1jaGFuZ2VzIHRoYXQgYXJlIFwiYmFzZSBwbHVzIGEgdGFpbFwiIGNvbW1pdCBhcyBhbiBgYXBwZW5kYCB2ZXJiXG4gKiBzdG9yaW5nIG9ubHkgdGhlIHRhaWw7IGBkZWxldGVWYWx1ZSgpYCBjb21taXRzIGFzIGEgcmVhbCBgZGVsZXRlYCB2ZXJiO1xuICogb25lIHRyYWNlIGVudHJ5IHBlciBzdXJ2aXZpbmcgcGF0aCkuIFJlcGxheSByZWNvbnN0cnVjdHMgZXZlcnkgc3RlcCdzXG4gKiBmdWxsIHN0YXRlIGV4YWN0bHkuIENvbnN1bWVycyByZWFkaW5nIGBidW5kbGUub3ZlcndyaXRlW2tleV1gIGFzIHRoZSBmdWxsXG4gKiB2YWx1ZSBtdXN0IHVzZSBgY29tbWl0VmFsdWVBdGAgZnJvbSBgZm9vdHRyYWNlYC4gUGFzcyBhc1xuICogYG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgeyBjb21taXRWYWx1ZXMgfSlgIG9yIGNhbGxcbiAqIGBleGVjdXRvci5zZXRDb21taXRWYWx1ZXMobW9kZSlgIGJlZm9yZSBgcnVuKClgOyB0aGUgYWN0aXZlIG1vZGUgaXMgdGhlXG4gKiBzbmFwc2hvdCBkaXNjcmltaW5hbnQgYGdldFNuYXBzaG90KCkuY29tbWl0VmFsdWVzYC5cbiAqL1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBDb250cmFjdCAmIFZhbGlkYXRpb25cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBDb250cmFjdCAmIFZhbGlkYXRpb24gKi9cbmV4cG9ydCB0eXBlIHsgU2NoZW1hS2luZCwgVmFsaWRhdGlvbklzc3VlLCBWYWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnLi9saWIvc2NoZW1hL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBDb250cmFjdCAmIFZhbGlkYXRpb24gKi9cbmV4cG9ydCB7IGRldGVjdFNjaGVtYSwgaXNWYWxpZGF0YWJsZSwgaXNab2QgfSBmcm9tICcuL2xpYi9zY2hlbWEvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IENvbnRyYWN0ICYgVmFsaWRhdGlvbiAqL1xuZXhwb3J0IHsgSW5wdXRWYWxpZGF0aW9uRXJyb3IsIHZhbGlkYXRlQWdhaW5zdFNjaGVtYSwgdmFsaWRhdGVPclRocm93IH0gZnJvbSAnLi9saWIvc2NoZW1hL2luZGV4LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRXJyb3IgVXRpbGl0aWVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgRXJyb3IgVXRpbGl0aWVzICovXG5leHBvcnQgdHlwZSB7IFN0cnVjdHVyZWRFcnJvckluZm8gfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IEVycm9yIFV0aWxpdGllcyAqL1xuZXhwb3J0IHsgZXh0cmFjdEVycm9ySW5mbywgZm9ybWF0RXJyb3JJbmZvIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRGV2IFRvb2xzIOKAlCBNb2RlIGZsYWdzIGFuZCBab2Qgc2NvcGUgdXRpbGl0aWVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQGNhdGVnb3J5IERldiBUb29sc1xuICpcbiAqIEdsb2JhbCBkZXYtbW9kZSBmbGFnLiBDYWxsIGBlbmFibGVEZXZNb2RlKClgIGF0IGFwcGxpY2F0aW9uIHN0YXJ0dXAgdG9cbiAqIHR1cm4gb24gZGV2ZWxvcGVyLW9ubHkgZGlhZ25vc3RpY3MgYWNyb3NzIHRoZSBsaWJyYXJ5IOKAlCBjaXJjdWxhci1yZWZlcmVuY2VcbiAqIGRldGVjdGlvbiBpbiBzY29wZSB3cml0ZXMsIHdhcm5pbmdzIHdoZW4gYSByZWNvcmRlciBoYXMgbm8gb2JzZXJ2ZXJcbiAqIG1ldGhvZHMsIHN1c3BpY2lvdXMtcHJlZGljYXRlIHdhcm5pbmdzIGluIGRlY2lkZS9zZWxlY3QsIHN0cnVjdHVyYWxcbiAqIGNoZWNrcyBpbiBgZ2V0U3VidHJlZVNuYXBzaG90YCwgYW5kIGFueSBmdXR1cmUgZGV2LW9ubHkgZGlhZ25vc3RpYy5cbiAqXG4gKiBQcm9kdWN0aW9uIGxlYXZlcyBpdCBPRkYgYnkgZGVmYXVsdCAoemVybyBvdmVyaGVhZCkuIFNlZSB0aGUgSlNEb2Mgb25cbiAqIGBlbmFibGVEZXZNb2RlYCBmb3IgdGhlIGZ1bGwgbGlzdCBhbmQgdXNhZ2UgZXhhbXBsZS5cbiAqL1xuZXhwb3J0IHsgZGlzYWJsZURldk1vZGUsIGVuYWJsZURldk1vZGUsIGlzRGV2TW9kZSB9IGZyb20gJy4vbGliL2Rldk1vZGUuanMnO1xuXG4vLyBgZGVmaW5lU2NvcGVGcm9tWm9kYCBhbmQgdGhlIG90aGVyIHpvZC1iYXNlZCBzY29wZSBoZWxwZXJzIG1vdmVkIHRvIHRoZSBvcHQtaW5cbi8vIGBmb290cHJpbnRqcy96b2RgIGVudHJ5IOKAlCBrZWVwaW5nIHpvZCBvdXQgb2YgdGhlIGNvcmUgbG9hZCBwYXRoIChpdCBpcyBhblxuLy8gb3B0aW9uYWwgcGVlcikuIEltcG9ydCB0aGVtIGZyb20gJ2Zvb3RwcmludGpzL3pvZCcuXG4vLyBBIHJ1bidzIHJlY29yZCBhcyBKU09OIHdpdGhvdXQgdGhlIGVuZ2luZSdzIHJlY3Vyc2lvbiBsaW1pdCAoOS4yNi4wKTogdGhlXG4vLyBzYW1lIGJ5dGVzIEpTT04uc3RyaW5naWZ5IGVtaXRzLCBmb3IgYSBkZWVwIGBuZXh0YCBjaGFpbiBpdCBjYW5ub3QgZW5jb2RlLlxuZXhwb3J0IHR5cGUgeyBSZXRyeUxvb3BDYWxsLCBSZXRyeUxvb3BEZWNpc2lvbiwgUmV0cnlMb29wSWRlbnRpdHkgfSBmcm9tICcuL2xpYi9hdHRlbXB0L3JldHJ5TG9vcFR5cGVzLmpzJztcbmV4cG9ydCB0eXBlIHsgUmV0cnlMb29wQ29udGV4dCwgUmV0cnlMb29wT3B0aW9ucywgUmV0cnlMb29wU3RhdGUgfSBmcm9tICcuL2xpYi9idWlsZGVyL3JldHJ5TG9vcC5qcyc7XG5leHBvcnQgdHlwZSB7XG4gIENhcHR1cmVDaGFubmVsU3RhdHVzLFxuICBDYXB0dXJlTGltaXRhdGlvbixcbiAgTmF0aXZlQ2FwdHVyZU5vdGUsXG4gIFJlY29yZGVyQ2FwdHVyZUFja25vd2xlZGdlbWVudCxcbn0gZnJvbSAnLi9saWIvY2FwdHVyZS9uYXRpdmVDb3ZlcmFnZS5qcyc7XG5leHBvcnQgdHlwZSB7XG4gIEVuZ2luZVJlYWRTb3VyY2VzLFxuICBOYXRpdmVDYXB0dXJlT2JzZXJ2YXRpb24sXG4gIE5hdGl2ZVJlYWRDYXB0dXJlTm90ZSxcbiAgU291cmNlTGltaXRhdGlvbixcbn0gZnJvbSAnLi9saWIvY2FwdHVyZS9yZWFkU291cmNlcy5qcyc7XG5leHBvcnQgdHlwZSB7XG4gIFNvdXJjZUV4ZWN1dGlvbk93bmVyc2hpcCxcbiAgU291cmNlT3duZXJzaGlwR2FwLFxuICBTb3VyY2VPd25lcnNoaXBXaXRuZXNzLFxufSBmcm9tICcuL2xpYi9jYXB0dXJlL3NvdXJjZU93bmVyc2hpcEZvcm1hdC5qcyc7XG5leHBvcnQgeyBzdHJpbmdpZnlTbmFwc2hvdCB9IGZyb20gJy4vbGliL3J1bm5lci9zdHJpbmdpZnlTbmFwc2hvdC5qcyc7XG4iXX0=
100
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFTSCw0QkFBNEI7QUFDNUIsT0FBTyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBc0N4RixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFRbkQsNEJBQTRCO0FBQzVCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQW9CM0MsbUNBQW1DO0FBQ25DLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFpRHZEOzs7Ozs7OztHQVFHO0FBQ0gsT0FBTyxFQUNMLE9BQU8sRUFDUCxtQkFBbUIsRUFDbkIsYUFBYSxFQUNiLGtCQUFrQixFQUNsQixVQUFVLEVBQ1YsZUFBZSxFQUNmLGtCQUFrQixHQUNuQixNQUFNLHdCQUF3QixDQUFDO0FBbUJoQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQWdDL0Ysb0JBQW9CO0FBQ3BCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQVF4RCxvQkFBb0I7QUFDcEIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFMUQsb0JBQW9CO0FBQ3BCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQXFCbkQsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV0RCwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXJELG9DQUFvQztBQUNwQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQW1DNUQscUVBQXFFO0FBQ3JFLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsc0JBQXNCLEVBQ3RCLGtCQUFrQixFQUNsQixXQUFXLEdBQ1osTUFBTSx5QkFBeUIsQ0FBQztBQWtEakMsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBSzlELCtCQUErQjtBQUMvQixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUU3RCwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFdEUsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXZFLCtCQUErQjtBQUMvQixPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUV6RSwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFakUsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXRFLCtCQUErQjtBQUMvQixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVwRSwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFtQnRFLHVDQUF1QztBQUN2QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUU3RSwrRUFBK0U7QUFDL0UsNEVBQTRFO0FBQzVFLCtFQUErRTtBQUUvRSw4QkFBOEI7QUFDOUIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUEwQjVELDZCQUE2QjtBQUM3QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFnRWpELHNDQUFzQztBQUN0QyxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUzRSxzQ0FBc0M7QUFDdEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLHFCQUFxQixFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBU3JHLGdDQUFnQztBQUNoQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFMUUsK0VBQStFO0FBQy9FLGlEQUFpRDtBQUNqRCwrRUFBK0U7QUFFL0U7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxPQUFPLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQTBCNUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUNBQW1DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZvb3RQcmludCDigJQgUHVibGljIEFQSSAodjMpXG4gKlxuICogVGhlIGZsb3djaGFydCBwYXR0ZXJuIGZvciBiYWNrZW5kIGNvZGUuXG4gKiBCdWlsZCDihpIgUnVuIOKGkiBPYnNlcnZlLlxuICpcbiAqICoqVGhlIGNvbW1vbiBpbXBvcnQgcGF0aHM6KipcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBmbG93Q2hhcnQsIGRlY2lkZSwgbmFycmF0aXZlIH0gZnJvbSAnZm9vdHByaW50anMnOyAgICAgICAgICAgLy8gbWFpbiDigJQgc3RhcnQgaGVyZVxuICogaW1wb3J0IHsgbWV0cmljcywgZGVidWcsIG1hbmlmZXN0IH0gICAgIGZyb20gJ2Zvb3RwcmludGpzL3JlY29yZGVycyc7IC8vIHJlY29yZGVyIGZhY3Rvcmllc1xuICogaW1wb3J0IHsgc3RhdGVBdCwgY2F1c2FsQ2hhaW4gfSBmcm9tICdmb290dHJhY2UnOyAgICAgLy8gcmVhZCBhIGZpbmlzaGVkIHJ1blxuICogaW1wb3J0IHsgUmVjb3JkRnJhbWUsIEV2ZW50TG9nIH0gZnJvbSAnZm9vdHRyYWNlL3dyaXRlJzsgICAgIC8vIHdyaXRlIGEgcmVjb3JkIHlvdXJzZWxmXG4gKiBpbXBvcnQgeyBTdGFnZUNvbnRleHQgfSAgICAgICAgICAgICAgICAgZnJvbSAnZm9vdHByaW50anMvYWR2YW5jZWQnOyAgLy8gZW5naW5lIGludGVybmFsc1xuICogYGBgXG4gKlxuICogQG1vZHVsZVxuICovXG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFF1aWNrIFN0YXJ0IOKAlCBFdmVyeXRoaW5nIHlvdSBuZWVkIGZvciA5MCUgb2YgdXNlIGNhc2VzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgUXVpY2sgU3RhcnQgKi9cbmV4cG9ydCB0eXBlIHsgRmxvd0NoYXJ0LCBTdGFnZUZ1bmN0aW9uIGFzIFN0YWdlSGFuZGxlciwgU3RyZWFtSGFuZGxlcnMgfSBmcm9tICcuL2xpYi9idWlsZGVyL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBRdWljayBTdGFydCAqL1xuZXhwb3J0IHsgZmxvd0NoYXJ0LCBGbG93Q2hhcnRCdWlsZGVyLCBmbG93Q2hhcnRTZWxlY3RvciB9IGZyb20gJy4vbGliL2J1aWxkZXIvaW5kZXguanMnO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBRdWljayBTdGFydFxuICpcbiAqIENvbmZpZyBmb3IgYC5hZGRQYXJhbGxlbEZvckVhY2goKWAg4oCUIG9uZSBicmFuY2ggcGVyIGl0ZW0sIGJyYW5jaCBjb3VudFxuICogZGVjaWRlZCBhdCBydW4gdGltZSBmcm9tIHRoZSBwYXlsb2FkLiBgbWF4QnJhbmNoZXNgIGFuZCBgaW50b2AgYXJlIHJlcXVpcmVkXG4gKiBvbiBwdXJwb3NlIChzZWUgZG9jcy9kZXNpZ24vZXhlY3V0aW9uLWNvbnRyb2wubWQpLlxuICovXG5leHBvcnQgdHlwZSB7IEJyYW5jaENoYXJ0LCBQYXJhbGxlbEZvckVhY2hDb25maWcsIFJldHJ5UG9saWN5IH0gZnJvbSAnLi9saWIvYnVpbGRlci9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgUXVpY2sgU3RhcnQg4oCUIGJ1aWxkLXRpbWUgb2JzZXJ2ZXIgKHR3aW4gb2YgRmxvd1JlY29yZGVyKSAqL1xuZXhwb3J0IHR5cGUge1xuICBTdHJ1Y3R1cmVEZWNpZGVyQ29tcGxldGVFdmVudCxcbiAgU3RydWN0dXJlRWRnZUFkZGVkRXZlbnQsXG4gIFN0cnVjdHVyZUVkZ2VLaW5kLFxuICBTdHJ1Y3R1cmVMb29wRWRnZUFkZGVkRXZlbnQsXG4gIFN0cnVjdHVyZVJlY29yZGVyLFxuICBTdHJ1Y3R1cmVTdGFnZUFkZGVkRXZlbnQsXG4gIFN0cnVjdHVyZVN0YWdlVGFnZ2VkRXZlbnQsXG4gIFN0cnVjdHVyZVN1YmZsb3dNb3VudGVkRXZlbnQsXG59IGZyb20gJy4vbGliL2J1aWxkZXIvaW5kZXguanMnO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBUaW1lIEJ1ZGdldFxuICpcbiAqIGB0aW1lQnVkZ2V0KGNoYXJ0KWAg4oCUIHRoZSBzbG93ZXN0IGEgY2hhcnQgY2FuIHRha2UsIGZyb20gaXRzIGRlY2xhcmVkIHJldHJ5IHBvbGljaWVzIChgYXR0ZW1wdHMgw5cgdGltZW91dE1zYCBwbHVzXG4gKiB0aGUgd2FpdHMsIHN1bW1lZCBhbG9uZyB0aGUgc2xvd2VzdCBwYXRoKSwgYW5kIGV2ZXJ5IHN0YWdlIHRoYXQgbWFrZXMgYSBwYXRoIHVuYm91bmRlZCwgYnkgbmFtZS4gYC5idWRnZXQobXMpYFxuICogZGVjbGFyZXMgdGhlIGNhbGxlcidzIGNvbnRyYWN0OyBgYnVpbGQoKWAgcmVmdXNlcyBhIGNoYXJ0IHRoYXQgY2Fubm90IGtlZXAgaXQuIEFsc28gYGNoYXJ0LnRpbWVCdWRnZXQoKWAuXG4gKi9cbmV4cG9ydCB0eXBlIHtcbiAgQnVkZ2V0QXNzdW1wdGlvbnMsXG4gIEJ1ZGdldFN0ZXAsXG4gIFRpbWVCdWRnZXRPcHRpb25zLFxuICBUaW1lQnVkZ2V0UmVwb3J0LFxuICBVbmJvdW5kZWRSZWFzb24sXG4gIFVuYm91bmRlZFN0YWdlLFxufSBmcm9tICcuL2xpYi9idWRnZXQvaW5kZXguanMnO1xuZXhwb3J0IHsgdGltZUJ1ZGdldCB9IGZyb20gJy4vbGliL2J1ZGdldC9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgUXVpY2sgU3RhcnQgKi9cbmV4cG9ydCB0eXBlIHsgVHlwZWRTdGFnZUZ1bmN0aW9uIH0gZnJvbSAnLi9saWIvYnVpbGRlci90eXBlZEZsb3dDaGFydC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgUXVpY2sgU3RhcnQgKi9cbmV4cG9ydCB0eXBlIHsgU2NvcGVNZXRob2RzLCBUeXBlZFNjb3BlIH0gZnJvbSAnLi9saWIvcmVhY3RpdmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFF1aWNrIFN0YXJ0ICovXG5leHBvcnQgeyBuYXJyYXRpdmUgfSBmcm9tICcuL3JlY29yZGVycy5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIERlY2lzaW9uIEJyYW5jaGluZyDigJQgZGVjaWRlKCkgLyBzZWxlY3QoKSB3aXRoIGV2aWRlbmNlIGNhcHR1cmVcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBEZWNpc2lvbiBCcmFuY2hpbmcgKi9cbmV4cG9ydCB0eXBlIHtcbiAgRGVjaWRlUnVsZSxcbiAgRGVjaXNpb25FdmlkZW5jZSxcbiAgRGVjaXNpb25SZXN1bHQsXG4gIERlZmF1bHRCcmFuY2gsXG4gIEZpbHRlck9wcyxcbiAgUnVsZUV2aWRlbmNlLFxuICBTZWxlY3Rpb25FdmlkZW5jZSxcbiAgU2VsZWN0aW9uUmVzdWx0LFxuICBXaGVuQ2xhdXNlLFxuICBXaGVyZUZpbHRlcixcbn0gZnJvbSAnLi9saWIvZGVjaWRlL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBEZWNpc2lvbiBCcmFuY2hpbmcgKi9cbmV4cG9ydCB7IGRlY2lkZSwgc2VsZWN0IH0gZnJvbSAnLi9saWIvZGVjaWRlL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBFcnJvcnMgKi9cbmV4cG9ydCB0eXBlIHsgVGVybWluYWxGYWlsdXJlQ29udGV4dCB9IGZyb20gJy4vbGliL2Vycm9ycy90ZXJtaW5hbEZhaWx1cmUuanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBBdHRlbXB0cyDigJQgZXZlcnkgdHJ5IG9mIGEgcmV0cmllZCBzdGFnZSwgYW5kIHRoZSBkZWNpc2lvbiB0aGF0IGZvbGxvd2VkIGl0XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQGNhdGVnb3J5IEF0dGVtcHRzXG4gKlxuICogT25lIGBBdHRlbXB0UmVjb3JkYCBwZXIgYXR0ZW1wdCBvZiBhIHN0YWdlIHdpdGggYSBkZWNsYXJlZCBgcmV0cnlgIHBvbGljeSwgYSBgdGltZW91dE1zYCwgb3IgYSBydW4gZGVhZGxpbmUg4oCUXG4gKiB0aW1pbmcsIG91dGNvbWUsIGZhaWx1cmUgY2F0ZWdvcnksIGFuZCB0aGUgcmV0cnktb3Itc3RvcCBkZWNpc2lvbiBhcyBgRGVjaXNpb25FdmlkZW5jZWAg4oCUIG9uIHRoZSBzdGFnZSdzXG4gKiBleGVjdXRpb24tdHJlZSBub2RlIChgU3RhZ2VTbmFwc2hvdC5hdHRlbXB0c2AgLyBgYXR0ZW1wdFN1bW1hcnlgKSBhbmQgb24gYEZsb3dSZWNvcmRlci5vbkF0dGVtcHRgLlxuICogQSBjYWxsIGEgc3RhZ2UgbWFrZXMgdGhyb3VnaCBgc2NvcGUuJGNhbGxgIGlzIHJlY29yZGVkIHRoZSBzYW1lIHdheSAoa2luZCBgJ2NhbGwnYCksIGFuZCBzbyBpcyBhbiBTREsncyBvd24gcmV0cnlcbiAqIGFuIGFkYXB0ZXIgcmVwb3J0cyB0aHJvdWdoIGBvYnNlcnZlZCgpYCAoYE9ic2VydmVkQXR0ZW1wdGAsIGtpbmQgYCdvYnNlcnZlZCdgKS4gYEF0dGVtcHRDb250ZXh0YCBpcyB3aGF0XG4gKiBgc2NvcGUuJGF0dGVtcHQoKWAgcmV0dXJucywgYW5kIHdoYXQgYSBjYWxsJ3MgZnVuY3Rpb24gZ2V0cyAodGhlIGF0dGVtcHQncyBzaWduYWwsIHRoZSB0aW1lIGxlZnQsIGBvYnNlcnZlZGApO1xuICogYExhdGVXcml0ZWAgaXMgYSB3cml0ZSAob3IgY2FsbCkgYW4gZW5kZWQgYXR0ZW1wdCB0cmllZCAoYFN0YWdlU25hcHNob3QubGF0ZVdyaXRlc2ApLiBBIHN0YWdlIHRoYXQgY2hhbmdlcyBhblxuICogb3V0c2lkZSBzeXN0ZW0gZGVjbGFyZXMgaXQgKGBTdGFnZVRvdWNoZXNgLCBgLnRvdWNoZXMoKWApLCBhbmQgYSBjYWxsIGRvZXMgKGBDYWxsT3B0aW9uc2ApOiBldmVyeSBhdHRlbXB0IHRoZW5cbiAqIGNhcnJpZXMgaXRzIGBBdHRlbXB0RWZmZWN0YCwgYW5kIHRoZSBrZXkgcnVsZSBpcyBoYW5kZWQgYW4gYElkZW1wb3RlbmN5S2V5Q29udGV4dGAgb25jZSBwZXIgZXhlY3V0aW9uLlxuICovXG5leHBvcnQgdHlwZSB7XG4gIEF0dGVtcHRDYXRlZ29yeSxcbiAgQXR0ZW1wdENvbnRleHQsXG4gIEF0dGVtcHRFZmZlY3QsXG4gIEF0dGVtcHRFcnJvcixcbiAgQXR0ZW1wdElucHV0cyxcbiAgQXR0ZW1wdEtpbmQsXG4gIEF0dGVtcHROZXh0LFxuICBBdHRlbXB0T3B0aW9ucyxcbiAgQXR0ZW1wdE91dGNvbWUsXG4gIEF0dGVtcHRSZWFzb24sXG4gIEF0dGVtcHRSZWNvcmQsXG4gIEF0dGVtcHRTdW1tYXJ5LFxuICBDYWxsT3B0aW9ucyxcbiAgSWRlbXBvdGVuY3lLZXlDb250ZXh0LFxuICBMYXRlV3JpdGUsXG4gIE9ic2VydmVkQXR0ZW1wdCxcbiAgU3RhZ2VUb3VjaGVzLFxuICBVbmtub3duRWZmZWN0SW5pdCxcbn0gZnJvbSAnLi9saWIvYXR0ZW1wdC9pbmRleC5qcyc7XG4vKipcbiAqIEBjYXRlZ29yeSBBdHRlbXB0c1xuICpcbiAqIEFuIGF0dGVtcHQgYnkgbmFtZSAoYHNlcmllc2AgKyBgYXR0ZW1wdGApIGFuZCBwZXItb3V0Y29tZSBjb3VudHMg4oCUIHdoYXQgcmVjb3JkZXIgcm93cyBob2xkIG9mIGF0dGVtcHRzLlxuICovXG5leHBvcnQgdHlwZSB7IEF0dGVtcHRPdXRjb21lQ291bnRzLCBBdHRlbXB0UmVmIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvYXR0ZW1wdFNlcmllcy5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IEF0dGVtcHRzXG4gKlxuICogYGF0dGVtcHQoKWAg4oCUIHRoZSBhdHRlbXB0IHJ1bm5lciBmb3IgY29kZSB0aGF0IGlzIG5vdCBhIHN0YWdlIChyZWNvcmRzIGdvIHRvIGl0cyBgb25BdHRlbXB0YCk7IGBlcnJvckNhdGVnb3J5YFxuICog4oCUIHRoZSBvbmUgZmFpbHVyZSBjbGFzc2lmaWVyIChzZXZlbiBmaXhlZCBjYXRlZ29yaWVzKTsgYHJldHJ5UnVsZXNgIOKAlCB0aGUgb25lIHJldHJ5IHJ1bGUgdGFibGUsIGFzIGBkZWNpZGUoKWBcbiAqIHJ1bGVzOyB0aGUgYXR0ZW1wdCBjb250cmFjdCdzIHR3byBlcnJvcnM7IGBleHBvbmVudGlhbEJhY2tvZmZgIC8gYHN0YXRlZFdhaXRGaXJzdGAg4oCUIGRldGVybWluaXN0aWMgYnVpbGRlcnMgb2ZcbiAqIHRoZSBmdW5jdGlvbiBhIGBSZXRyeVBvbGljeS5iYWNrb2ZmTXNgIHRha2VzIChgQmFja29mZlNwZWMubWF4RGVsYXlNc2AgY2FwcyB0aGUgc2NoZWR1bGUgYmVmb3JlIHRoZSBqaXR0ZXIgZHJhdzsgdGhlXG4gKiBwb2xpY3kncyBgbWF4QmFja29mZk1zYCBzdGlsbCBjYXBzIGV2ZXJ5IHdhaXQgYWZ0ZXIgaXQpLlxuICovXG5leHBvcnQge1xuICBhdHRlbXB0LFxuICBBdHRlbXB0VGltZW91dEVycm9yLFxuICBlcnJvckNhdGVnb3J5LFxuICBleHBvbmVudGlhbEJhY2tvZmYsXG4gIHJldHJ5UnVsZXMsXG4gIHN0YXRlZFdhaXRGaXJzdCxcbiAgVW5rbm93bkVmZmVjdEVycm9yLFxufSBmcm9tICcuL2xpYi9hdHRlbXB0L2luZGV4LmpzJztcbi8qKlxuICogQGNhdGVnb3J5IEF0dGVtcHRzXG4gKlxuICogV2hhdCB0aGUgYmFja29mZiBidWlsZGVycyB0YWtlIGFuZCBidWlsZDogYW4gZXhwb25lbnRpYWwgc2NoZWR1bGUgKGBCYWNrb2ZmU3BlY2AsIGl0cyBgQmFja29mZkppdHRlcmApLCB0aGVcbiAqIGBSZXRyeVBvbGljeS5iYWNrb2ZmTXNgIGZ1bmN0aW9uIHRoZXkgcmV0dXJuIChgQmFja29mZkZ1bmN0aW9uYCksIGFuZCB0aGUgcmVhZGVyIG9mIGEgc3RhdGVkIHdhaXRcbiAqIChgU3RhdGVkV2FpdFJlYWRlcmAg4oCUIGEgcGFyc2VkIGBSZXRyeS1BZnRlcmAsIGluIG1pbGxpc2Vjb25kcykuXG4gKi9cbmV4cG9ydCB0eXBlIHsgQmFja29mZkZ1bmN0aW9uLCBCYWNrb2ZmSml0dGVyLCBCYWNrb2ZmU3BlYywgU3RhdGVkV2FpdFJlYWRlciB9IGZyb20gJy4vbGliL2F0dGVtcHQvaW5kZXguanMnO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBDb3JyZWxhdGlvblxuICpcbiAqIFRoZSBydW4ncyBjb3JyZWxhdGlvbiAoMTAuMSk6IGBlbnYudHJhY2VwYXJlbnRgIChXM0MsIHBhcnNlZCBzdHJpY3RseSkgb3IgYGVudi50cmFjZUlkYCArIGBlbnYub3BlcmF0aW9uSWRgXG4gKiBiZWNvbWUgT05FIGZyb3plbiBgUnVuQ29ycmVsYXRpb25gIHBlciBydW4g4oCUIG9uIGBnZXRTbmFwc2hvdCgpLmNvcnJlbGF0aW9uYCwgZXZlcnkgZmxvdyBldmVudCdzXG4gKiBgdHJhdmVyc2FsQ29udGV4dC5jb3JyZWxhdGlvbmAgYW5kIGV2ZXJ5IHNjb3BlIGFuZCBlbWl0IGV2ZW50J3MgYGNvcnJlbGF0aW9uYC4gYHBhcnNlVHJhY2VwYXJlbnRgIC9cbiAqIGBmb3JtYXRUcmFjZXBhcmVudGAgYXJlIHRoZSBXM0MgY29kZWM7IGEgcmVmdXNlZCBoZWFkZXIgdGhyb3dzIGBUcmFjZXBhcmVudEVycm9yYCB3aXRoIGEgbmFtZWQgYHJlYXNvbmAuXG4gKi9cbmV4cG9ydCB0eXBlIHsgUGFyc2VkVHJhY2VwYXJlbnQsIFJ1bkNvcnJlbGF0aW9uLCBUcmFjZXBhcmVudEZpZWxkcywgVHJhY2VwYXJlbnRSZWZ1c2FsIH0gZnJvbSAnLi9saWIvYXR0ZW1wdC9pbmRleC5qcyc7XG5leHBvcnQgeyBmb3JtYXRUcmFjZXBhcmVudCwgcGFyc2VUcmFjZXBhcmVudCwgVHJhY2VwYXJlbnRFcnJvciB9IGZyb20gJy4vbGliL2F0dGVtcHQvaW5kZXguanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBSdW4g4oCUIEV4ZWN1dGUgY2hhcnRzIGFuZCBjb2xsZWN0IHJlc3VsdHNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBSdW4gKi9cbmV4cG9ydCB0eXBlIHtcbiAgQ2FwdHVyZUhpc3RvcnlPcHRpb25zLFxuICBDYXB0dXJlSGlzdG9yeVJlY2VpcHQsXG4gIENhcHR1cmVIaXN0b3J5U3RhdHVzLFxuICBDYXB0dXJlSGlzdG9yeVRhcmdldCxcbn0gZnJvbSAnLi9saWIvcnVubmVyL2luZGV4LmpzJztcbmV4cG9ydCB0eXBlIHsgUnVuUmVzdWx0IH0gZnJvbSAnLi9saWIvcnVubmVyL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBSdW4gKi9cbmV4cG9ydCB0eXBlIHsgRmxvd0NoYXJ0RXhlY3V0b3JPcHRpb25zIH0gZnJvbSAnLi9saWIvcnVubmVyL2luZGV4LmpzJztcblxuLyoqXG4gKiBUaGUgY3Jhc2gtc2FmZSByZWNvcmQgKDEwLjEpOiB0aGUgZXhlY3V0b3IncyBgc2lua2Agb3B0aW9uLCBpdHMgYWNjb3VudGluZyBvbiBgZ2V0U25hcHNob3QoKS5zaW5rYCxcbiAqIGBleGVjdXRvci5mbHVzaFJlY29yZCgpYCdzIHJlc3VsdCwgYW5kIHRoZSBlcnJvciBhIHJ1biB3aXRoIGBvbkZhaWx1cmU6ICdmYWlsJ2AgcmVqZWN0cyB3aXRoLiBUaGUgcG9ydFxuICogKGBSZWNvcmRTaW5rYCwgYG1lbW9yeVNpbmtgKSBpcyBgZm9vdHRyYWNlL3dyaXRlYCdzOyB0aGUgZmlsZSBhZGFwdGVyIGlzIGBmb290cHJpbnRqcy9zaW5rc2AuXG4gKiBAY2F0ZWdvcnkgUnVuXG4gKi9cbmV4cG9ydCB0eXBlIHtcbiAgUmVjb3JkRmx1c2hSZXN1bHQsXG4gIFJlY29yZFNpbmtGYWlsdXJlTW9kZSxcbiAgUmVjb3JkU2lua0ZsdXNoTW9kZSxcbiAgUmVjb3JkU2lua09wdGlvbixcbiAgUmVjb3JkU2lua09wdGlvbnMsXG4gIFJlY29yZFNpbmtTdGF0cyxcbn0gZnJvbSAnLi9saWIvcnVubmVyL2luZGV4LmpzJztcbi8qKiBAY2F0ZWdvcnkgUnVuICovXG5leHBvcnQgeyBSZWNvcmRTaW5rRXJyb3IgfSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuXG4vKipcbiAqIFRoZSBmb3VyIG9ic2VydmFiaWxpdHkgZGlhbHMgYEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9uc2AgaW5oZXJpdHMuXG4gKiBAY2F0ZWdvcnkgUnVuXG4gKi9cbmV4cG9ydCB0eXBlIHsgUnVuRGlhbHMgfSBmcm9tICcuL2xpYi9tZW1vcnkvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFJ1biAqL1xuZXhwb3J0IHsgRmxvd0NoYXJ0RXhlY3V0b3IgfSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFJ1biAqL1xuZXhwb3J0IHsgUnVuQ29udGV4dCB9IGZyb20gJy4vbGliL3J1bm5lci9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgUnVuICovXG5leHBvcnQgdHlwZSB7IENoYXJ0T3BlbkFQSU9wdGlvbnMsIE1DUFRvb2xEZXNjcmlwdGlvbiwgUnVubmFibGVGbG93Q2hhcnQgfSBmcm9tICcuL2xpYi9ydW5uZXIvUnVubmFibGVDaGFydC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE9ic2VydmUg4oCUIERhdGEgKHNjb3BlIHJlY29yZGVycywgZmlyZSBkdXJpbmcgc3RhZ2UgZXhlY3V0aW9uKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIERhdGEgKi9cbmV4cG9ydCB0eXBlIHtcbiAgQ29tbWl0RXZlbnQsXG4gIEVycm9yRXZlbnQsXG4gIFJlYWRFdmVudCxcbiAgUmVkYWN0aW9uUG9saWN5LFxuICBSZWRhY3Rpb25SZXBvcnQsXG4gIFNjb3BlUmVjb3JkZXIsXG4gIFN0YWdlRXZlbnQsXG4gIFdyaXRlRXZlbnQsXG59IGZyb20gJy4vbGliL3Njb3BlL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBEYXRhICovXG5leHBvcnQgeyBNZXRyaWNSZWNvcmRlciB9IGZyb20gJy4vbGliL3Njb3BlL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBEYXRhICovXG5leHBvcnQgeyBEZWJ1Z1JlY29yZGVyIH0gZnJvbSAnLi9saWIvc2NvcGUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIE9wZXJhdGlvbiAqL1xuZXhwb3J0IHsgUmVjb3JkZXJPcGVyYXRpb24gfSBmcm9tICcuL2xpYi9yZWNvcmRlci9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IE9ic2VydmUg4oCUIERlbGl2ZXJ5IHRpZXIgKFJGQy0wMDEgZGVmZXJyZWQgb2JzZXJ2ZXJzKVxuICpcbiAqIEV2ZXJ5IGBhdHRhY2gqUmVjb3JkZXJgIGNhbGwgYWNjZXB0cyBhbiBvcHRpb25zIGJhZzpcbiAqIGBleGVjdXRvci5hdHRhY2hTY29wZVJlY29yZGVyKHJlYywgeyBkZWxpdmVyeTogJ2RlZmVycmVkJyB9KWAgdGFrZXMgdGhlXG4gKiByZWNvcmRlciBPVVQgb2YgdGhlIGVuZ2luZSdzIGhvdCBwYXRoIOKAlCBldmVudHMgYXJlIGNhcHR1cmVkIGludG8gb25lXG4gKiBib3VuZGVkLCB0b3RhbGx5LW9yZGVyZWQgcXVldWUgYW5kIGRlbGl2ZXJlZCBhdCB0aGUgbmV4dCBtaWNyb3Rhc2tcbiAqIGNoZWNrcG9pbnQgKFwib25lIGJlYXQgYmVoaW5kXCIpLiBPbWl0IGBkZWxpdmVyeWAgZm9yIHRoZSBoaXN0b3JpY2FsXG4gKiBzeW5jaHJvbm91cyBjYWxsIChieXRlLWlkZW50aWNhbCB0byBwcmV2aW91cyByZWxlYXNlcykuIEFjY291bnRpbmdcbiAqIHN1cmZhY2VzIG9uIGBzbmFwc2hvdC5vYnNlcnZlclN0YXRzYDsgYGV4ZWN1dG9yLmRyYWluT2JzZXJ2ZXJzKClgIHNldHRsZXNcbiAqIGFzeW5jIGxpc3RlbmVycyBiZWZvcmUgc2h1dGRvd24uIFNlZSBgZG9jcy9ndWlkZXMvb2JzZXJ2ZXJzLWRlZmVycmVkLm1kYC5cbiAqL1xuZXhwb3J0IHR5cGUge1xuICBBdHRhY2hSZWNvcmRlck9wdGlvbnMsXG4gIE9ic2VydmVyRGVsaXZlcnksXG4gIE9ic2VydmVyRHJhaW5SZXN1bHQsXG4gIE9ic2VydmVyU3RhdHMsXG59IGZyb20gJy4vbGliL3J1bm5lci9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IE9ic2VydmUg4oCUIERlbGl2ZXJ5IHRpZXIgKFJGQy0wMDEgZGVmZXJyZWQgb2JzZXJ2ZXJzKVxuICpcbiAqIGBDYXB0dXJlUG9saWN5YCDigJQgaG93IGEgZGVmZXJyZWQgZXZlbnQncyBwYXlsb2FkIGlzIG1hdGVyaWFsaXplZCBhdFxuICogY2FwdHVyZSB0aW1lIChgJ2Nsb25lJ2AgYnkgZGVmYXVsdCBmb3IgYXR0YWNoIG9wdGlvbnMgLyBgJ3N1bW1hcnknYCAvIGAncmVmJ2ApLiBgT3ZlcmZsb3dQb2xpY3lgXG4gKiDigJQgd2hhdCBhIHNhdHVyYXRlZCBxdWV1ZSBkb2VzIChgJ2Ryb3Atb2xkZXN0J2AgZGVmYXVsdCAvIGAnc2FtcGxlJ2AgL1xuICogYCdibG9jaydgKS4gYERpc3BhdGNoZXJTdGF0c2AgLyBgTGlzdGVuZXJTdGF0c2Ag4oCUIHRoZSBhY2NvdW50aW5nIHNoYXBlc1xuICogZW1iZWRkZWQgaW4gYE9ic2VydmVyU3RhdHNgLiBUeXBlcyBvbmx5IOKAlCB0aGUgb2JzZXJ2ZXItcXVldWUgbW9kdWxlXG4gKiBpdHNlbGYgaXMgaW50ZXJuYWw7IGNvbnN1bWVycyB1c2UgdGhlIGF0dGFjaCBvcHRpb25zLlxuICovXG5leHBvcnQgdHlwZSB7IENhcHR1cmVQb2xpY3ksIERpc3BhdGNoZXJTdGF0cywgTGlzdGVuZXJTdGF0cywgT3ZlcmZsb3dQb2xpY3kgfSBmcm9tICcuL2xpYi9vYnNlcnZlci1xdWV1ZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgQ29tYmluZWQgKGJvdGggZGF0YS1mbG93IGFuZCBjb250cm9sLWZsb3cpICovXG5leHBvcnQgdHlwZSB7IENvbWJpbmVkUmVjb3JkZXIgfSBmcm9tICcuL2xpYi9yZWNvcmRlci9pbmRleC5qcyc7XG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIENvbWJpbmVkIChib3RoIGRhdGEtZmxvdyBhbmQgY29udHJvbC1mbG93KSAqL1xuZXhwb3J0IHtcbiAgaGFzRW1pdFJlY29yZGVyTWV0aG9kcyxcbiAgaGFzRmxvd1JlY29yZGVyTWV0aG9kcyxcbiAgaGFzUmVjb3JkZXJNZXRob2RzLFxuICBpc0Zsb3dFdmVudCxcbn0gZnJvbSAnLi9saWIvcmVjb3JkZXIvaW5kZXguanMnO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBFbWl0ICh1c2VyLWF1dGhvcmVkIHN0cnVjdHVyZWQgZXZlbnRzKVxuICpcbiAqIFRoaXJkIG9ic2VydmVyIGNoYW5uZWwgKGFsb25nc2lkZSBgU2NvcGVSZWNvcmRlcmAgYW5kIGBGbG93UmVjb3JkZXJgKS4gQ29uc3VtZXJcbiAqIGNvZGUgY2FsbHMgYHNjb3BlLiRlbWl0KG5hbWUsIHBheWxvYWQpYCBmcm9tIGluc2lkZSBhIHN0YWdlOyBldmVyeSBhdHRhY2hlZFxuICogYEVtaXRSZWNvcmRlci5vbkVtaXQoZXZlbnQpYCBmaXJlcyBzeW5jaHJvbm91c2x5IHdpdGggc3RhZ2UtY29udGV4dFxuICogZW5yaWNobWVudC4gUGFzcy10aHJvdWdoIOKAlCBubyBidWZmZXJpbmcsIHplcm8gYWxsb2NhdGlvbiB3aGVuIG5vIHJlY29yZGVyXG4gKiBpcyBhdHRhY2hlZC5cbiAqL1xuZXhwb3J0IHR5cGUgeyBFbWl0RXZlbnQsIEVtaXRSZWNvcmRlciB9IGZyb20gJy4vbGliL3JlY29yZGVyL2luZGV4LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gT2JzZXJ2ZSDigJQgRmxvdyAoRmxvd1JlY29yZGVyLCBmaXJlcyBhZnRlciBzdGFnZSBleGVjdXRpb24pXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHR5cGUge1xuICBGbG93QXR0ZW1wdEV2ZW50LFxuICBGbG93QnJlYWtFdmVudCxcbiAgRmxvd0RlY2lzaW9uRXZlbnQsXG4gIEZsb3dFcnJvckV2ZW50LFxuICBGbG93Rm9ya0V2ZW50LFxuICBGbG93TG9vcEV2ZW50LFxuICBGbG93TmV4dEV2ZW50LFxuICBGbG93UmVjb3JkZXIsXG4gIEZsb3dSdW5FdmVudCxcbiAgRmxvd1J1bkZhaWxlZEV2ZW50LFxuICBGbG93U2VsZWN0ZWRFdmVudCxcbiAgRmxvd1N0YWdlRXZlbnQsXG4gIEZsb3dTdGFnZVJldHJ5RXZlbnQsXG4gIEZsb3dTdWJmbG93RXZlbnQsXG4gIEZsb3dTdWJmbG93UmVnaXN0ZXJlZEV2ZW50LFxuICBGbG93VGhyb3R0bGVkRXZlbnQsXG4gIFJlc3VtZUxpbmssXG4gIFRyYXZlcnNhbENvbnRleHQsXG59IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHR5cGUgeyBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5IH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvd1xuICpcbiAqIGBOYXJyYXRpdmVGb3JtYXR0ZXJgIOKAlCBwbHVnZ2FibGUgZm9ybWF0dGVyIHRoYXQgY29udmVydHMgZXZlbnQgY29udGV4dFxuICogb2JqZWN0cyBpbnRvIHRoZSB0ZXh0IGxpbmVzIG9mIHRoZSBuYXJyYXRpdmUuXG4gKi9cbmV4cG9ydCB0eXBlIHsgTmFycmF0aXZlRm9ybWF0dGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgeyBOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB0eXBlIHsgTWFuaWZlc3RBdHRlbXB0Um93LCBNYW5pZmVzdEVudHJ5IH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgeyBNYW5pZmVzdEZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHsgQWRhcHRpdmVOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB7IE1pbGVzdG9uZU5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHsgUHJvZ3Jlc3NpdmVOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB7IFJMRU5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHsgU2VwYXJhdGVOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB7IFNpbGVudE5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHsgV2luZG93ZWROYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBTZWxmLURlc2NyaWJpbmcg4oCUIC5jb250cmFjdCgpLCB0b09wZW5BUEkoKSwgdG9NQ1BUb29sKClcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBTZWxmLURlc2NyaWJpbmcgKi9cbmV4cG9ydCB0eXBlIHsgSnNvblNjaGVtYSB9IGZyb20gJy4vbGliL2NvbnRyYWN0L2luZGV4LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU25hcHNob3QgJiBDb21wb3NpdGlvbiDigJQgU3ViZmxvdyBuYXZpZ2F0aW9uIGFuZCBDb21wb3NhYmxlUnVubmVyXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgU25hcHNob3QgJiBDb21wb3NpdGlvbiAqL1xuZXhwb3J0IHR5cGUgeyBDb21wb3NhYmxlUnVubmVyIH0gZnJvbSAnLi9saWIvcnVubmVyL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBTbmFwc2hvdCAmIENvbXBvc2l0aW9uICovXG5leHBvcnQgdHlwZSB7IFJlY29yZGVyU25hcHNob3QsIFJ1bnRpbWVTbmFwc2hvdCwgU3VidHJlZVNuYXBzaG90IH0gZnJvbSAnLi9saWIvcnVubmVyL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBTbmFwc2hvdCAmIENvbXBvc2l0aW9uICovXG5leHBvcnQgeyBnZXRTdWJ0cmVlU25hcHNob3QsIGxpc3RTdWJmbG93UGF0aHMgfSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBTY29wZVJlY29yZGVyIENvbXBvc2l0aW9uIOKAlCBCdW5kbGUgbXVsdGlwbGUgcmVjb3JkZXJzIGludG8gZG9tYWluIHByZXNldHNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBTY29wZVJlY29yZGVyICovXG5leHBvcnQgeyBDb21wb3NpdGVSZWNvcmRlciB9IGZyb20gJy4vbGliL3JlY29yZGVyL2luZGV4LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUGF1c2UvUmVzdW1lIOKAlCBTZXJpYWxpemFibGUgY2hlY2twb2ludHMgZm9yIGxvbmctcnVubmluZyBvciBodW1hbi1pbi10aGUtbG9vcCBmbG93c1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IFBhdXNlL1Jlc3VtZSAqL1xuLyoqIEBjYXRlZ29yeSBQYXVzZS9SZXN1bWUgKi9cbmV4cG9ydCB0eXBlIHtcbiAgRmxvd2NoYXJ0Q2hlY2twb2ludCxcbiAgUGF1c2FibGVIYW5kbGVyLFxuICBQYXVzZWRFeGVjdXRpb24sXG4gIFBlbmRpbmdQYXVzZSxcbiAgUmVkYWN0aW9uTWFya3MsXG59IGZyb20gJy4vbGliL3BhdXNlL2luZGV4LmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgUGF1c2UvUmVzdW1lXG4gKlxuICogYGludGVycnVwdChzY29wZSwgeyByZWFzb24sIGV4cGVjdHM/IH0pYCDigJQgc3RvcCBtaWQtc3RhZ2UgdG8gYXNrIGEgcXVlc3Rpb24sXG4gKiBhbmQgZ2V0IHRoZSBhbnN3ZXIgYmFjayBhdCB0aGUgc2FtZSBjYWxsIHNpdGUgd2hlbiB0aGUgcnVuIHJlc3VtZXMuIFJlc3VtZVxuICogcmUtZW50ZXJzIHRoZSBzdGFnZSBmcm9tIGl0cyBUT1AgKHN0YWdlcyBhcmUgYXRvbWljKSwgc28ga2VlcCB0aGUgaGFsZlxuICogYmVmb3JlIHRoZSBjYWxsIGlkZW1wb3RlbnQuXG4gKi9cbmV4cG9ydCB0eXBlIHsgSW50ZXJydXB0UGF5bG9hZCB9IGZyb20gJy4vbGliL3BhdXNlL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBQYXVzZS9SZXN1bWUgKi9cbmV4cG9ydCB7IGludGVycnVwdCB9IGZyb20gJy4vbGliL3BhdXNlL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBTY29wZVJlY29yZGVyICovXG5leHBvcnQgdHlwZSB7IENvbXBvc2l0ZVNuYXBzaG90IH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvaW5kZXguanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBDb25maWd1cmF0aW9uIOKAlCBUeXBlcyBwYXNzZWQgdG8gRmxvd0NoYXJ0RXhlY3V0b3IgYW5kIHJ1bigpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgQ29uZmlndXJhdGlvbiAqL1xuZXhwb3J0IHR5cGUgeyBFeGVjdXRpb25FbnYsIEV4ZWN1dG9yUmVzdWx0LCBQYXVzZWRSZXN1bHQsIFJ1bk9wdGlvbnMgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IENvbmZpZ3VyYXRpb24gKi9cbmV4cG9ydCB0eXBlIHsgU2NvcGVGYWN0b3J5IH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgQ29uZmlndXJhdGlvblxuICpcbiAqIFJlYWQtdHJhY2tpbmcgcG9saWN5IGZvciBgU3RhZ2VTbmFwc2hvdC5zdGFnZVJlYWRzYCAoIzE0KTpcbiAqIGAnZnVsbCdgIChkZWZhdWx0IOKAlCBwZXItcmVhZCB2YWx1ZSBjbG9uZSwgaGlzdG9yaWNhbCBiZWhhdmlvcikgL1xuICogYCdzdW1tYXJ5J2AgKGNoZWFwIGBSZWFkU3VtbWFyeU1hcmtlcmAgcGVyIHJlYWQpIC8gYCdvZmYnYCAobm8gdHJhY2tpbmcsXG4gKiB6ZXJvIHBlci1yZWFkIGNsb25lKS4gUGFzcyBhcyBgbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCB7IHJlYWRUcmFja2luZyB9KWBcbiAqIG9yIGNhbGwgYGV4ZWN1dG9yLnNldFJlYWRUcmFja2luZyhtb2RlKWAgYmVmb3JlIGBydW4oKWAuXG4gKi9cbmV4cG9ydCB0eXBlIHsgUmVhZFN1bW1hcnlNYXJrZXIsIFJlYWRUcmFja2luZ01vZGUgfSBmcm9tICcuL2xpYi9tZW1vcnkvaW5kZXguanMnO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBDb25maWd1cmF0aW9uXG4gKlxuICogV3JpdGUtdHJhY2tpbmcgcG9saWN5IGZvciBgU3RhZ2VTbmFwc2hvdC5zdGFnZVdyaXRlc2AgKCMxM2MtQSkg4oCUIHRoZVxuICogc2libGluZyBvZiBgUmVhZFRyYWNraW5nTW9kZWA7IGJvdGggYWxpYXMgdGhlIHNoYXJlZCBgUmV0ZW50aW9uUG9saWN5YFxuICogZmFtaWx5IGZyb20gYGxpYi9jYXB0dXJlYC4gYCdmdWxsJ2AgKGRlZmF1bHQg4oCUIHBlci13cml0ZSB2YWx1ZSBjbG9uZSxcbiAqIGhpc3RvcmljYWwgYmVoYXZpb3IpIC8gYCdzdW1tYXJ5J2AgKGNoZWFwIGBXcml0ZVN1bW1hcnlNYXJrZXJgIHBlciB3cml0ZSlcbiAqIC8gYCdvZmYnYCAobm8gdHJhY2tpbmc7IGBzdGFnZVdyaXRlc2AgYWJzZW50IGFuZCB0aGUgYG9uQ29tbWl0YCBtdXRhdGlvbnNcbiAqIHBheWxvYWQgaXMgZW1wdHkg4oCUIHdyaXRlcyB0aGVtc2VsdmVzIHN0aWxsIGNvbW1pdCwgYW5kIHRoZSBjb21taXQgbG9nIGlzXG4gKiB1bmFmZmVjdGVkKS4gUGFzcyBhcyBgbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCB7IHdyaXRlVHJhY2tpbmcgfSlgIG9yXG4gKiBjYWxsIGBleGVjdXRvci5zZXRXcml0ZVRyYWNraW5nKG1vZGUpYCBiZWZvcmUgYHJ1bigpYC5cbiAqL1xuZXhwb3J0IHR5cGUgeyBSZXRlbnRpb25Qb2xpY3ksIFdyaXRlU3VtbWFyeU1hcmtlciwgV3JpdGVUcmFja2luZ01vZGUgfSBmcm9tICcuL2xpYi9tZW1vcnkvaW5kZXguanMnO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBDb25maWd1cmF0aW9uXG4gKlxuICogQ29tbWl0LXZhbHVlcyBlbmNvZGluZyBmb3IgdGhlIENPTU1JVCBMT0cgKCMxM2MtQikg4oCUIHRoZSB0aGlyZCBkaWFsIG9mXG4gKiB0aGUgZmFtaWx5LCBhbmQgdGhlIG9ubHkgTE9TU0xFU1Mgb25lIChpdCBjaGFuZ2VzIHRoZSBsb2cncyBlbmNvZGluZyxcbiAqIG5ldmVyIGl0cyBpbmZvcm1hdGlvbikuIGAnZnVsbCdgIChkZWZhdWx0IOKAlCBldmVyeSBzdXJ2aXZpbmcgYHNldGAgc3RvcmVzXG4gKiB0aGUgZnVsbCBmaW5hbCB2YWx1ZSwgYnl0ZS1pZGVudGljYWwgdG8gaGlzdG9yeSkgLyBgJ2RlbHRhJ2AgKGFycmF5XG4gKiBuZXQtY2hhbmdlcyB0aGF0IGFyZSBcImJhc2UgcGx1cyBhIHRhaWxcIiBjb21taXQgYXMgYW4gYGFwcGVuZGAgdmVyYlxuICogc3RvcmluZyBvbmx5IHRoZSB0YWlsOyBgZGVsZXRlVmFsdWUoKWAgY29tbWl0cyBhcyBhIHJlYWwgYGRlbGV0ZWAgdmVyYjtcbiAqIG9uZSB0cmFjZSBlbnRyeSBwZXIgc3Vydml2aW5nIHBhdGgpLiBSZXBsYXkgcmVjb25zdHJ1Y3RzIGV2ZXJ5IHN0ZXAnc1xuICogZnVsbCBzdGF0ZSBleGFjdGx5LiBDb25zdW1lcnMgcmVhZGluZyBgYnVuZGxlLm92ZXJ3cml0ZVtrZXldYCBhcyB0aGUgZnVsbFxuICogdmFsdWUgbXVzdCB1c2UgYGNvbW1pdFZhbHVlQXRgIGZyb20gYGZvb3R0cmFjZWAuIFBhc3MgYXNcbiAqIGBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHsgY29tbWl0VmFsdWVzIH0pYCBvciBjYWxsXG4gKiBgZXhlY3V0b3Iuc2V0Q29tbWl0VmFsdWVzKG1vZGUpYCBiZWZvcmUgYHJ1bigpYDsgdGhlIGFjdGl2ZSBtb2RlIGlzIHRoZVxuICogc25hcHNob3QgZGlzY3JpbWluYW50IGBnZXRTbmFwc2hvdCgpLmNvbW1pdFZhbHVlc2AuXG4gKi9cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQ29udHJhY3QgJiBWYWxpZGF0aW9uXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgQ29udHJhY3QgJiBWYWxpZGF0aW9uICovXG5leHBvcnQgdHlwZSB7IFNjaGVtYUtpbmQsIFZhbGlkYXRpb25Jc3N1ZSwgVmFsaWRhdGlvblJlc3VsdCB9IGZyb20gJy4vbGliL3NjaGVtYS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgQ29udHJhY3QgJiBWYWxpZGF0aW9uICovXG5leHBvcnQgeyBkZXRlY3RTY2hlbWEsIGlzVmFsaWRhdGFibGUsIGlzWm9kIH0gZnJvbSAnLi9saWIvc2NoZW1hL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBDb250cmFjdCAmIFZhbGlkYXRpb24gKi9cbmV4cG9ydCB7IElucHV0VmFsaWRhdGlvbkVycm9yLCB2YWxpZGF0ZUFnYWluc3RTY2hlbWEsIHZhbGlkYXRlT3JUaHJvdyB9IGZyb20gJy4vbGliL3NjaGVtYS9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEVycm9yIFV0aWxpdGllc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IEVycm9yIFV0aWxpdGllcyAqL1xuZXhwb3J0IHR5cGUgeyBTdHJ1Y3R1cmVkRXJyb3JJbmZvIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBFcnJvciBVdGlsaXRpZXMgKi9cbmV4cG9ydCB7IGV4dHJhY3RFcnJvckluZm8sIGZvcm1hdEVycm9ySW5mbyB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIERldiBUb29scyDigJQgTW9kZSBmbGFncyBhbmQgWm9kIHNjb3BlIHV0aWxpdGllc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEBjYXRlZ29yeSBEZXYgVG9vbHNcbiAqXG4gKiBHbG9iYWwgZGV2LW1vZGUgZmxhZy4gQ2FsbCBgZW5hYmxlRGV2TW9kZSgpYCBhdCBhcHBsaWNhdGlvbiBzdGFydHVwIHRvXG4gKiB0dXJuIG9uIGRldmVsb3Blci1vbmx5IGRpYWdub3N0aWNzIGFjcm9zcyB0aGUgbGlicmFyeSDigJQgY2lyY3VsYXItcmVmZXJlbmNlXG4gKiBkZXRlY3Rpb24gaW4gc2NvcGUgd3JpdGVzLCB3YXJuaW5ncyB3aGVuIGEgcmVjb3JkZXIgaGFzIG5vIG9ic2VydmVyXG4gKiBtZXRob2RzLCBzdXNwaWNpb3VzLXByZWRpY2F0ZSB3YXJuaW5ncyBpbiBkZWNpZGUvc2VsZWN0LCBzdHJ1Y3R1cmFsXG4gKiBjaGVja3MgaW4gYGdldFN1YnRyZWVTbmFwc2hvdGAsIGFuZCBhbnkgZnV0dXJlIGRldi1vbmx5IGRpYWdub3N0aWMuXG4gKlxuICogUHJvZHVjdGlvbiBsZWF2ZXMgaXQgT0ZGIGJ5IGRlZmF1bHQgKHplcm8gb3ZlcmhlYWQpLiBTZWUgdGhlIEpTRG9jIG9uXG4gKiBgZW5hYmxlRGV2TW9kZWAgZm9yIHRoZSBmdWxsIGxpc3QgYW5kIHVzYWdlIGV4YW1wbGUuXG4gKi9cbmV4cG9ydCB7IGRpc2FibGVEZXZNb2RlLCBlbmFibGVEZXZNb2RlLCBpc0Rldk1vZGUgfSBmcm9tICcuL2xpYi9kZXZNb2RlLmpzJztcblxuLy8gYGRlZmluZVNjb3BlRnJvbVpvZGAgYW5kIHRoZSBvdGhlciB6b2QtYmFzZWQgc2NvcGUgaGVscGVycyBtb3ZlZCB0byB0aGUgb3B0LWluXG4vLyBgZm9vdHByaW50anMvem9kYCBlbnRyeSDigJQga2VlcGluZyB6b2Qgb3V0IG9mIHRoZSBjb3JlIGxvYWQgcGF0aCAoaXQgaXMgYW5cbi8vIG9wdGlvbmFsIHBlZXIpLiBJbXBvcnQgdGhlbSBmcm9tICdmb290cHJpbnRqcy96b2QnLlxuLy8gQSBydW4ncyByZWNvcmQgYXMgSlNPTiB3aXRob3V0IHRoZSBlbmdpbmUncyByZWN1cnNpb24gbGltaXQgKDkuMjYuMCk6IHRoZVxuLy8gc2FtZSBieXRlcyBKU09OLnN0cmluZ2lmeSBlbWl0cywgZm9yIGEgZGVlcCBgbmV4dGAgY2hhaW4gaXQgY2Fubm90IGVuY29kZS5cbmV4cG9ydCB0eXBlIHsgUmV0cnlMb29wQ2FsbCwgUmV0cnlMb29wRGVjaXNpb24sIFJldHJ5TG9vcElkZW50aXR5IH0gZnJvbSAnLi9saWIvYXR0ZW1wdC9yZXRyeUxvb3BUeXBlcy5qcyc7XG5leHBvcnQgdHlwZSB7IFJldHJ5TG9vcENvbnRleHQsIFJldHJ5TG9vcE9wdGlvbnMsIFJldHJ5TG9vcFN0YXRlIH0gZnJvbSAnLi9saWIvYnVpbGRlci9yZXRyeUxvb3AuanMnO1xuZXhwb3J0IHR5cGUge1xuICBDYXB0dXJlQ2hhbm5lbFN0YXR1cyxcbiAgQ2FwdHVyZUxpbWl0YXRpb24sXG4gIE5hdGl2ZUNhcHR1cmVOb3RlLFxuICBSZWNvcmRlckNhcHR1cmVBY2tub3dsZWRnZW1lbnQsXG59IGZyb20gJy4vbGliL2NhcHR1cmUvbmF0aXZlQ292ZXJhZ2UuanMnO1xuZXhwb3J0IHR5cGUge1xuICBFbmdpbmVSZWFkU291cmNlcyxcbiAgTmF0aXZlQ2FwdHVyZU9ic2VydmF0aW9uLFxuICBOYXRpdmVSZWFkQ2FwdHVyZU5vdGUsXG4gIFNvdXJjZUxpbWl0YXRpb24sXG59IGZyb20gJy4vbGliL2NhcHR1cmUvcmVhZFNvdXJjZXMuanMnO1xuZXhwb3J0IHR5cGUge1xuICBTb3VyY2VFeGVjdXRpb25Pd25lcnNoaXAsXG4gIFNvdXJjZU93bmVyc2hpcEdhcCxcbiAgU291cmNlT3duZXJzaGlwV2l0bmVzcyxcbn0gZnJvbSAnLi9saWIvY2FwdHVyZS9zb3VyY2VPd25lcnNoaXBGb3JtYXQuanMnO1xuZXhwb3J0IHsgc3RyaW5naWZ5U25hcHNob3QgfSBmcm9tICcuL2xpYi9ydW5uZXIvc3RyaW5naWZ5U25hcHNob3QuanMnO1xuIl19
@@ -0,0 +1,96 @@
1
+ /**
2
+ * attempt/backoff.ts — deterministic builders of a `RetryPolicy.backoffMs` function.
3
+ *
4
+ * WHY: every retry loop needs the same few lines — an exponential ceiling and some jitter — and every hand copy of them
5
+ * drifts: a different base, a different jitter, a stated `Retry-After` honoured in one loop and not the next. These
6
+ * helpers build the FUNCTION `RetryPolicy.backoffMs` already takes, so the policy keeps its one shape and the runner
7
+ * keeps its one law: it asks the function once per retry, caps the answer at `maxBackoffMs`, stops a series whose wait
8
+ * would outlast the run's deadline (`no-time-left`), and records the wait it chose (`AttemptRecord.delayMs`,
9
+ * `onStageRetry`'s `delayMs`). The trace explains every wait as it was waited; nothing is redrawn to explain it.
10
+ *
11
+ * exponentialBackoff({ baseDelayMs, multiplier = 2, maxDelayMs?, jitter = 'none', random = Math.random })
12
+ * the wait after failed attempt n, under its ceiling c = min(maxDelayMs, baseDelayMs × multiplier^(n − 1)):
13
+ * 'none' → c deterministic: `random` is never called
14
+ * 'equal' → c/2 + r × c/2 half fixed, half random (r = random(), in [0, 1])
15
+ * 'full' → r × c
16
+ * statedWaitFirst(readStatedWaitMs, inner)
17
+ * a wait the outside system STATED (a `Retry-After`, read off the error) wins; otherwise `inner` decides.
18
+ *
19
+ * TWO CAPS, two jobs:
20
+ * - `BackoffSpec.maxDelayMs` caps the SCHEDULE: it bounds the ceiling BEFORE the draw, so a capped schedule keeps its
21
+ * jitter. Capping after the draw instead would flatten every jittered wait to one constant once the schedule
22
+ * passes twice the cap — a fleet would retry in lockstep, which is what jitter is for preventing.
23
+ * - `RetryPolicy.maxBackoffMs` caps EVERY wait, a stated one included, after the draw; the runner enforces it and the
24
+ * static time budget counts a function backoff at it without calling it.
25
+ * A stated wait is never capped by the inner schedule's `maxDelayMs` — only `maxBackoffMs` and the deadline bound it.
26
+ * Without `maxDelayMs` a ceiling saturates at `Number.MAX_SAFE_INTEGER` ms, so no attempt makes a wait `Infinity`.
27
+ *
28
+ * THE SERVER CHOOSES A STATED WAIT. `statedWaitFirst` hands the wait to the outside system — a broken or hostile one
29
+ * can ask for an hour. Whenever the wait comes from the server, declare the policy's `maxBackoffMs` (the runner caps
30
+ * every wait at it) or run under a deadline (the runner stops a series whose wait would outlast it).
31
+ *
32
+ * Refused when built — by the field's name and the shape it needs, NEVER the value it was given (a field can hold a
33
+ * secret): a `TypeError` for a wrong type (`'100'` included), a `RangeError` for a number out of range. The rules: a
34
+ * `baseDelayMs` that is a finite number >= 0, a `multiplier` >= 1, a `maxDelayMs` >= `baseDelayMs`, a `jitter` of the
35
+ * three names, a `random` or a reader that is a function, an `inner` that is a function or a finite number >= 0.
36
+ *
37
+ * A DRAW IS NOT TRUSTED BLINDLY: a `random()` that answers anything but a number in [0, 1] — or throws — makes that
38
+ * wait the ceiling `c`, the longest the schedule allows. Never 0: a broken source cannot make every jittered retry
39
+ * fire at once. The default source is `Math.random`, looked up at each draw (so a spy installed later takes effect).
40
+ */
41
+ import type { RetryPolicy } from './types.js';
42
+ /** How much of an exponential wait is random: none of it, half of it, or all of it. */
43
+ export type BackoffJitter = 'none' | 'equal' | 'full';
44
+ /** The schedule {@link exponentialBackoff} builds a `RetryPolicy.backoffMs` function from. */
45
+ export interface BackoffSpec {
46
+ /** The ceiling of the first wait (after attempt 1), in milliseconds — a finite number >= 0. */
47
+ readonly baseDelayMs: number;
48
+ /** How much each ceiling grows over the one before — a finite number >= 1. Default `2`. */
49
+ readonly multiplier?: number;
50
+ /**
51
+ * The most a ceiling may grow to, in milliseconds — a finite number >= `baseDelayMs`. It caps the SCHEDULE before
52
+ * the jitter is drawn, so waits at the cap still spread (`'equal'` between `maxDelayMs / 2` and `maxDelayMs`). It
53
+ * is not `RetryPolicy.maxBackoffMs`, which caps every wait after the draw, a stated one included. Absent: the
54
+ * ceiling grows until it saturates at `Number.MAX_SAFE_INTEGER`.
55
+ */
56
+ readonly maxDelayMs?: number;
57
+ /** How much of each wait is random. Default `'none'`: the wait IS the ceiling. */
58
+ readonly jitter?: BackoffJitter;
59
+ /**
60
+ * The jitter's random source, answering in [0, 1]. Default `Math.random`, looked up at each draw; a fixed one makes a
61
+ * test exact. A draw outside [0, 1] (or a throw) makes that wait the ceiling — never 0.
62
+ */
63
+ readonly random?: () => number;
64
+ }
65
+ /** A `RetryPolicy.backoffMs` function: the wait in milliseconds after failed attempt `attempt` (1-based). */
66
+ export type BackoffFunction = (attempt: number, error?: unknown) => number;
67
+ /** Reads the wait an error states (a parsed `Retry-After`), in milliseconds, or `undefined` when it states none. */
68
+ export type StatedWaitReader = (error: unknown) => number | undefined;
69
+ /**
70
+ * A `RetryPolicy.backoffMs` function for an exponential schedule: the wait after failed attempt `n` is drawn under the
71
+ * ceiling `min(maxDelayMs, baseDelayMs × multiplier^(n − 1))` by the declared jitter — the schedule is capped BEFORE
72
+ * the draw, so it keeps its spread. The policy's `maxBackoffMs` still caps every wait after it.
73
+ *
74
+ * @example
75
+ * ```ts
76
+ * .retry({ attempts: 6, backoffMs: exponentialBackoff({ baseDelayMs: 200, maxDelayMs: 2_000, jitter: 'equal' }), maxBackoffMs: 5_000 })
77
+ * ```
78
+ */
79
+ export declare function exponentialBackoff(spec: BackoffSpec): BackoffFunction;
80
+ /**
81
+ * A `RetryPolicy.backoffMs` function that honours a wait the outside system stated: when `readStatedWaitMs(error)`
82
+ * answers a finite number >= 0, that is the wait; otherwise `inner` (a backoff function, or a fixed number of
83
+ * milliseconds) decides. A reader that throws or answers anything else states nothing — a malformed `Retry-After`
84
+ * falls back to the schedule rather than to a wrong wait. The runner still caps the stated wait at `maxBackoffMs` and
85
+ * stops the series when it would outlast the run's deadline.
86
+ *
87
+ * The outside system chooses this wait, and a broken or hostile one can ask for an hour: whenever the wait comes from
88
+ * the server, declare the policy's `maxBackoffMs` (or run under a deadline).
89
+ *
90
+ * @example
91
+ * ```ts
92
+ * const retryAfterMs = (error: unknown) => (error as { retryAfterMs?: number }).retryAfterMs;
93
+ * .retry({ attempts: 3, backoffMs: statedWaitFirst(retryAfterMs, exponentialBackoff({ baseDelayMs: 100 })), maxBackoffMs: 10_000 })
94
+ * ```
95
+ */
96
+ export declare function statedWaitFirst(readStatedWaitMs: StatedWaitReader, inner: NonNullable<RetryPolicy['backoffMs']>): BackoffFunction;
@@ -0,0 +1,173 @@
1
+ /**
2
+ * attempt/backoff.ts — deterministic builders of a `RetryPolicy.backoffMs` function.
3
+ *
4
+ * WHY: every retry loop needs the same few lines — an exponential ceiling and some jitter — and every hand copy of them
5
+ * drifts: a different base, a different jitter, a stated `Retry-After` honoured in one loop and not the next. These
6
+ * helpers build the FUNCTION `RetryPolicy.backoffMs` already takes, so the policy keeps its one shape and the runner
7
+ * keeps its one law: it asks the function once per retry, caps the answer at `maxBackoffMs`, stops a series whose wait
8
+ * would outlast the run's deadline (`no-time-left`), and records the wait it chose (`AttemptRecord.delayMs`,
9
+ * `onStageRetry`'s `delayMs`). The trace explains every wait as it was waited; nothing is redrawn to explain it.
10
+ *
11
+ * exponentialBackoff({ baseDelayMs, multiplier = 2, maxDelayMs?, jitter = 'none', random = Math.random })
12
+ * the wait after failed attempt n, under its ceiling c = min(maxDelayMs, baseDelayMs × multiplier^(n − 1)):
13
+ * 'none' → c deterministic: `random` is never called
14
+ * 'equal' → c/2 + r × c/2 half fixed, half random (r = random(), in [0, 1])
15
+ * 'full' → r × c
16
+ * statedWaitFirst(readStatedWaitMs, inner)
17
+ * a wait the outside system STATED (a `Retry-After`, read off the error) wins; otherwise `inner` decides.
18
+ *
19
+ * TWO CAPS, two jobs:
20
+ * - `BackoffSpec.maxDelayMs` caps the SCHEDULE: it bounds the ceiling BEFORE the draw, so a capped schedule keeps its
21
+ * jitter. Capping after the draw instead would flatten every jittered wait to one constant once the schedule
22
+ * passes twice the cap — a fleet would retry in lockstep, which is what jitter is for preventing.
23
+ * - `RetryPolicy.maxBackoffMs` caps EVERY wait, a stated one included, after the draw; the runner enforces it and the
24
+ * static time budget counts a function backoff at it without calling it.
25
+ * A stated wait is never capped by the inner schedule's `maxDelayMs` — only `maxBackoffMs` and the deadline bound it.
26
+ * Without `maxDelayMs` a ceiling saturates at `Number.MAX_SAFE_INTEGER` ms, so no attempt makes a wait `Infinity`.
27
+ *
28
+ * THE SERVER CHOOSES A STATED WAIT. `statedWaitFirst` hands the wait to the outside system — a broken or hostile one
29
+ * can ask for an hour. Whenever the wait comes from the server, declare the policy's `maxBackoffMs` (the runner caps
30
+ * every wait at it) or run under a deadline (the runner stops a series whose wait would outlast it).
31
+ *
32
+ * Refused when built — by the field's name and the shape it needs, NEVER the value it was given (a field can hold a
33
+ * secret): a `TypeError` for a wrong type (`'100'` included), a `RangeError` for a number out of range. The rules: a
34
+ * `baseDelayMs` that is a finite number >= 0, a `multiplier` >= 1, a `maxDelayMs` >= `baseDelayMs`, a `jitter` of the
35
+ * three names, a `random` or a reader that is a function, an `inner` that is a function or a finite number >= 0.
36
+ *
37
+ * A DRAW IS NOT TRUSTED BLINDLY: a `random()` that answers anything but a number in [0, 1] — or throws — makes that
38
+ * wait the ceiling `c`, the longest the schedule allows. Never 0: a broken source cannot make every jittered retry
39
+ * fire at once. The default source is `Math.random`, looked up at each draw (so a spy installed later takes effect).
40
+ */
41
+ const JITTERS = ['none', 'equal', 'full'];
42
+ /** Where a ceiling saturates: a wait is never `Infinity` and never `NaN`. */
43
+ const MAX_WAIT_MS = Number.MAX_SAFE_INTEGER;
44
+ /** The default random source: `Math.random`, looked up at each draw — so a spy installed after building takes effect. */
45
+ const drawMathRandom = () => Math.random();
46
+ /**
47
+ * A `RetryPolicy.backoffMs` function for an exponential schedule: the wait after failed attempt `n` is drawn under the
48
+ * ceiling `min(maxDelayMs, baseDelayMs × multiplier^(n − 1))` by the declared jitter — the schedule is capped BEFORE
49
+ * the draw, so it keeps its spread. The policy's `maxBackoffMs` still caps every wait after it.
50
+ *
51
+ * @example
52
+ * ```ts
53
+ * .retry({ attempts: 6, backoffMs: exponentialBackoff({ baseDelayMs: 200, maxDelayMs: 2_000, jitter: 'equal' }), maxBackoffMs: 5_000 })
54
+ * ```
55
+ */
56
+ export function exponentialBackoff(spec) {
57
+ const { baseDelayMs, multiplier, maxDelayMs, jitter, random } = readSpec(spec);
58
+ return (attempt) => {
59
+ const ceiling = ceilingOf(baseDelayMs, multiplier, maxDelayMs, stepOf(attempt));
60
+ if (jitter === 'none')
61
+ return ceiling;
62
+ const r = draw(random);
63
+ // An untrusted draw waits the ceiling — never 0, so a broken source cannot fire every jittered retry at once.
64
+ if (r === undefined)
65
+ return ceiling;
66
+ // Never above the ceiling, rounding included: halving a subnormal ceiling is inexact and can round up.
67
+ return jitter === 'equal' ? Math.min(ceiling, ceiling / 2 + (r * ceiling) / 2) : r * ceiling;
68
+ };
69
+ }
70
+ /**
71
+ * A `RetryPolicy.backoffMs` function that honours a wait the outside system stated: when `readStatedWaitMs(error)`
72
+ * answers a finite number >= 0, that is the wait; otherwise `inner` (a backoff function, or a fixed number of
73
+ * milliseconds) decides. A reader that throws or answers anything else states nothing — a malformed `Retry-After`
74
+ * falls back to the schedule rather than to a wrong wait. The runner still caps the stated wait at `maxBackoffMs` and
75
+ * stops the series when it would outlast the run's deadline.
76
+ *
77
+ * The outside system chooses this wait, and a broken or hostile one can ask for an hour: whenever the wait comes from
78
+ * the server, declare the policy's `maxBackoffMs` (or run under a deadline).
79
+ *
80
+ * @example
81
+ * ```ts
82
+ * const retryAfterMs = (error: unknown) => (error as { retryAfterMs?: number }).retryAfterMs;
83
+ * .retry({ attempts: 3, backoffMs: statedWaitFirst(retryAfterMs, exponentialBackoff({ baseDelayMs: 100 })), maxBackoffMs: 10_000 })
84
+ * ```
85
+ */
86
+ export function statedWaitFirst(readStatedWaitMs, inner) {
87
+ if (typeof readStatedWaitMs !== 'function') {
88
+ throw new TypeError('statedWaitFirst: readStatedWaitMs must be a function');
89
+ }
90
+ if (typeof inner !== 'function') {
91
+ checkNumber('statedWaitFirst: inner', inner, 0, 'a backoff function or a finite number >= 0');
92
+ }
93
+ return (attempt, error) => {
94
+ const stated = statedWaitOf(readStatedWaitMs, error);
95
+ if (stated !== undefined)
96
+ return stated;
97
+ return typeof inner === 'function' ? inner(attempt, error) : inner;
98
+ };
99
+ }
100
+ /** Each field read ONCE, then checked: what is checked is exactly what the function keeps (a getter cannot differ). */
101
+ function readSpec(spec) {
102
+ if (spec === null || typeof spec !== 'object') {
103
+ throw new TypeError('exponentialBackoff: the spec must be an object ({ baseDelayMs, multiplier?, maxDelayMs?, jitter?, random? })');
104
+ }
105
+ const { baseDelayMs, multiplier = 2, maxDelayMs, jitter = 'none', random = drawMathRandom } = spec;
106
+ checkNumber('exponentialBackoff: baseDelayMs', baseDelayMs, 0, 'a finite number >= 0');
107
+ checkNumber('exponentialBackoff: multiplier', multiplier, 1, 'a finite number >= 1');
108
+ // At least the base: a cap below it would make every wait the cap — a fixed schedule written as an exponential one.
109
+ if (maxDelayMs !== undefined) {
110
+ checkNumber('exponentialBackoff: maxDelayMs', maxDelayMs, baseDelayMs, 'a finite number >= baseDelayMs');
111
+ }
112
+ const jitterRule = "exponentialBackoff: jitter must be 'none', 'equal' or 'full'";
113
+ if (typeof jitter !== 'string')
114
+ throw new TypeError(jitterRule);
115
+ if (!JITTERS.includes(jitter))
116
+ throw new RangeError(jitterRule);
117
+ if (typeof random !== 'function') {
118
+ throw new TypeError('exponentialBackoff: random must be a function answering a number in [0, 1]');
119
+ }
120
+ return { baseDelayMs, multiplier, maxDelayMs: maxDelayMs ?? MAX_WAIT_MS, jitter, random };
121
+ }
122
+ /**
123
+ * A finite number >= `min`, or the error that names `field` and the shape it needs — never the value it was given (a
124
+ * field can hold a secret): a `TypeError` for a non-number, a `RangeError` for a number out of range.
125
+ */
126
+ function checkNumber(field, value, min, rule) {
127
+ if (typeof value !== 'number')
128
+ throw new TypeError(`${field} must be ${rule}`);
129
+ if (!Number.isFinite(value) || value < min)
130
+ throw new RangeError(`${field} must be ${rule}`);
131
+ }
132
+ /** The attempt as a schedule step: its whole part, at least 1 (anything that is not a finite number reads as 1). */
133
+ function stepOf(attempt) {
134
+ return typeof attempt === 'number' && Number.isFinite(attempt) && attempt >= 1 ? Math.floor(attempt) : 1;
135
+ }
136
+ /**
137
+ * `min(maxDelayMs, baseDelayMs × multiplier^(step − 1))` — the schedule's cap, applied BEFORE any jitter is drawn
138
+ * (`maxDelayMs` is {@link MAX_WAIT_MS} when none was declared, so the ceiling saturates rather than overflows).
139
+ */
140
+ function ceilingOf(baseDelayMs, multiplier, maxDelayMs, step) {
141
+ if (baseDelayMs === 0)
142
+ return 0;
143
+ const ceiling = baseDelayMs * multiplier ** (step - 1);
144
+ return ceiling < maxDelayMs ? ceiling : maxDelayMs;
145
+ }
146
+ /**
147
+ * One draw from the random source: a number in [0, 1] (`-0` reads as `0`), or `undefined` when the source answers
148
+ * anything else or throws — an untrusted draw, which the caller turns into the ceiling.
149
+ */
150
+ function draw(random) {
151
+ let r;
152
+ try {
153
+ r = random();
154
+ }
155
+ catch {
156
+ return undefined;
157
+ }
158
+ if (typeof r !== 'number' || !(r >= 0 && r <= 1))
159
+ return undefined;
160
+ return r === 0 ? 0 : r;
161
+ }
162
+ /** The wait `error` states, read once — none when the reader throws or answers anything but a finite number >= 0. */
163
+ function statedWaitOf(read, error) {
164
+ let value;
165
+ try {
166
+ value = read(error);
167
+ }
168
+ catch {
169
+ return undefined;
170
+ }
171
+ return typeof value === 'number' && Number.isFinite(value) && value >= 0 ? value : undefined;
172
+ }
173
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja29mZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvYXR0ZW1wdC9iYWNrb2ZmLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Q0c7QUFtQ0gsTUFBTSxPQUFPLEdBQTZCLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztBQUVwRSw2RUFBNkU7QUFDN0UsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDO0FBRTVDLHlIQUF5SDtBQUN6SCxNQUFNLGNBQWMsR0FBRyxHQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7QUFFbkQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLElBQWlCO0lBQ2xELE1BQU0sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9FLE9BQU8sQ0FBQyxPQUFlLEVBQVUsRUFBRTtRQUNqQyxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDaEYsSUFBSSxNQUFNLEtBQUssTUFBTTtZQUFFLE9BQU8sT0FBTyxDQUFDO1FBQ3RDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2Qiw4R0FBOEc7UUFDOUcsSUFBSSxDQUFDLEtBQUssU0FBUztZQUFFLE9BQU8sT0FBTyxDQUFDO1FBQ3BDLHVHQUF1RztRQUN2RyxPQUFPLE1BQU0sS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUM7SUFDL0YsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQzdCLGdCQUFrQyxFQUNsQyxLQUE0QztJQUU1QyxJQUFJLE9BQU8sZ0JBQWdCLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDM0MsTUFBTSxJQUFJLFNBQVMsQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFDRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ2hDLFdBQVcsQ0FBQyx3QkFBd0IsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLDRDQUE0QyxDQUFDLENBQUM7SUFDaEcsQ0FBQztJQUNELE9BQU8sQ0FBQyxPQUFlLEVBQUUsS0FBZSxFQUFVLEVBQUU7UUFDbEQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3JELElBQUksTUFBTSxLQUFLLFNBQVM7WUFBRSxPQUFPLE1BQU0sQ0FBQztRQUN4QyxPQUFPLE9BQU8sS0FBSyxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ3JFLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCx1SEFBdUg7QUFDdkgsU0FBUyxRQUFRLENBQUMsSUFBaUI7SUFDakMsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlDLE1BQU0sSUFBSSxTQUFTLENBQ2pCLDhHQUE4RyxDQUMvRyxDQUFDO0lBQ0osQ0FBQztJQUNELE1BQU0sRUFBRSxXQUFXLEVBQUUsVUFBVSxHQUFHLENBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxHQUFHLE1BQU0sRUFBRSxNQUFNLEdBQUcsY0FBYyxFQUFFLEdBQUcsSUFBSSxDQUFDO0lBQ25HLFdBQVcsQ0FBQyxpQ0FBaUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLHNCQUFzQixDQUFDLENBQUM7SUFDdkYsV0FBVyxDQUFDLGdDQUFnQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztJQUNyRixvSEFBb0g7SUFDcEgsSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDN0IsV0FBVyxDQUFDLGdDQUFnQyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsZ0NBQWdDLENBQUMsQ0FBQztJQUMzRyxDQUFDO0lBQ0QsTUFBTSxVQUFVLEdBQUcsOERBQThELENBQUM7SUFDbEYsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRO1FBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNoRSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFBRSxNQUFNLElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2hFLElBQUksT0FBTyxNQUFNLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDakMsTUFBTSxJQUFJLFNBQVMsQ0FBQyw0RUFBNEUsQ0FBQyxDQUFDO0lBQ3BHLENBQUM7SUFDRCxPQUFPLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxJQUFJLFdBQVcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDNUYsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsV0FBVyxDQUFDLEtBQWEsRUFBRSxLQUFjLEVBQUUsR0FBVyxFQUFFLElBQVk7SUFDM0UsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQyxHQUFHLEtBQUssWUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQy9FLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssR0FBRyxHQUFHO1FBQUUsTUFBTSxJQUFJLFVBQVUsQ0FBQyxHQUFHLEtBQUssWUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQy9GLENBQUM7QUFFRCxvSEFBb0g7QUFDcEgsU0FBUyxNQUFNLENBQUMsT0FBZ0I7SUFDOUIsT0FBTyxPQUFPLE9BQU8sS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0csQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsU0FBUyxDQUFDLFdBQW1CLEVBQUUsVUFBa0IsRUFBRSxVQUFrQixFQUFFLElBQVk7SUFDMUYsSUFBSSxXQUFXLEtBQUssQ0FBQztRQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2hDLE1BQU0sT0FBTyxHQUFHLFdBQVcsR0FBRyxVQUFVLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdkQsT0FBTyxPQUFPLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztBQUNyRCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxJQUFJLENBQUMsTUFBb0I7SUFDaEMsSUFBSSxDQUFVLENBQUM7SUFDZixJQUFJLENBQUM7UUFDSCxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUM7SUFDZixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNuRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pCLENBQUM7QUFFRCxxSEFBcUg7QUFDckgsU0FBUyxZQUFZLENBQUMsSUFBc0IsRUFBRSxLQUFjO0lBQzFELElBQUksS0FBYyxDQUFDO0lBQ25CLElBQUksQ0FBQztRQUNILEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEIsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQy9GLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGF0dGVtcHQvYmFja29mZi50cyDigJQgZGV0ZXJtaW5pc3RpYyBidWlsZGVycyBvZiBhIGBSZXRyeVBvbGljeS5iYWNrb2ZmTXNgIGZ1bmN0aW9uLlxuICpcbiAqIFdIWTogZXZlcnkgcmV0cnkgbG9vcCBuZWVkcyB0aGUgc2FtZSBmZXcgbGluZXMg4oCUIGFuIGV4cG9uZW50aWFsIGNlaWxpbmcgYW5kIHNvbWUgaml0dGVyIOKAlCBhbmQgZXZlcnkgaGFuZCBjb3B5IG9mIHRoZW1cbiAqIGRyaWZ0czogYSBkaWZmZXJlbnQgYmFzZSwgYSBkaWZmZXJlbnQgaml0dGVyLCBhIHN0YXRlZCBgUmV0cnktQWZ0ZXJgIGhvbm91cmVkIGluIG9uZSBsb29wIGFuZCBub3QgdGhlIG5leHQuIFRoZXNlXG4gKiBoZWxwZXJzIGJ1aWxkIHRoZSBGVU5DVElPTiBgUmV0cnlQb2xpY3kuYmFja29mZk1zYCBhbHJlYWR5IHRha2VzLCBzbyB0aGUgcG9saWN5IGtlZXBzIGl0cyBvbmUgc2hhcGUgYW5kIHRoZSBydW5uZXJcbiAqIGtlZXBzIGl0cyBvbmUgbGF3OiBpdCBhc2tzIHRoZSBmdW5jdGlvbiBvbmNlIHBlciByZXRyeSwgY2FwcyB0aGUgYW5zd2VyIGF0IGBtYXhCYWNrb2ZmTXNgLCBzdG9wcyBhIHNlcmllcyB3aG9zZSB3YWl0XG4gKiB3b3VsZCBvdXRsYXN0IHRoZSBydW4ncyBkZWFkbGluZSAoYG5vLXRpbWUtbGVmdGApLCBhbmQgcmVjb3JkcyB0aGUgd2FpdCBpdCBjaG9zZSAoYEF0dGVtcHRSZWNvcmQuZGVsYXlNc2AsXG4gKiBgb25TdGFnZVJldHJ5YCdzIGBkZWxheU1zYCkuIFRoZSB0cmFjZSBleHBsYWlucyBldmVyeSB3YWl0IGFzIGl0IHdhcyB3YWl0ZWQ7IG5vdGhpbmcgaXMgcmVkcmF3biB0byBleHBsYWluIGl0LlxuICpcbiAqICAgZXhwb25lbnRpYWxCYWNrb2ZmKHsgYmFzZURlbGF5TXMsIG11bHRpcGxpZXIgPSAyLCBtYXhEZWxheU1zPywgaml0dGVyID0gJ25vbmUnLCByYW5kb20gPSBNYXRoLnJhbmRvbSB9KVxuICogICAgIHRoZSB3YWl0IGFmdGVyIGZhaWxlZCBhdHRlbXB0IG4sIHVuZGVyIGl0cyBjZWlsaW5nIGMgPSBtaW4obWF4RGVsYXlNcywgYmFzZURlbGF5TXMgw5cgbXVsdGlwbGllcl4obiDiiJIgMSkpOlxuICogICAgICAgJ25vbmUnICDihpIgYyAgICAgICAgICAgICAgICAgICBkZXRlcm1pbmlzdGljOiBgcmFuZG9tYCBpcyBuZXZlciBjYWxsZWRcbiAqICAgICAgICdlcXVhbCcg4oaSIGMvMiArIHIgw5cgYy8yICAgICAgIGhhbGYgZml4ZWQsIGhhbGYgcmFuZG9tIChyID0gcmFuZG9tKCksIGluIFswLCAxXSlcbiAqICAgICAgICdmdWxsJyAg4oaSIHIgw5cgY1xuICogICBzdGF0ZWRXYWl0Rmlyc3QocmVhZFN0YXRlZFdhaXRNcywgaW5uZXIpXG4gKiAgICAgYSB3YWl0IHRoZSBvdXRzaWRlIHN5c3RlbSBTVEFURUQgKGEgYFJldHJ5LUFmdGVyYCwgcmVhZCBvZmYgdGhlIGVycm9yKSB3aW5zOyBvdGhlcndpc2UgYGlubmVyYCBkZWNpZGVzLlxuICpcbiAqIFRXTyBDQVBTLCB0d28gam9iczpcbiAqICAgLSBgQmFja29mZlNwZWMubWF4RGVsYXlNc2AgY2FwcyB0aGUgU0NIRURVTEU6IGl0IGJvdW5kcyB0aGUgY2VpbGluZyBCRUZPUkUgdGhlIGRyYXcsIHNvIGEgY2FwcGVkIHNjaGVkdWxlIGtlZXBzIGl0c1xuICogICAgIGppdHRlci4gQ2FwcGluZyBhZnRlciB0aGUgZHJhdyBpbnN0ZWFkIHdvdWxkIGZsYXR0ZW4gZXZlcnkgaml0dGVyZWQgd2FpdCB0byBvbmUgY29uc3RhbnQgb25jZSB0aGUgc2NoZWR1bGVcbiAqICAgICBwYXNzZXMgdHdpY2UgdGhlIGNhcCDigJQgYSBmbGVldCB3b3VsZCByZXRyeSBpbiBsb2Nrc3RlcCwgd2hpY2ggaXMgd2hhdCBqaXR0ZXIgaXMgZm9yIHByZXZlbnRpbmcuXG4gKiAgIC0gYFJldHJ5UG9saWN5Lm1heEJhY2tvZmZNc2AgY2FwcyBFVkVSWSB3YWl0LCBhIHN0YXRlZCBvbmUgaW5jbHVkZWQsIGFmdGVyIHRoZSBkcmF3OyB0aGUgcnVubmVyIGVuZm9yY2VzIGl0IGFuZCB0aGVcbiAqICAgICBzdGF0aWMgdGltZSBidWRnZXQgY291bnRzIGEgZnVuY3Rpb24gYmFja29mZiBhdCBpdCB3aXRob3V0IGNhbGxpbmcgaXQuXG4gKiBBIHN0YXRlZCB3YWl0IGlzIG5ldmVyIGNhcHBlZCBieSB0aGUgaW5uZXIgc2NoZWR1bGUncyBgbWF4RGVsYXlNc2Ag4oCUIG9ubHkgYG1heEJhY2tvZmZNc2AgYW5kIHRoZSBkZWFkbGluZSBib3VuZCBpdC5cbiAqIFdpdGhvdXQgYG1heERlbGF5TXNgIGEgY2VpbGluZyBzYXR1cmF0ZXMgYXQgYE51bWJlci5NQVhfU0FGRV9JTlRFR0VSYCBtcywgc28gbm8gYXR0ZW1wdCBtYWtlcyBhIHdhaXQgYEluZmluaXR5YC5cbiAqXG4gKiBUSEUgU0VSVkVSIENIT09TRVMgQSBTVEFURUQgV0FJVC4gYHN0YXRlZFdhaXRGaXJzdGAgaGFuZHMgdGhlIHdhaXQgdG8gdGhlIG91dHNpZGUgc3lzdGVtIOKAlCBhIGJyb2tlbiBvciBob3N0aWxlIG9uZVxuICogY2FuIGFzayBmb3IgYW4gaG91ci4gV2hlbmV2ZXIgdGhlIHdhaXQgY29tZXMgZnJvbSB0aGUgc2VydmVyLCBkZWNsYXJlIHRoZSBwb2xpY3kncyBgbWF4QmFja29mZk1zYCAodGhlIHJ1bm5lciBjYXBzXG4gKiBldmVyeSB3YWl0IGF0IGl0KSBvciBydW4gdW5kZXIgYSBkZWFkbGluZSAodGhlIHJ1bm5lciBzdG9wcyBhIHNlcmllcyB3aG9zZSB3YWl0IHdvdWxkIG91dGxhc3QgaXQpLlxuICpcbiAqIFJlZnVzZWQgd2hlbiBidWlsdCDigJQgYnkgdGhlIGZpZWxkJ3MgbmFtZSBhbmQgdGhlIHNoYXBlIGl0IG5lZWRzLCBORVZFUiB0aGUgdmFsdWUgaXQgd2FzIGdpdmVuIChhIGZpZWxkIGNhbiBob2xkIGFcbiAqIHNlY3JldCk6IGEgYFR5cGVFcnJvcmAgZm9yIGEgd3JvbmcgdHlwZSAoYCcxMDAnYCBpbmNsdWRlZCksIGEgYFJhbmdlRXJyb3JgIGZvciBhIG51bWJlciBvdXQgb2YgcmFuZ2UuIFRoZSBydWxlczogYVxuICogYGJhc2VEZWxheU1zYCB0aGF0IGlzIGEgZmluaXRlIG51bWJlciA+PSAwLCBhIGBtdWx0aXBsaWVyYCA+PSAxLCBhIGBtYXhEZWxheU1zYCA+PSBgYmFzZURlbGF5TXNgLCBhIGBqaXR0ZXJgIG9mIHRoZVxuICogdGhyZWUgbmFtZXMsIGEgYHJhbmRvbWAgb3IgYSByZWFkZXIgdGhhdCBpcyBhIGZ1bmN0aW9uLCBhbiBgaW5uZXJgIHRoYXQgaXMgYSBmdW5jdGlvbiBvciBhIGZpbml0ZSBudW1iZXIgPj0gMC5cbiAqXG4gKiBBIERSQVcgSVMgTk9UIFRSVVNURUQgQkxJTkRMWTogYSBgcmFuZG9tKClgIHRoYXQgYW5zd2VycyBhbnl0aGluZyBidXQgYSBudW1iZXIgaW4gWzAsIDFdIOKAlCBvciB0aHJvd3Mg4oCUIG1ha2VzIHRoYXRcbiAqIHdhaXQgdGhlIGNlaWxpbmcgYGNgLCB0aGUgbG9uZ2VzdCB0aGUgc2NoZWR1bGUgYWxsb3dzLiBOZXZlciAwOiBhIGJyb2tlbiBzb3VyY2UgY2Fubm90IG1ha2UgZXZlcnkgaml0dGVyZWQgcmV0cnlcbiAqIGZpcmUgYXQgb25jZS4gVGhlIGRlZmF1bHQgc291cmNlIGlzIGBNYXRoLnJhbmRvbWAsIGxvb2tlZCB1cCBhdCBlYWNoIGRyYXcgKHNvIGEgc3B5IGluc3RhbGxlZCBsYXRlciB0YWtlcyBlZmZlY3QpLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUmV0cnlQb2xpY3kgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqIEhvdyBtdWNoIG9mIGFuIGV4cG9uZW50aWFsIHdhaXQgaXMgcmFuZG9tOiBub25lIG9mIGl0LCBoYWxmIG9mIGl0LCBvciBhbGwgb2YgaXQuICovXG5leHBvcnQgdHlwZSBCYWNrb2ZmSml0dGVyID0gJ25vbmUnIHwgJ2VxdWFsJyB8ICdmdWxsJztcblxuLyoqIFRoZSBzY2hlZHVsZSB7QGxpbmsgZXhwb25lbnRpYWxCYWNrb2ZmfSBidWlsZHMgYSBgUmV0cnlQb2xpY3kuYmFja29mZk1zYCBmdW5jdGlvbiBmcm9tLiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYWNrb2ZmU3BlYyB7XG4gIC8qKiBUaGUgY2VpbGluZyBvZiB0aGUgZmlyc3Qgd2FpdCAoYWZ0ZXIgYXR0ZW1wdCAxKSwgaW4gbWlsbGlzZWNvbmRzIOKAlCBhIGZpbml0ZSBudW1iZXIgPj0gMC4gKi9cbiAgcmVhZG9ubHkgYmFzZURlbGF5TXM6IG51bWJlcjtcbiAgLyoqIEhvdyBtdWNoIGVhY2ggY2VpbGluZyBncm93cyBvdmVyIHRoZSBvbmUgYmVmb3JlIOKAlCBhIGZpbml0ZSBudW1iZXIgPj0gMS4gRGVmYXVsdCBgMmAuICovXG4gIHJlYWRvbmx5IG11bHRpcGxpZXI/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgbW9zdCBhIGNlaWxpbmcgbWF5IGdyb3cgdG8sIGluIG1pbGxpc2Vjb25kcyDigJQgYSBmaW5pdGUgbnVtYmVyID49IGBiYXNlRGVsYXlNc2AuIEl0IGNhcHMgdGhlIFNDSEVEVUxFIGJlZm9yZVxuICAgKiB0aGUgaml0dGVyIGlzIGRyYXduLCBzbyB3YWl0cyBhdCB0aGUgY2FwIHN0aWxsIHNwcmVhZCAoYCdlcXVhbCdgIGJldHdlZW4gYG1heERlbGF5TXMgLyAyYCBhbmQgYG1heERlbGF5TXNgKS4gSXRcbiAgICogaXMgbm90IGBSZXRyeVBvbGljeS5tYXhCYWNrb2ZmTXNgLCB3aGljaCBjYXBzIGV2ZXJ5IHdhaXQgYWZ0ZXIgdGhlIGRyYXcsIGEgc3RhdGVkIG9uZSBpbmNsdWRlZC4gQWJzZW50OiB0aGVcbiAgICogY2VpbGluZyBncm93cyB1bnRpbCBpdCBzYXR1cmF0ZXMgYXQgYE51bWJlci5NQVhfU0FGRV9JTlRFR0VSYC5cbiAgICovXG4gIHJlYWRvbmx5IG1heERlbGF5TXM/OiBudW1iZXI7XG4gIC8qKiBIb3cgbXVjaCBvZiBlYWNoIHdhaXQgaXMgcmFuZG9tLiBEZWZhdWx0IGAnbm9uZSdgOiB0aGUgd2FpdCBJUyB0aGUgY2VpbGluZy4gKi9cbiAgcmVhZG9ubHkgaml0dGVyPzogQmFja29mZkppdHRlcjtcbiAgLyoqXG4gICAqIFRoZSBqaXR0ZXIncyByYW5kb20gc291cmNlLCBhbnN3ZXJpbmcgaW4gWzAsIDFdLiBEZWZhdWx0IGBNYXRoLnJhbmRvbWAsIGxvb2tlZCB1cCBhdCBlYWNoIGRyYXc7IGEgZml4ZWQgb25lIG1ha2VzIGFcbiAgICogdGVzdCBleGFjdC4gQSBkcmF3IG91dHNpZGUgWzAsIDFdIChvciBhIHRocm93KSBtYWtlcyB0aGF0IHdhaXQgdGhlIGNlaWxpbmcg4oCUIG5ldmVyIDAuXG4gICAqL1xuICByZWFkb25seSByYW5kb20/OiAoKSA9PiBudW1iZXI7XG59XG5cbi8qKiBBIGBSZXRyeVBvbGljeS5iYWNrb2ZmTXNgIGZ1bmN0aW9uOiB0aGUgd2FpdCBpbiBtaWxsaXNlY29uZHMgYWZ0ZXIgZmFpbGVkIGF0dGVtcHQgYGF0dGVtcHRgICgxLWJhc2VkKS4gKi9cbmV4cG9ydCB0eXBlIEJhY2tvZmZGdW5jdGlvbiA9IChhdHRlbXB0OiBudW1iZXIsIGVycm9yPzogdW5rbm93bikgPT4gbnVtYmVyO1xuXG4vKiogUmVhZHMgdGhlIHdhaXQgYW4gZXJyb3Igc3RhdGVzIChhIHBhcnNlZCBgUmV0cnktQWZ0ZXJgKSwgaW4gbWlsbGlzZWNvbmRzLCBvciBgdW5kZWZpbmVkYCB3aGVuIGl0IHN0YXRlcyBub25lLiAqL1xuZXhwb3J0IHR5cGUgU3RhdGVkV2FpdFJlYWRlciA9IChlcnJvcjogdW5rbm93bikgPT4gbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG5jb25zdCBKSVRURVJTOiByZWFkb25seSBCYWNrb2ZmSml0dGVyW10gPSBbJ25vbmUnLCAnZXF1YWwnLCAnZnVsbCddO1xuXG4vKiogV2hlcmUgYSBjZWlsaW5nIHNhdHVyYXRlczogYSB3YWl0IGlzIG5ldmVyIGBJbmZpbml0eWAgYW5kIG5ldmVyIGBOYU5gLiAqL1xuY29uc3QgTUFYX1dBSVRfTVMgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcblxuLyoqIFRoZSBkZWZhdWx0IHJhbmRvbSBzb3VyY2U6IGBNYXRoLnJhbmRvbWAsIGxvb2tlZCB1cCBhdCBlYWNoIGRyYXcg4oCUIHNvIGEgc3B5IGluc3RhbGxlZCBhZnRlciBidWlsZGluZyB0YWtlcyBlZmZlY3QuICovXG5jb25zdCBkcmF3TWF0aFJhbmRvbSA9ICgpOiBudW1iZXIgPT4gTWF0aC5yYW5kb20oKTtcblxuLyoqXG4gKiBBIGBSZXRyeVBvbGljeS5iYWNrb2ZmTXNgIGZ1bmN0aW9uIGZvciBhbiBleHBvbmVudGlhbCBzY2hlZHVsZTogdGhlIHdhaXQgYWZ0ZXIgZmFpbGVkIGF0dGVtcHQgYG5gIGlzIGRyYXduIHVuZGVyIHRoZVxuICogY2VpbGluZyBgbWluKG1heERlbGF5TXMsIGJhc2VEZWxheU1zIMOXIG11bHRpcGxpZXJeKG4g4oiSIDEpKWAgYnkgdGhlIGRlY2xhcmVkIGppdHRlciDigJQgdGhlIHNjaGVkdWxlIGlzIGNhcHBlZCBCRUZPUkVcbiAqIHRoZSBkcmF3LCBzbyBpdCBrZWVwcyBpdHMgc3ByZWFkLiBUaGUgcG9saWN5J3MgYG1heEJhY2tvZmZNc2Agc3RpbGwgY2FwcyBldmVyeSB3YWl0IGFmdGVyIGl0LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLnJldHJ5KHsgYXR0ZW1wdHM6IDYsIGJhY2tvZmZNczogZXhwb25lbnRpYWxCYWNrb2ZmKHsgYmFzZURlbGF5TXM6IDIwMCwgbWF4RGVsYXlNczogMl8wMDAsIGppdHRlcjogJ2VxdWFsJyB9KSwgbWF4QmFja29mZk1zOiA1XzAwMCB9KVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHBvbmVudGlhbEJhY2tvZmYoc3BlYzogQmFja29mZlNwZWMpOiBCYWNrb2ZmRnVuY3Rpb24ge1xuICBjb25zdCB7IGJhc2VEZWxheU1zLCBtdWx0aXBsaWVyLCBtYXhEZWxheU1zLCBqaXR0ZXIsIHJhbmRvbSB9ID0gcmVhZFNwZWMoc3BlYyk7XG4gIHJldHVybiAoYXR0ZW1wdDogbnVtYmVyKTogbnVtYmVyID0+IHtcbiAgICBjb25zdCBjZWlsaW5nID0gY2VpbGluZ09mKGJhc2VEZWxheU1zLCBtdWx0aXBsaWVyLCBtYXhEZWxheU1zLCBzdGVwT2YoYXR0ZW1wdCkpO1xuICAgIGlmIChqaXR0ZXIgPT09ICdub25lJykgcmV0dXJuIGNlaWxpbmc7XG4gICAgY29uc3QgciA9IGRyYXcocmFuZG9tKTtcbiAgICAvLyBBbiB1bnRydXN0ZWQgZHJhdyB3YWl0cyB0aGUgY2VpbGluZyDigJQgbmV2ZXIgMCwgc28gYSBicm9rZW4gc291cmNlIGNhbm5vdCBmaXJlIGV2ZXJ5IGppdHRlcmVkIHJldHJ5IGF0IG9uY2UuXG4gICAgaWYgKHIgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGNlaWxpbmc7XG4gICAgLy8gTmV2ZXIgYWJvdmUgdGhlIGNlaWxpbmcsIHJvdW5kaW5nIGluY2x1ZGVkOiBoYWx2aW5nIGEgc3Vibm9ybWFsIGNlaWxpbmcgaXMgaW5leGFjdCBhbmQgY2FuIHJvdW5kIHVwLlxuICAgIHJldHVybiBqaXR0ZXIgPT09ICdlcXVhbCcgPyBNYXRoLm1pbihjZWlsaW5nLCBjZWlsaW5nIC8gMiArIChyICogY2VpbGluZykgLyAyKSA6IHIgKiBjZWlsaW5nO1xuICB9O1xufVxuXG4vKipcbiAqIEEgYFJldHJ5UG9saWN5LmJhY2tvZmZNc2AgZnVuY3Rpb24gdGhhdCBob25vdXJzIGEgd2FpdCB0aGUgb3V0c2lkZSBzeXN0ZW0gc3RhdGVkOiB3aGVuIGByZWFkU3RhdGVkV2FpdE1zKGVycm9yKWBcbiAqIGFuc3dlcnMgYSBmaW5pdGUgbnVtYmVyID49IDAsIHRoYXQgaXMgdGhlIHdhaXQ7IG90aGVyd2lzZSBgaW5uZXJgIChhIGJhY2tvZmYgZnVuY3Rpb24sIG9yIGEgZml4ZWQgbnVtYmVyIG9mXG4gKiBtaWxsaXNlY29uZHMpIGRlY2lkZXMuIEEgcmVhZGVyIHRoYXQgdGhyb3dzIG9yIGFuc3dlcnMgYW55dGhpbmcgZWxzZSBzdGF0ZXMgbm90aGluZyDigJQgYSBtYWxmb3JtZWQgYFJldHJ5LUFmdGVyYFxuICogZmFsbHMgYmFjayB0byB0aGUgc2NoZWR1bGUgcmF0aGVyIHRoYW4gdG8gYSB3cm9uZyB3YWl0LiBUaGUgcnVubmVyIHN0aWxsIGNhcHMgdGhlIHN0YXRlZCB3YWl0IGF0IGBtYXhCYWNrb2ZmTXNgIGFuZFxuICogc3RvcHMgdGhlIHNlcmllcyB3aGVuIGl0IHdvdWxkIG91dGxhc3QgdGhlIHJ1bidzIGRlYWRsaW5lLlxuICpcbiAqIFRoZSBvdXRzaWRlIHN5c3RlbSBjaG9vc2VzIHRoaXMgd2FpdCwgYW5kIGEgYnJva2VuIG9yIGhvc3RpbGUgb25lIGNhbiBhc2sgZm9yIGFuIGhvdXI6IHdoZW5ldmVyIHRoZSB3YWl0IGNvbWVzIGZyb21cbiAqIHRoZSBzZXJ2ZXIsIGRlY2xhcmUgdGhlIHBvbGljeSdzIGBtYXhCYWNrb2ZmTXNgIChvciBydW4gdW5kZXIgYSBkZWFkbGluZSkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjb25zdCByZXRyeUFmdGVyTXMgPSAoZXJyb3I6IHVua25vd24pID0+IChlcnJvciBhcyB7IHJldHJ5QWZ0ZXJNcz86IG51bWJlciB9KS5yZXRyeUFmdGVyTXM7XG4gKiAucmV0cnkoeyBhdHRlbXB0czogMywgYmFja29mZk1zOiBzdGF0ZWRXYWl0Rmlyc3QocmV0cnlBZnRlck1zLCBleHBvbmVudGlhbEJhY2tvZmYoeyBiYXNlRGVsYXlNczogMTAwIH0pKSwgbWF4QmFja29mZk1zOiAxMF8wMDAgfSlcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RhdGVkV2FpdEZpcnN0KFxuICByZWFkU3RhdGVkV2FpdE1zOiBTdGF0ZWRXYWl0UmVhZGVyLFxuICBpbm5lcjogTm9uTnVsbGFibGU8UmV0cnlQb2xpY3lbJ2JhY2tvZmZNcyddPixcbik6IEJhY2tvZmZGdW5jdGlvbiB7XG4gIGlmICh0eXBlb2YgcmVhZFN0YXRlZFdhaXRNcyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3N0YXRlZFdhaXRGaXJzdDogcmVhZFN0YXRlZFdhaXRNcyBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgfVxuICBpZiAodHlwZW9mIGlubmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgY2hlY2tOdW1iZXIoJ3N0YXRlZFdhaXRGaXJzdDogaW5uZXInLCBpbm5lciwgMCwgJ2EgYmFja29mZiBmdW5jdGlvbiBvciBhIGZpbml0ZSBudW1iZXIgPj0gMCcpO1xuICB9XG4gIHJldHVybiAoYXR0ZW1wdDogbnVtYmVyLCBlcnJvcj86IHVua25vd24pOiBudW1iZXIgPT4ge1xuICAgIGNvbnN0IHN0YXRlZCA9IHN0YXRlZFdhaXRPZihyZWFkU3RhdGVkV2FpdE1zLCBlcnJvcik7XG4gICAgaWYgKHN0YXRlZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gc3RhdGVkO1xuICAgIHJldHVybiB0eXBlb2YgaW5uZXIgPT09ICdmdW5jdGlvbicgPyBpbm5lcihhdHRlbXB0LCBlcnJvcikgOiBpbm5lcjtcbiAgfTtcbn1cblxuLyoqIEVhY2ggZmllbGQgcmVhZCBPTkNFLCB0aGVuIGNoZWNrZWQ6IHdoYXQgaXMgY2hlY2tlZCBpcyBleGFjdGx5IHdoYXQgdGhlIGZ1bmN0aW9uIGtlZXBzIChhIGdldHRlciBjYW5ub3QgZGlmZmVyKS4gKi9cbmZ1bmN0aW9uIHJlYWRTcGVjKHNwZWM6IEJhY2tvZmZTcGVjKTogUmVxdWlyZWQ8QmFja29mZlNwZWM+IHtcbiAgaWYgKHNwZWMgPT09IG51bGwgfHwgdHlwZW9mIHNwZWMgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICdleHBvbmVudGlhbEJhY2tvZmY6IHRoZSBzcGVjIG11c3QgYmUgYW4gb2JqZWN0ICh7IGJhc2VEZWxheU1zLCBtdWx0aXBsaWVyPywgbWF4RGVsYXlNcz8sIGppdHRlcj8sIHJhbmRvbT8gfSknLFxuICAgICk7XG4gIH1cbiAgY29uc3QgeyBiYXNlRGVsYXlNcywgbXVsdGlwbGllciA9IDIsIG1heERlbGF5TXMsIGppdHRlciA9ICdub25lJywgcmFuZG9tID0gZHJhd01hdGhSYW5kb20gfSA9IHNwZWM7XG4gIGNoZWNrTnVtYmVyKCdleHBvbmVudGlhbEJhY2tvZmY6IGJhc2VEZWxheU1zJywgYmFzZURlbGF5TXMsIDAsICdhIGZpbml0ZSBudW1iZXIgPj0gMCcpO1xuICBjaGVja051bWJlcignZXhwb25lbnRpYWxCYWNrb2ZmOiBtdWx0aXBsaWVyJywgbXVsdGlwbGllciwgMSwgJ2EgZmluaXRlIG51bWJlciA+PSAxJyk7XG4gIC8vIEF0IGxlYXN0IHRoZSBiYXNlOiBhIGNhcCBiZWxvdyBpdCB3b3VsZCBtYWtlIGV2ZXJ5IHdhaXQgdGhlIGNhcCDigJQgYSBmaXhlZCBzY2hlZHVsZSB3cml0dGVuIGFzIGFuIGV4cG9uZW50aWFsIG9uZS5cbiAgaWYgKG1heERlbGF5TXMgIT09IHVuZGVmaW5lZCkge1xuICAgIGNoZWNrTnVtYmVyKCdleHBvbmVudGlhbEJhY2tvZmY6IG1heERlbGF5TXMnLCBtYXhEZWxheU1zLCBiYXNlRGVsYXlNcywgJ2EgZmluaXRlIG51bWJlciA+PSBiYXNlRGVsYXlNcycpO1xuICB9XG4gIGNvbnN0IGppdHRlclJ1bGUgPSBcImV4cG9uZW50aWFsQmFja29mZjogaml0dGVyIG11c3QgYmUgJ25vbmUnLCAnZXF1YWwnIG9yICdmdWxsJ1wiO1xuICBpZiAodHlwZW9mIGppdHRlciAhPT0gJ3N0cmluZycpIHRocm93IG5ldyBUeXBlRXJyb3Ioaml0dGVyUnVsZSk7XG4gIGlmICghSklUVEVSUy5pbmNsdWRlcyhqaXR0ZXIpKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihqaXR0ZXJSdWxlKTtcbiAgaWYgKHR5cGVvZiByYW5kb20gIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdleHBvbmVudGlhbEJhY2tvZmY6IHJhbmRvbSBtdXN0IGJlIGEgZnVuY3Rpb24gYW5zd2VyaW5nIGEgbnVtYmVyIGluIFswLCAxXScpO1xuICB9XG4gIHJldHVybiB7IGJhc2VEZWxheU1zLCBtdWx0aXBsaWVyLCBtYXhEZWxheU1zOiBtYXhEZWxheU1zID8/IE1BWF9XQUlUX01TLCBqaXR0ZXIsIHJhbmRvbSB9O1xufVxuXG4vKipcbiAqIEEgZmluaXRlIG51bWJlciA+PSBgbWluYCwgb3IgdGhlIGVycm9yIHRoYXQgbmFtZXMgYGZpZWxkYCBhbmQgdGhlIHNoYXBlIGl0IG5lZWRzIOKAlCBuZXZlciB0aGUgdmFsdWUgaXQgd2FzIGdpdmVuIChhXG4gKiBmaWVsZCBjYW4gaG9sZCBhIHNlY3JldCk6IGEgYFR5cGVFcnJvcmAgZm9yIGEgbm9uLW51bWJlciwgYSBgUmFuZ2VFcnJvcmAgZm9yIGEgbnVtYmVyIG91dCBvZiByYW5nZS5cbiAqL1xuZnVuY3Rpb24gY2hlY2tOdW1iZXIoZmllbGQ6IHN0cmluZywgdmFsdWU6IHVua25vd24sIG1pbjogbnVtYmVyLCBydWxlOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ251bWJlcicpIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7ZmllbGR9IG11c3QgYmUgJHtydWxlfWApO1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgfHwgdmFsdWUgPCBtaW4pIHRocm93IG5ldyBSYW5nZUVycm9yKGAke2ZpZWxkfSBtdXN0IGJlICR7cnVsZX1gKTtcbn1cblxuLyoqIFRoZSBhdHRlbXB0IGFzIGEgc2NoZWR1bGUgc3RlcDogaXRzIHdob2xlIHBhcnQsIGF0IGxlYXN0IDEgKGFueXRoaW5nIHRoYXQgaXMgbm90IGEgZmluaXRlIG51bWJlciByZWFkcyBhcyAxKS4gKi9cbmZ1bmN0aW9uIHN0ZXBPZihhdHRlbXB0OiB1bmtub3duKTogbnVtYmVyIHtcbiAgcmV0dXJuIHR5cGVvZiBhdHRlbXB0ID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUoYXR0ZW1wdCkgJiYgYXR0ZW1wdCA+PSAxID8gTWF0aC5mbG9vcihhdHRlbXB0KSA6IDE7XG59XG5cbi8qKlxuICogYG1pbihtYXhEZWxheU1zLCBiYXNlRGVsYXlNcyDDlyBtdWx0aXBsaWVyXihzdGVwIOKIkiAxKSlgIOKAlCB0aGUgc2NoZWR1bGUncyBjYXAsIGFwcGxpZWQgQkVGT1JFIGFueSBqaXR0ZXIgaXMgZHJhd25cbiAqIChgbWF4RGVsYXlNc2AgaXMge0BsaW5rIE1BWF9XQUlUX01TfSB3aGVuIG5vbmUgd2FzIGRlY2xhcmVkLCBzbyB0aGUgY2VpbGluZyBzYXR1cmF0ZXMgcmF0aGVyIHRoYW4gb3ZlcmZsb3dzKS5cbiAqL1xuZnVuY3Rpb24gY2VpbGluZ09mKGJhc2VEZWxheU1zOiBudW1iZXIsIG11bHRpcGxpZXI6IG51bWJlciwgbWF4RGVsYXlNczogbnVtYmVyLCBzdGVwOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoYmFzZURlbGF5TXMgPT09IDApIHJldHVybiAwO1xuICBjb25zdCBjZWlsaW5nID0gYmFzZURlbGF5TXMgKiBtdWx0aXBsaWVyICoqIChzdGVwIC0gMSk7XG4gIHJldHVybiBjZWlsaW5nIDwgbWF4RGVsYXlNcyA/IGNlaWxpbmcgOiBtYXhEZWxheU1zO1xufVxuXG4vKipcbiAqIE9uZSBkcmF3IGZyb20gdGhlIHJhbmRvbSBzb3VyY2U6IGEgbnVtYmVyIGluIFswLCAxXSAoYC0wYCByZWFkcyBhcyBgMGApLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSBzb3VyY2UgYW5zd2Vyc1xuICogYW55dGhpbmcgZWxzZSBvciB0aHJvd3Mg4oCUIGFuIHVudHJ1c3RlZCBkcmF3LCB3aGljaCB0aGUgY2FsbGVyIHR1cm5zIGludG8gdGhlIGNlaWxpbmcuXG4gKi9cbmZ1bmN0aW9uIGRyYXcocmFuZG9tOiAoKSA9PiBudW1iZXIpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBsZXQgcjogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICByID0gcmFuZG9tKCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKHR5cGVvZiByICE9PSAnbnVtYmVyJyB8fCAhKHIgPj0gMCAmJiByIDw9IDEpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gciA9PT0gMCA/IDAgOiByO1xufVxuXG4vKiogVGhlIHdhaXQgYGVycm9yYCBzdGF0ZXMsIHJlYWQgb25jZSDigJQgbm9uZSB3aGVuIHRoZSByZWFkZXIgdGhyb3dzIG9yIGFuc3dlcnMgYW55dGhpbmcgYnV0IGEgZmluaXRlIG51bWJlciA+PSAwLiAqL1xuZnVuY3Rpb24gc3RhdGVkV2FpdE9mKHJlYWQ6IFN0YXRlZFdhaXRSZWFkZXIsIGVycm9yOiB1bmtub3duKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgbGV0IHZhbHVlOiB1bmtub3duO1xuICB0cnkge1xuICAgIHZhbHVlID0gcmVhZChlcnJvcik7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlKSAmJiB2YWx1ZSA+PSAwID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG4iXX0=
@@ -24,11 +24,6 @@ export declare function isDeadlineReason(reason: unknown): boolean;
24
24
  export declare function isCancelled(signal: AbortSignal | undefined): boolean;
25
25
  /** A deadline as the engine reads one: a finite number (epoch ms), else none. */
26
26
  export declare function readDeadline(value: unknown): number | undefined;
27
- /**
28
- * `setTimeout` for any delay: a delay past the host's limit is waited in chunks, so a 30-day deadline does not fire
29
- * in a millisecond. Returns the one call that cancels it.
30
- */
31
- export declare function setLongTimeout(fn: () => void, ms: number): () => void;
32
27
  /** Whether `value` is an AbortSignal (structurally — a signal from another realm counts). */
33
28
  export declare function isAbortSignal(value: unknown): value is AbortSignal;
34
29
  /** A signal that aborts at a deadline (or with its input), and the one call that releases both. */