Files
ANDJ 76791391d8 Prototyp fur die Navigationsleiste
Kleine anpassuungen Handy Ansicht
2025-12-14 17:27:12 +01:00

155 lines
380 KiB
JavaScript

"use strict";
/*
* ATTENTION: An "eval-source-map" devtool has been used.
* This devtool is neither made for production nor for readable output files.
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
* or disable the default devtool with "devtool: false".
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
*/
exports.id = "vendor-chunks/ws";
exports.ids = ["vendor-chunks/ws"];
exports.modules = {
/***/ "(ssr)/./node_modules/ws/index.js":
/*!**********************************!*\
!*** ./node_modules/ws/index.js ***!
\**********************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
eval("\r\n\r\nconst WebSocket = __webpack_require__(/*! ./lib/websocket */ \"(ssr)/./node_modules/ws/lib/websocket.js\");\r\n\r\nWebSocket.createWebSocketStream = __webpack_require__(/*! ./lib/stream */ \"(ssr)/./node_modules/ws/lib/stream.js\");\r\nWebSocket.Server = __webpack_require__(/*! ./lib/websocket-server */ \"(ssr)/./node_modules/ws/lib/websocket-server.js\");\r\nWebSocket.Receiver = __webpack_require__(/*! ./lib/receiver */ \"(ssr)/./node_modules/ws/lib/receiver.js\");\r\nWebSocket.Sender = __webpack_require__(/*! ./lib/sender */ \"(ssr)/./node_modules/ws/lib/sender.js\");\r\n\r\nWebSocket.WebSocket = WebSocket;\r\nWebSocket.WebSocketServer = WebSocket.Server;\r\n\r\nmodule.exports = WebSocket;\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvd3MvaW5kZXguanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYjtBQUNBLGtCQUFrQixtQkFBTyxDQUFDLGlFQUFpQjtBQUMzQztBQUNBLGtDQUFrQyxtQkFBTyxDQUFDLDJEQUFjO0FBQ3hELG1CQUFtQixtQkFBTyxDQUFDLCtFQUF3QjtBQUNuRCxxQkFBcUIsbUJBQU8sQ0FBQywrREFBZ0I7QUFDN0MsbUJBQW1CLG1CQUFPLENBQUMsMkRBQWM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL25leHRqcy8uL25vZGVfbW9kdWxlcy93cy9pbmRleC5qcz8wNjVlIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcclxuXHJcbmNvbnN0IFdlYlNvY2tldCA9IHJlcXVpcmUoJy4vbGliL3dlYnNvY2tldCcpO1xyXG5cclxuV2ViU29ja2V0LmNyZWF0ZVdlYlNvY2tldFN0cmVhbSA9IHJlcXVpcmUoJy4vbGliL3N0cmVhbScpO1xyXG5XZWJTb2NrZXQuU2VydmVyID0gcmVxdWlyZSgnLi9saWIvd2Vic29ja2V0LXNlcnZlcicpO1xyXG5XZWJTb2NrZXQuUmVjZWl2ZXIgPSByZXF1aXJlKCcuL2xpYi9yZWNlaXZlcicpO1xyXG5XZWJTb2NrZXQuU2VuZGVyID0gcmVxdWlyZSgnLi9saWIvc2VuZGVyJyk7XHJcblxyXG5XZWJTb2NrZXQuV2ViU29ja2V0ID0gV2ViU29ja2V0O1xyXG5XZWJTb2NrZXQuV2ViU29ja2V0U2VydmVyID0gV2ViU29ja2V0LlNlcnZlcjtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gV2ViU29ja2V0O1xyXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/ws/index.js\n");
/***/ }),
/***/ "(ssr)/./node_modules/ws/lib/buffer-util.js":
/*!********************************************!*\
!*** ./node_modules/ws/lib/buffer-util.js ***!
\********************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
eval("\r\n\r\nconst { EMPTY_BUFFER } = __webpack_require__(/*! ./constants */ \"(ssr)/./node_modules/ws/lib/constants.js\");\r\n\r\nconst FastBuffer = Buffer[Symbol.species];\r\n\r\n/**\r\n * Merges an array of buffers into a new buffer.\r\n *\r\n * @param {Buffer[]} list The array of buffers to concat\r\n * @param {Number} totalLength The total length of buffers in the list\r\n * @return {Buffer} The resulting buffer\r\n * @public\r\n */\r\nfunction concat(list, totalLength) {\r\n if (list.length === 0) return EMPTY_BUFFER;\r\n if (list.length === 1) return list[0];\r\n\r\n const target = Buffer.allocUnsafe(totalLength);\r\n let offset = 0;\r\n\r\n for (let i = 0; i < list.length; i++) {\r\n const buf = list[i];\r\n target.set(buf, offset);\r\n offset += buf.length;\r\n }\r\n\r\n if (offset < totalLength) {\r\n return new FastBuffer(target.buffer, target.byteOffset, offset);\r\n }\r\n\r\n return target;\r\n}\r\n\r\n/**\r\n * Masks a buffer using the given mask.\r\n *\r\n * @param {Buffer} source The buffer to mask\r\n * @param {Buffer} mask The mask to use\r\n * @param {Buffer} output The buffer where to store the result\r\n * @param {Number} offset The offset at which to start writing\r\n * @param {Number} length The number of bytes to mask.\r\n * @public\r\n */\r\nfunction _mask(source, mask, output, offset, length) {\r\n for (let i = 0; i < length; i++) {\r\n output[offset + i] = source[i] ^ mask[i & 3];\r\n }\r\n}\r\n\r\n/**\r\n * Unmasks a buffer using the given mask.\r\n *\r\n * @param {Buffer} buffer The buffer to unmask\r\n * @param {Buffer} mask The mask to use\r\n * @public\r\n */\r\nfunction _unmask(buffer, mask) {\r\n for (let i = 0; i < buffer.length; i++) {\r\n buffer[i] ^= mask[i & 3];\r\n }\r\n}\r\n\r\n/**\r\n * Converts a buffer to an `ArrayBuffer`.\r\n *\r\n * @param {Buffer} buf The buffer to convert\r\n * @return {ArrayBuffer} Converted buffer\r\n * @public\r\n */\r\nfunction toArrayBuffer(buf) {\r\n if (buf.length === buf.buffer.byteLength) {\r\n return buf.buffer;\r\n }\r\n\r\n return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.length);\r\n}\r\n\r\n/**\r\n * Converts `data` to a `Buffer`.\r\n *\r\n * @param {*} data The data to convert\r\n * @return {Buffer} The buffer\r\n * @throws {TypeError}\r\n * @public\r\n */\r\nfunction toBuffer(data) {\r\n toBuffer.readOnly = true;\r\n\r\n if (Buffer.isBuffer(data)) return data;\r\n\r\n let buf;\r\n\r\n if (data instanceof ArrayBuffer) {\r\n buf = new FastBuffer(data);\r\n } else if (ArrayBuffer.isView(data)) {\r\n buf = new FastBuffer(data.buffer, data.byteOffset, data.byteLength);\r\n } else {\r\n buf = Buffer.from(data);\r\n toBuffer.readOnly = false;\r\n }\r\n\r\n return buf;\r\n}\r\n\r\nmodule.exports = {\r\n concat,\r\n mask: _mask,\r\n toArrayBuffer,\r\n toBuffer,\r\n unmask: _unmask\r\n};\r\n\r\n/* istanbul ignore else */\r\nif (!process.env.WS_NO_BUFFER_UTIL) {\r\n try {\r\n const bufferUtil = __webpack_require__(Object(function webpackMissingModule() { var e = new Error(\"Cannot find module 'bufferutil'\"); e.code = 'MODULE_NOT_FOUND'; throw e; }()));\r\n\r\n module.exports.mask = function (source, mask, output, offset, length) {\r\n if (length < 48) _mask(source, mask, output, offset, length);\r\n else bufferUtil.mask(source, mask, output, offset, length);\r\n };\r\n\r\n module.exports.unmask = function (buffer, mask) {\r\n if (buffer.length < 32) _unmask(buffer, mask);\r\n else bufferUtil.unmask(buffer, mask);\r\n };\r\n } catch (e) {\r\n // Continue regardless of the error.\r\n }\r\n}\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvd3MvbGliL2J1ZmZlci11dGlsLmpzIiwibWFwcGluZ3MiOiJBQUFhO0FBQ2I7QUFDQSxRQUFRLGVBQWUsRUFBRSxtQkFBTyxDQUFDLDZEQUFhO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQixXQUFXLFFBQVE7QUFDbkIsWUFBWSxRQUFRO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixpQkFBaUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsWUFBWTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLG1CQUFtQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixZQUFZLGFBQWE7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxZQUFZLFFBQVE7QUFDcEIsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLG1CQUFPLENBQUMseUlBQVk7QUFDM0M7QUFDQSxJQUFJLG1CQUFtQjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUkscUJBQXFCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9uZXh0anMvLi9ub2RlX21vZHVsZXMvd3MvbGliL2J1ZmZlci11dGlsLmpzPzhjMzMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xyXG5cclxuY29uc3QgeyBFTVBUWV9CVUZGRVIgfSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJyk7XHJcblxyXG5jb25zdCBGYXN0QnVmZmVyID0gQnVmZmVyW1N5bWJvbC5zcGVjaWVzXTtcclxuXHJcbi8qKlxyXG4gKiBNZXJnZXMgYW4gYXJyYXkgb2YgYnVmZmVycyBpbnRvIGEgbmV3IGJ1ZmZlci5cclxuICpcclxuICogQHBhcmFtIHtCdWZmZXJbXX0gbGlzdCBUaGUgYXJyYXkgb2YgYnVmZmVycyB0byBjb25jYXRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHRvdGFsTGVuZ3RoIFRoZSB0b3RhbCBsZW5ndGggb2YgYnVmZmVycyBpbiB0aGUgbGlzdFxyXG4gKiBAcmV0dXJuIHtCdWZmZXJ9IFRoZSByZXN1bHRpbmcgYnVmZmVyXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmZ1bmN0aW9uIGNvbmNhdChsaXN0LCB0b3RhbExlbmd0aCkge1xyXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIEVNUFRZX0JVRkZFUjtcclxuICBpZiAobGlzdC5sZW5ndGggPT09IDEpIHJldHVybiBsaXN0WzBdO1xyXG5cclxuICBjb25zdCB0YXJnZXQgPSBCdWZmZXIuYWxsb2NVbnNhZmUodG90YWxMZW5ndGgpO1xyXG4gIGxldCBvZmZzZXQgPSAwO1xyXG5cclxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcclxuICAgIGNvbnN0IGJ1ZiA9IGxpc3RbaV07XHJcbiAgICB0YXJnZXQuc2V0KGJ1Ziwgb2Zmc2V0KTtcclxuICAgIG9mZnNldCArPSBidWYubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgaWYgKG9mZnNldCA8IHRvdGFsTGVuZ3RoKSB7XHJcbiAgICByZXR1cm4gbmV3IEZhc3RCdWZmZXIodGFyZ2V0LmJ1ZmZlciwgdGFyZ2V0LmJ5dGVPZmZzZXQsIG9mZnNldCk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdGFyZ2V0O1xyXG59XHJcblxyXG4vKipcclxuICogTWFza3MgYSBidWZmZXIgdXNpbmcgdGhlIGdpdmVuIG1hc2suXHJcbiAqXHJcbiAqIEBwYXJhbSB7QnVmZmVyfSBzb3VyY2UgVGhlIGJ1ZmZlciB0byBtYXNrXHJcbiAqIEBwYXJhbSB7QnVmZmVyfSBtYXNrIFRoZSBtYXNrIHRvIHVzZVxyXG4gKiBAcGFyYW0ge0J1ZmZlcn0gb3V0cHV0IFRoZSBidWZmZXIgd2hlcmUgdG8gc3RvcmUgdGhlIHJlc3VsdFxyXG4gKiBAcGFyYW0ge051bWJlcn0gb2Zmc2V0IFRoZSBvZmZzZXQgYXQgd2hpY2ggdG8gc3RhcnQgd3JpdGluZ1xyXG4gKiBAcGFyYW0ge051bWJlcn0gbGVuZ3RoIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gbWFzay5cclxuICogQHB1YmxpY1xyXG4gKi9cclxuZnVuY3Rpb24gX21hc2soc291cmNlLCBtYXNrLCBvdXRwdXQsIG9mZnNldCwgbGVuZ3RoKSB7XHJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgb3V0cHV0W29mZnNldCArIGldID0gc291cmNlW2ldIF4gbWFza1tpICYgM107XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogVW5tYXNrcyBhIGJ1ZmZlciB1c2luZyB0aGUgZ2l2ZW4gbWFzay5cclxuICpcclxuICogQHBhcmFtIHtCdWZmZXJ9IGJ1ZmZlciBUaGUgYnVmZmVyIHRvIHVubWFza1xyXG4gKiBAcGFyYW0ge0J1ZmZlcn0gbWFzayBUaGUgbWFzayB0byB1c2VcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZnVuY3Rpb24gX3VubWFzayhidWZmZXIsIG1hc2spIHtcclxuICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlci5sZW5ndGg7IGkrKykge1xyXG4gICAgYnVmZmVyW2ldIF49IG1hc2tbaSAmIDNdO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIGEgYnVmZmVyIHRvIGFuIGBBcnJheUJ1ZmZlcmAuXHJcbiAqXHJcbiAqIEBwYXJhbSB7QnVmZmVyfSBidWYgVGhlIGJ1ZmZlciB0byBjb252ZXJ0XHJcbiAqIEByZXR1cm4ge0FycmF5QnVmZmVyfSBDb252ZXJ0ZWQgYnVmZmVyXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmZ1bmN0aW9uIHRvQXJyYXlCdWZmZXIoYnVmKSB7XHJcbiAgaWYgKGJ1Zi5sZW5ndGggPT09IGJ1Zi5idWZmZXIuYnl0ZUxlbmd0aCkge1xyXG4gICAgcmV0dXJuIGJ1Zi5idWZmZXI7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gYnVmLmJ1ZmZlci5zbGljZShidWYuYnl0ZU9mZnNldCwgYnVmLmJ5dGVPZmZzZXQgKyBidWYubGVuZ3RoKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIGBkYXRhYCB0byBhIGBCdWZmZXJgLlxyXG4gKlxyXG4gKiBAcGFyYW0geyp9IGRhdGEgVGhlIGRhdGEgdG8gY29udmVydFxyXG4gKiBAcmV0dXJuIHtCdWZmZXJ9IFRoZSBidWZmZXJcclxuICogQHRocm93cyB7VHlwZUVycm9yfVxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5mdW5jdGlvbiB0b0J1ZmZlcihkYXRhKSB7XHJcbiAgdG9CdWZmZXIucmVhZE9ubHkgPSB0cnVlO1xyXG5cclxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGRhdGEpKSByZXR1cm4gZGF0YTtcclxuXHJcbiAgbGV0IGJ1ZjtcclxuXHJcbiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xyXG4gICAgYnVmID0gbmV3IEZhc3RCdWZmZXIoZGF0YSk7XHJcbiAgfSBlbHNlIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoZGF0YSkpIHtcclxuICAgIGJ1ZiA9IG5ldyBGYXN0QnVmZmVyKGRhdGEuYnVmZmVyLCBkYXRhLmJ5dGVPZmZzZXQsIGRhdGEuYnl0ZUxlbmd0aCk7XHJcbiAgfSBlbHNlIHtcclxuICAgIGJ1ZiA9IEJ1ZmZlci5mcm9tKGRhdGEpO1xyXG4gICAgdG9CdWZmZXIucmVhZE9ubHkgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHJldHVybiBidWY7XHJcbn1cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG4gIGNvbmNhdCxcclxuICBtYXNrOiBfbWFzayxcclxuICB0b0FycmF5QnVmZmVyLFxyXG4gIHRvQnVmZmVyLFxyXG4gIHVubWFzazogX3VubWFza1xyXG59O1xyXG5cclxuLyogaXN0YW5idWwgaWdub3JlIGVsc2UgICovXHJcbmlmICghcHJvY2Vzcy5lbnYuV1NfTk9fQlVGRkVSX1VUSUwpIHtcclxuICB0cnkge1xyXG4gICAgY29uc3QgYnVmZmVyVXRpbCA9IHJlcXVpcmUoJ2J1ZmZlcnV0aWwnKTtcclxuXHJcbiAgICBtb2R1bGUuZXhwb3J0cy5tYXNrID0gZnVuY3Rpb24gKHNvdXJjZSwgbWFzaywgb3V0cHV0LCBvZmZzZXQsIGxlbmd0aCkge1xyXG4gICAgICBpZiAobGVuZ3RoIDwgNDgpIF9tYXNrKHNvdXJjZSwgbWFzaywgb3V0cHV0LCBvZmZzZXQsIGxlbmd0aCk7XHJcbiAgICAgIGVsc2UgYnVmZmVyVXRpbC5tYXNrKHNvdXJjZSwgbWFzaywgb3V0cHV0LCBvZmZzZXQsIGxlbmd0aCk7XHJcbiAgICB9O1xyXG5cclxuICAgIG1vZHVsZS5leHBvcnRzLnVubWFzayA9IGZ1bmN0aW9uIChidWZmZXIsIG1hc2spIHtcclxuICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPCAzMikgX3VubWFzayhidWZmZXIsIG1hc2spO1xyXG4gICAgICBlbHNlIGJ1ZmZlclV0aWwudW5tYXNrKGJ1ZmZlciwgbWFzayk7XHJcbiAgICB9O1xyXG4gIH0gY2F0Y2ggKGUpIHtcclxuICAgIC8vIENvbnRpbnVlIHJlZ2FyZGxlc3Mgb2YgdGhlIGVycm9yLlxyXG4gIH1cclxufVxyXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/ws/lib/buffer-util.js\n");
/***/ }),
/***/ "(ssr)/./node_modules/ws/lib/constants.js":
/*!******************************************!*\
!*** ./node_modules/ws/lib/constants.js ***!
\******************************************/
/***/ ((module) => {
eval("\r\n\r\nconst BINARY_TYPES = ['nodebuffer', 'arraybuffer', 'fragments'];\r\nconst hasBlob = typeof Blob !== 'undefined';\r\n\r\nif (hasBlob) BINARY_TYPES.push('blob');\r\n\r\nmodule.exports = {\r\n BINARY_TYPES,\r\n EMPTY_BUFFER: Buffer.alloc(0),\r\n GUID: '258EAFA5-E914-47DA-95CA-C5AB0DC85B11',\r\n hasBlob,\r\n kForOnEventAttribute: Symbol('kIsForOnEventAttribute'),\r\n kListener: Symbol('kListener'),\r\n kStatusCode: Symbol('status-code'),\r\n kWebSocket: Symbol('websocket'),\r\n NOOP: () => {}\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvd3MvbGliL2NvbnN0YW50cy5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9uZXh0anMvLi9ub2RlX21vZHVsZXMvd3MvbGliL2NvbnN0YW50cy5qcz85YTc0Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcclxuXHJcbmNvbnN0IEJJTkFSWV9UWVBFUyA9IFsnbm9kZWJ1ZmZlcicsICdhcnJheWJ1ZmZlcicsICdmcmFnbWVudHMnXTtcclxuY29uc3QgaGFzQmxvYiA9IHR5cGVvZiBCbG9iICE9PSAndW5kZWZpbmVkJztcclxuXHJcbmlmIChoYXNCbG9iKSBCSU5BUllfVFlQRVMucHVzaCgnYmxvYicpO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgQklOQVJZX1RZUEVTLFxyXG4gIEVNUFRZX0JVRkZFUjogQnVmZmVyLmFsbG9jKDApLFxyXG4gIEdVSUQ6ICcyNThFQUZBNS1FOTE0LTQ3REEtOTVDQS1DNUFCMERDODVCMTEnLFxyXG4gIGhhc0Jsb2IsXHJcbiAga0Zvck9uRXZlbnRBdHRyaWJ1dGU6IFN5bWJvbCgna0lzRm9yT25FdmVudEF0dHJpYnV0ZScpLFxyXG4gIGtMaXN0ZW5lcjogU3ltYm9sKCdrTGlzdGVuZXInKSxcclxuICBrU3RhdHVzQ29kZTogU3ltYm9sKCdzdGF0dXMtY29kZScpLFxyXG4gIGtXZWJTb2NrZXQ6IFN5bWJvbCgnd2Vic29ja2V0JyksXHJcbiAgTk9PUDogKCkgPT4ge31cclxufTtcclxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/ws/lib/constants.js\n");
/***/ }),
/***/ "(ssr)/./node_modules/ws/lib/event-target.js":
/*!*********************************************!*\
!*** ./node_modules/ws/lib/event-target.js ***!
\*********************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
eval("\r\n\r\nconst { kForOnEventAttribute, kListener } = __webpack_require__(/*! ./constants */ \"(ssr)/./node_modules/ws/lib/constants.js\");\r\n\r\nconst kCode = Symbol('kCode');\r\nconst kData = Symbol('kData');\r\nconst kError = Symbol('kError');\r\nconst kMessage = Symbol('kMessage');\r\nconst kReason = Symbol('kReason');\r\nconst kTarget = Symbol('kTarget');\r\nconst kType = Symbol('kType');\r\nconst kWasClean = Symbol('kWasClean');\r\n\r\n/**\r\n * Class representing an event.\r\n */\r\nclass Event {\r\n /**\r\n * Create a new `Event`.\r\n *\r\n * @param {String} type The name of the event\r\n * @throws {TypeError} If the `type` argument is not specified\r\n */\r\n constructor(type) {\r\n this[kTarget] = null;\r\n this[kType] = type;\r\n }\r\n\r\n /**\r\n * @type {*}\r\n */\r\n get target() {\r\n return this[kTarget];\r\n }\r\n\r\n /**\r\n * @type {String}\r\n */\r\n get type() {\r\n return this[kType];\r\n }\r\n}\r\n\r\nObject.defineProperty(Event.prototype, 'target', { enumerable: true });\r\nObject.defineProperty(Event.prototype, 'type', { enumerable: true });\r\n\r\n/**\r\n * Class representing a close event.\r\n *\r\n * @extends Event\r\n */\r\nclass CloseEvent extends Event {\r\n /**\r\n * Create a new `CloseEvent`.\r\n *\r\n * @param {String} type The name of the event\r\n * @param {Object} [options] A dictionary object that allows for setting\r\n * attributes via object members of the same name\r\n * @param {Number} [options.code=0] The status code explaining why the\r\n * connection was closed\r\n * @param {String} [options.reason=''] A human-readable string explaining why\r\n * the connection was closed\r\n * @param {Boolean} [options.wasClean=false] Indicates whether or not the\r\n * connection was cleanly closed\r\n */\r\n constructor(type, options = {}) {\r\n super(type);\r\n\r\n this[kCode] = options.code === undefined ? 0 : options.code;\r\n this[kReason] = options.reason === undefined ? '' : options.reason;\r\n this[kWasClean] = options.wasClean === undefined ? false : options.wasClean;\r\n }\r\n\r\n /**\r\n * @type {Number}\r\n */\r\n get code() {\r\n return this[kCode];\r\n }\r\n\r\n /**\r\n * @type {String}\r\n */\r\n get reason() {\r\n return this[kReason];\r\n }\r\n\r\n /**\r\n * @type {Boolean}\r\n */\r\n get wasClean() {\r\n return this[kWasClean];\r\n }\r\n}\r\n\r\nObject.defineProperty(CloseEvent.prototype, 'code', { enumerable: true });\r\nObject.defineProperty(CloseEvent.prototype, 'reason', { enumerable: true });\r\nObject.defineProperty(CloseEvent.prototype, 'wasClean', { enumerable: true });\r\n\r\n/**\r\n * Class representing an error event.\r\n *\r\n * @extends Event\r\n */\r\nclass ErrorEvent extends Event {\r\n /**\r\n * Create a new `ErrorEvent`.\r\n *\r\n * @param {String} type The name of the event\r\n * @param {Object} [options] A dictionary object that allows for setting\r\n * attributes via object members of the same name\r\n * @param {*} [options.error=null] The error that generated this event\r\n * @param {String} [options.message=''] The error message\r\n */\r\n constructor(type, options = {}) {\r\n super(type);\r\n\r\n this[kError] = options.error === undefined ? null : options.error;\r\n this[kMessage] = options.message === undefined ? '' : options.message;\r\n }\r\n\r\n /**\r\n * @type {*}\r\n */\r\n get error() {\r\n return this[kError];\r\n }\r\n\r\n /**\r\n * @type {String}\r\n */\r\n get message() {\r\n return this[kMessage];\r\n }\r\n}\r\n\r\nObject.defineProperty(ErrorEvent.prototype, 'error', { enumerable: true });\r\nObject.defineProperty(ErrorEvent.prototype, 'message', { enumerable: true });\r\n\r\n/**\r\n * Class representing a message event.\r\n *\r\n * @extends Event\r\n */\r\nclass MessageEvent extends Event {\r\n /**\r\n * Create a new `MessageEvent`.\r\n *\r\n * @param {String} type The name of the event\r\n * @param {Object} [options] A dictionary object that allows for setting\r\n * attributes via object members of the same name\r\n * @param {*} [options.data=null] The message content\r\n */\r\n constructor(type, options = {}) {\r\n super(type);\r\n\r\n this[kData] = options.data === undefined ? null : options.data;\r\n }\r\n\r\n /**\r\n * @type {*}\r\n */\r\n get data() {\r\n return this[kData];\r\n }\r\n}\r\n\r\nObject.defineProperty(MessageEvent.prototype, 'data', { enumerable: true });\r\n\r\n/**\r\n * This provides methods for emulating the `EventTarget` interface. It's not\r\n * meant to be used directly.\r\n *\r\n * @mixin\r\n */\r\nconst EventTarget = {\r\n /**\r\n * Register an event listener.\r\n *\r\n * @param {String} type A string representing the event type to listen for\r\n * @param {(Function|Object)} handler The listener to add\r\n * @param {Object} [options] An options object specifies characteristics about\r\n * the event listener\r\n * @param {Boolean} [options.once=false] A `Boolean` indicating that the\r\n * listener should be invoked at most once after being added. If `true`,\r\n * the listener would be automatically removed when invoked.\r\n * @public\r\n */\r\n addEventListener(type, handler, options = {}) {\r\n for (const listener of this.listeners(type)) {\r\n if (\r\n !options[kForOnEventAttribute] &&\r\n listener[kListener] === handler &&\r\n !listener[kForOnEventAttribute]\r\n ) {\r\n return;\r\n }\r\n }\r\n\r\n let wrapper;\r\n\r\n if (type === 'message') {\r\n wrapper = function onMessage(data, isBinary) {\r\n const event = new MessageEvent('message', {\r\n data: isBinary ? data : data.toString()\r\n });\r\n\r\n event[kTarget] = this;\r\n callListener(handler, this, event);\r\n };\r\n } else if (type === 'close') {\r\n wrapper = function onClose(code, message) {\r\n const event = new CloseEvent('close', {\r\n code,\r\n reason: message.toString(),\r\n wasClean: this._closeFrameReceived && this._closeFrameSent\r\n });\r\n\r\n event[kTarget] = this;\r\n callListener(handler, this, event);\r\n };\r\n } else if (type === 'error') {\r\n wrapper = function onError(error) {\r\n const event = new ErrorEvent('error', {\r\n error,\r\n message: error.message\r\n });\r\n\r\n event[kTarget] = this;\r\n callListener(handler, this, event);\r\n };\r\n } else if (type === 'open') {\r\n wrapper = function onOpen() {\r\n const event = new Event('open');\r\n\r\n event[kTarget] = this;\r\n callListener(handler, this, event);\r\n };\r\n } else {\r\n return;\r\n }\r\n\r\n wrapper[kForOnEventAttribute] = !!options[kForOnEventAttribute];\r\n wrapper[kListener] = handler;\r\n\r\n if (options.once) {\r\n this.once(type, wrapper);\r\n } else {\r\n this.on(type, wrapper);\r\n }\r\n },\r\n\r\n /**\r\n * Remove an event listener.\r\n *\r\n * @param {String} type A string representing the event type to remove\r\n * @param {(Function|Object)} handler The listener to remove\r\n * @public\r\n */\r\n removeEventListener(type, handler) {\r\n for (const listener of this.listeners(type)) {\r\n if (listener[kListener] === handler && !listener[kForOnEventAttribute]) {\r\n this.removeListener(type, listener);\r\n break;\r\n }\r\n }\r\n }\r\n};\r\n\r\nmodule.exports = {\r\n CloseEvent,\r\n ErrorEvent,\r\n Event,\r\n EventTarget,\r\n MessageEvent\r\n};\r\n\r\n/**\r\n * Call an event listener\r\n *\r\n * @param {(Function|Object)} listener The listener to call\r\n * @param {*} thisArg The value to use as `this`` when calling the listener\r\n * @param {Event} event The event to pass to the listener\r\n * @private\r\n */\r\nfunction callListener(listener, thisArg, event) {\r\n if (typeof listener === 'object' && listener.handleEvent) {\r\n listener.handleEvent.call(listener, event);\r\n } else {\r\n listener.call(thisArg, event);\r\n }\r\n}\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvd3MvbGliL2V2ZW50LXRhcmdldC5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0EsUUFBUSxrQ0FBa0MsRUFBRSxtQkFBTyxDQUFDLDZEQUFhO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsY0FBYyxXQUFXO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQsa0JBQWtCO0FBQ3JFLGlEQUFpRCxrQkFBa0I7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRCxrQkFBa0I7QUFDeEUsd0RBQXdELGtCQUFrQjtBQUMxRSwwREFBMEQsa0JBQWtCO0FBQzVFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGFBQWEsR0FBRztBQUNoQixhQUFhLFFBQVE7QUFDckI7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVEQUF1RCxrQkFBa0I7QUFDekUseURBQXlELGtCQUFrQjtBQUMzRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckI7QUFDQSxhQUFhLEdBQUc7QUFDaEI7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RCxrQkFBa0I7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLG1CQUFtQjtBQUNoQyxhQUFhLFFBQVE7QUFDckI7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsbUJBQW1CO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLG1CQUFtQjtBQUM5QixXQUFXLEdBQUc7QUFDZCxXQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9uZXh0anMvLi9ub2RlX21vZHVsZXMvd3MvbGliL2V2ZW50LXRhcmdldC5qcz83MzNhIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcclxuXHJcbmNvbnN0IHsga0Zvck9uRXZlbnRBdHRyaWJ1dGUsIGtMaXN0ZW5lciB9ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKTtcclxuXHJcbmNvbnN0IGtDb2RlID0gU3ltYm9sKCdrQ29kZScpO1xyXG5jb25zdCBrRGF0YSA9IFN5bWJvbCgna0RhdGEnKTtcclxuY29uc3Qga0Vycm9yID0gU3ltYm9sKCdrRXJyb3InKTtcclxuY29uc3Qga01lc3NhZ2UgPSBTeW1ib2woJ2tNZXNzYWdlJyk7XHJcbmNvbnN0IGtSZWFzb24gPSBTeW1ib2woJ2tSZWFzb24nKTtcclxuY29uc3Qga1RhcmdldCA9IFN5bWJvbCgna1RhcmdldCcpO1xyXG5jb25zdCBrVHlwZSA9IFN5bWJvbCgna1R5cGUnKTtcclxuY29uc3Qga1dhc0NsZWFuID0gU3ltYm9sKCdrV2FzQ2xlYW4nKTtcclxuXHJcbi8qKlxyXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgYW4gZXZlbnQuXHJcbiAqL1xyXG5jbGFzcyBFdmVudCB7XHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgbmV3IGBFdmVudGAuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcclxuICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIHRoZSBgdHlwZWAgYXJndW1lbnQgaXMgbm90IHNwZWNpZmllZFxyXG4gICAqL1xyXG4gIGNvbnN0cnVjdG9yKHR5cGUpIHtcclxuICAgIHRoaXNba1RhcmdldF0gPSBudWxsO1xyXG4gICAgdGhpc1trVHlwZV0gPSB0eXBlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQHR5cGUgeyp9XHJcbiAgICovXHJcbiAgZ2V0IHRhcmdldCgpIHtcclxuICAgIHJldHVybiB0aGlzW2tUYXJnZXRdO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQHR5cGUge1N0cmluZ31cclxuICAgKi9cclxuICBnZXQgdHlwZSgpIHtcclxuICAgIHJldHVybiB0aGlzW2tUeXBlXTtcclxuICB9XHJcbn1cclxuXHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudC5wcm90b3R5cGUsICd0YXJnZXQnLCB7IGVudW1lcmFibGU6IHRydWUgfSk7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudC5wcm90b3R5cGUsICd0eXBlJywgeyBlbnVtZXJhYmxlOiB0cnVlIH0pO1xyXG5cclxuLyoqXHJcbiAqIENsYXNzIHJlcHJlc2VudGluZyBhIGNsb3NlIGV2ZW50LlxyXG4gKlxyXG4gKiBAZXh0ZW5kcyBFdmVudFxyXG4gKi9cclxuY2xhc3MgQ2xvc2VFdmVudCBleHRlbmRzIEV2ZW50IHtcclxuICAvKipcclxuICAgKiBDcmVhdGUgYSBuZXcgYENsb3NlRXZlbnRgLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50XHJcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBBIGRpY3Rpb25hcnkgb2JqZWN0IHRoYXQgYWxsb3dzIGZvciBzZXR0aW5nXHJcbiAgICogICAgIGF0dHJpYnV0ZXMgdmlhIG9iamVjdCBtZW1iZXJzIG9mIHRoZSBzYW1lIG5hbWVcclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuY29kZT0wXSBUaGUgc3RhdHVzIGNvZGUgZXhwbGFpbmluZyB3aHkgdGhlXHJcbiAgICogICAgIGNvbm5lY3Rpb24gd2FzIGNsb3NlZFxyXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5yZWFzb249JyddIEEgaHVtYW4tcmVhZGFibGUgc3RyaW5nIGV4cGxhaW5pbmcgd2h5XHJcbiAgICogICAgIHRoZSBjb25uZWN0aW9uIHdhcyBjbG9zZWRcclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLndhc0NsZWFuPWZhbHNlXSBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlXHJcbiAgICogICAgIGNvbm5lY3Rpb24gd2FzIGNsZWFubHkgY2xvc2VkXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3IodHlwZSwgb3B0aW9ucyA9IHt9KSB7XHJcbiAgICBzdXBlcih0eXBlKTtcclxuXHJcbiAgICB0aGlzW2tDb2RlXSA9IG9wdGlvbnMuY29kZSA9PT0gdW5kZWZpbmVkID8gMCA6IG9wdGlvbnMuY29kZTtcclxuICAgIHRoaXNba1JlYXNvbl0gPSBvcHRpb25zLnJlYXNvbiA9PT0gdW5kZWZpbmVkID8gJycgOiBvcHRpb25zLnJlYXNvbjtcclxuICAgIHRoaXNba1dhc0NsZWFuXSA9IG9wdGlvbnMud2FzQ2xlYW4gPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogb3B0aW9ucy53YXNDbGVhbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEB0eXBlIHtOdW1iZXJ9XHJcbiAgICovXHJcbiAgZ2V0IGNvZGUoKSB7XHJcbiAgICByZXR1cm4gdGhpc1trQ29kZV07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAdHlwZSB7U3RyaW5nfVxyXG4gICAqL1xyXG4gIGdldCByZWFzb24oKSB7XHJcbiAgICByZXR1cm4gdGhpc1trUmVhc29uXTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEB0eXBlIHtCb29sZWFufVxyXG4gICAqL1xyXG4gIGdldCB3YXNDbGVhbigpIHtcclxuICAgIHJldHVybiB0aGlzW2tXYXNDbGVhbl07XHJcbiAgfVxyXG59XHJcblxyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQ2xvc2VFdmVudC5wcm90b3R5cGUsICdjb2RlJywgeyBlbnVtZXJhYmxlOiB0cnVlIH0pO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQ2xvc2VFdmVudC5wcm90b3R5cGUsICdyZWFzb24nLCB7IGVudW1lcmFibGU6IHRydWUgfSk7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShDbG9zZUV2ZW50LnByb3RvdHlwZSwgJ3dhc0NsZWFuJywgeyBlbnVtZXJhYmxlOiB0cnVlIH0pO1xyXG5cclxuLyoqXHJcbiAqIENsYXNzIHJlcHJlc2VudGluZyBhbiBlcnJvciBldmVudC5cclxuICpcclxuICogQGV4dGVuZHMgRXZlbnRcclxuICovXHJcbmNsYXNzIEVycm9yRXZlbnQgZXh0ZW5kcyBFdmVudCB7XHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgbmV3IGBFcnJvckV2ZW50YC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIFRoZSBuYW1lIG9mIHRoZSBldmVudFxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gQSBkaWN0aW9uYXJ5IG9iamVjdCB0aGF0IGFsbG93cyBmb3Igc2V0dGluZ1xyXG4gICAqICAgICBhdHRyaWJ1dGVzIHZpYSBvYmplY3QgbWVtYmVycyBvZiB0aGUgc2FtZSBuYW1lXHJcbiAgICogQHBhcmFtIHsqfSBbb3B0aW9ucy5lcnJvcj1udWxsXSBUaGUgZXJyb3IgdGhhdCBnZW5lcmF0ZWQgdGhpcyBldmVudFxyXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5tZXNzYWdlPScnXSBUaGUgZXJyb3IgbWVzc2FnZVxyXG4gICAqL1xyXG4gIGNvbnN0cnVjdG9yKHR5cGUsIG9wdGlvbnMgPSB7fSkge1xyXG4gICAgc3VwZXIodHlwZSk7XHJcblxyXG4gICAgdGhpc1trRXJyb3JdID0gb3B0aW9ucy5lcnJvciA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IG9wdGlvbnMuZXJyb3I7XHJcbiAgICB0aGlzW2tNZXNzYWdlXSA9IG9wdGlvbnMubWVzc2FnZSA9PT0gdW5kZWZpbmVkID8gJycgOiBvcHRpb25zLm1lc3NhZ2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAdHlwZSB7Kn1cclxuICAgKi9cclxuICBnZXQgZXJyb3IoKSB7XHJcbiAgICByZXR1cm4gdGhpc1trRXJyb3JdO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQHR5cGUge1N0cmluZ31cclxuICAgKi9cclxuICBnZXQgbWVzc2FnZSgpIHtcclxuICAgIHJldHVybiB0aGlzW2tNZXNzYWdlXTtcclxuICB9XHJcbn1cclxuXHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShFcnJvckV2ZW50LnByb3RvdHlwZSwgJ2Vycm9yJywgeyBlbnVtZXJhYmxlOiB0cnVlIH0pO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRXJyb3JFdmVudC5wcm90b3R5cGUsICdtZXNzYWdlJywgeyBlbnVtZXJhYmxlOiB0cnVlIH0pO1xyXG5cclxuLyoqXHJcbiAqIENsYXNzIHJlcHJlc2VudGluZyBhIG1lc3NhZ2UgZXZlbnQuXHJcbiAqXHJcbiAqIEBleHRlbmRzIEV2ZW50XHJcbiAqL1xyXG5jbGFzcyBNZXNzYWdlRXZlbnQgZXh0ZW5kcyBFdmVudCB7XHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgbmV3IGBNZXNzYWdlRXZlbnRgLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50XHJcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBBIGRpY3Rpb25hcnkgb2JqZWN0IHRoYXQgYWxsb3dzIGZvciBzZXR0aW5nXHJcbiAgICogICAgIGF0dHJpYnV0ZXMgdmlhIG9iamVjdCBtZW1iZXJzIG9mIHRoZSBzYW1lIG5hbWVcclxuICAgKiBAcGFyYW0geyp9IFtvcHRpb25zLmRhdGE9bnVsbF0gVGhlIG1lc3NhZ2UgY29udGVudFxyXG4gICAqL1xyXG4gIGNvbnN0cnVjdG9yKHR5cGUsIG9wdGlvbnMgPSB7fSkge1xyXG4gICAgc3VwZXIodHlwZSk7XHJcblxyXG4gICAgdGhpc1trRGF0YV0gPSBvcHRpb25zLmRhdGEgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBvcHRpb25zLmRhdGE7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAdHlwZSB7Kn1cclxuICAgKi9cclxuICBnZXQgZGF0YSgpIHtcclxuICAgIHJldHVybiB0aGlzW2tEYXRhXTtcclxuICB9XHJcbn1cclxuXHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShNZXNzYWdlRXZlbnQucHJvdG90eXBlLCAnZGF0YScsIHsgZW51bWVyYWJsZTogdHJ1ZSB9KTtcclxuXHJcbi8qKlxyXG4gKiBUaGlzIHByb3ZpZGVzIG1ldGhvZHMgZm9yIGVtdWxhdGluZyB0aGUgYEV2ZW50VGFyZ2V0YCBpbnRlcmZhY2UuIEl0J3Mgbm90XHJcbiAqIG1lYW50IHRvIGJlIHVzZWQgZGlyZWN0bHkuXHJcbiAqXHJcbiAqIEBtaXhpblxyXG4gKi9cclxuY29uc3QgRXZlbnRUYXJnZXQgPSB7XHJcbiAgLyoqXHJcbiAgICogUmVnaXN0ZXIgYW4gZXZlbnQgbGlzdGVuZXIuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGV2ZW50IHR5cGUgdG8gbGlzdGVuIGZvclxyXG4gICAqIEBwYXJhbSB7KEZ1bmN0aW9ufE9iamVjdCl9IGhhbmRsZXIgVGhlIGxpc3RlbmVyIHRvIGFkZFxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gQW4gb3B0aW9ucyBvYmplY3Qgc3BlY2lmaWVzIGNoYXJhY3RlcmlzdGljcyBhYm91dFxyXG4gICAqICAgICB0aGUgZXZlbnQgbGlzdGVuZXJcclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLm9uY2U9ZmFsc2VdIEEgYEJvb2xlYW5gIGluZGljYXRpbmcgdGhhdCB0aGVcclxuICAgKiAgICAgbGlzdGVuZXIgc2hvdWxkIGJlIGludm9rZWQgYXQgbW9zdCBvbmNlIGFmdGVyIGJlaW5nIGFkZGVkLiBJZiBgdHJ1ZWAsXHJcbiAgICogICAgIHRoZSBsaXN0ZW5lciB3b3VsZCBiZSBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgd2hlbiBpbnZva2VkLlxyXG4gICAqIEBwdWJsaWNcclxuICAgKi9cclxuICBhZGRFdmVudExpc3RlbmVyKHR5cGUsIGhhbmRsZXIsIG9wdGlvbnMgPSB7fSkge1xyXG4gICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLmxpc3RlbmVycyh0eXBlKSkge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgIW9wdGlvbnNba0Zvck9uRXZlbnRBdHRyaWJ1dGVdICYmXHJcbiAgICAgICAgbGlzdGVuZXJba0xpc3RlbmVyXSA9PT0gaGFuZGxlciAmJlxyXG4gICAgICAgICFsaXN0ZW5lcltrRm9yT25FdmVudEF0dHJpYnV0ZV1cclxuICAgICAgKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHdyYXBwZXI7XHJcblxyXG4gICAgaWYgKHR5cGUgPT09ICdtZXNzYWdlJykge1xyXG4gICAgICB3cmFwcGVyID0gZnVuY3Rpb24gb25NZXNzYWdlKGRhdGEsIGlzQmluYXJ5KSB7XHJcbiAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgTWVzc2FnZUV2ZW50KCdtZXNzYWdlJywge1xyXG4gICAgICAgICAgZGF0YTogaXNCaW5hcnkgPyBkYXRhIDogZGF0YS50b1N0cmluZygpXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGV2ZW50W2tUYXJnZXRdID0gdGhpcztcclxuICAgICAgICBjYWxsTGlzdGVuZXIoaGFuZGxlciwgdGhpcywgZXZlbnQpO1xyXG4gICAgICB9O1xyXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnY2xvc2UnKSB7XHJcbiAgICAgIHdyYXBwZXIgPSBmdW5jdGlvbiBvbkNsb3NlKGNvZGUsIG1lc3NhZ2UpIHtcclxuICAgICAgICBjb25zdCBldmVudCA9IG5ldyBDbG9zZUV2ZW50KCdjbG9zZScsIHtcclxuICAgICAgICAgIGNvZGUsXHJcbiAgICAgICAgICByZWFzb246IG1lc3NhZ2UudG9TdHJpbmcoKSxcclxuICAgICAgICAgIHdhc0NsZWFuOiB0aGlzLl9jbG9zZUZyYW1lUmVjZWl2ZWQgJiYgdGhpcy5fY2xvc2VGcmFtZVNlbnRcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZXZlbnRba1RhcmdldF0gPSB0aGlzO1xyXG4gICAgICAgIGNhbGxMaXN0ZW5lcihoYW5kbGVyLCB0aGlzLCBldmVudCk7XHJcbiAgICAgIH07XHJcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdlcnJvcicpIHtcclxuICAgICAgd3JhcHBlciA9IGZ1bmN0aW9uIG9uRXJyb3IoZXJyb3IpIHtcclxuICAgICAgICBjb25zdCBldmVudCA9IG5ldyBFcnJvckV2ZW50KCdlcnJvcicsIHtcclxuICAgICAgICAgIGVycm9yLFxyXG4gICAgICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBldmVudFtrVGFyZ2V0XSA9IHRoaXM7XHJcbiAgICAgICAgY2FsbExpc3RlbmVyKGhhbmRsZXIsIHRoaXMsIGV2ZW50KTtcclxuICAgICAgfTtcclxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ29wZW4nKSB7XHJcbiAgICAgIHdyYXBwZXIgPSBmdW5jdGlvbiBvbk9wZW4oKSB7XHJcbiAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnQoJ29wZW4nKTtcclxuXHJcbiAgICAgICAgZXZlbnRba1RhcmdldF0gPSB0aGlzO1xyXG4gICAgICAgIGNhbGxMaXN0ZW5lcihoYW5kbGVyLCB0aGlzLCBldmVudCk7XHJcbiAgICAgIH07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgd3JhcHBlcltrRm9yT25FdmVudEF0dHJpYnV0ZV0gPSAhIW9wdGlvbnNba0Zvck9uRXZlbnRBdHRyaWJ1dGVdO1xyXG4gICAgd3JhcHBlcltrTGlzdGVuZXJdID0gaGFuZGxlcjtcclxuXHJcbiAgICBpZiAob3B0aW9ucy5vbmNlKSB7XHJcbiAgICAgIHRoaXMub25jZSh0eXBlLCB3cmFwcGVyKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMub24odHlwZSwgd3JhcHBlcik7XHJcbiAgICB9XHJcbiAgfSxcclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBldmVudCB0eXBlIHRvIHJlbW92ZVxyXG4gICAqIEBwYXJhbSB7KEZ1bmN0aW9ufE9iamVjdCl9IGhhbmRsZXIgVGhlIGxpc3RlbmVyIHRvIHJlbW92ZVxyXG4gICAqIEBwdWJsaWNcclxuICAgKi9cclxuICByZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGhhbmRsZXIpIHtcclxuICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5saXN0ZW5lcnModHlwZSkpIHtcclxuICAgICAgaWYgKGxpc3RlbmVyW2tMaXN0ZW5lcl0gPT09IGhhbmRsZXIgJiYgIWxpc3RlbmVyW2tGb3JPbkV2ZW50QXR0cmlidXRlXSkge1xyXG4gICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgQ2xvc2VFdmVudCxcclxuICBFcnJvckV2ZW50LFxyXG4gIEV2ZW50LFxyXG4gIEV2ZW50VGFyZ2V0LFxyXG4gIE1lc3NhZ2VFdmVudFxyXG59O1xyXG5cclxuLyoqXHJcbiAqIENhbGwgYW4gZXZlbnQgbGlzdGVuZXJcclxuICpcclxuICogQHBhcmFtIHsoRnVuY3Rpb258T2JqZWN0KX0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIGNhbGxcclxuICogQHBhcmFtIHsqfSB0aGlzQXJnIFRoZSB2YWx1ZSB0byB1c2UgYXMgYHRoaXNgYCB3aGVuIGNhbGxpbmcgdGhlIGxpc3RlbmVyXHJcbiAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IFRoZSBldmVudCB0byBwYXNzIHRvIHRoZSBsaXN0ZW5lclxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuZnVuY3Rpb24gY2FsbExpc3RlbmVyKGxpc3RlbmVyLCB0aGlzQXJnLCBldmVudCkge1xyXG4gIGlmICh0eXBlb2YgbGlzdGVuZXIgPT09ICdvYmplY3QnICYmIGxpc3RlbmVyLmhhbmRsZUV2ZW50KSB7XHJcbiAgICBsaXN0ZW5lci5oYW5kbGVFdmVudC5jYWxsKGxpc3RlbmVyLCBldmVudCk7XHJcbiAgfSBlbHNlIHtcclxuICAgIGxpc3RlbmVyLmNhbGwodGhpc0FyZywgZXZlbnQpO1xyXG4gIH1cclxufVxyXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/ws/lib/event-target.js\n");
/***/ }),
/***/ "(ssr)/./node_modules/ws/lib/extension.js":
/*!******************************************!*\
!*** ./node_modules/ws/lib/extension.js ***!
\******************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
eval("\r\n\r\nconst { tokenChars } = __webpack_require__(/*! ./validation */ \"(ssr)/./node_modules/ws/lib/validation.js\");\r\n\r\n/**\r\n * Adds an offer to the map of extension offers or a parameter to the map of\r\n * parameters.\r\n *\r\n * @param {Object} dest The map of extension offers or parameters\r\n * @param {String} name The extension or parameter name\r\n * @param {(Object|Boolean|String)} elem The extension parameters or the\r\n * parameter value\r\n * @private\r\n */\r\nfunction push(dest, name, elem) {\r\n if (dest[name] === undefined) dest[name] = [elem];\r\n else dest[name].push(elem);\r\n}\r\n\r\n/**\r\n * Parses the `Sec-WebSocket-Extensions` header into an object.\r\n *\r\n * @param {String} header The field value of the header\r\n * @return {Object} The parsed object\r\n * @public\r\n */\r\nfunction parse(header) {\r\n const offers = Object.create(null);\r\n let params = Object.create(null);\r\n let mustUnescape = false;\r\n let isEscaping = false;\r\n let inQuotes = false;\r\n let extensionName;\r\n let paramName;\r\n let start = -1;\r\n let code = -1;\r\n let end = -1;\r\n let i = 0;\r\n\r\n for (; i < header.length; i++) {\r\n code = header.charCodeAt(i);\r\n\r\n if (extensionName === undefined) {\r\n if (end === -1 && tokenChars[code] === 1) {\r\n if (start === -1) start = i;\r\n } else if (\r\n i !== 0 &&\r\n (code === 0x20 /* ' ' */ || code === 0x09) /* '\\t' */\r\n ) {\r\n if (end === -1 && start !== -1) end = i;\r\n } else if (code === 0x3b /* ';' */ || code === 0x2c /* ',' */) {\r\n if (start === -1) {\r\n throw new SyntaxError(`Unexpected character at index ${i}`);\r\n }\r\n\r\n if (end === -1) end = i;\r\n const name = header.slice(start, end);\r\n if (code === 0x2c) {\r\n push(offers, name, params);\r\n params = Object.create(null);\r\n } else {\r\n extensionName = name;\r\n }\r\n\r\n start = end = -1;\r\n } else {\r\n throw new SyntaxError(`Unexpected character at index ${i}`);\r\n }\r\n } else if (paramName === undefined) {\r\n if (end === -1 && tokenChars[code] === 1) {\r\n if (start === -1) start = i;\r\n } else if (code === 0x20 || code === 0x09) {\r\n if (end === -1 && start !== -1) end = i;\r\n } else if (code === 0x3b || code === 0x2c) {\r\n if (start === -1) {\r\n throw new SyntaxError(`Unexpected character at index ${i}`);\r\n }\r\n\r\n if (end === -1) end = i;\r\n push(params, header.slice(start, end), true);\r\n if (code === 0x2c) {\r\n push(offers, extensionName, params);\r\n params = Object.create(null);\r\n extensionName = undefined;\r\n }\r\n\r\n start = end = -1;\r\n } else if (code === 0x3d /* '=' */ && start !== -1 && end === -1) {\r\n paramName = header.slice(start, i);\r\n start = end = -1;\r\n } else {\r\n throw new SyntaxError(`Unexpected character at index ${i}`);\r\n }\r\n } else {\r\n //\r\n // The value of a quoted-string after unescaping must conform to the\r\n // token ABNF, so only token characters are valid.\r\n // Ref: https://tools.ietf.org/html/rfc6455#section-9.1\r\n //\r\n if (isEscaping) {\r\n if (tokenChars[code] !== 1) {\r\n throw new SyntaxError(`Unexpected character at index ${i}`);\r\n }\r\n if (start === -1) start = i;\r\n else if (!mustUnescape) mustUnescape = true;\r\n isEscaping = false;\r\n } else if (inQuotes) {\r\n if (tokenChars[code] === 1) {\r\n if (start === -1) start = i;\r\n } else if (code === 0x22 /* '\"' */ && start !== -1) {\r\n inQuotes = false;\r\n end = i;\r\n } else if (code === 0x5c /* '\\' */) {\r\n isEscaping = true;\r\n } else {\r\n throw new SyntaxError(`Unexpected character at index ${i}`);\r\n }\r\n } else if (code === 0x22 && header.charCodeAt(i - 1) === 0x3d) {\r\n inQuotes = true;\r\n } else if (end === -1 && tokenChars[code] === 1) {\r\n if (start === -1) start = i;\r\n } else if (start !== -1 && (code === 0x20 || code === 0x09)) {\r\n if (end === -1) end = i;\r\n } else if (code === 0x3b || code === 0x2c) {\r\n if (start === -1) {\r\n throw new SyntaxError(`Unexpected character at index ${i}`);\r\n }\r\n\r\n if (end === -1) end = i;\r\n let value = header.slice(start, end);\r\n if (mustUnescape) {\r\n value = value.replace(/\\\\/g, '');\r\n mustUnescape = false;\r\n }\r\n push(params, paramName, value);\r\n if (code === 0x2c) {\r\n push(offers, extensionName, params);\r\n params = Object.create(null);\r\n extensionName = undefined;\r\n }\r\n\r\n paramName = undefined;\r\n start = end = -1;\r\n } else {\r\n throw new SyntaxError(`Unexpected character at index ${i}`);\r\n }\r\n }\r\n }\r\n\r\n if (start === -1 || inQuotes || code === 0x20 || code === 0x09) {\r\n throw new SyntaxError('Unexpected end of input');\r\n }\r\n\r\n if (end === -1) end = i;\r\n const token = header.slice(start, end);\r\n if (extensionName === undefined) {\r\n push(offers, token, params);\r\n } else {\r\n if (paramName === undefined) {\r\n push(params, token, true);\r\n } else if (mustUnescape) {\r\n push(params, paramName, token.replace(/\\\\/g, ''));\r\n } else {\r\n push(params, paramName, token);\r\n }\r\n push(offers, extensionName, params);\r\n }\r\n\r\n return offers;\r\n}\r\n\r\n/**\r\n * Builds the `Sec-WebSocket-Extensions` header field value.\r\n *\r\n * @param {Object} extensions The map of extensions and parameters to format\r\n * @return {String} A string representing the given object\r\n * @public\r\n */\r\nfunction format(extensions) {\r\n return Object.keys(extensions)\r\n .map((extension) => {\r\n let configurations = extensions[extension];\r\n if (!Array.isArray(configurations)) configurations = [configurations];\r\n return configurations\r\n .map((params) => {\r\n return [extension]\r\n .concat(\r\n Object.keys(params).map((k) => {\r\n let values = params[k];\r\n if (!Array.isArray(values)) values = [values];\r\n return values\r\n .map((v) => (v === true ? k : `${k}=${v}`))\r\n .join('; ');\r\n })\r\n )\r\n .join('; ');\r\n })\r\n .join(', ');\r\n })\r\n .join(', ');\r\n}\r\n\r\nmodule.exports = { format, parse };\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvd3MvbGliL2V4dGVuc2lvbi5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0EsUUFBUSxhQUFhLEVBQUUsbUJBQU8sQ0FBQywrREFBYztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLHlCQUF5QjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFlBQVksUUFBUTtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLG1CQUFtQjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSw0QkFBNEI7QUFDcEM7QUFDQSxpRUFBaUUsRUFBRTtBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUiwrREFBK0QsRUFBRTtBQUNqRTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsaUVBQWlFLEVBQUU7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsUUFBUTtBQUNSLCtEQUErRCxFQUFFO0FBQ2pFO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUVBQWlFLEVBQUU7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWLGlFQUFpRSxFQUFFO0FBQ25FO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsaUVBQWlFLEVBQUU7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUiwrREFBK0QsRUFBRTtBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFlBQVksUUFBUTtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQsRUFBRSxHQUFHLEVBQUU7QUFDMUQsMkJBQTJCO0FBQzNCLGVBQWU7QUFDZjtBQUNBLHFCQUFxQjtBQUNyQixTQUFTO0FBQ1Q7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vbmV4dGpzLy4vbm9kZV9tb2R1bGVzL3dzL2xpYi9leHRlbnNpb24uanM/OTY0ZiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XHJcblxyXG5jb25zdCB7IHRva2VuQ2hhcnMgfSA9IHJlcXVpcmUoJy4vdmFsaWRhdGlvbicpO1xyXG5cclxuLyoqXHJcbiAqIEFkZHMgYW4gb2ZmZXIgdG8gdGhlIG1hcCBvZiBleHRlbnNpb24gb2ZmZXJzIG9yIGEgcGFyYW1ldGVyIHRvIHRoZSBtYXAgb2ZcclxuICogcGFyYW1ldGVycy5cclxuICpcclxuICogQHBhcmFtIHtPYmplY3R9IGRlc3QgVGhlIG1hcCBvZiBleHRlbnNpb24gb2ZmZXJzIG9yIHBhcmFtZXRlcnNcclxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIGV4dGVuc2lvbiBvciBwYXJhbWV0ZXIgbmFtZVxyXG4gKiBAcGFyYW0geyhPYmplY3R8Qm9vbGVhbnxTdHJpbmcpfSBlbGVtIFRoZSBleHRlbnNpb24gcGFyYW1ldGVycyBvciB0aGVcclxuICogICAgIHBhcmFtZXRlciB2YWx1ZVxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuZnVuY3Rpb24gcHVzaChkZXN0LCBuYW1lLCBlbGVtKSB7XHJcbiAgaWYgKGRlc3RbbmFtZV0gPT09IHVuZGVmaW5lZCkgZGVzdFtuYW1lXSA9IFtlbGVtXTtcclxuICBlbHNlIGRlc3RbbmFtZV0ucHVzaChlbGVtKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFBhcnNlcyB0aGUgYFNlYy1XZWJTb2NrZXQtRXh0ZW5zaW9uc2AgaGVhZGVyIGludG8gYW4gb2JqZWN0LlxyXG4gKlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gaGVhZGVyIFRoZSBmaWVsZCB2YWx1ZSBvZiB0aGUgaGVhZGVyXHJcbiAqIEByZXR1cm4ge09iamVjdH0gVGhlIHBhcnNlZCBvYmplY3RcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZnVuY3Rpb24gcGFyc2UoaGVhZGVyKSB7XHJcbiAgY29uc3Qgb2ZmZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcclxuICBsZXQgcGFyYW1zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcclxuICBsZXQgbXVzdFVuZXNjYXBlID0gZmFsc2U7XHJcbiAgbGV0IGlzRXNjYXBpbmcgPSBmYWxzZTtcclxuICBsZXQgaW5RdW90ZXMgPSBmYWxzZTtcclxuICBsZXQgZXh0ZW5zaW9uTmFtZTtcclxuICBsZXQgcGFyYW1OYW1lO1xyXG4gIGxldCBzdGFydCA9IC0xO1xyXG4gIGxldCBjb2RlID0gLTE7XHJcbiAgbGV0IGVuZCA9IC0xO1xyXG4gIGxldCBpID0gMDtcclxuXHJcbiAgZm9yICg7IGkgPCBoZWFkZXIubGVuZ3RoOyBpKyspIHtcclxuICAgIGNvZGUgPSBoZWFkZXIuY2hhckNvZGVBdChpKTtcclxuXHJcbiAgICBpZiAoZXh0ZW5zaW9uTmFtZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGlmIChlbmQgPT09IC0xICYmIHRva2VuQ2hhcnNbY29kZV0gPT09IDEpIHtcclxuICAgICAgICBpZiAoc3RhcnQgPT09IC0xKSBzdGFydCA9IGk7XHJcbiAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgaSAhPT0gMCAmJlxyXG4gICAgICAgIChjb2RlID09PSAweDIwIC8qICcgJyAqLyB8fCBjb2RlID09PSAweDA5KSAvKiAnXFx0JyAqL1xyXG4gICAgICApIHtcclxuICAgICAgICBpZiAoZW5kID09PSAtMSAmJiBzdGFydCAhPT0gLTEpIGVuZCA9IGk7XHJcbiAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gMHgzYiAvKiAnOycgKi8gfHwgY29kZSA9PT0gMHgyYyAvKiAnLCcgKi8pIHtcclxuICAgICAgICBpZiAoc3RhcnQgPT09IC0xKSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGF0IGluZGV4ICR7aX1gKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChlbmQgPT09IC0xKSBlbmQgPSBpO1xyXG4gICAgICAgIGNvbnN0IG5hbWUgPSBoZWFkZXIuc2xpY2Uoc3RhcnQsIGVuZCk7XHJcbiAgICAgICAgaWYgKGNvZGUgPT09IDB4MmMpIHtcclxuICAgICAgICAgIHB1c2gob2ZmZXJzLCBuYW1lLCBwYXJhbXMpO1xyXG4gICAgICAgICAgcGFyYW1zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgZXh0ZW5zaW9uTmFtZSA9IG5hbWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdGFydCA9IGVuZCA9IC0xO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgVW5leHBlY3RlZCBjaGFyYWN0ZXIgYXQgaW5kZXggJHtpfWApO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHBhcmFtTmFtZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGlmIChlbmQgPT09IC0xICYmIHRva2VuQ2hhcnNbY29kZV0gPT09IDEpIHtcclxuICAgICAgICBpZiAoc3RhcnQgPT09IC0xKSBzdGFydCA9IGk7XHJcbiAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gMHgyMCB8fCBjb2RlID09PSAweDA5KSB7XHJcbiAgICAgICAgaWYgKGVuZCA9PT0gLTEgJiYgc3RhcnQgIT09IC0xKSBlbmQgPSBpO1xyXG4gICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDB4M2IgfHwgY29kZSA9PT0gMHgyYykge1xyXG4gICAgICAgIGlmIChzdGFydCA9PT0gLTEpIHtcclxuICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgVW5leHBlY3RlZCBjaGFyYWN0ZXIgYXQgaW5kZXggJHtpfWApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVuZCA9PT0gLTEpIGVuZCA9IGk7XHJcbiAgICAgICAgcHVzaChwYXJhbXMsIGhlYWRlci5zbGljZShzdGFydCwgZW5kKSwgdHJ1ZSk7XHJcbiAgICAgICAgaWYgKGNvZGUgPT09IDB4MmMpIHtcclxuICAgICAgICAgIHB1c2gob2ZmZXJzLCBleHRlbnNpb25OYW1lLCBwYXJhbXMpO1xyXG4gICAgICAgICAgcGFyYW1zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcclxuICAgICAgICAgIGV4dGVuc2lvbk5hbWUgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdGFydCA9IGVuZCA9IC0xO1xyXG4gICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDB4M2QgLyogJz0nICovICYmIHN0YXJ0ICE9PSAtMSAmJiBlbmQgPT09IC0xKSB7XHJcbiAgICAgICAgcGFyYW1OYW1lID0gaGVhZGVyLnNsaWNlKHN0YXJ0LCBpKTtcclxuICAgICAgICBzdGFydCA9IGVuZCA9IC0xO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgVW5leHBlY3RlZCBjaGFyYWN0ZXIgYXQgaW5kZXggJHtpfWApO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvL1xyXG4gICAgICAvLyBUaGUgdmFsdWUgb2YgYSBxdW90ZWQtc3RyaW5nIGFmdGVyIHVuZXNjYXBpbmcgbXVzdCBjb25mb3JtIHRvIHRoZVxyXG4gICAgICAvLyB0b2tlbiBBQk5GLCBzbyBvbmx5IHRva2VuIGNoYXJhY3RlcnMgYXJlIHZhbGlkLlxyXG4gICAgICAvLyBSZWY6IGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2NDU1I3NlY3Rpb24tOS4xXHJcbiAgICAgIC8vXHJcbiAgICAgIGlmIChpc0VzY2FwaW5nKSB7XHJcbiAgICAgICAgaWYgKHRva2VuQ2hhcnNbY29kZV0gIT09IDEpIHtcclxuICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgVW5leHBlY3RlZCBjaGFyYWN0ZXIgYXQgaW5kZXggJHtpfWApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc3RhcnQgPT09IC0xKSBzdGFydCA9IGk7XHJcbiAgICAgICAgZWxzZSBpZiAoIW11c3RVbmVzY2FwZSkgbXVzdFVuZXNjYXBlID0gdHJ1ZTtcclxuICAgICAgICBpc0VzY2FwaW5nID0gZmFsc2U7XHJcbiAgICAgIH0gZWxzZSBpZiAoaW5RdW90ZXMpIHtcclxuICAgICAgICBpZiAodG9rZW5DaGFyc1tjb2RlXSA9PT0gMSkge1xyXG4gICAgICAgICAgaWYgKHN0YXJ0ID09PSAtMSkgc3RhcnQgPSBpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gMHgyMiAvKiAnXCInICovICYmIHN0YXJ0ICE9PSAtMSkge1xyXG4gICAgICAgICAgaW5RdW90ZXMgPSBmYWxzZTtcclxuICAgICAgICAgIGVuZCA9IGk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChjb2RlID09PSAweDVjIC8qICdcXCcgKi8pIHtcclxuICAgICAgICAgIGlzRXNjYXBpbmcgPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGF0IGluZGV4ICR7aX1gKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gMHgyMiAmJiBoZWFkZXIuY2hhckNvZGVBdChpIC0gMSkgPT09IDB4M2QpIHtcclxuICAgICAgICBpblF1b3RlcyA9IHRydWU7XHJcbiAgICAgIH0gZWxzZSBpZiAoZW5kID09PSAtMSAmJiB0b2tlbkNoYXJzW2NvZGVdID09PSAxKSB7XHJcbiAgICAgICAgaWYgKHN0YXJ0ID09PSAtMSkgc3RhcnQgPSBpO1xyXG4gICAgICB9IGVsc2UgaWYgKHN0YXJ0ICE9PSAtMSAmJiAoY29kZSA9PT0gMHgyMCB8fCBjb2RlID09PSAweDA5KSkge1xyXG4gICAgICAgIGlmIChlbmQgPT09IC0xKSBlbmQgPSBpO1xyXG4gICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDB4M2IgfHwgY29kZSA9PT0gMHgyYykge1xyXG4gICAgICAgIGlmIChzdGFydCA9PT0gLTEpIHtcclxuICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgVW5leHBlY3RlZCBjaGFyYWN0ZXIgYXQgaW5kZXggJHtpfWApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVuZCA9PT0gLTEpIGVuZCA9IGk7XHJcbiAgICAgICAgbGV0IHZhbHVlID0gaGVhZGVyLnNsaWNlKHN0YXJ0LCBlbmQpO1xyXG4gICAgICAgIGlmIChtdXN0VW5lc2NhcGUpIHtcclxuICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXFxcXC9nLCAnJyk7XHJcbiAgICAgICAgICBtdXN0VW5lc2NhcGUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcHVzaChwYXJhbXMsIHBhcmFtTmFtZSwgdmFsdWUpO1xyXG4gICAgICAgIGlmIChjb2RlID09PSAweDJjKSB7XHJcbiAgICAgICAgICBwdXNoKG9mZmVycywgZXh0ZW5zaW9uTmFtZSwgcGFyYW1zKTtcclxuICAgICAgICAgIHBhcmFtcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XHJcbiAgICAgICAgICBleHRlbnNpb25OYW1lID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcGFyYW1OYW1lID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHN0YXJ0ID0gZW5kID0gLTE7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBVbmV4cGVjdGVkIGNoYXJhY3RlciBhdCBpbmRleCAke2l9YCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlmIChzdGFydCA9PT0gLTEgfHwgaW5RdW90ZXMgfHwgY29kZSA9PT0gMHgyMCB8fCBjb2RlID09PSAweDA5KSB7XHJcbiAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ1VuZXhwZWN0ZWQgZW5kIG9mIGlucHV0Jyk7XHJcbiAgfVxyXG5cclxuICBpZiAoZW5kID09PSAtMSkgZW5kID0gaTtcclxuICBjb25zdCB0b2tlbiA9IGhlYWRlci5zbGljZShzdGFydCwgZW5kKTtcclxuICBpZiAoZXh0ZW5zaW9uTmFtZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICBwdXNoKG9mZmVycywgdG9rZW4sIHBhcmFtcyk7XHJcbiAgfSBlbHNlIHtcclxuICAgIGlmIChwYXJhbU5hbWUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBwdXNoKHBhcmFtcywgdG9rZW4sIHRydWUpO1xyXG4gICAgfSBlbHNlIGlmIChtdXN0VW5lc2NhcGUpIHtcclxuICAgICAgcHVzaChwYXJhbXMsIHBhcmFtTmFtZSwgdG9rZW4ucmVwbGFjZSgvXFxcXC9nLCAnJykpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcHVzaChwYXJhbXMsIHBhcmFtTmFtZSwgdG9rZW4pO1xyXG4gICAgfVxyXG4gICAgcHVzaChvZmZlcnMsIGV4dGVuc2lvbk5hbWUsIHBhcmFtcyk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gb2ZmZXJzO1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGRzIHRoZSBgU2VjLVdlYlNvY2tldC1FeHRlbnNpb25zYCBoZWFkZXIgZmllbGQgdmFsdWUuXHJcbiAqXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBleHRlbnNpb25zIFRoZSBtYXAgb2YgZXh0ZW5zaW9ucyBhbmQgcGFyYW1ldGVycyB0byBmb3JtYXRcclxuICogQHJldHVybiB7U3RyaW5nfSBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGdpdmVuIG9iamVjdFxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5mdW5jdGlvbiBmb3JtYXQoZXh0ZW5zaW9ucykge1xyXG4gIHJldHVybiBPYmplY3Qua2V5cyhleHRlbnNpb25zKVxyXG4gICAgLm1hcCgoZXh0ZW5zaW9uKSA9PiB7XHJcbiAgICAgIGxldCBjb25maWd1cmF0aW9ucyA9IGV4dGVuc2lvbnNbZXh0ZW5zaW9uXTtcclxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbmZpZ3VyYXRpb25zKSkgY29uZmlndXJhdGlvbnMgPSBbY29uZmlndXJhdGlvbnNdO1xyXG4gICAgICByZXR1cm4gY29uZmlndXJhdGlvbnNcclxuICAgICAgICAubWFwKChwYXJhbXMpID0+IHtcclxuICAgICAgICAgIHJldHVybiBbZXh0ZW5zaW9uXVxyXG4gICAgICAgICAgICAuY29uY2F0KFxyXG4gICAgICAgICAgICAgIE9iamVjdC5rZXlzKHBhcmFtcykubWFwKChrKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWVzID0gcGFyYW1zW2tdO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpIHZhbHVlcyA9IFt2YWx1ZXNdO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlc1xyXG4gICAgICAgICAgICAgICAgICAubWFwKCh2KSA9PiAodiA9PT0gdHJ1ZSA/IGsgOiBgJHtrfT0ke3Z9YCkpXHJcbiAgICAgICAgICAgICAgICAgIC5qb2luKCc7ICcpO1xyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgLmpvaW4oJzsgJyk7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuam9pbignLCAnKTtcclxuICAgIH0pXHJcbiAgICAuam9pbignLCAnKTtcclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7IGZvcm1hdCwgcGFyc2UgfTtcclxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/ws/lib/extension.js\n");
/***/ }),
/***/ "(ssr)/./node_modules/ws/lib/limiter.js":
/*!****************************************!*\
!*** ./node_modules/ws/lib/limiter.js ***!
\****************************************/
/***/ ((module) => {
eval("\r\n\r\nconst kDone = Symbol('kDone');\r\nconst kRun = Symbol('kRun');\r\n\r\n/**\r\n * A very simple job queue with adjustable concurrency. Adapted from\r\n * https://github.com/STRML/async-limiter\r\n */\r\nclass Limiter {\r\n /**\r\n * Creates a new `Limiter`.\r\n *\r\n * @param {Number} [concurrency=Infinity] The maximum number of jobs allowed\r\n * to run concurrently\r\n */\r\n constructor(concurrency) {\r\n this[kDone] = () => {\r\n this.pending--;\r\n this[kRun]();\r\n };\r\n this.concurrency = concurrency || Infinity;\r\n this.jobs = [];\r\n this.pending = 0;\r\n }\r\n\r\n /**\r\n * Adds a job to the queue.\r\n *\r\n * @param {Function} job The job to run\r\n * @public\r\n */\r\n add(job) {\r\n this.jobs.push(job);\r\n this[kRun]();\r\n }\r\n\r\n /**\r\n * Removes a job from the queue and runs it if possible.\r\n *\r\n * @private\r\n */\r\n [kRun]() {\r\n if (this.pending === this.concurrency) return;\r\n\r\n if (this.jobs.length) {\r\n const job = this.jobs.shift();\r\n\r\n this.pending++;\r\n job(this[kDone]);\r\n }\r\n }\r\n}\r\n\r\nmodule.exports = Limiter;\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvd3MvbGliL2xpbWl0ZXIuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vbmV4dGpzLy4vbm9kZV9tb2R1bGVzL3dzL2xpYi9saW1pdGVyLmpzPzg3Y2MiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xyXG5cclxuY29uc3Qga0RvbmUgPSBTeW1ib2woJ2tEb25lJyk7XHJcbmNvbnN0IGtSdW4gPSBTeW1ib2woJ2tSdW4nKTtcclxuXHJcbi8qKlxyXG4gKiBBIHZlcnkgc2ltcGxlIGpvYiBxdWV1ZSB3aXRoIGFkanVzdGFibGUgY29uY3VycmVuY3kuIEFkYXB0ZWQgZnJvbVxyXG4gKiBodHRwczovL2dpdGh1Yi5jb20vU1RSTUwvYXN5bmMtbGltaXRlclxyXG4gKi9cclxuY2xhc3MgTGltaXRlciB7XHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBhIG5ldyBgTGltaXRlcmAuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge051bWJlcn0gW2NvbmN1cnJlbmN5PUluZmluaXR5XSBUaGUgbWF4aW11bSBudW1iZXIgb2Ygam9icyBhbGxvd2VkXHJcbiAgICogICAgIHRvIHJ1biBjb25jdXJyZW50bHlcclxuICAgKi9cclxuICBjb25zdHJ1Y3Rvcihjb25jdXJyZW5jeSkge1xyXG4gICAgdGhpc1trRG9uZV0gPSAoKSA9PiB7XHJcbiAgICAgIHRoaXMucGVuZGluZy0tO1xyXG4gICAgICB0aGlzW2tSdW5dKCk7XHJcbiAgICB9O1xyXG4gICAgdGhpcy5jb25jdXJyZW5jeSA9IGNvbmN1cnJlbmN5IHx8IEluZmluaXR5O1xyXG4gICAgdGhpcy5qb2JzID0gW107XHJcbiAgICB0aGlzLnBlbmRpbmcgPSAwO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRkcyBhIGpvYiB0byB0aGUgcXVldWUuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBqb2IgVGhlIGpvYiB0byBydW5cclxuICAgKiBAcHVibGljXHJcbiAgICovXHJcbiAgYWRkKGpvYikge1xyXG4gICAgdGhpcy5qb2JzLnB1c2goam9iKTtcclxuICAgIHRoaXNba1J1bl0oKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbW92ZXMgYSBqb2IgZnJvbSB0aGUgcXVldWUgYW5kIHJ1bnMgaXQgaWYgcG9zc2libGUuXHJcbiAgICpcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIFtrUnVuXSgpIHtcclxuICAgIGlmICh0aGlzLnBlbmRpbmcgPT09IHRoaXMuY29uY3VycmVuY3kpIHJldHVybjtcclxuXHJcbiAgICBpZiAodGhpcy5qb2JzLmxlbmd0aCkge1xyXG4gICAgICBjb25zdCBqb2IgPSB0aGlzLmpvYnMuc2hpZnQoKTtcclxuXHJcbiAgICAgIHRoaXMucGVuZGluZysrO1xyXG4gICAgICBqb2IodGhpc1trRG9uZV0pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBMaW1pdGVyO1xyXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/ws/lib/limiter.js\n");
/***/ }),
/***/ "(ssr)/./node_modules/ws/lib/permessage-deflate.js":
/*!***************************************************!*\
!*** ./node_modules/ws/lib/permessage-deflate.js ***!
\***************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
eval("\r\n\r\nconst zlib = __webpack_require__(/*! zlib */ \"zlib\");\r\n\r\nconst bufferUtil = __webpack_require__(/*! ./buffer-util */ \"(ssr)/./node_modules/ws/lib/buffer-util.js\");\r\nconst Limiter = __webpack_require__(/*! ./limiter */ \"(ssr)/./node_modules/ws/lib/limiter.js\");\r\nconst { kStatusCode } = __webpack_require__(/*! ./constants */ \"(ssr)/./node_modules/ws/lib/constants.js\");\r\n\r\nconst FastBuffer = Buffer[Symbol.species];\r\nconst TRAILER = Buffer.from([0x00, 0x00, 0xff, 0xff]);\r\nconst kPerMessageDeflate = Symbol('permessage-deflate');\r\nconst kTotalLength = Symbol('total-length');\r\nconst kCallback = Symbol('callback');\r\nconst kBuffers = Symbol('buffers');\r\nconst kError = Symbol('error');\r\n\r\n//\r\n// We limit zlib concurrency, which prevents severe memory fragmentation\r\n// as documented in https://github.com/nodejs/node/issues/8871#issuecomment-250915913\r\n// and https://github.com/websockets/ws/issues/1202\r\n//\r\n// Intentionally global; it's the global thread pool that's an issue.\r\n//\r\nlet zlibLimiter;\r\n\r\n/**\r\n * permessage-deflate implementation.\r\n */\r\nclass PerMessageDeflate {\r\n /**\r\n * Creates a PerMessageDeflate instance.\r\n *\r\n * @param {Object} [options] Configuration options\r\n * @param {(Boolean|Number)} [options.clientMaxWindowBits] Advertise support\r\n * for, or request, a custom client window size\r\n * @param {Boolean} [options.clientNoContextTakeover=false] Advertise/\r\n * acknowledge disabling of client context takeover\r\n * @param {Number} [options.concurrencyLimit=10] The number of concurrent\r\n * calls to zlib\r\n * @param {(Boolean|Number)} [options.serverMaxWindowBits] Request/confirm the\r\n * use of a custom server window size\r\n * @param {Boolean} [options.serverNoContextTakeover=false] Request/accept\r\n * disabling of server context takeover\r\n * @param {Number} [options.threshold=1024] Size (in bytes) below which\r\n * messages should not be compressed if context takeover is disabled\r\n * @param {Object} [options.zlibDeflateOptions] Options to pass to zlib on\r\n * deflate\r\n * @param {Object} [options.zlibInflateOptions] Options to pass to zlib on\r\n * inflate\r\n * @param {Boolean} [isServer=false] Create the instance in either server or\r\n * client mode\r\n * @param {Number} [maxPayload=0] The maximum allowed message length\r\n */\r\n constructor(options, isServer, maxPayload) {\r\n this._maxPayload = maxPayload | 0;\r\n this._options = options || {};\r\n this._threshold =\r\n this._options.threshold !== undefined ? this._options.threshold : 1024;\r\n this._isServer = !!isServer;\r\n this._deflate = null;\r\n this._inflate = null;\r\n\r\n this.params = null;\r\n\r\n if (!zlibLimiter) {\r\n const concurrency =\r\n this._options.concurrencyLimit !== undefined\r\n ? this._options.concurrencyLimit\r\n : 10;\r\n zlibLimiter = new Limiter(concurrency);\r\n }\r\n }\r\n\r\n /**\r\n * @type {String}\r\n */\r\n static get extensionName() {\r\n return 'permessage-deflate';\r\n }\r\n\r\n /**\r\n * Create an extension negotiation offer.\r\n *\r\n * @return {Object} Extension parameters\r\n * @public\r\n */\r\n offer() {\r\n const params = {};\r\n\r\n if (this._options.serverNoContextTakeover) {\r\n params.server_no_context_takeover = true;\r\n }\r\n if (this._options.clientNoContextTakeover) {\r\n params.client_no_context_takeover = true;\r\n }\r\n if (this._options.serverMaxWindowBits) {\r\n params.server_max_window_bits = this._options.serverMaxWindowBits;\r\n }\r\n if (this._options.clientMaxWindowBits) {\r\n params.client_max_window_bits = this._options.clientMaxWindowBits;\r\n } else if (this._options.clientMaxWindowBits == null) {\r\n params.client_max_window_bits = true;\r\n }\r\n\r\n return params;\r\n }\r\n\r\n /**\r\n * Accept an extension negotiation offer/response.\r\n *\r\n * @param {Array} configurations The extension negotiation offers/reponse\r\n * @return {Object} Accepted configuration\r\n * @public\r\n */\r\n accept(configurations) {\r\n configurations = this.normalizeParams(configurations);\r\n\r\n this.params = this._isServer\r\n ? this.acceptAsServer(configurations)\r\n : this.acceptAsClient(configurations);\r\n\r\n return this.params;\r\n }\r\n\r\n /**\r\n * Releases all resources used by the extension.\r\n *\r\n * @public\r\n */\r\n cleanup() {\r\n if (this._inflate) {\r\n this._inflate.close();\r\n this._inflate = null;\r\n }\r\n\r\n if (this._deflate) {\r\n const callback = this._deflate[kCallback];\r\n\r\n this._deflate.close();\r\n this._deflate = null;\r\n\r\n if (callback) {\r\n callback(\r\n new Error(\r\n 'The deflate stream was closed while data was being processed'\r\n )\r\n );\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Accept an extension negotiation offer.\r\n *\r\n * @param {Array} offers The extension negotiation offers\r\n * @return {Object} Accepted configuration\r\n * @private\r\n */\r\n acceptAsServer(offers) {\r\n const opts = this._options;\r\n const accepted = offers.find((params) => {\r\n if (\r\n (opts.serverNoContextTakeover === false &&\r\n params.server_no_context_takeover) ||\r\n (params.server_max_window_bits &&\r\n (opts.serverMaxWindowBits === false ||\r\n (typeof opts.serverMaxWindowBits === 'number' &&\r\n opts.serverMaxWindowBits > params.server_max_window_bits))) ||\r\n (typeof opts.clientMaxWindowBits === 'number' &&\r\n !params.client_max_window_bits)\r\n ) {\r\n return false;\r\n }\r\n\r\n return true;\r\n });\r\n\r\n if (!accepted) {\r\n throw new Error('None of the extension offers can be accepted');\r\n }\r\n\r\n if (opts.serverNoContextTakeover) {\r\n accepted.server_no_context_takeover = true;\r\n }\r\n if (opts.clientNoContextTakeover) {\r\n accepted.client_no_context_takeover = true;\r\n }\r\n if (typeof opts.serverMaxWindowBits === 'number') {\r\n accepted.server_max_window_bits = opts.serverMaxWindowBits;\r\n }\r\n if (typeof opts.clientMaxWindowBits === 'number') {\r\n accepted.client_max_window_bits = opts.clientMaxWindowBits;\r\n } else if (\r\n accepted.client_max_window_bits === true ||\r\n opts.clientMaxWindowBits === false\r\n ) {\r\n delete accepted.client_max_window_bits;\r\n }\r\n\r\n return accepted;\r\n }\r\n\r\n /**\r\n * Accept the extension negotiation response.\r\n *\r\n * @param {Array} response The extension negotiation response\r\n * @return {Object} Accepted configuration\r\n * @private\r\n */\r\n acceptAsClient(response) {\r\n const params = response[0];\r\n\r\n if (\r\n this._options.clientNoContextTakeover === false &&\r\n params.client_no_context_takeover\r\n ) {\r\n throw new Error('Unexpected parameter \"client_no_context_takeover\"');\r\n }\r\n\r\n if (!params.client_max_window_bits) {\r\n if (typeof this._options.clientMaxWindowBits === 'number') {\r\n params.client_max_window_bits = this._options.clientMaxWindowBits;\r\n }\r\n } else if (\r\n this._options.clientMaxWindowBits === false ||\r\n (typeof this._options.clientMaxWindowBits === 'number' &&\r\n params.client_max_window_bits > this._options.clientMaxWindowBits)\r\n ) {\r\n throw new Error(\r\n 'Unexpected or invalid parameter \"client_max_window_bits\"'\r\n );\r\n }\r\n\r\n return params;\r\n }\r\n\r\n /**\r\n * Normalize parameters.\r\n *\r\n * @param {Array} configurations The extension negotiation offers/reponse\r\n * @return {Array} The offers/response with normalized parameters\r\n * @private\r\n */\r\n normalizeParams(configurations) {\r\n configurations.forEach((params) => {\r\n Object.keys(params).forEach((key) => {\r\n let value = params[key];\r\n\r\n if (value.length > 1) {\r\n throw new Error(`Parameter \"${key}\" must have only a single value`);\r\n }\r\n\r\n value = value[0];\r\n\r\n if (key === 'client_max_window_bits') {\r\n if (value !== true) {\r\n const num = +value;\r\n if (!Number.isInteger(num) || num < 8 || num > 15) {\r\n throw new TypeError(\r\n `Invalid value for parameter \"${key}\": ${value}`\r\n );\r\n }\r\n value = num;\r\n } else if (!this._isServer) {\r\n throw new TypeError(\r\n `Invalid value for parameter \"${key}\": ${value}`\r\n );\r\n }\r\n } else if (key === 'server_max_window_bits') {\r\n const num = +value;\r\n if (!Number.isInteger(num) || num < 8 || num > 15) {\r\n throw new TypeError(\r\n `Invalid value for parameter \"${key}\": ${value}`\r\n );\r\n }\r\n value = num;\r\n } else if (\r\n key === 'client_no_context_takeover' ||\r\n key === 'server_no_context_takeover'\r\n ) {\r\n if (value !== true) {\r\n throw new TypeError(\r\n `Invalid value for parameter \"${key}\": ${value}`\r\n );\r\n }\r\n } else {\r\n throw new Error(`Unknown parameter \"${key}\"`);\r\n }\r\n\r\n params[key] = value;\r\n });\r\n });\r\n\r\n return configurations;\r\n }\r\n\r\n /**\r\n * Decompress data. Concurrency limited.\r\n *\r\n * @param {Buffer} data Compressed data\r\n * @param {Boolean} fin Specifies whether or not this is the last fragment\r\n * @param {Function} callback Callback\r\n * @public\r\n */\r\n decompress(data, fin, callback) {\r\n zlibLimiter.add((done) => {\r\n this._decompress(data, fin, (err, result) => {\r\n done();\r\n callback(err, result);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Compress data. Concurrency limited.\r\n *\r\n * @param {(Buffer|String)} data Data to compress\r\n * @param {Boolean} fin Specifies whether or not this is the last fragment\r\n * @param {Function} callback Callback\r\n * @public\r\n */\r\n compress(data, fin, callback) {\r\n zlibLimiter.add((done) => {\r\n this._compress(data, fin, (err, result) => {\r\n done();\r\n callback(err, result);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Decompress data.\r\n *\r\n * @param {Buffer} data Compressed data\r\n * @param {Boolean} fin Specifies whether or not this is the last fragment\r\n * @param {Function} callback Callback\r\n * @private\r\n */\r\n _decompress(data, fin, callback) {\r\n const endpoint = this._isServer ? 'client' : 'server';\r\n\r\n if (!this._inflate) {\r\n const key = `${endpoint}_max_window_bits`;\r\n const windowBits =\r\n typeof this.params[key] !== 'number'\r\n ? zlib.Z_DEFAULT_WINDOWBITS\r\n : this.params[key];\r\n\r\n this._inflate = zlib.createInflateRaw({\r\n ...this._options.zlibInflateOptions,\r\n windowBits\r\n });\r\n this._inflate[kPerMessageDeflate] = this;\r\n this._inflate[kTotalLength] = 0;\r\n this._inflate[kBuffers] = [];\r\n this._inflate.on('error', inflateOnError);\r\n this._inflate.on('data', inflateOnData);\r\n }\r\n\r\n this._inflate[kCallback] = callback;\r\n\r\n this._inflate.write(data);\r\n if (fin) this._inflate.write(TRAILER);\r\n\r\n this._inflate.flush(() => {\r\n const err = this._inflate[kError];\r\n\r\n if (err) {\r\n this._inflate.close();\r\n this._inflate = null;\r\n callback(err);\r\n return;\r\n }\r\n\r\n const data = bufferUtil.concat(\r\n this._inflate[kBuffers],\r\n this._inflate[kTotalLength]\r\n );\r\n\r\n if (this._inflate._readableState.endEmitted) {\r\n this._inflate.close();\r\n this._inflate = null;\r\n } else {\r\n this._inflate[kTotalLength] = 0;\r\n this._inflate[kBuffers] = [];\r\n\r\n if (fin && this.params[`${endpoint}_no_context_takeover`]) {\r\n this._inflate.reset();\r\n }\r\n }\r\n\r\n callback(null, data);\r\n });\r\n }\r\n\r\n /**\r\n * Compress data.\r\n *\r\n * @param {(Buffer|String)} data Data to compress\r\n * @param {Boolean} fin Specifies whether or not this is the last fragment\r\n * @param {Function} callback Callback\r\n * @private\r\n */\r\n _compress(data, fin, callback) {\r\n const endpoint = this._isServer ? 'server' : 'client';\r\n\r\n if (!this._deflate) {\r\n const key = `${endpoint}_max_window_bits`;\r\n const windowBits =\r\n typeof this.params[key] !== 'number'\r\n ? zlib.Z_DEFAULT_WINDOWBITS\r\n : this.params[key];\r\n\r\n this._deflate = zlib.createDeflateRaw({\r\n ...this._options.zlibDeflateOptions,\r\n windowBits\r\n });\r\n\r\n this._deflate[kTotalLength] = 0;\r\n this._deflate[kBuffers] = [];\r\n\r\n this._deflate.on('data', deflateOnData);\r\n }\r\n\r\n this._deflate[kCallback] = callback;\r\n\r\n this._deflate.write(data);\r\n this._deflate.flush(zlib.Z_SYNC_FLUSH, () => {\r\n if (!this._deflate) {\r\n //\r\n // The deflate stream was closed while data was being processed.\r\n //\r\n return;\r\n }\r\n\r\n let data = bufferUtil.concat(\r\n this._deflate[kBuffers],\r\n this._deflate[kTotalLength]\r\n );\r\n\r\n if (fin) {\r\n data = new FastBuffer(data.buffer, data.byteOffset, data.length - 4);\r\n }\r\n\r\n //\r\n // Ensure that the callback will not be called again in\r\n // `PerMessageDeflate#cleanup()`.\r\n //\r\n this._deflate[kCallback] = null;\r\n\r\n this._deflate[kTotalLength] = 0;\r\n this._deflate[kBuffers] = [];\r\n\r\n if (fin && this.params[`${endpoint}_no_context_takeover`]) {\r\n this._deflate.reset();\r\n }\r\n\r\n callback(null, data);\r\n });\r\n }\r\n}\r\n\r\nmodule.exports = PerMessageDeflate;\r\n\r\n/**\r\n * The listener of the `zlib.DeflateRaw` stream `'data'` event.\r\n *\r\n * @param {Buffer} chunk A chunk of data\r\n * @private\r\n */\r\nfunction deflateOnData(chunk) {\r\n this[kBuffers].push(chunk);\r\n this[kTotalLength] += chunk.length;\r\n}\r\n\r\n/**\r\n * The listener of the `zlib.InflateRaw` stream `'data'` event.\r\n *\r\n * @param {Buffer} chunk A chunk of data\r\n * @private\r\n */\r\nfunction inflateOnData(chunk) {\r\n this[kTotalLength] += chunk.length;\r\n\r\n if (\r\n this[kPerMessageDeflate]._maxPayload < 1 ||\r\n this[kTotalLength] <= this[kPerMessageDeflate]._maxPayload\r\n ) {\r\n this[kBuffers].push(chunk);\r\n return;\r\n }\r\n\r\n this[kError] = new RangeError('Max payload size exceeded');\r\n this[kError].code = 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH';\r\n this[kError][kStatusCode] = 1009;\r\n this.removeListener('data', inflateOnData);\r\n\r\n //\r\n // The choice to employ `zlib.reset()` over `zlib.close()` is dictated by the\r\n // fact that in Node.js versions prior to 13.10.0, the callback for\r\n // `zlib.flush()` is not called if `zlib.close()` is used. Utilizing\r\n // `zlib.reset()` ensures that either the callback is invoked or an error is\r\n // emitted.\r\n //\r\n this.reset();\r\n}\r\n\r\n/**\r\n * The listener of the `zlib.InflateRaw` stream `'error'` event.\r\n *\r\n * @param {Error} err The emitted error\r\n * @private\r\n */\r\nfunction inflateOnError(err) {\r\n //\r\n // There is no need to call `Zlib#close()` as the handle is automatically\r\n // closed when an error is emitted.\r\n //\r\n this[kPerMessageDeflate]._inflate = null;\r\n\r\n if (this[kError]) {\r\n this[kCallback](this[kError]);\r\n return;\r\n }\r\n\r\n err[kStatusCode] = 1007;\r\n this[kCallback](err);\r\n}\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvd3MvbGliL3Blcm1lc3NhZ2UtZGVmbGF0ZS5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0EsYUFBYSxtQkFBTyxDQUFDLGtCQUFNO0FBQzNCO0FBQ0EsbUJBQW1CLG1CQUFPLENBQUMsaUVBQWU7QUFDMUMsZ0JBQWdCLG1CQUFPLENBQUMseURBQVc7QUFDbkMsUUFBUSxjQUFjLEVBQUUsbUJBQU8sQ0FBQyw2REFBYTtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsa0JBQWtCO0FBQy9CO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsYUFBYSxrQkFBa0I7QUFDL0I7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsY0FBYyxPQUFPO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0MsSUFBSTtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0QsSUFBSSxLQUFLLE1BQU07QUFDL0Q7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0EsOENBQThDLElBQUksS0FBSyxNQUFNO0FBQzdEO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsOENBQThDLElBQUksS0FBSyxNQUFNO0FBQzdEO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLElBQUksS0FBSyxNQUFNO0FBQzdEO0FBQ0E7QUFDQSxVQUFVO0FBQ1YsZ0RBQWdELElBQUk7QUFDcEQ7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFNBQVM7QUFDdEIsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxpQkFBaUI7QUFDOUIsYUFBYSxTQUFTO0FBQ3RCLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFNBQVM7QUFDdEIsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixTQUFTO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxTQUFTO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsaUJBQWlCO0FBQzlCLGFBQWEsU0FBUztBQUN0QixhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLFNBQVM7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsU0FBUztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9uZXh0anMvLi9ub2RlX21vZHVsZXMvd3MvbGliL3Blcm1lc3NhZ2UtZGVmbGF0ZS5qcz9kN2M2Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcclxuXHJcbmNvbnN0IHpsaWIgPSByZXF1aXJlKCd6bGliJyk7XHJcblxyXG5jb25zdCBidWZmZXJVdGlsID0gcmVxdWlyZSgnLi9idWZmZXItdXRpbCcpO1xyXG5jb25zdCBMaW1pdGVyID0gcmVxdWlyZSgnLi9saW1pdGVyJyk7XHJcbmNvbnN0IHsga1N0YXR1c0NvZGUgfSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJyk7XHJcblxyXG5jb25zdCBGYXN0QnVmZmVyID0gQnVmZmVyW1N5bWJvbC5zcGVjaWVzXTtcclxuY29uc3QgVFJBSUxFUiA9IEJ1ZmZlci5mcm9tKFsweDAwLCAweDAwLCAweGZmLCAweGZmXSk7XHJcbmNvbnN0IGtQZXJNZXNzYWdlRGVmbGF0ZSA9IFN5bWJvbCgncGVybWVzc2FnZS1kZWZsYXRlJyk7XHJcbmNvbnN0IGtUb3RhbExlbmd0aCA9IFN5bWJvbCgndG90YWwtbGVuZ3RoJyk7XHJcbmNvbnN0IGtDYWxsYmFjayA9IFN5bWJvbCgnY2FsbGJhY2snKTtcclxuY29uc3Qga0J1ZmZlcnMgPSBTeW1ib2woJ2J1ZmZlcnMnKTtcclxuY29uc3Qga0Vycm9yID0gU3ltYm9sKCdlcnJvcicpO1xyXG5cclxuLy9cclxuLy8gV2UgbGltaXQgemxpYiBjb25jdXJyZW5jeSwgd2hpY2ggcHJldmVudHMgc2V2ZXJlIG1lbW9yeSBmcmFnbWVudGF0aW9uXHJcbi8vIGFzIGRvY3VtZW50ZWQgaW4gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy84ODcxI2lzc3VlY29tbWVudC0yNTA5MTU5MTNcclxuLy8gYW5kIGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJzb2NrZXRzL3dzL2lzc3Vlcy8xMjAyXHJcbi8vXHJcbi8vIEludGVudGlvbmFsbHkgZ2xvYmFsOyBpdCdzIHRoZSBnbG9iYWwgdGhyZWFkIHBvb2wgdGhhdCdzIGFuIGlzc3VlLlxyXG4vL1xyXG5sZXQgemxpYkxpbWl0ZXI7XHJcblxyXG4vKipcclxuICogcGVybWVzc2FnZS1kZWZsYXRlIGltcGxlbWVudGF0aW9uLlxyXG4gKi9cclxuY2xhc3MgUGVyTWVzc2FnZURlZmxhdGUge1xyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYSBQZXJNZXNzYWdlRGVmbGF0ZSBpbnN0YW5jZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gQ29uZmlndXJhdGlvbiBvcHRpb25zXHJcbiAgICogQHBhcmFtIHsoQm9vbGVhbnxOdW1iZXIpfSBbb3B0aW9ucy5jbGllbnRNYXhXaW5kb3dCaXRzXSBBZHZlcnRpc2Ugc3VwcG9ydFxyXG4gICAqICAgICBmb3IsIG9yIHJlcXVlc3QsIGEgY3VzdG9tIGNsaWVudCB3aW5kb3cgc2l6ZVxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuY2xpZW50Tm9Db250ZXh0VGFrZW92ZXI9ZmFsc2VdIEFkdmVydGlzZS9cclxuICAgKiAgICAgYWNrbm93bGVkZ2UgZGlzYWJsaW5nIG9mIGNsaWVudCBjb250ZXh0IHRha2VvdmVyXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmNvbmN1cnJlbmN5TGltaXQ9MTBdIFRoZSBudW1iZXIgb2YgY29uY3VycmVudFxyXG4gICAqICAgICBjYWxscyB0byB6bGliXHJcbiAgICogQHBhcmFtIHsoQm9vbGVhbnxOdW1iZXIpfSBbb3B0aW9ucy5zZXJ2ZXJNYXhXaW5kb3dCaXRzXSBSZXF1ZXN0L2NvbmZpcm0gdGhlXHJcbiAgICogICAgIHVzZSBvZiBhIGN1c3RvbSBzZXJ2ZXIgd2luZG93IHNpemVcclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNlcnZlck5vQ29udGV4dFRha2VvdmVyPWZhbHNlXSBSZXF1ZXN0L2FjY2VwdFxyXG4gICAqICAgICBkaXNhYmxpbmcgb2Ygc2VydmVyIGNvbnRleHQgdGFrZW92ZXJcclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMudGhyZXNob2xkPTEwMjRdIFNpemUgKGluIGJ5dGVzKSBiZWxvdyB3aGljaFxyXG4gICAqICAgICBtZXNzYWdlcyBzaG91bGQgbm90IGJlIGNvbXByZXNzZWQgaWYgY29udGV4dCB0YWtlb3ZlciBpcyBkaXNhYmxlZFxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy56bGliRGVmbGF0ZU9wdGlvbnNdIE9wdGlvbnMgdG8gcGFzcyB0byB6bGliIG9uXHJcbiAgICogICAgIGRlZmxhdGVcclxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuemxpYkluZmxhdGVPcHRpb25zXSBPcHRpb25zIHRvIHBhc3MgdG8gemxpYiBvblxyXG4gICAqICAgICBpbmZsYXRlXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbaXNTZXJ2ZXI9ZmFsc2VdIENyZWF0ZSB0aGUgaW5zdGFuY2UgaW4gZWl0aGVyIHNlcnZlciBvclxyXG4gICAqICAgICBjbGllbnQgbW9kZVxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbWF4UGF5bG9hZD0wXSBUaGUgbWF4aW11bSBhbGxvd2VkIG1lc3NhZ2UgbGVuZ3RoXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3Iob3B0aW9ucywgaXNTZXJ2ZXIsIG1heFBheWxvYWQpIHtcclxuICAgIHRoaXMuX21heFBheWxvYWQgPSBtYXhQYXlsb2FkIHwgMDtcclxuICAgIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xyXG4gICAgdGhpcy5fdGhyZXNob2xkID1cclxuICAgICAgdGhpcy5fb3B0aW9ucy50aHJlc2hvbGQgIT09IHVuZGVmaW5lZCA/IHRoaXMuX29wdGlvbnMudGhyZXNob2xkIDogMTAyNDtcclxuICAgIHRoaXMuX2lzU2VydmVyID0gISFpc1NlcnZlcjtcclxuICAgIHRoaXMuX2RlZmxhdGUgPSBudWxsO1xyXG4gICAgdGhpcy5faW5mbGF0ZSA9IG51bGw7XHJcblxyXG4gICAgdGhpcy5wYXJhbXMgPSBudWxsO1xyXG5cclxuICAgIGlmICghemxpYkxpbWl0ZXIpIHtcclxuICAgICAgY29uc3QgY29uY3VycmVuY3kgPVxyXG4gICAgICAgIHRoaXMuX29wdGlvbnMuY29uY3VycmVuY3lMaW1pdCAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICA/IHRoaXMuX29wdGlvbnMuY29uY3VycmVuY3lMaW1pdFxyXG4gICAgICAgICAgOiAxMDtcclxuICAgICAgemxpYkxpbWl0ZXIgPSBuZXcgTGltaXRlcihjb25jdXJyZW5jeSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAdHlwZSB7U3RyaW5nfVxyXG4gICAqL1xyXG4gIHN0YXRpYyBnZXQgZXh0ZW5zaW9uTmFtZSgpIHtcclxuICAgIHJldHVybiAncGVybWVzc2FnZS1kZWZsYXRlJztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhbiBleHRlbnNpb24gbmVnb3RpYXRpb24gb2ZmZXIuXHJcbiAgICpcclxuICAgKiBAcmV0dXJuIHtPYmplY3R9IEV4dGVuc2lvbiBwYXJhbWV0ZXJzXHJcbiAgICogQHB1YmxpY1xyXG4gICAqL1xyXG4gIG9mZmVyKCkge1xyXG4gICAgY29uc3QgcGFyYW1zID0ge307XHJcblxyXG4gICAgaWYgKHRoaXMuX29wdGlvbnMuc2VydmVyTm9Db250ZXh0VGFrZW92ZXIpIHtcclxuICAgICAgcGFyYW1zLnNlcnZlcl9ub19jb250ZXh0X3Rha2VvdmVyID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLl9vcHRpb25zLmNsaWVudE5vQ29udGV4dFRha2VvdmVyKSB7XHJcbiAgICAgIHBhcmFtcy5jbGllbnRfbm9fY29udGV4dF90YWtlb3ZlciA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5fb3B0aW9ucy5zZXJ2ZXJNYXhXaW5kb3dCaXRzKSB7XHJcbiAgICAgIHBhcmFtcy5zZXJ2ZXJfbWF4X3dpbmRvd19iaXRzID0gdGhpcy5fb3B0aW9ucy5zZXJ2ZXJNYXhXaW5kb3dCaXRzO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuX29wdGlvbnMuY2xpZW50TWF4V2luZG93Qml0cykge1xyXG4gICAgICBwYXJhbXMuY2xpZW50X21heF93aW5kb3dfYml0cyA9IHRoaXMuX29wdGlvbnMuY2xpZW50TWF4V2luZG93Qml0cztcclxuICAgIH0gZWxzZSBpZiAodGhpcy5fb3B0aW9ucy5jbGllbnRNYXhXaW5kb3dCaXRzID09IG51bGwpIHtcclxuICAgICAgcGFyYW1zLmNsaWVudF9tYXhfd2luZG93X2JpdHMgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBwYXJhbXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBY2NlcHQgYW4gZXh0ZW5zaW9uIG5lZ290aWF0aW9uIG9mZmVyL3Jlc3BvbnNlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtBcnJheX0gY29uZmlndXJhdGlvbnMgVGhlIGV4dGVuc2lvbiBuZWdvdGlhdGlvbiBvZmZlcnMvcmVwb25zZVxyXG4gICAqIEByZXR1cm4ge09iamVjdH0gQWNjZXB0ZWQgY29uZmlndXJhdGlvblxyXG4gICAqIEBwdWJsaWNcclxuICAgKi9cclxuICBhY2NlcHQoY29uZmlndXJhdGlvbnMpIHtcclxuICAgIGNvbmZpZ3VyYXRpb25zID0gdGhpcy5ub3JtYWxpemVQYXJhbXMoY29uZmlndXJhdGlvbnMpO1xyXG5cclxuICAgIHRoaXMucGFyYW1zID0gdGhpcy5faXNTZXJ2ZXJcclxuICAgICAgPyB0aGlzLmFjY2VwdEFzU2VydmVyKGNvbmZpZ3VyYXRpb25zKVxyXG4gICAgICA6IHRoaXMuYWNjZXB0QXNDbGllbnQoY29uZmlndXJhdGlvbnMpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLnBhcmFtcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbGVhc2VzIGFsbCByZXNvdXJjZXMgdXNlZCBieSB0aGUgZXh0ZW5zaW9uLlxyXG4gICAqXHJcbiAgICogQHB1YmxpY1xyXG4gICAqL1xyXG4gIGNsZWFudXAoKSB7XHJcbiAgICBpZiAodGhpcy5faW5mbGF0ZSkge1xyXG4gICAgICB0aGlzLl9pbmZsYXRlLmNsb3NlKCk7XHJcbiAgICAgIHRoaXMuX2luZmxhdGUgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9kZWZsYXRlKSB7XHJcbiAgICAgIGNvbnN0IGNhbGxiYWNrID0gdGhpcy5fZGVmbGF0ZVtrQ2FsbGJhY2tdO1xyXG5cclxuICAgICAgdGhpcy5fZGVmbGF0ZS5jbG9zZSgpO1xyXG4gICAgICB0aGlzLl9kZWZsYXRlID0gbnVsbDtcclxuXHJcbiAgICAgIGlmIChjYWxsYmFjaykge1xyXG4gICAgICAgIGNhbGxiYWNrKFxyXG4gICAgICAgICAgbmV3IEVycm9yKFxyXG4gICAgICAgICAgICAnVGhlIGRlZmxhdGUgc3RyZWFtIHdhcyBjbG9zZWQgd2hpbGUgZGF0YSB3YXMgYmVpbmcgcHJvY2Vzc2VkJ1xyXG4gICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqICBBY2NlcHQgYW4gZXh0ZW5zaW9uIG5lZ290aWF0aW9uIG9mZmVyLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtBcnJheX0gb2ZmZXJzIFRoZSBleHRlbnNpb24gbmVnb3RpYXRpb24gb2ZmZXJzXHJcbiAgICogQHJldHVybiB7T2JqZWN0fSBBY2NlcHRlZCBjb25maWd1cmF0aW9uXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBhY2NlcHRBc1NlcnZlcihvZmZlcnMpIHtcclxuICAgIGNvbnN0IG9wdHMgPSB0aGlzLl9vcHRpb25zO1xyXG4gICAgY29uc3QgYWNjZXB0ZWQgPSBvZmZlcnMuZmluZCgocGFyYW1zKSA9PiB7XHJcbiAgICAgIGlmIChcclxuICAgICAgICAob3B0cy5zZXJ2ZXJOb0NvbnRleHRUYWtlb3ZlciA9PT0gZmFsc2UgJiZcclxuICAgICAgICAgIHBhcmFtcy5zZXJ2ZXJfbm9fY29udGV4dF90YWtlb3ZlcikgfHxcclxuICAgICAgICAocGFyYW1zLnNlcnZlcl9tYXhfd2luZG93X2JpdHMgJiZcclxuICAgICAgICAgIChvcHRzLnNlcnZlck1heFdpbmRvd0JpdHMgPT09IGZhbHNlIHx8XHJcbiAgICAgICAgICAgICh0eXBlb2Ygb3B0cy5zZXJ2ZXJNYXhXaW5kb3dCaXRzID09PSAnbnVtYmVyJyAmJlxyXG4gICAgICAgICAgICAgIG9wdHMuc2VydmVyTWF4V2luZG93Qml0cyA+IHBhcmFtcy5zZXJ2ZXJfbWF4X3dpbmRvd19iaXRzKSkpIHx8XHJcbiAgICAgICAgKHR5cGVvZiBvcHRzLmNsaWVudE1heFdpbmRvd0JpdHMgPT09ICdudW1iZXInICYmXHJcbiAgICAgICAgICAhcGFyYW1zLmNsaWVudF9tYXhfd2luZG93X2JpdHMpXHJcbiAgICAgICkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoIWFjY2VwdGVkKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm9uZSBvZiB0aGUgZXh0ZW5zaW9uIG9mZmVycyBjYW4gYmUgYWNjZXB0ZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAob3B0cy5zZXJ2ZXJOb0NvbnRleHRUYWtlb3Zlcikge1xyXG4gICAgICBhY2NlcHRlZC5zZXJ2ZXJfbm9fY29udGV4dF90YWtlb3ZlciA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAob3B0cy5jbGllbnROb0NvbnRleHRUYWtlb3Zlcikge1xyXG4gICAgICBhY2NlcHRlZC5jbGllbnRfbm9fY29udGV4dF90YWtlb3ZlciA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIG9wdHMuc2VydmVyTWF4V2luZG93Qml0cyA9PT0gJ251bWJlcicpIHtcclxuICAgICAgYWNjZXB0ZWQuc2VydmVyX21heF93aW5kb3dfYml0cyA9IG9wdHMuc2VydmVyTWF4V2luZG93Qml0cztcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2Ygb3B0cy5jbGllbnRNYXhXaW5kb3dCaXRzID09PSAnbnVtYmVyJykge1xyXG4gICAgICBhY2NlcHRlZC5jbGllbnRfbWF4X3dpbmRvd19iaXRzID0gb3B0cy5jbGllbnRNYXhXaW5kb3dCaXRzO1xyXG4gICAgfSBlbHNlIGlmIChcclxuICAgICAgYWNjZXB0ZWQuY2xpZW50X21heF93aW5kb3dfYml0cyA9PT0gdHJ1ZSB8fFxyXG4gICAgICBvcHRzLmNsaWVudE1heFdpbmRvd0JpdHMgPT09IGZhbHNlXHJcbiAgICApIHtcclxuICAgICAgZGVsZXRlIGFjY2VwdGVkLmNsaWVudF9tYXhfd2luZG93X2JpdHM7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGFjY2VwdGVkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWNjZXB0IHRoZSBleHRlbnNpb24gbmVnb3RpYXRpb24gcmVzcG9uc2UuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0FycmF5fSByZXNwb25zZSBUaGUgZXh0ZW5zaW9uIG5lZ290aWF0aW9uIHJlc3BvbnNlXHJcbiAgICogQHJldHVybiB7T2JqZWN0fSBBY2NlcHRlZCBjb25maWd1cmF0aW9uXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBhY2NlcHRBc0NsaWVudChyZXNwb25zZSkge1xyXG4gICAgY29uc3QgcGFyYW1zID0gcmVzcG9uc2VbMF07XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLl9vcHRpb25zLmNsaWVudE5vQ29udGV4dFRha2VvdmVyID09PSBmYWxzZSAmJlxyXG4gICAgICBwYXJhbXMuY2xpZW50X25vX2NvbnRleHRfdGFrZW92ZXJcclxuICAgICkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgcGFyYW1ldGVyIFwiY2xpZW50X25vX2NvbnRleHRfdGFrZW92ZXJcIicpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghcGFyYW1zLmNsaWVudF9tYXhfd2luZG93X2JpdHMpIHtcclxuICAgICAgaWYgKHR5cGVvZiB0aGlzLl9vcHRpb25zLmNsaWVudE1heFdpbmRvd0JpdHMgPT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgcGFyYW1zLmNsaWVudF9tYXhfd2luZG93X2JpdHMgPSB0aGlzLl9vcHRpb25zLmNsaWVudE1heFdpbmRvd0JpdHM7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgIHRoaXMuX29wdGlvbnMuY2xpZW50TWF4V2luZG93Qml0cyA9PT0gZmFsc2UgfHxcclxuICAgICAgKHR5cGVvZiB0aGlzLl9vcHRpb25zLmNsaWVudE1heFdpbmRvd0JpdHMgPT09ICdudW1iZXInICYmXHJcbiAgICAgICAgcGFyYW1zLmNsaWVudF9tYXhfd2luZG93X2JpdHMgPiB0aGlzLl9vcHRpb25zLmNsaWVudE1heFdpbmRvd0JpdHMpXHJcbiAgICApIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICdVbmV4cGVjdGVkIG9yIGludmFsaWQgcGFyYW1ldGVyIFwiY2xpZW50X21heF93aW5kb3dfYml0c1wiJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBwYXJhbXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBOb3JtYWxpemUgcGFyYW1ldGVycy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7QXJyYXl9IGNvbmZpZ3VyYXRpb25zIFRoZSBleHRlbnNpb24gbmVnb3RpYXRpb24gb2ZmZXJzL3JlcG9uc2VcclxuICAgKiBAcmV0dXJuIHtBcnJheX0gVGhlIG9mZmVycy9yZXNwb25zZSB3aXRoIG5vcm1hbGl6ZWQgcGFyYW1ldGVyc1xyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgbm9ybWFsaXplUGFyYW1zKGNvbmZpZ3VyYXRpb25zKSB7XHJcbiAgICBjb25maWd1cmF0aW9ucy5mb3JFYWNoKChwYXJhbXMpID0+IHtcclxuICAgICAgT2JqZWN0LmtleXMocGFyYW1zKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICBsZXQgdmFsdWUgPSBwYXJhbXNba2V5XTtcclxuXHJcbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGFyYW1ldGVyIFwiJHtrZXl9XCIgbXVzdCBoYXZlIG9ubHkgYSBzaW5nbGUgdmFsdWVgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhbHVlID0gdmFsdWVbMF07XHJcblxyXG4gICAgICAgIGlmIChrZXkgPT09ICdjbGllbnRfbWF4X3dpbmRvd19iaXRzJykge1xyXG4gICAgICAgICAgaWYgKHZhbHVlICE9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG51bSA9ICt2YWx1ZTtcclxuICAgICAgICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG51bSkgfHwgbnVtIDwgOCB8fCBudW0gPiAxNSkge1xyXG4gICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXHJcbiAgICAgICAgICAgICAgICBgSW52YWxpZCB2YWx1ZSBmb3IgcGFyYW1ldGVyIFwiJHtrZXl9XCI6ICR7dmFsdWV9YFxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFsdWUgPSBudW07XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLl9pc1NlcnZlcikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxyXG4gICAgICAgICAgICAgIGBJbnZhbGlkIHZhbHVlIGZvciBwYXJhbWV0ZXIgXCIke2tleX1cIjogJHt2YWx1ZX1gXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdzZXJ2ZXJfbWF4X3dpbmRvd19iaXRzJykge1xyXG4gICAgICAgICAgY29uc3QgbnVtID0gK3ZhbHVlO1xyXG4gICAgICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG51bSkgfHwgbnVtIDwgOCB8fCBudW0gPiAxNSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxyXG4gICAgICAgICAgICAgIGBJbnZhbGlkIHZhbHVlIGZvciBwYXJhbWV0ZXIgXCIke2tleX1cIjogJHt2YWx1ZX1gXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB2YWx1ZSA9IG51bTtcclxuICAgICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgICAga2V5ID09PSAnY2xpZW50X25vX2NvbnRleHRfdGFrZW92ZXInIHx8XHJcbiAgICAgICAgICBrZXkgPT09ICdzZXJ2ZXJfbm9fY29udGV4dF90YWtlb3ZlcidcclxuICAgICAgICApIHtcclxuICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxyXG4gICAgICAgICAgICAgIGBJbnZhbGlkIHZhbHVlIGZvciBwYXJhbWV0ZXIgXCIke2tleX1cIjogJHt2YWx1ZX1gXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwYXJhbWV0ZXIgXCIke2tleX1cImApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcGFyYW1zW2tleV0gPSB2YWx1ZTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gY29uZmlndXJhdGlvbnM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWNvbXByZXNzIGRhdGEuIENvbmN1cnJlbmN5IGxpbWl0ZWQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSBDb21wcmVzc2VkIGRhdGFcclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGZpbiBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhpcyBpcyB0aGUgbGFzdCBmcmFnbWVudFxyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrXHJcbiAgICogQHB1YmxpY1xyXG4gICAqL1xyXG4gIGRlY29tcHJlc3MoZGF0YSwgZmluLCBjYWxsYmFjaykge1xyXG4gICAgemxpYkxpbWl0ZXIuYWRkKChkb25lKSA9PiB7XHJcbiAgICAgIHRoaXMuX2RlY29tcHJlc3MoZGF0YSwgZmluLCAoZXJyLCByZXN1bHQpID0+IHtcclxuICAgICAgICBkb25lKCk7XHJcbiAgICAgICAgY2FsbGJhY2soZXJyLCByZXN1bHQpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29tcHJlc3MgZGF0YS4gQ29uY3VycmVuY3kgbGltaXRlZC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7KEJ1ZmZlcnxTdHJpbmcpfSBkYXRhIERhdGEgdG8gY29tcHJlc3NcclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGZpbiBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhpcyBpcyB0aGUgbGFzdCBmcmFnbWVudFxyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrXHJcbiAgICogQHB1YmxpY1xyXG4gICAqL1xyXG4gIGNvbXByZXNzKGRhdGEsIGZpbiwgY2FsbGJhY2spIHtcclxuICAgIHpsaWJMaW1pdGVyLmFkZCgoZG9uZSkgPT4ge1xyXG4gICAgICB0aGlzLl9jb21wcmVzcyhkYXRhLCBmaW4sIChlcnIsIHJlc3VsdCkgPT4ge1xyXG4gICAgICAgIGRvbmUoKTtcclxuICAgICAgICBjYWxsYmFjayhlcnIsIHJlc3VsdCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWNvbXByZXNzIGRhdGEuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSBDb21wcmVzc2VkIGRhdGFcclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGZpbiBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhpcyBpcyB0aGUgbGFzdCBmcmFnbWVudFxyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBfZGVjb21wcmVzcyhkYXRhLCBmaW4sIGNhbGxiYWNrKSB7XHJcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuX2lzU2VydmVyID8gJ2NsaWVudCcgOiAnc2VydmVyJztcclxuXHJcbiAgICBpZiAoIXRoaXMuX2luZmxhdGUpIHtcclxuICAgICAgY29uc3Qga2V5ID0gYCR7ZW5kcG9pbnR9X21heF93aW5kb3dfYml0c2A7XHJcbiAgICAgIGNvbnN0IHdpbmRvd0JpdHMgPVxyXG4gICAgICAgIHR5cGVvZiB0aGlzLnBhcmFtc1trZXldICE9PSAnbnVtYmVyJ1xyXG4gICAgICAgICAgPyB6bGliLlpfREVGQVVMVF9XSU5ET1dCSVRTXHJcbiAgICAgICAgICA6IHRoaXMucGFyYW1zW2tleV07XHJcblxyXG4gICAgICB0aGlzLl9pbmZsYXRlID0gemxpYi5jcmVhdGVJbmZsYXRlUmF3KHtcclxuICAgICAgICAuLi50aGlzLl9vcHRpb25zLnpsaWJJbmZsYXRlT3B0aW9ucyxcclxuICAgICAgICB3aW5kb3dCaXRzXHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLl9pbmZsYXRlW2tQZXJNZXNzYWdlRGVmbGF0ZV0gPSB0aGlzO1xyXG4gICAgICB0aGlzLl9pbmZsYXRlW2tUb3RhbExlbmd0aF0gPSAwO1xyXG4gICAgICB0aGlzLl9pbmZsYXRlW2tCdWZmZXJzXSA9IFtdO1xyXG4gICAgICB0aGlzLl9pbmZsYXRlLm9uKCdlcnJvcicsIGluZmxhdGVPbkVycm9yKTtcclxuICAgICAgdGhpcy5faW5mbGF0ZS5vbignZGF0YScsIGluZmxhdGVPbkRhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX2luZmxhdGVba0NhbGxiYWNrXSA9IGNhbGxiYWNrO1xyXG5cclxuICAgIHRoaXMuX2luZmxhdGUud3JpdGUoZGF0YSk7XHJcbiAgICBpZiAoZmluKSB0aGlzLl9pbmZsYXRlLndyaXRlKFRSQUlMRVIpO1xyXG5cclxuICAgIHRoaXMuX2luZmxhdGUuZmx1c2goKCkgPT4ge1xyXG4gICAgICBjb25zdCBlcnIgPSB0aGlzLl9pbmZsYXRlW2tFcnJvcl07XHJcblxyXG4gICAgICBpZiAoZXJyKSB7XHJcbiAgICAgICAgdGhpcy5faW5mbGF0ZS5jbG9zZSgpO1xyXG4gICAgICAgIHRoaXMuX2luZmxhdGUgPSBudWxsO1xyXG4gICAgICAgIGNhbGxiYWNrKGVycik7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBkYXRhID0gYnVmZmVyVXRpbC5jb25jYXQoXHJcbiAgICAgICAgdGhpcy5faW5mbGF0ZVtrQnVmZmVyc10sXHJcbiAgICAgICAgdGhpcy5faW5mbGF0ZVtrVG90YWxMZW5ndGhdXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBpZiAodGhpcy5faW5mbGF0ZS5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkKSB7XHJcbiAgICAgICAgdGhpcy5faW5mbGF0ZS5jbG9zZSgpO1xyXG4gICAgICAgIHRoaXMuX2luZmxhdGUgPSBudWxsO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX2luZmxhdGVba1RvdGFsTGVuZ3RoXSA9IDA7XHJcbiAgICAgICAgdGhpcy5faW5mbGF0ZVtrQnVmZmVyc10gPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKGZpbiAmJiB0aGlzLnBhcmFtc1tgJHtlbmRwb2ludH1fbm9fY29udGV4dF90YWtlb3ZlcmBdKSB7XHJcbiAgICAgICAgICB0aGlzLl9pbmZsYXRlLnJlc2V0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBjYWxsYmFjayhudWxsLCBkYXRhKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29tcHJlc3MgZGF0YS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7KEJ1ZmZlcnxTdHJpbmcpfSBkYXRhIERhdGEgdG8gY29tcHJlc3NcclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGZpbiBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhpcyBpcyB0aGUgbGFzdCBmcmFnbWVudFxyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBfY29tcHJlc3MoZGF0YSwgZmluLCBjYWxsYmFjaykge1xyXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLl9pc1NlcnZlciA/ICdzZXJ2ZXInIDogJ2NsaWVudCc7XHJcblxyXG4gICAgaWYgKCF0aGlzLl9kZWZsYXRlKSB7XHJcbiAgICAgIGNvbnN0IGtleSA9IGAke2VuZHBvaW50fV9tYXhfd2luZG93X2JpdHNgO1xyXG4gICAgICBjb25zdCB3aW5kb3dCaXRzID1cclxuICAgICAgICB0eXBlb2YgdGhpcy5wYXJhbXNba2V5XSAhPT0gJ251bWJlcidcclxuICAgICAgICAgID8gemxpYi5aX0RFRkFVTFRfV0lORE9XQklUU1xyXG4gICAgICAgICAgOiB0aGlzLnBhcmFtc1trZXldO1xyXG5cclxuICAgICAgdGhpcy5fZGVmbGF0ZSA9IHpsaWIuY3JlYXRlRGVmbGF0ZVJhdyh7XHJcbiAgICAgICAgLi4udGhpcy5fb3B0aW9ucy56bGliRGVmbGF0ZU9wdGlvbnMsXHJcbiAgICAgICAgd2luZG93Qml0c1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMuX2RlZmxhdGVba1RvdGFsTGVuZ3RoXSA9IDA7XHJcbiAgICAgIHRoaXMuX2RlZmxhdGVba0J1ZmZlcnNdID0gW107XHJcblxyXG4gICAgICB0aGlzLl9kZWZsYXRlLm9uKCdkYXRhJywgZGVmbGF0ZU9uRGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fZGVmbGF0ZVtrQ2FsbGJhY2tdID0gY2FsbGJhY2s7XHJcblxyXG4gICAgdGhpcy5fZGVmbGF0ZS53cml0ZShkYXRhKTtcclxuICAgIHRoaXMuX2RlZmxhdGUuZmx1c2goemxpYi5aX1NZTkNfRkxVU0gsICgpID0+IHtcclxuICAgICAgaWYgKCF0aGlzLl9kZWZsYXRlKSB7XHJcbiAgICAgICAgLy9cclxuICAgICAgICAvLyBUaGUgZGVmbGF0ZSBzdHJlYW0gd2FzIGNsb3NlZCB3aGlsZSBkYXRhIHdhcyBiZWluZyBwcm9jZXNzZWQuXHJcbiAgICAgICAgLy9cclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBkYXRhID0gYnVmZmVyVXRpbC5jb25jYXQoXHJcbiAgICAgICAgdGhpcy5fZGVmbGF0ZVtrQnVmZmVyc10sXHJcbiAgICAgICAgdGhpcy5fZGVmbGF0ZVtrVG90YWxMZW5ndGhdXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBpZiAoZmluKSB7XHJcbiAgICAgICAgZGF0YSA9IG5ldyBGYXN0QnVmZmVyKGRhdGEuYnVmZmVyLCBkYXRhLmJ5dGVPZmZzZXQsIGRhdGEubGVuZ3RoIC0gNCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vXHJcbiAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBjYWxsYmFjayB3aWxsIG5vdCBiZSBjYWxsZWQgYWdhaW4gaW5cclxuICAgICAgLy8gYFBlck1lc3NhZ2VEZWZsYXRlI2NsZWFudXAoKWAuXHJcbiAgICAgIC8vXHJcbiAgICAgIHRoaXMuX2RlZmxhdGVba0NhbGxiYWNrXSA9IG51bGw7XHJcblxyXG4gICAgICB0aGlzLl9kZWZsYXRlW2tUb3RhbExlbmd0aF0gPSAwO1xyXG4gICAgICB0aGlzLl9kZWZsYXRlW2tCdWZmZXJzXSA9IFtdO1xyXG5cclxuICAgICAgaWYgKGZpbiAmJiB0aGlzLnBhcmFtc1tgJHtlbmRwb2ludH1fbm9fY29udGV4dF90YWtlb3ZlcmBdKSB7XHJcbiAgICAgICAgdGhpcy5fZGVmbGF0ZS5yZXNldCgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjYWxsYmFjayhudWxsLCBkYXRhKTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBQZXJNZXNzYWdlRGVmbGF0ZTtcclxuXHJcbi8qKlxyXG4gKiBUaGUgbGlzdGVuZXIgb2YgdGhlIGB6bGliLkRlZmxhdGVSYXdgIHN0cmVhbSBgJ2RhdGEnYCBldmVudC5cclxuICpcclxuICogQHBhcmFtIHtCdWZmZXJ9IGNodW5rIEEgY2h1bmsgb2YgZGF0YVxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuZnVuY3Rpb24gZGVmbGF0ZU9uRGF0YShjaHVuaykge1xyXG4gIHRoaXNba0J1ZmZlcnNdLnB1c2goY2h1bmspO1xyXG4gIHRoaXNba1RvdGFsTGVuZ3RoXSArPSBjaHVuay5sZW5ndGg7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUaGUgbGlzdGVuZXIgb2YgdGhlIGB6bGliLkluZmxhdGVSYXdgIHN0cmVhbSBgJ2RhdGEnYCBldmVudC5cclxuICpcclxuICogQHBhcmFtIHtCdWZmZXJ9IGNodW5rIEEgY2h1bmsgb2YgZGF0YVxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuZnVuY3Rpb24gaW5mbGF0ZU9uRGF0YShjaHVuaykge1xyXG4gIHRoaXNba1RvdGFsTGVuZ3RoXSArPSBjaHVuay5sZW5ndGg7XHJcblxyXG4gIGlmIChcclxuICAgIHRoaXNba1Blck1lc3NhZ2VEZWZsYXRlXS5fbWF4UGF5bG9hZCA8IDEgfHxcclxuICAgIHRoaXNba1RvdGFsTGVuZ3RoXSA8PSB0aGlzW2tQZXJNZXNzYWdlRGVmbGF0ZV0uX21heFBheWxvYWRcclxuICApIHtcclxuICAgIHRoaXNba0J1ZmZlcnNdLnB1c2goY2h1bmspO1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgdGhpc1trRXJyb3JdID0gbmV3IFJhbmdlRXJyb3IoJ01heCBwYXlsb2FkIHNpemUgZXhjZWVkZWQnKTtcclxuICB0aGlzW2tFcnJvcl0uY29kZSA9ICdXU19FUlJfVU5TVVBQT1JURURfTUVTU0FHRV9MRU5HVEgnO1xyXG4gIHRoaXNba0Vycm9yXVtrU3RhdHVzQ29kZV0gPSAxMDA5O1xyXG4gIHRoaXMucmVtb3ZlTGlzdGVuZXIoJ2RhdGEnLCBpbmZsYXRlT25EYXRhKTtcclxuXHJcbiAgLy9cclxuICAvLyBUaGUgY2hvaWNlIHRvIGVtcGxveSBgemxpYi5yZXNldCgpYCBvdmVyIGB6bGliLmNsb3NlKClgIGlzIGRpY3RhdGVkIGJ5IHRoZVxyXG4gIC8vIGZhY3QgdGhhdCBpbiBOb2RlLmpzIHZlcnNpb25zIHByaW9yIHRvIDEzLjEwLjAsIHRoZSBjYWxsYmFjayBmb3JcclxuICAvLyBgemxpYi5mbHVzaCgpYCBpcyBub3QgY2FsbGVkIGlmIGB6bGliLmNsb3NlKClgIGlzIHVzZWQuIFV0aWxpemluZ1xyXG4gIC8vIGB6bGliLnJlc2V0KClgIGVuc3VyZXMgdGhhdCBlaXRoZXIgdGhlIGNhbGxiYWNrIGlzIGludm9rZWQgb3IgYW4gZXJyb3IgaXNcclxuICAvLyBlbWl0dGVkLlxyXG4gIC8vXHJcbiAgdGhpcy5yZXNldCgpO1xyXG59XHJcblxyXG4vKipcclxuICogVGhlIGxpc3RlbmVyIG9mIHRoZSBgemxpYi5JbmZsYXRlUmF3YCBzdHJlYW0gYCdlcnJvcidgIGV2ZW50LlxyXG4gKlxyXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnIgVGhlIGVtaXR0ZWQgZXJyb3JcclxuICogQHByaXZhdGVcclxuICovXHJcbmZ1bmN0aW9uIGluZmxhdGVPbkVycm9yKGVycikge1xyXG4gIC8vXHJcbiAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byBjYWxsIGBabGliI2Nsb3NlKClgIGFzIHRoZSBoYW5kbGUgaXMgYXV0b21hdGljYWxseVxyXG4gIC8vIGNsb3NlZCB3aGVuIGFuIGVycm9yIGlzIGVtaXR0ZWQuXHJcbiAgLy9cclxuICB0aGlzW2tQZXJNZXNzYWdlRGVmbGF0ZV0uX2luZmxhdGUgPSBudWxsO1xyXG5cclxuICBpZiAodGhpc1trRXJyb3JdKSB7XHJcbiAgICB0aGlzW2tDYWxsYmFja10odGhpc1trRXJyb3JdKTtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIGVycltrU3RhdHVzQ29kZV0gPSAxMDA3O1xyXG4gIHRoaXNba0NhbGxiYWNrXShlcnIpO1xyXG59XHJcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/ws/lib/permessage-deflate.js\n");
/***/ }),
/***/ "(ssr)/./node_modules/ws/lib/receiver.js":
/*!*****************************************!*\
!*** ./node_modules/ws/lib/receiver.js ***!
\*****************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
eval("\r\n\r\nconst { Writable } = __webpack_require__(/*! stream */ \"stream\");\r\n\r\nconst PerMessageDeflate = __webpack_require__(/*! ./permessage-deflate */ \"(ssr)/./node_modules/ws/lib/permessage-deflate.js\");\r\nconst {\r\n BINARY_TYPES,\r\n EMPTY_BUFFER,\r\n kStatusCode,\r\n kWebSocket\r\n} = __webpack_require__(/*! ./constants */ \"(ssr)/./node_modules/ws/lib/constants.js\");\r\nconst { concat, toArrayBuffer, unmask } = __webpack_require__(/*! ./buffer-util */ \"(ssr)/./node_modules/ws/lib/buffer-util.js\");\r\nconst { isValidStatusCode, isValidUTF8 } = __webpack_require__(/*! ./validation */ \"(ssr)/./node_modules/ws/lib/validation.js\");\r\n\r\nconst FastBuffer = Buffer[Symbol.species];\r\n\r\nconst GET_INFO = 0;\r\nconst GET_PAYLOAD_LENGTH_16 = 1;\r\nconst GET_PAYLOAD_LENGTH_64 = 2;\r\nconst GET_MASK = 3;\r\nconst GET_DATA = 4;\r\nconst INFLATING = 5;\r\nconst DEFER_EVENT = 6;\r\n\r\n/**\r\n * HyBi Receiver implementation.\r\n *\r\n * @extends Writable\r\n */\r\nclass Receiver extends Writable {\r\n /**\r\n * Creates a Receiver instance.\r\n *\r\n * @param {Object} [options] Options object\r\n * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether\r\n * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted\r\n * multiple times in the same tick\r\n * @param {String} [options.binaryType=nodebuffer] The type for binary data\r\n * @param {Object} [options.extensions] An object containing the negotiated\r\n * extensions\r\n * @param {Boolean} [options.isServer=false] Specifies whether to operate in\r\n * client or server mode\r\n * @param {Number} [options.maxPayload=0] The maximum allowed message length\r\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\r\n * not to skip UTF-8 validation for text and close messages\r\n */\r\n constructor(options = {}) {\r\n super();\r\n\r\n this._allowSynchronousEvents =\r\n options.allowSynchronousEvents !== undefined\r\n ? options.allowSynchronousEvents\r\n : true;\r\n this._binaryType = options.binaryType || BINARY_TYPES[0];\r\n this._extensions = options.extensions || {};\r\n this._isServer = !!options.isServer;\r\n this._maxPayload = options.maxPayload | 0;\r\n this._skipUTF8Validation = !!options.skipUTF8Validation;\r\n this[kWebSocket] = undefined;\r\n\r\n this._bufferedBytes = 0;\r\n this._buffers = [];\r\n\r\n this._compressed = false;\r\n this._payloadLength = 0;\r\n this._mask = undefined;\r\n this._fragmented = 0;\r\n this._masked = false;\r\n this._fin = false;\r\n this._opcode = 0;\r\n\r\n this._totalPayloadLength = 0;\r\n this._messageLength = 0;\r\n this._fragments = [];\r\n\r\n this._errored = false;\r\n this._loop = false;\r\n this._state = GET_INFO;\r\n }\r\n\r\n /**\r\n * Implements `Writable.prototype._write()`.\r\n *\r\n * @param {Buffer} chunk The chunk of data to write\r\n * @param {String} encoding The character encoding of `chunk`\r\n * @param {Function} cb Callback\r\n * @private\r\n */\r\n _write(chunk, encoding, cb) {\r\n if (this._opcode === 0x08 && this._state == GET_INFO) return cb();\r\n\r\n this._bufferedBytes += chunk.length;\r\n this._buffers.push(chunk);\r\n this.startLoop(cb);\r\n }\r\n\r\n /**\r\n * Consumes `n` bytes from the buffered data.\r\n *\r\n * @param {Number} n The number of bytes to consume\r\n * @return {Buffer} The consumed bytes\r\n * @private\r\n */\r\n consume(n) {\r\n this._bufferedBytes -= n;\r\n\r\n if (n === this._buffers[0].length) return this._buffers.shift();\r\n\r\n if (n < this._buffers[0].length) {\r\n const buf = this._buffers[0];\r\n this._buffers[0] = new FastBuffer(\r\n buf.buffer,\r\n buf.byteOffset + n,\r\n buf.length - n\r\n );\r\n\r\n return new FastBuffer(buf.buffer, buf.byteOffset, n);\r\n }\r\n\r\n const dst = Buffer.allocUnsafe(n);\r\n\r\n do {\r\n const buf = this._buffers[0];\r\n const offset = dst.length - n;\r\n\r\n if (n >= buf.length) {\r\n dst.set(this._buffers.shift(), offset);\r\n } else {\r\n dst.set(new Uint8Array(buf.buffer, buf.byteOffset, n), offset);\r\n this._buffers[0] = new FastBuffer(\r\n buf.buffer,\r\n buf.byteOffset + n,\r\n buf.length - n\r\n );\r\n }\r\n\r\n n -= buf.length;\r\n } while (n > 0);\r\n\r\n return dst;\r\n }\r\n\r\n /**\r\n * Starts the parsing loop.\r\n *\r\n * @param {Function} cb Callback\r\n * @private\r\n */\r\n startLoop(cb) {\r\n this._loop = true;\r\n\r\n do {\r\n switch (this._state) {\r\n case GET_INFO:\r\n this.getInfo(cb);\r\n break;\r\n case GET_PAYLOAD_LENGTH_16:\r\n this.getPayloadLength16(cb);\r\n break;\r\n case GET_PAYLOAD_LENGTH_64:\r\n this.getPayloadLength64(cb);\r\n break;\r\n case GET_MASK:\r\n this.getMask();\r\n break;\r\n case GET_DATA:\r\n this.getData(cb);\r\n break;\r\n case INFLATING:\r\n case DEFER_EVENT:\r\n this._loop = false;\r\n return;\r\n }\r\n } while (this._loop);\r\n\r\n if (!this._errored) cb();\r\n }\r\n\r\n /**\r\n * Reads the first two bytes of a frame.\r\n *\r\n * @param {Function} cb Callback\r\n * @private\r\n */\r\n getInfo(cb) {\r\n if (this._bufferedBytes < 2) {\r\n this._loop = false;\r\n return;\r\n }\r\n\r\n const buf = this.consume(2);\r\n\r\n if ((buf[0] & 0x30) !== 0x00) {\r\n const error = this.createError(\r\n RangeError,\r\n 'RSV2 and RSV3 must be clear',\r\n true,\r\n 1002,\r\n 'WS_ERR_UNEXPECTED_RSV_2_3'\r\n );\r\n\r\n cb(error);\r\n return;\r\n }\r\n\r\n const compressed = (buf[0] & 0x40) === 0x40;\r\n\r\n if (compressed && !this._extensions[PerMessageDeflate.extensionName]) {\r\n const error = this.createError(\r\n RangeError,\r\n 'RSV1 must be clear',\r\n true,\r\n 1002,\r\n 'WS_ERR_UNEXPECTED_RSV_1'\r\n );\r\n\r\n cb(error);\r\n return;\r\n }\r\n\r\n this._fin = (buf[0] & 0x80) === 0x80;\r\n this._opcode = buf[0] & 0x0f;\r\n this._payloadLength = buf[1] & 0x7f;\r\n\r\n if (this._opcode === 0x00) {\r\n if (compressed) {\r\n const error = this.createError(\r\n RangeError,\r\n 'RSV1 must be clear',\r\n true,\r\n 1002,\r\n 'WS_ERR_UNEXPECTED_RSV_1'\r\n );\r\n\r\n cb(error);\r\n return;\r\n }\r\n\r\n if (!this._fragmented) {\r\n const error = this.createError(\r\n RangeError,\r\n 'invalid opcode 0',\r\n true,\r\n 1002,\r\n 'WS_ERR_INVALID_OPCODE'\r\n );\r\n\r\n cb(error);\r\n return;\r\n }\r\n\r\n this._opcode = this._fragmented;\r\n } else if (this._opcode === 0x01 || this._opcode === 0x02) {\r\n if (this._fragmented) {\r\n const error = this.createError(\r\n RangeError,\r\n `invalid opcode ${this._opcode}`,\r\n true,\r\n 1002,\r\n 'WS_ERR_INVALID_OPCODE'\r\n );\r\n\r\n cb(error);\r\n return;\r\n }\r\n\r\n this._compressed = compressed;\r\n } else if (this._opcode > 0x07 && this._opcode < 0x0b) {\r\n if (!this._fin) {\r\n const error = this.createError(\r\n RangeError,\r\n 'FIN must be set',\r\n true,\r\n 1002,\r\n 'WS_ERR_EXPECTED_FIN'\r\n );\r\n\r\n cb(error);\r\n return;\r\n }\r\n\r\n if (compressed) {\r\n const error = this.createError(\r\n RangeError,\r\n 'RSV1 must be clear',\r\n true,\r\n 1002,\r\n 'WS_ERR_UNEXPECTED_RSV_1'\r\n );\r\n\r\n cb(error);\r\n return;\r\n }\r\n\r\n if (\r\n this._payloadLength > 0x7d ||\r\n (this._opcode === 0x08 && this._payloadLength === 1)\r\n ) {\r\n const error = this.createError(\r\n RangeError,\r\n `invalid payload length ${this._payloadLength}`,\r\n true,\r\n 1002,\r\n 'WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH'\r\n );\r\n\r\n cb(error);\r\n return;\r\n }\r\n } else {\r\n const error = this.createError(\r\n RangeError,\r\n `invalid opcode ${this._opcode}`,\r\n true,\r\n 1002,\r\n 'WS_ERR_INVALID_OPCODE'\r\n );\r\n\r\n cb(error);\r\n return;\r\n }\r\n\r\n if (!this._fin && !this._fragmented) this._fragmented = this._opcode;\r\n this._masked = (buf[1] & 0x80) === 0x80;\r\n\r\n if (this._isServer) {\r\n if (!this._masked) {\r\n const error = this.createError(\r\n RangeError,\r\n 'MASK must be set',\r\n true,\r\n 1002,\r\n 'WS_ERR_EXPECTED_MASK'\r\n );\r\n\r\n cb(error);\r\n return;\r\n }\r\n } else if (this._masked) {\r\n const error = this.createError(\r\n RangeError,\r\n 'MASK must be clear',\r\n true,\r\n 1002,\r\n 'WS_ERR_UNEXPECTED_MASK'\r\n );\r\n\r\n cb(error);\r\n return;\r\n }\r\n\r\n if (this._payloadLength === 126) this._state = GET_PAYLOAD_LENGTH_16;\r\n else if (this._payloadLength === 127) this._state = GET_PAYLOAD_LENGTH_64;\r\n else this.haveLength(cb);\r\n }\r\n\r\n /**\r\n * Gets extended payload length (7+16).\r\n *\r\n * @param {Function} cb Callback\r\n * @private\r\n */\r\n getPayloadLength16(cb) {\r\n if (this._bufferedBytes < 2) {\r\n this._loop = false;\r\n return;\r\n }\r\n\r\n this._payloadLength = this.consume(2).readUInt16BE(0);\r\n this.haveLength(cb);\r\n }\r\n\r\n /**\r\n * Gets extended payload length (7+64).\r\n *\r\n * @param {Function} cb Callback\r\n * @private\r\n */\r\n getPayloadLength64(cb) {\r\n if (this._bufferedBytes < 8) {\r\n this._loop = false;\r\n return;\r\n }\r\n\r\n const buf = this.consume(8);\r\n const num = buf.readUInt32BE(0);\r\n\r\n //\r\n // The maximum safe integer in JavaScript is 2^53 - 1. An error is returned\r\n // if payload length is greater than this number.\r\n //\r\n if (num > Math.pow(2, 53 - 32) - 1) {\r\n const error = this.createError(\r\n RangeError,\r\n 'Unsupported WebSocket frame: payload length > 2^53 - 1',\r\n false,\r\n 1009,\r\n 'WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH'\r\n );\r\n\r\n cb(error);\r\n return;\r\n }\r\n\r\n this._payloadLength = num * Math.pow(2, 32) + buf.readUInt32BE(4);\r\n this.haveLength(cb);\r\n }\r\n\r\n /**\r\n * Payload length has been read.\r\n *\r\n * @param {Function} cb Callback\r\n * @private\r\n */\r\n haveLength(cb) {\r\n if (this._payloadLength && this._opcode < 0x08) {\r\n this._totalPayloadLength += this._payloadLength;\r\n if (this._totalPayloadLength > this._maxPayload && this._maxPayload > 0) {\r\n const error = this.createError(\r\n RangeError,\r\n 'Max payload size exceeded',\r\n false,\r\n 1009,\r\n 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH'\r\n );\r\n\r\n cb(error);\r\n return;\r\n }\r\n }\r\n\r\n if (this._masked) this._state = GET_MASK;\r\n else this._state = GET_DATA;\r\n }\r\n\r\n /**\r\n * Reads mask bytes.\r\n *\r\n * @private\r\n */\r\n getMask() {\r\n if (this._bufferedBytes < 4) {\r\n this._loop = false;\r\n return;\r\n }\r\n\r\n this._mask = this.consume(4);\r\n this._state = GET_DATA;\r\n }\r\n\r\n /**\r\n * Reads data bytes.\r\n *\r\n * @param {Function} cb Callback\r\n * @private\r\n */\r\n getData(cb) {\r\n let data = EMPTY_BUFFER;\r\n\r\n if (this._payloadLength) {\r\n if (this._bufferedBytes < this._payloadLength) {\r\n this._loop = false;\r\n return;\r\n }\r\n\r\n data = this.consume(this._payloadLength);\r\n\r\n if (\r\n this._masked &&\r\n (this._mask[0] | this._mask[1] | this._mask[2] | this._mask[3]) !== 0\r\n ) {\r\n unmask(data, this._mask);\r\n }\r\n }\r\n\r\n if (this._opcode > 0x07) {\r\n this.controlMessage(data, cb);\r\n return;\r\n }\r\n\r\n if (this._compressed) {\r\n this._state = INFLATING;\r\n this.decompress(data, cb);\r\n return;\r\n }\r\n\r\n if (data.length) {\r\n //\r\n // This message is not compressed so its length is the sum of the payload\r\n // length of all fragments.\r\n //\r\n this._messageLength = this._totalPayloadLength;\r\n this._fragments.push(data);\r\n }\r\n\r\n this.dataMessage(cb);\r\n }\r\n\r\n /**\r\n * Decompresses data.\r\n *\r\n * @param {Buffer} data Compressed data\r\n * @param {Function} cb Callback\r\n * @private\r\n */\r\n decompress(data, cb) {\r\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\r\n\r\n perMessageDeflate.decompress(data, this._fin, (err, buf) => {\r\n if (err) return cb(err);\r\n\r\n if (buf.length) {\r\n this._messageLength += buf.length;\r\n if (this._messageLength > this._maxPayload && this._maxPayload > 0) {\r\n const error = this.createError(\r\n RangeError,\r\n 'Max payload size exceeded',\r\n false,\r\n 1009,\r\n 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH'\r\n );\r\n\r\n cb(error);\r\n return;\r\n }\r\n\r\n this._fragments.push(buf);\r\n }\r\n\r\n this.dataMessage(cb);\r\n if (this._state === GET_INFO) this.startLoop(cb);\r\n });\r\n }\r\n\r\n /**\r\n * Handles a data message.\r\n *\r\n * @param {Function} cb Callback\r\n * @private\r\n */\r\n dataMessage(cb) {\r\n if (!this._fin) {\r\n this._state = GET_INFO;\r\n return;\r\n }\r\n\r\n const messageLength = this._messageLength;\r\n const fragments = this._fragments;\r\n\r\n this._totalPayloadLength = 0;\r\n this._messageLength = 0;\r\n this._fragmented = 0;\r\n this._fragments = [];\r\n\r\n if (this._opcode === 2) {\r\n let data;\r\n\r\n if (this._binaryType === 'nodebuffer') {\r\n data = concat(fragments, messageLength);\r\n } else if (this._binaryType === 'arraybuffer') {\r\n data = toArrayBuffer(concat(fragments, messageLength));\r\n } else if (this._binaryType === 'blob') {\r\n data = new Blob(fragments);\r\n } else {\r\n data = fragments;\r\n }\r\n\r\n if (this._allowSynchronousEvents) {\r\n this.emit('message', data, true);\r\n this._state = GET_INFO;\r\n } else {\r\n this._state = DEFER_EVENT;\r\n setImmediate(() => {\r\n this.emit('message', data, true);\r\n this._state = GET_INFO;\r\n this.startLoop(cb);\r\n });\r\n }\r\n } else {\r\n const buf = concat(fragments, messageLength);\r\n\r\n if (!this._skipUTF8Validation && !isValidUTF8(buf)) {\r\n const error = this.createError(\r\n Error,\r\n 'invalid UTF-8 sequence',\r\n true,\r\n 1007,\r\n 'WS_ERR_INVALID_UTF8'\r\n );\r\n\r\n cb(error);\r\n return;\r\n }\r\n\r\n if (this._state === INFLATING || this._allowSynchronousEvents) {\r\n this.emit('message', buf, false);\r\n this._state = GET_INFO;\r\n } else {\r\n this._state = DEFER_EVENT;\r\n setImmediate(() => {\r\n this.emit('message', buf, false);\r\n this._state = GET_INFO;\r\n this.startLoop(cb);\r\n });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Handles a control message.\r\n *\r\n * @param {Buffer} data Data to handle\r\n * @return {(Error|RangeError|undefined)} A possible error\r\n * @private\r\n */\r\n controlMessage(data, cb) {\r\n if (this._opcode === 0x08) {\r\n if (data.length === 0) {\r\n this._loop = false;\r\n this.emit('conclude', 1005, EMPTY_BUFFER);\r\n this.end();\r\n } else {\r\n const code = data.readUInt16BE(0);\r\n\r\n if (!isValidStatusCode(code)) {\r\n const error = this.createError(\r\n RangeError,\r\n `invalid status code ${code}`,\r\n true,\r\n 1002,\r\n 'WS_ERR_INVALID_CLOSE_CODE'\r\n );\r\n\r\n cb(error);\r\n return;\r\n }\r\n\r\n const buf = new FastBuffer(\r\n data.buffer,\r\n data.byteOffset + 2,\r\n data.length - 2\r\n );\r\n\r\n if (!this._skipUTF8Validation && !isValidUTF8(buf)) {\r\n const error = this.createError(\r\n Error,\r\n 'invalid UTF-8 sequence',\r\n true,\r\n 1007,\r\n 'WS_ERR_INVALID_UTF8'\r\n );\r\n\r\n cb(error);\r\n return;\r\n }\r\n\r\n this._loop = false;\r\n this.emit('conclude', code, buf);\r\n this.end();\r\n }\r\n\r\n this._state = GET_INFO;\r\n return;\r\n }\r\n\r\n if (this._allowSynchronousEvents) {\r\n this.emit(this._opcode === 0x09 ? 'ping' : 'pong', data);\r\n this._state = GET_INFO;\r\n } else {\r\n this._state = DEFER_EVENT;\r\n setImmediate(() => {\r\n this.emit(this._opcode === 0x09 ? 'ping' : 'pong', data);\r\n this._state = GET_INFO;\r\n this.startLoop(cb);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Builds an error object.\r\n *\r\n * @param {function(new:Error|RangeError)} ErrorCtor The error constructor\r\n * @param {String} message The error message\r\n * @param {Boolean} prefix Specifies whether or not to add a default prefix to\r\n * `message`\r\n * @param {Number} statusCode The status code\r\n * @param {String} errorCode The exposed error code\r\n * @return {(Error|RangeError)} The error\r\n * @private\r\n */\r\n createError(ErrorCtor, message, prefix, statusCode, errorCode) {\r\n this._loop = false;\r\n this._errored = true;\r\n\r\n const err = new ErrorCtor(\r\n prefix ? `Invalid WebSocket frame: ${message}` : message\r\n );\r\n\r\n Error.captureStackTrace(err, this.createError);\r\n err.code = errorCode;\r\n err[kStatusCode] = statusCode;\r\n return err;\r\n }\r\n}\r\n\r\nmodule.exports = Receiver;\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvd3MvbGliL3JlY2VpdmVyLmpzIiwibWFwcGluZ3MiOiJBQUFhO0FBQ2I7QUFDQSxRQUFRLFdBQVcsRUFBRSxtQkFBTyxDQUFDLHNCQUFRO0FBQ3JDO0FBQ0EsMEJBQTBCLG1CQUFPLENBQUMsK0VBQXNCO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLEVBQUUsbUJBQU8sQ0FBQyw2REFBYTtBQUN6QixRQUFRLGdDQUFnQyxFQUFFLG1CQUFPLENBQUMsaUVBQWU7QUFDakUsUUFBUSxpQ0FBaUMsRUFBRSxtQkFBTyxDQUFDLCtEQUFjO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLGFBQWE7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxvQkFBb0I7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsMEJBQTBCLGFBQWE7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGNBQWMsOEJBQThCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxLQUFLO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxnQ0FBZ0M7QUFDN0MsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsU0FBUztBQUN0QjtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsY0FBYyxvQkFBb0I7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkMsUUFBUTtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL25leHRqcy8uL25vZGVfbW9kdWxlcy93cy9saWIvcmVjZWl2ZXIuanM/OTNjOCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XHJcblxyXG5jb25zdCB7IFdyaXRhYmxlIH0gPSByZXF1aXJlKCdzdHJlYW0nKTtcclxuXHJcbmNvbnN0IFBlck1lc3NhZ2VEZWZsYXRlID0gcmVxdWlyZSgnLi9wZXJtZXNzYWdlLWRlZmxhdGUnKTtcclxuY29uc3Qge1xyXG4gIEJJTkFSWV9UWVBFUyxcclxuICBFTVBUWV9CVUZGRVIsXHJcbiAga1N0YXR1c0NvZGUsXHJcbiAga1dlYlNvY2tldFxyXG59ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKTtcclxuY29uc3QgeyBjb25jYXQsIHRvQXJyYXlCdWZmZXIsIHVubWFzayB9ID0gcmVxdWlyZSgnLi9idWZmZXItdXRpbCcpO1xyXG5jb25zdCB7IGlzVmFsaWRTdGF0dXNDb2RlLCBpc1ZhbGlkVVRGOCB9ID0gcmVxdWlyZSgnLi92YWxpZGF0aW9uJyk7XHJcblxyXG5jb25zdCBGYXN0QnVmZmVyID0gQnVmZmVyW1N5bWJvbC5zcGVjaWVzXTtcclxuXHJcbmNvbnN0IEdFVF9JTkZPID0gMDtcclxuY29uc3QgR0VUX1BBWUxPQURfTEVOR1RIXzE2ID0gMTtcclxuY29uc3QgR0VUX1BBWUxPQURfTEVOR1RIXzY0ID0gMjtcclxuY29uc3QgR0VUX01BU0sgPSAzO1xyXG5jb25zdCBHRVRfREFUQSA9IDQ7XHJcbmNvbnN0IElORkxBVElORyA9IDU7XHJcbmNvbnN0IERFRkVSX0VWRU5UID0gNjtcclxuXHJcbi8qKlxyXG4gKiBIeUJpIFJlY2VpdmVyIGltcGxlbWVudGF0aW9uLlxyXG4gKlxyXG4gKiBAZXh0ZW5kcyBXcml0YWJsZVxyXG4gKi9cclxuY2xhc3MgUmVjZWl2ZXIgZXh0ZW5kcyBXcml0YWJsZSB7XHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBhIFJlY2VpdmVyIGluc3RhbmNlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBPcHRpb25zIG9iamVjdFxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuYWxsb3dTeW5jaHJvbm91c0V2ZW50cz10cnVlXSBTcGVjaWZpZXMgd2hldGhlclxyXG4gICAqICAgICBhbnkgb2YgdGhlIGAnbWVzc2FnZSdgLCBgJ3BpbmcnYCwgYW5kIGAncG9uZydgIGV2ZW50cyBjYW4gYmUgZW1pdHRlZFxyXG4gICAqICAgICBtdWx0aXBsZSB0aW1lcyBpbiB0aGUgc2FtZSB0aWNrXHJcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmJpbmFyeVR5cGU9bm9kZWJ1ZmZlcl0gVGhlIHR5cGUgZm9yIGJpbmFyeSBkYXRhXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmV4dGVuc2lvbnNdIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBuZWdvdGlhdGVkXHJcbiAgICogICAgIGV4dGVuc2lvbnNcclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmlzU2VydmVyPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciB0byBvcGVyYXRlIGluXHJcbiAgICogICAgIGNsaWVudCBvciBzZXJ2ZXIgbW9kZVxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5tYXhQYXlsb2FkPTBdIFRoZSBtYXhpbXVtIGFsbG93ZWQgbWVzc2FnZSBsZW5ndGhcclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNraXBVVEY4VmFsaWRhdGlvbj1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3JcclxuICAgKiAgICAgbm90IHRvIHNraXAgVVRGLTggdmFsaWRhdGlvbiBmb3IgdGV4dCBhbmQgY2xvc2UgbWVzc2FnZXNcclxuICAgKi9cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHtcclxuICAgIHN1cGVyKCk7XHJcblxyXG4gICAgdGhpcy5fYWxsb3dTeW5jaHJvbm91c0V2ZW50cyA9XHJcbiAgICAgIG9wdGlvbnMuYWxsb3dTeW5jaHJvbm91c0V2ZW50cyAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgPyBvcHRpb25zLmFsbG93U3luY2hyb25vdXNFdmVudHNcclxuICAgICAgICA6IHRydWU7XHJcbiAgICB0aGlzLl9iaW5hcnlUeXBlID0gb3B0aW9ucy5iaW5hcnlUeXBlIHx8IEJJTkFSWV9UWVBFU1swXTtcclxuICAgIHRoaXMuX2V4dGVuc2lvbnMgPSBvcHRpb25zLmV4dGVuc2lvbnMgfHwge307XHJcbiAgICB0aGlzLl9pc1NlcnZlciA9ICEhb3B0aW9ucy5pc1NlcnZlcjtcclxuICAgIHRoaXMuX21heFBheWxvYWQgPSBvcHRpb25zLm1heFBheWxvYWQgfCAwO1xyXG4gICAgdGhpcy5fc2tpcFVURjhWYWxpZGF0aW9uID0gISFvcHRpb25zLnNraXBVVEY4VmFsaWRhdGlvbjtcclxuICAgIHRoaXNba1dlYlNvY2tldF0gPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgdGhpcy5fYnVmZmVyZWRCeXRlcyA9IDA7XHJcbiAgICB0aGlzLl9idWZmZXJzID0gW107XHJcblxyXG4gICAgdGhpcy5fY29tcHJlc3NlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5fcGF5bG9hZExlbmd0aCA9IDA7XHJcbiAgICB0aGlzLl9tYXNrID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5fZnJhZ21lbnRlZCA9IDA7XHJcbiAgICB0aGlzLl9tYXNrZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuX2ZpbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5fb3Bjb2RlID0gMDtcclxuXHJcbiAgICB0aGlzLl90b3RhbFBheWxvYWRMZW5ndGggPSAwO1xyXG4gICAgdGhpcy5fbWVzc2FnZUxlbmd0aCA9IDA7XHJcbiAgICB0aGlzLl9mcmFnbWVudHMgPSBbXTtcclxuXHJcbiAgICB0aGlzLl9lcnJvcmVkID0gZmFsc2U7XHJcbiAgICB0aGlzLl9sb29wID0gZmFsc2U7XHJcbiAgICB0aGlzLl9zdGF0ZSA9IEdFVF9JTkZPO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW1wbGVtZW50cyBgV3JpdGFibGUucHJvdG90eXBlLl93cml0ZSgpYC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBjaHVuayBUaGUgY2h1bmsgb2YgZGF0YSB0byB3cml0ZVxyXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBlbmNvZGluZyBUaGUgY2hhcmFjdGVyIGVuY29kaW5nIG9mIGBjaHVua2BcclxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYiBDYWxsYmFja1xyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgX3dyaXRlKGNodW5rLCBlbmNvZGluZywgY2IpIHtcclxuICAgIGlmICh0aGlzLl9vcGNvZGUgPT09IDB4MDggJiYgdGhpcy5fc3RhdGUgPT0gR0VUX0lORk8pIHJldHVybiBjYigpO1xyXG5cclxuICAgIHRoaXMuX2J1ZmZlcmVkQnl0ZXMgKz0gY2h1bmsubGVuZ3RoO1xyXG4gICAgdGhpcy5fYnVmZmVycy5wdXNoKGNodW5rKTtcclxuICAgIHRoaXMuc3RhcnRMb29wKGNiKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbnN1bWVzIGBuYCBieXRlcyBmcm9tIHRoZSBidWZmZXJlZCBkYXRhLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IG4gVGhlIG51bWJlciBvZiBieXRlcyB0byBjb25zdW1lXHJcbiAgICogQHJldHVybiB7QnVmZmVyfSBUaGUgY29uc3VtZWQgYnl0ZXNcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIGNvbnN1bWUobikge1xyXG4gICAgdGhpcy5fYnVmZmVyZWRCeXRlcyAtPSBuO1xyXG5cclxuICAgIGlmIChuID09PSB0aGlzLl9idWZmZXJzWzBdLmxlbmd0aCkgcmV0dXJuIHRoaXMuX2J1ZmZlcnMuc2hpZnQoKTtcclxuXHJcbiAgICBpZiAobiA8IHRoaXMuX2J1ZmZlcnNbMF0ubGVuZ3RoKSB7XHJcbiAgICAgIGNvbnN0IGJ1ZiA9IHRoaXMuX2J1ZmZlcnNbMF07XHJcbiAgICAgIHRoaXMuX2J1ZmZlcnNbMF0gPSBuZXcgRmFzdEJ1ZmZlcihcclxuICAgICAgICBidWYuYnVmZmVyLFxyXG4gICAgICAgIGJ1Zi5ieXRlT2Zmc2V0ICsgbixcclxuICAgICAgICBidWYubGVuZ3RoIC0gblxyXG4gICAgICApO1xyXG5cclxuICAgICAgcmV0dXJuIG5ldyBGYXN0QnVmZmVyKGJ1Zi5idWZmZXIsIGJ1Zi5ieXRlT2Zmc2V0LCBuKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBkc3QgPSBCdWZmZXIuYWxsb2NVbnNhZmUobik7XHJcblxyXG4gICAgZG8ge1xyXG4gICAgICBjb25zdCBidWYgPSB0aGlzLl9idWZmZXJzWzBdO1xyXG4gICAgICBjb25zdCBvZmZzZXQgPSBkc3QubGVuZ3RoIC0gbjtcclxuXHJcbiAgICAgIGlmIChuID49IGJ1Zi5sZW5ndGgpIHtcclxuICAgICAgICBkc3Quc2V0KHRoaXMuX2J1ZmZlcnMuc2hpZnQoKSwgb2Zmc2V0KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBkc3Quc2V0KG5ldyBVaW50OEFycmF5KGJ1Zi5idWZmZXIsIGJ1Zi5ieXRlT2Zmc2V0LCBuKSwgb2Zmc2V0KTtcclxuICAgICAgICB0aGlzLl9idWZmZXJzWzBdID0gbmV3IEZhc3RCdWZmZXIoXHJcbiAgICAgICAgICBidWYuYnVmZmVyLFxyXG4gICAgICAgICAgYnVmLmJ5dGVPZmZzZXQgKyBuLFxyXG4gICAgICAgICAgYnVmLmxlbmd0aCAtIG5cclxuICAgICAgICApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBuIC09IGJ1Zi5sZW5ndGg7XHJcbiAgICB9IHdoaWxlIChuID4gMCk7XHJcblxyXG4gICAgcmV0dXJuIGRzdDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFN0YXJ0cyB0aGUgcGFyc2luZyBsb29wLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2IgQ2FsbGJhY2tcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHN0YXJ0TG9vcChjYikge1xyXG4gICAgdGhpcy5fbG9vcCA9IHRydWU7XHJcblxyXG4gICAgZG8ge1xyXG4gICAgICBzd2l0Y2ggKHRoaXMuX3N0YXRlKSB7XHJcbiAgICAgICAgY2FzZSBHRVRfSU5GTzpcclxuICAgICAgICAgIHRoaXMuZ2V0SW5mbyhjYik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIEdFVF9QQVlMT0FEX0xFTkdUSF8xNjpcclxuICAgICAgICAgIHRoaXMuZ2V0UGF5bG9hZExlbmd0aDE2KGNiKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgR0VUX1BBWUxPQURfTEVOR1RIXzY0OlxyXG4gICAgICAgICAgdGhpcy5nZXRQYXlsb2FkTGVuZ3RoNjQoY2IpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBHRVRfTUFTSzpcclxuICAgICAgICAgIHRoaXMuZ2V0TWFzaygpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBHRVRfREFUQTpcclxuICAgICAgICAgIHRoaXMuZ2V0RGF0YShjYik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIElORkxBVElORzpcclxuICAgICAgICBjYXNlIERFRkVSX0VWRU5UOlxyXG4gICAgICAgICAgdGhpcy5fbG9vcCA9IGZhbHNlO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9IHdoaWxlICh0aGlzLl9sb29wKTtcclxuXHJcbiAgICBpZiAoIXRoaXMuX2Vycm9yZWQpIGNiKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZWFkcyB0aGUgZmlyc3QgdHdvIGJ5dGVzIG9mIGEgZnJhbWUuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYiBDYWxsYmFja1xyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgZ2V0SW5mbyhjYikge1xyXG4gICAgaWYgKHRoaXMuX2J1ZmZlcmVkQnl0ZXMgPCAyKSB7XHJcbiAgICAgIHRoaXMuX2xvb3AgPSBmYWxzZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGJ1ZiA9IHRoaXMuY29uc3VtZSgyKTtcclxuXHJcbiAgICBpZiAoKGJ1ZlswXSAmIDB4MzApICE9PSAweDAwKSB7XHJcbiAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihcclxuICAgICAgICBSYW5nZUVycm9yLFxyXG4gICAgICAgICdSU1YyIGFuZCBSU1YzIG11c3QgYmUgY2xlYXInLFxyXG4gICAgICAgIHRydWUsXHJcbiAgICAgICAgMTAwMixcclxuICAgICAgICAnV1NfRVJSX1VORVhQRUNURURfUlNWXzJfMydcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGNiKGVycm9yKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvbXByZXNzZWQgPSAoYnVmWzBdICYgMHg0MCkgPT09IDB4NDA7XHJcblxyXG4gICAgaWYgKGNvbXByZXNzZWQgJiYgIXRoaXMuX2V4dGVuc2lvbnNbUGVyTWVzc2FnZURlZmxhdGUuZXh0ZW5zaW9uTmFtZV0pIHtcclxuICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLmNyZWF0ZUVycm9yKFxyXG4gICAgICAgIFJhbmdlRXJyb3IsXHJcbiAgICAgICAgJ1JTVjEgbXVzdCBiZSBjbGVhcicsXHJcbiAgICAgICAgdHJ1ZSxcclxuICAgICAgICAxMDAyLFxyXG4gICAgICAgICdXU19FUlJfVU5FWFBFQ1RFRF9SU1ZfMSdcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGNiKGVycm9yKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX2ZpbiA9IChidWZbMF0gJiAweDgwKSA9PT0gMHg4MDtcclxuICAgIHRoaXMuX29wY29kZSA9IGJ1ZlswXSAmIDB4MGY7XHJcbiAgICB0aGlzLl9wYXlsb2FkTGVuZ3RoID0gYnVmWzFdICYgMHg3ZjtcclxuXHJcbiAgICBpZiAodGhpcy5fb3Bjb2RlID09PSAweDAwKSB7XHJcbiAgICAgIGlmIChjb21wcmVzc2VkKSB7XHJcbiAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLmNyZWF0ZUVycm9yKFxyXG4gICAgICAgICAgUmFuZ2VFcnJvcixcclxuICAgICAgICAgICdSU1YxIG11c3QgYmUgY2xlYXInLFxyXG4gICAgICAgICAgdHJ1ZSxcclxuICAgICAgICAgIDEwMDIsXHJcbiAgICAgICAgICAnV1NfRVJSX1VORVhQRUNURURfUlNWXzEnXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgY2IoZXJyb3IpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCF0aGlzLl9mcmFnbWVudGVkKSB7XHJcbiAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLmNyZWF0ZUVycm9yKFxyXG4gICAgICAgICAgUmFuZ2VFcnJvcixcclxuICAgICAgICAgICdpbnZhbGlkIG9wY29kZSAwJyxcclxuICAgICAgICAgIHRydWUsXHJcbiAgICAgICAgICAxMDAyLFxyXG4gICAgICAgICAgJ1dTX0VSUl9JTlZBTElEX09QQ09ERSdcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBjYihlcnJvcik7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLl9vcGNvZGUgPSB0aGlzLl9mcmFnbWVudGVkO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLl9vcGNvZGUgPT09IDB4MDEgfHwgdGhpcy5fb3Bjb2RlID09PSAweDAyKSB7XHJcbiAgICAgIGlmICh0aGlzLl9mcmFnbWVudGVkKSB7XHJcbiAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLmNyZWF0ZUVycm9yKFxyXG4gICAgICAgICAgUmFuZ2VFcnJvcixcclxuICAgICAgICAgIGBpbnZhbGlkIG9wY29kZSAke3RoaXMuX29wY29kZX1gLFxyXG4gICAgICAgICAgdHJ1ZSxcclxuICAgICAgICAgIDEwMDIsXHJcbiAgICAgICAgICAnV1NfRVJSX0lOVkFMSURfT1BDT0RFJ1xyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGNiKGVycm9yKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuX2NvbXByZXNzZWQgPSBjb21wcmVzc2VkO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLl9vcGNvZGUgPiAweDA3ICYmIHRoaXMuX29wY29kZSA8IDB4MGIpIHtcclxuICAgICAgaWYgKCF0aGlzLl9maW4pIHtcclxuICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuY3JlYXRlRXJyb3IoXHJcbiAgICAgICAgICBSYW5nZUVycm9yLFxyXG4gICAgICAgICAgJ0ZJTiBtdXN0IGJlIHNldCcsXHJcbiAgICAgICAgICB0cnVlLFxyXG4gICAgICAgICAgMTAwMixcclxuICAgICAgICAgICdXU19FUlJfRVhQRUNURURfRklOJ1xyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGNiKGVycm9yKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjb21wcmVzc2VkKSB7XHJcbiAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLmNyZWF0ZUVycm9yKFxyXG4gICAgICAgICAgUmFuZ2VFcnJvcixcclxuICAgICAgICAgICdSU1YxIG11c3QgYmUgY2xlYXInLFxyXG4gICAgICAgICAgdHJ1ZSxcclxuICAgICAgICAgIDEwMDIsXHJcbiAgICAgICAgICAnV1NfRVJSX1VORVhQRUNURURfUlNWXzEnXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgY2IoZXJyb3IpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMuX3BheWxvYWRMZW5ndGggPiAweDdkIHx8XHJcbiAgICAgICAgKHRoaXMuX29wY29kZSA9PT0gMHgwOCAmJiB0aGlzLl9wYXlsb2FkTGVuZ3RoID09PSAxKVxyXG4gICAgICApIHtcclxuICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuY3JlYXRlRXJyb3IoXHJcbiAgICAgICAgICBSYW5nZUVycm9yLFxyXG4gICAgICAgICAgYGludmFsaWQgcGF5bG9hZCBsZW5ndGggJHt0aGlzLl9wYXlsb2FkTGVuZ3RofWAsXHJcbiAgICAgICAgICB0cnVlLFxyXG4gICAgICAgICAgMTAwMixcclxuICAgICAgICAgICdXU19FUlJfSU5WQUxJRF9DT05UUk9MX1BBWUxPQURfTEVOR1RIJ1xyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGNiKGVycm9yKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihcclxuICAgICAgICBSYW5nZUVycm9yLFxyXG4gICAgICAgIGBpbnZhbGlkIG9wY29kZSAke3RoaXMuX29wY29kZX1gLFxyXG4gICAgICAgIHRydWUsXHJcbiAgICAgICAgMTAwMixcclxuICAgICAgICAnV1NfRVJSX0lOVkFMSURfT1BDT0RFJ1xyXG4gICAgICApO1xyXG5cclxuICAgICAgY2IoZXJyb3IpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLl9maW4gJiYgIXRoaXMuX2ZyYWdtZW50ZWQpIHRoaXMuX2ZyYWdtZW50ZWQgPSB0aGlzLl9vcGNvZGU7XHJcbiAgICB0aGlzLl9tYXNrZWQgPSAoYnVmWzFdICYgMHg4MCkgPT09IDB4ODA7XHJcblxyXG4gICAgaWYgKHRoaXMuX2lzU2VydmVyKSB7XHJcbiAgICAgIGlmICghdGhpcy5fbWFza2VkKSB7XHJcbiAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLmNyZWF0ZUVycm9yKFxyXG4gICAgICAgICAgUmFuZ2VFcnJvcixcclxuICAgICAgICAgICdNQVNLIG11c3QgYmUgc2V0JyxcclxuICAgICAgICAgIHRydWUsXHJcbiAgICAgICAgICAxMDAyLFxyXG4gICAgICAgICAgJ1dTX0VSUl9FWFBFQ1RFRF9NQVNLJ1xyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGNiKGVycm9yKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAodGhpcy5fbWFza2VkKSB7XHJcbiAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihcclxuICAgICAgICBSYW5nZUVycm9yLFxyXG4gICAgICAgICdNQVNLIG11c3QgYmUgY2xlYXInLFxyXG4gICAgICAgIHRydWUsXHJcbiAgICAgICAgMTAwMixcclxuICAgICAgICAnV1NfRVJSX1VORVhQRUNURURfTUFTSydcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGNiKGVycm9yKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9wYXlsb2FkTGVuZ3RoID09PSAxMjYpIHRoaXMuX3N0YXRlID0gR0VUX1BBWUxPQURfTEVOR1RIXzE2O1xyXG4gICAgZWxzZSBpZiAodGhpcy5fcGF5bG9hZExlbmd0aCA9PT0gMTI3KSB0aGlzLl9zdGF0ZSA9IEdFVF9QQVlMT0FEX0xFTkdUSF82NDtcclxuICAgIGVsc2UgdGhpcy5oYXZlTGVuZ3RoKGNiKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHMgZXh0ZW5kZWQgcGF5bG9hZCBsZW5ndGggKDcrMTYpLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2IgQ2FsbGJhY2tcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIGdldFBheWxvYWRMZW5ndGgxNihjYikge1xyXG4gICAgaWYgKHRoaXMuX2J1ZmZlcmVkQnl0ZXMgPCAyKSB7XHJcbiAgICAgIHRoaXMuX2xvb3AgPSBmYWxzZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX3BheWxvYWRMZW5ndGggPSB0aGlzLmNvbnN1bWUoMikucmVhZFVJbnQxNkJFKDApO1xyXG4gICAgdGhpcy5oYXZlTGVuZ3RoKGNiKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHMgZXh0ZW5kZWQgcGF5bG9hZCBsZW5ndGggKDcrNjQpLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2IgQ2FsbGJhY2tcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIGdldFBheWxvYWRMZW5ndGg2NChjYikge1xyXG4gICAgaWYgKHRoaXMuX2J1ZmZlcmVkQnl0ZXMgPCA4KSB7XHJcbiAgICAgIHRoaXMuX2xvb3AgPSBmYWxzZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGJ1ZiA9IHRoaXMuY29uc3VtZSg4KTtcclxuICAgIGNvbnN0IG51bSA9IGJ1Zi5yZWFkVUludDMyQkUoMCk7XHJcblxyXG4gICAgLy9cclxuICAgIC8vIFRoZSBtYXhpbXVtIHNhZmUgaW50ZWdlciBpbiBKYXZhU2NyaXB0IGlzIDJeNTMgLSAxLiBBbiBlcnJvciBpcyByZXR1cm5lZFxyXG4gICAgLy8gaWYgcGF5bG9hZCBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIHRoaXMgbnVtYmVyLlxyXG4gICAgLy9cclxuICAgIGlmIChudW0gPiBNYXRoLnBvdygyLCA1MyAtIDMyKSAtIDEpIHtcclxuICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLmNyZWF0ZUVycm9yKFxyXG4gICAgICAgIFJhbmdlRXJyb3IsXHJcbiAgICAgICAgJ1Vuc3VwcG9ydGVkIFdlYlNvY2tldCBmcmFtZTogcGF5bG9hZCBsZW5ndGggPiAyXjUzIC0gMScsXHJcbiAgICAgICAgZmFsc2UsXHJcbiAgICAgICAgMTAwOSxcclxuICAgICAgICAnV1NfRVJSX1VOU1VQUE9SVEVEX0RBVEFfUEFZTE9BRF9MRU5HVEgnXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBjYihlcnJvcik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9wYXlsb2FkTGVuZ3RoID0gbnVtICogTWF0aC5wb3coMiwgMzIpICsgYnVmLnJlYWRVSW50MzJCRSg0KTtcclxuICAgIHRoaXMuaGF2ZUxlbmd0aChjYik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQYXlsb2FkIGxlbmd0aCBoYXMgYmVlbiByZWFkLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2IgQ2FsbGJhY2tcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIGhhdmVMZW5ndGgoY2IpIHtcclxuICAgIGlmICh0aGlzLl9wYXlsb2FkTGVuZ3RoICYmIHRoaXMuX29wY29kZSA8IDB4MDgpIHtcclxuICAgICAgdGhpcy5fdG90YWxQYXlsb2FkTGVuZ3RoICs9IHRoaXMuX3BheWxvYWRMZW5ndGg7XHJcbiAgICAgIGlmICh0aGlzLl90b3RhbFBheWxvYWRMZW5ndGggPiB0aGlzLl9tYXhQYXlsb2FkICYmIHRoaXMuX21heFBheWxvYWQgPiAwKSB7XHJcbiAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLmNyZWF0ZUVycm9yKFxyXG4gICAgICAgICAgUmFuZ2VFcnJvcixcclxuICAgICAgICAgICdNYXggcGF5bG9hZCBzaXplIGV4Y2VlZGVkJyxcclxuICAgICAgICAgIGZhbHNlLFxyXG4gICAgICAgICAgMTAwOSxcclxuICAgICAgICAgICdXU19FUlJfVU5TVVBQT1JURURfTUVTU0FHRV9MRU5HVEgnXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgY2IoZXJyb3IpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9tYXNrZWQpIHRoaXMuX3N0YXRlID0gR0VUX01BU0s7XHJcbiAgICBlbHNlIHRoaXMuX3N0YXRlID0gR0VUX0RBVEE7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZWFkcyBtYXNrIGJ5dGVzLlxyXG4gICAqXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBnZXRNYXNrKCkge1xyXG4gICAgaWYgKHRoaXMuX2J1ZmZlcmVkQnl0ZXMgPCA0KSB7XHJcbiAgICAgIHRoaXMuX2xvb3AgPSBmYWxzZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX21hc2sgPSB0aGlzLmNvbnN1bWUoNCk7XHJcbiAgICB0aGlzLl9zdGF0ZSA9IEdFVF9EQVRBO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVhZHMgZGF0YSBieXRlcy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNiIENhbGxiYWNrXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBnZXREYXRhKGNiKSB7XHJcbiAgICBsZXQgZGF0YSA9IEVNUFRZX0JVRkZFUjtcclxuXHJcbiAgICBpZiAodGhpcy5fcGF5bG9hZExlbmd0aCkge1xyXG4gICAgICBpZiAodGhpcy5fYnVmZmVyZWRCeXRlcyA8IHRoaXMuX3BheWxvYWRMZW5ndGgpIHtcclxuICAgICAgICB0aGlzLl9sb29wID0gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBkYXRhID0gdGhpcy5jb25zdW1lKHRoaXMuX3BheWxvYWRMZW5ndGgpO1xyXG5cclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMuX21hc2tlZCAmJlxyXG4gICAgICAgICh0aGlzLl9tYXNrWzBdIHwgdGhpcy5fbWFza1sxXSB8IHRoaXMuX21hc2tbMl0gfCB0aGlzLl9tYXNrWzNdKSAhPT0gMFxyXG4gICAgICApIHtcclxuICAgICAgICB1bm1hc2soZGF0YSwgdGhpcy5fbWFzayk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fb3Bjb2RlID4gMHgwNykge1xyXG4gICAgICB0aGlzLmNvbnRyb2xNZXNzYWdlKGRhdGEsIGNiKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9jb21wcmVzc2VkKSB7XHJcbiAgICAgIHRoaXMuX3N0YXRlID0gSU5GTEFUSU5HO1xyXG4gICAgICB0aGlzLmRlY29tcHJlc3MoZGF0YSwgY2IpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGRhdGEubGVuZ3RoKSB7XHJcbiAgICAgIC8vXHJcbiAgICAgIC8vIFRoaXMgbWVzc2FnZSBpcyBub3QgY29tcHJlc3NlZCBzbyBpdHMgbGVuZ3RoIGlzIHRoZSBzdW0gb2YgdGhlIHBheWxvYWRcclxuICAgICAgLy8gbGVuZ3RoIG9mIGFsbCBmcmFnbWVudHMuXHJcbiAgICAgIC8vXHJcbiAgICAgIHRoaXMuX21lc3NhZ2VMZW5ndGggPSB0aGlzLl90b3RhbFBheWxvYWRMZW5ndGg7XHJcbiAgICAgIHRoaXMuX2ZyYWdtZW50cy5wdXNoKGRhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZGF0YU1lc3NhZ2UoY2IpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVjb21wcmVzc2VzIGRhdGEuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSBDb21wcmVzc2VkIGRhdGFcclxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYiBDYWxsYmFja1xyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgZGVjb21wcmVzcyhkYXRhLCBjYikge1xyXG4gICAgY29uc3QgcGVyTWVzc2FnZURlZmxhdGUgPSB0aGlzLl9leHRlbnNpb25zW1Blck1lc3NhZ2VEZWZsYXRlLmV4dGVuc2lvbk5hbWVdO1xyXG5cclxuICAgIHBlck1lc3NhZ2VEZWZsYXRlLmRlY29tcHJlc3MoZGF0YSwgdGhpcy5fZmluLCAoZXJyLCBidWYpID0+IHtcclxuICAgICAgaWYgKGVycikgcmV0dXJuIGNiKGVycik7XHJcblxyXG4gICAgICBpZiAoYnVmLmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuX21lc3NhZ2VMZW5ndGggKz0gYnVmLmxlbmd0aDtcclxuICAgICAgICBpZiAodGhpcy5fbWVzc2FnZUxlbmd0aCA+IHRoaXMuX21heFBheWxvYWQgJiYgdGhpcy5fbWF4UGF5bG9hZCA+IDApIHtcclxuICAgICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihcclxuICAgICAgICAgICAgUmFuZ2VFcnJvcixcclxuICAgICAgICAgICAgJ01heCBwYXlsb2FkIHNpemUgZXhjZWVkZWQnLFxyXG4gICAgICAgICAgICBmYWxzZSxcclxuICAgICAgICAgICAgMTAwOSxcclxuICAgICAgICAgICAgJ1dTX0VSUl9VTlNVUFBPUlRFRF9NRVNTQUdFX0xFTkdUSCdcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgY2IoZXJyb3IpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZnJhZ21lbnRzLnB1c2goYnVmKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5kYXRhTWVzc2FnZShjYik7XHJcbiAgICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gR0VUX0lORk8pIHRoaXMuc3RhcnRMb29wKGNiKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlcyBhIGRhdGEgbWVzc2FnZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNiIENhbGxiYWNrXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBkYXRhTWVzc2FnZShjYikge1xyXG4gICAgaWYgKCF0aGlzLl9maW4pIHtcclxuICAgICAgdGhpcy5fc3RhdGUgPSBHRVRfSU5GTztcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG1lc3NhZ2VMZW5ndGggPSB0aGlzLl9tZXNzYWdlTGVuZ3RoO1xyXG4gICAgY29uc3QgZnJhZ21lbnRzID0gdGhpcy5fZnJhZ21lbnRzO1xyXG5cclxuICAgIHRoaXMuX3RvdGFsUGF5bG9hZExlbmd0aCA9IDA7XHJcbiAgICB0aGlzLl9tZXNzYWdlTGVuZ3RoID0gMDtcclxuICAgIHRoaXMuX2ZyYWdtZW50ZWQgPSAwO1xyXG4gICAgdGhpcy5fZnJhZ21lbnRzID0gW107XHJcblxyXG4gICAgaWYgKHRoaXMuX29wY29kZSA9PT0gMikge1xyXG4gICAgICBsZXQgZGF0YTtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9iaW5hcnlUeXBlID09PSAnbm9kZWJ1ZmZlcicpIHtcclxuICAgICAgICBkYXRhID0gY29uY2F0KGZyYWdtZW50cywgbWVzc2FnZUxlbmd0aCk7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fYmluYXJ5VHlwZSA9PT0gJ2FycmF5YnVmZmVyJykge1xyXG4gICAgICAgIGRhdGEgPSB0b0FycmF5QnVmZmVyKGNvbmNhdChmcmFnbWVudHMsIG1lc3NhZ2VMZW5ndGgpKTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLl9iaW5hcnlUeXBlID09PSAnYmxvYicpIHtcclxuICAgICAgICBkYXRhID0gbmV3IEJsb2IoZnJhZ21lbnRzKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBkYXRhID0gZnJhZ21lbnRzO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5fYWxsb3dTeW5jaHJvbm91c0V2ZW50cykge1xyXG4gICAgICAgIHRoaXMuZW1pdCgnbWVzc2FnZScsIGRhdGEsIHRydWUpO1xyXG4gICAgICAgIHRoaXMuX3N0YXRlID0gR0VUX0lORk87XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fc3RhdGUgPSBERUZFUl9FVkVOVDtcclxuICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5lbWl0KCdtZXNzYWdlJywgZGF0YSwgdHJ1ZSk7XHJcbiAgICAgICAgICB0aGlzLl9zdGF0ZSA9IEdFVF9JTkZPO1xyXG4gICAgICAgICAgdGhpcy5zdGFydExvb3AoY2IpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBidWYgPSBjb25jYXQoZnJhZ21lbnRzLCBtZXNzYWdlTGVuZ3RoKTtcclxuXHJcbiAgICAgIGlmICghdGhpcy5fc2tpcFVURjhWYWxpZGF0aW9uICYmICFpc1ZhbGlkVVRGOChidWYpKSB7XHJcbiAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLmNyZWF0ZUVycm9yKFxyXG4gICAgICAgICAgRXJyb3IsXHJcbiAgICAgICAgICAnaW52YWxpZCBVVEYtOCBzZXF1ZW5jZScsXHJcbiAgICAgICAgICB0cnVlLFxyXG4gICAgICAgICAgMTAwNyxcclxuICAgICAgICAgICdXU19FUlJfSU5WQUxJRF9VVEY4J1xyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGNiKGVycm9yKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gSU5GTEFUSU5HIHx8IHRoaXMuX2FsbG93U3luY2hyb25vdXNFdmVudHMpIHtcclxuICAgICAgICB0aGlzLmVtaXQoJ21lc3NhZ2UnLCBidWYsIGZhbHNlKTtcclxuICAgICAgICB0aGlzLl9zdGF0ZSA9IEdFVF9JTkZPO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX3N0YXRlID0gREVGRVJfRVZFTlQ7XHJcbiAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuZW1pdCgnbWVzc2FnZScsIGJ1ZiwgZmFsc2UpO1xyXG4gICAgICAgICAgdGhpcy5fc3RhdGUgPSBHRVRfSU5GTztcclxuICAgICAgICAgIHRoaXMuc3RhcnRMb29wKGNiKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlcyBhIGNvbnRyb2wgbWVzc2FnZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBkYXRhIERhdGEgdG8gaGFuZGxlXHJcbiAgICogQHJldHVybiB7KEVycm9yfFJhbmdlRXJyb3J8dW5kZWZpbmVkKX0gQSBwb3NzaWJsZSBlcnJvclxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgY29udHJvbE1lc3NhZ2UoZGF0YSwgY2IpIHtcclxuICAgIGlmICh0aGlzLl9vcGNvZGUgPT09IDB4MDgpIHtcclxuICAgICAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgdGhpcy5fbG9vcCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZW1pdCgnY29uY2x1ZGUnLCAxMDA1LCBFTVBUWV9CVUZGRVIpO1xyXG4gICAgICAgIHRoaXMuZW5kKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgY29kZSA9IGRhdGEucmVhZFVJbnQxNkJFKDApO1xyXG5cclxuICAgICAgICBpZiAoIWlzVmFsaWRTdGF0dXNDb2RlKGNvZGUpKSB7XHJcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuY3JlYXRlRXJyb3IoXHJcbiAgICAgICAgICAgIFJhbmdlRXJyb3IsXHJcbiAgICAgICAgICAgIGBpbnZhbGlkIHN0YXR1cyBjb2RlICR7Y29kZX1gLFxyXG4gICAgICAgICAgICB0cnVlLFxyXG4gICAgICAgICAgICAxMDAyLFxyXG4gICAgICAgICAgICAnV1NfRVJSX0lOVkFMSURfQ0xPU0VfQ09ERSdcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgY2IoZXJyb3IpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgYnVmID0gbmV3IEZhc3RCdWZmZXIoXHJcbiAgICAgICAgICBkYXRhLmJ1ZmZlcixcclxuICAgICAgICAgIGRhdGEuYnl0ZU9mZnNldCArIDIsXHJcbiAgICAgICAgICBkYXRhLmxlbmd0aCAtIDJcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX3NraXBVVEY4VmFsaWRhdGlvbiAmJiAhaXNWYWxpZFVURjgoYnVmKSkge1xyXG4gICAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLmNyZWF0ZUVycm9yKFxyXG4gICAgICAgICAgICBFcnJvcixcclxuICAgICAgICAgICAgJ2ludmFsaWQgVVRGLTggc2VxdWVuY2UnLFxyXG4gICAgICAgICAgICB0cnVlLFxyXG4gICAgICAgICAgICAxMDA3LFxyXG4gICAgICAgICAgICAnV1NfRVJSX0lOVkFMSURfVVRGOCdcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgY2IoZXJyb3IpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fbG9vcCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZW1pdCgnY29uY2x1ZGUnLCBjb2RlLCBidWYpO1xyXG4gICAgICAgIHRoaXMuZW5kKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuX3N0YXRlID0gR0VUX0lORk87XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fYWxsb3dTeW5jaHJvbm91c0V2ZW50cykge1xyXG4gICAgICB0aGlzLmVtaXQodGhpcy5fb3Bjb2RlID09PSAweDA5ID8gJ3BpbmcnIDogJ3BvbmcnLCBkYXRhKTtcclxuICAgICAgdGhpcy5fc3RhdGUgPSBHRVRfSU5GTztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX3N0YXRlID0gREVGRVJfRVZFTlQ7XHJcbiAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5lbWl0KHRoaXMuX29wY29kZSA9PT0gMHgwOSA/ICdwaW5nJyA6ICdwb25nJywgZGF0YSk7XHJcbiAgICAgICAgdGhpcy5fc3RhdGUgPSBHRVRfSU5GTztcclxuICAgICAgICB0aGlzLnN0YXJ0TG9vcChjYik7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQnVpbGRzIGFuIGVycm9yIG9iamVjdC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24obmV3OkVycm9yfFJhbmdlRXJyb3IpfSBFcnJvckN0b3IgVGhlIGVycm9yIGNvbnN0cnVjdG9yXHJcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgVGhlIGVycm9yIG1lc3NhZ2VcclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHByZWZpeCBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gYWRkIGEgZGVmYXVsdCBwcmVmaXggdG9cclxuICAgKiAgICAgYG1lc3NhZ2VgXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHN0YXR1c0NvZGUgVGhlIHN0YXR1cyBjb2RlXHJcbiAgICogQHBhcmFtIHtTdHJpbmd9IGVycm9yQ29kZSBUaGUgZXhwb3NlZCBlcnJvciBjb2RlXHJcbiAgICogQHJldHVybiB7KEVycm9yfFJhbmdlRXJyb3IpfSBUaGUgZXJyb3JcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIGNyZWF0ZUVycm9yKEVycm9yQ3RvciwgbWVzc2FnZSwgcHJlZml4LCBzdGF0dXNDb2RlLCBlcnJvckNvZGUpIHtcclxuICAgIHRoaXMuX2xvb3AgPSBmYWxzZTtcclxuICAgIHRoaXMuX2Vycm9yZWQgPSB0cnVlO1xyXG5cclxuICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvckN0b3IoXHJcbiAgICAgIHByZWZpeCA/IGBJbnZhbGlkIFdlYlNvY2tldCBmcmFtZTogJHttZXNzYWdlfWAgOiBtZXNzYWdlXHJcbiAgICApO1xyXG5cclxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKGVyciwgdGhpcy5jcmVhdGVFcnJvcik7XHJcbiAgICBlcnIuY29kZSA9IGVycm9yQ29kZTtcclxuICAgIGVycltrU3RhdHVzQ29kZV0gPSBzdGF0dXNDb2RlO1xyXG4gICAgcmV0dXJuIGVycjtcclxuICB9XHJcbn1cclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUmVjZWl2ZXI7XHJcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/ws/lib/receiver.js\n");
/***/ }),
/***/ "(ssr)/./node_modules/ws/lib/sender.js":
/*!***************************************!*\
!*** ./node_modules/ws/lib/sender.js ***!
\***************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
eval("/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex\" }] */\r\n\r\n\r\n\r\nconst { Duplex } = __webpack_require__(/*! stream */ \"stream\");\r\nconst { randomFillSync } = __webpack_require__(/*! crypto */ \"crypto\");\r\n\r\nconst PerMessageDeflate = __webpack_require__(/*! ./permessage-deflate */ \"(ssr)/./node_modules/ws/lib/permessage-deflate.js\");\r\nconst { EMPTY_BUFFER, kWebSocket, NOOP } = __webpack_require__(/*! ./constants */ \"(ssr)/./node_modules/ws/lib/constants.js\");\r\nconst { isBlob, isValidStatusCode } = __webpack_require__(/*! ./validation */ \"(ssr)/./node_modules/ws/lib/validation.js\");\r\nconst { mask: applyMask, toBuffer } = __webpack_require__(/*! ./buffer-util */ \"(ssr)/./node_modules/ws/lib/buffer-util.js\");\r\n\r\nconst kByteLength = Symbol('kByteLength');\r\nconst maskBuffer = Buffer.alloc(4);\r\nconst RANDOM_POOL_SIZE = 8 * 1024;\r\nlet randomPool;\r\nlet randomPoolPointer = RANDOM_POOL_SIZE;\r\n\r\nconst DEFAULT = 0;\r\nconst DEFLATING = 1;\r\nconst GET_BLOB_DATA = 2;\r\n\r\n/**\r\n * HyBi Sender implementation.\r\n */\r\nclass Sender {\r\n /**\r\n * Creates a Sender instance.\r\n *\r\n * @param {Duplex} socket The connection socket\r\n * @param {Object} [extensions] An object containing the negotiated extensions\r\n * @param {Function} [generateMask] The function used to generate the masking\r\n * key\r\n */\r\n constructor(socket, extensions, generateMask) {\r\n this._extensions = extensions || {};\r\n\r\n if (generateMask) {\r\n this._generateMask = generateMask;\r\n this._maskBuffer = Buffer.alloc(4);\r\n }\r\n\r\n this._socket = socket;\r\n\r\n this._firstFragment = true;\r\n this._compress = false;\r\n\r\n this._bufferedBytes = 0;\r\n this._queue = [];\r\n this._state = DEFAULT;\r\n this.onerror = NOOP;\r\n this[kWebSocket] = undefined;\r\n }\r\n\r\n /**\r\n * Frames a piece of data according to the HyBi WebSocket protocol.\r\n *\r\n * @param {(Buffer|String)} data The data to frame\r\n * @param {Object} options Options object\r\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\r\n * FIN bit\r\n * @param {Function} [options.generateMask] The function used to generate the\r\n * masking key\r\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\r\n * `data`\r\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\r\n * key\r\n * @param {Number} options.opcode The opcode\r\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\r\n * modified\r\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\r\n * RSV1 bit\r\n * @return {(Buffer|String)[]} The framed data\r\n * @public\r\n */\r\n static frame(data, options) {\r\n let mask;\r\n let merge = false;\r\n let offset = 2;\r\n let skipMasking = false;\r\n\r\n if (options.mask) {\r\n mask = options.maskBuffer || maskBuffer;\r\n\r\n if (options.generateMask) {\r\n options.generateMask(mask);\r\n } else {\r\n if (randomPoolPointer === RANDOM_POOL_SIZE) {\r\n /* istanbul ignore else */\r\n if (randomPool === undefined) {\r\n //\r\n // This is lazily initialized because server-sent frames must not\r\n // be masked so it may never be used.\r\n //\r\n randomPool = Buffer.alloc(RANDOM_POOL_SIZE);\r\n }\r\n\r\n randomFillSync(randomPool, 0, RANDOM_POOL_SIZE);\r\n randomPoolPointer = 0;\r\n }\r\n\r\n mask[0] = randomPool[randomPoolPointer++];\r\n mask[1] = randomPool[randomPoolPointer++];\r\n mask[2] = randomPool[randomPoolPointer++];\r\n mask[3] = randomPool[randomPoolPointer++];\r\n }\r\n\r\n skipMasking = (mask[0] | mask[1] | mask[2] | mask[3]) === 0;\r\n offset = 6;\r\n }\r\n\r\n let dataLength;\r\n\r\n if (typeof data === 'string') {\r\n if (\r\n (!options.mask || skipMasking) &&\r\n options[kByteLength] !== undefined\r\n ) {\r\n dataLength = options[kByteLength];\r\n } else {\r\n data = Buffer.from(data);\r\n dataLength = data.length;\r\n }\r\n } else {\r\n dataLength = data.length;\r\n merge = options.mask && options.readOnly && !skipMasking;\r\n }\r\n\r\n let payloadLength = dataLength;\r\n\r\n if (dataLength >= 65536) {\r\n offset += 8;\r\n payloadLength = 127;\r\n } else if (dataLength > 125) {\r\n offset += 2;\r\n payloadLength = 126;\r\n }\r\n\r\n const target = Buffer.allocUnsafe(merge ? dataLength + offset : offset);\r\n\r\n target[0] = options.fin ? options.opcode | 0x80 : options.opcode;\r\n if (options.rsv1) target[0] |= 0x40;\r\n\r\n target[1] = payloadLength;\r\n\r\n if (payloadLength === 126) {\r\n target.writeUInt16BE(dataLength, 2);\r\n } else if (payloadLength === 127) {\r\n target[2] = target[3] = 0;\r\n target.writeUIntBE(dataLength, 4, 6);\r\n }\r\n\r\n if (!options.mask) return [target, data];\r\n\r\n target[1] |= 0x80;\r\n target[offset - 4] = mask[0];\r\n target[offset - 3] = mask[1];\r\n target[offset - 2] = mask[2];\r\n target[offset - 1] = mask[3];\r\n\r\n if (skipMasking) return [target, data];\r\n\r\n if (merge) {\r\n applyMask(data, mask, target, offset, dataLength);\r\n return [target];\r\n }\r\n\r\n applyMask(data, mask, data, 0, dataLength);\r\n return [target, data];\r\n }\r\n\r\n /**\r\n * Sends a close message to the other peer.\r\n *\r\n * @param {Number} [code] The status code component of the body\r\n * @param {(String|Buffer)} [data] The message component of the body\r\n * @param {Boolean} [mask=false] Specifies whether or not to mask the message\r\n * @param {Function} [cb] Callback\r\n * @public\r\n */\r\n close(code, data, mask, cb) {\r\n let buf;\r\n\r\n if (code === undefined) {\r\n buf = EMPTY_BUFFER;\r\n } else if (typeof code !== 'number' || !isValidStatusCode(code)) {\r\n throw new TypeError('First argument must be a valid error code number');\r\n } else if (data === undefined || !data.length) {\r\n buf = Buffer.allocUnsafe(2);\r\n buf.writeUInt16BE(code, 0);\r\n } else {\r\n const length = Buffer.byteLength(data);\r\n\r\n if (length > 123) {\r\n throw new RangeError('The message must not be greater than 123 bytes');\r\n }\r\n\r\n buf = Buffer.allocUnsafe(2 + length);\r\n buf.writeUInt16BE(code, 0);\r\n\r\n if (typeof data === 'string') {\r\n buf.write(data, 2);\r\n } else {\r\n buf.set(data, 2);\r\n }\r\n }\r\n\r\n const options = {\r\n [kByteLength]: buf.length,\r\n fin: true,\r\n generateMask: this._generateMask,\r\n mask,\r\n maskBuffer: this._maskBuffer,\r\n opcode: 0x08,\r\n readOnly: false,\r\n rsv1: false\r\n };\r\n\r\n if (this._state !== DEFAULT) {\r\n this.enqueue([this.dispatch, buf, false, options, cb]);\r\n } else {\r\n this.sendFrame(Sender.frame(buf, options), cb);\r\n }\r\n }\r\n\r\n /**\r\n * Sends a ping message to the other peer.\r\n *\r\n * @param {*} data The message to send\r\n * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\r\n * @param {Function} [cb] Callback\r\n * @public\r\n */\r\n ping(data, mask, cb) {\r\n let byteLength;\r\n let readOnly;\r\n\r\n if (typeof data === 'string') {\r\n byteLength = Buffer.byteLength(data);\r\n readOnly = false;\r\n } else if (isBlob(data)) {\r\n byteLength = data.size;\r\n readOnly = false;\r\n } else {\r\n data = toBuffer(data);\r\n byteLength = data.length;\r\n readOnly = toBuffer.readOnly;\r\n }\r\n\r\n if (byteLength > 125) {\r\n throw new RangeError('The data size must not be greater than 125 bytes');\r\n }\r\n\r\n const options = {\r\n [kByteLength]: byteLength,\r\n fin: true,\r\n generateMask: this._generateMask,\r\n mask,\r\n maskBuffer: this._maskBuffer,\r\n opcode: 0x09,\r\n readOnly,\r\n rsv1: false\r\n };\r\n\r\n if (isBlob(data)) {\r\n if (this._state !== DEFAULT) {\r\n this.enqueue([this.getBlobData, data, false, options, cb]);\r\n } else {\r\n this.getBlobData(data, false, options, cb);\r\n }\r\n } else if (this._state !== DEFAULT) {\r\n this.enqueue([this.dispatch, data, false, options, cb]);\r\n } else {\r\n this.sendFrame(Sender.frame(data, options), cb);\r\n }\r\n }\r\n\r\n /**\r\n * Sends a pong message to the other peer.\r\n *\r\n * @param {*} data The message to send\r\n * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\r\n * @param {Function} [cb] Callback\r\n * @public\r\n */\r\n pong(data, mask, cb) {\r\n let byteLength;\r\n let readOnly;\r\n\r\n if (typeof data === 'string') {\r\n byteLength = Buffer.byteLength(data);\r\n readOnly = false;\r\n } else if (isBlob(data)) {\r\n byteLength = data.size;\r\n readOnly = false;\r\n } else {\r\n data = toBuffer(data);\r\n byteLength = data.length;\r\n readOnly = toBuffer.readOnly;\r\n }\r\n\r\n if (byteLength > 125) {\r\n throw new RangeError('The data size must not be greater than 125 bytes');\r\n }\r\n\r\n const options = {\r\n [kByteLength]: byteLength,\r\n fin: true,\r\n generateMask: this._generateMask,\r\n mask,\r\n maskBuffer: this._maskBuffer,\r\n opcode: 0x0a,\r\n readOnly,\r\n rsv1: false\r\n };\r\n\r\n if (isBlob(data)) {\r\n if (this._state !== DEFAULT) {\r\n this.enqueue([this.getBlobData, data, false, options, cb]);\r\n } else {\r\n this.getBlobData(data, false, options, cb);\r\n }\r\n } else if (this._state !== DEFAULT) {\r\n this.enqueue([this.dispatch, data, false, options, cb]);\r\n } else {\r\n this.sendFrame(Sender.frame(data, options), cb);\r\n }\r\n }\r\n\r\n /**\r\n * Sends a data message to the other peer.\r\n *\r\n * @param {*} data The message to send\r\n * @param {Object} options Options object\r\n * @param {Boolean} [options.binary=false] Specifies whether `data` is binary\r\n * or text\r\n * @param {Boolean} [options.compress=false] Specifies whether or not to\r\n * compress `data`\r\n * @param {Boolean} [options.fin=false] Specifies whether the fragment is the\r\n * last one\r\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\r\n * `data`\r\n * @param {Function} [cb] Callback\r\n * @public\r\n */\r\n send(data, options, cb) {\r\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\r\n let opcode = options.binary ? 2 : 1;\r\n let rsv1 = options.compress;\r\n\r\n let byteLength;\r\n let readOnly;\r\n\r\n if (typeof data === 'string') {\r\n byteLength = Buffer.byteLength(data);\r\n readOnly = false;\r\n } else if (isBlob(data)) {\r\n byteLength = data.size;\r\n readOnly = false;\r\n } else {\r\n data = toBuffer(data);\r\n byteLength = data.length;\r\n readOnly = toBuffer.readOnly;\r\n }\r\n\r\n if (this._firstFragment) {\r\n this._firstFragment = false;\r\n if (\r\n rsv1 &&\r\n perMessageDeflate &&\r\n perMessageDeflate.params[\r\n perMessageDeflate._isServer\r\n ? 'server_no_context_takeover'\r\n : 'client_no_context_takeover'\r\n ]\r\n ) {\r\n rsv1 = byteLength >= perMessageDeflate._threshold;\r\n }\r\n this._compress = rsv1;\r\n } else {\r\n rsv1 = false;\r\n opcode = 0;\r\n }\r\n\r\n if (options.fin) this._firstFragment = true;\r\n\r\n const opts = {\r\n [kByteLength]: byteLength,\r\n fin: options.fin,\r\n generateMask: this._generateMask,\r\n mask: options.mask,\r\n maskBuffer: this._maskBuffer,\r\n opcode,\r\n readOnly,\r\n rsv1\r\n };\r\n\r\n if (isBlob(data)) {\r\n if (this._state !== DEFAULT) {\r\n this.enqueue([this.getBlobData, data, this._compress, opts, cb]);\r\n } else {\r\n this.getBlobData(data, this._compress, opts, cb);\r\n }\r\n } else if (this._state !== DEFAULT) {\r\n this.enqueue([this.dispatch, data, this._compress, opts, cb]);\r\n } else {\r\n this.dispatch(data, this._compress, opts, cb);\r\n }\r\n }\r\n\r\n /**\r\n * Gets the contents of a blob as binary data.\r\n *\r\n * @param {Blob} blob The blob\r\n * @param {Boolean} [compress=false] Specifies whether or not to compress\r\n * the data\r\n * @param {Object} options Options object\r\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\r\n * FIN bit\r\n * @param {Function} [options.generateMask] The function used to generate the\r\n * masking key\r\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\r\n * `data`\r\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\r\n * key\r\n * @param {Number} options.opcode The opcode\r\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\r\n * modified\r\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\r\n * RSV1 bit\r\n * @param {Function} [cb] Callback\r\n * @private\r\n */\r\n getBlobData(blob, compress, options, cb) {\r\n this._bufferedBytes += options[kByteLength];\r\n this._state = GET_BLOB_DATA;\r\n\r\n blob\r\n .arrayBuffer()\r\n .then((arrayBuffer) => {\r\n if (this._socket.destroyed) {\r\n const err = new Error(\r\n 'The socket was closed while the blob was being read'\r\n );\r\n\r\n //\r\n // `callCallbacks` is called in the next tick to ensure that errors\r\n // that might be thrown in the callbacks behave like errors thrown\r\n // outside the promise chain.\r\n //\r\n process.nextTick(callCallbacks, this, err, cb);\r\n return;\r\n }\r\n\r\n this._bufferedBytes -= options[kByteLength];\r\n const data = toBuffer(arrayBuffer);\r\n\r\n if (!compress) {\r\n this._state = DEFAULT;\r\n this.sendFrame(Sender.frame(data, options), cb);\r\n this.dequeue();\r\n } else {\r\n this.dispatch(data, compress, options, cb);\r\n }\r\n })\r\n .catch((err) => {\r\n //\r\n // `onError` is called in the next tick for the same reason that\r\n // `callCallbacks` above is.\r\n //\r\n process.nextTick(onError, this, err, cb);\r\n });\r\n }\r\n\r\n /**\r\n * Dispatches a message.\r\n *\r\n * @param {(Buffer|String)} data The message to send\r\n * @param {Boolean} [compress=false] Specifies whether or not to compress\r\n * `data`\r\n * @param {Object} options Options object\r\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\r\n * FIN bit\r\n * @param {Function} [options.generateMask] The function used to generate the\r\n * masking key\r\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\r\n * `data`\r\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\r\n * key\r\n * @param {Number} options.opcode The opcode\r\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\r\n * modified\r\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\r\n * RSV1 bit\r\n * @param {Function} [cb] Callback\r\n * @private\r\n */\r\n dispatch(data, compress, options, cb) {\r\n if (!compress) {\r\n this.sendFrame(Sender.frame(data, options), cb);\r\n return;\r\n }\r\n\r\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\r\n\r\n this._bufferedBytes += options[kByteLength];\r\n this._state = DEFLATING;\r\n perMessageDeflate.compress(data, options.fin, (_, buf) => {\r\n if (this._socket.destroyed) {\r\n const err = new Error(\r\n 'The socket was closed while data was being compressed'\r\n );\r\n\r\n callCallbacks(this, err, cb);\r\n return;\r\n }\r\n\r\n this._bufferedBytes -= options[kByteLength];\r\n this._state = DEFAULT;\r\n options.readOnly = false;\r\n this.sendFrame(Sender.frame(buf, options), cb);\r\n this.dequeue();\r\n });\r\n }\r\n\r\n /**\r\n * Executes queued send operations.\r\n *\r\n * @private\r\n */\r\n dequeue() {\r\n while (this._state === DEFAULT && this._queue.length) {\r\n const params = this._queue.shift();\r\n\r\n this._bufferedBytes -= params[3][kByteLength];\r\n Reflect.apply(params[0], this, params.slice(1));\r\n }\r\n }\r\n\r\n /**\r\n * Enqueues a send operation.\r\n *\r\n * @param {Array} params Send operation parameters.\r\n * @private\r\n */\r\n enqueue(params) {\r\n this._bufferedBytes += params[3][kByteLength];\r\n this._queue.push(params);\r\n }\r\n\r\n /**\r\n * Sends a frame.\r\n *\r\n * @param {(Buffer | String)[]} list The frame to send\r\n * @param {Function} [cb] Callback\r\n * @private\r\n */\r\n sendFrame(list, cb) {\r\n if (list.length === 2) {\r\n this._socket.cork();\r\n this._socket.write(list[0]);\r\n this._socket.write(list[1], cb);\r\n this._socket.uncork();\r\n } else {\r\n this._socket.write(list[0], cb);\r\n }\r\n }\r\n}\r\n\r\nmodule.exports = Sender;\r\n\r\n/**\r\n * Calls queued callbacks with an error.\r\n *\r\n * @param {Sender} sender The `Sender` instance\r\n * @param {Error} err The error to call the callbacks with\r\n * @param {Function} [cb] The first callback\r\n * @private\r\n */\r\nfunction callCallbacks(sender, err, cb) {\r\n if (typeof cb === 'function') cb(err);\r\n\r\n for (let i = 0; i < sender._queue.length; i++) {\r\n const params = sender._queue[i];\r\n const callback = params[params.length - 1];\r\n\r\n if (typeof callback === 'function') callback(err);\r\n }\r\n}\r\n\r\n/**\r\n * Handles a `Sender` error.\r\n *\r\n * @param {Sender} sender The `Sender` instance\r\n * @param {Error} err The error\r\n * @param {Function} [cb] The first pending callback\r\n * @private\r\n */\r\nfunction onError(sender, err, cb) {\r\n callCallbacks(sender, err, cb);\r\n sender.onerror(err);\r\n}\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvd3MvbGliL3NlbmRlci5qcyIsIm1hcHBpbmdzIjoiQUFBQSxzQ0FBc0MsZ0NBQWdDO0FBQ3RFO0FBQ2E7QUFDYjtBQUNBLFFBQVEsU0FBUyxFQUFFLG1CQUFPLENBQUMsc0JBQVE7QUFDbkMsUUFBUSxpQkFBaUIsRUFBRSxtQkFBTyxDQUFDLHNCQUFRO0FBQzNDO0FBQ0EsMEJBQTBCLG1CQUFPLENBQUMsK0VBQXNCO0FBQ3hELFFBQVEsaUNBQWlDLEVBQUUsbUJBQU8sQ0FBQyw2REFBYTtBQUNoRSxRQUFRLDRCQUE0QixFQUFFLG1CQUFPLENBQUMsK0RBQWM7QUFDNUQsUUFBUSw0QkFBNEIsRUFBRSxtQkFBTyxDQUFDLGlFQUFlO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxpQkFBaUI7QUFDOUIsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsU0FBUztBQUN0QjtBQUNBLGFBQWEsVUFBVTtBQUN2QjtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFNBQVM7QUFDdEI7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQSxjQUFjLG1CQUFtQjtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLGlCQUFpQjtBQUM5QixhQUFhLFNBQVM7QUFDdEIsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxHQUFHO0FBQ2hCLGFBQWEsU0FBUztBQUN0QixhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxHQUFHO0FBQ2hCLGFBQWEsU0FBUztBQUN0QixhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxHQUFHO0FBQ2hCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFNBQVM7QUFDdEI7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQSxhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE1BQU07QUFDbkIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsU0FBUztBQUN0QjtBQUNBLGFBQWEsVUFBVTtBQUN2QjtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFNBQVM7QUFDdEI7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQSxhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGlCQUFpQjtBQUM5QixhQUFhLFNBQVM7QUFDdEI7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsU0FBUztBQUN0QjtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLHFCQUFxQjtBQUNsQyxhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLE9BQU87QUFDbEIsV0FBVyxVQUFVO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsMEJBQTBCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsT0FBTztBQUNsQixXQUFXLFVBQVU7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vbmV4dGpzLy4vbm9kZV9tb2R1bGVzL3dzL2xpYi9zZW5kZXIuanM/MDkzYSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQgbm8tdW51c2VkLXZhcnM6IFtcImVycm9yXCIsIHsgXCJ2YXJzSWdub3JlUGF0dGVyblwiOiBcIl5EdXBsZXhcIiB9XSAqL1xyXG5cclxuJ3VzZSBzdHJpY3QnO1xyXG5cclxuY29uc3QgeyBEdXBsZXggfSA9IHJlcXVpcmUoJ3N0cmVhbScpO1xyXG5jb25zdCB7IHJhbmRvbUZpbGxTeW5jIH0gPSByZXF1aXJlKCdjcnlwdG8nKTtcclxuXHJcbmNvbnN0IFBlck1lc3NhZ2VEZWZsYXRlID0gcmVxdWlyZSgnLi9wZXJtZXNzYWdlLWRlZmxhdGUnKTtcclxuY29uc3QgeyBFTVBUWV9CVUZGRVIsIGtXZWJTb2NrZXQsIE5PT1AgfSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJyk7XHJcbmNvbnN0IHsgaXNCbG9iLCBpc1ZhbGlkU3RhdHVzQ29kZSB9ID0gcmVxdWlyZSgnLi92YWxpZGF0aW9uJyk7XHJcbmNvbnN0IHsgbWFzazogYXBwbHlNYXNrLCB0b0J1ZmZlciB9ID0gcmVxdWlyZSgnLi9idWZmZXItdXRpbCcpO1xyXG5cclxuY29uc3Qga0J5dGVMZW5ndGggPSBTeW1ib2woJ2tCeXRlTGVuZ3RoJyk7XHJcbmNvbnN0IG1hc2tCdWZmZXIgPSBCdWZmZXIuYWxsb2MoNCk7XHJcbmNvbnN0IFJBTkRPTV9QT09MX1NJWkUgPSA4ICogMTAyNDtcclxubGV0IHJhbmRvbVBvb2w7XHJcbmxldCByYW5kb21Qb29sUG9pbnRlciA9IFJBTkRPTV9QT09MX1NJWkU7XHJcblxyXG5jb25zdCBERUZBVUxUID0gMDtcclxuY29uc3QgREVGTEFUSU5HID0gMTtcclxuY29uc3QgR0VUX0JMT0JfREFUQSA9IDI7XHJcblxyXG4vKipcclxuICogSHlCaSBTZW5kZXIgaW1wbGVtZW50YXRpb24uXHJcbiAqL1xyXG5jbGFzcyBTZW5kZXIge1xyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYSBTZW5kZXIgaW5zdGFuY2UuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0R1cGxleH0gc29ja2V0IFRoZSBjb25uZWN0aW9uIHNvY2tldFxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbZXh0ZW5zaW9uc10gQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIG5lZ290aWF0ZWQgZXh0ZW5zaW9uc1xyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtnZW5lcmF0ZU1hc2tdIFRoZSBmdW5jdGlvbiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBtYXNraW5nXHJcbiAgICogICAgIGtleVxyXG4gICAqL1xyXG4gIGNvbnN0cnVjdG9yKHNvY2tldCwgZXh0ZW5zaW9ucywgZ2VuZXJhdGVNYXNrKSB7XHJcbiAgICB0aGlzLl9leHRlbnNpb25zID0gZXh0ZW5zaW9ucyB8fCB7fTtcclxuXHJcbiAgICBpZiAoZ2VuZXJhdGVNYXNrKSB7XHJcbiAgICAgIHRoaXMuX2dlbmVyYXRlTWFzayA9IGdlbmVyYXRlTWFzaztcclxuICAgICAgdGhpcy5fbWFza0J1ZmZlciA9IEJ1ZmZlci5hbGxvYyg0KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9zb2NrZXQgPSBzb2NrZXQ7XHJcblxyXG4gICAgdGhpcy5fZmlyc3RGcmFnbWVudCA9IHRydWU7XHJcbiAgICB0aGlzLl9jb21wcmVzcyA9IGZhbHNlO1xyXG5cclxuICAgIHRoaXMuX2J1ZmZlcmVkQnl0ZXMgPSAwO1xyXG4gICAgdGhpcy5fcXVldWUgPSBbXTtcclxuICAgIHRoaXMuX3N0YXRlID0gREVGQVVMVDtcclxuICAgIHRoaXMub25lcnJvciA9IE5PT1A7XHJcbiAgICB0aGlzW2tXZWJTb2NrZXRdID0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRnJhbWVzIGEgcGllY2Ugb2YgZGF0YSBhY2NvcmRpbmcgdG8gdGhlIEh5QmkgV2ViU29ja2V0IHByb3RvY29sLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHsoQnVmZmVyfFN0cmluZyl9IGRhdGEgVGhlIGRhdGEgdG8gZnJhbWVcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBPcHRpb25zIG9iamVjdFxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZmluPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gc2V0IHRoZVxyXG4gICAqICAgICBGSU4gYml0XHJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuZ2VuZXJhdGVNYXNrXSBUaGUgZnVuY3Rpb24gdXNlZCB0byBnZW5lcmF0ZSB0aGVcclxuICAgKiAgICAgbWFza2luZyBrZXlcclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLm1hc2s9ZmFsc2VdIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0byBtYXNrXHJcbiAgICogICAgIGBkYXRhYFxyXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBbb3B0aW9ucy5tYXNrQnVmZmVyXSBUaGUgYnVmZmVyIHVzZWQgdG8gc3RvcmUgdGhlIG1hc2tpbmdcclxuICAgKiAgICAga2V5XHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMub3Bjb2RlIFRoZSBvcGNvZGVcclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnJlYWRPbmx5PWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBgZGF0YWAgY2FuIGJlXHJcbiAgICogICAgIG1vZGlmaWVkXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5yc3YxPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gc2V0IHRoZVxyXG4gICAqICAgICBSU1YxIGJpdFxyXG4gICAqIEByZXR1cm4geyhCdWZmZXJ8U3RyaW5nKVtdfSBUaGUgZnJhbWVkIGRhdGFcclxuICAgKiBAcHVibGljXHJcbiAgICovXHJcbiAgc3RhdGljIGZyYW1lKGRhdGEsIG9wdGlvbnMpIHtcclxuICAgIGxldCBtYXNrO1xyXG4gICAgbGV0IG1lcmdlID0gZmFsc2U7XHJcbiAgICBsZXQgb2Zmc2V0ID0gMjtcclxuICAgIGxldCBza2lwTWFza2luZyA9IGZhbHNlO1xyXG5cclxuICAgIGlmIChvcHRpb25zLm1hc2spIHtcclxuICAgICAgbWFzayA9IG9wdGlvbnMubWFza0J1ZmZlciB8fCBtYXNrQnVmZmVyO1xyXG5cclxuICAgICAgaWYgKG9wdGlvbnMuZ2VuZXJhdGVNYXNrKSB7XHJcbiAgICAgICAgb3B0aW9ucy5nZW5lcmF0ZU1hc2sobWFzayk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKHJhbmRvbVBvb2xQb2ludGVyID09PSBSQU5ET01fUE9PTF9TSVpFKSB7XHJcbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAgKi9cclxuICAgICAgICAgIGlmIChyYW5kb21Qb29sID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgLy8gVGhpcyBpcyBsYXppbHkgaW5pdGlhbGl6ZWQgYmVjYXVzZSBzZXJ2ZXItc2VudCBmcmFtZXMgbXVzdCBub3RcclxuICAgICAgICAgICAgLy8gYmUgbWFza2VkIHNvIGl0IG1heSBuZXZlciBiZSB1c2VkLlxyXG4gICAgICAgICAgICAvL1xyXG4gICAgICAgICAgICByYW5kb21Qb29sID0gQnVmZmVyLmFsbG9jKFJBTkRPTV9QT09MX1NJWkUpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHJhbmRvbUZpbGxTeW5jKHJhbmRvbVBvb2wsIDAsIFJBTkRPTV9QT09MX1NJWkUpO1xyXG4gICAgICAgICAgcmFuZG9tUG9vbFBvaW50ZXIgPSAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbWFza1swXSA9IHJhbmRvbVBvb2xbcmFuZG9tUG9vbFBvaW50ZXIrK107XHJcbiAgICAgICAgbWFza1sxXSA9IHJhbmRvbVBvb2xbcmFuZG9tUG9vbFBvaW50ZXIrK107XHJcbiAgICAgICAgbWFza1syXSA9IHJhbmRvbVBvb2xbcmFuZG9tUG9vbFBvaW50ZXIrK107XHJcbiAgICAgICAgbWFza1szXSA9IHJhbmRvbVBvb2xbcmFuZG9tUG9vbFBvaW50ZXIrK107XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHNraXBNYXNraW5nID0gKG1hc2tbMF0gfCBtYXNrWzFdIHwgbWFza1syXSB8IG1hc2tbM10pID09PSAwO1xyXG4gICAgICBvZmZzZXQgPSA2O1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBkYXRhTGVuZ3RoO1xyXG5cclxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgICghb3B0aW9ucy5tYXNrIHx8IHNraXBNYXNraW5nKSAmJlxyXG4gICAgICAgIG9wdGlvbnNba0J5dGVMZW5ndGhdICE9PSB1bmRlZmluZWRcclxuICAgICAgKSB7XHJcbiAgICAgICAgZGF0YUxlbmd0aCA9IG9wdGlvbnNba0J5dGVMZW5ndGhdO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGRhdGEgPSBCdWZmZXIuZnJvbShkYXRhKTtcclxuICAgICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGg7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aDtcclxuICAgICAgbWVyZ2UgPSBvcHRpb25zLm1hc2sgJiYgb3B0aW9ucy5yZWFkT25seSAmJiAhc2tpcE1hc2tpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHBheWxvYWRMZW5ndGggPSBkYXRhTGVuZ3RoO1xyXG5cclxuICAgIGlmIChkYXRhTGVuZ3RoID49IDY1NTM2KSB7XHJcbiAgICAgIG9mZnNldCArPSA4O1xyXG4gICAgICBwYXlsb2FkTGVuZ3RoID0gMTI3O1xyXG4gICAgfSBlbHNlIGlmIChkYXRhTGVuZ3RoID4gMTI1KSB7XHJcbiAgICAgIG9mZnNldCArPSAyO1xyXG4gICAgICBwYXlsb2FkTGVuZ3RoID0gMTI2O1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRhcmdldCA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShtZXJnZSA/IGRhdGFMZW5ndGggKyBvZmZzZXQgOiBvZmZzZXQpO1xyXG5cclxuICAgIHRhcmdldFswXSA9IG9wdGlvbnMuZmluID8gb3B0aW9ucy5vcGNvZGUgfCAweDgwIDogb3B0aW9ucy5vcGNvZGU7XHJcbiAgICBpZiAob3B0aW9ucy5yc3YxKSB0YXJnZXRbMF0gfD0gMHg0MDtcclxuXHJcbiAgICB0YXJnZXRbMV0gPSBwYXlsb2FkTGVuZ3RoO1xyXG5cclxuICAgIGlmIChwYXlsb2FkTGVuZ3RoID09PSAxMjYpIHtcclxuICAgICAgdGFyZ2V0LndyaXRlVUludDE2QkUoZGF0YUxlbmd0aCwgMik7XHJcbiAgICB9IGVsc2UgaWYgKHBheWxvYWRMZW5ndGggPT09IDEyNykge1xyXG4gICAgICB0YXJnZXRbMl0gPSB0YXJnZXRbM10gPSAwO1xyXG4gICAgICB0YXJnZXQud3JpdGVVSW50QkUoZGF0YUxlbmd0aCwgNCwgNik7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFvcHRpb25zLm1hc2spIHJldHVybiBbdGFyZ2V0LCBkYXRhXTtcclxuXHJcbiAgICB0YXJnZXRbMV0gfD0gMHg4MDtcclxuICAgIHRhcmdldFtvZmZzZXQgLSA0XSA9IG1hc2tbMF07XHJcbiAgICB0YXJnZXRbb2Zmc2V0IC0gM10gPSBtYXNrWzFdO1xyXG4gICAgdGFyZ2V0W29mZnNldCAtIDJdID0gbWFza1syXTtcclxuICAgIHRhcmdldFtvZmZzZXQgLSAxXSA9IG1hc2tbM107XHJcblxyXG4gICAgaWYgKHNraXBNYXNraW5nKSByZXR1cm4gW3RhcmdldCwgZGF0YV07XHJcblxyXG4gICAgaWYgKG1lcmdlKSB7XHJcbiAgICAgIGFwcGx5TWFzayhkYXRhLCBtYXNrLCB0YXJnZXQsIG9mZnNldCwgZGF0YUxlbmd0aCk7XHJcbiAgICAgIHJldHVybiBbdGFyZ2V0XTtcclxuICAgIH1cclxuXHJcbiAgICBhcHBseU1hc2soZGF0YSwgbWFzaywgZGF0YSwgMCwgZGF0YUxlbmd0aCk7XHJcbiAgICByZXR1cm4gW3RhcmdldCwgZGF0YV07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZW5kcyBhIGNsb3NlIG1lc3NhZ2UgdG8gdGhlIG90aGVyIHBlZXIuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge051bWJlcn0gW2NvZGVdIFRoZSBzdGF0dXMgY29kZSBjb21wb25lbnQgb2YgdGhlIGJvZHlcclxuICAgKiBAcGFyYW0geyhTdHJpbmd8QnVmZmVyKX0gW2RhdGFdIFRoZSBtZXNzYWdlIGNvbXBvbmVudCBvZiB0aGUgYm9keVxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW21hc2s9ZmFsc2VdIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0byBtYXNrIHRoZSBtZXNzYWdlXHJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NiXSBDYWxsYmFja1xyXG4gICAqIEBwdWJsaWNcclxuICAgKi9cclxuICBjbG9zZShjb2RlLCBkYXRhLCBtYXNrLCBjYikge1xyXG4gICAgbGV0IGJ1ZjtcclxuXHJcbiAgICBpZiAoY29kZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGJ1ZiA9IEVNUFRZX0JVRkZFUjtcclxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvZGUgIT09ICdudW1iZXInIHx8ICFpc1ZhbGlkU3RhdHVzQ29kZShjb2RlKSkge1xyXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgdmFsaWQgZXJyb3IgY29kZSBudW1iZXInKTtcclxuICAgIH0gZWxzZSBpZiAoZGF0YSA9PT0gdW5kZWZpbmVkIHx8ICFkYXRhLmxlbmd0aCkge1xyXG4gICAgICBidWYgPSBCdWZmZXIuYWxsb2NVbnNhZmUoMik7XHJcbiAgICAgIGJ1Zi53cml0ZVVJbnQxNkJFKGNvZGUsIDApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgbGVuZ3RoID0gQnVmZmVyLmJ5dGVMZW5ndGgoZGF0YSk7XHJcblxyXG4gICAgICBpZiAobGVuZ3RoID4gMTIzKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSBtZXNzYWdlIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiAxMjMgYnl0ZXMnKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgYnVmID0gQnVmZmVyLmFsbG9jVW5zYWZlKDIgKyBsZW5ndGgpO1xyXG4gICAgICBidWYud3JpdGVVSW50MTZCRShjb2RlLCAwKTtcclxuXHJcbiAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICBidWYud3JpdGUoZGF0YSwgMik7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYnVmLnNldChkYXRhLCAyKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG9wdGlvbnMgPSB7XHJcbiAgICAgIFtrQnl0ZUxlbmd0aF06IGJ1Zi5sZW5ndGgsXHJcbiAgICAgIGZpbjogdHJ1ZSxcclxuICAgICAgZ2VuZXJhdGVNYXNrOiB0aGlzLl9nZW5lcmF0ZU1hc2ssXHJcbiAgICAgIG1hc2ssXHJcbiAgICAgIG1hc2tCdWZmZXI6IHRoaXMuX21hc2tCdWZmZXIsXHJcbiAgICAgIG9wY29kZTogMHgwOCxcclxuICAgICAgcmVhZE9ubHk6IGZhbHNlLFxyXG4gICAgICByc3YxOiBmYWxzZVxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAodGhpcy5fc3RhdGUgIT09IERFRkFVTFQpIHtcclxuICAgICAgdGhpcy5lbnF1ZXVlKFt0aGlzLmRpc3BhdGNoLCBidWYsIGZhbHNlLCBvcHRpb25zLCBjYl0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zZW5kRnJhbWUoU2VuZGVyLmZyYW1lKGJ1Ziwgb3B0aW9ucyksIGNiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlbmRzIGEgcGluZyBtZXNzYWdlIHRvIHRoZSBvdGhlciBwZWVyLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHsqfSBkYXRhIFRoZSBtZXNzYWdlIHRvIHNlbmRcclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFttYXNrPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gbWFzayBgZGF0YWBcclxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2JdIENhbGxiYWNrXHJcbiAgICogQHB1YmxpY1xyXG4gICAqL1xyXG4gIHBpbmcoZGF0YSwgbWFzaywgY2IpIHtcclxuICAgIGxldCBieXRlTGVuZ3RoO1xyXG4gICAgbGV0IHJlYWRPbmx5O1xyXG5cclxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgYnl0ZUxlbmd0aCA9IEJ1ZmZlci5ieXRlTGVuZ3RoKGRhdGEpO1xyXG4gICAgICByZWFkT25seSA9IGZhbHNlO1xyXG4gICAgfSBlbHNlIGlmIChpc0Jsb2IoZGF0YSkpIHtcclxuICAgICAgYnl0ZUxlbmd0aCA9IGRhdGEuc2l6ZTtcclxuICAgICAgcmVhZE9ubHkgPSBmYWxzZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGRhdGEgPSB0b0J1ZmZlcihkYXRhKTtcclxuICAgICAgYnl0ZUxlbmd0aCA9IGRhdGEubGVuZ3RoO1xyXG4gICAgICByZWFkT25seSA9IHRvQnVmZmVyLnJlYWRPbmx5O1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChieXRlTGVuZ3RoID4gMTI1KSB7XHJcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgZGF0YSBzaXplIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiAxMjUgYnl0ZXMnKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBvcHRpb25zID0ge1xyXG4gICAgICBba0J5dGVMZW5ndGhdOiBieXRlTGVuZ3RoLFxyXG4gICAgICBmaW46IHRydWUsXHJcbiAgICAgIGdlbmVyYXRlTWFzazogdGhpcy5fZ2VuZXJhdGVNYXNrLFxyXG4gICAgICBtYXNrLFxyXG4gICAgICBtYXNrQnVmZmVyOiB0aGlzLl9tYXNrQnVmZmVyLFxyXG4gICAgICBvcGNvZGU6IDB4MDksXHJcbiAgICAgIHJlYWRPbmx5LFxyXG4gICAgICByc3YxOiBmYWxzZVxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAoaXNCbG9iKGRhdGEpKSB7XHJcbiAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gREVGQVVMVCkge1xyXG4gICAgICAgIHRoaXMuZW5xdWV1ZShbdGhpcy5nZXRCbG9iRGF0YSwgZGF0YSwgZmFsc2UsIG9wdGlvbnMsIGNiXSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5nZXRCbG9iRGF0YShkYXRhLCBmYWxzZSwgb3B0aW9ucywgY2IpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3N0YXRlICE9PSBERUZBVUxUKSB7XHJcbiAgICAgIHRoaXMuZW5xdWV1ZShbdGhpcy5kaXNwYXRjaCwgZGF0YSwgZmFsc2UsIG9wdGlvbnMsIGNiXSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNlbmRGcmFtZShTZW5kZXIuZnJhbWUoZGF0YSwgb3B0aW9ucyksIGNiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlbmRzIGEgcG9uZyBtZXNzYWdlIHRvIHRoZSBvdGhlciBwZWVyLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHsqfSBkYXRhIFRoZSBtZXNzYWdlIHRvIHNlbmRcclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFttYXNrPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gbWFzayBgZGF0YWBcclxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2JdIENhbGxiYWNrXHJcbiAgICogQHB1YmxpY1xyXG4gICAqL1xyXG4gIHBvbmcoZGF0YSwgbWFzaywgY2IpIHtcclxuICAgIGxldCBieXRlTGVuZ3RoO1xyXG4gICAgbGV0IHJlYWRPbmx5O1xyXG5cclxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgYnl0ZUxlbmd0aCA9IEJ1ZmZlci5ieXRlTGVuZ3RoKGRhdGEpO1xyXG4gICAgICByZWFkT25seSA9IGZhbHNlO1xyXG4gICAgfSBlbHNlIGlmIChpc0Jsb2IoZGF0YSkpIHtcclxuICAgICAgYnl0ZUxlbmd0aCA9IGRhdGEuc2l6ZTtcclxuICAgICAgcmVhZE9ubHkgPSBmYWxzZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGRhdGEgPSB0b0J1ZmZlcihkYXRhKTtcclxuICAgICAgYnl0ZUxlbmd0aCA9IGRhdGEubGVuZ3RoO1xyXG4gICAgICByZWFkT25seSA9IHRvQnVmZmVyLnJlYWRPbmx5O1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChieXRlTGVuZ3RoID4gMTI1KSB7XHJcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgZGF0YSBzaXplIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiAxMjUgYnl0ZXMnKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBvcHRpb25zID0ge1xyXG4gICAgICBba0J5dGVMZW5ndGhdOiBieXRlTGVuZ3RoLFxyXG4gICAgICBmaW46IHRydWUsXHJcbiAgICAgIGdlbmVyYXRlTWFzazogdGhpcy5fZ2VuZXJhdGVNYXNrLFxyXG4gICAgICBtYXNrLFxyXG4gICAgICBtYXNrQnVmZmVyOiB0aGlzLl9tYXNrQnVmZmVyLFxyXG4gICAgICBvcGNvZGU6IDB4MGEsXHJcbiAgICAgIHJlYWRPbmx5LFxyXG4gICAgICByc3YxOiBmYWxzZVxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAoaXNCbG9iKGRhdGEpKSB7XHJcbiAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gREVGQVVMVCkge1xyXG4gICAgICAgIHRoaXMuZW5xdWV1ZShbdGhpcy5nZXRCbG9iRGF0YSwgZGF0YSwgZmFsc2UsIG9wdGlvbnMsIGNiXSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5nZXRCbG9iRGF0YShkYXRhLCBmYWxzZSwgb3B0aW9ucywgY2IpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3N0YXRlICE9PSBERUZBVUxUKSB7XHJcbiAgICAgIHRoaXMuZW5xdWV1ZShbdGhpcy5kaXNwYXRjaCwgZGF0YSwgZmFsc2UsIG9wdGlvbnMsIGNiXSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNlbmRGcmFtZShTZW5kZXIuZnJhbWUoZGF0YSwgb3B0aW9ucyksIGNiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlbmRzIGEgZGF0YSBtZXNzYWdlIHRvIHRoZSBvdGhlciBwZWVyLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHsqfSBkYXRhIFRoZSBtZXNzYWdlIHRvIHNlbmRcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBPcHRpb25zIG9iamVjdFxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuYmluYXJ5PWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBgZGF0YWAgaXMgYmluYXJ5XHJcbiAgICogICAgIG9yIHRleHRcclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmNvbXByZXNzPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG9cclxuICAgKiAgICAgY29tcHJlc3MgYGRhdGFgXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5maW49ZmFsc2VdIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBmcmFnbWVudCBpcyB0aGVcclxuICAgKiAgICAgbGFzdCBvbmVcclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLm1hc2s9ZmFsc2VdIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0byBtYXNrXHJcbiAgICogICAgIGBkYXRhYFxyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYl0gQ2FsbGJhY2tcclxuICAgKiBAcHVibGljXHJcbiAgICovXHJcbiAgc2VuZChkYXRhLCBvcHRpb25zLCBjYikge1xyXG4gICAgY29uc3QgcGVyTWVzc2FnZURlZmxhdGUgPSB0aGlzLl9leHRlbnNpb25zW1Blck1lc3NhZ2VEZWZsYXRlLmV4dGVuc2lvbk5hbWVdO1xyXG4gICAgbGV0IG9wY29kZSA9IG9wdGlvbnMuYmluYXJ5ID8gMiA6IDE7XHJcbiAgICBsZXQgcnN2MSA9IG9wdGlvbnMuY29tcHJlc3M7XHJcblxyXG4gICAgbGV0IGJ5dGVMZW5ndGg7XHJcbiAgICBsZXQgcmVhZE9ubHk7XHJcblxyXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xyXG4gICAgICBieXRlTGVuZ3RoID0gQnVmZmVyLmJ5dGVMZW5ndGgoZGF0YSk7XHJcbiAgICAgIHJlYWRPbmx5ID0gZmFsc2U7XHJcbiAgICB9IGVsc2UgaWYgKGlzQmxvYihkYXRhKSkge1xyXG4gICAgICBieXRlTGVuZ3RoID0gZGF0YS5zaXplO1xyXG4gICAgICByZWFkT25seSA9IGZhbHNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZGF0YSA9IHRvQnVmZmVyKGRhdGEpO1xyXG4gICAgICBieXRlTGVuZ3RoID0gZGF0YS5sZW5ndGg7XHJcbiAgICAgIHJlYWRPbmx5ID0gdG9CdWZmZXIucmVhZE9ubHk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX2ZpcnN0RnJhZ21lbnQpIHtcclxuICAgICAgdGhpcy5fZmlyc3RGcmFnbWVudCA9IGZhbHNlO1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgcnN2MSAmJlxyXG4gICAgICAgIHBlck1lc3NhZ2VEZWZsYXRlICYmXHJcbiAgICAgICAgcGVyTWVzc2FnZURlZmxhdGUucGFyYW1zW1xyXG4gICAgICAgICAgcGVyTWVzc2FnZURlZmxhdGUuX2lzU2VydmVyXHJcbiAgICAgICAgICAgID8gJ3NlcnZlcl9ub19jb250ZXh0X3Rha2VvdmVyJ1xyXG4gICAgICAgICAgICA6ICdjbGllbnRfbm9fY29udGV4dF90YWtlb3ZlcidcclxuICAgICAgICBdXHJcbiAgICAgICkge1xyXG4gICAgICAgIHJzdjEgPSBieXRlTGVuZ3RoID49IHBlck1lc3NhZ2VEZWZsYXRlLl90aHJlc2hvbGQ7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fY29tcHJlc3MgPSByc3YxO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcnN2MSA9IGZhbHNlO1xyXG4gICAgICBvcGNvZGUgPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChvcHRpb25zLmZpbikgdGhpcy5fZmlyc3RGcmFnbWVudCA9IHRydWU7XHJcblxyXG4gICAgY29uc3Qgb3B0cyA9IHtcclxuICAgICAgW2tCeXRlTGVuZ3RoXTogYnl0ZUxlbmd0aCxcclxuICAgICAgZmluOiBvcHRpb25zLmZpbixcclxuICAgICAgZ2VuZXJhdGVNYXNrOiB0aGlzLl9nZW5lcmF0ZU1hc2ssXHJcbiAgICAgIG1hc2s6IG9wdGlvbnMubWFzayxcclxuICAgICAgbWFza0J1ZmZlcjogdGhpcy5fbWFza0J1ZmZlcixcclxuICAgICAgb3Bjb2RlLFxyXG4gICAgICByZWFkT25seSxcclxuICAgICAgcnN2MVxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAoaXNCbG9iKGRhdGEpKSB7XHJcbiAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gREVGQVVMVCkge1xyXG4gICAgICAgIHRoaXMuZW5xdWV1ZShbdGhpcy5nZXRCbG9iRGF0YSwgZGF0YSwgdGhpcy5fY29tcHJlc3MsIG9wdHMsIGNiXSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5nZXRCbG9iRGF0YShkYXRhLCB0aGlzLl9jb21wcmVzcywgb3B0cywgY2IpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3N0YXRlICE9PSBERUZBVUxUKSB7XHJcbiAgICAgIHRoaXMuZW5xdWV1ZShbdGhpcy5kaXNwYXRjaCwgZGF0YSwgdGhpcy5fY29tcHJlc3MsIG9wdHMsIGNiXSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmRpc3BhdGNoKGRhdGEsIHRoaXMuX2NvbXByZXNzLCBvcHRzLCBjYik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXRzIHRoZSBjb250ZW50cyBvZiBhIGJsb2IgYXMgYmluYXJ5IGRhdGEuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0Jsb2J9IGJsb2IgVGhlIGJsb2JcclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtjb21wcmVzcz1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIGNvbXByZXNzXHJcbiAgICogICAgIHRoZSBkYXRhXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgT3B0aW9ucyBvYmplY3RcclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmZpbj1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIHNldCB0aGVcclxuICAgKiAgICAgRklOIGJpdFxyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmdlbmVyYXRlTWFza10gVGhlIGZ1bmN0aW9uIHVzZWQgdG8gZ2VuZXJhdGUgdGhlXHJcbiAgICogICAgIG1hc2tpbmcga2V5XHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5tYXNrPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gbWFza1xyXG4gICAqICAgICBgZGF0YWBcclxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gW29wdGlvbnMubWFza0J1ZmZlcl0gVGhlIGJ1ZmZlciB1c2VkIHRvIHN0b3JlIHRoZSBtYXNraW5nXHJcbiAgICogICAgIGtleVxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBvcHRpb25zLm9wY29kZSBUaGUgb3Bjb2RlXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5yZWFkT25seT1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgYGRhdGFgIGNhbiBiZVxyXG4gICAqICAgICBtb2RpZmllZFxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMucnN2MT1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIHNldCB0aGVcclxuICAgKiAgICAgUlNWMSBiaXRcclxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2JdIENhbGxiYWNrXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBnZXRCbG9iRGF0YShibG9iLCBjb21wcmVzcywgb3B0aW9ucywgY2IpIHtcclxuICAgIHRoaXMuX2J1ZmZlcmVkQnl0ZXMgKz0gb3B0aW9uc1trQnl0ZUxlbmd0aF07XHJcbiAgICB0aGlzLl9zdGF0ZSA9IEdFVF9CTE9CX0RBVEE7XHJcblxyXG4gICAgYmxvYlxyXG4gICAgICAuYXJyYXlCdWZmZXIoKVxyXG4gICAgICAudGhlbigoYXJyYXlCdWZmZXIpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5fc29ja2V0LmRlc3Ryb3llZCkge1xyXG4gICAgICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKFxyXG4gICAgICAgICAgICAnVGhlIHNvY2tldCB3YXMgY2xvc2VkIHdoaWxlIHRoZSBibG9iIHdhcyBiZWluZyByZWFkJ1xyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAvL1xyXG4gICAgICAgICAgLy8gYGNhbGxDYWxsYmFja3NgIGlzIGNhbGxlZCBpbiB0aGUgbmV4dCB0aWNrIHRvIGVuc3VyZSB0aGF0IGVycm9yc1xyXG4gICAgICAgICAgLy8gdGhhdCBtaWdodCBiZSB0aHJvd24gaW4gdGhlIGNhbGxiYWNrcyBiZWhhdmUgbGlrZSBlcnJvcnMgdGhyb3duXHJcbiAgICAgICAgICAvLyBvdXRzaWRlIHRoZSBwcm9taXNlIGNoYWluLlxyXG4gICAgICAgICAgLy9cclxuICAgICAgICAgIHByb2Nlc3MubmV4dFRpY2soY2FsbENhbGxiYWNrcywgdGhpcywgZXJyLCBjYik7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9idWZmZXJlZEJ5dGVzIC09IG9wdGlvbnNba0J5dGVMZW5ndGhdO1xyXG4gICAgICAgIGNvbnN0IGRhdGEgPSB0b0J1ZmZlcihhcnJheUJ1ZmZlcik7XHJcblxyXG4gICAgICAgIGlmICghY29tcHJlc3MpIHtcclxuICAgICAgICAgIHRoaXMuX3N0YXRlID0gREVGQVVMVDtcclxuICAgICAgICAgIHRoaXMuc2VuZEZyYW1lKFNlbmRlci5mcmFtZShkYXRhLCBvcHRpb25zKSwgY2IpO1xyXG4gICAgICAgICAgdGhpcy5kZXF1ZXVlKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZGlzcGF0Y2goZGF0YSwgY29tcHJlc3MsIG9wdGlvbnMsIGNiKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XHJcbiAgICAgICAgLy9cclxuICAgICAgICAvLyBgb25FcnJvcmAgaXMgY2FsbGVkIGluIHRoZSBuZXh0IHRpY2sgZm9yIHRoZSBzYW1lIHJlYXNvbiB0aGF0XHJcbiAgICAgICAgLy8gYGNhbGxDYWxsYmFja3NgIGFib3ZlIGlzLlxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhvbkVycm9yLCB0aGlzLCBlcnIsIGNiKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEaXNwYXRjaGVzIGEgbWVzc2FnZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7KEJ1ZmZlcnxTdHJpbmcpfSBkYXRhIFRoZSBtZXNzYWdlIHRvIHNlbmRcclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtjb21wcmVzcz1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIGNvbXByZXNzXHJcbiAgICogICAgIGBkYXRhYFxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIE9wdGlvbnMgb2JqZWN0XHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5maW49ZmFsc2VdIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0byBzZXQgdGhlXHJcbiAgICogICAgIEZJTiBiaXRcclxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5nZW5lcmF0ZU1hc2tdIFRoZSBmdW5jdGlvbiB1c2VkIHRvIGdlbmVyYXRlIHRoZVxyXG4gICAqICAgICBtYXNraW5nIGtleVxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMubWFzaz1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIG1hc2tcclxuICAgKiAgICAgYGRhdGFgXHJcbiAgICogQHBhcmFtIHtCdWZmZXJ9IFtvcHRpb25zLm1hc2tCdWZmZXJdIFRoZSBidWZmZXIgdXNlZCB0byBzdG9yZSB0aGUgbWFza2luZ1xyXG4gICAqICAgICBrZXlcclxuICAgKiBAcGFyYW0ge051bWJlcn0gb3B0aW9ucy5vcGNvZGUgVGhlIG9wY29kZVxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMucmVhZE9ubHk9ZmFsc2VdIFNwZWNpZmllcyB3aGV0aGVyIGBkYXRhYCBjYW4gYmVcclxuICAgKiAgICAgbW9kaWZpZWRcclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnJzdjE9ZmFsc2VdIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0byBzZXQgdGhlXHJcbiAgICogICAgIFJTVjEgYml0XHJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NiXSBDYWxsYmFja1xyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgZGlzcGF0Y2goZGF0YSwgY29tcHJlc3MsIG9wdGlvbnMsIGNiKSB7XHJcbiAgICBpZiAoIWNvbXByZXNzKSB7XHJcbiAgICAgIHRoaXMuc2VuZEZyYW1lKFNlbmRlci5mcmFtZShkYXRhLCBvcHRpb25zKSwgY2IpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcGVyTWVzc2FnZURlZmxhdGUgPSB0aGlzLl9leHRlbnNpb25zW1Blck1lc3NhZ2VEZWZsYXRlLmV4dGVuc2lvbk5hbWVdO1xyXG5cclxuICAgIHRoaXMuX2J1ZmZlcmVkQnl0ZXMgKz0gb3B0aW9uc1trQnl0ZUxlbmd0aF07XHJcbiAgICB0aGlzLl9zdGF0ZSA9IERFRkxBVElORztcclxuICAgIHBlck1lc3NhZ2VEZWZsYXRlLmNvbXByZXNzKGRhdGEsIG9wdGlvbnMuZmluLCAoXywgYnVmKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLl9zb2NrZXQuZGVzdHJveWVkKSB7XHJcbiAgICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKFxyXG4gICAgICAgICAgJ1RoZSBzb2NrZXQgd2FzIGNsb3NlZCB3aGlsZSBkYXRhIHdhcyBiZWluZyBjb21wcmVzc2VkJ1xyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGNhbGxDYWxsYmFja3ModGhpcywgZXJyLCBjYik7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLl9idWZmZXJlZEJ5dGVzIC09IG9wdGlvbnNba0J5dGVMZW5ndGhdO1xyXG4gICAgICB0aGlzLl9zdGF0ZSA9IERFRkFVTFQ7XHJcbiAgICAgIG9wdGlvbnMucmVhZE9ubHkgPSBmYWxzZTtcclxuICAgICAgdGhpcy5zZW5kRnJhbWUoU2VuZGVyLmZyYW1lKGJ1Ziwgb3B0aW9ucyksIGNiKTtcclxuICAgICAgdGhpcy5kZXF1ZXVlKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEV4ZWN1dGVzIHF1ZXVlZCBzZW5kIG9wZXJhdGlvbnMuXHJcbiAgICpcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIGRlcXVldWUoKSB7XHJcbiAgICB3aGlsZSAodGhpcy5fc3RhdGUgPT09IERFRkFVTFQgJiYgdGhpcy5fcXVldWUubGVuZ3RoKSB7XHJcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuX3F1ZXVlLnNoaWZ0KCk7XHJcblxyXG4gICAgICB0aGlzLl9idWZmZXJlZEJ5dGVzIC09IHBhcmFtc1szXVtrQnl0ZUxlbmd0aF07XHJcbiAgICAgIFJlZmxlY3QuYXBwbHkocGFyYW1zWzBdLCB0aGlzLCBwYXJhbXMuc2xpY2UoMSkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRW5xdWV1ZXMgYSBzZW5kIG9wZXJhdGlvbi5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7QXJyYXl9IHBhcmFtcyBTZW5kIG9wZXJhdGlvbiBwYXJhbWV0ZXJzLlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgZW5xdWV1ZShwYXJhbXMpIHtcclxuICAgIHRoaXMuX2J1ZmZlcmVkQnl0ZXMgKz0gcGFyYW1zWzNdW2tCeXRlTGVuZ3RoXTtcclxuICAgIHRoaXMuX3F1ZXVlLnB1c2gocGFyYW1zKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlbmRzIGEgZnJhbWUuXHJcbiAgICpcclxuICAgKiBAcGFyYW0geyhCdWZmZXIgfCBTdHJpbmcpW119IGxpc3QgVGhlIGZyYW1lIHRvIHNlbmRcclxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2JdIENhbGxiYWNrXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBzZW5kRnJhbWUobGlzdCwgY2IpIHtcclxuICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMikge1xyXG4gICAgICB0aGlzLl9zb2NrZXQuY29yaygpO1xyXG4gICAgICB0aGlzLl9zb2NrZXQud3JpdGUobGlzdFswXSk7XHJcbiAgICAgIHRoaXMuX3NvY2tldC53cml0ZShsaXN0WzFdLCBjYik7XHJcbiAgICAgIHRoaXMuX3NvY2tldC51bmNvcmsoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX3NvY2tldC53cml0ZShsaXN0WzBdLCBjYik7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFNlbmRlcjtcclxuXHJcbi8qKlxyXG4gKiBDYWxscyBxdWV1ZWQgY2FsbGJhY2tzIHdpdGggYW4gZXJyb3IuXHJcbiAqXHJcbiAqIEBwYXJhbSB7U2VuZGVyfSBzZW5kZXIgVGhlIGBTZW5kZXJgIGluc3RhbmNlXHJcbiAqIEBwYXJhbSB7RXJyb3J9IGVyciBUaGUgZXJyb3IgdG8gY2FsbCB0aGUgY2FsbGJhY2tzIHdpdGhcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2NiXSBUaGUgZmlyc3QgY2FsbGJhY2tcclxuICogQHByaXZhdGVcclxuICovXHJcbmZ1bmN0aW9uIGNhbGxDYWxsYmFja3Moc2VuZGVyLCBlcnIsIGNiKSB7XHJcbiAgaWYgKHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJykgY2IoZXJyKTtcclxuXHJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZW5kZXIuX3F1ZXVlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICBjb25zdCBwYXJhbXMgPSBzZW5kZXIuX3F1ZXVlW2ldO1xyXG4gICAgY29uc3QgY2FsbGJhY2sgPSBwYXJhbXNbcGFyYW1zLmxlbmd0aCAtIDFdO1xyXG5cclxuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIGNhbGxiYWNrKGVycik7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogSGFuZGxlcyBhIGBTZW5kZXJgIGVycm9yLlxyXG4gKlxyXG4gKiBAcGFyYW0ge1NlbmRlcn0gc2VuZGVyIFRoZSBgU2VuZGVyYCBpbnN0YW5jZVxyXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnIgVGhlIGVycm9yXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYl0gVGhlIGZpcnN0IHBlbmRpbmcgY2FsbGJhY2tcclxuICogQHByaXZhdGVcclxuICovXHJcbmZ1bmN0aW9uIG9uRXJyb3Ioc2VuZGVyLCBlcnIsIGNiKSB7XHJcbiAgY2FsbENhbGxiYWNrcyhzZW5kZXIsIGVyciwgY2IpO1xyXG4gIHNlbmRlci5vbmVycm9yKGVycik7XHJcbn1cclxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/ws/lib/sender.js\n");
/***/ }),
/***/ "(ssr)/./node_modules/ws/lib/stream.js":
/*!***************************************!*\
!*** ./node_modules/ws/lib/stream.js ***!
\***************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
eval("/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^WebSocket$\" }] */\r\n\r\n\r\nconst WebSocket = __webpack_require__(/*! ./websocket */ \"(ssr)/./node_modules/ws/lib/websocket.js\");\r\nconst { Duplex } = __webpack_require__(/*! stream */ \"stream\");\r\n\r\n/**\r\n * Emits the `'close'` event on a stream.\r\n *\r\n * @param {Duplex} stream The stream.\r\n * @private\r\n */\r\nfunction emitClose(stream) {\r\n stream.emit('close');\r\n}\r\n\r\n/**\r\n * The listener of the `'end'` event.\r\n *\r\n * @private\r\n */\r\nfunction duplexOnEnd() {\r\n if (!this.destroyed && this._writableState.finished) {\r\n this.destroy();\r\n }\r\n}\r\n\r\n/**\r\n * The listener of the `'error'` event.\r\n *\r\n * @param {Error} err The error\r\n * @private\r\n */\r\nfunction duplexOnError(err) {\r\n this.removeListener('error', duplexOnError);\r\n this.destroy();\r\n if (this.listenerCount('error') === 0) {\r\n // Do not suppress the throwing behavior.\r\n this.emit('error', err);\r\n }\r\n}\r\n\r\n/**\r\n * Wraps a `WebSocket` in a duplex stream.\r\n *\r\n * @param {WebSocket} ws The `WebSocket` to wrap\r\n * @param {Object} [options] The options for the `Duplex` constructor\r\n * @return {Duplex} The duplex stream\r\n * @public\r\n */\r\nfunction createWebSocketStream(ws, options) {\r\n let terminateOnDestroy = true;\r\n\r\n const duplex = new Duplex({\r\n ...options,\r\n autoDestroy: false,\r\n emitClose: false,\r\n objectMode: false,\r\n writableObjectMode: false\r\n });\r\n\r\n ws.on('message', function message(msg, isBinary) {\r\n const data =\r\n !isBinary && duplex._readableState.objectMode ? msg.toString() : msg;\r\n\r\n if (!duplex.push(data)) ws.pause();\r\n });\r\n\r\n ws.once('error', function error(err) {\r\n if (duplex.destroyed) return;\r\n\r\n // Prevent `ws.terminate()` from being called by `duplex._destroy()`.\r\n //\r\n // - If the `'error'` event is emitted before the `'open'` event, then\r\n // `ws.terminate()` is a noop as no socket is assigned.\r\n // - Otherwise, the error is re-emitted by the listener of the `'error'`\r\n // event of the `Receiver` object. The listener already closes the\r\n // connection by calling `ws.close()`. This allows a close frame to be\r\n // sent to the other peer. If `ws.terminate()` is called right after this,\r\n // then the close frame might not be sent.\r\n terminateOnDestroy = false;\r\n duplex.destroy(err);\r\n });\r\n\r\n ws.once('close', function close() {\r\n if (duplex.destroyed) return;\r\n\r\n duplex.push(null);\r\n });\r\n\r\n duplex._destroy = function (err, callback) {\r\n if (ws.readyState === ws.CLOSED) {\r\n callback(err);\r\n process.nextTick(emitClose, duplex);\r\n return;\r\n }\r\n\r\n let called = false;\r\n\r\n ws.once('error', function error(err) {\r\n called = true;\r\n callback(err);\r\n });\r\n\r\n ws.once('close', function close() {\r\n if (!called) callback(err);\r\n process.nextTick(emitClose, duplex);\r\n });\r\n\r\n if (terminateOnDestroy) ws.terminate();\r\n };\r\n\r\n duplex._final = function (callback) {\r\n if (ws.readyState === ws.CONNECTING) {\r\n ws.once('open', function open() {\r\n duplex._final(callback);\r\n });\r\n return;\r\n }\r\n\r\n // If the value of the `_socket` property is `null` it means that `ws` is a\r\n // client websocket and the handshake failed. In fact, when this happens, a\r\n // socket is never assigned to the websocket. Wait for the `'error'` event\r\n // that will be emitted by the websocket.\r\n if (ws._socket === null) return;\r\n\r\n if (ws._socket._writableState.finished) {\r\n callback();\r\n if (duplex._readableState.endEmitted) duplex.destroy();\r\n } else {\r\n ws._socket.once('finish', function finish() {\r\n // `duplex` is not destroyed here because the `'end'` event will be\r\n // emitted on `duplex` after this `'finish'` event. The EOF signaling\r\n // `null` chunk is, in fact, pushed when the websocket emits `'close'`.\r\n callback();\r\n });\r\n ws.close();\r\n }\r\n };\r\n\r\n duplex._read = function () {\r\n if (ws.isPaused) ws.resume();\r\n };\r\n\r\n duplex._write = function (chunk, encoding, callback) {\r\n if (ws.readyState === ws.CONNECTING) {\r\n ws.once('open', function open() {\r\n duplex._write(chunk, encoding, callback);\r\n });\r\n return;\r\n }\r\n\r\n ws.send(chunk, callback);\r\n };\r\n\r\n duplex.on('end', duplexOnEnd);\r\n duplex.on('error', duplexOnError);\r\n return duplex;\r\n}\r\n\r\nmodule.exports = createWebSocketStream;\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvd3MvbGliL3N0cmVhbS5qcyIsIm1hcHBpbmdzIjoiQUFBQSxzQ0FBc0Msb0NBQW9DO0FBQzdEO0FBQ2I7QUFDQSxrQkFBa0IsbUJBQU8sQ0FBQyw2REFBYTtBQUN2QyxRQUFRLFNBQVMsRUFBRSxtQkFBTyxDQUFDLHNCQUFRO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsV0FBVztBQUN0QixXQUFXLFFBQVE7QUFDbkIsWUFBWSxRQUFRO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL25leHRqcy8uL25vZGVfbW9kdWxlcy93cy9saWIvc3RyZWFtLmpzPzQzNTYiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50IG5vLXVudXNlZC12YXJzOiBbXCJlcnJvclwiLCB7IFwidmFyc0lnbm9yZVBhdHRlcm5cIjogXCJeV2ViU29ja2V0JFwiIH1dICovXHJcbid1c2Ugc3RyaWN0JztcclxuXHJcbmNvbnN0IFdlYlNvY2tldCA9IHJlcXVpcmUoJy4vd2Vic29ja2V0Jyk7XHJcbmNvbnN0IHsgRHVwbGV4IH0gPSByZXF1aXJlKCdzdHJlYW0nKTtcclxuXHJcbi8qKlxyXG4gKiBFbWl0cyB0aGUgYCdjbG9zZSdgIGV2ZW50IG9uIGEgc3RyZWFtLlxyXG4gKlxyXG4gKiBAcGFyYW0ge0R1cGxleH0gc3RyZWFtIFRoZSBzdHJlYW0uXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5mdW5jdGlvbiBlbWl0Q2xvc2Uoc3RyZWFtKSB7XHJcbiAgc3RyZWFtLmVtaXQoJ2Nsb3NlJyk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUaGUgbGlzdGVuZXIgb2YgdGhlIGAnZW5kJ2AgZXZlbnQuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5mdW5jdGlvbiBkdXBsZXhPbkVuZCgpIHtcclxuICBpZiAoIXRoaXMuZGVzdHJveWVkICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUuZmluaXNoZWQpIHtcclxuICAgIHRoaXMuZGVzdHJveSgpO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFRoZSBsaXN0ZW5lciBvZiB0aGUgYCdlcnJvcidgIGV2ZW50LlxyXG4gKlxyXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnIgVGhlIGVycm9yXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5mdW5jdGlvbiBkdXBsZXhPbkVycm9yKGVycikge1xyXG4gIHRoaXMucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgZHVwbGV4T25FcnJvcik7XHJcbiAgdGhpcy5kZXN0cm95KCk7XHJcbiAgaWYgKHRoaXMubGlzdGVuZXJDb3VudCgnZXJyb3InKSA9PT0gMCkge1xyXG4gICAgLy8gRG8gbm90IHN1cHByZXNzIHRoZSB0aHJvd2luZyBiZWhhdmlvci5cclxuICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIpO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFdyYXBzIGEgYFdlYlNvY2tldGAgaW4gYSBkdXBsZXggc3RyZWFtLlxyXG4gKlxyXG4gKiBAcGFyYW0ge1dlYlNvY2tldH0gd3MgVGhlIGBXZWJTb2NrZXRgIHRvIHdyYXBcclxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBUaGUgb3B0aW9ucyBmb3IgdGhlIGBEdXBsZXhgIGNvbnN0cnVjdG9yXHJcbiAqIEByZXR1cm4ge0R1cGxleH0gVGhlIGR1cGxleCBzdHJlYW1cclxuICogQHB1YmxpY1xyXG4gKi9cclxuZnVuY3Rpb24gY3JlYXRlV2ViU29ja2V0U3RyZWFtKHdzLCBvcHRpb25zKSB7XHJcbiAgbGV0IHRlcm1pbmF0ZU9uRGVzdHJveSA9IHRydWU7XHJcblxyXG4gIGNvbnN0IGR1cGxleCA9IG5ldyBEdXBsZXgoe1xyXG4gICAgLi4ub3B0aW9ucyxcclxuICAgIGF1dG9EZXN0cm95OiBmYWxzZSxcclxuICAgIGVtaXRDbG9zZTogZmFsc2UsXHJcbiAgICBvYmplY3RNb2RlOiBmYWxzZSxcclxuICAgIHdyaXRhYmxlT2JqZWN0TW9kZTogZmFsc2VcclxuICB9KTtcclxuXHJcbiAgd3Mub24oJ21lc3NhZ2UnLCBmdW5jdGlvbiBtZXNzYWdlKG1zZywgaXNCaW5hcnkpIHtcclxuICAgIGNvbnN0IGRhdGEgPVxyXG4gICAgICAhaXNCaW5hcnkgJiYgZHVwbGV4Ll9yZWFkYWJsZVN0YXRlLm9iamVjdE1vZGUgPyBtc2cudG9TdHJpbmcoKSA6IG1zZztcclxuXHJcbiAgICBpZiAoIWR1cGxleC5wdXNoKGRhdGEpKSB3cy5wYXVzZSgpO1xyXG4gIH0pO1xyXG5cclxuICB3cy5vbmNlKCdlcnJvcicsIGZ1bmN0aW9uIGVycm9yKGVycikge1xyXG4gICAgaWYgKGR1cGxleC5kZXN0cm95ZWQpIHJldHVybjtcclxuXHJcbiAgICAvLyBQcmV2ZW50IGB3cy50ZXJtaW5hdGUoKWAgZnJvbSBiZWluZyBjYWxsZWQgYnkgYGR1cGxleC5fZGVzdHJveSgpYC5cclxuICAgIC8vXHJcbiAgICAvLyAtIElmIHRoZSBgJ2Vycm9yJ2AgZXZlbnQgaXMgZW1pdHRlZCBiZWZvcmUgdGhlIGAnb3BlbidgIGV2ZW50LCB0aGVuXHJcbiAgICAvLyAgIGB3cy50ZXJtaW5hdGUoKWAgaXMgYSBub29wIGFzIG5vIHNvY2tldCBpcyBhc3NpZ25lZC5cclxuICAgIC8vIC0gT3RoZXJ3aXNlLCB0aGUgZXJyb3IgaXMgcmUtZW1pdHRlZCBieSB0aGUgbGlzdGVuZXIgb2YgdGhlIGAnZXJyb3InYFxyXG4gICAgLy8gICBldmVudCBvZiB0aGUgYFJlY2VpdmVyYCBvYmplY3QuIFRoZSBsaXN0ZW5lciBhbHJlYWR5IGNsb3NlcyB0aGVcclxuICAgIC8vICAgY29ubmVjdGlvbiBieSBjYWxsaW5nIGB3cy5jbG9zZSgpYC4gVGhpcyBhbGxvd3MgYSBjbG9zZSBmcmFtZSB0byBiZVxyXG4gICAgLy8gICBzZW50IHRvIHRoZSBvdGhlciBwZWVyLiBJZiBgd3MudGVybWluYXRlKClgIGlzIGNhbGxlZCByaWdodCBhZnRlciB0aGlzLFxyXG4gICAgLy8gICB0aGVuIHRoZSBjbG9zZSBmcmFtZSBtaWdodCBub3QgYmUgc2VudC5cclxuICAgIHRlcm1pbmF0ZU9uRGVzdHJveSA9IGZhbHNlO1xyXG4gICAgZHVwbGV4LmRlc3Ryb3koZXJyKTtcclxuICB9KTtcclxuXHJcbiAgd3Mub25jZSgnY2xvc2UnLCBmdW5jdGlvbiBjbG9zZSgpIHtcclxuICAgIGlmIChkdXBsZXguZGVzdHJveWVkKSByZXR1cm47XHJcblxyXG4gICAgZHVwbGV4LnB1c2gobnVsbCk7XHJcbiAgfSk7XHJcblxyXG4gIGR1cGxleC5fZGVzdHJveSA9IGZ1bmN0aW9uIChlcnIsIGNhbGxiYWNrKSB7XHJcbiAgICBpZiAod3MucmVhZHlTdGF0ZSA9PT0gd3MuQ0xPU0VEKSB7XHJcbiAgICAgIGNhbGxiYWNrKGVycik7XHJcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZW1pdENsb3NlLCBkdXBsZXgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGNhbGxlZCA9IGZhbHNlO1xyXG5cclxuICAgIHdzLm9uY2UoJ2Vycm9yJywgZnVuY3Rpb24gZXJyb3IoZXJyKSB7XHJcbiAgICAgIGNhbGxlZCA9IHRydWU7XHJcbiAgICAgIGNhbGxiYWNrKGVycik7XHJcbiAgICB9KTtcclxuXHJcbiAgICB3cy5vbmNlKCdjbG9zZScsIGZ1bmN0aW9uIGNsb3NlKCkge1xyXG4gICAgICBpZiAoIWNhbGxlZCkgY2FsbGJhY2soZXJyKTtcclxuICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0Q2xvc2UsIGR1cGxleCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAodGVybWluYXRlT25EZXN0cm95KSB3cy50ZXJtaW5hdGUoKTtcclxuICB9O1xyXG5cclxuICBkdXBsZXguX2ZpbmFsID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XHJcbiAgICBpZiAod3MucmVhZHlTdGF0ZSA9PT0gd3MuQ09OTkVDVElORykge1xyXG4gICAgICB3cy5vbmNlKCdvcGVuJywgZnVuY3Rpb24gb3BlbigpIHtcclxuICAgICAgICBkdXBsZXguX2ZpbmFsKGNhbGxiYWNrKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiB0aGUgdmFsdWUgb2YgdGhlIGBfc29ja2V0YCBwcm9wZXJ0eSBpcyBgbnVsbGAgaXQgbWVhbnMgdGhhdCBgd3NgIGlzIGFcclxuICAgIC8vIGNsaWVudCB3ZWJzb2NrZXQgYW5kIHRoZSBoYW5kc2hha2UgZmFpbGVkLiBJbiBmYWN0LCB3aGVuIHRoaXMgaGFwcGVucywgYVxyXG4gICAgLy8gc29ja2V0IGlzIG5ldmVyIGFzc2lnbmVkIHRvIHRoZSB3ZWJzb2NrZXQuIFdhaXQgZm9yIHRoZSBgJ2Vycm9yJ2AgZXZlbnRcclxuICAgIC8vIHRoYXQgd2lsbCBiZSBlbWl0dGVkIGJ5IHRoZSB3ZWJzb2NrZXQuXHJcbiAgICBpZiAod3MuX3NvY2tldCA9PT0gbnVsbCkgcmV0dXJuO1xyXG5cclxuICAgIGlmICh3cy5fc29ja2V0Ll93cml0YWJsZVN0YXRlLmZpbmlzaGVkKSB7XHJcbiAgICAgIGNhbGxiYWNrKCk7XHJcbiAgICAgIGlmIChkdXBsZXguX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZCkgZHVwbGV4LmRlc3Ryb3koKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHdzLl9zb2NrZXQub25jZSgnZmluaXNoJywgZnVuY3Rpb24gZmluaXNoKCkge1xyXG4gICAgICAgIC8vIGBkdXBsZXhgIGlzIG5vdCBkZXN0cm95ZWQgaGVyZSBiZWNhdXNlIHRoZSBgJ2VuZCdgIGV2ZW50IHdpbGwgYmVcclxuICAgICAgICAvLyBlbWl0dGVkIG9uIGBkdXBsZXhgIGFmdGVyIHRoaXMgYCdmaW5pc2gnYCBldmVudC4gVGhlIEVPRiBzaWduYWxpbmdcclxuICAgICAgICAvLyBgbnVsbGAgY2h1bmsgaXMsIGluIGZhY3QsIHB1c2hlZCB3aGVuIHRoZSB3ZWJzb2NrZXQgZW1pdHMgYCdjbG9zZSdgLlxyXG4gICAgICAgIGNhbGxiYWNrKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgICB3cy5jbG9zZSgpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGR1cGxleC5fcmVhZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIGlmICh3cy5pc1BhdXNlZCkgd3MucmVzdW1lKCk7XHJcbiAgfTtcclxuXHJcbiAgZHVwbGV4Ll93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNhbGxiYWNrKSB7XHJcbiAgICBpZiAod3MucmVhZHlTdGF0ZSA9PT0gd3MuQ09OTkVDVElORykge1xyXG4gICAgICB3cy5vbmNlKCdvcGVuJywgZnVuY3Rpb24gb3BlbigpIHtcclxuICAgICAgICBkdXBsZXguX3dyaXRlKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spO1xyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHdzLnNlbmQoY2h1bmssIGNhbGxiYWNrKTtcclxuICB9O1xyXG5cclxuICBkdXBsZXgub24oJ2VuZCcsIGR1cGxleE9uRW5kKTtcclxuICBkdXBsZXgub24oJ2Vycm9yJywgZHVwbGV4T25FcnJvcik7XHJcbiAgcmV0dXJuIGR1cGxleDtcclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVXZWJTb2NrZXRTdHJlYW07XHJcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/ws/lib/stream.js\n");
/***/ }),
/***/ "(ssr)/./node_modules/ws/lib/subprotocol.js":
/*!********************************************!*\
!*** ./node_modules/ws/lib/subprotocol.js ***!
\********************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
eval("\r\n\r\nconst { tokenChars } = __webpack_require__(/*! ./validation */ \"(ssr)/./node_modules/ws/lib/validation.js\");\r\n\r\n/**\r\n * Parses the `Sec-WebSocket-Protocol` header into a set of subprotocol names.\r\n *\r\n * @param {String} header The field value of the header\r\n * @return {Set} The subprotocol names\r\n * @public\r\n */\r\nfunction parse(header) {\r\n const protocols = new Set();\r\n let start = -1;\r\n let end = -1;\r\n let i = 0;\r\n\r\n for (i; i < header.length; i++) {\r\n const code = header.charCodeAt(i);\r\n\r\n if (end === -1 && tokenChars[code] === 1) {\r\n if (start === -1) start = i;\r\n } else if (\r\n i !== 0 &&\r\n (code === 0x20 /* ' ' */ || code === 0x09) /* '\\t' */\r\n ) {\r\n if (end === -1 && start !== -1) end = i;\r\n } else if (code === 0x2c /* ',' */) {\r\n if (start === -1) {\r\n throw new SyntaxError(`Unexpected character at index ${i}`);\r\n }\r\n\r\n if (end === -1) end = i;\r\n\r\n const protocol = header.slice(start, end);\r\n\r\n if (protocols.has(protocol)) {\r\n throw new SyntaxError(`The \"${protocol}\" subprotocol is duplicated`);\r\n }\r\n\r\n protocols.add(protocol);\r\n start = end = -1;\r\n } else {\r\n throw new SyntaxError(`Unexpected character at index ${i}`);\r\n }\r\n }\r\n\r\n if (start === -1 || end !== -1) {\r\n throw new SyntaxError('Unexpected end of input');\r\n }\r\n\r\n const protocol = header.slice(start, i);\r\n\r\n if (protocols.has(protocol)) {\r\n throw new SyntaxError(`The \"${protocol}\" subprotocol is duplicated`);\r\n }\r\n\r\n protocols.add(protocol);\r\n return protocols;\r\n}\r\n\r\nmodule.exports = { parse };\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvd3MvbGliL3N1YnByb3RvY29sLmpzIiwibWFwcGluZ3MiOiJBQUFhO0FBQ2I7QUFDQSxRQUFRLGFBQWEsRUFBRSxtQkFBTyxDQUFDLCtEQUFjO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFlBQVksS0FBSztBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxtQkFBbUI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSwrREFBK0QsRUFBRTtBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxTQUFTO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLDZEQUE2RCxFQUFFO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLFNBQVM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vbmV4dGpzLy4vbm9kZV9tb2R1bGVzL3dzL2xpYi9zdWJwcm90b2NvbC5qcz9hYzE4Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcclxuXHJcbmNvbnN0IHsgdG9rZW5DaGFycyB9ID0gcmVxdWlyZSgnLi92YWxpZGF0aW9uJyk7XHJcblxyXG4vKipcclxuICogUGFyc2VzIHRoZSBgU2VjLVdlYlNvY2tldC1Qcm90b2NvbGAgaGVhZGVyIGludG8gYSBzZXQgb2Ygc3VicHJvdG9jb2wgbmFtZXMuXHJcbiAqXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBoZWFkZXIgVGhlIGZpZWxkIHZhbHVlIG9mIHRoZSBoZWFkZXJcclxuICogQHJldHVybiB7U2V0fSBUaGUgc3VicHJvdG9jb2wgbmFtZXNcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZnVuY3Rpb24gcGFyc2UoaGVhZGVyKSB7XHJcbiAgY29uc3QgcHJvdG9jb2xzID0gbmV3IFNldCgpO1xyXG4gIGxldCBzdGFydCA9IC0xO1xyXG4gIGxldCBlbmQgPSAtMTtcclxuICBsZXQgaSA9IDA7XHJcblxyXG4gIGZvciAoaTsgaSA8IGhlYWRlci5sZW5ndGg7IGkrKykge1xyXG4gICAgY29uc3QgY29kZSA9IGhlYWRlci5jaGFyQ29kZUF0KGkpO1xyXG5cclxuICAgIGlmIChlbmQgPT09IC0xICYmIHRva2VuQ2hhcnNbY29kZV0gPT09IDEpIHtcclxuICAgICAgaWYgKHN0YXJ0ID09PSAtMSkgc3RhcnQgPSBpO1xyXG4gICAgfSBlbHNlIGlmIChcclxuICAgICAgaSAhPT0gMCAmJlxyXG4gICAgICAoY29kZSA9PT0gMHgyMCAvKiAnICcgKi8gfHwgY29kZSA9PT0gMHgwOSkgLyogJ1xcdCcgKi9cclxuICAgICkge1xyXG4gICAgICBpZiAoZW5kID09PSAtMSAmJiBzdGFydCAhPT0gLTEpIGVuZCA9IGk7XHJcbiAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDB4MmMgLyogJywnICovKSB7XHJcbiAgICAgIGlmIChzdGFydCA9PT0gLTEpIHtcclxuICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGF0IGluZGV4ICR7aX1gKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGVuZCA9PT0gLTEpIGVuZCA9IGk7XHJcblxyXG4gICAgICBjb25zdCBwcm90b2NvbCA9IGhlYWRlci5zbGljZShzdGFydCwgZW5kKTtcclxuXHJcbiAgICAgIGlmIChwcm90b2NvbHMuaGFzKHByb3RvY29sKSkge1xyXG4gICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgVGhlIFwiJHtwcm90b2NvbH1cIiBzdWJwcm90b2NvbCBpcyBkdXBsaWNhdGVkYCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHByb3RvY29scy5hZGQocHJvdG9jb2wpO1xyXG4gICAgICBzdGFydCA9IGVuZCA9IC0xO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBVbmV4cGVjdGVkIGNoYXJhY3RlciBhdCBpbmRleCAke2l9YCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpZiAoc3RhcnQgPT09IC0xIHx8IGVuZCAhPT0gLTEpIHtcclxuICAgIHRocm93IG5ldyBTeW50YXhFcnJvcignVW5leHBlY3RlZCBlbmQgb2YgaW5wdXQnKTtcclxuICB9XHJcblxyXG4gIGNvbnN0IHByb3RvY29sID0gaGVhZGVyLnNsaWNlKHN0YXJ0LCBpKTtcclxuXHJcbiAgaWYgKHByb3RvY29scy5oYXMocHJvdG9jb2wpKSB7XHJcbiAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFRoZSBcIiR7cHJvdG9jb2x9XCIgc3VicHJvdG9jb2wgaXMgZHVwbGljYXRlZGApO1xyXG4gIH1cclxuXHJcbiAgcHJvdG9jb2xzLmFkZChwcm90b2NvbCk7XHJcbiAgcmV0dXJuIHByb3RvY29scztcclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7IHBhcnNlIH07XHJcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/ws/lib/subprotocol.js\n");
/***/ }),
/***/ "(ssr)/./node_modules/ws/lib/validation.js":
/*!*******************************************!*\
!*** ./node_modules/ws/lib/validation.js ***!
\*******************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
eval("\r\n\r\nconst { isUtf8 } = __webpack_require__(/*! buffer */ \"buffer\");\r\n\r\nconst { hasBlob } = __webpack_require__(/*! ./constants */ \"(ssr)/./node_modules/ws/lib/constants.js\");\r\n\r\n//\r\n// Allowed token characters:\r\n//\r\n// '!', '#', '$', '%', '&', ''', '*', '+', '-',\r\n// '.', 0-9, A-Z, '^', '_', '`', a-z, '|', '~'\r\n//\r\n// tokenChars[32] === 0 // ' '\r\n// tokenChars[33] === 1 // '!'\r\n// tokenChars[34] === 0 // '\"'\r\n// ...\r\n//\r\n// prettier-ignore\r\nconst tokenChars = [\r\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0 - 15\r\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16 - 31\r\n 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, // 32 - 47\r\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, // 48 - 63\r\n 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64 - 79\r\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, // 80 - 95\r\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96 - 111\r\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0 // 112 - 127\r\n];\r\n\r\n/**\r\n * Checks if a status code is allowed in a close frame.\r\n *\r\n * @param {Number} code The status code\r\n * @return {Boolean} `true` if the status code is valid, else `false`\r\n * @public\r\n */\r\nfunction isValidStatusCode(code) {\r\n return (\r\n (code >= 1000 &&\r\n code <= 1014 &&\r\n code !== 1004 &&\r\n code !== 1005 &&\r\n code !== 1006) ||\r\n (code >= 3000 && code <= 4999)\r\n );\r\n}\r\n\r\n/**\r\n * Checks if a given buffer contains only correct UTF-8.\r\n * Ported from https://www.cl.cam.ac.uk/%7Emgk25/ucs/utf8_check.c by\r\n * Markus Kuhn.\r\n *\r\n * @param {Buffer} buf The buffer to check\r\n * @return {Boolean} `true` if `buf` contains only correct UTF-8, else `false`\r\n * @public\r\n */\r\nfunction _isValidUTF8(buf) {\r\n const len = buf.length;\r\n let i = 0;\r\n\r\n while (i < len) {\r\n if ((buf[i] & 0x80) === 0) {\r\n // 0xxxxxxx\r\n i++;\r\n } else if ((buf[i] & 0xe0) === 0xc0) {\r\n // 110xxxxx 10xxxxxx\r\n if (\r\n i + 1 === len ||\r\n (buf[i + 1] & 0xc0) !== 0x80 ||\r\n (buf[i] & 0xfe) === 0xc0 // Overlong\r\n ) {\r\n return false;\r\n }\r\n\r\n i += 2;\r\n } else if ((buf[i] & 0xf0) === 0xe0) {\r\n // 1110xxxx 10xxxxxx 10xxxxxx\r\n if (\r\n i + 2 >= len ||\r\n (buf[i + 1] & 0xc0) !== 0x80 ||\r\n (buf[i + 2] & 0xc0) !== 0x80 ||\r\n (buf[i] === 0xe0 && (buf[i + 1] & 0xe0) === 0x80) || // Overlong\r\n (buf[i] === 0xed && (buf[i + 1] & 0xe0) === 0xa0) // Surrogate (U+D800 - U+DFFF)\r\n ) {\r\n return false;\r\n }\r\n\r\n i += 3;\r\n } else if ((buf[i] & 0xf8) === 0xf0) {\r\n // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx\r\n if (\r\n i + 3 >= len ||\r\n (buf[i + 1] & 0xc0) !== 0x80 ||\r\n (buf[i + 2] & 0xc0) !== 0x80 ||\r\n (buf[i + 3] & 0xc0) !== 0x80 ||\r\n (buf[i] === 0xf0 && (buf[i + 1] & 0xf0) === 0x80) || // Overlong\r\n (buf[i] === 0xf4 && buf[i + 1] > 0x8f) ||\r\n buf[i] > 0xf4 // > U+10FFFF\r\n ) {\r\n return false;\r\n }\r\n\r\n i += 4;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\n/**\r\n * Determines whether a value is a `Blob`.\r\n *\r\n * @param {*} value The value to be tested\r\n * @return {Boolean} `true` if `value` is a `Blob`, else `false`\r\n * @private\r\n */\r\nfunction isBlob(value) {\r\n return (\r\n hasBlob &&\r\n typeof value === 'object' &&\r\n typeof value.arrayBuffer === 'function' &&\r\n typeof value.type === 'string' &&\r\n typeof value.stream === 'function' &&\r\n (value[Symbol.toStringTag] === 'Blob' ||\r\n value[Symbol.toStringTag] === 'File')\r\n );\r\n}\r\n\r\nmodule.exports = {\r\n isBlob,\r\n isValidStatusCode,\r\n isValidUTF8: _isValidUTF8,\r\n tokenChars\r\n};\r\n\r\nif (isUtf8) {\r\n module.exports.isValidUTF8 = function (buf) {\r\n return buf.length < 24 ? _isValidUTF8(buf) : isUtf8(buf);\r\n };\r\n} /* istanbul ignore else */ else if (!process.env.WS_NO_UTF_8_VALIDATE) {\r\n try {\r\n const isValidUTF8 = __webpack_require__(Object(function webpackMissingModule() { var e = new Error(\"Cannot find module 'utf-8-validate'\"); e.code = 'MODULE_NOT_FOUND'; throw e; }()));\r\n\r\n module.exports.isValidUTF8 = function (buf) {\r\n return buf.length < 32 ? _isValidUTF8(buf) : isValidUTF8(buf);\r\n };\r\n } catch (e) {\r\n // Continue regardless of the error.\r\n }\r\n}\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvd3MvbGliL3ZhbGlkYXRpb24uanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYjtBQUNBLFFBQVEsU0FBUyxFQUFFLG1CQUFPLENBQUMsc0JBQVE7QUFDbkM7QUFDQSxRQUFRLFVBQVUsRUFBRSxtQkFBTyxDQUFDLDZEQUFhO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixZQUFZLFNBQVM7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFlBQVksU0FBUztBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLFlBQVksU0FBUztBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsMEJBQTBCO0FBQzVCO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQSx3QkFBd0IsbUJBQU8sQ0FBQyw2SUFBZ0I7QUFDaEQ7QUFDQSxJQUFJLDBCQUEwQjtBQUM5QjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL25leHRqcy8uL25vZGVfbW9kdWxlcy93cy9saWIvdmFsaWRhdGlvbi5qcz9kYmU3Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcclxuXHJcbmNvbnN0IHsgaXNVdGY4IH0gPSByZXF1aXJlKCdidWZmZXInKTtcclxuXHJcbmNvbnN0IHsgaGFzQmxvYiB9ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKTtcclxuXHJcbi8vXHJcbi8vIEFsbG93ZWQgdG9rZW4gY2hhcmFjdGVyczpcclxuLy9cclxuLy8gJyEnLCAnIycsICckJywgJyUnLCAnJicsICcnJywgJyonLCAnKycsICctJyxcclxuLy8gJy4nLCAwLTksIEEtWiwgJ14nLCAnXycsICdgJywgYS16LCAnfCcsICd+J1xyXG4vL1xyXG4vLyB0b2tlbkNoYXJzWzMyXSA9PT0gMCAvLyAnICdcclxuLy8gdG9rZW5DaGFyc1szM10gPT09IDEgLy8gJyEnXHJcbi8vIHRva2VuQ2hhcnNbMzRdID09PSAwIC8vICdcIidcclxuLy8gLi4uXHJcbi8vXHJcbi8vIHByZXR0aWVyLWlnbm9yZVxyXG5jb25zdCB0b2tlbkNoYXJzID0gW1xyXG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vIDAgLSAxNVxyXG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vIDE2IC0gMzFcclxuICAwLCAxLCAwLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAxLCAxLCAwLCAxLCAxLCAwLCAvLyAzMiAtIDQ3XHJcbiAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgLy8gNDggLSA2M1xyXG4gIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8vIDY0IC0gNzlcclxuICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAxLCAxLCAvLyA4MCAtIDk1XHJcbiAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgLy8gOTYgLSAxMTFcclxuICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAxLCAwLCAxLCAwIC8vIDExMiAtIDEyN1xyXG5dO1xyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBpZiBhIHN0YXR1cyBjb2RlIGlzIGFsbG93ZWQgaW4gYSBjbG9zZSBmcmFtZS5cclxuICpcclxuICogQHBhcmFtIHtOdW1iZXJ9IGNvZGUgVGhlIHN0YXR1cyBjb2RlXHJcbiAqIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgc3RhdHVzIGNvZGUgaXMgdmFsaWQsIGVsc2UgYGZhbHNlYFxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5mdW5jdGlvbiBpc1ZhbGlkU3RhdHVzQ29kZShjb2RlKSB7XHJcbiAgcmV0dXJuIChcclxuICAgIChjb2RlID49IDEwMDAgJiZcclxuICAgICAgY29kZSA8PSAxMDE0ICYmXHJcbiAgICAgIGNvZGUgIT09IDEwMDQgJiZcclxuICAgICAgY29kZSAhPT0gMTAwNSAmJlxyXG4gICAgICBjb2RlICE9PSAxMDA2KSB8fFxyXG4gICAgKGNvZGUgPj0gMzAwMCAmJiBjb2RlIDw9IDQ5OTkpXHJcbiAgKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBpZiBhIGdpdmVuIGJ1ZmZlciBjb250YWlucyBvbmx5IGNvcnJlY3QgVVRGLTguXHJcbiAqIFBvcnRlZCBmcm9tIGh0dHBzOi8vd3d3LmNsLmNhbS5hYy51ay8lN0VtZ2syNS91Y3MvdXRmOF9jaGVjay5jIGJ5XHJcbiAqIE1hcmt1cyBLdWhuLlxyXG4gKlxyXG4gKiBAcGFyYW0ge0J1ZmZlcn0gYnVmIFRoZSBidWZmZXIgdG8gY2hlY2tcclxuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIGBidWZgIGNvbnRhaW5zIG9ubHkgY29ycmVjdCBVVEYtOCwgZWxzZSBgZmFsc2VgXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmZ1bmN0aW9uIF9pc1ZhbGlkVVRGOChidWYpIHtcclxuICBjb25zdCBsZW4gPSBidWYubGVuZ3RoO1xyXG4gIGxldCBpID0gMDtcclxuXHJcbiAgd2hpbGUgKGkgPCBsZW4pIHtcclxuICAgIGlmICgoYnVmW2ldICYgMHg4MCkgPT09IDApIHtcclxuICAgICAgLy8gMHh4eHh4eHhcclxuICAgICAgaSsrO1xyXG4gICAgfSBlbHNlIGlmICgoYnVmW2ldICYgMHhlMCkgPT09IDB4YzApIHtcclxuICAgICAgLy8gMTEweHh4eHggMTB4eHh4eHhcclxuICAgICAgaWYgKFxyXG4gICAgICAgIGkgKyAxID09PSBsZW4gfHxcclxuICAgICAgICAoYnVmW2kgKyAxXSAmIDB4YzApICE9PSAweDgwIHx8XHJcbiAgICAgICAgKGJ1ZltpXSAmIDB4ZmUpID09PSAweGMwIC8vIE92ZXJsb25nXHJcbiAgICAgICkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaSArPSAyO1xyXG4gICAgfSBlbHNlIGlmICgoYnVmW2ldICYgMHhmMCkgPT09IDB4ZTApIHtcclxuICAgICAgLy8gMTExMHh4eHggMTB4eHh4eHggMTB4eHh4eHhcclxuICAgICAgaWYgKFxyXG4gICAgICAgIGkgKyAyID49IGxlbiB8fFxyXG4gICAgICAgIChidWZbaSArIDFdICYgMHhjMCkgIT09IDB4ODAgfHxcclxuICAgICAgICAoYnVmW2kgKyAyXSAmIDB4YzApICE9PSAweDgwIHx8XHJcbiAgICAgICAgKGJ1ZltpXSA9PT0gMHhlMCAmJiAoYnVmW2kgKyAxXSAmIDB4ZTApID09PSAweDgwKSB8fCAvLyBPdmVybG9uZ1xyXG4gICAgICAgIChidWZbaV0gPT09IDB4ZWQgJiYgKGJ1ZltpICsgMV0gJiAweGUwKSA9PT0gMHhhMCkgLy8gU3Vycm9nYXRlIChVK0Q4MDAgLSBVK0RGRkYpXHJcbiAgICAgICkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaSArPSAzO1xyXG4gICAgfSBlbHNlIGlmICgoYnVmW2ldICYgMHhmOCkgPT09IDB4ZjApIHtcclxuICAgICAgLy8gMTExMTB4eHggMTB4eHh4eHggMTB4eHh4eHggMTB4eHh4eHhcclxuICAgICAgaWYgKFxyXG4gICAgICAgIGkgKyAzID49IGxlbiB8fFxyXG4gICAgICAgIChidWZbaSArIDFdICYgMHhjMCkgIT09IDB4ODAgfHxcclxuICAgICAgICAoYnVmW2kgKyAyXSAmIDB4YzApICE9PSAweDgwIHx8XHJcbiAgICAgICAgKGJ1ZltpICsgM10gJiAweGMwKSAhPT0gMHg4MCB8fFxyXG4gICAgICAgIChidWZbaV0gPT09IDB4ZjAgJiYgKGJ1ZltpICsgMV0gJiAweGYwKSA9PT0gMHg4MCkgfHwgLy8gT3ZlcmxvbmdcclxuICAgICAgICAoYnVmW2ldID09PSAweGY0ICYmIGJ1ZltpICsgMV0gPiAweDhmKSB8fFxyXG4gICAgICAgIGJ1ZltpXSA+IDB4ZjQgLy8gPiBVKzEwRkZGRlxyXG4gICAgICApIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGkgKz0gNDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiB0cnVlO1xyXG59XHJcblxyXG4vKipcclxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgdmFsdWUgaXMgYSBgQmxvYmAuXHJcbiAqXHJcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGJlIHRlc3RlZFxyXG4gKiBAcmV0dXJuIHtCb29sZWFufSBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGBCbG9iYCwgZWxzZSBgZmFsc2VgXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5mdW5jdGlvbiBpc0Jsb2IodmFsdWUpIHtcclxuICByZXR1cm4gKFxyXG4gICAgaGFzQmxvYiAmJlxyXG4gICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxyXG4gICAgdHlwZW9mIHZhbHVlLmFycmF5QnVmZmVyID09PSAnZnVuY3Rpb24nICYmXHJcbiAgICB0eXBlb2YgdmFsdWUudHlwZSA9PT0gJ3N0cmluZycgJiZcclxuICAgIHR5cGVvZiB2YWx1ZS5zdHJlYW0gPT09ICdmdW5jdGlvbicgJiZcclxuICAgICh2YWx1ZVtTeW1ib2wudG9TdHJpbmdUYWddID09PSAnQmxvYicgfHxcclxuICAgICAgdmFsdWVbU3ltYm9sLnRvU3RyaW5nVGFnXSA9PT0gJ0ZpbGUnKVxyXG4gICk7XHJcbn1cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG4gIGlzQmxvYixcclxuICBpc1ZhbGlkU3RhdHVzQ29kZSxcclxuICBpc1ZhbGlkVVRGODogX2lzVmFsaWRVVEY4LFxyXG4gIHRva2VuQ2hhcnNcclxufTtcclxuXHJcbmlmIChpc1V0ZjgpIHtcclxuICBtb2R1bGUuZXhwb3J0cy5pc1ZhbGlkVVRGOCA9IGZ1bmN0aW9uIChidWYpIHtcclxuICAgIHJldHVybiBidWYubGVuZ3RoIDwgMjQgPyBfaXNWYWxpZFVURjgoYnVmKSA6IGlzVXRmOChidWYpO1xyXG4gIH07XHJcbn0gLyogaXN0YW5idWwgaWdub3JlIGVsc2UgICovIGVsc2UgaWYgKCFwcm9jZXNzLmVudi5XU19OT19VVEZfOF9WQUxJREFURSkge1xyXG4gIHRyeSB7XHJcbiAgICBjb25zdCBpc1ZhbGlkVVRGOCA9IHJlcXVpcmUoJ3V0Zi04LXZhbGlkYXRlJyk7XHJcblxyXG4gICAgbW9kdWxlLmV4cG9ydHMuaXNWYWxpZFVURjggPSBmdW5jdGlvbiAoYnVmKSB7XHJcbiAgICAgIHJldHVybiBidWYubGVuZ3RoIDwgMzIgPyBfaXNWYWxpZFVURjgoYnVmKSA6IGlzVmFsaWRVVEY4KGJ1Zik7XHJcbiAgICB9O1xyXG4gIH0gY2F0Y2ggKGUpIHtcclxuICAgIC8vIENvbnRpbnVlIHJlZ2FyZGxlc3Mgb2YgdGhlIGVycm9yLlxyXG4gIH1cclxufVxyXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/ws/lib/validation.js\n");
/***/ }),
/***/ "(ssr)/./node_modules/ws/lib/websocket-server.js":
/*!*************************************************!*\
!*** ./node_modules/ws/lib/websocket-server.js ***!
\*************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
eval("/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex$\", \"caughtErrors\": \"none\" }] */\r\n\r\n\r\n\r\nconst EventEmitter = __webpack_require__(/*! events */ \"events\");\r\nconst http = __webpack_require__(/*! http */ \"http\");\r\nconst { Duplex } = __webpack_require__(/*! stream */ \"stream\");\r\nconst { createHash } = __webpack_require__(/*! crypto */ \"crypto\");\r\n\r\nconst extension = __webpack_require__(/*! ./extension */ \"(ssr)/./node_modules/ws/lib/extension.js\");\r\nconst PerMessageDeflate = __webpack_require__(/*! ./permessage-deflate */ \"(ssr)/./node_modules/ws/lib/permessage-deflate.js\");\r\nconst subprotocol = __webpack_require__(/*! ./subprotocol */ \"(ssr)/./node_modules/ws/lib/subprotocol.js\");\r\nconst WebSocket = __webpack_require__(/*! ./websocket */ \"(ssr)/./node_modules/ws/lib/websocket.js\");\r\nconst { GUID, kWebSocket } = __webpack_require__(/*! ./constants */ \"(ssr)/./node_modules/ws/lib/constants.js\");\r\n\r\nconst keyRegex = /^[+/0-9A-Za-z]{22}==$/;\r\n\r\nconst RUNNING = 0;\r\nconst CLOSING = 1;\r\nconst CLOSED = 2;\r\n\r\n/**\r\n * Class representing a WebSocket server.\r\n *\r\n * @extends EventEmitter\r\n */\r\nclass WebSocketServer extends EventEmitter {\r\n /**\r\n * Create a `WebSocketServer` instance.\r\n *\r\n * @param {Object} options Configuration options\r\n * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether\r\n * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted\r\n * multiple times in the same tick\r\n * @param {Boolean} [options.autoPong=true] Specifies whether or not to\r\n * automatically send a pong in response to a ping\r\n * @param {Number} [options.backlog=511] The maximum length of the queue of\r\n * pending connections\r\n * @param {Boolean} [options.clientTracking=true] Specifies whether or not to\r\n * track clients\r\n * @param {Function} [options.handleProtocols] A hook to handle protocols\r\n * @param {String} [options.host] The hostname where to bind the server\r\n * @param {Number} [options.maxPayload=104857600] The maximum allowed message\r\n * size\r\n * @param {Boolean} [options.noServer=false] Enable no server mode\r\n * @param {String} [options.path] Accept only connections matching this path\r\n * @param {(Boolean|Object)} [options.perMessageDeflate=false] Enable/disable\r\n * permessage-deflate\r\n * @param {Number} [options.port] The port where to bind the server\r\n * @param {(http.Server|https.Server)} [options.server] A pre-created HTTP/S\r\n * server to use\r\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\r\n * not to skip UTF-8 validation for text and close messages\r\n * @param {Function} [options.verifyClient] A hook to reject connections\r\n * @param {Function} [options.WebSocket=WebSocket] Specifies the `WebSocket`\r\n * class to use. It must be the `WebSocket` class or class that extends it\r\n * @param {Function} [callback] A listener for the `listening` event\r\n */\r\n constructor(options, callback) {\r\n super();\r\n\r\n options = {\r\n allowSynchronousEvents: true,\r\n autoPong: true,\r\n maxPayload: 100 * 1024 * 1024,\r\n skipUTF8Validation: false,\r\n perMessageDeflate: false,\r\n handleProtocols: null,\r\n clientTracking: true,\r\n verifyClient: null,\r\n noServer: false,\r\n backlog: null, // use default (511 as implemented in net.js)\r\n server: null,\r\n host: null,\r\n path: null,\r\n port: null,\r\n WebSocket,\r\n ...options\r\n };\r\n\r\n if (\r\n (options.port == null && !options.server && !options.noServer) ||\r\n (options.port != null && (options.server || options.noServer)) ||\r\n (options.server && options.noServer)\r\n ) {\r\n throw new TypeError(\r\n 'One and only one of the \"port\", \"server\", or \"noServer\" options ' +\r\n 'must be specified'\r\n );\r\n }\r\n\r\n if (options.port != null) {\r\n this._server = http.createServer((req, res) => {\r\n const body = http.STATUS_CODES[426];\r\n\r\n res.writeHead(426, {\r\n 'Content-Length': body.length,\r\n 'Content-Type': 'text/plain'\r\n });\r\n res.end(body);\r\n });\r\n this._server.listen(\r\n options.port,\r\n options.host,\r\n options.backlog,\r\n callback\r\n );\r\n } else if (options.server) {\r\n this._server = options.server;\r\n }\r\n\r\n if (this._server) {\r\n const emitConnection = this.emit.bind(this, 'connection');\r\n\r\n this._removeListeners = addListeners(this._server, {\r\n listening: this.emit.bind(this, 'listening'),\r\n error: this.emit.bind(this, 'error'),\r\n upgrade: (req, socket, head) => {\r\n this.handleUpgrade(req, socket, head, emitConnection);\r\n }\r\n });\r\n }\r\n\r\n if (options.perMessageDeflate === true) options.perMessageDeflate = {};\r\n if (options.clientTracking) {\r\n this.clients = new Set();\r\n this._shouldEmitClose = false;\r\n }\r\n\r\n this.options = options;\r\n this._state = RUNNING;\r\n }\r\n\r\n /**\r\n * Returns the bound address, the address family name, and port of the server\r\n * as reported by the operating system if listening on an IP socket.\r\n * If the server is listening on a pipe or UNIX domain socket, the name is\r\n * returned as a string.\r\n *\r\n * @return {(Object|String|null)} The address of the server\r\n * @public\r\n */\r\n address() {\r\n if (this.options.noServer) {\r\n throw new Error('The server is operating in \"noServer\" mode');\r\n }\r\n\r\n if (!this._server) return null;\r\n return this._server.address();\r\n }\r\n\r\n /**\r\n * Stop the server from accepting new connections and emit the `'close'` event\r\n * when all existing connections are closed.\r\n *\r\n * @param {Function} [cb] A one-time listener for the `'close'` event\r\n * @public\r\n */\r\n close(cb) {\r\n if (this._state === CLOSED) {\r\n if (cb) {\r\n this.once('close', () => {\r\n cb(new Error('The server is not running'));\r\n });\r\n }\r\n\r\n process.nextTick(emitClose, this);\r\n return;\r\n }\r\n\r\n if (cb) this.once('close', cb);\r\n\r\n if (this._state === CLOSING) return;\r\n this._state = CLOSING;\r\n\r\n if (this.options.noServer || this.options.server) {\r\n if (this._server) {\r\n this._removeListeners();\r\n this._removeListeners = this._server = null;\r\n }\r\n\r\n if (this.clients) {\r\n if (!this.clients.size) {\r\n process.nextTick(emitClose, this);\r\n } else {\r\n this._shouldEmitClose = true;\r\n }\r\n } else {\r\n process.nextTick(emitClose, this);\r\n }\r\n } else {\r\n const server = this._server;\r\n\r\n this._removeListeners();\r\n this._removeListeners = this._server = null;\r\n\r\n //\r\n // The HTTP/S server was created internally. Close it, and rely on its\r\n // `'close'` event.\r\n //\r\n server.close(() => {\r\n emitClose(this);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * See if a given request should be handled by this server instance.\r\n *\r\n * @param {http.IncomingMessage} req Request object to inspect\r\n * @return {Boolean} `true` if the request is valid, else `false`\r\n * @public\r\n */\r\n shouldHandle(req) {\r\n if (this.options.path) {\r\n const index = req.url.indexOf('?');\r\n const pathname = index !== -1 ? req.url.slice(0, index) : req.url;\r\n\r\n if (pathname !== this.options.path) return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Handle a HTTP Upgrade request.\r\n *\r\n * @param {http.IncomingMessage} req The request object\r\n * @param {Duplex} socket The network socket between the server and client\r\n * @param {Buffer} head The first packet of the upgraded stream\r\n * @param {Function} cb Callback\r\n * @public\r\n */\r\n handleUpgrade(req, socket, head, cb) {\r\n socket.on('error', socketOnError);\r\n\r\n const key = req.headers['sec-websocket-key'];\r\n const upgrade = req.headers.upgrade;\r\n const version = +req.headers['sec-websocket-version'];\r\n\r\n if (req.method !== 'GET') {\r\n const message = 'Invalid HTTP method';\r\n abortHandshakeOrEmitwsClientError(this, req, socket, 405, message);\r\n return;\r\n }\r\n\r\n if (upgrade === undefined || upgrade.toLowerCase() !== 'websocket') {\r\n const message = 'Invalid Upgrade header';\r\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\r\n return;\r\n }\r\n\r\n if (key === undefined || !keyRegex.test(key)) {\r\n const message = 'Missing or invalid Sec-WebSocket-Key header';\r\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\r\n return;\r\n }\r\n\r\n if (version !== 13 && version !== 8) {\r\n const message = 'Missing or invalid Sec-WebSocket-Version header';\r\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message, {\r\n 'Sec-WebSocket-Version': '13, 8'\r\n });\r\n return;\r\n }\r\n\r\n if (!this.shouldHandle(req)) {\r\n abortHandshake(socket, 400);\r\n return;\r\n }\r\n\r\n const secWebSocketProtocol = req.headers['sec-websocket-protocol'];\r\n let protocols = new Set();\r\n\r\n if (secWebSocketProtocol !== undefined) {\r\n try {\r\n protocols = subprotocol.parse(secWebSocketProtocol);\r\n } catch (err) {\r\n const message = 'Invalid Sec-WebSocket-Protocol header';\r\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\r\n return;\r\n }\r\n }\r\n\r\n const secWebSocketExtensions = req.headers['sec-websocket-extensions'];\r\n const extensions = {};\r\n\r\n if (\r\n this.options.perMessageDeflate &&\r\n secWebSocketExtensions !== undefined\r\n ) {\r\n const perMessageDeflate = new PerMessageDeflate(\r\n this.options.perMessageDeflate,\r\n true,\r\n this.options.maxPayload\r\n );\r\n\r\n try {\r\n const offers = extension.parse(secWebSocketExtensions);\r\n\r\n if (offers[PerMessageDeflate.extensionName]) {\r\n perMessageDeflate.accept(offers[PerMessageDeflate.extensionName]);\r\n extensions[PerMessageDeflate.extensionName] = perMessageDeflate;\r\n }\r\n } catch (err) {\r\n const message =\r\n 'Invalid or unacceptable Sec-WebSocket-Extensions header';\r\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\r\n return;\r\n }\r\n }\r\n\r\n //\r\n // Optionally call external client verification handler.\r\n //\r\n if (this.options.verifyClient) {\r\n const info = {\r\n origin:\r\n req.headers[`${version === 8 ? 'sec-websocket-origin' : 'origin'}`],\r\n secure: !!(req.socket.authorized || req.socket.encrypted),\r\n req\r\n };\r\n\r\n if (this.options.verifyClient.length === 2) {\r\n this.options.verifyClient(info, (verified, code, message, headers) => {\r\n if (!verified) {\r\n return abortHandshake(socket, code || 401, message, headers);\r\n }\r\n\r\n this.completeUpgrade(\r\n extensions,\r\n key,\r\n protocols,\r\n req,\r\n socket,\r\n head,\r\n cb\r\n );\r\n });\r\n return;\r\n }\r\n\r\n if (!this.options.verifyClient(info)) return abortHandshake(socket, 401);\r\n }\r\n\r\n this.completeUpgrade(extensions, key, protocols, req, socket, head, cb);\r\n }\r\n\r\n /**\r\n * Upgrade the connection to WebSocket.\r\n *\r\n * @param {Object} extensions The accepted extensions\r\n * @param {String} key The value of the `Sec-WebSocket-Key` header\r\n * @param {Set} protocols The subprotocols\r\n * @param {http.IncomingMessage} req The request object\r\n * @param {Duplex} socket The network socket between the server and client\r\n * @param {Buffer} head The first packet of the upgraded stream\r\n * @param {Function} cb Callback\r\n * @throws {Error} If called more than once with the same socket\r\n * @private\r\n */\r\n completeUpgrade(extensions, key, protocols, req, socket, head, cb) {\r\n //\r\n // Destroy the socket if the client has already sent a FIN packet.\r\n //\r\n if (!socket.readable || !socket.writable) return socket.destroy();\r\n\r\n if (socket[kWebSocket]) {\r\n throw new Error(\r\n 'server.handleUpgrade() was called more than once with the same ' +\r\n 'socket, possibly due to a misconfiguration'\r\n );\r\n }\r\n\r\n if (this._state > RUNNING) return abortHandshake(socket, 503);\r\n\r\n const digest = createHash('sha1')\r\n .update(key + GUID)\r\n .digest('base64');\r\n\r\n const headers = [\r\n 'HTTP/1.1 101 Switching Protocols',\r\n 'Upgrade: websocket',\r\n 'Connection: Upgrade',\r\n `Sec-WebSocket-Accept: ${digest}`\r\n ];\r\n\r\n const ws = new this.options.WebSocket(null, undefined, this.options);\r\n\r\n if (protocols.size) {\r\n //\r\n // Optionally call external protocol selection handler.\r\n //\r\n const protocol = this.options.handleProtocols\r\n ? this.options.handleProtocols(protocols, req)\r\n : protocols.values().next().value;\r\n\r\n if (protocol) {\r\n headers.push(`Sec-WebSocket-Protocol: ${protocol}`);\r\n ws._protocol = protocol;\r\n }\r\n }\r\n\r\n if (extensions[PerMessageDeflate.extensionName]) {\r\n const params = extensions[PerMessageDeflate.extensionName].params;\r\n const value = extension.format({\r\n [PerMessageDeflate.extensionName]: [params]\r\n });\r\n headers.push(`Sec-WebSocket-Extensions: ${value}`);\r\n ws._extensions = extensions;\r\n }\r\n\r\n //\r\n // Allow external modification/inspection of handshake headers.\r\n //\r\n this.emit('headers', headers, req);\r\n\r\n socket.write(headers.concat('\\r\\n').join('\\r\\n'));\r\n socket.removeListener('error', socketOnError);\r\n\r\n ws.setSocket(socket, head, {\r\n allowSynchronousEvents: this.options.allowSynchronousEvents,\r\n maxPayload: this.options.maxPayload,\r\n skipUTF8Validation: this.options.skipUTF8Validation\r\n });\r\n\r\n if (this.clients) {\r\n this.clients.add(ws);\r\n ws.on('close', () => {\r\n this.clients.delete(ws);\r\n\r\n if (this._shouldEmitClose && !this.clients.size) {\r\n process.nextTick(emitClose, this);\r\n }\r\n });\r\n }\r\n\r\n cb(ws, req);\r\n }\r\n}\r\n\r\nmodule.exports = WebSocketServer;\r\n\r\n/**\r\n * Add event listeners on an `EventEmitter` using a map of <event, listener>\r\n * pairs.\r\n *\r\n * @param {EventEmitter} server The event emitter\r\n * @param {Object.<String, Function>} map The listeners to add\r\n * @return {Function} A function that will remove the added listeners when\r\n * called\r\n * @private\r\n */\r\nfunction addListeners(server, map) {\r\n for (const event of Object.keys(map)) server.on(event, map[event]);\r\n\r\n return function removeListeners() {\r\n for (const event of Object.keys(map)) {\r\n server.removeListener(event, map[event]);\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Emit a `'close'` event on an `EventEmitter`.\r\n *\r\n * @param {EventEmitter} server The event emitter\r\n * @private\r\n */\r\nfunction emitClose(server) {\r\n server._state = CLOSED;\r\n server.emit('close');\r\n}\r\n\r\n/**\r\n * Handle socket errors.\r\n *\r\n * @private\r\n */\r\nfunction socketOnError() {\r\n this.destroy();\r\n}\r\n\r\n/**\r\n * Close the connection when preconditions are not fulfilled.\r\n *\r\n * @param {Duplex} socket The socket of the upgrade request\r\n * @param {Number} code The HTTP response status code\r\n * @param {String} [message] The HTTP response body\r\n * @param {Object} [headers] Additional HTTP response headers\r\n * @private\r\n */\r\nfunction abortHandshake(socket, code, message, headers) {\r\n //\r\n // The socket is writable unless the user destroyed or ended it before calling\r\n // `server.handleUpgrade()` or in the `verifyClient` function, which is a user\r\n // error. Handling this does not make much sense as the worst that can happen\r\n // is that some of the data written by the user might be discarded due to the\r\n // call to `socket.end()` below, which triggers an `'error'` event that in\r\n // turn causes the socket to be destroyed.\r\n //\r\n message = message || http.STATUS_CODES[code];\r\n headers = {\r\n Connection: 'close',\r\n 'Content-Type': 'text/html',\r\n 'Content-Length': Buffer.byteLength(message),\r\n ...headers\r\n };\r\n\r\n socket.once('finish', socket.destroy);\r\n\r\n socket.end(\r\n `HTTP/1.1 ${code} ${http.STATUS_CODES[code]}\\r\\n` +\r\n Object.keys(headers)\r\n .map((h) => `${h}: ${headers[h]}`)\r\n .join('\\r\\n') +\r\n '\\r\\n\\r\\n' +\r\n message\r\n );\r\n}\r\n\r\n/**\r\n * Emit a `'wsClientError'` event on a `WebSocketServer` if there is at least\r\n * one listener for it, otherwise call `abortHandshake()`.\r\n *\r\n * @param {WebSocketServer} server The WebSocket server\r\n * @param {http.IncomingMessage} req The request object\r\n * @param {Duplex} socket The socket of the upgrade request\r\n * @param {Number} code The HTTP response status code\r\n * @param {String} message The HTTP response body\r\n * @param {Object} [headers] The HTTP response headers\r\n * @private\r\n */\r\nfunction abortHandshakeOrEmitwsClientError(\r\n server,\r\n req,\r\n socket,\r\n code,\r\n message,\r\n headers\r\n) {\r\n if (server.listenerCount('wsClientError')) {\r\n const err = new Error(message);\r\n Error.captureStackTrace(err, abortHandshakeOrEmitwsClientError);\r\n\r\n server.emit('wsClientError', err, socket, req);\r\n } else {\r\n abortHandshake(socket, code, message, headers);\r\n }\r\n}\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvd3MvbGliL3dlYnNvY2tldC1zZXJ2ZXIuanMiLCJtYXBwaW5ncyI6IkFBQUEsc0NBQXNDLHlEQUF5RDtBQUMvRjtBQUNhO0FBQ2I7QUFDQSxxQkFBcUIsbUJBQU8sQ0FBQyxzQkFBUTtBQUNyQyxhQUFhLG1CQUFPLENBQUMsa0JBQU07QUFDM0IsUUFBUSxTQUFTLEVBQUUsbUJBQU8sQ0FBQyxzQkFBUTtBQUNuQyxRQUFRLGFBQWEsRUFBRSxtQkFBTyxDQUFDLHNCQUFRO0FBQ3ZDO0FBQ0Esa0JBQWtCLG1CQUFPLENBQUMsNkRBQWE7QUFDdkMsMEJBQTBCLG1CQUFPLENBQUMsK0VBQXNCO0FBQ3hELG9CQUFvQixtQkFBTyxDQUFDLGlFQUFlO0FBQzNDLGtCQUFrQixtQkFBTyxDQUFDLDZEQUFhO0FBQ3ZDLFFBQVEsbUJBQW1CLEVBQUUsbUJBQU8sQ0FBQyw2REFBYTtBQUNsRDtBQUNBLGlDQUFpQyxHQUFHO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQSxhQUFhLFVBQVU7QUFDdkIsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGFBQWEsU0FBUztBQUN0QixhQUFhLFFBQVE7QUFDckIsYUFBYSxrQkFBa0I7QUFDL0I7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSw0QkFBNEI7QUFDekM7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQSxhQUFhLFVBQVU7QUFDdkIsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLHNCQUFzQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLHNCQUFzQjtBQUNuQyxjQUFjLFNBQVM7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLHNCQUFzQjtBQUNuQyxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsa0RBQWtEO0FBQzNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsYUFBYSxLQUFLO0FBQ2xCLGFBQWEsc0JBQXNCO0FBQ25DLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsYUFBYSxVQUFVO0FBQ3ZCLGNBQWMsT0FBTztBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixPQUFPO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdELFNBQVM7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxnREFBZ0QsTUFBTTtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsY0FBYztBQUN6QixXQUFXLDJCQUEyQjtBQUN0QyxZQUFZLFVBQVU7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGNBQWM7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsTUFBTSxFQUFFLHdCQUF3QjtBQUNoRDtBQUNBLHVCQUF1QixFQUFFLElBQUksV0FBVztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsaUJBQWlCO0FBQzVCLFdBQVcsc0JBQXNCO0FBQ2pDLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vbmV4dGpzLy4vbm9kZV9tb2R1bGVzL3dzL2xpYi93ZWJzb2NrZXQtc2VydmVyLmpzPzQ3ZGIiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50IG5vLXVudXNlZC12YXJzOiBbXCJlcnJvclwiLCB7IFwidmFyc0lnbm9yZVBhdHRlcm5cIjogXCJeRHVwbGV4JFwiLCBcImNhdWdodEVycm9yc1wiOiBcIm5vbmVcIiB9XSAqL1xyXG5cclxuJ3VzZSBzdHJpY3QnO1xyXG5cclxuY29uc3QgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnZXZlbnRzJyk7XHJcbmNvbnN0IGh0dHAgPSByZXF1aXJlKCdodHRwJyk7XHJcbmNvbnN0IHsgRHVwbGV4IH0gPSByZXF1aXJlKCdzdHJlYW0nKTtcclxuY29uc3QgeyBjcmVhdGVIYXNoIH0gPSByZXF1aXJlKCdjcnlwdG8nKTtcclxuXHJcbmNvbnN0IGV4dGVuc2lvbiA9IHJlcXVpcmUoJy4vZXh0ZW5zaW9uJyk7XHJcbmNvbnN0IFBlck1lc3NhZ2VEZWZsYXRlID0gcmVxdWlyZSgnLi9wZXJtZXNzYWdlLWRlZmxhdGUnKTtcclxuY29uc3Qgc3VicHJvdG9jb2wgPSByZXF1aXJlKCcuL3N1YnByb3RvY29sJyk7XHJcbmNvbnN0IFdlYlNvY2tldCA9IHJlcXVpcmUoJy4vd2Vic29ja2V0Jyk7XHJcbmNvbnN0IHsgR1VJRCwga1dlYlNvY2tldCB9ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKTtcclxuXHJcbmNvbnN0IGtleVJlZ2V4ID0gL15bKy8wLTlBLVphLXpdezIyfT09JC87XHJcblxyXG5jb25zdCBSVU5OSU5HID0gMDtcclxuY29uc3QgQ0xPU0lORyA9IDE7XHJcbmNvbnN0IENMT1NFRCA9IDI7XHJcblxyXG4vKipcclxuICogQ2xhc3MgcmVwcmVzZW50aW5nIGEgV2ViU29ja2V0IHNlcnZlci5cclxuICpcclxuICogQGV4dGVuZHMgRXZlbnRFbWl0dGVyXHJcbiAqL1xyXG5jbGFzcyBXZWJTb2NrZXRTZXJ2ZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIGBXZWJTb2NrZXRTZXJ2ZXJgIGluc3RhbmNlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgQ29uZmlndXJhdGlvbiBvcHRpb25zXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5hbGxvd1N5bmNocm9ub3VzRXZlbnRzPXRydWVdIFNwZWNpZmllcyB3aGV0aGVyXHJcbiAgICogICAgIGFueSBvZiB0aGUgYCdtZXNzYWdlJ2AsIGAncGluZydgLCBhbmQgYCdwb25nJ2AgZXZlbnRzIGNhbiBiZSBlbWl0dGVkXHJcbiAgICogICAgIG11bHRpcGxlIHRpbWVzIGluIHRoZSBzYW1lIHRpY2tcclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmF1dG9Qb25nPXRydWVdIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0b1xyXG4gICAqICAgICBhdXRvbWF0aWNhbGx5IHNlbmQgYSBwb25nIGluIHJlc3BvbnNlIHRvIGEgcGluZ1xyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5iYWNrbG9nPTUxMV0gVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBxdWV1ZSBvZlxyXG4gICAqICAgICBwZW5kaW5nIGNvbm5lY3Rpb25zXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5jbGllbnRUcmFja2luZz10cnVlXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG9cclxuICAgKiAgICAgdHJhY2sgY2xpZW50c1xyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmhhbmRsZVByb3RvY29sc10gQSBob29rIHRvIGhhbmRsZSBwcm90b2NvbHNcclxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuaG9zdF0gVGhlIGhvc3RuYW1lIHdoZXJlIHRvIGJpbmQgdGhlIHNlcnZlclxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5tYXhQYXlsb2FkPTEwNDg1NzYwMF0gVGhlIG1heGltdW0gYWxsb3dlZCBtZXNzYWdlXHJcbiAgICogICAgIHNpemVcclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLm5vU2VydmVyPWZhbHNlXSBFbmFibGUgbm8gc2VydmVyIG1vZGVcclxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMucGF0aF0gQWNjZXB0IG9ubHkgY29ubmVjdGlvbnMgbWF0Y2hpbmcgdGhpcyBwYXRoXHJcbiAgICogQHBhcmFtIHsoQm9vbGVhbnxPYmplY3QpfSBbb3B0aW9ucy5wZXJNZXNzYWdlRGVmbGF0ZT1mYWxzZV0gRW5hYmxlL2Rpc2FibGVcclxuICAgKiAgICAgcGVybWVzc2FnZS1kZWZsYXRlXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnBvcnRdIFRoZSBwb3J0IHdoZXJlIHRvIGJpbmQgdGhlIHNlcnZlclxyXG4gICAqIEBwYXJhbSB7KGh0dHAuU2VydmVyfGh0dHBzLlNlcnZlcil9IFtvcHRpb25zLnNlcnZlcl0gQSBwcmUtY3JlYXRlZCBIVFRQL1NcclxuICAgKiAgICAgc2VydmVyIHRvIHVzZVxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuc2tpcFVURjhWYWxpZGF0aW9uPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBvclxyXG4gICAqICAgICBub3QgdG8gc2tpcCBVVEYtOCB2YWxpZGF0aW9uIGZvciB0ZXh0IGFuZCBjbG9zZSBtZXNzYWdlc1xyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLnZlcmlmeUNsaWVudF0gQSBob29rIHRvIHJlamVjdCBjb25uZWN0aW9uc1xyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLldlYlNvY2tldD1XZWJTb2NrZXRdIFNwZWNpZmllcyB0aGUgYFdlYlNvY2tldGBcclxuICAgKiAgICAgY2xhc3MgdG8gdXNlLiBJdCBtdXN0IGJlIHRoZSBgV2ViU29ja2V0YCBjbGFzcyBvciBjbGFzcyB0aGF0IGV4dGVuZHMgaXRcclxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2tdIEEgbGlzdGVuZXIgZm9yIHRoZSBgbGlzdGVuaW5nYCBldmVudFxyXG4gICAqL1xyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMsIGNhbGxiYWNrKSB7XHJcbiAgICBzdXBlcigpO1xyXG5cclxuICAgIG9wdGlvbnMgPSB7XHJcbiAgICAgIGFsbG93U3luY2hyb25vdXNFdmVudHM6IHRydWUsXHJcbiAgICAgIGF1dG9Qb25nOiB0cnVlLFxyXG4gICAgICBtYXhQYXlsb2FkOiAxMDAgKiAxMDI0ICogMTAyNCxcclxuICAgICAgc2tpcFVURjhWYWxpZGF0aW9uOiBmYWxzZSxcclxuICAgICAgcGVyTWVzc2FnZURlZmxhdGU6IGZhbHNlLFxyXG4gICAgICBoYW5kbGVQcm90b2NvbHM6IG51bGwsXHJcbiAgICAgIGNsaWVudFRyYWNraW5nOiB0cnVlLFxyXG4gICAgICB2ZXJpZnlDbGllbnQ6IG51bGwsXHJcbiAgICAgIG5vU2VydmVyOiBmYWxzZSxcclxuICAgICAgYmFja2xvZzogbnVsbCwgLy8gdXNlIGRlZmF1bHQgKDUxMSBhcyBpbXBsZW1lbnRlZCBpbiBuZXQuanMpXHJcbiAgICAgIHNlcnZlcjogbnVsbCxcclxuICAgICAgaG9zdDogbnVsbCxcclxuICAgICAgcGF0aDogbnVsbCxcclxuICAgICAgcG9ydDogbnVsbCxcclxuICAgICAgV2ViU29ja2V0LFxyXG4gICAgICAuLi5vcHRpb25zXHJcbiAgICB9O1xyXG5cclxuICAgIGlmIChcclxuICAgICAgKG9wdGlvbnMucG9ydCA9PSBudWxsICYmICFvcHRpb25zLnNlcnZlciAmJiAhb3B0aW9ucy5ub1NlcnZlcikgfHxcclxuICAgICAgKG9wdGlvbnMucG9ydCAhPSBudWxsICYmIChvcHRpb25zLnNlcnZlciB8fCBvcHRpb25zLm5vU2VydmVyKSkgfHxcclxuICAgICAgKG9wdGlvbnMuc2VydmVyICYmIG9wdGlvbnMubm9TZXJ2ZXIpXHJcbiAgICApIHtcclxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcclxuICAgICAgICAnT25lIGFuZCBvbmx5IG9uZSBvZiB0aGUgXCJwb3J0XCIsIFwic2VydmVyXCIsIG9yIFwibm9TZXJ2ZXJcIiBvcHRpb25zICcgK1xyXG4gICAgICAgICAgJ211c3QgYmUgc3BlY2lmaWVkJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChvcHRpb25zLnBvcnQgIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9zZXJ2ZXIgPSBodHRwLmNyZWF0ZVNlcnZlcigocmVxLCByZXMpID0+IHtcclxuICAgICAgICBjb25zdCBib2R5ID0gaHR0cC5TVEFUVVNfQ09ERVNbNDI2XTtcclxuXHJcbiAgICAgICAgcmVzLndyaXRlSGVhZCg0MjYsIHtcclxuICAgICAgICAgICdDb250ZW50LUxlbmd0aCc6IGJvZHkubGVuZ3RoLFxyXG4gICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICd0ZXh0L3BsYWluJ1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJlcy5lbmQoYm9keSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLl9zZXJ2ZXIubGlzdGVuKFxyXG4gICAgICAgIG9wdGlvbnMucG9ydCxcclxuICAgICAgICBvcHRpb25zLmhvc3QsXHJcbiAgICAgICAgb3B0aW9ucy5iYWNrbG9nLFxyXG4gICAgICAgIGNhbGxiYWNrXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuc2VydmVyKSB7XHJcbiAgICAgIHRoaXMuX3NlcnZlciA9IG9wdGlvbnMuc2VydmVyO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9zZXJ2ZXIpIHtcclxuICAgICAgY29uc3QgZW1pdENvbm5lY3Rpb24gPSB0aGlzLmVtaXQuYmluZCh0aGlzLCAnY29ubmVjdGlvbicpO1xyXG5cclxuICAgICAgdGhpcy5fcmVtb3ZlTGlzdGVuZXJzID0gYWRkTGlzdGVuZXJzKHRoaXMuX3NlcnZlciwge1xyXG4gICAgICAgIGxpc3RlbmluZzogdGhpcy5lbWl0LmJpbmQodGhpcywgJ2xpc3RlbmluZycpLFxyXG4gICAgICAgIGVycm9yOiB0aGlzLmVtaXQuYmluZCh0aGlzLCAnZXJyb3InKSxcclxuICAgICAgICB1cGdyYWRlOiAocmVxLCBzb2NrZXQsIGhlYWQpID0+IHtcclxuICAgICAgICAgIHRoaXMuaGFuZGxlVXBncmFkZShyZXEsIHNvY2tldCwgaGVhZCwgZW1pdENvbm5lY3Rpb24pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG9wdGlvbnMucGVyTWVzc2FnZURlZmxhdGUgPT09IHRydWUpIG9wdGlvbnMucGVyTWVzc2FnZURlZmxhdGUgPSB7fTtcclxuICAgIGlmIChvcHRpb25zLmNsaWVudFRyYWNraW5nKSB7XHJcbiAgICAgIHRoaXMuY2xpZW50cyA9IG5ldyBTZXQoKTtcclxuICAgICAgdGhpcy5fc2hvdWxkRW1pdENsb3NlID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcclxuICAgIHRoaXMuX3N0YXRlID0gUlVOTklORztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGJvdW5kIGFkZHJlc3MsIHRoZSBhZGRyZXNzIGZhbWlseSBuYW1lLCBhbmQgcG9ydCBvZiB0aGUgc2VydmVyXHJcbiAgICogYXMgcmVwb3J0ZWQgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0gaWYgbGlzdGVuaW5nIG9uIGFuIElQIHNvY2tldC5cclxuICAgKiBJZiB0aGUgc2VydmVyIGlzIGxpc3RlbmluZyBvbiBhIHBpcGUgb3IgVU5JWCBkb21haW4gc29ja2V0LCB0aGUgbmFtZSBpc1xyXG4gICAqIHJldHVybmVkIGFzIGEgc3RyaW5nLlxyXG4gICAqXHJcbiAgICogQHJldHVybiB7KE9iamVjdHxTdHJpbmd8bnVsbCl9IFRoZSBhZGRyZXNzIG9mIHRoZSBzZXJ2ZXJcclxuICAgKiBAcHVibGljXHJcbiAgICovXHJcbiAgYWRkcmVzcygpIHtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMubm9TZXJ2ZXIpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgc2VydmVyIGlzIG9wZXJhdGluZyBpbiBcIm5vU2VydmVyXCIgbW9kZScpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5fc2VydmVyKSByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiB0aGlzLl9zZXJ2ZXIuYWRkcmVzcygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3RvcCB0aGUgc2VydmVyIGZyb20gYWNjZXB0aW5nIG5ldyBjb25uZWN0aW9ucyBhbmQgZW1pdCB0aGUgYCdjbG9zZSdgIGV2ZW50XHJcbiAgICogd2hlbiBhbGwgZXhpc3RpbmcgY29ubmVjdGlvbnMgYXJlIGNsb3NlZC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYl0gQSBvbmUtdGltZSBsaXN0ZW5lciBmb3IgdGhlIGAnY2xvc2UnYCBldmVudFxyXG4gICAqIEBwdWJsaWNcclxuICAgKi9cclxuICBjbG9zZShjYikge1xyXG4gICAgaWYgKHRoaXMuX3N0YXRlID09PSBDTE9TRUQpIHtcclxuICAgICAgaWYgKGNiKSB7XHJcbiAgICAgICAgdGhpcy5vbmNlKCdjbG9zZScsICgpID0+IHtcclxuICAgICAgICAgIGNiKG5ldyBFcnJvcignVGhlIHNlcnZlciBpcyBub3QgcnVubmluZycpKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0Q2xvc2UsIHRoaXMpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNiKSB0aGlzLm9uY2UoJ2Nsb3NlJywgY2IpO1xyXG5cclxuICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gQ0xPU0lORykgcmV0dXJuO1xyXG4gICAgdGhpcy5fc3RhdGUgPSBDTE9TSU5HO1xyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMubm9TZXJ2ZXIgfHwgdGhpcy5vcHRpb25zLnNlcnZlcikge1xyXG4gICAgICBpZiAodGhpcy5fc2VydmVyKSB7XHJcbiAgICAgICAgdGhpcy5fcmVtb3ZlTGlzdGVuZXJzKCk7XHJcbiAgICAgICAgdGhpcy5fcmVtb3ZlTGlzdGVuZXJzID0gdGhpcy5fc2VydmVyID0gbnVsbDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuY2xpZW50cykge1xyXG4gICAgICAgIGlmICghdGhpcy5jbGllbnRzLnNpemUpIHtcclxuICAgICAgICAgIHByb2Nlc3MubmV4dFRpY2soZW1pdENsb3NlLCB0aGlzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5fc2hvdWxkRW1pdENsb3NlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0Q2xvc2UsIHRoaXMpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBzZXJ2ZXIgPSB0aGlzLl9zZXJ2ZXI7XHJcblxyXG4gICAgICB0aGlzLl9yZW1vdmVMaXN0ZW5lcnMoKTtcclxuICAgICAgdGhpcy5fcmVtb3ZlTGlzdGVuZXJzID0gdGhpcy5fc2VydmVyID0gbnVsbDtcclxuXHJcbiAgICAgIC8vXHJcbiAgICAgIC8vIFRoZSBIVFRQL1Mgc2VydmVyIHdhcyBjcmVhdGVkIGludGVybmFsbHkuIENsb3NlIGl0LCBhbmQgcmVseSBvbiBpdHNcclxuICAgICAgLy8gYCdjbG9zZSdgIGV2ZW50LlxyXG4gICAgICAvL1xyXG4gICAgICBzZXJ2ZXIuY2xvc2UoKCkgPT4ge1xyXG4gICAgICAgIGVtaXRDbG9zZSh0aGlzKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZWUgaWYgYSBnaXZlbiByZXF1ZXN0IHNob3VsZCBiZSBoYW5kbGVkIGJ5IHRoaXMgc2VydmVyIGluc3RhbmNlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtodHRwLkluY29taW5nTWVzc2FnZX0gcmVxIFJlcXVlc3Qgb2JqZWN0IHRvIGluc3BlY3RcclxuICAgKiBAcmV0dXJuIHtCb29sZWFufSBgdHJ1ZWAgaWYgdGhlIHJlcXVlc3QgaXMgdmFsaWQsIGVsc2UgYGZhbHNlYFxyXG4gICAqIEBwdWJsaWNcclxuICAgKi9cclxuICBzaG91bGRIYW5kbGUocmVxKSB7XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLnBhdGgpIHtcclxuICAgICAgY29uc3QgaW5kZXggPSByZXEudXJsLmluZGV4T2YoJz8nKTtcclxuICAgICAgY29uc3QgcGF0aG5hbWUgPSBpbmRleCAhPT0gLTEgPyByZXEudXJsLnNsaWNlKDAsIGluZGV4KSA6IHJlcS51cmw7XHJcblxyXG4gICAgICBpZiAocGF0aG5hbWUgIT09IHRoaXMub3B0aW9ucy5wYXRoKSByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgYSBIVFRQIFVwZ3JhZGUgcmVxdWVzdC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7aHR0cC5JbmNvbWluZ01lc3NhZ2V9IHJlcSBUaGUgcmVxdWVzdCBvYmplY3RcclxuICAgKiBAcGFyYW0ge0R1cGxleH0gc29ja2V0IFRoZSBuZXR3b3JrIHNvY2tldCBiZXR3ZWVuIHRoZSBzZXJ2ZXIgYW5kIGNsaWVudFxyXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBoZWFkIFRoZSBmaXJzdCBwYWNrZXQgb2YgdGhlIHVwZ3JhZGVkIHN0cmVhbVxyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNiIENhbGxiYWNrXHJcbiAgICogQHB1YmxpY1xyXG4gICAqL1xyXG4gIGhhbmRsZVVwZ3JhZGUocmVxLCBzb2NrZXQsIGhlYWQsIGNiKSB7XHJcbiAgICBzb2NrZXQub24oJ2Vycm9yJywgc29ja2V0T25FcnJvcik7XHJcblxyXG4gICAgY29uc3Qga2V5ID0gcmVxLmhlYWRlcnNbJ3NlYy13ZWJzb2NrZXQta2V5J107XHJcbiAgICBjb25zdCB1cGdyYWRlID0gcmVxLmhlYWRlcnMudXBncmFkZTtcclxuICAgIGNvbnN0IHZlcnNpb24gPSArcmVxLmhlYWRlcnNbJ3NlYy13ZWJzb2NrZXQtdmVyc2lvbiddO1xyXG5cclxuICAgIGlmIChyZXEubWV0aG9kICE9PSAnR0VUJykge1xyXG4gICAgICBjb25zdCBtZXNzYWdlID0gJ0ludmFsaWQgSFRUUCBtZXRob2QnO1xyXG4gICAgICBhYm9ydEhhbmRzaGFrZU9yRW1pdHdzQ2xpZW50RXJyb3IodGhpcywgcmVxLCBzb2NrZXQsIDQwNSwgbWVzc2FnZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodXBncmFkZSA9PT0gdW5kZWZpbmVkIHx8IHVwZ3JhZGUudG9Mb3dlckNhc2UoKSAhPT0gJ3dlYnNvY2tldCcpIHtcclxuICAgICAgY29uc3QgbWVzc2FnZSA9ICdJbnZhbGlkIFVwZ3JhZGUgaGVhZGVyJztcclxuICAgICAgYWJvcnRIYW5kc2hha2VPckVtaXR3c0NsaWVudEVycm9yKHRoaXMsIHJlcSwgc29ja2V0LCA0MDAsIG1lc3NhZ2UpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkIHx8ICFrZXlSZWdleC50ZXN0KGtleSkpIHtcclxuICAgICAgY29uc3QgbWVzc2FnZSA9ICdNaXNzaW5nIG9yIGludmFsaWQgU2VjLVdlYlNvY2tldC1LZXkgaGVhZGVyJztcclxuICAgICAgYWJvcnRIYW5kc2hha2VPckVtaXR3c0NsaWVudEVycm9yKHRoaXMsIHJlcSwgc29ja2V0LCA0MDAsIG1lc3NhZ2UpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHZlcnNpb24gIT09IDEzICYmIHZlcnNpb24gIT09IDgpIHtcclxuICAgICAgY29uc3QgbWVzc2FnZSA9ICdNaXNzaW5nIG9yIGludmFsaWQgU2VjLVdlYlNvY2tldC1WZXJzaW9uIGhlYWRlcic7XHJcbiAgICAgIGFib3J0SGFuZHNoYWtlT3JFbWl0d3NDbGllbnRFcnJvcih0aGlzLCByZXEsIHNvY2tldCwgNDAwLCBtZXNzYWdlLCB7XHJcbiAgICAgICAgJ1NlYy1XZWJTb2NrZXQtVmVyc2lvbic6ICcxMywgOCdcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuc2hvdWxkSGFuZGxlKHJlcSkpIHtcclxuICAgICAgYWJvcnRIYW5kc2hha2Uoc29ja2V0LCA0MDApO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc2VjV2ViU29ja2V0UHJvdG9jb2wgPSByZXEuaGVhZGVyc1snc2VjLXdlYnNvY2tldC1wcm90b2NvbCddO1xyXG4gICAgbGV0IHByb3RvY29scyA9IG5ldyBTZXQoKTtcclxuXHJcbiAgICBpZiAoc2VjV2ViU29ja2V0UHJvdG9jb2wgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHByb3RvY29scyA9IHN1YnByb3RvY29sLnBhcnNlKHNlY1dlYlNvY2tldFByb3RvY29sKTtcclxuICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9ICdJbnZhbGlkIFNlYy1XZWJTb2NrZXQtUHJvdG9jb2wgaGVhZGVyJztcclxuICAgICAgICBhYm9ydEhhbmRzaGFrZU9yRW1pdHdzQ2xpZW50RXJyb3IodGhpcywgcmVxLCBzb2NrZXQsIDQwMCwgbWVzc2FnZSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc2VjV2ViU29ja2V0RXh0ZW5zaW9ucyA9IHJlcS5oZWFkZXJzWydzZWMtd2Vic29ja2V0LWV4dGVuc2lvbnMnXTtcclxuICAgIGNvbnN0IGV4dGVuc2lvbnMgPSB7fTtcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMub3B0aW9ucy5wZXJNZXNzYWdlRGVmbGF0ZSAmJlxyXG4gICAgICBzZWNXZWJTb2NrZXRFeHRlbnNpb25zICE9PSB1bmRlZmluZWRcclxuICAgICkge1xyXG4gICAgICBjb25zdCBwZXJNZXNzYWdlRGVmbGF0ZSA9IG5ldyBQZXJNZXNzYWdlRGVmbGF0ZShcclxuICAgICAgICB0aGlzLm9wdGlvbnMucGVyTWVzc2FnZURlZmxhdGUsXHJcbiAgICAgICAgdHJ1ZSxcclxuICAgICAgICB0aGlzLm9wdGlvbnMubWF4UGF5bG9hZFxyXG4gICAgICApO1xyXG5cclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBvZmZlcnMgPSBleHRlbnNpb24ucGFyc2Uoc2VjV2ViU29ja2V0RXh0ZW5zaW9ucyk7XHJcblxyXG4gICAgICAgIGlmIChvZmZlcnNbUGVyTWVzc2FnZURlZmxhdGUuZXh0ZW5zaW9uTmFtZV0pIHtcclxuICAgICAgICAgIHBlck1lc3NhZ2VEZWZsYXRlLmFjY2VwdChvZmZlcnNbUGVyTWVzc2FnZURlZmxhdGUuZXh0ZW5zaW9uTmFtZV0pO1xyXG4gICAgICAgICAgZXh0ZW5zaW9uc1tQZXJNZXNzYWdlRGVmbGF0ZS5leHRlbnNpb25OYW1lXSA9IHBlck1lc3NhZ2VEZWZsYXRlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9XHJcbiAgICAgICAgICAnSW52YWxpZCBvciB1bmFjY2VwdGFibGUgU2VjLVdlYlNvY2tldC1FeHRlbnNpb25zIGhlYWRlcic7XHJcbiAgICAgICAgYWJvcnRIYW5kc2hha2VPckVtaXR3c0NsaWVudEVycm9yKHRoaXMsIHJlcSwgc29ja2V0LCA0MDAsIG1lc3NhZ2UpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vXHJcbiAgICAvLyBPcHRpb25hbGx5IGNhbGwgZXh0ZXJuYWwgY2xpZW50IHZlcmlmaWNhdGlvbiBoYW5kbGVyLlxyXG4gICAgLy9cclxuICAgIGlmICh0aGlzLm9wdGlvbnMudmVyaWZ5Q2xpZW50KSB7XHJcbiAgICAgIGNvbnN0IGluZm8gPSB7XHJcbiAgICAgICAgb3JpZ2luOlxyXG4gICAgICAgICAgcmVxLmhlYWRlcnNbYCR7dmVyc2lvbiA9PT0gOCA/ICdzZWMtd2Vic29ja2V0LW9yaWdpbicgOiAnb3JpZ2luJ31gXSxcclxuICAgICAgICBzZWN1cmU6ICEhKHJlcS5zb2NrZXQuYXV0aG9yaXplZCB8fCByZXEuc29ja2V0LmVuY3J5cHRlZCksXHJcbiAgICAgICAgcmVxXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnZlcmlmeUNsaWVudC5sZW5ndGggPT09IDIpIHtcclxuICAgICAgICB0aGlzLm9wdGlvbnMudmVyaWZ5Q2xpZW50KGluZm8sICh2ZXJpZmllZCwgY29kZSwgbWVzc2FnZSwgaGVhZGVycykgPT4ge1xyXG4gICAgICAgICAgaWYgKCF2ZXJpZmllZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gYWJvcnRIYW5kc2hha2Uoc29ja2V0LCBjb2RlIHx8IDQwMSwgbWVzc2FnZSwgaGVhZGVycyk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5jb21wbGV0ZVVwZ3JhZGUoXHJcbiAgICAgICAgICAgIGV4dGVuc2lvbnMsXHJcbiAgICAgICAgICAgIGtleSxcclxuICAgICAgICAgICAgcHJvdG9jb2xzLFxyXG4gICAgICAgICAgICByZXEsXHJcbiAgICAgICAgICAgIHNvY2tldCxcclxuICAgICAgICAgICAgaGVhZCxcclxuICAgICAgICAgICAgY2JcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIXRoaXMub3B0aW9ucy52ZXJpZnlDbGllbnQoaW5mbykpIHJldHVybiBhYm9ydEhhbmRzaGFrZShzb2NrZXQsIDQwMSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jb21wbGV0ZVVwZ3JhZGUoZXh0ZW5zaW9ucywga2V5LCBwcm90b2NvbHMsIHJlcSwgc29ja2V0LCBoZWFkLCBjYik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGdyYWRlIHRoZSBjb25uZWN0aW9uIHRvIFdlYlNvY2tldC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBleHRlbnNpb25zIFRoZSBhY2NlcHRlZCBleHRlbnNpb25zXHJcbiAgICogQHBhcmFtIHtTdHJpbmd9IGtleSBUaGUgdmFsdWUgb2YgdGhlIGBTZWMtV2ViU29ja2V0LUtleWAgaGVhZGVyXHJcbiAgICogQHBhcmFtIHtTZXR9IHByb3RvY29scyBUaGUgc3VicHJvdG9jb2xzXHJcbiAgICogQHBhcmFtIHtodHRwLkluY29taW5nTWVzc2FnZX0gcmVxIFRoZSByZXF1ZXN0IG9iamVjdFxyXG4gICAqIEBwYXJhbSB7RHVwbGV4fSBzb2NrZXQgVGhlIG5ldHdvcmsgc29ja2V0IGJldHdlZW4gdGhlIHNlcnZlciBhbmQgY2xpZW50XHJcbiAgICogQHBhcmFtIHtCdWZmZXJ9IGhlYWQgVGhlIGZpcnN0IHBhY2tldCBvZiB0aGUgdXBncmFkZWQgc3RyZWFtXHJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2IgQ2FsbGJhY2tcclxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIHdpdGggdGhlIHNhbWUgc29ja2V0XHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBjb21wbGV0ZVVwZ3JhZGUoZXh0ZW5zaW9ucywga2V5LCBwcm90b2NvbHMsIHJlcSwgc29ja2V0LCBoZWFkLCBjYikge1xyXG4gICAgLy9cclxuICAgIC8vIERlc3Ryb3kgdGhlIHNvY2tldCBpZiB0aGUgY2xpZW50IGhhcyBhbHJlYWR5IHNlbnQgYSBGSU4gcGFja2V0LlxyXG4gICAgLy9cclxuICAgIGlmICghc29ja2V0LnJlYWRhYmxlIHx8ICFzb2NrZXQud3JpdGFibGUpIHJldHVybiBzb2NrZXQuZGVzdHJveSgpO1xyXG5cclxuICAgIGlmIChzb2NrZXRba1dlYlNvY2tldF0pIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICdzZXJ2ZXIuaGFuZGxlVXBncmFkZSgpIHdhcyBjYWxsZWQgbW9yZSB0aGFuIG9uY2Ugd2l0aCB0aGUgc2FtZSAnICtcclxuICAgICAgICAgICdzb2NrZXQsIHBvc3NpYmx5IGR1ZSB0byBhIG1pc2NvbmZpZ3VyYXRpb24nXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX3N0YXRlID4gUlVOTklORykgcmV0dXJuIGFib3J0SGFuZHNoYWtlKHNvY2tldCwgNTAzKTtcclxuXHJcbiAgICBjb25zdCBkaWdlc3QgPSBjcmVhdGVIYXNoKCdzaGExJylcclxuICAgICAgLnVwZGF0ZShrZXkgKyBHVUlEKVxyXG4gICAgICAuZGlnZXN0KCdiYXNlNjQnKTtcclxuXHJcbiAgICBjb25zdCBoZWFkZXJzID0gW1xyXG4gICAgICAnSFRUUC8xLjEgMTAxIFN3aXRjaGluZyBQcm90b2NvbHMnLFxyXG4gICAgICAnVXBncmFkZTogd2Vic29ja2V0JyxcclxuICAgICAgJ0Nvbm5lY3Rpb246IFVwZ3JhZGUnLFxyXG4gICAgICBgU2VjLVdlYlNvY2tldC1BY2NlcHQ6ICR7ZGlnZXN0fWBcclxuICAgIF07XHJcblxyXG4gICAgY29uc3Qgd3MgPSBuZXcgdGhpcy5vcHRpb25zLldlYlNvY2tldChudWxsLCB1bmRlZmluZWQsIHRoaXMub3B0aW9ucyk7XHJcblxyXG4gICAgaWYgKHByb3RvY29scy5zaXplKSB7XHJcbiAgICAgIC8vXHJcbiAgICAgIC8vIE9wdGlvbmFsbHkgY2FsbCBleHRlcm5hbCBwcm90b2NvbCBzZWxlY3Rpb24gaGFuZGxlci5cclxuICAgICAgLy9cclxuICAgICAgY29uc3QgcHJvdG9jb2wgPSB0aGlzLm9wdGlvbnMuaGFuZGxlUHJvdG9jb2xzXHJcbiAgICAgICAgPyB0aGlzLm9wdGlvbnMuaGFuZGxlUHJvdG9jb2xzKHByb3RvY29scywgcmVxKVxyXG4gICAgICAgIDogcHJvdG9jb2xzLnZhbHVlcygpLm5leHQoKS52YWx1ZTtcclxuXHJcbiAgICAgIGlmIChwcm90b2NvbCkge1xyXG4gICAgICAgIGhlYWRlcnMucHVzaChgU2VjLVdlYlNvY2tldC1Qcm90b2NvbDogJHtwcm90b2NvbH1gKTtcclxuICAgICAgICB3cy5fcHJvdG9jb2wgPSBwcm90b2NvbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChleHRlbnNpb25zW1Blck1lc3NhZ2VEZWZsYXRlLmV4dGVuc2lvbk5hbWVdKSB7XHJcbiAgICAgIGNvbnN0IHBhcmFtcyA9IGV4dGVuc2lvbnNbUGVyTWVzc2FnZURlZmxhdGUuZXh0ZW5zaW9uTmFtZV0ucGFyYW1zO1xyXG4gICAgICBjb25zdCB2YWx1ZSA9IGV4dGVuc2lvbi5mb3JtYXQoe1xyXG4gICAgICAgIFtQZXJNZXNzYWdlRGVmbGF0ZS5leHRlbnNpb25OYW1lXTogW3BhcmFtc11cclxuICAgICAgfSk7XHJcbiAgICAgIGhlYWRlcnMucHVzaChgU2VjLVdlYlNvY2tldC1FeHRlbnNpb25zOiAke3ZhbHVlfWApO1xyXG4gICAgICB3cy5fZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgLy9cclxuICAgIC8vIEFsbG93IGV4dGVybmFsIG1vZGlmaWNhdGlvbi9pbnNwZWN0aW9uIG9mIGhhbmRzaGFrZSBoZWFkZXJzLlxyXG4gICAgLy9cclxuICAgIHRoaXMuZW1pdCgnaGVhZGVycycsIGhlYWRlcnMsIHJlcSk7XHJcblxyXG4gICAgc29ja2V0LndyaXRlKGhlYWRlcnMuY29uY2F0KCdcXHJcXG4nKS5qb2luKCdcXHJcXG4nKSk7XHJcbiAgICBzb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgc29ja2V0T25FcnJvcik7XHJcblxyXG4gICAgd3Muc2V0U29ja2V0KHNvY2tldCwgaGVhZCwge1xyXG4gICAgICBhbGxvd1N5bmNocm9ub3VzRXZlbnRzOiB0aGlzLm9wdGlvbnMuYWxsb3dTeW5jaHJvbm91c0V2ZW50cyxcclxuICAgICAgbWF4UGF5bG9hZDogdGhpcy5vcHRpb25zLm1heFBheWxvYWQsXHJcbiAgICAgIHNraXBVVEY4VmFsaWRhdGlvbjogdGhpcy5vcHRpb25zLnNraXBVVEY4VmFsaWRhdGlvblxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKHRoaXMuY2xpZW50cykge1xyXG4gICAgICB0aGlzLmNsaWVudHMuYWRkKHdzKTtcclxuICAgICAgd3Mub24oJ2Nsb3NlJywgKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY2xpZW50cy5kZWxldGUod3MpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fc2hvdWxkRW1pdENsb3NlICYmICF0aGlzLmNsaWVudHMuc2l6ZSkge1xyXG4gICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0Q2xvc2UsIHRoaXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2Iod3MsIHJlcSk7XHJcbiAgfVxyXG59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFdlYlNvY2tldFNlcnZlcjtcclxuXHJcbi8qKlxyXG4gKiBBZGQgZXZlbnQgbGlzdGVuZXJzIG9uIGFuIGBFdmVudEVtaXR0ZXJgIHVzaW5nIGEgbWFwIG9mIDxldmVudCwgbGlzdGVuZXI+XHJcbiAqIHBhaXJzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge0V2ZW50RW1pdHRlcn0gc2VydmVyIFRoZSBldmVudCBlbWl0dGVyXHJcbiAqIEBwYXJhbSB7T2JqZWN0LjxTdHJpbmcsIEZ1bmN0aW9uPn0gbWFwIFRoZSBsaXN0ZW5lcnMgdG8gYWRkXHJcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRoYXQgd2lsbCByZW1vdmUgdGhlIGFkZGVkIGxpc3RlbmVycyB3aGVuXHJcbiAqICAgICBjYWxsZWRcclxuICogQHByaXZhdGVcclxuICovXHJcbmZ1bmN0aW9uIGFkZExpc3RlbmVycyhzZXJ2ZXIsIG1hcCkge1xyXG4gIGZvciAoY29uc3QgZXZlbnQgb2YgT2JqZWN0LmtleXMobWFwKSkgc2VydmVyLm9uKGV2ZW50LCBtYXBbZXZlbnRdKTtcclxuXHJcbiAgcmV0dXJuIGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVycygpIHtcclxuICAgIGZvciAoY29uc3QgZXZlbnQgb2YgT2JqZWN0LmtleXMobWFwKSkge1xyXG4gICAgICBzZXJ2ZXIucmVtb3ZlTGlzdGVuZXIoZXZlbnQsIG1hcFtldmVudF0pO1xyXG4gICAgfVxyXG4gIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBFbWl0IGEgYCdjbG9zZSdgIGV2ZW50IG9uIGFuIGBFdmVudEVtaXR0ZXJgLlxyXG4gKlxyXG4gKiBAcGFyYW0ge0V2ZW50RW1pdHRlcn0gc2VydmVyIFRoZSBldmVudCBlbWl0dGVyXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5mdW5jdGlvbiBlbWl0Q2xvc2Uoc2VydmVyKSB7XHJcbiAgc2VydmVyLl9zdGF0ZSA9IENMT1NFRDtcclxuICBzZXJ2ZXIuZW1pdCgnY2xvc2UnKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEhhbmRsZSBzb2NrZXQgZXJyb3JzLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuZnVuY3Rpb24gc29ja2V0T25FcnJvcigpIHtcclxuICB0aGlzLmRlc3Ryb3koKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENsb3NlIHRoZSBjb25uZWN0aW9uIHdoZW4gcHJlY29uZGl0aW9ucyBhcmUgbm90IGZ1bGZpbGxlZC5cclxuICpcclxuICogQHBhcmFtIHtEdXBsZXh9IHNvY2tldCBUaGUgc29ja2V0IG9mIHRoZSB1cGdyYWRlIHJlcXVlc3RcclxuICogQHBhcmFtIHtOdW1iZXJ9IGNvZGUgVGhlIEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGNvZGVcclxuICogQHBhcmFtIHtTdHJpbmd9IFttZXNzYWdlXSBUaGUgSFRUUCByZXNwb25zZSBib2R5XHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBbaGVhZGVyc10gQWRkaXRpb25hbCBIVFRQIHJlc3BvbnNlIGhlYWRlcnNcclxuICogQHByaXZhdGVcclxuICovXHJcbmZ1bmN0aW9uIGFib3J0SGFuZHNoYWtlKHNvY2tldCwgY29kZSwgbWVzc2FnZSwgaGVhZGVycykge1xyXG4gIC8vXHJcbiAgLy8gVGhlIHNvY2tldCBpcyB3cml0YWJsZSB1bmxlc3MgdGhlIHVzZXIgZGVzdHJveWVkIG9yIGVuZGVkIGl0IGJlZm9yZSBjYWxsaW5nXHJcbiAgLy8gYHNlcnZlci5oYW5kbGVVcGdyYWRlKClgIG9yIGluIHRoZSBgdmVyaWZ5Q2xpZW50YCBmdW5jdGlvbiwgd2hpY2ggaXMgYSB1c2VyXHJcbiAgLy8gZXJyb3IuIEhhbmRsaW5nIHRoaXMgZG9lcyBub3QgbWFrZSBtdWNoIHNlbnNlIGFzIHRoZSB3b3JzdCB0aGF0IGNhbiBoYXBwZW5cclxuICAvLyBpcyB0aGF0IHNvbWUgb2YgdGhlIGRhdGEgd3JpdHRlbiBieSB0aGUgdXNlciBtaWdodCBiZSBkaXNjYXJkZWQgZHVlIHRvIHRoZVxyXG4gIC8vIGNhbGwgdG8gYHNvY2tldC5lbmQoKWAgYmVsb3csIHdoaWNoIHRyaWdnZXJzIGFuIGAnZXJyb3InYCBldmVudCB0aGF0IGluXHJcbiAgLy8gdHVybiBjYXVzZXMgdGhlIHNvY2tldCB0byBiZSBkZXN0cm95ZWQuXHJcbiAgLy9cclxuICBtZXNzYWdlID0gbWVzc2FnZSB8fCBodHRwLlNUQVRVU19DT0RFU1tjb2RlXTtcclxuICBoZWFkZXJzID0ge1xyXG4gICAgQ29ubmVjdGlvbjogJ2Nsb3NlJyxcclxuICAgICdDb250ZW50LVR5cGUnOiAndGV4dC9odG1sJyxcclxuICAgICdDb250ZW50LUxlbmd0aCc6IEJ1ZmZlci5ieXRlTGVuZ3RoKG1lc3NhZ2UpLFxyXG4gICAgLi4uaGVhZGVyc1xyXG4gIH07XHJcblxyXG4gIHNvY2tldC5vbmNlKCdmaW5pc2gnLCBzb2NrZXQuZGVzdHJveSk7XHJcblxyXG4gIHNvY2tldC5lbmQoXHJcbiAgICBgSFRUUC8xLjEgJHtjb2RlfSAke2h0dHAuU1RBVFVTX0NPREVTW2NvZGVdfVxcclxcbmAgK1xyXG4gICAgICBPYmplY3Qua2V5cyhoZWFkZXJzKVxyXG4gICAgICAgIC5tYXAoKGgpID0+IGAke2h9OiAke2hlYWRlcnNbaF19YClcclxuICAgICAgICAuam9pbignXFxyXFxuJykgK1xyXG4gICAgICAnXFxyXFxuXFxyXFxuJyArXHJcbiAgICAgIG1lc3NhZ2VcclxuICApO1xyXG59XHJcblxyXG4vKipcclxuICogRW1pdCBhIGAnd3NDbGllbnRFcnJvcidgIGV2ZW50IG9uIGEgYFdlYlNvY2tldFNlcnZlcmAgaWYgdGhlcmUgaXMgYXQgbGVhc3RcclxuICogb25lIGxpc3RlbmVyIGZvciBpdCwgb3RoZXJ3aXNlIGNhbGwgYGFib3J0SGFuZHNoYWtlKClgLlxyXG4gKlxyXG4gKiBAcGFyYW0ge1dlYlNvY2tldFNlcnZlcn0gc2VydmVyIFRoZSBXZWJTb2NrZXQgc2VydmVyXHJcbiAqIEBwYXJhbSB7aHR0cC5JbmNvbWluZ01lc3NhZ2V9IHJlcSBUaGUgcmVxdWVzdCBvYmplY3RcclxuICogQHBhcmFtIHtEdXBsZXh9IHNvY2tldCBUaGUgc29ja2V0IG9mIHRoZSB1cGdyYWRlIHJlcXVlc3RcclxuICogQHBhcmFtIHtOdW1iZXJ9IGNvZGUgVGhlIEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGNvZGVcclxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgVGhlIEhUVFAgcmVzcG9uc2UgYm9keVxyXG4gKiBAcGFyYW0ge09iamVjdH0gW2hlYWRlcnNdIFRoZSBIVFRQIHJlc3BvbnNlIGhlYWRlcnNcclxuICogQHByaXZhdGVcclxuICovXHJcbmZ1bmN0aW9uIGFib3J0SGFuZHNoYWtlT3JFbWl0d3NDbGllbnRFcnJvcihcclxuICBzZXJ2ZXIsXHJcbiAgcmVxLFxyXG4gIHNvY2tldCxcclxuICBjb2RlLFxyXG4gIG1lc3NhZ2UsXHJcbiAgaGVhZGVyc1xyXG4pIHtcclxuICBpZiAoc2VydmVyLmxpc3RlbmVyQ291bnQoJ3dzQ2xpZW50RXJyb3InKSkge1xyXG4gICAgY29uc3QgZXJyID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xyXG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UoZXJyLCBhYm9ydEhhbmRzaGFrZU9yRW1pdHdzQ2xpZW50RXJyb3IpO1xyXG5cclxuICAgIHNlcnZlci5lbWl0KCd3c0NsaWVudEVycm9yJywgZXJyLCBzb2NrZXQsIHJlcSk7XHJcbiAgfSBlbHNlIHtcclxuICAgIGFib3J0SGFuZHNoYWtlKHNvY2tldCwgY29kZSwgbWVzc2FnZSwgaGVhZGVycyk7XHJcbiAgfVxyXG59XHJcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/ws/lib/websocket-server.js\n");
/***/ }),
/***/ "(ssr)/./node_modules/ws/lib/websocket.js":
/*!******************************************!*\
!*** ./node_modules/ws/lib/websocket.js ***!
\******************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
eval("/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex|Readable$\", \"caughtErrors\": \"none\" }] */\r\n\r\n\r\n\r\nconst EventEmitter = __webpack_require__(/*! events */ \"events\");\r\nconst https = __webpack_require__(/*! https */ \"https\");\r\nconst http = __webpack_require__(/*! http */ \"http\");\r\nconst net = __webpack_require__(/*! net */ \"net\");\r\nconst tls = __webpack_require__(/*! tls */ \"tls\");\r\nconst { randomBytes, createHash } = __webpack_require__(/*! crypto */ \"crypto\");\r\nconst { Duplex, Readable } = __webpack_require__(/*! stream */ \"stream\");\r\nconst { URL } = __webpack_require__(/*! url */ \"url\");\r\n\r\nconst PerMessageDeflate = __webpack_require__(/*! ./permessage-deflate */ \"(ssr)/./node_modules/ws/lib/permessage-deflate.js\");\r\nconst Receiver = __webpack_require__(/*! ./receiver */ \"(ssr)/./node_modules/ws/lib/receiver.js\");\r\nconst Sender = __webpack_require__(/*! ./sender */ \"(ssr)/./node_modules/ws/lib/sender.js\");\r\nconst { isBlob } = __webpack_require__(/*! ./validation */ \"(ssr)/./node_modules/ws/lib/validation.js\");\r\n\r\nconst {\r\n BINARY_TYPES,\r\n EMPTY_BUFFER,\r\n GUID,\r\n kForOnEventAttribute,\r\n kListener,\r\n kStatusCode,\r\n kWebSocket,\r\n NOOP\r\n} = __webpack_require__(/*! ./constants */ \"(ssr)/./node_modules/ws/lib/constants.js\");\r\nconst {\r\n EventTarget: { addEventListener, removeEventListener }\r\n} = __webpack_require__(/*! ./event-target */ \"(ssr)/./node_modules/ws/lib/event-target.js\");\r\nconst { format, parse } = __webpack_require__(/*! ./extension */ \"(ssr)/./node_modules/ws/lib/extension.js\");\r\nconst { toBuffer } = __webpack_require__(/*! ./buffer-util */ \"(ssr)/./node_modules/ws/lib/buffer-util.js\");\r\n\r\nconst closeTimeout = 30 * 1000;\r\nconst kAborted = Symbol('kAborted');\r\nconst protocolVersions = [8, 13];\r\nconst readyStates = ['CONNECTING', 'OPEN', 'CLOSING', 'CLOSED'];\r\nconst subprotocolRegex = /^[!#$%&'*+\\-.0-9A-Z^_`|a-z~]+$/;\r\n\r\n/**\r\n * Class representing a WebSocket.\r\n *\r\n * @extends EventEmitter\r\n */\r\nclass WebSocket extends EventEmitter {\r\n /**\r\n * Create a new `WebSocket`.\r\n *\r\n * @param {(String|URL)} address The URL to which to connect\r\n * @param {(String|String[])} [protocols] The subprotocols\r\n * @param {Object} [options] Connection options\r\n */\r\n constructor(address, protocols, options) {\r\n super();\r\n\r\n this._binaryType = BINARY_TYPES[0];\r\n this._closeCode = 1006;\r\n this._closeFrameReceived = false;\r\n this._closeFrameSent = false;\r\n this._closeMessage = EMPTY_BUFFER;\r\n this._closeTimer = null;\r\n this._errorEmitted = false;\r\n this._extensions = {};\r\n this._paused = false;\r\n this._protocol = '';\r\n this._readyState = WebSocket.CONNECTING;\r\n this._receiver = null;\r\n this._sender = null;\r\n this._socket = null;\r\n\r\n if (address !== null) {\r\n this._bufferedAmount = 0;\r\n this._isServer = false;\r\n this._redirects = 0;\r\n\r\n if (protocols === undefined) {\r\n protocols = [];\r\n } else if (!Array.isArray(protocols)) {\r\n if (typeof protocols === 'object' && protocols !== null) {\r\n options = protocols;\r\n protocols = [];\r\n } else {\r\n protocols = [protocols];\r\n }\r\n }\r\n\r\n initAsClient(this, address, protocols, options);\r\n } else {\r\n this._autoPong = options.autoPong;\r\n this._isServer = true;\r\n }\r\n }\r\n\r\n /**\r\n * For historical reasons, the custom \"nodebuffer\" type is used by the default\r\n * instead of \"blob\".\r\n *\r\n * @type {String}\r\n */\r\n get binaryType() {\r\n return this._binaryType;\r\n }\r\n\r\n set binaryType(type) {\r\n if (!BINARY_TYPES.includes(type)) return;\r\n\r\n this._binaryType = type;\r\n\r\n //\r\n // Allow to change `binaryType` on the fly.\r\n //\r\n if (this._receiver) this._receiver._binaryType = type;\r\n }\r\n\r\n /**\r\n * @type {Number}\r\n */\r\n get bufferedAmount() {\r\n if (!this._socket) return this._bufferedAmount;\r\n\r\n return this._socket._writableState.length + this._sender._bufferedBytes;\r\n }\r\n\r\n /**\r\n * @type {String}\r\n */\r\n get extensions() {\r\n return Object.keys(this._extensions).join();\r\n }\r\n\r\n /**\r\n * @type {Boolean}\r\n */\r\n get isPaused() {\r\n return this._paused;\r\n }\r\n\r\n /**\r\n * @type {Function}\r\n */\r\n /* istanbul ignore next */\r\n get onclose() {\r\n return null;\r\n }\r\n\r\n /**\r\n * @type {Function}\r\n */\r\n /* istanbul ignore next */\r\n get onerror() {\r\n return null;\r\n }\r\n\r\n /**\r\n * @type {Function}\r\n */\r\n /* istanbul ignore next */\r\n get onopen() {\r\n return null;\r\n }\r\n\r\n /**\r\n * @type {Function}\r\n */\r\n /* istanbul ignore next */\r\n get onmessage() {\r\n return null;\r\n }\r\n\r\n /**\r\n * @type {String}\r\n */\r\n get protocol() {\r\n return this._protocol;\r\n }\r\n\r\n /**\r\n * @type {Number}\r\n */\r\n get readyState() {\r\n return this._readyState;\r\n }\r\n\r\n /**\r\n * @type {String}\r\n */\r\n get url() {\r\n return this._url;\r\n }\r\n\r\n /**\r\n * Set up the socket and the internal resources.\r\n *\r\n * @param {Duplex} socket The network socket between the server and client\r\n * @param {Buffer} head The first packet of the upgraded stream\r\n * @param {Object} options Options object\r\n * @param {Boolean} [options.allowSynchronousEvents=false] Specifies whether\r\n * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted\r\n * multiple times in the same tick\r\n * @param {Function} [options.generateMask] The function used to generate the\r\n * masking key\r\n * @param {Number} [options.maxPayload=0] The maximum allowed message size\r\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\r\n * not to skip UTF-8 validation for text and close messages\r\n * @private\r\n */\r\n setSocket(socket, head, options) {\r\n const receiver = new Receiver({\r\n allowSynchronousEvents: options.allowSynchronousEvents,\r\n binaryType: this.binaryType,\r\n extensions: this._extensions,\r\n isServer: this._isServer,\r\n maxPayload: options.maxPayload,\r\n skipUTF8Validation: options.skipUTF8Validation\r\n });\r\n\r\n const sender = new Sender(socket, this._extensions, options.generateMask);\r\n\r\n this._receiver = receiver;\r\n this._sender = sender;\r\n this._socket = socket;\r\n\r\n receiver[kWebSocket] = this;\r\n sender[kWebSocket] = this;\r\n socket[kWebSocket] = this;\r\n\r\n receiver.on('conclude', receiverOnConclude);\r\n receiver.on('drain', receiverOnDrain);\r\n receiver.on('error', receiverOnError);\r\n receiver.on('message', receiverOnMessage);\r\n receiver.on('ping', receiverOnPing);\r\n receiver.on('pong', receiverOnPong);\r\n\r\n sender.onerror = senderOnError;\r\n\r\n //\r\n // These methods may not be available if `socket` is just a `Duplex`.\r\n //\r\n if (socket.setTimeout) socket.setTimeout(0);\r\n if (socket.setNoDelay) socket.setNoDelay();\r\n\r\n if (head.length > 0) socket.unshift(head);\r\n\r\n socket.on('close', socketOnClose);\r\n socket.on('data', socketOnData);\r\n socket.on('end', socketOnEnd);\r\n socket.on('error', socketOnError);\r\n\r\n this._readyState = WebSocket.OPEN;\r\n this.emit('open');\r\n }\r\n\r\n /**\r\n * Emit the `'close'` event.\r\n *\r\n * @private\r\n */\r\n emitClose() {\r\n if (!this._socket) {\r\n this._readyState = WebSocket.CLOSED;\r\n this.emit('close', this._closeCode, this._closeMessage);\r\n return;\r\n }\r\n\r\n if (this._extensions[PerMessageDeflate.extensionName]) {\r\n this._extensions[PerMessageDeflate.extensionName].cleanup();\r\n }\r\n\r\n this._receiver.removeAllListeners();\r\n this._readyState = WebSocket.CLOSED;\r\n this.emit('close', this._closeCode, this._closeMessage);\r\n }\r\n\r\n /**\r\n * Start a closing handshake.\r\n *\r\n * +----------+ +-----------+ +----------+\r\n * - - -|ws.close()|-->|close frame|-->|ws.close()|- - -\r\n * | +----------+ +-----------+ +----------+ |\r\n * +----------+ +-----------+ |\r\n * CLOSING |ws.close()|<--|close frame|<--+-----+ CLOSING\r\n * +----------+ +-----------+ |\r\n * | | | +---+ |\r\n * +------------------------+-->|fin| - - - -\r\n * | +---+ | +---+\r\n * - - - - -|fin|<---------------------+\r\n * +---+\r\n *\r\n * @param {Number} [code] Status code explaining why the connection is closing\r\n * @param {(String|Buffer)} [data] The reason why the connection is\r\n * closing\r\n * @public\r\n */\r\n close(code, data) {\r\n if (this.readyState === WebSocket.CLOSED) return;\r\n if (this.readyState === WebSocket.CONNECTING) {\r\n const msg = 'WebSocket was closed before the connection was established';\r\n abortHandshake(this, this._req, msg);\r\n return;\r\n }\r\n\r\n if (this.readyState === WebSocket.CLOSING) {\r\n if (\r\n this._closeFrameSent &&\r\n (this._closeFrameReceived || this._receiver._writableState.errorEmitted)\r\n ) {\r\n this._socket.end();\r\n }\r\n\r\n return;\r\n }\r\n\r\n this._readyState = WebSocket.CLOSING;\r\n this._sender.close(code, data, !this._isServer, (err) => {\r\n //\r\n // This error is handled by the `'error'` listener on the socket. We only\r\n // want to know if the close frame has been sent here.\r\n //\r\n if (err) return;\r\n\r\n this._closeFrameSent = true;\r\n\r\n if (\r\n this._closeFrameReceived ||\r\n this._receiver._writableState.errorEmitted\r\n ) {\r\n this._socket.end();\r\n }\r\n });\r\n\r\n setCloseTimer(this);\r\n }\r\n\r\n /**\r\n * Pause the socket.\r\n *\r\n * @public\r\n */\r\n pause() {\r\n if (\r\n this.readyState === WebSocket.CONNECTING ||\r\n this.readyState === WebSocket.CLOSED\r\n ) {\r\n return;\r\n }\r\n\r\n this._paused = true;\r\n this._socket.pause();\r\n }\r\n\r\n /**\r\n * Send a ping.\r\n *\r\n * @param {*} [data] The data to send\r\n * @param {Boolean} [mask] Indicates whether or not to mask `data`\r\n * @param {Function} [cb] Callback which is executed when the ping is sent\r\n * @public\r\n */\r\n ping(data, mask, cb) {\r\n if (this.readyState === WebSocket.CONNECTING) {\r\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\r\n }\r\n\r\n if (typeof data === 'function') {\r\n cb = data;\r\n data = mask = undefined;\r\n } else if (typeof mask === 'function') {\r\n cb = mask;\r\n mask = undefined;\r\n }\r\n\r\n if (typeof data === 'number') data = data.toString();\r\n\r\n if (this.readyState !== WebSocket.OPEN) {\r\n sendAfterClose(this, data, cb);\r\n return;\r\n }\r\n\r\n if (mask === undefined) mask = !this._isServer;\r\n this._sender.ping(data || EMPTY_BUFFER, mask, cb);\r\n }\r\n\r\n /**\r\n * Send a pong.\r\n *\r\n * @param {*} [data] The data to send\r\n * @param {Boolean} [mask] Indicates whether or not to mask `data`\r\n * @param {Function} [cb] Callback which is executed when the pong is sent\r\n * @public\r\n */\r\n pong(data, mask, cb) {\r\n if (this.readyState === WebSocket.CONNECTING) {\r\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\r\n }\r\n\r\n if (typeof data === 'function') {\r\n cb = data;\r\n data = mask = undefined;\r\n } else if (typeof mask === 'function') {\r\n cb = mask;\r\n mask = undefined;\r\n }\r\n\r\n if (typeof data === 'number') data = data.toString();\r\n\r\n if (this.readyState !== WebSocket.OPEN) {\r\n sendAfterClose(this, data, cb);\r\n return;\r\n }\r\n\r\n if (mask === undefined) mask = !this._isServer;\r\n this._sender.pong(data || EMPTY_BUFFER, mask, cb);\r\n }\r\n\r\n /**\r\n * Resume the socket.\r\n *\r\n * @public\r\n */\r\n resume() {\r\n if (\r\n this.readyState === WebSocket.CONNECTING ||\r\n this.readyState === WebSocket.CLOSED\r\n ) {\r\n return;\r\n }\r\n\r\n this._paused = false;\r\n if (!this._receiver._writableState.needDrain) this._socket.resume();\r\n }\r\n\r\n /**\r\n * Send a data message.\r\n *\r\n * @param {*} data The message to send\r\n * @param {Object} [options] Options object\r\n * @param {Boolean} [options.binary] Specifies whether `data` is binary or\r\n * text\r\n * @param {Boolean} [options.compress] Specifies whether or not to compress\r\n * `data`\r\n * @param {Boolean} [options.fin=true] Specifies whether the fragment is the\r\n * last one\r\n * @param {Boolean} [options.mask] Specifies whether or not to mask `data`\r\n * @param {Function} [cb] Callback which is executed when data is written out\r\n * @public\r\n */\r\n send(data, options, cb) {\r\n if (this.readyState === WebSocket.CONNECTING) {\r\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\r\n }\r\n\r\n if (typeof options === 'function') {\r\n cb = options;\r\n options = {};\r\n }\r\n\r\n if (typeof data === 'number') data = data.toString();\r\n\r\n if (this.readyState !== WebSocket.OPEN) {\r\n sendAfterClose(this, data, cb);\r\n return;\r\n }\r\n\r\n const opts = {\r\n binary: typeof data !== 'string',\r\n mask: !this._isServer,\r\n compress: true,\r\n fin: true,\r\n ...options\r\n };\r\n\r\n if (!this._extensions[PerMessageDeflate.extensionName]) {\r\n opts.compress = false;\r\n }\r\n\r\n this._sender.send(data || EMPTY_BUFFER, opts, cb);\r\n }\r\n\r\n /**\r\n * Forcibly close the connection.\r\n *\r\n * @public\r\n */\r\n terminate() {\r\n if (this.readyState === WebSocket.CLOSED) return;\r\n if (this.readyState === WebSocket.CONNECTING) {\r\n const msg = 'WebSocket was closed before the connection was established';\r\n abortHandshake(this, this._req, msg);\r\n return;\r\n }\r\n\r\n if (this._socket) {\r\n this._readyState = WebSocket.CLOSING;\r\n this._socket.destroy();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * @constant {Number} CONNECTING\r\n * @memberof WebSocket\r\n */\r\nObject.defineProperty(WebSocket, 'CONNECTING', {\r\n enumerable: true,\r\n value: readyStates.indexOf('CONNECTING')\r\n});\r\n\r\n/**\r\n * @constant {Number} CONNECTING\r\n * @memberof WebSocket.prototype\r\n */\r\nObject.defineProperty(WebSocket.prototype, 'CONNECTING', {\r\n enumerable: true,\r\n value: readyStates.indexOf('CONNECTING')\r\n});\r\n\r\n/**\r\n * @constant {Number} OPEN\r\n * @memberof WebSocket\r\n */\r\nObject.defineProperty(WebSocket, 'OPEN', {\r\n enumerable: true,\r\n value: readyStates.indexOf('OPEN')\r\n});\r\n\r\n/**\r\n * @constant {Number} OPEN\r\n * @memberof WebSocket.prototype\r\n */\r\nObject.defineProperty(WebSocket.prototype, 'OPEN', {\r\n enumerable: true,\r\n value: readyStates.indexOf('OPEN')\r\n});\r\n\r\n/**\r\n * @constant {Number} CLOSING\r\n * @memberof WebSocket\r\n */\r\nObject.defineProperty(WebSocket, 'CLOSING', {\r\n enumerable: true,\r\n value: readyStates.indexOf('CLOSING')\r\n});\r\n\r\n/**\r\n * @constant {Number} CLOSING\r\n * @memberof WebSocket.prototype\r\n */\r\nObject.defineProperty(WebSocket.prototype, 'CLOSING', {\r\n enumerable: true,\r\n value: readyStates.indexOf('CLOSING')\r\n});\r\n\r\n/**\r\n * @constant {Number} CLOSED\r\n * @memberof WebSocket\r\n */\r\nObject.defineProperty(WebSocket, 'CLOSED', {\r\n enumerable: true,\r\n value: readyStates.indexOf('CLOSED')\r\n});\r\n\r\n/**\r\n * @constant {Number} CLOSED\r\n * @memberof WebSocket.prototype\r\n */\r\nObject.defineProperty(WebSocket.prototype, 'CLOSED', {\r\n enumerable: true,\r\n value: readyStates.indexOf('CLOSED')\r\n});\r\n\r\n[\r\n 'binaryType',\r\n 'bufferedAmount',\r\n 'extensions',\r\n 'isPaused',\r\n 'protocol',\r\n 'readyState',\r\n 'url'\r\n].forEach((property) => {\r\n Object.defineProperty(WebSocket.prototype, property, { enumerable: true });\r\n});\r\n\r\n//\r\n// Add the `onopen`, `onerror`, `onclose`, and `onmessage` attributes.\r\n// See https://html.spec.whatwg.org/multipage/comms.html#the-websocket-interface\r\n//\r\n['open', 'error', 'close', 'message'].forEach((method) => {\r\n Object.defineProperty(WebSocket.prototype, `on${method}`, {\r\n enumerable: true,\r\n get() {\r\n for (const listener of this.listeners(method)) {\r\n if (listener[kForOnEventAttribute]) return listener[kListener];\r\n }\r\n\r\n return null;\r\n },\r\n set(handler) {\r\n for (const listener of this.listeners(method)) {\r\n if (listener[kForOnEventAttribute]) {\r\n this.removeListener(method, listener);\r\n break;\r\n }\r\n }\r\n\r\n if (typeof handler !== 'function') return;\r\n\r\n this.addEventListener(method, handler, {\r\n [kForOnEventAttribute]: true\r\n });\r\n }\r\n });\r\n});\r\n\r\nWebSocket.prototype.addEventListener = addEventListener;\r\nWebSocket.prototype.removeEventListener = removeEventListener;\r\n\r\nmodule.exports = WebSocket;\r\n\r\n/**\r\n * Initialize a WebSocket client.\r\n *\r\n * @param {WebSocket} websocket The client to initialize\r\n * @param {(String|URL)} address The URL to which to connect\r\n * @param {Array} protocols The subprotocols\r\n * @param {Object} [options] Connection options\r\n * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether any\r\n * of the `'message'`, `'ping'`, and `'pong'` events can be emitted multiple\r\n * times in the same tick\r\n * @param {Boolean} [options.autoPong=true] Specifies whether or not to\r\n * automatically send a pong in response to a ping\r\n * @param {Function} [options.finishRequest] A function which can be used to\r\n * customize the headers of each http request before it is sent\r\n * @param {Boolean} [options.followRedirects=false] Whether or not to follow\r\n * redirects\r\n * @param {Function} [options.generateMask] The function used to generate the\r\n * masking key\r\n * @param {Number} [options.handshakeTimeout] Timeout in milliseconds for the\r\n * handshake request\r\n * @param {Number} [options.maxPayload=104857600] The maximum allowed message\r\n * size\r\n * @param {Number} [options.maxRedirects=10] The maximum number of redirects\r\n * allowed\r\n * @param {String} [options.origin] Value of the `Origin` or\r\n * `Sec-WebSocket-Origin` header\r\n * @param {(Boolean|Object)} [options.perMessageDeflate=true] Enable/disable\r\n * permessage-deflate\r\n * @param {Number} [options.protocolVersion=13] Value of the\r\n * `Sec-WebSocket-Version` header\r\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\r\n * not to skip UTF-8 validation for text and close messages\r\n * @private\r\n */\r\nfunction initAsClient(websocket, address, protocols, options) {\r\n const opts = {\r\n allowSynchronousEvents: true,\r\n autoPong: true,\r\n protocolVersion: protocolVersions[1],\r\n maxPayload: 100 * 1024 * 1024,\r\n skipUTF8Validation: false,\r\n perMessageDeflate: true,\r\n followRedirects: false,\r\n maxRedirects: 10,\r\n ...options,\r\n socketPath: undefined,\r\n hostname: undefined,\r\n protocol: undefined,\r\n timeout: undefined,\r\n method: 'GET',\r\n host: undefined,\r\n path: undefined,\r\n port: undefined\r\n };\r\n\r\n websocket._autoPong = opts.autoPong;\r\n\r\n if (!protocolVersions.includes(opts.protocolVersion)) {\r\n throw new RangeError(\r\n `Unsupported protocol version: ${opts.protocolVersion} ` +\r\n `(supported versions: ${protocolVersions.join(', ')})`\r\n );\r\n }\r\n\r\n let parsedUrl;\r\n\r\n if (address instanceof URL) {\r\n parsedUrl = address;\r\n } else {\r\n try {\r\n parsedUrl = new URL(address);\r\n } catch (e) {\r\n throw new SyntaxError(`Invalid URL: ${address}`);\r\n }\r\n }\r\n\r\n if (parsedUrl.protocol === 'http:') {\r\n parsedUrl.protocol = 'ws:';\r\n } else if (parsedUrl.protocol === 'https:') {\r\n parsedUrl.protocol = 'wss:';\r\n }\r\n\r\n websocket._url = parsedUrl.href;\r\n\r\n const isSecure = parsedUrl.protocol === 'wss:';\r\n const isIpcUrl = parsedUrl.protocol === 'ws+unix:';\r\n let invalidUrlMessage;\r\n\r\n if (parsedUrl.protocol !== 'ws:' && !isSecure && !isIpcUrl) {\r\n invalidUrlMessage =\r\n 'The URL\\'s protocol must be one of \"ws:\", \"wss:\", ' +\r\n '\"http:\", \"https:\", or \"ws+unix:\"';\r\n } else if (isIpcUrl && !parsedUrl.pathname) {\r\n invalidUrlMessage = \"The URL's pathname is empty\";\r\n } else if (parsedUrl.hash) {\r\n invalidUrlMessage = 'The URL contains a fragment identifier';\r\n }\r\n\r\n if (invalidUrlMessage) {\r\n const err = new SyntaxError(invalidUrlMessage);\r\n\r\n if (websocket._redirects === 0) {\r\n throw err;\r\n } else {\r\n emitErrorAndClose(websocket, err);\r\n return;\r\n }\r\n }\r\n\r\n const defaultPort = isSecure ? 443 : 80;\r\n const key = randomBytes(16).toString('base64');\r\n const request = isSecure ? https.request : http.request;\r\n const protocolSet = new Set();\r\n let perMessageDeflate;\r\n\r\n opts.createConnection =\r\n opts.createConnection || (isSecure ? tlsConnect : netConnect);\r\n opts.defaultPort = opts.defaultPort || defaultPort;\r\n opts.port = parsedUrl.port || defaultPort;\r\n opts.host = parsedUrl.hostname.startsWith('[')\r\n ? parsedUrl.hostname.slice(1, -1)\r\n : parsedUrl.hostname;\r\n opts.headers = {\r\n ...opts.headers,\r\n 'Sec-WebSocket-Version': opts.protocolVersion,\r\n 'Sec-WebSocket-Key': key,\r\n Connection: 'Upgrade',\r\n Upgrade: 'websocket'\r\n };\r\n opts.path = parsedUrl.pathname + parsedUrl.search;\r\n opts.timeout = opts.handshakeTimeout;\r\n\r\n if (opts.perMessageDeflate) {\r\n perMessageDeflate = new PerMessageDeflate(\r\n opts.perMessageDeflate !== true ? opts.perMessageDeflate : {},\r\n false,\r\n opts.maxPayload\r\n );\r\n opts.headers['Sec-WebSocket-Extensions'] = format({\r\n [PerMessageDeflate.extensionName]: perMessageDeflate.offer()\r\n });\r\n }\r\n if (protocols.length) {\r\n for (const protocol of protocols) {\r\n if (\r\n typeof protocol !== 'string' ||\r\n !subprotocolRegex.test(protocol) ||\r\n protocolSet.has(protocol)\r\n ) {\r\n throw new SyntaxError(\r\n 'An invalid or duplicated subprotocol was specified'\r\n );\r\n }\r\n\r\n protocolSet.add(protocol);\r\n }\r\n\r\n opts.headers['Sec-WebSocket-Protocol'] = protocols.join(',');\r\n }\r\n if (opts.origin) {\r\n if (opts.protocolVersion < 13) {\r\n opts.headers['Sec-WebSocket-Origin'] = opts.origin;\r\n } else {\r\n opts.headers.Origin = opts.origin;\r\n }\r\n }\r\n if (parsedUrl.username || parsedUrl.password) {\r\n opts.auth = `${parsedUrl.username}:${parsedUrl.password}`;\r\n }\r\n\r\n if (isIpcUrl) {\r\n const parts = opts.path.split(':');\r\n\r\n opts.socketPath = parts[0];\r\n opts.path = parts[1];\r\n }\r\n\r\n let req;\r\n\r\n if (opts.followRedirects) {\r\n if (websocket._redirects === 0) {\r\n websocket._originalIpc = isIpcUrl;\r\n websocket._originalSecure = isSecure;\r\n websocket._originalHostOrSocketPath = isIpcUrl\r\n ? opts.socketPath\r\n : parsedUrl.host;\r\n\r\n const headers = options && options.headers;\r\n\r\n //\r\n // Shallow copy the user provided options so that headers can be changed\r\n // without mutating the original object.\r\n //\r\n options = { ...options, headers: {} };\r\n\r\n if (headers) {\r\n for (const [key, value] of Object.entries(headers)) {\r\n options.headers[key.toLowerCase()] = value;\r\n }\r\n }\r\n } else if (websocket.listenerCount('redirect') === 0) {\r\n const isSameHost = isIpcUrl\r\n ? websocket._originalIpc\r\n ? opts.socketPath === websocket._originalHostOrSocketPath\r\n : false\r\n : websocket._originalIpc\r\n ? false\r\n : parsedUrl.host === websocket._originalHostOrSocketPath;\r\n\r\n if (!isSameHost || (websocket._originalSecure && !isSecure)) {\r\n //\r\n // Match curl 7.77.0 behavior and drop the following headers. These\r\n // headers are also dropped when following a redirect to a subdomain.\r\n //\r\n delete opts.headers.authorization;\r\n delete opts.headers.cookie;\r\n\r\n if (!isSameHost) delete opts.headers.host;\r\n\r\n opts.auth = undefined;\r\n }\r\n }\r\n\r\n //\r\n // Match curl 7.77.0 behavior and make the first `Authorization` header win.\r\n // If the `Authorization` header is set, then there is nothing to do as it\r\n // will take precedence.\r\n //\r\n if (opts.auth && !options.headers.authorization) {\r\n options.headers.authorization =\r\n 'Basic ' + Buffer.from(opts.auth).toString('base64');\r\n }\r\n\r\n req = websocket._req = request(opts);\r\n\r\n if (websocket._redirects) {\r\n //\r\n // Unlike what is done for the `'upgrade'` event, no early exit is\r\n // triggered here if the user calls `websocket.close()` or\r\n // `websocket.terminate()` from a listener of the `'redirect'` event. This\r\n // is because the user can also call `request.destroy()` with an error\r\n // before calling `websocket.close()` or `websocket.terminate()` and this\r\n // would result in an error being emitted on the `request` object with no\r\n // `'error'` event listeners attached.\r\n //\r\n websocket.emit('redirect', websocket.url, req);\r\n }\r\n } else {\r\n req = websocket._req = request(opts);\r\n }\r\n\r\n if (opts.timeout) {\r\n req.on('timeout', () => {\r\n abortHandshake(websocket, req, 'Opening handshake has timed out');\r\n });\r\n }\r\n\r\n req.on('error', (err) => {\r\n if (req === null || req[kAborted]) return;\r\n\r\n req = websocket._req = null;\r\n emitErrorAndClose(websocket, err);\r\n });\r\n\r\n req.on('response', (res) => {\r\n const location = res.headers.location;\r\n const statusCode = res.statusCode;\r\n\r\n if (\r\n location &&\r\n opts.followRedirects &&\r\n statusCode >= 300 &&\r\n statusCode < 400\r\n ) {\r\n if (++websocket._redirects > opts.maxRedirects) {\r\n abortHandshake(websocket, req, 'Maximum redirects exceeded');\r\n return;\r\n }\r\n\r\n req.abort();\r\n\r\n let addr;\r\n\r\n try {\r\n addr = new URL(location, address);\r\n } catch (e) {\r\n const err = new SyntaxError(`Invalid URL: ${location}`);\r\n emitErrorAndClose(websocket, err);\r\n return;\r\n }\r\n\r\n initAsClient(websocket, addr, protocols, options);\r\n } else if (!websocket.emit('unexpected-response', req, res)) {\r\n abortHandshake(\r\n websocket,\r\n req,\r\n `Unexpected server response: ${res.statusCode}`\r\n );\r\n }\r\n });\r\n\r\n req.on('upgrade', (res, socket, head) => {\r\n websocket.emit('upgrade', res);\r\n\r\n //\r\n // The user may have closed the connection from a listener of the\r\n // `'upgrade'` event.\r\n //\r\n if (websocket.readyState !== WebSocket.CONNECTING) return;\r\n\r\n req = websocket._req = null;\r\n\r\n const upgrade = res.headers.upgrade;\r\n\r\n if (upgrade === undefined || upgrade.toLowerCase() !== 'websocket') {\r\n abortHandshake(websocket, socket, 'Invalid Upgrade header');\r\n return;\r\n }\r\n\r\n const digest = createHash('sha1')\r\n .update(key + GUID)\r\n .digest('base64');\r\n\r\n if (res.headers['sec-websocket-accept'] !== digest) {\r\n abortHandshake(websocket, socket, 'Invalid Sec-WebSocket-Accept header');\r\n return;\r\n }\r\n\r\n const serverProt = res.headers['sec-websocket-protocol'];\r\n let protError;\r\n\r\n if (serverProt !== undefined) {\r\n if (!protocolSet.size) {\r\n protError = 'Server sent a subprotocol but none was requested';\r\n } else if (!protocolSet.has(serverProt)) {\r\n protError = 'Server sent an invalid subprotocol';\r\n }\r\n } else if (protocolSet.size) {\r\n protError = 'Server sent no subprotocol';\r\n }\r\n\r\n if (protError) {\r\n abortHandshake(websocket, socket, protError);\r\n return;\r\n }\r\n\r\n if (serverProt) websocket._protocol = serverProt;\r\n\r\n const secWebSocketExtensions = res.headers['sec-websocket-extensions'];\r\n\r\n if (secWebSocketExtensions !== undefined) {\r\n if (!perMessageDeflate) {\r\n const message =\r\n 'Server sent a Sec-WebSocket-Extensions header but no extension ' +\r\n 'was requested';\r\n abortHandshake(websocket, socket, message);\r\n return;\r\n }\r\n\r\n let extensions;\r\n\r\n try {\r\n extensions = parse(secWebSocketExtensions);\r\n } catch (err) {\r\n const message = 'Invalid Sec-WebSocket-Extensions header';\r\n abortHandshake(websocket, socket, message);\r\n return;\r\n }\r\n\r\n const extensionNames = Object.keys(extensions);\r\n\r\n if (\r\n extensionNames.length !== 1 ||\r\n extensionNames[0] !== PerMessageDeflate.extensionName\r\n ) {\r\n const message = 'Server indicated an extension that was not requested';\r\n abortHandshake(websocket, socket, message);\r\n return;\r\n }\r\n\r\n try {\r\n perMessageDeflate.accept(extensions[PerMessageDeflate.extensionName]);\r\n } catch (err) {\r\n const message = 'Invalid Sec-WebSocket-Extensions header';\r\n abortHandshake(websocket, socket, message);\r\n return;\r\n }\r\n\r\n websocket._extensions[PerMessageDeflate.extensionName] =\r\n perMessageDeflate;\r\n }\r\n\r\n websocket.setSocket(socket, head, {\r\n allowSynchronousEvents: opts.allowSynchronousEvents,\r\n generateMask: opts.generateMask,\r\n maxPayload: opts.maxPayload,\r\n skipUTF8Validation: opts.skipUTF8Validation\r\n });\r\n });\r\n\r\n if (opts.finishRequest) {\r\n opts.finishRequest(req, websocket);\r\n } else {\r\n req.end();\r\n }\r\n}\r\n\r\n/**\r\n * Emit the `'error'` and `'close'` events.\r\n *\r\n * @param {WebSocket} websocket The WebSocket instance\r\n * @param {Error} The error to emit\r\n * @private\r\n */\r\nfunction emitErrorAndClose(websocket, err) {\r\n websocket._readyState = WebSocket.CLOSING;\r\n //\r\n // The following assignment is practically useless and is done only for\r\n // consistency.\r\n //\r\n websocket._errorEmitted = true;\r\n websocket.emit('error', err);\r\n websocket.emitClose();\r\n}\r\n\r\n/**\r\n * Create a `net.Socket` and initiate a connection.\r\n *\r\n * @param {Object} options Connection options\r\n * @return {net.Socket} The newly created socket used to start the connection\r\n * @private\r\n */\r\nfunction netConnect(options) {\r\n options.path = options.socketPath;\r\n return net.connect(options);\r\n}\r\n\r\n/**\r\n * Create a `tls.TLSSocket` and initiate a connection.\r\n *\r\n * @param {Object} options Connection options\r\n * @return {tls.TLSSocket} The newly created socket used to start the connection\r\n * @private\r\n */\r\nfunction tlsConnect(options) {\r\n options.path = undefined;\r\n\r\n if (!options.servername && options.servername !== '') {\r\n options.servername = net.isIP(options.host) ? '' : options.host;\r\n }\r\n\r\n return tls.connect(options);\r\n}\r\n\r\n/**\r\n * Abort the handshake and emit an error.\r\n *\r\n * @param {WebSocket} websocket The WebSocket instance\r\n * @param {(http.ClientRequest|net.Socket|tls.Socket)} stream The request to\r\n * abort or the socket to destroy\r\n * @param {String} message The error message\r\n * @private\r\n */\r\nfunction abortHandshake(websocket, stream, message) {\r\n websocket._readyState = WebSocket.CLOSING;\r\n\r\n const err = new Error(message);\r\n Error.captureStackTrace(err, abortHandshake);\r\n\r\n if (stream.setHeader) {\r\n stream[kAborted] = true;\r\n stream.abort();\r\n\r\n if (stream.socket && !stream.socket.destroyed) {\r\n //\r\n // On Node.js >= 14.3.0 `request.abort()` does not destroy the socket if\r\n // called after the request completed. See\r\n // https://github.com/websockets/ws/issues/1869.\r\n //\r\n stream.socket.destroy();\r\n }\r\n\r\n process.nextTick(emitErrorAndClose, websocket, err);\r\n } else {\r\n stream.destroy(err);\r\n stream.once('error', websocket.emit.bind(websocket, 'error'));\r\n stream.once('close', websocket.emitClose.bind(websocket));\r\n }\r\n}\r\n\r\n/**\r\n * Handle cases where the `ping()`, `pong()`, or `send()` methods are called\r\n * when the `readyState` attribute is `CLOSING` or `CLOSED`.\r\n *\r\n * @param {WebSocket} websocket The WebSocket instance\r\n * @param {*} [data] The data to send\r\n * @param {Function} [cb] Callback\r\n * @private\r\n */\r\nfunction sendAfterClose(websocket, data, cb) {\r\n if (data) {\r\n const length = isBlob(data) ? data.size : toBuffer(data).length;\r\n\r\n //\r\n // The `_bufferedAmount` property is used only when the peer is a client and\r\n // the opening handshake fails. Under these circumstances, in fact, the\r\n // `setSocket()` method is not called, so the `_socket` and `_sender`\r\n // properties are set to `null`.\r\n //\r\n if (websocket._socket) websocket._sender._bufferedBytes += length;\r\n else websocket._bufferedAmount += length;\r\n }\r\n\r\n if (cb) {\r\n const err = new Error(\r\n `WebSocket is not open: readyState ${websocket.readyState} ` +\r\n `(${readyStates[websocket.readyState]})`\r\n );\r\n process.nextTick(cb, err);\r\n }\r\n}\r\n\r\n/**\r\n * The listener of the `Receiver` `'conclude'` event.\r\n *\r\n * @param {Number} code The status code\r\n * @param {Buffer} reason The reason for closing\r\n * @private\r\n */\r\nfunction receiverOnConclude(code, reason) {\r\n const websocket = this[kWebSocket];\r\n\r\n websocket._closeFrameReceived = true;\r\n websocket._closeMessage = reason;\r\n websocket._closeCode = code;\r\n\r\n if (websocket._socket[kWebSocket] === undefined) return;\r\n\r\n websocket._socket.removeListener('data', socketOnData);\r\n process.nextTick(resume, websocket._socket);\r\n\r\n if (code === 1005) websocket.close();\r\n else websocket.close(code, reason);\r\n}\r\n\r\n/**\r\n * The listener of the `Receiver` `'drain'` event.\r\n *\r\n * @private\r\n */\r\nfunction receiverOnDrain() {\r\n const websocket = this[kWebSocket];\r\n\r\n if (!websocket.isPaused) websocket._socket.resume();\r\n}\r\n\r\n/**\r\n * The listener of the `Receiver` `'error'` event.\r\n *\r\n * @param {(RangeError|Error)} err The emitted error\r\n * @private\r\n */\r\nfunction receiverOnError(err) {\r\n const websocket = this[kWebSocket];\r\n\r\n if (websocket._socket[kWebSocket] !== undefined) {\r\n websocket._socket.removeListener('data', socketOnData);\r\n\r\n //\r\n // On Node.js < 14.0.0 the `'error'` event is emitted synchronously. See\r\n // https://github.com/websockets/ws/issues/1940.\r\n //\r\n process.nextTick(resume, websocket._socket);\r\n\r\n websocket.close(err[kStatusCode]);\r\n }\r\n\r\n if (!websocket._errorEmitted) {\r\n websocket._errorEmitted = true;\r\n websocket.emit('error', err);\r\n }\r\n}\r\n\r\n/**\r\n * The listener of the `Receiver` `'finish'` event.\r\n *\r\n * @private\r\n */\r\nfunction receiverOnFinish() {\r\n this[kWebSocket].emitClose();\r\n}\r\n\r\n/**\r\n * The listener of the `Receiver` `'message'` event.\r\n *\r\n * @param {Buffer|ArrayBuffer|Buffer[])} data The message\r\n * @param {Boolean} isBinary Specifies whether the message is binary or not\r\n * @private\r\n */\r\nfunction receiverOnMessage(data, isBinary) {\r\n this[kWebSocket].emit('message', data, isBinary);\r\n}\r\n\r\n/**\r\n * The listener of the `Receiver` `'ping'` event.\r\n *\r\n * @param {Buffer} data The data included in the ping frame\r\n * @private\r\n */\r\nfunction receiverOnPing(data) {\r\n const websocket = this[kWebSocket];\r\n\r\n if (websocket._autoPong) websocket.pong(data, !this._isServer, NOOP);\r\n websocket.emit('ping', data);\r\n}\r\n\r\n/**\r\n * The listener of the `Receiver` `'pong'` event.\r\n *\r\n * @param {Buffer} data The data included in the pong frame\r\n * @private\r\n */\r\nfunction receiverOnPong(data) {\r\n this[kWebSocket].emit('pong', data);\r\n}\r\n\r\n/**\r\n * Resume a readable stream\r\n *\r\n * @param {Readable} stream The readable stream\r\n * @private\r\n */\r\nfunction resume(stream) {\r\n stream.resume();\r\n}\r\n\r\n/**\r\n * The `Sender` error event handler.\r\n *\r\n * @param {Error} The error\r\n * @private\r\n */\r\nfunction senderOnError(err) {\r\n const websocket = this[kWebSocket];\r\n\r\n if (websocket.readyState === WebSocket.CLOSED) return;\r\n if (websocket.readyState === WebSocket.OPEN) {\r\n websocket._readyState = WebSocket.CLOSING;\r\n setCloseTimer(websocket);\r\n }\r\n\r\n //\r\n // `socket.end()` is used instead of `socket.destroy()` to allow the other\r\n // peer to finish sending queued data. There is no need to set a timer here\r\n // because `CLOSING` means that it is already set or not needed.\r\n //\r\n this._socket.end();\r\n\r\n if (!websocket._errorEmitted) {\r\n websocket._errorEmitted = true;\r\n websocket.emit('error', err);\r\n }\r\n}\r\n\r\n/**\r\n * Set a timer to destroy the underlying raw socket of a WebSocket.\r\n *\r\n * @param {WebSocket} websocket The WebSocket instance\r\n * @private\r\n */\r\nfunction setCloseTimer(websocket) {\r\n websocket._closeTimer = setTimeout(\r\n websocket._socket.destroy.bind(websocket._socket),\r\n closeTimeout\r\n );\r\n}\r\n\r\n/**\r\n * The listener of the socket `'close'` event.\r\n *\r\n * @private\r\n */\r\nfunction socketOnClose() {\r\n const websocket = this[kWebSocket];\r\n\r\n this.removeListener('close', socketOnClose);\r\n this.removeListener('data', socketOnData);\r\n this.removeListener('end', socketOnEnd);\r\n\r\n websocket._readyState = WebSocket.CLOSING;\r\n\r\n let chunk;\r\n\r\n //\r\n // The close frame might not have been received or the `'end'` event emitted,\r\n // for example, if the socket was destroyed due to an error. Ensure that the\r\n // `receiver` stream is closed after writing any remaining buffered data to\r\n // it. If the readable side of the socket is in flowing mode then there is no\r\n // buffered data as everything has been already written and `readable.read()`\r\n // will return `null`. If instead, the socket is paused, any possible buffered\r\n // data will be read as a single chunk.\r\n //\r\n if (\r\n !this._readableState.endEmitted &&\r\n !websocket._closeFrameReceived &&\r\n !websocket._receiver._writableState.errorEmitted &&\r\n (chunk = websocket._socket.read()) !== null\r\n ) {\r\n websocket._receiver.write(chunk);\r\n }\r\n\r\n websocket._receiver.end();\r\n\r\n this[kWebSocket] = undefined;\r\n\r\n clearTimeout(websocket._closeTimer);\r\n\r\n if (\r\n websocket._receiver._writableState.finished ||\r\n websocket._receiver._writableState.errorEmitted\r\n ) {\r\n websocket.emitClose();\r\n } else {\r\n websocket._receiver.on('error', receiverOnFinish);\r\n websocket._receiver.on('finish', receiverOnFinish);\r\n }\r\n}\r\n\r\n/**\r\n * The listener of the socket `'data'` event.\r\n *\r\n * @param {Buffer} chunk A chunk of data\r\n * @private\r\n */\r\nfunction socketOnData(chunk) {\r\n if (!this[kWebSocket]._receiver.write(chunk)) {\r\n this.pause();\r\n }\r\n}\r\n\r\n/**\r\n * The listener of the socket `'end'` event.\r\n *\r\n * @private\r\n */\r\nfunction socketOnEnd() {\r\n const websocket = this[kWebSocket];\r\n\r\n websocket._readyState = WebSocket.CLOSING;\r\n websocket._receiver.end();\r\n this.end();\r\n}\r\n\r\n/**\r\n * The listener of the socket `'error'` event.\r\n *\r\n * @private\r\n */\r\nfunction socketOnError() {\r\n const websocket = this[kWebSocket];\r\n\r\n this.removeListener('error', socketOnError);\r\n this.on('error', NOOP);\r\n\r\n if (websocket) {\r\n websocket._readyState = WebSocket.CLOSING;\r\n this.destroy();\r\n }\r\n}\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvd3MvbGliL3dlYnNvY2tldC5qcyIsIm1hcHBpbmdzIjoiQUFBQSxzQ0FBc0Msa0VBQWtFO0FBQ3hHO0FBQ2E7QUFDYjtBQUNBLHFCQUFxQixtQkFBTyxDQUFDLHNCQUFRO0FBQ3JDLGNBQWMsbUJBQU8sQ0FBQyxvQkFBTztBQUM3QixhQUFhLG1CQUFPLENBQUMsa0JBQU07QUFDM0IsWUFBWSxtQkFBTyxDQUFDLGdCQUFLO0FBQ3pCLFlBQVksbUJBQU8sQ0FBQyxnQkFBSztBQUN6QixRQUFRLDBCQUEwQixFQUFFLG1CQUFPLENBQUMsc0JBQVE7QUFDcEQsUUFBUSxtQkFBbUIsRUFBRSxtQkFBTyxDQUFDLHNCQUFRO0FBQzdDLFFBQVEsTUFBTSxFQUFFLG1CQUFPLENBQUMsZ0JBQUs7QUFDN0I7QUFDQSwwQkFBMEIsbUJBQU8sQ0FBQywrRUFBc0I7QUFDeEQsaUJBQWlCLG1CQUFPLENBQUMsMkRBQVk7QUFDckMsZUFBZSxtQkFBTyxDQUFDLHVEQUFVO0FBQ2pDLFFBQVEsU0FBUyxFQUFFLG1CQUFPLENBQUMsK0RBQWM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLEVBQUUsbUJBQU8sQ0FBQyw2REFBYTtBQUN6QjtBQUNBLGlCQUFpQjtBQUNqQixFQUFFLEVBQUUsbUJBQU8sQ0FBQyxtRUFBZ0I7QUFDNUIsUUFBUSxnQkFBZ0IsRUFBRSxtQkFBTyxDQUFDLDZEQUFhO0FBQy9DLFFBQVEsV0FBVyxFQUFFLG1CQUFPLENBQUMsaUVBQWU7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGNBQWM7QUFDM0IsYUFBYSxtQkFBbUI7QUFDaEMsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsaUJBQWlCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxHQUFHO0FBQ2hCLGFBQWEsU0FBUztBQUN0QixhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxHQUFHO0FBQ2hCLGFBQWEsU0FBUztBQUN0QixhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsR0FBRztBQUNoQixhQUFhLFFBQVE7QUFDckIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RCxrQkFBa0I7QUFDM0UsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRCxPQUFPO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxXQUFXO0FBQ3RCLFdBQVcsY0FBYztBQUN6QixXQUFXLE9BQU87QUFDbEIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsU0FBUztBQUNwQjtBQUNBO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0EsV0FBVyxrQkFBa0I7QUFDN0I7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQSxXQUFXLFNBQVM7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsc0JBQXNCO0FBQzdELGdDQUFnQyw0QkFBNEI7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLE1BQU07QUFDTiw0Q0FBNEMsUUFBUTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUVBQW1FO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLG1CQUFtQixHQUFHLG1CQUFtQjtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSLG9EQUFvRCxTQUFTO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLGVBQWU7QUFDdEQ7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFdBQVc7QUFDdEIsV0FBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFlBQVksWUFBWTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixZQUFZLGVBQWU7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxXQUFXO0FBQ3RCLFdBQVcsNENBQTRDO0FBQ3ZEO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxXQUFXO0FBQ3RCLFdBQVcsR0FBRztBQUNkLFdBQVcsVUFBVTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkMsc0JBQXNCO0FBQ2pFLFlBQVksa0NBQWtDO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLG9CQUFvQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyw4QkFBOEI7QUFDekMsV0FBVyxTQUFTO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFdBQVc7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9uZXh0anMvLi9ub2RlX21vZHVsZXMvd3MvbGliL3dlYnNvY2tldC5qcz9jYWIyIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludCBuby11bnVzZWQtdmFyczogW1wiZXJyb3JcIiwgeyBcInZhcnNJZ25vcmVQYXR0ZXJuXCI6IFwiXkR1cGxleHxSZWFkYWJsZSRcIiwgXCJjYXVnaHRFcnJvcnNcIjogXCJub25lXCIgfV0gKi9cclxuXHJcbid1c2Ugc3RyaWN0JztcclxuXHJcbmNvbnN0IEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoJ2V2ZW50cycpO1xyXG5jb25zdCBodHRwcyA9IHJlcXVpcmUoJ2h0dHBzJyk7XHJcbmNvbnN0IGh0dHAgPSByZXF1aXJlKCdodHRwJyk7XHJcbmNvbnN0IG5ldCA9IHJlcXVpcmUoJ25ldCcpO1xyXG5jb25zdCB0bHMgPSByZXF1aXJlKCd0bHMnKTtcclxuY29uc3QgeyByYW5kb21CeXRlcywgY3JlYXRlSGFzaCB9ID0gcmVxdWlyZSgnY3J5cHRvJyk7XHJcbmNvbnN0IHsgRHVwbGV4LCBSZWFkYWJsZSB9ID0gcmVxdWlyZSgnc3RyZWFtJyk7XHJcbmNvbnN0IHsgVVJMIH0gPSByZXF1aXJlKCd1cmwnKTtcclxuXHJcbmNvbnN0IFBlck1lc3NhZ2VEZWZsYXRlID0gcmVxdWlyZSgnLi9wZXJtZXNzYWdlLWRlZmxhdGUnKTtcclxuY29uc3QgUmVjZWl2ZXIgPSByZXF1aXJlKCcuL3JlY2VpdmVyJyk7XHJcbmNvbnN0IFNlbmRlciA9IHJlcXVpcmUoJy4vc2VuZGVyJyk7XHJcbmNvbnN0IHsgaXNCbG9iIH0gPSByZXF1aXJlKCcuL3ZhbGlkYXRpb24nKTtcclxuXHJcbmNvbnN0IHtcclxuICBCSU5BUllfVFlQRVMsXHJcbiAgRU1QVFlfQlVGRkVSLFxyXG4gIEdVSUQsXHJcbiAga0Zvck9uRXZlbnRBdHRyaWJ1dGUsXHJcbiAga0xpc3RlbmVyLFxyXG4gIGtTdGF0dXNDb2RlLFxyXG4gIGtXZWJTb2NrZXQsXHJcbiAgTk9PUFxyXG59ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKTtcclxuY29uc3Qge1xyXG4gIEV2ZW50VGFyZ2V0OiB7IGFkZEV2ZW50TGlzdGVuZXIsIHJlbW92ZUV2ZW50TGlzdGVuZXIgfVxyXG59ID0gcmVxdWlyZSgnLi9ldmVudC10YXJnZXQnKTtcclxuY29uc3QgeyBmb3JtYXQsIHBhcnNlIH0gPSByZXF1aXJlKCcuL2V4dGVuc2lvbicpO1xyXG5jb25zdCB7IHRvQnVmZmVyIH0gPSByZXF1aXJlKCcuL2J1ZmZlci11dGlsJyk7XHJcblxyXG5jb25zdCBjbG9zZVRpbWVvdXQgPSAzMCAqIDEwMDA7XHJcbmNvbnN0IGtBYm9ydGVkID0gU3ltYm9sKCdrQWJvcnRlZCcpO1xyXG5jb25zdCBwcm90b2NvbFZlcnNpb25zID0gWzgsIDEzXTtcclxuY29uc3QgcmVhZHlTdGF0ZXMgPSBbJ0NPTk5FQ1RJTkcnLCAnT1BFTicsICdDTE9TSU5HJywgJ0NMT1NFRCddO1xyXG5jb25zdCBzdWJwcm90b2NvbFJlZ2V4ID0gL15bISMkJSYnKitcXC0uMC05QS1aXl9gfGEten5dKyQvO1xyXG5cclxuLyoqXHJcbiAqIENsYXNzIHJlcHJlc2VudGluZyBhIFdlYlNvY2tldC5cclxuICpcclxuICogQGV4dGVuZHMgRXZlbnRFbWl0dGVyXHJcbiAqL1xyXG5jbGFzcyBXZWJTb2NrZXQgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIG5ldyBgV2ViU29ja2V0YC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7KFN0cmluZ3xVUkwpfSBhZGRyZXNzIFRoZSBVUkwgdG8gd2hpY2ggdG8gY29ubmVjdFxyXG4gICAqIEBwYXJhbSB7KFN0cmluZ3xTdHJpbmdbXSl9IFtwcm90b2NvbHNdIFRoZSBzdWJwcm90b2NvbHNcclxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIENvbm5lY3Rpb24gb3B0aW9uc1xyXG4gICAqL1xyXG4gIGNvbnN0cnVjdG9yKGFkZHJlc3MsIHByb3RvY29scywgb3B0aW9ucykge1xyXG4gICAgc3VwZXIoKTtcclxuXHJcbiAgICB0aGlzLl9iaW5hcnlUeXBlID0gQklOQVJZX1RZUEVTWzBdO1xyXG4gICAgdGhpcy5fY2xvc2VDb2RlID0gMTAwNjtcclxuICAgIHRoaXMuX2Nsb3NlRnJhbWVSZWNlaXZlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5fY2xvc2VGcmFtZVNlbnQgPSBmYWxzZTtcclxuICAgIHRoaXMuX2Nsb3NlTWVzc2FnZSA9IEVNUFRZX0JVRkZFUjtcclxuICAgIHRoaXMuX2Nsb3NlVGltZXIgPSBudWxsO1xyXG4gICAgdGhpcy5fZXJyb3JFbWl0dGVkID0gZmFsc2U7XHJcbiAgICB0aGlzLl9leHRlbnNpb25zID0ge307XHJcbiAgICB0aGlzLl9wYXVzZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuX3Byb3RvY29sID0gJyc7XHJcbiAgICB0aGlzLl9yZWFkeVN0YXRlID0gV2ViU29ja2V0LkNPTk5FQ1RJTkc7XHJcbiAgICB0aGlzLl9yZWNlaXZlciA9IG51bGw7XHJcbiAgICB0aGlzLl9zZW5kZXIgPSBudWxsO1xyXG4gICAgdGhpcy5fc29ja2V0ID0gbnVsbDtcclxuXHJcbiAgICBpZiAoYWRkcmVzcyAhPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9idWZmZXJlZEFtb3VudCA9IDA7XHJcbiAgICAgIHRoaXMuX2lzU2VydmVyID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuX3JlZGlyZWN0cyA9IDA7XHJcblxyXG4gICAgICBpZiAocHJvdG9jb2xzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBwcm90b2NvbHMgPSBbXTtcclxuICAgICAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShwcm90b2NvbHMpKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBwcm90b2NvbHMgPT09ICdvYmplY3QnICYmIHByb3RvY29scyAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgb3B0aW9ucyA9IHByb3RvY29scztcclxuICAgICAgICAgIHByb3RvY29scyA9IFtdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBwcm90b2NvbHMgPSBbcHJvdG9jb2xzXTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGluaXRBc0NsaWVudCh0aGlzLCBhZGRyZXNzLCBwcm90b2NvbHMsIG9wdGlvbnMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fYXV0b1BvbmcgPSBvcHRpb25zLmF1dG9Qb25nO1xyXG4gICAgICB0aGlzLl9pc1NlcnZlciA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGb3IgaGlzdG9yaWNhbCByZWFzb25zLCB0aGUgY3VzdG9tIFwibm9kZWJ1ZmZlclwiIHR5cGUgaXMgdXNlZCBieSB0aGUgZGVmYXVsdFxyXG4gICAqIGluc3RlYWQgb2YgXCJibG9iXCIuXHJcbiAgICpcclxuICAgKiBAdHlwZSB7U3RyaW5nfVxyXG4gICAqL1xyXG4gIGdldCBiaW5hcnlUeXBlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2JpbmFyeVR5cGU7XHJcbiAgfVxyXG5cclxuICBzZXQgYmluYXJ5VHlwZSh0eXBlKSB7XHJcbiAgICBpZiAoIUJJTkFSWV9UWVBFUy5pbmNsdWRlcyh0eXBlKSkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuX2JpbmFyeVR5cGUgPSB0eXBlO1xyXG5cclxuICAgIC8vXHJcbiAgICAvLyBBbGxvdyB0byBjaGFuZ2UgYGJpbmFyeVR5cGVgIG9uIHRoZSBmbHkuXHJcbiAgICAvL1xyXG4gICAgaWYgKHRoaXMuX3JlY2VpdmVyKSB0aGlzLl9yZWNlaXZlci5fYmluYXJ5VHlwZSA9IHR5cGU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAdHlwZSB7TnVtYmVyfVxyXG4gICAqL1xyXG4gIGdldCBidWZmZXJlZEFtb3VudCgpIHtcclxuICAgIGlmICghdGhpcy5fc29ja2V0KSByZXR1cm4gdGhpcy5fYnVmZmVyZWRBbW91bnQ7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX3NvY2tldC5fd3JpdGFibGVTdGF0ZS5sZW5ndGggKyB0aGlzLl9zZW5kZXIuX2J1ZmZlcmVkQnl0ZXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAdHlwZSB7U3RyaW5nfVxyXG4gICAqL1xyXG4gIGdldCBleHRlbnNpb25zKCkge1xyXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX2V4dGVuc2lvbnMpLmpvaW4oKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEB0eXBlIHtCb29sZWFufVxyXG4gICAqL1xyXG4gIGdldCBpc1BhdXNlZCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9wYXVzZWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAdHlwZSB7RnVuY3Rpb259XHJcbiAgICovXHJcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cclxuICBnZXQgb25jbG9zZSgpIHtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQHR5cGUge0Z1bmN0aW9ufVxyXG4gICAqL1xyXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXHJcbiAgZ2V0IG9uZXJyb3IoKSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEB0eXBlIHtGdW5jdGlvbn1cclxuICAgKi9cclxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xyXG4gIGdldCBvbm9wZW4oKSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEB0eXBlIHtGdW5jdGlvbn1cclxuICAgKi9cclxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xyXG4gIGdldCBvbm1lc3NhZ2UoKSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEB0eXBlIHtTdHJpbmd9XHJcbiAgICovXHJcbiAgZ2V0IHByb3RvY29sKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Byb3RvY29sO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQHR5cGUge051bWJlcn1cclxuICAgKi9cclxuICBnZXQgcmVhZHlTdGF0ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9yZWFkeVN0YXRlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQHR5cGUge1N0cmluZ31cclxuICAgKi9cclxuICBnZXQgdXJsKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3VybDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB1cCB0aGUgc29ja2V0IGFuZCB0aGUgaW50ZXJuYWwgcmVzb3VyY2VzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtEdXBsZXh9IHNvY2tldCBUaGUgbmV0d29yayBzb2NrZXQgYmV0d2VlbiB0aGUgc2VydmVyIGFuZCBjbGllbnRcclxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gaGVhZCBUaGUgZmlyc3QgcGFja2V0IG9mIHRoZSB1cGdyYWRlZCBzdHJlYW1cclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBPcHRpb25zIG9iamVjdFxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuYWxsb3dTeW5jaHJvbm91c0V2ZW50cz1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXJcclxuICAgKiAgICAgYW55IG9mIHRoZSBgJ21lc3NhZ2UnYCwgYCdwaW5nJ2AsIGFuZCBgJ3BvbmcnYCBldmVudHMgY2FuIGJlIGVtaXR0ZWRcclxuICAgKiAgICAgbXVsdGlwbGUgdGltZXMgaW4gdGhlIHNhbWUgdGlja1xyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmdlbmVyYXRlTWFza10gVGhlIGZ1bmN0aW9uIHVzZWQgdG8gZ2VuZXJhdGUgdGhlXHJcbiAgICogICAgIG1hc2tpbmcga2V5XHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLm1heFBheWxvYWQ9MF0gVGhlIG1heGltdW0gYWxsb3dlZCBtZXNzYWdlIHNpemVcclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNraXBVVEY4VmFsaWRhdGlvbj1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3JcclxuICAgKiAgICAgbm90IHRvIHNraXAgVVRGLTggdmFsaWRhdGlvbiBmb3IgdGV4dCBhbmQgY2xvc2UgbWVzc2FnZXNcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHNldFNvY2tldChzb2NrZXQsIGhlYWQsIG9wdGlvbnMpIHtcclxuICAgIGNvbnN0IHJlY2VpdmVyID0gbmV3IFJlY2VpdmVyKHtcclxuICAgICAgYWxsb3dTeW5jaHJvbm91c0V2ZW50czogb3B0aW9ucy5hbGxvd1N5bmNocm9ub3VzRXZlbnRzLFxyXG4gICAgICBiaW5hcnlUeXBlOiB0aGlzLmJpbmFyeVR5cGUsXHJcbiAgICAgIGV4dGVuc2lvbnM6IHRoaXMuX2V4dGVuc2lvbnMsXHJcbiAgICAgIGlzU2VydmVyOiB0aGlzLl9pc1NlcnZlcixcclxuICAgICAgbWF4UGF5bG9hZDogb3B0aW9ucy5tYXhQYXlsb2FkLFxyXG4gICAgICBza2lwVVRGOFZhbGlkYXRpb246IG9wdGlvbnMuc2tpcFVURjhWYWxpZGF0aW9uXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBzZW5kZXIgPSBuZXcgU2VuZGVyKHNvY2tldCwgdGhpcy5fZXh0ZW5zaW9ucywgb3B0aW9ucy5nZW5lcmF0ZU1hc2spO1xyXG5cclxuICAgIHRoaXMuX3JlY2VpdmVyID0gcmVjZWl2ZXI7XHJcbiAgICB0aGlzLl9zZW5kZXIgPSBzZW5kZXI7XHJcbiAgICB0aGlzLl9zb2NrZXQgPSBzb2NrZXQ7XHJcblxyXG4gICAgcmVjZWl2ZXJba1dlYlNvY2tldF0gPSB0aGlzO1xyXG4gICAgc2VuZGVyW2tXZWJTb2NrZXRdID0gdGhpcztcclxuICAgIHNvY2tldFtrV2ViU29ja2V0XSA9IHRoaXM7XHJcblxyXG4gICAgcmVjZWl2ZXIub24oJ2NvbmNsdWRlJywgcmVjZWl2ZXJPbkNvbmNsdWRlKTtcclxuICAgIHJlY2VpdmVyLm9uKCdkcmFpbicsIHJlY2VpdmVyT25EcmFpbik7XHJcbiAgICByZWNlaXZlci5vbignZXJyb3InLCByZWNlaXZlck9uRXJyb3IpO1xyXG4gICAgcmVjZWl2ZXIub24oJ21lc3NhZ2UnLCByZWNlaXZlck9uTWVzc2FnZSk7XHJcbiAgICByZWNlaXZlci5vbigncGluZycsIHJlY2VpdmVyT25QaW5nKTtcclxuICAgIHJlY2VpdmVyLm9uKCdwb25nJywgcmVjZWl2ZXJPblBvbmcpO1xyXG5cclxuICAgIHNlbmRlci5vbmVycm9yID0gc2VuZGVyT25FcnJvcjtcclxuXHJcbiAgICAvL1xyXG4gICAgLy8gVGhlc2UgbWV0aG9kcyBtYXkgbm90IGJlIGF2YWlsYWJsZSBpZiBgc29ja2V0YCBpcyBqdXN0IGEgYER1cGxleGAuXHJcbiAgICAvL1xyXG4gICAgaWYgKHNvY2tldC5zZXRUaW1lb3V0KSBzb2NrZXQuc2V0VGltZW91dCgwKTtcclxuICAgIGlmIChzb2NrZXQuc2V0Tm9EZWxheSkgc29ja2V0LnNldE5vRGVsYXkoKTtcclxuXHJcbiAgICBpZiAoaGVhZC5sZW5ndGggPiAwKSBzb2NrZXQudW5zaGlmdChoZWFkKTtcclxuXHJcbiAgICBzb2NrZXQub24oJ2Nsb3NlJywgc29ja2V0T25DbG9zZSk7XHJcbiAgICBzb2NrZXQub24oJ2RhdGEnLCBzb2NrZXRPbkRhdGEpO1xyXG4gICAgc29ja2V0Lm9uKCdlbmQnLCBzb2NrZXRPbkVuZCk7XHJcbiAgICBzb2NrZXQub24oJ2Vycm9yJywgc29ja2V0T25FcnJvcik7XHJcblxyXG4gICAgdGhpcy5fcmVhZHlTdGF0ZSA9IFdlYlNvY2tldC5PUEVOO1xyXG4gICAgdGhpcy5lbWl0KCdvcGVuJyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFbWl0IHRoZSBgJ2Nsb3NlJ2AgZXZlbnQuXHJcbiAgICpcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIGVtaXRDbG9zZSgpIHtcclxuICAgIGlmICghdGhpcy5fc29ja2V0KSB7XHJcbiAgICAgIHRoaXMuX3JlYWR5U3RhdGUgPSBXZWJTb2NrZXQuQ0xPU0VEO1xyXG4gICAgICB0aGlzLmVtaXQoJ2Nsb3NlJywgdGhpcy5fY2xvc2VDb2RlLCB0aGlzLl9jbG9zZU1lc3NhZ2UpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX2V4dGVuc2lvbnNbUGVyTWVzc2FnZURlZmxhdGUuZXh0ZW5zaW9uTmFtZV0pIHtcclxuICAgICAgdGhpcy5fZXh0ZW5zaW9uc1tQZXJNZXNzYWdlRGVmbGF0ZS5leHRlbnNpb25OYW1lXS5jbGVhbnVwKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fcmVjZWl2ZXIucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XHJcbiAgICB0aGlzLl9yZWFkeVN0YXRlID0gV2ViU29ja2V0LkNMT1NFRDtcclxuICAgIHRoaXMuZW1pdCgnY2xvc2UnLCB0aGlzLl9jbG9zZUNvZGUsIHRoaXMuX2Nsb3NlTWVzc2FnZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTdGFydCBhIGNsb3NpbmcgaGFuZHNoYWtlLlxyXG4gICAqXHJcbiAgICogICAgICAgICAgKy0tLS0tLS0tLS0rICAgKy0tLS0tLS0tLS0tKyAgICstLS0tLS0tLS0tK1xyXG4gICAqICAgICAtIC0gLXx3cy5jbG9zZSgpfC0tPnxjbG9zZSBmcmFtZXwtLT58d3MuY2xvc2UoKXwtIC0gLVxyXG4gICAqICAgIHwgICAgICstLS0tLS0tLS0tKyAgICstLS0tLS0tLS0tLSsgICArLS0tLS0tLS0tLSsgICAgIHxcclxuICAgKiAgICAgICAgICArLS0tLS0tLS0tLSsgICArLS0tLS0tLS0tLS0rICAgICAgICAgfFxyXG4gICAqIENMT1NJTkcgIHx3cy5jbG9zZSgpfDwtLXxjbG9zZSBmcmFtZXw8LS0rLS0tLS0rICAgICAgIENMT1NJTkdcclxuICAgKiAgICAgICAgICArLS0tLS0tLS0tLSsgICArLS0tLS0tLS0tLS0rICAgfFxyXG4gICAqICAgIHwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgKy0tLSsgICAgICAgIHxcclxuICAgKiAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tPnxmaW58IC0gLSAtIC1cclxuICAgKiAgICB8ICAgICAgICAgKy0tLSsgICAgICAgICAgICAgICAgICAgICAgfCAgICstLS0rXHJcbiAgICogICAgIC0gLSAtIC0gLXxmaW58PC0tLS0tLS0tLS0tLS0tLS0tLS0tLStcclxuICAgKiAgICAgICAgICAgICAgKy0tLStcclxuICAgKlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbY29kZV0gU3RhdHVzIGNvZGUgZXhwbGFpbmluZyB3aHkgdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2luZ1xyXG4gICAqIEBwYXJhbSB7KFN0cmluZ3xCdWZmZXIpfSBbZGF0YV0gVGhlIHJlYXNvbiB3aHkgdGhlIGNvbm5lY3Rpb24gaXNcclxuICAgKiAgICAgY2xvc2luZ1xyXG4gICAqIEBwdWJsaWNcclxuICAgKi9cclxuICBjbG9zZShjb2RlLCBkYXRhKSB7XHJcbiAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuQ0xPU0VEKSByZXR1cm47XHJcbiAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuQ09OTkVDVElORykge1xyXG4gICAgICBjb25zdCBtc2cgPSAnV2ViU29ja2V0IHdhcyBjbG9zZWQgYmVmb3JlIHRoZSBjb25uZWN0aW9uIHdhcyBlc3RhYmxpc2hlZCc7XHJcbiAgICAgIGFib3J0SGFuZHNoYWtlKHRoaXMsIHRoaXMuX3JlcSwgbXNnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DTE9TSU5HKSB7XHJcbiAgICAgIGlmIChcclxuICAgICAgICB0aGlzLl9jbG9zZUZyYW1lU2VudCAmJlxyXG4gICAgICAgICh0aGlzLl9jbG9zZUZyYW1lUmVjZWl2ZWQgfHwgdGhpcy5fcmVjZWl2ZXIuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkKVxyXG4gICAgICApIHtcclxuICAgICAgICB0aGlzLl9zb2NrZXQuZW5kKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9yZWFkeVN0YXRlID0gV2ViU29ja2V0LkNMT1NJTkc7XHJcbiAgICB0aGlzLl9zZW5kZXIuY2xvc2UoY29kZSwgZGF0YSwgIXRoaXMuX2lzU2VydmVyLCAoZXJyKSA9PiB7XHJcbiAgICAgIC8vXHJcbiAgICAgIC8vIFRoaXMgZXJyb3IgaXMgaGFuZGxlZCBieSB0aGUgYCdlcnJvcidgIGxpc3RlbmVyIG9uIHRoZSBzb2NrZXQuIFdlIG9ubHlcclxuICAgICAgLy8gd2FudCB0byBrbm93IGlmIHRoZSBjbG9zZSBmcmFtZSBoYXMgYmVlbiBzZW50IGhlcmUuXHJcbiAgICAgIC8vXHJcbiAgICAgIGlmIChlcnIpIHJldHVybjtcclxuXHJcbiAgICAgIHRoaXMuX2Nsb3NlRnJhbWVTZW50ID0gdHJ1ZTtcclxuXHJcbiAgICAgIGlmIChcclxuICAgICAgICB0aGlzLl9jbG9zZUZyYW1lUmVjZWl2ZWQgfHxcclxuICAgICAgICB0aGlzLl9yZWNlaXZlci5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWRcclxuICAgICAgKSB7XHJcbiAgICAgICAgdGhpcy5fc29ja2V0LmVuZCgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBzZXRDbG9zZVRpbWVyKHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGF1c2UgdGhlIHNvY2tldC5cclxuICAgKlxyXG4gICAqIEBwdWJsaWNcclxuICAgKi9cclxuICBwYXVzZSgpIHtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuQ09OTkVDVElORyB8fFxyXG4gICAgICB0aGlzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DTE9TRURcclxuICAgICkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fcGF1c2VkID0gdHJ1ZTtcclxuICAgIHRoaXMuX3NvY2tldC5wYXVzZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2VuZCBhIHBpbmcuXHJcbiAgICpcclxuICAgKiBAcGFyYW0geyp9IFtkYXRhXSBUaGUgZGF0YSB0byBzZW5kXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbbWFza10gSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRvIG1hc2sgYGRhdGFgXHJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NiXSBDYWxsYmFjayB3aGljaCBpcyBleGVjdXRlZCB3aGVuIHRoZSBwaW5nIGlzIHNlbnRcclxuICAgKiBAcHVibGljXHJcbiAgICovXHJcbiAgcGluZyhkYXRhLCBtYXNrLCBjYikge1xyXG4gICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0LkNPTk5FQ1RJTkcpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdXZWJTb2NrZXQgaXMgbm90IG9wZW46IHJlYWR5U3RhdGUgMCAoQ09OTkVDVElORyknKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgY2IgPSBkYXRhO1xyXG4gICAgICBkYXRhID0gbWFzayA9IHVuZGVmaW5lZDtcclxuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1hc2sgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgY2IgPSBtYXNrO1xyXG4gICAgICBtYXNrID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ251bWJlcicpIGRhdGEgPSBkYXRhLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgaWYgKHRoaXMucmVhZHlTdGF0ZSAhPT0gV2ViU29ja2V0Lk9QRU4pIHtcclxuICAgICAgc2VuZEFmdGVyQ2xvc2UodGhpcywgZGF0YSwgY2IpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG1hc2sgPT09IHVuZGVmaW5lZCkgbWFzayA9ICF0aGlzLl9pc1NlcnZlcjtcclxuICAgIHRoaXMuX3NlbmRlci5waW5nKGRhdGEgfHwgRU1QVFlfQlVGRkVSLCBtYXNrLCBjYik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZW5kIGEgcG9uZy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7Kn0gW2RhdGFdIFRoZSBkYXRhIHRvIHNlbmRcclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFttYXNrXSBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdG8gbWFzayBgZGF0YWBcclxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2JdIENhbGxiYWNrIHdoaWNoIGlzIGV4ZWN1dGVkIHdoZW4gdGhlIHBvbmcgaXMgc2VudFxyXG4gICAqIEBwdWJsaWNcclxuICAgKi9cclxuICBwb25nKGRhdGEsIG1hc2ssIGNiKSB7XHJcbiAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuQ09OTkVDVElORykge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlYlNvY2tldCBpcyBub3Qgb3BlbjogcmVhZHlTdGF0ZSAwIChDT05ORUNUSU5HKScpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICBjYiA9IGRhdGE7XHJcbiAgICAgIGRhdGEgPSBtYXNrID0gdW5kZWZpbmVkO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbWFzayA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICBjYiA9IG1hc2s7XHJcbiAgICAgIG1hc2sgPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnbnVtYmVyJykgZGF0YSA9IGRhdGEudG9TdHJpbmcoKTtcclxuXHJcbiAgICBpZiAodGhpcy5yZWFkeVN0YXRlICE9PSBXZWJTb2NrZXQuT1BFTikge1xyXG4gICAgICBzZW5kQWZ0ZXJDbG9zZSh0aGlzLCBkYXRhLCBjYik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobWFzayA9PT0gdW5kZWZpbmVkKSBtYXNrID0gIXRoaXMuX2lzU2VydmVyO1xyXG4gICAgdGhpcy5fc2VuZGVyLnBvbmcoZGF0YSB8fCBFTVBUWV9CVUZGRVIsIG1hc2ssIGNiKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc3VtZSB0aGUgc29ja2V0LlxyXG4gICAqXHJcbiAgICogQHB1YmxpY1xyXG4gICAqL1xyXG4gIHJlc3VtZSgpIHtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuQ09OTkVDVElORyB8fFxyXG4gICAgICB0aGlzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DTE9TRURcclxuICAgICkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fcGF1c2VkID0gZmFsc2U7XHJcbiAgICBpZiAoIXRoaXMuX3JlY2VpdmVyLl93cml0YWJsZVN0YXRlLm5lZWREcmFpbikgdGhpcy5fc29ja2V0LnJlc3VtZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2VuZCBhIGRhdGEgbWVzc2FnZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7Kn0gZGF0YSBUaGUgbWVzc2FnZSB0byBzZW5kXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBPcHRpb25zIG9iamVjdFxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuYmluYXJ5XSBTcGVjaWZpZXMgd2hldGhlciBgZGF0YWAgaXMgYmluYXJ5IG9yXHJcbiAgICogICAgIHRleHRcclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmNvbXByZXNzXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gY29tcHJlc3NcclxuICAgKiAgICAgYGRhdGFgXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5maW49dHJ1ZV0gU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGZyYWdtZW50IGlzIHRoZVxyXG4gICAqICAgICBsYXN0IG9uZVxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMubWFza10gU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIG1hc2sgYGRhdGFgXHJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NiXSBDYWxsYmFjayB3aGljaCBpcyBleGVjdXRlZCB3aGVuIGRhdGEgaXMgd3JpdHRlbiBvdXRcclxuICAgKiBAcHVibGljXHJcbiAgICovXHJcbiAgc2VuZChkYXRhLCBvcHRpb25zLCBjYikge1xyXG4gICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0LkNPTk5FQ1RJTkcpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdXZWJTb2NrZXQgaXMgbm90IG9wZW46IHJlYWR5U3RhdGUgMCAoQ09OTkVDVElORyknKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgY2IgPSBvcHRpb25zO1xyXG4gICAgICBvcHRpb25zID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnbnVtYmVyJykgZGF0YSA9IGRhdGEudG9TdHJpbmcoKTtcclxuXHJcbiAgICBpZiAodGhpcy5yZWFkeVN0YXRlICE9PSBXZWJTb2NrZXQuT1BFTikge1xyXG4gICAgICBzZW5kQWZ0ZXJDbG9zZSh0aGlzLCBkYXRhLCBjYik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBvcHRzID0ge1xyXG4gICAgICBiaW5hcnk6IHR5cGVvZiBkYXRhICE9PSAnc3RyaW5nJyxcclxuICAgICAgbWFzazogIXRoaXMuX2lzU2VydmVyLFxyXG4gICAgICBjb21wcmVzczogdHJ1ZSxcclxuICAgICAgZmluOiB0cnVlLFxyXG4gICAgICAuLi5vcHRpb25zXHJcbiAgICB9O1xyXG5cclxuICAgIGlmICghdGhpcy5fZXh0ZW5zaW9uc1tQZXJNZXNzYWdlRGVmbGF0ZS5leHRlbnNpb25OYW1lXSkge1xyXG4gICAgICBvcHRzLmNvbXByZXNzID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fc2VuZGVyLnNlbmQoZGF0YSB8fCBFTVBUWV9CVUZGRVIsIG9wdHMsIGNiKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZvcmNpYmx5IGNsb3NlIHRoZSBjb25uZWN0aW9uLlxyXG4gICAqXHJcbiAgICogQHB1YmxpY1xyXG4gICAqL1xyXG4gIHRlcm1pbmF0ZSgpIHtcclxuICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DTE9TRUQpIHJldHVybjtcclxuICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DT05ORUNUSU5HKSB7XHJcbiAgICAgIGNvbnN0IG1zZyA9ICdXZWJTb2NrZXQgd2FzIGNsb3NlZCBiZWZvcmUgdGhlIGNvbm5lY3Rpb24gd2FzIGVzdGFibGlzaGVkJztcclxuICAgICAgYWJvcnRIYW5kc2hha2UodGhpcywgdGhpcy5fcmVxLCBtc2cpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX3NvY2tldCkge1xyXG4gICAgICB0aGlzLl9yZWFkeVN0YXRlID0gV2ViU29ja2V0LkNMT1NJTkc7XHJcbiAgICAgIHRoaXMuX3NvY2tldC5kZXN0cm95KCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogQGNvbnN0YW50IHtOdW1iZXJ9IENPTk5FQ1RJTkdcclxuICogQG1lbWJlcm9mIFdlYlNvY2tldFxyXG4gKi9cclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFdlYlNvY2tldCwgJ0NPTk5FQ1RJTkcnLCB7XHJcbiAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICB2YWx1ZTogcmVhZHlTdGF0ZXMuaW5kZXhPZignQ09OTkVDVElORycpXHJcbn0pO1xyXG5cclxuLyoqXHJcbiAqIEBjb25zdGFudCB7TnVtYmVyfSBDT05ORUNUSU5HXHJcbiAqIEBtZW1iZXJvZiBXZWJTb2NrZXQucHJvdG90eXBlXHJcbiAqL1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoV2ViU29ja2V0LnByb3RvdHlwZSwgJ0NPTk5FQ1RJTkcnLCB7XHJcbiAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICB2YWx1ZTogcmVhZHlTdGF0ZXMuaW5kZXhPZignQ09OTkVDVElORycpXHJcbn0pO1xyXG5cclxuLyoqXHJcbiAqIEBjb25zdGFudCB7TnVtYmVyfSBPUEVOXHJcbiAqIEBtZW1iZXJvZiBXZWJTb2NrZXRcclxuICovXHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShXZWJTb2NrZXQsICdPUEVOJywge1xyXG4gIGVudW1lcmFibGU6IHRydWUsXHJcbiAgdmFsdWU6IHJlYWR5U3RhdGVzLmluZGV4T2YoJ09QRU4nKVxyXG59KTtcclxuXHJcbi8qKlxyXG4gKiBAY29uc3RhbnQge051bWJlcn0gT1BFTlxyXG4gKiBAbWVtYmVyb2YgV2ViU29ja2V0LnByb3RvdHlwZVxyXG4gKi9cclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFdlYlNvY2tldC5wcm90b3R5cGUsICdPUEVOJywge1xyXG4gIGVudW1lcmFibGU6IHRydWUsXHJcbiAgdmFsdWU6IHJlYWR5U3RhdGVzLmluZGV4T2YoJ09QRU4nKVxyXG59KTtcclxuXHJcbi8qKlxyXG4gKiBAY29uc3RhbnQge051bWJlcn0gQ0xPU0lOR1xyXG4gKiBAbWVtYmVyb2YgV2ViU29ja2V0XHJcbiAqL1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoV2ViU29ja2V0LCAnQ0xPU0lORycsIHtcclxuICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gIHZhbHVlOiByZWFkeVN0YXRlcy5pbmRleE9mKCdDTE9TSU5HJylcclxufSk7XHJcblxyXG4vKipcclxuICogQGNvbnN0YW50IHtOdW1iZXJ9IENMT1NJTkdcclxuICogQG1lbWJlcm9mIFdlYlNvY2tldC5wcm90b3R5cGVcclxuICovXHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShXZWJTb2NrZXQucHJvdG90eXBlLCAnQ0xPU0lORycsIHtcclxuICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gIHZhbHVlOiByZWFkeVN0YXRlcy5pbmRleE9mKCdDTE9TSU5HJylcclxufSk7XHJcblxyXG4vKipcclxuICogQGNvbnN0YW50IHtOdW1iZXJ9IENMT1NFRFxyXG4gKiBAbWVtYmVyb2YgV2ViU29ja2V0XHJcbiAqL1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoV2ViU29ja2V0LCAnQ0xPU0VEJywge1xyXG4gIGVudW1lcmFibGU6IHRydWUsXHJcbiAgdmFsdWU6IHJlYWR5U3RhdGVzLmluZGV4T2YoJ0NMT1NFRCcpXHJcbn0pO1xyXG5cclxuLyoqXHJcbiAqIEBjb25zdGFudCB7TnVtYmVyfSBDTE9TRURcclxuICogQG1lbWJlcm9mIFdlYlNvY2tldC5wcm90b3R5cGVcclxuICovXHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShXZWJTb2NrZXQucHJvdG90eXBlLCAnQ0xPU0VEJywge1xyXG4gIGVudW1lcmFibGU6IHRydWUsXHJcbiAgdmFsdWU6IHJlYWR5U3RhdGVzLmluZGV4T2YoJ0NMT1NFRCcpXHJcbn0pO1xyXG5cclxuW1xyXG4gICdiaW5hcnlUeXBlJyxcclxuICAnYnVmZmVyZWRBbW91bnQnLFxyXG4gICdleHRlbnNpb25zJyxcclxuICAnaXNQYXVzZWQnLFxyXG4gICdwcm90b2NvbCcsXHJcbiAgJ3JlYWR5U3RhdGUnLFxyXG4gICd1cmwnXHJcbl0uZm9yRWFjaCgocHJvcGVydHkpID0+IHtcclxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoV2ViU29ja2V0LnByb3RvdHlwZSwgcHJvcGVydHksIHsgZW51bWVyYWJsZTogdHJ1ZSB9KTtcclxufSk7XHJcblxyXG4vL1xyXG4vLyBBZGQgdGhlIGBvbm9wZW5gLCBgb25lcnJvcmAsIGBvbmNsb3NlYCwgYW5kIGBvbm1lc3NhZ2VgIGF0dHJpYnV0ZXMuXHJcbi8vIFNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9jb21tcy5odG1sI3RoZS13ZWJzb2NrZXQtaW50ZXJmYWNlXHJcbi8vXHJcblsnb3BlbicsICdlcnJvcicsICdjbG9zZScsICdtZXNzYWdlJ10uZm9yRWFjaCgobWV0aG9kKSA9PiB7XHJcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdlYlNvY2tldC5wcm90b3R5cGUsIGBvbiR7bWV0aG9kfWAsIHtcclxuICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICBnZXQoKSB7XHJcbiAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5saXN0ZW5lcnMobWV0aG9kKSkge1xyXG4gICAgICAgIGlmIChsaXN0ZW5lcltrRm9yT25FdmVudEF0dHJpYnV0ZV0pIHJldHVybiBsaXN0ZW5lcltrTGlzdGVuZXJdO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH0sXHJcbiAgICBzZXQoaGFuZGxlcikge1xyXG4gICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMubGlzdGVuZXJzKG1ldGhvZCkpIHtcclxuICAgICAgICBpZiAobGlzdGVuZXJba0Zvck9uRXZlbnRBdHRyaWJ1dGVdKSB7XHJcbiAgICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKG1ldGhvZCwgbGlzdGVuZXIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodHlwZW9mIGhhbmRsZXIgIT09ICdmdW5jdGlvbicpIHJldHVybjtcclxuXHJcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihtZXRob2QsIGhhbmRsZXIsIHtcclxuICAgICAgICBba0Zvck9uRXZlbnRBdHRyaWJ1dGVdOiB0cnVlXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH0pO1xyXG59KTtcclxuXHJcbldlYlNvY2tldC5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lciA9IGFkZEV2ZW50TGlzdGVuZXI7XHJcbldlYlNvY2tldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IHJlbW92ZUV2ZW50TGlzdGVuZXI7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFdlYlNvY2tldDtcclxuXHJcbi8qKlxyXG4gKiBJbml0aWFsaXplIGEgV2ViU29ja2V0IGNsaWVudC5cclxuICpcclxuICogQHBhcmFtIHtXZWJTb2NrZXR9IHdlYnNvY2tldCBUaGUgY2xpZW50IHRvIGluaXRpYWxpemVcclxuICogQHBhcmFtIHsoU3RyaW5nfFVSTCl9IGFkZHJlc3MgVGhlIFVSTCB0byB3aGljaCB0byBjb25uZWN0XHJcbiAqIEBwYXJhbSB7QXJyYXl9IHByb3RvY29scyBUaGUgc3VicHJvdG9jb2xzXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gQ29ubmVjdGlvbiBvcHRpb25zXHJcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuYWxsb3dTeW5jaHJvbm91c0V2ZW50cz10cnVlXSBTcGVjaWZpZXMgd2hldGhlciBhbnlcclxuICogICAgIG9mIHRoZSBgJ21lc3NhZ2UnYCwgYCdwaW5nJ2AsIGFuZCBgJ3BvbmcnYCBldmVudHMgY2FuIGJlIGVtaXR0ZWQgbXVsdGlwbGVcclxuICogICAgIHRpbWVzIGluIHRoZSBzYW1lIHRpY2tcclxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5hdXRvUG9uZz10cnVlXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG9cclxuICogICAgIGF1dG9tYXRpY2FsbHkgc2VuZCBhIHBvbmcgaW4gcmVzcG9uc2UgdG8gYSBwaW5nXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmZpbmlzaFJlcXVlc3RdIEEgZnVuY3Rpb24gd2hpY2ggY2FuIGJlIHVzZWQgdG9cclxuICogICAgIGN1c3RvbWl6ZSB0aGUgaGVhZGVycyBvZiBlYWNoIGh0dHAgcmVxdWVzdCBiZWZvcmUgaXQgaXMgc2VudFxyXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmZvbGxvd1JlZGlyZWN0cz1mYWxzZV0gV2hldGhlciBvciBub3QgdG8gZm9sbG93XHJcbiAqICAgICByZWRpcmVjdHNcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuZ2VuZXJhdGVNYXNrXSBUaGUgZnVuY3Rpb24gdXNlZCB0byBnZW5lcmF0ZSB0aGVcclxuICogICAgIG1hc2tpbmcga2V5XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5oYW5kc2hha2VUaW1lb3V0XSBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgdGhlXHJcbiAqICAgICBoYW5kc2hha2UgcmVxdWVzdFxyXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMubWF4UGF5bG9hZD0xMDQ4NTc2MDBdIFRoZSBtYXhpbXVtIGFsbG93ZWQgbWVzc2FnZVxyXG4gKiAgICAgc2l6ZVxyXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMubWF4UmVkaXJlY3RzPTEwXSBUaGUgbWF4aW11bSBudW1iZXIgb2YgcmVkaXJlY3RzXHJcbiAqICAgICBhbGxvd2VkXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5vcmlnaW5dIFZhbHVlIG9mIHRoZSBgT3JpZ2luYCBvclxyXG4gKiAgICAgYFNlYy1XZWJTb2NrZXQtT3JpZ2luYCBoZWFkZXJcclxuICogQHBhcmFtIHsoQm9vbGVhbnxPYmplY3QpfSBbb3B0aW9ucy5wZXJNZXNzYWdlRGVmbGF0ZT10cnVlXSBFbmFibGUvZGlzYWJsZVxyXG4gKiAgICAgcGVybWVzc2FnZS1kZWZsYXRlXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5wcm90b2NvbFZlcnNpb249MTNdIFZhbHVlIG9mIHRoZVxyXG4gKiAgICAgYFNlYy1XZWJTb2NrZXQtVmVyc2lvbmAgaGVhZGVyXHJcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuc2tpcFVURjhWYWxpZGF0aW9uPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBvclxyXG4gKiAgICAgbm90IHRvIHNraXAgVVRGLTggdmFsaWRhdGlvbiBmb3IgdGV4dCBhbmQgY2xvc2UgbWVzc2FnZXNcclxuICogQHByaXZhdGVcclxuICovXHJcbmZ1bmN0aW9uIGluaXRBc0NsaWVudCh3ZWJzb2NrZXQsIGFkZHJlc3MsIHByb3RvY29scywgb3B0aW9ucykge1xyXG4gIGNvbnN0IG9wdHMgPSB7XHJcbiAgICBhbGxvd1N5bmNocm9ub3VzRXZlbnRzOiB0cnVlLFxyXG4gICAgYXV0b1Bvbmc6IHRydWUsXHJcbiAgICBwcm90b2NvbFZlcnNpb246IHByb3RvY29sVmVyc2lvbnNbMV0sXHJcbiAgICBtYXhQYXlsb2FkOiAxMDAgKiAxMDI0ICogMTAyNCxcclxuICAgIHNraXBVVEY4VmFsaWRhdGlvbjogZmFsc2UsXHJcbiAgICBwZXJNZXNzYWdlRGVmbGF0ZTogdHJ1ZSxcclxuICAgIGZvbGxvd1JlZGlyZWN0czogZmFsc2UsXHJcbiAgICBtYXhSZWRpcmVjdHM6IDEwLFxyXG4gICAgLi4ub3B0aW9ucyxcclxuICAgIHNvY2tldFBhdGg6IHVuZGVmaW5lZCxcclxuICAgIGhvc3RuYW1lOiB1bmRlZmluZWQsXHJcbiAgICBwcm90b2NvbDogdW5kZWZpbmVkLFxyXG4gICAgdGltZW91dDogdW5kZWZpbmVkLFxyXG4gICAgbWV0aG9kOiAnR0VUJyxcclxuICAgIGhvc3Q6IHVuZGVmaW5lZCxcclxuICAgIHBhdGg6IHVuZGVmaW5lZCxcclxuICAgIHBvcnQ6IHVuZGVmaW5lZFxyXG4gIH07XHJcblxyXG4gIHdlYnNvY2tldC5fYXV0b1BvbmcgPSBvcHRzLmF1dG9Qb25nO1xyXG5cclxuICBpZiAoIXByb3RvY29sVmVyc2lvbnMuaW5jbHVkZXMob3B0cy5wcm90b2NvbFZlcnNpb24pKSB7XHJcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcclxuICAgICAgYFVuc3VwcG9ydGVkIHByb3RvY29sIHZlcnNpb246ICR7b3B0cy5wcm90b2NvbFZlcnNpb259IGAgK1xyXG4gICAgICAgIGAoc3VwcG9ydGVkIHZlcnNpb25zOiAke3Byb3RvY29sVmVyc2lvbnMuam9pbignLCAnKX0pYFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGxldCBwYXJzZWRVcmw7XHJcblxyXG4gIGlmIChhZGRyZXNzIGluc3RhbmNlb2YgVVJMKSB7XHJcbiAgICBwYXJzZWRVcmwgPSBhZGRyZXNzO1xyXG4gIH0gZWxzZSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBwYXJzZWRVcmwgPSBuZXcgVVJMKGFkZHJlc3MpO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYEludmFsaWQgVVJMOiAke2FkZHJlc3N9YCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpZiAocGFyc2VkVXJsLnByb3RvY29sID09PSAnaHR0cDonKSB7XHJcbiAgICBwYXJzZWRVcmwucHJvdG9jb2wgPSAnd3M6JztcclxuICB9IGVsc2UgaWYgKHBhcnNlZFVybC5wcm90b2NvbCA9PT0gJ2h0dHBzOicpIHtcclxuICAgIHBhcnNlZFVybC5wcm90b2NvbCA9ICd3c3M6JztcclxuICB9XHJcblxyXG4gIHdlYnNvY2tldC5fdXJsID0gcGFyc2VkVXJsLmhyZWY7XHJcblxyXG4gIGNvbnN0IGlzU2VjdXJlID0gcGFyc2VkVXJsLnByb3RvY29sID09PSAnd3NzOic7XHJcbiAgY29uc3QgaXNJcGNVcmwgPSBwYXJzZWRVcmwucHJvdG9jb2wgPT09ICd3cyt1bml4Oic7XHJcbiAgbGV0IGludmFsaWRVcmxNZXNzYWdlO1xyXG5cclxuICBpZiAocGFyc2VkVXJsLnByb3RvY29sICE9PSAnd3M6JyAmJiAhaXNTZWN1cmUgJiYgIWlzSXBjVXJsKSB7XHJcbiAgICBpbnZhbGlkVXJsTWVzc2FnZSA9XHJcbiAgICAgICdUaGUgVVJMXFwncyBwcm90b2NvbCBtdXN0IGJlIG9uZSBvZiBcIndzOlwiLCBcIndzczpcIiwgJyArXHJcbiAgICAgICdcImh0dHA6XCIsIFwiaHR0cHM6XCIsIG9yIFwid3MrdW5peDpcIic7XHJcbiAgfSBlbHNlIGlmIChpc0lwY1VybCAmJiAhcGFyc2VkVXJsLnBhdGhuYW1lKSB7XHJcbiAgICBpbnZhbGlkVXJsTWVzc2FnZSA9IFwiVGhlIFVSTCdzIHBhdGhuYW1lIGlzIGVtcHR5XCI7XHJcbiAgfSBlbHNlIGlmIChwYXJzZWRVcmwuaGFzaCkge1xyXG4gICAgaW52YWxpZFVybE1lc3NhZ2UgPSAnVGhlIFVSTCBjb250YWlucyBhIGZyYWdtZW50IGlkZW50aWZpZXInO1xyXG4gIH1cclxuXHJcbiAgaWYgKGludmFsaWRVcmxNZXNzYWdlKSB7XHJcbiAgICBjb25zdCBlcnIgPSBuZXcgU3ludGF4RXJyb3IoaW52YWxpZFVybE1lc3NhZ2UpO1xyXG5cclxuICAgIGlmICh3ZWJzb2NrZXQuX3JlZGlyZWN0cyA9PT0gMCkge1xyXG4gICAgICB0aHJvdyBlcnI7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBlbWl0RXJyb3JBbmRDbG9zZSh3ZWJzb2NrZXQsIGVycik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0IGRlZmF1bHRQb3J0ID0gaXNTZWN1cmUgPyA0NDMgOiA4MDtcclxuICBjb25zdCBrZXkgPSByYW5kb21CeXRlcygxNikudG9TdHJpbmcoJ2Jhc2U2NCcpO1xyXG4gIGNvbnN0IHJlcXVlc3QgPSBpc1NlY3VyZSA/IGh0dHBzLnJlcXVlc3QgOiBodHRwLnJlcXVlc3Q7XHJcbiAgY29uc3QgcHJvdG9jb2xTZXQgPSBuZXcgU2V0KCk7XHJcbiAgbGV0IHBlck1lc3NhZ2VEZWZsYXRlO1xyXG5cclxuICBvcHRzLmNyZWF0ZUNvbm5lY3Rpb24gPVxyXG4gICAgb3B0cy5jcmVhdGVDb25uZWN0aW9uIHx8IChpc1NlY3VyZSA/IHRsc0Nvbm5lY3QgOiBuZXRDb25uZWN0KTtcclxuICBvcHRzLmRlZmF1bHRQb3J0ID0gb3B0cy5kZWZhdWx0UG9ydCB8fCBkZWZhdWx0UG9ydDtcclxuICBvcHRzLnBvcnQgPSBwYXJzZWRVcmwucG9ydCB8fCBkZWZhdWx0UG9ydDtcclxuICBvcHRzLmhvc3QgPSBwYXJzZWRVcmwuaG9zdG5hbWUuc3RhcnRzV2l0aCgnWycpXHJcbiAgICA/IHBhcnNlZFVybC5ob3N0bmFtZS5zbGljZSgxLCAtMSlcclxuICAgIDogcGFyc2VkVXJsLmhvc3RuYW1lO1xyXG4gIG9wdHMuaGVhZGVycyA9IHtcclxuICAgIC4uLm9wdHMuaGVhZGVycyxcclxuICAgICdTZWMtV2ViU29ja2V0LVZlcnNpb24nOiBvcHRzLnByb3RvY29sVmVyc2lvbixcclxuICAgICdTZWMtV2ViU29ja2V0LUtleSc6IGtleSxcclxuICAgIENvbm5lY3Rpb246ICdVcGdyYWRlJyxcclxuICAgIFVwZ3JhZGU6ICd3ZWJzb2NrZXQnXHJcbiAgfTtcclxuICBvcHRzLnBhdGggPSBwYXJzZWRVcmwucGF0aG5hbWUgKyBwYXJzZWRVcmwuc2VhcmNoO1xyXG4gIG9wdHMudGltZW91dCA9IG9wdHMuaGFuZHNoYWtlVGltZW91dDtcclxuXHJcbiAgaWYgKG9wdHMucGVyTWVzc2FnZURlZmxhdGUpIHtcclxuICAgIHBlck1lc3NhZ2VEZWZsYXRlID0gbmV3IFBlck1lc3NhZ2VEZWZsYXRlKFxyXG4gICAgICBvcHRzLnBlck1lc3NhZ2VEZWZsYXRlICE9PSB0cnVlID8gb3B0cy5wZXJNZXNzYWdlRGVmbGF0ZSA6IHt9LFxyXG4gICAgICBmYWxzZSxcclxuICAgICAgb3B0cy5tYXhQYXlsb2FkXHJcbiAgICApO1xyXG4gICAgb3B0cy5oZWFkZXJzWydTZWMtV2ViU29ja2V0LUV4dGVuc2lvbnMnXSA9IGZvcm1hdCh7XHJcbiAgICAgIFtQZXJNZXNzYWdlRGVmbGF0ZS5leHRlbnNpb25OYW1lXTogcGVyTWVzc2FnZURlZmxhdGUub2ZmZXIoKVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIGlmIChwcm90b2NvbHMubGVuZ3RoKSB7XHJcbiAgICBmb3IgKGNvbnN0IHByb3RvY29sIG9mIHByb3RvY29scykge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdHlwZW9mIHByb3RvY29sICE9PSAnc3RyaW5nJyB8fFxyXG4gICAgICAgICFzdWJwcm90b2NvbFJlZ2V4LnRlc3QocHJvdG9jb2wpIHx8XHJcbiAgICAgICAgcHJvdG9jb2xTZXQuaGFzKHByb3RvY29sKVxyXG4gICAgICApIHtcclxuICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoXHJcbiAgICAgICAgICAnQW4gaW52YWxpZCBvciBkdXBsaWNhdGVkIHN1YnByb3RvY29sIHdhcyBzcGVjaWZpZWQnXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcHJvdG9jb2xTZXQuYWRkKHByb3RvY29sKTtcclxuICAgIH1cclxuXHJcbiAgICBvcHRzLmhlYWRlcnNbJ1NlYy1XZWJTb2NrZXQtUHJvdG9jb2wnXSA9IHByb3RvY29scy5qb2luKCcsJyk7XHJcbiAgfVxyXG4gIGlmIChvcHRzLm9yaWdpbikge1xyXG4gICAgaWYgKG9wdHMucHJvdG9jb2xWZXJzaW9uIDwgMTMpIHtcclxuICAgICAgb3B0cy5oZWFkZXJzWydTZWMtV2ViU29ja2V0LU9yaWdpbiddID0gb3B0cy5vcmlnaW47XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBvcHRzLmhlYWRlcnMuT3JpZ2luID0gb3B0cy5vcmlnaW47XHJcbiAgICB9XHJcbiAgfVxyXG4gIGlmIChwYXJzZWRVcmwudXNlcm5hbWUgfHwgcGFyc2VkVXJsLnBhc3N3b3JkKSB7XHJcbiAgICBvcHRzLmF1dGggPSBgJHtwYXJzZWRVcmwudXNlcm5hbWV9OiR7cGFyc2VkVXJsLnBhc3N3b3JkfWA7XHJcbiAgfVxyXG5cclxuICBpZiAoaXNJcGNVcmwpIHtcclxuICAgIGNvbnN0IHBhcnRzID0gb3B0cy5wYXRoLnNwbGl0KCc6Jyk7XHJcblxyXG4gICAgb3B0cy5zb2NrZXRQYXRoID0gcGFydHNbMF07XHJcbiAgICBvcHRzLnBhdGggPSBwYXJ0c1sxXTtcclxuICB9XHJcblxyXG4gIGxldCByZXE7XHJcblxyXG4gIGlmIChvcHRzLmZvbGxvd1JlZGlyZWN0cykge1xyXG4gICAgaWYgKHdlYnNvY2tldC5fcmVkaXJlY3RzID09PSAwKSB7XHJcbiAgICAgIHdlYnNvY2tldC5fb3JpZ2luYWxJcGMgPSBpc0lwY1VybDtcclxuICAgICAgd2Vic29ja2V0Ll9vcmlnaW5hbFNlY3VyZSA9IGlzU2VjdXJlO1xyXG4gICAgICB3ZWJzb2NrZXQuX29yaWdpbmFsSG9zdE9yU29ja2V0UGF0aCA9IGlzSXBjVXJsXHJcbiAgICAgICAgPyBvcHRzLnNvY2tldFBhdGhcclxuICAgICAgICA6IHBhcnNlZFVybC5ob3N0O1xyXG5cclxuICAgICAgY29uc3QgaGVhZGVycyA9IG9wdGlvbnMgJiYgb3B0aW9ucy5oZWFkZXJzO1xyXG5cclxuICAgICAgLy9cclxuICAgICAgLy8gU2hhbGxvdyBjb3B5IHRoZSB1c2VyIHByb3ZpZGVkIG9wdGlvbnMgc28gdGhhdCBoZWFkZXJzIGNhbiBiZSBjaGFuZ2VkXHJcbiAgICAgIC8vIHdpdGhvdXQgbXV0YXRpbmcgdGhlIG9yaWdpbmFsIG9iamVjdC5cclxuICAgICAgLy9cclxuICAgICAgb3B0aW9ucyA9IHsgLi4ub3B0aW9ucywgaGVhZGVyczoge30gfTtcclxuXHJcbiAgICAgIGlmIChoZWFkZXJzKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoaGVhZGVycykpIHtcclxuICAgICAgICAgIG9wdGlvbnMuaGVhZGVyc1trZXkudG9Mb3dlckNhc2UoKV0gPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAod2Vic29ja2V0Lmxpc3RlbmVyQ291bnQoJ3JlZGlyZWN0JykgPT09IDApIHtcclxuICAgICAgY29uc3QgaXNTYW1lSG9zdCA9IGlzSXBjVXJsXHJcbiAgICAgICAgPyB3ZWJzb2NrZXQuX29yaWdpbmFsSXBjXHJcbiAgICAgICAgICA/IG9wdHMuc29ja2V0UGF0aCA9PT0gd2Vic29ja2V0Ll9vcmlnaW5hbEhvc3RPclNvY2tldFBhdGhcclxuICAgICAgICAgIDogZmFsc2VcclxuICAgICAgICA6IHdlYnNvY2tldC5fb3JpZ2luYWxJcGNcclxuICAgICAgICAgID8gZmFsc2VcclxuICAgICAgICAgIDogcGFyc2VkVXJsLmhvc3QgPT09IHdlYnNvY2tldC5fb3JpZ2luYWxIb3N0T3JTb2NrZXRQYXRoO1xyXG5cclxuICAgICAgaWYgKCFpc1NhbWVIb3N0IHx8ICh3ZWJzb2NrZXQuX29yaWdpbmFsU2VjdXJlICYmICFpc1NlY3VyZSkpIHtcclxuICAgICAgICAvL1xyXG4gICAgICAgIC8vIE1hdGNoIGN1cmwgNy43Ny4wIGJlaGF2aW9yIGFuZCBkcm9wIHRoZSBmb2xsb3dpbmcgaGVhZGVycy4gVGhlc2VcclxuICAgICAgICAvLyBoZWFkZXJzIGFyZSBhbHNvIGRyb3BwZWQgd2hlbiBmb2xsb3dpbmcgYSByZWRpcmVjdCB0byBhIHN1YmRvbWFpbi5cclxuICAgICAgICAvL1xyXG4gICAgICAgIGRlbGV0ZSBvcHRzLmhlYWRlcnMuYXV0aG9yaXphdGlvbjtcclxuICAgICAgICBkZWxldGUgb3B0cy5oZWFkZXJzLmNvb2tpZTtcclxuXHJcbiAgICAgICAgaWYgKCFpc1NhbWVIb3N0KSBkZWxldGUgb3B0cy5oZWFkZXJzLmhvc3Q7XHJcblxyXG4gICAgICAgIG9wdHMuYXV0aCA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vXHJcbiAgICAvLyBNYXRjaCBjdXJsIDcuNzcuMCBiZWhhdmlvciBhbmQgbWFrZSB0aGUgZmlyc3QgYEF1dGhvcml6YXRpb25gIGhlYWRlciB3aW4uXHJcbiAgICAvLyBJZiB0aGUgYEF1dGhvcml6YXRpb25gIGhlYWRlciBpcyBzZXQsIHRoZW4gdGhlcmUgaXMgbm90aGluZyB0byBkbyBhcyBpdFxyXG4gICAgLy8gd2lsbCB0YWtlIHByZWNlZGVuY2UuXHJcbiAgICAvL1xyXG4gICAgaWYgKG9wdHMuYXV0aCAmJiAhb3B0aW9ucy5oZWFkZXJzLmF1dGhvcml6YXRpb24pIHtcclxuICAgICAgb3B0aW9ucy5oZWFkZXJzLmF1dGhvcml6YXRpb24gPVxyXG4gICAgICAgICdCYXNpYyAnICsgQnVmZmVyLmZyb20ob3B0cy5hdXRoKS50b1N0cmluZygnYmFzZTY0Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVxID0gd2Vic29ja2V0Ll9yZXEgPSByZXF1ZXN0KG9wdHMpO1xyXG5cclxuICAgIGlmICh3ZWJzb2NrZXQuX3JlZGlyZWN0cykge1xyXG4gICAgICAvL1xyXG4gICAgICAvLyBVbmxpa2Ugd2hhdCBpcyBkb25lIGZvciB0aGUgYCd1cGdyYWRlJ2AgZXZlbnQsIG5vIGVhcmx5IGV4aXQgaXNcclxuICAgICAgLy8gdHJpZ2dlcmVkIGhlcmUgaWYgdGhlIHVzZXIgY2FsbHMgYHdlYnNvY2tldC5jbG9zZSgpYCBvclxyXG4gICAgICAvLyBgd2Vic29ja2V0LnRlcm1pbmF0ZSgpYCBmcm9tIGEgbGlzdGVuZXIgb2YgdGhlIGAncmVkaXJlY3QnYCBldmVudC4gVGhpc1xyXG4gICAgICAvLyBpcyBiZWNhdXNlIHRoZSB1c2VyIGNhbiBhbHNvIGNhbGwgYHJlcXVlc3QuZGVzdHJveSgpYCB3aXRoIGFuIGVycm9yXHJcbiAgICAgIC8vIGJlZm9yZSBjYWxsaW5nIGB3ZWJzb2NrZXQuY2xvc2UoKWAgb3IgYHdlYnNvY2tldC50ZXJtaW5hdGUoKWAgYW5kIHRoaXNcclxuICAgICAgLy8gd291bGQgcmVzdWx0IGluIGFuIGVycm9yIGJlaW5nIGVtaXR0ZWQgb24gdGhlIGByZXF1ZXN0YCBvYmplY3Qgd2l0aCBub1xyXG4gICAgICAvLyBgJ2Vycm9yJ2AgZXZlbnQgbGlzdGVuZXJzIGF0dGFjaGVkLlxyXG4gICAgICAvL1xyXG4gICAgICB3ZWJzb2NrZXQuZW1pdCgncmVkaXJlY3QnLCB3ZWJzb2NrZXQudXJsLCByZXEpO1xyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICByZXEgPSB3ZWJzb2NrZXQuX3JlcSA9IHJlcXVlc3Qob3B0cyk7XHJcbiAgfVxyXG5cclxuICBpZiAob3B0cy50aW1lb3V0KSB7XHJcbiAgICByZXEub24oJ3RpbWVvdXQnLCAoKSA9PiB7XHJcbiAgICAgIGFib3J0SGFuZHNoYWtlKHdlYnNvY2tldCwgcmVxLCAnT3BlbmluZyBoYW5kc2hha2UgaGFzIHRpbWVkIG91dCcpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICByZXEub24oJ2Vycm9yJywgKGVycikgPT4ge1xyXG4gICAgaWYgKHJlcSA9PT0gbnVsbCB8fCByZXFba0Fib3J0ZWRdKSByZXR1cm47XHJcblxyXG4gICAgcmVxID0gd2Vic29ja2V0Ll9yZXEgPSBudWxsO1xyXG4gICAgZW1pdEVycm9yQW5kQ2xvc2Uod2Vic29ja2V0LCBlcnIpO1xyXG4gIH0pO1xyXG5cclxuICByZXEub24oJ3Jlc3BvbnNlJywgKHJlcykgPT4ge1xyXG4gICAgY29uc3QgbG9jYXRpb24gPSByZXMuaGVhZGVycy5sb2NhdGlvbjtcclxuICAgIGNvbnN0IHN0YXR1c0NvZGUgPSByZXMuc3RhdHVzQ29kZTtcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIGxvY2F0aW9uICYmXHJcbiAgICAgIG9wdHMuZm9sbG93UmVkaXJlY3RzICYmXHJcbiAgICAgIHN0YXR1c0NvZGUgPj0gMzAwICYmXHJcbiAgICAgIHN0YXR1c0NvZGUgPCA0MDBcclxuICAgICkge1xyXG4gICAgICBpZiAoKyt3ZWJzb2NrZXQuX3JlZGlyZWN0cyA+IG9wdHMubWF4UmVkaXJlY3RzKSB7XHJcbiAgICAgICAgYWJvcnRIYW5kc2hha2Uod2Vic29ja2V0LCByZXEsICdNYXhpbXVtIHJlZGlyZWN0cyBleGNlZWRlZCcpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmVxLmFib3J0KCk7XHJcblxyXG4gICAgICBsZXQgYWRkcjtcclxuXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgYWRkciA9IG5ldyBVUkwobG9jYXRpb24sIGFkZHJlc3MpO1xyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgY29uc3QgZXJyID0gbmV3IFN5bnRheEVycm9yKGBJbnZhbGlkIFVSTDogJHtsb2NhdGlvbn1gKTtcclxuICAgICAgICBlbWl0RXJyb3JBbmRDbG9zZSh3ZWJzb2NrZXQsIGVycik7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpbml0QXNDbGllbnQod2Vic29ja2V0LCBhZGRyLCBwcm90b2NvbHMsIG9wdGlvbnMpO1xyXG4gICAgfSBlbHNlIGlmICghd2Vic29ja2V0LmVtaXQoJ3VuZXhwZWN0ZWQtcmVzcG9uc2UnLCByZXEsIHJlcykpIHtcclxuICAgICAgYWJvcnRIYW5kc2hha2UoXHJcbiAgICAgICAgd2Vic29ja2V0LFxyXG4gICAgICAgIHJlcSxcclxuICAgICAgICBgVW5leHBlY3RlZCBzZXJ2ZXIgcmVzcG9uc2U6ICR7cmVzLnN0YXR1c0NvZGV9YFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH0pO1xyXG5cclxuICByZXEub24oJ3VwZ3JhZGUnLCAocmVzLCBzb2NrZXQsIGhlYWQpID0+IHtcclxuICAgIHdlYnNvY2tldC5lbWl0KCd1cGdyYWRlJywgcmVzKTtcclxuXHJcbiAgICAvL1xyXG4gICAgLy8gVGhlIHVzZXIgbWF5IGhhdmUgY2xvc2VkIHRoZSBjb25uZWN0aW9uIGZyb20gYSBsaXN0ZW5lciBvZiB0aGVcclxuICAgIC8vIGAndXBncmFkZSdgIGV2ZW50LlxyXG4gICAgLy9cclxuICAgIGlmICh3ZWJzb2NrZXQucmVhZHlTdGF0ZSAhPT0gV2ViU29ja2V0LkNPTk5FQ1RJTkcpIHJldHVybjtcclxuXHJcbiAgICByZXEgPSB3ZWJzb2NrZXQuX3JlcSA9IG51bGw7XHJcblxyXG4gICAgY29uc3QgdXBncmFkZSA9IHJlcy5oZWFkZXJzLnVwZ3JhZGU7XHJcblxyXG4gICAgaWYgKHVwZ3JhZGUgPT09IHVuZGVmaW5lZCB8fCB1cGdyYWRlLnRvTG93ZXJDYXNlKCkgIT09ICd3ZWJzb2NrZXQnKSB7XHJcbiAgICAgIGFib3J0SGFuZHNoYWtlKHdlYnNvY2tldCwgc29ja2V0LCAnSW52YWxpZCBVcGdyYWRlIGhlYWRlcicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZGlnZXN0ID0gY3JlYXRlSGFzaCgnc2hhMScpXHJcbiAgICAgIC51cGRhdGUoa2V5ICsgR1VJRClcclxuICAgICAgLmRpZ2VzdCgnYmFzZTY0Jyk7XHJcblxyXG4gICAgaWYgKHJlcy5oZWFkZXJzWydzZWMtd2Vic29ja2V0LWFjY2VwdCddICE9PSBkaWdlc3QpIHtcclxuICAgICAgYWJvcnRIYW5kc2hha2Uod2Vic29ja2V0LCBzb2NrZXQsICdJbnZhbGlkIFNlYy1XZWJTb2NrZXQtQWNjZXB0IGhlYWRlcicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc2VydmVyUHJvdCA9IHJlcy5oZWFkZXJzWydzZWMtd2Vic29ja2V0LXByb3RvY29sJ107XHJcbiAgICBsZXQgcHJvdEVycm9yO1xyXG5cclxuICAgIGlmIChzZXJ2ZXJQcm90ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgaWYgKCFwcm90b2NvbFNldC5zaXplKSB7XHJcbiAgICAgICAgcHJvdEVycm9yID0gJ1NlcnZlciBzZW50IGEgc3VicHJvdG9jb2wgYnV0IG5vbmUgd2FzIHJlcXVlc3RlZCc7XHJcbiAgICAgIH0gZWxzZSBpZiAoIXByb3RvY29sU2V0LmhhcyhzZXJ2ZXJQcm90KSkge1xyXG4gICAgICAgIHByb3RFcnJvciA9ICdTZXJ2ZXIgc2VudCBhbiBpbnZhbGlkIHN1YnByb3RvY29sJztcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChwcm90b2NvbFNldC5zaXplKSB7XHJcbiAgICAgIHByb3RFcnJvciA9ICdTZXJ2ZXIgc2VudCBubyBzdWJwcm90b2NvbCc7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHByb3RFcnJvcikge1xyXG4gICAgICBhYm9ydEhhbmRzaGFrZSh3ZWJzb2NrZXQsIHNvY2tldCwgcHJvdEVycm9yKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzZXJ2ZXJQcm90KSB3ZWJzb2NrZXQuX3Byb3RvY29sID0gc2VydmVyUHJvdDtcclxuXHJcbiAgICBjb25zdCBzZWNXZWJTb2NrZXRFeHRlbnNpb25zID0gcmVzLmhlYWRlcnNbJ3NlYy13ZWJzb2NrZXQtZXh0ZW5zaW9ucyddO1xyXG5cclxuICAgIGlmIChzZWNXZWJTb2NrZXRFeHRlbnNpb25zICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgaWYgKCFwZXJNZXNzYWdlRGVmbGF0ZSkge1xyXG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPVxyXG4gICAgICAgICAgJ1NlcnZlciBzZW50IGEgU2VjLVdlYlNvY2tldC1FeHRlbnNpb25zIGhlYWRlciBidXQgbm8gZXh0ZW5zaW9uICcgK1xyXG4gICAgICAgICAgJ3dhcyByZXF1ZXN0ZWQnO1xyXG4gICAgICAgIGFib3J0SGFuZHNoYWtlKHdlYnNvY2tldCwgc29ja2V0LCBtZXNzYWdlKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBleHRlbnNpb25zO1xyXG5cclxuICAgICAgdHJ5IHtcclxuICAgICAgICBleHRlbnNpb25zID0gcGFyc2Uoc2VjV2ViU29ja2V0RXh0ZW5zaW9ucyk7XHJcbiAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnSW52YWxpZCBTZWMtV2ViU29ja2V0LUV4dGVuc2lvbnMgaGVhZGVyJztcclxuICAgICAgICBhYm9ydEhhbmRzaGFrZSh3ZWJzb2NrZXQsIHNvY2tldCwgbWVzc2FnZSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBleHRlbnNpb25OYW1lcyA9IE9iamVjdC5rZXlzKGV4dGVuc2lvbnMpO1xyXG5cclxuICAgICAgaWYgKFxyXG4gICAgICAgIGV4dGVuc2lvbk5hbWVzLmxlbmd0aCAhPT0gMSB8fFxyXG4gICAgICAgIGV4dGVuc2lvbk5hbWVzWzBdICE9PSBQZXJNZXNzYWdlRGVmbGF0ZS5leHRlbnNpb25OYW1lXHJcbiAgICAgICkge1xyXG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnU2VydmVyIGluZGljYXRlZCBhbiBleHRlbnNpb24gdGhhdCB3YXMgbm90IHJlcXVlc3RlZCc7XHJcbiAgICAgICAgYWJvcnRIYW5kc2hha2Uod2Vic29ja2V0LCBzb2NrZXQsIG1lc3NhZ2UpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgdHJ5IHtcclxuICAgICAgICBwZXJNZXNzYWdlRGVmbGF0ZS5hY2NlcHQoZXh0ZW5zaW9uc1tQZXJNZXNzYWdlRGVmbGF0ZS5leHRlbnNpb25OYW1lXSk7XHJcbiAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnSW52YWxpZCBTZWMtV2ViU29ja2V0LUV4dGVuc2lvbnMgaGVhZGVyJztcclxuICAgICAgICBhYm9ydEhhbmRzaGFrZSh3ZWJzb2NrZXQsIHNvY2tldCwgbWVzc2FnZSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB3ZWJzb2NrZXQuX2V4dGVuc2lvbnNbUGVyTWVzc2FnZURlZmxhdGUuZXh0ZW5zaW9uTmFtZV0gPVxyXG4gICAgICAgIHBlck1lc3NhZ2VEZWZsYXRlO1xyXG4gICAgfVxyXG5cclxuICAgIHdlYnNvY2tldC5zZXRTb2NrZXQoc29ja2V0LCBoZWFkLCB7XHJcbiAgICAgIGFsbG93U3luY2hyb25vdXNFdmVudHM6IG9wdHMuYWxsb3dTeW5jaHJvbm91c0V2ZW50cyxcclxuICAgICAgZ2VuZXJhdGVNYXNrOiBvcHRzLmdlbmVyYXRlTWFzayxcclxuICAgICAgbWF4UGF5bG9hZDogb3B0cy5tYXhQYXlsb2FkLFxyXG4gICAgICBza2lwVVRGOFZhbGlkYXRpb246IG9wdHMuc2tpcFVURjhWYWxpZGF0aW9uXHJcbiAgICB9KTtcclxuICB9KTtcclxuXHJcbiAgaWYgKG9wdHMuZmluaXNoUmVxdWVzdCkge1xyXG4gICAgb3B0cy5maW5pc2hSZXF1ZXN0KHJlcSwgd2Vic29ja2V0KTtcclxuICB9IGVsc2Uge1xyXG4gICAgcmVxLmVuZCgpO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEVtaXQgdGhlIGAnZXJyb3InYCBhbmQgYCdjbG9zZSdgIGV2ZW50cy5cclxuICpcclxuICogQHBhcmFtIHtXZWJTb2NrZXR9IHdlYnNvY2tldCBUaGUgV2ViU29ja2V0IGluc3RhbmNlXHJcbiAqIEBwYXJhbSB7RXJyb3J9IFRoZSBlcnJvciB0byBlbWl0XHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5mdW5jdGlvbiBlbWl0RXJyb3JBbmRDbG9zZSh3ZWJzb2NrZXQsIGVycikge1xyXG4gIHdlYnNvY2tldC5fcmVhZHlTdGF0ZSA9IFdlYlNvY2tldC5DTE9TSU5HO1xyXG4gIC8vXHJcbiAgLy8gVGhlIGZvbGxvd2luZyBhc3NpZ25tZW50IGlzIHByYWN0aWNhbGx5IHVzZWxlc3MgYW5kIGlzIGRvbmUgb25seSBmb3JcclxuICAvLyBjb25zaXN0ZW5jeS5cclxuICAvL1xyXG4gIHdlYnNvY2tldC5fZXJyb3JFbWl0dGVkID0gdHJ1ZTtcclxuICB3ZWJzb2NrZXQuZW1pdCgnZXJyb3InLCBlcnIpO1xyXG4gIHdlYnNvY2tldC5lbWl0Q2xvc2UoKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENyZWF0ZSBhIGBuZXQuU29ja2V0YCBhbmQgaW5pdGlhdGUgYSBjb25uZWN0aW9uLlxyXG4gKlxyXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBDb25uZWN0aW9uIG9wdGlvbnNcclxuICogQHJldHVybiB7bmV0LlNvY2tldH0gVGhlIG5ld2x5IGNyZWF0ZWQgc29ja2V0IHVzZWQgdG8gc3RhcnQgdGhlIGNvbm5lY3Rpb25cclxuICogQHByaXZhdGVcclxuICovXHJcbmZ1bmN0aW9uIG5ldENvbm5lY3Qob3B0aW9ucykge1xyXG4gIG9wdGlvbnMucGF0aCA9IG9wdGlvbnMuc29ja2V0UGF0aDtcclxuICByZXR1cm4gbmV0LmNvbm5lY3Qob3B0aW9ucyk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGUgYSBgdGxzLlRMU1NvY2tldGAgYW5kIGluaXRpYXRlIGEgY29ubmVjdGlvbi5cclxuICpcclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgQ29ubmVjdGlvbiBvcHRpb25zXHJcbiAqIEByZXR1cm4ge3Rscy5UTFNTb2NrZXR9IFRoZSBuZXdseSBjcmVhdGVkIHNvY2tldCB1c2VkIHRvIHN0YXJ0IHRoZSBjb25uZWN0aW9uXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5mdW5jdGlvbiB0bHNDb25uZWN0KG9wdGlvbnMpIHtcclxuICBvcHRpb25zLnBhdGggPSB1bmRlZmluZWQ7XHJcblxyXG4gIGlmICghb3B0aW9ucy5zZXJ2ZXJuYW1lICYmIG9wdGlvbnMuc2VydmVybmFtZSAhPT0gJycpIHtcclxuICAgIG9wdGlvbnMuc2VydmVybmFtZSA9IG5ldC5pc0lQKG9wdGlvbnMuaG9zdCkgPyAnJyA6IG9wdGlvbnMuaG9zdDtcclxuICB9XHJcblxyXG4gIHJldHVybiB0bHMuY29ubmVjdChvcHRpb25zKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEFib3J0IHRoZSBoYW5kc2hha2UgYW5kIGVtaXQgYW4gZXJyb3IuXHJcbiAqXHJcbiAqIEBwYXJhbSB7V2ViU29ja2V0fSB3ZWJzb2NrZXQgVGhlIFdlYlNvY2tldCBpbnN0YW5jZVxyXG4gKiBAcGFyYW0geyhodHRwLkNsaWVudFJlcXVlc3R8bmV0LlNvY2tldHx0bHMuU29ja2V0KX0gc3RyZWFtIFRoZSByZXF1ZXN0IHRvXHJcbiAqICAgICBhYm9ydCBvciB0aGUgc29ja2V0IHRvIGRlc3Ryb3lcclxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgVGhlIGVycm9yIG1lc3NhZ2VcclxuICogQHByaXZhdGVcclxuICovXHJcbmZ1bmN0aW9uIGFib3J0SGFuZHNoYWtlKHdlYnNvY2tldCwgc3RyZWFtLCBtZXNzYWdlKSB7XHJcbiAgd2Vic29ja2V0Ll9yZWFkeVN0YXRlID0gV2ViU29ja2V0LkNMT1NJTkc7XHJcblxyXG4gIGNvbnN0IGVyciA9IG5ldyBFcnJvcihtZXNzYWdlKTtcclxuICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShlcnIsIGFib3J0SGFuZHNoYWtlKTtcclxuXHJcbiAgaWYgKHN0cmVhbS5zZXRIZWFkZXIpIHtcclxuICAgIHN0cmVhbVtrQWJvcnRlZF0gPSB0cnVlO1xyXG4gICAgc3RyZWFtLmFib3J0KCk7XHJcblxyXG4gICAgaWYgKHN0cmVhbS5zb2NrZXQgJiYgIXN0cmVhbS5zb2NrZXQuZGVzdHJveWVkKSB7XHJcbiAgICAgIC8vXHJcbiAgICAgIC8vIE9uIE5vZGUuanMgPj0gMTQuMy4wIGByZXF1ZXN0LmFib3J0KClgIGRvZXMgbm90IGRlc3Ryb3kgdGhlIHNvY2tldCBpZlxyXG4gICAgICAvLyBjYWxsZWQgYWZ0ZXIgdGhlIHJlcXVlc3QgY29tcGxldGVkLiBTZWVcclxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3dlYnNvY2tldHMvd3MvaXNzdWVzLzE4NjkuXHJcbiAgICAgIC8vXHJcbiAgICAgIHN0cmVhbS5zb2NrZXQuZGVzdHJveSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb2Nlc3MubmV4dFRpY2soZW1pdEVycm9yQW5kQ2xvc2UsIHdlYnNvY2tldCwgZXJyKTtcclxuICB9IGVsc2Uge1xyXG4gICAgc3RyZWFtLmRlc3Ryb3koZXJyKTtcclxuICAgIHN0cmVhbS5vbmNlKCdlcnJvcicsIHdlYnNvY2tldC5lbWl0LmJpbmQod2Vic29ja2V0LCAnZXJyb3InKSk7XHJcbiAgICBzdHJlYW0ub25jZSgnY2xvc2UnLCB3ZWJzb2NrZXQuZW1pdENsb3NlLmJpbmQod2Vic29ja2V0KSk7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogSGFuZGxlIGNhc2VzIHdoZXJlIHRoZSBgcGluZygpYCwgYHBvbmcoKWAsIG9yIGBzZW5kKClgIG1ldGhvZHMgYXJlIGNhbGxlZFxyXG4gKiB3aGVuIHRoZSBgcmVhZHlTdGF0ZWAgYXR0cmlidXRlIGlzIGBDTE9TSU5HYCBvciBgQ0xPU0VEYC5cclxuICpcclxuICogQHBhcmFtIHtXZWJTb2NrZXR9IHdlYnNvY2tldCBUaGUgV2ViU29ja2V0IGluc3RhbmNlXHJcbiAqIEBwYXJhbSB7Kn0gW2RhdGFdIFRoZSBkYXRhIHRvIHNlbmRcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2NiXSBDYWxsYmFja1xyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuZnVuY3Rpb24gc2VuZEFmdGVyQ2xvc2Uod2Vic29ja2V0LCBkYXRhLCBjYikge1xyXG4gIGlmIChkYXRhKSB7XHJcbiAgICBjb25zdCBsZW5ndGggPSBpc0Jsb2IoZGF0YSkgPyBkYXRhLnNpemUgOiB0b0J1ZmZlcihkYXRhKS5sZW5ndGg7XHJcblxyXG4gICAgLy9cclxuICAgIC8vIFRoZSBgX2J1ZmZlcmVkQW1vdW50YCBwcm9wZXJ0eSBpcyB1c2VkIG9ubHkgd2hlbiB0aGUgcGVlciBpcyBhIGNsaWVudCBhbmRcclxuICAgIC8vIHRoZSBvcGVuaW5nIGhhbmRzaGFrZSBmYWlscy4gVW5kZXIgdGhlc2UgY2lyY3Vtc3RhbmNlcywgaW4gZmFjdCwgdGhlXHJcbiAgICAvLyBgc2V0U29ja2V0KClgIG1ldGhvZCBpcyBub3QgY2FsbGVkLCBzbyB0aGUgYF9zb2NrZXRgIGFuZCBgX3NlbmRlcmBcclxuICAgIC8vIHByb3BlcnRpZXMgYXJlIHNldCB0byBgbnVsbGAuXHJcbiAgICAvL1xyXG4gICAgaWYgKHdlYnNvY2tldC5fc29ja2V0KSB3ZWJzb2NrZXQuX3NlbmRlci5fYnVmZmVyZWRCeXRlcyArPSBsZW5ndGg7XHJcbiAgICBlbHNlIHdlYnNvY2tldC5fYnVmZmVyZWRBbW91bnQgKz0gbGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgaWYgKGNiKSB7XHJcbiAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoXHJcbiAgICAgIGBXZWJTb2NrZXQgaXMgbm90IG9wZW46IHJlYWR5U3RhdGUgJHt3ZWJzb2NrZXQucmVhZHlTdGF0ZX0gYCArXHJcbiAgICAgICAgYCgke3JlYWR5U3RhdGVzW3dlYnNvY2tldC5yZWFkeVN0YXRlXX0pYFxyXG4gICAgKTtcclxuICAgIHByb2Nlc3MubmV4dFRpY2soY2IsIGVycik7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogVGhlIGxpc3RlbmVyIG9mIHRoZSBgUmVjZWl2ZXJgIGAnY29uY2x1ZGUnYCBldmVudC5cclxuICpcclxuICogQHBhcmFtIHtOdW1iZXJ9IGNvZGUgVGhlIHN0YXR1cyBjb2RlXHJcbiAqIEBwYXJhbSB7QnVmZmVyfSByZWFzb24gVGhlIHJlYXNvbiBmb3IgY2xvc2luZ1xyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuZnVuY3Rpb24gcmVjZWl2ZXJPbkNvbmNsdWRlKGNvZGUsIHJlYXNvbikge1xyXG4gIGNvbnN0IHdlYnNvY2tldCA9IHRoaXNba1dlYlNvY2tldF07XHJcblxyXG4gIHdlYnNvY2tldC5fY2xvc2VGcmFtZVJlY2VpdmVkID0gdHJ1ZTtcclxuICB3ZWJzb2NrZXQuX2Nsb3NlTWVzc2FnZSA9IHJlYXNvbjtcclxuICB3ZWJzb2NrZXQuX2Nsb3NlQ29kZSA9IGNvZGU7XHJcblxyXG4gIGlmICh3ZWJzb2NrZXQuX3NvY2tldFtrV2ViU29ja2V0XSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XHJcblxyXG4gIHdlYnNvY2tldC5fc29ja2V0LnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgc29ja2V0T25EYXRhKTtcclxuICBwcm9jZXNzLm5leHRUaWNrKHJlc3VtZSwgd2Vic29ja2V0Ll9zb2NrZXQpO1xyXG5cclxuICBpZiAoY29kZSA9PT0gMTAwNSkgd2Vic29ja2V0LmNsb3NlKCk7XHJcbiAgZWxzZSB3ZWJzb2NrZXQuY2xvc2UoY29kZSwgcmVhc29uKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFRoZSBsaXN0ZW5lciBvZiB0aGUgYFJlY2VpdmVyYCBgJ2RyYWluJ2AgZXZlbnQuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5mdW5jdGlvbiByZWNlaXZlck9uRHJhaW4oKSB7XHJcbiAgY29uc3Qgd2Vic29ja2V0ID0gdGhpc1trV2ViU29ja2V0XTtcclxuXHJcbiAgaWYgKCF3ZWJzb2NrZXQuaXNQYXVzZWQpIHdlYnNvY2tldC5fc29ja2V0LnJlc3VtZSgpO1xyXG59XHJcblxyXG4vKipcclxuICogVGhlIGxpc3RlbmVyIG9mIHRoZSBgUmVjZWl2ZXJgIGAnZXJyb3InYCBldmVudC5cclxuICpcclxuICogQHBhcmFtIHsoUmFuZ2VFcnJvcnxFcnJvcil9IGVyciBUaGUgZW1pdHRlZCBlcnJvclxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuZnVuY3Rpb24gcmVjZWl2ZXJPbkVycm9yKGVycikge1xyXG4gIGNvbnN0IHdlYnNvY2tldCA9IHRoaXNba1dlYlNvY2tldF07XHJcblxyXG4gIGlmICh3ZWJzb2NrZXQuX3NvY2tldFtrV2ViU29ja2V0XSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICB3ZWJzb2NrZXQuX3NvY2tldC5yZW1vdmVMaXN0ZW5lcignZGF0YScsIHNvY2tldE9uRGF0YSk7XHJcblxyXG4gICAgLy9cclxuICAgIC8vIE9uIE5vZGUuanMgPCAxNC4wLjAgdGhlIGAnZXJyb3InYCBldmVudCBpcyBlbWl0dGVkIHN5bmNocm9ub3VzbHkuIFNlZVxyXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3dlYnNvY2tldHMvd3MvaXNzdWVzLzE5NDAuXHJcbiAgICAvL1xyXG4gICAgcHJvY2Vzcy5uZXh0VGljayhyZXN1bWUsIHdlYnNvY2tldC5fc29ja2V0KTtcclxuXHJcbiAgICB3ZWJzb2NrZXQuY2xvc2UoZXJyW2tTdGF0dXNDb2RlXSk7XHJcbiAgfVxyXG5cclxuICBpZiAoIXdlYnNvY2tldC5fZXJyb3JFbWl0dGVkKSB7XHJcbiAgICB3ZWJzb2NrZXQuX2Vycm9yRW1pdHRlZCA9IHRydWU7XHJcbiAgICB3ZWJzb2NrZXQuZW1pdCgnZXJyb3InLCBlcnIpO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFRoZSBsaXN0ZW5lciBvZiB0aGUgYFJlY2VpdmVyYCBgJ2ZpbmlzaCdgIGV2ZW50LlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuZnVuY3Rpb24gcmVjZWl2ZXJPbkZpbmlzaCgpIHtcclxuICB0aGlzW2tXZWJTb2NrZXRdLmVtaXRDbG9zZSgpO1xyXG59XHJcblxyXG4vKipcclxuICogVGhlIGxpc3RlbmVyIG9mIHRoZSBgUmVjZWl2ZXJgIGAnbWVzc2FnZSdgIGV2ZW50LlxyXG4gKlxyXG4gKiBAcGFyYW0ge0J1ZmZlcnxBcnJheUJ1ZmZlcnxCdWZmZXJbXSl9IGRhdGEgVGhlIG1lc3NhZ2VcclxuICogQHBhcmFtIHtCb29sZWFufSBpc0JpbmFyeSBTcGVjaWZpZXMgd2hldGhlciB0aGUgbWVzc2FnZSBpcyBiaW5hcnkgb3Igbm90XHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5mdW5jdGlvbiByZWNlaXZlck9uTWVzc2FnZShkYXRhLCBpc0JpbmFyeSkge1xyXG4gIHRoaXNba1dlYlNvY2tldF0uZW1pdCgnbWVzc2FnZScsIGRhdGEsIGlzQmluYXJ5KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFRoZSBsaXN0ZW5lciBvZiB0aGUgYFJlY2VpdmVyYCBgJ3BpbmcnYCBldmVudC5cclxuICpcclxuICogQHBhcmFtIHtCdWZmZXJ9IGRhdGEgVGhlIGRhdGEgaW5jbHVkZWQgaW4gdGhlIHBpbmcgZnJhbWVcclxuICogQHByaXZhdGVcclxuICovXHJcbmZ1bmN0aW9uIHJlY2VpdmVyT25QaW5nKGRhdGEpIHtcclxuICBjb25zdCB3ZWJzb2NrZXQgPSB0aGlzW2tXZWJTb2NrZXRdO1xyXG5cclxuICBpZiAod2Vic29ja2V0Ll9hdXRvUG9uZykgd2Vic29ja2V0LnBvbmcoZGF0YSwgIXRoaXMuX2lzU2VydmVyLCBOT09QKTtcclxuICB3ZWJzb2NrZXQuZW1pdCgncGluZycsIGRhdGEpO1xyXG59XHJcblxyXG4vKipcclxuICogVGhlIGxpc3RlbmVyIG9mIHRoZSBgUmVjZWl2ZXJgIGAncG9uZydgIGV2ZW50LlxyXG4gKlxyXG4gKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSBUaGUgZGF0YSBpbmNsdWRlZCBpbiB0aGUgcG9uZyBmcmFtZVxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuZnVuY3Rpb24gcmVjZWl2ZXJPblBvbmcoZGF0YSkge1xyXG4gIHRoaXNba1dlYlNvY2tldF0uZW1pdCgncG9uZycsIGRhdGEpO1xyXG59XHJcblxyXG4vKipcclxuICogUmVzdW1lIGEgcmVhZGFibGUgc3RyZWFtXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZGFibGV9IHN0cmVhbSBUaGUgcmVhZGFibGUgc3RyZWFtXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5mdW5jdGlvbiByZXN1bWUoc3RyZWFtKSB7XHJcbiAgc3RyZWFtLnJlc3VtZSgpO1xyXG59XHJcblxyXG4vKipcclxuICogVGhlIGBTZW5kZXJgIGVycm9yIGV2ZW50IGhhbmRsZXIuXHJcbiAqXHJcbiAqIEBwYXJhbSB7RXJyb3J9IFRoZSBlcnJvclxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuZnVuY3Rpb24gc2VuZGVyT25FcnJvcihlcnIpIHtcclxuICBjb25zdCB3ZWJzb2NrZXQgPSB0aGlzW2tXZWJTb2NrZXRdO1xyXG5cclxuICBpZiAod2Vic29ja2V0LnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DTE9TRUQpIHJldHVybjtcclxuICBpZiAod2Vic29ja2V0LnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5PUEVOKSB7XHJcbiAgICB3ZWJzb2NrZXQuX3JlYWR5U3RhdGUgPSBXZWJTb2NrZXQuQ0xPU0lORztcclxuICAgIHNldENsb3NlVGltZXIod2Vic29ja2V0KTtcclxuICB9XHJcblxyXG4gIC8vXHJcbiAgLy8gYHNvY2tldC5lbmQoKWAgaXMgdXNlZCBpbnN0ZWFkIG9mIGBzb2NrZXQuZGVzdHJveSgpYCB0byBhbGxvdyB0aGUgb3RoZXJcclxuICAvLyBwZWVyIHRvIGZpbmlzaCBzZW5kaW5nIHF1ZXVlZCBkYXRhLiBUaGVyZSBpcyBubyBuZWVkIHRvIHNldCBhIHRpbWVyIGhlcmVcclxuICAvLyBiZWNhdXNlIGBDTE9TSU5HYCBtZWFucyB0aGF0IGl0IGlzIGFscmVhZHkgc2V0IG9yIG5vdCBuZWVkZWQuXHJcbiAgLy9cclxuICB0aGlzLl9zb2NrZXQuZW5kKCk7XHJcblxyXG4gIGlmICghd2Vic29ja2V0Ll9lcnJvckVtaXR0ZWQpIHtcclxuICAgIHdlYnNvY2tldC5fZXJyb3JFbWl0dGVkID0gdHJ1ZTtcclxuICAgIHdlYnNvY2tldC5lbWl0KCdlcnJvcicsIGVycik7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogU2V0IGEgdGltZXIgdG8gZGVzdHJveSB0aGUgdW5kZXJseWluZyByYXcgc29ja2V0IG9mIGEgV2ViU29ja2V0LlxyXG4gKlxyXG4gKiBAcGFyYW0ge1dlYlNvY2tldH0gd2Vic29ja2V0IFRoZSBXZWJTb2NrZXQgaW5zdGFuY2VcclxuICogQHByaXZhdGVcclxuICovXHJcbmZ1bmN0aW9uIHNldENsb3NlVGltZXIod2Vic29ja2V0KSB7XHJcbiAgd2Vic29ja2V0Ll9jbG9zZVRpbWVyID0gc2V0VGltZW91dChcclxuICAgIHdlYnNvY2tldC5fc29ja2V0LmRlc3Ryb3kuYmluZCh3ZWJzb2NrZXQuX3NvY2tldCksXHJcbiAgICBjbG9zZVRpbWVvdXRcclxuICApO1xyXG59XHJcblxyXG4vKipcclxuICogVGhlIGxpc3RlbmVyIG9mIHRoZSBzb2NrZXQgYCdjbG9zZSdgIGV2ZW50LlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuZnVuY3Rpb24gc29ja2V0T25DbG9zZSgpIHtcclxuICBjb25zdCB3ZWJzb2NrZXQgPSB0aGlzW2tXZWJTb2NrZXRdO1xyXG5cclxuICB0aGlzLnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIHNvY2tldE9uQ2xvc2UpO1xyXG4gIHRoaXMucmVtb3ZlTGlzdGVuZXIoJ2RhdGEnLCBzb2NrZXRPbkRhdGEpO1xyXG4gIHRoaXMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIHNvY2tldE9uRW5kKTtcclxuXHJcbiAgd2Vic29ja2V0Ll9yZWFkeVN0YXRlID0gV2ViU29ja2V0LkNMT1NJTkc7XHJcblxyXG4gIGxldCBjaHVuaztcclxuXHJcbiAgLy9cclxuICAvLyBUaGUgY2xvc2UgZnJhbWUgbWlnaHQgbm90IGhhdmUgYmVlbiByZWNlaXZlZCBvciB0aGUgYCdlbmQnYCBldmVudCBlbWl0dGVkLFxyXG4gIC8vIGZvciBleGFtcGxlLCBpZiB0aGUgc29ja2V0IHdhcyBkZXN0cm95ZWQgZHVlIHRvIGFuIGVycm9yLiBFbnN1cmUgdGhhdCB0aGVcclxuICAvLyBgcmVjZWl2ZXJgIHN0cmVhbSBpcyBjbG9zZWQgYWZ0ZXIgd3JpdGluZyBhbnkgcmVtYWluaW5nIGJ1ZmZlcmVkIGRhdGEgdG9cclxuICAvLyBpdC4gSWYgdGhlIHJlYWRhYmxlIHNpZGUgb2YgdGhlIHNvY2tldCBpcyBpbiBmbG93aW5nIG1vZGUgdGhlbiB0aGVyZSBpcyBub1xyXG4gIC8vIGJ1ZmZlcmVkIGRhdGEgYXMgZXZlcnl0aGluZyBoYXMgYmVlbiBhbHJlYWR5IHdyaXR0ZW4gYW5kIGByZWFkYWJsZS5yZWFkKClgXHJcbiAgLy8gd2lsbCByZXR1cm4gYG51bGxgLiBJZiBpbnN0ZWFkLCB0aGUgc29ja2V0IGlzIHBhdXNlZCwgYW55IHBvc3NpYmxlIGJ1ZmZlcmVkXHJcbiAgLy8gZGF0YSB3aWxsIGJlIHJlYWQgYXMgYSBzaW5nbGUgY2h1bmsuXHJcbiAgLy9cclxuICBpZiAoXHJcbiAgICAhdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkICYmXHJcbiAgICAhd2Vic29ja2V0Ll9jbG9zZUZyYW1lUmVjZWl2ZWQgJiZcclxuICAgICF3ZWJzb2NrZXQuX3JlY2VpdmVyLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCAmJlxyXG4gICAgKGNodW5rID0gd2Vic29ja2V0Ll9zb2NrZXQucmVhZCgpKSAhPT0gbnVsbFxyXG4gICkge1xyXG4gICAgd2Vic29ja2V0Ll9yZWNlaXZlci53cml0ZShjaHVuayk7XHJcbiAgfVxyXG5cclxuICB3ZWJzb2NrZXQuX3JlY2VpdmVyLmVuZCgpO1xyXG5cclxuICB0aGlzW2tXZWJTb2NrZXRdID0gdW5kZWZpbmVkO1xyXG5cclxuICBjbGVhclRpbWVvdXQod2Vic29ja2V0Ll9jbG9zZVRpbWVyKTtcclxuXHJcbiAgaWYgKFxyXG4gICAgd2Vic29ja2V0Ll9yZWNlaXZlci5fd3JpdGFibGVTdGF0ZS5maW5pc2hlZCB8fFxyXG4gICAgd2Vic29ja2V0Ll9yZWNlaXZlci5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWRcclxuICApIHtcclxuICAgIHdlYnNvY2tldC5lbWl0Q2xvc2UoKTtcclxuICB9IGVsc2Uge1xyXG4gICAgd2Vic29ja2V0Ll9yZWNlaXZlci5vbignZXJyb3InLCByZWNlaXZlck9uRmluaXNoKTtcclxuICAgIHdlYnNvY2tldC5fcmVjZWl2ZXIub24oJ2ZpbmlzaCcsIHJlY2VpdmVyT25GaW5pc2gpO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFRoZSBsaXN0ZW5lciBvZiB0aGUgc29ja2V0IGAnZGF0YSdgIGV2ZW50LlxyXG4gKlxyXG4gKiBAcGFyYW0ge0J1ZmZlcn0gY2h1bmsgQSBjaHVuayBvZiBkYXRhXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5mdW5jdGlvbiBzb2NrZXRPbkRhdGEoY2h1bmspIHtcclxuICBpZiAoIXRoaXNba1dlYlNvY2tldF0uX3JlY2VpdmVyLndyaXRlKGNodW5rKSkge1xyXG4gICAgdGhpcy5wYXVzZSgpO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFRoZSBsaXN0ZW5lciBvZiB0aGUgc29ja2V0IGAnZW5kJ2AgZXZlbnQuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5mdW5jdGlvbiBzb2NrZXRPbkVuZCgpIHtcclxuICBjb25zdCB3ZWJzb2NrZXQgPSB0aGlzW2tXZWJTb2NrZXRdO1xyXG5cclxuICB3ZWJzb2NrZXQuX3JlYWR5U3RhdGUgPSBXZWJTb2NrZXQuQ0xPU0lORztcclxuICB3ZWJzb2NrZXQuX3JlY2VpdmVyLmVuZCgpO1xyXG4gIHRoaXMuZW5kKCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUaGUgbGlzdGVuZXIgb2YgdGhlIHNvY2tldCBgJ2Vycm9yJ2AgZXZlbnQuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5mdW5jdGlvbiBzb2NrZXRPbkVycm9yKCkge1xyXG4gIGNvbnN0IHdlYnNvY2tldCA9IHRoaXNba1dlYlNvY2tldF07XHJcblxyXG4gIHRoaXMucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgc29ja2V0T25FcnJvcik7XHJcbiAgdGhpcy5vbignZXJyb3InLCBOT09QKTtcclxuXHJcbiAgaWYgKHdlYnNvY2tldCkge1xyXG4gICAgd2Vic29ja2V0Ll9yZWFkeVN0YXRlID0gV2ViU29ja2V0LkNMT1NJTkc7XHJcbiAgICB0aGlzLmRlc3Ryb3koKTtcclxuICB9XHJcbn1cclxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/ws/lib/websocket.js\n");
/***/ })
};
;