@brainfish-ai/devdoc 0.1.32 → 0.1.34

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 (35) hide show
  1. package/ai-agents/.claude/skills/blame-doc/SKILL.md +171 -0
  2. package/ai-agents/.claude/skills/bootstrap-docs/SKILL.md +519 -64
  3. package/ai-agents/.claude/skills/check-docs/SKILL.md +107 -12
  4. package/ai-agents/.claude/skills/commit-doc/SKILL.md +214 -0
  5. package/ai-agents/.claude/skills/create-doc/SKILL.md +198 -0
  6. package/ai-agents/.claude/skills/delete-doc/SKILL.md +164 -0
  7. package/ai-agents/.claude/skills/update-doc/SKILL.md +219 -0
  8. package/ai-agents/.cursor/rules/devdoc-blame.mdc +114 -0
  9. package/ai-agents/.cursor/rules/devdoc-bootstrap.mdc +207 -41
  10. package/ai-agents/.cursor/rules/devdoc-commit.mdc +103 -0
  11. package/ai-agents/.cursor/rules/devdoc-create.mdc +89 -0
  12. package/ai-agents/.cursor/rules/devdoc-delete.mdc +101 -0
  13. package/ai-agents/.cursor/rules/devdoc-update.mdc +95 -0
  14. package/ai-agents/.devdoc/context.json +66 -0
  15. package/ai-agents/.devdoc/templates/api-reference.md +211 -0
  16. package/ai-agents/.devdoc/templates/guide.md +133 -0
  17. package/ai-agents/.devdoc/templates/quickstart.md +179 -0
  18. package/ai-agents/.devdoc/templates/troubleshooting.md +215 -0
  19. package/ai-agents/.devdoc/templates/tutorial.md +212 -0
  20. package/ai-agents/CLAUDE.md +15 -3
  21. package/ai-agents/schemas/context.schema.json +259 -0
  22. package/dist/cli/commands/ai.d.ts +1 -0
  23. package/dist/cli/commands/ai.js +115 -46
  24. package/dist/cli/commands/create.d.ts +12 -0
  25. package/dist/cli/commands/create.js +110 -62
  26. package/dist/cli/commands/init.js +11 -7
  27. package/dist/cli/index.js +4 -2
  28. package/package.json +1 -1
  29. package/renderer/components/docs-viewer/sidebar/index.tsx +118 -87
  30. package/ai-agents/.claude/skills/create-doc-page/SKILL.md +0 -57
  31. package/ai-agents/.claude/skills/docs-from-code/SKILL.md +0 -73
  32. package/ai-agents/.claude/skills/generate-api-docs/SKILL.md +0 -94
  33. package/ai-agents/.claude/skills/sync-docs/SKILL.md +0 -112
  34. package/ai-agents/.claude/skills/update-docs-json/SKILL.md +0 -60
  35. package/ai-agents/.cursor/rules/devdoc-sync.mdc +0 -70
@@ -1,6 +1,7 @@
1
1
  type AITool = 'claude' | 'cursor' | 'both';
2
2
  interface AIOptions {
3
3
  tool?: AITool;
4
+ update?: boolean;
4
5
  }
5
6
  export declare function ai(options: AIOptions): Promise<void>;
6
7
  export {};
@@ -87,19 +87,23 @@ const CLAUDE_SKILLS = [
87
87
  'bootstrap-docs',
88
88
  'migrate-docs',
89
89
  'import-api-spec',
90
- 'sync-docs',
91
90
  'check-docs',
92
- 'create-doc-page',
93
- 'update-docs-json',
94
- 'generate-api-docs',
95
- 'docs-from-code',
91
+ 'blame-doc',
92
+ 'create-doc',
93
+ 'update-doc',
94
+ 'delete-doc',
95
+ 'commit-doc',
96
96
  ];
97
97
  // Cursor rules to create
98
98
  const CURSOR_RULES = [
99
99
  'devdoc.mdc',
100
100
  'devdoc-bootstrap.mdc',
101
101
  'devdoc-migrate.mdc',
102
- 'devdoc-sync.mdc',
102
+ 'devdoc-blame.mdc',
103
+ 'devdoc-create.mdc',
104
+ 'devdoc-update.mdc',
105
+ 'devdoc-delete.mdc',
106
+ 'devdoc-commit.mdc',
103
107
  ];
104
108
  /**
105
109
  * Get the AI agents template directory path (handles both development and installed package scenarios)
@@ -125,27 +129,29 @@ function getTemplateDir() {
125
129
  }
126
130
  /**
127
131
  * Copy CLAUDE.md to project root
132
+ * Returns 'created' | 'updated' | 'skipped'
128
133
  */
129
134
  function copyClaudeMd(projectPath, templateDir) {
130
135
  const sourcePath = path_1.default.join(templateDir, 'CLAUDE.md');
131
136
  const destPath = path_1.default.join(projectPath, 'CLAUDE.md');
132
137
  if (!fs_extra_1.default.existsSync(sourcePath)) {
133
- logger_1.logger.warn('CLAUDE.md template not found');
134
- return false;
138
+ return 'skipped';
135
139
  }
140
+ const existed = fs_extra_1.default.existsSync(destPath);
136
141
  fs_extra_1.default.copySync(sourcePath, destPath);
137
- return true;
142
+ return existed ? 'updated' : 'created';
138
143
  }
139
144
  /**
140
145
  * Copy Claude Code skills to .claude/skills/
146
+ * Returns array of { skill, status: 'created' | 'updated' }
141
147
  */
142
148
  function copyClaudeSkills(projectPath, templateDir) {
143
- const copied = [];
149
+ const results = [];
144
150
  const sourceSkillsDir = path_1.default.join(templateDir, '.claude', 'skills');
145
151
  const destSkillsDir = path_1.default.join(projectPath, '.claude', 'skills');
146
152
  if (!fs_extra_1.default.existsSync(sourceSkillsDir)) {
147
153
  logger_1.logger.warn('Claude skills template directory not found');
148
- return copied;
154
+ return results;
149
155
  }
150
156
  // Ensure destination directory exists
151
157
  fs_extra_1.default.ensureDirSync(destSkillsDir);
@@ -153,22 +159,24 @@ function copyClaudeSkills(projectPath, templateDir) {
153
159
  const sourceDir = path_1.default.join(sourceSkillsDir, skill);
154
160
  const destDir = path_1.default.join(destSkillsDir, skill);
155
161
  if (fs_extra_1.default.existsSync(sourceDir)) {
162
+ const existed = fs_extra_1.default.existsSync(destDir);
156
163
  fs_extra_1.default.copySync(sourceDir, destDir);
157
- copied.push(skill);
164
+ results.push({ skill, status: existed ? 'updated' : 'created' });
158
165
  }
159
166
  }
160
- return copied;
167
+ return results;
161
168
  }
162
169
  /**
163
170
  * Copy Cursor rules to .cursor/rules/
171
+ * Returns array of { rule, status: 'created' | 'updated' }
164
172
  */
165
173
  function copyCursorRules(projectPath, templateDir) {
166
- const copied = [];
174
+ const results = [];
167
175
  const sourceRulesDir = path_1.default.join(templateDir, '.cursor', 'rules');
168
176
  const destRulesDir = path_1.default.join(projectPath, '.cursor', 'rules');
169
177
  if (!fs_extra_1.default.existsSync(sourceRulesDir)) {
170
178
  logger_1.logger.warn('Cursor rules template directory not found');
171
- return copied;
179
+ return results;
172
180
  }
173
181
  // Ensure destination directory exists
174
182
  fs_extra_1.default.ensureDirSync(destRulesDir);
@@ -176,17 +184,36 @@ function copyCursorRules(projectPath, templateDir) {
176
184
  const sourcePath = path_1.default.join(sourceRulesDir, rule);
177
185
  const destPath = path_1.default.join(destRulesDir, rule);
178
186
  if (fs_extra_1.default.existsSync(sourcePath)) {
187
+ const existed = fs_extra_1.default.existsSync(destPath);
179
188
  fs_extra_1.default.copySync(sourcePath, destPath);
180
- copied.push(rule);
189
+ results.push({ rule, status: existed ? 'updated' : 'created' });
181
190
  }
182
191
  }
183
- return copied;
192
+ return results;
193
+ }
194
+ /**
195
+ * Check if AI tools are already installed
196
+ */
197
+ function checkExistingInstallation(projectPath) {
198
+ const claudeDir = path_1.default.join(projectPath, '.claude', 'skills');
199
+ const cursorDir = path_1.default.join(projectPath, '.cursor', 'rules');
200
+ return {
201
+ claude: fs_extra_1.default.existsSync(claudeDir) && fs_extra_1.default.readdirSync(claudeDir).length > 0,
202
+ cursor: fs_extra_1.default.existsSync(cursorDir) && fs_extra_1.default.readdirSync(cursorDir).some(f => f.startsWith('devdoc')),
203
+ };
184
204
  }
