@workflow/core 5.0.0-beta.34 → 5.0.0-beta.35
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/runtime/helpers.d.ts +55 -0
- package/dist/runtime/helpers.d.ts.map +1 -1
- package/dist/runtime/helpers.js +86 -3
- package/dist/runtime/run-id-time.d.ts +9 -0
- package/dist/runtime/run-id-time.d.ts.map +1 -1
- package/dist/runtime/run-id-time.js +15 -4
- package/dist/runtime/start.d.ts.map +1 -1
- package/dist/runtime/start.js +38 -8
- package/dist/runtime/step-executor.d.ts +2 -0
- package/dist/runtime/step-executor.d.ts.map +1 -1
- package/dist/runtime/step-executor.js +65 -16
- package/dist/runtime/step-latency.d.ts +70 -4
- package/dist/runtime/step-latency.d.ts.map +1 -1
- package/dist/runtime/step-latency.js +59 -7
- package/dist/runtime/suspension-handler.d.ts +10 -1
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +21 -9
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +124 -10
- package/dist/step/context-storage.d.ts +6 -0
- package/dist/step/context-storage.d.ts.map +1 -1
- package/dist/step/context-storage.js +1 -1
- package/dist/telemetry/semantic-conventions.d.ts +25 -0
- package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
- package/dist/telemetry/semantic-conventions.js +22 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/docs/how-it-works/framework-integrations.mdx +1 -1
- package/package.json +5 -5
|
@@ -1,13 +1,21 @@
|
|
|
1
1
|
import type { Event } from '@workflow/world';
|
|
2
2
|
/**
|
|
3
|
-
* Client-side latency measurement (TTFS / STSO) threaded from the
|
|
3
|
+
* Client-side latency measurement (TTFS / STSO / RSFS) threaded from the
|
|
4
4
|
* orchestrator's inline execution path into `executeStep`.
|
|
5
5
|
*
|
|
6
6
|
* TTFS (time-to-first-step) measures run creation → the first step's body
|
|
7
7
|
* beginning to execute. STSO (step-to-step overhead) measures the previous
|
|
8
|
-
* step's terminal event → the next step's body beginning to execute.
|
|
9
|
-
*
|
|
10
|
-
*
|
|
8
|
+
* step's terminal event → the next step's body beginning to execute. RSFS
|
|
9
|
+
* (run-started-to-first-step) measures the `run_started` response landing →
|
|
10
|
+
* the first step's start POST being issued — a sub-window of TTFS that
|
|
11
|
+
* isolates replay overhead from the run-creation queue hop; `finalSchedulingReplay`
|
|
12
|
+
* is the synchronous workflow-function-execution duration of only the FINAL
|
|
13
|
+
* replay pass within that window (the pass that reached and scheduled the
|
|
14
|
+
* first step) — it is NOT accumulated across earlier pre-first-step passes
|
|
15
|
+
* (see {@link StepLatencyTracking.replayMs}), so it must not be read as "the
|
|
16
|
+
* replay portion of RSFS". All are attached to the step's terminal
|
|
17
|
+
* event so a backend can emit latency metrics from the event write alone,
|
|
18
|
+
* without extra event-log queries.
|
|
11
19
|
*
|
|
12
20
|
* Eligibility is decided by the orchestrator (which owns the event log) via
|
|
13
21
|
* {@link computeStepLatencyTracking}; the final values are computed by
|
|
@@ -49,6 +57,36 @@ export interface StepLatencyTracking {
|
|
|
49
57
|
stepCount?: number;
|
|
50
58
|
/** Number of events already in the event log. */
|
|
51
59
|
eventCount?: number;
|
|
60
|
+
/**
|
|
61
|
+
* Epoch ms the `run_started` response was received/parsed by the SDK.
|
|
62
|
+
* Present only when the step qualifies for RSFS — the same eligibility as
|
|
63
|
+
* TTFS (see {@link computeStepLatencyTracking}), plus a recoverable
|
|
64
|
+
* anchor. In turbo mode, `run_started` is backgrounded rather than
|
|
65
|
+
* awaited, so this is stamped at the point the runtime synthesizes the
|
|
66
|
+
* run locally and begins replay instead of at the real response; the
|
|
67
|
+
* first step's start POST is still chained on the real `run_started`
|
|
68
|
+
* promise (see step-executor.ts), so RSFS still ends up measuring the
|
|
69
|
+
* genuine run_started-to-first-step-POST stretch even though the two
|
|
70
|
+
* halves overlap under turbo.
|
|
71
|
+
*/
|
|
72
|
+
rsfsAnchorMs?: number;
|
|
73
|
+
/**
|
|
74
|
+
* Wall-clock ms this invocation's synchronous workflow-function replay
|
|
75
|
+
* took: from calling `runWorkflow` to it throwing the suspension that
|
|
76
|
+
* scheduled this batch. Excludes awaited network I/O (the suspension's
|
|
77
|
+
* event commits, the step's own start POST). Present only alongside
|
|
78
|
+
* `rsfsAnchorMs`.
|
|
79
|
+
*
|
|
80
|
+
* This is the FINAL replay pass only — the invocation that reached and
|
|
81
|
+
* scheduled the first step. Valid RSFS paths can replay more than once
|
|
82
|
+
* before the first step (e.g. a workflow-body `setAttributes()` detour
|
|
83
|
+
* replays twice), and a redelivery omits earlier invocations' replay work
|
|
84
|
+
* entirely; this value is not accumulated across those earlier passes.
|
|
85
|
+
* Do not read it as "the replay portion of RSFS" — RSFS
|
|
86
|
+
* ({@link rsfsAnchorMs}) covers the whole run_started-to-first-step
|
|
87
|
+
* window, this covers only the last pass.
|
|
88
|
+
*/
|
|
89
|
+
replayMs?: number;
|
|
52
90
|
/** Whether turbo mode is active for this invocation. */
|
|
53
91
|
turbo: boolean;
|
|
54
92
|
}
|
|
@@ -58,6 +96,15 @@ export interface StepLatencyEventData {
|
|
|
58
96
|
stso?: number;
|
|
59
97
|
stepCount?: number;
|
|
60
98
|
eventCount?: number;
|
|
99
|
+
/** Client-measured run_started → first step's start POST, ms. */
|
|
100
|
+
rsfs?: number;
|
|
101
|
+
/**
|
|
102
|
+
* Client-measured wall-clock ms of the FINAL replay pass that scheduled
|
|
103
|
+
* the first step (see {@link StepLatencyTracking.replayMs}) — not
|
|
104
|
+
* accumulated across earlier pre-first-step passes, so it must not be
|
|
105
|
+
* read as "the replay portion of `rsfs`".
|
|
106
|
+
*/
|
|
107
|
+
finalSchedulingReplay?: number;
|
|
61
108
|
optimizations?: string[];
|
|
62
109
|
}
|
|
63
110
|
/**
|
|
@@ -82,6 +129,19 @@ export declare function computeStepLatencyTracking(params: {
|
|
|
82
129
|
invocationStartedClean: boolean;
|
|
83
130
|
/** Epoch ms of run creation, if recoverable. Absent disqualifies TTFS. */
|
|
84
131
|
runCreatedAtMs: number | undefined;
|
|
132
|
+
/**
|
|
133
|
+
* Epoch ms the `run_started` response was received/parsed by the SDK (or,
|
|
134
|
+
* under turbo, the instant the run was synthesized locally — see
|
|
135
|
+
* {@link StepLatencyTracking.rsfsAnchorMs}). Absent disqualifies RSFS.
|
|
136
|
+
*/
|
|
137
|
+
runStartedReceivedAtMs: number | undefined;
|
|
138
|
+
/**
|
|
139
|
+
* Wall-clock ms this suspension's `runWorkflow` call spent executing
|
|
140
|
+
* synchronously before throwing — the FINAL replay pass only, not
|
|
141
|
+
* accumulated across earlier passes. See
|
|
142
|
+
* {@link StepLatencyTracking.replayMs}.
|
|
143
|
+
*/
|
|
144
|
+
replayMs: number;
|
|
85
145
|
/** See {@link StepLatencyTracking.preStepBlockingMs}. */
|
|
86
146
|
preStepBlockingMs: number;
|
|
87
147
|
/**
|
|
@@ -122,6 +182,12 @@ export declare function computeStepLatencyEventData(params: {
|
|
|
122
182
|
tracking: StepLatencyTracking | undefined;
|
|
123
183
|
/** `Date.now()` taken immediately before user step code began executing. */
|
|
124
184
|
stepCodeStartedAtMs: number;
|
|
185
|
+
/**
|
|
186
|
+
* `Date.now()` taken immediately before the first step's start POST
|
|
187
|
+
* (`step_started`) was issued. Present only for the lazy inline steps RSFS
|
|
188
|
+
* cares about; see the call sites in step-executor.ts.
|
|
189
|
+
*/
|
|
190
|
+
stepStartPostSentAtMs: number | undefined;
|
|
125
191
|
attempt: number;
|
|
126
192
|
/** Whether this step was started lazily (no separate step_created write). */
|
|
127
193
|
lazyStepStart: boolean;
|
|
@@ -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
|
|
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;CAC1B,GAAG,oBAAoB,GAAG,SAAS,CAoFnC"}
|
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Most negative raw duration still attributed to cross-machine clock skew
|
|
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
|
+
* systematically corrupt anchor would otherwise report an exact-zero latency
|
|
6
|
+
* on every sample, silently dragging entire percentile distributions to 0
|
|
7
|
+
* rather than surfacing as missing data.
|
|
8
|
+
*/
|
|
9
|
+
const MAX_CLOCK_SKEW_MS = 60_000;
|
|
1
10
|
/**
|
|
2
11
|
* Event types that disqualify TTFS when present in the event log at the time
|
|
3
12
|
* the run's first step batch is scheduled:
|
|
@@ -80,6 +89,9 @@ export function computeStepLatencyTracking(params) {
|
|
|
80
89
|
stepCount = terminalStepIds.size;
|
|
81
90
|
eventCount = events.length;
|
|
82
91
|
}
|
|
92
|
+
// RSFS shares TTFS's eligibility exactly (same event-log/wait checks),
|
|
93
|
+
// plus its own anchor being recoverable.
|
|
94
|
+
const rsfsEligible = ttfsEligible && params.runStartedReceivedAtMs !== undefined;
|
|
83
95
|
if (!ttfsEligible && prevStepEndMs === undefined) {
|
|
84
96
|
return undefined;
|
|
85
97
|
}
|
|
@@ -95,6 +107,12 @@ export function computeStepLatencyTracking(params) {
|
|
|
95
107
|
...(preStepAttrStartMs !== undefined ? { preStepAttrStartMs } : {}),
|
|
96
108
|
}
|
|
97
109
|
: {}),
|
|
110
|
+
...(rsfsEligible
|
|
111
|
+
? {
|
|
112
|
+
rsfsAnchorMs: params.runStartedReceivedAtMs,
|
|
113
|
+
replayMs: params.replayMs,
|
|
114
|
+
}
|
|
115
|
+
: {}),
|
|
98
116
|
...(prevStepEndMs !== undefined
|
|
99
117
|
? { prevStepEndMs, stepCount, eventCount }
|
|
100
118
|
: {}),
|
|
@@ -113,8 +131,11 @@ export function computeStepLatencyEventData(params) {
|
|
|
113
131
|
if (!tracking || params.attempt !== 1) {
|
|
114
132
|
return undefined;
|
|
115
133
|
}
|
|
116
|
-
//
|
|
117
|
-
// clock, so
|
|
134
|
+
// Small negative durations clamp to 0: cross-invocation timestamps can
|
|
135
|
+
// come from another machine's clock, so bounded skew must not produce
|
|
136
|
+
// negative values. Durations more negative than MAX_CLOCK_SKEW_MS are not
|
|
137
|
+
// skew but a corrupt anchor, and the sample is dropped (see the constant's
|
|
138
|
+
// doc comment).
|
|
118
139
|
//
|
|
119
140
|
// A pre-step setAttributes detour ends the measurement at the first attr
|
|
120
141
|
// write instead of the step's code start — the remainder is the duration
|
|
@@ -124,11 +145,40 @@ export function computeStepLatencyEventData(params) {
|
|
|
124
145
|
// BEFORE the attr write — hook writes after the window closed are excluded
|
|
125
146
|
// by computeStepLatencyTracking (see preStepBlockingBeforeAttrMs).
|
|
126
147
|
const ttfsEndMs = tracking.preStepAttrStartMs ?? params.stepCodeStartedAtMs;
|
|
127
|
-
const
|
|
128
|
-
?
|
|
148
|
+
const rawTtfs = tracking.ttfsAnchorMs !== undefined
|
|
149
|
+
? ttfsEndMs - tracking.ttfsAnchorMs - (tracking.preStepBlockingMs ?? 0)
|
|
150
|
+
: undefined;
|
|
151
|
+
const ttfs = rawTtfs !== undefined && rawTtfs >= -MAX_CLOCK_SKEW_MS
|
|
152
|
+
? Math.max(0, rawTtfs)
|
|
153
|
+
: undefined;
|
|
154
|
+
const rawStso = tracking.prevStepEndMs !== undefined
|
|
155
|
+
? params.stepCodeStartedAtMs - tracking.prevStepEndMs
|
|
156
|
+
: undefined;
|
|
157
|
+
const stso = rawStso !== undefined && rawStso >= -MAX_CLOCK_SKEW_MS
|
|
158
|
+
? Math.max(0, rawStso)
|
|
159
|
+
: undefined;
|
|
160
|
+
// RSFS ends at the actual start-POST instant, not at ttfsEndMs — unlike
|
|
161
|
+
// TTFS it is not subject to the pre-step attr-write shortcut, so a
|
|
162
|
+
// pre-step setAttributes detour (rare) makes RSFS include the detour
|
|
163
|
+
// while TTFS excludes it. `finalSchedulingReplay` is a direct passthrough
|
|
164
|
+
// of `tracking.replayMs` — the FINAL replay pass only (see
|
|
165
|
+
// StepLatencyTracking.replayMs) — so no further subtraction applies, but
|
|
166
|
+
// it also means it is NOT accumulated across any earlier pre-first-step
|
|
167
|
+
// passes (e.g. a setAttributes detour) and must not be read as "the
|
|
168
|
+
// replay portion of rsfs"; rsfs covers the whole window.
|
|
169
|
+
//
|
|
170
|
+
// finalSchedulingReplay duplicates what OTEL already captures on the run/invocation
|
|
171
|
+
// span, but is deliberately collected as client telemetry so the server
|
|
172
|
+
// can emit it as an UNSAMPLED, full-population metric: workflow-server's
|
|
173
|
+
// server spans are heavily sampled in production (~7%), and client spans
|
|
174
|
+
// can't be filtered by SDK version, so neither can serve as the
|
|
175
|
+
// dashboard's exact TTFS decomposition.
|
|
176
|
+
const rsfs = tracking.rsfsAnchorMs !== undefined &&
|
|
177
|
+
params.stepStartPostSentAtMs !== undefined
|
|
178
|
+
? Math.max(0, params.stepStartPostSentAtMs - tracking.rsfsAnchorMs)
|
|
129
179
|
: undefined;
|
|
130
|
-
const
|
|
131
|
-
? Math.max(0,
|
|
180
|
+
const finalSchedulingReplay = tracking.replayMs !== undefined
|
|
181
|
+
? Math.max(0, tracking.replayMs)
|
|
132
182
|
: undefined;
|
|
133
183
|
if (ttfs === undefined && stso === undefined) {
|
|
134
184
|
return undefined;
|
|
@@ -149,7 +199,9 @@ export function computeStepLatencyEventData(params) {
|
|
|
149
199
|
...(stso !== undefined && tracking.eventCount !== undefined
|
|
150
200
|
? { eventCount: tracking.eventCount }
|
|
151
201
|
: {}),
|
|
202
|
+
...(rsfs !== undefined ? { rsfs } : {}),
|
|
203
|
+
...(finalSchedulingReplay !== undefined ? { finalSchedulingReplay } : {}),
|
|
152
204
|
optimizations,
|
|
153
205
|
};
|
|
154
206
|
}
|
|
155
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1sYXRlbmN5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvc3RlcC1sYXRlbmN5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWlFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFBTSw4QkFBOEIsR0FBb0MsSUFBSSxHQUFHLENBQzdFO0lBQ0UsY0FBYztJQUNkLGNBQWM7SUFDZCxnQkFBZ0I7SUFDaEIsYUFBYTtJQUNiLGVBQWU7SUFDZixlQUFlO0lBQ2YsY0FBYztJQUNkLGdCQUFnQjtDQUNqQixDQUNGLENBQUM7QUFFRjs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsMEJBQTBCLENBQUMsTUEyQzFDO0lBQ0MsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQztJQUUxQixJQUFJLFlBQVksR0FDZCxNQUFNLENBQUMsc0JBQXNCO1FBQzdCLE1BQU0sQ0FBQyxjQUFjLEtBQUssU0FBUztRQUNuQyxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQztJQUM3QixJQUFJLGtCQUFzQyxDQUFDO0lBQzNDLElBQUksWUFBWSxFQUFFLENBQUM7UUFDakIsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUMzQixJQUFJLDhCQUE4QixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDeEQsWUFBWSxHQUFHLEtBQUssQ0FBQztnQkFDckIsTUFBTTtZQUNSLENBQUM7WUFDRCxJQUFJLEtBQUssQ0FBQyxTQUFTLEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQ25DLE1BQU0sV0FBVyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDM0Qsa0JBQWtCO29CQUNoQixrQkFBa0IsS0FBSyxTQUFTO3dCQUM5QixDQUFDLENBQUMsV0FBVzt3QkFDYixDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcs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O1lBQ3hELENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsU0FBUyxFQUFFO1lBQ25DLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDUCxHQUFHLENBQUMsSUFBSSxLQUFLLFNBQVMsSUFBSSxRQUFRLENBQUMsVUFBVSxLQUFLLFNBQVM7WUFDekQsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVLEVBQUU7WUFDckMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNQLGFBQWE7S0FDZCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRXZlbnQgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuXG4vKipcbiAqIENsaWVudC1zaWRlIGxhdGVuY3kgbWVhc3VyZW1lbnQgKFRURlMgLyBTVFNPKSB0aHJlYWRlZCBmcm9tIHRoZVxuICogb3JjaGVzdHJhdG9yJ3MgaW5saW5lIGV4ZWN1dGlvbiBwYXRoIGludG8gYGV4ZWN1dGVTdGVwYC5cbiAqXG4gKiBUVEZTICh0aW1lLXRvLWZpcnN0LXN0ZXApIG1lYXN1cmVzIHJ1biBjcmVhdGlvbiDihpIgdGhlIGZpcnN0IHN0ZXAncyBib2R5XG4gKiBiZWdpbm5pbmcgdG8gZXhlY3V0ZS4gU1RTTyAoc3RlcC10by1zdGVwIG92ZXJoZWFkKSBtZWFzdXJlcyB0aGUgcHJldmlvdXNcbiAqIHN0ZXAncyB0ZXJtaW5hbCBldmVudCDihpIgdGhlIG5leHQgc3RlcCdzIGJvZHkgYmVnaW5uaW5nIHRvIGV4ZWN1dGUuIEJvdGggYXJlXG4gKiBhdHRhY2hlZCB0byB0aGUgc3RlcCdzIHRlcm1pbmFsIGV2ZW50IHNvIGEgYmFja2VuZCBjYW4gZW1pdCBsYXRlbmN5IG1ldHJpY3NcbiAqIGZyb20gdGhlIGV2ZW50IHdyaXRlIGFsb25lLCB3aXRob3V0IGV4dHJhIGV2ZW50LWxvZyBxdWVyaWVzLlxuICpcbiAqIEVsaWdpYmlsaXR5IGlzIGRlY2lkZWQgYnkgdGhlIG9yY2hlc3RyYXRvciAod2hpY2ggb3ducyB0aGUgZXZlbnQgbG9nKSB2aWFcbiAqIHtAbGluayBjb21wdXRlU3RlcExhdGVuY3lUcmFja2luZ307IHRoZSBmaW5hbCB2YWx1ZXMgYXJlIGNvbXB1dGVkIGJ5XG4gKiBgZXhlY3V0ZVN0ZXBgIHJpZ2h0IGJlZm9yZSB1c2VyIGNvZGUgcnVucyB2aWFcbiAqIHtAbGluayBjb21wdXRlU3RlcExhdGVuY3lFdmVudERhdGF9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0ZXBMYXRlbmN5VHJhY2tpbmcge1xuICAvKipcbiAgICogRXBvY2ggbXMgb2YgcnVuIGNyZWF0aW9uIChmcm9tIHRoZSBydW4taWQgVUxJRCwgZmFsbGluZyBiYWNrIHRvIHRoZSBydW5cbiAgICogc25hcHNob3QncyBgY3JlYXRlZEF0YCkuIFByZXNlbnQgb25seSB3aGVuIHRoZSBzdGVwIHF1YWxpZmllcyBmb3IgVFRGUy5cbiAgICovXG4gIHR0ZnNBbmNob3JNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFdhbGwtY2xvY2sgbXMgdGhpcyBpbnZvY2F0aW9uIHNwZW50IGNvbW1pdHRpbmcgYGhvb2tfY3JlYXRlZGAgZXZlbnRzXG4gICAqIGJlZm9yZSB0aGUgZmlyc3Qgc3RlcCAoZmlyZS1hbmQtZm9yZ2V0IGBjcmVhdGVIb29rKClgIGFoZWFkIG9mIHRoZSBmaXJzdFxuICAgKiBzdGVwIGNvbW1pdHMgaW4gdGhlIHNhbWUgc3VzcGVuc2lvbiBiYXRjaCkuIFN1YnRyYWN0ZWQgZnJvbSBUVEZTIHNvIHRoZVxuICAgKiBtZXRyaWMgcmVmbGVjdHMgcnVudGltZSBvdmVyaGVhZCByYXRoZXIgdGhhbiB0aGUgdXNlcidzIGhvb2sgd3JpdGVzLlxuICAgKi9cbiAgcHJlU3RlcEJsb2NraW5nTXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBFcG9jaCBtcyB0aGUgZmlyc3QgcHJlLXN0ZXAgYGF0dHJfc2V0YCB3cml0ZSBiZWdhbiAoaXRzIGNsaWVudC1zdGFtcGVkXG4gICAqIGBvY2N1cnJlZEF0YCwgZmFsbGluZyBiYWNrIHRvIGBjcmVhdGVkQXRgKS4gV2hlbiBwcmVzZW50LCB0aGUgVFRGU1xuICAgKiBtZWFzdXJlbWVudCBFTkRTIGhlcmUgaW5zdGVhZCBvZiBhdCB0aGUgc3RlcCdzIGNvZGUgc3RhcnQ6IGFcbiAgICogd29ya2Zsb3ctYm9keSBgc2V0QXR0cmlidXRlc2AgYmVmb3JlIHRoZSBmaXJzdCBzdGVwXG4gICAqIHJlc29sdmVzIHRocm91Z2ggYW4gZXh0cmEgcmVwbGF5IChzZWUgdGhlIGBoYXNBdHRyaWJ1dGVFdmVudHNgIGJyYW5jaCBpblxuICAgKiBydW50aW1lLnRzKSwgc28gZXZlcnl0aGluZyBmcm9tIHRoaXMgd3JpdGUgdW50aWwgdGhlIHN0ZXAgYm9keSBydW5zIGlzXG4gICAqIHRoZSBkdXJhdGlvbiBvZiB0aGUgc2V0QXR0cmlidXRlcyBjYWxsIOKAlCB3aGljaCBpcyBzdWJ0cmFjdGVkIGJ5IGVuZGluZ1xuICAgKiB0aGUgbWVhc3VyZW1lbnQgYXQgdGhlIHBvaW50IHdoZXJlIHRoZSBzdGVwIHdvdWxkIG90aGVyd2lzZSBoYXZlIGJlZW5cbiAgICogc2NoZWR1bGVkLlxuICAgKi9cbiAgcHJlU3RlcEF0dHJTdGFydE1zPzogbnVtYmVyO1xuICAvKipcbiAgICogRXBvY2ggbXMgdGhlIHByZXZpb3VzIHN0ZXAncyB0ZXJtaW5hbCBldmVudCB3YXMgcmVjb3JkZWQgKGl0c1xuICAgKiBjbGllbnQtc3RhbXBlZCBgb2NjdXJyZWRBdGAsIGZhbGxpbmcgYmFjayB0byBgY3JlYXRlZEF0YCkuIFByZXNlbnQgb25seVxuICAgKiB3aGVuIHRoZSBzdGVwIHF1YWxpZmllcyBmb3IgU1RTTy5cbiAgICovXG4gIHByZXZTdGVwRW5kTXM/OiBudW1iZXI7XG4gIC8qKiBOdW1iZXIgb2YgdW5pcXVlIHRlcm1pbmFsIHN0ZXBzIGFscmVhZHkgaW4gdGhlIGV2ZW50IGxvZy4gKi9cbiAgc3RlcENvdW50PzogbnVtYmVyO1xuICAvKiogTnVtYmVyIG9mIGV2ZW50cyBhbHJlYWR5IGluIHRoZSBldmVudCBsb2cuICovXG4gIGV2ZW50Q291bnQ/OiBudW1iZXI7XG4gIC8qKiBXaGV0aGVyIHR1cmJvIG1vZGUgaXMgYWN0aXZlIGZvciB0aGlzIGludm9jYXRpb24uICovXG4gIHR1cmJvOiBib29sZWFuO1xufVxuXG4vKiogTGF0ZW5jeSB0ZWxlbWV0cnkgYXR0YWNoZWQgdG8gYSBzdGVwJ3MgdGVybWluYWwgZXZlbnQncyBgZXZlbnREYXRhYC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RlcExhdGVuY3lFdmVudERhdGEge1xuICB0dGZzPzogbnVtYmVyO1xuICBzdHNvPzogbnVtYmVyO1xuICBzdGVwQ291bnQ/OiBudW1iZXI7XG4gIGV2ZW50Q291bnQ/OiBudW1iZXI7XG4gIG9wdGltaXphdGlvbnM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBFdmVudCB0eXBlcyB0aGF0IGRpc3F1YWxpZnkgVFRGUyB3aGVuIHByZXNlbnQgaW4gdGhlIGV2ZW50IGxvZyBhdCB0aGUgdGltZVxuICogdGhlIHJ1bidzIGZpcnN0IHN0ZXAgYmF0Y2ggaXMgc2NoZWR1bGVkOlxuICpcbiAqIC0gQW55IHN0ZXAgZXZlbnQgbWVhbnMgdGhpcyBpcyBub3QgdGhlIHJ1bidzIGZpcnN0IHN0ZXAgZXhlY3V0aW9uLlxuICogLSBgaG9va19yZWNlaXZlZGAgLyBgd2FpdF9jcmVhdGVkYCAvIGB3YWl0X2NvbXBsZXRlZGAgbWVhbiB0aGUgcnVuJ3MgcGF0aCB0b1xuICogICB0aGUgZmlyc3Qgc3RlcCBkZXBlbmRlZCBvbiB1c2VyLWRyaXZlbiB0aW1pbmcgKGEgd2ViaG9vayBhcnJpdmluZywgYVxuICogICBzbGVlcCBlbGFwc2luZyksIHNvIHRoZSBtZWFzdXJlbWVudCB3b3VsZCBub3QgcmVmbGVjdCBydW50aW1lIG92ZXJoZWFkLlxuICpcbiAqIERlbGliZXJhdGVseSBhYnNlbnQsIHdpdGggdGhlaXIgY29zdCBzdWJ0cmFjdGVkIGluc3RlYWQ6XG4gKlxuICogLSBgaG9va19jcmVhdGVkYDogYSBmaXJlLWFuZC1mb3JnZXQgYGNyZWF0ZUhvb2soKWAgYmVmb3JlIHRoZSBmaXJzdCBzdGVwXG4gKiAgIGNvbW1pdHMgaW4gdGhlIHNhbWUgaW52b2NhdGlvbiwgd2hvc2UgbWVhc3VyZWQgZHVyYXRpb24gaXMgc3VidHJhY3RlZCB2aWFcbiAqICAge0BsaW5rIFN0ZXBMYXRlbmN5VHJhY2tpbmcucHJlU3RlcEJsb2NraW5nTXN9LlxuICogLSBgYXR0cl9zZXRgICh3b3JrZmxvdy1ib2R5IGBzZXRBdHRyaWJ1dGVzYCk6IHJlc29sdmVzIHRocm91Z2hcbiAqICAgYW4gZXh0cmEgcmVwbGF5IGJlZm9yZSBzdGVwcyBydW4uIFN1YnRyYWN0ZWQgYnkgZW5kaW5nIHRoZSBtZWFzdXJlbWVudCBhdFxuICogICB0aGUgZmlyc3QgYXR0ciB3cml0ZSdzIHRpbWVzdGFtcCBpbnN0ZWFkIOKAlCBzZWVcbiAqICAge0BsaW5rIFN0ZXBMYXRlbmN5VHJhY2tpbmcucHJlU3RlcEF0dHJTdGFydE1zfS5cbiAqL1xuY29uc3QgVFRGU19ESVNRVUFMSUZZSU5HX0VWRU5UX1RZUEVTOiBSZWFkb25seVNldDxFdmVudFsnZXZlbnRUeXBlJ10+ID0gbmV3IFNldChcbiAgW1xuICAgICdzdGVwX2NyZWF0ZWQnLFxuICAgICdzdGVwX3N0YXJ0ZWQnLFxuICAgICdzdGVwX2NvbXBsZXRlZCcsXG4gICAgJ3N0ZXBfZmFpbGVkJyxcbiAgICAnc3RlcF9yZXRyeWluZycsXG4gICAgJ2hvb2tfcmVjZWl2ZWQnLFxuICAgICd3YWl0X2NyZWF0ZWQnLFxuICAgICd3YWl0X2NvbXBsZXRlZCcsXG4gIF1cbik7XG5cbi8qKlxuICogRGVjaWRlLCBmcm9tIHRoZSBvcmNoZXN0cmF0b3IncyB2aWV3IG9mIHRoZSBldmVudCBsb2csIHdoZXRoZXIgdGhlIGlubGluZVxuICogc3RlcCBiYXRjaCBhYm91dCB0byBleGVjdXRlIHF1YWxpZmllcyBmb3IgVFRGUyBhbmQvb3IgU1RTTyBtZWFzdXJlbWVudC5cbiAqIFJldHVybnMgdW5kZWZpbmVkIHdoZW4gbmVpdGhlciBhcHBsaWVzLiBDYWxsZWQgb25jZSBwZXIgYmF0Y2g7IHRoZSByZXN1bHRcbiAqIGlzIHBhc3NlZCB0byB0aGUgYmF0Y2gncyBmaXJzdCBzdGVwIG9ubHksIHNvIGEgcGFyYWxsZWwgZmlyc3QgYmF0Y2ggZW1pdHMgYVxuICogc2luZ2xlIHNhbXBsZSByYXRoZXIgdGhhbiBvbmUgcGVyIHNpYmxpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlU3RlcExhdGVuY3lUcmFja2luZyhwYXJhbXM6IHtcbiAgLyoqIFRoZSBvcmNoZXN0cmF0b3IncyBjdXJyZW50IGluLW1lbW9yeSBldmVudCBsb2cgKGFzY2VuZGluZyBvcmRlcikuICovXG4gIGV2ZW50czogRXZlbnRbXTtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBpbnZvY2F0aW9uJ3MgaW5pdGlhbCBldmVudCBsb2FkIGNvbnRhaW5lZCBub3RoaW5nIGJleW9uZFxuICAgKiBydW5fY3JlYXRlZC9ydW5fc3RhcnRlZC9hdHRyX3NldC4gUHJlLWV4aXN0aW5nIGhvb2sgZXZlbnRzIHdlcmUgd3JpdHRlblxuICAgKiBieSBhbiBlYXJsaWVyIGludm9jYXRpb24sIHNvIHRoZSB0aW1lIHRoZXkgYWRkZWQgKGluY2x1ZGluZyB0aGUgcXVldWVcbiAgICogaG9wIGJhY2sgdG8gdGhpcyBpbnZvY2F0aW9uKSBpcyB1bm1lYXN1cmFibGUgYW5kIGRpc3F1YWxpZmllcyBUVEZTLlxuICAgKiBhdHRyX3NldCBpcyBwZXJtaXR0ZWQ6IGEgcmVkZWxpdmVyeSBjYW4gbGFuZCBhZnRlciBhIGNvbW1pdHRlZCBwcmUtc3RlcFxuICAgKiBhdHRyX3NldCwgYW5kIHRoZSBkZXRvdXIgaXQgbWFya3MgaXMgc3VidHJhY3RlZCB2aWEgYHByZVN0ZXBBdHRyU3RhcnRNc2BcbiAgICogcmVnYXJkbGVzcyBvZiB3aGljaCBpbnZvY2F0aW9uIHdyb3RlIGl0LlxuICAgKi9cbiAgaW52b2NhdGlvblN0YXJ0ZWRDbGVhbjogYm9vbGVhbjtcbiAgLyoqIEVwb2NoIG1zIG9mIHJ1biBjcmVhdGlvbiwgaWYgcmVjb3ZlcmFibGUuIEFic2VudCBkaXNxdWFsaWZpZXMgVFRGUy4gKi9cbiAgcnVuQ3JlYXRlZEF0TXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgLyoqIFNlZSB7QGxpbmsgU3RlcExhdGVuY3lUcmFja2luZy5wcmVTdGVwQmxvY2tpbmdNc30uICovXG4gIHByZVN0ZXBCbG9ja2luZ01zOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgYWNjdW11bGF0b3IncyB2YWx1ZSBhcyBvZiB0aGUgc3VzcGVuc2lvbiB0aGF0IHdyb3RlIHRoZSBydW4ncyBmaXJzdFxuICAgKiBhdHRyX3NldCAoaXRzIGhvb2sgcGhhc2UgcnVucyBiZWZvcmUgaXRzIGF0dHIgd3JpdGVzKS4gV2hlbiB0aGVcbiAgICogbWVhc3VyZW1lbnQgZW5kcyBhdCB0aGUgYXR0ciB3cml0ZSwgb25seSBob29rIHRpbWUgZnJvbSBiZWZvcmUgdGhhdFxuICAgKiBwb2ludCBtYXkgYmUgc3VidHJhY3RlZCDigJQgbGF0ZXIgaG9vayB3cml0ZXMgZmFsbCBvdXRzaWRlIHRoZSBtZWFzdXJlZFxuICAgKiB3aW5kb3cuIFVuZGVmaW5lZCB3aGVuIG5vIGF0dHIgc3VzcGVuc2lvbiBoYXBwZW5lZCBpbiB0aGlzIGludm9jYXRpb25cbiAgICogKGUuZy4gdGhlIGF0dHJfc2V0IHdhcyBsb2FkZWQgZnJvbSBhIHJlZGVsaXZlcnkncyBzbmFwc2hvdCwgd2hlcmUgbm9cbiAgICogc2FtZS1pbnZvY2F0aW9uIGhvb2sgdGltZSBwcmVjZWRlcyBpdCkuXG4gICAqL1xuICBwcmVTdGVwQmxvY2tpbmdCZWZvcmVBdHRyTXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHN1c3BlbnNpb24gdGhhdCBzY2hlZHVsZWQgdGhpcyBiYXRjaCBhbHNvIGNyZWF0ZWQgd2FpdHMuXG4gICAqIFRob3NlIGB3YWl0X2NyZWF0ZWRgIHdyaXRlcyBhcmUgbm90IGluIGBldmVudHNgIHlldCAodGhleSB3ZXJlIGNvbW1pdHRlZFxuICAgKiBieSB0aGlzIHZlcnkgc3VzcGVuc2lvbiBwYXNzKSwgc28gdGhleSBtdXN0IGJlIHJlcG9ydGVkIHNlcGFyYXRlbHkuIEFcbiAgICogd2FpdCBkaXNxdWFsaWZpZXMgYm90aCBtZWFzdXJlbWVudHMuXG4gICAqL1xuICBzdXNwZW5zaW9uSGFzV2FpdHM6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBzdXNwZW5zaW9uIHRoYXQgc2NoZWR1bGVkIHRoaXMgYmF0Y2ggYWxzbyBjcmVhdGVkIGhvb2tzXG4gICAqIChhbHNvIG5vdCBpbiBgZXZlbnRzYCB5ZXQpLiBIb29rcyBrZWVwIFRURlMgZWxpZ2libGUg4oCUIHRoZWlyIG1lYXN1cmVkXG4gICAqIHdyaXRlIHRpbWUgaXMgc3VidHJhY3RlZCB2aWEgYHByZVN0ZXBCbG9ja2luZ01zYCDigJQgYnV0IGRpc3F1YWxpZnkgU1RTTyxcbiAgICogd2hpY2ggaXMgb25seSBtZWFuaW5nZnVsIGZvciBhIHB1cmUgYmFjay10by1iYWNrIHN0ZXAgZ2FwLlxuICAgKi9cbiAgc3VzcGVuc2lvbkNyZWF0ZWRIb29rczogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdHVyYm8gbW9kZSBpcyBhY3RpdmUgZm9yIHRoaXMgaW52b2NhdGlvbi4gKi9cbiAgdHVyYm86IGJvb2xlYW47XG59KTogU3RlcExhdGVuY3lUcmFja2luZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHsgZXZlbnRzIH0gPSBwYXJhbXM7XG5cbiAgbGV0IHR0ZnNFbGlnaWJsZSA9XG4gICAgcGFyYW1zLmludm9jYXRpb25TdGFydGVkQ2xlYW4gJiZcbiAgICBwYXJhbXMucnVuQ3JlYXRlZEF0TXMgIT09IHVuZGVmaW5lZCAmJlxuICAgICFwYXJhbXMuc3VzcGVuc2lvbkhhc1dhaXRzO1xuICBsZXQgcHJlU3RlcEF0dHJTdGFydE1zOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGlmICh0dGZzRWxpZ2libGUpIHtcbiAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgICAgaWYgKFRURlNfRElTUVVBTElGWUlOR19FVkVOVF9UWVBFUy5oYXMoZXZlbnQuZXZlbnRUeXBlKSkge1xuICAgICAgICB0dGZzRWxpZ2libGUgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnQuZXZlbnRUeXBlID09PSAnYXR0cl9zZXQnKSB7XG4gICAgICAgIGNvbnN0IGF0dHJTdGFydE1zID0gKyhldmVudC5vY2N1cnJlZEF0ID8/IGV2ZW50LmNyZWF0ZWRBdCk7XG4gICAgICAgIHByZVN0ZXBBdHRyU3RhcnRNcyA9XG4gICAgICAgICAgcHJlU3RlcEF0dHJTdGFydE1zID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gYXR0clN0YXJ0TXNcbiAgICAgICAgICAgIDogTWF0aC5taW4ocHJlU3RlcEF0dHJTdGFydE1zLCBhdHRyU3RhcnRNcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gU1RTTzogdGhlIHR3byBzdGVwcyByYW4gYmFjay10by1iYWNrIOKAlCB0aGUgbmV3ZXN0IGtub3duIGV2ZW50IGlzIHRoZVxuICAvLyBwcmV2aW91cyBzdGVwJ3MgdGVybWluYWwgZXZlbnQsIHdpdGggbm90aGluZyAoaG9va19yZWNlaXZlZCwgd2FpdHMsXG4gIC8vIGF0dHJfc2V0LCAuLi4pIGluIGJldHdlZW4gYW5kIHRoaXMgc3VzcGVuc2lvbiBzY2hlZHVsaW5nIG5vdGhpbmcgYnV0XG4gIC8vIHN0ZXBzLlxuICBsZXQgcHJldlN0ZXBFbmRNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBsZXQgc3RlcENvdW50OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGxldCBldmVudENvdW50OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGxhc3RFdmVudCA9IGV2ZW50c1tldmVudHMubGVuZ3RoIC0gMV07XG4gIGlmIChcbiAgICAhcGFyYW1zLnN1c3BlbnNpb25IYXNXYWl0cyAmJlxuICAgICFwYXJhbXMuc3VzcGVuc2lvbkNyZWF0ZWRIb29rcyAmJlxuICAgIGxhc3RFdmVudCAmJlxuICAgIChsYXN0RXZlbnQuZXZlbnRUeXBlID09PSAnc3RlcF9jb21wbGV0ZWQnIHx8XG4gICAgICBsYXN0RXZlbnQuZXZlbnRUeXBlID09PSAnc3RlcF9mYWlsZWQnKVxuICApIHtcbiAgICBwcmV2U3RlcEVuZE1zID0gKyhsYXN0RXZlbnQub2NjdXJyZWRBdCA/PyBsYXN0RXZlbnQuY3JlYXRlZEF0KTtcbiAgICBjb25zdCB0ZXJtaW5hbFN0ZXBJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgICAgaWYgKFxuICAgICAgICAoZXZlbnQuZXZlbnRUeXBlID09PSAnc3RlcF9jb21wbGV0ZWQnIHx8XG4gICAgICAgICAgZXZlbnQuZXZlbnRUeXBlID09PSAnc3RlcF9mYWlsZWQnKSAmJlxuICAgICAgICBldmVudC5jb3JyZWxhdGlvbklkICE9PSB1bmRlZmluZWRcbiAgICAgICkge1xuICAgICAgICB0ZXJtaW5hbFN0ZXBJZHMuYWRkKGV2ZW50LmNvcnJlbGF0aW9uSWQpO1xuICAgICAgfVxuICAgIH1cbiAgICBzdGVwQ291bnQgPSB0ZXJtaW5hbFN0ZXBJZHMuc2l6ZTtcbiAgICBldmVudENvdW50ID0gZXZlbnRzLmxlbmd0aDtcbiAgfVxuXG4gIGlmICghdHRmc0VsaWdpYmxlICYmIHByZXZTdGVwRW5kTXMgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLih0dGZzRWxpZ2libGVcbiAgICAgID8ge1xuICAgICAgICAgIHR0ZnNBbmNob3JNczogcGFyYW1zLnJ1bkNyZWF0ZWRBdE1zLFxuICAgICAgICAgIC8vIFdoZW4gdGhlIG1lYXN1cmVtZW50IGVuZHMgYXQgdGhlIGZpcnN0IGF0dHIgd3JpdGUsIG9ubHkgaG9va1xuICAgICAgICAgIC8vIHRpbWUgZnJvbSBiZWZvcmUgdGhhdCBwb2ludCBpcyBpbnNpZGUgdGhlIG1lYXN1cmVkIHdpbmRvdy5cbiAgICAgICAgICBwcmVTdGVwQmxvY2tpbmdNczpcbiAgICAgICAgICAgIHByZVN0ZXBBdHRyU3RhcnRNcyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gKHBhcmFtcy5wcmVTdGVwQmxvY2tpbmdCZWZvcmVBdHRyTXMgPz8gMClcbiAgICAgICAgICAgICAgOiBwYXJhbXMucHJlU3RlcEJsb2NraW5nTXMsXG4gICAgICAgICAgLi4uKHByZVN0ZXBBdHRyU3RhcnRNcyAhPT0gdW5kZWZpbmVkID8geyBwcmVTdGVwQXR0clN0YXJ0TXMgfSA6IHt9KSxcbiAgICAgICAgfVxuICAgICAgOiB7fSksXG4gICAgLi4uKHByZXZTdGVwRW5kTXMgIT09IHVuZGVmaW5lZFxuICAgICAgPyB7IHByZXZTdGVwRW5kTXMsIHN0ZXBDb3VudCwgZXZlbnRDb3VudCB9XG4gICAgICA6IHt9KSxcbiAgICB0dXJibzogcGFyYW1zLnR1cmJvLFxuICB9O1xufVxuXG4vKipcbiAqIENvbXB1dGUgdGhlIGxhdGVuY3kgdGVsZW1ldHJ5IHRvIGF0dGFjaCB0byB0aGUgc3RlcCdzIHRlcm1pbmFsIGV2ZW50LlxuICogQ2FsbGVkIGJ5IGBleGVjdXRlU3RlcGAgd2l0aCB0aGUgd2FsbC1jbG9jayB0aW1lc3RhbXAgdGFrZW4gaW1tZWRpYXRlbHlcbiAqIGJlZm9yZSB1c2VyIHN0ZXAgY29kZSBydW5zLiBSZXR1cm5zIHVuZGVmaW5lZCB3aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG9cbiAqIHJlcG9ydCAobm8gdHJhY2tpbmcsIG9yIGEgcmV0cnkgYXR0ZW1wdCDigJQgcmV0cmllcyBtZWFzdXJlIG5laXRoZXIgVFRGUyBub3JcbiAqIFNUU08pLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVN0ZXBMYXRlbmN5RXZlbnREYXRhKHBhcmFtczoge1xuICB0cmFja2luZzogU3RlcExhdGVuY3lUcmFja2luZyB8IHVuZGVmaW5lZDtcbiAgLyoqIGBEYXRlLm5vdygpYCB0YWtlbiBpbW1lZGlhdGVseSBiZWZvcmUgdXNlciBzdGVwIGNvZGUgYmVnYW4gZXhlY3V0aW5nLiAqL1xuICBzdGVwQ29kZVN0YXJ0ZWRBdE1zOiBudW1iZXI7XG4gIGF0dGVtcHQ6IG51bWJlcjtcbiAgLyoqIFdoZXRoZXIgdGhpcyBzdGVwIHdhcyBzdGFydGVkIGxhemlseSAobm8gc2VwYXJhdGUgc3RlcF9jcmVhdGVkIHdyaXRlKS4gKi9cbiAgbGF6eVN0ZXBTdGFydDogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhlIGJvZHkgcmFuIG9wdGltaXN0aWNhbGx5LCB3aXRob3V0IGF3YWl0aW5nIHN0ZXBfc3RhcnRlZC4gKi9cbiAgb3B0aW1pc3RpY1N0YXJ0OiBib29sZWFuO1xufSk6IFN0ZXBMYXRlbmN5RXZlbnREYXRhIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgeyB0cmFja2luZyB9ID0gcGFyYW1zO1xuICBpZiAoIXRyYWNraW5nIHx8IHBhcmFtcy5hdHRlbXB0ICE9PSAxKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIENsYW1wIGF0IDA6IGNyb3NzLWludm9jYXRpb24gdGltZXN0YW1wcyBjYW4gY29tZSBmcm9tIGFub3RoZXIgbWFjaGluZSdzXG4gIC8vIGNsb2NrLCBzbyBzbWFsbCBza2V3cyBtdXN0IG5vdCBwcm9kdWNlIG5lZ2F0aXZlIGR1cmF0aW9ucy5cbiAgLy9cbiAgLy8gQSBwcmUtc3RlcCBzZXRBdHRyaWJ1dGVzIGRldG91ciBlbmRzIHRoZSBtZWFzdXJlbWVudCBhdCB0aGUgZmlyc3QgYXR0clxuICAvLyB3cml0ZSBpbnN0ZWFkIG9mIHRoZSBzdGVwJ3MgY29kZSBzdGFydCDigJQgdGhlIHJlbWFpbmRlciBpcyB0aGUgZHVyYXRpb25cbiAgLy8gb2YgdGhlIHNldEF0dHJpYnV0ZXMgY2FsbCAocmVzb2x2ZWQgdmlhIGFuIGV4dHJhIHJlcGxheSksIHdoaWNoIGlzXG4gIC8vIHN1YnRyYWN0ZWQgcmF0aGVyIHRoYW4gZGlzcXVhbGlmeWluZyB0aGUgc2FtcGxlLiBJbiB0aGF0IGNhc2VcbiAgLy8gYHRyYWNraW5nLnByZVN0ZXBCbG9ja2luZ01zYCBhbHJlYWR5IGhvbGRzIG9ubHkgdGhlIGhvb2sgdGltZSBmcm9tXG4gIC8vIEJFRk9SRSB0aGUgYXR0ciB3cml0ZSDigJQgaG9vayB3cml0ZXMgYWZ0ZXIgdGhlIHdpbmRvdyBjbG9zZWQgYXJlIGV4Y2x1ZGVkXG4gIC8vIGJ5IGNvbXB1dGVTdGVwTGF0ZW5jeVRyYWNraW5nIChzZWUgcHJlU3RlcEJsb2NraW5nQmVmb3JlQXR0ck1zKS5cbiAgY29uc3QgdHRmc0VuZE1zID0gdHJhY2tpbmcucHJlU3RlcEF0dHJTdGFydE1zID8/IHBhcmFtcy5zdGVwQ29kZVN0YXJ0ZWRBdE1zO1xuICBjb25zdCB0dGZzID1cbiAgICB0cmFja2luZy50dGZzQW5jaG9yTXMgIT09IHVuZGVmaW5lZFxuICAgICAgPyBNYXRoLm1heChcbiAgICAgICAgICAwLFxuICAgICAgICAgIHR0ZnNFbmRNcyAtIHRyYWNraW5nLnR0ZnNBbmNob3JNcyAtICh0cmFja2luZy5wcmVTdGVwQmxvY2tpbmdNcyA/PyAwKVxuICAgICAgICApXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3Qgc3RzbyA9XG4gICAgdHJhY2tpbmcucHJldlN0ZXBFbmRNcyAhPT0gdW5kZWZpbmVkXG4gICAgICA/IE1hdGgubWF4KDAsIHBhcmFtcy5zdGVwQ29kZVN0YXJ0ZWRBdE1zIC0gdHJhY2tpbmcucHJldlN0ZXBFbmRNcylcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gIGlmICh0dGZzID09PSB1bmRlZmluZWQgJiYgc3RzbyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IG9wdGltaXphdGlvbnM6IHN0cmluZ1tdID0gW107XG4gIGlmICh0cmFja2luZy50dXJibykgb3B0aW1pemF0aW9ucy5wdXNoKCd0dXJibycpO1xuICBpZiAocGFyYW1zLmxhenlTdGVwU3RhcnQpIG9wdGltaXphdGlvbnMucHVzaCgnbGF6eVN0ZXBTdGFydCcpO1xuICBpZiAocGFyYW1zLm9wdGltaXN0aWNTdGFydCkgb3B0aW1pemF0aW9ucy5wdXNoKCdvcHRpbWlzdGljU3RhcnQnKTtcblxuICByZXR1cm4ge1xuICAgIC4uLih0dGZzICE9PSB1bmRlZmluZWQgPyB7IHR0ZnMgfSA6IHt9KSxcbiAgICAuLi4oc3RzbyAhPT0gdW5kZWZpbmVkID8geyBzdHNvIH0gOiB7fSksXG4gICAgLi4uKHN0c28gIT09IHVuZGVmaW5lZCAmJiB0cmFja2luZy5zdGVwQ291bnQgIT09IHVuZGVmaW5lZFxuICAgICAgPyB7IHN0ZXBDb3VudDogdHJhY2tpbmcuc3RlcENvdW50IH1cbiAgICAgIDoge30pLFxuICAgIC4uLihzdHNvICE9PSB1bmRlZmluZWQgJiYgdHJhY2tpbmcuZXZlbnRDb3VudCAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHsgZXZlbnRDb3VudDogdHJhY2tpbmcuZXZlbnRDb3VudCB9XG4gICAgICA6IHt9KSxcbiAgICBvcHRpbWl6YXRpb25zLFxuICB9O1xufVxuIl19
|
|
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=
|
|
@@ -1,12 +1,21 @@
|
|
|
1
1
|
import type { Span } from '@opentelemetry/api';
|
|
2
2
|
import { type SerializedData, type WorkflowRun, type World } from '@workflow/world';
|
|
3
3
|
import type { StepInvocationQueueItem, WorkflowSuspension } from '../global.js';
|
|
4
|
+
import { type MutableEventLog } from './helpers.js';
|
|
4
5
|
export interface SuspensionHandlerParams {
|
|
5
6
|
suspension: WorkflowSuspension;
|
|
6
7
|
world: World;
|
|
7
8
|
run: WorkflowRun;
|
|
8
9
|
span?: Span;
|
|
9
10
|
requestId?: string;
|
|
11
|
+
/**
|
|
12
|
+
* The runtime's loaded event log. Each event creation is sent with this
|
|
13
|
+
* snapshot's `stateUpdatedAt` and, if the backend rejects it as stale (412),
|
|
14
|
+
* the log is reloaded in place and the create is retried — see
|
|
15
|
+
* `withPreconditionRetry`. Guarding per-create (rather than the whole
|
|
16
|
+
* suspension) ensures a retry never re-issues an already-created event.
|
|
17
|
+
*/
|
|
18
|
+
eventLog?: MutableEventLog;
|
|
10
19
|
/**
|
|
11
20
|
* Turbo mode only: a promise that resolves once the backgrounded
|
|
12
21
|
* `run_started` has landed (the run exists). When present, every world write
|
|
@@ -94,5 +103,5 @@ export interface SuspensionHandlerResult {
|
|
|
94
103
|
* 1. Hooks are processed first to prevent race conditions with webhook receivers
|
|
95
104
|
* 2. Step events and wait events are created in parallel
|
|
96
105
|
*/
|
|
97
|
-
export declare function handleSuspension({ suspension, world, run, span, requestId, runReadyBarrier, }: SuspensionHandlerParams): Promise<SuspensionHandlerResult>;
|
|
106
|
+
export declare function handleSuspension({ suspension, world, run, span, requestId, eventLog, runReadyBarrier, }: SuspensionHandlerParams): Promise<SuspensionHandlerResult>;
|
|
98
107
|
//# sourceMappingURL=suspension-handler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"suspension-handler.d.ts","sourceRoot":"","sources":["../../src/runtime/suspension-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAQ/C,OAAO,
|
|
1
|
+
{"version":3,"file":"suspension-handler.d.ts","sourceRoot":"","sources":["../../src/runtime/suspension-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAQ/C,OAAO,EAKL,KAAK,cAAc,EAGnB,KAAK,WAAW,EAChB,KAAK,KAAK,EACX,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAGV,uBAAuB,EAEvB,kBAAkB,EACnB,MAAM,cAAc,CAAC;AAMtB,OAAO,EAAE,KAAK,eAAe,EAAyB,MAAM,cAAc,CAAC;AAE3E,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,kBAAkB,CAAC;IAC/B,KAAK,EAAE,KAAK,CAAC;IACb,GAAG,EAAE,WAAW,CAAC;IACjB,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B;;;;;;;;OAQG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;CACpC;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,4DAA4D;IAC5D,YAAY,EAAE,uBAAuB,EAAE,CAAC;IACxC;;;;;;;OAOG;IACH,yBAAyB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACvC;;;;;;;;;;;;OAYG;IACH,eAAe,EAAE,KAAK,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,QAAQ,EAAE,MAAM,CAAC;QACjB,eAAe,EAAE,cAAc,CAAC;KACjC,CAAC,CAAC;IACH;;;;;;OAMG;IACH,WAAW,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;IACzD,0EAA0E;IAC1E,eAAe,EAAE,OAAO,CAAC;IACzB,wFAAwF;IACxF,sBAAsB,EAAE,OAAO,CAAC;IAChC,wEAAwE;IACxE,kBAAkB,EAAE,OAAO,CAAC;IAC5B;;;;;;OAMG;IACH,aAAa,EAAE,OAAO,CAAC;IACvB;;;;;OAKG;IACH,cAAc,EAAE,MAAM,CAAC;CACxB;AAmED;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CAAC,EACrC,UAAU,EACV,KAAK,EACL,GAAG,EACH,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,eAAe,GAChB,EAAE,uBAAuB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAggB5D"}
|