jsii-docgen
Version:
generates api docs for jsii modules
125 lines • 18.5 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.main = main;
const node_fs_1 = require("node:fs");
const fs = __importStar(require("node:fs/promises"));
const path = __importStar(require("node:path"));
const promises_1 = require("node:stream/promises");
const yargs = __importStar(require("yargs"));
const transpile_1 = require("./docgen/transpile/transpile");
const index_1 = require("./index");
async function generateForLanguage(docs, options) {
const { format, output } = options;
// e.g. API.typescript as name
const splitByLanguage = output.endsWith(`.${options.language.name}`);
const submoduleSuffix = splitByLanguage ? `${options.language.name}.${format}` : format;
// Ensure the output path exists
const outputPath = path.dirname(output);
await fs.mkdir(outputPath, { recursive: true });
if (options.splitBySubmodules) {
if (format !== 'md') {
throw new Error('split-by-submodule is only supported for markdown');
}
const submodules = await docs.listSubmodules();
for (const submodule of submodules) {
const content = await docs.toMarkdown({
...options,
submodule: submodule.fqn,
allSubmodules: false,
header: { title: `\`${(0, transpile_1.submoduleRelName)(submodule)}\` Submodule`, id: submodule.fqn },
});
await fs.writeFile(path.join(outputPath, `${(0, transpile_1.submoduleRelName)(submodule)}.${submoduleSuffix}`), content.render());
}
await fs.writeFile(`${output}.${format}`, await (await docs.toIndexMarkdown(submoduleSuffix, options)).render());
}
else {
const content = await (format === 'md' ? docs.toMarkdown(options) : docs.toJson(options));
await (0, promises_1.pipeline)(content.stream(), (0, node_fs_1.createWriteStream)(`${output}.${format}`));
}
}
async function main() {
const args = await yargs
.usage('Usage: $0')
.option('output', { alias: 'o', type: 'string', required: false, desc: 'Output filename, the file type is automatically added. Defaults to API.md if format is markdown (-f md) or API.json if format is JSON (-f json). If more than one language is passed, then the language will be included in the filename e.g. API.typescript.md' })
.option('format', { alias: 'f', default: 'md', choices: ['md', 'json'], desc: 'Output format, markdown or json' })
.option('language', { array: true, alias: 'l', default: ['typescript'], choices: transpile_1.Language.values().map(x => x.toString()), desc: 'Output language' })
.option('package', { alias: 'p', type: 'string', required: false, desc: 'The name@version of an NPM package to document', defaultDescription: 'The package in the current directory' })
.option('readme', { alias: 'r', type: 'boolean', required: false, desc: 'Include the user defined README.md in the documentation.' })
.option('submodule', { alias: 's', type: 'string', required: false, desc: 'Generate docs for a specific submodule (or "root")' })
.option('split-by-submodule', { type: 'boolean', required: false, desc: 'Generate a separate file for each submodule' })
.example('$0', 'Generate documentation for the current module as a single file (auto-resolves node dependencies)')
.argv;
const submodule = args.submodule === 'root' ? undefined : args.submodule;
const allSubmodules = !args.submodule;
const readme = args.readme;
const splitBySubmodules = args['split-by-submodule'];
const docs = await (args.package
? index_1.Documentation.forPackage(args.package)
: index_1.Documentation.forProject(process.cwd()));
const options = (lang, output = 'API', includeLanguageInOutputName = false) => {
const format = args.format === 'md' ? 'md' : 'json';
// Clean the user provided output of a possible file ending
let outputFileName = output.endsWith(`.${format}`)
? output.slice(0, -(format.length + 1))
: output;
// for multi language docs, include the language in the filename
if (includeLanguageInOutputName) {
outputFileName = `${outputFileName}.${lang}`;
}
return ({
readme,
language: transpile_1.Language.fromString(lang),
submodule,
allSubmodules,
splitBySubmodules,
format,
output: outputFileName,
});
};
if (args.language.length <= 1) {
await generateForLanguage(docs, options(args.language[0], args.output));
}
else {
for (const lang of args.language) {
await generateForLanguage(docs, options(lang, args.output, true));
}
}
}
main().catch(e => {
console.error(e);
process.exit(1);
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXdEQSxvQkFvREM7QUE1R0QscUNBQTRDO0FBQzVDLHFEQUF1QztBQUN2QyxnREFBa0M7QUFDbEMsbURBQWdEO0FBQ2hELDZDQUErQjtBQUMvQiw0REFBMEU7QUFDMUUsbUNBQXdDO0FBWXhDLEtBQUssVUFBVSxtQkFBbUIsQ0FBQyxJQUFtQixFQUFFLE9BQXdCO0lBQzlFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBQ25DLDhCQUE4QjtJQUM5QixNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sZUFBZSxHQUFHLGVBQWUsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBRXhGLGdDQUFnQztJQUNoQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3hDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUVoRCxJQUFJLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzlCLElBQUksTUFBTSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMsbURBQW1ELENBQUMsQ0FBQztRQUN2RSxDQUFDO1FBRUQsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDL0MsS0FBSyxNQUFNLFNBQVMsSUFBSSxVQUFVLEVBQUUs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QUFDO1FBRVgsZ0VBQWdFO1FBQ2hFLElBQUksMkJBQTJCLEVBQUUsQ0FBQztZQUNoQyxjQUFjLEdBQUcsR0FBRyxjQUFjLElBQUksSUFBSSxFQUFFLENBQUM7UUFDL0MsQ0FBQztRQUVELE9BQU8sQ0FBQztZQUNOLE1BQU07WUFDTixRQUFRLEVBQUUsb0JBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO1lBQ25DLFNBQVM7WUFDVCxhQUFhO1lBQ2IsaUJBQWlCO1lBQ2pCLE1BQU07WUFDTixNQUFNLEVBQUUsY0FBYztTQUN2QixDQUFDLENBQUM7SUFDTCxDQUFDLENBQUM7SUFFRixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzlCLE1BQU0sbUJBQW1CLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzFFLENBQUM7U0FBTSxDQUFDO1FBQ04sS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDakMsTUFBTSxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDcEUsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFO0lBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlV3JpdGVTdHJlYW0gfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgcGlwZWxpbmUgfSBmcm9tICdub2RlOnN0cmVhbS9wcm9taXNlcyc7XG5pbXBvcnQgKiBhcyB5YXJncyBmcm9tICd5YXJncyc7XG5pbXBvcnQgeyBMYW5ndWFnZSwgc3VibW9kdWxlUmVsTmFtZSB9IGZyb20gJy4vZG9jZ2VuL3RyYW5zcGlsZS90cmFuc3BpbGUnO1xuaW1wb3J0IHsgRG9jdW1lbnRhdGlvbiB9IGZyb20gJy4vaW5kZXgnO1xuXG50eXBlIEdlbmVyYXRlT3B0aW9ucyA9IHtcbiAgcmVhZG1lPzogYm9vbGVhbjtcbiAgbGFuZ3VhZ2U6IExhbmd1YWdlO1xuICBzdWJtb2R1bGU/OiBzdHJpbmc7XG4gIGFsbFN1Ym1vZHVsZXM/OiBib29sZWFuO1xuICBzcGxpdEJ5U3VibW9kdWxlcz86IGJvb2xlYW47XG4gIGZvcm1hdDogJ21kJyB8ICdqc29uJztcbiAgb3V0cHV0OiBzdHJpbmc7XG59O1xuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUZvckxhbmd1YWdlKGRvY3M6IERvY3VtZW50YXRpb24sIG9wdGlvbnM6IEdlbmVyYXRlT3B0aW9ucykge1xuICBjb25zdCB7IGZvcm1hdCwgb3V0cHV0IH0gPSBvcHRpb25zO1xuICAvLyBlLmcuIEFQSS50eXBlc2NyaXB0IGFzIG5hbWVcbiAgY29uc3Qgc3BsaXRCeUxhbmd1YWdlID0gb3V0cHV0LmVuZHNXaXRoKGAuJHtvcHRpb25zLmxhbmd1YWdlLm5hbWV9YCk7XG4gIGNvbnN0IHN1Ym1vZHVsZVN1ZmZpeCA9IHNwbGl0QnlMYW5ndWFnZSA/IGAke29wdGlvbnMubGFuZ3VhZ2UubmFtZX0uJHtmb3JtYXR9YCA6IGZvcm1hdDtcblxuICAvLyBFbnN1cmUgdGhlIG91dHB1dCBwYXRoIGV4aXN0c1xuICBjb25zdCBvdXRwdXRQYXRoID0gcGF0aC5kaXJuYW1lKG91dHB1dCk7XG4gIGF3YWl0IGZzLm1rZGlyKG91dHB1dFBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGlmIChvcHRpb25zLnNwbGl0QnlTdWJtb2R1bGVzKSB7XG4gICAgaWYgKGZvcm1hdCAhPT0gJ21kJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzcGxpdC1ieS1zdWJtb2R1bGUgaXMgb25seSBzdXBwb3J0ZWQgZm9yIG1hcmtkb3duJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3VibW9kdWxlcyA9IGF3YWl0IGRvY3MubGlzdFN1Ym1vZHVsZXMoKTtcbiAgICBmb3IgKGNvbnN0IHN1Ym1vZHVsZSBvZiBzdWJtb2R1bGVzKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZG9jcy50b01hcmtkb3duKHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgc3VibW9kdWxlOiBzdWJtb2R1bGUuZnFuLFxuICAgICAgICBhbGxTdWJtb2R1bGVzOiBmYWxzZSxcbiAgICAgICAgaGVhZGVyOiB7IHRpdGxlOiBgXFxgJHtzdWJtb2R1bGVSZWxOYW1lKHN1Ym1vZHVsZSl9XFxgIFN1Ym1vZHVsZWAsIGlkOiBzdWJtb2R1bGUuZnFuIH0sXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKHBhdGguam9pbihvdXRwdXRQYXRoLCBgJHtzdWJtb2R1bGVSZWxOYW1lKHN1Ym1vZHVsZSl9LiR7c3VibW9kdWxlU3VmZml4fWApLCBjb250ZW50LnJlbmRlcigpKTtcbiAgICB9XG5cbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoYCR7b3V0cHV0fS4ke2Zvcm1hdH1gLCBhd2FpdCAoYXdhaXQgZG9jcy50b0luZGV4TWFya2Rvd24oc3VibW9kdWxlU3VmZml4LCBvcHRpb25zKSkucmVuZGVyKCkpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCAoZm9ybWF0ID09PSAnbWQnID8gZG9jcy50b01hcmtkb3duKG9wdGlvbnMpIDogZG9jcy50b0pzb24ob3B0aW9ucykpO1xuICAgIGF3YWl0IHBpcGVsaW5lKFxuICAgICAgY29udGVudC5zdHJlYW0oKSxcbiAgICAgIGNyZWF0ZVdyaXRlU3RyZWFtKGAke291dHB1dH0uJHtmb3JtYXR9YCksXG4gICAgKTtcbiAgfVxufVxuXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtYWluKCkge1xuICBjb25zdCBhcmdzID0gYXdhaXQgeWFyZ3NcbiAgICAudXNhZ2UoJ1VzYWdlOiAkMCcpXG4gICAgLm9wdGlvbignb3V0cHV0JywgeyBhbGlhczogJ28nLCB0eXBlOiAnc3RyaW5nJywgcmVxdWlyZWQ6IGZhbHNlLCBkZXNjOiAnT3V0cHV0IGZpbGVuYW1lLCB0aGUgZmlsZSB0eXBlIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQuIERlZmF1bHRzIHRvIEFQSS5tZCBpZiBmb3JtYXQgaXMgbWFya2Rvd24gKC1mIG1kKSBvciBBUEkuanNvbiBpZiBmb3JtYXQgaXMgSlNPTiAoLWYganNvbikuIElmIG1vcmUgdGhhbiBvbmUgbGFuZ3VhZ2UgaXMgcGFzc2VkLCB0aGVuIHRoZSBsYW5ndWFnZSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBmaWxlbmFtZSBlLmcuIEFQSS50eXBlc2NyaXB0Lm1kJyB9KVxuICAgIC5vcHRpb24oJ2Zvcm1hdCcsIHsgYWxpYXM6ICdmJywgZGVmYXVsdDogJ21kJywgY2hvaWNlczogWydtZCcsICdqc29uJ10sIGRlc2M6ICdPdXRwdXQgZm9ybWF0LCBtYXJrZG93biBvciBqc29uJyB9KVxuICAgIC5vcHRpb24oJ2xhbmd1YWdlJywgeyBhcnJheTogdHJ1ZSwgYWxpYXM6ICdsJywgZGVmYXVsdDogWyd0eXBlc2NyaXB0J10sIGNob2ljZXM6IExhbmd1YWdlLnZhbHVlcygpLm1hcCh4ID0+IHgudG9TdHJpbmcoKSksIGRlc2M6ICdPdXRwdXQgbGFuZ3VhZ2UnIH0pXG4gICAgLm9wdGlvbigncGFja2FnZScsIHsgYWxpYXM6ICdwJywgdHlwZTogJ3N0cmluZycsIHJlcXVpcmVkOiBmYWxzZSwgZGVzYzogJ1RoZSBuYW1lQHZlcnNpb24gb2YgYW4gTlBNIHBhY2thZ2UgdG8gZG9jdW1lbnQnLCBkZWZhdWx0RGVzY3JpcHRpb246ICdUaGUgcGFja2FnZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnknIH0pXG4gICAgLm9wdGlvbigncmVhZG1lJywgeyBhbGlhczogJ3InLCB0eXBlOiAnYm9vbGVhbicsIHJlcXVpcmVkOiBmYWxzZSwgZGVzYzogJ0luY2x1ZGUgdGhlIHVzZXIgZGVmaW5lZCBSRUFETUUubWQgaW4gdGhlIGRvY3VtZW50YXRpb24uJyB9KVxuICAgIC5vcHRpb24oJ3N1Ym1vZHVsZScsIHsgYWxpYXM6ICdzJywgdHlwZTogJ3N0cmluZycsIHJlcXVpcmVkOiBmYWxzZSwgZGVzYzogJ0dlbmVyYXRlIGRvY3MgZm9yIGEgc3BlY2lmaWMgc3VibW9kdWxlIChvciBcInJvb3RcIiknIH0pXG4gICAgLm9wdGlvbignc3BsaXQtYnktc3VibW9kdWxlJywgeyB0eXBlOiAnYm9vbGVhbicsIHJlcXVpcmVkOiBmYWxzZSwgZGVzYzogJ0dlbmVyYXRlIGEgc2VwYXJhdGUgZmlsZSBmb3IgZWFjaCBzdWJtb2R1bGUnIH0pXG4gICAgLmV4YW1wbGUoJyQwJywgJ0dlbmVyYXRlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBjdXJyZW50IG1vZHVsZSBhcyBhIHNpbmdsZSBmaWxlIChhdXRvLXJlc29sdmVzIG5vZGUgZGVwZW5kZW5jaWVzKScpXG4gICAgLmFyZ3Y7XG5cbiAgY29uc3Qgc3VibW9kdWxlID0gYXJncy5zdWJtb2R1bGUgPT09ICdyb290JyA/IHVuZGVmaW5lZCA6IGFyZ3Muc3VibW9kdWxlO1xuICBjb25zdCBhbGxTdWJtb2R1bGVzID0gIWFyZ3Muc3VibW9kdWxlO1xuICBjb25zdCByZWFkbWUgPSBhcmdzLnJlYWRtZTtcbiAgY29uc3Qgc3BsaXRCeVN1Ym1vZHVsZXMgPSBhcmdzWydzcGxpdC1ieS1zdWJtb2R1bGUnXTtcbiAgY29uc3QgZG9jcyA9IGF3YWl0IChhcmdzLnBhY2thZ2VcbiAgICA/IERvY3VtZW50YXRpb24uZm9yUGFja2FnZShhcmdzLnBhY2thZ2UpXG4gICAgOiBEb2N1bWVudGF0aW9uLmZvclByb2plY3QocHJvY2Vzcy5jd2QoKSkpO1xuXG4gIGNvbnN0IG9wdGlvbnMgPSAobGFuZzogc3RyaW5nLCBvdXRwdXQ6IHN0cmluZyA9ICdBUEknLCBpbmNsdWRlTGFuZ3VhZ2VJbk91dHB1dE5hbWUgPSBmYWxzZSk6IEdlbmVyYXRlT3B0aW9ucyA9PiB7XG4gICAgY29uc3QgZm9ybWF0ID0gYXJncy5mb3JtYXQgPT09ICdtZCcgPyAnbWQnIDogJ2pzb24nO1xuXG4gICAgLy8gQ2xlYW4gdGhlIHVzZXIgcHJvdmlkZWQgb3V0cHV0IG9mIGEgcG9zc2libGUgZmlsZSBlbmRpbmdcbiAgICBsZXQgb3V0cHV0RmlsZU5hbWUgPSBvdXRwdXQuZW5kc1dpdGgoYC4ke2Zvcm1hdH1gKVxuICAgICAgPyBvdXRwdXQuc2xpY2UoMCwgLShmb3JtYXQubGVuZ3RoICsgMSkpXG4gICAgICA6IG91dHB1dDtcblxuICAgIC8vIGZvciBtdWx0aSBsYW5ndWFnZSBkb2NzLCBpbmNsdWRlIHRoZSBsYW5ndWFnZSBpbiB0aGUgZmlsZW5hbWVcbiAgICBpZiAoaW5jbHVkZUxhbmd1YWdlSW5PdXRwdXROYW1lKSB7XG4gICAgICBvdXRwdXRGaWxlTmFtZSA9IGAke291dHB1dEZpbGVOYW1lfS4ke2xhbmd9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gKHtcbiAgICAgIHJlYWRtZSxcbiAgICAgIGxhbmd1YWdlOiBMYW5ndWFnZS5mcm9tU3RyaW5nKGxhbmcpLFxuICAgICAgc3VibW9kdWxlLFxuICAgICAgYWxsU3VibW9kdWxlcyxcbiAgICAgIHNwbGl0QnlTdWJtb2R1bGVzLFxuICAgICAgZm9ybWF0LFxuICAgICAgb3V0cHV0OiBvdXRwdXRGaWxlTmFtZSxcbiAgICB9KTtcbiAgfTtcblxuICBpZiAoYXJncy5sYW5ndWFnZS5sZW5ndGggPD0gMSkge1xuICAgIGF3YWl0IGdlbmVyYXRlRm9yTGFuZ3VhZ2UoZG9jcywgb3B0aW9ucyhhcmdzLmxhbmd1YWdlWzBdLCBhcmdzLm91dHB1dCkpO1xuICB9IGVsc2Uge1xuICAgIGZvciAoY29uc3QgbGFuZyBvZiBhcmdzLmxhbmd1YWdlKSB7XG4gICAgICBhd2FpdCBnZW5lcmF0ZUZvckxhbmd1YWdlKGRvY3MsIG9wdGlvbnMobGFuZywgYXJncy5vdXRwdXQsIHRydWUpKTtcbiAgICB9XG4gIH1cbn1cblxubWFpbigpLmNhdGNoKGUgPT4ge1xuICBjb25zb2xlLmVycm9yKGUpO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59KTtcblxuIl19