You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
NextWeb/.next/static/webpack/_app-pages-browser_app_comp...

22 lines
362 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/).
*/
self["webpackHotUpdate_N_E"]("_app-pages-browser_app_components_chat_tsx",{
/***/ "(app-pages-browser)/./app/components/chat.tsx":
/*!*********************************!*\
!*** ./app/components/chat.tsx ***!
\*********************************/
/***/ (function(module, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Chat: function() { return /* binding */ Chat; },\n/* harmony export */ ChatAction: function() { return /* binding */ ChatAction; },\n/* harmony export */ ChatActions: function() { return /* binding */ ChatActions; },\n/* harmony export */ DeleteImageButton: function() { return /* binding */ DeleteImageButton; },\n/* harmony export */ EditMessageModal: function() { return /* binding */ EditMessageModal; },\n/* harmony export */ PromptHints: function() { return /* binding */ PromptHints; },\n/* harmony export */ SessionConfigModel: function() { return /* binding */ SessionConfigModel; },\n/* harmony export */ ShortcutKeyModal: function() { return /* binding */ ShortcutKeyModal; }\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var use_debounce__WEBPACK_IMPORTED_MODULE_64__ = __webpack_require__(/*! use-debounce */ \"(app-pages-browser)/./node_modules/use-debounce/dist/index.module.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _icons_send_white_svg__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../icons/send-white.svg */ \"(app-pages-browser)/./app/icons/send-white.svg\");\n/* harmony import */ var _icons_brain_svg__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../icons/brain.svg */ \"(app-pages-browser)/./app/icons/brain.svg\");\n/* harmony import */ var _icons_rename_svg__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../icons/rename.svg */ \"(app-pages-browser)/./app/icons/rename.svg\");\n/* harmony import */ var _icons_share_svg__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../icons/share.svg */ \"(app-pages-browser)/./app/icons/share.svg\");\n/* harmony import */ var _icons_return_svg__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../icons/return.svg */ \"(app-pages-browser)/./app/icons/return.svg\");\n/* harmony import */ var _icons_copy_svg__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../icons/copy.svg */ \"(app-pages-browser)/./app/icons/copy.svg\");\n/* harmony import */ var _icons_speak_svg__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../icons/speak.svg */ \"(app-pages-browser)/./app/icons/speak.svg\");\n/* harmony import */ var _icons_speak_stop_svg__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../icons/speak-stop.svg */ \"(app-pages-browser)/./app/icons/speak-stop.svg\");\n/* harmony import */ var _icons_three_dots_svg__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../icons/three-dots.svg */ \"(app-pages-browser)/./app/icons/three-dots.svg\");\n/* harmony import */ var _icons_loading_svg__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../icons/loading.svg */ \"(app-pages-browser)/./app/icons/loading.svg\");\n/* harmony import */ var _icons_mask_svg__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../icons/mask.svg */ \"(app-pages-browser)/./app/icons/mask.svg\");\n/* harmony import */ var _icons_max_svg__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../icons/max.svg */ \"(app-pages-browser)/./app/icons/max.svg\");\n/* harmony import */ var _icons_min_svg__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../icons/min.svg */ \"(app-pages-browser)/./app/icons/min.svg\");\n/* harmony import */ var _icons_reload_svg__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../icons/reload.svg */ \"(app-pages-browser)/./app/icons/reload.svg\");\n/* harmony import */ var _icons_break_svg__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../icons/break.svg */ \"(app-pages-browser)/./app/icons/break.svg\");\n/* harmony import */ var _icons_chat_settings_svg__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../icons/chat-settings.svg */ \"(app-pages-browser)/./app/icons/chat-settings.svg\");\n/* harmony import */ var _icons_clear_svg__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../icons/clear.svg */ \"(app-pages-browser)/./app/icons/clear.svg\");\n/* harmony import */ var _icons_pin_svg__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../icons/pin.svg */ \"(app-pages-browser)/./app/icons/pin.svg\");\n/* harmony import */ var _icons_confirm_svg__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../icons/confirm.svg */ \"(app-pages-browser)/./app/icons/confirm.svg\");\n/* harmony import */ var _icons_close_svg__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../icons/close.svg */ \"(app-pages-browser)/./app/icons/close.svg\");\n/* harmony import */ var _icons_cancel_svg__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../icons/cancel.svg */ \"(app-pages-browser)/./app/icons/cancel.svg\");\n/* harmony import */ var _icons_image_svg__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../icons/image.svg */ \"(app-pages-browser)/./app/icons/image.svg\");\n/* harmony import */ var _icons_light_svg__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../icons/light.svg */ \"(app-pages-browser)/./app/icons/light.svg\");\n/* harmony import */ var _icons_dark_svg__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../icons/dark.svg */ \"(app-pages-browser)/./app/icons/dark.svg\");\n/* harmony import */ var _icons_auto_svg__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../icons/auto.svg */ \"(app-pages-browser)/./app/icons/auto.svg\");\n/* harmony import */ var _icons_bottom_svg__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../icons/bottom.svg */ \"(app-pages-browser)/./app/icons/bottom.svg\");\n/* harmony import */ var _icons_pause_svg__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../icons/pause.svg */ \"(app-pages-browser)/./app/icons/pause.svg\");\n/* harmony import */ var _icons_robot_svg__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ../icons/robot.svg */ \"(app-pages-browser)/./app/icons/robot.svg\");\n/* harmony import */ var _icons_size_svg__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ../icons/size.svg */ \"(app-pages-browser)/./app/icons/size.svg\");\n/* harmony import */ var _icons_hd_svg__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ../icons/hd.svg */ \"(app-pages-browser)/./app/icons/hd.svg\");\n/* harmony import */ var _icons_palette_svg__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ../icons/palette.svg */ \"(app-pages-browser)/./app/icons/palette.svg\");\n/* harmony import */ var _icons_plugin_svg__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ../icons/plugin.svg */ \"(app-pages-browser)/./app/icons/plugin.svg\");\n/* harmony import */ var _icons_shortcutkey_svg__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ../icons/shortcutkey.svg */ \"(app-pages-browser)/./app/icons/shortcutkey.svg\");\n/* harmony import */ var _icons_tool_svg__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ../icons/tool.svg */ \"(app-pages-browser)/./app/icons/tool.svg\");\n/* harmony import */ var _icons_headphone_svg__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ../icons/headphone.svg */ \"(app-pages-browser)/./app/icons/headphone.svg\");\n/* harmony import */ var _store__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ../store */ \"(app-pages-browser)/./app/store/index.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ../utils */ \"(app-pages-browser)/./app/utils.ts\");\n/* harmony import */ var _app_utils_chat__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! @/app/utils/chat */ \"(app-pages-browser)/./app/utils/chat.ts\");\n/* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! next/dynamic */ \"(app-pages-browser)/./node_modules/next/dist/api/app-dynamic.js\");\n/* harmony import */ var _client_controller__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ../client/controller */ \"(app-pages-browser)/./app/client/controller.ts\");\n/* harmony import */ var _store_prompt__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ../store/prompt */ \"(app-pages-browser)/./app/store/prompt.ts\");\n/* harmony import */ var _locales__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ../locales */ \"(app-pages-browser)/./app/locales/index.ts\");\n/* harmony import */ var _button__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ./button */ \"(app-pages-browser)/./app/components/button.tsx\");\n/* harmony import */ var _chat_module_scss__WEBPACK_IMPORTED_MODULE_63__ = __webpack_require__(/*! ./chat.module.scss */ \"(app-pages-browser)/./app/components/chat.module.scss\");\n/* harmony import */ var _chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default = /*#__PURE__*/__webpack_require__.n(_chat_module_scss__WEBPACK_IMPORTED_MODULE_63__);\n/* harmony import */ var _ui_lib__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ./ui-lib */ \"(app-pages-browser)/./app/components/ui-lib.tsx\");\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_62__ = __webpack_require__(/*! react-router-dom */ \"(app-pages-browser)/./node_modules/react-router/dist/index.js\");\n/* harmony import */ var _constant__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! ../constant */ \"(app-pages-browser)/./app/constant.ts\");\n/* harmony import */ var _emoji__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! ./emoji */ \"(app-pages-browser)/./app/components/emoji.tsx\");\n/* harmony import */ var _mask__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! ./mask */ \"(app-pages-browser)/./app/components/mask.tsx\");\n/* harmony import */ var _store_mask__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! ../store/mask */ \"(app-pages-browser)/./app/store/mask.ts\");\n/* harmony import */ var _command__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(/*! ../command */ \"(app-pages-browser)/./app/command.ts\");\n/* harmony import */ var _utils_format__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(/*! ../utils/format */ \"(app-pages-browser)/./app/utils/format.ts\");\n/* harmony import */ var _exporter__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(/*! ./exporter */ \"(app-pages-browser)/./app/components/exporter.tsx\");\n/* harmony import */ var _config_client__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(/*! ../config/client */ \"(app-pages-browser)/./app/config/client.ts\");\n/* harmony import */ var _utils_hooks__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(/*! ../utils/hooks */ \"(app-pages-browser)/./app/utils/hooks.ts\");\n/* harmony import */ var _client_api__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(/*! ../client/api */ \"(app-pages-browser)/./app/client/api.ts\");\n/* harmony import */ var _utils_audio__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(/*! ../utils/audio */ \"(app-pages-browser)/./app/utils/audio.ts\");\n/* harmony import */ var _utils_ms_edge_tts__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(/*! ../utils/ms_edge_tts */ \"(app-pages-browser)/./app/utils/ms_edge_tts.ts\");\n/* harmony import */ var _barrel_optimize_names_isEmpty_lodash_es__WEBPACK_IMPORTED_MODULE_65__ = __webpack_require__(/*! __barrel_optimize__?names=isEmpty!=!lodash-es */ \"(app-pages-browser)/./node_modules/lodash-es/isEmpty.js\");\n/* harmony import */ var _utils_model__WEBPACK_IMPORTED_MODULE_58__ = __webpack_require__(/*! ../utils/model */ \"(app-pages-browser)/./app/utils/model.ts\");\n/* harmony import */ var _app_components_realtime_chat__WEBPACK_IMPORTED_MODULE_59__ = __webpack_require__(/*! @/app/components/realtime-chat */ \"(app-pages-browser)/./app/components/realtime-chat/index.ts\");\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_60__ = __webpack_require__(/*! clsx */ \"(app-pages-browser)/./node_modules/clsx/dist/clsx.mjs\");\n/* harmony import */ var _mcp_actions__WEBPACK_IMPORTED_MODULE_61__ = __webpack_require__(/*! ../mcp/actions */ \"(app-pages-browser)/./app/mcp/actions.ts\");\n\nvar _s = $RefreshSig$(), _s1 = $RefreshSig$(), _s2 = $RefreshSig$(), _s3 = $RefreshSig$(), _s4 = $RefreshSig$(), _s5 = $RefreshSig$(), _s6 = $RefreshSig$(), _s7 = $RefreshSig$(), _s8 = $RefreshSig$(), _s9 = $RefreshSig$(), _s10 = $RefreshSig$(), _s11 = $RefreshSig$();\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst localStorage = (0,_utils__WEBPACK_IMPORTED_MODULE_38__.safeLocalStorage)();\nconst ttsPlayer = (0,_utils_audio__WEBPACK_IMPORTED_MODULE_56__.createTTSPlayer)();\nconst Markdown = (0,next_dynamic__WEBPACK_IMPORTED_MODULE_40__[\"default\"])(async ()=>(await __webpack_require__.e(/*! import() */ \"_app-pages-browser_app_components_markdown_tsx\").then(__webpack_require__.bind(__webpack_require__, /*! ./markdown */ \"(app-pages-browser)/./app/components/markdown.tsx\"))).Markdown, {\n loadableGenerated: {\n modules: [\n \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx -> \" + \"./markdown\"\n ]\n },\n loading: ()=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_three_dots_svg__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 134,\n columnNumber: 18\n }, undefined)\n});\n_c = Markdown;\nconst MCPAction = ()=>{\n _s();\n const navigate = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_62__.useNavigate)();\n const [count, setCount] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(0);\n const [mcpEnabled, setMcpEnabled] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n const checkMcpStatus = async ()=>{\n const enabled = await (0,_mcp_actions__WEBPACK_IMPORTED_MODULE_61__.isMcpEnabled)();\n setMcpEnabled(enabled);\n if (enabled) {\n const count = await (0,_mcp_actions__WEBPACK_IMPORTED_MODULE_61__.getAvailableClientsCount)();\n setCount(count);\n }\n };\n checkMcpStatus();\n }, []);\n if (!mcpEnabled) return null;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ChatAction, {\n onClick: ()=>navigate(_constant__WEBPACK_IMPORTED_MODULE_46__.Path.McpMarket),\n text: \"MCP\".concat(count ? \" (\".concat(count, \")\") : \"\"),\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_tool_svg__WEBPACK_IMPORTED_MODULE_35__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 160,\n columnNumber: 13\n }, void 0)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 157,\n columnNumber: 5\n }, undefined);\n};\n_s(MCPAction, \"dt9esIgBk3FGVQflPUmBpxVsVks=\", false, function() {\n return [\n react_router_dom__WEBPACK_IMPORTED_MODULE_62__.useNavigate\n ];\n});\n_c1 = MCPAction;\nfunction SessionConfigModel(props) {\n _s1();\n const chatStore = (0,_store__WEBPACK_IMPORTED_MODULE_37__.useChatStore)();\n const session = chatStore.currentSession();\n const maskStore = (0,_store_mask__WEBPACK_IMPORTED_MODULE_49__.useMaskStore)();\n const navigate = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_62__.useNavigate)();\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"modal-mask\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_ui_lib__WEBPACK_IMPORTED_MODULE_45__.Modal, {\n title: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Context.Edit,\n onClose: ()=>props.onClose(),\n actions: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_button__WEBPACK_IMPORTED_MODULE_44__.IconButton, {\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_reload_svg__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 179,\n columnNumber: 19\n }, void 0),\n bordered: true,\n text: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.Config.Reset,\n onClick: async ()=>{\n if (await (0,_ui_lib__WEBPACK_IMPORTED_MODULE_45__.showConfirm)(_locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Memory.ResetConfirm)) {\n chatStore.updateTargetSession(session, (session)=>session.memoryPrompt = \"\");\n }\n }\n }, \"reset\", false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 177,\n columnNumber: 11\n }, void 0),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_button__WEBPACK_IMPORTED_MODULE_44__.IconButton, {\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_copy_svg__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 193,\n columnNumber: 19\n }, void 0),\n bordered: true,\n text: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.Config.SaveAs,\n onClick: ()=>{\n navigate(_constant__WEBPACK_IMPORTED_MODULE_46__.Path.Masks);\n setTimeout(()=>{\n maskStore.create(session.mask);\n }, 500);\n }\n }, \"copy\", false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 191,\n columnNumber: 11\n }, void 0)\n ],\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_mask__WEBPACK_IMPORTED_MODULE_48__.MaskConfig, {\n mask: session.mask,\n updateMask: (updater)=>{\n const mask = {\n ...session.mask\n };\n updater(mask);\n chatStore.updateTargetSession(session, (session)=>session.mask = mask);\n },\n shouldSyncFromGlobal: true,\n extraListItems: session.mask.modelConfig.sendMemory ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_ui_lib__WEBPACK_IMPORTED_MODULE_45__.ListItem, {\n className: \"copyable\",\n title: \"\".concat(_locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Memory.Title, \" (\").concat(session.lastSummarizeIndex, \" of \").concat(session.messages.length, \")\"),\n subTitle: session.memoryPrompt || _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Memory.EmptyContent\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 218,\n columnNumber: 15\n }, void 0) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {}, void 0, false)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 205,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 173,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 172,\n columnNumber: 5\n }, this);\n}\n_s1(SessionConfigModel, \"z78RVOGmEODqWKBe7iegWqnpLi4=\", false, function() {\n return [\n _store__WEBPACK_IMPORTED_MODULE_37__.useChatStore,\n _store_mask__WEBPACK_IMPORTED_MODULE_49__.useMaskStore,\n react_router_dom__WEBPACK_IMPORTED_MODULE_62__.useNavigate\n ];\n});\n_c2 = SessionConfigModel;\nfunction PromptToast(props) {\n _s2();\n const chatStore = (0,_store__WEBPACK_IMPORTED_MODULE_37__.useChatStore)();\n const session = chatStore.currentSession();\n const context = session.mask.context;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"prompt-toast\"]),\n children: [\n props.showToast && context.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_60__[\"default\"])((_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"prompt-toast-inner\"]), \"clickable\"),\n role: \"button\",\n onClick: ()=>props.setShowModal(true),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_brain_svg__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 250,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"prompt-toast-content\"]),\n children: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Context.Toast(context.length)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 251,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 245,\n columnNumber: 9\n }, this),\n props.showModal && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(SessionConfigModel, {\n onClose: ()=>props.setShowModal(false)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 257,\n columnNumber: 9\n }, this)\n ]\n }, \"prompt-toast\", true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 243,\n columnNumber: 5\n }, this);\n}\n_s2(PromptToast, \"VEZRjRiHFhGEe/E6z12rT6r9BBA=\", false, function() {\n return [\n _store__WEBPACK_IMPORTED_MODULE_37__.useChatStore\n ];\n});\n_c3 = PromptToast;\nfunction useSubmitHandler() {\n _s3();\n const config = (0,_store__WEBPACK_IMPORTED_MODULE_37__.useAppConfig)();\n const submitKey = config.submitKey;\n const isComposing = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(false);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n const onCompositionStart = ()=>{\n isComposing.current = true;\n };\n const onCompositionEnd = ()=>{\n isComposing.current = false;\n };\n window.addEventListener(\"compositionstart\", onCompositionStart);\n window.addEventListener(\"compositionend\", onCompositionEnd);\n return ()=>{\n window.removeEventListener(\"compositionstart\", onCompositionStart);\n window.removeEventListener(\"compositionend\", onCompositionEnd);\n };\n }, []);\n const shouldSubmit = (e)=>{\n // Fix Chinese input method \"Enter\" on Safari\n if (e.keyCode == 229) return false;\n if (e.key !== \"Enter\") return false;\n if (e.key === \"Enter\" && (e.nativeEvent.isComposing || isComposing.current)) return false;\n return config.submitKey === _store__WEBPACK_IMPORTED_MODULE_37__.SubmitKey.AltEnter && e.altKey || config.submitKey === _store__WEBPACK_IMPORTED_MODULE_37__.SubmitKey.CtrlEnter && e.ctrlKey || config.submitKey === _store__WEBPACK_IMPORTED_MODULE_37__.SubmitKey.ShiftEnter && e.shiftKey || config.submitKey === _store__WEBPACK_IMPORTED_MODULE_37__.SubmitKey.MetaEnter && e.metaKey || config.submitKey === _store__WEBPACK_IMPORTED_MODULE_37__.SubmitKey.Enter && !e.altKey && !e.ctrlKey && !e.shiftKey && !e.metaKey;\n };\n return {\n submitKey,\n shouldSubmit\n };\n}\n_s3(useSubmitHandler, \"RhLmiAbheqFHJx+YtGZ+eIpCF80=\", false, function() {\n return [\n _store__WEBPACK_IMPORTED_MODULE_37__.useAppConfig\n ];\n});\nfunction PromptHints(props) {\n _s4();\n const noPrompts = props.prompts.length === 0;\n const [selectIndex, setSelectIndex] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(0);\n const selectedRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n setSelectIndex(0);\n }, [\n props.prompts.length\n ]);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n const onKeyDown = (e)=>{\n if (noPrompts || e.metaKey || e.altKey || e.ctrlKey) {\n return;\n }\n // arrow up / down to select prompt\n const changeIndex = (delta)=>{\n var _selectedRef_current;\n e.stopPropagation();\n e.preventDefault();\n const nextIndex = Math.max(0, Math.min(props.prompts.length - 1, selectIndex + delta));\n setSelectIndex(nextIndex);\n (_selectedRef_current = selectedRef.current) === null || _selectedRef_current === void 0 ? void 0 : _selectedRef_current.scrollIntoView({\n block: \"center\"\n });\n };\n if (e.key === \"ArrowUp\") {\n changeIndex(1);\n } else if (e.key === \"ArrowDown\") {\n changeIndex(-1);\n } else if (e.key === \"Enter\") {\n const selectedPrompt = props.prompts.at(selectIndex);\n if (selectedPrompt) {\n props.onPromptSelect(selectedPrompt);\n }\n }\n };\n window.addEventListener(\"keydown\", onKeyDown);\n return ()=>window.removeEventListener(\"keydown\", onKeyDown);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n props.prompts.length,\n selectIndex\n ]);\n if (noPrompts) return null;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"prompt-hints\"]),\n children: props.prompts.map((prompt, i)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n ref: i === selectIndex ? selectedRef : null,\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_60__[\"default\"])((_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"prompt-hint\"]), {\n [(_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"prompt-hint-selected\"])]: i === selectIndex\n }),\n onClick: ()=>props.onPromptSelect(prompt),\n onMouseEnter: ()=>setSelectIndex(i),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"hint-title\"]),\n children: prompt.title\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 374,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"hint-content\"]),\n children: prompt.content\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 375,\n columnNumber: 11\n }, this)\n ]\n }, prompt.title + i.toString(), true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 365,\n columnNumber: 9\n }, this))\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 363,\n columnNumber: 5\n }, this);\n}\n_s4(PromptHints, \"qRy81yzrODnly+hCrZ8AH+LDmLY=\");\n_c4 = PromptHints;\nfunction ClearContextDivider() {\n _s5();\n const chatStore = (0,_store__WEBPACK_IMPORTED_MODULE_37__.useChatStore)();\n const session = chatStore.currentSession();\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"clear-context\"]),\n onClick: ()=>chatStore.updateTargetSession(session, (session)=>session.clearContextIndex = undefined),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"clear-context-tips\"]),\n children: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Context.Clear\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 396,\n columnNumber: 7\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"clear-context-revert-btn\"]),\n children: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Context.Revert\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 397,\n columnNumber: 7\n }, this)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 387,\n columnNumber: 5\n }, this);\n}\n_s5(ClearContextDivider, \"VEZRjRiHFhGEe/E6z12rT6r9BBA=\", false, function() {\n return [\n _store__WEBPACK_IMPORTED_MODULE_37__.useChatStore\n ];\n});\n_c5 = ClearContextDivider;\nfunction ChatAction(props) {\n _s6();\n const iconRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null);\n const textRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null);\n const [width, setWidth] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)({\n full: 16,\n icon: 16\n });\n function updateWidth() {\n if (!iconRef.current || !textRef.current) return;\n const getWidth = (dom)=>dom.getBoundingClientRect().width;\n const textWidth = getWidth(textRef.current);\n const iconWidth = getWidth(iconRef.current);\n setWidth({\n full: textWidth + iconWidth,\n icon: iconWidth\n });\n }\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_60__[\"default\"])((_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"chat-input-action\"]), \"clickable\"),\n onClick: ()=>{\n props.onClick();\n setTimeout(updateWidth, 1);\n },\n onMouseEnter: updateWidth,\n onTouchStart: updateWidth,\n style: {\n \"--icon-width\": \"\".concat(width.icon, \"px\"),\n \"--full-width\": \"\".concat(width.full, \"px\")\n },\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n ref: iconRef,\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default().icon),\n children: props.icon\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 443,\n columnNumber: 7\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default().text),\n ref: textRef,\n children: props.text\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 446,\n columnNumber: 7\n }, this)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 428,\n columnNumber: 5\n }, this);\n}\n_s6(ChatAction, \"Gy4HVhM4xnpJH9376EHJy8nmbtU=\");\n_c6 = ChatAction;\nfunction useScrollToBottom(scrollRef) {\n let detach = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false, messages = arguments.length > 2 ? arguments[2] : void 0;\n _s7();\n // for auto-scroll\n const [autoScroll, setAutoScroll] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true);\n const scrollDomToBottom = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)(()=>{\n const dom = scrollRef.current;\n if (dom) {\n requestAnimationFrame(()=>{\n setAutoScroll(true);\n dom.scrollTo(0, dom.scrollHeight);\n });\n }\n }, [\n scrollRef\n ]);\n // auto scroll\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (autoScroll && !detach) {\n scrollDomToBottom();\n }\n });\n // auto scroll when messages length changes\n const lastMessagesLength = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(messages.length);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (messages.length > lastMessagesLength.current && !detach) {\n scrollDomToBottom();\n }\n lastMessagesLength.current = messages.length;\n }, [\n messages.length,\n detach,\n scrollDomToBottom\n ]);\n return {\n scrollRef,\n autoScroll,\n setAutoScroll,\n scrollDomToBottom\n };\n}\n_s7(useScrollToBottom, \"ORowTWNZz/Ptf/vqqgFxsaSQ0Mg=\");\nfunction ChatActions(props) {\n var _session_mask_modelConfig, _session_mask_modelConfig1, _session_mask_modelConfig2, _session_mask_modelConfig3, _chatStore_currentSession_mask;\n _s8();\n const config = (0,_store__WEBPACK_IMPORTED_MODULE_37__.useAppConfig)();\n const navigate = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_62__.useNavigate)();\n const chatStore = (0,_store__WEBPACK_IMPORTED_MODULE_37__.useChatStore)();\n const pluginStore = (0,_store__WEBPACK_IMPORTED_MODULE_37__.usePluginStore)();\n const session = chatStore.currentSession();\n // switch themes\n const theme = config.theme;\n function nextTheme() {\n const themes = [\n _store__WEBPACK_IMPORTED_MODULE_37__.Theme.Auto,\n _store__WEBPACK_IMPORTED_MODULE_37__.Theme.Light,\n _store__WEBPACK_IMPORTED_MODULE_37__.Theme.Dark\n ];\n const themeIndex = themes.indexOf(theme);\n const nextIndex = (themeIndex + 1) % themes.length;\n const nextTheme = themes[nextIndex];\n config.update((config)=>config.theme = nextTheme);\n }\n // stop all responses\n const couldStop = _client_controller__WEBPACK_IMPORTED_MODULE_41__.ChatControllerPool.hasPending();\n const stopAll = ()=>_client_controller__WEBPACK_IMPORTED_MODULE_41__.ChatControllerPool.stopAll();\n // switch model\n const currentModel = session.mask.modelConfig.model;\n const currentProviderName = ((_session_mask_modelConfig = session.mask.modelConfig) === null || _session_mask_modelConfig === void 0 ? void 0 : _session_mask_modelConfig.providerName) || _constant__WEBPACK_IMPORTED_MODULE_46__.ServiceProvider.OpenAI;\n const allModels = (0,_utils_hooks__WEBPACK_IMPORTED_MODULE_54__.useAllModels)();\n const models = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n const filteredModels = allModels.filter((m)=>m.available);\n const defaultModel = filteredModels.find((m)=>m.isDefault);\n if (defaultModel) {\n const arr = [\n defaultModel,\n ...filteredModels.filter((m)=>m !== defaultModel)\n ];\n return arr;\n } else {\n return filteredModels;\n }\n }, [\n allModels\n ]);\n const currentModelName = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n const model = models.find((m)=>{\n var _m_provider;\n return m.name == currentModel && (m === null || m === void 0 ? void 0 : (_m_provider = m.provider) === null || _m_provider === void 0 ? void 0 : _m_provider.providerName) == currentProviderName;\n });\n var _model_displayName;\n return (_model_displayName = model === null || model === void 0 ? void 0 : model.displayName) !== null && _model_displayName !== void 0 ? _model_displayName : \"\";\n }, [\n models,\n currentModel,\n currentProviderName\n ]);\n const [showModelSelector, setShowModelSelector] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const [showPluginSelector, setShowPluginSelector] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const [showUploadImage, setShowUploadImage] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const [showSizeSelector, setShowSizeSelector] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const [showQualitySelector, setShowQualitySelector] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const [showStyleSelector, setShowStyleSelector] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const modelSizes = (0,_utils__WEBPACK_IMPORTED_MODULE_38__.getModelSizes)(currentModel);\n const dalle3Qualitys = [\n \"standard\",\n \"hd\"\n ];\n const dalle3Styles = [\n \"vivid\",\n \"natural\"\n ];\n var _session_mask_modelConfig_size;\n const currentSize = (_session_mask_modelConfig_size = (_session_mask_modelConfig1 = session.mask.modelConfig) === null || _session_mask_modelConfig1 === void 0 ? void 0 : _session_mask_modelConfig1.size) !== null && _session_mask_modelConfig_size !== void 0 ? _session_mask_modelConfig_size : \"1024x1024\";\n var _session_mask_modelConfig_quality;\n const currentQuality = (_session_mask_modelConfig_quality = (_session_mask_modelConfig2 = session.mask.modelConfig) === null || _session_mask_modelConfig2 === void 0 ? void 0 : _session_mask_modelConfig2.quality) !== null && _session_mask_modelConfig_quality !== void 0 ? _session_mask_modelConfig_quality : \"standard\";\n var _session_mask_modelConfig_style;\n const currentStyle = (_session_mask_modelConfig_style = (_session_mask_modelConfig3 = session.mask.modelConfig) === null || _session_mask_modelConfig3 === void 0 ? void 0 : _session_mask_modelConfig3.style) !== null && _session_mask_modelConfig_style !== void 0 ? _session_mask_modelConfig_style : \"vivid\";\n const isMobileScreen = (0,_utils__WEBPACK_IMPORTED_MODULE_38__.useMobileScreen)();\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n const show = (0,_utils__WEBPACK_IMPORTED_MODULE_38__.isVisionModel)(currentModel);\n setShowUploadImage(show);\n if (!show) {\n props.setAttachImages([]);\n props.setUploading(false);\n }\n // if current model is not available\n // switch to first available model\n const isUnavailableModel = !models.some((m)=>m.name === currentModel);\n if (isUnavailableModel && models.length > 0) {\n var _nextModel_provider;\n // show next model to default model if exist\n let nextModel = models.find((model)=>model.isDefault) || models[0];\n chatStore.updateTargetSession(session, (session)=>{\n var _nextModel_provider;\n session.mask.modelConfig.model = nextModel.name;\n session.mask.modelConfig.providerName = nextModel === null || nextModel === void 0 ? void 0 : (_nextModel_provider = nextModel.provider) === null || _nextModel_provider === void 0 ? void 0 : _nextModel_provider.providerName;\n });\n (0,_ui_lib__WEBPACK_IMPORTED_MODULE_45__.showToast)((nextModel === null || nextModel === void 0 ? void 0 : (_nextModel_provider = nextModel.provider) === null || _nextModel_provider === void 0 ? void 0 : _nextModel_provider.providerName) == \"ByteDance\" ? nextModel.displayName : nextModel.name);\n }\n }, [\n chatStore,\n currentModel,\n models,\n session\n ]);\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"chat-input-actions\"]),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n children: [\n couldStop && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ChatAction, {\n onClick: stopAll,\n text: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.InputActions.Stop,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_pause_svg__WEBPACK_IMPORTED_MODULE_28__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 606,\n columnNumber: 19\n }, void 0)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 603,\n columnNumber: 11\n }, this),\n !props.hitBottom && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ChatAction, {\n onClick: props.scrollToBottom,\n text: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.InputActions.ToBottom,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_bottom_svg__WEBPACK_IMPORTED_MODULE_27__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 613,\n columnNumber: 19\n }, void 0)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 610,\n columnNumber: 11\n }, this),\n props.hitBottom && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ChatAction, {\n onClick: props.showPromptModal,\n text: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.InputActions.Settings,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_chat_settings_svg__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 620,\n columnNumber: 19\n }, void 0)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 617,\n columnNumber: 11\n }, this),\n showUploadImage && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ChatAction, {\n onClick: props.uploadImage,\n text: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.InputActions.UploadImage,\n icon: props.uploading ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_loading_svg__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 628,\n columnNumber: 37\n }, void 0) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_image_svg__WEBPACK_IMPORTED_MODULE_23__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 628,\n columnNumber: 61\n }, void 0)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 625,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ChatAction, {\n onClick: nextTheme,\n text: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.InputActions.Theme[theme],\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n children: theme === _store__WEBPACK_IMPORTED_MODULE_37__.Theme.Auto ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_auto_svg__WEBPACK_IMPORTED_MODULE_26__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 637,\n columnNumber: 17\n }, void 0) : theme === _store__WEBPACK_IMPORTED_MODULE_37__.Theme.Light ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_light_svg__WEBPACK_IMPORTED_MODULE_24__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 639,\n columnNumber: 17\n }, void 0) : theme === _store__WEBPACK_IMPORTED_MODULE_37__.Theme.Dark ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_dark_svg__WEBPACK_IMPORTED_MODULE_25__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 641,\n columnNumber: 17\n }, void 0) : null\n }, void 0, false)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 631,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ChatAction, {\n onClick: ()=>{\n navigate(_constant__WEBPACK_IMPORTED_MODULE_46__.Path.Masks);\n },\n text: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.InputActions.Masks,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_mask_svg__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 652,\n columnNumber: 17\n }, void 0)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 647,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ChatAction, {\n text: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.InputActions.Clear,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_break_svg__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 657,\n columnNumber: 17\n }, void 0),\n onClick: ()=>{\n chatStore.updateTargetSession(session, (session)=>{\n if (session.clearContextIndex === session.messages.length) {\n session.clearContextIndex = undefined;\n } else {\n session.clearContextIndex = session.messages.length;\n session.memoryPrompt = \"\"; // will clear memory\n }\n });\n }\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 655,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ChatAction, {\n onClick: ()=>setShowModelSelector(true),\n text: currentModelName,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_robot_svg__WEBPACK_IMPORTED_MODULE_29__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 673,\n columnNumber: 17\n }, void 0)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 670,\n columnNumber: 9\n }, this),\n showModelSelector && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_ui_lib__WEBPACK_IMPORTED_MODULE_45__.Selector, {\n defaultSelectedValue: \"\".concat(currentModel, \"@\").concat(currentProviderName),\n items: models.map((m)=>{\n var _m_provider, _m_provider1, _m_provider2;\n return {\n title: \"\".concat(m.displayName).concat((m === null || m === void 0 ? void 0 : (_m_provider = m.provider) === null || _m_provider === void 0 ? void 0 : _m_provider.providerName) ? \" (\" + (m === null || m === void 0 ? void 0 : (_m_provider1 = m.provider) === null || _m_provider1 === void 0 ? void 0 : _m_provider1.providerName) + \")\" : \"\"),\n value: \"\".concat(m.name, \"@\").concat(m === null || m === void 0 ? void 0 : (_m_provider2 = m.provider) === null || _m_provider2 === void 0 ? void 0 : _m_provider2.providerName)\n };\n }),\n onClose: ()=>setShowModelSelector(false),\n onSelection: (s)=>{\n if (s.length === 0) return;\n const [model, providerName] = (0,_utils_model__WEBPACK_IMPORTED_MODULE_58__.getModelProvider)(s[0]);\n chatStore.updateTargetSession(session, (session)=>{\n session.mask.modelConfig.model = model;\n session.mask.modelConfig.providerName = providerName;\n session.mask.syncGlobalConfig = false;\n });\n if (providerName == \"ByteDance\") {\n const selectedModel = models.find((m)=>{\n var _m_provider;\n return m.name == model && (m === null || m === void 0 ? void 0 : (_m_provider = m.provider) === null || _m_provider === void 0 ? void 0 : _m_provider.providerName) == providerName;\n });\n var _selectedModel_displayName;\n (0,_ui_lib__WEBPACK_IMPORTED_MODULE_45__.showToast)((_selectedModel_displayName = selectedModel === null || selectedModel === void 0 ? void 0 : selectedModel.displayName) !== null && _selectedModel_displayName !== void 0 ? _selectedModel_displayName : \"\");\n } else {\n (0,_ui_lib__WEBPACK_IMPORTED_MODULE_45__.showToast)(model);\n }\n }\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 677,\n columnNumber: 11\n }, this),\n (0,_utils__WEBPACK_IMPORTED_MODULE_38__.supportsCustomSize)(currentModel) && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ChatAction, {\n onClick: ()=>setShowSizeSelector(true),\n text: currentSize,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_size_svg__WEBPACK_IMPORTED_MODULE_30__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 715,\n columnNumber: 19\n }, void 0)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 712,\n columnNumber: 11\n }, this),\n showSizeSelector && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_ui_lib__WEBPACK_IMPORTED_MODULE_45__.Selector, {\n defaultSelectedValue: currentSize,\n items: modelSizes.map((m)=>({\n title: m,\n value: m\n })),\n onClose: ()=>setShowSizeSelector(false),\n onSelection: (s)=>{\n if (s.length === 0) return;\n const size = s[0];\n chatStore.updateTargetSession(session, (session)=>{\n session.mask.modelConfig.size = size;\n });\n (0,_ui_lib__WEBPACK_IMPORTED_MODULE_45__.showToast)(size);\n }\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 720,\n columnNumber: 11\n }, this),\n (0,_utils__WEBPACK_IMPORTED_MODULE_38__.isDalle3)(currentModel) && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ChatAction, {\n onClick: ()=>setShowQualitySelector(true),\n text: currentQuality,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_hd_svg__WEBPACK_IMPORTED_MODULE_31__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 742,\n columnNumber: 19\n }, void 0)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 739,\n columnNumber: 11\n }, this),\n showQualitySelector && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_ui_lib__WEBPACK_IMPORTED_MODULE_45__.Selector, {\n defaultSelectedValue: currentQuality,\n items: dalle3Qualitys.map((m)=>({\n title: m,\n value: m\n })),\n onClose: ()=>setShowQualitySelector(false),\n onSelection: (q)=>{\n if (q.length === 0) return;\n const quality = q[0];\n chatStore.updateTargetSession(session, (session)=>{\n session.mask.modelConfig.quality = quality;\n });\n (0,_ui_lib__WEBPACK_IMPORTED_MODULE_45__.showToast)(quality);\n }\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 747,\n columnNumber: 11\n }, this),\n (0,_utils__WEBPACK_IMPORTED_MODULE_38__.isDalle3)(currentModel) && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ChatAction, {\n onClick: ()=>setShowStyleSelector(true),\n text: currentStyle,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_palette_svg__WEBPACK_IMPORTED_MODULE_32__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 769,\n columnNumber: 19\n }, void 0)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 766,\n columnNumber: 11\n }, this),\n showStyleSelector && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_ui_lib__WEBPACK_IMPORTED_MODULE_45__.Selector, {\n defaultSelectedValue: currentStyle,\n items: dalle3Styles.map((m)=>({\n title: m,\n value: m\n })),\n onClose: ()=>setShowStyleSelector(false),\n onSelection: (s)=>{\n if (s.length === 0) return;\n const style = s[0];\n chatStore.updateTargetSession(session, (session)=>{\n session.mask.modelConfig.style = style;\n });\n (0,_ui_lib__WEBPACK_IMPORTED_MODULE_45__.showToast)(style);\n }\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 774,\n columnNumber: 11\n }, this),\n (0,_utils__WEBPACK_IMPORTED_MODULE_38__.showPlugins)(currentProviderName, currentModel) && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ChatAction, {\n onClick: ()=>{\n if (pluginStore.getAll().length == 0) {\n navigate(_constant__WEBPACK_IMPORTED_MODULE_46__.Path.Plugins);\n } else {\n setShowPluginSelector(true);\n }\n },\n text: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Plugin.Name,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_plugin_svg__WEBPACK_IMPORTED_MODULE_33__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 802,\n columnNumber: 19\n }, void 0)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 793,\n columnNumber: 11\n }, this),\n showPluginSelector && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_ui_lib__WEBPACK_IMPORTED_MODULE_45__.Selector, {\n multiple: true,\n defaultSelectedValue: (_chatStore_currentSession_mask = chatStore.currentSession().mask) === null || _chatStore_currentSession_mask === void 0 ? void 0 : _chatStore_currentSession_mask.plugin,\n items: pluginStore.getAll().map((item)=>({\n title: \"\".concat(item === null || item === void 0 ? void 0 : item.title, \"@\").concat(item === null || item === void 0 ? void 0 : item.version),\n value: item === null || item === void 0 ? void 0 : item.id\n })),\n onClose: ()=>setShowPluginSelector(false),\n onSelection: (s)=>{\n chatStore.updateTargetSession(session, (session)=>{\n session.mask.plugin = s;\n });\n }\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 806,\n columnNumber: 11\n }, this),\n !isMobileScreen && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ChatAction, {\n onClick: ()=>props.setShowShortcutKeyModal(true),\n text: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.ShortcutKey.Title,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_shortcutkey_svg__WEBPACK_IMPORTED_MODULE_34__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 826,\n columnNumber: 19\n }, void 0)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 823,\n columnNumber: 11\n }, this),\n !isMobileScreen && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(MCPAction, {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 829,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"chat-input-actions-end\"]),\n children: config.realtimeConfig.enable && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ChatAction, {\n onClick: ()=>props.setShowChatSidePanel(true),\n text: \"Realtime Chat\",\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_headphone_svg__WEBPACK_IMPORTED_MODULE_36__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 836,\n columnNumber: 19\n }, void 0)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 833,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 831,\n columnNumber: 7\n }, this)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 600,\n columnNumber: 5\n }, this);\n}\n_s8(ChatActions, \"06YQ6I8I25ydwS6/9kU9y8x3Ods=\", false, function() {\n return [\n _store__WEBPACK_IMPORTED_MODULE_37__.useAppConfig,\n react_router_dom__WEBPACK_IMPORTED_MODULE_62__.useNavigate,\n _store__WEBPACK_IMPORTED_MODULE_37__.useChatStore,\n _store__WEBPACK_IMPORTED_MODULE_37__.usePluginStore,\n _utils_hooks__WEBPACK_IMPORTED_MODULE_54__.useAllModels,\n _utils__WEBPACK_IMPORTED_MODULE_38__.useMobileScreen\n ];\n});\n_c7 = ChatActions;\nfunction EditMessageModal(props) {\n _s9();\n const chatStore = (0,_store__WEBPACK_IMPORTED_MODULE_37__.useChatStore)();\n const session = chatStore.currentSession();\n const [messages, setMessages] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(session.messages.slice());\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"modal-mask\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_ui_lib__WEBPACK_IMPORTED_MODULE_45__.Modal, {\n title: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.EditMessage.Title,\n onClose: props.onClose,\n actions: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_button__WEBPACK_IMPORTED_MODULE_44__.IconButton, {\n text: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].UI.Cancel,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_cancel_svg__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 857,\n columnNumber: 19\n }, void 0),\n onClick: ()=>{\n props.onClose();\n }\n }, \"cancel\", false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 855,\n columnNumber: 11\n }, void 0),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_button__WEBPACK_IMPORTED_MODULE_44__.IconButton, {\n type: \"primary\",\n text: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].UI.Confirm,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_confirm_svg__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 866,\n columnNumber: 19\n }, void 0),\n onClick: ()=>{\n chatStore.updateTargetSession(session, (session)=>session.messages = messages);\n props.onClose();\n }\n }, \"ok\", false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 863,\n columnNumber: 11\n }, void 0)\n ],\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_ui_lib__WEBPACK_IMPORTED_MODULE_45__.List, {\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_ui_lib__WEBPACK_IMPORTED_MODULE_45__.ListItem, {\n title: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.EditMessage.Topic.Title,\n subTitle: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.EditMessage.Topic.SubTitle,\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"input\", {\n type: \"text\",\n value: session.topic,\n onInput: (e)=>chatStore.updateTargetSession(session, (session)=>session.topic = e.currentTarget.value)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 883,\n columnNumber: 13\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 879,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 878,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_mask__WEBPACK_IMPORTED_MODULE_48__.ContextPrompts, {\n context: messages,\n updateContext: (updater)=>{\n const newMessages = messages.slice();\n updater(newMessages);\n setMessages(newMessages);\n }\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 895,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 851,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 850,\n columnNumber: 5\n }, this);\n}\n_s9(EditMessageModal, \"PNpuWAMa1wFKZALzUiT027BVX2s=\", false, function() {\n return [\n _store__WEBPACK_IMPORTED_MODULE_37__.useChatStore\n ];\n});\n_c8 = EditMessageModal;\nfunction DeleteImageButton(props) {\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"delete-image\"]),\n onClick: props.deleteImage,\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_clear_svg__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 911,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 910,\n columnNumber: 5\n }, this);\n}\n_c9 = DeleteImageButton;\nfunction ShortcutKeyModal(props) {\n const isMac = navigator.platform.toUpperCase().indexOf(\"MAC\") >= 0;\n const shortcuts = [\n {\n title: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.ShortcutKey.newChat,\n keys: isMac ? [\n \"⌘\",\n \"Shift\",\n \"O\"\n ] : [\n \"Ctrl\",\n \"Shift\",\n \"O\"\n ]\n },\n {\n title: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.ShortcutKey.focusInput,\n keys: [\n \"Shift\",\n \"Esc\"\n ]\n },\n {\n title: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.ShortcutKey.copyLastCode,\n keys: isMac ? [\n \"⌘\",\n \"Shift\",\n \";\"\n ] : [\n \"Ctrl\",\n \"Shift\",\n \";\"\n ]\n },\n {\n title: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.ShortcutKey.copyLastMessage,\n keys: isMac ? [\n \"⌘\",\n \"Shift\",\n \"C\"\n ] : [\n \"Ctrl\",\n \"Shift\",\n \"C\"\n ]\n },\n {\n title: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.ShortcutKey.showShortcutKey,\n keys: isMac ? [\n \"⌘\",\n \"/\"\n ] : [\n \"Ctrl\",\n \"/\"\n ]\n },\n {\n title: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.ShortcutKey.clearContext,\n keys: isMac ? [\n \"⌘\",\n \"Shift\",\n \"backspace\"\n ] : [\n \"Ctrl\",\n \"Shift\",\n \"backspace\"\n ]\n }\n ];\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"modal-mask\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_ui_lib__WEBPACK_IMPORTED_MODULE_45__.Modal, {\n title: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.ShortcutKey.Title,\n onClose: props.onClose,\n actions: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_button__WEBPACK_IMPORTED_MODULE_44__.IconButton, {\n type: \"primary\",\n text: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].UI.Confirm,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_confirm_svg__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 952,\n columnNumber: 19\n }, void 0),\n onClick: ()=>{\n props.onClose();\n }\n }, \"ok\", false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 949,\n columnNumber: 11\n }, void 0)\n ],\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"shortcut-key-container\"]),\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"shortcut-key-grid\"]),\n children: shortcuts.map((shortcut, index)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"shortcut-key-item\"]),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"shortcut-key-title\"]),\n children: shortcut.title\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 964,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"shortcut-key-keys\"]),\n children: shortcut.keys.map((key, i)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"shortcut-key\"]),\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: key\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 970,\n columnNumber: 23\n }, this)\n }, i, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 969,\n columnNumber: 21\n }, this))\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 967,\n columnNumber: 17\n }, this)\n ]\n }, index, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 963,\n columnNumber: 15\n }, this))\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 961,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 960,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 945,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 944,\n columnNumber: 5\n }, this);\n}\n_c10 = ShortcutKeyModal;\nfunction _Chat() {\n var _scrollRef_current, _session_messages_at;\n _s10();\n const chatStore = (0,_store__WEBPACK_IMPORTED_MODULE_37__.useChatStore)();\n const session = chatStore.currentSession();\n const config = (0,_store__WEBPACK_IMPORTED_MODULE_37__.useAppConfig)();\n const fontSize = config.fontSize;\n const fontFamily = config.fontFamily;\n const [showExport, setShowExport] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const inputRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null);\n const [userInput, setUserInput] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"\");\n const [isLoading, setIsLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const { submitKey, shouldSubmit } = useSubmitHandler();\n const scrollRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null);\n const isScrolledToBottom = (scrollRef === null || scrollRef === void 0 ? void 0 : scrollRef.current) ? Math.abs(scrollRef.current.scrollHeight - (scrollRef.current.scrollTop + scrollRef.current.clientHeight)) <= 1 : false;\n const isAttachWithTop = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n var _scrollRef_current;\n const lastMessage = (_scrollRef_current = scrollRef.current) === null || _scrollRef_current === void 0 ? void 0 : _scrollRef_current.lastElementChild;\n // if scrolllRef is not ready or no message, return false\n if (!(scrollRef === null || scrollRef === void 0 ? void 0 : scrollRef.current) || !lastMessage) return false;\n const topDistance = lastMessage.getBoundingClientRect().top - scrollRef.current.getBoundingClientRect().top;\n // leave some space for user question\n return topDistance < 100;\n }, [\n scrollRef === null || scrollRef === void 0 ? void 0 : (_scrollRef_current = scrollRef.current) === null || _scrollRef_current === void 0 ? void 0 : _scrollRef_current.scrollHeight\n ]);\n const isTyping = userInput !== \"\";\n // if user is typing, should auto scroll to bottom\n // if user is not typing, should auto scroll to bottom only if already at bottom\n const { setAutoScroll, scrollDomToBottom } = useScrollToBottom(scrollRef, (isScrolledToBottom || isAttachWithTop) && !isTyping, session.messages);\n const [hitBottom, setHitBottom] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true);\n const isMobileScreen = (0,_utils__WEBPACK_IMPORTED_MODULE_38__.useMobileScreen)();\n const navigate = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_62__.useNavigate)();\n const [attachImages, setAttachImages] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [uploading, setUploading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n // prompt hints\n const promptStore = (0,_store_prompt__WEBPACK_IMPORTED_MODULE_42__.usePromptStore)();\n const [promptHints, setPromptHints] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const onSearch = (0,use_debounce__WEBPACK_IMPORTED_MODULE_64__.useDebouncedCallback)((text)=>{\n const matchedPrompts = promptStore.search(text);\n setPromptHints(matchedPrompts);\n }, 100, {\n leading: true,\n trailing: true\n });\n // auto grow input\n const [inputRows, setInputRows] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(2);\n const measure = (0,use_debounce__WEBPACK_IMPORTED_MODULE_64__.useDebouncedCallback)(()=>{\n const rows = inputRef.current ? (0,_utils__WEBPACK_IMPORTED_MODULE_38__.autoGrowTextArea)(inputRef.current) : 1;\n const inputRows = Math.min(20, Math.max(2 + Number(!isMobileScreen), rows));\n setInputRows(inputRows);\n }, 100, {\n leading: true,\n trailing: true\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(measure, [\n userInput\n ]);\n // chat commands shortcuts\n const chatCommands = (0,_command__WEBPACK_IMPORTED_MODULE_50__.useChatCommand)({\n new: ()=>chatStore.newSession(),\n newm: ()=>navigate(_constant__WEBPACK_IMPORTED_MODULE_46__.Path.NewChat),\n prev: ()=>chatStore.nextSession(-1),\n next: ()=>chatStore.nextSession(1),\n clear: ()=>chatStore.updateTargetSession(session, (session)=>session.clearContextIndex = session.messages.length),\n fork: ()=>chatStore.forkSession(),\n del: ()=>chatStore.deleteSession(chatStore.currentSessionIndex)\n });\n // only search prompts when user input is short\n const SEARCH_TEXT_LIMIT = 30;\n const onInput = (text)=>{\n setUserInput(text);\n const n = text.trim().length;\n // clear search results\n if (n === 0) {\n setPromptHints([]);\n } else if (text.match(_command__WEBPACK_IMPORTED_MODULE_50__.ChatCommandPrefix)) {\n setPromptHints(chatCommands.search(text));\n } else if (!config.disablePromptHint && n < SEARCH_TEXT_LIMIT) {\n // check if need to trigger auto completion\n if (text.startsWith(\"/\")) {\n let searchText = text.slice(1);\n onSearch(searchText);\n }\n }\n };\n const doSubmit = (userInput)=>{\n var _inputRef_current;\n if (userInput.trim() === \"\" && (0,_barrel_optimize_names_isEmpty_lodash_es__WEBPACK_IMPORTED_MODULE_65__[\"default\"])(attachImages)) return;\n const matchCommand = chatCommands.match(userInput);\n if (matchCommand.matched) {\n setUserInput(\"\");\n setPromptHints([]);\n matchCommand.invoke();\n return;\n }\n setIsLoading(true);\n chatStore.onUserInput(userInput, attachImages).then(()=>setIsLoading(false));\n setAttachImages([]);\n chatStore.setLastInput(userInput);\n setUserInput(\"\");\n setPromptHints([]);\n if (!isMobileScreen) (_inputRef_current = inputRef.current) === null || _inputRef_current === void 0 ? void 0 : _inputRef_current.focus();\n setAutoScroll(true);\n };\n const onPromptSelect = (prompt)=>{\n setTimeout(()=>{\n var _inputRef_current;\n setPromptHints([]);\n const matchedChatCommand = chatCommands.match(prompt.content);\n if (matchedChatCommand.matched) {\n // if user is selecting a chat command, just trigger it\n matchedChatCommand.invoke();\n setUserInput(\"\");\n } else {\n // or fill the prompt\n setUserInput(prompt.content);\n }\n (_inputRef_current = inputRef.current) === null || _inputRef_current === void 0 ? void 0 : _inputRef_current.focus();\n }, 30);\n };\n // stop response\n const onUserStop = (messageId)=>{\n _client_controller__WEBPACK_IMPORTED_MODULE_41__.ChatControllerPool.stop(session.id, messageId);\n };\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n chatStore.updateTargetSession(session, (session)=>{\n const stopTiming = Date.now() - _constant__WEBPACK_IMPORTED_MODULE_46__.REQUEST_TIMEOUT_MS;\n session.messages.forEach((m)=>{\n // check if should stop all stale messages\n if (m.isError || new Date(m.date).getTime() < stopTiming) {\n if (m.streaming) {\n m.streaming = false;\n }\n if (m.content.length === 0) {\n m.isError = true;\n m.content = (0,_utils_format__WEBPACK_IMPORTED_MODULE_51__.prettyObject)({\n error: true,\n message: \"empty response\"\n });\n }\n }\n });\n // auto sync mask config from global config\n if (session.mask.syncGlobalConfig) {\n console.log(\"[Mask] syncing from global, name = \", session.mask.name);\n session.mask.modelConfig = {\n ...config.modelConfig\n };\n }\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n session\n ]);\n // check if should send message\n const onInputKeyDown = (e)=>{\n // if ArrowUp and no userInput, fill with last input\n if (e.key === \"ArrowUp\" && userInput.length <= 0 && !(e.metaKey || e.altKey || e.ctrlKey)) {\n var _chatStore_lastInput;\n setUserInput((_chatStore_lastInput = chatStore.lastInput) !== null && _chatStore_lastInput !== void 0 ? _chatStore_lastInput : \"\");\n e.preventDefault();\n return;\n }\n if (shouldSubmit(e) && promptHints.length === 0) {\n doSubmit(userInput);\n e.preventDefault();\n }\n };\n const onRightClick = (e, message)=>{\n // copy to clipboard\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_38__.selectOrCopy)(e.currentTarget, (0,_utils__WEBPACK_IMPORTED_MODULE_38__.getMessageTextContent)(message))) {\n if (userInput.length === 0) {\n setUserInput((0,_utils__WEBPACK_IMPORTED_MODULE_38__.getMessageTextContent)(message));\n }\n e.preventDefault();\n }\n };\n const deleteMessage = (msgId)=>{\n chatStore.updateTargetSession(session, (session)=>session.messages = session.messages.filter((m)=>m.id !== msgId));\n };\n const onDelete = (msgId)=>{\n deleteMessage(msgId);\n };\n const onResend = (message)=>{\n var _inputRef_current;\n // when it is resending a message\n // 1. for a user's message, find the next bot response\n // 2. for a bot's message, find the last user's input\n // 3. delete original user input and bot's message\n // 4. resend the user's input\n const resendingIndex = session.messages.findIndex((m)=>m.id === message.id);\n if (resendingIndex < 0 || resendingIndex >= session.messages.length) {\n console.error(\"[Chat] failed to find resending message\", message);\n return;\n }\n let userMessage;\n let botMessage;\n if (message.role === \"assistant\") {\n // if it is resending a bot's message, find the user input for it\n botMessage = message;\n for(let i = resendingIndex; i >= 0; i -= 1){\n if (session.messages[i].role === \"user\") {\n userMessage = session.messages[i];\n break;\n }\n }\n } else if (message.role === \"user\") {\n // if it is resending a user's input, find the bot's response\n userMessage = message;\n for(let i = resendingIndex; i < session.messages.length; i += 1){\n if (session.messages[i].role === \"assistant\") {\n botMessage = session.messages[i];\n break;\n }\n }\n }\n if (userMessage === undefined) {\n console.error(\"[Chat] failed to resend\", message);\n return;\n }\n // delete the original messages\n deleteMessage(userMessage.id);\n deleteMessage(botMessage === null || botMessage === void 0 ? void 0 : botMessage.id);\n // resend the message\n setIsLoading(true);\n const textContent = (0,_utils__WEBPACK_IMPORTED_MODULE_38__.getMessageTextContent)(userMessage);\n const images = (0,_utils__WEBPACK_IMPORTED_MODULE_38__.getMessageImages)(userMessage);\n chatStore.onUserInput(textContent, images).then(()=>setIsLoading(false));\n (_inputRef_current = inputRef.current) === null || _inputRef_current === void 0 ? void 0 : _inputRef_current.focus();\n };\n const onPinMessage = (message)=>{\n chatStore.updateTargetSession(session, (session)=>session.mask.context.push(message));\n (0,_ui_lib__WEBPACK_IMPORTED_MODULE_45__.showToast)(_locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.Actions.PinToastContent, {\n text: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.Actions.PinToastAction,\n onClick: ()=>{\n setShowPromptModal(true);\n }\n });\n };\n const accessStore = (0,_store__WEBPACK_IMPORTED_MODULE_37__.useAccessStore)();\n const [speechStatus, setSpeechStatus] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const [speechLoading, setSpeechLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n async function openaiSpeech(text) {\n if (speechStatus) {\n ttsPlayer.stop();\n setSpeechStatus(false);\n } else {\n var api;\n api = new _client_api__WEBPACK_IMPORTED_MODULE_55__.ClientApi(_constant__WEBPACK_IMPORTED_MODULE_46__.ModelProvider.GPT);\n const config = _store__WEBPACK_IMPORTED_MODULE_37__.useAppConfig.getState();\n setSpeechLoading(true);\n ttsPlayer.init();\n let audioBuffer;\n const { markdownToTxt } = __webpack_require__(/*! markdown-to-txt */ \"(app-pages-browser)/./node_modules/markdown-to-txt/dist/markdown-to-txt.js\");\n const textContent = markdownToTxt(text);\n if (config.ttsConfig.engine !== _constant__WEBPACK_IMPORTED_MODULE_46__.DEFAULT_TTS_ENGINE) {\n const edgeVoiceName = accessStore.edgeVoiceName();\n const tts = new _utils_ms_edge_tts__WEBPACK_IMPORTED_MODULE_57__.MsEdgeTTS();\n await tts.setMetadata(edgeVoiceName, _utils_ms_edge_tts__WEBPACK_IMPORTED_MODULE_57__.OUTPUT_FORMAT.AUDIO_24KHZ_96KBITRATE_MONO_MP3);\n audioBuffer = await tts.toArrayBuffer(textContent);\n } else {\n audioBuffer = await api.llm.speech({\n model: config.ttsConfig.model,\n input: textContent,\n voice: config.ttsConfig.voice,\n speed: config.ttsConfig.speed\n });\n }\n setSpeechStatus(true);\n ttsPlayer.play(audioBuffer, ()=>{\n setSpeechStatus(false);\n }).catch((e)=>{\n console.error(\"[OpenAI Speech]\", e);\n (0,_ui_lib__WEBPACK_IMPORTED_MODULE_45__.showToast)((0,_utils_format__WEBPACK_IMPORTED_MODULE_51__.prettyObject)(e));\n setSpeechStatus(false);\n }).finally(()=>setSpeechLoading(false));\n }\n }\n const context = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n return session.mask.hideContext ? [] : session.mask.context.slice();\n }, [\n session.mask.context,\n session.mask.hideContext\n ]);\n if (context.length === 0 && ((_session_messages_at = session.messages.at(0)) === null || _session_messages_at === void 0 ? void 0 : _session_messages_at.content) !== _store__WEBPACK_IMPORTED_MODULE_37__.BOT_HELLO.content) {\n const copiedHello = Object.assign({}, _store__WEBPACK_IMPORTED_MODULE_37__.BOT_HELLO);\n if (!accessStore.isAuthorized()) {\n copiedHello.content = _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Error.Unauthorized;\n }\n context.push(copiedHello);\n }\n // preview messages\n const renderMessages = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n return context.concat(session.messages).concat(isLoading ? [\n {\n ...(0,_store__WEBPACK_IMPORTED_MODULE_37__.createMessage)({\n role: \"assistant\",\n content: \"……\"\n }),\n preview: true\n }\n ] : []).concat(userInput.length > 0 && config.sendPreviewBubble ? [\n {\n ...(0,_store__WEBPACK_IMPORTED_MODULE_37__.createMessage)({\n role: \"user\",\n content: userInput\n }),\n preview: true\n }\n ] : []);\n }, [\n config.sendPreviewBubble,\n context,\n isLoading,\n session.messages,\n userInput\n ]);\n const [msgRenderIndex, _setMsgRenderIndex] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(Math.max(0, renderMessages.length - _constant__WEBPACK_IMPORTED_MODULE_46__.CHAT_PAGE_SIZE));\n function setMsgRenderIndex(newIndex) {\n newIndex = Math.min(renderMessages.length - _constant__WEBPACK_IMPORTED_MODULE_46__.CHAT_PAGE_SIZE, newIndex);\n newIndex = Math.max(0, newIndex);\n _setMsgRenderIndex(newIndex);\n }\n const messages = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n const endRenderIndex = Math.min(msgRenderIndex + 3 * _constant__WEBPACK_IMPORTED_MODULE_46__.CHAT_PAGE_SIZE, renderMessages.length);\n return renderMessages.slice(msgRenderIndex, endRenderIndex);\n }, [\n msgRenderIndex,\n renderMessages\n ]);\n const onChatBodyScroll = (e)=>{\n const bottomHeight = e.scrollTop + e.clientHeight;\n const edgeThreshold = e.clientHeight;\n const isTouchTopEdge = e.scrollTop <= edgeThreshold;\n const isTouchBottomEdge = bottomHeight >= e.scrollHeight - edgeThreshold;\n const isHitBottom = bottomHeight >= e.scrollHeight - (isMobileScreen ? 4 : 10);\n const prevPageMsgIndex = msgRenderIndex - _constant__WEBPACK_IMPORTED_MODULE_46__.CHAT_PAGE_SIZE;\n const nextPageMsgIndex = msgRenderIndex + _constant__WEBPACK_IMPORTED_MODULE_46__.CHAT_PAGE_SIZE;\n if (isTouchTopEdge && !isTouchBottomEdge) {\n setMsgRenderIndex(prevPageMsgIndex);\n } else if (isTouchBottomEdge) {\n setMsgRenderIndex(nextPageMsgIndex);\n }\n setHitBottom(isHitBottom);\n setAutoScroll(isHitBottom);\n };\n function scrollToBottom() {\n setMsgRenderIndex(renderMessages.length - _constant__WEBPACK_IMPORTED_MODULE_46__.CHAT_PAGE_SIZE);\n scrollDomToBottom();\n }\n var _session_clearContextIndex;\n // clear context index = context length + index in messages\n const clearContextIndex = ((_session_clearContextIndex = session.clearContextIndex) !== null && _session_clearContextIndex !== void 0 ? _session_clearContextIndex : -1) >= 0 ? session.clearContextIndex + context.length - msgRenderIndex : -1;\n const [showPromptModal, setShowPromptModal] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const clientConfig = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>(0,_config_client__WEBPACK_IMPORTED_MODULE_53__.getClientConfig)(), []);\n const autoFocus = !isMobileScreen; // wont auto focus on mobile screen\n const showMaxIcon = !isMobileScreen && !(clientConfig === null || clientConfig === void 0 ? void 0 : clientConfig.isApp);\n (0,_command__WEBPACK_IMPORTED_MODULE_50__.useCommand)({\n fill: setUserInput,\n submit: (text)=>{\n doSubmit(text);\n },\n code: (text)=>{\n if (accessStore.disableFastLink) return;\n console.log(\"[Command] got code from url: \", text);\n (0,_ui_lib__WEBPACK_IMPORTED_MODULE_45__.showConfirm)(_locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].URLCommand.Code + \"code = \".concat(text)).then((res)=>{\n if (res) {\n accessStore.update((access)=>access.accessCode = text);\n }\n });\n },\n settings: (text)=>{\n if (accessStore.disableFastLink) return;\n try {\n const payload = JSON.parse(text);\n console.log(\"[Command] got settings from url: \", payload);\n if (payload.key || payload.url) {\n (0,_ui_lib__WEBPACK_IMPORTED_MODULE_45__.showConfirm)(_locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].URLCommand.Settings + \"\\n\".concat(JSON.stringify(payload, null, 4))).then((res)=>{\n if (!res) return;\n if (payload.key) {\n accessStore.update((access)=>access.openaiApiKey = payload.key);\n }\n if (payload.url) {\n accessStore.update((access)=>access.openaiUrl = payload.url);\n }\n accessStore.update((access)=>access.useCustomConfig = true);\n });\n }\n } catch (e) {\n console.error(\"[Command] failed to get settings from url: \", text);\n }\n }\n });\n // edit / insert message modal\n const [isEditingMessage, setIsEditingMessage] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n // remember unfinished input\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n // try to load from local storage\n const key = (0,_constant__WEBPACK_IMPORTED_MODULE_46__.UNFINISHED_INPUT)(session.id);\n const mayBeUnfinishedInput = localStorage.getItem(key);\n if (mayBeUnfinishedInput && userInput.length === 0) {\n setUserInput(mayBeUnfinishedInput);\n localStorage.removeItem(key);\n }\n const dom = inputRef.current;\n return ()=>{\n var _dom_value;\n localStorage.setItem(key, (_dom_value = dom === null || dom === void 0 ? void 0 : dom.value) !== null && _dom_value !== void 0 ? _dom_value : \"\");\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n const handlePaste = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)(async (event)=>{\n const currentModel = chatStore.currentSession().mask.modelConfig.model;\n if (!(0,_utils__WEBPACK_IMPORTED_MODULE_38__.isVisionModel)(currentModel)) {\n return;\n }\n const items = (event.clipboardData || window.clipboardData).items;\n for (const item of items){\n if (item.kind === \"file\" && item.type.startsWith(\"image/\")) {\n event.preventDefault();\n const file = item.getAsFile();\n if (file) {\n const images = [];\n images.push(...attachImages);\n images.push(...await new Promise((res, rej)=>{\n setUploading(true);\n const imagesData = [];\n (0,_app_utils_chat__WEBPACK_IMPORTED_MODULE_39__.uploadImage)(file).then((dataUrl)=>{\n imagesData.push(dataUrl);\n setUploading(false);\n res(imagesData);\n }).catch((e)=>{\n setUploading(false);\n rej(e);\n });\n }));\n const imagesLength = images.length;\n if (imagesLength > 3) {\n images.splice(3, imagesLength - 3);\n }\n setAttachImages(images);\n }\n }\n }\n }, [\n attachImages,\n chatStore\n ]);\n async function uploadImage() {\n const images = [];\n images.push(...attachImages);\n images.push(...await new Promise((res, rej)=>{\n const fileInput = document.createElement(\"input\");\n fileInput.type = \"file\";\n fileInput.accept = \"image/png, image/jpeg, image/webp, image/heic, image/heif\";\n fileInput.multiple = true;\n fileInput.onchange = (event)=>{\n setUploading(true);\n const files = event.target.files;\n const imagesData = [];\n for(let i = 0; i < files.length; i++){\n const file = event.target.files[i];\n (0,_app_utils_chat__WEBPACK_IMPORTED_MODULE_39__.uploadImage)(file).then((dataUrl)=>{\n imagesData.push(dataUrl);\n if (imagesData.length === 3 || imagesData.length === files.length) {\n setUploading(false);\n res(imagesData);\n }\n }).catch((e)=>{\n setUploading(false);\n rej(e);\n });\n }\n };\n fileInput.click();\n }));\n const imagesLength = images.length;\n if (imagesLength > 3) {\n images.splice(3, imagesLength - 3);\n }\n setAttachImages(images);\n }\n // 快捷键 shortcut keys\n const [showShortcutKeyModal, setShowShortcutKeyModal] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n const handleKeyDown = (event)=>{\n // 打开新聊天 command + shift + o\n if ((event.metaKey || event.ctrlKey) && event.shiftKey && event.key.toLowerCase() === \"o\") {\n event.preventDefault();\n setTimeout(()=>{\n chatStore.newSession();\n navigate(_constant__WEBPACK_IMPORTED_MODULE_46__.Path.Chat);\n }, 10);\n } else if (event.shiftKey && event.key.toLowerCase() === \"escape\") {\n var _inputRef_current;\n event.preventDefault();\n (_inputRef_current = inputRef.current) === null || _inputRef_current === void 0 ? void 0 : _inputRef_current.focus();\n } else if ((event.metaKey || event.ctrlKey) && event.shiftKey && event.code === \"Semicolon\") {\n event.preventDefault();\n const copyCodeButton = document.querySelectorAll(\".copy-code-button\");\n if (copyCodeButton.length > 0) {\n copyCodeButton[copyCodeButton.length - 1].click();\n }\n } else if ((event.metaKey || event.ctrlKey) && event.shiftKey && event.key.toLowerCase() === \"c\") {\n event.preventDefault();\n const lastNonUserMessage = messages.filter((message)=>message.role !== \"user\").pop();\n if (lastNonUserMessage) {\n const lastMessageContent = (0,_utils__WEBPACK_IMPORTED_MODULE_38__.getMessageTextContent)(lastNonUserMessage);\n (0,_utils__WEBPACK_IMPORTED_MODULE_38__.copyToClipboard)(lastMessageContent);\n }\n } else if ((event.metaKey || event.ctrlKey) && event.key === \"/\") {\n event.preventDefault();\n setShowShortcutKeyModal(true);\n } else if ((event.metaKey || event.ctrlKey) && event.shiftKey && event.key.toLowerCase() === \"backspace\") {\n event.preventDefault();\n chatStore.updateTargetSession(session, (session)=>{\n if (session.clearContextIndex === session.messages.length) {\n session.clearContextIndex = undefined;\n } else {\n session.clearContextIndex = session.messages.length;\n session.memoryPrompt = \"\"; // will clear memory\n }\n });\n }\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n return ()=>{\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [\n messages,\n chatStore,\n navigate,\n session\n ]);\n const [showChatSidePanel, setShowChatSidePanel] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default().chat),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"window-header\",\n \"data-tauri-drag-region\": true,\n children: [\n isMobileScreen && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"window-actions\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"window-action-button\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_button__WEBPACK_IMPORTED_MODULE_44__.IconButton, {\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_return_svg__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1684,\n columnNumber: 25\n }, void 0),\n bordered: true,\n title: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.Actions.ChatList,\n onClick: ()=>navigate(_constant__WEBPACK_IMPORTED_MODULE_46__.Path.Home)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1683,\n columnNumber: 17\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1682,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1681,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_60__[\"default\"])(\"window-header-title\", (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"chat-body-title\"])),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_60__[\"default\"])(\"window-header-main-title\", (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"chat-body-main-title\"])),\n onClickCapture: ()=>setIsEditingMessage(true),\n children: !session.topic ? _store__WEBPACK_IMPORTED_MODULE_37__.DEFAULT_TOPIC : session.topic\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1696,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"window-header-sub-title\",\n children: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.SubTitle(session.messages.length)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1705,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1693,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"window-actions\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"window-action-button\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_button__WEBPACK_IMPORTED_MODULE_44__.IconButton, {\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_reload_svg__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1712,\n columnNumber: 23\n }, void 0),\n bordered: true,\n title: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.Actions.RefreshTitle,\n onClick: ()=>{\n (0,_ui_lib__WEBPACK_IMPORTED_MODULE_45__.showToast)(_locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.Actions.RefreshToast);\n chatStore.summarizeSession(true, session);\n }\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1711,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1710,\n columnNumber: 13\n }, this),\n !isMobileScreen && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"window-action-button\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_button__WEBPACK_IMPORTED_MODULE_44__.IconButton, {\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_rename_svg__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1724,\n columnNumber: 25\n }, void 0),\n bordered: true,\n title: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.EditMessage.Title,\n aria: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.EditMessage.Title,\n onClick: ()=>setIsEditingMessage(true)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1723,\n columnNumber: 17\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1722,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"window-action-button\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_button__WEBPACK_IMPORTED_MODULE_44__.IconButton, {\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_share_svg__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1734,\n columnNumber: 23\n }, void 0),\n bordered: true,\n title: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.Actions.Export,\n onClick: ()=>{\n setShowExport(true);\n }\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1733,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1732,\n columnNumber: 13\n }, this),\n showMaxIcon && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"window-action-button\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_button__WEBPACK_IMPORTED_MODULE_44__.IconButton, {\n icon: config.tightBorder ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_min_svg__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1745,\n columnNumber: 46\n }, void 0) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_max_svg__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1745,\n columnNumber: 60\n }, void 0),\n bordered: true,\n title: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.Actions.FullScreen,\n aria: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.Actions.FullScreen,\n onClick: ()=>{\n config.update((config)=>config.tightBorder = !config.tightBorder);\n }\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1744,\n columnNumber: 17\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1743,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1709,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(PromptToast, {\n showToast: !hitBottom,\n showModal: showPromptModal,\n setShowModal: setShowPromptModal\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1759,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1679,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"chat-main\"]),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"chat-body-container\"]),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"chat-body\"]),\n ref: scrollRef,\n onScroll: (e)=>onChatBodyScroll(e.currentTarget),\n onMouseDown: ()=>{\n var _inputRef_current;\n return (_inputRef_current = inputRef.current) === null || _inputRef_current === void 0 ? void 0 : _inputRef_current.blur();\n },\n onTouchStart: ()=>{\n var _inputRef_current;\n (_inputRef_current = inputRef.current) === null || _inputRef_current === void 0 ? void 0 : _inputRef_current.blur();\n setAutoScroll(false);\n },\n children: messages// TODO\n // .filter((m) => !m.isMcpResponse)\n .map((message, i)=>{\n var _message_tools, _message_tools1, _message_tools2;\n const isUser = message.role === \"user\";\n const isContext = i < context.length;\n const showActions = i > 0 && !(message.preview || message.content.length === 0) && !isContext;\n const showTyping = message.preview || message.streaming;\n const shouldShowClearContextDivider = i === clearContextIndex - 1;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react__WEBPACK_IMPORTED_MODULE_1__.Fragment, {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: isUser ? (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"chat-message-user\"]) : (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"chat-message\"]),\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"chat-message-container\"]),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"chat-message-header\"]),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"chat-message-avatar\"]),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"chat-message-edit\"]),\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_button__WEBPACK_IMPORTED_MODULE_44__.IconButton, {\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_rename_svg__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1806,\n columnNumber: 41\n }, void 0),\n aria: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.Actions.Edit,\n onClick: async ()=>{\n const newMessage = await (0,_ui_lib__WEBPACK_IMPORTED_MODULE_45__.showPrompt)(_locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.Actions.Edit, (0,_utils__WEBPACK_IMPORTED_MODULE_38__.getMessageTextContent)(message), 10);\n let newContent = newMessage;\n const images = (0,_utils__WEBPACK_IMPORTED_MODULE_38__.getMessageImages)(message);\n if (images.length > 0) {\n newContent = [\n {\n type: \"text\",\n text: newMessage\n }\n ];\n for(let i = 0; i < images.length; i++){\n newContent.push({\n type: \"image_url\",\n image_url: {\n url: images[i]\n }\n });\n }\n }\n chatStore.updateTargetSession(session, (session)=>{\n const m = session.mask.context.concat(session.messages).find((m)=>m.id === message.id);\n if (m) {\n m.content = newContent;\n }\n });\n }\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1805,\n columnNumber: 33\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1804,\n columnNumber: 31\n }, this),\n isUser ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_emoji__WEBPACK_IMPORTED_MODULE_47__.Avatar, {\n avatar: config.avatar\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1846,\n columnNumber: 33\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n children: [\n \"system\"\n ].includes(message.role) ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_emoji__WEBPACK_IMPORTED_MODULE_47__.Avatar, {\n avatar: \"2699-fe0f\"\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1850,\n columnNumber: 37\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_mask__WEBPACK_IMPORTED_MODULE_48__.MaskAvatar, {\n avatar: session.mask.avatar,\n model: message.model || session.mask.modelConfig.model\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1852,\n columnNumber: 37\n }, this)\n }, void 0, false)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1803,\n columnNumber: 29\n }, this),\n !isUser && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"chat-model-name\"]),\n children: message.model\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1864,\n columnNumber: 31\n }, this),\n showActions && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"chat-message-actions\"]),\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"chat-input-actions\"]),\n children: message.streaming ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ChatAction, {\n text: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.Actions.Stop,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_pause_svg__WEBPACK_IMPORTED_MODULE_28__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1875,\n columnNumber: 45\n }, void 0),\n onClick: ()=>{\n var _message_id;\n return onUserStop((_message_id = message.id) !== null && _message_id !== void 0 ? _message_id : i);\n }\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1873,\n columnNumber: 37\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ChatAction, {\n text: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.Actions.Retry,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_reload_svg__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1884,\n columnNumber: 47\n }, void 0),\n onClick: ()=>onResend(message)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1882,\n columnNumber: 39\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ChatAction, {\n text: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.Actions.Delete,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_clear_svg__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1890,\n columnNumber: 47\n }, void 0),\n onClick: ()=>{\n var _message_id;\n return onDelete((_message_id = message.id) !== null && _message_id !== void 0 ? _message_id : i);\n }\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1888,\n columnNumber: 39\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ChatAction, {\n text: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.Actions.Pin,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_pin_svg__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1898,\n columnNumber: 47\n }, void 0),\n onClick: ()=>onPinMessage(message)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1896,\n columnNumber: 39\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ChatAction, {\n text: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.Actions.Copy,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_copy_svg__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1903,\n columnNumber: 47\n }, void 0),\n onClick: ()=>(0,_utils__WEBPACK_IMPORTED_MODULE_38__.copyToClipboard)((0,_utils__WEBPACK_IMPORTED_MODULE_38__.getMessageTextContent)(message))\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1901,\n columnNumber: 39\n }, this),\n config.ttsConfig.enable && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ChatAction, {\n text: speechStatus ? _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.Actions.StopSpeech : _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.Actions.Speech,\n icon: speechStatus ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_speak_stop_svg__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1919,\n columnNumber: 47\n }, void 0) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_speak_svg__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1921,\n columnNumber: 47\n }, void 0),\n onClick: ()=>openaiSpeech((0,_utils__WEBPACK_IMPORTED_MODULE_38__.getMessageTextContent)(message))\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1911,\n columnNumber: 41\n }, this)\n ]\n }, void 0, true)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1871,\n columnNumber: 33\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1870,\n columnNumber: 31\n }, this)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1802,\n columnNumber: 27\n }, this),\n (message === null || message === void 0 ? void 0 : (_message_tools = message.tools) === null || _message_tools === void 0 ? void 0 : _message_tools.length) == 0 && showTyping && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"chat-message-status\"]),\n children: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.Typing\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1938,\n columnNumber: 29\n }, this),\n (message === null || message === void 0 ? void 0 : (_message_tools1 = message.tools) === null || _message_tools1 === void 0 ? void 0 : _message_tools1.length) > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"chat-message-tools\"]),\n children: message === null || message === void 0 ? void 0 : (_message_tools2 = message.tools) === null || _message_tools2 === void 0 ? void 0 : _message_tools2.map((tool)=>{\n var _tool_function;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n title: tool === null || tool === void 0 ? void 0 : tool.errorMsg,\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"chat-message-tool\"]),\n children: [\n tool.isError === false ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_confirm_svg__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1952,\n columnNumber: 37\n }, this) : tool.isError === true ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_close_svg__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1954,\n columnNumber: 37\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_loading_svg__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1956,\n columnNumber: 37\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: tool === null || tool === void 0 ? void 0 : (_tool_function = tool.function) === null || _tool_function === void 0 ? void 0 : _tool_function.name\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1958,\n columnNumber: 35\n }, this)\n ]\n }, tool.id, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1946,\n columnNumber: 33\n }, this);\n })\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1944,\n columnNumber: 29\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"chat-message-item\"]),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(Markdown, {\n content: (0,_utils__WEBPACK_IMPORTED_MODULE_38__.getMessageTextContent)(message),\n loading: (message.preview || message.streaming) && message.content.length === 0 && !isUser,\n // onContextMenu={(e) => onRightClick(e, message)} // hard to use\n onDoubleClickCapture: ()=>{\n if (!isMobileScreen) return;\n setUserInput((0,_utils__WEBPACK_IMPORTED_MODULE_38__.getMessageTextContent)(message));\n },\n fontSize: fontSize,\n fontFamily: fontFamily,\n parentRef: scrollRef,\n defaultShow: i >= messages.length - 6\n }, message.streaming ? \"loading\" : \"done\", false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1964,\n columnNumber: 29\n }, this),\n (0,_utils__WEBPACK_IMPORTED_MODULE_38__.getMessageImages)(message).length == 1 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"img\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"chat-message-item-image\"]),\n src: (0,_utils__WEBPACK_IMPORTED_MODULE_38__.getMessageImages)(message)[0],\n alt: \"\"\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1983,\n columnNumber: 31\n }, this),\n (0,_utils__WEBPACK_IMPORTED_MODULE_38__.getMessageImages)(message).length > 1 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"chat-message-item-images\"]),\n style: {\n \"--image-count\": (0,_utils__WEBPACK_IMPORTED_MODULE_38__.getMessageImages)(message).length\n },\n children: (0,_utils__WEBPACK_IMPORTED_MODULE_38__.getMessageImages)(message).map((image, index)=>{\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"img\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"chat-message-item-image-multi\"]),\n src: image,\n alt: \"\"\n }, index, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 2002,\n columnNumber: 39\n }, this);\n })\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1990,\n columnNumber: 31\n }, this)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1963,\n columnNumber: 27\n }, this),\n (message === null || message === void 0 ? void 0 : message.audio_url) && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"chat-message-audio\"]),\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"audio\", {\n src: message.audio_url,\n controls: true\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 2020,\n columnNumber: 31\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 2019,\n columnNumber: 29\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"chat-message-action-date\"]),\n children: isContext ? _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.IsContext : message.date.toLocaleString()\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 2024,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1801,\n columnNumber: 25\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1794,\n columnNumber: 23\n }, this),\n shouldShowClearContextDivider && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ClearContextDivider, {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 2031,\n columnNumber: 57\n }, this)\n ]\n }, message.id, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1793,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1767,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"chat-input-panel\"]),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(PromptHints, {\n prompts: promptHints,\n onPromptSelect: onPromptSelect\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 2037,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ChatActions, {\n uploadImage: uploadImage,\n setAttachImages: setAttachImages,\n setUploading: setUploading,\n showPromptModal: ()=>setShowPromptModal(true),\n scrollToBottom: scrollToBottom,\n hitBottom: hitBottom,\n uploading: uploading,\n showPromptHints: ()=>{\n var _inputRef_current;\n // Click again to close\n if (promptHints.length > 0) {\n setPromptHints([]);\n return;\n }\n (_inputRef_current = inputRef.current) === null || _inputRef_current === void 0 ? void 0 : _inputRef_current.focus();\n setUserInput(\"/\");\n onSearch(\"\");\n },\n setShowShortcutKeyModal: setShowShortcutKeyModal,\n setUserInput: setUserInput,\n setShowChatSidePanel: setShowChatSidePanel\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 2042,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_60__[\"default\"])((_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"chat-input-panel-inner\"]), {\n [(_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"chat-input-panel-inner-attach\"])]: attachImages.length !== 0\n }),\n htmlFor: \"chat-input\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"textarea\", {\n id: \"chat-input\",\n ref: inputRef,\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"chat-input\"]),\n placeholder: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.Input(submitKey),\n onInput: (e)=>onInput(e.currentTarget.value),\n value: userInput,\n onKeyDown: onInputKeyDown,\n onFocus: scrollToBottom,\n onClick: scrollToBottom,\n onPaste: handlePaste,\n rows: inputRows,\n autoFocus: autoFocus,\n style: {\n fontSize: config.fontSize,\n fontFamily: config.fontFamily\n }\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 2072,\n columnNumber: 17\n }, this),\n attachImages.length != 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"attach-images\"]),\n children: attachImages.map((image, index)=>{\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"attach-image\"]),\n style: {\n backgroundImage: 'url(\"'.concat(image, '\")')\n },\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"attach-image-mask\"]),\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(DeleteImageButton, {\n deleteImage: ()=>{\n setAttachImages(attachImages.filter((_, i)=>i !== index));\n }\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 2100,\n columnNumber: 29\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 2099,\n columnNumber: 27\n }, this)\n }, index, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 2094,\n columnNumber: 25\n }, this);\n })\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 2091,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_button__WEBPACK_IMPORTED_MODULE_44__.IconButton, {\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_send_white_svg__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 2114,\n columnNumber: 25\n }, void 0),\n text: _locales__WEBPACK_IMPORTED_MODULE_43__[\"default\"].Chat.Send,\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"chat-input-send\"]),\n type: \"primary\",\n onClick: ()=>doSubmit(userInput)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 2113,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 2065,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 2036,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1766,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_60__[\"default\"])((_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"chat-side-panel\"]), {\n [(_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default().mobile)]: isMobileScreen,\n [(_chat_module_scss__WEBPACK_IMPORTED_MODULE_63___default()[\"chat-side-panel-show\"])]: showChatSidePanel\n }),\n children: showChatSidePanel && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_app_components_realtime_chat__WEBPACK_IMPORTED_MODULE_59__.RealtimeChat, {\n onClose: ()=>{\n setShowChatSidePanel(false);\n },\n onStartVoice: async ()=>{\n console.log(\"start voice\");\n }\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 2130,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 2123,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1765,\n columnNumber: 9\n }, this)\n ]\n }, session.id, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1678,\n columnNumber: 7\n }, this),\n showExport && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_exporter__WEBPACK_IMPORTED_MODULE_52__.ExportMessageModal, {\n onClose: ()=>setShowExport(false)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 2143,\n columnNumber: 9\n }, this),\n isEditingMessage && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(EditMessageModal, {\n onClose: ()=>{\n setIsEditingMessage(false);\n }\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 2147,\n columnNumber: 9\n }, this),\n showShortcutKeyModal && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ShortcutKeyModal, {\n onClose: ()=>setShowShortcutKeyModal(false)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 2155,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true);\n}\n_s10(_Chat, \"l8awPbehI2cJMzYrqPhf7FG0hns=\", false, function() {\n return [\n _store__WEBPACK_IMPORTED_MODULE_37__.useChatStore,\n _store__WEBPACK_IMPORTED_MODULE_37__.useAppConfig,\n useSubmitHandler,\n useScrollToBottom,\n _utils__WEBPACK_IMPORTED_MODULE_38__.useMobileScreen,\n react_router_dom__WEBPACK_IMPORTED_MODULE_62__.useNavigate,\n _store_prompt__WEBPACK_IMPORTED_MODULE_42__.usePromptStore,\n use_debounce__WEBPACK_IMPORTED_MODULE_64__.useDebouncedCallback,\n use_debounce__WEBPACK_IMPORTED_MODULE_64__.useDebouncedCallback,\n _command__WEBPACK_IMPORTED_MODULE_50__.useChatCommand,\n _store__WEBPACK_IMPORTED_MODULE_37__.useAccessStore,\n _command__WEBPACK_IMPORTED_MODULE_50__.useCommand\n ];\n});\nfunction Chat() {\n _s11();\n const chatStore = (0,_store__WEBPACK_IMPORTED_MODULE_37__.useChatStore)();\n const session = chatStore.currentSession();\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_Chat, {}, session.id, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 2164,\n columnNumber: 10\n }, this);\n}\n_s11(Chat, \"VEZRjRiHFhGEe/E6z12rT6r9BBA=\", false, function() {\n return [\n _store__WEBPACK_IMPORTED_MODULE_37__.useChatStore\n ];\n});\n_c11 = Chat;\nvar _c, _c1, _c2, _c3, _c4, _c5, _c6, _c7, _c8, _c9, _c10, _c11;\n$RefreshReg$(_c, \"Markdown\");\n$RefreshReg$(_c1, \"MCPAction\");\n$RefreshReg$(_c2, \"SessionConfigModel\");\n$RefreshReg$(_c3, \"PromptToast\");\n$RefreshReg$(_c4, \"PromptHints\");\n$RefreshReg$(_c5, \"ClearContextDivider\");\n$RefreshReg$(_c6, \"ChatAction\");\n$RefreshReg$(_c7, \"ChatActions\");\n$RefreshReg$(_c8, \"EditMessageModal\");\n$RefreshReg$(_c9, \"DeleteImageButton\");\n$RefreshReg$(_c10, \"ShortcutKeyModal\");\n$RefreshReg$(_c11, \"Chat\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9jb21wb25lbnRzL2NoYXQudHN4IiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFvRDtBQVNyQztBQUVxQztBQUNUO0FBQ0U7QUFDRjtBQUNDO0FBQ0M7QUFDSjtBQUNFO0FBQ1M7QUFDRjtBQUNHO0FBRVo7QUFDRjtBQUNBO0FBQ0s7QUFDQztBQUNGO0FBQ1c7QUFDVjtBQUNMO0FBQ1E7QUFDSjtBQUNFO0FBQ0Y7QUFFQTtBQUNGO0FBQ0E7QUFDSTtBQUNIO0FBQ0M7QUFDRjtBQUNDO0FBQ0c7QUFDQTtBQUNVO0FBQ1g7QUFDTztBQWFqQztBQWVBO0FBRWtEO0FBRWpDO0FBRXVCO0FBRUQ7QUFDekI7QUFFTTtBQUNFO0FBVXRCO0FBQzZCO0FBUzFCO0FBQ1k7QUFDK0I7QUFDbkI7QUFDOEI7QUFDNUI7QUFDQztBQUNHO0FBQ0w7QUFDZTtBQUNaO0FBQ2U7QUFFNUI7QUFDYztBQUNZO0FBQ3RDO0FBQ2dEO0FBRXhFLE1BQU0rRyxlQUFlbkQseURBQWdCQTtBQUVyQyxNQUFNb0QsWUFBWVYsOERBQWVBO0FBRWpDLE1BQU1XLFdBQVc3Qyx5REFBT0EsQ0FBQyxVQUFZLENBQUMsTUFBTSxrTkFBbUIsRUFBRzZDLFFBQVE7Ozs7OztJQUN4RUMsU0FBUyxrQkFBTSw4REFBQ2pHLDhEQUFXQTs7Ozs7O0tBRHZCZ0c7QUFJTixNQUFNRSxZQUFZOztJQUNoQixNQUFNQyxXQUFXbkMsOERBQVdBO0lBQzVCLE1BQU0sQ0FBQ29DLE9BQU9DLFNBQVMsR0FBRy9HLCtDQUFRQSxDQUFTO0lBQzNDLE1BQU0sQ0FBQ2dILFlBQVlDLGNBQWMsR0FBR2pILCtDQUFRQSxDQUFDO0lBRTdDSCxnREFBU0EsQ0FBQztRQUNSLE1BQU1xSCxpQkFBaUI7WUFDckIsTUFBTUMsVUFBVSxNQUFNWiwyREFBWUE7WUFDbENVLGNB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WUFBWTlFLHFEQUFZQTtJQUM5QixNQUFNK0UsVUFBVUQsVUFBVUUsY0FBYztJQUN4QyxxQkFBTyw4REFBQ29QLFdBQVdyUCxRQUFROE0sRUFBRTs7Ozs7QUFDL0I7S0FKZ0JuTTs7UUFDSTFGLGlEQUFZQTs7O09BRGhCMEYiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2NvbXBvbmVudHMvY2hhdC50c3g/OGQ2MiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1c2VEZWJvdW5jZWRDYWxsYmFjayB9IGZyb20gXCJ1c2UtZGVib3VuY2VcIjtcclxuaW1wb3J0IFJlYWN0LCB7XHJcbiAgRnJhZ21lbnQsXHJcbiAgUmVmT2JqZWN0LFxyXG4gIHVzZUNhbGxiYWNrLFxyXG4gIHVzZUVmZmVjdCxcclxuICB1c2VNZW1vLFxyXG4gIHVzZVJlZixcclxuICB1c2VTdGF0ZSxcclxufSBmcm9tIFwicmVhY3RcIjtcclxuXHJcbmltcG9ydCBTZW5kV2hpdGVJY29uIGZyb20gXCIuLi9pY29ucy9zZW5kLXdoaXRlLnN2Z1wiO1xyXG5pbXBvcnQgQnJhaW5JY29uIGZyb20gXCIuLi9pY29ucy9icmFpbi5zdmdcIjtcclxuaW1wb3J0IFJlbmFtZUljb24gZnJvbSBcIi4uL2ljb25zL3JlbmFtZS5zdmdcIjtcclxuaW1wb3J0IEVkaXRJY29uIGZyb20gXCIuLi9pY29ucy9yZW5hbWUuc3ZnXCI7XHJcbmltcG9ydCBFeHBvcnRJY29uIGZyb20gXCIuLi9pY29ucy9zaGFyZS5zdmdcIjtcclxuaW1wb3J0IFJldHVybkljb24gZnJvbSBcIi4uL2ljb25zL3JldHVybi5zdmdcIjtcclxuaW1wb3J0IENvcHlJY29uIGZyb20gXCIuLi9pY29ucy9jb3B5LnN2Z1wiO1xyXG5pbXBvcnQgU3BlYWtJY29uIGZyb20gXCIuLi9pY29ucy9zcGVhay5zdmdcIjtcclxuaW1wb3J0IFNwZWFrU3RvcEljb24gZnJvbSBcIi4uL2ljb25zL3NwZWFrLXN0b3Auc3ZnXCI7XHJcbmltcG9ydCBMb2FkaW5nSWNvbiBmcm9tIFwiLi4vaWNvbnMvdGhyZWUtZG90cy5zdmdcIjtcclxuaW1wb3J0IExvYWRpbmdCdXR0b25JY29uIGZyb20gXCIuLi9pY29ucy9sb2FkaW5nLnN2Z1wiO1xyXG5pbXBvcnQgUHJvbXB0SWNvbiBmcm9tIFwiLi4vaWNvbnMvcHJvbXB0LnN2Z1wiO1xyXG5pbXBvcnQgTWFza0ljb24gZnJvbSBcIi4uL2ljb25zL21hc2suc3ZnXCI7XHJcbmltcG9ydCBNYXhJY29uIGZyb20gXCIuLi9pY29ucy9tYXguc3ZnXCI7XHJcbmltcG9ydCBNaW5JY29uIGZyb20gXCIuLi9pY29ucy9taW4uc3ZnXCI7XHJcbmltcG9ydCBSZXNldEljb24gZnJvbSBcIi4uL2ljb25zL3JlbG9hZC5zdmdcIjtcclxuaW1wb3J0IFJlbG9hZEljb24gZnJvbSBcIi4uL2ljb25zL3JlbG9hZC5zdmdcIjtcclxuaW1wb3J0IEJyZWFrSWNvbiBmcm9tIFwiLi4vaWNvbnMvYnJlYWsuc3ZnXCI7XHJcbmltcG9ydCBTZXR0aW5nc0ljb24gZnJvbSBcIi4uL2ljb25zL2NoYXQtc2V0dGluZ3Muc3ZnXCI7XHJcbmltcG9ydCBEZWxldGVJY29uIGZyb20gXCIuLi9pY29ucy9jbGVhci5zdmdcIjtcclxuaW1wb3J0IFBpbkljb24gZnJvbSBcIi4uL2ljb25zL3Bpbi5zdmdcIjtcclxuaW1wb3J0IENvbmZpcm1JY29uIGZyb20gXCIuLi9pY29ucy9jb25maXJtLnN2Z1wiO1xyXG5pbXBvcnQgQ2xvc2VJY29uIGZyb20gXCIuLi9pY29ucy9jbG9zZS5zdmdcIjtcclxuaW1wb3J0IENhbmNlbEljb24gZnJvbSBcIi4uL2ljb25zL2NhbmNlbC5zdmdcIjtcclxuaW1wb3J0IEltYWdlSWNvbiBmcm9tIFwiLi4vaWNvbnMvaW1hZ2Uuc3ZnXCI7XHJcblxyXG5pbXBvcnQgTGlnaHRJY29uIGZyb20gXCIuLi9pY29ucy9saWdodC5zdmdcIjtcclxuaW1wb3J0IERhcmtJY29uIGZyb20gXCIuLi9pY29ucy9kYXJrLnN2Z1wiO1xyXG5pbXBvcnQgQXV0b0ljb24gZnJvbSBcIi4uL2ljb25zL2F1dG8uc3ZnXCI7XHJcbmltcG9ydCBCb3R0b21JY29uIGZyb20gXCIuLi9pY29ucy9ib3R0b20uc3ZnXCI7XHJcbmltcG9ydCBTdG9wSWNvbiBmcm9tIFwiLi4vaWNvbnMvcGF1c2Uuc3ZnXCI7XHJcbmltcG9ydCBSb2JvdEljb24gZnJvbSBcIi4uL2ljb25zL3JvYm90LnN2Z1wiO1xyXG5pbXBvcnQgU2l6ZUljb24gZnJvbSBcIi4uL2ljb25zL3NpemUuc3ZnXCI7XHJcbmltcG9ydCBRdWFsaXR5SWNvbiBmcm9tIFwiLi4vaWNvbnMvaGQuc3ZnXCI7XHJcbmltcG9ydCBTdHlsZUljb24gZnJvbSBcIi4uL2ljb25zL3BhbGV0dGUuc3ZnXCI7XHJcbmltcG9ydCBQbHVnaW5JY29uIGZyb20gXCIuLi9pY29ucy9wbHVnaW4uc3ZnXCI7XHJcbmltcG9ydCBTaG9ydGN1dGtleUljb24gZnJvbSBcIi4uL2ljb25zL3Nob3J0Y3V0a2V5LnN2Z1wiO1xyXG5pbXBvcnQgTWNwVG9vbEljb24gZnJvbSBcIi4uL2ljb25zL3Rvb2wuc3ZnXCI7XHJcbmltcG9ydCBIZWFkcGhvbmVJY29uIGZyb20gXCIuLi9pY29ucy9oZWFkcGhvbmUuc3ZnXCI7XHJcbmltcG9ydCB7XHJcbiAgQk9UX0hFTExPLFxyXG4gIENoYXRNZXNzYWdlLFxyXG4gIGNyZWF0ZU1lc3NhZ2UsXHJcbiAgREVGQVVMVF9UT1BJQyxcclxuICBNb2RlbFR5cGUsXHJcbiAgU3VibWl0S2V5LFxyXG4gIFRoZW1lLFxyXG4gIHVzZUFjY2Vzc1N0b3JlLFxyXG4gIHVzZUFwcENvbmZpZyxcclxuICB1c2VDaGF0U3RvcmUsXHJcbiAgdXNlUGx1Z2luU3RvcmUsXHJcbn0gZnJvbSBcIi4uL3N0b3JlXCI7XHJcblxyXG5pbXBvcnQge1xyXG4gIGF1dG9Hcm93VGV4dEFyZWEsXHJcbiAgY29weVRvQ2xpcGJvYXJkLFxyXG4gIGdldE1lc3NhZ2VJbWFnZXMsXHJcbiAgZ2V0TWVzc2FnZVRleHRDb250ZW50LFxyXG4gIGlzRGFsbGUzLFxyXG4gIGlzVmlzaW9uTW9kZWwsXHJcbiAgc2FmZUxvY2FsU3RvcmFnZSxcclxuICBnZXRNb2RlbFNpemVzLFxyXG4gIHN1cHBvcnRzQ3VzdG9tU2l6ZSxcclxuICB1c2VNb2JpbGVTY3JlZW4sXHJcbiAgc2VsZWN0T3JDb3B5LFxyXG4gIHNob3dQbHVnaW5zLFxyXG59IGZyb20gXCIuLi91dGlsc1wiO1xyXG5cclxuaW1wb3J0IHsgdXBsb2FkSW1hZ2UgYXMgdXBsb2FkSW1hZ2VSZW1vdGUgfSBmcm9tIFwiQC9hcHAvdXRpbHMvY2hhdFwiO1xyXG5cclxuaW1wb3J0IGR5bmFtaWMgZnJvbSBcIm5leHQvZHluYW1pY1wiO1xyXG5cclxuaW1wb3J0IHsgQ2hhdENvbnRyb2xsZXJQb29sIH0gZnJvbSBcIi4uL2NsaWVudC9jb250cm9sbGVyXCI7XHJcbmltcG9ydCB7IERhbGxlUXVhbGl0eSwgRGFsbGVTdHlsZSwgTW9kZWxTaXplIH0gZnJvbSBcIi4uL3R5cGluZ1wiO1xyXG5pbXBvcnQgeyBQcm9tcHQsIHVzZVByb21wdFN0b3JlIH0gZnJvbSBcIi4uL3N0b3JlL3Byb21wdFwiO1xyXG5pbXBvcnQgTG9jYWxlIGZyb20gXCIuLi9sb2NhbGVzXCI7XHJcblxyXG5pbXBvcnQgeyBJY29uQnV0dG9uIH0gZnJvbSBcIi4vYnV0dG9uXCI7XHJcbmltcG9ydCBzdHlsZXMgZnJvbSBcIi4vY2hhdC5tb2R1bGUuc2Nzc1wiO1xyXG5cclxuaW1wb3J0IHtcclxuICBMaXN0LFxyXG4gIExpc3RJdGVtLFxyXG4gIE1vZGFsLFxyXG4gIFNlbGVjdG9yLFxyXG4gIHNob3dDb25maXJtLFxyXG4gIHNob3dQcm9tcHQsXHJcbiAgc2hvd1RvYXN0LFxyXG59IGZyb20gXCIuL3VpLWxpYlwiO1xyXG5pbXBvcnQgeyB1c2VOYXZpZ2F0ZSB9IGZyb20gXCJyZWFjdC1yb3V0ZXItZG9tXCI7XHJcbmltcG9ydCB7XHJcbiAgQ0hBVF9QQUdFX1NJWkUsXHJcbiAgREVGQVVMVF9UVFNfRU5HSU5FLFxyXG4gIE1vZGVsUHJvdmlkZXIsXHJcbiAgUGF0aCxcclxuICBSRVFVRVNUX1RJTUVPVVRfTVMsXHJcbiAgU2VydmljZVByb3ZpZGVyLFxyXG4gIFVORklOSVNIRURfSU5QVVQsXHJcbn0gZnJvbSBcIi4uL2NvbnN0YW50XCI7XHJcbmltcG9ydCB7IEF2YXRhciB9IGZyb20gXCIuL2Vtb2ppXCI7XHJcbmltcG9ydCB7IENvbnRleHRQcm9tcHRzLCBNYXNrQXZhdGFyLCBNYXNrQ29uZmlnIH0gZnJvbSBcIi4vbWFza1wiO1xyXG5pbXBvcnQgeyB1c2VNYXNrU3RvcmUgfSBmcm9tIFwiLi4vc3RvcmUvbWFza1wiO1xyXG5pbXBvcnQgeyBDaGF0Q29tbWFuZFByZWZpeCwgdXNlQ2hhdENvbW1hbmQsIHVzZUNvbW1hbmQgfSBmcm9tIFwiLi4vY29tbWFuZFwiO1xyXG5pbXBvcnQgeyBwcmV0dHlPYmplY3QgfSBmcm9tIFwiLi4vdXRpbHMvZm9ybWF0XCI7XHJcbmltcG9ydCB7IEV4cG9ydE1lc3NhZ2VNb2RhbCB9IGZyb20gXCIuL2V4cG9ydGVyXCI7XHJcbmltcG9ydCB7IGdldENsaWVudENvbmZpZyB9IGZyb20gXCIuLi9jb25maWcvY2xpZW50XCI7XHJcbmltcG9ydCB7IHVzZUFsbE1vZGVscyB9IGZyb20gXCIuLi91dGlscy9ob29rc1wiO1xyXG5pbXBvcnQgeyBDbGllbnRBcGksIE11bHRpbW9kYWxDb250ZW50IH0gZnJvbSBcIi4uL2NsaWVudC9hcGlcIjtcclxuaW1wb3J0IHsgY3JlYXRlVFRTUGxheWVyIH0gZnJvbSBcIi4uL3V0aWxzL2F1ZGlvXCI7XHJcbmltcG9ydCB7IE1zRWRnZVRUUywgT1VUUFVUX0ZPUk1BVCB9IGZyb20gXCIuLi91dGlscy9tc19lZGdlX3R0c1wiO1xyXG5cclxuaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCJsb2Rhc2gtZXNcIjtcclxuaW1wb3J0IHsgZ2V0TW9kZWxQcm92aWRlciB9IGZyb20gXCIuLi91dGlscy9tb2RlbFwiO1xyXG5pbXBvcnQgeyBSZWFsdGltZUNoYXQgfSBmcm9tIFwiQC9hcHAvY29tcG9uZW50cy9yZWFsdGltZS1jaGF0XCI7XHJcbmltcG9ydCBjbHN4IGZyb20gXCJjbHN4XCI7XHJcbmltcG9ydCB7IGdldEF2YWlsYWJsZUNsaWVudHNDb3VudCwgaXNNY3BFbmFibGVkIH0gZnJvbSBcIi4uL21jcC9hY3Rpb25zXCI7XHJcblxyXG5jb25zdCBsb2NhbFN0b3JhZ2UgPSBzYWZlTG9jYWxTdG9yYWdlKCk7XHJcblxyXG5jb25zdCB0dHNQbGF5ZXIgPSBjcmVhdGVUVFNQbGF5ZXIoKTtcclxuXHJcbmNvbnN0IE1hcmtkb3duID0gZHluYW1pYyhhc3luYyAoKSA9PiAoYXdhaXQgaW1wb3J0KFwiLi9tYXJrZG93blwiKSkuTWFya2Rvd24sIHtcclxuICBsb2FkaW5nOiAoKSA9PiA8TG9hZGluZ0ljb24gLz4sXHJcbn0pO1xyXG5cclxuY29uc3QgTUNQQWN0aW9uID0gKCkgPT4ge1xyXG4gIGNvbnN0IG5hdmlnYXRlID0gdXNlTmF2aWdhdGUoKTtcclxuICBjb25zdCBbY291bnQsIHNldENvdW50XSA9IHVzZVN0YXRlPG51bWJlcj4oMCk7XHJcbiAgY29uc3QgW21jcEVuYWJsZWQsIHNldE1jcEVuYWJsZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG5cclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgY29uc3QgY2hlY2tNY3BTdGF0dXMgPSBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGVuYWJsZWQgPSBhd2FpdCBpc01jcEVuYWJsZWQoKTtcclxuICAgICAgc2V0TWNwRW5hYmxlZChlbmFibGVkKTtcclxuICAgICAgaWYgKGVuYWJsZWQpIHtcclxuICAgICAgICBjb25zdCBjb3VudCA9IGF3YWl0IGdldEF2YWlsYWJsZUNsaWVudHNDb3VudCgpO1xyXG4gICAgICAgIHNldENvdW50KGNvdW50KTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIGNoZWNrTWNwU3RhdHVzKCk7XHJcbiAgfSwgW10pO1xyXG5cclxuICBpZiAoIW1jcEVuYWJsZWQpIHJldHVybiBudWxsO1xyXG5cclxuICByZXR1cm4gKFxyXG4gICAgPENoYXRBY3Rpb25cclxuICAgICAgb25DbGljaz17KCkgPT4gbmF2aWdhdGUoUGF0aC5NY3BNYXJrZXQpfVxyXG4gICAgICB0ZXh0PXtgTUNQJHtjb3VudCA/IGAgKCR7Y291bnR9KWAgOiBcIlwifWB9XHJcbiAgICAgIGljb249ezxNY3BUb29sSWNvbiAvPn1cclxuICAgIC8+XHJcbiAgKTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBTZXNzaW9uQ29uZmlnTW9kZWwocHJvcHM6IHsgb25DbG9zZTogKCkgPT4gdm9pZCB9KSB7XHJcbiAgY29uc3QgY2hhdFN0b3JlID0gdXNlQ2hhdFN0b3JlKCk7XHJcbiAgY29uc3Qgc2Vzc2lvbiA9IGNoYXRTdG9yZS5jdXJyZW50U2Vzc2lvbigpO1xyXG4gIGNvbnN0IG1hc2tTdG9yZSA9IHVzZU1hc2tTdG9yZSgpO1xyXG4gIGNvbnN0IG5hdmlnYXRlID0gdXNlTmF2aWdhdGUoKTtcclxuXHJcbiAgcmV0dXJuIChcclxuICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtbWFza1wiPlxyXG4gICAgICA8TW9kYWxcclxuICAgICAgICB0aXRsZT17TG9jYWxlLkNvbnRleHQuRWRpdH1cclxuICAgICAgICBvbkNsb3NlPXsoKSA9PiBwcm9wcy5vbkNsb3NlKCl9XHJcbiAgICAgICAgYWN0aW9ucz17W1xyXG4gICAgICAgICAgPEljb25CdXR0b25cclxuICAgICAgICAgICAga2V5PVwicmVzZXRcIlxyXG4gICAgICAgICAgICBpY29uPXs8UmVzZXRJY29uIC8+fVxyXG4gICAgICAgICAgICBib3JkZXJlZFxyXG4gICAgICAgICAgICB0ZXh0PXtMb2NhbGUuQ2hhdC5Db25maWcuUmVzZXR9XHJcbiAgICAgICAgICAgIG9uQ2xpY2s9e2FzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoYXdhaXQgc2hvd0NvbmZpcm0oTG9jYWxlLk1lbW9yeS5SZXNldENvbmZpcm0pKSB7XHJcbiAgICAgICAgICAgICAgICBjaGF0U3RvcmUudXBkYXRlVGFyZ2V0U2Vzc2lvbihcclxuICAgICAgICAgICAgICAgICAgc2Vzc2lvbixcclxuICAgICAgICAgICAgICAgICAgKHNlc3Npb24pID0+IChzZXNzaW9uLm1lbW9yeVByb21wdCA9IFwiXCIpLFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAvPixcclxuICAgICAgICAgIDxJY29uQnV0dG9uXHJcbiAgICAgICAgICAgIGtleT1cImNvcHlcIlxyXG4gICAgICAgICAgICBpY29uPXs8Q29weUljb24gLz59XHJcbiAgICAgICAgICAgIGJvcmRlcmVkXHJcbiAgICAgICAgICAgIHRleHQ9e0xvY2FsZS5DaGF0LkNvbmZpZy5TYXZlQXN9XHJcbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICBuYXZpZ2F0ZShQYXRoLk1hc2tzKTtcclxuICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIG1hc2tTdG9yZS5jcmVhdGUoc2Vzc2lvbi5tYXNrKTtcclxuICAgICAgICAgICAgICB9LCA1MDApO1xyXG4gICAgICAgICAgICB9fVxyXG4gICAgICAgICAgLz4sXHJcbiAgICAgICAgXX1cclxuICAgICAgPlxyXG4gICAgICAgIDxNYXNrQ29uZmlnXHJcbiAgICAgICAgICBtYXNrPXtzZXNzaW9uLm1hc2t9XHJcbiAgICAgICAgICB1cGRhdGVNYXNrPXsodXBkYXRlcikgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBtYXNrID0geyAuLi5zZXNzaW9uLm1hc2sgfTtcclxuICAgICAgICAgICAgdXBkYXRlcihtYXNrKTtcclxuICAgICAgICAgICAgY2hhdFN0b3JlLnVwZGF0ZVRhcmdldFNlc3Npb24oXHJcbiAgICAgICAgICAgICAgc2Vzc2lvbixcclxuICAgICAgICAgICAgICAoc2Vzc2lvbikgPT4gKHNlc3Npb24ubWFzayA9IG1hc2spLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfX1cclxuICAgICAgICAgIHNob3VsZFN5bmNGcm9tR2xvYmFsXHJcbiAgICAgICAgICBleHRyYUxpc3RJdGVtcz17XHJcbiAgICAgICAgICAgIHNlc3Npb24ubWFzay5tb2RlbENvbmZpZy5zZW5kTWVtb3J5ID8gKFxyXG4gICAgICAgICAgICAgIDxMaXN0SXRlbVxyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiY29weWFibGVcIlxyXG4gICAgICAgICAgICAgICAgdGl0bGU9e2Ake0xvY2FsZS5NZW1vcnkuVGl0bGV9ICgke3Nlc3Npb24ubGFzdFN1bW1hcml6ZUluZGV4fSBvZiAke3Nlc3Npb24ubWVzc2FnZXMubGVuZ3RofSlgfVxyXG4gICAgICAgICAgICAgICAgc3ViVGl0bGU9e3Nlc3Npb24ubWVtb3J5UHJvbXB0IHx8IExvY2FsZS5NZW1vcnkuRW1wdHlDb250ZW50fVxyXG4gICAgICAgICAgICAgID48L0xpc3RJdGVtPlxyXG4gICAgICAgICAgICApIDogKFxyXG4gICAgICAgICAgICAgIDw+PC8+XHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgIH1cclxuICAgICAgICA+PC9NYXNrQ29uZmlnPlxyXG4gICAgICA8L01vZGFsPlxyXG4gICAgPC9kaXY+XHJcbiAgKTtcclxufVxyXG5cclxuZnVuY3Rpb24gUHJvbXB0VG9hc3QocHJvcHM6IHtcclxuICBzaG93VG9hc3Q/OiBib29sZWFuO1xyXG4gIHNob3dNb2RhbD86IGJvb2xlYW47XHJcbiAgc2V0U2hvd01vZGFsOiAoXzogYm9vbGVhbikgPT4gdm9pZDtcclxufSkge1xyXG4gIGNvbnN0IGNoYXRTdG9yZSA9IHVzZUNoYXRTdG9yZSgpO1xyXG4gIGNvbnN0IHNlc3Npb24gPSBjaGF0U3RvcmUuY3VycmVudFNlc3Npb24oKTtcclxuICBjb25zdCBjb250ZXh0ID0gc2Vzc2lvbi5tYXNrLmNvbnRleHQ7XHJcblxyXG4gIHJldHVybiAoXHJcbiAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzW1wicHJvbXB0LXRvYXN0XCJdfSBrZXk9XCJwcm9tcHQtdG9hc3RcIj5cclxuICAgICAge3Byb3BzLnNob3dUb2FzdCAmJiBjb250ZXh0Lmxlbmd0aCA+IDAgJiYgKFxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzTmFtZT17Y2xzeChzdHlsZXNbXCJwcm9tcHQtdG9hc3QtaW5uZXJcIl0sIFwiY2xpY2thYmxlXCIpfVxyXG4gICAgICAgICAgcm9sZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBwcm9wcy5zZXRTaG93TW9kYWwodHJ1ZSl9XHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPEJyYWluSWNvbiAvPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXtzdHlsZXNbXCJwcm9tcHQtdG9hc3QtY29udGVudFwiXX0+XHJcbiAgICAgICAgICAgIHtMb2NhbGUuQ29udGV4dC5Ub2FzdChjb250ZXh0Lmxlbmd0aCl9XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICl9XHJcbiAgICAgIHtwcm9wcy5zaG93TW9kYWwgJiYgKFxyXG4gICAgICAgIDxTZXNzaW9uQ29uZmlnTW9kZWwgb25DbG9zZT17KCkgPT4gcHJvcHMuc2V0U2hvd01vZGFsKGZhbHNlKX0gLz5cclxuICAgICAgKX1cclxuICAgIDwvZGl2PlxyXG4gICk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHVzZVN1Ym1pdEhhbmRsZXIoKSB7XHJcbiAgY29uc3QgY29uZmlnID0gdXNlQXBwQ29uZmlnKCk7XHJcbiAgY29uc3Qgc3VibWl0S2V5ID0gY29uZmlnLnN1Ym1pdEtleTtcclxuICBjb25zdCBpc0NvbXBvc2luZyA9IHVzZVJlZihmYWxzZSk7XHJcblxyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICBjb25zdCBvbkNvbXBvc2l0aW9uU3RhcnQgPSAoKSA9PiB7XHJcbiAgICAgIGlzQ29tcG9zaW5nLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgfTtcclxuICAgIGNvbnN0IG9uQ29tcG9zaXRpb25FbmQgPSAoKSA9PiB7XHJcbiAgICAgIGlzQ29tcG9zaW5nLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgIH07XHJcblxyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJjb21wb3NpdGlvbnN0YXJ0XCIsIG9uQ29tcG9zaXRpb25TdGFydCk7XHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImNvbXBvc2l0aW9uZW5kXCIsIG9uQ29tcG9zaXRpb25FbmQpO1xyXG5cclxuICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwiY29tcG9zaXRpb25zdGFydFwiLCBvbkNvbXBvc2l0aW9uU3RhcnQpO1xyXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNvbXBvc2l0aW9uZW5kXCIsIG9uQ29tcG9zaXRpb25FbmQpO1xyXG4gICAgfTtcclxuICB9LCBbXSk7XHJcblxyXG4gIGNvbnN0IHNob3VsZFN1Ym1pdCA9IChlOiBSZWFjdC5LZXlib2FyZEV2ZW50PEhUTUxUZXh0QXJlYUVsZW1lbnQ+KSA9PiB7XHJcbiAgICAvLyBGaXggQ2hpbmVzZSBpbnB1dCBtZXRob2QgXCJFbnRlclwiIG9uIFNhZmFyaVxyXG4gICAgaWYgKGUua2V5Q29kZSA9PSAyMjkpIHJldHVybiBmYWxzZTtcclxuICAgIGlmIChlLmtleSAhPT0gXCJFbnRlclwiKSByZXR1cm4gZmFsc2U7XHJcbiAgICBpZiAoZS5rZXkgPT09IFwiRW50ZXJcIiAmJiAoZS5uYXRpdmVFdmVudC5pc0NvbXBvc2luZyB8fCBpc0NvbXBvc2luZy5jdXJyZW50KSlcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgKGNvbmZpZy5zdWJtaXRLZXkgPT09IFN1Ym1pdEtleS5BbHRFbnRlciAmJiBlLmFsdEtleSkgfHxcclxuICAgICAgKGNvbmZpZy5zdWJtaXRLZXkgPT09IFN1Ym1pdEtleS5DdHJsRW50ZXIgJiYgZS5jdHJsS2V5KSB8fFxyXG4gICAgICAoY29uZmlnLnN1Ym1pdEtleSA9PT0gU3VibWl0S2V5LlNoaWZ0RW50ZXIgJiYgZS5zaGlmdEtleSkgfHxcclxuICAgICAgKGNvbmZpZy5zdWJtaXRLZXkgPT09IFN1Ym1pdEtleS5NZXRhRW50ZXIgJiYgZS5tZXRhS2V5KSB8fFxyXG4gICAgICAoY29uZmlnLnN1Ym1pdEtleSA9PT0gU3VibWl0S2V5LkVudGVyICYmXHJcbiAgICAgICAgIWUuYWx0S2V5ICYmXHJcbiAgICAgICAgIWUuY3RybEtleSAmJlxyXG4gICAgICAgICFlLnNoaWZ0S2V5ICYmXHJcbiAgICAgICAgIWUubWV0YUtleSlcclxuICAgICk7XHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIHN1Ym1pdEtleSxcclxuICAgIHNob3VsZFN1Ym1pdCxcclxuICB9O1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBSZW5kZXJQcm9tcHQgPSBQaWNrPFByb21wdCwgXCJ0aXRsZVwiIHwgXCJjb250ZW50XCI+O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIFByb21wdEhpbnRzKHByb3BzOiB7XHJcbiAgcHJvbXB0czogUmVuZGVyUHJvbXB0W107XHJcbiAgb25Qcm9tcHRTZWxlY3Q6IChwcm9tcHQ6IFJlbmRlclByb21wdCkgPT4gdm9pZDtcclxufSkge1xyXG4gIGNvbnN0IG5vUHJvbXB0cyA9IHByb3BzLnByb21wdHMubGVuZ3RoID09PSAwO1xyXG4gIGNvbnN0IFtzZWxlY3RJbmRleCwgc2V0U2VsZWN0SW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgY29uc3Qgc2VsZWN0ZWRSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xyXG5cclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgc2V0U2VsZWN0SW5kZXgoMCk7XHJcbiAgfSwgW3Byb3BzLnByb21wdHMubGVuZ3RoXSk7XHJcblxyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICBjb25zdCBvbktleURvd24gPSAoZTogS2V5Ym9hcmRFdmVudCkgPT4ge1xyXG4gICAgICBpZiAobm9Qcm9tcHRzIHx8IGUubWV0YUtleSB8fCBlLmFsdEtleSB8fCBlLmN0cmxLZXkpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgLy8gYXJyb3cgdXAgLyBkb3duIHRvIHNlbGVjdCBwcm9tcHRcclxuICAgICAgY29uc3QgY2hhbmdlSW5kZXggPSAoZGVsdGE6IG51bWJlcikgPT4ge1xyXG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGNvbnN0IG5leHRJbmRleCA9IE1hdGgubWF4KFxyXG4gICAgICAgICAgMCxcclxuICAgICAgICAgIE1hdGgubWluKHByb3BzLnByb21wdHMubGVuZ3RoIC0gMSwgc2VsZWN0SW5kZXggKyBkZWx0YSksXHJcbiAgICAgICAgKTtcclxuICAgICAgICBzZXRTZWxlY3RJbmRleChuZXh0SW5kZXgpO1xyXG4gICAgICAgIHNlbGVjdGVkUmVmLmN1cnJlbnQ/LnNjcm9sbEludG9WaWV3KHtcclxuICAgICAgICAgIGJsb2NrOiBcImNlbnRlclwiLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgaWYgKGUua2V5ID09PSBcIkFycm93VXBcIikge1xyXG4gICAgICAgIGNoYW5nZUluZGV4KDEpO1xyXG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSBcIkFycm93RG93blwiKSB7XHJcbiAgICAgICAgY2hhbmdlSW5kZXgoLTEpO1xyXG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSBcIkVudGVyXCIpIHtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFByb21wdCA9IHByb3BzLnByb21wdHMuYXQoc2VsZWN0SW5kZXgpO1xyXG4gICAgICAgIGlmIChzZWxlY3RlZFByb21wdCkge1xyXG4gICAgICAgICAgcHJvcHMub25Qcm9tcHRTZWxlY3Qoc2VsZWN0ZWRQcm9tcHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgb25LZXlEb3duKTtcclxuXHJcbiAgICByZXR1cm4gKCkgPT4gd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIG9uS2V5RG93bik7XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXHJcbiAgfSwgW3Byb3BzLnByb21wdHMubGVuZ3RoLCBzZWxlY3RJbmRleF0pO1xyXG5cclxuICBpZiAobm9Qcm9tcHRzKSByZXR1cm4gbnVsbDtcclxuICByZXR1cm4gKFxyXG4gICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlc1tcInByb21wdC1oaW50c1wiXX0+XHJcbiAgICAgIHtwcm9wcy5wcm9tcHRzLm1hcCgocHJvbXB0LCBpKSA9PiAoXHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgcmVmPXtpID09PSBzZWxlY3RJbmRleCA/IHNlbGVjdGVkUmVmIDogbnVsbH1cclxuICAgICAgICAgIGNsYXNzTmFtZT17Y2xzeChzdHlsZXNbXCJwcm9tcHQtaGludFwiXSwge1xyXG4gICAgICAgICAgICBbc3R5bGVzW1wicHJvbXB0LWhpbnQtc2VsZWN0ZWRcIl1dOiBpID09PSBzZWxlY3RJbmRleCxcclxuICAgICAgICAgIH0pfVxyXG4gICAgICAgICAga2V5PXtwcm9tcHQudGl0bGUgKyBpLnRvU3RyaW5nKCl9XHJcbiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBwcm9wcy5vblByb21wdFNlbGVjdChwcm9tcHQpfVxyXG4gICAgICAgICAgb25Nb3VzZUVudGVyPXsoKSA9PiBzZXRTZWxlY3RJbmRleChpKX1cclxuICAgICAgICA+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzW1wiaGludC10aXRsZVwiXX0+e3Byb21wdC50aXRsZX08L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXNbXCJoaW50LWNvbnRlbnRcIl19Pntwcm9tcHQuY29udGVudH08L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgKSl9XHJcbiAgICA8L2Rpdj5cclxuICApO1xyXG59XHJcblxyXG5mdW5jdGlvbiBDbGVhckNvbnRleHREaXZpZGVyKCkge1xyXG4gIGNvbnN0IGNoYXRTdG9yZSA9IHVzZUNoYXRTdG9yZSgpO1xyXG4gIGNvbnN0IHNlc3Npb24gPSBjaGF0U3RvcmUuY3VycmVudFNlc3Npb24oKTtcclxuXHJcbiAgcmV0dXJuIChcclxuICAgIDxkaXZcclxuICAgICAgY2xhc3NOYW1lPXtzdHlsZXNbXCJjbGVhci1jb250ZXh0XCJdfVxyXG4gICAgICBvbkNsaWNrPXsoKSA9PlxyXG4gICAgICAgIGNoYXRTdG9yZS51cGRhdGVUYXJnZXRTZXNzaW9uKFxyXG4gICAgICAgICAgc2Vzc2lvbixcclxuICAgICAgICAgIChzZXNzaW9uKSA9PiAoc2Vzc2lvbi5jbGVhckNvbnRleHRJbmRleCA9IHVuZGVmaW5lZCksXHJcbiAgICAgICAgKVxyXG4gICAgICB9XHJcbiAgICA+XHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXNbXCJjbGVhci1jb250ZXh0LXRpcHNcIl19PntMb2NhbGUuQ29udGV4dC5DbGVhcn08L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlc1tcImNsZWFyLWNvbnRleHQtcmV2ZXJ0LWJ0blwiXX0+XHJcbiAgICAgICAge0xvY2FsZS5Db250ZXh0LlJldmVydH1cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gQ2hhdEFjdGlvbihwcm9wczoge1xyXG4gIHRleHQ6IHN0cmluZztcclxuICBpY29uOiBKU1guRWxlbWVudDtcclxuICBvbkNsaWNrOiAoKSA9PiB2b2lkO1xyXG59KSB7XHJcbiAgY29uc3QgaWNvblJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbCk7XHJcbiAgY29uc3QgdGV4dFJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbCk7XHJcbiAgY29uc3QgW3dpZHRoLCBzZXRXaWR0aF0gPSB1c2VTdGF0ZSh7XHJcbiAgICBmdWxsOiAxNixcclxuICAgIGljb246IDE2LFxyXG4gIH0pO1xyXG5cclxuICBmdW5jdGlvbiB1cGRhdGVXaWR0aCgpIHtcclxuICAgIGlmICghaWNvblJlZi5jdXJyZW50IHx8ICF0ZXh0UmVmLmN1cnJlbnQpIHJldHVybjtcclxuICAgIGNvbnN0IGdldFdpZHRoID0gKGRvbTogSFRNTERpdkVsZW1lbnQpID0+IGRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcclxuICAgIGNvbnN0IHRleHRXaWR0aCA9IGdldFdpZHRoKHRleHRSZWYuY3VycmVudCk7XHJcbiAgICBjb25zdCBpY29uV2lkdGggPSBnZXRXaWR0aChpY29uUmVmLmN1cnJlbnQpO1xyXG4gICAgc2V0V2lkdGgoe1xyXG4gICAgICBmdWxsOiB0ZXh0V2lkdGggKyBpY29uV2lkdGgsXHJcbiAgICAgIGljb246IGljb25XaWR0aCxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIChcclxuICAgIDxkaXZcclxuICAgICAgY2xhc3NOYW1lPXtjbHN4KHN0eWxlc1tcImNoYXQtaW5wdXQtYWN0aW9uXCJdLCBcImNsaWNrYWJsZVwiKX1cclxuICAgICAgb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgIHByb3BzLm9uQ2xpY2soKTtcclxuICAgICAgICBzZXRUaW1lb3V0KHVwZGF0ZVdpZHRoLCAxKTtcclxuICAgICAgfX1cclxuICAgICAgb25Nb3VzZUVudGVyPXt1cGRhdGVXaWR0aH1cclxuICAgICAgb25Ub3VjaFN0YXJ0PXt1cGRhdGVXaWR0aH1cclxuICAgICAgc3R5bGU9e1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIFwiLS1pY29uLXdpZHRoXCI6IGAke3dpZHRoLmljb259cHhgLFxyXG4gICAgICAgICAgXCItLWZ1bGwtd2lkdGhcIjogYCR7d2lkdGguZnVsbH1weGAsXHJcbiAgICAgICAgfSBhcyBSZWFjdC5DU1NQcm9wZXJ0aWVzXHJcbiAgICAgIH1cclxuICAgID5cclxuICAgICAgPGRpdiByZWY9e2ljb25SZWZ9IGNsYXNzTmFtZT17c3R5bGVzW1wiaWNvblwiXX0+XHJcbiAgICAgICAge3Byb3BzLmljb259XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzW1widGV4dFwiXX0gcmVmPXt0ZXh0UmVmfT5cclxuICAgICAgICB7cHJvcHMudGV4dH1cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICApO1xyXG59XHJcblxyXG5mdW5jdGlvbiB1c2VTY3JvbGxUb0JvdHRvbShcclxuICBzY3JvbGxSZWY6IFJlZk9iamVjdDxIVE1MRGl2RWxlbWVudD4sXHJcbiAgZGV0YWNoOiBib29sZWFuID0gZmFsc2UsXHJcbiAgbWVzc2FnZXM6IENoYXRNZXNzYWdlW10sXHJcbikge1xyXG4gIC8vIGZvciBhdXRvLXNjcm9sbFxyXG4gIGNvbnN0IFthdXRvU2Nyb2xsLCBzZXRBdXRvU2Nyb2xsXSA9IHVzZVN0YXRlKHRydWUpO1xyXG4gIGNvbnN0IHNjcm9sbERvbVRvQm90dG9tID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgY29uc3QgZG9tID0gc2Nyb2xsUmVmLmN1cnJlbnQ7XHJcbiAgICBpZiAoZG9tKSB7XHJcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgc2V0QXV0b1Njcm9sbCh0cnVlKTtcclxuICAgICAgICBkb20uc2Nyb2xsVG8oMCwgZG9tLnNjcm9sbEhlaWdodCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH0sIFtzY3JvbGxSZWZdKTtcclxuXHJcbiAgLy8gYXV0byBzY3JvbGxcclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgaWYgKGF1dG9TY3JvbGwgJiYgIWRldGFjaCkge1xyXG4gICAgICBzY3JvbGxEb21Ub0JvdHRvbSgpO1xyXG4gICAgfVxyXG4gIH0pO1xyXG5cclxuICAvLyBhdXRvIHNjcm9sbCB3aGVuIG1lc3NhZ2VzIGxlbmd0aCBjaGFuZ2VzXHJcbiAgY29uc3QgbGFzdE1lc3NhZ2VzTGVuZ3RoID0gdXNlUmVmKG1lc3NhZ2VzLmxlbmd0aCk7XHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIGlmIChtZXNzYWdlcy5sZW5ndGggPiBsYXN0TWVzc2FnZXNMZW5ndGguY3VycmVudCAmJiAhZGV0YWNoKSB7XHJcbiAgICAgIHNjcm9sbERvbVRvQm90dG9tKCk7XHJcbiAgICB9XHJcbiAgICBsYXN0TWVzc2FnZXNMZW5ndGguY3VycmVudCA9IG1lc3NhZ2VzLmxlbmd0aDtcclxuICB9LCBbbWVzc2FnZXMubGVuZ3RoLCBkZXRhY2gsIHNjcm9sbERvbVRvQm90dG9tXSk7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBzY3JvbGxSZWYsXHJcbiAgICBhdXRvU2Nyb2xsLFxyXG4gICAgc2V0QXV0b1Njcm9sbCxcclxuICAgIHNjcm9sbERvbVRvQm90dG9tLFxyXG4gIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBDaGF0QWN0aW9ucyhwcm9wczoge1xyXG4gIHVwbG9hZEltYWdlOiAoKSA9PiB2b2lkO1xyXG4gIHNldEF0dGFjaEltYWdlczogKGltYWdlczogc3RyaW5nW10pID0+IHZvaWQ7XHJcbiAgc2V0VXBsb2FkaW5nOiAodXBsb2FkaW5nOiBib29sZWFuKSA9PiB2b2lkO1xyXG4gIHNob3dQcm9tcHRNb2RhbDogKCkgPT4gdm9pZDtcclxuICBzY3JvbGxUb0JvdHRvbTogKCkgPT4gdm9pZDtcclxuICBzaG93UHJvbXB0SGludHM6ICgpID0+IHZvaWQ7XHJcbiAgaGl0Qm90dG9tOiBib29sZWFuO1xyXG4gIHVwbG9hZGluZzogYm9vbGVhbjtcclxuICBzZXRTaG93U2hvcnRjdXRLZXlNb2RhbDogUmVhY3QuRGlzcGF0Y2g8UmVhY3QuU2V0U3RhdGVBY3Rpb248Ym9vbGVhbj4+O1xyXG4gIHNldFVzZXJJbnB1dDogKGlucHV0OiBzdHJpbmcpID0+IHZvaWQ7XHJcbiAgc2V0U2hvd0NoYXRTaWRlUGFuZWw6IFJlYWN0LkRpc3BhdGNoPFJlYWN0LlNldFN0YXRlQWN0aW9uPGJvb2xlYW4+PjtcclxufSkge1xyXG4gIGNvbnN0IGNvbmZpZyA9IHVzZUFwcENvbmZpZygpO1xyXG4gIGNvbnN0IG5hdmlnYXRlID0gdXNlTmF2aWdhdGUoKTtcclxuICBjb25zdCBjaGF0U3RvcmUgPSB1c2VDaGF0U3RvcmUoKTtcclxuICBjb25zdCBwbHVnaW5TdG9yZSA9IHVzZVBsdWdpblN0b3JlKCk7XHJcbiAgY29uc3Qgc2Vzc2lvbiA9IGNoYXRTdG9yZS5jdXJyZW50U2Vzc2lvbigpO1xyXG5cclxuICAvLyBzd2l0Y2ggdGhlbWVzXHJcbiAgY29uc3QgdGhlbWUgPSBjb25maWcudGhlbWU7XHJcblxyXG4gIGZ1bmN0aW9uIG5leHRUaGVtZSgpIHtcclxuICAgIGNvbnN0IHRoZW1lcyA9IFtUaGVtZS5BdXRvLCBUaGVtZS5MaWdodCwgVGhlbWUuRGFya107XHJcbiAgICBjb25zdCB0aGVtZUluZGV4ID0gdGhlbWVzLmluZGV4T2YodGhlbWUpO1xyXG4gICAgY29uc3QgbmV4dEluZGV4ID0gKHRoZW1lSW5kZXggKyAxKSAlIHRoZW1lcy5sZW5ndGg7XHJcbiAgICBjb25zdCBuZXh0VGhlbWUgPSB0aGVtZXNbbmV4dEluZGV4XTtcclxuICAgIGNvbmZpZy51cGRhdGUoKGNvbmZpZykgPT4gKGNvbmZpZy50aGVtZSA9IG5leHRUaGVtZSkpO1xyXG4gIH1cclxuXHJcbiAgLy8gc3RvcCBhbGwgcmVzcG9uc2VzXHJcbiAgY29uc3QgY291bGRTdG9wID0gQ2hhdENvbnRyb2xsZXJQb29sLmhhc1BlbmRpbmcoKTtcclxuICBjb25zdCBzdG9wQWxsID0gKCkgPT4gQ2hhdENvbnRyb2xsZXJQb29sLnN0b3BBbGwoKTtcclxuXHJcbiAgLy8gc3dpdGNoIG1vZGVsXHJcbiAgY29uc3QgY3VycmVudE1vZGVsID0gc2Vzc2lvbi5tYXNrLm1vZGVsQ29uZmlnLm1vZGVsO1xyXG4gIGNvbnN0IGN1cnJlbnRQcm92aWRlck5hbWUgPVxyXG4gICAgc2Vzc2lvbi5tYXNrLm1vZGVsQ29uZmlnPy5wcm92aWRlck5hbWUgfHwgU2VydmljZVByb3ZpZGVyLk9wZW5BSTtcclxuICBjb25zdCBhbGxNb2RlbHMgPSB1c2VBbGxNb2RlbHMoKTtcclxuICBjb25zdCBtb2RlbHMgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgIGNvbnN0IGZpbHRlcmVkTW9kZWxzID0gYWxsTW9kZWxzLmZpbHRlcigobSkgPT4gbS5hdmFpbGFibGUpO1xyXG4gICAgY29uc3QgZGVmYXVsdE1vZGVsID0gZmlsdGVyZWRNb2RlbHMuZmluZCgobSkgPT4gbS5pc0RlZmF1bHQpO1xyXG5cclxuICAgIGlmIChkZWZhdWx0TW9kZWwpIHtcclxuICAgICAgY29uc3QgYXJyID0gW1xyXG4gICAgICAgIGRlZmF1bHRNb2RlbCxcclxuICAgICAgICAuLi5maWx0ZXJlZE1vZGVscy5maWx0ZXIoKG0pID0+IG0gIT09IGRlZmF1bHRNb2RlbCksXHJcbiAgICAgIF07XHJcbiAgICAgIHJldHVybiBhcnI7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gZmlsdGVyZWRNb2RlbHM7XHJcbiAgICB9XHJcbiAgfSwgW2FsbE1vZGVsc10pO1xyXG4gIGNvbnN0IGN1cnJlbnRNb2RlbE5hbWUgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgIGNvbnN0IG1vZGVsID0gbW9kZWxzLmZpbmQoXHJcbiAgICAgIChtKSA9PlxyXG4gICAgICAgIG0ubmFtZSA9PSBjdXJyZW50TW9kZWwgJiZcclxuICAgICAgICBtPy5wcm92aWRlcj8ucHJvdmlkZXJOYW1lID09IGN1cnJlbnRQcm92aWRlck5hbWUsXHJcbiAgICApO1xyXG4gICAgcmV0dXJuIG1vZGVsPy5kaXNwbGF5TmFtZSA/PyBcIlwiO1xyXG4gIH0sIFttb2RlbHMsIGN1cnJlbnRNb2RlbCwgY3VycmVudFByb3ZpZGVyTmFtZV0pO1xyXG4gIGNvbnN0IFtzaG93TW9kZWxTZWxlY3Rvciwgc2V0U2hvd01vZGVsU2VsZWN0b3JdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFtzaG93UGx1Z2luU2VsZWN0b3IsIHNldFNob3dQbHVnaW5TZWxlY3Rvcl0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW3Nob3dVcGxvYWRJbWFnZSwgc2V0U2hvd1VwbG9hZEltYWdlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuXHJcbiAgY29uc3QgW3Nob3dTaXplU2VsZWN0b3IsIHNldFNob3dTaXplU2VsZWN0b3JdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFtzaG93UXVhbGl0eVNlbGVjdG9yLCBzZXRTaG93UXVhbGl0eVNlbGVjdG9yXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBbc2hvd1N0eWxlU2VsZWN0b3IsIHNldFNob3dTdHlsZVNlbGVjdG9yXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBtb2RlbFNpemVzID0gZ2V0TW9kZWxTaXplcyhjdXJyZW50TW9kZWwpO1xyXG4gIGNvbnN0IGRhbGxlM1F1YWxpdHlzOiBEYWxsZVF1YWxpdHlbXSA9IFtcInN0YW5kYXJkXCIsIFwiaGRcIl07XHJcbiAgY29uc3QgZGFsbGUzU3R5bGVzOiBEYWxsZVN0eWxlW10gPSBbXCJ2aXZpZFwiLCBcIm5hdHVyYWxcIl07XHJcbiAgY29uc3QgY3VycmVudFNpemUgPVxyXG4gICAgc2Vzc2lvbi5tYXNrLm1vZGVsQ29uZmlnPy5zaXplID8/IChcIjEwMjR4MTAyNFwiIGFzIE1vZGVsU2l6ZSk7XHJcbiAgY29uc3QgY3VycmVudFF1YWxpdHkgPSBzZXNzaW9uLm1hc2subW9kZWxDb25maWc/LnF1YWxpdHkgPz8gXCJzdGFuZGFyZFwiO1xyXG4gIGNvbnN0IGN1cnJlbnRTdHlsZSA9IHNlc3Npb24ubWFzay5tb2RlbENvbmZpZz8uc3R5bGUgPz8gXCJ2aXZpZFwiO1xyXG5cclxuICBjb25zdCBpc01vYmlsZVNjcmVlbiA9IHVzZU1vYmlsZVNjcmVlbigpO1xyXG5cclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgY29uc3Qgc2hvdyA9IGlzVmlzaW9uTW9kZWwoY3VycmVudE1vZGVsKTtcclxuICAgIHNldFNob3dVcGxvYWRJbWFnZShzaG93KTtcclxuICAgIGlmICghc2hvdykge1xyXG4gICAgICBwcm9wcy5zZXRBdHRhY2hJbWFnZXMoW10pO1xyXG4gICAgICBwcm9wcy5zZXRVcGxvYWRpbmcoZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGlmIGN1cnJlbnQgbW9kZWwgaXMgbm90IGF2YWlsYWJsZVxyXG4gICAgLy8gc3dpdGNoIHRvIGZpcnN0IGF2YWlsYWJsZSBtb2RlbFxyXG4gICAgY29uc3QgaXNVbmF2YWlsYWJsZU1vZGVsID0gIW1vZGVscy5zb21lKChtKSA9PiBtLm5hbWUgPT09IGN1cnJlbnRNb2RlbCk7XHJcbiAgICBpZiAoaXNVbmF2YWlsYWJsZU1vZGVsICYmIG1vZGVscy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIC8vIHNob3cgbmV4dCBtb2RlbCB0byBkZWZhdWx0IG1vZGVsIGlmIGV4aXN0XHJcbiAgICAgIGxldCBuZXh0TW9kZWwgPSBtb2RlbHMuZmluZCgobW9kZWwpID0+IG1vZGVsLmlzRGVmYXVsdCkgfHwgbW9kZWxzWzBdO1xyXG4gICAgICBjaGF0U3RvcmUudXBkYXRlVGFyZ2V0U2Vzc2lvbihzZXNzaW9uLCAoc2Vzc2lvbikgPT4ge1xyXG4gICAgICAgIHNlc3Npb24ubWFzay5tb2RlbENvbmZpZy5tb2RlbCA9IG5leHRNb2RlbC5uYW1lO1xyXG4gICAgICAgIHNlc3Npb24ubWFzay5tb2RlbENvbmZpZy5wcm92aWRlck5hbWUgPSBuZXh0TW9kZWw/LnByb3ZpZGVyXHJcbiAgICAgICAgICA/LnByb3ZpZGVyTmFtZSBhcyBTZXJ2aWNlUHJvdmlkZXI7XHJcbiAgICAgIH0pO1xyXG4gICAgICBzaG93VG9hc3QoXHJcbiAgICAgICAgbmV4dE1vZGVsPy5wcm92aWRlcj8ucHJvdmlkZXJOYW1lID09IFwiQnl0ZURhbmNlXCJcclxuICAgICAgICAgID8gbmV4dE1vZGVsLmRpc3BsYXlOYW1lXHJcbiAgICAgICAgICA6IG5leHRNb2RlbC5uYW1lLFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH0sIFtjaGF0U3RvcmUsIGN1cnJlbnRNb2RlbCwgbW9kZWxzLCBzZXNzaW9uXSk7XHJcblxyXG4gIHJldHVybiAoXHJcbiAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzW1wiY2hhdC1pbnB1dC1hY3Rpb25zXCJdfT5cclxuICAgICAgPD5cclxuICAgICAgICB7Y291bGRTdG9wICYmIChcclxuICAgICAgICAgIDxDaGF0QWN0aW9uXHJcbiAgICAgICAgICAgIG9uQ2xpY2s9e3N0b3BBbGx9XHJcbiAgICAgICAgICAgIHRleHQ9e0xvY2FsZS5DaGF0LklucHV0QWN0aW9ucy5TdG9wfVxyXG4gICAgICAgICAgICBpY29uPXs8U3RvcEljb24gLz59XHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgICl9XHJcbiAgICAgICAgeyFwcm9wcy5oaXRCb3R0b20gJiYgKFxyXG4gICAgICAgICAgPENoYXRBY3Rpb25cclxuICAgICAgICAgICAgb25DbGljaz17cHJvcHMuc2Nyb2xsVG9Cb3R0b219XHJcbiAgICAgICAgICAgIHRleHQ9e0xvY2FsZS5DaGF0LklucHV0QWN0aW9ucy5Ub0JvdHRvbX1cclxuICAgICAgICAgICAgaWNvbj17PEJvdHRvbUljb24gLz59XHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgICl9XHJcbiAgICAgICAge3Byb3BzLmhpdEJvdHRvbSAmJiAoXHJcbiAgICAgICAgICA8Q2hhdEFjdGlvblxyXG4gICAgICAgICAgICBvbkNsaWNrPXtwcm9wcy5zaG93UHJvbXB0TW9kYWx9XHJcbiAgICAgICAgICAgIHRleHQ9e0xvY2FsZS5DaGF0LklucHV0QWN0aW9ucy5TZXR0aW5nc31cclxuICAgICAgICAgICAgaWNvbj17PFNldHRpbmdzSWNvbiAvPn1cclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgKX1cclxuXHJcbiAgICAgICAge3Nob3dVcGxvYWRJbWFnZSAmJiAoXHJcbiAgICAgICAgICA8Q2hhdEFjdGlvblxyXG4gICAgICAgICAgICBvbkNsaWNrPXtwcm9wcy51cGxvYWRJbWFnZX1cclxuICAgICAgICAgICAgdGV4dD17TG9jYWxlLkNoYXQuSW5wdXRBY3Rpb25zLlVwbG9hZEltYWdlfVxyXG4gICAgICAgICAgICBpY29uPXtwcm9wcy51cGxvYWRpbmcgPyA8TG9hZGluZ0J1dHRvbkljb24gLz4gOiA8SW1hZ2VJY29uIC8+fVxyXG4gICAgICAgICAgLz5cclxuICAgICAgICApfVxyXG4gICAgICAgIDxDaGF0QWN0aW9uXHJcbiAgICAgICAgICBvbkNsaWNrPXtuZXh0VGhlbWV9XHJcbiAgICAgICAgICB0ZXh0PXtMb2NhbGUuQ2hhdC5JbnB1dEFjdGlvbnMuVGhlbWVbdGhlbWVdfVxyXG4gICAgICAgICAgaWNvbj17XHJcbiAgICAgICAgICAgIDw+XHJcbiAgICAgICAgICAgICAge3RoZW1lID09PSBUaGVtZS5BdXRvID8gKFxyXG4gICAgICAgICAgICAgICAgPEF1dG9JY29uIC8+XHJcbiAgICAgICAgICAgICAgKSA6IHRoZW1lID09PSBUaGVtZS5MaWdodCA/IChcclxuICAgICAgICAgICAgICAgIDxMaWdodEljb24gLz5cclxuICAgICAgICAgICAgICApIDogdGhlbWUgPT09IFRoZW1lLkRhcmsgPyAoXHJcbiAgICAgICAgICAgICAgICA8RGFya0ljb24gLz5cclxuICAgICAgICAgICAgICApIDogbnVsbH1cclxuICAgICAgICAgICAgPC8+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgLz5cclxuXHJcbiAgICAgICAgPENoYXRBY3Rpb25cclxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgbmF2aWdhdGUoUGF0aC5NYXNrcyk7XHJcbiAgICAgICAgICB9fVxyXG4gICAgICAgICAgdGV4dD17TG9jYWxlLkNoYXQuSW5wdXRBY3Rpb25zLk1hc2tzfVxyXG4gICAgICAgICAgaWNvbj17PE1hc2tJY29uIC8+fVxyXG4gICAgICAgIC8+XHJcblxyXG4gICAgICAgIDxDaGF0QWN0aW9uXHJcbiAgICAgICAgICB0ZXh0PXtMb2NhbGUuQ2hhdC5JbnB1dEFjdGlvbnMuQ2xlYXJ9XHJcbiAgICAgICAgICBpY29uPXs8QnJlYWtJY29uIC8+fVxyXG4gICAgICAgICAgb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICBjaGF0U3RvcmUudXBkYXRlVGFyZ2V0U2Vzc2lvbihzZXNzaW9uLCAoc2Vzc2lvbikgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChzZXNzaW9uLmNsZWFyQ29udGV4dEluZGV4ID09PSBzZXNzaW9uLm1lc3NhZ2VzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgc2Vzc2lvbi5jbGVhckNvbnRleHRJbmRleCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc2Vzc2lvbi5jbGVhckNvbnRleHRJbmRleCA9IHNlc3Npb24ubWVzc2FnZXMubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgc2Vzc2lvbi5tZW1vcnlQcm9tcHQgPSBcIlwiOyAvLyB3aWxsIGNsZWFyIG1lbW9yeVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9fVxyXG4gICAgICAgIC8+XHJcblxyXG4gICAgICAgIDxDaGF0QWN0aW9uXHJcbiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRTaG93TW9kZWxTZWxlY3Rvcih0cnVlKX1cclxuICAgICAgICAgIHRleHQ9e2N1cnJlbnRNb2RlbE5hbWV9XHJcbiAgICAgICAgICBpY29uPXs8Um9ib3RJY29uIC8+fVxyXG4gICAgICAgIC8+XHJcblxyXG4gICAgICAgIHtzaG93TW9kZWxTZWxlY3RvciAmJiAoXHJcbiAgICAgICAgICA8U2VsZWN0b3JcclxuICAgICAgICAgICAgZGVmYXVsdFNlbGVjdGVkVmFsdWU9e2Ake2N1cnJlbnRNb2RlbH1AJHtjdXJyZW50UHJvdmlkZXJOYW1lfWB9XHJcbiAgICAgICAgICAgIGl0ZW1zPXttb2RlbHMubWFwKChtKSA9PiAoe1xyXG4gICAgICAgICAgICAgIHRpdGxlOiBgJHttLmRpc3BsYXlOYW1lfSR7XHJcbiAgICAgICAgICAgICAgICBtPy5wcm92aWRlcj8ucHJvdmlkZXJOYW1lXHJcbiAgICAgICAgICAgICAgICAgID8gXCIgKFwiICsgbT8ucHJvdmlkZXI/LnByb3ZpZGVyTmFtZSArIFwiKVwiXHJcbiAgICAgICAgICAgICAgICAgIDogXCJcIlxyXG4gICAgICAgICAgICAgIH1gLFxyXG4gICAgICAgICAgICAgIHZhbHVlOiBgJHttLm5hbWV9QCR7bT8ucHJvdmlkZXI/LnByb3ZpZGVyTmFtZX1gLFxyXG4gICAgICAgICAgICB9KSl9XHJcbiAgICAgICAgICAgIG9uQ2xvc2U9eygpID0+IHNldFNob3dNb2RlbFNlbGVjdG9yKGZhbHNlKX1cclxuICAgICAgICAgICAgb25TZWxlY3Rpb249eyhzKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKHMubGVuZ3RoID09PSAwKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgY29uc3QgW21vZGVsLCBwcm92aWRlck5hbWVdID0gZ2V0TW9kZWxQcm92aWRlcihzWzBdKTtcclxuICAgICAgICAgICAgICBjaGF0U3RvcmUudXBkYXRlVGFyZ2V0U2Vzc2lvbihzZXNzaW9uLCAoc2Vzc2lvbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgc2Vzc2lvbi5tYXNrLm1vZGVsQ29uZmlnLm1vZGVsID0gbW9kZWwgYXMgTW9kZWxUeXBlO1xyXG4gICAgICAgICAgICAgICAgc2Vzc2lvbi5tYXNrLm1vZGVsQ29uZmlnLnByb3ZpZGVyTmFtZSA9XHJcbiAgICAgICAgICAgICAgICAgIHByb3ZpZGVyTmFtZSBhcyBTZXJ2aWNlUHJvdmlkZXI7XHJcbiAgICAgICAgICAgICAgICBzZXNzaW9uLm1hc2suc3luY0dsb2JhbENvbmZpZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIGlmIChwcm92aWRlck5hbWUgPT0gXCJCeXRlRGFuY2VcIikge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRNb2RlbCA9IG1vZGVscy5maW5kKFxyXG4gICAgICAgICAgICAgICAgICAobSkgPT5cclxuICAgICAgICAgICAgICAgICAgICBtLm5hbWUgPT0gbW9kZWwgJiZcclxuICAgICAgICAgICAgICAgICAgICBtPy5wcm92aWRlcj8ucHJvdmlkZXJOYW1lID09IHByb3ZpZGVyTmFtZSxcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICBzaG93VG9hc3Qoc2VsZWN0ZWRNb2RlbD8uZGlzcGxheU5hbWUgPz8gXCJcIik7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNob3dUb2FzdChtb2RlbCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9fVxyXG4gICAgICAgICAgLz5cclxuICAgICAgICApfVxyXG5cclxuICAgICAgICB7c3VwcG9ydHNDdXN0b21TaXplKGN1cnJlbnRNb2RlbCkgJiYgKFxyXG4gICAgICAgICAgPENoYXRBY3Rpb25cclxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0U2hvd1NpemVTZWxlY3Rvcih0cnVlKX1cclxuICAgICAgICAgICAgdGV4dD17Y3VycmVudFNpemV9XHJcbiAgICAgICAgICAgIGljb249ezxTaXplSWNvbiAvPn1cclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgKX1cclxuXHJcbiAgICAgICAge3Nob3dTaXplU2VsZWN0b3IgJiYgKFxyXG4gICAgICAgICAgPFNlbGVjdG9yXHJcbiAgICAgICAgICAgIGRlZmF1bHRTZWxlY3RlZFZhbHVlPXtjdXJyZW50U2l6ZX1cclxuICAgICAgICAgICAgaXRlbXM9e21vZGVsU2l6ZXMubWFwKChtKSA9PiAoe1xyXG4gICAgICAgICAgICAgIHRpdGxlOiBtLFxyXG4gICAgICAgICAgICAgIHZhbHVlOiBtLFxyXG4gICAgICAgICAgICB9KSl9XHJcbiAgICAgICAgICAgIG9uQ2xvc2U9eygpID0+IHNldFNob3dTaXplU2VsZWN0b3IoZmFsc2UpfVxyXG4gICAgICAgICAgICBvblNlbGVjdGlvbj17KHMpID0+IHtcclxuICAgICAgICAgICAgICBpZiAocy5sZW5ndGggPT09IDApIHJldHVybjtcclxuICAgICAgICAgICAgICBjb25zdCBzaXplID0gc1swXTtcclxuICAgICAgICAgICAgICBjaGF0U3RvcmUudXBkYXRlVGFyZ2V0U2Vzc2lvbihzZXNzaW9uLCAoc2Vzc2lvbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgc2Vzc2lvbi5tYXNrLm1vZGVsQ29uZmlnLnNpemUgPSBzaXplO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIHNob3dUb2FzdChzaXplKTtcclxuICAgICAgICAgICAgfX1cclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgKX1cclxuXHJcbiAgICAgICAge2lzRGFsbGUzKGN1cnJlbnRNb2RlbCkgJiYgKFxyXG4gICAgICAgICAgPENoYXRBY3Rpb25cclxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0U2hvd1F1YWxpdHlTZWxlY3Rvcih0cnVlKX1cclxuICAgICAgICAgICAgdGV4dD17Y3VycmVudFF1YWxpdHl9XHJcbiAgICAgICAgICAgIGljb249ezxRdWFsaXR5SWNvbiAvPn1cclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgKX1cclxuXHJcbiAgICAgICAge3Nob3dRdWFsaXR5U2VsZWN0b3IgJiYgKFxyXG4gICAgICAgICAgPFNlbGVjdG9yXHJcbiAgICAgICAgICAgIGRlZmF1bHRTZWxlY3RlZFZhbHVlPXtjdXJyZW50UXVhbGl0eX1cclxuICAgICAgICAgICAgaXRlbXM9e2RhbGxlM1F1YWxpdHlzLm1hcCgobSkgPT4gKHtcclxuICAgICAgICAgICAgICB0aXRsZTogbSxcclxuICAgICAgICAgICAgICB2YWx1ZTogbSxcclxuICAgICAgICAgICAgfSkpfVxyXG4gICAgICAgICAgICBvbkNsb3NlPXsoKSA9PiBzZXRTaG93UXVhbGl0eVNlbGVjdG9yKGZhbHNlKX1cclxuICAgICAgICAgICAgb25TZWxlY3Rpb249eyhxKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKHEubGVuZ3RoID09PSAwKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgY29uc3QgcXVhbGl0eSA9IHFbMF07XHJcbiAgICAgICAgICAgICAgY2hhdFN0b3JlLnVwZGF0ZVRhcmdldFNlc3Npb24oc2Vzc2lvbiwgKHNlc3Npb24pID0+IHtcclxuICAgICAgICAgICAgICAgIHNlc3Npb24ubWFzay5tb2RlbENvbmZpZy5xdWFsaXR5ID0gcXVhbGl0eTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICBzaG93VG9hc3QocXVhbGl0eSk7XHJcbiAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgICl9XHJcblxyXG4gICAgICAgIHtpc0RhbGxlMyhjdXJyZW50TW9kZWwpICYmIChcclxuICAgICAgICAgIDxDaGF0QWN0aW9uXHJcbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldFNob3dTdHlsZVNlbGVjdG9yKHRydWUpfVxyXG4gICAgICAgICAgICB0ZXh0PXtjdXJyZW50U3R5bGV9XHJcbiAgICAgICAgICAgIGljb249ezxTdHlsZUljb24gLz59XHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgICl9XHJcblxyXG4gICAgICAgIHtzaG93U3R5bGVTZWxlY3RvciAmJiAoXHJcbiAgICAgICAgICA8U2VsZWN0b3JcclxuICAgICAgICAgICAgZGVmYXVsdFNlbGVjdGVkVmFsdWU9e2N1cnJlbnRTdHlsZX1cclxuICAgICAgICAgICAgaXRlbXM9e2RhbGxlM1N0eWxlcy5tYXAoKG0pID0+ICh7XHJcbiAgICAgICAgICAgICAgdGl0bGU6IG0sXHJcbiAgICAgICAgICAgICAgdmFsdWU6IG0sXHJcbiAgICAgICAgICAgIH0pKX1cclxuICAgICAgICAgICAgb25DbG9zZT17KCkgPT4gc2V0U2hvd1N0eWxlU2VsZWN0b3IoZmFsc2UpfVxyXG4gICAgICAgICAgICBvblNlbGVjdGlvbj17KHMpID0+IHtcclxuICAgICAgICAgICAgICBpZiAocy5sZW5ndGggPT09IDApIHJldHVybjtcclxuICAgICAgICAgICAgICBjb25zdCBzdHlsZSA9IHNbMF07XHJcbiAgICAgICAgICAgICAgY2hhdFN0b3JlLnVwZGF0ZVRhcmdldFNlc3Npb24oc2Vzc2lvbiwgKHNlc3Npb24pID0+IHtcclxuICAgICAgICAgICAgICAgIHNlc3Npb24ubWFzay5tb2RlbENvbmZpZy5zdHlsZSA9IHN0eWxlO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIHNob3dUb2FzdChzdHlsZSk7XHJcbiAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgICl9XHJcblxyXG4gICAgICAgIHtzaG93UGx1Z2lucyhjdXJyZW50UHJvdmlkZXJOYW1lLCBjdXJyZW50TW9kZWwpICYmIChcclxuICAgICAgICAgIDxDaGF0QWN0aW9uXHJcbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICBpZiAocGx1Z2luU3RvcmUuZ2V0QWxsKCkubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgICAgIG5hdmlnYXRlKFBhdGguUGx1Z2lucyk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNldFNob3dQbHVnaW5TZWxlY3Rvcih0cnVlKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgIHRleHQ9e0xvY2FsZS5QbHVnaW4uTmFtZX1cclxuICAgICAgICAgICAgaWNvbj17PFBsdWdpbkljb24gLz59XHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgICl9XHJcbiAgICAgICAge3Nob3dQbHVnaW5TZWxlY3RvciAmJiAoXHJcbiAgICAgICAgICA8U2VsZWN0b3JcclxuICAgICAgICAgICAgbXVsdGlwbGVcclxuICAgICAgICAgICAgZGVmYXVsdFNlbGVjdGVkVmFsdWU9e2NoYXRTdG9yZS5jdXJyZW50U2Vzc2lvbigpLm1hc2s/LnBsdWdpbn1cclxuICAgICAgICAgICAgaXRlbXM9e3BsdWdpblN0b3JlLmdldEFsbCgpLm1hcCgoaXRlbSkgPT4gKHtcclxuICAgICAgICAgICAgICB0aXRsZTogYCR7aXRlbT8udGl0bGV9QCR7aXRlbT8udmVyc2lvbn1gLFxyXG4gICAgICAgICAgICAgIHZhbHVlOiBpdGVtPy5pZCxcclxuICAgICAgICAgICAgfSkpfVxyXG4gICAgICAgICAgICBvbkNsb3NlPXsoKSA9PiBzZXRTaG93UGx1Z2luU2VsZWN0b3IoZmFsc2UpfVxyXG4gICAgICAgICAgICBvblNlbGVjdGlvbj17KHMpID0+IHtcclxuICAgICAgICAgICAgICBjaGF0U3RvcmUudXBkYXRlVGFyZ2V0U2Vzc2lvbihzZXNzaW9uLCAoc2Vzc2lvbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgc2Vzc2lvbi5tYXNrLnBsdWdpbiA9IHMgYXMgc3RyaW5nW107XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgICl9XHJcblxyXG4gICAgICAgIHshaXNNb2JpbGVTY3JlZW4gJiYgKFxyXG4gICAgICAgICAgPENoYXRBY3Rpb25cclxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gcHJvcHMuc2V0U2hvd1Nob3J0Y3V0S2V5TW9kYWwodHJ1ZSl9XHJcbiAgICAgICAgICAgIHRleHQ9e0xvY2FsZS5DaGF0LlNob3J0Y3V0S2V5LlRpdGxlfVxyXG4gICAgICAgICAgICBpY29uPXs8U2hvcnRjdXRrZXlJY29uIC8+fVxyXG4gICAgICAgICAgLz5cclxuICAgICAgICApfVxyXG4gICAgICAgIHshaXNNb2JpbGVTY3JlZW4gJiYgPE1DUEFjdGlvbiAvPn1cclxuICAgICAgPC8+XHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXNbXCJjaGF0LWlucHV0LWFjdGlvbnMtZW5kXCJdfT5cclxuICAgICAgICB7Y29uZmlnLnJlYWx0aW1lQ29uZmlnLmVuYWJsZSAmJiAoXHJcbiAgICAgICAgICA8Q2hhdEFjdGlvblxyXG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBwcm9wcy5zZXRTaG93Q2hhdFNpZGVQYW5lbCh0cnVlKX1cclxuICAgICAgICAgICAgdGV4dD17XCJSZWFsdGltZSBDaGF0XCJ9XHJcbiAgICAgICAgICAgIGljb249ezxIZWFkcGhvbmVJY29uIC8+fVxyXG4gICAgICAgICAgLz5cclxuICAgICAgICApfVxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBFZGl0TWVzc2FnZU1vZGFsKHByb3BzOiB7IG9uQ2xvc2U6ICgpID0+IHZvaWQgfSkge1xyXG4gIGNvbnN0IGNoYXRTdG9yZSA9IHVzZUNoYXRTdG9yZSgpO1xyXG4gIGNvbnN0IHNlc3Npb24gPSBjaGF0U3RvcmUuY3VycmVudFNlc3Npb24oKTtcclxuICBjb25zdCBbbWVzc2FnZXMsIHNldE1lc3NhZ2VzXSA9IHVzZVN0YXRlKHNlc3Npb24ubWVzc2FnZXMuc2xpY2UoKSk7XHJcblxyXG4gIHJldHVybiAoXHJcbiAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLW1hc2tcIj5cclxuICAgICAgPE1vZGFsXHJcbiAgICAgICAgdGl0bGU9e0xvY2FsZS5DaGF0LkVkaXRNZXNzYWdlLlRpdGxlfVxyXG4gICAgICAgIG9uQ2xvc2U9e3Byb3BzLm9uQ2xvc2V9XHJcbiAgICAgICAgYWN0aW9ucz17W1xyXG4gICAgICAgICAgPEljb25CdXR0b25cclxuICAgICAgICAgICAgdGV4dD17TG9jYWxlLlVJLkNhbmNlbH1cclxuICAgICAgICAgICAgaWNvbj17PENhbmNlbEljb24gLz59XHJcbiAgICAgICAgICAgIGtleT1cImNhbmNlbFwiXHJcbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICBwcm9wcy5vbkNsb3NlKCk7XHJcbiAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAvPixcclxuICAgICAgICAgIDxJY29uQnV0dG9uXHJcbiAgICAgICAgICAgIHR5cGU9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgdGV4dD17TG9jYWxlLlVJLkNvbmZpcm19XHJcbiAgICAgICAgICAgIGljb249ezxDb25maXJtSWNvbiAvPn1cclxuICAgICAgICAgICAga2V5PVwib2tcIlxyXG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgY2hhdFN0b3JlLnVwZGF0ZVRhcmdldFNlc3Npb24oXHJcbiAgICAgICAgICAgICAgICBzZXNzaW9uLFxyXG4gICAgICAgICAgICAgICAgKHNlc3Npb24pID0+IChzZXNzaW9uLm1lc3NhZ2VzID0gbWVzc2FnZXMpLFxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgcHJvcHMub25DbG9zZSgpO1xyXG4gICAgICAgICAgICB9fVxyXG4gICAgICAgICAgLz4sXHJcbiAgICAgICAgXX1cclxuICAgICAgPlxyXG4gICAgICAgIDxMaXN0PlxyXG4gICAgICAgICAgPExpc3RJdGVtXHJcbiAgICAgICAgICAgIHRpdGxlPXtMb2NhbGUuQ2hhdC5FZGl0TWVzc2FnZS5Ub3BpYy5UaXRsZX1cclxuICAgICAgICAgICAgc3ViVGl0bGU9e0xvY2FsZS5DaGF0LkVkaXRNZXNzYWdlLlRvcGljLlN1YlRpdGxlfVxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgdmFsdWU9e3Nlc3Npb24udG9waWN9XHJcbiAgICAgICAgICAgICAgb25JbnB1dD17KGUpID0+XHJcbiAgICAgICAgICAgICAgICBjaGF0U3RvcmUudXBkYXRlVGFyZ2V0U2Vzc2lvbihcclxuICAgICAgICAgICAgICAgICAgc2Vzc2lvbixcclxuICAgICAgICAgICAgICAgICAgKHNlc3Npb24pID0+IChzZXNzaW9uLnRvcGljID0gZS5jdXJyZW50VGFyZ2V0LnZhbHVlKSxcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgID48L2lucHV0PlxyXG4gICAgICAgICAgPC9MaXN0SXRlbT5cclxuICAgICAgICA8L0xpc3Q+XHJcbiAgICAgICAgPENvbnRleHRQcm9tcHRzXHJcbiAgICAgICAgICBjb250ZXh0PXttZXNzYWdlc31cclxuICAgICAgICAgIHVwZGF0ZUNvbnRleHQ9eyh1cGRhdGVyKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld01lc3NhZ2VzID0gbWVzc2FnZXMuc2xpY2UoKTtcclxuICAgICAgICAgICAgdXBkYXRlcihuZXdNZXNzYWdlcyk7XHJcbiAgICAgICAgICAgIHNldE1lc3NhZ2VzKG5ld01lc3NhZ2VzKTtcclxuICAgICAgICAgIH19XHJcbiAgICAgICAgLz5cclxuICAgICAgPC9Nb2RhbD5cclxuICAgIDwvZGl2PlxyXG4gICk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBEZWxldGVJbWFnZUJ1dHRvbihwcm9wczogeyBkZWxldGVJbWFnZTogKCkgPT4gdm9pZCB9KSB7XHJcbiAgcmV0dXJuIChcclxuICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXNbXCJkZWxldGUtaW1hZ2VcIl19IG9uQ2xpY2s9e3Byb3BzLmRlbGV0ZUltYWdlfT5cclxuICAgICAgPERlbGV0ZUljb24gLz5cclxuICAgIDwvZGl2PlxyXG4gICk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBTaG9ydGN1dEtleU1vZGFsKHByb3BzOiB7IG9uQ2xvc2U6ICgpID0+IHZvaWQgfSkge1xyXG4gIGNvbnN0IGlzTWFjID0gbmF2aWdhdG9yLnBsYXRmb3JtLnRvVXBwZXJDYXNlKCkuaW5kZXhPZihcIk1BQ1wiKSA+PSAwO1xyXG4gIGNvbnN0IHNob3J0Y3V0cyA9IFtcclxuICAgIHtcclxuICAgICAgdGl0bGU6IExvY2FsZS5DaGF0LlNob3J0Y3V0S2V5Lm5ld0NoYXQsXHJcbiAgICAgIGtleXM6IGlzTWFjID8gW1wi4oyYXCIsIFwiU2hpZnRcIiwgXCJPXCJdIDogW1wiQ3RybFwiLCBcIlNoaWZ0XCIsIFwiT1wiXSxcclxuICAgIH0sXHJcbiAgICB7IHRpdGxlOiBMb2NhbGUuQ2hhdC5TaG9ydGN1dEtleS5mb2N1c0lucHV0LCBrZXlzOiBbXCJTaGlmdFwiLCBcIkVzY1wiXSB9LFxyXG4gICAge1xyXG4gICAgICB0aXRsZTogTG9jYWxlLkNoYXQuU2hvcnRjdXRLZXkuY29weUxhc3RDb2RlLFxyXG4gICAgICBrZXlzOiBpc01hYyA/IFtcIuKMmFwiLCBcIlNoaWZ0XCIsIFwiO1wiXSA6IFtcIkN0cmxcIiwgXCJTaGlmdFwiLCBcIjtcIl0sXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0aXRsZTogTG9jYWxlLkNoYXQuU2hvcnRjdXRLZXkuY29weUxhc3RNZXNzYWdlLFxyXG4gICAgICBrZXlzOiBpc01hYyA/IFtcIuKMmFwiLCBcIlNoaWZ0XCIsIFwiQ1wiXSA6IFtcIkN0cmxcIiwgXCJTaGlmdFwiLCBcIkNcIl0sXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0aXRsZTogTG9jYWxlLkNoYXQuU2hvcnRjdXRLZXkuc2hvd1Nob3J0Y3V0S2V5LFxyXG4gICAgICBrZXlzOiBpc01hYyA/IFtcIuKMmFwiLCBcIi9cIl0gOiBbXCJDdHJsXCIsIFwiL1wiXSxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHRpdGxlOiBMb2NhbGUuQ2hhdC5TaG9ydGN1dEtleS5jbGVhckNvbnRleHQsXHJcbiAgICAgIGtleXM6IGlzTWFjXHJcbiAgICAgICAgPyBbXCLijJhcIiwgXCJTaGlmdFwiLCBcImJhY2tzcGFjZVwiXVxyXG4gICAgICAgIDogW1wiQ3RybFwiLCBcIlNoaWZ0XCIsIFwiYmFja3NwYWNlXCJdLFxyXG4gICAgfSxcclxuICBdO1xyXG4gIHJldHVybiAoXHJcbiAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLW1hc2tcIj5cclxuICAgICAgPE1vZGFsXHJcbiAgICAgICAgdGl0bGU9e0xvY2FsZS5DaGF0LlNob3J0Y3V0S2V5LlRpdGxlfVxyXG4gICAgICAgIG9uQ2xvc2U9e3Byb3BzLm9uQ2xvc2V9XHJcbiAgICAgICAgYWN0aW9ucz17W1xyXG4gICAgICAgICAgPEljb25CdXR0b25cclxuICAgICAgICAgICAgdHlwZT1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICB0ZXh0PXtMb2NhbGUuVUkuQ29uZmlybX1cclxuICAgICAgICAgICAgaWNvbj17PENvbmZpcm1JY29uIC8+fVxyXG4gICAgICAgICAgICBrZXk9XCJva1wiXHJcbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICBwcm9wcy5vbkNsb3NlKCk7XHJcbiAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAvPixcclxuICAgICAgICBdfVxyXG4gICAgICA+XHJcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlc1tcInNob3J0Y3V0LWtleS1jb250YWluZXJcIl19PlxyXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlc1tcInNob3J0Y3V0LWtleS1ncmlkXCJdfT5cclxuICAgICAgICAgICAge3Nob3J0Y3V0cy5tYXAoKHNob3J0Y3V0LCBpbmRleCkgPT4gKFxyXG4gICAgICAgICAgICAgIDxkaXYga2V5PXtpbmRleH0gY2xhc3NOYW1lPXtzdHlsZXNbXCJzaG9ydGN1dC1rZXktaXRlbVwiXX0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzW1wic2hvcnRjdXQta2V5LXRpdGxlXCJdfT5cclxuICAgICAgICAgICAgICAgICAge3Nob3J0Y3V0LnRpdGxlfVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzW1wic2hvcnRjdXQta2V5LWtleXNcIl19PlxyXG4gICAgICAgICAgICAgICAgICB7c2hvcnRjdXQua2V5cy5tYXAoKGtleSwgaSkgPT4gKFxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYga2V5PXtpfSBjbGFzc05hbWU9e3N0eWxlc1tcInNob3J0Y3V0LWtleVwiXX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57a2V5fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgKSl9XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgKSl9XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9Nb2RhbD5cclxuICAgIDwvZGl2PlxyXG4gICk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIF9DaGF0KCkge1xyXG4gIHR5cGUgUmVuZGVyTWVzc2FnZSA9IENoYXRNZXNzYWdlICYgeyBwcmV2aWV3PzogYm9vbGVhbiB9O1xyXG5cclxuICBjb25zdCBjaGF0U3RvcmUgPSB1c2VDaGF0U3RvcmUoKTtcclxuICBjb25zdCBzZXNzaW9uID0gY2hhdFN0b3JlLmN1cnJlbnRTZXNzaW9uKCk7XHJcbiAgY29uc3QgY29uZmlnID0gdXNlQXBwQ29uZmlnKCk7XHJcbiAgY29uc3QgZm9udFNpemUgPSBjb25maWcuZm9udFNpemU7XHJcbiAgY29uc3QgZm9udEZhbWlseSA9IGNvbmZpZy5mb250RmFtaWx5O1xyXG5cclxuICBjb25zdCBbc2hvd0V4cG9ydCwgc2V0U2hvd0V4cG9ydF0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcblxyXG4gIGNvbnN0IGlucHV0UmVmID0gdXNlUmVmPEhUTUxUZXh0QXJlYUVsZW1lbnQ+KG51bGwpO1xyXG4gIGNvbnN0IFt1c2VySW5wdXQsIHNldFVzZXJJbnB1dF0gPSB1c2VTdGF0ZShcIlwiKTtcclxuICBjb25zdCBbaXNMb2FkaW5nLCBzZXRJc0xvYWRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IHsgc3VibWl0S2V5LCBzaG91bGRTdWJtaXQgfSA9IHVzZVN1Ym1pdEhhbmRsZXIoKTtcclxuICBjb25zdCBzY3JvbGxSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xyXG4gIGNvbnN0IGlzU2Nyb2xsZWRUb0JvdHRvbSA9IHNjcm9sbFJlZj8uY3VycmVudFxyXG4gICAgPyBNYXRoLmFicyhcclxuICAgICAgICBzY3JvbGxSZWYuY3VycmVudC5zY3JvbGxIZWlnaHQgLVxyXG4gICAgICAgICAgKHNjcm9sbFJlZi5jdXJyZW50LnNjcm9sbFRvcCArIHNjcm9sbFJlZi5jdXJyZW50LmNsaWVudEhlaWdodCksXHJcbiAgICAgICkgPD0gMVxyXG4gICAgOiBmYWxzZTtcclxuICBjb25zdCBpc0F0dGFjaFdpdGhUb3AgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgIGNvbnN0IGxhc3RNZXNzYWdlID0gc2Nyb2xsUmVmLmN1cnJlbnQ/Lmxhc3RFbGVtZW50Q2hpbGQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAvLyBpZiBzY3JvbGxsUmVmIGlzIG5vdCByZWFkeSBvciBubyBtZXNzYWdlLCByZXR1cm4gZmFsc2VcclxuICAgIGlmICghc2Nyb2xsUmVmPy5jdXJyZW50IHx8ICFsYXN0TWVzc2FnZSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgY29uc3QgdG9wRGlzdGFuY2UgPVxyXG4gICAgICBsYXN0TWVzc2FnZSEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIC1cclxuICAgICAgc2Nyb2xsUmVmLmN1cnJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xyXG4gICAgLy8gbGVhdmUgc29tZSBzcGFjZSBmb3IgdXNlciBxdWVzdGlvblxyXG4gICAgcmV0dXJuIHRvcERpc3RhbmNlIDwgMTAwO1xyXG4gIH0sIFtzY3JvbGxSZWY/LmN1cnJlbnQ/LnNjcm9sbEhlaWdodF0pO1xyXG5cclxuICBjb25zdCBpc1R5cGluZyA9IHVzZXJJbnB1dCAhPT0gXCJcIjtcclxuXHJcbiAgLy8gaWYgdXNlciBpcyB0eXBpbmcsIHNob3VsZCBhdXRvIHNjcm9sbCB0byBib3R0b21cclxuICAvLyBpZiB1c2VyIGlzIG5vdCB0eXBpbmcsIHNob3VsZCBhdXRvIHNjcm9sbCB0byBib3R0b20gb25seSBpZiBhbHJlYWR5IGF0IGJvdHRvbVxyXG4gIGNvbnN0IHsgc2V0QXV0b1Njcm9sbCwgc2Nyb2xsRG9tVG9Cb3R0b20gfSA9IHVzZVNjcm9sbFRvQm90dG9tKFxyXG4gICAgc2Nyb2xsUmVmLFxyXG4gICAgKGlzU2Nyb2xsZWRUb0JvdHRvbSB8fCBpc0F0dGFjaFdpdGhUb3ApICYmICFpc1R5cGluZyxcclxuICAgIHNlc3Npb24ubWVzc2FnZXMsXHJcbiAgKTtcclxuICBjb25zdCBbaGl0Qm90dG9tLCBzZXRIaXRCb3R0b21dID0gdXNlU3RhdGUodHJ1ZSk7XHJcbiAgY29uc3QgaXNNb2JpbGVTY3JlZW4gPSB1c2VNb2JpbGVTY3JlZW4oKTtcclxuICBjb25zdCBuYXZpZ2F0ZSA9IHVzZU5hdmlnYXRlKCk7XHJcbiAgY29uc3QgW2F0dGFjaEltYWdlcywgc2V0QXR0YWNoSW1hZ2VzXSA9IHVzZVN0YXRlPHN0cmluZ1tdPihbXSk7XHJcbiAgY29uc3QgW3VwbG9hZGluZywgc2V0VXBsb2FkaW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuXHJcbiAgLy8gcHJvbXB0IGhpbnRzXHJcbiAgY29uc3QgcHJvbXB0U3RvcmUgPSB1c2VQcm9tcHRTdG9yZSgpO1xyXG4gIGNvbnN0IFtwcm9tcHRIaW50cywgc2V0UHJvbXB0SGludHNdID0gdXNlU3RhdGU8UmVuZGVyUHJvbXB0W10+KFtdKTtcclxuICBjb25zdCBvblNlYXJjaCA9IHVzZURlYm91bmNlZENhbGxiYWNrKFxyXG4gICAgKHRleHQ6IHN0cmluZykgPT4ge1xyXG4gICAgICBjb25zdCBtYXRjaGVkUHJvbXB0cyA9IHByb21wdFN0b3JlLnNlYXJjaCh0ZXh0KTtcclxuICAgICAgc2V0UHJvbXB0SGludHMobWF0Y2hlZFByb21wdHMpO1xyXG4gICAgfSxcclxuICAgIDEwMCxcclxuICAgIHsgbGVhZGluZzogdHJ1ZSwgdHJhaWxpbmc6IHRydWUgfSxcclxuICApO1xyXG5cclxuICAvLyBhdXRvIGdyb3cgaW5wdXRcclxuICBjb25zdCBbaW5wdXRSb3dzLCBzZXRJbnB1dFJvd3NdID0gdXNlU3RhdGUoMik7XHJcbiAgY29uc3QgbWVhc3VyZSA9IHVzZURlYm91bmNlZENhbGxiYWNrKFxyXG4gICAgKCkgPT4ge1xyXG4gICAgICBjb25zdCByb3dzID0gaW5wdXRSZWYuY3VycmVudCA/IGF1dG9Hcm93VGV4dEFyZWEoaW5wdXRSZWYuY3VycmVudCkgOiAxO1xyXG4gICAgICBjb25zdCBpbnB1dFJvd3MgPSBNYXRoLm1pbihcclxuICAgICAgICAyMCxcclxuICAgICAgICBNYXRoLm1heCgyICsgTnVtYmVyKCFpc01vYmlsZVNjcmVlbiksIHJvd3MpLFxyXG4gICAgICApO1xyXG4gICAgICBzZXRJbnB1dFJvd3MoaW5wdXRSb3dzKTtcclxuICAgIH0sXHJcbiAgICAxMDAsXHJcbiAgICB7XHJcbiAgICAgIGxlYWRpbmc6IHRydWUsXHJcbiAgICAgIHRyYWlsaW5nOiB0cnVlLFxyXG4gICAgfSxcclxuICApO1xyXG5cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXHJcbiAgdXNlRWZmZWN0KG1lYXN1cmUsIFt1c2VySW5wdXRdKTtcclxuXHJcbiAgLy8gY2hhdCBjb21tYW5kcyBzaG9ydGN1dHNcclxuICBjb25zdCBjaGF0Q29tbWFuZHMgPSB1c2VDaGF0Q29tbWFuZCh7XHJcbiAgICBuZXc6ICgpID0+IGNoYXRTdG9yZS5uZXdTZXNzaW9uKCksXHJcbiAgICBuZXdtOiAoKSA9PiBuYXZpZ2F0ZShQYXRoLk5ld0NoYXQpLFxyXG4gICAgcHJldjogKCkgPT4gY2hhdFN0b3JlLm5leHRTZXNzaW9uKC0xKSxcclxuICAgIG5leHQ6ICgpID0+IGNoYXRTdG9yZS5uZXh0U2Vzc2lvbigxKSxcclxuICAgIGNsZWFyOiAoKSA9PlxyXG4gICAgICBjaGF0U3RvcmUudXBkYXRlVGFyZ2V0U2Vzc2lvbihcclxuICAgICAgICBzZXNzaW9uLFxyXG4gICAgICAgIChzZXNzaW9uKSA9PiAoc2Vzc2lvbi5jbGVhckNvbnRleHRJbmRleCA9IHNlc3Npb24ubWVzc2FnZXMubGVuZ3RoKSxcclxuICAgICAgKSxcclxuICAgIGZvcms6ICgpID0+IGNoYXRTdG9yZS5mb3JrU2Vzc2lvbigpLFxyXG4gICAgZGVsOiAoKSA9PiBjaGF0U3RvcmUuZGVsZXRlU2Vzc2lvbihjaGF0U3RvcmUuY3VycmVudFNlc3Npb25JbmRleCksXHJcbiAgfSk7XHJcblxyXG4gIC8vIG9ubHkgc2VhcmNoIHByb21wdHMgd2hlbiB1c2VyIGlucHV0IGlzIHNob3J0XHJcbiAgY29uc3QgU0VBUkNIX1RFWFRfTElNSVQgPSAzMDtcclxuICBjb25zdCBvbklucHV0ID0gKHRleHQ6IHN0cmluZykgPT4ge1xyXG4gICAgc2V0VXNlcklucHV0KHRleHQpO1xyXG4gICAgY29uc3QgbiA9IHRleHQudHJpbSgpLmxlbmd0aDtcclxuXHJcbiAgICAvLyBjbGVhciBzZWFyY2ggcmVzdWx0c1xyXG4gICAgaWYgKG4gPT09IDApIHtcclxuICAgICAgc2V0UHJvbXB0SGludHMoW10pO1xyXG4gICAgfSBlbHNlIGlmICh0ZXh0Lm1hdGNoKENoYXRDb21tYW5kUHJlZml4KSkge1xyXG4gICAgICBzZXRQcm9tcHRIaW50cyhjaGF0Q29tbWFuZHMuc2VhcmNoKHRleHQpKTtcclxuICAgIH0gZWxzZSBpZiAoIWNvbmZpZy5kaXNhYmxlUHJvbXB0SGludCAmJiBuIDwgU0VBUkNIX1RFWFRfTElNSVQpIHtcclxuICAgICAgLy8gY2hlY2sgaWYgbmVlZCB0byB0cmlnZ2VyIGF1dG8gY29tcGxldGlvblxyXG4gICAgICBpZiAodGV4dC5zdGFydHNXaXRoKFwiL1wiKSkge1xyXG4gICAgICAgIGxldCBzZWFyY2hUZXh0ID0gdGV4dC5zbGljZSgxKTtcclxuICAgICAgICBvblNlYXJjaChzZWFyY2hUZXh0KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGNvbnN0IGRvU3VibWl0ID0gKHVzZXJJbnB1dDogc3RyaW5nKSA9PiB7XHJcbiAgICBpZiAodXNlcklucHV0LnRyaW0oKSA9PT0gXCJcIiAmJiBpc0VtcHR5KGF0dGFjaEltYWdlcykpIHJldHVybjtcclxuICAgIGNvbnN0IG1hdGNoQ29tbWFuZCA9IGNoYXRDb21tYW5kcy5tYXRjaCh1c2VySW5wdXQpO1xyXG4gICAgaWYgKG1hdGNoQ29tbWFuZC5tYXRjaGVkKSB7XHJcbiAgICAgIHNldFVzZXJJbnB1dChcIlwiKTtcclxuICAgICAgc2V0UHJvbXB0SGludHMoW10pO1xyXG4gICAgICBtYXRjaENvbW1hbmQuaW52b2tlKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHNldElzTG9hZGluZyh0cnVlKTtcclxuICAgIGNoYXRTdG9yZVxyXG4gICAgICAub25Vc2VySW5wdXQodXNlcklucHV0LCBhdHRhY2hJbWFnZXMpXHJcbiAgICAgIC50aGVuKCgpID0+IHNldElzTG9hZGluZyhmYWxzZSkpO1xyXG4gICAgc2V0QXR0YWNoSW1hZ2VzKFtdKTtcclxuICAgIGNoYXRTdG9yZS5zZXRMYXN0SW5wdXQodXNlcklucHV0KTtcclxuICAgIHNldFVzZXJJbnB1dChcIlwiKTtcclxuICAgIHNldFByb21wdEhpbnRzKFtdKTtcclxuICAgIGlmICghaXNNb2JpbGVTY3JlZW4pIGlucHV0UmVmLmN1cnJlbnQ/LmZvY3VzKCk7XHJcbiAgICBzZXRBdXRvU2Nyb2xsKHRydWUpO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IG9uUHJvbXB0U2VsZWN0ID0gKHByb21wdDogUmVuZGVyUHJvbXB0KSA9PiB7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgc2V0UHJvbXB0SGludHMoW10pO1xyXG5cclxuICAgICAgY29uc3QgbWF0Y2hlZENoYXRDb21tYW5kID0gY2hhdENvbW1hbmRzLm1hdGNoKHByb21wdC5jb250ZW50KTtcclxuICAgICAgaWYgKG1hdGNoZWRDaGF0Q29tbWFuZC5tYXRjaGVkKSB7XHJcbiAgICAgICAgLy8gaWYgdXNlciBpcyBzZWxlY3RpbmcgYSBjaGF0IGNvbW1hbmQsIGp1c3QgdHJpZ2dlciBpdFxyXG4gICAgICAgIG1hdGNoZWRDaGF0Q29tbWFuZC5pbnZva2UoKTtcclxuICAgICAgICBzZXRVc2VySW5wdXQoXCJcIik7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gb3IgZmlsbCB0aGUgcHJvbXB0XHJcbiAgICAgICAgc2V0VXNlcklucHV0KHByb21wdC5jb250ZW50KTtcclxuICAgICAgfVxyXG4gICAgICBpbnB1dFJlZi5jdXJyZW50Py5mb2N1cygpO1xyXG4gICAgfSwgMzApO1xyXG4gIH07XHJcblxyXG4gIC8vIHN0b3AgcmVzcG9uc2VcclxuICBjb25zdCBvblVzZXJTdG9wID0gKG1lc3NhZ2VJZDogc3RyaW5nKSA9PiB7XHJcbiAgICBDaGF0Q29udHJvbGxlclBvb2wuc3RvcChzZXNzaW9uLmlkLCBtZXNzYWdlSWQpO1xyXG4gIH07XHJcblxyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICBjaGF0U3RvcmUudXBkYXRlVGFyZ2V0U2Vzc2lvbihzZXNzaW9uLCAoc2Vzc2lvbikgPT4ge1xyXG4gICAgICBjb25zdCBzdG9wVGltaW5nID0gRGF0ZS5ub3coKSAtIFJFUVVFU1RfVElNRU9VVF9NUztcclxuICAgICAgc2Vzc2lvbi5tZXNzYWdlcy5mb3JFYWNoKChtKSA9PiB7XHJcbiAgICAgICAgLy8gY2hlY2sgaWYgc2hvdWxkIHN0b3AgYWxsIHN0YWxlIG1lc3NhZ2VzXHJcbiAgICAgICAgaWYgKG0uaXNFcnJvciB8fCBuZXcgRGF0ZShtLmRhdGUpLmdldFRpbWUoKSA8IHN0b3BUaW1pbmcpIHtcclxuICAgICAgICAgIGlmIChtLnN0cmVhbWluZykge1xyXG4gICAgICAgICAgICBtLnN0cmVhbWluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChtLmNvbnRlbnQubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIG0uaXNFcnJvciA9IHRydWU7XHJcbiAgICAgICAgICAgIG0uY29udGVudCA9IHByZXR0eU9iamVjdCh7XHJcbiAgICAgICAgICAgICAgZXJyb3I6IHRydWUsXHJcbiAgICAgICAgICAgICAgbWVzc2FnZTogXCJlbXB0eSByZXNwb25zZVwiLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gYXV0byBzeW5jIG1hc2sgY29uZmlnIGZyb20gZ2xvYmFsIGNvbmZpZ1xyXG4gICAgICBpZiAoc2Vzc2lvbi5tYXNrLnN5bmNHbG9iYWxDb25maWcpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIltNYXNrXSBzeW5jaW5nIGZyb20gZ2xvYmFsLCBuYW1lID0gXCIsIHNlc3Npb24ubWFzay5uYW1lKTtcclxuICAgICAgICBzZXNzaW9uLm1hc2subW9kZWxDb25maWcgPSB7IC4uLmNvbmZpZy5tb2RlbENvbmZpZyB9O1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcclxuICB9LCBbc2Vzc2lvbl0pO1xyXG5cclxuICAvLyBjaGVjayBpZiBzaG91bGQgc2VuZCBtZXNzYWdlXHJcbiAgY29uc3Qgb25JbnB1dEtleURvd24gPSAoZTogUmVhY3QuS2V5Ym9hcmRFdmVudDxIVE1MVGV4dEFyZWFFbGVtZW50PikgPT4ge1xyXG4gICAgLy8gaWYgQXJyb3dVcCBhbmQgbm8gdXNlcklucHV0LCBmaWxsIHdpdGggbGFzdCBpbnB1dFxyXG4gICAgaWYgKFxyXG4gICAgICBlLmtleSA9PT0gXCJBcnJvd1VwXCIgJiZcclxuICAgICAgdXNlcklucHV0Lmxlbmd0aCA8PSAwICYmXHJcbiAgICAgICEoZS5tZXRhS2V5IHx8IGUuYWx0S2V5IHx8IGUuY3RybEtleSlcclxuICAgICkge1xyXG4gICAgICBzZXRVc2VySW5wdXQoY2hhdFN0b3JlLmxhc3RJbnB1dCA/PyBcIlwiKTtcclxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoc2hvdWxkU3VibWl0KGUpICYmIHByb21wdEhpbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBkb1N1Ym1pdCh1c2VySW5wdXQpO1xyXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB9XHJcbiAgfTtcclxuICBjb25zdCBvblJpZ2h0Q2xpY2sgPSAoZTogYW55LCBtZXNzYWdlOiBDaGF0TWVzc2FnZSkgPT4ge1xyXG4gICAgLy8gY29weSB0byBjbGlwYm9hcmRcclxuICAgIGlmIChzZWxlY3RPckNvcHkoZS5jdXJyZW50VGFyZ2V0LCBnZXRNZXNzYWdlVGV4dENvbnRlbnQobWVzc2FnZSkpKSB7XHJcbiAgICAgIGlmICh1c2VySW5wdXQubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgc2V0VXNlcklucHV0KGdldE1lc3NhZ2VUZXh0Q29udGVudChtZXNzYWdlKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBjb25zdCBkZWxldGVNZXNzYWdlID0gKG1zZ0lkPzogc3RyaW5nKSA9PiB7XHJcbiAgICBjaGF0U3RvcmUudXBkYXRlVGFyZ2V0U2Vzc2lvbihcclxuICAgICAgc2Vzc2lvbixcclxuICAgICAgKHNlc3Npb24pID0+XHJcbiAgICAgICAgKHNlc3Npb24ubWVzc2FnZXMgPSBzZXNzaW9uLm1lc3NhZ2VzLmZpbHRlcigobSkgPT4gbS5pZCAhPT0gbXNnSWQpKSxcclxuICAgICk7XHJcbiAgfTtcclxuXHJcbiAgY29uc3Qgb25EZWxldGUgPSAobXNnSWQ6IHN0cmluZykgPT4ge1xyXG4gICAgZGVsZXRlTWVzc2FnZShtc2dJZCk7XHJcbiAgfTtcclxuXHJcbiAgY29uc3Qgb25SZXNlbmQgPSAobWVzc2FnZTogQ2hhdE1lc3NhZ2UpID0+IHtcclxuICAgIC8vIHdoZW4gaXQgaXMgcmVzZW5kaW5nIGEgbWVzc2FnZVxyXG4gICAgLy8gMS4gZm9yIGEgdXNlcidzIG1lc3NhZ2UsIGZpbmQgdGhlIG5leHQgYm90IHJlc3BvbnNlXHJcbiAgICAvLyAyLiBmb3IgYSBib3QncyBtZXNzYWdlLCBmaW5kIHRoZSBsYXN0IHVzZXIncyBpbnB1dFxyXG4gICAgLy8gMy4gZGVsZXRlIG9yaWdpbmFsIHVzZXIgaW5wdXQgYW5kIGJvdCdzIG1lc3NhZ2VcclxuICAgIC8vIDQuIHJlc2VuZCB0aGUgdXNlcidzIGlucHV0XHJcblxyXG4gICAgY29uc3QgcmVzZW5kaW5nSW5kZXggPSBzZXNzaW9uLm1lc3NhZ2VzLmZpbmRJbmRleChcclxuICAgICAgKG0pID0+IG0uaWQgPT09IG1lc3NhZ2UuaWQsXHJcbiAgICApO1xyXG5cclxuICAgIGlmIChyZXNlbmRpbmdJbmRleCA8IDAgfHwgcmVzZW5kaW5nSW5kZXggPj0gc2Vzc2lvbi5tZXNzYWdlcy5sZW5ndGgpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihcIltDaGF0XSBmYWlsZWQgdG8gZmluZCByZXNlbmRpbmcgbWVzc2FnZVwiLCBtZXNzYWdlKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCB1c2VyTWVzc2FnZTogQ2hhdE1lc3NhZ2UgfCB1bmRlZmluZWQ7XHJcbiAgICBsZXQgYm90TWVzc2FnZTogQ2hhdE1lc3NhZ2UgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgaWYgKG1lc3NhZ2Uucm9sZSA9PT0gXCJhc3Npc3RhbnRcIikge1xyXG4gICAgICAvLyBpZiBpdCBpcyByZXNlbmRpbmcgYSBib3QncyBtZXNzYWdlLCBmaW5kIHRoZSB1c2VyIGlucHV0IGZvciBpdFxyXG4gICAgICBib3RNZXNzYWdlID0gbWVzc2FnZTtcclxuICAgICAgZm9yIChsZXQgaSA9IHJlc2VuZGluZ0luZGV4OyBpID49IDA7IGkgLT0gMSkge1xyXG4gICAgICAgIGlmIChzZXNzaW9uLm1lc3NhZ2VzW2ldLnJvbGUgPT09IFwidXNlclwiKSB7XHJcbiAgICAgICAgICB1c2VyTWVzc2FnZSA9IHNlc3Npb24ubWVzc2FnZXNbaV07XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAobWVzc2FnZS5yb2xlID09PSBcInVzZXJcIikge1xyXG4gICAgICAvLyBpZiBpdCBpcyByZXNlbmRpbmcgYSB1c2VyJ3MgaW5wdXQsIGZpbmQgdGhlIGJvdCdzIHJlc3BvbnNlXHJcbiAgICAgIHVzZXJNZXNzYWdlID0gbWVzc2FnZTtcclxuICAgICAgZm9yIChsZXQgaSA9IHJlc2VuZGluZ0luZGV4OyBpIDwgc2Vzc2lvbi5tZXNzYWdlcy5sZW5ndGg7IGkgKz0gMSkge1xyXG4gICAgICAgIGlmIChzZXNzaW9uLm1lc3NhZ2VzW2ldLnJvbGUgPT09IFwiYXNzaXN0YW50XCIpIHtcclxuICAgICAgICAgIGJvdE1lc3NhZ2UgPSBzZXNzaW9uLm1lc3NhZ2VzW2ldO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHVzZXJNZXNzYWdlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihcIltDaGF0XSBmYWlsZWQgdG8gcmVzZW5kXCIsIG1lc3NhZ2UpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZGVsZXRlIHRoZSBvcmlnaW5hbCBtZXNzYWdlc1xyXG4gICAgZGVsZXRlTWVzc2FnZSh1c2VyTWVzc2FnZS5pZCk7XHJcbiAgICBkZWxldGVNZXNzYWdlKGJvdE1lc3NhZ2U/LmlkKTtcclxuXHJcbiAgICAvLyByZXNlbmQgdGhlIG1lc3NhZ2VcclxuICAgIHNldElzTG9hZGluZyh0cnVlKTtcclxuICAgIGNvbnN0IHRleHRDb250ZW50ID0gZ2V0TWVzc2FnZVRleHRDb250ZW50KHVzZXJNZXNzYWdlKTtcclxuICAgIGNvbnN0IGltYWdlcyA9IGdldE1lc3NhZ2VJbWFnZXModXNlck1lc3NhZ2UpO1xyXG4gICAgY2hhdFN0b3JlLm9uVXNlcklucHV0KHRleHRDb250ZW50LCBpbWFnZXMpLnRoZW4oKCkgPT4gc2V0SXNMb2FkaW5nKGZhbHNlKSk7XHJcbiAgICBpbnB1dFJlZi5jdXJyZW50Py5mb2N1cygpO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IG9uUGluTWVzc2FnZSA9IChtZXNzYWdlOiBDaGF0TWVzc2FnZSkgPT4ge1xyXG4gICAgY2hhdFN0b3JlLnVwZGF0ZVRhcmdldFNlc3Npb24oc2Vzc2lvbiwgKHNlc3Npb24pID0+XHJcbiAgICAgIHNlc3Npb24ubWFzay5jb250ZXh0LnB1c2gobWVzc2FnZSksXHJcbiAgICApO1xyXG5cclxuICAgIHNob3dUb2FzdChMb2NhbGUuQ2hhdC5BY3Rpb25zLlBpblRvYXN0Q29udGVudCwge1xyXG4gICAgICB0ZXh0OiBMb2NhbGUuQ2hhdC5BY3Rpb25zLlBpblRvYXN0QWN0aW9uLFxyXG4gICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgc2V0U2hvd1Byb21wdE1vZGFsKHRydWUpO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgYWNjZXNzU3RvcmUgPSB1c2VBY2Nlc3NTdG9yZSgpO1xyXG4gIGNvbnN0IFtzcGVlY2hTdGF0dXMsIHNldFNwZWVjaFN0YXR1c10gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW3NwZWVjaExvYWRpbmcsIHNldFNwZWVjaExvYWRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xyXG5cclxuICBhc3luYyBmdW5jdGlvbiBvcGVuYWlTcGVlY2godGV4dDogc3RyaW5nKSB7XHJcbiAgICBpZiAoc3BlZWNoU3RhdHVzKSB7XHJcbiAgICAgIHR0c1BsYXllci5zdG9wKCk7XHJcbiAgICAgIHNldFNwZWVjaFN0YXR1cyhmYWxzZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB2YXIgYXBpOiBDbGllbnRBcGk7XHJcbiAgICAgIGFwaSA9IG5ldyBDbGllbnRBcGkoTW9kZWxQcm92aWRlci5HUFQpO1xyXG4gICAgICBjb25zdCBjb25maWcgPSB1c2VBcHBDb25maWcuZ2V0U3RhdGUoKTtcclxuICAgICAgc2V0U3BlZWNoTG9hZGluZyh0cnVlKTtcclxuICAgICAgdHRzUGxheWVyLmluaXQoKTtcclxuICAgICAgbGV0IGF1ZGlvQnVmZmVyOiBBcnJheUJ1ZmZlcjtcclxuICAgICAgY29uc3QgeyBtYXJrZG93blRvVHh0IH0gPSByZXF1aXJlKFwibWFya2Rvd24tdG8tdHh0XCIpO1xyXG4gICAgICBjb25zdCB0ZXh0Q29udGVudCA9IG1hcmtkb3duVG9UeHQodGV4dCk7XHJcbiAgICAgIGlmIChjb25maWcudHRzQ29uZmlnLmVuZ2luZSAhPT0gREVGQVVMVF9UVFNfRU5HSU5FKSB7XHJcbiAgICAgICAgY29uc3QgZWRnZVZvaWNlTmFtZSA9IGFjY2Vzc1N0b3JlLmVkZ2VWb2ljZU5hbWUoKTtcclxuICAgICAgICBjb25zdCB0dHMgPSBuZXcgTXNFZGdlVFRTKCk7XHJcbiAgICAgICAgYXdhaXQgdHRzLnNldE1ldGFkYXRhKFxyXG4gICAgICAgICAgZWRnZVZvaWNlTmFtZSxcclxuICAgICAgICAgIE9VVFBVVF9GT1JNQVQuQVVESU9fMjRLSFpfOTZLQklUUkFURV9NT05PX01QMyxcclxuICAgICAgICApO1xyXG4gICAgICAgIGF1ZGlvQnVmZmVyID0gYXdhaXQgdHRzLnRvQXJyYXlCdWZmZXIodGV4dENvbnRlbnQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGF1ZGlvQnVmZmVyID0gYXdhaXQgYXBpLmxsbS5zcGVlY2goe1xyXG4gICAgICAgICAgbW9kZWw6IGNvbmZpZy50dHNDb25maWcubW9kZWwsXHJcbiAgICAgICAgICBpbnB1dDogdGV4dENvbnRlbnQsXHJcbiAgICAgICAgICB2b2ljZTogY29uZmlnLnR0c0NvbmZpZy52b2ljZSxcclxuICAgICAgICAgIHNwZWVkOiBjb25maWcudHRzQ29uZmlnLnNwZWVkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIHNldFNwZWVjaFN0YXR1cyh0cnVlKTtcclxuICAgICAgdHRzUGxheWVyXHJcbiAgICAgICAgLnBsYXkoYXVkaW9CdWZmZXIsICgpID0+IHtcclxuICAgICAgICAgIHNldFNwZWVjaFN0YXR1cyhmYWxzZSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuY2F0Y2goKGUpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbT3BlbkFJIFNwZWVjaF1cIiwgZSk7XHJcbiAgICAgICAgICBzaG93VG9hc3QocHJldHR5T2JqZWN0KGUpKTtcclxuICAgICAgICAgIHNldFNwZWVjaFN0YXR1cyhmYWxzZSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuZmluYWxseSgoKSA9PiBzZXRTcGVlY2hMb2FkaW5nKGZhbHNlKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25zdCBjb250ZXh0OiBSZW5kZXJNZXNzYWdlW10gPSB1c2VNZW1vKCgpID0+IHtcclxuICAgIHJldHVybiBzZXNzaW9uLm1hc2suaGlkZUNvbnRleHQgPyBbXSA6IHNlc3Npb24ubWFzay5jb250ZXh0LnNsaWNlKCk7XHJcbiAgfSwgW3Nlc3Npb24ubWFzay5jb250ZXh0LCBzZXNzaW9uLm1hc2suaGlkZUNvbnRleHRdKTtcclxuXHJcbiAgaWYgKFxyXG4gICAgY29udGV4dC5sZW5ndGggPT09IDAgJiZcclxuICAgIHNlc3Npb24ubWVzc2FnZXMuYXQoMCk/LmNvbnRlbnQgIT09IEJPVF9IRUxMTy5jb250ZW50XHJcbiAgKSB7XHJcbiAgICBjb25zdCBjb3BpZWRIZWxsbyA9IE9iamVjdC5hc3NpZ24oe30sIEJPVF9IRUxMTyk7XHJcbiAgICBpZiAoIWFjY2Vzc1N0b3JlLmlzQXV0aG9yaXplZCgpKSB7XHJcbiAgICAgIGNvcGllZEhlbGxvLmNvbnRlbnQgPSBMb2NhbGUuRXJyb3IuVW5hdXRob3JpemVkO1xyXG4gICAgfVxyXG4gICAgY29udGV4dC5wdXNoKGNvcGllZEhlbGxvKTtcclxuICB9XHJcblxyXG4gIC8vIHByZXZpZXcgbWVzc2FnZXNcclxuICBjb25zdCByZW5kZXJNZXNzYWdlcyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgcmV0dXJuIGNvbnRleHRcclxuICAgICAgLmNvbmNhdChzZXNzaW9uLm1lc3NhZ2VzIGFzIFJlbmRlck1lc3NhZ2VbXSlcclxuICAgICAgLmNvbmNhdChcclxuICAgICAgICBpc0xvYWRpbmdcclxuICAgICAgICAgID8gW1xyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIC4uLmNyZWF0ZU1lc3NhZ2Uoe1xyXG4gICAgICAgICAgICAgICAgICByb2xlOiBcImFzc2lzdGFudFwiLFxyXG4gICAgICAgICAgICAgICAgICBjb250ZW50OiBcIuKApuKAplwiLFxyXG4gICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICBwcmV2aWV3OiB0cnVlLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIDogW10sXHJcbiAgICAgIClcclxuICAgICAgLmNvbmNhdChcclxuICAgICAgICB1c2VySW5wdXQubGVuZ3RoID4gMCAmJiBjb25maWcuc2VuZFByZXZpZXdCdWJibGVcclxuICAgICAgICAgID8gW1xyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIC4uLmNyZWF0ZU1lc3NhZ2Uoe1xyXG4gICAgICAgICAgICAgICAgICByb2xlOiBcInVzZXJcIixcclxuICAgICAgICAgICAgICAgICAgY29udGVudDogdXNlcklucHV0LFxyXG4gICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICBwcmV2aWV3OiB0cnVlLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIDogW10sXHJcbiAgICAgICk7XHJcbiAgfSwgW1xyXG4gICAgY29uZmlnLnNlbmRQcmV2aWV3QnViYmxlLFxyXG4gICAgY29udGV4dCxcclxuICAgIGlzTG9hZGluZyxcclxuICAgIHNlc3Npb24ubWVzc2FnZXMsXHJcbiAgICB1c2VySW5wdXQsXHJcbiAgXSk7XHJcblxyXG4gIGNvbnN0IFttc2dSZW5kZXJJbmRleCwgX3NldE1zZ1JlbmRlckluZGV4XSA9IHVzZVN0YXRlKFxyXG4gICAgTWF0aC5tYXgoMCwgcmVuZGVyTWVzc2FnZXMubGVuZ3RoIC0gQ0hBVF9QQUdFX1NJWkUpLFxyXG4gICk7XHJcblxyXG4gIGZ1bmN0aW9uIHNldE1zZ1JlbmRlckluZGV4KG5ld0luZGV4OiBudW1iZXIpIHtcclxuICAgIG5ld0luZGV4ID0gTWF0aC5taW4ocmVuZGVyTWVzc2FnZXMubGVuZ3RoIC0gQ0hBVF9QQUdFX1NJWkUsIG5ld0luZGV4KTtcclxuICAgIG5ld0luZGV4ID0gTWF0aC5tYXgoMCwgbmV3SW5kZXgpO1xyXG4gICAgX3NldE1zZ1JlbmRlckluZGV4KG5ld0luZGV4KTtcclxuICB9XHJcblxyXG4gIGNvbnN0IG1lc3NhZ2VzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICBjb25zdCBlbmRSZW5kZXJJbmRleCA9IE1hdGgubWluKFxyXG4gICAgICBtc2dSZW5kZXJJbmRleCArIDMgKiBDSEFUX1BBR0VfU0laRSxcclxuICAgICAgcmVuZGVyTWVzc2FnZXMubGVuZ3RoLFxyXG4gICAgKTtcclxuICAgIHJldHVybiByZW5kZXJNZXNzYWdlcy5zbGljZShtc2dSZW5kZXJJbmRleCwgZW5kUmVuZGVySW5kZXgpO1xyXG4gIH0sIFttc2dSZW5kZXJJbmRleCwgcmVuZGVyTWVzc2FnZXNdKTtcclxuXHJcbiAgY29uc3Qgb25DaGF0Qm9keVNjcm9sbCA9IChlOiBIVE1MRWxlbWVudCkgPT4ge1xyXG4gICAgY29uc3QgYm90dG9tSGVpZ2h0ID0gZS5zY3JvbGxUb3AgKyBlLmNsaWVudEhlaWdodDtcclxuICAgIGNvbnN0IGVkZ2VUaHJlc2hvbGQgPSBlLmNsaWVudEhlaWdodDtcclxuXHJcbiAgICBjb25zdCBpc1RvdWNoVG9wRWRnZSA9IGUuc2Nyb2xsVG9wIDw9IGVkZ2VUaHJlc2hvbGQ7XHJcbiAgICBjb25zdCBpc1RvdWNoQm90dG9tRWRnZSA9IGJvdHRvbUhlaWdodCA+PSBlLnNjcm9sbEhlaWdodCAtIGVkZ2VUaHJlc2hvbGQ7XHJcbiAgICBjb25zdCBpc0hpdEJvdHRvbSA9XHJcbiAgICAgIGJvdHRvbUhlaWdodCA+PSBlLnNjcm9sbEhlaWdodCAtIChpc01vYmlsZVNjcmVlbiA/IDQgOiAxMCk7XHJcblxyXG4gICAgY29uc3QgcHJldlBhZ2VNc2dJbmRleCA9IG1zZ1JlbmRlckluZGV4IC0gQ0hBVF9QQUdFX1NJWkU7XHJcbiAgICBjb25zdCBuZXh0UGFnZU1zZ0luZGV4ID0gbXNnUmVuZGVySW5kZXggKyBDSEFUX1BBR0VfU0laRTtcclxuXHJcbiAgICBpZiAoaXNUb3VjaFRvcEVkZ2UgJiYgIWlzVG91Y2hCb3R0b21FZGdlKSB7XHJcbiAgICAgIHNldE1zZ1JlbmRlckluZGV4KHByZXZQYWdlTXNnSW5kZXgpO1xyXG4gICAgfSBlbHNlIGlmIChpc1RvdWNoQm90dG9tRWRnZSkge1xyXG4gICAgICBzZXRNc2dSZW5kZXJJbmRleChuZXh0UGFnZU1zZ0luZGV4KTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRIaXRCb3R0b20oaXNIaXRCb3R0b20pO1xyXG4gICAgc2V0QXV0b1Njcm9sbChpc0hpdEJvdHRvbSk7XHJcbiAgfTtcclxuXHJcbiAgZnVuY3Rpb24gc2Nyb2xsVG9Cb3R0b20oKSB7XHJcbiAgICBzZXRNc2dSZW5kZXJJbmRleChyZW5kZXJNZXNzYWdlcy5sZW5ndGggLSBDSEFUX1BBR0VfU0laRSk7XHJcbiAgICBzY3JvbGxEb21Ub0JvdHRvbSgpO1xyXG4gIH1cclxuXHJcbiAgLy8gY2xlYXIgY29udGV4dCBpbmRleCA9IGNvbnRleHQgbGVuZ3RoICsgaW5kZXggaW4gbWVzc2FnZXNcclxuICBjb25zdCBjbGVhckNvbnRleHRJbmRleCA9XHJcbiAgICAoc2Vzc2lvbi5jbGVhckNvbnRleHRJbmRleCA/PyAtMSkgPj0gMFxyXG4gICAgICA/IHNlc3Npb24uY2xlYXJDb250ZXh0SW5kZXghICsgY29udGV4dC5sZW5ndGggLSBtc2dSZW5kZXJJbmRleFxyXG4gICAgICA6IC0xO1xyXG5cclxuICBjb25zdCBbc2hvd1Byb21wdE1vZGFsLCBzZXRTaG93UHJvbXB0TW9kYWxdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG5cclxuICBjb25zdCBjbGllbnRDb25maWcgPSB1c2VNZW1vKCgpID0+IGdldENsaWVudENvbmZpZygpLCBbXSk7XHJcblxyXG4gIGNvbnN0IGF1dG9Gb2N1cyA9ICFpc01vYmlsZVNjcmVlbjsgLy8gd29udCBhdXRvIGZvY3VzIG9uIG1vYmlsZSBzY3JlZW5cclxuICBjb25zdCBzaG93TWF4SWNvbiA9ICFpc01vYmlsZVNjcmVlbiAmJiAhY2xpZW50Q29uZmlnPy5pc0FwcDtcclxuXHJcbiAgdXNlQ29tbWFuZCh7XHJcbiAgICBmaWxsOiBzZXRVc2VySW5wdXQsXHJcbiAgICBzdWJtaXQ6ICh0ZXh0KSA9PiB7XHJcbiAgICAgIGRvU3VibWl0KHRleHQpO1xyXG4gICAgfSxcclxuICAgIGNvZGU6ICh0ZXh0KSA9PiB7XHJcbiAgICAgIGlmIChhY2Nlc3NTdG9yZS5kaXNhYmxlRmFzdExpbmspIHJldHVybjtcclxuICAgICAgY29uc29sZS5sb2coXCJbQ29tbWFuZF0gZ290IGNvZGUgZnJvbSB1cmw6IFwiLCB0ZXh0KTtcclxuICAgICAgc2hvd0NvbmZpcm0oTG9jYWxlLlVSTENvbW1hbmQuQ29kZSArIGBjb2RlID0gJHt0ZXh0fWApLnRoZW4oKHJlcykgPT4ge1xyXG4gICAgICAgIGlmIChyZXMpIHtcclxuICAgICAgICAgIGFjY2Vzc1N0b3JlLnVwZGF0ZSgoYWNjZXNzKSA9PiAoYWNjZXNzLmFjY2Vzc0NvZGUgPSB0ZXh0KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0sXHJcbiAgICBzZXR0aW5nczogKHRleHQpID0+IHtcclxuICAgICAgaWYgKGFjY2Vzc1N0b3JlLmRpc2FibGVGYXN0TGluaykgcmV0dXJuO1xyXG5cclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBwYXlsb2FkID0gSlNPTi5wYXJzZSh0ZXh0KSBhcyB7XHJcbiAgICAgICAgICBrZXk/OiBzdHJpbmc7XHJcbiAgICAgICAgICB1cmw/OiBzdHJpbmc7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc29sZS5sb2coXCJbQ29tbWFuZF0gZ290IHNldHRpbmdzIGZyb20gdXJsOiBcIiwgcGF5bG9hZCk7XHJcblxyXG4gICAgICAgIGlmIChwYXlsb2FkLmtleSB8fCBwYXlsb2FkLnVybCkge1xyXG4gICAgICAgICAgc2hvd0NvbmZpcm0oXHJcbiAgICAgICAgICAgIExvY2FsZS5VUkxDb21tYW5kLlNldHRpbmdzICtcclxuICAgICAgICAgICAgICBgXFxuJHtKU09OLnN0cmluZ2lmeShwYXlsb2FkLCBudWxsLCA0KX1gLFxyXG4gICAgICAgICAgKS50aGVuKChyZXMpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFyZXMpIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKHBheWxvYWQua2V5KSB7XHJcbiAgICAgICAgICAgICAgYWNjZXNzU3RvcmUudXBkYXRlKFxyXG4gICAgICAgICAgICAgICAgKGFjY2VzcykgPT4gKGFjY2Vzcy5vcGVuYWlBcGlLZXkgPSBwYXlsb2FkLmtleSEpLFxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHBheWxvYWQudXJsKSB7XHJcbiAgICAgICAgICAgICAgYWNjZXNzU3RvcmUudXBkYXRlKChhY2Nlc3MpID0+IChhY2Nlc3Mub3BlbmFpVXJsID0gcGF5bG9hZC51cmwhKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYWNjZXNzU3RvcmUudXBkYXRlKChhY2Nlc3MpID0+IChhY2Nlc3MudXNlQ3VzdG9tQ29uZmlnID0gdHJ1ZSkpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFwiW0NvbW1hbmRdIGZhaWxlZCB0byBnZXQgc2V0dGluZ3MgZnJvbSB1cmw6IFwiLCB0ZXh0KTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICB9KTtcclxuXHJcbiAgLy8gZWRpdCAvIGluc2VydCBtZXNzYWdlIG1vZGFsXHJcbiAgY29uc3QgW2lzRWRpdGluZ01lc3NhZ2UsIHNldElzRWRpdGluZ01lc3NhZ2VdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG5cclxuICAvLyByZW1lbWJlciB1bmZpbmlzaGVkIGlucHV0XHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIC8vIHRyeSB0byBsb2FkIGZyb20gbG9jYWwgc3RvcmFnZVxyXG4gICAgY29uc3Qga2V5ID0gVU5GSU5JU0hFRF9JTlBVVChzZXNzaW9uLmlkKTtcclxuICAgIGNvbnN0IG1heUJlVW5maW5pc2hlZElucHV0ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTtcclxuICAgIGlmIChtYXlCZVVuZmluaXNoZWRJbnB1dCAmJiB1c2VySW5wdXQubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHNldFVzZXJJbnB1dChtYXlCZVVuZmluaXNoZWRJbnB1dCk7XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZG9tID0gaW5wdXRSZWYuY3VycmVudDtcclxuICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgZG9tPy52YWx1ZSA/PyBcIlwiKTtcclxuICAgIH07XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXHJcbiAgfSwgW10pO1xyXG5cclxuICBjb25zdCBoYW5kbGVQYXN0ZSA9IHVzZUNhbGxiYWNrKFxyXG4gICAgYXN5bmMgKGV2ZW50OiBSZWFjdC5DbGlwYm9hcmRFdmVudDxIVE1MVGV4dEFyZWFFbGVtZW50PikgPT4ge1xyXG4gICAgICBjb25zdCBjdXJyZW50TW9kZWwgPSBjaGF0U3RvcmUuY3VycmVudFNlc3Npb24oKS5tYXNrLm1vZGVsQ29uZmlnLm1vZGVsO1xyXG4gICAgICBpZiAoIWlzVmlzaW9uTW9kZWwoY3VycmVudE1vZGVsKSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBpdGVtcyA9IChldmVudC5jbGlwYm9hcmREYXRhIHx8IHdpbmRvdy5jbGlwYm9hcmREYXRhKS5pdGVtcztcclxuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XHJcbiAgICAgICAgaWYgKGl0ZW0ua2luZCA9PT0gXCJmaWxlXCIgJiYgaXRlbS50eXBlLnN0YXJ0c1dpdGgoXCJpbWFnZS9cIikpIHtcclxuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICBjb25zdCBmaWxlID0gaXRlbS5nZXRBc0ZpbGUoKTtcclxuICAgICAgICAgIGlmIChmaWxlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGltYWdlczogc3RyaW5nW10gPSBbXTtcclxuICAgICAgICAgICAgaW1hZ2VzLnB1c2goLi4uYXR0YWNoSW1hZ2VzKTtcclxuICAgICAgICAgICAgaW1hZ2VzLnB1c2goXHJcbiAgICAgICAgICAgICAgLi4uKGF3YWl0IG5ldyBQcm9taXNlPHN0cmluZ1tdPigocmVzLCByZWopID0+IHtcclxuICAgICAgICAgICAgICAgIHNldFVwbG9hZGluZyh0cnVlKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGltYWdlc0RhdGE6IHN0cmluZ1tdID0gW107XHJcbiAgICAgICAgICAgICAgICB1cGxvYWRJbWFnZVJlbW90ZShmaWxlKVxyXG4gICAgICAgICAgICAgICAgICAudGhlbigoZGF0YVVybCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGltYWdlc0RhdGEucHVzaChkYXRhVXJsKTtcclxuICAgICAgICAgICAgICAgICAgICBzZXRVcGxvYWRpbmcoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlcyhpbWFnZXNEYXRhKTtcclxuICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgLmNhdGNoKChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0VXBsb2FkaW5nKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICByZWooZSk7XHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH0pKSxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgY29uc3QgaW1hZ2VzTGVuZ3RoID0gaW1hZ2VzLmxlbmd0aDtcclxuXHJcbiAgICAgICAgICAgIGlmIChpbWFnZXNMZW5ndGggPiAzKSB7XHJcbiAgICAgICAgICAgICAgaW1hZ2VzLnNwbGljZSgzLCBpbWFnZXNMZW5ndGggLSAzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRBdHRhY2hJbWFnZXMoaW1hZ2VzKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICBbYXR0YWNoSW1hZ2VzLCBjaGF0U3RvcmVdLFxyXG4gICk7XHJcblxyXG4gIGFzeW5jIGZ1bmN0aW9uIHVwbG9hZEltYWdlKCkge1xyXG4gICAgY29uc3QgaW1hZ2VzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgaW1hZ2VzLnB1c2goLi4uYXR0YWNoSW1hZ2VzKTtcclxuXHJcbiAgICBpbWFnZXMucHVzaChcclxuICAgICAgLi4uKGF3YWl0IG5ldyBQcm9taXNlPHN0cmluZ1tdPigocmVzLCByZWopID0+IHtcclxuICAgICAgICBjb25zdCBmaWxlSW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XHJcbiAgICAgICAgZmlsZUlucHV0LnR5cGUgPSBcImZpbGVcIjtcclxuICAgICAgICBmaWxlSW5wdXQuYWNjZXB0ID1cclxuICAgICAgICAgIFwiaW1hZ2UvcG5nLCBpbWFnZS9qcGVnLCBpbWFnZS93ZWJwLCBpbWFnZS9oZWljLCBpbWFnZS9oZWlmXCI7XHJcbiAgICAgICAgZmlsZUlucHV0Lm11bHRpcGxlID0gdHJ1ZTtcclxuICAgICAgICBmaWxlSW5wdXQub25jaGFuZ2UgPSAoZXZlbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgc2V0VXBsb2FkaW5nKHRydWUpO1xyXG4gICAgICAgICAgY29uc3QgZmlsZXMgPSBldmVudC50YXJnZXQuZmlsZXM7XHJcbiAgICAgICAgICBjb25zdCBpbWFnZXNEYXRhOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBmaWxlID0gZXZlbnQudGFyZ2V0LmZpbGVzW2ldO1xyXG4gICAgICAgICAgICB1cGxvYWRJbWFnZVJlbW90ZShmaWxlKVxyXG4gICAgICAgICAgICAgIC50aGVuKChkYXRhVXJsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpbWFnZXNEYXRhLnB1c2goZGF0YVVybCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgIGltYWdlc0RhdGEubGVuZ3RoID09PSAzIHx8XHJcbiAgICAgICAgICAgICAgICAgIGltYWdlc0RhdGEubGVuZ3RoID09PSBmaWxlcy5sZW5ndGhcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICBzZXRVcGxvYWRpbmcoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICByZXMoaW1hZ2VzRGF0YSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAuY2F0Y2goKGUpID0+IHtcclxuICAgICAgICAgICAgICAgIHNldFVwbG9hZGluZyhmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICByZWooZSk7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICBmaWxlSW5wdXQuY2xpY2soKTtcclxuICAgICAgfSkpLFxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBpbWFnZXNMZW5ndGggPSBpbWFnZXMubGVuZ3RoO1xyXG4gICAgaWYgKGltYWdlc0xlbmd0aCA+IDMpIHtcclxuICAgICAgaW1hZ2VzLnNwbGljZSgzLCBpbWFnZXNMZW5ndGggLSAzKTtcclxuICAgIH1cclxuICAgIHNldEF0dGFjaEltYWdlcyhpbWFnZXMpO1xyXG4gIH1cclxuXHJcbiAgLy8g5b+r5o236ZSuIHNob3J0Y3V0IGtleXNcclxuICBjb25zdCBbc2hvd1Nob3J0Y3V0S2V5TW9kYWwsIHNldFNob3dTaG9ydGN1dEtleU1vZGFsXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuXHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIGNvbnN0IGhhbmRsZUtleURvd24gPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcclxuICAgICAgLy8g5omT5byA5paw6IGK5aSpIGNvbW1hbmQgKyBzaGlmdCArIG9cclxuICAgICAgaWYgKFxyXG4gICAgICAgIChldmVudC5tZXRhS2V5IHx8IGV2ZW50LmN0cmxLZXkpICYmXHJcbiAgICAgICAgZXZlbnQuc2hpZnRLZXkgJiZcclxuICAgICAgICBldmVudC5rZXkudG9Mb3dlckNhc2UoKSA9PT0gXCJvXCJcclxuICAgICAgKSB7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIGNoYXRTdG9yZS5uZXdTZXNzaW9uKCk7XHJcbiAgICAgICAgICBuYXZpZ2F0ZShQYXRoLkNoYXQpO1xyXG4gICAgICAgIH0sIDEwKTtcclxuICAgICAgfVxyXG4gICAgICAvLyDogZrnhKbogYrlpKnovpPlhaUgc2hpZnQgKyBlc2NcclxuICAgICAgZWxzZSBpZiAoZXZlbnQuc2hpZnRLZXkgJiYgZXZlbnQua2V5LnRvTG93ZXJDYXNlKCkgPT09IFwiZXNjYXBlXCIpIHtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGlucHV0UmVmLmN1cnJlbnQ/LmZvY3VzKCk7XHJcbiAgICAgIH1cclxuICAgICAgLy8g5aSN5Yi25pyA5ZCO5LiA5Liq5Luj56CB5Z2XIGNvbW1hbmQgKyBzaGlmdCArIDtcclxuICAgICAgZWxzZSBpZiAoXHJcbiAgICAgICAgKGV2ZW50Lm1ldGFLZXkgfHwgZXZlbnQuY3RybEtleSkgJiZcclxuICAgICAgICBldmVudC5zaGlmdEtleSAmJlxyXG4gICAgICAgIGV2ZW50LmNvZGUgPT09IFwiU2VtaWNvbG9uXCJcclxuICAgICAgKSB7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBjb25zdCBjb3B5Q29kZUJ1dHRvbiA9XHJcbiAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihcIi5jb3B5LWNvZGUtYnV0dG9uXCIpO1xyXG4gICAgICAgIGlmIChjb3B5Q29kZUJ1dHRvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBjb3B5Q29kZUJ1dHRvbltjb3B5Q29kZUJ1dHRvbi5sZW5ndGggLSAxXS5jbGljaygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyDlpI3liLbmnIDlkI7kuIDkuKrlm57lpI0gY29tbWFuZCArIHNoaWZ0ICsgY1xyXG4gICAgICBlbHNlIGlmIChcclxuICAgICAgICAoZXZlbnQubWV0YUtleSB8fCBldmVudC5jdHJsS2V5KSAmJlxyXG4gICAgICAgIGV2ZW50LnNoaWZ0S2V5ICYmXHJcbiAgICAgICAgZXZlbnQua2V5LnRvTG93ZXJDYXNlKCkgPT09IFwiY1wiXHJcbiAgICAgICkge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgY29uc3QgbGFzdE5vblVzZXJNZXNzYWdlID0gbWVzc2FnZXNcclxuICAgICAgICAgIC5maWx0ZXIoKG1lc3NhZ2UpID0+IG1lc3NhZ2Uucm9sZSAhPT0gXCJ1c2VyXCIpXHJcbiAgICAgICAgICAucG9wKCk7XHJcbiAgICAgICAgaWYgKGxhc3ROb25Vc2VyTWVzc2FnZSkge1xyXG4gICAgICAgICAgY29uc3QgbGFzdE1lc3NhZ2VDb250ZW50ID0gZ2V0TWVzc2FnZVRleHRDb250ZW50KGxhc3ROb25Vc2VyTWVzc2FnZSk7XHJcbiAgICAgICAgICBjb3B5VG9DbGlwYm9hcmQobGFzdE1lc3NhZ2VDb250ZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8g5bGV56S65b+r5o236ZSuIGNvbW1hbmQgKyAvXHJcbiAgICAgIGVsc2UgaWYgKChldmVudC5tZXRhS2V5IHx8IGV2ZW50LmN0cmxLZXkpICYmIGV2ZW50LmtleSA9PT0gXCIvXCIpIHtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIHNldFNob3dTaG9ydGN1dEtleU1vZGFsKHRydWUpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIOa4hemZpOS4iuS4i+aWhyBjb21tYW5kICsgc2hpZnQgKyBiYWNrc3BhY2VcclxuICAgICAgZWxzZSBpZiAoXHJcbiAgICAgICAgKGV2ZW50Lm1ldGFLZXkgfHwgZXZlbnQuY3RybEtleSkgJiZcclxuICAgICAgICBldmVudC5zaGlmdEtleSAmJlxyXG4gICAgICAgIGV2ZW50LmtleS50b0xvd2VyQ2FzZSgpID09PSBcImJhY2tzcGFjZVwiXHJcbiAgICAgICkge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgY2hhdFN0b3JlLnVwZGF0ZVRhcmdldFNlc3Npb24oc2Vzc2lvbiwgKHNlc3Npb24pID0+IHtcclxuICAgICAgICAgIGlmIChzZXNzaW9uLmNsZWFyQ29udGV4dEluZGV4ID09PSBzZXNzaW9uLm1lc3NhZ2VzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBzZXNzaW9uLmNsZWFyQ29udGV4dEluZGV4ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc2Vzc2lvbi5jbGVhckNvbnRleHRJbmRleCA9IHNlc3Npb24ubWVzc2FnZXMubGVuZ3RoO1xyXG4gICAgICAgICAgICBzZXNzaW9uLm1lbW9yeVByb21wdCA9IFwiXCI7IC8vIHdpbGwgY2xlYXIgbWVtb3J5XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgaGFuZGxlS2V5RG93bik7XHJcblxyXG4gICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgaGFuZGxlS2V5RG93bik7XHJcbiAgICB9O1xyXG4gIH0sIFttZXNzYWdlcywgY2hhdFN0b3JlLCBuYXZpZ2F0ZSwgc2Vzc2lvbl0pO1xyXG5cclxuICBjb25zdCBbc2hvd0NoYXRTaWRlUGFuZWwsIHNldFNob3dDaGF0U2lkZVBhbmVsXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuXHJcbiAgcmV0dXJuIChcclxuICAgIDw+XHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMuY2hhdH0ga2V5PXtzZXNzaW9uLmlkfT5cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIndpbmRvdy1oZWFkZXJcIiBkYXRhLXRhdXJpLWRyYWctcmVnaW9uPlxyXG4gICAgICAgICAge2lzTW9iaWxlU2NyZWVuICYmIChcclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3aW5kb3ctYWN0aW9uc1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtcIndpbmRvdy1hY3Rpb24tYnV0dG9uXCJ9PlxyXG4gICAgICAgICAgICAgICAgPEljb25CdXR0b25cclxuICAgICAgICAgICAgICAgICAgaWNvbj17PFJldHVybkljb24gLz59XHJcbiAgICAgICAgICAgICAgICAgIGJvcmRlcmVkXHJcbiAgICAgICAgICAgICAgICAgIHRpdGxlPXtMb2NhbGUuQ2hhdC5BY3Rpb25zLkNoYXRMaXN0fVxyXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBuYXZpZ2F0ZShQYXRoLkhvbWUpfVxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICApfVxyXG5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgY2xhc3NOYW1lPXtjbHN4KFwid2luZG93LWhlYWRlci10aXRsZVwiLCBzdHlsZXNbXCJjaGF0LWJvZHktdGl0bGVcIl0pfVxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbHN4KFxyXG4gICAgICAgICAgICAgICAgXCJ3aW5kb3ctaGVhZGVyLW1haW4tdGl0bGVcIixcclxuICAgICAgICAgICAgICAgIHN0eWxlc1tcImNoYXQtYm9keS1tYWluLXRpdGxlXCJdLFxyXG4gICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgb25DbGlja0NhcHR1cmU9eygpID0+IHNldElzRWRpdGluZ01lc3NhZ2UodHJ1ZSl9XHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICB7IXNlc3Npb24udG9waWMgPyBERUZBVUxUX1RPUElDIDogc2Vzc2lvbi50b3BpY31cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwid2luZG93LWhlYWRlci1zdWItdGl0bGVcIj5cclxuICAgICAgICAgICAgICB7TG9jYWxlLkNoYXQuU3ViVGl0bGUoc2Vzc2lvbi5tZXNzYWdlcy5sZW5ndGgpfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3aW5kb3ctYWN0aW9uc1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIndpbmRvdy1hY3Rpb24tYnV0dG9uXCI+XHJcbiAgICAgICAgICAgICAgPEljb25CdXR0b25cclxuICAgICAgICAgICAgICAgIGljb249ezxSZWxvYWRJY29uIC8+fVxyXG4gICAgICAgICAgICAgICAgYm9yZGVyZWRcclxuICAgICAgICAgICAgICAgIHRpdGxlPXtMb2NhbGUuQ2hhdC5BY3Rpb25zLlJlZnJlc2hUaXRsZX1cclxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgc2hvd1RvYXN0KExvY2FsZS5DaGF0LkFjdGlvbnMuUmVmcmVzaFRvYXN0KTtcclxuICAgICAgICAgICAgICAgICAgY2hhdFN0b3JlLnN1bW1hcml6ZVNlc3Npb24odHJ1ZSwgc2Vzc2lvbik7XHJcbiAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICB7IWlzTW9iaWxlU2NyZWVuICYmIChcclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIndpbmRvdy1hY3Rpb24tYnV0dG9uXCI+XHJcbiAgICAgICAgICAgICAgICA8SWNvbkJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICBpY29uPXs8UmVuYW1lSWNvbiAvPn1cclxuICAgICAgICAgICAgICAgICAgYm9yZGVyZWRcclxuICAgICAgICAgICAgICAgICAgdGl0bGU9e0xvY2FsZS5DaGF0LkVkaXRNZXNzYWdlLlRpdGxlfVxyXG4gICAgICAgICAgICAgICAgICBhcmlhPXtMb2NhbGUuQ2hhdC5FZGl0TWVzc2FnZS5UaXRsZX1cclxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0SXNFZGl0aW5nTWVzc2FnZSh0cnVlKX1cclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwid2luZG93LWFjdGlvbi1idXR0b25cIj5cclxuICAgICAgICAgICAgICA8SWNvbkJ1dHRvblxyXG4gICAgICAgICAgICAgICAgaWNvbj17PEV4cG9ydEljb24gLz59XHJcbiAgICAgICAgICAgICAgICBib3JkZXJlZFxyXG4gICAgICAgICAgICAgICAgdGl0bGU9e0xvY2FsZS5DaGF0LkFjdGlvbnMuRXhwb3J0fVxyXG4gICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBzZXRTaG93RXhwb3J0KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAge3Nob3dNYXhJY29uICYmIChcclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIndpbmRvdy1hY3Rpb24tYnV0dG9uXCI+XHJcbiAgICAgICAgICAgICAgICA8SWNvbkJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICBpY29uPXtjb25maWcudGlnaHRCb3JkZXIgPyA8TWluSWNvbiAvPiA6IDxNYXhJY29uIC8+fVxyXG4gICAgICAgICAgICAgICAgICBib3JkZXJlZFxyXG4gICAgICAgICAgICAgICAgICB0aXRsZT17TG9jYWxlLkNoYXQuQWN0aW9ucy5GdWxsU2NyZWVufVxyXG4gICAgICAgICAgICAgICAgICBhcmlhPXtMb2NhbGUuQ2hhdC5BY3Rpb25zLkZ1bGxTY3JlZW59XHJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25maWcudXBkYXRlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNvbmZpZykgPT4gKGNvbmZpZy50aWdodEJvcmRlciA9ICFjb25maWcudGlnaHRCb3JkZXIpLFxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICApfVxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPFByb21wdFRvYXN0XHJcbiAgICAgICAgICAgIHNob3dUb2FzdD17IWhpdEJvdHRvbX1cclxuICAgICAgICAgICAgc2hvd01vZGFsPXtzaG93UHJvbXB0TW9kYWx9XHJcbiAgICAgICAgICAgIHNldFNob3dNb2RhbD17c2V0U2hvd1Byb21wdE1vZGFsfVxyXG4gICAgICAgICAgLz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzW1wiY2hhdC1tYWluXCJdfT5cclxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXNbXCJjaGF0LWJvZHktY29udGFpbmVyXCJdfT5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT17c3R5bGVzW1wiY2hhdC1ib2R5XCJdfVxyXG4gICAgICAgICAgICAgIHJlZj17c2Nyb2xsUmVmfVxyXG4gICAgICAgICAgICAgIG9uU2Nyb2xsPXsoZSkgPT4gb25DaGF0Qm9keVNjcm9sbChlLmN1cnJlbnRUYXJnZXQpfVxyXG4gICAgICAgICAgICAgIG9uTW91c2VEb3duPXsoKSA9PiBpbnB1dFJlZi5jdXJyZW50Py5ibHVyKCl9XHJcbiAgICAgICAgICAgICAgb25Ub3VjaFN0YXJ0PXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpbnB1dFJlZi5jdXJyZW50Py5ibHVyKCk7XHJcbiAgICAgICAgICAgICAgICBzZXRBdXRvU2Nyb2xsKGZhbHNlKTtcclxuICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAge21lc3NhZ2VzXHJcbiAgICAgICAgICAgICAgICAvLyBUT0RPXHJcbiAgICAgICAgICAgICAgICAvLyAuZmlsdGVyKChtKSA9PiAhbS5pc01jcFJlc3BvbnNlKVxyXG4gICAgICAgICAgICAgICAgLm1hcCgobWVzc2FnZSwgaSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCBpc1VzZXIgPSBtZXNzYWdlLnJvbGUgPT09IFwidXNlclwiO1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCBpc0NvbnRleHQgPSBpIDwgY29udGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNob3dBY3Rpb25zID1cclxuICAgICAgICAgICAgICAgICAgICBpID4gMCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEobWVzc2FnZS5wcmV2aWV3IHx8IG1lc3NhZ2UuY29udGVudC5sZW5ndGggPT09IDApICYmXHJcbiAgICAgICAgICAgICAgICAgICAgIWlzQ29udGV4dDtcclxuICAgICAgICAgICAgICAgICAgY29uc3Qgc2hvd1R5cGluZyA9IG1lc3NhZ2UucHJldmlldyB8fCBtZXNzYWdlLnN0cmVhbWluZztcclxuXHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNob3VsZFNob3dDbGVhckNvbnRleHREaXZpZGVyID1cclxuICAgICAgICAgICAgICAgICAgICBpID09PSBjbGVhckNvbnRleHRJbmRleCAtIDE7XHJcblxyXG4gICAgICAgICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgICAgICAgIDxGcmFnbWVudCBrZXk9e21lc3NhZ2UuaWR9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlzVXNlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBzdHlsZXNbXCJjaGF0LW1lc3NhZ2UtdXNlclwiXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzdHlsZXNbXCJjaGF0LW1lc3NhZ2VcIl1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzW1wiY2hhdC1tZXNzYWdlLWNvbnRhaW5lclwiXX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlc1tcImNoYXQtbWVzc2FnZS1oZWFkZXJcIl19PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlc1tcImNoYXQtbWVzc2FnZS1hdmF0YXJcIl19PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzW1wiY2hhdC1tZXNzYWdlLWVkaXRcIl19PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJY29uQnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPXs8RWRpdEljb24gLz59XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhPXtMb2NhbGUuQ2hhdC5BY3Rpb25zLkVkaXR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXthc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld01lc3NhZ2UgPSBhd2FpdCBzaG93UHJvbXB0KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsZS5DaGF0LkFjdGlvbnMuRWRpdCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRNZXNzYWdlVGV4dENvbnRlbnQobWVzc2FnZSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdDb250ZW50OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNdWx0aW1vZGFsQ29udGVudFtdID0gbmV3TWVzc2FnZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW1hZ2VzID0gZ2V0TWVzc2FnZUltYWdlcyhtZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltYWdlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudCA9IFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IG5ld01lc3NhZ2UgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW1hZ2VzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50LnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImltYWdlX3VybFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZV91cmw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IGltYWdlc1tpXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGF0U3RvcmUudXBkYXRlVGFyZ2V0U2Vzc2lvbihcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXNzaW9uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtID0gc2Vzc2lvbi5tYXNrLmNvbnRleHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbmNhdChzZXNzaW9uLm1lc3NhZ2VzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmluZCgobSkgPT4gbS5pZCA9PT0gbWVzc2FnZS5pZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLmNvbnRlbnQgPSBuZXdDb250ZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L0ljb25CdXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aXNVc2VyID8gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxBdmF0YXIgYXZhdGFyPXtjb25maWcuYXZhdGFyfSAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIDogKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7W1wic3lzdGVtXCJdLmluY2x1ZGVzKG1lc3NhZ2Uucm9sZSkgPyAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxBdmF0YXIgYXZhdGFyPVwiMjY5OS1mZTBmXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgOiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxNYXNrQXZhdGFyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhdGFyPXtzZXNzaW9uLm1hc2suYXZhdGFyfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsPXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubW9kZWwgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24ubWFzay5tb2RlbENvbmZpZy5tb2RlbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHshaXNVc2VyICYmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlc1tcImNoYXQtbW9kZWwtbmFtZVwiXX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge21lc3NhZ2UubW9kZWx9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2hvd0FjdGlvbnMgJiYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzW1wiY2hhdC1tZXNzYWdlLWFjdGlvbnNcIl19PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXNbXCJjaGF0LWlucHV0LWFjdGlvbnNcIl19PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge21lc3NhZ2Uuc3RyZWFtaW5nID8gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Q2hhdEFjdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9e0xvY2FsZS5DaGF0LkFjdGlvbnMuU3RvcH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPXs8U3RvcEljb24gLz59XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uVXNlclN0b3AobWVzc2FnZS5pZCA/PyBpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgOiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPENoYXRBY3Rpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9e0xvY2FsZS5DaGF0LkFjdGlvbnMuUmV0cnl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPXs8UmVzZXRJY29uIC8+fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gb25SZXNlbmQobWVzc2FnZSl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPENoYXRBY3Rpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9e0xvY2FsZS5DaGF0LkFjdGlvbnMuRGVsZXRlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj17PERlbGV0ZUljb24gLz59XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkRlbGV0ZShtZXNzYWdlLmlkID8/IGkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPENoYXRBY3Rpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9e0xvY2FsZS5DaGF0LkFjdGlvbnMuUGlufVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj17PFBpbkljb24gLz59XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBvblBpbk1lc3NhZ2UobWVzc2FnZSl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Q2hhdEFjdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD17TG9jYWxlLkNoYXQuQWN0aW9ucy5Db3B5fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj17PENvcHlJY29uIC8+fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weVRvQ2xpcGJvYXJkKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE1lc3NhZ2VUZXh0Q29udGVudChtZXNzYWdlKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NvbmZpZy50dHNDb25maWcuZW5hYmxlICYmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDaGF0QWN0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVjaFN0YXR1c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBMb2NhbGUuQ2hhdC5BY3Rpb25zLlN0b3BTcGVlY2hcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTG9jYWxlLkNoYXQuQWN0aW9ucy5TcGVlY2hcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlY2hTdGF0dXMgPyAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U3BlYWtTdG9wSWNvbiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgOiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U3BlYWtJY29uIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlbmFpU3BlZWNoKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TWVzc2FnZVRleHRDb250ZW50KG1lc3NhZ2UpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Lz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7bWVzc2FnZT8udG9vbHM/Lmxlbmd0aCA9PSAwICYmIHNob3dUeXBpbmcgJiYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlc1tcImNoYXQtbWVzc2FnZS1zdGF0dXNcIl19PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7TG9jYWxlLkNoYXQuVHlwaW5nfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7LypAdHMtaWdub3JlKi99XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge21lc3NhZ2U/LnRvb2xzPy5sZW5ndGggPiAwICYmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXNbXCJjaGF0LW1lc3NhZ2UtdG9vbHNcIl19PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bWVzc2FnZT8udG9vbHM/Lm1hcCgodG9vbCkgPT4gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT17dG9vbC5pZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPXt0b29sPy5lcnJvck1zZ31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17c3R5bGVzW1wiY2hhdC1tZXNzYWdlLXRvb2xcIl19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3Rvb2wuaXNFcnJvciA9PT0gZmFsc2UgPyAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDb25maXJtSWNvbiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA6IHRvb2wuaXNFcnJvciA9PT0gdHJ1ZSA/IChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPENsb3NlSWNvbiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA6IChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPExvYWRpbmdCdXR0b25JY29uIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3Rvb2w/LmZ1bmN0aW9uPy5uYW1lfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXNbXCJjaGF0LW1lc3NhZ2UtaXRlbVwiXX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8TWFya2Rvd25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PXttZXNzYWdlLnN0cmVhbWluZyA/IFwibG9hZGluZ1wiIDogXCJkb25lXCJ9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ9e2dldE1lc3NhZ2VUZXh0Q29udGVudChtZXNzYWdlKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGluZz17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1lc3NhZ2UucHJldmlldyB8fCBtZXNzYWdlLnN0cmVhbWluZykgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmNvbnRlbnQubGVuZ3RoID09PSAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWlzVXNlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgb25Db250ZXh0TWVudT17KGUpID0+IG9uUmlnaHRDbGljayhlLCBtZXNzYWdlKX0gLy8gaGFyZCB0byB1c2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25Eb3VibGVDbGlja0NhcHR1cmU9eygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTW9iaWxlU2NyZWVuKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VXNlcklucHV0KGdldE1lc3NhZ2VUZXh0Q29udGVudChtZXNzYWdlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTaXplPXtmb250U2l6ZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udEZhbWlseT17Zm9udEZhbWlseX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50UmVmPXtzY3JvbGxSZWZ9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRTaG93PXtpID49IG1lc3NhZ2VzLmxlbmd0aCAtIDZ9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2dldE1lc3NhZ2VJbWFnZXMobWVzc2FnZSkubGVuZ3RoID09IDEgJiYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtzdHlsZXNbXCJjaGF0LW1lc3NhZ2UtaXRlbS1pbWFnZVwiXX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9e2dldE1lc3NhZ2VJbWFnZXMobWVzc2FnZSlbMF19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0PVwiXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Z2V0TWVzc2FnZUltYWdlcyhtZXNzYWdlKS5sZW5ndGggPiAxICYmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17c3R5bGVzW1wiY2hhdC1tZXNzYWdlLWl0ZW0taW1hZ2VzXCJdfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCItLWltYWdlLWNvdW50XCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TWVzc2FnZUltYWdlcyhtZXNzYWdlKS5sZW5ndGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGFzIFJlYWN0LkNTU1Byb3BlcnRpZXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Z2V0TWVzc2FnZUltYWdlcyhtZXNzYWdlKS5tYXAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW1hZ2UsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY2hhdC1tZXNzYWdlLWl0ZW0taW1hZ2UtbXVsdGlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9e2luZGV4fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPXtpbWFnZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cIlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHttZXNzYWdlPy5hdWRpb191cmwgJiYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlc1tcImNoYXQtbWVzc2FnZS1hdWRpb1wiXX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhdWRpbyBzcmM9e21lc3NhZ2UuYXVkaW9fdXJsfSBjb250cm9scyAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlc1tcImNoYXQtbWVzc2FnZS1hY3Rpb24tZGF0ZVwiXX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aXNDb250ZXh0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gTG9jYWxlLkNoYXQuSXNDb250ZXh0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbWVzc2FnZS5kYXRlLnRvTG9jYWxlU3RyaW5nKCl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7c2hvdWxkU2hvd0NsZWFyQ29udGV4dERpdmlkZXIgJiYgPENsZWFyQ29udGV4dERpdmlkZXIgLz59XHJcbiAgICAgICAgICAgICAgICAgICAgPC9GcmFnbWVudD5cclxuICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH0pfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlc1tcImNoYXQtaW5wdXQtcGFuZWxcIl19PlxyXG4gICAgICAgICAgICAgIDxQcm9tcHRIaW50c1xyXG4gICAgICAgICAgICAgICAgcHJvbXB0cz17cHJvbXB0SGludHN9XHJcbiAgICAgICAgICAgICAgICBvblByb21wdFNlbGVjdD17b25Qcm9tcHRTZWxlY3R9XHJcbiAgICAgICAgICAgICAgLz5cclxuXHJcbiAgICAgICAgICAgICAgPENoYXRBY3Rpb25zXHJcbiAgICAgICAgICAgICAgICB1cGxvYWRJbWFnZT17dXBsb2FkSW1hZ2V9XHJcbiAgICAgICAgICAgICAgICBzZXRBdHRhY2hJbWFnZXM9e3NldEF0dGFjaEltYWdlc31cclxuICAgICAgICAgICAgICAgIHNldFVwbG9hZGluZz17c2V0VXBsb2FkaW5nfVxyXG4gICAgICAgICAgICAgICAgc2hvd1Byb21wdE1vZGFsPXsoKSA9PiBzZXRTaG93UHJvbXB0TW9kYWwodHJ1ZSl9XHJcbiAgICAgICAgICAgICAgICBzY3JvbGxUb0JvdHRvbT17c2Nyb2xsVG9Cb3R0b219XHJcbiAgICAgICAgICAgICAgICBoaXRCb3R0b209e2hpdEJvdHRvbX1cclxuICAgICAgICAgICAgICAgIHVwbG9hZGluZz17dXBsb2FkaW5nfVxyXG4gICAgICAgICAgICAgICAgc2hvd1Byb21wdEhpbnRzPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIC8vIENsaWNrIGFnYWluIHRvIGNsb3NlXHJcbiAgICAgICAgICAgICAgICAgIGlmIChwcm9tcHRIaW50cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0UHJvbXB0SGludHMoW10pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgaW5wdXRSZWYuY3VycmVudD8uZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgICAgc2V0VXNlcklucHV0KFwiL1wiKTtcclxuICAgICAgICAgICAgICAgICAgb25TZWFyY2goXCJcIik7XHJcbiAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgc2V0U2hvd1Nob3J0Y3V0S2V5TW9kYWw9e3NldFNob3dTaG9ydGN1dEtleU1vZGFsfVxyXG4gICAgICAgICAgICAgICAgc2V0VXNlcklucHV0PXtzZXRVc2VySW5wdXR9XHJcbiAgICAgICAgICAgICAgICBzZXRTaG93Q2hhdFNpZGVQYW5lbD17c2V0U2hvd0NoYXRTaWRlUGFuZWx9XHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICA8bGFiZWxcclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xzeChzdHlsZXNbXCJjaGF0LWlucHV0LXBhbmVsLWlubmVyXCJdLCB7XHJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZXNbXCJjaGF0LWlucHV0LXBhbmVsLWlubmVyLWF0dGFjaFwiXV06XHJcbiAgICAgICAgICAgICAgICAgICAgYXR0YWNoSW1hZ2VzLmxlbmd0aCAhPT0gMCxcclxuICAgICAgICAgICAgICAgIH0pfVxyXG4gICAgICAgICAgICAgICAgaHRtbEZvcj1cImNoYXQtaW5wdXRcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDx0ZXh0YXJlYVxyXG4gICAgICAgICAgICAgICAgICBpZD1cImNoYXQtaW5wdXRcIlxyXG4gICAgICAgICAgICAgICAgICByZWY9e2lucHV0UmVmfVxyXG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e3N0eWxlc1tcImNoYXQtaW5wdXRcIl19XHJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtMb2NhbGUuQ2hhdC5JbnB1dChzdWJtaXRLZXkpfVxyXG4gICAgICAgICAgICAgICAgICBvbklucHV0PXsoZSkgPT4gb25JbnB1dChlLmN1cnJlbnRUYXJnZXQudmFsdWUpfVxyXG4gICAgICAgICAgICAgICAgICB2YWx1ZT17dXNlcklucHV0fVxyXG4gICAgICAgICAgICAgICAgICBvbktleURvd249e29uSW5wdXRLZXlEb3dufVxyXG4gICAgICAgICAgICAgICAgICBvbkZvY3VzPXtzY3JvbGxUb0JvdHRvbX1cclxuICAgICAgICAgICAgICAgICAgb25DbGljaz17c2Nyb2xsVG9Cb3R0b219XHJcbiAgICAgICAgICAgICAgICAgIG9uUGFzdGU9e2hhbmRsZVBhc3RlfVxyXG4gICAgICAgICAgICAgICAgICByb3dzPXtpbnB1dFJvd3N9XHJcbiAgICAgICAgICAgICAgICAgIGF1dG9Gb2N1cz17YXV0b0ZvY3VzfVxyXG4gICAgICAgICAgICAgICAgICBzdHlsZT17e1xyXG4gICAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiBjb25maWcuZm9udFNpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgZm9udEZhbWlseTogY29uZmlnLmZvbnRGYW1pbHksXHJcbiAgICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAge2F0dGFjaEltYWdlcy5sZW5ndGggIT0gMCAmJiAoXHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXNbXCJhdHRhY2gtaW1hZ2VzXCJdfT5cclxuICAgICAgICAgICAgICAgICAgICB7YXR0YWNoSW1hZ2VzLm1hcCgoaW1hZ2UsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PXtpbmRleH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e3N0eWxlc1tcImF0dGFjaC1pbWFnZVwiXX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT17eyBiYWNrZ3JvdW5kSW1hZ2U6IGB1cmwoXCIke2ltYWdlfVwiKWAgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXNbXCJhdHRhY2gtaW1hZ2UtbWFza1wiXX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RGVsZXRlSW1hZ2VCdXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlSW1hZ2U9eygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBdHRhY2hJbWFnZXMoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2hJbWFnZXMuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICB9KX1cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgPEljb25CdXR0b25cclxuICAgICAgICAgICAgICAgICAgaWNvbj17PFNlbmRXaGl0ZUljb24gLz59XHJcbiAgICAgICAgICAgICAgICAgIHRleHQ9e0xvY2FsZS5DaGF0LlNlbmR9XHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17c3R5bGVzW1wiY2hhdC1pbnB1dC1zZW5kXCJdfVxyXG4gICAgICAgICAgICAgICAgICB0eXBlPVwicHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGRvU3VibWl0KHVzZXJJbnB1dCl9XHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xzeChzdHlsZXNbXCJjaGF0LXNpZGUtcGFuZWxcIl0sIHtcclxuICAgICAgICAgICAgICBbc3R5bGVzW1wibW9iaWxlXCJdXTogaXNNb2JpbGVTY3JlZW4sXHJcbiAgICAgICAgICAgICAgW3N0eWxlc1tcImNoYXQtc2lkZS1wYW5lbC1zaG93XCJdXTogc2hvd0NoYXRTaWRlUGFuZWwsXHJcbiAgICAgICAgICAgIH0pfVxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7c2hvd0NoYXRTaWRlUGFuZWwgJiYgKFxyXG4gICAgICAgICAgICAgIDxSZWFsdGltZUNoYXRcclxuICAgICAgICAgICAgICAgIG9uQ2xvc2U9eygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgc2V0U2hvd0NoYXRTaWRlUGFuZWwoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgIG9uU3RhcnRWb2ljZT17YXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInN0YXJ0IHZvaWNlXCIpO1xyXG4gICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICApfVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICB7c2hvd0V4cG9ydCAmJiAoXHJcbiAgICAgICAgPEV4cG9ydE1lc3NhZ2VNb2RhbCBvbkNsb3NlPXsoKSA9PiBzZXRTaG93RXhwb3J0KGZhbHNlKX0gLz5cclxuICAgICAgKX1cclxuXHJcbiAgICAgIHtpc0VkaXRpbmdNZXNzYWdlICYmIChcclxuICAgICAgICA8RWRpdE1lc3NhZ2VNb2RhbFxyXG4gICAgICAgICAgb25DbG9zZT17KCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc0VkaXRpbmdNZXNzYWdlKGZhbHNlKTtcclxuICAgICAgICAgIH19XHJcbiAgICAgICAgLz5cclxuICAgICAgKX1cclxuXHJcbiAgICAgIHtzaG93U2hvcnRjdXRLZXlNb2RhbCAmJiAoXHJcbiAgICAgICAgPFNob3J0Y3V0S2V5TW9kYWwgb25DbG9zZT17KCkgPT4gc2V0U2hvd1Nob3J0Y3V0S2V5TW9kYWwoZmFsc2UpfSAvPlxyXG4gICAgICApfVxyXG4gICAgPC8+XHJcbiAgKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIENoYXQoKSB7XHJcbiAgY29uc3QgY2hhdFN0b3JlID0gdXNlQ2hhdFN0b3JlKCk7XHJcbiAgY29uc3Qgc2Vzc2lvbiA9IGNoYXRTdG9yZS5jdXJyZW50U2Vzc2lvbigpO1xyXG4gIHJldHVybiA8X0NoYXQga2V5PXtzZXNzaW9uLmlkfT48L19DaGF0PjtcclxufVxyXG4iXSwibmFtZXMiOlsidXNlRGVib3VuY2VkQ2FsbGJhY2siLCJSZWFjdCIsIkZyYWdtZW50IiwidXNlQ2FsbGJhY2siLCJ1c2VFZmZlY3QiLCJ1c2VNZW1vIiwidXNlUmVmIiwidXNlU3RhdGUiLCJTZW5kV2hpdGVJY29uIiwiQnJhaW5JY29uIiwiUmVuYW1lSWNvbiIsIkVkaXRJY29uIiwiRXhwb3J0SWNvbiIsIlJldHVybkljb24iLCJDb3B5SWNvbiIsIlNwZWFrSWNvbiIsIlNwZWFrU3RvcEljb24iLCJMb2FkaW5nSWNvbiIsIkxvYWRpbmdCdXR0b25JY29uIiwiTWFza0ljb24iLCJNYXhJY29uIiwiTWluSWNvbiIsIlJlc2V0SWNvbiIsIlJlbG9hZEljb24iLCJCcmVha0ljb24iLCJTZXR0aW5nc0ljb24iLCJEZWxldGVJY29uIiwiUGluSWNvbiIsIkNvbmZpcm1JY29uIiwiQ2xvc2VJY29uIiwiQ2FuY2VsSWNvbiIsIkltYWdlSWNvbiIsIkxpZ2h0SWNvbiIsIkRhcmtJY29uIiwiQXV0b0ljb24iLCJCb3R0b21JY29uIiwiU3RvcEljb24iLCJSb2JvdEljb24iLCJTaXplSWNvbiIsIlF1YWxpdHlJY29uIiwiU3R5bGVJY29uIiwiUGx1Z2luSWNvbiIsIlNob3J0Y3V0a2V5SWNvbiIsIk1jcFRvb2xJY29uIiwiSGVhZHBob25lSWNvbiIsIkJPVF9IRUxMTyIsImNyZWF0ZU1lc3NhZ2UiLCJERUZBVUxUX1RPUElDIiwiU3VibWl0S2V5IiwiVGhlbWUiLCJ1c2VBY2Nlc3NTdG9yZSIsInVzZUFwcENvbmZpZyIsInVzZUNoYXRTdG9yZSIsInVzZVBsdWdpblN0b3JlIiwiYXV0b0dyb3dUZXh0QXJlYSIsImNvcHlUb0NsaXBib2FyZCIsImdldE1lc3NhZ2VJbWFnZXMiLCJnZXRNZXNzYWdlVGV4dENvbnRlbnQiLCJpc0RhbGxlMyIsImlzVmlzaW9uTW9kZWwiLCJzYWZlTG9jYWxTdG9yYWdlIiwiZ2V0TW9kZWxTaXplcyIsInN1cHBvcnRzQ3VzdG9tU2l6ZSIsInVzZU1vYmlsZVNjcmVlbiIsInNlbGVjdE9yQ29weSIsInNob3dQbHVnaW5zIiwidXBsb2FkSW1hZ2UiLCJ1cGxvYWRJbWFnZVJlbW90ZSIsImR5bmFtaWMiLCJDaGF0Q29udHJvbGxlclBvb2wiLCJ1c2VQcm9tcHRTdG9yZSIsIkxvY2FsZSIsIkljb25CdXR0b24iLCJzdHlsZXMiLCJMaXN0IiwiTGlzdEl0ZW0iLCJNb2RhbCIsIlNlbGVjdG9yIiwic2hvd0NvbmZpcm0iLCJzaG93UHJvbXB0Iiwic2hvd1RvYXN0IiwidXNlTmF2aWdhdGUiLCJDSEFUX1BBR0VfU0laRSIsIkRFRkFVTFRfVFRTX0VOR0lORSIsIk1vZGVsUHJvdmlkZXIiLCJQYXRoIiwiUkVRVUVTVF9USU1FT1VUX01TIiwiU2VydmljZVByb3ZpZGVyIiwiVU5GSU5JU0hFRF9JTlBVVCIsIkF2YXRhciIsIkNvbnRleHRQcm9tcHRzIiwiTWFza0F2YXRhciIsIk1hc2tDb25maWciLCJ1c2VNYXNrU3RvcmUiLCJDaGF0Q29tbWFuZFByZWZpeCIsInVzZUNoYXRDb21tYW5kIiwidXNlQ29tbWFuZCIsInByZXR0eU9iamVjdCIsIkV4cG9ydE1lc3NhZ2VNb2RhbCIsImdldENsaWVudENvbmZpZyIsInVzZUFsbE1vZGVscyIsIkNsaWVudEFwaSIsImNyZWF0ZVRUU1BsYXllciIsIk1zRWRnZVRUUyIsIk9VVFBVVF9GT1JNQVQiLCJpc0VtcHR5IiwiZ2V0TW9kZWxQcm92aWRlciIsIlJlYWx0aW1lQ2hhdCIsImNsc3giLCJnZXRBdmFpbGFibGVDbGllbnRzQ291bnQiLCJpc01jcEVuYWJsZWQiLCJsb2NhbFN0b3JhZ2UiLCJ0dHNQbGF5ZXIiLCJNYXJrZG93biIsImxvYWRpbmciLCJNQ1BBY3Rpb24iLCJuYXZpZ2F0ZSIsImNvdW50Iiwic2V0Q291bnQiLCJtY3BFbmFibGVkIiwic2V0TWNwRW5hYmxlZCIsImNoZWNrTWNwU3RhdHVzIiwiZW5hYmxlZCIsIkNoYXRBY3Rpb24iLCJvbkNsaWNrIiwiTWNwTWFya2V0IiwidGV4dCIsImljb24iLCJTZXNzaW9uQ29uZmlnTW9kZWwiLCJwcm9wcyIsImNoYXRTdG9yZSIsInNlc3Npb24iLCJjdXJyZW50U2Vzc2lvbiIsIm1hc2tTdG9yZSIsImRpdiIsImNsYXNzTmFtZSIsInRpdGxlIiwiQ29udGV4dCIsIkVkaXQiLCJvbkNsb3NlIiwiYWN0aW9ucyIsImJvcmRlcmVkIiwiQ2hhdCIsIkNvbmZpZyIsIlJlc2V0IiwiTWVtb3J5IiwiUmVzZXRDb25maXJtIiwidXBkYXRlVGFyZ2V0U2Vzc2lvbiIsIm1lbW9yeVByb21wdCIsIlNhdmVBcyIsIk1hc2tzIiwic2V0VGltZW91dCIsImNyZWF0ZSIsIm1hc2siLCJ1cGRhdGVNYXNrIiwidXBkYXRlciIsInNob3VsZFN5bmNGcm9tR2xvYmFsIiwiZXh0cmFMaXN0SXRlbXMiLCJtb2RlbENvbmZpZyIsInNlbmRNZW1vcnkiLCJUaXRsZSIsImxhc3RTdW1tYXJpemVJbmRleCIsIm1lc3NhZ2VzIiwibGVuZ3RoIiwic3ViVGl0bGUiLCJFbXB0eUNvbnRlbnQiLCJQcm9tcHRUb2FzdCIsImNvbnRleHQiLCJyb2xlIiwic2V0U2hvd01vZGFsIiwic3BhbiIsIlRvYXN0Iiwic2hvd01vZGFsIiwidXNlU3VibWl0SGFuZGxlciIsImNvbmZpZyIsInN1Ym1pdEtleSIsImlzQ29tcG9zaW5nIiwib25Db21wb3NpdGlvblN0YXJ0IiwiY3VycmVudCIsIm9uQ29tcG9zaXRpb25FbmQiLCJ3aW5kb3ciLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInNob3VsZFN1Ym1pdCIsImUiLCJrZXlDb2RlIiwia2V5IiwibmF0aXZlRXZlbnQiLCJBbHRFbnRlciIsImFsdEtleSIsIkN0cmxFbnRlciIsImN0cmxLZXkiLCJTaGlmdEVudGVyIiwic2hpZnRLZXkiLCJNZXRhRW50ZXIiLCJtZXRhS2V5IiwiRW50ZXIiLCJQcm9tcHRIaW50cyIsIm5vUHJvbXB0cyIsInByb21wdHMiLCJzZWxlY3RJbmRleCIsInNldFNlbGVjdEluZGV4Iiwic2VsZWN0ZWRSZWYiLCJvbktleURvd24iLCJjaGFuZ2VJbmRleCIsImRlbHRhIiwic3RvcFByb3BhZ2F0aW9uIiwicHJldmVudERlZmF1bHQiLCJuZXh0SW5kZXgiLCJNYXRoIiwibWF4IiwibWluIiwic2Nyb2xsSW50b1ZpZXciLCJibG9jayIsInNlbGVjdGVkUHJvbXB0IiwiYXQiLCJvblByb21wdFNlbGVjdCIsIm1hcCIsInByb21wdCIsImkiLCJyZWYiLCJvbk1vdXNlRW50ZXIiLCJjb250ZW50IiwidG9TdHJpbmciLCJDbGVhckNvbnRleHREaXZpZGVyIiwiY2xlYXJDb250ZXh0SW5kZXgiLCJ1bmRlZmluZWQiLCJDbGVhciIsIlJldmVydCIsImljb25SZWYiLCJ0ZXh0UmVmIiwid2lkdGgiLCJzZXRXaWR0aCIsImZ1bGwiLCJ1cGRhdGVXaWR0aCIsImdldFdpZHRoIiwiZG9tIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwidGV4dFdpZHRoIiwiaWNvbldpZHRoIiwib25Ub3VjaFN0YXJ0Iiwic3R5bGUiLCJ1c2VTY3JvbGxUb0JvdHRvbSIsInNjcm9sbFJlZiIsImRldGFjaCIsImF1dG9TY3JvbGwiLCJzZXRBdXRvU2Nyb2xsIiwic2Nyb2xsRG9tVG9Cb3R0b20iLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJzY3JvbGxUbyIsInNjcm9sbEhlaWdodCIsImxhc3RNZXNzYWdlc0xlbmd0aCIsIkNoYXRBY3Rpb25zIiwicGx1Z2luU3RvcmUiLCJ0aGVtZSIsIm5leHRUaGVtZSIsInRoZW1lcyIsIkF1dG8iLCJMaWdodCIsIkRhcmsiLCJ0aGVtZUluZGV4IiwiaW5kZXhPZiIsInVwZGF0ZSIsImNvdWxkU3RvcCIsImhhc1BlbmRpbmciLCJzdG9wQWxsIiwiY3VycmVudE1vZGVsIiwibW9kZWwiLCJjdXJyZW50UHJvdmlkZXJOYW1lIiwicHJvdmlkZXJOYW1lIiwiT3BlbkFJIiwiYWxsTW9kZWxzIiwibW9kZWxzIiwiZmlsdGVyZWRNb2RlbHMiLCJmaWx0ZXIiLCJtIiwiYXZhaWxhYmxlIiwiZGVmYXVsdE1vZGVsIiwiZmluZCIsImlzRGVmYXVsdCIsImFyciIsImN1cnJlbnRNb2RlbE5hbWUiLCJuYW1lIiwicHJvdmlkZXIiLCJkaXNwbGF5TmFtZSIsInNob3dNb2RlbFNlbGVjdG9yIiwic2V0U2hvd01vZGVsU2VsZWN0b3IiLCJzaG93UGx1Z2luU2VsZWN0b3IiLCJzZXRTaG93UGx1Z2luU2VsZWN0b3IiLCJzaG93VXBsb2FkSW1hZ2UiLCJzZXRTaG93VXBsb2FkSW1hZ2UiLCJzaG93U2l6ZVNlbGVjdG9yIiwic2V0U2hvd1NpemVTZWxlY3RvciIsInNob3dRdWFsaXR5U2VsZWN0b3IiLCJzZXRTaG93UXVhbGl0eVNlbGVjdG9yIiwic2hvd1N0eWxlU2VsZWN0b3IiLCJzZXRTaG93U3R5bGVTZWxlY3RvciIsIm1vZGVsU2l6ZXMiLCJkYWxsZTNRdWFsaXR5cyIsImRhbGxlM1N0eWxlcyIsImN1cnJlbnRTaXplIiwic2l6ZSIsImN1cnJlbnRRdWFsaXR5IiwicXVhbGl0eSIsImN1cnJlbnRTdHlsZSIsImlzTW9iaWxlU2NyZWVuIiwic2hvdyIsInNldEF0dGFjaEltYWdlcyIsInNldFVwbG9hZGluZyIsImlzVW5hdmFpbGFibGVNb2RlbCIsInNvbWUiLCJuZXh0TW9kZWwiLCJJbnB1dEFjdGlvbnMiLCJTdG9wIiwiaGl0Qm90dG9tIiwic2Nyb2xsVG9Cb3R0b20iLCJUb0JvdHRvbSIsInNob3dQcm9tcHRNb2RhbCIsIlNldHRpbmdzIiwiVXBsb2FkSW1hZ2UiLCJ1cGxvYWRpbmciLCJkZWZhdWx0U2VsZWN0ZWRWYWx1ZSIsIml0ZW1zIiwidmFsdWUiLCJvblNlbGVjdGlvbiIsInMiLCJzeW5jR2xvYmFsQ29uZmlnIiwic2VsZWN0ZWRNb2RlbCIsInEiLCJnZXRBbGwiLCJQbHVnaW5zIiwiUGx1Z2luIiwiTmFtZSIsIm11bHRpcGxlIiwicGx1Z2luIiwiaXRlbSIsInZlcnNpb24iLCJpZCIsInNldFNob3dTaG9ydGN1dEtleU1vZGFsIiwiU2hvcnRjdXRLZXkiLCJyZWFsdGltZUNvbmZpZyIsImVuYWJsZSIsInNldFNob3dDaGF0U2lkZVBhbmVsIiwiRWRpdE1lc3NhZ2VNb2RhbCIsInNldE1lc3NhZ2VzIiwic2xpY2UiLCJFZGl0TWVzc2FnZSIsIlVJIiwiQ2FuY2VsIiwidHlwZSIsIkNvbmZpcm0iLCJUb3BpYyIsIlN1YlRpdGxlIiwiaW5wdXQiLCJ0b3BpYyIsIm9uSW5wdXQiLCJjdXJyZW50VGFyZ2V0IiwidXBkYXRlQ29udGV4dCIsIm5ld01lc3NhZ2VzIiwiRGVsZXRlSW1hZ2VCdXR0b24iLCJkZWxldGVJbWFnZSIsIlNob3J0Y3V0S2V5TW9kYWwiLCJpc01hYyIsIm5hdmlnYXRvciIsInBsYXRmb3JtIiwidG9VcHBlckNhc2UiLCJzaG9ydGN1dHMiLCJuZXdDaGF0Iiwia2V5cyIsImZvY3VzSW5wdXQiLCJjb3B5TGFzdENvZGUiLCJjb3B5TGFzdE1lc3NhZ2UiLCJzaG93U2hvcnRjdXRLZXkiLCJjbGVhckNvbnRleHQiLCJzaG9ydGN1dCIsImluZGV4IiwiX0NoYXQiLCJmb250U2l6ZSIsImZvbnRGYW1pbHkiLCJzaG93RXhwb3J0Iiwic2V0U2hvd0V4cG9ydCIsImlucHV0UmVmIiwidXNlcklucHV0Iiwic2V0VXNlcklucHV0IiwiaXNMb2FkaW5nIiwic2V0SXNMb2FkaW5nIiwiaXNTY3JvbGxlZFRvQm90dG9tIiwiYWJzIiwic2Nyb2xsVG9wIiwiY2xpZW50SGVpZ2h0IiwiaXNBdHRhY2hXaXRoVG9wIiwibGFzdE1lc3NhZ2UiLCJsYXN0RWxlbWVudENoaWxkIiwidG9wRGlzdGFuY2UiLCJ0b3AiLCJpc1R5cGluZyIsInNldEhpdEJvdHRvbSIsImF0dGFjaEltYWdlcyIsInByb21wdFN0b3JlIiwicHJvbXB0SGludHMiLCJzZXRQcm9tcHRIaW50cyIsIm9uU2VhcmNoIiwibWF0Y2hlZFByb21wdHMiLCJzZWFyY2giLCJsZWFkaW5nIiwidHJhaWxpbmciLCJpbnB1dFJvd3MiLCJzZXRJbnB1dFJvd3MiLCJtZWFzdXJlIiwicm93cyIsIk51bWJlciIsImNoYXRDb21tYW5kcyIsIm5ldyIsIm5ld1Nlc3Npb24iLCJuZXdtIiwiTmV3Q2hhdCIsInByZXYiLCJuZXh0U2Vzc2lvbiIsIm5leHQiLCJjbGVhciIsImZvcmsiLCJmb3JrU2Vzc2lvbiIsImRlbCIsImRlbGV0ZVNlc3Npb24iLCJjdXJyZW50U2Vzc2lvbkluZGV4IiwiU0VBUkNIX1RFWFRfTElNSVQiLCJuIiwidHJpbSIsIm1hdGNoIiwiZGlzYWJsZVByb21wdEhpbnQiLCJzdGFydHNXaXRoIiwic2VhcmNoVGV4dCIsImRvU3VibWl0IiwibWF0Y2hDb21tYW5kIiwibWF0Y2hlZCIsImludm9rZSIsIm9uVXNlcklucHV0IiwidGhlbiIsInNldExhc3RJbnB1dCIsImZvY3VzIiwibWF0Y2hlZENoYXRDb21tYW5kIiwib25Vc2VyU3RvcCIsIm1lc3NhZ2VJZCIsInN0b3AiLCJzdG9wVGltaW5nIiwiRGF0ZSIsIm5vdyIsImZvckVhY2giLCJpc0Vycm9yIiwiZGF0ZSIsImdldFRpbWUiLCJzdHJlYW1pbmciLCJlcnJvciIsIm1lc3NhZ2UiLCJjb25zb2xlIiwibG9nIiwib25JbnB1dEtleURvd24iLCJsYXN0SW5wdXQiLCJvblJpZ2h0Q2xpY2siLCJkZWxldGVNZXNzYWdlIiwibXNnSWQiLCJvbkRlbGV0ZSIsIm9uUmVzZW5kIiwicmVzZW5kaW5nSW5kZXgiLCJmaW5kSW5kZXgiLCJ1c2VyTWVzc2FnZSIsImJvdE1lc3NhZ2UiLCJ0ZXh0Q29udGVudCIsImltYWdlcyIsIm9uUGluTWVzc2FnZSIsInB1c2giLCJBY3Rpb25zIiwiUGluVG9hc3RDb250ZW50IiwiUGluVG9hc3RBY3Rpb24iLCJzZXRTaG93UHJvbXB0TW9kYWwiLCJhY2Nlc3NTdG9yZSIsInNwZWVjaFN0YXR1cyIsInNldFNwZWVjaFN0YXR1cyIsInNwZWVjaExvYWRpbmciLCJzZXRTcGVlY2hMb2FkaW5nIiwib3BlbmFpU3BlZWNoIiwiYXBpIiwiR1BUIiwiZ2V0U3RhdGUiLCJpbml0IiwiYXVkaW9CdWZmZXIiLCJtYXJrZG93blRvVHh0IiwicmVxdWlyZSIsInR0c0NvbmZpZyIsImVuZ2luZSIsImVkZ2VWb2ljZU5hbWUiLCJ0dHMiLCJzZXRNZXRhZGF0YSIsIkFVRElPXzI0S0haXzk2S0JJVFJBVEVfTU9OT19NUDMiLCJ0b0FycmF5QnVmZmVyIiwibGxtIiwic3BlZWNoIiwidm9pY2UiLCJzcGVlZCIsInBsYXkiLCJjYXRjaCIsImZpbmFsbHkiLCJoaWRlQ29udGV4dCIsImNvcGllZEhlbGxvIiwiT2JqZWN0IiwiYXNzaWduIiwiaXNBdXRob3JpemVkIiwiRXJyb3IiLCJVbmF1dGhvcml6ZWQiLCJyZW5kZXJNZXNzYWdlcyIsImNvbmNhdCIsInByZXZpZXciLCJzZW5kUHJldmlld0J1YmJsZSIsIm1zZ1JlbmRlckluZGV4IiwiX3NldE1zZ1JlbmRlckluZGV4Iiwic2V0TXNnUmVuZGVySW5kZXgiLCJuZXdJbmRleCIsImVuZFJlbmRlckluZGV4Iiwib25DaGF0Qm9keVNjcm9sbCIsImJvdHRvbUhlaWdodCIsImVkZ2VUaHJlc2hvbGQiLCJpc1RvdWNoVG9wRWRnZSIsImlzVG91Y2hCb3R0b21FZGdlIiwiaXNIaXRCb3R0b20iLCJwcmV2UGFnZU1zZ0luZGV4IiwibmV4dFBhZ2VNc2dJbmRleCIsImNsaWVudENvbmZpZyIsImF1dG9Gb2N1cyIsInNob3dNYXhJY29uIiwiaXNBcHAiLCJmaWxsIiwic3VibWl0IiwiY29kZSIsImRpc2FibGVGYXN0TGluayIsIlVSTENvbW1hbmQiLCJDb2RlIiwicmVzIiwiYWNjZXNzIiwiYWNjZXNzQ29kZSIsInNldHRpbmdzIiwicGF5bG9hZCIsIkpTT04iLCJwYXJzZSIsInVybCIsInN0cmluZ2lmeSIsIm9wZW5haUFwaUtleSIsIm9wZW5haVVybCIsInVzZUN1c3RvbUNvbmZpZyIsImlzRWRpdGluZ01lc3NhZ2UiLCJzZXRJc0VkaXRpbmdNZXNzYWdlIiwibWF5QmVVbmZpbmlzaGVkSW5wdXQiLCJnZXRJdGVtIiwicmVtb3ZlSXRlbSIsInNldEl0ZW0iLCJoYW5kbGVQYXN0ZSIsImV2ZW50IiwiY2xpcGJvYXJkRGF0YSIsImtpbmQiLCJmaWxlIiwiZ2V0QXNGaWxlIiwiUHJvbWlzZSIsInJlaiIsImltYWdlc0RhdGEiLCJkYXRhVXJsIiwiaW1hZ2VzTGVuZ3RoIiwic3BsaWNlIiwiZmlsZUlucHV0IiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiYWNjZXB0Iiwib25jaGFuZ2UiLCJmaWxlcyIsInRhcmdldCIsImNsaWNrIiwic2hvd1Nob3J0Y3V0S2V5TW9kYWwiLCJoYW5kbGVLZXlEb3duIiwidG9Mb3dlckNhc2UiLCJjb3B5Q29kZUJ1dHRvbiIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJsYXN0Tm9uVXNlck1lc3NhZ2UiLCJwb3AiLCJsYXN0TWVzc2FnZUNvbnRlbnQiLCJzaG93Q2hhdFNpZGVQYW5lbCIsImNoYXQiLCJkYXRhLXRhdXJpLWRyYWctcmVnaW9uIiwiQ2hhdExpc3QiLCJIb21lIiwib25DbGlja0NhcHR1cmUiLCJSZWZyZXNoVGl0bGUiLCJSZWZyZXNoVG9hc3QiLCJzdW1tYXJpemVTZXNzaW9uIiwiYXJpYSIsIkV4cG9ydCIsInRpZ2h0Qm9yZGVyIiwiRnVsbFNjcmVlbiIsIm9uU2Nyb2xsIiwib25Nb3VzZURvd24iLCJibHVyIiwiaXNVc2VyIiwiaXNDb250ZXh0Iiwic2hvd0FjdGlvbnMiLCJzaG93VHlwaW5nIiwic2hvdWxkU2hvd0NsZWFyQ29udGV4dERpdmlkZXIiLCJuZXdNZXNzYWdlIiwibmV3Q29udGVudCIsImltYWdlX3VybCIsImF2YXRhciIsImluY2x1ZGVzIiwiUmV0cnkiLCJEZWxldGUiLCJQaW4iLCJDb3B5IiwiU3RvcFNwZWVjaCIsIlNwZWVjaCIsInRvb2xzIiwiVHlwaW5nIiwidG9vbCIsImVycm9yTXNnIiwiZnVuY3Rpb24iLCJvbkRvdWJsZUNsaWNrQ2FwdHVyZSIsInBhcmVudFJlZiIsImRlZmF1bHRTaG93IiwiaW1nIiwic3JjIiwiYWx0IiwiaW1hZ2UiLCJhdWRpb191cmwiLCJhdWRpbyIsImNvbnRyb2xzIiwiSXNDb250ZXh0IiwidG9Mb2NhbGVTdHJpbmciLCJzaG93UHJvbXB0SGludHMiLCJsYWJlbCIsImh0bWxGb3IiLCJ0ZXh0YXJlYSIsInBsYWNlaG9sZGVyIiwiSW5wdXQiLCJvbkZvY3VzIiwib25QYXN0ZSIsImJhY2tncm91bmRJbWFnZSIsIl8iLCJTZW5kIiwib25TdGFydFZvaWNlIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/components/chat.tsx\n"));
/***/ })
});