verdaccio
Version:
A lightweight private npm proxy registry
152 lines (148 loc) • 24 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.createServerFactory = createServerFactory;
exports.displayExperimentsInfoBox = displayExperimentsInfoBox;
exports.runServer = runServer;
var _constants = _interopRequireDefault(require("constants"));
var _debug = _interopRequireDefault(require("debug"));
var _fs = _interopRequireDefault(require("fs"));
var _http = _interopRequireDefault(require("http"));
var _https = _interopRequireDefault(require("https"));
var _lodash = _interopRequireWildcard(require("lodash"));
var _path = _interopRequireDefault(require("path"));
var _index = _interopRequireDefault(require("../api/index"));
var _utils = require("./cli/utils");
var _configPath = _interopRequireDefault(require("./config-path"));
var _constants2 = require("./constants");
var _utils2 = require("./utils");
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
const debug = (0, _debug.default)('verdaccio');
const logger = require('./logger');
function displayExperimentsInfoBox(flags) {
if (!flags) {
return;
}
const experimentList = Object.keys(flags);
if (experimentList.length >= 1) {
logger.warn(
// eslint-disable-next-line max-len
`experiments are enabled, it is recommended do not use experiments in production comment out this section to disable it`);
experimentList.forEach(experiment => {
// eslint-disable-next-line max-len
logger.info(`support for experiment [${experiment}] ${flags[experiment] ? 'is enabled' : ' is disabled'}`);
});
}
}
/**
* Exposes a server factory to be instantiated programmatically.
*
const app = await runServer(); // default configuration
const app = await runServer('./config/config.yaml');
const app = await runServer({ configuration });
app.listen(4000, (event) => {
// do something
});
* @param config
*/
async function runServer(config) {
let configurationParsed;
if (config === undefined || typeof config === 'string') {
const configPathLocation = (0, _configPath.default)(config);
configurationParsed = (0, _utils2.parseConfigFile)(configPathLocation);
if (!configurationParsed.self_path) {
configurationParsed.self_path = _path.default.resolve(configPathLocation);
}
} else if (_lodash.default.isObject(config)) {
configurationParsed = config;
if (!configurationParsed.self_path) {
throw new Error('self_path is required, please provide a valid root path for storage');
}
} else {
throw new Error(_constants2.API_ERROR.CONFIG_BAD_FORMAT);
}
const addresses = (0, _utils.getListListenAddresses)(undefined, configurationParsed.listen);
if (addresses.length > 1) {
process.emitWarning('You have specified multiple listen addresses, using this method only the first will be used');
}
const app = await (0, _index.default)(configurationParsed);
return createServerFactory(configurationParsed, addresses[0], app);
}
/**
* Return a native HTTP/HTTPS server instance
* @param config
* @param addr
* @param app
*/
function createServerFactory(config, addr, app) {
let serverFactory;
if (addr.proto === 'https') {
debug('https enabled');
try {
let httpsOptions = {
// disable insecure SSLv2 and SSLv3
secureOptions: _constants.default.SSL_OP_NO_SSLv2 | _constants.default.SSL_OP_NO_SSLv3
};
const keyCertConfig = config.https;
const pfxConfig = config.https;
// https must either have key and cert or a pfx and (optionally) a passphrase
if (!(keyCertConfig.key && keyCertConfig.cert || pfxConfig.pfx)) {
throw Error('bad format https configuration');
}
if (pfxConfig.pfx) {
const {
pfx,
passphrase
} = pfxConfig;
httpsOptions = (0, _lodash.assign)(httpsOptions, {
pfx: _fs.default.readFileSync(pfx),
passphrase: passphrase || ''
});
} else {
const {
key,
cert,
ca
} = keyCertConfig;
httpsOptions = (0, _lodash.assign)(httpsOptions, _objectSpread({
key: _fs.default.readFileSync(key),
cert: _fs.default.readFileSync(cert)
}, ca && {
ca: _fs.default.readFileSync(ca)
}));
}
// TODO: enable http2 as feature
// if (config.server.http2) <-- check if force http2
serverFactory = _https.default.createServer(httpsOptions, app);
} catch (err) {
throw new Error(`cannot create https server: ${err.message}`);
}
} else {
// http
debug('http enabled');
serverFactory = _http.default.createServer(app);
}
if (config.server && typeof config.server.keepAliveTimeout !== 'undefined' &&
// @ts-ignore
config.server.keepAliveTimeout !== 'null') {
// library definition for node is not up to date (doesn't contain recent 8.0 changes)
serverFactory.keepAliveTimeout = config.server.keepAliveTimeout * 1000;
}
// FIXE: I could not find the reason of this code.
unlinkAddressPath(addr);
return serverFactory;
}
function unlinkAddressPath(addr) {
if (addr.path && _fs.default.existsSync(addr.path)) {
_fs.default.unlinkSync(addr.path);
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29uc3RhbnRzIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZGVidWciLCJfZnMiLCJfaHR0cCIsIl9odHRwcyIsIl9sb2Rhc2giLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9wYXRoIiwiX2luZGV4IiwiX3V0aWxzIiwiX2NvbmZpZ1BhdGgiLCJfY29uc3RhbnRzMiIsIl91dGlsczIiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsIl90b1Byb3BlcnR5S2V5IiwidmFsdWUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsIl90b1ByaW1pdGl2ZSIsIlN5bWJvbCIsInRvUHJpbWl0aXZlIiwiVHlwZUVycm9yIiwiU3RyaW5nIiwiTnVtYmVyIiwiZGVidWciLCJidWlsZERlYnVnIiwibG9nZ2VyIiwiZGlzcGxheUV4cGVyaW1lbnRzSW5mb0JveCIsImZsYWdzIiwiZXhwZXJpbWVudExpc3QiLCJ3YXJuIiwiZXhwZXJpbWVudCIsImluZm8iLCJydW5TZXJ2ZXIiLCJjb25maWciLCJjb25maWd1cmF0aW9uUGFyc2VkIiwidW5kZWZpbmVkIiwiY29uZmlnUGF0aExvY2F0aW9uIiwiZmluZENvbmZpZ0ZpbGUiLCJwYXJzZUNvbmZpZ0ZpbGUiLCJzZWxmX3BhdGgiLCJwYXRoIiwicmVzb2x2ZSIsIl8iLCJpc09iamVjdCIsIkVycm9yIiwiQVBJX0VSUk9SIiwiQ09ORklHX0JBRF9GT1JNQVQiLCJhZGRyZXNzZXMiLCJnZXRMaXN0TGlzdGVuQWRkcmVzc2VzIiwibGlzdGVuIiwicHJvY2VzcyIsImVtaXRXYXJuaW5nIiwiYXBwIiwiZW5kUG9pbnRBUEkiLCJjcmVhdGVTZXJ2ZXJGYWN0b3J5IiwiYWRkciIsInNlcnZlckZhY3RvcnkiLCJwcm90byIsImh0dHBzT3B0aW9ucyIsInNlY3VyZU9wdGlvbnMiLCJjb25zdGFudHMiLCJTU0xfT1BfTk9fU1NMdjIiLCJTU0xfT1BfTk9fU1NMdjMiLCJrZXlDZXJ0Q29uZmlnIiwiaHR0cHMiLCJwZnhDb25maWciLCJrZXkiLCJjZXJ0IiwicGZ4IiwicGFzc3BocmFzZSIsImFzc2lnbiIsImZzIiwicmVhZEZpbGVTeW5jIiwiY2EiLCJjcmVhdGVTZXJ2ZXIiLCJlcnIiLCJtZXNzYWdlIiwiaHR0cCIsInNlcnZlciIsImtlZXBBbGl2ZVRpbWVvdXQiLCJ1bmxpbmtBZGRyZXNzUGF0aCIsImV4aXN0c1N5bmMiLCJ1bmxpbmtTeW5jIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9ydW4tc2VydmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjb25zdGFudHMgZnJvbSAnY29uc3RhbnRzJztcbmltcG9ydCBidWlsZERlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCBmcyBmcm9tICdmcyc7XG5pbXBvcnQgaHR0cCBmcm9tICdodHRwJztcbmltcG9ydCBodHRwcyBmcm9tICdodHRwcyc7XG5pbXBvcnQgXywgeyBhc3NpZ24gfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7IENvbmZpZywgSHR0cHNDb25mS2V5Q2VydCwgSHR0cHNDb25mUGZ4IH0gZnJvbSAnQHZlcmRhY2Npby90eXBlcyc7XG5cbmltcG9ydCBlbmRQb2ludEFQSSBmcm9tICcuLi9hcGkvaW5kZXgnO1xuaW1wb3J0IHsgZ2V0TGlzdExpc3RlbkFkZHJlc3NlcyB9IGZyb20gJy4vY2xpL3V0aWxzJztcbmltcG9ydCBmaW5kQ29uZmlnRmlsZSBmcm9tICcuL2NvbmZpZy1wYXRoJztcbmltcG9ydCB7IEFQSV9FUlJPUiB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IHBhcnNlQ29uZmlnRmlsZSB9IGZyb20gJy4vdXRpbHMnO1xuXG5jb25zdCBkZWJ1ZyA9IGJ1aWxkRGVidWcoJ3ZlcmRhY2NpbycpO1xuXG5jb25zdCBsb2dnZXIgPSByZXF1aXJlKCcuL2xvZ2dlcicpO1xuXG5leHBvcnQgZnVuY3Rpb24gZGlzcGxheUV4cGVyaW1lbnRzSW5mb0JveChmbGFncykge1xuICBpZiAoIWZsYWdzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZXhwZXJpbWVudExpc3QgPSBPYmplY3Qua2V5cyhmbGFncyk7XG4gIGlmIChleHBlcmltZW50TGlzdC5sZW5ndGggPj0gMSkge1xuICAgIGxvZ2dlci53YXJuKFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgIGBleHBlcmltZW50cyBhcmUgZW5hYmxlZCwgaXQgaXMgcmVjb21tZW5kZWQgZG8gbm90IHVzZSBleHBlcmltZW50cyBpbiBwcm9kdWN0aW9uIGNvbW1lbnQgb3V0IHRoaXMgc2VjdGlvbiB0byBkaXNhYmxlIGl0YFxuICAgICk7XG4gICAgZXhwZXJpbWVudExpc3QuZm9yRWFjaCgoZXhwZXJpbWVudCkgPT4ge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICBgc3VwcG9ydCBmb3IgZXhwZXJpbWVudCBbJHtleHBlcmltZW50fV0gJHtcbiAgICAgICAgICBmbGFnc1tleHBlcmltZW50XSA/ICdpcyBlbmFibGVkJyA6ICcgaXMgZGlzYWJsZWQnXG4gICAgICAgIH1gXG4gICAgICApO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogRXhwb3NlcyBhIHNlcnZlciBmYWN0b3J5IHRvIGJlIGluc3RhbnRpYXRlZCBwcm9ncmFtbWF0aWNhbGx5LlxuICpcbiAgICBjb25zdCBhcHAgPSBhd2FpdCBydW5TZXJ2ZXIoKTsgLy8gZGVmYXVsdCBjb25maWd1cmF0aW9uXG4gICAgY29uc3QgYXBwID0gYXdhaXQgcnVuU2VydmVyKCcuL2NvbmZpZy9jb25maWcueWFtbCcpO1xuICAgIGNvbnN0IGFwcCA9IGF3YWl0IHJ1blNlcnZlcih7IGNvbmZpZ3VyYXRpb24gfSk7XG4gICAgYXBwLmxpc3Rlbig0MDAwLCAoZXZlbnQpID0+IHtcbiAgICAgIC8vIGRvIHNvbWV0aGluZ1xuICAgIH0pO1xuICogQHBhcmFtIGNvbmZpZ1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuU2VydmVyKGNvbmZpZz86IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gIGxldCBjb25maWd1cmF0aW9uUGFyc2VkOiBSZXR1cm5UeXBlPGFueT47XG4gIGlmIChjb25maWcgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IGNvbmZpZ1BhdGhMb2NhdGlvbiA9IGZpbmRDb25maWdGaWxlKGNvbmZpZyk7XG4gICAgY29uZmlndXJhdGlvblBhcnNlZCA9IHBhcnNlQ29uZmlnRmlsZShjb25maWdQYXRoTG9jYXRpb24pO1xuICAgIGlmICghY29uZmlndXJhdGlvblBhcnNlZC5zZWxmX3BhdGgpIHtcbiAgICAgIGNvbmZpZ3VyYXRpb25QYXJzZWQuc2VsZl9wYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZ1BhdGhMb2NhdGlvbik7XG4gICAgfVxuICB9IGVsc2UgaWYgKF8uaXNPYmplY3QoY29uZmlnKSkge1xuICAgIGNvbmZpZ3VyYXRpb25QYXJzZWQgPSBjb25maWc7XG4gICAgaWYgKCFjb25maWd1cmF0aW9uUGFyc2VkLnNlbGZfcGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzZWxmX3BhdGggaXMgcmVxdWlyZWQsIHBsZWFzZSBwcm92aWRlIGEgdmFsaWQgcm9vdCBwYXRoIGZvciBzdG9yYWdlJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihBUElfRVJST1IuQ09ORklHX0JBRF9GT1JNQVQpO1xuICB9XG5cbiAgY29uc3QgYWRkcmVzc2VzID0gZ2V0TGlzdExpc3RlbkFkZHJlc3Nlcyh1bmRlZmluZWQsIGNvbmZpZ3VyYXRpb25QYXJzZWQubGlzdGVuKTtcbiAgaWYgKGFkZHJlc3Nlcy5sZW5ndGggPiAxKSB7XG4gICAgcHJvY2Vzcy5lbWl0V2FybmluZyhcbiAgICAgICdZb3UgaGF2ZSBzcGVjaWZpZWQgbXVsdGlwbGUgbGlzdGVuIGFkZHJlc3NlcywgdXNpbmcgdGhpcyBtZXRob2Qgb25seSB0aGUgZmlyc3Qgd2lsbCBiZSB1c2VkJ1xuICAgICk7XG4gIH1cblxuICBjb25zdCBhcHAgPSBhd2FpdCBlbmRQb2ludEFQSShjb25maWd1cmF0aW9uUGFyc2VkKTtcbiAgcmV0dXJuIGNyZWF0ZVNlcnZlckZhY3RvcnkoY29uZmlndXJhdGlvblBhcnNlZCwgYWRkcmVzc2VzWzBdLCBhcHApO1xufVxuXG4vKipcbiAqIFJldHVybiBhIG5hdGl2ZSBIVFRQL0hUVFBTIHNlcnZlciBpbnN0YW5jZVxuICogQHBhcmFtIGNvbmZpZ1xuICogQHBhcmFtIGFkZHJcbiAqIEBwYXJhbSBhcHBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNlcnZlckZhY3RvcnkoY29uZmlnOiBDb25maWcsIGFkZHIsIGFwcCkge1xuICBsZXQgc2VydmVyRmFjdG9yeTtcbiAgaWYgKGFkZHIucHJvdG8gPT09ICdodHRwcycpIHtcbiAgICBkZWJ1ZygnaHR0cHMgZW5hYmxlZCcpO1xuICAgIHRyeSB7XG4gICAgICBsZXQgaHR0cHNPcHRpb25zID0ge1xuICAgICAgICAvLyBkaXNhYmxlIGluc2VjdXJlIFNTTHYyIGFuZCBTU0x2M1xuICAgICAgICBzZWN1cmVPcHRpb25zOiBjb25zdGFudHMuU1NMX09QX05PX1NTTHYyIHwgY29uc3RhbnRzLlNTTF9PUF9OT19TU0x2MyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGtleUNlcnRDb25maWcgPSBjb25maWcuaHR0cHMgYXMgSHR0cHNDb25mS2V5Q2VydDtcbiAgICAgIGNvbnN0IHBmeENvbmZpZyA9IGNvbmZpZy5odHRwcyBhcyBIdHRwc0NvbmZQZng7XG5cbiAgICAgIC8vIGh0dHBzIG11c3QgZWl0aGVyIGhhdmUga2V5IGFuZCBjZXJ0IG9yIGEgcGZ4IGFuZCAob3B0aW9uYWxseSkgYSBwYXNzcGhyYXNlXG4gICAgICBpZiAoISgoa2V5Q2VydENvbmZpZy5rZXkgJiYga2V5Q2VydENvbmZpZy5jZXJ0KSB8fCBwZnhDb25maWcucGZ4KSkge1xuICAgICAgICB0aHJvdyBFcnJvcignYmFkIGZvcm1hdCBodHRwcyBjb25maWd1cmF0aW9uJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwZnhDb25maWcucGZ4KSB7XG4gICAgICAgIGNvbnN0IHsgcGZ4LCBwYXNzcGhyYXNlIH0gPSBwZnhDb25maWc7XG4gICAgICAgIGh0dHBzT3B0aW9ucyA9IGFzc2lnbihodHRwc09wdGlvbnMsIHtcbiAgICAgICAgICBwZng6IGZzLnJlYWRGaWxlU3luYyhwZngpLFxuICAgICAgICAgIHBhc3NwaHJhc2U6IHBhc3NwaHJhc2UgfHwgJycsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgeyBrZXksIGNlcnQsIGNhIH0gPSBrZXlDZXJ0Q29uZmlnO1xuICAgICAgICBodHRwc09wdGlvbnMgPSBhc3NpZ24oaHR0cHNPcHRpb25zLCB7XG4gICAgICAgICAga2V5OiBmcy5yZWFkRmlsZVN5bmMoa2V5KSxcbiAgICAgICAgICBjZXJ0OiBmcy5yZWFkRmlsZVN5bmMoY2VydCksXG4gICAgICAgICAgLi4uKGNhICYmIHtcbiAgICAgICAgICAgIGNhOiBmcy5yZWFkRmlsZVN5bmMoY2EpLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIFRPRE86IGVuYWJsZSBodHRwMiBhcyBmZWF0dXJlXG4gICAgICAvLyBpZiAoY29uZmlnLnNlcnZlci5odHRwMikgPC0tIGNoZWNrIGlmIGZvcmNlIGh0dHAyXG4gICAgICBzZXJ2ZXJGYWN0b3J5ID0gaHR0cHMuY3JlYXRlU2VydmVyKGh0dHBzT3B0aW9ucywgYXBwKTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBjYW5ub3QgY3JlYXRlIGh0dHBzIHNlcnZlcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gaHR0cFxuICAgIGRlYnVnKCdodHRwIGVuYWJsZWQnKTtcbiAgICBzZXJ2ZXJGYWN0b3J5ID0gaHR0cC5jcmVhdGVTZXJ2ZXIoYXBwKTtcbiAgfVxuXG4gIGlmIChcbiAgICBjb25maWcuc2VydmVyICYmXG4gICAgdHlwZW9mIGNvbmZpZy5zZXJ2ZXIua2VlcEFsaXZlVGltZW91dCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uZmlnLnNlcnZlci5rZWVwQWxpdmVUaW1lb3V0ICE9PSAnbnVsbCdcbiAgKSB7XG4gICAgLy8gbGlicmFyeSBkZWZpbml0aW9uIGZvciBub2RlIGlzIG5vdCB1cCB0byBkYXRlIChkb2Vzbid0IGNvbnRhaW4gcmVjZW50IDguMCBjaGFuZ2VzKVxuICAgIHNlcnZlckZhY3Rvcnkua2VlcEFsaXZlVGltZW91dCA9IGNvbmZpZy5zZXJ2ZXIua2VlcEFsaXZlVGltZW91dCAqIDEwMDA7XG4gIH1cbiAgLy8gRklYRTogSSBjb3VsZCBub3QgZmluZCB0aGUgcmVhc29uIG9mIHRoaXMgY29kZS5cbiAgdW5saW5rQWRkcmVzc1BhdGgoYWRkcik7XG5cbiAgcmV0dXJuIHNlcnZlckZhY3Rvcnk7XG59XG5cbmZ1bmN0aW9uIHVubGlua0FkZHJlc3NQYXRoKGFkZHIpIHtcbiAgaWYgKGFkZHIucGF0aCAmJiBmcy5leGlzdHNTeW5jKGFkZHIucGF0aCkpIHtcbiAgICBmcy51bmxpbmtTeW5jKGFkZHIucGF0aCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQSxJQUFBQSxVQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxNQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxHQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRyxLQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSSxNQUFBLEdBQUFMLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSyxPQUFBLEdBQUFDLHVCQUFBLENBQUFOLE9BQUE7QUFDQSxJQUFBTyxLQUFBLEdBQUFSLHNCQUFBLENBQUFDLE9BQUE7QUFJQSxJQUFBUSxNQUFBLEdBQUFULHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBUyxNQUFBLEdBQUFULE9BQUE7QUFDQSxJQUFBVSxXQUFBLEdBQUFYLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBVyxXQUFBLEdBQUFYLE9BQUE7QUFDQSxJQUFBWSxPQUFBLEdBQUFaLE9BQUE7QUFBMEMsU0FBQWEseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEsQ0FBQUMsQ0FBQSxXQUFBQSxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxLQUFBRixDQUFBO0FBQUEsU0FBQVIsd0JBQUFRLENBQUEsRUFBQUUsQ0FBQSxTQUFBQSxDQUFBLElBQUFGLENBQUEsSUFBQUEsQ0FBQSxDQUFBSSxVQUFBLFNBQUFKLENBQUEsZUFBQUEsQ0FBQSx1QkFBQUEsQ0FBQSx5QkFBQUEsQ0FBQSxXQUFBSyxPQUFBLEVBQUFMLENBQUEsUUFBQUcsQ0FBQSxHQUFBSix3QkFBQSxDQUFBRyxDQUFBLE9BQUFDLENBQUEsSUFBQUEsQ0FBQSxDQUFBRyxHQUFBLENBQUFOLENBQUEsVUFBQUcsQ0FBQSxDQUFBSSxHQUFBLENBQUFQLENBQUEsT0FBQVEsQ0FBQSxLQUFBQyxTQUFBLFVBQUFDLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxjQUFBLElBQUFELE1BQUEsQ0FBQUUsd0JBQUEsV0FBQUMsQ0FBQSxJQUFBZCxDQUFBLG9CQUFBYyxDQUFBLE9BQUFDLGNBQUEsQ0FBQUMsSUFBQSxDQUFBaEIsQ0FBQSxFQUFBYyxDQUFBLFNBQUFHLENBQUEsR0FBQVAsQ0FBQSxHQUFBQyxNQUFBLENBQUFFLHdCQUFBLENBQUFiLENBQUEsRUFBQWMsQ0FBQSxVQUFBRyxDQUFBLEtBQUFBLENBQUEsQ0FBQVYsR0FBQSxJQUFBVSxDQUFBLENBQUFDLEdBQUEsSUFBQVAsTUFBQSxDQUFBQyxjQUFBLENBQUFKLENBQUEsRUFBQU0sQ0FBQSxFQUFBRyxDQUFBLElBQUFULENBQUEsQ0FBQU0sQ0FBQSxJQUFBZCxDQUFBLENBQUFjLENBQUEsWUFBQU4sQ0FBQSxDQUFBSCxPQUFBLEdBQUFMLENBQUEsRUFBQUcsQ0FBQSxJQUFBQSxDQUFBLENBQUFlLEdBQUEsQ0FBQWxCLENBQUEsRUFBQVEsQ0FBQSxHQUFBQSxDQUFBO0FBQUEsU0FBQXZCLHVCQUFBZSxDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBSSxVQUFBLEdBQUFKLENBQUEsS0FBQUssT0FBQSxFQUFBTCxDQUFBO0FBQUEsU0FBQW1CLFFBQUFuQixDQUFBLEVBQUFFLENBQUEsUUFBQUMsQ0FBQSxHQUFBUSxNQUFBLENBQUFTLElBQUEsQ0FBQXBCLENBQUEsT0FBQVcsTUFBQSxDQUFBVSxxQkFBQSxRQUFBQyxDQUFBLEdBQUFYLE1BQUEsQ0FBQVUscUJBQUEsQ0FBQXJCLENBQUEsR0FBQUUsQ0FBQSxLQUFBb0IsQ0FBQSxHQUFBQSxDQUFBLENBQUFDLE1BQUEsV0FBQXJCLENBQUEsV0FBQVMsTUFBQSxDQUFBRSx3QkFBQSxDQUFBYixDQUFBLEVBQUFFLENBQUEsRUFBQXNCLFVBQUEsT0FBQXJCLENBQUEsQ0FBQXNCLElBQUEsQ0FBQUMsS0FBQSxDQUFBdkIsQ0FBQSxFQUFBbUIsQ0FBQSxZQUFBbkIsQ0FBQTtBQUFBLFNBQUF3QixjQUFBM0IsQ0FBQSxhQUFBRSxDQUFBLE1BQUFBLENBQUEsR0FBQTBCLFNBQUEsQ0FBQUMsTUFBQSxFQUFBM0IsQ0FBQSxVQUFBQyxDQUFBLFdBQUF5QixTQUFBLENBQUExQixDQUFBLElBQUEwQixTQUFBLENBQUExQixDQUFBLFFBQUFBLENBQUEsT0FBQWlCLE9BQUEsQ0FBQVIsTUFBQSxDQUFBUixDQUFBLE9BQUEyQixPQUFBLFdBQUE1QixDQUFBLElBQUE2QixlQUFBLENBQUEvQixDQUFBLEVBQUFFLENBQUEsRUFBQUMsQ0FBQSxDQUFBRCxDQUFBLFNBQUFTLE1BQUEsQ0FBQXFCLHlCQUFBLEdBQUFyQixNQUFBLENBQUFzQixnQkFBQSxDQUFBakMsQ0FBQSxFQUFBVyxNQUFBLENBQUFxQix5QkFBQSxDQUFBN0IsQ0FBQSxLQUFBZ0IsT0FBQSxDQUFBUixNQUFBLENBQUFSLENBQUEsR0FBQTJCLE9BQUEsV0FBQTVCLENBQUEsSUFBQVMsTUFBQSxDQUFBQyxjQUFBLENBQUFaLENBQUEsRUFBQUUsQ0FBQSxFQUFBUyxNQUFBLENBQUFFLHdCQUFBLENBQUFWLENBQUEsRUFBQUQsQ0FBQSxpQkFBQUYsQ0FBQTtBQUFBLFNBQUErQixnQkFBQS9CLENBQUEsRUFBQUUsQ0FBQSxFQUFBQyxDQUFBLFlBQUFELENBQUEsR0FBQWdDLGNBQUEsQ0FBQWhDLENBQUEsTUFBQUYsQ0FBQSxHQUFBVyxNQUFBLENBQUFDLGNBQUEsQ0FBQVosQ0FBQSxFQUFBRSxDQUFBLElBQUFpQyxLQUFBLEVBQUFoQyxDQUFBLEVBQUFxQixVQUFBLE1BQUFZLFlBQUEsTUFBQUMsUUFBQSxVQUFBckMsQ0FBQSxDQUFBRSxDQUFBLElBQUFDLENBQUEsRUFBQUgsQ0FBQTtBQUFBLFNBQUFrQyxlQUFBL0IsQ0FBQSxRQUFBYyxDQUFBLEdBQUFxQixZQUFBLENBQUFuQyxDQUFBLHVDQUFBYyxDQUFBLEdBQUFBLENBQUEsR0FBQUEsQ0FBQTtBQUFBLFNBQUFxQixhQUFBbkMsQ0FBQSxFQUFBRCxDQUFBLDJCQUFBQyxDQUFBLEtBQUFBLENBQUEsU0FBQUEsQ0FBQSxNQUFBSCxDQUFBLEdBQUFHLENBQUEsQ0FBQW9DLE1BQUEsQ0FBQUMsV0FBQSxrQkFBQXhDLENBQUEsUUFBQWlCLENBQUEsR0FBQWpCLENBQUEsQ0FBQWdCLElBQUEsQ0FBQWIsQ0FBQSxFQUFBRCxDQUFBLHVDQUFBZSxDQUFBLFNBQUFBLENBQUEsWUFBQXdCLFNBQUEseUVBQUF2QyxDQUFBLEdBQUF3QyxNQUFBLEdBQUFDLE1BQUEsRUFBQXhDLENBQUE7QUFFMUMsTUFBTXlDLEtBQUssR0FBRyxJQUFBQyxjQUFVLEVBQUMsV0FBVyxDQUFDO0FBRXJDLE1BQU1DLE1BQU0sR0FBRzVELE9BQU8sQ0FBQyxVQUFVLENBQUM7QUFFM0IsU0FBUzZELHlCQUF5QkEsQ0FBQ0MsS0FBSyxFQUFFO0VBQy9DLElBQUksQ0FBQ0EsS0FBSyxFQUFFO0lBQ1Y7RUFDRjtFQUVBLE1BQU1DLGNBQWMsR0FBR3RDLE1BQU0sQ0FBQ1MsSUFBSSxDQUFDNEIsS0FBSyxDQUFDO0VBQ3pDLElBQUlDLGNBQWMsQ0FBQ3BCLE1BQU0sSUFBSSxDQUFDLEVBQUU7SUFDOUJpQixNQUFNLENBQUNJLElBQUk7SUFDVDtJQUNBLHdIQUNGLENBQUM7SUFDREQsY0FBYyxDQUFDbkIsT0FBTyxDQUFFcUIsVUFBVSxJQUFLO01BQ3JDO01BQ0FMLE1BQU0sQ0FBQ00sSUFBSSxDQUNULDJCQUEyQkQsVUFBVSxLQUNuQ0gsS0FBSyxDQUFDRyxVQUFVLENBQUMsR0FBRyxZQUFZLEdBQUcsY0FBYyxFQUVyRCxDQUFDO0lBQ0gsQ0FBQyxDQUFDO0VBQ0o7QUFDRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sZUFBZUUsU0FBU0EsQ0FBQ0MsTUFBZSxFQUFnQjtFQUM3RCxJQUFJQyxtQkFBb0M7RUFDeEMsSUFBSUQsTUFBTSxLQUFLRSxTQUFTLElBQUksT0FBT0YsTUFBTSxLQUFLLFFBQVEsRUFBRTtJQUN0RCxNQUFNRyxrQkFBa0IsR0FBRyxJQUFBQyxtQkFBYyxFQUFDSixNQUFNLENBQUM7SUFDakRDLG1CQUFtQixHQUFHLElBQUFJLHVCQUFlLEVBQUNGLGtCQUFrQixDQUFDO0lBQ3pELElBQUksQ0FBQ0YsbUJBQW1CLENBQUNLLFNBQVMsRUFBRTtNQUNsQ0wsbUJBQW1CLENBQUNLLFNBQVMsR0FBR0MsYUFBSSxDQUFDQyxPQUFPLENBQUNMLGtCQUFrQixDQUFDO0lBQ2xFO0VBQ0YsQ0FBQyxNQUFNLElBQUlNLGVBQUMsQ0FBQ0MsUUFBUSxDQUFDVixNQUFNLENBQUMsRUFBRTtJQUM3QkMsbUJBQW1CLEdBQUdELE1BQU07SUFDNUIsSUFBSSxDQUFDQyxtQkFBbUIsQ0FBQ0ssU0FBUyxFQUFFO01BQ2xDLE1BQU0sSUFBSUssS0FBSyxDQUFDLHFFQUFxRSxDQUFDO0lBQ3hGO0VBQ0YsQ0FBQyxNQUFNO0lBQ0wsTUFBTSxJQUFJQSxLQUFLLENBQUNDLHFCQUFTLENBQUNDLGlCQUFpQixDQUFDO0VBQzlDO0VBRUEsTUFBTUMsU0FBUyxHQUFHLElBQUFDLDZCQUFzQixFQUFDYixTQUFTLEVBQUVELG1CQUFtQixDQUFDZSxNQUFNLENBQUM7RUFDL0UsSUFBSUYsU0FBUyxDQUFDdkMsTUFBTSxHQUFHLENBQUMsRUFBRTtJQUN4QjBDLE9BQU8sQ0FBQ0MsV0FBVyxDQUNqQiw2RkFDRixDQUFDO0VBQ0g7RUFFQSxNQUFNQyxHQUFHLEdBQUcsTUFBTSxJQUFBQyxjQUFXLEVBQUNuQixtQkFBbUIsQ0FBQztFQUNsRCxPQUFPb0IsbUJBQW1CLENBQUNwQixtQkFBbUIsRUFBRWEsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFSyxHQUFHLENBQUM7QUFDcEU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0UsbUJBQW1CQSxDQUFDckIsTUFBYyxFQUFFc0IsSUFBSSxFQUFFSCxHQUFHLEVBQUU7RUFDN0QsSUFBSUksYUFBYTtFQUNqQixJQUFJRCxJQUFJLENBQUNFLEtBQUssS0FBSyxPQUFPLEVBQUU7SUFDMUJsQyxLQUFLLENBQUMsZUFBZSxDQUFDO0lBQ3RCLElBQUk7TUFDRixJQUFJbUMsWUFBWSxHQUFHO1FBQ2pCO1FBQ0FDLGFBQWEsRUFBRUMsa0JBQVMsQ0FBQ0MsZUFBZSxHQUFHRCxrQkFBUyxDQUFDRTtNQUN2RCxDQUFDO01BRUQsTUFBTUMsYUFBYSxHQUFHOUIsTUFBTSxDQUFDK0IsS0FBeUI7TUFDdEQsTUFBTUMsU0FBUyxHQUFHaEMsTUFBTSxDQUFDK0IsS0FBcUI7O01BRTlDO01BQ0EsSUFBSSxFQUFHRCxhQUFhLENBQUNHLEdBQUcsSUFBSUgsYUFBYSxDQUFDSSxJQUFJLElBQUtGLFNBQVMsQ0FBQ0csR0FBRyxDQUFDLEVBQUU7UUFDakUsTUFBTXhCLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQztNQUMvQztNQUVBLElBQUlxQixTQUFTLENBQUNHLEdBQUcsRUFBRTtRQUNqQixNQUFNO1VBQUVBLEdBQUc7VUFBRUM7UUFBVyxDQUFDLEdBQUdKLFNBQVM7UUFDckNQLFlBQVksR0FBRyxJQUFBWSxjQUFNLEVBQUNaLFlBQVksRUFBRTtVQUNsQ1UsR0FBRyxFQUFFRyxXQUFFLENBQUNDLFlBQVksQ0FBQ0osR0FBRyxDQUFDO1VBQ3pCQyxVQUFVLEVBQUVBLFVBQVUsSUFBSTtRQUM1QixDQUFDLENBQUM7TUFDSixDQUFDLE1BQU07UUFDTCxNQUFNO1VBQUVILEdBQUc7VUFBRUMsSUFBSTtVQUFFTTtRQUFHLENBQUMsR0FBR1YsYUFBYTtRQUN2Q0wsWUFBWSxHQUFHLElBQUFZLGNBQU0sRUFBQ1osWUFBWSxFQUFBcEQsYUFBQTtVQUNoQzRELEdBQUcsRUFBRUssV0FBRSxDQUFDQyxZQUFZLENBQUNOLEdBQUcsQ0FBQztVQUN6QkMsSUFBSSxFQUFFSSxXQUFFLENBQUNDLFlBQVksQ0FBQ0wsSUFBSTtRQUFDLEdBQ3ZCTSxFQUFFLElBQUk7VUFDUkEsRUFBRSxFQUFFRixXQUFFLENBQUNDLFlBQVksQ0FBQ0MsRUFBRTtRQUN4QixDQUFDLENBQ0YsQ0FBQztNQUNKO01BQ0E7TUFDQTtNQUNBakIsYUFBYSxHQUFHUSxjQUFLLENBQUNVLFlBQVksQ0FBQ2hCLFlBQVksRUFBRU4sR0FBRyxDQUFDO0lBQ3ZELENBQUMsQ0FBQyxPQUFPdUIsR0FBUSxFQUFFO01BQ2pCLE1BQU0sSUFBSS9CLEtBQUssQ0FBQywrQkFBK0IrQixHQUFHLENBQUNDLE9BQU8sRUFBRSxDQUFDO0lBQy9EO0VBQ0YsQ0FBQyxNQUFNO0lBQ0w7SUFDQXJELEtBQUssQ0FBQyxjQUFjLENBQUM7SUFDckJpQyxhQUFhLEdBQUdxQixhQUFJLENBQUNILFlBQVksQ0FBQ3RCLEdBQUcsQ0FBQztFQUN4QztFQUVBLElBQ0VuQixNQUFNLENBQUM2QyxNQUFNLElBQ2IsT0FBTzdDLE1BQU0sQ0FBQzZDLE1BQU0sQ0FBQ0MsZ0JBQWdCLEtBQUssV0FBVztFQUNyRDtFQUNBOUMsTUFBTSxDQUFDNkMsTUFBTSxDQUFDQyxnQkFBZ0IsS0FBSyxNQUFNLEVBQ3pDO0lBQ0E7SUFDQXZCLGFBQWEsQ0FBQ3VCLGdCQUFnQixHQUFHOUMsTUFBTSxDQUFDNkMsTUFBTSxDQUFDQyxnQkFBZ0IsR0FBRyxJQUFJO0VBQ3hFO0VBQ0E7RUFDQUMsaUJBQWlCLENBQUN6QixJQUFJLENBQUM7RUFFdkIsT0FBT0MsYUFBYTtBQUN0QjtBQUVBLFNBQVN3QixpQkFBaUJBLENBQUN6QixJQUFJLEVBQUU7RUFDL0IsSUFBSUEsSUFBSSxDQUFDZixJQUFJLElBQUkrQixXQUFFLENBQUNVLFVBQVUsQ0FBQzFCLElBQUksQ0FBQ2YsSUFBSSxDQUFDLEVBQUU7SUFDekMrQixXQUFFLENBQUNXLFVBQVUsQ0FBQzNCLElBQUksQ0FBQ2YsSUFBSSxDQUFDO0VBQzFCO0FBQ0YiLCJpZ25vcmVMaXN0IjpbXX0=
;