@nlabs/lex 1.46.1 → 1.47.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.
Files changed (72) hide show
  1. package/__mocks__/LexConfig.js +20 -0
  2. package/__mocks__/boxen.js +7 -0
  3. package/__mocks__/build.js +16 -0
  4. package/__mocks__/chalk.js +23 -0
  5. package/__mocks__/compile.js +8 -0
  6. package/__mocks__/execa.js +21 -0
  7. package/__mocks__/ora.js +17 -0
  8. package/__mocks__/versions.js +12 -0
  9. package/dist/LexConfig.js +72 -14
  10. package/dist/commands/ai/ai.js +303 -0
  11. package/dist/commands/ai/index.js +7 -0
  12. package/dist/commands/build/build.js +350 -0
  13. package/dist/commands/clean/clean.js +31 -0
  14. package/dist/commands/compile/compile.js +195 -0
  15. package/dist/commands/config/config.js +43 -0
  16. package/dist/commands/copy/copy.js +38 -0
  17. package/dist/commands/create/create.js +124 -0
  18. package/dist/commands/dev/dev.js +70 -0
  19. package/dist/commands/init/init.js +93 -0
  20. package/dist/commands/link/link.js +15 -0
  21. package/dist/commands/lint/lint.js +656 -0
  22. package/dist/commands/migrate/migrate.js +37 -0
  23. package/dist/commands/publish/publish.js +104 -0
  24. package/dist/commands/test/test.js +327 -0
  25. package/dist/commands/update/update.js +62 -0
  26. package/dist/commands/upgrade/upgrade.js +47 -0
  27. package/dist/commands/versions/versions.js +41 -0
  28. package/dist/create/changelog.js +3 -3
  29. package/dist/index.js +35 -0
  30. package/dist/jest.config.lex.d.ts +2 -0
  31. package/dist/lex.js +25 -22
  32. package/dist/types.js +1 -0
  33. package/dist/utils/aiService.js +290 -0
  34. package/dist/utils/app.js +4 -4
  35. package/dist/utils/file.js +1 -1
  36. package/dist/utils/log.js +2 -1
  37. package/dist/utils/reactShim.js +3 -3
  38. package/dist/webpack.config.d.ts +2 -0
  39. package/eslint.config.js +10 -0
  40. package/index.cjs +20 -0
  41. package/jest.config.cjs +31 -27
  42. package/jest.config.lex.js +90 -38
  43. package/jest.setup.js +5 -0
  44. package/lex.config.js +50 -0
  45. package/package.json +70 -50
  46. package/{.postcssrc.js → postcss.config.js} +21 -9
  47. package/tsconfig.build.json +7 -16
  48. package/tsconfig.json +2 -1
  49. package/webpack.config.js +136 -77
  50. package/.eslintrc +0 -45
  51. package/dist/commands/build.js +0 -265
  52. package/dist/commands/bulid.test.js +0 -317
  53. package/dist/commands/clean.js +0 -31
  54. package/dist/commands/clean.test.js +0 -63
  55. package/dist/commands/compile.js +0 -195
  56. package/dist/commands/compile.test.js +0 -93
  57. package/dist/commands/config.js +0 -43
  58. package/dist/commands/copy.js +0 -38
  59. package/dist/commands/create.js +0 -116
  60. package/dist/commands/dev.js +0 -70
  61. package/dist/commands/init.js +0 -93
  62. package/dist/commands/link.js +0 -15
  63. package/dist/commands/lint.js +0 -179
  64. package/dist/commands/migrate.js +0 -37
  65. package/dist/commands/publish.js +0 -104
  66. package/dist/commands/test.js +0 -190
  67. package/dist/commands/update.js +0 -64
  68. package/dist/commands/upgrade.js +0 -47
  69. package/dist/commands/versions.js +0 -41
  70. package/dist/commands/versions.test.js +0 -49
  71. package/dist/lint.js +0 -11
  72. package/jest.setup.ts +0 -3
@@ -0,0 +1,20 @@
1
+ // Mock implementation of LexConfig
2
+ const defaultConfigValues = {
3
+ bundler: 'webpack',
4
+ useTypescript: false,
5
+ useGraphQl: false,
6
+ targetEnvironment: 'web',
7
+ sourcePath: './src',
8
+ outputPath: './dist'
9
+ };
10
+
11
+ const LexConfig = {
12
+ config: defaultConfigValues,
13
+ parseConfig: jest.fn(),
14
+ checkTypescriptConfig: jest.fn()
15
+ };
16
+
17
+ module.exports = {
18
+ LexConfig,
19
+ defaultConfigValues
20
+ };
@@ -0,0 +1,7 @@
1
+ // Mock implementation of boxen
2
+ const mockBoxen = jest.fn().mockImplementation((text, options) => {
3
+ return `[BOXED] ${text}`;
4
+ });
5
+
6
+ module.exports = mockBoxen;
7
+ module.exports.default = mockBoxen;
@@ -0,0 +1,16 @@
1
+ // Mock implementation of build module
2
+ const mockSpinner = {
3
+ start: jest.fn(),
4
+ succeed: jest.fn(),
5
+ fail: jest.fn()
6
+ };
7
+
8
+ const build = jest.fn().mockResolvedValue(0);
9
+ const buildWithEsBuild = jest.fn().mockResolvedValue(0);
10
+ const buildWithWebpack = jest.fn().mockResolvedValue(0);
11
+
12
+ module.exports = {
13
+ build,
14
+ buildWithEsBuild,
15
+ buildWithWebpack
16
+ };
@@ -0,0 +1,23 @@
1
+ // Mock implementation of chalk
2
+ const createChalkMock = (text) => text;
3
+
4
+ const chalkMock = {
5
+ red: createChalkMock,
6
+ green: createChalkMock,
7
+ blue: createChalkMock,
8
+ yellow: createChalkMock,
9
+ cyan: createChalkMock,
10
+ magenta: createChalkMock,
11
+ white: createChalkMock,
12
+ gray: createChalkMock,
13
+ grey: createChalkMock,
14
+ black: createChalkMock,
15
+ bold: createChalkMock,
16
+ dim: createChalkMock,
17
+ italic: createChalkMock,
18
+ underline: createChalkMock,
19
+ strikethrough: createChalkMock
20
+ };
21
+
22
+ module.exports = chalkMock;
23
+ module.exports.default = chalkMock;
@@ -0,0 +1,8 @@
1
+ // Mock implementation of compile module
2
+ const compile = jest.fn().mockResolvedValue(0);
3
+ const hasFileType = jest.fn().mockReturnValue(false);
4
+
5
+ module.exports = {
6
+ compile,
7
+ hasFileType
8
+ };
@@ -0,0 +1,21 @@
1
+ // Mock implementation of execa
2
+ const mockExeca = jest.fn().mockImplementation(() => ({
3
+ stdout: '',
4
+ stderr: '',
5
+ exitCode: 0,
6
+ command: 'mocked-command',
7
+ pid: 123
8
+ }));
9
+
10
+ mockExeca.sync = jest.fn().mockImplementation(() => ({
11
+ stdout: '',
12
+ stderr: '',
13
+ exitCode: 0,
14
+ command: 'mocked-command',
15
+ pid: 123
16
+ }));
17
+
18
+ module.exports = {
19
+ execa: mockExeca,
20
+ default: mockExeca
21
+ };
@@ -0,0 +1,17 @@
1
+ // Mock implementation of ora
2
+ const mockSpinner = {
3
+ start: jest.fn().mockReturnThis(),
4
+ stop: jest.fn().mockReturnThis(),
5
+ succeed: jest.fn().mockReturnThis(),
6
+ fail: jest.fn().mockReturnThis(),
7
+ warn: jest.fn().mockReturnThis(),
8
+ info: jest.fn().mockReturnThis(),
9
+ text: '',
10
+ color: 'cyan',
11
+ isSpinning: false
12
+ };
13
+
14
+ const mockOra = jest.fn().mockImplementation(() => mockSpinner);
15
+
16
+ module.exports = mockOra;
17
+ module.exports.default = mockOra;
@@ -0,0 +1,12 @@
1
+ // Mock implementation of versions module
2
+ const jsonVersions = jest.fn().mockResolvedValue({});
3
+ const packages = jest.fn().mockResolvedValue([]);
4
+ const parseVersion = jest.fn().mockReturnValue('1.0.0');
5
+ const versions = jest.fn().mockResolvedValue(undefined);
6
+
7
+ module.exports = {
8
+ jsonVersions,
9
+ packages,
10
+ parseVersion,
11
+ versions
12
+ };
package/dist/LexConfig.js CHANGED
@@ -5,6 +5,12 @@ import { relativeFilePath } from "./utils/file.js";
5
5
  import { log } from "./utils/log.js";
