@nlabs/lex 1.49.4 → 1.50.0
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/.swcrc +35 -0
- package/README.md +43 -59
- package/__mocks__/chalk.js +19 -17
- package/config.json +32 -8
- package/examples/lex.config.js +110 -10
- package/index.cjs +1 -5
- package/lex.config.js +34 -7
- package/lib/Button.stories.js +99 -0
- package/lib/LexConfig.d.ts +60 -22
- package/lib/LexConfig.js +285 -244
- package/lib/commands/ai/ai.js +287 -288
- package/lib/commands/ai/index.js +8 -7
- package/lib/commands/build/build.d.ts +2 -2
- package/lib/commands/build/build.js +349 -458
- package/lib/commands/clean/clean.js +45 -33
- package/lib/commands/compile/compile.js +214 -227
- package/lib/commands/config/config.js +46 -42
- package/lib/commands/copy/copy.js +36 -35
- package/lib/commands/create/create.js +200 -121
- package/lib/commands/dev/dev.d.ts +2 -0
- package/lib/commands/dev/dev.js +259 -263
- package/lib/commands/init/init.js +108 -88
- package/lib/commands/link/link.js +18 -14
- package/lib/commands/lint/lint.js +735 -742
- package/lib/commands/migrate/migrate.js +49 -36
- package/lib/commands/publish/publish.js +116 -96
- package/lib/commands/serverless/serverless.js +611 -585
- package/lib/commands/storybook/storybook.js +242 -238
- package/lib/commands/test/test.d.ts +1 -1
- package/lib/commands/test/test.js +382 -394
- package/lib/commands/update/update.js +141 -120
- package/lib/commands/upgrade/upgrade.js +51 -44
- package/lib/commands/versions/versions.d.ts +1 -1
- package/lib/commands/versions/versions.js +36 -38
- package/lib/create/changelog.js +136 -125
- package/lib/index.js +40 -38
- package/lib/lex.js +95 -68
- package/lib/storybook/index.js +6 -1
- package/lib/test-react/index.js +7 -84
- package/lib/types.d.ts +1 -1
- package/lib/types.js +7 -1
- package/lib/utils/aiService.js +240 -227
- package/lib/utils/app.js +274 -273
- package/lib/utils/deepMerge.js +37 -23
- package/lib/utils/file.js +218 -215
- package/lib/utils/log.js +29 -27
- package/lib/utils/reactShim.js +7 -85
- package/lib/utils/translations.js +91 -65
- package/package.json +63 -64
- package/templates/typescript/DataLayer.js.txt +218 -0
- package/templates/typescript/DataLayer.test.js.txt +268 -0
- package/templates/typescript/DataLayer.test.ts.txt +269 -0
- package/templates/typescript/DataLayer.ts.txt +227 -0
- package/webpack.config.js +53 -26
- package/lib/commands/lint/autofix.d.ts +0 -2
|
@@ -1,249 +1,253 @@
|
|
|
1
|
-
import chalk from
|
|
2
|
-
import { execa } from
|
|
3
|
-
import { existsSync } from
|
|
4
|
-
import { sync as globSync } from
|
|
5
|
-
import { resolve as pathResolve } from
|
|
6
|
-
import { LexConfig } from
|
|
7
|
-
import { createSpinner } from
|
|
8
|
-
import { findTailwindCssPath, resolveBinaryPath } from
|
|
9
|
-
import { log } from
|
|
10
|
-
const findStoryFiles = ()
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { execa } from 'execa';
|
|
3
|
+
import { existsSync } from 'fs';
|
|
4
|
+
import { sync as globSync } from 'glob';
|
|
5
|
+
import { resolve as pathResolve } from 'path';
|
|
6
|
+
import { LexConfig } from '../../LexConfig.js';
|
|
7
|
+
import { createSpinner } from '../../utils/app.js';
|
|
8
|
+
import { findTailwindCssPath, resolveBinaryPath } from '../../utils/file.js';
|
|
9
|
+
import { log } from '../../utils/log.js';
|
|
10
|
+
const findStoryFiles = ()=>{
|
|
11
|
+
const storyPatterns = [
|
|
12
|
+
'**/*.stories.{ts,tsx,js,jsx}',
|
|
13
|
+
'**/*.story.{ts,tsx,js,jsx}',
|
|
14
|
+
'**/stories/**/*.{ts,tsx,js,jsx}'
|
|
15
|
+
];
|
|
16
|
+
const storyFiles = [];
|
|
17
|
+
storyPatterns.forEach((pattern)=>{
|
|
18
|
+
const files = globSync(pattern, {
|
|
19
|
+
cwd: process.cwd(),
|
|
20
|
+
ignore: [
|
|
21
|
+
'**/node_modules/**',
|
|
22
|
+
'**/dist/**',
|
|
23
|
+
'**/lib/**',
|
|
24
|
+
'**/build/**'
|
|
25
|
+
]
|
|
26
|
+
});
|
|
27
|
+
storyFiles.push(...files);
|
|
21
28
|
});
|
|
22
|
-
storyFiles
|
|
23
|
-
});
|
|
24
|
-
return storyFiles;
|
|
29
|
+
return storyFiles;
|
|
25
30
|
};
|
|
26
|
-
const checkStorybookInitialization = ()
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
31
|
+
const checkStorybookInitialization = ()=>{
|
|
32
|
+
const projectConfigDir = pathResolve(process.cwd(), '.storybook');
|
|
33
|
+
const lexConfigDir = pathResolve(LexConfig.getLexDir(), '.storybook');
|
|
34
|
+
return existsSync(projectConfigDir) || existsSync(lexConfigDir);
|
|
30
35
|
};
|
|
31
|
-
const extractProgressPercentage = (output)
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
36
|
+
const extractProgressPercentage = (output)=>{
|
|
37
|
+
const lines = output.split('\n');
|
|
38
|
+
for (const line of lines){
|
|
39
|
+
if (line.includes('[webpack.Progress]') && line.includes('%')) {
|
|
40
|
+
const percentageMatch = line.match(/(\d+)%/);
|
|
41
|
+
if (percentageMatch) {
|
|
42
|
+
return parseInt(percentageMatch[1]);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return null;
|
|
42
47
|
};
|
|
43
|
-
const filterAndBeautifyOutput = (output, isVerbose)
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
48
|
+
const filterAndBeautifyOutput = (output, isVerbose)=>{
|
|
49
|
+
if (isVerbose) {
|
|
50
|
+
return output;
|
|
51
|
+
}
|
|
52
|
+
const lines = output.split('\n');
|
|
53
|
+
const filteredLines = lines.filter((line)=>{
|
|
54
|
+
if (line.includes('[webpack.Progress]')) {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
if (line.includes('Storybook') || line.includes('Local:') || line.includes('http://localhost') || line.includes('info =>') || line.includes('Starting') || line.includes('ready') || line.includes('error') || line.includes('warning')) {
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
return true;
|
|
61
|
+
});
|
|
62
|
+
return filteredLines.join('\n');
|
|
58
63
|
};
|
|
59
|
-
const beautifyOutput = (output)
|
|
60
|
-
const storybook = async (cmd, callback = ()
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
process.env = { ...process.env, ...variablesObj };
|
|
77
|
-
spinner.start("Finding story files...");
|
|
78
|
-
const storyFiles = findStoryFiles();
|
|
79
|
-
if (storyFiles.length === 0) {
|
|
80
|
-
spinner.fail("No story files found in the project.");
|
|
81
|
-
log("Please create story files with .stories.ts/.stories.js extensions or in a stories/ directory.", "info", quiet);
|
|
82
|
-
callback(1);
|
|
83
|
-
return 1;
|
|
84
|
-
}
|
|
85
|
-
spinner.succeed(`Found ${storyFiles.length} story file(s)`);
|
|
86
|
-
const tailwindCssPath = findTailwindCssPath();
|
|
87
|
-
console.log({ tailwindCssPath });
|
|
88
|
-
if (tailwindCssPath) {
|
|
89
|
-
if (!quiet) {
|
|
90
|
-
log(chalk.green(`\u2713 Tailwind CSS integration detected: ${tailwindCssPath}`), "info", quiet);
|
|
64
|
+
const beautifyOutput = (output)=>output.replace(/Storybook v[\d.]+/g, chalk.cyan('$&')).replace(/info =>/g, chalk.blue('info =>')).replace(/Local:/g, chalk.green('Local:')).replace(/On your network:/g, chalk.green('On your network:')).replace(/Storybook.*started/g, chalk.green('$&')).replace(/Storybook.*ready/g, chalk.green('$&')).replace(/error/g, chalk.red('$&')).replace(/warning/g, chalk.yellow('$&')).replace(/(\d+)%/g, chalk.magenta('$1%'));
|
|
65
|
+
export const storybook = async (cmd, callback = ()=>({}))=>{
|
|
66
|
+
const { cliName = 'Lex', config, open = false, port = 6007, quiet, static: staticBuild = false, useLexConfig = false, variables, verbose = false } = cmd;
|
|
67
|
+
const spinner = createSpinner(quiet);
|
|
68
|
+
log(chalk.cyan(`${cliName} starting Storybook...`), 'info', quiet);
|
|
69
|
+
await LexConfig.parseConfig(cmd);
|
|
70
|
+
let variablesObj = {
|
|
71
|
+
NODE_ENV: 'development'
|
|
72
|
+
};
|
|
73
|
+
if (variables) {
|
|
74
|
+
try {
|
|
75
|
+
variablesObj = JSON.parse(variables);
|
|
76
|
+
} catch (_error) {
|
|
77
|
+
log(`\n${cliName} Error: Environment variables option is not a valid JSON object.`, 'error', quiet);
|
|
78
|
+
callback(1);
|
|
79
|
+
return 1;
|
|
80
|
+
}
|
|
91
81
|
}
|
|
92
|
-
|
|
93
|
-
if (!quiet) {
|
|
94
|
-
log(chalk.yellow("\u26A0 No Tailwind CSS file found in project"), "info", quiet);
|
|
95
|
-
log(chalk.gray("Create a tailwind.css file with @tailwind directives for full Tailwind support"), "info", quiet);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
if (!checkStorybookInitialization()) {
|
|
99
|
-
spinner.fail("Storybook is not initialized in this project or in Lex.");
|
|
100
|
-
log('Please run "npx storybook@latest init" to set up Storybook in your project, or ensure Lex has a valid .storybook configuration.', "info", quiet);
|
|
101
|
-
callback(1);
|
|
102
|
-
return 1;
|
|
103
|
-
}
|
|
104
|
-
const projectConfigDir = pathResolve(process.cwd(), ".storybook");
|
|
105
|
-
const lexConfigDir = pathResolve(LexConfig.getLexDir(), ".storybook");
|
|
106
|
-
let configDir = config;
|
|
107
|
-
if (!configDir) {
|
|
108
|
-
configDir = lexConfigDir;
|
|
109
|
-
if (!useLexConfig && existsSync(projectConfigDir)) {
|
|
110
|
-
configDir = projectConfigDir;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
if (!quiet) {
|
|
114
|
-
log(chalk.gray(`Project config dir: ${projectConfigDir} (exists: ${existsSync(projectConfigDir)})`), "info", quiet);
|
|
115
|
-
log(chalk.gray(`Lex config dir: ${lexConfigDir} (exists: ${existsSync(lexConfigDir)})`), "info", quiet);
|
|
116
|
-
if (useLexConfig) {
|
|
117
|
-
log(chalk.blue("Using Lex Storybook configuration (--use-lex-config flag)"), "info", quiet);
|
|
118
|
-
}
|
|
119
|
-
log(chalk.gray(`Initial config dir: ${configDir}`), "info", quiet);
|
|
120
|
-
}
|
|
121
|
-
if (configDir === lexConfigDir) {
|
|
122
|
-
if (!quiet) {
|
|
123
|
-
log(chalk.blue("Using Lex config, will create temporary config in project .storybook directory"), "info", quiet);
|
|
124
|
-
}
|
|
125
|
-
const projectStorybookDir = pathResolve(process.cwd(), ".storybook");
|
|
126
|
-
const fs = await import("fs/promises");
|
|
127
|
-
await fs.mkdir(projectStorybookDir, { recursive: true });
|
|
128
|
-
const lexMainPath = pathResolve(lexConfigDir, "main.ts");
|
|
129
|
-
const projectMainPath = pathResolve(projectStorybookDir, "main.ts");
|
|
130
|
-
let mainContent = await fs.readFile(lexMainPath, "utf8");
|
|
131
|
-
mainContent = mainContent.replace(
|
|
132
|
-
/stories:\s*\[.*?\]/,
|
|
133
|
-
`stories: ['${pathResolve(process.cwd(), "src/**/*.stories.@(ts|tsx)")}', '${pathResolve(process.cwd(), "src/**/*.mdx")}']`
|
|
134
|
-
);
|
|
135
|
-
const lexNodeModules = pathResolve(LexConfig.getLexDir(), "node_modules");
|
|
136
|
-
mainContent = mainContent.replace(
|
|
137
|
-
/const lexModule = \(modulePath: string\) => resolve\(getLexNodeModulesPath\(\), modulePath\);/,
|
|
138
|
-
`const lexModule = (modulePath: string) => resolve('${lexNodeModules}', modulePath);`
|
|
139
|
-
);
|
|
140
|
-
await fs.writeFile(projectMainPath, mainContent);
|
|
141
|
-
const lexPreviewPath = pathResolve(lexConfigDir, "preview.tsx");
|
|
142
|
-
if (existsSync(lexPreviewPath)) {
|
|
143
|
-
const previewContent = await fs.readFile(lexPreviewPath, "utf8");
|
|
144
|
-
await fs.writeFile(pathResolve(projectStorybookDir, "preview.tsx"), previewContent);
|
|
145
|
-
}
|
|
146
|
-
configDir = projectStorybookDir;
|
|
147
|
-
}
|
|
148
|
-
if (!existsSync(configDir)) {
|
|
149
|
-
spinner.fail("Storybook configuration not found.");
|
|
150
|
-
log(`Project config: ${projectConfigDir}`, "info", quiet);
|
|
151
|
-
log(`Lex config: ${lexConfigDir}`, "info", quiet);
|
|
152
|
-
log('Please run "npx storybook@latest init" to set up Storybook in your project, or ensure Lex has a valid .storybook configuration.', "info", quiet);
|
|
153
|
-
callback(1);
|
|
154
|
-
return 1;
|
|
155
|
-
}
|
|
156
|
-
const storybookPath = resolveBinaryPath("storybook");
|
|
157
|
-
if (!storybookPath) {
|
|
158
|
-
log(`
|
|
159
|
-
${cliName} Error: storybook binary not found in Lex's node_modules or monorepo root`, "error", quiet);
|
|
160
|
-
log("Please reinstall Lex or check your Storybook installation.", "info", quiet);
|
|
161
|
-
callback(1);
|
|
162
|
-
return 1;
|
|
163
|
-
}
|
|
164
|
-
const storybookArgs = [staticBuild ? "build" : "dev"];
|
|
165
|
-
storybookArgs.push("--config-dir", configDir);
|
|
166
|
-
if (port) {
|
|
167
|
-
storybookArgs.push("--port", port.toString());
|
|
168
|
-
}
|
|
169
|
-
if (open) {
|
|
170
|
-
storybookArgs.push("--open");
|
|
171
|
-
}
|
|
172
|
-
if (staticBuild) {
|
|
173
|
-
const outputDir = pathResolve(process.cwd(), "storybook-static");
|
|
174
|
-
storybookArgs.push("--output-dir", outputDir);
|
|
175
|
-
}
|
|
176
|
-
if (!quiet) {
|
|
177
|
-
log(chalk.gray(`Config directory: ${configDir}`), "info", quiet);
|
|
178
|
-
}
|
|
179
|
-
process.env.TAILWIND_CSS_PATH = tailwindCssPath;
|
|
180
|
-
try {
|
|
181
|
-
spinner.start(staticBuild ? "Building static Storybook..." : "Starting Storybook development server...");
|
|
182
|
-
const storybookProcess = execa(storybookPath, storybookArgs, {
|
|
183
|
-
encoding: "utf8",
|
|
184
|
-
env: {
|
|
82
|
+
process.env = {
|
|
185
83
|
...process.env,
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
const action = staticBuild ? "Building" : "Starting";
|
|
201
|
-
spinner.text = `${action} Storybook... ${progressPercentage}%`;
|
|
202
|
-
process.stdout.write(`
|
|
203
|
-
Webpack Progress: ${chalk.magenta(`${progressPercentage}%`)}
|
|
204
|
-
`);
|
|
205
|
-
}
|
|
206
|
-
const filteredOutput = filterAndBeautifyOutput(output, verbose);
|
|
207
|
-
const beautifiedOutput = beautifyOutput(filteredOutput);
|
|
208
|
-
if (!urlFound && (output.includes("Local:") || output.includes("http://localhost") || output.includes("Storybook"))) {
|
|
209
|
-
spinner.succeed(chalk.green("Storybook development server is ready!"));
|
|
210
|
-
urlFound = true;
|
|
211
|
-
}
|
|
212
|
-
if (filteredOutput.trim()) {
|
|
213
|
-
process.stdout.write(beautifiedOutput);
|
|
214
|
-
}
|
|
215
|
-
});
|
|
216
|
-
storybookProcess.stderr?.on("data", (data) => {
|
|
217
|
-
const output = data.toString();
|
|
218
|
-
const filteredOutput = filterAndBeautifyOutput(output, verbose);
|
|
219
|
-
const beautifiedOutput = beautifyOutput(filteredOutput);
|
|
220
|
-
if (filteredOutput.trim()) {
|
|
221
|
-
process.stderr.write(beautifiedOutput);
|
|
222
|
-
}
|
|
84
|
+
...variablesObj
|
|
85
|
+
};
|
|
86
|
+
spinner.start('Finding story files...');
|
|
87
|
+
const storyFiles = findStoryFiles();
|
|
88
|
+
if (storyFiles.length === 0) {
|
|
89
|
+
spinner.fail('No story files found in the project.');
|
|
90
|
+
log('Please create story files with .stories.ts/.stories.js extensions or in a stories/ directory.', 'info', quiet);
|
|
91
|
+
callback(1);
|
|
92
|
+
return 1;
|
|
93
|
+
}
|
|
94
|
+
spinner.succeed(`Found ${storyFiles.length} story file(s)`);
|
|
95
|
+
const tailwindCssPath = findTailwindCssPath();
|
|
96
|
+
console.log({
|
|
97
|
+
tailwindCssPath
|
|
223
98
|
});
|
|
99
|
+
if (tailwindCssPath) {
|
|
100
|
+
if (!quiet) {
|
|
101
|
+
log(chalk.green(`✓ Tailwind CSS integration detected: ${tailwindCssPath}`), 'info', quiet);
|
|
102
|
+
}
|
|
103
|
+
} else {
|
|
104
|
+
if (!quiet) {
|
|
105
|
+
log(chalk.yellow('⚠ No Tailwind CSS file found in project'), 'info', quiet);
|
|
106
|
+
log(chalk.gray('Create a tailwind.css file with @tailwind directives for full Tailwind support'), 'info', quiet);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (!checkStorybookInitialization()) {
|
|
110
|
+
spinner.fail('Storybook is not initialized in this project or in Lex.');
|
|
111
|
+
log('Please run "npx storybook@latest init" to set up Storybook in your project, or ensure Lex has a valid .storybook configuration.', 'info', quiet);
|
|
112
|
+
callback(1);
|
|
113
|
+
return 1;
|
|
114
|
+
}
|
|
115
|
+
const projectConfigDir = pathResolve(process.cwd(), '.storybook');
|
|
116
|
+
const lexConfigDir = pathResolve(LexConfig.getLexDir(), '.storybook');
|
|
117
|
+
let configDir = config;
|
|
118
|
+
if (!configDir) {
|
|
119
|
+
configDir = lexConfigDir;
|
|
120
|
+
if (!useLexConfig && existsSync(projectConfigDir)) {
|
|
121
|
+
configDir = projectConfigDir;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
if (!quiet) {
|
|
125
|
+
log(chalk.gray(`Project config dir: ${projectConfigDir} (exists: ${existsSync(projectConfigDir)})`), 'info', quiet);
|
|
126
|
+
log(chalk.gray(`Lex config dir: ${lexConfigDir} (exists: ${existsSync(lexConfigDir)})`), 'info', quiet);
|
|
127
|
+
if (useLexConfig) {
|
|
128
|
+
log(chalk.blue('Using Lex Storybook configuration (--use-lex-config flag)'), 'info', quiet);
|
|
129
|
+
}
|
|
130
|
+
log(chalk.gray(`Initial config dir: ${configDir}`), 'info', quiet);
|
|
131
|
+
}
|
|
132
|
+
if (configDir === lexConfigDir) {
|
|
133
|
+
if (!quiet) {
|
|
134
|
+
log(chalk.blue('Using Lex config, will create temporary config in project .storybook directory'), 'info', quiet);
|
|
135
|
+
}
|
|
136
|
+
const projectStorybookDir = pathResolve(process.cwd(), '.storybook');
|
|
137
|
+
const fs = await import('fs/promises');
|
|
138
|
+
await fs.mkdir(projectStorybookDir, {
|
|
139
|
+
recursive: true
|
|
140
|
+
});
|
|
141
|
+
const lexMainPath = pathResolve(lexConfigDir, 'main.ts');
|
|
142
|
+
const projectMainPath = pathResolve(projectStorybookDir, 'main.ts');
|
|
143
|
+
let mainContent = await fs.readFile(lexMainPath, 'utf8');
|
|
144
|
+
mainContent = mainContent.replace(/stories:\s*\[.*?\]/, `stories: ['${pathResolve(process.cwd(), 'src/**/*.stories.@(ts|tsx)')}', '${pathResolve(process.cwd(), 'src/**/*.mdx')}']`);
|
|
145
|
+
const lexNodeModules = pathResolve(LexConfig.getLexDir(), 'node_modules');
|
|
146
|
+
mainContent = mainContent.replace(/const lexModule = \(modulePath: string\) => resolve\(getLexNodeModulesPath\(\), modulePath\);/, `const lexModule = (modulePath: string) => resolve('${lexNodeModules}', modulePath);`);
|
|
147
|
+
await fs.writeFile(projectMainPath, mainContent);
|
|
148
|
+
const lexPreviewPath = pathResolve(lexConfigDir, 'preview.tsx');
|
|
149
|
+
if (existsSync(lexPreviewPath)) {
|
|
150
|
+
const previewContent = await fs.readFile(lexPreviewPath, 'utf8');
|
|
151
|
+
await fs.writeFile(pathResolve(projectStorybookDir, 'preview.tsx'), previewContent);
|
|
152
|
+
}
|
|
153
|
+
configDir = projectStorybookDir;
|
|
154
|
+
}
|
|
155
|
+
if (!existsSync(configDir)) {
|
|
156
|
+
spinner.fail('Storybook configuration not found.');
|
|
157
|
+
log(`Project config: ${projectConfigDir}`, 'info', quiet);
|
|
158
|
+
log(`Lex config: ${lexConfigDir}`, 'info', quiet);
|
|
159
|
+
log('Please run "npx storybook@latest init" to set up Storybook in your project, or ensure Lex has a valid .storybook configuration.', 'info', quiet);
|
|
160
|
+
callback(1);
|
|
161
|
+
return 1;
|
|
162
|
+
}
|
|
163
|
+
const storybookPath = resolveBinaryPath('storybook');
|
|
164
|
+
if (!storybookPath) {
|
|
165
|
+
log(`\n${cliName} Error: storybook binary not found in Lex's node_modules or monorepo root`, 'error', quiet);
|
|
166
|
+
log('Please reinstall Lex or check your Storybook installation.', 'info', quiet);
|
|
167
|
+
callback(1);
|
|
168
|
+
return 1;
|
|
169
|
+
}
|
|
170
|
+
const storybookArgs = [
|
|
171
|
+
staticBuild ? 'build' : 'dev'
|
|
172
|
+
];
|
|
173
|
+
storybookArgs.push('--config-dir', configDir);
|
|
174
|
+
if (port) {
|
|
175
|
+
storybookArgs.push('--port', port.toString());
|
|
176
|
+
}
|
|
177
|
+
if (open) {
|
|
178
|
+
storybookArgs.push('--open');
|
|
179
|
+
}
|
|
180
|
+
if (staticBuild) {
|
|
181
|
+
const outputDir = pathResolve(process.cwd(), 'storybook-static');
|
|
182
|
+
storybookArgs.push('--output-dir', outputDir);
|
|
183
|
+
}
|
|
184
|
+
if (!quiet) {
|
|
185
|
+
log(chalk.gray(`Config directory: ${configDir}`), 'info', quiet);
|
|
186
|
+
}
|
|
187
|
+
process.env.TAILWIND_CSS_PATH = tailwindCssPath;
|
|
224
188
|
try {
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
189
|
+
spinner.start(staticBuild ? 'Building static Storybook...' : 'Starting Storybook development server...');
|
|
190
|
+
const storybookProcess = execa(storybookPath, storybookArgs, {
|
|
191
|
+
encoding: 'utf8',
|
|
192
|
+
env: {
|
|
193
|
+
...process.env,
|
|
194
|
+
LEX_QUIET: quiet,
|
|
195
|
+
LEX_VERBOSE: verbose,
|
|
196
|
+
STORYBOOK_OPEN: open,
|
|
197
|
+
...tailwindCssPath && {
|
|
198
|
+
TAILWIND_CSS_PATH: tailwindCssPath
|
|
199
|
+
}
|
|
200
|
+
},
|
|
201
|
+
stdio: 'pipe'
|
|
202
|
+
});
|
|
203
|
+
let urlFound = false;
|
|
204
|
+
let lastProgressPercentage = 0;
|
|
205
|
+
storybookProcess.stdout?.on('data', (data)=>{
|
|
206
|
+
const output = data.toString();
|
|
207
|
+
const progressPercentage = extractProgressPercentage(output);
|
|
208
|
+
if (progressPercentage !== null && progressPercentage !== lastProgressPercentage) {
|
|
209
|
+
lastProgressPercentage = progressPercentage;
|
|
210
|
+
const action = staticBuild ? 'Building' : 'Starting';
|
|
211
|
+
spinner.text = `${action} Storybook... ${progressPercentage}%`;
|
|
212
|
+
process.stdout.write(`\nWebpack Progress: ${chalk.magenta(`${progressPercentage}%`)}\n`);
|
|
213
|
+
}
|
|
214
|
+
const filteredOutput = filterAndBeautifyOutput(output, verbose);
|
|
215
|
+
const beautifiedOutput = beautifyOutput(filteredOutput);
|
|
216
|
+
if (!urlFound && (output.includes('Local:') || output.includes('http://localhost') || output.includes('Storybook'))) {
|
|
217
|
+
spinner.succeed(chalk.green('Storybook development server is ready!'));
|
|
218
|
+
urlFound = true;
|
|
219
|
+
}
|
|
220
|
+
if (filteredOutput.trim()) {
|
|
221
|
+
process.stdout.write(beautifiedOutput);
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
storybookProcess.stderr?.on('data', (data)=>{
|
|
225
|
+
const output = data.toString();
|
|
226
|
+
const filteredOutput = filterAndBeautifyOutput(output, verbose);
|
|
227
|
+
const beautifiedOutput = beautifyOutput(filteredOutput);
|
|
228
|
+
if (filteredOutput.trim()) {
|
|
229
|
+
process.stderr.write(beautifiedOutput);
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
try {
|
|
233
|
+
await storybookProcess;
|
|
234
|
+
if (!urlFound) {
|
|
235
|
+
spinner.succeed(chalk.green('Storybook development server started.'));
|
|
236
|
+
}
|
|
237
|
+
callback(0);
|
|
238
|
+
return 0;
|
|
239
|
+
} catch (error) {
|
|
240
|
+
spinner.fail(chalk.red('There was an error while running storybook.'));
|
|
241
|
+
log(`\n${cliName} Error: ${error.message}`, 'error', quiet);
|
|
242
|
+
callback(1);
|
|
243
|
+
return 1;
|
|
244
|
+
}
|
|
231
245
|
} catch (error) {
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
}
|
|
238
|
-
} catch (error) {
|
|
239
|
-
log(`
|
|
240
|
-
${cliName} Error: ${error.message}`, "error", quiet);
|
|
241
|
-
spinner.fail("There was an error while running storybook.");
|
|
242
|
-
callback(1);
|
|
243
|
-
return 1;
|
|
244
|
-
}
|
|
245
|
-
};
|
|
246
|
-
export {
|
|
247
|
-
storybook
|
|
246
|
+
log(`\n${cliName} Error: ${error.message}`, 'error', quiet);
|
|
247
|
+
spinner.fail('There was an error while running storybook.');
|
|
248
|
+
callback(1);
|
|
249
|
+
return 1;
|
|
250
|
+
}
|
|
248
251
|
};
|
|
249
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3N0b3J5Ym9vay9zdG9yeWJvb2sudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQge2V4ZWNhfSBmcm9tICdleGVjYSc7XG5pbXBvcnQge2V4aXN0c1N5bmN9IGZyb20gJ2ZzJztcbmltcG9ydCB7c3luYyBhcyBnbG9iU3luY30gZnJvbSAnZ2xvYic7XG5pbXBvcnQge3Jlc29sdmUgYXMgcGF0aFJlc29sdmV9IGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQge0xleENvbmZpZ30gZnJvbSAnLi4vLi4vTGV4Q29uZmlnLmpzJztcbmltcG9ydCB7Y3JlYXRlU3Bpbm5lcn0gZnJvbSAnLi4vLi4vdXRpbHMvYXBwLmpzJztcbmltcG9ydCB7ZmluZFRhaWx3aW5kQ3NzUGF0aCwgcmVzb2x2ZUJpbmFyeVBhdGh9IGZyb20gJy4uLy4uL3V0aWxzL2ZpbGUuanMnO1xuaW1wb3J0IHtsb2d9IGZyb20gJy4uLy4uL3V0aWxzL2xvZy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3Rvcnlib29rT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGNsaU5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNvbmZpZz86IHN0cmluZztcbiAgcmVhZG9ubHkgb3Blbj86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHBvcnQ/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHF1aWV0PzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc3RhdGljPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgdXNlTGV4Q29uZmlnPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgdmFyaWFibGVzPzogc3RyaW5nO1xuICByZWFkb25seSB2ZXJib3NlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgU3Rvcnlib29rQ2FsbGJhY2sgPSAoc3RhdHVzOiBudW1iZXIpID0+IHZvaWQ7XG5cbmNvbnN0IGZpbmRTdG9yeUZpbGVzID0gKCk6IHN0cmluZ1tdID0+IHtcbiAgY29uc3Qgc3RvcnlQYXR0ZXJucyA9IFtcbiAgICAnKiovKi5zdG9yaWVzLnt0cyx0c3gsanMsanN4fScsXG4gICAgJyoqLyouc3Rvcnkue3RzLHRzeCxqcyxqc3h9JyxcbiAgICAnKiovc3Rvcmllcy8qKi8qLnt0cyx0c3gsanMsanN4fSdcbiAgXTtcblxuICBjb25zdCBzdG9yeUZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIHN0b3J5UGF0dGVybnMuZm9yRWFjaCgocGF0dGVybikgPT4ge1xuICAgIGNvbnN0IGZpbGVzID0gZ2xvYlN5bmMocGF0dGVybiwge1xuICAgICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgICAgaWdub3JlOiBbJyoqL25vZGVfbW9kdWxlcy8qKicsICcqKi9kaXN0LyoqJywgJyoqL2xpYi8qKicsICcqKi9idWlsZC8qKiddXG4gICAgfSk7XG4gICAgc3RvcnlGaWxlcy5wdXNoKC4uLmZpbGVzKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHN0b3J5RmlsZXM7XG59O1xuXG5jb25zdCBjaGVja1N0b3J5Ym9va0luaXRpYWxpemF0aW9uID0gKCk6IGJvb2xlYW4gPT4ge1xuICBjb25zdCBwcm9qZWN0Q29uZmlnRGlyID0gcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJy5zdG9yeWJvb2snKTtcbiAgY29uc3QgbGV4Q29uZmlnRGlyID0gcGF0aFJlc29sdmUoTGV4Q29uZmlnLmdldExleERpcigpLCAnLnN0b3J5Ym9vaycpO1xuXG4gIHJldHVybiBleGlzdHNTeW5jKHByb2plY3RDb25maWdEaXIpIHx8IGV4aXN0c1N5bmMobGV4Q29uZmlnRGlyKTtcbn07XG5cbmNvbnN0IGV4dHJhY3RQcm9ncmVzc1BlcmNlbnRhZ2UgPSAob3V0cHV0OiBzdHJpbmcpOiBudW1iZXIgfCBudWxsID0+IHtcbiAgY29uc3QgbGluZXMgPSBvdXRwdXQuc3BsaXQoJ1xcbicpO1xuICBmb3IoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgIGlmKGxpbmUuaW5jbHVkZXMoJ1t3ZWJwYWNrLlByb2dyZXNzXScpICYmIGxpbmUuaW5jbHVkZXMoJyUnKSkge1xuICAgICAgY29uc3QgcGVyY2VudGFnZU1hdGNoID0gbGluZS5tYXRjaCgvKFxcZCspJS8pO1xuICAgICAgaWYocGVyY2VudGFnZU1hdGNoKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUludChwZXJjZW50YWdlTWF0Y2hbMV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbmNvbnN0IGZpbHRlckFuZEJlYXV0aWZ5T3V0cHV0ID0gKG91dHB1dDogc3RyaW5nLCBpc1ZlcmJvc2U6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZihpc1ZlcmJvc2UpIHtcbiAgICByZXR1cm4gb3V0cHV0O1xuICB9XG5cbiAgY29uc3QgbGluZXMgPSBvdXRwdXQuc3BsaXQoJ1xcbicpO1xuICBjb25zdCBmaWx0ZXJlZExpbmVzID0gbGluZXMuZmlsdGVyKChsaW5lKSA9PiB7XG4gICAgaWYobGluZS5pbmNsdWRlcygnW3dlYnBhY2suUHJvZ3Jlc3NdJykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZihsaW5lLmluY2x1ZGVzKCdTdG9yeWJvb2snKSB8fFxuICAgICAgbGluZS5pbmNsdWRlcygnTG9jYWw6JykgfHxcbiAgICAgIGxpbmUuaW5jbHVkZXMoJ2h0dHA6Ly9sb2NhbGhvc3QnKSB8fFxuICAgICAgbGluZS5pbmNsdWRlcygnaW5mbyA9PicpIHx8XG4gICAgICBsaW5lLmluY2x1ZGVzKCdTdGFydGluZycpIHx8XG4gICAgICBsaW5lLmluY2x1ZGVzKCdyZWFkeScpIHx8XG4gICAgICBsaW5lLmluY2x1ZGVzKCdlcnJvcicpIHx8XG4gICAgICBsaW5lLmluY2x1ZGVzKCd3YXJuaW5nJykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9KTtcblxuICByZXR1cm4gZmlsdGVyZWRMaW5lcy5qb2luKCdcXG4nKTtcbn07XG5cbmNvbnN0IGJlYXV0aWZ5T3V0cHV0ID0gKG91dHB1dDogc3RyaW5nKTogc3RyaW5nID0+IG91dHB1dFxuICAucmVwbGFjZSgvU3Rvcnlib29rIHZbXFxkLl0rL2csIGNoYWxrLmN5YW4oJyQmJykpXG4gIC5yZXBsYWNlKC9pbmZvID0+L2csIGNoYWxrLmJsdWUoJ2luZm8gPT4nKSlcbiAgLnJlcGxhY2UoL0xvY2FsOi9nLCBjaGFsay5ncmVlbignTG9jYWw6JykpXG4gIC5yZXBsYWNlKC9PbiB5b3VyIG5ldHdvcms6L2csIGNoYWxrLmdyZWVuKCdPbiB5b3VyIG5ldHdvcms6JykpXG4gIC5yZXBsYWNlKC9TdG9yeWJvb2suKnN0YXJ0ZWQvZywgY2hhbGsuZ3JlZW4oJyQmJykpXG4gIC5yZXBsYWNlKC9TdG9yeWJvb2suKnJlYWR5L2csIGNoYWxrLmdyZWVuKCckJicpKVxuICAucmVwbGFjZSgvZXJyb3IvZywgY2hhbGsucmVkKCckJicpKVxuICAucmVwbGFjZSgvd2FybmluZy9nLCBjaGFsay55ZWxsb3coJyQmJykpXG4gIC5yZXBsYWNlKC8oXFxkKyklL2csIGNoYWxrLm1hZ2VudGEoJyQxJScpKTtcblxuZXhwb3J0IGNvbnN0IHN0b3J5Ym9vayA9IGFzeW5jIChjbWQ6IFN0b3J5Ym9va09wdGlvbnMsIGNhbGxiYWNrOiBTdG9yeWJvb2tDYWxsYmFjayA9ICgpID0+ICh7fSkpOiBQcm9taXNlPG51bWJlcj4gPT4ge1xuICBjb25zdCB7Y2xpTmFtZSA9ICdMZXgnLCBjb25maWcsIG9wZW4gPSBmYWxzZSwgcG9ydCA9IDYwMDcsIHF1aWV0LCBzdGF0aWM6IHN0YXRpY0J1aWxkID0gZmFsc2UsIHVzZUxleENvbmZpZyA9IGZhbHNlLCB2YXJpYWJsZXMsIHZlcmJvc2UgPSBmYWxzZX0gPSBjbWQ7XG5cbiAgY29uc3Qgc3Bpbm5lciA9IGNyZWF0ZVNwaW5uZXIocXVpZXQpO1xuXG4gIGxvZyhjaGFsay5jeWFuKGAke2NsaU5hbWV9IHN0YXJ0aW5nIFN0b3J5Ym9vay4uLmApLCAnaW5mbycsIHF1aWV0KTtcblxuICBhd2FpdCBMZXhDb25maWcucGFyc2VDb25maWcoY21kKTtcblxuICBsZXQgdmFyaWFibGVzT2JqOiBvYmplY3QgPSB7Tk9ERV9FTlY6ICdkZXZlbG9wbWVudCd9O1xuXG4gIGlmKHZhcmlhYmxlcykge1xuICAgIHRyeSB7XG4gICAgICB2YXJpYWJsZXNPYmogPSBKU09OLnBhcnNlKHZhcmlhYmxlcyk7XG4gICAgfSBjYXRjaCAoX2Vycm9yKSB7XG4gICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IEVudmlyb25tZW50IHZhcmlhYmxlcyBvcHRpb24gaXMgbm90IGEgdmFsaWQgSlNPTiBvYmplY3QuYCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgY2FsbGJhY2soMSk7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gIH1cblxuICBwcm9jZXNzLmVudiA9IHsuLi5wcm9jZXNzLmVudiwgLi4udmFyaWFibGVzT2JqfTtcblxuICBzcGlubmVyLnN0YXJ0KCdGaW5kaW5nIHN0b3J5IGZpbGVzLi4uJyk7XG4gIGNvbnN0IHN0b3J5RmlsZXMgPSBmaW5kU3RvcnlGaWxlcygpO1xuXG4gIGlmKHN0b3J5RmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgc3Bpbm5lci5mYWlsKCdObyBzdG9yeSBmaWxlcyBmb3VuZCBpbiB0aGUgcHJvamVjdC4nKTtcbiAgICBsb2coJ1BsZWFzZSBjcmVhdGUgc3RvcnkgZmlsZXMgd2l0aCAuc3Rvcmllcy50cy8uc3Rvcmllcy5qcyBleHRlbnNpb25zIG9yIGluIGEgc3Rvcmllcy8gZGlyZWN0b3J5LicsICdpbmZvJywgcXVpZXQpO1xuICAgIGNhbGxiYWNrKDEpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgc3Bpbm5lci5zdWNjZWVkKGBGb3VuZCAke3N0b3J5RmlsZXMubGVuZ3RofSBzdG9yeSBmaWxlKHMpYCk7XG5cbiAgY29uc3QgdGFpbHdpbmRDc3NQYXRoID0gZmluZFRhaWx3aW5kQ3NzUGF0aCgpO1xuXG4gIGNvbnNvbGUubG9nKHt0YWlsd2luZENzc1BhdGh9KTtcbiAgaWYodGFpbHdpbmRDc3NQYXRoKSB7XG4gICAgaWYoIXF1aWV0KSB7XG4gICAgICBsb2coY2hhbGsuZ3JlZW4oYFx1MjcxMyBUYWlsd2luZCBDU1MgaW50ZWdyYXRpb24gZGV0ZWN0ZWQ6ICR7dGFpbHdpbmRDc3NQYXRofWApLCAnaW5mbycsIHF1aWV0KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYoIXF1aWV0KSB7XG4gICAgICBsb2coY2hhbGsueWVsbG93KCdcdTI2QTAgTm8gVGFpbHdpbmQgQ1NTIGZpbGUgZm91bmQgaW4gcHJvamVjdCcpLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgIGxvZyhjaGFsay5ncmF5KCdDcmVhdGUgYSB0YWlsd2luZC5jc3MgZmlsZSB3aXRoIEB0YWlsd2luZCBkaXJlY3RpdmVzIGZvciBmdWxsIFRhaWx3aW5kIHN1cHBvcnQnKSwgJ2luZm8nLCBxdWlldCk7XG4gICAgfVxuICB9XG5cbiAgaWYoIWNoZWNrU3Rvcnlib29rSW5pdGlhbGl6YXRpb24oKSkge1xuICAgIHNwaW5uZXIuZmFpbCgnU3Rvcnlib29rIGlzIG5vdCBpbml0aWFsaXplZCBpbiB0aGlzIHByb2plY3Qgb3IgaW4gTGV4LicpO1xuICAgIGxvZygnUGxlYXNlIHJ1biBcIm5weCBzdG9yeWJvb2tAbGF0ZXN0IGluaXRcIiB0byBzZXQgdXAgU3Rvcnlib29rIGluIHlvdXIgcHJvamVjdCwgb3IgZW5zdXJlIExleCBoYXMgYSB2YWxpZCAuc3Rvcnlib29rIGNvbmZpZ3VyYXRpb24uJywgJ2luZm8nLCBxdWlldCk7XG4gICAgY2FsbGJhY2soMSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBjb25zdCBwcm9qZWN0Q29uZmlnRGlyID0gcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJy5zdG9yeWJvb2snKTtcbiAgY29uc3QgbGV4Q29uZmlnRGlyID0gcGF0aFJlc29sdmUoTGV4Q29uZmlnLmdldExleERpcigpLCAnLnN0b3J5Ym9vaycpO1xuXG4gIGxldCBjb25maWdEaXIgPSBjb25maWc7XG4gIGlmKCFjb25maWdEaXIpIHtcbiAgICBjb25maWdEaXIgPSBsZXhDb25maWdEaXI7XG4gICAgaWYoIXVzZUxleENvbmZpZyAmJiBleGlzdHNTeW5jKHByb2plY3RDb25maWdEaXIpKSB7XG4gICAgICBjb25maWdEaXIgPSBwcm9qZWN0Q29uZmlnRGlyO1xuICAgIH1cbiAgfVxuXG4gIGlmKCFxdWlldCkge1xuICAgIGxvZyhjaGFsay5ncmF5KGBQcm9qZWN0IGNvbmZpZyBkaXI6ICR7cHJvamVjdENvbmZpZ0Rpcn0gKGV4aXN0czogJHtleGlzdHNTeW5jKHByb2plY3RDb25maWdEaXIpfSlgKSwgJ2luZm8nLCBxdWlldCk7XG4gICAgbG9nKGNoYWxrLmdyYXkoYExleCBjb25maWcgZGlyOiAke2xleENvbmZpZ0Rpcn0gKGV4aXN0czogJHtleGlzdHNTeW5jKGxleENvbmZpZ0Rpcil9KWApLCAnaW5mbycsIHF1aWV0KTtcbiAgICBpZih1c2VMZXhDb25maWcpIHtcbiAgICAgIGxvZyhjaGFsay5ibHVlKCdVc2luZyBMZXggU3Rvcnlib29rIGNvbmZpZ3VyYXRpb24gKC0tdXNlLWxleC1jb25maWcgZmxhZyknKSwgJ2luZm8nLCBxdWlldCk7XG4gICAgfVxuICAgIGxvZyhjaGFsay5ncmF5KGBJbml0aWFsIGNvbmZpZyBkaXI6ICR7Y29uZmlnRGlyfWApLCAnaW5mbycsIHF1aWV0KTtcbiAgfVxuXG4gIGlmKGNvbmZpZ0RpciA9PT0gbGV4Q29uZmlnRGlyKSB7XG4gICAgaWYoIXF1aWV0KSB7XG4gICAgICBsb2coY2hhbGsuYmx1ZSgnVXNpbmcgTGV4IGNvbmZpZywgd2lsbCBjcmVhdGUgdGVtcG9yYXJ5IGNvbmZpZyBpbiBwcm9qZWN0IC5zdG9yeWJvb2sgZGlyZWN0b3J5JyksICdpbmZvJywgcXVpZXQpO1xuICAgIH1cbiAgICBjb25zdCBwcm9qZWN0U3Rvcnlib29rRGlyID0gcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJy5zdG9yeWJvb2snKTtcblxuICAgIGNvbnN0IGZzID0gYXdhaXQgaW1wb3J0KCdmcy9wcm9taXNlcycpO1xuICAgIGF3YWl0IGZzLm1rZGlyKHByb2plY3RTdG9yeWJvb2tEaXIsIHtyZWN1cnNpdmU6IHRydWV9KTtcblxuICAgIGNvbnN0IGxleE1haW5QYXRoID0gcGF0aFJlc29sdmUobGV4Q29uZmlnRGlyLCAnbWFpbi50cycpO1xuICAgIGNvbnN0IHByb2plY3RNYWluUGF0aCA9IHBhdGhSZXNvbHZlKHByb2plY3RTdG9yeWJvb2tEaXIsICdtYWluLnRzJyk7XG4gICAgbGV0IG1haW5Db250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUobGV4TWFpblBhdGgsICd1dGY4Jyk7XG5cbiAgICBtYWluQ29udGVudCA9IG1haW5Db250ZW50LnJlcGxhY2UoXG4gICAgICAvc3RvcmllczpcXHMqXFxbLio/XFxdLyxcbiAgICAgIGBzdG9yaWVzOiBbJyR7cGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJ3NyYy8qKi8qLnN0b3JpZXMuQCh0c3x0c3gpJyl9JywgJyR7cGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJ3NyYy8qKi8qLm1keCcpfSddYFxuICAgICk7XG5cbiAgICBjb25zdCBsZXhOb2RlTW9kdWxlcyA9IHBhdGhSZXNvbHZlKExleENvbmZpZy5nZXRMZXhEaXIoKSwgJ25vZGVfbW9kdWxlcycpO1xuICAgIG1haW5Db250ZW50ID0gbWFpbkNvbnRlbnQucmVwbGFjZShcbiAgICAgIC9jb25zdCBsZXhNb2R1bGUgPSBcXChtb2R1bGVQYXRoOiBzdHJpbmdcXCkgPT4gcmVzb2x2ZVxcKGdldExleE5vZGVNb2R1bGVzUGF0aFxcKFxcKSwgbW9kdWxlUGF0aFxcKTsvLFxuICAgICAgYGNvbnN0IGxleE1vZHVsZSA9IChtb2R1bGVQYXRoOiBzdHJpbmcpID0+IHJlc29sdmUoJyR7bGV4Tm9kZU1vZHVsZXN9JywgbW9kdWxlUGF0aCk7YFxuICAgICk7XG5cbiAgICBhd2FpdCBmcy53cml0ZUZpbGUocHJvamVjdE1haW5QYXRoLCBtYWluQ29udGVudCk7XG5cbiAgICBjb25zdCBsZXhQcmV2aWV3UGF0aCA9IHBhdGhSZXNvbHZlKGxleENvbmZpZ0RpciwgJ3ByZXZpZXcudHN4Jyk7XG4gICAgaWYoZXhpc3RzU3luYyhsZXhQcmV2aWV3UGF0aCkpIHtcbiAgICAgIGNvbnN0IHByZXZpZXdDb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUobGV4UHJldmlld1BhdGgsICd1dGY4Jyk7XG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUocGF0aFJlc29sdmUocHJvamVjdFN0b3J5Ym9va0RpciwgJ3ByZXZpZXcudHN4JyksIHByZXZpZXdDb250ZW50KTtcbiAgICB9XG5cbiAgICBjb25maWdEaXIgPSBwcm9qZWN0U3Rvcnlib29rRGlyO1xuICB9XG4gIGlmKCFleGlzdHNTeW5jKGNvbmZpZ0RpcikpIHtcbiAgICBzcGlubmVyLmZhaWwoJ1N0b3J5Ym9vayBjb25maWd1cmF0aW9uIG5vdCBmb3VuZC4nKTtcbiAgICBsb2coYFByb2plY3QgY29uZmlnOiAke3Byb2plY3RDb25maWdEaXJ9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgbG9nKGBMZXggY29uZmlnOiAke2xleENvbmZpZ0Rpcn1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICBsb2coJ1BsZWFzZSBydW4gXCJucHggc3Rvcnlib29rQGxhdGVzdCBpbml0XCIgdG8gc2V0IHVwIFN0b3J5Ym9vayBpbiB5b3VyIHByb2plY3QsIG9yIGVuc3VyZSBMZXggaGFzIGEgdmFsaWQgLnN0b3J5Ym9vayBjb25maWd1cmF0aW9uLicsICdpbmZvJywgcXVpZXQpO1xuICAgIGNhbGxiYWNrKDEpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgY29uc3Qgc3Rvcnlib29rUGF0aCA9IHJlc29sdmVCaW5hcnlQYXRoKCdzdG9yeWJvb2snKTtcblxuICBpZighc3Rvcnlib29rUGF0aCkge1xuICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogc3Rvcnlib29rIGJpbmFyeSBub3QgZm91bmQgaW4gTGV4J3Mgbm9kZV9tb2R1bGVzIG9yIG1vbm9yZXBvIHJvb3RgLCAnZXJyb3InLCBxdWlldCk7XG4gICAgbG9nKCdQbGVhc2UgcmVpbnN0YWxsIExleCBvciBjaGVjayB5b3VyIFN0b3J5Ym9vayBpbnN0YWxsYXRpb24uJywgJ2luZm8nLCBxdWlldCk7XG4gICAgY2FsbGJhY2soMSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBjb25zdCBzdG9yeWJvb2tBcmdzID0gW3N0YXRpY0J1aWxkID8gJ2J1aWxkJyA6ICdkZXYnXTtcbiAgc3Rvcnlib29rQXJncy5wdXNoKCctLWNvbmZpZy1kaXInLCBjb25maWdEaXIpO1xuXG4gIGlmKHBvcnQpIHtcbiAgICBzdG9yeWJvb2tBcmdzLnB1c2goJy0tcG9ydCcsIHBvcnQudG9TdHJpbmcoKSk7XG4gIH1cblxuICBpZihvcGVuKSB7XG4gICAgc3Rvcnlib29rQXJncy5wdXNoKCctLW9wZW4nKTtcbiAgfVxuXG4gIGlmKHN0YXRpY0J1aWxkKSB7XG4gICAgY29uc3Qgb3V0cHV0RGlyID0gcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJ3N0b3J5Ym9vay1zdGF0aWMnKTtcbiAgICBzdG9yeWJvb2tBcmdzLnB1c2goJy0tb3V0cHV0LWRpcicsIG91dHB1dERpcik7XG4gIH1cblxuICBpZighcXVpZXQpIHtcbiAgICBsb2coY2hhbGsuZ3JheShgQ29uZmlnIGRpcmVjdG9yeTogJHtjb25maWdEaXJ9YCksICdpbmZvJywgcXVpZXQpO1xuICB9XG5cbiAgcHJvY2Vzcy5lbnYuVEFJTFdJTkRfQ1NTX1BBVEggPSB0YWlsd2luZENzc1BhdGg7XG5cbiAgdHJ5IHtcbiAgICBzcGlubmVyLnN0YXJ0KHN0YXRpY0J1aWxkID8gJ0J1aWxkaW5nIHN0YXRpYyBTdG9yeWJvb2suLi4nIDogJ1N0YXJ0aW5nIFN0b3J5Ym9vayBkZXZlbG9wbWVudCBzZXJ2ZXIuLi4nKTtcblxuICAgIGNvbnN0IHN0b3J5Ym9va1Byb2Nlc3MgPSBleGVjYShzdG9yeWJvb2tQYXRoIGFzIGFueSwgc3Rvcnlib29rQXJncywge1xuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgIGVudjoge1xuICAgICAgICAuLi5wcm9jZXNzLmVudixcbiAgICAgICAgTEVYX1FVSUVUOiBxdWlldCxcbiAgICAgICAgTEVYX1ZFUkJPU0U6IHZlcmJvc2UsXG4gICAgICAgIFNUT1JZQk9PS19PUEVOOiBvcGVuLFxuICAgICAgICAuLi4odGFpbHdpbmRDc3NQYXRoICYmIHtUQUlMV0lORF9DU1NfUEFUSDogdGFpbHdpbmRDc3NQYXRofSlcbiAgICAgIH0gYXMgYW55LFxuICAgICAgc3RkaW86ICdwaXBlJ1xuICAgIH0pO1xuXG4gICAgbGV0IHVybEZvdW5kID0gZmFsc2U7XG4gICAgbGV0IGxhc3RQcm9ncmVzc1BlcmNlbnRhZ2UgPSAwO1xuXG4gICAgc3Rvcnlib29rUHJvY2Vzcy5zdGRvdXQ/Lm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IGRhdGEudG9TdHJpbmcoKTtcbiAgICAgIGNvbnN0IHByb2dyZXNzUGVyY2VudGFnZSA9IGV4dHJhY3RQcm9ncmVzc1BlcmNlbnRhZ2Uob3V0cHV0KTtcblxuICAgICAgaWYocHJvZ3Jlc3NQZXJjZW50YWdlICE9PSBudWxsICYmIHByb2dyZXNzUGVyY2VudGFnZSAhPT0gbGFzdFByb2dyZXNzUGVyY2VudGFnZSkge1xuICAgICAgICBsYXN0UHJvZ3Jlc3NQZXJjZW50YWdlID0gcHJvZ3Jlc3NQZXJjZW50YWdlO1xuICAgICAgICBjb25zdCBhY3Rpb24gPSBzdGF0aWNCdWlsZCA/ICdCdWlsZGluZycgOiAnU3RhcnRpbmcnO1xuICAgICAgICAoc3Bpbm5lciBhcyBhbnkpLnRleHQgPSBgJHthY3Rpb259IFN0b3J5Ym9vay4uLiAke3Byb2dyZXNzUGVyY2VudGFnZX0lYDtcbiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoYFxcbldlYnBhY2sgUHJvZ3Jlc3M6ICR7Y2hhbGsubWFnZW50YShgJHtwcm9ncmVzc1BlcmNlbnRhZ2V9JWApfVxcbmApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWx0ZXJlZE91dHB1dCA9IGZpbHRlckFuZEJlYXV0aWZ5T3V0cHV0KG91dHB1dCwgdmVyYm9zZSk7XG4gICAgICBjb25zdCBiZWF1dGlmaWVkT3V0cHV0ID0gYmVhdXRpZnlPdXRwdXQoZmlsdGVyZWRPdXRwdXQpO1xuXG4gICAgICBpZighdXJsRm91bmQgJiYgKG91dHB1dC5pbmNsdWRlcygnTG9jYWw6JykgfHwgb3V0cHV0LmluY2x1ZGVzKCdodHRwOi8vbG9jYWxob3N0JykgfHwgb3V0cHV0LmluY2x1ZGVzKCdTdG9yeWJvb2snKSkpIHtcbiAgICAgICAgc3Bpbm5lci5zdWNjZWVkKGNoYWxrLmdyZWVuKCdTdG9yeWJvb2sgZGV2ZWxvcG1lbnQgc2VydmVyIGlzIHJlYWR5IScpKTtcbiAgICAgICAgdXJsRm91bmQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZihmaWx0ZXJlZE91dHB1dC50cmltKCkpIHtcbiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoYmVhdXRpZmllZE91dHB1dCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBzdG9yeWJvb2tQcm9jZXNzLnN0ZGVycj8ub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgY29uc3Qgb3V0cHV0ID0gZGF0YS50b1N0cmluZygpO1xuICAgICAgY29uc3QgZmlsdGVyZWRPdXRwdXQgPSBmaWx0ZXJBbmRCZWF1dGlmeU91dHB1dChvdXRwdXQsIHZlcmJvc2UpO1xuICAgICAgY29uc3QgYmVhdXRpZmllZE91dHB1dCA9IGJlYXV0aWZ5T3V0cHV0KGZpbHRlcmVkT3V0cHV0KTtcblxuICAgICAgaWYoZmlsdGVyZWRPdXRwdXQudHJpbSgpKSB7XG4gICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKGJlYXV0aWZpZWRPdXRwdXQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHN0b3J5Ym9va1Byb2Nlc3M7XG4gICAgICBpZighdXJsRm91bmQpIHtcbiAgICAgICAgc3Bpbm5lci5zdWNjZWVkKGNoYWxrLmdyZWVuKCdTdG9yeWJvb2sgZGV2ZWxvcG1lbnQgc2VydmVyIHN0YXJ0ZWQuJykpO1xuICAgICAgfVxuICAgICAgY2FsbGJhY2soMCk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgc3Bpbm5lci5mYWlsKGNoYWxrLnJlZCgnVGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIHJ1bm5pbmcgc3Rvcnlib29rLicpKTtcbiAgICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIGNhbGxiYWNrKDEpO1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICBzcGlubmVyLmZhaWwoJ1RoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBydW5uaW5nIHN0b3J5Ym9vay4nKTtcbiAgICBjYWxsYmFjaygxKTtcbiAgICByZXR1cm4gMTtcbiAgfVxufTsiXSwKICAibWFwcGluZ3MiOiAiQUFBQSxPQUFPLFdBQVc7QUFDbEIsU0FBUSxhQUFZO0FBQ3BCLFNBQVEsa0JBQWlCO0FBQ3pCLFNBQVEsUUFBUSxnQkFBZTtBQUMvQixTQUFRLFdBQVcsbUJBQWtCO0FBRXJDLFNBQVEsaUJBQWdCO0FBQ3hCLFNBQVEscUJBQW9CO0FBQzVCLFNBQVEscUJBQXFCLHlCQUF3QjtBQUNyRCxTQUFRLFdBQVU7QUFnQmxCLE1BQU0saUJBQWlCLE1BQWdCO0FBQ3JDLFFBQU0sZ0JBQWdCO0FBQUEsSUFDcEI7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFFQSxRQUFNLGFBQXVCLENBQUM7QUFFOUIsZ0JBQWMsUUFBUSxDQUFDLFlBQVk7QUFDakMsVUFBTSxRQUFRLFNBQVMsU0FBUztBQUFBLE1BQzlCLEtBQUssUUFBUSxJQUFJO0FBQUEsTUFDakIsUUFBUSxDQUFDLHNCQUFzQixjQUFjLGFBQWEsYUFBYTtBQUFBLElBQ3pFLENBQUM7QUFDRCxlQUFXLEtBQUssR0FBRyxLQUFLO0FBQUEsRUFDMUIsQ0FBQztBQUVELFNBQU87QUFDVDtBQUVBLE1BQU0sK0JBQStCLE1BQWU7QUFDbEQsUUFBTSxtQkFBbUIsWUFBWSxRQUFRLElBQUksR0FBRyxZQUFZO0FBQ2hFLFFBQU0sZUFBZSxZQUFZLFVBQVUsVUFBVSxHQUFHLFlBQVk7QUFFcEUsU0FBTyxXQUFXLGdCQUFnQixLQUFLLFdBQVcsWUFBWTtBQUNoRTtBQUVBLE1BQU0sNEJBQTRCLENBQUMsV0FBa0M7QUFDbkUsUUFBTSxRQUFRLE9BQU8sTUFBTSxJQUFJO0FBQy9CLGFBQVUsUUFBUSxPQUFPO0FBQ3ZCLFFBQUcsS0FBSyxTQUFTLG9CQUFvQixLQUFLLEtBQUssU0FBUyxHQUFHLEdBQUc7QUFDNUQsWUFBTSxrQkFBa0IsS0FBSyxNQUFNLFFBQVE7QUFDM0MsVUFBRyxpQkFBaUI7QUFDbEIsZUFBTyxTQUFTLGdCQUFnQixDQUFDLENBQUM7QUFBQSxNQUNwQztBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0EsU0FBTztBQUNUO0FBRUEsTUFBTSwwQkFBMEIsQ0FBQyxRQUFnQixjQUErQjtBQUM5RSxNQUFHLFdBQVc7QUFDWixXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sUUFBUSxPQUFPLE1BQU0sSUFBSTtBQUMvQixRQUFNLGdCQUFnQixNQUFNLE9BQU8sQ0FBQyxTQUFTO0FBQzNDLFFBQUcsS0FBSyxTQUFTLG9CQUFvQixHQUFHO0FBQ3RDLGFBQU87QUFBQSxJQUNUO0FBRUEsUUFBRyxLQUFLLFNBQVMsV0FBVyxLQUMxQixLQUFLLFNBQVMsUUFBUSxLQUN0QixLQUFLLFNBQVMsa0JBQWtCLEtBQ2hDLEtBQUssU0FBUyxTQUFTLEtBQ3ZCLEtBQUssU0FBUyxVQUFVLEtBQ3hCLEtBQUssU0FBUyxPQUFPLEtBQ3JCLEtBQUssU0FBUyxPQUFPLEtBQ3JCLEtBQUssU0FBUyxTQUFTLEdBQUc7QUFDMUIsYUFBTztBQUFBLElBQ1Q7QUFFQSxXQUFPO0FBQUEsRUFDVCxDQUFDO0FBRUQsU0FBTyxjQUFjLEtBQUssSUFBSTtBQUNoQztBQUVBLE1BQU0saUJBQWlCLENBQUMsV0FBMkIsT0FDaEQsUUFBUSxzQkFBc0IsTUFBTSxLQUFLLElBQUksQ0FBQyxFQUM5QyxRQUFRLFlBQVksTUFBTSxLQUFLLFNBQVMsQ0FBQyxFQUN6QyxRQUFRLFdBQVcsTUFBTSxNQUFNLFFBQVEsQ0FBQyxFQUN4QyxRQUFRLHFCQUFxQixNQUFNLE1BQU0sa0JBQWtCLENBQUMsRUFDNUQsUUFBUSx1QkFBdUIsTUFBTSxNQUFNLElBQUksQ0FBQyxFQUNoRCxRQUFRLHFCQUFxQixNQUFNLE1BQU0sSUFBSSxDQUFDLEVBQzlDLFFBQVEsVUFBVSxNQUFNLElBQUksSUFBSSxDQUFDLEVBQ2pDLFFBQVEsWUFBWSxNQUFNLE9BQU8sSUFBSSxDQUFDLEVBQ3RDLFFBQVEsV0FBVyxNQUFNLFFBQVEsS0FBSyxDQUFDO0FBRW5DLE1BQU0sWUFBWSxPQUFPLEtBQXVCLFdBQThCLE9BQU8sQ0FBQyxPQUF3QjtBQUNuSCxRQUFNLEVBQUMsVUFBVSxPQUFPLFFBQVEsT0FBTyxPQUFPLE9BQU8sTUFBTSxPQUFPLFFBQVEsY0FBYyxPQUFPLGVBQWUsT0FBTyxXQUFXLFVBQVUsTUFBSyxJQUFJO0FBRW5KLFFBQU0sVUFBVSxjQUFjLEtBQUs7QUFFbkMsTUFBSSxNQUFNLEtBQUssR0FBRyxPQUFPLHdCQUF3QixHQUFHLFFBQVEsS0FBSztBQUVqRSxRQUFNLFVBQVUsWUFBWSxHQUFHO0FBRS9CLE1BQUksZUFBdUIsRUFBQyxVQUFVLGNBQWE7QUFFbkQsTUFBRyxXQUFXO0FBQ1osUUFBSTtBQUNGLHFCQUFlLEtBQUssTUFBTSxTQUFTO0FBQUEsSUFDckMsU0FBUyxRQUFRO0FBQ2YsVUFBSTtBQUFBLEVBQUssT0FBTyxvRUFBb0UsU0FBUyxLQUFLO0FBQ2xHLGVBQVMsQ0FBQztBQUNWLGFBQU87QUFBQSxJQUNUO0FBQUEsRUFDRjtBQUVBLFVBQVEsTUFBTSxFQUFDLEdBQUcsUUFBUSxLQUFLLEdBQUcsYUFBWTtBQUU5QyxVQUFRLE1BQU0sd0JBQXdCO0FBQ3RDLFFBQU0sYUFBYSxlQUFlO0FBRWxDLE1BQUcsV0FBVyxXQUFXLEdBQUc7QUFDMUIsWUFBUSxLQUFLLHNDQUFzQztBQUNuRCxRQUFJLGlHQUFpRyxRQUFRLEtBQUs7QUFDbEgsYUFBUyxDQUFDO0FBQ1YsV0FBTztBQUFBLEVBQ1Q7QUFFQSxVQUFRLFFBQVEsU0FBUyxXQUFXLE1BQU0sZ0JBQWdCO0FBRTFELFFBQU0sa0JBQWtCLG9CQUFvQjtBQUU1QyxVQUFRLElBQUksRUFBQyxnQkFBZSxDQUFDO0FBQzdCLE1BQUcsaUJBQWlCO0FBQ2xCLFFBQUcsQ0FBQyxPQUFPO0FBQ1QsVUFBSSxNQUFNLE1BQU0sNkNBQXdDLGVBQWUsRUFBRSxHQUFHLFFBQVEsS0FBSztBQUFBLElBQzNGO0FBQUEsRUFDRixPQUFPO0FBQ0wsUUFBRyxDQUFDLE9BQU87QUFDVCxVQUFJLE1BQU0sT0FBTyw4Q0FBeUMsR0FBRyxRQUFRLEtBQUs7QUFDMUUsVUFBSSxNQUFNLEtBQUssZ0ZBQWdGLEdBQUcsUUFBUSxLQUFLO0FBQUEsSUFDakg7QUFBQSxFQUNGO0FBRUEsTUFBRyxDQUFDLDZCQUE2QixHQUFHO0FBQ2xDLFlBQVEsS0FBSyx5REFBeUQ7QUFDdEUsUUFBSSxtSUFBbUksUUFBUSxLQUFLO0FBQ3BKLGFBQVMsQ0FBQztBQUNWLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxtQkFBbUIsWUFBWSxRQUFRLElBQUksR0FBRyxZQUFZO0FBQ2hFLFFBQU0sZUFBZSxZQUFZLFVBQVUsVUFBVSxHQUFHLFlBQVk7QUFFcEUsTUFBSSxZQUFZO0FBQ2hCLE1BQUcsQ0FBQyxXQUFXO0FBQ2IsZ0JBQVk7QUFDWixRQUFHLENBQUMsZ0JBQWdCLFdBQVcsZ0JBQWdCLEdBQUc7QUFDaEQsa0JBQVk7QUFBQSxJQUNkO0FBQUEsRUFDRjtBQUVBLE1BQUcsQ0FBQyxPQUFPO0FBQ1QsUUFBSSxNQUFNLEtBQUssdUJBQXVCLGdCQUFnQixhQUFhLFdBQVcsZ0JBQWdCLENBQUMsR0FBRyxHQUFHLFFBQVEsS0FBSztBQUNsSCxRQUFJLE1BQU0sS0FBSyxtQkFBbUIsWUFBWSxhQUFhLFdBQVcsWUFBWSxDQUFDLEdBQUcsR0FBRyxRQUFRLEtBQUs7QUFDdEcsUUFBRyxjQUFjO0FBQ2YsVUFBSSxNQUFNLEtBQUssMkRBQTJELEdBQUcsUUFBUSxLQUFLO0FBQUEsSUFDNUY7QUFDQSxRQUFJLE1BQU0sS0FBSyx1QkFBdUIsU0FBUyxFQUFFLEdBQUcsUUFBUSxLQUFLO0FBQUEsRUFDbkU7QUFFQSxNQUFHLGNBQWMsY0FBYztBQUM3QixRQUFHLENBQUMsT0FBTztBQUNULFVBQUksTUFBTSxLQUFLLGdGQUFnRixHQUFHLFFBQVEsS0FBSztBQUFBLElBQ2pIO0FBQ0EsVUFBTSxzQkFBc0IsWUFBWSxRQUFRLElBQUksR0FBRyxZQUFZO0FBRW5FLFVBQU0sS0FBSyxNQUFNLE9BQU8sYUFBYTtBQUNyQyxVQUFNLEdBQUcsTUFBTSxxQkFBcUIsRUFBQyxXQUFXLEtBQUksQ0FBQztBQUVyRCxVQUFNLGNBQWMsWUFBWSxjQUFjLFNBQVM7QUFDdkQsVUFBTSxrQkFBa0IsWUFBWSxxQkFBcUIsU0FBUztBQUNsRSxRQUFJLGNBQWMsTUFBTSxHQUFHLFNBQVMsYUFBYSxNQUFNO0FBRXZELGtCQUFjLFlBQVk7QUFBQSxNQUN4QjtBQUFBLE1BQ0EsY0FBYyxZQUFZLFFBQVEsSUFBSSxHQUFHLDRCQUE0QixDQUFDLE9BQU8sWUFBWSxRQUFRLElBQUksR0FBRyxjQUFjLENBQUM7QUFBQSxJQUN6SDtBQUVBLFVBQU0saUJBQWlCLFlBQVksVUFBVSxVQUFVLEdBQUcsY0FBYztBQUN4RSxrQkFBYyxZQUFZO0FBQUEsTUFDeEI7QUFBQSxNQUNBLHNEQUFzRCxjQUFjO0FBQUEsSUFDdEU7QUFFQSxVQUFNLEdBQUcsVUFBVSxpQkFBaUIsV0FBVztBQUUvQyxVQUFNLGlCQUFpQixZQUFZLGNBQWMsYUFBYTtBQUM5RCxRQUFHLFdBQVcsY0FBYyxHQUFHO0FBQzdCLFlBQU0saUJBQWlCLE1BQU0sR0FBRyxTQUFTLGdCQUFnQixNQUFNO0FBQy9ELFlBQU0sR0FBRyxVQUFVLFlBQVkscUJBQXFCLGFBQWEsR0FBRyxjQUFjO0FBQUEsSUFDcEY7QUFFQSxnQkFBWTtBQUFBLEVBQ2Q7QUFDQSxNQUFHLENBQUMsV0FBVyxTQUFTLEdBQUc7QUFDekIsWUFBUSxLQUFLLG9DQUFvQztBQUNqRCxRQUFJLG1CQUFtQixnQkFBZ0IsSUFBSSxRQUFRLEtBQUs7QUFDeEQsUUFBSSxlQUFlLFlBQVksSUFBSSxRQUFRLEtBQUs7QUFDaEQsUUFBSSxtSUFBbUksUUFBUSxLQUFLO0FBQ3BKLGFBQVMsQ0FBQztBQUNWLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxnQkFBZ0Isa0JBQWtCLFdBQVc7QUFFbkQsTUFBRyxDQUFDLGVBQWU7QUFDakIsUUFBSTtBQUFBLEVBQUssT0FBTyw2RUFBNkUsU0FBUyxLQUFLO0FBQzNHLFFBQUksOERBQThELFFBQVEsS0FBSztBQUMvRSxhQUFTLENBQUM7QUFDVixXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sZ0JBQWdCLENBQUMsY0FBYyxVQUFVLEtBQUs7QUFDcEQsZ0JBQWMsS0FBSyxnQkFBZ0IsU0FBUztBQUU1QyxNQUFHLE1BQU07QUFDUCxrQkFBYyxLQUFLLFVBQVUsS0FBSyxTQUFTLENBQUM7QUFBQSxFQUM5QztBQUVBLE1BQUcsTUFBTTtBQUNQLGtCQUFjLEtBQUssUUFBUTtBQUFBLEVBQzdCO0FBRUEsTUFBRyxhQUFhO0FBQ2QsVUFBTSxZQUFZLFlBQVksUUFBUSxJQUFJLEdBQUcsa0JBQWtCO0FBQy9ELGtCQUFjLEtBQUssZ0JBQWdCLFNBQVM7QUFBQSxFQUM5QztBQUVBLE1BQUcsQ0FBQyxPQUFPO0FBQ1QsUUFBSSxNQUFNLEtBQUsscUJBQXFCLFNBQVMsRUFBRSxHQUFHLFFBQVEsS0FBSztBQUFBLEVBQ2pFO0FBRUEsVUFBUSxJQUFJLG9CQUFvQjtBQUVoQyxNQUFJO0FBQ0YsWUFBUSxNQUFNLGNBQWMsaUNBQWlDLDBDQUEwQztBQUV2RyxVQUFNLG1CQUFtQixNQUFNLGVBQXNCLGVBQWU7QUFBQSxNQUNsRSxVQUFVO0FBQUEsTUFDVixLQUFLO0FBQUEsUUFDSCxHQUFHLFFBQVE7QUFBQSxRQUNYLFdBQVc7QUFBQSxRQUNYLGFBQWE7QUFBQSxRQUNiLGdCQUFnQjtBQUFBLFFBQ2hCLEdBQUksbUJBQW1CLEVBQUMsbUJBQW1CLGdCQUFlO0FBQUEsTUFDNUQ7QUFBQSxNQUNBLE9BQU87QUFBQSxJQUNULENBQUM7QUFFRCxRQUFJLFdBQVc7QUFDZixRQUFJLHlCQUF5QjtBQUU3QixxQkFBaUIsUUFBUSxHQUFHLFFBQVEsQ0FBQyxTQUFTO0FBQzVDLFlBQU0sU0FBUyxLQUFLLFNBQVM7QUFDN0IsWUFBTSxxQkFBcUIsMEJBQTBCLE1BQU07QUFFM0QsVUFBRyx1QkFBdUIsUUFBUSx1QkFBdUIsd0JBQXdCO0FBQy9FLGlDQUF5QjtBQUN6QixjQUFNLFNBQVMsY0FBYyxhQUFhO0FBQzFDLFFBQUMsUUFBZ0IsT0FBTyxHQUFHLE1BQU0saUJBQWlCLGtCQUFrQjtBQUNwRSxnQkFBUSxPQUFPLE1BQU07QUFBQSxvQkFBdUIsTUFBTSxRQUFRLEdBQUcsa0JBQWtCLEdBQUcsQ0FBQztBQUFBLENBQUk7QUFBQSxNQUN6RjtBQUVBLFlBQU0saUJBQWlCLHdCQUF3QixRQUFRLE9BQU87QUFDOUQsWUFBTSxtQkFBbUIsZUFBZSxjQUFjO0FBRXRELFVBQUcsQ0FBQyxhQUFhLE9BQU8sU0FBUyxRQUFRLEtBQUssT0FBTyxTQUFTLGtCQUFrQixLQUFLLE9BQU8sU0FBUyxXQUFXLElBQUk7QUFDbEgsZ0JBQVEsUUFBUSxNQUFNLE1BQU0sd0NBQXdDLENBQUM7QUFDckUsbUJBQVc7QUFBQSxNQUNiO0FBRUEsVUFBRyxlQUFlLEtBQUssR0FBRztBQUN4QixnQkFBUSxPQUFPLE1BQU0sZ0JBQWdCO0FBQUEsTUFDdkM7QUFBQSxJQUNGLENBQUM7QUFFRCxxQkFBaUIsUUFBUSxHQUFHLFFBQVEsQ0FBQyxTQUFTO0FBQzVDLFlBQU0sU0FBUyxLQUFLLFNBQVM7QUFDN0IsWUFBTSxpQkFBaUIsd0JBQXdCLFFBQVEsT0FBTztBQUM5RCxZQUFNLG1CQUFtQixlQUFlLGNBQWM7QUFFdEQsVUFBRyxlQUFlLEtBQUssR0FBRztBQUN4QixnQkFBUSxPQUFPLE1BQU0sZ0JBQWdCO0FBQUEsTUFDdkM7QUFBQSxJQUNGLENBQUM7QUFFRCxRQUFJO0FBQ0YsWUFBTTtBQUNOLFVBQUcsQ0FBQyxVQUFVO0FBQ1osZ0JBQVEsUUFBUSxNQUFNLE1BQU0sdUNBQXVDLENBQUM7QUFBQSxNQUN0RTtBQUNBLGVBQVMsQ0FBQztBQUNWLGFBQU87QUFBQSxJQUNULFNBQVMsT0FBTztBQUNkLGNBQVEsS0FBSyxNQUFNLElBQUksNkNBQTZDLENBQUM7QUFDckUsVUFBSTtBQUFBLEVBQUssT0FBTyxXQUFXLE1BQU0sT0FBTyxJQUFJLFNBQVMsS0FBSztBQUMxRCxlQUFTLENBQUM7QUFDVixhQUFPO0FBQUEsSUFDVDtBQUFBLEVBQ0YsU0FBUyxPQUFPO0FBQ2QsUUFBSTtBQUFBLEVBQUssT0FBTyxXQUFXLE1BQU0sT0FBTyxJQUFJLFNBQVMsS0FBSztBQUMxRCxZQUFRLEtBQUssNkNBQTZDO0FBQzFELGFBQVMsQ0FBQztBQUNWLFdBQU87QUFBQSxFQUNUO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
|
252
|
+
|
|
253
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9zdG9yeWJvb2svc3Rvcnlib29rLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQge2V4ZWNhfSBmcm9tICdleGVjYSc7XG5pbXBvcnQge2V4aXN0c1N5bmN9IGZyb20gJ2ZzJztcbmltcG9ydCB7c3luYyBhcyBnbG9iU3luY30gZnJvbSAnZ2xvYic7XG5pbXBvcnQge3Jlc29sdmUgYXMgcGF0aFJlc29sdmV9IGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQge0xleENvbmZpZ30gZnJvbSAnLi4vLi4vTGV4Q29uZmlnLmpzJztcbmltcG9ydCB7Y3JlYXRlU3Bpbm5lcn0gZnJvbSAnLi4vLi4vdXRpbHMvYXBwLmpzJztcbmltcG9ydCB7ZmluZFRhaWx3aW5kQ3NzUGF0aCwgcmVzb2x2ZUJpbmFyeVBhdGh9IGZyb20gJy4uLy4uL3V0aWxzL2ZpbGUuanMnO1xuaW1wb3J0IHtsb2d9IGZyb20gJy4uLy4uL3V0aWxzL2xvZy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3Rvcnlib29rT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGNsaU5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNvbmZpZz86IHN0cmluZztcbiAgcmVhZG9ubHkgb3Blbj86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHBvcnQ/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHF1aWV0PzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc3RhdGljPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgdXNlTGV4Q29uZmlnPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgdmFyaWFibGVzPzogc3RyaW5nO1xuICByZWFkb25seSB2ZXJib3NlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgU3Rvcnlib29rQ2FsbGJhY2sgPSAoc3RhdHVzOiBudW1iZXIpID0+IHZvaWQ7XG5cbmNvbnN0IGZpbmRTdG9yeUZpbGVzID0gKCk6IHN0cmluZ1tdID0+IHtcbiAgY29uc3Qgc3RvcnlQYXR0ZXJucyA9IFtcbiAgICAnKiovKi5zdG9yaWVzLnt0cyx0c3gsanMsanN4fScsXG4gICAgJyoqLyouc3Rvcnkue3RzLHRzeCxqcyxqc3h9JyxcbiAgICAnKiovc3Rvcmllcy8qKi8qLnt0cyx0c3gsanMsanN4fSdcbiAgXTtcblxuICBjb25zdCBzdG9yeUZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIHN0b3J5UGF0dGVybnMuZm9yRWFjaCgocGF0dGVybikgPT4ge1xuICAgIGNvbnN0IGZpbGVzID0gZ2xvYlN5bmMocGF0dGVybiwge1xuICAgICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgICAgaWdub3JlOiBbJyoqL25vZGVfbW9kdWxlcy8qKicsICcqKi9kaXN0LyoqJywgJyoqL2xpYi8qKicsICcqKi9idWlsZC8qKiddXG4gICAgfSk7XG4gICAgc3RvcnlGaWxlcy5wdXNoKC4uLmZpbGVzKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHN0b3J5RmlsZXM7XG59O1xuXG5jb25zdCBjaGVja1N0b3J5Ym9va0luaXRpYWxpemF0aW9uID0gKCk6IGJvb2xlYW4gPT4ge1xuICBjb25zdCBwcm9qZWN0Q29uZmlnRGlyID0gcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJy5zdG9yeWJvb2snKTtcbiAgY29uc3QgbGV4Q29uZmlnRGlyID0gcGF0aFJlc29sdmUoTGV4Q29uZmlnLmdldExleERpcigpLCAnLnN0b3J5Ym9vaycpO1xuXG4gIHJldHVybiBleGlzdHNTeW5jKHByb2plY3RDb25maWdEaXIpIHx8IGV4aXN0c1N5bmMobGV4Q29uZmlnRGlyKTtcbn07XG5cbmNvbnN0IGV4dHJhY3RQcm9ncmVzc1BlcmNlbnRhZ2UgPSAob3V0cHV0OiBzdHJpbmcpOiBudW1iZXIgfCBudWxsID0+IHtcbiAgY29uc3QgbGluZXMgPSBvdXRwdXQuc3BsaXQoJ1xcbicpO1xuICBmb3IoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgIGlmKGxpbmUuaW5jbHVkZXMoJ1t3ZWJwYWNrLlByb2dyZXNzXScpICYmIGxpbmUuaW5jbHVkZXMoJyUnKSkge1xuICAgICAgY29uc3QgcGVyY2VudGFnZU1hdGNoID0gbGluZS5tYXRjaCgvKFxcZCspJS8pO1xuICAgICAgaWYocGVyY2VudGFnZU1hdGNoKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUludChwZXJjZW50YWdlTWF0Y2hbMV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbmNvbnN0IGZpbHRlckFuZEJlYXV0aWZ5T3V0cHV0ID0gKG91dHB1dDogc3RyaW5nLCBpc1ZlcmJvc2U6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZihpc1ZlcmJvc2UpIHtcbiAgICByZXR1cm4gb3V0cHV0O1xuICB9XG5cbiAgY29uc3QgbGluZXMgPSBvdXRwdXQuc3BsaXQoJ1xcbicpO1xuICBjb25zdCBmaWx0ZXJlZExpbmVzID0gbGluZXMuZmlsdGVyKChsaW5lKSA9PiB7XG4gICAgaWYobGluZS5pbmNsdWRlcygnW3dlYnBhY2suUHJvZ3Jlc3NdJykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZihsaW5lLmluY2x1ZGVzKCdTdG9yeWJvb2snKSB8fFxuICAgICAgbGluZS5pbmNsdWRlcygnTG9jYWw6JykgfHxcbiAgICAgIGxpbmUuaW5jbHVkZXMoJ2h0dHA6Ly9sb2NhbGhvc3QnKSB8fFxuICAgICAgbGluZS5pbmNsdWRlcygnaW5mbyA9PicpIHx8XG4gICAgICBsaW5lLmluY2x1ZGVzKCdTdGFydGluZycpIHx8XG4gICAgICBsaW5lLmluY2x1ZGVzKCdyZWFkeScpIHx8XG4gICAgICBsaW5lLmluY2x1ZGVzKCdlcnJvcicpIHx8XG4gICAgICBsaW5lLmluY2x1ZGVzKCd3YXJuaW5nJykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9KTtcblxuICByZXR1cm4gZmlsdGVyZWRMaW5lcy5qb2luKCdcXG4nKTtcbn07XG5cbmNvbnN0IGJlYXV0aWZ5T3V0cHV0ID0gKG91dHB1dDogc3RyaW5nKTogc3RyaW5nID0+IG91dHB1dFxuICAucmVwbGFjZSgvU3Rvcnlib29rIHZbXFxkLl0rL2csIGNoYWxrLmN5YW4oJyQmJykpXG4gIC5yZXBsYWNlKC9pbmZvID0+L2csIGNoYWxrLmJsdWUoJ2luZm8gPT4nKSlcbiAgLnJlcGxhY2UoL0xvY2FsOi9nLCBjaGFsay5ncmVlbignTG9jYWw6JykpXG4gIC5yZXBsYWNlKC9PbiB5b3VyIG5ldHdvcms6L2csIGNoYWxrLmdyZWVuKCdPbiB5b3VyIG5ldHdvcms6JykpXG4gIC5yZXBsYWNlKC9TdG9yeWJvb2suKnN0YXJ0ZWQvZywgY2hhbGsuZ3JlZW4oJyQmJykpXG4gIC5yZXBsYWNlKC9TdG9yeWJvb2suKnJlYWR5L2csIGNoYWxrLmdyZWVuKCckJicpKVxuICAucmVwbGFjZSgvZXJyb3IvZywgY2hhbGsucmVkKCckJicpKVxuICAucmVwbGFjZSgvd2FybmluZy9nLCBjaGFsay55ZWxsb3coJyQmJykpXG4gIC5yZXBsYWNlKC8oXFxkKyklL2csIGNoYWxrLm1hZ2VudGEoJyQxJScpKTtcblxuZXhwb3J0IGNvbnN0IHN0b3J5Ym9vayA9IGFzeW5jIChjbWQ6IFN0b3J5Ym9va09wdGlvbnMsIGNhbGxiYWNrOiBTdG9yeWJvb2tDYWxsYmFjayA9ICgpID0+ICh7fSkpOiBQcm9taXNlPG51bWJlcj4gPT4ge1xuICBjb25zdCB7Y2xpTmFtZSA9ICdMZXgnLCBjb25maWcsIG9wZW4gPSBmYWxzZSwgcG9ydCA9IDYwMDcsIHF1aWV0LCBzdGF0aWM6IHN0YXRpY0J1aWxkID0gZmFsc2UsIHVzZUxleENvbmZpZyA9IGZhbHNlLCB2YXJpYWJsZXMsIHZlcmJvc2UgPSBmYWxzZX0gPSBjbWQ7XG5cbiAgY29uc3Qgc3Bpbm5lciA9IGNyZWF0ZVNwaW5uZXIocXVpZXQpO1xuXG4gIGxvZyhjaGFsay5jeWFuKGAke2NsaU5hbWV9IHN0YXJ0aW5nIFN0b3J5Ym9vay4uLmApLCAnaW5mbycsIHF1aWV0KTtcblxuICBhd2FpdCBMZXhDb25maWcucGFyc2VDb25maWcoY21kKTtcblxuICBsZXQgdmFyaWFibGVzT2JqOiBvYmplY3QgPSB7Tk9ERV9FTlY6ICdkZXZlbG9wbWVudCd9O1xuXG4gIGlmKHZhcmlhYmxlcykge1xuICAgIHRyeSB7XG4gICAgICB2YXJpYWJsZXNPYmogPSBKU09OLnBhcnNlKHZhcmlhYmxlcyk7XG4gICAgfSBjYXRjaChfZXJyb3IpIHtcbiAgICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogRW52aXJvbm1lbnQgdmFyaWFibGVzIG9wdGlvbiBpcyBub3QgYSB2YWxpZCBKU09OIG9iamVjdC5gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICBjYWxsYmFjaygxKTtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuXG4gIHByb2Nlc3MuZW52ID0gey4uLnByb2Nlc3MuZW52LCAuLi52YXJpYWJsZXNPYmp9O1xuXG4gIHNwaW5uZXIuc3RhcnQoJ0ZpbmRpbmcgc3RvcnkgZmlsZXMuLi4nKTtcbiAgY29uc3Qgc3RvcnlGaWxlcyA9IGZpbmRTdG9yeUZpbGVzKCk7XG5cbiAgaWYoc3RvcnlGaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICBzcGlubmVyLmZhaWwoJ05vIHN0b3J5IGZpbGVzIGZvdW5kIGluIHRoZSBwcm9qZWN0LicpO1xuICAgIGxvZygnUGxlYXNlIGNyZWF0ZSBzdG9yeSBmaWxlcyB3aXRoIC5zdG9yaWVzLnRzLy5zdG9yaWVzLmpzIGV4dGVuc2lvbnMgb3IgaW4gYSBzdG9yaWVzLyBkaXJlY3RvcnkuJywgJ2luZm8nLCBxdWlldCk7XG4gICAgY2FsbGJhY2soMSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBzcGlubmVyLnN1Y2NlZWQoYEZvdW5kICR7c3RvcnlGaWxlcy5sZW5ndGh9IHN0b3J5IGZpbGUocylgKTtcblxuICBjb25zdCB0YWlsd2luZENzc1BhdGggPSBmaW5kVGFpbHdpbmRDc3NQYXRoKCk7XG5cbiAgY29uc29sZS5sb2coe3RhaWx3aW5kQ3NzUGF0aH0pO1xuICBpZih0YWlsd2luZENzc1BhdGgpIHtcbiAgICBpZighcXVpZXQpIHtcbiAgICAgIGxvZyhjaGFsay5ncmVlbihg4pyTIFRhaWx3aW5kIENTUyBpbnRlZ3JhdGlvbiBkZXRlY3RlZDogJHt0YWlsd2luZENzc1BhdGh9YCksICdpbmZvJywgcXVpZXQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZighcXVpZXQpIHtcbiAgICAgIGxvZyhjaGFsay55ZWxsb3coJ+KaoCBObyBUYWlsd2luZCBDU1MgZmlsZSBmb3VuZCBpbiBwcm9qZWN0JyksICdpbmZvJywgcXVpZXQpO1xuICAgICAgbG9nKGNoYWxrLmdyYXkoJ0NyZWF0ZSBhIHRhaWx3aW5kLmNzcyBmaWxlIHdpdGggQHRhaWx3aW5kIGRpcmVjdGl2ZXMgZm9yIGZ1bGwgVGFpbHdpbmQgc3VwcG9ydCcpLCAnaW5mbycsIHF1aWV0KTtcbiAgICB9XG4gIH1cblxuICBpZighY2hlY2tTdG9yeWJvb2tJbml0aWFsaXphdGlvbigpKSB7XG4gICAgc3Bpbm5lci5mYWlsKCdTdG9yeWJvb2sgaXMgbm90IGluaXRpYWxpemVkIGluIHRoaXMgcHJvamVjdCBvciBpbiBMZXguJyk7XG4gICAgbG9nKCdQbGVhc2UgcnVuIFwibnB4IHN0b3J5Ym9va0BsYXRlc3QgaW5pdFwiIHRvIHNldCB1cCBTdG9yeWJvb2sgaW4geW91ciBwcm9qZWN0LCBvciBlbnN1cmUgTGV4IGhhcyBhIHZhbGlkIC5zdG9yeWJvb2sgY29uZmlndXJhdGlvbi4nLCAnaW5mbycsIHF1aWV0KTtcbiAgICBjYWxsYmFjaygxKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGNvbnN0IHByb2plY3RDb25maWdEaXIgPSBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnLnN0b3J5Ym9vaycpO1xuICBjb25zdCBsZXhDb25maWdEaXIgPSBwYXRoUmVzb2x2ZShMZXhDb25maWcuZ2V0TGV4RGlyKCksICcuc3Rvcnlib29rJyk7XG5cbiAgbGV0IGNvbmZpZ0RpciA9IGNvbmZpZztcbiAgaWYoIWNvbmZpZ0Rpcikge1xuICAgIGNvbmZpZ0RpciA9IGxleENvbmZpZ0RpcjtcbiAgICBpZighdXNlTGV4Q29uZmlnICYmIGV4aXN0c1N5bmMocHJvamVjdENvbmZpZ0RpcikpIHtcbiAgICAgIGNvbmZpZ0RpciA9IHByb2plY3RDb25maWdEaXI7XG4gICAgfVxuICB9XG5cbiAgaWYoIXF1aWV0KSB7XG4gICAgbG9nKGNoYWxrLmdyYXkoYFByb2plY3QgY29uZmlnIGRpcjogJHtwcm9qZWN0Q29uZmlnRGlyfSAoZXhpc3RzOiAke2V4aXN0c1N5bmMocHJvamVjdENvbmZpZ0Rpcil9KWApLCAnaW5mbycsIHF1aWV0KTtcbiAgICBsb2coY2hhbGsuZ3JheShgTGV4IGNvbmZpZyBkaXI6ICR7bGV4Q29uZmlnRGlyfSAoZXhpc3RzOiAke2V4aXN0c1N5bmMobGV4Q29uZmlnRGlyKX0pYCksICdpbmZvJywgcXVpZXQpO1xuICAgIGlmKHVzZUxleENvbmZpZykge1xuICAgICAgbG9nKGNoYWxrLmJsdWUoJ1VzaW5nIExleCBTdG9yeWJvb2sgY29uZmlndXJhdGlvbiAoLS11c2UtbGV4LWNvbmZpZyBmbGFnKScpLCAnaW5mbycsIHF1aWV0KTtcbiAgICB9XG4gICAgbG9nKGNoYWxrLmdyYXkoYEluaXRpYWwgY29uZmlnIGRpcjogJHtjb25maWdEaXJ9YCksICdpbmZvJywgcXVpZXQpO1xuICB9XG5cbiAgaWYoY29uZmlnRGlyID09PSBsZXhDb25maWdEaXIpIHtcbiAgICBpZighcXVpZXQpIHtcbiAgICAgIGxvZyhjaGFsay5ibHVlKCdVc2luZyBMZXggY29uZmlnLCB3aWxsIGNyZWF0ZSB0ZW1wb3JhcnkgY29uZmlnIGluIHByb2plY3QgLnN0b3J5Ym9vayBkaXJlY3RvcnknKSwgJ2luZm8nLCBxdWlldCk7XG4gICAgfVxuICAgIGNvbnN0IHByb2plY3RTdG9yeWJvb2tEaXIgPSBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnLnN0b3J5Ym9vaycpO1xuXG4gICAgY29uc3QgZnMgPSBhd2FpdCBpbXBvcnQoJ2ZzL3Byb21pc2VzJyk7XG4gICAgYXdhaXQgZnMubWtkaXIocHJvamVjdFN0b3J5Ym9va0Rpciwge3JlY3Vyc2l2ZTogdHJ1ZX0pO1xuXG4gICAgY29uc3QgbGV4TWFpblBhdGggPSBwYXRoUmVzb2x2ZShsZXhDb25maWdEaXIsICdtYWluLnRzJyk7XG4gICAgY29uc3QgcHJvamVjdE1haW5QYXRoID0gcGF0aFJlc29sdmUocHJvamVjdFN0b3J5Ym9va0RpciwgJ21haW4udHMnKTtcbiAgICBsZXQgbWFpbkNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShsZXhNYWluUGF0aCwgJ3V0ZjgnKTtcblxuICAgIG1haW5Db250ZW50ID0gbWFpbkNvbnRlbnQucmVwbGFjZShcbiAgICAgIC9zdG9yaWVzOlxccypcXFsuKj9cXF0vLFxuICAgICAgYHN0b3JpZXM6IFsnJHtwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnc3JjLyoqLyouc3Rvcmllcy5AKHRzfHRzeCknKX0nLCAnJHtwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnc3JjLyoqLyoubWR4Jyl9J11gXG4gICAgKTtcblxuICAgIGNvbnN0IGxleE5vZGVNb2R1bGVzID0gcGF0aFJlc29sdmUoTGV4Q29uZmlnLmdldExleERpcigpLCAnbm9kZV9tb2R1bGVzJyk7XG4gICAgbWFpbkNvbnRlbnQgPSBtYWluQ29udGVudC5yZXBsYWNlKFxuICAgICAgL2NvbnN0IGxleE1vZHVsZSA9IFxcKG1vZHVsZVBhdGg6IHN0cmluZ1xcKSA9PiByZXNvbHZlXFwoZ2V0TGV4Tm9kZU1vZHVsZXNQYXRoXFwoXFwpLCBtb2R1bGVQYXRoXFwpOy8sXG4gICAgICBgY29uc3QgbGV4TW9kdWxlID0gKG1vZHVsZVBhdGg6IHN0cmluZykgPT4gcmVzb2x2ZSgnJHtsZXhOb2RlTW9kdWxlc30nLCBtb2R1bGVQYXRoKTtgXG4gICAgKTtcblxuICAgIGF3YWl0IGZzLndyaXRlRmlsZShwcm9qZWN0TWFpblBhdGgsIG1haW5Db250ZW50KTtcblxuICAgIGNvbnN0IGxleFByZXZpZXdQYXRoID0gcGF0aFJlc29sdmUobGV4Q29uZmlnRGlyLCAncHJldmlldy50c3gnKTtcbiAgICBpZihleGlzdHNTeW5jKGxleFByZXZpZXdQYXRoKSkge1xuICAgICAgY29uc3QgcHJldmlld0NvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShsZXhQcmV2aWV3UGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShwYXRoUmVzb2x2ZShwcm9qZWN0U3Rvcnlib29rRGlyLCAncHJldmlldy50c3gnKSwgcHJldmlld0NvbnRlbnQpO1xuICAgIH1cblxuICAgIGNvbmZpZ0RpciA9IHByb2plY3RTdG9yeWJvb2tEaXI7XG4gIH1cbiAgaWYoIWV4aXN0c1N5bmMoY29uZmlnRGlyKSkge1xuICAgIHNwaW5uZXIuZmFpbCgnU3Rvcnlib29rIGNvbmZpZ3VyYXRpb24gbm90IGZvdW5kLicpO1xuICAgIGxvZyhgUHJvamVjdCBjb25maWc6ICR7cHJvamVjdENvbmZpZ0Rpcn1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICBsb2coYExleCBjb25maWc6ICR7bGV4Q29uZmlnRGlyfWAsICdpbmZvJywgcXVpZXQpO1xuICAgIGxvZygnUGxlYXNlIHJ1biBcIm5weCBzdG9yeWJvb2tAbGF0ZXN0IGluaXRcIiB0byBzZXQgdXAgU3Rvcnlib29rIGluIHlvdXIgcHJvamVjdCwgb3IgZW5zdXJlIExleCBoYXMgYSB2YWxpZCAuc3Rvcnlib29rIGNvbmZpZ3VyYXRpb24uJywgJ2luZm8nLCBxdWlldCk7XG4gICAgY2FsbGJhY2soMSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBjb25zdCBzdG9yeWJvb2tQYXRoID0gcmVzb2x2ZUJpbmFyeVBhdGgoJ3N0b3J5Ym9vaycpO1xuXG4gIGlmKCFzdG9yeWJvb2tQYXRoKSB7XG4gICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBzdG9yeWJvb2sgYmluYXJ5IG5vdCBmb3VuZCBpbiBMZXgncyBub2RlX21vZHVsZXMgb3IgbW9ub3JlcG8gcm9vdGAsICdlcnJvcicsIHF1aWV0KTtcbiAgICBsb2coJ1BsZWFzZSByZWluc3RhbGwgTGV4IG9yIGNoZWNrIHlvdXIgU3Rvcnlib29rIGluc3RhbGxhdGlvbi4nLCAnaW5mbycsIHF1aWV0KTtcbiAgICBjYWxsYmFjaygxKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGNvbnN0IHN0b3J5Ym9va0FyZ3MgPSBbc3RhdGljQnVpbGQgPyAnYnVpbGQnIDogJ2RldiddO1xuICBzdG9yeWJvb2tBcmdzLnB1c2goJy0tY29uZmlnLWRpcicsIGNvbmZpZ0Rpcik7XG5cbiAgaWYocG9ydCkge1xuICAgIHN0b3J5Ym9va0FyZ3MucHVzaCgnLS1wb3J0JywgcG9ydC50b1N0cmluZygpKTtcbiAgfVxuXG4gIGlmKG9wZW4pIHtcbiAgICBzdG9yeWJvb2tBcmdzLnB1c2goJy0tb3BlbicpO1xuICB9XG5cbiAgaWYoc3RhdGljQnVpbGQpIHtcbiAgICBjb25zdCBvdXRwdXREaXIgPSBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnc3Rvcnlib29rLXN0YXRpYycpO1xuICAgIHN0b3J5Ym9va0FyZ3MucHVzaCgnLS1vdXRwdXQtZGlyJywgb3V0cHV0RGlyKTtcbiAgfVxuXG4gIGlmKCFxdWlldCkge1xuICAgIGxvZyhjaGFsay5ncmF5KGBDb25maWcgZGlyZWN0b3J5OiAke2NvbmZpZ0Rpcn1gKSwgJ2luZm8nLCBxdWlldCk7XG4gIH1cblxuICBwcm9jZXNzLmVudi5UQUlMV0lORF9DU1NfUEFUSCA9IHRhaWx3aW5kQ3NzUGF0aDtcblxuICB0cnkge1xuICAgIHNwaW5uZXIuc3RhcnQoc3RhdGljQnVpbGQgPyAnQnVpbGRpbmcgc3RhdGljIFN0b3J5Ym9vay4uLicgOiAnU3RhcnRpbmcgU3Rvcnlib29rIGRldmVsb3BtZW50IHNlcnZlci4uLicpO1xuXG4gICAgY29uc3Qgc3Rvcnlib29rUHJvY2VzcyA9IGV4ZWNhKHN0b3J5Ym9va1BhdGggYXMgYW55LCBzdG9yeWJvb2tBcmdzLCB7XG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgZW52OiB7XG4gICAgICAgIC4uLnByb2Nlc3MuZW52LFxuICAgICAgICBMRVhfUVVJRVQ6IHF1aWV0LFxuICAgICAgICBMRVhfVkVSQk9TRTogdmVyYm9zZSxcbiAgICAgICAgU1RPUllCT09LX09QRU46IG9wZW4sXG4gICAgICAgIC4uLih0YWlsd2luZENzc1BhdGggJiYge1RBSUxXSU5EX0NTU19QQVRIOiB0YWlsd2luZENzc1BhdGh9KVxuICAgICAgfSBhcyBhbnksXG4gICAgICBzdGRpbzogJ3BpcGUnXG4gICAgfSk7XG5cbiAgICBsZXQgdXJsRm91bmQgPSBmYWxzZTtcbiAgICBsZXQgbGFzdFByb2dyZXNzUGVyY2VudGFnZSA9IDA7XG5cbiAgICBzdG9yeWJvb2tQcm9jZXNzLnN0ZG91dD8ub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgY29uc3Qgb3V0cHV0ID0gZGF0YS50b1N0cmluZygpO1xuICAgICAgY29uc3QgcHJvZ3Jlc3NQZXJjZW50YWdlID0gZXh0cmFjdFByb2dyZXNzUGVyY2VudGFnZShvdXRwdXQpO1xuXG4gICAgICBpZihwcm9ncmVzc1BlcmNlbnRhZ2UgIT09IG51bGwgJiYgcHJvZ3Jlc3NQZXJjZW50YWdlICE9PSBsYXN0UHJvZ3Jlc3NQZXJjZW50YWdlKSB7XG4gICAgICAgIGxhc3RQcm9ncmVzc1BlcmNlbnRhZ2UgPSBwcm9ncmVzc1BlcmNlbnRhZ2U7XG4gICAgICAgIGNvbnN0IGFjdGlvbiA9IHN0YXRpY0J1aWxkID8gJ0J1aWxkaW5nJyA6ICdTdGFydGluZyc7XG4gICAgICAgIChzcGlubmVyIGFzIGFueSkudGV4dCA9IGAke2FjdGlvbn0gU3Rvcnlib29rLi4uICR7cHJvZ3Jlc3NQZXJjZW50YWdlfSVgO1xuICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShgXFxuV2VicGFjayBQcm9ncmVzczogJHtjaGFsay5tYWdlbnRhKGAke3Byb2dyZXNzUGVyY2VudGFnZX0lYCl9XFxuYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpbHRlcmVkT3V0cHV0ID0gZmlsdGVyQW5kQmVhdXRpZnlPdXRwdXQob3V0cHV0LCB2ZXJib3NlKTtcbiAgICAgIGNvbnN0IGJlYXV0aWZpZWRPdXRwdXQgPSBiZWF1dGlmeU91dHB1dChmaWx0ZXJlZE91dHB1dCk7XG5cbiAgICAgIGlmKCF1cmxGb3VuZCAmJiAob3V0cHV0LmluY2x1ZGVzKCdMb2NhbDonKSB8fCBvdXRwdXQuaW5jbHVkZXMoJ2h0dHA6Ly9sb2NhbGhvc3QnKSB8fCBvdXRwdXQuaW5jbHVkZXMoJ1N0b3J5Ym9vaycpKSkge1xuICAgICAgICBzcGlubmVyLnN1Y2NlZWQoY2hhbGsuZ3JlZW4oJ1N0b3J5Ym9vayBkZXZlbG9wbWVudCBzZXJ2ZXIgaXMgcmVhZHkhJykpO1xuICAgICAgICB1cmxGb3VuZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmKGZpbHRlcmVkT3V0cHV0LnRyaW0oKSkge1xuICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShiZWF1dGlmaWVkT3V0cHV0KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHN0b3J5Ym9va1Byb2Nlc3Muc3RkZXJyPy5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICBjb25zdCBvdXRwdXQgPSBkYXRhLnRvU3RyaW5nKCk7XG4gICAgICBjb25zdCBmaWx0ZXJlZE91dHB1dCA9IGZpbHRlckFuZEJlYXV0aWZ5T3V0cHV0KG91dHB1dCwgdmVyYm9zZSk7XG4gICAgICBjb25zdCBiZWF1dGlmaWVkT3V0cHV0ID0gYmVhdXRpZnlPdXRwdXQoZmlsdGVyZWRPdXRwdXQpO1xuXG4gICAgICBpZihmaWx0ZXJlZE91dHB1dC50cmltKCkpIHtcbiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoYmVhdXRpZmllZE91dHB1dCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgc3Rvcnlib29rUHJvY2VzcztcbiAgICAgIGlmKCF1cmxGb3VuZCkge1xuICAgICAgICBzcGlubmVyLnN1Y2NlZWQoY2hhbGsuZ3JlZW4oJ1N0b3J5Ym9vayBkZXZlbG9wbWVudCBzZXJ2ZXIgc3RhcnRlZC4nKSk7XG4gICAgICB9XG4gICAgICBjYWxsYmFjaygwKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIHNwaW5uZXIuZmFpbChjaGFsay5yZWQoJ1RoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBydW5uaW5nIHN0b3J5Ym9vay4nKSk7XG4gICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICBjYWxsYmFjaygxKTtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICBzcGlubmVyLmZhaWwoJ1RoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBydW5uaW5nIHN0b3J5Ym9vay4nKTtcbiAgICBjYWxsYmFjaygxKTtcbiAgICByZXR1cm4gMTtcbiAgfVxufTsiXSwibmFtZXMiOlsiY2hhbGsiLCJleGVjYSIsImV4aXN0c1N5bmMiLCJzeW5jIiwiZ2xvYlN5bmMiLCJyZXNvbHZlIiwicGF0aFJlc29sdmUiLCJMZXhDb25maWciLCJjcmVhdGVTcGlubmVyIiwiZmluZFRhaWx3aW5kQ3NzUGF0aCIsInJlc29sdmVCaW5hcnlQYXRoIiwibG9nIiwiZmluZFN0b3J5RmlsZXMiLCJzdG9yeVBhdHRlcm5zIiwic3RvcnlGaWxlcyIsImZvckVhY2giLCJwYXR0ZXJuIiwiZmlsZXMiLCJjd2QiLCJwcm9jZXNzIiwiaWdub3JlIiwicHVzaCIsImNoZWNrU3Rvcnlib29rSW5pdGlhbGl6YXRpb24iLCJwcm9qZWN0Q29uZmlnRGlyIiwibGV4Q29uZmlnRGlyIiwiZ2V0TGV4RGlyIiwiZXh0cmFjdFByb2dyZXNzUGVyY2VudGFnZSIsIm91dHB1dCIsImxpbmVzIiwic3BsaXQiLCJsaW5lIiwiaW5jbHVkZXMiLCJwZXJjZW50YWdlTWF0Y2giLCJtYXRjaCIsInBhcnNlSW50IiwiZmlsdGVyQW5kQmVhdXRpZnlPdXRwdXQiLCJpc1ZlcmJvc2UiLCJmaWx0ZXJlZExpbmVzIiwiZmlsdGVyIiwiam9pbiIsImJlYXV0aWZ5T3V0cHV0IiwicmVwbGFjZSIsImN5YW4iLCJibHVlIiwiZ3JlZW4iLCJyZWQiLCJ5ZWxsb3ciLCJtYWdlbnRhIiwic3Rvcnlib29rIiwiY21kIiwiY2FsbGJhY2siLCJjbGlOYW1lIiwiY29uZmlnIiwib3BlbiIsInBvcnQiLCJxdWlldCIsInN0YXRpYyIsInN0YXRpY0J1aWxkIiwidXNlTGV4Q29uZmlnIiwidmFyaWFibGVzIiwidmVyYm9zZSIsInNwaW5uZXIiLCJwYXJzZUNvbmZpZyIsInZhcmlhYmxlc09iaiIsIk5PREVfRU5WIiwiSlNPTiIsInBhcnNlIiwiX2Vycm9yIiwiZW52Iiwic3RhcnQiLCJsZW5ndGgiLCJmYWlsIiwic3VjY2VlZCIsInRhaWx3aW5kQ3NzUGF0aCIsImNvbnNvbGUiLCJncmF5IiwiY29uZmlnRGlyIiwicHJvamVjdFN0b3J5Ym9va0RpciIsImZzIiwibWtkaXIiLCJyZWN1cnNpdmUiLCJsZXhNYWluUGF0aCIsInByb2plY3RNYWluUGF0aCIsIm1haW5Db250ZW50IiwicmVhZEZpbGUiLCJsZXhOb2RlTW9kdWxlcyIsIndyaXRlRmlsZSIsImxleFByZXZpZXdQYXRoIiwicHJldmlld0NvbnRlbnQiLCJzdG9yeWJvb2tQYXRoIiwic3Rvcnlib29rQXJncyIsInRvU3RyaW5nIiwib3V0cHV0RGlyIiwiVEFJTFdJTkRfQ1NTX1BBVEgiLCJzdG9yeWJvb2tQcm9jZXNzIiwiZW5jb2RpbmciLCJMRVhfUVVJRVQiLCJMRVhfVkVSQk9TRSIsIlNUT1JZQk9PS19PUEVOIiwic3RkaW8iLCJ1cmxGb3VuZCIsImxhc3RQcm9ncmVzc1BlcmNlbnRhZ2UiLCJzdGRvdXQiLCJvbiIsImRhdGEiLCJwcm9ncmVzc1BlcmNlbnRhZ2UiLCJhY3Rpb24iLCJ0ZXh0Iiwid3JpdGUiLCJmaWx0ZXJlZE91dHB1dCIsImJlYXV0aWZpZWRPdXRwdXQiLCJ0cmltIiwic3RkZXJyIiwiZXJyb3IiLCJtZXNzYWdlIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFXLFFBQVE7QUFDMUIsU0FBUUMsS0FBSyxRQUFPLFFBQVE7QUFDNUIsU0FBUUMsVUFBVSxRQUFPLEtBQUs7QUFDOUIsU0FBUUMsUUFBUUMsUUFBUSxRQUFPLE9BQU87QUFDdEMsU0FBUUMsV0FBV0MsV0FBVyxRQUFPLE9BQU87QUFFNUMsU0FBUUMsU0FBUyxRQUFPLHFCQUFxQjtBQUM3QyxTQUFRQyxhQUFhLFFBQU8scUJBQXFCO0FBQ2pELFNBQVFDLG1CQUFtQixFQUFFQyxpQkFBaUIsUUFBTyxzQkFBc0I7QUFDM0UsU0FBUUMsR0FBRyxRQUFPLHFCQUFxQjtBQWdCdkMsTUFBTUMsaUJBQWlCO0lBQ3JCLE1BQU1DLGdCQUFnQjtRQUNwQjtRQUNBO1FBQ0E7S0FDRDtJQUVELE1BQU1DLGFBQXVCLEVBQUU7SUFFL0JELGNBQWNFLE9BQU8sQ0FBQyxDQUFDQztRQUNyQixNQUFNQyxRQUFRYixTQUFTWSxTQUFTO1lBQzlCRSxLQUFLQyxRQUFRRCxHQUFHO1lBQ2hCRSxRQUFRO2dCQUFDO2dCQUFzQjtnQkFBYztnQkFBYTthQUFjO1FBQzFFO1FBQ0FOLFdBQVdPLElBQUksSUFBSUo7SUFDckI7SUFFQSxPQUFPSDtBQUNUO0FBRUEsTUFBTVEsK0JBQStCO0lBQ25DLE1BQU1DLG1CQUFtQmpCLFlBQVlhLFFBQVFELEdBQUcsSUFBSTtJQUNwRCxNQUFNTSxlQUFlbEIsWUFBWUMsVUFBVWtCLFNBQVMsSUFBSTtJQUV4RCxPQUFPdkIsV0FBV3FCLHFCQUFxQnJCLFdBQVdzQjtBQUNwRDtBQUVBLE1BQU1FLDRCQUE0QixDQUFDQztJQUNqQyxNQUFNQyxRQUFRRCxPQUFPRSxLQUFLLENBQUM7SUFDM0IsS0FBSSxNQUFNQyxRQUFRRixNQUFPO1FBQ3ZCLElBQUdFLEtBQUtDLFFBQVEsQ0FBQyx5QkFBeUJELEtBQUtDLFFBQVEsQ0FBQyxNQUFNO1lB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
|
|
@@ -46,5 +46,5 @@ export interface TestOptions {
|
|
|
46
46
|
}
|
|
47
47
|
export type TestCallback = typeof process.exit;
|
|
48
48
|
export declare const getTestFilePatterns: (testPathPattern?: string) => string[];
|
|
49
|
-
export declare const test: (options: TestOptions, args
|
|
49
|
+
export declare const test: (options: TestOptions, args?: string[], filesOrCallback?: string[] | TestCallback, callbackParam?: TestCallback) => Promise<number>;
|
|
50
50
|
export default test;
|