@workflow/core 5.0.0-beta.2 → 5.0.0-beta.20
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 +22 -1
- package/dist/capabilities.d.ts.map +1 -1
- package/dist/capabilities.js +41 -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 +11 -3
- package/dist/classify-error.d.ts.map +1 -1
- package/dist/classify-error.js +59 -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 +147 -0
- package/dist/create-hook.d.ts +40 -1
- 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 +165 -0
- package/dist/encryption.d.ts +22 -1
- package/dist/encryption.d.ts.map +1 -1
- package/dist/encryption.js +72 -27
- package/dist/events-consumer.d.ts +24 -0
- package/dist/events-consumer.d.ts.map +1 -1
- package/dist/events-consumer.js +79 -16
- package/dist/flushable-stream.d.ts +10 -10
- package/dist/flushable-stream.d.ts.map +1 -1
- package/dist/flushable-stream.js +18 -13
- package/dist/global.d.ts +15 -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 +28 -30
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +77 -31
- package/dist/private.d.ts +84 -0
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +80 -3
- package/dist/runtime/constants.d.ts +93 -0
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +168 -8
- 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 +32 -0
- package/dist/runtime/get-world-lazy.d.ts.map +1 -0
- package/dist/runtime/get-world-lazy.js +56 -0
- package/dist/runtime/helpers.d.ts +50 -7
- package/dist/runtime/helpers.d.ts.map +1 -1
- package/dist/runtime/helpers.js +149 -31
- package/dist/runtime/replay-budget.d.ts +98 -0
- package/dist/runtime/replay-budget.d.ts.map +1 -0
- package/dist/runtime/replay-budget.js +191 -0
- package/dist/runtime/resume-hook.d.ts.map +1 -1
- package/dist/runtime/resume-hook.js +39 -23
- package/dist/runtime/run-id-time.d.ts +10 -0
- package/dist/runtime/run-id-time.d.ts.map +1 -0
- package/dist/runtime/run-id-time.js +31 -0
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +44 -9
- package/dist/runtime/runs.d.ts.map +1 -1
- package/dist/runtime/runs.js +4 -1
- package/dist/runtime/start.d.ts +30 -1
- package/dist/runtime/start.d.ts.map +1 -1
- package/dist/runtime/start.js +138 -20
- package/dist/runtime/step-executor.d.ts +91 -0
- package/dist/runtime/step-executor.d.ts.map +1 -0
- package/dist/runtime/step-executor.js +659 -0
- package/dist/runtime/step-handler.d.ts.map +1 -1
- package/dist/runtime/step-handler.js +699 -556
- package/dist/runtime/suspension-handler.d.ts +55 -6
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +282 -115
- 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 +92 -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-init.d.ts +75 -0
- package/dist/runtime/world-init.d.ts.map +1 -0
- package/dist/runtime/world-init.js +75 -0
- package/dist/runtime/world.d.ts.map +1 -1
- package/dist/runtime/world.js +47 -18
- package/dist/runtime.d.ts +11 -8
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +1234 -334
- package/dist/schemas.d.ts +1 -1
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +1 -1
- 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.d.ts +14 -0
- package/dist/serialization/codec-devalue.d.ts.map +1 -0
- package/dist/serialization/codec-devalue.js +98 -0
- package/dist/serialization/codec.d.ts +106 -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 +33 -0
- package/dist/serialization/encryption.d.ts.map +1 -0
- package/dist/serialization/encryption.js +70 -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/index.d.ts +19 -0
- package/dist/serialization/index.d.ts.map +1 -0
- package/dist/serialization/index.js +22 -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 +68 -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 +417 -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 +88 -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 +253 -0
- package/dist/serialization/types.d.ts.map +1 -0
- package/dist/serialization/types.js +25 -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 +15 -0
- package/dist/serialization-format.d.ts.map +1 -1
- package/dist/serialization-format.js +209 -11
- package/dist/serialization.d.ts +313 -214
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +1417 -658
- package/dist/set-attributes.d.ts +13 -0
- package/dist/set-attributes.d.ts.map +1 -0
- package/dist/set-attributes.js +42 -0
- package/dist/sleep.d.ts.map +1 -1
- package/dist/sleep.js +3 -2
- package/dist/source-map.d.ts +5 -0
- package/dist/source-map.d.ts.map +1 -1
- package/dist/source-map.js +102 -10
- package/dist/step/context-storage.d.ts +16 -0
- package/dist/step/context-storage.d.ts.map +1 -1
- package/dist/step/context-storage.js +1 -1
- 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 +49 -5
- package/dist/step.d.ts.map +1 -1
- package/dist/step.js +98 -20
- package/dist/symbols.d.ts +28 -0
- package/dist/symbols.d.ts.map +1 -1
- package/dist/symbols.js +29 -1
- package/dist/telemetry/semantic-conventions.d.ts +30 -2
- package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
- package/dist/telemetry/semantic-conventions.js +21 -1
- package/dist/telemetry.d.ts +60 -0
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +82 -4
- 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 +3 -2
- 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 +260 -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 +23 -2
- 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 +207 -33
- 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 +73 -0
- package/dist/workflow/set-attributes.d.ts.map +1 -0
- package/dist/workflow/set-attributes.js +65 -0
- package/dist/workflow/sleep.d.ts.map +1 -1
- package/dist/workflow/sleep.js +45 -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.map +1 -1
- package/dist/workflow.js +148 -47
- package/docs/api-reference/create-hook.mdx +38 -0
- package/docs/api-reference/create-webhook.mdx +1 -0
- package/docs/api-reference/experimental-set-attributes.mdx +65 -0
- package/docs/api-reference/fetch.mdx +5 -0
- package/docs/api-reference/index.mdx +3 -0
- 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 +236 -11
- package/docs/foundations/index.mdx +3 -3
- package/docs/foundations/meta.json +3 -2
- package/docs/foundations/serialization.mdx +78 -42
- package/docs/foundations/starting-workflows.mdx +6 -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 +2 -2
- package/docs/how-it-works/encryption.mdx +2 -2
- package/docs/how-it-works/event-sourcing.mdx +2 -2
- package/docs/how-it-works/meta.json +2 -1
- package/package.json +22 -10
- package/docs/foundations/common-patterns.mdx +0 -265
|
@@ -14,6 +14,10 @@ export const SerializationFormat = {
|
|
|
14
14
|
DEVALUE_V1: 'devl',
|
|
15
15
|
/** Encrypted payload (inner payload has its own format prefix after decryption) */
|
|
16
16
|
ENCRYPTED: 'encr',
|
|
17
|
+
/** Gzip-compressed payload (inner payload has its own format prefix after decompression) */
|
|
18
|
+
GZIP: 'gzip',
|
|
19
|
+
/** Zstandard-compressed payload (inner payload has its own format prefix after decompression) */
|
|
20
|
+
ZSTD: 'zstd',
|
|
17
21
|
};
|
|
18
22
|
/** Length of the format prefix in bytes */
|
|
19
23
|
const FORMAT_PREFIX_LENGTH = 4;
|
|
@@ -110,6 +114,105 @@ export function isEncryptedData(data) {
|
|
|
110
114
|
const prefix = formatDecoder.decode(data.subarray(0, FORMAT_PREFIX_LENGTH));
|
|
111
115
|
return prefix === SerializationFormat.ENCRYPTED;
|
|
112
116
|
}
|
|
117
|
+
/**
|
|
118
|
+
* Check if a binary value has a compression format prefix ('gzip' or 'zstd').
|
|
119
|
+
* Browser-safe — does not depend on the full serialization module.
|
|
120
|
+
*/
|
|
121
|
+
export function isCompressedData(data) {
|
|
122
|
+
if (!(data instanceof Uint8Array) || data.length < FORMAT_PREFIX_LENGTH) {
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
const prefix = formatDecoder.decode(data.subarray(0, FORMAT_PREFIX_LENGTH));
|
|
126
|
+
return (prefix === SerializationFormat.GZIP || prefix === SerializationFormat.ZSTD);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Resolve `node:zlib` via `process.getBuiltinModule` — no static Node
|
|
130
|
+
* dependency, invisible to browser bundlers. Returns undefined off Node.
|
|
131
|
+
*/
|
|
132
|
+
function getNodeZlib() {
|
|
133
|
+
try {
|
|
134
|
+
return globalThis.process?.getBuiltinModule?.('node:zlib');
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
return undefined;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Synchronously decompress a `gzip`/`zstd` payload when running on Node.js.
|
|
142
|
+
*
|
|
143
|
+
* Returns `undefined` when sync decompression isn't available (e.g. in the
|
|
144
|
+
* browser, or zstd on Node < 22.15) — callers fall back to leaving the data
|
|
145
|
+
* un-hydrated (the async `hydrateDataWithKey` path handles decompression in
|
|
146
|
+
* browsers via `DecompressionStream` / a registered zstd decoder).
|
|
147
|
+
*/
|
|
148
|
+
function decompressSyncIfAvailable(format, payload) {
|
|
149
|
+
try {
|
|
150
|
+
const zlib = getNodeZlib();
|
|
151
|
+
if (format === SerializationFormat.GZIP && zlib?.gunzipSync) {
|
|
152
|
+
return new Uint8Array(zlib.gunzipSync(payload));
|
|
153
|
+
}
|
|
154
|
+
if (format === SerializationFormat.ZSTD && zlib?.zstdDecompressSync) {
|
|
155
|
+
return new Uint8Array(zlib.zstdDecompressSync(payload));
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
// Fall through — treat as unavailable
|
|
160
|
+
}
|
|
161
|
+
return undefined;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Browser zstd decoder, registered by the o11y host (web-shared) since the
|
|
165
|
+
* Web `DecompressionStream` has no zstd support. Node decodes via `node:zlib`
|
|
166
|
+
* and never needs this. See `registerZstdDecoder`.
|
|
167
|
+
*/
|
|
168
|
+
let zstdBrowserDecoder;
|
|
169
|
+
/**
|
|
170
|
+
* Register a browser zstd decoder (e.g. a WASM-backed one). The web o11y UI
|
|
171
|
+
* calls this at init so `hydrateDataWithKey` can inflate zstd payloads after
|
|
172
|
+
* client-side decryption. Node readers use `node:zlib` and ignore this.
|
|
173
|
+
*/
|
|
174
|
+
export function registerZstdDecoder(decoder) {
|
|
175
|
+
zstdBrowserDecoder = decoder;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Asynchronously decompress a `gzip`/`zstd` payload.
|
|
179
|
+
* - gzip: web-standard `DecompressionStream` (Node 18+, browsers, edge).
|
|
180
|
+
* - zstd: `node:zlib` when on Node, else the registered browser decoder.
|
|
181
|
+
*/
|
|
182
|
+
async function decompressAsync(format, payload) {
|
|
183
|
+
if (format === SerializationFormat.ZSTD) {
|
|
184
|
+
const sync = decompressSyncIfAvailable(format, payload);
|
|
185
|
+
if (sync)
|
|
186
|
+
return sync;
|
|
187
|
+
if (zstdBrowserDecoder)
|
|
188
|
+
return zstdBrowserDecoder(payload);
|
|
189
|
+
throw new Error('zstd-compressed workflow data encountered but no zstd decoder is ' +
|
|
190
|
+
'available. Node.js 22.15+ decodes natively; in the browser register ' +
|
|
191
|
+
'one via registerZstdDecoder (the web o11y package does this).');
|
|
192
|
+
}
|
|
193
|
+
const transform = new DecompressionStream('gzip');
|
|
194
|
+
const writer = transform.writable.getWriter();
|
|
195
|
+
const writePromise = writer.write(payload).then(() => writer.close());
|
|
196
|
+
writePromise.catch(() => { });
|
|
197
|
+
const chunks = [];
|
|
198
|
+
let total = 0;
|
|
199
|
+
const reader = transform.readable.getReader();
|
|
200
|
+
for (;;) {
|
|
201
|
+
const { done, value } = await reader.read();
|
|
202
|
+
if (done)
|
|
203
|
+
break;
|
|
204
|
+
chunks.push(value);
|
|
205
|
+
total += value.length;
|
|
206
|
+
}
|
|
207
|
+
await writePromise;
|
|
208
|
+
const out = new Uint8Array(total);
|
|
209
|
+
let offset = 0;
|
|
210
|
+
for (const chunk of chunks) {
|
|
211
|
+
out.set(chunk, offset);
|
|
212
|
+
offset += chunk.length;
|
|
213
|
+
}
|
|
214
|
+
return out;
|
|
215
|
+
}
|
|
113
216
|
// ---------------------------------------------------------------------------
|
|
114
217
|
// Generic hydrate/dehydrate dispatch
|
|
115
218
|
// ---------------------------------------------------------------------------
|
|
@@ -141,6 +244,20 @@ export function hydrateData(value, revivers) {
|
|
|
141
244
|
const str = new TextDecoder().decode(payload);
|
|
142
245
|
return parse(str, revivers);
|
|
143
246
|
}
|
|
247
|
+
if (format === SerializationFormat.GZIP ||
|
|
248
|
+
format === SerializationFormat.ZSTD) {
|
|
249
|
+
// Compressed payload — decompress synchronously when running on
|
|
250
|
+
// Node.js (CLI, server o11y). In browsers there is no sync codec;
|
|
251
|
+
// pass the data through untouched (like encrypted data) so async
|
|
252
|
+
// consumers can route it through `hydrateDataWithKey`, which
|
|
253
|
+
// decompresses via DecompressionStream / a registered zstd decoder.
|
|
254
|
+
const inflated = decompressSyncIfAvailable(format, payload);
|
|
255
|
+
if (inflated === undefined) {
|
|
256
|
+
return value;
|
|
257
|
+
}
|
|
258
|
+
// The inflated bytes carry their own format prefix (e.g. 'devl')
|
|
259
|
+
return hydrateData(inflated, revivers);
|
|
260
|
+
}
|
|
144
261
|
throw new Error(`Unsupported serialization format: ${format}`);
|
|
145
262
|
}
|
|
146
263
|
if (Array.isArray(value)) {
|
|
@@ -161,16 +278,23 @@ export function hydrateData(value, revivers) {
|
|
|
161
278
|
* @param key - AES-256 encryption key (if provided, encrypted data will be decrypted)
|
|
162
279
|
*/
|
|
163
280
|
export async function hydrateDataWithKey(value, revivers, key) {
|
|
164
|
-
|
|
281
|
+
let data = value;
|
|
282
|
+
if (data instanceof Uint8Array && isEncryptedData(data) && key) {
|
|
165
283
|
// Decrypt: strip 'encr' prefix, AES-GCM decrypt, then hydrate the result
|
|
166
284
|
const { decrypt } = await import('./encryption.js');
|
|
167
|
-
const { payload } = decodeFormatPrefix(
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
285
|
+
const { payload } = decodeFormatPrefix(data);
|
|
286
|
+
data = await decrypt(key, payload);
|
|
287
|
+
}
|
|
288
|
+
if (data instanceof Uint8Array && isCompressedData(data)) {
|
|
289
|
+
// Decompress: strip the codec prefix and inflate. gzip uses the
|
|
290
|
+
// web-standard DecompressionStream (works in browsers); zstd uses
|
|
291
|
+
// node:zlib on Node or the registered WASM decoder in the browser.
|
|
292
|
+
// The inflated bytes carry their own format prefix (e.g. 'devl').
|
|
293
|
+
const { format, payload } = decodeFormatPrefix(data);
|
|
294
|
+
data = await decompressAsync(format, payload);
|
|
295
|
+
}
|
|
296
|
+
// Delegate the (decrypted/decompressed) result to sync hydrateData
|
|
297
|
+
return hydrateData(data, revivers);
|
|
174
298
|
}
|
|
175
299
|
// ---------------------------------------------------------------------------
|
|
176
300
|
// Shared marker types for o11y display
|
|
@@ -308,6 +432,34 @@ export const observabilityRevivers = {
|
|
|
308
432
|
ReadableStream: streamToStreamRef,
|
|
309
433
|
WritableStream: streamToStreamRef,
|
|
310
434
|
TransformStream: streamToStreamRef,
|
|
435
|
+
AbortController: (value) => `<AbortController(aborted: ${value.aborted})>`,
|
|
436
|
+
AbortSignal: (value) => `<AbortSignal(aborted: ${value.aborted})>`,
|
|
437
|
+
// DOMException needs an explicit reviver: without one, devalue.parse
|
|
438
|
+
// throws on the `["DOMException", ...]` tag and `hydrateStepIO`'s
|
|
439
|
+
// try/catch leaves the raw flat-encoded string in the UI. AbortController
|
|
440
|
+
// synthesizes a DOMException as the default `signal.reason` when abort()
|
|
441
|
+
// is called with no arg — so any abort that round-trips through a step
|
|
442
|
+
// boundary surfaces here. Reconstruct as a real DOMException when the
|
|
443
|
+
// global is available (modern browsers + Node 18+), else fall back to
|
|
444
|
+
// an Error preserving name/message/stack/cause for display.
|
|
445
|
+
DOMException: (value) => {
|
|
446
|
+
const G = globalThis;
|
|
447
|
+
if (typeof G.DOMException === 'function') {
|
|
448
|
+
const e = new G.DOMException(value.message, value.name);
|
|
449
|
+
if (value.stack !== undefined)
|
|
450
|
+
e.stack = value.stack;
|
|
451
|
+
if ('cause' in value)
|
|
452
|
+
e.cause = value.cause;
|
|
453
|
+
return e;
|
|
454
|
+
}
|
|
455
|
+
const e = new Error(value.message);
|
|
456
|
+
e.name = value.name;
|
|
457
|
+
if (value.stack !== undefined)
|
|
458
|
+
e.stack = value.stack;
|
|
459
|
+
if ('cause' in value)
|
|
460
|
+
e.cause = value.cause;
|
|
461
|
+
return e;
|
|
462
|
+
},
|
|
311
463
|
StepFunction: serializedStepFunctionToString,
|
|
312
464
|
WorkflowFunction: (value) => `<workflow:${value.workflowId}>`,
|
|
313
465
|
Instance: serializedInstanceToRef,
|
|
@@ -322,6 +474,7 @@ export const observabilityRevivers = {
|
|
|
322
474
|
function hydrateStepIO(resource, revivers) {
|
|
323
475
|
let hydratedInput = resource.input;
|
|
324
476
|
let hydratedOutput = resource.output;
|
|
477
|
+
let hydratedError = resource.error;
|
|
325
478
|
if (resource.input != null) {
|
|
326
479
|
try {
|
|
327
480
|
hydratedInput = hydrateData(resource.input, revivers);
|
|
@@ -338,7 +491,23 @@ function hydrateStepIO(resource, revivers) {
|
|
|
338
491
|
// Leave un-hydrated
|
|
339
492
|
}
|
|
340
493
|
}
|
|
341
|
-
|
|
494
|
+
// The `error` field is `SerializedData` (Uint8Array) produced by
|
|
495
|
+
// `dehydrateStepError`. Hydrate it so observability tools (CLI, web UI)
|
|
496
|
+
// can read `step.error.message`, `step.error.stack`, etc.
|
|
497
|
+
if (resource.error != null) {
|
|
498
|
+
try {
|
|
499
|
+
hydratedError = hydrateData(resource.error, revivers);
|
|
500
|
+
}
|
|
501
|
+
catch {
|
|
502
|
+
// Leave un-hydrated
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
return {
|
|
506
|
+
...resource,
|
|
507
|
+
input: hydratedInput,
|
|
508
|
+
output: hydratedOutput,
|
|
509
|
+
error: hydratedError,
|
|
510
|
+
};
|
|
342
511
|
}
|
|
343
512
|
/**
|
|
344
513
|
* Hydrate the data fields of a workflow run resource.
|
|
@@ -346,6 +515,7 @@ function hydrateStepIO(resource, revivers) {
|
|
|
346
515
|
function hydrateWorkflowIO(resource, revivers) {
|
|
347
516
|
let hydratedInput = resource.input;
|
|
348
517
|
let hydratedOutput = resource.output;
|
|
518
|
+
let hydratedError = resource.error;
|
|
349
519
|
if (resource.input != null) {
|
|
350
520
|
try {
|
|
351
521
|
hydratedInput = hydrateData(resource.input, revivers);
|
|
@@ -362,7 +532,23 @@ function hydrateWorkflowIO(resource, revivers) {
|
|
|
362
532
|
// Leave un-hydrated
|
|
363
533
|
}
|
|
364
534
|
}
|
|
365
|
-
|
|
535
|
+
// The `error` field is `SerializedData` (Uint8Array) produced by
|
|
536
|
+
// `dehydrateRunError`. Hydrate it so observability tools (CLI, web UI)
|
|
537
|
+
// can read `run.error.message`, `run.error.stack`, etc.
|
|
538
|
+
if (resource.error != null) {
|
|
539
|
+
try {
|
|
540
|
+
hydratedError = hydrateData(resource.error, revivers);
|
|
541
|
+
}
|
|
542
|
+
catch {
|
|
543
|
+
// Leave un-hydrated
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
return {
|
|
547
|
+
...resource,
|
|
548
|
+
input: hydratedInput,
|
|
549
|
+
output: hydratedOutput,
|
|
550
|
+
error: hydratedError,
|
|
551
|
+
};
|
|
366
552
|
}
|
|
367
553
|
/**
|
|
368
554
|
* Hydrate the eventData fields of an event resource.
|
|
@@ -416,6 +602,18 @@ function hydrateEventData(resource, revivers) {
|
|
|
416
602
|
// Leave un-hydrated
|
|
417
603
|
}
|
|
418
604
|
}
|
|
605
|
+
// step_failed / step_retrying / run_failed events have eventData.error
|
|
606
|
+
// (the thrown value, serialized via the error pipeline). Without this,
|
|
607
|
+
// event listings in o11y tooling would surface the raw `Uint8Array`
|
|
608
|
+
// payload instead of a hydrated `{ name, message, stack, … }` object.
|
|
609
|
+
if ('error' in eventData && eventData.error != null) {
|
|
610
|
+
try {
|
|
611
|
+
eventData.error = hydrateData(eventData.error, revivers);
|
|
612
|
+
}
|
|
613
|
+
catch {
|
|
614
|
+
// Leave un-hydrated
|
|
615
|
+
}
|
|
616
|
+
}
|
|
419
617
|
return { ...resource, eventData };
|
|
420
618
|
}
|
|
421
619
|
/**
|
|
@@ -503,4 +701,4 @@ export function truncateId(id, maxLength = 12) {
|
|
|
503
701
|
return id;
|
|
504
702
|
return `${id.slice(0, maxLength)}...`;
|
|
505
703
|
}
|
|
506
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXphdGlvbi1mb3JtYXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc2VyaWFsaXphdGlvbi1mb3JtYXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFM0MsOEVBQThFO0FBQzlFLGdEQUFnRDtBQUNoRCw4RUFBOEU7QUFFOUUsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUc7SUFDakMsMkRBQTJEO0lBQzNELFVBQVUsRUFBRSxNQUFNO0lBQ2xCLG1GQUFtRjtJQUNuRixTQUFTLEVBQUUsTUFBTTtDQUNULENBQUM7QUFLWCwyQ0FBMkM7QUFDM0MsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLENBQUM7QUFFL0IsTUFBTSxhQUFhLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztBQUN4QyxNQUFNLGFBQWEsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0FBRXhDOztHQUVHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUNwQyxNQUErQixFQUMvQixPQUE2QjtJQUU3QixJQUFJLENBQUMsQ0FBQyxPQUFPLFlBQVksVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUNyQyxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsTUFBTSxXQUFXLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqRCxJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUssb0JBQW9CLEVBQUUsQ0FBQztRQUNoRCxNQUFNLElBQUksS0FBSyxDQUNiLHFDQUFxQyxvQkFBb0IsMkJBQTJCLE1BQU0sTUFBTSxXQUFXLENBQUMsTUFBTSxTQUFTLENBQzVILENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsb0JBQW9CLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sQ0FB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QUMsRUFBRSxDQUFDO1lBQ3RCLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBZSxDQUFDLENBQUM7UUFDbEMsQ0FBQzthQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2hDLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ3pCLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQixDQUFDO1FBQ0gsQ0FBQzthQUFNLElBQUksS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzlDLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN2QyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDaEIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUVELHVFQUF1RTtBQUN2RSxNQUFNLFVBQVUsVUFBVSxDQUFDLEVBQVUsRUFBRSxTQUFTLEdBQUcsRUFBRTtJQUNuRCxJQUFJLEVBQUUsQ0FBQyxNQUFNLElBQUksU0FBUztRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ3RDLE9BQU8sR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDO0FBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJyb3dzZXItc2FmZSBzZXJpYWxpemF0aW9uIGZvcm1hdCB1dGlsaXRpZXMuXG4gKlxuICogVGhpcyBtb2R1bGUgY29udGFpbnMgdGhlIGZvcm1hdCBwcmVmaXggaGFuZGxpbmcsIGdlbmVyaWMgaHlkcmF0ZS9kZWh5ZHJhdGVcbiAqIGRpc3BhdGNoLCBhbmQgc2hhcmVkIHR5cGVzL2NsYXNzZXMgdXNlZCBieSBhbGwgZW52aXJvbm1lbnRzIChydW50aW1lLCB3ZWJcbiAqIG8xMXksIENMSSBvMTF5KS4gSXQgaGFzIE5PIE5vZGUuanMgZGVwZW5kZW5jaWVzLlxuICovXG5cbmltcG9ydCB7IHBhcnNlLCB1bmZsYXR0ZW4gfSBmcm9tICdkZXZhbHVlJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBGb3JtYXQgcHJlZml4IGNvbnN0YW50cyBhbmQgZW5jb2RpbmcvZGVjb2Rpbmdcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgY29uc3QgU2VyaWFsaXphdGlvbkZvcm1hdCA9IHtcbiAgLyoqIGRldmFsdWUgc3RyaW5naWZ5L3BhcnNlIHdpdGggVGV4dEVuY29kZXIvVGV4dERlY29kZXIgKi9cbiAgREVWQUxVRV9WMTogJ2RldmwnLFxuICAvKiogRW5jcnlwdGVkIHBheWxvYWQgKGlubmVyIHBheWxvYWQgaGFzIGl0cyBvd24gZm9ybWF0IHByZWZpeCBhZnRlciBkZWNyeXB0aW9uKSAqL1xuICBFTkNSWVBURUQ6ICdlbmNyJyxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6YXRpb25Gb3JtYXRUeXBlID1cbiAgKHR5cGVvZiBTZXJpYWxpemF0aW9uRm9ybWF0KVtrZXlvZiB0eXBlb2YgU2VyaWFsaXphdGlvbkZvcm1hdF07XG5cbi8qKiBMZW5ndGggb2YgdGhlIGZvcm1hdCBwcmVmaXggaW4gYnl0ZXMgKi9cbmNvbnN0IEZPUk1BVF9QUkVGSVhfTEVOR1RIID0gNDtcblxuY29uc3QgZm9ybWF0RW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuY29uc3QgZm9ybWF0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKipcbiAqIEVuY29kZSBhIHBheWxvYWQgd2l0aCBhIGZvcm1hdCBwcmVmaXguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVXaXRoRm9ybWF0UHJlZml4KFxuICBmb3JtYXQ6IFNlcmlhbGl6YXRpb25Gb3JtYXRUeXBlLFxuICBwYXlsb2FkOiBVaW50OEFycmF5IHwgdW5rbm93blxuKTogVWludDhBcnJheSB8IHVua25vd24ge1xuICBpZiAoIShwYXlsb2FkIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICByZXR1cm4gcGF5bG9hZDtcbiAgfVxuXG4gIGNvbnN0IHByZWZpeEJ5dGVzID0gZm9ybWF0RW5jb2Rlci5lbmNvZGUoZm9ybWF0KTtcbiAgaWYgKHByZWZpeEJ5dGVzLmxlbmd0aCAhPT0gRk9STUFUX1BSRUZJWF9MRU5HVEgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRm9ybWF0IGlkZW50aWZpZXIgbXVzdCBiZSBleGFjdGx5ICR7Rk9STUFUX1BSRUZJWF9MRU5HVEh9IEFTQ0lJIGNoYXJhY3RlcnMsIGdvdCBcIiR7Zm9ybWF0fVwiICgke3ByZWZpeEJ5dGVzLmxlbmd0aH0gYnl0ZXMpYFxuICAgICk7XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBuZXcgVWludDhBcnJheShGT1JNQVRfUFJFRklYX0xFTkdUSCArIHBheWxvYWQubGVuZ3RoKTtcbiAgcmVzdWx0LnNldChwcmVmaXhCeXRlcywgMCk7XG4gIHJlc3VsdC5zZXQocGF5bG9hZCwgRk9STUFUX1BSRUZJWF9MRU5HVEgpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIERlY29kZSBhIGZvcm1hdC1wcmVmaXhlZCBwYXlsb2FkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlRm9ybWF0UHJlZml4KGRhdGE6IFVpbnQ4QXJyYXkgfCB1bmtub3duKToge1xuICBmb3JtYXQ6IFNlcmlhbGl6YXRpb25Gb3JtYXRUeXBlO1xuICBwYXlsb2FkOiBVaW50OEFycmF5O1xufSB7XG4gIGlmICghKGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkge1xuICAgIHJldHVybiB7XG4gICAgICBmb3JtYXQ6IFNlcmlhbGl6YXRpb25Gb3JtYXQuREVWQUxVRV9WMSxcbiAgICAgIHBheWxvYWQ6IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShKU09OLnN0cmluZ2lmeShkYXRhKSksXG4gICAgfTtcbiAgfVxuXG4gIGlmIChkYXRhLmxlbmd0aCA8IEZPUk1BVF9QUkVGSVhfTEVOR1RIKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYERhdGEgdG9vIHNob3J0IHRvIGNvbnRhaW4gZm9ybWF0IHByZWZpeDogZXhwZWN0ZWQgYXQgbGVhc3QgJHtGT1JNQVRfUFJFRklYX0xFTkdUSH0gYnl0ZXMsIGdvdCAke2RhdGEubGVuZ3RofWBcbiAgICApO1xuICB9XG5cbiAgY29uc3QgcHJlZml4Qnl0ZXMgPSBkYXRhLnN1YmFycmF5KDAsIEZPUk1BVF9QUkVGSVhfTEVOR1RIKTtcbiAgY29uc3QgZm9ybWF0ID0gZm9ybWF0RGVjb2Rlci5kZWNvZGUocHJlZml4Qnl0ZXMpO1xuXG4gIGNvbnN0IGtub3duRm9ybWF0cyA9IE9iamVjdC52YWx1ZXMoU2VyaWFsaXphdGlvbkZvcm1hdCkgYXMgc3RyaW5nW107XG4gIGlmICgha25vd25Gb3JtYXRzLmluY2x1ZGVzKGZvcm1hdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVW5rbm93biBzZXJpYWxpemF0aW9uIGZvcm1hdDogXCIke2Zvcm1hdH1cIi4gS25vd24gZm9ybWF0czogJHtrbm93bkZvcm1hdHMuam9pbignLCAnKX1gXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHBheWxvYWQgPSBkYXRhLnN1YmFycmF5KEZPUk1BVF9QUkVGSVhfTEVOR1RIKTtcbiAgcmV0dXJuIHsgZm9ybWF0OiBmb3JtYXQgYXMgU2VyaWFsaXphdGlvbkZvcm1hdFR5cGUsIHBheWxvYWQgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFbmNyeXB0ZWQgZGF0YSBkZXRlY3Rpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFBsYWNlaG9sZGVyIHN0cmluZyBkaXNwbGF5ZWQgd2hlbiBkYXRhIGlzIGVuY3J5cHRlZCBhbmQgZGVjcnlwdGlvblxuICogaGFzIG5vdCBiZWVuIHJlcXVlc3RlZC4gVXNlZCBieSBib3RoIENMSSBhbmQgd2ViIG8xMXkuXG4gKi9cbmV4cG9ydCBjb25zdCBFTkNSWVBURURfUExBQ0VIT0xERVIgPSAnXFx1ezFGNTEyfSBFbmNyeXB0ZWQnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEV4cGlyZWQgZGF0YSBkZXRlY3Rpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIENoZWNrIGlmIGEgcGxhaW4gb2JqZWN0IGlzIGB7IGV4cGlyZWRBdDogXCI8SVNPIGRhdGU+XCIgfWAg4oCUIGEgc2luZ2xlLWtleVxuICogb2JqZWN0IHdpdGggYSBzdHJpbmcgYGV4cGlyZWRBdGAgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGlzRXhwaXJlZE9iamVjdChkYXRhOiB1bmtub3duKTogZGF0YSBpcyB7IGV4cGlyZWRBdDogc3RyaW5nIH0ge1xuICBpZiAoZGF0YSA9PT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZGF0YSk7XG4gIHJldHVybiAoXG4gICAga2V5cy5sZW5ndGggPT09IDEgJiZcbiAgICBrZXlzWzBdID09PSAnZXhwaXJlZEF0JyAmJlxuICAgIHR5cGVvZiAoZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikuZXhwaXJlZEF0ID09PSAnc3RyaW5nJ1xuICApO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGEgaHlkcmF0ZWQgdmFsdWUgaXMgYW4gZXhwaXJlZCBkYXRhIHN0dWIgZnJvbSB0aGUgc2VydmVyLlxuICpcbiAqIFRoZSBzZXJ2ZXIgcmVwbGFjZXMgZXhwaXJlZCByZWYgZmllbGRzIHdpdGggYSBkZXZhbHVlLWVuY29kZWQgc3R1YlxuICogKGBtYWtlRXhwaXJlZFN0dWJgKSB0aGF0IGRlc2VyaWFsaXplcyB0byBgW3sgZXhwaXJlZEF0OiBcIjxJU08gZGF0ZT5cIiB9XWBcbiAqIGFmdGVyIGB1bmZsYXR0ZW5gIChhcnJheS13cmFwcGVkIGR1ZSB0byBiYWNrd2FyZHMtY29tcGF0aWJsZSBlbmNvZGluZykuXG4gKiBBbHNvIG1hdGNoZXMgdGhlIHVud3JhcHBlZCBgeyBleHBpcmVkQXQ6IFwiLi4uXCIgfWAgZm9ybSBmb3Igcm9idXN0bmVzcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRXhwaXJlZFN0dWIoZGF0YTogdW5rbm93bik6IGJvb2xlYW4ge1xuICAvLyBEaXJlY3Qgb2JqZWN0IGZvcm06IHsgZXhwaXJlZEF0OiBcIi4uLlwiIH1cbiAgaWYgKGlzRXhwaXJlZE9iamVjdChkYXRhKSkgcmV0dXJuIHRydWU7XG4gIC8vIEFycmF5LXdyYXBwZWQgZm9ybSBmcm9tIGRldmFsdWUgdW5mbGF0dGVuOiBbeyBleHBpcmVkQXQ6IFwiLi4uXCIgfV1cbiAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkgJiYgZGF0YS5sZW5ndGggPT09IDEgJiYgaXNFeHBpcmVkT2JqZWN0KGRhdGFbMF0pKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGEgYmluYXJ5IHZhbHVlIGhhcyB0aGUgJ2VuY3InIGZvcm1hdCBwcmVmaXggaW5kaWNhdGluZyBlbmNyeXB0aW9uLlxuICogQnJvd3Nlci1zYWZlIOKAlCBkb2VzIG5vdCBkZXBlbmQgb24gdGhlIGZ1bGwgc2VyaWFsaXphdGlvbiBtb2R1bGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0VuY3J5cHRlZERhdGEoZGF0YTogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIShkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkgfHwgZGF0YS5sZW5ndGggPCBGT1JNQVRfUFJFRklYX0xFTkdUSCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBwcmVmaXggPSBmb3JtYXREZWNvZGVyLmRlY29kZShkYXRhLnN1YmFycmF5KDAsIEZPUk1BVF9QUkVGSVhfTEVOR1RIKSk7XG4gIHJldHVybiBwcmVmaXggPT09IFNlcmlhbGl6YXRpb25Gb3JtYXQuRU5DUllQVEVEO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFJldml2ZXJzIHR5cGUgKHNoYXJlZCBhY3Jvc3MgYWxsIGVudmlyb25tZW50cylcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEEgbWFwIG9mIHR5cGUgbmFtZSDihpIgcmV2aXZlciBmdW5jdGlvbiwgdXNlZCBieSBkZXZhbHVlJ3MgYHBhcnNlYC9gdW5mbGF0dGVuYC5cbiAqIEVhY2ggZW52aXJvbm1lbnQgKHJ1bnRpbWUsIHdlYiwgQ0xJKSBwcm92aWRlcyBpdHMgb3duIHNldC5cbiAqL1xuZXhwb3J0IHR5cGUgUmV2aXZlcnMgPSBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PjtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBHZW5lcmljIGh5ZHJhdGUvZGVoeWRyYXRlIGRpc3BhdGNoXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBIeWRyYXRlIChkZXNlcmlhbGl6ZSkgYSB2YWx1ZSB0aGF0IHdhcyBzdG9yZWQgaW4gdGhlIGRhdGFiYXNlLlxuICpcbiAqIEhhbmRsZXMgZm91ciBkYXRhIHNoYXBlczpcbiAqIDEuIGBVaW50OEFycmF5YCB3aXRoICdlbmNyJyBwcmVmaXgg4oaSIHJldHVybmVkIGFzLWlzIChlbmNyeXB0ZWQsIG5vdCB5ZXQgZGVjcnlwdGVkKVxuICogMi4gYFVpbnQ4QXJyYXlgIHdpdGggYSBmb3JtYXQgcHJlZml4IChzcGVjVmVyc2lvbiAyKykg4oaSIGRlY29kZSBwcmVmaXgsIHBhcnNlXG4gKiAzLiBgQXJyYXlgIChsZWdhY3kgc3BlY1ZlcnNpb24gMSwgXCJyZXZpdmVkIGRldmFsdWVcIikg4oaSIHVuZmxhdHRlblxuICogNC4gT3RoZXIgKGFscmVhZHkgYSBwbGFpbiBKUyB2YWx1ZSkg4oaSIHJldHVybiBhcy1pc1xuICpcbiAqIEVuY3J5cHRlZCBkYXRhIGlzIGludGVudGlvbmFsbHkgbGVmdCBhcyBhIGBVaW50OEFycmF5YCBzbyB0aGF0IGNvbnN1bWVyc1xuICogKENMSSwgd2ViIFVJKSBjYW4gZGV0ZWN0IGl0IHdpdGggYGlzRW5jcnlwdGVkRGF0YSgpYCBhbmQgZGVjaWRlIGhvdyB0b1xuICogaGFuZGxlIGl0IOKAlCB0aGUgQ0xJIHJlcGxhY2VzIGl0IHdpdGggYSBzdHlsZWQgcGxhY2Vob2xkZXIsIHRoZSB3ZWIgVUlcbiAqIHJlbmRlcnMgYW4gXCJFbmNyeXB0ZWRcIiBjYXJkIHdpdGggYSBEZWNyeXB0IGJ1dHRvbiB0aGF0IHRyaWdnZXJzXG4gKiBjbGllbnQtc2lkZSBkZWNyeXB0aW9uIG9uIGRlbWFuZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGh5ZHJhdGVEYXRhKHZhbHVlOiB1bmtub3duLCByZXZpdmVyczogUmV2aXZlcnMpOiB1bmtub3duIHtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgIC8vIEVuY3J5cHRlZCBkYXRhIHBhc3NlcyB0aHJvdWdoIHVudG91Y2hlZCDigJQgbzExeSBsYXllcnMgZGV0ZWN0IGl0IHdpdGhcbiAgICAvLyBpc0VuY3J5cHRlZERhdGEoKSBhbmQgaGFuZGxlIGRpc3BsYXkgKHdlYjogbmFtZWQgY29uc3RydWN0b3Igb2JqZWN0LFxuICAgIC8vIENMSTogRW5jcnlwdGVkRGF0YVJlZiB3aXRoIHV0aWwuaW5zcGVjdC5jdXN0b20pLlxuICAgIGlmIChpc0VuY3J5cHRlZERhdGEodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgeyBmb3JtYXQsIHBheWxvYWQgfSA9IGRlY29kZUZvcm1hdFByZWZpeCh2YWx1ZSk7XG4gICAgaWYgKGZvcm1hdCA9PT0gU2VyaWFsaXphdGlvbkZvcm1hdC5ERVZBTFVFX1YxKSB7XG4gICAgICBjb25zdCBzdHIgPSBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUocGF5bG9hZCk7XG4gICAgICByZXR1cm4gcGFyc2Uoc3RyLCByZXZpdmVycyk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgc2VyaWFsaXphdGlvbiBmb3JtYXQ6ICR7Zm9ybWF0fWApO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHVuZmxhdHRlbih2YWx1ZSwgcmV2aXZlcnMpO1xuICB9XG5cbiAgLy8gQWxyZWFkeSBhIHBsYWluIEpTIHZhbHVlIChlLmcuLCBudW1iZXIsIHN0cmluZywgbnVsbClcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIEh5ZHJhdGUgYSB2YWx1ZSwgZGVjcnlwdGluZyBpdCBmaXJzdCBpZiBhbiBlbmNyeXB0aW9uIGtleSBpcyBwcm92aWRlZC5cbiAqXG4gKiBUaGlzIGlzIHRoZSBhc3luYyB2ZXJzaW9uIG9mIGBoeWRyYXRlRGF0YWAgdGhhdCBzdXBwb3J0cyB0cmFuc3BhcmVudFxuICogZGVjcnlwdGlvbi4gVXNlZCBieSBvMTF5IHRvb2xpbmcgKHdlYiBVSSwgQ0xJKSB3aGVuIHRoZSB1c2VyIHJlcXVlc3RzXG4gKiBkZWNyeXB0aW9uLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBoeWRyYXRlIChtYXkgYmUgZW5jcnlwdGVkKVxuICogQHBhcmFtIHJldml2ZXJzIC0gRGV2YWx1ZSByZXZpdmVycyBmb3IgZGVzZXJpYWxpemF0aW9uXG4gKiBAcGFyYW0ga2V5IC0gQUVTLTI1NiBlbmNyeXB0aW9uIGtleSAoaWYgcHJvdmlkZWQsIGVuY3J5cHRlZCBkYXRhIHdpbGwgYmUgZGVjcnlwdGVkKVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaHlkcmF0ZURhdGFXaXRoS2V5KFxuICB2YWx1ZTogdW5rbm93bixcbiAgcmV2aXZlcnM6IFJldml2ZXJzLFxuICBrZXk6IGltcG9ydCgnLi9lbmNyeXB0aW9uLmpzJykuQ3J5cHRvS2V5IHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPHVua25vd24+IHtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSAmJiBpc0VuY3J5cHRlZERhdGEodmFsdWUpICYmIGtleSkge1xuICAgIC8vIERlY3J5cHQ6IHN0cmlwICdlbmNyJyBwcmVmaXgsIEFFUy1HQ00gZGVjcnlwdCwgdGhlbiBoeWRyYXRlIHRoZSByZXN1bHRcbiAgICBjb25zdCB7IGRlY3J5cHQgfSA9IGF3YWl0IGltcG9ydCgnLi9lbmNyeXB0aW9uLmpzJyk7XG4gICAgY29uc3QgeyBwYXlsb2FkIH0gPSBkZWNvZGVGb3JtYXRQcmVmaXgodmFsdWUpO1xuICAgIGNvbnN0IGRlY3J5cHRlZCA9IGF3YWl0IGRlY3J5cHQoa2V5LCBwYXlsb2FkKTtcbiAgICAvLyBUaGUgZGVjcnlwdGVkIGJ5dGVzIGhhdmUgdGhlaXIgb3duIGZvcm1hdCBwcmVmaXggKGUuZy4sICdkZXZsJylcbiAgICByZXR1cm4gaHlkcmF0ZURhdGEoZGVjcnlwdGVkLCByZXZpdmVycyk7XG4gIH1cbiAgLy8gTm8ga2V5IG9yIG5vdCBlbmNyeXB0ZWQg4oCUIGRlbGVnYXRlIHRvIHN5bmMgaHlkcmF0ZURhdGFcbiAgcmV0dXJuIGh5ZHJhdGVEYXRhKHZhbHVlLCByZXZpdmVycyk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2hhcmVkIG1hcmtlciB0eXBlcyBmb3IgbzExeSBkaXNwbGF5XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgU1RSRUFNX0lEX1BSRUZJWCA9ICdzdHJtXyc7XG5cbi8qKiBNYXJrZXIgZm9yIHN0cmVhbSByZWZlcmVuY2Ugb2JqZWN0cyByZW5kZXJlZCBhcyBsaW5rcyBpbiB0aGUgVUkgKi9cbmV4cG9ydCBjb25zdCBTVFJFQU1fUkVGX1RZUEUgPSAnX193b3JrZmxvd19zdHJlYW1fcmVmX18nO1xuXG4vKiogQSBzdHJlYW0gcmVmZXJlbmNlIGZvciBVSSBkaXNwbGF5ICovXG5leHBvcnQgaW50ZXJmYWNlIFN0cmVhbVJlZiB7XG4gIF9fdHlwZTogdHlwZW9mIFNUUkVBTV9SRUZfVFlQRTtcbiAgc3RyZWFtSWQ6IHN0cmluZztcbn1cblxuLyoqIE1hcmtlciBmb3IgUnVuIHJlZmVyZW5jZSBvYmplY3RzIHJlbmRlcmVkIGFzIGxpbmtzIGluIHRoZSBVSSAqL1xuZXhwb3J0IGNvbnN0IFJVTl9SRUZfVFlQRSA9ICdfX3dvcmtmbG93X3J1bl9yZWZfXyc7XG5cbi8qKiBBIFJ1biByZWZlcmVuY2UgZm9yIFVJIGRpc3BsYXkgKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVuUmVmIHtcbiAgX190eXBlOiB0eXBlb2YgUlVOX1JFRl9UWVBFO1xuICBydW5JZDogc3RyaW5nO1xufVxuXG4vKiogQ2hlY2sgaWYgYSB2YWx1ZSBpcyBhIFJ1blJlZiBvYmplY3QgKi9cbmV4cG9ydCBjb25zdCBpc1J1blJlZiA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJ1blJlZiA9PiB7XG4gIHJldHVybiAoXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgJ19fdHlwZScgaW4gdmFsdWUgJiZcbiAgICB2YWx1ZS5fX3R5cGUgPT09IFJVTl9SRUZfVFlQRSAmJlxuICAgICdydW5JZCcgaW4gdmFsdWUgJiZcbiAgICB0eXBlb2YgdmFsdWUucnVuSWQgPT09ICdzdHJpbmcnXG4gICk7XG59O1xuXG4vKiogQ29udmVydCBhIHNlcmlhbGl6ZWQgUnVuIHZhbHVlIHRvIGEgUnVuUmVmIGZvciBkaXNwbGF5ICovXG5leHBvcnQgY29uc3Qgc2VyaWFsaXplZFJ1blRvUnVuUmVmID0gKHZhbHVlOiB7IHJ1bklkOiBzdHJpbmcgfSk6IFJ1blJlZiA9PiB7XG4gIHJldHVybiB7IF9fdHlwZTogUlVOX1JFRl9UWVBFLCBydW5JZDogdmFsdWUucnVuSWQgfTtcbn07XG5cbi8qKiBNYXJrZXIgZm9yIGN1c3RvbSBjbGFzcyBpbnN0YW5jZSByZWZlcmVuY2VzICovXG5leHBvcnQgY29uc3QgQ0xBU1NfSU5TVEFOQ0VfUkVGX1RZUEUgPSAnX193b3JrZmxvd19jbGFzc19pbnN0YW5jZV9yZWZfXyc7XG5cbi8qKlxuICogQSBjbGFzcyBpbnN0YW5jZSByZWZlcmVuY2UgZm9yIG8xMXkgZGlzcGxheS5cbiAqXG4gKiBCcm93c2VyLXNhZmUgYmFzZSBjbGFzcyDigJQgbm8gYHV0aWwuaW5zcGVjdC5jdXN0b21gLiBFbnZpcm9ubWVudC1zcGVjaWZpY1xuICogcmVuZGVyaW5nIChDTEkgaW5zcGVjdCwgd2ViIGNvbXBvbmVudCkgaXMgaGFuZGxlZCBieSBlYWNoIGNvbnN1bWVyLlxuICovXG5leHBvcnQgY2xhc3MgQ2xhc3NJbnN0YW5jZVJlZiB7XG4gIHJlYWRvbmx5IF9fdHlwZSA9IENMQVNTX0lOU1RBTkNFX1JFRl9UWVBFO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBjbGFzc05hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgY2xhc3NJZDogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBkYXRhOiB1bmtub3duXG4gICkge31cblxuICB0b0pTT04oKToge1xuICAgIF9fdHlwZTogc3RyaW5nO1xuICAgIGNsYXNzTmFtZTogc3RyaW5nO1xuICAgIGNsYXNzSWQ6IHN0cmluZztcbiAgICBkYXRhOiB1bmtub3duO1xuICB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlOiB0aGlzLl9fdHlwZSxcbiAgICAgIGNsYXNzTmFtZTogdGhpcy5jbGFzc05hbWUsXG4gICAgICBjbGFzc0lkOiB0aGlzLmNsYXNzSWQsXG4gICAgICBkYXRhOiB0aGlzLmRhdGEsXG4gICAgfTtcbiAgfVxufVxuXG4vKiogQ2hlY2sgaWYgYSB2YWx1ZSBpcyBhIENsYXNzSW5zdGFuY2VSZWYgb2JqZWN0ICovXG5leHBvcnQgY29uc3QgaXNDbGFzc0luc3RhbmNlUmVmID0gKFxuICB2YWx1ZTogdW5rbm93blxuKTogdmFsdWUgaXMgQ2xhc3NJbnN0YW5jZVJlZiA9PiB7XG4gIHJldHVybiAoXG4gICAgdmFsdWUgaW5zdGFuY2VvZiBDbGFzc0luc3RhbmNlUmVmIHx8XG4gICAgKHZhbHVlICE9PSBudWxsICYmXG4gICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgICAnX190eXBlJyBpbiB2YWx1ZSAmJlxuICAgICAgdmFsdWUuX190eXBlID09PSBDTEFTU19JTlNUQU5DRV9SRUZfVFlQRSAmJlxuICAgICAgJ2NsYXNzTmFtZScgaW4gdmFsdWUgJiZcbiAgICAgIHR5cGVvZiB2YWx1ZS5jbGFzc05hbWUgPT09ICdzdHJpbmcnKVxuICApO1xufTtcblxuLyoqIENoZWNrIGlmIGEgdmFsdWUgaXMgYSBzdHJlYW0gSUQgc3RyaW5nICovXG5leHBvcnQgY29uc3QgaXNTdHJlYW1JZCA9ICh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5zdGFydHNXaXRoKFNUUkVBTV9JRF9QUkVGSVgpO1xufTtcblxuLyoqIENoZWNrIGlmIGEgdmFsdWUgaXMgYSBTdHJlYW1SZWYgb2JqZWN0ICovXG5leHBvcnQgY29uc3QgaXNTdHJlYW1SZWYgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBTdHJlYW1SZWYgPT4ge1xuICByZXR1cm4gKFxuICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICdfX3R5cGUnIGluIHZhbHVlICYmXG4gICAgdmFsdWUuX190eXBlID09PSBTVFJFQU1fUkVGX1RZUEUgJiZcbiAgICAnc3RyZWFtSWQnIGluIHZhbHVlICYmXG4gICAgdHlwZW9mIHZhbHVlLnN0cmVhbUlkID09PSAnc3RyaW5nJ1xuICApO1xufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTaGFyZWQgbzExeSByZXZpdmVyIGhlbHBlcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIENvbnZlcnQgYSBzZXJpYWxpemVkIHN0cmVhbSB2YWx1ZSB0byBhIFN0cmVhbVJlZiBmb3IgZGlzcGxheS5cbiAqL1xuZXhwb3J0IGNvbnN0IHN0cmVhbVRvU3RyZWFtUmVmID0gKHZhbHVlOiBhbnkpOiBTdHJlYW1SZWYgPT4ge1xuICBsZXQgc3RyZWFtSWQ6IHN0cmluZztcbiAgaWYgKCduYW1lJyBpbiB2YWx1ZSkge1xuICAgIGNvbnN0IG5hbWUgPSBTdHJpbmcodmFsdWUubmFtZSk7XG4gICAgaWYgKCFuYW1lLnN0YXJ0c1dpdGgoU1RSRUFNX0lEX1BSRUZJWCkpIHtcbiAgICAgIHN0cmVhbUlkID0gYCR7U1RSRUFNX0lEX1BSRUZJWH0ke25hbWV9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyZWFtSWQgPSBuYW1lO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzdHJlYW1JZCA9IGAke1NUUkVBTV9JRF9QUkVGSVh9bnVsbGA7XG4gIH1cbiAgcmV0dXJuIHsgX190eXBlOiBTVFJFQU1fUkVGX1RZUEUsIHN0cmVhbUlkIH07XG59O1xuXG4vKiogQ29udmVydCBhIHNlcmlhbGl6ZWQgc3RlcCBmdW5jdGlvbiB0byBhIGRpc3BsYXkgc3RyaW5nICovXG5leHBvcnQgY29uc3Qgc2VyaWFsaXplZFN0ZXBGdW5jdGlvblRvU3RyaW5nID0gKHZhbHVlOiB1bmtub3duKTogc3RyaW5nID0+IHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuICdudWxsJztcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiAnbnVsbCc7XG4gIGlmICgnc3RlcElkJyBpbiB2YWx1ZSkge1xuICAgIHJldHVybiBgPHN0ZXA6JHsodmFsdWUgYXMgeyBzdGVwSWQ6IHN0cmluZyB9KS5zdGVwSWR9PmA7XG4gIH1cbiAgcmV0dXJuICc8ZnVuY3Rpb24+Jztcbn07XG5cbi8qKiBFeHRyYWN0IHRoZSBjbGFzcyBuYW1lIGZyb20gYSBjbGFzc0lkICovXG5leHBvcnQgY29uc3QgZXh0cmFjdENsYXNzTmFtZSA9IChjbGFzc0lkOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBpZiAoIWNsYXNzSWQpIHJldHVybiAnVW5rbm93bic7XG4gIGNvbnN0IHBhcnRzID0gY2xhc3NJZC5zcGxpdCgnLycpO1xuICByZXR1cm4gcGFydHNbcGFydHMubGVuZ3RoIC0gMV0gfHwgY2xhc3NJZDtcbn07XG5cbi8qKiBDb252ZXJ0IGEgc2VyaWFsaXplZCBjbGFzcyBpbnN0YW5jZSB0byBhIENsYXNzSW5zdGFuY2VSZWYgZm9yIGRpc3BsYXkuXG4gKiAgUnVuIGluc3RhbmNlcyBhcmUgc3BlY2lhbC1jYXNlZCB0byBhIFJ1blJlZiBmb3IgY2xpY2thYmxlIHJlbmRlcmluZy4gKi9cbmV4cG9ydCBjb25zdCBzZXJpYWxpemVkSW5zdGFuY2VUb1JlZiA9ICh2YWx1ZToge1xuICBjbGFzc0lkOiBzdHJpbmc7XG4gIGRhdGE6IHVua25vd247XG59KTogQ2xhc3NJbnN0YW5jZVJlZiB8IFJ1blJlZiA9PiB7XG4gIGNvbnN0IGNsYXNzTmFtZSA9IGV4dHJhY3RDbGFzc05hbWUodmFsdWUuY2xhc3NJZCk7XG4gIGlmIChcbiAgICBjbGFzc05hbWUgPT09ICdSdW4nICYmXG4gICAgdmFsdWUuZGF0YSAhPT0gbnVsbCAmJlxuICAgIHR5cGVvZiB2YWx1ZS5kYXRhID09PSAnb2JqZWN0JyAmJlxuICAgICdydW5JZCcgaW4gdmFsdWUuZGF0YSAmJlxuICAgIHR5cGVvZiAodmFsdWUuZGF0YSBhcyB7IHJ1bklkOiB1bmtub3duIH0pLnJ1bklkID09PSAnc3RyaW5nJ1xuICApIHtcbiAgICByZXR1cm4gc2VyaWFsaXplZFJ1blRvUnVuUmVmKHZhbHVlLmRhdGEgYXMgeyBydW5JZDogc3RyaW5nIH0pO1xuICB9XG4gIHJldHVybiBuZXcgQ2xhc3NJbnN0YW5jZVJlZihjbGFzc05hbWUsIHZhbHVlLmNsYXNzSWQsIHZhbHVlLmRhdGEpO1xufTtcblxuLyoqIENvbnZlcnQgYSBzZXJpYWxpemVkIGNsYXNzIHJlZmVyZW5jZSB0byBhIGRpc3BsYXkgc3RyaW5nICovXG5leHBvcnQgY29uc3Qgc2VyaWFsaXplZENsYXNzVG9TdHJpbmcgPSAodmFsdWU6IHsgY2xhc3NJZDogc3RyaW5nIH0pOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gYDxjbGFzczoke2V4dHJhY3RDbGFzc05hbWUodmFsdWUuY2xhc3NJZCl9PmA7XG59O1xuXG4vKipcbiAqIFN0YW5kYXJkIG8xMXkgcmV2aXZlcnMgdGhhdCBvdmVycmlkZSBydW50aW1lLXNwZWNpZmljIHR5cGVzIHdpdGhcbiAqIGRpc3BsYXktZnJpZW5kbHkgdmFsdWVzLiBVc2VkIGJ5IGJvdGggd2ViIGFuZCBDTEkgaHlkcmF0aW9uLlxuICovXG5leHBvcnQgY29uc3Qgb2JzZXJ2YWJpbGl0eVJldml2ZXJzOiBSZXZpdmVycyA9IHtcbiAgUmVhZGFibGVTdHJlYW06IHN0cmVhbVRvU3RyZWFtUmVmLFxuICBXcml0YWJsZVN0cmVhbTogc3RyZWFtVG9TdHJlYW1SZWYsXG4gIFRyYW5zZm9ybVN0cmVhbTogc3RyZWFtVG9TdHJlYW1SZWYsXG4gIFN0ZXBGdW5jdGlvbjogc2VyaWFsaXplZFN0ZXBGdW5jdGlvblRvU3RyaW5nLFxuICBXb3JrZmxvd0Z1bmN0aW9uOiAodmFsdWU6IHsgd29ya2Zsb3dJZDogc3RyaW5nIH0pID0+XG4gICAgYDx3b3JrZmxvdzoke3ZhbHVlLndvcmtmbG93SWR9PmAsXG4gIEluc3RhbmNlOiBzZXJpYWxpemVkSW5zdGFuY2VUb1JlZixcbiAgQ2xhc3M6IHNlcmlhbGl6ZWRDbGFzc1RvU3RyaW5nLFxufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBSZXNvdXJjZS1sZXZlbCBoeWRyYXRpb24gZGlzcGF0Y2ggKGZvciBvMTF5KVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogSHlkcmF0ZSB0aGUgZGF0YSBmaWVsZHMgb2YgYSBzdGVwIHJlc291cmNlLlxuICovXG5mdW5jdGlvbiBoeWRyYXRlU3RlcElPPFxuICBUIGV4dGVuZHMgeyBzdGVwSWQ/OiBzdHJpbmc7IGlucHV0PzogYW55OyBvdXRwdXQ/OiBhbnkgfSxcbj4ocmVzb3VyY2U6IFQsIHJldml2ZXJzOiBSZXZpdmVycyk6IFQge1xuICBsZXQgaHlkcmF0ZWRJbnB1dCA9IHJlc291cmNlLmlucHV0O1xuICBsZXQgaHlkcmF0ZWRPdXRwdXQgPSByZXNvdXJjZS5vdXRwdXQ7XG5cbiAgaWYgKHJlc291cmNlLmlucHV0ICE9IG51bGwpIHtcbiAgICB0cnkge1xuICAgICAgaHlkcmF0ZWRJbnB1dCA9IGh5ZHJhdGVEYXRhKHJlc291cmNlLmlucHV0LCByZXZpdmVycyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBMZWF2ZSB1bi1oeWRyYXRlZFxuICAgIH1cbiAgfVxuXG4gIGlmIChyZXNvdXJjZS5vdXRwdXQgIT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICBoeWRyYXRlZE91dHB1dCA9IGh5ZHJhdGVEYXRhKHJlc291cmNlLm91dHB1dCwgcmV2aXZlcnMpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTGVhdmUgdW4taHlkcmF0ZWRcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyAuLi5yZXNvdXJjZSwgaW5wdXQ6IGh5ZHJhdGVkSW5wdXQsIG91dHB1dDogaHlkcmF0ZWRPdXRwdXQgfTtcbn1cblxuLyoqXG4gKiBIeWRyYXRlIHRoZSBkYXRhIGZpZWxkcyBvZiBhIHdvcmtmbG93IHJ1biByZXNvdXJjZS5cbiAqL1xuZnVuY3Rpb24gaHlkcmF0ZVdvcmtmbG93SU88VCBleHRlbmRzIHsgaW5wdXQ/OiBhbnk7IG91dHB1dD86IGFueSB9PihcbiAgcmVzb3VyY2U6IFQsXG4gIHJldml2ZXJzOiBSZXZpdmVyc1xuKTogVCB7XG4gIGxldCBoeWRyYXRlZElucHV0ID0gcmVzb3VyY2UuaW5wdXQ7XG4gIGxldCBoeWRyYXRlZE91dHB1dCA9IHJlc291cmNlLm91dHB1dDtcblxuICBpZiAocmVzb3VyY2UuaW5wdXQgIT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICBoeWRyYXRlZElucHV0ID0gaHlkcmF0ZURhdGEocmVzb3VyY2UuaW5wdXQsIHJldml2ZXJzKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIExlYXZlIHVuLWh5ZHJhdGVkXG4gICAgfVxuICB9XG5cbiAgaWYgKHJlc291cmNlLm91dHB1dCAhPSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIGh5ZHJhdGVkT3V0cHV0ID0gaHlkcmF0ZURhdGEocmVzb3VyY2Uub3V0cHV0LCByZXZpdmVycyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBMZWF2ZSB1bi1oeWRyYXRlZFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IC4uLnJlc291cmNlLCBpbnB1dDogaHlkcmF0ZWRJbnB1dCwgb3V0cHV0OiBoeWRyYXRlZE91dHB1dCB9O1xufVxuXG4vKipcbiAqIEh5ZHJhdGUgdGhlIGV2ZW50RGF0YSBmaWVsZHMgb2YgYW4gZXZlbnQgcmVzb3VyY2UuXG4gKi9cbmZ1bmN0aW9uIGh5ZHJhdGVFdmVudERhdGE8VCBleHRlbmRzIHsgZXZlbnRJZD86IHN0cmluZzsgZXZlbnREYXRhPzogYW55IH0+KFxuICByZXNvdXJjZTogVCxcbiAgcmV2aXZlcnM6IFJldml2ZXJzXG4pOiBUIHtcbiAgaWYgKCFyZXNvdXJjZS5ldmVudERhdGEpIHJldHVybiByZXNvdXJjZTtcblxuICBjb25zdCBldmVudERhdGEgPSB7IC4uLnJlc291cmNlLmV2ZW50RGF0YSB9O1xuXG4gIC8vIHN0ZXBfY29tcGxldGVkIGV2ZW50cyBoYXZlIGV2ZW50RGF0YS5yZXN1bHQgKHNlcmlhbGl6ZWQgcmV0dXJuIHZhbHVlKVxuICBpZiAoJ3Jlc3VsdCcgaW4gZXZlbnREYXRhICYmIGV2ZW50RGF0YS5yZXN1bHQgIT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICBldmVudERhdGEucmVzdWx0ID0gaHlkcmF0ZURhdGEoZXZlbnREYXRhLnJlc3VsdCwgcmV2aXZlcnMpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTGVhdmUgdW4taHlkcmF0ZWRcbiAgICB9XG4gIH1cblxuICAvLyBzdGVwX2NyZWF0ZWQgZXZlbnRzIGhhdmUgZXZlbnREYXRhLmlucHV0IChzZXJpYWxpemVkIHN0ZXAgYXJndW1lbnRzKVxuICBpZiAoJ2lucHV0JyBpbiBldmVudERhdGEgJiYgZXZlbnREYXRhLmlucHV0ICE9IG51bGwpIHtcbiAgICB0cnkge1xuICAgICAgZXZlbnREYXRhLmlucHV0ID0gaHlkcmF0ZURhdGEoZXZlbnREYXRhLmlucHV0LCByZXZpdmVycyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBMZWF2ZSB1bi1oeWRyYXRlZFxuICAgIH1cbiAgfVxuXG4gIC8vIHJ1bl9jb21wbGV0ZWQgZXZlbnRzIGhhdmUgZXZlbnREYXRhLm91dHB1dCAoc2VyaWFsaXplZCByZXR1cm4gdmFsdWUpXG4gIGlmICgnb3V0cHV0JyBpbiBldmVudERhdGEgJiYgZXZlbnREYXRhLm91dHB1dCAhPSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIGV2ZW50RGF0YS5vdXRwdXQgPSBoeWRyYXRlRGF0YShldmVudERhdGEub3V0cHV0LCByZXZpdmVycyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBMZWF2ZSB1bi1oeWRyYXRlZFxuICAgIH1cbiAgfVxuXG4gIC8vIGhvb2tfY3JlYXRlZCBldmVudHMgbWF5IGhhdmUgc2VyaWFsaXplZCBtZXRhZGF0YVxuICBpZiAoJ21ldGFkYXRhJyBpbiBldmVudERhdGEgJiYgZXZlbnREYXRhLm1ldGFkYXRhICE9IG51bGwpIHtcbiAgICB0cnkge1xuICAgICAgZXZlbnREYXRhLm1ldGFkYXRhID0gaHlkcmF0ZURhdGEoZXZlbnREYXRhLm1ldGFkYXRhLCByZXZpdmVycyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBMZWF2ZSB1bi1oeWRyYXRlZFxuICAgIH1cbiAgfVxuXG4gIC8vIGhvb2tfcmVjZWl2ZWQgZXZlbnRzIGhhdmUgZXZlbnREYXRhLnBheWxvYWQgKHNlcmlhbGl6ZWQgaG9vayBwYXlsb2FkKVxuICBpZiAoJ3BheWxvYWQnIGluIGV2ZW50RGF0YSAmJiBldmVudERhdGEucGF5bG9hZCAhPSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIGV2ZW50RGF0YS5wYXlsb2FkID0gaHlkcmF0ZURhdGEoZXZlbnREYXRhLnBheWxvYWQsIHJldml2ZXJzKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIExlYXZlIHVuLWh5ZHJhdGVkXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgLi4ucmVzb3VyY2UsIGV2ZW50RGF0YSB9O1xufVxuXG4vKipcbiAqIEh5ZHJhdGUgdGhlIG1ldGFkYXRhIGZpZWxkIG9mIGEgaG9vayByZXNvdXJjZS5cbiAqL1xuZnVuY3Rpb24gaHlkcmF0ZUhvb2tNZXRhZGF0YTxUIGV4dGVuZHMgeyBob29rSWQ/OiBzdHJpbmc7IG1ldGFkYXRhPzogYW55IH0+KFxuICByZXNvdXJjZTogVCxcbiAgcmV2aXZlcnM6IFJldml2ZXJzXG4pOiBUIHtcbiAgaWYgKHJlc291cmNlLm1ldGFkYXRhID09IG51bGwpIHJldHVybiByZXNvdXJjZTtcblxuICBsZXQgaHlkcmF0ZWRNZXRhZGF0YSA9IHJlc291cmNlLm1ldGFkYXRhO1xuICB0cnkge1xuICAgIGh5ZHJhdGVkTWV0YWRhdGEgPSBoeWRyYXRlRGF0YShyZXNvdXJjZS5tZXRhZGF0YSwgcmV2aXZlcnMpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBMZWF2ZSB1bi1oeWRyYXRlZFxuICB9XG5cbiAgcmV0dXJuIHsgLi4ucmVzb3VyY2UsIG1ldGFkYXRhOiBoeWRyYXRlZE1ldGFkYXRhIH07XG59XG5cbi8qKlxuICogSHlkcmF0ZSB0aGUgc2VyaWFsaXplZCBkYXRhIGZpZWxkcyBvZiBhbnkgcmVzb3VyY2UgZm9yIG8xMXkgZGlzcGxheS5cbiAqXG4gKiBEaXNwYXRjaGVzIGJ5IHJlc291cmNlIHR5cGUgKHN0ZXAsIGhvb2ssIGV2ZW50LCB3b3JrZmxvdykgYW5kIGNhbGxzXG4gKiBgaHlkcmF0ZURhdGFgIHdpdGggdGhlIHByb3ZpZGVkIHJldml2ZXJzIGZvciBlYWNoIGRhdGEgZmllbGQuXG4gKlxuICogRWFjaCBlbnZpcm9ubWVudCAod2ViLCBDTEkpIHByb3ZpZGVzIGl0cyBvd24gcmV2aXZlcnMg4oCUIHRoaXMgZnVuY3Rpb25cbiAqIG9ubHkgaGFuZGxlcyB0aGUgZGlzcGF0Y2ggbG9naWMgYW5kIGZpZWxkIG1hcHBpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoeWRyYXRlUmVzb3VyY2VJTzxcbiAgVCBleHRlbmRzIHtcbiAgICBzdGVwSWQ/OiBzdHJpbmc7XG4gICAgaG9va0lkPzogc3RyaW5nO1xuICAgIGV2ZW50SWQ/OiBzdHJpbmc7XG4gICAgaW5wdXQ/OiBhbnk7XG4gICAgb3V0cHV0PzogYW55O1xuICAgIG1ldGFkYXRhPzogYW55O1xuICAgIGV2ZW50RGF0YT86IGFueTtcbiAgICBleGVjdXRpb25Db250ZXh0PzogYW55O1xuICB9LFxuPihyZXNvdXJjZTogVCwgcmV2aXZlcnM6IFJldml2ZXJzKTogVCB7XG4gIGlmICghcmVzb3VyY2UpIHJldHVybiByZXNvdXJjZTtcblxuICBsZXQgaHlkcmF0ZWQ6IFQ7XG4gIGlmICgnc3RlcElkJyBpbiByZXNvdXJjZSkge1xuICAgIGh5ZHJhdGVkID0gaHlkcmF0ZVN0ZXBJTyhyZXNvdXJjZSwgcmV2aXZlcnMpO1xuICB9IGVsc2UgaWYgKCdob29rSWQnIGluIHJlc291cmNlKSB7XG4gICAgaHlkcmF0ZWQgPSBoeWRyYXRlSG9va01ldGFkYXRhKHJlc291cmNlLCByZXZpdmVycyk7XG4gIH0gZWxzZSBpZiAoJ2V2ZW50SWQnIGluIHJlc291cmNlKSB7XG4gICAgaHlkcmF0ZWQgPSBoeWRyYXRlRXZlbnREYXRhKHJlc291cmNlLCByZXZpdmVycyk7XG4gIH0gZWxzZSB7XG4gICAgaHlkcmF0ZWQgPSBoeWRyYXRlV29ya2Zsb3dJTyhyZXNvdXJjZSwgcmV2aXZlcnMpO1xuICB9XG5cbiAgLy8gU3RyaXAgZXhlY3V0aW9uQ29udGV4dCwgcHJlc2VydmluZyBvbmx5IHdvcmtmbG93Q29yZVZlcnNpb24gZm9yIGRpc3BsYXlcbiAgaWYgKCdleGVjdXRpb25Db250ZXh0JyBpbiBoeWRyYXRlZCkge1xuICAgIGNvbnN0IHsgZXhlY3V0aW9uQ29udGV4dCwgLi4ucmVzdCB9ID0gaHlkcmF0ZWQ7XG4gICAgY29uc3Qgd29ya2Zsb3dDb3JlVmVyc2lvbiA9XG4gICAgICBleGVjdXRpb25Db250ZXh0ICYmXG4gICAgICB0eXBlb2YgZXhlY3V0aW9uQ29udGV4dCA9PT0gJ29iamVjdCcgJiZcbiAgICAgICd3b3JrZmxvd0NvcmVWZXJzaW9uJyBpbiBleGVjdXRpb25Db250ZXh0XG4gICAgICAgID8gZXhlY3V0aW9uQ29udGV4dC53b3JrZmxvd0NvcmVWZXJzaW9uXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIGlmICh3b3JrZmxvd0NvcmVWZXJzaW9uKSB7XG4gICAgICByZXR1cm4geyAuLi5yZXN0LCB3b3JrZmxvd0NvcmVWZXJzaW9uIH0gYXMgdW5rbm93biBhcyBUO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdCBhcyBUO1xuICB9XG5cbiAgcmV0dXJuIGh5ZHJhdGVkO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFV0aWxpdHkgZnVuY3Rpb25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIEV4dHJhY3QgYWxsIHN0cmVhbSBJRHMgZnJvbSBhIHZhbHVlIChyZWN1cnNpdmVseSB0cmF2ZXJzZXMgb2JqZWN0cy9hcnJheXMpICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFN0cmVhbUlkcyhvYmo6IHVua25vd24pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHN0cmVhbUlkczogc3RyaW5nW10gPSBbXTtcblxuICBmdW5jdGlvbiB0cmF2ZXJzZSh2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIGlmIChpc1N0cmVhbUlkKHZhbHVlKSkge1xuICAgICAgc3RyZWFtSWRzLnB1c2godmFsdWUgYXMgc3RyaW5nKTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHtcbiAgICAgICAgdHJhdmVyc2UoaXRlbSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBmb3IgKGNvbnN0IHZhbCBvZiBPYmplY3QudmFsdWVzKHZhbHVlKSkge1xuICAgICAgICB0cmF2ZXJzZSh2YWwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHRyYXZlcnNlKG9iaik7XG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoc3RyZWFtSWRzKSk7XG59XG5cbi8qKiBUcnVuY2F0ZSBhIHN0cmluZyB0byBhIG1heGltdW0gbGVuZ3RoLCBhZGRpbmcgZWxsaXBzaXMgaWYgbmVlZGVkICovXG5leHBvcnQgZnVuY3Rpb24gdHJ1bmNhdGVJZChpZDogc3RyaW5nLCBtYXhMZW5ndGggPSAxMik6IHN0cmluZyB7XG4gIGlmIChpZC5sZW5ndGggPD0gbWF4TGVuZ3RoKSByZXR1cm4gaWQ7XG4gIHJldHVybiBgJHtpZC5zbGljZSgwLCBtYXhMZW5ndGgpfS4uLmA7XG59XG4iXX0=
|
|
704
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXphdGlvbi1mb3JtYXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc2VyaWFsaXphdGlvbi1mb3JtYXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFM0MsOEVBQThFO0FBQzlFLGdEQUFnRDtBQUNoRCw4RUFBOEU7QUFFOUUsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUc7SUFDakMsMkRBQTJEO0lBQzNELFVBQVUsRUFBRSxNQUFNO0lBQ2xCLG1GQUFtRjtJQUNuRixTQUFTLEVBQUUsTUFBTTtJQUNqQiw0RkFBNEY7SUFDNUYsSUFBSSxFQUFFLE1BQU07SUFDWixpR0FBaUc7SUFDakcsSUFBSSxFQUFFLE1BQU07Q0FDSixDQUFDO0FBS1gsMkNBQTJDO0FBQzNDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO0FBRS9CLE1BQU0sYUFBYSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7QUFDeEMsTUFBTSxhQUFhLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztBQUV4Qzs7R0FFRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FDcEMsTUFBK0IsRUFDL0IsT0FBNkI7SUFFN0IsSUFBSSxDQUFDLENBQUMsT0FBTyxZQUFZLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDckMsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakQsSUFBSSxXQUFXLENBQUMsTUFBTSxLQUFLLG9CQUFvQixFQUFFLENBQUM7UUFDaEQsTUFBTSxJQUFJLEtBQUssQ0FDYixxQ0FBcUMsb0JBQW9CLDJCQUEyQixNQUFNLE1BQU0sV0FBVyxDQUFDLE1BQU0sU0FBUyxDQUM1SCxDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFH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ICogQnJvd3Nlci1zYWZlIHNlcmlhbGl6YXRpb24gZm9ybWF0IHV0aWxpdGllcy5cbiAqXG4gKiBUaGlzIG1vZHVsZSBjb250YWlucyB0aGUgZm9ybWF0IHByZWZpeCBoYW5kbGluZywgZ2VuZXJpYyBoeWRyYXRlL2RlaHlkcmF0ZVxuICogZGlzcGF0Y2gsIGFuZCBzaGFyZWQgdHlwZXMvY2xhc3NlcyB1c2VkIGJ5IGFsbCBlbnZpcm9ubWVudHMgKHJ1bnRpbWUsIHdlYlxuICogbzExeSwgQ0xJIG8xMXkpLiBJdCBoYXMgTk8gTm9kZS5qcyBkZXBlbmRlbmNpZXMuXG4gKi9cblxuaW1wb3J0IHsgcGFyc2UsIHVuZmxhdHRlbiB9IGZyb20gJ2RldmFsdWUnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEZvcm1hdCBwcmVmaXggY29uc3RhbnRzIGFuZCBlbmNvZGluZy9kZWNvZGluZ1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBjb25zdCBTZXJpYWxpemF0aW9uRm9ybWF0ID0ge1xuICAvKiogZGV2YWx1ZSBzdHJpbmdpZnkvcGFyc2Ugd2l0aCBUZXh0RW5jb2Rlci9UZXh0RGVjb2RlciAqL1xuICBERVZBTFVFX1YxOiAnZGV2bCcsXG4gIC8qKiBFbmNyeXB0ZWQgcGF5bG9hZCAoaW5uZXIgcGF5bG9hZCBoYXMgaXRzIG93biBmb3JtYXQgcHJlZml4IGFmdGVyIGRlY3J5cHRpb24pICovXG4gIEVOQ1JZUFRFRDogJ2VuY3InLFxuICAvKiogR3ppcC1jb21wcmVzc2VkIHBheWxvYWQgKGlubmVyIHBheWxvYWQgaGFzIGl0cyBvd24gZm9ybWF0IHByZWZpeCBhZnRlciBkZWNvbXByZXNzaW9uKSAqL1xuICBHWklQOiAnZ3ppcCcsXG4gIC8qKiBac3RhbmRhcmQtY29tcHJlc3NlZCBwYXlsb2FkIChpbm5lciBwYXlsb2FkIGhhcyBpdHMgb3duIGZvcm1hdCBwcmVmaXggYWZ0ZXIgZGVjb21wcmVzc2lvbikgKi9cbiAgWlNURDogJ3pzdGQnLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgU2VyaWFsaXphdGlvbkZvcm1hdFR5cGUgPVxuICAodHlwZW9mIFNlcmlhbGl6YXRpb25Gb3JtYXQpW2tleW9mIHR5cGVvZiBTZXJpYWxpemF0aW9uRm9ybWF0XTtcblxuLyoqIExlbmd0aCBvZiB0aGUgZm9ybWF0IHByZWZpeCBpbiBieXRlcyAqL1xuY29uc3QgRk9STUFUX1BSRUZJWF9MRU5HVEggPSA0O1xuXG5jb25zdCBmb3JtYXRFbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG5jb25zdCBmb3JtYXREZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG5cbi8qKlxuICogRW5jb2RlIGEgcGF5bG9hZCB3aXRoIGEgZm9ybWF0IHByZWZpeC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVdpdGhGb3JtYXRQcmVmaXgoXG4gIGZvcm1hdDogU2VyaWFsaXphdGlvbkZvcm1hdFR5cGUsXG4gIHBheWxvYWQ6IFVpbnQ4QXJyYXkgfCB1bmtub3duXG4pOiBVaW50OEFycmF5IHwgdW5rbm93biB7XG4gIGlmICghKHBheWxvYWQgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkge1xuICAgIHJldHVybiBwYXlsb2FkO1xuICB9XG5cbiAgY29uc3QgcHJlZml4Qnl0ZXMgPSBmb3JtYXRFbmNvZGVyLmVuY29kZShmb3JtYXQpO1xuICBpZiAocHJlZml4Qnl0ZXMubGVuZ3RoICE9PSBGT1JNQVRfUFJFRklYX0xFTkdUSCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBGb3JtYXQgaWRlbnRpZmllciBtdXN0IGJlIGV4YWN0bHkgJHtGT1JNQVRfUFJFRklYX0xFTkdUSH0gQVNDSUkgY2hhcmFjdGVycywgZ290IFwiJHtmb3JtYXR9XCIgKCR7cHJlZml4Qnl0ZXMubGVuZ3RofSBieXRlcylgXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KEZPUk1BVF9QUkVGSVhfTEVOR1RIICsgcGF5bG9hZC5sZW5ndGgpO1xuICByZXN1bHQuc2V0KHByZWZpeEJ5dGVzLCAwKTtcbiAgcmVzdWx0LnNldChwYXlsb2FkLCBGT1JNQVRfUFJFRklYX0xFTkdUSCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogRGVjb2RlIGEgZm9ybWF0LXByZWZpeGVkIHBheWxvYWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVGb3JtYXRQcmVmaXgoZGF0YTogVWludDhBcnJheSB8IHVua25vd24pOiB7XG4gIGZvcm1hdDogU2VyaWFsaXphdGlvbkZvcm1hdFR5cGU7XG4gIHBheWxvYWQ6IFVpbnQ4QXJyYXk7XG59IHtcbiAgaWYgKCEoZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZvcm1hdDogU2VyaWFsaXphdGlvbkZvcm1hdC5ERVZBTFVFX1YxLFxuICAgICAgcGF5bG9hZDogbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKEpTT04uc3RyaW5naWZ5KGRhdGEpKSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGRhdGEubGVuZ3RoIDwgRk9STUFUX1BSRUZJWF9MRU5HVEgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRGF0YSB0b28gc2hvcnQgdG8gY29udGFpbiBmb3JtYXQgcHJlZml4OiBleHBlY3RlZCBhdCBsZWFzdCAke0ZPUk1BVF9QUkVGSVhfTEVOR1RIfSBieXRlcywgZ290ICR7ZGF0YS5sZW5ndGh9YFxuICAgICk7XG4gIH1cblxuICBjb25zdCBwcmVmaXhCeXRlcyA9IGRhdGEuc3ViYXJyYXkoMCwgRk9STUFUX1BSRUZJWF9MRU5HVEgpO1xuICBjb25zdCBmb3JtYXQgPSBmb3JtYXREZWNvZGVyLmRlY29kZShwcmVmaXhCeXRlcyk7XG5cbiAgY29uc3Qga25vd25Gb3JtYXRzID0gT2JqZWN0LnZhbHVlcyhTZXJpYWxpemF0aW9uRm9ybWF0KSBhcyBzdHJpbmdbXTtcbiAgaWYgKCFrbm93bkZvcm1hdHMuaW5jbHVkZXMoZm9ybWF0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBVbmtub3duIHNlcmlhbGl6YXRpb24gZm9ybWF0OiBcIiR7Zm9ybWF0fVwiLiBLbm93biBmb3JtYXRzOiAke2tub3duRm9ybWF0cy5qb2luKCcsICcpfWBcbiAgICApO1xuICB9XG5cbiAgY29uc3QgcGF5bG9hZCA9IGRhdGEuc3ViYXJyYXkoRk9STUFUX1BSRUZJWF9MRU5HVEgpO1xuICByZXR1cm4geyBmb3JtYXQ6IGZvcm1hdCBhcyBTZXJpYWxpemF0aW9uRm9ybWF0VHlwZSwgcGF5bG9hZCB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEVuY3J5cHRlZCBkYXRhIGRldGVjdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogUGxhY2Vob2xkZXIgc3RyaW5nIGRpc3BsYXllZCB3aGVuIGRhdGEgaXMgZW5jcnlwdGVkIGFuZCBkZWNyeXB0aW9uXG4gKiBoYXMgbm90IGJlZW4gcmVxdWVzdGVkLiBVc2VkIGJ5IGJvdGggQ0xJIGFuZCB3ZWIgbzExeS5cbiAqL1xuZXhwb3J0IGNvbnN0IEVOQ1JZUFRFRF9QTEFDRUhPTERFUiA9ICdcXHV7MUY1MTJ9IEVuY3J5cHRlZCc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRXhwaXJlZCBkYXRhIGRldGVjdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQ2hlY2sgaWYgYSBwbGFpbiBvYmplY3QgaXMgYHsgZXhwaXJlZEF0OiBcIjxJU08gZGF0ZT5cIiB9YCDigJQgYSBzaW5nbGUta2V5XG4gKiBvYmplY3Qgd2l0aCBhIHN0cmluZyBgZXhwaXJlZEF0YCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gaXNFeHBpcmVkT2JqZWN0KGRhdGE6IHVua25vd24pOiBkYXRhIGlzIHsgZXhwaXJlZEF0OiBzdHJpbmcgfSB7XG4gIGlmIChkYXRhID09PSBudWxsIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhkYXRhKTtcbiAgcmV0dXJuIChcbiAgICBrZXlzLmxlbmd0aCA9PT0gMSAmJlxuICAgIGtleXNbMF0gPT09ICdleHBpcmVkQXQnICYmXG4gICAgdHlwZW9mIChkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5leHBpcmVkQXQgPT09ICdzdHJpbmcnXG4gICk7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBoeWRyYXRlZCB2YWx1ZSBpcyBhbiBleHBpcmVkIGRhdGEgc3R1YiBmcm9tIHRoZSBzZXJ2ZXIuXG4gKlxuICogVGhlIHNlcnZlciByZXBsYWNlcyBleHBpcmVkIHJlZiBmaWVsZHMgd2l0aCBhIGRldmFsdWUtZW5jb2RlZCBzdHViXG4gKiAoYG1ha2VFeHBpcmVkU3R1YmApIHRoYXQgZGVzZXJpYWxpemVzIHRvIGBbeyBleHBpcmVkQXQ6IFwiPElTTyBkYXRlPlwiIH1dYFxuICogYWZ0ZXIgYHVuZmxhdHRlbmAgKGFycmF5LXdyYXBwZWQgZHVlIHRvIGJhY2t3YXJkcy1jb21wYXRpYmxlIGVuY29kaW5nKS5cbiAqIEFsc28gbWF0Y2hlcyB0aGUgdW53cmFwcGVkIGB7IGV4cGlyZWRBdDogXCIuLi5cIiB9YCBmb3JtIGZvciByb2J1c3RuZXNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFeHBpcmVkU3R1YihkYXRhOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIC8vIERpcmVjdCBvYmplY3QgZm9ybTogeyBleHBpcmVkQXQ6IFwiLi4uXCIgfVxuICBpZiAoaXNFeHBpcmVkT2JqZWN0KGRhdGEpKSByZXR1cm4gdHJ1ZTtcbiAgLy8gQXJyYXktd3JhcHBlZCBmb3JtIGZyb20gZGV2YWx1ZSB1bmZsYXR0ZW46IFt7IGV4cGlyZWRBdDogXCIuLi5cIiB9XVxuICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSAmJiBkYXRhLmxlbmd0aCA9PT0gMSAmJiBpc0V4cGlyZWRPYmplY3QoZGF0YVswXSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBiaW5hcnkgdmFsdWUgaGFzIHRoZSAnZW5jcicgZm9ybWF0IHByZWZpeCBpbmRpY2F0aW5nIGVuY3J5cHRpb24uXG4gKiBCcm93c2VyLXNhZmUg4oCUIGRvZXMgbm90IGRlcGVuZCBvbiB0aGUgZnVsbCBzZXJpYWxpemF0aW9uIG1vZHVsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRW5jcnlwdGVkRGF0YShkYXRhOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICghKGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB8fCBkYXRhLmxlbmd0aCA8IEZPUk1BVF9QUkVGSVhfTEVOR1RIKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHByZWZpeCA9IGZvcm1hdERlY29kZXIuZGVjb2RlKGRhdGEuc3ViYXJyYXkoMCwgRk9STUFUX1BSRUZJWF9MRU5HVEgpKTtcbiAgcmV0dXJuIHByZWZpeCA9PT0gU2VyaWFsaXphdGlvbkZvcm1hdC5FTkNSWVBURUQ7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBiaW5hcnkgdmFsdWUgaGFzIGEgY29tcHJlc3Npb24gZm9ybWF0IHByZWZpeCAoJ2d6aXAnIG9yICd6c3RkJykuXG4gKiBCcm93c2VyLXNhZmUg4oCUIGRvZXMgbm90IGRlcGVuZCBvbiB0aGUgZnVsbCBzZXJpYWxpemF0aW9uIG1vZHVsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ29tcHJlc3NlZERhdGEoZGF0YTogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIShkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkgfHwgZGF0YS5sZW5ndGggPCBGT1JNQVRfUFJFRklYX0xFTkdUSCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBwcmVmaXggPSBmb3JtYXREZWNvZGVyLmRlY29kZShkYXRhLnN1YmFycmF5KDAsIEZPUk1BVF9QUkVGSVhfTEVOR1RIKSk7XG4gIHJldHVybiAoXG4gICAgcHJlZml4ID09PSBTZXJpYWxpemF0aW9uRm9ybWF0LkdaSVAgfHwgcHJlZml4ID09PSBTZXJpYWxpemF0aW9uRm9ybWF0LlpTVERcbiAgKTtcbn1cblxuaW50ZXJmYWNlIE5vZGVabGliRGVjb2RlIHtcbiAgZ3VuemlwU3luYz86IChkYXRhOiBVaW50OEFycmF5KSA9PiBVaW50OEFycmF5O1xuICB6c3RkRGVjb21wcmVzc1N5bmM/OiAoZGF0YTogVWludDhBcnJheSkgPT4gVWludDhBcnJheTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGBub2RlOnpsaWJgIHZpYSBgcHJvY2Vzcy5nZXRCdWlsdGluTW9kdWxlYCDigJQgbm8gc3RhdGljIE5vZGVcbiAqIGRlcGVuZGVuY3ksIGludmlzaWJsZSB0byBicm93c2VyIGJ1bmRsZXJzLiBSZXR1cm5zIHVuZGVmaW5lZCBvZmYgTm9kZS5cbiAqL1xuZnVuY3Rpb24gZ2V0Tm9kZVpsaWIoKTogTm9kZVpsaWJEZWNvZGUgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiAoXG4gICAgICBnbG9iYWxUaGlzIGFzIHtcbiAgICAgICAgcHJvY2Vzcz86IHsgZ2V0QnVpbHRpbk1vZHVsZT86IChpZDogc3RyaW5nKSA9PiBOb2RlWmxpYkRlY29kZSB9O1xuICAgICAgfVxuICAgICkucHJvY2Vzcz8uZ2V0QnVpbHRpbk1vZHVsZT8uKCdub2RlOnpsaWInKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFN5bmNocm9ub3VzbHkgZGVjb21wcmVzcyBhIGBnemlwYC9genN0ZGAgcGF5bG9hZCB3aGVuIHJ1bm5pbmcgb24gTm9kZS5qcy5cbiAqXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gc3luYyBkZWNvbXByZXNzaW9uIGlzbid0IGF2YWlsYWJsZSAoZS5nLiBpbiB0aGVcbiAqIGJyb3dzZXIsIG9yIHpzdGQgb24gTm9kZSA8IDIyLjE1KSDigJQgY2FsbGVycyBmYWxsIGJhY2sgdG8gbGVhdmluZyB0aGUgZGF0YVxuICogdW4taHlkcmF0ZWQgKHRoZSBhc3luYyBgaHlkcmF0ZURhdGFXaXRoS2V5YCBwYXRoIGhhbmRsZXMgZGVjb21wcmVzc2lvbiBpblxuICogYnJvd3NlcnMgdmlhIGBEZWNvbXByZXNzaW9uU3RyZWFtYCAvIGEgcmVnaXN0ZXJlZCB6c3RkIGRlY29kZXIpLlxuICovXG5mdW5jdGlvbiBkZWNvbXByZXNzU3luY0lmQXZhaWxhYmxlKFxuICBmb3JtYXQ6IHN0cmluZyxcbiAgcGF5bG9hZDogVWludDhBcnJheVxuKTogVWludDhBcnJheSB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3QgemxpYiA9IGdldE5vZGVabGliKCk7XG4gICAgaWYgKGZvcm1hdCA9PT0gU2VyaWFsaXphdGlvbkZvcm1hdC5HWklQICYmIHpsaWI/Lmd1bnppcFN5bmMpIHtcbiAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh6bGliLmd1bnppcFN5bmMocGF5bG9hZCkpO1xuICAgIH1cbiAgICBpZiAoZm9ybWF0ID09PSBTZXJpYWxpemF0aW9uRm9ybWF0LlpTVEQgJiYgemxpYj8uenN0ZERlY29tcHJlc3NTeW5jKSB7XG4gICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoemxpYi56c3RkRGVjb21wcmVzc1N5bmMocGF5bG9hZCkpO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gRmFsbCB0aHJvdWdoIOKAlCB0cmVhdCBhcyB1bmF2YWlsYWJsZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQnJvd3NlciB6c3RkIGRlY29kZXIsIHJlZ2lzdGVyZWQgYnkgdGhlIG8xMXkgaG9zdCAod2ViLXNoYXJlZCkgc2luY2UgdGhlXG4gKiBXZWIgYERlY29tcHJlc3Npb25TdHJlYW1gIGhhcyBubyB6c3RkIHN1cHBvcnQuIE5vZGUgZGVjb2RlcyB2aWEgYG5vZGU6emxpYmBcbiAqIGFuZCBuZXZlciBuZWVkcyB0aGlzLiBTZWUgYHJlZ2lzdGVyWnN0ZERlY29kZXJgLlxuICovXG5sZXQgenN0ZEJyb3dzZXJEZWNvZGVyOlxuICB8ICgocGF5bG9hZDogVWludDhBcnJheSkgPT4gUHJvbWlzZTxVaW50OEFycmF5PilcbiAgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogUmVnaXN0ZXIgYSBicm93c2VyIHpzdGQgZGVjb2RlciAoZS5nLiBhIFdBU00tYmFja2VkIG9uZSkuIFRoZSB3ZWIgbzExeSBVSVxuICogY2FsbHMgdGhpcyBhdCBpbml0IHNvIGBoeWRyYXRlRGF0YVdpdGhLZXlgIGNhbiBpbmZsYXRlIHpzdGQgcGF5bG9hZHMgYWZ0ZXJcbiAqIGNsaWVudC1zaWRlIGRlY3J5cHRpb24uIE5vZGUgcmVhZGVycyB1c2UgYG5vZGU6emxpYmAgYW5kIGlnbm9yZSB0aGlzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJac3RkRGVjb2RlcihcbiAgZGVjb2RlcjogKHBheWxvYWQ6IFVpbnQ4QXJyYXkpID0+IFByb21pc2U8VWludDhBcnJheT5cbik6IHZvaWQge1xuICB6c3RkQnJvd3NlckRlY29kZXIgPSBkZWNvZGVyO1xufVxuXG4vKipcbiAqIEFzeW5jaHJvbm91c2x5IGRlY29tcHJlc3MgYSBgZ3ppcGAvYHpzdGRgIHBheWxvYWQuXG4gKiAtIGd6aXA6IHdlYi1zdGFuZGFyZCBgRGVjb21wcmVzc2lvblN0cmVhbWAgKE5vZGUgMTgrLCBicm93c2VycywgZWRnZSkuXG4gKiAtIHpzdGQ6IGBub2RlOnpsaWJgIHdoZW4gb24gTm9kZSwgZWxzZSB0aGUgcmVnaXN0ZXJlZCBicm93c2VyIGRlY29kZXIuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlY29tcHJlc3NBc3luYyhcbiAgZm9ybWF0OiBzdHJpbmcsXG4gIHBheWxvYWQ6IFVpbnQ4QXJyYXlcbik6IFByb21pc2U8VWludDhBcnJheT4ge1xuICBpZiAoZm9ybWF0ID09PSBTZXJpYWxpemF0aW9uRm9ybWF0LlpTVEQpIHtcbiAgICBjb25zdCBzeW5jID0gZGVjb21wcmVzc1N5bmNJZkF2YWlsYWJsZShmb3JtYXQsIHBheWxvYWQpO1xuICAgIGlmIChzeW5jKSByZXR1cm4gc3luYztcbiAgICBpZiAoenN0ZEJyb3dzZXJEZWNvZGVyKSByZXR1cm4genN0ZEJyb3dzZXJEZWNvZGVyKHBheWxvYWQpO1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICd6c3RkLWNvbXByZXNzZWQgd29ya2Zsb3cgZGF0YSBlbmNvdW50ZXJlZCBidXQgbm8genN0ZCBkZWNvZGVyIGlzICcgK1xuICAgICAgICAnYXZhaWxhYmxlLiBOb2RlLmpzIDIyLjE1KyBkZWNvZGVzIG5hdGl2ZWx5OyBpbiB0aGUgYnJvd3NlciByZWdpc3RlciAnICtcbiAgICAgICAgJ29uZSB2aWEgcmVnaXN0ZXJac3RkRGVjb2RlciAodGhlIHdlYiBvMTF5IHBhY2thZ2UgZG9lcyB0aGlzKS4nXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHRyYW5zZm9ybSA9IG5ldyBEZWNvbXByZXNzaW9uU3RyZWFtKCdnemlwJyk7XG4gIGNvbnN0IHdyaXRlciA9IHRyYW5zZm9ybS53cml0YWJsZS5nZXRXcml0ZXIoKTtcbiAgY29uc3Qgd3JpdGVQcm9taXNlID0gd3JpdGVyLndyaXRlKHBheWxvYWQpLnRoZW4oKCkgPT4gd3JpdGVyLmNsb3NlKCkpO1xuICB3cml0ZVByb21pc2UuY2F0Y2goKCkgPT4ge30pO1xuICBjb25zdCBjaHVua3M6IFVpbnQ4QXJyYXlbXSA9IFtdO1xuICBsZXQgdG90YWwgPSAwO1xuICBjb25zdCByZWFkZXIgPSB0cmFuc2Zvcm0ucmVhZGFibGUuZ2V0UmVhZGVyKCk7XG4gIGZvciAoOzspIHtcbiAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgIGlmIChkb25lKSBicmVhaztcbiAgICBjaHVua3MucHVzaCh2YWx1ZSk7XG4gICAgdG90YWwgKz0gdmFsdWUubGVuZ3RoO1xuICB9XG4gIGF3YWl0IHdyaXRlUHJvbWlzZTtcbiAgY29uc3Qgb3V0ID0gbmV3IFVpbnQ4QXJyYXkodG90YWwpO1xuICBsZXQgb2Zmc2V0ID0gMDtcbiAgZm9yIChjb25zdCBjaHVuayBvZiBjaHVua3MpIHtcbiAgICBvdXQuc2V0KGNodW5rLCBvZmZzZXQpO1xuICAgIG9mZnNldCArPSBjaHVuay5sZW5ndGg7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBSZXZpdmVycyB0eXBlIChzaGFyZWQgYWNyb3NzIGFsbCBlbnZpcm9ubWVudHMpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBBIG1hcCBvZiB0eXBlIG5hbWUg4oaSIHJldml2ZXIgZnVuY3Rpb24sIHVzZWQgYnkgZGV2YWx1ZSdzIGBwYXJzZWAvYHVuZmxhdHRlbmAuXG4gKiBFYWNoIGVudmlyb25tZW50IChydW50aW1lLCB3ZWIsIENMSSkgcHJvdmlkZXMgaXRzIG93biBzZXQuXG4gKi9cbmV4cG9ydCB0eXBlIFJldml2ZXJzID0gUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT47XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gR2VuZXJpYyBoeWRyYXRlL2RlaHlkcmF0ZSBkaXNwYXRjaFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogSHlkcmF0ZSAoZGVzZXJpYWxpemUpIGEgdmFsdWUgdGhhdCB3YXMgc3RvcmVkIGluIHRoZSBkYXRhYmFzZS5cbiAqXG4gKiBIYW5kbGVzIGZvdXIgZGF0YSBzaGFwZXM6XG4gKiAxLiBgVWludDhBcnJheWAgd2l0aCAnZW5jcicgcHJlZml4IOKGkiByZXR1cm5lZCBhcy1pcyAoZW5jcnlwdGVkLCBub3QgeWV0IGRlY3J5cHRlZClcbiAqIDIuIGBVaW50OEFycmF5YCB3aXRoIGEgZm9ybWF0IHByZWZpeCAoc3BlY1ZlcnNpb24gMispIOKGkiBkZWNvZGUgcHJlZml4LCBwYXJzZVxuICogMy4gYEFycmF5YCAobGVnYWN5IHNwZWNWZXJzaW9uIDEsIFwicmV2aXZlZCBkZXZhbHVlXCIpIOKGkiB1bmZsYXR0ZW5cbiAqIDQuIE90aGVyIChhbHJlYWR5IGEgcGxhaW4gSlMgdmFsdWUpIOKGkiByZXR1cm4gYXMtaXNcbiAqXG4gKiBFbmNyeXB0ZWQgZGF0YSBpcyBpbnRlbnRpb25hbGx5IGxlZnQgYXMgYSBgVWludDhBcnJheWAgc28gdGhhdCBjb25zdW1lcnNcbiAqIChDTEksIHdlYiBVSSkgY2FuIGRldGVjdCBpdCB3aXRoIGBpc0VuY3J5cHRlZERhdGEoKWAgYW5kIGRlY2lkZSBob3cgdG9cbiAqIGhhbmRsZSBpdCDigJQgdGhlIENMSSByZXBsYWNlcyBpdCB3aXRoIGEgc3R5bGVkIHBsYWNlaG9sZGVyLCB0aGUgd2ViIFVJXG4gKiByZW5kZXJzIGFuIFwiRW5jcnlwdGVkXCIgY2FyZCB3aXRoIGEgRGVjcnlwdCBidXR0b24gdGhhdCB0cmlnZ2Vyc1xuICogY2xpZW50LXNpZGUgZGVjcnlwdGlvbiBvbiBkZW1hbmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoeWRyYXRlRGF0YSh2YWx1ZTogdW5rbm93biwgcmV2aXZlcnM6IFJldml2ZXJzKTogdW5rbm93biB7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAvLyBFbmNyeXB0ZWQgZGF0YSBwYXNzZXMgdGhyb3VnaCB1bnRvdWNoZWQg4oCUIG8xMXkgbGF5ZXJzIGRldGVjdCBpdCB3aXRoXG4gICAgLy8gaXNFbmNyeXB0ZWREYXRhKCkgYW5kIGhhbmRsZSBkaXNwbGF5ICh3ZWI6IG5hbWVkIGNvbnN0cnVjdG9yIG9iamVjdCxcbiAgICAvLyBDTEk6IEVuY3J5cHRlZERhdGFSZWYgd2l0aCB1dGlsLmluc3BlY3QuY3VzdG9tKS5cbiAgICBpZiAoaXNFbmNyeXB0ZWREYXRhKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IHsgZm9ybWF0LCBwYXlsb2FkIH0gPSBkZWNvZGVGb3JtYXRQcmVmaXgodmFsdWUpO1xuICAgIGlmIChmb3JtYXQgPT09IFNlcmlhbGl6YXRpb25Gb3JtYXQuREVWQUxVRV9WMSkge1xuICAgICAgY29uc3Qgc3RyID0gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKHBheWxvYWQpO1xuICAgICAgcmV0dXJuIHBhcnNlKHN0ciwgcmV2aXZlcnMpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBmb3JtYXQgPT09IFNlcmlhbGl6YXRpb25Gb3JtYXQuR1pJUCB8fFxuICAgICAgZm9ybWF0ID09PSBTZXJpYWxpemF0aW9uRm9ybWF0LlpTVERcbiAgICApIHtcbiAgICAgIC8vIENvbXByZXNzZWQgcGF5bG9hZCDigJQgZGVjb21wcmVzcyBzeW5jaHJvbm91c2x5IHdoZW4gcnVubmluZyBvblxuICAgICAgLy8gTm9kZS5qcyAoQ0xJLCBzZXJ2ZXIgbzExeSkuIEluIGJyb3dzZXJzIHRoZXJlIGlzIG5vIHN5bmMgY29kZWM7XG4gICAgICAvLyBwYXNzIHRoZSBkYXRhIHRocm91Z2ggdW50b3VjaGVkIChsaWtlIGVuY3J5cHRlZCBkYXRhKSBzbyBhc3luY1xuICAgICAgLy8gY29uc3VtZXJzIGNhbiByb3V0ZSBpdCB0aHJvdWdoIGBoeWRyYXRlRGF0YVdpdGhLZXlgLCB3aGljaFxuICAgICAgLy8gZGVjb21wcmVzc2VzIHZpYSBEZWNvbXByZXNzaW9uU3RyZWFtIC8gYSByZWdpc3RlcmVkIHpzdGQgZGVjb2Rlci5cbiAgICAgIGNvbnN0IGluZmxhdGVkID0gZGVjb21wcmVzc1N5bmNJZkF2YWlsYWJsZShmb3JtYXQsIHBheWxvYWQpO1xuICAgICAgaWYgKGluZmxhdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgLy8gVGhlIGluZmxhdGVkIGJ5dGVzIGNhcnJ5IHRoZWlyIG93biBmb3JtYXQgcHJlZml4IChlLmcuICdkZXZsJylcbiAgICAgIHJldHVybiBoeWRyYXRlRGF0YShpbmZsYXRlZCwgcmV2aXZlcnMpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHNlcmlhbGl6YXRpb24gZm9ybWF0OiAke2Zvcm1hdH1gKTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB1bmZsYXR0ZW4odmFsdWUsIHJldml2ZXJzKTtcbiAgfVxuXG4gIC8vIEFscmVhZHkgYSBwbGFpbiBKUyB2YWx1ZSAoZS5nLiwgbnVtYmVyLCBzdHJpbmcsIG51bGwpXG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBIeWRyYXRlIGEgdmFsdWUsIGRlY3J5cHRpbmcgaXQgZmlyc3QgaWYgYW4gZW5jcnlwdGlvbiBrZXkgaXMgcHJvdmlkZWQuXG4gKlxuICogVGhpcyBpcyB0aGUgYXN5bmMgdmVyc2lvbiBvZiBgaHlkcmF0ZURhdGFgIHRoYXQgc3VwcG9ydHMgdHJhbnNwYXJlbnRcbiAqIGRlY3J5cHRpb24uIFVzZWQgYnkgbzExeSB0b29saW5nICh3ZWIgVUksIENMSSkgd2hlbiB0aGUgdXNlciByZXF1ZXN0c1xuICogZGVjcnlwdGlvbi5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gaHlkcmF0ZSAobWF5IGJlIGVuY3J5cHRlZClcbiAqIEBwYXJhbSByZXZpdmVycyAtIERldmFsdWUgcmV2aXZlcnMgZm9yIGRlc2VyaWFsaXphdGlvblxuICogQHBhcmFtIGtleSAtIEFFUy0yNTYgZW5jcnlwdGlvbiBrZXkgKGlmIHByb3ZpZGVkLCBlbmNyeXB0ZWQgZGF0YSB3aWxsIGJlIGRlY3J5cHRlZClcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGh5ZHJhdGVEYXRhV2l0aEtleShcbiAgdmFsdWU6IHVua25vd24sXG4gIHJldml2ZXJzOiBSZXZpdmVycyxcbiAga2V5OiBpbXBvcnQoJy4vZW5jcnlwdGlvbi5qcycpLkNyeXB0b0tleSB8IHVuZGVmaW5lZFxuKTogUHJvbWlzZTx1bmtub3duPiB7XG4gIGxldCBkYXRhID0gdmFsdWU7XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSAmJiBpc0VuY3J5cHRlZERhdGEoZGF0YSkgJiYga2V5KSB7XG4gICAgLy8gRGVjcnlwdDogc3RyaXAgJ2VuY3InIHByZWZpeCwgQUVTLUdDTSBkZWNyeXB0LCB0aGVuIGh5ZHJhdGUgdGhlIHJlc3VsdFxuICAgIGNvbnN0IHsgZGVjcnlwdCB9ID0gYXdhaXQgaW1wb3J0KCcuL2VuY3J5cHRpb24uanMnKTtcbiAgICBjb25zdCB7IHBheWxvYWQgfSA9IGRlY29kZUZvcm1hdFByZWZpeChkYXRhKTtcbiAgICBkYXRhID0gYXdhaXQgZGVjcnlwdChrZXksIHBheWxvYWQpO1xuICB9XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSAmJiBpc0NvbXByZXNzZWREYXRhKGRhdGEpKSB7XG4gICAgLy8gRGVjb21wcmVzczogc3RyaXAgdGhlIGNvZGVjIHByZWZpeCBhbmQgaW5mbGF0ZS4gZ3ppcCB1c2VzIHRoZVxuICAgIC8vIHdlYi1zdGFuZGFyZCBEZWNvbXByZXNzaW9uU3RyZWFtICh3b3JrcyBpbiBicm93c2Vycyk7IHpzdGQgdXNlc1xuICAgIC8vIG5vZGU6emxpYiBvbiBOb2RlIG9yIHRoZSByZWdpc3RlcmVkIFdBU00gZGVjb2RlciBpbiB0aGUgYnJvd3Nlci5cbiAgICAvLyBUaGUgaW5mbGF0ZWQgYnl0ZXMgY2FycnkgdGhlaXIgb3duIGZvcm1hdCBwcmVmaXggKGUuZy4gJ2RldmwnKS5cbiAgICBjb25zdCB7IGZvcm1hdCwgcGF5bG9hZCB9ID0gZGVjb2RlRm9ybWF0UHJlZml4KGRhdGEpO1xuICAgIGRhdGEgPSBhd2FpdCBkZWNvbXByZXNzQXN5bmMoZm9ybWF0LCBwYXlsb2FkKTtcbiAgfVxuICAvLyBEZWxlZ2F0ZSB0aGUgKGRlY3J5cHRlZC9kZWNvbXByZXNzZWQpIHJlc3VsdCB0byBzeW5jIGh5ZHJhdGVEYXRhXG4gIHJldHVybiBoeWRyYXRlRGF0YShkYXRhLCByZXZpdmVycyk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2hhcmVkIG1hcmtlciB0eXBlcyBmb3IgbzExeSBkaXNwbGF5XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgU1RSRUFNX0lEX1BSRUZJWCA9ICdzdHJtXyc7XG5cbi8qKiBNYXJrZXIgZm9yIHN0cmVhbSByZWZlcmVuY2Ugb2JqZWN0cyByZW5kZXJlZCBhcyBsaW5rcyBpbiB0aGUgVUkgKi9cbmV4cG9ydCBjb25zdCBTVFJFQU1fUkVGX1RZUEUgPSAnX193b3JrZmxvd19zdHJlYW1fcmVmX18nO1xuXG4vKiogQSBzdHJlYW0gcmVmZXJlbmNlIGZvciBVSSBkaXNwbGF5ICovXG5leHBvcnQgaW50ZXJmYWNlIFN0cmVhbVJlZiB7XG4gIF9fdHlwZTogdHlwZW9mIFNUUkVBTV9SRUZfVFlQRTtcbiAgc3RyZWFtSWQ6IHN0cmluZztcbn1cblxuLyoqIE1hcmtlciBmb3IgUnVuIHJlZmVyZW5jZSBvYmplY3RzIHJlbmRlcmVkIGFzIGxpbmtzIGluIHRoZSBVSSAqL1xuZXhwb3J0IGNvbnN0IFJVTl9SRUZfVFlQRSA9ICdfX3dvcmtmbG93X3J1bl9yZWZfXyc7XG5cbi8qKiBBIFJ1biByZWZlcmVuY2UgZm9yIFVJIGRpc3BsYXkgKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVuUmVmIHtcbiAgX190eXBlOiB0eXBlb2YgUlVOX1JFRl9UWVBFO1xuICBydW5JZDogc3RyaW5nO1xufVxuXG4vKiogQ2hlY2sgaWYgYSB2YWx1ZSBpcyBhIFJ1blJlZiBvYmplY3QgKi9cbmV4cG9ydCBjb25zdCBpc1J1blJlZiA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJ1blJlZiA9PiB7XG4gIHJldHVybiAoXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgJ19fdHlwZScgaW4gdmFsdWUgJiZcbiAgICB2YWx1ZS5fX3R5cGUgPT09IFJVTl9SRUZfVFlQRSAmJlxuICAgICdydW5JZCcgaW4gdmFsdWUgJiZcbiAgICB0eXBlb2YgdmFsdWUucnVuSWQgPT09ICdzdHJpbmcnXG4gICk7XG59O1xuXG4vKiogQ29udmVydCBhIHNlcmlhbGl6ZWQgUnVuIHZhbHVlIHRvIGEgUnVuUmVmIGZvciBkaXNwbGF5ICovXG5leHBvcnQgY29uc3Qgc2VyaWFsaXplZFJ1blRvUnVuUmVmID0gKHZhbHVlOiB7IHJ1bklkOiBzdHJpbmcgfSk6IFJ1blJlZiA9PiB7XG4gIHJldHVybiB7IF9fdHlwZTogUlVOX1JFRl9UWVBFLCBydW5JZDogdmFsdWUucnVuSWQgfTtcbn07XG5cbi8qKiBNYXJrZXIgZm9yIGN1c3RvbSBjbGFzcyBpbnN0YW5jZSByZWZlcmVuY2VzICovXG5leHBvcnQgY29uc3QgQ0xBU1NfSU5TVEFOQ0VfUkVGX1RZUEUgPSAnX193b3JrZmxvd19jbGFzc19pbnN0YW5jZV9yZWZfXyc7XG5cbi8qKlxuICogQSBjbGFzcyBpbnN0YW5jZSByZWZlcmVuY2UgZm9yIG8xMXkgZGlzcGxheS5cbiAqXG4gKiBCcm93c2VyLXNhZmUgYmFzZSBjbGFzcyDigJQgbm8gYHV0aWwuaW5zcGVjdC5jdXN0b21gLiBFbnZpcm9ubWVudC1zcGVjaWZpY1xuICogcmVuZGVyaW5nIChDTEkgaW5zcGVjdCwgd2ViIGNvbXBvbmVudCkgaXMgaGFuZGxlZCBieSBlYWNoIGNvbnN1bWVyLlxuICovXG5leHBvcnQgY2xhc3MgQ2xhc3NJbnN0YW5jZVJlZiB7XG4gIHJlYWRvbmx5IF9fdHlwZSA9IENMQVNTX0lOU1RBTkNFX1JFRl9UWVBFO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBjbGFzc05hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgY2xhc3NJZDogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBkYXRhOiB1bmtub3duXG4gICkge31cblxuICB0b0pTT04oKToge1xuICAgIF9fdHlwZTogc3RyaW5nO1xuICAgIGNsYXNzTmFtZTogc3RyaW5nO1xuICAgIGNsYXNzSWQ6IHN0cmluZztcbiAgICBkYXRhOiB1bmtub3duO1xuICB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlOiB0aGlzLl9fdHlwZSxcbiAgICAgIGNsYXNzTmFtZTogdGhpcy5jbGFzc05hbWUsXG4gICAgICBjbGFzc0lkOiB0aGlzLmNsYXNzSWQsXG4gICAgICBkYXRhOiB0aGlzLmRhdGEsXG4gICAgfTtcbiAgfVxufVxuXG4vKiogQ2hlY2sgaWYgYSB2YWx1ZSBpcyBhIENsYXNzSW5zdGFuY2VSZWYgb2JqZWN0ICovXG5leHBvcnQgY29uc3QgaXNDbGFzc0luc3RhbmNlUmVmID0gKFxuICB2YWx1ZTogdW5rbm93blxuKTogdmFsdWUgaXMgQ2xhc3NJbnN0YW5jZVJlZiA9PiB7XG4gIHJldHVybiAoXG4gICAgdmFsdWUgaW5zdGFuY2VvZiBDbGFzc0luc3RhbmNlUmVmIHx8XG4gICAgKHZhbHVlICE9PSBudWxsICYmXG4gICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgICAnX190eXBlJyBpbiB2YWx1ZSAmJlxuICAgICAgdmFsdWUuX190eXBlID09PSBDTEFTU19JTlNUQU5DRV9SRUZfVFlQRSAmJlxuICAgICAgJ2NsYXNzTmFtZScgaW4gdmFsdWUgJiZcbiAgICAgIHR5cGVvZiB2YWx1ZS5jbGFzc05hbWUgPT09ICdzdHJpbmcnKVxuICApO1xufTtcblxuLyoqIENoZWNrIGlmIGEgdmFsdWUgaXMgYSBzdHJlYW0gSUQgc3RyaW5nICovXG5leHBvcnQgY29uc3QgaXNTdHJlYW1JZCA9ICh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5zdGFydHNXaXRoKFNUUkVBTV9JRF9QUkVGSVgpO1xufTtcblxuLyoqIENoZWNrIGlmIGEgdmFsdWUgaXMgYSBTdHJlYW1SZWYgb2JqZWN0ICovXG5leHBvcnQgY29uc3QgaXNTdHJlYW1SZWYgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBTdHJlYW1SZWYgPT4ge1xuICByZXR1cm4gKFxuICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICdfX3R5cGUnIGluIHZhbHVlICYmXG4gICAgdmFsdWUuX190eXBlID09PSBTVFJFQU1fUkVGX1RZUEUgJiZcbiAgICAnc3RyZWFtSWQnIGluIHZhbHVlICYmXG4gICAgdHlwZW9mIHZhbHVlLnN0cmVhbUlkID09PSAnc3RyaW5nJ1xuICApO1xufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTaGFyZWQgbzExeSByZXZpdmVyIGhlbHBlcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIENvbnZlcnQgYSBzZXJpYWxpemVkIHN0cmVhbSB2YWx1ZSB0byBhIFN0cmVhbVJlZiBmb3IgZGlzcGxheS5cbiAqL1xuZXhwb3J0IGNvbnN0IHN0cmVhbVRvU3RyZWFtUmVmID0gKHZhbHVlOiBhbnkpOiBTdHJlYW1SZWYgPT4ge1xuICBsZXQgc3RyZWFtSWQ6IHN0cmluZztcbiAgaWYgKCduYW1lJyBpbiB2YWx1ZSkge1xuICAgIGNvbnN0IG5hbWUgPSBTdHJpbmcodmFsdWUubmFtZSk7XG4gICAgaWYgKCFuYW1lLnN0YXJ0c1dpdGgoU1RSRUFNX0lEX1BSRUZJWCkpIHtcbiAgICAgIHN0cmVhbUlkID0gYCR7U1RSRUFNX0lEX1BSRUZJWH0ke25hbWV9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyZWFtSWQgPSBuYW1lO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzdHJlYW1JZCA9IGAke1NUUkVBTV9JRF9QUkVGSVh9bnVsbGA7XG4gIH1cbiAgcmV0dXJuIHsgX190eXBlOiBTVFJFQU1fUkVGX1RZUEUsIHN0cmVhbUlkIH07XG59O1xuXG4vKiogQ29udmVydCBhIHNlcmlhbGl6ZWQgc3RlcCBmdW5jdGlvbiB0byBhIGRpc3BsYXkgc3RyaW5nICovXG5leHBvcnQgY29uc3Qgc2VyaWFsaXplZFN0ZXBGdW5jdGlvblRvU3RyaW5nID0gKHZhbHVlOiB1bmtub3duKTogc3RyaW5nID0+IHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuICdudWxsJztcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiAnbnVsbCc7XG4gIGlmICgnc3RlcElkJyBpbiB2YWx1ZSkge1xuICAgIHJldHVybiBgPHN0ZXA6JHsodmFsdWUgYXMgeyBzdGVwSWQ6IHN0cmluZyB9KS5zdGVwSWR9PmA7XG4gIH1cbiAgcmV0dXJuICc8ZnVuY3Rpb24+Jztcbn07XG5cbi8qKiBFeHRyYWN0IHRoZSBjbGFzcyBuYW1lIGZyb20gYSBjbGFzc0lkICovXG5leHBvcnQgY29uc3QgZXh0cmFjdENsYXNzTmFtZSA9IChjbGFzc0lkOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBpZiAoIWNsYXNzSWQpIHJldHVybiAnVW5rbm93bic7XG4gIGNvbnN0IHBhcnRzID0gY2xhc3NJZC5zcGxpdCgnLycpO1xuICByZXR1cm4gcGFydHNbcGFydHMubGVuZ3RoIC0gMV0gfHwgY2xhc3NJZDtcbn07XG5cbi8qKiBDb252ZXJ0IGEgc2VyaWFsaXplZCBjbGFzcyBpbnN0YW5jZSB0byBhIENsYXNzSW5zdGFuY2VSZWYgZm9yIGRpc3BsYXkuXG4gKiAgUnVuIGluc3RhbmNlcyBhcmUgc3BlY2lhbC1jYXNlZCB0byBhIFJ1blJlZiBmb3IgY2xpY2thYmxlIHJlbmRlcmluZy4gKi9cbmV4cG9ydCBjb25zdCBzZXJpYWxpemVkSW5zdGFuY2VUb1JlZiA9ICh2YWx1ZToge1xuICBjbGFzc0lkOiBzdHJpbmc7XG4gIGRhdGE6IHVua25vd247XG59KTogQ2xhc3NJbnN0YW5jZVJlZiB8IFJ1blJlZiA9PiB7XG4gIGNvbnN0IGNsYXNzTmFtZSA9IGV4dHJhY3RDbGFzc05hbWUodmFsdWUuY2xhc3NJZCk7XG4gIGlmIChcbiAgICBjbGFzc05hbWUgPT09ICdSdW4nICYmXG4gICAgdmFsdWUuZGF0YSAhPT0gbnVsbCAmJlxuICAgIHR5cGVvZiB2YWx1ZS5kYXRhID09PSAnb2JqZWN0JyAmJlxuICAgICdydW5JZCcgaW4gdmFsdWUuZGF0YSAmJlxuICAgIHR5cGVvZiAodmFsdWUuZGF0YSBhcyB7IHJ1bklkOiB1bmtub3duIH0pLnJ1bklkID09PSAnc3RyaW5nJ1xuICApIHtcbiAgICByZXR1cm4gc2VyaWFsaXplZFJ1blRvUnVuUmVmKHZhbHVlLmRhdGEgYXMgeyBydW5JZDogc3RyaW5nIH0pO1xuICB9XG4gIHJldHVybiBuZXcgQ2xhc3NJbnN0YW5jZVJlZihjbGFzc05hbWUsIHZhbHVlLmNsYXNzSWQsIHZhbHVlLmRhdGEpO1xufTtcblxuLyoqIENvbnZlcnQgYSBzZXJpYWxpemVkIGNsYXNzIHJlZmVyZW5jZSB0byBhIGRpc3BsYXkgc3RyaW5nICovXG5leHBvcnQgY29uc3Qgc2VyaWFsaXplZENsYXNzVG9TdHJpbmcgPSAodmFsdWU6IHsgY2xhc3NJZDogc3RyaW5nIH0pOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gYDxjbGFzczoke2V4dHJhY3RDbGFzc05hbWUodmFsdWUuY2xhc3NJZCl9PmA7XG59O1xuXG4vKipcbiAqIFN0YW5kYXJkIG8xMXkgcmV2aXZlcnMgdGhhdCBvdmVycmlkZSBydW50aW1lLXNwZWNpZmljIHR5cGVzIHdpdGhcbiAqIGRpc3BsYXktZnJpZW5kbHkgdmFsdWVzLiBVc2VkIGJ5IGJvdGggd2ViIGFuZCBDTEkgaHlkcmF0aW9uLlxuICovXG5leHBvcnQgY29uc3Qgb2JzZXJ2YWJpbGl0eVJldml2ZXJzOiBSZXZpdmVycyA9IHtcbiAgUmVhZGFibGVTdHJlYW06IHN0cmVhbVRvU3RyZWFtUmVmLFxuICBXcml0YWJsZVN0cmVhbTogc3RyZWFtVG9TdHJlYW1SZWYsXG4gIFRyYW5zZm9ybVN0cmVhbTogc3RyZWFtVG9TdHJlYW1SZWYsXG4gIEFib3J0Q29udHJvbGxlcjogKHZhbHVlOiBhbnkpID0+XG4gICAgYDxBYm9ydENvbnRyb2xsZXIoYWJvcnRlZDogJHt2YWx1ZS5hYm9ydGVkfSk+YCxcbiAgQWJvcnRTaWduYWw6ICh2YWx1ZTogYW55KSA9PiBgPEFib3J0U2lnbmFsKGFib3J0ZWQ6ICR7dmFsdWUuYWJvcnRlZH0pPmAsXG4gIC8vIERPTUV4Y2VwdGlvbiBuZWVkcyBhbiBleHBsaWNpdCByZXZpdmVyOiB3aXRob3V0IG9uZSwgZGV2YWx1ZS5wYXJzZVxuICAvLyB0aHJvd3Mgb24gdGhlIGBbXCJET01FeGNlcHRpb25cIiwgLi4uXWAgdGFnIGFuZCBgaHlkcmF0ZVN0ZXBJT2Anc1xuICAvLyB0cnkvY2F0Y2ggbGVhdmVzIHRoZSByYXcgZmxhdC1lbmNvZGVkIHN0cmluZyBpbiB0aGUgVUkuIEFib3J0Q29udHJvbGxlclxuICAvLyBzeW50aGVzaXplcyBhIERPTUV4Y2VwdGlvbiBhcyB0aGUgZGVmYXVsdCBgc2lnbmFsLnJlYXNvbmAgd2hlbiBhYm9ydCgpXG4gIC8vIGlzIGNhbGxlZCB3aXRoIG5vIGFyZyDigJQgc28gYW55IGFib3J0IHRoYXQgcm91bmQtdHJpcHMgdGhyb3VnaCBhIHN0ZXBcbiAgLy8gYm91bmRhcnkgc3VyZmFjZXMgaGVyZS4gUmVjb25zdHJ1Y3QgYXMgYSByZWFsIERPTUV4Y2VwdGlvbiB3aGVuIHRoZVxuICAvLyBnbG9iYWwgaXMgYXZhaWxhYmxlIChtb2Rlcm4gYnJvd3NlcnMgKyBOb2RlIDE4KyksIGVsc2UgZmFsbCBiYWNrIHRvXG4gIC8vIGFuIEVycm9yIHByZXNlcnZpbmcgbmFtZS9tZXNzYWdlL3N0YWNrL2NhdXNlIGZvciBkaXNwbGF5LlxuICBET01FeGNlcHRpb246ICh2YWx1ZToge1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgc3RhY2s/OiBzdHJpbmc7XG4gICAgY2F1c2U/OiB1bmtub3duO1xuICB9KSA9PiB7XG4gICAgY29uc3QgRyA9IGdsb2JhbFRoaXMgYXMgeyBET01FeGNlcHRpb24/OiB0eXBlb2YgRE9NRXhjZXB0aW9uIH07XG4gICAgaWYgKHR5cGVvZiBHLkRPTUV4Y2VwdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uc3QgZSA9IG5ldyBHLkRPTUV4Y2VwdGlvbih2YWx1ZS5tZXNzYWdlLCB2YWx1ZS5uYW1lKTtcbiAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgICBpZiAoJ2NhdXNlJyBpbiB2YWx1ZSkgKGUgYXMgeyBjYXVzZT86IHVua25vd24gfSkuY2F1c2UgPSB2YWx1ZS5jYXVzZTtcbiAgICAgIHJldHVybiBlO1xuICAgIH1cbiAgICBjb25zdCBlOiBFcnJvciAmIHsgY2F1c2U/OiB1bmtub3duIH0gPSBuZXcgRXJyb3IodmFsdWUubWVzc2FnZSk7XG4gICAgZS5uYW1lID0gdmFsdWUubmFtZTtcbiAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZS5zdGFjayA9IHZhbHVlLnN0YWNrO1xuICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSBlLmNhdXNlID0gdmFsdWUuY2F1c2U7XG4gICAgcmV0dXJuIGU7XG4gIH0sXG4gIFN0ZXBGdW5jdGlvbjogc2VyaWFsaXplZFN0ZXBGdW5jdGlvblRvU3RyaW5nLFxuICBXb3JrZmxvd0Z1bmN0aW9uOiAodmFsdWU6IHsgd29ya2Zsb3dJZDogc3RyaW5nIH0pID0+XG4gICAgYDx3b3JrZmxvdzoke3ZhbHVlLndvcmtmbG93SWR9PmAsXG4gIEluc3RhbmNlOiBzZXJpYWxpemVkSW5zdGFuY2VUb1JlZixcbiAgQ2xhc3M6IHNlcmlhbGl6ZWRDbGFzc1RvU3RyaW5nLFxufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBSZXNvdXJjZS1sZXZlbCBoeWRyYXRpb24gZGlzcGF0Y2ggKGZvciBvMTF5KVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogSHlkcmF0ZSB0aGUgZGF0YSBmaWVsZHMgb2YgYSBzdGVwIHJlc291cmNlLlxuICovXG5mdW5jdGlvbiBoeWRyYXRlU3RlcElPPFxuICBUIGV4dGVuZHMgeyBzdGVwSWQ/OiBzdHJpbmc7IGlucHV0PzogYW55OyBvdXRwdXQ/OiBhbnk7IGVycm9yPzogYW55IH0sXG4+KHJlc291cmNlOiBULCByZXZpdmVyczogUmV2aXZlcnMpOiBUIHtcbiAgbGV0IGh5ZHJhdGVkSW5wdXQgPSByZXNvdXJjZS5pbnB1dDtcbiAgbGV0IGh5ZHJhdGVkT3V0cHV0ID0gcmVzb3VyY2Uub3V0cHV0O1xuICBsZXQgaHlkcmF0ZWRFcnJvciA9IHJlc291cmNlLmVycm9yO1xuXG4gIGlmIChyZXNvdXJjZS5pbnB1dCAhPSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIGh5ZHJhdGVkSW5wdXQgPSBoeWRyYXRlRGF0YShyZXNvdXJjZS5pbnB1dCwgcmV2aXZlcnMpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTGVhdmUgdW4taHlkcmF0ZWRcbiAgICB9XG4gIH1cblxuICBpZiAocmVzb3VyY2Uub3V0cHV0ICE9IG51bGwpIHtcbiAgICB0cnkge1xuICAgICAgaHlkcmF0ZWRPdXRwdXQgPSBoeWRyYXRlRGF0YShyZXNvdXJjZS5vdXRwdXQsIHJldml2ZXJzKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIExlYXZlIHVuLWh5ZHJhdGVkXG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIGBlcnJvcmAgZmllbGQgaXMgYFNlcmlhbGl6ZWREYXRhYCAoVWludDhBcnJheSkgcHJvZHVjZWQgYnlcbiAgLy8gYGRlaHlkcmF0ZVN0ZXBFcnJvcmAuIEh5ZHJhdGUgaXQgc28gb2JzZXJ2YWJpbGl0eSB0b29scyAoQ0xJLCB3ZWIgVUkpXG4gIC8vIGNhbiByZWFkIGBzdGVwLmVycm9yLm1lc3NhZ2VgLCBgc3RlcC5lcnJvci5zdGFja2AsIGV0Yy5cbiAgaWYgKHJlc291cmNlLmVycm9yICE9IG51bGwpIHtcbiAgICB0cnkge1xuICAgICAgaHlkcmF0ZWRFcnJvciA9IGh5ZHJhdGVEYXRhKHJlc291cmNlLmVycm9yLCByZXZpdmVycyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBMZWF2ZSB1bi1oeWRyYXRlZFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4ucmVzb3VyY2UsXG4gICAgaW5wdXQ6IGh5ZHJhdGVkSW5wdXQsXG4gICAgb3V0cHV0OiBoeWRyYXRlZE91dHB1dCxcbiAgICBlcnJvcjogaHlkcmF0ZWRFcnJvcixcbiAgfTtcbn1cblxuLyoqXG4gKiBIeWRyYXRlIHRoZSBkYXRhIGZpZWxkcyBvZiBhIHdvcmtmbG93IHJ1biByZXNvdXJjZS5cbiAqL1xuZnVuY3Rpb24gaHlkcmF0ZVdvcmtmbG93SU88XG4gIFQgZXh0ZW5kcyB7IGlucHV0PzogYW55OyBvdXRwdXQ/OiBhbnk7IGVycm9yPzogYW55IH0sXG4+KHJlc291cmNlOiBULCByZXZpdmVyczogUmV2aXZlcnMpOiBUIHtcbiAgbGV0IGh5ZHJhdGVkSW5wdXQgPSByZXNvdXJjZS5pbnB1dDtcbiAgbGV0IGh5ZHJhdGVkT3V0cHV0ID0gcmVzb3VyY2Uub3V0cHV0O1xuICBsZXQgaHlkcmF0ZWRFcnJvciA9IHJlc291cmNlLmVycm9yO1xuXG4gIGlmIChyZXNvdXJjZS5pbnB1dCAhPSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIGh5ZHJhdGVkSW5wdXQgPSBoeWRyYXRlRGF0YShyZXNvdXJjZS5pbnB1dCwgcmV2aXZlcnMpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTGVhdmUgdW4taHlkcmF0ZWRcbiAgICB9XG4gIH1cblxuICBpZiAocmVzb3VyY2Uub3V0cHV0ICE9IG51bGwpIHtcbiAgICB0cnkge1xuICAgICAgaHlkcmF0ZWRPdXRwdXQgPSBoeWRyYXRlRGF0YShyZXNvdXJjZS5vdXRwdXQsIHJldml2ZXJzKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIExlYXZlIHVuLWh5ZHJhdGVkXG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIGBlcnJvcmAgZmllbGQgaXMgYFNlcmlhbGl6ZWREYXRhYCAoVWludDhBcnJheSkgcHJvZHVjZWQgYnlcbiAgLy8gYGRlaHlkcmF0ZVJ1bkVycm9yYC4gSHlkcmF0ZSBpdCBzbyBvYnNlcnZhYmlsaXR5IHRvb2xzIChDTEksIHdlYiBVSSlcbiAgLy8gY2FuIHJlYWQgYHJ1bi5lcnJvci5tZXNzYWdlYCwgYHJ1bi5lcnJvci5zdGFja2AsIGV0Yy5cbiAgaWYgKHJlc291cmNlLmVycm9yICE9IG51bGwpIHtcbiAgICB0cnkge1xuICAgICAgaHlkcmF0ZWRFcnJvciA9IGh5ZHJhdGVEYXRhKHJlc291cmNlLmVycm9yLCByZXZpdmVycyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBMZWF2ZSB1bi1oeWRyYXRlZFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4ucmVzb3VyY2UsXG4gICAgaW5wdXQ6IGh5ZHJhdGVkSW5wdXQsXG4gICAgb3V0cHV0OiBoeWRyYXRlZE91dHB1dCxcbiAgICBlcnJvcjogaHlkcmF0ZWRFcnJvcixcbiAgfTtcbn1cblxuLyoqXG4gKiBIeWRyYXRlIHRoZSBldmVudERhdGEgZmllbGRzIG9mIGFuIGV2ZW50IHJlc291cmNlLlxuICovXG5mdW5jdGlvbiBoeWRyYXRlRXZlbnREYXRhPFQgZXh0ZW5kcyB7IGV2ZW50SWQ/OiBzdHJpbmc7IGV2ZW50RGF0YT86IGFueSB9PihcbiAgcmVzb3VyY2U6IFQsXG4gIHJldml2ZXJzOiBSZXZpdmVyc1xuKTogVCB7XG4gIGlmICghcmVzb3VyY2UuZXZlbnREYXRhKSByZXR1cm4gcmVzb3VyY2U7XG5cbiAgY29uc3QgZXZlbnREYXRhID0geyAuLi5yZXNvdXJjZS5ldmVudERhdGEgfTtcblxuICAvLyBzdGVwX2NvbXBsZXRlZCBldmVudHMgaGF2ZSBldmVudERhdGEucmVzdWx0IChzZXJpYWxpemVkIHJldHVybiB2YWx1ZSlcbiAgaWYgKCdyZXN1bHQnIGluIGV2ZW50RGF0YSAmJiBldmVudERhdGEucmVzdWx0ICE9IG51bGwpIHtcbiAgICB0cnkge1xuICAgICAgZXZlbnREYXRhLnJlc3VsdCA9IGh5ZHJhdGVEYXRhKGV2ZW50RGF0YS5yZXN1bHQsIHJldml2ZXJzKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIExlYXZlIHVuLWh5ZHJhdGVkXG4gICAgfVxuICB9XG5cbiAgLy8gc3RlcF9jcmVhdGVkIGV2ZW50cyBoYXZlIGV2ZW50RGF0YS5pbnB1dCAoc2VyaWFsaXplZCBzdGVwIGFyZ3VtZW50cylcbiAgaWYgKCdpbnB1dCcgaW4gZXZlbnREYXRhICYmIGV2ZW50RGF0YS5pbnB1dCAhPSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIGV2ZW50RGF0YS5pbnB1dCA9IGh5ZHJhdGVEYXRhKGV2ZW50RGF0YS5pbnB1dCwgcmV2aXZlcnMpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTGVhdmUgdW4taHlkcmF0ZWRcbiAgICB9XG4gIH1cblxuICAvLyBydW5fY29tcGxldGVkIGV2ZW50cyBoYXZlIGV2ZW50RGF0YS5vdXRwdXQgKHNlcmlhbGl6ZWQgcmV0dXJuIHZhbHVlKVxuICBpZiAoJ291dHB1dCcgaW4gZXZlbnREYXRhICYmIGV2ZW50RGF0YS5vdXRwdXQgIT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICBldmVudERhdGEub3V0cHV0ID0gaHlkcmF0ZURhdGEoZXZlbnREYXRhLm91dHB1dCwgcmV2aXZlcnMpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTGVhdmUgdW4taHlkcmF0ZWRcbiAgICB9XG4gIH1cblxuICAvLyBob29rX2NyZWF0ZWQgZXZlbnRzIG1heSBoYXZlIHNlcmlhbGl6ZWQgbWV0YWRhdGFcbiAgaWYgKCdtZXRhZGF0YScgaW4gZXZlbnREYXRhICYmIGV2ZW50RGF0YS5tZXRhZGF0YSAhPSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIGV2ZW50RGF0YS5tZXRhZGF0YSA9IGh5ZHJhdGVEYXRhKGV2ZW50RGF0YS5tZXRhZGF0YSwgcmV2aXZlcnMpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTGVhdmUgdW4taHlkcmF0ZWRcbiAgICB9XG4gIH1cblxuICAvLyBob29rX3JlY2VpdmVkIGV2ZW50cyBoYXZlIGV2ZW50RGF0YS5wYXlsb2FkIChzZXJpYWxpemVkIGhvb2sgcGF5bG9hZClcbiAgaWYgKCdwYXlsb2FkJyBpbiBldmVudERhdGEgJiYgZXZlbnREYXRhLnBheWxvYWQgIT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICBldmVudERhdGEucGF5bG9hZCA9IGh5ZHJhdGVEYXRhKGV2ZW50RGF0YS5wYXlsb2FkLCByZXZpdmVycyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBMZWF2ZSB1bi1oeWRyYXRlZFxuICAgIH1cbiAgfVxuXG4gIC8vIHN0ZXBfZmFpbGVkIC8gc3RlcF9yZXRyeWluZyAvIHJ1bl9mYWlsZWQgZXZlbnRzIGhhdmUgZXZlbnREYXRhLmVycm9yXG4gIC8vICh0aGUgdGhyb3duIHZhbHVlLCBzZXJpYWxpemVkIHZpYSB0aGUgZXJyb3IgcGlwZWxpbmUpLiBXaXRob3V0IHRoaXMsXG4gIC8vIGV2ZW50IGxpc3RpbmdzIGluIG8xMXkgdG9vbGluZyB3b3VsZCBzdXJmYWNlIHRoZSByYXcgYFVpbnQ4QXJyYXlgXG4gIC8vIHBheWxvYWQgaW5zdGVhZCBvZiBhIGh5ZHJhdGVkIGB7IG5hbWUsIG1lc3NhZ2UsIHN0YWNrLCDigKYgfWAgb2JqZWN0LlxuICBpZiAoJ2Vycm9yJyBpbiBldmVudERhdGEgJiYgZXZlbnREYXRhLmVycm9yICE9IG51bGwpIHtcbiAgICB0cnkge1xuICAgICAgZXZlbnREYXRhLmVycm9yID0gaHlkcmF0ZURhdGEoZXZlbnREYXRhLmVycm9yLCByZXZpdmVycyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBMZWF2ZSB1bi1oeWRyYXRlZFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IC4uLnJlc291cmNlLCBldmVudERhdGEgfTtcbn1cblxuLyoqXG4gKiBIeWRyYXRlIHRoZSBtZXRhZGF0YSBmaWVsZCBvZiBhIGhvb2sgcmVzb3VyY2UuXG4gKi9cbmZ1bmN0aW9uIGh5ZHJhdGVIb29rTWV0YWRhdGE8VCBleHRlbmRzIHsgaG9va0lkPzogc3RyaW5nOyBtZXRhZGF0YT86IGFueSB9PihcbiAgcmVzb3VyY2U6IFQsXG4gIHJldml2ZXJzOiBSZXZpdmVyc1xuKTogVCB7XG4gIGlmIChyZXNvdXJjZS5tZXRhZGF0YSA9PSBudWxsKSByZXR1cm4gcmVzb3VyY2U7XG5cbiAgbGV0IGh5ZHJhdGVkTWV0YWRhdGEgPSByZXNvdXJjZS5tZXRhZGF0YTtcbiAgdHJ5IHtcbiAgICBoeWRyYXRlZE1ldGFkYXRhID0gaHlkcmF0ZURhdGEocmVzb3VyY2UubWV0YWRhdGEsIHJldml2ZXJzKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gTGVhdmUgdW4taHlkcmF0ZWRcbiAgfVxuXG4gIHJldHVybiB7IC4uLnJlc291cmNlLCBtZXRhZGF0YTogaHlkcmF0ZWRNZXRhZGF0YSB9O1xufVxuXG4vKipcbiAqIEh5ZHJhdGUgdGhlIHNlcmlhbGl6ZWQgZGF0YSBmaWVsZHMgb2YgYW55IHJlc291cmNlIGZvciBvMTF5IGRpc3BsYXkuXG4gKlxuICogRGlzcGF0Y2hlcyBieSByZXNvdXJjZSB0eXBlIChzdGVwLCBob29rLCBldmVudCwgd29ya2Zsb3cpIGFuZCBjYWxsc1xuICogYGh5ZHJhdGVEYXRhYCB3aXRoIHRoZSBwcm92aWRlZCByZXZpdmVycyBmb3IgZWFjaCBkYXRhIGZpZWxkLlxuICpcbiAqIEVhY2ggZW52aXJvbm1lbnQgKHdlYiwgQ0xJKSBwcm92aWRlcyBpdHMgb3duIHJldml2ZXJzIOKAlCB0aGlzIGZ1bmN0aW9uXG4gKiBvbmx5IGhhbmRsZXMgdGhlIGRpc3BhdGNoIGxvZ2ljIGFuZCBmaWVsZCBtYXBwaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaHlkcmF0ZVJlc291cmNlSU88XG4gIFQgZXh0ZW5kcyB7XG4gICAgc3RlcElkPzogc3RyaW5nO1xuICAgIGhvb2tJZD86IHN0cmluZztcbiAgICBldmVudElkPzogc3RyaW5nO1xuICAgIGlucHV0PzogYW55O1xuICAgIG91dHB1dD86IGFueTtcbiAgICBtZXRhZGF0YT86IGFueTtcbiAgICBldmVudERhdGE/OiBhbnk7XG4gICAgZXhlY3V0aW9uQ29udGV4dD86IGFueTtcbiAgfSxcbj4ocmVzb3VyY2U6IFQsIHJldml2ZXJzOiBSZXZpdmVycyk6IFQge1xuICBpZiAoIXJlc291cmNlKSByZXR1cm4gcmVzb3VyY2U7XG5cbiAgbGV0IGh5ZHJhdGVkOiBUO1xuICBpZiAoJ3N0ZXBJZCcgaW4gcmVzb3VyY2UpIHtcbiAgICBoeWRyYXRlZCA9IGh5ZHJhdGVTdGVwSU8ocmVzb3VyY2UsIHJldml2ZXJzKTtcbiAgfSBlbHNlIGlmICgnaG9va0lkJyBpbiByZXNvdXJjZSkge1xuICAgIGh5ZHJhdGVkID0gaHlkcmF0ZUhvb2tNZXRhZGF0YShyZXNvdXJjZSwgcmV2aXZlcnMpO1xuICB9IGVsc2UgaWYgKCdldmVudElkJyBpbiByZXNvdXJjZSkge1xuICAgIGh5ZHJhdGVkID0gaHlkcmF0ZUV2ZW50RGF0YShyZXNvdXJjZSwgcmV2aXZlcnMpO1xuICB9IGVsc2Uge1xuICAgIGh5ZHJhdGVkID0gaHlkcmF0ZVdvcmtmbG93SU8ocmVzb3VyY2UsIHJldml2ZXJzKTtcbiAgfVxuXG4gIC8vIFN0cmlwIGV4ZWN1dGlvbkNvbnRleHQsIHByZXNlcnZpbmcgb25seSB3b3JrZmxvd0NvcmVWZXJzaW9uIGZvciBkaXNwbGF5XG4gIGlmICgnZXhlY3V0aW9uQ29udGV4dCcgaW4gaHlkcmF0ZWQpIHtcbiAgICBjb25zdCB7IGV4ZWN1dGlvbkNvbnRleHQsIC4uLnJlc3QgfSA9IGh5ZHJhdGVkO1xuICAgIGNvbnN0IHdvcmtmbG93Q29yZVZlcnNpb24gPVxuICAgICAgZXhlY3V0aW9uQ29udGV4dCAmJlxuICAgICAgdHlwZW9mIGV4ZWN1dGlvbkNvbnRleHQgPT09ICdvYmplY3QnICYmXG4gICAgICAnd29ya2Zsb3dDb3JlVmVyc2lvbicgaW4gZXhlY3V0aW9uQ29udGV4dFxuICAgICAgICA/IGV4ZWN1dGlvbkNvbnRleHQud29ya2Zsb3dDb3JlVmVyc2lvblxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBpZiAod29ya2Zsb3dDb3JlVmVyc2lvbikge1xuICAgICAgcmV0dXJuIHsgLi4ucmVzdCwgd29ya2Zsb3dDb3JlVmVyc2lvbiB9IGFzIHVua25vd24gYXMgVDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3QgYXMgVDtcbiAgfVxuXG4gIHJldHVybiBoeWRyYXRlZDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBVdGlsaXR5IGZ1bmN0aW9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBFeHRyYWN0IGFsbCBzdHJlYW0gSURzIGZyb20gYSB2YWx1ZSAocmVjdXJzaXZlbHkgdHJhdmVyc2VzIG9iamVjdHMvYXJyYXlzKSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RTdHJlYW1JZHMob2JqOiB1bmtub3duKTogc3RyaW5nW10ge1xuICBjb25zdCBzdHJlYW1JZHM6IHN0cmluZ1tdID0gW107XG5cbiAgZnVuY3Rpb24gdHJhdmVyc2UodmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAoaXNTdHJlYW1JZCh2YWx1ZSkpIHtcbiAgICAgIHN0cmVhbUlkcy5wdXNoKHZhbHVlIGFzIHN0cmluZyk7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgIHRyYXZlcnNlKGl0ZW0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgZm9yIChjb25zdCB2YWwgb2YgT2JqZWN0LnZhbHVlcyh2YWx1ZSkpIHtcbiAgICAgICAgdHJhdmVyc2UodmFsKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0cmF2ZXJzZShvYmopO1xuICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KHN0cmVhbUlkcykpO1xufVxuXG4vKiogVHJ1bmNhdGUgYSBzdHJpbmcgdG8gYSBtYXhpbXVtIGxlbmd0aCwgYWRkaW5nIGVsbGlwc2lzIGlmIG5lZWRlZCAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRydW5jYXRlSWQoaWQ6IHN0cmluZywgbWF4TGVuZ3RoID0gMTIpOiBzdHJpbmcge1xuICBpZiAoaWQubGVuZ3RoIDw9IG1heExlbmd0aCkgcmV0dXJuIGlkO1xuICByZXR1cm4gYCR7aWQuc2xpY2UoMCwgbWF4TGVuZ3RoKX0uLi5gO1xufVxuIl19
|