diff --git a/pages/index/index.vue b/pages/index/index.vue index 74a8861..26d4cef 100644 --- a/pages/index/index.vue +++ b/pages/index/index.vue @@ -222,7 +222,9 @@ const uploadRes = await new Promise((resolve, reject) => { uni.uploadFile({ // url: 'http://192.168.133.83:8000/recognize_speech', - url: 'http://192.168.10.44:8000/recognize_speech', + // url: 'http://192.168.10.44:8000/recognize_speech', + // url: 'http://192.168.1.18:8000/recognize_speech', + url: 'http://106.227.91.181:8000/recognize_speech', filePath: tempFilePath, name: 'speech', // 对应后端的 UploadFile 参数名 formData: { @@ -356,8 +358,8 @@ async getAIResponse(message){ try { // const url = 'http://192.168.133.83:9020/api/chat' - const url = 'http://192.168.10.44:9020/api/chat' - // const url = 'http://106.227.91.181:9020/api/chat' // 如需切换线上,改这里即可 + // const url = 'http://192.168.10.44:9020/api/chat' + const url = 'http://106.227.91.181:9020/api/chat' // 如需切换线上,改这里即可 const headers = { 'Content-Type': 'application/json' } const data = { message } @@ -637,17 +639,20 @@ this.typewriterTimers[messageId] = timer }, scrollToBottom() { - this.$nextTick(() => { - uni.createSelectorQuery().select('.content').boundingClientRect((rect) => { - uni.pageScrollTo({ - scrollTop: rect.height, - duration: 300, - class: '.content' - }); - }).exec(); - }) - - }, + let self = this; + this.$nextTick(() => { + uni.createSelectorQuery().select('.content').boundingClientRect((rect) => { + if(self.height !== rect.height){ + self.height = rect.height; + uni.pageScrollTo({ + scrollTop: rect.height, + duration: 300, + class: '.content' + }); + } + }).exec(); + }) + }, mockReply(text) { const candidates = [ '好的,我已经为您处理。', diff --git a/unpackage/dist/dev/app-plus/app-service.js b/unpackage/dist/dev/app-plus/app-service.js index 087bf1e..390382f 100644 --- a/unpackage/dist/dev/app-plus/app-service.js +++ b/unpackage/dist/dev/app-plus/app-service.js @@ -2210,7 +2210,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _D_P /***/ (function(module, exports, __webpack_require__) { "use strict"; -eval("/* WEBPACK VAR INJECTION */(function(__f__) {\n\nvar _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ 1);\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _regenerator = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/regenerator */ 52));\nvar _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ 54));\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\nvar HISTORY_KEY = 'chat_history_groups';\nvar _default = {\n data: function data() {\n return {\n inputText: '',\n messages: [\n // {\n // \tid: 1,\n // \trole: 'user',\n // \ttype: 'text',\n // \tcontent: '帮我统计一下今日的销售数据',\n // \tinputType: 'text'\n // },\n // {\n // \tid: 2,\n // \trole: 'assistant',\n // \ttype: 'card',\n // \ttitle: '今日销售数据统计结果如下:',\n // \tcontent: '内容内容........................'\n // }\n ],\n scrollInto: '',\n drawerOpen: false,\n historyGroups: [],\n isRecording: false,\n isLoading: false,\n willCancel: false,\n recorder: null,\n recordStartY: 0,\n recordStartTs: 0,\n recordSimTimer: null,\n // show: false,\n innerAudioContext: null,\n popupVisible: false,\n typewriterTimers: {}\n };\n },\n computed: {\n timeOfDayText: function timeOfDayText() {\n var h = new Date().getHours();\n if (h < 6) return '凌晨好';\n if (h < 12) return '上午好';\n if (h < 18) return '下午好';\n return '晚上好';\n }\n },\n mounted: function mounted() {\n this.loadChatHistory();\n this.scrollToBottom();\n },\n beforeDestroy: function beforeDestroy() {\n // 清理所有打字机定时器\n Object.values(this.typewriterTimers).forEach(function (timer) {\n if (timer) clearInterval(timer);\n });\n this.typewriterTimers = {};\n // 清理录音定时器\n if (this.recordSimTimer) {\n clearTimeout(this.recordSimTimer);\n }\n },\n methods: {\n // 新增方法:上传音频并识别\n recognizeAudio: function recognizeAudio(tempFilePath) {\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {\n var fileInfo, uploadRes, result;\n return _regenerator.default.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n _context.prev = 0;\n __f__(\"log\", '开始语音识别,文件路径:', tempFilePath, \" at pages/index/index.vue:208\");\n\n // 获取文件信息\n _context.next = 4;\n return new Promise(function (resolve, reject) {\n uni.getFileInfo({\n filePath: tempFilePath,\n success: resolve,\n fail: reject\n });\n });\n case 4:\n fileInfo = _context.sent;\n __f__(\"log\", '文件大小:', fileInfo.size, \" at pages/index/index.vue:219\");\n\n // 使用 UniApp 的上传文件 API\n _context.next = 8;\n return new Promise(function (resolve, reject) {\n uni.uploadFile({\n // url: 'http://192.168.133.83:8000/recognize_speech',\n url: 'http://192.168.10.44:8000/recognize_speech',\n filePath: tempFilePath,\n name: 'speech',\n // 对应后端的 UploadFile 参数名\n formData: {\n 'format': 'amr',\n 'rate': 16000,\n 'channel': 1,\n 'cuid': 'uniapp_user',\n 'audio_len': fileInfo.size\n },\n success: function success(res) {\n __f__(\"log\", '上传响应:', res, \" at pages/index/index.vue:236\");\n if (res.statusCode === 200) {\n try {\n // 尝试解析返回的 JSON 数据\n var data = JSON.parse(res.data);\n resolve({\n statusCode: 200,\n data: data\n });\n } catch (e) {\n reject(new Error('响应解析失败: ' + e.message));\n }\n } else {\n reject(new Error(\"\\u4E0A\\u4F20\\u5931\\u8D25: \".concat(res.statusCode)));\n }\n },\n fail: function fail(err) {\n reject(new Error('上传请求失败: ' + err.errMsg));\n }\n });\n });\n case 8:\n uploadRes = _context.sent;\n __f__(\"log\", '语音识别响应:', uploadRes, \" at pages/index/index.vue:255\");\n result = uploadRes.data;\n if (!(result.status === 'success')) {\n _context.next = 15;\n break;\n }\n return _context.abrupt(\"return\", result.result);\n case 15:\n throw new Error(result.error || '识别失败');\n case 16:\n _context.next = 23;\n break;\n case 18:\n _context.prev = 18;\n _context.t0 = _context[\"catch\"](0);\n __f__(\"error\", '语音识别错误:', _context.t0, \" at pages/index/index.vue:264\");\n uni.showToast({\n title: '识别失败: ' + (_context.t0.message || '网络错误'),\n icon: 'none'\n });\n return _context.abrupt(\"return\", null);\n case 23:\n case \"end\":\n return _context.stop();\n }\n }\n }, _callee, null, [[0, 18]]);\n }))();\n },\n // ==================== 历史记录管理 ====================\n formatDate: function formatDate(date) {\n var y = date.getFullYear();\n var m = String(date.getMonth() + 1).padStart(2, '0');\n var d = String(date.getDate()).padStart(2, '0');\n return \"\".concat(y, \"\\u5E74\").concat(m, \"\\u6708\").concat(d, \"\\u65E5\");\n },\n loadChatHistory: function loadChatHistory() {\n try {\n var data = uni.getStorageSync(HISTORY_KEY);\n if (data && Array.isArray(data.groups)) {\n this.historyGroups = data.groups;\n } else {\n this.historyGroups = [];\n }\n } catch (e) {\n this.historyGroups = [];\n }\n },\n addToHistory: function addToHistory(text) {\n var _uni$getStorageSync;\n var groups = ((_uni$getStorageSync = uni.getStorageSync(HISTORY_KEY)) === null || _uni$getStorageSync === void 0 ? void 0 : _uni$getStorageSync.groups) || [];\n var today = this.formatDate(new Date());\n var todayGroup = groups.find(function (g) {\n return g.date === today;\n });\n if (!todayGroup) {\n todayGroup = {\n date: today,\n items: []\n };\n groups.unshift(todayGroup);\n }\n if (!todayGroup.items.includes(text)) {\n todayGroup.items.unshift(text);\n }\n\n // 限制大小\n if (todayGroup.items.length > 50) todayGroup.items = todayGroup.items.slice(0, 50);\n if (groups.length > 30) groups = groups.slice(0, 30);\n this.historyGroups = groups;\n uni.setStorageSync(HISTORY_KEY, {\n groups: groups,\n updatedAt: Date.now()\n });\n },\n removeFromHistory: function removeFromHistory(text) {\n var _uni$getStorageSync2;\n var groups = ((_uni$getStorageSync2 = uni.getStorageSync(HISTORY_KEY)) === null || _uni$getStorageSync2 === void 0 ? void 0 : _uni$getStorageSync2.groups) || [];\n groups.forEach(function (group) {\n group.items = group.items.filter(function (item) {\n return item !== text;\n });\n });\n groups = groups.filter(function (g) {\n return g.items.length > 0;\n });\n this.historyGroups = groups;\n uni.setStorageSync(HISTORY_KEY, {\n groups: groups,\n updatedAt: Date.now()\n });\n },\n clearAllHistory: function clearAllHistory() {\n var _this = this;\n uni.showModal({\n title: '清除全部',\n content: '将删除所有对话记录,此操作不可恢复',\n success: function success(res) {\n if (res.confirm) {\n uni.removeStorageSync(HISTORY_KEY);\n _this.historyGroups = [];\n uni.showToast({\n title: '已清除',\n icon: 'success'\n });\n }\n }\n });\n },\n onLongPressHistory: function onLongPressHistory(text) {\n var _this2 = this;\n uni.showModal({\n title: '删除记录',\n content: '确定删除这条对话记录?',\n success: function success(res) {\n if (res.confirm) {\n _this2.removeFromHistory(text);\n }\n }\n });\n },\n // 工具\n removeMessage: function removeMessage(id) {\n var idx = this.messages.findIndex(function (m) {\n return m.id === id;\n });\n if (idx > -1) this.messages.splice(idx, 1);\n },\n addAssistantMessage: function addAssistantMessage(id, content) {\n this.messages.push({\n id: id,\n role: 'assistant',\n type: 'text',\n content: content,\n displayText: ''\n });\n },\n getAIResponse: function getAIResponse(message) {\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2() {\n var _res$data, _res$data$result, url, headers, data, res;\n return _regenerator.default.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n _context2.prev = 0;\n // const url = 'http://192.168.133.83:9020/api/chat'\n url = 'http://192.168.10.44:9020/api/chat'; // const url = 'http://106.227.91.181:9020/api/chat' // 如需切换线上,改这里即可\n headers = {\n 'Content-Type': 'application/json'\n };\n data = {\n message: message\n };\n __f__(\"log\", data, \" at pages/index/index.vue:364\");\n\n // const [error, res] = await uni.request({\n // url,\n // method: 'POST',\n // header: headers,\n // data\n // })\n\n // console.log(res)\n // 使用 Promise 风格\n _context2.next = 7;\n return new Promise(function (resolve, reject) {\n uni.request({\n url: url,\n method: 'POST',\n header: headers,\n data: data,\n success: function success(res) {\n return resolve(res);\n },\n fail: function fail(err) {\n return reject(err);\n }\n });\n });\n case 7:\n res = _context2.sent;\n __f__(\"log\", '请求响应:', res, \" at pages/index/index.vue:386\");\n if (!(res.statusCode !== 200)) {\n _context2.next = 11;\n break;\n }\n throw new Error(\"HTTP\\u9519\\u8BEF! \\u72B6\\u6001\\u7801: \".concat(res.statusCode));\n case 11:\n return _context2.abrupt(\"return\", ((_res$data = res.data) === null || _res$data === void 0 ? void 0 : (_res$data$result = _res$data.result) === null || _res$data$result === void 0 ? void 0 : _res$data$result.data) || '未获取到有效回复');\n case 14:\n _context2.prev = 14;\n _context2.t0 = _context2[\"catch\"](0);\n __f__(\"error\", 'AI请求错误:', _context2.t0, \" at pages/index/index.vue:395\");\n return _context2.abrupt(\"return\", \"\\u62B1\\u6B49\\uFF0C\\u51FA\\u4E86\\u70B9\\u95EE\\u9898: \".concat(_context2.t0.errMsg || _context2.t0.message));\n case 18:\n case \"end\":\n return _context2.stop();\n }\n }\n }, _callee2, null, [[0, 14]]);\n }))();\n },\n playVoice: function playVoice(voicePath) {\n if (!voicePath) {\n uni.showToast({\n title: '无可播放的语音',\n icon: 'none'\n });\n return;\n }\n if (!this.innerAudioContext) {\n this.innerAudioContext = uni.createInnerAudioContext();\n this.innerAudioContext.autoplay = false;\n this.innerAudioContext.onError(function () {\n uni.showToast({\n title: '播放失败',\n icon: 'none'\n });\n });\n }\n try {\n this.innerAudioContext.stop();\n } catch (e) {}\n __f__(\"log\", voicePath, \" at pages/index/index.vue:413\");\n this.innerAudioContext.src = voicePath;\n this.innerAudioContext.play();\n },\n onSettingTap: function onSettingTap() {\n uni.navigateTo({\n url: '/pages/setting/index'\n });\n },\n onSuggestionTap: function onSuggestionTap(text) {\n this.inputText = text;\n this.onSend();\n },\n onQuickAsk: function onQuickAsk(text) {\n this.inputText = text;\n this.onSend();\n },\n onSwitchModel: function onSwitchModel() {\n uni.showToast({\n title: '已切换为通用模型',\n icon: 'none'\n });\n },\n onInput: function onInput(e) {\n this.inputText = e.detail.value;\n },\n openDrawer: function openDrawer() {\n this.$refs.popup.open();\n },\n onPopupChange: function onPopupChange(e) {\n // e.show: true when opened, false when closed\n this.popupVisible = !!(e && e.show === true);\n },\n // ===== Voice input (WeChat-like) =====\n ensureRecorder: function ensureRecorder() {\n var _this3 = this;\n if (this.recorder) return;\n try {\n this.recorder = uni.getRecorderManager && uni.getRecorderManager();\n } catch (e) {\n this.recorder = null;\n }\n if (this.recorder) {\n this.recorder.onStart();\n this.recorder.onStop( /*#__PURE__*/function () {\n var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(res) {\n var duration, tempFilePath, recognizedText;\n return _regenerator.default.wrap(function _callee3$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n duration = Date.now() - _this3.recordStartTs;\n tempFilePath = res.tempFilePath; // 添加这行,从res中获取文件路径\n if (!(_this3.willCancel || duration < 700)) {\n _context3.next = 5;\n break;\n }\n uni.showToast({\n title: duration < 700 ? '说话时间太短' : '已取消',\n icon: 'none'\n });\n return _context3.abrupt(\"return\");\n case 5:\n // 显示加载\n uni.showLoading({\n title: '识别中...'\n });\n\n // TODO: 上传 res.tempFilePath 做识别;现用 mock\n // this.handleRecognizedText(this.mockSpeechToText(duration), res.tempFilePath, Math.ceil(\n // \tduration / 100) / 10)\n // 真实识别\n _context3.next = 8;\n return _this3.recognizeAudio(tempFilePath);\n case 8:\n recognizedText = _context3.sent;\n uni.hideLoading();\n if (recognizedText) {\n // 成功:填入输入框\n _this3.inputText = recognizedText;\n _this3.$nextTick(function () {\n // 可选:自动发送\n // this.onSend('voice', tempFilePath, Math.ceil(duration / 100) / 10);\n });\n }\n case 11:\n case \"end\":\n return _context3.stop();\n }\n }\n }, _callee3);\n }));\n return function (_x) {\n return _ref.apply(this, arguments);\n };\n }());\n }\n },\n onPressMic: function onPressMic(e) {\n this.ensureRecorder();\n this.isRecording = true;\n // this.show = true\n this.willCancel = false;\n this.recordStartTs = Date.now();\n this.recordStartY = e.changedTouches && e.changedTouches[0] ? e.changedTouches[0].clientY : 0;\n if (this.recorder) {\n try {\n this.recorder.start({\n format: 'amr',\n sampleRate: 16000,\n encodeBitRate: 16000,\n // 编码比特率\n frameSize: 4,\n // 帧大小\n numberOfChannels: 1,\n duration: 60000\n });\n } catch (err) {}\n } else {\n if (this.recordSimTimer) clearTimeout(this.recordSimTimer);\n this.recordSimTimer = setTimeout(function () {}, 60000);\n }\n },\n onMoveMic: function onMoveMic(e) {\n if (!this.isRecording) return;\n var y = e.changedTouches && e.changedTouches[0] ? e.changedTouches[0].clientY : 0;\n this.willCancel = this.recordStartY - y > 60;\n },\n onReleaseMic: function onReleaseMic() {\n __f__(\"log\", 'onReleaseMic', \" at pages/index/index.vue:515\");\n if (!this.isRecording) return;\n var cancel = this.willCancel;\n this.isRecording = false;\n this.show = false;\n if (this.recorder) {\n try {\n this.recorder.stop();\n } catch (err) {\n __f__(\"log\", 'err', err, \" at pages/index/index.vue:524\");\n }\n }\n },\n handleRecognizedText: function handleRecognizedText(text, tempFilePath, duration) {\n if (!text) return;\n this.inputText = text;\n this.onSend('voice', tempFilePath, duration); // 传 'voice'\n },\n mockSpeechToText: function mockSpeechToText(ms) {\n var sec = Math.ceil(ms / 100) / 10;\n var pool = [\"\\u8BED\\u97F3\\u8F93\\u5165 \".concat(sec, \"s\\uFF0C\\u6A21\\u62DF\\u8BC6\\u522B\\uFF1A\\u5E2E\\u6211\\u7EDF\\u8BA1\\u4ECA\\u5929\\u9500\\u552E\\u989D\"), \"\\u8BED\\u97F3\\u8F93\\u5165 \".concat(sec, \"s\\uFF0C\\u6A21\\u62DF\\u8BC6\\u522B\\uFF1A\\u67E5\\u8BE2\\u8BA2\\u535520388993483\"), \"\\u8BED\\u97F3\\u8F93\\u5165 \".concat(sec, \"s\\uFF0C\\u6A21\\u62DF\\u8BC6\\u522B\\uFF1A\\u751F\\u6210\\u65E5\\u62A5\")];\n return pool[Math.floor(Math.random() * pool.length)];\n },\n onHistoryItemTap: function onHistoryItemTap(text) {\n this.inputText = text;\n this.onSend();\n this.$refs.popup.close();\n },\n onSend: function onSend() {\n var _arguments = arguments,\n _this4 = this;\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4() {\n var inputType, inputContent, duration, text, baseId, loadingId, reply, loadingIdx, replyId, _loadingIdx;\n return _regenerator.default.wrap(function _callee4$(_context4) {\n while (1) {\n switch (_context4.prev = _context4.next) {\n case 0:\n inputType = _arguments.length > 0 && _arguments[0] !== undefined ? _arguments[0] : 'text';\n inputContent = _arguments.length > 1 && _arguments[1] !== undefined ? _arguments[1] : '';\n duration = _arguments.length > 2 && _arguments[2] !== undefined ? _arguments[2] : undefined;\n text = (_this4.inputText || '').trim();\n if (!(!text || _this4.isLoading)) {\n _context4.next = 6;\n break;\n }\n return _context4.abrupt(\"return\");\n case 6:\n baseId = Date.now(); // 1. 用户消息\n _this4.messages.push({\n id: baseId,\n role: 'user',\n type: 'text',\n content: text,\n inputType: inputType,\n inputContent: inputContent,\n duration: duration\n });\n\n // 2. loading 消息\n loadingId = baseId + 0.5;\n _this4.messages.push({\n id: loadingId,\n role: 'assistant',\n loading: true\n });\n _this4.scrollToBottom();\n _this4.inputText = '';\n _this4.isLoading = true;\n _this4.addToHistory(text);\n _context4.prev = 14;\n _context4.next = 17;\n return _this4.getAIResponse(text);\n case 17:\n reply = _context4.sent;\n // 4. 移除 loading\n loadingIdx = _this4.messages.findIndex(function (m) {\n return m.id === loadingId;\n });\n if (loadingIdx > -1) _this4.messages.splice(loadingIdx, 1);\n\n // 5. 添加回复 + 打字机\n replyId = baseId + 1;\n _this4.messages.push({\n id: replyId,\n role: 'assistant',\n type: 'text',\n content: reply,\n displayText: ''\n });\n _this4.typewriter(replyId, reply);\n _context4.next = 30;\n break;\n case 25:\n _context4.prev = 25;\n _context4.t0 = _context4[\"catch\"](14);\n // 出错时也展示\n _loadingIdx = _this4.messages.findIndex(function (m) {\n return m.id === loadingId;\n });\n if (_loadingIdx > -1) _this4.messages.splice(_loadingIdx, 1);\n _this4.messages.push({\n id: baseId + 1,\n role: 'assistant',\n content: \"\\u8BF7\\u6C42\\u51FA\\u9519\\uFF1A\".concat(_context4.t0.message || _context4.t0)\n });\n case 30:\n _context4.prev = 30;\n _this4.isLoading = false;\n _this4.$nextTick(function () {\n return _this4.scrollToBottom();\n });\n return _context4.finish(30);\n case 34:\n case \"end\":\n return _context4.stop();\n }\n }\n }, _callee4, null, [[14, 25, 30, 34]]);\n }))();\n },\n typewriter: function typewriter(messageId, fullText) {\n var _this5 = this;\n var msg = this.messages.find(function (m) {\n return m.id === messageId;\n });\n if (!msg) return;\n // 清理之前的定时器(如果存在)\n if (this.typewriterTimers[messageId]) {\n clearInterval(this.typewriterTimers[messageId]);\n }\n var index = 0;\n msg.displayText = fullText.substring(0, index + 1);\n index += 1;\n var speed = 50; // 每个字符间隔50ms\n var timer = setInterval(function () {\n if (index < fullText.length) {\n msg.displayText = fullText.substring(0, index + 1);\n index++;\n // 打字过程中自动滚动到底部\n _this5.$nextTick(function () {\n _this5.scrollToBottom();\n });\n } else {\n clearInterval(timer);\n delete _this5.typewriterTimers[messageId];\n // 完成后使用完整文本\n msg.displayText = fullText;\n }\n }, speed);\n this.typewriterTimers[messageId] = timer;\n },\n scrollToBottom: function scrollToBottom() {\n this.$nextTick(function () {\n uni.createSelectorQuery().select('.content').boundingClientRect(function (rect) {\n uni.pageScrollTo({\n scrollTop: rect.height,\n duration: 300,\n class: '.content'\n });\n }).exec();\n });\n },\n mockReply: function mockReply(text) {\n var candidates = ['好的,我已经为您处理。', '收到请求,以下是结果的概览。', '我理解了,这是一个示例回复。', '已记录,稍后将完善报表。'];\n var pick = candidates[Math.floor(Math.random() * candidates.length)];\n return pick + '(已收到:“' + text + '”)';\n },\n onListen: function onListen(text) {\n try {\n // H5: Web Speech API\n if (typeof window !== 'undefined' && window.speechSynthesis) {\n var u = new SpeechSynthesisUtterance(String(text));\n u.lang = 'zh-CN';\n u.rate = 1;\n u.pitch = 1;\n window.speechSynthesis.cancel();\n window.speechSynthesis.speak(u);\n return;\n }\n } catch (e) {}\n uni.showToast({\n title: '当前端不支持语音播放',\n icon: 'none'\n });\n }\n }\n};\nexports.default = _default;\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./node_modules/@dcloudio/vue-cli-plugin-uni/lib/format-log.js */ 35)[\"default\"]))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInVuaS1hcHA6Ly8vcGFnZXMvaW5kZXgvaW5kZXgudnVlIl0sIm5hbWVzIjpbImRhdGEiLCJpbnB1dFRleHQiLCJtZXNzYWdlcyIsInNjcm9sbEludG8iLCJkcmF3ZXJPcGVuIiwiaGlzdG9yeUdyb3VwcyIsImlzUmVjb3JkaW5nIiwiaXNMb2FkaW5nIiwid2lsbENhbmNlbCIsInJlY29yZGVyIiwicmVjb3JkU3RhcnRZIiwicmVjb3JkU3RhcnRUcyIsInJlY29yZFNpbVRpbWVyIiwiaW5uZXJBdWRpb0NvbnRleHQiLCJwb3B1cFZpc2libGUiLCJ0eXBld3JpdGVyVGltZXJzIiwiY29tcHV0ZWQiLCJ0aW1lT2ZEYXlUZXh0IiwibW91bnRlZCIsImJlZm9yZURlc3Ryb3kiLCJPYmplY3QiLCJjbGVhclRpbWVvdXQiLCJtZXRob2RzIiwicmVjb2duaXplQXVkaW8iLCJ1bmkiLCJmaWxlUGF0aCIsInN1Y2Nlc3MiLCJmYWlsIiwiZmlsZUluZm8iLCJ1cmwiLCJuYW1lIiwiZm9ybURhdGEiLCJyZXNvbHZlIiwic3RhdHVzQ29kZSIsInJlamVjdCIsInVwbG9hZFJlcyIsInJlc3VsdCIsInRpdGxlIiwiaWNvbiIsImZvcm1hdERhdGUiLCJsb2FkQ2hhdEhpc3RvcnkiLCJhZGRUb0hpc3RvcnkiLCJ0b2RheUdyb3VwIiwiZGF0ZSIsIml0ZW1zIiwiZ3JvdXBzIiwidXBkYXRlZEF0IiwicmVtb3ZlRnJvbUhpc3RvcnkiLCJncm91cCIsImNsZWFyQWxsSGlzdG9yeSIsImNvbnRlbnQiLCJvbkxvbmdQcmVzc0hpc3RvcnkiLCJyZW1vdmVNZXNzYWdlIiwiYWRkQXNzaXN0YW50TWVzc2FnZSIsImlkIiwicm9sZSIsInR5cGUiLCJkaXNwbGF5VGV4dCIsImdldEFJUmVzcG9uc2UiLCJoZWFkZXJzIiwibWVzc2FnZSIsIm1ldGhvZCIsImhlYWRlciIsInJlcyIsInBsYXlWb2ljZSIsIm9uU2V0dGluZ1RhcCIsIm9uU3VnZ2VzdGlvblRhcCIsIm9uUXVpY2tBc2siLCJvblN3aXRjaE1vZGVsIiwib25JbnB1dCIsIm9wZW5EcmF3ZXIiLCJvblBvcHVwQ2hhbmdlIiwiZW5zdXJlUmVjb3JkZXIiLCJkdXJhdGlvbiIsInRlbXBGaWxlUGF0aCIsInJlY29nbml6ZWRUZXh0Iiwib25QcmVzc01pYyIsImZvcm1hdCIsInNhbXBsZVJhdGUiLCJlbmNvZGVCaXRSYXRlIiwiZnJhbWVTaXplIiwibnVtYmVyT2ZDaGFubmVscyIsIm9uTW92ZU1pYyIsIm9uUmVsZWFzZU1pYyIsImhhbmRsZVJlY29nbml6ZWRUZXh0IiwibW9ja1NwZWVjaFRvVGV4dCIsInNlYyIsIm9uSGlzdG9yeUl0ZW1UYXAiLCJvblNlbmQiLCJpbnB1dFR5cGUiLCJpbnB1dENvbnRlbnQiLCJ0ZXh0IiwiYmFzZUlkIiwibG9hZGluZ0lkIiwibG9hZGluZyIsInJlcGx5IiwibG9hZGluZ0lkeCIsInJlcGx5SWQiLCJ0eXBld3JpdGVyIiwiY2xlYXJJbnRlcnZhbCIsIm1zZyIsImluZGV4Iiwic2Nyb2xsVG9Cb3R0b20iLCJzY3JvbGxUb3AiLCJjbGFzcyIsIm1vY2tSZXBseSIsIm9uTGlzdGVuIiwidSIsIndpbmRvdyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNklBO0FBQUEsZUFDQTtFQUNBQTtJQUNBO01BQ0FDO01BQ0FDO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtNQUFBLENBQ0E7TUFDQUM7TUFDQUM7TUFDQUMsaUJBQ0E7TUFDQUM7TUFDQUM7TUFDQUM7TUFDQUM7TUFDQUM7TUFDQUM7TUFDQUM7TUFDQTtNQUNBQztNQUNBQztNQUNBQztJQUNBO0VBQ0E7RUFDQUM7SUFDQUM7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QUM7TUFDQTtRQUNBO1FBQ0E7VUFDQTtVQUNBQztVQUNBQTtVQUNBQTtVQUNBQztVQUNBQTtVQUNBO1FBQ0E7TUFDQTtNQUNBcEY7UUFDQWE7UUFDQUM7TUFDQTtJQUNBO0VBQ0E7QUFDQTtBQUFBLDJCIiwiZmlsZSI6IjUxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXHQ8dGVtcGxhdGU+XHJcblx0XHQ8dmlldyBjbGFzcz1cImFpLXBhZ2VcIj5cclxuXHRcdFx0PHVuaS1uYXYtYmFyICBsZWZ0LWljb249XCJsZWZ0XCIgQGNsaWNrTGVmdD1cIm9wZW5EcmF3ZXJcIiB0aXRsZT1cIkFJ5a+56K+dXCI+XHJcblx0XHRcdFx0PHRlbXBsYXRlIHYtc2xvdDpsZWZ0PlxyXG5cdFx0XHRcdFx0PHZpZXcgY2xhc3M9XCJoYW1idXJnZXJcIj5cclxuXHRcdFx0XHRcdFx0PHZpZXcgY2xhc3M9XCJsaW5lXCIgLz5cclxuXHRcdFx0XHRcdFx0PHZpZXcgY2xhc3M9XCJsaW5lXCIgLz5cclxuXHRcdFx0XHRcdFx0PHZpZXcgY2xhc3M9XCJsaW5lXCIgLz5cclxuXHRcdFx0XHRcdDwvdmlldz5cclxuXHRcdFx0XHQ8L3RlbXBsYXRlPlxyXG5cdFx0XHRcdDx0ZW1wbGF0ZSB2LXNsb3Q6cmlnaHQ+XHJcblx0XHRcdFx0XHQ8dmlldyBjbGFzcz1cIm5hdi1yaWdodFwiPlxyXG5cdFx0XHRcdFx0XHQ8IS0tIDx2aWV3IGNsYXNzPVwiZ2VhclwiIEB0YXA9XCJvblNldHRpbmdUYXBcIj7impnvuI88L3ZpZXc+IC0tPlxyXG5cdFx0XHRcdFx0XHQ8aW1hZ2Ugc3JjPVwiLi4vLi4vc3RhdGljL3NldC5wbmdcIiBtb2RlPVwid2lkdGhGaXhcIiBAdGFwPVwib25TZXR0aW5nVGFwXCIgc3R5bGU9XCJ3aWR0aDogMThweDtcIj48L2ltYWdlPlxyXG5cdFx0XHRcdFx0PC92aWV3PlxyXG5cdFx0XHRcdDwvdGVtcGxhdGU+XHJcblx0XHRcdDwvdW5pLW5hdi1iYXI+XHJcblx0XHRcdDwhLS0gc2Nyb2xsYWJsZSBjb250ZW50IC0tPlxyXG5cdFx0XHQ8c2Nyb2xsLXZpZXcgY2xhc3M9XCJjb250ZW50XCIgOnNjcm9sbC15PVwidHJ1ZVwiIHNob3ctc2Nyb2xsYmFyPVwiZmFsc2VcIiBcclxuXHRcdFx0XHRzY3JvbGwtd2l0aC1hbmltYXRpb24gcmVmPVwic2Nyb2xsVmlld1wiPlxyXG5cdFx0XHRcdDwhLS0gZ3JlZXRpbmcgY2FyZCAtLT5cdFxyXG5cdFx0XHRcdDx2aWV3IGNsYXNzPVwiZ3JlZXQtY2FyZFwiPlxyXG5cdFx0XHRcdFx0XHQ8aW1hZ2Ugc3JjPVwiLi4vLi4vc3RhdGljL2FpLndlYnBcIiBtb2RlPVwid2lkdGhGaXhcIiBzdHlsZT1cIndpZHRoOiA2MHB4O21hcmdpbi1yaWdodDogMTBweDtcIj48L2ltYWdlPlxyXG5cdFx0XHRcdFx0PHZpZXcgY2xhc3M9XCJncmVldC10ZXh0XCI+XHJcblx0XHRcdFx0XHRcdDx2aWV3IGNsYXNzPVwiaGlcIj5ISe+8jHt7IHRpbWVPZkRheVRleHQgfX08L3ZpZXc+XHJcblx0XHRcdFx0XHRcdDx2aWV3IGNsYXNzPVwic3ViXCI+5oiR5piv6JCD5pif56eR5oqA5pm66IO95L2TPC92aWV3PlxyXG5cdFx0XHRcdFx0PC92aWV3PlxyXG5cdFx0XHRcdDwvdmlldz5cclxuXHJcblx0XHRcdFx0PCEtLSB3ZWxjb21lIHNlbnRlbmNlIC0tPlxyXG5cdFx0XHRcdDx2aWV3IGNsYXNzPVwid2VsY29tZVwiPlxyXG5cdFx0XHRcdFx05oKo5aW977yB6Z2e5bi46auY5YW05LiO5oKo5Lqk5rWB77yM5LuK5aSp5pyJ5LuA5LmI5Y+v5Lul5biu5Yiw5oKo77yfXHJcblx0XHRcdFx0PC92aWV3PlxyXG5cclxuXHRcdFx0XHQ8IS0tIHN1Z2dlc3Rpb25zIC0tPlxyXG5cdFx0XHRcdDx2aWV3IGNsYXNzPVwiZ3Vlc3MtcGFuZWxcIj5cclxuXHRcdFx0XHRcdDx2aWV3IGNsYXNzPVwiZ3Vlc3MtdGl0bGVcIj7njJzkvaDmg7Ppl648L3ZpZXc+XHJcblx0XHRcdFx0XHQ8dmlldyBjbGFzcz1cImd1ZXNzLWxpc3RcIj5cclxuXHRcdFx0XHRcdFx0PHZpZXcgY2xhc3M9XCJndWVzcy1pdGVtXCIgQHRhcD1cIm9uU3VnZ2VzdGlvblRhcCgn5LuK5pel5Ye65YWl5bqT5pWw5o2uJylcIj5cclxuXHRcdFx0XHRcdFx0XHQ8dGV4dD7ku4rml6Xlh7rlhaXlupPmlbDmja48L3RleHQ+XHJcblx0XHRcdFx0XHRcdFx0PHRleHQgY2xhc3M9XCJhcnJvd1wiPuKAujwvdGV4dD5cclxuXHRcdFx0XHRcdFx0PC92aWV3PlxyXG5cdFx0XHRcdFx0XHQ8dmlldyBjbGFzcz1cImd1ZXNzLWl0ZW1cIiBAdGFwPVwib25TdWdnZXN0aW9uVGFwKCfku4rml6XplIDllK7mlbDmja4nKVwiPlxyXG5cdFx0XHRcdFx0XHRcdDx0ZXh0PuS7iuaXpemUgOWUruaVsOaNrjwvdGV4dD5cclxuXHRcdFx0XHRcdFx0XHQ8dGV4dCBjbGFzcz1cImFycm93XCI+4oC6PC90ZXh0PlxyXG5cdFx0XHRcdFx0XHQ8L3ZpZXc+XHJcblx0XHRcdFx0XHRcdDx2aWV3IGNsYXNzPVwiZ3Vlc3MtaXRlbVwiIEB0YXA9XCJvblN1Z2dlc3Rpb25UYXAoJ+S7iuaXpeeUn+S6p+aVsOaNricpXCI+XHJcblx0XHRcdFx0XHRcdFx0PHRleHQ+5LuK5pel55Sf5Lqn5pWw5o2uPC90ZXh0PlxyXG5cdFx0XHRcdFx0XHRcdDx0ZXh0IGNsYXNzPVwiYXJyb3dcIj7igLo8L3RleHQ+XHJcblx0XHRcdFx0XHRcdDwvdmlldz5cclxuXHRcdFx0XHRcdDwvdmlldz5cclxuXHRcdFx0XHQ8L3ZpZXc+XHJcblxyXG5cdFx0XHRcdDwhLS0gY29udmVyc2F0aW9uIC0tPlxyXG5cdFx0XHRcdDx2aWV3IGNsYXNzPVwiY2hhdFwiPlxyXG5cdFx0XHRcdFx0PHZpZXcgdi1mb3I9XCJtIGluIG1lc3NhZ2VzXCIgOmtleT1cIm0uaWRcIiA6aWQ9XCInbXNnLScgKyBtLmlkXCIgOmNsYXNzPVwiWydtc2cnLCBtLnJvbGVdXCI+XHJcblx0XHRcdFx0XHRcdDx2aWV3IHYtaWY9XCJtLnJvbGUgPT09ICd1c2VyJ1wiIGNsYXNzPVwiYnViYmxlIHVzZXItYnViYmxlXCI+XHJcblx0XHRcdFx0XHRcdFx0PHRleHQgdi1pZj1cIm0uaW5wdXRUeXBlID09PSAndGV4dCdcIj57eyBtLmNvbnRlbnQgfX08L3RleHQ+XHJcblx0XHRcdFx0XHRcdFx0PHZpZXcgY2xhc3M9XCJ0ZXh0LXZvaWNlXCIgdi1lbHNlIEB0YXA9XCJwbGF5Vm9pY2UobS5pbnB1dENvbnRlbnQsbS5pZClcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZXh0Pnt7bS5kdXJhdGlvbiB9fTwvdGV4dD5cclxuXHRcdFx0XHRcdFx0XHRcdDxpbWFnZSBjbGFzcz1cInZvaWNlLXBsYXlcIiBzcmM9XCIuLi8uLi9zdGF0aWMvdm9pY2UtcGxheS5wbmdcIiBtb2RlPVwid2lkdGhGaXhcIj48L2ltYWdlPlxyXG5cdFx0XHRcdFx0XHRcdDwvdmlldz5cclxuXHJcblx0XHRcdFx0XHRcdDwvdmlldz5cclxuXHRcdFx0XHRcdFx0PHZpZXcgdi1lbHNlIGNsYXNzPVwiYnViYmxlIGFpLWJ1YmJsZVwiPlxyXG5cdFx0XHRcdFx0XHRcdDx2aWV3IHYtaWY9XCJtLnR5cGUgPT09ICdjYXJkJ1wiIGNsYXNzPVwiYWktY2FyZFwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0PHZpZXcgY2xhc3M9XCJhaS1jYXJkLXRpdGxlXCI+e3sgbS50aXRsZSB9fTwvdmlldz5cclxuXHRcdFx0XHRcdFx0XHRcdDx2aWV3IGNsYXNzPVwiYWktY2FyZC1ib2R5XCI+e3sgbS5jb250ZW50IH19PC92aWV3PlxyXG5cdFx0XHRcdFx0XHRcdDwvdmlldz5cclxuXHRcdFx0XHRcdFx0XHQ8dmlldyB2LWVsc2UtaWY9XCJtLmxvYWRpbmdcIiBjbGFzcz1cImFpLWxvYWRpbmdcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDx2aWV3IGNsYXNzPVwibG9hZGluZy1kb3RcIj48L3ZpZXc+XHJcblx0XHRcdFx0XHRcdFx0XHQ8dmlldyBjbGFzcz1cImxvYWRpbmctZG90XCI+PC92aWV3PlxyXG5cdFx0XHRcdFx0XHRcdFx0PHZpZXcgY2xhc3M9XCJsb2FkaW5nLWRvdFwiPjwvdmlldz5cclxuXHRcdFx0XHRcdFx0XHQ8L3ZpZXc+XHJcblx0XHRcdFx0XHRcdFx0PHZpZXcgdi1lbHNlPlxyXG5cdFx0XHRcdFx0XHRcdFx0PHRleHQ+e3sgbS5kaXNwbGF5VGV4dCAhPT0gdW5kZWZpbmVkID8gbS5kaXNwbGF5VGV4dCA6IG0uY29udGVudCB9fTwvdGV4dD5cclxuXHRcdFx0XHRcdFx0XHRcdDwhLS0gPHRleHQgY2xhc3M9XCJsaXN0ZW4tYnRuXCIgQHRhcD1cIm9uTGlzdGVuKG0uY29udGVudClcIj7wn5SKPC90ZXh0PiAtLT5cclxuXHRcdFx0XHRcdFx0XHQ8L3ZpZXc+XHJcblx0XHRcdFx0XHRcdDwvdmlldz5cclxuXHRcdFx0XHRcdDwvdmlldz5cclxuXHRcdFx0XHQ8L3ZpZXc+XHJcblxyXG5cdFx0XHRcdDx2aWV3IHN0eWxlPVwiaGVpZ2h0OiAxMnB4O1wiIC8+XHJcblx0XHRcdDwvc2Nyb2xsLXZpZXc+XHJcblxyXG5cdFx0XHQ8IS0tIGJvdHRvbSBkb2NrOiBxdWljayBhY3Rpb25zICsgaW5wdXQgYmFyIC0tPlxyXG5cdFx0XHQ8dmlldyBjbGFzcz1cImRvY2tcIj5cclxuXHRcdFx0XHQ8c2Nyb2xsLXZpZXcgY2xhc3M9XCJxdWljay1hY3Rpb25zIGhvcml6b250YWxcIiBzY3JvbGwteCBzaG93LXNjcm9sbGJhcj1cImZhbHNlXCI+XHJcblx0XHRcdFx0XHQ8dmlldyBjbGFzcz1cInFhLWJ0biBtaW5vclwiIEB0YXA9XCJvblN3aXRjaE1vZGVsXCI+5YiH5o2i5qih5Z6LPC92aWV3PlxyXG5cdFx0XHRcdFx0PHZpZXcgY2xhc3M9XCJxYS1idG5cIiBAdGFwPVwib25RdWlja0Fzaygn5L2g5piv6LCB77yfJylcIj7oh6rmiJHku4vnu408L3ZpZXc+XHJcblx0XHRcdFx0XHQ8dmlldyBjbGFzcz1cInFhLWJ0blwiIEB0YXA9XCJvblF1aWNrQXNrKCfku4rml6Xku7vliqHmnInlk6rkupvvvJ8nKVwiPuW/q+aNt+aPkOmXrjwvdmlldz5cclxuXHRcdFx0XHRcdDx2aWV3IGNsYXNzPVwicWEtYnRuXCIgQHRhcD1cIm9uUXVpY2tBc2soJ+WxleekuuS4gOS7veaKpeihqOekuuS+iycpXCI+5b+r5o235o+Q6ZeuPC92aWV3PlxyXG5cdFx0XHRcdFx0PHZpZXcgY2xhc3M9XCJxYS1idG5cIiBAdGFwPVwib25RdWlja0Fzaygn55Sf5oiQ5pel5oql5qih54mIJylcIj7lv6vmjbfmj5Dpl648L3ZpZXc+XHJcblx0XHRcdFx0PC9zY3JvbGwtdmlldz5cclxuXHRcdFx0XHQ8dmlldyBjbGFzcz1cImlucHV0LWJhclwiPlxyXG5cdFx0XHRcdFx0PGlucHV0IGNsYXNzPVwiaW5wdXRcIiBjb25maXJtLXR5cGU9XCJzZW5kXCIgOnZhbHVlPVwiaW5wdXRUZXh0XCIgQGlucHV0PVwib25JbnB1dFwiIEBjb25maXJtPVwib25TZW5kKClcIlxyXG5cdFx0XHRcdFx0XHRwbGFjZWhvbGRlcj1cIuS9oOWPr+S7peivtOKAplwiIHBsYWNlaG9sZGVyLWNsYXNzPVwicGhcIiAvPlxyXG5cdFx0XHRcdFx0PHZpZXcgOmNsYXNzPVwiWydtaWMnLCB7IHJlY29yZGluZzogaXNSZWNvcmRpbmcgfV1cIiBAdG91Y2hzdGFydC5zdG9wPVwib25QcmVzc01pY1wiXHJcblx0XHRcdFx0XHRcdEB0b3VjaG1vdmUuc3RvcD1cIm9uTW92ZU1pY1wiIEB0b3VjaGVuZC5zdG9wPVwib25SZWxlYXNlTWljXCI+8J+Ome+4jzwvdmlldz5cclxuXHRcdFx0XHRcdDxidXR0b24gY2xhc3M9XCJzZW5kXCIgdHlwZT1cInByaW1hcnlcIiBAdGFwPVwib25TZW5kXCI+5Y+R6YCBPC9idXR0b24+XHJcblx0XHRcdFx0PC92aWV3PlxyXG5cdFx0XHQ8L3ZpZXc+XHJcblxyXG5cdFx0XHQ8IS0tIGxlZnQgZHJhd2VyIC0tPuOAgVxyXG5cdFx0XHQ8dW5pLXBvcHVwIHJlZj1cInBvcHVwXCIgYmFja2dyb3VuZC1jb2xvcj1cIiNmZmZcIiB0eXBlPVwibGVmdFwiIDp6LWluZGV4PVwiMTAwOTBcIiBAY2hhbmdlPVwib25Qb3B1cENoYW5nZVwiIHN0eWxlPVwiei1pbmRleDogOTk5OTk7d2lkdGg6IDEwMHZ3XCIgPlxyXG5cdFx0XHRcdDx2aWV3IGNsYXNzPVwiZHJhd2VyLW1hc2tcIj5cclxuXHRcdFx0XHRcdDx2aWV3IGNsYXNzPVwiZHJhd2VyXCI+XHJcblx0XHRcdFx0XHRcdDxzY3JvbGwtdmlldyBjbGFzcz1cImRyYXdlci1zY3JvbGxcIiBzY3JvbGwteSBzaG93LXNjcm9sbGJhcj1cImZhbHNlXCI+XHJcblx0XHRcdFx0XHRcdFx0PHZpZXcgdi1mb3I9XCJnIGluIGhpc3RvcnlHcm91cHNcIiA6a2V5PVwiZy5kYXRlXCIgY2xhc3M9XCJkcmF3ZXItZ3JvdXBcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDx2aWV3IGNsYXNzPVwiZHJhd2VyLWRhdGVcIj57eyBnLmRhdGUgfX08L3ZpZXc+XHJcblx0XHRcdFx0XHRcdFx0XHQ8dmlldyB2LWZvcj1cIih0LCBpZHgpIGluIGcuaXRlbXNcIiA6a2V5PVwiaWR4XCIgY2xhc3M9XCJkcmF3ZXItaXRlbVwiIEB0YXA9XCJvbkhpc3RvcnlJdGVtVGFwKHQpXCIgQGxvbmdwcmVzcz1cIm9uTG9uZ1ByZXNzSGlzdG9yeSh0KVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHR7eyB0IH19XHJcblx0XHRcdFx0XHRcdFx0XHQ8L3ZpZXc+XHJcblx0XHRcdFx0XHRcdFx0XHQ8dmlldyBjbGFzcz1cImRyYXdlci1kaXZpZGVyXCIgLz5cclxuXHRcdFx0XHRcdFx0XHQ8L3ZpZXc+XHJcblx0XHRcdFx0XHRcdDwvc2Nyb2xsLXZpZXc+XHJcblx0XHRcdFx0XHRcdDx2aWV3IGNsYXNzPVwiZHJhd2VyLWZvb3RlclwiPlxyXG5cdFx0XHRcdFx0XHRcdDx2aWV3IGNsYXNzPVwidXNlci1pY29uXCI+8J+RpDwvdmlldz5cclxuXHRcdFx0XHRcdFx0XHQ8dGV4dCBjbGFzcz1cInVzZXItbmFtZVwiPueUqOaIt+WQjTwvdGV4dD5cclxuXHRcdFx0XHRcdFx0XHQ8dmlldyBjbGFzcz1cImZvb3Rlci1nZWFyXCIgQHRhcD1cImNsZWFyQWxsSGlzdG9yeVwiPuKame+4jzwvdmlldz5cclxuXHRcdFx0XHRcdFx0PC92aWV3PlxyXG5cdFx0XHRcdFx0PC92aWV3PlxyXG5cdFx0XHRcdDwvdmlldz5cclxuXHRcdFx0PC91bmktcG9wdXA+XHJcblxyXG5cdFx0XHQ8IS0tIFZvaWNlIHJlY29yZGluZyBvdmVybGF5IC0tPlxyXG5cdFx0XHQ8dmlldyB2LWlmPVwiaXNSZWNvcmRpbmdcIiBjbGFzcz1cInJlY29yZC1tYXNrXCI+XHJcblx0XHRcdFx0PHZpZXcgY2xhc3M9XCJyZWNvcmQtYm94XCIgOmNsYXNzPVwieyBjYW5jZWw6IHdpbGxDYW5jZWwgfVwiPlxyXG5cdFx0XHRcdFx0PHZpZXcgY2xhc3M9XCJyZWNvcmQtaWNvblwiPvCfjpnvuI88L3ZpZXc+XHJcblx0XHRcdFx0XHQ8dmlldyBjbGFzcz1cInJlY29yZC10ZXh0XCI+e3sgd2lsbENhbmNlbCA/ICfmnb7lvIDmiYvmjIfvvIzlj5bmtojlj5HpgIEnIDogJ+aJi+aMh+S4iua7ke+8jOWPlua2iOWPkemAgScgfX08L3ZpZXc+XHJcblx0XHRcdFx0PC92aWV3PlxyXG5cdFx0XHQ8L3ZpZXc+XHJcblx0XHRcdFxyXG5cdFx0XHQ8dmlldyB2LWlmPVwiaXNSZWNvcmRpbmdcIiBjbGFzcz1cIm1hc2stbGF5ZXJcIiBAdG91Y2htb3ZlLnN0b3AucHJldmVudD5cclxuXHRcdFx0XHRcclxuXHRcdFx0PC92aWV3PlxyXG5cclxuXHRcdDwvdmlldz5cclxuXHQ8L3RlbXBsYXRlPlxyXG5cclxuXHQ8c2NyaXB0PlxyXG5cdFx0Y29uc3QgSElTVE9SWV9LRVkgPSAnY2hhdF9oaXN0b3J5X2dyb3VwcydcclxuXHRcdGV4cG9ydCBkZWZhdWx0IHtcclxuXHRcdFx0ZGF0YSgpIHtcclxuXHRcdFx0XHRyZXR1cm4ge1xyXG5cdFx0XHRcdFx0aW5wdXRUZXh0OiAnJyxcclxuXHRcdFx0XHRcdG1lc3NhZ2VzOiBbXHJcblx0XHRcdFx0XHRcdC8vIHtcclxuXHRcdFx0XHRcdFx0Ly8gXHRpZDogMSxcclxuXHRcdFx0XHRcdFx0Ly8gXHRyb2xlOiAndXNlcicsXHJcblx0XHRcdFx0XHRcdC8vIFx0dHlwZTogJ3RleHQnLFxyXG5cdFx0XHRcdFx0XHQvLyBcdGNvbnRlbnQ6ICfluK7miJHnu5/orqHkuIDkuIvku4rml6XnmoTplIDllK7mlbDmja4nLFxyXG5cdFx0XHRcdFx0XHQvLyBcdGlucHV0VHlwZTogJ3RleHQnXHJcblx0XHRcdFx0XHRcdC8vIH0sXHJcblx0XHRcdFx0XHRcdC8vIHtcclxuXHRcdFx0XHRcdFx0Ly8gXHRpZDogMixcclxuXHRcdFx0XHRcdFx0Ly8gXHRyb2xlOiAnYXNzaXN0YW50JyxcclxuXHRcdFx0XHRcdFx0Ly8gXHR0eXBlOiAnY2FyZCcsXHJcblx0XHRcdFx0XHRcdC8vIFx0dGl0bGU6ICfku4rml6XplIDllK7mlbDmja7nu5/orqHnu5PmnpzlpoLkuIvvvJonLFxyXG5cdFx0XHRcdFx0XHQvLyBcdGNvbnRlbnQ6ICflhoXlrrnlhoXlrrkuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4nXHJcblx0XHRcdFx0XHRcdC8vIH1cclxuXHRcdFx0XHRcdF0sXHJcblx0XHRcdFx0XHRzY3JvbGxJbnRvOiAnJyxcclxuXHRcdFx0XHRcdGRyYXdlck9wZW46IGZhbHNlLFxyXG5cdFx0XHRcdFx0aGlzdG9yeUdyb3VwczogW1xyXG5cdFx0XHRcdFx0XSxcclxuXHRcdFx0XHRcdGlzUmVjb3JkaW5nOiBmYWxzZSxcclxuXHRcdFx0XHRcdGlzTG9hZGluZzpmYWxzZSxcclxuXHRcdFx0XHRcdHdpbGxDYW5jZWw6IGZhbHNlLFxyXG5cdFx0XHRcdFx0cmVjb3JkZXI6IG51bGwsXHJcblx0XHRcdFx0XHRyZWNvcmRTdGFydFk6IDAsXHJcblx0XHRcdFx0XHRyZWNvcmRTdGFydFRzOiAwLFxyXG5cdFx0XHRcdFx0cmVjb3JkU2ltVGltZXI6IG51bGwsXHJcblx0XHRcdFx0XHQvLyBzaG93OiBmYWxzZSxcclxuXHRcdFx0XHRcdGlubmVyQXVkaW9Db250ZXh0OiBudWxsLFxyXG5cdFx0XHRcdFx0cG9wdXBWaXNpYmxlOiBmYWxzZSxcclxuXHRcdFx0XHRcdHR5cGV3cml0ZXJUaW1lcnM6IHt9LFxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSxcclxuXHRcdFx0Y29tcHV0ZWQ6IHtcclxuXHRcdFx0XHR0aW1lT2ZEYXlUZXh0KCkge1xyXG5cdFx0XHRcdFx0Y29uc3QgaCA9IG5ldyBEYXRlKCkuZ2V0SG91cnMoKVxyXG5cdFx0XHRcdFx0aWYgKGggPCA2KSByZXR1cm4gJ+WHjOaZqOWlvSdcclxuXHRcdFx0XHRcdGlmIChoIDwgMTIpIHJldHVybiAn5LiK5Y2I5aW9J1xyXG5cdFx0XHRcdFx0aWYgKGggPCAxOCkgcmV0dXJuICfkuIvljYjlpb0nXHJcblx0XHRcdFx0XHRyZXR1cm4gJ+aZmuS4iuWlvSdcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0sXHJcblx0XHRcdG1vdW50ZWQoKSB7XHJcblx0XHRcdFx0dGhpcy5sb2FkQ2hhdEhpc3RvcnkoKVxyXG5cdFx0XHRcdHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcclxuXHRcdFx0fSxcclxuXHRcdFx0YmVmb3JlRGVzdHJveSgpIHtcclxuXHRcdFx0XHQvLyDmuIXnkIbmiYDmnInmiZPlrZfmnLrlrprml7blmahcclxuXHRcdFx0XHRPYmplY3QudmFsdWVzKHRoaXMudHlwZXdyaXRlclRpbWVycykuZm9yRWFjaCh0aW1lciA9PiB7XHJcblx0XHRcdFx0XHRpZiAodGltZXIpIGNsZWFySW50ZXJ2YWwodGltZXIpXHJcblx0XHRcdFx0fSlcclxuXHRcdFx0XHR0aGlzLnR5cGV3cml0ZXJUaW1lcnMgPSB7fVxyXG5cdFx0XHRcdC8vIOa4heeQhuW9lemfs+WumuaXtuWZqFxyXG5cdFx0XHRcdGlmICh0aGlzLnJlY29yZFNpbVRpbWVyKSB7XHJcblx0XHRcdFx0XHRjbGVhclRpbWVvdXQodGhpcy5yZWNvcmRTaW1UaW1lcilcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0sXHJcblx0XHRcdG1ldGhvZHM6IHtcclxuXHRcdFx0XHQvLyDmlrDlop7mlrnms5XvvJrkuIrkvKDpn7PpopHlubbor4bliKtcclxuXHRcdFx0YXN5bmMgcmVjb2duaXplQXVkaW8odGVtcEZpbGVQYXRoKSB7XHJcblx0XHRcdCAgdHJ5IHtcclxuXHRcdFx0XHRjb25zb2xlLmxvZygn5byA5aeL6K+t6Z+z6K+G5Yir77yM5paH5Lu26Lev5b6EOicsIHRlbXBGaWxlUGF0aClcclxuXHRcdFx0XHRcclxuXHRcdFx0XHQvLyDojrflj5bmlofku7bkv6Hmga9cclxuXHRcdFx0XHRjb25zdCBmaWxlSW5mbyA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuXHRcdFx0XHQgIHVuaS5nZXRGaWxlSW5mbyh7XHJcblx0XHRcdFx0XHRmaWxlUGF0aDogdGVtcEZpbGVQYXRoLFxyXG5cdFx0XHRcdFx0c3VjY2VzczogcmVzb2x2ZSxcclxuXHRcdFx0XHRcdGZhaWw6IHJlamVjdFxyXG5cdFx0XHRcdCAgfSlcclxuXHRcdFx0XHR9KVxyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdGNvbnNvbGUubG9nKCfmlofku7blpKflsI86JywgZmlsZUluZm8uc2l6ZSlcclxuXHRcdFx0XHRcclxuXHRcdFx0XHQvLyDkvb/nlKggVW5pQXBwIOeahOS4iuS8oOaWh+S7tiBBUElcclxuXHRcdFx0XHRjb25zdCB1cGxvYWRSZXMgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblx0XHRcdFx0ICB1bmkudXBsb2FkRmlsZSh7XHJcblx0XHRcdFx0XHQvLyB1cmw6ICdodHRwOi8vMTkyLjE2OC4xMzMuODM6ODAwMC9yZWNvZ25pemVfc3BlZWNoJyxcclxuXHRcdFx0XHRcdHVybDogJ2h0dHA6Ly8xOTIuMTY4LjEwLjQ0OjgwMDAvcmVjb2duaXplX3NwZWVjaCcsXHJcblx0XHRcdFx0XHRmaWxlUGF0aDogdGVtcEZpbGVQYXRoLFxyXG5cdFx0XHRcdFx0bmFtZTogJ3NwZWVjaCcsIC8vIOWvueW6lOWQjuerr+eahCBVcGxvYWRGaWxlIOWPguaVsOWQjVxyXG5cdFx0XHRcdFx0Zm9ybURhdGE6IHtcclxuXHRcdFx0XHRcdCAgJ2Zvcm1hdCc6ICdhbXInLFxyXG5cdFx0XHRcdFx0ICAncmF0ZSc6IDE2MDAwLFxyXG5cdFx0XHRcdFx0ICAnY2hhbm5lbCc6IDEsXHJcblx0XHRcdFx0XHQgICdjdWlkJzogJ3VuaWFwcF91c2VyJyxcclxuXHRcdFx0XHRcdCAgJ2F1ZGlvX2xlbic6IGZpbGVJbmZvLnNpemVcclxuXHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHRzdWNjZXNzOiAocmVzKSA9PiB7XHJcblx0XHRcdFx0XHQgIGNvbnNvbGUubG9nKCfkuIrkvKDlk43lupQ6JywgcmVzKVxyXG5cdFx0XHRcdFx0ICBpZiAocmVzLnN0YXR1c0NvZGUgPT09IDIwMCkge1xyXG5cdFx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHQgIC8vIOWwneivleino+aekOi/lOWbnueahCBKU09OIOaVsOaNrlxyXG5cdFx0XHRcdFx0XHQgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHJlcy5kYXRhKVxyXG5cdFx0XHRcdFx0XHQgIHJlc29sdmUoeyBzdGF0dXNDb2RlOiAyMDAsIGRhdGEgfSlcclxuXHRcdFx0XHRcdFx0fSBjYXRjaCAoZSkge1xyXG5cdFx0XHRcdFx0XHQgIHJlamVjdChuZXcgRXJyb3IoJ+WTjeW6lOino+aekOWksei0pTogJyArIGUubWVzc2FnZSkpXHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdCAgfSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0cmVqZWN0KG5ldyBFcnJvcihg5LiK5Lyg5aSx6LSlOiAke3Jlcy5zdGF0dXNDb2RlfWApKVxyXG5cdFx0XHRcdFx0ICB9XHJcblx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0ZmFpbDogKGVycikgPT4ge1xyXG5cdFx0XHRcdFx0ICByZWplY3QobmV3IEVycm9yKCfkuIrkvKDor7fmsYLlpLHotKU6ICcgKyBlcnIuZXJyTXNnKSlcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHQgIH0pXHJcblx0XHRcdFx0fSlcclxuXHRcdFx0XHJcblx0XHRcdFx0Y29uc29sZS5sb2coJ+ivremfs+ivhuWIq+WTjeW6lDonLCB1cGxvYWRSZXMpXHJcblx0XHRcdFxyXG5cdFx0XHRcdGNvbnN0IHJlc3VsdCA9IHVwbG9hZFJlcy5kYXRhXHJcblx0XHRcdFx0aWYgKHJlc3VsdC5zdGF0dXMgPT09ICdzdWNjZXNzJykge1xyXG5cdFx0XHRcdCAgcmV0dXJuIHJlc3VsdC5yZXN1bHRcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdCAgdGhyb3cgbmV3IEVycm9yKHJlc3VsdC5lcnJvciB8fCAn6K+G5Yir5aSx6LSlJylcclxuXHRcdFx0XHR9XHJcblx0XHRcdCAgfSBjYXRjaCAoZXJyb3IpIHtcclxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCfor63pn7Por4bliKvplJnor686JywgZXJyb3IpXHJcblx0XHRcdFx0dW5pLnNob3dUb2FzdCh7XHJcblx0XHRcdFx0ICB0aXRsZTogJ+ivhuWIq+Wksei0pTogJyArIChlcnJvci5tZXNzYWdlIHx8ICfnvZHnu5zplJnor68nKSxcclxuXHRcdFx0XHQgIGljb246ICdub25lJ1xyXG5cdFx0XHRcdH0pXHJcblx0XHRcdFx0cmV0dXJuIG51bGxcclxuXHRcdFx0ICB9XHJcblx0XHRcdH0sXHJcblx0XHRcdFx0Ly8gPT09PT09PT09PT09PT09PT09PT0g5Y6G5Y+y6K6w5b2V566h55CGID09PT09PT09PT09PT09PT09PT09XHJcblx0XHRcdFx0XHRmb3JtYXREYXRlKGRhdGUpIHtcclxuXHRcdFx0XHRcdCAgY29uc3QgeSA9IGRhdGUuZ2V0RnVsbFllYXIoKVxyXG5cdFx0XHRcdFx0ICBjb25zdCBtID0gU3RyaW5nKGRhdGUuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJylcclxuXHRcdFx0XHRcdCAgY29uc3QgZCA9IFN0cmluZyhkYXRlLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKVxyXG5cdFx0XHRcdFx0ICByZXR1cm4gYCR7eX3lubQke2195pyIJHtkfeaXpWBcclxuXHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHRsb2FkQ2hhdEhpc3RvcnkoKSB7XHJcblx0XHRcdFx0XHRcdCAgdHJ5IHtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBkYXRhID0gdW5pLmdldFN0b3JhZ2VTeW5jKEhJU1RPUllfS0VZKVxyXG5cdFx0XHRcdFx0XHRcdGlmIChkYXRhICYmIEFycmF5LmlzQXJyYXkoZGF0YS5ncm91cHMpKSB7XHJcblx0XHRcdFx0XHRcdFx0ICB0aGlzLmhpc3RvcnlHcm91cHMgPSBkYXRhLmdyb3Vwc1xyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0ICB0aGlzLmhpc3RvcnlHcm91cHMgPSBbXVxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0ICB9IGNhdGNoIChlKSB7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5oaXN0b3J5R3JvdXBzID0gW11cclxuXHRcdFx0XHRcdFx0ICB9XHJcblx0XHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHRhZGRUb0hpc3RvcnkodGV4dCkge1xyXG5cdFx0XHRcdFx0XHQgIGxldCBncm91cHMgPSB1bmkuZ2V0U3RvcmFnZVN5bmMoSElTVE9SWV9LRVkpPy5ncm91cHMgfHwgW11cclxuXHRcdFx0XHRcdFx0ICBjb25zdCB0b2RheSA9IHRoaXMuZm9ybWF0RGF0ZShuZXcgRGF0ZSgpKVxyXG5cdFx0XHRcdFx0XHQgIGxldCB0b2RheUdyb3VwID0gZ3JvdXBzLmZpbmQoZyA9PiBnLmRhdGUgPT09IHRvZGF5KVxyXG5cdFx0XHRcdFx0XHJcblx0XHRcdFx0XHRcdCAgaWYgKCF0b2RheUdyb3VwKSB7XHJcblx0XHRcdFx0XHRcdFx0dG9kYXlHcm91cCA9IHsgZGF0ZTogdG9kYXksIGl0ZW1zOiBbXSB9XHJcblx0XHRcdFx0XHRcdFx0Z3JvdXBzLnVuc2hpZnQodG9kYXlHcm91cClcclxuXHRcdFx0XHRcdFx0ICB9XHJcblx0XHRcdFx0XHRcclxuXHRcdFx0XHRcdFx0ICBpZiAoIXRvZGF5R3JvdXAuaXRlbXMuaW5jbHVkZXModGV4dCkpIHtcclxuXHRcdFx0XHRcdFx0XHR0b2RheUdyb3VwLml0ZW1zLnVuc2hpZnQodGV4dClcclxuXHRcdFx0XHRcdFx0ICB9XHJcblx0XHRcdFx0XHRcclxuXHRcdFx0XHRcdFx0ICAvLyDpmZDliLblpKflsI9cclxuXHRcdFx0XHRcdFx0ICBpZiAodG9kYXlHcm91cC5pdGVtcy5sZW5ndGggPiA1MCkgdG9kYXlHcm91cC5pdGVtcyA9IHRvZGF5R3JvdXAuaXRlbXMuc2xpY2UoMCwgNTApXHJcblx0XHRcdFx0XHRcdCAgaWYgKGdyb3Vwcy5sZW5ndGggPiAzMCkgZ3JvdXBzID0gZ3JvdXBzLnNsaWNlKDAsIDMwKVxyXG5cdFx0XHRcdFx0XHJcblx0XHRcdFx0XHRcdCAgdGhpcy5oaXN0b3J5R3JvdXBzID0gZ3JvdXBzXHJcblx0XHRcdFx0XHRcdCAgdW5pLnNldFN0b3JhZ2VTeW5jKEhJU1RPUllfS0VZLCB7IGdyb3VwcywgdXBkYXRlZEF0OiBEYXRlLm5vdygpIH0pXHJcblx0XHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHRcdFx0XHJcblx0XHRcdFx0XHRcdHJlbW92ZUZyb21IaXN0b3J5KHRleHQpIHtcclxuXHRcdFx0XHRcdFx0XHQgIGxldCBncm91cHMgPSB1bmkuZ2V0U3RvcmFnZVN5bmMoSElTVE9SWV9LRVkpPy5ncm91cHMgfHwgW11cclxuXHRcdFx0XHRcdFx0XHQgIGdyb3Vwcy5mb3JFYWNoKGdyb3VwID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdGdyb3VwLml0ZW1zID0gZ3JvdXAuaXRlbXMuZmlsdGVyKGl0ZW0gPT4gaXRlbSAhPT0gdGV4dClcclxuXHRcdFx0XHRcdFx0XHQgIH0pXHJcblx0XHRcdFx0XHRcdFx0ICBncm91cHMgPSBncm91cHMuZmlsdGVyKGcgPT4gZy5pdGVtcy5sZW5ndGggPiAwKVxyXG5cdFx0XHRcdFx0XHRcdCAgdGhpcy5oaXN0b3J5R3JvdXBzID0gZ3JvdXBzXHJcblx0XHRcdFx0XHRcdFx0ICB1bmkuc2V0U3RvcmFnZVN5bmMoSElTVE9SWV9LRVksIHsgZ3JvdXBzLCB1cGRhdGVkQXQ6IERhdGUubm93KCkgfSlcclxuXHRcdFx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0XHRcdFxyXG5cdFx0XHRcdFx0XHRjbGVhckFsbEhpc3RvcnkoKSB7XHJcblx0XHRcdFx0XHRcdFx0ICB1bmkuc2hvd01vZGFsKHtcclxuXHRcdFx0XHRcdFx0XHRcdHRpdGxlOiAn5riF6Zmk5YWo6YOoJyxcclxuXHRcdFx0XHRcdFx0XHRcdGNvbnRlbnQ6ICflsIbliKDpmaTmiYDmnInlr7nor53orrDlvZXvvIzmraTmk43kvZzkuI3lj6/mgaLlpI0nLFxyXG5cdFx0XHRcdFx0XHRcdFx0c3VjY2VzczogKHJlcykgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdFx0ICBpZiAocmVzLmNvbmZpcm0pIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0dW5pLnJlbW92ZVN0b3JhZ2VTeW5jKEhJU1RPUllfS0VZKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLmhpc3RvcnlHcm91cHMgPSBbXVxyXG5cdFx0XHRcdFx0XHRcdFx0XHR1bmkuc2hvd1RvYXN0KHsgdGl0bGU6ICflt7LmuIXpmaQnLCBpY29uOiAnc3VjY2VzcycgfSlcclxuXHRcdFx0XHRcdFx0XHRcdCAgfVxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdCAgfSlcclxuXHRcdFx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0XHRvbkxvbmdQcmVzc0hpc3RvcnkodGV4dCkge1xyXG5cdFx0XHRcdFx0XHRcdCAgdW5pLnNob3dNb2RhbCh7XHJcblx0XHRcdFx0XHRcdFx0XHR0aXRsZTogJ+WIoOmZpOiusOW9lScsXHJcblx0XHRcdFx0XHRcdFx0XHRjb250ZW50OiAn56Gu5a6a5Yig6Zmk6L+Z5p2h5a+56K+d6K6w5b2V77yfJyxcclxuXHRcdFx0XHRcdFx0XHRcdHN1Y2Nlc3M6IChyZXMpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdCAgaWYgKHJlcy5jb25maXJtKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMucmVtb3ZlRnJvbUhpc3RvcnkodGV4dClcclxuXHRcdFx0XHRcdFx0XHRcdCAgfVxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdCAgfSlcclxuXHRcdFx0XHRcdFx0XHR9LFx0XHRcclxuXHRcdFx0XHRcdC8vIOW3peWFt1xyXG5cdFx0XHRcdFx0XHRyZW1vdmVNZXNzYWdlKGlkKSB7XHJcblx0XHRcdFx0XHRcdCAgY29uc3QgaWR4ID0gdGhpcy5tZXNzYWdlcy5maW5kSW5kZXgobSA9PiBtLmlkID09PSBpZClcclxuXHRcdFx0XHRcdFx0ICBpZiAoaWR4ID4gLTEpIHRoaXMubWVzc2FnZXMuc3BsaWNlKGlkeCwgMSlcclxuXHRcdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdFx0YWRkQXNzaXN0YW50TWVzc2FnZShpZCwgY29udGVudCkge1xyXG5cdFx0XHRcdFx0XHRcdCAgdGhpcy5tZXNzYWdlcy5wdXNoKHsgaWQsIHJvbGU6ICdhc3Npc3RhbnQnLCB0eXBlOiAndGV4dCcsIGNvbnRlbnQsIGRpc3BsYXlUZXh0OiAnJyB9KVxyXG5cdFx0XHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHRcdFx0XHRcclxuXHRcdFx0XHRhc3luYyBnZXRBSVJlc3BvbnNlKG1lc3NhZ2Upe1xyXG5cdFx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdFx0XHQvLyBjb25zdCB1cmwgPSAnaHR0cDovLzE5Mi4xNjguMTMzLjgzOjkwMjAvYXBpL2NoYXQnXHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgdXJsID0gJ2h0dHA6Ly8xOTIuMTY4LjEwLjQ0OjkwMjAvYXBpL2NoYXQnXHJcblx0XHRcdFx0XHRcdFx0Ly8gY29uc3QgdXJsID0gJ2h0dHA6Ly8xMDYuMjI3LjkxLjE4MTo5MDIwL2FwaS9jaGF0JyAgLy8g5aaC6ZyA5YiH5o2i57q/5LiK77yM5pS56L+Z6YeM5Y2z5Y+vXHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgaGVhZGVycyA9IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9XHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgZGF0YSA9IHsgbWVzc2FnZSB9XHJcblx0XHRcdFx0XHRcdFx0XHJcblx0XHRcdFx0XHRcdFx0Y29uc29sZS5sb2coZGF0YSlcclxuXHRcdFx0XHRcdFx0XHRcclxuXHRcdFx0XHRcdCAgLy8gICAgICAgY29uc3QgW2Vycm9yLCByZXNdID0gYXdhaXQgdW5pLnJlcXVlc3Qoe1xyXG5cdFx0XHRcdFx0ICAvLyAgICAgICAgIHVybCxcclxuXHRcdFx0XHRcdCAgLy8gICAgICAgICBtZXRob2Q6ICdQT1NUJyxcclxuXHRcdFx0XHRcdCAgLy8gICAgICAgICBoZWFkZXI6IGhlYWRlcnMsXHJcblx0XHRcdFx0XHQgIC8vICAgICAgICAgZGF0YVxyXG5cdFx0XHRcdFx0ICAvLyAgICAgICB9KVxyXG5cdFx0XHRcdFx0XHRcdFxyXG5cdFx0XHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKHJlcylcclxuXHRcdFx0XHRcdFx0XHQvLyDkvb/nlKggUHJvbWlzZSDpo47moLxcclxuXHRcdFx0XHRcdFx0XHRjb25zdCByZXMgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0ICB1bmkucmVxdWVzdCh7XHJcblx0XHRcdFx0XHRcdFx0XHR1cmwsXHJcblx0XHRcdFx0XHRcdFx0XHRtZXRob2Q6ICdQT1NUJyxcclxuXHRcdFx0XHRcdFx0XHRcdGhlYWRlcjogaGVhZGVycyxcclxuXHRcdFx0XHRcdFx0XHRcdGRhdGEsXHJcblx0XHRcdFx0XHRcdFx0XHRzdWNjZXNzOiAocmVzKSA9PiByZXNvbHZlKHJlcyksXHJcblx0XHRcdFx0XHRcdFx0XHRmYWlsOiAoZXJyKSA9PiByZWplY3QoZXJyKVxyXG5cdFx0XHRcdFx0XHRcdCAgfSlcclxuXHRcdFx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdFx0XHRcclxuXHRcdFx0XHRcdFx0XHRjb25zb2xlLmxvZygn6K+35rGC5ZON5bqUOicsIHJlcylcclxuXHRcdFx0XHRcdFxyXG5cdFx0XHRcdFx0XHRcdGlmIChyZXMuc3RhdHVzQ29kZSAhPT0gMjAwKSB7XHJcblx0XHRcdFx0XHRcdFx0XHQgIHRocm93IG5ldyBFcnJvcihgSFRUUOmUmeivryEg54q25oCB56CBOiAke3Jlcy5zdGF0dXNDb2RlfWApXHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHJcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gcmVzLmRhdGE/LnJlc3VsdD8uZGF0YSB8fCAn5pyq6I635Y+W5Yiw5pyJ5pWI5Zue5aSNJ1xyXG5cdFx0XHRcdFx0XHRcdFxyXG5cdFx0XHRcdFx0XHRcdCAgfSBjYXRjaCAoZXJyb3IpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoJ0FJ6K+35rGC6ZSZ6K+vOicsIGVycm9yKVxyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGDmirHmrYnvvIzlh7rkuobngrnpl67popg6ICR7ZXJyb3IuZXJyTXNnIHx8IGVycm9yLm1lc3NhZ2V9YFxyXG5cdFx0XHRcdFx0XHRcdCAgfVxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0XHJcblx0XHRcdFx0cGxheVZvaWNlKHZvaWNlUGF0aCkge1xyXG5cdFx0XHRcdFx0aWYgKCF2b2ljZVBhdGgpIHtcclxuXHRcdFx0XHRcdFx0dW5pLnNob3dUb2FzdCh7IHRpdGxlOiAn5peg5Y+v5pKt5pS+55qE6K+t6Z+zJywgaWNvbjogJ25vbmUnIH0pXHJcblx0XHRcdFx0XHRcdHJldHVyblxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYgKCF0aGlzLmlubmVyQXVkaW9Db250ZXh0KSB7XHJcblx0XHRcdFx0XHRcdHRoaXMuaW5uZXJBdWRpb0NvbnRleHQgPSB1bmkuY3JlYXRlSW5uZXJBdWRpb0NvbnRleHQoKVxyXG5cdFx0XHRcdFx0XHR0aGlzLmlubmVyQXVkaW9Db250ZXh0LmF1dG9wbGF5ID0gZmFsc2VcclxuXHRcdFx0XHRcdFx0dGhpcy5pbm5lckF1ZGlvQ29udGV4dC5vbkVycm9yKCgpID0+IHtcclxuXHRcdFx0XHRcdFx0XHR1bmkuc2hvd1RvYXN0KHsgdGl0bGU6ICfmkq3mlL7lpLHotKUnLCBpY29uOiAnbm9uZScgfSlcclxuXHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR0cnkgeyB0aGlzLmlubmVyQXVkaW9Db250ZXh0LnN0b3AoKSB9IGNhdGNoKGUpIHt9XHJcblx0XHRcdFx0XHRjb25zb2xlLmxvZyh2b2ljZVBhdGgpXHJcblx0XHRcdFx0XHR0aGlzLmlubmVyQXVkaW9Db250ZXh0LnNyYyA9IHZvaWNlUGF0aFxyXG5cdFx0XHRcdFx0dGhpcy5pbm5lckF1ZGlvQ29udGV4dC5wbGF5KClcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdG9uU2V0dGluZ1RhcCgpIHtcclxuXHRcdFx0XHRcdHVuaS5uYXZpZ2F0ZVRvKHtcclxuXHRcdFx0XHRcdFx0dXJsOiAnL3BhZ2VzL3NldHRpbmcvaW5kZXgnXHJcblx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0b25TdWdnZXN0aW9uVGFwKHRleHQpIHtcclxuXHRcdFx0XHRcdHRoaXMuaW5wdXRUZXh0ID0gdGV4dFxyXG5cdFx0XHRcdFx0dGhpcy5vblNlbmQoKTtcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdG9uUXVpY2tBc2sodGV4dCkge1xyXG5cdFx0XHRcdFx0dGhpcy5pbnB1dFRleHQgPSB0ZXh0XHJcblx0XHRcdFx0XHR0aGlzLm9uU2VuZCgpXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRvblN3aXRjaE1vZGVsKCkge1xyXG5cdFx0XHRcdFx0dW5pLnNob3dUb2FzdCh7XHJcblx0XHRcdFx0XHRcdHRpdGxlOiAn5bey5YiH5o2i5Li66YCa55So5qih5Z6LJyxcclxuXHRcdFx0XHRcdFx0aWNvbjogJ25vbmUnXHJcblx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0b25JbnB1dChlKSB7XHJcblx0XHRcdFx0XHR0aGlzLmlucHV0VGV4dCA9IGUuZGV0YWlsLnZhbHVlXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRvcGVuRHJhd2VyKCkge1xyXG5cdFx0XHRcdFx0dGhpcy4kcmVmcy5wb3B1cC5vcGVuKClcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdG9uUG9wdXBDaGFuZ2UoZSl7XHJcblx0XHRcdFx0XHQvLyBlLnNob3c6IHRydWUgd2hlbiBvcGVuZWQsIGZhbHNlIHdoZW4gY2xvc2VkXHJcblx0XHRcdFx0XHR0aGlzLnBvcHVwVmlzaWJsZSA9ICEhKGUgJiYgKGUuc2hvdyA9PT0gdHJ1ZSkpXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHQvLyA9PT09PSBWb2ljZSBpbnB1dCAoV2VDaGF0LWxpa2UpID09PT09XHJcblx0XHRcdFx0ZW5zdXJlUmVjb3JkZXIoKSB7XHJcblx0XHRcdFx0XHRpZiAodGhpcy5yZWNvcmRlcikgcmV0dXJuXHJcblx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLnJlY29yZGVyID0gdW5pLmdldFJlY29yZGVyTWFuYWdlciAmJiB1bmkuZ2V0UmVjb3JkZXJNYW5hZ2VyKClcclxuXHRcdFx0XHRcdH0gY2F0Y2ggKGUpIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5yZWNvcmRlciA9IG51bGxcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGlmICh0aGlzLnJlY29yZGVyKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMucmVjb3JkZXIub25TdGFydCgpXHJcblx0XHRcdFx0XHRcdHRoaXMucmVjb3JkZXIub25TdG9wKCBhc3luYyhyZXMpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBkdXJhdGlvbiA9IERhdGUubm93KCkgLSB0aGlzLnJlY29yZFN0YXJ0VHM7XHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgdGVtcEZpbGVQYXRoID0gcmVzLnRlbXBGaWxlUGF0aDsgLy8g5re75Yqg6L+Z6KGM77yM5LuOcmVz5Lit6I635Y+W5paH5Lu26Lev5b6EXHJcblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMud2lsbENhbmNlbCB8fCBkdXJhdGlvbiA8IDcwMCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0dW5pLnNob3dUb2FzdCh7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHRpdGxlOiBkdXJhdGlvbiA8IDcwMCA/ICfor7Tor53ml7bpl7TlpKrnn60nIDogJ+W3suWPlua2iCcsXHJcblx0XHRcdFx0XHRcdFx0XHRcdGljb246ICdub25lJ1xyXG5cdFx0XHRcdFx0XHRcdFx0fSlcclxuXHRcdFx0XHRcdFx0XHRcdHJldHVyblxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHQvLyDmmL7npLrliqDovb1cclxuXHRcdFx0XHRcdFx0XHR1bmkuc2hvd0xvYWRpbmcoeyB0aXRsZTogJ+ivhuWIq+S4rS4uLicgfSk7XHJcblx0XHRcdFx0XHRcdFx0XHQgIFxyXG5cdFx0XHRcdFx0XHRcdC8vIFRPRE86IOS4iuS8oCByZXMudGVtcEZpbGVQYXRoIOWBmuivhuWIq++8m+eOsOeUqCBtb2NrXHJcblx0XHRcdFx0XHRcdFx0Ly8gdGhpcy5oYW5kbGVSZWNvZ25pemVkVGV4dCh0aGlzLm1vY2tTcGVlY2hUb1RleHQoZHVyYXRpb24pLCByZXMudGVtcEZpbGVQYXRoLCBNYXRoLmNlaWwoXHJcblx0XHRcdFx0XHRcdFx0Ly8gXHRkdXJhdGlvbiAvIDEwMCkgLyAxMClcclxuXHRcdFx0XHRcdFx0XHQvLyDnnJ/lrp7or4bliKtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCByZWNvZ25pemVkVGV4dCA9IGF3YWl0IHRoaXMucmVjb2duaXplQXVkaW8odGVtcEZpbGVQYXRoKTtcclxuXHRcdFx0XHRcdFx0XHR1bmkuaGlkZUxvYWRpbmcoKTtcdCBcclxuXHRcdFx0XHRcdFx0XHQgaWYgKHJlY29nbml6ZWRUZXh0KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdCAvLyDmiJDlip/vvJrloavlhaXovpPlhaXmoYZcclxuXHRcdFx0XHRcdFx0XHRcdFx0IHRoaXMuaW5wdXRUZXh0ID0gcmVjb2duaXplZFRleHQ7XHJcblx0XHRcdFx0XHRcdFx0XHRcdCB0aGlzLiRuZXh0VGljaygoKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdCAgIC8vIOWPr+mAie+8muiHquWKqOWPkemAgVxyXG5cdFx0XHRcdFx0XHRcdFx0XHQgICAvLyB0aGlzLm9uU2VuZCgndm9pY2UnLCB0ZW1wRmlsZVBhdGgsIE1hdGguY2VpbChkdXJhdGlvbiAvIDEwMCkgLyAxMCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdCB9KTtcclxuXHRcdFx0XHRcdFx0XHRcdCAgIH1cclxuXHRcdFx0XHRcdFx0fSlcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdG9uUHJlc3NNaWMoZSkge1xyXG5cdFx0XHRcdFx0dGhpcy5lbnN1cmVSZWNvcmRlcigpXHJcblx0XHRcdFx0XHR0aGlzLmlzUmVjb3JkaW5nID0gdHJ1ZVxyXG5cdFx0XHRcdFx0Ly8gdGhpcy5zaG93ID0gdHJ1ZVxyXG5cdFx0XHRcdFx0dGhpcy53aWxsQ2FuY2VsID0gZmFsc2VcclxuXHRcdFx0XHRcdHRoaXMucmVjb3JkU3RhcnRUcyA9IERhdGUubm93KClcclxuXHRcdFx0XHRcdHRoaXMucmVjb3JkU3RhcnRZID0gKGUuY2hhbmdlZFRvdWNoZXMgJiYgZS5jaGFuZ2VkVG91Y2hlc1swXSkgPyBlLmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFkgOiAwXHJcblx0XHRcdFx0XHRpZiAodGhpcy5yZWNvcmRlcikge1xyXG5cdFx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMucmVjb3JkZXIuc3RhcnQoe1xyXG5cdFx0XHRcdFx0XHRcdFx0Zm9ybWF0OiAnYW1yJyxcclxuXHRcdFx0XHRcdFx0XHRcdHNhbXBsZVJhdGU6IDE2MDAwLFxyXG5cdFx0XHRcdFx0XHRcdFx0ZW5jb2RlQml0UmF0ZTogMTYwMDAsIC8vIOe8lueggeavlOeJueeOh1xyXG5cdFx0XHRcdFx0XHRcdFx0ZnJhbWVTaXplOiA0LCAvLyDluKflpKflsI9cclxuXHRcdFx0XHRcdFx0XHRcdG51bWJlck9mQ2hhbm5lbHM6IDEsXHJcblx0XHRcdFx0XHRcdFx0XHRkdXJhdGlvbjogNjAwMDBcclxuXHRcdFx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdFx0XHR9IGNhdGNoIChlcnIpIHt9XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRpZiAodGhpcy5yZWNvcmRTaW1UaW1lcikgY2xlYXJUaW1lb3V0KHRoaXMucmVjb3JkU2ltVGltZXIpXHJcblx0XHRcdFx0XHRcdHRoaXMucmVjb3JkU2ltVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHt9LCA2MDAwMClcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdG9uTW92ZU1pYyhlKSB7XHJcblx0XHRcdFx0XHRpZiAoIXRoaXMuaXNSZWNvcmRpbmcpIHJldHVybjtcclxuXHRcdFx0XHRcdGNvbnN0IHkgPSAoZS5jaGFuZ2VkVG91Y2hlcyAmJiBlLmNoYW5nZWRUb3VjaGVzWzBdKSA/IGUuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WSA6IDA7XHJcblx0XHRcdFx0XHR0aGlzLndpbGxDYW5jZWwgPSAodGhpcy5yZWNvcmRTdGFydFkgLSB5KSA+IDYwXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRvblJlbGVhc2VNaWMoKSB7XHJcblx0XHRcdFx0XHRjb25zb2xlLmxvZygnb25SZWxlYXNlTWljJyk7XHJcblx0XHRcdFx0XHRpZiAoIXRoaXMuaXNSZWNvcmRpbmcpIHJldHVyblxyXG5cdFx0XHRcdFx0Y29uc3QgY2FuY2VsID0gdGhpcy53aWxsQ2FuY2VsXHJcblx0XHRcdFx0XHR0aGlzLmlzUmVjb3JkaW5nID0gZmFsc2U7XHJcblx0XHRcdFx0XHR0aGlzLnNob3cgPSBmYWxzZVxyXG5cdFx0XHRcdFx0aWYgKHRoaXMucmVjb3JkZXIpIHtcclxuXHRcdFx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLnJlY29yZGVyLnN0b3AoKVxyXG5cdFx0XHRcdFx0XHR9IGNhdGNoIChlcnIpIHtcclxuXHRcdFx0XHRcdFx0XHRjb25zb2xlLmxvZygnZXJyJywgZXJyKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0aGFuZGxlUmVjb2duaXplZFRleHQodGV4dCwgdGVtcEZpbGVQYXRoLCBkdXJhdGlvbikge1xyXG5cdFx0XHRcdFx0aWYgKCF0ZXh0KSByZXR1cm5cclxuXHRcdFx0XHRcdHRoaXMuaW5wdXRUZXh0ID0gdGV4dFxyXG5cdFx0XHRcdFx0dGhpcy5vblNlbmQoJ3ZvaWNlJywgdGVtcEZpbGVQYXRoLCBkdXJhdGlvbikgLy8g5LygICd2b2ljZSdcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdG1vY2tTcGVlY2hUb1RleHQobXMpIHtcclxuXHRcdFx0XHRcdGNvbnN0IHNlYyA9IE1hdGguY2VpbChtcyAvIDEwMCkgLyAxMFxyXG5cdFx0XHRcdFx0Y29uc3QgcG9vbCA9IFtcclxuXHRcdFx0XHRcdFx0YOivremfs+i+k+WFpSAke3NlY31z77yM5qih5ouf6K+G5Yir77ya5biu5oiR57uf6K6h5LuK5aSp6ZSA5ZSu6aKdYCxcclxuXHRcdFx0XHRcdFx0YOivremfs+i+k+WFpSAke3NlY31z77yM5qih5ouf6K+G5Yir77ya5p+l6K+i6K6i5Y2VMjAzODg5OTM0ODNgLFxyXG5cdFx0XHRcdFx0XHRg6K+t6Z+z6L6T5YWlICR7c2VjfXPvvIzmqKHmi5/or4bliKvvvJrnlJ/miJDml6XmiqVgXHJcblx0XHRcdFx0XHRdXHJcblx0XHRcdFx0XHRyZXR1cm4gcG9vbFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBwb29sLmxlbmd0aCldXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRvbkhpc3RvcnlJdGVtVGFwKHRleHQpIHtcclxuXHRcdFx0XHRcdHRoaXMuaW5wdXRUZXh0ID0gdGV4dFxyXG5cdFx0XHRcdFx0dGhpcy5vblNlbmQoKTtcclxuXHRcdFx0XHRcdHRoaXMuJHJlZnMucG9wdXAuY2xvc2UoKVxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0YXN5bmMgb25TZW5kKGlucHV0VHlwZSA9ICd0ZXh0JywgaW5wdXRDb250ZW50ID0gJycsIGR1cmF0aW9uID0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0ICBjb25zdCB0ZXh0ID0gKHRoaXMuaW5wdXRUZXh0IHx8ICcnKS50cmltKClcclxuXHRcdFx0XHQgIGlmICghdGV4dCB8fCB0aGlzLmlzTG9hZGluZykgcmV0dXJuXHJcblx0XHRcdFx0XHJcblx0XHRcdFx0ICBjb25zdCBiYXNlSWQgPSBEYXRlLm5vdygpXHJcblx0XHRcdFx0XHJcblx0XHRcdFx0ICAvLyAxLiDnlKjmiLfmtojmga9cclxuXHRcdFx0XHQgIHRoaXMubWVzc2FnZXMucHVzaCh7XHJcblx0XHRcdFx0XHRpZDogYmFzZUlkLFxyXG5cdFx0XHRcdFx0cm9sZTogJ3VzZXInLFxyXG5cdFx0XHRcdFx0dHlwZTogJ3RleHQnLFxyXG5cdFx0XHRcdFx0Y29udGVudDogdGV4dCxcclxuXHRcdFx0XHRcdGlucHV0VHlwZSxcclxuXHRcdFx0XHRcdGlucHV0Q29udGVudCxcclxuXHRcdFx0XHRcdGR1cmF0aW9uXHJcblx0XHRcdFx0ICB9KVxyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdCAgLy8gMi4gbG9hZGluZyDmtojmga9cclxuXHRcdFx0XHQgIGNvbnN0IGxvYWRpbmdJZCA9IGJhc2VJZCArIDAuNVxyXG5cdFx0XHRcdCAgdGhpcy5tZXNzYWdlcy5wdXNoKHtcclxuXHRcdFx0XHRcdGlkOiBsb2FkaW5nSWQsXHJcblx0XHRcdFx0XHRyb2xlOiAnYXNzaXN0YW50JyxcclxuXHRcdFx0XHRcdGxvYWRpbmc6IHRydWVcclxuXHRcdFx0XHQgIH0pXHJcblx0XHRcdFx0XHJcblx0XHRcdFx0ICB0aGlzLnNjcm9sbFRvQm90dG9tKClcclxuXHRcdFx0XHQgIHRoaXMuaW5wdXRUZXh0ID0gJydcclxuXHRcdFx0XHQgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZVxyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdCAgdGhpcy5hZGRUb0hpc3RvcnkodGV4dClcclxuXHRcdFx0XHRcclxuXHRcdFx0XHQgIHRyeSB7XHJcblx0XHRcdFx0XHQvLyAzLiDnnJ/mraPnrYnlvoUgQUkg5Zue5aSNXHJcblx0XHRcdFx0XHRjb25zdCByZXBseSA9IGF3YWl0IHRoaXMuZ2V0QUlSZXNwb25zZSh0ZXh0KVxyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdFx0Ly8gNC4g56e76ZmkIGxvYWRpbmdcclxuXHRcdFx0XHRcdGNvbnN0IGxvYWRpbmdJZHggPSB0aGlzLm1lc3NhZ2VzLmZpbmRJbmRleChtID0+IG0uaWQgPT09IGxvYWRpbmdJZClcclxuXHRcdFx0XHRcdGlmIChsb2FkaW5nSWR4ID4gLTEpIHRoaXMubWVzc2FnZXMuc3BsaWNlKGxvYWRpbmdJZHgsIDEpXHJcblx0XHRcdFx0XHJcblx0XHRcdFx0XHQvLyA1LiDmt7vliqDlm57lpI0gKyDmiZPlrZfmnLpcclxuXHRcdFx0XHRcdGNvbnN0IHJlcGx5SWQgPSBiYXNlSWQgKyAxXHJcblx0XHRcdFx0XHR0aGlzLm1lc3NhZ2VzLnB1c2goe1xyXG5cdFx0XHRcdFx0ICBpZDogcmVwbHlJZCxcclxuXHRcdFx0XHRcdCAgcm9sZTogJ2Fzc2lzdGFudCcsXHJcblx0XHRcdFx0XHQgIHR5cGU6ICd0ZXh0JyxcclxuXHRcdFx0XHRcdCAgY29udGVudDogcmVwbHksXHJcblx0XHRcdFx0XHQgIGRpc3BsYXlUZXh0OiAnJ1xyXG5cdFx0XHRcdFx0fSlcclxuXHRcdFx0XHRcclxuXHRcdFx0XHRcdHRoaXMudHlwZXdyaXRlcihyZXBseUlkLCByZXBseSlcclxuXHRcdFx0XHQgIH0gY2F0Y2ggKGUpIHtcclxuXHRcdFx0XHRcdC8vIOWHuumUmeaXtuS5n+WxleekulxyXG5cdFx0XHRcdFx0Y29uc3QgbG9hZGluZ0lkeCA9IHRoaXMubWVzc2FnZXMuZmluZEluZGV4KG0gPT4gbS5pZCA9PT0gbG9hZGluZ0lkKVxyXG5cdFx0XHRcdFx0aWYgKGxvYWRpbmdJZHggPiAtMSkgdGhpcy5tZXNzYWdlcy5zcGxpY2UobG9hZGluZ0lkeCwgMSlcclxuXHRcdFx0XHRcdHRoaXMubWVzc2FnZXMucHVzaCh7XHJcblx0XHRcdFx0XHQgIGlkOiBiYXNlSWQgKyAxLFxyXG5cdFx0XHRcdFx0ICByb2xlOiAnYXNzaXN0YW50JyxcclxuXHRcdFx0XHRcdCAgY29udGVudDogYOivt+axguWHuumUme+8miR7ZS5tZXNzYWdlIHx8IGV9YFxyXG5cdFx0XHRcdFx0fSlcclxuXHRcdFx0XHQgIH0gZmluYWxseSB7XHJcblx0XHRcdFx0XHR0aGlzLmlzTG9hZGluZyA9IGZhbHNlXHJcblx0XHRcdFx0XHR0aGlzLiRuZXh0VGljaygoKSA9PiB0aGlzLnNjcm9sbFRvQm90dG9tKCkpXHJcblx0XHRcdFx0ICB9XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHR0eXBld3JpdGVyKG1lc3NhZ2VJZCwgZnVsbFRleHQpIHtcclxuXHRcdFx0XHRcdGNvbnN0IG1zZyA9IHRoaXMubWVzc2FnZXMuZmluZChtID0+IG0uaWQgPT09IG1lc3NhZ2VJZClcclxuXHRcdFx0XHRcdGlmICghbXNnKSByZXR1cm5cclxuXHRcdFx0XHRcdC8vIOa4heeQhuS5i+WJjeeahOWumuaXtuWZqO+8iOWmguaenOWtmOWcqO+8iVxyXG5cdFx0XHRcdFx0aWYgKHRoaXMudHlwZXdyaXRlclRpbWVyc1ttZXNzYWdlSWRdKSB7XHJcblx0XHRcdFx0XHRcdGNsZWFySW50ZXJ2YWwodGhpcy50eXBld3JpdGVyVGltZXJzW21lc3NhZ2VJZF0pXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRsZXQgaW5kZXggPSAwXHJcblx0XHRcdFx0XHRtc2cuZGlzcGxheVRleHQgPSBmdWxsVGV4dC5zdWJzdHJpbmcoMCwgaW5kZXggKyAxKTtcclxuXHRcdFx0XHRcdGluZGV4ICs9IDE7XHJcblx0XHRcdFx0XHRjb25zdCBzcGVlZCA9IDUwIC8vIOavj+S4quWtl+espumXtOmalDUwbXNcclxuXHRcdFx0XHRcdGNvbnN0IHRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRpZiAoaW5kZXggPCBmdWxsVGV4dC5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdFx0XHRtc2cuZGlzcGxheVRleHQgPSBmdWxsVGV4dC5zdWJzdHJpbmcoMCwgaW5kZXggKyAxKVxyXG5cdFx0XHRcdFx0XHRcdGluZGV4KytcclxuXHRcdFx0XHRcdFx0XHQvLyDmiZPlrZfov4fnqIvkuK3oh6rliqjmu5rliqjliLDlupXpg6hcclxuXHRcdFx0XHRcdFx0XHR0aGlzLiRuZXh0VGljaygoKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLnNjcm9sbFRvQm90dG9tKClcclxuXHRcdFx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdGNsZWFySW50ZXJ2YWwodGltZXIpXHJcblx0XHRcdFx0XHRcdFx0ZGVsZXRlIHRoaXMudHlwZXdyaXRlclRpbWVyc1ttZXNzYWdlSWRdXHJcblx0XHRcdFx0XHRcdFx0Ly8g5a6M5oiQ5ZCO5L2/55So5a6M5pW05paH5pysXHJcblx0XHRcdFx0XHRcdFx0bXNnLmRpc3BsYXlUZXh0ID0gZnVsbFRleHRcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSwgc3BlZWQpXHJcblx0XHRcdFx0XHR0aGlzLnR5cGV3cml0ZXJUaW1lcnNbbWVzc2FnZUlkXSA9IHRpbWVyXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRzY3JvbGxUb0JvdHRvbSgpIHtcclxuXHRcdFx0XHRcdHRoaXMuJG5leHRUaWNrKCgpID0+IHtcclxuXHRcdFx0XHRcdFx0dW5pLmNyZWF0ZVNlbGVjdG9yUXVlcnkoKS5zZWxlY3QoJy5jb250ZW50JykuYm91bmRpbmdDbGllbnRSZWN0KChyZWN0KSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0dW5pLnBhZ2VTY3JvbGxUbyh7XHJcblx0XHRcdFx0XHRcdFx0XHRzY3JvbGxUb3A6IHJlY3QuaGVpZ2h0LFxyXG5cdFx0XHRcdFx0XHRcdFx0ZHVyYXRpb246IDMwMCxcclxuXHRcdFx0XHRcdFx0XHRcdGNsYXNzOiAnLmNvbnRlbnQnXHJcblx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdH0pLmV4ZWMoKTtcclxuXHRcdFx0XHRcdH0pXHJcblxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0bW9ja1JlcGx5KHRleHQpIHtcclxuXHRcdFx0XHRcdGNvbnN0IGNhbmRpZGF0ZXMgPSBbXHJcblx0XHRcdFx0XHRcdCflpb3nmoTvvIzmiJHlt7Lnu4/kuLrmgqjlpITnkIbjgIInLFxyXG5cdFx0XHRcdFx0XHQn5pS25Yiw6K+35rGC77yM5Lul5LiL5piv57uT5p6c55qE5qaC6KeI44CCJyxcclxuXHRcdFx0XHRcdFx0J+aIkeeQhuino+S6hu+8jOi/meaYr+S4gOS4quekuuS+i+WbnuWkjeOAgicsXHJcblx0XHRcdFx0XHRcdCflt7LorrDlvZXvvIznqI3lkI7lsIblrozlloTmiqXooajjgIInXHJcblx0XHRcdFx0XHRdXHJcblx0XHRcdFx0XHRjb25zdCBwaWNrID0gY2FuZGlkYXRlc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjYW5kaWRhdGVzLmxlbmd0aCldXHJcblx0XHRcdFx0XHRyZXR1cm4gcGljayArICfvvIjlt7LmlLbliLDvvJrigJwnICsgdGV4dCArICfigJ3vvIknXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRvbkxpc3Rlbih0ZXh0KSB7XHJcblx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHQvLyBINTogV2ViIFNwZWVjaCBBUElcclxuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5zcGVlY2hTeW50aGVzaXMpIHtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCB1ID0gbmV3IFNwZWVjaFN5bnRoZXNpc1V0dGVyYW5jZShTdHJpbmcodGV4dCkpXHJcblx0XHRcdFx0XHRcdFx0dS5sYW5nID0gJ3poLUNOJ1xyXG5cdFx0XHRcdFx0XHRcdHUucmF0ZSA9IDFcclxuXHRcdFx0XHRcdFx0XHR1LnBpdGNoID0gMVxyXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy5zcGVlY2hTeW50aGVzaXMuY2FuY2VsKClcclxuXHRcdFx0XHRcdFx0XHR3aW5kb3cuc3BlZWNoU3ludGhlc2lzLnNwZWFrKHUpXHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuXHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0gY2F0Y2ggKGUpIHt9XHJcblx0XHRcdFx0XHR1bmkuc2hvd1RvYXN0KHtcclxuXHRcdFx0XHRcdFx0dGl0bGU6ICflvZPliY3nq6/kuI3mlK/mjIHor63pn7Pmkq3mlL4nLFxyXG5cdFx0XHRcdFx0XHRpY29uOiAnbm9uZSdcclxuXHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0PC9zY3JpcHQ+XHJcblxyXG5cdDxzdHlsZSBzY29wZWQ+XHJcblx0XHQ6OnYtZGVlcCAudW5pLW5hdi1iYXItdGV4dHtcclxuXHRcdFx0Zm9udC1zaXplOiAxOHB4ICFpbXBvcnRhbnQ7XHJcblx0XHR9XHJcblx0XHRcclxuXHRcdDo6di1kZWVvIC51bmktbmF2YmFyLS1ib3JkZXJ7XHJcblx0XHRcdC8qIGJvcmRlci1ib3R0b206IDBweCAhaW1wb3J0YW50OyAqL1xyXG5cdFx0XHRib3JkZXItYm90dG9tOiAxcHggc29saWQgI2ZmZiAhaW1wb3J0YW50O1xyXG5cdFx0fVxyXG5cdFx0XHJcblx0XHQuYWktcGFnZSB7XHJcblx0XHRcdGhlaWdodDogMTAwdmg7XHJcblx0XHRcdGRpc3BsYXk6IGZsZXg7XHJcblx0XHRcdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcblx0XHRcdGJhY2tncm91bmQ6ICNmN2Y4ZmM7XHJcblx0XHR9XHJcblxyXG5cdFx0Lm5hdiB7XHJcblx0XHRcdGhlaWdodDogNDRweDtcclxuXHRcdFx0ZGlzcGxheTogZmxleDtcclxuXHRcdFx0YWxpZ24taXRlbXM6IGNlbnRlcjtcclxuXHRcdFx0anVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xyXG5cdFx0XHRwYWRkaW5nOiAwIDEycHg7XHJcblx0XHRcdGJhY2tncm91bmQ6ICNmZmZmZmY7XHJcblx0XHRcdGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMDQpO1xyXG5cdFx0XHRwb3NpdGlvbjogZml4ZWQ7XHJcblx0XHRcdGxlZnQ6IDA7XHJcblx0XHRcdHJpZ2h0OiAwO1xyXG5cdFx0XHR0b3A6IDA7XHJcblx0XHRcdHotaW5kZXg6IDk7XHJcblx0XHR9XHJcblxyXG5cdFx0Lm5hdi10aXRsZSB7XHJcblx0XHRcdGZvbnQtc2l6ZTogMTZweDtcclxuXHRcdFx0Zm9udC13ZWlnaHQ6IDYwMDtcclxuXHRcdH1cclxuXHJcblx0XHQuaGFtYnVyZ2VyIHtcclxuXHRcdFx0d2lkdGg6IDE4cHg7XHJcblx0XHR9XHJcblxyXG5cdFx0LmhhbWJ1cmdlciAubGluZSB7XHJcblx0XHRcdGhlaWdodDogMnB4O1xyXG5cdFx0XHRiYWNrZ3JvdW5kOiAjMzMzO1xyXG5cdFx0XHRtYXJnaW46IDNweCAwO1xyXG5cdFx0XHRib3JkZXItcmFkaXVzOiAycHg7XHJcblx0XHR9XHJcblxyXG5cdFx0LmdlYXIge1xyXG5cdFx0XHR3aWR0aDogMThweDtcclxuXHRcdFx0aGVpZ2h0OiAxOHB4O1xyXG5cdFx0XHRwb3NpdGlvbjogcmVsYXRpdmU7XHJcblx0XHRcdGNvbG9yOiAjMDAwO1xyXG5cdFx0fVxyXG5cclxuXHRcdC5jb250ZW50IHtcclxuXHRcdFx0ZmxleDogMTtcclxuXHRcdFx0cGFkZGluZzogMTZweCAxMnB4IDY4cHggMTJweDtcclxuXHRcdFx0YmFja2dyb3VuZC1jb2xvcjogI2Y3ZjhmYztcclxuXHRcdFx0d2lkdGg6IDEwMCU7XHJcblx0XHRcdGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcblx0XHR9XHJcblxyXG5cdFx0LmdyZWV0LWNhcmQge1xyXG5cdFx0XHRkaXNwbGF5OiBmbGV4O1xyXG5cdFx0XHRhbGlnbi1pdGVtczogY2VudGVyO1xyXG5cdFx0XHRiYWNrZ3JvdW5kOiAjZmZmO1xyXG5cdFx0XHRib3JkZXItcmFkaXVzOiAxNHB4O1xyXG5cdFx0XHRwYWRkaW5nOiAxMnB4O1xyXG5cdFx0XHRtYXJnaW4tYm90dG9tOiAxMHB4O1xyXG5cdFx0fVxyXG5cclxuXHRcdC5hdmF0YXItaW5uZXIge1xyXG5cdFx0XHRmb250LXNpemU6IDI2cHg7XHJcblx0XHR9XHJcblxyXG5cdFx0LmdyZWV0LXRleHQgLmhpIHtcclxuXHRcdFx0Zm9udC1zaXplOiAxNnB4O1xyXG5cdFx0XHRmb250LXdlaWdodDogNzAwO1xyXG5cdFx0XHRjb2xvcjogIzBiNTZmZjtcclxuXHRcdH1cclxuXHJcblx0XHQuZ3JlZXQtdGV4dCAuc3ViIHtcclxuXHRcdFx0Zm9udC1zaXplOiAxMnB4O1xyXG5cdFx0XHRjb2xvcjogIzRhNzZiMTtcclxuXHRcdFx0bWFyZ2luLXRvcDogNHB4O1xyXG5cdFx0fVxyXG5cclxuXHRcdC53ZWxjb21lIHtcclxuXHRcdFx0Zm9udC1zaXplOiAxM3B4O1xyXG5cdFx0XHRjb2xvcjogIzMzMztcclxuXHRcdFx0YmFja2dyb3VuZDogI2ZmZjtcclxuXHRcdFx0Ym9yZGVyLXJhZGl1czogMTJweDtcclxuXHRcdFx0cGFkZGluZzogMTBweCAxMnB4O1xyXG5cdFx0XHRtYXJnaW46IDEycHggMDtcclxuXHRcdH1cclxuXHJcblx0XHQuZ3Vlc3MtcGFuZWwge1xyXG5cdFx0XHRiYWNrZ3JvdW5kOiAjZmZmO1xyXG5cdFx0XHRib3JkZXItcmFkaXVzOiAxNHB4O1xyXG5cdFx0XHRwYWRkaW5nOiAxMHB4O1xyXG5cdFx0XHRtYXJnaW4tYm90dG9tOiAxNnB4O1xyXG5cdFx0fVxyXG5cclxuXHRcdC5ndWVzcy10aXRsZSB7XHJcblx0XHRcdGNvbG9yOiAjNWY2ZmZmO1xyXG5cdFx0XHRmb250LXNpemU6IDE0cHg7XHJcblx0XHRcdG1hcmdpbi1ib3R0b206IDhweDtcclxuXHRcdH1cclxuXHJcblx0XHQuZ3Vlc3MtbGlzdCB7XHJcblx0XHRcdGRpc3BsYXk6IGZsZXg7XHJcblx0XHRcdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcblx0XHR9XHJcblxyXG5cdFx0Lmd1ZXNzLWl0ZW0ge1xyXG5cdFx0XHRiYWNrZ3JvdW5kOiAjZjdmOGZjO1xyXG5cdFx0XHRib3JkZXItcmFkaXVzOiAxMHB4O1xyXG5cdFx0XHRwYWRkaW5nOiAxMnB4O1xyXG5cdFx0XHRkaXNwbGF5OiBmbGV4O1xyXG5cdFx0XHRhbGlnbi1pdGVtczogY2VudGVyO1xyXG5cdFx0XHRqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XHJcblx0XHRcdG1hcmdpbi1ib3R0b206IDEwcHg7XHJcblx0XHRcdGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcblx0XHR9XHJcblxyXG5cdFx0Lmd1ZXNzLWl0ZW06bGFzdC1jaGlsZCB7XHJcblx0XHRcdG1hcmdpbi1ib3R0b206IDA7XHJcblx0XHR9XHJcblxyXG5cdFx0Lmd1ZXNzLWl0ZW0gLmFycm93IHtcclxuXHRcdFx0Y29sb3I6ICM5YWEzYjI7XHJcblx0XHRcdGZvbnQtc2l6ZTogMThweDtcclxuXHRcdH1cclxuXHJcblx0XHQuY2hhdCB7XHJcblx0XHRcdG1hcmdpbjogNnB4IDAgMTJweDtcclxuXHRcdH1cclxuXHJcblx0XHQubXNnIHtcclxuXHRcdFx0bWFyZ2luOiAxMHB4IDA7XHJcblx0XHRcdGRpc3BsYXk6IGZsZXg7XHJcblx0XHR9XHJcblxyXG5cdFx0Lm1zZy51c2VyIHtcclxuXHRcdFx0anVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcclxuXHRcdH1cclxuXHJcblx0XHQuYnViYmxlIHtcclxuXHRcdFx0bWF4LXdpZHRoOiA4MCU7XHJcblx0XHRcdHBhZGRpbmc6IDEwcHggMTJweDtcclxuXHRcdFx0Ym9yZGVyLXJhZGl1czogMTRweDtcclxuXHRcdFx0Zm9udC1zaXplOiAxNHB4O1xyXG5cdFx0XHRsaW5lLWhlaWdodDogMS41O1xyXG5cdFx0fVxyXG5cclxuXHRcdC51c2VyLWJ1YmJsZSB7XHJcblx0XHRcdGJhY2tncm91bmQ6ICM0ZTdiZmY7XHJcblx0XHRcdGNvbG9yOiAjZmZmO1xyXG5cdFx0XHRib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogNHB4O1xyXG5cdFx0XHRtYXJnaW4tcmlnaHQ6IDZweDtcclxuXHRcdH1cclxuXHJcblx0XHQuYWktYnViYmxlIHtcclxuXHRcdFx0YmFja2dyb3VuZDogI2ZmZjtcclxuXHRcdFx0Y29sb3I6ICMzMzM7XHJcblx0XHRcdGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDRweDtcclxuXHRcdFx0Ym94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4wNik7XHJcblx0XHR9XHJcblxyXG5cdFx0Lmxpc3Rlbi1idG4ge1xyXG5cdFx0XHRtYXJnaW4tbGVmdDogOHB4O1xyXG5cdFx0XHRjb2xvcjogIzZiNzI4MDtcclxuXHRcdFx0Zm9udC1zaXplOiAxNHB4O1xyXG5cdFx0fVxyXG5cclxuXHRcdC5haS1jYXJkLXRpdGxlIHtcclxuXHRcdFx0Y29sb3I6ICM1ZjZmZmY7XHJcblx0XHRcdGZvbnQtd2VpZ2h0OiA2MDA7XHJcblx0XHRcdG1hcmdpbi1ib3R0b206IDZweDtcclxuXHRcdH1cclxuXHJcblx0XHQuYWktY2FyZC1ib2R5IHtcclxuXHRcdFx0Y29sb3I6ICM2NjY7XHJcblx0XHR9XHJcblxyXG5cdFx0LyogbG9hZGluZyBhbmltYXRpb24gKi9cclxuXHRcdC5haS1sb2FkaW5nIHtcclxuXHRcdFx0ZGlzcGxheTogZmxleDtcclxuXHRcdFx0YWxpZ24taXRlbXM6IGNlbnRlcjtcclxuXHRcdFx0Z2FwOiA2cHg7XHJcblx0XHRcdHBhZGRpbmc6IDRweCAwO1xyXG5cdFx0fVxyXG5cclxuXHRcdC5sb2FkaW5nLWRvdCB7XHJcblx0XHRcdHdpZHRoOiA4cHg7XHJcblx0XHRcdGhlaWdodDogOHB4O1xyXG5cdFx0XHRib3JkZXItcmFkaXVzOiA1MCU7XHJcblx0XHRcdGJhY2tncm91bmQ6ICM5Y2EzYWY7XHJcblx0XHRcdGFuaW1hdGlvbjogbG9hZGluZy1ib3VuY2UgMS40cyBlYXNlLWluLW91dCBpbmZpbml0ZSBib3RoO1xyXG5cdFx0fVxyXG5cclxuXHRcdC5sb2FkaW5nLWRvdDpudGgtY2hpbGQoMSkge1xyXG5cdFx0XHRhbmltYXRpb24tZGVsYXk6IC0wLjMycztcclxuXHRcdH1cclxuXHJcblx0XHQubG9hZGluZy1kb3Q6bnRoLWNoaWxkKDIpIHtcclxuXHRcdFx0YW5pbWF0aW9uLWRlbGF5OiAtMC4xNnM7XHJcblx0XHR9XHJcblxyXG5cdFx0QGtleWZyYW1lcyBsb2FkaW5nLWJvdW5jZSB7XHJcblx0XHRcdDAlLCA4MCUsIDEwMCUge1xyXG5cdFx0XHRcdHRyYW5zZm9ybTogc2NhbGUoMC44KTtcclxuXHRcdFx0XHRvcGFjaXR5OiAwLjU7XHJcblx0XHRcdH1cclxuXHRcdFx0NDAlIHtcclxuXHRcdFx0XHR0cmFuc2Zvcm06IHNjYWxlKDEuMik7XHJcblx0XHRcdFx0b3BhY2l0eTogMTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8qIGJvdHRvbSBkb2NrICovXHJcblx0XHQuZG9jayB7XHJcblx0XHRcdHBvc2l0aW9uOiBmaXhlZDtcclxuXHRcdFx0bGVmdDogMDtcclxuXHRcdFx0cmlnaHQ6IDA7XHJcblx0XHRcdGJvdHRvbTogMDtcclxuXHRcdFx0YmFja2dyb3VuZDogI2Y3ZjhmYztcclxuXHRcdFx0Ym94LXNoYWRvdzogMCAtNHB4IDEycHggcmdiYSgwLCAwLCAwLCAwLjA2KTtcclxuXHRcdFx0cGFkZGluZy1ib3R0b206IGNvbnN0YW50KHNhZmUtYXJlYS1pbnNldC1ib3R0b20pO1xyXG5cdFx0XHRwYWRkaW5nLWJvdHRvbTogZW52KHNhZmUtYXJlYS1pbnNldC1ib3R0b20pO1xyXG5cdFx0fVxyXG5cclxuXHRcdC5xdWljay1hY3Rpb25zIHtcclxuXHRcdFx0cGFkZGluZzogNnB4IDEwcHggNHB4O1xyXG5cdFx0fVxyXG5cclxuXHRcdC5xdWljay1hY3Rpb25zLmhvcml6b250YWwge1xyXG5cdFx0XHR3aGl0ZS1zcGFjZTogbm93cmFwO1xyXG5cdFx0XHR3aWR0aDogOTUlO1xyXG5cdFx0fVxyXG5cclxuXHRcdC5xYS1idG4ge1xyXG5cdFx0XHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcclxuXHRcdFx0YWxpZ24taXRlbXM6IGNlbnRlcjtcclxuXHRcdFx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcblx0XHRcdG1pbi13aWR0aDogOTZweDtcclxuXHRcdFx0dGV4dC1hbGlnbjogY2VudGVyO1xyXG5cdFx0XHRiYWNrZ3JvdW5kOiAjZmZmO1xyXG5cdFx0XHRib3JkZXItcmFkaXVzOiAxMHB4O1xyXG5cdFx0XHRwYWRkaW5nOiA4cHggMTBweDtcclxuXHRcdFx0Zm9udC1zaXplOiAxMnB4O1xyXG5cdFx0XHRjb2xvcjogIzNiM2Y0NTtcclxuXHRcdFx0Ym94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4wNCk7XHJcblx0XHRcdG1hcmdpbi1yaWdodDogMTBweDtcclxuXHRcdH1cclxuXHJcblx0XHQucWEtYnRuLm1pbm9yIHtcclxuXHRcdFx0YmFja2dyb3VuZDogI2VmZjFmZjtcclxuXHRcdFx0Y29sb3I6ICM0ZTdiZmY7XHJcblx0XHR9XHJcblxyXG5cdFx0LnFhLWJ0bjpsYXN0LWNoaWxkIHtcclxuXHRcdFx0bWFyZ2luLXJpZ2h0OiAwO1xyXG5cdFx0fVxyXG5cclxuXHRcdC5pbnB1dC1iYXIge1xyXG5cdFx0XHRkaXNwbGF5OiBmbGV4O1xyXG5cdFx0XHRhbGlnbi1pdGVtczogY2VudGVyO1xyXG5cdFx0XHRwYWRkaW5nOiA4cHggMTBweCAxMnB4O1xyXG5cdFx0XHRnYXA6IDhweDtcclxuXHRcdFx0YmFja2dyb3VuZDogI2Y3ZjhmYztcclxuXHRcdH1cclxuXHJcblx0XHQuaW5wdXQge1xyXG5cdFx0XHRmbGV4OiAxO1xyXG5cdFx0XHRiYWNrZ3JvdW5kOiAjZmZmO1xyXG5cdFx0XHRib3JkZXItcmFkaXVzOiAyNHB4O1xyXG5cdFx0XHRwYWRkaW5nOiAxMHB4IDE0cHg7XHJcblx0XHRcdGZvbnQtc2l6ZTogMTRweDtcclxuXHRcdH1cclxuXHJcblx0XHQucGgge1xyXG5cdFx0XHRjb2xvcjogIzlhYTNiMjtcclxuXHRcdH1cclxuXHJcblx0XHQubWljIHtcclxuXHRcdFx0d2lkdGg6IDM2cHg7XHJcblx0XHRcdGhlaWdodDogMzZweDtcclxuXHRcdFx0Ym9yZGVyLXJhZGl1czogMThweDtcclxuXHRcdFx0YmFja2dyb3VuZDogI2ZmZjtcclxuXHRcdFx0ZGlzcGxheTogZmxleDtcclxuXHRcdFx0YWxpZ24taXRlbXM6IGNlbnRlcjtcclxuXHRcdFx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcblx0XHRcdGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMDYpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC5taWMucmVjb3JkaW5nIHtcclxuXHRcdFx0YmFja2dyb3VuZDogI2ZmZmJmMDtcclxuXHRcdFx0Ym94LXNoYWRvdzogMCAwIDAgMnB4IHJnYmEoMjU1LCAxOTMsIDcsIC4yNSkgaW5zZXQ7XHJcblx0XHR9XHJcblxyXG5cdFx0LnNlbmQge1xyXG5cdFx0XHRoZWlnaHQ6IDM2cHg7XHJcblx0XHRcdGxpbmUtaGVpZ2h0OiAzNnB4O1xyXG5cdFx0XHRwYWRkaW5nOiAwIDE0cHg7XHJcblx0XHRcdGJvcmRlci1yYWRpdXM6IDE4cHg7XHJcblx0XHRcdGJhY2tncm91bmQ6ICM0ZTdiZmY7XHJcblx0XHRcdGNvbG9yOiAjZmZmO1xyXG5cdFx0XHRmb250LXNpemU6IDE0cHg7XHJcblx0XHR9XHJcblxyXG5cdFx0LyogZHJhd2VyICovXHJcblx0XHQuZHJhd2VyLW1hc2sge1xyXG5cdFx0XHR3aWR0aDogNzB2dztcclxuXHRcdFx0aGVpZ2h0OiAxMDB2aDtcclxuXHRcdH1cclxuXHJcblx0XHQuZHJhd2VyIHtcclxuXHRcdFx0d2lkdGg6IDEwMCU7XHJcblx0XHRcdGhlaWdodDogMTAwdmg7XHJcblx0XHRcdGJhY2tncm91bmQ6ICNmZmY7XHJcblx0XHRcdGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiA4cHg7XHJcblx0XHRcdGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA4cHg7XHJcblx0XHRcdGRpc3BsYXk6IGZsZXg7XHJcblx0XHRcdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcblx0XHR9XHJcblxyXG5cdFx0LmRyYXdlci5zaG93IHtcclxuXHRcdFx0dHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC5kcmF3ZXItc2Nyb2xsIHtcclxuXHRcdFx0aGVpZ2h0OiBjYWxjKDEwMHZoIC0gNjRweCk7XHJcblx0XHRcdHBhZGRpbmc6IDEycHg7XHJcblx0XHRcdGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcblx0XHR9XHJcblxyXG5cdFx0LmRyYXdlci1ncm91cCB7XHJcblx0XHRcdHBhZGRpbmc6IDEwcHggOHB4IDA7XHJcblx0XHR9XHJcblxyXG5cdFx0LmRyYXdlci1kYXRlIHtcclxuXHRcdFx0Y29sb3I6ICM5YWEzYjI7XHJcblx0XHRcdGZvbnQtc2l6ZTogMTJweDtcclxuXHRcdFx0bWFyZ2luLWJvdHRvbTogOHB4O1xyXG5cdFx0fVxyXG5cclxuXHRcdC5kcmF3ZXItaXRlbSB7XHJcblx0XHRcdGNvbG9yOiAjMzMzO1xyXG5cdFx0XHRmb250LXNpemU6IDEzcHg7XHJcblx0XHRcdGxpbmUtaGVpZ2h0OiAyMHB4O1xyXG5cdFx0XHRtYXJnaW46IDZweCAwO1xyXG5cdFx0fVxyXG5cclxuXHRcdC5kcmF3ZXItZGl2aWRlciB7XHJcblx0XHRcdGhlaWdodDogMXB4O1xyXG5cdFx0XHRiYWNrZ3JvdW5kOiAjZWVlZWVlO1xyXG5cdFx0XHRtYXJnaW46IDEycHggMDtcclxuXHRcdH1cclxuXHJcblx0XHQuZHJhd2VyLWZvb3RlciB7XHJcblx0XHRcdHBhZGRpbmc6IDEycHg7XHJcblx0XHRcdGJvcmRlci10b3A6IDFweCBzb2xpZCAjZWVlZWVlO1xyXG5cdFx0XHRkaXNwbGF5OiBmbGV4O1xyXG5cdFx0XHRhbGlnbi1pdGVtczogY2VudGVyO1xyXG5cdFx0fVxyXG5cclxuXHRcdC5kcmF3ZXItZm9vdGVyIHtcclxuXHRcdFx0LyogZml4ZWQgaGVpZ2h0IGZvciBjYWxjIGFib3ZlICovXHJcblx0XHRcdGhlaWdodDogNjRweDtcclxuXHRcdH1cclxuXHJcblx0XHQudXNlci1pY29uIHtcclxuXHRcdFx0d2lkdGg6IDI0cHg7XHJcblx0XHRcdHRleHQtYWxpZ246IGNlbnRlcjtcclxuXHRcdH1cclxuXHJcblx0XHQudXNlci1uYW1lIHtcclxuXHRcdFx0ZmxleDogMTtcclxuXHRcdFx0Zm9udC1zaXplOiAxNHB4O1xyXG5cdFx0XHRjb2xvcjogIzMzMztcclxuXHRcdH1cclxuXHJcblx0XHQuZm9vdGVyLWdlYXIge1xyXG5cdFx0XHR3aWR0aDogMjRweDtcclxuXHRcdFx0dGV4dC1hbGlnbjogY2VudGVyO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qIHZvaWNlIG92ZXJsYXkgKi9cclxuXHRcdC5yZWNvcmQtbWFzayB7XHJcblx0XHRcdHBvc2l0aW9uOiBmaXhlZDtcclxuXHRcdFx0bGVmdDogMDtcclxuXHRcdFx0cmlnaHQ6IDA7XHJcblx0XHRcdHRvcDogMDtcclxuXHRcdFx0Ym90dG9tOiAwO1xyXG5cdFx0XHRkaXNwbGF5OiBmbGV4O1xyXG5cdFx0XHRhbGlnbi1pdGVtczogY2VudGVyO1xyXG5cdFx0XHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuXHRcdFx0ei1pbmRleDogOTk5OTtcclxuXHRcdH1cclxuXHJcblx0XHQucmVjb3JkLWJveCB7XHJcblx0XHRcdGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgLjc1KTtcclxuXHRcdFx0Y29sb3I6ICNmZmY7XHJcblx0XHRcdHBhZGRpbmc6IDE2cHggMThweDtcclxuXHRcdFx0Ym9yZGVyLXJhZGl1czogMTJweDtcclxuXHRcdFx0ZGlzcGxheTogZmxleDtcclxuXHRcdFx0YWxpZ24taXRlbXM6IGNlbnRlcjtcclxuXHRcdFx0Z2FwOiAxMHB4O1xyXG5cdFx0XHRtaW4td2lkdGg6IDIyMHJweDtcclxuXHRcdH1cclxuXHJcblx0XHQucmVjb3JkLWJveC5jYW5jZWwge1xyXG5cdFx0XHRiYWNrZ3JvdW5kOiByZ2JhKDIyMSwgNDQsIDAsIC44NSk7XHJcblx0XHR9XHJcblxyXG5cdFx0LnJlY29yZC1pY29uIHtcclxuXHRcdFx0Zm9udC1zaXplOiAyMHB4O1xyXG5cdFx0fVxyXG5cclxuXHRcdC5yZWNvcmQtdGV4dCB7XHJcblx0XHRcdGZvbnQtc2l6ZTogMTRweDtcclxuXHRcdH1cclxuXHJcblx0XHQudGV4dC12b2ljZSB7XHJcblx0XHRcdGRpc3BsYXk6IGZsZXg7XHJcblx0XHRcdGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcblx0XHR9XHJcblxyXG5cdFx0LnZvaWNlLXBsYXkge1xyXG5cdFx0XHR3aWR0aDogMjBweDtcclxuXHRcdFx0bWFyZ2luLWxlZnQ6IDVweDtcclxuXHRcdH1cclxuXHRcdFxyXG5cdFx0Lm1hc2stbGF5ZXJ7XHJcblx0XHRcdHBvc2l0aW9uOiBmaXhlZDtcclxuXHRcdFx0bGVmdDogMDtcclxuXHRcdFx0cmlnaHQ6IDA7XHJcblx0XHRcdHRvcDogMDtcclxuXHRcdFx0Ym90dG9tOiAwO1xyXG5cdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIC4xKTtcclxuXHRcdH1cclxuXHRcdFxyXG5cdFx0XHJcblx0PC9zdHlsZT4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///51\n"); +eval("/* WEBPACK VAR INJECTION */(function(__f__) {\n\nvar _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ 1);\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _regenerator = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/regenerator */ 52));\nvar _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ 54));\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\nvar HISTORY_KEY = 'chat_history_groups';\nvar _default = {\n data: function data() {\n return {\n inputText: '',\n messages: [\n // {\n // \tid: 1,\n // \trole: 'user',\n // \ttype: 'text',\n // \tcontent: '帮我统计一下今日的销售数据',\n // \tinputType: 'text'\n // },\n // {\n // \tid: 2,\n // \trole: 'assistant',\n // \ttype: 'card',\n // \ttitle: '今日销售数据统计结果如下:',\n // \tcontent: '内容内容........................'\n // }\n ],\n scrollInto: '',\n drawerOpen: false,\n historyGroups: [],\n isRecording: false,\n isLoading: false,\n willCancel: false,\n recorder: null,\n recordStartY: 0,\n recordStartTs: 0,\n recordSimTimer: null,\n // show: false,\n innerAudioContext: null,\n popupVisible: false,\n typewriterTimers: {}\n };\n },\n computed: {\n timeOfDayText: function timeOfDayText() {\n var h = new Date().getHours();\n if (h < 6) return '凌晨好';\n if (h < 12) return '上午好';\n if (h < 18) return '下午好';\n return '晚上好';\n }\n },\n mounted: function mounted() {\n this.loadChatHistory();\n this.scrollToBottom();\n },\n beforeDestroy: function beforeDestroy() {\n // 清理所有打字机定时器\n Object.values(this.typewriterTimers).forEach(function (timer) {\n if (timer) clearInterval(timer);\n });\n this.typewriterTimers = {};\n // 清理录音定时器\n if (this.recordSimTimer) {\n clearTimeout(this.recordSimTimer);\n }\n },\n methods: {\n // 新增方法:上传音频并识别\n recognizeAudio: function recognizeAudio(tempFilePath) {\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {\n var fileInfo, uploadRes, result;\n return _regenerator.default.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n _context.prev = 0;\n __f__(\"log\", '开始语音识别,文件路径:', tempFilePath, \" at pages/index/index.vue:208\");\n\n // 获取文件信息\n _context.next = 4;\n return new Promise(function (resolve, reject) {\n uni.getFileInfo({\n filePath: tempFilePath,\n success: resolve,\n fail: reject\n });\n });\n case 4:\n fileInfo = _context.sent;\n __f__(\"log\", '文件大小:', fileInfo.size, \" at pages/index/index.vue:219\");\n\n // 使用 UniApp 的上传文件 API\n _context.next = 8;\n return new Promise(function (resolve, reject) {\n uni.uploadFile({\n // url: 'http://192.168.133.83:8000/recognize_speech',\n // url: 'http://192.168.10.44:8000/recognize_speech',\n // url: 'http://192.168.1.18:8000/recognize_speech',\n url: 'http://106.227.91.181:8000/recognize_speech',\n filePath: tempFilePath,\n name: 'speech',\n // 对应后端的 UploadFile 参数名\n formData: {\n 'format': 'amr',\n 'rate': 16000,\n 'channel': 1,\n 'cuid': 'uniapp_user',\n 'audio_len': fileInfo.size\n },\n success: function success(res) {\n __f__(\"log\", '上传响应:', res, \" at pages/index/index.vue:238\");\n if (res.statusCode === 200) {\n try {\n // 尝试解析返回的 JSON 数据\n var data = JSON.parse(res.data);\n resolve({\n statusCode: 200,\n data: data\n });\n } catch (e) {\n reject(new Error('响应解析失败: ' + e.message));\n }\n } else {\n reject(new Error(\"\\u4E0A\\u4F20\\u5931\\u8D25: \".concat(res.statusCode)));\n }\n },\n fail: function fail(err) {\n reject(new Error('上传请求失败: ' + err.errMsg));\n }\n });\n });\n case 8:\n uploadRes = _context.sent;\n __f__(\"log\", '语音识别响应:', uploadRes, \" at pages/index/index.vue:257\");\n result = uploadRes.data;\n if (!(result.status === 'success')) {\n _context.next = 15;\n break;\n }\n return _context.abrupt(\"return\", result.result);\n case 15:\n throw new Error(result.error || '识别失败');\n case 16:\n _context.next = 23;\n break;\n case 18:\n _context.prev = 18;\n _context.t0 = _context[\"catch\"](0);\n __f__(\"error\", '语音识别错误:', _context.t0, \" at pages/index/index.vue:266\");\n uni.showToast({\n title: '识别失败: ' + (_context.t0.message || '网络错误'),\n icon: 'none'\n });\n return _context.abrupt(\"return\", null);\n case 23:\n case \"end\":\n return _context.stop();\n }\n }\n }, _callee, null, [[0, 18]]);\n }))();\n },\n // ==================== 历史记录管理 ====================\n formatDate: function formatDate(date) {\n var y = date.getFullYear();\n var m = String(date.getMonth() + 1).padStart(2, '0');\n var d = String(date.getDate()).padStart(2, '0');\n return \"\".concat(y, \"\\u5E74\").concat(m, \"\\u6708\").concat(d, \"\\u65E5\");\n },\n loadChatHistory: function loadChatHistory() {\n try {\n var data = uni.getStorageSync(HISTORY_KEY);\n if (data && Array.isArray(data.groups)) {\n this.historyGroups = data.groups;\n } else {\n this.historyGroups = [];\n }\n } catch (e) {\n this.historyGroups = [];\n }\n },\n addToHistory: function addToHistory(text) {\n var _uni$getStorageSync;\n var groups = ((_uni$getStorageSync = uni.getStorageSync(HISTORY_KEY)) === null || _uni$getStorageSync === void 0 ? void 0 : _uni$getStorageSync.groups) || [];\n var today = this.formatDate(new Date());\n var todayGroup = groups.find(function (g) {\n return g.date === today;\n });\n if (!todayGroup) {\n todayGroup = {\n date: today,\n items: []\n };\n groups.unshift(todayGroup);\n }\n if (!todayGroup.items.includes(text)) {\n todayGroup.items.unshift(text);\n }\n\n // 限制大小\n if (todayGroup.items.length > 50) todayGroup.items = todayGroup.items.slice(0, 50);\n if (groups.length > 30) groups = groups.slice(0, 30);\n this.historyGroups = groups;\n uni.setStorageSync(HISTORY_KEY, {\n groups: groups,\n updatedAt: Date.now()\n });\n },\n removeFromHistory: function removeFromHistory(text) {\n var _uni$getStorageSync2;\n var groups = ((_uni$getStorageSync2 = uni.getStorageSync(HISTORY_KEY)) === null || _uni$getStorageSync2 === void 0 ? void 0 : _uni$getStorageSync2.groups) || [];\n groups.forEach(function (group) {\n group.items = group.items.filter(function (item) {\n return item !== text;\n });\n });\n groups = groups.filter(function (g) {\n return g.items.length > 0;\n });\n this.historyGroups = groups;\n uni.setStorageSync(HISTORY_KEY, {\n groups: groups,\n updatedAt: Date.now()\n });\n },\n clearAllHistory: function clearAllHistory() {\n var _this = this;\n uni.showModal({\n title: '清除全部',\n content: '将删除所有对话记录,此操作不可恢复',\n success: function success(res) {\n if (res.confirm) {\n uni.removeStorageSync(HISTORY_KEY);\n _this.historyGroups = [];\n uni.showToast({\n title: '已清除',\n icon: 'success'\n });\n }\n }\n });\n },\n onLongPressHistory: function onLongPressHistory(text) {\n var _this2 = this;\n uni.showModal({\n title: '删除记录',\n content: '确定删除这条对话记录?',\n success: function success(res) {\n if (res.confirm) {\n _this2.removeFromHistory(text);\n }\n }\n });\n },\n // 工具\n removeMessage: function removeMessage(id) {\n var idx = this.messages.findIndex(function (m) {\n return m.id === id;\n });\n if (idx > -1) this.messages.splice(idx, 1);\n },\n addAssistantMessage: function addAssistantMessage(id, content) {\n this.messages.push({\n id: id,\n role: 'assistant',\n type: 'text',\n content: content,\n displayText: ''\n });\n },\n getAIResponse: function getAIResponse(message) {\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2() {\n var _res$data, _res$data$result, url, headers, data, res;\n return _regenerator.default.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n _context2.prev = 0;\n // const url = 'http://192.168.133.83:9020/api/chat'\n // const url = 'http://192.168.10.44:9020/api/chat'\n url = 'http://106.227.91.181:9020/api/chat'; // 如需切换线上,改这里即可\n headers = {\n 'Content-Type': 'application/json'\n };\n data = {\n message: message\n }; // console.log(data)\n // const [error, res] = await uni.request({\n // url,\n // method: 'POST',\n // header: headers,\n // data\n // })\n // console.log(res)\n // 使用 Promise 风格\n _context2.next = 6;\n return new Promise(function (resolve, reject) {\n uni.request({\n url: url,\n method: 'POST',\n header: headers,\n data: data,\n success: function success(res) {\n return resolve(res);\n },\n fail: function fail(err) {\n return reject(err);\n }\n });\n });\n case 6:\n res = _context2.sent;\n __f__(\"log\", '请求响应:', res, \" at pages/index/index.vue:388\");\n if (!(res.statusCode !== 200)) {\n _context2.next = 10;\n break;\n }\n throw new Error(\"HTTP\\u9519\\u8BEF! \\u72B6\\u6001\\u7801: \".concat(res.statusCode));\n case 10:\n return _context2.abrupt(\"return\", ((_res$data = res.data) === null || _res$data === void 0 ? void 0 : (_res$data$result = _res$data.result) === null || _res$data$result === void 0 ? void 0 : _res$data$result.data) || '未获取到有效回复');\n case 13:\n _context2.prev = 13;\n _context2.t0 = _context2[\"catch\"](0);\n __f__(\"error\", 'AI请求错误:', _context2.t0, \" at pages/index/index.vue:397\");\n return _context2.abrupt(\"return\", \"\\u62B1\\u6B49\\uFF0C\\u51FA\\u4E86\\u70B9\\u95EE\\u9898: \".concat(_context2.t0.errMsg || _context2.t0.message));\n case 17:\n case \"end\":\n return _context2.stop();\n }\n }\n }, _callee2, null, [[0, 13]]);\n }))();\n },\n playVoice: function playVoice(voicePath) {\n if (!voicePath) {\n uni.showToast({\n title: '无可播放的语音',\n icon: 'none'\n });\n return;\n }\n if (!this.innerAudioContext) {\n this.innerAudioContext = uni.createInnerAudioContext();\n this.innerAudioContext.autoplay = false;\n this.innerAudioContext.onError(function () {\n uni.showToast({\n title: '播放失败',\n icon: 'none'\n });\n });\n }\n try {\n this.innerAudioContext.stop();\n } catch (e) {}\n __f__(\"log\", voicePath, \" at pages/index/index.vue:415\");\n this.innerAudioContext.src = voicePath;\n this.innerAudioContext.play();\n },\n onSettingTap: function onSettingTap() {\n uni.navigateTo({\n url: '/pages/setting/index'\n });\n },\n onSuggestionTap: function onSuggestionTap(text) {\n this.inputText = text;\n this.onSend();\n },\n onQuickAsk: function onQuickAsk(text) {\n this.inputText = text;\n this.onSend();\n },\n onSwitchModel: function onSwitchModel() {\n uni.showToast({\n title: '已切换为通用模型',\n icon: 'none'\n });\n },\n onInput: function onInput(e) {\n this.inputText = e.detail.value;\n },\n openDrawer: function openDrawer() {\n this.$refs.popup.open();\n },\n onPopupChange: function onPopupChange(e) {\n // e.show: true when opened, false when closed\n this.popupVisible = !!(e && e.show === true);\n },\n // ===== Voice input (WeChat-like) =====\n ensureRecorder: function ensureRecorder() {\n var _this3 = this;\n if (this.recorder) return;\n try {\n this.recorder = uni.getRecorderManager && uni.getRecorderManager();\n } catch (e) {\n this.recorder = null;\n }\n if (this.recorder) {\n this.recorder.onStart();\n this.recorder.onStop( /*#__PURE__*/function () {\n var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(res) {\n var duration, tempFilePath, recognizedText;\n return _regenerator.default.wrap(function _callee3$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n duration = Date.now() - _this3.recordStartTs;\n tempFilePath = res.tempFilePath; // 添加这行,从res中获取文件路径\n if (!(_this3.willCancel || duration < 700)) {\n _context3.next = 5;\n break;\n }\n uni.showToast({\n title: duration < 700 ? '说话时间太短' : '已取消',\n icon: 'none'\n });\n return _context3.abrupt(\"return\");\n case 5:\n // 显示加载\n uni.showLoading({\n title: '识别中...'\n });\n\n // TODO: 上传 res.tempFilePath 做识别;现用 mock\n // this.handleRecognizedText(this.mockSpeechToText(duration), res.tempFilePath, Math.ceil(\n // \tduration / 100) / 10)\n // 真实识别\n _context3.next = 8;\n return _this3.recognizeAudio(tempFilePath);\n case 8:\n recognizedText = _context3.sent;\n uni.hideLoading();\n if (recognizedText) {\n // 成功:填入输入框\n _this3.inputText = recognizedText;\n _this3.$nextTick(function () {\n // 可选:自动发送\n // this.onSend('voice', tempFilePath, Math.ceil(duration / 100) / 10);\n });\n }\n case 11:\n case \"end\":\n return _context3.stop();\n }\n }\n }, _callee3);\n }));\n return function (_x) {\n return _ref.apply(this, arguments);\n };\n }());\n }\n },\n onPressMic: function onPressMic(e) {\n this.ensureRecorder();\n this.isRecording = true;\n // this.show = true\n this.willCancel = false;\n this.recordStartTs = Date.now();\n this.recordStartY = e.changedTouches && e.changedTouches[0] ? e.changedTouches[0].clientY : 0;\n if (this.recorder) {\n try {\n this.recorder.start({\n format: 'amr',\n sampleRate: 16000,\n encodeBitRate: 16000,\n // 编码比特率\n frameSize: 4,\n // 帧大小\n numberOfChannels: 1,\n duration: 60000\n });\n } catch (err) {}\n } else {\n if (this.recordSimTimer) clearTimeout(this.recordSimTimer);\n this.recordSimTimer = setTimeout(function () {}, 60000);\n }\n },\n onMoveMic: function onMoveMic(e) {\n if (!this.isRecording) return;\n var y = e.changedTouches && e.changedTouches[0] ? e.changedTouches[0].clientY : 0;\n this.willCancel = this.recordStartY - y > 60;\n },\n onReleaseMic: function onReleaseMic() {\n __f__(\"log\", 'onReleaseMic', \" at pages/index/index.vue:517\");\n if (!this.isRecording) return;\n var cancel = this.willCancel;\n this.isRecording = false;\n this.show = false;\n if (this.recorder) {\n try {\n this.recorder.stop();\n } catch (err) {\n __f__(\"log\", 'err', err, \" at pages/index/index.vue:526\");\n }\n }\n },\n handleRecognizedText: function handleRecognizedText(text, tempFilePath, duration) {\n if (!text) return;\n this.inputText = text;\n this.onSend('voice', tempFilePath, duration); // 传 'voice'\n },\n mockSpeechToText: function mockSpeechToText(ms) {\n var sec = Math.ceil(ms / 100) / 10;\n var pool = [\"\\u8BED\\u97F3\\u8F93\\u5165 \".concat(sec, \"s\\uFF0C\\u6A21\\u62DF\\u8BC6\\u522B\\uFF1A\\u5E2E\\u6211\\u7EDF\\u8BA1\\u4ECA\\u5929\\u9500\\u552E\\u989D\"), \"\\u8BED\\u97F3\\u8F93\\u5165 \".concat(sec, \"s\\uFF0C\\u6A21\\u62DF\\u8BC6\\u522B\\uFF1A\\u67E5\\u8BE2\\u8BA2\\u535520388993483\"), \"\\u8BED\\u97F3\\u8F93\\u5165 \".concat(sec, \"s\\uFF0C\\u6A21\\u62DF\\u8BC6\\u522B\\uFF1A\\u751F\\u6210\\u65E5\\u62A5\")];\n return pool[Math.floor(Math.random() * pool.length)];\n },\n onHistoryItemTap: function onHistoryItemTap(text) {\n this.inputText = text;\n this.onSend();\n this.$refs.popup.close();\n },\n onSend: function onSend() {\n var _arguments = arguments,\n _this4 = this;\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4() {\n var inputType, inputContent, duration, text, baseId, loadingId, reply, loadingIdx, replyId, _loadingIdx;\n return _regenerator.default.wrap(function _callee4$(_context4) {\n while (1) {\n switch (_context4.prev = _context4.next) {\n case 0:\n inputType = _arguments.length > 0 && _arguments[0] !== undefined ? _arguments[0] : 'text';\n inputContent = _arguments.length > 1 && _arguments[1] !== undefined ? _arguments[1] : '';\n duration = _arguments.length > 2 && _arguments[2] !== undefined ? _arguments[2] : undefined;\n text = (_this4.inputText || '').trim();\n if (!(!text || _this4.isLoading)) {\n _context4.next = 6;\n break;\n }\n return _context4.abrupt(\"return\");\n case 6:\n baseId = Date.now(); // 1. 用户消息\n _this4.messages.push({\n id: baseId,\n role: 'user',\n type: 'text',\n content: text,\n inputType: inputType,\n inputContent: inputContent,\n duration: duration\n });\n\n // 2. loading 消息\n loadingId = baseId + 0.5;\n _this4.messages.push({\n id: loadingId,\n role: 'assistant',\n loading: true\n });\n _this4.scrollToBottom();\n _this4.inputText = '';\n _this4.isLoading = true;\n _this4.addToHistory(text);\n _context4.prev = 14;\n _context4.next = 17;\n return _this4.getAIResponse(text);\n case 17:\n reply = _context4.sent;\n // 4. 移除 loading\n loadingIdx = _this4.messages.findIndex(function (m) {\n return m.id === loadingId;\n });\n if (loadingIdx > -1) _this4.messages.splice(loadingIdx, 1);\n\n // 5. 添加回复 + 打字机\n replyId = baseId + 1;\n _this4.messages.push({\n id: replyId,\n role: 'assistant',\n type: 'text',\n content: reply,\n displayText: ''\n });\n _this4.typewriter(replyId, reply);\n _context4.next = 30;\n break;\n case 25:\n _context4.prev = 25;\n _context4.t0 = _context4[\"catch\"](14);\n // 出错时也展示\n _loadingIdx = _this4.messages.findIndex(function (m) {\n return m.id === loadingId;\n });\n if (_loadingIdx > -1) _this4.messages.splice(_loadingIdx, 1);\n _this4.messages.push({\n id: baseId + 1,\n role: 'assistant',\n content: \"\\u8BF7\\u6C42\\u51FA\\u9519\\uFF1A\".concat(_context4.t0.message || _context4.t0)\n });\n case 30:\n _context4.prev = 30;\n _this4.isLoading = false;\n _this4.$nextTick(function () {\n return _this4.scrollToBottom();\n });\n return _context4.finish(30);\n case 34:\n case \"end\":\n return _context4.stop();\n }\n }\n }, _callee4, null, [[14, 25, 30, 34]]);\n }))();\n },\n typewriter: function typewriter(messageId, fullText) {\n var _this5 = this;\n var msg = this.messages.find(function (m) {\n return m.id === messageId;\n });\n if (!msg) return;\n // 清理之前的定时器(如果存在)\n if (this.typewriterTimers[messageId]) {\n clearInterval(this.typewriterTimers[messageId]);\n }\n var index = 0;\n msg.displayText = fullText.substring(0, index + 1);\n index += 1;\n var speed = 50; // 每个字符间隔50ms\n var timer = setInterval(function () {\n if (index < fullText.length) {\n msg.displayText = fullText.substring(0, index + 1);\n index++;\n // 打字过程中自动滚动到底部\n _this5.$nextTick(function () {\n _this5.scrollToBottom();\n });\n } else {\n clearInterval(timer);\n delete _this5.typewriterTimers[messageId];\n // 完成后使用完整文本\n msg.displayText = fullText;\n }\n }, speed);\n this.typewriterTimers[messageId] = timer;\n },\n scrollToBottom: function scrollToBottom() {\n var self = this;\n this.$nextTick(function () {\n uni.createSelectorQuery().select('.content').boundingClientRect(function (rect) {\n if (self.height !== rect.height) {\n self.height = rect.height;\n uni.pageScrollTo({\n scrollTop: rect.height,\n duration: 300,\n class: '.content'\n });\n }\n }).exec();\n });\n },\n mockReply: function mockReply(text) {\n var candidates = ['好的,我已经为您处理。', '收到请求,以下是结果的概览。', '我理解了,这是一个示例回复。', '已记录,稍后将完善报表。'];\n var pick = candidates[Math.floor(Math.random() * candidates.length)];\n return pick + '(已收到:“' + text + '”)';\n },\n onListen: function onListen(text) {\n try {\n // H5: Web Speech API\n if (typeof window !== 'undefined' && window.speechSynthesis) {\n var u = new SpeechSynthesisUtterance(String(text));\n u.lang = 'zh-CN';\n u.rate = 1;\n u.pitch = 1;\n window.speechSynthesis.cancel();\n window.speechSynthesis.speak(u);\n return;\n }\n } catch (e) {}\n uni.showToast({\n title: '当前端不支持语音播放',\n icon: 'none'\n });\n }\n }\n};\nexports.default = _default;\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./node_modules/@dcloudio/vue-cli-plugin-uni/lib/format-log.js */ 35)[\"default\"]))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInVuaS1hcHA6Ly8vcGFnZXMvaW5kZXgvaW5kZXgudnVlIl0sIm5hbWVzIjpbImRhdGEiLCJpbnB1dFRleHQiLCJtZXNzYWdlcyIsInNjcm9sbEludG8iLCJkcmF3ZXJPcGVuIiwiaGlzdG9yeUdyb3VwcyIsImlzUmVjb3JkaW5nIiwiaXNMb2FkaW5nIiwid2lsbENhbmNlbCIsInJlY29yZGVyIiwicmVjb3JkU3RhcnRZIiwicmVjb3JkU3RhcnRUcyIsInJlY29yZFNpbVRpbWVyIiwiaW5uZXJBdWRpb0NvbnRleHQiLCJwb3B1cFZpc2libGUiLCJ0eXBld3JpdGVyVGltZXJzIiwiY29tcHV0ZWQiLCJ0aW1lT2ZEYXlUZXh0IiwibW91bnRlZCIsImJlZm9yZURlc3Ryb3kiLCJPYmplY3QiLCJjbGVhclRpbWVvdXQiLCJtZXRob2RzIiwicmVjb2duaXplQXVkaW8iLCJ1bmkiLCJmaWxlUGF0aCIsInN1Y2Nlc3MiLCJmYWlsIiwiZmlsZUluZm8iLCJ1cmwiLCJuYW1lIiwiZm9ybURhdGEiLCJyZXNvbHZlIiwic3RhdHVzQ29kZSIsInJlamVjdCIsInVwbG9hZFJlcyIsInJlc3VsdCIsInRpdGxlIiwiaWNvbiIsImZvcm1hdERhdGUiLCJsb2FkQ2hhdEhpc3RvcnkiLCJhZGRUb0hpc3RvcnkiLCJ0b2RheUdyb3VwIiwiZGF0ZSIsIml0ZW1zIiwiZ3JvdXBzIiwidXBkYXRlZEF0IiwicmVtb3ZlRnJvbUhpc3RvcnkiLCJncm91cCIsImNsZWFyQWxsSGlzdG9yeSIsImNvbnRlbnQiLCJvbkxvbmdQcmVzc0hpc3RvcnkiLCJyZW1vdmVNZXNzYWdlIiwiYWRkQXNzaXN0YW50TWVzc2FnZSIsImlkIiwicm9sZSIsInR5cGUiLCJkaXNwbGF5VGV4dCIsImdldEFJUmVzcG9uc2UiLCJoZWFkZXJzIiwibWVzc2FnZSIsIm1ldGhvZCIsImhlYWRlciIsInJlcyIsInBsYXlWb2ljZSIsIm9uU2V0dGluZ1RhcCIsIm9uU3VnZ2VzdGlvblRhcCIsIm9uUXVpY2tBc2siLCJvblN3aXRjaE1vZGVsIiwib25JbnB1dCIsIm9wZW5EcmF3ZXIiLCJvblBvcHVwQ2hhbmdlIiwiZW5zdXJlUmVjb3JkZXIiLCJkdXJhdGlvbiIsInRlbXBGaWxlUGF0aCIsInJlY29nbml6ZWRUZXh0Iiwib25QcmVzc01pYyIsImZvcm1hdCIsInNhbXBsZVJhdGUiLCJlbmNvZGVCaXRSYXRlIiwiZnJhbWVTaXplIiwibnVtYmVyT2ZDaGFubmVscyIsIm9uTW92ZU1pYyIsIm9uUmVsZWFzZU1pYyIsImhhbmRsZVJlY29nbml6ZWRUZXh0IiwibW9ja1NwZWVjaFRvVGV4dCIsInNlYyIsIm9uSGlzdG9yeUl0ZW1UYXAiLCJvblNlbmQiLCJpbnB1dFR5cGUiLCJpbnB1dENvbnRlbnQiLCJ0ZXh0IiwiYmFzZUlkIiwibG9hZGluZ0lkIiwibG9hZGluZyIsInJlcGx5IiwibG9hZGluZ0lkeCIsInJlcGx5SWQiLCJ0eXBld3JpdGVyIiwiY2xlYXJJbnRlcnZhbCIsIm1zZyIsImluZGV4Iiwic2Nyb2xsVG9Cb3R0b20iLCJzZWxmIiwic2Nyb2xsVG9wIiwiY2xhc3MiLCJtb2NrUmVwbHkiLCJvbkxpc3RlbiIsInUiLCJ3aW5kb3ciXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTZJQTtBQUFBLGVBQ0E7RUFDQUE7SUFDQTtNQUNBQztNQUNBQztRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7TUFBQSxDQUNBO01BQ0FDO01BQ0FDO01BQ0FDLGlCQUNBO01BQ0FDO01BQ0FDO01BQ0FDO01BQ0FDO01BQ0FDO01BQ0FDO01BQ0FDO01BQ0E7TUFDQUM7TUFDQUM7TUFDQUM7SUFDQTtFQUNBO0VBQ0FD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QUNBLGtCQUNBLGtCQUNBLGVBQ0E7TUFDQTtNQUNBO0lBQ0E7SUFDQUM7TUFDQTtRQUNBO1FBQ0E7VUFDQTtVQUNBQztVQUNBQTtVQUNBQTtVQUNBQztVQUNBQTtVQUNBO1FBQ0E7TUFDQTtNQUNBckY7UUFDQWE7UUFDQUM7TUFDQTtJQUNBO0VBQ0E7QUFDQTtBQUFBLDJCIiwiZmlsZSI6IjUxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXHQ8dGVtcGxhdGU+XHJcblx0XHQ8dmlldyBjbGFzcz1cImFpLXBhZ2VcIj5cclxuXHRcdFx0PHVuaS1uYXYtYmFyICBsZWZ0LWljb249XCJsZWZ0XCIgQGNsaWNrTGVmdD1cIm9wZW5EcmF3ZXJcIiB0aXRsZT1cIkFJ5a+56K+dXCI+XHJcblx0XHRcdFx0PHRlbXBsYXRlIHYtc2xvdDpsZWZ0PlxyXG5cdFx0XHRcdFx0PHZpZXcgY2xhc3M9XCJoYW1idXJnZXJcIj5cclxuXHRcdFx0XHRcdFx0PHZpZXcgY2xhc3M9XCJsaW5lXCIgLz5cclxuXHRcdFx0XHRcdFx0PHZpZXcgY2xhc3M9XCJsaW5lXCIgLz5cclxuXHRcdFx0XHRcdFx0PHZpZXcgY2xhc3M9XCJsaW5lXCIgLz5cclxuXHRcdFx0XHRcdDwvdmlldz5cclxuXHRcdFx0XHQ8L3RlbXBsYXRlPlxyXG5cdFx0XHRcdDx0ZW1wbGF0ZSB2LXNsb3Q6cmlnaHQ+XHJcblx0XHRcdFx0XHQ8dmlldyBjbGFzcz1cIm5hdi1yaWdodFwiPlxyXG5cdFx0XHRcdFx0XHQ8IS0tIDx2aWV3IGNsYXNzPVwiZ2VhclwiIEB0YXA9XCJvblNldHRpbmdUYXBcIj7impnvuI88L3ZpZXc+IC0tPlxyXG5cdFx0XHRcdFx0XHQ8aW1hZ2Ugc3JjPVwiLi4vLi4vc3RhdGljL3NldC5wbmdcIiBtb2RlPVwid2lkdGhGaXhcIiBAdGFwPVwib25TZXR0aW5nVGFwXCIgc3R5bGU9XCJ3aWR0aDogMThweDtcIj48L2ltYWdlPlxyXG5cdFx0XHRcdFx0PC92aWV3PlxyXG5cdFx0XHRcdDwvdGVtcGxhdGU+XHJcblx0XHRcdDwvdW5pLW5hdi1iYXI+XHJcblx0XHRcdDwhLS0gc2Nyb2xsYWJsZSBjb250ZW50IC0tPlxyXG5cdFx0XHQ8c2Nyb2xsLXZpZXcgY2xhc3M9XCJjb250ZW50XCIgOnNjcm9sbC15PVwidHJ1ZVwiIHNob3ctc2Nyb2xsYmFyPVwiZmFsc2VcIiBcclxuXHRcdFx0XHRzY3JvbGwtd2l0aC1hbmltYXRpb24gcmVmPVwic2Nyb2xsVmlld1wiPlxyXG5cdFx0XHRcdDwhLS0gZ3JlZXRpbmcgY2FyZCAtLT5cdFxyXG5cdFx0XHRcdDx2aWV3IGNsYXNzPVwiZ3JlZXQtY2FyZFwiPlxyXG5cdFx0XHRcdFx0XHQ8aW1hZ2Ugc3JjPVwiLi4vLi4vc3RhdGljL2FpLndlYnBcIiBtb2RlPVwid2lkdGhGaXhcIiBzdHlsZT1cIndpZHRoOiA2MHB4O21hcmdpbi1yaWdodDogMTBweDtcIj48L2ltYWdlPlxyXG5cdFx0XHRcdFx0PHZpZXcgY2xhc3M9XCJncmVldC10ZXh0XCI+XHJcblx0XHRcdFx0XHRcdDx2aWV3IGNsYXNzPVwiaGlcIj5ISe+8jHt7IHRpbWVPZkRheVRleHQgfX08L3ZpZXc+XHJcblx0XHRcdFx0XHRcdDx2aWV3IGNsYXNzPVwic3ViXCI+5oiR5piv6JCD5pif56eR5oqA5pm66IO95L2TPC92aWV3PlxyXG5cdFx0XHRcdFx0PC92aWV3PlxyXG5cdFx0XHRcdDwvdmlldz5cclxuXHJcblx0XHRcdFx0PCEtLSB3ZWxjb21lIHNlbnRlbmNlIC0tPlxyXG5cdFx0XHRcdDx2aWV3IGNsYXNzPVwid2VsY29tZVwiPlxyXG5cdFx0XHRcdFx05oKo5aW977yB6Z2e5bi46auY5YW05LiO5oKo5Lqk5rWB77yM5LuK5aSp5pyJ5LuA5LmI5Y+v5Lul5biu5Yiw5oKo77yfXHJcblx0XHRcdFx0PC92aWV3PlxyXG5cclxuXHRcdFx0XHQ8IS0tIHN1Z2dlc3Rpb25zIC0tPlxyXG5cdFx0XHRcdDx2aWV3IGNsYXNzPVwiZ3Vlc3MtcGFuZWxcIj5cclxuXHRcdFx0XHRcdDx2aWV3IGNsYXNzPVwiZ3Vlc3MtdGl0bGVcIj7njJzkvaDmg7Ppl648L3ZpZXc+XHJcblx0XHRcdFx0XHQ8dmlldyBjbGFzcz1cImd1ZXNzLWxpc3RcIj5cclxuXHRcdFx0XHRcdFx0PHZpZXcgY2xhc3M9XCJndWVzcy1pdGVtXCIgQHRhcD1cIm9uU3VnZ2VzdGlvblRhcCgn5LuK5pel5Ye65YWl5bqT5pWw5o2uJylcIj5cclxuXHRcdFx0XHRcdFx0XHQ8dGV4dD7ku4rml6Xlh7rlhaXlupPmlbDmja48L3RleHQ+XHJcblx0XHRcdFx0XHRcdFx0PHRleHQgY2xhc3M9XCJhcnJvd1wiPuKAujwvdGV4dD5cclxuXHRcdFx0XHRcdFx0PC92aWV3PlxyXG5cdFx0XHRcdFx0XHQ8dmlldyBjbGFzcz1cImd1ZXNzLWl0ZW1cIiBAdGFwPVwib25TdWdnZXN0aW9uVGFwKCfku4rml6XplIDllK7mlbDmja4nKVwiPlxyXG5cdFx0XHRcdFx0XHRcdDx0ZXh0PuS7iuaXpemUgOWUruaVsOaNrjwvdGV4dD5cclxuXHRcdFx0XHRcdFx0XHQ8dGV4dCBjbGFzcz1cImFycm93XCI+4oC6PC90ZXh0PlxyXG5cdFx0XHRcdFx0XHQ8L3ZpZXc+XHJcblx0XHRcdFx0XHRcdDx2aWV3IGNsYXNzPVwiZ3Vlc3MtaXRlbVwiIEB0YXA9XCJvblN1Z2dlc3Rpb25UYXAoJ+S7iuaXpeeUn+S6p+aVsOaNricpXCI+XHJcblx0XHRcdFx0XHRcdFx0PHRleHQ+5LuK5pel55Sf5Lqn5pWw5o2uPC90ZXh0PlxyXG5cdFx0XHRcdFx0XHRcdDx0ZXh0IGNsYXNzPVwiYXJyb3dcIj7igLo8L3RleHQ+XHJcblx0XHRcdFx0XHRcdDwvdmlldz5cclxuXHRcdFx0XHRcdDwvdmlldz5cclxuXHRcdFx0XHQ8L3ZpZXc+XHJcblxyXG5cdFx0XHRcdDwhLS0gY29udmVyc2F0aW9uIC0tPlxyXG5cdFx0XHRcdDx2aWV3IGNsYXNzPVwiY2hhdFwiPlxyXG5cdFx0XHRcdFx0PHZpZXcgdi1mb3I9XCJtIGluIG1lc3NhZ2VzXCIgOmtleT1cIm0uaWRcIiA6aWQ9XCInbXNnLScgKyBtLmlkXCIgOmNsYXNzPVwiWydtc2cnLCBtLnJvbGVdXCI+XHJcblx0XHRcdFx0XHRcdDx2aWV3IHYtaWY9XCJtLnJvbGUgPT09ICd1c2VyJ1wiIGNsYXNzPVwiYnViYmxlIHVzZXItYnViYmxlXCI+XHJcblx0XHRcdFx0XHRcdFx0PHRleHQgdi1pZj1cIm0uaW5wdXRUeXBlID09PSAndGV4dCdcIj57eyBtLmNvbnRlbnQgfX08L3RleHQ+XHJcblx0XHRcdFx0XHRcdFx0PHZpZXcgY2xhc3M9XCJ0ZXh0LXZvaWNlXCIgdi1lbHNlIEB0YXA9XCJwbGF5Vm9pY2UobS5pbnB1dENvbnRlbnQsbS5pZClcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZXh0Pnt7bS5kdXJhdGlvbiB9fTwvdGV4dD5cclxuXHRcdFx0XHRcdFx0XHRcdDxpbWFnZSBjbGFzcz1cInZvaWNlLXBsYXlcIiBzcmM9XCIuLi8uLi9zdGF0aWMvdm9pY2UtcGxheS5wbmdcIiBtb2RlPVwid2lkdGhGaXhcIj48L2ltYWdlPlxyXG5cdFx0XHRcdFx0XHRcdDwvdmlldz5cclxuXHJcblx0XHRcdFx0XHRcdDwvdmlldz5cclxuXHRcdFx0XHRcdFx0PHZpZXcgdi1lbHNlIGNsYXNzPVwiYnViYmxlIGFpLWJ1YmJsZVwiPlxyXG5cdFx0XHRcdFx0XHRcdDx2aWV3IHYtaWY9XCJtLnR5cGUgPT09ICdjYXJkJ1wiIGNsYXNzPVwiYWktY2FyZFwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0PHZpZXcgY2xhc3M9XCJhaS1jYXJkLXRpdGxlXCI+e3sgbS50aXRsZSB9fTwvdmlldz5cclxuXHRcdFx0XHRcdFx0XHRcdDx2aWV3IGNsYXNzPVwiYWktY2FyZC1ib2R5XCI+e3sgbS5jb250ZW50IH19PC92aWV3PlxyXG5cdFx0XHRcdFx0XHRcdDwvdmlldz5cclxuXHRcdFx0XHRcdFx0XHQ8dmlldyB2LWVsc2UtaWY9XCJtLmxvYWRpbmdcIiBjbGFzcz1cImFpLWxvYWRpbmdcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDx2aWV3IGNsYXNzPVwibG9hZGluZy1kb3RcIj48L3ZpZXc+XHJcblx0XHRcdFx0XHRcdFx0XHQ8dmlldyBjbGFzcz1cImxvYWRpbmctZG90XCI+PC92aWV3PlxyXG5cdFx0XHRcdFx0XHRcdFx0PHZpZXcgY2xhc3M9XCJsb2FkaW5nLWRvdFwiPjwvdmlldz5cclxuXHRcdFx0XHRcdFx0XHQ8L3ZpZXc+XHJcblx0XHRcdFx0XHRcdFx0PHZpZXcgdi1lbHNlPlxyXG5cdFx0XHRcdFx0XHRcdFx0PHRleHQ+e3sgbS5kaXNwbGF5VGV4dCAhPT0gdW5kZWZpbmVkID8gbS5kaXNwbGF5VGV4dCA6IG0uY29udGVudCB9fTwvdGV4dD5cclxuXHRcdFx0XHRcdFx0XHRcdDwhLS0gPHRleHQgY2xhc3M9XCJsaXN0ZW4tYnRuXCIgQHRhcD1cIm9uTGlzdGVuKG0uY29udGVudClcIj7wn5SKPC90ZXh0PiAtLT5cclxuXHRcdFx0XHRcdFx0XHQ8L3ZpZXc+XHJcblx0XHRcdFx0XHRcdDwvdmlldz5cclxuXHRcdFx0XHRcdDwvdmlldz5cclxuXHRcdFx0XHQ8L3ZpZXc+XHJcblxyXG5cdFx0XHRcdDx2aWV3IHN0eWxlPVwiaGVpZ2h0OiAxMnB4O1wiIC8+XHJcblx0XHRcdDwvc2Nyb2xsLXZpZXc+XHJcblxyXG5cdFx0XHQ8IS0tIGJvdHRvbSBkb2NrOiBxdWljayBhY3Rpb25zICsgaW5wdXQgYmFyIC0tPlxyXG5cdFx0XHQ8dmlldyBjbGFzcz1cImRvY2tcIj5cclxuXHRcdFx0XHQ8c2Nyb2xsLXZpZXcgY2xhc3M9XCJxdWljay1hY3Rpb25zIGhvcml6b250YWxcIiBzY3JvbGwteCBzaG93LXNjcm9sbGJhcj1cImZhbHNlXCI+XHJcblx0XHRcdFx0XHQ8dmlldyBjbGFzcz1cInFhLWJ0biBtaW5vclwiIEB0YXA9XCJvblN3aXRjaE1vZGVsXCI+5YiH5o2i5qih5Z6LPC92aWV3PlxyXG5cdFx0XHRcdFx0PHZpZXcgY2xhc3M9XCJxYS1idG5cIiBAdGFwPVwib25RdWlja0Fzaygn5L2g5piv6LCB77yfJylcIj7oh6rmiJHku4vnu408L3ZpZXc+XHJcblx0XHRcdFx0XHQ8dmlldyBjbGFzcz1cInFhLWJ0blwiIEB0YXA9XCJvblF1aWNrQXNrKCfku4rml6Xku7vliqHmnInlk6rkupvvvJ8nKVwiPuW/q+aNt+aPkOmXrjwvdmlldz5cclxuXHRcdFx0XHRcdDx2aWV3IGNsYXNzPVwicWEtYnRuXCIgQHRhcD1cIm9uUXVpY2tBc2soJ+WxleekuuS4gOS7veaKpeihqOekuuS+iycpXCI+5b+r5o235o+Q6ZeuPC92aWV3PlxyXG5cdFx0XHRcdFx0PHZpZXcgY2xhc3M9XCJxYS1idG5cIiBAdGFwPVwib25RdWlja0Fzaygn55Sf5oiQ5pel5oql5qih54mIJylcIj7lv6vmjbfmj5Dpl648L3ZpZXc+XHJcblx0XHRcdFx0PC9zY3JvbGwtdmlldz5cclxuXHRcdFx0XHQ8dmlldyBjbGFzcz1cImlucHV0LWJhclwiPlxyXG5cdFx0XHRcdFx0PGlucHV0IGNsYXNzPVwiaW5wdXRcIiBjb25maXJtLXR5cGU9XCJzZW5kXCIgOnZhbHVlPVwiaW5wdXRUZXh0XCIgQGlucHV0PVwib25JbnB1dFwiIEBjb25maXJtPVwib25TZW5kKClcIlxyXG5cdFx0XHRcdFx0XHRwbGFjZWhvbGRlcj1cIuS9oOWPr+S7peivtOKAplwiIHBsYWNlaG9sZGVyLWNsYXNzPVwicGhcIiAvPlxyXG5cdFx0XHRcdFx0PHZpZXcgOmNsYXNzPVwiWydtaWMnLCB7IHJlY29yZGluZzogaXNSZWNvcmRpbmcgfV1cIiBAdG91Y2hzdGFydC5zdG9wPVwib25QcmVzc01pY1wiXHJcblx0XHRcdFx0XHRcdEB0b3VjaG1vdmUuc3RvcD1cIm9uTW92ZU1pY1wiIEB0b3VjaGVuZC5zdG9wPVwib25SZWxlYXNlTWljXCI+8J+Ome+4jzwvdmlldz5cclxuXHRcdFx0XHRcdDxidXR0b24gY2xhc3M9XCJzZW5kXCIgdHlwZT1cInByaW1hcnlcIiBAdGFwPVwib25TZW5kXCI+5Y+R6YCBPC9idXR0b24+XHJcblx0XHRcdFx0PC92aWV3PlxyXG5cdFx0XHQ8L3ZpZXc+XHJcblxyXG5cdFx0XHQ8IS0tIGxlZnQgZHJhd2VyIC0tPuOAgVxyXG5cdFx0XHQ8dW5pLXBvcHVwIHJlZj1cInBvcHVwXCIgYmFja2dyb3VuZC1jb2xvcj1cIiNmZmZcIiB0eXBlPVwibGVmdFwiIDp6LWluZGV4PVwiMTAwOTBcIiBAY2hhbmdlPVwib25Qb3B1cENoYW5nZVwiIHN0eWxlPVwiei1pbmRleDogOTk5OTk7d2lkdGg6IDEwMHZ3XCIgPlxyXG5cdFx0XHRcdDx2aWV3IGNsYXNzPVwiZHJhd2VyLW1hc2tcIj5cclxuXHRcdFx0XHRcdDx2aWV3IGNsYXNzPVwiZHJhd2VyXCI+XHJcblx0XHRcdFx0XHRcdDxzY3JvbGwtdmlldyBjbGFzcz1cImRyYXdlci1zY3JvbGxcIiBzY3JvbGwteSBzaG93LXNjcm9sbGJhcj1cImZhbHNlXCI+XHJcblx0XHRcdFx0XHRcdFx0PHZpZXcgdi1mb3I9XCJnIGluIGhpc3RvcnlHcm91cHNcIiA6a2V5PVwiZy5kYXRlXCIgY2xhc3M9XCJkcmF3ZXItZ3JvdXBcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDx2aWV3IGNsYXNzPVwiZHJhd2VyLWRhdGVcIj57eyBnLmRhdGUgfX08L3ZpZXc+XHJcblx0XHRcdFx0XHRcdFx0XHQ8dmlldyB2LWZvcj1cIih0LCBpZHgpIGluIGcuaXRlbXNcIiA6a2V5PVwiaWR4XCIgY2xhc3M9XCJkcmF3ZXItaXRlbVwiIEB0YXA9XCJvbkhpc3RvcnlJdGVtVGFwKHQpXCIgQGxvbmdwcmVzcz1cIm9uTG9uZ1ByZXNzSGlzdG9yeSh0KVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHR7eyB0IH19XHJcblx0XHRcdFx0XHRcdFx0XHQ8L3ZpZXc+XHJcblx0XHRcdFx0XHRcdFx0XHQ8dmlldyBjbGFzcz1cImRyYXdlci1kaXZpZGVyXCIgLz5cclxuXHRcdFx0XHRcdFx0XHQ8L3ZpZXc+XHJcblx0XHRcdFx0XHRcdDwvc2Nyb2xsLXZpZXc+XHJcblx0XHRcdFx0XHRcdDx2aWV3IGNsYXNzPVwiZHJhd2VyLWZvb3RlclwiPlxyXG5cdFx0XHRcdFx0XHRcdDx2aWV3IGNsYXNzPVwidXNlci1pY29uXCI+8J+RpDwvdmlldz5cclxuXHRcdFx0XHRcdFx0XHQ8dGV4dCBjbGFzcz1cInVzZXItbmFtZVwiPueUqOaIt+WQjTwvdGV4dD5cclxuXHRcdFx0XHRcdFx0XHQ8dmlldyBjbGFzcz1cImZvb3Rlci1nZWFyXCIgQHRhcD1cImNsZWFyQWxsSGlzdG9yeVwiPuKame+4jzwvdmlldz5cclxuXHRcdFx0XHRcdFx0PC92aWV3PlxyXG5cdFx0XHRcdFx0PC92aWV3PlxyXG5cdFx0XHRcdDwvdmlldz5cclxuXHRcdFx0PC91bmktcG9wdXA+XHJcblxyXG5cdFx0XHQ8IS0tIFZvaWNlIHJlY29yZGluZyBvdmVybGF5IC0tPlxyXG5cdFx0XHQ8dmlldyB2LWlmPVwiaXNSZWNvcmRpbmdcIiBjbGFzcz1cInJlY29yZC1tYXNrXCI+XHJcblx0XHRcdFx0PHZpZXcgY2xhc3M9XCJyZWNvcmQtYm94XCIgOmNsYXNzPVwieyBjYW5jZWw6IHdpbGxDYW5jZWwgfVwiPlxyXG5cdFx0XHRcdFx0PHZpZXcgY2xhc3M9XCJyZWNvcmQtaWNvblwiPvCfjpnvuI88L3ZpZXc+XHJcblx0XHRcdFx0XHQ8dmlldyBjbGFzcz1cInJlY29yZC10ZXh0XCI+e3sgd2lsbENhbmNlbCA/ICfmnb7lvIDmiYvmjIfvvIzlj5bmtojlj5HpgIEnIDogJ+aJi+aMh+S4iua7ke+8jOWPlua2iOWPkemAgScgfX08L3ZpZXc+XHJcblx0XHRcdFx0PC92aWV3PlxyXG5cdFx0XHQ8L3ZpZXc+XHJcblx0XHRcdFxyXG5cdFx0XHQ8dmlldyB2LWlmPVwiaXNSZWNvcmRpbmdcIiBjbGFzcz1cIm1hc2stbGF5ZXJcIiBAdG91Y2htb3ZlLnN0b3AucHJldmVudD5cclxuXHRcdFx0XHRcclxuXHRcdFx0PC92aWV3PlxyXG5cclxuXHRcdDwvdmlldz5cclxuXHQ8L3RlbXBsYXRlPlxyXG5cclxuXHQ8c2NyaXB0PlxyXG5cdFx0Y29uc3QgSElTVE9SWV9LRVkgPSAnY2hhdF9oaXN0b3J5X2dyb3VwcydcclxuXHRcdGV4cG9ydCBkZWZhdWx0IHtcclxuXHRcdFx0ZGF0YSgpIHtcclxuXHRcdFx0XHRyZXR1cm4ge1xyXG5cdFx0XHRcdFx0aW5wdXRUZXh0OiAnJyxcclxuXHRcdFx0XHRcdG1lc3NhZ2VzOiBbXHJcblx0XHRcdFx0XHRcdC8vIHtcclxuXHRcdFx0XHRcdFx0Ly8gXHRpZDogMSxcclxuXHRcdFx0XHRcdFx0Ly8gXHRyb2xlOiAndXNlcicsXHJcblx0XHRcdFx0XHRcdC8vIFx0dHlwZTogJ3RleHQnLFxyXG5cdFx0XHRcdFx0XHQvLyBcdGNvbnRlbnQ6ICfluK7miJHnu5/orqHkuIDkuIvku4rml6XnmoTplIDllK7mlbDmja4nLFxyXG5cdFx0XHRcdFx0XHQvLyBcdGlucHV0VHlwZTogJ3RleHQnXHJcblx0XHRcdFx0XHRcdC8vIH0sXHJcblx0XHRcdFx0XHRcdC8vIHtcclxuXHRcdFx0XHRcdFx0Ly8gXHRpZDogMixcclxuXHRcdFx0XHRcdFx0Ly8gXHRyb2xlOiAnYXNzaXN0YW50JyxcclxuXHRcdFx0XHRcdFx0Ly8gXHR0eXBlOiAnY2FyZCcsXHJcblx0XHRcdFx0XHRcdC8vIFx0dGl0bGU6ICfku4rml6XplIDllK7mlbDmja7nu5/orqHnu5PmnpzlpoLkuIvvvJonLFxyXG5cdFx0XHRcdFx0XHQvLyBcdGNvbnRlbnQ6ICflhoXlrrnlhoXlrrkuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4nXHJcblx0XHRcdFx0XHRcdC8vIH1cclxuXHRcdFx0XHRcdF0sXHJcblx0XHRcdFx0XHRzY3JvbGxJbnRvOiAnJyxcclxuXHRcdFx0XHRcdGRyYXdlck9wZW46IGZhbHNlLFxyXG5cdFx0XHRcdFx0aGlzdG9yeUdyb3VwczogW1xyXG5cdFx0XHRcdFx0XSxcclxuXHRcdFx0XHRcdGlzUmVjb3JkaW5nOiBmYWxzZSxcclxuXHRcdFx0XHRcdGlzTG9hZGluZzpmYWxzZSxcclxuXHRcdFx0XHRcdHdpbGxDYW5jZWw6IGZhbHNlLFxyXG5cdFx0XHRcdFx0cmVjb3JkZXI6IG51bGwsXHJcblx0XHRcdFx0XHRyZWNvcmRTdGFydFk6IDAsXHJcblx0XHRcdFx0XHRyZWNvcmRTdGFydFRzOiAwLFxyXG5cdFx0XHRcdFx0cmVjb3JkU2ltVGltZXI6IG51bGwsXHJcblx0XHRcdFx0XHQvLyBzaG93OiBmYWxzZSxcclxuXHRcdFx0XHRcdGlubmVyQXVkaW9Db250ZXh0OiBudWxsLFxyXG5cdFx0XHRcdFx0cG9wdXBWaXNpYmxlOiBmYWxzZSxcclxuXHRcdFx0XHRcdHR5cGV3cml0ZXJUaW1lcnM6IHt9LFxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSxcclxuXHRcdFx0Y29tcHV0ZWQ6IHtcclxuXHRcdFx0XHR0aW1lT2ZEYXlUZXh0KCkge1xyXG5cdFx0XHRcdFx0Y29uc3QgaCA9IG5ldyBEYXRlKCkuZ2V0SG91cnMoKVxyXG5cdFx0XHRcdFx0aWYgKGggPCA2KSByZXR1cm4gJ+WHjOaZqOWlvSdcclxuXHRcdFx0XHRcdGlmIChoIDwgMTIpIHJldHVybiAn5LiK5Y2I5aW9J1xyXG5cdFx0XHRcdFx0aWYgKGggPCAxOCkgcmV0dXJuICfkuIvljYjlpb0nXHJcblx0XHRcdFx0XHRyZXR1cm4gJ+aZmuS4iuWlvSdcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0sXHJcblx0XHRcdG1vdW50ZWQoKSB7XHJcblx0XHRcdFx0dGhpcy5sb2FkQ2hhdEhpc3RvcnkoKVxyXG5cdFx0XHRcdHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcclxuXHRcdFx0fSxcclxuXHRcdFx0YmVmb3JlRGVzdHJveSgpIHtcclxuXHRcdFx0XHQvLyDmuIXnkIbmiYDmnInmiZPlrZfmnLrlrprml7blmahcclxuXHRcdFx0XHRPYmplY3QudmFsdWVzKHRoaXMudHlwZXdyaXRlclRpbWVycykuZm9yRWFjaCh0aW1lciA9PiB7XHJcblx0XHRcdFx0XHRpZiAodGltZXIpIGNsZWFySW50ZXJ2YWwodGltZXIpXHJcblx0XHRcdFx0fSlcclxuXHRcdFx0XHR0aGlzLnR5cGV3cml0ZXJUaW1lcnMgPSB7fVxyXG5cdFx0XHRcdC8vIOa4heeQhuW9lemfs+WumuaXtuWZqFxyXG5cdFx0XHRcdGlmICh0aGlzLnJlY29yZFNpbVRpbWVyKSB7XHJcblx0XHRcdFx0XHRjbGVhclRpbWVvdXQodGhpcy5yZWNvcmRTaW1UaW1lcilcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0sXHJcblx0XHRcdG1ldGhvZHM6IHtcclxuXHRcdFx0XHQvLyDmlrDlop7mlrnms5XvvJrkuIrkvKDpn7PpopHlubbor4bliKtcclxuXHRcdFx0YXN5bmMgcmVjb2duaXplQXVkaW8odGVtcEZpbGVQYXRoKSB7XHJcblx0XHRcdCAgdHJ5IHtcclxuXHRcdFx0XHRjb25zb2xlLmxvZygn5byA5aeL6K+t6Z+z6K+G5Yir77yM5paH5Lu26Lev5b6EOicsIHRlbXBGaWxlUGF0aClcclxuXHRcdFx0XHRcclxuXHRcdFx0XHQvLyDojrflj5bmlofku7bkv6Hmga9cclxuXHRcdFx0XHRjb25zdCBmaWxlSW5mbyA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuXHRcdFx0XHQgIHVuaS5nZXRGaWxlSW5mbyh7XHJcblx0XHRcdFx0XHRmaWxlUGF0aDogdGVtcEZpbGVQYXRoLFxyXG5cdFx0XHRcdFx0c3VjY2VzczogcmVzb2x2ZSxcclxuXHRcdFx0XHRcdGZhaWw6IHJlamVjdFxyXG5cdFx0XHRcdCAgfSlcclxuXHRcdFx0XHR9KVxyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdGNvbnNvbGUubG9nKCfmlofku7blpKflsI86JywgZmlsZUluZm8uc2l6ZSlcclxuXHRcdFx0XHRcclxuXHRcdFx0XHQvLyDkvb/nlKggVW5pQXBwIOeahOS4iuS8oOaWh+S7tiBBUElcclxuXHRcdFx0XHRjb25zdCB1cGxvYWRSZXMgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblx0XHRcdFx0ICB1bmkudXBsb2FkRmlsZSh7XHJcblx0XHRcdFx0XHQvLyB1cmw6ICdodHRwOi8vMTkyLjE2OC4xMzMuODM6ODAwMC9yZWNvZ25pemVfc3BlZWNoJyxcclxuXHRcdFx0XHRcdC8vIHVybDogJ2h0dHA6Ly8xOTIuMTY4LjEwLjQ0OjgwMDAvcmVjb2duaXplX3NwZWVjaCcsXHJcblx0XHRcdFx0XHQvLyB1cmw6ICdodHRwOi8vMTkyLjE2OC4xLjE4OjgwMDAvcmVjb2duaXplX3NwZWVjaCcsXHJcblx0XHRcdFx0XHR1cmw6ICdodHRwOi8vMTA2LjIyNy45MS4xODE6ODAwMC9yZWNvZ25pemVfc3BlZWNoJyxcclxuXHRcdFx0XHRcdGZpbGVQYXRoOiB0ZW1wRmlsZVBhdGgsXHJcblx0XHRcdFx0XHRuYW1lOiAnc3BlZWNoJywgLy8g5a+55bqU5ZCO56uv55qEIFVwbG9hZEZpbGUg5Y+C5pWw5ZCNXHJcblx0XHRcdFx0XHRmb3JtRGF0YToge1xyXG5cdFx0XHRcdFx0ICAnZm9ybWF0JzogJ2FtcicsXHJcblx0XHRcdFx0XHQgICdyYXRlJzogMTYwMDAsXHJcblx0XHRcdFx0XHQgICdjaGFubmVsJzogMSxcclxuXHRcdFx0XHRcdCAgJ2N1aWQnOiAndW5pYXBwX3VzZXInLFxyXG5cdFx0XHRcdFx0ICAnYXVkaW9fbGVuJzogZmlsZUluZm8uc2l6ZVxyXG5cdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdHN1Y2Nlc3M6IChyZXMpID0+IHtcclxuXHRcdFx0XHRcdCAgY29uc29sZS5sb2coJ+S4iuS8oOWTjeW6lDonLCByZXMpXHJcblx0XHRcdFx0XHQgIGlmIChyZXMuc3RhdHVzQ29kZSA9PT0gMjAwKSB7XHJcblx0XHRcdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRcdCAgLy8g5bCd6K+V6Kej5p6Q6L+U5Zue55qEIEpTT04g5pWw5o2uXHJcblx0XHRcdFx0XHRcdCAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UocmVzLmRhdGEpXHJcblx0XHRcdFx0XHRcdCAgcmVzb2x2ZSh7IHN0YXR1c0NvZGU6IDIwMCwgZGF0YSB9KVxyXG5cdFx0XHRcdFx0XHR9IGNhdGNoIChlKSB7XHJcblx0XHRcdFx0XHRcdCAgcmVqZWN0KG5ldyBFcnJvcign5ZON5bqU6Kej5p6Q5aSx6LSlOiAnICsgZS5tZXNzYWdlKSlcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0ICB9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRyZWplY3QobmV3IEVycm9yKGDkuIrkvKDlpLHotKU6ICR7cmVzLnN0YXR1c0NvZGV9YCkpXHJcblx0XHRcdFx0XHQgIH1cclxuXHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHRmYWlsOiAoZXJyKSA9PiB7XHJcblx0XHRcdFx0XHQgIHJlamVjdChuZXcgRXJyb3IoJ+S4iuS8oOivt+axguWksei0pTogJyArIGVyci5lcnJNc2cpKVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdCAgfSlcclxuXHRcdFx0XHR9KVxyXG5cdFx0XHRcclxuXHRcdFx0XHRjb25zb2xlLmxvZygn6K+t6Z+z6K+G5Yir5ZON5bqUOicsIHVwbG9hZFJlcylcclxuXHRcdFx0XHJcblx0XHRcdFx0Y29uc3QgcmVzdWx0ID0gdXBsb2FkUmVzLmRhdGFcclxuXHRcdFx0XHRpZiAocmVzdWx0LnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnKSB7XHJcblx0XHRcdFx0ICByZXR1cm4gcmVzdWx0LnJlc3VsdFxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0ICB0aHJvdyBuZXcgRXJyb3IocmVzdWx0LmVycm9yIHx8ICfor4bliKvlpLHotKUnKVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0ICB9IGNhdGNoIChlcnJvcikge1xyXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoJ+ivremfs+ivhuWIq+mUmeivrzonLCBlcnJvcilcclxuXHRcdFx0XHR1bmkuc2hvd1RvYXN0KHtcclxuXHRcdFx0XHQgIHRpdGxlOiAn6K+G5Yir5aSx6LSlOiAnICsgKGVycm9yLm1lc3NhZ2UgfHwgJ+e9kee7nOmUmeivrycpLFxyXG5cdFx0XHRcdCAgaWNvbjogJ25vbmUnXHJcblx0XHRcdFx0fSlcclxuXHRcdFx0XHRyZXR1cm4gbnVsbFxyXG5cdFx0XHQgIH1cclxuXHRcdFx0fSxcclxuXHRcdFx0XHQvLyA9PT09PT09PT09PT09PT09PT09PSDljoblj7LorrDlvZXnrqHnkIYgPT09PT09PT09PT09PT09PT09PT1cclxuXHRcdFx0XHRcdGZvcm1hdERhdGUoZGF0ZSkge1xyXG5cdFx0XHRcdFx0ICBjb25zdCB5ID0gZGF0ZS5nZXRGdWxsWWVhcigpXHJcblx0XHRcdFx0XHQgIGNvbnN0IG0gPSBTdHJpbmcoZGF0ZS5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKVxyXG5cdFx0XHRcdFx0ICBjb25zdCBkID0gU3RyaW5nKGRhdGUuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCAnMCcpXHJcblx0XHRcdFx0XHQgIHJldHVybiBgJHt5feW5tCR7bX3mnIgke2R95pelYFxyXG5cdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdGxvYWRDaGF0SGlzdG9yeSgpIHtcclxuXHRcdFx0XHRcdFx0ICB0cnkge1xyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGRhdGEgPSB1bmkuZ2V0U3RvcmFnZVN5bmMoSElTVE9SWV9LRVkpXHJcblx0XHRcdFx0XHRcdFx0aWYgKGRhdGEgJiYgQXJyYXkuaXNBcnJheShkYXRhLmdyb3VwcykpIHtcclxuXHRcdFx0XHRcdFx0XHQgIHRoaXMuaGlzdG9yeUdyb3VwcyA9IGRhdGEuZ3JvdXBzXHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHQgIHRoaXMuaGlzdG9yeUdyb3VwcyA9IFtdXHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHQgIH0gY2F0Y2ggKGUpIHtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLmhpc3RvcnlHcm91cHMgPSBbXVxyXG5cdFx0XHRcdFx0XHQgIH1cclxuXHRcdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdGFkZFRvSGlzdG9yeSh0ZXh0KSB7XHJcblx0XHRcdFx0XHRcdCAgbGV0IGdyb3VwcyA9IHVuaS5nZXRTdG9yYWdlU3luYyhISVNUT1JZX0tFWSk/Lmdyb3VwcyB8fCBbXVxyXG5cdFx0XHRcdFx0XHQgIGNvbnN0IHRvZGF5ID0gdGhpcy5mb3JtYXREYXRlKG5ldyBEYXRlKCkpXHJcblx0XHRcdFx0XHRcdCAgbGV0IHRvZGF5R3JvdXAgPSBncm91cHMuZmluZChnID0+IGcuZGF0ZSA9PT0gdG9kYXkpXHJcblx0XHRcdFx0XHRcclxuXHRcdFx0XHRcdFx0ICBpZiAoIXRvZGF5R3JvdXApIHtcclxuXHRcdFx0XHRcdFx0XHR0b2RheUdyb3VwID0geyBkYXRlOiB0b2RheSwgaXRlbXM6IFtdIH1cclxuXHRcdFx0XHRcdFx0XHRncm91cHMudW5zaGlmdCh0b2RheUdyb3VwKVxyXG5cdFx0XHRcdFx0XHQgIH1cclxuXHRcdFx0XHRcdFxyXG5cdFx0XHRcdFx0XHQgIGlmICghdG9kYXlHcm91cC5pdGVtcy5pbmNsdWRlcyh0ZXh0KSkge1xyXG5cdFx0XHRcdFx0XHRcdHRvZGF5R3JvdXAuaXRlbXMudW5zaGlmdCh0ZXh0KVxyXG5cdFx0XHRcdFx0XHQgIH1cclxuXHRcdFx0XHRcdFxyXG5cdFx0XHRcdFx0XHQgIC8vIOmZkOWItuWkp+Wwj1xyXG5cdFx0XHRcdFx0XHQgIGlmICh0b2RheUdyb3VwLml0ZW1zLmxlbmd0aCA+IDUwKSB0b2RheUdyb3VwLml0ZW1zID0gdG9kYXlHcm91cC5pdGVtcy5zbGljZSgwLCA1MClcclxuXHRcdFx0XHRcdFx0ICBpZiAoZ3JvdXBzLmxlbmd0aCA+IDMwKSBncm91cHMgPSBncm91cHMuc2xpY2UoMCwgMzApXHJcblx0XHRcdFx0XHRcclxuXHRcdFx0XHRcdFx0ICB0aGlzLmhpc3RvcnlHcm91cHMgPSBncm91cHNcclxuXHRcdFx0XHRcdFx0ICB1bmkuc2V0U3RvcmFnZVN5bmMoSElTVE9SWV9LRVksIHsgZ3JvdXBzLCB1cGRhdGVkQXQ6IERhdGUubm93KCkgfSlcclxuXHRcdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdFx0XHRcclxuXHRcdFx0XHRcdFx0cmVtb3ZlRnJvbUhpc3RvcnkodGV4dCkge1xyXG5cdFx0XHRcdFx0XHRcdCAgbGV0IGdyb3VwcyA9IHVuaS5nZXRTdG9yYWdlU3luYyhISVNUT1JZX0tFWSk/Lmdyb3VwcyB8fCBbXVxyXG5cdFx0XHRcdFx0XHRcdCAgZ3JvdXBzLmZvckVhY2goZ3JvdXAgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdFx0Z3JvdXAuaXRlbXMgPSBncm91cC5pdGVtcy5maWx0ZXIoaXRlbSA9PiBpdGVtICE9PSB0ZXh0KVxyXG5cdFx0XHRcdFx0XHRcdCAgfSlcclxuXHRcdFx0XHRcdFx0XHQgIGdyb3VwcyA9IGdyb3Vwcy5maWx0ZXIoZyA9PiBnLml0ZW1zLmxlbmd0aCA+IDApXHJcblx0XHRcdFx0XHRcdFx0ICB0aGlzLmhpc3RvcnlHcm91cHMgPSBncm91cHNcclxuXHRcdFx0XHRcdFx0XHQgIHVuaS5zZXRTdG9yYWdlU3luYyhISVNUT1JZX0tFWSwgeyBncm91cHMsIHVwZGF0ZWRBdDogRGF0ZS5ub3coKSB9KVxyXG5cdFx0XHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHRcdFx0XHJcblx0XHRcdFx0XHRcdGNsZWFyQWxsSGlzdG9yeSgpIHtcclxuXHRcdFx0XHRcdFx0XHQgIHVuaS5zaG93TW9kYWwoe1xyXG5cdFx0XHRcdFx0XHRcdFx0dGl0bGU6ICfmuIXpmaTlhajpg6gnLFxyXG5cdFx0XHRcdFx0XHRcdFx0Y29udGVudDogJ+WwhuWIoOmZpOaJgOacieWvueivneiusOW9le+8jOatpOaTjeS9nOS4jeWPr+aBouWkjScsXHJcblx0XHRcdFx0XHRcdFx0XHRzdWNjZXNzOiAocmVzKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHQgIGlmIChyZXMuY29uZmlybSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR1bmkucmVtb3ZlU3RvcmFnZVN5bmMoSElTVE9SWV9LRVkpXHJcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuaGlzdG9yeUdyb3VwcyA9IFtdXHJcblx0XHRcdFx0XHRcdFx0XHRcdHVuaS5zaG93VG9hc3QoeyB0aXRsZTogJ+W3sua4hemZpCcsIGljb246ICdzdWNjZXNzJyB9KVxyXG5cdFx0XHRcdFx0XHRcdFx0ICB9XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0ICB9KVxyXG5cdFx0XHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHRcdG9uTG9uZ1ByZXNzSGlzdG9yeSh0ZXh0KSB7XHJcblx0XHRcdFx0XHRcdFx0ICB1bmkuc2hvd01vZGFsKHtcclxuXHRcdFx0XHRcdFx0XHRcdHRpdGxlOiAn5Yig6Zmk6K6w5b2VJyxcclxuXHRcdFx0XHRcdFx0XHRcdGNvbnRlbnQ6ICfnoa7lrprliKDpmaTov5nmnaHlr7nor53orrDlvZXvvJ8nLFxyXG5cdFx0XHRcdFx0XHRcdFx0c3VjY2VzczogKHJlcykgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdFx0ICBpZiAocmVzLmNvbmZpcm0pIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5yZW1vdmVGcm9tSGlzdG9yeSh0ZXh0KVxyXG5cdFx0XHRcdFx0XHRcdFx0ICB9XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0ICB9KVxyXG5cdFx0XHRcdFx0XHRcdH0sXHRcdFxyXG5cdFx0XHRcdFx0Ly8g5bel5YW3XHJcblx0XHRcdFx0XHRcdHJlbW92ZU1lc3NhZ2UoaWQpIHtcclxuXHRcdFx0XHRcdFx0ICBjb25zdCBpZHggPSB0aGlzLm1lc3NhZ2VzLmZpbmRJbmRleChtID0+IG0uaWQgPT09IGlkKVxyXG5cdFx0XHRcdFx0XHQgIGlmIChpZHggPiAtMSkgdGhpcy5tZXNzYWdlcy5zcGxpY2UoaWR4LCAxKVxyXG5cdFx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0XHRhZGRBc3Npc3RhbnRNZXNzYWdlKGlkLCBjb250ZW50KSB7XHJcblx0XHRcdFx0XHRcdFx0ICB0aGlzLm1lc3NhZ2VzLnB1c2goeyBpZCwgcm9sZTogJ2Fzc2lzdGFudCcsIHR5cGU6ICd0ZXh0JywgY29udGVudCwgZGlzcGxheVRleHQ6ICcnIH0pXHJcblx0XHRcdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdFx0XHRcdFxyXG5cdFx0XHRcdGFzeW5jIGdldEFJUmVzcG9uc2UobWVzc2FnZSl7XHJcblx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHRcdC8vIGNvbnN0IHVybCA9ICdodHRwOi8vMTkyLjE2OC4xMzMuODM6OTAyMC9hcGkvY2hhdCdcclxuXHRcdFx0XHRcdFx0XHQvLyBjb25zdCB1cmwgPSAnaHR0cDovLzE5Mi4xNjguMTAuNDQ6OTAyMC9hcGkvY2hhdCdcclxuXHRcdFx0XHRcdFx0XHRjb25zdCB1cmwgPSAnaHR0cDovLzEwNi4yMjcuOTEuMTgxOjkwMjAvYXBpL2NoYXQnICAvLyDlpoLpnIDliIfmjaLnur/kuIrvvIzmlLnov5nph4zljbPlj69cclxuXHRcdFx0XHRcdFx0XHRjb25zdCBoZWFkZXJzID0geyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH1cclxuXHRcdFx0XHRcdFx0XHRjb25zdCBkYXRhID0geyBtZXNzYWdlIH1cclxuXHRcdFx0XHRcdFx0XHRcclxuXHRcdFx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZyhkYXRhKVxyXG5cdFx0XHRcdFx0XHRcdFxyXG5cdFx0XHRcdFx0ICAvLyAgICAgICBjb25zdCBbZXJyb3IsIHJlc10gPSBhd2FpdCB1bmkucmVxdWVzdCh7XHJcblx0XHRcdFx0XHQgIC8vICAgICAgICAgdXJsLFxyXG5cdFx0XHRcdFx0ICAvLyAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG5cdFx0XHRcdFx0ICAvLyAgICAgICAgIGhlYWRlcjogaGVhZGVycyxcclxuXHRcdFx0XHRcdCAgLy8gICAgICAgICBkYXRhXHJcblx0XHRcdFx0XHQgIC8vICAgICAgIH0pXHJcblx0XHRcdFx0XHRcdFx0XHJcblx0XHRcdFx0XHRcdFx0Ly8gY29uc29sZS5sb2cocmVzKVxyXG5cdFx0XHRcdFx0XHRcdC8vIOS9v+eUqCBQcm9taXNlIOmjjuagvFxyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IHJlcyA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuXHRcdFx0XHRcdFx0XHQgIHVuaS5yZXF1ZXN0KHtcclxuXHRcdFx0XHRcdFx0XHRcdHVybCxcclxuXHRcdFx0XHRcdFx0XHRcdG1ldGhvZDogJ1BPU1QnLFxyXG5cdFx0XHRcdFx0XHRcdFx0aGVhZGVyOiBoZWFkZXJzLFxyXG5cdFx0XHRcdFx0XHRcdFx0ZGF0YSxcclxuXHRcdFx0XHRcdFx0XHRcdHN1Y2Nlc3M6IChyZXMpID0+IHJlc29sdmUocmVzKSxcclxuXHRcdFx0XHRcdFx0XHRcdGZhaWw6IChlcnIpID0+IHJlamVjdChlcnIpXHJcblx0XHRcdFx0XHRcdFx0ICB9KVxyXG5cdFx0XHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0XHRcdFxyXG5cdFx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKCfor7fmsYLlk43lupQ6JywgcmVzKVxyXG5cdFx0XHRcdFx0XHJcblx0XHRcdFx0XHRcdFx0aWYgKHJlcy5zdGF0dXNDb2RlICE9PSAyMDApIHtcclxuXHRcdFx0XHRcdFx0XHRcdCAgdGhyb3cgbmV3IEVycm9yKGBIVFRQ6ZSZ6K+vISDnirbmgIHnoIE6ICR7cmVzLnN0YXR1c0NvZGV9YClcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiByZXMuZGF0YT8ucmVzdWx0Py5kYXRhIHx8ICfmnKrojrflj5bliLDmnInmlYjlm57lpI0nXHJcblx0XHRcdFx0XHRcdFx0XHJcblx0XHRcdFx0XHRcdFx0ICB9IGNhdGNoIChlcnJvcikge1xyXG5cdFx0XHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvcignQUnor7fmsYLplJnor686JywgZXJyb3IpXHJcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gYOaKseatie+8jOWHuuS6hueCuemXrumimDogJHtlcnJvci5lcnJNc2cgfHwgZXJyb3IubWVzc2FnZX1gXHJcblx0XHRcdFx0XHRcdFx0ICB9XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRcclxuXHRcdFx0XHRwbGF5Vm9pY2Uodm9pY2VQYXRoKSB7XHJcblx0XHRcdFx0XHRpZiAoIXZvaWNlUGF0aCkge1xyXG5cdFx0XHRcdFx0XHR1bmkuc2hvd1RvYXN0KHsgdGl0bGU6ICfml6Dlj6/mkq3mlL7nmoTor63pn7MnLCBpY29uOiAnbm9uZScgfSlcclxuXHRcdFx0XHRcdFx0cmV0dXJuXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRpZiAoIXRoaXMuaW5uZXJBdWRpb0NvbnRleHQpIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5pbm5lckF1ZGlvQ29udGV4dCA9IHVuaS5jcmVhdGVJbm5lckF1ZGlvQ29udGV4dCgpXHJcblx0XHRcdFx0XHRcdHRoaXMuaW5uZXJBdWRpb0NvbnRleHQuYXV0b3BsYXkgPSBmYWxzZVxyXG5cdFx0XHRcdFx0XHR0aGlzLmlubmVyQXVkaW9Db250ZXh0Lm9uRXJyb3IoKCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdHVuaS5zaG93VG9hc3QoeyB0aXRsZTogJ+aSreaUvuWksei0pScsIGljb246ICdub25lJyB9KVxyXG5cdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHRyeSB7IHRoaXMuaW5uZXJBdWRpb0NvbnRleHQuc3RvcCgpIH0gY2F0Y2goZSkge31cclxuXHRcdFx0XHRcdGNvbnNvbGUubG9nKHZvaWNlUGF0aClcclxuXHRcdFx0XHRcdHRoaXMuaW5uZXJBdWRpb0NvbnRleHQuc3JjID0gdm9pY2VQYXRoXHJcblx0XHRcdFx0XHR0aGlzLmlubmVyQXVkaW9Db250ZXh0LnBsYXkoKVxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0b25TZXR0aW5nVGFwKCkge1xyXG5cdFx0XHRcdFx0dW5pLm5hdmlnYXRlVG8oe1xyXG5cdFx0XHRcdFx0XHR1cmw6ICcvcGFnZXMvc2V0dGluZy9pbmRleCdcclxuXHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRvblN1Z2dlc3Rpb25UYXAodGV4dCkge1xyXG5cdFx0XHRcdFx0dGhpcy5pbnB1dFRleHQgPSB0ZXh0XHJcblx0XHRcdFx0XHR0aGlzLm9uU2VuZCgpO1xyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0b25RdWlja0Fzayh0ZXh0KSB7XHJcblx0XHRcdFx0XHR0aGlzLmlucHV0VGV4dCA9IHRleHRcclxuXHRcdFx0XHRcdHRoaXMub25TZW5kKClcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdG9uU3dpdGNoTW9kZWwoKSB7XHJcblx0XHRcdFx0XHR1bmkuc2hvd1RvYXN0KHtcclxuXHRcdFx0XHRcdFx0dGl0bGU6ICflt7LliIfmjaLkuLrpgJrnlKjmqKHlnosnLFxyXG5cdFx0XHRcdFx0XHRpY29uOiAnbm9uZSdcclxuXHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRvbklucHV0KGUpIHtcclxuXHRcdFx0XHRcdHRoaXMuaW5wdXRUZXh0ID0gZS5kZXRhaWwudmFsdWVcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdG9wZW5EcmF3ZXIoKSB7XHJcblx0XHRcdFx0XHR0aGlzLiRyZWZzLnBvcHVwLm9wZW4oKVxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0b25Qb3B1cENoYW5nZShlKXtcclxuXHRcdFx0XHRcdC8vIGUuc2hvdzogdHJ1ZSB3aGVuIG9wZW5lZCwgZmFsc2Ugd2hlbiBjbG9zZWRcclxuXHRcdFx0XHRcdHRoaXMucG9wdXBWaXNpYmxlID0gISEoZSAmJiAoZS5zaG93ID09PSB0cnVlKSlcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdC8vID09PT09IFZvaWNlIGlucHV0IChXZUNoYXQtbGlrZSkgPT09PT1cclxuXHRcdFx0XHRlbnN1cmVSZWNvcmRlcigpIHtcclxuXHRcdFx0XHRcdGlmICh0aGlzLnJlY29yZGVyKSByZXR1cm5cclxuXHRcdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRcdHRoaXMucmVjb3JkZXIgPSB1bmkuZ2V0UmVjb3JkZXJNYW5hZ2VyICYmIHVuaS5nZXRSZWNvcmRlck1hbmFnZXIoKVxyXG5cdFx0XHRcdFx0fSBjYXRjaCAoZSkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLnJlY29yZGVyID0gbnVsbFxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYgKHRoaXMucmVjb3JkZXIpIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5yZWNvcmRlci5vblN0YXJ0KClcclxuXHRcdFx0XHRcdFx0dGhpcy5yZWNvcmRlci5vblN0b3AoIGFzeW5jKHJlcykgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGR1cmF0aW9uID0gRGF0ZS5ub3coKSAtIHRoaXMucmVjb3JkU3RhcnRUcztcclxuXHRcdFx0XHRcdFx0XHRjb25zdCB0ZW1wRmlsZVBhdGggPSByZXMudGVtcEZpbGVQYXRoOyAvLyDmt7vliqDov5nooYzvvIzku45yZXPkuK3ojrflj5bmlofku7bot6/lvoRcclxuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy53aWxsQ2FuY2VsIHx8IGR1cmF0aW9uIDwgNzAwKSB7XHJcblx0XHRcdFx0XHRcdFx0XHR1bmkuc2hvd1RvYXN0KHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0dGl0bGU6IGR1cmF0aW9uIDwgNzAwID8gJ+ivtOivneaXtumXtOWkquefrScgOiAn5bey5Y+W5raIJyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0aWNvbjogJ25vbmUnXHJcblx0XHRcdFx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuXHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdC8vIOaYvuekuuWKoOi9vVxyXG5cdFx0XHRcdFx0XHRcdHVuaS5zaG93TG9hZGluZyh7IHRpdGxlOiAn6K+G5Yir5LitLi4uJyB9KTtcclxuXHRcdFx0XHRcdFx0XHRcdCAgXHJcblx0XHRcdFx0XHRcdFx0Ly8gVE9ETzog5LiK5LygIHJlcy50ZW1wRmlsZVBhdGgg5YGa6K+G5Yir77yb546w55SoIG1vY2tcclxuXHRcdFx0XHRcdFx0XHQvLyB0aGlzLmhhbmRsZVJlY29nbml6ZWRUZXh0KHRoaXMubW9ja1NwZWVjaFRvVGV4dChkdXJhdGlvbiksIHJlcy50ZW1wRmlsZVBhdGgsIE1hdGguY2VpbChcclxuXHRcdFx0XHRcdFx0XHQvLyBcdGR1cmF0aW9uIC8gMTAwKSAvIDEwKVxyXG5cdFx0XHRcdFx0XHRcdC8vIOecn+WunuivhuWIq1xyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IHJlY29nbml6ZWRUZXh0ID0gYXdhaXQgdGhpcy5yZWNvZ25pemVBdWRpbyh0ZW1wRmlsZVBhdGgpO1xyXG5cdFx0XHRcdFx0XHRcdHVuaS5oaWRlTG9hZGluZygpO1x0IFxyXG5cdFx0XHRcdFx0XHRcdCBpZiAocmVjb2duaXplZFRleHQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0IC8vIOaIkOWKn++8muWhq+WFpei+k+WFpeahhlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQgdGhpcy5pbnB1dFRleHQgPSByZWNvZ25pemVkVGV4dDtcclxuXHRcdFx0XHRcdFx0XHRcdFx0IHRoaXMuJG5leHRUaWNrKCgpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0ICAgLy8g5Y+v6YCJ77ya6Ieq5Yqo5Y+R6YCBXHJcblx0XHRcdFx0XHRcdFx0XHRcdCAgIC8vIHRoaXMub25TZW5kKCd2b2ljZScsIHRlbXBGaWxlUGF0aCwgTWF0aC5jZWlsKGR1cmF0aW9uIC8gMTAwKSAvIDEwKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0IH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0ICAgfVxyXG5cdFx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0b25QcmVzc01pYyhlKSB7XHJcblx0XHRcdFx0XHR0aGlzLmVuc3VyZVJlY29yZGVyKClcclxuXHRcdFx0XHRcdHRoaXMuaXNSZWNvcmRpbmcgPSB0cnVlXHJcblx0XHRcdFx0XHQvLyB0aGlzLnNob3cgPSB0cnVlXHJcblx0XHRcdFx0XHR0aGlzLndpbGxDYW5jZWwgPSBmYWxzZVxyXG5cdFx0XHRcdFx0dGhpcy5yZWNvcmRTdGFydFRzID0gRGF0ZS5ub3coKVxyXG5cdFx0XHRcdFx0dGhpcy5yZWNvcmRTdGFydFkgPSAoZS5jaGFuZ2VkVG91Y2hlcyAmJiBlLmNoYW5nZWRUb3VjaGVzWzBdKSA/IGUuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WSA6IDBcclxuXHRcdFx0XHRcdGlmICh0aGlzLnJlY29yZGVyKSB7XHJcblx0XHRcdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5yZWNvcmRlci5zdGFydCh7XHJcblx0XHRcdFx0XHRcdFx0XHRmb3JtYXQ6ICdhbXInLFxyXG5cdFx0XHRcdFx0XHRcdFx0c2FtcGxlUmF0ZTogMTYwMDAsXHJcblx0XHRcdFx0XHRcdFx0XHRlbmNvZGVCaXRSYXRlOiAxNjAwMCwgLy8g57yW56CB5q+U54m5546HXHJcblx0XHRcdFx0XHRcdFx0XHRmcmFtZVNpemU6IDQsIC8vIOW4p+Wkp+Wwj1xyXG5cdFx0XHRcdFx0XHRcdFx0bnVtYmVyT2ZDaGFubmVsczogMSxcclxuXHRcdFx0XHRcdFx0XHRcdGR1cmF0aW9uOiA2MDAwMFxyXG5cdFx0XHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0XHRcdH0gY2F0Y2ggKGVycikge31cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdGlmICh0aGlzLnJlY29yZFNpbVRpbWVyKSBjbGVhclRpbWVvdXQodGhpcy5yZWNvcmRTaW1UaW1lcilcclxuXHRcdFx0XHRcdFx0dGhpcy5yZWNvcmRTaW1UaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge30sIDYwMDAwKVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0b25Nb3ZlTWljKGUpIHtcclxuXHRcdFx0XHRcdGlmICghdGhpcy5pc1JlY29yZGluZykgcmV0dXJuO1xyXG5cdFx0XHRcdFx0Y29uc3QgeSA9IChlLmNoYW5nZWRUb3VjaGVzICYmIGUuY2hhbmdlZFRvdWNoZXNbMF0pID8gZS5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZIDogMDtcclxuXHRcdFx0XHRcdHRoaXMud2lsbENhbmNlbCA9ICh0aGlzLnJlY29yZFN0YXJ0WSAtIHkpID4gNjBcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdG9uUmVsZWFzZU1pYygpIHtcclxuXHRcdFx0XHRcdGNvbnNvbGUubG9nKCdvblJlbGVhc2VNaWMnKTtcclxuXHRcdFx0XHRcdGlmICghdGhpcy5pc1JlY29yZGluZykgcmV0dXJuXHJcblx0XHRcdFx0XHRjb25zdCBjYW5jZWwgPSB0aGlzLndpbGxDYW5jZWxcclxuXHRcdFx0XHRcdHRoaXMuaXNSZWNvcmRpbmcgPSBmYWxzZTtcclxuXHRcdFx0XHRcdHRoaXMuc2hvdyA9IGZhbHNlXHJcblx0XHRcdFx0XHRpZiAodGhpcy5yZWNvcmRlcikge1xyXG5cdFx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMucmVjb3JkZXIuc3RvcCgpXHJcblx0XHRcdFx0XHRcdH0gY2F0Y2ggKGVycikge1xyXG5cdFx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKCdlcnInLCBlcnIpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRoYW5kbGVSZWNvZ25pemVkVGV4dCh0ZXh0LCB0ZW1wRmlsZVBhdGgsIGR1cmF0aW9uKSB7XHJcblx0XHRcdFx0XHRpZiAoIXRleHQpIHJldHVyblxyXG5cdFx0XHRcdFx0dGhpcy5pbnB1dFRleHQgPSB0ZXh0XHJcblx0XHRcdFx0XHR0aGlzLm9uU2VuZCgndm9pY2UnLCB0ZW1wRmlsZVBhdGgsIGR1cmF0aW9uKSAvLyDkvKAgJ3ZvaWNlJ1xyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0bW9ja1NwZWVjaFRvVGV4dChtcykge1xyXG5cdFx0XHRcdFx0Y29uc3Qgc2VjID0gTWF0aC5jZWlsKG1zIC8gMTAwKSAvIDEwXHJcblx0XHRcdFx0XHRjb25zdCBwb29sID0gW1xyXG5cdFx0XHRcdFx0XHRg6K+t6Z+z6L6T5YWlICR7c2VjfXPvvIzmqKHmi5/or4bliKvvvJrluK7miJHnu5/orqHku4rlpKnplIDllK7pop1gLFxyXG5cdFx0XHRcdFx0XHRg6K+t6Z+z6L6T5YWlICR7c2VjfXPvvIzmqKHmi5/or4bliKvvvJrmn6Xor6LorqLljZUyMDM4ODk5MzQ4M2AsXHJcblx0XHRcdFx0XHRcdGDor63pn7PovpPlhaUgJHtzZWN9c++8jOaooeaLn+ivhuWIq++8mueUn+aIkOaXpeaKpWBcclxuXHRcdFx0XHRcdF1cclxuXHRcdFx0XHRcdHJldHVybiBwb29sW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHBvb2wubGVuZ3RoKV1cclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdG9uSGlzdG9yeUl0ZW1UYXAodGV4dCkge1xyXG5cdFx0XHRcdFx0dGhpcy5pbnB1dFRleHQgPSB0ZXh0XHJcblx0XHRcdFx0XHR0aGlzLm9uU2VuZCgpO1xyXG5cdFx0XHRcdFx0dGhpcy4kcmVmcy5wb3B1cC5jbG9zZSgpXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRhc3luYyBvblNlbmQoaW5wdXRUeXBlID0gJ3RleHQnLCBpbnB1dENvbnRlbnQgPSAnJywgZHVyYXRpb24gPSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHQgIGNvbnN0IHRleHQgPSAodGhpcy5pbnB1dFRleHQgfHwgJycpLnRyaW0oKVxyXG5cdFx0XHRcdCAgaWYgKCF0ZXh0IHx8IHRoaXMuaXNMb2FkaW5nKSByZXR1cm5cclxuXHRcdFx0XHRcclxuXHRcdFx0XHQgIGNvbnN0IGJhc2VJZCA9IERhdGUubm93KClcclxuXHRcdFx0XHRcclxuXHRcdFx0XHQgIC8vIDEuIOeUqOaIt+a2iOaBr1xyXG5cdFx0XHRcdCAgdGhpcy5tZXNzYWdlcy5wdXNoKHtcclxuXHRcdFx0XHRcdGlkOiBiYXNlSWQsXHJcblx0XHRcdFx0XHRyb2xlOiAndXNlcicsXHJcblx0XHRcdFx0XHR0eXBlOiAndGV4dCcsXHJcblx0XHRcdFx0XHRjb250ZW50OiB0ZXh0LFxyXG5cdFx0XHRcdFx0aW5wdXRUeXBlLFxyXG5cdFx0XHRcdFx0aW5wdXRDb250ZW50LFxyXG5cdFx0XHRcdFx0ZHVyYXRpb25cclxuXHRcdFx0XHQgIH0pXHJcblx0XHRcdFx0XHJcblx0XHRcdFx0ICAvLyAyLiBsb2FkaW5nIOa2iOaBr1xyXG5cdFx0XHRcdCAgY29uc3QgbG9hZGluZ0lkID0gYmFzZUlkICsgMC41XHJcblx0XHRcdFx0ICB0aGlzLm1lc3NhZ2VzLnB1c2goe1xyXG5cdFx0XHRcdFx0aWQ6IGxvYWRpbmdJZCxcclxuXHRcdFx0XHRcdHJvbGU6ICdhc3Npc3RhbnQnLFxyXG5cdFx0XHRcdFx0bG9hZGluZzogdHJ1ZVxyXG5cdFx0XHRcdCAgfSlcclxuXHRcdFx0XHRcclxuXHRcdFx0XHQgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKVxyXG5cdFx0XHRcdCAgdGhpcy5pbnB1dFRleHQgPSAnJ1xyXG5cdFx0XHRcdCAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlXHJcblx0XHRcdFx0XHJcblx0XHRcdFx0ICB0aGlzLmFkZFRvSGlzdG9yeSh0ZXh0KVxyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdCAgdHJ5IHtcclxuXHRcdFx0XHRcdC8vIDMuIOecn+ato+etieW+hSBBSSDlm57lpI1cclxuXHRcdFx0XHRcdGNvbnN0IHJlcGx5ID0gYXdhaXQgdGhpcy5nZXRBSVJlc3BvbnNlKHRleHQpXHJcblx0XHRcdFx0XHJcblx0XHRcdFx0XHQvLyA0LiDnp7vpmaQgbG9hZGluZ1xyXG5cdFx0XHRcdFx0Y29uc3QgbG9hZGluZ0lkeCA9IHRoaXMubWVzc2FnZXMuZmluZEluZGV4KG0gPT4gbS5pZCA9PT0gbG9hZGluZ0lkKVxyXG5cdFx0XHRcdFx0aWYgKGxvYWRpbmdJZHggPiAtMSkgdGhpcy5tZXNzYWdlcy5zcGxpY2UobG9hZGluZ0lkeCwgMSlcclxuXHRcdFx0XHRcclxuXHRcdFx0XHRcdC8vIDUuIOa3u+WKoOWbnuWkjSArIOaJk+Wtl+aculxyXG5cdFx0XHRcdFx0Y29uc3QgcmVwbHlJZCA9IGJhc2VJZCArIDFcclxuXHRcdFx0XHRcdHRoaXMubWVzc2FnZXMucHVzaCh7XHJcblx0XHRcdFx0XHQgIGlkOiByZXBseUlkLFxyXG5cdFx0XHRcdFx0ICByb2xlOiAnYXNzaXN0YW50JyxcclxuXHRcdFx0XHRcdCAgdHlwZTogJ3RleHQnLFxyXG5cdFx0XHRcdFx0ICBjb250ZW50OiByZXBseSxcclxuXHRcdFx0XHRcdCAgZGlzcGxheVRleHQ6ICcnXHJcblx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdFx0dGhpcy50eXBld3JpdGVyKHJlcGx5SWQsIHJlcGx5KVxyXG5cdFx0XHRcdCAgfSBjYXRjaCAoZSkge1xyXG5cdFx0XHRcdFx0Ly8g5Ye66ZSZ5pe25Lmf5bGV56S6XHJcblx0XHRcdFx0XHRjb25zdCBsb2FkaW5nSWR4ID0gdGhpcy5tZXNzYWdlcy5maW5kSW5kZXgobSA9PiBtLmlkID09PSBsb2FkaW5nSWQpXHJcblx0XHRcdFx0XHRpZiAobG9hZGluZ0lkeCA+IC0xKSB0aGlzLm1lc3NhZ2VzLnNwbGljZShsb2FkaW5nSWR4LCAxKVxyXG5cdFx0XHRcdFx0dGhpcy5tZXNzYWdlcy5wdXNoKHtcclxuXHRcdFx0XHRcdCAgaWQ6IGJhc2VJZCArIDEsXHJcblx0XHRcdFx0XHQgIHJvbGU6ICdhc3Npc3RhbnQnLFxyXG5cdFx0XHRcdFx0ICBjb250ZW50OiBg6K+35rGC5Ye66ZSZ77yaJHtlLm1lc3NhZ2UgfHwgZX1gXHJcblx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdCAgfSBmaW5hbGx5IHtcclxuXHRcdFx0XHRcdHRoaXMuaXNMb2FkaW5nID0gZmFsc2VcclxuXHRcdFx0XHRcdHRoaXMuJG5leHRUaWNrKCgpID0+IHRoaXMuc2Nyb2xsVG9Cb3R0b20oKSlcclxuXHRcdFx0XHQgIH1cclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdHR5cGV3cml0ZXIobWVzc2FnZUlkLCBmdWxsVGV4dCkge1xyXG5cdFx0XHRcdFx0Y29uc3QgbXNnID0gdGhpcy5tZXNzYWdlcy5maW5kKG0gPT4gbS5pZCA9PT0gbWVzc2FnZUlkKVxyXG5cdFx0XHRcdFx0aWYgKCFtc2cpIHJldHVyblxyXG5cdFx0XHRcdFx0Ly8g5riF55CG5LmL5YmN55qE5a6a5pe25Zmo77yI5aaC5p6c5a2Y5Zyo77yJXHJcblx0XHRcdFx0XHRpZiAodGhpcy50eXBld3JpdGVyVGltZXJzW21lc3NhZ2VJZF0pIHtcclxuXHRcdFx0XHRcdFx0Y2xlYXJJbnRlcnZhbCh0aGlzLnR5cGV3cml0ZXJUaW1lcnNbbWVzc2FnZUlkXSlcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGxldCBpbmRleCA9IDBcclxuXHRcdFx0XHRcdG1zZy5kaXNwbGF5VGV4dCA9IGZ1bGxUZXh0LnN1YnN0cmluZygwLCBpbmRleCArIDEpO1xyXG5cdFx0XHRcdFx0aW5kZXggKz0gMTtcclxuXHRcdFx0XHRcdGNvbnN0IHNwZWVkID0gNTAgLy8g5q+P5Liq5a2X56ym6Ze06ZqUNTBtc1xyXG5cdFx0XHRcdFx0Y29uc3QgdGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XHJcblx0XHRcdFx0XHRcdGlmIChpbmRleCA8IGZ1bGxUZXh0Lmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0XHRcdG1zZy5kaXNwbGF5VGV4dCA9IGZ1bGxUZXh0LnN1YnN0cmluZygwLCBpbmRleCArIDEpXHJcblx0XHRcdFx0XHRcdFx0aW5kZXgrK1xyXG5cdFx0XHRcdFx0XHRcdC8vIOaJk+Wtl+i/h+eoi+S4reiHquWKqOa7muWKqOWIsOW6lemDqFxyXG5cdFx0XHRcdFx0XHRcdHRoaXMuJG5leHRUaWNrKCgpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuc2Nyb2xsVG9Cb3R0b20oKVxyXG5cdFx0XHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0Y2xlYXJJbnRlcnZhbCh0aW1lcilcclxuXHRcdFx0XHRcdFx0XHRkZWxldGUgdGhpcy50eXBld3JpdGVyVGltZXJzW21lc3NhZ2VJZF1cclxuXHRcdFx0XHRcdFx0XHQvLyDlrozmiJDlkI7kvb/nlKjlrozmlbTmlofmnKxcclxuXHRcdFx0XHRcdFx0XHRtc2cuZGlzcGxheVRleHQgPSBmdWxsVGV4dFxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9LCBzcGVlZClcclxuXHRcdFx0XHRcdHRoaXMudHlwZXdyaXRlclRpbWVyc1ttZXNzYWdlSWRdID0gdGltZXJcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdHNjcm9sbFRvQm90dG9tKCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0bGV0IHNlbGYgPSB0aGlzO1xyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy4kbmV4dFRpY2soKCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR1bmkuY3JlYXRlU2VsZWN0b3JRdWVyeSgpLnNlbGVjdCgnLmNvbnRlbnQnKS5ib3VuZGluZ0NsaWVudFJlY3QoKHJlY3QpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZihzZWxmLmhlaWdodCAhPT0gcmVjdC5oZWlnaHQpe1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0c2VsZi5oZWlnaHQgPSByZWN0LmhlaWdodDtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVuaS5wYWdlU2Nyb2xsVG8oe1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzY3JvbGxUb3A6IHJlY3QuaGVpZ2h0LFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkdXJhdGlvbjogMzAwLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjbGFzczogJy5jb250ZW50J1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVx0XHRcdFx0XHJcblx0XHRcdFx0XHRcdFx0XHRcdH0pLmV4ZWMoKTtcclxuXHRcdFx0XHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRtb2NrUmVwbHkodGV4dCkge1xyXG5cdFx0XHRcdFx0Y29uc3QgY2FuZGlkYXRlcyA9IFtcclxuXHRcdFx0XHRcdFx0J+WlveeahO+8jOaIkeW3sue7j+S4uuaCqOWkhOeQhuOAgicsXHJcblx0XHRcdFx0XHRcdCfmlLbliLDor7fmsYLvvIzku6XkuIvmmK/nu5PmnpznmoTmpoLop4jjgIInLFxyXG5cdFx0XHRcdFx0XHQn5oiR55CG6Kej5LqG77yM6L+Z5piv5LiA5Liq56S65L6L5Zue5aSN44CCJyxcclxuXHRcdFx0XHRcdFx0J+W3suiusOW9le+8jOeojeWQjuWwhuWujOWWhOaKpeihqOOAgidcclxuXHRcdFx0XHRcdF1cclxuXHRcdFx0XHRcdGNvbnN0IHBpY2sgPSBjYW5kaWRhdGVzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNhbmRpZGF0ZXMubGVuZ3RoKV1cclxuXHRcdFx0XHRcdHJldHVybiBwaWNrICsgJ++8iOW3suaUtuWIsO+8muKAnCcgKyB0ZXh0ICsgJ+KAne+8iSdcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdG9uTGlzdGVuKHRleHQpIHtcclxuXHRcdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRcdC8vIEg1OiBXZWIgU3BlZWNoIEFQSVxyXG5cdFx0XHRcdFx0XHRpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LnNwZWVjaFN5bnRoZXNpcykge1xyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IHUgPSBuZXcgU3BlZWNoU3ludGhlc2lzVXR0ZXJhbmNlKFN0cmluZyh0ZXh0KSlcclxuXHRcdFx0XHRcdFx0XHR1LmxhbmcgPSAnemgtQ04nXHJcblx0XHRcdFx0XHRcdFx0dS5yYXRlID0gMVxyXG5cdFx0XHRcdFx0XHRcdHUucGl0Y2ggPSAxXHJcblx0XHRcdFx0XHRcdFx0d2luZG93LnNwZWVjaFN5bnRoZXNpcy5jYW5jZWwoKVxyXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy5zcGVlY2hTeW50aGVzaXMuc3BlYWsodSlcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm5cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSBjYXRjaCAoZSkge31cclxuXHRcdFx0XHRcdHVuaS5zaG93VG9hc3Qoe1xyXG5cdFx0XHRcdFx0XHR0aXRsZTogJ+W9k+WJjeerr+S4jeaUr+aMgeivremfs+aSreaUvicsXHJcblx0XHRcdFx0XHRcdGljb246ICdub25lJ1xyXG5cdFx0XHRcdFx0fSlcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHQ8L3NjcmlwdD5cclxuXHJcblx0PHN0eWxlIHNjb3BlZD5cclxuXHRcdDo6di1kZWVwIC51bmktbmF2LWJhci10ZXh0e1xyXG5cdFx0XHRmb250LXNpemU6IDE4cHggIWltcG9ydGFudDtcclxuXHRcdH1cclxuXHRcdFxyXG5cdFx0Ojp2LWRlZW8gLnVuaS1uYXZiYXItLWJvcmRlcntcclxuXHRcdFx0LyogYm9yZGVyLWJvdHRvbTogMHB4ICFpbXBvcnRhbnQ7ICovXHJcblx0XHRcdGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZmZmICFpbXBvcnRhbnQ7XHJcblx0XHR9XHJcblx0XHRcclxuXHRcdC5haS1wYWdlIHtcclxuXHRcdFx0aGVpZ2h0OiAxMDB2aDtcclxuXHRcdFx0ZGlzcGxheTogZmxleDtcclxuXHRcdFx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuXHRcdFx0YmFja2dyb3VuZDogI2Y3ZjhmYztcclxuXHRcdH1cclxuXHJcblx0XHQubmF2IHtcclxuXHRcdFx0aGVpZ2h0OiA0NHB4O1xyXG5cdFx0XHRkaXNwbGF5OiBmbGV4O1xyXG5cdFx0XHRhbGlnbi1pdGVtczogY2VudGVyO1xyXG5cdFx0XHRqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XHJcblx0XHRcdHBhZGRpbmc6IDAgMTJweDtcclxuXHRcdFx0YmFja2dyb3VuZDogI2ZmZmZmZjtcclxuXHRcdFx0Ym94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4wNCk7XHJcblx0XHRcdHBvc2l0aW9uOiBmaXhlZDtcclxuXHRcdFx0bGVmdDogMDtcclxuXHRcdFx0cmlnaHQ6IDA7XHJcblx0XHRcdHRvcDogMDtcclxuXHRcdFx0ei1pbmRleDogOTtcclxuXHRcdH1cclxuXHJcblx0XHQubmF2LXRpdGxlIHtcclxuXHRcdFx0Zm9udC1zaXplOiAxNnB4O1xyXG5cdFx0XHRmb250LXdlaWdodDogNjAwO1xyXG5cdFx0fVxyXG5cclxuXHRcdC5oYW1idXJnZXIge1xyXG5cdFx0XHR3aWR0aDogMThweDtcclxuXHRcdH1cclxuXHJcblx0XHQuaGFtYnVyZ2VyIC5saW5lIHtcclxuXHRcdFx0aGVpZ2h0OiAycHg7XHJcblx0XHRcdGJhY2tncm91bmQ6ICMzMzM7XHJcblx0XHRcdG1hcmdpbjogM3B4IDA7XHJcblx0XHRcdGJvcmRlci1yYWRpdXM6IDJweDtcclxuXHRcdH1cclxuXHJcblx0XHQuZ2VhciB7XHJcblx0XHRcdHdpZHRoOiAxOHB4O1xyXG5cdFx0XHRoZWlnaHQ6IDE4cHg7XHJcblx0XHRcdHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuXHRcdFx0Y29sb3I6ICMwMDA7XHJcblx0XHR9XHJcblxyXG5cdFx0LmNvbnRlbnQge1xyXG5cdFx0XHRmbGV4OiAxO1xyXG5cdFx0XHRwYWRkaW5nOiAxNnB4IDEycHggNjhweCAxMnB4O1xyXG5cdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjZjdmOGZjO1xyXG5cdFx0XHR3aWR0aDogMTAwJTtcclxuXHRcdFx0Ym94LXNpemluZzogYm9yZGVyLWJveDtcclxuXHRcdH1cclxuXHJcblx0XHQuZ3JlZXQtY2FyZCB7XHJcblx0XHRcdGRpc3BsYXk6IGZsZXg7XHJcblx0XHRcdGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcblx0XHRcdGJhY2tncm91bmQ6ICNmZmY7XHJcblx0XHRcdGJvcmRlci1yYWRpdXM6IDE0cHg7XHJcblx0XHRcdHBhZGRpbmc6IDEycHg7XHJcblx0XHRcdG1hcmdpbi1ib3R0b206IDEwcHg7XHJcblx0XHR9XHJcblxyXG5cdFx0LmF2YXRhci1pbm5lciB7XHJcblx0XHRcdGZvbnQtc2l6ZTogMjZweDtcclxuXHRcdH1cclxuXHJcblx0XHQuZ3JlZXQtdGV4dCAuaGkge1xyXG5cdFx0XHRmb250LXNpemU6IDE2cHg7XHJcblx0XHRcdGZvbnQtd2VpZ2h0OiA3MDA7XHJcblx0XHRcdGNvbG9yOiAjMGI1NmZmO1xyXG5cdFx0fVxyXG5cclxuXHRcdC5ncmVldC10ZXh0IC5zdWIge1xyXG5cdFx0XHRmb250LXNpemU6IDEycHg7XHJcblx0XHRcdGNvbG9yOiAjNGE3NmIxO1xyXG5cdFx0XHRtYXJnaW4tdG9wOiA0cHg7XHJcblx0XHR9XHJcblxyXG5cdFx0LndlbGNvbWUge1xyXG5cdFx0XHRmb250LXNpemU6IDEzcHg7XHJcblx0XHRcdGNvbG9yOiAjMzMzO1xyXG5cdFx0XHRiYWNrZ3JvdW5kOiAjZmZmO1xyXG5cdFx0XHRib3JkZXItcmFkaXVzOiAxMnB4O1xyXG5cdFx0XHRwYWRkaW5nOiAxMHB4IDEycHg7XHJcblx0XHRcdG1hcmdpbjogMTJweCAwO1xyXG5cdFx0fVxyXG5cclxuXHRcdC5ndWVzcy1wYW5lbCB7XHJcblx0XHRcdGJhY2tncm91bmQ6ICNmZmY7XHJcblx0XHRcdGJvcmRlci1yYWRpdXM6IDE0cHg7XHJcblx0XHRcdHBhZGRpbmc6IDEwcHg7XHJcblx0XHRcdG1hcmdpbi1ib3R0b206IDE2cHg7XHJcblx0XHR9XHJcblxyXG5cdFx0Lmd1ZXNzLXRpdGxlIHtcclxuXHRcdFx0Y29sb3I6ICM1ZjZmZmY7XHJcblx0XHRcdGZvbnQtc2l6ZTogMTRweDtcclxuXHRcdFx0bWFyZ2luLWJvdHRvbTogOHB4O1xyXG5cdFx0fVxyXG5cclxuXHRcdC5ndWVzcy1saXN0IHtcclxuXHRcdFx0ZGlzcGxheTogZmxleDtcclxuXHRcdFx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuXHRcdH1cclxuXHJcblx0XHQuZ3Vlc3MtaXRlbSB7XHJcblx0XHRcdGJhY2tncm91bmQ6ICNmN2Y4ZmM7XHJcblx0XHRcdGJvcmRlci1yYWRpdXM6IDEwcHg7XHJcblx0XHRcdHBhZGRpbmc6IDEycHg7XHJcblx0XHRcdGRpc3BsYXk6IGZsZXg7XHJcblx0XHRcdGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcblx0XHRcdGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcclxuXHRcdFx0bWFyZ2luLWJvdHRvbTogMTBweDtcclxuXHRcdFx0Ym94LXNpemluZzogYm9yZGVyLWJveDtcclxuXHRcdH1cclxuXHJcblx0XHQuZ3Vlc3MtaXRlbTpsYXN0LWNoaWxkIHtcclxuXHRcdFx0bWFyZ2luLWJvdHRvbTogMDtcclxuXHRcdH1cclxuXHJcblx0XHQuZ3Vlc3MtaXRlbSAuYXJyb3cge1xyXG5cdFx0XHRjb2xvcjogIzlhYTNiMjtcclxuXHRcdFx0Zm9udC1zaXplOiAxOHB4O1xyXG5cdFx0fVxyXG5cclxuXHRcdC5jaGF0IHtcclxuXHRcdFx0bWFyZ2luOiA2cHggMCAxMnB4O1xyXG5cdFx0fVxyXG5cclxuXHRcdC5tc2cge1xyXG5cdFx0XHRtYXJnaW46IDEwcHggMDtcclxuXHRcdFx0ZGlzcGxheTogZmxleDtcclxuXHRcdH1cclxuXHJcblx0XHQubXNnLnVzZXIge1xyXG5cdFx0XHRqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xyXG5cdFx0fVxyXG5cclxuXHRcdC5idWJibGUge1xyXG5cdFx0XHRtYXgtd2lkdGg6IDgwJTtcclxuXHRcdFx0cGFkZGluZzogMTBweCAxMnB4O1xyXG5cdFx0XHRib3JkZXItcmFkaXVzOiAxNHB4O1xyXG5cdFx0XHRmb250LXNpemU6IDE0cHg7XHJcblx0XHRcdGxpbmUtaGVpZ2h0OiAxLjU7XHJcblx0XHR9XHJcblxyXG5cdFx0LnVzZXItYnViYmxlIHtcclxuXHRcdFx0YmFja2dyb3VuZDogIzRlN2JmZjtcclxuXHRcdFx0Y29sb3I6ICNmZmY7XHJcblx0XHRcdGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA0cHg7XHJcblx0XHRcdG1hcmdpbi1yaWdodDogNnB4O1xyXG5cdFx0fVxyXG5cclxuXHRcdC5haS1idWJibGUge1xyXG5cdFx0XHRiYWNrZ3JvdW5kOiAjZmZmO1xyXG5cdFx0XHRjb2xvcjogIzMzMztcclxuXHRcdFx0Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogNHB4O1xyXG5cdFx0XHRib3gtc2hhZG93OiAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjA2KTtcclxuXHRcdH1cclxuXHJcblx0XHQubGlzdGVuLWJ0biB7XHJcblx0XHRcdG1hcmdpbi1sZWZ0OiA4cHg7XHJcblx0XHRcdGNvbG9yOiAjNmI3MjgwO1xyXG5cdFx0XHRmb250LXNpemU6IDE0cHg7XHJcblx0XHR9XHJcblxyXG5cdFx0LmFpLWNhcmQtdGl0bGUge1xyXG5cdFx0XHRjb2xvcjogIzVmNmZmZjtcclxuXHRcdFx0Zm9udC13ZWlnaHQ6IDYwMDtcclxuXHRcdFx0bWFyZ2luLWJvdHRvbTogNnB4O1xyXG5cdFx0fVxyXG5cclxuXHRcdC5haS1jYXJkLWJvZHkge1xyXG5cdFx0XHRjb2xvcjogIzY2NjtcclxuXHRcdH1cclxuXHJcblx0XHQvKiBsb2FkaW5nIGFuaW1hdGlvbiAqL1xyXG5cdFx0LmFpLWxvYWRpbmcge1xyXG5cdFx0XHRkaXNwbGF5OiBmbGV4O1xyXG5cdFx0XHRhbGlnbi1pdGVtczogY2VudGVyO1xyXG5cdFx0XHRnYXA6IDZweDtcclxuXHRcdFx0cGFkZGluZzogNHB4IDA7XHJcblx0XHR9XHJcblxyXG5cdFx0LmxvYWRpbmctZG90IHtcclxuXHRcdFx0d2lkdGg6IDhweDtcclxuXHRcdFx0aGVpZ2h0OiA4cHg7XHJcblx0XHRcdGJvcmRlci1yYWRpdXM6IDUwJTtcclxuXHRcdFx0YmFja2dyb3VuZDogIzljYTNhZjtcclxuXHRcdFx0YW5pbWF0aW9uOiBsb2FkaW5nLWJvdW5jZSAxLjRzIGVhc2UtaW4tb3V0IGluZmluaXRlIGJvdGg7XHJcblx0XHR9XHJcblxyXG5cdFx0LmxvYWRpbmctZG90Om50aC1jaGlsZCgxKSB7XHJcblx0XHRcdGFuaW1hdGlvbi1kZWxheTogLTAuMzJzO1xyXG5cdFx0fVxyXG5cclxuXHRcdC5sb2FkaW5nLWRvdDpudGgtY2hpbGQoMikge1xyXG5cdFx0XHRhbmltYXRpb24tZGVsYXk6IC0wLjE2cztcclxuXHRcdH1cclxuXHJcblx0XHRAa2V5ZnJhbWVzIGxvYWRpbmctYm91bmNlIHtcclxuXHRcdFx0MCUsIDgwJSwgMTAwJSB7XHJcblx0XHRcdFx0dHJhbnNmb3JtOiBzY2FsZSgwLjgpO1xyXG5cdFx0XHRcdG9wYWNpdHk6IDAuNTtcclxuXHRcdFx0fVxyXG5cdFx0XHQ0MCUge1xyXG5cdFx0XHRcdHRyYW5zZm9ybTogc2NhbGUoMS4yKTtcclxuXHRcdFx0XHRvcGFjaXR5OiAxO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0LyogYm90dG9tIGRvY2sgKi9cclxuXHRcdC5kb2NrIHtcclxuXHRcdFx0cG9zaXRpb246IGZpeGVkO1xyXG5cdFx0XHRsZWZ0OiAwO1xyXG5cdFx0XHRyaWdodDogMDtcclxuXHRcdFx0Ym90dG9tOiAwO1xyXG5cdFx0XHRiYWNrZ3JvdW5kOiAjZjdmOGZjO1xyXG5cdFx0XHRib3gtc2hhZG93OiAwIC00cHggMTJweCByZ2JhKDAsIDAsIDAsIDAuMDYpO1xyXG5cdFx0XHRwYWRkaW5nLWJvdHRvbTogY29uc3RhbnQoc2FmZS1hcmVhLWluc2V0LWJvdHRvbSk7XHJcblx0XHRcdHBhZGRpbmctYm90dG9tOiBlbnYoc2FmZS1hcmVhLWluc2V0LWJvdHRvbSk7XHJcblx0XHR9XHJcblxyXG5cdFx0LnF1aWNrLWFjdGlvbnMge1xyXG5cdFx0XHRwYWRkaW5nOiA2cHggMTBweCA0cHg7XHJcblx0XHR9XHJcblxyXG5cdFx0LnF1aWNrLWFjdGlvbnMuaG9yaXpvbnRhbCB7XHJcblx0XHRcdHdoaXRlLXNwYWNlOiBub3dyYXA7XHJcblx0XHRcdHdpZHRoOiA5NSU7XHJcblx0XHR9XHJcblxyXG5cdFx0LnFhLWJ0biB7XHJcblx0XHRcdGRpc3BsYXk6IGlubGluZS1mbGV4O1xyXG5cdFx0XHRhbGlnbi1pdGVtczogY2VudGVyO1xyXG5cdFx0XHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuXHRcdFx0bWluLXdpZHRoOiA5NnB4O1xyXG5cdFx0XHR0ZXh0LWFsaWduOiBjZW50ZXI7XHJcblx0XHRcdGJhY2tncm91bmQ6ICNmZmY7XHJcblx0XHRcdGJvcmRlci1yYWRpdXM6IDEwcHg7XHJcblx0XHRcdHBhZGRpbmc6IDhweCAxMHB4O1xyXG5cdFx0XHRmb250LXNpemU6IDEycHg7XHJcblx0XHRcdGNvbG9yOiAjM2IzZjQ1O1xyXG5cdFx0XHRib3gtc2hhZG93OiAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjA0KTtcclxuXHRcdFx0bWFyZ2luLXJpZ2h0OiAxMHB4O1xyXG5cdFx0fVxyXG5cclxuXHRcdC5xYS1idG4ubWlub3Ige1xyXG5cdFx0XHRiYWNrZ3JvdW5kOiAjZWZmMWZmO1xyXG5cdFx0XHRjb2xvcjogIzRlN2JmZjtcclxuXHRcdH1cclxuXHJcblx0XHQucWEtYnRuOmxhc3QtY2hpbGQge1xyXG5cdFx0XHRtYXJnaW4tcmlnaHQ6IDA7XHJcblx0XHR9XHJcblxyXG5cdFx0LmlucHV0LWJhciB7XHJcblx0XHRcdGRpc3BsYXk6IGZsZXg7XHJcblx0XHRcdGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcblx0XHRcdHBhZGRpbmc6IDhweCAxMHB4IDEycHg7XHJcblx0XHRcdGdhcDogOHB4O1xyXG5cdFx0XHRiYWNrZ3JvdW5kOiAjZjdmOGZjO1xyXG5cdFx0fVxyXG5cclxuXHRcdC5pbnB1dCB7XHJcblx0XHRcdGZsZXg6IDE7XHJcblx0XHRcdGJhY2tncm91bmQ6ICNmZmY7XHJcblx0XHRcdGJvcmRlci1yYWRpdXM6IDI0cHg7XHJcblx0XHRcdHBhZGRpbmc6IDEwcHggMTRweDtcclxuXHRcdFx0Zm9udC1zaXplOiAxNHB4O1xyXG5cdFx0fVxyXG5cclxuXHRcdC5waCB7XHJcblx0XHRcdGNvbG9yOiAjOWFhM2IyO1xyXG5cdFx0fVxyXG5cclxuXHRcdC5taWMge1xyXG5cdFx0XHR3aWR0aDogMzZweDtcclxuXHRcdFx0aGVpZ2h0OiAzNnB4O1xyXG5cdFx0XHRib3JkZXItcmFkaXVzOiAxOHB4O1xyXG5cdFx0XHRiYWNrZ3JvdW5kOiAjZmZmO1xyXG5cdFx0XHRkaXNwbGF5OiBmbGV4O1xyXG5cdFx0XHRhbGlnbi1pdGVtczogY2VudGVyO1xyXG5cdFx0XHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuXHRcdFx0Ym94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4wNik7XHJcblx0XHR9XHJcblxyXG5cdFx0Lm1pYy5yZWNvcmRpbmcge1xyXG5cdFx0XHRiYWNrZ3JvdW5kOiAjZmZmYmYwO1xyXG5cdFx0XHRib3gtc2hhZG93OiAwIDAgMCAycHggcmdiYSgyNTUsIDE5MywgNywgLjI1KSBpbnNldDtcclxuXHRcdH1cclxuXHJcblx0XHQuc2VuZCB7XHJcblx0XHRcdGhlaWdodDogMzZweDtcclxuXHRcdFx0bGluZS1oZWlnaHQ6IDM2cHg7XHJcblx0XHRcdHBhZGRpbmc6IDAgMTRweDtcclxuXHRcdFx0Ym9yZGVyLXJhZGl1czogMThweDtcclxuXHRcdFx0YmFja2dyb3VuZDogIzRlN2JmZjtcclxuXHRcdFx0Y29sb3I6ICNmZmY7XHJcblx0XHRcdGZvbnQtc2l6ZTogMTRweDtcclxuXHRcdH1cclxuXHJcblx0XHQvKiBkcmF3ZXIgKi9cclxuXHRcdC5kcmF3ZXItbWFzayB7XHJcblx0XHRcdHdpZHRoOiA3MHZ3O1xyXG5cdFx0XHRoZWlnaHQ6IDEwMHZoO1xyXG5cdFx0fVxyXG5cclxuXHRcdC5kcmF3ZXIge1xyXG5cdFx0XHR3aWR0aDogMTAwJTtcclxuXHRcdFx0aGVpZ2h0OiAxMDB2aDtcclxuXHRcdFx0YmFja2dyb3VuZDogI2ZmZjtcclxuXHRcdFx0Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDhweDtcclxuXHRcdFx0Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDhweDtcclxuXHRcdFx0ZGlzcGxheTogZmxleDtcclxuXHRcdFx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuXHRcdH1cclxuXHJcblx0XHQuZHJhd2VyLnNob3cge1xyXG5cdFx0XHR0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XHJcblx0XHR9XHJcblxyXG5cdFx0LmRyYXdlci1zY3JvbGwge1xyXG5cdFx0XHRoZWlnaHQ6IGNhbGMoMTAwdmggLSA2NHB4KTtcclxuXHRcdFx0cGFkZGluZzogMTJweDtcclxuXHRcdFx0Ym94LXNpemluZzogYm9yZGVyLWJveDtcclxuXHRcdH1cclxuXHJcblx0XHQuZHJhd2VyLWdyb3VwIHtcclxuXHRcdFx0cGFkZGluZzogMTBweCA4cHggMDtcclxuXHRcdH1cclxuXHJcblx0XHQuZHJhd2VyLWRhdGUge1xyXG5cdFx0XHRjb2xvcjogIzlhYTNiMjtcclxuXHRcdFx0Zm9udC1zaXplOiAxMnB4O1xyXG5cdFx0XHRtYXJnaW4tYm90dG9tOiA4cHg7XHJcblx0XHR9XHJcblxyXG5cdFx0LmRyYXdlci1pdGVtIHtcclxuXHRcdFx0Y29sb3I6ICMzMzM7XHJcblx0XHRcdGZvbnQtc2l6ZTogMTNweDtcclxuXHRcdFx0bGluZS1oZWlnaHQ6IDIwcHg7XHJcblx0XHRcdG1hcmdpbjogNnB4IDA7XHJcblx0XHR9XHJcblxyXG5cdFx0LmRyYXdlci1kaXZpZGVyIHtcclxuXHRcdFx0aGVpZ2h0OiAxcHg7XHJcblx0XHRcdGJhY2tncm91bmQ6ICNlZWVlZWU7XHJcblx0XHRcdG1hcmdpbjogMTJweCAwO1xyXG5cdFx0fVxyXG5cclxuXHRcdC5kcmF3ZXItZm9vdGVyIHtcclxuXHRcdFx0cGFkZGluZzogMTJweDtcclxuXHRcdFx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICNlZWVlZWU7XHJcblx0XHRcdGRpc3BsYXk6IGZsZXg7XHJcblx0XHRcdGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcblx0XHR9XHJcblxyXG5cdFx0LmRyYXdlci1mb290ZXIge1xyXG5cdFx0XHQvKiBmaXhlZCBoZWlnaHQgZm9yIGNhbGMgYWJvdmUgKi9cclxuXHRcdFx0aGVpZ2h0OiA2NHB4O1xyXG5cdFx0fVxyXG5cclxuXHRcdC51c2VyLWljb24ge1xyXG5cdFx0XHR3aWR0aDogMjRweDtcclxuXHRcdFx0dGV4dC1hbGlnbjogY2VudGVyO1xyXG5cdFx0fVxyXG5cclxuXHRcdC51c2VyLW5hbWUge1xyXG5cdFx0XHRmbGV4OiAxO1xyXG5cdFx0XHRmb250LXNpemU6IDE0cHg7XHJcblx0XHRcdGNvbG9yOiAjMzMzO1xyXG5cdFx0fVxyXG5cclxuXHRcdC5mb290ZXItZ2VhciB7XHJcblx0XHRcdHdpZHRoOiAyNHB4O1xyXG5cdFx0XHR0ZXh0LWFsaWduOiBjZW50ZXI7XHJcblx0XHR9XHJcblxyXG5cdFx0Lyogdm9pY2Ugb3ZlcmxheSAqL1xyXG5cdFx0LnJlY29yZC1tYXNrIHtcclxuXHRcdFx0cG9zaXRpb246IGZpeGVkO1xyXG5cdFx0XHRsZWZ0OiAwO1xyXG5cdFx0XHRyaWdodDogMDtcclxuXHRcdFx0dG9wOiAwO1xyXG5cdFx0XHRib3R0b206IDA7XHJcblx0XHRcdGRpc3BsYXk6IGZsZXg7XHJcblx0XHRcdGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcblx0XHRcdGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG5cdFx0XHR6LWluZGV4OiA5OTk5O1xyXG5cdFx0fVxyXG5cclxuXHRcdC5yZWNvcmQtYm94IHtcclxuXHRcdFx0YmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAuNzUpO1xyXG5cdFx0XHRjb2xvcjogI2ZmZjtcclxuXHRcdFx0cGFkZGluZzogMTZweCAxOHB4O1xyXG5cdFx0XHRib3JkZXItcmFkaXVzOiAxMnB4O1xyXG5cdFx0XHRkaXNwbGF5OiBmbGV4O1xyXG5cdFx0XHRhbGlnbi1pdGVtczogY2VudGVyO1xyXG5cdFx0XHRnYXA6IDEwcHg7XHJcblx0XHRcdG1pbi13aWR0aDogMjIwcnB4O1xyXG5cdFx0fVxyXG5cclxuXHRcdC5yZWNvcmQtYm94LmNhbmNlbCB7XHJcblx0XHRcdGJhY2tncm91bmQ6IHJnYmEoMjIxLCA0NCwgMCwgLjg1KTtcclxuXHRcdH1cclxuXHJcblx0XHQucmVjb3JkLWljb24ge1xyXG5cdFx0XHRmb250LXNpemU6IDIwcHg7XHJcblx0XHR9XHJcblxyXG5cdFx0LnJlY29yZC10ZXh0IHtcclxuXHRcdFx0Zm9udC1zaXplOiAxNHB4O1xyXG5cdFx0fVxyXG5cclxuXHRcdC50ZXh0LXZvaWNlIHtcclxuXHRcdFx0ZGlzcGxheTogZmxleDtcclxuXHRcdFx0YWxpZ24taXRlbXM6IGNlbnRlcjtcclxuXHRcdH1cclxuXHJcblx0XHQudm9pY2UtcGxheSB7XHJcblx0XHRcdHdpZHRoOiAyMHB4O1xyXG5cdFx0XHRtYXJnaW4tbGVmdDogNXB4O1xyXG5cdFx0fVxyXG5cdFx0XHJcblx0XHQubWFzay1sYXllcntcclxuXHRcdFx0cG9zaXRpb246IGZpeGVkO1xyXG5cdFx0XHRsZWZ0OiAwO1xyXG5cdFx0XHRyaWdodDogMDtcclxuXHRcdFx0dG9wOiAwO1xyXG5cdFx0XHRib3R0b206IDA7XHJcblx0XHRcdGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgLjEpO1xyXG5cdFx0fVxyXG5cdFx0XHJcblx0XHRcclxuXHQ8L3N0eWxlPiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///51\n"); /***/ }), /* 52 */