@workflow/core 5.0.0-beta.42 → 5.0.0-beta.44
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.
- package/dist/capabilities.d.ts +4 -4
- package/dist/capabilities.js +5 -5
- package/dist/capture-stack.d.ts +1 -1
- package/dist/capture-stack.js +2 -2
- package/dist/class-serialization.d.ts +8 -8
- package/dist/class-serialization.js +9 -9
- package/dist/classify-error.js +5 -5
- package/dist/context-violation-error.d.ts +5 -5
- package/dist/context-violation-error.d.ts.map +1 -1
- package/dist/context-violation-error.js +5 -5
- package/dist/create-hook.d.ts +10 -6
- package/dist/create-hook.d.ts.map +1 -1
- package/dist/create-hook.js +1 -1
- package/dist/define-hook.js +2 -2
- package/dist/describe-error.d.ts +7 -7
- package/dist/describe-error.js +8 -8
- package/dist/encryption.d.ts +5 -5
- package/dist/encryption.js +7 -7
- package/dist/events-consumer.d.ts +19 -7
- package/dist/events-consumer.d.ts.map +1 -1
- package/dist/events-consumer.js +33 -12
- package/dist/flushable-stream.d.ts +4 -4
- package/dist/flushable-stream.js +12 -12
- package/dist/global.d.ts +1 -1
- package/dist/global.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -2
- package/dist/log-format.d.ts +2 -2
- package/dist/log-format.js +5 -5
- package/dist/logger.js +4 -4
- package/dist/private.d.ts +39 -64
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +294 -48
- package/dist/replay-payload-cache.d.ts +1 -1
- package/dist/replay-payload-cache.js +4 -4
- package/dist/runtime/compute-instance.d.ts +4 -3
- package/dist/runtime/compute-instance.d.ts.map +1 -1
- package/dist/runtime/compute-instance.js +5 -4
- package/dist/runtime/constants.d.ts +46 -19
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +76 -38
- package/dist/runtime/count-step-started-events.d.ts +7 -7
- package/dist/runtime/count-step-started-events.js +4 -4
- package/dist/runtime/deployment-guard.d.ts +7 -7
- package/dist/runtime/deployment-guard.js +8 -8
- package/dist/runtime/get-port-lazy.d.ts +2 -2
- package/dist/runtime/get-port-lazy.d.ts.map +1 -1
- package/dist/runtime/get-port-lazy.js +37 -30
- package/dist/runtime/get-world-lazy.d.ts +2 -2
- package/dist/runtime/get-world-lazy.js +3 -3
- package/dist/runtime/helpers.d.ts +18 -18
- package/dist/runtime/helpers.js +27 -27
- package/dist/runtime/quickjs-entrypoint.d.ts +23 -10
- package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
- package/dist/runtime/quickjs-entrypoint.js +200 -81
- package/dist/runtime/quickjs-runtime.d.ts +31 -15
- package/dist/runtime/quickjs-runtime.d.ts.map +1 -1
- package/dist/runtime/quickjs-runtime.js +126 -77
- package/dist/runtime/quickjs-serde.d.ts +10 -10
- package/dist/runtime/quickjs-serde.js +20 -20
- package/dist/runtime/replay-budget.d.ts +4 -4
- package/dist/runtime/replay-budget.js +5 -5
- package/dist/runtime/replay-recovery-reporter.d.ts +1 -1
- package/dist/runtime/replay-recovery-reporter.js +2 -2
- package/dist/runtime/resume-hook.d.ts +2 -2
- package/dist/runtime/resume-hook.js +27 -27
- package/dist/runtime/resume-latency.d.ts +25 -25
- package/dist/runtime/resume-latency.d.ts.map +1 -1
- package/dist/runtime/resume-latency.js +4 -4
- package/dist/runtime/run-id-time.d.ts +2 -2
- package/dist/runtime/run-id-time.js +5 -5
- package/dist/runtime/run.d.ts +21 -4
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +154 -35
- package/dist/runtime/runs.d.ts +4 -4
- package/dist/runtime/runs.js +2 -2
- package/dist/runtime/start.d.ts +3 -3
- package/dist/runtime/start.d.ts.map +1 -1
- package/dist/runtime/start.js +27 -23
- package/dist/runtime/step-executor.d.ts +59 -11
- package/dist/runtime/step-executor.d.ts.map +1 -1
- package/dist/runtime/step-executor.js +116 -42
- package/dist/runtime/step-latency.d.ts +20 -14
- package/dist/runtime/step-latency.d.ts.map +1 -1
- package/dist/runtime/step-latency.js +13 -11
- package/dist/runtime/step-ownership.d.ts +6 -6
- package/dist/runtime/step-ownership.js +8 -8
- package/dist/runtime/step-single-flight.d.ts +1 -1
- package/dist/runtime/step-single-flight.d.ts.map +1 -1
- package/dist/runtime/step-single-flight.js +17 -11
- package/dist/runtime/suspension-handler.d.ts +99 -7
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +678 -57
- package/dist/runtime/unserializable-step.d.ts +34 -0
- package/dist/runtime/unserializable-step.d.ts.map +1 -0
- package/dist/runtime/unserializable-step.js +52 -0
- package/dist/runtime/vm-mode.d.ts +1 -1
- package/dist/runtime/vm-mode.js +2 -2
- package/dist/runtime/wait-continuation.d.ts +31 -9
- package/dist/runtime/wait-continuation.d.ts.map +1 -1
- package/dist/runtime/wait-continuation.js +44 -13
- package/dist/runtime/wait-until.d.ts +1 -1
- package/dist/runtime/wait-until.js +2 -2
- package/dist/runtime/world-compatibility.d.ts +20 -9
- package/dist/runtime/world-compatibility.d.ts.map +1 -1
- package/dist/runtime/world-compatibility.js +24 -13
- package/dist/runtime/world-init.d.ts +5 -5
- package/dist/runtime/world-init.js +6 -6
- package/dist/runtime/world.d.ts.map +1 -1
- package/dist/runtime/world.js +13 -3
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +417 -213
- package/dist/sealed-box.d.ts +7 -7
- package/dist/sealed-box.js +15 -15
- package/dist/serialization/client.js +2 -2
- package/dist/serialization/codec-devalue-vm.d.ts +1 -1
- package/dist/serialization/codec-devalue-vm.js +4 -4
- package/dist/serialization/codec-devalue.d.ts +1 -1
- package/dist/serialization/codec-devalue.js +2 -2
- package/dist/serialization/codec.d.ts +4 -4
- package/dist/serialization/codec.js +2 -2
- package/dist/serialization/compression.d.ts +12 -11
- package/dist/serialization/compression.d.ts.map +1 -1
- package/dist/serialization/compression.js +16 -15
- package/dist/serialization/encryption.d.ts +7 -7
- package/dist/serialization/encryption.d.ts.map +1 -1
- package/dist/serialization/encryption.js +8 -8
- package/dist/serialization/errors.js +2 -2
- package/dist/serialization/format.d.ts +6 -6
- package/dist/serialization/format.js +7 -7
- package/dist/serialization/hardened.d.ts +18 -18
- package/dist/serialization/hardened.d.ts.map +1 -1
- package/dist/serialization/hardened.js +41 -32
- package/dist/serialization/index.d.ts +1 -1
- package/dist/serialization/index.js +2 -2
- package/dist/serialization/reducers/class-vm.d.ts +1 -1
- package/dist/serialization/reducers/class-vm.js +2 -2
- package/dist/serialization/reducers/class.js +2 -2
- package/dist/serialization/reducers/common-vm.js +12 -12
- package/dist/serialization/reducers/common.js +12 -12
- package/dist/serialization/reducers/step-function-vm.d.ts +1 -1
- package/dist/serialization/reducers/step-function-vm.js +2 -2
- package/dist/serialization/reducers/step-function.js +2 -2
- package/dist/serialization/step.js +2 -2
- package/dist/serialization/types.d.ts +5 -5
- package/dist/serialization/types.js +2 -2
- package/dist/serialization/workflow-vm.d.ts +1 -1
- package/dist/serialization/workflow-vm.d.ts.map +1 -1
- package/dist/serialization/workflow-vm.js +13 -10
- package/dist/serialization-format.d.ts +11 -11
- package/dist/serialization-format.d.ts.map +1 -1
- package/dist/serialization-format.js +29 -23
- package/dist/serialization.d.ts +20 -12
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +141 -99
- package/dist/set-attributes.js +2 -2
- package/dist/source-map.d.ts +1 -1
- package/dist/source-map.d.ts.map +1 -1
- package/dist/source-map.js +18 -12
- package/dist/step/context-storage.d.ts +5 -5
- package/dist/step/context-storage.js +1 -1
- package/dist/step/writable-stream.d.ts +3 -3
- package/dist/step/writable-stream.js +7 -7
- package/dist/step.js +12 -12
- package/dist/symbols.d.ts +2 -2
- package/dist/symbols.js +3 -3
- package/dist/telemetry/semantic-conventions.d.ts +21 -13
- package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
- package/dist/telemetry/semantic-conventions.js +21 -15
- package/dist/telemetry.d.ts +9 -3
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +40 -10
- package/dist/test-support/orchestrator-context.d.ts.map +1 -1
- package/dist/test-support/orchestrator-context.js +12 -2
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/dist/vm/index.js +4 -4
- package/dist/vm/script-cache.d.ts.map +1 -1
- package/dist/vm/script-cache.js +23 -17
- package/dist/vm/uint8array-base64.js +1 -1
- package/dist/workflow/abort-controller.d.ts +1 -1
- package/dist/workflow/abort-controller.js +12 -12
- package/dist/workflow/create-hook.js +3 -3
- package/dist/workflow/get-workflow-metadata.js +2 -2
- package/dist/workflow/hook.js +18 -18
- package/dist/workflow/set-attributes.d.ts +1 -1
- package/dist/workflow/set-attributes.js +2 -2
- package/dist/workflow/sleep.js +2 -2
- package/dist/workflow/world-init-stub.d.ts +1 -1
- package/dist/workflow/world-init-stub.js +2 -2
- package/dist/workflow.d.ts +2 -2
- package/dist/workflow.js +36 -14
- package/docs/api-reference/create-hook.mdx +15 -15
- package/docs/api-reference/create-webhook.mdx +15 -15
- package/docs/api-reference/define-hook.mdx +10 -10
- package/docs/api-reference/fatal-error.mdx +2 -2
- package/docs/api-reference/fetch.mdx +7 -7
- package/docs/api-reference/get-step-metadata.mdx +2 -2
- package/docs/api-reference/get-workflow-metadata.mdx +3 -3
- package/docs/api-reference/get-writable.mdx +7 -7
- package/docs/api-reference/index.mdx +1 -1
- package/docs/api-reference/retryable-error.mdx +1 -1
- package/docs/api-reference/set-attributes.mdx +2 -2
- package/docs/api-reference/sleep.mdx +3 -3
- package/docs/foundations/cancellation.mdx +31 -31
- package/docs/foundations/errors-and-retries.mdx +42 -11
- package/docs/foundations/hooks.mdx +37 -37
- package/docs/foundations/idempotency.mdx +9 -9
- package/docs/foundations/serialization.mdx +21 -22
- package/docs/foundations/starting-workflows.mdx +36 -37
- package/docs/foundations/streaming.mdx +68 -39
- package/docs/foundations/versioning.mdx +3 -3
- package/docs/foundations/workflows-and-steps.mdx +9 -9
- package/docs/how-it-works/cancellation.mdx +62 -62
- package/docs/how-it-works/code-transform.mdx +66 -54
- package/docs/how-it-works/encryption.mdx +25 -21
- package/docs/how-it-works/event-sourcing.mdx +84 -28
- package/docs/how-it-works/framework-integrations.mdx +12 -12
- package/docs/how-it-works/understanding-directives.mdx +21 -21
- package/package.json +7 -7
|
@@ -7,11 +7,11 @@ import type { Event } from '@workflow/world';
|
|
|
7
7
|
* beginning to execute. STSO (step-to-step overhead) measures the previous
|
|
8
8
|
* step's terminal event → the next step's body beginning to execute. RSFS
|
|
9
9
|
* (run-started-to-first-step) measures the `run_started` response landing →
|
|
10
|
-
* the first step's start POST being issued
|
|
10
|
+
* the first step's start POST being issued, a sub-window of TTFS that
|
|
11
11
|
* isolates replay overhead from the run-creation queue hop; `finalSchedulingReplay`
|
|
12
12
|
* is the synchronous workflow-function-execution duration of only the FINAL
|
|
13
13
|
* replay pass within that window (the pass that reached and scheduled the
|
|
14
|
-
* first step)
|
|
14
|
+
* first step); it is NOT accumulated across earlier pre-first-step passes
|
|
15
15
|
* (see {@link StepLatencyTracking.replayMs}), so it must not be read as "the
|
|
16
16
|
* replay portion of RSFS". All are attached to the step's terminal
|
|
17
17
|
* event so a backend can emit latency metrics from the event write alone,
|
|
@@ -42,7 +42,7 @@ export interface StepLatencyTracking {
|
|
|
42
42
|
* workflow-body `setAttributes` before the first step
|
|
43
43
|
* resolves through an extra replay (see the `hasAttributeEvents` branch in
|
|
44
44
|
* runtime.ts), so everything from this write until the step body runs is
|
|
45
|
-
* the duration of the setAttributes call
|
|
45
|
+
* the duration of the setAttributes call, which is subtracted by ending
|
|
46
46
|
* the measurement at the point where the step would otherwise have been
|
|
47
47
|
* scheduled.
|
|
48
48
|
*/
|
|
@@ -59,7 +59,7 @@ export interface StepLatencyTracking {
|
|
|
59
59
|
eventCount?: number;
|
|
60
60
|
/**
|
|
61
61
|
* Epoch ms the `run_started` response was received/parsed by the SDK.
|
|
62
|
-
* Present only when the step qualifies for RSFS
|
|
62
|
+
* Present only when the step qualifies for RSFS: the same eligibility as
|
|
63
63
|
* TTFS (see {@link computeStepLatencyTracking}), plus a recoverable
|
|
64
64
|
* anchor. In turbo mode, `run_started` is backgrounded rather than
|
|
65
65
|
* awaited, so this is stamped at the point the runtime synthesizes the
|
|
@@ -77,12 +77,12 @@ export interface StepLatencyTracking {
|
|
|
77
77
|
* event commits, the step's own start POST). Present only alongside
|
|
78
78
|
* `rsfsAnchorMs`.
|
|
79
79
|
*
|
|
80
|
-
* This is the FINAL replay pass only
|
|
80
|
+
* This is the FINAL replay pass only: the invocation that reached and
|
|
81
81
|
* scheduled the first step. Valid RSFS paths can replay more than once
|
|
82
82
|
* before the first step (e.g. a workflow-body `setAttributes()` detour
|
|
83
83
|
* replays twice), and a redelivery omits earlier invocations' replay work
|
|
84
84
|
* entirely; this value is not accumulated across those earlier passes.
|
|
85
|
-
* Do not read it as "the replay portion of RSFS"
|
|
85
|
+
* Do not read it as "the replay portion of RSFS": RSFS
|
|
86
86
|
* ({@link rsfsAnchorMs}) covers the whole run_started-to-first-step
|
|
87
87
|
* window, this covers only the last pass.
|
|
88
88
|
*/
|
|
@@ -100,7 +100,7 @@ export interface StepLatencyEventData {
|
|
|
100
100
|
rsfs?: number;
|
|
101
101
|
/**
|
|
102
102
|
* Client-measured wall-clock ms of the FINAL replay pass that scheduled
|
|
103
|
-
* the first step (see {@link StepLatencyTracking.replayMs})
|
|
103
|
+
* the first step (see {@link StepLatencyTracking.replayMs}); not
|
|
104
104
|
* accumulated across earlier pre-first-step passes, so it must not be
|
|
105
105
|
* read as "the replay portion of `rsfs`".
|
|
106
106
|
*/
|
|
@@ -131,13 +131,13 @@ export declare function computeStepLatencyTracking(params: {
|
|
|
131
131
|
runCreatedAtMs: number | undefined;
|
|
132
132
|
/**
|
|
133
133
|
* Epoch ms the `run_started` response was received/parsed by the SDK (or,
|
|
134
|
-
* under turbo, the instant the run was synthesized locally
|
|
134
|
+
* under turbo, the instant the run was synthesized locally; see
|
|
135
135
|
* {@link StepLatencyTracking.rsfsAnchorMs}). Absent disqualifies RSFS.
|
|
136
136
|
*/
|
|
137
137
|
runStartedReceivedAtMs: number | undefined;
|
|
138
138
|
/**
|
|
139
139
|
* Wall-clock ms this suspension's `runWorkflow` call spent executing
|
|
140
|
-
* synchronously before throwing
|
|
140
|
+
* synchronously before throwing: the FINAL replay pass only, not
|
|
141
141
|
* accumulated across earlier passes. See
|
|
142
142
|
* {@link StepLatencyTracking.replayMs}.
|
|
143
143
|
*/
|
|
@@ -148,7 +148,7 @@ export declare function computeStepLatencyTracking(params: {
|
|
|
148
148
|
* The accumulator's value as of the suspension that wrote the run's first
|
|
149
149
|
* attr_set (its hook phase runs before its attr writes). When the
|
|
150
150
|
* measurement ends at the attr write, only hook time from before that
|
|
151
|
-
* point may be subtracted
|
|
151
|
+
* point may be subtracted; later hook writes fall outside the measured
|
|
152
152
|
* window. Undefined when no attr suspension happened in this invocation
|
|
153
153
|
* (e.g. the attr_set was loaded from a redelivery's snapshot, where no
|
|
154
154
|
* same-invocation hook time precedes it).
|
|
@@ -157,14 +157,14 @@ export declare function computeStepLatencyTracking(params: {
|
|
|
157
157
|
/**
|
|
158
158
|
* Whether the suspension that scheduled this batch also created waits.
|
|
159
159
|
* Those `wait_created` writes are not in `events` yet (they were committed
|
|
160
|
-
* by this
|
|
160
|
+
* by this suspension pass), so they must be reported separately. A
|
|
161
161
|
* wait disqualifies both measurements.
|
|
162
162
|
*/
|
|
163
163
|
suspensionHasWaits: boolean;
|
|
164
164
|
/**
|
|
165
165
|
* Whether the suspension that scheduled this batch also created hooks
|
|
166
|
-
* (also not in `events` yet). Hooks keep TTFS eligible
|
|
167
|
-
* write time is subtracted via `preStepBlockingMs`
|
|
166
|
+
* (also not in `events` yet). Hooks keep TTFS eligible (their measured
|
|
167
|
+
* write time is subtracted via `preStepBlockingMs`) but disqualify STSO,
|
|
168
168
|
* which is only meaningful for a pure back-to-back step gap.
|
|
169
169
|
*/
|
|
170
170
|
suspensionCreatedHooks: boolean;
|
|
@@ -175,7 +175,7 @@ export declare function computeStepLatencyTracking(params: {
|
|
|
175
175
|
* Compute the latency telemetry to attach to the step's terminal event.
|
|
176
176
|
* Called by `executeStep` with the wall-clock timestamp taken immediately
|
|
177
177
|
* before user step code runs. Returns undefined when there is nothing to
|
|
178
|
-
* report (no tracking, or a retry attempt
|
|
178
|
+
* report (no tracking, or a retry attempt; retries measure neither TTFS nor
|
|
179
179
|
* STSO).
|
|
180
180
|
*/
|
|
181
181
|
export declare function computeStepLatencyEventData(params: {
|
|
@@ -193,5 +193,11 @@ export declare function computeStepLatencyEventData(params: {
|
|
|
193
193
|
lazyStepStart: boolean;
|
|
194
194
|
/** Whether the body ran optimistically, without awaiting step_started. */
|
|
195
195
|
optimisticStart: boolean;
|
|
196
|
+
/**
|
|
197
|
+
* Whether the step's `step_created` + `step_started` pair was pre-claimed
|
|
198
|
+
* inside the suspension handler's batched fan-out write (no start POST of
|
|
199
|
+
* its own at all).
|
|
200
|
+
*/
|
|
201
|
+
preclaimedStart?: boolean;
|
|
196
202
|
}): StepLatencyEventData | undefined;
|
|
197
203
|
//# sourceMappingURL=step-latency.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"step-latency.d.ts","sourceRoot":"","sources":["../../src/runtime/step-latency.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE7C;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;;;;;;OAUG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gEAAgE;IAChE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;;;;;;OAWG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,KAAK,EAAE,OAAO,CAAC;CAChB;AAYD,2EAA2E;AAC3E,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAkCD;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE;IACjD,wEAAwE;IACxE,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB;;;;;;;;OAQG;IACH,sBAAsB,EAAE,OAAO,CAAC;IAChC,0EAA0E;IAC1E,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC;;;;OAIG;IACH,sBAAsB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C;;;;;OAKG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,iBAAiB,EAAE,MAAM,CAAC;IAC1B;;;;;;;;OAQG;IACH,2BAA2B,EAAE,MAAM,GAAG,SAAS,CAAC;IAChD;;;;;OAKG;IACH,kBAAkB,EAAE,OAAO,CAAC;IAC5B;;;;;OAKG;IACH,sBAAsB,EAAE,OAAO,CAAC;IAChC,wDAAwD;IACxD,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,mBAAmB,GAAG,SAAS,CAuFlC;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE;IAClD,QAAQ,EAAE,mBAAmB,GAAG,SAAS,CAAC;IAC1C,4EAA4E;IAC5E,mBAAmB,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,qBAAqB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,aAAa,EAAE,OAAO,CAAC;IACvB,0EAA0E;IAC1E,eAAe,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"step-latency.d.ts","sourceRoot":"","sources":["../../src/runtime/step-latency.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE7C;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;;;;;;OAUG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gEAAgE;IAChE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;;;;;;OAWG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,KAAK,EAAE,OAAO,CAAC;CAChB;AAYD,2EAA2E;AAC3E,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAkCD;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE;IACjD,wEAAwE;IACxE,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB;;;;;;;;OAQG;IACH,sBAAsB,EAAE,OAAO,CAAC;IAChC,0EAA0E;IAC1E,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC;;;;OAIG;IACH,sBAAsB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C;;;;;OAKG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,iBAAiB,EAAE,MAAM,CAAC;IAC1B;;;;;;;;OAQG;IACH,2BAA2B,EAAE,MAAM,GAAG,SAAS,CAAC;IAChD;;;;;OAKG;IACH,kBAAkB,EAAE,OAAO,CAAC;IAC5B;;;;;OAKG;IACH,sBAAsB,EAAE,OAAO,CAAC;IAChC,wDAAwD;IACxD,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,mBAAmB,GAAG,SAAS,CAuFlC;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE;IAClD,QAAQ,EAAE,mBAAmB,GAAG,SAAS,CAAC;IAC1C,4EAA4E;IAC5E,mBAAmB,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,qBAAqB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,aAAa,EAAE,OAAO,CAAC;IACvB,0EAA0E;IAC1E,eAAe,EAAE,OAAO,CAAC;IACzB;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,GAAG,oBAAoB,GAAG,SAAS,CAqFnC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Most negative raw duration still attributed to cross-machine clock skew
|
|
3
|
-
* (and clamped to 0). Anything more negative means a corrupt anchor
|
|
4
|
-
* mis-decoded run-ID timestamp
|
|
3
|
+
* (and clamped to 0). Anything more negative means a corrupt anchor (e.g. a
|
|
4
|
+
* mis-decoded run-ID timestamp) and the sample is dropped instead: a
|
|
5
5
|
* systematically corrupt anchor would otherwise report an exact-zero latency
|
|
6
6
|
* on every sample, silently dragging entire percentile distributions to 0
|
|
7
7
|
* rather than surfacing as missing data.
|
|
@@ -23,7 +23,7 @@ const MAX_CLOCK_SKEW_MS = 60_000;
|
|
|
23
23
|
* {@link StepLatencyTracking.preStepBlockingMs}.
|
|
24
24
|
* - `attr_set` (workflow-body `setAttributes`): resolves through
|
|
25
25
|
* an extra replay before steps run. Subtracted by ending the measurement at
|
|
26
|
-
* the first attr write's timestamp instead
|
|
26
|
+
* the first attr write's timestamp instead; see
|
|
27
27
|
* {@link StepLatencyTracking.preStepAttrStartMs}.
|
|
28
28
|
*/
|
|
29
29
|
const TTFS_DISQUALIFYING_EVENT_TYPES = new Set([
|
|
@@ -64,7 +64,7 @@ export function computeStepLatencyTracking(params) {
|
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
|
-
// STSO: the two steps ran back-to-back
|
|
67
|
+
// STSO: the two steps ran back-to-back, so the newest known event is the
|
|
68
68
|
// previous step's terminal event, with nothing (hook_received, waits,
|
|
69
69
|
// attr_set, ...) in between and this suspension scheduling nothing but
|
|
70
70
|
// steps.
|
|
@@ -123,7 +123,7 @@ export function computeStepLatencyTracking(params) {
|
|
|
123
123
|
* Compute the latency telemetry to attach to the step's terminal event.
|
|
124
124
|
* Called by `executeStep` with the wall-clock timestamp taken immediately
|
|
125
125
|
* before user step code runs. Returns undefined when there is nothing to
|
|
126
|
-
* report (no tracking, or a retry attempt
|
|
126
|
+
* report (no tracking, or a retry attempt; retries measure neither TTFS nor
|
|
127
127
|
* STSO).
|
|
128
128
|
*/
|
|
129
129
|
export function computeStepLatencyEventData(params) {
|
|
@@ -138,11 +138,11 @@ export function computeStepLatencyEventData(params) {
|
|
|
138
138
|
// doc comment).
|
|
139
139
|
//
|
|
140
140
|
// A pre-step setAttributes detour ends the measurement at the first attr
|
|
141
|
-
// write instead of the step's code start
|
|
141
|
+
// write instead of the step's code start: the remainder is the duration
|
|
142
142
|
// of the setAttributes call (resolved via an extra replay), which is
|
|
143
143
|
// subtracted rather than disqualifying the sample. In that case
|
|
144
144
|
// `tracking.preStepBlockingMs` already holds only the hook time from
|
|
145
|
-
// BEFORE the attr write
|
|
145
|
+
// BEFORE the attr write; hook writes after the window closed are excluded
|
|
146
146
|
// by computeStepLatencyTracking (see preStepBlockingBeforeAttrMs).
|
|
147
147
|
const ttfsEndMs = tracking.preStepAttrStartMs ?? params.stepCodeStartedAtMs;
|
|
148
148
|
const rawTtfs = tracking.ttfsAnchorMs !== undefined
|
|
@@ -157,12 +157,12 @@ export function computeStepLatencyEventData(params) {
|
|
|
157
157
|
const stso = rawStso !== undefined && rawStso >= -MAX_CLOCK_SKEW_MS
|
|
158
158
|
? Math.max(0, rawStso)
|
|
159
159
|
: undefined;
|
|
160
|
-
// RSFS ends at the actual start-POST instant, not at ttfsEndMs
|
|
160
|
+
// RSFS ends at the actual start-POST instant, not at ttfsEndMs: unlike
|
|
161
161
|
// TTFS it is not subject to the pre-step attr-write shortcut, so a
|
|
162
162
|
// pre-step setAttributes detour (rare) makes RSFS include the detour
|
|
163
163
|
// while TTFS excludes it. `finalSchedulingReplay` is a direct passthrough
|
|
164
|
-
// of `tracking.replayMs
|
|
165
|
-
// StepLatencyTracking.replayMs)
|
|
164
|
+
// of `tracking.replayMs`, the FINAL replay pass only (see
|
|
165
|
+
// StepLatencyTracking.replayMs), so no further subtraction applies, but
|
|
166
166
|
// it also means it is NOT accumulated across any earlier pre-first-step
|
|
167
167
|
// passes (e.g. a setAttributes detour) and must not be read as "the
|
|
168
168
|
// replay portion of rsfs"; rsfs covers the whole window.
|
|
@@ -190,6 +190,8 @@ export function computeStepLatencyEventData(params) {
|
|
|
190
190
|
optimizations.push('lazyStepStart');
|
|
191
191
|
if (params.optimisticStart)
|
|
192
192
|
optimizations.push('optimisticStart');
|
|
193
|
+
if (params.preclaimedStart)
|
|
194
|
+
optimizations.push('preclaimedStart');
|
|
193
195
|
return {
|
|
194
196
|
...(ttfs !== undefined ? { ttfs } : {}),
|
|
195
197
|
...(stso !== undefined ? { stso } : {}),
|
|
@@ -204,4 +206,4 @@ export function computeStepLatencyEventData(params) {
|
|
|
204
206
|
optimizations,
|
|
205
207
|
};
|
|
206
208
|
}
|
|
207
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1sYXRlbmN5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvc3RlcC1sYXRlbmN5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQThGQTs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUM7QUFvQmpDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxNQUFNLDhCQUE4QixHQUFvQyxJQUFJLEdBQUcsQ0FDN0U7SUFDRSxjQUFjO0lBQ2QsY0FBYztJQUNkLGdCQUFnQjtJQUNoQixhQUFhO0lBQ2IsZUFBZTtJQUNmLGVBQWU7SUFDZixjQUFjO0lBQ2QsZ0JBQWdCO0NBQ2pCLENBQ0YsQ0FBQztBQUVGOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSwwQkFBMEIsQ0FBQyxNQXdEMUM7SUFDQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDO0lBRTFCLElBQUksWUFBWSxHQUNkLE1BQU0sQ0FBQyxzQkFBc0I7UUFDN0IsTUFBTSxDQUFDLGNBQWMsS0FBSyxTQUFTO1FBQ25DLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDO0lBQzdCLElBQUksa0JBQXNDLENBQUM7SUFDM0MsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNqQixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzNCLElBQUksOEJBQThCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUN4RCxZQUFZLEdBQUcsS0FBSyxDQUFDO2dCQUNyQixNQUFNO1lBQ1IsQ0FBQztZQUNELElBQUksS0FBSyxDQUFDLFNBQVMsS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDbkMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUMzRCxrQkFBa0I7b0JBQ2hCLGtCQUFrQixLQUFLLFNBQVM7d0JB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QUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN2QyxHQUFHLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLEdBQUcsQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLFFBQVEsQ0FBQyxTQUFTLEtBQUssU0FBUztZQUN4RCxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLFNBQVMsRUFBRTtZQUNuQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ1AsR0FBRyxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksUUFBUSxDQUFDLFVBQVUsS0FBSyxTQUFTO1lBQ3pELENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsVUFBVSxFQUFFO1lBQ3JDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDUCxHQUFHLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLEdBQUcsQ0FBQyxxQkFBcUIsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUscUJBQXFCLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3pFLGFBQWE7S0FDZCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRXZlbnQgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuXG4vKipcbiAqIENsaWVudC1zaWRlIGxhdGVuY3kgbWVhc3VyZW1lbnQgKFRURlMgLyBTVFNPIC8gUlNGUykgdGhyZWFkZWQgZnJvbSB0aGVcbiAqIG9yY2hlc3RyYXRvcidzIGlubGluZSBleGVjdXRpb24gcGF0aCBpbnRvIGBleGVjdXRlU3RlcGAuXG4gKlxuICogVFRGUyAodGltZS10by1maXJzdC1zdGVwKSBtZWFzdXJlcyBydW4gY3JlYXRpb24g4oaSIHRoZSBmaXJzdCBzdGVwJ3MgYm9keVxuICogYmVnaW5uaW5nIHRvIGV4ZWN1dGUuIFNUU08gKHN0ZXAtdG8tc3RlcCBvdmVyaGVhZCkgbWVhc3VyZXMgdGhlIHByZXZpb3VzXG4gKiBzdGVwJ3MgdGVybWluYWwgZXZlbnQg4oaSIHRoZSBuZXh0IHN0ZXAncyBib2R5IGJlZ2lubmluZyB0byBleGVjdXRlLiBSU0ZTXG4gKiAocnVuLXN0YXJ0ZWQtdG8tZmlyc3Qtc3RlcCkgbWVhc3VyZXMgdGhlIGBydW5fc3RhcnRlZGAgcmVzcG9uc2UgbGFuZGluZyDihpJcbiAqIHRoZSBmaXJzdCBzdGVwJ3Mgc3RhcnQgUE9TVCBiZWluZyBpc3N1ZWQg4oCUIGEgc3ViLXdpbmRvdyBvZiBUVEZTIHRoYXRcbiAqIGlzb2xhdGVzIHJlcGxheSBvdmVyaGVhZCBmcm9tIHRoZSBydW4tY3JlYXRpb24gcXVldWUgaG9wOyBgZmluYWxTY2hlZHVsaW5nUmVwbGF5YFxuICogaXMgdGhlIHN5bmNocm9ub3VzIHdvcmtmbG93LWZ1bmN0aW9uLWV4ZWN1dGlvbiBkdXJhdGlvbiBvZiBvbmx5IHRoZSBGSU5BTFxuICogcmVwbGF5IHBhc3Mgd2l0aGluIHRoYXQgd2luZG93ICh0aGUgcGFzcyB0aGF0IHJlYWNoZWQgYW5kIHNjaGVkdWxlZCB0aGVcbiAqIGZpcnN0IHN0ZXApIOKAlCBpdCBpcyBOT1QgYWNjdW11bGF0ZWQgYWNyb3NzIGVhcmxpZXIgcHJlLWZpcnN0LXN0ZXAgcGFzc2VzXG4gKiAoc2VlIHtAbGluayBTdGVwTGF0ZW5jeVRyYWNraW5nLnJlcGxheU1zfSksIHNvIGl0IG11c3Qgbm90IGJlIHJlYWQgYXMgXCJ0aGVcbiAqIHJlcGxheSBwb3J0aW9uIG9mIFJTRlNcIi4gQWxsIGFyZSBhdHRhY2hlZCB0byB0aGUgc3RlcCdzIHRlcm1pbmFsXG4gKiBldmVudCBzbyBhIGJhY2tlbmQgY2FuIGVtaXQgbGF0ZW5jeSBtZXRyaWNzIGZyb20gdGhlIGV2ZW50IHdyaXRlIGFsb25lLFxuICogd2l0aG91dCBleHRyYSBldmVudC1sb2cgcXVlcmllcy5cbiAqXG4gKiBFbGlnaWJpbGl0eSBpcyBkZWNpZGVkIGJ5IHRoZSBvcmNoZXN0cmF0b3IgKHdoaWNoIG93bnMgdGhlIGV2ZW50IGxvZykgdmlhXG4gKiB7QGxpbmsgY29tcHV0ZVN0ZXBMYXRlbmN5VHJhY2tpbmd9OyB0aGUgZmluYWwgdmFsdWVzIGFyZSBjb21wdXRlZCBieVxuICogYGV4ZWN1dGVTdGVwYCByaWdodCBiZWZvcmUgdXNlciBjb2RlIHJ1bnMgdmlhXG4gKiB7QGxpbmsgY29tcHV0ZVN0ZXBMYXRlbmN5RXZlbnREYXRhfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGVwTGF0ZW5jeVRyYWNraW5nIHtcbiAgLyoqXG4gICAqIEVwb2NoIG1zIG9mIHJ1biBjcmVhdGlvbiAoZnJvbSB0aGUgcnVuLWlkIFVMSUQsIGZhbGxpbmcgYmFjayB0byB0aGUgcnVuXG4gICAqIHNuYXBzaG90J3MgYGNyZWF0ZWRBdGApLiBQcmVzZW50IG9ubHkgd2hlbiB0aGUgc3RlcCBxdWFsaWZpZXMgZm9yIFRURlMuXG4gICAqL1xuICB0dGZzQW5jaG9yTXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBXYWxsLWNsb2NrIG1zIHRoaXMgaW52b2NhdGlvbiBzcGVudCBjb21taXR0aW5nIGBob29rX2NyZWF0ZWRgIGV2ZW50c1xuICAgKiBiZWZvcmUgdGhlIGZpcnN0IHN0ZXAgKGZpcmUtYW5kLWZvcmdldCBgY3JlYXRlSG9vaygpYCBhaGVhZCBvZiB0aGUgZmlyc3RcbiAgICogc3RlcCBjb21taXRzIGluIHRoZSBzYW1lIHN1c3BlbnNpb24gYmF0Y2gpLiBTdWJ0cmFjdGVkIGZyb20gVFRGUyBzbyB0aGVcbiAgICogbWV0cmljIHJlZmxlY3RzIHJ1bnRpbWUgb3ZlcmhlYWQgcmF0aGVyIHRoYW4gdGhlIHVzZXIncyBob29rIHdyaXRlcy5cbiAgICovXG4gIHByZVN0ZXBCbG9ja2luZ01zPzogbnVtYmVyO1xuICAvKipcbiAgICogRXBvY2ggbXMgdGhlIGZpcnN0IHByZS1zdGVwIGBhdHRyX3NldGAgd3JpdGUgYmVnYW4gKGl0cyBjbGllbnQtc3RhbXBlZFxuICAgKiBgb2NjdXJyZWRBdGAsIGZhbGxpbmcgYmFjayB0byBgY3JlYXRlZEF0YCkuIFdoZW4gcHJlc2VudCwgdGhlIFRURlNcbiAgICogbWVhc3VyZW1lbnQgRU5EUyBoZXJlIGluc3RlYWQgb2YgYXQgdGhlIHN0ZXAncyBjb2RlIHN0YXJ0OiBhXG4gICAqIHdvcmtmbG93LWJvZHkgYHNldEF0dHJpYnV0ZXNgIGJlZm9yZSB0aGUgZmlyc3Qgc3RlcFxuICAgKiByZXNvbHZlcyB0aHJvdWdoIGFuIGV4dHJhIHJlcGxheSAoc2VlIHRoZSBgaGFzQXR0cmlidXRlRXZlbnRzYCBicmFuY2ggaW5cbiAgICogcnVudGltZS50cyksIHNvIGV2ZXJ5dGhpbmcgZnJvbSB0aGlzIHdyaXRlIHVudGlsIHRoZSBzdGVwIGJvZHkgcnVucyBpc1xuICAgKiB0aGUgZHVyYXRpb24gb2YgdGhlIHNldEF0dHJpYnV0ZXMgY2FsbCDigJQgd2hpY2ggaXMgc3VidHJhY3RlZCBieSBlbmRpbmdcbiAgICogdGhlIG1lYXN1cmVtZW50IGF0IHRoZSBwb2ludCB3aGVyZSB0aGUgc3RlcCB3b3VsZCBvdGhlcndpc2UgaGF2ZSBiZWVuXG4gICAqIHNjaGVkdWxlZC5cbiAgICovXG4gIHByZVN0ZXBBdHRyU3RhcnRNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIEVwb2NoIG1zIHRoZSBwcmV2aW91cyBzdGVwJ3MgdGVybWluYWwgZXZlbnQgd2FzIHJlY29yZGVkIChpdHNcbiAgICogY2xpZW50LXN0YW1wZWQgYG9jY3VycmVkQXRgLCBmYWxsaW5nIGJhY2sgdG8gYGNyZWF0ZWRBdGApLiBQcmVzZW50IG9ubHlcbiAgICogd2hlbiB0aGUgc3RlcCBxdWFsaWZpZXMgZm9yIFNUU08uXG4gICAqL1xuICBwcmV2U3RlcEVuZE1zPzogbnVtYmVyO1xuICAvKiogTnVtYmVyIG9mIHVuaXF1ZSB0ZXJtaW5hbCBzdGVwcyBhbHJlYWR5IGluIHRoZSBldmVudCBsb2cuICovXG4gIHN0ZXBDb3VudD86IG51bWJlcjtcbiAgLyoqIE51bWJlciBvZiBldmVudHMgYWxyZWFkeSBpbiB0aGUgZXZlbnQgbG9nLiAqL1xuICBldmVudENvdW50PzogbnVtYmVyO1xuICAvKipcbiAgICogRXBvY2ggbXMgdGhlIGBydW5fc3RhcnRlZGAgcmVzcG9uc2Ugd2FzIHJlY2VpdmVkL3BhcnNlZCBieSB0aGUgU0RLLlxuICAgKiBQcmVzZW50IG9ubHkgd2hlbiB0aGUgc3RlcCBxdWFsaWZpZXMgZm9yIFJTRlMg4oCUIHRoZSBzYW1lIGVsaWdpYmlsaXR5IGFzXG4gICAqIFRURlMgKHNlZSB7QGxpbmsgY29tcHV0ZVN0ZXBMYXRlbmN5VHJhY2tpbmd9KSwgcGx1cyBhIHJlY292ZXJhYmxlXG4gICAqIGFuY2hvci4gSW4gdHVyYm8gbW9kZSwgYHJ1bl9zdGFydGVkYCBpcyBiYWNrZ3JvdW5kZWQgcmF0aGVyIHRoYW5cbiAgICogYXdhaXRlZCwgc28gdGhpcyBpcyBzdGFtcGVkIGF0IHRoZSBwb2ludCB0aGUgcnVudGltZSBzeW50aGVzaXplcyB0aGVcbiAgICogcnVuIGxvY2FsbHkgYW5kIGJlZ2lucyByZXBsYXkgaW5zdGVhZCBvZiBhdCB0aGUgcmVhbCByZXNwb25zZTsgdGhlXG4gICAqIGZpcnN0IHN0ZXAncyBzdGFydCBQT1NUIGlzIHN0aWxsIGNoYWluZWQgb24gdGhlIHJlYWwgYHJ1bl9zdGFydGVkYFxuICAgKiBwcm9taXNlIChzZWUgc3RlcC1leGVjdXRvci50cyksIHNvIFJTRlMgc3RpbGwgZW5kcyB1cCBtZWFzdXJpbmcgdGhlXG4gICAqIGdlbnVpbmUgcnVuX3N0YXJ0ZWQtdG8tZmlyc3Qtc3RlcC1QT1NUIHN0cmV0Y2ggZXZlbiB0aG91Z2ggdGhlIHR3b1xuICAgKiBoYWx2ZXMgb3ZlcmxhcCB1bmRlciB0dXJiby5cbiAgICovXG4gIHJzZnNBbmNob3JNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFdhbGwtY2xvY2sgbXMgdGhpcyBpbnZvY2F0aW9uJ3Mgc3luY2hyb25vdXMgd29ya2Zsb3ctZnVuY3Rpb24gcmVwbGF5XG4gICAqIHRvb2s6IGZyb20gY2FsbGluZyBgcnVuV29ya2Zsb3dgIHRvIGl0IHRocm93aW5nIHRoZSBzdXNwZW5zaW9uIHRoYXRcbiAgICogc2NoZWR1bGVkIHRoaXMgYmF0Y2guIEV4Y2x1ZGVzIGF3YWl0ZWQgbmV0d29yayBJL08gKHRoZSBzdXNwZW5zaW9uJ3NcbiAgICogZXZlbnQgY29tbWl0cywgdGhlIHN0ZXAncyBvd24gc3RhcnQgUE9TVCkuIFByZXNlbnQgb25seSBhbG9uZ3NpZGVcbiAgICogYHJzZnNBbmNob3JNc2AuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIEZJTkFMIHJlcGxheSBwYXNzIG9ubHkg4oCUIHRoZSBpbnZvY2F0aW9uIHRoYXQgcmVhY2hlZCBhbmRcbiAgICogc2NoZWR1bGVkIHRoZSBmaXJzdCBzdGVwLiBWYWxpZCBSU0ZTIHBhdGhzIGNhbiByZXBsYXkgbW9yZSB0aGFuIG9uY2VcbiAgICogYmVmb3JlIHRoZSBmaXJzdCBzdGVwIChlLmcuIGEgd29ya2Zsb3ctYm9keSBgc2V0QXR0cmlidXRlcygpYCBkZXRvdXJcbiAgICogcmVwbGF5cyB0d2ljZSksIGFuZCBhIHJlZGVsaXZlcnkgb21pdHMgZWFybGllciBpbnZvY2F0aW9ucycgcmVwbGF5IHdvcmtcbiAgICogZW50aXJlbHk7IHRoaXMgdmFsdWUgaXMgbm90IGFjY3VtdWxhdGVkIGFjcm9zcyB0aG9zZSBlYXJsaWVyIHBhc3Nlcy5cbiAgICogRG8gbm90IHJlYWQgaXQgYXMgXCJ0aGUgcmVwbGF5IHBvcnRpb24gb2YgUlNGU1wiIOKAlCBSU0ZTXG4gICAqICh7QGxpbmsgcnNmc0FuY2hvck1zfSkgY292ZXJzIHRoZSB3aG9sZSBydW5fc3RhcnRlZC10by1maXJzdC1zdGVwXG4gICAqIHdpbmRvdywgdGhpcyBjb3ZlcnMgb25seSB0aGUgbGFzdCBwYXNzLlxuICAgKi9cbiAgcmVwbGF5TXM/OiBudW1iZXI7XG4gIC8qKiBXaGV0aGVyIHR1cmJvIG1vZGUgaXMgYWN0aXZlIGZvciB0aGlzIGludm9jYXRpb24uICovXG4gIHR1cmJvOiBib29sZWFuO1xufVxuXG4vKipcbiAqIE1vc3QgbmVnYXRpdmUgcmF3IGR1cmF0aW9uIHN0aWxsIGF0dHJpYnV0ZWQgdG8gY3Jvc3MtbWFjaGluZSBjbG9jayBza2V3XG4gKiAoYW5kIGNsYW1wZWQgdG8gMCkuIEFueXRoaW5nIG1vcmUgbmVnYXRpdmUgbWVhbnMgYSBjb3JydXB0IGFuY2hvciDigJQgZS5nLiBhXG4gKiBtaXMtZGVjb2RlZCBydW4tSUQgdGltZXN0YW1wIOKAlCBhbmQgdGhlIHNhbXBsZSBpcyBkcm9wcGVkIGluc3RlYWQ6IGFcbiAqIHN5c3RlbWF0aWNhbGx5IGNvcnJ1cHQgYW5jaG9yIHdvdWxkIG90aGVyd2lzZSByZXBvcnQgYW4gZXhhY3QtemVybyBsYXRlbmN5XG4gKiBvbiBldmVyeSBzYW1wbGUsIHNpbGVudGx5IGRyYWdnaW5nIGVudGlyZSBwZXJjZW50aWxlIGRpc3RyaWJ1dGlvbnMgdG8gMFxuICogcmF0aGVyIHRoYW4gc3VyZmFjaW5nIGFzIG1pc3NpbmcgZGF0YS5cbiAqL1xuY29uc3QgTUFYX0NMT0NLX1NLRVdfTVMgPSA2MF8wMDA7XG5cbi8qKiBMYXRlbmN5IHRlbGVtZXRyeSBhdHRhY2hlZCB0byBhIHN0ZXAncyB0ZXJtaW5hbCBldmVudCdzIGBldmVudERhdGFgLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGVwTGF0ZW5jeUV2ZW50RGF0YSB7XG4gIHR0ZnM/OiBudW1iZXI7XG4gIHN0c28/OiBudW1iZXI7XG4gIHN0ZXBDb3VudD86IG51bWJlcjtcbiAgZXZlbnRDb3VudD86IG51bWJlcjtcbiAgLyoqIENsaWVudC1tZWFzdXJlZCBydW5fc3RhcnRlZCDihpIgZmlyc3Qgc3RlcCdzIHN0YXJ0IFBPU1QsIG1zLiAqL1xuICByc2ZzPzogbnVtYmVyO1xuICAvKipcbiAgICogQ2xpZW50LW1lYXN1cmVkIHdhbGwtY2xvY2sgbXMgb2YgdGhlIEZJTkFMIHJlcGxheSBwYXNzIHRoYXQgc2NoZWR1bGVkXG4gICAqIHRoZSBmaXJzdCBzdGVwIChzZWUge0BsaW5rIFN0ZXBMYXRlbmN5VHJhY2tpbmcucmVwbGF5TXN9KSDigJQgbm90XG4gICAqIGFjY3VtdWxhdGVkIGFjcm9zcyBlYXJsaWVyIHByZS1maXJzdC1zdGVwIHBhc3Nlcywgc28gaXQgbXVzdCBub3QgYmVcbiAgICogcmVhZCBhcyBcInRoZSByZXBsYXkgcG9ydGlvbiBvZiBgcnNmc2BcIi5cbiAgICovXG4gIGZpbmFsU2NoZWR1bGluZ1JlcGxheT86IG51bWJlcjtcbiAgb3B0aW1pemF0aW9ucz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEV2ZW50IHR5cGVzIHRoYXQgZGlzcXVhbGlmeSBUVEZTIHdoZW4gcHJlc2VudCBpbiB0aGUgZXZlbnQgbG9nIGF0IHRoZSB0aW1lXG4gKiB0aGUgcnVuJ3MgZmlyc3Qgc3RlcCBiYXRjaCBpcyBzY2hlZHVsZWQ6XG4gKlxuICogLSBBbnkgc3RlcCBldmVudCBtZWFucyB0aGlzIGlzIG5vdCB0aGUgcnVuJ3MgZmlyc3Qgc3RlcCBleGVjdXRpb24uXG4gKiAtIGBob29rX3JlY2VpdmVkYCAvIGB3YWl0X2NyZWF0ZWRgIC8gYHdhaXRfY29tcGxldGVkYCBtZWFuIHRoZSBydW4ncyBwYXRoIHRvXG4gKiAgIHRoZSBmaXJzdCBzdGVwIGRlcGVuZGVkIG9uIHVzZXItZHJpdmVuIHRpbWluZyAoYSB3ZWJob29rIGFycml2aW5nLCBhXG4gKiAgIHNsZWVwIGVsYXBzaW5nKSwgc28gdGhlIG1lYXN1cmVtZW50IHdvdWxkIG5vdCByZWZsZWN0IHJ1bnRpbWUgb3ZlcmhlYWQuXG4gKlxuICogRGVsaWJlcmF0ZWx5IGFic2VudCwgd2l0aCB0aGVpciBjb3N0IHN1YnRyYWN0ZWQgaW5zdGVhZDpcbiAqXG4gKiAtIGBob29rX2NyZWF0ZWRgOiBhIGZpcmUtYW5kLWZvcmdldCBgY3JlYXRlSG9vaygpYCBiZWZvcmUgdGhlIGZpcnN0IHN0ZXBcbiAqICAgY29tbWl0cyBpbiB0aGUgc2FtZSBpbnZvY2F0aW9uLCB3aG9zZSBtZWFzdXJlZCBkdXJhdGlvbiBpcyBzdWJ0cmFjdGVkIHZpYVxuICogICB7QGxpbmsgU3RlcExhdGVuY3lUcmFja2luZy5wcmVTdGVwQmxvY2tpbmdNc30uXG4gKiAtIGBhdHRyX3NldGAgKHdvcmtmbG93LWJvZHkgYHNldEF0dHJpYnV0ZXNgKTogcmVzb2x2ZXMgdGhyb3VnaFxuICogICBhbiBleHRyYSByZXBsYXkgYmVmb3JlIHN0ZXBzIHJ1bi4gU3VidHJhY3RlZCBieSBlbmRpbmcgdGhlIG1lYXN1cmVtZW50IGF0XG4gKiAgIHRoZSBmaXJzdCBhdHRyIHdyaXRlJ3MgdGltZXN0YW1wIGluc3RlYWQg4oCUIHNlZVxuICogICB7QGxpbmsgU3RlcExhdGVuY3lUcmFja2luZy5wcmVTdGVwQXR0clN0YXJ0TXN9LlxuICovXG5jb25zdCBUVEZTX0RJU1FVQUxJRllJTkdfRVZFTlRfVFlQRVM6IFJlYWRvbmx5U2V0PEV2ZW50WydldmVudFR5cGUnXT4gPSBuZXcgU2V0KFxuICBbXG4gICAgJ3N0ZXBfY3JlYXRlZCcsXG4gICAgJ3N0ZXBfc3RhcnRlZCcsXG4gICAgJ3N0ZXBfY29tcGxldGVkJyxcbiAgICAnc3RlcF9mYWlsZWQnLFxuICAgICdzdGVwX3JldHJ5aW5nJyxcbiAgICAnaG9va19yZWNlaXZlZCcsXG4gICAgJ3dhaXRfY3JlYXRlZCcsXG4gICAgJ3dhaXRfY29tcGxldGVkJyxcbiAgXVxuKTtcblxuLyoqXG4gKiBEZWNpZGUsIGZyb20gdGhlIG9yY2hlc3RyYXRvcidzIHZpZXcgb2YgdGhlIGV2ZW50IGxvZywgd2hldGhlciB0aGUgaW5saW5lXG4gKiBzdGVwIGJhdGNoIGFib3V0IHRvIGV4ZWN1dGUgcXVhbGlmaWVzIGZvciBUVEZTIGFuZC9vciBTVFNPIG1lYXN1cmVtZW50LlxuICogUmV0dXJucyB1bmRlZmluZWQgd2hlbiBuZWl0aGVyIGFwcGxpZXMuIENhbGxlZCBvbmNlIHBlciBiYXRjaDsgdGhlIHJlc3VsdFxuICogaXMgcGFzc2VkIHRvIHRoZSBiYXRjaCdzIGZpcnN0IHN0ZXAgb25seSwgc28gYSBwYXJhbGxlbCBmaXJzdCBiYXRjaCBlbWl0cyBhXG4gKiBzaW5nbGUgc2FtcGxlIHJhdGhlciB0aGFuIG9uZSBwZXIgc2libGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVTdGVwTGF0ZW5jeVRyYWNraW5nKHBhcmFtczoge1xuICAvKiogVGhlIG9yY2hlc3RyYXRvcidzIGN1cnJlbnQgaW4tbWVtb3J5IGV2ZW50IGxvZyAoYXNjZW5kaW5nIG9yZGVyKS4gKi9cbiAgZXZlbnRzOiBFdmVudFtdO1xuICAvKipcbiAgICogV2hldGhlciB0aGlzIGludm9jYXRpb24ncyBpbml0aWFsIGV2ZW50IGxvYWQgY29udGFpbmVkIG5vdGhpbmcgYmV5b25kXG4gICAqIHJ1bl9jcmVhdGVkL3J1bl9zdGFydGVkL2F0dHJfc2V0LiBQcmUtZXhpc3RpbmcgaG9vayBldmVudHMgd2VyZSB3cml0dGVuXG4gICAqIGJ5IGFuIGVhcmxpZXIgaW52b2NhdGlvbiwgc28gdGhlIHRpbWUgdGhleSBhZGRlZCAoaW5jbHVkaW5nIHRoZSBxdWV1ZVxuICAgKiBob3AgYmFjayB0byB0aGlzIGludm9jYXRpb24pIGlzIHVubWVhc3VyYWJsZSBhbmQgZGlzcXVhbGlmaWVzIFRURlMuXG4gICAqIGF0dHJfc2V0IGlzIHBlcm1pdHRlZDogYSByZWRlbGl2ZXJ5IGNhbiBsYW5kIGFmdGVyIGEgY29tbWl0dGVkIHByZS1zdGVwXG4gICAqIGF0dHJfc2V0LCBhbmQgdGhlIGRldG91ciBpdCBtYXJrcyBpcyBzdWJ0cmFjdGVkIHZpYSBgcHJlU3RlcEF0dHJTdGFydE1zYFxuICAgKiByZWdhcmRsZXNzIG9mIHdoaWNoIGludm9jYXRpb24gd3JvdGUgaXQuXG4gICAqL1xuICBpbnZvY2F0aW9uU3RhcnRlZENsZWFuOiBib29sZWFuO1xuICAvKiogRXBvY2ggbXMgb2YgcnVuIGNyZWF0aW9uLCBpZiByZWNvdmVyYWJsZS4gQWJzZW50IGRpc3F1YWxpZmllcyBUVEZTLiAqL1xuICBydW5DcmVhdGVkQXRNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogRXBvY2ggbXMgdGhlIGBydW5fc3RhcnRlZGAgcmVzcG9uc2Ugd2FzIHJlY2VpdmVkL3BhcnNlZCBieSB0aGUgU0RLIChvcixcbiAgICogdW5kZXIgdHVyYm8sIHRoZSBpbnN0YW50IHRoZSBydW4gd2FzIHN5bnRoZXNpemVkIGxvY2FsbHkg4oCUIHNlZVxuICAgKiB7QGxpbmsgU3RlcExhdGVuY3lUcmFja2luZy5yc2ZzQW5jaG9yTXN9KS4gQWJzZW50IGRpc3F1YWxpZmllcyBSU0ZTLlxuICAgKi9cbiAgcnVuU3RhcnRlZFJlY2VpdmVkQXRNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogV2FsbC1jbG9jayBtcyB0aGlzIHN1c3BlbnNpb24ncyBgcnVuV29ya2Zsb3dgIGNhbGwgc3BlbnQgZXhlY3V0aW5nXG4gICAqIHN5bmNocm9ub3VzbHkgYmVmb3JlIHRocm93aW5nIOKAlCB0aGUgRklOQUwgcmVwbGF5IHBhc3Mgb25seSwgbm90XG4gICAqIGFjY3VtdWxhdGVkIGFjcm9zcyBlYXJsaWVyIHBhc3Nlcy4gU2VlXG4gICAqIHtAbGluayBTdGVwTGF0ZW5jeVRyYWNraW5nLnJlcGxheU1zfS5cbiAgICovXG4gIHJlcGxheU1zOiBudW1iZXI7XG4gIC8qKiBTZWUge0BsaW5rIFN0ZXBMYXRlbmN5VHJhY2tpbmcucHJlU3RlcEJsb2NraW5nTXN9LiAqL1xuICBwcmVTdGVwQmxvY2tpbmdNczogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIGFjY3VtdWxhdG9yJ3MgdmFsdWUgYXMgb2YgdGhlIHN1c3BlbnNpb24gdGhhdCB3cm90ZSB0aGUgcnVuJ3MgZmlyc3RcbiAgICogYXR0cl9zZXQgKGl0cyBob29rIHBoYXNlIHJ1bnMgYmVmb3JlIGl0cyBhdHRyIHdyaXRlcykuIFdoZW4gdGhlXG4gICAqIG1lYXN1cmVtZW50IGVuZHMgYXQgdGhlIGF0dHIgd3JpdGUsIG9ubHkgaG9vayB0aW1lIGZyb20gYmVmb3JlIHRoYXRcbiAgICogcG9pbnQgbWF5IGJlIHN1YnRyYWN0ZWQg4oCUIGxhdGVyIGhvb2sgd3JpdGVzIGZhbGwgb3V0c2lkZSB0aGUgbWVhc3VyZWRcbiAgICogd2luZG93LiBVbmRlZmluZWQgd2hlbiBubyBhdHRyIHN1c3BlbnNpb24gaGFwcGVuZWQgaW4gdGhpcyBpbnZvY2F0aW9uXG4gICAqIChlLmcuIHRoZSBhdHRyX3NldCB3YXMgbG9hZGVkIGZyb20gYSByZWRlbGl2ZXJ5J3Mgc25hcHNob3QsIHdoZXJlIG5vXG4gICAqIHNhbWUtaW52b2NhdGlvbiBob29rIHRpbWUgcHJlY2VkZXMgaXQpLlxuICAgKi9cbiAgcHJlU3RlcEJsb2NraW5nQmVmb3JlQXR0ck1zOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBzdXNwZW5zaW9uIHRoYXQgc2NoZWR1bGVkIHRoaXMgYmF0Y2ggYWxzbyBjcmVhdGVkIHdhaXRzLlxuICAgKiBUaG9zZSBgd2FpdF9jcmVhdGVkYCB3cml0ZXMgYXJlIG5vdCBpbiBgZXZlbnRzYCB5ZXQgKHRoZXkgd2VyZSBjb21taXR0ZWRcbiAgICogYnkgdGhpcyB2ZXJ5IHN1c3BlbnNpb24gcGFzcyksIHNvIHRoZXkgbXVzdCBiZSByZXBvcnRlZCBzZXBhcmF0ZWx5LiBBXG4gICAqIHdhaXQgZGlzcXVhbGlmaWVzIGJvdGggbWVhc3VyZW1lbnRzLlxuICAgKi9cbiAgc3VzcGVuc2lvbkhhc1dhaXRzOiBib29sZWFuO1xuICAvKipcbiAgICogV2hldGhlciB0aGUgc3VzcGVuc2lvbiB0aGF0IHNjaGVkdWxlZCB0aGlzIGJhdGNoIGFsc28gY3JlYXRlZCBob29rc1xuICAgKiAoYWxzbyBub3QgaW4gYGV2ZW50c2AgeWV0KS4gSG9va3Mga2VlcCBUVEZTIGVsaWdpYmxlIOKAlCB0aGVpciBtZWFzdXJlZFxuICAgKiB3cml0ZSB0aW1lIGlzIHN1YnRyYWN0ZWQgdmlhIGBwcmVTdGVwQmxvY2tpbmdNc2Ag4oCUIGJ1dCBkaXNxdWFsaWZ5IFNUU08sXG4gICAqIHdoaWNoIGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3IgYSBwdXJlIGJhY2stdG8tYmFjayBzdGVwIGdhcC5cbiAgICovXG4gIHN1c3BlbnNpb25DcmVhdGVkSG9va3M6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHR1cmJvIG1vZGUgaXMgYWN0aXZlIGZvciB0aGlzIGludm9jYXRpb24uICovXG4gIHR1cmJvOiBib29sZWFuO1xufSk6IFN0ZXBMYXRlbmN5VHJhY2tpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB7IGV2ZW50cyB9ID0gcGFyYW1zO1xuXG4gIGxldCB0dGZzRWxpZ2libGUgPVxuICAgIHBhcmFtcy5pbnZvY2F0aW9uU3RhcnRlZENsZWFuICYmXG4gICAgcGFyYW1zLnJ1bkNyZWF0ZWRBdE1zICE9PSB1bmRlZmluZWQgJiZcbiAgICAhcGFyYW1zLnN1c3BlbnNpb25IYXNXYWl0cztcbiAgbGV0IHByZVN0ZXBBdHRyU3RhcnRNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBpZiAodHRmc0VsaWdpYmxlKSB7XG4gICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICAgIGlmIChUVEZTX0RJU1FVQUxJRllJTkdfRVZFTlRfVFlQRVMuaGFzKGV2ZW50LmV2ZW50VHlwZSkpIHtcbiAgICAgICAgdHRmc0VsaWdpYmxlID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGV2ZW50LmV2ZW50VHlwZSA9PT0gJ2F0dHJfc2V0Jykge1xuICAgICAgICBjb25zdCBhdHRyU3RhcnRNcyA9ICsoZXZlbnQub2NjdXJyZWRBdCA/PyBldmVudC5jcmVhdGVkQXQpO1xuICAgICAgICBwcmVTdGVwQXR0clN0YXJ0TXMgPVxuICAgICAgICAgIHByZVN0ZXBBdHRyU3RhcnRNcyA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IGF0dHJTdGFydE1zXG4gICAgICAgICAgICA6IE1hdGgubWluKHByZVN0ZXBBdHRyU3RhcnRNcywgYXR0clN0YXJ0TXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFNUU086IHRoZSB0d28gc3RlcHMgcmFuIGJhY2stdG8tYmFjayDigJQgdGhlIG5ld2VzdCBrbm93biBldmVudCBpcyB0aGVcbiAgLy8gcHJldmlvdXMgc3RlcCdzIHRlcm1pbmFsIGV2ZW50LCB3aXRoIG5vdGhpbmcgKGhvb2tfcmVjZWl2ZWQsIHdhaXRzLFxuICAvLyBhdHRyX3NldCwgLi4uKSBpbiBiZXR3ZWVuIGFuZCB0aGlzIHN1c3BlbnNpb24gc2NoZWR1bGluZyBub3RoaW5nIGJ1dFxuICAvLyBzdGVwcy5cbiAgbGV0IHByZXZTdGVwRW5kTXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbGV0IHN0ZXBDb3VudDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBsZXQgZXZlbnRDb3VudDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBjb25zdCBsYXN0RXZlbnQgPSBldmVudHNbZXZlbnRzLmxlbmd0aCAtIDFdO1xuICBpZiAoXG4gICAgIXBhcmFtcy5zdXNwZW5zaW9uSGFzV2FpdHMgJiZcbiAgICAhcGFyYW1zLnN1c3BlbnNpb25DcmVhdGVkSG9va3MgJiZcbiAgICBsYXN0RXZlbnQgJiZcbiAgICAobGFzdEV2ZW50LmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY29tcGxldGVkJyB8fFxuICAgICAgbGFzdEV2ZW50LmV2ZW50VHlwZSA9PT0gJ3N0ZXBfZmFpbGVkJylcbiAgKSB7XG4gICAgcHJldlN0ZXBFbmRNcyA9ICsobGFzdEV2ZW50Lm9jY3VycmVkQXQgPz8gbGFzdEV2ZW50LmNyZWF0ZWRBdCk7XG4gICAgY29uc3QgdGVybWluYWxTdGVwSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgKGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY29tcGxldGVkJyB8fFxuICAgICAgICAgIGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3N0ZXBfZmFpbGVkJykgJiZcbiAgICAgICAgZXZlbnQuY29ycmVsYXRpb25JZCAhPT0gdW5kZWZpbmVkXG4gICAgICApIHtcbiAgICAgICAgdGVybWluYWxTdGVwSWRzLmFkZChldmVudC5jb3JyZWxhdGlvbklkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc3RlcENvdW50ID0gdGVybWluYWxTdGVwSWRzLnNpemU7XG4gICAgZXZlbnRDb3VudCA9IGV2ZW50cy5sZW5ndGg7XG4gIH1cblxuICAvLyBSU0ZTIHNoYXJlcyBUVEZTJ3MgZWxpZ2liaWxpdHkgZXhhY3RseSAoc2FtZSBldmVudC1sb2cvd2FpdCBjaGVja3MpLFxuICAvLyBwbHVzIGl0cyBvd24gYW5jaG9yIGJlaW5nIHJlY292ZXJhYmxlLlxuICBjb25zdCByc2ZzRWxpZ2libGUgPVxuICAgIHR0ZnNFbGlnaWJsZSAmJiBwYXJhbXMucnVuU3RhcnRlZFJlY2VpdmVkQXRNcyAhPT0gdW5kZWZpbmVkO1xuXG4gIGlmICghdHRmc0VsaWdpYmxlICYmIHByZXZTdGVwRW5kTXMgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLih0dGZzRWxpZ2libGVcbiAgICAgID8ge1xuICAgICAgICAgIHR0ZnNBbmNob3JNczogcGFyYW1zLnJ1bkNyZWF0ZWRBdE1zLFxuICAgICAgICAgIC8vIFdoZW4gdGhlIG1lYXN1cmVtZW50IGVuZHMgYXQgdGhlIGZpcnN0IGF0dHIgd3JpdGUsIG9ubHkgaG9va1xuICAgICAgICAgIC8vIHRpbWUgZnJvbSBiZWZvcmUgdGhhdCBwb2ludCBpcyBpbnNpZGUgdGhlIG1lYXN1cmVkIHdpbmRvdy5cbiAgICAgICAgICBwcmVTdGVwQmxvY2tpbmdNczpcbiAgICAgICAgICAgIHByZVN0ZXBBdHRyU3RhcnRNcyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gKHBhcmFtcy5wcmVTdGVwQmxvY2tpbmdCZWZvcmVBdHRyTXMgPz8gMClcbiAgICAgICAgICAgICAgOiBwYXJhbXMucHJlU3RlcEJsb2NraW5nTXMsXG4gICAgICAgICAgLi4uKHByZVN0ZXBBdHRyU3RhcnRNcyAhPT0gdW5kZWZpbmVkID8geyBwcmVTdGVwQXR0clN0YXJ0TXMgfSA6IHt9KSxcbiAgICAgICAgfVxuICAgICAgOiB7fSksXG4gICAgLi4uKHJzZnNFbGlnaWJsZVxuICAgICAgPyB7XG4gICAgICAgICAgcnNmc0FuY2hvck1zOiBwYXJhbXMucnVuU3RhcnRlZFJlY2VpdmVkQXRNcyxcbiAgICAgICAgICByZXBsYXlNczogcGFyYW1zLnJlcGxheU1zLFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgICAuLi4ocHJldlN0ZXBFbmRNcyAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHsgcHJldlN0ZXBFbmRNcywgc3RlcENvdW50LCBldmVudENvdW50IH1cbiAgICAgIDoge30pLFxuICAgIHR1cmJvOiBwYXJhbXMudHVyYm8sXG4gIH07XG59XG5cbi8qKlxuICogQ29tcHV0ZSB0aGUgbGF0ZW5jeSB0ZWxlbWV0cnkgdG8gYXR0YWNoIHRvIHRoZSBzdGVwJ3MgdGVybWluYWwgZXZlbnQuXG4gKiBDYWxsZWQgYnkgYGV4ZWN1dGVTdGVwYCB3aXRoIHRoZSB3YWxsLWNsb2NrIHRpbWVzdGFtcCB0YWtlbiBpbW1lZGlhdGVseVxuICogYmVmb3JlIHVzZXIgc3RlcCBjb2RlIHJ1bnMuIFJldHVybnMgdW5kZWZpbmVkIHdoZW4gdGhlcmUgaXMgbm90aGluZyB0b1xuICogcmVwb3J0IChubyB0cmFja2luZywgb3IgYSByZXRyeSBhdHRlbXB0IOKAlCByZXRyaWVzIG1lYXN1cmUgbmVpdGhlciBUVEZTIG5vclxuICogU1RTTykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlU3RlcExhdGVuY3lFdmVudERhdGEocGFyYW1zOiB7XG4gIHRyYWNraW5nOiBTdGVwTGF0ZW5jeVRyYWNraW5nIHwgdW5kZWZpbmVkO1xuICAvKiogYERhdGUubm93KClgIHRha2VuIGltbWVkaWF0ZWx5IGJlZm9yZSB1c2VyIHN0ZXAgY29kZSBiZWdhbiBleGVjdXRpbmcuICovXG4gIHN0ZXBDb2RlU3RhcnRlZEF0TXM6IG51bWJlcjtcbiAgLyoqXG4gICAqIGBEYXRlLm5vdygpYCB0YWtlbiBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIGZpcnN0IHN0ZXAncyBzdGFydCBQT1NUXG4gICAqIChgc3RlcF9zdGFydGVkYCkgd2FzIGlzc3VlZC4gUHJlc2VudCBvbmx5IGZvciB0aGUgbGF6eSBpbmxpbmUgc3RlcHMgUlNGU1xuICAgKiBjYXJlcyBhYm91dDsgc2VlIHRoZSBjYWxsIHNpdGVzIGluIHN0ZXAtZXhlY3V0b3IudHMuXG4gICAqL1xuICBzdGVwU3RhcnRQb3N0U2VudEF0TXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgYXR0ZW1wdDogbnVtYmVyO1xuICAvKiogV2hldGhlciB0aGlzIHN0ZXAgd2FzIHN0YXJ0ZWQgbGF6aWx5IChubyBzZXBhcmF0ZSBzdGVwX2NyZWF0ZWQgd3JpdGUpLiAqL1xuICBsYXp5U3RlcFN0YXJ0OiBib29sZWFuO1xuICAvKiogV2hldGhlciB0aGUgYm9keSByYW4gb3B0aW1pc3RpY2FsbHksIHdpdGhvdXQgYXdhaXRpbmcgc3RlcF9zdGFydGVkLiAqL1xuICBvcHRpbWlzdGljU3RhcnQ6IGJvb2xlYW47XG59KTogU3RlcExhdGVuY3lFdmVudERhdGEgfCB1bmRlZmluZWQge1xuICBjb25zdCB7IHRyYWNraW5nIH0gPSBwYXJhbXM7XG4gIGlmICghdHJhY2tpbmcgfHwgcGFyYW1zLmF0dGVtcHQgIT09IDEpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8gU21hbGwgbmVnYXRpdmUgZHVyYXRpb25zIGNsYW1wIHRvIDA6IGNyb3NzLWludm9jYXRpb24gdGltZXN0YW1wcyBjYW5cbiAgLy8gY29tZSBmcm9tIGFub3RoZXIgbWFjaGluZSdzIGNsb2NrLCBzbyBib3VuZGVkIHNrZXcgbXVzdCBub3QgcHJvZHVjZVxuICAvLyBuZWdhdGl2ZSB2YWx1ZXMuIER1cmF0aW9ucyBtb3JlIG5lZ2F0aXZlIHRoYW4gTUFYX0NMT0NLX1NLRVdfTVMgYXJlIG5vdFxuICAvLyBza2V3IGJ1dCBhIGNvcnJ1cHQgYW5jaG9yLCBhbmQgdGhlIHNhbXBsZSBpcyBkcm9wcGVkIChzZWUgdGhlIGNvbnN0YW50J3NcbiAgLy8gZG9jIGNvbW1lbnQpLlxuICAvL1xuICAvLyBBIHByZS1zdGVwIHNldEF0dHJpYnV0ZXMgZGV0b3VyIGVuZHMgdGhlIG1lYXN1cmVtZW50IGF0IHRoZSBmaXJzdCBhdHRyXG4gIC8vIHdyaXRlIGluc3RlYWQgb2YgdGhlIHN0ZXAncyBjb2RlIHN0YXJ0IOKAlCB0aGUgcmVtYWluZGVyIGlzIHRoZSBkdXJhdGlvblxuICAvLyBvZiB0aGUgc2V0QXR0cmlidXRlcyBjYWxsIChyZXNvbHZlZCB2aWEgYW4gZXh0cmEgcmVwbGF5KSwgd2hpY2ggaXNcbiAgLy8gc3VidHJhY3RlZCByYXRoZXIgdGhhbiBkaXNxdWFsaWZ5aW5nIHRoZSBzYW1wbGUuIEluIHRoYXQgY2FzZVxuICAvLyBgdHJhY2tpbmcucHJlU3RlcEJsb2NraW5nTXNgIGFscmVhZHkgaG9sZHMgb25seSB0aGUgaG9vayB0aW1lIGZyb21cbiAgLy8gQkVGT1JFIHRoZSBhdHRyIHdyaXRlIOKAlCBob29rIHdyaXRlcyBhZnRlciB0aGUgd2luZG93IGNsb3NlZCBhcmUgZXhjbHVkZWRcbiAgLy8gYnkgY29tcHV0ZVN0ZXBMYXRlbmN5VHJhY2tpbmcgKHNlZSBwcmVTdGVwQmxvY2tpbmdCZWZvcmVBdHRyTXMpLlxuICBjb25zdCB0dGZzRW5kTXMgPSB0cmFja2luZy5wcmVTdGVwQXR0clN0YXJ0TXMgPz8gcGFyYW1zLnN0ZXBDb2RlU3RhcnRlZEF0TXM7XG4gIGNvbnN0IHJhd1R0ZnMgPVxuICAgIHRyYWNraW5nLnR0ZnNBbmNob3JNcyAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHR0ZnNFbmRNcyAtIHRyYWNraW5nLnR0ZnNBbmNob3JNcyAtICh0cmFja2luZy5wcmVTdGVwQmxvY2tpbmdNcyA/PyAwKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHR0ZnMgPVxuICAgIHJhd1R0ZnMgIT09IHVuZGVmaW5lZCAmJiByYXdUdGZzID49IC1NQVhfQ0xPQ0tfU0tFV19NU1xuICAgICAgPyBNYXRoLm1heCgwLCByYXdUdGZzKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHJhd1N0c28gPVxuICAgIHRyYWNraW5nLnByZXZTdGVwRW5kTXMgIT09IHVuZGVmaW5lZFxuICAgICAgPyBwYXJhbXMuc3RlcENvZGVTdGFydGVkQXRNcyAtIHRyYWNraW5nLnByZXZTdGVwRW5kTXNcbiAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBzdHNvID1cbiAgICByYXdTdHNvICE9PSB1bmRlZmluZWQgJiYgcmF3U3RzbyA+PSAtTUFYX0NMT0NLX1NLRVdfTVNcbiAgICAgID8gTWF0aC5tYXgoMCwgcmF3U3RzbylcbiAgICAgIDogdW5kZWZpbmVkO1xuICAvLyBSU0ZTIGVuZHMgYXQgdGhlIGFjdHVhbCBzdGFydC1QT1NUIGluc3RhbnQsIG5vdCBhdCB0dGZzRW5kTXMg4oCUIHVubGlrZVxuICAvLyBUVEZTIGl0IGlzIG5vdCBzdWJqZWN0IHRvIHRoZSBwcmUtc3RlcCBhdHRyLXdyaXRlIHNob3J0Y3V0LCBzbyBhXG4gIC8vIHByZS1zdGVwIHNldEF0dHJpYnV0ZXMgZGV0b3VyIChyYXJlKSBtYWtlcyBSU0ZTIGluY2x1ZGUgdGhlIGRldG91clxuICAvLyB3aGlsZSBUVEZTIGV4Y2x1ZGVzIGl0LiBgZmluYWxTY2hlZHVsaW5nUmVwbGF5YCBpcyBhIGRpcmVjdCBwYXNzdGhyb3VnaFxuICAvLyBvZiBgdHJhY2tpbmcucmVwbGF5TXNgIOKAlCB0aGUgRklOQUwgcmVwbGF5IHBhc3Mgb25seSAoc2VlXG4gIC8vIFN0ZXBMYXRlbmN5VHJhY2tpbmcucmVwbGF5TXMpIOKAlCBzbyBubyBmdXJ0aGVyIHN1YnRyYWN0aW9uIGFwcGxpZXMsIGJ1dFxuICAvLyBpdCBhbHNvIG1lYW5zIGl0IGlzIE5PVCBhY2N1bXVsYXRlZCBhY3Jvc3MgYW55IGVhcmxpZXIgcHJlLWZpcnN0LXN0ZXBcbiAgLy8gcGFzc2VzIChlLmcuIGEgc2V0QXR0cmlidXRlcyBkZXRvdXIpIGFuZCBtdXN0IG5vdCBiZSByZWFkIGFzIFwidGhlXG4gIC8vIHJlcGxheSBwb3J0aW9uIG9mIHJzZnNcIjsgcnNmcyBjb3ZlcnMgdGhlIHdob2xlIHdpbmRvdy5cbiAgLy9cbiAgLy8gZmluYWxTY2hlZHVsaW5nUmVwbGF5IGR1cGxpY2F0ZXMgd2hhdCBPVEVMIGFscmVhZHkgY2FwdHVyZXMgb24gdGhlIHJ1bi9pbnZvY2F0aW9uXG4gIC8vIHNwYW4sIGJ1dCBpcyBkZWxpYmVyYXRlbHkgY29sbGVjdGVkIGFzIGNsaWVudCB0ZWxlbWV0cnkgc28gdGhlIHNlcnZlclxuICAvLyBjYW4gZW1pdCBpdCBhcyBhbiBVTlNBTVBMRUQsIGZ1bGwtcG9wdWxhdGlvbiBtZXRyaWM6IHdvcmtmbG93LXNlcnZlcidzXG4gIC8vIHNlcnZlciBzcGFucyBhcmUgaGVhdmlseSBzYW1wbGVkIGluIHByb2R1Y3Rpb24gKH43JSksIGFuZCBjbGllbnQgc3BhbnNcbiAgLy8gY2FuJ3QgYmUgZmlsdGVyZWQgYnkgU0RLIHZlcnNpb24sIHNvIG5laXRoZXIgY2FuIHNlcnZlIGFzIHRoZVxuICAvLyBkYXNoYm9hcmQncyBleGFjdCBUVEZTIGRlY29tcG9zaXRpb24uXG4gIGNvbnN0IHJzZnMgPVxuICAgIHRyYWNraW5nLnJzZnNBbmNob3JNcyAhPT0gdW5kZWZpbmVkICYmXG4gICAgcGFyYW1zLnN0ZXBTdGFydFBvc3RTZW50QXRNcyAhPT0gdW5kZWZpbmVkXG4gICAgICA/IE1hdGgubWF4KDAsIHBhcmFtcy5zdGVwU3RhcnRQb3N0U2VudEF0TXMgLSB0cmFja2luZy5yc2ZzQW5jaG9yTXMpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3QgZmluYWxTY2hlZHVsaW5nUmVwbGF5ID1cbiAgICB0cmFja2luZy5yZXBsYXlNcyAhPT0gdW5kZWZpbmVkXG4gICAgICA/IE1hdGgubWF4KDAsIHRyYWNraW5nLnJlcGxheU1zKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgaWYgKHR0ZnMgPT09IHVuZGVmaW5lZCAmJiBzdHNvID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3Qgb3B0aW1pemF0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKHRyYWNraW5nLnR1cmJvKSBvcHRpbWl6YXRpb25zLnB1c2goJ3R1cmJvJyk7XG4gIGlmIChwYXJhbXMubGF6eVN0ZXBTdGFydCkgb3B0aW1pemF0aW9ucy5wdXNoKCdsYXp5U3RlcFN0YXJ0Jyk7XG4gIGlmIChwYXJhbXMub3B0aW1pc3RpY1N0YXJ0KSBvcHRpbWl6YXRpb25zLnB1c2goJ29wdGltaXN0aWNTdGFydCcpO1xuXG4gIHJldHVybiB7XG4gICAgLi4uKHR0ZnMgIT09IHVuZGVmaW5lZCA/IHsgdHRmcyB9IDoge30pLFxuICAgIC4uLihzdHNvICE9PSB1bmRlZmluZWQgPyB7IHN0c28gfSA6IHt9KSxcbiAgICAuLi4oc3RzbyAhPT0gdW5kZWZpbmVkICYmIHRyYWNraW5nLnN0ZXBDb3VudCAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHsgc3RlcENvdW50OiB0cmFja2luZy5zdGVwQ291bnQgfVxuICAgICAgOiB7fSksXG4gICAgLi4uKHN0c28gIT09IHVuZGVmaW5lZCAmJiB0cmFja2luZy5ldmVudENvdW50ICE9PSB1bmRlZmluZWRcbiAgICAgID8geyBldmVudENvdW50OiB0cmFja2luZy5ldmVudENvdW50IH1cbiAgICAgIDoge30pLFxuICAgIC4uLihyc2ZzICE9PSB1bmRlZmluZWQgPyB7IHJzZnMgfSA6IHt9KSxcbiAgICAuLi4oZmluYWxTY2hlZHVsaW5nUmVwbGF5ICE9PSB1bmRlZmluZWQgPyB7IGZpbmFsU2NoZWR1bGluZ1JlcGxheSB9IDoge30pLFxuICAgIG9wdGltaXphdGlvbnMsXG4gIH07XG59XG4iXX0=
|
|
209
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1sYXRlbmN5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvc3RlcC1sYXRlbmN5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQThGQTs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUM7QUFvQmpDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxNQUFNLDhCQUE4QixHQUFvQyxJQUFJLEdBQUcsQ0FDN0U7SUFDRSxjQUFjO0lBQ2QsY0FBYztJQUNkLGdCQUFnQjtJQUNoQixhQUFhO0lBQ2IsZUFBZTtJQUNmLGVBQWU7SUFDZixjQUFjO0lBQ2QsZ0JBQWdCO0NBQ2pCLENBQ0YsQ0FBQztBQUVGOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSwwQkFBMEIsQ0FBQyxNQXdEMUM7SUFDQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDO0lBRTFCLElBQUksWUFBWSxHQUNkLE1BQU0sQ0FBQyxzQkFBc0I7UUFDN0IsTUFBTSxDQUFDLGNBQWMsS0FBSyxTQUFTO1FBQ25DLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDO0lBQzdCLElBQUksa0JBQXNDLENBQUM7SUFDM0MsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNqQixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzNCLElBQUksOEJBQThCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUN4RCxZQUFZLEdBQUcsS0FBSyxDQUFDO2dCQUNyQixNQUFNO1lBQ1IsQ0FBQztZQUNELElBQUksS0FBSyxDQUFDLFNBQVMsS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDbkMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUMzRCxrQkFBa0I7b0JBQ2hCLGtCQUFrQixLQUFLLFNBQVM7d0JB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RSxPQUFPO1FBQ0wsR0FBRyxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN2QyxHQUFHLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLEdBQUcsQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLFFBQVEsQ0FBQyxTQUFTLEtBQUssU0FBUztZQUN4RCxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLFNBQVMsRUFBRTtZQUNuQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ1AsR0FBRyxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksUUFBUSxDQUFDLFVBQVUsS0FBSyxTQUFTO1lBQ3pELENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsVUFBVSxFQUFFO1lBQ3JDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDUCxHQUFHLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLEdBQUcsQ0FBQyxxQkFBcUIsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUscUJBQXFCLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3pFLGFBQWE7S0FDZCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRXZlbnQgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuXG4vKipcbiAqIENsaWVudC1zaWRlIGxhdGVuY3kgbWVhc3VyZW1lbnQgKFRURlMgLyBTVFNPIC8gUlNGUykgdGhyZWFkZWQgZnJvbSB0aGVcbiAqIG9yY2hlc3RyYXRvcidzIGlubGluZSBleGVjdXRpb24gcGF0aCBpbnRvIGBleGVjdXRlU3RlcGAuXG4gKlxuICogVFRGUyAodGltZS10by1maXJzdC1zdGVwKSBtZWFzdXJlcyBydW4gY3JlYXRpb24g4oaSIHRoZSBmaXJzdCBzdGVwJ3MgYm9keVxuICogYmVnaW5uaW5nIHRvIGV4ZWN1dGUuIFNUU08gKHN0ZXAtdG8tc3RlcCBvdmVyaGVhZCkgbWVhc3VyZXMgdGhlIHByZXZpb3VzXG4gKiBzdGVwJ3MgdGVybWluYWwgZXZlbnQg4oaSIHRoZSBuZXh0IHN0ZXAncyBib2R5IGJlZ2lubmluZyB0byBleGVjdXRlLiBSU0ZTXG4gKiAocnVuLXN0YXJ0ZWQtdG8tZmlyc3Qtc3RlcCkgbWVhc3VyZXMgdGhlIGBydW5fc3RhcnRlZGAgcmVzcG9uc2UgbGFuZGluZyDihpJcbiAqIHRoZSBmaXJzdCBzdGVwJ3Mgc3RhcnQgUE9TVCBiZWluZyBpc3N1ZWQsIGEgc3ViLXdpbmRvdyBvZiBUVEZTIHRoYXRcbiAqIGlzb2xhdGVzIHJlcGxheSBvdmVyaGVhZCBmcm9tIHRoZSBydW4tY3JlYXRpb24gcXVldWUgaG9wOyBgZmluYWxTY2hlZHVsaW5nUmVwbGF5YFxuICogaXMgdGhlIHN5bmNocm9ub3VzIHdvcmtmbG93LWZ1bmN0aW9uLWV4ZWN1dGlvbiBkdXJhdGlvbiBvZiBvbmx5IHRoZSBGSU5BTFxuICogcmVwbGF5IHBhc3Mgd2l0aGluIHRoYXQgd2luZG93ICh0aGUgcGFzcyB0aGF0IHJlYWNoZWQgYW5kIHNjaGVkdWxlZCB0aGVcbiAqIGZpcnN0IHN0ZXApOyBpdCBpcyBOT1QgYWNjdW11bGF0ZWQgYWNyb3NzIGVhcmxpZXIgcHJlLWZpcnN0LXN0ZXAgcGFzc2VzXG4gKiAoc2VlIHtAbGluayBTdGVwTGF0ZW5jeVRyYWNraW5nLnJlcGxheU1zfSksIHNvIGl0IG11c3Qgbm90IGJlIHJlYWQgYXMgXCJ0aGVcbiAqIHJlcGxheSBwb3J0aW9uIG9mIFJTRlNcIi4gQWxsIGFyZSBhdHRhY2hlZCB0byB0aGUgc3RlcCdzIHRlcm1pbmFsXG4gKiBldmVudCBzbyBhIGJhY2tlbmQgY2FuIGVtaXQgbGF0ZW5jeSBtZXRyaWNzIGZyb20gdGhlIGV2ZW50IHdyaXRlIGFsb25lLFxuICogd2l0aG91dCBleHRyYSBldmVudC1sb2cgcXVlcmllcy5cbiAqXG4gKiBFbGlnaWJpbGl0eSBpcyBkZWNpZGVkIGJ5IHRoZSBvcmNoZXN0cmF0b3IgKHdoaWNoIG93bnMgdGhlIGV2ZW50IGxvZykgdmlhXG4gKiB7QGxpbmsgY29tcHV0ZVN0ZXBMYXRlbmN5VHJhY2tpbmd9OyB0aGUgZmluYWwgdmFsdWVzIGFyZSBjb21wdXRlZCBieVxuICogYGV4ZWN1dGVTdGVwYCByaWdodCBiZWZvcmUgdXNlciBjb2RlIHJ1bnMgdmlhXG4gKiB7QGxpbmsgY29tcHV0ZVN0ZXBMYXRlbmN5RXZlbnREYXRhfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGVwTGF0ZW5jeVRyYWNraW5nIHtcbiAgLyoqXG4gICAqIEVwb2NoIG1zIG9mIHJ1biBjcmVhdGlvbiAoZnJvbSB0aGUgcnVuLWlkIFVMSUQsIGZhbGxpbmcgYmFjayB0byB0aGUgcnVuXG4gICAqIHNuYXBzaG90J3MgYGNyZWF0ZWRBdGApLiBQcmVzZW50IG9ubHkgd2hlbiB0aGUgc3RlcCBxdWFsaWZpZXMgZm9yIFRURlMuXG4gICAqL1xuICB0dGZzQW5jaG9yTXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBXYWxsLWNsb2NrIG1zIHRoaXMgaW52b2NhdGlvbiBzcGVudCBjb21taXR0aW5nIGBob29rX2NyZWF0ZWRgIGV2ZW50c1xuICAgKiBiZWZvcmUgdGhlIGZpcnN0IHN0ZXAgKGZpcmUtYW5kLWZvcmdldCBgY3JlYXRlSG9vaygpYCBhaGVhZCBvZiB0aGUgZmlyc3RcbiAgICogc3RlcCBjb21taXRzIGluIHRoZSBzYW1lIHN1c3BlbnNpb24gYmF0Y2gpLiBTdWJ0cmFjdGVkIGZyb20gVFRGUyBzbyB0aGVcbiAgICogbWV0cmljIHJlZmxlY3RzIHJ1bnRpbWUgb3ZlcmhlYWQgcmF0aGVyIHRoYW4gdGhlIHVzZXIncyBob29rIHdyaXRlcy5cbiAgICovXG4gIHByZVN0ZXBCbG9ja2luZ01zPzogbnVtYmVyO1xuICAvKipcbiAgICogRXBvY2ggbXMgdGhlIGZpcnN0IHByZS1zdGVwIGBhdHRyX3NldGAgd3JpdGUgYmVnYW4gKGl0cyBjbGllbnQtc3RhbXBlZFxuICAgKiBgb2NjdXJyZWRBdGAsIGZhbGxpbmcgYmFjayB0byBgY3JlYXRlZEF0YCkuIFdoZW4gcHJlc2VudCwgdGhlIFRURlNcbiAgICogbWVhc3VyZW1lbnQgRU5EUyBoZXJlIGluc3RlYWQgb2YgYXQgdGhlIHN0ZXAncyBjb2RlIHN0YXJ0OiBhXG4gICAqIHdvcmtmbG93LWJvZHkgYHNldEF0dHJpYnV0ZXNgIGJlZm9yZSB0aGUgZmlyc3Qgc3RlcFxuICAgKiByZXNvbHZlcyB0aHJvdWdoIGFuIGV4dHJhIHJlcGxheSAoc2VlIHRoZSBgaGFzQXR0cmlidXRlRXZlbnRzYCBicmFuY2ggaW5cbiAgICogcnVudGltZS50cyksIHNvIGV2ZXJ5dGhpbmcgZnJvbSB0aGlzIHdyaXRlIHVudGlsIHRoZSBzdGVwIGJvZHkgcnVucyBpc1xuICAgKiB0aGUgZHVyYXRpb24gb2YgdGhlIHNldEF0dHJpYnV0ZXMgY2FsbCwgd2hpY2ggaXMgc3VidHJhY3RlZCBieSBlbmRpbmdcbiAgICogdGhlIG1lYXN1cmVtZW50IGF0IHRoZSBwb2ludCB3aGVyZSB0aGUgc3RlcCB3b3VsZCBvdGhlcndpc2UgaGF2ZSBiZWVuXG4gICAqIHNjaGVkdWxlZC5cbiAgICovXG4gIHByZVN0ZXBBdHRyU3RhcnRNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIEVwb2NoIG1zIHRoZSBwcmV2aW91cyBzdGVwJ3MgdGVybWluYWwgZXZlbnQgd2FzIHJlY29yZGVkIChpdHNcbiAgICogY2xpZW50LXN0YW1wZWQgYG9jY3VycmVkQXRgLCBmYWxsaW5nIGJhY2sgdG8gYGNyZWF0ZWRBdGApLiBQcmVzZW50IG9ubHlcbiAgICogd2hlbiB0aGUgc3RlcCBxdWFsaWZpZXMgZm9yIFNUU08uXG4gICAqL1xuICBwcmV2U3RlcEVuZE1zPzogbnVtYmVyO1xuICAvKiogTnVtYmVyIG9mIHVuaXF1ZSB0ZXJtaW5hbCBzdGVwcyBhbHJlYWR5IGluIHRoZSBldmVudCBsb2cuICovXG4gIHN0ZXBDb3VudD86IG51bWJlcjtcbiAgLyoqIE51bWJlciBvZiBldmVudHMgYWxyZWFkeSBpbiB0aGUgZXZlbnQgbG9nLiAqL1xuICBldmVudENvdW50PzogbnVtYmVyO1xuICAvKipcbiAgICogRXBvY2ggbXMgdGhlIGBydW5fc3RhcnRlZGAgcmVzcG9uc2Ugd2FzIHJlY2VpdmVkL3BhcnNlZCBieSB0aGUgU0RLLlxuICAgKiBQcmVzZW50IG9ubHkgd2hlbiB0aGUgc3RlcCBxdWFsaWZpZXMgZm9yIFJTRlM6IHRoZSBzYW1lIGVsaWdpYmlsaXR5IGFzXG4gICAqIFRURlMgKHNlZSB7QGxpbmsgY29tcHV0ZVN0ZXBMYXRlbmN5VHJhY2tpbmd9KSwgcGx1cyBhIHJlY292ZXJhYmxlXG4gICAqIGFuY2hvci4gSW4gdHVyYm8gbW9kZSwgYHJ1bl9zdGFydGVkYCBpcyBiYWNrZ3JvdW5kZWQgcmF0aGVyIHRoYW5cbiAgICogYXdhaXRlZCwgc28gdGhpcyBpcyBzdGFtcGVkIGF0IHRoZSBwb2ludCB0aGUgcnVudGltZSBzeW50aGVzaXplcyB0aGVcbiAgICogcnVuIGxvY2FsbHkgYW5kIGJlZ2lucyByZXBsYXkgaW5zdGVhZCBvZiBhdCB0aGUgcmVhbCByZXNwb25zZTsgdGhlXG4gICAqIGZpcnN0IHN0ZXAncyBzdGFydCBQT1NUIGlzIHN0aWxsIGNoYWluZWQgb24gdGhlIHJlYWwgYHJ1bl9zdGFydGVkYFxuICAgKiBwcm9taXNlIChzZWUgc3RlcC1leGVjdXRvci50cyksIHNvIFJTRlMgc3RpbGwgZW5kcyB1cCBtZWFzdXJpbmcgdGhlXG4gICAqIGdlbnVpbmUgcnVuX3N0YXJ0ZWQtdG8tZmlyc3Qtc3RlcC1QT1NUIHN0cmV0Y2ggZXZlbiB0aG91Z2ggdGhlIHR3b1xuICAgKiBoYWx2ZXMgb3ZlcmxhcCB1bmRlciB0dXJiby5cbiAgICovXG4gIHJzZnNBbmNob3JNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFdhbGwtY2xvY2sgbXMgdGhpcyBpbnZvY2F0aW9uJ3Mgc3luY2hyb25vdXMgd29ya2Zsb3ctZnVuY3Rpb24gcmVwbGF5XG4gICAqIHRvb2s6IGZyb20gY2FsbGluZyBgcnVuV29ya2Zsb3dgIHRvIGl0IHRocm93aW5nIHRoZSBzdXNwZW5zaW9uIHRoYXRcbiAgICogc2NoZWR1bGVkIHRoaXMgYmF0Y2guIEV4Y2x1ZGVzIGF3YWl0ZWQgbmV0d29yayBJL08gKHRoZSBzdXNwZW5zaW9uJ3NcbiAgICogZXZlbnQgY29tbWl0cywgdGhlIHN0ZXAncyBvd24gc3RhcnQgUE9TVCkuIFByZXNlbnQgb25seSBhbG9uZ3NpZGVcbiAgICogYHJzZnNBbmNob3JNc2AuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIEZJTkFMIHJlcGxheSBwYXNzIG9ubHk6IHRoZSBpbnZvY2F0aW9uIHRoYXQgcmVhY2hlZCBhbmRcbiAgICogc2NoZWR1bGVkIHRoZSBmaXJzdCBzdGVwLiBWYWxpZCBSU0ZTIHBhdGhzIGNhbiByZXBsYXkgbW9yZSB0aGFuIG9uY2VcbiAgICogYmVmb3JlIHRoZSBmaXJzdCBzdGVwIChlLmcuIGEgd29ya2Zsb3ctYm9keSBgc2V0QXR0cmlidXRlcygpYCBkZXRvdXJcbiAgICogcmVwbGF5cyB0d2ljZSksIGFuZCBhIHJlZGVsaXZlcnkgb21pdHMgZWFybGllciBpbnZvY2F0aW9ucycgcmVwbGF5IHdvcmtcbiAgICogZW50aXJlbHk7IHRoaXMgdmFsdWUgaXMgbm90IGFjY3VtdWxhdGVkIGFjcm9zcyB0aG9zZSBlYXJsaWVyIHBhc3Nlcy5cbiAgICogRG8gbm90IHJlYWQgaXQgYXMgXCJ0aGUgcmVwbGF5IHBvcnRpb24gb2YgUlNGU1wiOiBSU0ZTXG4gICAqICh7QGxpbmsgcnNmc0FuY2hvck1zfSkgY292ZXJzIHRoZSB3aG9sZSBydW5fc3RhcnRlZC10by1maXJzdC1zdGVwXG4gICAqIHdpbmRvdywgdGhpcyBjb3ZlcnMgb25seSB0aGUgbGFzdCBwYXNzLlxuICAgKi9cbiAgcmVwbGF5TXM/OiBudW1iZXI7XG4gIC8qKiBXaGV0aGVyIHR1cmJvIG1vZGUgaXMgYWN0aXZlIGZvciB0aGlzIGludm9jYXRpb24uICovXG4gIHR1cmJvOiBib29sZWFuO1xufVxuXG4vKipcbiAqIE1vc3QgbmVnYXRpdmUgcmF3IGR1cmF0aW9uIHN0aWxsIGF0dHJpYnV0ZWQgdG8gY3Jvc3MtbWFjaGluZSBjbG9jayBza2V3XG4gKiAoYW5kIGNsYW1wZWQgdG8gMCkuIEFueXRoaW5nIG1vcmUgbmVnYXRpdmUgbWVhbnMgYSBjb3JydXB0IGFuY2hvciAoZS5nLiBhXG4gKiBtaXMtZGVjb2RlZCBydW4tSUQgdGltZXN0YW1wKSBhbmQgdGhlIHNhbXBsZSBpcyBkcm9wcGVkIGluc3RlYWQ6IGFcbiAqIHN5c3RlbWF0aWNhbGx5IGNvcnJ1cHQgYW5jaG9yIHdvdWxkIG90aGVyd2lzZSByZXBvcnQgYW4gZXhhY3QtemVybyBsYXRlbmN5XG4gKiBvbiBldmVyeSBzYW1wbGUsIHNpbGVudGx5IGRyYWdnaW5nIGVudGlyZSBwZXJjZW50aWxlIGRpc3RyaWJ1dGlvbnMgdG8gMFxuICogcmF0aGVyIHRoYW4gc3VyZmFjaW5nIGFzIG1pc3NpbmcgZGF0YS5cbiAqL1xuY29uc3QgTUFYX0NMT0NLX1NLRVdfTVMgPSA2MF8wMDA7XG5cbi8qKiBMYXRlbmN5IHRlbGVtZXRyeSBhdHRhY2hlZCB0byBhIHN0ZXAncyB0ZXJtaW5hbCBldmVudCdzIGBldmVudERhdGFgLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGVwTGF0ZW5jeUV2ZW50RGF0YSB7XG4gIHR0ZnM/OiBudW1iZXI7XG4gIHN0c28/OiBudW1iZXI7XG4gIHN0ZXBDb3VudD86IG51bWJlcjtcbiAgZXZlbnRDb3VudD86IG51bWJlcjtcbiAgLyoqIENsaWVudC1tZWFzdXJlZCBydW5fc3RhcnRlZCDihpIgZmlyc3Qgc3RlcCdzIHN0YXJ0IFBPU1QsIG1zLiAqL1xuICByc2ZzPzogbnVtYmVyO1xuICAvKipcbiAgICogQ2xpZW50LW1lYXN1cmVkIHdhbGwtY2xvY2sgbXMgb2YgdGhlIEZJTkFMIHJlcGxheSBwYXNzIHRoYXQgc2NoZWR1bGVkXG4gICAqIHRoZSBmaXJzdCBzdGVwIChzZWUge0BsaW5rIFN0ZXBMYXRlbmN5VHJhY2tpbmcucmVwbGF5TXN9KTsgbm90XG4gICAqIGFjY3VtdWxhdGVkIGFjcm9zcyBlYXJsaWVyIHByZS1maXJzdC1zdGVwIHBhc3Nlcywgc28gaXQgbXVzdCBub3QgYmVcbiAgICogcmVhZCBhcyBcInRoZSByZXBsYXkgcG9ydGlvbiBvZiBgcnNmc2BcIi5cbiAgICovXG4gIGZpbmFsU2NoZWR1bGluZ1JlcGxheT86IG51bWJlcjtcbiAgb3B0aW1pemF0aW9ucz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEV2ZW50IHR5cGVzIHRoYXQgZGlzcXVhbGlmeSBUVEZTIHdoZW4gcHJlc2VudCBpbiB0aGUgZXZlbnQgbG9nIGF0IHRoZSB0aW1lXG4gKiB0aGUgcnVuJ3MgZmlyc3Qgc3RlcCBiYXRjaCBpcyBzY2hlZHVsZWQ6XG4gKlxuICogLSBBbnkgc3RlcCBldmVudCBtZWFucyB0aGlzIGlzIG5vdCB0aGUgcnVuJ3MgZmlyc3Qgc3RlcCBleGVjdXRpb24uXG4gKiAtIGBob29rX3JlY2VpdmVkYCAvIGB3YWl0X2NyZWF0ZWRgIC8gYHdhaXRfY29tcGxldGVkYCBtZWFuIHRoZSBydW4ncyBwYXRoIHRvXG4gKiAgIHRoZSBmaXJzdCBzdGVwIGRlcGVuZGVkIG9uIHVzZXItZHJpdmVuIHRpbWluZyAoYSB3ZWJob29rIGFycml2aW5nLCBhXG4gKiAgIHNsZWVwIGVsYXBzaW5nKSwgc28gdGhlIG1lYXN1cmVtZW50IHdvdWxkIG5vdCByZWZsZWN0IHJ1bnRpbWUgb3ZlcmhlYWQuXG4gKlxuICogRGVsaWJlcmF0ZWx5IGFic2VudCwgd2l0aCB0aGVpciBjb3N0IHN1YnRyYWN0ZWQgaW5zdGVhZDpcbiAqXG4gKiAtIGBob29rX2NyZWF0ZWRgOiBhIGZpcmUtYW5kLWZvcmdldCBgY3JlYXRlSG9vaygpYCBiZWZvcmUgdGhlIGZpcnN0IHN0ZXBcbiAqICAgY29tbWl0cyBpbiB0aGUgc2FtZSBpbnZvY2F0aW9uLCB3aG9zZSBtZWFzdXJlZCBkdXJhdGlvbiBpcyBzdWJ0cmFjdGVkIHZpYVxuICogICB7QGxpbmsgU3RlcExhdGVuY3lUcmFja2luZy5wcmVTdGVwQmxvY2tpbmdNc30uXG4gKiAtIGBhdHRyX3NldGAgKHdvcmtmbG93LWJvZHkgYHNldEF0dHJpYnV0ZXNgKTogcmVzb2x2ZXMgdGhyb3VnaFxuICogICBhbiBleHRyYSByZXBsYXkgYmVmb3JlIHN0ZXBzIHJ1bi4gU3VidHJhY3RlZCBieSBlbmRpbmcgdGhlIG1lYXN1cmVtZW50IGF0XG4gKiAgIHRoZSBmaXJzdCBhdHRyIHdyaXRlJ3MgdGltZXN0YW1wIGluc3RlYWQ7IHNlZVxuICogICB7QGxpbmsgU3RlcExhdGVuY3lUcmFja2luZy5wcmVTdGVwQXR0clN0YXJ0TXN9LlxuICovXG5jb25zdCBUVEZTX0RJU1FVQUxJRllJTkdfRVZFTlRfVFlQRVM6IFJlYWRvbmx5U2V0PEV2ZW50WydldmVudFR5cGUnXT4gPSBuZXcgU2V0KFxuICBbXG4gICAgJ3N0ZXBfY3JlYXRlZCcsXG4gICAgJ3N0ZXBfc3RhcnRlZCcsXG4gICAgJ3N0ZXBfY29tcGxldGVkJyxcbiAgICAnc3RlcF9mYWlsZWQnLFxuICAgICdzdGVwX3JldHJ5aW5nJyxcbiAgICAnaG9va19yZWNlaXZlZCcsXG4gICAgJ3dhaXRfY3JlYXRlZCcsXG4gICAgJ3dhaXRfY29tcGxldGVkJyxcbiAgXVxuKTtcblxuLyoqXG4gKiBEZWNpZGUsIGZyb20gdGhlIG9yY2hlc3RyYXRvcidzIHZpZXcgb2YgdGhlIGV2ZW50IGxvZywgd2hldGhlciB0aGUgaW5saW5lXG4gKiBzdGVwIGJhdGNoIGFib3V0IHRvIGV4ZWN1dGUgcXVhbGlmaWVzIGZvciBUVEZTIGFuZC9vciBTVFNPIG1lYXN1cmVtZW50LlxuICogUmV0dXJucyB1bmRlZmluZWQgd2hlbiBuZWl0aGVyIGFwcGxpZXMuIENhbGxlZCBvbmNlIHBlciBiYXRjaDsgdGhlIHJlc3VsdFxuICogaXMgcGFzc2VkIHRvIHRoZSBiYXRjaCdzIGZpcnN0IHN0ZXAgb25seSwgc28gYSBwYXJhbGxlbCBmaXJzdCBiYXRjaCBlbWl0cyBhXG4gKiBzaW5nbGUgc2FtcGxlIHJhdGhlciB0aGFuIG9uZSBwZXIgc2libGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVTdGVwTGF0ZW5jeVRyYWNraW5nKHBhcmFtczoge1xuICAvKiogVGhlIG9yY2hlc3RyYXRvcidzIGN1cnJlbnQgaW4tbWVtb3J5IGV2ZW50IGxvZyAoYXNjZW5kaW5nIG9yZGVyKS4gKi9cbiAgZXZlbnRzOiBFdmVudFtdO1xuICAvKipcbiAgICogV2hldGhlciB0aGlzIGludm9jYXRpb24ncyBpbml0aWFsIGV2ZW50IGxvYWQgY29udGFpbmVkIG5vdGhpbmcgYmV5b25kXG4gICAqIHJ1bl9jcmVhdGVkL3J1bl9zdGFydGVkL2F0dHJfc2V0LiBQcmUtZXhpc3RpbmcgaG9vayBldmVudHMgd2VyZSB3cml0dGVuXG4gICAqIGJ5IGFuIGVhcmxpZXIgaW52b2NhdGlvbiwgc28gdGhlIHRpbWUgdGhleSBhZGRlZCAoaW5jbHVkaW5nIHRoZSBxdWV1ZVxuICAgKiBob3AgYmFjayB0byB0aGlzIGludm9jYXRpb24pIGlzIHVubWVhc3VyYWJsZSBhbmQgZGlzcXVhbGlmaWVzIFRURlMuXG4gICAqIGF0dHJfc2V0IGlzIHBlcm1pdHRlZDogYSByZWRlbGl2ZXJ5IGNhbiBsYW5kIGFmdGVyIGEgY29tbWl0dGVkIHByZS1zdGVwXG4gICAqIGF0dHJfc2V0LCBhbmQgdGhlIGRldG91ciBpdCBtYXJrcyBpcyBzdWJ0cmFjdGVkIHZpYSBgcHJlU3RlcEF0dHJTdGFydE1zYFxuICAgKiByZWdhcmRsZXNzIG9mIHdoaWNoIGludm9jYXRpb24gd3JvdGUgaXQuXG4gICAqL1xuICBpbnZvY2F0aW9uU3RhcnRlZENsZWFuOiBib29sZWFuO1xuICAvKiogRXBvY2ggbXMgb2YgcnVuIGNyZWF0aW9uLCBpZiByZWNvdmVyYWJsZS4gQWJzZW50IGRpc3F1YWxpZmllcyBUVEZTLiAqL1xuICBydW5DcmVhdGVkQXRNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogRXBvY2ggbXMgdGhlIGBydW5fc3RhcnRlZGAgcmVzcG9uc2Ugd2FzIHJlY2VpdmVkL3BhcnNlZCBieSB0aGUgU0RLIChvcixcbiAgICogdW5kZXIgdHVyYm8sIHRoZSBpbnN0YW50IHRoZSBydW4gd2FzIHN5bnRoZXNpemVkIGxvY2FsbHk7IHNlZVxuICAgKiB7QGxpbmsgU3RlcExhdGVuY3lUcmFja2luZy5yc2ZzQW5jaG9yTXN9KS4gQWJzZW50IGRpc3F1YWxpZmllcyBSU0ZTLlxuICAgKi9cbiAgcnVuU3RhcnRlZFJlY2VpdmVkQXRNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogV2FsbC1jbG9jayBtcyB0aGlzIHN1c3BlbnNpb24ncyBgcnVuV29ya2Zsb3dgIGNhbGwgc3BlbnQgZXhlY3V0aW5nXG4gICAqIHN5bmNocm9ub3VzbHkgYmVmb3JlIHRocm93aW5nOiB0aGUgRklOQUwgcmVwbGF5IHBhc3Mgb25seSwgbm90XG4gICAqIGFjY3VtdWxhdGVkIGFjcm9zcyBlYXJsaWVyIHBhc3Nlcy4gU2VlXG4gICAqIHtAbGluayBTdGVwTGF0ZW5jeVRyYWNraW5nLnJlcGxheU1zfS5cbiAgICovXG4gIHJlcGxheU1zOiBudW1iZXI7XG4gIC8qKiBTZWUge0BsaW5rIFN0ZXBMYXRlbmN5VHJhY2tpbmcucHJlU3RlcEJsb2NraW5nTXN9LiAqL1xuICBwcmVTdGVwQmxvY2tpbmdNczogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIGFjY3VtdWxhdG9yJ3MgdmFsdWUgYXMgb2YgdGhlIHN1c3BlbnNpb24gdGhhdCB3cm90ZSB0aGUgcnVuJ3MgZmlyc3RcbiAgICogYXR0cl9zZXQgKGl0cyBob29rIHBoYXNlIHJ1bnMgYmVmb3JlIGl0cyBhdHRyIHdyaXRlcykuIFdoZW4gdGhlXG4gICAqIG1lYXN1cmVtZW50IGVuZHMgYXQgdGhlIGF0dHIgd3JpdGUsIG9ubHkgaG9vayB0aW1lIGZyb20gYmVmb3JlIHRoYXRcbiAgICogcG9pbnQgbWF5IGJlIHN1YnRyYWN0ZWQ7IGxhdGVyIGhvb2sgd3JpdGVzIGZhbGwgb3V0c2lkZSB0aGUgbWVhc3VyZWRcbiAgICogd2luZG93LiBVbmRlZmluZWQgd2hlbiBubyBhdHRyIHN1c3BlbnNpb24gaGFwcGVuZWQgaW4gdGhpcyBpbnZvY2F0aW9uXG4gICAqIChlLmcuIHRoZSBhdHRyX3NldCB3YXMgbG9hZGVkIGZyb20gYSByZWRlbGl2ZXJ5J3Mgc25hcHNob3QsIHdoZXJlIG5vXG4gICAqIHNhbWUtaW52b2NhdGlvbiBob29rIHRpbWUgcHJlY2VkZXMgaXQpLlxuICAgKi9cbiAgcHJlU3RlcEJsb2NraW5nQmVmb3JlQXR0ck1zOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBzdXNwZW5zaW9uIHRoYXQgc2NoZWR1bGVkIHRoaXMgYmF0Y2ggYWxzbyBjcmVhdGVkIHdhaXRzLlxuICAgKiBUaG9zZSBgd2FpdF9jcmVhdGVkYCB3cml0ZXMgYXJlIG5vdCBpbiBgZXZlbnRzYCB5ZXQgKHRoZXkgd2VyZSBjb21taXR0ZWRcbiAgICogYnkgdGhpcyBzdXNwZW5zaW9uIHBhc3MpLCBzbyB0aGV5IG11c3QgYmUgcmVwb3J0ZWQgc2VwYXJhdGVseS4gQVxuICAgKiB3YWl0IGRpc3F1YWxpZmllcyBib3RoIG1lYXN1cmVtZW50cy5cbiAgICovXG4gIHN1c3BlbnNpb25IYXNXYWl0czogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHN1c3BlbnNpb24gdGhhdCBzY2hlZHVsZWQgdGhpcyBiYXRjaCBhbHNvIGNyZWF0ZWQgaG9va3NcbiAgICogKGFsc28gbm90IGluIGBldmVudHNgIHlldCkuIEhvb2tzIGtlZXAgVFRGUyBlbGlnaWJsZSAodGhlaXIgbWVhc3VyZWRcbiAgICogd3JpdGUgdGltZSBpcyBzdWJ0cmFjdGVkIHZpYSBgcHJlU3RlcEJsb2NraW5nTXNgKSBidXQgZGlzcXVhbGlmeSBTVFNPLFxuICAgKiB3aGljaCBpcyBvbmx5IG1lYW5pbmdmdWwgZm9yIGEgcHVyZSBiYWNrLXRvLWJhY2sgc3RlcCBnYXAuXG4gICAqL1xuICBzdXNwZW5zaW9uQ3JlYXRlZEhvb2tzOiBib29sZWFuO1xuICAvKiogV2hldGhlciB0dXJibyBtb2RlIGlzIGFjdGl2ZSBmb3IgdGhpcyBpbnZvY2F0aW9uLiAqL1xuICB0dXJibzogYm9vbGVhbjtcbn0pOiBTdGVwTGF0ZW5jeVRyYWNraW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgeyBldmVudHMgfSA9IHBhcmFtcztcblxuICBsZXQgdHRmc0VsaWdpYmxlID1cbiAgICBwYXJhbXMuaW52b2NhdGlvblN0YXJ0ZWRDbGVhbiAmJlxuICAgIHBhcmFtcy5ydW5DcmVhdGVkQXRNcyAhPT0gdW5kZWZpbmVkICYmXG4gICAgIXBhcmFtcy5zdXNwZW5zaW9uSGFzV2FpdHM7XG4gIGxldCBwcmVTdGVwQXR0clN0YXJ0TXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgaWYgKHR0ZnNFbGlnaWJsZSkge1xuICAgIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgICBpZiAoVFRGU19ESVNRVUFMSUZZSU5HX0VWRU5UX1RZUEVTLmhhcyhldmVudC5ldmVudFR5cGUpKSB7XG4gICAgICAgIHR0ZnNFbGlnaWJsZSA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChldmVudC5ldmVudFR5cGUgPT09ICdhdHRyX3NldCcpIHtcbiAgICAgICAgY29uc3QgYXR0clN0YXJ0TXMgPSArKGV2ZW50Lm9jY3VycmVkQXQgPz8gZXZlbnQuY3JlYXRlZEF0KTtcbiAgICAgICAgcHJlU3RlcEF0dHJTdGFydE1zID1cbiAgICAgICAgICBwcmVTdGVwQXR0clN0YXJ0TXMgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBhdHRyU3RhcnRNc1xuICAgICAgICAgICAgOiBNYXRoLm1pbihwcmVTdGVwQXR0clN0YXJ0TXMsIGF0dHJTdGFydE1zKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBTVFNPOiB0aGUgdHdvIHN0ZXBzIHJhbiBiYWNrLXRvLWJhY2ssIHNvIHRoZSBuZXdlc3Qga25vd24gZXZlbnQgaXMgdGhlXG4gIC8vIHByZXZpb3VzIHN0ZXAncyB0ZXJtaW5hbCBldmVudCwgd2l0aCBub3RoaW5nIChob29rX3JlY2VpdmVkLCB3YWl0cyxcbiAgLy8gYXR0cl9zZXQsIC4uLikgaW4gYmV0d2VlbiBhbmQgdGhpcyBzdXNwZW5zaW9uIHNjaGVkdWxpbmcgbm90aGluZyBidXRcbiAgLy8gc3RlcHMuXG4gIGxldCBwcmV2U3RlcEVuZE1zOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGxldCBzdGVwQ291bnQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbGV0IGV2ZW50Q291bnQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgY29uc3QgbGFzdEV2ZW50ID0gZXZlbnRzW2V2ZW50cy5sZW5ndGggLSAxXTtcbiAgaWYgKFxuICAgICFwYXJhbXMuc3VzcGVuc2lvbkhhc1dhaXRzICYmXG4gICAgIXBhcmFtcy5zdXNwZW5zaW9uQ3JlYXRlZEhvb2tzICYmXG4gICAgbGFzdEV2ZW50ICYmXG4gICAgKGxhc3RFdmVudC5ldmVudFR5cGUgPT09ICdzdGVwX2NvbXBsZXRlZCcgfHxcbiAgICAgIGxhc3RFdmVudC5ldmVudFR5cGUgPT09ICdzdGVwX2ZhaWxlZCcpXG4gICkge1xuICAgIHByZXZTdGVwRW5kTXMgPSArKGxhc3RFdmVudC5vY2N1cnJlZEF0ID8/IGxhc3RFdmVudC5jcmVhdGVkQXQpO1xuICAgIGNvbnN0IHRlcm1pbmFsU3RlcElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIChldmVudC5ldmVudFR5cGUgPT09ICdzdGVwX2NvbXBsZXRlZCcgfHxcbiAgICAgICAgICBldmVudC5ldmVudFR5cGUgPT09ICdzdGVwX2ZhaWxlZCcpICYmXG4gICAgICAgIGV2ZW50LmNvcnJlbGF0aW9uSWQgIT09IHVuZGVmaW5lZFxuICAgICAgKSB7XG4gICAgICAgIHRlcm1pbmFsU3RlcElkcy5hZGQoZXZlbnQuY29ycmVsYXRpb25JZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHN0ZXBDb3VudCA9IHRlcm1pbmFsU3RlcElkcy5zaXplO1xuICAgIGV2ZW50Q291bnQgPSBldmVudHMubGVuZ3RoO1xuICB9XG5cbiAgLy8gUlNGUyBzaGFyZXMgVFRGUydzIGVsaWdpYmlsaXR5IGV4YWN0bHkgKHNhbWUgZXZlbnQtbG9nL3dhaXQgY2hlY2tzKSxcbiAgLy8gcGx1cyBpdHMgb3duIGFuY2hvciBiZWluZyByZWNvdmVyYWJsZS5cbiAgY29uc3QgcnNmc0VsaWdpYmxlID1cbiAgICB0dGZzRWxpZ2libGUgJiYgcGFyYW1zLnJ1blN0YXJ0ZWRSZWNlaXZlZEF0TXMgIT09IHVuZGVmaW5lZDtcblxuICBpZiAoIXR0ZnNFbGlnaWJsZSAmJiBwcmV2U3RlcEVuZE1zID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi4odHRmc0VsaWdpYmxlXG4gICAgICA/IHtcbiAgICAgICAgICB0dGZzQW5jaG9yTXM6IHBhcmFtcy5ydW5DcmVhdGVkQXRNcyxcbiAgICAgICAgICAvLyBXaGVuIHRoZSBtZWFzdXJlbWVudCBlbmRzIGF0IHRoZSBmaXJzdCBhdHRyIHdyaXRlLCBvbmx5IGhvb2tcbiAgICAgICAgICAvLyB0aW1lIGZyb20gYmVmb3JlIHRoYXQgcG9pbnQgaXMgaW5zaWRlIHRoZSBtZWFzdXJlZCB3aW5kb3cuXG4gICAgICAgICAgcHJlU3RlcEJsb2NraW5nTXM6XG4gICAgICAgICAgICBwcmVTdGVwQXR0clN0YXJ0TXMgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IChwYXJhbXMucHJlU3RlcEJsb2NraW5nQmVmb3JlQXR0ck1zID8/IDApXG4gICAgICAgICAgICAgIDogcGFyYW1zLnByZVN0ZXBCbG9ja2luZ01zLFxuICAgICAgICAgIC4uLihwcmVTdGVwQXR0clN0YXJ0TXMgIT09IHVuZGVmaW5lZCA/IHsgcHJlU3RlcEF0dHJTdGFydE1zIH0gOiB7fSksXG4gICAgICAgIH1cbiAgICAgIDoge30pLFxuICAgIC4uLihyc2ZzRWxpZ2libGVcbiAgICAgID8ge1xuICAgICAgICAgIHJzZnNBbmNob3JNczogcGFyYW1zLnJ1blN0YXJ0ZWRSZWNlaXZlZEF0TXMsXG4gICAgICAgICAgcmVwbGF5TXM6IHBhcmFtcy5yZXBsYXlNcyxcbiAgICAgICAgfVxuICAgICAgOiB7fSksXG4gICAgLi4uKHByZXZTdGVwRW5kTXMgIT09IHVuZGVmaW5lZFxuICAgICAgPyB7IHByZXZTdGVwRW5kTXMsIHN0ZXBDb3VudCwgZXZlbnRDb3VudCB9XG4gICAgICA6IHt9KSxcbiAgICB0dXJibzogcGFyYW1zLnR1cmJvLFxuICB9O1xufVxuXG4vKipcbiAqIENvbXB1dGUgdGhlIGxhdGVuY3kgdGVsZW1ldHJ5IHRvIGF0dGFjaCB0byB0aGUgc3RlcCdzIHRlcm1pbmFsIGV2ZW50LlxuICogQ2FsbGVkIGJ5IGBleGVjdXRlU3RlcGAgd2l0aCB0aGUgd2FsbC1jbG9jayB0aW1lc3RhbXAgdGFrZW4gaW1tZWRpYXRlbHlcbiAqIGJlZm9yZSB1c2VyIHN0ZXAgY29kZSBydW5zLiBSZXR1cm5zIHVuZGVmaW5lZCB3aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG9cbiAqIHJlcG9ydCAobm8gdHJhY2tpbmcsIG9yIGEgcmV0cnkgYXR0ZW1wdDsgcmV0cmllcyBtZWFzdXJlIG5laXRoZXIgVFRGUyBub3JcbiAqIFNUU08pLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVN0ZXBMYXRlbmN5RXZlbnREYXRhKHBhcmFtczoge1xuICB0cmFja2luZzogU3RlcExhdGVuY3lUcmFja2luZyB8IHVuZGVmaW5lZDtcbiAgLyoqIGBEYXRlLm5vdygpYCB0YWtlbiBpbW1lZGlhdGVseSBiZWZvcmUgdXNlciBzdGVwIGNvZGUgYmVnYW4gZXhlY3V0aW5nLiAqL1xuICBzdGVwQ29kZVN0YXJ0ZWRBdE1zOiBudW1iZXI7XG4gIC8qKlxuICAgKiBgRGF0ZS5ub3coKWAgdGFrZW4gaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBmaXJzdCBzdGVwJ3Mgc3RhcnQgUE9TVFxuICAgKiAoYHN0ZXBfc3RhcnRlZGApIHdhcyBpc3N1ZWQuIFByZXNlbnQgb25seSBmb3IgdGhlIGxhenkgaW5saW5lIHN0ZXBzIFJTRlNcbiAgICogY2FyZXMgYWJvdXQ7IHNlZSB0aGUgY2FsbCBzaXRlcyBpbiBzdGVwLWV4ZWN1dG9yLnRzLlxuICAgKi9cbiAgc3RlcFN0YXJ0UG9zdFNlbnRBdE1zOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGF0dGVtcHQ6IG51bWJlcjtcbiAgLyoqIFdoZXRoZXIgdGhpcyBzdGVwIHdhcyBzdGFydGVkIGxhemlseSAobm8gc2VwYXJhdGUgc3RlcF9jcmVhdGVkIHdyaXRlKS4gKi9cbiAgbGF6eVN0ZXBTdGFydDogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhlIGJvZHkgcmFuIG9wdGltaXN0aWNhbGx5LCB3aXRob3V0IGF3YWl0aW5nIHN0ZXBfc3RhcnRlZC4gKi9cbiAgb3B0aW1pc3RpY1N0YXJ0OiBib29sZWFuO1xuICAvKipcbiAgICogV2hldGhlciB0aGUgc3RlcCdzIGBzdGVwX2NyZWF0ZWRgICsgYHN0ZXBfc3RhcnRlZGAgcGFpciB3YXMgcHJlLWNsYWltZWRcbiAgICogaW5zaWRlIHRoZSBzdXNwZW5zaW9uIGhhbmRsZXIncyBiYXRjaGVkIGZhbi1vdXQgd3JpdGUgKG5vIHN0YXJ0IFBPU1Qgb2ZcbiAgICogaXRzIG93biBhdCBhbGwpLlxuICAgKi9cbiAgcHJlY2xhaW1lZFN0YXJ0PzogYm9vbGVhbjtcbn0pOiBTdGVwTGF0ZW5jeUV2ZW50RGF0YSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHsgdHJhY2tpbmcgfSA9IHBhcmFtcztcbiAgaWYgKCF0cmFja2luZyB8fCBwYXJhbXMuYXR0ZW1wdCAhPT0gMSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyBTbWFsbCBuZWdhdGl2ZSBkdXJhdGlvbnMgY2xhbXAgdG8gMDogY3Jvc3MtaW52b2NhdGlvbiB0aW1lc3RhbXBzIGNhblxuICAvLyBjb21lIGZyb20gYW5vdGhlciBtYWNoaW5lJ3MgY2xvY2ssIHNvIGJvdW5kZWQgc2tldyBtdXN0IG5vdCBwcm9kdWNlXG4gIC8vIG5lZ2F0aXZlIHZhbHVlcy4gRHVyYXRpb25zIG1vcmUgbmVnYXRpdmUgdGhhbiBNQVhfQ0xPQ0tfU0tFV19NUyBhcmUgbm90XG4gIC8vIHNrZXcgYnV0IGEgY29ycnVwdCBhbmNob3IsIGFuZCB0aGUgc2FtcGxlIGlzIGRyb3BwZWQgKHNlZSB0aGUgY29uc3RhbnQnc1xuICAvLyBkb2MgY29tbWVudCkuXG4gIC8vXG4gIC8vIEEgcHJlLXN0ZXAgc2V0QXR0cmlidXRlcyBkZXRvdXIgZW5kcyB0aGUgbWVhc3VyZW1lbnQgYXQgdGhlIGZpcnN0IGF0dHJcbiAgLy8gd3JpdGUgaW5zdGVhZCBvZiB0aGUgc3RlcCdzIGNvZGUgc3RhcnQ6IHRoZSByZW1haW5kZXIgaXMgdGhlIGR1cmF0aW9uXG4gIC8vIG9mIHRoZSBzZXRBdHRyaWJ1dGVzIGNhbGwgKHJlc29sdmVkIHZpYSBhbiBleHRyYSByZXBsYXkpLCB3aGljaCBpc1xuICAvLyBzdWJ0cmFjdGVkIHJhdGhlciB0aGFuIGRpc3F1YWxpZnlpbmcgdGhlIHNhbXBsZS4gSW4gdGhhdCBjYXNlXG4gIC8vIGB0cmFja2luZy5wcmVTdGVwQmxvY2tpbmdNc2AgYWxyZWFkeSBob2xkcyBvbmx5IHRoZSBob29rIHRpbWUgZnJvbVxuICAvLyBCRUZPUkUgdGhlIGF0dHIgd3JpdGU7IGhvb2sgd3JpdGVzIGFmdGVyIHRoZSB3aW5kb3cgY2xvc2VkIGFyZSBleGNsdWRlZFxuICAvLyBieSBjb21wdXRlU3RlcExhdGVuY3lUcmFja2luZyAoc2VlIHByZVN0ZXBCbG9ja2luZ0JlZm9yZUF0dHJNcykuXG4gIGNvbnN0IHR0ZnNFbmRNcyA9IHRyYWNraW5nLnByZVN0ZXBBdHRyU3RhcnRNcyA/PyBwYXJhbXMuc3RlcENvZGVTdGFydGVkQXRNcztcbiAgY29uc3QgcmF3VHRmcyA9XG4gICAgdHJhY2tpbmcudHRmc0FuY2hvck1zICE9PSB1bmRlZmluZWRcbiAgICAgID8gdHRmc0VuZE1zIC0gdHJhY2tpbmcudHRmc0FuY2hvck1zIC0gKHRyYWNraW5nLnByZVN0ZXBCbG9ja2luZ01zID8/IDApXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3QgdHRmcyA9XG4gICAgcmF3VHRmcyAhPT0gdW5kZWZpbmVkICYmIHJhd1R0ZnMgPj0gLU1BWF9DTE9DS19TS0VXX01TXG4gICAgICA/IE1hdGgubWF4KDAsIHJhd1R0ZnMpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3QgcmF3U3RzbyA9XG4gICAgdHJhY2tpbmcucHJldlN0ZXBFbmRNcyAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHBhcmFtcy5zdGVwQ29kZVN0YXJ0ZWRBdE1zIC0gdHJhY2tpbmcucHJldlN0ZXBFbmRNc1xuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHN0c28gPVxuICAgIHJhd1N0c28gIT09IHVuZGVmaW5lZCAmJiByYXdTdHNvID49IC1NQVhfQ0xPQ0tfU0tFV19NU1xuICAgICAgPyBNYXRoLm1heCgwLCByYXdTdHNvKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIC8vIFJTRlMgZW5kcyBhdCB0aGUgYWN0dWFsIHN0YXJ0LVBPU1QgaW5zdGFudCwgbm90IGF0IHR0ZnNFbmRNczogdW5saWtlXG4gIC8vIFRURlMgaXQgaXMgbm90IHN1YmplY3QgdG8gdGhlIHByZS1zdGVwIGF0dHItd3JpdGUgc2hvcnRjdXQsIHNvIGFcbiAgLy8gcHJlLXN0ZXAgc2V0QXR0cmlidXRlcyBkZXRvdXIgKHJhcmUpIG1ha2VzIFJTRlMgaW5jbHVkZSB0aGUgZGV0b3VyXG4gIC8vIHdoaWxlIFRURlMgZXhjbHVkZXMgaXQuIGBmaW5hbFNjaGVkdWxpbmdSZXBsYXlgIGlzIGEgZGlyZWN0IHBhc3N0aHJvdWdoXG4gIC8vIG9mIGB0cmFja2luZy5yZXBsYXlNc2AsIHRoZSBGSU5BTCByZXBsYXkgcGFzcyBvbmx5IChzZWVcbiAgLy8gU3RlcExhdGVuY3lUcmFja2luZy5yZXBsYXlNcyksIHNvIG5vIGZ1cnRoZXIgc3VidHJhY3Rpb24gYXBwbGllcywgYnV0XG4gIC8vIGl0IGFsc28gbWVhbnMgaXQgaXMgTk9UIGFjY3VtdWxhdGVkIGFjcm9zcyBhbnkgZWFybGllciBwcmUtZmlyc3Qtc3RlcFxuICAvLyBwYXNzZXMgKGUuZy4gYSBzZXRBdHRyaWJ1dGVzIGRldG91cikgYW5kIG11c3Qgbm90IGJlIHJlYWQgYXMgXCJ0aGVcbiAgLy8gcmVwbGF5IHBvcnRpb24gb2YgcnNmc1wiOyByc2ZzIGNvdmVycyB0aGUgd2hvbGUgd2luZG93LlxuICAvL1xuICAvLyBmaW5hbFNjaGVkdWxpbmdSZXBsYXkgZHVwbGljYXRlcyB3aGF0IE9URUwgYWxyZWFkeSBjYXB0dXJlcyBvbiB0aGUgcnVuL2ludm9jYXRpb25cbiAgLy8gc3BhbiwgYnV0IGlzIGRlbGliZXJhdGVseSBjb2xsZWN0ZWQgYXMgY2xpZW50IHRlbGVtZXRyeSBzbyB0aGUgc2VydmVyXG4gIC8vIGNhbiBlbWl0IGl0IGFzIGFuIFVOU0FNUExFRCwgZnVsbC1wb3B1bGF0aW9uIG1ldHJpYzogd29ya2Zsb3ctc2VydmVyJ3NcbiAgLy8gc2VydmVyIHNwYW5zIGFyZSBoZWF2aWx5IHNhbXBsZWQgaW4gcHJvZHVjdGlvbiAofjclKSwgYW5kIGNsaWVudCBzcGFuc1xuICAvLyBjYW4ndCBiZSBmaWx0ZXJlZCBieSBTREsgdmVyc2lvbiwgc28gbmVpdGhlciBjYW4gc2VydmUgYXMgdGhlXG4gIC8vIGRhc2hib2FyZCdzIGV4YWN0IFRURlMgZGVjb21wb3NpdGlvbi5cbiAgY29uc3QgcnNmcyA9XG4gICAgdHJhY2tpbmcucnNmc0FuY2hvck1zICE9PSB1bmRlZmluZWQgJiZcbiAgICBwYXJhbXMuc3RlcFN0YXJ0UG9zdFNlbnRBdE1zICE9PSB1bmRlZmluZWRcbiAgICAgID8gTWF0aC5tYXgoMCwgcGFyYW1zLnN0ZXBTdGFydFBvc3RTZW50QXRNcyAtIHRyYWNraW5nLnJzZnNBbmNob3JNcylcbiAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBmaW5hbFNjaGVkdWxpbmdSZXBsYXkgPVxuICAgIHRyYWNraW5nLnJlcGxheU1zICE9PSB1bmRlZmluZWRcbiAgICAgID8gTWF0aC5tYXgoMCwgdHJhY2tpbmcucmVwbGF5TXMpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICBpZiAodHRmcyA9PT0gdW5kZWZpbmVkICYmIHN0c28gPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBvcHRpbWl6YXRpb25zOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAodHJhY2tpbmcudHVyYm8pIG9wdGltaXphdGlvbnMucHVzaCgndHVyYm8nKTtcbiAgaWYgKHBhcmFtcy5sYXp5U3RlcFN0YXJ0KSBvcHRpbWl6YXRpb25zLnB1c2goJ2xhenlTdGVwU3RhcnQnKTtcbiAgaWYgKHBhcmFtcy5vcHRpbWlzdGljU3RhcnQpIG9wdGltaXphdGlvbnMucHVzaCgnb3B0aW1pc3RpY1N0YXJ0Jyk7XG4gIGlmIChwYXJhbXMucHJlY2xhaW1lZFN0YXJ0KSBvcHRpbWl6YXRpb25zLnB1c2goJ3ByZWNsYWltZWRTdGFydCcpO1xuXG4gIHJldHVybiB7XG4gICAgLi4uKHR0ZnMgIT09IHVuZGVmaW5lZCA/IHsgdHRmcyB9IDoge30pLFxuICAgIC4uLihzdHNvICE9PSB1bmRlZmluZWQgPyB7IHN0c28gfSA6IHt9KSxcbiAgICAuLi4oc3RzbyAhPT0gdW5kZWZpbmVkICYmIHRyYWNraW5nLnN0ZXBDb3VudCAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHsgc3RlcENvdW50OiB0cmFja2luZy5zdGVwQ291bnQgfVxuICAgICAgOiB7fSksXG4gICAgLi4uKHN0c28gIT09IHVuZGVmaW5lZCAmJiB0cmFja2luZy5ldmVudENvdW50ICE9PSB1bmRlZmluZWRcbiAgICAgID8geyBldmVudENvdW50OiB0cmFja2luZy5ldmVudENvdW50IH1cbiAgICAgIDoge30pLFxuICAgIC4uLihyc2ZzICE9PSB1bmRlZmluZWQgPyB7IHJzZnMgfSA6IHt9KSxcbiAgICAuLi4oZmluYWxTY2hlZHVsaW5nUmVwbGF5ICE9PSB1bmRlZmluZWQgPyB7IGZpbmFsU2NoZWR1bGluZ1JlcGxheSB9IDoge30pLFxuICAgIG9wdGltaXphdGlvbnMsXG4gIH07XG59XG4iXX0=
|
|
@@ -18,13 +18,13 @@ export declare function isStepOwnershipActive(step: StepInvocationQueueItem): bo
|
|
|
18
18
|
/**
|
|
19
19
|
* Seconds left on an owned step's liveness lease, anchored at its latest
|
|
20
20
|
* `step_started`. 0 means the lease has expired (or the start timestamp is
|
|
21
|
-
* missing
|
|
21
|
+
* missing, the degraded mode for worlds whose events lack usable
|
|
22
22
|
* timestamps), in which case dispatch falls back to the immediate enqueue.
|
|
23
23
|
*
|
|
24
24
|
* The result is clamped to the configured lease: `lastStartedAt` is the
|
|
25
25
|
* server-stamped event `createdAt` while `nowMs` is the local clock, so a
|
|
26
26
|
* client running behind the server would otherwise compute a remainder
|
|
27
|
-
* LONGER than the lease itself
|
|
27
|
+
* LONGER than the lease itself, and with the lease tuned to the 900s cap,
|
|
28
28
|
* a `delaySeconds` above the queue's per-message maximum, which SQS-backed
|
|
29
29
|
* worlds reject outright (the wake replay's enqueue would throw and ride
|
|
30
30
|
* the redelivery loop). The clamp makes skew strictly harmless; remaining
|
|
@@ -34,14 +34,14 @@ export declare function stepLeaseRemainingSeconds(step: StepInvocationQueueItem,
|
|
|
34
34
|
/**
|
|
35
35
|
* Idempotency key for the delayed backstop wake of an inline-owned step.
|
|
36
36
|
*
|
|
37
|
-
* The key is scoped to the current OWNERSHIP EPOCH
|
|
38
|
-
* latest `step_started`
|
|
37
|
+
* The key is scoped to the current OWNERSHIP EPOCH (the timestamp of the
|
|
38
|
+
* latest `step_started`), not just the correlation ID. Within one epoch,
|
|
39
39
|
* every wake replay derives the same key, so fan-out stays capped at one
|
|
40
40
|
* pending backstop per step. But when owner recovery re-stamps the step
|
|
41
41
|
* (queue redelivery of the owning message → new `step_started` → new
|
|
42
42
|
* `lastStartedAt`), the key CHANGES. This is load-bearing for liveness:
|
|
43
43
|
* queues dedupe an idempotency key for the lifetime of the original
|
|
44
|
-
* message
|
|
44
|
+
* message (including while a delivery of it is in flight), so a backstop
|
|
45
45
|
* that fires during a refreshed lease and tries to re-arm under a fixed key
|
|
46
46
|
* would dedupe against ITSELF and be dropped, leaving no escape hatch if
|
|
47
47
|
* the recovered owner later dies without further redeliveries. The epoch
|
|
@@ -56,7 +56,7 @@ export declare function stepLeaseRemainingSeconds(step: StepInvocationQueueItem,
|
|
|
56
56
|
* The key must also never be the step message's own `idempotencyKey`
|
|
57
57
|
* (the bare correlation ID): the owner's retry handoff enqueues the step
|
|
58
58
|
* under that key with a short backoff, and a pending backstop sharing it
|
|
59
|
-
* would absorb the retry
|
|
59
|
+
* would absorb the retry, turning a 1s backoff into a full-lease stall.
|
|
60
60
|
*/
|
|
61
61
|
export declare function backstopIdempotencyKey(step: StepInvocationQueueItem): string;
|
|
62
62
|
/**
|
|
@@ -21,13 +21,13 @@ export function isStepOwnershipActive(step) {
|
|
|
21
21
|
/**
|
|
22
22
|
* Seconds left on an owned step's liveness lease, anchored at its latest
|
|
23
23
|
* `step_started`. 0 means the lease has expired (or the start timestamp is
|
|
24
|
-
* missing
|
|
24
|
+
* missing, the degraded mode for worlds whose events lack usable
|
|
25
25
|
* timestamps), in which case dispatch falls back to the immediate enqueue.
|
|
26
26
|
*
|
|
27
27
|
* The result is clamped to the configured lease: `lastStartedAt` is the
|
|
28
28
|
* server-stamped event `createdAt` while `nowMs` is the local clock, so a
|
|
29
29
|
* client running behind the server would otherwise compute a remainder
|
|
30
|
-
* LONGER than the lease itself
|
|
30
|
+
* LONGER than the lease itself, and with the lease tuned to the 900s cap,
|
|
31
31
|
* a `delaySeconds` above the queue's per-message maximum, which SQS-backed
|
|
32
32
|
* worlds reject outright (the wake replay's enqueue would throw and ride
|
|
33
33
|
* the redelivery loop). The clamp makes skew strictly harmless; remaining
|
|
@@ -43,14 +43,14 @@ export function stepLeaseRemainingSeconds(step, nowMs) {
|
|
|
43
43
|
/**
|
|
44
44
|
* Idempotency key for the delayed backstop wake of an inline-owned step.
|
|
45
45
|
*
|
|
46
|
-
* The key is scoped to the current OWNERSHIP EPOCH
|
|
47
|
-
* latest `step_started`
|
|
46
|
+
* The key is scoped to the current OWNERSHIP EPOCH (the timestamp of the
|
|
47
|
+
* latest `step_started`), not just the correlation ID. Within one epoch,
|
|
48
48
|
* every wake replay derives the same key, so fan-out stays capped at one
|
|
49
49
|
* pending backstop per step. But when owner recovery re-stamps the step
|
|
50
50
|
* (queue redelivery of the owning message → new `step_started` → new
|
|
51
51
|
* `lastStartedAt`), the key CHANGES. This is load-bearing for liveness:
|
|
52
52
|
* queues dedupe an idempotency key for the lifetime of the original
|
|
53
|
-
* message
|
|
53
|
+
* message (including while a delivery of it is in flight), so a backstop
|
|
54
54
|
* that fires during a refreshed lease and tries to re-arm under a fixed key
|
|
55
55
|
* would dedupe against ITSELF and be dropped, leaving no escape hatch if
|
|
56
56
|
* the recovered owner later dies without further redeliveries. The epoch
|
|
@@ -65,7 +65,7 @@ export function stepLeaseRemainingSeconds(step, nowMs) {
|
|
|
65
65
|
* The key must also never be the step message's own `idempotencyKey`
|
|
66
66
|
* (the bare correlation ID): the owner's retry handoff enqueues the step
|
|
67
67
|
* under that key with a short backoff, and a pending backstop sharing it
|
|
68
|
-
* would absorb the retry
|
|
68
|
+
* would absorb the retry, turning a 1s backoff into a full-lease stall.
|
|
69
69
|
*/
|
|
70
70
|
export function backstopIdempotencyKey(step) {
|
|
71
71
|
return `${step.correlationId}:backstop:${step.lastStartedAt}`;
|
|
@@ -82,7 +82,7 @@ export function backstopIdempotencyKey(step) {
|
|
|
82
82
|
export function hasPendingStepOwnedByMessage(events, pendingCorrelationIds, messageId) {
|
|
83
83
|
// Latest-wins scan: events are in log order, so later entries overwrite.
|
|
84
84
|
// A step_retrying lapses ownership permanently (matching the sawRetrying
|
|
85
|
-
// semantics of the replay consumer in step.ts)
|
|
85
|
+
// semantics of the replay consumer in step.ts): from that point the step
|
|
86
86
|
// is queue-owned, whatever starts follow.
|
|
87
87
|
const latestOwner = new Map();
|
|
88
88
|
const sawRetrying = new Set();
|
|
@@ -111,4 +111,4 @@ export function hasPendingStepOwnedByMessage(events, pendingCorrelationIds, mess
|
|
|
111
111
|
}
|
|
112
112
|
return false;
|
|
113
113
|
}
|
|
114
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1vd25lcnNoaXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9zdGVwLW93bmVyc2hpcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVoRTs7Ozs7O0dBTUc7QUFFSDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQUMsSUFBNkI7SUFDakUsT0FBTyxDQUNMLElBQUksQ0FBQyxlQUFlLEtBQUssSUFBSTtRQUM3QixJQUFJLENBQUMsY0FBYyxLQUFLLFNBQVM7UUFDakMsSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJLENBQzFCLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLFVBQVUseUJBQXlCLENBQ3ZDLElBQTZCLEVBQzdCLEtBQWE7SUFFYixJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssU0FBUztRQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQy9DLE1BQU0sWUFBWSxHQUFHLDhCQUE4QixFQUFFLENBQUM7SUFDdEQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsR0FBRyxZQUFZLEdBQUcsSUFBSSxHQUFHLEtBQUssQ0FBQztJQUNyRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1RSxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUFDLElBQTZCO0lBQ2xFLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxhQUFhLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztBQUNoRSxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsNEJBQTRCLENBQzFDLE1BQWUsRUFDZixxQkFBOEMsRUFDOUMsU0FBaUI7SUFFakIseUVBQXlFO0lBQ3pFLHlFQUF5RTtJQUN6RSwwRUFBMEU7SUFDMUUsMENBQTBDO0lBQzFDLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxFQUE4QixDQUFDO0lBQzFELE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDdEMsS0FBSyxNQUFNLENBQUMsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsQ0FBQyxhQUFhLEtBQUssU0FBUztZQUFFLFNBQVM7UUFDNUMsSUFBSSxDQUFDLENBQUMsU0FBUyxLQUFLLGNBQWMsRUFBRSxDQUFDO1lBQ25DLE1BQU0sS0FBSyxHQUNULFdBQVcsSUFBSSxDQUFDO2dCQUNoQixDQUFDLENBQUMsU0FBUztnQkFDWCxnQkFBZ0IsSUFBSSxDQUFDLENBQUMsU0FBUztnQkFDL0IsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLGNBQWMsS0FBSyxRQUFRO2dCQUM1QyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxjQUFjO2dCQUM1QixDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ2hCLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMxQyxDQUFDO2FBQU0sSUFBSSxDQUFDLENBQUMsU0FBUyxLQUFLLGVBQWUsRUFBRSxDQUFDO1lBQzNDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ25DLENBQUM7SUFDSCxDQUFDO0lBQ0QsS0FBSyxNQUFNLEVBQUUsSUFBSSxxQkFBcUIsRUFBRSxDQUFDO1FBQ3ZDLElBQ0UsRUFBRSxLQUFLLFNBQVM7WUFDaEIsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNwQixXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLFNBQVMsRUFDakMsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEV2ZW50IH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB0eXBlIHsgU3RlcEludm9jYXRpb25RdWV1ZUl0ZW0gfSBmcm9tICcuLi9nbG9iYWwuanMnO1xuaW1wb3J0IHsgZ2V0SW5saW5lT3duZXJzaGlwTGVhc2VTZWNvbmRzIH0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuXG4vKipcbiAqIElubGluZSBzdGVwIG93bmVyc2hpcCBoZWxwZXJzIGZvciB0aGUgcGVuZGluZy1zdGVwIGRpc3BhdGNoIGRlY2lzaW9uIHRhYmxlXG4gKiBpbiBydW50aW1lLnRzICh3b3JrZmxvdyMyNzgwKS4gT3duZXJzaGlwIHN0YXRlIGl0c2VsZiBpcyBkZXJpdmVkIHBlci1yZXBsYXlcbiAqIGZyb20gdGhlIGV2ZW50IGxvZyBieSB0aGUgc3RlcCBjb25zdW1lciBpbiBzdGVwLnRzIGFuZCBzdXJmYWNlZCBvblxuICogU3RlcEludm9jYXRpb25RdWV1ZUl0ZW07IHRoZXNlIGZ1bmN0aW9ucyBpbnRlcnByZXQgdGhhdCBzdGF0ZSBhdCBkaXNwYXRjaFxuICogdGltZS5cbiAqL1xuXG4vKipcbiAqIFdoZXRoZXIgaW5saW5lIHN0ZXAgb3duZXJzaGlwIGlzIGFjdGl2ZSBmb3IgYSBwZW5kaW5nIHN0ZXA6IGNyZWF0ZWQsXG4gKiBsYXRlc3QgYHN0ZXBfc3RhcnRlZGAgY2FycmllcyBhbiBvd25lciBzdGFtcCwgYW5kIG5vIGBzdGVwX3JldHJ5aW5nYCBoYXNcbiAqIGJlZW4gb2JzZXJ2ZWQgKGZyb20gYHN0ZXBfcmV0cnlpbmdgIG9uLCB0aGUgc3RlcCBpcyBxdWV1ZS1vd25lZCBieSBpdHNcbiAqIGRlbGF5ZWQgcmV0cnkgaGFuZG9mZiAvIHJlcGxheSByZXF1ZXVlLCBzbyBvd25lcnNoaXAgaXMgcGVybWFuZW50bHlcbiAqIGxhcHNlZCBmb3IgdGhlIGNvcnJlbGF0aW9uIElEKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3RlcE93bmVyc2hpcEFjdGl2ZShzdGVwOiBTdGVwSW52b2NhdGlvblF1ZXVlSXRlbSk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIHN0ZXAuaGFzQ3JlYXRlZEV2ZW50ID09PSB0cnVlICYmXG4gICAgc3RlcC5vd25lck1lc3NhZ2VJZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgc3RlcC5zYXdSZXRyeWluZyAhPT0gdHJ1ZVxuICApO1xufVxuXG4vKipcbiAqIFNlY29uZHMgbGVmdCBvbiBhbiBvd25lZCBzdGVwJ3MgbGl2ZW5lc3MgbGVhc2UsIGFuY2hvcmVkIGF0IGl0cyBsYXRlc3RcbiAqIGBzdGVwX3N0YXJ0ZWRgLiAwIG1lYW5zIHRoZSBsZWFzZSBoYXMgZXhwaXJlZCAob3IgdGhlIHN0YXJ0IHRpbWVzdGFtcCBpc1xuICogbWlzc2luZyDigJQgdGhlIGRlZ3JhZGVkIG1vZGUgZm9yIHdvcmxkcyB3aG9zZSBldmVudHMgbGFjayB1c2FibGVcbiAqIHRpbWVzdGFtcHMpLCBpbiB3aGljaCBjYXNlIGRpc3BhdGNoIGZhbGxzIGJhY2sgdG8gdGhlIGltbWVkaWF0ZSBlbnF1ZXVlLlxuICpcbiAqIFRoZSByZXN1bHQgaXMgY2xhbXBlZCB0byB0aGUgY29uZmlndXJlZCBsZWFzZTogYGxhc3RTdGFydGVkQXRgIGlzIHRoZVxuICogc2VydmVyLXN0YW1wZWQgZXZlbnQgYGNyZWF0ZWRBdGAgd2hpbGUgYG5vd01zYCBpcyB0aGUgbG9jYWwgY2xvY2ssIHNvIGFcbiAqIGNsaWVudCBydW5uaW5nIGJlaGluZCB0aGUgc2VydmVyIHdvdWxkIG90aGVyd2lzZSBjb21wdXRlIGEgcmVtYWluZGVyXG4gKiBMT05HRVIgdGhhbiB0aGUgbGVhc2UgaXRzZWxmIOKAlCBhbmQgd2l0aCB0aGUgbGVhc2UgdHVuZWQgdG8gdGhlIDkwMHMgY2FwLFxuICogYSBgZGVsYXlTZWNvbmRzYCBhYm92ZSB0aGUgcXVldWUncyBwZXItbWVzc2FnZSBtYXhpbXVtLCB3aGljaCBTUVMtYmFja2VkXG4gKiB3b3JsZHMgcmVqZWN0IG91dHJpZ2h0ICh0aGUgd2FrZSByZXBsYXkncyBlbnF1ZXVlIHdvdWxkIHRocm93IGFuZCByaWRlXG4gKiB0aGUgcmVkZWxpdmVyeSBsb29wKS4gVGhlIGNsYW1wIG1ha2VzIHNrZXcgc3RyaWN0bHkgaGFybWxlc3M7IHJlbWFpbmluZ1xuICogdGltZSBjYW4gbmV2ZXIgbGVnaXRpbWF0ZWx5IGV4Y2VlZCB0aGUgZnVsbCBsZWFzZSBhbnl3YXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGVwTGVhc2VSZW1haW5pbmdTZWNvbmRzKFxuICBzdGVwOiBTdGVwSW52b2NhdGlvblF1ZXVlSXRlbSxcbiAgbm93TXM6IG51bWJlclxuKTogbnVtYmVyIHtcbiAgaWYgKHN0ZXAubGFzdFN0YXJ0ZWRBdCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gMDtcbiAgY29uc3QgbGVhc2VTZWNvbmRzID0gZ2V0SW5saW5lT3duZXJzaGlwTGVhc2VTZWNvbmRzKCk7XG4gIGNvbnN0IHJlbWFpbmluZ01zID0gc3RlcC5sYXN0U3RhcnRlZEF0ICsgbGVhc2VTZWNvbmRzICogMTAwMCAtIG5vd01zO1xuICByZXR1cm4gTWF0aC5taW4obGVhc2VTZWNvbmRzLCBNYXRoLm1heCgwLCBNYXRoLmNlaWwocmVtYWluaW5nTXMgLyAxMDAwKSkpO1xufVxuXG4vKipcbiAqIElkZW1wb3RlbmN5IGtleSBmb3IgdGhlIGRlbGF5ZWQgYmFja3N0b3Agd2FrZSBvZiBhbiBpbmxpbmUtb3duZWQgc3RlcC5cbiAqXG4gKiBUaGUga2V5IGlzIHNjb3BlZCB0byB0aGUgY3VycmVudCBPV05FUlNISVAgRVBPQ0gg4oCUIHRoZSB0aW1lc3RhbXAgb2YgdGhlXG4gKiBsYXRlc3QgYHN0ZXBfc3RhcnRlZGAg4oCUIG5vdCBqdXN0IHRoZSBjb3JyZWxhdGlvbiBJRC4gV2l0aGluIG9uZSBlcG9jaCxcbiAqIGV2ZXJ5IHdha2UgcmVwbGF5IGRlcml2ZXMgdGhlIHNhbWUga2V5LCBzbyBmYW4tb3V0IHN0YXlzIGNhcHBlZCBhdCBvbmVcbiAqIHBlbmRpbmcgYmFja3N0b3AgcGVyIHN0ZXAuIEJ1dCB3aGVuIG93bmVyIHJlY292ZXJ5IHJlLXN0YW1wcyB0aGUgc3RlcFxuICogKHF1ZXVlIHJlZGVsaXZlcnkgb2YgdGhlIG93bmluZyBtZXNzYWdlIOKGkiBuZXcgYHN0ZXBfc3RhcnRlZGAg4oaSIG5ld1xuICogYGxhc3RTdGFydGVkQXRgKSwgdGhlIGtleSBDSEFOR0VTLiBUaGlzIGlzIGxvYWQtYmVhcmluZyBmb3IgbGl2ZW5lc3M6XG4gKiBxdWV1ZXMgZGVkdXBlIGFuIGlkZW1wb3RlbmN5IGtleSBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBvcmlnaW5hbFxuICogbWVzc2FnZSDigJQgaW5jbHVkaW5nIHdoaWxlIGEgZGVsaXZlcnkgb2YgaXQgaXMgaW4gZmxpZ2h0IOKAlCBzbyBhIGJhY2tzdG9wXG4gKiB0aGF0IGZpcmVzIGR1cmluZyBhIHJlZnJlc2hlZCBsZWFzZSBhbmQgdHJpZXMgdG8gcmUtYXJtIHVuZGVyIGEgZml4ZWQga2V5XG4gKiB3b3VsZCBkZWR1cGUgYWdhaW5zdCBJVFNFTEYgYW5kIGJlIGRyb3BwZWQsIGxlYXZpbmcgbm8gZXNjYXBlIGhhdGNoIGlmXG4gKiB0aGUgcmVjb3ZlcmVkIG93bmVyIGxhdGVyIGRpZXMgd2l0aG91dCBmdXJ0aGVyIHJlZGVsaXZlcmllcy4gVGhlIGVwb2NoXG4gKiBzdWZmaXggZ2l2ZXMgdGhlIHJlLWFybSBhIGZyZXNoIGtleS4gUGVuZGluZyBiYWNrc3RvcHMgYXJlIGJvdW5kZWQgYnkgdGhlXG4gKiBudW1iZXIgb2Ygb3duZXJzaGlwIGVwb2NocywgaS5lLiB0aGUgcXVldWUncyByZWRlbGl2ZXJ5IGJ1ZGdldCBmb3IgdGhlXG4gKiBvd25pbmcgbWVzc2FnZS5cbiAqXG4gKiBUaGUgZXBvY2ggdmFsdWUgY29tZXMgZnJvbSB0aGUgcGVyc2lzdGVkIGV2ZW50J3MgYGNyZWF0ZWRBdGAsIHNvIGV2ZXJ5XG4gKiByZXBsYXllciBkZXJpdmVzIHRoZSBzYW1lIGtleS4gQ2FsbGVycyBvbmx5IGJ1aWxkIGJhY2tzdG9wcyB3aGVuIHRoZVxuICogbGVhc2UgaGFzIHRpbWUgcmVtYWluaW5nLCB3aGljaCByZXF1aXJlcyBgbGFzdFN0YXJ0ZWRBdGAgdG8gYmUgc2V0LlxuICpcbiAqIFRoZSBrZXkgbXVzdCBhbHNvIG5ldmVyIGJlIHRoZSBzdGVwIG1lc3NhZ2UncyBvd24gYGlkZW1wb3RlbmN5S2V5YFxuICogKHRoZSBiYXJlIGNvcnJlbGF0aW9uIElEKTogdGhlIG93bmVyJ3MgcmV0cnkgaGFuZG9mZiBlbnF1ZXVlcyB0aGUgc3RlcFxuICogdW5kZXIgdGhhdCBrZXkgd2l0aCBhIHNob3J0IGJhY2tvZmYsIGFuZCBhIHBlbmRpbmcgYmFja3N0b3Agc2hhcmluZyBpdFxuICogd291bGQgYWJzb3JiIHRoZSByZXRyeSDigJQgdHVybmluZyBhIDFzIGJhY2tvZmYgaW50byBhIGZ1bGwtbGVhc2Ugc3RhbGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiYWNrc3RvcElkZW1wb3RlbmN5S2V5KHN0ZXA6IFN0ZXBJbnZvY2F0aW9uUXVldWVJdGVtKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke3N0ZXAuY29ycmVsYXRpb25JZH06YmFja3N0b3A6JHtzdGVwLmxhc3RTdGFydGVkQXR9YDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGFueSBvZiB0aGUgZ2l2ZW4gcGVuZGluZyBjb3JyZWxhdGlvbiBJRHMgaXMgaW5saW5lLW93bmVkIGJ5XG4gKiBgbWVzc2FnZUlkYCBwZXIgdGhlIHJhdyBldmVudCBsb2c6IGl0cyBMQVRFU1QgYHN0ZXBfc3RhcnRlZGAgY2Fycmllc1xuICogYG93bmVyTWVzc2FnZUlkID09PSBtZXNzYWdlSWRgIGFuZCBubyBgc3RlcF9yZXRyeWluZ2AgZm9sbG93cyBpdC4gVXNlZCBieVxuICogdGhlIGJhY2tncm91bmQtc3RlcCBmYXN0IHBhdGgsIHdoaWNoIHNlZXMgcmF3IGV2ZW50cyAobm90IHRoZSByZXBsYXknc1xuICogcXVldWVJdGVtcyksIHRvIGRlY2lkZSB3aGV0aGVyIHRvIGZhbGwgdGhyb3VnaCB0byB0aGUgbWFpbiBsb29wIHNvIHRoaXNcbiAqIGludm9jYXRpb24gY2FuIHJlY292ZXIgYSBzdGVwIGl0IG93bnMgaW5zdGVhZCBvZiByZXR1cm5pbmcgYW5kIGxlYXZpbmcgaXRcbiAqIHRvIHRoZSBkZWxheWVkIGJhY2tzdG9wLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzUGVuZGluZ1N0ZXBPd25lZEJ5TWVzc2FnZShcbiAgZXZlbnRzOiBFdmVudFtdLFxuICBwZW5kaW5nQ29ycmVsYXRpb25JZHM6IFNldDxzdHJpbmcgfCB1bmRlZmluZWQ+LFxuICBtZXNzYWdlSWQ6IHN0cmluZ1xuKTogYm9vbGVhbiB7XG4gIC8vIExhdGVzdC13aW5zIHNjYW46IGV2ZW50cyBhcmUgaW4gbG9nIG9yZGVyLCBzbyBsYXRlciBlbnRyaWVzIG92ZXJ3cml0ZS5cbiAgLy8gQSBzdGVwX3JldHJ5aW5nIGxhcHNlcyBvd25lcnNoaXAgcGVybWFuZW50bHkgKG1hdGNoaW5nIHRoZSBzYXdSZXRyeWluZ1xuICAvLyBzZW1hbnRpY3Mgb2YgdGhlIHJlcGxheSBjb25zdW1lciBpbiBzdGVwLnRzKSDigJQgZnJvbSB0aGF0IHBvaW50IHRoZSBzdGVwXG4gIC8vIGlzIHF1ZXVlLW93bmVkLCB3aGF0ZXZlciBzdGFydHMgZm9sbG93LlxuICBjb25zdCBsYXRlc3RPd25lciA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XG4gIGNvbnN0IHNhd1JldHJ5aW5nID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgZSBvZiBldmVudHMpIHtcbiAgICBpZiAoZS5jb3JyZWxhdGlvbklkID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGlmIChlLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfc3RhcnRlZCcpIHtcbiAgICAgIGNvbnN0IG93bmVyID1cbiAgICAgICAgJ2V2ZW50RGF0YScgaW4gZSAmJlxuICAgICAgICBlLmV2ZW50RGF0YSAmJlxuICAgICAgICAnb3duZXJNZXNzYWdlSWQnIGluIGUuZXZlbnREYXRhICYmXG4gICAgICAgIHR5cGVvZiBlLmV2ZW50RGF0YS5vd25lck1lc3NhZ2VJZCA9PT0gJ3N0cmluZydcbiAgICAgICAgICA/IGUuZXZlbnREYXRhLm93bmVyTWVzc2FnZUlkXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBsYXRlc3RPd25lci5zZXQoZS5jb3JyZWxhdGlvbklkLCBvd25lcik7XG4gICAgfSBlbHNlIGlmIChlLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfcmV0cnlpbmcnKSB7XG4gICAgICBzYXdSZXRyeWluZy5hZGQoZS5jb3JyZWxhdGlvbklkKTtcbiAgICB9XG4gIH1cbiAgZm9yIChjb25zdCBpZCBvZiBwZW5kaW5nQ29ycmVsYXRpb25JZHMpIHtcbiAgICBpZiAoXG4gICAgICBpZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAhc2F3UmV0cnlpbmcuaGFzKGlkKSAmJlxuICAgICAgbGF0ZXN0T3duZXIuZ2V0KGlkKSA9PT0gbWVzc2FnZUlkXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuIl19
|
|
114
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1vd25lcnNoaXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9zdGVwLW93bmVyc2hpcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVoRTs7Ozs7O0dBTUc7QUFFSDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQUMsSUFBNkI7SUFDakUsT0FBTyxDQUNMLElBQUksQ0FBQyxlQUFlLEtBQUssSUFBSTtRQUM3QixJQUFJLENBQUMsY0FBYyxLQUFLLFNBQVM7UUFDakMsSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJLENBQzFCLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLFVBQVUseUJBQXlCLENBQ3ZDLElBQTZCLEVBQzdCLEtBQWE7SUFFYixJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssU0FBUztRQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQy9DLE1BQU0sWUFBWSxHQUFHLDhCQUE4QixFQUFFLENBQUM7SUFDdEQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsR0FBRyxZQUFZLEdBQUcsSUFBSSxHQUFHLEtBQUssQ0FBQztJQUNyRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1RSxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUFDLElBQTZCO0lBQ2xFLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxhQUFhLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztBQUNoRSxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsNEJBQTRCLENBQzFDLE1BQWUsRUFDZixxQkFBOEMsRUFDOUMsU0FBaUI7SUFFakIseUVBQXlFO0lBQ3pFLHlFQUF5RTtJQUN6RSx5RUFBeUU7SUFDekUsMENBQTBDO0lBQzFDLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxFQUE4QixDQUFDO0lBQzFELE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDdEMsS0FBSyxNQUFNLENBQUMsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsQ0FBQyxhQUFhLEtBQUssU0FBUztZQUFFLFNBQVM7UUFDNUMsSUFBSSxDQUFDLENBQUMsU0FBUyxLQUFLLGNBQWMsRUFBRSxDQUFDO1lBQ25DLE1BQU0sS0FBSyxHQUNULFdBQVcsSUFBSSxDQUFDO2dCQUNoQixDQUFDLENBQUMsU0FBUztnQkFDWCxnQkFBZ0IsSUFBSSxDQUFDLENBQUMsU0FBUztnQkFDL0IsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLGNBQWMsS0FBSyxRQUFRO2dCQUM1QyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxjQUFjO2dCQUM1QixDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ2hCLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMxQyxDQUFDO2FBQU0sSUFBSSxDQUFDLENBQUMsU0FBUyxLQUFLLGVBQWUsRUFBRSxDQUFDO1lBQzNDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ25DLENBQUM7SUFDSCxDQUFDO0lBQ0QsS0FBSyxNQUFNLEVBQUUsSUFBSSxxQkFBcUIsRUFBRSxDQUFDO1FBQ3ZDLElBQ0UsRUFBRSxLQUFLLFNBQVM7WUFDaEIsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNwQixXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLFNBQVMsRUFDakMsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEV2ZW50IH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB0eXBlIHsgU3RlcEludm9jYXRpb25RdWV1ZUl0ZW0gfSBmcm9tICcuLi9nbG9iYWwuanMnO1xuaW1wb3J0IHsgZ2V0SW5saW5lT3duZXJzaGlwTGVhc2VTZWNvbmRzIH0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuXG4vKipcbiAqIElubGluZSBzdGVwIG93bmVyc2hpcCBoZWxwZXJzIGZvciB0aGUgcGVuZGluZy1zdGVwIGRpc3BhdGNoIGRlY2lzaW9uIHRhYmxlXG4gKiBpbiBydW50aW1lLnRzICh3b3JrZmxvdyMyNzgwKS4gT3duZXJzaGlwIHN0YXRlIGl0c2VsZiBpcyBkZXJpdmVkIHBlci1yZXBsYXlcbiAqIGZyb20gdGhlIGV2ZW50IGxvZyBieSB0aGUgc3RlcCBjb25zdW1lciBpbiBzdGVwLnRzIGFuZCBzdXJmYWNlZCBvblxuICogU3RlcEludm9jYXRpb25RdWV1ZUl0ZW07IHRoZXNlIGZ1bmN0aW9ucyBpbnRlcnByZXQgdGhhdCBzdGF0ZSBhdCBkaXNwYXRjaFxuICogdGltZS5cbiAqL1xuXG4vKipcbiAqIFdoZXRoZXIgaW5saW5lIHN0ZXAgb3duZXJzaGlwIGlzIGFjdGl2ZSBmb3IgYSBwZW5kaW5nIHN0ZXA6IGNyZWF0ZWQsXG4gKiBsYXRlc3QgYHN0ZXBfc3RhcnRlZGAgY2FycmllcyBhbiBvd25lciBzdGFtcCwgYW5kIG5vIGBzdGVwX3JldHJ5aW5nYCBoYXNcbiAqIGJlZW4gb2JzZXJ2ZWQgKGZyb20gYHN0ZXBfcmV0cnlpbmdgIG9uLCB0aGUgc3RlcCBpcyBxdWV1ZS1vd25lZCBieSBpdHNcbiAqIGRlbGF5ZWQgcmV0cnkgaGFuZG9mZiAvIHJlcGxheSByZXF1ZXVlLCBzbyBvd25lcnNoaXAgaXMgcGVybWFuZW50bHlcbiAqIGxhcHNlZCBmb3IgdGhlIGNvcnJlbGF0aW9uIElEKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3RlcE93bmVyc2hpcEFjdGl2ZShzdGVwOiBTdGVwSW52b2NhdGlvblF1ZXVlSXRlbSk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIHN0ZXAuaGFzQ3JlYXRlZEV2ZW50ID09PSB0cnVlICYmXG4gICAgc3RlcC5vd25lck1lc3NhZ2VJZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgc3RlcC5zYXdSZXRyeWluZyAhPT0gdHJ1ZVxuICApO1xufVxuXG4vKipcbiAqIFNlY29uZHMgbGVmdCBvbiBhbiBvd25lZCBzdGVwJ3MgbGl2ZW5lc3MgbGVhc2UsIGFuY2hvcmVkIGF0IGl0cyBsYXRlc3RcbiAqIGBzdGVwX3N0YXJ0ZWRgLiAwIG1lYW5zIHRoZSBsZWFzZSBoYXMgZXhwaXJlZCAob3IgdGhlIHN0YXJ0IHRpbWVzdGFtcCBpc1xuICogbWlzc2luZywgdGhlIGRlZ3JhZGVkIG1vZGUgZm9yIHdvcmxkcyB3aG9zZSBldmVudHMgbGFjayB1c2FibGVcbiAqIHRpbWVzdGFtcHMpLCBpbiB3aGljaCBjYXNlIGRpc3BhdGNoIGZhbGxzIGJhY2sgdG8gdGhlIGltbWVkaWF0ZSBlbnF1ZXVlLlxuICpcbiAqIFRoZSByZXN1bHQgaXMgY2xhbXBlZCB0byB0aGUgY29uZmlndXJlZCBsZWFzZTogYGxhc3RTdGFydGVkQXRgIGlzIHRoZVxuICogc2VydmVyLXN0YW1wZWQgZXZlbnQgYGNyZWF0ZWRBdGAgd2hpbGUgYG5vd01zYCBpcyB0aGUgbG9jYWwgY2xvY2ssIHNvIGFcbiAqIGNsaWVudCBydW5uaW5nIGJlaGluZCB0aGUgc2VydmVyIHdvdWxkIG90aGVyd2lzZSBjb21wdXRlIGEgcmVtYWluZGVyXG4gKiBMT05HRVIgdGhhbiB0aGUgbGVhc2UgaXRzZWxmLCBhbmQgd2l0aCB0aGUgbGVhc2UgdHVuZWQgdG8gdGhlIDkwMHMgY2FwLFxuICogYSBgZGVsYXlTZWNvbmRzYCBhYm92ZSB0aGUgcXVldWUncyBwZXItbWVzc2FnZSBtYXhpbXVtLCB3aGljaCBTUVMtYmFja2VkXG4gKiB3b3JsZHMgcmVqZWN0IG91dHJpZ2h0ICh0aGUgd2FrZSByZXBsYXkncyBlbnF1ZXVlIHdvdWxkIHRocm93IGFuZCByaWRlXG4gKiB0aGUgcmVkZWxpdmVyeSBsb29wKS4gVGhlIGNsYW1wIG1ha2VzIHNrZXcgc3RyaWN0bHkgaGFybWxlc3M7IHJlbWFpbmluZ1xuICogdGltZSBjYW4gbmV2ZXIgbGVnaXRpbWF0ZWx5IGV4Y2VlZCB0aGUgZnVsbCBsZWFzZSBhbnl3YXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGVwTGVhc2VSZW1haW5pbmdTZWNvbmRzKFxuICBzdGVwOiBTdGVwSW52b2NhdGlvblF1ZXVlSXRlbSxcbiAgbm93TXM6IG51bWJlclxuKTogbnVtYmVyIHtcbiAgaWYgKHN0ZXAubGFzdFN0YXJ0ZWRBdCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gMDtcbiAgY29uc3QgbGVhc2VTZWNvbmRzID0gZ2V0SW5saW5lT3duZXJzaGlwTGVhc2VTZWNvbmRzKCk7XG4gIGNvbnN0IHJlbWFpbmluZ01zID0gc3RlcC5sYXN0U3RhcnRlZEF0ICsgbGVhc2VTZWNvbmRzICogMTAwMCAtIG5vd01zO1xuICByZXR1cm4gTWF0aC5taW4obGVhc2VTZWNvbmRzLCBNYXRoLm1heCgwLCBNYXRoLmNlaWwocmVtYWluaW5nTXMgLyAxMDAwKSkpO1xufVxuXG4vKipcbiAqIElkZW1wb3RlbmN5IGtleSBmb3IgdGhlIGRlbGF5ZWQgYmFja3N0b3Agd2FrZSBvZiBhbiBpbmxpbmUtb3duZWQgc3RlcC5cbiAqXG4gKiBUaGUga2V5IGlzIHNjb3BlZCB0byB0aGUgY3VycmVudCBPV05FUlNISVAgRVBPQ0ggKHRoZSB0aW1lc3RhbXAgb2YgdGhlXG4gKiBsYXRlc3QgYHN0ZXBfc3RhcnRlZGApLCBub3QganVzdCB0aGUgY29ycmVsYXRpb24gSUQuIFdpdGhpbiBvbmUgZXBvY2gsXG4gKiBldmVyeSB3YWtlIHJlcGxheSBkZXJpdmVzIHRoZSBzYW1lIGtleSwgc28gZmFuLW91dCBzdGF5cyBjYXBwZWQgYXQgb25lXG4gKiBwZW5kaW5nIGJhY2tzdG9wIHBlciBzdGVwLiBCdXQgd2hlbiBvd25lciByZWNvdmVyeSByZS1zdGFtcHMgdGhlIHN0ZXBcbiAqIChxdWV1ZSByZWRlbGl2ZXJ5IG9mIHRoZSBvd25pbmcgbWVzc2FnZSDihpIgbmV3IGBzdGVwX3N0YXJ0ZWRgIOKGkiBuZXdcbiAqIGBsYXN0U3RhcnRlZEF0YCksIHRoZSBrZXkgQ0hBTkdFUy4gVGhpcyBpcyBsb2FkLWJlYXJpbmcgZm9yIGxpdmVuZXNzOlxuICogcXVldWVzIGRlZHVwZSBhbiBpZGVtcG90ZW5jeSBrZXkgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgb3JpZ2luYWxcbiAqIG1lc3NhZ2UgKGluY2x1ZGluZyB3aGlsZSBhIGRlbGl2ZXJ5IG9mIGl0IGlzIGluIGZsaWdodCksIHNvIGEgYmFja3N0b3BcbiAqIHRoYXQgZmlyZXMgZHVyaW5nIGEgcmVmcmVzaGVkIGxlYXNlIGFuZCB0cmllcyB0byByZS1hcm0gdW5kZXIgYSBmaXhlZCBrZXlcbiAqIHdvdWxkIGRlZHVwZSBhZ2FpbnN0IElUU0VMRiBhbmQgYmUgZHJvcHBlZCwgbGVhdmluZyBubyBlc2NhcGUgaGF0Y2ggaWZcbiAqIHRoZSByZWNvdmVyZWQgb3duZXIgbGF0ZXIgZGllcyB3aXRob3V0IGZ1cnRoZXIgcmVkZWxpdmVyaWVzLiBUaGUgZXBvY2hcbiAqIHN1ZmZpeCBnaXZlcyB0aGUgcmUtYXJtIGEgZnJlc2gga2V5LiBQZW5kaW5nIGJhY2tzdG9wcyBhcmUgYm91bmRlZCBieSB0aGVcbiAqIG51bWJlciBvZiBvd25lcnNoaXAgZXBvY2hzLCBpLmUuIHRoZSBxdWV1ZSdzIHJlZGVsaXZlcnkgYnVkZ2V0IGZvciB0aGVcbiAqIG93bmluZyBtZXNzYWdlLlxuICpcbiAqIFRoZSBlcG9jaCB2YWx1ZSBjb21lcyBmcm9tIHRoZSBwZXJzaXN0ZWQgZXZlbnQncyBgY3JlYXRlZEF0YCwgc28gZXZlcnlcbiAqIHJlcGxheWVyIGRlcml2ZXMgdGhlIHNhbWUga2V5LiBDYWxsZXJzIG9ubHkgYnVpbGQgYmFja3N0b3BzIHdoZW4gdGhlXG4gKiBsZWFzZSBoYXMgdGltZSByZW1haW5pbmcsIHdoaWNoIHJlcXVpcmVzIGBsYXN0U3RhcnRlZEF0YCB0byBiZSBzZXQuXG4gKlxuICogVGhlIGtleSBtdXN0IGFsc28gbmV2ZXIgYmUgdGhlIHN0ZXAgbWVzc2FnZSdzIG93biBgaWRlbXBvdGVuY3lLZXlgXG4gKiAodGhlIGJhcmUgY29ycmVsYXRpb24gSUQpOiB0aGUgb3duZXIncyByZXRyeSBoYW5kb2ZmIGVucXVldWVzIHRoZSBzdGVwXG4gKiB1bmRlciB0aGF0IGtleSB3aXRoIGEgc2hvcnQgYmFja29mZiwgYW5kIGEgcGVuZGluZyBiYWNrc3RvcCBzaGFyaW5nIGl0XG4gKiB3b3VsZCBhYnNvcmIgdGhlIHJldHJ5LCB0dXJuaW5nIGEgMXMgYmFja29mZiBpbnRvIGEgZnVsbC1sZWFzZSBzdGFsbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJhY2tzdG9wSWRlbXBvdGVuY3lLZXkoc3RlcDogU3RlcEludm9jYXRpb25RdWV1ZUl0ZW0pOiBzdHJpbmcge1xuICByZXR1cm4gYCR7c3RlcC5jb3JyZWxhdGlvbklkfTpiYWNrc3RvcDoke3N0ZXAubGFzdFN0YXJ0ZWRBdH1gO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYW55IG9mIHRoZSBnaXZlbiBwZW5kaW5nIGNvcnJlbGF0aW9uIElEcyBpcyBpbmxpbmUtb3duZWQgYnlcbiAqIGBtZXNzYWdlSWRgIHBlciB0aGUgcmF3IGV2ZW50IGxvZzogaXRzIExBVEVTVCBgc3RlcF9zdGFydGVkYCBjYXJyaWVzXG4gKiBgb3duZXJNZXNzYWdlSWQgPT09IG1lc3NhZ2VJZGAgYW5kIG5vIGBzdGVwX3JldHJ5aW5nYCBmb2xsb3dzIGl0LiBVc2VkIGJ5XG4gKiB0aGUgYmFja2dyb3VuZC1zdGVwIGZhc3QgcGF0aCwgd2hpY2ggc2VlcyByYXcgZXZlbnRzIChub3QgdGhlIHJlcGxheSdzXG4gKiBxdWV1ZUl0ZW1zKSwgdG8gZGVjaWRlIHdoZXRoZXIgdG8gZmFsbCB0aHJvdWdoIHRvIHRoZSBtYWluIGxvb3Agc28gdGhpc1xuICogaW52b2NhdGlvbiBjYW4gcmVjb3ZlciBhIHN0ZXAgaXQgb3ducyBpbnN0ZWFkIG9mIHJldHVybmluZyBhbmQgbGVhdmluZyBpdFxuICogdG8gdGhlIGRlbGF5ZWQgYmFja3N0b3AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNQZW5kaW5nU3RlcE93bmVkQnlNZXNzYWdlKFxuICBldmVudHM6IEV2ZW50W10sXG4gIHBlbmRpbmdDb3JyZWxhdGlvbklkczogU2V0PHN0cmluZyB8IHVuZGVmaW5lZD4sXG4gIG1lc3NhZ2VJZDogc3RyaW5nXG4pOiBib29sZWFuIHtcbiAgLy8gTGF0ZXN0LXdpbnMgc2NhbjogZXZlbnRzIGFyZSBpbiBsb2cgb3JkZXIsIHNvIGxhdGVyIGVudHJpZXMgb3ZlcndyaXRlLlxuICAvLyBBIHN0ZXBfcmV0cnlpbmcgbGFwc2VzIG93bmVyc2hpcCBwZXJtYW5lbnRseSAobWF0Y2hpbmcgdGhlIHNhd1JldHJ5aW5nXG4gIC8vIHNlbWFudGljcyBvZiB0aGUgcmVwbGF5IGNvbnN1bWVyIGluIHN0ZXAudHMpOiBmcm9tIHRoYXQgcG9pbnQgdGhlIHN0ZXBcbiAgLy8gaXMgcXVldWUtb3duZWQsIHdoYXRldmVyIHN0YXJ0cyBmb2xsb3cuXG4gIGNvbnN0IGxhdGVzdE93bmVyID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcbiAgY29uc3Qgc2F3UmV0cnlpbmcgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBlIG9mIGV2ZW50cykge1xuICAgIGlmIChlLmNvcnJlbGF0aW9uSWQgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgaWYgKGUuZXZlbnRUeXBlID09PSAnc3RlcF9zdGFydGVkJykge1xuICAgICAgY29uc3Qgb3duZXIgPVxuICAgICAgICAnZXZlbnREYXRhJyBpbiBlICYmXG4gICAgICAgIGUuZXZlbnREYXRhICYmXG4gICAgICAgICdvd25lck1lc3NhZ2VJZCcgaW4gZS5ldmVudERhdGEgJiZcbiAgICAgICAgdHlwZW9mIGUuZXZlbnREYXRhLm93bmVyTWVzc2FnZUlkID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8gZS5ldmVudERhdGEub3duZXJNZXNzYWdlSWRcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGxhdGVzdE93bmVyLnNldChlLmNvcnJlbGF0aW9uSWQsIG93bmVyKTtcbiAgICB9IGVsc2UgaWYgKGUuZXZlbnRUeXBlID09PSAnc3RlcF9yZXRyeWluZycpIHtcbiAgICAgIHNhd1JldHJ5aW5nLmFkZChlLmNvcnJlbGF0aW9uSWQpO1xuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IGlkIG9mIHBlbmRpbmdDb3JyZWxhdGlvbklkcykge1xuICAgIGlmIChcbiAgICAgIGlkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICFzYXdSZXRyeWluZy5oYXMoaWQpICYmXG4gICAgICBsYXRlc3RPd25lci5nZXQoaWQpID09PSBtZXNzYWdlSWRcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG4iXX0=
|
|
@@ -4,7 +4,7 @@ import type { StepExecutionResult } from './step-executor.js';
|
|
|
4
4
|
* already in flight in this process. The winner's result is returned to the
|
|
5
5
|
* winner; a loser awaits the winner's settlement (success OR failure) and
|
|
6
6
|
* then returns `{ type: 'skipped' }` so its caller acks without running the
|
|
7
|
-
* body. A winner failure is not propagated to the loser
|
|
7
|
+
* body. A winner failure is not propagated to the loser: the winner's own
|
|
8
8
|
* queue message redelivers and drives the retry, so exactly one message
|
|
9
9
|
* keeps owning the outcome.
|
|
10
10
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"step-single-flight.d.ts","sourceRoot":"","sources":["../../src/runtime/step-single-flight.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"step-single-flight.d.ts","sourceRoot":"","sources":["../../src/runtime/step-single-flight.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAyC9D;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,OAAO,CAAC,mBAAmB,CAAC,GAC1C,OAAO,CAAC,mBAAmB,CAAC,CA8B9B"}
|