6
6
  const cwd = process.cwd();
7
7
  const defaultConfigValues = {
8
+ ai: {
9
+ provider: "none",
10
+ model: "gpt-4o",
11
+ maxTokens: 4e3,
12
+ temperature: 0.1
13
+ },
8
14
  configFiles: [],
9
15
  entryHTML: "index.html",
10
16
  entryJs: "index.js",
@@ -41,9 +47,8 @@ class LexConfig {
41
47
  }
42
48
  }
43
49
  }
44
- // Set options from a custom configuration file
45
50
  static updateConfig(updatedConfig) {
46
- const { outputFullPath, outputPath, sourcePath, sourceFullPath, useTypescript } = updatedConfig;
51
+ const { outputFullPath, outputPath, sourcePath, sourceFullPath, useTypescript, ai } = updatedConfig;
47
52
  const cwd2 = process.cwd();
48
53
  if (useTypescript !== void 0) {
49
54
  LexConfig.useTypescript = useTypescript;
@@ -54,10 +59,15 @@ class LexConfig {
54
59
  if (sourcePath !== void 0 && sourceFullPath === void 0) {
55
60
  updatedConfig.sourceFullPath = pathResolve(cwd2, sourcePath);
56
61
  }
62
+ if (ai) {
63
+ LexConfig.config.ai = { ...LexConfig.config.ai, ...ai };
64
+ if (process.env.CURSOR_IDE === "true" && LexConfig.config.ai.provider === "none") {
65
+ LexConfig.config.ai.provider = "cursor";
66
+ }
67
+ }
57
68
  LexConfig.config = { ...LexConfig.config, ...updatedConfig };
58
69
  return LexConfig.config;
59
70
  }
60
- // Set option updates from the command line
61
71
  static addConfigParams(cmd, params) {
62
72
  const nameProperty = "_name";
63
73
  const { environment, outputPath, sourcePath, typescript } = cmd;
@@ -85,13 +95,28 @@ class LexConfig {
85
95
  0
86
96
  );
87
97
  }
88
- // Get configuration
89
98
  static async parseConfig(cmd, isRoot = true) {
90
- const { cliName = "Lex", lexConfig, lexConfigName, quiet, typescript } = cmd;
91
- const configName = lexConfigName || "lex.config.js";
92
- const defaultConfigPath = isRoot ? pathResolve(cwd, `./${configName}`) : relativeFilePath(configName, cwd);
93
- const configPath = lexConfig || defaultConfigPath;
94
- const configExists = existsSync(configPath);
99
+ const { cliName = "Lex", lexConfig, lexConfigName, quiet, typescript, debug = false } = cmd;
100
+ const configFormats = ["js", "mjs", "cjs", "ts", "json"];
101
+ const configBaseName = lexConfigName || "lex.config";
102
+ let configPath = lexConfig || "";
103
+ let configExists = lexConfig ? existsSync(configPath) : false;
104
+ if (!configPath || !configExists) {
105
+ if (debug) {
106
+ log(`Searching for config files with base name: ${configBaseName}`, "info", quiet);
107
+ }
108
+ for (const format of configFormats) {
109
+ const potentialPath = isRoot ? pathResolve(cwd, `./${configBaseName}.${format}`) : relativeFilePath(`${configBaseName}.${format}`, cwd);
110
+ if (debug) {
111
+ log(`Checking for config file: ${potentialPath}`, "info", quiet);
112
+ }
113
+ if (existsSync(potentialPath)) {
114
+ configPath = potentialPath;
115
+ configExists = true;
116
+ break;
117
+ }
118
+ }
119
+ }
95
120
  if (configExists) {
96
121
  log(`Using ${cliName} configuration file: ${configPath}`, "note", quiet);
97
122
  const ext = pathExtname(configPath);
@@ -102,6 +127,8 @@ class LexConfig {
102
127
  try {
103
128
  configJson = JSON.parse(configContent)?.default || {};
104
129
  } catch (error) {
130
+ log(`
131
+ ${cliName} Error: Failed to parse JSON config: ${error.message}`, "error", quiet);
105
132
  configJson = {};
106
133
  }
107
134
  LexConfig.addConfigParams(cmd, configJson);
@@ -109,14 +136,45 @@ class LexConfig {
109
136
  log(`
110
137
  ${cliName} Error: Config file malformed, ${configPath}`, "error", quiet);
111
138
  }
112
- } else if (ext === ".js") {
113
- const lexCustomConfig = await import(configPath);
114
- LexConfig.addConfigParams(cmd, lexCustomConfig.default || {});
139
+ } else if ([".js", ".mjs", ".cjs", ".ts"].includes(ext)) {
140
+ try {
141
+ let lexCustomConfig;
142
+ if (ext === ".cjs") {
143
+ const fileUrl = new URL(`file:///${pathResolve(configPath)}`).href;
144
+ if (debug) {
145
+ log(`Loading CommonJS config from: ${fileUrl}`, "info", quiet);
146
+ }
147
+ lexCustomConfig = await import(fileUrl);
148
+ } else {
149
+ if (debug) {
150
+ log(`Loading ESM/TS config from: ${configPath}`, "info", quiet);
151
+ }
152
+ lexCustomConfig = await import(configPath);
153
+ }
154
+ const config = lexCustomConfig.default || lexCustomConfig;
155
+ if (debug) {
156
+ log(`Loaded config: ${JSON.stringify(config, null, 2)}`, "info", quiet);
157
+ }
158
+ if (!config) {
159
+ log(`
160
+ ${cliName} Warning: Config file loaded but no configuration found`, "warn", quiet);
161
+ }
162
+ LexConfig.addConfigParams(cmd, config || {});
163
+ } catch (error) {
164
+ log(`
165
+ ${cliName} Error: Failed to load config file: ${error.message}`, "error", quiet);
166
+ if (debug) {
167
+ console.error(error);
168
+ }
169
+ }
115
170
  } else {
116
171
  log(`
117
- ${cliName} Error: Config file must be a JS or JSON file.`, "error", quiet);
172
+ ${cliName} Error: Config file must be a JS, CJS, MJS, TS, or JSON file.`, "error", quiet);
118
173
  }
119
174
  } else {
175
+ if (debug) {
176
+ log(`No config file found. Using default configuration.`, "info", quiet);
177
+ }
120
178
  LexConfig.useTypescript = !!typescript;
121
179
  LexConfig.addConfigParams(cmd, LexConfig.config);
122
180
  }
@@ -133,4 +191,4 @@ export {
133
191
  LexConfig,
134
192
  defaultConfigValues
135
193
  };
136
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL0xleENvbmZpZy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7ZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jLCB3cml0ZUZpbGVTeW5jfSBmcm9tICdmcyc7XG5pbXBvcnQge2V4dG5hbWUgYXMgcGF0aEV4dG5hbWUsIHJlc29sdmUgYXMgcGF0aFJlc29sdmV9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHtVUkx9IGZyb20gJ3VybCc7XG5cbmltcG9ydCB7cmVsYXRpdmVGaWxlUGF0aH0gZnJvbSAnLi91dGlscy9maWxlLmpzJztcbmltcG9ydCB7bG9nfSBmcm9tICcuL3V0aWxzL2xvZy5qcyc7XG5cbmNvbnN0IGN3ZDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKTtcblxuZXhwb3J0IGludGVyZmFjZSBMZXhDb25maWdUeXBlIHtcbiAgY29uZmlnRmlsZXM/OiBzdHJpbmdbXTtcbiAgZW50cnlIVE1MPzogc3RyaW5nO1xuICBlbnRyeUpzPzogc3RyaW5nO1xuICBlc2J1aWxkPzogYW55O1xuICBlbnY/OiBvYmplY3Q7XG4gIGdpdFVybD86IHN0cmluZztcbiAgamVzdD86IGFueTtcbiAgbGlicmFyeU5hbWU/OiBzdHJpbmc7XG4gIGxpYnJhcnlUYXJnZXQ/OiBzdHJpbmc7XG4gIG91dHB1dEZpbGU/OiBzdHJpbmc7XG4gIG91dHB1dEZ1bGxQYXRoPzogc3RyaW5nO1xuICBvdXRwdXRIYXNoPzogYm9vbGVhbjtcbiAgb3V0cHV0UGF0aD86IHN0cmluZztcbiAgcGFja2FnZU1hbmFnZXI/OiAnbnBtJyB8ICd5YXJuJztcbiAgcHJlc2V0PzogJ3dlYicgfCAnbm9kZScgfCAnbGFtYmRhJyB8ICdtb2JpbGUnO1xuICBzb3VyY2VGdWxsUGF0aD86IHN0cmluZztcbiAgc291cmNlUGF0aD86IHN0cmluZztcbiAgdGFyZ2V0RW52aXJvbm1lbnQ/OiAnbm9kZScgfCAnd2ViJztcbiAgdXNlR3JhcGhRbD86IGJvb2xlYW47XG4gIHVzZVR5cGVzY3JpcHQ/OiBib29sZWFuO1xuICB3ZWJwYWNrPzogYW55O1xufVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdENvbmZpZ1ZhbHVlczogTGV4Q29uZmlnVHlwZSA9IHtcbiAgY29uZmlnRmlsZXM6IFtdLFxuICBlbnRyeUhUTUw6ICdpbmRleC5odG1sJyxcbiAgZW50cnlKczogJ2luZGV4LmpzJyxcbiAgZXNidWlsZDoge30sXG4gIGVudjogbnVsbCxcbiAgamVzdDoge30sXG4gIG91dHB1dEZ1bGxQYXRoOiBwYXRoUmVzb2x2ZShjd2QsICcuL2Rpc3QnKSxcbiAgb3V0cHV0SGFzaDogZmFsc2UsXG4gIG91dHB1dFBhdGg6ICcuL2Rpc3QnLFxuICBwYWNrYWdlTWFuYWdlcjogJ25wbScsXG4gIHByZXNldDogJ3dlYicsXG4gIHNvdXJjZUZ1bGxQYXRoOiBwYXRoUmVzb2x2ZShjd2QsICcuL3NyYycpLFxuICBzb3VyY2VQYXRoOiAnLi9zcmMnLFxuICB0YXJnZXRFbnZpcm9ubWVudDogJ3dlYicsXG4gIHVzZUdyYXBoUWw6IGZhbHNlLFxuICB1c2VUeXBlc2NyaXB0OiBmYWxzZSxcbiAgd2VicGFjazoge31cbn07XG5cbmV4cG9ydCBjbGFzcyBMZXhDb25maWcge1xuICBzdGF0aWMgY29uZmlnOiBMZXhDb25maWdUeXBlID0ge1xuICAgIC4uLmRlZmF1bHRDb25maWdWYWx1ZXNcbiAgfTtcblxuICBzdGF0aWMgc2V0IHVzZVR5cGVzY3JpcHQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBMZXhDb25maWcuY29uZmlnLnVzZVR5cGVzY3JpcHQgPSB2YWx1ZTtcbiAgICBjb25zdCB7c291cmNlRnVsbFBhdGh9ID0gTGV4Q29uZmlnLmNvbmZpZztcblxuICAgIC8vIE1ha2Ugc3VyZSB3ZSBjaGFuZ2UgdGhlIGRlZmF1bHQgZW50cnkgZmlsZSBpZiBUeXBlc2NyaXB0IGlzIGJlaW5nIHVzZWQuXG4gICAgY29uc3Qge2VudHJ5SnN9ID0gTGV4Q29uZmlnLmNvbmZpZztcblxuICAgIGlmKGVudHJ5SnMgPT09ICdpbmRleC5qcycgJiYgdmFsdWUpIHtcbiAgICAgIGNvbnN0IGluZGV4UGF0aDogc3RyaW5nID0gcGF0aFJlc29sdmUoY3dkLCBzb3VyY2VGdWxsUGF0aCwgJ2luZGV4LnRzeCcpO1xuICAgICAgY29uc3QgaGFzSW5kZXhUc3g6IGJvb2xlYW4gPSBleGlzdHNTeW5jKGluZGV4UGF0aCk7XG5cbiAgICAgIGlmKGhhc0luZGV4VHN4KSB7XG4gICAgICAgIExleENvbmZpZy5jb25maWcuZW50cnlKcyA9ICdpbmRleC50c3gnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgTGV4Q29uZmlnLmNvbmZpZy5lbnRyeUpzID0gJ2luZGV4LnRzJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBTZXQgb3B0aW9ucyBmcm9tIGEgY3VzdG9tIGNvbmZpZ3VyYXRpb24gZmlsZVxuICBzdGF0aWMgdXBkYXRlQ29uZmlnKHVwZGF0ZWRDb25maWc6IExleENvbmZpZ1R5cGUpOiBMZXhDb25maWdUeXBlIHtcbiAgICBjb25zdCB7b3V0cHV0RnVsbFBhdGgsIG91dHB1dFBhdGgsIHNvdXJjZVBhdGgsIHNvdXJjZUZ1bGxQYXRoLCB1c2VUeXBlc2NyaXB0fSA9IHVwZGF0ZWRDb25maWc7XG4gICAgY29uc3QgY3dkOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpO1xuXG4gICAgLy8gVXNlIFR5cGVzY3JpcHRcbiAgICBpZih1c2VUeXBlc2NyaXB0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIExleENvbmZpZy51c2VUeXBlc2NyaXB0ID0gdXNlVHlwZXNjcmlwdDtcbiAgICB9XG5cbiAgICAvLyBEZXN0aW5hdGlvbiBQYXRoXG4gICAgaWYob3V0cHV0UGF0aCAhPT0gdW5kZWZpbmVkICYmIG91dHB1dEZ1bGxQYXRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHVwZGF0ZWRDb25maWcub3V0cHV0RnVsbFBhdGggPSBwYXRoUmVzb2x2ZShjd2QsIG91dHB1dFBhdGgpO1xuICAgIH1cblxuICAgIC8vIFNvdXJjZSBjb2RlIHBhdGhcbiAgICBpZihzb3VyY2VQYXRoICE9PSB1bmRlZmluZWQgJiYgc291cmNlRnVsbFBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgdXBkYXRlZENvbmZpZy5zb3VyY2VGdWxsUGF0aCA9IHBhdGhSZXNvbHZlKGN3ZCwgc291cmNlUGF0aCk7XG4gICAgfVxuXG4gICAgTGV4Q29uZmlnLmNvbmZpZyA9IHsuLi5MZXhDb25maWcuY29uZmlnLCAuLi51cGRhdGVkQ29uZmlnfTtcbiAgICByZXR1cm4gTGV4Q29uZmlnLmNvbmZpZztcbiAgfVxuXG4gIC8vIFNldCBvcHRpb24gdXBkYXRlcyBmcm9tIHRoZSBjb21tYW5kIGxpbmVcbiAgc3RhdGljIGFkZENvbmZpZ1BhcmFtcyhjbWQsIHBhcmFtczogTGV4Q29uZmlnVHlwZSkge1xuICAgIGNvbnN0IG5hbWVQcm9wZXJ0eTogc3RyaW5nID0gJ19uYW1lJztcbiAgICBjb25zdCB7ZW52aXJvbm1lbnQsIG91dHB1dFBhdGgsIHNvdXJjZVBhdGgsIHR5cGVzY3JpcHR9ID0gY21kO1xuXG4gICAgLy8gQ3VzdG9tIG91dHB1dCBkaXJcbiAgICBpZihvdXRwdXRQYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcmFtcy5vdXRwdXRQYXRoID0gb3V0cHV0UGF0aDtcbiAgICAgIHBhcmFtcy5vdXRwdXRGdWxsUGF0aCA9IHBhdGhSZXNvbHZlKGN3ZCwgb3V0cHV0UGF0aCk7XG4gICAgfVxuXG4gICAgLy8gQ3VzdG9tIHNvdXJjZSBkaXJcbiAgICBpZihzb3VyY2VQYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcmFtcy5zb3VyY2VQYXRoID0gc291cmNlUGF0aDtcbiAgICAgIHBhcmFtcy5zb3VyY2VGdWxsUGF0aCA9IHBhdGhSZXNvbHZlKGN3ZCwgc291cmNlUGF0aCk7XG4gICAgfVxuXG4gICAgLy8gRGV0ZXJtaW5lIGlmIHdlJ3JlIHVzaW5nIFR5cGVzY3JpcHQgb3IgRmxvd1xuICAgIGlmKHR5cGVzY3JpcHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcGFyYW1zLnVzZVR5cGVzY3JpcHQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIFNldCB0aGUgdGFyZ2V0IGVudmlyb25tZW50XG4gICAgaWYoZW52aXJvbm1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcGFyYW1zLnRhcmdldEVudmlyb25tZW50ID0gZW52aXJvbm1lbnQgPT09ICd3ZWInID8gJ3dlYicgOiAnbm9kZSc7XG4gICAgfVxuXG4gICAgcHJvY2Vzcy5lbnYuTEVYX0NPTkZJRyA9IEpTT04uc3RyaW5naWZ5KFxuICAgICAge1xuICAgICAgICAuLi5MZXhDb25maWcudXBkYXRlQ29uZmlnKHBhcmFtcyksXG4gICAgICAgIGNvbW1hbmROYW1lOiBjbWRbbmFtZVByb3BlcnR5XSxcbiAgICAgICAgaXNTdGF0aWM6IGNtZC5zdGF0aWNcbiAgICAgIH0sIG51bGwsIDBcbiAgICApO1xuICB9XG5cbiAgLy8gR2V0IGNvbmZpZ3VyYXRpb25cbiAgc3RhdGljIGFzeW5jIHBhcnNlQ29uZmlnKGNtZCwgaXNSb290OiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHtjbGlOYW1lID0gJ0xleCcsIGxleENvbmZpZywgbGV4Q29uZmlnTmFtZSwgcXVpZXQsIHR5cGVzY3JpcHR9ID0gY21kO1xuICAgIGNvbnN0IGNvbmZpZ05hbWU6IHN0cmluZyA9IGxleENvbmZpZ05hbWUgfHwgJ2xleC5jb25maWcuanMnO1xuICAgIGNvbnN0IGRlZmF1bHRDb25maWdQYXRoOiBzdHJpbmcgPSBpc1Jvb3RcbiAgICAgID8gcGF0aFJlc29sdmUoY3dkLCBgLi8ke2NvbmZpZ05hbWV9YClcbiAgICAgIDogcmVsYXRpdmVGaWxlUGF0aChjb25maWdOYW1lLCBjd2QpO1xuICAgIGNvbnN0IGNvbmZpZ1BhdGg6IHN0cmluZyA9IGxleENvbmZpZyB8fCBkZWZhdWx0Q29uZmlnUGF0aDtcbiAgICBjb25zdCBjb25maWdFeGlzdHM6IGJvb2xlYW4gPSBleGlzdHNTeW5jKGNvbmZpZ1BhdGgpO1xuXG4gICAgLy8gSWYgdXNlciBoYXMgYSBMZXggY29uZmlnIGZpbGUsIGxldHMgdXNlIGl0LlxuICAgIGlmKGNvbmZpZ0V4aXN0cykge1xuICAgICAgbG9nKGBVc2luZyAke2NsaU5hbWV9IGNvbmZpZ3VyYXRpb24gZmlsZTogJHtjb25maWdQYXRofWAsICdub3RlJywgcXVpZXQpO1xuICAgICAgY29uc3QgZXh0OiBzdHJpbmcgPSBwYXRoRXh0bmFtZShjb25maWdQYXRoKTtcblxuICAgICAgaWYoZXh0ID09PSAnLmpzb24nKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZ0NvbnRlbnQ6IHN0cmluZyA9IHJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmOCcpO1xuXG4gICAgICAgIGlmKGNvbmZpZ0NvbnRlbnQpIHtcbiAgICAgICAgICBsZXQgY29uZmlnSnNvbjogTGV4Q29uZmlnVHlwZTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25maWdKc29uID0gSlNPTi5wYXJzZShjb25maWdDb250ZW50KT8uZGVmYXVsdCB8fCB7fTtcbiAgICAgICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgICAgICBjb25maWdKc29uID0ge307XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgTGV4Q29uZmlnLmFkZENvbmZpZ1BhcmFtcyhjbWQsIGNvbmZpZ0pzb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogQ29uZmlnIGZpbGUgbWFsZm9ybWVkLCAke2NvbmZpZ1BhdGh9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYoZXh0ID09PSAnLmpzJykge1xuICAgICAgICBjb25zdCBsZXhDdXN0b21Db25maWcgPSBhd2FpdCBpbXBvcnQoY29uZmlnUGF0aCk7XG4gICAgICAgIExleENvbmZpZy5hZGRDb25maWdQYXJhbXMoY21kLCBsZXhDdXN0b21Db25maWcuZGVmYXVsdCB8fCB7fSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IENvbmZpZyBmaWxlIG11c3QgYmUgYSBKUyBvciBKU09OIGZpbGUuYCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEZXRlcm1pbmUgaWYgd2UncmUgdXNpbmcgVHlwZXNjcmlwdCBvciBGbG93XG4gICAgICBMZXhDb25maWcudXNlVHlwZXNjcmlwdCA9ICEhdHlwZXNjcmlwdDtcblxuICAgICAgLy8gU2F2ZSBjb25maWcgYXMgZW52aXJvbm1lbnQgdmFyaWFibGUgZm9yIG90aGVyIGNvbW1hbmRzIHRvIGluY2x1ZGVcbiAgICAgIExleENvbmZpZy5hZGRDb25maWdQYXJhbXMoY21kLCBMZXhDb25maWcuY29uZmlnKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgY2hlY2tUeXBlc2NyaXB0Q29uZmlnKCkge1xuICAgIGNvbnN0IHRzY29uZmlnUGF0aDogc3RyaW5nID0gcGF0aFJlc29sdmUoY3dkLCAnLi90c2NvbmZpZy5qc29uJyk7XG5cbiAgICBpZighZXhpc3RzU3luYyh0c2NvbmZpZ1BhdGgpKSB7XG4gICAgICBjb25zdCBkaXJOYW1lID0gbmV3IFVSTCgnLicsIGltcG9ydC5tZXRhLnVybCkucGF0aG5hbWU7XG4gICAgICB3cml0ZUZpbGVTeW5jKHRzY29uZmlnUGF0aCwgcmVhZEZpbGVTeW5jKHBhdGhSZXNvbHZlKGRpck5hbWUsICcuLi8uLi8uLi90c2NvbmZpZy5iYXNlLmpzb24nKSkpO1xuICAgIH1cbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBSUEsU0FBUSxZQUFZLGNBQWMscUJBQW9C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QU0sRUFBQyxVQUFVLE9BQU8sV0FBVyxlQUFlLE9BQU8sV0FBVSxJQUFJO0FBQ3ZFLFVBQU0sYUFBcUIsaUJBQWlCO0FBQzVDLFVBQU0sb0JBQTRCLFNBQzlCLFlBQVksS0FBSyxLQUFLLFVBQVUsRUFBRSxJQUNsQyxpQkFBaUIsWUFBWSxHQUFHO0FBQ3BDLFVBQU0sYUFBcUIsYUFBYTtBQUN4QyxVQUFNLGVBQXdCLFdBQVcsVUFBVTtBQUduRCxRQUFHLGNBQWM7QUFDZixVQUFJLFNBQVMsT0FBTyx3QkFBd0IsVUFBVSxJQUFJLFFBQVEsS0FBSztBQUN2RSxZQUFNLE1BQWMsWUFBWSxVQUFVO0FBRTFDLFVBQUcsUUFBUSxTQUFTO0FBQ2xCLGNBQU0sZ0JBQXdCLGFBQWEsWUFBWSxNQUFNO0FBRTdELFlBQUcsZUFBZTtBQUNoQixjQUFJO0FBRUosY0FBSTtBQUNGLHlCQUFhLEtBQUssTUFBTSxhQUFhLEdBQUcsV0FBVyxDQUFDO0FBQUEsVUFDdEQsU0FBUSxPQUFPO0FBQ2IseUJBQWEsQ0FBQztBQUFBLFVBQ2hCO0FBRUEsb0JBQVUsZ0JBQWdCLEtBQUssVUFBVTtBQUFBLFFBQzNDLE9BQU87QUFDTCxjQUFJO0FBQUEsRUFBSyxPQUFPLGtDQUFrQyxVQUFVLElBQUksU0FBUyxLQUFLO0FBQUEsUUFDaEY7QUFBQSxNQUNGLFdBQVUsUUFBUSxPQUFPO0FBQ3ZCLGNBQU0sa0JBQWtCLE1BQU0sT0FBTztBQUNyQyxrQkFBVSxnQkFBZ0IsS0FBSyxnQkFBZ0IsV0FBVyxDQUFDLENBQUM7QUFBQSxNQUM5RCxPQUFPO0FBQ0wsWUFBSTtBQUFBLEVBQUssT0FBTyxrREFBa0QsU0FBUyxLQUFLO0FBQUEsTUFDbEY7QUFBQSxJQUNGLE9BQU87QUFFTCxnQkFBVSxnQkFBZ0IsQ0FBQyxDQUFDO0FBRzVCLGdCQUFVLGdCQUFnQixLQUFLLFVBQVUsTUFBTTtBQUFBLElBQ2pEO0FBQUEsRUFDRjtBQUFBLEVBRUEsT0FBTyx3QkFBd0I7QUFDN0IsVUFBTSxlQUF1QixZQUFZLEtBQUssaUJBQWlCO0FBRS9ELFFBQUcsQ0FBQyxXQUFXLFlBQVksR0FBRztBQUM1QixZQUFNLFVBQVUsSUFBSSxJQUFJLEtBQUssWUFBWSxHQUFHLEVBQUU7QUFDOUMsb0JBQWMsY0FBYyxhQUFhLFlBQVksU0FBUyw2QkFBNkIsQ0FBQyxDQUFDO0FBQUEsSUFDL0Y7QUFBQSxFQUNGO0FBQ0Y7IiwKICAibmFtZXMiOiBbImN3ZCJdCn0K
194
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL0xleENvbmZpZy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7ZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jLCB3cml0ZUZpbGVTeW5jfSBmcm9tICdmcyc7XG5pbXBvcnQge2V4dG5hbWUgYXMgcGF0aEV4dG5hbWUsIHJlc29sdmUgYXMgcGF0aFJlc29sdmV9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHtVUkx9IGZyb20gJ3VybCc7XG5cbmltcG9ydCB7cmVsYXRpdmVGaWxlUGF0aH0gZnJvbSAnLi91dGlscy9maWxlLmpzJztcbmltcG9ydCB7bG9nfSBmcm9tICcuL3V0aWxzL2xvZy5qcyc7XG5cbmNvbnN0IGN3ZDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKTtcblxuZXhwb3J0IGludGVyZmFjZSBFc2J1aWxkQ29uZmlnIHtcbiAgZW50cnlQb2ludHM/OiBzdHJpbmdbXTtcbiAgb3V0ZGlyPzogc3RyaW5nO1xuICBwbGF0Zm9ybT86ICdub2RlJyB8ICdicm93c2VyJztcbiAgdGFyZ2V0Pzogc3RyaW5nO1xuICBmb3JtYXQ/OiAnY2pzJyB8ICdlc20nO1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEplc3RDb25maWcge1xuICByb290cz86IHN0cmluZ1tdO1xuICB0ZXN0RW52aXJvbm1lbnQ/OiBzdHJpbmc7XG4gIHRyYW5zZm9ybT86IFJlY29yZDxzdHJpbmcsIFtzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+XT47XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2VicGFja0NvbmZpZyB7XG4gIGVudHJ5Pzogc3RyaW5nIHwgc3RyaW5nW107XG4gIG91dHB1dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBtb2R1bGU/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcGx1Z2lucz86IHVua25vd25bXTtcbiAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBSUNvbmZpZyB7XG4gIHByb3ZpZGVyPzogJ2N1cnNvcicgfCAnY29waWxvdCcgfCAnb3BlbmFpJyB8ICdhbnRocm9waWMnIHwgJ25vbmUnO1xuICBhcGlLZXk/OiBzdHJpbmc7XG4gIG1vZGVsPzogc3RyaW5nO1xuICBtYXhUb2tlbnM/OiBudW1iZXI7XG4gIHRlbXBlcmF0dXJlPzogbnVtYmVyO1xufVxuZXhwb3J0IGludGVyZmFjZSBMZXhDb25maWdUeXBlIHtcbiAgYWk/OiBBSUNvbmZpZztcbiAgY29uZmlnRmlsZXM/OiBzdHJpbmdbXTtcbiAgZW50cnlIVE1MPzogc3RyaW5nO1xuICBlbnRyeUpzPzogc3RyaW5nO1xuICBlc2J1aWxkPzogRXNidWlsZENvbmZpZztcbiAgZW52Pzogb2JqZWN0O1xuICBnaXRVcmw/OiBzdHJpbmc7XG4gIGplc3Q/OiBKZXN0Q29uZmlnO1xuICBsaWJyYXJ5TmFtZT86IHN0cmluZztcbiAgbGlicmFyeVRhcmdldD86IHN0cmluZztcbiAgb3V0cHV0RmlsZT86IHN0cmluZztcbiAgb3V0cHV0RnVsbFBhdGg/OiBzdHJpbmc7XG4gIG91dHB1dEhhc2g/OiBib29sZWFuO1xuICBvdXRwdXRQYXRoPzogc3RyaW5nO1xuICBwYWNrYWdlTWFuYWdlcj86ICducG0nIHwgJ3lhcm4nO1xuICBwcmVzZXQ/OiAnd2ViJyB8ICdub2RlJyB8ICdsYW1iZGEnIHwgJ21vYmlsZSc7XG4gIHNvdXJjZUZ1bGxQYXRoPzogc3RyaW5nO1xuICBzb3VyY2VQYXRoPzogc3RyaW5nO1xuICB0YXJnZXRFbnZpcm9ubWVudD86ICdub2RlJyB8ICd3ZWInO1xuICB1c2VHcmFwaFFsPzogYm9vbGVhbjtcbiAgdXNlVHlwZXNjcmlwdD86IGJvb2xlYW47XG4gIHdlYnBhY2s/OiBXZWJwYWNrQ29uZmlnO1xufVxuXG5leHBvcnQgdHlwZSBDb25maWcgPSBMZXhDb25maWdUeXBlO1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdENvbmZpZ1ZhbHVlczogTGV4Q29uZmlnVHlwZSA9IHtcbiAgYWk6IHtcbiAgICBwcm92aWRlcjogJ25vbmUnLFxuICAgIG1vZGVsOiAnZ3B0LTRvJyxcbiAgICBtYXhUb2tlbnM6IDQwMDAsXG4gICAgdGVtcGVyYXR1cmU6IDAuMVxuICB9LFxuICBjb25maWdGaWxlczogW10sXG4gIGVudHJ5SFRNTDogJ2luZGV4Lmh0bWwnLFxuICBlbnRyeUpzOiAnaW5kZXguanMnLFxuICBlc2J1aWxkOiB7fSxcbiAgZW52OiBudWxsLFxuICBqZXN0OiB7fSxcbiAgb3V0cHV0RnVsbFBhdGg6IHBhdGhSZXNvbHZlKGN3ZCwgJy4vZGlzdCcpLFxuICBvdXRwdXRIYXNoOiBmYWxzZSxcbiAgb3V0cHV0UGF0aDogJy4vZGlzdCcsXG4gIHBhY2thZ2VNYW5hZ2VyOiAnbnBtJyxcbiAgcHJlc2V0OiAnd2ViJyxcbiAgc291cmNlRnVsbFBhdGg6IHBhdGhSZXNvbHZlKGN3ZCwgJy4vc3JjJyksXG4gIHNvdXJjZVBhdGg6ICcuL3NyYycsXG4gIHRhcmdldEVudmlyb25tZW50OiAnd2ViJyxcbiAgdXNlR3JhcGhRbDogZmFsc2UsXG4gIHVzZVR5cGVzY3JpcHQ6IGZhbHNlLFxuICB3ZWJwYWNrOiB7fVxufTtcblxuZXhwb3J0IGNsYXNzIExleENvbmZpZyB7XG4gIHN0YXRpYyBjb25maWc6IExleENvbmZpZ1R5cGUgPSB7XG4gICAgLi4uZGVmYXVsdENvbmZpZ1ZhbHVlc1xuICB9O1xuXG4gIHN0YXRpYyBzZXQgdXNlVHlwZXNjcmlwdCh2YWx1ZTogYm9vbGVhbikge1xuICAgIExleENvbmZpZy5jb25maWcudXNlVHlwZXNjcmlwdCA9IHZhbHVlO1xuICAgIGNvbnN0IHtzb3VyY2VGdWxsUGF0aH0gPSBMZXhDb25maWcuY29uZmlnO1xuXG4gICAgY29uc3Qge2VudHJ5SnN9ID0gTGV4Q29uZmlnLmNvbmZpZztcblxuICAgIGlmKGVudHJ5SnMgPT09ICdpbmRleC5qcycgJiYgdmFsdWUpIHtcbiAgICAgIGNvbnN0IGluZGV4UGF0aDogc3RyaW5nID0gcGF0aFJlc29sdmUoY3dkLCBzb3VyY2VGdWxsUGF0aCwgJ2luZGV4LnRzeCcpO1xuICAgICAgY29uc3QgaGFzSW5kZXhUc3g6IGJvb2xlYW4gPSBleGlzdHNTeW5jKGluZGV4UGF0aCk7XG5cbiAgICAgIGlmKGhhc0luZGV4VHN4KSB7XG4gICAgICAgIExleENvbmZpZy5jb25maWcuZW50cnlKcyA9ICdpbmRleC50c3gnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgTGV4Q29uZmlnLmNvbmZpZy5lbnRyeUpzID0gJ2luZGV4LnRzJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdGF0aWMgdXBkYXRlQ29uZmlnKHVwZGF0ZWRDb25maWc6IExleENvbmZpZ1R5cGUpOiBMZXhDb25maWdUeXBlIHtcbiAgICBjb25zdCB7b3V0cHV0RnVsbFBhdGgsIG91dHB1dFBhdGgsIHNvdXJjZVBhdGgsIHNvdXJjZUZ1bGxQYXRoLCB1c2VUeXBlc2NyaXB0LCBhaX0gPSB1cGRhdGVkQ29uZmlnO1xuICAgIGNvbnN0IGN3ZDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKTtcblxuICAgIGlmKHVzZVR5cGVzY3JpcHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgTGV4Q29uZmlnLnVzZVR5cGVzY3JpcHQgPSB1c2VUeXBlc2NyaXB0O1xuICAgIH1cblxuICAgIGlmKG91dHB1dFBhdGggIT09IHVuZGVmaW5lZCAmJiBvdXRwdXRGdWxsUGF0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB1cGRhdGVkQ29uZmlnLm91dHB1dEZ1bGxQYXRoID0gcGF0aFJlc29sdmUoY3dkLCBvdXRwdXRQYXRoKTtcbiAgICB9XG5cbiAgICBpZihzb3VyY2VQYXRoICE9PSB1bmRlZmluZWQgJiYgc291cmNlRnVsbFBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgdXBkYXRlZENvbmZpZy5zb3VyY2VGdWxsUGF0aCA9IHBhdGhSZXNvbHZlKGN3ZCwgc291cmNlUGF0aCk7XG4gICAgfVxuICAgIFxuICAgIGlmKGFpKSB7XG4gICAgICBMZXhDb25maWcuY29uZmlnLmFpID0gey4uLkxleENvbmZpZy5jb25maWcuYWksIC4uLmFpfTtcbiAgICAgIFxuICAgICAgaWYocHJvY2Vzcy5lbnYuQ1VSU09SX0lERSA9PT0gJ3RydWUnICYmIExleENvbmZpZy5jb25maWcuYWkucHJvdmlkZXIgPT09ICdub25lJykge1xuICAgICAgICBMZXhDb25maWcuY29uZmlnLmFpLnByb3ZpZGVyID0gJ2N1cnNvcic7XG4gICAgICB9XG4gICAgfVxuXG4gICAgTGV4Q29uZmlnLmNvbmZpZyA9IHsuLi5MZXhDb25maWcuY29uZmlnLCAuLi51cGRhdGVkQ29uZmlnfTtcbiAgICBcbiAgICByZXR1cm4gTGV4Q29uZmlnLmNvbmZpZztcbiAgfVxuXG4gIHN0YXRpYyBhZGRDb25maWdQYXJhbXMoY21kLCBwYXJhbXM6IExleENvbmZpZ1R5cGUpIHtcbiAgICBjb25zdCBuYW1lUHJvcGVydHk6IHN0cmluZyA9ICdfbmFtZSc7XG4gICAgY29uc3Qge2Vudmlyb25tZW50LCBvdXRwdXRQYXRoLCBzb3VyY2VQYXRoLCB0eXBlc2NyaXB0fSA9IGNtZDtcblxuICAgIGlmKG91dHB1dFBhdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgcGFyYW1zLm91dHB1dFBhdGggPSBvdXRwdXRQYXRoO1xuICAgICAgcGFyYW1zLm91dHB1dEZ1bGxQYXRoID0gcGF0aFJlc29sdmUoY3dkLCBvdXRwdXRQYXRoKTtcbiAgICB9XG5cbiAgICBpZihzb3VyY2VQYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcmFtcy5zb3VyY2VQYXRoID0gc291cmNlUGF0aDtcbiAgICAgIHBhcmFtcy5zb3VyY2VGdWxsUGF0aCA9IHBhdGhSZXNvbHZlKGN3ZCwgc291cmNlUGF0aCk7XG4gICAgfVxuXG4gICAgaWYodHlwZXNjcmlwdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXJhbXMudXNlVHlwZXNjcmlwdCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYoZW52aXJvbm1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcGFyYW1zLnRhcmdldEVudmlyb25tZW50ID0gZW52aXJvbm1lbnQgPT09ICd3ZWInID8gJ3dlYicgOiAnbm9kZSc7XG4gICAgfVxuXG4gICAgcHJvY2Vzcy5lbnYuTEVYX0NPTkZJRyA9IEpTT04uc3RyaW5naWZ5KFxuICAgICAge1xuICAgICAgICAuLi5MZXhDb25maWcudXBkYXRlQ29uZmlnKHBhcmFtcyksXG4gICAgICAgIGNvbW1hbmROYW1lOiBjbWRbbmFtZVByb3BlcnR5XSxcbiAgICAgICAgaXNTdGF0aWM6IGNtZC5zdGF0aWNcbiAgICAgIH0sIG51bGwsIDBcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIHBhcnNlQ29uZmlnKGNtZCwgaXNSb290OiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHtjbGlOYW1lID0gJ0xleCcsIGxleENvbmZpZywgbGV4Q29uZmlnTmFtZSwgcXVpZXQsIHR5cGVzY3JpcHQsIGRlYnVnID0gZmFsc2V9ID0gY21kO1xuICAgIGNvbnN0IGNvbmZpZ0Zvcm1hdHMgPSBbJ2pzJywgJ21qcycsICdjanMnLCAndHMnLCAnanNvbiddO1xuICAgIGNvbnN0IGNvbmZpZ0Jhc2VOYW1lOiBzdHJpbmcgPSBsZXhDb25maWdOYW1lIHx8ICdsZXguY29uZmlnJztcbiAgICBsZXQgY29uZmlnUGF0aDogc3RyaW5nID0gbGV4Q29uZmlnIHx8ICcnO1xuICAgIGxldCBjb25maWdFeGlzdHM6IGJvb2xlYW4gPSBsZXhDb25maWcgPyBleGlzdHNTeW5jKGNvbmZpZ1BhdGgpIDogZmFsc2U7XG4gICAgXG4gICAgaWYgKCFjb25maWdQYXRoIHx8ICFjb25maWdFeGlzdHMpIHtcbiAgICAgIGlmIChkZWJ1Zykge1xuICAgICAgICBsb2coYFNlYXJjaGluZyBmb3IgY29uZmlnIGZpbGVzIHdpdGggYmFzZSBuYW1lOiAke2NvbmZpZ0Jhc2VOYW1lfWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgfVxuICAgICAgXG4gICAgICBmb3IgKGNvbnN0IGZvcm1hdCBvZiBjb25maWdGb3JtYXRzKSB7XG4gICAgICAgIGNvbnN0IHBvdGVudGlhbFBhdGggPSBpc1Jvb3RcbiAgICAgICAgICA/IHBhdGhSZXNvbHZlKGN3ZCwgYC4vJHtjb25maWdCYXNlTmFtZX0uJHtmb3JtYXR9YClcbiAgICAgICAgICA6IHJlbGF0aXZlRmlsZVBhdGgoYCR7Y29uZmlnQmFzZU5hbWV9LiR7Zm9ybWF0fWAsIGN3ZCk7XG4gICAgICAgICAgXG4gICAgICAgIGlmIChkZWJ1Zykge1xuICAgICAgICAgIGxvZyhgQ2hlY2tpbmcgZm9yIGNvbmZpZyBmaWxlOiAke3BvdGVudGlhbFBhdGh9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChleGlzdHNTeW5jKHBvdGVudGlhbFBhdGgpKSB7XG4gICAgICAgICAgY29uZmlnUGF0aCA9IHBvdGVudGlhbFBhdGg7XG4gICAgICAgICAgY29uZmlnRXhpc3RzID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmKGNvbmZpZ0V4aXN0cykge1xuICAgICAgbG9nKGBVc2luZyAke2NsaU5hbWV9IGNvbmZpZ3VyYXRpb24gZmlsZTogJHtjb25maWdQYXRofWAsICdub3RlJywgcXVpZXQpO1xuICAgICAgY29uc3QgZXh0OiBzdHJpbmcgPSBwYXRoRXh0bmFtZShjb25maWdQYXRoKTtcblxuICAgICAgaWYoZXh0ID09PSAnLmpzb24nKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZ0NvbnRlbnQ6IHN0cmluZyA9IHJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmOCcpO1xuXG4gICAgICAgIGlmKGNvbmZpZ0NvbnRlbnQpIHtcbiAgICAgICAgICBsZXQgY29uZmlnSnNvbjogTGV4Q29uZmlnVHlwZTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25maWdKc29uID0gSlNPTi5wYXJzZShjb25maWdDb250ZW50KT8uZGVmYXVsdCB8fCB7fTtcbiAgICAgICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IEZhaWxlZCB0byBwYXJzZSBKU09OIGNvbmZpZzogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgICAgICAgIGNvbmZpZ0pzb24gPSB7fTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBMZXhDb25maWcuYWRkQ29uZmlnUGFyYW1zKGNtZCwgY29uZmlnSnNvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBDb25maWcgZmlsZSBtYWxmb3JtZWQsICR7Y29uZmlnUGF0aH1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZihbJy5qcycsICcubWpzJywgJy5janMnLCAnLnRzJ10uaW5jbHVkZXMoZXh0KSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGxldCBsZXhDdXN0b21Db25maWc7XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKGV4dCA9PT0gJy5janMnKSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlVXJsID0gbmV3IFVSTChgZmlsZTovLy8ke3BhdGhSZXNvbHZlKGNvbmZpZ1BhdGgpfWApLmhyZWY7XG5cbiAgICAgICAgICAgIGlmIChkZWJ1Zykge1xuICAgICAgICAgICAgICBsb2coYExvYWRpbmcgQ29tbW9uSlMgY29uZmlnIGZyb206ICR7ZmlsZVVybH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxleEN1c3RvbUNvbmZpZyA9IGF3YWl0IGltcG9ydChmaWxlVXJsKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgICAgICAgIGxvZyhgTG9hZGluZyBFU00vVFMgY29uZmlnIGZyb206ICR7Y29uZmlnUGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV4Q3VzdG9tQ29uZmlnID0gYXdhaXQgaW1wb3J0KGNvbmZpZ1BhdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICBjb25zdCBjb25maWcgPSBsZXhDdXN0b21Db25maWcuZGVmYXVsdCB8fCBsZXhDdXN0b21Db25maWc7XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgICAgICBsb2coYExvYWRlZCBjb25maWc6ICR7SlNPTi5zdHJpbmdpZnkoY29uZmlnLCBudWxsLCAyKX1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKCFjb25maWcpIHtcbiAgICAgICAgICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBXYXJuaW5nOiBDb25maWcgZmlsZSBsb2FkZWQgYnV0IG5vIGNvbmZpZ3VyYXRpb24gZm91bmRgLCAnd2FybicsIHF1aWV0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgTGV4Q29uZmlnLmFkZENvbmZpZ1BhcmFtcyhjbWQsIGNvbmZpZyB8fCB7fSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBGYWlsZWQgdG8gbG9hZCBjb25maWcgZmlsZTogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgICAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBDb25maWcgZmlsZSBtdXN0IGJlIGEgSlMsIENKUywgTUpTLCBUUywgb3IgSlNPTiBmaWxlLmAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgIGxvZyhgTm8gY29uZmlnIGZpbGUgZm91bmQuIFVzaW5nIGRlZmF1bHQgY29uZmlndXJhdGlvbi5gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgTGV4Q29uZmlnLnVzZVR5cGVzY3JpcHQgPSAhIXR5cGVzY3JpcHQ7XG4gICAgICBMZXhDb25maWcuYWRkQ29uZmlnUGFyYW1zKGNtZCwgTGV4Q29uZmlnLmNvbmZpZyk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGNoZWNrVHlwZXNjcmlwdENvbmZpZygpIHtcbiAgICBjb25zdCB0c2NvbmZpZ1BhdGg6IHN0cmluZyA9IHBhdGhSZXNvbHZlKGN3ZCwgJy4vdHNjb25maWcuanNvbicpO1xuXG4gICAgaWYoIWV4aXN0c1N5bmModHNjb25maWdQYXRoKSkge1xuICAgICAgY29uc3QgZGlyTmFtZSA9IG5ldyBVUkwoJy4nLCBpbXBvcnQubWV0YS51cmwpLnBhdGhuYW1lO1xuICAgICAgd3JpdGVGaWxlU3luYyh0c2NvbmZpZ1BhdGgsIHJlYWRGaWxlU3luYyhwYXRoUmVzb2x2ZShkaXJOYW1lLCAnLi4vLi4vLi4vdHNjb25maWcuYmFzZS5qc29uJykpKTtcbiAgICB9XG4gIH1cbn0iXSwKICAibWFwcGluZ3MiOiAiQUFJQSxTQUFRLFlBQVksY0FBYyxxQkFBb0I7QUFDdEQsU0FBUSxXQUFXLGFBQWEsV0FBVyxtQkFBa0I7QUFDN0QsU0FBUSxXQUFVO0FBRWxCLFNBQVEsd0JBQXVCO0FBQy9CLFNBQVEsV0FBVTtBQUVsQixNQUFNLE1BQWMsUUFBUSxJQUFJO0FBNER6QixNQUFN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