@workflow/next 5.0.0-beta.1 → 5.0.0-beta.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/builder-deferred.d.ts.map +1 -1
- package/dist/builder-deferred.js +292 -498
- package/dist/builder-eager.d.ts.map +1 -1
- package/dist/builder-eager.js +60 -76
- package/dist/builder.d.ts +1 -1
- package/dist/builder.d.ts.map +1 -1
- package/dist/builder.js +4 -4
- package/dist/environment-flag.d.ts +2 -0
- package/dist/environment-flag.d.ts.map +1 -0
- package/dist/environment-flag.js +15 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +285 -11
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +52 -60
- package/dist/runtime.js +1 -1
- package/dist/socket-server.d.ts +20 -0
- package/dist/socket-server.d.ts.map +1 -1
- package/dist/socket-server.js +29 -2
- package/docs/api-reference/with-workflow.mdx +34 -2
- package/docs/next.mdx +5 -3
- package/package.json +4 -5
- package/dist/builder-deferred.js.map +0 -1
- package/dist/builder-eager.js.map +0 -1
- package/dist/builder.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/loader.js.map +0 -1
- package/dist/runtime.js.map +0 -1
- package/dist/socket-server.js.map +0 -1
- package/dist/step-copy-utils.d.ts +0 -19
- package/dist/step-copy-utils.d.ts.map +0 -1
- package/dist/step-copy-utils.js +0 -101
- package/dist/step-copy-utils.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -4,26 +4,248 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.withWorkflow = withWorkflow;
|
|
7
|
+
const node_fs_1 = require("node:fs");
|
|
8
|
+
const promises_1 = require("node:fs/promises");
|
|
9
|
+
const node_path_1 = require("node:path");
|
|
7
10
|
const semver_1 = __importDefault(require("semver"));
|
|
8
11
|
const builder_js_1 = require("./builder.js");
|
|
12
|
+
const environment_flag_js_1 = require("./environment-flag.js");
|
|
13
|
+
const VERCEL_WORLD_PACKAGE = '@workflow/world-vercel';
|
|
14
|
+
const VERCEL_WORLD_DEPENDENCY_PACKAGES = [
|
|
15
|
+
'@vercel/queue',
|
|
16
|
+
'@vercel/oidc',
|
|
17
|
+
'@vercel/cli-auth',
|
|
18
|
+
'@napi-rs/keyring',
|
|
19
|
+
];
|
|
20
|
+
const VERCEL_WORLD_SERVER_EXTERNAL_PACKAGES = [
|
|
21
|
+
VERCEL_WORLD_PACKAGE,
|
|
22
|
+
...VERCEL_WORLD_DEPENDENCY_PACKAGES,
|
|
23
|
+
];
|
|
24
|
+
const useWorkflowPattern = /^\s*(['"])use workflow\1;?\s*$/m;
|
|
25
|
+
const useStepPattern = /^\s*(['"])use step\1;?\s*$/m;
|
|
26
|
+
const workflowSerdeImportPattern = /from\s+(['"])@workflow\/serde\1/;
|
|
27
|
+
const workflowSerdeSymbolPattern = /Symbol\.for\s*\(\s*(['"])workflow-(?:serialize|deserialize)\1\s*\)/;
|
|
28
|
+
const workflowSerdeComputedPropertyPattern = /\[\s*WORKFLOW_(?:SERIALIZE|DESERIALIZE)\s*\]/;
|
|
29
|
+
const PSEUDO_EXTERNAL_PACKAGES = new Set(['server-only', 'client-only']);
|
|
30
|
+
const warnedAutoRemovedServerExternalPackages = new Set();
|
|
31
|
+
function isPlainObject(value) {
|
|
32
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
33
|
+
}
|
|
34
|
+
function isResolvablePackageSpecifier(specifier) {
|
|
35
|
+
if (specifier.startsWith('.') || specifier.startsWith('/')) {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
if (specifier.startsWith('$')) {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
if (specifier.includes('*') || specifier.includes(':')) {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
function detectWorkflowPatterns(source) {
|
|
47
|
+
const hasUseWorkflow = useWorkflowPattern.test(source);
|
|
48
|
+
const hasUseStep = useStepPattern.test(source);
|
|
49
|
+
const hasSerdeImport = workflowSerdeImportPattern.test(source);
|
|
50
|
+
const hasSerdeSymbol = workflowSerdeSymbolPattern.test(source);
|
|
51
|
+
const hasSerdeComputedProperty = workflowSerdeComputedPropertyPattern.test(source);
|
|
52
|
+
return {
|
|
53
|
+
hasUseWorkflow,
|
|
54
|
+
hasUseStep,
|
|
55
|
+
hasSerde: hasSerdeImport || hasSerdeSymbol || hasSerdeComputedProperty,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function getIssueLabels(detected) {
|
|
59
|
+
const issues = [];
|
|
60
|
+
if (detected.hasUseWorkflow) {
|
|
61
|
+
issues.push('"use workflow" functions');
|
|
62
|
+
}
|
|
63
|
+
if (detected.hasUseStep) {
|
|
64
|
+
issues.push('"use step" functions');
|
|
65
|
+
}
|
|
66
|
+
if (detected.hasSerde) {
|
|
67
|
+
issues.push('serialization classes');
|
|
68
|
+
}
|
|
69
|
+
return issues;
|
|
70
|
+
}
|
|
71
|
+
function hasWorkflowSerdeDependency(packageJson) {
|
|
72
|
+
if (!isPlainObject(packageJson)) {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
const dependencies = isPlainObject(packageJson.dependencies)
|
|
76
|
+
? packageJson.dependencies
|
|
77
|
+
: {};
|
|
78
|
+
const peerDependencies = isPlainObject(packageJson.peerDependencies)
|
|
79
|
+
? packageJson.peerDependencies
|
|
80
|
+
: {};
|
|
81
|
+
return (Object.hasOwn(dependencies, '@workflow/serde') ||
|
|
82
|
+
Object.hasOwn(peerDependencies, '@workflow/serde'));
|
|
83
|
+
}
|
|
84
|
+
async function detectServerExternalPackage(packageName, workingDir) {
|
|
85
|
+
if (!isResolvablePackageSpecifier(packageName)) {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
let hasUseWorkflow = false;
|
|
89
|
+
let hasUseStep = false;
|
|
90
|
+
let hasSerde = false;
|
|
91
|
+
try {
|
|
92
|
+
const packageJsonPath = require.resolve(`${packageName}/package.json`, {
|
|
93
|
+
paths: [workingDir],
|
|
94
|
+
});
|
|
95
|
+
const packageJsonSource = await (0, promises_1.readFile)(packageJsonPath, 'utf-8');
|
|
96
|
+
const packageJson = JSON.parse(packageJsonSource);
|
|
97
|
+
hasSerde = hasWorkflowSerdeDependency(packageJson);
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
// Best-effort only. Continue to source scanning.
|
|
101
|
+
}
|
|
102
|
+
try {
|
|
103
|
+
const entryPath = require.resolve(packageName, {
|
|
104
|
+
paths: [workingDir],
|
|
105
|
+
});
|
|
106
|
+
const source = await (0, promises_1.readFile)(entryPath, 'utf-8');
|
|
107
|
+
const patterns = detectWorkflowPatterns(source);
|
|
108
|
+
hasUseWorkflow = patterns.hasUseWorkflow;
|
|
109
|
+
hasUseStep = patterns.hasUseStep;
|
|
110
|
+
hasSerde ||= patterns.hasSerde;
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
// Best-effort only. Use whichever signal we already have.
|
|
114
|
+
}
|
|
115
|
+
if (!hasUseWorkflow && !hasUseStep && !hasSerde) {
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
packageName,
|
|
120
|
+
hasUseWorkflow,
|
|
121
|
+
hasUseStep,
|
|
122
|
+
hasSerde,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
function warnAboutAutoRemovedServerExternalPackages(detectedPackages) {
|
|
126
|
+
const newlyDetectedPackages = detectedPackages.filter(({ packageName }) => {
|
|
127
|
+
return !warnedAutoRemovedServerExternalPackages.has(packageName);
|
|
128
|
+
});
|
|
129
|
+
if (newlyDetectedPackages.length === 0) {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
for (const { packageName } of newlyDetectedPackages) {
|
|
133
|
+
warnedAutoRemovedServerExternalPackages.add(packageName);
|
|
134
|
+
}
|
|
135
|
+
const packageDescriptions = newlyDetectedPackages
|
|
136
|
+
.map((detected) => `"${detected.packageName}" (${getIssueLabels(detected).join(', ')})`)
|
|
137
|
+
.join(', ');
|
|
138
|
+
const packageNames = newlyDetectedPackages
|
|
139
|
+
.map((detected) => `"${detected.packageName}"`)
|
|
140
|
+
.join(', ');
|
|
141
|
+
console.warn(`\n⚠ Workflow removed ${packageDescriptions} from serverExternalPackages for this build.` +
|
|
142
|
+
`\n These packages contain workflow code and must be transformed by the workflow compiler.` +
|
|
143
|
+
`\n Remove ${packageNames} from serverExternalPackages in next.config to silence this warning.\n`);
|
|
144
|
+
}
|
|
9
145
|
function resolveNextVersion(workingDir) {
|
|
10
|
-
const
|
|
146
|
+
const errors = [];
|
|
147
|
+
// Try resolving from the consuming project's working directory first.
|
|
148
|
+
// This handles monorepo setups where `next` may not be hoisted to the
|
|
149
|
+
// same location as `@workflow/next`.
|
|
11
150
|
try {
|
|
12
151
|
const packageJsonPath = require.resolve('next/package.json', {
|
|
13
152
|
paths: [workingDir],
|
|
14
153
|
});
|
|
15
154
|
const resolvedPackageJson = require(packageJsonPath);
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
155
|
+
if (typeof resolvedPackageJson.version === 'string') {
|
|
156
|
+
return resolvedPackageJson.version;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
catch (e) {
|
|
160
|
+
errors.push(e);
|
|
161
|
+
}
|
|
162
|
+
// Fall back to resolving relative to this package's location.
|
|
163
|
+
try {
|
|
164
|
+
const version = require('next/package.json')
|
|
165
|
+
.version;
|
|
166
|
+
if (typeof version === 'string') {
|
|
167
|
+
return version;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
catch (e) {
|
|
171
|
+
errors.push(e);
|
|
172
|
+
}
|
|
173
|
+
throw new AggregateError(errors, `Could not resolve Next.js version. Ensure \`next\` is installed in your project (working directory: ${workingDir}).`);
|
|
174
|
+
}
|
|
175
|
+
function fileExists(path) {
|
|
176
|
+
try {
|
|
177
|
+
const stats = (0, node_fs_1.statSync)(path);
|
|
178
|
+
return stats.isFile();
|
|
19
179
|
}
|
|
20
180
|
catch {
|
|
21
|
-
return
|
|
181
|
+
return false;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
function getWorkflowManifestCopyPaths({ projectDir, distDir, }) {
|
|
185
|
+
const manifestCandidates = [
|
|
186
|
+
(0, node_path_1.join)(projectDir, 'app/.well-known/workflow/v1/manifest.json'),
|
|
187
|
+
(0, node_path_1.join)(projectDir, 'src/app/.well-known/workflow/v1/manifest.json'),
|
|
188
|
+
(0, node_path_1.join)(projectDir, 'public/.well-known/workflow/v1/manifest.json'),
|
|
189
|
+
];
|
|
190
|
+
const manifestPath = manifestCandidates.find(fileExists);
|
|
191
|
+
if (!manifestPath) {
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
const resolvedDistDir = (0, node_path_1.isAbsolute)(distDir)
|
|
195
|
+
? distDir
|
|
196
|
+
: (0, node_path_1.join)(projectDir, distDir);
|
|
197
|
+
const diagnosticsManifestPath = (0, node_path_1.join)(resolvedDistDir, 'diagnostics', 'workflows-manifest.json');
|
|
198
|
+
return { manifestPath, diagnosticsManifestPath };
|
|
199
|
+
}
|
|
200
|
+
async function copyWorkflowDiagnosticsManifest(metadata) {
|
|
201
|
+
const paths = getWorkflowManifestCopyPaths(metadata);
|
|
202
|
+
if (!paths) {
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
const { manifestPath, diagnosticsManifestPath } = paths;
|
|
206
|
+
await (0, promises_1.mkdir)((0, node_path_1.dirname)(diagnosticsManifestPath), { recursive: true });
|
|
207
|
+
await (0, promises_1.copyFile)(manifestPath, diagnosticsManifestPath);
|
|
208
|
+
}
|
|
209
|
+
function copyWorkflowDiagnosticsManifestSync(metadata) {
|
|
210
|
+
const paths = getWorkflowManifestCopyPaths(metadata);
|
|
211
|
+
if (!paths) {
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
const { manifestPath, diagnosticsManifestPath } = paths;
|
|
215
|
+
(0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(diagnosticsManifestPath), { recursive: true });
|
|
216
|
+
(0, node_fs_1.copyFileSync)(manifestPath, diagnosticsManifestPath);
|
|
217
|
+
}
|
|
218
|
+
function registerWorkflowDiagnosticsManifestCopy(metadata) {
|
|
219
|
+
const marker = '__workflowDiagnosticsManifestCopies';
|
|
220
|
+
const globalWithMarker = globalThis;
|
|
221
|
+
if (!globalWithMarker[marker]) {
|
|
222
|
+
globalWithMarker[marker] = [];
|
|
223
|
+
process.once('exit', () => {
|
|
224
|
+
for (const copyMetadata of globalWithMarker[marker] || []) {
|
|
225
|
+
copyWorkflowDiagnosticsManifestSync(copyMetadata);
|
|
226
|
+
}
|
|
227
|
+
});
|
|
22
228
|
}
|
|
229
|
+
globalWithMarker[marker].push(metadata);
|
|
23
230
|
}
|
|
24
231
|
function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
|
|
25
|
-
|
|
26
|
-
|
|
232
|
+
// lazyDiscovery defaults to true; pass `lazyDiscovery: false` to force eager
|
|
233
|
+
// discovery (scanning the project at startup) instead of deferring workflow
|
|
234
|
+
// discovery until files are requested. The `WORKFLOW_NEXT_LAZY_DISCOVERY`
|
|
235
|
+
// environment variable, if set, takes precedence over the option.
|
|
236
|
+
const lazyDiscoveryOverride = (0, environment_flag_js_1.parseEnvironmentFlag)(process.env.WORKFLOW_NEXT_LAZY_DISCOVERY);
|
|
237
|
+
if (lazyDiscoveryOverride === undefined) {
|
|
238
|
+
if (workflows?.lazyDiscovery === false) {
|
|
239
|
+
delete process.env.WORKFLOW_NEXT_LAZY_DISCOVERY;
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
process.env.WORKFLOW_NEXT_LAZY_DISCOVERY = '1';
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
process.env.WORKFLOW_NEXT_LAZY_DISCOVERY = lazyDiscoveryOverride
|
|
247
|
+
? '1'
|
|
248
|
+
: '0';
|
|
27
249
|
}
|
|
28
250
|
if (!process.env.VERCEL_DEPLOYMENT_ID) {
|
|
29
251
|
if (!process.env.WORKFLOW_TARGET_WORLD) {
|
|
@@ -52,6 +274,45 @@ function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
|
|
|
52
274
|
}
|
|
53
275
|
// shallow clone to avoid read-only on top-level
|
|
54
276
|
nextConfig = Object.assign({}, nextConfig);
|
|
277
|
+
nextConfig.serverExternalPackages = [
|
|
278
|
+
...new Set([
|
|
279
|
+
...(nextConfig.serverExternalPackages || []),
|
|
280
|
+
// Keep the Vercel world and its native-prone dependencies external so
|
|
281
|
+
// local builds do not try to parse @vercel/queue's keyring dependency
|
|
282
|
+
// tree.
|
|
283
|
+
...VERCEL_WORLD_SERVER_EXTERNAL_PACKAGES,
|
|
284
|
+
]),
|
|
285
|
+
];
|
|
286
|
+
const existingCompiler = nextConfig.compiler ?? {};
|
|
287
|
+
const existingRunAfterProductionCompile = existingCompiler.runAfterProductionCompile;
|
|
288
|
+
const configuredServerExternalPackages = Array.isArray(nextConfig.serverExternalPackages)
|
|
289
|
+
? nextConfig.serverExternalPackages
|
|
290
|
+
: [];
|
|
291
|
+
let effectiveServerExternalPackages = configuredServerExternalPackages;
|
|
292
|
+
if (configuredServerExternalPackages.length > 0) {
|
|
293
|
+
const detectedWorkflowPackages = [];
|
|
294
|
+
for (const packageName of configuredServerExternalPackages) {
|
|
295
|
+
if (PSEUDO_EXTERNAL_PACKAGES.has(packageName)) {
|
|
296
|
+
continue;
|
|
297
|
+
}
|
|
298
|
+
try {
|
|
299
|
+
const detected = await detectServerExternalPackage(packageName, process.cwd());
|
|
300
|
+
if (detected) {
|
|
301
|
+
detectedWorkflowPackages.push(detected);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
catch {
|
|
305
|
+
// Best-effort only. Never block config generation.
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
if (detectedWorkflowPackages.length > 0) {
|
|
309
|
+
const removedPackages = new Set(detectedWorkflowPackages.map((detected) => detected.packageName));
|
|
310
|
+
effectiveServerExternalPackages =
|
|
311
|
+
configuredServerExternalPackages.filter((packageName) => !removedPackages.has(packageName));
|
|
312
|
+
nextConfig.serverExternalPackages = effectiveServerExternalPackages;
|
|
313
|
+
warnAboutAutoRemovedServerExternalPackages(detectedWorkflowPackages);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
55
316
|
// configure the loader if turbopack is being used
|
|
56
317
|
if (!nextConfig.turbopack) {
|
|
57
318
|
nextConfig.turbopack = {};
|
|
@@ -68,6 +329,17 @@ function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
|
|
|
68
329
|
const shouldApplyTurboCondition = supportsTurboCondition && !useDeferredBuilder;
|
|
69
330
|
const shouldWatch = process.env.NODE_ENV === 'development';
|
|
70
331
|
let workflowBuilderPromise;
|
|
332
|
+
const distDir = nextConfig.distDir || '.next';
|
|
333
|
+
nextConfig.compiler = {
|
|
334
|
+
...existingCompiler,
|
|
335
|
+
runAfterProductionCompile: async (metadata) => {
|
|
336
|
+
if (existingRunAfterProductionCompile) {
|
|
337
|
+
await existingRunAfterProductionCompile(metadata);
|
|
338
|
+
}
|
|
339
|
+
await copyWorkflowDiagnosticsManifest(metadata);
|
|
340
|
+
registerWorkflowDiagnosticsManifestCopy(metadata);
|
|
341
|
+
},
|
|
342
|
+
};
|
|
71
343
|
const getWorkflowBuilder = async () => {
|
|
72
344
|
if (!workflowBuilderPromise) {
|
|
73
345
|
workflowBuilderPromise = (async () => {
|
|
@@ -78,11 +350,13 @@ function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
|
|
|
78
350
|
dirs: ['pages', 'app', 'src/pages', 'src/app'],
|
|
79
351
|
projectRoot: nextConfig.outputFileTracingRoot,
|
|
80
352
|
workingDir: process.cwd(),
|
|
81
|
-
distDir
|
|
353
|
+
distDir,
|
|
354
|
+
diagnosticsDir: `${distDir}/diagnostics`,
|
|
82
355
|
buildTarget: 'next',
|
|
83
356
|
workflowsBundlePath: '', // not used in base
|
|
84
357
|
stepsBundlePath: '', // not used in base
|
|
85
358
|
webhookBundlePath: '', // node used in base
|
|
359
|
+
sourcemap: workflows?.sourcemap,
|
|
86
360
|
suppressCreateWorkflowsBundleLogs: useDeferredBuilder,
|
|
87
361
|
suppressCreateWorkflowsBundleWarnings: useDeferredBuilder,
|
|
88
362
|
suppressCreateWebhookBundleLogs: useDeferredBuilder,
|
|
@@ -94,7 +368,7 @@ function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
|
|
|
94
368
|
// See: https://nextjs.org/docs/app/getting-started/server-and-client-components
|
|
95
369
|
'server-only',
|
|
96
370
|
'client-only',
|
|
97
|
-
...
|
|
371
|
+
...effectiveServerExternalPackages,
|
|
98
372
|
],
|
|
99
373
|
});
|
|
100
374
|
})();
|
|
@@ -184,7 +458,7 @@ function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
|
|
|
184
458
|
loader: loaderPath,
|
|
185
459
|
});
|
|
186
460
|
return existingWebpackModify
|
|
187
|
-
? existingWebpackModify(...args)
|
|
461
|
+
? (existingWebpackModify(...args) ?? webpackConfig)
|
|
188
462
|
: webpackConfig;
|
|
189
463
|
};
|
|
190
464
|
// only run this in the main process so it only runs once
|
|
@@ -198,4 +472,4 @@ function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
|
|
|
198
472
|
return nextConfig;
|
|
199
473
|
};
|
|
200
474
|
}
|
|
201
|
-
//# sourceMappingURL=index.js.map
|
|
475
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUE2VEEsb0NBNFRDO0FBem5CRCxxQ0FBNEQ7QUFDNUQsK0NBQTZEO0FBQzdELHlDQUFzRDtBQUV0RCxvREFBNEI7QUFDNUIsNkNBSXNCO0FBQ3RCLCtEQUE2RDtBQUU3RCxNQUFNLG9CQUFvQixHQUFHLHdCQUF3QixDQUFDO0FBQ3RELE1BQU0sZ0NBQWdDLEdBQUc7SUFDdkMsZUFBZTtJQUNmLGNBQWM7SUFDZCxrQkFBa0I7SUFDbEIsa0JBQWtCO0NBQ25CLENBQUM7QUFDRixNQUFNLHFDQUFxQyxHQUFHO0lBQzVDLG9CQUFvQjtJQUNwQixHQUFHLGdDQUFnQztDQUNwQyxDQUFDO0FBRUYsTUFBTSxrQkFBa0IsR0FBRyxpQ0FBaUMsQ0FBQztBQUM3RCxNQUFNLGNBQWMsR0FBRyw2QkFBNkIsQ0FBQztBQUNyRCxNQUFNLDBCQUEwQixHQUFHLGlDQUFpQyxDQUFDO0FBQ3JFLE1BQU0sMEJBQTBCLEdBQzlCLG9FQUFvRSxDQUFDO0FBQ3ZFLE1BQU0sb0NBQW9DLEdBQ3hDLDhDQUE4QyxDQUFDO0FBRWpELE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztBQUN6RSxNQUFNLHVDQUF1QyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7QUFlbEUsU0FBUyxhQUFhLENBQUMsS0FBYztJQUNuQyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM5RSxDQUFDO0FBRUQsU0FBUyw0QkFBNEIsQ0FBQyxTQUFpQjtJQUNyRCxJQUFJLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENB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QUNwQixDQUFDLENBQUM7UUFDRix5REFBeUQ7UUFDekQsdURBQXVEO1FBQ3ZELElBQ0UsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLDJCQUEyQjtZQUN4QyxLQUFLLEtBQUsseUJBQXlCLEVBQ25DLENBQUM7WUFDRCxNQUFNLGVBQWUsR0FBRyxNQUFNLGtCQUFrQixFQUFFLENBQUM7WUFFbkQsTUFBTSxlQUFlLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDOUIsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsR0FBRyxHQUFHLENBQUM7UUFDaEQsQ0FBQztRQUVELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb3B5RmlsZVN5bmMsIG1rZGlyU3luYywgc3RhdFN5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IGNvcHlGaWxlLCBta2RpciwgcmVhZEZpbGUgfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IGRpcm5hbWUsIGlzQWJzb2x1dGUsIGpvaW4gfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHR5cGUgeyBOZXh0Q29uZmlnIH0gZnJvbSAnbmV4dCc7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5pbXBvcnQge1xuICBnZXROZXh0QnVpbGRlcixcbiAgc2hvdWxkVXNlRGVmZXJyZWRCdWlsZGVyLFxuICBXT1JLRkxPV19ERUZFUlJFRF9FTlRSSUVTLFxufSBmcm9tICcuL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VFbnZpcm9ubWVudEZsYWcgfSBmcm9tICcuL2Vudmlyb25tZW50LWZsYWcuanMnO1xuXG5jb25zdCBWRVJDRUxfV09STERfUEFDS0FHRSA9ICdAd29ya2Zsb3cvd29ybGQtdmVyY2VsJztcbmNvbnN0IFZFUkNFTF9XT1JMRF9ERVBFTkRFTkNZX1BBQ0tBR0VTID0gW1xuICAnQHZlcmNlbC9xdWV1ZScsXG4gICdAdmVyY2VsL29pZGMnLFxuICAnQHZlcmNlbC9jbGktYXV0aCcsXG4gICdAbmFwaS1ycy9rZXlyaW5nJyxcbl07XG5jb25zdCBWRVJDRUxfV09STERfU0VSVkVSX0VYVEVSTkFMX1BBQ0tBR0VTID0gW1xuICBWRVJDRUxfV09STERfUEFDS0FHRSxcbiAgLi4uVkVSQ0VMX1dPUkxEX0RFUEVOREVOQ1lfUEFDS0FHRVMsXG5dO1xuXG5jb25zdCB1c2VXb3JrZmxvd1BhdHRlcm4gPSAvXlxccyooWydcIl0pdXNlIHdvcmtmbG93XFwxOz9cXHMqJC9tO1xuY29uc3QgdXNlU3RlcFBhdHRlcm4gPSAvXlxccyooWydcIl0pdXNlIHN0ZXBcXDE7P1xccyokL207XG5jb25zdCB3b3JrZmxvd1NlcmRlSW1wb3J0UGF0dGVybiA9IC9mcm9tXFxzKyhbJ1wiXSlAd29ya2Zsb3dcXC9zZXJkZVxcMS87XG5jb25zdCB3b3JrZmxvd1NlcmRlU3ltYm9sUGF0dGVybiA9XG4gIC9TeW1ib2xcXC5mb3JcXHMqXFwoXFxzKihbJ1wiXSl3b3JrZmxvdy0oPzpzZXJpYWxpemV8ZGVzZXJpYWxpemUpXFwxXFxzKlxcKS87XG5jb25zdCB3b3JrZmxvd1NlcmRlQ29tcHV0ZWRQcm9wZXJ0eVBhdHRlcm4gPVxuICAvXFxbXFxzKldPUktGTE9XXyg/OlNFUklBTElaRXxERVNFUklBTElaRSlcXHMqXFxdLztcblxuY29uc3QgUFNFVURPX0VYVEVSTkFMX1BBQ0tBR0VTID0gbmV3IFNldChbJ3NlcnZlci1vbmx5JywgJ2NsaWVudC1vbmx5J10pO1xuY29uc3Qgd2FybmVkQXV0b1JlbW92ZWRTZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbmludGVyZmFjZSBXb3JrZmxvd1BhdHRlcm5NYXRjaCB7XG4gIGhhc1VzZVdvcmtmbG93OiBib29sZWFuO1xuICBoYXNVc2VTdGVwOiBib29sZWFuO1xuICBoYXNTZXJkZTogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIERldGVjdGVkU2VydmVyRXh0ZXJuYWxQYWNrYWdlIHtcbiAgcGFja2FnZU5hbWU6IHN0cmluZztcbiAgaGFzVXNlV29ya2Zsb3c6IGJvb2xlYW47XG4gIGhhc1VzZVN0ZXA6IGJvb2xlYW47XG4gIGhhc1NlcmRlOiBib29sZWFuO1xufVxuXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIGlzUmVzb2x2YWJsZVBhY2thZ2VTcGVjaWZpZXIoc3BlY2lmaWVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKHNwZWNpZmllci5zdGFydHNXaXRoKCcuJykgfHwgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJyQnKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoc3BlY2lmaWVyLmluY2x1ZGVzKCcqJykgfHwgc3BlY2lmaWVyLmluY2x1ZGVzKCc6JykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gZGV0ZWN0V29ya2Zsb3dQYXR0ZXJucyhzb3VyY2U6IHN0cmluZyk6IFdvcmtmbG93UGF0dGVybk1hdGNoIHtcbiAgY29uc3QgaGFzVXNlV29ya2Zsb3cgPSB1c2VXb3JrZmxvd1BhdHRlcm4udGVzdChzb3VyY2UpO1xuICBjb25zdCBoYXNVc2VTdGVwID0gdXNlU3RlcFBhdHRlcm4udGVzdChzb3VyY2UpO1xuICBjb25zdCBoYXNTZXJkZUltcG9ydCA9IHdvcmtmbG93U2VyZGVJbXBvcnRQYXR0ZXJuLnRlc3Qoc291cmNlKTtcbiAgY29uc3QgaGFzU2VyZGVTeW1ib2wgPSB3b3JrZmxvd1NlcmRlU3ltYm9sUGF0dGVybi50ZXN0KHNvdXJjZSk7XG4gIGNvbnN0IGhhc1NlcmRlQ29tcHV0ZWRQcm9wZXJ0eSA9XG4gICAgd29ya2Zsb3dTZXJkZUNvbXB1dGVkUHJvcGVydHlQYXR0ZXJuLnRlc3Qoc291cmNlKTtcblxuICByZXR1cm4ge1xuICAgIGhhc1VzZVdvcmtmbG93LFxuICAgIGhhc1VzZVN0ZXAsXG4gICAgaGFzU2VyZGU6IGhhc1NlcmRlSW1wb3J0IHx8IGhhc1NlcmRlU3ltYm9sIHx8IGhhc1NlcmRlQ29tcHV0ZWRQcm9wZXJ0eSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0SXNzdWVMYWJlbHMoZGV0ZWN0ZWQ6IERldGVjdGVkU2VydmVyRXh0ZXJuYWxQYWNrYWdlKTogc3RyaW5nW10ge1xuICBjb25zdCBpc3N1ZXM6IHN0cmluZ1tdID0gW107XG4gIGlmIChkZXRlY3RlZC5oYXNVc2VXb3JrZmxvdykge1xuICAgIGlzc3Vlcy5wdXNoKCdcInVzZSB3b3JrZmxvd1wiIGZ1bmN0aW9ucycpO1xuICB9XG4gIGlmIChkZXRlY3RlZC5oYXNVc2VTdGVwKSB7XG4gICAgaXNzdWVzLnB1c2goJ1widXNlIHN0ZXBcIiBmdW5jdGlvbnMnKTtcbiAgfVxuICBpZiAoZGV0ZWN0ZWQuaGFzU2VyZGUpIHtcbiAgICBpc3N1ZXMucHVzaCgnc2VyaWFsaXphdGlvbiBjbGFzc2VzJyk7XG4gIH1cbiAgcmV0dXJuIGlzc3Vlcztcbn1cblxuZnVuY3Rpb24gaGFzV29ya2Zsb3dTZXJkZURlcGVuZGVuY3kocGFja2FnZUpzb246IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKCFpc1BsYWluT2JqZWN0KHBhY2thZ2VKc29uKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IGlzUGxhaW5PYmplY3QocGFja2FnZUpzb24uZGVwZW5kZW5jaWVzKVxuICAgID8gcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzXG4gICAgOiB7fTtcbiAgY29uc3QgcGVlckRlcGVuZGVuY2llcyA9IGlzUGxhaW5PYmplY3QocGFja2FnZUpzb24ucGVlckRlcGVuZGVuY2llcylcbiAgICA/IHBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXNcbiAgICA6IHt9O1xuXG4gIHJldHVybiAoXG4gICAgT2JqZWN0Lmhhc093bihkZXBlbmRlbmNpZXMsICdAd29ya2Zsb3cvc2VyZGUnKSB8fFxuICAgIE9iamVjdC5oYXNPd24ocGVlckRlcGVuZGVuY2llcywgJ0B3b3JrZmxvdy9zZXJkZScpXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRldGVjdFNlcnZlckV4dGVybmFsUGFja2FnZShcbiAgcGFja2FnZU5hbWU6IHN0cmluZyxcbiAgd29ya2luZ0Rpcjogc3RyaW5nXG4pOiBQcm9taXNlPERldGVjdGVkU2VydmVyRXh0ZXJuYWxQYWNrYWdlIHwgbnVsbD4ge1xuICBpZiAoIWlzUmVzb2x2YWJsZVBhY2thZ2VTcGVjaWZpZXIocGFja2FnZU5hbWUpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBsZXQgaGFzVXNlV29ya2Zsb3cgPSBmYWxzZTtcbiAgbGV0IGhhc1VzZVN0ZXAgPSBmYWxzZTtcbiAgbGV0IGhhc1NlcmRlID0gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSByZXF1aXJlLnJlc29sdmUoYCR7cGFja2FnZU5hbWV9L3BhY2thZ2UuanNvbmAsIHtcbiAgICAgIHBhdGhzOiBbd29ya2luZ0Rpcl0sXG4gICAgfSk7XG4gICAgY29uc3QgcGFja2FnZUpzb25Tb3VyY2UgPSBhd2FpdCByZWFkRmlsZShwYWNrYWdlSnNvblBhdGgsICd1dGYtOCcpO1xuICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShwYWNrYWdlSnNvblNvdXJjZSkgYXMgdW5rbm93bjtcbiAgICBoYXNTZXJkZSA9IGhhc1dvcmtmbG93U2VyZGVEZXBlbmRlbmN5KHBhY2thZ2VKc29uKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gQmVzdC1lZmZvcnQgb25seS4gQ29udGludWUgdG8gc291cmNlIHNjYW5uaW5nLlxuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBlbnRyeVBhdGggPSByZXF1aXJlLnJlc29sdmUocGFja2FnZU5hbWUsIHtcbiAgICAgIHBhdGhzOiBbd29ya2luZ0Rpcl0sXG4gICAgfSk7XG4gICAgY29uc3Qgc291cmNlID0gYXdhaXQgcmVhZEZpbGUoZW50cnlQYXRoLCAndXRmLTgnKTtcbiAgICBjb25zdCBwYXR0ZXJucyA9IGRldGVjdFdvcmtmbG93UGF0dGVybnMoc291cmNlKTtcbiAgICBoYXNVc2VXb3JrZmxvdyA9IHBhdHRlcm5zLmhhc1VzZVdvcmtmbG93O1xuICAgIGhhc1VzZVN0ZXAgPSBwYXR0ZXJucy5oYXNVc2VTdGVwO1xuICAgIGhhc1NlcmRlIHx8PSBwYXR0ZXJucy5oYXNTZXJkZTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gQmVzdC1lZmZvcnQgb25seS4gVXNlIHdoaWNoZXZlciBzaWduYWwgd2UgYWxyZWFkeSBoYXZlLlxuICB9XG5cbiAgaWYgKCFoYXNVc2VXb3JrZmxvdyAmJiAhaGFzVXNlU3RlcCAmJiAhaGFzU2VyZGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcGFja2FnZU5hbWUsXG4gICAgaGFzVXNlV29ya2Zsb3csXG4gICAgaGFzVXNlU3RlcCxcbiAgICBoYXNTZXJkZSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gd2FybkFib3V0QXV0b1JlbW92ZWRTZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzKFxuICBkZXRlY3RlZFBhY2thZ2VzOiBEZXRlY3RlZFNlcnZlckV4dGVybmFsUGFja2FnZVtdXG4pOiB2b2lkIHtcbiAgY29uc3QgbmV3bHlEZXRlY3RlZFBhY2thZ2VzID0gZGV0ZWN0ZWRQYWNrYWdlcy5maWx0ZXIoKHsgcGFja2FnZU5hbWUgfSkgPT4ge1xuICAgIHJldHVybiAhd2FybmVkQXV0b1JlbW92ZWRTZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzLmhhcyhwYWNrYWdlTmFtZSk7XG4gIH0pO1xuXG4gIGlmIChuZXdseURldGVjdGVkUGFja2FnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZm9yIChjb25zdCB7IHBhY2thZ2VOYW1lIH0gb2YgbmV3bHlEZXRlY3RlZFBhY2thZ2VzKSB7XG4gICAgd2FybmVkQXV0b1JlbW92ZWRTZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzLmFkZChwYWNrYWdlTmFtZSk7XG4gIH1cblxuICBjb25zdCBwYWNrYWdlRGVzY3JpcHRpb25zID0gbmV3bHlEZXRlY3RlZFBhY2thZ2VzXG4gICAgLm1hcChcbiAgICAgIChkZXRlY3RlZCkgPT5cbiAgICAgICAgYFwiJHtkZXRlY3RlZC5wYWNrYWdlTmFtZX1cIiAoJHtnZXRJc3N1ZUxhYmVscyhkZXRlY3RlZCkuam9pbignLCAnKX0pYFxuICAgIClcbiAgICAuam9pbignLCAnKTtcbiAgY29uc3QgcGFja2FnZU5hbWVzID0gbmV3bHlEZXRlY3RlZFBhY2thZ2VzXG4gICAgLm1hcCgoZGV0ZWN0ZWQpID0+IGBcIiR7ZGV0ZWN0ZWQucGFja2FnZU5hbWV9XCJgKVxuICAgIC5qb2luKCcsICcpO1xuXG4gIGNvbnNvbGUud2FybihcbiAgICBgXFxu4pqgIFdvcmtmbG93IHJlbW92ZWQgJHtwYWNrYWdlRGVzY3JpcHRpb25zfSBmcm9tIHNlcnZlckV4dGVybmFsUGFja2FnZXMgZm9yIHRoaXMgYnVpbGQuYCArXG4gICAgICBgXFxuICBUaGVzZSBwYWNrYWdlcyBjb250YWluIHdvcmtmbG93IGNvZGUgYW5kIG11c3QgYmUgdHJhbnNmb3JtZWQgYnkgdGhlIHdvcmtmbG93IGNvbXBpbGVyLmAgK1xuICAgICAgYFxcbiAgUmVtb3ZlICR7cGFja2FnZU5hbWVzfSBmcm9tIHNlcnZlckV4dGVybmFsUGFja2FnZXMgaW4gbmV4dC5jb25maWcgdG8gc2lsZW5jZSB0aGlzIHdhcm5pbmcuXFxuYFxuICApO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlTmV4dFZlcnNpb24od29ya2luZ0Rpcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZXJyb3JzOiB1bmtub3duW10gPSBbXTtcblxuICAvLyBUcnkgcmVzb2x2aW5nIGZyb20gdGhlIGNvbnN1bWluZyBwcm9qZWN0J3Mgd29ya2luZyBkaXJlY3RvcnkgZmlyc3QuXG4gIC8vIFRoaXMgaGFuZGxlcyBtb25vcmVwbyBzZXR1cHMgd2hlcmUgYG5leHRgIG1heSBub3QgYmUgaG9pc3RlZCB0byB0aGVcbiAgLy8gc2FtZSBsb2NhdGlvbiBhcyBgQHdvcmtmbG93L25leHRgLlxuICB0cnkge1xuICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHJlcXVpcmUucmVzb2x2ZSgnbmV4dC9wYWNrYWdlLmpzb24nLCB7XG4gICAgICBwYXRoczogW3dvcmtpbmdEaXJdLFxuICAgIH0pO1xuICAgIGNvbnN0IHJlc29sdmVkUGFja2FnZUpzb24gPSByZXF1aXJlKHBhY2thZ2VKc29uUGF0aCkgYXMge1xuICAgICAgdmVyc2lvbj86IHVua25vd247XG4gICAgfTtcbiAgICBpZiAodHlwZW9mIHJlc29sdmVkUGFja2FnZUpzb24udmVyc2lvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiByZXNvbHZlZFBhY2thZ2VKc29uLnZlcnNpb247XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgZXJyb3JzLnB1c2goZSk7XG4gIH1cblxuICAvLyBGYWxsIGJhY2sgdG8gcmVzb2x2aW5nIHJlbGF0aXZlIHRvIHRoaXMgcGFja2FnZSdzIGxvY2F0aW9uLlxuICB0cnkge1xuICAgIGNvbnN0IHZlcnNpb24gPSAocmVxdWlyZSgnbmV4dC9wYWNrYWdlLmpzb24nKSBhcyB7IHZlcnNpb24/OiB1bmtub3duIH0pXG4gICAgICAudmVyc2lvbjtcbiAgICBpZiAodHlwZW9mIHZlcnNpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdmVyc2lvbjtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBlcnJvcnMucHVzaChlKTtcbiAgfVxuXG4gIHRocm93IG5ldyBBZ2dyZWdhdGVFcnJvcihcbiAgICBlcnJvcnMsXG4gICAgYENvdWxkIG5vdCByZXNvbHZlIE5leHQuanMgdmVyc2lvbi4gRW5zdXJlIFxcYG5leHRcXGAgaXMgaW5zdGFsbGVkIGluIHlvdXIgcHJvamVjdCAod29ya2luZyBkaXJlY3Rvcnk6ICR7d29ya2luZ0Rpcn0pLmBcbiAgKTtcbn1cblxuZnVuY3Rpb24gZmlsZUV4aXN0cyhwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0cyA9IHN0YXRTeW5jKHBhdGgpO1xuICAgIHJldHVybiBzdGF0cy5pc0ZpbGUoKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFdvcmtmbG93TWFuaWZlc3RDb3B5UGF0aHMoe1xuICBwcm9qZWN0RGlyLFxuICBkaXN0RGlyLFxufToge1xuICBwcm9qZWN0RGlyOiBzdHJpbmc7XG4gIGRpc3REaXI6IHN0cmluZztcbn0pOiB7IG1hbmlmZXN0UGF0aDogc3RyaW5nOyBkaWFnbm9zdGljc01hbmlmZXN0UGF0aDogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICBjb25zdCBtYW5pZmVzdENhbmRpZGF0ZXMgPSBbXG4gICAgam9pbihwcm9qZWN0RGlyLCAnYXBwLy53ZWxsLWtub3duL3dvcmtmbG93L3YxL21hbmlmZXN0Lmpzb24nKSxcbiAgICBqb2luKHByb2plY3REaXIsICdzcmMvYXBwLy53ZWxsLWtub3duL3dvcmtmbG93L3YxL21hbmlmZXN0Lmpzb24nKSxcbiAgICBqb2luKHByb2plY3REaXIsICdwdWJsaWMvLndlbGwta25vd24vd29ya2Zsb3cvdjEvbWFuaWZlc3QuanNvbicpLFxuICBdO1xuICBjb25zdCBtYW5pZmVzdFBhdGggPSBtYW5pZmVzdENhbmRpZGF0ZXMuZmluZChmaWxlRXhpc3RzKTtcblxuICBpZiAoIW1hbmlmZXN0UGF0aCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHJlc29sdmVkRGlzdERpciA9IGlzQWJzb2x1dGUoZGlzdERpcilcbiAgICA/IGRpc3REaXJcbiAgICA6IGpvaW4ocHJvamVjdERpciwgZGlzdERpcik7XG4gIGNvbnN0IGRpYWdub3N0aWNzTWFuaWZlc3RQYXRoID0gam9pbihcbiAgICByZXNvbHZlZERpc3REaXIsXG4gICAgJ2RpYWdub3N0aWNzJyxcbiAgICAnd29ya2Zsb3dzLW1hbmlmZXN0Lmpzb24nXG4gICk7XG4gIHJldHVybiB7IG1hbmlmZXN0UGF0aCwgZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGggfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29weVdvcmtmbG93RGlhZ25vc3RpY3NNYW5pZmVzdChtZXRhZGF0YToge1xuICBwcm9qZWN0RGlyOiBzdHJpbmc7XG4gIGRpc3REaXI6IHN0cmluZztcbn0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGF0aHMgPSBnZXRXb3JrZmxvd01hbmlmZXN0Q29weVBhdGhzKG1ldGFkYXRhKTtcbiAgaWYgKCFwYXRocykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHsgbWFuaWZlc3RQYXRoLCBkaWFnbm9zdGljc01hbmlmZXN0UGF0aCB9ID0gcGF0aHM7XG4gIGF3YWl0IG1rZGlyKGRpcm5hbWUoZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgY29weUZpbGUobWFuaWZlc3RQYXRoLCBkaWFnbm9zdGljc01hbmlmZXN0UGF0aCk7XG59XG5cbmZ1bmN0aW9uIGNvcHlXb3JrZmxvd0RpYWdub3N0aWNzTWFuaWZlc3RTeW5jKG1ldGFkYXRhOiB7XG4gIHByb2plY3REaXI6IHN0cmluZztcbiAgZGlzdERpcjogc3RyaW5nO1xufSk6IHZvaWQge1xuICBjb25zdCBwYXRocyA9IGdldFdvcmtmbG93TWFuaWZlc3RDb3B5UGF0aHMobWV0YWRhdGEpO1xuICBpZiAoIXBhdGhzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgeyBtYW5pZmVzdFBhdGgsIGRpYWdub3N0aWNzTWFuaWZlc3RQYXRoIH0gPSBwYXRocztcbiAgbWtkaXJTeW5jKGRpcm5hbWUoZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29weUZpbGVTeW5jKG1hbmlmZXN0UGF0aCwgZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGgpO1xufVxuXG5mdW5jdGlvbiByZWdpc3RlcldvcmtmbG93RGlhZ25vc3RpY3NNYW5pZmVzdENvcHkobWV0YWRhdGE6IHtcbiAgcHJvamVjdERpcjogc3RyaW5nO1xuICBkaXN0RGlyOiBzdHJpbmc7XG59KTogdm9pZCB7XG4gIGNvbnN0IG1hcmtlciA9ICdfX3dvcmtmbG93RGlhZ25vc3RpY3NNYW5pZmVzdENvcGllcyc7XG4gIGNvbnN0IGdsb2JhbFdpdGhNYXJrZXIgPSBnbG9iYWxUaGlzIGFzIHR5cGVvZiBnbG9iYWxUaGlzICYge1xuICAgIFttYXJrZXJdPzogQXJyYXk8eyBwcm9qZWN0RGlyOiBzdHJpbmc7IGRpc3REaXI6IHN0cmluZyB9PjtcbiAgfTtcblxuICBpZiAoIWdsb2JhbFdpdGhNYXJrZXJbbWFya2VyXSkge1xuICAgIGdsb2JhbFdpdGhNYXJrZXJbbWFya2VyXSA9IFtdO1xuICAgIHByb2Nlc3Mub25jZSgnZXhpdCcsICgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgY29weU1ldGFkYXRhIG9mIGdsb2JhbFdpdGhNYXJrZXJbbWFya2VyXSB8fCBbXSkge1xuICAgICAgICBjb3B5V29ya2Zsb3dEaWFnbm9zdGljc01hbmlmZXN0U3luYyhjb3B5TWV0YWRhdGEpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZ2xvYmFsV2l0aE1hcmtlclttYXJrZXJdLnB1c2gobWV0YWRhdGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2l0aFdvcmtmbG93KFxuICBuZXh0Q29uZmlnT3JGbjpcbiAgICB8IE5leHRDb25maWdcbiAgICB8ICgoXG4gICAgICAgIHBoYXNlOiBzdHJpbmcsXG4gICAgICAgIGN0eDogeyBkZWZhdWx0Q29uZmlnOiBOZXh0Q29uZmlnIH1cbiAgICAgICkgPT4gUHJvbWlzZTxOZXh0Q29uZmlnPiksXG4gIHtcbiAgICB3b3JrZmxvd3MsXG4gIH06IHtcbiAgICB3b3JrZmxvd3M/OiB7XG4gICAgICBsYXp5RGlzY292ZXJ5PzogYm9vbGVhbjtcbiAgICAgIGxvY2FsPzoge1xuICAgICAgICBwb3J0PzogbnVtYmVyO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQ29udHJvbHMgaG93IHNvdXJjZSBtYXBzIGFyZSBlbWl0dGVkIGZvciB3b3JrZmxvdyBidW5kbGVzLiBBY2NlcHRzXG4gICAgICAgKiB0aGUgc2FtZSB2YWx1ZXMgYXMgZXNidWlsZCdzIGBzb3VyY2VtYXBgIG9wdGlvbjogYHRydWVgL2AnaW5saW5lJ2BcbiAgICAgICAqIChkZWZhdWx0KSwgYCdsaW5rZWQnYCwgYCdleHRlcm5hbCdgLCBgJ2JvdGgnYCwgb3IgYGZhbHNlYCB0byBvbWl0XG4gICAgICAgKiBzb3VyY2UgbWFwcy4gQ2FuIGFsc28gYmUgc2V0IHZpYSB0aGUgYFdPUktGTE9XX1NPVVJDRU1BUGBcbiAgICAgICAqIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICAgICAgICovXG4gICAgICBzb3VyY2VtYXA/OiBib29sZWFuIHwgJ2lubGluZScgfCAnbGlua2VkJyB8ICdleHRlcm5hbCcgfCAnYm90aCc7XG4gICAgfTtcbiAgfSA9IHt9XG4pIHtcbiAgLy8gbGF6eURpc2NvdmVyeSBkZWZhdWx0cyB0byB0cnVlOyBwYXNzIGBsYXp5RGlzY292ZXJ5OiBmYWxzZWAgdG8gZm9yY2UgZWFnZXJcbiAgLy8gZGlzY292ZXJ5IChzY2FubmluZyB0aGUgcHJvamVjdCBhdCBzdGFydHVwKSBpbnN0ZWFkIG9mIGRlZmVycmluZyB3b3JrZmxvd1xuICAvLyBkaXNjb3ZlcnkgdW50aWwgZmlsZXMgYXJlIHJlcXVlc3RlZC4gVGhlIGBXT1JLRkxPV19ORVhUX0xBWllfRElTQ09WRVJZYFxuICAvLyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgaWYgc2V0LCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhlIG9wdGlvbi5cbiAgY29uc3QgbGF6eURpc2NvdmVyeU92ZXJyaWRlID0gcGFyc2VFbnZpcm9ubWVudEZsYWcoXG4gICAgcHJvY2Vzcy5lbnYuV09SS0ZMT1dfTkVYVF9MQVpZX0RJU0NPVkVSWVxuICApO1xuICBpZiAobGF6eURpc2NvdmVyeU92ZXJyaWRlID09PSB1bmRlZmluZWQpIHtcbiAgICBpZiAod29ya2Zsb3dzPy5sYXp5RGlzY292ZXJ5ID09PSBmYWxzZSkge1xuICAgICAgZGVsZXRlIHByb2Nlc3MuZW52LldPUktGTE9XX05FWFRfTEFaWV9ESVNDT1ZFUlk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3MuZW52LldPUktGTE9XX05FWFRfTEFaWV9ESVNDT1ZFUlkgPSAnMSc7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHByb2Nlc3MuZW52LldPUktGTE9XX05FWFRfTEFaWV9ESVNDT1ZFUlkgPSBsYXp5RGlzY292ZXJ5T3ZlcnJpZGVcbiAgICAgID8gJzEnXG4gICAgICA6ICcwJztcbiAgfVxuXG4gIGlmICghcHJvY2Vzcy5lbnYuVkVSQ0VMX0RFUExPWU1FTlRfSUQpIHtcbiAgICBpZiAoIXByb2Nlc3MuZW52LldPUktGTE9XX1RBUkdFVF9XT1JMRCkge1xuICAgICAgcHJvY2Vzcy5lbnYuV09SS0ZMT1dfVEFSR0VUX1dPUkxEID0gJ2xvY2FsJztcbiAgICAgIHByb2Nlc3MuZW52LldPUktGTE9XX0xPQ0FMX0RBVEFfRElSID0gJy5uZXh0L3dvcmtmbG93LWRhdGEnO1xuICAgIH1cbiAgICBjb25zdCBtYXliZVBvcnQgPSB3b3JrZmxvd3M/LmxvY2FsPy5wb3J0O1xuICAgIGlmIChtYXliZVBvcnQpIHtcbiAgICAgIHByb2Nlc3MuZW52LlBPUlQgPSBtYXliZVBvcnQudG9TdHJpbmcoKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKCFwcm9jZXNzLmVudi5XT1JLRkxPV19UQVJHRVRfV09STEQpIHtcbiAgICAgIHByb2Nlc3MuZW52LldPUktGTE9XX1RBUkdFVF9XT1JMRCA9ICd2ZXJjZWwnO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhc3luYyBmdW5jdGlvbiBidWlsZENvbmZpZyhcbiAgICBwaGFzZTogc3RyaW5nLFxuICAgIGN0eDogeyBkZWZhdWx0Q29uZmlnOiBOZXh0Q29uZmlnIH1cbiAgKSB7XG4gICAgY29uc3QgbG9hZGVyUGF0aCA9IHJlcXVpcmUucmVzb2x2ZSgnLi9sb2FkZXInKTtcbiAgICBsZXQgcnVuRGVmZXJyZWRCdWlsZEZyb21DYWxsYmFjazogKCgpID0+IFByb21pc2U8dm9pZD4pIHwgdW5kZWZpbmVkO1xuXG4gICAgbGV0IG5leHRDb25maWc6IE5leHRDb25maWc7XG5cbiAgICBpZiAodHlwZW9mIG5leHRDb25maWdPckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBuZXh0Q29uZmlnID0gYXdhaXQgbmV4dENvbmZpZ09yRm4ocGhhc2UsIGN0eCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRDb25maWcgPSBuZXh0Q29uZmlnT3JGbjtcbiAgICB9XG4gICAgLy8gc2hhbGxvdyBjbG9uZSB0byBhdm9pZCByZWFkLW9ubHkgb24gdG9wLWxldmVsXG4gICAgbmV4dENvbmZpZyA9IE9iamVjdC5hc3NpZ24oe30sIG5leHRDb25maWcpO1xuICAgIG5leHRDb25maWcuc2VydmVyRXh0ZXJuYWxQYWNrYWdlcyA9IFtcbiAgICAgIC4uLm5ldyBTZXQoW1xuICAgICAgICAuLi4obmV4dENvbmZpZy5zZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzIHx8IFtdKSxcbiAgICAgICAgLy8gS2VlcCB0aGUgVmVyY2VsIHdvcmxkIGFuZCBpdHMgbmF0aXZlLXByb25lIGRlcGVuZGVuY2llcyBleHRlcm5hbCBzb1xuICAgICAgICAvLyBsb2NhbCBidWlsZHMgZG8gbm90IHRyeSB0byBwYXJzZSBAdmVyY2VsL3F1ZXVlJ3Mga2V5cmluZyBkZXBlbmRlbmN5XG4gICAgICAgIC8vIHRyZWUuXG4gICAgICAgIC4uLlZFUkNFTF9XT1JMRF9TRVJWRVJfRVhURVJOQUxfUEFDS0FHRVMsXG4gICAgICBdKSxcbiAgICBdO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29tcGlsZXIgPSBuZXh0Q29uZmlnLmNvbXBpbGVyID8/IHt9O1xuICAgIGNvbnN0IGV4aXN0aW5nUnVuQWZ0ZXJQcm9kdWN0aW9uQ29tcGlsZSA9IChcbiAgICAgIGV4aXN0aW5nQ29tcGlsZXIgYXMge1xuICAgICAgICBydW5BZnRlclByb2R1Y3Rpb25Db21waWxlPzogKG1ldGFkYXRhOiB7XG4gICAgICAgICAgcHJvamVjdERpcjogc3RyaW5nO1xuICAgICAgICAgIGRpc3REaXI6IHN0cmluZztcbiAgICAgICAgfSkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICAgIH1cbiAgICApLnJ1bkFmdGVyUHJvZHVjdGlvbkNvbXBpbGU7XG5cbiAgICBjb25zdCBjb25maWd1cmVkU2VydmVyRXh0ZXJuYWxQYWNrYWdlcyA9IEFycmF5LmlzQXJyYXkoXG4gICAgICBuZXh0Q29uZmlnLnNlcnZlckV4dGVybmFsUGFja2FnZXNcbiAgICApXG4gICAgICA/IG5leHRDb25maWcuc2VydmVyRXh0ZXJuYWxQYWNrYWdlc1xuICAgICAgOiBbXTtcbiAgICBsZXQgZWZmZWN0aXZlU2VydmVyRXh0ZXJuYWxQYWNrYWdlcyA9IGNvbmZpZ3VyZWRTZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzO1xuXG4gICAgaWYgKGNvbmZpZ3VyZWRTZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGRldGVjdGVkV29ya2Zsb3dQYWNrYWdlczogRGV0ZWN0ZWRTZXJ2ZXJFeHRlcm5hbFBhY2thZ2VbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBwYWNrYWdlTmFtZSBvZiBjb25maWd1cmVkU2VydmVyRXh0ZXJuYWxQYWNrYWdlcykge1xuICAgICAgICBpZiAoUFNFVURPX0VYVEVSTkFMX1BBQ0tBR0VTLmhhcyhwYWNrYWdlTmFtZSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZGV0ZWN0ZWQgPSBhd2FpdCBkZXRlY3RTZXJ2ZXJFeHRlcm5hbFBhY2thZ2UoXG4gICAgICAgICAgICBwYWNrYWdlTmFtZSxcbiAgICAgICAgICAgIHByb2Nlc3MuY3dkKClcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChkZXRlY3RlZCkge1xuICAgICAgICAgICAgZGV0ZWN0ZWRXb3JrZmxvd1BhY2thZ2VzLnB1c2goZGV0ZWN0ZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gQmVzdC1lZmZvcnQgb25seS4gTmV2ZXIgYmxvY2sgY29uZmlnIGdlbmVyYXRpb24uXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGRldGVjdGVkV29ya2Zsb3dQYWNrYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHJlbW92ZWRQYWNrYWdlcyA9IG5ldyBTZXQoXG4gICAgICAgICAgZGV0ZWN0ZWRXb3JrZmxvd1BhY2thZ2VzLm1hcCgoZGV0ZWN0ZWQpID0+IGRldGVjdGVkLnBhY2thZ2VOYW1lKVxuICAgICAgICApO1xuICAgICAgICBlZmZlY3RpdmVTZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzID1cbiAgICAgICAgICBjb25maWd1cmVkU2VydmVyRXh0ZXJuYWxQYWNrYWdlcy5maWx0ZXIoXG4gICAgICAgICAgICAocGFja2FnZU5hbWUpID0+ICFyZW1vdmVkUGFja2FnZXMuaGFzKHBhY2thZ2VOYW1lKVxuICAgICAgICAgICk7XG4gICAgICAgIG5leHRDb25maWcuc2VydmVyRXh0ZXJuYWxQYWNrYWdlcyA9IGVmZmVjdGl2ZVNlcnZlckV4dGVybmFsUGFja2FnZXM7XG4gICAgICAgIHdhcm5BYm91dEF1dG9SZW1vdmVkU2VydmVyRXh0ZXJuYWxQYWNrYWdlcyhkZXRlY3RlZFdvcmtmbG93UGFja2FnZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNvbmZpZ3VyZSB0aGUgbG9hZGVyIGlmIHR1cmJvcGFjayBpcyBiZWluZyB1c2VkXG4gICAgaWYgKCFuZXh0Q29uZmlnLnR1cmJvcGFjaykge1xuICAgICAgbmV4dENvbmZpZy50dXJib3BhY2sgPSB7fTtcbiAgICB9XG4gICAgaWYgKCFuZXh0Q29uZmlnLnR1cmJvcGFjay5ydWxlcykge1xuICAgICAgbmV4dENvbmZpZy50dXJib3BhY2sucnVsZXMgPSB7fTtcbiAgICB9XG4gICAgY29uc3QgZXhpc3RpbmdSdWxlcyA9IG5leHRDb25maWcudHVyYm9wYWNrLnJ1bGVzIGFzIGFueTtcbiAgICBjb25zdCBuZXh0VmVyc2lvbiA9IHJlc29sdmVOZXh0VmVyc2lvbihwcm9jZXNzLmN3ZCgpKTtcbiAgICBjb25zdCBzdXBwb3J0c1R1cmJvQ29uZGl0aW9uID0gc2VtdmVyLmd0ZShuZXh0VmVyc2lvbiwgJ3YxNi4wLjAnKTtcbiAgICBjb25zdCB1c2VEZWZlcnJlZEJ1aWxkZXIgPSBzaG91bGRVc2VEZWZlcnJlZEJ1aWxkZXIobmV4dFZlcnNpb24pO1xuXG4gICAgLy8gRGVmZXJyZWQgYnVpbGRlciBkaXNjb3ZlcnMgZmlsZXMgdmlhIGxvYWRlciBzb2NrZXQgbm90aWZpY2F0aW9ucywgc29cbiAgICAvLyB0dXJib3BhY2sgY29udGVudCBjb25kaXRpb25zIGFyZSBvbmx5IG5lZWRlZCB3aXRoIHRoZSBlYWdlciBidWlsZGVyLlxuICAgIGNvbnN0IHNob3VsZEFwcGx5VHVyYm9Db25kaXRpb24gPVxuICAgICAgc3VwcG9ydHNUdXJib0NvbmRpdGlvbiAmJiAhdXNlRGVmZXJyZWRCdWlsZGVyO1xuICAgIGNvbnN0IHNob3VsZFdhdGNoID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCc7XG4gICAgbGV0IHdvcmtmbG93QnVpbGRlclByb21pc2U6IFByb21pc2U8YW55PiB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBkaXN0RGlyID0gbmV4dENvbmZpZy5kaXN0RGlyIHx8ICcubmV4dCc7XG5cbiAgICBuZXh0Q29uZmlnLmNvbXBpbGVyID0ge1xuICAgICAgLi4uZXhpc3RpbmdDb21waWxlcixcbiAgICAgIHJ1bkFmdGVyUHJvZHVjdGlvbkNvbXBpbGU6IGFzeW5jIChtZXRhZGF0YSkgPT4ge1xuICAgICAgICBpZiAoZXhpc3RpbmdSdW5BZnRlclByb2R1Y3Rpb25Db21waWxlKSB7XG4gICAgICAgICAgYXdhaXQgZXhpc3RpbmdSdW5BZnRlclByb2R1Y3Rpb25Db21waWxlKG1ldGFkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBjb3B5V29ya2Zsb3dEaWFnbm9zdGljc01hbmlmZXN0KG1ldGFkYXRhKTtcbiAgICAgICAgcmVnaXN0ZXJXb3JrZmxvd0RpYWdub3N0aWNzTWFuaWZlc3RDb3B5KG1ldGFkYXRhKTtcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGNvbnN0IGdldFdvcmtmbG93QnVpbGRlciA9IGFzeW5jICgpID0+IHtcbiAgICAgIGlmICghd29ya2Zsb3dCdWlsZGVyUHJvbWlzZSkge1xuICAgICAgICB3b3JrZmxvd0J1aWxkZXJQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBOZXh0QnVpbGRlciA9IGF3YWl0IGdldE5leHRCdWlsZGVyKG5leHRWZXJzaW9uKTtcbiAgICAgICAgICByZXR1cm4gbmV3IE5leHRCdWlsZGVyKHtcbiAgICAgICAgICAgIHdhdGNoOiBzaG91bGRXYXRjaCxcbiAgICAgICAgICAgIC8vIGRpc2NvdmVyIHdvcmtmbG93cyBmcm9tIHBhZ2VzL2FwcCBlbnRyaWVzXG4gICAgICAgICAgICBkaXJzOiBbJ3BhZ2VzJywgJ2FwcCcsICdzcmMvcGFnZXMnLCAnc3JjL2FwcCddLFxuICAgICAgICAgICAgcHJvamVjdFJvb3Q6IG5leHRDb25maWcub3V0cHV0RmlsZVRyYWNpbmdSb290LFxuICAgICAgICAgICAgd29ya2luZ0RpcjogcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICAgIGRpc3REaXIsXG4gICAgICAgICAgICBkaWFnbm9zdGljc0RpcjogYCR7ZGlzdERpcn0vZGlhZ25vc3RpY3NgLFxuICAgICAgICAgICAgYnVpbGRUYXJnZXQ6ICduZXh0JyxcbiAgICAgICAgICAgIHdvcmtmbG93c0J1bmRsZVBhdGg6ICcnLCAvLyBub3QgdXNlZCBpbiBiYXNlXG4gICAgICAgICAgICBzdGVwc0J1bmRsZVBhdGg6ICcnLCAvLyBub3QgdXNlZCBpbiBiYXNlXG4gICAgICAgICAgICB3ZWJob29rQnVuZGxlUGF0aDogJycsIC8vIG5vZGUgdXNlZCBpbiBiYXNlXG4gICAgICAgICAgICBzb3VyY2VtYXA6IHdvcmtmbG93cz8uc291cmNlbWFwLFxuICAgICAgICAgICAgc3VwcHJlc3NDcmVhdGVXb3JrZmxvd3NCdW5kbGVMb2dzOiB1c2VEZWZlcnJlZEJ1aWxkZXIsXG4gICAgICAgICAgICBzdXBwcmVzc0NyZWF0ZVdvcmtmbG93c0J1bmRsZVdhcm5pbmdzOiB1c2VEZWZlcnJlZEJ1aWxkZXIsXG4gICAgICAgICAgICBzdXBwcmVzc0NyZWF0ZVdlYmhvb2tCdW5kbGVMb2dzOiB1c2VEZWZlcnJlZEJ1aWxkZXIsXG4gICAgICAgICAgICBzdXBwcmVzc0NyZWF0ZU1hbmlmZXN0TG9nczogdXNlRGVmZXJyZWRCdWlsZGVyLFxuICAgICAgICAgICAgZXh0ZXJuYWxQYWNrYWdlczogW1xuICAgICAgICAgICAgICAvLyBzZXJ2ZXItb25seSBhbmQgY2xpZW50LW9ubHkgYXJlIHBzZXVkby1wYWNrYWdlcyBoYW5kbGVkIGJ5IE5leHQuanNcbiAgICAgICAgICAgICAgLy8gZHVyaW5nIGl0cyBidWlsZCBwcm9jZXNzLiBXZSBtYXJrIHRoZW0gYXMgZXh0ZXJuYWwgdG8gcHJldmVudCBlc2J1aWxkXG4gICAgICAgICAgICAgIC8vIGZyb20gZmFpbGluZyB3aGVuIGJ1bmRsaW5nIGNvZGUgdGhhdCBpbXBvcnRzIHRoZW0uXG4gICAgICAgICAgICAgIC8vIFNlZTogaHR0cHM6Ly9uZXh0anMub3JnL2RvY3MvYXBwL2dldHRpbmctc3RhcnRlZC9zZXJ2ZXItYW5kLWNsaWVudC1jb21wb25lbnRzXG4gICAgICAgICAgICAgICdzZXJ2ZXItb25seScsXG4gICAgICAgICAgICAgICdjbGllbnQtb25seScsXG4gICAgICAgICAgICAgIC4uLmVmZmVjdGl2ZVNlcnZlckV4dGVybmFsUGFja2FnZXMsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KSgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gd29ya2Zsb3dCdWlsZGVyUHJvbWlzZTtcbiAgICB9O1xuXG4gICAgaWYgKHVzZURlZmVycmVkQnVpbGRlcikge1xuICAgICAgcnVuRGVmZXJyZWRCdWlsZEZyb21DYWxsYmFjayA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgd29ya2Zsb3dCdWlsZGVyID0gYXdhaXQgZ2V0V29ya2Zsb3dCdWlsZGVyKCk7XG4gICAgICAgIGlmICh0eXBlb2Ygd29ya2Zsb3dCdWlsZGVyLm9uQmVmb3JlRGVmZXJyZWRFbnRyaWVzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgYXdhaXQgd29ya2Zsb3dCdWlsZGVyLm9uQmVmb3JlRGVmZXJyZWRFbnRyaWVzKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGV4aXN0aW5nRXhwZXJpbWVudGFsID0gKG5leHRDb25maWcuZXhwZXJpbWVudGFsID8/IHt9KSBhcyBSZWNvcmQ8XG4gICAgICAgIHN0cmluZyxcbiAgICAgICAgYW55XG4gICAgICA+O1xuICAgICAgY29uc3QgZXhpc3RpbmdEZWZlcnJlZEVudHJpZXMgPSBBcnJheS5pc0FycmF5KFxuICAgICAgICBleGlzdGluZ0V4cGVyaW1lbnRhbC5kZWZlcnJlZEVudHJpZXNcbiAgICAgIClcbiAgICAgICAgPyBleGlzdGluZ0V4cGVyaW1lbnRhbC5kZWZlcnJlZEVudHJpZXNcbiAgICAgICAgOiBbXTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nT25CZWZvcmVEZWZlcnJlZEVudHJpZXMgPVxuICAgICAgICB0eXBlb2YgZXhpc3RpbmdFeHBlcmltZW50YWwub25CZWZvcmVEZWZlcnJlZEVudHJpZXMgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICA/IGV4aXN0aW5nRXhwZXJpbWVudGFsLm9uQmVmb3JlRGVmZXJyZWRFbnRyaWVzXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIG5leHRDb25maWcuZXhwZXJpbWVudGFsID0ge1xuICAgICAgICAuLi5leGlzdGluZ0V4cGVyaW1lbnRhbCxcblxuICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vVHNJZ25vcmU6IGV4cGVjdC1lcnJvciBpcyB3cm9uZyBhcyBpdCB3aWxsIHdvcmsgb24gdmFsaWQgdmVyc2lvblxuICAgICAgICAvLyBAdHMtaWdub3JlIHRoaXMgaXMgb25seSBhdmFpbGFibGUgaW4gY2FuYXJ5IE5leHQuanNcbiAgICAgICAgZGVmZXJyZWRFbnRyaWVzOiBbXG4gICAgICAgICAgLi4ubmV3IFNldChbXG4gICAgICAgICAgICAuLi5leGlzdGluZ0RlZmVycmVkRW50cmllcyxcbiAgICAgICAgICAgIC4uLldPUktGTE9XX0RFRkVSUkVEX0VOVFJJRVMsXG4gICAgICAgICAgXSksXG4gICAgICAgIF0sXG4gICAgICAgIG9uQmVmb3JlRGVmZXJyZWRFbnRyaWVzOiBhc3luYyAoLi4uYXJnczogdW5rbm93bltdKSA9PiB7XG4gICAgICAgICAgaWYgKGV4aXN0aW5nT25CZWZvcmVEZWZlcnJlZEVudHJpZXMpIHtcbiAgICAgICAgICAgIGF3YWl0IGV4aXN0aW5nT25CZWZvcmVEZWZlcnJlZEVudHJpZXMoLi4uYXJncyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChydW5EZWZlcnJlZEJ1aWxkRnJvbUNhbGxiYWNrKSB7XG4gICAgICAgICAgICBhd2FpdCBydW5EZWZlcnJlZEJ1aWxkRnJvbUNhbGxiYWNrKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBbXG4gICAgICAnKi50c3gnLFxuICAgICAgJyoudHMnLFxuICAgICAgJyouanN4JyxcbiAgICAgICcqLmpzJyxcbiAgICAgICcqLm1qcycsXG4gICAgICAnKi5tdHMnLFxuICAgICAgJyouY2pzJyxcbiAgICAgICcqLmN0cycsXG4gICAgXSkge1xuICAgICAgbmV4dENvbmZpZy50dXJib3BhY2sucnVsZXNba2V5XSA9IHtcbiAgICAgICAgLi4uKHNob3VsZEFwcGx5VHVyYm9Db25kaXRpb25cbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgY29uZGl0aW9uOiB7XG4gICAgICAgICAgICAgICAgLy8gVXNlICdhbGwnIHRvIGNvbWJpbmU6IG11c3QgbWF0Y2ggY29udGVudCBBTkQgbXVzdCBOT1QgYmUgaW4gZ2VuZXJhdGVkIHBhdGhcbiAgICAgICAgICAgICAgICAvLyBNZXJnZSB3aXRoIGFueSBleGlzdGluZyAnYWxsJyBjb25kaXRpb25zIGZyb20gdXNlciBjb25maWdcbiAgICAgICAgICAgICAgICBhbGw6IFtcbiAgICAgICAgICAgICAgICAgIC4uLihleGlzdGluZ1J1bGVzW2tleV0/LmNvbmRpdGlvbj8uYWxsIHx8IFtdKSxcbiAgICAgICAgICAgICAgICAgIC8vIEV4Y2x1ZGUgZ2VuZXJhdGVkIHdvcmtmbG93IHJvdXRlIGZpbGVzIGZyb20gdHJhbnNmb3JtYXRpb25cbiAgICAgICAgICAgICAgICAgIHsgbm90OiB7IHBhdGg6IC9bL1xcXFxdXFwud2VsbC1rbm93blsvXFxcXF13b3JrZmxvd1svXFxcXF0vIH0gfSxcbiAgICAgICAgICAgICAgICAgIC8vIE1hdGNoIGZpbGVzIHdpdGggd29ya2Zsb3cgZGlyZWN0aXZlcyBvciBjdXN0b20gc2VyaWFsaXphdGlvbiBwYXR0ZXJuc1xuICAgICAgICAgICAgICAgICAgLy8gVXNlcyBiYWNrcmVmZXJlbmNlcyAoXFwyLCBcXDMpIHRvIGVuc3VyZSBtYXRjaGluZyBxdW90ZSB0eXBlc1xuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50OlxuICAgICAgICAgICAgICAgICAgICAgIC8odXNlIHdvcmtmbG93fHVzZSBzdGVwfGZyb21cXHMrKFsnXCJdKUB3b3JrZmxvd1xcL3NlcmRlXFwyfFN5bWJvbFxcLmZvclxccypcXChcXHMqKFsnXCJdKXdvcmtmbG93LSg/OnNlcmlhbGl6ZXxkZXNlcmlhbGl6ZSlcXDNcXHMqXFwpKS8sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICAgIGxvYWRlcnM6IFsuLi4oZXhpc3RpbmdSdWxlc1trZXldPy5sb2FkZXJzIHx8IFtdKSwgbG9hZGVyUGF0aF0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIGNvbmZpZ3VyZSB0aGUgbG9hZGVyIGZvciB3ZWJwYWNrXG4gICAgY29uc3QgZXhpc3RpbmdXZWJwYWNrTW9kaWZ5ID0gbmV4dENvbmZpZy53ZWJwYWNrO1xuICAgIG5leHRDb25maWcud2VicGFjayA9ICguLi5hcmdzKSA9PiB7XG4gICAgICBjb25zdCBbd2VicGFja0NvbmZpZ10gPSBhcmdzO1xuICAgICAgaWYgKCF3ZWJwYWNrQ29uZmlnLm1vZHVsZSkge1xuICAgICAgICB3ZWJwYWNrQ29uZmlnLm1vZHVsZSA9IHt9O1xuICAgICAgfVxuICAgICAgaWYgKCF3ZWJwYWNrQ29uZmlnLm1vZHVsZS5ydWxlcykge1xuICAgICAgICB3ZWJwYWNrQ29uZmlnLm1vZHVsZS5ydWxlcyA9IFtdO1xuICAgICAgfVxuICAgICAgLy8gbG9hZGVycyBpbiB3ZWJwYWNrIGFwcGx5IGJvdHRvbS0+dXAgc28gZW5zdXJlXG4gICAgICAvLyBvdXJzIGNvbWVzIGJlZm9yZSB0aGUgZGVmYXVsdCBzd2MgdHJhbnNmb3JtXG4gICAgICB3ZWJwYWNrQ29uZmlnLm1vZHVsZS5ydWxlcy5wdXNoKHtcbiAgICAgICAgdGVzdDogLy4qXFwuKG1qc3xjanN8Y3RzfHRzfHRzeHxqc3xqc3gpJC8sXG4gICAgICAgIGxvYWRlcjogbG9hZGVyUGF0aCxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gZXhpc3RpbmdXZWJwYWNrTW9kaWZ5XG4gICAgICAgID8gKGV4aXN0aW5nV2VicGFja01vZGlmeSguLi5hcmdzKSA/PyB3ZWJwYWNrQ29uZmlnKVxuICAgICAgICA6IHdlYnBhY2tDb25maWc7XG4gICAgfTtcbiAgICAvLyBvbmx5IHJ1biB0aGlzIGluIHRoZSBtYWluIHByb2Nlc3Mgc28gaXQgb25seSBydW5zIG9uY2VcbiAgICAvLyBhcyBOZXh0LmpzIHVzZXMgY2hpbGQgcHJvY2Vzc2VzIGZvciBkaWZmZXJlbnQgYnVpbGRzXG4gICAgaWYgKFxuICAgICAgIXByb2Nlc3MuZW52LldPUktGTE9XX05FWFRfUFJJVkFURV9CVUlMVCAmJlxuICAgICAgcGhhc2UgIT09ICdwaGFzZS1wcm9kdWN0aW9uLXNlcnZlcidcbiAgICApIHtcbiAgICAgIGNvbnN0IHdvcmtmbG93QnVpbGRlciA9IGF3YWl0IGdldFdvcmtmbG93QnVpbGRlcigpO1xuXG4gICAgICBhd2FpdCB3b3JrZmxvd0J1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHByb2Nlc3MuZW52LldPUktGTE9XX05FWFRfUFJJVkFURV9CVUlMVCA9ICcxJztcbiAgICB9XG5cbiAgICByZXR1cm4gbmV4dENvbmZpZztcbiAgfTtcbn1cbiJdfQ==
|
package/dist/loader.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAooBA,KAAK,qBAAqB,GAAG;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CACZ,KAAK,EAAE,KAAK,GAAG,IAAI,EACnB,OAAO,CAAC,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,GAAG,KACZ,IAAI,CAAC;IACV,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;CACnD,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,cAAc,CACpC,IAAI,EAAE,qBAAqB,EAC3B,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,SAAS,EAAE,GAAG,GACb,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CA+IjC"}
|