@workflow/core 5.0.0-beta.41 → 5.0.0-beta.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/create-hook.d.ts +9 -5
- package/dist/create-hook.d.ts.map +1 -1
- package/dist/create-hook.js +1 -1
- package/dist/events-consumer.d.ts +97 -0
- package/dist/events-consumer.d.ts.map +1 -1
- package/dist/events-consumer.js +147 -14
- package/dist/private.d.ts +31 -12
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +149 -26
- package/dist/runtime/constants.d.ts +62 -0
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +70 -1
- package/dist/runtime/helpers.d.ts +127 -93
- package/dist/runtime/helpers.d.ts.map +1 -1
- package/dist/runtime/helpers.js +149 -132
- package/dist/runtime/quickjs-entrypoint.d.ts +10 -9
- package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
- package/dist/runtime/quickjs-entrypoint.js +162 -38
- package/dist/runtime/replay-budget.d.ts +8 -0
- package/dist/runtime/replay-budget.d.ts.map +1 -1
- package/dist/runtime/replay-budget.js +3 -3
- package/dist/runtime/resume-hook.d.ts.map +1 -1
- package/dist/runtime/resume-hook.js +53 -13
- package/dist/runtime/resume-latency.d.ts +143 -0
- package/dist/runtime/resume-latency.d.ts.map +1 -0
- package/dist/runtime/resume-latency.js +153 -0
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +54 -29
- package/dist/runtime/step-executor.d.ts +76 -13
- package/dist/runtime/step-executor.d.ts.map +1 -1
- package/dist/runtime/step-executor.js +171 -19
- package/dist/runtime/step-latency.d.ts +6 -0
- package/dist/runtime/step-latency.d.ts.map +1 -1
- package/dist/runtime/step-latency.js +3 -1
- package/dist/runtime/suspension-handler.d.ts +119 -8
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +643 -46
- package/dist/runtime/world-compatibility.d.ts +6 -5
- package/dist/runtime/world-compatibility.d.ts.map +1 -1
- package/dist/runtime/world-compatibility.js +7 -6
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +583 -142
- package/dist/serialization/codec-devalue.d.ts.map +1 -1
- package/dist/serialization/codec-devalue.js +15 -4
- package/dist/serialization.d.ts +10 -2
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +55 -8
- package/dist/telemetry/semantic-conventions.d.ts +81 -0
- package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
- package/dist/telemetry/semantic-conventions.js +67 -1
- package/dist/telemetry.d.ts +6 -0
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +22 -1
- package/dist/test-support/orchestrator-context.d.ts +25 -0
- package/dist/test-support/orchestrator-context.d.ts.map +1 -0
- package/dist/test-support/orchestrator-context.js +91 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/dist/workflow/create-hook.js +2 -2
- package/dist/workflow/hook.js +3 -3
- package/dist/workflow.js +43 -2
- package/docs/foundations/hooks.mdx +2 -2
- package/docs/foundations/streaming.mdx +24 -0
- package/docs/how-it-works/event-sourcing.mdx +39 -1
- package/package.json +5 -5
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import type { HookResumeTiming } from '@workflow/world';
|
|
2
|
+
/**
|
|
3
|
+
* Hook-triggered time-to-resume (TTR): wall-clock from entry into
|
|
4
|
+
* `resumeHook()` (T0) to the first line of the next durable step (T7), plus a
|
|
5
|
+
* decomposition into non-overlapping phases that sum exactly to it.
|
|
6
|
+
*
|
|
7
|
+
* ```text
|
|
8
|
+
* T0 resumeHook() entered
|
|
9
|
+
* producer_prep — hook lookup, serialization, encryption
|
|
10
|
+
* T1 queue publish requested
|
|
11
|
+
* queue_delivery — network + VQS delivery (incl. any affinity re-route)
|
|
12
|
+
* T2 final consumer's queue handler entered
|
|
13
|
+
* resume_setup — affinity check, hook_received re-ensure, replay preload
|
|
14
|
+
* T3 replay begins
|
|
15
|
+
* replay — VM/session creation and workflow replay
|
|
16
|
+
* T4 next durable step encountered
|
|
17
|
+
* step_dispatch — suspension handling, inline batch or queue dispatch
|
|
18
|
+
* T5 step_started request begins
|
|
19
|
+
* step_claim — the claim round trip
|
|
20
|
+
* T6 step_started response returned
|
|
21
|
+
* step_prepare — key resolution, argument hydration, context setup
|
|
22
|
+
* T7 immediately before stepFn.apply()
|
|
23
|
+
* ```
|
|
24
|
+
*
|
|
25
|
+
* The producer's direct `hook_received` POST races the queue publish on the
|
|
26
|
+
* parallel fast path, so it deliberately has no phase of its own — the two
|
|
27
|
+
* overlap, and representing both as additive phases would double-count. It
|
|
28
|
+
* remains visible as a contextual span (`hook.resume`).
|
|
29
|
+
*
|
|
30
|
+
* T0/T1 are stamped on the producer's machine and T2..T7 on the consumer's, so
|
|
31
|
+
* the measurement is subject to cross-machine clock skew. Rather than clamp
|
|
32
|
+
* (which would break the sum-equals-total property this decomposition exists
|
|
33
|
+
* for), a non-monotonic boundary set drops the whole sample — see
|
|
34
|
+
* {@link computeResumeTtrAttributes}.
|
|
35
|
+
*/
|
|
36
|
+
/** What caused the resumption being measured. Only hooks are measured today. */
|
|
37
|
+
export type ResumeTrigger = 'hook';
|
|
38
|
+
/** Which `resumeHook()` dispatch path produced this resume. */
|
|
39
|
+
export type ResumeStrategy = 'parallel' | 'sequential';
|
|
40
|
+
/**
|
|
41
|
+
* How the consuming invocation initialized its replay state:
|
|
42
|
+
*
|
|
43
|
+
* - `hook_preload` — the hoisted `hook_received` write returned a usable
|
|
44
|
+
* replay preload, so neither `run_started` nor the initial `events.list` ran.
|
|
45
|
+
* - `run_started` — the generic `run_started` setup ran (including the fast
|
|
46
|
+
* path's fallback, where the hoisted write succeeded but returned no usable
|
|
47
|
+
* preload).
|
|
48
|
+
* - `event_load` — neither setup ran because the run arrived already loaded,
|
|
49
|
+
* so setup was a plain event load. No current path produces it (the one
|
|
50
|
+
* preloaded-run path, the background-step fall-through, consumes the
|
|
51
|
+
* tracking on its own step first); it is the honest default rather than a
|
|
52
|
+
* live value, and keeps the dimension total if such a path is added.
|
|
53
|
+
*/
|
|
54
|
+
export type ResumeSetupSource = 'hook_preload' | 'run_started' | 'event_load';
|
|
55
|
+
/** Whether the measured step ran in the resuming invocation or a queued one. */
|
|
56
|
+
export type ResumeStepExecution = 'inline' | 'dispatched';
|
|
57
|
+
/**
|
|
58
|
+
* The resume boundaries observed so far, threaded from the queue handler into
|
|
59
|
+
* `executeStep`. Producer fields arrive on the queue message
|
|
60
|
+
* ({@link HookResumeTiming}); consumer fields are stamped by the invocation
|
|
61
|
+
* that replays the resume.
|
|
62
|
+
*
|
|
63
|
+
* The runtime holds at most one of these per invocation and CONSUMES it when
|
|
64
|
+
* it hands it to the execution that will attempt the next durable step, so a
|
|
65
|
+
* later step in the same invocation — or a retry of the same step — never
|
|
66
|
+
* re-reports the same resumption. Within one inline batch the object is
|
|
67
|
+
* shared by every step and the {@link ResumeTtrTracking.reported} latch picks
|
|
68
|
+
* the single reporter.
|
|
69
|
+
*/
|
|
70
|
+
export interface ResumeTtrTracking {
|
|
71
|
+
trigger: ResumeTrigger;
|
|
72
|
+
/** Absent only if an older producer omitted it from the queue message. */
|
|
73
|
+
strategy?: ResumeStrategy;
|
|
74
|
+
/** T0 — entry into `resumeHook()`. */
|
|
75
|
+
resumeRequestedAtMs: number;
|
|
76
|
+
/** T1 — immediately before the queue publish was requested. */
|
|
77
|
+
queuePublishRequestedAtMs: number;
|
|
78
|
+
/**
|
|
79
|
+
* T2 — entry into the FINAL consumer's queue handler. A delivery that
|
|
80
|
+
* re-routes for deployment affinity never stamps this, so the re-routed hop
|
|
81
|
+
* stays inside `queue_delivery` where it belongs.
|
|
82
|
+
*/
|
|
83
|
+
consumerStartedAtMs: number;
|
|
84
|
+
/** T3 — this invocation's first replay pass. */
|
|
85
|
+
replayStartedAtMs?: number;
|
|
86
|
+
/** T4 — replay first encountered a durable step after the resume. */
|
|
87
|
+
nextStepEncounteredAtMs?: number;
|
|
88
|
+
setupSource?: ResumeSetupSource;
|
|
89
|
+
stepExecution: ResumeStepExecution;
|
|
90
|
+
/**
|
|
91
|
+
* One-shot latch, set by the step executor once this resumption has been
|
|
92
|
+
* reported. Every step of an inline batch is handed the SAME tracking
|
|
93
|
+
* object, so the first one to reach user code takes the measurement and the
|
|
94
|
+
* rest see this and skip — one resumption, one sample, without pinning the
|
|
95
|
+
* sample to a step that may lose its create-claim and never run.
|
|
96
|
+
*
|
|
97
|
+
* Deliberately not part of {@link HookResumeTiming}: it is invocation-local
|
|
98
|
+
* state, and a queue message carries the boundaries, not the claim.
|
|
99
|
+
*/
|
|
100
|
+
reported?: boolean;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Rebuild tracking from a queue message's timing object. Returns undefined for
|
|
104
|
+
* a message that carries none (an older producer, or any non-hook delivery) —
|
|
105
|
+
* the caller then simply reports no TTR.
|
|
106
|
+
*/
|
|
107
|
+
export declare function resumeTrackingFromMessage(timing: HookResumeTiming | undefined, stepExecution: ResumeStepExecution): ResumeTtrTracking | undefined;
|
|
108
|
+
/**
|
|
109
|
+
* Serialize tracking back onto a queue message, for the case where the
|
|
110
|
+
* resuming invocation dispatches the next durable step to another invocation
|
|
111
|
+
* instead of running it inline. Returns undefined when the tracking is not
|
|
112
|
+
* complete enough to be worth forwarding.
|
|
113
|
+
*/
|
|
114
|
+
export declare function resumeTimingForMessage(tracking: ResumeTtrTracking | undefined): HookResumeTiming | undefined;
|
|
115
|
+
/**
|
|
116
|
+
* Compute the TTR span attributes for a step that is the first durable step
|
|
117
|
+
* following a hook resume. Returns undefined — emitting nothing at all — when
|
|
118
|
+
* any of these hold:
|
|
119
|
+
*
|
|
120
|
+
* - the invocation carries no resume tracking (not a hook resume, or an older
|
|
121
|
+
* queue message with no timing);
|
|
122
|
+
* - this is a retry (`attempt !== 1`), which measures a re-execution rather
|
|
123
|
+
* than the resumption;
|
|
124
|
+
* - a required boundary is missing, non-finite, or out of order.
|
|
125
|
+
*
|
|
126
|
+
* `step_claim_ms` is the one phase that may be individually omitted. Under
|
|
127
|
+
* optimistic inline start the `step_started` claim is deliberately NOT awaited
|
|
128
|
+
* before the body runs, so its completion instant does not exist yet at T7;
|
|
129
|
+
* rather than invent one, the claim phase is dropped and `step_prepare_ms`
|
|
130
|
+
* spans T5→T7. The sum-equals-total property holds either way.
|
|
131
|
+
*/
|
|
132
|
+
export declare function computeResumeTtrAttributes(params: {
|
|
133
|
+
tracking: ResumeTtrTracking | undefined;
|
|
134
|
+
/** The attempt number of the execution about to run. */
|
|
135
|
+
attempt: number;
|
|
136
|
+
/** T5 — `Date.now()` immediately before the `step_started` request. */
|
|
137
|
+
stepClaimStartedAtMs: number | undefined;
|
|
138
|
+
/** T6 — `Date.now()` once the `step_started` response returned. */
|
|
139
|
+
stepClaimCompletedAtMs: number | undefined;
|
|
140
|
+
/** T7 — `Date.now()` immediately before `stepFn.apply()`. */
|
|
141
|
+
stepCodeStartedAtMs: number;
|
|
142
|
+
}): Record<string, string | number> | undefined;
|
|
143
|
+
//# sourceMappingURL=resume-latency.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resume-latency.d.ts","sourceRoot":"","sources":["../../src/runtime/resume-latency.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGxD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,gFAAgF;AAChF,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC;AAEnC,+DAA+D;AAC/D,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,YAAY,CAAC;AAEvD;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,iBAAiB,GAAG,cAAc,GAAG,aAAa,GAAG,YAAY,CAAC;AAE9E,gFAAgF;AAChF,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,YAAY,CAAC;AAE1D;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,aAAa,CAAC;IACvB,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,sCAAsC;IACtC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,+DAA+D;IAC/D,yBAAyB,EAAE,MAAM,CAAC;IAClC;;;;OAIG;IACH,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gDAAgD;IAChD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,qEAAqE;IACrE,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,aAAa,EAAE,mBAAmB,CAAC;IACnC;;;;;;;;;OASG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,gBAAgB,GAAG,SAAS,EACpC,aAAa,EAAE,mBAAmB,GACjC,iBAAiB,GAAG,SAAS,CAgC/B;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,iBAAiB,GAAG,SAAS,GACtC,gBAAgB,GAAG,SAAS,CAkB9B;AA6CD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE;IACjD,QAAQ,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACxC,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,oBAAoB,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,mEAAmE;IACnE,sBAAsB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,6DAA6D;IAC7D,mBAAmB,EAAE,MAAM,CAAC;CAC7B,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,SAAS,CAoD9C"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import * as Attribute from '../telemetry/semantic-conventions.js';
|
|
2
|
+
/**
|
|
3
|
+
* Rebuild tracking from a queue message's timing object. Returns undefined for
|
|
4
|
+
* a message that carries none (an older producer, or any non-hook delivery) —
|
|
5
|
+
* the caller then simply reports no TTR.
|
|
6
|
+
*/
|
|
7
|
+
export function resumeTrackingFromMessage(timing, stepExecution) {
|
|
8
|
+
if (!timing)
|
|
9
|
+
return undefined;
|
|
10
|
+
if (!Number.isFinite(timing.resumeRequestedAtMs) ||
|
|
11
|
+
!Number.isFinite(timing.queuePublishRequestedAtMs)) {
|
|
12
|
+
return undefined;
|
|
13
|
+
}
|
|
14
|
+
return {
|
|
15
|
+
trigger: 'hook',
|
|
16
|
+
...(timing.strategy === 'parallel' || timing.strategy === 'sequential'
|
|
17
|
+
? { strategy: timing.strategy }
|
|
18
|
+
: {}),
|
|
19
|
+
resumeRequestedAtMs: timing.resumeRequestedAtMs,
|
|
20
|
+
queuePublishRequestedAtMs: timing.queuePublishRequestedAtMs,
|
|
21
|
+
// A dispatched step reads the resuming invocation's boundaries off the
|
|
22
|
+
// message; an inline one has them stamped locally by the caller, which
|
|
23
|
+
// overwrites this placeholder immediately after construction.
|
|
24
|
+
consumerStartedAtMs: timing.consumerStartedAtMs ?? Number.NaN,
|
|
25
|
+
...(timing.replayStartedAtMs !== undefined
|
|
26
|
+
? { replayStartedAtMs: timing.replayStartedAtMs }
|
|
27
|
+
: {}),
|
|
28
|
+
...(timing.nextStepEncounteredAtMs !== undefined
|
|
29
|
+
? { nextStepEncounteredAtMs: timing.nextStepEncounteredAtMs }
|
|
30
|
+
: {}),
|
|
31
|
+
...(timing.setupSource === 'hook_preload' ||
|
|
32
|
+
timing.setupSource === 'run_started' ||
|
|
33
|
+
timing.setupSource === 'event_load'
|
|
34
|
+
? { setupSource: timing.setupSource }
|
|
35
|
+
: {}),
|
|
36
|
+
stepExecution,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Serialize tracking back onto a queue message, for the case where the
|
|
41
|
+
* resuming invocation dispatches the next durable step to another invocation
|
|
42
|
+
* instead of running it inline. Returns undefined when the tracking is not
|
|
43
|
+
* complete enough to be worth forwarding.
|
|
44
|
+
*/
|
|
45
|
+
export function resumeTimingForMessage(tracking) {
|
|
46
|
+
if (!tracking)
|
|
47
|
+
return undefined;
|
|
48
|
+
if (!Number.isFinite(tracking.consumerStartedAtMs))
|
|
49
|
+
return undefined;
|
|
50
|
+
return {
|
|
51
|
+
resumeRequestedAtMs: tracking.resumeRequestedAtMs,
|
|
52
|
+
queuePublishRequestedAtMs: tracking.queuePublishRequestedAtMs,
|
|
53
|
+
...(tracking.strategy !== undefined ? { strategy: tracking.strategy } : {}),
|
|
54
|
+
consumerStartedAtMs: tracking.consumerStartedAtMs,
|
|
55
|
+
...(tracking.replayStartedAtMs !== undefined
|
|
56
|
+
? { replayStartedAtMs: tracking.replayStartedAtMs }
|
|
57
|
+
: {}),
|
|
58
|
+
...(tracking.nextStepEncounteredAtMs !== undefined
|
|
59
|
+
? { nextStepEncounteredAtMs: tracking.nextStepEncounteredAtMs }
|
|
60
|
+
: {}),
|
|
61
|
+
...(tracking.setupSource !== undefined
|
|
62
|
+
? { setupSource: tracking.setupSource }
|
|
63
|
+
: {}),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Validate that every required boundary is a finite epoch-ms value and that
|
|
68
|
+
* the whole sequence is non-decreasing. Returns undefined otherwise, which
|
|
69
|
+
* suppresses the metric entirely rather than reporting a phase that never
|
|
70
|
+
* happened or a negative duration.
|
|
71
|
+
*/
|
|
72
|
+
function validateBoundaries(b) {
|
|
73
|
+
const ordered = [
|
|
74
|
+
b.resumeRequestedAtMs,
|
|
75
|
+
b.queuePublishRequestedAtMs,
|
|
76
|
+
b.consumerStartedAtMs,
|
|
77
|
+
b.replayStartedAtMs,
|
|
78
|
+
b.nextStepEncounteredAtMs,
|
|
79
|
+
b.stepClaimStartedAtMs,
|
|
80
|
+
...(b.stepClaimCompletedAtMs !== undefined
|
|
81
|
+
? [b.stepClaimCompletedAtMs]
|
|
82
|
+
: []),
|
|
83
|
+
b.stepCodeStartedAtMs,
|
|
84
|
+
];
|
|
85
|
+
for (const value of ordered) {
|
|
86
|
+
if (typeof value !== 'number' || !Number.isFinite(value))
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
89
|
+
for (let i = 1; i < ordered.length; i++) {
|
|
90
|
+
if (ordered[i] < ordered[i - 1])
|
|
91
|
+
return undefined;
|
|
92
|
+
}
|
|
93
|
+
return ordered;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Compute the TTR span attributes for a step that is the first durable step
|
|
97
|
+
* following a hook resume. Returns undefined — emitting nothing at all — when
|
|
98
|
+
* any of these hold:
|
|
99
|
+
*
|
|
100
|
+
* - the invocation carries no resume tracking (not a hook resume, or an older
|
|
101
|
+
* queue message with no timing);
|
|
102
|
+
* - this is a retry (`attempt !== 1`), which measures a re-execution rather
|
|
103
|
+
* than the resumption;
|
|
104
|
+
* - a required boundary is missing, non-finite, or out of order.
|
|
105
|
+
*
|
|
106
|
+
* `step_claim_ms` is the one phase that may be individually omitted. Under
|
|
107
|
+
* optimistic inline start the `step_started` claim is deliberately NOT awaited
|
|
108
|
+
* before the body runs, so its completion instant does not exist yet at T7;
|
|
109
|
+
* rather than invent one, the claim phase is dropped and `step_prepare_ms`
|
|
110
|
+
* spans T5→T7. The sum-equals-total property holds either way.
|
|
111
|
+
*/
|
|
112
|
+
export function computeResumeTtrAttributes(params) {
|
|
113
|
+
const { tracking } = params;
|
|
114
|
+
if (!tracking || params.attempt !== 1)
|
|
115
|
+
return undefined;
|
|
116
|
+
if (tracking.replayStartedAtMs === undefined ||
|
|
117
|
+
tracking.nextStepEncounteredAtMs === undefined ||
|
|
118
|
+
params.stepClaimStartedAtMs === undefined) {
|
|
119
|
+
return undefined;
|
|
120
|
+
}
|
|
121
|
+
const boundaries = {
|
|
122
|
+
resumeRequestedAtMs: tracking.resumeRequestedAtMs,
|
|
123
|
+
queuePublishRequestedAtMs: tracking.queuePublishRequestedAtMs,
|
|
124
|
+
consumerStartedAtMs: tracking.consumerStartedAtMs,
|
|
125
|
+
replayStartedAtMs: tracking.replayStartedAtMs,
|
|
126
|
+
nextStepEncounteredAtMs: tracking.nextStepEncounteredAtMs,
|
|
127
|
+
stepClaimStartedAtMs: params.stepClaimStartedAtMs,
|
|
128
|
+
stepClaimCompletedAtMs: params.stepClaimCompletedAtMs,
|
|
129
|
+
stepCodeStartedAtMs: params.stepCodeStartedAtMs,
|
|
130
|
+
};
|
|
131
|
+
if (!validateBoundaries(boundaries))
|
|
132
|
+
return undefined;
|
|
133
|
+
const { resumeRequestedAtMs: t0, queuePublishRequestedAtMs: t1, consumerStartedAtMs: t2, replayStartedAtMs: t3, nextStepEncounteredAtMs: t4, stepClaimStartedAtMs: t5, stepClaimCompletedAtMs: t6, stepCodeStartedAtMs: t7, } = boundaries;
|
|
134
|
+
return {
|
|
135
|
+
...Attribute.ResumeTotalMs(t7 - t0),
|
|
136
|
+
...Attribute.ResumeProducerPrepMs(t1 - t0),
|
|
137
|
+
...Attribute.ResumeQueueDeliveryMs(t2 - t1),
|
|
138
|
+
...Attribute.ResumeSetupMs(t3 - t2),
|
|
139
|
+
...Attribute.ResumeReplayMs(t4 - t3),
|
|
140
|
+
...Attribute.ResumeStepDispatchMs(t5 - t4),
|
|
141
|
+
...(t6 !== undefined ? Attribute.ResumeStepClaimMs(t6 - t5) : {}),
|
|
142
|
+
...Attribute.ResumeStepPrepareMs(t7 - (t6 ?? t5)),
|
|
143
|
+
...Attribute.ResumeTrigger(tracking.trigger),
|
|
144
|
+
...(tracking.strategy !== undefined
|
|
145
|
+
? Attribute.ResumeStrategy(tracking.strategy)
|
|
146
|
+
: {}),
|
|
147
|
+
...(tracking.setupSource !== undefined
|
|
148
|
+
? Attribute.ResumeSetupSource(tracking.setupSource)
|
|
149
|
+
: {}),
|
|
150
|
+
...Attribute.ResumeStepExecution(tracking.stepExecution),
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdW1lLWxhdGVuY3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9yZXN1bWUtbGF0ZW5jeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssU0FBUyxNQUFNLHNDQUFzQyxDQUFDO0FBNEdsRTs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHlCQUF5QixDQUN2QyxNQUFvQyxFQUNwQyxhQUFrQztJQUVsQyxJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzlCLElBQ0UsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQztRQUM1QyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLHlCQUF5QixDQUFDLEVBQ2xELENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsT0FBTztRQUNMLE9BQU8sRUFBRSxNQUFNO1FBQ2YsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEtBQUssVUFBVSxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssWUFBWTtZQUNwRSxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRTtZQUMvQixDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ1AsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLG1CQUFtQjtRQUMvQyx5QkFBeUIsRUFBRSxNQUFNLENBQUMseUJBQXlCO1FBQzNELHVFQUF1RTtRQUN2RSx1RUFBdUU7UUFDdkUsOERBQThEO1FBQzlELG1CQUFtQixFQUFFLE1BQU0sQ0FBQyxtQkFBbUIsSUFBSSxNQUFNLENBQUMsR0FBRztRQUM3RCxHQUFHLENBQUMsTUFBTSxDQUFDLGlCQUFpQixLQUFLLFNBQVM7WUFDeEMsQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLGlCQUFpQixFQUFFO1lBQ2pELENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDUCxHQUFHLENBQUMs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cG9ydCB0eXBlIHsgSG9va1Jlc3VtZVRpbWluZyB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgKiBhcyBBdHRyaWJ1dGUgZnJvbSAnLi4vdGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zLmpzJztcblxuLyoqXG4gKiBIb29rLXRyaWdnZXJlZCB0aW1lLXRvLXJlc3VtZSAoVFRSKTogd2FsbC1jbG9jayBmcm9tIGVudHJ5IGludG9cbiAqIGByZXN1bWVIb29rKClgIChUMCkgdG8gdGhlIGZpcnN0IGxpbmUgb2YgdGhlIG5leHQgZHVyYWJsZSBzdGVwIChUNyksIHBsdXMgYVxuICogZGVjb21wb3NpdGlvbiBpbnRvIG5vbi1vdmVybGFwcGluZyBwaGFzZXMgdGhhdCBzdW0gZXhhY3RseSB0byBpdC5cbiAqXG4gKiBgYGB0ZXh0XG4gKiBUMCByZXN1bWVIb29rKCkgZW50ZXJlZFxuICogICAgICBwcm9kdWNlcl9wcmVwICAg4oCUIGhvb2sgbG9va3VwLCBzZXJpYWxpemF0aW9uLCBlbmNyeXB0aW9uXG4gKiBUMSBxdWV1ZSBwdWJsaXNoIHJlcXVlc3RlZFxuICogICAgICBxdWV1ZV9kZWxpdmVyeSAg4oCUIG5ldHdvcmsgKyBWUVMgZGVsaXZlcnkgKGluY2wuIGFueSBhZmZpbml0eSByZS1yb3V0ZSlcbiAqIFQyIGZpbmFsIGNvbnN1bWVyJ3MgcXVldWUgaGFuZGxlciBlbnRlcmVkXG4gKiAgICAgIHJlc3VtZV9zZXR1cCAgICDigJQgYWZmaW5pdHkgY2hlY2ssIGhvb2tfcmVjZWl2ZWQgcmUtZW5zdXJlLCByZXBsYXkgcHJlbG9hZFxuICogVDMgcmVwbGF5IGJlZ2luc1xuICogICAgICByZXBsYXkgICAgICAgICAg4oCUIFZNL3Nlc3Npb24gY3JlYXRpb24gYW5kIHdvcmtmbG93IHJlcGxheVxuICogVDQgbmV4dCBkdXJhYmxlIHN0ZXAgZW5jb3VudGVyZWRcbiAqICAgICAgc3RlcF9kaXNwYXRjaCAgIOKAlCBzdXNwZW5zaW9uIGhhbmRsaW5nLCBpbmxpbmUgYmF0Y2ggb3IgcXVldWUgZGlzcGF0Y2hcbiAqIFQ1IHN0ZXBfc3RhcnRlZCByZXF1ZXN0IGJlZ2luc1xuICogICAgICBzdGVwX2NsYWltICAgICAg4oCUIHRoZSBjbGFpbSByb3VuZCB0cmlwXG4gKiBUNiBzdGVwX3N0YXJ0ZWQgcmVzcG9uc2UgcmV0dXJuZWRcbiAqICAgICAgc3RlcF9wcmVwYXJlICAgIOKAlCBrZXkgcmVzb2x1dGlvbiwgYXJndW1lbnQgaHlkcmF0aW9uLCBjb250ZXh0IHNldHVwXG4gKiBUNyBpbW1lZGlhdGVseSBiZWZvcmUgc3RlcEZuLmFwcGx5KClcbiAqIGBgYFxuICpcbiAqIFRoZSBwcm9kdWNlcidzIGRpcmVjdCBgaG9va19yZWNlaXZlZGAgUE9TVCByYWNlcyB0aGUgcXVldWUgcHVibGlzaCBvbiB0aGVcbiAqIHBhcmFsbGVsIGZhc3QgcGF0aCwgc28gaXQgZGVsaWJlcmF0ZWx5IGhhcyBubyBwaGFzZSBvZiBpdHMgb3duIOKAlCB0aGUgdHdvXG4gKiBvdmVybGFwLCBhbmQgcmVwcmVzZW50aW5nIGJvdGggYXMgYWRkaXRpdmUgcGhhc2VzIHdvdWxkIGRvdWJsZS1jb3VudC4gSXRcbiAqIHJlbWFpbnMgdmlzaWJsZSBhcyBhIGNvbnRleHR1YWwgc3BhbiAoYGhvb2sucmVzdW1lYCkuXG4gKlxuICogVDAvVDEgYXJlIHN0YW1wZWQgb24gdGhlIHByb2R1Y2VyJ3MgbWFjaGluZSBhbmQgVDIuLlQ3IG9uIHRoZSBjb25zdW1lcidzLCBzb1xuICogdGhlIG1lYXN1cmVtZW50IGlzIHN1YmplY3QgdG8gY3Jvc3MtbWFjaGluZSBjbG9jayBza2V3LiBSYXRoZXIgdGhhbiBjbGFtcFxuICogKHdoaWNoIHdvdWxkIGJyZWFrIHRoZSBzdW0tZXF1YWxzLXRvdGFsIHByb3BlcnR5IHRoaXMgZGVjb21wb3NpdGlvbiBleGlzdHNcbiAqIGZvciksIGEgbm9uLW1vbm90b25pYyBib3VuZGFyeSBzZXQgZHJvcHMgdGhlIHdob2xlIHNhbXBsZSDigJQgc2VlXG4gKiB7QGxpbmsgY29tcHV0ZVJlc3VtZVR0ckF0dHJpYnV0ZXN9LlxuICovXG5cbi8qKiBXaGF0IGNhdXNlZCB0aGUgcmVzdW1wdGlvbiBiZWluZyBtZWFzdXJlZC4gT25seSBob29rcyBhcmUgbWVhc3VyZWQgdG9kYXkuICovXG5leHBvcnQgdHlwZSBSZXN1bWVUcmlnZ2VyID0gJ2hvb2snO1xuXG4vKiogV2hpY2ggYHJlc3VtZUhvb2soKWAgZGlzcGF0Y2ggcGF0aCBwcm9kdWNlZCB0aGlzIHJlc3VtZS4gKi9cbmV4cG9ydCB0eXBlIFJlc3VtZVN0cmF0ZWd5ID0gJ3BhcmFsbGVsJyB8ICdzZXF1ZW50aWFsJztcblxuLyoqXG4gKiBIb3cgdGhlIGNvbnN1bWluZyBpbnZvY2F0aW9uIGluaXRpYWxpemVkIGl0cyByZXBsYXkgc3RhdGU6XG4gKlxuICogLSBgaG9va19wcmVsb2FkYCDigJQgdGhlIGhvaXN0ZWQgYGhvb2tfcmVjZWl2ZWRgIHdyaXRlIHJldHVybmVkIGEgdXNhYmxlXG4gKiAgIHJlcGxheSBwcmVsb2FkLCBzbyBuZWl0aGVyIGBydW5fc3RhcnRlZGAgbm9yIHRoZSBpbml0aWFsIGBldmVudHMubGlzdGAgcmFuLlxuICogLSBgcnVuX3N0YXJ0ZWRgIOKAlCB0aGUgZ2VuZXJpYyBgcnVuX3N0YXJ0ZWRgIHNldHVwIHJhbiAoaW5jbHVkaW5nIHRoZSBmYXN0XG4gKiAgIHBhdGgncyBmYWxsYmFjaywgd2hlcmUgdGhlIGhvaXN0ZWQgd3JpdGUgc3VjY2VlZGVkIGJ1dCByZXR1cm5lZCBubyB1c2FibGVcbiAqICAgcHJlbG9hZCkuXG4gKiAtIGBldmVudF9sb2FkYCDigJQgbmVpdGhlciBzZXR1cCByYW4gYmVjYXVzZSB0aGUgcnVuIGFycml2ZWQgYWxyZWFkeSBsb2FkZWQsXG4gKiAgIHNvIHNldHVwIHdhcyBhIHBsYWluIGV2ZW50IGxvYWQuIE5vIGN1cnJlbnQgcGF0aCBwcm9kdWNlcyBpdCAodGhlIG9uZVxuICogICBwcmVsb2FkZWQtcnVuIHBhdGgsIHRoZSBiYWNrZ3JvdW5kLXN0ZXAgZmFsbC10aHJvdWdoLCBjb25zdW1lcyB0aGVcbiAqICAgdHJhY2tpbmcgb24gaXRzIG93biBzdGVwIGZpcnN0KTsgaXQgaXMgdGhlIGhvbmVzdCBkZWZhdWx0IHJhdGhlciB0aGFuIGFcbiAqICAgbGl2ZSB2YWx1ZSwgYW5kIGtlZXBzIHRoZSBkaW1lbnNpb24gdG90YWwgaWYgc3VjaCBhIHBhdGggaXMgYWRkZWQuXG4gKi9cbmV4cG9ydCB0eXBlIFJlc3VtZVNldHVwU291cmNlID0gJ2hvb2tfcHJlbG9hZCcgfCAncnVuX3N0YXJ0ZWQnIHwgJ2V2ZW50X2xvYWQnO1xuXG4vKiogV2hldGhlciB0aGUgbWVhc3VyZWQgc3RlcCByYW4gaW4gdGhlIHJlc3VtaW5nIGludm9jYXRpb24gb3IgYSBxdWV1ZWQgb25lLiAqL1xuZXhwb3J0IHR5cGUgUmVzdW1lU3RlcEV4ZWN1dGlvbiA9ICdpbmxpbmUnIHwgJ2Rpc3BhdGNoZWQnO1xuXG4vKipcbiAqIFRoZSByZXN1bWUgYm91bmRhcmllcyBvYnNlcnZlZCBzbyBmYXIsIHRocmVhZGVkIGZyb20gdGhlIHF1ZXVlIGhhbmRsZXIgaW50b1xuICogYGV4ZWN1dGVTdGVwYC4gUHJvZHVjZXIgZmllbGRzIGFycml2ZSBvbiB0aGUgcXVldWUgbWVzc2FnZVxuICogKHtAbGluayBIb29rUmVzdW1lVGltaW5nfSk7IGNvbnN1bWVyIGZpZWxkcyBhcmUgc3RhbXBlZCBieSB0aGUgaW52b2NhdGlvblxuICogdGhhdCByZXBsYXlzIHRoZSByZXN1bWUuXG4gKlxuICogVGhlIHJ1bnRpbWUgaG9sZHMgYXQgbW9zdCBvbmUgb2YgdGhlc2UgcGVyIGludm9jYXRpb24gYW5kIENPTlNVTUVTIGl0IHdoZW5cbiAqIGl0IGhhbmRzIGl0IHRvIHRoZSBleGVjdXRpb24gdGhhdCB3aWxsIGF0dGVtcHQgdGhlIG5leHQgZHVyYWJsZSBzdGVwLCBzbyBhXG4gKiBsYXRlciBzdGVwIGluIHRoZSBzYW1lIGludm9jYXRpb24g4oCUIG9yIGEgcmV0cnkgb2YgdGhlIHNhbWUgc3RlcCDigJQgbmV2ZXJcbiAqIHJlLXJlcG9ydHMgdGhlIHNhbWUgcmVzdW1wdGlvbi4gV2l0aGluIG9uZSBpbmxpbmUgYmF0Y2ggdGhlIG9iamVjdCBpc1xuICogc2hhcmVkIGJ5IGV2ZXJ5IHN0ZXAgYW5kIHRoZSB7QGxpbmsgUmVzdW1lVHRyVHJhY2tpbmcucmVwb3J0ZWR9IGxhdGNoIHBpY2tzXG4gKiB0aGUgc2luZ2xlIHJlcG9ydGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc3VtZVR0clRyYWNraW5nIHtcbiAgdHJpZ2dlcjogUmVzdW1lVHJpZ2dlcjtcbiAgLyoqIEFic2VudCBvbmx5IGlmIGFuIG9sZGVyIHByb2R1Y2VyIG9taXR0ZWQgaXQgZnJvbSB0aGUgcXVldWUgbWVzc2FnZS4gKi9cbiAgc3RyYXRlZ3k/OiBSZXN1bWVTdHJhdGVneTtcbiAgLyoqIFQwIOKAlCBlbnRyeSBpbnRvIGByZXN1bWVIb29rKClgLiAqL1xuICByZXN1bWVSZXF1ZXN0ZWRBdE1zOiBudW1iZXI7XG4gIC8qKiBUMSDigJQgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBxdWV1ZSBwdWJsaXNoIHdhcyByZXF1ZXN0ZWQuICovXG4gIHF1ZXVlUHVibGlzaFJlcXVlc3RlZEF0TXM6IG51bWJlcjtcbiAgLyoqXG4gICAqIFQyIOKAlCBlbnRyeSBpbnRvIHRoZSBGSU5BTCBjb25zdW1lcidzIHF1ZXVlIGhhbmRsZXIuIEEgZGVsaXZlcnkgdGhhdFxuICAgKiByZS1yb3V0ZXMgZm9yIGRlcGxveW1lbnQgYWZmaW5pdHkgbmV2ZXIgc3RhbXBzIHRoaXMsIHNvIHRoZSByZS1yb3V0ZWQgaG9wXG4gICAqIHN0YXlzIGluc2lkZSBgcXVldWVfZGVsaXZlcnlgIHdoZXJlIGl0IGJlbG9uZ3MuXG4gICAqL1xuICBjb25zdW1lclN0YXJ0ZWRBdE1zOiBudW1iZXI7XG4gIC8qKiBUMyDigJQgdGhpcyBpbnZvY2F0aW9uJ3MgZmlyc3QgcmVwbGF5IHBhc3MuICovXG4gIHJlcGxheVN0YXJ0ZWRBdE1zPzogbnVtYmVyO1xuICAvKiogVDQg4oCUIHJlcGxheSBmaXJzdCBlbmNvdW50ZXJlZCBhIGR1cmFibGUgc3RlcCBhZnRlciB0aGUgcmVzdW1lLiAqL1xuICBuZXh0U3RlcEVuY291bnRlcmVkQXRNcz86IG51bWJlcjtcbiAgc2V0dXBTb3VyY2U/OiBSZXN1bWVTZXR1cFNvdXJjZTtcbiAgc3RlcEV4ZWN1dGlvbjogUmVzdW1lU3RlcEV4ZWN1dGlvbjtcbiAgLyoqXG4gICAqIE9uZS1zaG90IGxhdGNoLCBzZXQgYnkgdGhlIHN0ZXAgZXhlY3V0b3Igb25jZSB0aGlzIHJlc3VtcHRpb24gaGFzIGJlZW5cbiAgICogcmVwb3J0ZWQuIEV2ZXJ5IHN0ZXAgb2YgYW4gaW5saW5lIGJhdGNoIGlzIGhhbmRlZCB0aGUgU0FNRSB0cmFja2luZ1xuICAgKiBvYmplY3QsIHNvIHRoZSBmaXJzdCBvbmUgdG8gcmVhY2ggdXNlciBjb2RlIHRha2VzIHRoZSBtZWFzdXJlbWVudCBhbmQgdGhlXG4gICAqIHJlc3Qgc2VlIHRoaXMgYW5kIHNraXAg4oCUIG9uZSByZXN1bXB0aW9uLCBvbmUgc2FtcGxlLCB3aXRob3V0IHBpbm5pbmcgdGhlXG4gICAqIHNhbXBsZSB0byBhIHN0ZXAgdGhhdCBtYXkgbG9zZSBpdHMgY3JlYXRlLWNsYWltIGFuZCBuZXZlciBydW4uXG4gICAqXG4gICAqIERlbGliZXJhdGVseSBub3QgcGFydCBvZiB7QGxpbmsgSG9va1Jlc3VtZVRpbWluZ306IGl0IGlzIGludm9jYXRpb24tbG9jYWxcbiAgICogc3RhdGUsIGFuZCBhIHF1ZXVlIG1lc3NhZ2UgY2FycmllcyB0aGUgYm91bmRhcmllcywgbm90IHRoZSBjbGFpbS5cbiAgICovXG4gIHJlcG9ydGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBSZWJ1aWxkIHRyYWNraW5nIGZyb20gYSBxdWV1ZSBtZXNzYWdlJ3MgdGltaW5nIG9iamVjdC4gUmV0dXJucyB1bmRlZmluZWQgZm9yXG4gKiBhIG1lc3NhZ2UgdGhhdCBjYXJyaWVzIG5vbmUgKGFuIG9sZGVyIHByb2R1Y2VyLCBvciBhbnkgbm9uLWhvb2sgZGVsaXZlcnkpIOKAlFxuICogdGhlIGNhbGxlciB0aGVuIHNpbXBseSByZXBvcnRzIG5vIFRUUi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc3VtZVRyYWNraW5nRnJvbU1lc3NhZ2UoXG4gIHRpbWluZzogSG9va1Jlc3VtZVRpbWluZyB8IHVuZGVmaW5lZCxcbiAgc3RlcEV4ZWN1dGlvbjogUmVzdW1lU3RlcEV4ZWN1dGlvblxuKTogUmVzdW1lVHRyVHJhY2tpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIXRpbWluZykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKFxuICAgICFOdW1iZXIuaXNGaW5pdGUodGltaW5nLnJlc3VtZVJlcXVlc3RlZEF0TXMpIHx8XG4gICAgIU51bWJlci5pc0Zpbml0ZSh0aW1pbmcucXVldWVQdWJsaXNoUmVxdWVzdGVkQXRNcylcbiAgKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4ge1xuICAgIHRyaWdnZXI6ICdob29rJyxcbiAgICAuLi4odGltaW5nLnN0cmF0ZWd5ID09PSAncGFyYWxsZWwnIHx8IHRpbWluZy5zdHJhdGVneSA9PT0gJ3NlcXVlbnRpYWwnXG4gICAgICA/IHsgc3RyYXRlZ3k6IHRpbWluZy5zdHJhdGVneSB9XG4gICAgICA6IHt9KSxcbiAgICByZXN1bWVSZXF1ZXN0ZWRBdE1zOiB0aW1pbmcucmVzdW1lUmVxdWVzdGVkQXRNcyxcbiAgICBxdWV1ZVB1Ymxpc2hSZXF1ZXN0ZWRBdE1zOiB0aW1pbmcucXVldWVQdWJsaXNoUmVxdWVzdGVkQXRNcyxcbiAgICAvLyBBIGRpc3BhdGNoZWQgc3RlcCByZWFkcyB0aGUgcmVzdW1pbmcgaW52b2NhdGlvbidzIGJvdW5kYXJpZXMgb2ZmIHRoZVxuICAgIC8vIG1lc3NhZ2U7IGFuIGlubGluZSBvbmUgaGFzIHRoZW0gc3RhbXBlZCBsb2NhbGx5IGJ5IHRoZSBjYWxsZXIsIHdoaWNoXG4gICAgLy8gb3ZlcndyaXRlcyB0aGlzIHBsYWNlaG9sZGVyIGltbWVkaWF0ZWx5IGFmdGVyIGNvbnN0cnVjdGlvbi5cbiAgICBjb25zdW1lclN0YXJ0ZWRBdE1zOiB0aW1pbmcuY29uc3VtZXJTdGFydGVkQXRNcyA/PyBOdW1iZXIuTmFOLFxuICAgIC4uLih0aW1pbmcucmVwbGF5U3RhcnRlZEF0TXMgIT09IHVuZGVmaW5lZFxuICAgICAgPyB7IHJlcGxheVN0YXJ0ZWRBdE1zOiB0aW1pbmcucmVwbGF5U3RhcnRlZEF0TXMgfVxuICAgICAgOiB7fSksXG4gICAgLi4uKHRpbWluZy5uZXh0U3RlcEVuY291bnRlcmVkQXRNcyAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHsgbmV4dFN0ZXBFbmNvdW50ZXJlZEF0TXM6IHRpbWluZy5uZXh0U3RlcEVuY291bnRlcmVkQXRNcyB9XG4gICAgICA6IHt9KSxcbiAgICAuLi4odGltaW5nLnNldHVwU291cmNlID09PSAnaG9va19wcmVsb2FkJyB8fFxuICAgIHRpbWluZy5zZXR1cFNvdXJjZSA9PT0gJ3J1bl9zdGFydGVkJyB8fFxuICAgIHRpbWluZy5zZXR1cFNvdXJjZSA9PT0gJ2V2ZW50X2xvYWQnXG4gICAgICA/IHsgc2V0dXBTb3VyY2U6IHRpbWluZy5zZXR1cFNvdXJjZSB9XG4gICAgICA6IHt9KSxcbiAgICBzdGVwRXhlY3V0aW9uLFxuICB9O1xufVxuXG4vKipcbiAqIFNlcmlhbGl6ZSB0cmFja2luZyBiYWNrIG9udG8gYSBxdWV1ZSBtZXNzYWdlLCBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlXG4gKiByZXN1bWluZyBpbnZvY2F0aW9uIGRpc3BhdGNoZXMgdGhlIG5leHQgZHVyYWJsZSBzdGVwIHRvIGFub3RoZXIgaW52b2NhdGlvblxuICogaW5zdGVhZCBvZiBydW5uaW5nIGl0IGlubGluZS4gUmV0dXJucyB1bmRlZmluZWQgd2hlbiB0aGUgdHJhY2tpbmcgaXMgbm90XG4gKiBjb21wbGV0ZSBlbm91Z2ggdG8gYmUgd29ydGggZm9yd2FyZGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc3VtZVRpbWluZ0Zvck1lc3NhZ2UoXG4gIHRyYWNraW5nOiBSZXN1bWVUdHJUcmFja2luZyB8IHVuZGVmaW5lZFxuKTogSG9va1Jlc3VtZVRpbWluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghdHJhY2tpbmcpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHRyYWNraW5nLmNvbnN1bWVyU3RhcnRlZEF0TXMpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4ge1xuICAgIHJlc3VtZVJlcXVlc3RlZEF0TXM6IHRyYWNraW5nLnJlc3VtZVJlcXVlc3RlZEF0TXMsXG4gICAgcXVldWVQdWJsaXNoUmVxdWVzdGVkQXRNczogdHJhY2tpbmcucXVldWVQdWJsaXNoUmVxdWVzdGVkQXRNcyxcbiAgICAuLi4odHJhY2tpbmcuc3RyYXRlZ3kgIT09IHVuZGVmaW5lZCA/IHsgc3RyYXRlZ3k6IHRyYWNraW5nLnN0cmF0ZWd5IH0gOiB7fSksXG4gICAgY29uc3VtZXJTdGFydGVkQXRNczogdHJhY2tpbmcuY29uc3VtZXJTdGFydGVkQXRNcyxcbiAgICAuLi4odHJhY2tpbmcucmVwbGF5U3RhcnRlZEF0TXMgIT09IHVuZGVmaW5lZFxuICAgICAgPyB7IHJlcGxheVN0YXJ0ZWRBdE1zOiB0cmFja2luZy5yZXBsYXlTdGFydGVkQXRNcyB9XG4gICAgICA6IHt9KSxcbiAgICAuLi4odHJhY2tpbmcubmV4dFN0ZXBFbmNvdW50ZXJlZEF0TXMgIT09IHVuZGVmaW5lZFxuICAgICAgPyB7IG5leHRTdGVwRW5jb3VudGVyZWRBdE1zOiB0cmFja2luZy5uZXh0U3RlcEVuY291bnRlcmVkQXRNcyB9XG4gICAgICA6IHt9KSxcbiAgICAuLi4odHJhY2tpbmcuc2V0dXBTb3VyY2UgIT09IHVuZGVmaW5lZFxuICAgICAgPyB7IHNldHVwU291cmNlOiB0cmFja2luZy5zZXR1cFNvdXJjZSB9XG4gICAgICA6IHt9KSxcbiAgfTtcbn1cblxuLyoqIEV2ZXJ5IGJvdW5kYXJ5IHRoZSBlbWlzc2lvbiBnYXRlIHJlcXVpcmVzLCBwbHVzIHRoZSBvcHRpb25hbCBjbGFpbSBlbmQuICovXG5pbnRlcmZhY2UgUmVzdW1lQm91bmRhcmllcyB7XG4gIC8qKiBUMCAqLyByZXN1bWVSZXF1ZXN0ZWRBdE1zOiBudW1iZXI7XG4gIC8qKiBUMSAqLyBxdWV1ZVB1Ymxpc2hSZXF1ZXN0ZWRBdE1zOiBudW1iZXI7XG4gIC8qKiBUMiAqLyBjb25zdW1lclN0YXJ0ZWRBdE1zOiBudW1iZXI7XG4gIC8qKiBUMyAqLyByZXBsYXlTdGFydGVkQXRNczogbnVtYmVyO1xuICAvKiogVDQgKi8gbmV4dFN0ZXBFbmNvdW50ZXJlZEF0TXM6IG51bWJlcjtcbiAgLyoqIFQ1ICovIHN0ZXBDbGFpbVN0YXJ0ZWRBdE1zOiBudW1iZXI7XG4gIC8qKiBUNiDigJQgYWJzZW50IG9uIHRoZSBvcHRpbWlzdGljLXN0YXJ0IHBhdGg7IHNlZSBiZWxvdy4gKi9cbiAgc3RlcENsYWltQ29tcGxldGVkQXRNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAvKiogVDcgKi8gc3RlcENvZGVTdGFydGVkQXRNczogbnVtYmVyO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIHRoYXQgZXZlcnkgcmVxdWlyZWQgYm91bmRhcnkgaXMgYSBmaW5pdGUgZXBvY2gtbXMgdmFsdWUgYW5kIHRoYXRcbiAqIHRoZSB3aG9sZSBzZXF1ZW5jZSBpcyBub24tZGVjcmVhc2luZy4gUmV0dXJucyB1bmRlZmluZWQgb3RoZXJ3aXNlLCB3aGljaFxuICogc3VwcHJlc3NlcyB0aGUgbWV0cmljIGVudGlyZWx5IHJhdGhlciB0aGFuIHJlcG9ydGluZyBhIHBoYXNlIHRoYXQgbmV2ZXJcbiAqIGhhcHBlbmVkIG9yIGEgbmVnYXRpdmUgZHVyYXRpb24uXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlQm91bmRhcmllcyhcbiAgYjogUmVzdW1lQm91bmRhcmllc1xuKTogcmVhZG9ubHkgbnVtYmVyW10gfCB1bmRlZmluZWQge1xuICBjb25zdCBvcmRlcmVkID0gW1xuICAgIGIucmVzdW1lUmVxdWVzdGVkQXRNcyxcbiAgICBiLnF1ZXVlUHVibGlzaFJlcXVlc3RlZEF0TXMsXG4gICAgYi5jb25zdW1lclN0YXJ0ZWRBdE1zLFxuICAgIGIucmVwbGF5U3RhcnRlZEF0TXMsXG4gICAgYi5uZXh0U3RlcEVuY291bnRlcmVkQXRNcyxcbiAgICBiLnN0ZXBDbGFpbVN0YXJ0ZWRBdE1zLFxuICAgIC4uLihiLnN0ZXBDbGFpbUNvbXBsZXRlZEF0TXMgIT09IHVuZGVmaW5lZFxuICAgICAgPyBbYi5zdGVwQ2xhaW1Db21wbGV0ZWRBdE1zXVxuICAgICAgOiBbXSksXG4gICAgYi5zdGVwQ29kZVN0YXJ0ZWRBdE1zLFxuICBdO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIG9yZGVyZWQpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJyB8fCAhTnVtYmVyLmlzRmluaXRlKHZhbHVlKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBmb3IgKGxldCBpID0gMTsgaSA8IG9yZGVyZWQubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAob3JkZXJlZFtpXSA8IG9yZGVyZWRbaSAtIDFdKSByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBvcmRlcmVkO1xufVxuXG4vKipcbiAqIENvbXB1dGUgdGhlIFRUUiBzcGFuIGF0dHJpYnV0ZXMgZm9yIGEgc3RlcCB0aGF0IGlzIHRoZSBmaXJzdCBkdXJhYmxlIHN0ZXBcbiAqIGZvbGxvd2luZyBhIGhvb2sgcmVzdW1lLiBSZXR1cm5zIHVuZGVmaW5lZCDigJQgZW1pdHRpbmcgbm90aGluZyBhdCBhbGwg4oCUIHdoZW5cbiAqIGFueSBvZiB0aGVzZSBob2xkOlxuICpcbiAqIC0gdGhlIGludm9jYXRpb24gY2FycmllcyBubyByZXN1bWUgdHJhY2tpbmcgKG5vdCBhIGhvb2sgcmVzdW1lLCBvciBhbiBvbGRlclxuICogICBxdWV1ZSBtZXNzYWdlIHdpdGggbm8gdGltaW5nKTtcbiAqIC0gdGhpcyBpcyBhIHJldHJ5IChgYXR0ZW1wdCAhPT0gMWApLCB3aGljaCBtZWFzdXJlcyBhIHJlLWV4ZWN1dGlvbiByYXRoZXJcbiAqICAgdGhhbiB0aGUgcmVzdW1wdGlvbjtcbiAqIC0gYSByZXF1aXJlZCBib3VuZGFyeSBpcyBtaXNzaW5nLCBub24tZmluaXRlLCBvciBvdXQgb2Ygb3JkZXIuXG4gKlxuICogYHN0ZXBfY2xhaW1fbXNgIGlzIHRoZSBvbmUgcGhhc2UgdGhhdCBtYXkgYmUgaW5kaXZpZHVhbGx5IG9taXR0ZWQuIFVuZGVyXG4gKiBvcHRpbWlzdGljIGlubGluZSBzdGFydCB0aGUgYHN0ZXBfc3RhcnRlZGAgY2xhaW0gaXMgZGVsaWJlcmF0ZWx5IE5PVCBhd2FpdGVkXG4gKiBiZWZvcmUgdGhlIGJvZHkgcnVucywgc28gaXRzIGNvbXBsZXRpb24gaW5zdGFudCBkb2VzIG5vdCBleGlzdCB5ZXQgYXQgVDc7XG4gKiByYXRoZXIgdGhhbiBpbnZlbnQgb25lLCB0aGUgY2xhaW0gcGhhc2UgaXMgZHJvcHBlZCBhbmQgYHN0ZXBfcHJlcGFyZV9tc2BcbiAqIHNwYW5zIFQ14oaSVDcuIFRoZSBzdW0tZXF1YWxzLXRvdGFsIHByb3BlcnR5IGhvbGRzIGVpdGhlciB3YXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlUmVzdW1lVHRyQXR0cmlidXRlcyhwYXJhbXM6IHtcbiAgdHJhY2tpbmc6IFJlc3VtZVR0clRyYWNraW5nIHwgdW5kZWZpbmVkO1xuICAvKiogVGhlIGF0dGVtcHQgbnVtYmVyIG9mIHRoZSBleGVjdXRpb24gYWJvdXQgdG8gcnVuLiAqL1xuICBhdHRlbXB0OiBudW1iZXI7XG4gIC8qKiBUNSDigJQgYERhdGUubm93KClgIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgYHN0ZXBfc3RhcnRlZGAgcmVxdWVzdC4gKi9cbiAgc3RlcENsYWltU3RhcnRlZEF0TXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgLyoqIFQ2IOKAlCBgRGF0ZS5ub3coKWAgb25jZSB0aGUgYHN0ZXBfc3RhcnRlZGAgcmVzcG9uc2UgcmV0dXJuZWQuICovXG4gIHN0ZXBDbGFpbUNvbXBsZXRlZEF0TXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgLyoqIFQ3IOKAlCBgRGF0ZS5ub3coKWAgaW1tZWRpYXRlbHkgYmVmb3JlIGBzdGVwRm4uYXBwbHkoKWAuICovXG4gIHN0ZXBDb2RlU3RhcnRlZEF0TXM6IG51bWJlcjtcbn0pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgeyB0cmFja2luZyB9ID0gcGFyYW1zO1xuICBpZiAoIXRyYWNraW5nIHx8IHBhcmFtcy5hdHRlbXB0ICE9PSAxKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAoXG4gICAgdHJhY2tpbmcucmVwbGF5U3RhcnRlZEF0TXMgPT09IHVuZGVmaW5lZCB8fFxuICAgIHRyYWNraW5nLm5leHRTdGVwRW5jb3VudGVyZWRBdE1zID09PSB1bmRlZmluZWQgfHxcbiAgICBwYXJhbXMuc3RlcENsYWltU3RhcnRlZEF0TXMgPT09IHVuZGVmaW5lZFxuICApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgYm91bmRhcmllczogUmVzdW1lQm91bmRhcmllcyA9IHtcbiAgICByZXN1bWVSZXF1ZXN0ZWRBdE1zOiB0cmFja2luZy5yZXN1bWVSZXF1ZXN0ZWRBdE1zLFxuICAgIHF1ZXVlUHVibGlzaFJlcXVlc3RlZEF0TXM6IHRyYWNraW5nLnF1ZXVlUHVibGlzaFJlcXVlc3RlZEF0TXMsXG4gICAgY29uc3VtZXJTdGFydGVkQXRNczogdHJhY2tpbmcuY29uc3VtZXJTdGFydGVkQXRNcyxcbiAgICByZXBsYXlTdGFydGVkQXRNczogdHJhY2tpbmcucmVwbGF5U3RhcnRlZEF0TXMsXG4gICAgbmV4dFN0ZXBFbmNvdW50ZXJlZEF0TXM6IHRyYWNraW5nLm5leHRTdGVwRW5jb3VudGVyZWRBdE1zLFxuICAgIHN0ZXBDbGFpbVN0YXJ0ZWRBdE1zOiBwYXJhbXMuc3RlcENsYWltU3RhcnRlZEF0TXMsXG4gICAgc3RlcENsYWltQ29tcGxldGVkQXRNczogcGFyYW1zLnN0ZXBDbGFpbUNvbXBsZXRlZEF0TXMsXG4gICAgc3RlcENvZGVTdGFydGVkQXRNczogcGFyYW1zLnN0ZXBDb2RlU3RhcnRlZEF0TXMsXG4gIH07XG4gIGlmICghdmFsaWRhdGVCb3VuZGFyaWVzKGJvdW5kYXJpZXMpKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHtcbiAgICByZXN1bWVSZXF1ZXN0ZWRBdE1zOiB0MCxcbiAgICBxdWV1ZVB1Ymxpc2hSZXF1ZXN0ZWRBdE1zOiB0MSxcbiAgICBjb25zdW1lclN0YXJ0ZWRBdE1zOiB0MixcbiAgICByZXBsYXlTdGFydGVkQXRNczogdDMsXG4gICAgbmV4dFN0ZXBFbmNvdW50ZXJlZEF0TXM6IHQ0LFxuICAgIHN0ZXBDbGFpbVN0YXJ0ZWRBdE1zOiB0NSxcbiAgICBzdGVwQ2xhaW1Db21wbGV0ZWRBdE1zOiB0NixcbiAgICBzdGVwQ29kZVN0YXJ0ZWRBdE1zOiB0NyxcbiAgfSA9IGJvdW5kYXJpZXM7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5BdHRyaWJ1dGUuUmVzdW1lVG90YWxNcyh0NyAtIHQwKSxcbiAgICAuLi5BdHRyaWJ1dGUuUmVzdW1lUHJvZHVjZXJQcmVwTXModDEgLSB0MCksXG4gICAgLi4uQXR0cmlidXRlLlJlc3VtZVF1ZXVlRGVsaXZlcnlNcyh0MiAtIHQxKSxcbiAgICAuLi5BdHRyaWJ1dGUuUmVzdW1lU2V0dXBNcyh0MyAtIHQyKSxcbiAgICAuLi5BdHRyaWJ1dGUuUmVzdW1lUmVwbGF5TXModDQgLSB0MyksXG4gICAgLi4uQXR0cmlidXRlLlJlc3VtZVN0ZXBEaXNwYXRjaE1zKHQ1IC0gdDQpLFxuICAgIC4uLih0NiAhPT0gdW5kZWZpbmVkID8gQXR0cmlidXRlLlJlc3VtZVN0ZXBDbGFpbU1zKHQ2IC0gdDUpIDoge30pLFxuICAgIC4uLkF0dHJpYnV0ZS5SZXN1bWVTdGVwUHJlcGFyZU1zKHQ3IC0gKHQ2ID8/IHQ1KSksXG4gICAgLi4uQXR0cmlidXRlLlJlc3VtZVRyaWdnZXIodHJhY2tpbmcudHJpZ2dlciksXG4gICAgLi4uKHRyYWNraW5nLnN0cmF0ZWd5ICE9PSB1bmRlZmluZWRcbiAgICAgID8gQXR0cmlidXRlLlJlc3VtZVN0cmF0ZWd5KHRyYWNraW5nLnN0cmF0ZWd5KVxuICAgICAgOiB7fSksXG4gICAgLi4uKHRyYWNraW5nLnNldHVwU291cmNlICE9PSB1bmRlZmluZWRcbiAgICAgID8gQXR0cmlidXRlLlJlc3VtZVNldHVwU291cmNlKHRyYWNraW5nLnNldHVwU291cmNlKVxuICAgICAgOiB7fSksXG4gICAgLi4uQXR0cmlidXRlLlJlc3VtZVN0ZXBFeGVjdXRpb24odHJhY2tpbmcuc3RlcEV4ZWN1dGlvbiksXG4gIH07XG59XG4iXX0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/runtime/run.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/runtime/run.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAIL,KAAK,iBAAiB,EAEvB,MAAM,iBAAiB,CAAC;AAYzB,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EAErB,MAAM,WAAW,CAAC;AAQnB,gBAAgB;AAChB,wBAAgB,4BAA4B,IAAI,MAAM,CAMrD;AAED;;GAEG;AACH,MAAM,MAAM,sBAAsB,CAAC,CAAC,GAAG,GAAG,IAAI,cAAc,CAAC,CAAC,CAAC,GAAG;IAChE;;;;;;;OAOG;IACH,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CACjC,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC5C;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,GAAG,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;IACrB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9B;AAED;;GAEG;AACH,qBAAa,GAAG,CAAC,OAAO;;IACtB,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC;;;;IAIlD,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC,IAAI,EAAE;QAClC,KAAK,EAAE,MAAM,CAAC;QACd,cAAc,CAAC,EAAE,OAAO,CAAC;KAC1B;IAID;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;gBA4BF,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE;IAiC9D;;;;;;OAMG;IACG,MAAM,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IAKlE;;;;;;OAMG;IACG,MAAM,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAYvD;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,CAa7B;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAOvC;IAED;;;OAGG;IACH,IAAI,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAGlC;IAED;;OAEG;IACH,IAAI,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAKlC;IAED;;OAEG;IACH,IAAI,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAK7B;IAED;;;OAGG;IACH,IAAI,SAAS,IAAI,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,CAKzC;IAED;;;OAGG;IACH,IAAI,WAAW,IAAI,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,CAK3C;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,sBAAsB,CAErC;IAED;;;;;;;;;;;OAWG;IACH,WAAW,CAAC,CAAC,GAAG,GAAG,EACjB,OAAO,GAAE,6BAAkC,GAC1C,sBAAsB,CAAC,CAAC,CAAC;CAqI7B;AAED;;;;;;GAMG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,CAE3D"}
|
package/dist/runtime/run.js
CHANGED
|
@@ -7,6 +7,10 @@ import { getWorkflowRunStreamId } from '../util.js';
|
|
|
7
7
|
import { getWorldLazy } from './get-world-lazy.js';
|
|
8
8
|
import { wakeUpRun, } from './runs.js';
|
|
9
9
|
const RETURN_VALUE_POLL_INTERVAL_MS = 1_000;
|
|
10
|
+
const PAYLOAD_TERMINAL_RUN_STATUSES = new Set([
|
|
11
|
+
'completed',
|
|
12
|
+
'failed',
|
|
13
|
+
]);
|
|
10
14
|
/** @internal */
|
|
11
15
|
export function getReturnValuePollIntervalMs() {
|
|
12
16
|
return envNumber('WORKFLOW_RETURN_VALUE_POLL_INTERVAL_MS', RETURN_VALUE_POLL_INTERVAL_MS, { integer: true, min: 1 });
|
|
@@ -59,12 +63,12 @@ export class Run {
|
|
|
59
63
|
* to be resolved once.
|
|
60
64
|
* @internal
|
|
61
65
|
*/
|
|
62
|
-
#getEncryptionKey() {
|
|
66
|
+
#getEncryptionKey(run) {
|
|
63
67
|
if (!this.#encryptionKeyPromise) {
|
|
64
68
|
this.#encryptionKeyPromise = (async () => {
|
|
65
69
|
const world = await this.#lazyWorldPromise;
|
|
66
|
-
const
|
|
67
|
-
const rawKey = await world.getEncryptionKeyForRun?.(
|
|
70
|
+
const runData = run ?? (await world.runs.get(this.runId));
|
|
71
|
+
const rawKey = await world.getEncryptionKeyForRun?.(runData);
|
|
68
72
|
return rawKey ? await deriveRunPayloadKeys(rawKey) : undefined;
|
|
69
73
|
})();
|
|
70
74
|
}
|
|
@@ -128,7 +132,9 @@ export class Run {
|
|
|
128
132
|
*/
|
|
129
133
|
get status() {
|
|
130
134
|
'use step';
|
|
131
|
-
return this.#lazyWorldPromise.then((world) => world.runs
|
|
135
|
+
return this.#lazyWorldPromise.then((world) => world.runs
|
|
136
|
+
.get(this.runId, { resolveData: 'none' })
|
|
137
|
+
.then((run) => run.status));
|
|
132
138
|
}
|
|
133
139
|
/**
|
|
134
140
|
* The return value of the workflow run.
|
|
@@ -209,6 +215,38 @@ export class Run {
|
|
|
209
215
|
},
|
|
210
216
|
});
|
|
211
217
|
}
|
|
218
|
+
/** @internal */
|
|
219
|
+
async #resolveTerminalReturnValue(run) {
|
|
220
|
+
if (run.status === 'completed') {
|
|
221
|
+
const encryptionKey = await this.#getEncryptionKey(run);
|
|
222
|
+
return await hydrateWorkflowReturnValue(run.output, this.runId, encryptionKey);
|
|
223
|
+
}
|
|
224
|
+
if (run.status === 'cancelled') {
|
|
225
|
+
throw new WorkflowRunCancelledError(this.runId);
|
|
226
|
+
}
|
|
227
|
+
if (run.status === 'failed') {
|
|
228
|
+
// Hydrate the serialized run error so the original thrown value
|
|
229
|
+
// (with its type identity, cause chain, etc.) is set as the
|
|
230
|
+
// `cause` on WorkflowRunFailedError.
|
|
231
|
+
const encryptionKey = await this.#getEncryptionKey(run);
|
|
232
|
+
let hydratedError;
|
|
233
|
+
try {
|
|
234
|
+
hydratedError = await hydrateRunError(run.error, this.runId, encryptionKey);
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
// If hydration fails, surface a generic fallback rather than
|
|
238
|
+
// leaving the user with a raw Uint8Array. The run's errorCode
|
|
239
|
+
// is still preserved on the thrown WorkflowRunFailedError.
|
|
240
|
+
hydratedError = new Error('Failed to hydrate workflow run error');
|
|
241
|
+
}
|
|
242
|
+
throw new WorkflowRunFailedError(this.runId, hydratedError, {
|
|
243
|
+
errorCode: run.errorCode,
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
// Terminal statuses are immutable, but if an inconsistent world returns
|
|
247
|
+
// a non-terminal full record, resume polling safely.
|
|
248
|
+
throw new WorkflowRunNotCompletedError(this.runId, run.status);
|
|
249
|
+
}
|
|
212
250
|
/**
|
|
213
251
|
* Polls the workflow return value until it is completed.
|
|
214
252
|
* @internal
|
|
@@ -233,35 +271,22 @@ export class Run {
|
|
|
233
271
|
// changelog for details.
|
|
234
272
|
while (true) {
|
|
235
273
|
try {
|
|
236
|
-
const
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
}
|
|
241
|
-
if (run.status === 'cancelled') {
|
|
274
|
+
const runMetadata = await world.runs.get(this.runId, {
|
|
275
|
+
resolveData: 'none',
|
|
276
|
+
});
|
|
277
|
+
if (runMetadata.status === 'cancelled') {
|
|
242
278
|
throw new WorkflowRunCancelledError(this.runId);
|
|
243
279
|
}
|
|
244
|
-
if (
|
|
245
|
-
//
|
|
246
|
-
//
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
let hydratedError;
|
|
250
|
-
try {
|
|
251
|
-
hydratedError = await hydrateRunError(run.error, this.runId, encryptionKey);
|
|
252
|
-
}
|
|
253
|
-
catch {
|
|
254
|
-
// If hydration fails, surface a generic fallback rather than
|
|
255
|
-
// leaving the user with a raw Uint8Array. The run's errorCode
|
|
256
|
-
// is still preserved on the thrown WorkflowRunFailedError.
|
|
257
|
-
hydratedError = new Error('Failed to hydrate workflow run error');
|
|
258
|
-
}
|
|
259
|
-
throw new WorkflowRunFailedError(this.runId, hydratedError, {
|
|
260
|
-
errorCode: run.errorCode,
|
|
280
|
+
if (PAYLOAD_TERMINAL_RUN_STATUSES.has(runMetadata.status)) {
|
|
281
|
+
// The polling read above deliberately skips input/output/error refs.
|
|
282
|
+
// Resolve payloads only once the run reaches a terminal state.
|
|
283
|
+
const run = await world.runs.get(this.runId, {
|
|
284
|
+
resolveData: 'all',
|
|
261
285
|
});
|
|
286
|
+
return await this.#resolveTerminalReturnValue(run);
|
|
262
287
|
}
|
|
263
288
|
// Run not completed yet — sleep and poll again.
|
|
264
|
-
throw new WorkflowRunNotCompletedError(this.runId,
|
|
289
|
+
throw new WorkflowRunNotCompletedError(this.runId, runMetadata.status);
|
|
265
290
|
}
|
|
266
291
|
catch (error) {
|
|
267
292
|
if (WorkflowRunNotCompletedError.is(error)) {
|
|
@@ -290,4 +315,4 @@ export class Run {
|
|
|
290
315
|
export function getRun(runId) {
|
|
291
316
|
return new Run(runId);
|
|
292
317
|
}
|
|
293
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvcnVuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIsc0JBQXNCLEVBQ3RCLDRCQUE0QixFQUM1Qix3QkFBd0IsR0FDekIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzRSxPQUFPLEVBQ0wsU0FBUyxFQUNULG9CQUFvQixHQUdyQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFDTCxvQkFBb0IsR0FFckIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLGVBQWUsRUFDZiwwQkFBMEIsR0FDM0IsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDcEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25ELE9BQU8sRUFJTCxTQUFTLEdBQ1YsTUFBTSxXQUFXLENBQUM7QUFFbkIsTUFBTSw2QkFBNkIsR0FBRyxLQUFLLENBQUM7QUFFNUMsZ0JBQWdCO0FBQ2hCLE1BQU0sVUFBVSw0QkFBNEI7SUFDMUMsT0FBTyxTQUFTLENBQ2Qsd0NBQXdDLEVBQ3hDLDZCQUE2QixFQUM3QixFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUMxQixDQUFDO0FBQ0osQ0FBQztBQTZDRDs7R0FFRztBQUNILE1BQU0sT0FBTyxHQUFHO0lBQ2QsTUFBTSxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxRQUFzQjtRQUNoRCxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsY0FBYyxFQUFFLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUM3RSxDQUFDO0lBRUQs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ICBXb3JrZmxvd1J1bkNhbmNlbGxlZEVycm9yLFxuICBXb3JrZmxvd1J1bkZhaWxlZEVycm9yLFxuICBXb3JrZmxvd1J1bk5vdENvbXBsZXRlZEVycm9yLFxuICBXb3JrZmxvd1J1bk5vdEZvdW5kRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgV09SS0ZMT1dfREVTRVJJQUxJWkUsIFdPUktGTE9XX1NFUklBTElaRSB9IGZyb20gJ0B3b3JrZmxvdy9zZXJkZSc7XG5pbXBvcnQge1xuICBlbnZOdW1iZXIsXG4gIFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICB0eXBlIFdvcmtmbG93UnVuU3RhdHVzLFxuICB0eXBlIFdvcmxkLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHtcbiAgZGVyaXZlUnVuUGF5bG9hZEtleXMsXG4gIHR5cGUgUGF5bG9hZEtleSxcbn0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi9lbmNyeXB0aW9uLmpzJztcbmltcG9ydCB7XG4gIGdldEV4dGVybmFsUmV2aXZlcnMsXG4gIGh5ZHJhdGVSdW5FcnJvcixcbiAgaHlkcmF0ZVdvcmtmbG93UmV0dXJuVmFsdWUsXG59IGZyb20gJy4uL3NlcmlhbGl6YXRpb24uanMnO1xuaW1wb3J0IHsgZ2V0V29ya2Zsb3dSdW5TdHJlYW1JZCB9IGZyb20gJy4uL3V0aWwuanMnO1xuaW1wb3J0IHsgZ2V0V29ybGRMYXp5IH0gZnJvbSAnLi9nZXQtd29ybGQtbGF6eS5qcyc7XG5pbXBvcnQge1xuICB0eXBlIENhbmNlbFJ1bk9wdGlvbnMsXG4gIHR5cGUgU3RvcFNsZWVwT3B0aW9ucyxcbiAgdHlwZSBTdG9wU2xlZXBSZXN1bHQsXG4gIHdha2VVcFJ1bixcbn0gZnJvbSAnLi9ydW5zLmpzJztcblxuY29uc3QgUkVUVVJOX1ZBTFVFX1BPTExfSU5URVJWQUxfTVMgPSAxXzAwMDtcblxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJldHVyblZhbHVlUG9sbEludGVydmFsTXMoKTogbnVtYmVyIHtcbiAgcmV0dXJuIGVudk51bWJlcihcbiAgICAnV09SS0ZMT1dfUkVUVVJOX1ZBTFVFX1BPTExfSU5URVJWQUxfTVMnLFxuICAgIFJFVFVSTl9WQUxVRV9QT0xMX0lOVEVSVkFMX01TLFxuICAgIHsgaW50ZWdlcjogdHJ1ZSwgbWluOiAxIH1cbiAgKTtcbn1cblxuLyoqXG4gKiBBIGBSZWFkYWJsZVN0cmVhbWAgZXh0ZW5kZWQgd2l0aCB3b3JrZmxvdy1zcGVjaWZpYyBoZWxwZXJzLlxuICovXG5leHBvcnQgdHlwZSBXb3JrZmxvd1JlYWRhYmxlU3RyZWFtPFIgPSBhbnk+ID0gUmVhZGFibGVTdHJlYW08Uj4gJiB7XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0YWlsIGluZGV4IChpbmRleCBvZiB0aGUgbGFzdCBrbm93biBjaHVuaywgMC1iYXNlZCkgb2YgdGhlXG4gICAqIHVuZGVybHlpbmcgd29ya2Zsb3cgc3RyZWFtLiBVc2VmdWwgZm9yIHJlc29sdmluZyBhIG5lZ2F0aXZlIGBzdGFydEluZGV4YFxuICAgKiBpbnRvIGFuIGFic29sdXRlIHBvc2l0aW9uIOKAlCBmb3IgZXhhbXBsZSwgd2hlbiBidWlsZGluZyByZWNvbm5lY3Rpb25cbiAgICogZW5kcG9pbnRzIHRoYXQgbmVlZCB0byBpbmZvcm0gdGhlIGNsaWVudCB3aGVyZSB0aGUgc3RyZWFtIHN0YXJ0cy5cbiAgICpcbiAgICogUmV0dXJucyBgLTFgIHdoZW4gbm8gY2h1bmtzIGhhdmUgYmVlbiB3cml0dGVuIHlldC5cbiAgICovXG4gIGdldFRhaWxJbmRleCgpOiBQcm9taXNlPG51bWJlcj47XG59O1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIGEgd29ya2Zsb3cncyByZWFkYWJsZSBzdHJlYW0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dSZWFkYWJsZVN0cmVhbU9wdGlvbnMge1xuICAvKipcbiAgICogQW4gb3B0aW9uYWwgbmFtZXNwYWNlIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gbXVsdGlwbGUgc3RyZWFtcyBhc3NvY2lhdGVkXG4gICAqIHdpdGggdGhlIHNhbWUgd29ya2Zsb3cgcnVuLlxuICAgKi9cbiAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGluZGV4IG51bWJlciBvZiB0aGUgc3RhcnRpbmcgY2h1bmsgdG8gYmVnaW4gcmVhZGluZyB0aGUgc3RyZWFtIGZyb20uXG4gICAqIE5lZ2F0aXZlIHZhbHVlcyBzdGFydCBmcm9tIHRoZSBlbmQgKGUuZy4gLTMgcmVhZHMgdGhlIGxhc3QgMyBjaHVua3MpLlxuICAgKi9cbiAgc3RhcnRJbmRleD86IG51bWJlcjtcbiAgLyoqXG4gICAqIEFueSBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyB0aGF0IG5lZWQgdG8gYmUgcGVyZm9ybWVkIGJlZm9yZSB0aGUgZXhlY3V0aW9uXG4gICAqIGVudmlyb25tZW50IGlzIHBhdXNlZCAvIHRlcm1pbmF0ZWRcbiAgICogKGkuZS4gdXNpbmcgW2B3YWl0VW50aWwoKWBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0FQSS9FeHRlbmRhYmxlRXZlbnQvd2FpdFVudGlsKSBvciBzaW1pbGFyKS5cbiAgICovXG4gIG9wcz86IFByb21pc2U8YW55PltdO1xuICAvKipcbiAgICogVGhlIGdsb2JhbCBvYmplY3QgdG8gdXNlIGZvciBoeWRyYXRpbmcgdHlwZXMgZnJvbSB0aGUgZ2xvYmFsIHNjb3BlLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byB7QGxpbmsgW2BnbG9iYWxUaGlzYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvZ2xvYmFsVGhpcyl9LlxuICAgKi9cbiAgZ2xvYmFsPzogUmVjb3JkPHN0cmluZywgYW55Pjtcbn1cblxuLyoqXG4gKiBBIGhhbmRsZXIgY2xhc3MgZm9yIGEgd29ya2Zsb3cgcnVuLlxuICovXG5leHBvcnQgY2xhc3MgUnVuPFRSZXN1bHQ+IHtcbiAgc3RhdGljIFtXT1JLRkxPV19TRVJJQUxJWkVdKGluc3RhbmNlOiBSdW48dW5rbm93bj4pIHtcbiAgICByZXR1cm4geyBydW5JZDogaW5zdGFuY2UucnVuSWQsIHJlc2lsaWVudFN0YXJ0OiBpbnN0YW5jZS4jcmVzaWxpZW50U3RhcnQgfTtcbiAgfVxuXG4gIHN0YXRpYyBbV09SS0ZMT1dfREVTRVJJQUxJWkVdKGRhdGE6IHtcbiAgICBydW5JZDogc3RyaW5nO1xuICAgIHJlc2lsaWVudFN0YXJ0PzogYm9vbGVhbjtcbiAgfSkge1xuICAgIHJldHVybiBuZXcgUnVuKGRhdGEucnVuSWQsIHsgcmVzaWxpZW50U3RhcnQ6IGRhdGEucmVzaWxpZW50U3RhcnQgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSB3b3JrZmxvdyBydW4uXG4gICAqL1xuICBydW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgd29ybGQgb2JqZWN0LlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gICN3b3JsZFByb21pc2U6IFByb21pc2U8V29ybGQ+IHwgdW5kZWZpbmVkO1xuICBnZXQgI2xhenlXb3JsZFByb21pc2UoKSB7XG4gICAgaWYgKCF0aGlzLiN3b3JsZFByb21pc2UpIHRoaXMuI3dvcmxkUHJvbWlzZSA9IGdldFdvcmxkTGF6eSgpO1xuICAgIHJldHVybiB0aGlzLiN3b3JsZFByb21pc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2FjaGVkIGVuY3J5cHRpb24ga2V5IHJlc29sdXRpb24uIFJlc29sdmVkIG9uY2Ugb24gZmlyc3QgdXNlIGFuZFxuICAgKiByZXVzZWQgZm9yIHJldHVyblZhbHVlLCBnZXRSZWFkYWJsZSgpLCBldGMuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgI2VuY3J5cHRpb25LZXlQcm9taXNlOiBQcm9taXNlPFBheWxvYWRLZXkgfCB1bmRlZmluZWQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFdoZW4gdHJ1ZSwgcnVuX2NyZWF0ZWQgZmFpbGVkIGFuZCB0aGUgcnVuIG1heSBub3QgZXhpc3QgeWV0ICh0aGVcbiAgICogcmVzaWxpZW50IHN0YXJ0IHBhdGggd2lsbCBjcmVhdGUgaXQgdmlhIHJ1bl9zdGFydGVkKS4gcG9sbFJldHVyblZhbHVlXG4gICAqIHJldHJpZXMgb24gV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yIG9ubHkgd2hlbiB0aGlzIGZsYWcgaXMgc2V0IHNvXG4gICAqIHRoYXQgbm9ybWFsIHJ1bnMgZmFpbCBmYXN0IG9uIDQwNC5cbiAgICogQGludGVybmFsXG4gICAqL1xuICAjcmVzaWxpZW50U3RhcnQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihydW5JZDogc3RyaW5nLCBvcHRzPzogeyByZXNpbGllbnRTdGFydD86IGJvb2xlYW4gfSkge1xuICAgIHRoaXMucnVuSWQgPSBydW5JZDtcbiAgICB0aGlzLiNyZXNpbGllbnRTdGFydCA9IG9wdHM/LnJlc2lsaWVudFN0YXJ0ID8/IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGFuZCBjYWNoZXMgdGhlIGVuY3J5cHRpb24ga2V5IGZvciB0aGlzIHJ1bi5cbiAgICogVGhlIGtleSBpcyB0aGUgc2FtZSBmb3IgdGhlIGxpZmV0aW1lIG9mIGEgcnVuLCBzbyBpdCBvbmx5IG5lZWRzXG4gICAqIHRvIGJlIHJlc29sdmVkIG9uY2UuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgI2dldEVuY3J5cHRpb25LZXkoKTogUHJvbWlzZTxQYXlsb2FkS2V5IHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKCF0aGlzLiNlbmNyeXB0aW9uS2V5UHJvbWlzZSkge1xuICAgICAgdGhpcy4jZW5jcnlwdGlvbktleVByb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB3b3JsZCA9IGF3YWl0IHRoaXMuI2xhenlXb3JsZFByb21pc2U7XG4gICAgICAgIGNvbnN0IHJ1biA9IGF3YWl0IHdvcmxkLnJ1bnMuZ2V0KHRoaXMucnVuSWQpO1xuICAgICAgICBjb25zdCByYXdLZXkgPSBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuPy4ocnVuKTtcbiAgICAgICAgcmV0dXJuIHJhd0tleSA/IGF3YWl0IGRlcml2ZVJ1blBheWxvYWRLZXlzKHJhd0tleSkgOiB1bmRlZmluZWQ7XG4gICAgICB9KSgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy4jZW5jcnlwdGlvbktleVByb21pc2U7XG4gIH1cblxuICAvKipcbiAgICogRGVmZXIgZmV0Y2hpbmcgdGhlIHJ1biBhbmQgaXRzIGVuY3J5cHRpb24ga2V5IHVudGlsIHNlcmlhbGl6ZWQgc3RyZWFtIGRhdGFcbiAgICogaXMgYWN0dWFsbHkgcmVhZC4gQW4gZW1wdHkgb3IgbWV0YWRhdGEtb25seSBzdHJlYW0gbXVzdCBub3Qgc3RhcnQgYW5cbiAgICogdW5vYnNlcnZlZCBydW4gbG9va3VwLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gICNnZXRFbmNyeXB0aW9uS2V5TGF6aWx5KCk6ICgpID0+IFByb21pc2U8UGF5bG9hZEtleSB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiAoKSA9PiB0aGlzLiNnZXRFbmNyeXB0aW9uS2V5KCk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJydXB0cyBwZW5kaW5nIGBzbGVlcCgpYCBjYWxscywgcmVzdW1pbmcgdGhlIHdvcmtmbG93IGVhcmx5LlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHNldHRpbmdzIHRvIHRhcmdldCBzcGVjaWZpYyBzbGVlcCBjYWxscyBieSBjb3JyZWxhdGlvbiBJRC5cbiAgICogICBJZiBub3QgcHJvdmlkZWQsIGFsbCBwZW5kaW5nIHNsZWVwIGNhbGxzIHdpbGwgYmUgaW50ZXJydXB0ZWQuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFN0b3BTbGVlcFJlc3VsdH0gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIG51bWJlciBvZiBzbGVlcCBjYWxscyB0aGF0IHdlcmUgaW50ZXJydXB0ZWQuXG4gICAqL1xuICBhc3luYyB3YWtlVXAob3B0aW9ucz86IFN0b3BTbGVlcE9wdGlvbnMpOiBQcm9taXNlPFN0b3BTbGVlcFJlc3VsdD4ge1xuICAgICd1c2Ugc3RlcCc7XG4gICAgcmV0dXJuIHdha2VVcFJ1bihhd2FpdCB0aGlzLiNsYXp5V29ybGRQcm9taXNlLCB0aGlzLnJ1bklkLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWxzIHRoZSB3b3JrZmxvdyBydW4uXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgY2FuY2VsbGF0aW9uIHNldHRpbmdzLiBgY2FuY2VsUmVhc29uYCByZWNvcmRzIGFcbiAgICogICBmcmVlLXRleHQgcmVhc29uIChtYXggNTEyIGNoYXJzKSBvbiB0aGUgcnVuX2NhbmNlbGxlZCBldmVudCwgc3VyZmFjZWQgaW5cbiAgICogICB0aGUgcnVuIGRldGFpbCB2aWV3LlxuICAgKi9cbiAgYXN5bmMgY2FuY2VsKG9wdGlvbnM/OiBDYW5jZWxSdW5PcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgJ3VzZSBzdGVwJztcbiAgICBjb25zdCB3b3JsZCA9IGF3YWl0IHRoaXMuI2xhenlXb3JsZFByb21pc2U7XG4gICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZSh0aGlzLnJ1bklkLCB7XG4gICAgICBldmVudFR5cGU6ICdydW5fY2FuY2VsbGVkJyxcbiAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgIC4uLihvcHRpb25zPy5jYW5jZWxSZWFzb24gIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHsgZXZlbnREYXRhOiB7IGNhbmNlbFJlYXNvbjogb3B0aW9ucy5jYW5jZWxSZWFzb24gfSB9XG4gICAgICAgIDoge30pLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHdvcmtmbG93IHJ1biBleGlzdHMuXG4gICAqL1xuICBnZXQgZXhpc3RzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICd1c2Ugc3RlcCc7XG4gICAgcmV0dXJuIHRoaXMuI2xhenlXb3JsZFByb21pc2UudGhlbigod29ybGQpID0+XG4gICAgICB3b3JsZC5ydW5zXG4gICAgICAgIC5nZXQodGhpcy5ydW5JZCwgeyByZXNvbHZlRGF0YTogJ25vbmUnIH0pXG4gICAgICAgIC50aGVuKCgpID0+IHRydWUpXG4gICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAoV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yLmlzKGVycm9yKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzdGF0dXMgb2YgdGhlIHdvcmtmbG93IHJ1bi5cbiAgICovXG4gIGdldCBzdGF0dXMoKTogUHJvbWlzZTxXb3JrZmxvd1J1blN0YXR1cz4ge1xuICAgICd1c2Ugc3RlcCc7XG4gICAgcmV0dXJuIHRoaXMuI2xhenlXb3JsZFByb21pc2UudGhlbigod29ybGQpID0+XG4gICAgICB3b3JsZC5ydW5zLmdldCh0aGlzLnJ1bklkKS50aGVuKChydW4pID0+IHJ1bi5zdGF0dXMpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSB3b3JrZmxvdyBydW4uXG4gICAqIFBvbGxzIHRoZSB3b3JrZmxvdyByZXR1cm4gdmFsdWUgdW50aWwgaXQgaXMgY29tcGxldGVkLlxuICAgKi9cbiAgZ2V0IHJldHVyblZhbHVlKCk6IFByb21pc2U8VFJlc3VsdD4ge1xuICAgICd1c2Ugc3RlcCc7XG4gICAgcmV0dXJuIHRoaXMuI3BvbGxSZXR1cm5WYWx1ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSB3b3JrZmxvdy5cbiAgICovXG4gIGdldCB3b3JrZmxvd05hbWUoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAndXNlIHN0ZXAnO1xuICAgIHJldHVybiB0aGlzLiNsYXp5V29ybGRQcm9taXNlLnRoZW4oKHdvcmxkKSA9PlxuICAgICAgd29ybGQucnVucy5nZXQodGhpcy5ydW5JZCkudGhlbigocnVuKSA9PiBydW4ud29ya2Zsb3dOYW1lKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRpbWVzdGFtcCB3aGVuIHRoZSB3b3JrZmxvdyBydW4gd2FzIGNyZWF0ZWQuXG4gICAqL1xuICBnZXQgY3JlYXRlZEF0KCk6IFByb21pc2U8RGF0ZT4ge1xuICAgICd1c2Ugc3RlcCc7XG4gICAgcmV0dXJuIHRoaXMuI2xhenlXb3JsZFByb21pc2UudGhlbigod29ybGQpID0+XG4gICAgICB3b3JsZC5ydW5zLmdldCh0aGlzLnJ1bklkKS50aGVuKChydW4pID0+IHJ1bi5jcmVhdGVkQXQpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdGltZXN0YW1wIHdoZW4gdGhlIHdvcmtmbG93IHJ1biBzdGFydGVkIGV4ZWN1dGlvbi5cbiAgICogUmV0dXJucyB1bmRlZmluZWQgaWYgdGhlIHdvcmtmbG93IGhhcyBub3Qgc3RhcnRlZCB5ZXQuXG4gICAqL1xuICBnZXQgc3RhcnRlZEF0KCk6IFByb21pc2U8RGF0ZSB8IHVuZGVmaW5lZD4ge1xuICAgICd1c2Ugc3RlcCc7XG4gICAgcmV0dXJuIHRoaXMuI2xhenlXb3JsZFByb21pc2UudGhlbigod29ybGQpID0+XG4gICAgICB3b3JsZC5ydW5zLmdldCh0aGlzLnJ1bklkKS50aGVuKChydW4pID0+IHJ1bi5zdGFydGVkQXQpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdGltZXN0YW1wIHdoZW4gdGhlIHdvcmtmbG93IHJ1biBjb21wbGV0ZWQuXG4gICAqIFJldHVybnMgdW5kZWZpbmVkIGlmIHRoZSB3b3JrZmxvdyBoYXMgbm90IGNvbXBsZXRlZCB5ZXQuXG4gICAqL1xuICBnZXQgY29tcGxldGVkQXQoKTogUHJvbWlzZTxEYXRlIHwgdW5kZWZpbmVkPiB7XG4gICAgJ3VzZSBzdGVwJztcbiAgICByZXR1cm4gdGhpcy4jbGF6eVdvcmxkUHJvbWlzZS50aGVuKCh3b3JsZCkgPT5cbiAgICAgIHdvcmxkLnJ1bnMuZ2V0KHRoaXMucnVuSWQpLnRoZW4oKHJ1bikgPT4gcnVuLmNvbXBsZXRlZEF0KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJlYWRhYmxlIHN0cmVhbSBvZiB0aGUgd29ya2Zsb3cgcnVuLlxuICAgKi9cbiAgZ2V0IHJlYWRhYmxlKCk6IFdvcmtmbG93UmVhZGFibGVTdHJlYW0ge1xuICAgIHJldHVybiB0aGlzLmdldFJlYWRhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSB3b3JrZmxvdyBydW4ncyBkZWZhdWx0IHJlYWRhYmxlIHN0cmVhbSwgd2hpY2ggcmVhZHMgY2h1bmtzXG4gICAqIHdyaXR0ZW4gdG8gdGhlIGNvcnJlc3BvbmRpbmcgd3JpdGFibGUgc3RyZWFtIHtAbGluayBnZXRXcml0YWJsZX0uXG4gICAqXG4gICAqIFRoZSByZXR1cm5lZCBzdHJlYW0gaGFzIGFuIGFkZGl0aW9uYWwge0BsaW5rIFdvcmtmbG93UmVhZGFibGVTdHJlYW0uZ2V0VGFpbEluZGV4IHwgZ2V0VGFpbEluZGV4KCl9XG4gICAqIGhlbHBlciB0aGF0IHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGtub3duIGNodW5rLiBUaGlzIGlzIHVzZWZ1bCB3aGVuXG4gICAqIGJ1aWxkaW5nIHJlY29ubmVjdGlvbiBlbmRwb2ludHMgdGhhdCBuZWVkIHRvIGluZm9ybSBjbGllbnRzIHdoZXJlIHRoZVxuICAgKiBzdHJlYW0gc3RhcnRzLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgcmVhZGFibGUgc3RyZWFtLlxuICAgKiBAcmV0dXJucyBBIGBXb3JrZmxvd1JlYWRhYmxlU3RyZWFtYCBmb3IgdGhlIHdvcmtmbG93IHJ1bi5cbiAgICovXG4gIGdldFJlYWRhYmxlPFIgPSBhbnk+KFxuICAgIG9wdGlvbnM6IFdvcmtmbG93UmVhZGFibGVTdHJlYW1PcHRpb25zID0ge31cbiAgKTogV29ya2Zsb3dSZWFkYWJsZVN0cmVhbTxSPiB7XG4gICAgJ3VzZSBzdGVwJztcbiAgICBjb25zdCB7IG9wcyA9IFtdLCBnbG9iYWwgPSBnbG9iYWxUaGlzLCBzdGFydEluZGV4LCBuYW1lc3BhY2UgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgbmFtZSA9IGdldFdvcmtmbG93UnVuU3RyZWFtSWQodGhpcy5ydW5JZCwgbmFtZXNwYWNlKTtcbiAgICAvLyBUaGUgcmVzb2x2ZXIgc3RhcnRzIG9ubHkgd2hlbiB0aGUgZGVzZXJpYWxpemUgc3RyZWFtIHNlZXMgaXRzIGZpcnN0XG4gICAgLy8gY2h1bmssIHNvIGNyZWF0aW5nIG9yIHByb2JpbmcgYW4gZW1wdHkgc3RyZWFtIGNhbm5vdCByZWplY3QgaW4gdGhlXG4gICAgLy8gYmFja2dyb3VuZC5cbiAgICBjb25zdCBlbmNyeXB0aW9uS2V5ID0gdGhpcy4jZ2V0RW5jcnlwdGlvbktleUxhemlseSgpO1xuICAgIGNvbnN0IHN0cmVhbSA9IGdldEV4dGVybmFsUmV2aXZlcnMoZ2xvYmFsLCBvcHMsIHRoaXMucnVuSWQsIGVuY3J5cHRpb25LZXkpXG4gICAgICAuUmVhZGFibGVTdHJlYW0hKHtcbiAgICAgIG5hbWUsXG4gICAgICBzdGFydEluZGV4LFxuICAgIH0pIGFzIFJlYWRhYmxlU3RyZWFtPFI+O1xuXG4gICAgY29uc3Qgd29ybGRQcm9taXNlID0gdGhpcy4jbGF6eVdvcmxkUHJvbWlzZTtcbiAgICBjb25zdCBydW5JZCA9IHRoaXMucnVuSWQ7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oc3RyZWFtLCB7XG4gICAgICBnZXRUYWlsSW5kZXg6IGFzeW5jICgpOiBQcm9taXNlPG51bWJlcj4gPT4ge1xuICAgICAgICBjb25zdCB3b3JsZCA9IGF3YWl0IHdvcmxkUHJvbWlzZTtcbiAgICAgICAgY29uc3QgaW5mbyA9IGF3YWl0IHdvcmxkLnN0cmVhbXMuZ2V0SW5mbyhydW5JZCwgbmFtZSk7XG4gICAgICAgIHJldHVybiBpbmZvLnRhaWxJbmRleDtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUG9sbHMgdGhlIHdvcmtmbG93IHJldHVybiB2YWx1ZSB1bnRpbCBpdCBpcyBjb21wbGV0ZWQuXG4gICAqIEBpbnRlcm5hbFxuICAgKiBAcmV0dXJucyBUaGUgd29ya2Zsb3cgcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgYXN5bmMgI3BvbGxSZXR1cm5WYWx1ZSgpOiBQcm9taXNlPFRSZXN1bHQ+IHtcbiAgICBjb25zdCB3b3JsZCA9IGF3YWl0IHRoaXMuI2xhenlXb3JsZFByb21pc2U7XG5cbiAgICAvLyBXaGVuIHJlc2lsaWVudFN0YXJ0IGlzIHRydWUsIHJ1bl9jcmVhdGVkIGZhaWxlZCBhbmQgdGhlIHJ1biBtYXlcbiAgICAvLyBub3QgZXhpc3QgeWV0LiBSZXRyeSBvbiBXb3JrZmxvd1J1bk5vdEZvdW5kRXJyb3IgdXAgdG8gMyB0aW1lc1xuICAgIC8vICgxcyArIDNzICsgNnMgPSAxMHMgdG90YWwpIHRvIGdpdmUgdGhlIHF1ZXVlIHRpbWUgdG8gZGVsaXZlclxuICAgIC8vIGFuZCB0aGUgcnVudGltZSB0byBjcmVhdGUgdGhlIHJ1biB2aWEgcnVuX3N0YXJ0ZWQuXG4gICAgLy8gV2hlbiByZXNpbGllbnRTdGFydCBpcyBmYWxzZSwgNDA0IGlzIGEgcmVhbCBlcnJvciDigJQgZmFpbCBmYXN0LlxuICAgIGxldCBub3RGb3VuZFJldHJpZXMgPSAwO1xuICAgIGNvbnN0IE5PVF9GT1VORF9NQVhfUkVUUklFUyA9IHRoaXMuI3Jlc2lsaWVudFN0YXJ0ID8gMyA6IDA7XG4gICAgY29uc3QgTk9UX0ZPVU5EX0RFTEFZUyA9IFsxXzAwMCwgM18wMDAsIDZfMDAwXTtcblxuICAgIC8vIE5PVEU6IHdoZW4gdGhpcyBwb2xsIHJ1bnMgaW5zaWRlIGEgc3RlcCAoZS5nLiB0aGUgc3RlcCB0aGF0IGEgcGFyZW50XG4gICAgLy8gd29ya2Zsb3cgdXNlcyB0byBhd2FpdCBhIGNoaWxkIHdvcmtmbG93J3MgYHJldHVyblZhbHVlYCksIGl0IGJsb2Nrc1xuICAgIC8vIGEgcXVldWUgd29ya2VyIHNsb3QgZm9yIGFzIGxvbmcgYXMgdGhlIGNoaWxkIHJ1biB0YWtlcyB0byBmaW5pc2guXG4gICAgLy8gV29ya2VyLWJhc2VkIHdvcmxkcyBsaWtlIGB3b3JsZC1wb3N0Z3Jlc2AgbXVzdCBiZSBzaXplZCB0byBjb3ZlciB0aGVcbiAgICAvLyBwZWFrIG51bWJlciBvZiBzdWNoIHBvbGxzIGluIGZsaWdodCDigJQgc2VlIHRoZSBgcXVldWVDb25jdXJyZW5jeWBcbiAgICAvLyBkZWZhdWx0IG9uIHRoZSBQb3N0Z3JlcyB3b3JsZCBhbmQgdGhlIG5vdGVzIGluIHRoZSBlYWdlci1wcm9jZXNzaW5nXG4gICAgLy8gY2hhbmdlbG9nIGZvciBkZXRhaWxzLlxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBydW4gPSBhd2FpdCB3b3JsZC5ydW5zLmdldCh0aGlzLnJ1bklkKTtcblxuICAgICAgICBpZiAocnVuLnN0YXR1cyA9PT0gJ2NvbXBsZXRlZCcpIHtcbiAgICAgICAgICBjb25zdCBlbmNyeXB0aW9uS2V5ID0gYXdhaXQgdGhpcy4jZ2V0RW5jcnlwdGlvbktleSgpO1xuICAgICAgICAgIHJldHVybiBhd2FpdCBoeWRyYXRlV29ya2Zsb3dSZXR1cm5WYWx1ZShcbiAgICAgICAgICAgIHJ1bi5vdXRwdXQsXG4gICAgICAgICAgICB0aGlzLnJ1bklkLFxuICAgICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocnVuLnN0YXR1cyA9PT0gJ2NhbmNlbGxlZCcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW5DYW5jZWxsZWRFcnJvcih0aGlzLnJ1bklkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChydW4uc3RhdHVzID09PSAnZmFpbGVkJykge1xuICAgICAgICAgIC8vIEh5ZHJhdGUgdGhlIHNlcmlhbGl6ZWQgcnVuIGVycm9yIHNvIHRoZSBvcmlnaW5hbCB0aHJvd24gdmFsdWVcbiAgICAgICAgICAvLyAod2l0aCBpdHMgdHlwZSBpZGVudGl0eSwgY2F1c2UgY2hhaW4sIGV0Yy4pIGlzIHNldCBhcyB0aGVcbiAgICAgICAgICAvLyBgY2F1c2VgIG9uIFdvcmtmbG93UnVuRmFpbGVkRXJyb3IuXG4gICAgICAgICAgY29uc3QgZW5jcnlwdGlvbktleSA9IGF3YWl0IHRoaXMuI2dldEVuY3J5cHRpb25LZXkoKTtcbiAgICAgICAgICBsZXQgaHlkcmF0ZWRFcnJvcjogdW5rbm93bjtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaHlkcmF0ZWRFcnJvciA9IGF3YWl0IGh5ZHJhdGVSdW5FcnJvcihcbiAgICAgICAgICAgICAgcnVuLmVycm9yLFxuICAgICAgICAgICAgICB0aGlzLnJ1bklkLFxuICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gSWYgaHlkcmF0aW9uIGZhaWxzLCBzdXJmYWNlIGEgZ2VuZXJpYyBmYWxsYmFjayByYXRoZXIgdGhhblxuICAgICAgICAgICAgLy8gbGVhdmluZyB0aGUgdXNlciB3aXRoIGEgcmF3IFVpbnQ4QXJyYXkuIFRoZSBydW4ncyBlcnJvckNvZGVcbiAgICAgICAgICAgIC8vIGlzIHN0aWxsIHByZXNlcnZlZCBvbiB0aGUgdGhyb3duIFdvcmtmbG93UnVuRmFpbGVkRXJyb3IuXG4gICAgICAgICAgICBoeWRyYXRlZEVycm9yID0gbmV3IEVycm9yKCdGYWlsZWQgdG8gaHlkcmF0ZSB3b3JrZmxvdyBydW4gZXJyb3InKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVuRmFpbGVkRXJyb3IodGhpcy5ydW5JZCwgaHlkcmF0ZWRFcnJvciwge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiBydW4uZXJyb3JDb2RlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUnVuIG5vdCBjb21wbGV0ZWQgeWV0IOKAlCBzbGVlcCBhbmQgcG9sbCBhZ2Fpbi5cbiAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVuTm90Q29tcGxldGVkRXJyb3IodGhpcy5ydW5JZCwgcnVuLnN0YXR1cyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoV29ya2Zsb3dSdW5Ob3RDb21wbGV0ZWRFcnJvci5pcyhlcnJvcikpIHtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT5cbiAgICAgICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgZ2V0UmV0dXJuVmFsdWVQb2xsSW50ZXJ2YWxNcygpKVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIFdvcmtmbG93UnVuTm90Rm91bmRFcnJvci5pcyhlcnJvcikgJiZcbiAgICAgICAgICBub3RGb3VuZFJldHJpZXMgPCBOT1RfRk9VTkRfTUFYX1JFVFJJRVNcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgZGVsYXkgPSBOT1RfRk9VTkRfREVMQVlTW25vdEZvdW5kUmV0cmllc10hO1xuICAgICAgICAgIG5vdEZvdW5kUmV0cmllcysrO1xuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGRlbGF5KSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUmV0cmlldmVzIGEgYFJ1bmAgb2JqZWN0IGZvciBhIGdpdmVuIHJ1biBJRC5cbiAqXG4gKiBAcGFyYW0gcnVuSWQgLSBUaGUgd29ya2Zsb3cgcnVuIElEIG9idGFpbmVkIGZyb20ge0BsaW5rIHN0YXJ0fS5cbiAqIEByZXR1cm5zIEEgYFJ1bmAgb2JqZWN0LlxuICogQHRocm93cyBXb3JrZmxvd1J1bk5vdEZvdW5kRXJyb3IgaWYgdGhlIHJ1biBJRCBpcyBub3QgZm91bmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSdW48VFJlc3VsdD4ocnVuSWQ6IHN0cmluZyk6IFJ1bjxUUmVzdWx0PiB7XG4gIHJldHVybiBuZXcgUnVuKHJ1bklkKTtcbn1cbiJdfQ==
|
|
318
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvcnVuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIsc0JBQXNCLEVBQ3RCLDRCQUE0QixFQUM1Qix3QkFBd0IsR0FDekIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzRSxPQUFPLEVBQ0wsU0FBUyxFQUNULG9CQUFvQixHQUlyQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFDTCxvQkFBb0IsR0FFckIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLGVBQWUsRUFDZiwwQkFBMEIsR0FDM0IsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDcEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25ELE9BQU8sRUFJTCxTQUFTLEdBQ1YsTUFBTSxXQUFXLENBQUM7QUFFbkIsTUFBTSw2QkFBNkIsR0FBRyxLQUFLLENBQUM7QUFDNUMsTUFBTSw2QkFBNkIsR0FBRyxJQUFJLEdBQUcsQ0FBb0I7SUFDL0QsV0FBVztJQUNYLFFBQVE7Q0FDVCxDQUFDLENBQUM7QUFFSCxnQkFBZ0I7QUFDaEIsTUFBTSxVQUFVLDRCQUE0QjtJQUMxQyxPQUFPLFNBQVMsQ0FDZCx3Q0FBd0MsRUFDeEMsNkJBQTZCLEVBQzdCLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQzFCLENBQUM7QUFDSixDQUFDO0FBNkNEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLEdBQUc7SUFDZCxNQUFNLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLFFBQXNCO1FBQ2hELE9BQU8sRUFBRSxLQUFLLEVB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QixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3pFLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLElBQUksNEJBQTRCLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQzNDLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUM1QixVQUFVLENBQUMsT0FBTyxFQUFFLDRCQUE0QixFQUFFLENBQUMsQ0FDcEQsQ0FBQztvQkFDRixTQUFTO2dCQUNYLENBQUM7Z0JBQ0QsSUFDRSx3QkFBd0IsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO29CQUNsQyxlQUFlLEdBQUcscUJBQXFCLEVBQ3ZDLENBQUM7b0JBQ0QsTUFBTSxLQUFLLEdBQUcsZ0JBQWdCLENBQUMsZUFBZSxDQUFFLENBQUM7b0JBQ2pELGVBQWUsRUFBRSxDQUFDO29CQUNsQixNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7b0JBQzNELFNBQVM7Z0JBQ1gsQ0FBQztnQkFDRCxNQUFNLEtBQUssQ0FBQztZQUNkLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLE1BQU0sQ0FBVSxLQUFhO0lBQzNDLE9BQU8sSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDeEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIFdvcmtmbG93UnVuQ2FuY2VsbGVkRXJyb3IsXG4gIFdvcmtmbG93UnVuRmFpbGVkRXJyb3IsXG4gIFdvcmtmbG93UnVuTm90Q29tcGxldGVkRXJyb3IsXG4gIFdvcmtmbG93UnVuTm90Rm91bmRFcnJvcixcbn0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgeyBXT1JLRkxPV19ERVNFUklBTElaRSwgV09SS0ZMT1dfU0VSSUFMSVpFIH0gZnJvbSAnQHdvcmtmbG93L3NlcmRlJztcbmltcG9ydCB7XG4gIGVudk51bWJlcixcbiAgU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gIHR5cGUgV29ya2Zsb3dSdW4sXG4gIHR5cGUgV29ya2Zsb3dSdW5TdGF0dXMsXG4gIHR5cGUgV29ybGQsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQge1xuICBkZXJpdmVSdW5QYXlsb2FkS2V5cyxcbiAgdHlwZSBQYXlsb2FkS2V5LFxufSBmcm9tICcuLi9zZXJpYWxpemF0aW9uL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHtcbiAgZ2V0RXh0ZXJuYWxSZXZpdmVycyxcbiAgaHlkcmF0ZVJ1bkVycm9yLFxuICBoeWRyYXRlV29ya2Zsb3dSZXR1cm5WYWx1ZSxcbn0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgeyBnZXRXb3JrZmxvd1J1blN0cmVhbUlkIH0gZnJvbSAnLi4vdXRpbC5qcyc7XG5pbXBvcnQgeyBnZXRXb3JsZExhenkgfSBmcm9tICcuL2dldC13b3JsZC1sYXp5LmpzJztcbmltcG9ydCB7XG4gIHR5cGUgQ2FuY2VsUnVuT3B0aW9ucyxcbiAgdHlwZSBTdG9wU2xlZXBPcHRpb25zLFxuICB0eXBlIFN0b3BTbGVlcFJlc3VsdCxcbiAgd2FrZVVwUnVuLFxufSBmcm9tICcuL3J1bnMuanMnO1xuXG5jb25zdCBSRVRVUk5fVkFMVUVfUE9MTF9JTlRFUlZBTF9NUyA9IDFfMDAwO1xuY29uc3QgUEFZTE9BRF9URVJNSU5BTF9SVU5fU1RBVFVTRVMgPSBuZXcgU2V0PFdvcmtmbG93UnVuU3RhdHVzPihbXG4gICdjb21wbGV0ZWQnLFxuICAnZmFpbGVkJyxcbl0pO1xuXG4vKiogQGludGVybmFsICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmV0dXJuVmFsdWVQb2xsSW50ZXJ2YWxNcygpOiBudW1iZXIge1xuICByZXR1cm4gZW52TnVtYmVyKFxuICAgICdXT1JLRkxPV19SRVRVUk5fVkFMVUVfUE9MTF9JTlRFUlZBTF9NUycsXG4gICAgUkVUVVJOX1ZBTFVFX1BPTExfSU5URVJWQUxfTVMsXG4gICAgeyBpbnRlZ2VyOiB0cnVlLCBtaW46IDEgfVxuICApO1xufVxuXG4vKipcbiAqIEEgYFJlYWRhYmxlU3RyZWFtYCBleHRlbmRlZCB3aXRoIHdvcmtmbG93LXNwZWNpZmljIGhlbHBlcnMuXG4gKi9cbmV4cG9ydCB0eXBlIFdvcmtmbG93UmVhZGFibGVTdHJlYW08UiA9IGFueT4gPSBSZWFkYWJsZVN0cmVhbTxSPiAmIHtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRhaWwgaW5kZXggKGluZGV4IG9mIHRoZSBsYXN0IGtub3duIGNodW5rLCAwLWJhc2VkKSBvZiB0aGVcbiAgICogdW5kZXJseWluZyB3b3JrZmxvdyBzdHJlYW0uIFVzZWZ1bCBmb3IgcmVzb2x2aW5nIGEgbmVnYXRpdmUgYHN0YXJ0SW5kZXhgXG4gICAqIGludG8gYW4gYWJzb2x1dGUgcG9zaXRpb24g4oCUIGZvciBleGFtcGxlLCB3aGVuIGJ1aWxkaW5nIHJlY29ubmVjdGlvblxuICAgKiBlbmRwb2ludHMgdGhhdCBuZWVkIHRvIGluZm9ybSB0aGUgY2xpZW50IHdoZXJlIHRoZSBzdHJlYW0gc3RhcnRzLlxuICAgKlxuICAgKiBSZXR1cm5zIGAtMWAgd2hlbiBubyBjaHVua3MgaGF2ZSBiZWVuIHdyaXR0ZW4geWV0LlxuICAgKi9cbiAgZ2V0VGFpbEluZGV4KCk6IFByb21pc2U8bnVtYmVyPjtcbn07XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgY29uZmlndXJpbmcgYSB3b3JrZmxvdydzIHJlYWRhYmxlIHN0cmVhbS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd1JlYWRhYmxlU3RyZWFtT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBuYW1lc3BhY2UgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBtdWx0aXBsZSBzdHJlYW1zIGFzc29jaWF0ZWRcbiAgICogd2l0aCB0aGUgc2FtZSB3b3JrZmxvdyBydW4uXG4gICAqL1xuICBuYW1lc3BhY2U/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgaW5kZXggbnVtYmVyIG9mIHRoZSBzdGFydGluZyBjaHVuayB0byBiZWdpbiByZWFkaW5nIHRoZSBzdHJlYW0gZnJvbS5cbiAgICogTmVnYXRpdmUgdmFsdWVzIHN0YXJ0IGZyb20gdGhlIGVuZCAoZS5nLiAtMyByZWFkcyB0aGUgbGFzdCAzIGNodW5rcykuXG4gICAqL1xuICBzdGFydEluZGV4PzogbnVtYmVyO1xuICAvKipcbiAgICogQW55IGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIHRoYXQgbmVlZCB0byBiZSBwZXJmb3JtZWQgYmVmb3JlIHRoZSBleGVjdXRpb25cbiAgICogZW52aXJvbm1lbnQgaXMgcGF1c2VkIC8gdGVybWluYXRlZFxuICAgKiAoaS5lLiB1c2luZyBbYHdhaXRVbnRpbCgpYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvQVBJL0V4dGVuZGFibGVFdmVudC93YWl0VW50aWwpIG9yIHNpbWlsYXIpLlxuICAgKi9cbiAgb3BzPzogUHJvbWlzZTxhbnk+W107XG4gIC8qKlxuICAgKiBUaGUgZ2xvYmFsIG9iamVjdCB0byB1c2UgZm9yIGh5ZHJhdGluZyB0eXBlcyBmcm9tIHRoZSBnbG9iYWwgc2NvcGUuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIHtAbGluayBbYGdsb2JhbFRoaXNgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9nbG9iYWxUaGlzKX0uXG4gICAqL1xuICBnbG9iYWw/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG4vKipcbiAqIEEgaGFuZGxlciBjbGFzcyBmb3IgYSB3b3JrZmxvdyBydW4uXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW48VFJlc3VsdD4ge1xuICBzdGF0aWMgW1dPUktGTE9XX1NFUklBTElaRV0oaW5zdGFuY2U6IFJ1bjx1bmtub3duPikge1xuICAgIHJldHVybiB7IHJ1bklkOiBpbnN0YW5jZS5ydW5JZCwgcmVzaWxpZW50U3RhcnQ6IGluc3RhbmNlLiNyZXNpbGllbnRTdGFydCB9O1xuICB9XG5cbiAgc3RhdGljIFtXT1JLRkxPV19ERVNFUklBTElaRV0oZGF0YToge1xuICAgIHJ1bklkOiBzdHJpbmc7XG4gICAgcmVzaWxpZW50U3RhcnQ/OiBib29sZWFuO1xuICB9KSB7XG4gICAgcmV0dXJuIG5ldyBSdW4oZGF0YS5ydW5JZCwgeyByZXNpbGllbnRTdGFydDogZGF0YS5yZXNpbGllbnRTdGFydCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIHdvcmtmbG93IHJ1bi5cbiAgICovXG4gIHJ1bklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB3b3JsZCBvYmplY3QuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgI3dvcmxkUHJvbWlzZTogUHJvbWlzZTxXb3JsZD4gfCB1bmRlZmluZWQ7XG4gIGdldCAjbGF6eVdvcmxkUHJvbWlzZSgpIHtcbiAgICBpZiAoIXRoaXMuI3dvcmxkUHJvbWlzZSkgdGhpcy4jd29ybGRQcm9taXNlID0gZ2V0V29ybGRMYXp5KCk7XG4gICAgcmV0dXJuIHRoaXMuI3dvcmxkUHJvbWlzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWNoZWQgZW5jcnlwdGlvbiBrZXkgcmVzb2x1dGlvbi4gUmVzb2x2ZWQgb25jZSBvbiBmaXJzdCB1c2UgYW5kXG4gICAqIHJldXNlZCBmb3IgcmV0dXJuVmFsdWUsIGdldFJlYWRhYmxlKCksIGV0Yy5cbiAgICogQGludGVybmFsXG4gICAqL1xuICAjZW5jcnlwdGlvbktleVByb21pc2U6IFByb21pc2U8UGF5bG9hZEtleSB8IHVuZGVmaW5lZD4gfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogV2hlbiB0cnVlLCBydW5fY3JlYXRlZCBmYWlsZWQgYW5kIHRoZSBydW4gbWF5IG5vdCBleGlzdCB5ZXQgKHRoZVxuICAgKiByZXNpbGllbnQgc3RhcnQgcGF0aCB3aWxsIGNyZWF0ZSBpdCB2aWEgcnVuX3N0YXJ0ZWQpLiBwb2xsUmV0dXJuVmFsdWVcbiAgICogcmV0cmllcyBvbiBXb3JrZmxvd1J1bk5vdEZvdW5kRXJyb3Igb25seSB3aGVuIHRoaXMgZmxhZyBpcyBzZXQgc29cbiAgICogdGhhdCBub3JtYWwgcnVucyBmYWlsIGZhc3Qgb24gNDA0LlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gICNyZXNpbGllbnRTdGFydCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHJ1bklkOiBzdHJpbmcsIG9wdHM/OiB7IHJlc2lsaWVudFN0YXJ0PzogYm9vbGVhbiB9KSB7XG4gICAgdGhpcy5ydW5JZCA9IHJ1bklkO1xuICAgIHRoaXMuI3Jlc2lsaWVudFN0YXJ0ID0gb3B0cz8ucmVzaWxpZW50U3RhcnQgPz8gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYW5kIGNhY2hlcyB0aGUgZW5jcnlwdGlvbiBrZXkgZm9yIHRoaXMgcnVuLlxuICAgKiBUaGUga2V5IGlzIHRoZSBzYW1lIGZvciB0aGUgbGlmZXRpbWUgb2YgYSBydW4sIHNvIGl0IG9ubHkgbmVlZHNcbiAgICogdG8gYmUgcmVzb2x2ZWQgb25jZS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICAjZ2V0RW5jcnlwdGlvbktleShydW4/OiBXb3JrZmxvd1J1bik6IFByb21pc2U8UGF5bG9hZEtleSB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghdGhpcy4jZW5jcnlwdGlvbktleVByb21pc2UpIHtcbiAgICAgIHRoaXMuI2VuY3J5cHRpb25LZXlQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgd29ybGQgPSBhd2FpdCB0aGlzLiNsYXp5V29ybGRQcm9taXNlO1xuICAgICAgICBjb25zdCBydW5EYXRhID0gcnVuID8/IChhd2FpdCB3b3JsZC5ydW5zLmdldCh0aGlzLnJ1bklkKSk7XG4gICAgICAgIGNvbnN0IHJhd0tleSA9IGF3YWl0IHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4/LihydW5EYXRhKTtcbiAgICAgICAgcmV0dXJuIHJhd0tleSA/IGF3YWl0IGRlcml2ZVJ1blBheWxvYWRLZXlzKHJhd0tleSkgOiB1bmRlZmluZWQ7XG4gICAgICB9KSgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy4jZW5jcnlwdGlvbktleVByb21pc2U7XG4gIH1cblxuICAvKipcbiAgICogRGVmZXIgZmV0Y2hpbmcgdGhlIHJ1biBhbmQgaXRzIGVuY3J5cHRpb24ga2V5IHVudGlsIHNlcmlhbGl6ZWQgc3RyZWFtIGRhdGFcbiAgICogaXMgYWN0dWFsbHkgcmVhZC4gQW4gZW1wdHkgb3IgbWV0YWRhdGEtb25seSBzdHJlYW0gbXVzdCBub3Qgc3RhcnQgYW5cbiAgICogdW5vYnNlcnZlZCBydW4gbG9va3VwLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gICNnZXRFbmNyeXB0aW9uS2V5TGF6aWx5KCk6ICgpID0+IFByb21pc2U8UGF5bG9hZEtleSB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiAoKSA9PiB0aGlzLiNnZXRFbmNyeXB0aW9uS2V5KCk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJydXB0cyBwZW5kaW5nIGBzbGVlcCgpYCBjYWxscywgcmVzdW1pbmcgdGhlIHdvcmtmbG93IGVhcmx5LlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHNldHRpbmdzIHRvIHRhcmdldCBzcGVjaWZpYyBzbGVlcCBjYWxscyBieSBjb3JyZWxhdGlvbiBJRC5cbiAgICogICBJZiBub3QgcHJvdmlkZWQsIGFsbCBwZW5kaW5nIHNsZWVwIGNhbGxzIHdpbGwgYmUgaW50ZXJydXB0ZWQuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFN0b3BTbGVlcFJlc3VsdH0gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIG51bWJlciBvZiBzbGVlcCBjYWxscyB0aGF0IHdlcmUgaW50ZXJydXB0ZWQuXG4gICAqL1xuICBhc3luYyB3YWtlVXAob3B0aW9ucz86IFN0b3BTbGVlcE9wdGlvbnMpOiBQcm9taXNlPFN0b3BTbGVlcFJlc3VsdD4ge1xuICAgICd1c2Ugc3RlcCc7XG4gICAgcmV0dXJuIHdha2VVcFJ1bihhd2FpdCB0aGlzLiNsYXp5V29ybGRQcm9taXNlLCB0aGlzLnJ1bklkLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWxzIHRoZSB3b3JrZmxvdyBydW4uXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgY2FuY2VsbGF0aW9uIHNldHRpbmdzLiBgY2FuY2VsUmVhc29uYCByZWNvcmRzIGFcbiAgICogICBmcmVlLXRleHQgcmVhc29uIChtYXggNTEyIGNoYXJzKSBvbiB0aGUgcnVuX2NhbmNlbGxlZCBldmVudCwgc3VyZmFjZWQgaW5cbiAgICogICB0aGUgcnVuIGRldGFpbCB2aWV3LlxuICAgKi9cbiAgYXN5bmMgY2FuY2VsKG9wdGlvbnM/OiBDYW5jZWxSdW5PcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgJ3VzZSBzdGVwJztcbiAgICBjb25zdCB3b3JsZCA9IGF3YWl0IHRoaXMuI2xhenlXb3JsZFByb21pc2U7XG4gICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZSh0aGlzLnJ1bklkLCB7XG4gICAgICBldmVudFR5cGU6ICdydW5fY2FuY2VsbGVkJyxcbiAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgIC4uLihvcHRpb25zPy5jYW5jZWxSZWFzb24gIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHsgZXZlbnREYXRhOiB7IGNhbmNlbFJlYXNvbjogb3B0aW9ucy5jYW5jZWxSZWFzb24gfSB9XG4gICAgICAgIDoge30pLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHdvcmtmbG93IHJ1biBleGlzdHMuXG4gICAqL1xuICBnZXQgZXhpc3RzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICd1c2Ugc3RlcCc7XG4gICAgcmV0dXJuIHRoaXMuI2xhenlXb3JsZFByb21pc2UudGhlbigod29ybGQpID0+XG4gICAgICB3b3JsZC5ydW5zXG4gICAgICAgIC5nZXQodGhpcy5ydW5JZCwgeyByZXNvbHZlRGF0YTogJ25vbmUnIH0pXG4gICAgICAgIC50aGVuKCgpID0+IHRydWUpXG4gICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAoV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yLmlzKGVycm9yKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzdGF0dXMgb2YgdGhlIHdvcmtmbG93IHJ1bi5cbiAgICovXG4gIGdldCBzdGF0dXMoKTogUHJvbWlzZTxXb3JrZmxvd1J1blN0YXR1cz4ge1xuICAgICd1c2Ugc3RlcCc7XG4gICAgcmV0dXJuIHRoaXMuI2xhenlXb3JsZFByb21pc2UudGhlbigod29ybGQpID0+XG4gICAgICB3b3JsZC5ydW5zXG4gICAgICAgIC5nZXQodGhpcy5ydW5JZCwgeyByZXNvbHZlRGF0YTogJ25vbmUnIH0pXG4gICAgICAgIC50aGVuKChydW4pID0+IHJ1bi5zdGF0dXMpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSB3b3JrZmxvdyBydW4uXG4gICAqIFBvbGxzIHRoZSB3b3JrZmxvdyByZXR1cm4gdmFsdWUgdW50aWwgaXQgaXMgY29tcGxldGVkLlxuICAgKi9cbiAgZ2V0IHJldHVyblZhbHVlKCk6IFByb21pc2U8VFJlc3VsdD4ge1xuICAgICd1c2Ugc3RlcCc7XG4gICAgcmV0dXJuIHRoaXMuI3BvbGxSZXR1cm5WYWx1ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSB3b3JrZmxvdy5cbiAgICovXG4gIGdldCB3b3JrZmxvd05hbWUoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAndXNlIHN0ZXAnO1xuICAgIHJldHVybiB0aGlzLiNsYXp5V29ybGRQcm9taXNlLnRoZW4oKHdvcmxkKSA9PlxuICAgICAgd29ybGQucnVucy5nZXQodGhpcy5ydW5JZCkudGhlbigocnVuKSA9PiBydW4ud29ya2Zsb3dOYW1lKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRpbWVzdGFtcCB3aGVuIHRoZSB3b3JrZmxvdyBydW4gd2FzIGNyZWF0ZWQuXG4gICAqL1xuICBnZXQgY3JlYXRlZEF0KCk6IFByb21pc2U8RGF0ZT4ge1xuICAgICd1c2Ugc3RlcCc7XG4gICAgcmV0dXJuIHRoaXMuI2xhenlXb3JsZFByb21pc2UudGhlbigod29ybGQpID0+XG4gICAgICB3b3JsZC5ydW5zLmdldCh0aGlzLnJ1bklkKS50aGVuKChydW4pID0+IHJ1bi5jcmVhdGVkQXQpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdGltZXN0YW1wIHdoZW4gdGhlIHdvcmtmbG93IHJ1biBzdGFydGVkIGV4ZWN1dGlvbi5cbiAgICogUmV0dXJucyB1bmRlZmluZWQgaWYgdGhlIHdvcmtmbG93IGhhcyBub3Qgc3RhcnRlZCB5ZXQuXG4gICAqL1xuICBnZXQgc3RhcnRlZEF0KCk6IFByb21pc2U8RGF0ZSB8IHVuZGVmaW5lZD4ge1xuICAgICd1c2Ugc3RlcCc7XG4gICAgcmV0dXJuIHRoaXMuI2xhenlXb3JsZFByb21pc2UudGhlbigod29ybGQpID0+XG4gICAgICB3b3JsZC5ydW5zLmdldCh0aGlzLnJ1bklkKS50aGVuKChydW4pID0+IHJ1bi5zdGFydGVkQXQpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdGltZXN0YW1wIHdoZW4gdGhlIHdvcmtmbG93IHJ1biBjb21wbGV0ZWQuXG4gICAqIFJldHVybnMgdW5kZWZpbmVkIGlmIHRoZSB3b3JrZmxvdyBoYXMgbm90IGNvbXBsZXRlZCB5ZXQuXG4gICAqL1xuICBnZXQgY29tcGxldGVkQXQoKTogUHJvbWlzZTxEYXRlIHwgdW5kZWZpbmVkPiB7XG4gICAgJ3VzZSBzdGVwJztcbiAgICByZXR1cm4gdGhpcy4jbGF6eVdvcmxkUHJvbWlzZS50aGVuKCh3b3JsZCkgPT5cbiAgICAgIHdvcmxkLnJ1bnMuZ2V0KHRoaXMucnVuSWQpLnRoZW4oKHJ1bikgPT4gcnVuLmNvbXBsZXRlZEF0KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJlYWRhYmxlIHN0cmVhbSBvZiB0aGUgd29ya2Zsb3cgcnVuLlxuICAgKi9cbiAgZ2V0IHJlYWRhYmxlKCk6IFdvcmtmbG93UmVhZGFibGVTdHJlYW0ge1xuICAgIHJldHVybiB0aGlzLmdldFJlYWRhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSB3b3JrZmxvdyBydW4ncyBkZWZhdWx0IHJlYWRhYmxlIHN0cmVhbSwgd2hpY2ggcmVhZHMgY2h1bmtzXG4gICAqIHdyaXR0ZW4gdG8gdGhlIGNvcnJlc3BvbmRpbmcgd3JpdGFibGUgc3RyZWFtIHtAbGluayBnZXRXcml0YWJsZX0uXG4gICAqXG4gICAqIFRoZSByZXR1cm5lZCBzdHJlYW0gaGFzIGFuIGFkZGl0aW9uYWwge0BsaW5rIFdvcmtmbG93UmVhZGFibGVTdHJlYW0uZ2V0VGFpbEluZGV4IHwgZ2V0VGFpbEluZGV4KCl9XG4gICAqIGhlbHBlciB0aGF0IHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGtub3duIGNodW5rLiBUaGlzIGlzIHVzZWZ1bCB3aGVuXG4gICAqIGJ1aWxkaW5nIHJlY29ubmVjdGlvbiBlbmRwb2ludHMgdGhhdCBuZWVkIHRvIGluZm9ybSBjbGllbnRzIHdoZXJlIHRoZVxuICAgKiBzdHJlYW0gc3RhcnRzLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgcmVhZGFibGUgc3RyZWFtLlxuICAgKiBAcmV0dXJucyBBIGBXb3JrZmxvd1JlYWRhYmxlU3RyZWFtYCBmb3IgdGhlIHdvcmtmbG93IHJ1bi5cbiAgICovXG4gIGdldFJlYWRhYmxlPFIgPSBhbnk+KFxuICAgIG9wdGlvbnM6IFdvcmtmbG93UmVhZGFibGVTdHJlYW1PcHRpb25zID0ge31cbiAgKTogV29ya2Zsb3dSZWFkYWJsZVN0cmVhbTxSPiB7XG4gICAgJ3VzZSBzdGVwJztcbiAgICBjb25zdCB7IG9wcyA9IFtdLCBnbG9iYWwgPSBnbG9iYWxUaGlzLCBzdGFydEluZGV4LCBuYW1lc3BhY2UgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgbmFtZSA9IGdldFdvcmtmbG93UnVuU3RyZWFtSWQodGhpcy5ydW5JZCwgbmFtZXNwYWNlKTtcbiAgICAvLyBUaGUgcmVzb2x2ZXIgc3RhcnRzIG9ubHkgd2hlbiB0aGUgZGVzZXJpYWxpemUgc3RyZWFtIHNlZXMgaXRzIGZpcnN0XG4gICAgLy8gY2h1bmssIHNvIGNyZWF0aW5nIG9yIHByb2JpbmcgYW4gZW1wdHkgc3RyZWFtIGNhbm5vdCByZWplY3QgaW4gdGhlXG4gICAgLy8gYmFja2dyb3VuZC5cbiAgICBjb25zdCBlbmNyeXB0aW9uS2V5ID0gdGhpcy4jZ2V0RW5jcnlwdGlvbktleUxhemlseSgpO1xuICAgIGNvbnN0IHN0cmVhbSA9IGdldEV4dGVybmFsUmV2aXZlcnMoZ2xvYmFsLCBvcHMsIHRoaXMucnVuSWQsIGVuY3J5cHRpb25LZXkpXG4gICAgICAuUmVhZGFibGVTdHJlYW0hKHtcbiAgICAgIG5hbWUsXG4gICAgICBzdGFydEluZGV4LFxuICAgIH0pIGFzIFJlYWRhYmxlU3RyZWFtPFI+O1xuXG4gICAgY29uc3Qgd29ybGRQcm9taXNlID0gdGhpcy4jbGF6eVdvcmxkUHJvbWlzZTtcbiAgICBjb25zdCBydW5JZCA9IHRoaXMucnVuSWQ7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oc3RyZWFtLCB7XG4gICAgICBnZXRUYWlsSW5kZXg6IGFzeW5jICgpOiBQcm9taXNlPG51bWJlcj4gPT4ge1xuICAgICAgICBjb25zdCB3b3JsZCA9IGF3YWl0IHdvcmxkUHJvbWlzZTtcbiAgICAgICAgY29uc3QgaW5mbyA9IGF3YWl0IHdvcmxkLnN0cmVhbXMuZ2V0SW5mbyhydW5JZCwgbmFtZSk7XG4gICAgICAgIHJldHVybiBpbmZvLnRhaWxJbmRleDtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGFzeW5jICNyZXNvbHZlVGVybWluYWxSZXR1cm5WYWx1ZShydW46IFdvcmtmbG93UnVuKTogUHJvbWlzZTxUUmVzdWx0PiB7XG4gICAgaWYgKHJ1bi5zdGF0dXMgPT09ICdjb21wbGV0ZWQnKSB7XG4gICAgICBjb25zdCBlbmNyeXB0aW9uS2V5ID0gYXdhaXQgdGhpcy4jZ2V0RW5jcnlwdGlvbktleShydW4pO1xuICAgICAgcmV0dXJuIGF3YWl0IGh5ZHJhdGVXb3JrZmxvd1JldHVyblZhbHVlKFxuICAgICAgICBydW4ub3V0cHV0LFxuICAgICAgICB0aGlzLnJ1bklkLFxuICAgICAgICBlbmNyeXB0aW9uS2V5XG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChydW4uc3RhdHVzID09PSAnY2FuY2VsbGVkJykge1xuICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVuQ2FuY2VsbGVkRXJyb3IodGhpcy5ydW5JZCk7XG4gICAgfVxuXG4gICAgaWYgKHJ1bi5zdGF0dXMgPT09ICdmYWlsZWQnKSB7XG4gICAgICAvLyBIeWRyYXRlIHRoZSBzZXJpYWxpemVkIHJ1biBlcnJvciBzbyB0aGUgb3JpZ2luYWwgdGhyb3duIHZhbHVlXG4gICAgICAvLyAod2l0aCBpdHMgdHlwZSBpZGVudGl0eSwgY2F1c2UgY2hhaW4sIGV0Yy4pIGlzIHNldCBhcyB0aGVcbiAgICAgIC8vIGBjYXVzZWAgb24gV29ya2Zsb3dSdW5GYWlsZWRFcnJvci5cbiAgICAgIGNvbnN0IGVuY3J5cHRpb25LZXkgPSBhd2FpdCB0aGlzLiNnZXRFbmNyeXB0aW9uS2V5KHJ1bik7XG4gICAgICBsZXQgaHlkcmF0ZWRFcnJvcjogdW5rbm93bjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGh5ZHJhdGVkRXJyb3IgPSBhd2FpdCBoeWRyYXRlUnVuRXJyb3IoXG4gICAgICAgICAgcnVuLmVycm9yLFxuICAgICAgICAgIHRoaXMucnVuSWQsXG4gICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIElmIGh5ZHJhdGlvbiBmYWlscywgc3VyZmFjZSBhIGdlbmVyaWMgZmFsbGJhY2sgcmF0aGVyIHRoYW5cbiAgICAgICAgLy8gbGVhdmluZyB0aGUgdXNlciB3aXRoIGEgcmF3IFVpbnQ4QXJyYXkuIFRoZSBydW4ncyBlcnJvckNvZGVcbiAgICAgICAgLy8gaXMgc3RpbGwgcHJlc2VydmVkIG9uIHRoZSB0aHJvd24gV29ya2Zsb3dSdW5GYWlsZWRFcnJvci5cbiAgICAgICAgaHlkcmF0ZWRFcnJvciA9IG5ldyBFcnJvcignRmFpbGVkIHRvIGh5ZHJhdGUgd29ya2Zsb3cgcnVuIGVycm9yJyk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW5GYWlsZWRFcnJvcih0aGlzLnJ1bklkLCBoeWRyYXRlZEVycm9yLCB7XG4gICAgICAgIGVycm9yQ29kZTogcnVuLmVycm9yQ29kZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFRlcm1pbmFsIHN0YXR1c2VzIGFyZSBpbW11dGFibGUsIGJ1dCBpZiBhbiBpbmNvbnNpc3RlbnQgd29ybGQgcmV0dXJuc1xuICAgIC8vIGEgbm9uLXRlcm1pbmFsIGZ1bGwgcmVjb3JkLCByZXN1bWUgcG9sbGluZyBzYWZlbHkuXG4gICAgdGhyb3cgbmV3IFdvcmtmbG93UnVuTm90Q29tcGxldGVkRXJyb3IodGhpcy5ydW5JZCwgcnVuLnN0YXR1cyk7XG4gIH1cblxuICAvKipcbiAgICogUG9sbHMgdGhlIHdvcmtmbG93IHJldHVybiB2YWx1ZSB1bnRpbCBpdCBpcyBjb21wbGV0ZWQuXG4gICAqIEBpbnRlcm5hbFxuICAgKiBAcmV0dXJucyBUaGUgd29ya2Zsb3cgcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgYXN5bmMgI3BvbGxSZXR1cm5WYWx1ZSgpOiBQcm9taXNlPFRSZXN1bHQ+IHtcbiAgICBjb25zdCB3b3JsZCA9IGF3YWl0IHRoaXMuI2xhenlXb3JsZFByb21pc2U7XG5cbiAgICAvLyBXaGVuIHJlc2lsaWVudFN0YXJ0IGlzIHRydWUsIHJ1bl9jcmVhdGVkIGZhaWxlZCBhbmQgdGhlIHJ1biBtYXlcbiAgICAvLyBub3QgZXhpc3QgeWV0LiBSZXRyeSBvbiBXb3JrZmxvd1J1bk5vdEZvdW5kRXJyb3IgdXAgdG8gMyB0aW1lc1xuICAgIC8vICgxcyArIDNzICsgNnMgPSAxMHMgdG90YWwpIHRvIGdpdmUgdGhlIHF1ZXVlIHRpbWUgdG8gZGVsaXZlclxuICAgIC8vIGFuZCB0aGUgcnVudGltZSB0byBjcmVhdGUgdGhlIHJ1biB2aWEgcnVuX3N0YXJ0ZWQuXG4gICAgLy8gV2hlbiByZXNpbGllbnRTdGFydCBpcyBmYWxzZSwgNDA0IGlzIGEgcmVhbCBlcnJvciDigJQgZmFpbCBmYXN0LlxuICAgIGxldCBub3RGb3VuZFJldHJpZXMgPSAwO1xuICAgIGNvbnN0IE5PVF9GT1VORF9NQVhfUkVUUklFUyA9IHRoaXMuI3Jlc2lsaWVudFN0YXJ0ID8gMyA6IDA7XG4gICAgY29uc3QgTk9UX0ZPVU5EX0RFTEFZUyA9IFsxXzAwMCwgM18wMDAsIDZfMDAwXTtcblxuICAgIC8vIE5PVEU6IHdoZW4gdGhpcyBwb2xsIHJ1bnMgaW5zaWRlIGEgc3RlcCAoZS5nLiB0aGUgc3RlcCB0aGF0IGEgcGFyZW50XG4gICAgLy8gd29ya2Zsb3cgdXNlcyB0byBhd2FpdCBhIGNoaWxkIHdvcmtmbG93J3MgYHJldHVyblZhbHVlYCksIGl0IGJsb2Nrc1xuICAgIC8vIGEgcXVldWUgd29ya2VyIHNsb3QgZm9yIGFzIGxvbmcgYXMgdGhlIGNoaWxkIHJ1biB0YWtlcyB0byBmaW5pc2guXG4gICAgLy8gV29ya2VyLWJhc2VkIHdvcmxkcyBsaWtlIGB3b3JsZC1wb3N0Z3Jlc2AgbXVzdCBiZSBzaXplZCB0byBjb3ZlciB0aGVcbiAgICAvLyBwZWFrIG51bWJlciBvZiBzdWNoIHBvbGxzIGluIGZsaWdodCDigJQgc2VlIHRoZSBgcXVldWVDb25jdXJyZW5jeWBcbiAgICAvLyBkZWZhdWx0IG9uIHRoZSBQb3N0Z3JlcyB3b3JsZCBhbmQgdGhlIG5vdGVzIGluIHRoZSBlYWdlci1wcm9jZXNzaW5nXG4gICAgLy8gY2hhbmdlbG9nIGZvciBkZXRhaWxzLlxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBydW5NZXRhZGF0YSA9IGF3YWl0IHdvcmxkLnJ1bnMuZ2V0KHRoaXMucnVuSWQsIHtcbiAgICAgICAgICByZXNvbHZlRGF0YTogJ25vbmUnLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocnVuTWV0YWRhdGEuc3RhdHVzID09PSAnY2FuY2VsbGVkJykge1xuICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bkNhbmNlbGxlZEVycm9yKHRoaXMucnVuSWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFBBWUxPQURfVEVSTUlOQUxfUlVOX1NUQVRVU0VTLmhhcyhydW5NZXRhZGF0YS5zdGF0dXMpKSB7XG4gICAgICAgICAgLy8gVGhlIHBvbGxpbmcgcmVhZCBhYm92ZSBkZWxpYmVyYXRlbHkgc2tpcHMgaW5wdXQvb3V0cHV0L2Vycm9yIHJlZnMuXG4gICAgICAgICAgLy8gUmVzb2x2ZSBwYXlsb2FkcyBvbmx5IG9uY2UgdGhlIHJ1biByZWFjaGVzIGEgdGVybWluYWwgc3RhdGUuXG4gICAgICAgICAgY29uc3QgcnVuID0gYXdhaXQgd29ybGQucnVucy5nZXQodGhpcy5ydW5JZCwge1xuICAgICAgICAgICAgcmVzb2x2ZURhdGE6ICdhbGwnLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNyZXNvbHZlVGVybWluYWxSZXR1cm5WYWx1ZShydW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUnVuIG5vdCBjb21wbGV0ZWQgeWV0IOKAlCBzbGVlcCBhbmQgcG9sbCBhZ2Fpbi5cbiAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVuTm90Q29tcGxldGVkRXJyb3IodGhpcy5ydW5JZCwgcnVuTWV0YWRhdGEuc3RhdHVzKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChXb3JrZmxvd1J1bk5vdENvbXBsZXRlZEVycm9yLmlzKGVycm9yKSkge1xuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PlxuICAgICAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBnZXRSZXR1cm5WYWx1ZVBvbGxJbnRlcnZhbE1zKCkpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yLmlzKGVycm9yKSAmJlxuICAgICAgICAgIG5vdEZvdW5kUmV0cmllcyA8IE5PVF9GT1VORF9NQVhfUkVUUklFU1xuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBkZWxheSA9IE5PVF9GT1VORF9ERUxBWVNbbm90Rm91bmRSZXRyaWVzXSE7XG4gICAgICAgICAgbm90Rm91bmRSZXRyaWVzKys7XG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgZGVsYXkpKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgYSBgUnVuYCBvYmplY3QgZm9yIGEgZ2l2ZW4gcnVuIElELlxuICpcbiAqIEBwYXJhbSBydW5JZCAtIFRoZSB3b3JrZmxvdyBydW4gSUQgb2J0YWluZWQgZnJvbSB7QGxpbmsgc3RhcnR9LlxuICogQHJldHVybnMgQSBgUnVuYCBvYmplY3QuXG4gKiBAdGhyb3dzIFdvcmtmbG93UnVuTm90Rm91bmRFcnJvciBpZiB0aGUgcnVuIElEIGlzIG5vdCBmb3VuZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJ1bjxUUmVzdWx0PihydW5JZDogc3RyaW5nKTogUnVuPFRSZXN1bHQ+IHtcbiAgcmV0dXJuIG5ldyBSdW4ocnVuSWQpO1xufVxuIl19
|