UNPKG

@sharekey/meteor-desktop

Version:

Build a Meteor's desktop client with hot code push.

203 lines (198 loc) 27.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = _exports; var _runtime = _interopRequireDefault(require("regenerator-runtime/runtime")); var _fs = _interopRequireDefault(require("fs")); var _path = _interopRequireDefault(require("path")); var _shelljs = _interopRequireDefault(require("shelljs")); var _env = _interopRequireDefault(require("./env")); var _electron = _interopRequireDefault(require("./electron")); var _log = _interopRequireDefault(require("./log")); var _desktop = _interopRequireDefault(require("./desktop")); var _electronApp = _interopRequireDefault(require("./electronApp")); var _meteorApp = _interopRequireDefault(require("./meteorApp")); var _electronBuilder = _interopRequireDefault(require("./electronBuilder")); var _packager = _interopRequireDefault(require("./packager")); var _utils = _interopRequireDefault(require("./utils")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } // eslint-disable-next-line no-unused-vars _shelljs.default.config.fatal = true; /** * Main entity. * @class * @property {Env} env * @property {Electron} electron * @property {InstallerBuilder} installerBuilder * @property {ElectronApp} electronApp * @property {Desktop} desktop * @property {MeteorApp} meteorApp */ class MeteorDesktop { /** * @param {string} input - Meteor app dir * @param {string} output - output dir for bundle/package/installer * @param {Object} options - options from cli.js * @param {Object} dependencies - dependencies object * @constructor */ constructor(input, output, options, dependencies) { const Log = dependencies.log; this.log = new Log('index'); this.version = this.getVersion(); this.log.info('initializing'); this.env = new _env.default(input, output, options); this.electron = new _electron.default(this); this.electronBuilder = new _electronBuilder.default(this); this.electronApp = new _electronApp.default(this); this.desktop = new _desktop.default(this); this.meteorApp = new _meteorApp.default(this); this.utils = _utils.default; } /** * Tries to read the version from our own package.json. * * @returns {string} */ getVersion() { if (this.version) { return this.version; } let version = null; try { ({ version } = JSON.parse(_fs.default.readFileSync(_path.default.join(__dirname, '..', 'package.json'), 'UTF-8'))); } catch (e) { this.log.error(`error while trying to read ${_path.default.join(__dirname, 'package.json')}`, e); process.exit(1); } if (process.env.PLUGIN_VERSION && (version.includes('rc') || version.includes('beta') || version.includes('alpha'))) { version = process.env.PLUGIN_VERSION; } return version; } /** * Tries to read the version from our own package.json. * * @returns {string} */ getElectronVersion() { let version = null; try { const { dependencies = {}, devDependencies = {} } = JSON.parse(_fs.default.readFileSync(_path.default.join(this.env.paths.meteorApp.root, 'package.json'), 'UTF-8')); if (!('electron' in dependencies) && !('electron' in devDependencies)) { this.log.error('electron not found in meteor project dependencies'); process.exit(1); } version = dependencies.electron || devDependencies.electron; if (this.electronApp.depsManager.checks.version.regex.test(version)) { ({ version } = JSON.parse(_fs.default.readFileSync(_path.default.join(this.env.paths.meteorApp.root, 'node_modules', 'electron', 'package.json'), 'UTF-8'))); } } catch (e) { this.log.error(`error while trying to read ${_path.default.join(this.env.paths.meteorApp.root, 'package.json')}`, e); process.exit(1); } return version; } async init() { this.desktop.scaffold(); this.meteorApp.updateGitIgnore(); await this.electronApp.init(); } async buildInstaller(throwError = false) { this.env.options.installerBuild = true; await this.electronApp.build(); try { await this.electronBuilder.build(); } catch (e) { this.log.error('error occurred while building installer', e); if (throwError) { throw new Error(e); } } } async run() { await this.electronApp.build(true); } async build() { await this.electronApp.build(); } justRun() { this.electron.run(); } async runPackager() { this.packager = new _packager.default(this); await this.packager.init(); await this.electronApp.build(); this.packager.packageApp().catch(e => { this.log.error(`while trying to build a package an error occurred: ${e}`); }); } async getDependency(name, version, declarationCheck = true) { if (declarationCheck) { try { const { dependencies = {}, devDependencies = {} } = JSON.parse(_fs.default.readFileSync(_path.default.join(this.env.paths.meteorApp.root, 'package.json'), 'UTF-8')); if (!(name in dependencies) && !(name in devDependencies)) { await this.meteorApp.runNpm(['i', '-D', '-E', '--only=dev', `${name}@${version}`], 'inherit'); } } catch (e) { this.log.error(`could no read ${_path.default.join(this.env.paths.meteorApp.root, 'package.json')}`, e); process.exit(1); } } const dependencyPath = _path.default.join(this.env.paths.meteorApp.root, 'node_modules', name); let dependency = null; try { dependency = require(dependencyPath); } catch (e) { if (declarationCheck) { this.log.warn(`could not find ${name}, installing the default version for you: ${name}@${version}`); try { await this.meteorApp.runNpm(['i', '-D', '-E', '--only=dev', `${name}@${version}`], 'inherit'); } catch (err) { this.log.error(err); process.exit(1); } } else { this.log.warn(`could not find ${name}, exiting`); process.exit(1); } } finally { if (!dependency) { dependency = require(dependencyPath); } } const dependencyVersion = require(_path.default.join(dependencyPath, 'package.json')).version; if (dependencyVersion !== version) { if (dependencyVersion.split('.')[0] !== version.split('.')[0]) { this.log.warn(`you are using a ${name}@${dependencyVersion} while the recommended version is ` + `${version}, the compatibility version is different, use at your own risk, be sure to report ` + 'that when submitting issues'); } else { this.log.warn(`you are using a ${name}@${dependencyVersion} while the recommended version is ` + `${version}, be sure to report that when submitting issues`); } } return { dependency, path: dependencyPath }; } } function _exports(input, output, options, { log = _log.default } = { log: _log.default }) { return new MeteorDesktop(input, output, options, { log }); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcnVudGltZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2ZzIiwiX3BhdGgiLCJfc2hlbGxqcyIsIl9lbnYiLCJfZWxlY3Ryb24iLCJfbG9nIiwiX2Rlc2t0b3AiLCJfZWxlY3Ryb25BcHAiLCJfbWV0ZW9yQXBwIiwiX2VsZWN0cm9uQnVpbGRlciIsIl9wYWNrYWdlciIsIl91dGlscyIsIm9iaiIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0Iiwic2hlbGwiLCJjb25maWciLCJmYXRhbCIsIk1ldGVvckRlc2t0b3AiLCJjb25zdHJ1Y3RvciIsImlucHV0Iiwib3V0cHV0Iiwib3B0aW9ucyIsImRlcGVuZGVuY2llcyIsIkxvZyIsImxvZyIsInZlcnNpb24iLCJnZXRWZXJzaW9uIiwiaW5mbyIsImVudiIsIkVudiIsImVsZWN0cm9uIiwiRWxlY3Ryb24iLCJlbGVjdHJvbkJ1aWxkZXIiLCJFbGVjdHJvbkJ1aWxkZXIiLCJlbGVjdHJvbkFwcCIsIkVsZWN0cm9uQXBwIiwiZGVza3RvcCIsIkRlc2t0b3AiLCJtZXRlb3JBcHAiLCJNZXRlb3JBcHAiLCJ1dGlscyIsIkpTT04iLCJwYXJzZSIsImZzIiwicmVhZEZpbGVTeW5jIiwicGF0aCIsImpvaW4iLCJfX2Rpcm5hbWUiLCJlIiwiZXJyb3IiLCJwcm9jZXNzIiwiZXhpdCIsIlBMVUdJTl9WRVJTSU9OIiwiaW5jbHVkZXMiLCJnZXRFbGVjdHJvblZlcnNpb24iLCJkZXZEZXBlbmRlbmNpZXMiLCJwYXRocyIsInJvb3QiLCJkZXBzTWFuYWdlciIsImNoZWNrcyIsInJlZ2V4IiwidGVzdCIsImluaXQiLCJzY2FmZm9sZCIsInVwZGF0ZUdpdElnbm9yZSIsImJ1aWxkSW5zdGFsbGVyIiwidGhyb3dFcnJvciIsImluc3RhbGxlckJ1aWxkIiwiYnVpbGQiLCJFcnJvciIsInJ1biIsImp1c3RSdW4iLCJydW5QYWNrYWdlciIsInBhY2thZ2VyIiwiUGFja2FnZXIiLCJwYWNrYWdlQXBwIiwiY2F0Y2giLCJnZXREZXBlbmRlbmN5IiwibmFtZSIsImRlY2xhcmF0aW9uQ2hlY2siLCJydW5OcG0iLCJkZXBlbmRlbmN5UGF0aCIsImRlcGVuZGVuY3kiLCJ3YXJuIiwiZXJyIiwiZGVwZW5kZW5jeVZlcnNpb24iLCJzcGxpdCIsImV4cG9ydHMiLCJMb2dnZXIiXSwic291cmNlcyI6WyIuLi9saWIvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5pbXBvcnQgcmVnZW5lcmF0b3JSdW50aW1lIGZyb20gJ3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZSc7XG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgc2hlbGwgZnJvbSAnc2hlbGxqcyc7XG5pbXBvcnQgRW52IGZyb20gJy4vZW52JztcbmltcG9ydCBFbGVjdHJvbiBmcm9tICcuL2VsZWN0cm9uJztcbmltcG9ydCBMb2dnZXIgZnJvbSAnLi9sb2cnO1xuaW1wb3J0IERlc2t0b3AgZnJvbSAnLi9kZXNrdG9wJztcbmltcG9ydCBFbGVjdHJvbkFwcCBmcm9tICcuL2VsZWN0cm9uQXBwJztcbmltcG9ydCBNZXRlb3JBcHAgZnJvbSAnLi9tZXRlb3JBcHAnO1xuaW1wb3J0IEVsZWN0cm9uQnVpbGRlciBmcm9tICcuL2VsZWN0cm9uQnVpbGRlcic7XG5pbXBvcnQgUGFja2FnZXIgZnJvbSAnLi9wYWNrYWdlcic7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5cbnNoZWxsLmNvbmZpZy5mYXRhbCA9IHRydWU7XG5cbi8qKlxuICogTWFpbiBlbnRpdHkuXG4gKiBAY2xhc3NcbiAqIEBwcm9wZXJ0eSB7RW52fSBlbnZcbiAqIEBwcm9wZXJ0eSB7RWxlY3Ryb259IGVsZWN0cm9uXG4gKiBAcHJvcGVydHkge0luc3RhbGxlckJ1aWxkZXJ9IGluc3RhbGxlckJ1aWxkZXJcbiAqIEBwcm9wZXJ0eSB7RWxlY3Ryb25BcHB9IGVsZWN0cm9uQXBwXG4gKiBAcHJvcGVydHkge0Rlc2t0b3B9IGRlc2t0b3BcbiAqIEBwcm9wZXJ0eSB7TWV0ZW9yQXBwfSBtZXRlb3JBcHBcbiAqL1xuY2xhc3MgTWV0ZW9yRGVza3RvcCB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlucHV0ICAgICAgICAtIE1ldGVvciBhcHAgZGlyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG91dHB1dCAgICAgICAtIG91dHB1dCBkaXIgZm9yIGJ1bmRsZS9wYWNrYWdlL2luc3RhbGxlclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zICAgICAgLSBvcHRpb25zIGZyb20gY2xpLmpzXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRlcGVuZGVuY2llcyAtIGRlcGVuZGVuY2llcyBvYmplY3RcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihpbnB1dCwgb3V0cHV0LCBvcHRpb25zLCBkZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgY29uc3QgTG9nID0gZGVwZW5kZW5jaWVzLmxvZztcbiAgICAgICAgdGhpcy5sb2cgPSBuZXcgTG9nKCdpbmRleCcpO1xuICAgICAgICB0aGlzLnZlcnNpb24gPSB0aGlzLmdldFZlcnNpb24oKTtcblxuICAgICAgICB0aGlzLmxvZy5pbmZvKCdpbml0aWFsaXppbmcnKTtcblxuICAgICAgICB0aGlzLmVudiA9IG5ldyBFbnYoaW5wdXQsIG91dHB1dCwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuZWxlY3Ryb24gPSBuZXcgRWxlY3Ryb24odGhpcyk7XG4gICAgICAgIHRoaXMuZWxlY3Ryb25CdWlsZGVyID0gbmV3IEVsZWN0cm9uQnVpbGRlcih0aGlzKTtcbiAgICAgICAgdGhpcy5lbGVjdHJvbkFwcCA9IG5ldyBFbGVjdHJvbkFwcCh0aGlzKTtcbiAgICAgICAgdGhpcy5kZXNrdG9wID0gbmV3IERlc2t0b3AodGhpcyk7XG4gICAgICAgIHRoaXMubWV0ZW9yQXBwID0gbmV3IE1ldGVvckFwcCh0aGlzKTtcbiAgICAgICAgdGhpcy51dGlscyA9IHV0aWxzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyaWVzIHRvIHJlYWQgdGhlIHZlcnNpb24gZnJvbSBvdXIgb3duIHBhY2thZ2UuanNvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgZ2V0VmVyc2lvbigpIHtcbiAgICAgICAgaWYgKHRoaXMudmVyc2lvbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmVyc2lvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB2ZXJzaW9uID0gbnVsbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICh7IHZlcnNpb24gfSA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICdwYWNrYWdlLmpzb24nKSwgJ1VURi04JylcbiAgICAgICAgICAgICkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcihgZXJyb3Igd2hpbGUgdHJ5aW5nIHRvIHJlYWQgJHtwYXRoLmpvaW4oX19kaXJuYW1lLCAncGFja2FnZS5qc29uJyl9YCwgZSk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2Nlc3MuZW52LlBMVUdJTl9WRVJTSU9OICYmXG4gICAgICAgICAgICAodmVyc2lvbi5pbmNsdWRlcygncmMnKSB8fCB2ZXJzaW9uLmluY2x1ZGVzKCdiZXRhJykgfHwgdmVyc2lvbi5pbmNsdWRlcygnYWxwaGEnKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB2ZXJzaW9uID0gcHJvY2Vzcy5lbnYuUExVR0lOX1ZFUlNJT047XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZlcnNpb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJpZXMgdG8gcmVhZCB0aGUgdmVyc2lvbiBmcm9tIG91ciBvd24gcGFja2FnZS5qc29uLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRFbGVjdHJvblZlcnNpb24oKSB7XG4gICAgICAgIGxldCB2ZXJzaW9uID0gbnVsbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHsgZGVwZW5kZW5jaWVzID0ge30sIGRldkRlcGVuZGVuY2llcyA9IHt9IH0gPSBKU09OLnBhcnNlKFxuICAgICAgICAgICAgICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5lbnYucGF0aHMubWV0ZW9yQXBwLnJvb3QsICdwYWNrYWdlLmpzb24nKSwgJ1VURi04JylcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoISgnZWxlY3Ryb24nIGluIGRlcGVuZGVuY2llcykgJiYgISgnZWxlY3Ryb24nIGluIGRldkRlcGVuZGVuY2llcykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignZWxlY3Ryb24gbm90IGZvdW5kIGluIG1ldGVvciBwcm9qZWN0IGRlcGVuZGVuY2llcycpO1xuICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZlcnNpb24gPSBkZXBlbmRlbmNpZXMuZWxlY3Ryb24gfHwgZGV2RGVwZW5kZW5jaWVzLmVsZWN0cm9uO1xuICAgICAgICAgICAgaWYgKHRoaXMuZWxlY3Ryb25BcHAuZGVwc01hbmFnZXIuY2hlY2tzLnZlcnNpb24ucmVnZXgudGVzdCh2ZXJzaW9uKSkge1xuICAgICAgICAgICAgICAgICh7IHZlcnNpb24gfSA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgICAgICAgICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5lbnYucGF0aHMubWV0ZW9yQXBwLnJvb3QsICdub2RlX21vZHVsZXMnLCAnZWxlY3Ryb24nLCAncGFja2FnZS5qc29uJyksICdVVEYtOCcpXG4gICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKGBlcnJvciB3aGlsZSB0cnlpbmcgdG8gcmVhZCAke3BhdGguam9pbih0aGlzLmVudi5wYXRocy5tZXRlb3JBcHAucm9vdCwgJ3BhY2thZ2UuanNvbicpfWAsIGUpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2ZXJzaW9uO1xuICAgIH1cblxuICAgIGFzeW5jIGluaXQoKSB7XG4gICAgICAgIHRoaXMuZGVza3RvcC5zY2FmZm9sZCgpO1xuICAgICAgICB0aGlzLm1ldGVvckFwcC51cGRhdGVHaXRJZ25vcmUoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5lbGVjdHJvbkFwcC5pbml0KCk7XG4gICAgfVxuXG4gICAgYXN5bmMgYnVpbGRJbnN0YWxsZXIodGhyb3dFcnJvciA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuZW52Lm9wdGlvbnMuaW5zdGFsbGVyQnVpbGQgPSB0cnVlO1xuICAgICAgICBhd2FpdCB0aGlzLmVsZWN0cm9uQXBwLmJ1aWxkKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmVsZWN0cm9uQnVpbGRlci5idWlsZCgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignZXJyb3Igb2NjdXJyZWQgd2hpbGUgYnVpbGRpbmcgaW5zdGFsbGVyJywgZSk7XG4gICAgICAgICAgICBpZiAodGhyb3dFcnJvcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHJ1bigpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbGVjdHJvbkFwcC5idWlsZCh0cnVlKTtcbiAgICB9XG5cbiAgICBhc3luYyBidWlsZCgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbGVjdHJvbkFwcC5idWlsZCgpO1xuICAgIH1cblxuICAgIGp1c3RSdW4oKSB7XG4gICAgICAgIHRoaXMuZWxlY3Ryb24ucnVuKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgcnVuUGFja2FnZXIoKSB7XG4gICAgICAgIHRoaXMucGFja2FnZXIgPSBuZXcgUGFja2FnZXIodGhpcyk7XG4gICAgICAgIGF3YWl0IHRoaXMucGFja2FnZXIuaW5pdCgpO1xuICAgICAgICBhd2FpdCB0aGlzLmVsZWN0cm9uQXBwLmJ1aWxkKCk7XG5cbiAgICAgICAgdGhpcy5wYWNrYWdlci5wYWNrYWdlQXBwKCkuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKGB3aGlsZSB0cnlpbmcgdG8gYnVpbGQgYSBwYWNrYWdlIGFuIGVycm9yIG9jY3VycmVkOiAke2V9YCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFzeW5jIGdldERlcGVuZGVuY3kobmFtZSwgdmVyc2lvbiwgZGVjbGFyYXRpb25DaGVjayA9IHRydWUpIHtcbiAgICAgICAgaWYgKGRlY2xhcmF0aW9uQ2hlY2spIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBkZXBlbmRlbmNpZXMgPSB7fSwgZGV2RGVwZW5kZW5jaWVzID0ge30gfSA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgICAgICAgICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5lbnYucGF0aHMubWV0ZW9yQXBwLnJvb3QsICdwYWNrYWdlLmpzb24nKSwgJ1VURi04JylcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmICghKG5hbWUgaW4gZGVwZW5kZW5jaWVzKSAmJiAhKG5hbWUgaW4gZGV2RGVwZW5kZW5jaWVzKSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1ldGVvckFwcC5ydW5OcG0oWydpJywgJy1EJywgJy1FJywgJy0tb25seT1kZXYnLCBgJHtuYW1lfUAke3ZlcnNpb259YF0sICdpbmhlcml0Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKGBjb3VsZCBubyByZWFkICR7cGF0aC5qb2luKHRoaXMuZW52LnBhdGhzLm1ldGVvckFwcC5yb290LCAncGFja2FnZS5qc29uJyl9YCwgZSk7XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVwZW5kZW5jeVBhdGggPSBwYXRoLmpvaW4odGhpcy5lbnYucGF0aHMubWV0ZW9yQXBwLnJvb3QsICdub2RlX21vZHVsZXMnLCBuYW1lKTtcbiAgICAgICAgbGV0IGRlcGVuZGVuY3kgPSBudWxsO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZGVwZW5kZW5jeSA9IHJlcXVpcmUoZGVwZW5kZW5jeVBhdGgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb25DaGVjaykge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLndhcm4oYGNvdWxkIG5vdCBmaW5kICR7bmFtZX0sIGluc3RhbGxpbmcgdGhlIGRlZmF1bHQgdmVyc2lvbiBmb3IgeW91OiAke25hbWV9QCR7dmVyc2lvbn1gKTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1ldGVvckFwcC5ydW5OcG0oWydpJywgJy1EJywgJy1FJywgJy0tb25seT1kZXYnLCBgJHtuYW1lfUAke3ZlcnNpb259YF0sICdpbmhlcml0Jyk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLndhcm4oYGNvdWxkIG5vdCBmaW5kICR7bmFtZX0sIGV4aXRpbmdgKTtcbiAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoIWRlcGVuZGVuY3kpIHtcbiAgICAgICAgICAgICAgICBkZXBlbmRlbmN5ID0gcmVxdWlyZShkZXBlbmRlbmN5UGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVwZW5kZW5jeVZlcnNpb24gPSByZXF1aXJlKHBhdGguam9pbihkZXBlbmRlbmN5UGF0aCwgJ3BhY2thZ2UuanNvbicpKS52ZXJzaW9uO1xuXG4gICAgICAgIGlmIChkZXBlbmRlbmN5VmVyc2lvbiAhPT0gdmVyc2lvbikge1xuICAgICAgICAgICAgaWYgKGRlcGVuZGVuY3lWZXJzaW9uLnNwbGl0KCcuJylbMF0gIT09IHZlcnNpb24uc3BsaXQoJy4nKVswXSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLndhcm4oYHlvdSBhcmUgdXNpbmcgYSAke25hbWV9QCR7ZGVwZW5kZW5jeVZlcnNpb259IHdoaWxlIHRoZSByZWNvbW1lbmRlZCB2ZXJzaW9uIGlzIGAgK1xuICAgICAgICAgICAgICAgICAgICBgJHt2ZXJzaW9ufSwgdGhlIGNvbXBhdGliaWxpdHkgdmVyc2lvbiBpcyBkaWZmZXJlbnQsIHVzZSBhdCB5b3VyIG93biByaXNrLCBiZSBzdXJlIHRvIHJlcG9ydCBgICtcbiAgICAgICAgICAgICAgICAgICAgJ3RoYXQgd2hlbiBzdWJtaXR0aW5nIGlzc3VlcycpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy53YXJuKGB5b3UgYXJlIHVzaW5nIGEgJHtuYW1lfUAke2RlcGVuZGVuY3lWZXJzaW9ufSB3aGlsZSB0aGUgcmVjb21tZW5kZWQgdmVyc2lvbiBpcyBgICtcbiAgICAgICAgICAgICAgICAgICAgYCR7dmVyc2lvbn0sIGJlIHN1cmUgdG8gcmVwb3J0IHRoYXQgd2hlbiBzdWJtaXR0aW5nIGlzc3Vlc2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGRlcGVuZGVuY3ksIHBhdGg6IGRlcGVuZGVuY3lQYXRoIH07XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBleHBvcnRzKGlucHV0LCBvdXRwdXQsIG9wdGlvbnMsIHsgbG9nID0gTG9nZ2VyIH0gPSB7IGxvZzogTG9nZ2VyIH0pIHtcbiAgICByZXR1cm4gbmV3IE1ldGVvckRlc2t0b3AoaW5wdXQsIG91dHB1dCwgb3B0aW9ucywgeyBsb2cgfSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLElBQUFBLFFBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLEdBQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLEtBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLFFBQUEsR0FBQUosc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFJLElBQUEsR0FBQUwsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFLLFNBQUEsR0FBQU4sc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFNLElBQUEsR0FBQVAsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFPLFFBQUEsR0FBQVIsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFRLFlBQUEsR0FBQVQsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFTLFVBQUEsR0FBQVYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFVLGdCQUFBLEdBQUFYLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBVyxTQUFBLEdBQUFaLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBWSxNQUFBLEdBQUFiLHNCQUFBLENBQUFDLE9BQUE7QUFBNEIsU0FBQUQsdUJBQUFjLEdBQUEsV0FB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