UNPKG

verdaccio

Version:

A lightweight private npm proxy registry

167 lines (164 loc) 20.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.listenDefaultCallback = listenDefaultCallback; exports.startVerdaccio = startVerdaccio; var _console = require("console"); var _constants = _interopRequireDefault(require("constants")); var _fs = _interopRequireDefault(require("fs")); var _http = _interopRequireDefault(require("http")); var _https = _interopRequireDefault(require("https")); var _lodash = require("lodash"); var _url = _interopRequireDefault(require("url")); var _config = require("@verdaccio/config"); var _index = _interopRequireDefault(require("../api/index")); var _constants2 = require("./constants"); var _experiments = require("./experiments"); var _logger = require("./logger"); var _utils = require("./utils"); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } /** * Trigger the server after configuration has been loaded. * @param {Object} config * @param {Object} cliArguments * @param {String} configPath * @param {String} pkgVersion * @param {String} pkgName * @deprecated use runServer instead */ function startVerdaccio(config, cliListen, configPath, pkgVersion, pkgName, callback) { if ((0, _lodash.isObject)(config) === false) { throw new Error(_constants2.API_ERROR.CONFIG_BAD_FORMAT); } (0, _utils.initLogger)(config); // merge flags and experiments for backward compatibility const flags = { ...(config?.flags || {}), ...(config?.experiments || {}) }; (0, _experiments.displayExperimentsInfoBox)(flags); _logger.logger.warn('This is a deprecated method, please use runServer instead'); (0, _index.default)(config).then(app => { const listen = cliListen ?? config?.listen; const addr = (0, _config.getListenAddress)(listen, _logger.logger); let webServer; if (addr.proto === 'https') { webServer = handleHTTPS(app, configPath, config); } else { // http webServer = _http.default.createServer(app); } if (webServer && typeof config?.server?.keepAliveTimeout === 'number') { // library definition for node is not up to date (doesn't contain recent 8.0 changes) webServer.keepAliveTimeout = config.server.keepAliveTimeout * 1000; } unlinkAddressPath(addr); callback(webServer, addr, pkgName, pkgVersion); }); } function unlinkAddressPath(addr) { if (addr.path && _fs.default.existsSync(addr.path)) { _fs.default.unlinkSync(addr.path); } } function handleHTTPS(app, configPath, config) { try { let httpsOptions = { secureOptions: _constants.default.SSL_OP_NO_SSLv2 | _constants.default.SSL_OP_NO_SSLv3 // disable insecure SSLv2 and SSLv3 }; const keyCertConfig = config.https; const pfxConfig = config.https; const missingKeyCert = !(keyCertConfig.key && keyCertConfig.cert); (0, _console.debug)('missingKeyCert', missingKeyCert); const missingPfx = !pfxConfig.pfx; (0, _console.debug)('missingPfx', missingPfx); if (missingKeyCert && missingPfx) { (0, _console.debug)('No HTTPS configuration found'); (0, _utils.logHTTPSWarning)(configPath); throw new Error('No HTTPS configuration found'); } (0, _console.debug)('HTTPS configuration found'); if (pfxConfig.pfx) { (0, _console.debug)('Using PFX configuration'); const { pfx, passphrase } = pfxConfig; httpsOptions = (0, _lodash.assign)(httpsOptions, { pfx: _fs.default.readFileSync(pfx), passphrase: passphrase || '' }); } else { (0, _console.debug)('Using Key/Cert configuration'); const { key, cert, ca } = keyCertConfig; httpsOptions = (0, _lodash.assign)(httpsOptions, { key: _fs.default.readFileSync(key), cert: _fs.default.readFileSync(cert), ...(ca && { ca: _fs.default.readFileSync(ca) }) }); } return _https.default.createServer(httpsOptions, app); } catch (err) { // catch errors related to certificate loading _logger.logger.fatal({ err: err }, 'cannot create https server: @{err.message}'); process.exit(2); } } /** * * @param webServer * @param addr * @param pkgName * @param pkgVersion * @deprecated use initServer instead */ function listenDefaultCallback(webServer, addr, pkgName, pkgVersion) { const server = webServer.listen(addr.port || addr.path, addr.host, () => { // send a message for tests if ((0, _lodash.isFunction)(process.send)) { process.send({ verdaccio_started: true }); } }).on('error', function (err) { _logger.logger.fatal({ err: err }, 'cannot create http server: @{err.message}'); process.exit(2); }); function handleShutdownGracefully() { _logger.logger.fatal('received shutdown signal - closing server gracefully...'); server.close(() => { _logger.logger.info('server closed.'); process.exit(0); }); } // handle shutdown signals nicely when environment says so if (process.env.VERDACCIO_HANDLE_KILL_SIGNALS === 'true') { process.on('SIGINT', handleShutdownGracefully); process.on('SIGTERM', handleShutdownGracefully); process.on('SIGHUP', handleShutdownGracefully); } _logger.logger.warn({ addr: addr.path ? _url.default.format({ protocol: 'unix', pathname: addr.path }) : _url.default.format({ protocol: addr.proto, hostname: addr.host, port: addr.port, pathname: '/' }), version: pkgName + '/' + pkgVersion }, 'http address - @{addr} - @{version}'); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29uc29sZSIsInJlcXVpcmUiLCJfY29uc3RhbnRzIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9mcyIsIl9odHRwIiwiX2h0dHBzIiwiX2xvZGFzaCIsIl91cmwiLCJfY29uZmlnIiwiX2luZGV4IiwiX2NvbnN0YW50czIiLCJfZXhwZXJpbWVudHMiLCJfbG9nZ2VyIiwiX3V0aWxzIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0Iiwic3RhcnRWZXJkYWNjaW8iLCJjb25maWciLCJjbGlMaXN0ZW4iLCJjb25maWdQYXRoIiwicGtnVmVyc2lvbiIsInBrZ05hbWUiLCJjYWxsYmFjayIsImlzT2JqZWN0IiwiRXJyb3IiLCJBUElfRVJST1IiLCJDT05GSUdfQkFEX0ZPUk1BVCIsImluaXRMb2dnZXIiLCJmbGFncyIsImV4cGVyaW1lbnRzIiwiZGlzcGxheUV4cGVyaW1lbnRzSW5mb0JveCIsImxvZ2dlciIsIndhcm4iLCJlbmRQb2ludEFQSSIsInRoZW4iLCJhcHAiLCJsaXN0ZW4iLCJhZGRyIiwiZ2V0TGlzdGVuQWRkcmVzcyIsIndlYlNlcnZlciIsInByb3RvIiwiaGFuZGxlSFRUUFMiLCJodHRwIiwiY3JlYXRlU2VydmVyIiwic2VydmVyIiwia2VlcEFsaXZlVGltZW91dCIsInVubGlua0FkZHJlc3NQYXRoIiwicGF0aCIsImZzIiwiZXhpc3RzU3luYyIsInVubGlua1N5bmMiLCJodHRwc09wdGlvbnMiLCJzZWN1cmVPcHRpb25zIiwiY29uc3RhbnRzIiwiU1NMX09QX05PX1NTTHYyIiwiU1NMX09QX05PX1NTTHYzIiwia2V5Q2VydENvbmZpZyIsImh0dHBzIiwicGZ4Q29uZmlnIiwibWlzc2luZ0tleUNlcnQiLCJrZXkiLCJjZXJ0IiwiZGVidWciLCJtaXNzaW5nUGZ4IiwicGZ4IiwibG9nSFRUUFNXYXJuaW5nIiwicGFzc3BocmFzZSIsImFzc2lnbiIsInJlYWRGaWxlU3luYyIsImNhIiwiZXJyIiwiZmF0YWwiLCJwcm9jZXNzIiwiZXhpdCIsImxpc3RlbkRlZmF1bHRDYWxsYmFjayIsInBvcnQiLCJob3N0IiwiaXNGdW5jdGlvbiIsInNlbmQiLCJ2ZXJkYWNjaW9fc3RhcnRlZCIsIm9uIiwiaGFuZGxlU2h1dGRvd25HcmFjZWZ1bGx5IiwiY2xvc2UiLCJpbmZvIiwiZW52IiwiVkVSREFDQ0lPX0hBTkRMRV9LSUxMX1NJR05BTFMiLCJVUkwiLCJmb3JtYXQiLCJwcm90b2NvbCIsInBhdGhuYW1lIiwiaG9zdG5hbWUiLCJ2ZXJzaW9uIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9ib290c3RyYXAudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVidWcgfSBmcm9tICdjb25zb2xlJztcbmltcG9ydCBjb25zdGFudHMgZnJvbSAnY29uc3RhbnRzJztcbmltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHsgQXBwbGljYXRpb24gfSBmcm9tICdleHByZXNzJztcbmltcG9ydCBmcyBmcm9tICdmcyc7XG5pbXBvcnQgaHR0cCBmcm9tICdodHRwJztcbmltcG9ydCBodHRwcyBmcm9tICdodHRwcyc7XG5pbXBvcnQgeyBhc3NpZ24sIGlzRnVuY3Rpb24sIGlzT2JqZWN0IH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBVUkwgZnJvbSAndXJsJztcblxuaW1wb3J0IHsgZ2V0TGlzdGVuQWRkcmVzcyB9IGZyb20gJ0B2ZXJkYWNjaW8vY29uZmlnJztcbmltcG9ydCB7IENhbGxiYWNrLCBDb25maWdZYW1sLCBIdHRwc0NvbmZLZXlDZXJ0LCBIdHRwc0NvbmZQZnggfSBmcm9tICdAdmVyZGFjY2lvL3R5cGVzJztcblxuaW1wb3J0IGVuZFBvaW50QVBJIGZyb20gJy4uL2FwaS9pbmRleCc7XG5pbXBvcnQgeyBBUElfRVJST1IgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBkaXNwbGF5RXhwZXJpbWVudHNJbmZvQm94IH0gZnJvbSAnLi9leHBlcmltZW50cyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgeyBpbml0TG9nZ2VyLCBsb2dIVFRQU1dhcm5pbmcgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBUcmlnZ2VyIHRoZSBzZXJ2ZXIgYWZ0ZXIgY29uZmlndXJhdGlvbiBoYXMgYmVlbiBsb2FkZWQuXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnXG4gKiBAcGFyYW0ge09iamVjdH0gY2xpQXJndW1lbnRzXG4gKiBAcGFyYW0ge1N0cmluZ30gY29uZmlnUGF0aFxuICogQHBhcmFtIHtTdHJpbmd9IHBrZ1ZlcnNpb25cbiAqIEBwYXJhbSB7U3RyaW5nfSBwa2dOYW1lXG4gKiBAZGVwcmVjYXRlZCB1c2UgcnVuU2VydmVyIGluc3RlYWRcbiAqL1xuZnVuY3Rpb24gc3RhcnRWZXJkYWNjaW8oXG4gIGNvbmZpZzogQ29uZmlnWWFtbCxcbiAgY2xpTGlzdGVuOiBzdHJpbmcsXG4gIGNvbmZpZ1BhdGg6IHN0cmluZyxcbiAgcGtnVmVyc2lvbjogc3RyaW5nLFxuICBwa2dOYW1lOiBzdHJpbmcsXG4gIGNhbGxiYWNrOiBDYWxsYmFja1xuKTogdm9pZCB7XG4gIGlmIChpc09iamVjdChjb25maWcpID09PSBmYWxzZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihBUElfRVJST1IuQ09ORklHX0JBRF9GT1JNQVQpO1xuICB9XG5cbiAgaW5pdExvZ2dlcihjb25maWcpO1xuXG4gIC8vIG1lcmdlIGZsYWdzIGFuZCBleHBlcmltZW50cyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICBjb25zdCBmbGFncyA9IHtcbiAgICAuLi4oY29uZmlnPy5mbGFncyB8fCB7fSksXG4gICAgLi4uKGNvbmZpZz8uZXhwZXJpbWVudHMgfHwge30pLFxuICB9O1xuICBkaXNwbGF5RXhwZXJpbWVudHNJbmZvQm94KGZsYWdzKTtcbiAgbG9nZ2VyLndhcm4oJ1RoaXMgaXMgYSBkZXByZWNhdGVkIG1ldGhvZCwgcGxlYXNlIHVzZSBydW5TZXJ2ZXIgaW5zdGVhZCcpO1xuXG4gIGVuZFBvaW50QVBJKGNvbmZpZykudGhlbigoYXBwKTogdm9pZCA9PiB7XG4gICAgY29uc3QgbGlzdGVuID0gY2xpTGlzdGVuID8/IGNvbmZpZz8ubGlzdGVuO1xuICAgIGNvbnN0IGFkZHIgPSBnZXRMaXN0ZW5BZGRyZXNzKGxpc3RlbiwgbG9nZ2VyKTtcbiAgICBsZXQgd2ViU2VydmVyO1xuICAgIGlmIChhZGRyLnByb3RvID09PSAnaHR0cHMnKSB7XG4gICAgICB3ZWJTZXJ2ZXIgPSBoYW5kbGVIVFRQUyhhcHAsIGNvbmZpZ1BhdGgsIGNvbmZpZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGh0dHBcbiAgICAgIHdlYlNlcnZlciA9IGh0dHAuY3JlYXRlU2VydmVyKGFwcCk7XG4gICAgfVxuICAgIGlmICh3ZWJTZXJ2ZXIgJiYgdHlwZW9mIGNvbmZpZz8uc2VydmVyPy5rZWVwQWxpdmVUaW1lb3V0ID09PSAnbnVtYmVyJykge1xuICAgICAgLy8gbGlicmFyeSBkZWZpbml0aW9uIGZvciBub2RlIGlzIG5vdCB1cCB0byBkYXRlIChkb2Vzbid0IGNvbnRhaW4gcmVjZW50IDguMCBjaGFuZ2VzKVxuICAgICAgd2ViU2VydmVyLmtlZXBBbGl2ZVRpbWVvdXQgPSBjb25maWcuc2VydmVyLmtlZXBBbGl2ZVRpbWVvdXQgKiAxMDAwO1xuICAgIH1cbiAgICB1bmxpbmtBZGRyZXNzUGF0aChhZGRyKTtcbiAgICBjYWxsYmFjayh3ZWJTZXJ2ZXIsIGFkZHIsIHBrZ05hbWUsIHBrZ1ZlcnNpb24pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gdW5saW5rQWRkcmVzc1BhdGgoYWRkcikge1xuICBpZiAoYWRkci5wYXRoICYmIGZzLmV4aXN0c1N5bmMoYWRkci5wYXRoKSkge1xuICAgIGZzLnVubGlua1N5bmMoYWRkci5wYXRoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVIVFRQUyhcbiAgYXBwOiBleHByZXNzLkFwcGxpY2F0aW9uLFxuICBjb25maWdQYXRoOiBzdHJpbmcsXG4gIGNvbmZpZzogQ29uZmlnWWFtbFxuKTogaHR0cHMuU2VydmVyIHtcbiAgdHJ5IHtcbiAgICBsZXQgaHR0cHNPcHRpb25zID0ge1xuICAgICAgc2VjdXJlT3B0aW9uczogY29uc3RhbnRzLlNTTF9PUF9OT19TU0x2MiB8IGNvbnN0YW50cy5TU0xfT1BfTk9fU1NMdjMsIC8vIGRpc2FibGUgaW5zZWN1cmUgU1NMdjIgYW5kIFNTTHYzXG4gICAgfTtcbiAgICBjb25zdCBrZXlDZXJ0Q29uZmlnID0gY29uZmlnLmh0dHBzIGFzIEh0dHBzQ29uZktleUNlcnQ7XG4gICAgY29uc3QgcGZ4Q29uZmlnID0gY29uZmlnLmh0dHBzIGFzIEh0dHBzQ29uZlBmeDtcblxuICAgIGNvbnN0IG1pc3NpbmdLZXlDZXJ0ID0gIShrZXlDZXJ0Q29uZmlnLmtleSAmJiBrZXlDZXJ0Q29uZmlnLmNlcnQpO1xuICAgIGRlYnVnKCdtaXNzaW5nS2V5Q2VydCcsIG1pc3NpbmdLZXlDZXJ0KTtcbiAgICBjb25zdCBtaXNzaW5nUGZ4ID0gIXBmeENvbmZpZy5wZng7XG4gICAgZGVidWcoJ21pc3NpbmdQZngnLCBtaXNzaW5nUGZ4KTtcblxuICAgIGlmIChtaXNzaW5nS2V5Q2VydCAmJiBtaXNzaW5nUGZ4KSB7XG4gICAgICBkZWJ1ZygnTm8gSFRUUFMgY29uZmlndXJhdGlvbiBmb3VuZCcpO1xuICAgICAgbG9nSFRUUFNXYXJuaW5nKGNvbmZpZ1BhdGgpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBIVFRQUyBjb25maWd1cmF0aW9uIGZvdW5kJyk7XG4gICAgfVxuXG4gICAgZGVidWcoJ0hUVFBTIGNvbmZpZ3VyYXRpb24gZm91bmQnKTtcbiAgICBpZiAocGZ4Q29uZmlnLnBmeCkge1xuICAgICAgZGVidWcoJ1VzaW5nIFBGWCBjb25maWd1cmF0aW9uJyk7XG4gICAgICBjb25zdCB7IHBmeCwgcGFzc3BocmFzZSB9ID0gcGZ4Q29uZmlnO1xuICAgICAgaHR0cHNPcHRpb25zID0gYXNzaWduKGh0dHBzT3B0aW9ucywge1xuICAgICAgICBwZng6IGZzLnJlYWRGaWxlU3luYyhwZngpLFxuICAgICAgICBwYXNzcGhyYXNlOiBwYXNzcGhyYXNlIHx8ICcnLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlYnVnKCdVc2luZyBLZXkvQ2VydCBjb25maWd1cmF0aW9uJyk7XG4gICAgICBjb25zdCB7IGtleSwgY2VydCwgY2EgfSA9IGtleUNlcnRDb25maWc7XG4gICAgICBodHRwc09wdGlvbnMgPSBhc3NpZ24oaHR0cHNPcHRpb25zLCB7XG4gICAgICAgIGtleTogZnMucmVhZEZpbGVTeW5jKGtleSksXG4gICAgICAgIGNlcnQ6IGZzLnJlYWRGaWxlU3luYyhjZXJ0KSxcbiAgICAgICAgLi4uKGNhICYmIHtcbiAgICAgICAgICBjYTogZnMucmVhZEZpbGVTeW5jKGNhKSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGh0dHBzLmNyZWF0ZVNlcnZlcihodHRwc09wdGlvbnMsIGFwcCk7XG4gIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgLy8gY2F0Y2ggZXJyb3JzIHJlbGF0ZWQgdG8gY2VydGlmaWNhdGUgbG9hZGluZ1xuICAgIGxvZ2dlci5mYXRhbCh7IGVycjogZXJyIH0sICdjYW5ub3QgY3JlYXRlIGh0dHBzIHNlcnZlcjogQHtlcnIubWVzc2FnZX0nKTtcbiAgICBwcm9jZXNzLmV4aXQoMik7XG4gIH1cbn1cbi8qKlxuICpcbiAqIEBwYXJhbSB3ZWJTZXJ2ZXJcbiAqIEBwYXJhbSBhZGRyXG4gKiBAcGFyYW0gcGtnTmFtZVxuICogQHBhcmFtIHBrZ1ZlcnNpb25cbiAqIEBkZXByZWNhdGVkIHVzZSBpbml0U2VydmVyIGluc3RlYWRcbiAqL1xuZnVuY3Rpb24gbGlzdGVuRGVmYXVsdENhbGxiYWNrKFxuICB3ZWJTZXJ2ZXI6IEFwcGxpY2F0aW9uLFxuICBhZGRyOiBhbnksXG4gIHBrZ05hbWU6IHN0cmluZyxcbiAgcGtnVmVyc2lvbjogc3RyaW5nXG4pOiB2b2lkIHtcbiAgY29uc3Qgc2VydmVyID0gd2ViU2VydmVyXG4gICAgLmxpc3RlbihhZGRyLnBvcnQgfHwgYWRkci5wYXRoLCBhZGRyLmhvc3QsICgpOiB2b2lkID0+IHtcbiAgICAgIC8vIHNlbmQgYSBtZXNzYWdlIGZvciB0ZXN0c1xuICAgICAgaWYgKGlzRnVuY3Rpb24ocHJvY2Vzcy5zZW5kKSkge1xuICAgICAgICBwcm9jZXNzLnNlbmQoe1xuICAgICAgICAgIHZlcmRhY2Npb19zdGFydGVkOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KVxuICAgIC5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKTogdm9pZCB7XG4gICAgICBsb2dnZXIuZmF0YWwoeyBlcnI6IGVyciB9LCAnY2Fubm90IGNyZWF0ZSBodHRwIHNlcnZlcjogQHtlcnIubWVzc2FnZX0nKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgyKTtcbiAgICB9KTtcblxuICBmdW5jdGlvbiBoYW5kbGVTaHV0ZG93bkdyYWNlZnVsbHkoKSB7XG4gICAgbG9nZ2VyLmZhdGFsKCdyZWNlaXZlZCBzaHV0ZG93biBzaWduYWwgLSBjbG9zaW5nIHNlcnZlciBncmFjZWZ1bGx5Li4uJyk7XG4gICAgc2VydmVyLmNsb3NlKCgpID0+IHtcbiAgICAgIGxvZ2dlci5pbmZvKCdzZXJ2ZXIgY2xvc2VkLicpO1xuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gaGFuZGxlIHNodXRkb3duIHNpZ25hbHMgbmljZWx5IHdoZW4gZW52aXJvbm1lbnQgc2F5cyBzb1xuICBpZiAocHJvY2Vzcy5lbnYuVkVSREFDQ0lPX0hBTkRMRV9LSUxMX1NJR05BTFMgPT09ICd0cnVlJykge1xuICAgIHByb2Nlc3Mub24oJ1NJR0lOVCcsIGhhbmRsZVNodXRkb3duR3JhY2VmdWxseSk7XG4gICAgcHJvY2Vzcy5vbignU0lHVEVSTScsIGhhbmRsZVNodXRkb3duR3JhY2VmdWxseSk7XG4gICAgcHJvY2Vzcy5vbignU0lHSFVQJywgaGFuZGxlU2h1dGRvd25HcmFjZWZ1bGx5KTtcbiAgfVxuXG4gIGxvZ2dlci53YXJuKFxuICAgIHtcbiAgICAgIGFkZHI6IGFkZHIucGF0aFxuICAgICAgICA/IFVSTC5mb3JtYXQoe1xuICAgICAgICAgICAgcHJvdG9jb2w6ICd1bml4JyxcbiAgICAgICAgICAgIHBhdGhuYW1lOiBhZGRyLnBhdGgsXG4gICAgICAgICAgfSlcbiAgICAgICAgOiBVUkwuZm9ybWF0KHtcbiAgICAgICAgICAgIHByb3RvY29sOiBhZGRyLnByb3RvLFxuICAgICAgICAgICAgaG9zdG5hbWU6IGFkZHIuaG9zdCxcbiAgICAgICAgICAgIHBvcnQ6IGFkZHIucG9ydCxcbiAgICAgICAgICAgIHBhdGhuYW1lOiAnLycsXG4gICAgICAgICAgfSksXG4gICAgICB2ZXJzaW9uOiBwa2dOYW1lICsgJy8nICsgcGtnVmVyc2lvbixcbiAgICB9LFxuICAgICdodHRwIGFkZHJlc3MgLSBAe2FkZHJ9IC0gQHt2ZXJzaW9ufSdcbiAgKTtcbn1cblxuZXhwb3J0IHsgc3RhcnRWZXJkYWNjaW8sIGxpc3RlbkRlZmF1bHRDYWxsYmFjayB9O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUEsSUFBQUEsUUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsVUFBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBR0EsSUFBQUcsR0FBQSxHQUFBRCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUksS0FBQSxHQUFBRixzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUssTUFBQSxHQUFBSCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQU0sT0FBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sSUFBQSxHQUFBTCxzQkFBQSxDQUFBRixPQUFBO0FBRUEsSUFBQVEsT0FBQSxHQUFBUixPQUFBO0FBR0EsSUFBQVMsTUFBQSxHQUFBUCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQVUsV0FBQSxHQUFBVixPQUFBO0FBQ0EsSUFBQVcsWUFBQSxHQUFBWCxPQUFBO0FBQ0EsSUFBQVksT0FBQSxHQUFBWixPQUFBO0FBQ0EsSUFBQWEsTUFBQSxHQUFBYixPQUFB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