electron-forge
Version:
A complete tool for building modern Electron applications
402 lines (301 loc) • 28 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _typeof2 = require('babel-runtime/helpers/typeof');
var _typeof3 = _interopRequireDefault(_typeof2);
var _stringify = require('babel-runtime/core-js/json/stringify');
var _stringify2 = _interopRequireDefault(_stringify);
var _regenerator = require('babel-runtime/regenerator');
var _regenerator2 = _interopRequireDefault(_regenerator);
var _getIterator2 = require('babel-runtime/core-js/get-iterator');
var _getIterator3 = _interopRequireDefault(_getIterator2);
var _assign = require('babel-runtime/core-js/object/assign');
var _assign2 = _interopRequireDefault(_assign);
var _bluebird = require('bluebird');
require('colors');
var _debug = require('debug');
var _debug2 = _interopRequireDefault(_debug);
var _fsExtra = require('fs-extra');
var _fsExtra2 = _interopRequireDefault(_fsExtra);
var _glob = require('glob');
var _glob2 = _interopRequireDefault(_glob);
var _path = require('path');
var _path2 = _interopRequireDefault(_path);
var _pify = require('pify');
var _pify2 = _interopRequireDefault(_pify);
var _electronPackager = require('electron-packager');
var _electronPackager2 = _interopRequireDefault(_electronPackager);
var _electronHostArch = require('../util/electron-host-arch');
var _electronHostArch2 = _interopRequireDefault(_electronHostArch);
var _forgeConfig = require('../util/forge-config');
var _forgeConfig2 = _interopRequireDefault(_forgeConfig);
var _hook = require('../util/hook');
var _hook2 = _interopRequireDefault(_hook);
var _ora = require('../util/ora');
var _ora2 = _interopRequireDefault(_ora);
var _compileHook = require('../util/compile-hook');
var _compileHook2 = _interopRequireDefault(_compileHook);
var _readPackageJson = require('../util/read-package-json');
var _readPackageJson2 = _interopRequireDefault(_readPackageJson);
var _rebuild = require('../util/rebuild');
var _rebuild2 = _interopRequireDefault(_rebuild);
var _requireSearch = require('../util/require-search');
var _requireSearch2 = _interopRequireDefault(_requireSearch);
var _resolveDir = require('../util/resolve-dir');
var _resolveDir2 = _interopRequireDefault(_resolveDir);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var d = (0, _debug2.default)('electron-forge:packager');
/**
* @typedef {Object} PackageOptions
* @property {string} [dir=process.cwd()] The path to the app to package
* @property {boolean} [interactive=false] Whether to use sensible defaults or prompt the user visually
* @property {string} [arch=process.arch] The target arch
* @property {string} [platform=process.platform] The target platform.
* @property {string} [outDir=`${dir}/out`] The path to the output directory for packaged apps
*/
/**
* Package an Electron application into an platform dependent format.
*
* @param {PackageOptions} providedOptions - Options for the Package method
* @return {Promise} Will resolve when the package process is complete
*/
exports.default = function () {
var _ref = (0, _bluebird.coroutine)(_regenerator2.default.mark(function _callee5() {
var providedOptions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var _Object$assign, dir, interactive, arch, platform, ora, outDir, prepareSpinner, prepareCounter, packageJSON, forgeConfig, packagerSpinner, packageOpts;
return _regenerator2.default.wrap(function _callee5$(_context5) {
while (1) {
switch (_context5.prev = _context5.next) {
case 0:
// eslint-disable-next-line prefer-const, no-unused-vars
_Object$assign = (0, _assign2.default)({
dir: process.cwd(),
interactive: false,
arch: (0, _electronHostArch2.default)(),
platform: process.platform
}, providedOptions), dir = _Object$assign.dir, interactive = _Object$assign.interactive, arch = _Object$assign.arch, platform = _Object$assign.platform;
ora = interactive ? _ora2.default : _ora.fakeOra;
outDir = providedOptions.outDir || _path2.default.resolve(dir, 'out');
prepareSpinner = ora('Preparing to Package Application for arch: ' + (arch === 'all' ? 'ia32' : arch).cyan).start();
prepareCounter = 0;
_context5.next = 7;
return (0, _resolveDir2.default)(dir);
case 7:
dir = _context5.sent;
if (dir) {
_context5.next = 10;
break;
}
throw 'Failed to locate compilable Electron application';
case 10:
_context5.next = 12;
return (0, _readPackageJson2.default)(dir);
case 12:
packageJSON = _context5.sent;
if (!(_path2.default.dirname(require.resolve(_path2.default.resolve(dir, packageJSON.main))) === dir)) {
_context5.next = 16;
break;
}
console.error(('Entry point: ' + packageJSON.main).red);
throw 'The entry point to your application ("packageJSON.main") must be in a subfolder not in the top level directory';
case 16:
_context5.next = 18;
return (0, _forgeConfig2.default)(dir);
case 18:
forgeConfig = _context5.sent;
packagerSpinner = void 0;
packageOpts = (0, _assign2.default)({
asar: false,
overwrite: true
}, forgeConfig.electronPackagerConfig, {
afterCopy: [function () {
var _ref2 = (0, _bluebird.coroutine)(_regenerator2.default.mark(function _callee(buildPath, electronVersion, pPlatform, pArch, done) {
var bins, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, bin;
return _regenerator2.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
if (packagerSpinner) {
packagerSpinner.succeed();
prepareCounter += 1;
prepareSpinner = ora('Preparing to Package Application for arch: ' + (prepareCounter === 2 ? 'armv7l' : 'x64').cyan).start();
}
_context.next = 3;
return _fsExtra2.default.remove(_path2.default.resolve(buildPath, 'node_modules/electron-compile/test'));
case 3:
_context.next = 5;
return (0, _pify2.default)(_glob2.default)(_path2.default.join(buildPath, '**/.bin/**/*'));
case 5:
bins = _context.sent;
_iteratorNormalCompletion = true;
_didIteratorError = false;
_iteratorError = undefined;
_context.prev = 9;
_iterator = (0, _getIterator3.default)(bins);
case 11:
if (_iteratorNormalCompletion = (_step = _iterator.next()).done) {
_context.next = 18;
break;
}
bin = _step.value;
_context.next = 15;
return _fsExtra2.default.remove(bin);
case 15:
_iteratorNormalCompletion = true;
_context.next = 11;
break;
case 18:
_context.next = 24;
break;
case 20:
_context.prev = 20;
_context.t0 = _context['catch'](9);
_didIteratorError = true;
_iteratorError = _context.t0;
case 24:
_context.prev = 24;
_context.prev = 25;
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
case 27:
_context.prev = 27;
if (!_didIteratorError) {
_context.next = 30;
break;
}
throw _iteratorError;
case 30:
return _context.finish(27);
case 31:
return _context.finish(24);
case 32:
done();
case 33:
case 'end':
return _context.stop();
}
}
}, _callee, undefined, [[9, 20, 24, 32], [25,, 27, 31]]);
}));
return function (_x2, _x3, _x4, _x5, _x6) {
return _ref2.apply(this, arguments);
};
}(), function () {
var _ref3 = (0, _bluebird.coroutine)(_regenerator2.default.mark(function _callee2() {
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return _regenerator2.default.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
prepareSpinner.succeed();
_context2.next = 3;
return _compileHook2.default.apply(undefined, [dir].concat(args));
case 3:
case 'end':
return _context2.stop();
}
}
}, _callee2, undefined);
}));
return function () {
return _ref3.apply(this, arguments);
};
}(), function () {
var _ref4 = (0, _bluebird.coroutine)(_regenerator2.default.mark(function _callee3(buildPath, electronVersion, pPlatform, pArch, done) {
return _regenerator2.default.wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
_context3.next = 2;
return (0, _rebuild2.default)(buildPath, electronVersion, pPlatform, pArch);
case 2:
packagerSpinner = ora('Packaging Application').start();
done();
case 4:
case 'end':
return _context3.stop();
}
}
}, _callee3, undefined);
}));
return function (_x7, _x8, _x9, _x10, _x11) {
return _ref4.apply(this, arguments);
};
}(), function () {
var _ref5 = (0, _bluebird.coroutine)(_regenerator2.default.mark(function _callee4(buildPath, electronVersion, pPlatform, pArch, done) {
var copiedPackageJSON;
return _regenerator2.default.wrap(function _callee4$(_context4) {
while (1) {
switch (_context4.prev = _context4.next) {
case 0:
_context4.next = 2;
return (0, _readPackageJson2.default)(buildPath);
case 2:
copiedPackageJSON = _context4.sent;
if (copiedPackageJSON.config && copiedPackageJSON.config.forge) {
delete copiedPackageJSON.config.forge;
}
_context4.next = 6;
return _fsExtra2.default.writeFile(_path2.default.resolve(buildPath, 'package.json'), (0, _stringify2.default)(copiedPackageJSON, null, 2));
case 6:
done();
case 7:
case 'end':
return _context4.stop();
}
}
}, _callee4, undefined);
}));
return function (_x12, _x13, _x14, _x15, _x16) {
return _ref5.apply(this, arguments);
};
}()].concat(forgeConfig.electronPackagerConfig.afterCopy ? forgeConfig.electronPackagerConfig.afterCopy.map(function (item) {
return typeof item === 'string' ? (0, _requireSearch2.default)(dir, [item]) : item;
}) : []),
afterExtract: forgeConfig.electronPackagerConfig.afterExtract ? forgeConfig.electronPackagerConfig.afterExtract.map(function (item) {
return typeof item === 'string' ? (0, _requireSearch2.default)(dir, [item]) : item;
}) : [],
dir: dir,
arch: arch,
platform: platform,
out: outDir,
electronVersion: packageJSON.devDependencies['electron-prebuilt-compile']
});
packageOpts.quiet = true;
if (!((0, _typeof3.default)(packageOpts.asar) === 'object' && packageOpts.asar.unpack)) {
_context5.next = 25;
break;
}
packagerSpinner.fail();
throw new Error('electron-compile does not support asar.unpack yet. Please use asar.unpackDir');
case 25:
_context5.next = 27;
return (0, _hook2.default)(forgeConfig, 'generateAssets');
case 27:
_context5.next = 29;
return (0, _hook2.default)(forgeConfig, 'prePackage');
case 29:
d('packaging with options', packageOpts);
_context5.next = 32;
return (0, _pify2.default)(_electronPackager2.default)(packageOpts);
case 32:
_context5.next = 34;
return (0, _hook2.default)(forgeConfig, 'postPackage');
case 34:
packagerSpinner.succeed();
case 35:
case 'end':
return _context5.stop();
}
}
}, _callee5, undefined);
}));
return function () {
return _ref.apply(this, arguments);
};
}();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFwaS9wYWNrYWdlLmpzIl0sIm5hbWVzIjpbImQiLCJwcm92aWRlZE9wdGlvbnMiLCJkaXIiLCJwcm9jZXNzIiwiY3dkIiwiaW50ZXJhY3RpdmUiLCJhcmNoIiwicGxhdGZvcm0iLCJvcmEiLCJvdXREaXIiLCJyZXNvbHZlIiwicHJlcGFyZVNwaW5uZXIiLCJjeWFuIiwic3RhcnQiLCJwcmVwYXJlQ291bnRlciIsInBhY2thZ2VKU09OIiwiZGlybmFtZSIsInJlcXVpcmUiLCJtYWluIiwiY29uc29sZSIsImVycm9yIiwicmVkIiwiZm9yZ2VDb25maWciLCJwYWNrYWdlclNwaW5uZXIiLCJwYWNrYWdlT3B0cyIsImFzYXIiLCJvdmVyd3JpdGUiLCJlbGVjdHJvblBhY2thZ2VyQ29uZmlnIiwiYWZ0ZXJDb3B5IiwiYnVpbGRQYXRoIiwiZWxlY3Ryb25WZXJzaW9uIiwicFBsYXRmb3JtIiwicEFyY2giLCJkb25lIiwic3VjY2VlZCIsInJlbW92ZSIsImpvaW4iLCJiaW5zIiwiYmluIiwiYXJncyIsImNvcGllZFBhY2thZ2VKU09OIiwiY29uZmlnIiwiZm9yZ2UiLCJ3cml0ZUZpbGUiLCJjb25jYXQiLCJtYXAiLCJpdGVtIiwiYWZ0ZXJFeHRyYWN0Iiwib3V0IiwiZGV2RGVwZW5kZW5jaWVzIiwicXVpZXQiLCJ1bnBhY2siLCJmYWlsIiwiRXJyb3IiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFFQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7OztBQUVBLElBQU1BLElBQUkscUJBQU0seUJBQU4sQ0FBVjs7QUFFQTs7Ozs7Ozs7O0FBU0E7Ozs7Ozs7O2lFQU1lO0FBQUEsUUFBT0MsZUFBUCx1RUFBeUIsRUFBekI7O0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDYjtBQURhLDZCQUU4QixzQkFBYztBQUN2REMsbUJBQUtDLFFBQVFDLEdBQVIsRUFEa0Q7QUFFdkRDLDJCQUFhLEtBRjBDO0FBR3ZEQyxvQkFBTSxpQ0FIaUQ7QUFJdkRDLHdCQUFVSixRQUFRSTtBQUpxQyxhQUFkLEVBS3hDTixlQUx3QyxDQUY5QixFQUVQQyxHQUZPLGtCQUVQQSxHQUZPLEVBRUZHLFdBRkUsa0JBRUZBLFdBRkUsRUFFV0MsSUFGWCxrQkFFV0EsSUFGWCxFQUVpQkMsUUFGakIsa0JBRWlCQSxRQUZqQjtBQVNQQyxlQVRPLEdBU0RILDBDQVRDO0FBV1BJLGtCQVhPLEdBV0VSLGdCQUFnQlEsTUFBaEIsSUFBMEIsZUFBS0MsT0FBTCxDQUFhUixHQUFiLEVBQWtCLEtBQWxCLENBWDVCO0FBWVRTLDBCQVpTLEdBWVFILG9EQUFrRCxDQUFDRixTQUFTLEtBQVQsR0FBaUIsTUFBakIsR0FBMEJBLElBQTNCLEVBQWlDTSxJQUFuRixFQUEyRkMsS0FBM0YsRUFaUjtBQWFUQywwQkFiUyxHQWFRLENBYlI7QUFBQTtBQUFBLG1CQWVELDBCQUFXWixHQUFYLENBZkM7O0FBQUE7QUFlYkEsZUFmYTs7QUFBQSxnQkFnQlJBLEdBaEJRO0FBQUE7QUFBQTtBQUFBOztBQUFBLGtCQWlCTCxrREFqQks7O0FBQUE7QUFBQTtBQUFBLG1CQW9CYSwrQkFBZ0JBLEdBQWhCLENBcEJiOztBQUFBO0FBb0JQYSx1QkFwQk87O0FBQUEsa0JBc0JULGVBQUtDLE9BQUwsQ0FBYUMsUUFBUVAsT0FBUixDQUFnQixlQUFLQSxPQUFMLENBQWFSLEdBQWIsRUFBa0JhLFlBQVlHLElBQTlCLENBQWhCLENBQWIsTUFBdUVoQixHQXRCOUQ7QUFBQTtBQUFBO0FBQUE7O0FBdUJYaUIsb0JBQVFDLEtBQVIsQ0FBYyxtQkFBZ0JMLFlBQVlHLElBQTVCLEVBQW1DRyxHQUFqRDtBQXZCVyxrQkF3QkwsZ0hBeEJLOztBQUFBO0FBQUE7QUFBQSxtQkEyQmEsMkJBQWVuQixHQUFmLENBM0JiOztBQUFBO0FBMkJQb0IsdUJBM0JPO0FBNEJUQywyQkE1QlM7QUE4QlBDLHVCQTlCTyxHQThCTyxzQkFBYztBQUNoQ0Msb0JBQU0sS0FEMEI7QUFFaENDLHlCQUFXO0FBRnFCLGFBQWQsRUFHakJKLFlBQVlLLHNCQUhLLEVBR21CO0FBQ3JDQyx5QkFBVztBQUFBLGdGQUFDLGlCQUFPQyxTQUFQLEVBQWtCQyxlQUFsQixFQUFtQ0MsU0FBbkMsRUFBOENDLEtBQTlDLEVBQXFEQyxJQUFyRDtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ1YsOEJBQUlWLGVBQUosRUFBcUI7QUFDbkJBLDRDQUFnQlcsT0FBaEI7QUFDQXBCLDhDQUFrQixDQUFsQjtBQUNBSCw2Q0FBaUJILG9EQUFrRCxDQUFDTSxtQkFBbUIsQ0FBbkIsR0FBdUIsUUFBdkIsR0FBa0MsS0FBbkMsRUFBMENGLElBQTVGLEVBQW9HQyxLQUFwRyxFQUFqQjtBQUNEO0FBTFM7QUFBQSxpQ0FNSixrQkFBR3NCLE1BQUgsQ0FBVSxlQUFLekIsT0FBTCxDQUFhbUIsU0FBYixFQUF3QixvQ0FBeEIsQ0FBVixDQU5JOztBQUFBO0FBQUE7QUFBQSxpQ0FPUyxvQ0FBVyxlQUFLTyxJQUFMLENBQVVQLFNBQVYsRUFBcUIsY0FBckIsQ0FBWCxDQVBUOztBQUFBO0FBT0pRLDhCQVBJO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxpRUFRUUEsSUFSUjs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQVFDQyw2QkFSRDtBQUFBO0FBQUEsaUNBU0Ysa0JBQUdILE1BQUgsQ0FBVUcsR0FBVixDQVRFOztBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTs7QUFBQTtBQUFBOztBQUFBO0FBQUE7O0FBQUE7QUFXVkw7O0FBWFU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsaUJBQUQ7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxnRkFZUjtBQUFBLG9EQUFVTSxJQUFWO0FBQVVBLHdCQUFWO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDRDVCLHlDQUFldUIsT0FBZjtBQURDO0FBQUEsaUNBRUssd0NBQW9CaEMsR0FBcEIsU0FBNEJxQyxJQUE1QixFQUZMOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGlCQVpROztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsZ0ZBZVIsa0JBQU9WLFNBQVAsRUFBa0JDLGVBQWxCLEVBQW1DQyxTQUFuQyxFQUE4Q0MsS0FBOUMsRUFBcURDLElBQXJEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGlDQUNLLHVCQUFZSixTQUFaLEVBQXVCQyxlQUF2QixFQUF3Q0MsU0FBeEMsRUFBbURDLEtBQW5ELENBREw7O0FBQUE7QUFFRFQsNENBQWtCZixJQUFJLHVCQUFKLEVBQTZCSyxLQUE3QixFQUFsQjtBQUNBb0I7O0FBSEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsaUJBZlE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxnRkFtQlIsa0JBQU9KLFNBQVAsRUFBa0JDLGVBQWxCLEVBQW1DQyxTQUFuQyxFQUE4Q0MsS0FBOUMsRUFBcURDLElBQXJEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsaUNBQytCLCtCQUFnQkosU0FBaEIsQ0FEL0I7O0FBQUE7QUFDS1csMkNBREw7O0FBRUQsOEJBQUlBLGtCQUFrQkMsTUFBbEIsSUFBNEJELGtCQUFrQkMsTUFBbEIsQ0FBeUJDLEtBQXpELEVBQWdFO0FBQzlELG1DQUFPRixrQkFBa0JDLE1BQWxCLENBQXlCQyxLQUFoQztBQUNEO0FBSkE7QUFBQSxpQ0FLSyxrQkFBR0MsU0FBSCxDQUFhLGVBQUtqQyxPQUFMLENBQWFtQixTQUFiLEVBQXdCLGNBQXhCLENBQWIsRUFBc0QseUJBQWVXLGlCQUFmLEVBQWtDLElBQWxDLEVBQXdDLENBQXhDLENBQXRELENBTEw7O0FBQUE7QUFNRFA7O0FBTkM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsaUJBbkJROztBQUFBO0FBQUE7QUFBQTtBQUFBLG1CQTBCUlcsTUExQlEsQ0EwQkR0QixZQUFZSyxzQkFBWixDQUFtQ0MsU0FBbkMsR0FBK0NOLFlBQVlLLHNCQUFaLENBQW1DQyxTQUFuQyxDQUE2Q2lCLEdBQTdDLENBQWlEO0FBQUEsdUJBQ3ZHLE9BQU9DLElBQVAsS0FBZ0IsUUFBaEIsR0FBMkIsNkJBQWM1QyxHQUFkLEVBQW1CLENBQUM0QyxJQUFELENBQW5CLENBQTNCLEdBQXdEQSxJQUQrQztBQUFBLGVBQWpELENBQS9DLEdBRU4sRUE1Qk8sQ0FEMEI7QUE4QnJDQyw0QkFBY3pCLFlBQVlLLHNCQUFaLENBQW1Db0IsWUFBbkMsR0FBa0R6QixZQUFZSyxzQkFBWixDQUFtQ29CLFlBQW5DLENBQWdERixHQUFoRCxDQUFvRDtBQUFBLHVCQUNqSCxPQUFPQyxJQUFQLEtBQWdCLFFBQWhCLEdBQTJCLDZCQUFjNUMsR0FBZCxFQUFtQixDQUFDNEMsSUFBRCxDQUFuQixDQUEzQixHQUF3REEsSUFEeUQ7QUFBQSxlQUFwRCxDQUFsRCxHQUVWLEVBaENpQztBQWlDckM1QyxzQkFqQ3FDO0FBa0NyQ0ksd0JBbENxQztBQW1DckNDLGdDQW5DcUM7QUFvQ3JDeUMsbUJBQUt2QyxNQXBDZ0M7QUFxQ3JDcUIsK0JBQWlCZixZQUFZa0MsZUFBWixDQUE0QiwyQkFBNUI7QUFyQ29CLGFBSG5CLENBOUJQOztBQXdFYnpCLHdCQUFZMEIsS0FBWixHQUFvQixJQUFwQjs7QUF4RWEsa0JBeUVULHNCQUFPMUIsWUFBWUMsSUFBbkIsTUFBNEIsUUFBNUIsSUFBd0NELFlBQVlDLElBQVosQ0FBaUIwQixNQXpFaEQ7QUFBQTtBQUFBO0FBQUE7O0FBMEVYNUIsNEJBQWdCNkIsSUFBaEI7QUExRVcsa0JBMkVMLElBQUlDLEtBQUosQ0FBVSwrRUFBVixDQTNFSzs7QUFBQTtBQUFBO0FBQUEsbUJBOEVQLG9CQUFRL0IsV0FBUixFQUFxQixnQkFBckIsQ0E5RU87O0FBQUE7QUFBQTtBQUFBLG1CQStFUCxvQkFBUUEsV0FBUixFQUFxQixZQUFyQixDQS9FTzs7QUFBQTs7QUFpRmJ0QixjQUFFLHdCQUFGLEVBQTRCd0IsV0FBNUI7O0FBakZhO0FBQUEsbUJBbUZQLGdEQUFlQSxXQUFmLENBbkZPOztBQUFBO0FBQUE7QUFBQSxtQkFxRlAsb0JBQVFGLFdBQVIsRUFBcUIsYUFBckIsQ0FyRk87O0FBQUE7O0FBdUZiQyw0QkFBZ0JXLE9BQWhCOztBQXZGYTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxHIiwiZmlsZSI6ImFwaS9wYWNrYWdlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICdjb2xvcnMnO1xuaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgZ2xvYiBmcm9tICdnbG9iJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHBpZnkgZnJvbSAncGlmeSc7XG5pbXBvcnQgcGFja2FnZXIgZnJvbSAnZWxlY3Ryb24tcGFja2FnZXInO1xuXG5pbXBvcnQgZWxlY3Ryb25Ib3N0QXJjaCBmcm9tICcuLi91dGlsL2VsZWN0cm9uLWhvc3QtYXJjaCc7XG5pbXBvcnQgZ2V0Rm9yZ2VDb25maWcgZnJvbSAnLi4vdXRpbC9mb3JnZS1jb25maWcnO1xuaW1wb3J0IHJ1bkhvb2sgZnJvbSAnLi4vdXRpbC9ob29rJztcbmltcG9ydCByZWFsT3JhLCB7IGZha2VPcmEgfSBmcm9tICcuLi91dGlsL29yYSc7XG5pbXBvcnQgcGFja2FnZXJDb21waWxlSG9vayBmcm9tICcuLi91dGlsL2NvbXBpbGUtaG9vayc7XG5pbXBvcnQgcmVhZFBhY2thZ2VKU09OIGZyb20gJy4uL3V0aWwvcmVhZC1wYWNrYWdlLWpzb24nO1xuaW1wb3J0IHJlYnVpbGRIb29rIGZyb20gJy4uL3V0aWwvcmVidWlsZCc7XG5pbXBvcnQgcmVxdWlyZVNlYXJjaCBmcm9tICcuLi91dGlsL3JlcXVpcmUtc2VhcmNoJztcbmltcG9ydCByZXNvbHZlRGlyIGZyb20gJy4uL3V0aWwvcmVzb2x2ZS1kaXInO1xuXG5jb25zdCBkID0gZGVidWcoJ2VsZWN0cm9uLWZvcmdlOnBhY2thZ2VyJyk7XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUGFja2FnZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZGlyPXByb2Nlc3MuY3dkKCldIFRoZSBwYXRoIHRvIHRoZSBhcHAgdG8gcGFja2FnZVxuICogQHByb3BlcnR5IHtib29sZWFufSBbaW50ZXJhY3RpdmU9ZmFsc2VdIFdoZXRoZXIgdG8gdXNlIHNlbnNpYmxlIGRlZmF1bHRzIG9yIHByb21wdCB0aGUgdXNlciB2aXN1YWxseVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFthcmNoPXByb2Nlc3MuYXJjaF0gVGhlIHRhcmdldCBhcmNoXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3BsYXRmb3JtPXByb2Nlc3MucGxhdGZvcm1dIFRoZSB0YXJnZXQgcGxhdGZvcm0uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW291dERpcj1gJHtkaXJ9L291dGBdIFRoZSBwYXRoIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5IGZvciBwYWNrYWdlZCBhcHBzXG4gKi9cblxuLyoqXG4gKiBQYWNrYWdlIGFuIEVsZWN0cm9uIGFwcGxpY2F0aW9uIGludG8gYW4gcGxhdGZvcm0gZGVwZW5kZW50IGZvcm1hdC5cbiAqXG4gKiBAcGFyYW0ge1BhY2thZ2VPcHRpb25zfSBwcm92aWRlZE9wdGlvbnMgLSBPcHRpb25zIGZvciB0aGUgUGFja2FnZSBtZXRob2RcbiAqIEByZXR1cm4ge1Byb21pc2V9IFdpbGwgcmVzb2x2ZSB3aGVuIHRoZSBwYWNrYWdlIHByb2Nlc3MgaXMgY29tcGxldGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgYXN5bmMgKHByb3ZpZGVkT3B0aW9ucyA9IHt9KSA9PiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3QsIG5vLXVudXNlZC12YXJzXG4gIGxldCB7IGRpciwgaW50ZXJhY3RpdmUsIGFyY2gsIHBsYXRmb3JtIH0gPSBPYmplY3QuYXNzaWduKHtcbiAgICBkaXI6IHByb2Nlc3MuY3dkKCksXG4gICAgaW50ZXJhY3RpdmU6IGZhbHNlLFxuICAgIGFyY2g6IGVsZWN0cm9uSG9zdEFyY2goKSxcbiAgICBwbGF0Zm9ybTogcHJvY2Vzcy5wbGF0Zm9ybSxcbiAgfSwgcHJvdmlkZWRPcHRpb25zKTtcblxuICBjb25zdCBvcmEgPSBpbnRlcmFjdGl2ZSA/IHJlYWxPcmEgOiBmYWtlT3JhO1xuXG4gIGNvbnN0IG91dERpciA9IHByb3ZpZGVkT3B0aW9ucy5vdXREaXIgfHwgcGF0aC5yZXNvbHZlKGRpciwgJ291dCcpO1xuICBsZXQgcHJlcGFyZVNwaW5uZXIgPSBvcmEoYFByZXBhcmluZyB0byBQYWNrYWdlIEFwcGxpY2F0aW9uIGZvciBhcmNoOiAkeyhhcmNoID09PSAnYWxsJyA/ICdpYTMyJyA6IGFyY2gpLmN5YW59YCkuc3RhcnQoKTtcbiAgbGV0IHByZXBhcmVDb3VudGVyID0gMDtcblxuICBkaXIgPSBhd2FpdCByZXNvbHZlRGlyKGRpcik7XG4gIGlmICghZGlyKSB7XG4gICAgdGhyb3cgJ0ZhaWxlZCB0byBsb2NhdGUgY29tcGlsYWJsZSBFbGVjdHJvbiBhcHBsaWNhdGlvbic7XG4gIH1cblxuICBjb25zdCBwYWNrYWdlSlNPTiA9IGF3YWl0IHJlYWRQYWNrYWdlSlNPTihkaXIpO1xuXG4gIGlmIChwYXRoLmRpcm5hbWUocmVxdWlyZS5yZXNvbHZlKHBhdGgucmVzb2x2ZShkaXIsIHBhY2thZ2VKU09OLm1haW4pKSkgPT09IGRpcikge1xuICAgIGNvbnNvbGUuZXJyb3IoYEVudHJ5IHBvaW50OiAke3BhY2thZ2VKU09OLm1haW59YC5yZWQpO1xuICAgIHRocm93ICdUaGUgZW50cnkgcG9pbnQgdG8geW91ciBhcHBsaWNhdGlvbiAoXCJwYWNrYWdlSlNPTi5tYWluXCIpIG11c3QgYmUgaW4gYSBzdWJmb2xkZXIgbm90IGluIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5JztcbiAgfVxuXG4gIGNvbnN0IGZvcmdlQ29uZmlnID0gYXdhaXQgZ2V0Rm9yZ2VDb25maWcoZGlyKTtcbiAgbGV0IHBhY2thZ2VyU3Bpbm5lcjtcblxuICBjb25zdCBwYWNrYWdlT3B0cyA9IE9iamVjdC5hc3NpZ24oe1xuICAgIGFzYXI6IGZhbHNlLFxuICAgIG92ZXJ3cml0ZTogdHJ1ZSxcbiAgfSwgZm9yZ2VDb25maWcuZWxlY3Ryb25QYWNrYWdlckNvbmZpZywge1xuICAgIGFmdGVyQ29weTogW2FzeW5jIChidWlsZFBhdGgsIGVsZWN0cm9uVmVyc2lvbiwgcFBsYXRmb3JtLCBwQXJjaCwgZG9uZSkgPT4ge1xuICAgICAgaWYgKHBhY2thZ2VyU3Bpbm5lcikge1xuICAgICAgICBwYWNrYWdlclNwaW5uZXIuc3VjY2VlZCgpO1xuICAgICAgICBwcmVwYXJlQ291bnRlciArPSAxO1xuICAgICAgICBwcmVwYXJlU3Bpbm5lciA9IG9yYShgUHJlcGFyaW5nIHRvIFBhY2thZ2UgQXBwbGljYXRpb24gZm9yIGFyY2g6ICR7KHByZXBhcmVDb3VudGVyID09PSAyID8gJ2FybXY3bCcgOiAneDY0JykuY3lhbn1gKS5zdGFydCgpO1xuICAgICAgfVxuICAgICAgYXdhaXQgZnMucmVtb3ZlKHBhdGgucmVzb2x2ZShidWlsZFBhdGgsICdub2RlX21vZHVsZXMvZWxlY3Ryb24tY29tcGlsZS90ZXN0JykpO1xuICAgICAgY29uc3QgYmlucyA9IGF3YWl0IHBpZnkoZ2xvYikocGF0aC5qb2luKGJ1aWxkUGF0aCwgJyoqLy5iaW4vKiovKicpKTtcbiAgICAgIGZvciAoY29uc3QgYmluIG9mIGJpbnMpIHtcbiAgICAgICAgYXdhaXQgZnMucmVtb3ZlKGJpbik7XG4gICAgICB9XG4gICAgICBkb25lKCk7XG4gICAgfSwgYXN5bmMgKC4uLmFyZ3MpID0+IHtcbiAgICAgIHByZXBhcmVTcGlubmVyLnN1Y2NlZWQoKTtcbiAgICAgIGF3YWl0IHBhY2thZ2VyQ29tcGlsZUhvb2soZGlyLCAuLi5hcmdzKTtcbiAgICB9LCBhc3luYyAoYnVpbGRQYXRoLCBlbGVjdHJvblZlcnNpb24sIHBQbGF0Zm9ybSwgcEFyY2gsIGRvbmUpID0+IHtcbiAgICAgIGF3YWl0IHJlYnVpbGRIb29rKGJ1aWxkUGF0aCwgZWxlY3Ryb25WZXJzaW9uLCBwUGxhdGZvcm0sIHBBcmNoKTtcbiAgICAgIHBhY2thZ2VyU3Bpbm5lciA9IG9yYSgnUGFja2FnaW5nIEFwcGxpY2F0aW9uJykuc3RhcnQoKTtcbiAgICAgIGRvbmUoKTtcbiAgICB9LCBhc3luYyAoYnVpbGRQYXRoLCBlbGVjdHJvblZlcnNpb24sIHBQbGF0Zm9ybSwgcEFyY2gsIGRvbmUpID0+IHtcbiAgICAgIGNvbnN0IGNvcGllZFBhY2thZ2VKU09OID0gYXdhaXQgcmVhZFBhY2thZ2VKU09OKGJ1aWxkUGF0aCk7XG4gICAgICBpZiAoY29waWVkUGFja2FnZUpTT04uY29uZmlnICYmIGNvcGllZFBhY2thZ2VKU09OLmNvbmZpZy5mb3JnZSkge1xuICAgICAgICBkZWxldGUgY29waWVkUGFja2FnZUpTT04uY29uZmlnLmZvcmdlO1xuICAgICAgfVxuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKHBhdGgucmVzb2x2ZShidWlsZFBhdGgsICdwYWNrYWdlLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkoY29waWVkUGFja2FnZUpTT04sIG51bGwsIDIpKTtcbiAgICAgIGRvbmUoKTtcbiAgICB9XS5jb25jYXQoZm9yZ2VDb25maWcuZWxlY3Ryb25QYWNrYWdlckNvbmZpZy5hZnRlckNvcHkgPyBmb3JnZUNvbmZpZy5lbGVjdHJvblBhY2thZ2VyQ29uZmlnLmFmdGVyQ29weS5tYXAoaXRlbSA9PlxuICAgICAgKHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyA/IHJlcXVpcmVTZWFyY2goZGlyLCBbaXRlbV0pIDogaXRlbSlcbiAgICApIDogW10pLFxuICAgIGFmdGVyRXh0cmFjdDogZm9yZ2VDb25maWcuZWxlY3Ryb25QYWNrYWdlckNvbmZpZy5hZnRlckV4dHJhY3QgPyBmb3JnZUNvbmZpZy5lbGVjdHJvblBhY2thZ2VyQ29uZmlnLmFmdGVyRXh0cmFjdC5tYXAoaXRlbSA9PlxuICAgICAgKHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyA/IHJlcXVpcmVTZWFyY2goZGlyLCBbaXRlbV0pIDogaXRlbSlcbiAgICApIDogW10sXG4gICAgZGlyLFxuICAgIGFyY2gsXG4gICAgcGxhdGZvcm0sXG4gICAgb3V0OiBvdXREaXIsXG4gICAgZWxlY3Ryb25WZXJzaW9uOiBwYWNrYWdlSlNPTi5kZXZEZXBlbmRlbmNpZXNbJ2VsZWN0cm9uLXByZWJ1aWx0LWNvbXBpbGUnXSxcbiAgfSk7XG4gIHBhY2thZ2VPcHRzLnF1aWV0ID0gdHJ1ZTtcbiAgaWYgKHR5cGVvZiBwYWNrYWdlT3B0cy5hc2FyID09PSAnb2JqZWN0JyAmJiBwYWNrYWdlT3B0cy5hc2FyLnVucGFjaykge1xuICAgIHBhY2thZ2VyU3Bpbm5lci5mYWlsKCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdlbGVjdHJvbi1jb21waWxlIGRvZXMgbm90IHN1cHBvcnQgYXNhci51bnBhY2sgeWV0LiAgUGxlYXNlIHVzZSBhc2FyLnVucGFja0RpcicpO1xuICB9XG5cbiAgYXdhaXQgcnVuSG9vayhmb3JnZUNvbmZpZywgJ2dlbmVyYXRlQXNzZXRzJyk7XG4gIGF3YWl0IHJ1bkhvb2soZm9yZ2VDb25maWcsICdwcmVQYWNrYWdlJyk7XG5cbiAgZCgncGFja2FnaW5nIHdpdGggb3B0aW9ucycsIHBhY2thZ2VPcHRzKTtcblxuICBhd2FpdCBwaWZ5KHBhY2thZ2VyKShwYWNrYWdlT3B0cyk7XG5cbiAgYXdhaXQgcnVuSG9vayhmb3JnZUNvbmZpZywgJ3Bvc3RQYWNrYWdlJyk7XG5cbiAgcGFja2FnZXJTcGlubmVyLnN1Y2NlZWQoKTtcbn07XG4iXX0=