UNPKG

node-swatch-names

Version:

Swatch-names automatically and consistently names Photoshop swatches to be shared among frontend developers and designers. Exports colors to SASS variables and JSON for use in code.

151 lines (115 loc) 18.5 kB
#!/usr/bin/env node 'use strict'; var _path = require('path'); var _chalk = require('chalk'); var _inquirer = require('inquirer'); var _inquirer2 = _interopRequireDefault(_inquirer); var _inquirerAutocompletePrompt = require('inquirer-autocomplete-prompt'); var _inquirerAutocompletePrompt2 = _interopRequireDefault(_inquirerAutocompletePrompt); var _inquirerPath = require('inquirer-path'); var _meow = require('meow'); var _meow2 = _interopRequireDefault(_meow); var _ora = require('ora'); var _ora2 = _interopRequireDefault(_ora); var _lodash = require('lodash'); var _lodash2 = _interopRequireDefault(_lodash); var _prompts = require('./lib/prompts'); var Prompts = _interopRequireWildcard(_prompts); var _swatchNames = require('./lib/swatch-names'); var _io = require('./lib/io'); var _aco = require('./lib/aco'); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } /* eslint-disable no-console */ const cli = (0, _meow2.default)(` Usage $ swatch-names [options] Options --swatch [path] Converts the specified swatch file --output [path] Output file path for the named .aco file --scss [path] Saves SCSS color names to the specified file --js [path] Saves JS color names to the specified file --overwrite Overwrite swatch file Examples $ swatch-names $ swatch-names --swatch swatches.aco $ swatch-names --swatch swatches.aco --scss swatches.scss $ swatch-names --swatch swatches.aco --scss swatches.scss --js swatches.js $ swatch-names --swatch swatches.aco --swatch swatches2.aco --swatch swatches3.aco --scss swatches.scss --js swatches.js `); const noSave = 'Don\'t save.'; const root = process.cwd(); _inquirer2.default.registerPrompt('path', _inquirerPath.PathPrompt); _inquirer2.default.registerPrompt('autocomplete', _inquirerAutocompletePrompt2.default); const convertFile = (input, output, scss, js) => { let processed; return new Promise((resolve, reject) => { (0, _io.readFile)(input).then(data => { processed = (0, _swatchNames.processSwatch)((0, _aco.decode)(data)); return (0, _io.saveFile)((0, _aco.encode)(processed.colors), output, 'Swatch file written to: '); }).then(() => { return scss ? (0, _io.saveFile)(processed.scss, scss, 'SCSS file written to: ') : Promise.resolve(); }).then(() => { return js ? (0, _io.saveFile)(processed.js, js, 'JS file written to: ') : Promise.resolve(); }).then(() => { resolve(); }).catch(() => reject()); }); }; const convertSwatch = (() => { var _ref = _asyncToGenerator(function* (path = root) { const spinner = (0, _ora2.default)(`Scanning ${(0, _chalk.green)(root)} for swatch files (*.aco)...`).start(); const files = yield (0, _io.listFiles)(path); spinner.stop(); if (!files.length) { console.log(_chalk.red.bold('\nNo swatch files found under the current directory.\n')); _inquirer2.default.prompt([Prompts.differentPath, Prompts.newPath(root)]).then(function (answers) { if (answers.newPath) { convertSwatch(answers.newPath); } else { return process.exit(1); } }); } else { // Found some *.aco files, convert one of them _inquirer2.default.prompt([Prompts.swatch(files)]).then(function (answers) { const swatchFile = answers.swatch; _inquirer2.default.prompt([Prompts.overwrite, Prompts.outputPath((0, _path.join)((0, _path.dirname)(swatchFile), (0, _path.basename)(swatchFile, (0, _path.extname)(swatchFile)) + '-named.aco')), Prompts.scssPath(root, noSave), Prompts.jsPath(root, noSave)]).then(function (answers) { const output = answers.overwrite ? swatchFile : answers.outputPath; const scss = answers.scssPath !== noSave ? answers.scssPath : null; const js = answers.jsPath !== noSave ? answers.jsPath : null; return convertFile(swatchFile, (0, _path.relative)(root, output), (0, _path.relative)(root, scss), (0, _path.relative)(root, js)); }); }); } }); return function convertSwatch() { return _ref.apply(this, arguments); }; })(); const swatchNamesCli = flags => { const swatches = flags.swatch; if (swatches) { const scss = flags.scss; const js = flags.js; if (_lodash2.default.isArray(swatches)) { _lodash2.default.forEach(swatches, (swatch, index) => { const swatchFile = (0, _path.relative)(root, (0, _path.resolve)(swatch)); const scssPath = _lodash2.default.isArray(scss) ? scss.length === swatches.length ? scss[index] : scss[0] : scss; const jsPath = _lodash2.default.isArray(js) ? js.length === swatches.length ? js[index] : js[0] : js; const output = flags.overwrite ? swatchFile : flags.output ? flags.output : (0, _path.join)((0, _path.dirname)(swatchFile), (0, _path.basename)(swatchFile, (0, _path.extname)(swatchFile)) + '-named.aco'); convertFile(swatchFile, (0, _path.relative)(root, output), (0, _path.relative)(root, scssPath), (0, _path.relative)(root, jsPath)); }); } else { if (_lodash2.default.isArray(scss) || _lodash2.default.isArray(js)) throw new Error(_chalk.red.bold('Wrong number of output arguments supplied. One swatch file can be converted to one SCSS and one JS file only.')); const swatchFile = (0, _path.relative)(root, (0, _path.resolve)(swatches)); const output = flags.overwrite ? swatchFile : flags.output ? flags.output : (0, _path.join)((0, _path.dirname)(swatchFile), (0, _path.basename)(swatchFile, (0, _path.extname)(swatchFile)) + '-named.aco'); convertFile(swatchFile, output, scss, js); } } else { convertSwatch(); } }; swatchNamesCli(cli.flags); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jbGkuanMiXSwibmFtZXMiOlsiUHJvbXB0cyIsImNsaSIsIm5vU2F2ZSIsInJvb3QiLCJwcm9jZXNzIiwiY3dkIiwicmVnaXN0ZXJQcm9tcHQiLCJjb252ZXJ0RmlsZSIsImlucHV0Iiwib3V0cHV0Iiwic2NzcyIsImpzIiwicHJvY2Vzc2VkIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJ0aGVuIiwiZGF0YSIsImNvbG9ycyIsImNhdGNoIiwiY29udmVydFN3YXRjaCIsInBhdGgiLCJzcGlubmVyIiwic3RhcnQiLCJmaWxlcyIsInN0b3AiLCJsZW5ndGgiLCJjb25zb2xlIiwibG9nIiwiYm9sZCIsInByb21wdCIsImRpZmZlcmVudFBhdGgiLCJuZXdQYXRoIiwiYW5zd2VycyIsImV4aXQiLCJzd2F0Y2giLCJzd2F0Y2hGaWxlIiwib3ZlcndyaXRlIiwib3V0cHV0UGF0aCIsInNjc3NQYXRoIiwianNQYXRoIiwic3dhdGNoTmFtZXNDbGkiLCJmbGFncyIsInN3YXRjaGVzIiwiaXNBcnJheSIsImZvckVhY2giLCJpbmRleCIsIkVycm9yIl0sIm1hcHBpbmdzIjoiOztBQUdBOztBQUNBOztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFFQTs7SUFBWUEsTzs7QUFDWjs7QUFDQTs7QUFDQTs7Ozs7OztBQWRBOztBQWdCQSxNQUFNQyxNQUFNLG9CQUFNOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FBTixDQUFaOztBQW9CQSxNQUFNQyxTQUFTLGNBQWY7QUFDQSxNQUFNQyxPQUFPQyxRQUFRQyxHQUFSLEVBQWI7QUFDQSxtQkFBU0MsY0FBVCxDQUF3QixNQUF4QjtBQUNBLG1CQUFTQSxjQUFULENBQXdCLGNBQXhCOztBQUVBLE1BQU1DLGNBQWMsQ0FBQ0MsS0FBRCxFQUFRQyxNQUFSLEVBQWdCQyxJQUFoQixFQUFzQkMsRUFBdEIsS0FBNkI7O0FBRWhELEtBQUlDLFNBQUo7O0FBRUEsUUFBTyxJQUFJQyxPQUFK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LEVBQWVNLE1BQWYsQ0FBeEIsRUFBZ0Qsb0JBQVNOLElBQVQsRUFBZW9DLFFBQWYsQ0FBaEQsRUFBMEUsb0JBQVNwQyxJQUFULEVBQWVxQyxNQUFmLENBQTFFO0FBQ0EsSUFORDtBQU9BLEdBUkQsTUFRTztBQUNOLE9BQUksaUJBQUVJLE9BQUYsQ0FBVWxDLElBQVYsS0FBbUIsaUJBQUVrQyxPQUFGLENBQVVqQyxFQUFWLENBQXZCLEVBQXNDLE1BQU0sSUFBSW9DLEtBQUosQ0FBVSxXQUFJbEIsSUFBSixDQUFTLCtHQUFULENBQVYsQ0FBTjtBQUN0QyxTQUFNTyxhQUFhLG9CQUFTakMsSUFBVCxFQUFlLG1CQUFRd0MsUUFBUixDQUFmLENBQW5CO0FBQ0EsU0FBTWxDLFNBQVNpQyxNQUFNTCxTQUFOLEdBQWtCRCxVQUFsQixHQUErQk0sTUFBTWpDLE1BQU4sR0FBZWlDLE1BQU1qQyxNQUFyQixHQUE4QixnQkFBSyxtQkFBUTJCLFVBQVIsQ0FBTCxFQUEwQixvQkFBU0EsVUFBVCxFQUFxQixtQkFBUUEsVUFBUixDQUFyQixJQUE0QyxZQUF0RSxDQUE1RTtBQUNBN0IsZUFBWTZCLFVBQVosRUFBd0IzQixNQUF4QixFQUFnQ0MsSUFBaEMsRUFBc0NDLEVBQXRDO0FBQ0E7QUFDRCxFQWxCRCxNQWtCTztBQUNOUztBQUNBO0FBQ0QsQ0F4QkQ7O0FBMEJBcUIsZUFBZXhDLElBQUl5QyxLQUFuQiIsImZpbGUiOiJjbGkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cblxuaW1wb3J0IHtqb2luLCByZWxhdGl2ZSwgYmFzZW5hbWUsIGV4dG5hbWUsIGRpcm5hbWUsIHJlc29sdmV9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHtncmVlbiwgcmVkfSBmcm9tICdjaGFsayc7XG5pbXBvcnQgaW5xdWlyZXIgZnJvbSAnaW5xdWlyZXInO1xuaW1wb3J0IGF1dG9jb21wbGV0ZSBmcm9tICdpbnF1aXJlci1hdXRvY29tcGxldGUtcHJvbXB0JztcbmltcG9ydCB7UGF0aFByb21wdH0gZnJvbSAnaW5xdWlyZXItcGF0aCc7XG5pbXBvcnQgbWVvdyBmcm9tICdtZW93JztcbmltcG9ydCBvcmEgZnJvbSAnb3JhJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5cbmltcG9ydCAqIGFzIFByb21wdHMgZnJvbSAnLi9saWIvcHJvbXB0cyc7XG5pbXBvcnQge3Byb2Nlc3NTd2F0Y2h9IGZyb20gJy4vbGliL3N3YXRjaC1uYW1lcyc7XG5pbXBvcnQge2xpc3RGaWxlcywgcmVhZEZpbGUsIHNhdmVGaWxlfSBmcm9tICcuL2xpYi9pbyc7XG5pbXBvcnQge2RlY29kZSwgZW5jb2RlfSBmcm9tICcuL2xpYi9hY28nO1xuXG5jb25zdCBjbGkgPSBtZW93KGBcblx0VXNhZ2Vcblx0XHQkIHN3YXRjaC1uYW1lcyBbb3B0aW9uc11cblx0XHRcblx0T3B0aW9uc1xuXHRcdC0tc3dhdGNoIFtwYXRoXSBDb252ZXJ0cyB0aGUgc3BlY2lmaWVkIHN3YXRjaCBmaWxlXG5cdFx0LS1vdXRwdXQgW3BhdGhdIE91dHB1dCBmaWxlIHBhdGggZm9yIHRoZSBuYW1lZCAuYWNvIGZpbGVcblx0XHQtLXNjc3MgW3BhdGhdIFNhdmVzIFNDU1MgY29sb3IgbmFtZXMgdG8gdGhlIHNwZWNpZmllZCBmaWxlXG5cdFx0LS1qcyBbcGF0aF0gU2F2ZXMgSlMgY29sb3IgbmFtZXMgdG8gdGhlIHNwZWNpZmllZCBmaWxlXG5cdFx0LS1vdmVyd3JpdGUgT3ZlcndyaXRlIHN3YXRjaCBmaWxlXG5cdFx0XG5cdEV4YW1wbGVzXG5cdFx0JCBzd2F0Y2gtbmFtZXNcblx0XHQkIHN3YXRjaC1uYW1lcyAtLXN3YXRjaCBzd2F0Y2hlcy5hY29cblx0XHQkIHN3YXRjaC1uYW1lcyAtLXN3YXRjaCBzd2F0Y2hlcy5hY28gLS1zY3NzIHN3YXRjaGVzLnNjc3Ncblx0XHQkIHN3YXRjaC1uYW1lcyAtLXN3YXRjaCBzd2F0Y2hlcy5hY28gLS1zY3NzIHN3YXRjaGVzLnNjc3MgLS1qcyBzd2F0Y2hlcy5qc1xuXHRcdCQgc3dhdGNoLW5hbWVzIC0tc3dhdGNoIHN3YXRjaGVzLmFjbyAtLXN3YXRjaCBzd2F0Y2hlczIuYWNvIC0tc3dhdGNoIHN3YXRjaGVzMy5hY28gLS1zY3NzIHN3YXRjaGVzLnNjc3MgLS1qcyBzd2F0Y2hlcy5qc1xuXHRcdFxuYCk7XG5cbmNvbnN0IG5vU2F2ZSA9ICdEb25cXCd0IHNhdmUuJztcbmNvbnN0IHJvb3QgPSBwcm9jZXNzLmN3ZCgpO1xuaW5xdWlyZXIucmVnaXN0ZXJQcm9tcHQoJ3BhdGgnLCBQYXRoUHJvbXB0KTtcbmlucXVpcmVyLnJlZ2lzdGVyUHJvbXB0KCdhdXRvY29tcGxldGUnLCBhdXRvY29tcGxldGUpO1xuXG5jb25zdCBjb252ZXJ0RmlsZSA9IChpbnB1dCwgb3V0cHV0LCBzY3NzLCBqcykgPT4ge1xuXG5cdGxldCBwcm9jZXNzZWQ7XG5cblx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRyZWFkRmlsZShpbnB1dClcblx0XHRcdC50aGVuKChkYXRhKSA9PiB7XG5cdFx0XHRcdHByb2Nlc3NlZCA9IHByb2Nlc3NTd2F0Y2goZGVjb2RlKGRhdGEpKTtcblx0XHRcdFx0cmV0dXJuIHNhdmVGaWxlKGVuY29kZShwcm9jZXNzZWQuY29sb3JzKSwgb3V0cHV0LCAnU3dhdGNoIGZpbGUgd3JpdHRlbiB0bzogJyk7XG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gc2NzcyA/IHNhdmVGaWxlKHByb2Nlc3NlZC5zY3NzLCBzY3NzLCAnU0NTUyBmaWxlIHdyaXR0ZW4gdG86ICcpIDogUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4ganMgPyBzYXZlRmlsZShwcm9jZXNzZWQuanMsIGpzLCAnSlMgZmlsZSB3cml0dGVuIHRvOiAnKSA6IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgoKSA9PiByZWplY3QoKSk7XG5cdH0pO1xufTtcblxuY29uc3QgY29udmVydFN3YXRjaCA9IGFzeW5jIChwYXRoID0gcm9vdCkgPT4ge1xuXHRjb25zdCBzcGlubmVyID0gb3JhKGBTY2FubmluZyAke2dyZWVuKHJvb3QpfSBmb3Igc3dhdGNoIGZpbGVzICgqLmFjbykuLi5gKS5zdGFydCgpO1xuXHRjb25zdCBmaWxlcyA9IGF3YWl0IGxpc3RGaWxlcyhwYXRoKTtcblx0c3Bpbm5lci5zdG9wKCk7XG5cblx0aWYgKCFmaWxlcy5sZW5ndGgpIHtcblx0XHRjb25zb2xlLmxvZyhyZWQuYm9sZCgnXFxuTm8gc3dhdGNoIGZpbGVzIGZvdW5kIHVuZGVyIHRoZSBjdXJyZW50IGRpcmVjdG9yeS5cXG4nKSk7XG5cdFx0aW5xdWlyZXIucHJvbXB0KFtcblx0XHRcdFByb21wdHMuZGlmZmVyZW50UGF0aCxcblx0XHRcdFByb21wdHMubmV3UGF0aChyb290KVxuXHRcdF0pLnRoZW4oKGFuc3dlcnMpID0+IHtcblx0XHRcdGlmIChhbnN3ZXJzLm5ld1BhdGgpIHtcblx0XHRcdFx0Y29udmVydFN3YXRjaChhbnN3ZXJzLm5ld1BhdGgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIHByb2Nlc3MuZXhpdCgxKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHQvLyBGb3VuZCBzb21lICouYWNvIGZpbGVzLCBjb252ZXJ0IG9uZSBvZiB0aGVtXG5cdFx0aW5xdWlyZXIucHJvbXB0KFtcblx0XHRcdFByb21wdHMuc3dhdGNoKGZpbGVzKVxuXHRcdF0pLnRoZW4oKGFuc3dlcnMpID0+IHtcblx0XHRcdGNvbnN0IHN3YXRjaEZpbGUgPSBhbnN3ZXJzLnN3YXRjaDtcblx0XHRcdGlucXVpcmVyLnByb21wdChbXG5cdFx0XHRcdFByb21wdHMub3ZlcndyaXRlLFxuXHRcdFx0XHRQcm9tcHRzLm91dHB1dFBhdGgoam9pbihkaXJuYW1lKHN3YXRjaEZpbGUpLCBiYXNlbmFtZShzd2F0Y2hGaWxlLCBleHRuYW1lKHN3YXRjaEZpbGUpKSArICctbmFtZWQuYWNvJykpLFxuXHRcdFx0XHRQcm9tcHRzLnNjc3NQYXRoKHJvb3QsIG5vU2F2ZSksXG5cdFx0XHRcdFByb21wdHMuanNQYXRoKHJvb3QsIG5vU2F2ZSlcblx0XHRcdF0pLnRoZW4oKGFuc3dlcnMpID0+IHtcblx0XHRcdFx0Y29uc3Qgb3V0cHV0ID0gYW5zd2Vycy5vdmVyd3JpdGUgPyBzd2F0Y2hGaWxlIDogYW5zd2Vycy5vdXRwdXRQYXRoO1xuXHRcdFx0XHRjb25zdCBzY3NzID0gYW5zd2Vycy5zY3NzUGF0aCAhPT0gbm9TYXZlID8gYW5zd2Vycy5zY3NzUGF0aCA6IG51bGw7XG5cdFx0XHRcdGNvbnN0IGpzID0gYW5zd2Vycy5qc1BhdGggIT09IG5vU2F2ZSA/IGFuc3dlcnMuanNQYXRoIDogbnVsbDtcblx0XHRcdFx0cmV0dXJuIGNvbnZlcnRGaWxlKHN3YXRjaEZpbGUsIHJlbGF0aXZlKHJvb3QsIG91dHB1dCksIHJlbGF0aXZlKHJvb3QsIHNjc3MpLCByZWxhdGl2ZShyb290LCBqcykpO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cblxufTtcblxuY29uc3Qgc3dhdGNoTmFtZXNDbGkgPSAoZmxhZ3MpID0+IHtcblx0Y29uc3Qgc3dhdGNoZXMgPSBmbGFncy5zd2F0Y2g7XG5cblx0aWYgKHN3YXRjaGVzKSB7XG5cdFx0Y29uc3Qgc2NzcyA9IGZsYWdzLnNjc3M7XG5cdFx0Y29uc3QganMgPSBmbGFncy5qcztcblxuXHRcdGlmIChfLmlzQXJyYXkoc3dhdGNoZXMpKSB7XG5cdFx0XHRfLmZvckVhY2goc3dhdGNoZXMsIChzd2F0Y2gsIGluZGV4KSA9PiB7XG5cdFx0XHRcdGNvbnN0IHN3YXRjaEZpbGUgPSByZWxhdGl2ZShyb290LCByZXNvbHZlKHN3YXRjaCkpO1xuXHRcdFx0XHRjb25zdCBzY3NzUGF0aCA9IF8uaXNBcnJheShzY3NzKSA/IChzY3NzLmxlbmd0aCA9PT0gc3dhdGNoZXMubGVuZ3RoID8gc2Nzc1tpbmRleF0gOiBzY3NzWzBdKSA6IHNjc3M7XG5cdFx0XHRcdGNvbnN0IGpzUGF0aCA9IF8uaXNBcnJheShqcykgPyAoanMubGVuZ3RoID09PSBzd2F0Y2hlcy5sZW5ndGggPyBqc1tpbmRleF0gOiBqc1swXSkgOiBqcztcblx0XHRcdFx0Y29uc3Qgb3V0cHV0ID0gZmxhZ3Mub3ZlcndyaXRlID8gc3dhdGNoRmlsZSA6IGZsYWdzLm91dHB1dCA/IGZsYWdzLm91dHB1dCA6IGpvaW4oZGlybmFtZShzd2F0Y2hGaWxlKSwgYmFzZW5hbWUoc3dhdGNoRmlsZSwgZXh0bmFtZShzd2F0Y2hGaWxlKSkgKyAnLW5hbWVkLmFjbycpO1xuXHRcdFx0XHRjb252ZXJ0RmlsZShzd2F0Y2hGaWxlLCByZWxhdGl2ZShyb290LCBvdXRwdXQpLCByZWxhdGl2ZShyb290LCBzY3NzUGF0aCksIHJlbGF0aXZlKHJvb3QsIGpzUGF0aCkpO1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmIChfLmlzQXJyYXkoc2NzcykgfHwgXy5pc0FycmF5KGpzKSkgdGhyb3cgbmV3IEVycm9yKHJlZC5ib2xkKCdXcm9uZyBudW1iZXIgb2Ygb3V0cHV0IGFyZ3VtZW50cyBzdXBwbGllZC4gT25lIHN3YXRjaCBmaWxlIGNhbiBiZSBjb252ZXJ0ZWQgdG8gb25lIFNDU1MgYW5kIG9uZSBKUyBmaWxlIG9ubHkuJykpO1xuXHRcdFx0Y29uc3Qgc3dhdGNoRmlsZSA9IHJlbGF0aXZlKHJvb3QsIHJlc29sdmUoc3dhdGNoZXMpKTtcblx0XHRcdGNvbnN0IG91dHB1dCA9IGZsYWdzLm92ZXJ3cml0ZSA/IHN3YXRjaEZpbGUgOiBmbGFncy5vdXRwdXQgPyBmbGFncy5vdXRwdXQgOiBqb2luKGRpcm5hbWUoc3dhdGNoRmlsZSksIGJhc2VuYW1lKHN3YXRjaEZpbGUsIGV4dG5hbWUoc3dhdGNoRmlsZSkpICsgJy1uYW1lZC5hY28nKTtcblx0XHRcdGNvbnZlcnRGaWxlKHN3YXRjaEZpbGUsIG91dHB1dCwgc2NzcywganMpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRjb252ZXJ0U3dhdGNoKCk7XG5cdH1cbn07XG5cbnN3YXRjaE5hbWVzQ2xpKGNsaS5mbGFncyk7XG4iXX0=