@workflow/builders 5.0.0-beta.1 → 5.0.0-beta.10
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/apply-swc-transform.d.ts +1 -1
- package/dist/apply-swc-transform.d.ts.map +1 -1
- package/dist/apply-swc-transform.js +1 -1
- package/dist/base-builder.d.ts +72 -5
- package/dist/base-builder.d.ts.map +1 -1
- package/dist/base-builder.js +401 -42
- package/dist/build-queue.js +1 -1
- package/dist/config-helpers.d.ts +2 -1
- package/dist/config-helpers.d.ts.map +1 -1
- package/dist/config-helpers.js +2 -1
- package/dist/constants.d.ts +3 -13
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +4 -14
- package/dist/discover-entries-esbuild-plugin.d.ts.map +1 -1
- package/dist/discover-entries-esbuild-plugin.js +19 -3
- package/dist/discover-entries-esbuild-plugin.test.js +1 -1
- package/dist/esbuild-tsconfig.js +1 -1
- package/dist/esbuild-tsconfig.test.js +1 -1
- package/dist/external-package-warning.test.d.ts +2 -0
- package/dist/external-package-warning.test.d.ts.map +1 -0
- package/dist/external-package-warning.test.js +219 -0
- package/dist/get-input-files.test.js +49 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/module-specifier.d.ts.map +1 -1
- package/dist/module-specifier.js +48 -10
- package/dist/module-specifier.test.js +21 -1
- package/dist/node-module-esbuild-plugin.d.ts.map +1 -1
- package/dist/node-module-esbuild-plugin.js +73 -23
- package/dist/node-module-esbuild-plugin.test.js +97 -1
- package/dist/pseudo-package-esbuild-plugin.js +1 -1
- package/dist/pseudo-package-esbuild-plugin.test.js +1 -1
- package/dist/request-converter.js +1 -1
- package/dist/resolve-sourcemap.test.d.ts +2 -0
- package/dist/resolve-sourcemap.test.d.ts.map +1 -0
- package/dist/resolve-sourcemap.test.js +126 -0
- package/dist/serde-checker.js +1 -1
- package/dist/standalone.d.ts +0 -3
- package/dist/standalone.d.ts.map +1 -1
- package/dist/standalone.js +11 -40
- package/dist/swc-esbuild-plugin.d.ts +10 -1
- package/dist/swc-esbuild-plugin.d.ts.map +1 -1
- package/dist/swc-esbuild-plugin.js +64 -9
- package/dist/swc-esbuild-plugin.test.js +280 -4
- package/dist/transform-utils.js +1 -1
- package/dist/transform-utils.test.js +1 -1
- package/dist/types.d.ts +31 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/dist/vercel-build-output-api.d.ts +0 -2
- package/dist/vercel-build-output-api.d.ts.map +1 -1
- package/dist/vercel-build-output-api.js +28 -56
- package/dist/workflow-alias.js +1 -1
- package/dist/workflow-alias.test.js +1 -1
- package/dist/workflows-extractor.js +1 -1
- package/package.json +5 -5
- package/dist/apply-swc-transform.js.map +0 -1
- package/dist/base-builder.js.map +0 -1
- package/dist/build-queue.js.map +0 -1
- package/dist/config-helpers.js.map +0 -1
- package/dist/constants.js.map +0 -1
- package/dist/discover-entries-esbuild-plugin.js.map +0 -1
- package/dist/discover-entries-esbuild-plugin.test.js.map +0 -1
- package/dist/esbuild-tsconfig.js.map +0 -1
- package/dist/esbuild-tsconfig.test.js.map +0 -1
- package/dist/get-input-files.test.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/module-specifier.js.map +0 -1
- package/dist/module-specifier.test.js.map +0 -1
- package/dist/node-module-esbuild-plugin.js.map +0 -1
- package/dist/node-module-esbuild-plugin.test.js.map +0 -1
- package/dist/pseudo-package-esbuild-plugin.js.map +0 -1
- package/dist/pseudo-package-esbuild-plugin.test.js.map +0 -1
- package/dist/request-converter.js.map +0 -1
- package/dist/serde-checker.js.map +0 -1
- package/dist/standalone.js.map +0 -1
- package/dist/swc-esbuild-plugin.js.map +0 -1
- package/dist/swc-esbuild-plugin.test.js.map +0 -1
- package/dist/transform-utils.js.map +0 -1
- package/dist/transform-utils.test.js.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/vercel-build-output-api.js.map +0 -1
- package/dist/workflow-alias.js.map +0 -1
- package/dist/workflow-alias.test.js.map +0 -1
- package/dist/workflows-extractor.js.map +0 -1
|
@@ -9,6 +9,7 @@ const { applySwcTransformMock } = vi.hoisted(() => ({
|
|
|
9
9
|
vi.mock('./apply-swc-transform.js', () => ({
|
|
10
10
|
applySwcTransform: applySwcTransformMock,
|
|
11
11
|
}));
|
|
12
|
+
import { createDiscoverEntriesPlugin, importParents, } from './discover-entries-esbuild-plugin.js';
|
|
12
13
|
import { createSwcPlugin } from './swc-esbuild-plugin.js';
|
|
13
14
|
const realTmpdir = realpathSync(tmpdir());
|
|
14
15
|
function writeFile(path, contents = '') {
|
|
@@ -19,6 +20,7 @@ describe('createSwcPlugin externalizeNonSteps', () => {
|
|
|
19
20
|
let testRoot;
|
|
20
21
|
beforeEach(() => {
|
|
21
22
|
testRoot = mkdtempSync(join(realTmpdir, 'workflow-swc-plugin-'));
|
|
23
|
+
importParents.clear();
|
|
22
24
|
applySwcTransformMock.mockReset();
|
|
23
25
|
applySwcTransformMock.mockImplementation(async (_filename, source) => ({
|
|
24
26
|
code: source,
|
|
@@ -26,6 +28,7 @@ describe('createSwcPlugin externalizeNonSteps', () => {
|
|
|
26
28
|
}));
|
|
27
29
|
});
|
|
28
30
|
afterEach(() => {
|
|
31
|
+
importParents.clear();
|
|
29
32
|
rmSync(testRoot, { recursive: true, force: true });
|
|
30
33
|
});
|
|
31
34
|
it.each([
|
|
@@ -61,12 +64,16 @@ describe('createSwcPlugin externalizeNonSteps', () => {
|
|
|
61
64
|
expect(output).toContain(`/dep${outputExt}`);
|
|
62
65
|
expect(output).not.toContain(`/dep${inputExt}`);
|
|
63
66
|
});
|
|
64
|
-
it('
|
|
67
|
+
it('bundles path-aliased project-local imports inline', async () => {
|
|
68
|
+
// Aliased project-local files must be bundled inline (not externalized
|
|
69
|
+
// as relative paths) because their source on disk may contain further
|
|
70
|
+
// alias imports that Node's ESM loader cannot resolve at runtime.
|
|
71
|
+
// See packages/builders/src/swc-esbuild-plugin.ts for full reasoning.
|
|
65
72
|
const outdir = join(testRoot, 'out');
|
|
66
73
|
const srcDir = join(testRoot, 'src');
|
|
67
74
|
const libDir = join(srcDir, 'lib');
|
|
68
75
|
const stepFile = join(srcDir, 'step.ts');
|
|
69
|
-
writeFile(join(libDir, 'config.ts'), 'export const config = {};');
|
|
76
|
+
writeFile(join(libDir, 'config.ts'), 'export const config = { value: "hello-from-config" };');
|
|
70
77
|
writeFile(stepFile, `import { config } from '@/lib/config';\nconsole.log(config);`);
|
|
71
78
|
const result = await esbuild.build({
|
|
72
79
|
entryPoints: [stepFile],
|
|
@@ -88,8 +95,63 @@ describe('createSwcPlugin externalizeNonSteps', () => {
|
|
|
88
95
|
});
|
|
89
96
|
expect(result.errors).toHaveLength(0);
|
|
90
97
|
const output = result.outputFiles[0].text;
|
|
91
|
-
|
|
98
|
+
// The aliased helper should be bundled inline (its content is in the
|
|
99
|
+
// output), not externalized as a relative path or left as a bare alias.
|
|
100
|
+
expect(output).toContain('hello-from-config');
|
|
92
101
|
expect(output).not.toContain('@/lib/config');
|
|
102
|
+
expect(output).not.toMatch(/from\s+["'][^"']*\/lib\/config\.(js|ts)["']/);
|
|
103
|
+
});
|
|
104
|
+
it('bundles transitive aliased imports inside aliased helpers (Mux self-referencing package regression)', async () => {
|
|
105
|
+
// Regression test for https://github.com/muxinc/ai/pull/193.
|
|
106
|
+
//
|
|
107
|
+
// A package self-references its own subpath via tsconfig `paths` (e.g.
|
|
108
|
+
// `@my-pkg/lib/foo` → `src/lib/foo.ts`). A step file imports a helper
|
|
109
|
+
// via the alias, and that helper imports another helper via the alias.
|
|
110
|
+
//
|
|
111
|
+
// Previously the helpers were externalized as relative paths, but their
|
|
112
|
+
// source on disk still contained `import "@my-pkg/lib/..."`. At runtime,
|
|
113
|
+
// Node's ESM loader didn't know about tsconfig paths, fell through to
|
|
114
|
+
// the package's `exports` map, and threw `Package subpath ... is not
|
|
115
|
+
// defined by "exports"`.
|
|
116
|
+
//
|
|
117
|
+
// With the fix, aliased project-local files are bundled inline, so
|
|
118
|
+
// their alias imports are resolved at build time.
|
|
119
|
+
const outdir = join(testRoot, 'out');
|
|
120
|
+
const srcDir = join(testRoot, 'src');
|
|
121
|
+
const libDir = join(srcDir, 'lib');
|
|
122
|
+
const stepFile = join(srcDir, 'step.ts');
|
|
123
|
+
writeFile(join(libDir, 'providers.ts'), 'export const providerName = "anthropic";');
|
|
124
|
+
writeFile(join(libDir, 'client-factory.ts'),
|
|
125
|
+
// Helper uses the same alias to reach a sibling — this is the case
|
|
126
|
+
// that broke the Mux build with workflow >= 4.2.0-beta.78.
|
|
127
|
+
`import { providerName } from '@my-pkg/lib/providers';
|
|
128
|
+
export const client = { provider: providerName };`);
|
|
129
|
+
writeFile(stepFile, `import { client } from '@my-pkg/lib/client-factory';\nconsole.log(client);`);
|
|
130
|
+
const result = await esbuild.build({
|
|
131
|
+
entryPoints: [stepFile],
|
|
132
|
+
absWorkingDir: testRoot,
|
|
133
|
+
outdir,
|
|
134
|
+
bundle: true,
|
|
135
|
+
format: 'esm',
|
|
136
|
+
platform: 'node',
|
|
137
|
+
write: false,
|
|
138
|
+
alias: { '@my-pkg': srcDir },
|
|
139
|
+
plugins: [
|
|
140
|
+
createSwcPlugin({
|
|
141
|
+
mode: 'step',
|
|
142
|
+
entriesToBundle: [stepFile],
|
|
143
|
+
outdir,
|
|
144
|
+
rewriteTsExtensions: true,
|
|
145
|
+
}),
|
|
146
|
+
],
|
|
147
|
+
});
|
|
148
|
+
expect(result.errors).toHaveLength(0);
|
|
149
|
+
const output = result.outputFiles[0].text;
|
|
150
|
+
// Both helpers should be bundled inline — no aliased specifiers should
|
|
151
|
+
// leak into the output, where Node's ESM loader would choke on them.
|
|
152
|
+
expect(output).toContain('anthropic');
|
|
153
|
+
expect(output).not.toContain('@my-pkg/lib/providers');
|
|
154
|
+
expect(output).not.toContain('@my-pkg/lib/client-factory');
|
|
93
155
|
});
|
|
94
156
|
it('does not relativize Node.js builtin imports', async () => {
|
|
95
157
|
const outdir = join(testRoot, 'out');
|
|
@@ -150,6 +212,39 @@ describe('createSwcPlugin externalizeNonSteps', () => {
|
|
|
150
212
|
expect(output).toContain('hello');
|
|
151
213
|
expect(output).not.toMatch(/from\s+["'].*node_modules/);
|
|
152
214
|
});
|
|
215
|
+
it('externalizes nested bare package imports that only resolve from a bundled package', async () => {
|
|
216
|
+
const outdir = join(testRoot, 'out');
|
|
217
|
+
const srcDir = join(testRoot, 'src');
|
|
218
|
+
const stepFile = join(srcDir, 'step.ts');
|
|
219
|
+
const parentPkgDir = join(testRoot, 'node_modules', 'parent-pkg');
|
|
220
|
+
const parentPkgIndex = join(parentPkgDir, 'index.js');
|
|
221
|
+
const nativePkgDir = join(parentPkgDir, 'node_modules', 'optional-native');
|
|
222
|
+
writeFile(join(parentPkgDir, 'package.json'), JSON.stringify({ name: 'parent-pkg', main: 'index.js' }));
|
|
223
|
+
writeFile(parentPkgIndex, `const native = require('optional-native');\nexports.value = native.value;`);
|
|
224
|
+
writeFile(join(nativePkgDir, 'package.json'), JSON.stringify({ name: 'optional-native', main: 'binding.node' }));
|
|
225
|
+
writeFile(join(nativePkgDir, 'binding.node'), '');
|
|
226
|
+
writeFile(stepFile, `import { value } from 'parent-pkg';\nconsole.log(value);`);
|
|
227
|
+
const result = await esbuild.build({
|
|
228
|
+
entryPoints: [stepFile],
|
|
229
|
+
absWorkingDir: testRoot,
|
|
230
|
+
outdir,
|
|
231
|
+
bundle: true,
|
|
232
|
+
format: 'esm',
|
|
233
|
+
platform: 'node',
|
|
234
|
+
write: false,
|
|
235
|
+
plugins: [
|
|
236
|
+
createSwcPlugin({
|
|
237
|
+
mode: 'step',
|
|
238
|
+
entriesToBundle: [stepFile, parentPkgIndex],
|
|
239
|
+
outdir,
|
|
240
|
+
}),
|
|
241
|
+
],
|
|
242
|
+
});
|
|
243
|
+
expect(result.errors).toHaveLength(0);
|
|
244
|
+
const output = result.outputFiles[0].text;
|
|
245
|
+
expect(output).toContain('optional-native');
|
|
246
|
+
expect(output).not.toContain('binding.node');
|
|
247
|
+
});
|
|
153
248
|
it.each([
|
|
154
249
|
'.ts',
|
|
155
250
|
'.tsx',
|
|
@@ -181,6 +276,187 @@ describe('createSwcPlugin externalizeNonSteps', () => {
|
|
|
181
276
|
const output = result.outputFiles[0].text;
|
|
182
277
|
expect(output).toContain(`/dep${inputExt}`);
|
|
183
278
|
});
|
|
279
|
+
it('bundles transitive local TypeScript dependencies with extensionless imports', async () => {
|
|
280
|
+
const outdir = join(testRoot, 'out');
|
|
281
|
+
const stepFile = join(testRoot, 'server', 'workflows', 'my-workflow.ts');
|
|
282
|
+
const constantsFile = join(testRoot, 'shared', 'constants.ts');
|
|
283
|
+
const helpersFile = join(testRoot, 'shared', 'helpers.ts');
|
|
284
|
+
writeFile(helpersFile, `export const HELPER_VALUE = "from-helper";`);
|
|
285
|
+
writeFile(constantsFile, `import { HELPER_VALUE } from './helpers';\nexport const CATEGORIES = [HELPER_VALUE];`);
|
|
286
|
+
writeFile(stepFile, `import { CATEGORIES } from '../../shared/constants';\nexport async function myStep() {\n 'use step';\n return CATEGORIES[0];\n}`);
|
|
287
|
+
const state = {
|
|
288
|
+
discoveredSteps: new Set(),
|
|
289
|
+
discoveredWorkflows: new Set(),
|
|
290
|
+
discoveredSerdeFiles: new Set(),
|
|
291
|
+
};
|
|
292
|
+
await esbuild.build({
|
|
293
|
+
entryPoints: [stepFile],
|
|
294
|
+
absWorkingDir: testRoot,
|
|
295
|
+
bundle: true,
|
|
296
|
+
format: 'esm',
|
|
297
|
+
platform: 'node',
|
|
298
|
+
write: false,
|
|
299
|
+
resolveExtensions: ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs'],
|
|
300
|
+
plugins: [createDiscoverEntriesPlugin(state, testRoot)],
|
|
301
|
+
});
|
|
302
|
+
const result = await esbuild.build({
|
|
303
|
+
entryPoints: [stepFile],
|
|
304
|
+
absWorkingDir: testRoot,
|
|
305
|
+
outdir,
|
|
306
|
+
bundle: true,
|
|
307
|
+
format: 'esm',
|
|
308
|
+
platform: 'node',
|
|
309
|
+
write: false,
|
|
310
|
+
resolveExtensions: ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs'],
|
|
311
|
+
plugins: [
|
|
312
|
+
createSwcPlugin({
|
|
313
|
+
mode: 'step',
|
|
314
|
+
entriesToBundle: [stepFile],
|
|
315
|
+
outdir,
|
|
316
|
+
bundleTransitiveLocalStepDependencies: true,
|
|
317
|
+
}),
|
|
318
|
+
],
|
|
319
|
+
});
|
|
320
|
+
expect(result.errors).toHaveLength(0);
|
|
321
|
+
const output = result.outputFiles[0].text;
|
|
322
|
+
expect(output).toContain('from-helper');
|
|
323
|
+
expect(output).not.toMatch(/from\s+["'][^"']*shared\/constants/);
|
|
324
|
+
expect(output).not.toMatch(/from\s+["'][^"']*shared\/helpers/);
|
|
325
|
+
});
|
|
326
|
+
it('externalizes transitive local TypeScript dependencies by default', async () => {
|
|
327
|
+
const outdir = join(testRoot, 'out');
|
|
328
|
+
const stepFile = join(testRoot, 'server', 'workflows', 'my-workflow.ts');
|
|
329
|
+
const constantsFile = join(testRoot, 'shared', 'constants.ts');
|
|
330
|
+
const helpersFile = join(testRoot, 'shared', 'helpers.ts');
|
|
331
|
+
writeFile(helpersFile, `export const HELPER_VALUE = "from-helper";`);
|
|
332
|
+
writeFile(constantsFile, `import { HELPER_VALUE } from './helpers';\nexport const CATEGORIES = [HELPER_VALUE];`);
|
|
333
|
+
writeFile(stepFile, `import { CATEGORIES } from '../../shared/constants';\nexport async function myStep() {\n 'use step';\n return CATEGORIES[0];\n}`);
|
|
334
|
+
const state = {
|
|
335
|
+
discoveredSteps: new Set(),
|
|
336
|
+
discoveredWorkflows: new Set(),
|
|
337
|
+
discoveredSerdeFiles: new Set(),
|
|
338
|
+
};
|
|
339
|
+
await esbuild.build({
|
|
340
|
+
entryPoints: [stepFile],
|
|
341
|
+
absWorkingDir: testRoot,
|
|
342
|
+
bundle: true,
|
|
343
|
+
format: 'esm',
|
|
344
|
+
platform: 'node',
|
|
345
|
+
write: false,
|
|
346
|
+
resolveExtensions: ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs'],
|
|
347
|
+
plugins: [createDiscoverEntriesPlugin(state, testRoot)],
|
|
348
|
+
});
|
|
349
|
+
const result = await esbuild.build({
|
|
350
|
+
entryPoints: [stepFile],
|
|
351
|
+
absWorkingDir: testRoot,
|
|
352
|
+
outdir,
|
|
353
|
+
bundle: true,
|
|
354
|
+
format: 'esm',
|
|
355
|
+
platform: 'node',
|
|
356
|
+
write: false,
|
|
357
|
+
resolveExtensions: ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs'],
|
|
358
|
+
plugins: [
|
|
359
|
+
createSwcPlugin({
|
|
360
|
+
mode: 'step',
|
|
361
|
+
entriesToBundle: [stepFile],
|
|
362
|
+
outdir,
|
|
363
|
+
}),
|
|
364
|
+
],
|
|
365
|
+
});
|
|
366
|
+
expect(result.errors).toHaveLength(0);
|
|
367
|
+
const output = result.outputFiles[0].text;
|
|
368
|
+
expect(output).not.toContain('from-helper');
|
|
369
|
+
expect(output).toMatch(/from\s+["'][^"']*shared\/constants\.ts["']/);
|
|
370
|
+
});
|
|
371
|
+
it('keeps ordinary package dependencies external when reachable from a bundled step', async () => {
|
|
372
|
+
const outdir = join(testRoot, 'out');
|
|
373
|
+
const stepFile = join(testRoot, 'server', 'workflows', 'my-workflow.ts');
|
|
374
|
+
const pkgDir = join(testRoot, 'node_modules', 'plain-pkg');
|
|
375
|
+
const pkgIndex = join(pkgDir, 'index.js');
|
|
376
|
+
writeFile(join(pkgDir, 'package.json'), JSON.stringify({ name: 'plain-pkg', main: 'index.js' }));
|
|
377
|
+
writeFile(pkgIndex, `export const value = "from-package";`);
|
|
378
|
+
writeFile(stepFile, `import { value } from 'plain-pkg';\nexport async function myStep() {\n 'use step';\n return value;\n}`);
|
|
379
|
+
const state = {
|
|
380
|
+
discoveredSteps: new Set(),
|
|
381
|
+
discoveredWorkflows: new Set(),
|
|
382
|
+
discoveredSerdeFiles: new Set(),
|
|
383
|
+
};
|
|
384
|
+
await esbuild.build({
|
|
385
|
+
entryPoints: [stepFile],
|
|
386
|
+
absWorkingDir: testRoot,
|
|
387
|
+
bundle: true,
|
|
388
|
+
format: 'esm',
|
|
389
|
+
platform: 'node',
|
|
390
|
+
write: false,
|
|
391
|
+
plugins: [createDiscoverEntriesPlugin(state, testRoot)],
|
|
392
|
+
});
|
|
393
|
+
const result = await esbuild.build({
|
|
394
|
+
entryPoints: [stepFile],
|
|
395
|
+
absWorkingDir: testRoot,
|
|
396
|
+
outdir,
|
|
397
|
+
bundle: true,
|
|
398
|
+
format: 'esm',
|
|
399
|
+
platform: 'node',
|
|
400
|
+
write: false,
|
|
401
|
+
plugins: [
|
|
402
|
+
createSwcPlugin({
|
|
403
|
+
mode: 'step',
|
|
404
|
+
entriesToBundle: [stepFile],
|
|
405
|
+
outdir,
|
|
406
|
+
bundleTransitiveLocalStepDependencies: true,
|
|
407
|
+
}),
|
|
408
|
+
],
|
|
409
|
+
});
|
|
410
|
+
expect(result.errors).toHaveLength(0);
|
|
411
|
+
const output = result.outputFiles[0].text;
|
|
412
|
+
expect(output).toMatch(/from\s+["']plain-pkg["']/);
|
|
413
|
+
expect(output).not.toContain('from-package');
|
|
414
|
+
});
|
|
415
|
+
it('bundles package parents when they lead to discovered workflow-related entries', async () => {
|
|
416
|
+
const outdir = join(testRoot, 'out');
|
|
417
|
+
const stepFile = join(testRoot, 'server', 'workflows', 'my-workflow.ts');
|
|
418
|
+
const pkgDir = join(testRoot, 'node_modules', 'workflow-pkg');
|
|
419
|
+
const pkgIndex = join(pkgDir, 'index.js');
|
|
420
|
+
const pkgSerde = join(pkgDir, 'serde.js');
|
|
421
|
+
writeFile(join(pkgDir, 'package.json'), JSON.stringify({ name: 'workflow-pkg', main: 'index.js' }));
|
|
422
|
+
writeFile(pkgSerde, `export const value = "from-serde";`);
|
|
423
|
+
writeFile(pkgIndex, `export { value } from './serde.js';`);
|
|
424
|
+
writeFile(stepFile, `import { value } from 'workflow-pkg';\nexport async function myStep() {\n 'use step';\n return value;\n}`);
|
|
425
|
+
const state = {
|
|
426
|
+
discoveredSteps: new Set(),
|
|
427
|
+
discoveredWorkflows: new Set(),
|
|
428
|
+
discoveredSerdeFiles: new Set(),
|
|
429
|
+
};
|
|
430
|
+
await esbuild.build({
|
|
431
|
+
entryPoints: [stepFile],
|
|
432
|
+
absWorkingDir: testRoot,
|
|
433
|
+
bundle: true,
|
|
434
|
+
format: 'esm',
|
|
435
|
+
platform: 'node',
|
|
436
|
+
write: false,
|
|
437
|
+
plugins: [createDiscoverEntriesPlugin(state, testRoot)],
|
|
438
|
+
});
|
|
439
|
+
const result = await esbuild.build({
|
|
440
|
+
entryPoints: [stepFile],
|
|
441
|
+
absWorkingDir: testRoot,
|
|
442
|
+
outdir,
|
|
443
|
+
bundle: true,
|
|
444
|
+
format: 'esm',
|
|
445
|
+
platform: 'node',
|
|
446
|
+
write: false,
|
|
447
|
+
plugins: [
|
|
448
|
+
createSwcPlugin({
|
|
449
|
+
mode: 'step',
|
|
450
|
+
entriesToBundle: [stepFile, pkgSerde],
|
|
451
|
+
outdir,
|
|
452
|
+
}),
|
|
453
|
+
],
|
|
454
|
+
});
|
|
455
|
+
expect(result.errors).toHaveLength(0);
|
|
456
|
+
const output = result.outputFiles[0].text;
|
|
457
|
+
expect(output).toContain('from-serde');
|
|
458
|
+
expect(output).not.toMatch(/from\s+["']workflow-pkg["']/);
|
|
459
|
+
});
|
|
184
460
|
});
|
|
185
461
|
describe('createSwcPlugin sideEffectEntries', () => {
|
|
186
462
|
let testRoot;
|
|
@@ -490,4 +766,4 @@ describe('createSwcPlugin projectRoot', () => {
|
|
|
490
766
|
expect(applySwcTransformMock).toHaveBeenCalledWith('src/internal/message/workflow/handle-message.ts', expect.stringContaining('"use workflow"'), 'workflow', fixture.workflowFile, fixture.packageRoot);
|
|
491
767
|
});
|
|
492
768
|
});
|
|
493
|
-
//# sourceMappingURL=swc-esbuild-plugin.test.js.map
|
|
769
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3djLWVzYnVpbGQtcGx1Z2luLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc3djLWVzYnVpbGQtcGx1Z2luLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxXQUFXLEVBQ1gsWUFBWSxFQUNaLE1BQU0sRUFDTixhQUFhLEdBQ2QsTUFBTSxTQUFTLENBQUM7QUFDakIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNqQyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUMxQyxPQUFPLEtBQUssT0FBTyxNQUFNLFNBQVMsQ0FBQztBQUNuQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFFekUsTUFBTSxFQUFFLHFCQUFxQixFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELHFCQUFxQixFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Q0FDL0IsQ0FBQyxDQUFDLENBQUM7QUFFSixFQUFFLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDekMsaUJBQWlCLEVBQUUscUJBQXFCO0NBQ3pDLENBQUMsQ0FBQyxDQUFDO0FBRUosT0FBTyxFQUNMLDJCQUEyQixFQUMzQixhQUFhLEdBQ2QsTUFBTSxzQ0FBc0MsQ0FBQztBQUM5QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFMUQsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFFMUMsU0FBUyxTQUFTLENBQUMsSUFBWSxFQUFFLFFBQVEsR0FBRyxFQUFFO0lBQzVDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFD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LGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLEVBQ3pDLFVBQVUsRUFDVixPQUFPLENBQUMsWUFBWSxFQUNwQixPQUFPLENBQUMsT0FBTyxDQUNoQixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMscURBQXFELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDbkUsTUFBTSxPQUFPLEdBQUcsWUFBWSxFQUFFLENBQUM7UUFFL0IsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsS0FBSyxDQUFDO1lBQ2pDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUM7WUFDbkMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxXQUFXO1lBQ2xDLE1BQU0sRUFBRSxJQUFJO1lBQ1osTUFBTSxFQUFFLEtBQUs7WUFDYixRQUFRLEVBQUUsTUFBTTtZQUNoQixLQUFLLEVBQUUsS0FBSztZQUNaLE9BQU8sRUFBRTtnQkFDUCxlQUFlLENBQUM7b0JBQ2QsSUFBSSxFQUFFLFVBQVU7b0JBQ2hCLGdCQUFnQixFQUFFLEVBQUU7aUJBQ3JCLENBQUM7YUFDSDtTQUNGLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLG9CQUFvQixDQUNoRCxpREFBaUQsRUFDakQsTUFBTSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLEVBQ3pDLFVBQVUsRUFDVixPQUFPLENBQUMsWUFBWSxFQUNwQixPQUFPLENBQUMsV0FBVyxDQUNwQixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIG1rZGlyU3luYyxcbiAgbWtkdGVtcFN5bmMsXG4gIHJlYWxwYXRoU3luYyxcbiAgcm1TeW5jLFxuICB3cml0ZUZpbGVTeW5jLFxufSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHsgZGlybmFtZSwgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgKiBhcyBlc2J1aWxkIGZyb20gJ2VzYnVpbGQnO1xuaW1wb3J0IHsgYWZ0ZXJFYWNoLCBiZWZvcmVFYWNoLCBkZXNjcmliZSwgZXhwZWN0LCBpdCwgdmkgfSBmcm9tICd2aXRlc3QnO1xuXG5jb25zdCB7IGFwcGx5U3djVHJhbnNmb3JtTW9jayB9ID0gdmkuaG9pc3RlZCgoKSA9PiAoe1xuICBhcHBseVN3Y1RyYW5zZm9ybU1vY2s6IHZpLmZuKCksXG59KSk7XG5cbnZpLm1vY2soJy4vYXBwbHktc3djLXRyYW5zZm9ybS5qcycsICgpID0+ICh7XG4gIGFwcGx5U3djVHJhbnNmb3JtOiBhcHBseVN3Y1RyYW5zZm9ybU1vY2ssXG59KSk7XG5cbmltcG9ydCB7XG4gIGNyZWF0ZURpc2NvdmVyRW50cmllc1BsdWdpbixcbiAgaW1wb3J0UGFyZW50cyxcbn0gZnJvbSAnLi9kaXNjb3Zlci1lbnRyaWVzLWVzYnVpbGQtcGx1Z2luLmpzJztcbmltcG9ydCB7IGNyZWF0ZVN3Y1BsdWdpbiB9IGZyb20gJy4vc3djLWVzYnVpbGQtcGx1Z2luLmpzJztcblxuY29uc3QgcmVhbFRtcGRpciA9IHJlYWxwYXRoU3luYyh0bXBkaXIoKSk7XG5cbmZ1bmN0aW9uIHdyaXRlRmlsZShwYXRoOiBzdHJpbmcsIGNvbnRlbnRzID0gJycpOiB2b2lkIHtcbiAgbWtkaXJTeW5jKGRpcm5hbWUocGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB3cml0ZUZpbGVTeW5jKHBhdGgsIGNvbnRlbnRzLCAndXRmLTgnKTtcbn1cblxuZGVzY3JpYmUoJ2NyZWF0ZVN3Y1BsdWdpbiBleHRlcm5hbGl6ZU5vblN0ZXBzJywgKCkgPT4ge1xuICBsZXQgdGVzdFJvb3Q6IHN0cmluZztcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICB0ZXN0Um9vdCA9IG1rZHRlbXBTeW5jKGpvaW4ocmVhbFRtcGRpciwgJ3dvcmtmbG93LXN3Yy1wbHVnaW4tJykpO1xuICAgIGltcG9ydFBhcmVudHMuY2xlYXIoKTtcbiAgICBhcHBseVN3Y1RyYW5zZm9ybU1vY2subW9ja1Jlc2V0KCk7XG4gICAgYXBwbHlTd2NUcmFuc2Zvcm1Nb2NrLm1vY2tJbXBsZW1lbnRhdGlvbihcbiAgICAgIGFzeW5jIChfZmlsZW5hbWU6IHN0cmluZywgc291cmNlOiBzdHJpbmcpID0+ICh7XG4gICAgICAgIGNvZGU6IHNvdXJjZSxcbiAgICAgICAgd29ya2Zsb3dNYW5pZmVzdDoge30sXG4gICAgICB9KVxuICAgICk7XG4gIH0pO1xuXG4gIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgaW1wb3J0UGFyZW50cy5jbGVhcigpO1xuICAgIHJtU3luYyh0ZXN0Um9vdCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB9KTtcblxuICBpdC5lYWNoKFtcbiAgICB7IGlucHV0RXh0OiAnLnRzJywgb3V0cHV0RXh0OiAnLmpzJyB9LFxuICAgIHsgaW5wdXRFeHQ6ICcudHN4Jywgb3V0cHV0RXh0OiAnLmpzJyB9LFxuICAgIHsgaW5wdXRFeHQ6ICcubXRzJywgb3V0cHV0RXh0OiAnLm1qcycgfSxcbiAgICB7IGlucHV0RXh0OiAnLmN0cycsIG91dHB1dEV4dDogJy5janMnIH0sXG4gIF0pKCdyZXdyaXRlcyBleHRlcm5hbGl6ZWQgJGlucHV0RXh0IGltcG9ydHMgdG8gJG91dHB1dEV4dCB3aGVuIHJld3JpdGVUc0V4dGVuc2lvbnMgaXMgZW5hYmxlZCcsIGFzeW5jICh7XG4gICAgaW5wdXRFeHQsXG4gICAgb3V0cHV0RXh0LFxuICB9KSA9PiB7XG4gICAgY29uc3Qgb3V0ZGlyID0gam9pbih0ZXN0Um9vdCwgJ291dCcpO1xuICAgIGNvbnN0IHNyY0RpciA9IGpvaW4odGVzdFJvb3QsICdzcmMnKTtcbiAgICBjb25zdCBzdGVwRmlsZSA9IGpvaW4oc3JjRGlyLCAnc3RlcC50cycpO1xuXG4gICAgd3JpdGVGaWxlKGpvaW4oc3JjRGlyLCBgZGVwJHtpbnB1dEV4dH1gKSwgJ2V4cG9ydCBjb25zdCBkZXAgPSB7fTsnKTtcbiAgICB3cml0ZUZpbGUoc3RlcEZpbGUsIGBpbXBvcnQgeyBkZXAgfSBmcm9tICcuL2RlcCc7XFxuY29uc29sZS5sb2coZGVwKTtgKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVzYnVpbGQuYnVpbGQoe1xuICAgICAgZW50cnlQb2ludHM6IFtzdGVwRmlsZV0sXG4gICAgICBhYnNXb3JraW5nRGlyOiB0ZXN0Um9vdCxcbiAgICAgIG91dGRpcixcbiAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgIGZvcm1hdDogJ2VzbScsXG4gICAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgICAgd3JpdGU6IGZhbHNlLFxuICAgICAgcGx1Z2luczogW1xuICAgICAgICBjcmVhdGVTd2NQbHVnaW4oe1xuICAgICAgICAgIG1vZGU6ICdzdGVwJyxcbiAgICAgICAgICBlbnRyaWVzVG9CdW5kbGU6IFtzdGVwRmlsZV0sXG4gICAgICAgICAgb3V0ZGlyLFxuICAgICAgICAgIHJld3JpdGVUc0V4dGVuc2lvbnM6IHRydWUsXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGV4cGVjdChyZXN1bHQuZXJyb3JzKS50b0hhdmVMZW5ndGgoMCk7XG4gICAgY29uc3Qgb3V0cHV0ID0gcmVzdWx0Lm91dHB1dEZpbGVzWzBdLnRleHQ7XG4gICAgZXhwZWN0KG91dHB1dCkudG9Db250YWluKGAvZGVwJHtvdXRwdXRFeHR9YCk7XG4gICAgZXhwZWN0KG91dHB1dCkubm90LnRvQ29udGFpbihgL2RlcCR7aW5wdXRFeHR9YCk7XG4gIH0pO1xuXG4gIGl0KCdidW5kbGVzIHBhdGgtYWxpYXNlZCBwcm9qZWN0LWxvY2FsIGltcG9ydHMgaW5saW5lJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIEFsaWFzZWQgcHJvamVjdC1sb2NhbCBmaWxlcyBtdXN0IGJlIGJ1bmRsZWQgaW5saW5lIChub3QgZXh0ZXJuYWxpemVkXG4gICAgLy8gYXMgcmVsYXRpdmUgcGF0aHMpIGJlY2F1c2UgdGhlaXIgc291cmNlIG9uIGRpc2sgbWF5IGNvbnRhaW4gZnVydGhlclxuICAgIC8vIGFsaWFzIGltcG9ydHMgdGhhdCBOb2RlJ3MgRVNNIGxvYWRlciBjYW5ub3QgcmVzb2x2ZSBhdCBydW50aW1lLlxuICAgIC8vIFNlZSBwYWNrYWdlcy9idWlsZGVycy9zcmMvc3djLWVzYnVpbGQtcGx1Z2luLnRzIGZvciBmdWxsIHJlYXNvbmluZy5cbiAgICBjb25zdCBvdXRkaXIgPSBqb2luKHRlc3RSb290LCAnb3V0Jyk7XG4gICAgY29uc3Qgc3JjRGlyID0gam9pbih0ZXN0Um9vdCwgJ3NyYycpO1xuICAgIGNvbnN0IGxpYkRpciA9IGpvaW4oc3JjRGlyLCAnbGliJyk7XG4gICAgY29uc3Qgc3RlcEZpbGUgPSBqb2luKHNyY0RpciwgJ3N0ZXAudHMnKTtcblxuICAgIHdyaXRlRmlsZShcbiAgICAgIGpvaW4obGliRGlyLCAnY29uZmlnLnRzJyksXG4gICAgICAnZXhwb3J0IGNvbnN0IGNvbmZpZyA9IHsgdmFsdWU6IFwiaGVsbG8tZnJvbS1jb25maWdcIiB9OydcbiAgICApO1xuICAgIHdyaXRlRmlsZShcbiAgICAgIHN0ZXBGaWxlLFxuICAgICAgYGltcG9ydCB7IGNvbmZpZyB9IGZyb20gJ0AvbGliL2NvbmZpZyc7XFxuY29uc29sZS5sb2coY29uZmlnKTtgXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVzYnVpbGQuYnVpbGQoe1xuICAgICAgZW50cnlQb2ludHM6IFtzdGVwRmlsZV0sXG4gICAgICBhYnNXb3JraW5nRGlyOiB0ZXN0Um9vdCxcbiAgICAgIG91dGRpcixcbiAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgIGZvcm1hdDogJ2VzbScsXG4gICAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgICAgd3JpdGU6IGZhbHNlLFxuICAgICAgYWxpYXM6IHsgJ0AnOiBzcmNEaXIgfSxcbiAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgY3JlYXRlU3djUGx1Z2luKHtcbiAgICAgICAgICBtb2RlOiAnc3RlcCcsXG4gICAgICAgICAgZW50cmllc1RvQnVuZGxlOiBbc3RlcEZpbGVdLFxuICAgICAgICAgIG91dGRpcixcbiAgICAgICAgICByZXdyaXRlVHNFeHRlbnNpb25zOiB0cnVlLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBleHBlY3QocmVzdWx0LmVycm9ycykudG9IYXZlTGVuZ3RoKDApO1xuICAgIGNvbnN0IG91dHB1dCA9IHJlc3VsdC5vdXRwdXRGaWxlc1swXS50ZXh0O1xuICAgIC8vIFRoZSBhbGlhc2VkIGhlbHBlciBzaG91bGQgYmUgYnVuZGxlZCBpbmxpbmUgKGl0cyBjb250ZW50IGlzIGluIHRoZVxuICAgIC8vIG91dHB1dCksIG5vdCBleHRlcm5hbGl6ZWQgYXMgYSByZWxhdGl2ZSBwYXRoIG9yIGxlZnQgYXMgYSBiYXJlIGFsaWFzLlxuICAgIGV4cGVjdChvdXRwdXQpLnRvQ29udGFpbignaGVsbG8tZnJvbS1jb25maWcnKTtcbiAgICBleHBlY3Qob3V0cHV0KS5ub3QudG9Db250YWluKCdAL2xpYi9jb25maWcnKTtcbiAgICBleHBlY3Qob3V0cHV0KS5ub3QudG9NYXRjaCgvZnJvbVxccytbXCInXVteXCInXSpcXC9saWJcXC9jb25maWdcXC4oanN8dHMpW1wiJ10vKTtcbiAgfSk7XG5cbiAgaXQoJ2J1bmRsZXMgdHJhbnNpdGl2ZSBhbGlhc2VkIGltcG9ydHMgaW5zaWRlIGFsaWFzZWQgaGVscGVycyAoTXV4IHNlbGYtcmVmZXJlbmNpbmcgcGFja2FnZSByZWdyZXNzaW9uKScsIGFzeW5jICgpID0+IHtcbiAgICAvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9tdXhpbmMvYWkvcHVsbC8xOTMuXG4gICAgLy9cbiAgICAvLyBBIHBhY2thZ2Ugc2VsZi1yZWZlcmVuY2VzIGl0cyBvd24gc3VicGF0aCB2aWEgdHNjb25maWcgYHBhdGhzYCAoZS5nLlxuICAgIC8vIGBAbXktcGtnL2xpYi9mb29gIOKGkiBgc3JjL2xpYi9mb28udHNgKS4gQSBzdGVwIGZpbGUgaW1wb3J0cyBhIGhlbHBlclxuICAgIC8vIHZpYSB0aGUgYWxpYXMsIGFuZCB0aGF0IGhlbHBlciBpbXBvcnRzIGFub3RoZXIgaGVscGVyIHZpYSB0aGUgYWxpYXMuXG4gICAgLy9cbiAgICAvLyBQcmV2aW91c2x5IHRoZSBoZWxwZXJzIHdlcmUgZXh0ZXJuYWxpemVkIGFzIHJlbGF0aXZlIHBhdGhzLCBidXQgdGhlaXJcbiAgICAvLyBzb3VyY2Ugb24gZGlzayBzdGlsbCBjb250YWluZWQgYGltcG9ydCBcIkBteS1wa2cvbGliLy4uLlwiYC4gQXQgcnVudGltZSxcbiAgICAvLyBOb2RlJ3MgRVNNIGxvYWRlciBkaWRuJ3Qga25vdyBhYm91dCB0c2NvbmZpZyBwYXRocywgZmVsbCB0aHJvdWdoIHRvXG4gICAgLy8gdGhlIHBhY2thZ2UncyBgZXhwb3J0c2AgbWFwLCBhbmQgdGhyZXcgYFBhY2thZ2Ugc3VicGF0aCAuLi4gaXMgbm90XG4gICAgLy8gZGVmaW5lZCBieSBcImV4cG9ydHNcImAuXG4gICAgLy9cbiAgICAvLyBXaXRoIHRoZSBmaXgsIGFsaWFzZWQgcHJvamVjdC1sb2NhbCBmaWxlcyBhcmUgYnVuZGxlZCBpbmxpbmUsIHNvXG4gICAgLy8gdGhlaXIgYWxpYXMgaW1wb3J0cyBhcmUgcmVzb2x2ZWQgYXQgYnVpbGQgdGltZS5cbiAgICBjb25zdCBvdXRkaXIgPSBqb2luKHRlc3RSb290LCAnb3V0Jyk7XG4gICAgY29uc3Qgc3JjRGlyID0gam9pbih0ZXN0Um9vdCwgJ3NyYycpO1xuICAgIGNvbnN0IGxpYkRpciA9IGpvaW4oc3JjRGlyLCAnbGliJyk7XG4gICAgY29uc3Qgc3RlcEZpbGUgPSBqb2luKHNyY0RpciwgJ3N0ZXAudHMnKTtcblxuICAgIHdyaXRlRmlsZShcbiAgICAgIGpvaW4obGliRGlyLCAncHJvdmlkZXJzLnRzJyksXG4gICAgICAnZXhwb3J0IGNvbnN0IHByb3ZpZGVyTmFtZSA9IFwiYW50aHJvcGljXCI7J1xuICAgICk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgam9pbihsaWJEaXIsICdjbGllbnQtZmFjdG9yeS50cycpLFxuICAgICAgLy8gSGVscGVyIHVzZXMgdGhlIHNhbWUgYWxpYXMgdG8gcmVhY2ggYSBzaWJsaW5nIOKAlCB0aGlzIGlzIHRoZSBjYXNlXG4gICAgICAvLyB0aGF0IGJyb2tlIHRoZSBNdXggYnVpbGQgd2l0aCB3b3JrZmxvdyA+PSA0LjIuMC1iZXRhLjc4LlxuICAgICAgYGltcG9ydCB7IHByb3ZpZGVyTmFtZSB9IGZyb20gJ0BteS1wa2cvbGliL3Byb3ZpZGVycyc7XG5leHBvcnQgY29uc3QgY2xpZW50ID0geyBwcm92aWRlcjogcHJvdmlkZXJOYW1lIH07YFxuICAgICk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgc3RlcEZpbGUsXG4gICAgICBgaW1wb3J0IHsgY2xpZW50IH0gZnJvbSAnQG15LXBrZy9saWIvY2xpZW50LWZhY3RvcnknO1xcbmNvbnNvbGUubG9nKGNsaWVudCk7YFxuICAgICk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIGVudHJ5UG9pbnRzOiBbc3RlcEZpbGVdLFxuICAgICAgYWJzV29ya2luZ0RpcjogdGVzdFJvb3QsXG4gICAgICBvdXRkaXIsXG4gICAgICBidW5kbGU6IHRydWUsXG4gICAgICBmb3JtYXQ6ICdlc20nLFxuICAgICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICAgIHdyaXRlOiBmYWxzZSxcbiAgICAgIGFsaWFzOiB7ICdAbXktcGtnJzogc3JjRGlyIH0sXG4gICAgICBwbHVnaW5zOiBbXG4gICAgICAgIGNyZWF0ZVN3Y1BsdWdpbih7XG4gICAgICAgICAgbW9kZTogJ3N0ZXAnLFxuICAgICAgICAgIGVudHJpZXNUb0J1bmRsZTogW3N0ZXBGaWxlXSxcbiAgICAgICAgICBvdXRkaXIsXG4gICAgICAgICAgcmV3cml0ZVRzRXh0ZW5zaW9uczogdHJ1ZSxcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KHJlc3VsdC5lcnJvcnMpLnRvSGF2ZUxlbmd0aCgwKTtcbiAgICBjb25zdCBvdXRwdXQgPSByZXN1bHQub3V0cHV0RmlsZXNbMF0udGV4dDtcbiAgICAvLyBCb3RoIGhlbHBlcnMgc2hvdWxkIGJlIGJ1bmRsZWQgaW5saW5lIOKAlCBubyBhbGlhc2VkIHNwZWNpZmllcnMgc2hvdWxkXG4gICAgLy8gbGVhayBpbnRvIHRoZSBvdXRwdXQsIHdoZXJlIE5vZGUncyBFU00gbG9hZGVyIHdvdWxkIGNob2tlIG9uIHRoZW0uXG4gICAgZXhwZWN0KG91dHB1dCkudG9Db250YWluKCdhbnRocm9waWMnKTtcbiAgICBleHBlY3Qob3V0cHV0KS5ub3QudG9Db250YWluKCdAbXktcGtnL2xpYi9wcm92aWRlcnMnKTtcbiAgICBleHBlY3Qob3V0cHV0KS5ub3QudG9Db250YWluKCdAbXktcGtnL2xpYi9jbGllbnQtZmFjdG9yeScpO1xuICB9KTtcblxuICBpdCgnZG9lcyBub3QgcmVsYXRpdml6ZSBOb2RlLmpzIGJ1aWx0aW4gaW1wb3J0cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBvdXRkaXIgPSBqb2luKHRlc3RSb290LCAnb3V0Jyk7XG4gICAgY29uc3Qgc3JjRGlyID0gam9pbih0ZXN0Um9vdCwgJ3NyYycpO1xuICAgIGNvbnN0IHN0ZXBGaWxlID0gam9pbihzcmNEaXIsICdzdGVwLnRzJyk7XG5cbiAgICB3cml0ZUZpbGUoXG4gICAgICBzdGVwRmlsZSxcbiAgICAgIGBpbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnY3J5cHRvJztcXG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcXG5jb25zb2xlLmxvZyhjcmVhdGVIYXNoLCBqb2luKTtgXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVzYnVpbGQuYnVpbGQoe1xuICAgICAgZW50cnlQb2ludHM6IFtzdGVwRmlsZV0sXG4gICAgICBhYnNXb3JraW5nRGlyOiB0ZXN0Um9vdCxcbiAgICAgIG91dGRpcixcbiAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgIGZvcm1hdDogJ2VzbScsXG4gICAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgICAgd3JpdGU6IGZhbHNlLFxuICAgICAgcGx1Z2luczogW1xuICAgICAgICBjcmVhdGVTd2NQbHVnaW4oe1xuICAgICAgICAgIG1vZGU6ICdzdGVwJyxcbiAgICAgICAgICBlbnRyaWVzVG9CdW5kbGU6IFtzdGVwRmlsZV0sXG4gICAgICAgICAgb3V0ZGlyLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBleHBlY3QocmVzdWx0LmVycm9ycykudG9IYXZlTGVuZ3RoKDApO1xuICAgIGNvbnN0IG91dHB1dCA9IHJlc3VsdC5vdXRwdXRGaWxlc1swXS50ZXh0O1xuICAgIC8vIEJ1aWx0aW5zIHNob3VsZCByZW1haW4gYXMgYmFyZSBzcGVjaWZpZXJzLCBub3QgcmVsYXRpdml6ZWQgcGF0aHNcbiAgICBleHBlY3Qob3V0cHV0KS50b01hdGNoKC9mcm9tXFxzK1tcIiddY3J5cHRvW1wiJ10vKTtcbiAgICBleHBlY3Qob3V0cHV0KS50b01hdGNoKC9mcm9tXFxzK1tcIiddbm9kZTpwYXRoW1wiJ10vKTtcbiAgICBleHBlY3Qob3V0cHV0KS5ub3QudG9NYXRjaCgvZnJvbVxccytbXCInXVxcLi4qY3J5cHRvW1wiJ10vKTtcbiAgICBleHBlY3Qob3V0cHV0KS5ub3QudG9NYXRjaCgvZnJvbVxccytbXCInXVxcLi4qbm9kZTpwYXRoW1wiJ10vKTtcbiAgfSk7XG5cbiAgaXQoJ2RvZXMgbm90IGV4dGVybmFsaXplIGFsaWFzZWQgaW1wb3J0cyB0aGF0IHJlc29sdmUgaW50byBub2RlX21vZHVsZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgb3V0ZGlyID0gam9pbih0ZXN0Um9vdCwgJ291dCcpO1xuICAgIGNvbnN0IHNyY0RpciA9IGpvaW4odGVzdFJvb3QsICdzcmMnKTtcbiAgICBjb25zdCBzdGVwRmlsZSA9IGpvaW4oc3JjRGlyLCAnc3RlcC50cycpO1xuICAgIGNvbnN0IG5vZGVNb2R1bGVzRGlyID0gam9pbih0ZXN0Um9vdCwgJ25vZGVfbW9kdWxlcycsICdzb21lLXBrZycpO1xuXG4gICAgd3JpdGVGaWxlKGpvaW4obm9kZU1vZHVsZXNEaXIsICdpbmRleC5qcycpLCAnZXhwb3J0IGNvbnN0IHBrZyA9IFwiaGVsbG9cIjsnKTtcbiAgICB3cml0ZUZpbGUoc3RlcEZpbGUsIGBpbXBvcnQgeyBwa2cgfSBmcm9tICdAcGtnJztcXG5jb25zb2xlLmxvZyhwa2cpO2ApO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXNidWlsZC5idWlsZCh7XG4gICAgICBlbnRyeVBvaW50czogW3N0ZXBGaWxlXSxcbiAgICAgIGFic1dvcmtpbmdEaXI6IHRlc3RSb290LFxuICAgICAgb3V0ZGlyLFxuICAgICAgYnVuZGxlOiB0cnVlLFxuICAgICAgZm9ybWF0OiAnZXNtJyxcbiAgICAgIHBsYXRmb3JtOiAnbm9kZScsXG4gICAgICB3cml0ZTogZmFsc2UsXG4gICAgICBhbGlhczogeyAnQHBrZyc6IGpvaW4obm9kZU1vZHVsZXNEaXIsICdpbmRleC5qcycpIH0sXG4gICAgICBwbHVnaW5zOiBbXG4gICAgICAgIGNyZWF0ZVN3Y1BsdWdpbih7XG4gICAgICAgICAgbW9kZTogJ3N0ZXAnLFxuICAgICAgICAgIGVudHJpZXNUb0J1bmRsZTogW3N0ZXBGaWxlXSxcbiAgICAgICAgICBvdXRkaXIsXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGV4cGVjdChyZXN1bHQuZXJyb3JzKS50b0hhdmVMZW5ndGgoMCk7XG4gICAgY29uc3Qgb3V0cHV0ID0gcmVzdWx0Lm91dHB1dEZpbGVzWzBdLnRleHQ7XG4gICAgLy8gU2hvdWxkIGJlIGJ1bmRsZWQgKGlubGluZWQpLCBub3QgZXh0ZXJuYWxpemVkIGFzIGEgcmVsYXRpdmUgbm9kZV9tb2R1bGVzIHBhdGhcbiAgICBleHBlY3Qob3V0cHV0KS50b0NvbnRhaW4oJ2hlbGxvJyk7XG4gICAgZXhwZWN0KG91dHB1dCkubm90LnRvTWF0Y2goL2Zyb21cXHMrW1wiJ10uKm5vZGVfbW9kdWxlcy8pO1xuICB9KTtcblxuICBpdCgnZXh0ZXJuYWxpemVzIG5lc3RlZCBiYXJlIHBhY2thZ2UgaW1wb3J0cyB0aGF0IG9ubHkgcmVzb2x2ZSBmcm9tIGEgYnVuZGxlZCBwYWNrYWdlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG91dGRpciA9IGpvaW4odGVzdFJvb3QsICdvdXQnKTtcbiAgICBjb25zdCBzcmNEaXIgPSBqb2luKHRlc3RSb290LCAnc3JjJyk7XG4gICAgY29uc3Qgc3RlcEZpbGUgPSBqb2luKHNyY0RpciwgJ3N0ZXAudHMnKTtcbiAgICBjb25zdCBwYXJlbnRQa2dEaXIgPSBqb2luKHRlc3RSb290LCAnbm9kZV9tb2R1bGVzJywgJ3BhcmVudC1wa2cnKTtcbiAgICBjb25zdCBwYXJlbnRQa2dJbmRleCA9IGpvaW4ocGFyZW50UGtnRGlyLCAnaW5kZXguanMnKTtcbiAgICBjb25zdCBuYXRpdmVQa2dEaXIgPSBqb2luKHBhcmVudFBrZ0RpciwgJ25vZGVfbW9kdWxlcycsICdvcHRpb25hbC1uYXRpdmUnKTtcblxuICAgIHdyaXRlRmlsZShcbiAgICAgIGpvaW4ocGFyZW50UGtnRGlyLCAncGFja2FnZS5qc29uJyksXG4gICAgICBKU09OLnN0cmluZ2lmeSh7IG5hbWU6ICdwYXJlbnQtcGtnJywgbWFpbjogJ2luZGV4LmpzJyB9KVxuICAgICk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgcGFyZW50UGtnSW5kZXgsXG4gICAgICBgY29uc3QgbmF0aXZlID0gcmVxdWlyZSgnb3B0aW9uYWwtbmF0aXZlJyk7XFxuZXhwb3J0cy52YWx1ZSA9IG5hdGl2ZS52YWx1ZTtgXG4gICAgKTtcbiAgICB3cml0ZUZpbGUoXG4gICAgICBqb2luKG5hdGl2ZVBrZ0RpciwgJ3BhY2thZ2UuanNvbicpLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoeyBuYW1lOiAnb3B0aW9uYWwtbmF0aXZlJywgbWFpbjogJ2JpbmRpbmcubm9kZScgfSlcbiAgICApO1xuICAgIHdyaXRlRmlsZShqb2luKG5hdGl2ZVBrZ0RpciwgJ2JpbmRpbmcubm9kZScpLCAnJyk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgc3RlcEZpbGUsXG4gICAgICBgaW1wb3J0IHsgdmFsdWUgfSBmcm9tICdwYXJlbnQtcGtnJztcXG5jb25zb2xlLmxvZyh2YWx1ZSk7YFxuICAgICk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIGVudHJ5UG9pbnRzOiBbc3RlcEZpbGVdLFxuICAgICAgYWJzV29ya2luZ0RpcjogdGVzdFJvb3QsXG4gICAgICBvdXRkaXIsXG4gICAgICBidW5kbGU6IHRydWUsXG4gICAgICBmb3JtYXQ6ICdlc20nLFxuICAgICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICAgIHdyaXRlOiBmYWxzZSxcbiAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgY3JlYXRlU3djUGx1Z2luKHtcbiAgICAgICAgICBtb2RlOiAnc3RlcCcsXG4gICAgICAgICAgZW50cmllc1RvQnVuZGxlOiBbc3RlcEZpbGUsIHBhcmVudFBrZ0luZGV4XSxcbiAgICAgICAgICBvdXRkaXIsXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGV4cGVjdChyZXN1bHQuZXJyb3JzKS50b0hhdmVMZW5ndGgoMCk7XG4gICAgY29uc3Qgb3V0cHV0ID0gcmVzdWx0Lm91dHB1dEZpbGVzWzBdLnRleHQ7XG4gICAgZXhwZWN0KG91dHB1dCkudG9Db250YWluKCdvcHRpb25hbC1uYXRpdmUnKTtcbiAgICBleHBlY3Qob3V0cHV0KS5ub3QudG9Db250YWluKCdiaW5kaW5nLm5vZGUnKTtcbiAgfSk7XG5cbiAgaXQuZWFjaChbXG4gICAgJy50cycsXG4gICAgJy50c3gnLFxuICAgICcubXRzJyxcbiAgICAnLmN0cycsXG4gIF0pKCdwcmVzZXJ2ZXMgZXh0ZXJuYWxpemVkICVzIGV4dGVuc2lvbnMgYnkgZGVmYXVsdCcsIGFzeW5jIChpbnB1dEV4dCkgPT4ge1xuICAgIGNvbnN0IG91dGRpciA9IGpvaW4odGVzdFJvb3QsICdvdXQnKTtcbiAgICBjb25zdCBzcmNEaXIgPSBqb2luKHRlc3RSb290LCAnc3JjJyk7XG4gICAgY29uc3Qgc3RlcEZpbGUgPSBqb2luKHNyY0RpciwgJ3N0ZXAudHMnKTtcblxuICAgIHdyaXRlRmlsZShqb2luKHNyY0RpciwgYGRlcCR7aW5wdXRFeHR9YCksICdleHBvcnQgY29uc3QgZGVwID0ge307Jyk7XG4gICAgd3JpdGVGaWxlKHN0ZXBGaWxlLCBgaW1wb3J0IHsgZGVwIH0gZnJvbSAnLi9kZXAnO1xcbmNvbnNvbGUubG9nKGRlcCk7YCk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIGVudHJ5UG9pbnRzOiBbc3RlcEZpbGVdLFxuICAgICAgYWJzV29ya2luZ0RpcjogdGVzdFJvb3QsXG4gICAgICBvdXRkaXIsXG4gICAgICBidW5kbGU6IHRydWUsXG4gICAgICBmb3JtYXQ6ICdlc20nLFxuICAgICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICAgIHdyaXRlOiBmYWxzZSxcbiAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgY3JlYXRlU3djUGx1Z2luKHtcbiAgICAgICAgICBtb2RlOiAnc3RlcCcsXG4gICAgICAgICAgZW50cmllc1RvQnVuZGxlOiBbc3RlcEZpbGVdLFxuICAgICAgICAgIG91dGRpcixcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KHJlc3VsdC5lcnJvcnMpLnRvSGF2ZUxlbmd0aCgwKTtcbiAgICBjb25zdCBvdXRwdXQgPSByZXN1bHQub3V0cHV0RmlsZXNbMF0udGV4dDtcbiAgICBleHBlY3Qob3V0cHV0KS50b0NvbnRhaW4oYC9kZXAke2lucHV0RXh0fWApO1xuICB9KTtcblxuICBpdCgnYnVuZGxlcyB0cmFuc2l0aXZlIGxvY2FsIFR5cGVTY3JpcHQgZGVwZW5kZW5jaWVzIHdpdGggZXh0ZW5zaW9ubGVzcyBpbXBvcnRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG91dGRpciA9IGpvaW4odGVzdFJvb3QsICdvdXQnKTtcbiAgICBjb25zdCBzdGVwRmlsZSA9IGpvaW4odGVzdFJvb3QsICdzZXJ2ZXInLCAnd29ya2Zsb3dzJywgJ215LXdvcmtmbG93LnRzJyk7XG4gICAgY29uc3QgY29uc3RhbnRzRmlsZSA9IGpvaW4odGVzdFJvb3QsICdzaGFyZWQnLCAnY29uc3RhbnRzLnRzJyk7XG4gICAgY29uc3QgaGVscGVyc0ZpbGUgPSBqb2luKHRlc3RSb290LCAnc2hhcmVkJywgJ2hlbHBlcnMudHMnKTtcblxuICAgIHdyaXRlRmlsZShoZWxwZXJzRmlsZSwgYGV4cG9ydCBjb25zdCBIRUxQRVJfVkFMVUUgPSBcImZyb20taGVscGVyXCI7YCk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgY29uc3RhbnRzRmlsZSxcbiAgICAgIGBpbXBvcnQgeyBIRUxQRVJfVkFMVUUgfSBmcm9tICcuL2hlbHBlcnMnO1xcbmV4cG9ydCBjb25zdCBDQVRFR09SSUVTID0gW0hFTFBFUl9WQUxVRV07YFxuICAgICk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgc3RlcEZpbGUsXG4gICAgICBgaW1wb3J0IHsgQ0FURUdPUklFUyB9IGZyb20gJy4uLy4uL3NoYXJlZC9jb25zdGFudHMnO1xcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBteVN0ZXAoKSB7XFxuICAndXNlIHN0ZXAnO1xcbiAgcmV0dXJuIENBVEVHT1JJRVNbMF07XFxufWBcbiAgICApO1xuXG4gICAgY29uc3Qgc3RhdGUgPSB7XG4gICAgICBkaXNjb3ZlcmVkU3RlcHM6IG5ldyBTZXQ8c3RyaW5nPigpLFxuICAgICAgZGlzY292ZXJlZFdvcmtmbG93czogbmV3IFNldDxzdHJpbmc+KCksXG4gICAgICBkaXNjb3ZlcmVkU2VyZGVGaWxlczogbmV3IFNldDxzdHJpbmc+KCksXG4gICAgfTtcbiAgICBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIGVudHJ5UG9pbnRzOiBbc3RlcEZpbGVdLFxuICAgICAgYWJzV29ya2luZ0RpcjogdGVzdFJvb3QsXG4gICAgICBidW5kbGU6IHRydWUsXG4gICAgICBmb3JtYXQ6ICdlc20nLFxuICAgICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICAgIHdyaXRlOiBmYWxzZSxcbiAgICAgIHJlc29sdmVFeHRlbnNpb25zOiBbJy50cycsICcudHN4JywgJy5qcycsICcuanN4JywgJy5tanMnLCAnLmNqcyddLFxuICAgICAgcGx1Z2luczogW2NyZWF0ZURpc2NvdmVyRW50cmllc1BsdWdpbihzdGF0ZSwgdGVzdFJvb3QpXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVzYnVpbGQuYnVpbGQoe1xuICAgICAgZW50cnlQb2ludHM6IFtzdGVwRmlsZV0sXG4gICAgICBhYnNXb3JraW5nRGlyOiB0ZXN0Um9vdCxcbiAgICAgIG91dGRpcixcbiAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgIGZvcm1hdDogJ2VzbScsXG4gICAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgICAgd3JpdGU6IGZhbHNlLFxuICAgICAgcmVzb2x2ZUV4dGVuc2lvbnM6IFsnLnRzJywgJy50c3gnLCAnLmpzJywgJy5qc3gnLCAnLm1qcycsICcuY2pzJ10sXG4gICAgICBwbHVnaW5zOiBbXG4gICAgICAgIGNyZWF0ZVN3Y1BsdWdpbih7XG4gICAgICAgICAgbW9kZTogJ3N0ZXAnLFxuICAgICAgICAgIGVudHJpZXNUb0J1bmRsZTogW3N0ZXBGaWxlXSxcbiAgICAgICAgICBvdXRkaXIsXG4gICAgICAgICAgYnVuZGxlVHJhbnNpdGl2ZUxvY2FsU3RlcERlcGVuZGVuY2llczogdHJ1ZSxcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KHJlc3VsdC5lcnJvcnMpLnRvSGF2ZUxlbmd0aCgwKTtcbiAgICBjb25zdCBvdXRwdXQgPSByZXN1bHQub3V0cHV0RmlsZXNbMF0udGV4dDtcbiAgICBleHBlY3Qob3V0cHV0KS50b0NvbnRhaW4oJ2Zyb20taGVscGVyJyk7XG4gICAgZXhwZWN0KG91dHB1dCkubm90LnRvTWF0Y2goL2Zyb21cXHMrW1wiJ11bXlwiJ10qc2hhcmVkXFwvY29uc3RhbnRzLyk7XG4gICAgZXhwZWN0KG91dHB1dCkubm90LnRvTWF0Y2goL2Zyb21cXHMrW1wiJ11bXlwiJ10qc2hhcmVkXFwvaGVscGVycy8pO1xuICB9KTtcblxuICBpdCgnZXh0ZXJuYWxpemVzIHRyYW5zaXRpdmUgbG9jYWwgVHlwZVNjcmlwdCBkZXBlbmRlbmNpZXMgYnkgZGVmYXVsdCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBvdXRkaXIgPSBqb2luKHRlc3RSb290LCAnb3V0Jyk7XG4gICAgY29uc3Qgc3RlcEZpbGUgPSBqb2luKHRlc3RSb290LCAnc2VydmVyJywgJ3dvcmtmbG93cycsICdteS13b3JrZmxvdy50cycpO1xuICAgIGNvbnN0IGNvbnN0YW50c0ZpbGUgPSBqb2luKHRlc3RSb290LCAnc2hhcmVkJywgJ2NvbnN0YW50cy50cycpO1xuICAgIGNvbnN0IGhlbHBlcnNGaWxlID0gam9pbih0ZXN0Um9vdCwgJ3NoYXJlZCcsICdoZWxwZXJzLnRzJyk7XG5cbiAgICB3cml0ZUZpbGUoaGVscGVyc0ZpbGUsIGBleHBvcnQgY29uc3QgSEVMUEVSX1ZBTFVFID0gXCJmcm9tLWhlbHBlclwiO2ApO1xuICAgIHdyaXRlRmlsZShcbiAgICAgIGNvbnN0YW50c0ZpbGUsXG4gICAgICBgaW1wb3J0IHsgSEVMUEVSX1ZBTFVFIH0gZnJvbSAnLi9oZWxwZXJzJztcXG5leHBvcnQgY29uc3QgQ0FURUdPUklFUyA9IFtIRUxQRVJfVkFMVUVdO2BcbiAgICApO1xuICAgIHdyaXRlRmlsZShcbiAgICAgIHN0ZXBGaWxlLFxuICAgICAgYGltcG9ydCB7IENBVEVHT1JJRVMgfSBmcm9tICcuLi8uLi9zaGFyZWQvY29uc3RhbnRzJztcXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbXlTdGVwKCkge1xcbiAgJ3VzZSBzdGVwJztcXG4gIHJldHVybiBDQVRFR09SSUVTWzBdO1xcbn1gXG4gICAgKTtcblxuICAgIGNvbnN0IHN0YXRlID0ge1xuICAgICAgZGlzY292ZXJlZFN0ZXBzOiBuZXcgU2V0PHN0cmluZz4oKSxcbiAgICAgIGRpc2NvdmVyZWRXb3JrZmxvd3M6IG5ldyBTZXQ8c3RyaW5nPigpLFxuICAgICAgZGlzY292ZXJlZFNlcmRlRmlsZXM6IG5ldyBTZXQ8c3RyaW5nPigpLFxuICAgIH07XG4gICAgYXdhaXQgZXNidWlsZC5idWlsZCh7XG4gICAgICBlbnRyeVBvaW50czogW3N0ZXBGaWxlXSxcbiAgICAgIGFic1dvcmtpbmdEaXI6IHRlc3RSb290LFxuICAgICAgYnVuZGxlOiB0cnVlLFxuICAgICAgZm9ybWF0OiAnZXNtJyxcbiAgICAgIHBsYXRmb3JtOiAnbm9kZScsXG4gICAgICB3cml0ZTogZmFsc2UsXG4gICAgICByZXNvbHZlRXh0ZW5zaW9uczogWycudHMnLCAnLnRzeCcsICcuanMnLCAnLmpzeCcsICcubWpzJywgJy5janMnXSxcbiAgICAgIHBsdWdpbnM6IFtjcmVhdGVEaXNjb3ZlckVudHJpZXNQbHVnaW4oc3RhdGUsIHRlc3RSb290KV0sXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIGVudHJ5UG9pbnRzOiBbc3RlcEZpbGVdLFxuICAgICAgYWJzV29ya2luZ0RpcjogdGVzdFJvb3QsXG4gICAgICBvdXRkaXIsXG4gICAgICBidW5kbGU6IHRydWUsXG4gICAgICBmb3JtYXQ6ICdlc20nLFxuICAgICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICAgIHdyaXRlOiBmYWxzZSxcbiAgICAgIHJlc29sdmVFeHRlbnNpb25zOiBbJy50cycsICcudHN4JywgJy5qcycsICcuanN4JywgJy5tanMnLCAnLmNqcyddLFxuICAgICAgcGx1Z2luczogW1xuICAgICAgICBjcmVhdGVTd2NQbHVnaW4oe1xuICAgICAgICAgIG1vZGU6ICdzdGVwJyxcbiAgICAgICAgICBlbnRyaWVzVG9CdW5kbGU6IFtzdGVwRmlsZV0sXG4gICAgICAgICAgb3V0ZGlyLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBleHBlY3QocmVzdWx0LmVycm9ycykudG9IYXZlTGVuZ3RoKDApO1xuICAgIGNvbnN0IG91dHB1dCA9IHJlc3VsdC5vdXRwdXRGaWxlc1swXS50ZXh0O1xuICAgIGV4cGVjdChvdXRwdXQpLm5vdC50b0NvbnRhaW4oJ2Zyb20taGVscGVyJyk7XG4gICAgZXhwZWN0KG91dHB1dCkudG9NYXRjaCgvZnJvbVxccytbXCInXVteXCInXSpzaGFyZWRcXC9jb25zdGFudHNcXC50c1tcIiddLyk7XG4gIH0pO1xuXG4gIGl0KCdrZWVwcyBvcmRpbmFyeSBwYWNrYWdlIGRlcGVuZGVuY2llcyBleHRlcm5hbCB3aGVuIHJlYWNoYWJsZSBmcm9tIGEgYnVuZGxlZCBzdGVwJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG91dGRpciA9IGpvaW4odGVzdFJvb3QsICdvdXQnKTtcbiAgICBjb25zdCBzdGVwRmlsZSA9IGpvaW4odGVzdFJvb3QsICdzZXJ2ZXInLCAnd29ya2Zsb3dzJywgJ215LXdvcmtmbG93LnRzJyk7XG4gICAgY29uc3QgcGtnRGlyID0gam9pbih0ZXN0Um9vdCwgJ25vZGVfbW9kdWxlcycsICdwbGFpbi1wa2cnKTtcbiAgICBjb25zdCBwa2dJbmRleCA9IGpvaW4ocGtnRGlyLCAnaW5kZXguanMnKTtcblxuICAgIHdyaXRlRmlsZShcbiAgICAgIGpvaW4ocGtnRGlyLCAncGFja2FnZS5qc29uJyksXG4gICAgICBKU09OLnN0cmluZ2lmeSh7IG5hbWU6ICdwbGFpbi1wa2cnLCBtYWluOiAnaW5kZXguanMnIH0pXG4gICAgKTtcbiAgICB3cml0ZUZpbGUocGtnSW5kZXgsIGBleHBvcnQgY29uc3QgdmFsdWUgPSBcImZyb20tcGFja2FnZVwiO2ApO1xuICAgIHdyaXRlRmlsZShcbiAgICAgIHN0ZXBGaWxlLFxuICAgICAgYGltcG9ydCB7IHZhbHVlIH0gZnJvbSAncGxhaW4tcGtnJztcXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbXlTdGVwKCkge1xcbiAgJ3VzZSBzdGVwJztcXG4gIHJldHVybiB2YWx1ZTtcXG59YFxuICAgICk7XG5cbiAgICBjb25zdCBzdGF0ZSA9IHtcbiAgICAgIGRpc2NvdmVyZWRTdGVwczogbmV3IFNldDxzdHJpbmc+KCksXG4gICAgICBkaXNjb3ZlcmVkV29ya2Zsb3dzOiBuZXcgU2V0PHN0cmluZz4oKSxcbiAgICAgIGRpc2NvdmVyZWRTZXJkZUZpbGVzOiBuZXcgU2V0PHN0cmluZz4oKSxcbiAgICB9O1xuICAgIGF3YWl0IGVzYnVpbGQuYnVpbGQoe1xuICAgICAgZW50cnlQb2ludHM6IFtzdGVwRmlsZV0sXG4gICAgICBhYnNXb3JraW5nRGlyOiB0ZXN0Um9vdCxcbiAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgIGZvcm1hdDogJ2VzbScsXG4gICAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgICAgd3JpdGU6IGZhbHNlLFxuICAgICAgcGx1Z2luczogW2NyZWF0ZURpc2NvdmVyRW50cmllc1BsdWdpbihzdGF0ZSwgdGVzdFJvb3QpXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVzYnVpbGQuYnVpbGQoe1xuICAgICAgZW50cnlQb2ludHM6IFtzdGVwRmlsZV0sXG4gICAgICBhYnNXb3JraW5nRGlyOiB0ZXN0Um9vdCxcbiAgICAgIG91dGRpcixcbiAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgIGZvcm1hdDogJ2VzbScsXG4gICAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgICAgd3JpdGU6IGZhbHNlLFxuICAgICAgcGx1Z2luczogW1xuICAgICAgICBjcmVhdGVTd2NQbHVnaW4oe1xuICAgICAgICAgIG1vZGU6ICdzdGVwJyxcbiAgICAgICAgICBlbnRyaWVzVG9CdW5kbGU6IFtzdGVwRmlsZV0sXG4gICAgICAgICAgb3V0ZGlyLFxuICAgICAgICAgIGJ1bmRsZVRyYW5zaXRpdmVMb2NhbFN0ZXBEZXBlbmRlbmNpZXM6IHRydWUsXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGV4cGVjdChyZXN1bHQuZXJyb3JzKS50b0hhdmVMZW5ndGgoMCk7XG4gICAgY29uc3Qgb3V0cHV0ID0gcmVzdWx0Lm91dHB1dEZpbGVzWzBdLnRleHQ7XG4gICAgZXhwZWN0KG91dHB1dCkudG9NYXRjaCgvZnJvbVxccytbXCInXXBsYWluLXBrZ1tcIiddLyk7XG4gICAgZXhwZWN0KG91dHB1dCkubm90LnRvQ29udGFpbignZnJvbS1wYWNrYWdlJyk7XG4gIH0pO1xuXG4gIGl0KCdidW5kbGVzIHBhY2thZ2UgcGFyZW50cyB3aGVuIHRoZXkgbGVhZCB0byBkaXNjb3ZlcmVkIHdvcmtmbG93LXJlbGF0ZWQgZW50cmllcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBvdXRkaXIgPSBqb2luKHRlc3RSb290LCAnb3V0Jyk7XG4gICAgY29uc3Qgc3RlcEZpbGUgPSBqb2luKHRlc3RSb290LCAnc2VydmVyJywgJ3dvcmtmbG93cycsICdteS13b3JrZmxvdy50cycpO1xuICAgIGNvbnN0IHBrZ0RpciA9IGpvaW4odGVzdFJvb3QsICdub2RlX21vZHVsZXMnLCAnd29ya2Zsb3ctcGtnJyk7XG4gICAgY29uc3QgcGtnSW5kZXggPSBqb2luKHBrZ0RpciwgJ2luZGV4LmpzJyk7XG4gICAgY29uc3QgcGtnU2VyZGUgPSBqb2luKHBrZ0RpciwgJ3NlcmRlLmpzJyk7XG5cbiAgICB3cml0ZUZpbGUoXG4gICAgICBqb2luKHBrZ0RpciwgJ3BhY2thZ2UuanNvbicpLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoeyBuYW1lOiAnd29ya2Zsb3ctcGtnJywgbWFpbjogJ2luZGV4LmpzJyB9KVxuICAgICk7XG4gICAgd3JpdGVGaWxlKHBrZ1NlcmRlLCBgZXhwb3J0IGNvbnN0IHZhbHVlID0gXCJmcm9tLXNlcmRlXCI7YCk7XG4gICAgd3JpdGVGaWxlKHBrZ0luZGV4LCBgZXhwb3J0IHsgdmFsdWUgfSBmcm9tICcuL3NlcmRlLmpzJztgKTtcbiAgICB3cml0ZUZpbGUoXG4gICAgICBzdGVwRmlsZSxcbiAgICAgIGBpbXBvcnQgeyB2YWx1ZSB9IGZyb20gJ3dvcmtmbG93LXBrZyc7XFxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG15U3RlcCgpIHtcXG4gICd1c2Ugc3RlcCc7XFxuICByZXR1cm4gdmFsdWU7XFxufWBcbiAgICApO1xuXG4gICAgY29uc3Qgc3RhdGUgPSB7XG4gICAgICBkaXNjb3ZlcmVkU3RlcHM6IG5ldyBTZXQ8c3RyaW5nPigpLFxuICAgICAgZGlzY292ZXJlZFdvcmtmbG93czogbmV3IFNldDxzdHJpbmc+KCksXG4gICAgICBkaXNjb3ZlcmVkU2VyZGVGaWxlczogbmV3IFNldDxzdHJpbmc+KCksXG4gICAgfTtcbiAgICBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIGVudHJ5UG9pbnRzOiBbc3RlcEZpbGVdLFxuICAgICAgYWJzV29ya2luZ0RpcjogdGVzdFJvb3QsXG4gICAgICBidW5kbGU6IHRydWUsXG4gICAgICBmb3JtYXQ6ICdlc20nLFxuICAgICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICAgIHdyaXRlOiBmYWxzZSxcbiAgICAgIHBsdWdpbnM6IFtjcmVhdGVEaXNjb3ZlckVudHJpZXNQbHVnaW4oc3RhdGUsIHRlc3RSb290KV0sXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIGVudHJ5UG9pbnRzOiBbc3RlcEZpbGVdLFxuICAgICAgYWJzV29ya2luZ0RpcjogdGVzdFJvb3QsXG4gICAgICBvdXRkaXIsXG4gICAgICBidW5kbGU6IHRydWUsXG4gICAgICBmb3JtYXQ6ICdlc20nLFxuICAgICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICAgIHdyaXRlOiBmYWxzZSxcbiAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgY3JlYXRlU3djUGx1Z2luKHtcbiAgICAgICAgICBtb2RlOiAnc3RlcCcsXG4gICAgICAgICAgZW50cmllc1RvQnVuZGxlOiBbc3RlcEZpbGUsIHBrZ1NlcmRlXSxcbiAgICAgICAgICBvdXRkaXIsXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGV4cGVjdChyZXN1bHQuZXJyb3JzKS50b0hhdmVMZW5ndGgoMCk7XG4gICAgY29uc3Qgb3V0cHV0ID0gcmVzdWx0Lm91dHB1dEZpbGVzWzBdLnRleHQ7XG4gICAgZXhwZWN0KG91dHB1dCkudG9Db250YWluKCdmcm9tLXNlcmRlJyk7XG4gICAgZXhwZWN0KG91dHB1dCkubm90LnRvTWF0Y2goL2Zyb21cXHMrW1wiJ113b3JrZmxvdy1wa2dbXCInXS8pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnY3JlYXRlU3djUGx1Z2luIHNpZGVFZmZlY3RFbnRyaWVzJywgKCkgPT4ge1xuICBsZXQgdGVzdFJvb3Q6IHN0cmluZztcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICB0ZXN0Um9vdCA9IG1rZHRlbXBTeW5jKGpvaW4ocmVhbFRtcGRpciwgJ3dvcmtmbG93LXN3Yy1wbHVnaW4tJykpO1xuICAgIGFwcGx5U3djVHJhbnNmb3JtTW9jay5tb2NrUmVzZXQoKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICBybVN5bmModGVzdFJvb3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIEhlbHBlcjogY3JlYXRlcyBhIGZha2Ugbm9kZV9tb2R1bGVzIHBhY2thZ2Ugd2l0aCBgXCJzaWRlRWZmZWN0c1wiOiBmYWxzZWBcbiAgICogaW4gaXRzIHBhY2thZ2UuanNvbiBhbmQgYSBzaW5nbGUgZW50cnkgZmlsZSB0aGF0IGV4cG9ydHMgYSBzaWRlLWVmZmVjdGZ1bFxuICAgKiByZWdpc3RyYXRpb24gY2FsbCAoc2ltdWxhdGluZyB3aGF0IHRoZSBTV0MgdHJhbnNmb3JtIHByb2R1Y2VzKS5cbiAgICovXG4gIGZ1bmN0aW9uIGNyZWF0ZVNpZGVFZmZlY3RzRmFsc2VQYWNrYWdlKFxuICAgIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gICAgZW50cnlDb2RlOiBzdHJpbmdcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBwa2dEaXIgPSBqb2luKHRlc3RSb290LCAnbm9kZV9tb2R1bGVzJywgcGFja2FnZU5hbWUpO1xuICAgIHdyaXRlRmlsZShcbiAgICAgIGpvaW4ocGtnRGlyLCAncGFja2FnZS5qc29uJyksXG4gICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIG5hbWU6IHBhY2thZ2VOYW1lLFxuICAgICAgICB2ZXJzaW9uOiAnMS4wLjAnLFxuICAgICAgICBzaWRlRWZmZWN0czogZmFsc2UsXG4gICAgICAgIG1haW46ICdpbmRleC5qcycsXG4gICAgICB9KVxuICAgICk7XG4gICAgY29uc3QgZW50cnlQYXRoID0gam9pbihwa2dEaXIsICdpbmRleC5qcycpO1xuICAgIHdyaXRlRmlsZShlbnRyeVBhdGgsIGVudHJ5Q29kZSk7XG4gICAgcmV0dXJuIGVudHJ5UGF0aDtcbiAgfVxuXG4gIGl0KCdwcmVzZXJ2ZXMgYmFyZSBpbXBvcnRzIG9mIHNpZGVFZmZlY3RFbnRyaWVzIHBhY2thZ2VzIHdoZW4gYnVuZGxpbmcgd2l0aG91dCBlbnRyaWVzVG9CdW5kbGUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgc2lkZUVmZmVjdENvZGUgPVxuICAgICAgJ2dsb2JhbFRoaXMuX19yZWdpc3RlcmVkID0gZ2xvYmFsVGhpcy5fX3JlZ2lzdGVyZWQgfHwgW107XFxuZ2xvYmFsVGhpcy5fX3JlZ2lzdGVyZWQucHVzaChcIm15LXBrZ1wiKTsnO1xuICAgIGNvbnN0IGVudHJ5UGF0aCA9IGNyZWF0ZVNpZGVFZmZlY3RzRmFsc2VQYWNrYWdlKFxuICAgICAgJ215LXNpZGUtZWZmZWN0LXBrZycsXG4gICAgICBzaWRlRWZmZWN0Q29kZVxuICAgICk7XG5cbiAgICAvLyBTV0MgbW9jazogcmV0dXJuIHRoZSBjb2RlIHVuY2hhbmdlZCAodGhlIHNpZGUgZWZmZWN0cyBhcmUgYWxyZWFkeSB0aGVyZSlcbiAgICBhcHBseVN3Y1RyYW5zZm9ybU1vY2subW9ja0ltcGxlbWVudGF0aW9uKFxuICAgICAgYXN5bmMgKF9maWxlbmFtZTogc3RyaW5nLCBzb3VyY2U6IHN0cmluZykgPT4gKHtcbiAgICAgICAgY29kZTogc291cmNlLFxuICAgICAgICB3b3JrZmxvd01hbmlmZXN0OiB7fSxcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVzYnVpbGQuYnVpbGQoe1xuICAgICAgc3RkaW46IHtcbiAgICAgICAgY29udGVudHM6IGBpbXBvcnQgJ215LXNpZGUtZWZmZWN0LXBrZyc7YCxcbiAgICAgICAgcmVzb2x2ZURpcjogdGVzdFJvb3QsXG4gICAgICAgIHNvdXJjZWZpbGU6ICd2aXJ0dWFsLWVudHJ5LmpzJyxcbiAgICAgICAgbG9hZGVyOiAnanMnLFxuICAgICAgfSxcbiAgICAgIGFic1dvcmtpbmdEaXI6IHRlc3RSb290LFxuICAgICAgYnVuZGxlOiB0cnVlLFxuICAgICAgZm9ybWF0OiAnY2pzJyxcbiAgICAgIHBsYXRmb3JtOiAnbm9kZScsXG4gICAgICB3cml0ZTogZmFsc2UsXG4gICAgICB0cmVlU2hha2luZzogdHJ1ZSxcbiAgICAgIGxvZ0xldmVsOiAnc2lsZW50JyxcbiAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgY3JlYXRlU3djUGx1Z2luKHtcbiAgICAgICAgICBtb2RlOiAnd29ya2Zsb3cnLFxuICAgICAgICAgIHNpZGVFZmZlY3RFbnRyaWVzOiBbZW50cnlQYXRoXSxcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KHJlc3VsdC5lcnJvcnMpLnRvSGF2ZUxlbmd0aCgwKTtcbiAgICBjb25zdCBvdXRwdXQgPSByZXN1bHQub3V0cHV0RmlsZXNbMF0udGV4dDtcbiAgICAvLyBUaGUgcmVnaXN0cmF0aW9uIGNvZGUgc2hvdWxkIGJlIHByZXNlbnQgaW4gdGhlIGJ1bmRsZVxuICAgIGV4cGVjdChvdXRwdXQpLnRvQ29udGFpbignX19yZWdpc3RlcmVkJyk7XG4gIH0pO1xuXG4gIGl0KCdkcm9wcyBiYXJlIGltcG9ydHMgd2hlbiBzaWRlRWZmZWN0RW50cmllcyBpcyBOT1QgcHJvdmlkZWQgZm9yIHNpZGVFZmZlY3RzOmZhbHNlIHBhY2thZ2VzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHNpZGVFZmZlY3RDb2RlID1cbiAgICAgICdnbG9iYWxUaGlzLl9fcmVnaXN0ZXJlZCA9IGdsb2JhbFRoaXMuX19yZWdpc3RlcmVkIHx8IFtdO1xcbmdsb2JhbFRoaXMuX19yZWdpc3RlcmVkLnB1c2goXCJteS1wa2dcIik7JztcbiAgICBjcmVhdGVTaWRlRWZmZWN0c0ZhbHNlUGFja2FnZSgnbXktZHJvcHBlZC1wa2cnLCBzaWRlRWZmZWN0Q29kZSk7XG5cbiAgICBhcHBseVN3Y1RyYW5zZm9ybU1vY2subW9ja0ltcGxlbWVudGF0aW9uKFxuICAgICAgYXN5bmMgKF9maWxlbmFtZTogc3RyaW5nLCBzb3VyY2U6IHN0cmluZykgPT4gKHtcbiAgICAgICAgY29kZTogc291cmNlLFxuICAgICAgICB3b3JrZmxvd01hbmlmZXN0OiB7fSxcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVzYnVpbGQuYnVpbGQoe1xuICAgICAgc3RkaW46IHtcbiAgICAgICAgY29udGVudHM6IGBpbXBvcnQgJ215LWRyb3BwZWQtcGtnJztgLFxuICAgICAgICByZXNvbHZlRGlyOiB0ZXN0Um9vdCxcbiAgICAgICAgc291cmNlZmlsZTogJ3ZpcnR1YWwtZW50cnkuanMnLFxuICAgICAgICBsb2FkZXI6ICdqcycsXG4gICAgICB9LFxuICAgICAgYWJzV29ya2luZ0RpcjogdGVzdFJvb3QsXG4gICAgICBidW5kbGU6IHRydWUsXG4gICAgICBmb3JtYXQ6ICdjanMnLFxuICAgICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICAgIHdyaXRlOiBmYWxzZSxcbiAgICAgIHRyZWVTaGFraW5nOiB0cnVlLFxuICAgICAgbG9nTGV2ZWw6ICdzaWxlbnQnLFxuICAgICAgcGx1Z2luczogW1xuICAgICAgICBjcmVhdGVTd2NQbHVnaW4oe1xuICAgICAgICAgIG1vZGU6ICd3b3JrZmxvdycsXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGV4cGVjdChyZXN1bHQuZXJyb3JzKS50b0hhdmVMZW5ndGgoMCk7XG4gICAgY29uc3Qgb3V0cHV0ID0gcmVzdWx0Lm91dHB1dEZpbGVzWzBdLnRleHQ7XG4gICAgLy8gV2l0aG91dCBzaWRlRWZmZWN0RW50cmllcywgZXNidWlsZCBkcm9wcyB0aGUgYmFyZSBpbXBvcnRcbiAgICBleHBlY3Qob3V0cHV0KS5ub3QudG9Db250YWluKCdfX3JlZ2lzdGVyZWQnKTtcbiAgfSk7XG5cbiAgaXQoJ3Byb2R1Y2VzIG5vIHdhcm5pbmdzIGZvciBzaWRlRWZmZWN0RW50cmllcyBwYWNrYWdlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzaWRlRWZmZWN0Q29kZSA9XG4gICAgICAnZ2xvYmFsVGhpcy5fX3JlZ2lzdGVyZWQgPSBnbG9iYWxUaGlzLl9fcmVnaXN0ZXJlZCB8fCBbXTtcXG5nbG9iYWxUaGlzLl9fcmVnaXN0ZXJlZC5wdXNoKFwid2FybmVkLXBrZ1wiKTsnO1xuICAgIGNvbnN0IGVudHJ5UGF0aCA9IGNyZWF0ZVNpZGVFZmZlY3RzRmFsc2VQYWNrYWdlKFxuICAgICAgJ215LXdhcm5lZC1wa2cnLFxuICAgICAgc2lkZUVmZmVjdENvZGVcbiAgICApO1xuXG4gICAgYXBwbHlTd2NUcmFuc2Zvcm1Nb2NrLm1vY2tJbXBsZW1lbnRhdGlvbihcbiAgICAgIGFzeW5jIChfZmlsZW5hbWU6IHN0cmluZywgc291cmNlOiBzdHJpbmcpID0+ICh7XG4gICAgICAgIGNvZGU6IHNvdXJjZSxcbiAgICAgICAgd29ya2Zsb3dNYW5pZmVzdDoge30sXG4gICAgICB9KVxuICAgICk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIHN0ZGluOiB7XG4gICAgICAgIGNvbnRlbnRzOiBgaW1wb3J0ICdteS13YXJuZWQtcGtnJztgLFxuICAgICAgICByZXNvbHZlRGlyOiB0ZXN0Um9vdCxcbiAgICAgICAgc291cmNlZmlsZTogJ3ZpcnR1YWwtZW50cnkuanMnLFxuICAgICAgICBsb2FkZXI6ICdqcycsXG4gICAgICB9LFxuICAgICAgYWJzV29ya2luZ0RpcjogdGVzdFJvb3QsXG4gICAgICBidW5kbGU6IHRydWUsXG4gICAgICBmb3JtYXQ6ICdjanMnLFxuICAgICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICAgIHdyaXRlOiBmYWxzZSxcbiAgICAgIHRyZWVTaGFraW5nOiB0cnVlLFxuICAgICAgcGx1Z2luczogW1xuICAgICAgICBjcmVhdGVTd2NQbHVnaW4oe1xuICAgICAgICAgIG1vZGU6ICd3b3JrZmxvdycsXG4gICAgICAgICAgc2lkZUVmZmVjdEVudHJpZXM6IFtlbnRyeVBhdGhdLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBleHBlY3QocmVzdWx0LmVycm9ycykudG9IYXZlTGVuZ3RoKDApO1xuICAgIC8vIE5vIFwiaWdub3JlZC1iYXJlLWltcG9ydFwiIHdhcm5pbmdzIHNob3VsZCBiZSBwcm9kdWNlZFxuICAgIGNvbnN0IHNpZGVFZmZlY3RXYXJuaW5ncyA9IHJlc3VsdC53YXJuaW5ncy5maWx0ZXIoXG4gICAgICAodykgPT4gdy5pZCA9PT0gJ2lnbm9yZWQtYmFyZS1pbXBvcnQnXG4gICAgKTtcbiAgICBleHBlY3Qoc2lkZUVmZmVjdFdhcm5pbmdzKS50b0hhdmVMZW5ndGgoMCk7XG4gIH0pO1xuXG4gIGl0KCdwcmVzZXJ2ZXMgYmFyZSBpbXBvcnRzIHdpdGggZW50cmllc1RvQnVuZGxlIGFuZCBzaWRlRWZmZWN0RW50cmllcyB0b2dldGhlcicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzaWRlRWZmZWN0Q29kZSA9XG4gICAgICAnZ2xvYmFsVGhpcy5fX3JlZ2lzdGVyZWQgPSBnbG9iYWxUaGlzLl9fcmVnaXN0ZXJlZCB8fCBbXTtcXG5nbG9iYWxUaGlzLl9fcmVnaXN0ZXJlZC5wdXNoKFwiYnVuZGxlZC1wa2dcIik7JztcbiAgICBjb25zdCBlbnRyeVBhdGggPSBjcmVhdGVTaWRlRWZmZWN0c0ZhbHNlUGFja2FnZShcbiAgICAgICdteS1idW5kbGVkLXBrZycsXG4gICAgICBzaWRlRWZmZWN0Q29kZVxuICAgICk7XG5cbiAgICBhcHBseVN3Y1RyYW5zZm9ybU1vY2subW9ja0ltcGxlbWVudGF0aW9uKFxuICAgICAgYXN5bmMgKF9maWxlbmFtZTogc3RyaW5nLCBzb3VyY2U6IHN0cmluZykgPT4gKHtcbiAgICAgICAgY29kZTogc291cmNlLFxuICAgICAgICB3b3JrZmxvd01hbmlmZXN0OiB7fSxcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGNvbnN0IG91dGRpciA9IGpvaW4odGVzdFJvb3QsICdvdXQnKTtcbiAgICBjb25zdCBzdGVwRmlsZSA9IGpvaW4odGVzdFJvb3QsICdzcmMnLCAnc3RlcC50cycpO1xuICAgIHdyaXRlRmlsZShcbiAgICAgIHN0ZXBGaWxlLFxuICAgICAgYGltcG9ydCAnbXktYnVuZGxlZC1wa2cnO1xcbmV4cG9ydCBjb25zdCBQT1NUID0gKCkgPT4ge307YFxuICAgICk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIGVudHJ5UG9pbnRzOiBbc3RlcEZpbGVdLFxuICAgICAgYWJzV29ya2luZ0RpcjogdGVzdFJvb3QsXG4gICAgICBvdXRkaXIsXG4gICAgICBidW5kbGU6IHRydWUsXG4gICAgICBmb3JtYXQ6ICdlc20nLFxuICAgICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICAgIHdyaXRlOiBmYWxzZSxcbiAgICAgIHRyZWVTaGFraW5nOiB0cnVlLFxuICAgICAgbG9nTGV2ZWw6ICdzaWxlbnQnLFxuICAgICAgcGx1Z2luczogW1xuICAgICAgICBjcmVhdGVTd2NQbHVnaW4oe1xuICAgICAgICAgIG1vZGU6ICdzdGVwJyxcbiAgICAgICAgICBlbnRyaWVzVG9CdW5kbGU6IFtzdGVwRmlsZSwgZW50cnlQYXRoXSxcbiAgICAgICAgICBvdXRkaXIsXG4gICAgICAgICAgc2lkZUVmZmVjdEVudHJpZXM6IFtlbnRyeVBhdGhdLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBleHBlY3QocmVzdWx0LmVycm9ycykudG9IYXZlTGVuZ3RoKDApO1xuICAgIGNvbnN0IG91dHB1dCA9IHJlc3VsdC5vdXRwdXRGaWxlc1swXS50ZXh0O1xuICAgIC8vIFRoZSByZWdpc3RyYXRpb24gY29kZSBzaG91bGQgYmUgYnVuZGxlZCBpblxuICAgIGV4cGVjdChvdXRwdXQpLnRvQ29udGFpbignX19yZWdpc3RlcmVkJyk7XG4gIH0pO1xuXG4gIGl0KCdwcmVzZXJ2ZXMgYmFyZSBpbXBvcnRzIGZvciBsb2NhbCBmaWxlcyB3aXRoIHNpZGVFZmZlY3RzOmZhbHNlIGluIHRoZWlyIHBhcmVudCBwYWNrYWdlLmpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gU2ltdWxhdGUgYSB3b3Jrc3BhY2UgcGFja2FnZSB3aXRoIHNpZGVFZmZlY3RzOiBmYWxzZVxuICAgIGNvbnN0IHBrZ0RpciA9IGpvaW4odGVzdFJvb3QsICdwYWNrYWdlcycsICdzaGFyZWQnKTtcbiAgICB3cml0ZUZpbGUoXG4gICAgICBqb2luKHBrZ0RpciwgJ3BhY2thZ2UuanNvbicpLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBuYW1lOiAnQG15b3JnL3NoYXJlZCcsXG4gICAgICAgIHZlcnNpb246ICcxLjAuMCcsXG4gICAgICAgIHNpZGVFZmZlY3RzOiBmYWxzZSxcbiAgICAgICAgbWFpbjogJ2luZGV4LmpzJyxcbiAgICAgIH0pXG4gICAgKTtcbiAgICBjb25zdCBzaGFyZWRFbnRyeSA9IGpvaW4ocGtnRGlyLCAnaW5kZXguanMnKTtcbiAgICB3cml0ZUZpbGUoc2hhcmVkRW50cnksICdnbG9iYWxUaGlzLl9fc2hhcmVkUmVnaXN0ZXJlZCA9IHRydWU7Jyk7XG5cbiAgICBhcHBseVN3Y1RyYW5zZm9ybU1vY2subW9ja0ltcGxlbWVudGF0aW9uKFxuICAgICAgYXN5bmMgKF9maWxlbmFtZTogc3RyaW5nLCBzb3VyY2U6IHN0cmluZykgPT4gKHtcbiAgICAgICAgY29kZTogc291cmNlLFxuICAgICAgICB3b3JrZmxvd01hbmlmZXN0OiB7fSxcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIC8vIFVzZSBhIHJlbGF0aXZlIGltcG9ydCB0byB0aGUgbG9jYWwgZmlsZSAobGlrZSB0aGUgdmlydHVhbCBlbnRyeSBkb2VzIGZvciBsb2NhbCBmaWxlcylcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIHN0ZGluOiB7XG4gICAgICAgIGNvbnRlbnRzOiBgaW1wb3J0ICcuL3BhY2thZ2VzL3NoYXJlZC9pbmRleC5qcyc7YCxcbiAgICAgICAgcmVzb2x2ZURpcjogdGVzdFJvb3QsXG4gICAgICAgIHNvdXJjZWZpbGU6ICd2aXJ0dWFsLWVudHJ5LmpzJyxcbiAgICAgICAgbG9hZGVyOiAnanMnLFxuICAgICAgfSxcbiAgICAgIGFic1dvcmtpbmdEaXI6IHRlc3RSb290LFxuICAgICAgYnVuZGxlOiB0cnVlLFxuICAgICAgZm9ybWF0OiAnY2pzJyxcbiAgICAgIHBsYXRmb3JtOiAnbm9kZScsXG4gICAgICB3cml0ZTogZmFsc2UsXG4gICAgICB0cmVlU2hha2luZzogdHJ1ZSxcbiAgICAgIGxvZ0xldmVsOiAnc2lsZW50JyxcbiAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgY3JlYXRlU3djUGx1Z2luKHtcbiAgICAgICAgICBtb2RlOiAnd29ya2Zsb3cnLFxuICAgICAgICAgIHNpZGVFZmZlY3RFbnRyaWVzOiBbc2hhcmVkRW50cnldLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBleHBlY3QocmVzdWx0LmVycm9ycykudG9IYXZlTGVuZ3RoKDApO1xuICAgIGNvbnN0IG91dHB1dCA9IHJlc3VsdC5vdXRwdXRGaWxlc1swXS50ZXh0O1xuICAgIGV4cGVjdChvdXRwdXQpLnRvQ29udGFpbignX19zaGFyZWRSZWdpc3RlcmVkJyk7XG4gIH0pO1xuXG4gIGl0KCdkb2VzIG5vdCBvdmVycmlkZSBzaWRlRWZmZWN0cyBmb3Igbm9uLWVudHJ5IG1vZHVsZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gQ3JlYXRlIHR3byBwYWNrYWdlcyAtIG9uZSBpcyBhIHNpZGUtZWZmZWN0IGVudHJ5LCBvbmUgaXMgbm90XG4gICAgY29uc3Qgc2lkZUVmZmVjdENvZGUgPSAnZ2xvYmFsVGhpcy5fX2VudHJ5UmVnaXN0ZXJlZCA9IHRydWU7JztcbiAgICBjb25zdCBlbnRyeVBhdGggPSBjcmVhdGVTaWRlRWZmZWN0c0ZhbHNlUGFja2FnZShcbiAgICAgICdlbnRyeS1wa2cnLFxuICAgICAgc2lkZUVmZmVjdENvZGVcbiAgICApO1xuXG4gICAgY29uc3Qgbm9uRW50cnlDb2RlID0gJ2dsb2JhbFRoaXMuX19ub25FbnRyeVJlZ2lzdGVyZWQgPSB0cnVlOyc7XG4gICAgY3JlYXRlU2lkZUVmZmVjdHNGYWxzZVBhY2thZ2UoJ25vbi1lbnRyeS1wa2cnLCBub25FbnRyeUNvZGUpO1xuXG4gICAgYXBwbHlTd2NUcmFuc2Zvcm1Nb2NrLm1vY2tJbXBsZW1lbnRhdGlvbihcbiAgICAgIGFzeW5jIChfZmlsZW5hbWU6IHN0cmluZywgc291cmNlOiBzdHJpbmcpID0+ICh7XG4gICAgICAgIGNvZGU6IHNvdXJjZSxcbiAgICAgICAgd29ya2Zsb3dNYW5pZmVzdDoge30sXG4gICAgICB9KVxuICAgICk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIHN0ZGluOiB7XG4gICAgICAgIGNvbnRlbnRzOiBgaW1wb3J0ICdlbnRyeS1wa2cnO1xcbmltcG9ydCAnbm9uLWVudHJ5LXBrZyc7YCxcbiAgICAgICAgcmVzb2x2ZURpcjogdGVzdFJvb3QsXG4gICAgICAgIHNvdXJjZWZpbGU6ICd2aXJ0dWFsLWVudHJ5LmpzJyxcbiAgICAgICAgbG9hZGVyOiAnanMnLFxuICAgICAgfSxcbiAgICAgIGFic1dvcmtpbmdEaXI6IHRlc3RSb290LFxuICAgICAgYnVuZGxlOiB0cnVlLFxuICAgICAgZm9ybWF0OiAnY2pzJyxcbiAgICAgIHBsYXRmb3JtOiAnbm9kZScsXG4gICAgICB3cml0ZTogZmFsc2UsXG4gICAgICB0cmVlU2hha2luZzogdHJ1ZSxcbiAgICAgIGxvZ0xldmVsOiAnc2lsZW50JyxcbiAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgY3JlYXRlU3djUGx1Z2luKHtcbiAgICAgICAgICBtb2RlOiAnd29ya2Zsb3cnLFxuICAgICAgICAgIC8vIE9ubHkgZW50cnktcGtnIGlzIGxpc3RlZCwgbm9uLWVudHJ5LXBrZyBpcyBub3RcbiAgICAgICAgICBzaWRlRWZmZWN0RW50cmllczogW2VudHJ5UGF0aF0sXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGV4cGVjdChyZXN1bHQuZXJyb3JzKS50b0hhdmVMZW5ndGgoMCk7XG4gICAgY29uc3Qgb3V0cHV0ID0gcmVzdWx0Lm91dHB1dEZpbGVzWzBdLnRleHQ7XG4gICAgLy8gZW50cnktcGtnIHNob3VsZCBiZSBwcmVzZXJ2ZWRcbiAgICBleHBlY3Qob3V0cHV0KS50b0NvbnRhaW4oJ19fZW50cnlSZWdpc3RlcmVkJyk7XG4gICAgLy8gbm9uLWVudHJ5LXBrZyBzaG91bGQgYmUgZHJvcHBlZCAoc2lkZUVmZmVjdHM6IGZhbHNlIGlzIHJlc3BlY3RlZClcbiAgICBleHBlY3Qob3V0cHV0KS5ub3QudG9Db250YWluKCdfX25vbkVudHJ5UmVnaXN0ZXJlZCcpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnY3JlYXRlU3djUGx1Z2luIHByb2plY3RSb290JywgKCkgPT4ge1xuICBsZXQgdGVzdFJvb3Q6IHN0cmluZztcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICB0ZXN0Um9vdCA9IG1rZHRlbXBTeW5jKGpvaW4ocmVhbFRtcGRpciwgJ3dvcmtmbG93LXN3Yy1wbHVnaW4tJykpO1xuICAgIGFwcGx5U3djVHJhbnNmb3JtTW9jay5tb2NrUmVzZXQoKTtcbiAgICBhcHBseVN3Y1RyYW5zZm9ybU1vY2subW9ja0ltcGxlbWVudGF0aW9uKFxuICAgICAgYXN5bmMgKF9maWxlbmFtZTogc3RyaW5nLCBzb3VyY2U6IHN0cmluZykgPT4gKHtcbiAgICAgICAgY29kZTogc291cmNlLFxuICAgICAgICB3b3JrZmxvd01hbmlmZXN0OiB7fSxcbiAgICAgIH0pXG4gICAgKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICBybVN5bmModGVzdFJvb3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgfSk7XG5cbiAgZnVuY3Rpb24gc2V0dXBGaXh0dXJlKCkge1xuICAgIGNvbnN0IGFwcFJvb3QgPSBqb2luKHRlc3RSb290LCAnYXBwcycsICdjaGF0Jyk7XG4gICAgY29uc3QgcGFja2FnZVJvb3QgPSBqb2luKHRlc3RSb290LCAncGFja2FnZXMnLCAndmFkZScpO1xuICAgIGNvbnN0IHdvcmtmbG93RmlsZSA9IGpvaW4oXG4gICAgICBwYWNrYWdlUm9vdCxcbiAgICAgICdzcmMnLFxuICAgICAgJ2ludGVybmFsJyxcbiAgICAgICdtZXNzYWdlJyxcbiAgICAgICd3b3JrZmxvdycsXG4gICAgICAnaGFuZGxlLW1lc3NhZ2UudHMnXG4gICAgKTtcblxuICAgIHdyaXRlRmlsZShcbiAgICAgIHdvcmtmbG93RmlsZSxcbiAgICAgIGBleHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlTWVzc2FnZVdvcmtmbG93KG1lc3NhZ2UpIHtcbiAgXCJ1c2Ugd29ya2Zsb3dcIjtcblxuICByZXR1cm4gbWVzc2FnZTtcbn1cbmBcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFwcFJvb3QsXG4gICAgICBwYWNrYWdlUm9vdCxcbiAgICAgIHdvcmtmbG93RmlsZSxcbiAgICB9O1xuICB9XG5cbiAgaXQoJ3Bhc3NlcyB0aGUgZXhwbGljaXQgcHJvamVjdFJvb3QgdGhyb3VnaCB0byBhcHBseVN3Y1RyYW5zZm9ybScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaXh0dXJlID0gc2V0dXBGaXh0dXJlKCk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIGVudHJ5UG9pbnRzOiBbZml4dHVyZS53b3JrZmxvd0ZpbGVdLFxuICAgICAgYWJzV29ya2luZ0RpcjogZml4dHVyZS5wYWNrYWdlUm9vdCxcbiAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgIGZvcm1hdDogJ2VzbScsXG4gICAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgICAgd3JpdGU6IGZhbHNlLFxuICAgICAgcGx1Z2luczogW1xuICAgICAgICBjcmVhdGVTd2NQbHVnaW4oe1xuICAgICAgICAgIG1vZGU6ICd3b3JrZmxvdycsXG4gICAgICAgICAgcHJvamVjdFJvb3Q6IGZpeHR1cmUuYXBwUm9vdCxcbiAgICAgICAgICB3b3JrZmxvd01hbmlmZXN0OiB7fSxcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KHJlc3VsdC5lcnJvcnMpLnRvSGF2ZUxlbmd0aCgwKTtcbiAgICBleHBlY3QoYXBwbHlTd2NUcmFuc2Zvcm1Nb2NrKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICdzcmMvaW50ZXJuYWwvbWVzc2FnZS93b3JrZmxvdy9oYW5kbGUtbWVzc2FnZS50cycsXG4gICAgICBleHBlY3Quc3RyaW5nQ29udGFpbmluZygnXCJ1c2Ugd29ya2Zsb3dcIicpLFxuICAgICAgJ3dvcmtmbG93JyxcbiAgICAgIGZpeHR1cmUud29ya2Zsb3dGaWxlLFxuICAgICAgZml4dHVyZS5hcHBSb290XG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ2RlZmF1bHRzIHRoZSB0cmFuc2Zvcm0gcHJvamVjdFJvb3QgdG8gYWJzV29ya2luZ0RpcicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaXh0dXJlID0gc2V0dXBGaXh0dXJlKCk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIGVudHJ5UG9pbnRzOiBbZml4dHVyZS53b3JrZmxvd0ZpbGVdLFxuICAgICAgYWJzV29ya2luZ0RpcjogZml4dHVyZS5wYWNrYWdlUm9vdCxcbiAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgIGZvcm1hdDogJ2VzbScsXG4gICAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgICAgd3JpdGU6IGZhbHNlLFxuICAgICAgcGx1Z2luczogW1xuICAgICAgICBjcmVhdGVTd2NQbHVnaW4oe1xuICAgICAgICAgIG1vZGU6ICd3b3JrZmxvdycsXG4gICAgICAgICAgd29ya2Zsb3dNYW5pZmVzdDoge30sXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGV4cGVjdChyZXN1bHQuZXJyb3JzKS50b0hhdmVMZW5ndGgoMCk7XG4gICAgZXhwZWN0KGFwcGx5U3djVHJhbnNmb3JtTW9jaykudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAnc3JjL2ludGVybmFsL21lc3NhZ2Uvd29ya2Zsb3cvaGFuZGxlLW1lc3NhZ2UudHMnLFxuICAgICAgZXhwZWN0LnN0cmluZ0NvbnRhaW5pbmcoJ1widXNlIHdvcmtmbG93XCInKSxcbiAgICAgICd3b3JrZmxvdycsXG4gICAgICBmaXh0dXJlLndvcmtmbG93RmlsZSxcbiAgICAgIGZpeHR1cmUucGFja2FnZVJvb3RcbiAgICApO1xuICB9KTtcbn0pO1xuIl19
|
package/dist/transform-utils.js
CHANGED
|
@@ -74,4 +74,4 @@ export function shouldTransformFile(filePath, patterns) {
|
|
|
74
74
|
* and WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE computed property usage
|
|
75
75
|
*/
|
|
76
76
|
export const turbopackContentPattern = /(use workflow|use step|from\s+(['"])@workflow\/serde\2|Symbol\.for\s*\(\s*(['"])workflow-(?:serialize|deserialize)\3\s*\)|\[\s*WORKFLOW_(?:SERIALIZE|DESERIALIZE)\s*\])/;
|
|
77
|
-
//# sourceMappingURL=
|
|
77
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3JtLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3RyYW5zZm9ybS11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCwwR0FBMEc7QUFDMUcsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsaUNBQWlDLENBQUM7QUFDcEUsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLDZCQUE2QixDQUFDO0FBRTVELDBFQUEwRTtBQUMxRSw4REFBOEQ7QUFDOUQsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsaUNBQWlDLENBQUM7QUFFNUUsaUdBQWlHO0FBQ2pHLG9FQUFvRTtBQUNwRSxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FDckMsb0VBQW9FLENBQUM7QUFFdkUseUZBQXlGO0FBQ3pGLHNEQUFzRDtBQUN0RCwyRkFBMkY7QUFDM0YsTUFBTSxDQUFDLE1BQU0sb0NBQW9DLEdBQy9DLDhDQUE4QyxDQUFDO0FBRWpELDJFQUEyRTtBQUMzRSxnRkFBZ0Y7QUFDaEYsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQ3ZDLHFDQUFxQyxDQUFDO0FBb0J4Qzs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUFDLE1BQWM7SUFDbkQsTUFBTSxjQUFjLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZELE1BQU0sVUFBVSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0MsTUFBTSxjQUFjLEdBQUcsMEJBQTBCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9ELE1BQU0sY0FBYyxHQUFHLDBCQUEwQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMvRCxNQUFNLHdCQUF3QixHQUM1QixvQ0FBb0MsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFcEQsT0FBTztRQUNMLGNBQWM7UUFDZCxVQUFVO1FBQ1YsY0FBYztRQUNkLGNBQWM7UUFDZCxZQUFZLEVBQUUsY0FBYyxJQUFJLFVBQVU7UUFDMUMsUUFBUSxFQUFFLGNBQWMsSUFBSSxjQUFjLElBQUksd0JBQXdCO0tBQ3ZFLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxRQUFnQjtJQUN0RCxPQUFPLDRCQUE0QixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNyRCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsUUFBZ0IsRUFDaEIsUUFBOEI7SUFFOUIsaURBQWlEO0lBQ2pELElBQUksdUJBQXVCLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUN0QyxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxPQUFPLFFBQVEsQ0FBQyxZQUFZLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQztBQUNwRCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FDbEMseUtBQXlLLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNoYXJlZCB1dGlsaXRpZXMgZm9yIGRldGVjdGluZyBmaWxlcyB0aGF0IG5lZWQgd29ya2Zsb3cgdHJhbnNmb3JtYXRpb24uXG4gKiBVc2VkIGJ5IGJ1aWxkZXJzLCByb2xsdXAgcGx1Z2luLCBOZXh0LmpzIGxvYWRlciwgYW5kIHZpdGUgcGx1Z2luLlxuICovXG5cbi8vIE1hdGNoZXM6ICd1c2Ugd29ya2Zsb3cnOyBcInVzZSB3b3JrZmxvd1wiOyAndXNlIHN0ZXAnOyBcInVzZSBzdGVwXCI7IGF0IGxpbmUgc3RhcnQgd2l0aCBvcHRpb25hbCB3aGl0ZXNwYWNlXG5leHBvcnQgY29uc3QgdXNlV29ya2Zsb3dQYXR0ZXJuID0gL15cXHMqKFsnXCJdKXVzZSB3b3JrZmxvd1xcMTs/XFxzKiQvbTtcbmV4cG9ydCBjb25zdCB1c2VTdGVwUGF0dGVybiA9IC9eXFxzKihbJ1wiXSl1c2Ugc3RlcFxcMTs/XFxzKiQvbTtcblxuLy8gTWF0Y2hlcyBpbXBvcnRzIGZyb20gJ0B3b3JrZmxvdy9zZXJkZScgKGZvciBjdXN0b20gY2xhc3Mgc2VyaWFsaXphdGlvbilcbi8vIGUuZy46IGltcG9ydCB7IFdPUktGTE9XX1NFUklBTElaRSB9IGZyb20gJ0B3b3JrZmxvdy9zZXJkZSc7XG5leHBvcnQgY29uc3Qgd29ya2Zsb3dTZXJkZUltcG9ydFBhdHRlcm4gPSAvZnJvbVxccysoWydcIl0pQHdvcmtmbG93XFwvc2VyZGVcXDEvO1xuXG4vLyBNYXRjaGVzIGRpcmVjdCB1c2FnZSBvZiBTeW1ib2wuZm9yKCd3b3JrZmxvdy1zZXJpYWxpemUnKSBvciBTeW1ib2wuZm9yKCd3b3JrZmxvdy1kZXNlcmlhbGl6ZScpXG4vLyBlLmcuOiBzdGF0aWMgW1N5bWJvbC5mb3IoJ3dvcmtmbG93LXNlcmlhbGl6ZScpXShpbnN0YW5jZSkgeyAuLi4gfVxuZXhwb3J0IGNvbnN0IHdvcmtmbG93U2VyZGVTeW1ib2xQYXR0ZXJuID1cbiAgL1N5bWJvbFxcLmZvclxccypcXChcXHMqKFsnXCJdKXdvcmtmbG93LSg/OnNlcmlhbGl6ZXxkZXNlcmlhbGl6ZSlcXDFcXHMqXFwpLztcblxuLy8gTWF0Y2hlcyB1c2FnZSBvZiBXT1JLRkxPV19TRVJJQUxJWkUgb3IgV09SS0ZMT1dfREVTRVJJQUxJWkUgYXMgY29tcHV0ZWQgcHJvcGVydHkgbmFtZXNcbi8vIGUuZy46IHN0YXRpYyBbV09SS0ZMT1dfU0VSSUFMSVpFXShpbnN0YW5jZSkgeyAuLi4gfVxuLy8gVGhpcyBjYXRjaGVzIGNhc2VzIHdoZXJlIHRoZSBzeW1ib2xzIGFyZSBpbXBvcnRlZCBhbmQgdXNlZCAoZXZlbiBpZiBidW5kbGVkL3JlLWV4cG9ydGVkKVxuZXhwb3J0IGNvbnN0IHdvcmtmbG93U2VyZGVDb21wdXRlZFByb3BlcnR5UGF0dGVybiA9XG4gIC9cXFtcXHMqV09SS0ZMT1dfKD86U0VSSUFMSVpFfERFU0VSSUFMSVpFKVxccypcXF0vO1xuXG4vLyBQYXR0ZXJuIHRvIGRldGVjdCBnZW5lcmF0ZWQgd29ya2Zsb3cgcm91dGUgZmlsZXMgdGhhdCBzaG91bGQgYmUgZXhjbHVkZWRcbi8vIFRoZXNlIGZpbGVzIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIGJ1aWxkIHByb2Nlc3MgYW5kIHNob3VsZCBub3QgYmUgcmUtcHJvY2Vzc2VkXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVkV29ya2Zsb3dQYXRoUGF0dGVybiA9XG4gIC9bL1xcXFxdXFwud2VsbC1rbm93blsvXFxcXF13b3JrZmxvd1svXFxcXF0vO1xuXG4vKipcbiAqIERldGVjdHMgd29ya2Zsb3ctcmVsYXRlZCBwYXR0ZXJucyBpbiBzb3VyY2UgY29kZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd1BhdHRlcm5NYXRjaCB7XG4gIC8qKiBGaWxlIGNvbnRhaW5zICd1c2Ugd29ya2Zsb3cnIGRpcmVjdGl2ZSAqL1xuICBoYXNVc2VXb3JrZmxvdzogYm9vbGVhbjtcbiAgLyoqIEZpbGUgY29udGFpbnMgJ3VzZSBzdGVwJyBkaXJlY3RpdmUgKi9cbiAgaGFzVXNlU3RlcDogYm9vbGVhbjtcbiAgLyoqIEZpbGUgY29udGFpbnMgQHdvcmtmbG93L3NlcmRlIGltcG9ydCAqL1xuICBoYXNTZXJkZUltcG9ydDogYm9vbGVhbjtcbiAgLyoqIEZpbGUgY29udGFpbnMgU3ltYm9sLmZvcignd29ya2Zsb3ctc2VyaWFsaXplJykgb3IgU3ltYm9sLmZvcignd29ya2Zsb3ctZGVzZXJpYWxpemUnKSAqL1xuICBoYXNTZXJkZVN5bWJvbDogYm9vbGVhbjtcbiAgLyoqIEZpbGUgY29udGFpbnMgYW55IGRpcmVjdGl2ZSAoJ3VzZSB3b3JrZmxvdycgb3IgJ3VzZSBzdGVwJykgKi9cbiAgaGFzRGlyZWN0aXZlOiBib29sZWFuO1xuICAvKiogRmlsZSBjb250YWlucyBhbnkgc2VyZGUgcGF0dGVybiAoaW1wb3J0IG9yIFN5bWJvbC5mb3IpICovXG4gIGhhc1NlcmRlOiBib29sZWFuO1xufVxuXG4vKipcbiAqIERldGVjdHMgd29ya2Zsb3ctcmVsYXRlZCBwYXR0ZXJucyBpbiBzb3VyY2UgY29kZS5cbiAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgc291cmNlIGNvZGUgdG8gYW5hbHl6ZVxuICogQHJldHVybnMgT2JqZWN0IHdpdGggZmxhZ3MgZm9yIGVhY2ggZGV0ZWN0ZWQgcGF0dGVyblxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0V29ya2Zsb3dQYXR0ZXJucyhzb3VyY2U6IHN0cmluZyk6IFdvcmtmbG93UGF0dGVybk1hdGNoIHtcbiAgY29uc3QgaGFzVXNlV29ya2Zsb3cgPSB1c2VXb3JrZmxvd1BhdHRlcm4udGVzdChzb3VyY2UpO1xuICBjb25zdCBoYXNVc2VTdGVwID0gdXNlU3RlcFBhdHRlcm4udGVzdChzb3VyY2UpO1xuICBjb25zdCBoYXNTZXJkZUltcG9ydCA9IHdvcmtmbG93U2VyZGVJbXBvcnRQYXR0ZXJuLnRlc3Qoc291cmNlKTtcbiAgY29uc3QgaGFzU2VyZGVTeW1ib2wgPSB3b3JrZmxvd1NlcmRlU3ltYm9sUGF0dGVybi50ZXN0KHNvdXJjZSk7XG4gIGNvbnN0IGhhc1NlcmRlQ29tcHV0ZWRQcm9wZXJ0eSA9XG4gICAgd29ya2Zsb3dTZXJkZUNvbXB1dGVkUHJvcGVydHlQYXR0ZXJuLnRlc3Qoc291cmNlKTtcblxuICByZXR1cm4ge1xuICAgIGhhc1VzZVdvcmtmbG93LFxuICAgIGhhc1VzZVN0ZXAsXG4gICAgaGFzU2VyZGVJbXBvcnQsXG4gICAgaGFzU2VyZGVTeW1ib2wsXG4gICAgaGFzRGlyZWN0aXZlOiBoYXNVc2VXb3JrZmxvdyB8fCBoYXNVc2VTdGVwLFxuICAgIGhhc1NlcmRlOiBoYXNTZXJkZUltcG9ydCB8fCBoYXNTZXJkZVN5bWJvbCB8fCBoYXNTZXJkZUNvbXB1dGVkUHJvcGVydHksXG4gIH07XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiBhIGZpbGUgcGF0aCBpcyBhIGdlbmVyYXRlZCB3b3JrZmxvdyByb3V0ZSBmaWxlLlxuICogQHBhcmFtIGZpbGVQYXRoIC0gVGhlIGZpbGUgcGF0aCB0byBjaGVja1xuICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgZmlsZSBpcyBhIGdlbmVyYXRlZCB3b3JrZmxvdyByb3V0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNHZW5lcmF0ZWRXb3JrZmxvd0ZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2VuZXJhdGVkV29ya2Zsb3dQYXRoUGF0dGVybi50ZXN0KGZpbGVQYXRoKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIGEgZmlsZSBzaG91bGQgYmUgdHJhbnNmb3JtZWQgYmFzZWQgb24gaXRzIHBhdGggYW5kIGNvbnRlbnQgcGF0dGVybnMuXG4gKlxuICogTG9naWM6XG4gKiAtIEdlbmVyYXRlZCB3b3JrZmxvdyByb3V0ZSBmaWxlcyBhcmUgbmV2ZXIgdHJhbnNmb3JtZWRcbiAqIC0gRmlsZXMgd2l0aCBkaXJlY3RpdmVzICgndXNlIHdvcmtmbG93JyBvciAndXNlIHN0ZXAnKSBhcmUgYWx3YXlzIHRyYW5zZm9ybWVkXG4gKiAtIEZpbGVzIHdpdGggc2VyZGUgcGF0dGVybnMgYXJlIGFsd2F5cyB0cmFuc2Zvcm1lZDsgdGhlIFNXQyBwbHVnaW4gcGVyZm9ybXNcbiAqICAgQVNULWxldmVsIGV4dHJhY3Rpb24vZmlsdGVyaW5nIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZXkgYWN0dWFsbHkgZGVmaW5lXG4gKiAgIHNlcmRlIGNsYXNzZXNcbiAqXG4gKiBAcGFyYW0gZmlsZVBhdGggLSBUaGUgZmlsZSBwYXRoIHRvIGNoZWNrXG4gKiBAcGFyYW0gcGF0dGVybnMgLSBUaGUgZGV0ZWN0ZWQgcGF0dGVybnMgZnJvbSBkZXRlY3RXb3JrZmxvd1BhdHRlcm5zKClcbiAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGZpbGUgc2hvdWxkIGJlIHRyYW5zZm9ybWVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRUcmFuc2Zvcm1GaWxlKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBwYXR0ZXJuczogV29ya2Zsb3dQYXR0ZXJuTWF0Y2hcbik6IGJvb2xlYW4ge1xuICAvLyBOZXZlciB0cmFuc2Zvcm0gZ2VuZXJhdGVkIHdvcmtmbG93IHJvdXRlIGZpbGVzXG4gIGlmIChpc0dlbmVyYXRlZFdvcmtmbG93RmlsZShmaWxlUGF0aCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gcGF0dGVybnMuaGFzRGlyZWN0aXZlIHx8IHBhdHRlcm5zLmhhc1NlcmRlO1xufVxuXG4vKipcbiAqIENvbWJpbmVkIHJlZ2V4IHBhdHRlcm4gZm9yIHR1cmJvcGFjayBjb250ZW50IG1hdGNoaW5nLlxuICogVXNlcyBiYWNrcmVmZXJlbmNlcyB0byBlbnN1cmUgbWF0Y2hpbmcgcXVvdGUgdHlwZXMuXG4gKiBNYXRjaGVzOiAndXNlIHdvcmtmbG93JywgJ3VzZSBzdGVwJywgQHdvcmtmbG93L3NlcmRlIGltcG9ydHMsIFN5bWJvbC5mb3Igc2VyaWFsaXphdGlvbiBzeW1ib2xzLFxuICogYW5kIFdPUktGTE9XX1NFUklBTElaRS9XT1JLRkxPV19ERVNFUklBTElaRSBjb21wdXRlZCBwcm9wZXJ0eSB1c2FnZVxuICovXG5leHBvcnQgY29uc3QgdHVyYm9wYWNrQ29udGVudFBhdHRlcm4gPVxuICAvKHVzZSB3b3JrZmxvd3x1c2Ugc3RlcHxmcm9tXFxzKyhbJ1wiXSlAd29ya2Zsb3dcXC9zZXJkZVxcMnxTeW1ib2xcXC5mb3JcXHMqXFwoXFxzKihbJ1wiXSl3b3JrZmxvdy0oPzpzZXJpYWxpemV8ZGVzZXJpYWxpemUpXFwzXFxzKlxcKXxcXFtcXHMqV09SS0ZMT1dfKD86U0VSSUFMSVpFfERFU0VSSUFMSVpFKVxccypcXF0pLztcbiJdfQ==
|
|
@@ -319,4 +319,4 @@ export default function Page() { return null; }
|
|
|
319
319
|
});
|
|
320
320
|
});
|
|
321
321
|
});
|
|
322
|
-
//# sourceMappingURL=transform-utils.test.js.map
|
|
322
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3JtLXV0aWxzLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHJhbnNmb3JtLXV0aWxzLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQzlDLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsbUJBQW1CLEVBQ25CLGNBQWMsRUFDZCxrQkFBa0IsRUFDbEIsb0NBQW9DLEVBQ3BDLDBCQUEwQixFQUMxQiwwQkFBMEIsR0FDM0IsTUFBTSxzQkFBc0IsQ0FBQztBQUU5QixRQUFRLENBQUMsMEJBQTBCLEVBQUUsR0FBRyxFQUFFO0lBQ3hDLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRSxHQUFHLEVBQUU7UUFDbEMsRUFBRSxDQUFDLGdEQUFnRCxFQUFFLEdBQUcsRUFBRTtZQUN4RCxNQUFNLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDOUQsTUFBTSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9ELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGdEQUFnRCxFQUFFLEdBQUcsRUFBRTtZQUN4RCxNQUFNLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDOUQsTUFBTSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9ELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHNDQUFzQyxFQUFFLEdBQUcsRUFBRTtZQUM5QyxNQUFNLENBQUMsa0JB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OUMsTUFBTSxDQUNKLG1CQUFtQixDQUFDLHNCQUFzQixFQUFFO2dCQUMxQyxHQUFHLFVBQVU7Z0JBQ2IsY0FBYyxFQUFFLElBQUk7Z0JBQ3BCLFFBQVEsRUFBRSxJQUFJO2FBQ2YsQ0FBQyxDQUNILENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2YsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsK0RBQStELEVBQUUsR0FBRyxFQUFFO1lBQ3ZFLE1BQU0sQ0FDSixtQkFBbUIsQ0FDakIsd0RBQXdELEVBQ3hELEVBQUUsR0FBRyxVQUFVLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQ3hELENBQ0YsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDZixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywrREFBK0QsRUFBRSxHQUFHLEVBQUU7WUFDdkUsTUFBTSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlc2NyaWJlLCBleHBlY3QsIGl0IH0gZnJvbSAndml0ZXN0JztcbmltcG9ydCB7XG4gIGRldGVjdFdvcmtmbG93UGF0dGVybnMsXG4gIHNob3VsZFRyYW5zZm9ybUZpbGUsXG4gIHVzZVN0ZXBQYXR0ZXJuLFxuICB1c2VXb3JrZmxvd1BhdHRlcm4sXG4gIHdvcmtmbG93U2VyZGVDb21wdXRlZFByb3BlcnR5UGF0dGVybixcbiAgd29ya2Zsb3dTZXJkZUltcG9ydFBhdHRlcm4sXG4gIHdvcmtmbG93U2VyZGVTeW1ib2xQYXR0ZXJuLFxufSBmcm9tICcuL3RyYW5zZm9ybS11dGlscy5qcyc7XG5cbmRlc2NyaWJlKCd0cmFuc2Zvcm0tdXRpbHMgcGF0dGVybnMnLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCd1c2VXb3JrZmxvd1BhdHRlcm4nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBtYXRjaCBcInVzZSB3b3JrZmxvd1wiIHdpdGggc2luZ2xlIHF1b3RlcycsICgpID0+IHtcbiAgICAgIGV4cGVjdCh1c2VXb3JrZmxvd1BhdHRlcm4udGVzdChgJ3VzZSB3b3JrZmxvdyc7YCkpLnRvQmUodHJ1ZSk7XG4gICAgICBleHBlY3QodXNlV29ya2Zsb3dQYXR0ZXJuLnRlc3QoYCd1c2Ugd29ya2Zsb3cnYCkpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG1hdGNoIFwidXNlIHdvcmtmbG93XCIgd2l0aCBkb3VibGUgcXVvdGVzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHVzZVdvcmtmbG93UGF0dGVybi50ZXN0KGBcInVzZSB3b3JrZmxvd1wiO2ApKS50b0JlKHRydWUpO1xuICAgICAgZXhwZWN0KHVzZVdvcmtmbG93UGF0dGVybi50ZXN0KGBcInVzZSB3b3JrZmxvd1wiYCkpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG1hdGNoIHdpdGggbGVhZGluZyB3aGl0ZXNwYWNlJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHVzZVdvcmtmbG93UGF0dGVybi50ZXN0KGAgICd1c2Ugd29ya2Zsb3cnO2ApKS50b0JlKHRydWUpO1xuICAgICAgZXhwZWN0KHVzZVdvcmtmbG93UGF0dGVybi50ZXN0KGBcXHRcInVzZSB3b3JrZmxvd1wiO2ApKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgbWF0Y2ggaW5saW5lIHVzYWdlJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHVzZVdvcmtmbG93UGF0dGVybi50ZXN0KGBjb25zdCB4ID0gJ3VzZSB3b3JrZmxvdyc7YCkpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndXNlU3RlcFBhdHRlcm4nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBtYXRjaCBcInVzZSBzdGVwXCIgd2l0aCBzaW5nbGUgcXVvdGVzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHVzZVN0ZXBQYXR0ZXJuLnRlc3QoYCd1c2Ugc3RlcCc7YCkpLnRvQmUodHJ1ZSk7XG4gICAgICBleHBlY3QodXNlU3RlcFBhdHRlcm4udGVzdChgJ3VzZSBzdGVwJ2ApKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBtYXRjaCBcInVzZSBzdGVwXCIgd2l0aCBkb3VibGUgcXVvdGVzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHVzZVN0ZXBQYXR0ZXJuLnRlc3QoYFwidXNlIHN0ZXBcIjtgKSkudG9CZSh0cnVlKTtcbiAgICAgIGV4cGVjdCh1c2VTdGVwUGF0dGVybi50ZXN0KGBcInVzZSBzdGVwXCJgKSkudG9CZSh0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3dvcmtmbG93U2VyZGVJbXBvcnRQYXR0ZXJuJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgbWF0Y2ggaW1wb3J0IGZyb20gQHdvcmtmbG93L3NlcmRlIHdpdGggc2luZ2xlIHF1b3RlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IGBpbXBvcnQgeyBXT1JLRkxPV19TRVJJQUxJWkUgfSBmcm9tICdAd29ya2Zsb3cvc2VyZGUnO2A7XG4gICAgICBleHBlY3Qod29ya2Zsb3dTZXJkZUltcG9ydFBhdHRlcm4udGVzdChzb3VyY2UpKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBtYXRjaCBpbXBvcnQgZnJvbSBAd29ya2Zsb3cvc2VyZGUgd2l0aCBkb3VibGUgcXVvdGVzJywgKCkgPT4ge1xuICAgICAgY29uc3Qgc291cmNlID0gYGltcG9ydCB7IFdPUktGTE9XX1NFUklBTElaRSB9IGZyb20gXCJAd29ya2Zsb3cvc2VyZGVcIjtgO1xuICAgICAgZXhwZWN0KHdvcmtmbG93U2VyZGVJbXBvcnRQYXR0ZXJuLnRlc3Qoc291cmNlKSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbWF0Y2ggaW1wb3J0IHdpdGggbXVsdGlwbGUgc3BlY2lmaWVycycsICgpID0+IHtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IGBpbXBvcnQgeyBXT1JLRkxPV19TRVJJQUxJWkUsIFdPUktGTE9XX0RFU0VSSUFMSVpFIH0gZnJvbSAnQHdvcmtmbG93L3NlcmRlJztgO1xuICAgICAgZXhwZWN0KHdvcmtmbG93U2VyZGVJbXBvcnRQYXR0ZXJuLnRlc3Qoc291cmNlKSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbWF0Y2ggaW1wb3J0IHdpdGggdHlwZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IGBpbXBvcnQgdHlwZSB7IFNlcmlhbGl6YXRpb25TeW1ib2wgfSBmcm9tICdAd29ya2Zsb3cvc2VyZGUnO2A7XG4gICAgICBleHBlY3Qod29ya2Zsb3dTZXJkZUltcG9ydFBhdHRlcm4udGVzdChzb3VyY2UpKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgbWF0Y2ggc2ltaWxhciBidXQgZGlmZmVyZW50IHBhY2thZ2VzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KFxuICAgICAgICB3b3JrZmxvd1NlcmRlSW1wb3J0UGF0dGVybi50ZXN0KGBpbXBvcnQgeyB4IH0gZnJvbSAnQG90aGVyL3NlcmRlJztgKVxuICAgICAgKS50b0JlKGZhbHNlKTtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgd29ya2Zsb3dTZXJkZUltcG9ydFBhdHRlcm4udGVzdChcbiAgICAgICAgICBgaW1wb3J0IHsgeCB9IGZyb20gJ0B3b3JrZmxvdy9zZXJkZS11dGlscyc7YFxuICAgICAgICApXG4gICAgICApLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnd29ya2Zsb3dTZXJkZVN5bWJvbFBhdHRlcm4nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBtYXRjaCBTeW1ib2wuZm9yIHdpdGggd29ya2Zsb3ctc2VyaWFsaXplJywgKCkgPT4ge1xuICAgICAgY29uc3Qgc291cmNlID0gYHN0YXRpYyBbU3ltYm9sLmZvcignd29ya2Zsb3ctc2VyaWFsaXplJyldKGluc3RhbmNlKSB7fWA7XG4gICAgICBleHBlY3Qod29ya2Zsb3dTZXJkZVN5bWJvbFBhdHRlcm4udGVzdChzb3VyY2UpKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBtYXRjaCBTeW1ib2wuZm9yIHdpdGggd29ya2Zsb3ctZGVzZXJpYWxpemUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBgc3RhdGljIFtTeW1ib2wuZm9yKCd3b3JrZmxvdy1kZXNlcmlhbGl6ZScpXShkYXRhKSB7fWA7XG4gICAgICBleHBlY3Qod29ya2Zsb3dTZXJkZVN5bWJvbFBhdHRlcm4udGVzdChzb3VyY2UpKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBtYXRjaCB3aXRoIGRvdWJsZSBxdW90ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBgc3RhdGljIFtTeW1ib2wuZm9yKFwid29ya2Zsb3ctc2VyaWFsaXplXCIpXShpbnN0YW5jZSkge31gO1xuICAgICAgZXhwZWN0KHdvcmtmbG93U2VyZGVTeW1ib2xQYXR0ZXJuLnRlc3Qoc291cmNlKSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbWF0Y2ggd2l0aCB3aGl0ZXNwYWNlIHZhcmlhdGlvbnMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIHdvcmtmbG93U2VyZGVTeW1ib2xQYXR0ZXJuLnRlc3QoYFN5bWJvbC5mb3IoICd3b3JrZmxvdy1zZXJpYWxpemUnIClgKVxuICAgICAgKS50b0JlKHRydWUpO1xuICAgICAgZXhwZWN0KFxuICAgICAgICB3b3JrZmxvd1NlcmRlU3ltYm9sUGF0dGVybi50ZXN0KGBTeW1ib2wuZm9yKCd3b3JrZmxvdy1kZXNlcmlhbGl6ZScpYClcbiAgICAgICkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbWF0Y2ggaW4gYSBmdWxsIGNsYXNzIGRlZmluaXRpb24nLCAoKSA9PiB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBgXG4gICAgICAgIGV4cG9ydCBjbGFzcyBQb2ludCB7XG4gICAgICAgICAgY29uc3RydWN0b3IoeCwgeSkge1xuICAgICAgICAgICAgdGhpcy54ID0geDtcbiAgICAgICAgICAgIHRoaXMueSA9IHk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc3RhdGljIFtTeW1ib2wuZm9yKCd3b3JrZmxvdy1zZXJpYWxpemUnKV0oaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHg6IGluc3RhbmNlLngsIHk6IGluc3RhbmNlLnkgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzdGF0aWMgW1N5bWJvbC5mb3IoJ3dvcmtmbG93LWRlc2VyaWFsaXplJyldKGRhdGEpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUG9pbnQoZGF0YS54LCBkYXRhLnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgYDtcbiAgICAgIGV4cGVjdCh3b3JrZmxvd1NlcmRlU3ltYm9sUGF0dGVybi50ZXN0KHNvdXJjZSkpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCBtYXRjaCBvdGhlciBTeW1ib2wuZm9yIHVzYWdlJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KFxuICAgICAgICB3b3JrZmxvd1NlcmRlU3ltYm9sUGF0dGVybi50ZXN0KGBTeW1ib2wuZm9yKCdvdGhlci1zeW1ib2wnKWApXG4gICAgICApLnRvQmUoZmFsc2UpO1xuICAgICAgZXhwZWN0KFxuICAgICAgICB3b3JrZmxvd1NlcmRlU3ltYm9sUGF0dGVybi50ZXN0KGBTeW1ib2wuZm9yKCd3b3JrZmxvdy1zb21ldGhpbmctZWxzZScpYClcbiAgICAgICkudG9CZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCBtYXRjaCBub24tU3ltYm9sLmZvciBwYXR0ZXJucycsICgpID0+IHtcbiAgICAgIGV4cGVjdCh3b3JrZmxvd1NlcmRlU3ltYm9sUGF0dGVybi50ZXN0KGAnd29ya2Zsb3ctc2VyaWFsaXplJ2ApKS50b0JlKFxuICAgICAgICBmYWxzZVxuICAgICAgKTtcbiAgICAgIGV4cGVjdCh3b3JrZmxvd1NlcmRlU3ltYm9sUGF0dGVybi50ZXN0KGB3b3JrZmxvdy1kZXNlcmlhbGl6ZWApKS50b0JlKFxuICAgICAgICBmYWxzZVxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2NvbWJpbmVkIGRldGVjdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGRldGVjdCBmaWxlIHVzaW5nIGltcG9ydGVkIHN5bWJvbHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBgXG4gICAgICAgIGltcG9ydCB7IFdPUktGTE9XX1NFUklBTElaRSwgV09SS0ZMT1dfREVTRVJJQUxJWkUgfSBmcm9tICdAd29ya2Zsb3cvc2VyZGUnO1xuXG4gICAgICAgIGV4cG9ydCBjbGFzcyBNeUNsYXNzIHtcbiAgICAgICAgICBzdGF0aWMgW1dPUktGTE9XX1NFUklBTElaRV0oaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBpbnN0YW5jZS52YWx1ZSB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHN0YXRpYyBbV09SS0ZMT1dfREVTRVJJQUxJWkVdKGRhdGEpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTXlDbGFzcyhkYXRhLnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgICBleHBlY3Qod29ya2Zsb3dTZXJkZUltcG9ydFBhdHRlcm4udGVzdChzb3VyY2UpKS50b0JlKHRydWUpO1xuICAgICAgLy8gTm90ZTogd29ya2Zsb3dTZXJkZVN5bWJvbFBhdHRlcm4gd29uJ3QgbWF0Y2ggaGVyZSBiZWNhdXNlIHRoZSBzeW1ib2xzXG4gICAgICAvLyBhcmUgcmVmZXJlbmNlZCBieSBpZGVudGlmaWVyLCBub3QgZGlyZWN0bHkgYXMgU3ltYm9sLmZvcigpXG4gICAgICBleHBlY3Qod29ya2Zsb3dTZXJkZVN5bWJvbFBhdHRlcm4udGVzdChzb3VyY2UpKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZGV0ZWN0IGZpbGUgdXNpbmcgZGlyZWN0IFN5bWJvbC5mb3InLCAoKSA9PiB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBgXG4gICAgICAgIGV4cG9ydCBjbGFzcyBQb2ludCB7XG4gICAgICAgICAgc3RhdGljIFtTeW1ib2wuZm9yKCd3b3JrZmxvdy1zZXJpYWxpemUnKV0oaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHg6IGluc3RhbmNlLnggfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzdGF0aWMgW1N5bWJvbC5mb3IoJ3dvcmtmbG93LWRlc2VyaWFsaXplJyldKGRhdGEpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUG9pbnQoZGF0YS54KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgICBleHBlY3Qod29ya2Zsb3dTZXJkZUltcG9ydFBhdHRlcm4udGVzdChzb3VyY2UpKS50b0JlKGZhbHNlKTtcbiAgICAgIGV4cGVjdCh3b3JrZmxvd1NlcmRlU3ltYm9sUGF0dGVybi50ZXN0KHNvdXJjZSkpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGRldGVjdCBmaWxlIHdpdGggYm90aCBwYXR0ZXJucycsICgpID0+IHtcbiAgICAgIC8vIFRoaXMgd291bGQgYmUgdW51c3VhbCBidXQgdmFsaWRcbiAgICAgIGNvbnN0IHNvdXJjZSA9IGBcbiAgICAgICAgaW1wb3J0IHsgV09SS0ZMT1dfU0VSSUFMSVpFIH0gZnJvbSAnQHdvcmtmbG93L3NlcmRlJztcblxuICAgICAgICBleHBvcnQgY2xhc3MgUG9pbnQge1xuICAgICAgICAgIC8vIFVzaW5nIGltcG9ydGVkIHN5bWJvbFxuICAgICAgICAgIHN0YXRpYyBbV09SS0ZMT1dfU0VSSUFMSVpFXShpbnN0YW5jZSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgeDogaW5zdGFuY2UueCB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFVzaW5nIGRpcmVjdCBTeW1ib2wuZm9yXG4gICAgICAgICAgc3RhdGljIFtTeW1ib2wuZm9yKCd3b3JrZmxvdy1kZXNlcmlhbGl6ZScpXShkYXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBvaW50KGRhdGEueCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBgO1xuICAgICAgZXhwZWN0KHdvcmtmbG93U2VyZGVJbXBvcnRQYXR0ZXJuLnRlc3Qoc291cmNlKSkudG9CZSh0cnVlKTtcbiAgICAgIGV4cGVjdCh3b3JrZmxvd1NlcmRlU3ltYm9sUGF0dGVybi50ZXN0KHNvdXJjZSkpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd3b3JrZmxvd1NlcmRlQ29tcHV0ZWRQcm9wZXJ0eVBhdHRlcm4nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBtYXRjaCBbV09SS0ZMT1dfU0VSSUFMSVpFXSBjb21wdXRlZCBwcm9wZXJ0eScsICgpID0+IHtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IGBzdGF0aWMgW1dPUktGTE9XX1NFUklBTElaRV0oaW5zdGFuY2UpIHt9YDtcbiAgICAgIGV4cGVjdCh3b3JrZmxvd1NlcmRlQ29tcHV0ZWRQcm9wZXJ0eVBhdHRlcm4udGVzdChzb3VyY2UpKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBtYXRjaCBbV09SS0ZMT1dfREVTRVJJQUxJWkVdIGNvbXB1dGVkIHByb3BlcnR5JywgKCkgPT4ge1xuICAgICAgY29uc3Qgc291cmNlID0gYHN0YXRpYyBbV09SS0ZMT1dfREVTRVJJQUxJWkVdKGRhdGEpIHt9YDtcbiAgICAgIGV4cGVjdCh3b3JrZmxvd1NlcmRlQ29tcHV0ZWRQcm9wZXJ0eVBhdHRlcm4udGVzdChzb3VyY2UpKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBtYXRjaCB3aXRoIHdoaXRlc3BhY2UgaW5zaWRlIGJyYWNrZXRzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KFxuICAgICAgICB3b3JrZmxvd1NlcmRlQ29tcHV0ZWRQcm9wZXJ0eVBhdHRlcm4udGVzdChgWyBXT1JLRkxPV19TRVJJQUxJWkUgXWApXG4gICAgICApLnRvQmUodHJ1ZSk7XG4gICAgICBleHBlY3QoXG4gICAgICAgIHdvcmtmbG93U2VyZGVDb21wdXRlZFByb3BlcnR5UGF0dGVybi50ZXN0KGBbICBXT1JLRkxPV19ERVNFUklBTElaRSAgXWApXG4gICAgICApLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG1hdGNoIGluIGJ1bmRsZWQgY29kZSB3aGVyZSBzeW1ib2xzIGFyZSBpbXBvcnRlZCBmcm9tIGNodW5rcycsICgpID0+IHtcbiAgICAgIC8vIFRoaXMgaXMgdGhlIHBhdHRlcm4gc2VlbiBpbiBidW5kbGVkIHBhY2thZ2VzIGxpa2UganVzdC1iYXNoXG4gICAgICBjb25zdCBzb3VyY2UgPSBgXG4gICAgICAgIGltcG9ydCB7XG4gICAgICAgICAgV09SS0ZMT1dfREVTRVJJQUxJWkUsXG4gICAgICAgICAgV09SS0ZMT1dfU0VSSUFMSVpFXG4gICAgICAgIH0gZnJvbSBcIi4vY2h1bmtzL2NodW5rLTQ1MzMyM1FZLmpzXCI7XG5cbiAgICAgICAgdmFyIEJhc2ggPSBjbGFzcyBfQmFzaCB7XG4gICAgICAgICAgc3RhdGljIFtXT1JLRkxPV19TRVJJQUxJWkVdKGluc3RhbmNlKSB7XG4gICAgICAgICAgICByZXR1cm4geyBmczogaW5zdGFuY2UuZnMgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3RhdGljIFtXT1JLRkxPV19ERVNFUklBTElaRV0oc2VyaWFsaXplZCkge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5jcmVhdGUoX0Jhc2gucHJvdG90eXBlLCB7XG4gICAgICAgICAgICAgIGZzOiB7IHZhbHVlOiBzZXJpYWxpemVkLmZzIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIGA7XG4gICAgICBleHBlY3Qod29ya2Zsb3dTZXJkZUNvbXB1dGVkUHJvcGVydHlQYXR0ZXJuLnRlc3Qoc291cmNlKSkudG9CZSh0cnVlKTtcbiAgICAgIC8vIE5vdGU6IGltcG9ydCBwYXR0ZXJuIHdvbid0IG1hdGNoIGJlY2F1c2UgaXQncyBmcm9tIGEgY2h1bmssIG5vdCBAd29ya2Zsb3cvc2VyZGVcbiAgICAgIGV4cGVjdCh3b3JrZmxvd1NlcmRlSW1wb3J0UGF0dGVybi50ZXN0KHNvdXJjZSkpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgbWF0Y2ggcGFydGlhbCBuYW1lcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgd29ya2Zsb3dTZXJkZUNvbXB1dGVkUHJvcGVydHlQYXR0ZXJuLnRlc3QoYFtXT1JLRkxPV19TRVJJQUxJWkVfRVhUUkFdYClcbiAgICAgICkudG9CZShmYWxzZSk7XG4gICAgICBleHBlY3QoXG4gICAgICAgIHdvcmtmbG93U2VyZGVDb21wdXRlZFByb3BlcnR5UGF0dGVybi50ZXN0KGBbTVlfV09SS0ZMT1dfU0VSSUFMSVpFXWApXG4gICAgICApLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgbWF0Y2ggc3RyaW5nIGxpdGVyYWxzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KFxuICAgICAgICB3b3JrZmxvd1NlcmRlQ29tcHV0ZWRQcm9wZXJ0eVBhdHRlcm4udGVzdChgWydXT1JLRkxPV19TRVJJQUxJWkUnXWApXG4gICAgICApLnRvQmUoZmFsc2UpO1xuICAgICAgZXhwZWN0KFxuICAgICAgICB3b3JrZmxvd1NlcmRlQ29tcHV0ZWRQcm9wZXJ0eVBhdHRlcm4udGVzdChgW1wiV09SS0ZMT1dfREVTRVJJQUxJWkVcIl1gKVxuICAgICAgKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2RldGVjdFdvcmtmbG93UGF0dGVybnMnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBkZXRlY3QgaGFzU2VyZGUgZm9yIEB3b3JrZmxvdy9zZXJkZSBpbXBvcnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBgaW1wb3J0IHsgV09SS0ZMT1dfU0VSSUFMSVpFIH0gZnJvbSAnQHdvcmtmbG93L3NlcmRlJztgO1xuICAgICAgY29uc3QgcmVzdWx0ID0gZGV0ZWN0V29ya2Zsb3dQYXR0ZXJucyhzb3VyY2UpO1xuICAgICAgZXhwZWN0KHJlc3VsdC5oYXNTZXJkZSkudG9CZSh0cnVlKTtcbiAgICAgIGV4cGVjdChyZXN1bHQuaGFzU2VyZGVJbXBvcnQpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGRldGVjdCBoYXNTZXJkZSBmb3IgU3ltYm9sLmZvciBwYXR0ZXJuJywgKCkgPT4ge1xuICAgICAgY29uc3Qgc291cmNlID0gYHN0YXRpYyBbU3ltYm9sLmZvcignd29ya2Zsb3ctc2VyaWFsaXplJyldKGluc3RhbmNlKSB7fWA7XG4gICAgICBjb25zdCByZXN1bHQgPSBkZXRlY3RXb3JrZmxvd1BhdHRlcm5zKHNvdXJjZSk7XG4gICAgICBleHBlY3QocmVzdWx0Lmhhc1NlcmRlKS50b0JlKHRydWUpO1xuICAgICAgZXhwZWN0KHJlc3VsdC5oYXNTZXJkZVN5bWJvbCkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZGV0ZWN0IGhhc1NlcmRlIGZvciBjb21wdXRlZCBwcm9wZXJ0eSBwYXR0ZXJuJywgKCkgPT4ge1xuICAgICAgY29uc3Qgc291cmNlID0gYHN0YXRpYyBbV09SS0ZMT1dfU0VSSUFMSVpFXShpbnN0YW5jZSkge31gO1xuICAgICAgY29uc3QgcmVzdWx0ID0gZGV0ZWN0V29ya2Zsb3dQYXR0ZXJucyhzb3VyY2UpO1xuICAgICAgZXhwZWN0KHJlc3VsdC5oYXNTZXJkZSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZGV0ZWN0IGhhc1NlcmRlIGZvciBidW5kbGVkIHRoaXJkLXBhcnR5IHBhY2thZ2VzJywgKCkgPT4ge1xuICAgICAgLy8gU2ltdWxhdGVzIGJ1bmRsZWQgb3V0cHV0IGZyb20gcGFja2FnZXMgbGlrZSBqdXN0LWJhc2hcbiAgICAgIGNvbnN0IHNvdXJjZSA9IGBcbiAgICAgICAgaW1wb3J0IHtcbiAgICAgICAgICBXT1JLRkxPV19ERVNFUklBTElaRSxcbiAgICAgICAgICBXT1JLRkxPV19TRVJJQUxJWkVcbiAgICAgICAgfSBmcm9tIFwiLi9jaHVua3MvY2h1bmstQUJDMTIzLmpzXCI7XG5cbiAgICAgICAgdmFyIE15Q2xhc3MgPSBjbGFzcyB7XG4gICAgICAgICAgc3RhdGljIFtXT1JLRkxPV19TRVJJQUxJWkVdKGluc3RhbmNlKSB7XG4gICAgICAgICAgICByZXR1cm4geyBkYXRhOiBpbnN0YW5jZS5kYXRhIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YXRpYyBbV09SS0ZMT1dfREVTRVJJQUxJWkVdKHNlcmlhbGl6ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTXlDbGFzcyhzZXJpYWxpemVkLmRhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIGA7XG4gICAgICBjb25zdCByZXN1bHQgPSBkZXRlY3RXb3JrZmxvd1BhdHRlcm5zKHNvdXJjZSk7XG4gICAgICBleHBlY3QocmVzdWx0Lmhhc1NlcmRlKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgZGV0ZWN0IGhhc1NlcmRlIGZvciB1bnJlbGF0ZWQgY29kZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IGBcbiAgICAgICAgZXhwb3J0IGNsYXNzIFJlZ3VsYXJDbGFzcyB7XG4gICAgICAgICAgY29uc3RydWN0b3IodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgICBjb25zdCByZXN1bHQgPSBkZXRlY3RXb3JrZmxvd1BhdHRlcm5zKHNvdXJjZSk7XG4gICAgICBleHBlY3QocmVzdWx0Lmhhc1NlcmRlKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZGV0ZWN0IGJvdGggZGlyZWN0aXZlIGFuZCBzZXJkZSBwYXR0ZXJucycsICgpID0+IHtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IGBcbiAgICAgICAgJ3VzZSBzdGVwJztcbiAgICAgICAgaW1wb3J0IHsgV09SS0ZMT1dfU0VSSUFMSVpFIH0gZnJvbSAnQHdvcmtmbG93L3NlcmRlJztcbiAgICAgICAgXG4gICAgICAgIGV4cG9ydCBjbGFzcyBQb2ludCB7XG4gICAgICAgICAgc3RhdGljIFtXT1JLRkxPV19TRVJJQUxJWkVdKGluc3RhbmNlKSB7XG4gICAgICAgICAgICByZXR1cm4geyB4OiBpbnN0YW5jZS54IH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBgO1xuICAgICAgY29uc3QgcmVzdWx0ID0gZGV0ZWN0V29ya2Zsb3dQYXR0ZXJucyhzb3VyY2UpO1xuICAgICAgZXhwZWN0KHJlc3VsdC5oYXNEaXJlY3RpdmUpLnRvQmUodHJ1ZSk7XG4gICAgICBleHBlY3QocmVzdWx0Lmhhc1VzZVN0ZXApLnRvQmUodHJ1ZSk7XG4gICAgICBleHBlY3QocmVzdWx0Lmhhc1NlcmRlKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlZ2V4cCBkZXRlY3Rpb24gbWF0Y2hlcyBkaXJlY3RpdmVzIGluc2lkZSB0ZW1wbGF0ZSBsaXRlcmFscyAoZmFsc2UgcG9zaXRpdmUpJywgKCkgPT4ge1xuICAgICAgLy8gZGV0ZWN0V29ya2Zsb3dQYXR0ZXJucyB1c2VzIHJlZ2V4cCBhbmQgd2lsbCBtYXRjaCBkaXJlY3RpdmUtbGlrZVxuICAgICAgLy8gc3RyaW5ncyBpbnNpZGUgdGVtcGxhdGUgbGl0ZXJhbHMuIFRoZSBkaXNjb3Zlci1lbnRyaWVzIHBsdWdpblxuICAgICAgLy8gaGFuZGxlcyB0aGlzIGJ5IHVzaW5nIHRoZSBTV0MgcGx1Z2luIG1hbmlmZXN0IChBU1QtbGV2ZWwpIGZvclxuICAgICAgLy8gZGlyZWN0aXZlIGRpc2NvdmVyeSBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gcmVnZXhwIGFsb25lLlxuICAgICAgY29uc3Qgc291cmNlID0gYCd1c2UgY2xpZW50JztcbmNvbnN0IENPREVfU05JUFBFVCA9IFxcYGltcG9ydCB7IHNsZWVwIH0gZnJvbSBcIndvcmtmbG93XCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoYW5kbGVVc2VyU2lnbnVwKGVtYWlsOiBzdHJpbmcpIHtcbiAgXCJ1c2Ugd29ya2Zsb3dcIjtcbiAgY29uc3QgdXNlciA9IGF3YWl0IGNyZWF0ZVVzZXIoZW1haWwpO1xufVxuXFxgO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gUGFnZSgpIHsgcmV0dXJuIG51bGw7IH1cbmA7XG4gICAgICBjb25zdCByZXN1bHQgPSBkZXRlY3RXb3JrZmxvd1BhdHRlcm5zKHNvdXJjZSk7XG4gICAgICBleHBlY3QocmVzdWx0Lmhhc1VzZVdvcmtmbG93KS50b0JlKHRydWUpO1xuICAgICAgZXhwZWN0KHJlc3VsdC5oYXNEaXJlY3RpdmUpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaG91bGRUcmFuc2Zvcm1GaWxlJywgKCkgPT4ge1xuICAgIGNvbnN0IG5vUGF0dGVybnMgPSB7XG4gICAgICBoYXNVc2VXb3JrZmxvdzogZmFsc2UsXG4gICAgICBoYXNVc2VTdGVwOiBmYWxzZSxcbiAgICAgIGhhc1NlcmRlSW1wb3J0OiBmYWxzZSxcbiAgICAgIGhhc1NlcmRlU3ltYm9sOiBmYWxzZSxcbiAgICAgIGhhc0RpcmVjdGl2ZTogZmFsc2UsXG4gICAgICBoYXNTZXJkZTogZmFsc2UsXG4gICAgfTtcblxuICAgIGl0KCdleGNsdWRlcyBnZW5lcmF0ZWQgd29ya2Zsb3cgcm91dGUgZmlsZXMgZXZlbiB3aXRoIGRpcmVjdGl2ZXMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIHNob3VsZFRyYW5zZm9ybUZpbGUoJy9hcHAvLndlbGwta25vd24vd29ya2Zsb3cvdjEvcm91dGUudHMnLCB7XG4gICAgICAgICAgLi4ubm9QYXR0ZXJucyxcbiAgICAgICAgICBoYXNVc2VXb3JrZmxvdzogdHJ1ZSxcbiAgICAgICAgICBoYXNEaXJlY3RpdmU6IHRydWUsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3RyYW5zZm9ybXMgZmlsZXMgd2l0aCBkaXJlY3RpdmUgcGF0dGVybnMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIHNob3VsZFRyYW5zZm9ybUZpbGUoJy9hcHAvd29ya2Zsb3dzL215LXdvcmtmbG93LnRzJywge1xuICAgICAgICAgIC4uLm5vUGF0dGVybnMsXG4gICAgICAgICAgaGFzVXNlV29ya2Zsb3c6IHRydWUsXG4gICAgICAgICAgaGFzRGlyZWN0aXZlOiB0cnVlLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3RyYW5zZm9ybXMgZmlsZXMgd2l0aCBzZXJkZSBwYXR0ZXJucycsICgpID0+IHtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgc2hvdWxkVHJhbnNmb3JtRmlsZSgnL2FwcC9saWIvbXktY2xhc3MudHMnLCB7XG4gICAgICAgICAgLi4ubm9QYXR0ZXJucyxcbiAgICAgICAgICBoYXNTZXJkZUltcG9ydDogdHJ1ZSxcbiAgICAgICAgICBoYXNTZXJkZTogdHJ1ZSxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCd0cmFuc2Zvcm1zIFNESyBmaWxlcyB3aXRoIHNlcmRlIHBhdHRlcm5zIChubyBsb25nZXIgZXhjbHVkZWQpJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KFxuICAgICAgICBzaG91bGRUcmFuc2Zvcm1GaWxlKFxuICAgICAgICAgICcvYXBwL25vZGVfbW9kdWxlcy9Ad29ya2Zsb3cvY29yZS9kaXN0L3NlcmlhbGl6YXRpb24uanMnLFxuICAgICAgICAgIHsgLi4ubm9QYXR0ZXJucywgaGFzU2VyZGVTeW1ib2w6IHRydWUsIGhhc1NlcmRlOiB0cnVlIH1cbiAgICAgICAgKVxuICAgICAgKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IHRyYW5zZm9ybSBmaWxlcyB3aXRob3V0IGRpcmVjdGl2ZXMgb3Igc2VyZGUgcGF0dGVybnMnLCAoKSA9PiB7XG4gICAgICBleHBlY3Qoc2hvdWxkVHJhbnNmb3JtRmlsZSgnL2FwcC9saWIvdXRpbHMudHMnLCBub1BhdHRlcm5zKSkudG9CZShmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|