@workflow/core 5.0.0-beta.26 → 5.0.0-beta.27
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/events-consumer.d.ts +1 -1
- package/dist/events-consumer.d.ts.map +1 -1
- package/dist/events-consumer.js +18 -2
- package/dist/flushable-stream.d.ts.map +1 -1
- package/dist/flushable-stream.js +9 -3
- package/dist/runtime/constants.d.ts +14 -0
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +31 -1
- package/dist/runtime/get-world-lazy.d.ts.map +1 -1
- package/dist/runtime/get-world-lazy.js +11 -4
- package/dist/runtime/replay-budget.d.ts.map +1 -1
- package/dist/runtime/replay-budget.js +6 -5
- package/dist/runtime/start.d.ts.map +1 -1
- package/dist/runtime/start.js +8 -10
- package/dist/runtime/step-handler.d.ts.map +1 -1
- package/dist/runtime/step-handler.js +6 -5
- package/dist/runtime/wait-continuation.d.ts.map +1 -1
- package/dist/runtime/wait-continuation.js +17 -4
- package/dist/runtime/world-compatibility.d.ts +5 -0
- package/dist/runtime/world-compatibility.d.ts.map +1 -0
- package/dist/runtime/world-compatibility.js +12 -0
- package/dist/runtime/world.d.ts.map +1 -1
- package/dist/runtime/world.js +36 -8
- package/dist/runtime.js +10 -8
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +24 -7
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/package.json +6 -6
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { WorkflowRuntimeError } from '@workflow/errors';
|
|
2
|
+
import { SPEC_VERSION_CURRENT } from '@workflow/world';
|
|
3
|
+
export function assertWorldSupportsRuntimeProtocol(world) {
|
|
4
|
+
if (world.specVersion === SPEC_VERSION_CURRENT) {
|
|
5
|
+
return;
|
|
6
|
+
}
|
|
7
|
+
const supportedVersion = world.specVersion ?? 'none';
|
|
8
|
+
throw new WorkflowRuntimeError(`This Workflow runtime requires a World with matching spec version ${SPEC_VERSION_CURRENT}, ` +
|
|
9
|
+
`but the configured World declares spec version ${supportedVersion}. ` +
|
|
10
|
+
'Install a World package version compatible with the current Workflow runtime.');
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ybGQtY29tcGF0aWJpbGl0eS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL3dvcmxkLWNvbXBhdGliaWxpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFeEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFJdkQsTUFBTSxVQUFVLGtDQUFrQyxDQUNoRCxLQUErQjtJQUUvQixJQUFJLEtBQUssQ0FBQyxXQUFXLEtBQUssb0JBQW9CLEVBQUUsQ0FBQztRQUMvQyxPQUFPO0lBQ1QsQ0FBQztJQUVELE1BQU0sZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLFdBQVcsSUFBSSxNQUFNLENBQUM7SUFDckQsTUFBTSxJQUFJLG9CQUFvQixDQUM1QixxRUFBcUUsb0JBQW9CLElBQUk7UUFDM0Ysa0RBQWtELGdCQUFnQixJQUFJO1FBQ3RFLCtFQUErRSxDQUNsRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdvcmtmbG93UnVudGltZUVycm9yIH0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IFdvcmxkIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IFNQRUNfVkVSU0lPTl9DVVJSRU5UIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcblxudHlwZSBXb3JsZFNwZWNWZXJzaW9uTWV0YWRhdGEgPSBQaWNrPFdvcmxkLCAnc3BlY1ZlcnNpb24nPjtcblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFdvcmxkU3VwcG9ydHNSdW50aW1lUHJvdG9jb2woXG4gIHdvcmxkOiBXb3JsZFNwZWNWZXJzaW9uTWV0YWRhdGFcbik6IHZvaWQge1xuICBpZiAod29ybGQuc3BlY1ZlcnNpb24gPT09IFNQRUNfVkVSU0lPTl9DVVJSRU5UKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgc3VwcG9ydGVkVmVyc2lvbiA9IHdvcmxkLnNwZWNWZXJzaW9uID8/ICdub25lJztcbiAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgIGBUaGlzIFdvcmtmbG93IHJ1bnRpbWUgcmVxdWlyZXMgYSBXb3JsZCB3aXRoIG1hdGNoaW5nIHNwZWMgdmVyc2lvbiAke1NQRUNfVkVSU0lPTl9DVVJSRU5UfSwgYCArXG4gICAgICBgYnV0IHRoZSBjb25maWd1cmVkIFdvcmxkIGRlY2xhcmVzIHNwZWMgdmVyc2lvbiAke3N1cHBvcnRlZFZlcnNpb259LiBgICtcbiAgICAgICdJbnN0YWxsIGEgV29ybGQgcGFja2FnZSB2ZXJzaW9uIGNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCBXb3JrZmxvdyBydW50aW1lLidcbiAgKTtcbn1cbiJdfQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"world.d.ts","sourceRoot":"","sources":["../../src/runtime/world.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"world.d.ts","sourceRoot":"","sources":["../../src/runtime/world.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAmF7C;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,WAAW,QAAa,OAAO,CAAC,KAAK,CA6DjD,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,EAAE,oBAAoB,GAAG,aAAa,CAAC,CAAC;AAE9E;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,QAAa,OAAO,CAAC,aAAa,CAoB9D,CAAC;AAEF,eAAO,MAAM,QAAQ,QAAa,OAAO,CAAC,KAAK,CAgB9C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,QAAQ,GAAI,OAAO,KAAK,GAAG,SAAS,KAAG,IAKnD,CAAC"}
|
package/dist/runtime/world.js
CHANGED
|
@@ -3,16 +3,23 @@ import { pathToFileURL } from 'node:url';
|
|
|
3
3
|
import { isVercelWorldTarget, resolveWorkflowTargetWorld, } from '@workflow/utils';
|
|
4
4
|
import { createLocalWorld } from '@workflow/world-local';
|
|
5
5
|
import { createVercelWorld } from '@workflow/world-vercel';
|
|
6
|
+
import { assertWorldSupportsRuntimeProtocol } from './world-compatibility.js';
|
|
6
7
|
function getRuntimeRequire() {
|
|
7
8
|
// Resolve from the app root (process.cwd()) so custom world packages
|
|
8
9
|
// like @workflow/world-postgres can be found even though they're not
|
|
9
10
|
// dependencies of @workflow/core. Using import.meta.url would resolve
|
|
10
11
|
// from core's location, missing app-level packages.
|
|
11
12
|
try {
|
|
12
|
-
return createRequire(
|
|
13
|
+
return createRequire(
|
|
14
|
+
/* webpackIgnore: true */
|
|
15
|
+
/* turbopackIgnore: true */
|
|
16
|
+
pathToFileURL(process.cwd() + '/package.json').href);
|
|
13
17
|
}
|
|
14
18
|
catch {
|
|
15
|
-
return createRequire(
|
|
19
|
+
return createRequire(
|
|
20
|
+
/* webpackIgnore: true */
|
|
21
|
+
/* turbopackIgnore: true */
|
|
22
|
+
import.meta.url);
|
|
16
23
|
}
|
|
17
24
|
}
|
|
18
25
|
const WorldCache = Symbol.for('@workflow/world//cache');
|
|
@@ -33,16 +40,27 @@ function resolveModulePath(specifier) {
|
|
|
33
40
|
}
|
|
34
41
|
// Absolute path - convert to file:// URL
|
|
35
42
|
if (specifier.startsWith('/')) {
|
|
36
|
-
return pathToFileURL(
|
|
43
|
+
return pathToFileURL(
|
|
44
|
+
/* webpackIgnore: true */
|
|
45
|
+
/* turbopackIgnore: true */
|
|
46
|
+
specifier).href;
|
|
37
47
|
}
|
|
38
48
|
// Relative path - resolve relative to cwd and convert to file:// URL
|
|
39
49
|
if (specifier.startsWith('./') || specifier.startsWith('../')) {
|
|
40
50
|
return pathToFileURL(
|
|
41
|
-
/*
|
|
51
|
+
/* webpackIgnore: true */
|
|
52
|
+
/* turbopackIgnore: true */
|
|
53
|
+
process.cwd() + '/' + specifier).href;
|
|
42
54
|
}
|
|
43
55
|
// Package specifier - use require.resolve to find the package
|
|
44
56
|
try {
|
|
45
|
-
return pathToFileURL(
|
|
57
|
+
return pathToFileURL(
|
|
58
|
+
/* webpackIgnore: true */
|
|
59
|
+
/* turbopackIgnore: true */
|
|
60
|
+
getRuntimeRequire().resolve(
|
|
61
|
+
/* webpackIgnore: true */
|
|
62
|
+
/* turbopackIgnore: true */
|
|
63
|
+
specifier)).href;
|
|
46
64
|
}
|
|
47
65
|
catch {
|
|
48
66
|
return specifier;
|
|
@@ -91,11 +109,17 @@ export const createWorld = async () => {
|
|
|
91
109
|
// dynamic import() for ESM-only packages.
|
|
92
110
|
let mod;
|
|
93
111
|
try {
|
|
94
|
-
mod = getRuntimeRequire()(
|
|
112
|
+
mod = getRuntimeRequire()(
|
|
113
|
+
/* webpackIgnore: true */
|
|
114
|
+
/* turbopackIgnore: true */
|
|
115
|
+
targetWorld);
|
|
95
116
|
}
|
|
96
117
|
catch {
|
|
97
118
|
const resolvedPath = resolveModulePath(targetWorld);
|
|
98
|
-
mod = await import(
|
|
119
|
+
mod = await import(
|
|
120
|
+
/* webpackIgnore: true */
|
|
121
|
+
/* turbopackIgnore: true */
|
|
122
|
+
resolvedPath);
|
|
99
123
|
}
|
|
100
124
|
if (typeof mod === 'function') {
|
|
101
125
|
return mod();
|
|
@@ -119,6 +143,7 @@ export const createWorld = async () => {
|
|
|
119
143
|
*/
|
|
120
144
|
export const getWorldHandlers = async () => {
|
|
121
145
|
if (globalSymbols[StubbedWorldCache]) {
|
|
146
|
+
assertWorldSupportsRuntimeProtocol(globalSymbols[StubbedWorldCache]);
|
|
122
147
|
return globalSymbols[StubbedWorldCache];
|
|
123
148
|
}
|
|
124
149
|
// Store the promise immediately to prevent race conditions with concurrent calls.
|
|
@@ -130,6 +155,7 @@ export const getWorldHandlers = async () => {
|
|
|
130
155
|
});
|
|
131
156
|
}
|
|
132
157
|
const _world = await globalSymbols[StubbedWorldCachePromise];
|
|
158
|
+
assertWorldSupportsRuntimeProtocol(_world);
|
|
133
159
|
globalSymbols[StubbedWorldCache] = _world;
|
|
134
160
|
return {
|
|
135
161
|
createQueueHandler: _world.createQueueHandler,
|
|
@@ -138,6 +164,7 @@ export const getWorldHandlers = async () => {
|
|
|
138
164
|
};
|
|
139
165
|
export const getWorld = async () => {
|
|
140
166
|
if (globalSymbols[WorldCache]) {
|
|
167
|
+
assertWorldSupportsRuntimeProtocol(globalSymbols[WorldCache]);
|
|
141
168
|
return globalSymbols[WorldCache];
|
|
142
169
|
}
|
|
143
170
|
// Store the promise immediately to prevent race conditions with concurrent calls.
|
|
@@ -149,6 +176,7 @@ export const getWorld = async () => {
|
|
|
149
176
|
});
|
|
150
177
|
}
|
|
151
178
|
globalSymbols[WorldCache] = await globalSymbols[WorldCachePromise];
|
|
179
|
+
assertWorldSupportsRuntimeProtocol(globalSymbols[WorldCache]);
|
|
152
180
|
return globalSymbols[WorldCache];
|
|
153
181
|
};
|
|
154
182
|
/**
|
|
@@ -180,4 +208,4 @@ export const setWorld = (world) => {
|
|
|
180
208
|
const GetWorldFnKey = Symbol.for('@workflow/world//getWorldFn');
|
|
181
209
|
globalThis[GetWorldFnKey] ??=
|
|
182
210
|
getWorld;
|
|
183
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ybGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS93b3JsZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxFQUNMLG1CQUFtQixFQUNuQiwwQkFBMEIsR0FDM0IsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUUzRCxTQUFTLGlCQUFpQjtJQUN4QixxRUFBcUU7SUFDckUscUVBQXFFO0lBQ3JFLHNFQUFzRTtJQUN0RSxvREFBb0Q7SUFDcEQsSUFBSSxDQUFDO1FBQ0gsT0FBTyxhQUFhLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN4QyxDQUFDO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsd0JBQXdCLENBQUMsQ0FBQztBQUN4RCxNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsK0JBQStCLENBQUMsQ0FBQztBQUN0RSxNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsK0JBQStCLENBQUMsQ0FBQztBQUN0RSxNQUFNLHdCQUF3QixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQ3pDLHNDQUFzQyxDQUN2QyxDQUFDO0FBRUYsTUFBTSxhQUFhLEdBS2YsVUFBVSxDQUFDO0FBRWYsb0VBQW9FO0FBQ3BF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LENBQUMsNkJBQTZCLENBQUMsQ0FBQztBQUMvRCxVQUF5RCxDQUFDLGFBQWEsQ0FBQztJQUN2RSxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSAnbm9kZTptb2R1bGUnO1xuaW1wb3J0IHsgcGF0aFRvRmlsZVVSTCB9IGZyb20gJ25vZGU6dXJsJztcbmltcG9ydCB7XG4gIGlzVmVyY2VsV29ybGRUYXJnZXQsXG4gIHJlc29sdmVXb3JrZmxvd1RhcmdldFdvcmxkLFxufSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBXb3JsZCB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBjcmVhdGVMb2NhbFdvcmxkIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkLWxvY2FsJztcbmltcG9ydCB7IGNyZWF0ZVZlcmNlbFdvcmxkIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkLXZlcmNlbCc7XG5cbmZ1bmN0aW9uIGdldFJ1bnRpbWVSZXF1aXJlKCkge1xuICAvLyBSZXNvbHZlIGZyb20gdGhlIGFwcCByb290IChwcm9jZXNzLmN3ZCgpKSBzbyBjdXN0b20gd29ybGQgcGFja2FnZXNcbiAgLy8gbGlrZSBAd29ya2Zsb3cvd29ybGQtcG9zdGdyZXMgY2FuIGJlIGZvdW5kIGV2ZW4gdGhvdWdoIHRoZXkncmUgbm90XG4gIC8vIGRlcGVuZGVuY2llcyBvZiBAd29ya2Zsb3cvY29yZS4gVXNpbmcgaW1wb3J0Lm1ldGEudXJsIHdvdWxkIHJlc29sdmVcbiAgLy8gZnJvbSBjb3JlJ3MgbG9jYXRpb24sIG1pc3NpbmcgYXBwLWxldmVsIHBhY2thZ2VzLlxuICB0cnkge1xuICAgIHJldHVybiBjcmVhdGVSZXF1aXJlKHBhdGhUb0ZpbGVVUkwocHJvY2Vzcy5jd2QoKSArICcvcGFja2FnZS5qc29uJykuaHJlZik7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XG4gIH1cbn1cblxuY29uc3QgV29ybGRDYWNoZSA9IFN5bWJvbC5mb3IoJ0B3b3JrZmxvdy93b3JsZC8vY2FjaGUnKTtcbmNvbnN0IFN0dWJiZWRXb3JsZENhY2hlID0gU3ltYm9sLmZvcignQHdvcmtmbG93L3dvcmxkLy9zdHViYmVkQ2FjaGUnKTtcbmNvbnN0IFdvcmxkQ2FjaGVQcm9taXNlID0gU3ltYm9sLmZvcignQHdvcmtmbG93L3dvcmxkLy9jYWNoZVByb21pc2UnKTtcbmNvbnN0IFN0dWJiZWRXb3JsZENhY2hlUHJvbWlzZSA9IFN5bWJvbC5mb3IoXG4gICdAd29ya2Zsb3cvd29ybGQvL3N0dWJiZWRDYWNoZVByb21pc2UnXG4pO1xuXG5jb25zdCBnbG9iYWxTeW1ib2xzOiB0eXBlb2YgZ2xvYmFsVGhpcyAmIHtcbiAgW1dvcmxkQ2FjaGVdPzogV29ybGQ7XG4gIFtTdHViYmVkV29ybGRDYWNoZV0/OiBXb3JsZDtcbiAgW1dvcmxkQ2FjaGVQcm9taXNlXT86IFByb21pc2U8V29ybGQ+O1xuICBbU3R1YmJlZFdvcmxkQ2FjaGVQcm9taXNlXT86IFByb21pc2U8V29ybGQ+O1xufSA9IGdsb2JhbFRoaXM7XG5cbi8vIER5bmFtaWMgaW1wb3J0IGZvciBjdXN0b20gd29ybGQgbW9kdWxlcy4gVXNlcyBhIHN0YW5kYXJkIGltcG9ydCgpXG4vLyB3cmFwcGVkIGluIGEgdHJ5L2NhdGNoIHdpdGggcmVxdWlyZSgpIGZhbGxiYWNrIGZvciBDSlMgdGVzdCBydW5uZXJzLlxuLy8gTm90ZTogdGhlIHByZXZpb3VzIGBuZXcgRnVuY3Rpb24oJ3NwZWNpZmllcicsICdyZXR1cm4gaW1wb3J0KHNwZWNpZmllciknKWBcbi8vIHBhdHRlcm4gd2FzIHJlcGxhY2VkIGJlY2F1c2UgVHVyYm9wYWNrIChOZXh0LmpzKSB0cmVhdHMgdW5yZXNvbHZhYmxlXG4vLyBkeW5hbWljIGltcG9ydHMgZnJvbSBgbmV3IEZ1bmN0aW9uYCBhcyBmYXRhbCBidWlsZCBlcnJvcnMgaW4gdGhlIFYyXG4vLyBjb21iaW5lZCBmbG93IHJvdXRlIGNvbnRleHQuXG5cbmZ1bmN0aW9uIHJlc29sdmVNb2R1bGVQYXRoKHNwZWNpZmllcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gQWxyZWFkeSBhIGZpbGU6Ly8gVVJMXG4gIGlmIChzcGVjaWZpZXIuc3RhcnRzV2l0aCgnZmlsZTovLycpKSB7XG4gICAgcmV0dXJuIHNwZWNpZmllcjtcbiAgfVxuICAvLyBBYnNvbHV0ZSBwYXRoIC0gY29udmVydCB0byBmaWxlOi8vIFVSTFxuICBpZiAoc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgIHJldHVybiBwYXRoVG9GaWxlVVJMKHNwZWNpZmllcikuaHJlZjtcbiAgfVxuICAvLyBSZWxhdGl2ZSBwYXRoIC0gcmVzb2x2ZSByZWxhdGl2ZSB0byBjd2QgYW5kIGNvbnZlcnQgdG8gZmlsZTovLyBVUkxcbiAgaWYgKHNwZWNpZmllci5zdGFydHNXaXRoKCcuLycpIHx8IHNwZWNpZmllci5zdGFydHNXaXRoKCcuLi8nKSkge1xuICAgIHJldHVybiBwYXRoVG9GaWxlVVJMKFxuICAgICAgLyogdHVyYm9wYWNrSWdub3JlOiB0cnVlICovIHByb2Nlc3MuY3dkKCkgKyAnLycgKyBzcGVjaWZpZXJcbiAgICApLmhyZWY7XG4gIH1cbiAgLy8gUGFja2FnZSBzcGVjaWZpZXIgLSB1c2UgcmVxdWlyZS5yZXNvbHZlIHRvIGZpbmQgdGhlIHBhY2thZ2VcbiAgdHJ5IHtcbiAgICByZXR1cm4gcGF0aFRvRmlsZVVSTChnZXRSdW50aW1lUmVxdWlyZSgpLnJlc29sdmUoc3BlY2lmaWVyKSkuaHJlZjtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHNwZWNpZmllcjtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyB3b3JsZCBpbnN0YW5jZSBiYXNlZCBvbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gKiBXT1JLRkxPV19UQVJHRVRfV09STEQgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHRhcmdldCB3b3JsZC5cbiAqXG4gKiBOb3RlOiBXT1JLRkxPV19WRVJDRUxfKiBlbnYgdmFycyAoUFJPSkVDVCwgVEVBTSwgQVVUSF9UT0tFTiwgZXRjLikgYXJlXG4gKiBpbnRlbnRpb25hbGx5IE5PVCByZWFkIGhlcmUuIFRob3NlIGFyZSBmb3IgQ0xJL29ic2VydmFiaWxpdHkgdG9vbGluZyBvbmx5XG4gKiBhbmQgc2hvdWxkIG5vdCBhZmZlY3QgcnVudGltZSBiZWhhdmlvci4gVGhlIFZlcmNlbCBydW50aW1lIHByb3ZpZGVzXG4gKiBhdXRoZW50aWNhdGlvbiB2aWEgT0lEQyB0b2tlbnMgYW5kIHByb2plY3QgY29udGV4dCB2aWEgc3lzdGVtIGVudiB2YXJzXG4gKiAoVkVSQ0VMX0RFUExPWU1FTlRfSUQsIFZFUkNFTF9QUk9KRUNUX0lEKS4gVG9vbGluZyB0aGF0IG5lZWRzIHRoZXNlIGVudlxuICogdmFycyBzaG91bGQgY2FsbCBjcmVhdGVWZXJjZWxXb3JsZCgpIGRpcmVjdGx5IHdpdGggYW4gZXhwbGljaXQgY29uZmlnIGFuZFxuICogdXNlIHNldFdvcmxkKCkgdG8gaW5qZWN0IHRoZSBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZVdvcmxkID0gYXN5bmMgKCk6IFByb21pc2U8V29ybGQ+ID0+IHtcbiAgY29uc3QgdGFyZ2V0V29ybGQgPSByZXNvbHZlV29ya2Zsb3dUYXJnZXRXb3JsZCgpO1xuXG4gIGlmIChpc1ZlcmNlbFdvcmxkVGFyZ2V0KHRhcmdldFdvcmxkKSkge1xuICAgIC8vIFdhcm4gaWYgV09SS0ZMT1dfVkVSQ0VMXyogZW52IHZhcnMgYXJlIHNldCBpbnNpZGUgYSBWZXJjZWwgc2VydmVybGVzc1xuICAgIC8vIGZ1bmN0aW9uIChWRVJDRUw9MSkg4oCUIHRoZXkgaGF2ZSBubyBlZmZlY3QgYXQgcnVudGltZSBhbmQgbGlrZWx5IGluZGljYXRlXG4gICAgLy8gYSBtaXNjb25maWd1cmF0aW9uICh1c2VyIG1hbnVhbGx5IGFkZGVkIHRoZW0gYXMgVmVyY2VsIHByb2plY3QgZW52IHZhcnMsXG4gICAgLy8gd2hpY2ggaXMgbm90IG5lZWRlZCkuIFdlIGdhdGUgb24gVkVSQ0VMPTEgc28gdGhlIHdhcm5pbmcgZG9lcyBub3QgZmlyZVxuICAgIC8vIHdoZW4gdGhlIENMSSBvciB3ZWIgb2JzZXJ2YWJpbGl0eSBhcHAgc2V0cyB0aGVzZSBlbnYgdmFycyBpbnRlbnRpb25hbGx5LlxuICAgIGNvbnN0IHN0YWxlRW52VmFycyA9IFtcbiAgICAgICdXT1JLRkxPV19WRVJDRUxfUFJPSkVDVCcsXG4gICAgICAnV09SS0ZMT1dfVkVSQ0VMX1RFQU0nLFxuICAgICAgJ1dPUktGTE9XX1ZFUkNFTF9BVVRIX1RPS0VOJyxcbiAgICAgICdXT1JLRkxPV19WRVJDRUxfRU5WJyxcbiAgICBdLmZpbHRlcigoa2V5KSA9PiBwcm9jZXNzLmVudltrZXldKTtcbiAgICBpZiAoc3RhbGVFbnZWYXJzLmxlbmd0aCA+IDAgJiYgcHJvY2Vzcy5lbnYuVkVSQ0VMID09PSAnMScpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFt3b3JrZmxvd10gV2FybmluZzogJHtzdGFsZUVudlZhcnMuam9pbignLCAnKX0gZW52IHZhcihzKSBgICtcbiAgICAgICAgICAnYXJlIHNldCBidXQgaGF2ZSBubyBlZmZlY3QgYXQgcnVudGltZS4gVGhlc2UgYXJlIG9ubHkgdXNlZCBieSB0aGUgV29ya2Zsb3cgQ0xJLiAnICtcbiAgICAgICAgICAnUmVtb3ZlIHRoZW0gZnJvbSB5b3VyIFZlcmNlbCBwcm9qZWN0IGVudmlyb25tZW50IHZhcmlhYmxlcy4nXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVWZXJjZWxXb3JsZCgpO1xuICB9XG5cbiAgaWYgKHRhcmdldFdvcmxkID09PSAnbG9jYWwnKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUxvY2FsV29ybGQoe1xuICAgICAgZGF0YURpcjogcHJvY2Vzcy5lbnYuV09SS0ZMT1dfTE9DQUxfREFUQV9ESVIsXG4gICAgfSk7XG4gIH1cblxuICAvLyBUcnkgcmVxdWlyZSgpIGZpcnN0IGZvciBjdXN0b20gd29ybGRzIOKAlCB0aGlzIGF2b2lkcyBUdXJib3BhY2sgdHJhY2luZ1xuICAvLyBhIGR5bmFtaWMgaW1wb3J0KCkgdGhhdCBpdCBjYW4ndCBzdGF0aWNhbGx5IHJlc29sdmUuIEZhbGwgYmFjayB0b1xuICAvLyBkeW5hbWljIGltcG9ydCgpIGZvciBFU00tb25seSBwYWNrYWdlcy5cbiAgbGV0IG1vZDogYW55O1xuICB0cnkge1xuICAgIG1vZCA9IGdldFJ1bnRpbWVSZXF1aXJlKCkodGFyZ2V0V29ybGQpO1xuICB9IGNhdGNoIHtcbiAgICBjb25zdCByZXNvbHZlZFBhdGggPSByZXNvbHZlTW9kdWxlUGF0aCh0YXJnZXRXb3JsZCk7XG4gICAgbW9kID0gYXdhaXQgaW1wb3J0KC8qIHdlYnBhY2tJZ25vcmU6IHRydWUgKi8gcmVzb2x2ZWRQYXRoKTtcbiAgfVxuICBpZiAodHlwZW9mIG1vZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBtb2QoKSBhcyBXb3JsZDtcbiAgfSBlbHNlIGlmICh0eXBlb2YgbW9kLmRlZmF1bHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbW9kLmRlZmF1bHQoKSBhcyBXb3JsZDtcbiAgfSBlbHNlIGlmICh0eXBlb2YgbW9kLmNyZWF0ZVdvcmxkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIG1vZC5jcmVhdGVXb3JsZCgpIGFzIFdvcmxkO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBJbnZhbGlkIHRhcmdldCB3b3JsZCBtb2R1bGU6ICR7dGFyZ2V0V29ybGR9LCBtdXN0IGV4cG9ydCBhIGRlZmF1bHQgZnVuY3Rpb24gb3IgY3JlYXRlV29ybGQgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgV29ybGQgaW5zdGFuY2UuYFxuICApO1xufTtcblxuZXhwb3J0IHR5cGUgV29ybGRIYW5kbGVycyA9IFBpY2s8V29ybGQsICdjcmVhdGVRdWV1ZUhhbmRsZXInIHwgJ3NwZWNWZXJzaW9uJz47XG5cbi8qKlxuICogU29tZSBmdW5jdGlvbnMgZnJvbSB0aGUgd29ybGQgYXJlIG5lZWRlZCBhdCBidWlsZCB0aW1lLCBidXQgd2UgZG8gTk9UIHdhbnRcbiAqIHRvIGNhY2hlIHRoZSB3b3JsZCBpbiB0aG9zZSBpbnN0YW5jZXMgZm9yIGdlbmVyYWwgdXNlLCBzaW5jZSB3ZSBkb24ndCBoYXZlXG4gKiB0aGUgY29ycmVjdCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgc2V0IHlldC4gVGhpcyBpcyBhIHNhZmUgZnVuY3Rpb24gdG9cbiAqIGNhbGwgYXQgYnVpbGQgdGltZSwgdGhhdCBvbmx5IGdpdmVzIGFjY2VzcyB0byBub24tZW52aXJvbm1lbnQtYm91bmQgd29ybGRcbiAqIGZ1bmN0aW9ucy4gVGhlIG9ubHkgYmluZGluZyB2YWx1ZSBzaG91bGQgYmUgdGhlIHRhcmdldCB3b3JsZC5cbiAqIE9uY2Ugd2UgbWlncmF0ZSB0byBhIGZpbGUtYmFzZWQgY29uZmlndXJhdGlvbiAod29ya2Zsb3cuY29uZmlnLnRzKSwgd2Ugc2hvdWxkXG4gKiBiZSBhYmxlIHRvIHJlLWNvbWJpbmUgZ2V0V29ybGQgYW5kIGdldFdvcmxkSGFuZGxlcnMgaW50byBvbmUgc2luZ2xldG9uLlxuICovXG5leHBvcnQgY29uc3QgZ2V0V29ybGRIYW5kbGVycyA9IGFzeW5jICgpOiBQcm9taXNlPFdvcmxkSGFuZGxlcnM+ID0+IHtcbiAgaWYgKGdsb2JhbFN5bWJvbHNbU3R1YmJlZFdvcmxkQ2FjaGVdKSB7XG4gICAgcmV0dXJuIGdsb2JhbFN5bWJvbHNbU3R1YmJlZFdvcmxkQ2FjaGVdO1xuICB9XG4gIC8vIFN0b3JlIHRoZSBwcm9taXNlIGltbWVkaWF0ZWx5IHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zIHdpdGggY29uY3VycmVudCBjYWxscy5cbiAgLy8gQ2xlYXIgb24gcmVqZWN0aW9uIHNvIHN1YnNlcXVlbnQgY2FsbHMgY2FuIHJldHJ5IGluc3RlYWQgb2YgY2FjaGluZyB0aGUgZmFpbHVyZS5cbiAgaWYgKCFnbG9iYWxTeW1ib2xzW1N0dWJiZWRXb3JsZENhY2hlUHJvbWlzZV0pIHtcbiAgICBnbG9iYWxTeW1ib2xzW1N0dWJiZWRXb3JsZENhY2hlUHJvbWlzZV0gPSBjcmVhdGVXb3JsZCgpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgIGdsb2JhbFN5bWJvbHNbU3R1YmJlZFdvcmxkQ2FjaGVQcm9taXNlXSA9IHVuZGVmaW5lZDtcbiAgICAgIHRocm93IGVycjtcbiAgICB9KTtcbiAgfVxuICBjb25zdCBfd29ybGQgPSBhd2FpdCBnbG9iYWxTeW1ib2xzW1N0dWJiZWRXb3JsZENhY2hlUHJvbWlzZV07XG4gIGdsb2JhbFN5bWJvbHNbU3R1YmJlZFdvcmxkQ2FjaGVdID0gX3dvcmxkO1xuICByZXR1cm4ge1xuICAgIGNyZWF0ZVF1ZXVlSGFuZGxlcjogX3dvcmxkLmNyZWF0ZVF1ZXVlSGFuZGxlcixcbiAgICBzcGVjVmVyc2lvbjogX3dvcmxkLnNwZWNWZXJzaW9uLFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFdvcmxkID0gYXN5bmMgKCk6IFByb21pc2U8V29ybGQ+ID0+IHtcbiAgaWYgKGdsb2JhbFN5bWJvbHNbV29ybGRDYWNoZV0pIHtcbiAgICByZXR1cm4gZ2xvYmFsU3ltYm9sc1tXb3JsZENhY2hlXTtcbiAgfVxuICAvLyBTdG9yZSB0aGUgcHJvbWlzZSBpbW1lZGlhdGVseSB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucyB3aXRoIGNvbmN1cnJlbnQgY2FsbHMuXG4gIC8vIENsZWFyIG9uIHJlamVjdGlvbiBzbyBzdWJzZXF1ZW50IGNhbGxzIGNhbiByZXRyeSBpbnN0ZWFkIG9mIGNhY2hpbmcgdGhlIGZhaWx1cmUuXG4gIGlmICghZ2xvYmFsU3ltYm9sc1tXb3JsZENhY2hlUHJvbWlzZV0pIHtcbiAgICBnbG9iYWxTeW1ib2xzW1dvcmxkQ2FjaGVQcm9taXNlXSA9IGNyZWF0ZVdvcmxkKCkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgZ2xvYmFsU3ltYm9sc1tXb3JsZENhY2hlUHJvbWlzZV0gPSB1bmRlZmluZWQ7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfSk7XG4gIH1cbiAgZ2xvYmFsU3ltYm9sc1tXb3JsZENhY2hlXSA9IGF3YWl0IGdsb2JhbFN5bWJvbHNbV29ybGRDYWNoZVByb21pc2VdO1xuICByZXR1cm4gZ2xvYmFsU3ltYm9sc1tXb3JsZENhY2hlXTtcbn07XG5cbi8qKlxuICogUmVzZXQgdGhlIGNhY2hlZCB3b3JsZCBpbnN0YW5jZS4gVGhpcyBzaG91bGQgYmUgY2FsbGVkIHdoZW4gZW52aXJvbm1lbnRcbiAqIHZhcmlhYmxlcyBjaGFuZ2UgYW5kIHlvdSBuZWVkIHRvIHJlaW5pdGlhbGl6ZSB0aGUgd29ybGQgd2l0aCBuZXcgY29uZmlnLlxuICovXG5leHBvcnQgY29uc3Qgc2V0V29ybGQgPSAod29ybGQ6IFdvcmxkIHwgdW5kZWZpbmVkKTogdm9pZCA9PiB7XG4gIGdsb2JhbFN5bWJvbHNbV29ybGRDYWNoZV0gPSB3b3JsZDtcbiAgZ2xvYmFsU3ltYm9sc1tTdHViYmVkV29ybGRDYWNoZV0gPSB3b3JsZDtcbiAgZ2xvYmFsU3ltYm9sc1tXb3JsZENhY2hlUHJvbWlzZV0gPSB1bmRlZmluZWQ7XG4gIGdsb2JhbFN5bWJvbHNbU3R1YmJlZFdvcmxkQ2FjaGVQcm9taXNlXSA9IHVuZGVmaW5lZDtcbn07XG5cbi8vIFJlZ2lzdGVyIGdldFdvcmxkIG9uIGdsb2JhbFRoaXMgc28gZ2V0V29ybGRMYXp5IGNhbiBjYWxsIGl0IGRpcmVjdGx5IHdoZW5cbi8vIHdvcmxkLnRzIGlzIHN0YXRpY2FsbHkgcHJlc2VudCBpbiB0aGUgYnVuZGxlLiBUaGlzIGF2b2lkcyB0aGUgcmVsYXRpdmVcbi8vIGR5bmFtaWMgaW1wb3J0KCcuL3dvcmxkLmpzJykgZmFsbGJhY2sgaW4gZ2V0LXdvcmxkLWxhenkudHMsIHdoaWNoIGZhaWxzXG4vLyBhZnRlciBOZXh0LmpzIGlubGluZXMgZ2V0LXdvcmxkLWxhenkuanMgaW50byBhIHJvdXRlIGJ1bmRsZSAobm8gc2libGluZ1xuLy8gd29ybGQuanMgZXhpc3RzIGF0IHRoZSBidW5kbGVkIGxvY2F0aW9uKS5cbi8vXG4vLyBGb3Igc2VydmVyIHJvdXRlcyB0aGF0IG9ubHkgY29uc3VtZSBgc3RhcnRgIChvciBhbm90aGVyIGhlbHBlciB0aGF0IGdvZXNcbi8vIHRocm91Z2ggZ2V0V29ybGRMYXp5IHdpdGhvdXQgc3RhdGljYWxseSB1c2luZyBnZXRXb3JsZCksIHdlYnBhY2svdHVyYm9wYWNrXG4vLyB3b3VsZCBvdGhlcndpc2UgdHJlZS1zaGFrZSB3b3JsZC50cyBvdXQgb2YgdGhlIGJ1bmRsZSBlbnRpcmVseS4gVGhlXG4vLyBob3N0LW9ubHkgYC4vd29ybGQtaW5pdC50c2AgbW9kdWxlIGltcG9ydHMgd29ybGQudHMgZm9yIGl0cyBzaWRlIGVmZmVjdFxuLy8gYW5kIGlzIGl0c2VsZiBpbXBvcnRlZCBieSBgcGFja2FnZXMvd29ya2Zsb3cvc3JjL2FwaS50c2Agc28gdGhpc1xuLy8gcmVnaXN0cmF0aW9uIHJ1bnMgaW4gZXZlcnkgc2VydmVyIGJ1bmRsZSB0aGF0IHRvdWNoZXMgYHdvcmtmbG93L2FwaWAuXG4vL1xuLy8gU3RlcC9WTSBidW5kbGVzIG5ldmVyIHJlYWNoIHRoaXMgYnJhbmNoOiB0aGV5IGRvbid0IHN0YXRpY2FsbHkgaW1wb3J0XG4vLyB3b3JsZC50cywgYW5kIGB3b3JsZC1pbml0YCByZXNvbHZlcyB0byBhbiBlbXB0eSBzdHViIHZpYSB0aGUgYHdvcmtmbG93YFxuLy8gZXhwb3J0IGNvbmRpdGlvbi5cbmNvbnN0IEdldFdvcmxkRm5LZXkgPSBTeW1ib2wuZm9yKCdAd29ya2Zsb3cvd29ybGQvL2dldFdvcmxkRm4nKTtcbihnbG9iYWxUaGlzIGFzIHsgW0dldFdvcmxkRm5LZXldPzogKCkgPT4gUHJvbWlzZTxXb3JsZD4gfSlbR2V0V29ybGRGbktleV0gPz89XG4gIGdldFdvcmxkO1xuIl19
|
|
211
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ybGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS93b3JsZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxFQUNMLG1CQUFtQixFQUNuQiwwQkFBMEIsR0FDM0IsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUU5RSxTQUFTLGlCQUFpQjtJQUN4QixxRUFBcUU7SUFDckUscUVBQXFFO0lBQ3JFLHNFQUFzRTtJQUN0RSxvREFBb0Q7SUFDcEQsSUFBSSxDQUFDO1FBQ0gsT0FBTyxhQUFhO1FBQ2xCLHlCQUF5QjtRQUN6QiwyQkFBMkI7UUFDM0IsYUFBYSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQ3BELENBQUM7SUFDSixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxhQUFhO1FBQ2xCLHlCQUF5QjtRQUN6QiwyQkFBMkI7UUFDM0IsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2hCLENBQUM7SUFDSixDQUFDO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsd0JBQXdCLENBQUMsQ0FBQztBQUN4RCxNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsK0JBQStCLENBQUMsQ0FBQztBQUN0RSxNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsK0JBQStCLENBQUMsQ0FBQztBQUN0RSxNQUFN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Q0FBQyxVQUFVLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDbEMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ3pDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLFNBQVMsQ0FBQztJQUM3QyxhQUFhLENBQUMsd0JBQXdCLENBQUMsR0FBRyxTQUFTLENBQUM7QUFDdEQsQ0FBQyxDQUFDO0FBRUYsNEVBQTRFO0FBQzVFLHlFQUF5RTtBQUN6RSwwRUFBMEU7QUFDMUUsMEVBQTBFO0FBQzFFLDRDQUE0QztBQUM1QyxFQUFFO0FBQ0YsMkVBQTJFO0FBQzNFLDZFQUE2RTtBQUM3RSxzRUFBc0U7QUFDdEUsMEVBQTBFO0FBQzFFLG1FQUFtRTtBQUNuRSx3RUFBd0U7QUFDeEUsRUFBRTtBQUNGLHdFQUF3RTtBQUN4RSwwRUFBMEU7QUFDMUUsb0JBQW9CO0FBQ3BCLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsNkJBQTZCLENBQUMsQ0FBQztBQUMvRCxVQUF5RCxDQUFDLGFBQWEsQ0FBQztJQUN2RSxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSAnbm9kZTptb2R1bGUnO1xuaW1wb3J0IHsgcGF0aFRvRmlsZVVSTCB9IGZyb20gJ25vZGU6dXJsJztcbmltcG9ydCB7XG4gIGlzVmVyY2VsV29ybGRUYXJnZXQsXG4gIHJlc29sdmVXb3JrZmxvd1RhcmdldFdvcmxkLFxufSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBXb3JsZCB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBjcmVhdGVMb2NhbFdvcmxkIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkLWxvY2FsJztcbmltcG9ydCB7IGNyZWF0ZVZlcmNlbFdvcmxkIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkLXZlcmNlbCc7XG5pbXBvcnQgeyBhc3NlcnRXb3JsZFN1cHBvcnRzUnVudGltZVByb3RvY29sIH0gZnJvbSAnLi93b3JsZC1jb21wYXRpYmlsaXR5LmpzJztcblxuZnVuY3Rpb24gZ2V0UnVudGltZVJlcXVpcmUoKSB7XG4gIC8vIFJlc29sdmUgZnJvbSB0aGUgYXBwIHJvb3QgKHByb2Nlc3MuY3dkKCkpIHNvIGN1c3RvbSB3b3JsZCBwYWNrYWdlc1xuICAvLyBsaWtlIEB3b3JrZmxvdy93b3JsZC1wb3N0Z3JlcyBjYW4gYmUgZm91bmQgZXZlbiB0aG91Z2ggdGhleSdyZSBub3RcbiAgLy8gZGVwZW5kZW5jaWVzIG9mIEB3b3JrZmxvdy9jb3JlLiBVc2luZyBpbXBvcnQubWV0YS51cmwgd291bGQgcmVzb2x2ZVxuICAvLyBmcm9tIGNvcmUncyBsb2NhdGlvbiwgbWlzc2luZyBhcHAtbGV2ZWwgcGFja2FnZXMuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGNyZWF0ZVJlcXVpcmUoXG4gICAgICAvKiB3ZWJwYWNrSWdub3JlOiB0cnVlICovXG4gICAgICAvKiB0dXJib3BhY2tJZ25vcmU6IHRydWUgKi9cbiAgICAgIHBhdGhUb0ZpbGVVUkwocHJvY2Vzcy5jd2QoKSArICcvcGFja2FnZS5qc29uJykuaHJlZlxuICAgICk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBjcmVhdGVSZXF1aXJlKFxuICAgICAgLyogd2VicGFja0lnbm9yZTogdHJ1ZSAqL1xuICAgICAgLyogdHVyYm9wYWNrSWdub3JlOiB0cnVlICovXG4gICAgICBpbXBvcnQubWV0YS51cmxcbiAgICApO1xuICB9XG59XG5cbmNvbnN0IFdvcmxkQ2FjaGUgPSBTeW1ib2wuZm9yKCdAd29ya2Zsb3cvd29ybGQvL2NhY2hlJyk7XG5jb25zdCBTdHViYmVkV29ybGRDYWNoZSA9IFN5bWJvbC5mb3IoJ0B3b3JrZmxvdy93b3JsZC8vc3R1YmJlZENhY2hlJyk7XG5jb25zdCBXb3JsZENhY2hlUHJvbWlzZSA9IFN5bWJvbC5mb3IoJ0B3b3JrZmxvdy93b3JsZC8vY2FjaGVQcm9taXNlJyk7XG5jb25zdCBTdHViYmVkV29ybGRDYWNoZVByb21pc2UgPSBTeW1ib2wuZm9yKFxuICAnQHdvcmtmbG93L3dvcmxkLy9zdHViYmVkQ2FjaGVQcm9taXNlJ1xuKTtcblxuY29uc3QgZ2xvYmFsU3ltYm9sczogdHlwZW9mIGdsb2JhbFRoaXMgJiB7XG4gIFtXb3JsZENhY2hlXT86IFdvcmxkO1xuICBbU3R1YmJlZFdvcmxkQ2FjaGVdPzogV29ybGQ7XG4gIFtXb3JsZENhY2hlUHJvbWlzZV0/OiBQcm9taXNlPFdvcmxkPjtcbiAgW1N0dWJiZWRXb3JsZENhY2hlUHJvbWlzZV0/OiBQcm9taXNlPFdvcmxkPjtcbn0gPSBnbG9iYWxUaGlzO1xuXG4vLyBEeW5hbWljIGltcG9ydCBmb3IgY3VzdG9tIHdvcmxkIG1vZHVsZXMuIFVzZXMgYSBzdGFuZGFyZCBpbXBvcnQoKVxuLy8gd3JhcHBlZCBpbiBhIHRyeS9jYXRjaCB3aXRoIHJlcXVpcmUoKSBmYWxsYmFjayBmb3IgQ0pTIHRlc3QgcnVubmVycy5cbi8vIE5vdGU6IHRoZSBwcmV2aW91cyBgbmV3IEZ1bmN0aW9uKCdzcGVjaWZpZXInLCAncmV0dXJuIGltcG9ydChzcGVjaWZpZXIpJylgXG4vLyBwYXR0ZXJuIHdhcyByZXBsYWNlZCBiZWNhdXNlIFR1cmJvcGFjayAoTmV4dC5qcykgdHJlYXRzIHVucmVzb2x2YWJsZVxuLy8gZHluYW1pYyBpbXBvcnRzIGZyb20gYG5ldyBGdW5jdGlvbmAgYXMgZmF0YWwgYnVpbGQgZXJyb3JzIGluIHRoZSBWMlxuLy8gY29tYmluZWQgZmxvdyByb3V0ZSBjb250ZXh0LlxuXG5mdW5jdGlvbiByZXNvbHZlTW9kdWxlUGF0aChzcGVjaWZpZXI6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIEFscmVhZHkgYSBmaWxlOi8vIFVSTFxuICBpZiAoc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJ2ZpbGU6Ly8nKSkge1xuICAgIHJldHVybiBzcGVjaWZpZXI7XG4gIH1cbiAgLy8gQWJzb2x1dGUgcGF0aCAtIGNvbnZlcnQgdG8gZmlsZTovLyBVUkxcbiAgaWYgKHNwZWNpZmllci5zdGFydHNXaXRoKCcvJykpIHtcbiAgICByZXR1cm4gcGF0aFRvRmlsZVVSTChcbiAgICAgIC8qIHdlYnBhY2tJZ25vcmU6IHRydWUgKi9cbiAgICAgIC8qIHR1cmJvcGFja0lnbm9yZTogdHJ1ZSAqL1xuICAgICAgc3BlY2lmaWVyXG4gICAgKS5ocmVmO1xuICB9XG4gIC8vIFJlbGF0aXZlIHBhdGggLSByZXNvbHZlIHJlbGF0aXZlIHRvIGN3ZCBhbmQgY29udmVydCB0byBmaWxlOi8vIFVSTFxuICBpZiAoc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJy4vJykgfHwgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJy4uLycpKSB7XG4gICAgcmV0dXJuIHBhdGhUb0ZpbGVVUkwoXG4gICAgICAvKiB3ZWJwYWNrSWdub3JlOiB0cnVlICovXG4gICAgICAvKiB0dXJib3BhY2tJZ25vcmU6IHRydWUgKi9cbiAgICAgIHByb2Nlc3MuY3dkKCkgKyAnLycgKyBzcGVjaWZpZXJcbiAgICApLmhyZWY7XG4gIH1cbiAgLy8gUGFja2FnZSBzcGVjaWZpZXIgLSB1c2UgcmVxdWlyZS5yZXNvbHZlIHRvIGZpbmQgdGhlIHBhY2thZ2VcbiAgdHJ5IHtcbiAgICByZXR1cm4gcGF0aFRvRmlsZVVSTChcbiAgICAgIC8qIHdlYnBhY2tJZ25vcmU6IHRydWUgKi9cbiAgICAgIC8qIHR1cmJvcGFja0lnbm9yZTogdHJ1ZSAqL1xuICAgICAgZ2V0UnVudGltZVJlcXVpcmUoKS5yZXNvbHZlKFxuICAgICAgICAvKiB3ZWJwYWNrSWdub3JlOiB0cnVlICovXG4gICAgICAgIC8qIHR1cmJvcGFja0lnbm9yZTogdHJ1ZSAqL1xuICAgICAgICBzcGVjaWZpZXJcbiAgICAgIClcbiAgICApLmhyZWY7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBzcGVjaWZpZXI7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgd29ybGQgaW5zdGFuY2UgYmFzZWQgb24gZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICogV09SS0ZMT1dfVEFSR0VUX1dPUkxEIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSB0YXJnZXQgd29ybGQuXG4gKlxuICogTm90ZTogV09SS0ZMT1dfVkVSQ0VMXyogZW52IHZhcnMgKFBST0pFQ1QsIFRFQU0sIEFVVEhfVE9LRU4sIGV0Yy4pIGFyZVxuICogaW50ZW50aW9uYWxseSBOT1QgcmVhZCBoZXJlLiBUaG9zZSBhcmUgZm9yIENMSS9vYnNlcnZhYmlsaXR5IHRvb2xpbmcgb25seVxuICogYW5kIHNob3VsZCBub3QgYWZmZWN0IHJ1bnRpbWUgYmVoYXZpb3IuIFRoZSBWZXJjZWwgcnVudGltZSBwcm92aWRlc1xuICogYXV0aGVudGljYXRpb24gdmlhIE9JREMgdG9rZW5zIGFuZCBwcm9qZWN0IGNvbnRleHQgdmlhIHN5c3RlbSBlbnYgdmFyc1xuICogKFZFUkNFTF9ERVBMT1lNRU5UX0lELCBWRVJDRUxfUFJPSkVDVF9JRCkuIFRvb2xpbmcgdGhhdCBuZWVkcyB0aGVzZSBlbnZcbiAqIHZhcnMgc2hvdWxkIGNhbGwgY3JlYXRlVmVyY2VsV29ybGQoKSBkaXJlY3RseSB3aXRoIGFuIGV4cGxpY2l0IGNvbmZpZyBhbmRcbiAqIHVzZSBzZXRXb3JsZCgpIHRvIGluamVjdCB0aGUgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVXb3JsZCA9IGFzeW5jICgpOiBQcm9taXNlPFdvcmxkPiA9PiB7XG4gIGNvbnN0IHRhcmdldFdvcmxkID0gcmVzb2x2ZVdvcmtmbG93VGFyZ2V0V29ybGQoKTtcblxuICBpZiAoaXNWZXJjZWxXb3JsZFRhcmdldCh0YXJnZXRXb3JsZCkpIHtcbiAgICAvLyBXYXJuIGlmIFdPUktGTE9XX1ZFUkNFTF8qIGVudiB2YXJzIGFyZSBzZXQgaW5zaWRlIGEgVmVyY2VsIHNlcnZlcmxlc3NcbiAgICAvLyBmdW5jdGlvbiAoVkVSQ0VMPTEpIOKAlCB0aGV5IGhhdmUgbm8gZWZmZWN0IGF0IHJ1bnRpbWUgYW5kIGxpa2VseSBpbmRpY2F0ZVxuICAgIC8vIGEgbWlzY29uZmlndXJhdGlvbiAodXNlciBtYW51YWxseSBhZGRlZCB0aGVtIGFzIFZlcmNlbCBwcm9qZWN0IGVudiB2YXJzLFxuICAgIC8vIHdoaWNoIGlzIG5vdCBuZWVkZWQpLiBXZSBnYXRlIG9uIFZFUkNFTD0xIHNvIHRoZSB3YXJuaW5nIGRvZXMgbm90IGZpcmVcbiAgICAvLyB3aGVuIHRoZSBDTEkgb3Igd2ViIG9ic2VydmFiaWxpdHkgYXBwIHNldHMgdGhlc2UgZW52IHZhcnMgaW50ZW50aW9uYWxseS5cbiAgICBjb25zdCBzdGFsZUVudlZhcnMgPSBbXG4gICAgICAnV09SS0ZMT1dfVkVSQ0VMX1BST0pFQ1QnLFxuICAgICAgJ1dPUktGTE9XX1ZFUkNFTF9URUFNJyxcbiAgICAgICdXT1JLRkxPV19WRVJDRUxfQVVUSF9UT0tFTicsXG4gICAgICAnV09SS0ZMT1dfVkVSQ0VMX0VOVicsXG4gICAgXS5maWx0ZXIoKGtleSkgPT4gcHJvY2Vzcy5lbnZba2V5XSk7XG4gICAgaWYgKHN0YWxlRW52VmFycy5sZW5ndGggPiAwICYmIHByb2Nlc3MuZW52LlZFUkNFTCA9PT0gJzEnKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbd29ya2Zsb3ddIFdhcm5pbmc6ICR7c3RhbGVFbnZWYXJzLmpvaW4oJywgJyl9IGVudiB2YXIocykgYCArXG4gICAgICAgICAgJ2FyZSBzZXQgYnV0IGhhdmUgbm8gZWZmZWN0IGF0IHJ1bnRpbWUuIFRoZXNlIGFyZSBvbmx5IHVzZWQgYnkgdGhlIFdvcmtmbG93IENMSS4gJyArXG4gICAgICAgICAgJ1JlbW92ZSB0aGVtIGZyb20geW91ciBWZXJjZWwgcHJvamVjdCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3JlYXRlVmVyY2VsV29ybGQoKTtcbiAgfVxuXG4gIGlmICh0YXJnZXRXb3JsZCA9PT0gJ2xvY2FsJykge1xuICAgIHJldHVybiBjcmVhdGVMb2NhbFdvcmxkKHtcbiAgICAgIGRhdGFEaXI6IHByb2Nlc3MuZW52LldPUktGTE9XX0xPQ0FMX0RBVEFfRElSLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gVHJ5IHJlcXVpcmUoKSBmaXJzdCBmb3IgY3VzdG9tIHdvcmxkcyDigJQgdGhpcyBhdm9pZHMgVHVyYm9wYWNrIHRyYWNpbmdcbiAgLy8gYSBkeW5hbWljIGltcG9ydCgpIHRoYXQgaXQgY2FuJ3Qgc3RhdGljYWxseSByZXNvbHZlLiBGYWxsIGJhY2sgdG9cbiAgLy8gZHluYW1pYyBpbXBvcnQoKSBmb3IgRVNNLW9ubHkgcGFja2FnZXMuXG4gIGxldCBtb2Q6IGFueTtcbiAgdHJ5IHtcbiAgICBtb2QgPSBnZXRSdW50aW1lUmVxdWlyZSgpKFxuICAgICAgLyogd2VicGFja0lnbm9yZTogdHJ1ZSAqL1xuICAgICAgLyogdHVyYm9wYWNrSWdub3JlOiB0cnVlICovXG4gICAgICB0YXJnZXRXb3JsZFxuICAgICk7XG4gIH0gY2F0Y2gge1xuICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IHJlc29sdmVNb2R1bGVQYXRoKHRhcmdldFdvcmxkKTtcbiAgICBtb2QgPSBhd2FpdCBpbXBvcnQoXG4gICAgICAvKiB3ZWJwYWNrSWdub3JlOiB0cnVlICovXG4gICAgICAvKiB0dXJib3BhY2tJZ25vcmU6IHRydWUgKi9cbiAgICAgIHJlc29sdmVkUGF0aFxuICAgICk7XG4gIH1cbiAgaWYgKHR5cGVvZiBtb2QgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbW9kKCkgYXMgV29ybGQ7XG4gIH0gZWxzZSBpZiAodHlwZW9mIG1vZC5kZWZhdWx0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIG1vZC5kZWZhdWx0KCkgYXMgV29ybGQ7XG4gIH0gZWxzZSBpZiAodHlwZW9mIG1vZC5jcmVhdGVXb3JsZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBtb2QuY3JlYXRlV29ybGQoKSBhcyBXb3JsZDtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgSW52YWxpZCB0YXJnZXQgd29ybGQgbW9kdWxlOiAke3RhcmdldFdvcmxkfSwgbXVzdCBleHBvcnQgYSBkZWZhdWx0IGZ1bmN0aW9uIG9yIGNyZWF0ZVdvcmxkIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIFdvcmxkIGluc3RhbmNlLmBcbiAgKTtcbn07XG5cbmV4cG9ydCB0eXBlIFdvcmxkSGFuZGxlcnMgPSBQaWNrPFdvcmxkLCAnY3JlYXRlUXVldWVIYW5kbGVyJyB8ICdzcGVjVmVyc2lvbic+O1xuXG4vKipcbiAqIFNvbWUgZnVuY3Rpb25zIGZyb20gdGhlIHdvcmxkIGFyZSBuZWVkZWQgYXQgYnVpbGQgdGltZSwgYnV0IHdlIGRvIE5PVCB3YW50XG4gKiB0byBjYWNoZSB0aGUgd29ybGQgaW4gdGhvc2UgaW5zdGFuY2VzIGZvciBnZW5lcmFsIHVzZSwgc2luY2Ugd2UgZG9uJ3QgaGF2ZVxuICogdGhlIGNvcnJlY3QgZW52aXJvbm1lbnQgdmFyaWFibGVzIHNldCB5ZXQuIFRoaXMgaXMgYSBzYWZlIGZ1bmN0aW9uIHRvXG4gKiBjYWxsIGF0IGJ1aWxkIHRpbWUsIHRoYXQgb25seSBnaXZlcyBhY2Nlc3MgdG8gbm9uLWVudmlyb25tZW50LWJvdW5kIHdvcmxkXG4gKiBmdW5jdGlvbnMuIFRoZSBvbmx5IGJpbmRpbmcgdmFsdWUgc2hvdWxkIGJlIHRoZSB0YXJnZXQgd29ybGQuXG4gKiBPbmNlIHdlIG1pZ3JhdGUgdG8gYSBmaWxlLWJhc2VkIGNvbmZpZ3VyYXRpb24gKHdvcmtmbG93LmNvbmZpZy50cyksIHdlIHNob3VsZFxuICogYmUgYWJsZSB0byByZS1jb21iaW5lIGdldFdvcmxkIGFuZCBnZXRXb3JsZEhhbmRsZXJzIGludG8gb25lIHNpbmdsZXRvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldFdvcmxkSGFuZGxlcnMgPSBhc3luYyAoKTogUHJvbWlzZTxXb3JsZEhhbmRsZXJzPiA9PiB7XG4gIGlmIChnbG9iYWxTeW1ib2xzW1N0dWJiZWRXb3JsZENhY2hlXSkge1xuICAgIGFzc2VydFdvcmxkU3VwcG9ydHNSdW50aW1lUHJvdG9jb2woZ2xvYmFsU3ltYm9sc1tTdHViYmVkV29ybGRDYWNoZV0pO1xuICAgIHJldHVybiBnbG9iYWxTeW1ib2xzW1N0dWJiZWRXb3JsZENhY2hlXTtcbiAgfVxuICAvLyBTdG9yZSB0aGUgcHJvbWlzZSBpbW1lZGlhdGVseSB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucyB3aXRoIGNvbmN1cnJlbnQgY2FsbHMuXG4gIC8vIENsZWFyIG9uIHJlamVjdGlvbiBzbyBzdWJzZXF1ZW50IGNhbGxzIGNhbiByZXRyeSBpbnN0ZWFkIG9mIGNhY2hpbmcgdGhlIGZhaWx1cmUuXG4gIGlmICghZ2xvYmFsU3ltYm9sc1tTdHViYmVkV29ybGRDYWNoZVByb21pc2VdKSB7XG4gICAgZ2xvYmFsU3ltYm9sc1tTdHViYmVkV29ybGRDYWNoZVByb21pc2VdID0gY3JlYXRlV29ybGQoKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICBnbG9iYWxTeW1ib2xzW1N0dWJiZWRXb3JsZENhY2hlUHJvbWlzZV0gPSB1bmRlZmluZWQ7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfSk7XG4gIH1cbiAgY29uc3QgX3dvcmxkID0gYXdhaXQgZ2xvYmFsU3ltYm9sc1tTdHViYmVkV29ybGRDYWNoZVByb21pc2VdO1xuICBhc3NlcnRXb3JsZFN1cHBvcnRzUnVudGltZVByb3RvY29sKF93b3JsZCk7XG4gIGdsb2JhbFN5bWJvbHNbU3R1YmJlZFdvcmxkQ2FjaGVdID0gX3dvcmxkO1xuICByZXR1cm4ge1xuICAgIGNyZWF0ZVF1ZXVlSGFuZGxlcjogX3dvcmxkLmNyZWF0ZVF1ZXVlSGFuZGxlcixcbiAgICBzcGVjVmVyc2lvbjogX3dvcmxkLnNwZWNWZXJzaW9uLFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFdvcmxkID0gYXN5bmMgKCk6IFByb21pc2U8V29ybGQ+ID0+IHtcbiAgaWYgKGdsb2JhbFN5bWJvbHNbV29ybGRDYWNoZV0pIHtcbiAgICBhc3NlcnRXb3JsZFN1cHBvcnRzUnVudGltZVByb3RvY29sKGdsb2JhbFN5bWJvbHNbV29ybGRDYWNoZV0pO1xuICAgIHJldHVybiBnbG9iYWxTeW1ib2xzW1dvcmxkQ2FjaGVdO1xuICB9XG4gIC8vIFN0b3JlIHRoZSBwcm9taXNlIGltbWVkaWF0ZWx5IHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zIHdpdGggY29uY3VycmVudCBjYWxscy5cbiAgLy8gQ2xlYXIgb24gcmVqZWN0aW9uIHNvIHN1YnNlcXVlbnQgY2FsbHMgY2FuIHJldHJ5IGluc3RlYWQgb2YgY2FjaGluZyB0aGUgZmFpbHVyZS5cbiAgaWYgKCFnbG9iYWxTeW1ib2xzW1dvcmxkQ2FjaGVQcm9taXNlXSkge1xuICAgIGdsb2JhbFN5bWJvbHNbV29ybGRDYWNoZVByb21pc2VdID0gY3JlYXRlV29ybGQoKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICBnbG9iYWxTeW1ib2xzW1dvcmxkQ2FjaGVQcm9taXNlXSA9IHVuZGVmaW5lZDtcbiAgICAgIHRocm93IGVycjtcbiAgICB9KTtcbiAgfVxuICBnbG9iYWxTeW1ib2xzW1dvcmxkQ2FjaGVdID0gYXdhaXQgZ2xvYmFsU3ltYm9sc1tXb3JsZENhY2hlUHJvbWlzZV07XG4gIGFzc2VydFdvcmxkU3VwcG9ydHNSdW50aW1lUHJvdG9jb2woZ2xvYmFsU3ltYm9sc1tXb3JsZENhY2hlXSk7XG4gIHJldHVybiBnbG9iYWxTeW1ib2xzW1dvcmxkQ2FjaGVdO1xufTtcblxuLyoqXG4gKiBSZXNldCB0aGUgY2FjaGVkIHdvcmxkIGluc3RhbmNlLiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgd2hlbiBlbnZpcm9ubWVudFxuICogdmFyaWFibGVzIGNoYW5nZSBhbmQgeW91IG5lZWQgdG8gcmVpbml0aWFsaXplIHRoZSB3b3JsZCB3aXRoIG5ldyBjb25maWcuXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRXb3JsZCA9ICh3b3JsZDogV29ybGQgfCB1bmRlZmluZWQpOiB2b2lkID0+IHtcbiAgZ2xvYmFsU3ltYm9sc1tXb3JsZENhY2hlXSA9IHdvcmxkO1xuICBnbG9iYWxTeW1ib2xzW1N0dWJiZWRXb3JsZENhY2hlXSA9IHdvcmxkO1xuICBnbG9iYWxTeW1ib2xzW1dvcmxkQ2FjaGVQcm9taXNlXSA9IHVuZGVmaW5lZDtcbiAgZ2xvYmFsU3ltYm9sc1tTdHViYmVkV29ybGRDYWNoZVByb21pc2VdID0gdW5kZWZpbmVkO1xufTtcblxuLy8gUmVnaXN0ZXIgZ2V0V29ybGQgb24gZ2xvYmFsVGhpcyBzbyBnZXRXb3JsZExhenkgY2FuIGNhbGwgaXQgZGlyZWN0bHkgd2hlblxuLy8gd29ybGQudHMgaXMgc3RhdGljYWxseSBwcmVzZW50IGluIHRoZSBidW5kbGUuIFRoaXMgYXZvaWRzIHRoZSByZWxhdGl2ZVxuLy8gZHluYW1pYyBpbXBvcnQoJy4vd29ybGQuanMnKSBmYWxsYmFjayBpbiBnZXQtd29ybGQtbGF6eS50cywgd2hpY2ggZmFpbHNcbi8vIGFmdGVyIE5leHQuanMgaW5saW5lcyBnZXQtd29ybGQtbGF6eS5qcyBpbnRvIGEgcm91dGUgYnVuZGxlIChubyBzaWJsaW5nXG4vLyB3b3JsZC5qcyBleGlzdHMgYXQgdGhlIGJ1bmRsZWQgbG9jYXRpb24pLlxuLy9cbi8vIEZvciBzZXJ2ZXIgcm91dGVzIHRoYXQgb25seSBjb25zdW1lIGBzdGFydGAgKG9yIGFub3RoZXIgaGVscGVyIHRoYXQgZ29lc1xuLy8gdGhyb3VnaCBnZXRXb3JsZExhenkgd2l0aG91dCBzdGF0aWNhbGx5IHVzaW5nIGdldFdvcmxkKSwgd2VicGFjay90dXJib3BhY2tcbi8vIHdvdWxkIG90aGVyd2lzZSB0cmVlLXNoYWtlIHdvcmxkLnRzIG91dCBvZiB0aGUgYnVuZGxlIGVudGlyZWx5LiBUaGVcbi8vIGhvc3Qtb25seSBgLi93b3JsZC1pbml0LnRzYCBtb2R1bGUgaW1wb3J0cyB3b3JsZC50cyBmb3IgaXRzIHNpZGUgZWZmZWN0XG4vLyBhbmQgaXMgaXRzZWxmIGltcG9ydGVkIGJ5IGBwYWNrYWdlcy93b3JrZmxvdy9zcmMvYXBpLnRzYCBzbyB0aGlzXG4vLyByZWdpc3RyYXRpb24gcnVucyBpbiBldmVyeSBzZXJ2ZXIgYnVuZGxlIHRoYXQgdG91Y2hlcyBgd29ya2Zsb3cvYXBpYC5cbi8vXG4vLyBTdGVwL1ZNIGJ1bmRsZXMgbmV2ZXIgcmVhY2ggdGhpcyBicmFuY2g6IHRoZXkgZG9uJ3Qgc3RhdGljYWxseSBpbXBvcnRcbi8vIHdvcmxkLnRzLCBhbmQgYHdvcmxkLWluaXRgIHJlc29sdmVzIHRvIGFuIGVtcHR5IHN0dWIgdmlhIHRoZSBgd29ya2Zsb3dgXG4vLyBleHBvcnQgY29uZGl0aW9uLlxuY29uc3QgR2V0V29ybGRGbktleSA9IFN5bWJvbC5mb3IoJ0B3b3JrZmxvdy93b3JsZC8vZ2V0V29ybGRGbicpO1xuKGdsb2JhbFRoaXMgYXMgeyBbR2V0V29ybGRGbktleV0/OiAoKSA9PiBQcm9taXNlPFdvcmxkPiB9KVtHZXRXb3JsZEZuS2V5XSA/Pz1cbiAgZ2V0V29ybGQ7XG4iXX0=
|