@workflow/core 5.0.0-beta.35 → 5.0.0-beta.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/capabilities.d.ts +6 -0
- package/dist/capabilities.d.ts.map +1 -1
- package/dist/capabilities.js +13 -1
- package/dist/classify-error.d.ts.map +1 -1
- package/dist/classify-error.js +5 -2
- package/dist/create-hook.d.ts +41 -22
- package/dist/create-hook.d.ts.map +1 -1
- package/dist/create-hook.js +1 -1
- package/dist/describe-error.d.ts.map +1 -1
- package/dist/describe-error.js +12 -1
- package/dist/encryption.d.ts +15 -2
- package/dist/encryption.d.ts.map +1 -1
- package/dist/encryption.js +28 -7
- package/dist/flushable-stream.d.ts +55 -0
- package/dist/flushable-stream.d.ts.map +1 -1
- package/dist/flushable-stream.js +106 -4
- package/dist/global.d.ts +2 -0
- package/dist/global.d.ts.map +1 -1
- package/dist/global.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/log-format.js +3 -3
- package/dist/private.d.ts +82 -50
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +149 -22
- package/dist/replay-payload-cache.d.ts +57 -0
- package/dist/replay-payload-cache.d.ts.map +1 -0
- package/dist/replay-payload-cache.js +143 -0
- package/dist/runtime/constants.d.ts +11 -0
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +26 -1
- package/dist/runtime/count-step-started-events.d.ts +52 -0
- package/dist/runtime/count-step-started-events.d.ts.map +1 -0
- package/dist/runtime/count-step-started-events.js +72 -0
- package/dist/runtime/get-port-lazy.js +4 -4
- package/dist/runtime/helpers.d.ts +47 -16
- package/dist/runtime/helpers.d.ts.map +1 -1
- package/dist/runtime/helpers.js +97 -28
- package/dist/runtime/resume-hook.d.ts +6 -3
- package/dist/runtime/resume-hook.d.ts.map +1 -1
- package/dist/runtime/resume-hook.js +180 -58
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +3 -3
- package/dist/runtime/runs.d.ts.map +1 -1
- package/dist/runtime/runs.js +5 -3
- package/dist/runtime/start.d.ts.map +1 -1
- package/dist/runtime/start.js +65 -18
- package/dist/runtime/step-executor.d.ts +48 -8
- package/dist/runtime/step-executor.d.ts.map +1 -1
- package/dist/runtime/step-executor.js +90 -20
- package/dist/runtime/suspension-handler.js +3 -3
- package/dist/runtime/world.d.ts +2 -7
- package/dist/runtime/world.d.ts.map +1 -1
- package/dist/runtime/world.js +3 -10
- package/dist/runtime.d.ts +1 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +398 -184
- package/dist/sealed-box.d.ts +167 -0
- package/dist/sealed-box.d.ts.map +1 -0
- package/dist/sealed-box.js +571 -0
- package/dist/serialization/client.d.ts +3 -3
- package/dist/serialization/client.d.ts.map +1 -1
- package/dist/serialization/client.js +1 -1
- package/dist/serialization/codec.d.ts +6 -4
- package/dist/serialization/codec.d.ts.map +1 -1
- package/dist/serialization/codec.js +1 -1
- package/dist/serialization/encryption.d.ts +118 -17
- package/dist/serialization/encryption.d.ts.map +1 -1
- package/dist/serialization/encryption.js +131 -15
- package/dist/serialization/step.d.ts +4 -4
- package/dist/serialization/step.d.ts.map +1 -1
- package/dist/serialization/step.js +2 -2
- package/dist/serialization/types.d.ts +20 -0
- package/dist/serialization/types.d.ts.map +1 -1
- package/dist/serialization/types.js +11 -1
- package/dist/serialization-format.d.ts +44 -4
- package/dist/serialization-format.d.ts.map +1 -1
- package/dist/serialization-format.js +66 -9
- package/dist/serialization.d.ts +61 -21
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +556 -200
- package/dist/set-attributes.d.ts +2 -7
- package/dist/set-attributes.d.ts.map +1 -1
- package/dist/set-attributes.js +1 -6
- package/dist/step/context-storage.d.ts +2 -2
- package/dist/step/context-storage.d.ts.map +1 -1
- package/dist/step/context-storage.js +2 -2
- package/dist/step/writable-stream.d.ts.map +1 -1
- package/dist/step/writable-stream.js +14 -3
- package/dist/step.d.ts.map +1 -1
- package/dist/step.js +87 -22
- package/dist/symbols.d.ts +26 -0
- package/dist/symbols.d.ts.map +1 -1
- package/dist/symbols.js +27 -1
- package/dist/telemetry/semantic-conventions.d.ts +4 -4
- package/dist/telemetry/semantic-conventions.js +2 -2
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/dist/vm/index.d.ts.map +1 -1
- package/dist/vm/index.js +76 -9
- package/dist/workflow/abort-controller.d.ts +1 -1
- package/dist/workflow/abort-controller.d.ts.map +1 -1
- package/dist/workflow/abort-controller.js +38 -3
- package/dist/workflow/hook.d.ts.map +1 -1
- package/dist/workflow/hook.js +85 -30
- package/dist/workflow/index.d.ts +1 -1
- package/dist/workflow/index.d.ts.map +1 -1
- package/dist/workflow/index.js +2 -2
- package/dist/workflow/set-attributes.d.ts +0 -9
- package/dist/workflow/set-attributes.d.ts.map +1 -1
- package/dist/workflow/set-attributes.js +1 -6
- package/dist/workflow/sleep.d.ts.map +1 -1
- package/dist/workflow/sleep.js +21 -9
- package/dist/workflow.d.ts +14 -11
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +37 -92
- package/docs/api-reference/create-hook.mdx +43 -2
- package/docs/api-reference/define-hook.mdx +26 -24
- package/docs/api-reference/fatal-error.mdx +29 -7
- package/docs/api-reference/fetch.mdx +3 -4
- package/docs/api-reference/set-attributes.mdx +0 -4
- package/docs/api-reference/sleep.mdx +1 -1
- package/docs/foundations/hooks.mdx +1 -1
- package/docs/foundations/idempotency.mdx +16 -9
- package/docs/how-it-works/cancellation.mdx +2 -2
- package/docs/how-it-works/code-transform.mdx +19 -15
- package/docs/how-it-works/encryption.mdx +3 -3
- package/docs/how-it-works/event-sourcing.mdx +6 -6
- package/docs/how-it-works/framework-integrations.mdx +96 -342
- package/package.json +6 -6
- package/dist/runtime/step-handler.d.ts +0 -2
- package/dist/runtime/step-handler.d.ts.map +0 -1
- package/dist/runtime/step-handler.js +0 -839
- package/dist/step-hydration-cache.d.ts +0 -148
- package/dist/step-hydration-cache.d.ts.map +0 -1
- package/dist/step-hydration-cache.js +0 -171
package/dist/private.js
CHANGED
|
@@ -87,51 +87,172 @@ export function getStepFunction(stepId) {
|
|
|
87
87
|
return undefined;
|
|
88
88
|
}
|
|
89
89
|
/**
|
|
90
|
-
*
|
|
91
|
-
*
|
|
92
|
-
* so that this resolution is handed to the workflow only after all relevant
|
|
93
|
-
* earlier-in-log deliveries have been. This is what keeps a `Promise.race`
|
|
94
|
-
* deterministic and aligned with the committed event log, independent of
|
|
95
|
-
* microtask-hop counts, hydration time, or race-argument order.
|
|
90
|
+
* Which earlier kinds each delivery kind defers behind. Chosen so that no kind
|
|
91
|
+
* blocks on a peer it does not need to:
|
|
96
92
|
*
|
|
97
|
-
*
|
|
98
|
-
*
|
|
99
|
-
* wait defers behind earlier HOOKS
|
|
93
|
+
* - a hook defers behind earlier WAITS and STEPS — not earlier hooks, which
|
|
94
|
+
* are sequential same-entity payloads and must not block one another;
|
|
95
|
+
* - a wait defers behind earlier HOOKS and STEPS — not earlier waits, since a
|
|
96
|
+
* wait never needs to queue behind another wait;
|
|
97
|
+
* - a step defers behind earlier WAITS, HOOKS and STEPS.
|
|
98
|
+
*
|
|
99
|
+
* The step-behind-step edge is not redundant with the serial `promiseQueue`.
|
|
100
|
+
* The queue fixes the order in which step results are HYDRATED, but a step no
|
|
101
|
+
* longer resolves inside its queue slot — it captures the outcome there and
|
|
102
|
+
* resolves from a detached continuation once its barrier clears. Two steps
|
|
103
|
+
* agree on that continuation's ordering only while they defer behind the same
|
|
104
|
+
* set, which holds when they are consumed in the same drain window but not
|
|
105
|
+
* across windows: a step consumed later can miss a wait/hook barrier that an
|
|
106
|
+
* earlier step is still parked on, because the barrier retired in between. The
|
|
107
|
+
* earlier step is then waiting out the macrotask yield below while the later
|
|
108
|
+
* one resolves on microtasks, and overtakes it — see
|
|
109
|
+
* `delivery-barrier-coverage.test.ts`. Deferring behind earlier steps
|
|
110
|
+
* closes that window structurally: the earlier step's barrier is still
|
|
111
|
+
* registered precisely because it has not delivered yet.
|
|
112
|
+
*
|
|
113
|
+
* Every edge points from a later log index to a strictly earlier one, so the
|
|
114
|
+
* wait-for graph can never contain a cycle.
|
|
115
|
+
*/
|
|
116
|
+
const DEFER_BEHIND = {
|
|
117
|
+
hook: ['wait', 'step'],
|
|
118
|
+
wait: ['hook', 'step'],
|
|
119
|
+
step: ['wait', 'hook', 'step'],
|
|
120
|
+
};
|
|
121
|
+
/**
|
|
122
|
+
* Whether `entry` will resolve on its own — it is armed, and every earlier
|
|
123
|
+
* delivery it defers behind will likewise resolve on its own.
|
|
124
|
+
*
|
|
125
|
+
* A step delivery is always self-resolving: it skips uncommitted deliveries
|
|
126
|
+
* (see {@link awaitEarlierDeliveries}), and the earlier steps it does defer
|
|
127
|
+
* behind are self-resolving by the same argument, inducting down on index.
|
|
128
|
+
*
|
|
129
|
+
* Recursion terminates because every edge points to a strictly smaller index.
|
|
130
|
+
* `memo` is required rather than an optimization: without it the walk is
|
|
131
|
+
* exponential in the number of live hook/wait barriers (each armed entry
|
|
132
|
+
* re-walks every earlier entry of the opposite kind, T(n) = Σ T(j)), and the
|
|
133
|
+
* registry is not small by construction — `EventsConsumer` drains
|
|
134
|
+
* consecutively consumable events synchronously while barriers only retire on
|
|
135
|
+
* microtask-driven deliveries, so a fan-out of `Promise.race([hook, sleep])`
|
|
136
|
+
* branches accumulates one barrier per branch per kind. Memoized, the walk is
|
|
137
|
+
* linear in registry size. The memo MUST be per-call: `armed` mutates between
|
|
138
|
+
* calls as buffered payloads are claimed.
|
|
100
139
|
*/
|
|
101
|
-
|
|
140
|
+
function resolvesOnItsOwn(barriers, index, entry, memo) {
|
|
141
|
+
const cached = memo.get(index);
|
|
142
|
+
if (cached !== undefined) {
|
|
143
|
+
return cached;
|
|
144
|
+
}
|
|
145
|
+
const result = computeResolvesOnItsOwn(barriers, index, entry, memo);
|
|
146
|
+
memo.set(index, result);
|
|
147
|
+
return result;
|
|
148
|
+
}
|
|
149
|
+
function computeResolvesOnItsOwn(barriers, index, entry, memo) {
|
|
150
|
+
if (!entry.armed) {
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
if (entry.kind === 'step') {
|
|
154
|
+
return true;
|
|
155
|
+
}
|
|
156
|
+
const deferBehind = DEFER_BEHIND[entry.kind];
|
|
157
|
+
for (const [otherIndex, other] of barriers) {
|
|
158
|
+
if (otherIndex < index &&
|
|
159
|
+
deferBehind.includes(other.kind) &&
|
|
160
|
+
!resolvesOnItsOwn(barriers, otherIndex, other, memo)) {
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Awaits, in strict event-log order, every still-registered delivery that is
|
|
168
|
+
* earlier in the log than `eventIndex` and that a delivery of `kind` defers
|
|
169
|
+
* behind (see {@link DEFER_BEHIND}), so that this resolution is handed to the
|
|
170
|
+
* workflow only after all relevant earlier-in-log deliveries have been. This
|
|
171
|
+
* is what keeps a `Promise.race` — or the ULID a follow-up `useStep` draws on
|
|
172
|
+
* a concurrent branch — deterministic and aligned with the committed event
|
|
173
|
+
* log, independent of microtask-hop counts, hydration time, or race-argument
|
|
174
|
+
* order. When this delivery does have to wait, it also yields a macrotask
|
|
175
|
+
* afterwards so the earlier delivery's consumer can run to its own next
|
|
176
|
+
* suspension point first; see the comment at that `await` for why ordering the
|
|
177
|
+
* `resolve()` calls alone is not enough.
|
|
178
|
+
*
|
|
179
|
+
* One asymmetry: a STEP result additionally skips any earlier delivery that
|
|
180
|
+
* will not resolve on its own, i.e. one blocked (directly or transitively) on
|
|
181
|
+
* a buffered hook payload no consumer has claimed. Such a payload is delivered
|
|
182
|
+
* only when the workflow next reads the hook, and reaching that read very
|
|
183
|
+
* commonly requires the step result itself (`await stepX()` before the read).
|
|
184
|
+
* Gating the step on it would stall the workflow until the barrier's idle
|
|
185
|
+
* safety net fires, which then releases every delivery queued behind that
|
|
186
|
+
* payload at once — losing exactly the race this ordering exists to protect.
|
|
187
|
+
* Waits and hooks keep gating on unclaimed payloads: for them, waiting for the
|
|
188
|
+
* claim IS the ordering guarantee (a `wait_completed` must not preempt a
|
|
189
|
+
* payload the log ordered first).
|
|
190
|
+
*/
|
|
191
|
+
export async function awaitEarlierDeliveries(ctx, eventIndex, kind) {
|
|
102
192
|
// Defensive: tolerate contexts that predate this field (test harnesses).
|
|
103
193
|
if (eventIndex === undefined ||
|
|
104
194
|
!ctx.pendingDeliveryBarriers ||
|
|
105
195
|
ctx.pendingDeliveryBarriers.size === 0) {
|
|
106
196
|
return;
|
|
107
197
|
}
|
|
198
|
+
const barriers = ctx.pendingDeliveryBarriers;
|
|
199
|
+
const deferBehind = DEFER_BEHIND[kind];
|
|
108
200
|
const earlier = [];
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
201
|
+
// Shared across this call only — see `resolvesOnItsOwn`.
|
|
202
|
+
const selfResolving = new Map();
|
|
203
|
+
for (const [index, entry] of barriers) {
|
|
204
|
+
if (index >= eventIndex || !deferBehind.includes(entry.kind)) {
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
if (kind === 'step' &&
|
|
208
|
+
!resolvesOnItsOwn(barriers, index, entry, selfResolving)) {
|
|
209
|
+
continue;
|
|
112
210
|
}
|
|
211
|
+
earlier.push(entry.delivered);
|
|
113
212
|
}
|
|
114
213
|
if (earlier.length > 0) {
|
|
115
214
|
await Promise.all(earlier);
|
|
215
|
+
// An earlier delivery being "delivered" only means its `resolve()` ran.
|
|
216
|
+
// The branch it woke may need an arbitrary number of further microtask
|
|
217
|
+
// hops before it reaches its next `useStep` call and draws a ULID — a
|
|
218
|
+
// `for await` over a hook, for instance, resumes the generator, settles
|
|
219
|
+
// the promise from `next()`, and only then runs the loop body. Resolving
|
|
220
|
+
// this delivery on a microtask would let it overtake that branch and
|
|
221
|
+
// reorder the ULID allocation anyway, turning the guarantee below into a
|
|
222
|
+
// hop-count race that holds only for the shortest consumers.
|
|
223
|
+
//
|
|
224
|
+
// Yielding a macrotask lets the earlier branch's entire microtask chain
|
|
225
|
+
// drain first, whatever its length, so log order survives regardless of
|
|
226
|
+
// how the workflow consumes the earlier delivery. Only deliveries that
|
|
227
|
+
// actually had to defer pay this, so the common single-delivery drain is
|
|
228
|
+
// unaffected.
|
|
229
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
116
230
|
}
|
|
117
231
|
}
|
|
118
232
|
/**
|
|
119
233
|
* Register a branch-deciding delivery at its event-log index so that later
|
|
120
|
-
*
|
|
121
|
-
*
|
|
234
|
+
* deliveries can be ordered strictly after it. Returns an inert handle when
|
|
235
|
+
* `pendingDeliveryBarriers` is not initialized.
|
|
236
|
+
*
|
|
237
|
+
* Pass `armed: false` for a delivery whose resolution waits on workflow code
|
|
238
|
+
* asking for it (a buffered hook payload); call `arm()` when it does.
|
|
122
239
|
*
|
|
123
240
|
* To guarantee a later delivery gated on this one can never hang when this
|
|
124
241
|
* delivery is abandoned (the workflow took a different branch or is
|
|
125
242
|
* suspending and never observes it), the barrier auto-resolves at idle.
|
|
126
243
|
*/
|
|
127
|
-
export function registerDeliveryBarrier(ctx, eventIndex, kind) {
|
|
244
|
+
export function registerDeliveryBarrier(ctx, eventIndex, kind, options = {}) {
|
|
128
245
|
const barriers = ctx.pendingDeliveryBarriers;
|
|
129
246
|
if (!barriers || eventIndex === undefined) {
|
|
130
|
-
return { markDelivered: () => { } };
|
|
247
|
+
return { markDelivered: () => { }, arm: () => { } };
|
|
131
248
|
}
|
|
132
249
|
let done = false;
|
|
133
250
|
const { promise, resolve } = withResolvers();
|
|
134
|
-
const entry = {
|
|
251
|
+
const entry = {
|
|
252
|
+
kind,
|
|
253
|
+
delivered: promise,
|
|
254
|
+
armed: options.armed ?? true,
|
|
255
|
+
};
|
|
135
256
|
barriers.set(eventIndex, entry);
|
|
136
257
|
const finish = () => {
|
|
137
258
|
if (done) {
|
|
@@ -144,11 +265,17 @@ export function registerDeliveryBarrier(ctx, eventIndex, kind) {
|
|
|
144
265
|
resolve();
|
|
145
266
|
};
|
|
146
267
|
// Safety net: if this delivery is never delivered to the workflow (its
|
|
147
|
-
// branch was not taken / the run is suspending
|
|
148
|
-
// later
|
|
268
|
+
// branch was not taken / the run is suspending, or a buffered hook payload
|
|
269
|
+
// is only claimed after a later delivery the workflow is still waiting on),
|
|
270
|
+
// resolve at idle so a later delivery gated on it cannot deadlock and the
|
|
149
271
|
// registry cannot leak an entry per abandoned delivery.
|
|
150
272
|
scheduleWhenIdle(ctx, finish);
|
|
151
|
-
return {
|
|
273
|
+
return {
|
|
274
|
+
markDelivered: finish,
|
|
275
|
+
arm: () => {
|
|
276
|
+
entry.armed = true;
|
|
277
|
+
},
|
|
278
|
+
};
|
|
152
279
|
}
|
|
153
280
|
/**
|
|
154
281
|
* Schedule a callback to fire only after all pending data deliveries
|
|
@@ -184,4 +311,4 @@ export function scheduleWhenIdle(ctx, fn) {
|
|
|
184
311
|
};
|
|
185
312
|
setTimeout(check, 0);
|
|
186
313
|
}
|
|
187
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpdmF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wcml2YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBZWhELE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0FBRXpFLE1BQU0sYUFBYSxHQUVmLFVBQVUsQ0FBQztBQUVmLHdEQUF3RDtBQUN4RCxNQUFNLGVBQWUsR0FBRyxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLElBQUksR0FBRyxFQUduRSxDQUFDLENBQUM7QUFFTCxNQUFNLDJCQUEyQixHQUFHLElBQUksR0FBRyxDQUFDO0lBQzFDLGlDQUFpQztJQUNqQyx5QkFBeUI7SUFDekIseUJBQXlCO0NBQzFCLENBQUMsQ0FBQztBQUVILFNBQVMsd0JBQXdCLENBQUMsTUFBYztJQUM5QyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLE1BQU0sRUFBRSxDQUFDO1FBQzlDLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1QixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEIsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBRTVDLE1BQU0sUUFBUSxHQUFHLENBQUMsZUFBdUIsRUFBRSxFQUFFO1FBQzNDLElBQUksZUFBZSxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQ25DLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN6QyxDQUFDO0lBQ0gsQ0FB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aWxzIHVzZWQgYnkgdGhlIGJ1bmRsZXIgd2hlbiB0cmFuc2Zvcm1pbmcgY29kZVxuICovXG5cbmltcG9ydCB7IHdpdGhSZXNvbHZlcnMgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBDcnlwdG9LZXkgfSBmcm9tICcuL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHR5cGUgeyBFdmVudHNDb25zdW1lciB9IGZyb20gJy4vZXZlbnRzLWNvbnN1bWVyLmpzJztcbmltcG9ydCB0eXBlIHsgUXVldWVJdGVtIH0gZnJvbSAnLi9nbG9iYWwuanMnO1xuaW1wb3J0IHR5cGUgeyBTZXJpYWxpemFibGUgfSBmcm9tICcuL3NjaGVtYXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGVwSHlkcmF0aW9uQ2FjaGUgfSBmcm9tICcuL3N0ZXAtaHlkcmF0aW9uLWNhY2hlLmpzJztcblxuZXhwb3J0IHR5cGUgU3RlcEZ1bmN0aW9uPFxuICBBcmdzIGV4dGVuZHMgU2VyaWFsaXphYmxlW10gPSBhbnlbXSxcbiAgUmVzdWx0IGV4dGVuZHMgU2VyaWFsaXphYmxlIHwgdW5rbm93biA9IHVua25vd24sXG4+ID0gKCguLi5hcmdzOiBBcmdzKSA9PiBQcm9taXNlPFJlc3VsdD4pICYge1xuICBtYXhSZXRyaWVzPzogbnVtYmVyO1xuICBzdGVwSWQ/OiBzdHJpbmc7XG59O1xuXG5jb25zdCBSZWdpc3RlcmVkU3RlcHNLZXkgPSBTeW1ib2wuZm9yKCdAd29ya2Zsb3cvY29yZS8vcmVnaXN0ZXJlZFN0ZXBzJyk7XG5cbmNvbnN0IGdsb2JhbFN5bWJvbHM6IHR5cGVvZiBnbG9iYWxUaGlzICYge1xuICBbUmVnaXN0ZXJlZFN0ZXBzS2V5XT86IE1hcDxzdHJpbmcsIFN0ZXBGdW5jdGlvbj47XG59ID0gZ2xvYmFsVGhpcztcblxuLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0Fzc2lnbkluRXhwcmVzc2lvbnM6IC9cbmNvbnN0IHJlZ2lzdGVyZWRTdGVwcyA9IChnbG9iYWxTeW1ib2xzW1JlZ2lzdGVyZWRTdGVwc0tleV0gPz89IG5ldyBNYXA8XG4gIHN0cmluZyxcbiAgU3RlcEZ1bmN0aW9uXG4+KCkpO1xuXG5jb25zdCBCVUlMVElOX1JFU1BPTlNFX1NURVBfTkFNRVMgPSBuZXcgU2V0KFtcbiAgJ19fYnVpbHRpbl9yZXNwb25zZV9hcnJheV9idWZmZXInLFxuICAnX19idWlsdGluX3Jlc3BvbnNlX2pzb24nLFxuICAnX19idWlsdGluX3Jlc3BvbnNlX3RleHQnLFxuXSk7XG5cbmZ1bmN0aW9uIGdldFN0ZXBJZEFsaWFzQ2FuZGlkYXRlcyhzdGVwSWQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcGFydHMgPSBzdGVwSWQuc3BsaXQoJy8vJyk7XG4gIGlmIChwYXJ0cy5sZW5ndGggIT09IDMgfHwgcGFydHNbMF0gIT09ICdzdGVwJykge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IG1vZHVsZVBhdGggPSBwYXJ0c1sxXTtcbiAgY29uc3QgZm5OYW1lID0gcGFydHNbMl07XG4gIGNvbnN0IG1vZHVsZVBhdGhBbGlhc2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgY29uc3QgYWRkQWxpYXMgPSAoYWxpYXNNb2R1bGVQYXRoOiBzdHJpbmcpID0+IHtcbiAgICBpZiAoYWxpYXNNb2R1bGVQYXRoICE9PSBtb2R1bGVQYXRoKSB7XG4gICAgICBtb2R1bGVQYXRoQWxpYXNlcy5hZGQoYWxpYXNNb2R1bGVQYXRoKTtcbiAgICB9XG4gIH07XG5cbiAgaWYgKG1vZHVsZVBhdGguc3RhcnRzV2l0aCgnLi93b3JrZmxvd3MvJykpIHtcbiAgICBjb25zdCB3b3JrZmxvd1JlbGF0aXZlUGF0aCA9IG1vZHVsZVBhdGguc2xpY2UoJy4vJy5sZW5ndGgpO1xuICAgIGFkZEFsaWFzKGAuL2V4YW1wbGUvJHt3b3JrZmxvd1JlbGF0aXZlUGF0aH1gKTtcbiAgICBhZGRBbGlhcyhgLi9zcmMvJHt3b3JrZmxvd1JlbGF0aXZlUGF0aH1gKTtcbiAgfSBlbHNlIGlmIChtb2R1bGVQYXRoLnN0YXJ0c1dpdGgoJy4vZXhhbXBsZS93b3JrZmxvd3MvJykpIHtcbiAgICBjb25zdCB3b3JrZmxvd1JlbGF0aXZlUGF0aCA9IG1vZHVsZVBhdGguc2xpY2UoJy4vZXhhbXBsZS8nLmxlbmd0aCk7XG4gICAgYWRkQWxpYXMoYC4vJHt3b3JrZmxvd1JlbGF0aXZlUGF0aH1gKTtcbiAgICBhZGRBbGlhcyhgLi9zcmMvJHt3b3JrZmxvd1JlbGF0aXZlUGF0aH1gKTtcbiAgfSBlbHNlIGlmIChtb2R1bGVQYXRoLnN0YXJ0c1dpdGgoJy4vc3JjL3dvcmtmbG93cy8nKSkge1xuICAgIGNvbnN0IHdvcmtmbG93UmVsYXRpdmVQYXRoID0gbW9kdWxlUGF0aC5zbGljZSgnLi9zcmMvJy5sZW5ndGgpO1xuICAgIGFkZEFsaWFzKGAuLyR7d29ya2Zsb3dSZWxhdGl2ZVBhdGh9YCk7XG4gICAgYWRkQWxpYXMoYC4vZXhhbXBsZS8ke3dvcmtmbG93UmVsYXRpdmVQYXRofWApO1xuICB9XG5cbiAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgbW9kdWxlUGF0aEFsaWFzZXMsXG4gICAgKGFsaWFzTW9kdWxlUGF0aCkgPT4gYHN0ZXAvLyR7YWxpYXNNb2R1bGVQYXRofS8vJHtmbk5hbWV9YFxuICApO1xufVxuXG5mdW5jdGlvbiBnZXRCdWlsdGluUmVzcG9uc2VTdGVwQWxpYXMoc3RlcElkOiBzdHJpbmcpOiBTdGVwRnVuY3Rpb24gfCB1bmRlZmluZWQge1xuICBpZiAoIUJVSUxUSU5fUkVTUE9OU0VfU1RFUF9OQU1FUy5oYXMoc3RlcElkKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBmb3IgKGNvbnN0IFtyZWdpc3RlcmVkU3RlcElkLCBzdGVwRm5dIG9mIHJlZ2lzdGVyZWRTdGVwcy5lbnRyaWVzKCkpIHtcbiAgICBpZiAocmVnaXN0ZXJlZFN0ZXBJZC5lbmRzV2l0aChgLy8ke3N0ZXBJZH1gKSkge1xuICAgICAgcmV0dXJuIHN0ZXBGbjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVyIGEgc3RlcCBmdW5jdGlvbiB0byBiZSBzZXJ2ZWQgaW4gdGhlIHNlcnZlciBidW5kbGUuXG4gKiBBbHNvIHNldHMgdGhlIHN0ZXBJZCBwcm9wZXJ0eSBvbiB0aGUgZnVuY3Rpb24gZm9yIHNlcmlhbGl6YXRpb24gc3VwcG9ydC5cbiAqXG4gKiBOb3RlOiBUaGUgU1dDIGNvbXBpbGVyIHBsdWdpbiBubyBsb25nZXIgZ2VuZXJhdGVzIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24uXG4gKiBTdGVwIHJlZ2lzdHJhdGlvbiBpcyBub3cgaW5saW5lZCBhcyBhIHNlbGYtY29udGFpbmVkIElJRkUgdGhhdCB3cml0ZXNcbiAqIGRpcmVjdGx5IHRvIHRoZSBnbG9iYWwgTWFwIGF0IFN5bWJvbC5mb3IoXCJAd29ya2Zsb3cvY29yZS8vcmVnaXN0ZXJlZFN0ZXBzXCIpLlxuICogVGhpcyBmdW5jdGlvbiBpcyBrZXB0IGZvciBpbnRlcm5hbC90ZXN0IHVzZSBvbmx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJTdGVwRnVuY3Rpb24oc3RlcElkOiBzdHJpbmcsIHN0ZXBGbjogU3RlcEZ1bmN0aW9uKSB7XG4gIHJlZ2lzdGVyZWRTdGVwcy5zZXQoc3RlcElkLCBzdGVwRm4pO1xuICBzdGVwRm4uc3RlcElkID0gc3RlcElkO1xufVxuXG4vKipcbiAqIEZpbmQgYSByZWdpc3RlcmVkIHN0ZXAgZnVuY3Rpb24gYnkgbmFtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RlcEZ1bmN0aW9uKHN0ZXBJZDogc3RyaW5nKTogU3RlcEZ1bmN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGlyZWN0TWF0Y2ggPSByZWdpc3RlcmVkU3RlcHMuZ2V0KHN0ZXBJZCk7XG4gIGlmIChkaXJlY3RNYXRjaCkge1xuICAgIHJldHVybiBkaXJlY3RNYXRjaDtcbiAgfVxuXG4gIC8vIFN1cHBvcnQgZXF1aXZhbGVudCB3b3JrZmxvdyBwYXRoIGFsaWFzZXMgaW4gbWl4ZWQgc3ltbGluayBlbnZpcm9ubWVudHMuXG4gIGZvciAoY29uc3QgYWxpYXNTdGVwSWQgb2YgZ2V0U3RlcElkQWxpYXNDYW5kaWRhdGVzKHN0ZXBJZCkpIHtcbiAgICBjb25zdCBhbGlhc01hdGNoID0gcmVnaXN0ZXJlZFN0ZXBzLmdldChhbGlhc1N0ZXBJZCk7XG4gICAgaWYgKGFsaWFzTWF0Y2gpIHtcbiAgICAgIHJldHVybiBhbGlhc01hdGNoO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGJ1aWx0aW5BbGlhc01hdGNoID0gZ2V0QnVpbHRpblJlc3BvbnNlU3RlcEFsaWFzKHN0ZXBJZCk7XG4gIGlmIChidWlsdGluQWxpYXNNYXRjaCkge1xuICAgIHJldHVybiBidWlsdGluQWxpYXNNYXRjaDtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8vIE5vdGU6IF9fcHJpdmF0ZV9nZXRDbG9zdXJlVmFycyBpcyBubyBsb25nZXIgcmUtZXhwb3J0ZWQgaGVyZS5cbi8vIFRoZSBTV0MgY29tcGlsZXIgcGx1Z2luIG5vdyBpbmxpbmVzIGNsb3N1cmUgdmFyaWFibGUgYWNjZXNzIGFzIGFcbi8vIHNlbGYtY29udGFpbmVkIElJRkUgdGhhdCByZWFkcyBkaXJlY3RseSBmcm9tIHRoZSBnbG9iYWwgQXN5bmNMb2NhbFN0b3JhZ2Vcbi8vIGF0IFN5bWJvbC5mb3IoXCJXT1JLRkxPV19TVEVQX0NPTlRFWFRfU1RPUkFHRVwiKS5cblxuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQge1xuICBydW5JZDogc3RyaW5nO1xuICBlbmNyeXB0aW9uS2V5OiBDcnlwdG9LZXkgfCB1bmRlZmluZWQ7XG4gIGdsb2JhbFRoaXM6IHR5cGVvZiBnbG9iYWxUaGlzO1xuICBldmVudHNDb25zdW1lcjogRXZlbnRzQ29uc3VtZXI7XG4gIC8qKlxuICAgKiBNYXAgb2YgcGVuZGluZyBpbnZvY2F0aW9ucyBrZXllZCBieSBjb3JyZWxhdGlvbklkLlxuICAgKiBVc2luZyBNYXAgaW5zdGVhZCBvZiBBcnJheSBmb3IgTygxKSBsb29rdXAvZGVsZXRlIG9wZXJhdGlvbnMuXG4gICAqL1xuICBpbnZvY2F0aW9uc1F1ZXVlOiBNYXA8c3RyaW5nLCBRdWV1ZUl0ZW0+O1xuICBvbldvcmtmbG93RXJyb3I6IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG4gIGdlbmVyYXRlVWxpZDogKCkgPT4gc3RyaW5nO1xuICBnZW5lcmF0ZU5hbm9pZDogKCkgPT4gc3RyaW5nO1xuICAvKipcbiAgICogU2VxdWVudGlhbCBwcm9taXNlIHF1ZXVlIHRoYXQgZW5zdXJlcyBhbGwgZXZlbnQtZHJpdmVuIHByb21pc2UgcmVzb2x1dGlvbnNcbiAgICogKHN0ZXAgcmVzdWx0cywgaG9vayBwYXlsb2FkcywgZmFpbHVyZXMsIHN1c3BlbnNpb25zKSBoYXBwZW4gaW4gZXZlbnQgbG9nXG4gICAqIG9yZGVyLiBFdmVyeSByZXNvbHZlLCByZWplY3QsIG9yIHdvcmtmbG93IGVycm9yIGlzIGNoYWluZWQgdGhyb3VnaCB0aGlzXG4gICAqIHF1ZXVlIHNvIHRoYXQgZXZlbiBpZiBpbmRpdmlkdWFsIG9wZXJhdGlvbnMgdGFrZSB2YXJpYWJsZSB0aW1lIChlLmcuLFxuICAgKiBhc3luYyBkZWNyeXB0aW9uKSwgcHJvbWlzZXMgcmVzb2x2ZSBkZXRlcm1pbmlzdGljYWxseS5cbiAgICovXG4gIHByb21pc2VRdWV1ZTogUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIENvdW50ZXIgb2YgaW4tZmxpZ2h0IGFzeW5jIGRhdGEgZGVsaXZlcnkgb3BlcmF0aW9ucyAoc3RlcCByZXN1bHRcbiAgICogaHlkcmF0aW9uLCBob29rIHBheWxvYWQgaHlkcmF0aW9uLCBhYm9ydCBzaWduYWwgaHlkcmF0aW9uKS4gU3VzcGVuc2lvbnNcbiAgICogbXVzdCB3YWl0IGZvciB0aGlzIHRvIHJlYWNoIDAgYmVmb3JlIGZpcmluZywgdG8gYXZvaWQgcHJlZW1wdGluZyBkYXRhXG4gICAqIGRlbGl2ZXJ5IOKAlCBlLmcuIGRlaHlkcmF0aW5nIGEgc3RlcCdzIGFyZ3VtZW50cyB3aGlsZSBhbiBhYm9ydCB0aGF0IHNob3VsZFxuICAgKiBiZSByZWZsZWN0ZWQgaW4gdGhvc2UgYXJndW1lbnRzIGlzIHN0aWxsIGh5ZHJhdGluZyBpdHMgcmVhc29uLlxuICAgKi9cbiAgcGVuZGluZ0RlbGl2ZXJpZXM6IG51bWJlcjtcbiAgLyoqXG4gICAqIE9yZGVyZWQgcmVnaXN0cnkgb2YgaW4tZmxpZ2h0IFwiYnJhbmNoLWRlY2lkaW5nXCIgZGVsaXZlcmllcyDigJQgdGhlXG4gICAqIHJlc29sdXRpb25zIGEgd29ya2Zsb3cgdHlwaWNhbGx5IGBQcm9taXNlLnJhY2VgcyBvbjogYnVmZmVyZWQgaG9va1xuICAgKiBwYXlsb2FkcyAoYGhvb2tfcmVjZWl2ZWRgKSBhbmQgd2FpdCBjb21wbGV0aW9ucyAoYHdhaXRfY29tcGxldGVkYCkuXG4gICAqIEtleWVkIGJ5IHRoZSBkZWxpdmVyeSdzIHBvc2l0aW9uIChpbmRleCkgaW4gdGhlIGNvbnN1bWVkIGV2ZW50IGxvZy5cbiAgICpcbiAgICogVGhlIHByb2JsZW06IGEgYnVmZmVyZWQgaG9vayBwYXlsb2FkIGlzIG9ic2VydmVkIHZpYSB0aGUgYXN5bmMgaG9va1xuICAgKiBpdGVyYXRvciAoYHlpZWxkIGF3YWl0IHRoaXNgKSwgY29zdGluZyBleHRyYSBtaWNyb3Rhc2sgaG9wcywgd2hpbGUgYVxuICAgKiBgd2FpdF9jb21wbGV0ZWRgIHJlc29sdmVzIHdpdGggZmV3ZXIgaG9wcyDigJQgYW5kIGEgcmV1c2VkIHNsZWVwIGNhblxuICAgKiByZXNvbHZlIGluIGFuIGVudGlyZWx5IGVhcmxpZXIgbG9vcCBpdGVyYXRpb24uIEVpdGhlciB3YXksIHRoZVxuICAgKiByZXNvbHV0aW9uIHRoYXQgdGhlIGNvbW1pdHRlZCBldmVudCBsb2cgb3JkZXJlZCBmaXJzdCBjYW4gbG9zZSBhXG4gICAqIGBQcm9taXNlLnJhY2VgIHRvIGEgZmFzdGVyLSBvciBhbHJlYWR5LXJlc29sdmVkIGNvbXBldGl0b3IsIGRpdmVyZ2luZ1xuICAgKiBmcm9tIHRoZSBsb2cgYW5kIHN1cmZhY2luZyBhcyBgQ29ycnVwdGVkRXZlbnRMb2dFcnJvcmAuXG4gICAqXG4gICAqIFRoZSBmaXggaXMgYSBzdHJpY3QsIGRldGVybWluaXN0aWMgZGVsaXZlcnkgb3JkZXIgYW5jaG9yZWQgb25cbiAgICogZXZlbnQtbG9nIHBvc2l0aW9uOiBhIGRlbGl2ZXJ5IGRvZXMgbm90IHJlc29sdmUgdG8gdGhlIHdvcmtmbG93IHVudGlsXG4gICAqIGV2ZXJ5IGVhcmxpZXItaW4tbG9nIGRlbGl2ZXJ5IG9mIHRoZSBPUFBPU0lURSBraW5kIGhhcyBiZWVuIGRlbGl2ZXJlZC5cbiAgICogKE9wcG9zaXRlIGtpbmQgb25seTogc2VxdWVudGlhbCBzYW1lLWtpbmQgaG9vayBwYXlsb2FkcyBtdXN0IG5vdCBibG9ja1xuICAgKiBvbmUgYW5vdGhlciwgYW5kIGEgd2FpdCBuZWVkIG5vdCB3YWl0IGJlaGluZCBhIGxhdGVyIHdhaXQuKSBCZWNhdXNlIHRoZVxuICAgKiBnYXRlIGlzIFwidGhlIGVhcmxpZXIgZGVsaXZlcnkgcmVzb2x2ZWRcIiwgbm90IFwid29uIGEgdGltaW5nIHJhY2VcIiwgdGhlXG4gICAqIG91dGNvbWUgaXMgaW5kZXBlbmRlbnQgb2YgbWljcm90YXNrIGhvcHMsIGh5ZHJhdGlvbi9kZWNyeXB0aW9uIHRpbWUsXG4gICAqIGFuZCBgUHJvbWlzZS5yYWNlYCBhcmd1bWVudCBvcmRlci5cbiAgICpcbiAgICogSW5kZXggaXMgdXNlZCByYXRoZXIgdGhhbiB0aGUgYGV2ZW50SWRgIHN0cmluZyBiZWNhdXNlIGBldmVudElkYCBpcyBhblxuICAgKiBvcGFxdWUsIHdvcmxkLWFzc2lnbmVkIHZhbHVlIG5vdCBndWFyYW50ZWVkIHRvIHNvcnQgaW4gY3JlYXRpb24gb3JkZXJcbiAgICogKG9ubHkgdGhlIGJ1bmRsZWQgVUxJRCB3b3JsZHMgaGFwcGVuIHRvKS5cbiAgICpcbiAgICogT3B0aW9uYWwgc28gb2xkZXIvb3V0LW9mLXRyZWUgY29udGV4dHMgKGFuZCBsaWdodHdlaWdodCB0ZXN0IGhhcm5lc3NlcylcbiAgICogdGhhdCBkbyBub3QgaW5pdGlhbGl6ZSBpdCBkZWdyYWRlIGdyYWNlZnVsbHkgdG8gdGhlIHByZXZpb3VzIGJlaGF2aW9yLlxuICAgKi9cbiAgcGVuZGluZ0RlbGl2ZXJ5QmFycmllcnM/OiBNYXA8bnVtYmVyLCBEZWxpdmVyeUJhcnJpZXJFbnRyeT47XG4gIC8qKlxuICAgKiBQZXItcnVuIG1lbW9pemF0aW9uIGNhY2hlIGZvciBoeWRyYXRlZCBzdGVwIHJldHVybiB2YWx1ZXMsIGtleWVkIGJ5IHRoZVxuICAgKiBgc3RlcF9jb21wbGV0ZWRgIGV2ZW50IGlkLiBPd25lZCBieSB0aGUgaW5saW5lIHJlcGxheSBsb29wIGluIGBydW50aW1lLnRzYFxuICAgKiBhbmQgdGhyZWFkZWQgdGhyb3VnaCBlYWNoIGBydW5Xb3JrZmxvd2AgY2FsbCBzbyBpdCBzdXJ2aXZlcyBhY3Jvc3MgcmVwbGF5XG4gICAqIGl0ZXJhdGlvbnMgb2YgdGhlIFNBTUUgcnVuIChhIGZyZXNoIGNvbnRleHQgaXMgY3JlYXRlZCBlYWNoIGl0ZXJhdGlvbikgYnV0XG4gICAqIG5ldmVyIGxlYWtzIGFjcm9zcyB1bnJlbGF0ZWQgcnVucy5cbiAgICpcbiAgICogT24gcmVwbGF5IEsgb2YgYSBzZXF1ZW50aWFsIE4tc3RlcCB3b3JrZmxvdywgdGhlIHN0ZXAgY29uc3VtZXIgd291bGRcbiAgICogb3RoZXJ3aXNlIHJlLWRlY3J5cHQgYW5kIHJlLXBhcnNlIHRoZSByZXN1bHRzIG9mIGFsbCBLIGFscmVhZHktY29tcGxldGVkXG4gICAqIHN0ZXBzIOKAlCBPKE7CsikgYWNyb3NzIGFuIGludm9jYXRpb24uIFRoaXMgY2FjaGUgbWFrZXMgYSBjb21wbGV0ZWQgc3RlcCdzXG4gICAqIHJlc3VsdCBhdmFpbGFibGUgaW4gTygxKSBvbiBzdWJzZXF1ZW50IHJlcGxheXMuIE9ubHkgcHJpbWl0aXZlIHJlc3VsdHMgYXJlXG4gICAqIG1lbW9pemVkLCBzbyBhIHNoYXJlZCByZWZlcmVuY2UgY2FuIG5ldmVyIGxldCBvbmUgcmVwbGF5J3MgbXV0YXRpb24gbGVha1xuICAgKiBpbnRvIHRoZSBuZXh0OyBzZWUgYHN0ZXAtaHlkcmF0aW9uLWNhY2hlLnRzYCBmb3IgdGhlIGZ1bGwgcmF0aW9uYWxlLlxuICAgKlxuICAgKiBPcHRpb25hbCBzbyBjb250ZXh0cyB0aGF0IGRvIG5vdCBpbml0aWFsaXplIGl0ICh0ZXN0IGhhcm5lc3NlcykgZGVncmFkZVxuICAgKiBncmFjZWZ1bGx5IHRvIHJlLWh5ZHJhdGluZyBldmVyeSByZXBsYXkg4oCUIGlkZW50aWNhbCB0byBwcmV2aW91cyBiZWhhdmlvci5cbiAgICovXG4gIHN0ZXBIeWRyYXRpb25DYWNoZT86IFN0ZXBIeWRyYXRpb25DYWNoZTtcbn1cblxuLyoqIFRoZSBraW5kIG9mIGJyYW5jaC1kZWNpZGluZyBkZWxpdmVyeSBhIGJhcnJpZXIgcmVwcmVzZW50cy4gKi9cbmV4cG9ydCB0eXBlIERlbGl2ZXJ5S2luZCA9ICdob29rJyB8ICd3YWl0JztcblxuaW50ZXJmYWNlIERlbGl2ZXJ5QmFycmllckVudHJ5IHtcbiAga2luZDogRGVsaXZlcnlLaW5kO1xuICAvKiogUmVzb2x2ZXMgb25jZSB0aGlzIGRlbGl2ZXJ5IGhhcyByZXNvbHZlZCB0byB0aGUgd29ya2Zsb3cuICovXG4gIGRlbGl2ZXJlZDogUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBBd2FpdHMsIGluIHN0cmljdCBldmVudC1sb2cgb3JkZXIsIGV2ZXJ5IHN0aWxsLXJlZ2lzdGVyZWQgZGVsaXZlcnkgd2hvc2VcbiAqIGluZGV4IGlzIGVhcmxpZXIgdGhhbiBgZXZlbnRJbmRleGAgQU5EIHdob3NlIGtpbmQgaXMgaW4gYGRlZmVyQmVoaW5kS2luZHNgLFxuICogc28gdGhhdCB0aGlzIHJlc29sdXRpb24gaXMgaGFuZGVkIHRvIHRoZSB3b3JrZmxvdyBvbmx5IGFmdGVyIGFsbCByZWxldmFudFxuICogZWFybGllci1pbi1sb2cgZGVsaXZlcmllcyBoYXZlIGJlZW4uIFRoaXMgaXMgd2hhdCBrZWVwcyBhIGBQcm9taXNlLnJhY2VgXG4gKiBkZXRlcm1pbmlzdGljIGFuZCBhbGlnbmVkIHdpdGggdGhlIGNvbW1pdHRlZCBldmVudCBsb2csIGluZGVwZW5kZW50IG9mXG4gKiBtaWNyb3Rhc2staG9wIGNvdW50cywgaHlkcmF0aW9uIHRpbWUsIG9yIHJhY2UtYXJndW1lbnQgb3JkZXIuXG4gKlxuICogYGRlZmVyQmVoaW5kS2luZHNgIGlzIHRoZSBvcHBvc2l0ZSBraW5kKHMpOiBhIGhvb2sgZGVmZXJzIGJlaGluZCBlYXJsaWVyXG4gKiBXQUlUUyAobm90IGVhcmxpZXIgaG9va3Mg4oCUIHRob3NlIGFyZSBzZXF1ZW50aWFsIHNhbWUtZW50aXR5IHBheWxvYWRzKSwgYVxuICogd2FpdCBkZWZlcnMgYmVoaW5kIGVhcmxpZXIgSE9PS1MuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzKFxuICBjdHg6IFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dCxcbiAgZXZlbnRJbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICBkZWZlckJlaGluZEtpbmRzOiByZWFkb25seSBEZWxpdmVyeUtpbmRbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIERlZmVuc2l2ZTogdG9sZXJhdGUgY29udGV4dHMgdGhhdCBwcmVkYXRlIHRoaXMgZmllbGQgKHRlc3QgaGFybmVzc2VzKS5cbiAgaWYgKFxuICAgIGV2ZW50SW5kZXggPT09IHVuZGVmaW5lZCB8fFxuICAgICFjdHgucGVuZGluZ0RlbGl2ZXJ5QmFycmllcnMgfHxcbiAgICBjdHgucGVuZGluZ0RlbGl2ZXJ5QmFycmllcnMuc2l6ZSA9PT0gMFxuICApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgZWFybGllcjogUHJvbWlzZTx2b2lkPltdID0gW107XG4gIGZvciAoY29uc3QgW2luZGV4LCBlbnRyeV0gb2YgY3R4LnBlbmRpbmdEZWxpdmVyeUJhcnJpZXJzKSB7XG4gICAgaWYgKGluZGV4IDwgZXZlbnRJbmRleCAmJiBkZWZlckJlaGluZEtpbmRzLmluY2x1ZGVzKGVudHJ5LmtpbmQpKSB7XG4gICAgICBlYXJsaWVyLnB1c2goZW50cnkuZGVsaXZlcmVkKTtcbiAgICB9XG4gIH1cbiAgaWYgKGVhcmxpZXIubGVuZ3RoID4gMCkge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKGVhcmxpZXIpO1xuICB9XG59XG5cbi8qKiBIYW5kbGUgZm9yIGEgcmVnaXN0ZXJlZCBicmFuY2gtZGVjaWRpbmcgZGVsaXZlcnkgYmFycmllci4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVsaXZlcnlCYXJyaWVyIHtcbiAgLyoqXG4gICAqIE1hcmsgdGhpcyBkZWxpdmVyeSBhcyBkZWxpdmVyZWQgdG8gdGhlIHdvcmtmbG93LiBSZXNvbHZlcyBpdHNcbiAgICogYGRlbGl2ZXJlZGAgcHJvbWlzZSBzbyBhbnkgbGF0ZXItaW4tbG9nIG9wcG9zaXRlLWtpbmQgZGVsaXZlcnkgZ2F0ZWQgb25cbiAgICogaXQgKHZpYSB7QGxpbmsgYXdhaXRFYXJsaWVyRGVsaXZlcmllc30pIG1heSBwcm9jZWVkLCBhbmQgcmVtb3ZlcyBpdCBmcm9tXG4gICAqIHRoZSByZWdpc3RyeS4gSWRlbXBvdGVudC5cbiAgICovXG4gIG1hcmtEZWxpdmVyZWQ6ICgpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgYSBicmFuY2gtZGVjaWRpbmcgZGVsaXZlcnkgYXQgaXRzIGV2ZW50LWxvZyBpbmRleCBzbyB0aGF0IGxhdGVyXG4gKiBvcHBvc2l0ZS1raW5kIGRlbGl2ZXJpZXMgY2FuIGJlIG9yZGVyZWQgc3RyaWN0bHkgYWZ0ZXIgaXQuIFJldHVybnMgYW4gaW5lcnRcbiAqIGhhbmRsZSB3aGVuIGBwZW5kaW5nRGVsaXZlcnlCYXJyaWVyc2AgaXMgbm90IGluaXRpYWxpemVkLlxuICpcbiAqIFRvIGd1YXJhbnRlZSBhIGxhdGVyIGRlbGl2ZXJ5IGdhdGVkIG9uIHRoaXMgb25lIGNhbiBuZXZlciBoYW5nIHdoZW4gdGhpc1xuICogZGVsaXZlcnkgaXMgYWJhbmRvbmVkICh0aGUgd29ya2Zsb3cgdG9vayBhIGRpZmZlcmVudCBicmFuY2ggb3IgaXNcbiAqIHN1c3BlbmRpbmcgYW5kIG5ldmVyIG9ic2VydmVzIGl0KSwgdGhlIGJhcnJpZXIgYXV0by1yZXNvbHZlcyBhdCBpZGxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJEZWxpdmVyeUJhcnJpZXIoXG4gIGN0eDogV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0LFxuICBldmVudEluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQsXG4gIGtpbmQ6IERlbGl2ZXJ5S2luZFxuKTogRGVsaXZlcnlCYXJyaWVyIHtcbiAgY29uc3QgYmFycmllcnMgPSBjdHgucGVuZGluZ0RlbGl2ZXJ5QmFycmllcnM7XG4gIGlmICghYmFycmllcnMgfHwgZXZlbnRJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHsgbWFya0RlbGl2ZXJlZDogKCkgPT4ge30gfTtcbiAgfVxuXG4gIGxldCBkb25lID0gZmFsc2U7XG4gIGNvbnN0IHsgcHJvbWlzZSwgcmVzb2x2ZSB9ID0gd2l0aFJlc29sdmVyczx2b2lkPigpO1xuICBjb25zdCBlbnRyeTogRGVsaXZlcnlCYXJyaWVyRW50cnkgPSB7IGtpbmQsIGRlbGl2ZXJlZDogcHJvbWlzZSB9O1xuICBiYXJyaWVycy5zZXQoZXZlbnRJbmRleCwgZW50cnkpO1xuXG4gIGNvbnN0IGZpbmlzaCA9ICgpID0+IHtcbiAgICBpZiAoZG9uZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkb25lID0gdHJ1ZTtcbiAgICBpZiAoYmFycmllcnMuZ2V0KGV2ZW50SW5kZXgpID09PSBlbnRyeSkge1xuICAgICAgYmFycmllcnMuZGVsZXRlKGV2ZW50SW5kZXgpO1xuICAgIH1cbiAgICByZXNvbHZlKCk7XG4gIH07XG5cbiAgLy8gU2FmZXR5IG5ldDogaWYgdGhpcyBkZWxpdmVyeSBpcyBuZXZlciBkZWxpdmVyZWQgdG8gdGhlIHdvcmtmbG93IChpdHNcbiAgLy8gYnJhbmNoIHdhcyBub3QgdGFrZW4gLyB0aGUgcnVuIGlzIHN1c3BlbmRpbmcpLCByZXNvbHZlIGF0IGlkbGUgc28gYVxuICAvLyBsYXRlciBvcHBvc2l0ZS1raW5kIGRlbGl2ZXJ5IGdhdGVkIG9uIGl0IGNhbm5vdCBkZWFkbG9jayBhbmQgdGhlXG4gIC8vIHJlZ2lzdHJ5IGNhbm5vdCBsZWFrIGFuIGVudHJ5IHBlciBhYmFuZG9uZWQgZGVsaXZlcnkuXG4gIHNjaGVkdWxlV2hlbklkbGUoY3R4LCBmaW5pc2gpO1xuXG4gIHJldHVybiB7IG1hcmtEZWxpdmVyZWQ6IGZpbmlzaCB9O1xufVxuXG4vKipcbiAqIFNjaGVkdWxlIGEgY2FsbGJhY2sgdG8gZmlyZSBvbmx5IGFmdGVyIGFsbCBwZW5kaW5nIGRhdGEgZGVsaXZlcmllc1xuICogKHN0ZXAgcmVzdWx0cywgaG9vayBwYXlsb2FkcykgYW5kIGFzeW5jIGRlc2VyaWFsaXphdGlvbiBoYXZlIGNvbXBsZXRlZC5cbiAqIFVzZXMgYSBwb2xsaW5nIGxvb3A6IHNldFRpbWVvdXQoMCkg4oaSIGNoZWNrIHBlbmRpbmdEZWxpdmVyaWVzIOKGklxuICogaWYgPiAwLCB3YWl0IGZvciBwcm9taXNlUXVldWUg4oaSIHJlcGVhdC4gVGhpcyBoYW5kbGVzIHRoZSBtdWx0aS1yb3VuZFxuICogZGVsaXZlcnkgcGF0dGVybiB3aGVyZSBlYWNoIGhvb2sgcGF5bG9hZCBkZWxpdmVyeSBjeWNsZSBhcHBlbmRzIG5ld1xuICogYXN5bmMgd29yayB0byB0aGUgcHJvbWlzZVF1ZXVlLlxuICpcbiAqIFRoZSBpbml0aWFsIGBzZXRUaW1lb3V0KDApYCBtYWNyb3Rhc2sgaXMgbG9hZC1iZWFyaW5nIGFuZCBtdXN0IE5PVCBiZVxuICogZG93bmdyYWRlZCB0byBhIG1pY3JvdGFzayAoYHF1ZXVlTWljcm90YXNrYC9gUHJvbWlzZS5yZXNvbHZlKCkudGhlbmApLlxuICogYHBlbmRpbmdEZWxpdmVyaWVzYCBvbmx5IGd1YXJkcyB0aGUgaG9zdC1zaWRlIGh5ZHJhdGlvbiB3aW5kb3c7IGJldHdlZW4gYVxuICogZGVsaXZlcnkncyBgcmVzb2x2ZSgpYCBhbmQgdGhlIHdvcmtmbG93IFZNIGJvZHkgcnVubmluZyBpdHMgY29udGludWF0aW9uIHRvXG4gKiByZWdpc3RlciB0aGUgbmV4dCBzdWJzY3JpYmVyLCBgcGVuZGluZ0RlbGl2ZXJpZXNgIGlzIGFscmVhZHkgMCBldmVuIHRob3VnaFxuICogdGhlIFZNIGlzIG1pZC1yZWFjdGlvbi4gTm9kZSBkb2VzIG5vdCBndWFyYW50ZWUgYSBtaWNyb3Rhc2sgc2NoZWR1bGVkIGluXG4gKiB0aGUgaG9zdCBjb250ZXh0IHNldHRsZXMgYWZ0ZXIgdGhlIGNyb3NzLVZNIHByb21pc2UgY2hhaW4gKHJlc29sdmUgaW4gaG9zdFxuICog4oaSIHdvcmtmbG93IGNvZGUgaW4gVk0g4oaSIHN1YnNjcmliZSBiYWNrIGluIGhvc3QpOyB0aGUgbWFjcm90YXNrIGJvdW5kYXJ5XG4gKiBnaXZlcyB0aGF0IGNoYWluIHRpbWUgdG8gcnVuLCBzbyB0aGUgc3VzcGVuc2lvbiBkb2VzIG5vdCBwcmVlbXB0IGEgc2libGluZ1xuICogZGVsaXZlcnkgc3RpbGwgaW4gZmxpZ2h0LiBFbXBpcmljYWxseSwgcmVwbGFjaW5nIGl0IHdpdGggYHF1ZXVlTWljcm90YXNrYFxuICogYnJlYWtzIGhvb2svc2xlZXAgYFByb21pc2UucmFjZWAgb3JkZXJpbmcgKENvcnJ1cHRlZEV2ZW50TG9nRXJyb3IpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2NoZWR1bGVXaGVuSWRsZShcbiAgY3R4OiBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQsXG4gIGZuOiAoKSA9PiB2b2lkXG4pOiB2b2lkIHtcbiAgY29uc3QgY2hlY2sgPSAoKSA9PiB7XG4gICAgaWYgKGN0eC5wZW5kaW5nRGVsaXZlcmllcyA+IDApIHtcbiAgICAgIC8vIFN0aWxsIGRlbGl2ZXJpbmcgZGF0YSDigJQgd2FpdCBmb3IgcXVldWUgdG8gZHJhaW4sIHRoZW4gcmUtY2hlY2tcbiAgICAgIGN0eC5wcm9taXNlUXVldWUudGhlbigoKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoY2hlY2ssIDApO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZuKCk7XG4gICAgfVxuICB9O1xuICBzZXRUaW1lb3V0KGNoZWNrLCAwKTtcbn1cbiJdfQ==
|
|
314
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpdmF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wcml2YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBZ0JoRCxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsaUNBQWlDLENBQUMsQ0FBQztBQUV6RSxNQUFNLGFBQWEsR0FFZixVQUFVLENBQUM7QUFFZix3REFBd0Q7QUFDeEQsTUFBTSxlQUFlLEdBQUcsQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsS0FBSyxJQUFJLEdBQUcsRUFHbkUsQ0FBQyxDQUFDO0FBRUwsTUFBTSwyQkFBMkIsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUMxQyxpQ0FBaUM7SUFDakMseUJBQXlCO0lBQ3pCLHlCQUF5QjtDQUMxQixDQUFDLENBQUM7QUFFSCxTQUFTLHdCQUF3QixDQUFDLE1BQWM7SUFDOUMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUM5QyxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUU1QyxNQUFNLFFBQVEsR0FBRyxDQUFDLGVBQXVCLEVBQUUsRUFBRTtRQUMzQyxJQUFJLGVBQWUsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUNuQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDekMsQ0FBQztJQUNILENB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QUFDO0FBQ3ZCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFV0aWxzIHVzZWQgYnkgdGhlIGJ1bmRsZXIgd2hlbiB0cmFuc2Zvcm1pbmcgY29kZVxuICovXG5cbmltcG9ydCB7IHdpdGhSZXNvbHZlcnMgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBXb3JsZENhcGFiaWxpdGllcyB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgdHlwZSB7IFBheWxvYWRLZXkgfSBmcm9tICcuL3NlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7IEV2ZW50c0NvbnN1bWVyIH0gZnJvbSAnLi9ldmVudHMtY29uc3VtZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBRdWV1ZUl0ZW0gfSBmcm9tICcuL2dsb2JhbC5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlcGxheVBheWxvYWRDYWNoZSB9IGZyb20gJy4vcmVwbGF5LXBheWxvYWQtY2FjaGUuanMnO1xuaW1wb3J0IHR5cGUgeyBTZXJpYWxpemFibGUgfSBmcm9tICcuL3NjaGVtYXMuanMnO1xuXG5leHBvcnQgdHlwZSBTdGVwRnVuY3Rpb248XG4gIEFyZ3MgZXh0ZW5kcyBTZXJpYWxpemFibGVbXSA9IGFueVtdLFxuICBSZXN1bHQgZXh0ZW5kcyBTZXJpYWxpemFibGUgfCB1bmtub3duID0gdW5rbm93bixcbj4gPSAoKC4uLmFyZ3M6IEFyZ3MpID0+IFByb21pc2U8UmVzdWx0PikgJiB7XG4gIG1heFJldHJpZXM/OiBudW1iZXI7XG4gIHN0ZXBJZD86IHN0cmluZztcbn07XG5cbmNvbnN0IFJlZ2lzdGVyZWRTdGVwc0tleSA9IFN5bWJvbC5mb3IoJ0B3b3JrZmxvdy9jb3JlLy9yZWdpc3RlcmVkU3RlcHMnKTtcblxuY29uc3QgZ2xvYmFsU3ltYm9sczogdHlwZW9mIGdsb2JhbFRoaXMgJiB7XG4gIFtSZWdpc3RlcmVkU3RlcHNLZXldPzogTWFwPHN0cmluZywgU3RlcEZ1bmN0aW9uPjtcbn0gPSBnbG9iYWxUaGlzO1xuXG4vLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vQXNzaWduSW5FeHByZXNzaW9uczogL1xuY29uc3QgcmVnaXN0ZXJlZFN0ZXBzID0gKGdsb2JhbFN5bWJvbHNbUmVnaXN0ZXJlZFN0ZXBzS2V5XSA/Pz0gbmV3IE1hcDxcbiAgc3RyaW5nLFxuICBTdGVwRnVuY3Rpb25cbj4oKSk7XG5cbmNvbnN0IEJVSUxUSU5fUkVTUE9OU0VfU1RFUF9OQU1FUyA9IG5ldyBTZXQoW1xuICAnX19idWlsdGluX3Jlc3BvbnNlX2FycmF5X2J1ZmZlcicsXG4gICdfX2J1aWx0aW5fcmVzcG9uc2VfanNvbicsXG4gICdfX2J1aWx0aW5fcmVzcG9uc2VfdGV4dCcsXG5dKTtcblxuZnVuY3Rpb24gZ2V0U3RlcElkQWxpYXNDYW5kaWRhdGVzKHN0ZXBJZDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBwYXJ0cyA9IHN0ZXBJZC5zcGxpdCgnLy8nKTtcbiAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMyB8fCBwYXJ0c1swXSAhPT0gJ3N0ZXAnKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgbW9kdWxlUGF0aCA9IHBhcnRzWzFdO1xuICBjb25zdCBmbk5hbWUgPSBwYXJ0c1syXTtcbiAgY29uc3QgbW9kdWxlUGF0aEFsaWFzZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBjb25zdCBhZGRBbGlhcyA9IChhbGlhc01vZHVsZVBhdGg6IHN0cmluZykgPT4ge1xuICAgIGlmIChhbGlhc01vZHVsZVBhdGggIT09IG1vZHVsZVBhdGgpIHtcbiAgICAgIG1vZHVsZVBhdGhBbGlhc2VzLmFkZChhbGlhc01vZHVsZVBhdGgpO1xuICAgIH1cbiAgfTtcblxuICBpZiAobW9kdWxlUGF0aC5zdGFydHNXaXRoKCcuL3dvcmtmbG93cy8nKSkge1xuICAgIGNvbnN0IHdvcmtmbG93UmVsYXRpdmVQYXRoID0gbW9kdWxlUGF0aC5zbGljZSgnLi8nLmxlbmd0aCk7XG4gICAgYWRkQWxpYXMoYC4vZXhhbXBsZS8ke3dvcmtmbG93UmVsYXRpdmVQYXRofWApO1xuICAgIGFkZEFsaWFzKGAuL3NyYy8ke3dvcmtmbG93UmVsYXRpdmVQYXRofWApO1xuICB9IGVsc2UgaWYgKG1vZHVsZVBhdGguc3RhcnRzV2l0aCgnLi9leGFtcGxlL3dvcmtmbG93cy8nKSkge1xuICAgIGNvbnN0IHdvcmtmbG93UmVsYXRpdmVQYXRoID0gbW9kdWxlUGF0aC5zbGljZSgnLi9leGFtcGxlLycubGVuZ3RoKTtcbiAgICBhZGRBbGlhcyhgLi8ke3dvcmtmbG93UmVsYXRpdmVQYXRofWApO1xuICAgIGFkZEFsaWFzKGAuL3NyYy8ke3dvcmtmbG93UmVsYXRpdmVQYXRofWApO1xuICB9IGVsc2UgaWYgKG1vZHVsZVBhdGguc3RhcnRzV2l0aCgnLi9zcmMvd29ya2Zsb3dzLycpKSB7XG4gICAgY29uc3Qgd29ya2Zsb3dSZWxhdGl2ZVBhdGggPSBtb2R1bGVQYXRoLnNsaWNlKCcuL3NyYy8nLmxlbmd0aCk7XG4gICAgYWRkQWxpYXMoYC4vJHt3b3JrZmxvd1JlbGF0aXZlUGF0aH1gKTtcbiAgICBhZGRBbGlhcyhgLi9leGFtcGxlLyR7d29ya2Zsb3dSZWxhdGl2ZVBhdGh9YCk7XG4gIH1cblxuICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICBtb2R1bGVQYXRoQWxpYXNlcyxcbiAgICAoYWxpYXNNb2R1bGVQYXRoKSA9PiBgc3RlcC8vJHthbGlhc01vZHVsZVBhdGh9Ly8ke2ZuTmFtZX1gXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldEJ1aWx0aW5SZXNwb25zZVN0ZXBBbGlhcyhzdGVwSWQ6IHN0cmluZyk6IFN0ZXBGdW5jdGlvbiB8IHVuZGVmaW5lZCB7XG4gIGlmICghQlVJTFRJTl9SRVNQT05TRV9TVEVQX05BTUVTLmhhcyhzdGVwSWQpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGZvciAoY29uc3QgW3JlZ2lzdGVyZWRTdGVwSWQsIHN0ZXBGbl0gb2YgcmVnaXN0ZXJlZFN0ZXBzLmVudHJpZXMoKSkge1xuICAgIGlmIChyZWdpc3RlcmVkU3RlcElkLmVuZHNXaXRoKGAvLyR7c3RlcElkfWApKSB7XG4gICAgICByZXR1cm4gc3RlcEZuO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgYSBzdGVwIGZ1bmN0aW9uIHRvIGJlIHNlcnZlZCBpbiB0aGUgc2VydmVyIGJ1bmRsZS5cbiAqIEFsc28gc2V0cyB0aGUgc3RlcElkIHByb3BlcnR5IG9uIHRoZSBmdW5jdGlvbiBmb3Igc2VyaWFsaXphdGlvbiBzdXBwb3J0LlxuICpcbiAqIE5vdGU6IFRoZSBTV0MgY29tcGlsZXIgcGx1Z2luIG5vIGxvbmdlciBnZW5lcmF0ZXMgY2FsbHMgdG8gdGhpcyBmdW5jdGlvbi5cbiAqIFN0ZXAgcmVnaXN0cmF0aW9uIGlzIG5vdyBpbmxpbmVkIGFzIGEgc2VsZi1jb250YWluZWQgSUlGRSB0aGF0IHdyaXRlc1xuICogZGlyZWN0bHkgdG8gdGhlIGdsb2JhbCBNYXAgYXQgU3ltYm9sLmZvcihcIkB3b3JrZmxvdy9jb3JlLy9yZWdpc3RlcmVkU3RlcHNcIikuXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGtlcHQgZm9yIGludGVybmFsL3Rlc3QgdXNlIG9ubHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclN0ZXBGdW5jdGlvbihzdGVwSWQ6IHN0cmluZywgc3RlcEZuOiBTdGVwRnVuY3Rpb24pIHtcbiAgcmVnaXN0ZXJlZFN0ZXBzLnNldChzdGVwSWQsIHN0ZXBGbik7XG4gIHN0ZXBGbi5zdGVwSWQgPSBzdGVwSWQ7XG59XG5cbi8qKlxuICogRmluZCBhIHJlZ2lzdGVyZWQgc3RlcCBmdW5jdGlvbiBieSBuYW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdGVwRnVuY3Rpb24oc3RlcElkOiBzdHJpbmcpOiBTdGVwRnVuY3Rpb24gfCB1bmRlZmluZWQge1xuICBjb25zdCBkaXJlY3RNYXRjaCA9IHJlZ2lzdGVyZWRTdGVwcy5nZXQoc3RlcElkKTtcbiAgaWYgKGRpcmVjdE1hdGNoKSB7XG4gICAgcmV0dXJuIGRpcmVjdE1hdGNoO1xuICB9XG5cbiAgLy8gU3VwcG9ydCBlcXVpdmFsZW50IHdvcmtmbG93IHBhdGggYWxpYXNlcyBpbiBtaXhlZCBzeW1saW5rIGVudmlyb25tZW50cy5cbiAgZm9yIChjb25zdCBhbGlhc1N0ZXBJZCBvZiBnZXRTdGVwSWRBbGlhc0NhbmRpZGF0ZXMoc3RlcElkKSkge1xuICAgIGNvbnN0IGFsaWFzTWF0Y2ggPSByZWdpc3RlcmVkU3RlcHMuZ2V0KGFsaWFzU3RlcElkKTtcbiAgICBpZiAoYWxpYXNNYXRjaCkge1xuICAgICAgcmV0dXJuIGFsaWFzTWF0Y2g7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgYnVpbHRpbkFsaWFzTWF0Y2ggPSBnZXRCdWlsdGluUmVzcG9uc2VTdGVwQWxpYXMoc3RlcElkKTtcbiAgaWYgKGJ1aWx0aW5BbGlhc01hdGNoKSB7XG4gICAgcmV0dXJuIGJ1aWx0aW5BbGlhc01hdGNoO1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLy8gTm90ZTogX19wcml2YXRlX2dldENsb3N1cmVWYXJzIGlzIG5vIGxvbmdlciByZS1leHBvcnRlZCBoZXJlLlxuLy8gVGhlIFNXQyBjb21waWxlciBwbHVnaW4gbm93IGlubGluZXMgY2xvc3VyZSB2YXJpYWJsZSBhY2Nlc3MgYXMgYVxuLy8gc2VsZi1jb250YWluZWQgSUlGRSB0aGF0IHJlYWRzIGRpcmVjdGx5IGZyb20gdGhlIGdsb2JhbCBBc3luY0xvY2FsU3RvcmFnZVxuLy8gYXQgU3ltYm9sLmZvcihcIldPUktGTE9XX1NURVBfQ09OVEVYVF9TVE9SQUdFXCIpLlxuXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dCB7XG4gIHJ1bklkOiBzdHJpbmc7XG4gIGVuY3J5cHRpb25LZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQ7XG4gIHdvcmxkQ2FwYWJpbGl0aWVzPzogV29ybGRDYXBhYmlsaXRpZXM7XG4gIGdsb2JhbFRoaXM6IHR5cGVvZiBnbG9iYWxUaGlzO1xuICBldmVudHNDb25zdW1lcjogRXZlbnRzQ29uc3VtZXI7XG4gIC8qKlxuICAgKiBNYXAgb2YgcGVuZGluZyBpbnZvY2F0aW9ucyBrZXllZCBieSBjb3JyZWxhdGlvbklkLlxuICAgKiBVc2luZyBNYXAgaW5zdGVhZCBvZiBBcnJheSBmb3IgTygxKSBsb29rdXAvZGVsZXRlIG9wZXJhdGlvbnMuXG4gICAqL1xuICBpbnZvY2F0aW9uc1F1ZXVlOiBNYXA8c3RyaW5nLCBRdWV1ZUl0ZW0+O1xuICBvbldvcmtmbG93RXJyb3I6IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG4gIGdlbmVyYXRlVWxpZDogKCkgPT4gc3RyaW5nO1xuICBnZW5lcmF0ZU5hbm9pZDogKCkgPT4gc3RyaW5nO1xuICAvKipcbiAgICogU2VxdWVudGlhbCBwcm9taXNlIHF1ZXVlIHRoYXQgZW5zdXJlcyBhbGwgZXZlbnQtZHJpdmVuIHByb21pc2UgcmVzb2x1dGlvbnNcbiAgICogKHN0ZXAgcmVzdWx0cywgaG9vayBwYXlsb2FkcywgZmFpbHVyZXMsIHN1c3BlbnNpb25zKSBoYXBwZW4gaW4gZXZlbnQgbG9nXG4gICAqIG9yZGVyLiBFdmVyeSByZXNvbHZlLCByZWplY3QsIG9yIHdvcmtmbG93IGVycm9yIGlzIGNoYWluZWQgdGhyb3VnaCB0aGlzXG4gICAqIHF1ZXVlIHNvIHRoYXQgZXZlbiBpZiBpbmRpdmlkdWFsIG9wZXJhdGlvbnMgdGFrZSB2YXJpYWJsZSB0aW1lIChlLmcuLFxuICAgKiBhc3luYyBkZWNyeXB0aW9uKSwgcHJvbWlzZXMgcmVzb2x2ZSBkZXRlcm1pbmlzdGljYWxseS5cbiAgICovXG4gIHByb21pc2VRdWV1ZTogUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIENvdW50ZXIgb2YgaW4tZmxpZ2h0IGFzeW5jIGRhdGEgZGVsaXZlcnkgb3BlcmF0aW9ucyAoc3RlcCByZXN1bHRcbiAgICogaHlkcmF0aW9uLCBob29rIHBheWxvYWQgaHlkcmF0aW9uLCBhYm9ydCBzaWduYWwgaHlkcmF0aW9uKS4gU3VzcGVuc2lvbnNcbiAgICogbXVzdCB3YWl0IGZvciB0aGlzIHRvIHJlYWNoIDAgYmVmb3JlIGZpcmluZywgdG8gYXZvaWQgcHJlZW1wdGluZyBkYXRhXG4gICAqIGRlbGl2ZXJ5IOKAlCBlLmcuIGRlaHlkcmF0aW5nIGEgc3RlcCdzIGFyZ3VtZW50cyB3aGlsZSBhbiBhYm9ydCB0aGF0IHNob3VsZFxuICAgKiBiZSByZWZsZWN0ZWQgaW4gdGhvc2UgYXJndW1lbnRzIGlzIHN0aWxsIGh5ZHJhdGluZyBpdHMgcmVhc29uLlxuICAgKi9cbiAgcGVuZGluZ0RlbGl2ZXJpZXM6IG51bWJlcjtcbiAgLyoqXG4gICAqIE9yZGVyZWQgcmVnaXN0cnkgb2YgaW4tZmxpZ2h0IFwiYnJhbmNoLWRlY2lkaW5nXCIgZGVsaXZlcmllcyDigJQgdGhlXG4gICAqIHJlc29sdXRpb25zIGEgd29ya2Zsb3cgdHlwaWNhbGx5IGBQcm9taXNlLnJhY2VgcyBvbiwgb3IgYXdhaXRzIGZyb21cbiAgICogaW5kZXBlbmRlbnQgY29uY3VycmVudCBicmFuY2hlczogaG9vayBwYXlsb2FkcyAoYGhvb2tfcmVjZWl2ZWRgKSwgd2FpdFxuICAgKiBjb21wbGV0aW9ucyAoYHdhaXRfY29tcGxldGVkYCksIGFuZCBzdGVwIHJlc3VsdHMgKGBzdGVwX2NvbXBsZXRlZGAgL1xuICAgKiBgc3RlcF9mYWlsZWRgKS4gS2V5ZWQgYnkgdGhlIGRlbGl2ZXJ5J3MgcG9zaXRpb24gKGluZGV4KSBpbiB0aGUgY29uc3VtZWRcbiAgICogZXZlbnQgbG9nLlxuICAgKlxuICAgKiBUaGUgcHJvYmxlbTogZWFjaCBvZiB0aGVzZSByZXNvbHV0aW9ucyByZWFjaGVzIHdvcmtmbG93IGNvZGUgYWZ0ZXIgYVxuICAgKiBkaWZmZXJlbnQsIHdvcmtsb2FkLWRlcGVuZGVudCBudW1iZXIgb2YgbWljcm90YXNrIGhvcHMuIEEgYnVmZmVyZWQgaG9va1xuICAgKiBwYXlsb2FkIGlzIG9ic2VydmVkIHZpYSB0aGUgYXN5bmMgaG9vayBpdGVyYXRvciAoYHlpZWxkIGF3YWl0IHRoaXNgKSxcbiAgICogY29zdGluZyBleHRyYSBob3BzOyBhIGB3YWl0X2NvbXBsZXRlZGAgcmVzb2x2ZXMgd2l0aCBmZXdlciwgYW5kIGEgcmV1c2VkXG4gICAqIHNsZWVwIGNhbiByZXNvbHZlIGluIGFuIGVudGlyZWx5IGVhcmxpZXIgbG9vcCBpdGVyYXRpb247IGEgc3RlcCByZXN1bHQgaXNcbiAgICogZ2F0ZWQgb24gaHlkcmF0aW9uIHdob3NlIGNvc3QgdmFyaWVzIGJldHdlZW4gcmVwbGF5cyBvZiB0aGUgU0FNRVxuICAgKiBpbnZvY2F0aW9uIOKAlCB0aGUgZmlyc3QgcmVwbGF5IHBheXMgdGhlIGZ1bGwgZGVjcnlwdC9kZWNvbXByZXNzL3Jldml2ZSxcbiAgICogd2hpbGUgbGF0ZXIgcmVwbGF5cyBzaGFyaW5nIHRoZSBpbnZvY2F0aW9uJ3MgYFJlcGxheVBheWxvYWRDYWNoZWBcbiAgICogbWVtby1oaXQgc21hbGwgcHJpbWl0aXZlIHJlc3VsdHMgYW5kIHJlc29sdmUgaW4gb25lIG9yIHR3byBob3BzLiBFaXRoZXJcbiAgICogd2F5LCB0aGUgcmVzb2x1dGlvbiB0aGF0IHRoZSBjb21taXR0ZWQgZXZlbnQgbG9nIG9yZGVyZWQgZmlyc3QgY2FuIGxvc2UgYVxuICAgKiBgUHJvbWlzZS5yYWNlYCAob3IgYSBgdXNlU3RlcGAgVUxJRCBhbGxvY2F0aW9uKSB0byBhIGZhc3Rlci0gb3JcbiAgICogYWxyZWFkeS1yZXNvbHZlZCBjb21wZXRpdG9yLCBkaXZlcmdpbmcgZnJvbSB0aGUgbG9nIGFuZCBzdXJmYWNpbmcgYXNcbiAgICogYENvcnJ1cHRlZEV2ZW50TG9nRXJyb3JgLlxuICAgKlxuICAgKiBUaGUgZml4IGlzIGEgc3RyaWN0LCBkZXRlcm1pbmlzdGljIGRlbGl2ZXJ5IG9yZGVyIGFuY2hvcmVkIG9uXG4gICAqIGV2ZW50LWxvZyBwb3NpdGlvbjogYSBkZWxpdmVyeSBkb2VzIG5vdCByZXNvbHZlIHRvIHRoZSB3b3JrZmxvdyB1bnRpbFxuICAgKiBldmVyeSByZWxldmFudCBlYXJsaWVyLWluLWxvZyBkZWxpdmVyeSBoYXMgYmVlbiBkZWxpdmVyZWQuIEJlY2F1c2UgdGhlXG4gICAqIGdhdGUgaXMgXCJ0aGUgZWFybGllciBkZWxpdmVyeSByZXNvbHZlZFwiLCBub3QgXCJ3b24gYSB0aW1pbmcgcmFjZVwiLCB0aGVcbiAgICogb3V0Y29tZSBpcyBpbmRlcGVuZGVudCBvZiBtaWNyb3Rhc2sgaG9wcywgaHlkcmF0aW9uL2RlY3J5cHRpb24gdGltZSxcbiAgICogYW5kIGBQcm9taXNlLnJhY2VgIGFyZ3VtZW50IG9yZGVyLiBXaGljaCBlYXJsaWVyIGtpbmRzIGEgZGVsaXZlcnkgZGVmZXJzXG4gICAqIGJlaGluZCBpcyBzcGVsbGVkIG91dCBvbiB7QGxpbmsgYXdhaXRFYXJsaWVyRGVsaXZlcmllc30uXG4gICAqXG4gICAqIEluZGV4IGlzIHVzZWQgcmF0aGVyIHRoYW4gdGhlIGBldmVudElkYCBzdHJpbmcgYmVjYXVzZSBgZXZlbnRJZGAgaXMgYW5cbiAgICogb3BhcXVlLCB3b3JsZC1hc3NpZ25lZCB2YWx1ZSBub3QgZ3VhcmFudGVlZCB0byBzb3J0IGluIGNyZWF0aW9uIG9yZGVyXG4gICAqIChvbmx5IHRoZSBidW5kbGVkIFVMSUQgd29ybGRzIGhhcHBlbiB0bykuXG4gICAqXG4gICAqIE9wdGlvbmFsIHNvIG9sZGVyL291dC1vZi10cmVlIGNvbnRleHRzIChhbmQgbGlnaHR3ZWlnaHQgdGVzdCBoYXJuZXNzZXMpXG4gICAqIHRoYXQgZG8gbm90IGluaXRpYWxpemUgaXQgZGVncmFkZSBncmFjZWZ1bGx5IHRvIHRoZSBwcmV2aW91cyBiZWhhdmlvci5cbiAgICovXG4gIHBlbmRpbmdEZWxpdmVyeUJhcnJpZXJzPzogTWFwPG51bWJlciwgRGVsaXZlcnlCYXJyaWVyRW50cnk+O1xuICAvKipcbiAgICogSW52b2NhdGlvbi1zY29wZWQgY2FjaGUgb2YgcHJlcGFyZWQgc2VyaWFsaXplZCBwYXlsb2FkcyBhbmQgaW1tdXRhYmxlIGZpbmFsXG4gICAqIHZhbHVlcy4gUHJlcGFyZWQgYnl0ZXMgc3Vydml2ZSBmcmVzaCByZXBsYXkgVk1zOyBvYmplY3QgZ3JhcGhzIGRvIG5vdC5cbiAgICovXG4gIHJlcGxheVBheWxvYWRDYWNoZTogUmVwbGF5UGF5bG9hZENhY2hlO1xufVxuXG4vKiogVGhlIGtpbmQgb2YgYnJhbmNoLWRlY2lkaW5nIGRlbGl2ZXJ5IGEgYmFycmllciByZXByZXNlbnRzLiAqL1xuZXhwb3J0IHR5cGUgRGVsaXZlcnlLaW5kID0gJ2hvb2snIHwgJ3dhaXQnIHwgJ3N0ZXAnO1xuXG5pbnRlcmZhY2UgRGVsaXZlcnlCYXJyaWVyRW50cnkge1xuICBraW5kOiBEZWxpdmVyeUtpbmQ7XG4gIC8qKiBSZXNvbHZlcyBvbmNlIHRoaXMgZGVsaXZlcnkgaGFzIHJlc29sdmVkIHRvIHRoZSB3b3JrZmxvdy4gKi9cbiAgZGVsaXZlcmVkOiBQcm9taXNlPHZvaWQ+O1xuICAvKipcbiAgICogV2hldGhlciB0aGlzIGRlbGl2ZXJ5IGlzIGNvbW1pdHRlZCB0byByZWFjaGluZyB0aGUgd29ya2Zsb3cgd2l0aG91dCBhbnlcbiAgICogZnVydGhlciBhY3Rpb24gYnkgd29ya2Zsb3cgY29kZS4gVHJ1ZSBmb3Igd2FpdCBjb21wbGV0aW9ucyBhbmQgc3RlcFxuICAgKiByZXN1bHRzLCB3aGljaCBhbHdheXMgcmVzb2x2ZSBmcm9tIHRoZWlyIG93biBjaGFpbiwgYW5kIGZvciBhIGhvb2sgcGF5bG9hZFxuICAgKiB0aGF0IGFscmVhZHkgaGFkIGEgd2FpdGluZyBjb25zdW1lciB3aGVuIGl0IHdhcyBjb25zdW1lZC5cbiAgICpcbiAgICogRmFsc2UgZm9yIGEgQlVGRkVSRUQgaG9vayBwYXlsb2FkIG5vIGNvbnN1bWVyIGhhcyBjbGFpbWVkIHlldDogaXQgaXNcbiAgICogZGVsaXZlcmVkIGJ5IGBjbGFpbSgpYCwgaS5lLiB3aGVuZXZlciB0aGUgd29ya2Zsb3cgbmV4dCByZWFkcyB0aGUgaG9vayDigJRcbiAgICogd2hpY2ggbWF5IGJlIGNhdXNhbGx5ICphZnRlciogYSBsYXRlci1pbi1sb2cgZGVsaXZlcnkuIGBhcm0oKWAgZmxpcHMgaXRcbiAgICogb25jZSBhIGNvbnN1bWVyIHRha2VzIHRoZSBwYXlsb2FkLlxuICAgKi9cbiAgYXJtZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogV2hpY2ggZWFybGllciBraW5kcyBlYWNoIGRlbGl2ZXJ5IGtpbmQgZGVmZXJzIGJlaGluZC4gQ2hvc2VuIHNvIHRoYXQgbm8ga2luZFxuICogYmxvY2tzIG9uIGEgcGVlciBpdCBkb2VzIG5vdCBuZWVkIHRvOlxuICpcbiAqICAtIGEgaG9vayBkZWZlcnMgYmVoaW5kIGVhcmxpZXIgV0FJVFMgYW5kIFNURVBTIOKAlCBub3QgZWFybGllciBob29rcywgd2hpY2hcbiAqICAgIGFyZSBzZXF1ZW50aWFsIHNhbWUtZW50aXR5IHBheWxvYWRzIGFuZCBtdXN0IG5vdCBibG9jayBvbmUgYW5vdGhlcjtcbiAqICAtIGEgd2FpdCBkZWZlcnMgYmVoaW5kIGVhcmxpZXIgSE9PS1MgYW5kIFNURVBTIOKAlCBub3QgZWFybGllciB3YWl0cywgc2luY2UgYVxuICogICAgd2FpdCBuZXZlciBuZWVkcyB0byBxdWV1ZSBiZWhpbmQgYW5vdGhlciB3YWl0O1xuICogIC0gYSBzdGVwIGRlZmVycyBiZWhpbmQgZWFybGllciBXQUlUUywgSE9PS1MgYW5kIFNURVBTLlxuICpcbiAqIFRoZSBzdGVwLWJlaGluZC1zdGVwIGVkZ2UgaXMgbm90IHJlZHVuZGFudCB3aXRoIHRoZSBzZXJpYWwgYHByb21pc2VRdWV1ZWAuXG4gKiBUaGUgcXVldWUgZml4ZXMgdGhlIG9yZGVyIGluIHdoaWNoIHN0ZXAgcmVzdWx0cyBhcmUgSFlEUkFURUQsIGJ1dCBhIHN0ZXAgbm9cbiAqIGxvbmdlciByZXNvbHZlcyBpbnNpZGUgaXRzIHF1ZXVlIHNsb3Qg4oCUIGl0IGNhcHR1cmVzIHRoZSBvdXRjb21lIHRoZXJlIGFuZFxuICogcmVzb2x2ZXMgZnJvbSBhIGRldGFjaGVkIGNvbnRpbnVhdGlvbiBvbmNlIGl0cyBiYXJyaWVyIGNsZWFycy4gVHdvIHN0ZXBzXG4gKiBhZ3JlZSBvbiB0aGF0IGNvbnRpbnVhdGlvbidzIG9yZGVyaW5nIG9ubHkgd2hpbGUgdGhleSBkZWZlciBiZWhpbmQgdGhlIHNhbWVcbiAqIHNldCwgd2hpY2ggaG9sZHMgd2hlbiB0aGV5IGFyZSBjb25zdW1lZCBpbiB0aGUgc2FtZSBkcmFpbiB3aW5kb3cgYnV0IG5vdFxuICogYWNyb3NzIHdpbmRvd3M6IGEgc3RlcCBjb25zdW1lZCBsYXRlciBjYW4gbWlzcyBhIHdhaXQvaG9vayBiYXJyaWVyIHRoYXQgYW5cbiAqIGVhcmxpZXIgc3RlcCBpcyBzdGlsbCBwYXJrZWQgb24sIGJlY2F1c2UgdGhlIGJhcnJpZXIgcmV0aXJlZCBpbiBiZXR3ZWVuLiBUaGVcbiAqIGVhcmxpZXIgc3RlcCBpcyB0aGVuIHdhaXRpbmcgb3V0IHRoZSBtYWNyb3Rhc2sgeWllbGQgYmVsb3cgd2hpbGUgdGhlIGxhdGVyXG4gKiBvbmUgcmVzb2x2ZXMgb24gbWljcm90YXNrcywgYW5kIG92ZXJ0YWtlcyBpdCDigJQgc2VlXG4gKiBgZGVsaXZlcnktYmFycmllci1jb3ZlcmFnZS50ZXN0LnRzYC4gRGVmZXJyaW5nIGJlaGluZCBlYXJsaWVyIHN0ZXBzXG4gKiBjbG9zZXMgdGhhdCB3aW5kb3cgc3RydWN0dXJhbGx5OiB0aGUgZWFybGllciBzdGVwJ3MgYmFycmllciBpcyBzdGlsbFxuICogcmVnaXN0ZXJlZCBwcmVjaXNlbHkgYmVjYXVzZSBpdCBoYXMgbm90IGRlbGl2ZXJlZCB5ZXQuXG4gKlxuICogRXZlcnkgZWRnZSBwb2ludHMgZnJvbSBhIGxhdGVyIGxvZyBpbmRleCB0byBhIHN0cmljdGx5IGVhcmxpZXIgb25lLCBzbyB0aGVcbiAqIHdhaXQtZm9yIGdyYXBoIGNhbiBuZXZlciBjb250YWluIGEgY3ljbGUuXG4gKi9cbmNvbnN0IERFRkVSX0JFSElORDogUmVjb3JkPERlbGl2ZXJ5S2luZCwgcmVhZG9ubHkgRGVsaXZlcnlLaW5kW10+ID0ge1xuICBob29rOiBbJ3dhaXQnLCAnc3RlcCddLFxuICB3YWl0OiBbJ2hvb2snLCAnc3RlcCddLFxuICBzdGVwOiBbJ3dhaXQnLCAnaG9vaycsICdzdGVwJ10sXG59O1xuXG4vKipcbiAqIFdoZXRoZXIgYGVudHJ5YCB3aWxsIHJlc29sdmUgb24gaXRzIG93biDigJQgaXQgaXMgYXJtZWQsIGFuZCBldmVyeSBlYXJsaWVyXG4gKiBkZWxpdmVyeSBpdCBkZWZlcnMgYmVoaW5kIHdpbGwgbGlrZXdpc2UgcmVzb2x2ZSBvbiBpdHMgb3duLlxuICpcbiAqIEEgc3RlcCBkZWxpdmVyeSBpcyBhbHdheXMgc2VsZi1yZXNvbHZpbmc6IGl0IHNraXBzIHVuY29tbWl0dGVkIGRlbGl2ZXJpZXNcbiAqIChzZWUge0BsaW5rIGF3YWl0RWFybGllckRlbGl2ZXJpZXN9KSwgYW5kIHRoZSBlYXJsaWVyIHN0ZXBzIGl0IGRvZXMgZGVmZXJcbiAqIGJlaGluZCBhcmUgc2VsZi1yZXNvbHZpbmcgYnkgdGhlIHNhbWUgYXJndW1lbnQsIGluZHVjdGluZyBkb3duIG9uIGluZGV4LlxuICpcbiAqIFJlY3Vyc2lvbiB0ZXJtaW5hdGVzIGJlY2F1c2UgZXZlcnkgZWRnZSBwb2ludHMgdG8gYSBzdHJpY3RseSBzbWFsbGVyIGluZGV4LlxuICogYG1lbW9gIGlzIHJlcXVpcmVkIHJhdGhlciB0aGFuIGFuIG9wdGltaXphdGlvbjogd2l0aG91dCBpdCB0aGUgd2FsayBpc1xuICogZXhwb25lbnRpYWwgaW4gdGhlIG51bWJlciBvZiBsaXZlIGhvb2svd2FpdCBiYXJyaWVycyAoZWFjaCBhcm1lZCBlbnRyeVxuICogcmUtd2Fsa3MgZXZlcnkgZWFybGllciBlbnRyeSBvZiB0aGUgb3Bwb3NpdGUga2luZCwgVChuKSA9IM6jIFQoaikpLCBhbmQgdGhlXG4gKiByZWdpc3RyeSBpcyBub3Qgc21hbGwgYnkgY29uc3RydWN0aW9uIOKAlCBgRXZlbnRzQ29uc3VtZXJgIGRyYWluc1xuICogY29uc2VjdXRpdmVseSBjb25zdW1hYmxlIGV2ZW50cyBzeW5jaHJvbm91c2x5IHdoaWxlIGJhcnJpZXJzIG9ubHkgcmV0aXJlIG9uXG4gKiBtaWNyb3Rhc2stZHJpdmVuIGRlbGl2ZXJpZXMsIHNvIGEgZmFuLW91dCBvZiBgUHJvbWlzZS5yYWNlKFtob29rLCBzbGVlcF0pYFxuICogYnJhbmNoZXMgYWNjdW11bGF0ZXMgb25lIGJhcnJpZXIgcGVyIGJyYW5jaCBwZXIga2luZC4gTWVtb2l6ZWQsIHRoZSB3YWxrIGlzXG4gKiBsaW5lYXIgaW4gcmVnaXN0cnkgc2l6ZS4gVGhlIG1lbW8gTVVTVCBiZSBwZXItY2FsbDogYGFybWVkYCBtdXRhdGVzIGJldHdlZW5cbiAqIGNhbGxzIGFzIGJ1ZmZlcmVkIHBheWxvYWRzIGFyZSBjbGFpbWVkLlxuICovXG5mdW5jdGlvbiByZXNvbHZlc09uSXRzT3duKFxuICBiYXJyaWVyczogTWFwPG51bWJlciwgRGVsaXZlcnlCYXJyaWVyRW50cnk+LFxuICBpbmRleDogbnVtYmVyLFxuICBlbnRyeTogRGVsaXZlcnlCYXJyaWVyRW50cnksXG4gIG1lbW86IE1hcDxudW1iZXIsIGJvb2xlYW4+XG4pOiBib29sZWFuIHtcbiAgY29uc3QgY2FjaGVkID0gbWVtby5nZXQoaW5kZXgpO1xuICBpZiAoY2FjaGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IGNvbXB1dGVSZXNvbHZlc09uSXRzT3duKGJhcnJpZXJzLCBpbmRleCwgZW50cnksIG1lbW8pO1xuICBtZW1vLnNldChpbmRleCwgcmVzdWx0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZVJlc29sdmVzT25JdHNPd24oXG4gIGJhcnJpZXJzOiBNYXA8bnVtYmVyLCBEZWxpdmVyeUJhcnJpZXJFbnRyeT4sXG4gIGluZGV4OiBudW1iZXIsXG4gIGVudHJ5OiBEZWxpdmVyeUJhcnJpZXJFbnRyeSxcbiAgbWVtbzogTWFwPG51bWJlciwgYm9vbGVhbj5cbik6IGJvb2xlYW4ge1xuICBpZiAoIWVudHJ5LmFybWVkKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChlbnRyeS5raW5kID09PSAnc3RlcCcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBjb25zdCBkZWZlckJlaGluZCA9IERFRkVSX0JFSElORFtlbnRyeS5raW5kXTtcbiAgZm9yIChjb25zdCBbb3RoZXJJbmRleCwgb3RoZXJdIG9mIGJhcnJpZXJzKSB7XG4gICAgaWYgKFxuICAgICAgb3RoZXJJbmRleCA8IGluZGV4ICYmXG4gICAgICBkZWZlckJlaGluZC5pbmNsdWRlcyhvdGhlci5raW5kKSAmJlxuICAgICAgIXJlc29sdmVzT25JdHNPd24oYmFycmllcnMsIG90aGVySW5kZXgsIG90aGVyLCBtZW1vKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBBd2FpdHMsIGluIHN0cmljdCBldmVudC1sb2cgb3JkZXIsIGV2ZXJ5IHN0aWxsLXJlZ2lzdGVyZWQgZGVsaXZlcnkgdGhhdCBpc1xuICogZWFybGllciBpbiB0aGUgbG9nIHRoYW4gYGV2ZW50SW5kZXhgIGFuZCB0aGF0IGEgZGVsaXZlcnkgb2YgYGtpbmRgIGRlZmVyc1xuICogYmVoaW5kIChzZWUge0BsaW5rIERFRkVSX0JFSElORH0pLCBzbyB0aGF0IHRoaXMgcmVzb2x1dGlvbiBpcyBoYW5kZWQgdG8gdGhlXG4gKiB3b3JrZmxvdyBvbmx5IGFmdGVyIGFsbCByZWxldmFudCBlYXJsaWVyLWluLWxvZyBkZWxpdmVyaWVzIGhhdmUgYmVlbi4gVGhpc1xuICogaXMgd2hhdCBrZWVwcyBhIGBQcm9taXNlLnJhY2VgIOKAlCBvciB0aGUgVUxJRCBhIGZvbGxvdy11cCBgdXNlU3RlcGAgZHJhd3Mgb25cbiAqIGEgY29uY3VycmVudCBicmFuY2gg4oCUIGRldGVybWluaXN0aWMgYW5kIGFsaWduZWQgd2l0aCB0aGUgY29tbWl0dGVkIGV2ZW50XG4gKiBsb2csIGluZGVwZW5kZW50IG9mIG1pY3JvdGFzay1ob3AgY291bnRzLCBoeWRyYXRpb24gdGltZSwgb3IgcmFjZS1hcmd1bWVudFxuICogb3JkZXIuIFdoZW4gdGhpcyBkZWxpdmVyeSBkb2VzIGhhdmUgdG8gd2FpdCwgaXQgYWxzbyB5aWVsZHMgYSBtYWNyb3Rhc2tcbiAqIGFmdGVyd2FyZHMgc28gdGhlIGVhcmxpZXIgZGVsaXZlcnkncyBjb25zdW1lciBjYW4gcnVuIHRvIGl0cyBvd24gbmV4dFxuICogc3VzcGVuc2lvbiBwb2ludCBmaXJzdDsgc2VlIHRoZSBjb21tZW50IGF0IHRoYXQgYGF3YWl0YCBmb3Igd2h5IG9yZGVyaW5nIHRoZVxuICogYHJlc29sdmUoKWAgY2FsbHMgYWxvbmUgaXMgbm90IGVub3VnaC5cbiAqXG4gKiBPbmUgYXN5bW1ldHJ5OiBhIFNURVAgcmVzdWx0IGFkZGl0aW9uYWxseSBza2lwcyBhbnkgZWFybGllciBkZWxpdmVyeSB0aGF0XG4gKiB3aWxsIG5vdCByZXNvbHZlIG9uIGl0cyBvd24sIGkuZS4gb25lIGJsb2NrZWQgKGRpcmVjdGx5IG9yIHRyYW5zaXRpdmVseSkgb25cbiAqIGEgYnVmZmVyZWQgaG9vayBwYXlsb2FkIG5vIGNvbnN1bWVyIGhhcyBjbGFpbWVkLiBTdWNoIGEgcGF5bG9hZCBpcyBkZWxpdmVyZWRcbiAqIG9ubHkgd2hlbiB0aGUgd29ya2Zsb3cgbmV4dCByZWFkcyB0aGUgaG9vaywgYW5kIHJlYWNoaW5nIHRoYXQgcmVhZCB2ZXJ5XG4gKiBjb21tb25seSByZXF1aXJlcyB0aGUgc3RlcCByZXN1bHQgaXRzZWxmIChgYXdhaXQgc3RlcFgoKWAgYmVmb3JlIHRoZSByZWFkKS5cbiAqIEdhdGluZyB0aGUgc3RlcCBvbiBpdCB3b3VsZCBzdGFsbCB0aGUgd29ya2Zsb3cgdW50aWwgdGhlIGJhcnJpZXIncyBpZGxlXG4gKiBzYWZldHkgbmV0IGZpcmVzLCB3aGljaCB0aGVuIHJlbGVhc2VzIGV2ZXJ5IGRlbGl2ZXJ5IHF1ZXVlZCBiZWhpbmQgdGhhdFxuICogcGF5bG9hZCBhdCBvbmNlIOKAlCBsb3NpbmcgZXhhY3RseSB0aGUgcmFjZSB0aGlzIG9yZGVyaW5nIGV4aXN0cyB0byBwcm90ZWN0LlxuICogV2FpdHMgYW5kIGhvb2tzIGtlZXAgZ2F0aW5nIG9uIHVuY2xhaW1lZCBwYXlsb2FkczogZm9yIHRoZW0sIHdhaXRpbmcgZm9yIHRoZVxuICogY2xhaW0gSVMgdGhlIG9yZGVyaW5nIGd1YXJhbnRlZSAoYSBgd2FpdF9jb21wbGV0ZWRgIG11c3Qgbm90IHByZWVtcHQgYVxuICogcGF5bG9hZCB0aGUgbG9nIG9yZGVyZWQgZmlyc3QpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXdhaXRFYXJsaWVyRGVsaXZlcmllcyhcbiAgY3R4OiBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQsXG4gIGV2ZW50SW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAga2luZDogRGVsaXZlcnlLaW5kXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gRGVmZW5zaXZlOiB0b2xlcmF0ZSBjb250ZXh0cyB0aGF0IHByZWRhdGUgdGhpcyBmaWVsZCAodGVzdCBoYXJuZXNzZXMpLlxuICBpZiAoXG4gICAgZXZlbnRJbmRleCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgIWN0eC5wZW5kaW5nRGVsaXZlcnlCYXJyaWVycyB8fFxuICAgIGN0eC5wZW5kaW5nRGVsaXZlcnlCYXJyaWVycy5zaXplID09PSAwXG4gICkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBiYXJyaWVycyA9IGN0eC5wZW5kaW5nRGVsaXZlcnlCYXJyaWVycztcbiAgY29uc3QgZGVmZXJCZWhpbmQgPSBERUZFUl9CRUhJTkRba2luZF07XG4gIGNvbnN0IGVhcmxpZXI6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAvLyBTaGFyZWQgYWNyb3NzIHRoaXMgY2FsbCBvbmx5IOKAlCBzZWUgYHJlc29sdmVzT25JdHNPd25gLlxuICBjb25zdCBzZWxmUmVzb2x2aW5nID0gbmV3IE1hcDxudW1iZXIsIGJvb2xlYW4+KCk7XG4gIGZvciAoY29uc3QgW2luZGV4LCBlbnRyeV0gb2YgYmFycmllcnMpIHtcbiAgICBpZiAoaW5kZXggPj0gZXZlbnRJbmRleCB8fCAhZGVmZXJCZWhpbmQuaW5jbHVkZXMoZW50cnkua2luZCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBraW5kID09PSAnc3RlcCcgJiZcbiAgICAgICFyZXNvbHZlc09uSXRzT3duKGJhcnJpZXJzLCBpbmRleCwgZW50cnksIHNlbGZSZXNvbHZpbmcpXG4gICAgKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZWFybGllci5wdXNoKGVudHJ5LmRlbGl2ZXJlZCk7XG4gIH1cbiAgaWYgKGVhcmxpZXIubGVuZ3RoID4gMCkge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKGVhcmxpZXIpO1xuICAgIC8vIEFuIGVhcmxpZXIgZGVsaXZlcnkgYmVpbmcgXCJkZWxpdmVyZWRcIiBvbmx5IG1lYW5zIGl0cyBgcmVzb2x2ZSgpYCByYW4uXG4gICAgLy8gVGhlIGJyYW5jaCBpdCB3b2tlIG1heSBuZWVkIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgZnVydGhlciBtaWNyb3Rhc2tcbiAgICAvLyBob3BzIGJlZm9yZSBpdCByZWFjaGVzIGl0cyBuZXh0IGB1c2VTdGVwYCBjYWxsIGFuZCBkcmF3cyBhIFVMSUQg4oCUIGFcbiAgICAvLyBgZm9yIGF3YWl0YCBvdmVyIGEgaG9vaywgZm9yIGluc3RhbmNlLCByZXN1bWVzIHRoZSBnZW5lcmF0b3IsIHNldHRsZXNcbiAgICAvLyB0aGUgcHJvbWlzZSBmcm9tIGBuZXh0KClgLCBhbmQgb25seSB0aGVuIHJ1bnMgdGhlIGxvb3AgYm9keS4gUmVzb2x2aW5nXG4gICAgLy8gdGhpcyBkZWxpdmVyeSBvbiBhIG1pY3JvdGFzayB3b3VsZCBsZXQgaXQgb3ZlcnRha2UgdGhhdCBicmFuY2ggYW5kXG4gICAgLy8gcmVvcmRlciB0aGUgVUxJRCBhbGxvY2F0aW9uIGFueXdheSwgdHVybmluZyB0aGUgZ3VhcmFudGVlIGJlbG93IGludG8gYVxuICAgIC8vIGhvcC1jb3VudCByYWNlIHRoYXQgaG9sZHMgb25seSBmb3IgdGhlIHNob3J0ZXN0IGNvbnN1bWVycy5cbiAgICAvL1xuICAgIC8vIFlpZWxkaW5nIGEgbWFjcm90YXNrIGxldHMgdGhlIGVhcmxpZXIgYnJhbmNoJ3MgZW50aXJlIG1pY3JvdGFzayBjaGFpblxuICAgIC8vIGRyYWluIGZpcnN0LCB3aGF0ZXZlciBpdHMgbGVuZ3RoLCBzbyBsb2cgb3JkZXIgc3Vydml2ZXMgcmVnYXJkbGVzcyBvZlxuICAgIC8vIGhvdyB0aGUgd29ya2Zsb3cgY29uc3VtZXMgdGhlIGVhcmxpZXIgZGVsaXZlcnkuIE9ubHkgZGVsaXZlcmllcyB0aGF0XG4gICAgLy8gYWN0dWFsbHkgaGFkIHRvIGRlZmVyIHBheSB0aGlzLCBzbyB0aGUgY29tbW9uIHNpbmdsZS1kZWxpdmVyeSBkcmFpbiBpc1xuICAgIC8vIHVuYWZmZWN0ZWQuXG4gICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMCkpO1xuICB9XG59XG5cbi8qKiBIYW5kbGUgZm9yIGEgcmVnaXN0ZXJlZCBicmFuY2gtZGVjaWRpbmcgZGVsaXZlcnkgYmFycmllci4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVsaXZlcnlCYXJyaWVyIHtcbiAgLyoqXG4gICAqIE1hcmsgdGhpcyBkZWxpdmVyeSBhcyBkZWxpdmVyZWQgdG8gdGhlIHdvcmtmbG93LiBSZXNvbHZlcyBpdHNcbiAgICogYGRlbGl2ZXJlZGAgcHJvbWlzZSBzbyBhbnkgbGF0ZXItaW4tbG9nIGRlbGl2ZXJ5IGdhdGVkIG9uIGl0ICh2aWFcbiAgICoge0BsaW5rIGF3YWl0RWFybGllckRlbGl2ZXJpZXN9KSBtYXkgcHJvY2VlZCwgYW5kIHJlbW92ZXMgaXQgZnJvbSB0aGVcbiAgICogcmVnaXN0cnkuIElkZW1wb3RlbnQuXG4gICAqL1xuICBtYXJrRGVsaXZlcmVkOiAoKSA9PiB2b2lkO1xuICAvKipcbiAgICogTWFyayB0aGlzIGRlbGl2ZXJ5IGFzIGNvbW1pdHRlZCB0byBoYXBwZW5pbmcsIGZvciBhIGJhcnJpZXIgcmVnaXN0ZXJlZFxuICAgKiB1bmFybWVkIChhIGJ1ZmZlcmVkIGhvb2sgcGF5bG9hZCkgb25jZSBhIGNvbnN1bWVyIGhhcyBjbGFpbWVkIGl0LiBGcm9tXG4gICAqIHRoZW4gb24gYSBsYXRlciBzdGVwIHJlc3VsdCBtYXkgYmUgb3JkZXJlZCBiZWhpbmQgaXQuIElkZW1wb3RlbnQuXG4gICAqL1xuICBhcm06ICgpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgYSBicmFuY2gtZGVjaWRpbmcgZGVsaXZlcnkgYXQgaXRzIGV2ZW50LWxvZyBpbmRleCBzbyB0aGF0IGxhdGVyXG4gKiBkZWxpdmVyaWVzIGNhbiBiZSBvcmRlcmVkIHN0cmljdGx5IGFmdGVyIGl0LiBSZXR1cm5zIGFuIGluZXJ0IGhhbmRsZSB3aGVuXG4gKiBgcGVuZGluZ0RlbGl2ZXJ5QmFycmllcnNgIGlzIG5vdCBpbml0aWFsaXplZC5cbiAqXG4gKiBQYXNzIGBhcm1lZDogZmFsc2VgIGZvciBhIGRlbGl2ZXJ5IHdob3NlIHJlc29sdXRpb24gd2FpdHMgb24gd29ya2Zsb3cgY29kZVxuICogYXNraW5nIGZvciBpdCAoYSBidWZmZXJlZCBob29rIHBheWxvYWQpOyBjYWxsIGBhcm0oKWAgd2hlbiBpdCBkb2VzLlxuICpcbiAqIFRvIGd1YXJhbnRlZSBhIGxhdGVyIGRlbGl2ZXJ5IGdhdGVkIG9uIHRoaXMgb25lIGNhbiBuZXZlciBoYW5nIHdoZW4gdGhpc1xuICogZGVsaXZlcnkgaXMgYWJhbmRvbmVkICh0aGUgd29ya2Zsb3cgdG9vayBhIGRpZmZlcmVudCBicmFuY2ggb3IgaXNcbiAqIHN1c3BlbmRpbmcgYW5kIG5ldmVyIG9ic2VydmVzIGl0KSwgdGhlIGJhcnJpZXIgYXV0by1yZXNvbHZlcyBhdCBpZGxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJEZWxpdmVyeUJhcnJpZXIoXG4gIGN0eDogV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0LFxuICBldmVudEluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQsXG4gIGtpbmQ6IERlbGl2ZXJ5S2luZCxcbiAgb3B0aW9uczogeyBhcm1lZD86IGJvb2xlYW4gfSA9IHt9XG4pOiBEZWxpdmVyeUJhcnJpZXIge1xuICBjb25zdCBiYXJyaWVycyA9IGN0eC5wZW5kaW5nRGVsaXZlcnlCYXJyaWVycztcbiAgaWYgKCFiYXJyaWVycyB8fCBldmVudEluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4geyBtYXJrRGVsaXZlcmVkOiAoKSA9PiB7fSwgYXJtOiAoKSA9PiB7fSB9O1xuICB9XG5cbiAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgY29uc3QgeyBwcm9taXNlLCByZXNvbHZlIH0gPSB3aXRoUmVzb2x2ZXJzPHZvaWQ+KCk7XG4gIGNvbnN0IGVudHJ5OiBEZWxpdmVyeUJhcnJpZXJFbnRyeSA9IHtcbiAgICBraW5kLFxuICAgIGRlbGl2ZXJlZDogcHJvbWlzZSxcbiAgICBhcm1lZDogb3B0aW9ucy5hcm1lZCA/PyB0cnVlLFxuICB9O1xuICBiYXJyaWVycy5zZXQoZXZlbnRJbmRleCwgZW50cnkpO1xuXG4gIGNvbnN0IGZpbmlzaCA9ICgpID0+IHtcbiAgICBpZiAoZG9uZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkb25lID0gdHJ1ZTtcbiAgICBpZiAoYmFycmllcnMuZ2V0KGV2ZW50SW5kZXgpID09PSBlbnRyeSkge1xuICAgICAgYmFycmllcnMuZGVsZXRlKGV2ZW50SW5kZXgpO1xuICAgIH1cbiAgICByZXNvbHZlKCk7XG4gIH07XG5cbiAgLy8gU2FmZXR5IG5ldDogaWYgdGhpcyBkZWxpdmVyeSBpcyBuZXZlciBkZWxpdmVyZWQgdG8gdGhlIHdvcmtmbG93IChpdHNcbiAgLy8gYnJhbmNoIHdhcyBub3QgdGFrZW4gLyB0aGUgcnVuIGlzIHN1c3BlbmRpbmcsIG9yIGEgYnVmZmVyZWQgaG9vayBwYXlsb2FkXG4gIC8vIGlzIG9ubHkgY2xhaW1lZCBhZnRlciBhIGxhdGVyIGRlbGl2ZXJ5IHRoZSB3b3JrZmxvdyBpcyBzdGlsbCB3YWl0aW5nIG9uKSxcbiAgLy8gcmVzb2x2ZSBhdCBpZGxlIHNvIGEgbGF0ZXIgZGVsaXZlcnkgZ2F0ZWQgb24gaXQgY2Fubm90IGRlYWRsb2NrIGFuZCB0aGVcbiAgLy8gcmVnaXN0cnkgY2Fubm90IGxlYWsgYW4gZW50cnkgcGVyIGFiYW5kb25lZCBkZWxpdmVyeS5cbiAgc2NoZWR1bGVXaGVuSWRsZShjdHgsIGZpbmlzaCk7XG5cbiAgcmV0dXJuIHtcbiAgICBtYXJrRGVsaXZlcmVkOiBmaW5pc2gsXG4gICAgYXJtOiAoKSA9PiB7XG4gICAgICBlbnRyeS5hcm1lZCA9IHRydWU7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBTY2hlZHVsZSBhIGNhbGxiYWNrIHRvIGZpcmUgb25seSBhZnRlciBhbGwgcGVuZGluZyBkYXRhIGRlbGl2ZXJpZXNcbiAqIChzdGVwIHJlc3VsdHMsIGhvb2sgcGF5bG9hZHMpIGFuZCBhc3luYyBkZXNlcmlhbGl6YXRpb24gaGF2ZSBjb21wbGV0ZWQuXG4gKiBVc2VzIGEgcG9sbGluZyBsb29wOiBzZXRUaW1lb3V0KDApIOKGkiBjaGVjayBwZW5kaW5nRGVsaXZlcmllcyDihpJcbiAqIGlmID4gMCwgd2FpdCBmb3IgcHJvbWlzZVF1ZXVlIOKGkiByZXBlYXQuIFRoaXMgaGFuZGxlcyB0aGUgbXVsdGktcm91bmRcbiAqIGRlbGl2ZXJ5IHBhdHRlcm4gd2hlcmUgZWFjaCBob29rIHBheWxvYWQgZGVsaXZlcnkgY3ljbGUgYXBwZW5kcyBuZXdcbiAqIGFzeW5jIHdvcmsgdG8gdGhlIHByb21pc2VRdWV1ZS5cbiAqXG4gKiBUaGUgaW5pdGlhbCBgc2V0VGltZW91dCgwKWAgbWFjcm90YXNrIGlzIGxvYWQtYmVhcmluZyBhbmQgbXVzdCBOT1QgYmVcbiAqIGRvd25ncmFkZWQgdG8gYSBtaWNyb3Rhc2sgKGBxdWV1ZU1pY3JvdGFza2AvYFByb21pc2UucmVzb2x2ZSgpLnRoZW5gKS5cbiAqIGBwZW5kaW5nRGVsaXZlcmllc2Agb25seSBndWFyZHMgdGhlIGhvc3Qtc2lkZSBoeWRyYXRpb24gd2luZG93OyBiZXR3ZWVuIGFcbiAqIGRlbGl2ZXJ5J3MgYHJlc29sdmUoKWAgYW5kIHRoZSB3b3JrZmxvdyBWTSBib2R5IHJ1bm5pbmcgaXRzIGNvbnRpbnVhdGlvbiB0b1xuICogcmVnaXN0ZXIgdGhlIG5leHQgc3Vic2NyaWJlciwgYHBlbmRpbmdEZWxpdmVyaWVzYCBpcyBhbHJlYWR5IDAgZXZlbiB0aG91Z2hcbiAqIHRoZSBWTSBpcyBtaWQtcmVhY3Rpb24uIE5vZGUgZG9lcyBub3QgZ3VhcmFudGVlIGEgbWljcm90YXNrIHNjaGVkdWxlZCBpblxuICogdGhlIGhvc3QgY29udGV4dCBzZXR0bGVzIGFmdGVyIHRoZSBjcm9zcy1WTSBwcm9taXNlIGNoYWluIChyZXNvbHZlIGluIGhvc3RcbiAqIOKGkiB3b3JrZmxvdyBjb2RlIGluIFZNIOKGkiBzdWJzY3JpYmUgYmFjayBpbiBob3N0KTsgdGhlIG1hY3JvdGFzayBib3VuZGFyeVxuICogZ2l2ZXMgdGhhdCBjaGFpbiB0aW1lIHRvIHJ1biwgc28gdGhlIHN1c3BlbnNpb24gZG9lcyBub3QgcHJlZW1wdCBhIHNpYmxpbmdcbiAqIGRlbGl2ZXJ5IHN0aWxsIGluIGZsaWdodC4gRW1waXJpY2FsbHksIHJlcGxhY2luZyBpdCB3aXRoIGBxdWV1ZU1pY3JvdGFza2BcbiAqIGJyZWFrcyBob29rL3NsZWVwIGBQcm9taXNlLnJhY2VgIG9yZGVyaW5nIChDb3JydXB0ZWRFdmVudExvZ0Vycm9yKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjaGVkdWxlV2hlbklkbGUoXG4gIGN0eDogV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0LFxuICBmbjogKCkgPT4gdm9pZFxuKTogdm9pZCB7XG4gIGNvbnN0IGNoZWNrID0gKCkgPT4ge1xuICAgIGlmIChjdHgucGVuZGluZ0RlbGl2ZXJpZXMgPiAwKSB7XG4gICAgICAvLyBTdGlsbCBkZWxpdmVyaW5nIGRhdGEg4oCUIHdhaXQgZm9yIHF1ZXVlIHRvIGRyYWluLCB0aGVuIHJlLWNoZWNrXG4gICAgICBjdHgucHJvbWlzZVF1ZXVlLnRoZW4oKCkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KGNoZWNrLCAwKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmbigpO1xuICAgIH1cbiAgfTtcbiAgc2V0VGltZW91dChjaGVjaywgMCk7XG59XG4iXX0=
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { Event, WorkflowRun } from '@workflow/world';
|
|
2
|
+
import type { PayloadKey } from './serialization/encryption.js';
|
|
3
|
+
import { type PreparedReplayPayload, type ReplayPayloadPreparer } from './serialization.js';
|
|
4
|
+
type ReplayPayloadField = 'result' | 'error' | 'payload';
|
|
5
|
+
/**
|
|
6
|
+
* Invocation-scoped cache for replay payload hydration.
|
|
7
|
+
*
|
|
8
|
+
* A workflow invocation may replay the same event log through several fresh
|
|
9
|
+
* VMs. This cache keeps the VM-independent decrypt/decompress result across
|
|
10
|
+
* those replays. Deserialization still runs against each VM's globals so every
|
|
11
|
+
* replay receives fresh object graphs and correctly revived Workflow objects.
|
|
12
|
+
*
|
|
13
|
+
* Successful prepared plaintext remains resident for the invocation lifetime.
|
|
14
|
+
* Its memory cost is the sum of decrypted and decompressed payload sizes, but
|
|
15
|
+
* it never crosses workflow runs or queue deliveries.
|
|
16
|
+
*/
|
|
17
|
+
export declare class ReplayPayloadCache {
|
|
18
|
+
private readonly encryptionKey;
|
|
19
|
+
private readonly preparer;
|
|
20
|
+
private readonly preparedPayloads;
|
|
21
|
+
private readonly primitiveStepResults;
|
|
22
|
+
private nextUnscannedEventIndex;
|
|
23
|
+
constructor(encryptionKey: PayloadKey | undefined, preparer?: ReplayPayloadPreparer);
|
|
24
|
+
/**
|
|
25
|
+
* Start every missing binary preparation before workflow execution. Failures
|
|
26
|
+
* are intentionally retained: the ordered event consumer must observe the
|
|
27
|
+
* original rejection before that entry becomes retryable.
|
|
28
|
+
*/
|
|
29
|
+
prewarm(workflowRun: WorkflowRun, events: Event[]): Promise<void>;
|
|
30
|
+
/** Return the workflow input after shared host-side preparation. */
|
|
31
|
+
prepareWorkflowInput(workflowRun: WorkflowRun): Promise<PreparedReplayPayload>;
|
|
32
|
+
/**
|
|
33
|
+
* Return an event payload after shared host-side preparation. A rejected
|
|
34
|
+
* preparation is evicted only after this ordered consumer requests it, so a
|
|
35
|
+
* later replay can retry without hiding the original failure.
|
|
36
|
+
*/
|
|
37
|
+
prepareEventPayload(eventId: string, field: ReplayPayloadField, value: unknown): Promise<PreparedReplayPayload>;
|
|
38
|
+
/**
|
|
39
|
+
* Reuse final step values only when sharing them across VMs is unobservable.
|
|
40
|
+
* Objects and large strings/bigints always run `hydrate` again, producing a
|
|
41
|
+
* fresh VM-specific value from the separately cached prepared payload.
|
|
42
|
+
*/
|
|
43
|
+
getStepResult(eventId: string, hydrate: () => Promise<unknown>): Promise<unknown>;
|
|
44
|
+
/**
|
|
45
|
+
* Consumer-facing lookup. Binary payloads share preparation; legacy values
|
|
46
|
+
* bypass the cache because their flattened representation may be mutated.
|
|
47
|
+
*/
|
|
48
|
+
private consumePreparation;
|
|
49
|
+
/** Start preparation once and share the exact in-flight promise. */
|
|
50
|
+
private ensurePreparation;
|
|
51
|
+
/** Normalize synchronous and asynchronous preparers to one promise contract. */
|
|
52
|
+
private runPreparation;
|
|
53
|
+
private workflowInputKey;
|
|
54
|
+
private eventPayloadKey;
|
|
55
|
+
}
|
|
56
|
+
export {};
|
|
57
|
+
//# sourceMappingURL=replay-payload-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replay-payload-cache.d.ts","sourceRoot":"","sources":["../src/replay-payload-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EACL,KAAK,qBAAqB,EAE1B,KAAK,qBAAqB,EAC3B,MAAM,oBAAoB,CAAC;AAG5B,KAAK,kBAAkB,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;AAezD;;;;;;;;;;;GAWG;AACH,qBAAa,kBAAkB;IAS3B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAT3B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAG7B;IACJ,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA8B;IACnE,OAAO,CAAC,uBAAuB,CAAK;gBAGjB,aAAa,EAAE,UAAU,GAAG,SAAS,EACrC,QAAQ,GAAE,qBAA4C;IAGzE;;;;OAIG;IACG,OAAO,CAAC,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAoDvE,oEAAoE;IACpE,oBAAoB,CAClB,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC,qBAAqB,CAAC;IAOjC;;;;OAIG;IACH,mBAAmB,CACjB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,kBAAkB,EACzB,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,qBAAqB,CAAC;IAIjC;;;;OAIG;IACG,aAAa,CACjB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAC9B,OAAO,CAAC,OAAO,CAAC;IAYnB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAe1B,oEAAoE;IACpE,OAAO,CAAC,iBAAiB;IAYzB,gFAAgF;YAClE,cAAc;IAI5B,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,eAAe;CAGxB"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { prepareReplayPayload, } from './serialization.js';
|
|
2
|
+
const MAX_MEMOIZED_PRIMITIVE_LENGTH = 4096;
|
|
3
|
+
function isMemoizablePrimitive(value) {
|
|
4
|
+
if (value === null)
|
|
5
|
+
return true;
|
|
6
|
+
const type = typeof value;
|
|
7
|
+
if (type === 'object' || type === 'function')
|
|
8
|
+
return false;
|
|
9
|
+
if (type === 'string') {
|
|
10
|
+
return value.length <= MAX_MEMOIZED_PRIMITIVE_LENGTH;
|
|
11
|
+
}
|
|
12
|
+
if (type === 'bigint') {
|
|
13
|
+
return value.toString().length <= MAX_MEMOIZED_PRIMITIVE_LENGTH;
|
|
14
|
+
}
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Invocation-scoped cache for replay payload hydration.
|
|
19
|
+
*
|
|
20
|
+
* A workflow invocation may replay the same event log through several fresh
|
|
21
|
+
* VMs. This cache keeps the VM-independent decrypt/decompress result across
|
|
22
|
+
* those replays. Deserialization still runs against each VM's globals so every
|
|
23
|
+
* replay receives fresh object graphs and correctly revived Workflow objects.
|
|
24
|
+
*
|
|
25
|
+
* Successful prepared plaintext remains resident for the invocation lifetime.
|
|
26
|
+
* Its memory cost is the sum of decrypted and decompressed payload sizes, but
|
|
27
|
+
* it never crosses workflow runs or queue deliveries.
|
|
28
|
+
*/
|
|
29
|
+
export class ReplayPayloadCache {
|
|
30
|
+
encryptionKey;
|
|
31
|
+
preparer;
|
|
32
|
+
preparedPayloads = new Map();
|
|
33
|
+
primitiveStepResults = new Map();
|
|
34
|
+
nextUnscannedEventIndex = 0;
|
|
35
|
+
constructor(encryptionKey, preparer = prepareReplayPayload) {
|
|
36
|
+
this.encryptionKey = encryptionKey;
|
|
37
|
+
this.preparer = preparer;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Start every missing binary preparation before workflow execution. Failures
|
|
41
|
+
* are intentionally retained: the ordered event consumer must observe the
|
|
42
|
+
* original rejection before that entry becomes retryable.
|
|
43
|
+
*/
|
|
44
|
+
async prewarm(workflowRun, events) {
|
|
45
|
+
const preparations = [];
|
|
46
|
+
const start = (cacheKey, value) => {
|
|
47
|
+
// Legacy flattened values may be mutated by devalue's unflatten and are
|
|
48
|
+
// therefore prepared only by their eventual consumer, never cached.
|
|
49
|
+
if (!(value instanceof Uint8Array))
|
|
50
|
+
return;
|
|
51
|
+
// Each replay scans the full event log, so awaiting cached promises here
|
|
52
|
+
// would add O(N^2) promise reactions over an N-step invocation. Only wait
|
|
53
|
+
// for preparations first discovered by this prewarm pass.
|
|
54
|
+
if (this.preparedPayloads.has(cacheKey))
|
|
55
|
+
return;
|
|
56
|
+
preparations.push(this.ensurePreparation(cacheKey, value));
|
|
57
|
+
};
|
|
58
|
+
start(this.workflowInputKey(workflowRun.runId), workflowRun.input);
|
|
59
|
+
// This cache is scoped to one invocation and its append-only event log.
|
|
60
|
+
// Full snapshot reloads preserve the already-seen prefix, so its length is
|
|
61
|
+
// enough to locate events appended since the previous replay.
|
|
62
|
+
for (let index = this.nextUnscannedEventIndex; index < events.length; index++) {
|
|
63
|
+
const event = events[index];
|
|
64
|
+
switch (event.eventType) {
|
|
65
|
+
case 'step_completed':
|
|
66
|
+
start(this.eventPayloadKey(event.eventId, 'result'), event.eventData?.result);
|
|
67
|
+
break;
|
|
68
|
+
case 'step_failed':
|
|
69
|
+
start(this.eventPayloadKey(event.eventId, 'error'), event.eventData?.error);
|
|
70
|
+
break;
|
|
71
|
+
case 'hook_received':
|
|
72
|
+
start(this.eventPayloadKey(event.eventId, 'payload'), event.eventData?.payload);
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
this.nextUnscannedEventIndex = events.length;
|
|
77
|
+
// Prewarming is speculative and must not fail replay before the matching
|
|
78
|
+
// event is consumed. allSettled also attaches rejection handlers eagerly.
|
|
79
|
+
await Promise.allSettled(preparations);
|
|
80
|
+
}
|
|
81
|
+
/** Return the workflow input after shared host-side preparation. */
|
|
82
|
+
prepareWorkflowInput(workflowRun) {
|
|
83
|
+
return this.consumePreparation(this.workflowInputKey(workflowRun.runId), workflowRun.input);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Return an event payload after shared host-side preparation. A rejected
|
|
87
|
+
* preparation is evicted only after this ordered consumer requests it, so a
|
|
88
|
+
* later replay can retry without hiding the original failure.
|
|
89
|
+
*/
|
|
90
|
+
prepareEventPayload(eventId, field, value) {
|
|
91
|
+
return this.consumePreparation(this.eventPayloadKey(eventId, field), value);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Reuse final step values only when sharing them across VMs is unobservable.
|
|
95
|
+
* Objects and large strings/bigints always run `hydrate` again, producing a
|
|
96
|
+
* fresh VM-specific value from the separately cached prepared payload.
|
|
97
|
+
*/
|
|
98
|
+
async getStepResult(eventId, hydrate) {
|
|
99
|
+
if (this.primitiveStepResults.has(eventId)) {
|
|
100
|
+
return this.primitiveStepResults.get(eventId);
|
|
101
|
+
}
|
|
102
|
+
const value = await hydrate();
|
|
103
|
+
if (isMemoizablePrimitive(value)) {
|
|
104
|
+
this.primitiveStepResults.set(eventId, value);
|
|
105
|
+
}
|
|
106
|
+
return value;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Consumer-facing lookup. Binary payloads share preparation; legacy values
|
|
110
|
+
* bypass the cache because their flattened representation may be mutated.
|
|
111
|
+
*/
|
|
112
|
+
consumePreparation(cacheKey, value) {
|
|
113
|
+
if (!(value instanceof Uint8Array))
|
|
114
|
+
return this.runPreparation(value);
|
|
115
|
+
const preparation = this.ensurePreparation(cacheKey, value);
|
|
116
|
+
void preparation.catch(() => {
|
|
117
|
+
if (this.preparedPayloads.get(cacheKey) === preparation) {
|
|
118
|
+
this.preparedPayloads.delete(cacheKey);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
return preparation;
|
|
122
|
+
}
|
|
123
|
+
/** Start preparation once and share the exact in-flight promise. */
|
|
124
|
+
ensurePreparation(cacheKey, value) {
|
|
125
|
+
const cached = this.preparedPayloads.get(cacheKey);
|
|
126
|
+
if (cached)
|
|
127
|
+
return cached;
|
|
128
|
+
const preparation = this.runPreparation(value);
|
|
129
|
+
this.preparedPayloads.set(cacheKey, preparation);
|
|
130
|
+
return preparation;
|
|
131
|
+
}
|
|
132
|
+
/** Normalize synchronous and asynchronous preparers to one promise contract. */
|
|
133
|
+
async runPreparation(value) {
|
|
134
|
+
return this.preparer(value, this.encryptionKey);
|
|
135
|
+
}
|
|
136
|
+
workflowInputKey(runId) {
|
|
137
|
+
return `run:${runId}:input`;
|
|
138
|
+
}
|
|
139
|
+
eventPayloadKey(eventId, field) {
|
|
140
|
+
return `event:${eventId}:${field}`;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwbGF5LXBheWxvYWQtY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcmVwbGF5LXBheWxvYWQtY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUVMLG9CQUFvQixHQUVyQixNQUFNLG9CQUFvQixDQUFDO0FBRTVCLE1BQU0sNkJBQTZCLEdBQUcsSUFBSSxDQUFDO0FBRzNDLFNBQVMscUJBQXFCLENBQUMsS0FBYztJQUMzQyxJQUFJLEtBQUssS0FBSyxJQUFJO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDaEMsTUFBTSxJQUFJLEdBQUcsT0FBTyxLQUFLLENBQUM7SUFDMUIsSUFBSSxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksS0FBSyxVQUFVO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDM0QsSUFBSSxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDdEIsT0FBUSxLQUFnQixDQUFDLE1BQU0sSUFBSSw2QkFBNkIsQ0FBQztJQUNuRSxDQUFDO0lBQ0QsSUFBSSxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDdEIsT0FBUSxLQUFnQixDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sSUFBSSw2QkFBNkIsQ0FBQztJQUM5RSxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLE9BQU8sa0JBQWtCO0lBU1Y7SUFDQTtJQVRGLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUd4QyxDQUFDO0lBQ2Esb0JBQW9CLEdBQUcsSUFBSSxHQUFHLEVBQW1CLENBQUM7SUFDM0QsdUJBQXVCLEdBQUcsQ0FBQyxDQUFDO0lBRXBDLFlBQ21CLGFBQXFDLEVBQ3JDLFdBQWtDLG9CQUFvQjtRQUR0RCxrQkFBYSxHQUFiLGFBQWEsQ0FBd0I7UUFDckMsYUFBUSxHQUFSLFFBQVEsQ0FBOEM7SUFDdEUsQ0FBQztJQUVKOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQXdCLEVBQUUsTUFBZTtRQUNyRCxNQUFNLFlBQVksR0FBcUMsRUFBRSxDQUFDO1FBQzFELE1BQU0sS0FBSyxHQUFHLENBQUMsUUFBZ0IsRUFBRSxLQUFjLEVBQVEsRUFBRTtZQUN2RCx3RUFBd0U7WUFDeEUsb0VBQW9FO1lBQ3BFLElBQUksQ0FBQyxDQUFDLEtBQUssWUFBWSxVQUFVLENBQUM7Z0JBQUUsT0FBTztZQUUzQyx5RUFBeUU7WUFDekUsMEVBQTBFO1lBQzFFLDBEQUEwRDtZQUMxRCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO2dCQUFFLE9BQU87WUFDaEQsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDN0QsQ0FBQyxDQUFDO1FBRUYsS0FBSyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUUsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25FLHdFQUF3RTtRQUN4RSwyRUFBMkU7UUFDM0UsOERBQThEO1FBQzlELEtBQ0UsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixFQUN4QyxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFDckIsS0FBSyxFQUFFLEVBQ1AsQ0FBQztZQUNELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM1QixRQUFRLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDeEIsS0FBSyxnQkFBZ0I7b0JBQ25CLEtBQUssQ0FDSCxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLEVBQzdDLEtBQUssQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUN4QixDQUFDO29CQUNGLE1BQU07Z0JBQ1IsS0FBSyxhQUFhO29CQUNoQixLQUFLLENBQ0gsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxFQUM1QyxLQUFLLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FDdkIsQ0FBQztvQkFDRixNQUFNO2dCQUNSLEtBQUssZUFBZTtvQkFDbEIsS0FBSyxDQUNILElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsRUFDOUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQ3pCLENBQUM7b0JBQ0YsTUFBTTtZQUNWLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxDQUFDLHVCQUF1QixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFFN0MseUVBQXlFO1FBQ3pFLDBFQUEwRTtRQUMxRSxNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELG9FQUFvRTtJQUNwRSxvQkFBb0IsQ0FDbEIsV0FBd0I7UUFFeEIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQzVCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQ3hDLFdBQVcsQ0FBQyxLQUFLLENBQ2xCLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILG1CQUFtQixDQUNqQixPQUFlLEVBQ2YsS0FBeUIsRUFDekIsS0FBYztRQUVkLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLGFBQWEsQ0FDakIsT0FBZSxFQUNmLE9BQStCO1FBRS9CLElBQUksSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzNDLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsTUFBTSxPQUFPLEVBQUUsQ0FBQztRQUM5QixJQUFJLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDaEQsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGtCQUFrQixDQUN4QixRQUFnQixFQUNoQixLQUFjO1FBRWQsSUFBSSxDQUFDLENBQUMsS0FBSyxZQUFZLFVBQVUsQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV0RSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzVELEtBQUssV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUU7WUFDMUIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLFdBQVcsRUFBRSxDQUFDO2dCQUN4RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3pDLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxvRUFBb0U7SUFDNUQsaUJBQWlCLENBQ3ZCLFFBQWdCLEVBQ2hCLEtBQWlCO1FBRWpCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkQsSUFBSSxNQUFNO1lBQUUsT0FBTyxNQUFNLENBQUM7UUFFMUIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNqRCxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBRUQsZ0ZBQWdGO0lBQ3hFLEtBQUssQ0FBQyxjQUFjLENBQUMsS0FBYztRQUN6QyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsS0FBYTtRQUNwQyxPQUFPLE9BQU8sS0FBSyxRQUFRLENBQUM7SUFDOUIsQ0FBQztJQUVPLGVBQWUsQ0FBQyxPQUFlLEVBQUUsS0FBeUI7UUFDaEUsT0FBTyxTQUFTLE9BQU8sSUFBSSxLQUFLLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEV2ZW50LCBXb3JrZmxvd1J1biB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgdHlwZSB7IFBheWxvYWRLZXkgfSBmcm9tICcuL3NlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQge1xuICB0eXBlIFByZXBhcmVkUmVwbGF5UGF5bG9hZCxcbiAgcHJlcGFyZVJlcGxheVBheWxvYWQsXG4gIHR5cGUgUmVwbGF5UGF5bG9hZFByZXBhcmVyLFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24uanMnO1xuXG5jb25zdCBNQVhfTUVNT0laRURfUFJJTUlUSVZFX0xFTkdUSCA9IDQwOTY7XG50eXBlIFJlcGxheVBheWxvYWRGaWVsZCA9ICdyZXN1bHQnIHwgJ2Vycm9yJyB8ICdwYXlsb2FkJztcblxuZnVuY3Rpb24gaXNNZW1vaXphYmxlUHJpbWl0aXZlKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIGlmICh0eXBlID09PSAnb2JqZWN0JyB8fCB0eXBlID09PSAnZnVuY3Rpb24nKSByZXR1cm4gZmFsc2U7XG4gIGlmICh0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiAodmFsdWUgYXMgc3RyaW5nKS5sZW5ndGggPD0gTUFYX01FTU9JWkVEX1BSSU1JVElWRV9MRU5HVEg7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdiaWdpbnQnKSB7XG4gICAgcmV0dXJuICh2YWx1ZSBhcyBiaWdpbnQpLnRvU3RyaW5nKCkubGVuZ3RoIDw9IE1BWF9NRU1PSVpFRF9QUklNSVRJVkVfTEVOR1RIO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEludm9jYXRpb24tc2NvcGVkIGNhY2hlIGZvciByZXBsYXkgcGF5bG9hZCBoeWRyYXRpb24uXG4gKlxuICogQSB3b3JrZmxvdyBpbnZvY2F0aW9uIG1heSByZXBsYXkgdGhlIHNhbWUgZXZlbnQgbG9nIHRocm91Z2ggc2V2ZXJhbCBmcmVzaFxuICogVk1zLiBUaGlzIGNhY2hlIGtlZXBzIHRoZSBWTS1pbmRlcGVuZGVudCBkZWNyeXB0L2RlY29tcHJlc3MgcmVzdWx0IGFjcm9zc1xuICogdGhvc2UgcmVwbGF5cy4gRGVzZXJpYWxpemF0aW9uIHN0aWxsIHJ1bnMgYWdhaW5zdCBlYWNoIFZNJ3MgZ2xvYmFscyBzbyBldmVyeVxuICogcmVwbGF5IHJlY2VpdmVzIGZyZXNoIG9iamVjdCBncmFwaHMgYW5kIGNvcnJlY3RseSByZXZpdmVkIFdvcmtmbG93IG9iamVjdHMuXG4gKlxuICogU3VjY2Vzc2Z1bCBwcmVwYXJlZCBwbGFpbnRleHQgcmVtYWlucyByZXNpZGVudCBmb3IgdGhlIGludm9jYXRpb24gbGlmZXRpbWUuXG4gKiBJdHMgbWVtb3J5IGNvc3QgaXMgdGhlIHN1bSBvZiBkZWNyeXB0ZWQgYW5kIGRlY29tcHJlc3NlZCBwYXlsb2FkIHNpemVzLCBidXRcbiAqIGl0IG5ldmVyIGNyb3NzZXMgd29ya2Zsb3cgcnVucyBvciBxdWV1ZSBkZWxpdmVyaWVzLlxuICovXG5leHBvcnQgY2xhc3MgUmVwbGF5UGF5bG9hZENhY2hlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBwcmVwYXJlZFBheWxvYWRzID0gbmV3IE1hcDxcbiAgICBzdHJpbmcsXG4gICAgUHJvbWlzZTxQcmVwYXJlZFJlcGxheVBheWxvYWQ+XG4gID4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBwcmltaXRpdmVTdGVwUmVzdWx0cyA9IG5ldyBNYXA8c3RyaW5nLCB1bmtub3duPigpO1xuICBwcml2YXRlIG5leHRVbnNjYW5uZWRFdmVudEluZGV4ID0gMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVuY3J5cHRpb25LZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBwcmVwYXJlcjogUmVwbGF5UGF5bG9hZFByZXBhcmVyID0gcHJlcGFyZVJlcGxheVBheWxvYWRcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBTdGFydCBldmVyeSBtaXNzaW5nIGJpbmFyeSBwcmVwYXJhdGlvbiBiZWZvcmUgd29ya2Zsb3cgZXhlY3V0aW9uLiBGYWlsdXJlc1xuICAgKiBhcmUgaW50ZW50aW9uYWxseSByZXRhaW5lZDogdGhlIG9yZGVyZWQgZXZlbnQgY29uc3VtZXIgbXVzdCBvYnNlcnZlIHRoZVxuICAgKiBvcmlnaW5hbCByZWplY3Rpb24gYmVmb3JlIHRoYXQgZW50cnkgYmVjb21lcyByZXRyeWFibGUuXG4gICAqL1xuICBhc3luYyBwcmV3YXJtKHdvcmtmbG93UnVuOiBXb3JrZmxvd1J1biwgZXZlbnRzOiBFdmVudFtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcHJlcGFyYXRpb25zOiBQcm9taXNlPFByZXBhcmVkUmVwbGF5UGF5bG9hZD5bXSA9IFtdO1xuICAgIGNvbnN0IHN0YXJ0ID0gKGNhY2hlS2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCA9PiB7XG4gICAgICAvLyBMZWdhY3kgZmxhdHRlbmVkIHZhbHVlcyBtYXkgYmUgbXV0YXRlZCBieSBkZXZhbHVlJ3MgdW5mbGF0dGVuIGFuZCBhcmVcbiAgICAgIC8vIHRoZXJlZm9yZSBwcmVwYXJlZCBvbmx5IGJ5IHRoZWlyIGV2ZW50dWFsIGNvbnN1bWVyLCBuZXZlciBjYWNoZWQuXG4gICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSByZXR1cm47XG5cbiAgICAgIC8vIEVhY2ggcmVwbGF5IHNjYW5zIHRoZSBmdWxsIGV2ZW50IGxvZywgc28gYXdhaXRpbmcgY2FjaGVkIHByb21pc2VzIGhlcmVcbiAgICAgIC8vIHdvdWxkIGFkZCBPKE5eMikgcHJvbWlzZSByZWFjdGlvbnMgb3ZlciBhbiBOLXN0ZXAgaW52b2NhdGlvbi4gT25seSB3YWl0XG4gICAgICAvLyBmb3IgcHJlcGFyYXRpb25zIGZpcnN0IGRpc2NvdmVyZWQgYnkgdGhpcyBwcmV3YXJtIHBhc3MuXG4gICAgICBpZiAodGhpcy5wcmVwYXJlZFBheWxvYWRzLmhhcyhjYWNoZUtleSkpIHJldHVybjtcbiAgICAgIHByZXBhcmF0aW9ucy5wdXNoKHRoaXMuZW5zdXJlUHJlcGFyYXRpb24oY2FjaGVLZXksIHZhbHVlKSk7XG4gICAgfTtcblxuICAgIHN0YXJ0KHRoaXMud29ya2Zsb3dJbnB1dEtleSh3b3JrZmxvd1J1bi5ydW5JZCksIHdvcmtmbG93UnVuLmlucHV0KTtcbiAgICAvLyBUaGlzIGNhY2hlIGlzIHNjb3BlZCB0byBvbmUgaW52b2NhdGlvbiBhbmQgaXRzIGFwcGVuZC1vbmx5IGV2ZW50IGxvZy5cbiAgICAvLyBGdWxsIHNuYXBzaG90IHJlbG9hZHMgcHJlc2VydmUgdGhlIGFscmVhZHktc2VlbiBwcmVmaXgsIHNvIGl0cyBsZW5ndGggaXNcbiAgICAvLyBlbm91Z2ggdG8gbG9jYXRlIGV2ZW50cyBhcHBlbmRlZCBzaW5jZSB0aGUgcHJldmlvdXMgcmVwbGF5LlxuICAgIGZvciAoXG4gICAgICBsZXQgaW5kZXggPSB0aGlzLm5leHRVbnNjYW5uZWRFdmVudEluZGV4O1xuICAgICAgaW5kZXggPCBldmVudHMubGVuZ3RoO1xuICAgICAgaW5kZXgrK1xuICAgICkge1xuICAgICAgY29uc3QgZXZlbnQgPSBldmVudHNbaW5kZXhdO1xuICAgICAgc3dpdGNoIChldmVudC5ldmVudFR5cGUpIHtcbiAgICAgICAgY2FzZSAnc3RlcF9jb21wbGV0ZWQnOlxuICAgICAgICAgIHN0YXJ0KFxuICAgICAgICAgICAgdGhpcy5ldmVudFBheWxvYWRLZXkoZXZlbnQuZXZlbnRJZCwgJ3Jlc3VsdCcpLFxuICAgICAgICAgICAgZXZlbnQuZXZlbnREYXRhPy5yZXN1bHRcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdzdGVwX2ZhaWxlZCc6XG4gICAgICAgICAgc3RhcnQoXG4gICAgICAgICAgICB0aGlzLmV2ZW50UGF5bG9hZEtleShldmVudC5ldmVudElkLCAnZXJyb3InKSxcbiAgICAgICAgICAgIGV2ZW50LmV2ZW50RGF0YT8uZXJyb3JcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdob29rX3JlY2VpdmVkJzpcbiAgICAgICAgICBzdGFydChcbiAgICAgICAgICAgIHRoaXMuZXZlbnRQYXlsb2FkS2V5KGV2ZW50LmV2ZW50SWQsICdwYXlsb2FkJyksXG4gICAgICAgICAgICBldmVudC5ldmVudERhdGE/LnBheWxvYWRcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm5leHRVbnNjYW5uZWRFdmVudEluZGV4ID0gZXZlbnRzLmxlbmd0aDtcblxuICAgIC8vIFByZXdhcm1pbmcgaXMgc3BlY3VsYXRpdmUgYW5kIG11c3Qgbm90IGZhaWwgcmVwbGF5IGJlZm9yZSB0aGUgbWF0Y2hpbmdcbiAgICAvLyBldmVudCBpcyBjb25zdW1lZC4gYWxsU2V0dGxlZCBhbHNvIGF0dGFjaGVzIHJlamVjdGlvbiBoYW5kbGVycyBlYWdlcmx5LlxuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChwcmVwYXJhdGlvbnMpO1xuICB9XG5cbiAgLyoqIFJldHVybiB0aGUgd29ya2Zsb3cgaW5wdXQgYWZ0ZXIgc2hhcmVkIGhvc3Qtc2lkZSBwcmVwYXJhdGlvbi4gKi9cbiAgcHJlcGFyZVdvcmtmbG93SW5wdXQoXG4gICAgd29ya2Zsb3dSdW46IFdvcmtmbG93UnVuXG4gICk6IFByb21pc2U8UHJlcGFyZWRSZXBsYXlQYXlsb2FkPiB7XG4gICAgcmV0dXJuIHRoaXMuY29uc3VtZVByZXBhcmF0aW9uKFxuICAgICAgdGhpcy53b3JrZmxvd0lucHV0S2V5KHdvcmtmbG93UnVuLnJ1bklkKSxcbiAgICAgIHdvcmtmbG93UnVuLmlucHV0XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gZXZlbnQgcGF5bG9hZCBhZnRlciBzaGFyZWQgaG9zdC1zaWRlIHByZXBhcmF0aW9uLiBBIHJlamVjdGVkXG4gICAqIHByZXBhcmF0aW9uIGlzIGV2aWN0ZWQgb25seSBhZnRlciB0aGlzIG9yZGVyZWQgY29uc3VtZXIgcmVxdWVzdHMgaXQsIHNvIGFcbiAgICogbGF0ZXIgcmVwbGF5IGNhbiByZXRyeSB3aXRob3V0IGhpZGluZyB0aGUgb3JpZ2luYWwgZmFpbHVyZS5cbiAgICovXG4gIHByZXBhcmVFdmVudFBheWxvYWQoXG4gICAgZXZlbnRJZDogc3RyaW5nLFxuICAgIGZpZWxkOiBSZXBsYXlQYXlsb2FkRmllbGQsXG4gICAgdmFsdWU6IHVua25vd25cbiAgKTogUHJvbWlzZTxQcmVwYXJlZFJlcGxheVBheWxvYWQ+IHtcbiAgICByZXR1cm4gdGhpcy5jb25zdW1lUHJlcGFyYXRpb24odGhpcy5ldmVudFBheWxvYWRLZXkoZXZlbnRJZCwgZmllbGQpLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV1c2UgZmluYWwgc3RlcCB2YWx1ZXMgb25seSB3aGVuIHNoYXJpbmcgdGhlbSBhY3Jvc3MgVk1zIGlzIHVub2JzZXJ2YWJsZS5cbiAgICogT2JqZWN0cyBhbmQgbGFyZ2Ugc3RyaW5ncy9iaWdpbnRzIGFsd2F5cyBydW4gYGh5ZHJhdGVgIGFnYWluLCBwcm9kdWNpbmcgYVxuICAgKiBmcmVzaCBWTS1zcGVjaWZpYyB2YWx1ZSBmcm9tIHRoZSBzZXBhcmF0ZWx5IGNhY2hlZCBwcmVwYXJlZCBwYXlsb2FkLlxuICAgKi9cbiAgYXN5bmMgZ2V0U3RlcFJlc3VsdChcbiAgICBldmVudElkOiBzdHJpbmcsXG4gICAgaHlkcmF0ZTogKCkgPT4gUHJvbWlzZTx1bmtub3duPlxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBpZiAodGhpcy5wcmltaXRpdmVTdGVwUmVzdWx0cy5oYXMoZXZlbnRJZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnByaW1pdGl2ZVN0ZXBSZXN1bHRzLmdldChldmVudElkKTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IGh5ZHJhdGUoKTtcbiAgICBpZiAoaXNNZW1vaXphYmxlUHJpbWl0aXZlKHZhbHVlKSkge1xuICAgICAgdGhpcy5wcmltaXRpdmVTdGVwUmVzdWx0cy5zZXQoZXZlbnRJZCwgdmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQ29uc3VtZXItZmFjaW5nIGxvb2t1cC4gQmluYXJ5IHBheWxvYWRzIHNoYXJlIHByZXBhcmF0aW9uOyBsZWdhY3kgdmFsdWVzXG4gICAqIGJ5cGFzcyB0aGUgY2FjaGUgYmVjYXVzZSB0aGVpciBmbGF0dGVuZWQgcmVwcmVzZW50YXRpb24gbWF5IGJlIG11dGF0ZWQuXG4gICAqL1xuICBwcml2YXRlIGNvbnN1bWVQcmVwYXJhdGlvbihcbiAgICBjYWNoZUtleTogc3RyaW5nLFxuICAgIHZhbHVlOiB1bmtub3duXG4gICk6IFByb21pc2U8UHJlcGFyZWRSZXBsYXlQYXlsb2FkPiB7XG4gICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkgcmV0dXJuIHRoaXMucnVuUHJlcGFyYXRpb24odmFsdWUpO1xuXG4gICAgY29uc3QgcHJlcGFyYXRpb24gPSB0aGlzLmVuc3VyZVByZXBhcmF0aW9uKGNhY2hlS2V5LCB2YWx1ZSk7XG4gICAgdm9pZCBwcmVwYXJhdGlvbi5jYXRjaCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5wcmVwYXJlZFBheWxvYWRzLmdldChjYWNoZUtleSkgPT09IHByZXBhcmF0aW9uKSB7XG4gICAgICAgIHRoaXMucHJlcGFyZWRQYXlsb2Fkcy5kZWxldGUoY2FjaGVLZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBwcmVwYXJhdGlvbjtcbiAgfVxuXG4gIC8qKiBTdGFydCBwcmVwYXJhdGlvbiBvbmNlIGFuZCBzaGFyZSB0aGUgZXhhY3QgaW4tZmxpZ2h0IHByb21pc2UuICovXG4gIHByaXZhdGUgZW5zdXJlUHJlcGFyYXRpb24oXG4gICAgY2FjaGVLZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogVWludDhBcnJheVxuICApOiBQcm9taXNlPFByZXBhcmVkUmVwbGF5UGF5bG9hZD4ge1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMucHJlcGFyZWRQYXlsb2Fkcy5nZXQoY2FjaGVLZXkpO1xuICAgIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgICBjb25zdCBwcmVwYXJhdGlvbiA9IHRoaXMucnVuUHJlcGFyYXRpb24odmFsdWUpO1xuICAgIHRoaXMucHJlcGFyZWRQYXlsb2Fkcy5zZXQoY2FjaGVLZXksIHByZXBhcmF0aW9uKTtcbiAgICByZXR1cm4gcHJlcGFyYXRpb247XG4gIH1cblxuICAvKiogTm9ybWFsaXplIHN5bmNocm9ub3VzIGFuZCBhc3luY2hyb25vdXMgcHJlcGFyZXJzIHRvIG9uZSBwcm9taXNlIGNvbnRyYWN0LiAqL1xuICBwcml2YXRlIGFzeW5jIHJ1blByZXBhcmF0aW9uKHZhbHVlOiB1bmtub3duKTogUHJvbWlzZTxQcmVwYXJlZFJlcGxheVBheWxvYWQ+IHtcbiAgICByZXR1cm4gdGhpcy5wcmVwYXJlcih2YWx1ZSwgdGhpcy5lbmNyeXB0aW9uS2V5KTtcbiAgfVxuXG4gIHByaXZhdGUgd29ya2Zsb3dJbnB1dEtleShydW5JZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHJ1bjoke3J1bklkfTppbnB1dGA7XG4gIH1cblxuICBwcml2YXRlIGV2ZW50UGF5bG9hZEtleShldmVudElkOiBzdHJpbmcsIGZpZWxkOiBSZXBsYXlQYXlsb2FkRmllbGQpOiBzdHJpbmcge1xuICAgIHJldHVybiBgZXZlbnQ6JHtldmVudElkfToke2ZpZWxkfWA7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -85,6 +85,17 @@ export declare const MAX_MAX_INLINE_STEPS = 16;
|
|
|
85
85
|
* one-time warning so misconfiguration is observable.
|
|
86
86
|
*/
|
|
87
87
|
export declare function getMaxInlineSteps(): number;
|
|
88
|
+
/**
|
|
89
|
+
* Optional client-side override for the server-supplied per-run event ceiling.
|
|
90
|
+
* When set to a positive integer, the runtime clamps the server's limit *down*
|
|
91
|
+
* to this value (never raises it) so enforcement can be exercised without a
|
|
92
|
+
* server-side change. `undefined` (unset) ⇒ use the server value as-is.
|
|
93
|
+
*
|
|
94
|
+
* Reads `process.env.WORKFLOW_MAX_EVENTS_OVERRIDE` lazily so tests and
|
|
95
|
+
* deployments can override per invocation. Invalid values fall back to unset
|
|
96
|
+
* (no throw — the env var is an escape hatch) and emit a one-time warning.
|
|
97
|
+
*/
|
|
98
|
+
export declare function getMaxEventsOverride(): number | undefined;
|
|
88
99
|
/**
|
|
89
100
|
* Whether optimistic inline step start is enabled. When on, the owned-inline
|
|
90
101
|
* path begins running a brand-new step's body *before* its lazy `step_started`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/runtime/constants.ts"],"names":[],"mappings":"AAqBA,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAW9C;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,iBAAiB,SAAU,CAAC;AAEzC,2DAA2D;AAC3D,eAAO,MAAM,qBAAqB,QAAS,CAAC;AAE5C;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,SAAU,CAAC;AAgB7C;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CA6B3C;AAED;;;;;GAKG;AACH,wBAAgB,oCAAoC,IAAI,IAAI,CAE3D;AAMD,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAE5C;;;GAGG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,CAMnD;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC,8EAA8E;AAC9E,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC;;;GAGG;AACH,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAKvC;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CA2B1C;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,8BAA8B,IAAI,OAAO,CAIxD;AAED;;;;;;;;GAQG;AACH,wBAAgB,yCAAyC,IAAI,OAAO,CAInE;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAIxC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,IAAI,OAAO,CAIlD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAElD;;;;GAIG;AACH,eAAO,MAAM,kCAAkC,MAAM,CAAC;AAEtD;;;;;GAKG;AACH,wBAAgB,8BAA8B,IAAI,MAAM,CAMvD;AAKD,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAE/C;;;GAGG;AACH,wBAAgB,6BAA6B,IAAI,MAAM,CAMtD"}
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/runtime/constants.ts"],"names":[],"mappings":"AAqBA,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAW9C;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,iBAAiB,SAAU,CAAC;AAEzC,2DAA2D;AAC3D,eAAO,MAAM,qBAAqB,QAAS,CAAC;AAE5C;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,SAAU,CAAC;AAgB7C;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CA6B3C;AAED;;;;;GAKG;AACH,wBAAgB,oCAAoC,IAAI,IAAI,CAE3D;AAMD,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAE5C;;;GAGG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,CAMnD;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC,8EAA8E;AAC9E,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC;;;GAGG;AACH,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAKvC;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CA2B1C;AAID;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,SAAS,CAezD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,8BAA8B,IAAI,OAAO,CAIxD;AAED;;;;;;;;GAQG;AACH,wBAAgB,yCAAyC,IAAI,OAAO,CAInE;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAIxC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,IAAI,OAAO,CAIlD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAElD;;;;GAIG;AACH,eAAO,MAAM,kCAAkC,MAAM,CAAC;AAEtD;;;;;GAKG;AACH,wBAAgB,8BAA8B,IAAI,MAAM,CAMvD;AAKD,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAE/C;;;GAGG;AACH,wBAAgB,6BAA6B,IAAI,MAAM,CAMtD"}
|