UNPKG

electron-compile

Version:

Electron supporting package to compile JS and CSS in Electron applications

227 lines (166 loc) 22.3 kB
#!/usr/bin/env node 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.packagerMain = exports.runAsarArchive = exports.packageDirToResourcesDir = undefined; let packageDirToResourcesDir = exports.packageDirToResourcesDir = (() => { var _ref = _asyncToGenerator(function* (packageDir) { let appDir = (yield _promise.pfs.readdir(packageDir)).find(function (x) { return x.match(/\.app$/i); }); if (appDir) { return _path2.default.join(packageDir, appDir, 'Contents', 'Resources', 'app'); } else { return _path2.default.join(packageDir, 'resources', 'app'); } }); return function packageDirToResourcesDir(_x) { return _ref.apply(this, arguments); }; })(); let copySmallFile = (() => { var _ref2 = _asyncToGenerator(function* (from, to) { d(`Copying ${from} => ${to}`); let buf = yield _promise.pfs.readFile(from); yield _promise.pfs.writeFile(to, buf); }); return function copySmallFile(_x2, _x3) { return _ref2.apply(this, arguments); }; })(); let compileAndShim = (() => { var _ref3 = _asyncToGenerator(function* (packageDir) { let appDir = yield packageDirToResourcesDir(packageDir); d(`Looking in ${appDir}`); for (let entry of yield _promise.pfs.readdir(appDir)) { if (entry.match(/^(node_modules|bower_components)$/)) continue; let fullPath = _path2.default.join(appDir, entry); let stat = yield _promise.pfs.stat(fullPath); if (!stat.isDirectory()) continue; d(`Executing electron-compile: ${appDir} => ${entry}`); yield (0, _cli.main)(appDir, [fullPath]); } d('Copying in es6-shim'); let packageJson = JSON.parse((yield _promise.pfs.readFile(_path2.default.join(appDir, 'package.json'), 'utf8'))); let index = packageJson.main || 'index.js'; packageJson.originalMain = index; packageJson.main = 'es6-shim.js'; yield copySmallFile(_path2.default.join(__dirname, 'es6-shim.js'), _path2.default.join(appDir, 'es6-shim.js')); yield _promise.pfs.writeFile(_path2.default.join(appDir, 'package.json'), JSON.stringify(packageJson, null, 2)); }); return function compileAndShim(_x4) { return _ref3.apply(this, arguments); }; })(); let runAsarArchive = exports.runAsarArchive = (() => { var _ref4 = _asyncToGenerator(function* (packageDir, asarUnpackDir) { let appDir = yield packageDirToResourcesDir(packageDir); let asarArgs = ['pack', 'app', 'app.asar']; if (asarUnpackDir) { asarArgs.push('--unpack-dir', asarUnpackDir); } var _findExecutableOrGues = findExecutableOrGuess('asar', asarArgs); let cmd = _findExecutableOrGues.cmd, args = _findExecutableOrGues.args; d(`Running ${cmd} ${JSON.stringify(args)}`); yield (0, _spawnRx.spawnPromise)(cmd, args, { cwd: _path2.default.join(appDir, '..') }); _rimraf2.default.sync(_path2.default.join(appDir)); }); return function runAsarArchive(_x5, _x6) { return _ref4.apply(this, arguments); }; })(); let packagerMain = exports.packagerMain = (() => { var _ref5 = _asyncToGenerator(function* (argv) { d(`argv: ${JSON.stringify(argv)}`); argv = argv.splice(2); var _splitOutAsarArgument = splitOutAsarArguments(argv); let packagerArgs = _splitOutAsarArgument.packagerArgs, asarArgs = _splitOutAsarArgument.asarArgs; var _findExecutableOrGues2 = findExecutableOrGuess(electronPackager, packagerArgs); let cmd = _findExecutableOrGues2.cmd, args = _findExecutableOrGues2.args; d(`Spawning electron-packager: ${JSON.stringify(args)}`); let packagerOutput = yield (0, _spawnRx.spawnPromise)(cmd, args); let packageDirs = parsePackagerOutput(packagerOutput); d(`Starting compilation for ${JSON.stringify(packageDirs)}`); for (let packageDir of packageDirs) { yield compileAndShim(packageDir); if (!asarArgs) continue; d('Starting ASAR packaging'); let asarUnpackDir = null; if (asarArgs.length === 2) { asarUnpackDir = asarArgs[1]; } yield runAsarArchive(packageDir, asarUnpackDir); } }); return function packagerMain(_x7) { return _ref5.apply(this, arguments); }; })(); exports.splitOutAsarArguments = splitOutAsarArguments; exports.parsePackagerOutput = parsePackagerOutput; exports.findExecutableOrGuess = findExecutableOrGuess; var _path = require('path'); var _path2 = _interopRequireDefault(_path); var _rimraf = require('rimraf'); var _rimraf2 = _interopRequireDefault(_rimraf); var _promise = require('./promise'); var _cli = require('./cli'); var _spawnRx = require('spawn-rx'); 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"); }); }; } const d = require('debug')('electron-compile:packager'); const electronPackager = 'electron-packager'; function splitOutAsarArguments(argv) { if (argv.find(x => x.match(/^--asar-unpack$/))) { throw new Error("electron-compile doesn't support --asar-unpack at the moment, use asar-unpack-dir"); } // Strip --asar altogether let ret = argv.filter(x => !x.match(/^--asar/)); if (ret.length === argv.length) { return { packagerArgs: ret, asarArgs: null }; } let indexOfUnpack = ret.findIndex(x => x.match(/^--asar-unpack-dir$/)); if (indexOfUnpack < 0) { return { packagerArgs: ret, asarArgs: [] }; } let unpackArgs = ret.slice(indexOfUnpack, indexOfUnpack + 1); let notUnpackArgs = ret.slice(0, indexOfUnpack).concat(ret.slice(indexOfUnpack + 2)); return { packagerArgs: notUnpackArgs, asarArgs: unpackArgs }; } function parsePackagerOutput(output) { // NB: Yes, this is fragile as fuck. :-/ console.log(output); let lines = output.split('\n'); let idx = lines.findIndex(x => x.match(/Wrote new app/i)); if (idx < 1) throw new Error(`Packager output is invalid: ${output}`); lines = lines.splice(idx); // Multi-platform case if (lines[0].match(/Wrote new apps/)) { return lines.splice(1).filter(x => x.length > 1); } else { return [lines[0].replace(/^.*new app to /, '')]; } } function findExecutableOrGuess(cmdToFind, argsToUse) { var _findActualExecutable = (0, _spawnRx.findActualExecutable)(cmdToFind, argsToUse); let cmd = _findActualExecutable.cmd, args = _findActualExecutable.args; if (cmd === electronPackager) { d(`Can't find ${cmdToFind}, falling back to where it should be as a guess!`); let cmdSuffix = process.platform === 'win32' ? '.cmd' : ''; return (0, _spawnRx.findActualExecutable)(_path2.default.resolve(__dirname, '..', '..', '.bin', `${cmdToFind}${cmdSuffix}`), argsToUse); } return { cmd, args }; } if (process.mainModule === module) { packagerMain(process.argv).then(() => process.exit(0)).catch(e => { console.error(e.message || e); d(e.stack); process.exit(-1); }); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9wYWNrYWdlci1jbGkuanMiXSwibmFtZXMiOlsicGFja2FnZURpciIsImFwcERpciIsInBmcyIsInJlYWRkaXIiLCJmaW5kIiwieCIsIm1hdGNoIiwicGF0aCIsImpvaW4iLCJwYWNrYWdlRGlyVG9SZXNvdXJjZXNEaXIiLCJmcm9tIiwidG8iLCJkIiwiYnVmIiwicmVhZEZpbGUiLCJ3cml0ZUZpbGUiLCJjb3B5U21hbGxGaWxlIiwiZW50cnkiLCJmdWxsUGF0aCIsInN0YXQiLCJpc0RpcmVjdG9yeSIsInBhY2thZ2VKc29uIiwiSlNPTiIsInBhcnNlIiwiaW5kZXgiLCJtYWluIiwib3JpZ2luYWxNYWluIiwiX19kaXJuYW1lIiwic3RyaW5naWZ5IiwiY29tcGlsZUFuZFNoaW0iLCJhc2FyVW5wYWNrRGlyIiwiYXNhckFyZ3MiLCJwdXNoIiwiZmluZEV4ZWN1dGFibGVPckd1ZXNzIiwiY21kIiwiYXJncyIsImN3ZCIsInJpbXJhZiIsInN5bmMiLCJydW5Bc2FyQXJjaGl2ZSIsImFyZ3YiLCJzcGxpY2UiLCJzcGxpdE91dEFzYXJBcmd1bWVudHMiLCJwYWNrYWdlckFyZ3MiLCJlbGVjdHJvblBhY2thZ2VyIiwicGFja2FnZXJPdXRwdXQiLCJwYWNrYWdlRGlycyIsInBhcnNlUGFja2FnZXJPdXRwdXQiLCJsZW5ndGgiLCJwYWNrYWdlck1haW4iLCJyZXF1aXJlIiwiRXJyb3IiLCJyZXQiLCJmaWx0ZXIiLCJpbmRleE9mVW5wYWNrIiwiZmluZEluZGV4IiwidW5wYWNrQXJncyIsInNsaWNlIiwibm90VW5wYWNrQXJncyIsImNvbmNhdCIsIm91dHB1dCIsImNvbnNvbGUiLCJsb2ciLCJsaW5lcyIsInNwbGl0IiwiaWR4IiwicmVwbGFjZSIsImNtZFRvRmluZCIsImFyZ3NUb1VzZSIsImNtZFN1ZmZpeCIsInByb2Nlc3MiLCJwbGF0Zm9ybSIsInJlc29sdmUiLCJtYWluTW9kdWxlIiwibW9kdWxlIiwidGhlbiIsImV4aXQiLCJjYXRjaCIsImUiLCJl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QkFBVCxDQUErQmtDLFNBQS9CLEVBQTBDQyxTQUExQyxFQUFxRDtBQUFBLDhCQUN0QyxtQ0FBcUJELFNBQXJCLEVBQWdDQyxTQUFoQyxDQURzQzs7QUFBQSxNQUNwRGxDLEdBRG9ELHlCQUNwREEsR0FEb0Q7QUFBQSxNQUMvQ0MsSUFEK0MseUJBQy9DQSxJQUQrQzs7QUFFMUQsTUFBSUQsUUFBUVUsZ0JBQVosRUFBOEI7QUFDNUJoQyxNQUFHLGNBQWF1RCxTQUFVLGtEQUExQjtBQUNBLFFBQUlFLFlBQVlDLFFBQVFDLFFBQVIsS0FBcUIsT0FBckIsR0FBK0IsTUFBL0IsR0FBd0MsRUFBeEQ7QUFDQSxXQUFPLG1DQUFxQmhFLGVBQUtpRSxPQUFMLENBQWE3QyxTQUFiLEVBQXdCLElBQXhCLEVBQThCLElBQTlCLEVBQW9DLE1BQXBDLEVBQTZDLEdBQUV3QyxTQUFVLEdBQUVFLFNBQVUsRUFBckUsQ0FBckIsRUFBOEZELFNBQTlGLENBQVA7QUFDRDs7QUFFRCxTQUFPLEVBQUVsQyxHQUFGLEVBQU9DLElBQVAsRUFBUDtBQUNEOztBQTZCRCxJQUFJbUMsUUFBUUcsVUFBUixLQUF1QkMsTUFBM0IsRUFBbUM7QUFDakN6QixlQUFhcUIsUUFBUTlCLElBQXJCLEVBQ0dtQyxJQURILENBQ1EsTUFBTUwsUUFBUU0sSUFBUixDQUFhLENBQWIsQ0FEZCxFQUVHQyxLQUZILENBRVVDLENBQUQsSUFBTztBQUNaakIsWUFBUWtCLEtBQVIsQ0FBY0QsRUFBRUUsT0FBRixJQUFhRixDQUEzQjtBQUNBbEUsTUFBRWtFLEVBQUVHLEtBQUo7O0FBRUFYLFlBQVFNLElBQVIsQ0FBYSxDQUFDLENBQWQ7QUFDRCxHQVBIO0FBUUQiLCJmaWxlIjoicGFja2FnZXItY2xpLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG5cbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHJpbXJhZiBmcm9tICdyaW1yYWYnO1xuXG5pbXBvcnQge3Bmc30gZnJvbSAnLi9wcm9taXNlJztcbmltcG9ydCB7bWFpbn0gZnJvbSAnLi9jbGknO1xuXG5pbXBvcnQge3NwYXduUHJvbWlzZSwgZmluZEFjdHVhbEV4ZWN1dGFibGV9IGZyb20gJ3NwYXduLXJ4JztcblxuY29uc3QgZCA9IHJlcXVpcmUoJ2RlYnVnJykoJ2VsZWN0cm9uLWNvbXBpbGU6cGFja2FnZXInKTtcbmNvbnN0IGVsZWN0cm9uUGFja2FnZXIgPSAnZWxlY3Ryb24tcGFja2FnZXInO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFja2FnZURpclRvUmVzb3VyY2VzRGlyKHBhY2thZ2VEaXIpIHtcbiAgbGV0IGFwcERpciA9IChhd2FpdCBwZnMucmVhZGRpcihwYWNrYWdlRGlyKSkuZmluZCgoeCkgPT4geC5tYXRjaCgvXFwuYXBwJC9pKSk7XG4gIGlmIChhcHBEaXIpIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKHBhY2thZ2VEaXIsIGFwcERpciwgJ0NvbnRlbnRzJywgJ1Jlc291cmNlcycsICdhcHAnKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKHBhY2thZ2VEaXIsICdyZXNvdXJjZXMnLCAnYXBwJyk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY29weVNtYWxsRmlsZShmcm9tLCB0bykge1xuICBkKGBDb3B5aW5nICR7ZnJvbX0gPT4gJHt0b31gKTtcblxuICBsZXQgYnVmID0gYXdhaXQgcGZzLnJlYWRGaWxlKGZyb20pO1xuICBhd2FpdCBwZnMud3JpdGVGaWxlKHRvLCBidWYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRPdXRBc2FyQXJndW1lbnRzKGFyZ3YpIHtcbiAgaWYgKGFyZ3YuZmluZCgoeCkgPT4geC5tYXRjaCgvXi0tYXNhci11bnBhY2skLykpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiZWxlY3Ryb24tY29tcGlsZSBkb2Vzbid0IHN1cHBvcnQgLS1hc2FyLXVucGFjayBhdCB0aGUgbW9tZW50LCB1c2UgYXNhci11bnBhY2stZGlyXCIpO1xuICB9XG5cbiAgLy8gU3RyaXAgLS1hc2FyIGFsdG9nZXRoZXJcbiAgbGV0IHJldCA9IGFyZ3YuZmlsdGVyKCh4KSA9PiAheC5tYXRjaCgvXi0tYXNhci8pKTtcblxuICBpZiAocmV0Lmxlbmd0aCA9PT0gYXJndi5sZW5ndGgpIHsgcmV0dXJuIHsgcGFja2FnZXJBcmdzOiByZXQsIGFzYXJBcmdzOiBudWxsIH07IH1cblxuICBsZXQgaW5kZXhPZlVucGFjayA9IHJldC5maW5kSW5kZXgoKHgpID0+IHgubWF0Y2goL14tLWFzYXItdW5wYWNrLWRpciQvKSk7XG4gIGlmIChpbmRleE9mVW5wYWNrIDwgMCkge1xuICAgIHJldHVybiB7IHBhY2thZ2VyQXJnczogcmV0LCBhc2FyQXJnczogW10gfTtcbiAgfVxuXG4gIGxldCB1bnBhY2tBcmdzID0gcmV0LnNsaWNlKGluZGV4T2ZVbnBhY2ssIGluZGV4T2ZVbnBhY2srMSk7XG4gIGxldCBub3RVbnBhY2tBcmdzID0gcmV0LnNsaWNlKDAsIGluZGV4T2ZVbnBhY2spLmNvbmNhdChyZXQuc2xpY2UoaW5kZXhPZlVucGFjaysyKSk7XG5cbiAgcmV0dXJuIHsgcGFja2FnZXJBcmdzOiBub3RVbnBhY2tBcmdzLCBhc2FyQXJnczogdW5wYWNrQXJncyB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQYWNrYWdlck91dHB1dChvdXRwdXQpIHtcbiAgLy8gTkI6IFllcywgdGhpcyBpcyBmcmFnaWxlIGFzIGZ1Y2suIDotL1xuICBjb25zb2xlLmxvZyhvdXRwdXQpO1xuICBsZXQgbGluZXMgPSBvdXRwdXQuc3BsaXQoJ1xcbicpO1xuXG4gIGxldCBpZHggPSBsaW5lcy5maW5kSW5kZXgoKHgpID0+IHgubWF0Y2goL1dyb3RlIG5ldyBhcHAvaSkpO1xuICBpZiAoaWR4IDwgMSkgdGhyb3cgbmV3IEVycm9yKGBQYWNrYWdlciBvdXRwdXQgaXMgaW52YWxpZDogJHtvdXRwdXR9YCk7XG4gIGxpbmVzID0gbGluZXMuc3BsaWNlKGlkeCk7XG5cbiAgLy8gTXVsdGktcGxhdGZvcm0gY2FzZVxuICBpZiAobGluZXNbMF0ubWF0Y2goL1dyb3RlIG5ldyBhcHBzLykpIHtcbiAgICByZXR1cm4gbGluZXMuc3BsaWNlKDEpLmZpbHRlcigoeCkgPT4geC5sZW5ndGggPiAxKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gW2xpbmVzWzBdLnJlcGxhY2UoL14uKm5ldyBhcHAgdG8gLywgJycpXTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjb21waWxlQW5kU2hpbShwYWNrYWdlRGlyKSB7XG4gIGxldCBhcHBEaXIgPSBhd2FpdCBwYWNrYWdlRGlyVG9SZXNvdXJjZXNEaXIocGFja2FnZURpcik7XG5cbiAgZChgTG9va2luZyBpbiAke2FwcERpcn1gKTtcbiAgZm9yIChsZXQgZW50cnkgb2YgYXdhaXQgcGZzLnJlYWRkaXIoYXBwRGlyKSkge1xuICAgIGlmIChlbnRyeS5tYXRjaCgvXihub2RlX21vZHVsZXN8Ym93ZXJfY29tcG9uZW50cykkLykpIGNvbnRpbnVlO1xuXG4gICAgbGV0IGZ1bGxQYXRoID0gcGF0aC5qb2luKGFwcERpciwgZW50cnkpO1xuICAgIGxldCBzdGF0ID0gYXdhaXQgcGZzLnN0YXQoZnVsbFBhdGgpO1xuXG4gICAgaWYgKCFzdGF0LmlzRGlyZWN0b3J5KCkpIGNvbnRpbnVlO1xuXG4gICAgZChgRXhlY3V0aW5nIGVsZWN0cm9uLWNvbXBpbGU6ICR7YXBwRGlyfSA9PiAke2VudHJ5fWApO1xuICAgIGF3YWl0IG1haW4oYXBwRGlyLCBbZnVsbFBhdGhdKTtcbiAgfVxuXG4gIGQoJ0NvcHlpbmcgaW4gZXM2LXNoaW0nKTtcbiAgbGV0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShcbiAgICBhd2FpdCBwZnMucmVhZEZpbGUocGF0aC5qb2luKGFwcERpciwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKTtcblxuICBsZXQgaW5kZXggPSBwYWNrYWdlSnNvbi5tYWluIHx8ICdpbmRleC5qcyc7XG4gIHBhY2thZ2VKc29uLm9yaWdpbmFsTWFpbiA9IGluZGV4O1xuICBwYWNrYWdlSnNvbi5tYWluID0gJ2VzNi1zaGltLmpzJztcblxuICBhd2FpdCBjb3B5U21hbGxGaWxlKFxuICAgIHBhdGguam9pbihfX2Rpcm5hbWUsICdlczYtc2hpbS5qcycpLFxuICAgIHBhdGguam9pbihhcHBEaXIsICdlczYtc2hpbS5qcycpKTtcblxuICBhd2FpdCBwZnMud3JpdGVGaWxlKFxuICAgIHBhdGguam9pbihhcHBEaXIsICdwYWNrYWdlLmpzb24nKSxcbiAgICBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiwgbnVsbCwgMikpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQXNhckFyY2hpdmUocGFja2FnZURpciwgYXNhclVucGFja0Rpcikge1xuICBsZXQgYXBwRGlyID0gYXdhaXQgcGFja2FnZURpclRvUmVzb3VyY2VzRGlyKHBhY2thZ2VEaXIpO1xuXG4gIGxldCBhc2FyQXJncyA9IFsncGFjaycsICdhcHAnLCAnYXBwLmFzYXInXTtcbiAgaWYgKGFzYXJVbnBhY2tEaXIpIHtcbiAgICBhc2FyQXJncy5wdXNoKCctLXVucGFjay1kaXInLCBhc2FyVW5wYWNrRGlyKTtcbiAgfVxuXG4gIGxldCB7IGNtZCwgYXJncyB9ID0gZmluZEV4ZWN1dGFibGVPckd1ZXNzKCdhc2FyJywgYXNhckFyZ3MpO1xuXG4gIGQoYFJ1bm5pbmcgJHtjbWR9ICR7SlNPTi5zdHJpbmdpZnkoYXJncyl9YCk7XG4gIGF3YWl0IHNwYXduUHJvbWlzZShjbWQsIGFyZ3MsIHsgY3dkOiBwYXRoLmpvaW4oYXBwRGlyLCAnLi4nKSB9KTtcbiAgcmltcmFmLnN5bmMocGF0aC5qb2luKGFwcERpcikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZEV4ZWN1dGFibGVPckd1ZXNzKGNtZFRvRmluZCwgYXJnc1RvVXNlKSB7XG4gIGxldCB7IGNtZCwgYXJncyB9ID0gZmluZEFjdHVhbEV4ZWN1dGFibGUoY21kVG9GaW5kLCBhcmdzVG9Vc2UpO1xuICBpZiAoY21kID09PSBlbGVjdHJvblBhY2thZ2VyKSB7XG4gICAgZChgQ2FuJ3QgZmluZCAke2NtZFRvRmluZH0sIGZhbGxpbmcgYmFjayB0byB3aGVyZSBpdCBzaG91bGQgYmUgYXMgYSBndWVzcyFgKTtcbiAgICBsZXQgY21kU3VmZml4ID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/ICcuY21kJyA6ICcnO1xuICAgIHJldHVybiBmaW5kQWN0dWFsRXhlY3V0YWJsZShwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi4nLCAnLi4nLCAnLmJpbicsIGAke2NtZFRvRmluZH0ke2NtZFN1ZmZpeH1gKSwgYXJnc1RvVXNlKTtcbiAgfVxuXG4gIHJldHVybiB7IGNtZCwgYXJncyB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFja2FnZXJNYWluKGFyZ3YpIHtcbiAgZChgYXJndjogJHtKU09OLnN0cmluZ2lmeShhcmd2KX1gKTtcbiAgYXJndiA9IGFyZ3Yuc3BsaWNlKDIpO1xuXG4gIGxldCB7IHBhY2thZ2VyQXJncywgYXNhckFyZ3MgfSA9IHNwbGl0T3V0QXNhckFyZ3VtZW50cyhhcmd2KTtcbiAgbGV0IHsgY21kLCBhcmdzIH0gPSBmaW5kRXhlY3V0YWJsZU9yR3Vlc3MoZWxlY3Ryb25QYWNrYWdlciwgcGFja2FnZXJBcmdzKTtcblxuICBkKGBTcGF3bmluZyBlbGVjdHJvbi1wYWNrYWdlcjogJHtKU09OLnN0cmluZ2lmeShhcmdzKX1gKTtcbiAgbGV0IHBhY2thZ2VyT3V0cHV0ID0gYXdhaXQgc3Bhd25Qcm9taXNlKGNtZCwgYXJncyk7XG4gIGxldCBwYWNrYWdlRGlycyA9IHBhcnNlUGFja2FnZXJPdXRwdXQocGFja2FnZXJPdXRwdXQpO1xuXG4gIGQoYFN0YXJ0aW5nIGNvbXBpbGF0aW9uIGZvciAke0pTT04uc3RyaW5naWZ5KHBhY2thZ2VEaXJzKX1gKTtcbiAgZm9yIChsZXQgcGFja2FnZURpciBvZiBwYWNrYWdlRGlycykge1xuICAgIGF3YWl0IGNvbXBpbGVBbmRTaGltKHBhY2thZ2VEaXIpO1xuXG4gICAgaWYgKCFhc2FyQXJncykgY29udGludWU7XG5cbiAgICBkKCdTdGFydGluZyBBU0FSIHBhY2thZ2luZycpO1xuICAgIGxldCBhc2FyVW5wYWNrRGlyID0gbnVsbDtcbiAgICBpZiAoYXNhckFyZ3MubGVuZ3RoID09PSAyKSB7XG4gICAgICBhc2FyVW5wYWNrRGlyID0gYXNhckFyZ3NbMV07XG4gICAgfVxuXG4gICAgYXdhaXQgcnVuQXNhckFyY2hpdmUocGFja2FnZURpciwgYXNhclVucGFja0Rpcik7XG4gIH1cbn1cblxuaWYgKHByb2Nlc3MubWFpbk1vZHVsZSA9PT0gbW9kdWxlKSB7XG4gIHBhY2thZ2VyTWFpbihwcm9jZXNzLmFyZ3YpXG4gICAgLnRoZW4oKCkgPT4gcHJvY2Vzcy5leGl0KDApKVxuICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgY29uc29sZS5lcnJvcihlLm1lc3NhZ2UgfHwgZSk7XG4gICAgICBkKGUuc3RhY2spO1xuXG4gICAgICBwcm9jZXNzLmV4aXQoLTEpO1xuICAgIH0pO1xufVxuIl19