@workflow/core 5.0.0-beta.4 → 5.0.0-beta.41
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/attribute-changes.d.ts +7 -0
- package/dist/attribute-changes.d.ts.map +1 -0
- package/dist/attribute-changes.js +25 -0
- package/dist/capabilities.d.ts +33 -1
- package/dist/capabilities.d.ts.map +1 -1
- package/dist/capabilities.js +71 -4
- package/dist/capture-stack.d.ts +16 -0
- package/dist/capture-stack.d.ts.map +1 -0
- package/dist/capture-stack.js +21 -0
- 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 +26 -3
- package/dist/classify-error.d.ts.map +1 -1
- package/dist/classify-error.js +109 -6
- package/dist/context-errors.d.ts +27 -0
- package/dist/context-errors.d.ts.map +1 -0
- package/dist/context-errors.js +101 -0
- package/dist/context-violation-error.d.ts +97 -0
- package/dist/context-violation-error.d.ts.map +1 -0
- package/dist/context-violation-error.js +149 -0
- package/dist/create-hook.d.ts +62 -4
- package/dist/create-hook.d.ts.map +1 -1
- package/dist/create-hook.js +4 -3
- package/dist/define-hook.d.ts.map +1 -1
- package/dist/define-hook.js +20 -5
- package/dist/describe-error.d.ts +70 -0
- package/dist/describe-error.d.ts.map +1 -0
- package/dist/describe-error.js +189 -0
- package/dist/encryption.d.ts +37 -3
- package/dist/encryption.d.ts.map +1 -1
- package/dist/encryption.js +97 -31
- package/dist/events-consumer.d.ts +147 -1
- package/dist/events-consumer.d.ts.map +1 -1
- package/dist/events-consumer.js +444 -43
- package/dist/flushable-stream.d.ts +65 -10
- package/dist/flushable-stream.d.ts.map +1 -1
- package/dist/flushable-stream.js +131 -18
- package/dist/global.d.ts +37 -1
- package/dist/global.d.ts.map +1 -1
- package/dist/global.js +21 -3
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/log-format.d.ts +25 -0
- package/dist/log-format.d.ts.map +1 -0
- package/dist/log-format.js +250 -0
- package/dist/logger.d.ts +29 -30
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +82 -32
- package/dist/private.d.ts +246 -8
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +345 -9
- package/dist/replay-payload-cache.d.ts +68 -0
- package/dist/replay-payload-cache.d.ts.map +1 -0
- package/dist/replay-payload-cache.js +160 -0
- package/dist/runtime/compute-instance.d.ts +12 -0
- package/dist/runtime/compute-instance.d.ts.map +1 -0
- package/dist/runtime/compute-instance.js +13 -0
- package/dist/runtime/constants.d.ts +251 -0
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +425 -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 +25 -0
- package/dist/runtime/get-port-lazy.d.ts.map +1 -0
- package/dist/runtime/get-port-lazy.js +92 -0
- package/dist/runtime/get-world-lazy.d.ts +23 -0
- package/dist/runtime/get-world-lazy.d.ts.map +1 -0
- package/dist/runtime/get-world-lazy.js +46 -0
- package/dist/runtime/helpers.d.ts +327 -10
- package/dist/runtime/helpers.d.ts.map +1 -1
- package/dist/runtime/helpers.js +586 -40
- 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 +124 -0
- package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -0
- package/dist/runtime/quickjs-entrypoint.js +1437 -0
- package/dist/runtime/quickjs-runtime.d.ts +228 -0
- package/dist/runtime/quickjs-runtime.d.ts.map +1 -0
- package/dist/runtime/quickjs-runtime.js +2372 -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 +2098 -0
- package/dist/runtime/replay-budget.d.ts +89 -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 +27 -4
- package/dist/runtime/resume-hook.d.ts.map +1 -1
- package/dist/runtime/resume-hook.js +452 -76
- 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 +8 -2
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +62 -15
- package/dist/runtime/runs.d.ts +54 -3
- package/dist/runtime/runs.d.ts.map +1 -1
- package/dist/runtime/runs.js +119 -13
- package/dist/runtime/start.d.ts +70 -1
- package/dist/runtime/start.d.ts.map +1 -1
- package/dist/runtime/start.js +313 -60
- package/dist/runtime/step-executor.d.ts +177 -0
- package/dist/runtime/step-executor.d.ts.map +1 -0
- package/dist/runtime/step-executor.js +946 -0
- package/dist/runtime/step-latency.d.ts +197 -0
- package/dist/runtime/step-latency.d.ts.map +1 -0
- package/dist/runtime/step-latency.js +207 -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 +69 -0
- package/dist/runtime/suspension-handler.d.ts +109 -7
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +486 -140
- 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 +84 -0
- package/dist/runtime/wait-continuation.d.ts.map +1 -0
- package/dist/runtime/wait-continuation.js +105 -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 +20 -0
- package/dist/runtime/world-compatibility.d.ts.map +1 -0
- package/dist/runtime/world-compatibility.js +32 -0
- package/dist/runtime/world-init.d.ts +50 -0
- package/dist/runtime/world-init.d.ts.map +1 -0
- package/dist/runtime/world-init.js +50 -0
- package/dist/runtime/world.d.ts +14 -2
- package/dist/runtime/world.d.ts.map +1 -1
- package/dist/runtime/world.js +101 -26
- package/dist/runtime.d.ts +17 -12
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +3135 -328
- package/dist/schemas.d.ts +1 -1
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +1 -1
- 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 +17 -0
- package/dist/serialization/client.d.ts.map +1 -0
- package/dist/serialization/client.js +48 -0
- 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 +14 -0
- package/dist/serialization/codec-devalue.d.ts.map +1 -0
- package/dist/serialization/codec-devalue.js +105 -0
- package/dist/serialization/codec.d.ts +125 -0
- package/dist/serialization/codec.d.ts.map +1 -0
- package/dist/serialization/codec.js +17 -0
- package/dist/serialization/compression.d.ts +104 -0
- package/dist/serialization/compression.d.ts.map +1 -0
- package/dist/serialization/compression.js +260 -0
- package/dist/serialization/encryption.d.ts +134 -0
- package/dist/serialization/encryption.d.ts.map +1 -0
- package/dist/serialization/encryption.js +186 -0
- package/dist/serialization/errors.d.ts +34 -0
- package/dist/serialization/errors.d.ts.map +1 -0
- package/dist/serialization/errors.js +59 -0
- package/dist/serialization/format.d.ts +60 -0
- package/dist/serialization/format.d.ts.map +1 -0
- package/dist/serialization/format.js +97 -0
- package/dist/serialization/hardened.d.ts +155 -0
- package/dist/serialization/hardened.d.ts.map +1 -0
- package/dist/serialization/hardened.js +523 -0
- package/dist/serialization/index.d.ts +20 -0
- package/dist/serialization/index.d.ts.map +1 -0
- package/dist/serialization/index.js +22 -0
- 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 +11 -0
- package/dist/serialization/reducers/class.d.ts.map +1 -0
- package/dist/serialization/reducers/class.js +73 -0
- 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 +579 -0
- package/dist/serialization/reducers/common.d.ts +16 -0
- package/dist/serialization/reducers/common.d.ts.map +1 -0
- package/dist/serialization/reducers/common.js +478 -0
- 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 +35 -0
- package/dist/serialization/reducers/step-function.d.ts.map +1 -0
- package/dist/serialization/reducers/step-function.js +104 -0
- package/dist/serialization/step.d.ts +17 -0
- package/dist/serialization/step.d.ts.map +1 -0
- package/dist/serialization/step.js +48 -0
- package/dist/serialization/types.d.ts +273 -0
- package/dist/serialization/types.d.ts.map +1 -0
- package/dist/serialization/types.js +35 -0
- 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 +71 -0
- package/dist/serialization/workflow.d.ts +29 -0
- package/dist/serialization/workflow.d.ts.map +1 -0
- package/dist/serialization/workflow.js +54 -0
- package/dist/serialization-format.d.ts +60 -4
- package/dist/serialization-format.d.ts.map +1 -1
- package/dist/serialization-format.js +276 -56
- package/dist/serialization.d.ts +374 -221
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +2300 -783
- 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/sleep.d.ts.map +1 -1
- package/dist/sleep.js +3 -2
- package/dist/source-map.d.ts +25 -0
- package/dist/source-map.d.ts.map +1 -1
- package/dist/source-map.js +148 -10
- package/dist/step/context-storage.d.ts +61 -2
- package/dist/step/context-storage.d.ts.map +1 -1
- package/dist/step/context-storage.js +7 -5
- package/dist/step/get-closure-vars.d.ts.map +1 -1
- package/dist/step/get-closure-vars.js +3 -2
- package/dist/step/get-step-metadata.d.ts.map +1 -1
- package/dist/step/get-step-metadata.js +3 -2
- package/dist/step/get-workflow-metadata.d.ts.map +1 -1
- package/dist/step/get-workflow-metadata.js +3 -2
- package/dist/step/writable-stream.d.ts.map +1 -1
- package/dist/step/writable-stream.js +71 -7
- package/dist/step.d.ts.map +1 -1
- package/dist/step.js +225 -29
- package/dist/symbols.d.ts +54 -0
- package/dist/symbols.d.ts.map +1 -1
- package/dist/symbols.js +55 -1
- package/dist/telemetry/semantic-conventions.d.ts +265 -2
- package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
- package/dist/telemetry/semantic-conventions.js +190 -1
- package/dist/telemetry.d.ts +73 -0
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +153 -16
- 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 +16 -6
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +25 -16
- 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 +85 -14
- package/dist/vm/script-cache.d.ts +28 -0
- package/dist/vm/script-cache.d.ts.map +1 -0
- package/dist/vm/script-cache.js +140 -0
- package/dist/workflow/abort-controller.d.ts +65 -0
- package/dist/workflow/abort-controller.d.ts.map +1 -0
- package/dist/workflow/abort-controller.js +312 -0
- 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 +48 -0
- package/dist/workflow/create-hook.d.ts.map +1 -1
- package/dist/workflow/create-hook.js +25 -3
- package/dist/workflow/define-hook.d.ts +1 -1
- package/dist/workflow/define-hook.d.ts.map +1 -1
- package/dist/workflow/define-hook.js +8 -4
- package/dist/workflow/get-workflow-metadata.d.ts.map +1 -1
- package/dist/workflow/get-workflow-metadata.js +14 -3
- package/dist/workflow/hook.d.ts.map +1 -1
- package/dist/workflow/hook.js +302 -36
- package/dist/workflow/index.d.ts +1 -0
- package/dist/workflow/index.d.ts.map +1 -1
- package/dist/workflow/index.js +5 -3
- 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 +57 -8
- package/dist/workflow/world-init-stub.d.ts +15 -0
- package/dist/workflow/world-init-stub.d.ts.map +1 -0
- package/dist/workflow/world-init-stub.js +15 -0
- package/dist/workflow.d.ts +79 -3
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +831 -553
- package/docs/api-reference/create-hook.mdx +79 -0
- package/docs/api-reference/create-webhook.mdx +1 -0
- package/docs/api-reference/define-hook.mdx +26 -24
- package/docs/api-reference/fatal-error.mdx +29 -7
- package/docs/api-reference/fetch.mdx +8 -4
- package/docs/api-reference/index.mdx +3 -0
- package/docs/api-reference/set-attributes.mdx +61 -0
- package/docs/api-reference/sleep.mdx +1 -1
- package/docs/foundations/cancellation.mdx +459 -0
- package/docs/foundations/errors-and-retries.mdx +7 -3
- package/docs/foundations/hooks.mdx +29 -0
- package/docs/foundations/idempotency.mdx +243 -11
- package/docs/foundations/index.mdx +1 -23
- package/docs/foundations/meta.json +3 -1
- package/docs/foundations/serialization.mdx +77 -41
- package/docs/foundations/starting-workflows.mdx +79 -2
- package/docs/foundations/streaming.mdx +14 -23
- package/docs/foundations/versioning.mdx +263 -0
- package/docs/how-it-works/cancellation.mdx +287 -0
- package/docs/how-it-works/code-transform.mdx +21 -17
- package/docs/how-it-works/encryption.mdx +5 -5
- package/docs/how-it-works/event-sourcing.mdx +17 -9
- package/docs/how-it-works/framework-integrations.mdx +96 -337
- package/docs/how-it-works/meta.json +2 -1
- package/package.json +31 -13
- 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 -678
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Common reducers and revivers for types shared across all serialization modes.
|
|
3
|
+
*
|
|
4
|
+
* Handles: ArrayBuffer, BigInt, typed arrays, Date, Error, Headers, Map, Set,
|
|
5
|
+
* RegExp, Request, Response, URL, URLSearchParams.
|
|
6
|
+
*
|
|
7
|
+
* Note: Uses Node.js Buffer for base64 encoding/decoding. For environments
|
|
8
|
+
* without Buffer (e.g. QuickJS VM), a polyfill or alternative base64
|
|
9
|
+
* implementation will be needed.
|
|
10
|
+
*/
|
|
11
|
+
import type { Reducers, Revivers } from '../types.js';
|
|
12
|
+
declare function revive(str: string): any;
|
|
13
|
+
export declare function getCommonReducers(_global?: Record<string, any>): Partial<Reducers>;
|
|
14
|
+
export declare function getCommonRevivers(global?: Record<string, any>): Partial<Revivers>;
|
|
15
|
+
export { revive };
|
|
16
|
+
//# sourceMappingURL=common.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../../src/serialization/reducers/common.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA2BH,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAuB,MAAM,aAAa,CAAC;AAqC3E,iBAAS,MAAM,CAAC,GAAG,EAAE,MAAM,OAM1B;AA6ID,wBAAgB,iBAAiB,CAM/B,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAc,GACxC,OAAO,CAAC,QAAQ,CAAC,CAyMnB;AAID,wBAAgB,iBAAiB,CAC/B,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAc,GACvC,OAAO,CAAC,QAAQ,CAAC,CA8InB;AAGD,OAAO,EAAE,MAAM,EAAE,CAAC"}
|
|
@@ -0,0 +1,478 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Common reducers and revivers for types shared across all serialization modes.
|
|
3
|
+
*
|
|
4
|
+
* Handles: ArrayBuffer, BigInt, typed arrays, Date, Error, Headers, Map, Set,
|
|
5
|
+
* RegExp, Request, Response, URL, URLSearchParams.
|
|
6
|
+
*
|
|
7
|
+
* Note: Uses Node.js Buffer for base64 encoding/decoding. For environments
|
|
8
|
+
* without Buffer (e.g. QuickJS VM), a polyfill or alternative base64
|
|
9
|
+
* implementation will be needed.
|
|
10
|
+
*/
|
|
11
|
+
import { types } from 'node:util';
|
|
12
|
+
import { FatalError, HookConflictError, RetryableError, RuntimeDecryptionError, } from '@workflow/errors';
|
|
13
|
+
import { arrayBufferByteLength, dateGetDate, dateGetTime, dateToISOString, hasProperty, headersToEntries, isInstanceOfPrototype, mapToEntries, readProperty, recordGuestCode, regExpFlags, regExpSource, setToValues, urlHref, urlSearchParamsToString, viewInfo, } from '../hardened.js';
|
|
14
|
+
// ---- Base64 helpers ----
|
|
15
|
+
function arrayBufferToBase64(value, offset, length) {
|
|
16
|
+
// Avoid returning falsy value for zero-length buffers
|
|
17
|
+
if (length === 0)
|
|
18
|
+
return '.';
|
|
19
|
+
// Create a proper copy to avoid ArrayBuffer detachment issues
|
|
20
|
+
const uint8 = new Uint8Array(value, offset, length);
|
|
21
|
+
return Buffer.from(uint8).toString('base64');
|
|
22
|
+
}
|
|
23
|
+
function viewToBase64(value) {
|
|
24
|
+
// Read the view's range through internal-slot getters (see hardened.ts):
|
|
25
|
+
// own properties shadowing `buffer`/`byteOffset`/`byteLength` — or patched
|
|
26
|
+
// prototype getters in the sandbox realm — cannot change which bytes are
|
|
27
|
+
// serialized.
|
|
28
|
+
const info = viewInfo(value);
|
|
29
|
+
return arrayBufferToBase64(info.buffer, info.byteOffset, info.byteLength);
|
|
30
|
+
}
|
|
31
|
+
function reviveArrayBuffer(value, global) {
|
|
32
|
+
const base64 = value === '.' ? '' : value;
|
|
33
|
+
const buffer = Buffer.from(base64, 'base64');
|
|
34
|
+
const arrayBuffer = new global.ArrayBuffer(buffer.length);
|
|
35
|
+
const uint8Array = new global.Uint8Array(arrayBuffer);
|
|
36
|
+
uint8Array.set(buffer);
|
|
37
|
+
return arrayBuffer;
|
|
38
|
+
}
|
|
39
|
+
function revive(str) {
|
|
40
|
+
// devalue.stringify() always produces valid JSON: special values
|
|
41
|
+
// (undefined, NaN, Infinity, -0) are encoded as negative integer
|
|
42
|
+
// sentinels and the remaining structure is ordinary JSON. Parsing
|
|
43
|
+
// with JSON.parse yields the flattened form that unflatten() expects.
|
|
44
|
+
return JSON.parse(str);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Reads `error.stack` for serialization. A natural V8 error carries `stack`
|
|
48
|
+
* as an own *accessor* whose first invocation formats and caches the trace.
|
|
49
|
+
* That read is not passive: it executes `Error.prepareStackTrace` when the
|
|
50
|
+
* realm has one installed, and the format-and-cache itself is
|
|
51
|
+
* workflow-visible (a formatter installed later never runs for an
|
|
52
|
+
* already-materialized error). A cold replay repeats neither — it skips
|
|
53
|
+
* dehydration entirely — so the read is recorded as guest code. A
|
|
54
|
+
* data-property `stack` (rehydrated errors, workflow-assigned strings)
|
|
55
|
+
* reads passively.
|
|
56
|
+
*/
|
|
57
|
+
function readErrorStack(value) {
|
|
58
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, 'stack');
|
|
59
|
+
if (descriptor && 'value' in descriptor) {
|
|
60
|
+
return descriptor.value;
|
|
61
|
+
}
|
|
62
|
+
recordGuestCode('getter', 'stack');
|
|
63
|
+
if (descriptor?.get) {
|
|
64
|
+
return descriptor.get.call(value);
|
|
65
|
+
}
|
|
66
|
+
return readProperty(value, 'stack');
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Reduces any native Error instance to the shared `BaseErrorPayload` shape,
|
|
70
|
+
* preserving `cause` only when present (to distinguish "no cause" from
|
|
71
|
+
* "cause is undefined"). Used directly by reducers for subclasses that need
|
|
72
|
+
* to extend the shape with additional fields.
|
|
73
|
+
*
|
|
74
|
+
* `types.isNativeError()` is used instead of `instanceof` for cross-VM safety:
|
|
75
|
+
* errors may originate from a different VM context, and `instanceof` fails
|
|
76
|
+
* across VM boundaries since each context has its own Error constructor.
|
|
77
|
+
*/
|
|
78
|
+
function reduceErrorBase(value) {
|
|
79
|
+
if (!types.isNativeError(value))
|
|
80
|
+
return false;
|
|
81
|
+
// `message`/`cause` are own data properties on natural errors, so the
|
|
82
|
+
// descriptor-based reads cost nothing; a sandbox-defined accessor
|
|
83
|
+
// (e.g. a getter on an Error subclass) is still invoked but recorded.
|
|
84
|
+
const reduced = {
|
|
85
|
+
message: readProperty(value, 'message'),
|
|
86
|
+
stack: readErrorStack(value),
|
|
87
|
+
};
|
|
88
|
+
if (hasProperty(value, 'cause'))
|
|
89
|
+
reduced.cause = readProperty(value, 'cause');
|
|
90
|
+
return reduced;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Reduces a native error to the shared `BaseErrorPayload`, but only when its
|
|
94
|
+
* `name` instance property matches `subclassName`. Used by:
|
|
95
|
+
* - `makeErrorSubclassReducer`, for subclasses whose serialized shape is
|
|
96
|
+
* exactly `BaseErrorPayload`.
|
|
97
|
+
* - Inline reducers for subclasses that extend the shape with additional
|
|
98
|
+
* fields (e.g. `AggregateError.errors`, `RetryableError.retryAfter`).
|
|
99
|
+
*
|
|
100
|
+
* Matching by `value.name` (instead of `value.constructor?.name`) is robust
|
|
101
|
+
* to bundlers that emit the class as an anonymous expression — e.g. Turbopack
|
|
102
|
+
* compiles `export class FatalError extends Error {…}` to a registration call
|
|
103
|
+
* like `e.s(["FatalError", 0, class extends Error {…}])`, and the resulting
|
|
104
|
+
* constructor has `name === ''`. Since every Error subclass we care about
|
|
105
|
+
* sets `this.name` explicitly in its constructor (built-in subclasses do this
|
|
106
|
+
* automatically; `FatalError`/`RetryableError` do it in user code), the
|
|
107
|
+
* instance property is the reliable identity marker across realms and
|
|
108
|
+
* bundlers.
|
|
109
|
+
*/
|
|
110
|
+
function reduceNamedErrorSubclassBase(subclassName, value) {
|
|
111
|
+
if (!types.isNativeError(value))
|
|
112
|
+
return false;
|
|
113
|
+
if (readProperty(value, 'name') !== subclassName)
|
|
114
|
+
return false;
|
|
115
|
+
return reduceErrorBase(value);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Creates a reducer for a built-in Error subclass whose serialized shape is
|
|
119
|
+
* exactly `BaseErrorPayload` (no extra fields). The reducer matches by
|
|
120
|
+
* constructor name (after the isNativeError gate), since `instanceof` may
|
|
121
|
+
* fail across VM boundaries.
|
|
122
|
+
*/
|
|
123
|
+
function makeErrorSubclassReducer(subclassName) {
|
|
124
|
+
return (value) => {
|
|
125
|
+
const base = reduceNamedErrorSubclassBase(subclassName, value);
|
|
126
|
+
if (!base)
|
|
127
|
+
return false;
|
|
128
|
+
return base;
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Creates a reviver for a built-in Error subclass. Reconstructs the correct
|
|
133
|
+
* built-in Error type using the context's constructor. The `cause` option is
|
|
134
|
+
* only passed when the serialized data includes it, preserving the distinction
|
|
135
|
+
* between "no cause" and "cause is undefined".
|
|
136
|
+
*/
|
|
137
|
+
function makeErrorSubclassReviver(global, ctorName) {
|
|
138
|
+
return (value) => {
|
|
139
|
+
const v = value;
|
|
140
|
+
const opts = 'cause' in v ? { cause: v.cause } : undefined;
|
|
141
|
+
const Ctor = global[ctorName];
|
|
142
|
+
const error = new Ctor(v.message, opts);
|
|
143
|
+
if (v.stack !== undefined)
|
|
144
|
+
error.stack = v.stack;
|
|
145
|
+
return error;
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
// ---- Reducers ----
|
|
149
|
+
export function getCommonReducers(
|
|
150
|
+
// The `global` parameter is retained for API compatibility, but the
|
|
151
|
+
// reducers no longer perform `instanceof global.X` checks: classification
|
|
152
|
+
// is done with engine-level brand checks (realm-agnostic, immune to
|
|
153
|
+
// reassigned sandbox globals and `Symbol.hasInstance`), and extraction
|
|
154
|
+
// goes through intrinsics captured at host boot. See ../hardened.ts.
|
|
155
|
+
_global = globalThis) {
|
|
156
|
+
return {
|
|
157
|
+
ArrayBuffer: (value) => types.isArrayBuffer(value) &&
|
|
158
|
+
arrayBufferToBase64(value, 0, arrayBufferByteLength(value)),
|
|
159
|
+
BigInt: (value) =>
|
|
160
|
+
// String(bigint) is a spec-internal numeric conversion — unlike
|
|
161
|
+
// `value.toString()`, it never consults BigInt.prototype.
|
|
162
|
+
typeof value === 'bigint' && String(value),
|
|
163
|
+
BigInt64Array: (value) => types.isBigInt64Array(value) && viewToBase64(value),
|
|
164
|
+
BigUint64Array: (value) => types.isBigUint64Array(value) && viewToBase64(value),
|
|
165
|
+
Date: (value) => {
|
|
166
|
+
// Brand check + captured intrinsics: a sandbox-side patch of
|
|
167
|
+
// `Date.prototype.toISOString` (e.g. a Temporal polyfill wrapping it)
|
|
168
|
+
// is never executed, and cannot perturb VM state during serialization.
|
|
169
|
+
if (!types.isDate(value))
|
|
170
|
+
return false;
|
|
171
|
+
const valid = !Number.isNaN(dateGetDate(value));
|
|
172
|
+
return valid ? dateToISOString(value) : '.';
|
|
173
|
+
},
|
|
174
|
+
// DOMException is a special case: it `instanceof Error` is true in Node,
|
|
175
|
+
// but `types.isNativeError()` returns FALSE for it, so the generic Error
|
|
176
|
+
// reducer (which gates on isNativeError) won't match. Check it explicitly
|
|
177
|
+
// by constructor name + Error inheritance so we catch DOMExceptions from
|
|
178
|
+
// any realm (cross-VM safety: instanceof global.DOMException would fail
|
|
179
|
+
// for instances minted in another context).
|
|
180
|
+
DOMException: (value) => {
|
|
181
|
+
if (value === null || typeof value !== 'object')
|
|
182
|
+
return false;
|
|
183
|
+
const ctor = readProperty(value, 'constructor');
|
|
184
|
+
if (!ctor || readProperty(ctor, 'name') !== 'DOMException')
|
|
185
|
+
return false;
|
|
186
|
+
const reduced = {
|
|
187
|
+
message: readProperty(value, 'message'),
|
|
188
|
+
name: readProperty(value, 'name'),
|
|
189
|
+
stack: readErrorStack(value),
|
|
190
|
+
};
|
|
191
|
+
if (hasProperty(value, 'cause')) {
|
|
192
|
+
reduced.cause = readProperty(value, 'cause');
|
|
193
|
+
}
|
|
194
|
+
return reduced;
|
|
195
|
+
},
|
|
196
|
+
// Error subclass reducers are intentionally placed before the base Error
|
|
197
|
+
// reducer because devalue uses first-match-wins. Subclass-specific reducers
|
|
198
|
+
// must be checked first so that e.g. a TypeError is serialized as "TypeError"
|
|
199
|
+
// rather than falling through to the generic "Error" reducer.
|
|
200
|
+
// See `makeErrorSubclassReducer` for implementation details.
|
|
201
|
+
EvalError: makeErrorSubclassReducer('EvalError'),
|
|
202
|
+
FatalError: makeErrorSubclassReducer('FatalError'),
|
|
203
|
+
HookConflictError: (value) => {
|
|
204
|
+
const base = reduceNamedErrorSubclassBase('HookConflictError', value);
|
|
205
|
+
if (!base)
|
|
206
|
+
return false;
|
|
207
|
+
const reduced = {
|
|
208
|
+
...base,
|
|
209
|
+
token: readProperty(value, 'token'),
|
|
210
|
+
};
|
|
211
|
+
const conflictingRunId = readProperty(value, 'conflictingRunId');
|
|
212
|
+
if (conflictingRunId !== undefined) {
|
|
213
|
+
reduced.conflictingRunId = conflictingRunId;
|
|
214
|
+
}
|
|
215
|
+
return reduced;
|
|
216
|
+
},
|
|
217
|
+
RangeError: makeErrorSubclassReducer('RangeError'),
|
|
218
|
+
ReferenceError: makeErrorSubclassReducer('ReferenceError'),
|
|
219
|
+
// RetryableError carries an extra `retryAfter` Date that we serialize as
|
|
220
|
+
// a numeric epoch timestamp. The Date reducer uses `instanceof global.Date`,
|
|
221
|
+
// which fails for Dates from a different VM realm; serializing as a
|
|
222
|
+
// number sidesteps that issue.
|
|
223
|
+
RetryableError: (value) => {
|
|
224
|
+
const base = reduceNamedErrorSubclassBase('RetryableError', value);
|
|
225
|
+
if (!base)
|
|
226
|
+
return false;
|
|
227
|
+
const retryAfterRaw = readProperty(value, 'retryAfter');
|
|
228
|
+
let retryAfter;
|
|
229
|
+
if (types.isDate(retryAfterRaw)) {
|
|
230
|
+
// Genuine Date (any realm): read the epoch through the intrinsic.
|
|
231
|
+
const t = dateGetTime(retryAfterRaw);
|
|
232
|
+
retryAfter = Number.isNaN(t) ? Date.now() + 1000 : t;
|
|
233
|
+
}
|
|
234
|
+
else if (retryAfterRaw && typeof retryAfterRaw === 'object') {
|
|
235
|
+
// Duck-typed date-like: invoking its getTime() runs workflow code.
|
|
236
|
+
const getTime = readProperty(retryAfterRaw, 'getTime');
|
|
237
|
+
if (typeof getTime === 'function') {
|
|
238
|
+
recordGuestCode('method', 'getTime');
|
|
239
|
+
const t = getTime.call(retryAfterRaw);
|
|
240
|
+
retryAfter = Number.isNaN(t) ? Date.now() + 1000 : t;
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
retryAfter = Date.now() + 1000;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
else if (typeof retryAfterRaw === 'string' ||
|
|
247
|
+
typeof retryAfterRaw === 'number') {
|
|
248
|
+
const t = new Date(retryAfterRaw).getTime();
|
|
249
|
+
retryAfter = Number.isNaN(t) ? Date.now() + 1000 : t;
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
retryAfter = Date.now() + 1000;
|
|
253
|
+
}
|
|
254
|
+
return {
|
|
255
|
+
...base,
|
|
256
|
+
retryAfter,
|
|
257
|
+
};
|
|
258
|
+
},
|
|
259
|
+
// RuntimeDecryptionError carries an extra `context` object (operation,
|
|
260
|
+
// byteLength, formatPrefix) that the generic Error reducer would drop.
|
|
261
|
+
// Preserve it so the diagnostic data survives the run-error round trip.
|
|
262
|
+
RuntimeDecryptionError: (value) => {
|
|
263
|
+
const base = reduceNamedErrorSubclassBase('RuntimeDecryptionError', value);
|
|
264
|
+
if (!base)
|
|
265
|
+
return false;
|
|
266
|
+
const reduced = {
|
|
267
|
+
...base,
|
|
268
|
+
};
|
|
269
|
+
const context = readProperty(value, 'context');
|
|
270
|
+
if (context !== undefined) {
|
|
271
|
+
reduced.context = context;
|
|
272
|
+
}
|
|
273
|
+
return reduced;
|
|
274
|
+
},
|
|
275
|
+
SyntaxError: makeErrorSubclassReducer('SyntaxError'),
|
|
276
|
+
TypeError: makeErrorSubclassReducer('TypeError'),
|
|
277
|
+
URIError: makeErrorSubclassReducer('URIError'),
|
|
278
|
+
// AggregateError is similar to other subclasses but also preserves the
|
|
279
|
+
// `errors` array. We extend the base helper's output here.
|
|
280
|
+
AggregateError: (value) => {
|
|
281
|
+
const base = reduceNamedErrorSubclassBase('AggregateError', value);
|
|
282
|
+
if (!base)
|
|
283
|
+
return false;
|
|
284
|
+
return {
|
|
285
|
+
...base,
|
|
286
|
+
errors: readProperty(value, 'errors'),
|
|
287
|
+
};
|
|
288
|
+
},
|
|
289
|
+
// Base Error reducer — catch-all for any Error instance not matched by a
|
|
290
|
+
// specific subclass reducer above (including user Error subclasses without
|
|
291
|
+
// WORKFLOW_SERIALIZE). Preserves `name` so the error's identity is retained
|
|
292
|
+
// even though the exact class cannot be reconstructed.
|
|
293
|
+
Error: (value) => {
|
|
294
|
+
if (!types.isNativeError(value))
|
|
295
|
+
return false;
|
|
296
|
+
const reduced = {
|
|
297
|
+
name: readProperty(value, 'name'),
|
|
298
|
+
message: readProperty(value, 'message'),
|
|
299
|
+
stack: readErrorStack(value),
|
|
300
|
+
};
|
|
301
|
+
if (hasProperty(value, 'cause')) {
|
|
302
|
+
reduced.cause = readProperty(value, 'cause');
|
|
303
|
+
}
|
|
304
|
+
return reduced;
|
|
305
|
+
},
|
|
306
|
+
Float32Array: (value) => types.isFloat32Array(value) && viewToBase64(value),
|
|
307
|
+
Float64Array: (value) => types.isFloat64Array(value) && viewToBase64(value),
|
|
308
|
+
// Headers is a host class injected into the sandbox, so its (shared)
|
|
309
|
+
// prototype is reachable from workflow code — iterate through the
|
|
310
|
+
// boot-captured iterator instead of a live Symbol.iterator lookup.
|
|
311
|
+
Headers: (value) => isInstanceOfPrototype(value, Headers.prototype) &&
|
|
312
|
+
headersToEntries(value),
|
|
313
|
+
Int8Array: (value) => types.isInt8Array(value) && viewToBase64(value),
|
|
314
|
+
Int16Array: (value) => types.isInt16Array(value) && viewToBase64(value),
|
|
315
|
+
Int32Array: (value) => types.isInt32Array(value) && viewToBase64(value),
|
|
316
|
+
// Engine brand check + host-realm iteration: a patched
|
|
317
|
+
// `Map.prototype[Symbol.iterator]` in the sandbox is never consulted.
|
|
318
|
+
Map: (value) => types.isMap(value) && mapToEntries(value),
|
|
319
|
+
RegExp: (value) => types.isRegExp(value) && {
|
|
320
|
+
source: regExpSource(value),
|
|
321
|
+
flags: regExpFlags(value),
|
|
322
|
+
},
|
|
323
|
+
// Request and Response are intentionally NOT in common reducers.
|
|
324
|
+
// They require mode-specific revivers (stream handling, etc.) and
|
|
325
|
+
// including them here without matching revivers would cause them
|
|
326
|
+
// to deserialize as plain objects.
|
|
327
|
+
Set: (value) => types.isSet(value) && setToValues(value),
|
|
328
|
+
URL: (value) => isInstanceOfPrototype(value, URL.prototype) && urlHref(value),
|
|
329
|
+
WorkflowFunction: (value) => {
|
|
330
|
+
// Only match function references with a workflowId property (set by
|
|
331
|
+
// the SWC compiler on workflow functions). Plain { workflowId } objects
|
|
332
|
+
// are NOT matched — this prevents infinite recursion since the reduced
|
|
333
|
+
// form { workflowId } is a plain object, not a function.
|
|
334
|
+
if (typeof value !== 'function')
|
|
335
|
+
return false;
|
|
336
|
+
const workflowId = readProperty(value, 'workflowId');
|
|
337
|
+
if (typeof workflowId !== 'string')
|
|
338
|
+
return false;
|
|
339
|
+
return { workflowId };
|
|
340
|
+
},
|
|
341
|
+
URLSearchParams: (value) => {
|
|
342
|
+
if (!isInstanceOfPrototype(value, URLSearchParams.prototype)) {
|
|
343
|
+
return false;
|
|
344
|
+
}
|
|
345
|
+
const text = urlSearchParamsToString(value);
|
|
346
|
+
return text === '' ? '.' : text;
|
|
347
|
+
},
|
|
348
|
+
Uint8Array: (value) => types.isUint8Array(value) && viewToBase64(value),
|
|
349
|
+
Uint8ClampedArray: (value) => types.isUint8ClampedArray(value) && viewToBase64(value),
|
|
350
|
+
Uint16Array: (value) => types.isUint16Array(value) && viewToBase64(value),
|
|
351
|
+
Uint32Array: (value) => types.isUint32Array(value) && viewToBase64(value),
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
// ---- Revivers ----
|
|
355
|
+
export function getCommonRevivers(global = globalThis) {
|
|
356
|
+
return {
|
|
357
|
+
ArrayBuffer: (value) => reviveArrayBuffer(value, global),
|
|
358
|
+
BigInt: (value) => global.BigInt(value),
|
|
359
|
+
BigInt64Array: (value) => new global.BigInt64Array(reviveArrayBuffer(value, global)),
|
|
360
|
+
BigUint64Array: (value) => new global.BigUint64Array(reviveArrayBuffer(value, global)),
|
|
361
|
+
Date: (value) => new global.Date(value),
|
|
362
|
+
DOMException: (value) => {
|
|
363
|
+
const error = new global.DOMException(value.message, value.name);
|
|
364
|
+
if (value.stack !== undefined)
|
|
365
|
+
error.stack = value.stack;
|
|
366
|
+
// DOMException's constructor doesn't accept a cause option, so
|
|
367
|
+
// we set it manually when present in the serialized data.
|
|
368
|
+
if ('cause' in value)
|
|
369
|
+
error.cause = value.cause;
|
|
370
|
+
return error;
|
|
371
|
+
},
|
|
372
|
+
// Error subclass revivers reconstruct the correct built-in Error type.
|
|
373
|
+
// See `makeErrorSubclassReviver` for implementation details.
|
|
374
|
+
EvalError: makeErrorSubclassReviver(global, 'EvalError'),
|
|
375
|
+
// `FatalError` and `RetryableError` are not built-ins, so we resolve them
|
|
376
|
+
// from the consumer's `globalThis` via a `Symbol.for(...)` key registered
|
|
377
|
+
// by `@workflow/errors` on load. This makes `instanceof FatalError` work
|
|
378
|
+
// in user code that lives in a different realm than this reducer module
|
|
379
|
+
// (e.g. when the host hydrates a value destined for a workflow VM
|
|
380
|
+
// context). See the registration block at the bottom of
|
|
381
|
+
// `packages/errors/src/index.ts` for details. Falls back to the imported
|
|
382
|
+
// class for environments where no bundled `@workflow/errors` has loaded
|
|
383
|
+
// in the consumer realm.
|
|
384
|
+
FatalError: (value) => {
|
|
385
|
+
const Ctor = global[Symbol.for('@workflow/errors//FatalError')] ?? FatalError;
|
|
386
|
+
const error = new Ctor(value.message);
|
|
387
|
+
if (value.stack !== undefined)
|
|
388
|
+
error.stack = value.stack;
|
|
389
|
+
if ('cause' in value)
|
|
390
|
+
error.cause = value.cause;
|
|
391
|
+
return error;
|
|
392
|
+
},
|
|
393
|
+
HookConflictError: (value) => {
|
|
394
|
+
const Ctor = global[Symbol.for('@workflow/errors//HookConflictError')] ?? HookConflictError;
|
|
395
|
+
const error = new Ctor(value.token, value.conflictingRunId);
|
|
396
|
+
if (value.stack !== undefined)
|
|
397
|
+
error.stack = value.stack;
|
|
398
|
+
if ('cause' in value) {
|
|
399
|
+
error.cause = value.cause;
|
|
400
|
+
}
|
|
401
|
+
return error;
|
|
402
|
+
},
|
|
403
|
+
RangeError: makeErrorSubclassReviver(global, 'RangeError'),
|
|
404
|
+
ReferenceError: makeErrorSubclassReviver(global, 'ReferenceError'),
|
|
405
|
+
RetryableError: (value) => {
|
|
406
|
+
// Use the context's `Date` constructor (matching the rest of this
|
|
407
|
+
// module) so the resulting `retryAfter` Date passes `instanceof
|
|
408
|
+
// global.Date` checks in the target realm. See the FatalError reviver
|
|
409
|
+
// above for why we resolve `RetryableError` from the consumer's
|
|
410
|
+
// globalThis instead of the imported class.
|
|
411
|
+
const Ctor = global[Symbol.for('@workflow/errors//RetryableError')] ?? RetryableError;
|
|
412
|
+
const error = new Ctor(value.message, {
|
|
413
|
+
retryAfter: new global.Date(value.retryAfter),
|
|
414
|
+
});
|
|
415
|
+
if (value.stack !== undefined)
|
|
416
|
+
error.stack = value.stack;
|
|
417
|
+
if ('cause' in value)
|
|
418
|
+
error.cause = value.cause;
|
|
419
|
+
return error;
|
|
420
|
+
},
|
|
421
|
+
RuntimeDecryptionError: (value) => {
|
|
422
|
+
// Resolve from the consumer's globalThis (see the FatalError reviver
|
|
423
|
+
// above) so `instanceof RuntimeDecryptionError` holds across realms.
|
|
424
|
+
const Ctor = global[Symbol.for('@workflow/errors//RuntimeDecryptionError')] ??
|
|
425
|
+
RuntimeDecryptionError;
|
|
426
|
+
const opts = {};
|
|
427
|
+
if ('cause' in value)
|
|
428
|
+
opts.cause = value.cause;
|
|
429
|
+
if (value.context !== undefined)
|
|
430
|
+
opts.context = value.context;
|
|
431
|
+
const error = new Ctor(value.message, opts);
|
|
432
|
+
if (value.stack !== undefined)
|
|
433
|
+
error.stack = value.stack;
|
|
434
|
+
return error;
|
|
435
|
+
},
|
|
436
|
+
SyntaxError: makeErrorSubclassReviver(global, 'SyntaxError'),
|
|
437
|
+
TypeError: makeErrorSubclassReviver(global, 'TypeError'),
|
|
438
|
+
URIError: makeErrorSubclassReviver(global, 'URIError'),
|
|
439
|
+
AggregateError: (value) => {
|
|
440
|
+
const opts = 'cause' in value ? { cause: value.cause } : undefined;
|
|
441
|
+
const error = new global.AggregateError(value.errors, value.message, opts);
|
|
442
|
+
if (value.stack !== undefined)
|
|
443
|
+
error.stack = value.stack;
|
|
444
|
+
return error;
|
|
445
|
+
},
|
|
446
|
+
// Base Error reviver — used for plain Error instances and unrecognized
|
|
447
|
+
// Error subclasses. Preserves `name` so the error's identity is retained.
|
|
448
|
+
Error: (value) => {
|
|
449
|
+
const opts = 'cause' in value ? { cause: value.cause } : undefined;
|
|
450
|
+
const error = new global.Error(value.message, opts);
|
|
451
|
+
error.name = value.name;
|
|
452
|
+
if (value.stack !== undefined)
|
|
453
|
+
error.stack = value.stack;
|
|
454
|
+
return error;
|
|
455
|
+
},
|
|
456
|
+
Float32Array: (value) => new global.Float32Array(reviveArrayBuffer(value, global)),
|
|
457
|
+
Float64Array: (value) => new global.Float64Array(reviveArrayBuffer(value, global)),
|
|
458
|
+
Headers: (value) => new global.Headers(value),
|
|
459
|
+
Int8Array: (value) => new global.Int8Array(reviveArrayBuffer(value, global)),
|
|
460
|
+
Int16Array: (value) => new global.Int16Array(reviveArrayBuffer(value, global)),
|
|
461
|
+
Int32Array: (value) => new global.Int32Array(reviveArrayBuffer(value, global)),
|
|
462
|
+
Map: (value) => new global.Map(value),
|
|
463
|
+
RegExp: (value) => new global.RegExp(value.source, value.flags),
|
|
464
|
+
Set: (value) => new global.Set(value),
|
|
465
|
+
URL: (value) => new global.URL(value),
|
|
466
|
+
WorkflowFunction: (value) => Object.assign(() => {
|
|
467
|
+
throw new Error('Workflow functions cannot be called directly. Use start() to invoke them.');
|
|
468
|
+
}, { workflowId: value.workflowId }),
|
|
469
|
+
URLSearchParams: (value) => new global.URLSearchParams(value === '.' ? '' : value),
|
|
470
|
+
Uint8Array: (value) => new global.Uint8Array(reviveArrayBuffer(value, global)),
|
|
471
|
+
Uint8ClampedArray: (value) => new global.Uint8ClampedArray(reviveArrayBuffer(value, global)),
|
|
472
|
+
Uint16Array: (value) => new global.Uint16Array(reviveArrayBuffer(value, global)),
|
|
473
|
+
Uint32Array: (value) => new global.Uint32Array(reviveArrayBuffer(value, global)),
|
|
474
|
+
};
|
|
475
|
+
}
|
|
476
|
+
// Re-export for use in legacy compat
|
|
477
|
+
export { revive };
|
|
478
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcmlhbGl6YXRpb24vcmVkdWNlcnMvY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7R0FTRztBQUVILE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUNMLFVBQVUsRUFDVixpQkFBaUIsRUFDakIsY0FBYyxFQUNkLHNCQUFzQixHQUN2QixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsV0FBVyxFQUNYLFdBQVcsRUFDWCxlQUFlLEVBQ2YsV0FBVyxFQUNYLGdCQUFnQixFQUNoQixxQkFBcUIsRUFDckIsWUFBWSxFQUNaLFlBQVksRUFDWixlQUFlLEVBQ2YsV0FBVyxFQUNYLFlBQVksRUFDWixXQUFXLEVBQ1gsT0FBTyxFQUNQLHVCQUF1QixFQUN2QixRQUFRLEdBQ1QsTUFBTSxnQkFBZ0IsQ0FBQztBQUd4QiwyQkFBMkI7QUFFM0IsU0FBUyxtQkFBbUIsQ0FDMUIsS0FBc0IsRUFDdEIsTUFBYyxFQUNkLE1BQWM7SUFFZCxzREFBc0Q7SUFDdEQsSUFBSSxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sR0FBRyxDQUFDO0lBQzdCLDhEQUE4RDtJQUM5RCxNQUFNLEtBQUssR0FBRyxJQUFJLFVBQVUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3BELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDL0MsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLEtBQXNCO0lBQzFDLHlFQUF5RTtJQUN6RSwyRUFBMkU7SUFDM0UseUVBQXlFO0lBQ3pFLGNBQWM7SUFDZCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0IsT0FBTyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQzVFLENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUN4QixLQUFhLEVBQ2IsTUFBMkI7SUFFM0IsTUFBTSxNQUFNLEdBQUcsS0FBSyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDMUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDN0MsTUFBTSxXQUFXLEdBQUcsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMxRCxNQUFNLFVBQVUsR0FBRyxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDdEQsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2QixPQUFPLFdBQVcsQ0FBQztBQUNyQixDQUFDO0FBRUQsU0FBUyxNQUFNLENBQUMsR0FBVztJQUN6QixpRUFBaUU7SUFDakUsaUVBQWlFO0lBQ2pFLGtFQUFrRTtJQUNsRSxzRUFBc0U7SUFDdEUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLENBQUM7QUE4QkQ7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQVMsY0FBYyxDQUFDLEtBQWM7SUFDcEMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUFDLEtBQWUsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM3RSxJQUFJLFVBQVUsSUFBSSxPQUFPLElBQUksVUFBVSxFQUFFLENBQUM7UUFDeEMsT0FBTyxVQUFVLENBQUMsS0FBMkIsQ0FBQztJQUNoRCxDQUFDO0lBQ0QsZUFBZSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNuQyxJQUFJLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUNwQixPQUFPLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBdUIsQ0FBQztJQUMxRCxDQUFDO0lBQ0QsT0FBTyxZQUFZLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBdUIsQ0FBQztBQUM1RCxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBUyxlQUFlLENBQUMsS0FBYztJQUNyQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUM5QyxzRUFBc0U7SUFDdEUsa0VBQWtFO0lBQ2xFLHNFQUFzRTtJQUN0RSxNQUFNLE9BQU8sR0FBcUI7UUFDaEMsT0FBTyxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFXO1FBQ2pELEtBQUssRUFBRSxjQUFjLENBQUMsS0FBSyxDQUFDO0tBQzdCLENBQUM7SUFDRixJQUFJLFdBQVcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDO1FBQUUsT0FBTyxDQUFDLEtBQUssR0FBRyxZQUFZLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzlFLE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxTQUFTLDRCQUE0QixDQUNuQyxZQUFvQixFQUNwQixLQUFjO0lBRWQsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDOUMsSUFBSSxZQUFZLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLFlBQVk7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUMvRCxPQUFPLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNoQyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLHdCQUF3QixDQUMvQixZQUFlO0lBRWYsT0FBTyxDQUFDLEtBQWMsRUFBa0MsRUFBRTtRQUN4RCxNQUFNLElBQUksR0FBRyw0QkFBNEIsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUN4QixPQUFPLElBQThCLENBQUM7SUFDeEMsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyx3QkFBd0IsQ0FDL0IsTUFBMkIsRUFDM0IsUUFBZ0I7SUFFaEIsT0FBTyxDQUFDLEtBQTZCLEVBQUUsRUFBRTtRQUN2QyxNQUFNLENBQUMsR0FBRyxLQUF5QixDQUFDO1FBQ3BDLE1BQU0sSUFBSSxHQUFHLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQzNELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM5QixNQUFNLEtBQUssR0FBVSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxDQUFDLEtBQUssS0FBSyxTQUFTO1lBQUUsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ2pELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVELHFCQUFxQjtBQUVyQixNQUFNLFVBQVUsaUJBQWlCO0FBQy9CLG9FQUFvRTtBQUNwRSwwRUFBMEU7QUFDMUUsb0VBQW9FO0FBQ3BFLHVFQUF1RTtBQUN2RSxxRUFBcUU7QUFDckUsVUFBK0IsVUFBVTtJQUV6QyxPQUFPO1FBQ0wsV0FBVyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDckIsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7WUFDMUIsbUJBQW1CLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3RCxNQUFNLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUNoQixnRUFBZ0U7UUFDaEUsMERBQTBEO1FBQzFELE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQzVDLGFBQWEsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ3ZCLEtBQUssQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQztRQUNyRCxjQUFjLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUN4QixLQUFLLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQztRQUN0RCxJQUFJLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNkLDZEQUE2RDtZQUM3RCxzRUFBc0U7WUFDdEUsdUVBQXVFO1lBQ3ZFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUN2QyxNQUFNLEtBQUssR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDaEQsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQzlDLENBQUM7UUFDRCx5RUFBeUU7UUFDekUseUVBQXlFO1FBQ3pFLDBFQUEwRTtRQUMxRSx5RUFBeUU7UUFDekUsd0VBQXdFO1FBQ3hFLDRDQUE0QztRQUM1QyxZQUFZLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN0QixJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUM5RCxNQUFNLElBQUksR0FBRyxZQUFZLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBQ2hELElBQUksQ0FBQyxJQUFJLElBQUksWUFBWSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsS0FBSyxjQUFjO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQ3pFLE1BQU0sT0FBTyxHQUF3QztnQkFDbkQsT0FBTyxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFXO2dCQUNqRCxJQUFJLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQVc7Z0JBQzNDLEtBQUssRUFBRSxjQUFjLENBQUMsS0FBSyxDQUFDO2FBQzdCLENBQUM7WUFDRixJQUFJLFdBQVcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDaEMsT0FBTyxDQUFDLEtBQUssR0FBRyxZQUFZLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQy9DLENBQUM7WUFDRCxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO1FBQ0QseUVBQXlFO1FBQ3pFLDRFQUE0RTtRQUM1RSw4RUFBOEU7UUFDOUUsOERBQThEO1FBQzlELDZEQUE2RDtRQUM3RCxTQUFTLEVBQUUsd0JBQXdCLENBQUMsV0FBVyxDQUFDO1FBQ2hELFVBQVUsRUFBRSx3QkFBd0IsQ0FBQyxZQUFZLENBQUM7UUFDbEQsaUJBQWlCLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUMzQixNQUFNLElBQUksR0FBRyw0QkFBNEIsQ0FBQyxtQkFBbUIsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN0RSxJQUFJLENBQUMsSUFBSTtnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUN4QixNQUFNLE9BQU8sR0FBNkM7Z0JBQ3hELEdBQUcsSUFBSTtnQkFDUCxLQUFLLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQStCO2FBQ2xFLENBQUM7WUFDRixNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLENBRWxELENBQUM7WUFDZCxJQUFJLGdCQUFnQixLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUNuQyxPQUFPLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7WUFDOUMsQ0FBQztZQUNELE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUM7UUFDRCxVQUFVLEVBQUUsd0JBQXdCLENBQUMsWUFBWSxDQUFDO1FBQ2xELGNBQWMsRUFBRSx3QkFBd0IsQ0FBQyxnQkFBZ0IsQ0FBQztRQUMxRCx5RUFBeUU7UUFDekUsNkVBQTZFO1FBQzdFLG9FQUFvRTtRQUNwRSwrQkFBK0I7UUFDL0IsY0FBYyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDeEIsTUFBTSxJQUFJLEdBQUcsNEJBQTRCLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDbkUsSUFBSSxDQUFDLElBQUk7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDeEIsTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztZQUN4RCxJQUFJLFVBQWtCLENBQUM7WUFDdkIsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7Z0JBQ2hDLGtFQUFrRTtnQkFDbEUsTUFBTSxDQUFDLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUNyQyxVQUFVLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZELENBQUM7aUJBQU0sSUFBSSxhQUFhLElBQUksT0FBTyxhQUFhLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzlELG1FQUFtRTtnQkFDbkUsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFDdkQsSUFBSSxPQUFPLE9BQU8sS0FBSyxVQUFVLEVBQUUsQ0FBQztvQkFDbEMsZUFBZSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztvQkFDckMsTUFBTSxDQUFDLEdBQUksT0FBcUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7b0JBQ3JFLFVBQVUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZELENBQUM7cUJBQU0sQ0FBQztvQkFDTixVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztnQkFDakMsQ0FBQztZQUNILENBQUM7aUJBQU0sSUFDTCxPQUFPLGFBQWEsS0FBSyxRQUFRO2dCQUNqQyxPQUFPLGFBQWEsS0FBSyxRQUFRLEVBQ2pDLENBQUM7Z0JBQ0QsTUFBTSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQzVDLFVBQVUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkQsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO1lBQ2pDLENBQUM7WUFDRCxPQUFPO2dCQUNMLEdBQUcsSUFBSTtnQkFDUCxVQUFVO2FBQ3FDLENBQUM7UUFDcEQsQ0FBQztRQUNELHVFQUF1RTtRQUN2RSx1RUFBdUU7UUFDdkUsd0VBQXdFO1FBQ3hFLHNCQUFzQixFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDaEMsTUFBTSxJQUFJLEdBQUcsNEJBQTRCLENBQ3ZDLHdCQUF3QixFQUN4QixLQUFLLENBQ04sQ0FBQztZQUNGLElBQUksQ0FBQyxJQUFJO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQ3hCLE1BQU0sT0FBTyxHQUFrRDtnQkFDN0QsR0FBRyxJQUFJO2FBQ1IsQ0FBQztZQUNGLE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUVoQyxDQUFDO1lBQ2QsSUFBSSxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQzFCLE9BQU8sQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1lBQzVCLENBQUM7WUFDRCxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO1FBQ0QsV0FBVyxFQUFFLHdCQUF3QixDQUFDLGFBQWEsQ0FBQztRQUNwRCxTQUFTLEVBQUUsd0JBQXdCLENBQUMsV0FBVyxDQUFDO1FBQ2hELFFBQVEsRUFBRSx3QkFBd0IsQ0FBQyxVQUFVLENBQUM7UUFDOUMsdUVBQXVFO1FBQ3ZFLDJEQUEyRDtRQUMzRCxjQUFjLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN4QixNQUFNLElBQUksR0FBRyw0QkFBNEIsQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNuRSxJQUFJLENBQUMsSUFBSTtnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUN4QixPQUFPO2dCQUNMLEdBQUcsSUFBSTtnQkFDUCxNQUFNLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQTZCO2FBQ2xCLENBQUM7UUFDcEQsQ0FBQztRQUNELHlFQUF5RTtRQUN6RSwyRUFBMkU7UUFDM0UsNEVBQTRFO1FBQzVFLHVEQUF1RDtRQUN2RCxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNmLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQztnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUM5QyxNQUFNLE9BQU8sR0FBaUM7Z0JBQzVDLElBQUksRUFBRSxZQUFZLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBVztnQkFDM0MsT0FBTyxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFXO2dCQUNqRCxLQUFLLEVBQUUsY0FBYyxDQUFDLEtBQUssQ0FBQzthQUM3QixDQUFDO1lBQ0YsSUFBSSxXQUFXLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ2hDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztZQUMvQyxDQUFDO1lBQ0QsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztRQUNELFlBQVksRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDO1FBQzNFLFlBQVksRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDO1FBQzNFLHFFQUFxRTtRQUNyRSxrRUFBa0U7UUFDbEUsbUVBQW1FO1FBQ25FLE9BQU8sRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ2pCLHFCQUFxQixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDO1lBQy9DLGdCQUFnQixDQUFDLEtBQWdCLENBQUM7UUFDcEMsU0FBUyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUM7UUFDckUsVUFBVSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUM7UUFDdkUsVUFBVSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUM7UUFDdkUsdURBQXVEO1FBQ3ZELHNFQUFzRTtRQUN0RSxHQUFHLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUNiLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksWUFBWSxDQUFDLEtBQThCLENBQUM7UUFDcEUsTUFBTSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDaEIsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSTtZQUN2QixNQUFNLEVBQUUsWUFBWSxDQUFDLEtBQUssQ0FBQztZQUMzQixLQUFLLEVBQUUsV0FBVyxDQUFDLEtBQUssQ0FBQztTQUMxQjtRQUNILGlFQUFpRTtRQUNqRSxrRUFBa0U7UUFDbEUsaUVBQWlFO1FBQ2pFLG1DQUFtQztRQUNuQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksV0FBVyxDQUFDLEtBQXFCLENBQUM7UUFDeEUsR0FBRyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDYixxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxLQUFZLENBQUM7UUFDdEUsZ0JBQWdCLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUMxQixvRUFBb0U7WUFDcEUsd0VBQXdFO1lBQ3hFLHVFQUF1RTtZQUN2RSx5REFBeUQ7WUFDekQsSUFBSSxPQUFPLEtBQUssS0FBSyxVQUFVO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQzlDLE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDckQsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQ2pELE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FBQztRQUN4QixDQUFDO1FBQ0QsZUFBZSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDekIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssRUFBRSxlQUFlLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDN0QsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBQ0QsTUFBTSxJQUFJLEdBQUcsdUJBQXVCLENBQUMsS0FBd0IsQ0FBQyxDQUFDO1lBQy9ELE9BQU8sSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDbEMsQ0FBQztRQUNELFVBQVUsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDO1FBQ3ZFLGlCQUFpQixFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDM0IsS0FBSyxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUM7UUFDekQsV0FBVyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUM7UUFDekUsV0FBVyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUM7S0FDMUUsQ0FBQztBQUNKLENBQUM7QUFFRCxxQkFBcUI7QUFFckIsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixTQUE4QixVQUFVO0lBRXhDLE9BQU87UUFDTCxXQUFXLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUM7UUFDaEUsTUFBTSxFQUFFLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUMvQyxhQUFhLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUMvQixJQUFJLE1BQU0sQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzVELGNBQWMsRUFBRSxDQUFDLEtBQWEsRUFBRSxFQUFFLENBQ2hDLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDN0QsSUFBSSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3ZDLFlBQVksRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3RCLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqRSxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUztnQkFBRSxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDekQsK0RBQStEO1lBQy9ELDBEQUEwRDtZQUMxRCxJQUFJLE9BQU8sSUFBSSxLQUFLO2dCQUFFLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUNoRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCx1RUFBdUU7UUFDdkUsNkRBQTZEO1FBQzdELFNBQVMsRUFBRSx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDO1FBQ3hELDBFQUEwRTtRQUMxRSwwRUFBMEU7UUFDMUUseUVBQXlFO1FBQ3pFLHdFQUF3RTtRQUN4RSxrRUFBa0U7UUFDbEUsd0RBQXdEO1FBQ3hELHlFQUF5RTtRQUN6RSx3RUFBd0U7UUFDeEUseUJBQXlCO1FBQ3pCLFVBQVUsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3BCLE1BQU0sSUFBSSxHQUNOLE1BQWtDLENBQ2xDLE1BQU0sQ0FBQyxHQUFHLENBQUMsOEJBQThCLENBQUMsQ0FDVCxJQUFJLFVBQVUsQ0FBQztZQUNwRCxNQUFNLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdEMsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVM7Z0JBQUUsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ3pELElBQUksT0FBTyxJQUFJLEtBQUs7Z0JBQUUsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ2hELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELGlCQUFpQixFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDM0IsTUFBTSxJQUFJLEdBQ04sTUFBa0MsQ0FDbEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUNULElBQUksaUJBQWlCLENBQUM7WUFDbEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUM1RCxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUztnQkFBRSxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDekQsSUFBSSxPQUFPLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ3BCLEtBQXFDLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDN0QsQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELFVBQVUsRUFBRSx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDO1FBQzFELGNBQWMsRUFBRSx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLENBQUM7UUFDbEUsY0FBYyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDeEIsa0VBQWtFO1lBQ2xFLGdFQUFnRTtZQUNoRSxzRUFBc0U7WUFDdEUsZ0VBQWdFO1lBQ2hFLDRDQUE0QztZQUM1QyxNQUFNLElBQUksR0FDTixNQUFrQyxDQUNsQyxNQUFNLENBQUMsR0FBRyxDQUFDLGtDQUFrQyxDQUFDLENBQ1QsSUFBSSxjQUFjLENBQUM7WUFDNUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRTtnQkFDcEMsVUFBVSxFQUFFLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDO2FBQzlDLENBQUMsQ0FBQztZQUNILElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxTQUFTO2dCQUFFLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUN6RCxJQUFJLE9BQU8sSUFBSSxLQUFLO2dCQUFFLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUNoRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxzQkFBc0IsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ2hDLHFFQUFxRTtZQUNyRSxxRUFBcUU7WUFDckUsTUFBTSxJQUFJLEdBQ04sTUFBa0MsQ0FDbEMsTUFBTSxDQUFDLEdBQUcsQ0FBQywwQ0FBMEMsQ0FBQyxDQUNUO2dCQUMvQyxzQkFBc0IsQ0FBQztZQUN6QixNQUFNLElBQUksR0FBNEQsRUFBRSxDQUFDO1lBQ3pFLElBQUksT0FBTyxJQUFJLEtBQUs7Z0JBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQy9DLElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxTQUFTO2dCQUFFLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztZQUM5RCxNQUFNLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzVDLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxTQUFTO2dCQUFFLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUN6RCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxXQUFXLEVBQUUsd0JBQXdCLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQztRQUM1RCxTQUFTLEVBQUUsd0JBQXdCLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQztRQUN4RCxRQUFRLEVBQUUsd0JBQXdCLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQztRQUN0RCxjQUFjLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN4QixNQUFNLElBQUksR0FBRyxPQUFPLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUNuRSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQ3JDLEtBQUssQ0FBQyxNQUFNLEVBQ1osS0FBSyxDQUFDLE9BQU8sRUFDYixJQUFJLENBQ0wsQ0FBQztZQUNGLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxTQUFTO2dCQUFFLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUN6RCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCx1RUFBdUU7UUFDdkUsMEVBQTBFO1FBQzFFLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ2YsTUFBTSxJQUFJLEdBQUcsT0FBTyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDbkUsTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDcEQsS0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO1lBQ3hCLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxTQUFTO2dCQUFFLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUN6RCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxZQUFZLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUM5QixJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzNELFlBQVksRUFBRSxDQUFDLEtBQWEsRUFBRSxFQUFFLENBQzlCLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDM0QsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQzdDLFNBQVMsRUFBRSxDQUFDLEtBQWEsRUFBRSxFQUFFLENBQzNCLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDeEQsVUFBVSxFQUFFLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FDNUIsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN6RCxVQUFVLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUM1QixJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3pELEdBQUcsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztRQUNyQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDL0QsR0FBRyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO1FBQ3JDLEdBQUcsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztRQUNyQyxnQkFBZ0IsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQzFCLE1BQU0sQ0FBQyxNQUFNLENBQ1gsR0FBRyxFQUFFO1lBQ0gsTUFBTSxJQUFJLEtBQUssQ0FDYiwyRUFBMkUsQ0FDNUUsQ0FBQztRQUNKLENBQUMsRUFDRCxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQ2pDO1FBQ0gsZUFBZSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDekIsSUFBSSxNQUFNLENBQUMsZUFBZSxDQUFDLEtBQUssS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ3hELFVBQVUsRUFBRSxDQUFDLEtBQWEsRUFBRSxFQUFFLENBQzVCLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDekQsaUJBQWlCLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUNuQyxJQUFJLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDaEUsV0FBVyxFQUFFLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FDN0IsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMxRCxXQUFXLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUM3QixJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0tBQzNELENBQUM7QUFDSixDQUFDO0FBRUQscUNBQXFDO0FBQ3JDLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29tbW9uIHJlZHVjZXJzIGFuZCByZXZpdmVycyBmb3IgdHlwZXMgc2hhcmVkIGFjcm9zcyBhbGwgc2VyaWFsaXphdGlvbiBtb2Rlcy5cbiAqXG4gKiBIYW5kbGVzOiBBcnJheUJ1ZmZlciwgQmlnSW50LCB0eXBlZCBhcnJheXMsIERhdGUsIEVycm9yLCBIZWFkZXJzLCBNYXAsIFNldCxcbiAqIFJlZ0V4cCwgUmVxdWVzdCwgUmVzcG9uc2UsIFVSTCwgVVJMU2VhcmNoUGFyYW1zLlxuICpcbiAqIE5vdGU6IFVzZXMgTm9kZS5qcyBCdWZmZXIgZm9yIGJhc2U2NCBlbmNvZGluZy9kZWNvZGluZy4gRm9yIGVudmlyb25tZW50c1xuICogd2l0aG91dCBCdWZmZXIgKGUuZy4gUXVpY2tKUyBWTSksIGEgcG9seWZpbGwgb3IgYWx0ZXJuYXRpdmUgYmFzZTY0XG4gKiBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIG5lZWRlZC5cbiAqL1xuXG5pbXBvcnQgeyB0eXBlcyB9IGZyb20gJ25vZGU6dXRpbCc7XG5pbXBvcnQge1xuICBGYXRhbEVycm9yLFxuICBIb29rQ29uZmxpY3RFcnJvcixcbiAgUmV0cnlhYmxlRXJyb3IsXG4gIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHtcbiAgYXJyYXlCdWZmZXJCeXRlTGVuZ3RoLFxuICBkYXRlR2V0RGF0ZSxcbiAgZGF0ZUdldFRpbWUsXG4gIGRhdGVUb0lTT1N0cmluZyxcbiAgaGFzUHJvcGVydHksXG4gIGhlYWRlcnNUb0VudHJpZXMsXG4gIGlzSW5zdGFuY2VPZlByb3RvdHlwZSxcbiAgbWFwVG9FbnRyaWVzLFxuICByZWFkUHJvcGVydHksXG4gIHJlY29yZEd1ZXN0Q29kZSxcbiAgcmVnRXhwRmxhZ3MsXG4gIHJlZ0V4cFNvdXJjZSxcbiAgc2V0VG9WYWx1ZXMsXG4gIHVybEhyZWYsXG4gIHVybFNlYXJjaFBhcmFtc1RvU3RyaW5nLFxuICB2aWV3SW5mbyxcbn0gZnJvbSAnLi4vaGFyZGVuZWQuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWR1Y2VycywgUmV2aXZlcnMsIFNlcmlhbGl6YWJsZVNwZWNpYWwgfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbi8vIC0tLS0gQmFzZTY0IGhlbHBlcnMgLS0tLVxuXG5mdW5jdGlvbiBhcnJheUJ1ZmZlclRvQmFzZTY0KFxuICB2YWx1ZTogQXJyYXlCdWZmZXJMaWtlLFxuICBvZmZzZXQ6IG51bWJlcixcbiAgbGVuZ3RoOiBudW1iZXJcbik6IHN0cmluZyB7XG4gIC8vIEF2b2lkIHJldHVybmluZyBmYWxzeSB2YWx1ZSBmb3IgemVyby1sZW5ndGggYnVmZmVyc1xuICBpZiAobGVuZ3RoID09PSAwKSByZXR1cm4gJy4nO1xuICAvLyBDcmVhdGUgYSBwcm9wZXIgY29weSB0byBhdm9pZCBBcnJheUJ1ZmZlciBkZXRhY2htZW50IGlzc3Vlc1xuICBjb25zdCB1aW50OCA9IG5ldyBVaW50OEFycmF5KHZhbHVlLCBvZmZzZXQsIGxlbmd0aCk7XG4gIHJldHVybiBCdWZmZXIuZnJvbSh1aW50OCkudG9TdHJpbmcoJ2Jhc2U2NCcpO1xufVxuXG5mdW5jdGlvbiB2aWV3VG9CYXNlNjQodmFsdWU6IEFycmF5QnVmZmVyVmlldyk6IHN0cmluZyB7XG4gIC8vIFJlYWQgdGhlIHZpZXcncyByYW5nZSB0aHJvdWdoIGludGVybmFsLXNsb3QgZ2V0dGVycyAoc2VlIGhhcmRlbmVkLnRzKTpcbiAgLy8gb3duIHByb3BlcnRpZXMgc2hhZG93aW5nIGBidWZmZXJgL2BieXRlT2Zmc2V0YC9gYnl0ZUxlbmd0aGAg4oCUIG9yIHBhdGNoZWRcbiAgLy8gcHJvdG90eXBlIGdldHRlcnMgaW4gdGhlIHNhbmRib3ggcmVhbG0g4oCUIGNhbm5vdCBjaGFuZ2Ugd2hpY2ggYnl0ZXMgYXJlXG4gIC8vIHNlcmlhbGl6ZWQuXG4gIGNvbnN0IGluZm8gPSB2aWV3SW5mbyh2YWx1ZSk7XG4gIHJldHVybiBhcnJheUJ1ZmZlclRvQmFzZTY0KGluZm8uYnVmZmVyLCBpbmZvLmJ5dGVPZmZzZXQsIGluZm8uYnl0ZUxlbmd0aCk7XG59XG5cbmZ1bmN0aW9uIHJldml2ZUFycmF5QnVmZmVyKFxuICB2YWx1ZTogc3RyaW5nLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT5cbik6IEFycmF5QnVmZmVyIHtcbiAgY29uc3QgYmFzZTY0ID0gdmFsdWUgPT09ICcuJyA/ICcnIDogdmFsdWU7XG4gIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGJhc2U2NCwgJ2Jhc2U2NCcpO1xuICBjb25zdCBhcnJheUJ1ZmZlciA9IG5ldyBnbG9iYWwuQXJyYXlCdWZmZXIoYnVmZmVyLmxlbmd0aCk7XG4gIGNvbnN0IHVpbnQ4QXJyYXkgPSBuZXcgZ2xvYmFsLlVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpO1xuICB1aW50OEFycmF5LnNldChidWZmZXIpO1xuICByZXR1cm4gYXJyYXlCdWZmZXI7XG59XG5cbmZ1bmN0aW9uIHJldml2ZShzdHI6IHN0cmluZykge1xuICAvLyBkZXZhbHVlLnN0cmluZ2lmeSgpIGFsd2F5cyBwcm9kdWNlcyB2YWxpZCBKU09OOiBzcGVjaWFsIHZhbHVlc1xuICAvLyAodW5kZWZpbmVkLCBOYU4sIEluZmluaXR5LCAtMCkgYXJlIGVuY29kZWQgYXMgbmVnYXRpdmUgaW50ZWdlclxuICAvLyBzZW50aW5lbHMgYW5kIHRoZSByZW1haW5pbmcgc3RydWN0dXJlIGlzIG9yZGluYXJ5IEpTT04uIFBhcnNpbmdcbiAgLy8gd2l0aCBKU09OLnBhcnNlIHlpZWxkcyB0aGUgZmxhdHRlbmVkIGZvcm0gdGhhdCB1bmZsYXR0ZW4oKSBleHBlY3RzLlxuICByZXR1cm4gSlNPTi5wYXJzZShzdHIpO1xufVxuXG4vLyAtLS0tIEVycm9yIHN1YmNsYXNzIGhlbHBlcnMgLS0tLVxuXG4vKipcbiAqIFRoZSBzaGFyZWQgc2hhcGUgdGhhdCBldmVyeSBFcnJvci1zdWJjbGFzcyByZWR1Y2VyIGluIHRoaXMgbW9kdWxlXG4gKiBwcm9kdWNlcy4gU29tZSBzdWJjbGFzc2VzIChlLmcuIGBBZ2dyZWdhdGVFcnJvcmAsIGBSZXRyeWFibGVFcnJvcmApIGV4dGVuZFxuICogdGhpcyB3aXRoIGFkZGl0aW9uYWwgZmllbGRzIGJ5IHNwcmVhZGluZyB0aGUgYmFzZSBwYXlsb2FkLlxuICovXG50eXBlIEJhc2VFcnJvclBheWxvYWQgPSB7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgc3RhY2s/OiBzdHJpbmc7XG4gIGNhdXNlPzogdW5rbm93bjtcbn07XG5cbi8qKlxuICogU3Vic2V0IG9mIGBTZXJpYWxpemFibGVTcGVjaWFsYCBrZXlzIHdob3NlIHBheWxvYWQgc2hhcGUgaXMgZXhhY3RseSB0aGVcbiAqIGBCYXNlRXJyb3JQYXlsb2FkYC4gYG1ha2VFcnJvclN1YmNsYXNzUmVkdWNlcmAgaXMgY29uc3RyYWluZWQgdG8gb25seVxuICogdGhlc2Uga2V5cyBzbyBpdHMgcmV0dXJuIHR5cGUgaXMgc291bmQg4oCUIHN1YmNsYXNzZXMgdGhhdCBuZWVkIGV4dHJhXG4gKiBmaWVsZHMgKGxpa2UgYEFnZ3JlZ2F0ZUVycm9yLmVycm9yc2Agb3IgYFJldHJ5YWJsZUVycm9yLnJldHJ5QWZ0ZXJgKSB1c2VcbiAqIGByZWR1Y2VFcnJvckJhc2VgIGRpcmVjdGx5IGFuZCBleHRlbmQgdGhlIHJlc3VsdC5cbiAqL1xudHlwZSBTaW1wbGVFcnJvclN1YmNsYXNzS2V5ID0ge1xuICBbSyBpbiBrZXlvZiBTZXJpYWxpemFibGVTcGVjaWFsXTogU2VyaWFsaXphYmxlU3BlY2lhbFtLXSBleHRlbmRzIEJhc2VFcnJvclBheWxvYWRcbiAgICA/IEJhc2VFcnJvclBheWxvYWQgZXh0ZW5kcyBTZXJpYWxpemFibGVTcGVjaWFsW0tdXG4gICAgICA/IEtcbiAgICAgIDogbmV2ZXJcbiAgICA6IG5ldmVyO1xufVtrZXlvZiBTZXJpYWxpemFibGVTcGVjaWFsXTtcblxuLyoqXG4gKiBSZWFkcyBgZXJyb3Iuc3RhY2tgIGZvciBzZXJpYWxpemF0aW9uLiBBIG5hdHVyYWwgVjggZXJyb3IgY2FycmllcyBgc3RhY2tgXG4gKiBhcyBhbiBvd24gKmFjY2Vzc29yKiB3aG9zZSBmaXJzdCBpbnZvY2F0aW9uIGZvcm1hdHMgYW5kIGNhY2hlcyB0aGUgdHJhY2UuXG4gKiBUaGF0IHJlYWQgaXMgbm90IHBhc3NpdmU6IGl0IGV4ZWN1dGVzIGBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZWAgd2hlbiB0aGVcbiAqIHJlYWxtIGhhcyBvbmUgaW5zdGFsbGVkLCBhbmQgdGhlIGZvcm1hdC1hbmQtY2FjaGUgaXRzZWxmIGlzXG4gKiB3b3JrZmxvdy12aXNpYmxlIChhIGZvcm1hdHRlciBpbnN0YWxsZWQgbGF0ZXIgbmV2ZXIgcnVucyBmb3IgYW5cbiAqIGFscmVhZHktbWF0ZXJpYWxpemVkIGVycm9yKS4gQSBjb2xkIHJlcGxheSByZXBlYXRzIG5laXRoZXIg4oCUIGl0IHNraXBzXG4gKiBkZWh5ZHJhdGlvbiBlbnRpcmVseSDigJQgc28gdGhlIHJlYWQgaXMgcmVjb3JkZWQgYXMgZ3Vlc3QgY29kZS4gQVxuICogZGF0YS1wcm9wZXJ0eSBgc3RhY2tgIChyZWh5ZHJhdGVkIGVycm9ycywgd29ya2Zsb3ctYXNzaWduZWQgc3RyaW5ncylcbiAqIHJlYWRzIHBhc3NpdmVseS5cbiAqL1xuZnVuY3Rpb24gcmVhZEVycm9yU3RhY2sodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZSBhcyBvYmplY3QsICdzdGFjaycpO1xuICBpZiAoZGVzY3JpcHRvciAmJiAndmFsdWUnIGluIGRlc2NyaXB0b3IpIHtcbiAgICByZXR1cm4gZGVzY3JpcHRvci52YWx1ZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIH1cbiAgcmVjb3JkR3Vlc3RDb2RlKCdnZXR0ZXInLCAnc3RhY2snKTtcbiAgaWYgKGRlc2NyaXB0b3I/LmdldCkge1xuICAgIHJldHVybiBkZXNjcmlwdG9yLmdldC5jYWxsKHZhbHVlKSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ3N0YWNrJykgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlZHVjZXMgYW55IG5hdGl2ZSBFcnJvciBpbnN0YW5jZSB0byB0aGUgc2hhcmVkIGBCYXNlRXJyb3JQYXlsb2FkYCBzaGFwZSxcbiAqIHByZXNlcnZpbmcgYGNhdXNlYCBvbmx5IHdoZW4gcHJlc2VudCAodG8gZGlzdGluZ3Vpc2ggXCJubyBjYXVzZVwiIGZyb21cbiAqIFwiY2F1c2UgaXMgdW5kZWZpbmVkXCIpLiBVc2VkIGRpcmVjdGx5IGJ5IHJlZHVjZXJzIGZvciBzdWJjbGFzc2VzIHRoYXQgbmVlZFxuICogdG8gZXh0ZW5kIHRoZSBzaGFwZSB3aXRoIGFkZGl0aW9uYWwgZmllbGRzLlxuICpcbiAqIGB0eXBlcy5pc05hdGl2ZUVycm9yKClgIGlzIHVzZWQgaW5zdGVhZCBvZiBgaW5zdGFuY2VvZmAgZm9yIGNyb3NzLVZNIHNhZmV0eTpcbiAqIGVycm9ycyBtYXkgb3JpZ2luYXRlIGZyb20gYSBkaWZmZXJlbnQgVk0gY29udGV4dCwgYW5kIGBpbnN0YW5jZW9mYCBmYWlsc1xuICogYWNyb3NzIFZNIGJvdW5kYXJpZXMgc2luY2UgZWFjaCBjb250ZXh0IGhhcyBpdHMgb3duIEVycm9yIGNvbnN0cnVjdG9yLlxuICovXG5mdW5jdGlvbiByZWR1Y2VFcnJvckJhc2UodmFsdWU6IHVua25vd24pOiBCYXNlRXJyb3JQYXlsb2FkIHwgZmFsc2Uge1xuICBpZiAoIXR5cGVzLmlzTmF0aXZlRXJyb3IodmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gIC8vIGBtZXNzYWdlYC9gY2F1c2VgIGFyZSBvd24gZGF0YSBwcm9wZXJ0aWVzIG9uIG5hdHVyYWwgZXJyb3JzLCBzbyB0aGVcbiAgLy8gZGVzY3JpcHRvci1iYXNlZCByZWFkcyBjb3N0IG5vdGhpbmc7IGEgc2FuZGJveC1kZWZpbmVkIGFjY2Vzc29yXG4gIC8vIChlLmcuIGEgZ2V0dGVyIG9uIGFuIEVycm9yIHN1YmNsYXNzKSBpcyBzdGlsbCBpbnZva2VkIGJ1dCByZWNvcmRlZC5cbiAgY29uc3QgcmVkdWNlZDogQmFzZUVycm9yUGF5bG9hZCA9IHtcbiAgICBtZXNzYWdlOiByZWFkUHJvcGVydHkodmFsdWUsICdtZXNzYWdlJykgYXMgc3RyaW5nLFxuICAgIHN0YWNrOiByZWFkRXJyb3JTdGFjayh2YWx1ZSksXG4gIH07XG4gIGlmIChoYXNQcm9wZXJ0eSh2YWx1ZSwgJ2NhdXNlJykpIHJlZHVjZWQuY2F1c2UgPSByZWFkUHJvcGVydHkodmFsdWUsICdjYXVzZScpO1xuICByZXR1cm4gcmVkdWNlZDtcbn1cblxuLyoqXG4gKiBSZWR1Y2VzIGEgbmF0aXZlIGVycm9yIHRvIHRoZSBzaGFyZWQgYEJhc2VFcnJvclBheWxvYWRgLCBidXQgb25seSB3aGVuIGl0c1xuICogYG5hbWVgIGluc3RhbmNlIHByb3BlcnR5IG1hdGNoZXMgYHN1YmNsYXNzTmFtZWAuIFVzZWQgYnk6XG4gKiAgIC0gYG1ha2VFcnJvclN1YmNsYXNzUmVkdWNlcmAsIGZvciBzdWJjbGFzc2VzIHdob3NlIHNlcmlhbGl6ZWQgc2hhcGUgaXNcbiAqICAgICBleGFjdGx5IGBCYXNlRXJyb3JQYXlsb2FkYC5cbiAqICAgLSBJbmxpbmUgcmVkdWNlcnMgZm9yIHN1YmNsYXNzZXMgdGhhdCBleHRlbmQgdGhlIHNoYXBlIHdpdGggYWRkaXRpb25hbFxuICogICAgIGZpZWxkcyAoZS5nLiBgQWdncmVnYXRlRXJyb3IuZXJyb3JzYCwgYFJldHJ5YWJsZUVycm9yLnJldHJ5QWZ0ZXJgKS5cbiAqXG4gKiBNYXRjaGluZyBieSBgdmFsdWUubmFtZWAgKGluc3RlYWQgb2YgYHZhbHVlLmNvbnN0cnVjdG9yPy5uYW1lYCkgaXMgcm9idXN0XG4gKiB0byBidW5kbGVycyB0aGF0IGVtaXQgdGhlIGNsYXNzIGFzIGFuIGFub255bW91cyBleHByZXNzaW9uIOKAlCBlLmcuIFR1cmJvcGFja1xuICogY29tcGlsZXMgYGV4cG9ydCBjbGFzcyBGYXRhbEVycm9yIGV4dGVuZHMgRXJyb3Ige+KApn1gIHRvIGEgcmVnaXN0cmF0aW9uIGNhbGxcbiAqIGxpa2UgYGUucyhbXCJGYXRhbEVycm9yXCIsIDAsIGNsYXNzIGV4dGVuZHMgRXJyb3Ige+KApn1dKWAsIGFuZCB0aGUgcmVzdWx0aW5nXG4gKiBjb25zdHJ1Y3RvciBoYXMgYG5hbWUgPT09ICcnYC4gU2luY2UgZXZlcnkgRXJyb3Igc3ViY2xhc3Mgd2UgY2FyZSBhYm91dFxuICogc2V0cyBgdGhpcy5uYW1lYCBleHBsaWNpdGx5IGluIGl0cyBjb25zdHJ1Y3RvciAoYnVpbHQtaW4gc3ViY2xhc3NlcyBkbyB0aGlzXG4gKiBhdXRvbWF0aWNhbGx5OyBgRmF0YWxFcnJvcmAvYFJldHJ5YWJsZUVycm9yYCBkbyBpdCBpbiB1c2VyIGNvZGUpLCB0aGVcbiAqIGluc3RhbmNlIHByb3BlcnR5IGlzIHRoZSByZWxpYWJsZSBpZGVudGl0eSBtYXJrZXIgYWNyb3NzIHJlYWxtcyBhbmRcbiAqIGJ1bmRsZXJzLlxuICovXG5mdW5jdGlvbiByZWR1Y2VOYW1lZEVycm9yU3ViY2xhc3NCYXNlKFxuICBzdWJjbGFzc05hbWU6IHN0cmluZyxcbiAgdmFsdWU6IHVua25vd25cbik6IEJhc2VFcnJvclBheWxvYWQgfCBmYWxzZSB7XG4gIGlmICghdHlwZXMuaXNOYXRpdmVFcnJvcih2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgaWYgKHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ25hbWUnKSAhPT0gc3ViY2xhc3NOYW1lKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiByZWR1Y2VFcnJvckJhc2UodmFsdWUpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSByZWR1Y2VyIGZvciBhIGJ1aWx0LWluIEVycm9yIHN1YmNsYXNzIHdob3NlIHNlcmlhbGl6ZWQgc2hhcGUgaXNcbiAqIGV4YWN0bHkgYEJhc2VFcnJvclBheWxvYWRgIChubyBleHRyYSBmaWVsZHMpLiBUaGUgcmVkdWNlciBtYXRjaGVzIGJ5XG4gKiBjb25zdHJ1Y3RvciBuYW1lIChhZnRlciB0aGUgaXNOYXRpdmVFcnJvciBnYXRlKSwgc2luY2UgYGluc3RhbmNlb2ZgIG1heVxuICogZmFpbCBhY3Jvc3MgVk0gYm91bmRhcmllcy5cbiAqL1xuZnVuY3Rpb24gbWFrZUVycm9yU3ViY2xhc3NSZWR1Y2VyPEsgZXh0ZW5kcyBTaW1wbGVFcnJvclN1YmNsYXNzS2V5PihcbiAgc3ViY2xhc3NOYW1lOiBLXG4pIHtcbiAgcmV0dXJuICh2YWx1ZTogdW5rbm93bik6IFNlcmlhbGl6YWJsZVNwZWNpYWxbS10gfCBmYWxzZSA9PiB7XG4gICAgY29uc3QgYmFzZSA9IHJlZHVjZU5hbWVkRXJyb3JTdWJjbGFzc0Jhc2Uoc3ViY2xhc3NOYW1lLCB2YWx1ZSk7XG4gICAgaWYgKCFiYXNlKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGJhc2UgYXMgU2VyaWFsaXphYmxlU3BlY2lhbFtLXTtcbiAgfTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgcmV2aXZlciBmb3IgYSBidWlsdC1pbiBFcnJvciBzdWJjbGFzcy4gUmVjb25zdHJ1Y3RzIHRoZSBjb3JyZWN0XG4gKiBidWlsdC1pbiBFcnJvciB0eXBlIHVzaW5nIHRoZSBjb250ZXh0J3MgY29uc3RydWN0b3IuIFRoZSBgY2F1c2VgIG9wdGlvbiBpc1xuICogb25seSBwYXNzZWQgd2hlbiB0aGUgc2VyaWFsaXplZCBkYXRhIGluY2x1ZGVzIGl0LCBwcmVzZXJ2aW5nIHRoZSBkaXN0aW5jdGlvblxuICogYmV0d2VlbiBcIm5vIGNhdXNlXCIgYW5kIFwiY2F1c2UgaXMgdW5kZWZpbmVkXCIuXG4gKi9cbmZ1bmN0aW9uIG1ha2VFcnJvclN1YmNsYXNzUmV2aXZlcjxLIGV4dGVuZHMga2V5b2YgU2VyaWFsaXphYmxlU3BlY2lhbD4oXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgY3Rvck5hbWU6IHN0cmluZ1xuKSB7XG4gIHJldHVybiAodmFsdWU6IFNlcmlhbGl6YWJsZVNwZWNpYWxbS10pID0+IHtcbiAgICBjb25zdCB2ID0gdmFsdWUgYXMgQmFzZUVycm9yUGF5bG9hZDtcbiAgICBjb25zdCBvcHRzID0gJ2NhdXNlJyBpbiB2ID8geyBjYXVzZTogdi5jYXVzZSB9IDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IEN0b3IgPSBnbG9iYWxbY3Rvck5hbWVdO1xuICAgIGNvbnN0IGVycm9yOiBFcnJvciA9IG5ldyBDdG9yKHYubWVzc2FnZSwgb3B0cyk7XG4gICAgaWYgKHYuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2LnN0YWNrO1xuICAgIHJldHVybiBlcnJvcjtcbiAgfTtcbn1cblxuLy8gLS0tLSBSZWR1Y2VycyAtLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb21tb25SZWR1Y2VycyhcbiAgLy8gVGhlIGBnbG9iYWxgIHBhcmFtZXRlciBpcyByZXRhaW5lZCBmb3IgQVBJIGNvbXBhdGliaWxpdHksIGJ1dCB0aGVcbiAgLy8gcmVkdWNlcnMgbm8gbG9uZ2VyIHBlcmZvcm0gYGluc3RhbmNlb2YgZ2xvYmFsLlhgIGNoZWNrczogY2xhc3NpZmljYXRpb25cbiAgLy8gaXMgZG9uZSB3aXRoIGVuZ2luZS1sZXZlbCBicmFuZCBjaGVja3MgKHJlYWxtLWFnbm9zdGljLCBpbW11bmUgdG9cbiAgLy8gcmVhc3NpZ25lZCBzYW5kYm94IGdsb2JhbHMgYW5kIGBTeW1ib2wuaGFzSW5zdGFuY2VgKSwgYW5kIGV4dHJhY3Rpb25cbiAgLy8gZ29lcyB0aHJvdWdoIGludHJpbnNpY3MgY2FwdHVyZWQgYXQgaG9zdCBib290LiBTZWUgLi4vaGFyZGVuZWQudHMuXG4gIF9nbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzXG4pOiBQYXJ0aWFsPFJlZHVjZXJzPiB7XG4gIHJldHVybiB7XG4gICAgQXJyYXlCdWZmZXI6ICh2YWx1ZSkgPT5cbiAgICAgIHR5cGVzLmlzQXJyYXlCdWZmZXIodmFsdWUpICYmXG4gICAgICBhcnJheUJ1ZmZlclRvQmFzZTY0KHZhbHVlLCAwLCBhcnJheUJ1ZmZlckJ5dGVMZW5ndGgodmFsdWUpKSxcbiAgICBCaWdJbnQ6ICh2YWx1ZSkgPT5cbiAgICAgIC8vIFN0cmluZyhiaWdpbnQpIGlzIGEgc3BlYy1pbnRlcm5hbCBudW1lcmljIGNvbnZlcnNpb24g4oCUIHVubGlrZVxuICAgICAgLy8gYHZhbHVlLnRvU3RyaW5nKClgLCBpdCBuZXZlciBjb25zdWx0cyBCaWdJbnQucHJvdG90eXBlLlxuICAgICAgdHlwZW9mIHZhbHVlID09PSAnYmlnaW50JyAmJiBTdHJpbmcodmFsdWUpLFxuICAgIEJpZ0ludDY0QXJyYXk6ICh2YWx1ZSkgPT5cbiAgICAgIHR5cGVzLmlzQmlnSW50NjRBcnJheSh2YWx1ZSkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgICBCaWdVaW50NjRBcnJheTogKHZhbHVlKSA9PlxuICAgICAgdHlwZXMuaXNCaWdVaW50NjRBcnJheSh2YWx1ZSkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgICBEYXRlOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIEJyYW5kIGNoZWNrICsgY2FwdHVyZWQgaW50cmluc2ljczogYSBzYW5kYm94LXNpZGUgcGF0Y2ggb2ZcbiAgICAgIC8vIGBEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZ2AgKGUuZy4gYSBUZW1wb3JhbCBwb2x5ZmlsbCB3cmFwcGluZyBpdClcbiAgICAgIC8vIGlzIG5ldmVyIGV4ZWN1dGVkLCBhbmQgY2Fubm90IHBlcnR1cmIgVk0gc3RhdGUgZHVyaW5nIHNlcmlhbGl6YXRpb24uXG4gICAgICBpZiAoIXR5cGVzLmlzRGF0ZSh2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHZhbGlkID0gIU51bWJlci5pc05hTihkYXRlR2V0RGF0ZSh2YWx1ZSkpO1xuICAgICAgcmV0dXJuIHZhbGlkID8gZGF0ZVRvSVNPU3RyaW5nKHZhbHVlKSA6ICcuJztcbiAgICB9LFxuICAgIC8vIERPTUV4Y2VwdGlvbiBpcyBhIHNwZWNpYWwgY2FzZTogaXQgYGluc3RhbmNlb2YgRXJyb3JgIGlzIHRydWUgaW4gTm9kZSxcbiAgICAvLyBidXQgYHR5cGVzLmlzTmF0aXZlRXJyb3IoKWAgcmV0dXJucyBGQUxTRSBmb3IgaXQsIHNvIHRoZSBnZW5lcmljIEVycm9yXG4gICAgLy8gcmVkdWNlciAod2hpY2ggZ2F0ZXMgb24gaXNOYXRpdmVFcnJvcikgd29uJ3QgbWF0Y2guIENoZWNrIGl0IGV4cGxpY2l0bHlcbiAgICAvLyBieSBjb25zdHJ1Y3RvciBuYW1lICsgRXJyb3IgaW5oZXJpdGFuY2Ugc28gd2UgY2F0Y2ggRE9NRXhjZXB0aW9ucyBmcm9tXG4gICAgLy8gYW55IHJlYWxtIChjcm9zcy1WTSBzYWZldHk6IGluc3RhbmNlb2YgZ2xvYmFsLkRPTUV4Y2VwdGlvbiB3b3VsZCBmYWlsXG4gICAgLy8gZm9yIGluc3RhbmNlcyBtaW50ZWQgaW4gYW5vdGhlciBjb250ZXh0KS5cbiAgICBET01FeGNlcHRpb246ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IGN0b3IgPSByZWFkUHJvcGVydHkodmFsdWUsICdjb25zdHJ1Y3RvcicpO1xuICAgICAgaWYgKCFjdG9yIHx8IHJlYWRQcm9wZXJ0eShjdG9yLCAnbmFtZScpICE9PSAnRE9NRXhjZXB0aW9uJykgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgcmVkdWNlZDogU2VyaWFsaXphYmxlU3BlY2lhbFsnRE9NRXhjZXB0aW9uJ10gPSB7XG4gICAgICAgIG1lc3NhZ2U6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ21lc3NhZ2UnKSBhcyBzdHJpbmcsXG4gICAgICAgIG5hbWU6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ25hbWUnKSBhcyBzdHJpbmcsXG4gICAgICAgIHN0YWNrOiByZWFkRXJyb3JTdGFjayh2YWx1ZSksXG4gICAgICB9O1xuICAgICAgaWYgKGhhc1Byb3BlcnR5KHZhbHVlLCAnY2F1c2UnKSkge1xuICAgICAgICByZWR1Y2VkLmNhdXNlID0gcmVhZFByb3BlcnR5KHZhbHVlLCAnY2F1c2UnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZWR1Y2VkO1xuICAgIH0sXG4gICAgLy8gRXJyb3Igc3ViY2xhc3MgcmVkdWNlcnMgYXJlIGludGVudGlvbmFsbHkgcGxhY2VkIGJlZm9yZSB0aGUgYmFzZSBFcnJvclxuICAgIC8vIHJlZHVjZXIgYmVjYXVzZSBkZXZhbHVlIHVzZXMgZmlyc3QtbWF0Y2gtd2lucy4gU3ViY2xhc3Mtc3BlY2lmaWMgcmVkdWNlcnNcbiAgICAvLyBtdXN0IGJlIGNoZWNrZWQgZmlyc3Qgc28gdGhhdCBlLmcuIGEgVHlwZUVycm9yIGlzIHNlcmlhbGl6ZWQgYXMgXCJUeXBlRXJyb3JcIlxuICAgIC8vIHJhdGhlciB0aGFuIGZhbGxpbmcgdGhyb3VnaCB0byB0aGUgZ2VuZXJpYyBcIkVycm9yXCIgcmVkdWNlci5cbiAgICAvLyBTZWUgYG1ha2VFcnJvclN1YmNsYXNzUmVkdWNlcmAgZm9yIGltcGxlbWVudGF0aW9uIGRldGFpbHMuXG4gICAgRXZhbEVycm9yOiBtYWtlRXJyb3JTdWJjbGFzc1JlZHVjZXIoJ0V2YWxFcnJvcicpLFxuICAgIEZhdGFsRXJyb3I6IG1ha2VFcnJvclN1YmNsYXNzUmVkdWNlcignRmF0YWxFcnJvcicpLFxuICAgIEhvb2tDb25mbGljdEVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IGJhc2UgPSByZWR1Y2VOYW1lZEVycm9yU3ViY2xhc3NCYXNlKCdIb29rQ29uZmxpY3RFcnJvcicsIHZhbHVlKTtcbiAgICAgIGlmICghYmFzZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgcmVkdWNlZDogU2VyaWFsaXphYmxlU3BlY2lhbFsnSG9va0NvbmZsaWN0RXJyb3InXSA9IHtcbiAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgdG9rZW46IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ3Rva2VuJykgYXMgSG9va0NvbmZsaWN0RXJyb3JbJ3Rva2VuJ10sXG4gICAgICB9O1xuICAgICAgY29uc3QgY29uZmxpY3RpbmdSdW5JZCA9IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ2NvbmZsaWN0aW5nUnVuSWQnKSBhc1xuICAgICAgICB8IEhvb2tDb25mbGljdEVycm9yWydjb25mbGljdGluZ1J1bklkJ11cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoY29uZmxpY3RpbmdSdW5JZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlZHVjZWQuY29uZmxpY3RpbmdSdW5JZCA9IGNvbmZsaWN0aW5nUnVuSWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVkdWNlZDtcbiAgICB9LFxuICAgIFJhbmdlRXJyb3I6IG1ha2VFcnJvclN1YmNsYXNzUmVkdWNlcignUmFuZ2VFcnJvcicpLFxuICAgIFJlZmVyZW5jZUVycm9yOiBtYWtlRXJyb3JTdWJjbGFzc1JlZHVjZXIoJ1JlZmVyZW5jZUVycm9yJyksXG4gICAgLy8gUmV0cnlhYmxlRXJyb3IgY2FycmllcyBhbiBleHRyYSBgcmV0cnlBZnRlcmAgRGF0ZSB0aGF0IHdlIHNlcmlhbGl6ZSBhc1xuICAgIC8vIGEgbnVtZXJpYyBlcG9jaCB0aW1lc3RhbXAuIFRoZSBEYXRlIHJlZHVjZXIgdXNlcyBgaW5zdGFuY2VvZiBnbG9iYWwuRGF0ZWAsXG4gICAgLy8gd2hpY2ggZmFpbHMgZm9yIERhdGVzIGZyb20gYSBkaWZmZXJlbnQgVk0gcmVhbG07IHNlcmlhbGl6aW5nIGFzIGFcbiAgICAvLyBudW1iZXIgc2lkZXN0ZXBzIHRoYXQgaXNzdWUuXG4gICAgUmV0cnlhYmxlRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgYmFzZSA9IHJlZHVjZU5hbWVkRXJyb3JTdWJjbGFzc0Jhc2UoJ1JldHJ5YWJsZUVycm9yJywgdmFsdWUpO1xuICAgICAgaWYgKCFiYXNlKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCByZXRyeUFmdGVyUmF3ID0gcmVhZFByb3BlcnR5KHZhbHVlLCAncmV0cnlBZnRlcicpO1xuICAgICAgbGV0IHJldHJ5QWZ0ZXI6IG51bWJlcjtcbiAgICAgIGlmICh0eXBlcy5pc0RhdGUocmV0cnlBZnRlclJhdykpIHtcbiAgICAgICAgLy8gR2VudWluZSBEYXRlIChhbnkgcmVhbG0pOiByZWFkIHRoZSBlcG9jaCB0aHJvdWdoIHRoZSBpbnRyaW5zaWMuXG4gICAgICAgIGNvbnN0IHQgPSBkYXRlR2V0VGltZShyZXRyeUFmdGVyUmF3KTtcbiAgICAgICAgcmV0cnlBZnRlciA9IE51bWJlci5pc05hTih0KSA/IERhdGUubm93KCkgKyAxMDAwIDogdDtcbiAgICAgIH0gZWxzZSBpZiAocmV0cnlBZnRlclJhdyAmJiB0eXBlb2YgcmV0cnlBZnRlclJhdyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgLy8gRHVjay10eXBlZCBkYXRlLWxpa2U6IGludm9raW5nIGl0cyBnZXRUaW1lKCkgcnVucyB3b3JrZmxvdyBjb2RlLlxuICAgICAgICBjb25zdCBnZXRUaW1lID0gcmVhZFByb3BlcnR5KHJldHJ5QWZ0ZXJSYXcsICdnZXRUaW1lJyk7XG4gICAgICAgIGlmICh0eXBlb2YgZ2V0VGltZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJlY29yZEd1ZXN0Q29kZSgnbWV0aG9kJywgJ2dldFRpbWUnKTtcbiAgICAgICAgICBjb25zdCB0ID0gKGdldFRpbWUgYXMgKHRoaXM6IHVua25vd24pID0+IG51bWJlcikuY2FsbChyZXRyeUFmdGVyUmF3KTtcbiAgICAgICAgICByZXRyeUFmdGVyID0gTnVtYmVyLmlzTmFOKHQpID8gRGF0ZS5ub3coKSArIDEwMDAgOiB0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHJ5QWZ0ZXIgPSBEYXRlLm5vdygpICsgMTAwMDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdHlwZW9mIHJldHJ5QWZ0ZXJSYXcgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgIHR5cGVvZiByZXRyeUFmdGVyUmF3ID09PSAnbnVtYmVyJ1xuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHQgPSBuZXcgRGF0ZShyZXRyeUFmdGVyUmF3KS5nZXRUaW1lKCk7XG4gICAgICAgIHJldHJ5QWZ0ZXIgPSBOdW1iZXIuaXNOYU4odCkgPyBEYXRlLm5vdygpICsgMTAwMCA6IHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXRyeUFmdGVyID0gRGF0ZS5ub3coKSArIDEwMDA7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5iYXNlLFxuICAgICAgICByZXRyeUFmdGVyLFxuICAgICAgfSBzYXRpc2ZpZXMgU2VyaWFsaXphYmxlU3BlY2lhbFsnUmV0cnlhYmxlRXJyb3InXTtcbiAgICB9LFxuICAgIC8vIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IgY2FycmllcyBhbiBleHRyYSBgY29udGV4dGAgb2JqZWN0IChvcGVyYXRpb24sXG4gICAgLy8gYnl0ZUxlbmd0aCwgZm9ybWF0UHJlZml4KSB0aGF0IHRoZSBnZW5lcmljIEVycm9yIHJlZHVjZXIgd291bGQgZHJvcC5cbiAgICAvLyBQcmVzZXJ2ZSBpdCBzbyB0aGUgZGlhZ25vc3RpYyBkYXRhIHN1cnZpdmVzIHRoZSBydW4tZXJyb3Igcm91bmQgdHJpcC5cbiAgICBSdW50aW1lRGVjcnlwdGlvbkVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IGJhc2UgPSByZWR1Y2VOYW1lZEVycm9yU3ViY2xhc3NCYXNlKFxuICAgICAgICAnUnVudGltZURlY3J5cHRpb25FcnJvcicsXG4gICAgICAgIHZhbHVlXG4gICAgICApO1xuICAgICAgaWYgKCFiYXNlKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCByZWR1Y2VkOiBTZXJpYWxpemFibGVTcGVjaWFsWydSdW50aW1lRGVjcnlwdGlvbkVycm9yJ10gPSB7XG4gICAgICAgIC4uLmJhc2UsXG4gICAgICB9O1xuICAgICAgY29uc3QgY29udGV4dCA9IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ2NvbnRleHQnKSBhc1xuICAgICAgICB8IFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3JbJ2NvbnRleHQnXVxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChjb250ZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVkdWNlZC5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZWR1Y2VkO1xuICAgIH0sXG4gICAgU3ludGF4RXJyb3I6IG1ha2VFcnJvclN1YmNsYXNzUmVkdWNlcignU3ludGF4RXJyb3InKSxcbiAgICBUeXBlRXJyb3I6IG1ha2VFcnJvclN1YmNsYXNzUmVkdWNlcignVHlwZUVycm9yJyksXG4gICAgVVJJRXJyb3I6IG1ha2VFcnJvclN1YmNsYXNzUmVkdWNlcignVVJJRXJyb3InKSxcbiAgICAvLyBBZ2dyZWdhdGVFcnJvciBpcyBzaW1pbGFyIHRvIG90aGVyIHN1YmNsYXNzZXMgYnV0IGFsc28gcHJlc2VydmVzIHRoZVxuICAgIC8vIGBlcnJvcnNgIGFycmF5LiBXZSBleHRlbmQgdGhlIGJhc2UgaGVscGVyJ3Mgb3V0cHV0IGhlcmUuXG4gICAgQWdncmVnYXRlRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgYmFzZSA9IHJlZHVjZU5hbWVkRXJyb3JTdWJjbGFzc0Jhc2UoJ0FnZ3JlZ2F0ZUVycm9yJywgdmFsdWUpO1xuICAgICAgaWYgKCFiYXNlKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5iYXNlLFxuICAgICAgICBlcnJvcnM6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ2Vycm9ycycpIGFzIEFnZ3JlZ2F0ZUVycm9yWydlcnJvcnMnXSxcbiAgICAgIH0gc2F0aXNmaWVzIFNlcmlhbGl6YWJsZVNwZWNpYWxbJ0FnZ3JlZ2F0ZUVycm9yJ107XG4gICAgfSxcbiAgICAvLyBCYXNlIEVycm9yIHJlZHVjZXIg4oCUIGNhdGNoLWFsbCBmb3IgYW55IEVycm9yIGluc3RhbmNlIG5vdCBtYXRjaGVkIGJ5IGFcbiAgICAvLyBzcGVjaWZpYyBzdWJjbGFzcyByZWR1Y2VyIGFib3ZlIChpbmNsdWRpbmcgdXNlciBFcnJvciBzdWJjbGFzc2VzIHdpdGhvdXRcbiAgICAvLyBXT1JLRkxPV19TRVJJQUxJWkUpLiBQcmVzZXJ2ZXMgYG5hbWVgIHNvIHRoZSBlcnJvcidzIGlkZW50aXR5IGlzIHJldGFpbmVkXG4gICAgLy8gZXZlbiB0aG91Z2ggdGhlIGV4YWN0IGNsYXNzIGNhbm5vdCBiZSByZWNvbnN0cnVjdGVkLlxuICAgIEVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghdHlwZXMuaXNOYXRpdmVFcnJvcih2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHJlZHVjZWQ6IFNlcmlhbGl6YWJsZVNwZWNpYWxbJ0Vycm9yJ10gPSB7XG4gICAgICAgIG5hbWU6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ25hbWUnKSBhcyBzdHJpbmcsXG4gICAgICAgIG1lc3NhZ2U6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ21lc3NhZ2UnKSBhcyBzdHJpbmcsXG4gICAgICAgIHN0YWNrOiByZWFkRXJyb3JTdGFjayh2YWx1ZSksXG4gICAgICB9O1xuICAgICAgaWYgKGhhc1Byb3BlcnR5KHZhbHVlLCAnY2F1c2UnKSkge1xuICAgICAgICByZWR1Y2VkLmNhdXNlID0gcmVhZFByb3BlcnR5KHZhbHVlLCAnY2F1c2UnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZWR1Y2VkO1xuICAgIH0sXG4gICAgRmxvYXQzMkFycmF5OiAodmFsdWUpID0+IHR5cGVzLmlzRmxvYXQzMkFycmF5KHZhbHVlKSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIEZsb2F0NjRBcnJheTogKHZhbHVlKSA9PiB0eXBlcy5pc0Zsb2F0NjRBcnJheSh2YWx1ZSkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgICAvLyBIZWFkZXJzIGlzIGEgaG9zdCBjbGFzcyBpbmplY3RlZCBpbnRvIHRoZSBzYW5kYm94LCBzbyBpdHMgKHNoYXJlZClcbiAgICAvLyBwcm90b3R5cGUgaXMgcmVhY2hhYmxlIGZyb20gd29ya2Zsb3cgY29kZSDigJQgaXRlcmF0ZSB0aHJvdWdoIHRoZVxuICAgIC8vIGJvb3QtY2FwdHVyZWQgaXRlcmF0b3IgaW5zdGVhZCBvZiBhIGxpdmUgU3ltYm9sLml0ZXJhdG9yIGxvb2t1cC5cbiAgICBIZWFkZXJzOiAodmFsdWUpID0+XG4gICAgICBpc0luc3RhbmNlT2ZQcm90b3R5cGUodmFsdWUsIEhlYWRlcnMucHJvdG90eXBlKSAmJlxuICAgICAgaGVhZGVyc1RvRW50cmllcyh2YWx1ZSBhcyBIZWFkZXJzKSxcbiAgICBJbnQ4QXJyYXk6ICh2YWx1ZSkgPT4gdHlwZXMuaXNJbnQ4QXJyYXkodmFsdWUpICYmIHZpZXdUb0Jhc2U2NCh2YWx1ZSksXG4gICAgSW50MTZBcnJheTogKHZhbHVlKSA9PiB0eXBlcy5pc0ludDE2QXJyYXkodmFsdWUpICYmIHZpZXdUb0Jhc2U2NCh2YWx1ZSksXG4gICAgSW50MzJBcnJheTogKHZhbHVlKSA9PiB0eXBlcy5pc0ludDMyQXJyYXkodmFsdWUpICYmIHZpZXdUb0Jhc2U2NCh2YWx1ZSksXG4gICAgLy8gRW5naW5lIGJyYW5kIGNoZWNrICsgaG9zdC1yZWFsbSBpdGVyYXRpb246IGEgcGF0Y2hlZFxuICAgIC8vIGBNYXAucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl1gIGluIHRoZSBzYW5kYm94IGlzIG5ldmVyIGNvbnN1bHRlZC5cbiAgICBNYXA6ICh2YWx1ZSkgPT5cbiAgICAgIHR5cGVzLmlzTWFwKHZhbHVlKSAmJiBtYXBUb0VudHJpZXModmFsdWUgYXMgTWFwPHVua25vd24sIHVua25vd24+KSxcbiAgICBSZWdFeHA6ICh2YWx1ZSkgPT5cbiAgICAgIHR5cGVzLmlzUmVnRXhwKHZhbHVlKSAmJiB7XG4gICAgICAgIHNvdXJjZTogcmVnRXhwU291cmNlKHZhbHVlKSxcbiAgICAgICAgZmxhZ3M6IHJlZ0V4cEZsYWdzKHZhbHVlKSxcbiAgICAgIH0sXG4gICAgLy8gUmVxdWVzdCBhbmQgUmVzcG9uc2UgYXJlIGludGVudGlvbmFsbHkgTk9UIGluIGNvbW1vbiByZWR1Y2Vycy5cbiAgICAvLyBUaGV5IHJlcXVpcmUgbW9kZS1zcGVjaWZpYyByZXZpdmVycyAoc3RyZWFtIGhhbmRsaW5nLCBldGMuKSBhbmRcbiAgICAvLyBpbmNsdWRpbmcgdGhlbSBoZXJlIHdpdGhvdXQgbWF0Y2hpbmcgcmV2aXZlcnMgd291bGQgY2F1c2UgdGhlbVxuICAgIC8vIHRvIGRlc2VyaWFsaXplIGFzIHBsYWluIG9iamVjdHMuXG4gICAgU2V0OiAodmFsdWUpID0+IHR5cGVzLmlzU2V0KHZhbHVlKSAmJiBzZXRUb1ZhbHVlcyh2YWx1ZSBhcyBTZXQ8dW5rbm93bj4pLFxuICAgIFVSTDogKHZhbHVlKSA9PlxuICAgICAgaXNJbnN0YW5jZU9mUHJvdG90eXBlKHZhbHVlLCBVUkwucHJvdG90eXBlKSAmJiB1cmxIcmVmKHZhbHVlIGFzIFVSTCksXG4gICAgV29ya2Zsb3dGdW5jdGlvbjogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBPbmx5IG1hdGNoIGZ1bmN0aW9uIHJlZmVyZW5jZXMgd2l0aCBhIHdvcmtmbG93SWQgcHJvcGVydHkgKHNldCBieVxuICAgICAgLy8gdGhlIFNXQyBjb21waWxlciBvbiB3b3JrZmxvdyBmdW5jdGlvbnMpLiBQbGFpbiB7IHdvcmtmbG93SWQgfSBvYmplY3RzXG4gICAgICAvLyBhcmUgTk9UIG1hdGNoZWQg4oCUIHRoaXMgcHJldmVudHMgaW5maW5pdGUgcmVjdXJzaW9uIHNpbmNlIHRoZSByZWR1Y2VkXG4gICAgICAvLyBmb3JtIHsgd29ya2Zsb3dJZCB9IGlzIGEgcGxhaW4gb2JqZWN0LCBub3QgYSBmdW5jdGlvbi5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHdvcmtmbG93SWQgPSByZWFkUHJvcGVydHkodmFsdWUsICd3b3JrZmxvd0lkJyk7XG4gICAgICBpZiAodHlwZW9mIHdvcmtmbG93SWQgIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4geyB3b3JrZmxvd0lkIH07XG4gICAgfSxcbiAgICBVUkxTZWFyY2hQYXJhbXM6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCFpc0luc3RhbmNlT2ZQcm90b3R5cGUodmFsdWUsIFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRleHQgPSB1cmxTZWFyY2hQYXJhbXNUb1N0cmluZyh2YWx1ZSBhcyBVUkxTZWFyY2hQYXJhbXMpO1xuICAgICAgcmV0dXJuIHRleHQgPT09ICcnID8gJy4nIDogdGV4dDtcbiAgICB9LFxuICAgIFVpbnQ4QXJyYXk6ICh2YWx1ZSkgPT4gdHlwZXMuaXNVaW50OEFycmF5KHZhbHVlKSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIFVpbnQ4Q2xhbXBlZEFycmF5OiAodmFsdWUpID0+XG4gICAgICB0eXBlcy5pc1VpbnQ4Q2xhbXBlZEFycmF5KHZhbHVlKSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIFVpbnQxNkFycmF5OiAodmFsdWUpID0+IHR5cGVzLmlzVWludDE2QXJyYXkodmFsdWUpICYmIHZpZXdUb0Jhc2U2NCh2YWx1ZSksXG4gICAgVWludDMyQXJyYXk6ICh2YWx1ZSkgPT4gdHlwZXMuaXNVaW50MzJBcnJheSh2YWx1ZSkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgfTtcbn1cblxuLy8gLS0tLSBSZXZpdmVycyAtLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb21tb25SZXZpdmVycyhcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpc1xuKTogUGFydGlhbDxSZXZpdmVycz4ge1xuICByZXR1cm4ge1xuICAgIEFycmF5QnVmZmVyOiAodmFsdWU6IHN0cmluZykgPT4gcmV2aXZlQXJyYXlCdWZmZXIodmFsdWUsIGdsb2JhbCksXG4gICAgQmlnSW50OiAodmFsdWU6IHN0cmluZykgPT4gZ2xvYmFsLkJpZ0ludCh2YWx1ZSksXG4gICAgQmlnSW50NjRBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICBuZXcgZ2xvYmFsLkJpZ0ludDY0QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUsIGdsb2JhbCkpLFxuICAgIEJpZ1VpbnQ2NEFycmF5OiAodmFsdWU6IHN0cmluZykgPT5cbiAgICAgIG5ldyBnbG9iYWwuQmlnVWludDY0QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUsIGdsb2JhbCkpLFxuICAgIERhdGU6ICh2YWx1ZSkgPT4gbmV3IGdsb2JhbC5EYXRlKHZhbHVlKSxcbiAgICBET01FeGNlcHRpb246ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgZ2xvYmFsLkRPTUV4Y2VwdGlvbih2YWx1ZS5tZXNzYWdlLCB2YWx1ZS5uYW1lKTtcbiAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHZhbHVlLnN0YWNrO1xuICAgICAgLy8gRE9NRXhjZXB0aW9uJ3MgY29uc3RydWN0b3IgZG9lc24ndCBhY2NlcHQgYSBjYXVzZSBvcHRpb24sIHNvXG4gICAgICAvLyB3ZSBzZXQgaXQgbWFudWFsbHkgd2hlbiBwcmVzZW50IGluIHRoZSBzZXJpYWxpemVkIGRhdGEuXG4gICAgICBpZiAoJ2NhdXNlJyBpbiB2YWx1ZSkgZXJyb3IuY2F1c2UgPSB2YWx1ZS5jYXVzZTtcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9LFxuICAgIC8vIEVycm9yIHN1YmNsYXNzIHJldml2ZXJzIHJlY29uc3RydWN0IHRoZSBjb3JyZWN0IGJ1aWx0LWluIEVycm9yIHR5cGUuXG4gICAgLy8gU2VlIGBtYWtlRXJyb3JTdWJjbGFzc1Jldml2ZXJgIGZvciBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLlxuICAgIEV2YWxFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZXZpdmVyKGdsb2JhbCwgJ0V2YWxFcnJvcicpLFxuICAgIC8vIGBGYXRhbEVycm9yYCBhbmQgYFJldHJ5YWJsZUVycm9yYCBhcmUgbm90IGJ1aWx0LWlucywgc28gd2UgcmVzb2x2ZSB0aGVtXG4gICAgLy8gZnJvbSB0aGUgY29uc3VtZXIncyBgZ2xvYmFsVGhpc2AgdmlhIGEgYFN5bWJvbC5mb3IoLi4uKWAga2V5IHJlZ2lzdGVyZWRcbiAgICAvLyBieSBgQHdvcmtmbG93L2Vycm9yc2Agb24gbG9hZC4gVGhpcyBtYWtlcyBgaW5zdGFuY2VvZiBGYXRhbEVycm9yYCB3b3JrXG4gICAgLy8gaW4gdXNlciBjb2RlIHRoYXQgbGl2ZXMgaW4gYSBkaWZmZXJlbnQgcmVhbG0gdGhhbiB0aGlzIHJlZHVjZXIgbW9kdWxlXG4gICAgLy8gKGUuZy4gd2hlbiB0aGUgaG9zdCBoeWRyYXRlcyBhIHZhbHVlIGRlc3RpbmVkIGZvciBhIHdvcmtmbG93IFZNXG4gICAgLy8gY29udGV4dCkuIFNlZSB0aGUgcmVnaXN0cmF0aW9uIGJsb2NrIGF0IHRoZSBib3R0b20gb2ZcbiAgICAvLyBgcGFja2FnZXMvZXJyb3JzL3NyYy9pbmRleC50c2AgZm9yIGRldGFpbHMuIEZhbGxzIGJhY2sgdG8gdGhlIGltcG9ydGVkXG4gICAgLy8gY2xhc3MgZm9yIGVudmlyb25tZW50cyB3aGVyZSBubyBidW5kbGVkIGBAd29ya2Zsb3cvZXJyb3JzYCBoYXMgbG9hZGVkXG4gICAgLy8gaW4gdGhlIGNvbnN1bWVyIHJlYWxtLlxuICAgIEZhdGFsRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgQ3RvciA9XG4gICAgICAgICgoZ2xvYmFsIGFzIFJlY29yZDxzeW1ib2wsIHVua25vd24+KVtcbiAgICAgICAgICBTeW1ib2wuZm9yKCdAd29ya2Zsb3cvZXJyb3JzLy9GYXRhbEVycm9yJylcbiAgICAgICAgXSBhcyB0eXBlb2YgRmF0YWxFcnJvciB8IHVuZGVmaW5lZCkgPz8gRmF0YWxFcnJvcjtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEN0b3IodmFsdWUubWVzc2FnZSk7XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSBlcnJvci5jYXVzZSA9IHZhbHVlLmNhdXNlO1xuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgSG9va0NvbmZsaWN0RXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgQ3RvciA9XG4gICAgICAgICgoZ2xvYmFsIGFzIFJlY29yZDxzeW1ib2wsIHVua25vd24+KVtcbiAgICAgICAgICBTeW1ib2wuZm9yKCdAd29ya2Zsb3cvZXJyb3JzLy9Ib29rQ29uZmxpY3RFcnJvcicpXG4gICAgICAgIF0gYXMgdHlwZW9mIEhvb2tDb25mbGljdEVycm9yIHwgdW5kZWZpbmVkKSA/PyBIb29rQ29uZmxpY3RFcnJvcjtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEN0b3IodmFsdWUudG9rZW4sIHZhbHVlLmNvbmZsaWN0aW5nUnVuSWQpO1xuICAgICAgaWYgKHZhbHVlLnN0YWNrICE9PSB1bmRlZmluZWQpIGVycm9yLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgICBpZiAoJ2NhdXNlJyBpbiB2YWx1ZSkge1xuICAgICAgICAoZXJyb3IgYXMgRXJyb3IgJiB7IGNhdXNlPzogdW5rbm93biB9KS5jYXVzZSA9IHZhbHVlLmNhdXNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgUmFuZ2VFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZXZpdmVyKGdsb2JhbCwgJ1JhbmdlRXJyb3InKSxcbiAgICBSZWZlcmVuY2VFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZXZpdmVyKGdsb2JhbCwgJ1JlZmVyZW5jZUVycm9yJyksXG4gICAgUmV0cnlhYmxlRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gVXNlIHRoZSBjb250ZXh0J3MgYERhdGVgIGNvbnN0cnVjdG9yIChtYXRjaGluZyB0aGUgcmVzdCBvZiB0aGlzXG4gICAgICAvLyBtb2R1bGUpIHNvIHRoZSByZXN1bHRpbmcgYHJldHJ5QWZ0ZXJgIERhdGUgcGFzc2VzIGBpbnN0YW5jZW9mXG4gICAgICAvLyBnbG9iYWwuRGF0ZWAgY2hlY2tzIGluIHRoZSB0YXJnZXQgcmVhbG0uIFNlZSB0aGUgRmF0YWxFcnJvciByZXZpdmVyXG4gICAgICAvLyBhYm92ZSBmb3Igd2h5IHdlIHJlc29sdmUgYFJldHJ5YWJsZUVycm9yYCBmcm9tIHRoZSBjb25zdW1lcidzXG4gICAgICAvLyBnbG9iYWxUaGlzIGluc3RlYWQgb2YgdGhlIGltcG9ydGVkIGNsYXNzLlxuICAgICAgY29uc3QgQ3RvciA9XG4gICAgICAgICgoZ2xvYmFsIGFzIFJlY29yZDxzeW1ib2wsIHVua25vd24+KVtcbiAgICAgICAgICBTeW1ib2wuZm9yKCdAd29ya2Zsb3cvZXJyb3JzLy9SZXRyeWFibGVFcnJvcicpXG4gICAgICAgIF0gYXMgdHlwZW9mIFJldHJ5YWJsZUVycm9yIHwgdW5kZWZpbmVkKSA/PyBSZXRyeWFibGVFcnJvcjtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEN0b3IodmFsdWUubWVzc2FnZSwge1xuICAgICAgICByZXRyeUFmdGVyOiBuZXcgZ2xvYmFsLkRhdGUodmFsdWUucmV0cnlBZnRlciksXG4gICAgICB9KTtcbiAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHZhbHVlLnN0YWNrO1xuICAgICAgaWYgKCdjYXVzZScgaW4gdmFsdWUpIGVycm9yLmNhdXNlID0gdmFsdWUuY2F1c2U7XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSxcbiAgICBSdW50aW1lRGVjcnlwdGlvbkVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIFJlc29sdmUgZnJvbSB0aGUgY29uc3VtZXIncyBnbG9iYWxUaGlzIChzZWUgdGhlIEZhdGFsRXJyb3IgcmV2aXZlclxuICAgICAgLy8gYWJvdmUpIHNvIGBpbnN0YW5jZW9mIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3JgIGhvbGRzIGFjcm9zcyByZWFsbXMuXG4gICAgICBjb25zdCBDdG9yID1cbiAgICAgICAgKChnbG9iYWwgYXMgUmVjb3JkPHN5bWJvbCwgdW5rbm93bj4pW1xuICAgICAgICAgIFN5bWJvbC5mb3IoJ0B3b3JrZmxvdy9lcnJvcnMvL1J1bnRpbWVEZWNyeXB0aW9uRXJyb3InKVxuICAgICAgICBdIGFzIHR5cGVvZiBSdW50aW1lRGVjcnlwdGlvbkVycm9yIHwgdW5kZWZpbmVkKSA/P1xuICAgICAgICBSdW50aW1lRGVjcnlwdGlvbkVycm9yO1xuICAgICAgY29uc3Qgb3B0czogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPHR5cGVvZiBSdW50aW1lRGVjcnlwdGlvbkVycm9yPlsxXSA9IHt9O1xuICAgICAgaWYgKCdjYXVzZScgaW4gdmFsdWUpIG9wdHMuY2F1c2UgPSB2YWx1ZS5jYXVzZTtcbiAgICAgIGlmICh2YWx1ZS5jb250ZXh0ICE9PSB1bmRlZmluZWQpIG9wdHMuY29udGV4dCA9IHZhbHVlLmNvbnRleHQ7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBDdG9yKHZhbHVlLm1lc3NhZ2UsIG9wdHMpO1xuICAgICAgaWYgKHZhbHVlLnN0YWNrICE9PSB1bmRlZmluZWQpIGVycm9yLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSxcbiAgICBTeW50YXhFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZXZpdmVyKGdsb2JhbCwgJ1N5bnRheEVycm9yJyksXG4gICAgVHlwZUVycm9yOiBtYWtlRXJyb3JTdWJjbGFzc1Jldml2ZXIoZ2xvYmFsLCAnVHlwZUVycm9yJyksXG4gICAgVVJJRXJyb3I6IG1ha2VFcnJvclN1YmNsYXNzUmV2aXZlcihnbG9iYWwsICdVUklFcnJvcicpLFxuICAgIEFnZ3JlZ2F0ZUVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IG9wdHMgPSAnY2F1c2UnIGluIHZhbHVlID8geyBjYXVzZTogdmFsdWUuY2F1c2UgfSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IGdsb2JhbC5BZ2dyZWdhdGVFcnJvcihcbiAgICAgICAgdmFsdWUuZXJyb3JzLFxuICAgICAgICB2YWx1ZS5tZXNzYWdlLFxuICAgICAgICBvcHRzXG4gICAgICApO1xuICAgICAgaWYgKHZhbHVlLnN0YWNrICE9PSB1bmRlZmluZWQpIGVycm9yLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSxcbiAgICAvLyBCYXNlIEVycm9yIHJldml2ZXIg4oCUIHVzZWQgZm9yIHBsYWluIEVycm9yIGluc3RhbmNlcyBhbmQgdW5yZWNvZ25pemVkXG4gICAgLy8gRXJyb3Igc3ViY2xhc3Nlcy4gUHJlc2VydmVzIGBuYW1lYCBzbyB0aGUgZXJyb3IncyBpZGVudGl0eSBpcyByZXRhaW5lZC5cbiAgICBFcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBvcHRzID0gJ2NhdXNlJyBpbiB2YWx1ZSA/IHsgY2F1c2U6IHZhbHVlLmNhdXNlIH0gOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBnbG9iYWwuRXJyb3IodmFsdWUubWVzc2FnZSwgb3B0cyk7XG4gICAgICBlcnJvci5uYW1lID0gdmFsdWUubmFtZTtcbiAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHZhbHVlLnN0YWNrO1xuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgRmxvYXQzMkFycmF5OiAodmFsdWU6IHN0cmluZykgPT5cbiAgICAgIG5ldyBnbG9iYWwuRmxvYXQzMkFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlLCBnbG9iYWwpKSxcbiAgICBGbG9hdDY0QXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5GbG9hdDY0QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUsIGdsb2JhbCkpLFxuICAgIEhlYWRlcnM6ICh2YWx1ZSkgPT4gbmV3IGdsb2JhbC5IZWFkZXJzKHZhbHVlKSxcbiAgICBJbnQ4QXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5JbnQ4QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUsIGdsb2JhbCkpLFxuICAgIEludDE2QXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5JbnQxNkFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlLCBnbG9iYWwpKSxcbiAgICBJbnQzMkFycmF5OiAodmFsdWU6IHN0cmluZykgPT5cbiAgICAgIG5ldyBnbG9iYWwuSW50MzJBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSwgZ2xvYmFsKSksXG4gICAgTWFwOiAodmFsdWUpID0+IG5ldyBnbG9iYWwuTWFwKHZhbHVlKSxcbiAgICBSZWdFeHA6ICh2YWx1ZSkgPT4gbmV3IGdsb2JhbC5SZWdFeHAodmFsdWUuc291cmNlLCB2YWx1ZS5mbGFncyksXG4gICAgU2V0OiAodmFsdWUpID0+IG5ldyBnbG9iYWwuU2V0KHZhbHVlKSxcbiAgICBVUkw6ICh2YWx1ZSkgPT4gbmV3IGdsb2JhbC5VUkwodmFsdWUpLFxuICAgIFdvcmtmbG93RnVuY3Rpb246ICh2YWx1ZSkgPT5cbiAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnV29ya2Zsb3cgZnVuY3Rpb25zIGNhbm5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuIFVzZSBzdGFydCgpIHRvIGludm9rZSB0aGVtLidcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICB7IHdvcmtmbG93SWQ6IHZhbHVlLndvcmtmbG93SWQgfVxuICAgICAgKSxcbiAgICBVUkxTZWFyY2hQYXJhbXM6ICh2YWx1ZSkgPT5cbiAgICAgIG5ldyBnbG9iYWwuVVJMU2VhcmNoUGFyYW1zKHZhbHVlID09PSAnLicgPyAnJyA6IHZhbHVlKSxcbiAgICBVaW50OEFycmF5OiAodmFsdWU6IHN0cmluZykgPT5cbiAgICAgIG5ldyBnbG9iYWwuVWludDhBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSwgZ2xvYmFsKSksXG4gICAgVWludDhDbGFtcGVkQXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5VaW50OENsYW1wZWRBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSwgZ2xvYmFsKSksXG4gICAgVWludDE2QXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5VaW50MTZBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSwgZ2xvYmFsKSksXG4gICAgVWludDMyQXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5VaW50MzJBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSwgZ2xvYmFsKSksXG4gIH07XG59XG5cbi8vIFJlLWV4cG9ydCBmb3IgdXNlIGluIGxlZ2FjeSBjb21wYXRcbmV4cG9ydCB7IHJldml2ZSB9O1xuIl19
|