UNPKG

parse-my-command

Version:

Parse argv with Commander.js without executing the command

152 lines (148 loc) 19.5 kB
// src/index.ts import camelCase from "camelcase"; import { Command, Option } from "commander"; // src/noop.ts var noop = () => {}; // src/index.ts var commandSettingKeys = [ "_allowExcessArguments", "_allowUnknownOption", "_combineFlagAndOptionalValue", "_defaultCommandName", "_enablePositionalOptions", "_passThroughOptions" ]; var getOrThrow = (map, key) => { const value = map.get(key); if (value === undefined) { throw new Error("Expected map value to be present"); } return value; }; var findMissingOptions = (command, providedOptionsByCommand) => { const missingOptionsByCommand = new Map; let currentCommand = command; while (currentCommand) { const missingOptions = new Set; const providedOptions = providedOptionsByCommand.get(currentCommand); for (const option of currentCommand.options) { const optionName = option.negate ? option.long?.replace(/^--no-/, "") : option.long ?? option.short; if (!optionName) { continue; } const key = camelCase(optionName); if (providedOptions?.[key] !== undefined) { continue; } missingOptions.add(key); } missingOptionsByCommand.set(currentCommand, missingOptions); currentCommand = currentCommand.parent; } return missingOptionsByCommand; }; var copyCommandSettings = (source, target) => { const sourcePrivateState = source; const targetPrivateState = target; for (const key of commandSettingKeys) { targetPrivateState[key] = sourcePrivateState[key]; } target.name(source.name()); target.aliases(source.aliases()); for (const argument of source.registeredArguments) { target.addArgument(argument); } const version = source.version(); if (version) { target.version(version, source.options.find((option) => option.attributeName() === sourcePrivateState._versionOptionName)?.flags); } }; var disableCommandOutput = (command) => { command.configureOutput({ writeOut: noop, writeErr: noop, outputError: noop }); }; var cloneOption = (option) => { const newOption = new Option(option.flags, option.description); newOption.makeOptionMandatory(false); newOption.default(option.defaultValue, option.defaultValueDescription); newOption.preset(option.presetArg); newOption.env(option.envVar); if (option.parseArg) { newOption.argParser(option.parseArg); } if (option.argChoices) { newOption.choices(option.argChoices); } newOption.conflicts(option.conflictsWith); newOption.implied = option.implied; return newOption; }; var partialParse = (command, argv, options) => { const providedOptions = new Map; const providedOptionsSources = new Map; const commandsMap = new Map; let matchedCommand; const setProvidedOptionSource = (command2, optionKey, source) => { if (!source) { return; } const sourcesMap = providedOptionsSources.get(command2) ?? new Map; sourcesMap.set(optionKey, source); providedOptionsSources.set(command2, sourcesMap); }; const createParserCommand = (parserCommand2, command2) => { commandsMap.set(parserCommand2, command2); copyCommandSettings(command2, parserCommand2); disableCommandOutput(parserCommand2); parserCommand2.exitOverride(); for (const option of command2.options) { if (parserCommand2.options.some((parserCommandOption) => parserCommandOption.flags === option.flags)) { continue; } parserCommand2.addOption(cloneOption(option)); } parserCommand2.hook("preSubcommand", (thisCommand, actionCommand) => { for (const cmd of [thisCommand, actionCommand]) { const originalCommand = getOrThrow(commandsMap, cmd); providedOptions.set(originalCommand, cmd.opts()); for (const optionKey of Object.keys(cmd.opts())) { setProvidedOptionSource(originalCommand, optionKey, cmd.getOptionValueSource(optionKey)); } } }); parserCommand2.action(() => { const originalCommand = getOrThrow(commandsMap, parserCommand2); providedOptions.set(originalCommand, parserCommand2.opts()); for (const optionKey of Object.keys(parserCommand2.opts())) { setProvidedOptionSource(originalCommand, optionKey, parserCommand2.getOptionValueSource(optionKey)); } matchedCommand = command2; }); for (const subcommand of command2.commands) { const parserSubcommand = parserCommand2.command(subcommand.name()); createParserCommand(parserSubcommand, subcommand); } return parserCommand2; }; const parserCommand = createParserCommand(new Command, command); parserCommand.parse(argv, options); const missingOptions = matchedCommand ? findMissingOptions(matchedCommand, providedOptions) : new Map; return { matchedCommand, missingOptions, providedOptions, providedOptionsSources }; }; export { partialParse, findMissingOptions }; //# debugId=0F2D30EA8353D1EC64756E2164756E21 //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9ub29wLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImltcG9ydCBjYW1lbENhc2UgZnJvbSBcImNhbWVsY2FzZVwiO1xuaW1wb3J0IHtcbiAgQ29tbWFuZCxcbiAgT3B0aW9uLFxuICB0eXBlIE9wdGlvblZhbHVlU291cmNlLFxuICB0eXBlIE9wdGlvblZhbHVlcyxcbiAgdHlwZSBQYXJzZU9wdGlvbnMsXG59IGZyb20gXCJjb21tYW5kZXJcIjtcbmltcG9ydCB7IG5vb3AgfSBmcm9tIFwiLi9ub29wLmpzXCI7XG5cbmNvbnN0IGNvbW1hbmRTZXR0aW5nS2V5cyA9IFtcbiAgXCJfYWxsb3dFeGNlc3NBcmd1bWVudHNcIixcbiAgXCJfYWxsb3dVbmtub3duT3B0aW9uXCIsXG4gIFwiX2NvbWJpbmVGbGFnQW5kT3B0aW9uYWxWYWx1ZVwiLFxuICBcIl9kZWZhdWx0Q29tbWFuZE5hbWVcIixcbiAgXCJfZW5hYmxlUG9zaXRpb25hbE9wdGlvbnNcIixcbiAgXCJfcGFzc1Rocm91Z2hPcHRpb25zXCIsXG5dIGFzIGNvbnN0O1xuXG50eXBlIENvbW1hbmRTZXR0aW5nS2V5ID0gKHR5cGVvZiBjb21tYW5kU2V0dGluZ0tleXMpW251bWJlcl07XG50eXBlIENvbW1hbmRQcml2YXRlU3RhdGUgPSBDb21tYW5kICZcbiAgUmVjb3JkPENvbW1hbmRTZXR0aW5nS2V5LCB1bmtub3duPiAmIHtcbiAgICBfdmVyc2lvbk9wdGlvbk5hbWU/OiBzdHJpbmc7XG4gIH07XG5cbmNvbnN0IGdldE9yVGhyb3cgPSA8S2V5LCBWYWx1ZT4obWFwOiBNYXA8S2V5LCBWYWx1ZT4sIGtleTogS2V5KTogVmFsdWUgPT4ge1xuICBjb25zdCB2YWx1ZSA9IG1hcC5nZXQoa2V5KTtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBtYXAgdmFsdWUgdG8gYmUgcHJlc2VudFwiKTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbmV4cG9ydCBjb25zdCBmaW5kTWlzc2luZ09wdGlvbnMgPSAoXG4gIGNvbW1hbmQ6IENvbW1hbmQsXG4gIHByb3ZpZGVkT3B0aW9uc0J5Q29tbWFuZDogTWFwPENvbW1hbmQsIE9wdGlvblZhbHVlcz4sXG4pID0+IHtcbiAgY29uc3QgbWlzc2luZ09wdGlvbnNCeUNvbW1hbmQgPSBuZXcgTWFwPENvbW1hbmQsIFNldDxzdHJpbmc+PigpO1xuXG4gIGxldCBjdXJyZW50Q29tbWFuZDogQ29tbWFuZCB8IHVuZGVmaW5lZCB8IG51bGwgPSBjb21tYW5kO1xuXG4gIHdoaWxlIChjdXJyZW50Q29tbWFuZCkge1xuICAgIGNvbnN0IG1pc3NpbmdPcHRpb25zID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgcHJvdmlkZWRPcHRpb25zID0gcHJvdmlkZWRPcHRpb25zQnlDb21tYW5kLmdldChjdXJyZW50Q29tbWFuZCk7XG4gICAgZm9yIChjb25zdCBvcHRpb24gb2YgY3VycmVudENvbW1hbmQub3B0aW9ucykge1xuICAgICAgY29uc3Qgb3B0aW9uTmFtZSA9IG9wdGlvbi5uZWdhdGVcbiAgICAgICAgPyBvcHRpb24ubG9uZz8ucmVwbGFjZSgvXi0tbm8tLywgXCJcIilcbiAgICAgICAgOiAob3B0aW9uLmxvbmcgPz8gb3B0aW9uLnNob3J0KTtcbiAgICAgIGlmICghb3B0aW9uTmFtZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qga2V5ID0gY2FtZWxDYXNlKG9wdGlvbk5hbWUpO1xuXG4gICAgICBpZiAocHJvdmlkZWRPcHRpb25zPy5ba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBtaXNzaW5nT3B0aW9ucy5hZGQoa2V5KTtcbiAgICB9XG5cbiAgICBtaXNzaW5nT3B0aW9uc0J5Q29tbWFuZC5zZXQoY3VycmVudENvbW1hbmQsIG1pc3NpbmdPcHRpb25zKTtcbiAgICBjdXJyZW50Q29tbWFuZCA9IGN1cnJlbnRDb21tYW5kLnBhcmVudDtcbiAgfVxuXG4gIHJldHVybiBtaXNzaW5nT3B0aW9uc0J5Q29tbWFuZDtcbn07XG5cbmV4cG9ydCB0eXBlIFBhcnRpYWxQYXJzZVJlc3VsdCA9IHtcbiAgLyoqXG4gICAqIFRoZSBjb21tYW5kIHdob3NlIGFjdGlvbiB3aWxsIGJlIGV4ZWN1dGVkXG4gICAqL1xuICBtYXRjaGVkQ29tbWFuZDogQ29tbWFuZCB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIEEgbWFwIG9mIGNvbW1hbmRzIHRvIGEgc2V0IG9mIG1pc3Npbmcgb3B0aW9ucyBmb3IgdGhhdCBjb21tYW5kXG4gICAqL1xuICBtaXNzaW5nT3B0aW9uczogTWFwPENvbW1hbmQsIFNldDxzdHJpbmc+PjtcbiAgLyoqXG4gICAqIEEgbWFwIG9mIGNvbW1hbmRzIHRvIHRoZSBvcHRpb25zIHByb3ZpZGVkIGZvciB0aGF0IGNvbW1hbmRcbiAgICovXG4gIHByb3ZpZGVkT3B0aW9uczogTWFwPENvbW1hbmQsIE9wdGlvblZhbHVlcz47XG4gIC8qKlxuICAgKiBBIG1hcCBvZiBjb21tYW5kcyB0byBhIG1hcCBvZiBvcHRpb24ga2V5cyB0byB0aGUgc291cmNlIG9mIHRoZSBvcHRpb24gdmFsdWVcbiAgICovXG4gIHByb3ZpZGVkT3B0aW9uc1NvdXJjZXM6IE1hcDxcbiAgICBDb21tYW5kLFxuICAgIE1hcDxzdHJpbmcsIE9wdGlvblZhbHVlU291cmNlIHwgdW5kZWZpbmVkPlxuICA+O1xufTtcblxuY29uc3QgY29weUNvbW1hbmRTZXR0aW5ncyA9IChzb3VyY2U6IENvbW1hbmQsIHRhcmdldDogQ29tbWFuZCkgPT4ge1xuICBjb25zdCBzb3VyY2VQcml2YXRlU3RhdGUgPSBzb3VyY2UgYXMgQ29tbWFuZFByaXZhdGVTdGF0ZTtcbiAgY29uc3QgdGFyZ2V0UHJpdmF0ZVN0YXRlID0gdGFyZ2V0IGFzIENvbW1hbmRQcml2YXRlU3RhdGU7XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgY29tbWFuZFNldHRpbmdLZXlzKSB7XG4gICAgdGFyZ2V0UHJpdmF0ZVN0YXRlW2tleV0gPSBzb3VyY2VQcml2YXRlU3RhdGVba2V5XTtcbiAgfVxuXG4gIHRhcmdldC5uYW1lKHNvdXJjZS5uYW1lKCkpO1xuICB0YXJnZXQuYWxpYXNlcyhzb3VyY2UuYWxpYXNlcygpKTtcbiAgZm9yIChjb25zdCBhcmd1bWVudCBvZiBzb3VyY2UucmVnaXN0ZXJlZEFyZ3VtZW50cykge1xuICAgIHRhcmdldC5hZGRBcmd1bWVudChhcmd1bWVudCk7XG4gIH1cblxuICBjb25zdCB2ZXJzaW9uID0gc291cmNlLnZlcnNpb24oKTtcbiAgaWYgKHZlcnNpb24pIHtcbiAgICB0YXJnZXQudmVyc2lvbihcbiAgICAgIHZlcnNpb24sXG4gICAgICBzb3VyY2Uub3B0aW9ucy5maW5kKFxuICAgICAgICAob3B0aW9uKSA9PlxuICAgICAgICAgIG9wdGlvbi5hdHRyaWJ1dGVOYW1lKCkgPT09IHNvdXJjZVByaXZhdGVTdGF0ZS5fdmVyc2lvbk9wdGlvbk5hbWUsXG4gICAgICApPy5mbGFncyxcbiAgICApO1xuICB9XG59O1xuXG5jb25zdCBkaXNhYmxlQ29tbWFuZE91dHB1dCA9IChjb21tYW5kOiBDb21tYW5kKSA9PiB7XG4gIGNvbW1hbmQuY29uZmlndXJlT3V0cHV0KHtcbiAgICB3cml0ZU91dDogbm9vcCxcbiAgICB3cml0ZUVycjogbm9vcCxcbiAgICBvdXRwdXRFcnJvcjogbm9vcCxcbiAgfSk7XG59O1xuXG5jb25zdCBjbG9uZU9wdGlvbiA9IChvcHRpb246IE9wdGlvbikgPT4ge1xuICBjb25zdCBuZXdPcHRpb24gPSBuZXcgT3B0aW9uKG9wdGlvbi5mbGFncywgb3B0aW9uLmRlc2NyaXB0aW9uKTtcbiAgbmV3T3B0aW9uLm1ha2VPcHRpb25NYW5kYXRvcnkoZmFsc2UpO1xuICBuZXdPcHRpb24uZGVmYXVsdChvcHRpb24uZGVmYXVsdFZhbHVlLCBvcHRpb24uZGVmYXVsdFZhbHVlRGVzY3JpcHRpb24pO1xuXG4gIG5ld09wdGlvbi5wcmVzZXQoKG9wdGlvbiBhcyBPcHRpb24gJiB7IHByZXNldEFyZzogdW5rbm93biB9KS5wcmVzZXRBcmcpO1xuICBuZXdPcHRpb24uZW52KChvcHRpb24gYXMgT3B0aW9uICYgeyBlbnZWYXI6IHN0cmluZyB9KS5lbnZWYXIpO1xuICBpZiAob3B0aW9uLnBhcnNlQXJnKSB7XG4gICAgbmV3T3B0aW9uLmFyZ1BhcnNlcihvcHRpb24ucGFyc2VBcmcpO1xuICB9XG5cbiAgaWYgKG9wdGlvbi5hcmdDaG9pY2VzKSB7XG4gICAgbmV3T3B0aW9uLmNob2ljZXMob3B0aW9uLmFyZ0Nob2ljZXMpO1xuICB9XG5cbiAgbmV3T3B0aW9uLmNvbmZsaWN0cyhcbiAgICAob3B0aW9uIGFzIE9wdGlvbiAmIHsgY29uZmxpY3RzV2l0aDogc3RyaW5nW10gfSkuY29uZmxpY3RzV2l0aCxcbiAgKTtcblxuICAobmV3T3B0aW9uIGFzIE9wdGlvbiAmIHsgaW1wbGllZDogdW5rbm93biB9KS5pbXBsaWVkID0gKFxuICAgIG9wdGlvbiBhcyBPcHRpb24gJiB7IGltcGxpZWQ6IHVua25vd24gfVxuICApLmltcGxpZWQ7XG5cbiAgcmV0dXJuIG5ld09wdGlvbjtcbn07XG5cbi8qKlxuICogUGFydGlhbGx5IHBhcnNlIGFyZ3YgZm9yIGEgY29tbWFuZCB3aXRob3V0IGV4ZWN1dGluZyB0aGUgYWN0aW9uLiBAc2VlIHtAbGluayBDb21tYW5kLnBhcnNlfVxuICpcbiAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBtYXRjaGVkIGNvbW1hbmQsIHRoZSBwcm92aWRlZCBvcHRpb25zLCBhbmQgdGhlIG1pc3Npbmcgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGNvbnN0IHBhcnRpYWxQYXJzZSA9IChcbiAgY29tbWFuZDogQ29tbWFuZCxcbiAgYXJndjogcmVhZG9ubHkgc3RyaW5nW10sXG4gIG9wdGlvbnM/OiBQYXJzZU9wdGlvbnMsXG4pOiBQYXJ0aWFsUGFyc2VSZXN1bHQgPT4ge1xuICBjb25zdCBwcm92aWRlZE9wdGlvbnMgPSBuZXcgTWFwPENvbW1hbmQsIE9wdGlvblZhbHVlcz4oKTtcbiAgY29uc3QgcHJvdmlkZWRPcHRpb25zU291cmNlcyA9IG5ldyBNYXA8XG4gICAgQ29tbWFuZCxcbiAgICBNYXA8c3RyaW5nLCBPcHRpb25WYWx1ZVNvdXJjZSB8IHVuZGVmaW5lZD5cbiAgPigpO1xuICBjb25zdCBjb21tYW5kc01hcCA9IG5ldyBNYXA8Q29tbWFuZCwgQ29tbWFuZD4oKTtcbiAgbGV0IG1hdGNoZWRDb21tYW5kOiBDb21tYW5kIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHNldFByb3ZpZGVkT3B0aW9uU291cmNlID0gKFxuICAgIGNvbW1hbmQ6IENvbW1hbmQsXG4gICAgb3B0aW9uS2V5OiBzdHJpbmcsXG4gICAgc291cmNlOiBPcHRpb25WYWx1ZVNvdXJjZSB8IHVuZGVmaW5lZCxcbiAgKSA9PiB7XG4gICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzb3VyY2VzTWFwID1cbiAgICAgIHByb3ZpZGVkT3B0aW9uc1NvdXJjZXMuZ2V0KGNvbW1hbmQpID8/XG4gICAgICBuZXcgTWFwPHN0cmluZywgT3B0aW9uVmFsdWVTb3VyY2U+KCk7XG4gICAgc291cmNlc01hcC5zZXQob3B0aW9uS2V5LCBzb3VyY2UpO1xuICAgIHByb3ZpZGVkT3B0aW9uc1NvdXJjZXMuc2V0KGNvbW1hbmQsIHNvdXJjZXNNYXApO1xuICB9O1xuXG4gIGNvbnN0IGNyZWF0ZVBhcnNlckNvbW1hbmQgPSAocGFyc2VyQ29tbWFuZDogQ29tbWFuZCwgY29tbWFuZDogQ29tbWFuZCkgPT4ge1xuICAgIGNvbW1hbmRzTWFwLnNldChwYXJzZXJDb21tYW5kLCBjb21tYW5kKTtcblxuICAgIGNvcHlDb21tYW5kU2V0dGluZ3MoY29tbWFuZCwgcGFyc2VyQ29tbWFuZCk7XG4gICAgZGlzYWJsZUNvbW1hbmRPdXRwdXQocGFyc2VyQ29tbWFuZCk7XG4gICAgcGFyc2VyQ29tbWFuZC5leGl0T3ZlcnJpZGUoKTtcblxuICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIGNvbW1hbmQub3B0aW9ucykge1xuICAgICAgLy8gU2tpcCBhZGRpbmcgdGhlIG9wdGlvbiBpZiBpdCdzIGFscmVhZHkgcmVnaXN0ZXJlZFxuICAgICAgaWYgKFxuICAgICAgICBwYXJzZXJDb21tYW5kLm9wdGlvbnMuc29tZShcbiAgICAgICAgICAocGFyc2VyQ29tbWFuZE9wdGlvbikgPT4gcGFyc2VyQ29tbWFuZE9wdGlvbi5mbGFncyA9PT0gb3B0aW9uLmZsYWdzLFxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHBhcnNlckNvbW1hbmQuYWRkT3B0aW9uKGNsb25lT3B0aW9uKG9wdGlvbikpO1xuICAgIH1cblxuICAgIHBhcnNlckNvbW1hbmQuaG9vayhcInByZVN1YmNvbW1hbmRcIiwgKHRoaXNDb21tYW5kLCBhY3Rpb25Db21tYW5kKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGNtZCBvZiBbdGhpc0NvbW1hbmQsIGFjdGlvbkNvbW1hbmRdKSB7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsQ29tbWFuZCA9IGdldE9yVGhyb3coY29tbWFuZHNNYXAsIGNtZCk7XG4gICAgICAgIHByb3ZpZGVkT3B0aW9ucy5zZXQob3JpZ2luYWxDb21tYW5kLCBjbWQub3B0cygpKTtcblxuICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbktleSBvZiBPYmplY3Qua2V5cyhjbWQub3B0cygpKSkge1xuICAgICAgICAgIHNldFByb3ZpZGVkT3B0aW9uU291cmNlKFxuICAgICAgICAgICAgb3JpZ2luYWxDb21tYW5kLFxuICAgICAgICAgICAgb3B0aW9uS2V5LFxuICAgICAgICAgICAgY21kLmdldE9wdGlvblZhbHVlU291cmNlKG9wdGlvbktleSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcGFyc2VyQ29tbWFuZC5hY3Rpb24oKCkgPT4ge1xuICAgICAgY29uc3Qgb3JpZ2luYWxDb21tYW5kID0gZ2V0T3JUaHJvdyhjb21tYW5kc01hcCwgcGFyc2VyQ29tbWFuZCk7XG4gICAgICBwcm92aWRlZE9wdGlvbnMuc2V0KG9yaWdpbmFsQ29tbWFuZCwgcGFyc2VyQ29tbWFuZC5vcHRzKCkpO1xuXG4gICAgICBmb3IgKGNvbnN0IG9wdGlvbktleSBvZiBPYmplY3Qua2V5cyhwYXJzZXJDb21tYW5kLm9wdHMoKSkpIHtcbiAgICAgICAgc2V0UHJvdmlkZWRPcHRpb25Tb3VyY2UoXG4gICAgICAgICAgb3JpZ2luYWxDb21tYW5kLFxuICAgICAgICAgIG9wdGlvbktleSxcbiAgICAgICAgICBwYXJzZXJDb21tYW5kLmdldE9wdGlvblZhbHVlU291cmNlKG9wdGlvbktleSksXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIG1hdGNoZWRDb21tYW5kID0gY29tbWFuZDtcbiAgICB9KTtcblxuICAgIGZvciAoY29uc3Qgc3ViY29tbWFuZCBvZiBjb21tYW5kLmNvbW1hbmRzIGFzIENvbW1hbmRbXSkge1xuICAgICAgY29uc3QgcGFyc2VyU3ViY29tbWFuZCA9IHBhcnNlckNvbW1hbmQuY29tbWFuZChzdWJjb21tYW5kLm5hbWUoKSk7XG4gICAgICBjcmVhdGVQYXJzZXJDb21tYW5kKHBhcnNlclN1YmNvbW1hbmQsIHN1YmNvbW1hbmQpO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJzZXJDb21tYW5kO1xuICB9O1xuXG4gIGNvbnN0IHBhcnNlckNvbW1hbmQgPSBjcmVhdGVQYXJzZXJDb21tYW5kKG5ldyBDb21tYW5kKCksIGNvbW1hbmQpO1xuICBwYXJzZXJDb21tYW5kLnBhcnNlKGFyZ3YsIG9wdGlvbnMpO1xuXG4gIGNvbnN0IG1pc3NpbmdPcHRpb25zID0gbWF0Y2hlZENvbW1hbmRcbiAgICA/IGZpbmRNaXNzaW5nT3B0aW9ucyhtYXRjaGVkQ29tbWFuZCwgcHJvdmlkZWRPcHRpb25zKVxuICAgIDogbmV3IE1hcDxDb21tYW5kLCBTZXQ8c3RyaW5nPj4oKTtcblxuICByZXR1cm4ge1xuICAgIG1hdGNoZWRDb21tYW5kLFxuICAgIG1pc3NpbmdPcHRpb25zLFxuICAgIHByb3ZpZGVkT3B0aW9ucyxcbiAgICBwcm92aWRlZE9wdGlvbnNTb3VyY2VzLFxuICB9O1xufTtcbiIsCiAgICAiZXhwb3J0IGNvbnN0IG5vb3AgPSAoKSA9PiB7fTtcbiIKICBdLAogICJtYXBwaW5ncyI6ICI7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBOzs7QUNETyxJQUFNLE9BQU8sTUFBTTs7O0FEVTFCLElBQU0scUJBQXFCO0FBQUEsRUFDekI7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGO0FBUUEsSUFBTSxhQUFhLENBQWEsS0FBc0IsUUFBb0I7QUFBQSxFQUN4RSxNQUFNLFFBQVEsSUFBSSxJQUFJLEdBQUc7QUFBQSxFQUN6QixJQUFJLFVBQVUsV0FBVztBQUFBLElBQ3ZCLE1BQU0sSUFBSSxNQUFNLGtDQUFrQztBQUFBLEVBQ3BEO0FBQUEsRUFFQSxPQUFPO0FBQUE7QUFHRixJQUFNLHFCQUFxQixDQUNoQyxTQUNBLDZCQUNHO0FBQUEsRUFDSCxNQUFNLDBCQUEwQixJQUFJO0FBQUEsRUFFcEMsSUFBSSxpQkFBNkM7QUFBQSxFQUVqRCxPQUFPLGdCQUFnQjtBQUFBLElBQ3JCLE1BQU0saUJBQWlCLElBQUk7QUFBQSxJQUMzQixNQUFNLGtCQUFrQix5QkFBeUIsSUFBSSxjQUFjO0FBQUEsSUFDbkUsV0FBVyxVQUFVLGVBQWUsU0FBUztBQUFBLE1BQzNDLE1BQU0sYUFBYSxPQUFPLFNBQ3RCLE9BQU8sTUFBTSxRQUFRLFVBQVUsRUFBRSxJQUNoQyxPQUFPLFFBQVEsT0FBTztBQUFBLE1BQzNCLElBQUksQ0FBQyxZQUFZO0FBQUEsUUFDZjtBQUFBLE1BQ0Y7QUFBQSxNQUVBLE1BQU0sTUFBTSxVQUFVLFVBQVU7QUFBQSxNQUVoQyxJQUFJLGtCQUFrQixTQUFTLFdBQVc7QUFBQSxRQUN4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