@workflow/core 5.0.0-beta.5 → 5.0.0-beta.51
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/README.md +5 -0
- package/dist/attribute-changes.d.ts +5 -0
- package/dist/attribute-changes.d.ts.map +1 -0
- package/dist/attribute-changes.js +25 -0
- package/dist/capabilities.d.ts +35 -2
- package/dist/capabilities.d.ts.map +1 -1
- package/dist/capabilities.js +74 -5
- package/dist/capture-stack.d.ts +1 -1
- package/dist/capture-stack.js +2 -2
- package/dist/class-serialization.d.ts +32 -0
- package/dist/class-serialization.d.ts.map +1 -1
- package/dist/class-serialization.js +37 -1
- package/dist/classify-error.d.ts +19 -3
- package/dist/classify-error.d.ts.map +1 -1
- package/dist/classify-error.js +98 -6
- package/dist/context-violation-error.d.ts +5 -5
- package/dist/context-violation-error.d.ts.map +1 -1
- package/dist/context-violation-error.js +8 -6
- package/dist/create-hook.d.ts +72 -7
- package/dist/create-hook.d.ts.map +1 -1
- package/dist/create-hook.js +1 -1
- package/dist/define-hook.js +2 -2
- package/dist/describe-error.d.ts +7 -7
- package/dist/describe-error.d.ts.map +1 -1
- package/dist/describe-error.js +97 -12
- package/dist/encryption.d.ts +38 -4
- package/dist/encryption.d.ts.map +1 -1
- package/dist/encryption.js +96 -14
- package/dist/events-consumer.d.ts +297 -0
- package/dist/events-consumer.d.ts.map +1 -1
- package/dist/events-consumer.js +673 -42
- package/dist/flushable-stream.d.ts +97 -1
- package/dist/flushable-stream.d.ts.map +1 -1
- package/dist/flushable-stream.js +291 -11
- package/dist/global.d.ts +36 -2
- package/dist/global.d.ts.map +1 -1
- package/dist/global.js +21 -6
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/log-format.d.ts +2 -2
- package/dist/log-format.js +19 -12
- package/dist/logger.d.ts +1 -0
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +10 -6
- package/dist/private.d.ts +226 -9
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +626 -7
- package/dist/replay-divergence.d.ts +25 -0
- package/dist/replay-divergence.d.ts.map +1 -0
- package/dist/replay-divergence.js +61 -0
- package/dist/replay-payload-cache.d.ts +64 -0
- package/dist/replay-payload-cache.d.ts.map +1 -0
- package/dist/replay-payload-cache.js +158 -0
- package/dist/runtime/compute-instance.d.ts +13 -0
- package/dist/runtime/compute-instance.d.ts.map +1 -0
- package/dist/runtime/compute-instance.js +14 -0
- package/dist/runtime/constants.d.ts +315 -0
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +502 -16
- 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/deployment-guard.d.ts +99 -0
- package/dist/runtime/deployment-guard.d.ts.map +1 -0
- package/dist/runtime/deployment-guard.js +154 -0
- package/dist/runtime/get-port-lazy.d.ts +15 -0
- package/dist/runtime/get-port-lazy.d.ts.map +1 -1
- package/dist/runtime/get-port-lazy.js +75 -6
- package/dist/runtime/get-world-lazy.d.ts +5 -14
- package/dist/runtime/get-world-lazy.d.ts.map +1 -1
- package/dist/runtime/get-world-lazy.js +19 -29
- package/dist/runtime/helpers.d.ts +415 -29
- package/dist/runtime/helpers.d.ts.map +1 -1
- package/dist/runtime/helpers.js +686 -57
- package/dist/runtime/quickjs-assets.generated.d.ts +14 -0
- package/dist/runtime/quickjs-assets.generated.d.ts.map +1 -0
- package/dist/runtime/quickjs-assets.generated.js +30 -0
- package/dist/runtime/quickjs-entrypoint.d.ts +158 -0
- package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -0
- package/dist/runtime/quickjs-entrypoint.js +1863 -0
- package/dist/runtime/quickjs-log-view.d.ts +129 -0
- package/dist/runtime/quickjs-log-view.d.ts.map +1 -0
- package/dist/runtime/quickjs-log-view.js +229 -0
- package/dist/runtime/quickjs-runtime.d.ts +244 -0
- package/dist/runtime/quickjs-runtime.d.ts.map +1 -0
- package/dist/runtime/quickjs-runtime.js +2427 -0
- package/dist/runtime/quickjs-serde.d.ts +107 -0
- package/dist/runtime/quickjs-serde.d.ts.map +1 -0
- package/dist/runtime/quickjs-serde.js +2159 -0
- package/dist/runtime/replay-budget.d.ts +97 -0
- package/dist/runtime/replay-budget.d.ts.map +1 -0
- package/dist/runtime/replay-budget.js +139 -0
- package/dist/runtime/replay-recovery-reporter.d.ts +36 -0
- package/dist/runtime/replay-recovery-reporter.d.ts.map +1 -0
- package/dist/runtime/replay-recovery-reporter.js +64 -0
- package/dist/runtime/resume-hook.d.ts +91 -8
- package/dist/runtime/resume-hook.d.ts.map +1 -1
- package/dist/runtime/resume-hook.js +512 -89
- package/dist/runtime/resume-latency.d.ts +150 -0
- package/dist/runtime/resume-latency.d.ts.map +1 -0
- package/dist/runtime/resume-latency.js +155 -0
- package/dist/runtime/run-id-time.d.ts +19 -0
- package/dist/runtime/run-id-time.d.ts.map +1 -0
- package/dist/runtime/run-id-time.js +42 -0
- package/dist/runtime/run.d.ts +72 -7
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +280 -53
- package/dist/runtime/runs.d.ts +54 -3
- package/dist/runtime/runs.d.ts.map +1 -1
- package/dist/runtime/runs.js +126 -16
- package/dist/runtime/start.d.ts +101 -2
- package/dist/runtime/start.d.ts.map +1 -1
- package/dist/runtime/start.js +352 -61
- package/dist/runtime/step-executor.d.ts +186 -5
- package/dist/runtime/step-executor.d.ts.map +1 -1
- package/dist/runtime/step-executor.js +768 -130
- package/dist/runtime/step-latency.d.ts +220 -0
- package/dist/runtime/step-latency.d.ts.map +1 -0
- package/dist/runtime/step-latency.js +215 -0
- package/dist/runtime/step-ownership.d.ts +72 -0
- package/dist/runtime/step-ownership.d.ts.map +1 -0
- package/dist/runtime/step-ownership.js +114 -0
- package/dist/runtime/step-single-flight.d.ts +12 -0
- package/dist/runtime/step-single-flight.d.ts.map +1 -0
- package/dist/runtime/step-single-flight.js +75 -0
- package/dist/runtime/suspension-handler.d.ts +247 -7
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +1304 -125
- package/dist/runtime/unserializable-step.d.ts +34 -0
- package/dist/runtime/unserializable-step.d.ts.map +1 -0
- package/dist/runtime/unserializable-step.js +52 -0
- package/dist/runtime/vm-mode.d.ts +44 -0
- package/dist/runtime/vm-mode.d.ts.map +1 -0
- package/dist/runtime/vm-mode.js +62 -0
- package/dist/runtime/vm-serde-bundle.generated.d.ts +14 -0
- package/dist/runtime/vm-serde-bundle.generated.d.ts.map +1 -0
- package/dist/runtime/vm-serde-bundle.generated.js +16 -0
- package/dist/runtime/wait-continuation.d.ts +106 -0
- package/dist/runtime/wait-continuation.d.ts.map +1 -0
- package/dist/runtime/wait-continuation.js +136 -0
- package/dist/runtime/wait-until.d.ts +18 -0
- package/dist/runtime/wait-until.d.ts.map +1 -0
- package/dist/runtime/wait-until.js +42 -0
- package/dist/runtime/world-compatibility.d.ts +32 -0
- package/dist/runtime/world-compatibility.d.ts.map +1 -0
- package/dist/runtime/world-compatibility.js +44 -0
- package/dist/runtime/world-init.d.ts +17 -42
- package/dist/runtime/world-init.d.ts.map +1 -1
- package/dist/runtime/world-init.js +18 -43
- package/dist/runtime/world.d.ts +14 -2
- package/dist/runtime/world.d.ts.map +1 -1
- package/dist/runtime/world.js +75 -19
- package/dist/runtime.d.ts +10 -6
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +3911 -489
- 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 +8 -4
- package/dist/serialization/codec-devalue-vm.d.ts +16 -0
- package/dist/serialization/codec-devalue-vm.d.ts.map +1 -0
- package/dist/serialization/codec-devalue-vm.js +148 -0
- package/dist/serialization/codec-devalue.d.ts +1 -1
- package/dist/serialization/codec-devalue.d.ts.map +1 -1
- package/dist/serialization/codec-devalue.js +24 -6
- package/dist/serialization/codec.d.ts +37 -2
- package/dist/serialization/codec.d.ts.map +1 -1
- package/dist/serialization/codec.js +2 -2
- package/dist/serialization/compression.d.ts +105 -0
- package/dist/serialization/compression.d.ts.map +1 -0
- package/dist/serialization/compression.js +261 -0
- package/dist/serialization/encryption.d.ts +119 -17
- package/dist/serialization/encryption.d.ts.map +1 -1
- package/dist/serialization/encryption.js +152 -17
- package/dist/serialization/errors.d.ts +13 -0
- package/dist/serialization/errors.d.ts.map +1 -1
- package/dist/serialization/errors.js +20 -2
- package/dist/serialization/format.d.ts +6 -6
- package/dist/serialization/format.js +7 -7
- package/dist/serialization/hardened.d.ts +156 -0
- package/dist/serialization/hardened.d.ts.map +1 -0
- package/dist/serialization/hardened.js +538 -0
- package/dist/serialization/index.d.ts +10 -8
- package/dist/serialization/index.d.ts.map +1 -1
- package/dist/serialization/index.js +10 -8
- package/dist/serialization/reducers/class-vm.d.ts +20 -0
- package/dist/serialization/reducers/class-vm.d.ts.map +1 -0
- package/dist/serialization/reducers/class-vm.js +77 -0
- package/dist/serialization/reducers/class.d.ts.map +1 -1
- package/dist/serialization/reducers/class.js +11 -6
- package/dist/serialization/reducers/common-vm.d.ts +15 -0
- package/dist/serialization/reducers/common-vm.d.ts.map +1 -0
- package/dist/serialization/reducers/common-vm.js +616 -0
- package/dist/serialization/reducers/common.d.ts +1 -1
- package/dist/serialization/reducers/common.d.ts.map +1 -1
- package/dist/serialization/reducers/common.js +202 -62
- package/dist/serialization/reducers/step-function-vm.d.ts +44 -0
- package/dist/serialization/reducers/step-function-vm.d.ts.map +1 -0
- package/dist/serialization/reducers/step-function-vm.js +97 -0
- package/dist/serialization/reducers/step-function.d.ts.map +1 -1
- package/dist/serialization/reducers/step-function.js +25 -9
- package/dist/serialization/step.d.ts +4 -4
- package/dist/serialization/step.d.ts.map +1 -1
- package/dist/serialization/step.js +9 -5
- package/dist/serialization/types.d.ts +80 -1
- package/dist/serialization/types.d.ts.map +1 -1
- package/dist/serialization/types.js +15 -1
- package/dist/serialization/workflow-vm.d.ts +29 -0
- package/dist/serialization/workflow-vm.d.ts.map +1 -0
- package/dist/serialization/workflow-vm.js +74 -0
- package/dist/serialization-format.d.ts +64 -8
- package/dist/serialization-format.d.ts.map +1 -1
- package/dist/serialization-format.js +225 -73
- package/dist/serialization.d.ts +262 -34
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +1885 -277
- package/dist/set-attributes.d.ts +13 -0
- package/dist/set-attributes.d.ts.map +1 -0
- package/dist/set-attributes.js +60 -0
- package/dist/source-map.d.ts +25 -0
- package/dist/source-map.d.ts.map +1 -1
- package/dist/source-map.js +154 -10
- package/dist/step/context-storage.d.ts +63 -2
- package/dist/step/context-storage.d.ts.map +1 -1
- package/dist/step/context-storage.js +7 -5
- package/dist/step/writable-stream.d.ts +3 -3
- package/dist/step/writable-stream.d.ts.map +1 -1
- package/dist/step/writable-stream.js +80 -13
- package/dist/step.d.ts.map +1 -1
- package/dist/step.js +148 -27
- package/dist/symbols.d.ts +50 -0
- package/dist/symbols.d.ts.map +1 -1
- package/dist/symbols.js +51 -1
- package/dist/telemetry/semantic-conventions.d.ts +433 -2
- package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
- package/dist/telemetry/semantic-conventions.js +319 -3
- package/dist/telemetry.d.ts +91 -0
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +244 -17
- 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 +107 -0
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +23 -1
- package/dist/util.d.ts +0 -5
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +1 -15
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +2 -2
- package/dist/vm/index.d.ts.map +1 -1
- package/dist/vm/index.js +84 -14
- package/dist/vm/script-cache.d.ts +26 -0
- package/dist/vm/script-cache.d.ts.map +1 -0
- package/dist/vm/script-cache.js +131 -0
- package/dist/vm/uint8array-base64.js +1 -1
- package/dist/workflow/abort-controller.d.ts +2 -2
- package/dist/workflow/abort-controller.d.ts.map +1 -1
- package/dist/workflow/abort-controller.js +88 -21
- package/dist/workflow/attribute-dispatcher.d.ts +6 -0
- package/dist/workflow/attribute-dispatcher.d.ts.map +1 -0
- package/dist/workflow/attribute-dispatcher.js +45 -0
- package/dist/workflow/create-hook.d.ts.map +1 -1
- package/dist/workflow/create-hook.js +24 -3
- package/dist/workflow/get-workflow-metadata.js +2 -2
- package/dist/workflow/hook.d.ts.map +1 -1
- package/dist/workflow/hook.js +304 -47
- package/dist/workflow/index.d.ts +1 -0
- package/dist/workflow/index.d.ts.map +1 -1
- package/dist/workflow/index.js +2 -1
- package/dist/workflow/set-attributes.d.ts +68 -0
- package/dist/workflow/set-attributes.d.ts.map +1 -0
- package/dist/workflow/set-attributes.js +60 -0
- package/dist/workflow/sleep.d.ts.map +1 -1
- package/dist/workflow/sleep.js +58 -12
- package/dist/workflow/world-init-stub.d.ts +3 -3
- package/dist/workflow/world-init-stub.js +4 -4
- package/dist/workflow.d.ts +95 -3
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +900 -561
- package/docs/api-reference/create-hook.mdx +89 -10
- package/docs/api-reference/create-webhook.mdx +16 -15
- package/docs/api-reference/define-hook.mdx +35 -33
- package/docs/api-reference/fatal-error.mdx +30 -8
- package/docs/api-reference/fetch.mdx +14 -10
- package/docs/api-reference/get-step-metadata.mdx +2 -2
- package/docs/api-reference/get-workflow-metadata.mdx +3 -3
- package/docs/api-reference/get-writable.mdx +7 -7
- package/docs/api-reference/index.mdx +4 -1
- package/docs/api-reference/retryable-error.mdx +1 -1
- package/docs/api-reference/set-attributes.mdx +61 -0
- package/docs/api-reference/sleep.mdx +4 -4
- package/docs/foundations/cancellation.mdx +31 -32
- package/docs/foundations/errors-and-retries.mdx +42 -11
- package/docs/foundations/hooks.mdx +64 -35
- package/docs/foundations/idempotency.mdx +244 -12
- package/docs/foundations/index.mdx +1 -23
- package/docs/foundations/meta.json +2 -1
- package/docs/foundations/serialization.mdx +21 -22
- package/docs/foundations/starting-workflows.mdx +106 -30
- package/docs/foundations/streaming.mdx +108 -60
- package/docs/foundations/versioning.mdx +263 -0
- package/docs/foundations/workflows-and-steps.mdx +9 -9
- package/docs/how-it-works/cancellation.mdx +63 -63
- package/docs/how-it-works/code-transform.mdx +83 -67
- package/docs/how-it-works/encryption.mdx +30 -26
- package/docs/how-it-works/event-sourcing.mdx +125 -34
- package/docs/how-it-works/framework-integrations.mdx +96 -337
- package/docs/how-it-works/understanding-directives.mdx +22 -22
- package/package.json +24 -15
- 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 -776
package/dist/runtime/runs.d.ts
CHANGED
|
@@ -1,7 +1,16 @@
|
|
|
1
|
-
import { type World } from '@workflow/world';
|
|
1
|
+
import { type BulkCancelWorkflowRunsResult, type World } from '@workflow/world';
|
|
2
2
|
export interface RecreateRunOptions {
|
|
3
3
|
deploymentId?: string;
|
|
4
4
|
specVersion?: number;
|
|
5
|
+
/**
|
|
6
|
+
* Queue namespace of the target deployment (e.g. `'eve'` for topics like
|
|
7
|
+
* `__eve_wkf_workflow_*`). Falls back to `WORKFLOW_QUEUE_NAMESPACE` in
|
|
8
|
+
* the calling process. Cross-context callers (e.g. the observability
|
|
9
|
+
* dashboard) must pass the target deployment's namespace explicitly,
|
|
10
|
+
* since a run enqueued to a topic the target deployment has no consumer
|
|
11
|
+
* for is never picked up.
|
|
12
|
+
*/
|
|
13
|
+
namespace?: string;
|
|
5
14
|
}
|
|
6
15
|
export interface StopSleepResult {
|
|
7
16
|
/** Number of pending sleeps that were stopped */
|
|
@@ -21,6 +30,28 @@ export interface StopSleepOptions {
|
|
|
21
30
|
* If not provided, all pending sleep calls will be interrupted.
|
|
22
31
|
*/
|
|
23
32
|
correlationIds?: string[];
|
|
33
|
+
/**
|
|
34
|
+
* Queue namespace of the run's deployment (e.g. `'eve'`), used when
|
|
35
|
+
* re-enqueueing the run after completing its waits. Falls back to
|
|
36
|
+
* `WORKFLOW_QUEUE_NAMESPACE` in the calling process. Cross-context
|
|
37
|
+
* callers (e.g. the observability dashboard) must pass it explicitly.
|
|
38
|
+
*/
|
|
39
|
+
namespace?: string;
|
|
40
|
+
}
|
|
41
|
+
export interface ReenqueueRunOptions {
|
|
42
|
+
/**
|
|
43
|
+
* Queue namespace of the run's deployment (e.g. `'eve'`). Falls back to
|
|
44
|
+
* `WORKFLOW_QUEUE_NAMESPACE` in the calling process. Cross-context
|
|
45
|
+
* callers (e.g. the observability dashboard) must pass it explicitly.
|
|
46
|
+
*/
|
|
47
|
+
namespace?: string;
|
|
48
|
+
}
|
|
49
|
+
export interface CancelRunOptions {
|
|
50
|
+
/**
|
|
51
|
+
* Optional free-text reason for the cancellation (max 512 chars), recorded
|
|
52
|
+
* on the run_cancelled event and surfaced in the run detail view.
|
|
53
|
+
*/
|
|
54
|
+
cancelReason?: string;
|
|
24
55
|
}
|
|
25
56
|
/**
|
|
26
57
|
* Start a new workflow run based on an existing run.
|
|
@@ -28,12 +59,32 @@ export interface StopSleepOptions {
|
|
|
28
59
|
export declare function recreateRunFromExisting(world: World, runId: string, options?: RecreateRunOptions): Promise<string>;
|
|
29
60
|
/**
|
|
30
61
|
* Cancel a workflow run.
|
|
62
|
+
*
|
|
63
|
+
* @param options - Optional cancellation settings. `cancelReason` records a
|
|
64
|
+
* free-text reason (max 512 chars) on the run_cancelled event.
|
|
65
|
+
*/
|
|
66
|
+
export declare function cancelRun(world: World, runId: string, options?: CancelRunOptions): Promise<void>;
|
|
67
|
+
/**
|
|
68
|
+
* Cancel many runs in one call.
|
|
69
|
+
*
|
|
70
|
+
* Fast path: if the world implements `runs.cancelMany`, the whole batch is
|
|
71
|
+
* delegated to it in a single operation (one backend round-trip on
|
|
72
|
+
* `@workflow/world-vercel`).
|
|
73
|
+
*
|
|
74
|
+
* Fallback: for worlds without `cancelMany`, this issues single-run
|
|
75
|
+
* `cancelRun()` calls with at most {@link CANCEL_RUNS_FALLBACK_CONCURRENCY}
|
|
76
|
+
* in flight at a time. Fallback successes are reported as `cancelled`;
|
|
77
|
+
* failures are reported as `failed` with `code: 'internal_error'` and
|
|
78
|
+
* `retryable: true`, deliberately without per-world error classification.
|
|
79
|
+
*
|
|
80
|
+
* @throws if `runIds` is empty, contains duplicates, or exceeds
|
|
81
|
+
* {@link BULK_CANCEL_MAX_RUN_IDS}.
|
|
31
82
|
*/
|
|
32
|
-
export declare function
|
|
83
|
+
export declare function cancelRuns(world: World, runIds: string[], options?: CancelRunOptions): Promise<BulkCancelWorkflowRunsResult>;
|
|
33
84
|
/**
|
|
34
85
|
* Re-enqueue a workflow run.
|
|
35
86
|
*/
|
|
36
|
-
export declare function reenqueueRun(world: World, runId: string): Promise<void>;
|
|
87
|
+
export declare function reenqueueRun(world: World, runId: string, options?: ReenqueueRunOptions): Promise<void>;
|
|
37
88
|
/**
|
|
38
89
|
* Wake up a workflow run by interrupting pending sleep() calls.
|
|
39
90
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runs.d.ts","sourceRoot":"","sources":["../../src/runtime/runs.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"runs.d.ts","sourceRoot":"","sources":["../../src/runtime/runs.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,4BAA4B,EAIjC,KAAK,KAAK,EACX,MAAM,iBAAiB,CAAC;AAMzB,MAAM,WAAW,kBAAkB;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,iDAAiD;IACjD,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAMD;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,MAAM,CAAC,CAqCjB;AAED;;;;;GAKG;AACH,wBAAsB,SAAS,CAC7B,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,IAAI,CAAC,CAmBf;AAQD;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,UAAU,CAC9B,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EAAE,EAChB,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,4BAA4B,CAAC,CA8EvC;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAmBf;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,eAAe,CAAC,CAmG1B;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAUrC;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,EAAE,CAAC,CAUnB"}
|
package/dist/runtime/runs.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { EntityConflictError } from '@workflow/errors';
|
|
2
|
-
import { isLegacySpecVersion, SPEC_VERSION_LEGACY, } from '@workflow/world';
|
|
3
|
-
import {
|
|
1
|
+
import { EntityConflictError, StreamError } from '@workflow/errors';
|
|
2
|
+
import { BULK_CANCEL_MAX_RUN_IDS, isLegacySpecVersion, SPEC_VERSION_LEGACY, } from '@workflow/world';
|
|
3
|
+
import { deriveRunPayloadKeys } from '../serialization/encryption.js';
|
|
4
4
|
import { hydrateWorkflowArguments } from '../serialization.js';
|
|
5
5
|
import { getWorkflowQueueName } from './helpers.js';
|
|
6
6
|
import { start } from './start.js';
|
|
@@ -14,7 +14,9 @@ export async function recreateRunFromExisting(world, runId, options = {}) {
|
|
|
14
14
|
try {
|
|
15
15
|
const run = await world.runs.get(runId, { resolveData: 'all' });
|
|
16
16
|
const rawKey = await world.getEncryptionKeyForRun?.(run);
|
|
17
|
-
const encryptionKey = rawKey
|
|
17
|
+
const encryptionKey = rawKey
|
|
18
|
+
? await deriveRunPayloadKeys(rawKey)
|
|
19
|
+
: undefined;
|
|
18
20
|
const workflowArgs = normalizeWorkflowArgs(await hydrateWorkflowArguments(run.input, runId, encryptionKey, globalThis));
|
|
19
21
|
const specVersion = options.specVersion ?? run.specVersion ?? SPEC_VERSION_LEGACY;
|
|
20
22
|
const deploymentId = options.deploymentId ?? run.deploymentId;
|
|
@@ -22,6 +24,8 @@ export async function recreateRunFromExisting(world, runId, options = {}) {
|
|
|
22
24
|
deploymentId,
|
|
23
25
|
world,
|
|
24
26
|
specVersion,
|
|
27
|
+
replayedFromRunId: runId,
|
|
28
|
+
namespace: options.namespace,
|
|
25
29
|
});
|
|
26
30
|
return newRun.runId;
|
|
27
31
|
}
|
|
@@ -31,29 +35,129 @@ export async function recreateRunFromExisting(world, runId, options = {}) {
|
|
|
31
35
|
}
|
|
32
36
|
/**
|
|
33
37
|
* Cancel a workflow run.
|
|
38
|
+
*
|
|
39
|
+
* @param options - Optional cancellation settings. `cancelReason` records a
|
|
40
|
+
* free-text reason (max 512 chars) on the run_cancelled event.
|
|
34
41
|
*/
|
|
35
|
-
export async function cancelRun(world, runId) {
|
|
42
|
+
export async function cancelRun(world, runId, options) {
|
|
36
43
|
try {
|
|
37
44
|
const run = await world.runs.get(runId, { resolveData: 'none' });
|
|
38
45
|
const specVersion = run.specVersion ?? SPEC_VERSION_LEGACY;
|
|
39
46
|
const compatMode = isLegacySpecVersion(specVersion);
|
|
40
|
-
const
|
|
47
|
+
const eventRequest = {
|
|
41
48
|
eventType: 'run_cancelled',
|
|
42
49
|
specVersion,
|
|
50
|
+
...(options?.cancelReason !== undefined
|
|
51
|
+
? { eventData: { cancelReason: options.cancelReason } }
|
|
52
|
+
: {}),
|
|
43
53
|
};
|
|
44
|
-
await world.events.create(runId,
|
|
54
|
+
await world.events.create(runId, eventRequest, { v1Compat: compatMode });
|
|
45
55
|
}
|
|
46
56
|
catch (err) {
|
|
47
57
|
throw new Error(`Failed to cancel run ${runId}: ${err instanceof Error ? err.message : String(err)}`, { cause: err });
|
|
48
58
|
}
|
|
49
59
|
}
|
|
60
|
+
/**
|
|
61
|
+
* Maximum number of single-run cancellations issued concurrently by the
|
|
62
|
+
* fallback path (worlds without `runs.cancelMany`).
|
|
63
|
+
*/
|
|
64
|
+
const CANCEL_RUNS_FALLBACK_CONCURRENCY = 20;
|
|
65
|
+
/**
|
|
66
|
+
* Cancel many runs in one call.
|
|
67
|
+
*
|
|
68
|
+
* Fast path: if the world implements `runs.cancelMany`, the whole batch is
|
|
69
|
+
* delegated to it in a single operation (one backend round-trip on
|
|
70
|
+
* `@workflow/world-vercel`).
|
|
71
|
+
*
|
|
72
|
+
* Fallback: for worlds without `cancelMany`, this issues single-run
|
|
73
|
+
* `cancelRun()` calls with at most {@link CANCEL_RUNS_FALLBACK_CONCURRENCY}
|
|
74
|
+
* in flight at a time. Fallback successes are reported as `cancelled`;
|
|
75
|
+
* failures are reported as `failed` with `code: 'internal_error'` and
|
|
76
|
+
* `retryable: true`, deliberately without per-world error classification.
|
|
77
|
+
*
|
|
78
|
+
* @throws if `runIds` is empty, contains duplicates, or exceeds
|
|
79
|
+
* {@link BULK_CANCEL_MAX_RUN_IDS}.
|
|
80
|
+
*/
|
|
81
|
+
export async function cancelRuns(world, runIds, options) {
|
|
82
|
+
if (runIds.length === 0) {
|
|
83
|
+
throw new Error('cancelRuns requires at least one run ID.');
|
|
84
|
+
}
|
|
85
|
+
if (runIds.length > BULK_CANCEL_MAX_RUN_IDS) {
|
|
86
|
+
throw new Error(`cancelRuns accepts at most ${BULK_CANCEL_MAX_RUN_IDS} run IDs (received ${runIds.length}).`);
|
|
87
|
+
}
|
|
88
|
+
if (new Set(runIds).size !== runIds.length) {
|
|
89
|
+
throw new Error('cancelRuns requires unique run IDs (duplicates found).');
|
|
90
|
+
}
|
|
91
|
+
// Fast path: a single batch operation when the world supports it.
|
|
92
|
+
if (world.runs.cancelMany) {
|
|
93
|
+
return world.runs.cancelMany({
|
|
94
|
+
runIds,
|
|
95
|
+
...(options?.cancelReason !== undefined
|
|
96
|
+
? { cancelReason: options.cancelReason }
|
|
97
|
+
: {}),
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
// Fallback: bounded-concurrency single-run cancellation.
|
|
101
|
+
const results = new Array(runIds.length);
|
|
102
|
+
let nextIndex = 0;
|
|
103
|
+
const worker = async () => {
|
|
104
|
+
while (true) {
|
|
105
|
+
const index = nextIndex++;
|
|
106
|
+
if (index >= runIds.length)
|
|
107
|
+
return;
|
|
108
|
+
const runId = runIds[index];
|
|
109
|
+
try {
|
|
110
|
+
await cancelRun(world, runId, options);
|
|
111
|
+
results[index] = { runId, outcome: 'cancelled' };
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
results[index] = {
|
|
115
|
+
runId,
|
|
116
|
+
outcome: 'failed',
|
|
117
|
+
code: 'internal_error',
|
|
118
|
+
retryable: true,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
const workerCount = Math.min(CANCEL_RUNS_FALLBACK_CONCURRENCY, runIds.length);
|
|
124
|
+
await Promise.all(Array.from({ length: workerCount }, () => worker()));
|
|
125
|
+
const summary = {
|
|
126
|
+
requested: runIds.length,
|
|
127
|
+
cancelled: 0,
|
|
128
|
+
alreadyCancelled: 0,
|
|
129
|
+
notCancellable: 0,
|
|
130
|
+
notFound: 0,
|
|
131
|
+
failed: 0,
|
|
132
|
+
};
|
|
133
|
+
for (const result of results) {
|
|
134
|
+
switch (result.outcome) {
|
|
135
|
+
case 'cancelled':
|
|
136
|
+
summary.cancelled++;
|
|
137
|
+
break;
|
|
138
|
+
case 'already_cancelled':
|
|
139
|
+
summary.alreadyCancelled++;
|
|
140
|
+
break;
|
|
141
|
+
case 'not_cancellable':
|
|
142
|
+
summary.notCancellable++;
|
|
143
|
+
break;
|
|
144
|
+
case 'not_found':
|
|
145
|
+
summary.notFound++;
|
|
146
|
+
break;
|
|
147
|
+
case 'failed':
|
|
148
|
+
summary.failed++;
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return { summary, results };
|
|
153
|
+
}
|
|
50
154
|
/**
|
|
51
155
|
* Re-enqueue a workflow run.
|
|
52
156
|
*/
|
|
53
|
-
export async function reenqueueRun(world, runId) {
|
|
157
|
+
export async function reenqueueRun(world, runId, options) {
|
|
54
158
|
try {
|
|
55
159
|
const run = await world.runs.get(runId, { resolveData: 'none' });
|
|
56
|
-
await world.queue(getWorkflowQueueName(run.workflowName), {
|
|
160
|
+
await world.queue(getWorkflowQueueName(run.workflowName, options?.namespace), {
|
|
57
161
|
runId,
|
|
58
162
|
}, {
|
|
59
163
|
deploymentId: run.deploymentId,
|
|
@@ -71,14 +175,13 @@ export async function wakeUpRun(world, runId, options) {
|
|
|
71
175
|
try {
|
|
72
176
|
const run = await world.runs.get(runId, { resolveData: 'none' });
|
|
73
177
|
const compatMode = isLegacySpecVersion(run.specVersion);
|
|
74
|
-
// Paginate through all events to ensure we don't miss any sleeps
|
|
75
|
-
// in long-running workflows with more than 1000 events.
|
|
178
|
+
// Paginate through all events to ensure we don't miss any sleeps.
|
|
76
179
|
const allEvents = [];
|
|
77
180
|
let cursor = null;
|
|
78
181
|
do {
|
|
79
182
|
const eventsResult = await world.events.list({
|
|
80
183
|
runId,
|
|
81
|
-
pagination: {
|
|
184
|
+
pagination: { sortOrder: 'asc', ...(cursor ? { cursor } : {}) },
|
|
82
185
|
resolveData: 'none',
|
|
83
186
|
});
|
|
84
187
|
allEvents.push(...eventsResult.data);
|
|
@@ -107,6 +210,9 @@ export async function wakeUpRun(world, runId, options) {
|
|
|
107
210
|
eventType: 'wait_completed',
|
|
108
211
|
correlationId: waitEvent.correlationId,
|
|
109
212
|
specVersion: run.specVersion,
|
|
213
|
+
eventData: {
|
|
214
|
+
resumeAt: waitEvent.eventData.resumeAt,
|
|
215
|
+
},
|
|
110
216
|
};
|
|
111
217
|
try {
|
|
112
218
|
await world.events.create(runId, eventData, { v1Compat: compatMode });
|
|
@@ -122,7 +228,7 @@ export async function wakeUpRun(world, runId, options) {
|
|
|
122
228
|
}
|
|
123
229
|
}
|
|
124
230
|
if (stoppedCount > 0) {
|
|
125
|
-
await world.queue(getWorkflowQueueName(run.workflowName), {
|
|
231
|
+
await world.queue(getWorkflowQueueName(run.workflowName, options?.namespace), {
|
|
126
232
|
runId,
|
|
127
233
|
}, {
|
|
128
234
|
deploymentId: run.deploymentId,
|
|
@@ -150,7 +256,9 @@ export async function readStream(world, runId, streamId, options) {
|
|
|
150
256
|
return await world.streams.get(runId, streamId, options?.startIndex);
|
|
151
257
|
}
|
|
152
258
|
catch (err) {
|
|
153
|
-
|
|
259
|
+
if (StreamError.is(err))
|
|
260
|
+
throw err;
|
|
261
|
+
throw new StreamError(`Failed to read stream ${streamId}: ${err instanceof Error ? err.message : String(err)}`, { cause: err });
|
|
154
262
|
}
|
|
155
263
|
}
|
|
156
264
|
/**
|
|
@@ -161,7 +269,9 @@ export async function listStreams(world, runId) {
|
|
|
161
269
|
return await world.streams.list(runId);
|
|
162
270
|
}
|
|
163
271
|
catch (err) {
|
|
164
|
-
|
|
272
|
+
if (StreamError.is(err))
|
|
273
|
+
throw err;
|
|
274
|
+
throw new StreamError(`Failed to list streams for run ${runId}: ${err instanceof Error ? err.message : String(err)}`, { cause: err });
|
|
165
275
|
}
|
|
166
276
|
}
|
|
167
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL3J1bnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkQsT0FBTyxFQUVMLG1CQUFtQixFQUNuQixtQkFBbUIsR0FFcEIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDN0MsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDL0QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3BELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUM7QUE2Qm5DLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxJQUFhLEVBQWEsRUFBRTtJQUN6RCxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM3QyxDQUFDLENBQUM7QUFFRjs7R0FFRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsdUJBQXVCLENBQzNDLEtBQVksRUFDWixLQUFhLEVBQ2IsVUFBOEIsRUFBRTtJQUVoQyxJQUFJLENBQUM7UUFDSCxNQUFNLEdBQUcsR0FBRyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sTUFBTSxHQUFHLE1BQU0sS0FBSyxDQUFDLHNCQUFzQixFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekQsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ25F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TUFBTSxJQUFJLEtBQUssQ0FDYixrQ0FBa0MsS0FBSyxLQUFLLEdBQUcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUM5RixFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FDZixDQUFDO0lBQ0osQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnRpdHlDb25mbGljdEVycm9yIH0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQge1xuICB0eXBlIEV2ZW50LFxuICBpc0xlZ2FjeVNwZWNWZXJzaW9uLFxuICBTUEVDX1ZFUlNJT05fTEVHQUNZLFxuICB0eXBlIFdvcmxkLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgaW1wb3J0S2V5IH0gZnJvbSAnLi4vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQgeyBoeWRyYXRlV29ya2Zsb3dBcmd1bWVudHMgfSBmcm9tICcuLi9zZXJpYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IGdldFdvcmtmbG93UXVldWVOYW1lIH0gZnJvbSAnLi9oZWxwZXJzLmpzJztcbmltcG9ydCB7IHN0YXJ0IH0gZnJvbSAnLi9zdGFydC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVjcmVhdGVSdW5PcHRpb25zIHtcbiAgZGVwbG95bWVudElkPzogc3RyaW5nO1xuICBzcGVjVmVyc2lvbj86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdG9wU2xlZXBSZXN1bHQge1xuICAvKiogTnVtYmVyIG9mIHBlbmRpbmcgc2xlZXBzIHRoYXQgd2VyZSBzdG9wcGVkICovXG4gIHN0b3BwZWRDb3VudDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlYWRTdHJlYW1PcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBpbmRleCB0byBzdGFydCByZWFkaW5nIGZyb20uIERlZmF1bHRzIHRvIDAuXG4gICAqIE5lZ2F0aXZlIHZhbHVlcyBzdGFydCBmcm9tIHRoZSBlbmQgKGUuZy4gLTMgcmVhZHMgdGhlIGxhc3QgMyBjaHVua3MpLlxuICAgKi9cbiAgc3RhcnRJbmRleD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdG9wU2xlZXBPcHRpb25zIHtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGxpc3Qgb2Ygc3BlY2lmaWMgY29ycmVsYXRpb24gSURzIHRvIHRhcmdldC5cbiAgICogSWYgcHJvdmlkZWQsIG9ubHkgdGhlc2Ugc2xlZXAgY2FsbHMgd2lsbCBiZSBpbnRlcnJ1cHRlZC5cbiAgICogSWYgbm90IHByb3ZpZGVkLCBhbGwgcGVuZGluZyBzbGVlcCBjYWxscyB3aWxsIGJlIGludGVycnVwdGVkLlxuICAgKi9cbiAgY29ycmVsYXRpb25JZHM/OiBzdHJpbmdbXTtcbn1cblxuY29uc3Qgbm9ybWFsaXplV29ya2Zsb3dBcmdzID0gKGFyZ3M6IHVua25vd24pOiB1bmtub3duW10gPT4ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShhcmdzKSA/IGFyZ3MgOiBbYXJnc107XG59O1xuXG4vKipcbiAqIFN0YXJ0IGEgbmV3IHdvcmtmbG93IHJ1biBiYXNlZCBvbiBhbiBleGlzdGluZyBydW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWNyZWF0ZVJ1bkZyb21FeGlzdGluZyhcbiAgd29ybGQ6IFdvcmxkLFxuICBydW5JZDogc3RyaW5nLFxuICBvcHRpb25zOiBSZWNyZWF0ZVJ1bk9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBydW4gPSBhd2FpdCB3b3JsZC5ydW5zLmdldChydW5JZCwgeyByZXNvbHZlRGF0YTogJ2FsbCcgfSk7XG4gICAgY29uc3QgcmF3S2V5ID0gYXdhaXQgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bj8uKHJ1bik7XG4gICAgY29uc3QgZW5jcnlwdGlvbktleSA9IHJhd0tleSA/IGF3YWl0IGltcG9ydEtleShyYXdLZXkpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHdvcmtmbG93QXJncyA9IG5vcm1hbGl6ZVdvcmtmbG93QXJncyhcbiAgICAgIGF3YWl0IGh5ZHJhdGVXb3JrZmxvd0FyZ3VtZW50cyhcbiAgICAgICAgcnVuLmlucHV0LFxuICAgICAgICBydW5JZCxcbiAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgZ2xvYmFsVGhpc1xuICAgICAgKVxuICAgICk7XG4gICAgY29uc3Qgc3BlY1ZlcnNpb24gPVxuICAgICAgb3B0aW9ucy5zcGVjVmVyc2lvbiA/PyBydW4uc3BlY1ZlcnNpb24gPz8gU1BFQ19WRVJTSU9OX0xFR0FDWTtcbiAgICBjb25zdCBkZXBsb3ltZW50SWQgPSBvcHRpb25zLmRlcGxveW1lbnRJZCA/PyBydW4uZGVwbG95bWVudElkO1xuXG4gICAgY29uc3QgbmV3UnVuID0gYXdhaXQgc3RhcnQoXG4gICAgICB7IHdvcmtmbG93SWQ6IHJ1bi53b3JrZmxvd05hbWUgfSxcbiAgICAgIHdvcmtmbG93QXJncyBhcyB1bmtub3duW10sXG4gICAgICB7XG4gICAgICAgIGRlcGxveW1lbnRJZCxcbiAgICAgICAgd29ybGQsXG4gICAgICAgIHNwZWNWZXJzaW9uLFxuICAgICAgfVxuICAgICk7XG4gICAgcmV0dXJuIG5ld1J1bi5ydW5JZDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEZhaWxlZCB0byByZWNyZWF0ZSBydW4gZnJvbSAke3J1bklkfTogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycil9YCxcbiAgICAgIHsgY2F1c2U6IGVyciB9XG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIENhbmNlbCBhIHdvcmtmbG93IHJ1bi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNhbmNlbFJ1bih3b3JsZDogV29ybGQsIHJ1bklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBydW4gPSBhd2FpdCB3b3JsZC5ydW5zLmdldChydW5JZCwgeyByZXNvbHZlRGF0YTogJ25vbmUnIH0pO1xuICAgIGNvbnN0IHNwZWNWZXJzaW9uID0gcnVuLnNwZWNWZXJzaW9uID8/IFNQRUNfVkVSU0lPTl9MRUdBQ1k7XG4gICAgY29uc3QgY29tcGF0TW9kZSA9IGlzTGVnYWN5U3BlY1ZlcnNpb24oc3BlY1ZlcnNpb24pO1xuICAgIGNvbnN0IGV2ZW50RGF0YSA9IHtcbiAgICAgIGV2ZW50VHlwZTogJ3J1bl9jYW5jZWxsZWQnIGFzIGNvbnN0LFxuICAgICAgc3BlY1ZlcnNpb24sXG4gICAgfTtcbiAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCBldmVudERhdGEsIHsgdjFDb21wYXQ6IGNvbXBhdE1vZGUgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBGYWlsZWQgdG8gY2FuY2VsIHJ1biAke3J1bklkfTogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycil9YCxcbiAgICAgIHsgY2F1c2U6IGVyciB9XG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlLWVucXVldWUgYSB3b3JrZmxvdyBydW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWVucXVldWVSdW4od29ybGQ6IFdvcmxkLCBydW5JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcnVuID0gYXdhaXQgd29ybGQucnVucy5nZXQocnVuSWQsIHsgcmVzb2x2ZURhdGE6ICdub25lJyB9KTtcbiAgICBhd2FpdCB3b3JsZC5xdWV1ZShcbiAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHJ1bi53b3JrZmxvd05hbWUpLFxuICAgICAge1xuICAgICAgICBydW5JZCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGRlcGxveW1lbnRJZDogcnVuLmRlcGxveW1lbnRJZCxcbiAgICAgICAgc3BlY1ZlcnNpb246IHJ1bi5zcGVjVmVyc2lvbiA/PyBTUEVDX1ZFUlNJT05fTEVHQUNZLFxuICAgICAgfVxuICAgICk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBGYWlsZWQgdG8gcmUtZW5xdWV1ZSBydW4gJHtydW5JZH06ICR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpfWAsXG4gICAgICB7IGNhdXNlOiBlcnIgfVxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBXYWtlIHVwIGEgd29ya2Zsb3cgcnVuIGJ5IGludGVycnVwdGluZyBwZW5kaW5nIHNsZWVwKCkgY2FsbHMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3YWtlVXBSdW4oXG4gIHdvcmxkOiBXb3JsZCxcbiAgcnVuSWQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IFN0b3BTbGVlcE9wdGlvbnNcbik6IFByb21pc2U8U3RvcFNsZWVwUmVzdWx0PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcnVuID0gYXdhaXQgd29ybGQucnVucy5nZXQocnVuSWQsIHsgcmVzb2x2ZURhdGE6ICdub25lJyB9KTtcbiAgICBjb25zdCBjb21wYXRNb2RlID0gaXNMZWdhY3lTcGVjVmVyc2lvbihydW4uc3BlY1ZlcnNpb24pO1xuXG4gICAgLy8gUGFnaW5hdGUgdGhyb3VnaCBhbGwgZXZlbnRzIHRvIGVuc3VyZSB3ZSBkb24ndCBtaXNzIGFueSBzbGVlcHNcbiAgICAvLyBpbiBsb25nLXJ1bm5pbmcgd29ya2Zsb3dzIHdpdGggbW9yZSB0aGFuIDEwMDAgZXZlbnRzLlxuICAgIGNvbnN0IGFsbEV2ZW50czogRXZlbnRbXSA9IFtdO1xuICAgIGxldCBjdXJzb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIGRvIHtcbiAgICAgIGNvbnN0IGV2ZW50c1Jlc3VsdCA9IGF3YWl0IHdvcmxkLmV2ZW50cy5saXN0KHtcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIHBhZ2luYXRpb246IHsgbGltaXQ6IDEwMDAsIC4uLihjdXJzb3IgPyB7IGN1cnNvciB9IDoge30pIH0sXG4gICAgICAgIHJlc29sdmVEYXRhOiAnbm9uZScsXG4gICAgICB9KTtcbiAgICAgIGFsbEV2ZW50cy5wdXNoKC4uLmV2ZW50c1Jlc3VsdC5kYXRhKTtcbiAgICAgIGN1cnNvciA9IGV2ZW50c1Jlc3VsdC5oYXNNb3JlID8gZXZlbnRzUmVzdWx0LmN1cnNvciA6IG51bGw7XG4gICAgfSB3aGlsZSAoY3Vyc29yKTtcblxuICAgIGNvbnN0IHdhaXRDcmVhdGVkRXZlbnRzID0gYWxsRXZlbnRzLmZpbHRlcihcbiAgICAgIChldmVudDogRXZlbnQpID0+IGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3dhaXRfY3JlYXRlZCdcbiAgICApO1xuICAgIGNvbnN0IHdhaXRDb21wbGV0ZWRDb3JyZWxhdGlvbklkcyA9IG5ldyBTZXQoXG4gICAgICBhbGxFdmVudHNcbiAgICAgICAgLmZpbHRlcigoZXZlbnQ6IEV2ZW50KSA9PiBldmVudC5ldmVudFR5cGUgPT09ICd3YWl0X2NvbXBsZXRlZCcpXG4gICAgICAgIC5tYXAoKGV2ZW50OiBFdmVudCkgPT4gZXZlbnQuY29ycmVsYXRpb25JZClcbiAgICApO1xuXG4gICAgbGV0IHBlbmRpbmdXYWl0cyA9IHdhaXRDcmVhdGVkRXZlbnRzLmZpbHRlcihcbiAgICAgIChldmVudDogRXZlbnQpID0+ICF3YWl0Q29tcGxldGVkQ29ycmVsYXRpb25JZHMuaGFzKGV2ZW50LmNvcnJlbGF0aW9uSWQpXG4gICAgKTtcblxuICAgIGlmIChvcHRpb25zPy5jb3JyZWxhdGlvbklkcyAmJiBvcHRpb25zLmNvcnJlbGF0aW9uSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHRhcmdldENvcnJlbGF0aW9uSWRzID0gbmV3IFNldChvcHRpb25zLmNvcnJlbGF0aW9uSWRzKTtcbiAgICAgIHBlbmRpbmdXYWl0cyA9IHBlbmRpbmdXYWl0cy5maWx0ZXIoXG4gICAgICAgIChldmVudDogRXZlbnQpID0+XG4gICAgICAgICAgZXZlbnQuY29ycmVsYXRpb25JZCAmJiB0YXJnZXRDb3JyZWxhdGlvbklkcy5oYXMoZXZlbnQuY29ycmVsYXRpb25JZClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3JzOiBFcnJvcltdID0gW107XG4gICAgbGV0IHN0b3BwZWRDb3VudCA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IHdhaXRFdmVudCBvZiBwZW5kaW5nV2FpdHMpIHtcbiAgICAgIGlmICghd2FpdEV2ZW50LmNvcnJlbGF0aW9uSWQpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgZXZlbnREYXRhID0gY29tcGF0TW9kZVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIGV2ZW50VHlwZTogJ3dhaXRfY29tcGxldGVkJyBhcyBjb25zdCxcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHdhaXRFdmVudC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgICBldmVudFR5cGU6ICd3YWl0X2NvbXBsZXRlZCcgYXMgY29uc3QsXG4gICAgICAgICAgICBjb3JyZWxhdGlvbklkOiB3YWl0RXZlbnQuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBydW4uc3BlY1ZlcnNpb24sXG4gICAgICAgICAgfTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIGV2ZW50RGF0YSwgeyB2MUNvbXBhdDogY29tcGF0TW9kZSB9KTtcbiAgICAgICAgc3RvcHBlZENvdW50Kys7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgIHN0b3BwZWRDb3VudCsrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVycm9ycy5wdXNoKGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyIDogbmV3IEVycm9yKFN0cmluZyhlcnIpKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3RvcHBlZENvdW50ID4gMCkge1xuICAgICAgYXdhaXQgd29ybGQucXVldWUoXG4gICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHJ1bi53b3JrZmxvd05hbWUpLFxuICAgICAgICB7XG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBkZXBsb3ltZW50SWQ6IHJ1bi5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgc3BlY1ZlcnNpb246IHJ1bi5zcGVjVmVyc2lvbiA/PyBTUEVDX1ZFUlNJT05fTEVHQUNZLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEFnZ3JlZ2F0ZUVycm9yKFxuICAgICAgICBlcnJvcnMsXG4gICAgICAgIGBGYWlsZWQgdG8gY29tcGxldGUgJHtlcnJvcnMubGVuZ3RofS8ke3BlbmRpbmdXYWl0cy5sZW5ndGh9IHBlbmRpbmcgd2FpdChzKSBmb3IgcnVuICR7cnVuSWR9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBzdG9wcGVkQ291bnQgfTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIEFnZ3JlZ2F0ZUVycm9yKSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBGYWlsZWQgdG8gd2FrZSB1cCBydW4gJHtydW5JZH06ICR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpfWAsXG4gICAgICB7IGNhdXNlOiBlcnIgfVxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWFkIGZyb20gYSBzdHJlYW0gYnkgc3RyZWFtIElELlxuICogUmV0dXJucyBhIFJlYWRhYmxlU3RyZWFtIG9mIFVpbnQ4QXJyYXkgY2h1bmtzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZFN0cmVhbShcbiAgd29ybGQ6IFdvcmxkLFxuICBydW5JZDogc3RyaW5nLFxuICBzdHJlYW1JZDogc3RyaW5nLFxuICBvcHRpb25zPzogUmVhZFN0cmVhbU9wdGlvbnNcbik6IFByb21pc2U8UmVhZGFibGVTdHJlYW08VWludDhBcnJheT4+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgd29ybGQuc3RyZWFtcy5nZXQocnVuSWQsIHN0cmVhbUlkLCBvcHRpb25zPy5zdGFydEluZGV4KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEZhaWxlZCB0byByZWFkIHN0cmVhbSAke3N0cmVhbUlkfTogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycil9YCxcbiAgICAgIHsgY2F1c2U6IGVyciB9XG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIExpc3QgYWxsIHN0cmVhbSBJRHMgZm9yIGEgd29ya2Zsb3cgcnVuLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdFN0cmVhbXMoXG4gIHdvcmxkOiBXb3JsZCxcbiAgcnVuSWQ6IHN0cmluZ1xuKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCB3b3JsZC5zdHJlYW1zLmxpc3QocnVuSWQpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRmFpbGVkIHRvIGxpc3Qgc3RyZWFtcyBmb3IgcnVuICR7cnVuSWR9OiAke2VyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKX1gLFxuICAgICAgeyBjYXVzZTogZXJyIH1cbiAgICApO1xuICB9XG59XG4iXX0=
|
|
277
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL3J1bnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3BFLE9BQU8sRUFDTCx1QkFBdUIsRUFJdkIsbUJBQW1CLEVBQ25CLG1CQUFtQixHQUVwQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNwRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBOERuQyxNQUFNLHFCQUFxQixHQUFHLENBQUMsSUFBYSxFQUFhLEVBQUU7SUFDekQsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDN0MsQ0FBQyxDQUFDO0FBRUY7O0dBRUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLHVCQUF1QixDQUMzQyxLQUFZLEVBQ1osS0FBYSxFQUNiLFVBQThCLEVBQUU7SUFFaEMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxHQUFHLEdBQUcsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNoRSxNQUFNLE1BQU0sR0FBRyxNQUFNLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sYUFBYSxHQUFHLE1BQU07WUFDMUIsQ0FBQyxDQUFDLE1BQU0sb0JBQW9CLENBQUMsTUFBTSxDQUFDO1lB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QUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUM5RixFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FDZixDQUFDO0lBQ0osQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnRpdHlDb25mbGljdEVycm9yLCBTdHJlYW1FcnJvciB9IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHtcbiAgQlVMS19DQU5DRUxfTUFYX1JVTl9JRFMsXG4gIHR5cGUgQnVsa0NhbmNlbFdvcmtmbG93UnVuUmVzdWx0LFxuICB0eXBlIEJ1bGtDYW5jZWxXb3JrZmxvd1J1bnNSZXN1bHQsXG4gIHR5cGUgRXZlbnQsXG4gIGlzTGVnYWN5U3BlY1ZlcnNpb24sXG4gIFNQRUNfVkVSU0lPTl9MRUdBQ1ksXG4gIHR5cGUgV29ybGQsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBkZXJpdmVSdW5QYXlsb2FkS2V5cyB9IGZyb20gJy4uL3NlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQgeyBoeWRyYXRlV29ya2Zsb3dBcmd1bWVudHMgfSBmcm9tICcuLi9zZXJpYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IGdldFdvcmtmbG93UXVldWVOYW1lIH0gZnJvbSAnLi9oZWxwZXJzLmpzJztcbmltcG9ydCB7IHN0YXJ0IH0gZnJvbSAnLi9zdGFydC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVjcmVhdGVSdW5PcHRpb25zIHtcbiAgZGVwbG95bWVudElkPzogc3RyaW5nO1xuICBzcGVjVmVyc2lvbj86IG51bWJlcjtcbiAgLyoqXG4gICAqIFF1ZXVlIG5hbWVzcGFjZSBvZiB0aGUgdGFyZ2V0IGRlcGxveW1lbnQgKGUuZy4gYCdldmUnYCBmb3IgdG9waWNzIGxpa2VcbiAgICogYF9fZXZlX3drZl93b3JrZmxvd18qYCkuIEZhbGxzIGJhY2sgdG8gYFdPUktGTE9XX1FVRVVFX05BTUVTUEFDRWAgaW5cbiAgICogdGhlIGNhbGxpbmcgcHJvY2Vzcy4gQ3Jvc3MtY29udGV4dCBjYWxsZXJzIChlLmcuIHRoZSBvYnNlcnZhYmlsaXR5XG4gICAqIGRhc2hib2FyZCkgbXVzdCBwYXNzIHRoZSB0YXJnZXQgZGVwbG95bWVudCdzIG5hbWVzcGFjZSBleHBsaWNpdGx5LFxuICAgKiBzaW5jZSBhIHJ1biBlbnF1ZXVlZCB0byBhIHRvcGljIHRoZSB0YXJnZXQgZGVwbG95bWVudCBoYXMgbm8gY29uc3VtZXJcbiAgICogZm9yIGlzIG5ldmVyIHBpY2tlZCB1cC5cbiAgICovXG4gIG5hbWVzcGFjZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdG9wU2xlZXBSZXN1bHQge1xuICAvKiogTnVtYmVyIG9mIHBlbmRpbmcgc2xlZXBzIHRoYXQgd2VyZSBzdG9wcGVkICovXG4gIHN0b3BwZWRDb3VudDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlYWRTdHJlYW1PcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBpbmRleCB0byBzdGFydCByZWFkaW5nIGZyb20uIERlZmF1bHRzIHRvIDAuXG4gICAqIE5lZ2F0aXZlIHZhbHVlcyBzdGFydCBmcm9tIHRoZSBlbmQgKGUuZy4gLTMgcmVhZHMgdGhlIGxhc3QgMyBjaHVua3MpLlxuICAgKi9cbiAgc3RhcnRJbmRleD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdG9wU2xlZXBPcHRpb25zIHtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGxpc3Qgb2Ygc3BlY2lmaWMgY29ycmVsYXRpb24gSURzIHRvIHRhcmdldC5cbiAgICogSWYgcHJvdmlkZWQsIG9ubHkgdGhlc2Ugc2xlZXAgY2FsbHMgd2lsbCBiZSBpbnRlcnJ1cHRlZC5cbiAgICogSWYgbm90IHByb3ZpZGVkLCBhbGwgcGVuZGluZyBzbGVlcCBjYWxscyB3aWxsIGJlIGludGVycnVwdGVkLlxuICAgKi9cbiAgY29ycmVsYXRpb25JZHM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFF1ZXVlIG5hbWVzcGFjZSBvZiB0aGUgcnVuJ3MgZGVwbG95bWVudCAoZS5nLiBgJ2V2ZSdgKSwgdXNlZCB3aGVuXG4gICAqIHJlLWVucXVldWVpbmcgdGhlIHJ1biBhZnRlciBjb21wbGV0aW5nIGl0cyB3YWl0cy4gRmFsbHMgYmFjayB0b1xuICAgKiBgV09SS0ZMT1dfUVVFVUVfTkFNRVNQQUNFYCBpbiB0aGUgY2FsbGluZyBwcm9jZXNzLiBDcm9zcy1jb250ZXh0XG4gICAqIGNhbGxlcnMgKGUuZy4gdGhlIG9ic2VydmFiaWxpdHkgZGFzaGJvYXJkKSBtdXN0IHBhc3MgaXQgZXhwbGljaXRseS5cbiAgICovXG4gIG5hbWVzcGFjZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWVucXVldWVSdW5PcHRpb25zIHtcbiAgLyoqXG4gICAqIFF1ZXVlIG5hbWVzcGFjZSBvZiB0aGUgcnVuJ3MgZGVwbG95bWVudCAoZS5nLiBgJ2V2ZSdgKS4gRmFsbHMgYmFjayB0b1xuICAgKiBgV09SS0ZMT1dfUVVFVUVfTkFNRVNQQUNFYCBpbiB0aGUgY2FsbGluZyBwcm9jZXNzLiBDcm9zcy1jb250ZXh0XG4gICAqIGNhbGxlcnMgKGUuZy4gdGhlIG9ic2VydmFiaWxpdHkgZGFzaGJvYXJkKSBtdXN0IHBhc3MgaXQgZXhwbGljaXRseS5cbiAgICovXG4gIG5hbWVzcGFjZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDYW5jZWxSdW5PcHRpb25zIHtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGZyZWUtdGV4dCByZWFzb24gZm9yIHRoZSBjYW5jZWxsYXRpb24gKG1heCA1MTIgY2hhcnMpLCByZWNvcmRlZFxuICAgKiBvbiB0aGUgcnVuX2NhbmNlbGxlZCBldmVudCBhbmQgc3VyZmFjZWQgaW4gdGhlIHJ1biBkZXRhaWwgdmlldy5cbiAgICovXG4gIGNhbmNlbFJlYXNvbj86IHN0cmluZztcbn1cblxuY29uc3Qgbm9ybWFsaXplV29ya2Zsb3dBcmdzID0gKGFyZ3M6IHVua25vd24pOiB1bmtub3duW10gPT4ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShhcmdzKSA/IGFyZ3MgOiBbYXJnc107XG59O1xuXG4vKipcbiAqIFN0YXJ0IGEgbmV3IHdvcmtmbG93IHJ1biBiYXNlZCBvbiBhbiBleGlzdGluZyBydW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWNyZWF0ZVJ1bkZyb21FeGlzdGluZyhcbiAgd29ybGQ6IFdvcmxkLFxuICBydW5JZDogc3RyaW5nLFxuICBvcHRpb25zOiBSZWNyZWF0ZVJ1bk9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBydW4gPSBhd2FpdCB3b3JsZC5ydW5zLmdldChydW5JZCwgeyByZXNvbHZlRGF0YTogJ2FsbCcgfSk7XG4gICAgY29uc3QgcmF3S2V5ID0gYXdhaXQgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bj8uKHJ1bik7XG4gICAgY29uc3QgZW5jcnlwdGlvbktleSA9IHJhd0tleVxuICAgICAgPyBhd2FpdCBkZXJpdmVSdW5QYXlsb2FkS2V5cyhyYXdLZXkpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCB3b3JrZmxvd0FyZ3MgPSBub3JtYWxpemVXb3JrZmxvd0FyZ3MoXG4gICAgICBhd2FpdCBoeWRyYXRlV29ya2Zsb3dBcmd1bWVudHMoXG4gICAgICAgIHJ1bi5pbnB1dCxcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgIGdsb2JhbFRoaXNcbiAgICAgIClcbiAgICApO1xuICAgIGNvbnN0IHNwZWNWZXJzaW9uID1cbiAgICAgIG9wdGlvbnMuc3BlY1ZlcnNpb24gPz8gcnVuLnNwZWNWZXJzaW9uID8/IFNQRUNfVkVSU0lPTl9MRUdBQ1k7XG4gICAgY29uc3QgZGVwbG95bWVudElkID0gb3B0aW9ucy5kZXBsb3ltZW50SWQgPz8gcnVuLmRlcGxveW1lbnRJZDtcblxuICAgIGNvbnN0IG5ld1J1biA9IGF3YWl0IHN0YXJ0KFxuICAgICAgeyB3b3JrZmxvd0lkOiBydW4ud29ya2Zsb3dOYW1lIH0sXG4gICAgICB3b3JrZmxvd0FyZ3MgYXMgdW5rbm93bltdLFxuICAgICAge1xuICAgICAgICBkZXBsb3ltZW50SWQsXG4gICAgICAgIHdvcmxkLFxuICAgICAgICBzcGVjVmVyc2lvbixcbiAgICAgICAgcmVwbGF5ZWRGcm9tUnVuSWQ6IHJ1bklkLFxuICAgICAgICBuYW1lc3BhY2U6IG9wdGlvbnMubmFtZXNwYWNlLFxuICAgICAgfVxuICAgICk7XG4gICAgcmV0dXJuIG5ld1J1bi5ydW5JZDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEZhaWxlZCB0byByZWNyZWF0ZSBydW4gZnJvbSAke3J1bklkfTogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycil9YCxcbiAgICAgIHsgY2F1c2U6IGVyciB9XG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIENhbmNlbCBhIHdvcmtmbG93IHJ1bi5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGNhbmNlbGxhdGlvbiBzZXR0aW5ncy4gYGNhbmNlbFJlYXNvbmAgcmVjb3JkcyBhXG4gKiAgIGZyZWUtdGV4dCByZWFzb24gKG1heCA1MTIgY2hhcnMpIG9uIHRoZSBydW5fY2FuY2VsbGVkIGV2ZW50LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2FuY2VsUnVuKFxuICB3b3JsZDogV29ybGQsXG4gIHJ1bklkOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBDYW5jZWxSdW5PcHRpb25zXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBydW4gPSBhd2FpdCB3b3JsZC5ydW5zLmdldChydW5JZCwgeyByZXNvbHZlRGF0YTogJ25vbmUnIH0pO1xuICAgIGNvbnN0IHNwZWNWZXJzaW9uID0gcnVuLnNwZWNWZXJzaW9uID8/IFNQRUNfVkVSU0lPTl9MRUdBQ1k7XG4gICAgY29uc3QgY29tcGF0TW9kZSA9IGlzTGVnYWN5U3BlY1ZlcnNpb24oc3BlY1ZlcnNpb24pO1xuICAgIGNvbnN0IGV2ZW50UmVxdWVzdCA9IHtcbiAgICAgIGV2ZW50VHlwZTogJ3J1bl9jYW5jZWxsZWQnIGFzIGNvbnN0LFxuICAgICAgc3BlY1ZlcnNpb24sXG4gICAgICAuLi4ob3B0aW9ucz8uY2FuY2VsUmVhc29uICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyB7IGV2ZW50RGF0YTogeyBjYW5jZWxSZWFzb246IG9wdGlvbnMuY2FuY2VsUmVhc29uIH0gfVxuICAgICAgICA6IHt9KSxcbiAgICB9O1xuICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIGV2ZW50UmVxdWVzdCwgeyB2MUNvbXBhdDogY29tcGF0TW9kZSB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEZhaWxlZCB0byBjYW5jZWwgcnVuICR7cnVuSWR9OiAke2VyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKX1gLFxuICAgICAgeyBjYXVzZTogZXJyIH1cbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogTWF4aW11bSBudW1iZXIgb2Ygc2luZ2xlLXJ1biBjYW5jZWxsYXRpb25zIGlzc3VlZCBjb25jdXJyZW50bHkgYnkgdGhlXG4gKiBmYWxsYmFjayBwYXRoICh3b3JsZHMgd2l0aG91dCBgcnVucy5jYW5jZWxNYW55YCkuXG4gKi9cbmNvbnN0IENBTkNFTF9SVU5TX0ZBTExCQUNLX0NPTkNVUlJFTkNZID0gMjA7XG5cbi8qKlxuICogQ2FuY2VsIG1hbnkgcnVucyBpbiBvbmUgY2FsbC5cbiAqXG4gKiBGYXN0IHBhdGg6IGlmIHRoZSB3b3JsZCBpbXBsZW1lbnRzIGBydW5zLmNhbmNlbE1hbnlgLCB0aGUgd2hvbGUgYmF0Y2ggaXNcbiAqIGRlbGVnYXRlZCB0byBpdCBpbiBhIHNpbmdsZSBvcGVyYXRpb24gKG9uZSBiYWNrZW5kIHJvdW5kLXRyaXAgb25cbiAqIGBAd29ya2Zsb3cvd29ybGQtdmVyY2VsYCkuXG4gKlxuICogRmFsbGJhY2s6IGZvciB3b3JsZHMgd2l0aG91dCBgY2FuY2VsTWFueWAsIHRoaXMgaXNzdWVzIHNpbmdsZS1ydW5cbiAqIGBjYW5jZWxSdW4oKWAgY2FsbHMgd2l0aCBhdCBtb3N0IHtAbGluayBDQU5DRUxfUlVOU19GQUxMQkFDS19DT05DVVJSRU5DWX1cbiAqIGluIGZsaWdodCBhdCBhIHRpbWUuIEZhbGxiYWNrIHN1Y2Nlc3NlcyBhcmUgcmVwb3J0ZWQgYXMgYGNhbmNlbGxlZGA7XG4gKiBmYWlsdXJlcyBhcmUgcmVwb3J0ZWQgYXMgYGZhaWxlZGAgd2l0aCBgY29kZTogJ2ludGVybmFsX2Vycm9yJ2AgYW5kXG4gKiBgcmV0cnlhYmxlOiB0cnVlYCwgZGVsaWJlcmF0ZWx5IHdpdGhvdXQgcGVyLXdvcmxkIGVycm9yIGNsYXNzaWZpY2F0aW9uLlxuICpcbiAqIEB0aHJvd3MgaWYgYHJ1bklkc2AgaXMgZW1wdHksIGNvbnRhaW5zIGR1cGxpY2F0ZXMsIG9yIGV4Y2VlZHNcbiAqICAge0BsaW5rIEJVTEtfQ0FOQ0VMX01BWF9SVU5fSURTfS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNhbmNlbFJ1bnMoXG4gIHdvcmxkOiBXb3JsZCxcbiAgcnVuSWRzOiBzdHJpbmdbXSxcbiAgb3B0aW9ucz86IENhbmNlbFJ1bk9wdGlvbnNcbik6IFByb21pc2U8QnVsa0NhbmNlbFdvcmtmbG93UnVuc1Jlc3VsdD4ge1xuICBpZiAocnVuSWRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2FuY2VsUnVucyByZXF1aXJlcyBhdCBsZWFzdCBvbmUgcnVuIElELicpO1xuICB9XG4gIGlmIChydW5JZHMubGVuZ3RoID4gQlVMS19DQU5DRUxfTUFYX1JVTl9JRFMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgY2FuY2VsUnVucyBhY2NlcHRzIGF0IG1vc3QgJHtCVUxLX0NBTkNFTF9NQVhfUlVOX0lEU30gcnVuIElEcyAocmVjZWl2ZWQgJHtydW5JZHMubGVuZ3RofSkuYFxuICAgICk7XG4gIH1cbiAgaWYgKG5ldyBTZXQocnVuSWRzKS5zaXplICE9PSBydW5JZHMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjYW5jZWxSdW5zIHJlcXVpcmVzIHVuaXF1ZSBydW4gSURzIChkdXBsaWNhdGVzIGZvdW5kKS4nKTtcbiAgfVxuXG4gIC8vIEZhc3QgcGF0aDogYSBzaW5nbGUgYmF0Y2ggb3BlcmF0aW9uIHdoZW4gdGhlIHdvcmxkIHN1cHBvcnRzIGl0LlxuICBpZiAod29ybGQucnVucy5jYW5jZWxNYW55KSB7XG4gICAgcmV0dXJuIHdvcmxkLnJ1bnMuY2FuY2VsTWFueSh7XG4gICAgICBydW5JZHMsXG4gICAgICAuLi4ob3B0aW9ucz8uY2FuY2VsUmVhc29uICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyB7IGNhbmNlbFJlYXNvbjogb3B0aW9ucy5jYW5jZWxSZWFzb24gfVxuICAgICAgICA6IHt9KSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEZhbGxiYWNrOiBib3VuZGVkLWNvbmN1cnJlbmN5IHNpbmdsZS1ydW4gY2FuY2VsbGF0aW9uLlxuICBjb25zdCByZXN1bHRzOiBCdWxrQ2FuY2VsV29ya2Zsb3dSdW5SZXN1bHRbXSA9IG5ldyBBcnJheShydW5JZHMubGVuZ3RoKTtcbiAgbGV0IG5leHRJbmRleCA9IDA7XG5cbiAgY29uc3Qgd29ya2VyID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCBpbmRleCA9IG5leHRJbmRleCsrO1xuICAgICAgaWYgKGluZGV4ID49IHJ1bklkcy5sZW5ndGgpIHJldHVybjtcbiAgICAgIGNvbnN0IHJ1bklkID0gcnVuSWRzW2luZGV4XTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNhbmNlbFJ1bih3b3JsZCwgcnVuSWQsIG9wdGlvbnMpO1xuICAgICAgICByZXN1bHRzW2luZGV4XSA9IHsgcnVuSWQsIG91dGNvbWU6ICdjYW5jZWxsZWQnIH07XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmVzdWx0c1tpbmRleF0gPSB7XG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgb3V0Y29tZTogJ2ZhaWxlZCcsXG4gICAgICAgICAgY29kZTogJ2ludGVybmFsX2Vycm9yJyxcbiAgICAgICAgICByZXRyeWFibGU6IHRydWUsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHdvcmtlckNvdW50ID0gTWF0aC5taW4oQ0FOQ0VMX1JVTlNfRkFMTEJBQ0tfQ09OQ1VSUkVOQ1ksIHJ1bklkcy5sZW5ndGgpO1xuICBhd2FpdCBQcm9taXNlLmFsbChBcnJheS5mcm9tKHsgbGVuZ3RoOiB3b3JrZXJDb3VudCB9LCAoKSA9PiB3b3JrZXIoKSkpO1xuXG4gIGNvbnN0IHN1bW1hcnkgPSB7XG4gICAgcmVxdWVzdGVkOiBydW5JZHMubGVuZ3RoLFxuICAgIGNhbmNlbGxlZDogMCxcbiAgICBhbHJlYWR5Q2FuY2VsbGVkOiAwLFxuICAgIG5vdENhbmNlbGxhYmxlOiAwLFxuICAgIG5vdEZvdW5kOiAwLFxuICAgIGZhaWxlZDogMCxcbiAgfTtcbiAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgIHN3aXRjaCAocmVzdWx0Lm91dGNvbWUpIHtcbiAgICAgIGNhc2UgJ2NhbmNlbGxlZCc6XG4gICAgICAgIHN1bW1hcnkuY2FuY2VsbGVkKys7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYWxyZWFkeV9jYW5jZWxsZWQnOlxuICAgICAgICBzdW1tYXJ5LmFscmVhZHlDYW5jZWxsZWQrKztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdub3RfY2FuY2VsbGFibGUnOlxuICAgICAgICBzdW1tYXJ5Lm5vdENhbmNlbGxhYmxlKys7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbm90X2ZvdW5kJzpcbiAgICAgICAgc3VtbWFyeS5ub3RGb3VuZCsrO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2ZhaWxlZCc6XG4gICAgICAgIHN1bW1hcnkuZmFpbGVkKys7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IHN1bW1hcnksIHJlc3VsdHMgfTtcbn1cblxuLyoqXG4gKiBSZS1lbnF1ZXVlIGEgd29ya2Zsb3cgcnVuLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVlbnF1ZXVlUnVuKFxuICB3b3JsZDogV29ybGQsXG4gIHJ1bklkOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBSZWVucXVldWVSdW5PcHRpb25zXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBydW4gPSBhd2FpdCB3b3JsZC5ydW5zLmdldChydW5JZCwgeyByZXNvbHZlRGF0YTogJ25vbmUnIH0pO1xuICAgIGF3YWl0IHdvcmxkLnF1ZXVlKFxuICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUocnVuLndvcmtmbG93TmFtZSwgb3B0aW9ucz8ubmFtZXNwYWNlKSxcbiAgICAgIHtcbiAgICAgICAgcnVuSWQsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBkZXBsb3ltZW50SWQ6IHJ1bi5kZXBsb3ltZW50SWQsXG4gICAgICAgIHNwZWNWZXJzaW9uOiBydW4uc3BlY1ZlcnNpb24gPz8gU1BFQ19WRVJTSU9OX0xFR0FDWSxcbiAgICAgIH1cbiAgICApO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRmFpbGVkIHRvIHJlLWVucXVldWUgcnVuICR7cnVuSWR9OiAke2VyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKX1gLFxuICAgICAgeyBjYXVzZTogZXJyIH1cbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogV2FrZSB1cCBhIHdvcmtmbG93IHJ1biBieSBpbnRlcnJ1cHRpbmcgcGVuZGluZyBzbGVlcCgpIGNhbGxzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2FrZVVwUnVuKFxuICB3b3JsZDogV29ybGQsXG4gIHJ1bklkOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBTdG9wU2xlZXBPcHRpb25zXG4pOiBQcm9taXNlPFN0b3BTbGVlcFJlc3VsdD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJ1biA9IGF3YWl0IHdvcmxkLnJ1bnMuZ2V0KHJ1bklkLCB7IHJlc29sdmVEYXRhOiAnbm9uZScgfSk7XG4gICAgY29uc3QgY29tcGF0TW9kZSA9IGlzTGVnYWN5U3BlY1ZlcnNpb24ocnVuLnNwZWNWZXJzaW9uKTtcblxuICAgIC8vIFBhZ2luYXRlIHRocm91Z2ggYWxsIGV2ZW50cyB0byBlbnN1cmUgd2UgZG9uJ3QgbWlzcyBhbnkgc2xlZXBzLlxuICAgIGNvbnN0IGFsbEV2ZW50czogRXZlbnRbXSA9IFtdO1xuICAgIGxldCBjdXJzb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIGRvIHtcbiAgICAgIGNvbnN0IGV2ZW50c1Jlc3VsdCA9IGF3YWl0IHdvcmxkLmV2ZW50cy5saXN0KHtcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIHBhZ2luYXRpb246IHsgc29ydE9yZGVyOiAnYXNjJywgLi4uKGN1cnNvciA/IHsgY3Vyc29yIH0gOiB7fSkgfSxcbiAgICAgICAgcmVzb2x2ZURhdGE6ICdub25lJyxcbiAgICAgIH0pO1xuICAgICAgYWxsRXZlbnRzLnB1c2goLi4uZXZlbnRzUmVzdWx0LmRhdGEpO1xuICAgICAgY3Vyc29yID0gZXZlbnRzUmVzdWx0Lmhhc01vcmUgPyBldmVudHNSZXN1bHQuY3Vyc29yIDogbnVsbDtcbiAgICB9IHdoaWxlIChjdXJzb3IpO1xuXG4gICAgY29uc3Qgd2FpdENyZWF0ZWRFdmVudHMgPSBhbGxFdmVudHMuZmlsdGVyKFxuICAgICAgKGV2ZW50OiBFdmVudCkgPT4gZXZlbnQuZXZlbnRUeXBlID09PSAnd2FpdF9jcmVhdGVkJ1xuICAgICk7XG4gICAgY29uc3Qgd2FpdENvbXBsZXRlZENvcnJlbGF0aW9uSWRzID0gbmV3IFNldChcbiAgICAgIGFsbEV2ZW50c1xuICAgICAgICAuZmlsdGVyKChldmVudDogRXZlbnQpID0+IGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3dhaXRfY29tcGxldGVkJylcbiAgICAgICAgLm1hcCgoZXZlbnQ6IEV2ZW50KSA9PiBldmVudC5jb3JyZWxhdGlvbklkKVxuICAgICk7XG5cbiAgICBsZXQgcGVuZGluZ1dhaXRzID0gd2FpdENyZWF0ZWRFdmVudHMuZmlsdGVyKFxuICAgICAgKGV2ZW50OiBFdmVudCkgPT4gIXdhaXRDb21wbGV0ZWRDb3JyZWxhdGlvbklkcy5oYXMoZXZlbnQuY29ycmVsYXRpb25JZClcbiAgICApO1xuXG4gICAgaWYgKG9wdGlvbnM/LmNvcnJlbGF0aW9uSWRzICYmIG9wdGlvbnMuY29ycmVsYXRpb25JZHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgdGFyZ2V0Q29ycmVsYXRpb25JZHMgPSBuZXcgU2V0KG9wdGlvbnMuY29ycmVsYXRpb25JZHMpO1xuICAgICAgcGVuZGluZ1dhaXRzID0gcGVuZGluZ1dhaXRzLmZpbHRlcihcbiAgICAgICAgKGV2ZW50OiBFdmVudCkgPT5cbiAgICAgICAgICBldmVudC5jb3JyZWxhdGlvbklkICYmIHRhcmdldENvcnJlbGF0aW9uSWRzLmhhcyhldmVudC5jb3JyZWxhdGlvbklkKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBlcnJvcnM6IEVycm9yW10gPSBbXTtcbiAgICBsZXQgc3RvcHBlZENvdW50ID0gMDtcblxuICAgIGZvciAoY29uc3Qgd2FpdEV2ZW50IG9mIHBlbmRpbmdXYWl0cykge1xuICAgICAgaWYgKCF3YWl0RXZlbnQuY29ycmVsYXRpb25JZCkgY29udGludWU7XG4gICAgICBjb25zdCBldmVudERhdGEgPSBjb21wYXRNb2RlXG4gICAgICAgID8ge1xuICAgICAgICAgICAgZXZlbnRUeXBlOiAnd2FpdF9jb21wbGV0ZWQnIGFzIGNvbnN0LFxuICAgICAgICAgICAgY29ycmVsYXRpb25JZDogd2FpdEV2ZW50LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIGV2ZW50VHlwZTogJ3dhaXRfY29tcGxldGVkJyBhcyBjb25zdCxcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHdhaXRFdmVudC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgc3BlY1ZlcnNpb246IHJ1bi5zcGVjVmVyc2lvbixcbiAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICByZXN1bWVBdDogd2FpdEV2ZW50LmV2ZW50RGF0YS5yZXN1bWVBdCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIGV2ZW50RGF0YSwgeyB2MUNvbXBhdDogY29tcGF0TW9kZSB9KTtcbiAgICAgICAgc3RvcHBlZENvdW50Kys7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgIHN0b3BwZWRDb3VudCsrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVycm9ycy5wdXNoKGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyIDogbmV3IEVycm9yKFN0cmluZyhlcnIpKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3RvcHBlZENvdW50ID4gMCkge1xuICAgICAgYXdhaXQgd29ybGQucXVldWUoXG4gICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHJ1bi53b3JrZmxvd05hbWUsIG9wdGlvbnM/Lm5hbWVzcGFjZSksXG4gICAgICAgIHtcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGRlcGxveW1lbnRJZDogcnVuLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICBzcGVjVmVyc2lvbjogcnVuLnNwZWNWZXJzaW9uID8/IFNQRUNfVkVSU0lPTl9MRUdBQ1ksXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgQWdncmVnYXRlRXJyb3IoXG4gICAgICAgIGVycm9ycyxcbiAgICAgICAgYEZhaWxlZCB0byBjb21wbGV0ZSAke2Vycm9ycy5sZW5ndGh9LyR7cGVuZGluZ1dhaXRzLmxlbmd0aH0gcGVuZGluZyB3YWl0KHMpIGZvciBydW4gJHtydW5JZH1gXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB7IHN0b3BwZWRDb3VudCB9O1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgQWdncmVnYXRlRXJyb3IpIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEZhaWxlZCB0byB3YWtlIHVwIHJ1biAke3J1bklkfTogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycil9YCxcbiAgICAgIHsgY2F1c2U6IGVyciB9XG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlYWQgZnJvbSBhIHN0cmVhbSBieSBzdHJlYW0gSUQuXG4gKiBSZXR1cm5zIGEgUmVhZGFibGVTdHJlYW0gb2YgVWludDhBcnJheSBjaHVua3MuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkU3RyZWFtKFxuICB3b3JsZDogV29ybGQsXG4gIHJ1bklkOiBzdHJpbmcsXG4gIHN0cmVhbUlkOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBSZWFkU3RyZWFtT3B0aW9uc1xuKTogUHJvbWlzZTxSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5Pj4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCB3b3JsZC5zdHJlYW1zLmdldChydW5JZCwgc3RyZWFtSWQsIG9wdGlvbnM/LnN0YXJ0SW5kZXgpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoU3RyZWFtRXJyb3IuaXMoZXJyKSkgdGhyb3cgZXJyO1xuICAgIHRocm93IG5ldyBTdHJlYW1FcnJvcihcbiAgICAgIGBGYWlsZWQgdG8gcmVhZCBzdHJlYW0gJHtzdHJlYW1JZH06ICR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpfWAsXG4gICAgICB7IGNhdXNlOiBlcnIgfVxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBMaXN0IGFsbCBzdHJlYW0gSURzIGZvciBhIHdvcmtmbG93IHJ1bi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RTdHJlYW1zKFxuICB3b3JsZDogV29ybGQsXG4gIHJ1bklkOiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgd29ybGQuc3RyZWFtcy5saXN0KHJ1bklkKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKFN0cmVhbUVycm9yLmlzKGVycikpIHRocm93IGVycjtcbiAgICB0aHJvdyBuZXcgU3RyZWFtRXJyb3IoXG4gICAgICBgRmFpbGVkIHRvIGxpc3Qgc3RyZWFtcyBmb3IgcnVuICR7cnVuSWR9OiAke2VyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKX1gLFxuICAgICAgeyBjYXVzZTogZXJyIH1cbiAgICApO1xuICB9XG59XG4iXX0=
|
package/dist/runtime/start.d.ts
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
|
-
import type { World } from '@workflow/world';
|
|
1
|
+
import type { RunRetention, World } from '@workflow/world';
|
|
2
2
|
import { Run } from './run.js';
|
|
3
|
+
/**
|
|
4
|
+
* Reset the `deploymentId: 'latest'` no-op warn-once guard. Test-only,
|
|
5
|
+
* exported so unit tests can exercise the warn path across `start()` calls.
|
|
6
|
+
*
|
|
7
|
+
* @internal
|
|
8
|
+
*/
|
|
9
|
+
export declare function _resetLatestNoOpWarnForTests(): void;
|
|
3
10
|
export interface StartOptionsBase {
|
|
4
11
|
/**
|
|
5
12
|
* The world to use for the workflow run creation,
|
|
@@ -10,6 +17,95 @@ export interface StartOptionsBase {
|
|
|
10
17
|
* The spec version to use for the workflow run. Defaults to the latest version.
|
|
11
18
|
*/
|
|
12
19
|
specVersion?: number;
|
|
20
|
+
/**
|
|
21
|
+
* Optional region identifier for the new run. Currently consumed only
|
|
22
|
+
* by `@workflow/world-vercel`, which embeds the region into the tagged
|
|
23
|
+
* run ID and routes the initial workflow message to the matching
|
|
24
|
+
* regional queue. When omitted, the world falls back to its own
|
|
25
|
+
* default (for `world-vercel`: the `VERCEL_REGION` environment
|
|
26
|
+
* variable, then the server-side default region `iad1`; a concrete,
|
|
27
|
+
* routable region is always chosen).
|
|
28
|
+
*
|
|
29
|
+
* Worlds without a regional dimension ignore this field.
|
|
30
|
+
*/
|
|
31
|
+
region?: string;
|
|
32
|
+
/**
|
|
33
|
+
* Plaintext attributes to seed on the run as it is created.
|
|
34
|
+
*
|
|
35
|
+
* Available for native-attributes runs (spec version 4 and later).
|
|
36
|
+
*/
|
|
37
|
+
attributes?: Record<string, string>;
|
|
38
|
+
/**
|
|
39
|
+
* Permit reserved `$`-prefixed keys in `attributes`. The `$` namespace
|
|
40
|
+
* is reserved for framework/library code built on top of the workflow
|
|
41
|
+
* SDK (telemetry, agent metadata, platform-emitted tags, etc.); user
|
|
42
|
+
* code MUST NOT write keys in it, and validation rejects them so
|
|
43
|
+
* accidental collisions with tooling-owned keys can't slip through.
|
|
44
|
+
*
|
|
45
|
+
* Only flip this to `true` if your caller is itself a framework or
|
|
46
|
+
* library that owns a `$`-prefixed sub-namespace and knows the
|
|
47
|
+
* conventions of any other tools writing into it. Same semantics as
|
|
48
|
+
* the `setAttributes` option of the same name.
|
|
49
|
+
*/
|
|
50
|
+
allowReservedAttributes?: boolean;
|
|
51
|
+
/**
|
|
52
|
+
* Set a preference for data retention after run completion.
|
|
53
|
+
*
|
|
54
|
+
* **Experimental.** Both the unit and the set of accepted values are expected
|
|
55
|
+
* to change.
|
|
56
|
+
*
|
|
57
|
+
* Worlds control the retention of user data (event payloads and stream
|
|
58
|
+
* chunks), the event log, and any analytics data. Options are:
|
|
59
|
+
* - `'default'`: same as omission, the World will decide. On Vercel, this
|
|
60
|
+
* is based on your team's plan.
|
|
61
|
+
* - `0`: data is deleted as soon as your run completes or fails. On
|
|
62
|
+
* Vercel, user data is deleted, but metadata may persist for your plan's
|
|
63
|
+
* default retention period.
|
|
64
|
+
*
|
|
65
|
+
* The value is a duration, with zero being the only valid option currently.
|
|
66
|
+
*
|
|
67
|
+
* **Known limitation at `0`.** The purge races your own read of the run's
|
|
68
|
+
* result and generally wins, so `await run.returnValue` on a
|
|
69
|
+
* `experimental_retention: 0` run usually throws `RunExpiredError` rather
|
|
70
|
+
* than resolving. If you need the result, return it through a channel you
|
|
71
|
+
* control, e.g. a step that writes it to external storage.
|
|
72
|
+
*
|
|
73
|
+
* Recorded on the run as the reserved `$retention` attribute, so it
|
|
74
|
+
* requires a World implementing spec version 4 or later. `'default'` is
|
|
75
|
+
* not written at all, keeping it exactly equivalent to omitting the
|
|
76
|
+
* option. Retention is enforced by the World: the first-party Worlds
|
|
77
|
+
* (Vercel, Local, Postgres) implement it, and a World that does not
|
|
78
|
+
* recognize the value keeps the data.
|
|
79
|
+
*/
|
|
80
|
+
experimental_retention?: RunRetention;
|
|
81
|
+
/**
|
|
82
|
+
* The ID of an existing run this run is being replayed from, if any.
|
|
83
|
+
*
|
|
84
|
+
* Recorded on the new run's `executionContext` as `replayedFromRunId` so
|
|
85
|
+
* tooling (e.g. the dashboard runs list) can show that a run originated as
|
|
86
|
+
* a replay and link back to its source. Set automatically by
|
|
87
|
+
* {@link recreateRunFromExisting}; there's usually no reason to pass it
|
|
88
|
+
* directly.
|
|
89
|
+
*
|
|
90
|
+
* Must be a run ID: `wrun_` followed by a 26-char ULID. It's a foreign key
|
|
91
|
+
* to the source run, so `start()` validates the exact shape and rejects
|
|
92
|
+
* anything else rather than persist a lineage link that points at garbage.
|
|
93
|
+
*/
|
|
94
|
+
replayedFromRunId?: string;
|
|
95
|
+
/**
|
|
96
|
+
* Queue namespace of the target deployment. Scopes the workflow queue
|
|
97
|
+
* topic to `__{namespace}_wkf_workflow_*` (e.g. `'eve'`) instead of the
|
|
98
|
+
* default `__wkf_workflow_*`, and is also used for the cross-deployment
|
|
99
|
+
* capability probe. Falls back to `WORKFLOW_QUEUE_NAMESPACE` in the
|
|
100
|
+
* calling process.
|
|
101
|
+
*
|
|
102
|
+
* Within a deployment the env fallback is correct. Cross-context callers
|
|
103
|
+
* (e.g. the observability dashboard replaying a run) must pass the
|
|
104
|
+
* TARGET deployment's namespace explicitly: the env fallback resolves in
|
|
105
|
+
* the caller's process, and a run enqueued to a topic the target has no
|
|
106
|
+
* consumer for is never picked up.
|
|
107
|
+
*/
|
|
108
|
+
namespace?: string;
|
|
13
109
|
}
|
|
14
110
|
export interface StartOptionsWithDeploymentId extends StartOptionsBase {
|
|
15
111
|
/**
|
|
@@ -20,7 +116,10 @@ export interface StartOptionsWithDeploymentId extends StartOptionsBase {
|
|
|
20
116
|
*
|
|
21
117
|
* Set to `'latest'` to automatically resolve the most recent deployment
|
|
22
118
|
* for the current environment (same production target or git branch).
|
|
23
|
-
* This is
|
|
119
|
+
* This is only meaningful in worlds with atomic, immutable deployments
|
|
120
|
+
* (currently Vercel). In other worlds (local dev, Postgres) there is no
|
|
121
|
+
* notion of multiple deployments to resolve between, so `'latest'` has no
|
|
122
|
+
* effect: a warning is logged and the run targets the current deployment.
|
|
24
123
|
*
|
|
25
124
|
* **Note:** When `deploymentId` is provided, the argument and return types become `unknown`
|
|
26
125
|
* since there is no guarantee the types will be consistent across deployments.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/runtime/start.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/runtime/start.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,YAAY,EAEZ,KAAK,EACN,MAAM,iBAAiB,CAAC;AAoCzB,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AA4D/B;;;;;GAKG;AACH,wBAAgB,4BAA4B,IAAI,IAAI,CAEnD;AAED,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC;IAEd;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;;;;;;;;OAUG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEpC;;;;;;;;;;;OAWG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAElC;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACH,sBAAsB,CAAC,EAAE,YAAY,CAAC;IAEtC;;;;;;;;;;;;OAYG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;;;;;;;;OAYG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,4BAA6B,SAAQ,gBAAgB;IACpE;;;;;;;;;;;;;;;OAeG;IACH,YAAY,EAAE,QAAQ,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,+BAAgC,SAAQ,gBAAgB;IACvE,YAAY,CAAC,EAAE,SAAS,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GACpB,4BAA4B,GAC5B,+BAA+B,CAAC;AAEpC;;GAEG;AACH,MAAM,MAAM,gBAAgB,CAAC,KAAK,SAAS,OAAO,EAAE,EAAE,OAAO,IAAI,CAC/D,GAAG,IAAI,EAAE,KAAK,KACX,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtD;;;;;;;GAOG;AAIH,wBAAgB,KAAK,CAAC,KAAK,SAAS,OAAO,EAAE,EAAE,OAAO,EACpD,QAAQ,EAAE,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,gBAAgB,EAC7D,IAAI,EAAE,OAAO,EAAE,EACf,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AAEzB,wBAAgB,KAAK,CAAC,OAAO,EAC3B,QAAQ,EAAE,gBAAgB,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,gBAAgB,EAC1D,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AAGzB,wBAAgB,KAAK,CAAC,KAAK,SAAS,OAAO,EAAE,EAAE,OAAO,EACpD,QAAQ,EAAE,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,gBAAgB,EAC7D,IAAI,EAAE,KAAK,EACX,OAAO,CAAC,EAAE,+BAA+B,GACxC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AAEzB,wBAAgB,KAAK,CAAC,OAAO,EAC3B,QAAQ,EAAE,gBAAgB,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,gBAAgB,EAC1D,OAAO,CAAC,EAAE,+BAA+B,GACxC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC"}
|