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.
22 lines
352 KiB
JavaScript
22 lines
352 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_61__ = __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_max_svg__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../icons/max.svg */ \"(app-pages-browser)/./app/icons/max.svg\");\n/* harmony import */ var _icons_min_svg__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../icons/min.svg */ \"(app-pages-browser)/./app/icons/min.svg\");\n/* harmony import */ var _icons_reload_svg__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../icons/reload.svg */ \"(app-pages-browser)/./app/icons/reload.svg\");\n/* harmony import */ var _icons_break_svg__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../icons/break.svg */ \"(app-pages-browser)/./app/icons/break.svg\");\n/* harmony import */ var _icons_chat_settings_svg__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../icons/chat-settings.svg */ \"(app-pages-browser)/./app/icons/chat-settings.svg\");\n/* harmony import */ var _icons_clear_svg__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../icons/clear.svg */ \"(app-pages-browser)/./app/icons/clear.svg\");\n/* harmony import */ var _icons_pin_svg__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../icons/pin.svg */ \"(app-pages-browser)/./app/icons/pin.svg\");\n/* harmony import */ var _icons_confirm_svg__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../icons/confirm.svg */ \"(app-pages-browser)/./app/icons/confirm.svg\");\n/* harmony import */ var _icons_close_svg__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../icons/close.svg */ \"(app-pages-browser)/./app/icons/close.svg\");\n/* harmony import */ var _icons_cancel_svg__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../icons/cancel.svg */ \"(app-pages-browser)/./app/icons/cancel.svg\");\n/* harmony import */ var _icons_image_svg__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../icons/image.svg */ \"(app-pages-browser)/./app/icons/image.svg\");\n/* harmony import */ var _icons_light_svg__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../icons/light.svg */ \"(app-pages-browser)/./app/icons/light.svg\");\n/* harmony import */ var _icons_dark_svg__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../icons/dark.svg */ \"(app-pages-browser)/./app/icons/dark.svg\");\n/* harmony import */ var _icons_auto_svg__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../icons/auto.svg */ \"(app-pages-browser)/./app/icons/auto.svg\");\n/* harmony import */ var _icons_bottom_svg__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../icons/bottom.svg */ \"(app-pages-browser)/./app/icons/bottom.svg\");\n/* harmony import */ var _icons_pause_svg__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../icons/pause.svg */ \"(app-pages-browser)/./app/icons/pause.svg\");\n/* harmony import */ var _icons_size_svg__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../icons/size.svg */ \"(app-pages-browser)/./app/icons/size.svg\");\n/* harmony import */ var _icons_hd_svg__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ../icons/hd.svg */ \"(app-pages-browser)/./app/icons/hd.svg\");\n/* harmony import */ var _icons_palette_svg__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ../icons/palette.svg */ \"(app-pages-browser)/./app/icons/palette.svg\");\n/* harmony import */ var _icons_plugin_svg__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ../icons/plugin.svg */ \"(app-pages-browser)/./app/icons/plugin.svg\");\n/* harmony import */ var _icons_shortcutkey_svg__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ../icons/shortcutkey.svg */ \"(app-pages-browser)/./app/icons/shortcutkey.svg\");\n/* harmony import */ var _icons_tool_svg__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ../icons/tool.svg */ \"(app-pages-browser)/./app/icons/tool.svg\");\n/* harmony import */ var _icons_headphone_svg__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ../icons/headphone.svg */ \"(app-pages-browser)/./app/icons/headphone.svg\");\n/* harmony import */ var _store__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ../store */ \"(app-pages-browser)/./app/store/index.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ../utils */ \"(app-pages-browser)/./app/utils.ts\");\n/* harmony import */ var _app_utils_chat__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! @/app/utils/chat */ \"(app-pages-browser)/./app/utils/chat.ts\");\n/* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! next/dynamic */ \"(app-pages-browser)/./node_modules/next/dist/api/app-dynamic.js\");\n/* harmony import */ var _client_controller__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ../client/controller */ \"(app-pages-browser)/./app/client/controller.ts\");\n/* harmony import */ var _store_prompt__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ../store/prompt */ \"(app-pages-browser)/./app/store/prompt.ts\");\n/* harmony import */ var _locales__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ../locales */ \"(app-pages-browser)/./app/locales/index.ts\");\n/* harmony import */ var _button__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ./button */ \"(app-pages-browser)/./app/components/button.tsx\");\n/* harmony import */ var _chat_module_scss__WEBPACK_IMPORTED_MODULE_60__ = __webpack_require__(/*! ./chat.module.scss */ \"(app-pages-browser)/./app/components/chat.module.scss\");\n/* harmony import */ var _chat_module_scss__WEBPACK_IMPORTED_MODULE_60___default = /*#__PURE__*/__webpack_require__.n(_chat_module_scss__WEBPACK_IMPORTED_MODULE_60__);\n/* harmony import */ var _ui_lib__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ./ui-lib */ \"(app-pages-browser)/./app/components/ui-lib.tsx\");\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_59__ = __webpack_require__(/*! react-router-dom */ \"(app-pages-browser)/./node_modules/react-router/dist/index.js\");\n/* harmony import */ var _constant__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ../constant */ \"(app-pages-browser)/./app/constant.ts\");\n/* harmony import */ var _emoji__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ./emoji */ \"(app-pages-browser)/./app/components/emoji.tsx\");\n/* harmony import */ var _mask__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! ./mask */ \"(app-pages-browser)/./app/components/mask.tsx\");\n/* harmony import */ var _store_mask__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! ../store/mask */ \"(app-pages-browser)/./app/store/mask.ts\");\n/* harmony import */ var _command__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! ../command */ \"(app-pages-browser)/./app/command.ts\");\n/* harmony import */ var _utils_format__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! ../utils/format */ \"(app-pages-browser)/./app/utils/format.ts\");\n/* harmony import */ var _exporter__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(/*! ./exporter */ \"(app-pages-browser)/./app/components/exporter.tsx\");\n/* harmony import */ var _config_client__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(/*! ../config/client */ \"(app-pages-browser)/./app/config/client.ts\");\n/* harmony import */ var _utils_hooks__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(/*! ../utils/hooks */ \"(app-pages-browser)/./app/utils/hooks.ts\");\n/* harmony import */ var _client_api__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(/*! ../client/api */ \"(app-pages-browser)/./app/client/api.ts\");\n/* harmony import */ var _utils_audio__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(/*! ../utils/audio */ \"(app-pages-browser)/./app/utils/audio.ts\");\n/* harmony import */ var _utils_ms_edge_tts__WEBPACK_IMPORTED_MODULE_55__ = __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_62__ = __webpack_require__(/*! __barrel_optimize__?names=isEmpty!=!lodash-es */ \"(app-pages-browser)/./node_modules/lodash-es/isEmpty.js\");\n/* harmony import */ var _app_components_realtime_chat__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(/*! @/app/components/realtime-chat */ \"(app-pages-browser)/./app/components/realtime-chat/index.ts\");\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(/*! clsx */ \"(app-pages-browser)/./node_modules/clsx/dist/clsx.mjs\");\n/* harmony import */ var _mcp_actions__WEBPACK_IMPORTED_MODULE_58__ = __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\nconst localStorage = (0,_utils__WEBPACK_IMPORTED_MODULE_36__.safeLocalStorage)();\nconst ttsPlayer = (0,_utils_audio__WEBPACK_IMPORTED_MODULE_54__.createTTSPlayer)();\nconst Markdown = (0,next_dynamic__WEBPACK_IMPORTED_MODULE_38__[\"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_59__.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_58__.isMcpEnabled)();\n setMcpEnabled(enabled);\n if (enabled) {\n const count = await (0,_mcp_actions__WEBPACK_IMPORTED_MODULE_58__.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_44__.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_33__[\"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_59__.useNavigate\n ];\n});\n_c1 = MCPAction;\nfunction SessionConfigModel(props) {\n _s1();\n const chatStore = (0,_store__WEBPACK_IMPORTED_MODULE_35__.useChatStore)();\n const session = chatStore.currentSession();\n const maskStore = (0,_store_mask__WEBPACK_IMPORTED_MODULE_47__.useMaskStore)();\n const navigate = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_59__.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_43__.Modal, {\n title: _locales__WEBPACK_IMPORTED_MODULE_41__[\"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_42__.IconButton, {\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_reload_svg__WEBPACK_IMPORTED_MODULE_14__[\"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_41__[\"default\"].Chat.Config.Reset,\n onClick: async ()=>{\n if (await (0,_ui_lib__WEBPACK_IMPORTED_MODULE_43__.showConfirm)(_locales__WEBPACK_IMPORTED_MODULE_41__[\"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_42__.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_41__[\"default\"].Chat.Config.SaveAs,\n onClick: ()=>{\n navigate(_constant__WEBPACK_IMPORTED_MODULE_44__.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_46__.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_43__.ListItem, {\n className: \"copyable\",\n title: \"\".concat(_locales__WEBPACK_IMPORTED_MODULE_41__[\"default\"].Memory.Title, \" (\").concat(session.lastSummarizeIndex, \" of \").concat(session.messages.length, \")\"),\n subTitle: session.memoryPrompt || _locales__WEBPACK_IMPORTED_MODULE_41__[\"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_35__.useChatStore,\n _store_mask__WEBPACK_IMPORTED_MODULE_47__.useMaskStore,\n react_router_dom__WEBPACK_IMPORTED_MODULE_59__.useNavigate\n ];\n});\n_c2 = SessionConfigModel;\nfunction PromptToast(props) {\n _s2();\n const chatStore = (0,_store__WEBPACK_IMPORTED_MODULE_35__.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_60___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_57__[\"default\"])((_chat_module_scss__WEBPACK_IMPORTED_MODULE_60___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_60___default()[\"prompt-toast-content\"]),\n children: _locales__WEBPACK_IMPORTED_MODULE_41__[\"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_35__.useChatStore\n ];\n});\n_c3 = PromptToast;\nfunction useSubmitHandler() {\n _s3();\n const config = (0,_store__WEBPACK_IMPORTED_MODULE_35__.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_35__.SubmitKey.AltEnter && e.altKey || config.submitKey === _store__WEBPACK_IMPORTED_MODULE_35__.SubmitKey.CtrlEnter && e.ctrlKey || config.submitKey === _store__WEBPACK_IMPORTED_MODULE_35__.SubmitKey.ShiftEnter && e.shiftKey || config.submitKey === _store__WEBPACK_IMPORTED_MODULE_35__.SubmitKey.MetaEnter && e.metaKey || config.submitKey === _store__WEBPACK_IMPORTED_MODULE_35__.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_35__.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_60___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_57__[\"default\"])((_chat_module_scss__WEBPACK_IMPORTED_MODULE_60___default()[\"prompt-hint\"]), {\n [(_chat_module_scss__WEBPACK_IMPORTED_MODULE_60___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_60___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_60___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_35__.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_60___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_60___default()[\"clear-context-tips\"]),\n children: _locales__WEBPACK_IMPORTED_MODULE_41__[\"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_60___default()[\"clear-context-revert-btn\"]),\n children: _locales__WEBPACK_IMPORTED_MODULE_41__[\"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_35__.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_57__[\"default\"])((_chat_module_scss__WEBPACK_IMPORTED_MODULE_60___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_60___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_60___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_35__.useAppConfig)();\n const navigate = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_59__.useNavigate)();\n const chatStore = (0,_store__WEBPACK_IMPORTED_MODULE_35__.useChatStore)();\n const pluginStore = (0,_store__WEBPACK_IMPORTED_MODULE_35__.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_35__.Theme.Auto,\n _store__WEBPACK_IMPORTED_MODULE_35__.Theme.Light,\n _store__WEBPACK_IMPORTED_MODULE_35__.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_39__.ChatControllerPool.hasPending();\n const stopAll = ()=>_client_controller__WEBPACK_IMPORTED_MODULE_39__.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_44__.ServiceProvider.OpenAI;\n const allModels = (0,_utils_hooks__WEBPACK_IMPORTED_MODULE_52__.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_36__.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_36__.useMobileScreen)();\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n const show = (0,_utils__WEBPACK_IMPORTED_MODULE_36__.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_43__.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_60___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_41__[\"default\"].Chat.InputActions.Stop,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_pause_svg__WEBPACK_IMPORTED_MODULE_27__[\"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_41__[\"default\"].Chat.InputActions.ToBottom,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_bottom_svg__WEBPACK_IMPORTED_MODULE_26__[\"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_41__[\"default\"].Chat.InputActions.Settings,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_chat_settings_svg__WEBPACK_IMPORTED_MODULE_16__[\"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_41__[\"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_22__[\"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_41__[\"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_35__.Theme.Auto ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_auto_svg__WEBPACK_IMPORTED_MODULE_25__[\"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_35__.Theme.Light ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_light_svg__WEBPACK_IMPORTED_MODULE_23__[\"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_35__.Theme.Dark ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_dark_svg__WEBPACK_IMPORTED_MODULE_24__[\"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 text: _locales__WEBPACK_IMPORTED_MODULE_41__[\"default\"].Chat.InputActions.Clear,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_break_svg__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 649,\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: 647,\n columnNumber: 9\n }, this),\n (0,_utils__WEBPACK_IMPORTED_MODULE_36__.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_28__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 666,\n columnNumber: 19\n }, void 0)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 663,\n columnNumber: 11\n }, this),\n showSizeSelector && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_ui_lib__WEBPACK_IMPORTED_MODULE_43__.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_43__.showToast)(size);\n }\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 671,\n columnNumber: 11\n }, this),\n (0,_utils__WEBPACK_IMPORTED_MODULE_36__.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_29__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 693,\n columnNumber: 19\n }, void 0)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 690,\n columnNumber: 11\n }, this),\n showQualitySelector && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_ui_lib__WEBPACK_IMPORTED_MODULE_43__.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_43__.showToast)(quality);\n }\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 698,\n columnNumber: 11\n }, this),\n (0,_utils__WEBPACK_IMPORTED_MODULE_36__.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_30__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 720,\n columnNumber: 19\n }, void 0)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 717,\n columnNumber: 11\n }, this),\n showStyleSelector && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_ui_lib__WEBPACK_IMPORTED_MODULE_43__.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_43__.showToast)(style);\n }\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 725,\n columnNumber: 11\n }, this),\n (0,_utils__WEBPACK_IMPORTED_MODULE_36__.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_44__.Path.Plugins);\n } else {\n setShowPluginSelector(true);\n }\n },\n text: _locales__WEBPACK_IMPORTED_MODULE_41__[\"default\"].Plugin.Name,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_plugin_svg__WEBPACK_IMPORTED_MODULE_31__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 753,\n columnNumber: 19\n }, void 0)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 744,\n columnNumber: 11\n }, this),\n showPluginSelector && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_ui_lib__WEBPACK_IMPORTED_MODULE_43__.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: 757,\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_41__[\"default\"].Chat.ShortcutKey.Title,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_shortcutkey_svg__WEBPACK_IMPORTED_MODULE_32__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 777,\n columnNumber: 19\n }, void 0)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 774,\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: 780,\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_60___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_34__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 787,\n columnNumber: 19\n }, void 0)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 784,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 782,\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_35__.useAppConfig,\n react_router_dom__WEBPACK_IMPORTED_MODULE_59__.useNavigate,\n _store__WEBPACK_IMPORTED_MODULE_35__.useChatStore,\n _store__WEBPACK_IMPORTED_MODULE_35__.usePluginStore,\n _utils_hooks__WEBPACK_IMPORTED_MODULE_52__.useAllModels,\n _utils__WEBPACK_IMPORTED_MODULE_36__.useMobileScreen\n ];\n});\n_c7 = ChatActions;\nfunction EditMessageModal(props) {\n _s9();\n const chatStore = (0,_store__WEBPACK_IMPORTED_MODULE_35__.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_43__.Modal, {\n title: _locales__WEBPACK_IMPORTED_MODULE_41__[\"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_42__.IconButton, {\n text: _locales__WEBPACK_IMPORTED_MODULE_41__[\"default\"].UI.Cancel,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_cancel_svg__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 808,\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: 806,\n columnNumber: 11\n }, void 0),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_button__WEBPACK_IMPORTED_MODULE_42__.IconButton, {\n type: \"primary\",\n text: _locales__WEBPACK_IMPORTED_MODULE_41__[\"default\"].UI.Confirm,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_confirm_svg__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 817,\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: 814,\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_43__.List, {\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_ui_lib__WEBPACK_IMPORTED_MODULE_43__.ListItem, {\n title: _locales__WEBPACK_IMPORTED_MODULE_41__[\"default\"].Chat.EditMessage.Topic.Title,\n subTitle: _locales__WEBPACK_IMPORTED_MODULE_41__[\"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: 834,\n columnNumber: 13\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 830,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 829,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_mask__WEBPACK_IMPORTED_MODULE_46__.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: 846,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 802,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 801,\n columnNumber: 5\n }, this);\n}\n_s9(EditMessageModal, \"PNpuWAMa1wFKZALzUiT027BVX2s=\", false, function() {\n return [\n _store__WEBPACK_IMPORTED_MODULE_35__.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_60___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_17__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 862,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 861,\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_41__[\"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_41__[\"default\"].Chat.ShortcutKey.focusInput,\n keys: [\n \"Shift\",\n \"Esc\"\n ]\n },\n {\n title: _locales__WEBPACK_IMPORTED_MODULE_41__[\"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_41__[\"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_41__[\"default\"].Chat.ShortcutKey.showShortcutKey,\n keys: isMac ? [\n \"⌘\",\n \"/\"\n ] : [\n \"Ctrl\",\n \"/\"\n ]\n },\n {\n title: _locales__WEBPACK_IMPORTED_MODULE_41__[\"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_43__.Modal, {\n title: _locales__WEBPACK_IMPORTED_MODULE_41__[\"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_42__.IconButton, {\n type: \"primary\",\n text: _locales__WEBPACK_IMPORTED_MODULE_41__[\"default\"].UI.Confirm,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_confirm_svg__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 903,\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: 900,\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_60___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_60___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_60___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_60___default()[\"shortcut-key-title\"]),\n children: shortcut.title\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 915,\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_60___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_60___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: 921,\n columnNumber: 23\n }, this)\n }, i, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 920,\n columnNumber: 21\n }, this))\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 918,\n columnNumber: 17\n }, this)\n ]\n }, index, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 914,\n columnNumber: 15\n }, this))\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 912,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 911,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 896,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 895,\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_35__.useChatStore)();\n const session = chatStore.currentSession();\n const config = (0,_store__WEBPACK_IMPORTED_MODULE_35__.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_36__.useMobileScreen)();\n const navigate = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_59__.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_40__.usePromptStore)();\n const [promptHints, setPromptHints] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const onSearch = (0,use_debounce__WEBPACK_IMPORTED_MODULE_61__.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_61__.useDebouncedCallback)(()=>{\n const rows = inputRef.current ? (0,_utils__WEBPACK_IMPORTED_MODULE_36__.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_48__.useChatCommand)({\n new: ()=>chatStore.newSession(),\n newm: ()=>navigate(_constant__WEBPACK_IMPORTED_MODULE_44__.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_48__.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_62__[\"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_39__.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_44__.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_49__.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_36__.selectOrCopy)(e.currentTarget, (0,_utils__WEBPACK_IMPORTED_MODULE_36__.getMessageTextContent)(message))) {\n if (userInput.length === 0) {\n setUserInput((0,_utils__WEBPACK_IMPORTED_MODULE_36__.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_36__.getMessageTextContent)(userMessage);\n const images = (0,_utils__WEBPACK_IMPORTED_MODULE_36__.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_43__.showToast)(_locales__WEBPACK_IMPORTED_MODULE_41__[\"default\"].Chat.Actions.PinToastContent, {\n text: _locales__WEBPACK_IMPORTED_MODULE_41__[\"default\"].Chat.Actions.PinToastAction,\n onClick: ()=>{\n setShowPromptModal(true);\n }\n });\n };\n const accessStore = (0,_store__WEBPACK_IMPORTED_MODULE_35__.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_53__.ClientApi(_constant__WEBPACK_IMPORTED_MODULE_44__.ModelProvider.GPT);\n const config = _store__WEBPACK_IMPORTED_MODULE_35__.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_44__.DEFAULT_TTS_ENGINE) {\n const edgeVoiceName = accessStore.edgeVoiceName();\n const tts = new _utils_ms_edge_tts__WEBPACK_IMPORTED_MODULE_55__.MsEdgeTTS();\n await tts.setMetadata(edgeVoiceName, _utils_ms_edge_tts__WEBPACK_IMPORTED_MODULE_55__.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_43__.showToast)((0,_utils_format__WEBPACK_IMPORTED_MODULE_49__.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_35__.BOT_HELLO.content) {\n const copiedHello = Object.assign({}, _store__WEBPACK_IMPORTED_MODULE_35__.BOT_HELLO);\n if (!accessStore.isAuthorized()) {\n copiedHello.content = _locales__WEBPACK_IMPORTED_MODULE_41__[\"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_35__.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_35__.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_44__.CHAT_PAGE_SIZE));\n function setMsgRenderIndex(newIndex) {\n newIndex = Math.min(renderMessages.length - _constant__WEBPACK_IMPORTED_MODULE_44__.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_44__.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_44__.CHAT_PAGE_SIZE;\n const nextPageMsgIndex = msgRenderIndex + _constant__WEBPACK_IMPORTED_MODULE_44__.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_44__.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_51__.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_48__.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_43__.showConfirm)(_locales__WEBPACK_IMPORTED_MODULE_41__[\"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_43__.showConfirm)(_locales__WEBPACK_IMPORTED_MODULE_41__[\"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_44__.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_36__.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_37__.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_37__.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_44__.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_36__.getMessageTextContent)(lastNonUserMessage);\n (0,_utils__WEBPACK_IMPORTED_MODULE_36__.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_60___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_42__.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: 1635,\n columnNumber: 25\n }, void 0),\n bordered: true,\n title: _locales__WEBPACK_IMPORTED_MODULE_41__[\"default\"].Chat.Actions.ChatList,\n onClick: ()=>navigate(_constant__WEBPACK_IMPORTED_MODULE_44__.Path.Home)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1634,\n columnNumber: 17\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1633,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1632,\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_57__[\"default\"])(\"window-header-title\", (_chat_module_scss__WEBPACK_IMPORTED_MODULE_60___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_57__[\"default\"])(\"window-header-main-title\", (_chat_module_scss__WEBPACK_IMPORTED_MODULE_60___default()[\"chat-body-main-title\"])),\n onClickCapture: ()=>setIsEditingMessage(true),\n children: !session.topic ? _store__WEBPACK_IMPORTED_MODULE_35__.DEFAULT_TOPIC : session.topic\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1647,\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_41__[\"default\"].Chat.SubTitle(session.messages.length)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1656,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1644,\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_42__.IconButton, {\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_reload_svg__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1663,\n columnNumber: 23\n }, void 0),\n bordered: true,\n title: _locales__WEBPACK_IMPORTED_MODULE_41__[\"default\"].Chat.Actions.RefreshTitle,\n onClick: ()=>{\n (0,_ui_lib__WEBPACK_IMPORTED_MODULE_43__.showToast)(_locales__WEBPACK_IMPORTED_MODULE_41__[\"default\"].Chat.Actions.RefreshToast);\n chatStore.summarizeSession(true, session);\n }\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1662,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1661,\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_42__.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: 1675,\n columnNumber: 25\n }, void 0),\n bordered: true,\n title: _locales__WEBPACK_IMPORTED_MODULE_41__[\"default\"].Chat.EditMessage.Title,\n aria: _locales__WEBPACK_IMPORTED_MODULE_41__[\"default\"].Chat.EditMessage.Title,\n onClick: ()=>setIsEditingMessage(true)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1674,\n columnNumber: 17\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1673,\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_42__.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: 1685,\n columnNumber: 23\n }, void 0),\n bordered: true,\n title: _locales__WEBPACK_IMPORTED_MODULE_41__[\"default\"].Chat.Actions.Export,\n onClick: ()=>{\n setShowExport(true);\n }\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1684,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1683,\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_42__.IconButton, {\n icon: config.tightBorder ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_min_svg__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1696,\n columnNumber: 46\n }, void 0) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_max_svg__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1696,\n columnNumber: 60\n }, void 0),\n bordered: true,\n title: _locales__WEBPACK_IMPORTED_MODULE_41__[\"default\"].Chat.Actions.FullScreen,\n aria: _locales__WEBPACK_IMPORTED_MODULE_41__[\"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: 1695,\n columnNumber: 17\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1694,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1660,\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: 1710,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1630,\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_60___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_60___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_60___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_60___default()[\"chat-message-user\"]) : (_chat_module_scss__WEBPACK_IMPORTED_MODULE_60___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_60___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_60___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_60___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_60___default()[\"chat-message-edit\"]),\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_button__WEBPACK_IMPORTED_MODULE_42__.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: 1757,\n columnNumber: 41\n }, void 0),\n aria: _locales__WEBPACK_IMPORTED_MODULE_41__[\"default\"].Chat.Actions.Edit,\n onClick: async ()=>{\n const newMessage = await (0,_ui_lib__WEBPACK_IMPORTED_MODULE_43__.showPrompt)(_locales__WEBPACK_IMPORTED_MODULE_41__[\"default\"].Chat.Actions.Edit, (0,_utils__WEBPACK_IMPORTED_MODULE_36__.getMessageTextContent)(message), 10);\n let newContent = newMessage;\n const images = (0,_utils__WEBPACK_IMPORTED_MODULE_36__.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: 1756,\n columnNumber: 33\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1755,\n columnNumber: 31\n }, this),\n isUser ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_emoji__WEBPACK_IMPORTED_MODULE_45__.Avatar, {\n avatar: config.avatar\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1797,\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_45__.Avatar, {\n avatar: \"2699-fe0f\"\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1801,\n columnNumber: 37\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_mask__WEBPACK_IMPORTED_MODULE_46__.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: 1803,\n columnNumber: 37\n }, this)\n }, void 0, false)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1754,\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_60___default()[\"chat-model-name\"]),\n children: message.model\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1815,\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_60___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_60___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_41__[\"default\"].Chat.Actions.Stop,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_pause_svg__WEBPACK_IMPORTED_MODULE_27__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1826,\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: 1824,\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_41__[\"default\"].Chat.Actions.Retry,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_reload_svg__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1835,\n columnNumber: 47\n }, void 0),\n onClick: ()=>onResend(message)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1833,\n columnNumber: 39\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ChatAction, {\n text: _locales__WEBPACK_IMPORTED_MODULE_41__[\"default\"].Chat.Actions.Delete,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_clear_svg__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1841,\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: 1839,\n columnNumber: 39\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ChatAction, {\n text: _locales__WEBPACK_IMPORTED_MODULE_41__[\"default\"].Chat.Actions.Pin,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_pin_svg__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1849,\n columnNumber: 47\n }, void 0),\n onClick: ()=>onPinMessage(message)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1847,\n columnNumber: 39\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ChatAction, {\n text: _locales__WEBPACK_IMPORTED_MODULE_41__[\"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: 1854,\n columnNumber: 47\n }, void 0),\n onClick: ()=>(0,_utils__WEBPACK_IMPORTED_MODULE_36__.copyToClipboard)((0,_utils__WEBPACK_IMPORTED_MODULE_36__.getMessageTextContent)(message))\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1852,\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_41__[\"default\"].Chat.Actions.StopSpeech : _locales__WEBPACK_IMPORTED_MODULE_41__[\"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: 1870,\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: 1872,\n columnNumber: 47\n }, void 0),\n onClick: ()=>openaiSpeech((0,_utils__WEBPACK_IMPORTED_MODULE_36__.getMessageTextContent)(message))\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1862,\n columnNumber: 41\n }, this)\n ]\n }, void 0, true)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1822,\n columnNumber: 33\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1821,\n columnNumber: 31\n }, this)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1753,\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_60___default()[\"chat-message-status\"]),\n children: _locales__WEBPACK_IMPORTED_MODULE_41__[\"default\"].Chat.Typing\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1889,\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_60___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_60___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_19__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1903,\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_20__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1905,\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: 1907,\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: 1909,\n columnNumber: 35\n }, this)\n ]\n }, tool.id, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1897,\n columnNumber: 33\n }, this);\n })\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1895,\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_60___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_36__.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_36__.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: 1915,\n columnNumber: 29\n }, this),\n (0,_utils__WEBPACK_IMPORTED_MODULE_36__.getMessageImages)(message).length == 1 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"img\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_60___default()[\"chat-message-item-image\"]),\n src: (0,_utils__WEBPACK_IMPORTED_MODULE_36__.getMessageImages)(message)[0],\n alt: \"\"\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1934,\n columnNumber: 31\n }, this),\n (0,_utils__WEBPACK_IMPORTED_MODULE_36__.getMessageImages)(message).length > 1 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_60___default()[\"chat-message-item-images\"]),\n style: {\n \"--image-count\": (0,_utils__WEBPACK_IMPORTED_MODULE_36__.getMessageImages)(message).length\n },\n children: (0,_utils__WEBPACK_IMPORTED_MODULE_36__.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_60___default()[\"chat-message-item-image-multi\"]),\n src: image,\n alt: \"\"\n }, index, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1953,\n columnNumber: 39\n }, this);\n })\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1941,\n columnNumber: 31\n }, this)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1914,\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_60___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: 1971,\n columnNumber: 31\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1970,\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_60___default()[\"chat-message-action-date\"]),\n children: isContext ? _locales__WEBPACK_IMPORTED_MODULE_41__[\"default\"].Chat.IsContext : message.date.toLocaleString()\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1975,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1752,\n columnNumber: 25\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1745,\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: 1982,\n columnNumber: 57\n }, this)\n ]\n }, message.id, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1744,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1718,\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_60___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: 1988,\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: 1993,\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_57__[\"default\"])((_chat_module_scss__WEBPACK_IMPORTED_MODULE_60___default()[\"chat-input-panel-inner\"]), {\n [(_chat_module_scss__WEBPACK_IMPORTED_MODULE_60___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_60___default()[\"chat-input\"]),\n placeholder: _locales__WEBPACK_IMPORTED_MODULE_41__[\"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: 2023,\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_60___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_60___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_60___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: 2051,\n columnNumber: 29\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 2050,\n columnNumber: 27\n }, this)\n }, index, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 2045,\n columnNumber: 25\n }, this);\n })\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 2042,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_button__WEBPACK_IMPORTED_MODULE_42__.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: 2065,\n columnNumber: 25\n }, void 0),\n text: _locales__WEBPACK_IMPORTED_MODULE_41__[\"default\"].Chat.Send,\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_60___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: 2064,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 2016,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1987,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1717,\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_57__[\"default\"])((_chat_module_scss__WEBPACK_IMPORTED_MODULE_60___default()[\"chat-side-panel\"]), {\n [(_chat_module_scss__WEBPACK_IMPORTED_MODULE_60___default().mobile)]: isMobileScreen,\n [(_chat_module_scss__WEBPACK_IMPORTED_MODULE_60___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_56__.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: 2081,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 2074,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1716,\n columnNumber: 9\n }, this)\n ]\n }, session.id, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1629,\n columnNumber: 7\n }, this),\n showExport && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_exporter__WEBPACK_IMPORTED_MODULE_50__.ExportMessageModal, {\n onClose: ()=>setShowExport(false)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 2094,\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: 2098,\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: 2106,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true);\n}\n_s10(_Chat, \"l8awPbehI2cJMzYrqPhf7FG0hns=\", false, function() {\n return [\n _store__WEBPACK_IMPORTED_MODULE_35__.useChatStore,\n _store__WEBPACK_IMPORTED_MODULE_35__.useAppConfig,\n useSubmitHandler,\n useScrollToBottom,\n _utils__WEBPACK_IMPORTED_MODULE_36__.useMobileScreen,\n react_router_dom__WEBPACK_IMPORTED_MODULE_59__.useNavigate,\n _store_prompt__WEBPACK_IMPORTED_MODULE_40__.usePromptStore,\n use_debounce__WEBPACK_IMPORTED_MODULE_61__.useDebouncedCallback,\n use_debounce__WEBPACK_IMPORTED_MODULE_61__.useDebouncedCallback,\n _command__WEBPACK_IMPORTED_MODULE_48__.useChatCommand,\n _store__WEBPACK_IMPORTED_MODULE_35__.useAccessStore,\n _command__WEBPACK_IMPORTED_MODULE_48__.useCommand\n ];\n});\nfunction Chat() {\n _s11();\n const chatStore = (0,_store__WEBPACK_IMPORTED_MODULE_35__.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: 2115,\n columnNumber: 10\n }, this);\n}\n_s11(Chat, \"VEZRjRiHFhGEe/E6z12rT6r9BBA=\", false, function() {\n return [\n _store__WEBPACK_IMPORTED_MODULE_35__.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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9jb21wb25lbnRzL2NoYXQudHN4IiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFvRDtBQVNyQztBQUVxQztBQUNUO0FBQ0U7QUFDRjtBQUNDO0FBQ0M7QUFDSjtBQUNFO0FBQ1M7QUFDRjtBQUNHO0FBR2Q7QUFDQTtBQUNLO0FBQ0M7QUFDRjtBQUNXO0FBQ1Y7QUFDTDtBQUNRO0FBQ0o7QUFDRTtBQUNGO0FBRUE7QUFDRjtBQUNBO0FBQ0k7QUFDSDtBQUVEO0FBQ0M7QUFDRztBQUNBO0FBQ1U7QUFDWDtBQUNPO0FBYWpDO0FBZUE7QUFFa0Q7QUFFakM7QUFFdUI7QUFFRDtBQUN6QjtBQUVNO0FBQ0U7QUFVdEI7QUFDNkI7QUFTMUI7QUFDWTtBQUMrQjtBQUNuQjtBQUM4QjtBQUM1QjtBQUNDO0FBQ0c7QUFDTDtBQUNlO0FBQ1o7QUFDZTtBQUU1QjtBQUUwQjtBQUN0QztBQUNnRDtBQUV4RSxNQUFNNEcsZUFBZWxELHlEQUFnQkE7QUFFckMsTUFBTW1ELFlBQVlULDhEQUFlQTtBQUVqQyxNQUFNVSxXQUFXNUMseURBQU9BLENBQUMsVUFBWSxDQUFDLE1BQU0sa05BQW1CLEVBQUc0QyxRQUFROzs7Ozs7SUFDeEVDLFNBQVMsa0JBQU0sOERBQUM5Riw4REFBV0E7Ozs7OztLQUR2QjZGO0FBSU4sTUFBTUUsWUFBWTs7SUFDaEIsTUFBTUMsV0FBV2xDLDhEQUFXQTtJQUM1QixNQUFNLENBQUNtQyxPQUFPQyxTQUFTLEdBQUc1RywrQ0FBUUEsQ0FBUztJQUMzQyxNQUFNLENBQUM2RyxZQUFZQyxjQUFjLEdBQUc5RywrQ0FBUUEsQ0FBQztJQUU3Q0gsZ0RBQVNBLENBQUM7UUFDUixNQUFNa0gsaUJBQWlCO1lBQ3JCLE1BQU1DLFVBQVUsTUFBTVosMkRBQVlBO1lBQ2xDVSxjQUFjRTtZQUNkLElBQUlBLFNB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Q2Q7Ozs7Ozs7Ozs7Ozs7Ozs7OztlQTFjd0JuVSxRQUFRNE0sRUFBRTs7Ozs7WUFnZDNDMEMsNEJBQ0MsOERBQUN0UiwwREFBa0JBO2dCQUFDd0MsU0FBUyxJQUFNK08sY0FBYzs7Ozs7O1lBR2xEeUssa0NBQ0MsOERBQUM5TTtnQkFDQzFNLFNBQVM7b0JBQ1B5WixvQkFBb0I7Z0JBQ3RCOzs7Ozs7WUFJSHlCLHNDQUNDLDhEQUFDdE47Z0JBQWlCNU4sU0FBUyxJQUFNcU0sd0JBQXdCOzs7Ozs7OztBQUlqRTtLQXhwQ1NzQzs7UUFHV2pVLGlEQUFZQTtRQUVmRCxpREFBWUE7UUFTU3lIO1FBdUJTcUU7UUFNdEJsTCxvREFBZUE7UUFDckJrQiwwREFBV0E7UUFLUlgsMERBQWNBO1FBRWpCcEUsK0RBQW9CQTtRQVdyQkEsK0RBQW9CQTtRQW9CZjZGLHFEQUFjQTtRQXVOZjdDLG1EQUFjQTtRQThKbEM4QyxpREFBVUE7OztBQW10QkwsU0FBUzZDOztJQUNkLE1BQU1aLFlBQVk3RSxxREFBWUE7SUFDOUIsTUFBTThFLFVBQVVELFVBQVVFLGNBQWM7SUFDeEMscUJBQU8sOERBQUNrUCxXQUFXblAsUUFBUTRNLEVBQUU7Ozs7O0FBQy9CO0tBSmdCak07O1FBQ0l6RixpREFBWUE7OztPQURoQnlGIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL2FwcC9jb21wb25lbnRzL2NoYXQudHN4PzhkNjIiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXNlRGVib3VuY2VkQ2FsbGJhY2sgfSBmcm9tIFwidXNlLWRlYm91bmNlXCI7XHJcbmltcG9ydCBSZWFjdCwge1xyXG4gIEZyYWdtZW50LFxyXG4gIFJlZk9iamVjdCxcclxuICB1c2VDYWxsYmFjayxcclxuICB1c2VFZmZlY3QsXHJcbiAgdXNlTWVtbyxcclxuICB1c2VSZWYsXHJcbiAgdXNlU3RhdGUsXHJcbn0gZnJvbSBcInJlYWN0XCI7XHJcblxyXG5pbXBvcnQgU2VuZFdoaXRlSWNvbiBmcm9tIFwiLi4vaWNvbnMvc2VuZC13aGl0ZS5zdmdcIjtcclxuaW1wb3J0IEJyYWluSWNvbiBmcm9tIFwiLi4vaWNvbnMvYnJhaW4uc3ZnXCI7XHJcbmltcG9ydCBSZW5hbWVJY29uIGZyb20gXCIuLi9pY29ucy9yZW5hbWUuc3ZnXCI7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tIFwiLi4vaWNvbnMvcmVuYW1lLnN2Z1wiO1xyXG5pbXBvcnQgRXhwb3J0SWNvbiBmcm9tIFwiLi4vaWNvbnMvc2hhcmUuc3ZnXCI7XHJcbmltcG9ydCBSZXR1cm5JY29uIGZyb20gXCIuLi9pY29ucy9yZXR1cm4uc3ZnXCI7XHJcbmltcG9ydCBDb3B5SWNvbiBmcm9tIFwiLi4vaWNvbnMvY29weS5zdmdcIjtcclxuaW1wb3J0IFNwZWFrSWNvbiBmcm9tIFwiLi4vaWNvbnMvc3BlYWsuc3ZnXCI7XHJcbmltcG9ydCBTcGVha1N0b3BJY29uIGZyb20gXCIuLi9pY29ucy9zcGVhay1zdG9wLnN2Z1wiO1xyXG5pbXBvcnQgTG9hZGluZ0ljb24gZnJvbSBcIi4uL2ljb25zL3RocmVlLWRvdHMuc3ZnXCI7XHJcbmltcG9ydCBMb2FkaW5nQnV0dG9uSWNvbiBmcm9tIFwiLi4vaWNvbnMvbG9hZGluZy5zdmdcIjtcclxuaW1wb3J0IFByb21wdEljb24gZnJvbSBcIi4uL2ljb25zL3Byb21wdC5zdmdcIjtcclxuaW1wb3J0IE1hc2tJY29uIGZyb20gXCIuLi9pY29ucy9tYXNrLnN2Z1wiO1xyXG5pbXBvcnQgTWF4SWNvbiBmcm9tIFwiLi4vaWNvbnMvbWF4LnN2Z1wiO1xyXG5pbXBvcnQgTWluSWNvbiBmcm9tIFwiLi4vaWNvbnMvbWluLnN2Z1wiO1xyXG5pbXBvcnQgUmVzZXRJY29uIGZyb20gXCIuLi9pY29ucy9yZWxvYWQuc3ZnXCI7XHJcbmltcG9ydCBSZWxvYWRJY29uIGZyb20gXCIuLi9pY29ucy9yZWxvYWQuc3ZnXCI7XHJcbmltcG9ydCBCcmVha0ljb24gZnJvbSBcIi4uL2ljb25zL2JyZWFrLnN2Z1wiO1xyXG5pbXBvcnQgU2V0dGluZ3NJY29uIGZyb20gXCIuLi9pY29ucy9jaGF0LXNldHRpbmdzLnN2Z1wiO1xyXG5pbXBvcnQgRGVsZXRlSWNvbiBmcm9tIFwiLi4vaWNvbnMvY2xlYXIuc3ZnXCI7XHJcbmltcG9ydCBQaW5JY29uIGZyb20gXCIuLi9pY29ucy9waW4uc3ZnXCI7XHJcbmltcG9ydCBDb25maXJtSWNvbiBmcm9tIFwiLi4vaWNvbnMvY29uZmlybS5zdmdcIjtcclxuaW1wb3J0IENsb3NlSWNvbiBmcm9tIFwiLi4vaWNvbnMvY2xvc2Uuc3ZnXCI7XHJcbmltcG9ydCBDYW5jZWxJY29uIGZyb20gXCIuLi9pY29ucy9jYW5jZWwuc3ZnXCI7XHJcbmltcG9ydCBJbWFnZUljb24gZnJvbSBcIi4uL2ljb25zL2ltYWdlLnN2Z1wiO1xyXG5cclxuaW1wb3J0IExpZ2h0SWNvbiBmcm9tIFwiLi4vaWNvbnMvbGlnaHQuc3ZnXCI7XHJcbmltcG9ydCBEYXJrSWNvbiBmcm9tIFwiLi4vaWNvbnMvZGFyay5zdmdcIjtcclxuaW1wb3J0IEF1dG9JY29uIGZyb20gXCIuLi9pY29ucy9hdXRvLnN2Z1wiO1xyXG5pbXBvcnQgQm90dG9tSWNvbiBmcm9tIFwiLi4vaWNvbnMvYm90dG9tLnN2Z1wiO1xyXG5pbXBvcnQgU3RvcEljb24gZnJvbSBcIi4uL2ljb25zL3BhdXNlLnN2Z1wiO1xyXG5pbXBvcnQgUm9ib3RJY29uIGZyb20gXCIuLi9pY29ucy9yb2JvdC5zdmdcIjtcclxuaW1wb3J0IFNpemVJY29uIGZyb20gXCIuLi9pY29ucy9zaXplLnN2Z1wiO1xyXG5pbXBvcnQgUXVhbGl0eUljb24gZnJvbSBcIi4uL2ljb25zL2hkLnN2Z1wiO1xyXG5pbXBvcnQgU3R5bGVJY29uIGZyb20gXCIuLi9pY29ucy9wYWxldHRlLnN2Z1wiO1xyXG5pbXBvcnQgUGx1Z2luSWNvbiBmcm9tIFwiLi4vaWNvbnMvcGx1Z2luLnN2Z1wiO1xyXG5pbXBvcnQgU2hvcnRjdXRrZXlJY29uIGZyb20gXCIuLi9pY29ucy9zaG9ydGN1dGtleS5zdmdcIjtcclxuaW1wb3J0IE1jcFRvb2xJY29uIGZyb20gXCIuLi9pY29ucy90b29sLnN2Z1wiO1xyXG5pbXBvcnQgSGVhZHBob25lSWNvbiBmcm9tIFwiLi4vaWNvbnMvaGVhZHBob25lLnN2Z1wiO1xyXG5pbXBvcnQge1xyXG4gIEJPVF9IRUxMTyxcclxuICBDaGF0TWVzc2FnZSxcclxuICBjcmVhdGVNZXNzYWdlLFxyXG4gIERFRkFVTFRfVE9QSUMsXHJcbiAgTW9kZWxUeXBlLFxyXG4gIFN1Ym1pdEtleSxcclxuICBUaGVtZSxcclxuICB1c2VBY2Nlc3NTdG9yZSxcclxuICB1c2VBcHBDb25maWcsXHJcbiAgdXNlQ2hhdFN0b3JlLFxyXG4gIHVzZVBsdWdpblN0b3JlLFxyXG59IGZyb20gXCIuLi9zdG9yZVwiO1xyXG5cclxuaW1wb3J0IHtcclxuICBhdXRvR3Jvd1RleHRBcmVhLFxyXG4gIGNvcHlUb0NsaXBib2FyZCxcclxuICBnZXRNZXNzYWdlSW1hZ2VzLFxyXG4gIGdldE1lc3NhZ2VUZXh0Q29udGVudCxcclxuICBpc0RhbGxlMyxcclxuICBpc1Zpc2lvbk1vZGVsLFxyXG4gIHNhZmVMb2NhbFN0b3JhZ2UsXHJcbiAgZ2V0TW9kZWxTaXplcyxcclxuICBzdXBwb3J0c0N1c3RvbVNpemUsXHJcbiAgdXNlTW9iaWxlU2NyZWVuLFxyXG4gIHNlbGVjdE9yQ29weSxcclxuICBzaG93UGx1Z2lucyxcclxufSBmcm9tIFwiLi4vdXRpbHNcIjtcclxuXHJcbmltcG9ydCB7IHVwbG9hZEltYWdlIGFzIHVwbG9hZEltYWdlUmVtb3RlIH0gZnJvbSBcIkAvYXBwL3V0aWxzL2NoYXRcIjtcclxuXHJcbmltcG9ydCBkeW5hbWljIGZyb20gXCJuZXh0L2R5bmFtaWNcIjtcclxuXHJcbmltcG9ydCB7IENoYXRDb250cm9sbGVyUG9vbCB9IGZyb20gXCIuLi9jbGllbnQvY29udHJvbGxlclwiO1xyXG5pbXBvcnQgeyBEYWxsZVF1YWxpdHksIERhbGxlU3R5bGUsIE1vZGVsU2l6ZSB9IGZyb20gXCIuLi90eXBpbmdcIjtcclxuaW1wb3J0IHsgUHJvbXB0LCB1c2VQcm9tcHRTdG9yZSB9IGZyb20gXCIuLi9zdG9yZS9wcm9tcHRcIjtcclxuaW1wb3J0IExvY2FsZSBmcm9tIFwiLi4vbG9jYWxlc1wiO1xyXG5cclxuaW1wb3J0IHsgSWNvbkJ1dHRvbiB9IGZyb20gXCIuL2J1dHRvblwiO1xyXG5pbXBvcnQgc3R5bGVzIGZyb20gXCIuL2NoYXQubW9kdWxlLnNjc3NcIjtcclxuXHJcbmltcG9ydCB7XHJcbiAgTGlzdCxcclxuICBMaXN0SXRlbSxcclxuICBNb2RhbCxcclxuICBTZWxlY3RvcixcclxuICBzaG93Q29uZmlybSxcclxuICBzaG93UHJvbXB0LFxyXG4gIHNob3dUb2FzdCxcclxufSBmcm9tIFwiLi91aS1saWJcIjtcclxuaW1wb3J0IHsgdXNlTmF2aWdhdGUgfSBmcm9tIFwicmVhY3Qtcm91dGVyLWRvbVwiO1xyXG5pbXBvcnQge1xyXG4gIENIQVRfUEFHRV9TSVpFLFxyXG4gIERFRkFVTFRfVFRTX0VOR0lORSxcclxuICBNb2RlbFByb3ZpZGVyLFxyXG4gIFBhdGgsXHJcbiAgUkVRVUVTVF9USU1FT1VUX01TLFxyXG4gIFNlcnZpY2VQcm92aWRlcixcclxuICBVTkZJTklTSEVEX0lOUFVULFxyXG59IGZyb20gXCIuLi9jb25zdGFudFwiO1xyXG5pbXBvcnQgeyBBdmF0YXIgfSBmcm9tIFwiLi9lbW9qaVwiO1xyXG5pbXBvcnQgeyBDb250ZXh0UHJvbXB0cywgTWFza0F2YXRhciwgTWFza0NvbmZpZyB9IGZyb20gXCIuL21hc2tcIjtcclxuaW1wb3J0IHsgdXNlTWFza1N0b3JlIH0gZnJvbSBcIi4uL3N0b3JlL21hc2tcIjtcclxuaW1wb3J0IHsgQ2hhdENvbW1hbmRQcmVmaXgsIHVzZUNoYXRDb21tYW5kLCB1c2VDb21tYW5kIH0gZnJvbSBcIi4uL2NvbW1hbmRcIjtcclxuaW1wb3J0IHsgcHJldHR5T2JqZWN0IH0gZnJvbSBcIi4uL3V0aWxzL2Zvcm1hdFwiO1xyXG5pbXBvcnQgeyBFeHBvcnRNZXNzYWdlTW9kYWwgfSBmcm9tIFwiLi9leHBvcnRlclwiO1xyXG5pbXBvcnQgeyBnZXRDbGllbnRDb25maWcgfSBmcm9tIFwiLi4vY29uZmlnL2NsaWVudFwiO1xyXG5pbXBvcnQgeyB1c2VBbGxNb2RlbHMgfSBmcm9tIFwiLi4vdXRpbHMvaG9va3NcIjtcclxuaW1wb3J0IHsgQ2xpZW50QXBpLCBNdWx0aW1vZGFsQ29udGVudCB9IGZyb20gXCIuLi9jbGllbnQvYXBpXCI7XHJcbmltcG9ydCB7IGNyZWF0ZVRUU1BsYXllciB9IGZyb20gXCIuLi91dGlscy9hdWRpb1wiO1xyXG5pbXBvcnQgeyBNc0VkZ2VUVFMsIE9VVFBVVF9GT1JNQVQgfSBmcm9tIFwiLi4vdXRpbHMvbXNfZWRnZV90dHNcIjtcclxuXHJcbmltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwibG9kYXNoLWVzXCI7XHJcbmltcG9ydCB7IGdldE1vZGVsUHJvdmlkZXIgfSBmcm9tIFwiLi4vdXRpbHMvbW9kZWxcIjtcclxuaW1wb3J0IHsgUmVhbHRpbWVDaGF0IH0gZnJvbSBcIkAvYXBwL2NvbXBvbmVudHMvcmVhbHRpbWUtY2hhdFwiO1xyXG5pbXBvcnQgY2xzeCBmcm9tIFwiY2xzeFwiO1xyXG5pbXBvcnQgeyBnZXRBdmFpbGFibGVDbGllbnRzQ291bnQsIGlzTWNwRW5hYmxlZCB9IGZyb20gXCIuLi9tY3AvYWN0aW9uc1wiO1xyXG5cclxuY29uc3QgbG9jYWxTdG9yYWdlID0gc2FmZUxvY2FsU3RvcmFnZSgpO1xyXG5cclxuY29uc3QgdHRzUGxheWVyID0gY3JlYXRlVFRTUGxheWVyKCk7XHJcblxyXG5jb25zdCBNYXJrZG93biA9IGR5bmFtaWMoYXN5bmMgKCkgPT4gKGF3YWl0IGltcG9ydChcIi4vbWFya2Rvd25cIikpLk1hcmtkb3duLCB7XHJcbiAgbG9hZGluZzogKCkgPT4gPExvYWRpbmdJY29uIC8+LFxyXG59KTtcclxuXHJcbmNvbnN0IE1DUEFjdGlvbiA9ICgpID0+IHtcclxuICBjb25zdCBuYXZpZ2F0ZSA9IHVzZU5hdmlnYXRlKCk7XHJcbiAgY29uc3QgW2NvdW50LCBzZXRDb3VudF0gPSB1c2VTdGF0ZTxudW1iZXI+KDApO1xyXG4gIGNvbnN0IFttY3BFbmFibGVkLCBzZXRNY3BFbmFibGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuXHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIGNvbnN0IGNoZWNrTWNwU3RhdHVzID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBlbmFibGVkID0gYXdhaXQgaXNNY3BFbmFibGVkKCk7XHJcbiAgICAgIHNldE1jcEVuYWJsZWQoZW5hYmxlZCk7XHJcbiAgICAgIGlmIChlbmFibGVkKSB7XHJcbiAgICAgICAgY29uc3QgY291bnQgPSBhd2FpdCBnZXRBdmFpbGFibGVDbGllbnRzQ291bnQoKTtcclxuICAgICAgICBzZXRDb3VudChjb3VudCk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICBjaGVja01jcFN0YXR1cygpO1xyXG4gIH0sIFtdKTtcclxuXHJcbiAgaWYgKCFtY3BFbmFibGVkKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgcmV0dXJuIChcclxuICAgIDxDaGF0QWN0aW9uXHJcbiAgICAgIG9uQ2xpY2s9eygpID0+IG5hdmlnYXRlKFBhdGguTWNwTWFya2V0KX1cclxuICAgICAgdGV4dD17YE1DUCR7Y291bnQgPyBgICgke2NvdW50fSlgIDogXCJcIn1gfVxyXG4gICAgICBpY29uPXs8TWNwVG9vbEljb24gLz59XHJcbiAgICAvPlxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gU2Vzc2lvbkNvbmZpZ01vZGVsKHByb3BzOiB7IG9uQ2xvc2U6ICgpID0+IHZvaWQgfSkge1xyXG4gIGNvbnN0IGNoYXRTdG9yZSA9IHVzZUNoYXRTdG9yZSgpO1xyXG4gIGNvbnN0IHNlc3Npb24gPSBjaGF0U3RvcmUuY3VycmVudFNlc3Npb24oKTtcclxuICBjb25zdCBtYXNrU3RvcmUgPSB1c2VNYXNrU3RvcmUoKTtcclxuICBjb25zdCBuYXZpZ2F0ZSA9IHVzZU5hdmlnYXRlKCk7XHJcblxyXG4gIHJldHVybiAoXHJcbiAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLW1hc2tcIj5cclxuICAgICAgPE1vZGFsXHJcbiAgICAgICAgdGl0bGU9e0xvY2FsZS5Db250ZXh0LkVkaXR9XHJcbiAgICAgICAgb25DbG9zZT17KCkgPT4gcHJvcHMub25DbG9zZSgpfVxyXG4gICAgICAgIGFjdGlvbnM9e1tcclxuICAgICAgICAgIDxJY29uQnV0dG9uXHJcbiAgICAgICAgICAgIGtleT1cInJlc2V0XCJcclxuICAgICAgICAgICAgaWNvbj17PFJlc2V0SWNvbiAvPn1cclxuICAgICAgICAgICAgYm9yZGVyZWRcclxuICAgICAgICAgICAgdGV4dD17TG9jYWxlLkNoYXQuQ29uZmlnLlJlc2V0fVxyXG4gICAgICAgICAgICBvbkNsaWNrPXthc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKGF3YWl0IHNob3dDb25maXJtKExvY2FsZS5NZW1vcnkuUmVzZXRDb25maXJtKSkge1xyXG4gICAgICAgICAgICAgICAgY2hhdFN0b3JlLnVwZGF0ZVRhcmdldFNlc3Npb24oXHJcbiAgICAgICAgICAgICAgICAgIHNlc3Npb24sXHJcbiAgICAgICAgICAgICAgICAgIChzZXNzaW9uKSA9PiAoc2Vzc2lvbi5tZW1vcnlQcm9tcHQgPSBcIlwiKSxcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9fVxyXG4gICAgICAgICAgLz4sXHJcbiAgICAgICAgICA8SWNvbkJ1dHRvblxyXG4gICAgICAgICAgICBrZXk9XCJjb3B5XCJcclxuICAgICAgICAgICAgaWNvbj17PENvcHlJY29uIC8+fVxyXG4gICAgICAgICAgICBib3JkZXJlZFxyXG4gICAgICAgICAgICB0ZXh0PXtMb2NhbGUuQ2hhdC5Db25maWcuU2F2ZUFzfVxyXG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgbmF2aWdhdGUoUGF0aC5NYXNrcyk7XHJcbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBtYXNrU3RvcmUuY3JlYXRlKHNlc3Npb24ubWFzayk7XHJcbiAgICAgICAgICAgICAgfSwgNTAwKTtcclxuICAgICAgICAgICAgfX1cclxuICAgICAgICAgIC8+LFxyXG4gICAgICAgIF19XHJcbiAgICAgID5cclxuICAgICAgICA8TWFza0NvbmZpZ1xyXG4gICAgICAgICAgbWFzaz17c2Vzc2lvbi5tYXNrfVxyXG4gICAgICAgICAgdXBkYXRlTWFzaz17KHVwZGF0ZXIpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbWFzayA9IHsgLi4uc2Vzc2lvbi5tYXNrIH07XHJcbiAgICAgICAgICAgIHVwZGF0ZXIobWFzayk7XHJcbiAgICAgICAgICAgIGNoYXRTdG9yZS51cGRhdGVUYXJnZXRTZXNzaW9uKFxyXG4gICAgICAgICAgICAgIHNlc3Npb24sXHJcbiAgICAgICAgICAgICAgKHNlc3Npb24pID0+IChzZXNzaW9uLm1hc2sgPSBtYXNrKSxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH19XHJcbiAgICAgICAgICBzaG91bGRTeW5jRnJvbUdsb2JhbFxyXG4gICAgICAgICAgZXh0cmFMaXN0SXRlbXM9e1xyXG4gICAgICAgICAgICBzZXNzaW9uLm1hc2subW9kZWxDb25maWcuc2VuZE1lbW9yeSA/IChcclxuICAgICAgICAgICAgICA8TGlzdEl0ZW1cclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImNvcHlhYmxlXCJcclxuICAgICAgICAgICAgICAgIHRpdGxlPXtgJHtMb2NhbGUuTWVtb3J5LlRpdGxlfSAoJHtzZXNzaW9uLmxhc3RTdW1tYXJpemVJbmRleH0gb2YgJHtzZXNzaW9uLm1lc3NhZ2VzLmxlbmd0aH0pYH1cclxuICAgICAgICAgICAgICAgIHN1YlRpdGxlPXtzZXNzaW9uLm1lbW9yeVByb21wdCB8fCBMb2NhbGUuTWVtb3J5LkVtcHR5Q29udGVudH1cclxuICAgICAgICAgICAgICA+PC9MaXN0SXRlbT5cclxuICAgICAgICAgICAgKSA6IChcclxuICAgICAgICAgICAgICA8PjwvPlxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgPjwvTWFza0NvbmZpZz5cclxuICAgICAgPC9Nb2RhbD5cclxuICAgIDwvZGl2PlxyXG4gICk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIFByb21wdFRvYXN0KHByb3BzOiB7XHJcbiAgc2hvd1RvYXN0PzogYm9vbGVhbjtcclxuICBzaG93TW9kYWw/OiBib29sZWFuO1xyXG4gIHNldFNob3dNb2RhbDogKF86IGJvb2xlYW4pID0+IHZvaWQ7XHJcbn0pIHtcclxuICBjb25zdCBjaGF0U3RvcmUgPSB1c2VDaGF0U3RvcmUoKTtcclxuICBjb25zdCBzZXNzaW9uID0gY2hhdFN0b3JlLmN1cnJlbnRTZXNzaW9uKCk7XHJcbiAgY29uc3QgY29udGV4dCA9IHNlc3Npb24ubWFzay5jb250ZXh0O1xyXG5cclxuICByZXR1cm4gKFxyXG4gICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlc1tcInByb21wdC10b2FzdFwiXX0ga2V5PVwicHJvbXB0LXRvYXN0XCI+XHJcbiAgICAgIHtwcm9wcy5zaG93VG9hc3QgJiYgY29udGV4dC5sZW5ndGggPiAwICYmIChcclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzc05hbWU9e2Nsc3goc3R5bGVzW1wicHJvbXB0LXRvYXN0LWlubmVyXCJdLCBcImNsaWNrYWJsZVwiKX1cclxuICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgb25DbGljaz17KCkgPT4gcHJvcHMuc2V0U2hvd01vZGFsKHRydWUpfVxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxCcmFpbkljb24gLz5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17c3R5bGVzW1wicHJvbXB0LXRvYXN0LWNvbnRlbnRcIl19PlxyXG4gICAgICAgICAgICB7TG9jYWxlLkNvbnRleHQuVG9hc3QoY29udGV4dC5sZW5ndGgpfVxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICApfVxyXG4gICAgICB7cHJvcHMuc2hvd01vZGFsICYmIChcclxuICAgICAgICA8U2Vzc2lvbkNvbmZpZ01vZGVsIG9uQ2xvc2U9eygpID0+IHByb3BzLnNldFNob3dNb2RhbChmYWxzZSl9IC8+XHJcbiAgICAgICl9XHJcbiAgICA8L2Rpdj5cclxuICApO1xyXG59XHJcblxyXG5mdW5jdGlvbiB1c2VTdWJtaXRIYW5kbGVyKCkge1xyXG4gIGNvbnN0IGNvbmZpZyA9IHVzZUFwcENvbmZpZygpO1xyXG4gIGNvbnN0IHN1Ym1pdEtleSA9IGNvbmZpZy5zdWJtaXRLZXk7XHJcbiAgY29uc3QgaXNDb21wb3NpbmcgPSB1c2VSZWYoZmFsc2UpO1xyXG5cclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgY29uc3Qgb25Db21wb3NpdGlvblN0YXJ0ID0gKCkgPT4ge1xyXG4gICAgICBpc0NvbXBvc2luZy5jdXJyZW50ID0gdHJ1ZTtcclxuICAgIH07XHJcbiAgICBjb25zdCBvbkNvbXBvc2l0aW9uRW5kID0gKCkgPT4ge1xyXG4gICAgICBpc0NvbXBvc2luZy5jdXJyZW50ID0gZmFsc2U7XHJcbiAgICB9O1xyXG5cclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiY29tcG9zaXRpb25zdGFydFwiLCBvbkNvbXBvc2l0aW9uU3RhcnQpO1xyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJjb21wb3NpdGlvbmVuZFwiLCBvbkNvbXBvc2l0aW9uRW5kKTtcclxuXHJcbiAgICByZXR1cm4gKCkgPT4ge1xyXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNvbXBvc2l0aW9uc3RhcnRcIiwgb25Db21wb3NpdGlvblN0YXJ0KTtcclxuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjb21wb3NpdGlvbmVuZFwiLCBvbkNvbXBvc2l0aW9uRW5kKTtcclxuICAgIH07XHJcbiAgfSwgW10pO1xyXG5cclxuICBjb25zdCBzaG91bGRTdWJtaXQgPSAoZTogUmVhY3QuS2V5Ym9hcmRFdmVudDxIVE1MVGV4dEFyZWFFbGVtZW50PikgPT4ge1xyXG4gICAgLy8gRml4IENoaW5lc2UgaW5wdXQgbWV0aG9kIFwiRW50ZXJcIiBvbiBTYWZhcmlcclxuICAgIGlmIChlLmtleUNvZGUgPT0gMjI5KSByZXR1cm4gZmFsc2U7XHJcbiAgICBpZiAoZS5rZXkgIT09IFwiRW50ZXJcIikgcmV0dXJuIGZhbHNlO1xyXG4gICAgaWYgKGUua2V5ID09PSBcIkVudGVyXCIgJiYgKGUubmF0aXZlRXZlbnQuaXNDb21wb3NpbmcgfHwgaXNDb21wb3NpbmcuY3VycmVudCkpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIChjb25maWcuc3VibWl0S2V5ID09PSBTdWJtaXRLZXkuQWx0RW50ZXIgJiYgZS5hbHRLZXkpIHx8XHJcbiAgICAgIChjb25maWcuc3VibWl0S2V5ID09PSBTdWJtaXRLZXkuQ3RybEVudGVyICYmIGUuY3RybEtleSkgfHxcclxuICAgICAgKGNvbmZpZy5zdWJtaXRLZXkgPT09IFN1Ym1pdEtleS5TaGlmdEVudGVyICYmIGUuc2hpZnRLZXkpIHx8XHJcbiAgICAgIChjb25maWcuc3VibWl0S2V5ID09PSBTdWJtaXRLZXkuTWV0YUVudGVyICYmIGUubWV0YUtleSkgfHxcclxuICAgICAgKGNvbmZpZy5zdWJtaXRLZXkgPT09IFN1Ym1pdEtleS5FbnRlciAmJlxyXG4gICAgICAgICFlLmFsdEtleSAmJlxyXG4gICAgICAgICFlLmN0cmxLZXkgJiZcclxuICAgICAgICAhZS5zaGlmdEtleSAmJlxyXG4gICAgICAgICFlLm1ldGFLZXkpXHJcbiAgICApO1xyXG4gIH07XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBzdWJtaXRLZXksXHJcbiAgICBzaG91bGRTdWJtaXQsXHJcbiAgfTtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgUmVuZGVyUHJvbXB0ID0gUGljazxQcm9tcHQsIFwidGl0bGVcIiB8IFwiY29udGVudFwiPjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBQcm9tcHRIaW50cyhwcm9wczoge1xyXG4gIHByb21wdHM6IFJlbmRlclByb21wdFtdO1xyXG4gIG9uUHJvbXB0U2VsZWN0OiAocHJvbXB0OiBSZW5kZXJQcm9tcHQpID0+IHZvaWQ7XHJcbn0pIHtcclxuICBjb25zdCBub1Byb21wdHMgPSBwcm9wcy5wcm9tcHRzLmxlbmd0aCA9PT0gMDtcclxuICBjb25zdCBbc2VsZWN0SW5kZXgsIHNldFNlbGVjdEluZGV4XSA9IHVzZVN0YXRlKDApO1xyXG4gIGNvbnN0IHNlbGVjdGVkUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKTtcclxuXHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIHNldFNlbGVjdEluZGV4KDApO1xyXG4gIH0sIFtwcm9wcy5wcm9tcHRzLmxlbmd0aF0pO1xyXG5cclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgY29uc3Qgb25LZXlEb3duID0gKGU6IEtleWJvYXJkRXZlbnQpID0+IHtcclxuICAgICAgaWYgKG5vUHJvbXB0cyB8fCBlLm1ldGFLZXkgfHwgZS5hbHRLZXkgfHwgZS5jdHJsS2V5KSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIGFycm93IHVwIC8gZG93biB0byBzZWxlY3QgcHJvbXB0XHJcbiAgICAgIGNvbnN0IGNoYW5nZUluZGV4ID0gKGRlbHRhOiBudW1iZXIpID0+IHtcclxuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBjb25zdCBuZXh0SW5kZXggPSBNYXRoLm1heChcclxuICAgICAgICAgIDAsXHJcbiAgICAgICAgICBNYXRoLm1pbihwcm9wcy5wcm9tcHRzLmxlbmd0aCAtIDEsIHNlbGVjdEluZGV4ICsgZGVsdGEpLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgc2V0U2VsZWN0SW5kZXgobmV4dEluZGV4KTtcclxuICAgICAgICBzZWxlY3RlZFJlZi5jdXJyZW50Py5zY3JvbGxJbnRvVmlldyh7XHJcbiAgICAgICAgICBibG9jazogXCJjZW50ZXJcIixcclxuICAgICAgICB9KTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGlmIChlLmtleSA9PT0gXCJBcnJvd1VwXCIpIHtcclxuICAgICAgICBjaGFuZ2VJbmRleCgxKTtcclxuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gXCJBcnJvd0Rvd25cIikge1xyXG4gICAgICAgIGNoYW5nZUluZGV4KC0xKTtcclxuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gXCJFbnRlclwiKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRQcm9tcHQgPSBwcm9wcy5wcm9tcHRzLmF0KHNlbGVjdEluZGV4KTtcclxuICAgICAgICBpZiAoc2VsZWN0ZWRQcm9tcHQpIHtcclxuICAgICAgICAgIHByb3BzLm9uUHJvbXB0U2VsZWN0KHNlbGVjdGVkUHJvbXB0KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIG9uS2V5RG93bik7XHJcblxyXG4gICAgcmV0dXJuICgpID0+IHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBvbktleURvd24pO1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xyXG4gIH0sIFtwcm9wcy5wcm9tcHRzLmxlbmd0aCwgc2VsZWN0SW5kZXhdKTtcclxuXHJcbiAgaWYgKG5vUHJvbXB0cykgcmV0dXJuIG51bGw7XHJcbiAgcmV0dXJuIChcclxuICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXNbXCJwcm9tcHQtaGludHNcIl19PlxyXG4gICAgICB7cHJvcHMucHJvbXB0cy5tYXAoKHByb21wdCwgaSkgPT4gKFxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIHJlZj17aSA9PT0gc2VsZWN0SW5kZXggPyBzZWxlY3RlZFJlZiA6IG51bGx9XHJcbiAgICAgICAgICBjbGFzc05hbWU9e2Nsc3goc3R5bGVzW1wicHJvbXB0LWhpbnRcIl0sIHtcclxuICAgICAgICAgICAgW3N0eWxlc1tcInByb21wdC1oaW50LXNlbGVjdGVkXCJdXTogaSA9PT0gc2VsZWN0SW5kZXgsXHJcbiAgICAgICAgICB9KX1cclxuICAgICAgICAgIGtleT17cHJvbXB0LnRpdGxlICsgaS50b1N0cmluZygpfVxyXG4gICAgICAgICAgb25DbGljaz17KCkgPT4gcHJvcHMub25Qcm9tcHRTZWxlY3QocHJvbXB0KX1cclxuICAgICAgICAgIG9uTW91c2VFbnRlcj17KCkgPT4gc2V0U2VsZWN0SW5kZXgoaSl9XHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlc1tcImhpbnQtdGl0bGVcIl19Pntwcm9tcHQudGl0bGV9PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzW1wiaGludC1jb250ZW50XCJdfT57cHJvbXB0LmNvbnRlbnR9PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICkpfVxyXG4gICAgPC9kaXY+XHJcbiAgKTtcclxufVxyXG5cclxuZnVuY3Rpb24gQ2xlYXJDb250ZXh0RGl2aWRlcigpIHtcclxuICBjb25zdCBjaGF0U3RvcmUgPSB1c2VDaGF0U3RvcmUoKTtcclxuICBjb25zdCBzZXNzaW9uID0gY2hhdFN0b3JlLmN1cnJlbnRTZXNzaW9uKCk7XHJcblxyXG4gIHJldHVybiAoXHJcbiAgICA8ZGl2XHJcbiAgICAgIGNsYXNzTmFtZT17c3R5bGVzW1wiY2xlYXItY29udGV4dFwiXX1cclxuICAgICAgb25DbGljaz17KCkgPT5cclxuICAgICAgICBjaGF0U3RvcmUudXBkYXRlVGFyZ2V0U2Vzc2lvbihcclxuICAgICAgICAgIHNlc3Npb24sXHJcbiAgICAgICAgICAoc2Vzc2lvbikgPT4gKHNlc3Npb24uY2xlYXJDb250ZXh0SW5kZXggPSB1bmRlZmluZWQpLFxyXG4gICAgICAgIClcclxuICAgICAgfVxyXG4gICAgPlxyXG4gICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzW1wiY2xlYXItY29udGV4dC10aXBzXCJdfT57TG9jYWxlLkNvbnRleHQuQ2xlYXJ9PC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXNbXCJjbGVhci1jb250ZXh0LXJldmVydC1idG5cIl19PlxyXG4gICAgICAgIHtMb2NhbGUuQ29udGV4dC5SZXZlcnR9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIENoYXRBY3Rpb24ocHJvcHM6IHtcclxuICB0ZXh0OiBzdHJpbmc7XHJcbiAgaWNvbjogSlNYLkVsZW1lbnQ7XHJcbiAgb25DbGljazogKCkgPT4gdm9pZDtcclxufSkge1xyXG4gIGNvbnN0IGljb25SZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xyXG4gIGNvbnN0IHRleHRSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xyXG4gIGNvbnN0IFt3aWR0aCwgc2V0V2lkdGhdID0gdXNlU3RhdGUoe1xyXG4gICAgZnVsbDogMTYsXHJcbiAgICBpY29uOiAxNixcclxuICB9KTtcclxuXHJcbiAgZnVuY3Rpb24gdXBkYXRlV2lkdGgoKSB7XHJcbiAgICBpZiAoIWljb25SZWYuY3VycmVudCB8fCAhdGV4dFJlZi5jdXJyZW50KSByZXR1cm47XHJcbiAgICBjb25zdCBnZXRXaWR0aCA9IChkb206IEhUTUxEaXZFbGVtZW50KSA9PiBkb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XHJcbiAgICBjb25zdCB0ZXh0V2lkdGggPSBnZXRXaWR0aCh0ZXh0UmVmLmN1cnJlbnQpO1xyXG4gICAgY29uc3QgaWNvbldpZHRoID0gZ2V0V2lkdGgoaWNvblJlZi5jdXJyZW50KTtcclxuICAgIHNldFdpZHRoKHtcclxuICAgICAgZnVsbDogdGV4dFdpZHRoICsgaWNvbldpZHRoLFxyXG4gICAgICBpY29uOiBpY29uV2lkdGgsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHJldHVybiAoXHJcbiAgICA8ZGl2XHJcbiAgICAgIGNsYXNzTmFtZT17Y2xzeChzdHlsZXNbXCJjaGF0LWlucHV0LWFjdGlvblwiXSwgXCJjbGlja2FibGVcIil9XHJcbiAgICAgIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICBwcm9wcy5vbkNsaWNrKCk7XHJcbiAgICAgICAgc2V0VGltZW91dCh1cGRhdGVXaWR0aCwgMSk7XHJcbiAgICAgIH19XHJcbiAgICAgIG9uTW91c2VFbnRlcj17dXBkYXRlV2lkdGh9XHJcbiAgICAgIG9uVG91Y2hTdGFydD17dXBkYXRlV2lkdGh9XHJcbiAgICAgIHN0eWxlPXtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBcIi0taWNvbi13aWR0aFwiOiBgJHt3aWR0aC5pY29ufXB4YCxcclxuICAgICAgICAgIFwiLS1mdWxsLXdpZHRoXCI6IGAke3dpZHRoLmZ1bGx9cHhgLFxyXG4gICAgICAgIH0gYXMgUmVhY3QuQ1NTUHJvcGVydGllc1xyXG4gICAgICB9XHJcbiAgICA+XHJcbiAgICAgIDxkaXYgcmVmPXtpY29uUmVmfSBjbGFzc05hbWU9e3N0eWxlc1tcImljb25cIl19PlxyXG4gICAgICAgIHtwcm9wcy5pY29ufVxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlc1tcInRleHRcIl19IHJlZj17dGV4dFJlZn0+XHJcbiAgICAgICAge3Byb3BzLnRleHR9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgKTtcclxufVxyXG5cclxuZnVuY3Rpb24gdXNlU2Nyb2xsVG9Cb3R0b20oXHJcbiAgc2Nyb2xsUmVmOiBSZWZPYmplY3Q8SFRNTERpdkVsZW1lbnQ+LFxyXG4gIGRldGFjaDogYm9vbGVhbiA9IGZhbHNlLFxyXG4gIG1lc3NhZ2VzOiBDaGF0TWVzc2FnZVtdLFxyXG4pIHtcclxuICAvLyBmb3IgYXV0by1zY3JvbGxcclxuICBjb25zdCBbYXV0b1Njcm9sbCwgc2V0QXV0b1Njcm9sbF0gPSB1c2VTdGF0ZSh0cnVlKTtcclxuICBjb25zdCBzY3JvbGxEb21Ub0JvdHRvbSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcclxuICAgIGNvbnN0IGRvbSA9IHNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgaWYgKGRvbSkge1xyXG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgIHNldEF1dG9TY3JvbGwodHJ1ZSk7XHJcbiAgICAgICAgZG9tLnNjcm9sbFRvKDAsIGRvbS5zY3JvbGxIZWlnaHQpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9LCBbc2Nyb2xsUmVmXSk7XHJcblxyXG4gIC8vIGF1dG8gc2Nyb2xsXHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIGlmIChhdXRvU2Nyb2xsICYmICFkZXRhY2gpIHtcclxuICAgICAgc2Nyb2xsRG9tVG9Cb3R0b20oKTtcclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgLy8gYXV0byBzY3JvbGwgd2hlbiBtZXNzYWdlcyBsZW5ndGggY2hhbmdlc1xyXG4gIGNvbnN0IGxhc3RNZXNzYWdlc0xlbmd0aCA9IHVzZVJlZihtZXNzYWdlcy5sZW5ndGgpO1xyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICBpZiAobWVzc2FnZXMubGVuZ3RoID4gbGFzdE1lc3NhZ2VzTGVuZ3RoLmN1cnJlbnQgJiYgIWRldGFjaCkge1xyXG4gICAgICBzY3JvbGxEb21Ub0JvdHRvbSgpO1xyXG4gICAgfVxyXG4gICAgbGFzdE1lc3NhZ2VzTGVuZ3RoLmN1cnJlbnQgPSBtZXNzYWdlcy5sZW5ndGg7XHJcbiAgfSwgW21lc3NhZ2VzLmxlbmd0aCwgZGV0YWNoLCBzY3JvbGxEb21Ub0JvdHRvbV0pO1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgc2Nyb2xsUmVmLFxyXG4gICAgYXV0b1Njcm9sbCxcclxuICAgIHNldEF1dG9TY3JvbGwsXHJcbiAgICBzY3JvbGxEb21Ub0JvdHRvbSxcclxuICB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gQ2hhdEFjdGlvbnMocHJvcHM6IHtcclxuICB1cGxvYWRJbWFnZTogKCkgPT4gdm9pZDtcclxuICBzZXRBdHRhY2hJbWFnZXM6IChpbWFnZXM6IHN0cmluZ1tdKSA9PiB2b2lkO1xyXG4gIHNldFVwbG9hZGluZzogKHVwbG9hZGluZzogYm9vbGVhbikgPT4gdm9pZDtcclxuICBzaG93UHJvbXB0TW9kYWw6ICgpID0+IHZvaWQ7XHJcbiAgc2Nyb2xsVG9Cb3R0b206ICgpID0+IHZvaWQ7XHJcbiAgc2hvd1Byb21wdEhpbnRzOiAoKSA9PiB2b2lkO1xyXG4gIGhpdEJvdHRvbTogYm9vbGVhbjtcclxuICB1cGxvYWRpbmc6IGJvb2xlYW47XHJcbiAgc2V0U2hvd1Nob3J0Y3V0S2V5TW9kYWw6IFJlYWN0LkRpc3BhdGNoPFJlYWN0LlNldFN0YXRlQWN0aW9uPGJvb2xlYW4+PjtcclxuICBzZXRVc2VySW5wdXQ6IChpbnB1dDogc3RyaW5nKSA9PiB2b2lkO1xyXG4gIHNldFNob3dDaGF0U2lkZVBhbmVsOiBSZWFjdC5EaXNwYXRjaDxSZWFjdC5TZXRTdGF0ZUFjdGlvbjxib29sZWFuPj47XHJcbn0pIHtcclxuICBjb25zdCBjb25maWcgPSB1c2VBcHBDb25maWcoKTtcclxuICBjb25zdCBuYXZpZ2F0ZSA9IHVzZU5hdmlnYXRlKCk7XHJcbiAgY29uc3QgY2hhdFN0b3JlID0gdXNlQ2hhdFN0b3JlKCk7XHJcbiAgY29uc3QgcGx1Z2luU3RvcmUgPSB1c2VQbHVnaW5TdG9yZSgpO1xyXG4gIGNvbnN0IHNlc3Npb24gPSBjaGF0U3RvcmUuY3VycmVudFNlc3Npb24oKTtcclxuXHJcbiAgLy8gc3dpdGNoIHRoZW1lc1xyXG4gIGNvbnN0IHRoZW1lID0gY29uZmlnLnRoZW1lO1xyXG5cclxuICBmdW5jdGlvbiBuZXh0VGhlbWUoKSB7XHJcbiAgICBjb25zdCB0aGVtZXMgPSBbVGhlbWUuQXV0bywgVGhlbWUuTGlnaHQsIFRoZW1lLkRhcmtdO1xyXG4gICAgY29uc3QgdGhlbWVJbmRleCA9IHRoZW1lcy5pbmRleE9mKHRoZW1lKTtcclxuICAgIGNvbnN0IG5leHRJbmRleCA9ICh0aGVtZUluZGV4ICsgMSkgJSB0aGVtZXMubGVuZ3RoO1xyXG4gICAgY29uc3QgbmV4dFRoZW1lID0gdGhlbWVzW25leHRJbmRleF07XHJcbiAgICBjb25maWcudXBkYXRlKChjb25maWcpID0+IChjb25maWcudGhlbWUgPSBuZXh0VGhlbWUpKTtcclxuICB9XHJcblxyXG4gIC8vIHN0b3AgYWxsIHJlc3BvbnNlc1xyXG4gIGNvbnN0IGNvdWxkU3RvcCA9IENoYXRDb250cm9sbGVyUG9vbC5oYXNQZW5kaW5nKCk7XHJcbiAgY29uc3Qgc3RvcEFsbCA9ICgpID0+IENoYXRDb250cm9sbGVyUG9vbC5zdG9wQWxsKCk7XHJcblxyXG4gIC8vIHN3aXRjaCBtb2RlbFxyXG4gIGNvbnN0IGN1cnJlbnRNb2RlbCA9IHNlc3Npb24ubWFzay5tb2RlbENvbmZpZy5tb2RlbDtcclxuICBjb25zdCBjdXJyZW50UHJvdmlkZXJOYW1lID1cclxuICAgIHNlc3Npb24ubWFzay5tb2RlbENvbmZpZz8ucHJvdmlkZXJOYW1lIHx8IFNlcnZpY2VQcm92aWRlci5PcGVuQUk7XHJcbiAgY29uc3QgYWxsTW9kZWxzID0gdXNlQWxsTW9kZWxzKCk7XHJcbiAgY29uc3QgbW9kZWxzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICBjb25zdCBmaWx0ZXJlZE1vZGVscyA9IGFsbE1vZGVscy5maWx0ZXIoKG0pID0+IG0uYXZhaWxhYmxlKTtcclxuICAgIGNvbnN0IGRlZmF1bHRNb2RlbCA9IGZpbHRlcmVkTW9kZWxzLmZpbmQoKG0pID0+IG0uaXNEZWZhdWx0KTtcclxuXHJcbiAgICBpZiAoZGVmYXVsdE1vZGVsKSB7XHJcbiAgICAgIGNvbnN0IGFyciA9IFtcclxuICAgICAgICBkZWZhdWx0TW9kZWwsXHJcbiAgICAgICAgLi4uZmlsdGVyZWRNb2RlbHMuZmlsdGVyKChtKSA9PiBtICE9PSBkZWZhdWx0TW9kZWwpLFxyXG4gICAgICBdO1xyXG4gICAgICByZXR1cm4gYXJyO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGZpbHRlcmVkTW9kZWxzO1xyXG4gICAgfVxyXG4gIH0sIFthbGxNb2RlbHNdKTtcclxuICBjb25zdCBjdXJyZW50TW9kZWxOYW1lID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICBjb25zdCBtb2RlbCA9IG1vZGVscy5maW5kKFxyXG4gICAgICAobSkgPT5cclxuICAgICAgICBtLm5hbWUgPT0gY3VycmVudE1vZGVsICYmXHJcbiAgICAgICAgbT8ucHJvdmlkZXI/LnByb3ZpZGVyTmFtZSA9PSBjdXJyZW50UHJvdmlkZXJOYW1lLFxyXG4gICAgKTtcclxuICAgIHJldHVybiBtb2RlbD8uZGlzcGxheU5hbWUgPz8gXCJcIjtcclxuICB9LCBbbW9kZWxzLCBjdXJyZW50TW9kZWwsIGN1cnJlbnRQcm92aWRlck5hbWVdKTtcclxuICBjb25zdCBbc2hvd01vZGVsU2VsZWN0b3IsIHNldFNob3dNb2RlbFNlbGVjdG9yXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBbc2hvd1BsdWdpblNlbGVjdG9yLCBzZXRTaG93UGx1Z2luU2VsZWN0b3JdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFtzaG93VXBsb2FkSW1hZ2UsIHNldFNob3dVcGxvYWRJbWFnZV0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcblxyXG4gIGNvbnN0IFtzaG93U2l6ZVNlbGVjdG9yLCBzZXRTaG93U2l6ZVNlbGVjdG9yXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBbc2hvd1F1YWxpdHlTZWxlY3Rvciwgc2V0U2hvd1F1YWxpdHlTZWxlY3Rvcl0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW3Nob3dTdHlsZVNlbGVjdG9yLCBzZXRTaG93U3R5bGVTZWxlY3Rvcl0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgbW9kZWxTaXplcyA9IGdldE1vZGVsU2l6ZXMoY3VycmVudE1vZGVsKTtcclxuICBjb25zdCBkYWxsZTNRdWFsaXR5czogRGFsbGVRdWFsaXR5W10gPSBbXCJzdGFuZGFyZFwiLCBcImhkXCJdO1xyXG4gIGNvbnN0IGRhbGxlM1N0eWxlczogRGFsbGVTdHlsZVtdID0gW1widml2aWRcIiwgXCJuYXR1cmFsXCJdO1xyXG4gIGNvbnN0IGN1cnJlbnRTaXplID1cclxuICAgIHNlc3Npb24ubWFzay5tb2RlbENvbmZpZz8uc2l6ZSA/PyAoXCIxMDI0eDEwMjRcIiBhcyBNb2RlbFNpemUpO1xyXG4gIGNvbnN0IGN1cnJlbnRRdWFsaXR5ID0gc2Vzc2lvbi5tYXNrLm1vZGVsQ29uZmlnPy5xdWFsaXR5ID8/IFwic3RhbmRhcmRcIjtcclxuICBjb25zdCBjdXJyZW50U3R5bGUgPSBzZXNzaW9uLm1hc2subW9kZWxDb25maWc/LnN0eWxlID8/IFwidml2aWRcIjtcclxuXHJcbiAgY29uc3QgaXNNb2JpbGVTY3JlZW4gPSB1c2VNb2JpbGVTY3JlZW4oKTtcclxuXHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIGNvbnN0IHNob3cgPSBpc1Zpc2lvbk1vZGVsKGN1cnJlbnRNb2RlbCk7XHJcbiAgICBzZXRTaG93VXBsb2FkSW1hZ2Uoc2hvdyk7XHJcbiAgICBpZiAoIXNob3cpIHtcclxuICAgICAgcHJvcHMuc2V0QXR0YWNoSW1hZ2VzKFtdKTtcclxuICAgICAgcHJvcHMuc2V0VXBsb2FkaW5nKGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBpZiBjdXJyZW50IG1vZGVsIGlzIG5vdCBhdmFpbGFibGVcclxuICAgIC8vIHN3aXRjaCB0byBmaXJzdCBhdmFpbGFibGUgbW9kZWxcclxuICAgIGNvbnN0IGlzVW5hdmFpbGFibGVNb2RlbCA9ICFtb2RlbHMuc29tZSgobSkgPT4gbS5uYW1lID09PSBjdXJyZW50TW9kZWwpO1xyXG4gICAgaWYgKGlzVW5hdmFpbGFibGVNb2RlbCAmJiBtb2RlbHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAvLyBzaG93IG5leHQgbW9kZWwgdG8gZGVmYXVsdCBtb2RlbCBpZiBleGlzdFxyXG4gICAgICBsZXQgbmV4dE1vZGVsID0gbW9kZWxzLmZpbmQoKG1vZGVsKSA9PiBtb2RlbC5pc0RlZmF1bHQpIHx8IG1vZGVsc1swXTtcclxuICAgICAgY2hhdFN0b3JlLnVwZGF0ZVRhcmdldFNlc3Npb24oc2Vzc2lvbiwgKHNlc3Npb24pID0+IHtcclxuICAgICAgICBzZXNzaW9uLm1hc2subW9kZWxDb25maWcubW9kZWwgPSBuZXh0TW9kZWwubmFtZTtcclxuICAgICAgICBzZXNzaW9uLm1hc2subW9kZWxDb25maWcucHJvdmlkZXJOYW1lID0gbmV4dE1vZGVsPy5wcm92aWRlclxyXG4gICAgICAgICAgPy5wcm92aWRlck5hbWUgYXMgU2VydmljZVByb3ZpZGVyO1xyXG4gICAgICB9KTtcclxuICAgICAgc2hvd1RvYXN0KFxyXG4gICAgICAgIG5leHRNb2RlbD8ucHJvdmlkZXI/LnByb3ZpZGVyTmFtZSA9PSBcIkJ5dGVEYW5jZVwiXHJcbiAgICAgICAgICA/IG5leHRNb2RlbC5kaXNwbGF5TmFtZVxyXG4gICAgICAgICAgOiBuZXh0TW9kZWwubmFtZSxcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9LCBbY2hhdFN0b3JlLCBjdXJyZW50TW9kZWwsIG1vZGVscywgc2Vzc2lvbl0pO1xyXG5cclxuICByZXR1cm4gKFxyXG4gICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlc1tcImNoYXQtaW5wdXQtYWN0aW9uc1wiXX0+XHJcbiAgICAgIDw+XHJcbiAgICAgICAge2NvdWxkU3RvcCAmJiAoXHJcbiAgICAgICAgICA8Q2hhdEFjdGlvblxyXG4gICAgICAgICAgICBvbkNsaWNrPXtzdG9wQWxsfVxyXG4gICAgICAgICAgICB0ZXh0PXtMb2NhbGUuQ2hhdC5JbnB1dEFjdGlvbnMuU3RvcH1cclxuICAgICAgICAgICAgaWNvbj17PFN0b3BJY29uIC8+fVxyXG4gICAgICAgICAgLz5cclxuICAgICAgICApfVxyXG4gICAgICAgIHshcHJvcHMuaGl0Qm90dG9tICYmIChcclxuICAgICAgICAgIDxDaGF0QWN0aW9uXHJcbiAgICAgICAgICAgIG9uQ2xpY2s9e3Byb3BzLnNjcm9sbFRvQm90dG9tfVxyXG4gICAgICAgICAgICB0ZXh0PXtMb2NhbGUuQ2hhdC5JbnB1dEFjdGlvbnMuVG9Cb3R0b219XHJcbiAgICAgICAgICAgIGljb249ezxCb3R0b21JY29uIC8+fVxyXG4gICAgICAgICAgLz5cclxuICAgICAgICApfVxyXG4gICAgICAgIHtwcm9wcy5oaXRCb3R0b20gJiYgKFxyXG4gICAgICAgICAgPENoYXRBY3Rpb25cclxuICAgICAgICAgICAgb25DbGljaz17cHJvcHMuc2hvd1Byb21wdE1vZGFsfVxyXG4gICAgICAgICAgICB0ZXh0PXtMb2NhbGUuQ2hhdC5JbnB1dEFjdGlvbnMuU2V0dGluZ3N9XHJcbiAgICAgICAgICAgIGljb249ezxTZXR0aW5nc0ljb24gLz59XHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgICl9XHJcblxyXG4gICAgICAgIHtzaG93VXBsb2FkSW1hZ2UgJiYgKFxyXG4gICAgICAgICAgPENoYXRBY3Rpb25cclxuICAgICAgICAgICAgb25DbGljaz17cHJvcHMudXBsb2FkSW1hZ2V9XHJcbiAgICAgICAgICAgIHRleHQ9e0xvY2FsZS5DaGF0LklucHV0QWN0aW9ucy5VcGxvYWRJbWFnZX1cclxuICAgICAgICAgICAgaWNvbj17cHJvcHMudXBsb2FkaW5nID8gPExvYWRpbmdCdXR0b25JY29uIC8+IDogPEltYWdlSWNvbiAvPn1cclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgKX1cclxuICAgICAgICA8Q2hhdEFjdGlvblxyXG4gICAgICAgICAgb25DbGljaz17bmV4dFRoZW1lfVxyXG4gICAgICAgICAgdGV4dD17TG9jYWxlLkNoYXQuSW5wdXRBY3Rpb25zLlRoZW1lW3RoZW1lXX1cclxuICAgICAgICAgIGljb249e1xyXG4gICAgICAgICAgICA8PlxyXG4gICAgICAgICAgICAgIHt0aGVtZSA9PT0gVGhlbWUuQXV0byA/IChcclxuICAgICAgICAgICAgICAgIDxBdXRvSWNvbiAvPlxyXG4gICAgICAgICAgICAgICkgOiB0aGVtZSA9PT0gVGhlbWUuTGlnaHQgPyAoXHJcbiAgICAgICAgICAgICAgICA8TGlnaHRJY29uIC8+XHJcbiAgICAgICAgICAgICAgKSA6IHRoZW1lID09PSBUaGVtZS5EYXJrID8gKFxyXG4gICAgICAgICAgICAgICAgPERhcmtJY29uIC8+XHJcbiAgICAgICAgICAgICAgKSA6IG51bGx9XHJcbiAgICAgICAgICAgIDwvPlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIC8+XHJcblxyXG4gICAgICAgIDxDaGF0QWN0aW9uXHJcbiAgICAgICAgICB0ZXh0PXtMb2NhbGUuQ2hhdC5JbnB1dEFjdGlvbnMuQ2xlYXJ9XHJcbiAgICAgICAgICBpY29uPXs8QnJlYWtJY29uIC8+fVxyXG4gICAgICAgICAgb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICBjaGF0U3RvcmUudXBkYXRlVGFyZ2V0U2Vzc2lvbihzZXNzaW9uLCAoc2Vzc2lvbikgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChzZXNzaW9uLmNsZWFyQ29udGV4dEluZGV4ID09PSBzZXNzaW9uLm1lc3NhZ2VzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgc2Vzc2lvbi5jbGVhckNvbnRleHRJbmRleCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc2Vzc2lvbi5jbGVhckNvbnRleHRJbmRleCA9IHNlc3Npb24ubWVzc2FnZXMubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgc2Vzc2lvbi5tZW1vcnlQcm9tcHQgPSBcIlwiOyAvLyB3aWxsIGNsZWFyIG1lbW9yeVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9fVxyXG4gICAgICAgIC8+XHJcblxyXG4gICAgICAgIHtzdXBwb3J0c0N1c3RvbVNpemUoY3VycmVudE1vZGVsKSAmJiAoXHJcbiAgICAgICAgICA8Q2hhdEFjdGlvblxyXG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRTaG93U2l6ZVNlbGVjdG9yKHRydWUpfVxyXG4gICAgICAgICAgICB0ZXh0PXtjdXJyZW50U2l6ZX1cclxuICAgICAgICAgICAgaWNvbj17PFNpemVJY29uIC8+fVxyXG4gICAgICAgICAgLz5cclxuICAgICAgICApfVxyXG5cclxuICAgICAgICB7c2hvd1NpemVTZWxlY3RvciAmJiAoXHJcbiAgICAgICAgICA8U2VsZWN0b3JcclxuICAgICAgICAgICAgZGVmYXVsdFNlbGVjdGVkVmFsdWU9e2N1cnJlbnRTaXplfVxyXG4gICAgICAgICAgICBpdGVtcz17bW9kZWxTaXplcy5tYXAoKG0pID0+ICh7XHJcbiAgICAgICAgICAgICAgdGl0bGU6IG0sXHJcbiAgICAgICAgICAgICAgdmFsdWU6IG0sXHJcbiAgICAgICAgICAgIH0pKX1cclxuICAgICAgICAgICAgb25DbG9zZT17KCkgPT4gc2V0U2hvd1NpemVTZWxlY3RvcihmYWxzZSl9XHJcbiAgICAgICAgICAgIG9uU2VsZWN0aW9uPXsocykgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xyXG4gICAgICAgICAgICAgIGNvbnN0IHNpemUgPSBzWzBdO1xyXG4gICAgICAgICAgICAgIGNoYXRTdG9yZS51cGRhdGVUYXJnZXRTZXNzaW9uKHNlc3Npb24sIChzZXNzaW9uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBzZXNzaW9uLm1hc2subW9kZWxDb25maWcuc2l6ZSA9IHNpemU7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgc2hvd1RvYXN0KHNpemUpO1xyXG4gICAgICAgICAgICB9fVxyXG4gICAgICAgICAgLz5cclxuICAgICAgICApfVxyXG5cclxuICAgICAgICB7aXNEYWxsZTMoY3VycmVudE1vZGVsKSAmJiAoXHJcbiAgICAgICAgICA8Q2hhdEFjdGlvblxyXG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRTaG93UXVhbGl0eVNlbGVjdG9yKHRydWUpfVxyXG4gICAgICAgICAgICB0ZXh0PXtjdXJyZW50UXVhbGl0eX1cclxuICAgICAgICAgICAgaWNvbj17PFF1YWxpdHlJY29uIC8+fVxyXG4gICAgICAgICAgLz5cclxuICAgICAgICApfVxyXG5cclxuICAgICAgICB7c2hvd1F1YWxpdHlTZWxlY3RvciAmJiAoXHJcbiAgICAgICAgICA8U2VsZWN0b3JcclxuICAgICAgICAgICAgZGVmYXVsdFNlbGVjdGVkVmFsdWU9e2N1cnJlbnRRdWFsaXR5fVxyXG4gICAgICAgICAgICBpdGVtcz17ZGFsbGUzUXVhbGl0eXMubWFwKChtKSA9PiAoe1xyXG4gICAgICAgICAgICAgIHRpdGxlOiBtLFxyXG4gICAgICAgICAgICAgIHZhbHVlOiBtLFxyXG4gICAgICAgICAgICB9KSl9XHJcbiAgICAgICAgICAgIG9uQ2xvc2U9eygpID0+IHNldFNob3dRdWFsaXR5U2VsZWN0b3IoZmFsc2UpfVxyXG4gICAgICAgICAgICBvblNlbGVjdGlvbj17KHEpID0+IHtcclxuICAgICAgICAgICAgICBpZiAocS5sZW5ndGggPT09IDApIHJldHVybjtcclxuICAgICAgICAgICAgICBjb25zdCBxdWFsaXR5ID0gcVswXTtcclxuICAgICAgICAgICAgICBjaGF0U3RvcmUudXBkYXRlVGFyZ2V0U2Vzc2lvbihzZXNzaW9uLCAoc2Vzc2lvbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgc2Vzc2lvbi5tYXNrLm1vZGVsQ29uZmlnLnF1YWxpdHkgPSBxdWFsaXR5O1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIHNob3dUb2FzdChxdWFsaXR5KTtcclxuICAgICAgICAgICAgfX1cclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgKX1cclxuXHJcbiAgICAgICAge2lzRGFsbGUzKGN1cnJlbnRNb2RlbCkgJiYgKFxyXG4gICAgICAgICAgPENoYXRBY3Rpb25cclxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0U2hvd1N0eWxlU2VsZWN0b3IodHJ1ZSl9XHJcbiAgICAgICAgICAgIHRleHQ9e2N1cnJlbnRTdHlsZX1cclxuICAgICAgICAgICAgaWNvbj17PFN0eWxlSWNvbiAvPn1cclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgKX1cclxuXHJcbiAgICAgICAge3Nob3dTdHlsZVNlbGVjdG9yICYmIChcclxuICAgICAgICAgIDxTZWxlY3RvclxyXG4gICAgICAgICAgICBkZWZhdWx0U2VsZWN0ZWRWYWx1ZT17Y3VycmVudFN0eWxlfVxyXG4gICAgICAgICAgICBpdGVtcz17ZGFsbGUzU3R5bGVzLm1hcCgobSkgPT4gKHtcclxuICAgICAgICAgICAgICB0aXRsZTogbSxcclxuICAgICAgICAgICAgICB2YWx1ZTogbSxcclxuICAgICAgICAgICAgfSkpfVxyXG4gICAgICAgICAgICBvbkNsb3NlPXsoKSA9PiBzZXRTaG93U3R5bGVTZWxlY3RvcihmYWxzZSl9XHJcbiAgICAgICAgICAgIG9uU2VsZWN0aW9uPXsocykgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xyXG4gICAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gc1swXTtcclxuICAgICAgICAgICAgICBjaGF0U3RvcmUudXBkYXRlVGFyZ2V0U2Vzc2lvbihzZXNzaW9uLCAoc2Vzc2lvbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgc2Vzc2lvbi5tYXNrLm1vZGVsQ29uZmlnLnN0eWxlID0gc3R5bGU7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgc2hvd1RvYXN0KHN0eWxlKTtcclxuICAgICAgICAgICAgfX1cclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgKX1cclxuXHJcbiAgICAgICAge3Nob3dQbHVnaW5zKGN1cnJlbnRQcm92aWRlck5hbWUsIGN1cnJlbnRNb2RlbCkgJiYgKFxyXG4gICAgICAgICAgPENoYXRBY3Rpb25cclxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChwbHVnaW5TdG9yZS5nZXRBbGwoKS5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgbmF2aWdhdGUoUGF0aC5QbHVnaW5zKTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc2V0U2hvd1BsdWdpblNlbGVjdG9yKHRydWUpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgdGV4dD17TG9jYWxlLlBsdWdpbi5OYW1lfVxyXG4gICAgICAgICAgICBpY29uPXs8UGx1Z2luSWNvbiAvPn1cclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgKX1cclxuICAgICAgICB7c2hvd1BsdWdpblNlbGVjdG9yICYmIChcclxuICAgICAgICAgIDxTZWxlY3RvclxyXG4gICAgICAgICAgICBtdWx0aXBsZVxyXG4gICAgICAgICAgICBkZWZhdWx0U2VsZWN0ZWRWYWx1ZT17Y2hhdFN0b3JlLmN1cnJlbnRTZXNzaW9uKCkubWFzaz8ucGx1Z2lufVxyXG4gICAgICAgICAgICBpdGVtcz17cGx1Z2luU3RvcmUuZ2V0QWxsKCkubWFwKChpdGVtKSA9PiAoe1xyXG4gICAgICAgICAgICAgIHRpdGxlOiBgJHtpdGVtPy50aXRsZX1AJHtpdGVtPy52ZXJzaW9ufWAsXHJcbiAgICAgICAgICAgICAgdmFsdWU6IGl0ZW0/LmlkLFxyXG4gICAgICAgICAgICB9KSl9XHJcbiAgICAgICAgICAgIG9uQ2xvc2U9eygpID0+IHNldFNob3dQbHVnaW5TZWxlY3RvcihmYWxzZSl9XHJcbiAgICAgICAgICAgIG9uU2VsZWN0aW9uPXsocykgPT4ge1xyXG4gICAgICAgICAgICAgIGNoYXRTdG9yZS51cGRhdGVUYXJnZXRTZXNzaW9uKHNlc3Npb24sIChzZXNzaW9uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBzZXNzaW9uLm1hc2sucGx1Z2luID0gcyBhcyBzdHJpbmdbXTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfX1cclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgKX1cclxuXHJcbiAgICAgICAgeyFpc01vYmlsZVNjcmVlbiAmJiAoXHJcbiAgICAgICAgICA8Q2hhdEFjdGlvblxyXG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBwcm9wcy5zZXRTaG93U2hvcnRjdXRLZXlNb2RhbCh0cnVlKX1cclxuICAgICAgICAgICAgdGV4dD17TG9jYWxlLkNoYXQuU2hvcnRjdXRLZXkuVGl0bGV9XHJcbiAgICAgICAgICAgIGljb249ezxTaG9ydGN1dGtleUljb24gLz59XHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgICl9XHJcbiAgICAgICAgeyFpc01vYmlsZVNjcmVlbiAmJiA8TUNQQWN0aW9uIC8+fVxyXG4gICAgICA8Lz5cclxuICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlc1tcImNoYXQtaW5wdXQtYWN0aW9ucy1lbmRcIl19PlxyXG4gICAgICAgIHtjb25maWcucmVhbHRpbWVDb25maWcuZW5hYmxlICYmIChcclxuICAgICAgICAgIDxDaGF0QWN0aW9uXHJcbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHByb3BzLnNldFNob3dDaGF0U2lkZVBhbmVsKHRydWUpfVxyXG4gICAgICAgICAgICB0ZXh0PXtcIlJlYWx0aW1lIENoYXRcIn1cclxuICAgICAgICAgICAgaWNvbj17PEhlYWRwaG9uZUljb24gLz59XHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgICl9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIEVkaXRNZXNzYWdlTW9kYWwocHJvcHM6IHsgb25DbG9zZTogKCkgPT4gdm9pZCB9KSB7XHJcbiAgY29uc3QgY2hhdFN0b3JlID0gdXNlQ2hhdFN0b3JlKCk7XHJcbiAgY29uc3Qgc2Vzc2lvbiA9IGNoYXRTdG9yZS5jdXJyZW50U2Vzc2lvbigpO1xyXG4gIGNvbnN0IFttZXNzYWdlcywgc2V0TWVzc2FnZXNdID0gdXNlU3RhdGUoc2Vzc2lvbi5tZXNzYWdlcy5zbGljZSgpKTtcclxuXHJcbiAgcmV0dXJuIChcclxuICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtbWFza1wiPlxyXG4gICAgICA8TW9kYWxcclxuICAgICAgICB0aXRsZT17TG9jYWxlLkNoYXQuRWRpdE1lc3NhZ2UuVGl0bGV9XHJcbiAgICAgICAgb25DbG9zZT17cHJvcHMub25DbG9zZX1cclxuICAgICAgICBhY3Rpb25zPXtbXHJcbiAgICAgICAgICA8SWNvbkJ1dHRvblxyXG4gICAgICAgICAgICB0ZXh0PXtMb2NhbGUuVUkuQ2FuY2VsfVxyXG4gICAgICAgICAgICBpY29uPXs8Q2FuY2VsSWNvbiAvPn1cclxuICAgICAgICAgICAga2V5PVwiY2FuY2VsXCJcclxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICAgIHByb3BzLm9uQ2xvc2UoKTtcclxuICAgICAgICAgICAgfX1cclxuICAgICAgICAgIC8+LFxyXG4gICAgICAgICAgPEljb25CdXR0b25cclxuICAgICAgICAgICAgdHlwZT1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICB0ZXh0PXtMb2NhbGUuVUkuQ29uZmlybX1cclxuICAgICAgICAgICAgaWNvbj17PENvbmZpcm1JY29uIC8+fVxyXG4gICAgICAgICAgICBrZXk9XCJva1wiXHJcbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICBjaGF0U3RvcmUudXBkYXRlVGFyZ2V0U2Vzc2lvbihcclxuICAgICAgICAgICAgICAgIHNlc3Npb24sXHJcbiAgICAgICAgICAgICAgICAoc2Vzc2lvbikgPT4gKHNlc3Npb24ubWVzc2FnZXMgPSBtZXNzYWdlcyksXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICBwcm9wcy5vbkNsb3NlKCk7XHJcbiAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAvPixcclxuICAgICAgICBdfVxyXG4gICAgICA+XHJcbiAgICAgICAgPExpc3Q+XHJcbiAgICAgICAgICA8TGlzdEl0ZW1cclxuICAgICAgICAgICAgdGl0bGU9e0xvY2FsZS5DaGF0LkVkaXRNZXNzYWdlLlRvcGljLlRpdGxlfVxyXG4gICAgICAgICAgICBzdWJUaXRsZT17TG9jYWxlLkNoYXQuRWRpdE1lc3NhZ2UuVG9waWMuU3ViVGl0bGV9XHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICB2YWx1ZT17c2Vzc2lvbi50b3BpY31cclxuICAgICAgICAgICAgICBvbklucHV0PXsoZSkgPT5cclxuICAgICAgICAgICAgICAgIGNoYXRTdG9yZS51cGRhdGVUYXJnZXRTZXNzaW9uKFxyXG4gICAgICAgICAgICAgICAgICBzZXNzaW9uLFxyXG4gICAgICAgICAgICAgICAgICAoc2Vzc2lvbikgPT4gKHNlc3Npb24udG9waWMgPSBlLmN1cnJlbnRUYXJnZXQudmFsdWUpLFxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPjwvaW5wdXQ+XHJcbiAgICAgICAgICA8L0xpc3RJdGVtPlxyXG4gICAgICAgIDwvTGlzdD5cclxuICAgICAgICA8Q29udGV4dFByb21wdHNcclxuICAgICAgICAgIGNvbnRleHQ9e21lc3NhZ2VzfVxyXG4gICAgICAgICAgdXBkYXRlQ29udGV4dD17KHVwZGF0ZXIpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbmV3TWVzc2FnZXMgPSBtZXNzYWdlcy5zbGljZSgpO1xyXG4gICAgICAgICAgICB1cGRhdGVyKG5ld01lc3NhZ2VzKTtcclxuICAgICAgICAgICAgc2V0TWVzc2FnZXMobmV3TWVzc2FnZXMpO1xyXG4gICAgICAgICAgfX1cclxuICAgICAgICAvPlxyXG4gICAgICA8L01vZGFsPlxyXG4gICAgPC9kaXY+XHJcbiAgKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIERlbGV0ZUltYWdlQnV0dG9uKHByb3BzOiB7IGRlbGV0ZUltYWdlOiAoKSA9PiB2b2lkIH0pIHtcclxuICByZXR1cm4gKFxyXG4gICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlc1tcImRlbGV0ZS1pbWFnZVwiXX0gb25DbGljaz17cHJvcHMuZGVsZXRlSW1hZ2V9PlxyXG4gICAgICA8RGVsZXRlSWNvbiAvPlxyXG4gICAgPC9kaXY+XHJcbiAgKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIFNob3J0Y3V0S2V5TW9kYWwocHJvcHM6IHsgb25DbG9zZTogKCkgPT4gdm9pZCB9KSB7XHJcbiAgY29uc3QgaXNNYWMgPSBuYXZpZ2F0b3IucGxhdGZvcm0udG9VcHBlckNhc2UoKS5pbmRleE9mKFwiTUFDXCIpID49IDA7XHJcbiAgY29uc3Qgc2hvcnRjdXRzID0gW1xyXG4gICAge1xyXG4gICAgICB0aXRsZTogTG9jYWxlLkNoYXQuU2hvcnRjdXRLZXkubmV3Q2hhdCxcclxuICAgICAga2V5czogaXNNYWMgPyBbXCLijJhcIiwgXCJTaGlmdFwiLCBcIk9cIl0gOiBbXCJDdHJsXCIsIFwiU2hpZnRcIiwgXCJPXCJdLFxyXG4gICAgfSxcclxuICAgIHsgdGl0bGU6IExvY2FsZS5DaGF0LlNob3J0Y3V0S2V5LmZvY3VzSW5wdXQsIGtleXM6IFtcIlNoaWZ0XCIsIFwiRXNjXCJdIH0sXHJcbiAgICB7XHJcbiAgICAgIHRpdGxlOiBMb2NhbGUuQ2hhdC5TaG9ydGN1dEtleS5jb3B5TGFzdENvZGUsXHJcbiAgICAgIGtleXM6IGlzTWFjID8gW1wi4oyYXCIsIFwiU2hpZnRcIiwgXCI7XCJdIDogW1wiQ3RybFwiLCBcIlNoaWZ0XCIsIFwiO1wiXSxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHRpdGxlOiBMb2NhbGUuQ2hhdC5TaG9ydGN1dEtleS5jb3B5TGFzdE1lc3NhZ2UsXHJcbiAgICAgIGtleXM6IGlzTWFjID8gW1wi4oyYXCIsIFwiU2hpZnRcIiwgXCJDXCJdIDogW1wiQ3RybFwiLCBcIlNoaWZ0XCIsIFwiQ1wiXSxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHRpdGxlOiBMb2NhbGUuQ2hhdC5TaG9ydGN1dEtleS5zaG93U2hvcnRjdXRLZXksXHJcbiAgICAgIGtleXM6IGlzTWFjID8gW1wi4oyYXCIsIFwiL1wiXSA6IFtcIkN0cmxcIiwgXCIvXCJdLFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgdGl0bGU6IExvY2FsZS5DaGF0LlNob3J0Y3V0S2V5LmNsZWFyQ29udGV4dCxcclxuICAgICAga2V5czogaXNNYWNcclxuICAgICAgICA/IFtcIuKMmFwiLCBcIlNoaWZ0XCIsIFwiYmFja3NwYWNlXCJdXHJcbiAgICAgICAgOiBbXCJDdHJsXCIsIFwiU2hpZnRcIiwgXCJiYWNrc3BhY2VcIl0sXHJcbiAgICB9LFxyXG4gIF07XHJcbiAgcmV0dXJuIChcclxuICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtbWFza1wiPlxyXG4gICAgICA8TW9kYWxcclxuICAgICAgICB0aXRsZT17TG9jYWxlLkNoYXQuU2hvcnRjdXRLZXkuVGl0bGV9XHJcbiAgICAgICAgb25DbG9zZT17cHJvcHMub25DbG9zZX1cclxuICAgICAgICBhY3Rpb25zPXtbXHJcbiAgICAgICAgICA8SWNvbkJ1dHRvblxyXG4gICAgICAgICAgICB0eXBlPVwicHJpbWFyeVwiXHJcbiAgICAgICAgICAgIHRleHQ9e0xvY2FsZS5VSS5Db25maXJtfVxyXG4gICAgICAgICAgICBpY29uPXs8Q29uZmlybUljb24gLz59XHJcbiAgICAgICAgICAgIGtleT1cIm9rXCJcclxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICAgIHByb3BzLm9uQ2xvc2UoKTtcclxuICAgICAgICAgICAgfX1cclxuICAgICAgICAgIC8+LFxyXG4gICAgICAgIF19XHJcbiAgICAgID5cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzW1wic2hvcnRjdXQta2V5LWNvbnRhaW5lclwiXX0+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzW1wic2hvcnRjdXQta2V5LWdyaWRcIl19PlxyXG4gICAgICAgICAgICB7c2hvcnRjdXRzLm1hcCgoc2hvcnRjdXQsIGluZGV4KSA9PiAoXHJcbiAgICAgICAgICAgICAgPGRpdiBrZXk9e2luZGV4fSBjbGFzc05hbWU9e3N0eWxlc1tcInNob3J0Y3V0LWtleS1pdGVtXCJdfT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXNbXCJzaG9ydGN1dC1rZXktdGl0bGVcIl19PlxyXG4gICAgICAgICAgICAgICAgICB7c2hvcnRjdXQudGl0bGV9XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXNbXCJzaG9ydGN1dC1rZXkta2V5c1wiXX0+XHJcbiAgICAgICAgICAgICAgICAgIHtzaG9ydGN1dC5rZXlzLm1hcCgoa2V5LCBpKSA9PiAoXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBrZXk9e2l9IGNsYXNzTmFtZT17c3R5bGVzW1wic2hvcnRjdXQta2V5XCJdfT5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPntrZXl9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICApKX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICApKX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L01vZGFsPlxyXG4gICAgPC9kaXY+XHJcbiAgKTtcclxufVxyXG5cclxuZnVuY3Rpb24gX0NoYXQoKSB7XHJcbiAgdHlwZSBSZW5kZXJNZXNzYWdlID0gQ2hhdE1lc3NhZ2UgJiB7IHByZXZpZXc/OiBib29sZWFuIH07XHJcblxyXG4gIGNvbnN0IGNoYXRTdG9yZSA9IHVzZUNoYXRTdG9yZSgpO1xyXG4gIGNvbnN0IHNlc3Npb24gPSBjaGF0U3RvcmUuY3VycmVudFNlc3Npb24oKTtcclxuICBjb25zdCBjb25maWcgPSB1c2VBcHBDb25maWcoKTtcclxuICBjb25zdCBmb250U2l6ZSA9IGNvbmZpZy5mb250U2l6ZTtcclxuICBjb25zdCBmb250RmFtaWx5ID0gY29uZmlnLmZvbnRGYW1pbHk7XHJcblxyXG4gIGNvbnN0IFtzaG93RXhwb3J0LCBzZXRTaG93RXhwb3J0XSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuXHJcbiAgY29uc3QgaW5wdXRSZWYgPSB1c2VSZWY8SFRNTFRleHRBcmVhRWxlbWVudD4obnVsbCk7XHJcbiAgY29uc3QgW3VzZXJJbnB1dCwgc2V0VXNlcklucHV0XSA9IHVzZVN0YXRlKFwiXCIpO1xyXG4gIGNvbnN0IFtpc0xvYWRpbmcsIHNldElzTG9hZGluZ10gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgeyBzdWJtaXRLZXksIHNob3VsZFN1Ym1pdCB9ID0gdXNlU3VibWl0SGFuZGxlcigpO1xyXG4gIGNvbnN0IHNjcm9sbFJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbCk7XHJcbiAgY29uc3QgaXNTY3JvbGxlZFRvQm90dG9tID0gc2Nyb2xsUmVmPy5jdXJyZW50XHJcbiAgICA/IE1hdGguYWJzKFxyXG4gICAgICAgIHNjcm9sbFJlZi5jdXJyZW50LnNjcm9sbEhlaWdodCAtXHJcbiAgICAgICAgICAoc2Nyb2xsUmVmLmN1cnJlbnQuc2Nyb2xsVG9wICsgc2Nyb2xsUmVmLmN1cnJlbnQuY2xpZW50SGVpZ2h0KSxcclxuICAgICAgKSA8PSAxXHJcbiAgICA6IGZhbHNlO1xyXG4gIGNvbnN0IGlzQXR0YWNoV2l0aFRvcCA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgY29uc3QgbGFzdE1lc3NhZ2UgPSBzY3JvbGxSZWYuY3VycmVudD8ubGFzdEVsZW1lbnRDaGlsZCBhcyBIVE1MRWxlbWVudDtcclxuICAgIC8vIGlmIHNjcm9sbGxSZWYgaXMgbm90IHJlYWR5IG9yIG5vIG1lc3NhZ2UsIHJldHVybiBmYWxzZVxyXG4gICAgaWYgKCFzY3JvbGxSZWY/LmN1cnJlbnQgfHwgIWxhc3RNZXNzYWdlKSByZXR1cm4gZmFsc2U7XHJcbiAgICBjb25zdCB0b3BEaXN0YW5jZSA9XHJcbiAgICAgIGxhc3RNZXNzYWdlIS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgLVxyXG4gICAgICBzY3JvbGxSZWYuY3VycmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7XHJcbiAgICAvLyBsZWF2ZSBzb21lIHNwYWNlIGZvciB1c2VyIHF1ZXN0aW9uXHJcbiAgICByZXR1cm4gdG9wRGlzdGFuY2UgPCAxMDA7XHJcbiAgfSwgW3Njcm9sbFJlZj8uY3VycmVudD8uc2Nyb2xsSGVpZ2h0XSk7XHJcblxyXG4gIGNvbnN0IGlzVHlwaW5nID0gdXNlcklucHV0ICE9PSBcIlwiO1xyXG5cclxuICAvLyBpZiB1c2VyIGlzIHR5cGluZywgc2hvdWxkIGF1dG8gc2Nyb2xsIHRvIGJvdHRvbVxyXG4gIC8vIGlmIHVzZXIgaXMgbm90IHR5cGluZywgc2hvdWxkIGF1dG8gc2Nyb2xsIHRvIGJvdHRvbSBvbmx5IGlmIGFscmVhZHkgYXQgYm90dG9tXHJcbiAgY29uc3QgeyBzZXRBdXRvU2Nyb2xsLCBzY3JvbGxEb21Ub0JvdHRvbSB9ID0gdXNlU2Nyb2xsVG9Cb3R0b20oXHJcbiAgICBzY3JvbGxSZWYsXHJcbiAgICAoaXNTY3JvbGxlZFRvQm90dG9tIHx8IGlzQXR0YWNoV2l0aFRvcCkgJiYgIWlzVHlwaW5nLFxyXG4gICAgc2Vzc2lvbi5tZXNzYWdlcyxcclxuICApO1xyXG4gIGNvbnN0IFtoaXRCb3R0b20sIHNldEhpdEJvdHRvbV0gPSB1c2VTdGF0ZSh0cnVlKTtcclxuICBjb25zdCBpc01vYmlsZVNjcmVlbiA9IHVzZU1vYmlsZVNjcmVlbigpO1xyXG4gIGNvbnN0IG5hdmlnYXRlID0gdXNlTmF2aWdhdGUoKTtcclxuICBjb25zdCBbYXR0YWNoSW1hZ2VzLCBzZXRBdHRhY2hJbWFnZXNdID0gdXNlU3RhdGU8c3RyaW5nW10+KFtdKTtcclxuICBjb25zdCBbdXBsb2FkaW5nLCBzZXRVcGxvYWRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xyXG5cclxuICAvLyBwcm9tcHQgaGludHNcclxuICBjb25zdCBwcm9tcHRTdG9yZSA9IHVzZVByb21wdFN0b3JlKCk7XHJcbiAgY29uc3QgW3Byb21wdEhpbnRzLCBzZXRQcm9tcHRIaW50c10gPSB1c2VTdGF0ZTxSZW5kZXJQcm9tcHRbXT4oW10pO1xyXG4gIGNvbnN0IG9uU2VhcmNoID0gdXNlRGVib3VuY2VkQ2FsbGJhY2soXHJcbiAgICAodGV4dDogc3RyaW5nKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1hdGNoZWRQcm9tcHRzID0gcHJvbXB0U3RvcmUuc2VhcmNoKHRleHQpO1xyXG4gICAgICBzZXRQcm9tcHRIaW50cyhtYXRjaGVkUHJvbXB0cyk7XHJcbiAgICB9LFxyXG4gICAgMTAwLFxyXG4gICAgeyBsZWFkaW5nOiB0cnVlLCB0cmFpbGluZzogdHJ1ZSB9LFxyXG4gICk7XHJcblxyXG4gIC8vIGF1dG8gZ3JvdyBpbnB1dFxyXG4gIGNvbnN0IFtpbnB1dFJvd3MsIHNldElucHV0Um93c10gPSB1c2VTdGF0ZSgyKTtcclxuICBjb25zdCBtZWFzdXJlID0gdXNlRGVib3VuY2VkQ2FsbGJhY2soXHJcbiAgICAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHJvd3MgPSBpbnB1dFJlZi5jdXJyZW50ID8gYXV0b0dyb3dUZXh0QXJlYShpbnB1dFJlZi5jdXJyZW50KSA6IDE7XHJcbiAgICAgIGNvbnN0IGlucHV0Um93cyA9IE1hdGgubWluKFxyXG4gICAgICAgIDIwLFxyXG4gICAgICAgIE1hdGgubWF4KDIgKyBOdW1iZXIoIWlzTW9iaWxlU2NyZWVuKSwgcm93cyksXHJcbiAgICAgICk7XHJcbiAgICAgIHNldElucHV0Um93cyhpbnB1dFJvd3MpO1xyXG4gICAgfSxcclxuICAgIDEwMCxcclxuICAgIHtcclxuICAgICAgbGVhZGluZzogdHJ1ZSxcclxuICAgICAgdHJhaWxpbmc6IHRydWUsXHJcbiAgICB9LFxyXG4gICk7XHJcblxyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcclxuICB1c2VFZmZlY3QobWVhc3VyZSwgW3VzZXJJbnB1dF0pO1xyXG5cclxuICAvLyBjaGF0IGNvbW1hbmRzIHNob3J0Y3V0c1xyXG4gIGNvbnN0IGNoYXRDb21tYW5kcyA9IHVzZUNoYXRDb21tYW5kKHtcclxuICAgIG5ldzogKCkgPT4gY2hhdFN0b3JlLm5ld1Nlc3Npb24oKSxcclxuICAgIG5ld206ICgpID0+IG5hdmlnYXRlKFBhdGguTmV3Q2hhdCksXHJcbiAgICBwcmV2OiAoKSA9PiBjaGF0U3RvcmUubmV4dFNlc3Npb24oLTEpLFxyXG4gICAgbmV4dDogKCkgPT4gY2hhdFN0b3JlLm5leHRTZXNzaW9uKDEpLFxyXG4gICAgY2xlYXI6ICgpID0+XHJcbiAgICAgIGNoYXRTdG9yZS51cGRhdGVUYXJnZXRTZXNzaW9uKFxyXG4gICAgICAgIHNlc3Npb24sXHJcbiAgICAgICAgKHNlc3Npb24pID0+IChzZXNzaW9uLmNsZWFyQ29udGV4dEluZGV4ID0gc2Vzc2lvbi5tZXNzYWdlcy5sZW5ndGgpLFxyXG4gICAgICApLFxyXG4gICAgZm9yazogKCkgPT4gY2hhdFN0b3JlLmZvcmtTZXNzaW9uKCksXHJcbiAgICBkZWw6ICgpID0+IGNoYXRTdG9yZS5kZWxldGVTZXNzaW9uKGNoYXRTdG9yZS5jdXJyZW50U2Vzc2lvbkluZGV4KSxcclxuICB9KTtcclxuXHJcbiAgLy8gb25seSBzZWFyY2ggcHJvbXB0cyB3aGVuIHVzZXIgaW5wdXQgaXMgc2hvcnRcclxuICBjb25zdCBTRUFSQ0hfVEVYVF9MSU1JVCA9IDMwO1xyXG4gIGNvbnN0IG9uSW5wdXQgPSAodGV4dDogc3RyaW5nKSA9PiB7XHJcbiAgICBzZXRVc2VySW5wdXQodGV4dCk7XHJcbiAgICBjb25zdCBuID0gdGV4dC50cmltKCkubGVuZ3RoO1xyXG5cclxuICAgIC8vIGNsZWFyIHNlYXJjaCByZXN1bHRzXHJcbiAgICBpZiAobiA9PT0gMCkge1xyXG4gICAgICBzZXRQcm9tcHRIaW50cyhbXSk7XHJcbiAgICB9IGVsc2UgaWYgKHRleHQubWF0Y2goQ2hhdENvbW1hbmRQcmVmaXgpKSB7XHJcbiAgICAgIHNldFByb21wdEhpbnRzKGNoYXRDb21tYW5kcy5zZWFyY2godGV4dCkpO1xyXG4gICAgfSBlbHNlIGlmICghY29uZmlnLmRpc2FibGVQcm9tcHRIaW50ICYmIG4gPCBTRUFSQ0hfVEVYVF9MSU1JVCkge1xyXG4gICAgICAvLyBjaGVjayBpZiBuZWVkIHRvIHRyaWdnZXIgYXV0byBjb21wbGV0aW9uXHJcbiAgICAgIGlmICh0ZXh0LnN0YXJ0c1dpdGgoXCIvXCIpKSB7XHJcbiAgICAgICAgbGV0IHNlYXJjaFRleHQgPSB0ZXh0LnNsaWNlKDEpO1xyXG4gICAgICAgIG9uU2VhcmNoKHNlYXJjaFRleHQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgZG9TdWJtaXQgPSAodXNlcklucHV0OiBzdHJpbmcpID0+IHtcclxuICAgIGlmICh1c2VySW5wdXQudHJpbSgpID09PSBcIlwiICYmIGlzRW1wdHkoYXR0YWNoSW1hZ2VzKSkgcmV0dXJuO1xyXG4gICAgY29uc3QgbWF0Y2hDb21tYW5kID0gY2hhdENvbW1hbmRzLm1hdGNoKHVzZXJJbnB1dCk7XHJcbiAgICBpZiAobWF0Y2hDb21tYW5kLm1hdGNoZWQpIHtcclxuICAgICAgc2V0VXNlcklucHV0KFwiXCIpO1xyXG4gICAgICBzZXRQcm9tcHRIaW50cyhbXSk7XHJcbiAgICAgIG1hdGNoQ29tbWFuZC5pbnZva2UoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgc2V0SXNMb2FkaW5nKHRydWUpO1xyXG4gICAgY2hhdFN0b3JlXHJcbiAgICAgIC5vblVzZXJJbnB1dCh1c2VySW5wdXQsIGF0dGFjaEltYWdlcylcclxuICAgICAgLnRoZW4oKCkgPT4gc2V0SXNMb2FkaW5nKGZhbHNlKSk7XHJcbiAgICBzZXRBdHRhY2hJbWFnZXMoW10pO1xyXG4gICAgY2hhdFN0b3JlLnNldExhc3RJbnB1dCh1c2VySW5wdXQpO1xyXG4gICAgc2V0VXNlcklucHV0KFwiXCIpO1xyXG4gICAgc2V0UHJvbXB0SGludHMoW10pO1xyXG4gICAgaWYgKCFpc01vYmlsZVNjcmVlbikgaW5wdXRSZWYuY3VycmVudD8uZm9jdXMoKTtcclxuICAgIHNldEF1dG9TY3JvbGwodHJ1ZSk7XHJcbiAgfTtcclxuXHJcbiAgY29uc3Qgb25Qcm9tcHRTZWxlY3QgPSAocHJvbXB0OiBSZW5kZXJQcm9tcHQpID0+IHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBzZXRQcm9tcHRIaW50cyhbXSk7XHJcblxyXG4gICAgICBjb25zdCBtYXRjaGVkQ2hhdENvbW1hbmQgPSBjaGF0Q29tbWFuZHMubWF0Y2gocHJvbXB0LmNvbnRlbnQpO1xyXG4gICAgICBpZiAobWF0Y2hlZENoYXRDb21tYW5kLm1hdGNoZWQpIHtcclxuICAgICAgICAvLyBpZiB1c2VyIGlzIHNlbGVjdGluZyBhIGNoYXQgY29tbWFuZCwganVzdCB0cmlnZ2VyIGl0XHJcbiAgICAgICAgbWF0Y2hlZENoYXRDb21tYW5kLmludm9rZSgpO1xyXG4gICAgICAgIHNldFVzZXJJbnB1dChcIlwiKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBvciBmaWxsIHRoZSBwcm9tcHRcclxuICAgICAgICBzZXRVc2VySW5wdXQocHJvbXB0LmNvbnRlbnQpO1xyXG4gICAgICB9XHJcbiAgICAgIGlucHV0UmVmLmN1cnJlbnQ/LmZvY3VzKCk7XHJcbiAgICB9LCAzMCk7XHJcbiAgfTtcclxuXHJcbiAgLy8gc3RvcCByZXNwb25zZVxyXG4gIGNvbnN0IG9uVXNlclN0b3AgPSAobWVzc2FnZUlkOiBzdHJpbmcpID0+IHtcclxuICAgIENoYXRDb250cm9sbGVyUG9vbC5zdG9wKHNlc3Npb24uaWQsIG1lc3NhZ2VJZCk7XHJcbiAgfTtcclxuXHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIGNoYXRTdG9yZS51cGRhdGVUYXJnZXRTZXNzaW9uKHNlc3Npb24sIChzZXNzaW9uKSA9PiB7XHJcbiAgICAgIGNvbnN0IHN0b3BUaW1pbmcgPSBEYXRlLm5vdygpIC0gUkVRVUVTVF9USU1FT1VUX01TO1xyXG4gICAgICBzZXNzaW9uLm1lc3NhZ2VzLmZvckVhY2goKG0pID0+IHtcclxuICAgICAgICAvLyBjaGVjayBpZiBzaG91bGQgc3RvcCBhbGwgc3RhbGUgbWVzc2FnZXNcclxuICAgICAgICBpZiAobS5pc0Vycm9yIHx8IG5ldyBEYXRlKG0uZGF0ZSkuZ2V0VGltZSgpIDwgc3RvcFRpbWluZykge1xyXG4gICAgICAgICAgaWYgKG0uc3RyZWFtaW5nKSB7XHJcbiAgICAgICAgICAgIG0uc3RyZWFtaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKG0uY29udGVudC5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgbS5pc0Vycm9yID0gdHJ1ZTtcclxuICAgICAgICAgICAgbS5jb250ZW50ID0gcHJldHR5T2JqZWN0KHtcclxuICAgICAgICAgICAgICBlcnJvcjogdHJ1ZSxcclxuICAgICAgICAgICAgICBtZXNzYWdlOiBcImVtcHR5IHJlc3BvbnNlXCIsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICAvLyBhdXRvIHN5bmMgbWFzayBjb25maWcgZnJvbSBnbG9iYWwgY29uZmlnXHJcbiAgICAgIGlmIChzZXNzaW9uLm1hc2suc3luY0dsb2JhbENvbmZpZykge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiW01hc2tdIHN5bmNpbmcgZnJvbSBnbG9iYWwsIG5hbWUgPSBcIiwgc2Vzc2lvbi5tYXNrLm5hbWUpO1xyXG4gICAgICAgIHNlc3Npb24ubWFzay5tb2RlbENvbmZpZyA9IHsgLi4uY29uZmlnLm1vZGVsQ29uZmlnIH07XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xyXG4gIH0sIFtzZXNzaW9uXSk7XHJcblxyXG4gIC8vIGNoZWNrIGlmIHNob3VsZCBzZW5kIG1lc3NhZ2VcclxuICBjb25zdCBvbklucHV0S2V5RG93biA9IChlOiBSZWFjdC5LZXlib2FyZEV2ZW50PEhUTUxUZXh0QXJlYUVsZW1lbnQ+KSA9PiB7XHJcbiAgICAvLyBpZiBBcnJvd1VwIGFuZCBubyB1c2VySW5wdXQsIGZpbGwgd2l0aCBsYXN0IGlucHV0XHJcbiAgICBpZiAoXHJcbiAgICAgIGUua2V5ID09PSBcIkFycm93VXBcIiAmJlxyXG4gICAgICB1c2VySW5wdXQubGVuZ3RoIDw9IDAgJiZcclxuICAgICAgIShlLm1ldGFLZXkgfHwgZS5hbHRLZXkgfHwgZS5jdHJsS2V5KVxyXG4gICAgKSB7XHJcbiAgICAgIHNldFVzZXJJbnB1dChjaGF0U3RvcmUubGFzdElucHV0ID8/IFwiXCIpO1xyXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChzaG91bGRTdWJtaXQoZSkgJiYgcHJvbXB0SGludHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIGRvU3VibWl0KHVzZXJJbnB1dCk7XHJcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgIH1cclxuICB9O1xyXG4gIGNvbnN0IG9uUmlnaHRDbGljayA9IChlOiBhbnksIG1lc3NhZ2U6IENoYXRNZXNzYWdlKSA9PiB7XHJcbiAgICAvLyBjb3B5IHRvIGNsaXBib2FyZFxyXG4gICAgaWYgKHNlbGVjdE9yQ29weShlLmN1cnJlbnRUYXJnZXQsIGdldE1lc3NhZ2VUZXh0Q29udGVudChtZXNzYWdlKSkpIHtcclxuICAgICAgaWYgKHVzZXJJbnB1dC5sZW5ndGggPT09IDApIHtcclxuICAgICAgICBzZXRVc2VySW5wdXQoZ2V0TWVzc2FnZVRleHRDb250ZW50KG1lc3NhZ2UpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGNvbnN0IGRlbGV0ZU1lc3NhZ2UgPSAobXNnSWQ/OiBzdHJpbmcpID0+IHtcclxuICAgIGNoYXRTdG9yZS51cGRhdGVUYXJnZXRTZXNzaW9uKFxyXG4gICAgICBzZXNzaW9uLFxyXG4gICAgICAoc2Vzc2lvbikgPT5cclxuICAgICAgICAoc2Vzc2lvbi5tZXNzYWdlcyA9IHNlc3Npb24ubWVzc2FnZXMuZmlsdGVyKChtKSA9PiBtLmlkICE9PSBtc2dJZCkpLFxyXG4gICAgKTtcclxuICB9O1xyXG5cclxuICBjb25zdCBvbkRlbGV0ZSA9IChtc2dJZDogc3RyaW5nKSA9PiB7XHJcbiAgICBkZWxldGVNZXNzYWdlKG1zZ0lkKTtcclxuICB9O1xyXG5cclxuICBjb25zdCBvblJlc2VuZCA9IChtZXNzYWdlOiBDaGF0TWVzc2FnZSkgPT4ge1xyXG4gICAgLy8gd2hlbiBpdCBpcyByZXNlbmRpbmcgYSBtZXNzYWdlXHJcbiAgICAvLyAxLiBmb3IgYSB1c2VyJ3MgbWVzc2FnZSwgZmluZCB0aGUgbmV4dCBib3QgcmVzcG9uc2VcclxuICAgIC8vIDIuIGZvciBhIGJvdCdzIG1lc3NhZ2UsIGZpbmQgdGhlIGxhc3QgdXNlcidzIGlucHV0XHJcbiAgICAvLyAzLiBkZWxldGUgb3JpZ2luYWwgdXNlciBpbnB1dCBhbmQgYm90J3MgbWVzc2FnZVxyXG4gICAgLy8gNC4gcmVzZW5kIHRoZSB1c2VyJ3MgaW5wdXRcclxuXHJcbiAgICBjb25zdCByZXNlbmRpbmdJbmRleCA9IHNlc3Npb24ubWVzc2FnZXMuZmluZEluZGV4KFxyXG4gICAgICAobSkgPT4gbS5pZCA9PT0gbWVzc2FnZS5pZCxcclxuICAgICk7XHJcblxyXG4gICAgaWYgKHJlc2VuZGluZ0luZGV4IDwgMCB8fCByZXNlbmRpbmdJbmRleCA+PSBzZXNzaW9uLm1lc3NhZ2VzLmxlbmd0aCkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKFwiW0NoYXRdIGZhaWxlZCB0byBmaW5kIHJlc2VuZGluZyBtZXNzYWdlXCIsIG1lc3NhZ2UpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHVzZXJNZXNzYWdlOiBDaGF0TWVzc2FnZSB8IHVuZGVmaW5lZDtcclxuICAgIGxldCBib3RNZXNzYWdlOiBDaGF0TWVzc2FnZSB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICBpZiAobWVzc2FnZS5yb2xlID09PSBcImFzc2lzdGFudFwiKSB7XHJcbiAgICAgIC8vIGlmIGl0IGlzIHJlc2VuZGluZyBhIGJvdCdzIG1lc3NhZ2UsIGZpbmQgdGhlIHVzZXIgaW5wdXQgZm9yIGl0XHJcbiAgICAgIGJvdE1lc3NhZ2UgPSBtZXNzYWdlO1xyXG4gICAgICBmb3IgKGxldCBpID0gcmVzZW5kaW5nSW5kZXg7IGkgPj0gMDsgaSAtPSAxKSB7XHJcbiAgICAgICAgaWYgKHNlc3Npb24ubWVzc2FnZXNbaV0ucm9sZSA9PT0gXCJ1c2VyXCIpIHtcclxuICAgICAgICAgIHVzZXJNZXNzYWdlID0gc2Vzc2lvbi5tZXNzYWdlc1tpXTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChtZXNzYWdlLnJvbGUgPT09IFwidXNlclwiKSB7XHJcbiAgICAgIC8vIGlmIGl0IGlzIHJlc2VuZGluZyBhIHVzZXIncyBpbnB1dCwgZmluZCB0aGUgYm90J3MgcmVzcG9uc2VcclxuICAgICAgdXNlck1lc3NhZ2UgPSBtZXNzYWdlO1xyXG4gICAgICBmb3IgKGxldCBpID0gcmVzZW5kaW5nSW5kZXg7IGkgPCBzZXNzaW9uLm1lc3NhZ2VzLmxlbmd0aDsgaSArPSAxKSB7XHJcbiAgICAgICAgaWYgKHNlc3Npb24ubWVzc2FnZXNbaV0ucm9sZSA9PT0gXCJhc3Npc3RhbnRcIikge1xyXG4gICAgICAgICAgYm90TWVzc2FnZSA9IHNlc3Npb24ubWVzc2FnZXNbaV07XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodXNlck1lc3NhZ2UgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKFwiW0NoYXRdIGZhaWxlZCB0byByZXNlbmRcIiwgbWVzc2FnZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBkZWxldGUgdGhlIG9yaWdpbmFsIG1lc3NhZ2VzXHJcbiAgICBkZWxldGVNZXNzYWdlKHVzZXJNZXNzYWdlLmlkKTtcclxuICAgIGRlbGV0ZU1lc3NhZ2UoYm90TWVzc2FnZT8uaWQpO1xyXG5cclxuICAgIC8vIHJlc2VuZCB0aGUgbWVzc2FnZVxyXG4gICAgc2V0SXNMb2FkaW5nKHRydWUpO1xyXG4gICAgY29uc3QgdGV4dENvbnRlbnQgPSBnZXRNZXNzYWdlVGV4dENvbnRlbnQodXNlck1lc3NhZ2UpO1xyXG4gICAgY29uc3QgaW1hZ2VzID0gZ2V0TWVzc2FnZUltYWdlcyh1c2VyTWVzc2FnZSk7XHJcbiAgICBjaGF0U3RvcmUub25Vc2VySW5wdXQodGV4dENvbnRlbnQsIGltYWdlcykudGhlbigoKSA9PiBzZXRJc0xvYWRpbmcoZmFsc2UpKTtcclxuICAgIGlucHV0UmVmLmN1cnJlbnQ/LmZvY3VzKCk7XHJcbiAgfTtcclxuXHJcbiAgY29uc3Qgb25QaW5NZXNzYWdlID0gKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSA9PiB7XHJcbiAgICBjaGF0U3RvcmUudXBkYXRlVGFyZ2V0U2Vzc2lvbihzZXNzaW9uLCAoc2Vzc2lvbikgPT5cclxuICAgICAgc2Vzc2lvbi5tYXNrLmNvbnRleHQucHVzaChtZXNzYWdlKSxcclxuICAgICk7XHJcblxyXG4gICAgc2hvd1RvYXN0KExvY2FsZS5DaGF0LkFjdGlvbnMuUGluVG9hc3RDb250ZW50LCB7XHJcbiAgICAgIHRleHQ6IExvY2FsZS5DaGF0LkFjdGlvbnMuUGluVG9hc3RBY3Rpb24sXHJcbiAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICBzZXRTaG93UHJvbXB0TW9kYWwodHJ1ZSk7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9O1xyXG5cclxuICBjb25zdCBhY2Nlc3NTdG9yZSA9IHVzZUFjY2Vzc1N0b3JlKCk7XHJcbiAgY29uc3QgW3NwZWVjaFN0YXR1cywgc2V0U3BlZWNoU3RhdHVzXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBbc3BlZWNoTG9hZGluZywgc2V0U3BlZWNoTG9hZGluZ10gPSB1c2VTdGF0ZShmYWxzZSk7XHJcblxyXG4gIGFzeW5jIGZ1bmN0aW9uIG9wZW5haVNwZWVjaCh0ZXh0OiBzdHJpbmcpIHtcclxuICAgIGlmIChzcGVlY2hTdGF0dXMpIHtcclxuICAgICAgdHRzUGxheWVyLnN0b3AoKTtcclxuICAgICAgc2V0U3BlZWNoU3RhdHVzKGZhbHNlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHZhciBhcGk6IENsaWVudEFwaTtcclxuICAgICAgYXBpID0gbmV3IENsaWVudEFwaShNb2RlbFByb3ZpZGVyLkdQVCk7XHJcbiAgICAgIGNvbnN0IGNvbmZpZyA9IHVzZUFwcENvbmZpZy5nZXRTdGF0ZSgpO1xyXG4gICAgICBzZXRTcGVlY2hMb2FkaW5nKHRydWUpO1xyXG4gICAgICB0dHNQbGF5ZXIuaW5pdCgpO1xyXG4gICAgICBsZXQgYXVkaW9CdWZmZXI6IEFycmF5QnVmZmVyO1xyXG4gICAgICBjb25zdCB7IG1hcmtkb3duVG9UeHQgfSA9IHJlcXVpcmUoXCJtYXJrZG93bi10by10eHRcIik7XHJcbiAgICAgIGNvbnN0IHRleHRDb250ZW50ID0gbWFya2Rvd25Ub1R4dCh0ZXh0KTtcclxuICAgICAgaWYgKGNvbmZpZy50dHNDb25maWcuZW5naW5lICE9PSBERUZBVUxUX1RUU19FTkdJTkUpIHtcclxuICAgICAgICBjb25zdCBlZGdlVm9pY2VOYW1lID0gYWNjZXNzU3RvcmUuZWRnZVZvaWNlTmFtZSgpO1xyXG4gICAgICAgIGNvbnN0IHR0cyA9IG5ldyBNc0VkZ2VUVFMoKTtcclxuICAgICAgICBhd2FpdCB0dHMuc2V0TWV0YWRhdGEoXHJcbiAgICAgICAgICBlZGdlVm9pY2VOYW1lLFxyXG4gICAgICAgICAgT1VUUFVUX0ZPUk1BVC5BVURJT18yNEtIWl85NktCSVRSQVRFX01PTk9fTVAzLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgYXVkaW9CdWZmZXIgPSBhd2FpdCB0dHMudG9BcnJheUJ1ZmZlcih0ZXh0Q29udGVudCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYXVkaW9CdWZmZXIgPSBhd2FpdCBhcGkubGxtLnNwZWVjaCh7XHJcbiAgICAgICAgICBtb2RlbDogY29uZmlnLnR0c0NvbmZpZy5tb2RlbCxcclxuICAgICAgICAgIGlucHV0OiB0ZXh0Q29udGVudCxcclxuICAgICAgICAgIHZvaWNlOiBjb25maWcudHRzQ29uZmlnLnZvaWNlLFxyXG4gICAgICAgICAgc3BlZWQ6IGNvbmZpZy50dHNDb25maWcuc3BlZWQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgc2V0U3BlZWNoU3RhdHVzKHRydWUpO1xyXG4gICAgICB0dHNQbGF5ZXJcclxuICAgICAgICAucGxheShhdWRpb0J1ZmZlciwgKCkgPT4ge1xyXG4gICAgICAgICAgc2V0U3BlZWNoU3RhdHVzKGZhbHNlKTtcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIltPcGVuQUkgU3BlZWNoXVwiLCBlKTtcclxuICAgICAgICAgIHNob3dUb2FzdChwcmV0dHlPYmplY3QoZSkpO1xyXG4gICAgICAgICAgc2V0U3BlZWNoU3RhdHVzKGZhbHNlKTtcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5maW5hbGx5KCgpID0+IHNldFNwZWVjaExvYWRpbmcoZmFsc2UpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0IGNvbnRleHQ6IFJlbmRlck1lc3NhZ2VbXSA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgcmV0dXJuIHNlc3Npb24ubWFzay5oaWRlQ29udGV4dCA/IFtdIDogc2Vzc2lvbi5tYXNrLmNvbnRleHQuc2xpY2UoKTtcclxuICB9LCBbc2Vzc2lvbi5tYXNrLmNvbnRleHQsIHNlc3Npb24ubWFzay5oaWRlQ29udGV4dF0pO1xyXG5cclxuICBpZiAoXHJcbiAgICBjb250ZXh0Lmxlbmd0aCA9PT0gMCAmJlxyXG4gICAgc2Vzc2lvbi5tZXNzYWdlcy5hdCgwKT8uY29udGVudCAhPT0gQk9UX0hFTExPLmNvbnRlbnRcclxuICApIHtcclxuICAgIGNvbnN0IGNvcGllZEhlbGxvID0gT2JqZWN0LmFzc2lnbih7fSwgQk9UX0hFTExPKTtcclxuICAgIGlmICghYWNjZXNzU3RvcmUuaXNBdXRob3JpemVkKCkpIHtcclxuICAgICAgY29waWVkSGVsbG8uY29udGVudCA9IExvY2FsZS5FcnJvci5VbmF1dGhvcml6ZWQ7XHJcbiAgICB9XHJcbiAgICBjb250ZXh0LnB1c2goY29waWVkSGVsbG8pO1xyXG4gIH1cclxuXHJcbiAgLy8gcHJldmlldyBtZXNzYWdlc1xyXG4gIGNvbnN0IHJlbmRlck1lc3NhZ2VzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICByZXR1cm4gY29udGV4dFxyXG4gICAgICAuY29uY2F0KHNlc3Npb24ubWVzc2FnZXMgYXMgUmVuZGVyTWVzc2FnZVtdKVxyXG4gICAgICAuY29uY2F0KFxyXG4gICAgICAgIGlzTG9hZGluZ1xyXG4gICAgICAgICAgPyBbXHJcbiAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLi4uY3JlYXRlTWVzc2FnZSh7XHJcbiAgICAgICAgICAgICAgICAgIHJvbGU6IFwiYXNzaXN0YW50XCIsXHJcbiAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IFwi4oCm4oCmXCIsXHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgIHByZXZpZXc6IHRydWUsXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgICAgOiBbXSxcclxuICAgICAgKVxyXG4gICAgICAuY29uY2F0KFxyXG4gICAgICAgIHVzZXJJbnB1dC5sZW5ndGggPiAwICYmIGNvbmZpZy5zZW5kUHJldmlld0J1YmJsZVxyXG4gICAgICAgICAgPyBbXHJcbiAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLi4uY3JlYXRlTWVzc2FnZSh7XHJcbiAgICAgICAgICAgICAgICAgIHJvbGU6IFwidXNlclwiLFxyXG4gICAgICAgICAgICAgICAgICBjb250ZW50OiB1c2VySW5wdXQsXHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgIHByZXZpZXc6IHRydWUsXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgICAgOiBbXSxcclxuICAgICAgKTtcclxuICB9LCBbXHJcbiAgICBjb25maWcuc2VuZFByZXZpZXdCdWJibGUsXHJcbiAgICBjb250ZXh0LFxyXG4gICAgaXNMb2FkaW5nLFxyXG4gICAgc2Vzc2lvbi5tZXNzYWdlcyxcclxuICAgIHVzZXJJbnB1dCxcclxuICBdKTtcclxuXHJcbiAgY29uc3QgW21zZ1JlbmRlckluZGV4LCBfc2V0TXNnUmVuZGVySW5kZXhdID0gdXNlU3RhdGUoXHJcbiAgICBNYXRoLm1heCgwLCByZW5kZXJNZXNzYWdlcy5sZW5ndGggLSBDSEFUX1BBR0VfU0laRSksXHJcbiAgKTtcclxuXHJcbiAgZnVuY3Rpb24gc2V0TXNnUmVuZGVySW5kZXgobmV3SW5kZXg6IG51bWJlcikge1xyXG4gICAgbmV3SW5kZXggPSBNYXRoLm1pbihyZW5kZXJNZXNzYWdlcy5sZW5ndGggLSBDSEFUX1BBR0VfU0laRSwgbmV3SW5kZXgpO1xyXG4gICAgbmV3SW5kZXggPSBNYXRoLm1heCgwLCBuZXdJbmRleCk7XHJcbiAgICBfc2V0TXNnUmVuZGVySW5kZXgobmV3SW5kZXgpO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgbWVzc2FnZXMgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgIGNvbnN0IGVuZFJlbmRlckluZGV4ID0gTWF0aC5taW4oXHJcbiAgICAgIG1zZ1JlbmRlckluZGV4ICsgMyAqIENIQVRfUEFHRV9TSVpFLFxyXG4gICAgICByZW5kZXJNZXNzYWdlcy5sZW5ndGgsXHJcbiAgICApO1xyXG4gICAgcmV0dXJuIHJlbmRlck1lc3NhZ2VzLnNsaWNlKG1zZ1JlbmRlckluZGV4LCBlbmRSZW5kZXJJbmRleCk7XHJcbiAgfSwgW21zZ1JlbmRlckluZGV4LCByZW5kZXJNZXNzYWdlc10pO1xyXG5cclxuICBjb25zdCBvbkNoYXRCb2R5U2Nyb2xsID0gKGU6IEhUTUxFbGVtZW50KSA9PiB7XHJcbiAgICBjb25zdCBib3R0b21IZWlnaHQgPSBlLnNjcm9sbFRvcCArIGUuY2xpZW50SGVpZ2h0O1xyXG4gICAgY29uc3QgZWRnZVRocmVzaG9sZCA9IGUuY2xpZW50SGVpZ2h0O1xyXG5cclxuICAgIGNvbnN0IGlzVG91Y2hUb3BFZGdlID0gZS5zY3JvbGxUb3AgPD0gZWRnZVRocmVzaG9sZDtcclxuICAgIGNvbnN0IGlzVG91Y2hCb3R0b21FZGdlID0gYm90dG9tSGVpZ2h0ID49IGUuc2Nyb2xsSGVpZ2h0IC0gZWRnZVRocmVzaG9sZDtcclxuICAgIGNvbnN0IGlzSGl0Qm90dG9tID1cclxuICAgICAgYm90dG9tSGVpZ2h0ID49IGUuc2Nyb2xsSGVpZ2h0IC0gKGlzTW9iaWxlU2NyZWVuID8gNCA6IDEwKTtcclxuXHJcbiAgICBjb25zdCBwcmV2UGFnZU1zZ0luZGV4ID0gbXNnUmVuZGVySW5kZXggLSBDSEFUX1BBR0VfU0laRTtcclxuICAgIGNvbnN0IG5leHRQYWdlTXNnSW5kZXggPSBtc2dSZW5kZXJJbmRleCArIENIQVRfUEFHRV9TSVpFO1xyXG5cclxuICAgIGlmIChpc1RvdWNoVG9wRWRnZSAmJiAhaXNUb3VjaEJvdHRvbUVkZ2UpIHtcclxuICAgICAgc2V0TXNnUmVuZGVySW5kZXgocHJldlBhZ2VNc2dJbmRleCk7XHJcbiAgICB9IGVsc2UgaWYgKGlzVG91Y2hCb3R0b21FZGdlKSB7XHJcbiAgICAgIHNldE1zZ1JlbmRlckluZGV4KG5leHRQYWdlTXNnSW5kZXgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEhpdEJvdHRvbShpc0hpdEJvdHRvbSk7XHJcbiAgICBzZXRBdXRvU2Nyb2xsKGlzSGl0Qm90dG9tKTtcclxuICB9O1xyXG5cclxuICBmdW5jdGlvbiBzY3JvbGxUb0JvdHRvbSgpIHtcclxuICAgIHNldE1zZ1JlbmRlckluZGV4KHJlbmRlck1lc3NhZ2VzLmxlbmd0aCAtIENIQVRfUEFHRV9TSVpFKTtcclxuICAgIHNjcm9sbERvbVRvQm90dG9tKCk7XHJcbiAgfVxyXG5cclxuICAvLyBjbGVhciBjb250ZXh0IGluZGV4ID0gY29udGV4dCBsZW5ndGggKyBpbmRleCBpbiBtZXNzYWdlc1xyXG4gIGNvbnN0IGNsZWFyQ29udGV4dEluZGV4ID1cclxuICAgIChzZXNzaW9uLmNsZWFyQ29udGV4dEluZGV4ID8/IC0xKSA+PSAwXHJcbiAgICAgID8gc2Vzc2lvbi5jbGVhckNvbnRleHRJbmRleCEgKyBjb250ZXh0Lmxlbmd0aCAtIG1zZ1JlbmRlckluZGV4XHJcbiAgICAgIDogLTE7XHJcblxyXG4gIGNvbnN0IFtzaG93UHJvbXB0TW9kYWwsIHNldFNob3dQcm9tcHRNb2RhbF0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcblxyXG4gIGNvbnN0IGNsaWVudENvbmZpZyA9IHVzZU1lbW8oKCkgPT4gZ2V0Q2xpZW50Q29uZmlnKCksIFtdKTtcclxuXHJcbiAgY29uc3QgYXV0b0ZvY3VzID0gIWlzTW9iaWxlU2NyZWVuOyAvLyB3b250IGF1dG8gZm9jdXMgb24gbW9iaWxlIHNjcmVlblxyXG4gIGNvbnN0IHNob3dNYXhJY29uID0gIWlzTW9iaWxlU2NyZWVuICYmICFjbGllbnRDb25maWc/LmlzQXBwO1xyXG5cclxuICB1c2VDb21tYW5kKHtcclxuICAgIGZpbGw6IHNldFVzZXJJbnB1dCxcclxuICAgIHN1Ym1pdDogKHRleHQpID0+IHtcclxuICAgICAgZG9TdWJtaXQodGV4dCk7XHJcbiAgICB9LFxyXG4gICAgY29kZTogKHRleHQpID0+IHtcclxuICAgICAgaWYgKGFjY2Vzc1N0b3JlLmRpc2FibGVGYXN0TGluaykgcmV0dXJuO1xyXG4gICAgICBjb25zb2xlLmxvZyhcIltDb21tYW5kXSBnb3QgY29kZSBmcm9tIHVybDogXCIsIHRleHQpO1xyXG4gICAgICBzaG93Q29uZmlybShMb2NhbGUuVVJMQ29tbWFuZC5Db2RlICsgYGNvZGUgPSAke3RleHR9YCkudGhlbigocmVzKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcykge1xyXG4gICAgICAgICAgYWNjZXNzU3RvcmUudXBkYXRlKChhY2Nlc3MpID0+IChhY2Nlc3MuYWNjZXNzQ29kZSA9IHRleHQpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSxcclxuICAgIHNldHRpbmdzOiAodGV4dCkgPT4ge1xyXG4gICAgICBpZiAoYWNjZXNzU3RvcmUuZGlzYWJsZUZhc3RMaW5rKSByZXR1cm47XHJcblxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBKU09OLnBhcnNlKHRleHQpIGFzIHtcclxuICAgICAgICAgIGtleT86IHN0cmluZztcclxuICAgICAgICAgIHVybD86IHN0cmluZztcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zb2xlLmxvZyhcIltDb21tYW5kXSBnb3Qgc2V0dGluZ3MgZnJvbSB1cmw6IFwiLCBwYXlsb2FkKTtcclxuXHJcbiAgICAgICAgaWYgKHBheWxvYWQua2V5IHx8IHBheWxvYWQudXJsKSB7XHJcbiAgICAgICAgICBzaG93Q29uZmlybShcclxuICAgICAgICAgICAgTG9jYWxlLlVSTENvbW1hbmQuU2V0dGluZ3MgK1xyXG4gICAgICAgICAgICAgIGBcXG4ke0pTT04uc3RyaW5naWZ5KHBheWxvYWQsIG51bGwsIDQpfWAsXHJcbiAgICAgICAgICApLnRoZW4oKHJlcykgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXJlcykgcmV0dXJuO1xyXG4gICAgICAgICAgICBpZiAocGF5bG9hZC5rZXkpIHtcclxuICAgICAgICAgICAgICBhY2Nlc3NTdG9yZS51cGRhdGUoXHJcbiAgICAgICAgICAgICAgICAoYWNjZXNzKSA9PiAoYWNjZXNzLm9wZW5haUFwaUtleSA9IHBheWxvYWQua2V5ISksXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocGF5bG9hZC51cmwpIHtcclxuICAgICAgICAgICAgICBhY2Nlc3NTdG9yZS51cGRhdGUoKGFjY2VzcykgPT4gKGFjY2Vzcy5vcGVuYWlVcmwgPSBwYXlsb2FkLnVybCEpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhY2Nlc3NTdG9yZS51cGRhdGUoKGFjY2VzcykgPT4gKGFjY2Vzcy51c2VDdXN0b21Db25maWcgPSB0cnVlKSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbQ29tbWFuZF0gZmFpbGVkIHRvIGdldCBzZXR0aW5ncyBmcm9tIHVybDogXCIsIHRleHQpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gIH0pO1xyXG5cclxuICAvLyBlZGl0IC8gaW5zZXJ0IG1lc3NhZ2UgbW9kYWxcclxuICBjb25zdCBbaXNFZGl0aW5nTWVzc2FnZSwgc2V0SXNFZGl0aW5nTWVzc2FnZV0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcblxyXG4gIC8vIHJlbWVtYmVyIHVuZmluaXNoZWQgaW5wdXRcclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgLy8gdHJ5IHRvIGxvYWQgZnJvbSBsb2NhbCBzdG9yYWdlXHJcbiAgICBjb25zdCBrZXkgPSBVTkZJTklTSEVEX0lOUFVUKHNlc3Npb24uaWQpO1xyXG4gICAgY29uc3QgbWF5QmVVbmZpbmlzaGVkSW5wdXQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xyXG4gICAgaWYgKG1heUJlVW5maW5pc2hlZElucHV0ICYmIHVzZXJJbnB1dC5sZW5ndGggPT09IDApIHtcclxuICAgICAgc2V0VXNlcklucHV0KG1heUJlVW5maW5pc2hlZElucHV0KTtcclxuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBkb20gPSBpbnB1dFJlZi5jdXJyZW50O1xyXG4gICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCBkb20/LnZhbHVlID8/IFwiXCIpO1xyXG4gICAgfTtcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcclxuICB9LCBbXSk7XHJcblxyXG4gIGNvbnN0IGhhbmRsZVBhc3RlID0gdXNlQ2FsbGJhY2soXHJcbiAgICBhc3luYyAoZXZlbnQ6IFJlYWN0LkNsaXBib2FyZEV2ZW50PEhUTUxUZXh0QXJlYUVsZW1lbnQ+KSA9PiB7XHJcbiAgICAgIGNvbnN0IGN1cnJlbnRNb2RlbCA9IGNoYXRTdG9yZS5jdXJyZW50U2Vzc2lvbigpLm1hc2subW9kZWxDb25maWcubW9kZWw7XHJcbiAgICAgIGlmICghaXNWaXNpb25Nb2RlbChjdXJyZW50TW9kZWwpKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGl0ZW1zID0gKGV2ZW50LmNsaXBib2FyZERhdGEgfHwgd2luZG93LmNsaXBib2FyZERhdGEpLml0ZW1zO1xyXG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcclxuICAgICAgICBpZiAoaXRlbS5raW5kID09PSBcImZpbGVcIiAmJiBpdGVtLnR5cGUuc3RhcnRzV2l0aChcImltYWdlL1wiKSkge1xyXG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgIGNvbnN0IGZpbGUgPSBpdGVtLmdldEFzRmlsZSgpO1xyXG4gICAgICAgICAgaWYgKGZpbGUpIHtcclxuICAgICAgICAgICAgY29uc3QgaW1hZ2VzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgICAgICAgICBpbWFnZXMucHVzaCguLi5hdHRhY2hJbWFnZXMpO1xyXG4gICAgICAgICAgICBpbWFnZXMucHVzaChcclxuICAgICAgICAgICAgICAuLi4oYXdhaXQgbmV3IFByb21pc2U8c3RyaW5nW10+KChyZXMsIHJlaikgPT4ge1xyXG4gICAgICAgICAgICAgICAgc2V0VXBsb2FkaW5nKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW1hZ2VzRGF0YTogc3RyaW5nW10gPSBbXTtcclxuICAgICAgICAgICAgICAgIHVwbG9hZEltYWdlUmVtb3RlKGZpbGUpXHJcbiAgICAgICAgICAgICAgICAgIC50aGVuKChkYXRhVXJsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VzRGF0YS5wdXNoKGRhdGFVcmwpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNldFVwbG9hZGluZyhmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzKGltYWdlc0RhdGEpO1xyXG4gICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAuY2F0Y2goKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBzZXRVcGxvYWRpbmcoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlaihlKTtcclxuICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfSkpLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBjb25zdCBpbWFnZXNMZW5ndGggPSBpbWFnZXMubGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgaWYgKGltYWdlc0xlbmd0aCA+IDMpIHtcclxuICAgICAgICAgICAgICBpbWFnZXMuc3BsaWNlKDMsIGltYWdlc0xlbmd0aCAtIDMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHNldEF0dGFjaEltYWdlcyhpbWFnZXMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIFthdHRhY2hJbWFnZXMsIGNoYXRTdG9yZV0sXHJcbiAgKTtcclxuXHJcbiAgYXN5bmMgZnVuY3Rpb24gdXBsb2FkSW1hZ2UoKSB7XHJcbiAgICBjb25zdCBpbWFnZXM6IHN0cmluZ1tdID0gW107XHJcbiAgICBpbWFnZXMucHVzaCguLi5hdHRhY2hJbWFnZXMpO1xyXG5cclxuICAgIGltYWdlcy5wdXNoKFxyXG4gICAgICAuLi4oYXdhaXQgbmV3IFByb21pc2U8c3RyaW5nW10+KChyZXMsIHJlaikgPT4ge1xyXG4gICAgICAgIGNvbnN0IGZpbGVJbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcclxuICAgICAgICBmaWxlSW5wdXQudHlwZSA9IFwiZmlsZVwiO1xyXG4gICAgICAgIGZpbGVJbnB1dC5hY2NlcHQgPVxyXG4gICAgICAgICAgXCJpbWFnZS9wbmcsIGltYWdlL2pwZWcsIGltYWdlL3dlYnAsIGltYWdlL2hlaWMsIGltYWdlL2hlaWZcIjtcclxuICAgICAgICBmaWxlSW5wdXQubXVsdGlwbGUgPSB0cnVlO1xyXG4gICAgICAgIGZpbGVJbnB1dC5vbmNoYW5nZSA9IChldmVudDogYW55KSA9PiB7XHJcbiAgICAgICAgICBzZXRVcGxvYWRpbmcodHJ1ZSk7XHJcbiAgICAgICAgICBjb25zdCBmaWxlcyA9IGV2ZW50LnRhcmdldC5maWxlcztcclxuICAgICAgICAgIGNvbnN0IGltYWdlc0RhdGE6IHN0cmluZ1tdID0gW107XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbGUgPSBldmVudC50YXJnZXQuZmlsZXNbaV07XHJcbiAgICAgICAgICAgIHVwbG9hZEltYWdlUmVtb3RlKGZpbGUpXHJcbiAgICAgICAgICAgICAgLnRoZW4oKGRhdGFVcmwpID0+IHtcclxuICAgICAgICAgICAgICAgIGltYWdlc0RhdGEucHVzaChkYXRhVXJsKTtcclxuICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgaW1hZ2VzRGF0YS5sZW5ndGggPT09IDMgfHxcclxuICAgICAgICAgICAgICAgICAgaW1hZ2VzRGF0YS5sZW5ndGggPT09IGZpbGVzLmxlbmd0aFxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgIHNldFVwbG9hZGluZyhmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgIHJlcyhpbWFnZXNEYXRhKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgc2V0VXBsb2FkaW5nKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHJlaihlKTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIGZpbGVJbnB1dC5jbGljaygpO1xyXG4gICAgICB9KSksXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IGltYWdlc0xlbmd0aCA9IGltYWdlcy5sZW5ndGg7XHJcbiAgICBpZiAoaW1hZ2VzTGVuZ3RoID4gMykge1xyXG4gICAgICBpbWFnZXMuc3BsaWNlKDMsIGltYWdlc0xlbmd0aCAtIDMpO1xyXG4gICAgfVxyXG4gICAgc2V0QXR0YWNoSW1hZ2VzKGltYWdlcyk7XHJcbiAgfVxyXG5cclxuICAvLyDlv6vmjbfplK4gc2hvcnRjdXQga2V5c1xyXG4gIGNvbnN0IFtzaG93U2hvcnRjdXRLZXlNb2RhbCwgc2V0U2hvd1Nob3J0Y3V0S2V5TW9kYWxdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG5cclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgY29uc3QgaGFuZGxlS2V5RG93biA9IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xyXG4gICAgICAvLyDmiZPlvIDmlrDogYrlpKkgY29tbWFuZCArIHNoaWZ0ICsgb1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgKGV2ZW50Lm1ldGFLZXkgfHwgZXZlbnQuY3RybEtleSkgJiZcclxuICAgICAgICBldmVudC5zaGlmdEtleSAmJlxyXG4gICAgICAgIGV2ZW50LmtleS50b0xvd2VyQ2FzZSgpID09PSBcIm9cIlxyXG4gICAgICApIHtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgY2hhdFN0b3JlLm5ld1Nlc3Npb24oKTtcclxuICAgICAgICAgIG5hdmlnYXRlKFBhdGguQ2hhdCk7XHJcbiAgICAgICAgfSwgMTApO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIOiBmueEpuiBiuWkqei+k+WFpSBzaGlmdCArIGVzY1xyXG4gICAgICBlbHNlIGlmIChldmVudC5zaGlmdEtleSAmJiBldmVudC5rZXkudG9Mb3dlckNhc2UoKSA9PT0gXCJlc2NhcGVcIikge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgaW5wdXRSZWYuY3VycmVudD8uZm9jdXMoKTtcclxuICAgICAgfVxyXG4gICAgICAvLyDlpI3liLbmnIDlkI7kuIDkuKrku6PnoIHlnZcgY29tbWFuZCArIHNoaWZ0ICsgO1xyXG4gICAgICBlbHNlIGlmIChcclxuICAgICAgICAoZXZlbnQubWV0YUtleSB8fCBldmVudC5jdHJsS2V5KSAmJlxyXG4gICAgICAgIGV2ZW50LnNoaWZ0S2V5ICYmXHJcbiAgICAgICAgZXZlbnQuY29kZSA9PT0gXCJTZW1pY29sb25cIlxyXG4gICAgICApIHtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGNvbnN0IGNvcHlDb2RlQnV0dG9uID1cclxuICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KFwiLmNvcHktY29kZS1idXR0b25cIik7XHJcbiAgICAgICAgaWYgKGNvcHlDb2RlQnV0dG9uLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGNvcHlDb2RlQnV0dG9uW2NvcHlDb2RlQnV0dG9uLmxlbmd0aCAtIDFdLmNsaWNrKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIOWkjeWItuacgOWQjuS4gOS4quWbnuWkjSBjb21tYW5kICsgc2hpZnQgKyBjXHJcbiAgICAgIGVsc2UgaWYgKFxyXG4gICAgICAgIChldmVudC5tZXRhS2V5IHx8IGV2ZW50LmN0cmxLZXkpICYmXHJcbiAgICAgICAgZXZlbnQuc2hpZnRLZXkgJiZcclxuICAgICAgICBldmVudC5rZXkudG9Mb3dlckNhc2UoKSA9PT0gXCJjXCJcclxuICAgICAgKSB7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBjb25zdCBsYXN0Tm9uVXNlck1lc3NhZ2UgPSBtZXNzYWdlc1xyXG4gICAgICAgICAgLmZpbHRlcigobWVzc2FnZSkgPT4gbWVzc2FnZS5yb2xlICE9PSBcInVzZXJcIilcclxuICAgICAgICAgIC5wb3AoKTtcclxuICAgICAgICBpZiAobGFzdE5vblVzZXJNZXNzYWdlKSB7XHJcbiAgICAgICAgICBjb25zdCBsYXN0TWVzc2FnZUNvbnRlbnQgPSBnZXRNZXNzYWdlVGV4dENvbnRlbnQobGFzdE5vblVzZXJNZXNzYWdlKTtcclxuICAgICAgICAgIGNvcHlUb0NsaXBib2FyZChsYXN0TWVzc2FnZUNvbnRlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyDlsZXnpLrlv6vmjbfplK4gY29tbWFuZCArIC9cclxuICAgICAgZWxzZSBpZiAoKGV2ZW50Lm1ldGFLZXkgfHwgZXZlbnQuY3RybEtleSkgJiYgZXZlbnQua2V5ID09PSBcIi9cIikge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgc2V0U2hvd1Nob3J0Y3V0S2V5TW9kYWwodHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8g5riF6Zmk5LiK5LiL5paHIGNvbW1hbmQgKyBzaGlmdCArIGJhY2tzcGFjZVxyXG4gICAgICBlbHNlIGlmIChcclxuICAgICAgICAoZXZlbnQubWV0YUtleSB8fCBldmVudC5jdHJsS2V5KSAmJlxyXG4gICAgICAgIGV2ZW50LnNoaWZ0S2V5ICYmXHJcbiAgICAgICAgZXZlbnQua2V5LnRvTG93ZXJDYXNlKCkgPT09IFwiYmFja3NwYWNlXCJcclxuICAgICAgKSB7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBjaGF0U3RvcmUudXBkYXRlVGFyZ2V0U2Vzc2lvbihzZXNzaW9uLCAoc2Vzc2lvbikgPT4ge1xyXG4gICAgICAgICAgaWYgKHNlc3Npb24uY2xlYXJDb250ZXh0SW5kZXggPT09IHNlc3Npb24ubWVzc2FnZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHNlc3Npb24uY2xlYXJDb250ZXh0SW5kZXggPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzZXNzaW9uLmNsZWFyQ29udGV4dEluZGV4ID0gc2Vzc2lvbi5tZXNzYWdlcy5sZW5ndGg7XHJcbiAgICAgICAgICAgIHNlc3Npb24ubWVtb3J5UHJvbXB0ID0gXCJcIjsgLy8gd2lsbCBjbGVhciBtZW1vcnlcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBoYW5kbGVLZXlEb3duKTtcclxuXHJcbiAgICByZXR1cm4gKCkgPT4ge1xyXG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBoYW5kbGVLZXlEb3duKTtcclxuICAgIH07XHJcbiAgfSwgW21lc3NhZ2VzLCBjaGF0U3RvcmUsIG5hdmlnYXRlLCBzZXNzaW9uXSk7XHJcblxyXG4gIGNvbnN0IFtzaG93Q2hhdFNpZGVQYW5lbCwgc2V0U2hvd0NoYXRTaWRlUGFuZWxdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG5cclxuICByZXR1cm4gKFxyXG4gICAgPD5cclxuICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlcy5jaGF0fSBrZXk9e3Nlc3Npb24uaWR9PlxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwid2luZG93LWhlYWRlclwiIGRhdGEtdGF1cmktZHJhZy1yZWdpb24+XHJcbiAgICAgICAgICB7aXNNb2JpbGVTY3JlZW4gJiYgKFxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIndpbmRvdy1hY3Rpb25zXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e1wid2luZG93LWFjdGlvbi1idXR0b25cIn0+XHJcbiAgICAgICAgICAgICAgICA8SWNvbkJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICBpY29uPXs8UmV0dXJuSWNvbiAvPn1cclxuICAgICAgICAgICAgICAgICAgYm9yZGVyZWRcclxuICAgICAgICAgICAgICAgICAgdGl0bGU9e0xvY2FsZS5DaGF0LkFjdGlvbnMuQ2hhdExpc3R9XHJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IG5hdmlnYXRlKFBhdGguSG9tZSl9XHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICl9XHJcblxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICBjbGFzc05hbWU9e2Nsc3goXCJ3aW5kb3ctaGVhZGVyLXRpdGxlXCIsIHN0eWxlc1tcImNoYXQtYm9keS10aXRsZVwiXSl9XHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICBjbGFzc05hbWU9e2Nsc3goXHJcbiAgICAgICAgICAgICAgICBcIndpbmRvdy1oZWFkZXItbWFpbi10aXRsZVwiLFxyXG4gICAgICAgICAgICAgICAgc3R5bGVzW1wiY2hhdC1ib2R5LW1haW4tdGl0bGVcIl0sXHJcbiAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICBvbkNsaWNrQ2FwdHVyZT17KCkgPT4gc2V0SXNFZGl0aW5nTWVzc2FnZSh0cnVlKX1cclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIHshc2Vzc2lvbi50b3BpYyA/IERFRkFVTFRfVE9QSUMgOiBzZXNzaW9uLnRvcGljfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3aW5kb3ctaGVhZGVyLXN1Yi10aXRsZVwiPlxyXG4gICAgICAgICAgICAgIHtMb2NhbGUuQ2hhdC5TdWJUaXRsZShzZXNzaW9uLm1lc3NhZ2VzLmxlbmd0aCl9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIndpbmRvdy1hY3Rpb25zXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwid2luZG93LWFjdGlvbi1idXR0b25cIj5cclxuICAgICAgICAgICAgICA8SWNvbkJ1dHRvblxyXG4gICAgICAgICAgICAgICAgaWNvbj17PFJlbG9hZEljb24gLz59XHJcbiAgICAgICAgICAgICAgICBib3JkZXJlZFxyXG4gICAgICAgICAgICAgICAgdGl0bGU9e0xvY2FsZS5DaGF0LkFjdGlvbnMuUmVmcmVzaFRpdGxlfVxyXG4gICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBzaG93VG9hc3QoTG9jYWxlLkNoYXQuQWN0aW9ucy5SZWZyZXNoVG9hc3QpO1xyXG4gICAgICAgICAgICAgICAgICBjaGF0U3RvcmUuc3VtbWFyaXplU2Vzc2lvbih0cnVlLCBzZXNzaW9uKTtcclxuICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIHshaXNNb2JpbGVTY3JlZW4gJiYgKFxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwid2luZG93LWFjdGlvbi1idXR0b25cIj5cclxuICAgICAgICAgICAgICAgIDxJY29uQnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgIGljb249ezxSZW5hbWVJY29uIC8+fVxyXG4gICAgICAgICAgICAgICAgICBib3JkZXJlZFxyXG4gICAgICAgICAgICAgICAgICB0aXRsZT17TG9jYWxlLkNoYXQuRWRpdE1lc3NhZ2UuVGl0bGV9XHJcbiAgICAgICAgICAgICAgICAgIGFyaWE9e0xvY2FsZS5DaGF0LkVkaXRNZXNzYWdlLlRpdGxlfVxyXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRJc0VkaXRpbmdNZXNzYWdlKHRydWUpfVxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3aW5kb3ctYWN0aW9uLWJ1dHRvblwiPlxyXG4gICAgICAgICAgICAgIDxJY29uQnV0dG9uXHJcbiAgICAgICAgICAgICAgICBpY29uPXs8RXhwb3J0SWNvbiAvPn1cclxuICAgICAgICAgICAgICAgIGJvcmRlcmVkXHJcbiAgICAgICAgICAgICAgICB0aXRsZT17TG9jYWxlLkNoYXQuQWN0aW9ucy5FeHBvcnR9XHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIHNldFNob3dFeHBvcnQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICB7c2hvd01heEljb24gJiYgKFxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwid2luZG93LWFjdGlvbi1idXR0b25cIj5cclxuICAgICAgICAgICAgICAgIDxJY29uQnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgIGljb249e2NvbmZpZy50aWdodEJvcmRlciA/IDxNaW5JY29uIC8+IDogPE1heEljb24gLz59XHJcbiAgICAgICAgICAgICAgICAgIGJvcmRlcmVkXHJcbiAgICAgICAgICAgICAgICAgIHRpdGxlPXtMb2NhbGUuQ2hhdC5BY3Rpb25zLkZ1bGxTY3JlZW59XHJcbiAgICAgICAgICAgICAgICAgIGFyaWE9e0xvY2FsZS5DaGF0LkFjdGlvbnMuRnVsbFNjcmVlbn1cclxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy51cGRhdGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY29uZmlnKSA9PiAoY29uZmlnLnRpZ2h0Qm9yZGVyID0gIWNvbmZpZy50aWdodEJvcmRlciksXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICl9XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8UHJvbXB0VG9hc3RcclxuICAgICAgICAgICAgc2hvd1RvYXN0PXshaGl0Qm90dG9tfVxyXG4gICAgICAgICAgICBzaG93TW9kYWw9e3Nob3dQcm9tcHRNb2RhbH1cclxuICAgICAgICAgICAgc2V0U2hvd01vZGFsPXtzZXRTaG93UHJvbXB0TW9kYWx9XHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXNbXCJjaGF0LW1haW5cIl19PlxyXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlc1tcImNoYXQtYm9keS1jb250YWluZXJcIl19PlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXtzdHlsZXNbXCJjaGF0LWJvZHlcIl19XHJcbiAgICAgICAgICAgICAgcmVmPXtzY3JvbGxSZWZ9XHJcbiAgICAgICAgICAgICAgb25TY3JvbGw9eyhlKSA9PiBvbkNoYXRCb2R5U2Nyb2xsKGUuY3VycmVudFRhcmdldCl9XHJcbiAgICAgICAgICAgICAgb25Nb3VzZURvd249eygpID0+IGlucHV0UmVmLmN1cnJlbnQ/LmJsdXIoKX1cclxuICAgICAgICAgICAgICBvblRvdWNoU3RhcnQ9eygpID0+IHtcclxuICAgICAgICAgICAgICAgIGlucHV0UmVmLmN1cnJlbnQ/LmJsdXIoKTtcclxuICAgICAgICAgICAgICAgIHNldEF1dG9TY3JvbGwoZmFsc2UpO1xyXG4gICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICB7bWVzc2FnZXNcclxuICAgICAgICAgICAgICAgIC8vIFRPRE9cclxuICAgICAgICAgICAgICAgIC8vIC5maWx0ZXIoKG0pID0+ICFtLmlzTWNwUmVzcG9uc2UpXHJcbiAgICAgICAgICAgICAgICAubWFwKChtZXNzYWdlLCBpKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGlzVXNlciA9IG1lc3NhZ2Uucm9sZSA9PT0gXCJ1c2VyXCI7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGlzQ29udGV4dCA9IGkgPCBjb250ZXh0Lmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgY29uc3Qgc2hvd0FjdGlvbnMgPVxyXG4gICAgICAgICAgICAgICAgICAgIGkgPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgIShtZXNzYWdlLnByZXZpZXcgfHwgbWVzc2FnZS5jb250ZW50Lmxlbmd0aCA9PT0gMCkgJiZcclxuICAgICAgICAgICAgICAgICAgICAhaXNDb250ZXh0O1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCBzaG93VHlwaW5nID0gbWVzc2FnZS5wcmV2aWV3IHx8IG1lc3NhZ2Uuc3RyZWFtaW5nO1xyXG5cclxuICAgICAgICAgICAgICAgICAgY29uc3Qgc2hvdWxkU2hvd0NsZWFyQ29udGV4dERpdmlkZXIgPVxyXG4gICAgICAgICAgICAgICAgICAgIGkgPT09IGNsZWFyQ29udGV4dEluZGV4IC0gMTtcclxuXHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICAgICAgPEZyYWdtZW50IGtleT17bWVzc2FnZS5pZH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXNVc2VyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHN0eWxlc1tcImNoYXQtbWVzc2FnZS11c2VyXCJdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHN0eWxlc1tcImNoYXQtbWVzc2FnZVwiXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXNbXCJjaGF0LW1lc3NhZ2UtY29udGFpbmVyXCJdfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzW1wiY2hhdC1tZXNzYWdlLWhlYWRlclwiXX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzW1wiY2hhdC1tZXNzYWdlLWF2YXRhclwiXX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXNbXCJjaGF0LW1lc3NhZ2UtZWRpdFwiXX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEljb25CdXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249ezxFZGl0SWNvbiAvPn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWE9e0xvY2FsZS5DaGF0LkFjdGlvbnMuRWRpdH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2FzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3TWVzc2FnZSA9IGF3YWl0IHNob3dQcm9tcHQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxlLkNoYXQuQWN0aW9ucy5FZGl0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE1lc3NhZ2VUZXh0Q29udGVudChtZXNzYWdlKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld0NvbnRlbnQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE11bHRpbW9kYWxDb250ZW50W10gPSBuZXdNZXNzYWdlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbWFnZXMgPSBnZXRNZXNzYWdlSW1hZ2VzKG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1hZ2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50ID0gW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiBcInRleHRcIiwgdGV4dDogbmV3TWVzc2FnZSB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbWFnZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnQucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiaW1hZ2VfdXJsXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlX3VybDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogaW1hZ2VzW2ldLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXRTdG9yZS51cGRhdGVUYXJnZXRTZXNzaW9uKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlc3Npb24pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG0gPSBzZXNzaW9uLm1hc2suY29udGV4dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29uY2F0KHNlc3Npb24ubWVzc2FnZXMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKChtKSA9PiBtLmlkID09PSBtZXNzYWdlLmlkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0uY29udGVudCA9IG5ld0NvbnRlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvSWNvbkJ1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpc1VzZXIgPyAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEF2YXRhciBhdmF0YXI9e2NvbmZpZy5hdmF0YXJ9IC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgOiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtbXCJzeXN0ZW1cIl0uaW5jbHVkZXMobWVzc2FnZS5yb2xlKSA/IChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEF2YXRhciBhdmF0YXI9XCIyNjk5LWZlMGZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA6IChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPE1hc2tBdmF0YXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmF0YXI9e3Nlc3Npb24ubWFzay5hdmF0YXJ9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWw9e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5tb2RlbCB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5tYXNrLm1vZGVsQ29uZmlnLm1vZGVsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Lz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyFpc1VzZXIgJiYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzW1wiY2hhdC1tb2RlbC1uYW1lXCJdfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bWVzc2FnZS5tb2RlbH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzaG93QWN0aW9ucyAmJiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXNbXCJjaGF0LW1lc3NhZ2UtYWN0aW9uc1wiXX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlc1tcImNoYXQtaW5wdXQtYWN0aW9uc1wiXX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bWVzc2FnZS5zdHJlYW1pbmcgPyAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDaGF0QWN0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD17TG9jYWxlLkNoYXQuQWN0aW9ucy5TdG9wfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249ezxTdG9wSWNvbiAvPn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25Vc2VyU3RvcChtZXNzYWdlLmlkID8/IGkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA6IChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Q2hhdEFjdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD17TG9jYWxlLkNoYXQuQWN0aW9ucy5SZXRyeX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249ezxSZXNldEljb24gLz59XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBvblJlc2VuZChtZXNzYWdlKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Q2hhdEFjdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD17TG9jYWxlLkNoYXQuQWN0aW9ucy5EZWxldGV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPXs8RGVsZXRlSWNvbiAvPn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRGVsZXRlKG1lc3NhZ2UuaWQgPz8gaSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Q2hhdEFjdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD17TG9jYWxlLkNoYXQuQWN0aW9ucy5QaW59XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPXs8UGluSWNvbiAvPn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IG9uUGluTWVzc2FnZShtZXNzYWdlKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDaGF0QWN0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PXtMb2NhbGUuQ2hhdC5BY3Rpb25zLkNvcHl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPXs8Q29weUljb24gLz59XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5VG9DbGlwYm9hcmQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TWVzc2FnZVRleHRDb250ZW50KG1lc3NhZ2UpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y29uZmlnLnR0c0NvbmZpZy5lbmFibGUgJiYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPENoYXRBY3Rpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWNoU3RhdHVzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IExvY2FsZS5DaGF0LkFjdGlvbnMuU3RvcFNwZWVjaFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBMb2NhbGUuQ2hhdC5BY3Rpb25zLlNwZWVjaFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVjaFN0YXR1cyA/IChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTcGVha1N0b3BJY29uIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA6IChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTcGVha0ljb24gLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuYWlTcGVlY2goXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRNZXNzYWdlVGV4dENvbnRlbnQobWVzc2FnZSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHttZXNzYWdlPy50b29scz8ubGVuZ3RoID09IDAgJiYgc2hvd1R5cGluZyAmJiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzW1wiY2hhdC1tZXNzYWdlLXN0YXR1c1wiXX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtMb2NhbGUuQ2hhdC5UeXBpbmd9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHsvKkB0cy1pZ25vcmUqL31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7bWVzc2FnZT8udG9vbHM/Lmxlbmd0aCA+IDAgJiYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlc1tcImNoYXQtbWVzc2FnZS10b29sc1wiXX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHttZXNzYWdlPy50b29scz8ubWFwKCh0b29sKSA9PiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PXt0b29sLmlkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9e3Rvb2w/LmVycm9yTXNnfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtzdHlsZXNbXCJjaGF0LW1lc3NhZ2UtdG9vbFwiXX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dG9vbC5pc0Vycm9yID09PSBmYWxzZSA/IChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPENvbmZpcm1JY29uIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIDogdG9vbC5pc0Vycm9yID09PSB0cnVlID8gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Q2xvc2VJY29uIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIDogKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8TG9hZGluZ0J1dHRvbkljb24gLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57dG9vbD8uZnVuY3Rpb24/Lm5hbWV9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlc1tcImNoYXQtbWVzc2FnZS1pdGVtXCJdfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxNYXJrZG93blxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9e21lc3NhZ2Uuc3RyZWFtaW5nID8gXCJsb2FkaW5nXCIgOiBcImRvbmVcIn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudD17Z2V0TWVzc2FnZVRleHRDb250ZW50KG1lc3NhZ2UpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkaW5nPXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWVzc2FnZS5wcmV2aWV3IHx8IG1lc3NhZ2Uuc3RyZWFtaW5nKSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY29udGVudC5sZW5ndGggPT09IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXNVc2VyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBvbkNvbnRleHRNZW51PXsoZSkgPT4gb25SaWdodENsaWNrKGUsIG1lc3NhZ2UpfSAvLyBoYXJkIHRvIHVzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkRvdWJsZUNsaWNrQ2FwdHVyZT17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNNb2JpbGVTY3JlZW4pIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRVc2VySW5wdXQoZ2V0TWVzc2FnZVRleHRDb250ZW50KG1lc3NhZ2UpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udFNpemU9e2ZvbnRTaXplfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250RmFtaWx5PXtmb250RmFtaWx5fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRSZWY9e3Njcm9sbFJlZn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFNob3c9e2kgPj0gbWVzc2FnZXMubGVuZ3RoIC0gNn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Z2V0TWVzc2FnZUltYWdlcyhtZXNzYWdlKS5sZW5ndGggPT0gMSAmJiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e3N0eWxlc1tcImNoYXQtbWVzc2FnZS1pdGVtLWltYWdlXCJdfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYz17Z2V0TWVzc2FnZUltYWdlcyhtZXNzYWdlKVswXX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtnZXRNZXNzYWdlSW1hZ2VzKG1lc3NhZ2UpLmxlbmd0aCA+IDEgJiYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtzdHlsZXNbXCJjaGF0LW1lc3NhZ2UtaXRlbS1pbWFnZXNcIl19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIi0taW1hZ2UtY291bnRcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRNZXNzYWdlSW1hZ2VzKG1lc3NhZ2UpLmxlbmd0aCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gYXMgUmVhY3QuQ1NTUHJvcGVydGllc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtnZXRNZXNzYWdlSW1hZ2VzKG1lc3NhZ2UpLm1hcChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbWFnZSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXNbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjaGF0LW1lc3NhZ2UtaXRlbS1pbWFnZS1tdWx0aVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT17aW5kZXh9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9e2ltYWdlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0PVwiXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge21lc3NhZ2U/LmF1ZGlvX3VybCAmJiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzW1wiY2hhdC1tZXNzYWdlLWF1ZGlvXCJdfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGF1ZGlvIHNyYz17bWVzc2FnZS5hdWRpb191cmx9IGNvbnRyb2xzIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICApfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzW1wiY2hhdC1tZXNzYWdlLWFjdGlvbi1kYXRlXCJdfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpc0NvbnRleHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBMb2NhbGUuQ2hhdC5Jc0NvbnRleHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtZXNzYWdlLmRhdGUudG9Mb2NhbGVTdHJpbmcoKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIHtzaG91bGRTaG93Q2xlYXJDb250ZXh0RGl2aWRlciAmJiA8Q2xlYXJDb250ZXh0RGl2aWRlciAvPn1cclxuICAgICAgICAgICAgICAgICAgICA8L0ZyYWdtZW50PlxyXG4gICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfSl9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzW1wiY2hhdC1pbnB1dC1wYW5lbFwiXX0+XHJcbiAgICAgICAgICAgICAgPFByb21wdEhpbnRzXHJcbiAgICAgICAgICAgICAgICBwcm9tcHRzPXtwcm9tcHRIaW50c31cclxuICAgICAgICAgICAgICAgIG9uUHJvbXB0U2VsZWN0PXtvblByb21wdFNlbGVjdH1cclxuICAgICAgICAgICAgICAvPlxyXG5cclxuICAgICAgICAgICAgICA8Q2hhdEFjdGlvbnNcclxuICAgICAgICAgICAgICAgIHVwbG9hZEltYWdlPXt1cGxvYWRJbWFnZX1cclxuICAgICAgICAgICAgICAgIHNldEF0dGFjaEltYWdlcz17c2V0QXR0YWNoSW1hZ2VzfVxyXG4gICAgICAgICAgICAgICAgc2V0VXBsb2FkaW5nPXtzZXRVcGxvYWRpbmd9XHJcbiAgICAgICAgICAgICAgICBzaG93UHJvbXB0TW9kYWw9eygpID0+IHNldFNob3dQcm9tcHRNb2RhbCh0cnVlKX1cclxuICAgICAgICAgICAgICAgIHNjcm9sbFRvQm90dG9tPXtzY3JvbGxUb0JvdHRvbX1cclxuICAgICAgICAgICAgICAgIGhpdEJvdHRvbT17aGl0Qm90dG9tfVxyXG4gICAgICAgICAgICAgICAgdXBsb2FkaW5nPXt1cGxvYWRpbmd9XHJcbiAgICAgICAgICAgICAgICBzaG93UHJvbXB0SGludHM9eygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgLy8gQ2xpY2sgYWdhaW4gdG8gY2xvc2VcclxuICAgICAgICAgICAgICAgICAgaWYgKHByb21wdEhpbnRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXRQcm9tcHRIaW50cyhbXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICBpbnB1dFJlZi5jdXJyZW50Py5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICBzZXRVc2VySW5wdXQoXCIvXCIpO1xyXG4gICAgICAgICAgICAgICAgICBvblNlYXJjaChcIlwiKTtcclxuICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICBzZXRTaG93U2hvcnRjdXRLZXlNb2RhbD17c2V0U2hvd1Nob3J0Y3V0S2V5TW9kYWx9XHJcbiAgICAgICAgICAgICAgICBzZXRVc2VySW5wdXQ9e3NldFVzZXJJbnB1dH1cclxuICAgICAgICAgICAgICAgIHNldFNob3dDaGF0U2lkZVBhbmVsPXtzZXRTaG93Q2hhdFNpZGVQYW5lbH1cclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIDxsYWJlbFxyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbHN4KHN0eWxlc1tcImNoYXQtaW5wdXQtcGFuZWwtaW5uZXJcIl0sIHtcclxuICAgICAgICAgICAgICAgICAgW3N0eWxlc1tcImNoYXQtaW5wdXQtcGFuZWwtaW5uZXItYXR0YWNoXCJdXTpcclxuICAgICAgICAgICAgICAgICAgICBhdHRhY2hJbWFnZXMubGVuZ3RoICE9PSAwLFxyXG4gICAgICAgICAgICAgICAgfSl9XHJcbiAgICAgICAgICAgICAgICBodG1sRm9yPVwiY2hhdC1pbnB1dFwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPHRleHRhcmVhXHJcbiAgICAgICAgICAgICAgICAgIGlkPVwiY2hhdC1pbnB1dFwiXHJcbiAgICAgICAgICAgICAgICAgIHJlZj17aW5wdXRSZWZ9XHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17c3R5bGVzW1wiY2hhdC1pbnB1dFwiXX1cclxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e0xvY2FsZS5DaGF0LklucHV0KHN1Ym1pdEtleSl9XHJcbiAgICAgICAgICAgICAgICAgIG9uSW5wdXQ9eyhlKSA9PiBvbklucHV0KGUuY3VycmVudFRhcmdldC52YWx1ZSl9XHJcbiAgICAgICAgICAgICAgICAgIHZhbHVlPXt1c2VySW5wdXR9XHJcbiAgICAgICAgICAgICAgICAgIG9uS2V5RG93bj17b25JbnB1dEtleURvd259XHJcbiAgICAgICAgICAgICAgICAgIG9uRm9jdXM9e3Njcm9sbFRvQm90dG9tfVxyXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXtzY3JvbGxUb0JvdHRvbX1cclxuICAgICAgICAgICAgICAgICAgb25QYXN0ZT17aGFuZGxlUGFzdGV9XHJcbiAgICAgICAgICAgICAgICAgIHJvd3M9e2lucHV0Um93c31cclxuICAgICAgICAgICAgICAgICAgYXV0b0ZvY3VzPXthdXRvRm9jdXN9XHJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPXt7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6IGNvbmZpZy5mb250U2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICBmb250RmFtaWx5OiBjb25maWcuZm9udEZhbWlseSxcclxuICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICB7YXR0YWNoSW1hZ2VzLmxlbmd0aCAhPSAwICYmIChcclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlc1tcImF0dGFjaC1pbWFnZXNcIl19PlxyXG4gICAgICAgICAgICAgICAgICAgIHthdHRhY2hJbWFnZXMubWFwKChpbWFnZSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9e2luZGV4fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17c3R5bGVzW1wiYXR0YWNoLWltYWdlXCJdfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7IGJhY2tncm91bmRJbWFnZTogYHVybChcIiR7aW1hZ2V9XCIpYCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlc1tcImF0dGFjaC1pbWFnZS1tYXNrXCJdfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxEZWxldGVJbWFnZUJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVJbWFnZT17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEF0dGFjaEltYWdlcyhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaEltYWdlcy5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pfVxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgICA8SWNvbkJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICBpY29uPXs8U2VuZFdoaXRlSWNvbiAvPn1cclxuICAgICAgICAgICAgICAgICAgdGV4dD17TG9jYWxlLkNoYXQuU2VuZH1cclxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtzdHlsZXNbXCJjaGF0LWlucHV0LXNlbmRcIl19XHJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gZG9TdWJtaXQodXNlcklucHV0KX1cclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgY2xhc3NOYW1lPXtjbHN4KHN0eWxlc1tcImNoYXQtc2lkZS1wYW5lbFwiXSwge1xyXG4gICAgICAgICAgICAgIFtzdHlsZXNbXCJtb2JpbGVcIl1dOiBpc01vYmlsZVNjcmVlbixcclxuICAgICAgICAgICAgICBbc3R5bGVzW1wiY2hhdC1zaWRlLXBhbmVsLXNob3dcIl1dOiBzaG93Q2hhdFNpZGVQYW5lbCxcclxuICAgICAgICAgICAgfSl9XHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHtzaG93Q2hhdFNpZGVQYW5lbCAmJiAoXHJcbiAgICAgICAgICAgICAgPFJlYWx0aW1lQ2hhdFxyXG4gICAgICAgICAgICAgICAgb25DbG9zZT17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBzZXRTaG93Q2hhdFNpZGVQYW5lbChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgb25TdGFydFZvaWNlPXthc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic3RhcnQgdm9pY2VcIik7XHJcbiAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICl9XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIHtzaG93RXhwb3J0ICYmIChcclxuICAgICAgICA8RXhwb3J0TWVzc2FnZU1vZGFsIG9uQ2xvc2U9eygpID0+IHNldFNob3dFeHBvcnQoZmFsc2UpfSAvPlxyXG4gICAgICApfVxyXG5cclxuICAgICAge2lzRWRpdGluZ01lc3NhZ2UgJiYgKFxyXG4gICAgICAgIDxFZGl0TWVzc2FnZU1vZGFsXHJcbiAgICAgICAgICBvbkNsb3NlPXsoKSA9PiB7XHJcbiAgICAgICAgICAgIHNldElzRWRpdGluZ01lc3NhZ2UoZmFsc2UpO1xyXG4gICAgICAgICAgfX1cclxuICAgICAgICAvPlxyXG4gICAgICApfVxyXG5cclxuICAgICAge3Nob3dTaG9ydGN1dEtleU1vZGFsICYmIChcclxuICAgICAgICA8U2hvcnRjdXRLZXlNb2RhbCBvbkNsb3NlPXsoKSA9PiBzZXRTaG93U2hvcnRjdXRLZXlNb2RhbChmYWxzZSl9IC8+XHJcbiAgICAgICl9XHJcbiAgICA8Lz5cclxuICApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gQ2hhdCgpIHtcclxuICBjb25zdCBjaGF0U3RvcmUgPSB1c2VDaGF0U3RvcmUoKTtcclxuICBjb25zdCBzZXNzaW9uID0gY2hhdFN0b3JlLmN1cnJlbnRTZXNzaW9uKCk7XHJcbiAgcmV0dXJuIDxfQ2hhdCBrZXk9e3Nlc3Npb24uaWR9PjwvX0NoYXQ+O1xyXG59XHJcbiJdLCJuYW1lcyI6WyJ1c2VEZWJvdW5jZWRDYWxsYmFjayIsIlJlYWN0IiwiRnJhZ21lbnQiLCJ1c2VDYWxsYmFjayIsInVzZUVmZmVjdCIsInVzZU1lbW8iLCJ1c2VSZWYiLCJ1c2VTdGF0ZSIsIlNlbmRXaGl0ZUljb24iLCJCcmFpbkljb24iLCJSZW5hbWVJY29uIiwiRWRpdEljb24iLCJFeHBvcnRJY29uIiwiUmV0dXJuSWNvbiIsIkNvcHlJY29uIiwiU3BlYWtJY29uIiwiU3BlYWtTdG9wSWNvbiIsIkxvYWRpbmdJY29uIiwiTG9hZGluZ0J1dHRvbkljb24iLCJNYXhJY29uIiwiTWluSWNvbiIsIlJlc2V0SWNvbiIsIlJlbG9hZEljb24iLCJCcmVha0ljb24iLCJTZXR0aW5nc0ljb24iLCJEZWxldGVJY29uIiwiUGluSWNvbiIsIkNvbmZpcm1JY29uIiwiQ2xvc2VJY29uIiwiQ2FuY2VsSWNvbiIsIkltYWdlSWNvbiIsIkxpZ2h0SWNvbiIsIkRhcmtJY29uIiwiQXV0b0ljb24iLCJCb3R0b21JY29uIiwiU3RvcEljb24iLCJTaXplSWNvbiIsIlF1YWxpdHlJY29uIiwiU3R5bGVJY29uIiwiUGx1Z2luSWNvbiIsIlNob3J0Y3V0a2V5SWNvbiIsIk1jcFRvb2xJY29uIiwiSGVhZHBob25lSWNvbiIsIkJPVF9IRUxMTyIsImNyZWF0ZU1lc3NhZ2UiLCJERUZBVUxUX1RPUElDIiwiU3VibWl0S2V5IiwiVGhlbWUiLCJ1c2VBY2Nlc3NTdG9yZSIsInVzZUFwcENvbmZpZyIsInVzZUNoYXRTdG9yZSIsInVzZVBsdWdpblN0b3JlIiwiYXV0b0dyb3dUZXh0QXJlYSIsImNvcHlUb0NsaXBib2FyZCIsImdldE1lc3NhZ2VJbWFnZXMiLCJnZXRNZXNzYWdlVGV4dENvbnRlbnQiLCJpc0RhbGxlMyIsImlzVmlzaW9uTW9kZWwiLCJzYWZlTG9jYWxTdG9yYWdlIiwiZ2V0TW9kZWxTaXplcyIsInN1cHBvcnRzQ3VzdG9tU2l6ZSIsInVzZU1vYmlsZVNjcmVlbiIsInNlbGVjdE9yQ29weSIsInNob3dQbHVnaW5zIiwidXBsb2FkSW1hZ2UiLCJ1cGxvYWRJbWFnZVJlbW90ZSIsImR5bmFtaWMiLCJDaGF0Q29udHJvbGxlclBvb2wiLCJ1c2VQcm9tcHRTdG9yZSIsIkxvY2FsZSIsIkljb25CdXR0b24iLCJzdHlsZXMiLCJMaXN0IiwiTGlzdEl0ZW0iLCJNb2RhbCIsIlNlbGVjdG9yIiwic2hvd0NvbmZpcm0iLCJzaG93UHJvbXB0Iiwic2hvd1RvYXN0IiwidXNlTmF2aWdhdGUiLCJDSEFUX1BBR0VfU0laRSIsIkRFRkFVTFRfVFRTX0VOR0lORSIsIk1vZGVsUHJvdmlkZXIiLCJQYXRoIiwiUkVRVUVTVF9USU1FT1VUX01TIiwiU2VydmljZVByb3ZpZGVyIiwiVU5GSU5JU0hFRF9JTlBVVCIsIkF2YXRhciIsIkNvbnRleHRQcm9tcHRzIiwiTWFza0F2YXRhciIsIk1hc2tDb25maWciLCJ1c2VNYXNrU3RvcmUiLCJDaGF0Q29tbWFuZFByZWZpeCIsInVzZUNoYXRDb21tYW5kIiwidXNlQ29tbWFuZCIsInByZXR0eU9iamVjdCIsIkV4cG9ydE1lc3NhZ2VNb2RhbCIsImdldENsaWVudENvbmZpZyIsInVzZUFsbE1vZGVscyIsIkNsaWVudEFwaSIsImNyZWF0ZVRUU1BsYXllciIsIk1zRWRnZVRUUyIsIk9VVFBVVF9GT1JNQVQiLCJpc0VtcHR5IiwiUmVhbHRpbWVDaGF0IiwiY2xzeCIsImdldEF2YWlsYWJsZUNsaWVudHNDb3VudCIsImlzTWNwRW5hYmxlZCIsImxvY2FsU3RvcmFnZSIsInR0c1BsYXllciIsIk1hcmtkb3duIiwibG9hZGluZyIsIk1DUEFjdGlvbiIsIm5hdmlnYXRlIiwiY291bnQiLCJzZXRDb3VudCIsIm1jcEVuYWJsZWQiLCJzZXRNY3BFbmFibGVkIiwiY2hlY2tNY3BTdGF0dXMiLCJlbmFibGVkIiwiQ2hhdEFjdGlvbiIsIm9uQ2xpY2siLCJNY3BNYXJrZXQiLCJ0ZXh0IiwiaWNvbiIsIlNlc3Npb25Db25maWdNb2RlbCIsInByb3BzIiwiY2hhdFN0b3JlIiwic2Vzc2lvbiIsImN1cnJlbnRTZXNzaW9uIiwibWFza1N0b3JlIiwiZGl2IiwiY2xhc3NOYW1lIiwidGl0bGUiLCJDb250ZXh0IiwiRWRpdCIsIm9uQ2xvc2UiLCJhY3Rpb25zIiwiYm9yZGVyZWQiLCJDaGF0IiwiQ29uZmlnIiwiUmVzZXQiLCJNZW1vcnkiLCJSZXNldENvbmZpcm0iLCJ1cGRhdGVUYXJnZXRTZXNzaW9uIiwibWVtb3J5UHJvbXB0IiwiU2F2ZUFzIiwiTWFza3MiLCJzZXRUaW1lb3V0IiwiY3JlYXRlIiwibWFzayIsInVwZGF0ZU1hc2siLCJ1cGRhdGVyIiwic2hvdWxkU3luY0Zyb21HbG9iYWwiLCJleHRyYUxpc3RJdGVtcyIsIm1vZGVsQ29uZmlnIiwic2VuZE1lbW9yeSIsIlRpdGxlIiwibGFzdFN1bW1hcml6ZUluZGV4IiwibWVzc2FnZXMiLCJsZW5ndGgiLCJzdWJUaXRsZSIsIkVtcHR5Q29udGVudCIsIlByb21wdFRvYXN0IiwiY29udGV4dCIsInJvbGUiLCJzZXRTaG93TW9kYWwiLCJzcGFuIiwiVG9hc3QiLCJzaG93TW9kYWwiLCJ1c2VTdWJtaXRIYW5kbGVyIiwiY29uZmlnIiwic3VibWl0S2V5IiwiaXNDb21wb3NpbmciLCJvbkNvbXBvc2l0aW9uU3RhcnQiLCJjdXJyZW50Iiwib25Db21wb3NpdGlvbkVuZCIsIndpbmRvdyIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwic2hvdWxkU3VibWl0IiwiZSIsImtleUNvZGUiLCJrZXkiLCJuYXRpdmVFdmVudCIsIkFsdEVudGVyIiwiYWx0S2V5IiwiQ3RybEVudGVyIiwiY3RybEtleSIsIlNoaWZ0RW50ZXIiLCJzaGlmdEtleSIsIk1ldGFFbnRlciIsIm1ldGFLZXkiLCJFbnRlciIsIlByb21wdEhpbnRzIiwibm9Qcm9tcHRzIiwicHJvbXB0cyIsInNlbGVjdEluZGV4Iiwic2V0U2VsZWN0SW5kZXgiLCJzZWxlY3RlZFJlZiIsIm9uS2V5RG93biIsImNoYW5nZUluZGV4IiwiZGVsdGEiLCJzdG9wUHJvcGFnYXRpb24iLCJwcmV2ZW50RGVmYXVsdCIsIm5leHRJbmRleCIsIk1hdGgiLCJtYXgiLCJtaW4iLCJzY3JvbGxJbnRvVmlldyIsImJsb2NrIiwic2VsZWN0ZWRQcm9tcHQiLCJhdCIsIm9uUHJvbXB0U2VsZWN0IiwibWFwIiwicHJvbXB0IiwiaSIsInJlZiIsIm9uTW91c2VFbnRlciIsImNvbnRlbnQiLCJ0b1N0cmluZyIsIkNsZWFyQ29udGV4dERpdmlkZXIiLCJjbGVhckNvbnRleHRJbmRleCIsInVuZGVmaW5lZCIsIkNsZWFyIiwiUmV2ZXJ0IiwiaWNvblJlZiIsInRleHRSZWYiLCJ3aWR0aCIsInNldFdpZHRoIiwiZnVsbCIsInVwZGF0ZVdpZHRoIiwiZ2V0V2lkdGgiLCJkb20iLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJ0ZXh0V2lkdGgiLCJpY29uV2lkdGgiLCJvblRvdWNoU3RhcnQiLCJzdHlsZSIsInVzZVNjcm9sbFRvQm90dG9tIiwic2Nyb2xsUmVmIiwiZGV0YWNoIiwiYXV0b1Njcm9sbCIsInNldEF1dG9TY3JvbGwiLCJzY3JvbGxEb21Ub0JvdHRvbSIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsInNjcm9sbFRvIiwic2Nyb2xsSGVpZ2h0IiwibGFzdE1lc3NhZ2VzTGVuZ3RoIiwiQ2hhdEFjdGlvbnMiLCJwbHVnaW5TdG9yZSIsInRoZW1lIiwibmV4dFRoZW1lIiwidGhlbWVzIiwiQXV0byIsIkxpZ2h0IiwiRGFyayIsInRoZW1lSW5kZXgiLCJpbmRleE9mIiwidXBkYXRlIiwiY291bGRTdG9wIiwiaGFzUGVuZGluZyIsInN0b3BBbGwiLCJjdXJyZW50TW9kZWwiLCJtb2RlbCIsImN1cnJlbnRQcm92aWRlck5hbWUiLCJwcm92aWRlck5hbWUiLCJPcGVuQUkiLCJhbGxNb2RlbHMiLCJtb2RlbHMiLCJmaWx0ZXJlZE1vZGVscyIsImZpbHRlciIsIm0iLCJhdmFpbGFibGUiLCJkZWZhdWx0TW9kZWwiLCJmaW5kIiwiaXNEZWZhdWx0IiwiYXJyIiwiY3VycmVudE1vZGVsTmFtZSIsIm5hbWUiLCJwcm92aWRlciIsImRpc3BsYXlOYW1lIiwic2hvd01vZGVsU2VsZWN0b3IiLCJzZXRTaG93TW9kZWxTZWxlY3RvciIsInNob3dQbHVnaW5TZWxlY3RvciIsInNldFNob3dQbHVnaW5TZWxlY3RvciIsInNob3dVcGxvYWRJbWFnZSIsInNldFNob3dVcGxvYWRJbWFnZSIsInNob3dTaXplU2VsZWN0b3IiLCJzZXRTaG93U2l6ZVNlbGVjdG9yIiwic2hvd1F1YWxpdHlTZWxlY3RvciIsInNldFNob3dRdWFsaXR5U2VsZWN0b3IiLCJzaG93U3R5bGVTZWxlY3RvciIsInNldFNob3dTdHlsZVNlbGVjdG9yIiwibW9kZWxTaXplcyIsImRhbGxlM1F1YWxpdHlzIiwiZGFsbGUzU3R5bGVzIiwiY3VycmVudFNpemUiLCJzaXplIiwiY3VycmVudFF1YWxpdHkiLCJxdWFsaXR5IiwiY3VycmVudFN0eWxlIiwiaXNNb2JpbGVTY3JlZW4iLCJzaG93Iiwic2V0QXR0YWNoSW1hZ2VzIiwic2V0VXBsb2FkaW5nIiwiaXNVbmF2YWlsYWJsZU1vZGVsIiwic29tZSIsIm5leHRNb2RlbCIsIklucHV0QWN0aW9ucyIsIlN0b3AiLCJoaXRCb3R0b20iLCJzY3JvbGxUb0JvdHRvbSIsIlRvQm90dG9tIiwic2hvd1Byb21wdE1vZGFsIiwiU2V0dGluZ3MiLCJVcGxvYWRJbWFnZSIsInVwbG9hZGluZyIsImRlZmF1bHRTZWxlY3RlZFZhbHVlIiwiaXRlbXMiLCJ2YWx1ZSIsIm9uU2VsZWN0aW9uIiwicyIsInEiLCJnZXRBbGwiLCJQbHVnaW5zIiwiUGx1Z2luIiwiTmFtZSIsIm11bHRpcGxlIiwicGx1Z2luIiwiaXRlbSIsInZlcnNpb24iLCJpZCIsInNldFNob3dTaG9ydGN1dEtleU1vZGFsIiwiU2hvcnRjdXRLZXkiLCJyZWFsdGltZUNvbmZpZyIsImVuYWJsZSIsInNldFNob3dDaGF0U2lkZVBhbmVsIiwiRWRpdE1lc3NhZ2VNb2RhbCIsInNldE1lc3NhZ2VzIiwic2xpY2UiLCJFZGl0TWVzc2FnZSIsIlVJIiwiQ2FuY2VsIiwidHlwZSIsIkNvbmZpcm0iLCJUb3BpYyIsIlN1YlRpdGxlIiwiaW5wdXQiLCJ0b3BpYyIsIm9uSW5wdXQiLCJjdXJyZW50VGFyZ2V0IiwidXBkYXRlQ29udGV4dCIsIm5ld01lc3NhZ2VzIiwiRGVsZXRlSW1hZ2VCdXR0b24iLCJkZWxldGVJbWFnZSIsIlNob3J0Y3V0S2V5TW9kYWwiLCJpc01hYyIsIm5hdmlnYXRvciIsInBsYXRmb3JtIiwidG9VcHBlckNhc2UiLCJzaG9ydGN1dHMiLCJuZXdDaGF0Iiwia2V5cyIsImZvY3VzSW5wdXQiLCJjb3B5TGFzdENvZGUiLCJjb3B5TGFzdE1lc3NhZ2UiLCJzaG93U2hvcnRjdXRLZXkiLCJjbGVhckNvbnRleHQiLCJzaG9ydGN1dCIsImluZGV4IiwiX0NoYXQiLCJmb250U2l6ZSIsImZvbnRGYW1pbHkiLCJzaG93RXhwb3J0Iiwic2V0U2hvd0V4cG9ydCIsImlucHV0UmVmIiwidXNlcklucHV0Iiwic2V0VXNlcklucHV0IiwiaXNMb2FkaW5nIiwic2V0SXNMb2FkaW5nIiwiaXNTY3JvbGxlZFRvQm90dG9tIiwiYWJzIiwic2Nyb2xsVG9wIiwiY2xpZW50SGVpZ2h0IiwiaXNBdHRhY2hXaXRoVG9wIiwibGFzdE1lc3NhZ2UiLCJsYXN0RWxlbWVudENoaWxkIiwidG9wRGlzdGFuY2UiLCJ0b3AiLCJpc1R5cGluZyIsInNldEhpdEJvdHRvbSIsImF0dGFjaEltYWdlcyIsInByb21wdFN0b3JlIiwicHJvbXB0SGludHMiLCJzZXRQcm9tcHRIaW50cyIsIm9uU2VhcmNoIiwibWF0Y2hlZFByb21wdHMiLCJzZWFyY2giLCJsZWFkaW5nIiwidHJhaWxpbmciLCJpbnB1dFJvd3MiLCJzZXRJbnB1dFJvd3MiLCJtZWFzdXJlIiwicm93cyIsIk51bWJlciIsImNoYXRDb21tYW5kcyIsIm5ldyIsIm5ld1Nlc3Npb24iLCJuZXdtIiwiTmV3Q2hhdCIsInByZXYiLCJuZXh0U2Vzc2lvbiIsIm5leHQiLCJjbGVhciIsImZvcmsiLCJmb3JrU2Vzc2lvbiIsImRlbCIsImRlbGV0ZVNlc3Npb24iLCJjdXJyZW50U2Vzc2lvbkluZGV4IiwiU0VBUkNIX1RFWFRfTElNSVQiLCJuIiwidHJpbSIsIm1hdGNoIiwiZGlzYWJsZVByb21wdEhpbnQiLCJzdGFydHNXaXRoIiwic2VhcmNoVGV4dCIsImRvU3VibWl0IiwibWF0Y2hDb21tYW5kIiwibWF0Y2hlZCIsImludm9rZSIsIm9uVXNlcklucHV0IiwidGhlbiIsInNldExhc3RJbnB1dCIsImZvY3VzIiwibWF0Y2hlZENoYXRDb21tYW5kIiwib25Vc2VyU3RvcCIsIm1lc3NhZ2VJZCIsInN0b3AiLCJzdG9wVGltaW5nIiwiRGF0ZSIsIm5vdyIsImZvckVhY2giLCJpc0Vycm9yIiwiZGF0ZSIsImdldFRpbWUiLCJzdHJlYW1pbmciLCJlcnJvciIsIm1lc3NhZ2UiLCJzeW5jR2xvYmFsQ29uZmlnIiwiY29uc29sZSIsImxvZyIsIm9uSW5wdXRLZXlEb3duIiwibGFzdElucHV0Iiwib25SaWdodENsaWNrIiwiZGVsZXRlTWVzc2FnZSIsIm1zZ0lkIiwib25EZWxldGUiLCJvblJlc2VuZCIsInJlc2VuZGluZ0luZGV4IiwiZmluZEluZGV4IiwidXNlck1lc3NhZ2UiLCJib3RNZXNzYWdlIiwidGV4dENvbnRlbnQiLCJpbWFnZXMiLCJvblBpbk1lc3NhZ2UiLCJwdXNoIiwiQWN0aW9ucyIsIlBpblRvYXN0Q29udGVudCIsIlBpblRvYXN0QWN0aW9uIiwic2V0U2hvd1Byb21wdE1vZGFsIiwiYWNjZXNzU3RvcmUiLCJzcGVlY2hTdGF0dXMiLCJzZXRTcGVlY2hTdGF0dXMiLCJzcGVlY2hMb2FkaW5nIiwic2V0U3BlZWNoTG9hZGluZyIsIm9wZW5haVNwZWVjaCIsImFwaSIsIkdQVCIsImdldFN0YXRlIiwiaW5pdCIsImF1ZGlvQnVmZmVyIiwibWFya2Rvd25Ub1R4dCIsInJlcXVpcmUiLCJ0dHNDb25maWciLCJlbmdpbmUiLCJlZGdlVm9pY2VOYW1lIiwidHRzIiwic2V0TWV0YWRhdGEiLCJBVURJT18yNEtIWl85NktCSVRSQVRFX01PTk9fTVAzIiwidG9BcnJheUJ1ZmZlciIsImxsbSIsInNwZWVjaCIsInZvaWNlIiwic3BlZWQiLCJwbGF5IiwiY2F0Y2giLCJmaW5hbGx5IiwiaGlkZUNvbnRleHQiLCJjb3BpZWRIZWxsbyIsIk9iamVjdCIsImFzc2lnbiIsImlzQXV0aG9yaXplZCIsIkVycm9yIiwiVW5hdXRob3JpemVkIiwicmVuZGVyTWVzc2FnZXMiLCJjb25jYXQiLCJwcmV2aWV3Iiwic2VuZFByZXZpZXdCdWJibGUiLCJtc2dSZW5kZXJJbmRleCIsIl9zZXRNc2dSZW5kZXJJbmRleCIsInNldE1zZ1JlbmRlckluZGV4IiwibmV3SW5kZXgiLCJlbmRSZW5kZXJJbmRleCIsIm9uQ2hhdEJvZHlTY3JvbGwiLCJib3R0b21IZWlnaHQiLCJlZGdlVGhyZXNob2xkIiwiaXNUb3VjaFRvcEVkZ2UiLCJpc1RvdWNoQm90dG9tRWRnZSIsImlzSGl0Qm90dG9tIiwicHJldlBhZ2VNc2dJbmRleCIsIm5leHRQYWdlTXNnSW5kZXgiLCJjbGllbnRDb25maWciLCJhdXRvRm9jdXMiLCJzaG93TWF4SWNvbiIsImlzQXBwIiwiZmlsbCIsInN1Ym1pdCIsImNvZGUiLCJkaXNhYmxlRmFzdExpbmsiLCJVUkxDb21tYW5kIiwiQ29kZSIsInJlcyIsImFjY2VzcyIsImFjY2Vzc0NvZGUiLCJzZXR0aW5ncyIsInBheWxvYWQiLCJKU09OIiwicGFyc2UiLCJ1cmwiLCJzdHJpbmdpZnkiLCJvcGVuYWlBcGlLZXkiLCJvcGVuYWlVcmwiLCJ1c2VDdXN0b21Db25maWciLCJpc0VkaXRpbmdNZXNzYWdlIiwic2V0SXNFZGl0aW5nTWVzc2FnZSIsIm1heUJlVW5maW5pc2hlZElucHV0IiwiZ2V0SXRlbSIsInJlbW92ZUl0ZW0iLCJzZXRJdGVtIiwiaGFuZGxlUGFzdGUiLCJldmVudCIsImNsaXBib2FyZERhdGEiLCJraW5kIiwiZmlsZSIsImdldEFzRmlsZSIsIlByb21pc2UiLCJyZWoiLCJpbWFnZXNEYXRhIiwiZGF0YVVybCIsImltYWdlc0xlbmd0aCIsInNwbGljZSIsImZpbGVJbnB1dCIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsImFjY2VwdCIsIm9uY2hhbmdlIiwiZmlsZXMiLCJ0YXJnZXQiLCJjbGljayIsInNob3dTaG9ydGN1dEtleU1vZGFsIiwiaGFuZGxlS2V5RG93biIsInRvTG93ZXJDYXNlIiwiY29weUNvZGVCdXR0b24iLCJxdWVyeVNlbGVjdG9yQWxsIiwibGFzdE5vblVzZXJNZXNzYWdlIiwicG9wIiwibGFzdE1lc3NhZ2VDb250ZW50Iiwic2hvd0NoYXRTaWRlUGFuZWwiLCJjaGF0IiwiZGF0YS10YXVyaS1kcmFnLXJlZ2lvbiIsIkNoYXRMaXN0IiwiSG9tZSIsIm9uQ2xpY2tDYXB0dXJlIiwiUmVmcmVzaFRpdGxlIiwiUmVmcmVzaFRvYXN0Iiwic3VtbWFyaXplU2Vzc2lvbiIsImFyaWEiLCJFeHBvcnQiLCJ0aWdodEJvcmRlciIsIkZ1bGxTY3JlZW4iLCJvblNjcm9sbCIsIm9uTW91c2VEb3duIiwiYmx1ciIsImlzVXNlciIsImlzQ29udGV4dCIsInNob3dBY3Rpb25zIiwic2hvd1R5cGluZyIsInNob3VsZFNob3dDbGVhckNvbnRleHREaXZpZGVyIiwibmV3TWVzc2FnZSIsIm5ld0NvbnRlbnQiLCJpbWFnZV91cmwiLCJhdmF0YXIiLCJpbmNsdWRlcyIsIlJldHJ5IiwiRGVsZXRlIiwiUGluIiwiQ29weSIsIlN0b3BTcGVlY2giLCJTcGVlY2giLCJ0b29scyIsIlR5cGluZyIsInRvb2wiLCJlcnJvck1zZyIsImZ1bmN0aW9uIiwib25Eb3VibGVDbGlja0NhcHR1cmUiLCJwYXJlbnRSZWYiLCJkZWZhdWx0U2hvdyIsImltZyIsInNyYyIsImFsdCIsImltYWdlIiwiYXVkaW9fdXJsIiwiYXVkaW8iLCJjb250cm9scyIsIklzQ29udGV4dCIsInRvTG9jYWxlU3RyaW5nIiwic2hvd1Byb21wdEhpbnRzIiwibGFiZWwiLCJodG1sRm9yIiwidGV4dGFyZWEiLCJwbGFjZWhvbGRlciIsIklucHV0Iiwib25Gb2N1cyIsIm9uUGFzdGUiLCJiYWNrZ3JvdW5kSW1hZ2UiLCJfIiwiU2VuZCIsIm9uU3RhcnRWb2ljZSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/components/chat.tsx\n"));
|
|
|
|
/***/ })
|
|
|
|
}); |