185
205
  async function ai(options) {
186
- console.log();
187
- logger_1.logger.info('DevDoc AI Agent Setup');
188
206
  console.log();
189
207
  const projectPath = process.cwd();
208
+ const existing = checkExistingInstallation(projectPath);
209
+ const isUpdate = options.update || existing.claude || existing.cursor;
210
+ if (isUpdate) {
211
+ logger_1.logger.info('DevDoc AI Agent Update');
212
+ }
213
+ else {
214
+ logger_1.logger.info('DevDoc AI Agent Setup');
215
+ }
216
+ console.log();
190
217
  // Check if this is a DevDoc project
191
218
  const docsJsonPath = path_1.default.join(projectPath, 'docs.json');
192
219
  const hasDocsJson = fs_extra_1.default.existsSync(docsJsonPath);
@@ -206,56 +233,94 @@ async function ai(options) {
206
233
  // Get tool selection if not provided
207
234
  let tool = options.tool || 'both';
208
235
  if (!options.tool) {
209
- const toolChoices = [
210
- { value: 'both', label: 'Both - Claude Code and Cursor' },
211
- { value: 'claude', label: 'Claude Code - Skills and CLAUDE.md' },
212
- { value: 'cursor', label: 'Cursor - Rules (.cursor/rules/)' },
213
- ];
214
- tool = await promptSelect('Which AI tool do you use?', toolChoices);
236
+ // If updating, default to updating what's already installed
237
+ if (isUpdate && existing.claude && !existing.cursor) {
238
+ tool = 'claude';
239
+ }
240
+ else if (isUpdate && existing.cursor && !existing.claude) {
241
+ tool = 'cursor';
242
+ }
243
+ else {
244
+ const toolChoices = [
245
+ { value: 'both', label: 'Both - Claude Code and Cursor' },
246
+ { value: 'claude', label: 'Claude Code - Skills and CLAUDE.md' },
247
+ { value: 'cursor', label: 'Cursor - Rules (.cursor/rules/)' },
248
+ ];
249
+ tool = await promptSelect('Which AI tool do you use?', toolChoices);
250
+ }
215
251
  }
216
252
  console.log();
217
- logger_1.logger.info('Setting up AI agent configuration...');
253
+ if (isUpdate) {
254
+ logger_1.logger.info('Updating AI agent configuration...');
255
+ }
256
+ else {
257
+ logger_1.logger.info('Setting up AI agent configuration...');
258
+ }
218
259
  console.log();
219
- const results = {
220
- claudeMd: false,
221
- claudeSkills: [],
222
- cursorRules: [],
223
- };
260
+ let createdCount = 0;
261
+ let updatedCount = 0;
224
262
  // Setup Claude Code
225
263
  if (tool === 'claude' || tool === 'both') {
226
264
  // Copy CLAUDE.md
227
- results.claudeMd = copyClaudeMd(projectPath, templateDir);
228
- if (results.claudeMd) {
265
+ const claudeMdStatus = copyClaudeMd(projectPath, templateDir);
266
+ if (claudeMdStatus === 'created') {
229
267
  logger_1.logger.success('Created CLAUDE.md');
268
+ createdCount++;
269
+ }
270
+ else if (claudeMdStatus === 'updated') {
271
+ logger_1.logger.success('Updated CLAUDE.md');
272
+ updatedCount++;
230
273
  }
231
274
  // Copy skills
232
- results.claudeSkills = copyClaudeSkills(projectPath, templateDir);
233
- for (const skill of results.claudeSkills) {
234
- logger_1.logger.success(`Created .claude/skills/${skill}/SKILL.md`);
275
+ const skillResults = copyClaudeSkills(projectPath, templateDir);
276
+ for (const { skill, status } of skillResults) {
277
+ if (status === 'created') {
278
+ logger_1.logger.success(`Created .claude/skills/${skill}/SKILL.md`);
279
+ createdCount++;
280
+ }
281
+ else {
282
+ logger_1.logger.success(`Updated .claude/skills/${skill}/SKILL.md`);
283
+ updatedCount++;
284
+ }
235
285
  }
236
286
  }
237
287
  // Setup Cursor
238
288
  if (tool === 'cursor' || tool === 'both') {
239
- results.cursorRules = copyCursorRules(projectPath, templateDir);
240
- for (const rule of results.cursorRules) {
241
- logger_1.logger.success(`Created .cursor/rules/${rule}`);
289
+ const ruleResults = copyCursorRules(projectPath, templateDir);
290
+ for (const { rule, status } of ruleResults) {
291
+ if (status === 'created') {
292
+ logger_1.logger.success(`Created .cursor/rules/${rule}`);
293
+ createdCount++;
294
+ }
295
+ else {
296
+ logger_1.logger.success(`Updated .cursor/rules/${rule}`);
297
+ updatedCount++;
298
+ }
242
299
  }
243
300
  }
244
301
  // Summary
245
302
  console.log();
246
- logger_1.logger.success('AI agent configuration complete!');
303
+ if (updatedCount > 0 && createdCount > 0) {
304
+ logger_1.logger.success(`AI agent configuration complete! (${createdCount} created, ${updatedCount} updated)`);
305
+ }
306
+ else if (updatedCount > 0) {
307
+ logger_1.logger.success(`AI agent configuration updated! (${updatedCount} files)`);
308
+ }
309
+ else {
310
+ logger_1.logger.success('AI agent configuration complete!');
311
+ }
247
312
  console.log();
248
313
  if (tool === 'claude' || tool === 'both') {
249
314
  console.log('Available Claude Code commands:');
250
315
  console.log(' /bootstrap-docs - Analyze repo and generate initial documentation');
251
316
  console.log(' /migrate-docs - Migrate from Mintlify, Docusaurus, GitBook, etc.');
252
317
  console.log(' /import-api-spec - Import OpenAPI, GraphQL, or AsyncAPI specs');
253
- console.log(' /sync-docs - Find and fix outdated documentation');
254
318
  console.log(' /check-docs - Quick health check without changes');
255
- console.log(' /create-doc-page - Create a new documentation page');
256
- console.log(' /update-docs-json - Add pages to navigation');
257
- console.log(' /generate-api-docs - Generate API documentation');
258
- console.log(' /docs-from-code - Generate docs from specific code files');
319
+ console.log(' /blame-doc - Find duplicates, outdated content, discrepancies');
320
+ console.log(' /create-doc - Create a new documentation page');
321
+ console.log(' /update-doc - Update existing documentation');
322
+ console.log(' /delete-doc - Delete documentation pages');
323
+ console.log(' /commit-doc - Commit documentation changes');
259
324
  console.log();
260
325
  }
261
326
  if (tool === 'cursor' || tool === 'both') {
@@ -276,5 +341,9 @@ async function ai(options) {
276
341
  console.log(' Cursor: Ask "generate initial documentation from this repo"');
277
342
  }
278
343
  console.log();
344
+ if (isUpdate) {
345
+ console.log('Tip: Restart Claude Code or Cursor to load the updated skills/rules.');
346
+ console.log();
347
+ }
279
348
  }
280
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2xpL2NvbW1hbmRzL2FpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUxBLGdCQTZHQztBQWxTRCxnREFBd0I7QUFDeEIsd0RBQTBCO0FBQzFCLCtDQUE0QztBQVE1QyxzQ0FBc0M7QUFDdEMsS0FBSyxVQUFVLE1BQU0sQ0FBQyxRQUFnQixFQUFFLFlBQXFCO0lBQzNELE1BQU0sUUFBUSxHQUFHLHdEQUFhLFVBQVUsR0FBQyxDQUFDO0lBQzFDLE1BQU0sRUFBRSxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUM7UUFDbEMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1FBQ3BCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtLQUN2QixDQUFDLENBQUM7SUFFSCxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDN0IsTUFBTSxlQUFlLEdBQUcsWUFBWTtZQUNsQyxDQUFDLENBQUMsR0FBRyxRQUFRLEtBQUssWUFBWSxLQUFLO1lBQ25DLENBQUMsQ0FBQyxHQUFHLFFBQVEsSUFBSSxDQUFDO1FBRXBCLEVBQUUsQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDdEMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxZQUFZLElBQUksRUFBRSxDQUFDLENBQUM7UUFDL0MsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxLQUFLLFVBQVUsWUFBWSxDQUFDLFFBQWdCLEVBQUUsT0FBMkM7SUFDdkYsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUM7SUFDL0IsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0s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LENBQUMsMENBQTBDLENBQUMsQ0FBQztRQUN4RCxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7UUFDaEQsT0FBTyxDQUFDLEdBQUcsQ0FBQywwREFBMEQsQ0FBQyxDQUFDO1FBQ3hFLE9BQU8sQ0FBQyxHQUFHLENBQUMsK0NBQStDLENBQUMsQ0FBQztRQUM3RCxPQUFPLENBQUMsR0FBRyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7UUFDdEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO1FBQzNELE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNoQixDQUFDO0lBRUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUM1QixJQUFJLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxLQUFLLE1BQU0sRUFBRSxDQUFDO1FBQ3pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBQ0QsSUFBSSxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUN6QyxPQUFPLENBQUMsR0FBRyxDQUFDLCtEQUErRCxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUNELE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyJztcblxudHlwZSBBSVRvb2wgPSAnY2xhdWRlJyB8ICdjdXJzb3InIHwgJ2JvdGgnO1xuXG5pbnRlcmZhY2UgQUlPcHRpb25zIHtcbiAgdG9vbD86IEFJVG9vbDtcbn1cblxuLy8gU2ltcGxlIHByb21wdCBoZWxwZXIgdXNpbmcgcmVhZGxpbmVcbmFzeW5jIGZ1bmN0aW9uIHByb21wdChxdWVzdGlvbjogc3RyaW5nLCBkZWZhdWx0VmFsdWU/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCByZWFkbGluZSA9IGF3YWl0IGltcG9ydCgncmVhZGxpbmUnKTtcbiAgY29uc3QgcmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2Uoe1xuICAgIGlucHV0OiBwcm9jZXNzLnN0ZGluLFxuICAgIG91dHB1dDogcHJvY2Vzcy5zdGRvdXQsXG4gIH0pO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IGRpc3BsYXlRdWVzdGlvbiA9IGRlZmF1bHRWYWx1ZSBcbiAgICAgID8gYCR7cXVlc3Rpb259ICgke2RlZmF1bHRWYWx1ZX0pOiBgXG4gICAgICA6IGAke3F1ZXN0aW9ufTogYDtcbiAgICBcbiAgICBybC5xdWVzdGlvbihkaXNwbGF5UXVlc3Rpb24sIChhbnN3ZXIpID0+IHtcbiAgICAgIHJsLmNsb3NlKCk7XG4gICAgICByZXNvbHZlKGFuc3dlci50cmltKCkgfHwgZGVmYXVsdFZhbHVlIHx8ICcnKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb21wdFNlbGVjdChxdWVzdGlvbjogc3RyaW5nLCBjaG9pY2VzOiB7IHZhbHVlOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc29sZS5sb2coYFxcbiR7cXVlc3Rpb259XFxuYCk7XG4gIGNob2ljZXMuZm9yRWFjaCgoY2hvaWNlLCBpKSA9PiB7XG4gICAgY29uc29sZS5sb2coYCAgJHtpICsgMX0uICR7Y2hvaWNlLmxhYmVsfWApO1xuICB9KTtcbiAgY29uc29sZS5sb2coKTtcbiAgXG4gIGNvbnN0IHJlYWRsaW5lID0gYXdhaXQgaW1wb3J0KCdyZWFkbGluZScpO1xuICBjb25zdCBybCA9IHJlYWRsaW5lLmNyZWF0ZUludGVyZmFjZSh7XG4gICAgaW5wdXQ6IHByb2Nlc3Muc3RkaW4sXG4gICAgb3V0cHV0OiBwcm9jZXNzLnN0ZG91dCxcbiAgfSk7XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgcmwucXVlc3Rpb24oJ0VudGVyIG51bWJlcjogJywgKGFuc3dlcikgPT4ge1xuICAgICAgcmwuY2xvc2UoKTtcbiAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQoYW5zd2VyLnRyaW0oKSwgMTApIC0gMTtcbiAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgY2hvaWNlcy5sZW5ndGgpIHtcbiAgICAgICAgcmVzb2x2ZShjaG9pY2VzW2luZGV4XS52YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEZWZhdWx0IHRvIGZpcnN0IGNob2ljZVxuICAgICAgICByZXNvbHZlKGNob2ljZXNbMF0udmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuLy8gQ2xhdWRlIENvZGUgc2tpbGxzIHRvIGNyZWF0ZVxuY29uc3QgQ0xBVURFX1NLSUxMUyA9IFtcbiAgJ2Jvb3RzdHJhcC1kb2NzJyxcbiAgJ21pZ3JhdGUtZG9jcycsXG4gICdpbXBvcnQtYXBpLXNwZWMnLFxuICAnc3luYy1kb2NzJyxcbiAgJ2NoZWNrLWRvY3MnLFxuICAnY3JlYXRlLWRvYy1wYWdlJyxcbiAgJ3VwZGF0ZS1kb2NzLWpzb24nLFxuICAnZ2VuZXJhdGUtYXBpLWRvY3MnLFxuICAnZG9jcy1mcm9tLWNvZGUnLFxuXTtcblxuLy8gQ3Vyc29yIHJ1bGVzIHRvIGNyZWF0ZVxuY29uc3QgQ1VSU09SX1JVTEVTID0gW1xuICAnZGV2ZG9jLm1kYycsXG4gICdkZXZkb2MtYm9vdHN0cmFwLm1kYycsXG4gICdkZXZkb2MtbWlncmF0ZS5tZGMnLFxuICAnZGV2ZG9jLXN5bmMubWRjJyxcbl07XG5cbi8qKlxuICogR2V0IHRoZSBBSSBhZ2VudHMgdGVtcGxhdGUgZGlyZWN0b3J5IHBhdGggKGhhbmRsZXMgYm90aCBkZXZlbG9wbWVudCBhbmQgaW5zdGFsbGVkIHBhY2thZ2Ugc2NlbmFyaW9zKVxuICovXG5mdW5jdGlvbiBnZXRUZW1wbGF0ZURpcigpOiBzdHJpbmcge1xuICAvLyBUcnkgcmVsYXRpdmUgdG8gY29tcGlsZWQgZGlzdCAocGFja2FnZXMvZGV2ZG9jL2Rpc3QvY2xpL2NvbW1hbmRzIC0+IHBhY2thZ2VzL2RldmRvYy9haS1hZ2VudHMpXG4gIGxldCB0ZW1wbGF0ZURpciA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICcuLicsICcuLicsICdhaS1hZ2VudHMnKTtcbiAgXG4gIGlmIChmcy5leGlzdHNTeW5jKHRlbXBsYXRlRGlyKSkge1xuICAgIHJldHVybiB0ZW1wbGF0ZURpcjtcbiAgfVxuICBcbiAgLy8gVHJ5IHJlbGF0aXZlIHRvIHNvdXJjZSAocGFja2FnZXMvZGV2ZG9jL3NyYy9jbGkvY29tbWFuZHMgLT4gcGFja2FnZXMvZGV2ZG9jL2FpLWFnZW50cylcbiAgdGVtcGxhdGVEaXIgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nLCAnLi4nLCAnLi4nLCAnYWktYWdlbnRzJyk7XG4gIFxuICBpZiAoZnMuZXhpc3RzU3luYyh0ZW1wbGF0ZURpcikpIHtcbiAgICByZXR1cm4gdGVtcGxhdGVEaXI7XG4gIH1cbiAgXG4gIC8vIFRyeSBkZXZkb2MvdGVtcGxhdGVzIGF0IHJlcG8gcm9vdCAoZGV2ZWxvcG1lbnQgLSBtb25vcmVwbyBzdHJ1Y3R1cmUpXG4gIC8vIF9fZGlybmFtZSBpcyBwYWNrYWdlcy9kZXZkb2MvZGlzdC9jbGkvY29tbWFuZHMgLT4gZ28gdXAgNSBsZXZlbHMgdG8gcmVwbyByb290XG4gIHRlbXBsYXRlRGlyID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJy4uJywgJy4uJywgJy4uJywgJy4uJywgJ2RldmRvYycsICd0ZW1wbGF0ZXMnLCAnc3RhcnRlcicpO1xuICBcbiAgaWYgKGZzLmV4aXN0c1N5bmModGVtcGxhdGVEaXIpKSB7XG4gICAgcmV0dXJuIHRlbXBsYXRlRGlyO1xuICB9XG4gIFxuICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHRlbXBsYXRlIGRpcmVjdG9yeScpO1xufVxuXG4vKipcbiAqIENvcHkgQ0xBVURFLm1kIHRvIHByb2plY3Qgcm9vdFxuICovXG5mdW5jdGlvbiBjb3B5Q2xhdWRlTWQocHJvamVjdFBhdGg6IHN0cmluZywgdGVtcGxhdGVEaXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBzb3VyY2VQYXRoID0gcGF0aC5qb2luKHRlbXBsYXRlRGlyLCAnQ0xBVURFLm1kJyk7XG4gIGNvbnN0IGRlc3RQYXRoID0gcGF0aC5qb2luKHByb2plY3RQYXRoLCAnQ0xBVURFLm1kJyk7XG4gIFxuICBpZiAoIWZzLmV4aXN0c1N5bmMoc291cmNlUGF0aCkpIHtcbiAgICBsb2dnZXIud2FybignQ0xBVURFLm1kIHRlbXBsYXRlIG5vdCBmb3VuZCcpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBcbiAgZnMuY29weVN5bmMoc291cmNlUGF0aCwgZGVzdFBhdGgpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBDb3B5IENsYXVkZSBDb2RlIHNraWxscyB0byAuY2xhdWRlL3NraWxscy9cbiAqL1xuZnVuY3Rpb24gY29weUNsYXVkZVNraWxscyhwcm9qZWN0UGF0aDogc3RyaW5nLCB0ZW1wbGF0ZURpcjogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBjb3BpZWQ6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHNvdXJjZVNraWxsc0RpciA9IHBhdGguam9pbih0ZW1wbGF0ZURpciwgJy5jbGF1ZGUnLCAnc2tpbGxzJyk7XG4gIGNvbnN0IGRlc3RTa2lsbHNEaXIgPSBwYXRoLmpvaW4ocHJvamVjdFBhdGgsICcuY2xhdWRlJywgJ3NraWxscycpO1xuICBcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHNvdXJjZVNraWxsc0RpcikpIHtcbiAgICBsb2dnZXIud2FybignQ2xhdWRlIHNraWxscyB0ZW1wbGF0ZSBkaXJlY3Rvcnkgbm90IGZvdW5kJyk7XG4gICAgcmV0dXJuIGNvcGllZDtcbiAgfVxuICBcbiAgLy8gRW5zdXJlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBleGlzdHNcbiAgZnMuZW5zdXJlRGlyU3luYyhkZXN0U2tpbGxzRGlyKTtcbiAgXG4gIGZvciAoY29uc3Qgc2tpbGwgb2YgQ0xBVURFX1NLSUxMUykge1xuICAgIGNvbnN0IHNvdXJjZURpciA9IHBhdGguam9pbihzb3VyY2VTa2lsbHNEaXIsIHNraWxsKTtcbiAgICBjb25zdCBkZXN0RGlyID0gcGF0aC5qb2luKGRlc3RTa2lsbHNEaXIsIHNraWxsKTtcbiAgICBcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhzb3VyY2VEaXIpKSB7XG4gICAgICBmcy5jb3B5U3luYyhzb3VyY2VEaXIsIGRlc3REaXIpO1xuICAgICAgY29waWVkLnB1c2goc2tpbGwpO1xuICAgIH1cbiAgfVxuICBcbiAgcmV0dXJuIGNvcGllZDtcbn1cblxuLyoqXG4gKiBDb3B5IEN1cnNvciBydWxlcyB0byAuY3Vyc29yL3J1bGVzL1xuICovXG5mdW5jdGlvbiBjb3B5Q3Vyc29yUnVsZXMocHJvamVjdFBhdGg6IHN0cmluZywgdGVtcGxhdGVEaXI6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgY29waWVkOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBzb3VyY2VSdWxlc0RpciA9IHBhdGguam9pbih0ZW1wbGF0ZURpciwgJy5jdXJzb3InLCAncnVsZXMnKTtcbiAgY29uc3QgZGVzdFJ1bGVzRGlyID0gcGF0aC5qb2luKHByb2plY3RQYXRoLCAnLmN1cnNvcicsICdydWxlcycpO1xuICBcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHNvdXJjZVJ1bGVzRGlyKSkge1xuICAgIGxvZ2dlci53YXJuKCdDdXJzb3IgcnVsZXMgdGVtcGxhdGUgZGlyZWN0b3J5IG5vdCBmb3VuZCcpO1xuICAgIHJldHVybiBjb3BpZWQ7XG4gIH1cbiAgXG4gIC8vIEVuc3VyZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgZXhpc3RzXG4gIGZzLmVuc3VyZURpclN5bmMoZGVzdFJ1bGVzRGlyKTtcbiAgXG4gIGZvciAoY29uc3QgcnVsZSBvZiBDVVJTT1JfUlVMRVMpIHtcbiAgICBjb25zdCBzb3VyY2VQYXRoID0gcGF0aC5qb2luKHNvdXJjZVJ1bGVzRGlyLCBydWxlKTtcbiAgICBjb25zdCBkZXN0UGF0aCA9IHBhdGguam9pbihkZXN0UnVsZXNEaXIsIHJ1bGUpO1xuICAgIFxuICAgIGlmIChmcy5leGlzdHNTeW5jKHNvdXJjZVBhdGgpKSB7XG4gICAgICBmcy5jb3B5U3luYyhzb3VyY2VQYXRoLCBkZXN0UGF0aCk7XG4gICAgICBjb3BpZWQucHVzaChydWxlKTtcbiAgICB9XG4gIH1cbiAgXG4gIHJldHVybiBjb3BpZWQ7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhaShvcHRpb25zOiBBSU9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc29sZS5sb2coKTtcbiAgbG9nZ2VyLmluZm8oJ0RldkRvYyBBSSBBZ2VudCBTZXR1cCcpO1xuICBjb25zb2xlLmxvZygpO1xuXG4gIGNvbnN0IHByb2plY3RQYXRoID0gcHJvY2Vzcy5jd2QoKTtcbiAgXG4gIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBEZXZEb2MgcHJvamVjdFxuICBjb25zdCBkb2NzSnNvblBhdGggPSBwYXRoLmpvaW4ocHJvamVjdFBhdGgsICdkb2NzLmpzb24nKTtcbiAgY29uc3QgaGFzRG9jc0pzb24gPSBmcy5leGlzdHNTeW5jKGRvY3NKc29uUGF0aCk7XG4gIFxuICBpZiAoIWhhc0RvY3NKc29uKSB7XG4gICAgbG9nZ2VyLndhcm4oJ05vIGRvY3MuanNvbiBmb3VuZC4gVGhpcyBtYXkgbm90IGJlIGEgRGV2RG9jIHByb2plY3QuJyk7XG4gICAgY29uc29sZS5sb2coKTtcbiAgfVxuXG4gIC8vIEdldCB0ZW1wbGF0ZSBkaXJlY3RvcnlcbiAgbGV0IHRlbXBsYXRlRGlyOiBzdHJpbmc7XG4gIHRyeSB7XG4gICAgdGVtcGxhdGVEaXIgPSBnZXRUZW1wbGF0ZURpcigpO1xuICB9IGNhdGNoIHtcbiAgICBsb2dnZXIuZXJyb3IoJ0NvdWxkIG5vdCBmaW5kIEFJIGFnZW50IHRlbXBsYXRlcy4gUGxlYXNlIGVuc3VyZSBEZXZEb2MgaXMgaW5zdGFsbGVkIGNvcnJlY3RseS4nKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICAvLyBHZXQgdG9vbCBzZWxlY3Rpb24gaWYgbm90IHByb3ZpZGVkXG4gIGxldCB0b29sOiBBSVRvb2wgPSBvcHRpb25zLnRvb2wgfHwgJ2JvdGgnO1xuICBcbiAgaWYgKCFvcHRpb25zLnRvb2wpIHtcbiAgICBjb25zdCB0b29sQ2hvaWNlcyA9IFtcbiAgICAgIHsgdmFsdWU6ICdib3RoJywgbGFiZWw6ICdCb3RoIC0gQ2xhdWRlIENvZGUgYW5kIEN1cnNvcicgfSxcbiAgICAgIHsgdmFsdWU6ICdjbGF1ZGUnLCBsYWJlbDogJ0NsYXVkZSBDb2RlIC0gU2tpbGxzIGFuZCBDTEFVREUubWQnIH0sXG4gICAgICB7IHZhbHVlOiAnY3Vyc29yJywgbGFiZWw6ICdDdXJzb3IgLSBSdWxlcyAoLmN1cnNvci9ydWxlcy8pJyB9LFxuICAgIF07XG5cbiAgICB0b29sID0gYXdhaXQgcHJvbXB0U2VsZWN0KCdXaGljaCBBSSB0b29sIGRvIHlvdSB1c2U/JywgdG9vbENob2ljZXMpIGFzIEFJVG9vbDtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKCk7XG4gIGxvZ2dlci5pbmZvKCdTZXR0aW5nIHVwIEFJIGFnZW50IGNvbmZpZ3VyYXRpb24uLi4nKTtcbiAgY29uc29sZS5sb2coKTtcblxuICBjb25zdCByZXN1bHRzID0ge1xuICAgIGNsYXVkZU1kOiBmYWxzZSxcbiAgICBjbGF1ZGVTa2lsbHM6IFtdIGFzIHN0cmluZ1tdLFxuICAgIGN1cnNvclJ1bGVzOiBbXSBhcyBzdHJpbmdbXSxcbiAgfTtcblxuICAvLyBTZXR1cCBDbGF1ZGUgQ29kZVxuICBpZiAodG9vbCA9PT0gJ2NsYXVkZScgfHwgdG9vbCA9PT0gJ2JvdGgnKSB7XG4gICAgLy8gQ29weSBDTEFVREUubWRcbiAgICByZXN1bHRzLmNsYXVkZU1kID0gY29weUNsYXVkZU1kKHByb2plY3RQYXRoLCB0ZW1wbGF0ZURpcik7XG4gICAgaWYgKHJlc3VsdHMuY2xhdWRlTWQpIHtcbiAgICAgIGxvZ2dlci5zdWNjZXNzKCdDcmVhdGVkIENMQVVERS5tZCcpO1xuICAgIH1cbiAgICBcbiAgICAvLyBDb3B5IHNraWxsc1xuICAgIHJlc3VsdHMuY2xhdWRlU2tpbGxzID0gY29weUNsYXVkZVNraWxscyhwcm9qZWN0UGF0aCwgdGVtcGxhdGVEaXIpO1xuICAgIGZvciAoY29uc3Qgc2tpbGwgb2YgcmVzdWx0cy5jbGF1ZGVTa2lsbHMpIHtcbiAgICAgIGxvZ2dlci5zdWNjZXNzKGBDcmVhdGVkIC5jbGF1ZGUvc2tpbGxzLyR7c2tpbGx9L1NLSUxMLm1kYCk7XG4gICAgfVxuICB9XG5cbiAgLy8gU2V0dXAgQ3Vyc29yXG4gIGlmICh0b29sID09PSAnY3Vyc29yJyB8fCB0b29sID09PSAnYm90aCcpIHtcbiAgICByZXN1bHRzLmN1cnNvclJ1bGVzID0gY29weUN1cnNvclJ1bGVzKHByb2plY3RQYXRoLCB0ZW1wbGF0ZURpcik7XG4gICAgZm9yIChjb25zdCBydWxlIG9mIHJlc3VsdHMuY3Vyc29yUnVsZXMpIHtcbiAgICAgIGxvZ2dlci5zdWNjZXNzKGBDcmVhdGVkIC5jdXJzb3IvcnVsZXMvJHtydWxlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8vIFN1bW1hcnlcbiAgY29uc29sZS5sb2coKTtcbiAgbG9nZ2VyLnN1Y2Nlc3MoJ0FJIGFnZW50IGNvbmZpZ3VyYXRpb24gY29tcGxldGUhJyk7XG4gIGNvbnNvbGUubG9nKCk7XG5cbiAgaWYgKHRvb2wgPT09ICdjbGF1ZGUnIHx8IHRvb2wgPT09ICdib3RoJykge1xuICAgIGNvbnNvbGUubG9nKCdBdmFpbGFibGUgQ2xhdWRlIENvZGUgY29tbWFuZHM6Jyk7XG4gICAgY29uc29sZS5sb2coJyAgL2Jvb3RzdHJhcC1kb2NzICAgIC0gQW5hbHl6ZSByZXBvIGFuZCBnZW5lcmF0ZSBpbml0aWFsIGRvY3VtZW50YXRpb24nKTtcbiAgICBjb25zb2xlLmxvZygnICAvbWlncmF0ZS1kb2NzICAgICAgLSBNaWdyYXRlIGZyb20gTWludGxpZnksIERvY3VzYXVydXMsIEdpdEJvb2ssIGV0Yy4nKTtcbiAgICBjb25zb2xlLmxvZygnICAvaW1wb3J0LWFwaS1zcGVjICAgLSBJbXBvcnQgT3BlbkFQSSwgR3JhcGhRTCwgb3IgQXN5bmNBUEkgc3BlY3MnKTtcbiAgICBjb25zb2xlLmxvZygnICAvc3luYy1kb2NzICAgICAgICAgLSBGaW5kIGFuZCBmaXggb3V0ZGF0ZWQgZG9jdW1lbnRhdGlvbicpO1xuICAgIGNvbnNvbGUubG9nKCcgIC9jaGVjay1kb2NzICAgICAgICAtIFF1aWNrIGhlYWx0aCBjaGVjayB3aXRob3V0IGNoYW5nZXMnKTtcbiAgICBjb25zb2xlLmxvZygnICAvY3JlYXRlLWRvYy1wYWdlICAgLSBDcmVhdGUgYSBuZXcgZG9jdW1lbnRhdGlvbiBwYWdlJyk7XG4gICAgY29uc29sZS5sb2coJyAgL3VwZGF0ZS1kb2NzLWpzb24gIC0gQWRkIHBhZ2VzIHRvIG5hdmlnYXRpb24nKTtcbiAgICBjb25zb2xlLmxvZygnICAvZ2VuZXJhdGUtYXBpLWRvY3MgLSBHZW5lcmF0ZSBBUEkgZG9jdW1lbnRhdGlvbicpO1xuICAgIGNvbnNvbGUubG9nKCcgIC9kb2NzLWZyb20tY29kZSAgICAtIEdlbmVyYXRlIGRvY3MgZnJvbSBzcGVjaWZpYyBjb2RlIGZpbGVzJyk7XG4gICAgY29uc29sZS5sb2coKTtcbiAgfVxuXG4gIGlmICh0b29sID09PSAnY3Vyc29yJyB8fCB0b29sID09PSAnYm90aCcpIHtcbiAgICBjb25zb2xlLmxvZygnQ3Vyc29yIHJ1bGVzIGNvbmZpZ3VyZWQgZm9yICoubWR4IGZpbGVzLicpO1xuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgY29uc29sZS5sb2coJ1N1Z2dlc3RlZCBwcm9tcHRzIGluIEFnZW50IG1vZGU6Jyk7XG4gICAgY29uc29sZS5sb2coJyAgXCJBbmFseXplIHRoaXMgcmVwbyBhbmQgZ2VuZXJhdGUgaW5pdGlhbCBkb2N1bWVudGF0aW9uXCInKTtcbiAgICBjb25zb2xlLmxvZygnICBcIk1pZ3JhdGUgbXkgTWludGxpZnkgZG9jcyB0byBEZXZEb2MgZm9ybWF0XCInKTtcbiAgICBjb25zb2xlLmxvZygnICBcIkNoZWNrIG15IGRvY3MgZm9yIG91dGRhdGVkIGNvbnRlbnRcIicpO1xuICAgIGNvbnNvbGUubG9nKCcgIFwiQ3JlYXRlIGEgbmV3IGd1aWRlIGFib3V0IGF1dGhlbnRpY2F0aW9uXCInKTtcbiAgICBjb25zb2xlLmxvZygpO1xuICB9XG5cbiAgY29uc29sZS5sb2coJ1F1aWNrIHN0YXJ0OicpO1xuICBpZiAodG9vbCA9PT0gJ2NsYXVkZScgfHwgdG9vbCA9PT0gJ2JvdGgnKSB7XG4gICAgY29uc29sZS5sb2coJyAgQ2xhdWRlIENvZGU6IC9ib290c3RyYXAtZG9jcycpO1xuICB9XG4gIGlmICh0b29sID09PSAnY3Vyc29yJyB8fCB0b29sID09PSAnYm90aCcpIHtcbiAgICBjb25zb2xlLmxvZygnICBDdXJzb3I6IEFzayBcImdlbmVyYXRlIGluaXRpYWwgZG9jdW1lbnRhdGlvbiBmcm9tIHRoaXMgcmVwb1wiJyk7XG4gIH1cbiAgY29uc29sZS5sb2coKTtcbn1cbiJdfQ==
349
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2xpL2NvbW1hbmRzL2FpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNE1BLGdCQXVKQztBQW5XRCxnREFBd0I7QUFDeEIsd0RBQTBCO0FBQzFCLCtDQUE0QztBQVM1QyxzQ0FBc0M7QUFDdEMsS0FBSyxVQUFVLE1BQU0sQ0FBQyxRQUFnQixFQUFFLFlBQXFCO0lBQzNELE1BQU0sUUFBUSxHQUFHLHdEQUFhLFVBQVUsR0FBQyxDQUFDO0lBQzFDLE1BQU0sRUFBRSxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUM7UUFDbEMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1FBQ3BCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtLQUN2QixDQUFDLENBQUM7SUFFSCxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDN0IsTUFBTSxlQUFlLEdBQUcsWUFBWTtZQUNsQyxDQUFDLENBQUMsR0FBRyxRQUFRLEtBQUssWUFBWSxLQUFLO1lBQ25DLENBQUMsQ0FBQyxHQUFHLFFBQVEsSUFBSSxDQUFDO1FBRXBCLEVBQUUsQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDdEMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxZQUFZLElBQUksRUFBRSxDQUFDLENBQUM7UUFDL0MsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxLQUFLLFVBQVUsWUFBWSxDQUFDLFFBQWdCLEVBQUUsT0FBMkM7SUFDdkYsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUM7SUFDL0IsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0s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QUksUUFBUSxFQUFFLENBQUM7UUFDYixPQUFPLENBQUMsR0FBRyxDQUFDLHNFQUFzRSxDQUFDLENBQUM7UUFDcEYsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2hCLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyJztcblxudHlwZSBBSVRvb2wgPSAnY2xhdWRlJyB8ICdjdXJzb3InIHwgJ2JvdGgnO1xuXG5pbnRlcmZhY2UgQUlPcHRpb25zIHtcbiAgdG9vbD86IEFJVG9vbDtcbiAgdXBkYXRlPzogYm9vbGVhbjtcbn1cblxuLy8gU2ltcGxlIHByb21wdCBoZWxwZXIgdXNpbmcgcmVhZGxpbmVcbmFzeW5jIGZ1bmN0aW9uIHByb21wdChxdWVzdGlvbjogc3RyaW5nLCBkZWZhdWx0VmFsdWU/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCByZWFkbGluZSA9IGF3YWl0IGltcG9ydCgncmVhZGxpbmUnKTtcbiAgY29uc3QgcmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2Uoe1xuICAgIGlucHV0OiBwcm9jZXNzLnN0ZGluLFxuICAgIG91dHB1dDogcHJvY2Vzcy5zdGRvdXQsXG4gIH0pO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IGRpc3BsYXlRdWVzdGlvbiA9IGRlZmF1bHRWYWx1ZSBcbiAgICAgID8gYCR7cXVlc3Rpb259ICgke2RlZmF1bHRWYWx1ZX0pOiBgXG4gICAgICA6IGAke3F1ZXN0aW9ufTogYDtcbiAgICBcbiAgICBybC5xdWVzdGlvbihkaXNwbGF5UXVlc3Rpb24sIChhbnN3ZXIpID0+IHtcbiAgICAgIHJsLmNsb3NlKCk7XG4gICAgICByZXNvbHZlKGFuc3dlci50cmltKCkgfHwgZGVmYXVsdFZhbHVlIHx8ICcnKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb21wdFNlbGVjdChxdWVzdGlvbjogc3RyaW5nLCBjaG9pY2VzOiB7IHZhbHVlOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc29sZS5sb2coYFxcbiR7cXVlc3Rpb259XFxuYCk7XG4gIGNob2ljZXMuZm9yRWFjaCgoY2hvaWNlLCBpKSA9PiB7XG4gICAgY29uc29sZS5sb2coYCAgJHtpICsgMX0uICR7Y2hvaWNlLmxhYmVsfWApO1xuICB9KTtcbiAgY29uc29sZS5sb2coKTtcbiAgXG4gIGNvbnN0IHJlYWRsaW5lID0gYXdhaXQgaW1wb3J0KCdyZWFkbGluZScpO1xuICBjb25zdCBybCA9IHJlYWRsaW5lLmNyZWF0ZUludGVyZmFjZSh7XG4gICAgaW5wdXQ6IHByb2Nlc3Muc3RkaW4sXG4gICAgb3V0cHV0OiBwcm9jZXNzLnN0ZG91dCxcbiAgfSk7XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgcmwucXVlc3Rpb24oJ0VudGVyIG51bWJlcjogJywgKGFuc3dlcikgPT4ge1xuICAgICAgcmwuY2xvc2UoKTtcbiAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQoYW5zd2VyLnRyaW0oKSwgMTApIC0gMTtcbiAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgY2hvaWNlcy5sZW5ndGgpIHtcbiAgICAgICAgcmVzb2x2ZShjaG9pY2VzW2luZGV4XS52YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEZWZhdWx0IHRvIGZpcnN0IGNob2ljZVxuICAgICAgICByZXNvbHZlKGNob2ljZXNbMF0udmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuLy8gQ2xhdWRlIENvZGUgc2tpbGxzIHRvIGNyZWF0ZVxuY29uc3QgQ0xBVURFX1NLSUxMUyA9IFtcbiAgJ2Jvb3RzdHJhcC1kb2NzJyxcbiAgJ21pZ3JhdGUtZG9jcycsXG4gICdpbXBvcnQtYXBpLXNwZWMnLFxuICAnY2hlY2stZG9jcycsXG4gICdibGFtZS1kb2MnLFxuICAnY3JlYXRlLWRvYycsXG4gICd1cGRhdGUtZG9jJyxcbiAgJ2RlbGV0ZS1kb2MnLFxuICAnY29tbWl0LWRvYycsXG5dO1xuXG4vLyBDdXJzb3IgcnVsZXMgdG8gY3JlYXRlXG5jb25zdCBDVVJTT1JfUlVMRVMgPSBbXG4gICdkZXZkb2MubWRjJyxcbiAgJ2RldmRvYy1ib290c3RyYXAubWRjJyxcbiAgJ2RldmRvYy1taWdyYXRlLm1kYycsXG4gICdkZXZkb2MtYmxhbWUubWRjJyxcbiAgJ2RldmRvYy1jcmVhdGUubWRjJyxcbiAgJ2RldmRvYy11cGRhdGUubWRjJyxcbiAgJ2RldmRvYy1kZWxldGUubWRjJyxcbiAgJ2RldmRvYy1jb21taXQubWRjJyxcbl07XG5cbi8qKlxuICogR2V0IHRoZSBBSSBhZ2VudHMgdGVtcGxhdGUgZGlyZWN0b3J5IHBhdGggKGhhbmRsZXMgYm90aCBkZXZlbG9wbWVudCBhbmQgaW5zdGFsbGVkIHBhY2thZ2Ugc2NlbmFyaW9zKVxuICovXG5mdW5jdGlvbiBnZXRUZW1wbGF0ZURpcigpOiBzdHJpbmcge1xuICAvLyBUcnkgcmVsYXRpdmUgdG8gY29tcGlsZWQgZGlzdCAocGFja2FnZXMvZGV2ZG9jL2Rpc3QvY2xpL2NvbW1hbmRzIC0+IHBhY2thZ2VzL2RldmRvYy9haS1hZ2VudHMpXG4gIGxldCB0ZW1wbGF0ZURpciA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICcuLicsICcuLicsICdhaS1hZ2VudHMnKTtcbiAgXG4gIGlmIChmcy5leGlzdHNTeW5jKHRlbXBsYXRlRGlyKSkge1xuICAgIHJldHVybiB0ZW1wbGF0ZURpcjtcbiAgfVxuICBcbiAgLy8gVHJ5IHJlbGF0aXZlIHRvIHNvdXJjZSAocGFja2FnZXMvZGV2ZG9jL3NyYy9jbGkvY29tbWFuZHMgLT4gcGFja2FnZXMvZGV2ZG9jL2FpLWFnZW50cylcbiAgdGVtcGxhdGVEaXIgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nLCAnLi4nLCAnLi4nLCAnYWktYWdlbnRzJyk7XG4gIFxuICBpZiAoZnMuZXhpc3RzU3luYyh0ZW1wbGF0ZURpcikpIHtcbiAgICByZXR1cm4gdGVtcGxhdGVEaXI7XG4gIH1cbiAgXG4gIC8vIFRyeSBkZXZkb2MvdGVtcGxhdGVzIGF0IHJlcG8gcm9vdCAoZGV2ZWxvcG1lbnQgLSBtb25vcmVwbyBzdHJ1Y3R1cmUpXG4gIC8vIF9fZGlybmFtZSBpcyBwYWNrYWdlcy9kZXZkb2MvZGlzdC9jbGkvY29tbWFuZHMgLT4gZ28gdXAgNSBsZXZlbHMgdG8gcmVwbyByb290XG4gIHRlbXBsYXRlRGlyID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJy4uJywgJy4uJywgJy4uJywgJy4uJywgJ2RldmRvYycsICd0ZW1wbGF0ZXMnLCAnc3RhcnRlcicpO1xuICBcbiAgaWYgKGZzLmV4aXN0c1N5bmModGVtcGxhdGVEaXIpKSB7XG4gICAgcmV0dXJuIHRlbXBsYXRlRGlyO1xuICB9XG4gIFxuICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHRlbXBsYXRlIGRpcmVjdG9yeScpO1xufVxuXG4vKipcbiAqIENvcHkgQ0xBVURFLm1kIHRvIHByb2plY3Qgcm9vdFxuICogUmV0dXJucyAnY3JlYXRlZCcgfCAndXBkYXRlZCcgfCAnc2tpcHBlZCdcbiAqL1xuZnVuY3Rpb24gY29weUNsYXVkZU1kKHByb2plY3RQYXRoOiBzdHJpbmcsIHRlbXBsYXRlRGlyOiBzdHJpbmcpOiAnY3JlYXRlZCcgfCAndXBkYXRlZCcgfCAnc2tpcHBlZCcge1xuICBjb25zdCBzb3VyY2VQYXRoID0gcGF0aC5qb2luKHRlbXBsYXRlRGlyLCAnQ0xBVURFLm1kJyk7XG4gIGNvbnN0IGRlc3RQYXRoID0gcGF0aC5qb2luKHByb2plY3RQYXRoLCAnQ0xBVURFLm1kJyk7XG4gIFxuICBpZiAoIWZzLmV4aXN0c1N5bmMoc291cmNlUGF0aCkpIHtcbiAgICByZXR1cm4gJ3NraXBwZWQnO1xuICB9XG4gIFxuICBjb25zdCBleGlzdGVkID0gZnMuZXhpc3RzU3luYyhkZXN0UGF0aCk7XG4gIGZzLmNvcHlTeW5jKHNvdXJjZVBhdGgsIGRlc3RQYXRoKTtcbiAgcmV0dXJuIGV4aXN0ZWQgPyAndXBkYXRlZCcgOiAnY3JlYXRlZCc7XG59XG5cbi8qKlxuICogQ29weSBDbGF1ZGUgQ29kZSBza2lsbHMgdG8gLmNsYXVkZS9za2lsbHMvXG4gKiBSZXR1cm5zIGFycmF5IG9mIHsgc2tpbGwsIHN0YXR1czogJ2NyZWF0ZWQnIHwgJ3VwZGF0ZWQnIH1cbiAqL1xuZnVuY3Rpb24gY29weUNsYXVkZVNraWxscyhwcm9qZWN0UGF0aDogc3RyaW5nLCB0ZW1wbGF0ZURpcjogc3RyaW5nKTogeyBza2lsbDogc3RyaW5nOyBzdGF0dXM6ICdjcmVhdGVkJyB8ICd1cGRhdGVkJyB9W10ge1xuICBjb25zdCByZXN1bHRzOiB7IHNraWxsOiBzdHJpbmc7IHN0YXR1czogJ2NyZWF0ZWQnIHwgJ3VwZGF0ZWQnIH1bXSA9IFtdO1xuICBjb25zdCBzb3VyY2VTa2lsbHNEaXIgPSBwYXRoLmpvaW4odGVtcGxhdGVEaXIsICcuY2xhdWRlJywgJ3NraWxscycpO1xuICBjb25zdCBkZXN0U2tpbGxzRGlyID0gcGF0aC5qb2luKHByb2plY3RQYXRoLCAnLmNsYXVkZScsICdza2lsbHMnKTtcbiAgXG4gIGlmICghZnMuZXhpc3RzU3luYyhzb3VyY2VTa2lsbHNEaXIpKSB7XG4gICAgbG9nZ2VyLndhcm4oJ0NsYXVkZSBza2lsbHMgdGVtcGxhdGUgZGlyZWN0b3J5IG5vdCBmb3VuZCcpO1xuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG4gIFxuICAvLyBFbnN1cmUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGV4aXN0c1xuICBmcy5lbnN1cmVEaXJTeW5jKGRlc3RTa2lsbHNEaXIpO1xuICBcbiAgZm9yIChjb25zdCBza2lsbCBvZiBDTEFVREVfU0tJTExTKSB7XG4gICAgY29uc3Qgc291cmNlRGlyID0gcGF0aC5qb2luKHNvdXJjZVNraWxsc0Rpciwgc2tpbGwpO1xuICAgIGNvbnN0IGRlc3REaXIgPSBwYXRoLmpvaW4oZGVzdFNraWxsc0Rpciwgc2tpbGwpO1xuICAgIFxuICAgIGlmIChmcy5leGlzdHNTeW5jKHNvdXJjZURpcikpIHtcbiAgICAgIGNvbnN0IGV4aXN0ZWQgPSBmcy5leGlzdHNTeW5jKGRlc3REaXIpO1xuICAgICAgZnMuY29weVN5bmMoc291cmNlRGlyLCBkZXN0RGlyKTtcbiAgICAgIHJlc3VsdHMucHVzaCh7IHNraWxsLCBzdGF0dXM6IGV4aXN0ZWQgPyAndXBkYXRlZCcgOiAnY3JlYXRlZCcgfSk7XG4gICAgfVxuICB9XG4gIFxuICByZXR1cm4gcmVzdWx0cztcbn1cblxuLyoqXG4gKiBDb3B5IEN1cnNvciBydWxlcyB0byAuY3Vyc29yL3J1bGVzL1xuICogUmV0dXJucyBhcnJheSBvZiB7IHJ1bGUsIHN0YXR1czogJ2NyZWF0ZWQnIHwgJ3VwZGF0ZWQnIH1cbiAqL1xuZnVuY3Rpb24gY29weUN1cnNvclJ1bGVzKHByb2plY3RQYXRoOiBzdHJpbmcsIHRlbXBsYXRlRGlyOiBzdHJpbmcpOiB7IHJ1bGU6IHN0cmluZzsgc3RhdHVzOiAnY3JlYXRlZCcgfCAndXBkYXRlZCcgfVtdIHtcbiAgY29uc3QgcmVzdWx0czogeyBydWxlOiBzdHJpbmc7IHN0YXR1czogJ2NyZWF0ZWQnIHwgJ3VwZGF0ZWQnIH1bXSA9IFtdO1xuICBjb25zdCBzb3VyY2VSdWxlc0RpciA9IHBhdGguam9pbih0ZW1wbGF0ZURpciwgJy5jdXJzb3InLCAncnVsZXMnKTtcbiAgY29uc3QgZGVzdFJ1bGVzRGlyID0gcGF0aC5qb2luKHByb2plY3RQYXRoLCAnLmN1cnNvcicsICdydWxlcycpO1xuICBcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHNvdXJjZVJ1bGVzRGlyKSkge1xuICAgIGxvZ2dlci53YXJuKCdDdXJzb3IgcnVsZXMgdGVtcGxhdGUgZGlyZWN0b3J5IG5vdCBmb3VuZCcpO1xuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG4gIFxuICAvLyBFbnN1cmUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGV4aXN0c1xuICBmcy5lbnN1cmVEaXJTeW5jKGRlc3RSdWxlc0Rpcik7XG4gIFxuICBmb3IgKGNvbnN0IHJ1bGUgb2YgQ1VSU09SX1JVTEVTKSB7XG4gICAgY29uc3Qgc291cmNlUGF0aCA9IHBhdGguam9pbihzb3VyY2VSdWxlc0RpciwgcnVsZSk7XG4gICAgY29uc3QgZGVzdFBhdGggPSBwYXRoLmpvaW4oZGVzdFJ1bGVzRGlyLCBydWxlKTtcbiAgICBcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhzb3VyY2VQYXRoKSkge1xuICAgICAgY29uc3QgZXhpc3RlZCA9IGZzLmV4aXN0c1N5bmMoZGVzdFBhdGgpO1xuICAgICAgZnMuY29weVN5bmMoc291cmNlUGF0aCwgZGVzdFBhdGgpO1xuICAgICAgcmVzdWx0cy5wdXNoKHsgcnVsZSwgc3RhdHVzOiBleGlzdGVkID8gJ3VwZGF0ZWQnIDogJ2NyZWF0ZWQnIH0pO1xuICAgIH1cbiAgfVxuICBcbiAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgQUkgdG9vbHMgYXJlIGFscmVhZHkgaW5zdGFsbGVkXG4gKi9cbmZ1bmN0aW9uIGNoZWNrRXhpc3RpbmdJbnN0YWxsYXRpb24ocHJvamVjdFBhdGg6IHN0cmluZyk6IHsgY2xhdWRlOiBib29sZWFuOyBjdXJzb3I6IGJvb2xlYW4gfSB7XG4gIGNvbnN0IGNsYXVkZURpciA9IHBhdGguam9pbihwcm9qZWN0UGF0aCwgJy5jbGF1ZGUnLCAnc2tpbGxzJyk7XG4gIGNvbnN0IGN1cnNvckRpciA9IHBhdGguam9pbihwcm9qZWN0UGF0aCwgJy5jdXJzb3InLCAncnVsZXMnKTtcbiAgXG4gIHJldHVybiB7XG4gICAgY2xhdWRlOiBmcy5leGlzdHNTeW5jKGNsYXVkZURpcikgJiYgZnMucmVhZGRpclN5bmMoY2xhdWRlRGlyKS5sZW5ndGggPiAwLFxuICAgIGN1cnNvcjogZnMuZXhpc3RzU3luYyhjdXJzb3JEaXIpICYmIGZzLnJlYWRkaXJTeW5jKGN1cnNvckRpcikuc29tZShmID0+IGYuc3RhcnRzV2l0aCgnZGV2ZG9jJykpLFxuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWkob3B0aW9uczogQUlPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnNvbGUubG9nKCk7XG4gIFxuICBjb25zdCBwcm9qZWN0UGF0aCA9IHByb2Nlc3MuY3dkKCk7XG4gIGNvbnN0IGV4aXN0aW5nID0gY2hlY2tFeGlzdGluZ0luc3RhbGxhdGlvbihwcm9qZWN0UGF0aCk7XG4gIGNvbnN0IGlzVXBkYXRlID0gb3B0aW9ucy51cGRhdGUgfHwgZXhpc3RpbmcuY2xhdWRlIHx8IGV4aXN0aW5nLmN1cnNvcjtcbiAgXG4gIGlmIChpc1VwZGF0ZSkge1xuICAgIGxvZ2dlci5pbmZvKCdEZXZEb2MgQUkgQWdlbnQgVXBkYXRlJyk7XG4gIH0gZWxzZSB7XG4gICAgbG9nZ2VyLmluZm8oJ0RldkRvYyBBSSBBZ2VudCBTZXR1cCcpO1xuICB9XG4gIGNvbnNvbGUubG9nKCk7XG5cbiAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIERldkRvYyBwcm9qZWN0XG4gIGNvbnN0IGRvY3NKc29uUGF0aCA9IHBhdGguam9pbihwcm9qZWN0UGF0aCwgJ2RvY3MuanNvbicpO1xuICBjb25zdCBoYXNEb2NzSnNvbiA9IGZzLmV4aXN0c1N5bmMoZG9jc0pzb25QYXRoKTtcbiAgXG4gIGlmICghaGFzRG9jc0pzb24pIHtcbiAgICBsb2dnZXIud2FybignTm8gZG9jcy5qc29uIGZvdW5kLiBUaGlzIG1heSBub3QgYmUgYSBEZXZEb2MgcHJvamVjdC4nKTtcbiAgICBjb25zb2xlLmxvZygpO1xuICB9XG5cbiAgLy8gR2V0IHRlbXBsYXRlIGRpcmVjdG9yeVxuICBsZXQgdGVtcGxhdGVEaXI6IHN0cmluZztcbiAgdHJ5IHtcbiAgICB0ZW1wbGF0ZURpciA9IGdldFRlbXBsYXRlRGlyKCk7XG4gIH0gY2F0Y2gge1xuICAgIGxvZ2dlci5lcnJvcignQ291bGQgbm90IGZpbmQgQUkgYWdlbnQgdGVtcGxhdGVzLiBQbGVhc2UgZW5zdXJlIERldkRvYyBpcyBpbnN0YWxsZWQgY29ycmVjdGx5LicpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIC8vIEdldCB0b29sIHNlbGVjdGlvbiBpZiBub3QgcHJvdmlkZWRcbiAgbGV0IHRvb2w6IEFJVG9vbCA9IG9wdGlvbnMudG9vbCB8fCAnYm90aCc7XG4gIFxuICBpZiAoIW9wdGlvbnMudG9vbCkge1xuICAgIC8vIElmIHVwZGF0aW5nLCBkZWZhdWx0IHRvIHVwZGF0aW5nIHdoYXQncyBhbHJlYWR5IGluc3RhbGxlZFxuICAgIGlmIChpc1VwZGF0ZSAmJiBleGlzdGluZy5jbGF1ZGUgJiYgIWV4aXN0aW5nLmN1cnNvcikge1xuICAgICAgdG9vbCA9ICdjbGF1ZGUnO1xuICAgIH0gZWxzZSBpZiAoaXNVcGRhdGUgJiYgZXhpc3RpbmcuY3Vyc29yICYmICFleGlzdGluZy5jbGF1ZGUpIHtcbiAgICAgIHRvb2wgPSAnY3Vyc29yJztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdG9vbENob2ljZXMgPSBbXG4gICAgICAgIHsgdmFsdWU6ICdib3RoJywgbGFiZWw6ICdCb3RoIC0gQ2xhdWRlIENvZGUgYW5kIEN1cnNvcicgfSxcbiAgICAgICAgeyB2YWx1ZTogJ2NsYXVkZScsIGxhYmVsOiAnQ2xhdWRlIENvZGUgLSBTa2lsbHMgYW5kIENMQVVERS5tZCcgfSxcbiAgICAgICAgeyB2YWx1ZTogJ2N1cnNvcicsIGxhYmVsOiAnQ3Vyc29yIC0gUnVsZXMgKC5jdXJzb3IvcnVsZXMvKScgfSxcbiAgICAgIF07XG5cbiAgICAgIHRvb2wgPSBhd2FpdCBwcm9tcHRTZWxlY3QoJ1doaWNoIEFJIHRvb2wgZG8geW91IHVzZT8nLCB0b29sQ2hvaWNlcykgYXMgQUlUb29sO1xuICAgIH1cbiAgfVxuXG4gIGNvbnNvbGUubG9nKCk7XG4gIGlmIChpc1VwZGF0ZSkge1xuICAgIGxvZ2dlci5pbmZvKCdVcGRhdGluZyBBSSBhZ2VudCBjb25maWd1cmF0aW9uLi4uJyk7XG4gIH0gZWxzZSB7XG4gICAgbG9nZ2VyLmluZm8oJ1NldHRpbmcgdXAgQUkgYWdlbnQgY29uZmlndXJhdGlvbi4uLicpO1xuICB9XG4gIGNvbnNvbGUubG9nKCk7XG5cbiAgbGV0IGNyZWF0ZWRDb3VudCA9IDA7XG4gIGxldCB1cGRhdGVkQ291bnQgPSAwO1xuXG4gIC8vIFNldHVwIENsYXVkZSBDb2RlXG4gIGlmICh0b29sID09PSAnY2xhdWRlJyB8fCB0b29sID09PSAnYm90aCcpIHtcbiAgICAvLyBDb3B5IENMQVVERS5tZFxuICAgIGNvbnN0IGNsYXVkZU1kU3RhdHVzID0gY29weUNsYXVkZU1kKHByb2plY3RQYXRoLCB0ZW1wbGF0ZURpcik7XG4gICAgaWYgKGNsYXVkZU1kU3RhdHVzID09PSAnY3JlYXRlZCcpIHtcbiAgICAgIGxvZ2dlci5zdWNjZXNzKCdDcmVhdGVkIENMQVVERS5tZCcpO1xuICAgICAgY3JlYXRlZENvdW50Kys7XG4gICAgfSBlbHNlIGlmIChjbGF1ZGVNZFN0YXR1cyA9PT0gJ3VwZGF0ZWQnKSB7XG4gICAgICBsb2dnZXIuc3VjY2VzcygnVXBkYXRlZCBDTEFVREUubWQnKTtcbiAgICAgIHVwZGF0ZWRDb3VudCsrO1xuICAgIH1cbiAgICBcbiAgICAvLyBDb3B5IHNraWxsc1xuICAgIGNvbnN0IHNraWxsUmVzdWx0cyA9IGNvcHlDbGF1ZGVTa2lsbHMocHJvamVjdFBhdGgsIHRlbXBsYXRlRGlyKTtcbiAgICBmb3IgKGNvbnN0IHsgc2tpbGwsIHN0YXR1cyB9IG9mIHNraWxsUmVzdWx0cykge1xuICAgICAgaWYgKHN0YXR1cyA9PT0gJ2NyZWF0ZWQnKSB7XG4gICAgICAgIGxvZ2dlci5zdWNjZXNzKGBDcmVhdGVkIC5jbGF1ZGUvc2tpbGxzLyR7c2tpbGx9L1NLSUxMLm1kYCk7XG4gICAgICAgIGNyZWF0ZWRDb3VudCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLnN1Y2Nlc3MoYFVwZGF0ZWQgLmNsYXVkZS9za2lsbHMvJHtza2lsbH0vU0tJTEwubWRgKTtcbiAgICAgICAgdXBkYXRlZENvdW50Kys7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gU2V0dXAgQ3Vyc29yXG4gIGlmICh0b29sID09PSAnY3Vyc29yJyB8fCB0b29sID09PSAnYm90aCcpIHtcbiAgICBjb25zdCBydWxlUmVzdWx0cyA9IGNvcHlDdXJzb3JSdWxlcyhwcm9qZWN0UGF0aCwgdGVtcGxhdGVEaXIpO1xuICAgIGZvciAoY29uc3QgeyBydWxlLCBzdGF0dXMgfSBvZiBydWxlUmVzdWx0cykge1xuICAgICAgaWYgKHN0YXR1cyA9PT0gJ2NyZWF0ZWQnKSB7XG4gICAgICAgIGxvZ2dlci5zdWNjZXNzKGBDcmVhdGVkIC5jdXJzb3IvcnVsZXMvJHtydWxlfWApO1xuICAgICAgICBjcmVhdGVkQ291bnQrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5zdWNjZXNzKGBVcGRhdGVkIC5jdXJzb3IvcnVsZXMvJHtydWxlfWApO1xuICAgICAgICB1cGRhdGVkQ291bnQrKztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBTdW1tYXJ5XG4gIGNvbnNvbGUubG9nKCk7XG4gIGlmICh1cGRhdGVkQ291bnQgPiAwICYmIGNyZWF0ZWRDb3VudCA+IDApIHtcbiAgICBsb2dnZXIuc3VjY2VzcyhgQUkgYWdlbnQgY29uZmlndXJhdGlvbiBjb21wbGV0ZSEgKCR7Y3JlYXRlZENvdW50fSBjcmVhdGVkLCAke3VwZGF0ZWRDb3VudH0gdXBkYXRlZClgKTtcbiAgfSBlbHNlIGlmICh1cGRhdGVkQ291bnQgPiAwKSB7XG4gICAgbG9nZ2VyLnN1Y2Nlc3MoYEFJIGFnZW50IGNvbmZpZ3VyYXRpb24gdXBkYXRlZCEgKCR7dXBkYXRlZENvdW50fSBmaWxlcylgKTtcbiAgfSBlbHNlIHtcbiAgICBsb2dnZXIuc3VjY2VzcygnQUkgYWdlbnQgY29uZmlndXJhdGlvbiBjb21wbGV0ZSEnKTtcbiAgfVxuICBjb25zb2xlLmxvZygpO1xuXG4gIGlmICh0b29sID09PSAnY2xhdWRlJyB8fCB0b29sID09PSAnYm90aCcpIHtcbiAgICBjb25zb2xlLmxvZygnQXZhaWxhYmxlIENsYXVkZSBDb2RlIGNvbW1hbmRzOicpO1xuICAgIGNvbnNvbGUubG9nKCcgIC9ib290c3RyYXAtZG9jcyAgICAtIEFuYWx5emUgcmVwbyBhbmQgZ2VuZXJhdGUgaW5pdGlhbCBkb2N1bWVudGF0aW9uJyk7XG4gICAgY29uc29sZS5sb2coJyAgL21pZ3JhdGUtZG9jcyAgICAgIC0gTWlncmF0ZSBmcm9tIE1pbnRsaWZ5LCBEb2N1c2F1cnVzLCBHaXRCb29rLCBldGMuJyk7XG4gICAgY29uc29sZS5sb2coJyAgL2ltcG9ydC1hcGktc3BlYyAgIC0gSW1wb3J0IE9wZW5BUEksIEdyYXBoUUwsIG9yIEFzeW5jQVBJIHNwZWNzJyk7XG4gICAgY29uc29sZS5sb2coJyAgL2NoZWNrLWRvY3MgICAgICAgIC0gUXVpY2sgaGVhbHRoIGNoZWNrIHdpdGhvdXQgY2hhbmdlcycpO1xuICAgIGNvbnNvbGUubG9nKCcgIC9ibGFtZS1kb2MgICAgICAgICAtIEZpbmQgZHVwbGljYXRlcywgb3V0ZGF0ZWQgY29udGVudCwgZGlzY3JlcGFuY2llcycpO1xuICAgIGNvbnNvbGUubG9nKCcgIC9jcmVhdGUtZG9jICAgICAgICAtIENyZWF0ZSBhIG5ldyBkb2N1bWVudGF0aW9uIHBhZ2UnKTtcbiAgICBjb25zb2xlLmxvZygnICAvdXBkYXRlLWRvYyAgICAgICAgLSBVcGRhdGUgZXhpc3RpbmcgZG9jdW1lbnRhdGlvbicpO1xuICAgIGNvbnNvbGUubG9nKCcgIC9kZWxldGUtZG9jICAgICAgICAtIERlbGV0ZSBkb2N1bWVudGF0aW9uIHBhZ2VzJyk7XG4gICAgY29uc29sZS5sb2coJyAgL2NvbW1pdC1kb2MgICAgICAgIC0gQ29tbWl0IGRvY3VtZW50YXRpb24gY2hhbmdlcycpO1xuICAgIGNvbnNvbGUubG9nKCk7XG4gIH1cblxuICBpZiAodG9vbCA9PT0gJ2N1cnNvcicgfHwgdG9vbCA9PT0gJ2JvdGgnKSB7XG4gICAgY29uc29sZS5sb2coJ0N1cnNvciBydWxlcyBjb25maWd1cmVkIGZvciAqLm1keCBmaWxlcy4nKTtcbiAgICBjb25zb2xlLmxvZygpO1xuICAgIGNvbnNvbGUubG9nKCdTdWdnZXN0ZWQgcHJvbXB0cyBpbiBBZ2VudCBtb2RlOicpO1xuICAgIGNvbnNvbGUubG9nKCcgIFwiQW5hbHl6ZSB0aGlzIHJlcG8gYW5kIGdlbmVyYXRlIGluaXRpYWwgZG9jdW1lbnRhdGlvblwiJyk7XG4gICAgY29uc29sZS5sb2coJyAgXCJNaWdyYXRlIG15IE1pbnRsaWZ5IGRvY3MgdG8gRGV2RG9jIGZvcm1hdFwiJyk7XG4gICAgY29uc29sZS5sb2coJyAgXCJDaGVjayBteSBkb2NzIGZvciBvdXRkYXRlZCBjb250ZW50XCInKTtcbiAgICBjb25zb2xlLmxvZygnICBcIkNyZWF0ZSBhIG5ldyBndWlkZSBhYm91dCBhdXRoZW50aWNhdGlvblwiJyk7XG4gICAgY29uc29sZS5sb2coKTtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKCdRdWljayBzdGFydDonKTtcbiAgaWYgKHRvb2wgPT09ICdjbGF1ZGUnIHx8IHRvb2wgPT09ICdib3RoJykge1xuICAgIGNvbnNvbGUubG9nKCcgIENsYXVkZSBDb2RlOiAvYm9vdHN0cmFwLWRvY3MnKTtcbiAgfVxuICBpZiAodG9vbCA9PT0gJ2N1cnNvcicgfHwgdG9vbCA9PT0gJ2JvdGgnKSB7XG4gICAgY29uc29sZS5sb2coJyAgQ3Vyc29yOiBBc2sgXCJnZW5lcmF0ZSBpbml0aWFsIGRvY3VtZW50YXRpb24gZnJvbSB0aGlzIHJlcG9cIicpO1xuICB9XG4gIGNvbnNvbGUubG9nKCk7XG4gIFxuICBpZiAoaXNVcGRhdGUpIHtcbiAgICBjb25zb2xlLmxvZygnVGlwOiBSZXN0YXJ0IENsYXVkZSBDb2RlIG9yIEN1cnNvciB0byBsb2FkIHRoZSB1cGRhdGVkIHNraWxscy9ydWxlcy4nKTtcbiAgICBjb25zb2xlLmxvZygpO1xuICB9XG59XG4iXX0=
@@ -16,8 +16,20 @@ declare const TEMPLATES: {
16
16
  };
17
17
  };
18
18
  type TemplateType = keyof typeof TEMPLATES;
19
+ declare const DOC_TYPES: {
20
+ readonly public: {
21
+ readonly name: "Public";
22
+ readonly description: "User-facing docs with custom subdomain and deployment";
23
+ };
24
+ readonly internal: {
25
+ readonly name: "Internal";
26
+ readonly description: "Developer docs for local/private use (no subdomain needed)";
27
+ };
28
+ };
29
+ type DocType = keyof typeof DOC_TYPES;
19
30
  interface CreateOptions {
20
31
  template?: TemplateType;
32
+ docType?: DocType;
21
33
  git?: boolean;
22
34
  install?: boolean;
23
35
  url?: string;