@palerock/exam-qa 1.1.4 → 1.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.DS_Store +0 -0
- package/dist/index.html +1 -1
- package/dist/static/css/app.e9d3316bdc94e42d6bba9c83c827b80f.css +2 -0
- package/dist/static/css/app.e9d3316bdc94e42d6bba9c83c827b80f.css.map +1 -0
- package/dist/static/js/app.37f220b243a383aea601.js +2 -0
- package/dist/static/js/app.37f220b243a383aea601.js.map +1 -0
- package/dist/static/js/manifest.3ad1d5771e9b13dbdad2.js.map +1 -1
- package/lib-json/MULESOFT-DEV1.json +2405 -2862
- package/package.json +1 -1
- package/dist/static/css/app.8f8b2d7c84b52eeb2db45d369b9b0d52.css +0 -2
- package/dist/static/css/app.8f8b2d7c84b52eeb2db45d369b9b0d52.css.map +0 -1
- package/dist/static/js/app.251858b58c3037a0330d.js +0 -2
- package/dist/static/js/app.251858b58c3037a0330d.js.map +0 -1
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["webpack:///src/App.vue","webpack:///./src/App.vue?2fac","webpack:///./src/App.vue","webpack:///./src/utils/index.js","webpack:///./src/db/index.js","webpack:///./src/dao/index.js","webpack:///./src/config/index.js","webpack:///src/components/home-pages/HomeIndex.vue","webpack:///./src/components/home-pages/HomeIndex.vue?bbb0","webpack:///./src/components/home-pages/HomeIndex.vue","webpack:///src/components/HelloWorld.vue","webpack:///./src/components/HelloWorld.vue?3534","webpack:///./src/components/HelloWorld.vue","webpack:///src/components/HomePage.vue","webpack:///./src/components/HomePage.vue?b17a","webpack:///./src/components/HomePage.vue","webpack:///src/components/exam/DoExamPage.vue","webpack:///./src/components/exam/DoExamPage.vue?c54f","webpack:///./src/components/exam/DoExamPage.vue","webpack:///src/components/CategoryPage.vue","webpack:///./src/components/CategoryPage.vue?143f","webpack:///./src/components/CategoryPage.vue","webpack:///./src/router/index.js","webpack:///./src/plugins/index.js","webpack:///./src/main.js"],"names":["App","name","data","direction","lastBackPressTime","backPressInterval","immersed","navHeight","isImmersed","mounted","this","initPlusReady","initGlobalBackManager","beforeDestroy","removeBackButtonListener","cleanupImmersiveStyles","cleanupGlobalBackManager","methods","_this","window","GlobalBackManager","interceptors","addInterceptor","interceptor","addBackInterceptor","removeInterceptor","removeBackInterceptor","goBack","handleGlobalBack","$root","globalBack","console","log","push","index","indexOf","splice","_handleGlobalBack","asyncToGenerator_default","regenerator_default","a","mark","_callee","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_iterator","_step","wrap","_context","prev","next","toConsumableArray_default","reverse","undefined","get_iterator_default","done","value","sent","abrupt","t0","error","t1","return","finish","executeDefaultBack","stop","apply","arguments","$route","path","hasOpenDialog","closeTopDialog","$router","back","handleHomePageBack","_this2","plusReady","setupImmersiveStatusBar","addBackButtonListener","plus","document","addEventListener","detectImmersiveMode","ms","exec","navigator","userAgent","length","parse_float_default","app","applyImmersiveStyles","statusBarHeight","getStatusBarHeight","warn","injectImmersiveStyles","existingStyle","getElementById","remove","styleEle","createElement","id","innerHTML","head","appendChild","body","classList","add","documentElement","style","removeProperty","key","onBackButton","removeEventListener","currentTime","Date","getTime","runtime","quit","showExitTip","$toast","$Toast","nativeUI","toast","alert","dialogs","querySelectorAll","from_default","some","dialog","getComputedStyle","display","visibility","i","closeBtn","querySelector","click","contains","watch","to","from","getPageLevel","startsWith","toLevel","fromLevel","selectortype_template_index_0_src_App","render","_h","$createElement","_c","_self","attrs","staticClass","staticRenderFns","src_App","__webpack_require__","normalizeComponent","ssrContext","utils","getHashCode","obj","getStrHashCode","getMessage","concat","getPropertyNames","join","deep","includes","typeof_default","flat","entries_default","map","_ref","_ref2","slicedToArray_default","filter","r","toString","keys_default","str","len","hash","charCodeAt","arr","Infinity","ret","dirty","forEach","item","is_array_default","fromEntries","result","Array","storage","getItem","itemStr","localStorage","JSON","parse","e","setItem","stringify_default","removeItem","groupArray","groupedBy","_this3","array","hashCode","checkedMap","checkItem","Object","groupBy","_objectSpread","checkedHashCode","hashArr","find","values_default","duplicateRemoval","g","randomSort","sort","Math","random","dexieDB","Dexie","version","stores","config","question","bank","historyRecord","configDB","questionDB","bankDB","historyRecordDB","BaseDao","db","defaultEntry","classCallCheck_default","hook","primKey","createDate","now_default","modifyDate","changed","origin","dao__objectSpread","records","bulkPut","put","field","where","query","equals","first","keys","bulkDelete","delete","ConfigDao","possibleConstructorReturn_default","getPrototypeOf_default","call","QuestionDao","describe","type","BankDao","title","questions","HistoryRecordDao","rightTimes","errorTimes","maxTime","minTime","totalTime","hashCodeList","anyOf","toArray","questionDao","bankDao","historyRecordDao","vue_esm","use","loading","cell","cell_group","es_button","popup","grid","grid_item","es_checkbox","checkbox_group","tag","icon","existsMap","HomeIndex","isShowImporter","isFromOnline","onlineLibs","onlineSelects","questionLib","categories","loadingOnlineLibs","loadingProgress","totalLibsCount","loadedLibsCount","loadingError","computed","selectedLibs","res","lib","HomeIndex__objectSpread","goToCategory","category","params","selectLib","s","showImporter","importFromExist","_importFromExist","loadOnlineLibs","_loadOnlineLibs","_callee2","_context2","fetchOnlineLib","retryLoadOnlineLibs","_fetchOnlineLib","_callee3","maps","promises","libs","validLibs","_context3","$http","get","then","catch","promise_default","all","importLib","_importLib","_callee5","importCount","results","_context5","_callee4","l","_context4","importSingleLib","_x","success","fail","initCategories","_importSingleLib","_callee6","_context6","q","upsert","dao_bankDao","_x2","_initCategories","_callee7","_this4","_context7","notEqual","banks","b","reduce","ac","home_pages_HomeIndex","_vm","_m","_v","mode","column-num","gutter","clickable","on","slot","_l","animation-delay","$event","_s","round","click-overlay","model","callback","$$v","expression","width","_e","size","color","oi","label","placeholder","rows","block","components_home_pages_HomeIndex","HomeIndex_normalizeComponent","components_HelloWorld","HelloWorld_normalizeComponent","msg","nav_bar","tabbar","tabbar_item","HomePage","activeTabIndex","pages","api","activePage","components_HomePage","fixed","src_components_HomePage","HomePage_normalizeComponent","row","col","radio_group","es_radio","defaultQuestionInfo","required","score","usingScore","answerOptions","isRight","defaultExamInfo","panel","DoExamPage","answers","questionNum","isShowResult","letterIndex","examInfo","hasSubmit","examHashCode","historyExams","showAcButtons","backInterceptor","transitionName","previousQuestionNum","panStartScrollTop","showImagePreview","previewImageSrc","previewImageAlt","zoomLevel","translateX","translateY","initialDistance","initialZoom","lastTouchX","lastTouchY","isDragging","isZooming","imageNaturalWidth","imageNaturalHeight","containerWidth","containerHeight","isMouseDragging","mouseStartX","mouseStartY","lastClickTime","doubleClickDelay","lastTouchTime","defineProperty_default","totalNum","isReviewError","historyErrorHashCodes","neverDo","doneHashCodes","DoExamPage__objectSpread","active","questionsInfo","single","multi","apis","answer","orderNum","isMulti","opt","exam","imageStyle","cursor","transform","transformOrigin","transition","userSelect","WebkitUserSelect","MozUserSelect","msUserSelect","handleBack","originalHandleBack","shouldConfirmExit","confirm","message","confirmButtonText","cancelButtonText","confirmButtonColor","className","closeOnClickOverlay","isQuestionAnswered","getQuestionNavClass","classes","isChecked","isPractice","isPass","isMistake","registerBackInterceptor","_this5","closeImagePreview","unregisterBackInterceptor","getQuestionTitle","split","getQuestionDesc","errorExam","totalTimes","toFixed","setAnswer","ai","toggleAnswer","checkResult","_this6","rightAnswers","option","isAnswered","turnTo","root","$refs","scrollTop","confirmSubmit","_this7","answeredNum","progressRate","messageContent","submit","_this8","requireAllDone","unfinishedContent","rightNum","rightRate","queryByHashCode","codeInfo","relatedQuestion","isNaN","dialogClass","resultContent","adaptExamConfig","examConfig","checkNoAnswer","resultAnswers","checks","invalid","loadHistoryExamInfo","getOptionColor","_this9","queryMany","onTouchStart","evt","swipe","currentScrollTop","handleImageClick","event","_this10","target","tagName","toLowerCase","stopPropagation","src","alt","vibrate","handleKeyDown","$nextTick","adjustImagePreviewControlsPosition","overlay","$el","container","img","getBoundingClientRect","controlsBar","topOffset","immersedHeight","cssImmersedHeight","getPropertyValue","trim","replace","innerWidth","finalTop","top","resetImageTransform","touchMoved","onImageLoad","previewImage","naturalWidth","naturalHeight","imageContainer","clientWidth","clientHeight","zoomIn","min","constrainImagePosition","zoomOut","max","resetZoom","handleWheel","preventDefault","zoomFactor","deltaY","newZoom","rect","centerX","clientX","left","centerY","clientY","height","zoomChange","handleImageSwipe","handleImageTouchStart","touches","touch","timeDiff","distanceX","abs","distanceY","distance","sqrt","doubleTapDelay","doubleTapDistance","handleTouchDoubleTap","touch1","touch2","getDistance","zoomToPoint","handleImageTouchMove","deltaX","scaleChange","handleImageTouchEnd","checkBackgroundClick","dx","dy","maxTranslateX","maxTranslateY","containerRect","scaledWidth","offsetWidth","scaledHeight","offsetHeight","handleBackgroundClick","handleContainerClick","handlePreviewImageClick","handlePreviewImageDoubleClick","handleDoubleClick","eventOrTouch","handleMouseDown","button","startX","startY","handleMouseMove","currentTranslateX","currentTranslateY","newTranslateX","newTranslateY","handleMouseUp","handleMouseLeave","props","default","Boolean","isNew","device","setWakelock","destroyed","exam_DoExamPage","directives","rawName","arg","ref","touchstart","left-arrow","right-text","click-left","click-right","span","class","t","domProps","$set","option-selected","option-correct","option-incorrect","checked-color","analysis","dblclick","mousedown","mousemove","mouseup","mouseleave","touchmove","touchend","wheel","load","dragstart","components_exam_DoExamPage","DoExamPage_normalizeComponent","CategoryPage","examList","isShowOption","optionInfo","currentExam","historyRecords","categoryName","categoryTitle","loadCategoryExams","_loadCategoryExams","filteredBanks","sortBy","errorMap","record","CategoryPage__objectSpread","times","hasHistoryError","showOption","_showOption","doExam","getTotalCounts","getErrorCounts","getUndoneCounts","doneQuestions","toArray_default","slice","clearHistory","_mounted","$route.params.category","handler","immediate","components_CategoryPage","position","disabled","src_components_CategoryPage","CategoryPage_normalizeComponent","Vue","Router","router","routes","component","AlloyFingerPlugin","AlloyFinger","prototype","axios","jsonp","Utils","define_property_default","enumerable","productionTip","el","components","template"],"mappings":"8bASAA,GACAC,KAAA,MACAC,KAAA,kBACAC,UAAA,cACAC,kBAAA,EACAC,kBAAA,IACAC,SAAA,GACAC,UAAA,GACAC,YAAA,IAEAC,QAVA,WAYAC,KAAAC,gBAEAD,KAAAE,yBAEAC,cAhBA,WAkBAH,KAAAI,2BAEAJ,KAAAK,yBAEAL,KAAAM,4BAEAC,SAEAL,sBAFA,WAEA,IAAAM,EAAAR,KAEAS,OAAAC,mBAEAC,gBAGAC,eAAA,SAAAC,GACAL,EAAAM,mBAAAD,IAIAE,kBAAA,SAAAF,GACAL,EAAAQ,sBAAAH,IAIAI,OAAA,WACAT,EAAAU,qBAKAlB,KAAAmB,MAAAC,WAAA,WACAZ,EAAAU,oBAGAG,QAAAC,IAAA,iBAIAR,mBAjCA,SAiCAD,GACA,mBAAAA,GACAJ,OAAAC,kBAAAC,aAAAY,KAAAV,IAKAG,sBAxCA,SAwCAH,GACA,IAAAW,EAAAf,OAAAC,kBAAAC,aAAAc,QAAAZ,GACAW,GAAA,GACAf,OAAAC,kBAAAC,aAAAe,OAAAF,EAAA,IAKAN,iBAhDA,eAAAS,EAAAC,IAAMC,EAAAC,EAAAC,KAAA,SAAAC,IAAN,IAAArB,EAAAsB,EAAAC,EAAAC,EAAAC,EAAAC,EAAAxB,EAAA,OAAAgB,EAAAC,EAAAQ,KAAA,SAAAC,GAAA,cAAAA,EAAAC,KAAAD,EAAAE,MAAA,OAkDA9B,EAAA+B,IAAAjC,OAAAC,kBAAAC,cAAAgC,UAlDAV,GAAA,EAAAC,GAAA,EAAAC,OAAAS,EAAAL,EAAAC,KAAA,EAAAJ,EAAAS,IAoDAlC,GApDA,UAAAsB,GAAAI,EAAAD,EAAAK,QAAAK,KAAA,CAAAP,EAAAE,KAAA,gBAoDA5B,EApDAwB,EAAAU,MAAAR,EAAAC,KAAA,EAAAD,EAAAE,KAAA,GAuDA5B,IAvDA,YAAA0B,EAAAS,KAAA,CAAAT,EAAAE,KAAA,gBAyDApB,QAAAC,IAAA,WAzDAiB,EAAAU,OAAA,kBAAAV,EAAAE,KAAA,iBAAAF,EAAAC,KAAA,GAAAD,EAAAW,GAAAX,EAAA,SA6DAlB,QAAA8B,MAAA,aAAAZ,EAAAW,IA7DA,QAAAjB,GAAA,EAAAM,EAAAE,KAAA,gBAAAF,EAAAE,KAAA,iBAAAF,EAAAC,KAAA,GAAAD,EAAAa,GAAAb,EAAA,SAAAL,GAAA,EAAAC,EAAAI,EAAAa,GAAA,QAAAb,EAAAC,KAAA,GAAAD,EAAAC,KAAA,GAAAP,GAAA,MAAAG,EAAAiB,QAAAjB,EAAAiB,SAAA,WAAAd,EAAAC,KAAA,IAAAN,EAAA,CAAAK,EAAAE,KAAA,eAAAN,EAAA,eAAAI,EAAAe,OAAA,mBAAAf,EAAAe,OAAA,YAkEAtD,KAAAuD,qBAlEA,yBAAAhB,EAAAiB,SAAAxB,EAAAhC,OAAA,6DAAA2B,EAAA8B,MAAAzD,KAAA0D,YAAA,GAsEAH,mBAtEA,WA0EA,MAHAvD,KAAA2D,OAAAC,KASA5D,KAAA6D,gBACA7D,KAAA8D,iBAKA9D,KAAA+D,QAAAC,OAXAhE,KAAAiE,sBAaAhE,cAxFA,WAwFA,IAAAiE,EAAAlE,KAEAmE,EAAA,WAEAD,EAAAE,0BACAF,EAAAG,yBAGA5D,OAAA6D,KACAH,IAEAI,SAAAC,iBAAA,YAAAL,GAAA,GAIAnE,KAAAyE,uBAEAA,oBAzGA,WA2GAzE,KAAAJ,SAAA,GACA,IAAA8E,EAAA,mDAAAC,KAAAC,UAAAC,WACAH,KAAAI,QAAA,GAEA9E,KAAAJ,SAAAmF,IAAAL,EAAA,IACA1E,KAAAF,YAAA,EACAuB,QAAAC,IAAA,gBAAAtB,KAAAJ,YAEAI,KAAAF,YAAA,EACAE,KAAAJ,SAAA,EACAyB,QAAAC,IAAA,cAMAb,OAAAuE,IAAAvE,OAAAuE,QACAvE,OAAAuE,IAAApF,SAAAI,KAAAJ,SACAa,OAAAuE,IAAAnF,UAAAG,KAAAH,UACAY,OAAAuE,IAAAlF,WAAAE,KAAAF,WAGAE,KAAAiF,wBAEAb,wBAnIA,WAqIA,uBAAAE,KACA,IAEA,IAAAY,EAAAZ,KAAAM,UAAAO,qBACAD,EAAA,IACAlF,KAAAJ,SAAAsF,EACAlF,KAAAF,YAAA,EAGAW,OAAAuE,IAAAvE,OAAAuE,QACAvE,OAAAuE,IAAApF,SAAAI,KAAAJ,SACAa,OAAAuE,IAAAnF,UAAAG,KAAAH,UACAY,OAAAuE,IAAAlF,WAAAE,KAAAF,YAIAE,KAAAiF,uBAEA5D,QAAAC,IAAA,iBAAAtB,KAAAJ,UACA,MAAAuD,GACA9B,QAAA+D,KAAA,cAAAjC,KAIA8B,qBA7JA,WA+JAjF,KAAAF,YAAAE,KAAAJ,SAAA,GACAI,KAAAqF,yBAGAA,sBAnKA,WAqKA,IAAAC,EAAAf,SAAAgB,eAAA,mBACAD,GACAA,EAAAE,SAIA,IAAAC,EAAAlB,SAAAmB,cAAA,SACAD,EAAAE,GAAA,kBACAF,EAAAG,UAEA,+BAAA5F,KAAAJ,SAAA,2BAAAI,KAAAH,UAAAG,KAAAJ,UAAA,8GAGAI,KAAAJ,SAAA,qMAOAI,KAAAH,UAAAG,KAAAJ,UAAA,wDAGAI,KAAAH,UAAAG,KAAAJ,UAAA,wDAGAI,KAAAJ,SAAA,uDACAI,KAAAJ,SAAA,2DACAI,KAAAJ,SAAA,0JAMAI,KAAAJ,SAAA,4BAAAI,KAAAH,UAAAG,KAAAJ,UAAA,yDAGA2E,SAAAsB,KAAAC,YAAAL,GAGAlB,SAAAwB,KAAAC,UAAAC,IAAA,kBAEA5E,QAAAC,IAAA,aAEAjB,uBAjNA,WAmNA,IAAAiF,EAAAf,SAAAgB,eAAA,mBACAD,GACAA,EAAAE,SAIAjB,SAAAwB,KAAAC,UAAAR,OAAA,kBAGAjB,SAAA2B,gBAAAC,MAAAC,eAAA,qBACA7B,SAAA2B,gBAAAC,MAAAC,eAAA,sBAGA3F,OAAAuE,aACAvE,OAAAuE,IAAApF,gBACAa,OAAAuE,IAAAnF,iBACAY,OAAAuE,IAAAlF,aAKAQ,yBAxOA,WAyOAG,OAAAC,oBAEAD,OAAAC,kBAAAC,uBAEAF,OAAAC,mBAIAV,KAAAmB,MAAAC,mBACApB,KAAAmB,MAAAC,WAGAC,QAAAC,IAAA,eAEA+C,sBAvPA,WAyPA,oBAAAC,MACAA,KAAA+B,IAAA7B,iBAAA,aAAAxE,KAAAsG,cAAA,IAGAlG,yBA7PA,WA8PA,oBAAAkE,MACAA,KAAA+B,IAAAE,oBAAA,aAAAvG,KAAAsG,eAGAA,aAlQA,WAoQAtG,KAAAkB,oBAEA+C,mBAtQA,WAuQA,IAAAuC,GAAA,IAAAC,MAAAC,UAGAF,EAAAxG,KAAAN,kBAAAM,KAAAL,kBACA2E,KAAAqC,QAAAC,QAKA5G,KAAAN,kBAAA8G,EAGAxG,KAAA6G,gBAEAA,YArRA,WAuRA7G,KAAA8G,OACA9G,KAAA8G,OAAA,iBACA,IAAA9G,KAAA+G,OACA/G,KAAA+G,OAAA,YAGA,oBAAAzC,WAAA0C,SACA1C,KAAA0C,SAAAC,MAAA,YAGAC,MAAA,aAIArD,cArSA,WAuSA,IAAAsD,EAAA5C,SAAA6C,iBAAA,yEACA,OAAAC,IAAAF,GAAAG,KAAA,SAAAC,GACA,IAAApB,EAAA1F,OAAA+G,iBAAAD,GACA,eAAApB,EAAAsB,SAAA,WAAAtB,EAAAuB,cAGA5D,eA7SA,WAkTA,IAHA,IAAAqD,EAAA5C,SAAA6C,iBAAA,4FAGAO,EAAAR,EAAArC,OAAA,EAAA6C,GAAA,EAAAA,IAAA,CACA,IAAAJ,EAAAJ,EAAAQ,GACAxB,EAAA1F,OAAA+G,iBAAAD,GACA,YAAApB,EAAAsB,SAAA,WAAAtB,EAAAuB,WAAA,CAEA,IAAAE,EAAAL,EAAAM,cAAA,qEACA,OAAAD,OACAA,EAAAE,QAKAP,EAAAvB,UAAA+B,SAAA,oBACAR,EAAAO,aAKAP,EAAApB,MAAAsB,QAAA,YAMAO,OACArE,OADA,SACAsE,EAAAC,GAEA,IAAAC,EAAA,SAAAvE,GACA,YAAAA,EAAA,EACAA,EAAAwE,WAAA,gBACA,UAAAxE,EAAA,EACA,GAGAyE,EAAAF,EAAAF,EAAArE,MACA0E,EAAAH,EAAAD,EAAAtE,MAKA5D,KAAAP,UADA4I,EAAAC,EACA,aACAD,EAAAC,EACA,cAGA,gBC7XeC,GADEC,OAFjB,WAA0B,IAAaC,EAAbzI,KAAa0I,eAA0BC,EAAvC3I,KAAuC4I,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,OAAiBE,OAAOlD,GAAA,SAAYgD,EAAA,cAAmBE,OAAOtJ,KAA7HS,KAA6HP,aAAsBkJ,EAAA,eAAoBG,YAAA,aAAsB,QAEtMC,oBCCjB,IAuBeC,EAvBUC,EAAQ,OAcjCC,CACE5J,EACAiJ,GATF,EAVA,SAAAY,GACEF,EAAQ,SAaV,KAEA,MAUgC,g1BC1BjB,IAAAG,IACXC,YADW,SACCC,GACR,OAAOtJ,KAAKuJ,eAAevJ,KAAKwJ,WAAWF,GAAKG,OAAOzJ,KAAK0J,iBAAiBJ,IAAMK,KAAK,MAE5FD,iBAJW,SAIMd,GAAkB,IAAApI,EAAAR,KAAX4J,EAAWlG,UAAAoB,OAAA,QAAAlC,IAAAc,UAAA,GAAAA,UAAA,GAAJ,GAC3B,OAAIkG,GAAQ,EACD,IAENhB,IAAU,SAAU,SAAU,UAAW,YAAYiB,SAA5CC,KAA4DlB,KAAUA,aAAiBnC,KAC1F,GAEJzG,KAAK+J,KACRC,KAAepB,GAAOqB,IAAI,SAAAC,GAAA,IAAAC,EAAAC,KAAAF,EAAA,GAAE7D,EAAF8D,EAAA,GAAOpH,EAAPoH,EAAA,UAAmB9D,EAAK7F,EAAKkJ,iBAAiB3G,EAAO6G,SACjFS,OAAO,SAAAC,GAAC,OAAS,MAALA,GAAmB,KAANA,KAE/Bd,WAfW,SAeAZ,EAAOgB,GAAM,IAAA1F,EAAAlE,KAEpB,OADQ,MAAR4J,IAAiBA,EAAO,IACpBA,GAAQ,EACD,IAENhB,IAAU,SAAU,SAAU,UAAW,YAAYiB,SAA5CC,KAA4DlB,KAAUA,aAAiBnC,MAChF,MAATmC,EAAgBA,EAAM2B,WAAa,IAExCvK,KAAK+J,KACRS,IAAY5B,GAAOqB,IAAI,SAAA5D,GACnB,OAAOnC,EAAKsF,WAAWZ,EAAMvC,GAAMuD,QAEzCS,OAAO,SAAAC,GAAC,OAAS,MAALA,GAAmB,KAANA,KAE/Bf,eA7BW,SA6BIkB,GACX,IAAc9C,EAAQ+C,EAAlBC,EAAO,EACX,GAAmB,IAAfF,EAAI3F,OAAc,OAAO6F,EAC7B,IAAKhD,EAAI,EAAG+C,EAAMD,EAAI3F,OAAQ6C,EAAI+C,EAAK/C,IAEnCgD,GAASA,GAAQ,GAAKA,EADhBF,EAAIG,WAAWjD,GAErBgD,GAAQ,EAEZ,OAAOA,EAAO,IAElBZ,KAvCW,SAuCNc,GAAsB,IAAjBjB,EAAiBlG,UAAAoB,OAAA,QAAAlC,IAAAc,UAAA,GAAAA,UAAA,GAAVoH,IACTC,KACAC,GAAQ,EASZ,OARAH,EAAII,QAAQ,SAAAC,GACJC,KAAcD,IACdF,GAAQ,EACRD,EAAIxJ,KAAJkC,MAAAsH,EAAGrI,IAASwI,KAEZH,EAAIxJ,KAAK2J,KAGVF,GAASpB,EAAO,EAAI5J,KAAK+J,KAAKgB,EAAKnB,KAAUmB,GAExDK,YApDW,SAoDCP,GACR,IAAIQ,KAMJ,OALAR,EAAII,QAAQ,SAAAnJ,GACJA,aAAawJ,QACbD,EAAOvJ,EAAE,IAAMA,EAAE,MAGlBuJ,GAEXE,SACIC,QADK,SACGnF,GACJ,IAAIoF,EAAUC,aAAaF,QAAQ,aAAenF,GAC9CgF,EAAS,KACb,IACIA,EAASM,KAAKC,MAAMH,GACtB,MAAOI,GACLxK,QAAQC,IAAR,0BAAAmI,OAAsCpD,EAAtC,yBAEJ,OAAOgF,GAEXS,QAXK,SAWGzF,EAAKtD,GACT,IAAIsI,EAAS,KACb,IACIA,EAASU,IAAehJ,GACxB2I,aAAaI,QAAQ,aAAezF,EAAKgF,GAC3C,MAAOQ,GACLxK,QAAQC,IAAR,2BAAAmI,OAAuCpD,EAAvC,gBAGR2F,WApBK,SAoBM3F,GACPqF,aAAaM,WAAW,aAAe3F,KAG/C4F,WArFW,SAqFApB,EAAKqB,GAAW,IAAAC,EAAAnM,KACnBoM,EAAQvB,EAAIZ,IAAI,SAAAnI,GAAC,OAAMuK,SAAUF,EAAK9C,YAAYvH,GAAIoJ,KAAMpJ,KAC1DoK,aAAqBZ,QACvBY,GAAaA,IAEjB,IAMII,KASJ,OAfiBF,EAAMnC,IAAI,SAAAnI,GAAC,OACxBuK,SAAUvK,EAAEuK,SACZE,UAAWC,OAAOpB,YACdc,EAAUjC,IAAI,SAAAwC,GAAO,OAAKA,GAAU3K,EAAEoJ,UAAYuB,UAEtDxC,IAAI,SAAAnI,GAAC,0NAAA4K,IAAS5K,GAAG6K,gBAAiBR,EAAK9C,YAAYvH,EAAEyK,eAE9CtB,QAAQ,SAAAnJ,GACf,IAAI8K,EAAUN,EAAWxK,EAAE6K,iBACtBC,IACDA,MAEJA,EAAQrL,KAAK6K,EAAMS,KAAK,SAAAhC,GAAG,OAAIA,EAAIwB,WAAavK,EAAEuK,WAAUnB,MAC5DoB,EAAWxK,EAAE6K,iBAAmBC,IAE7BE,KAAcR,IAEzBS,iBA3GW,SA2GMlC,GACb,IAAIuB,EAAQvB,EAAIZ,IAAI,SAAAnI,GAAC,OAAMoJ,KAAMpJ,KAEjC,OADc9B,KAAKiM,WAAWG,EAAO,QACtBnC,IAAI,SAAA+C,GAAC,OAAIA,EAAE,GAAG9B,QAEjC+B,WAhHW,SAgHApC,GACP,OAAOA,EAAIqC,KAAK,WACZ,OAAOC,KAAKC,SAAW,uJChH7BC,GAAU,cAAIC,GAAM,UAC1BD,GAAQE,QAAQ,GAAGC,QACfC,OAAQ,qCACRC,SAAU,mDACVC,KAAM,sDACNC,cAAe,iGAEnBP,GAAQE,QAAQ,GAAGC,QACfG,KAAM,kEAEVN,GAAQE,QAAQ,GAAGC,QACfE,SAAU,+DAEd,IAAMG,GAAWR,GAAO,OAClBS,GAAaT,GAAO,SACpBU,GAASV,GAAO,KAChBW,GAAkBX,GAAO,+WChBzBY,cACF,SAAAA,EAAYC,EAAIC,GAAcC,KAAApO,KAAAiO,GAC1BjO,KAAKkO,GAAKA,EACVlO,KAAKmO,aAAeA,MACpBnO,KAAKkO,GAAGG,KAAK,WAAY,SAACC,EAAShF,GAC/BA,EAAIiF,WAAaC,OACjBlF,EAAImF,WAAaD,SAErBxO,KAAKkO,GAAGG,KAAK,WAAY,SAACK,EAASrI,EAAKsI,GAMpC,OALAD,EAAO,aAAmBF,OACrBG,EAAM,cACPD,EAAO,YAAkBF,QAE7BnN,QAAQC,IAARsN,MAAgBF,IACTA,gFAIFG,mFACLA,aAAmBvD,gDACZtL,KAAKkO,GAAGY,QAAQD,EAAQ5E,IAAI,SAAAK,GAAC,OAAAsE,MAASpO,EAAK2N,gBAAiB7D,uCAEhEtK,KAAKkO,GAAGa,IAARH,MAAgB5O,KAAKmO,gBAAiBU,sIAG3CG,GACF,OAAOhP,KAAKkO,GAAGe,MAAMD,2CAGT3C,GACZ,OAAOrM,KAAKkP,MAAM,YAAYC,OAAO9C,GAAU+C,uEAGtCC,wEACLA,aAAgB/D,gDACTtL,KAAKkO,GAAGoB,WAAWD,oCAEvBrP,KAAKkO,GAAGqB,OAAOF,gHAKxBG,eACF,SAAAA,IAAc,OAAApB,KAAApO,KAAAwP,GAAAC,KAAAzP,KAAA0P,KAAAF,GAAAG,KAAA3P,KACJ6N,IAAW9K,MAAO,4BAFRkL,IAMlB2B,eACF,SAAAA,IAAc,OAAAxB,KAAApO,KAAA4P,GAAAH,KAAAzP,KAAA0P,KAAAE,GAAAD,KAAA3P,KACJ8N,IACF+B,SAAU,GACVC,KAAM,gCAJQ7B,IASpB8B,eACF,SAAAA,IAAc,OAAA3B,KAAApO,KAAA+P,GAAAN,KAAAzP,KAAA0P,KAAAK,GAAAJ,KAAA3P,KACJ+N,IACFiC,MAAO,GACPC,oCAJUhC,IAShBiC,eACF,SAAAA,IAAc,OAAA9B,KAAApO,KAAAkQ,GAAAT,KAAAzP,KAAA0P,KAAAQ,GAAAP,KAAA3P,KACJgO,IACFmC,WAAY,EAAGC,WAAY,EAAGC,QAAS,EAAGC,QAAS,EAAGC,UAAW,oEAIzDlE,GACZ,OAAOrM,KAAKkP,MAAM,mBAAmBC,OAAO9C,GAAU+C,0CAGhDoB,GACN,OAAOxQ,KAAKkP,MAAM,mBAAmBuB,MAAMD,GAAcE,iBAZlCzC,IAiBzB0C,IADY,IAAInB,GACF,IAAII,IAClBgB,GAAU,IAAIb,GACdc,GAAmB,IAAIX,GCvFdzC,GACF,qWC0IbqD,EAAA,EAAAC,IAAAC,EAAA,GACAF,EAAA,EAAAC,IAAAxJ,EAAA,GACAuJ,EAAA,EAAAC,IAAA/B,EAAA,GAAA+B,IAAAE,EAAA,GAAAF,IAAAG,EAAA,GACAJ,EAAA,EAAAC,IAAAI,EAAA,GACAL,EAAA,EAAAC,IAAAK,EAAA,GACAN,EAAA,EAAAC,IAAAM,EAAA,GAAAN,IAAAO,EAAA,GACAR,EAAA,EAAAC,IAAAQ,EAAA,GAAAR,IAAAS,EAAA,GACAV,EAAA,EAAAC,IAAAU,EAAA,GACAX,EAAA,EAAAC,IAAAW,EAAA,GAEA,IAAAC,GAAA,sDACAC,IACArS,KAAA,YACAC,KAFA,WAGA,OACAqS,gBAAA,EACAC,cAAA,EACAC,cACAC,iBACAC,YAAA,GACAC,cACAC,mBAAA,EACAC,gBAAA,YACAC,eAAA,EACAC,gBAAA,EACAC,aAAA,OAGAC,UACAC,aADA,WACA,IAAAjS,EAAAR,KACA0S,EAAA1S,KAAA+R,WAAA1H,OAAA,SAAAsI,GAAA,OAAAnS,EAAAwR,cAAAnI,SAAA8I,EAAAtG,YAAApC,IAAA,SAAA0I,GAAA,OAAAC,MAAAD,KAIA,OAHAD,EAAAzH,QAAA,SAAAX,UACAA,EAAA+B,WAEAqG,IAGAnS,SACAsS,aADA,SACAC,GACA9S,KAAA+D,QAAAxC,MACAhC,KAAA,eACAwT,QAAAD,eAGAE,UAPA,SAOAL,GACA3S,KAAAgS,cAAAnI,SAAA8I,EAAAtG,UAAArM,KAAAgS,cAAAhS,KAAAgS,cAAA3H,OAAA,SAAA4I,GAAA,OAAAA,IAAAN,EAAAtG,WAAArM,KAAAgS,iBAAAvI,OAAA/G,IAAA1C,KAAAgS,gBAAAW,EAAAtG,WACArM,KAAAiS,YAAAlG,IAAA/L,KAAAyS,eAEAS,aAXA,WAYAlT,KAAA6R,gBAAA,EACA7R,KAAA8R,cAAA,GAEAqB,gBAfA,eAAAC,EAAAxR,IAAAC,EAAAC,EAAAC,KAAA,SAAAC,IAAA,OAAAH,EAAAC,EAAAQ,KAAA,SAAAC,GAAA,cAAAA,EAAAC,KAAAD,EAAAE,MAAA,cAgBAzC,KAAA8R,cAAA,EACA9R,KAAAuS,aAAA,KAjBAhQ,EAAAE,KAAA,EAkBAzC,KAAAqT,iBAlBA,wBAAA9Q,EAAAiB,SAAAxB,EAAAhC,SAAA,yBAAAoT,EAAA3P,MAAAzD,KAAA0D,YAAA,GAqBA2P,eArBA,eAAAC,EAAA1R,IAAAC,EAAAC,EAAAC,KAAA,SAAAwR,IAAA,IAAAb,EAAA,OAAA7Q,EAAAC,EAAAQ,KAAA,SAAAkR,GAAA,cAAAA,EAAAhR,KAAAgR,EAAA/Q,MAAA,cAsBAzC,KAAAmS,mBAAA,EACAnS,KAAAoS,gBAAA,cACApS,KAAAqS,eAAA,EACArS,KAAAsS,gBAAA,EAzBAkB,EAAAhR,KAAA,EAAAgR,EAAA/Q,KAAA,EA4BAzC,KAAAyT,iBA5BA,OA4BAf,EA5BAc,EAAAxQ,KA6BAhD,KAAA+R,WAAAW,EAAArI,OAAA,SAAAC,GAAA,OAAAA,KAAA9K,OAAAyK,IAAA,SAAAK,GAAA,OAAAsI,MACAtI,EAAA9K,MAAA6M,SAAA/B,EAAA9K,KAAA6M,UAAAjD,GAAAC,YAAAiB,EAAA9K,KAAAwQ,MAAA1F,EAAA9K,KAAAsT,cAEA9S,KAAAoS,gBAAA,QAAA3I,OAAAzJ,KAAA+R,WAAAjN,OAAA,QACA9E,KAAAuS,aAAA,KAjCAiB,EAAA/Q,KAAA,iBAAA+Q,EAAAhR,KAAA,GAAAgR,EAAAtQ,GAAAsQ,EAAA,SAmCAnS,QAAA8B,MAAA,YAAAqQ,EAAAtQ,IACAlD,KAAAuS,aAAA,kBACAvS,KAAAoS,gBAAA,GArCA,eAAAoB,EAAAhR,KAAA,GAuCAxC,KAAAmS,mBAAA,EAvCAqB,EAAAlQ,OAAA,6BAAAkQ,EAAAhQ,SAAA+P,EAAAvT,OAAA,0CAAAsT,EAAA7P,MAAAzD,KAAA0D,YAAA,GA2CAgQ,oBA3CA,WA4CA1T,KAAAqT,kBAEAI,eA9CA,eAAAE,EAAA/R,IAAAC,EAAAC,EAAAC,KAAA,SAAA6R,IAAA,IAAAC,EAAAC,EAAAC,EAAAC,EAAA9P,EAAAlE,KAAA,OAAA6B,EAAAC,EAAAQ,KAAA,SAAA2R,GAAA,cAAAA,EAAAzR,KAAAyR,EAAAxR,MAAA,cAAAwR,EAAAzR,KAAA,EAiDAxC,KAAAoS,gBAAA,cAjDA6B,EAAAxR,KAAA,EAkDAzC,KAAAkU,MAAAC,IAAAxC,GAAA,aAlDA,UAAAsC,EAAA/Q,GAAA+Q,EAAAjR,KAkDAxD,KAlDAyU,EAAA/Q,GAAA,CAAA+Q,EAAAxR,KAAA,QAAAwR,EAAA/Q,MAAA,UAoDA,KAFA2Q,EAlDAI,EAAA/Q,IAoDA4B,OApDA,CAAAmP,EAAAxR,KAAA,gBAqDAzC,KAAAoS,gBAAA,UArDA6B,EAAAhR,OAAA,4BAyDAjD,KAAAqS,eAAAwB,EAAA/O,OACA9E,KAAAsS,gBAAA,EACAtS,KAAAoS,gBAAA,UAAA3I,OAAAoK,EAAA/O,OAAA,WAGAgP,EAAAD,EAAA5J,IAAA,SAAAA,EAAAzI,GACA,OAAA0C,EAAAgQ,MAAAC,IAAAxC,GAAA,IAAA1H,GACAmK,KAAA,SAAA/I,GAGA,OAFAnH,EAAAoO,kBACApO,EAAAkO,gBAAA,aAAA3I,OAAAvF,EAAAoO,gBAAA,KAAA7I,OAAAvF,EAAAmO,eAAA,KACAhH,IAEAgJ,MAAA,SAAAlR,GAIA,OAHAe,EAAAoO,kBACAjR,QAAA+D,KAAA,QAAAqE,OAAAQ,EAAA,QAAA9G,GACAe,EAAAkO,gBAAA,aAAA3I,OAAAvF,EAAAoO,gBAAA,KAAA7I,OAAAvF,EAAAmO,eAAA,YACA,SAzEA4B,EAAAxR,KAAA,GA6EA6R,EAAAxS,EAAAyS,IAAAT,GA7EA,eA6EAC,EA7EAE,EAAAjR,KAgFAgR,EAAAD,EAAA1J,OAAA,SAAAsI,GAAA,cAAAA,IACA3S,KAAAoS,gBAAA,aAAA3I,OAAAuK,EAAAlP,OAAA,UAAA2E,OAAAoK,EAAA/O,OAAAkP,EAAAlP,QAjFAmP,EAAAhR,OAAA,SAmFA+Q,GAnFA,cAAAC,EAAAzR,KAAA,GAAAyR,EAAA7Q,GAAA6Q,EAAA,SAqFA5S,QAAA8B,MAAA,cAAA8Q,EAAA7Q,IACApD,KAAAoS,gBAAA,WAtFA6B,EAAA7Q,GAAA,yBAAA6Q,EAAAzQ,SAAAoQ,EAAA5T,OAAA,oCAAA2T,EAAAlQ,MAAAzD,KAAA0D,YAAA,GA0FA8Q,UA1FA,eAAAC,EAAA7S,IAAAC,EAAAC,EAAAC,KAAA,SAAA2S,IAAA,IAAA/B,EAAAgC,EAAAC,EAAAvJ,EAAAc,EAAAnM,KAAA,OAAA6B,EAAAC,EAAAQ,KAAA,SAAAuS,GAAA,cAAAA,EAAArS,KAAAqS,EAAApS,MAAA,UAAAoS,EAAArS,KAAA,EA4FAmQ,EAAAhH,KAAAC,MAAA5L,KAAAiS,aACA0C,EAAA,IAEAhC,aAAArH,OA/FA,CAAAuJ,EAAApS,KAAA,gBAAAoS,EAAApS,KAAA,EAgGA6R,EAAAxS,EAAAyS,IAAA5B,EAAA1I,IAAA,eAAAC,EAAAtI,IAAkBC,EAAAC,EAAAC,KAAlB,SAAA+S,EAAAC,GAAA,OAAAlT,EAAAC,EAAAQ,KAAA,SAAA0S,GAAA,cAAAA,EAAAxS,KAAAwS,EAAAvS,MAAA,cAAAuS,EAAAvS,KAAA,EACA0J,EAAA8I,gBAAAF,GADA,cAAAC,EAAA/R,OAAA,SAAA+R,EAAAhS,MAAA,wBAAAgS,EAAAxR,SAAAsR,MAAA,gBAAAI,GAAA,OAAAhL,EAAAzG,MAAAzD,KAAA0D,YAAA,KAhGA,OAgGAkR,EAhGAC,EAAA7R,KAmGA2R,EAAAC,EAAAvK,OAAA,SAAAC,GAAA,OAAAA,IAAAxF,OAnGA+P,EAAApS,KAAA,wBAAAoS,EAAApS,KAAA,GAqGAzC,KAAAiV,gBAAAtC,GArGA,QAqGAtH,EArGAwJ,EAAA7R,KAsGA2R,EAAAtJ,EAAA,IAtGA,QA0GAsJ,EAAA,EACA3U,KAAA8G,OAAAqO,QAAA,QAAA1L,OAAAkL,EAAA,UAEA3U,KAAA8G,OAAAsO,KAAA,cA7GAP,EAAApS,KAAA,iBAAAoS,EAAArS,KAAA,GAAAqS,EAAA3R,GAAA2R,EAAA,SAiHAxT,QAAA8B,MAAA,UAAA0R,EAAA3R,IACAlD,KAAA8G,OAAAsO,KAAA,UAAA3L,OAAAL,GAAAI,WAAAqL,EAAA3R,MAlHA,eAAA2R,EAAApS,KAAA,GAqHAzC,KAAAqV,iBArHA,QAsHArV,KAAA6R,gBAAA,EACA7R,KAAAiS,YAAA,GAvHA,yBAAA4C,EAAArR,SAAAkR,EAAA1U,OAAA,oCAAAyU,EAAAhR,MAAAzD,KAAA0D,YAAA,GAyHAuR,gBAzHA,eAAAK,EAAA1T,IAAAC,EAAAC,EAAAC,KAAA,SAAAwT,EAyHA5C,GAzHA,IAAAhF,EAAA,OAAA9L,EAAAC,EAAAQ,KAAA,SAAAkT,GAAA,cAAAA,EAAAhT,KAAAgT,EAAA/S,MAAA,UA0HAkQ,EAAA1C,WAAA,IAAA0C,EAAA1C,UAAAnL,OA1HA,CAAA0Q,EAAA/S,KAAA,eAAA+S,EAAAvS,OAAA,UA2HA,GA3HA,cA6HA0P,EAAA1C,UAAAhF,QAAA,SAAAwK,GACAA,EAAApJ,SAAAoJ,EAAApJ,UAAAjD,GAAAC,YAAAoM,MAEA9H,EAhIAiF,MAiIAD,GACA1C,UAAA0C,EAAA1C,UAAAhG,IAAA,SAAAwL,GAAA,OAAAA,EAAApJ,cAEAA,SAAAsG,EAAAtG,UAAAjD,GAAAC,YAAAsE,GApIA6H,EAAA/S,KAAA,EAqIAkO,GAAA+E,OAAA/C,EAAA1C,WACAmE,KAAA,WACA,OAAAuB,GAAAD,QAAA/H,MAvIA,cAAA6H,EAAAvS,OAAA,UAyIA,GAzIA,wBAAAuS,EAAAhS,SAAA+R,MAAA,gBAAAK,GAAA,OAAAN,EAAA7R,MAAAzD,KAAA0D,YAAA,GA2IA2R,eA3IA,eAAAQ,EAAAjU,IAAAC,EAAAC,EAAAC,KAAA,SAAA+T,IAAA,IAAAC,EAAA/V,KAAA,OAAA6B,EAAAC,EAAAQ,KAAA,SAAA0T,GAAA,cAAAA,EAAAxT,KAAAwT,EAAAvT,MAAA,cAAAuT,EAAAvT,KAAA,EA4IAkT,GAAAzG,MAAA,YAAA+G,SAAA,IAAAvF,UAAA0D,KAAA,SAAA8B,GACAA,IAAAjM,IAAA,SAAAkM,GAEA,OADAA,EAAArD,SAAAqD,EAAArD,UAAA,UACAqD,IAEAJ,EAAA7D,WAAAgE,EAAAE,OAAA,SAAAC,EAAAnL,GAIA,OAHAmL,EAAAxM,SAAAqB,EAAA4H,WACAuD,EAAA9U,KAAA2J,EAAA4H,UAEAuD,SArJA,wBAAAL,EAAAxS,SAAAsS,MAAA,yBAAAD,EAAApS,MAAAzD,KAAA0D,YAAA,IA0JA3D,QApLA,WAqLAC,KAAAqV,mBCxUeiB,IADE9N,OAFP,WAAgB,IAAA+N,EAAAvW,KAAayI,EAAA8N,EAAA7N,eAA0BC,EAAA4N,EAAA3N,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,OAAiBG,YAAA,eAAyByN,EAAAC,GAAA,GAAAD,EAAAE,GAAA,KAAA9N,EAAA,cAAyCE,OAAOtJ,KAAA,WAAAmX,KAAA,YAAmC/N,EAAA,YAAiBG,YAAA,gBAAAD,OAAmC8N,aAAA,EAAAC,OAAA,MAA4BjO,EAAA,iBAAsBG,YAAA,iCAAAD,OAAoD6I,KAAA,OAAAmF,UAAA,IAA6BC,IAAKhP,MAAAyO,EAAArD,gBAA0BvK,EAAA,OAAYG,YAAA,YAAAD,OAA+BkO,KAAA,QAAcA,KAAA,SAAapO,EAAA,QAAaG,YAAA,eAAyByN,EAAAE,GAAA,UAAAF,EAAAE,GAAA,KAAA9N,EAAA,QAA0CG,YAAA,kBAA4ByN,EAAAE,GAAA,cAAAF,EAAAE,GAAA,KAAAF,EAAAS,GAAAT,EAAA,oBAAAzD,EAAAtR,GAAoF,OAAAmH,EAAA,iBAA2BtC,IAAAyM,EAAAhK,YAAA,mCAAA3C,OAAoE8Q,kBAAA,GAAAzV,EAAA,KAAyCqH,OAAS6I,KAAA,UAAAmF,UAAA,IAAgCC,IAAKhP,MAAA,SAAAoP,GAAyB,OAAAX,EAAA1D,aAAAC,OAAoCnK,EAAA,OAAYG,YAAA,YAAAD,OAA+BkO,KAAA,QAAcA,KAAA,SAAapO,EAAA,QAAaG,YAAA,eAAyByN,EAAAE,GAAAF,EAAAY,GAAArE,MAAAyD,EAAAE,GAAA,KAAA9N,EAAA,QAAoDG,YAAA,kBAA4ByN,EAAAE,GAAA,iBAAuB,OAAAF,EAAAE,GAAA,KAAA9N,EAAA,aAAsCG,YAAA,eAAAD,OAAkCuO,MAAA,IAAWN,IAAKO,gBAAA,SAAAH,GAAiCX,EAAA1E,gBAAA,IAA4ByF,OAAQvU,MAAAwT,EAAA,eAAAgB,SAAA,SAAAC,GAAoDjB,EAAA1E,eAAA2F,GAAuBC,WAAA,oBAA8B9O,EAAA,OAAYG,YAAA,+BAAyCH,EAAA,OAAYG,YAAA,iBAA2BH,EAAA,MAAA4N,EAAAE,GAAA,UAAAF,EAAAE,GAAA,KAAA9N,EAAA,YAAuDG,YAAA,aAAAD,OAAgCtJ,KAAA,SAAeuX,IAAKhP,MAAA,SAAAoP,GAAyBX,EAAA1E,gBAAA,OAA6B,GAAA0E,EAAAE,GAAA,KAAAF,EAAA,aAAA5N,EAAA,OAA+CG,YAAA,0BAAoCyN,EAAA,kBAAA5N,EAAA,OAAoCG,YAAA,sBAAgCH,EAAA,OAAYG,YAAA,oBAA8ByN,EAAAE,GAAA,KAAA9N,EAAA,KAAA4N,EAAAE,GAAAF,EAAAY,GAAAZ,EAAAnE,oBAAAmE,EAAAE,GAAA,KAAAF,EAAAlE,eAAA,EAAA1J,EAAA,OAA2GG,YAAA,iBAA2BH,EAAA,OAAYG,YAAA,gBAAA3C,OAAoCuR,MAAAnB,EAAAjE,gBAAAiE,EAAAlE,eAAA,aAAsEkE,EAAAoB,OAAApB,EAAA,aAAA5N,EAAA,OAA4CG,YAAA,kCAA4CH,EAAA,YAAiBE,OAAOtJ,KAAA,YAAAqY,KAAA,KAAAC,MAAA,wBAA6DtB,EAAAE,GAAA,KAAA9N,EAAA,KAAsBG,YAAA,kBAA4ByN,EAAAE,GAAAF,EAAAY,GAAAZ,EAAAhE,iBAAAgE,EAAAE,GAAA,KAAA9N,EAAA,cAAkEE,OAAOiH,KAAA,UAAA8H,KAAA,QAAAR,MAAA,IAA2CN,IAAKhP,MAAAyO,EAAA7C,uBAAiC6C,EAAAE,GAAA,8DAAAF,EAAAxE,YAAA,IAAAwE,EAAAxE,WAAAjN,OAA4M6D,EAAA,sBAAuE2O,OAAOvU,MAAAwT,EAAA,cAAAgB,SAAA,SAAAC,GAAmDjB,EAAAvE,cAAAwF,GAAsBC,WAAA,mBAA6B9O,EAAA,kBAAuBG,YAAA,kBAA6ByN,EAAAS,GAAAT,EAAA,oBAAA5D,EAAAmF,GAA0C,OAAAnP,EAAA,YAAsBtC,IAAAyR,EAAAhP,YAAA,WAAAD,OAAqCgO,UAAA,IAAeC,IAAKhP,MAAA,SAAAoP,GAAyB,OAAAX,EAAAvD,UAAAL,OAA4BhK,EAAA,YAAiBoO,KAAA,UAAapO,EAAA,OAAYG,YAAA,aAAuBH,EAAA,QAAaG,YAAA,cAAwByN,EAAAE,GAAAF,EAAAY,GAAAxE,EAAA3C,UAAAuG,EAAAE,GAAA,KAAA9N,EAAA,QAAqDG,YAAA,iBAA2ByN,EAAAE,GAAAF,EAAAY,GAAAxE,EAAAG,UAAA,kBAAAyD,EAAAE,GAAA,KAAA9N,EAAA,gBAAiFE,OAAOkO,KAAA,aAAAxX,KAAAoT,EAAAtG,UAAwC0K,KAAA,gBAAmB,KAAM,OAAj7BpO,EAAA,OAAkIG,YAAA,sBAAgCH,EAAA,OAAYG,YAAA,oBAA8ByN,EAAAE,GAAA,KAAA9N,EAAA,KAAA4N,EAAAE,GAAA,kBAAquB,GAAAF,EAAAoB,KAAApB,EAAAE,GAAA,KAAAF,EAAAzE,aAA2XyE,EAAAoB,KAA3XhP,EAAA,OAAgEG,YAAA,kBAA4BH,EAAA,kBAAuBG,YAAA,uBAAiCH,EAAA,aAAkBG,YAAA,eAAAD,OAAkCkP,MAAA,OAAAjI,KAAA,WAAAkI,YAAA,iBAAAC,KAAA,KAA2EX,OAAQvU,MAAAwT,EAAA,YAAAgB,SAAA,SAAAC,GAAiDjB,EAAAtE,YAAAuF,GAAoBC,WAAA,kBAA2B,OAAAlB,EAAAE,GAAA,KAAA9N,EAAA,OAAyCG,YAAA,kBAA4BH,EAAA,cAAmBG,YAAA,6BAAAD,OAAgDiH,KAAA,OAAA8H,KAAA,QAAAM,MAAA,GAAAd,MAAA,IAAmDN,IAAKhP,MAAAyO,EAAA/B,aAAuB7L,EAAA,YAAiBE,OAAOtJ,KAAA,UAAegX,EAAAE,GAAA,oDAAAF,EAAAE,GAAA,KAAA9N,EAAA,cAA0FG,YAAA,6BAAAD,OAAgDiH,KAAA,UAAA8H,KAAA,QAAAM,MAAA,GAAAd,MAAA,IAAsDN,IAAKhP,MAAAyO,EAAApD,mBAA6BxK,EAAA,YAAiBE,OAAOtJ,KAAA,aAAkBgX,EAAAE,GAAA,mEAEvsI1N,iBADb,WAAiB,IAAaN,EAAbzI,KAAa0I,eAA0BC,EAAvC3I,KAAuC4I,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,OAAiBG,YAAA,oBAA8BH,EAAA,OAAYG,YAAA,4BAAsCH,EAAA,OAAYG,YAAA,oBAA8BH,EAAA,MAAWG,YAAA,gCAArN9I,KAA+PyW,GAAA,cAA/PzW,KAA+PyW,GAAA,KAAA9N,EAAA,KAA/P3I,KAA+PyW,GAAA,4BCEnS,IAuBe0B,GAvBUlP,EAAQ,OAcjBmP,CACdxG,GACA0E,IAT6B,EAV/B,SAAoBnN,GAClBF,EAAQ,SAaS,kBAEU,MAUG,QCZhC6H,EAAA,EAAAC,IAAAI,EAAA,GAEA,ICbekH,IADE7P,OAFP,WAAgB,IAAA+N,EAAAvW,KAAayI,EAAA8N,EAAA7N,eAA0BC,EAAA4N,EAAA3N,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,OAAAA,EAAA,cAAkCE,OAAOiH,KAAA,aAAkByG,EAAAE,GAAA,UAAAF,EAAAE,GAAA,KAAA9N,EAAA,cAAgDE,OAAOiH,KAAA,aAAkByG,EAAAE,GAAA,UAAAF,EAAAE,GAAA,KAAA9N,EAAA,cAAgDE,OAAOiH,KAAA,UAAeyG,EAAAE,GAAA,UAAAF,EAAAE,GAAA,KAAA9N,EAAA,cAAgDE,OAAOiH,KAAA,aAAkByG,EAAAE,GAAA,UAAAF,EAAAE,GAAA,KAAA9N,EAAA,cAAgDE,OAAOiH,KAAA,YAAiByG,EAAAE,GAAA,eAEpZ1N,oBCFPE,EAAQ,OAcjBqP,EFGhB/Y,KAAA,aACAC,KAFA,WAGA,OACA+Y,IAAA,gCEJEF,IAT6B,EAEb,KAEC,KAEU,MAUG,QCAhCvH,EAAA,EAAAC,IAAAyH,EAAA,GAAAzH,IAAA0H,EAAA,GAAA1H,IAAA2H,EAAA,GAEA,IAAAC,IACApZ,KAAA,WACAC,KAFA,WAGA,OACAoZ,eAAA,EACAC,QACA7I,MAAA,KAAA+H,MAAA,OAAAe,IAAAX,GAAAzG,KAAA,aAOAc,UACAuG,WADA,WAEA,OAAA/Y,KAAA6Y,MAAA7Y,KAAA4Y,qBAEArL,QAJA,WAKA,OAAAE,MCxCeuL,IADExQ,OAFP,WAAgB,IAAA+N,EAAAvW,KAAayI,EAAA8N,EAAA7N,eAA0BC,EAAA4N,EAAA3N,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,OAAiBG,YAAA,cAAwBH,EAAA,eAAoBE,OAAOmH,MAAAuG,EAAAwC,WAAAhB,MAAAkB,MAAA,MAAyC1C,EAAAE,GAAA,KAAA9N,EAAA,OAAwBG,YAAA,+BAAyCH,EAAA,cAAmBE,OAAOtJ,KAAA,OAAAmX,KAAA,YAA+B/N,EAAA4N,EAAAwC,WAAAD,KAAyBzS,IAAAkQ,EAAAqC,eAAAnH,IAAA,eAAuC,GAAA8E,EAAAE,GAAA,KAAA9N,EAAA,KAA0BG,YAAA,+CAAyDyN,EAAAE,GAAAF,EAAAY,GAAAZ,EAAAhJ,aAAA,QAEnbxE,oBCChC,IAuBemQ,GAvBUjQ,EAAQ,OAcjBkQ,CACdR,GACAK,IAT6B,EAV/B,SAAoB7P,GAClBF,EAAQ,SAaS,kBAEU,MAUG,keCuKhC6H,EAAA,EAAAC,IAAAqI,GAAA,GAAArI,IAAAsI,GAAA,GAEAvI,EAAA,EAAAC,IAAAxJ,EAAA,GACAuJ,EAAA,EAAAC,IAAAQ,EAAA,GAAAR,IAAAS,EAAA,GACAV,EAAA,EAAAC,IAAAuI,GAAA,GACAxI,EAAA,EAAAC,IAAAwI,GAAA,GACAzI,EAAA,EAAAC,IAAAE,EAAA,GAAAF,IAAAG,EAAA,GACAJ,EAAA,EAAAC,IAAAW,EAAA,GAEA,IAAA8H,IACAC,UAAA,EACAC,MAAA,EACAC,YAAA,EACA7J,KAAA,SACAD,SAAA,sMACA+J,gBACAd,IAAA,IAAAjJ,SAAA,MAAAgK,SAAA,IACAf,IAAA,IAAAjJ,SAAA,QAIAiK,IACA9J,MAAA,OACAC,WAAAuJ,KAGA1I,EAAA,EAAAC,IAAAyH,EAAA,GAAAzH,IAAAgJ,GAAA,GAAAhJ,IAAAI,EAAA,GAEA,IAAA6I,IACAza,KAAA,aACAC,KAFA,WAEA,IAAA0K,EACA,OAAAA,GACA+P,WACAC,YAAA,EACAC,cAAA,EACAC,YAAA1X,IAAA,8BACA2X,YACAC,WAAA,EACAC,aAAA,EACAC,gBACAC,eAAA,EACAC,gBAAA,KACAC,eAAA,uBACAC,oBAAA,EACAC,kBAAA,KACAC,kBAAA,EACAC,gBAAA,GACAC,gBAAA,GAGAC,UAAA,EACAC,WAAA,EACAC,WAAA,EACAC,gBAAA,EACAC,YAAA,EACAC,WAAA,EACAC,WAAA,EACAC,YAAA,EACAC,WAAA,EACAC,kBAAA,EACAC,mBAAA,EACAC,eAAA,EACAC,gBAAA,EAGAC,iBAAA,EACAC,YAAA,EACAC,YAAA,EACAC,cAAA,EACAC,iBAAA,IAGAC,cAAA,GAzCAC,IAAAlS,EAAA,aA0CA,GA1CAkS,IAAAlS,EAAA,aA2CA,GA3CAkS,IAAAlS,EAAA,iBA4CA,KA5CAkS,IAAAlS,EAAA,oBA6CA,IA7CAkS,IAAAlS,EAAA,cA8CA,GA9CAA,GAiDAsI,UACA6J,SADA,WAEA,OAAArc,KAAAiQ,UAAAnL,QAEAmL,UAJA,WAIA,IAAAzP,EAAAR,KACA,OAAAA,KAAAqa,SAAApK,eAAA5F,OACA,SAAAoL,GACA,OAAAjV,EAAA8b,cAAA9b,EAAA+b,sBAAA1S,SAAA4L,EAAApJ,WAAA7L,EAAAgc,UAAAhc,EAAAic,cAAA5S,SAAA4L,EAAApJ,YAEApC,IAAA,SAAAwL,EAAA9N,GAAA,OAAA+U,MAAAjH,GAAAkH,OAAAhV,IAAAnH,EAAA0Z,iBAEA0C,cAXA,WAWA,IAAA1Y,EAAAlE,KACA,OAAAA,KAAAiQ,UAAAhG,IACA,SAAAwL,EAAA9N,GAIA,OAHAzD,EAAA+V,QAAAtS,KACAzD,EAAA+V,QAAAtS,IAAAiN,aAAAiI,UAAAC,OAAAC,WAEAL,MACAjH,GACAuH,OAAA9Y,EAAA+V,QAAAtS,OACAsV,SAAAtV,EAAA,EACAuV,QAAAzH,EAAAmE,cAAAvP,OAAA,SAAA8S,GAAA,OAAAA,EAAAtD,UAAA/U,OAAA,OAKAyX,sBA1BA,WA2BA,OAAAvc,KAAAwa,aAAAnQ,OAAA,SAAA+S,GAAA,OAAAA,EAAAhN,WAAA,IAAAnG,IAAA,SAAAmT,GAAA,OAAAA,EAAA/Q,YAEAoQ,cA7BA,WA8BA,OAAAzc,KAAAwa,aAAAnQ,OAAA,SAAA+S,GAAA,OAAAA,EAAAhN,WAAAgN,EAAAjN,WAAA,IAAAlG,IAAA,SAAAmT,GAAA,OAAAA,EAAA/Q,YAIAgR,WAlCA,WAmCA,IAAAC,EAAA,UAKA,OAJAtd,KAAAib,UAAA,IACAqC,EAAAtd,KAAAwb,YAAAxb,KAAA8b,gBAAA,oBAIAyB,UAAA,aAAA9T,OAAAzJ,KAAAkb,WAAA,QAAAzR,OAAAzJ,KAAAmb,WAAA,cAAA1R,OAAAzJ,KAAAib,UAAA,KACAuC,gBAAA,gBACAC,WAAAzd,KAAAwb,YAAAxb,KAAAyb,WAAAzb,KAAA8b,gBAAA,6BACAwB,SACAI,WAAA,OACAC,iBAAA,OACAC,cAAA,OACAC,aAAA,UAIAtd,SACAud,WADA,WAGArd,OAAAC,kBACAD,OAAAC,kBAAAO,SAGAjB,KAAA+d,sBAKAA,mBAZA,WAYA,IAAA5R,EAAAnM,KAEAA,KAAAge,oBACQzW,EAAA,EAAR0W,SACAjO,MAAA,OACAkO,QAAA,mBACAC,kBAAA,OACAC,iBAAA,OACAC,mBAAA,uBACAC,UAAA,wBACAC,qBAAA,IACAnK,KAAA,WACAjI,EAAApI,QAAAC,SACAqQ,MAAA,cAKArU,KAAA+D,QAAAC,QAKAga,kBAnCA,WAmCA,IAAAjI,EAAA/V,KAEA,OAAAA,KAAAsa,WAKAta,KAAA4c,cAAAvS,OAAA,SAAAoL,GAAA,OAAAM,EAAAyI,mBAAA/I,KAAA3Q,OACA,GAIA2Z,oBA/CA,SA+CA/Q,EAAAlM,GACA,IAAAkd,KAoBA,OAjBAA,EAAA,gBAAA1e,KAAAka,cAAA1Y,EAGAxB,KAAAma,cAAAzM,EAAAsP,OAAA2B,WAAA3e,KAAA4e,WACAlR,EAAAsP,OAAA6B,OACAH,EAAA,iBACAhR,EAAAsP,OAAA8B,YACAJ,EAAA,kBAIA1e,KAAAwe,mBAAA9Q,KACAgR,EAAA,qBAKAA,GAIAK,wBAxEA,WAwEA,IAAAC,EAAAhf,KACAS,OAAAC,oBAEAV,KAAA0a,gBAAA,WAEA,OAAAsE,EAAAlE,kBACAkE,EAAAC,qBACA,KAIAD,EAAAhB,sBAEYzW,EAAA,EAAZ0W,SACAjO,MAAA,OACAkO,QAAA,mBACAC,kBAAA,OACAC,iBAAA,OACAC,mBAAA,uBACAC,UAAA,wBACAC,qBAAA,IACAnK,KAAA,WAEA4K,EAAAE,4BACAF,EAAAjb,QAAAC,SACAqQ,MAAA,eAGA,IAMA5T,OAAAC,kBAAAE,eAAAZ,KAAA0a,iBACArZ,QAAAC,IAAA,kBAKA4d,0BAhHA,WAiHAze,OAAAC,mBAAAV,KAAA0a,kBACAja,OAAAC,kBAAAK,kBAAAf,KAAA0a,iBACA1a,KAAA0a,gBAAA,KACArZ,QAAAC,IAAA,kBAKAkd,mBAzHA,SAyHA9Q,GACA,SAAAA,MAAAsP,UAEAtP,EAAAwP,QAEAxP,EAAAsP,OAAAF,OAAApP,EAAAsP,OAAAF,MAAAC,MAAArP,EAAAsP,OAAAF,MAAAC,KAAAjY,OAAA,EAGA4I,EAAAsP,OAAAH,QAAAnP,EAAAsP,OAAAH,OAAA/D,MAGAqG,iBApIA,SAoIAzR,GACA,OAAAA,KAAAmC,UAGA,IAAApG,OAAAzJ,KAAAka,YAAA,OAAAzQ,OAAAzJ,KAAAqc,SAAA,KAAA3O,EAAAmC,UAAAlG,KAAA,KAAAyV,MAAA,OAFA,IAAA3V,OAAAzJ,KAAAka,YAAA,OAAAzQ,OAAAzJ,KAAAqc,SAAA,gBAIAgD,gBA1IA,SA0IA3R,GACA,IAAAA,EACA,eAEA,IAAArC,EAAA,GACAqC,EAAA+L,WACApO,GAAA,QAEA,WAAAqC,EAAAoC,OACApC,EAAAwP,QACA7R,GAAA,MAEAA,GAAA,OAGA,IAAAiU,EAAAtf,KAAAwa,aAAA3N,KAAA,SAAAuQ,GAAA,OAAAA,EAAA/Q,WAAAqB,EAAArB,WACA,GAAAiT,EAAA,CACAtf,KAAAsc,eACAgD,EAAAlP,aACA/E,GAAA,WAAA5B,OAAA6V,EAAAlP,WAAA,MAGA,IAAAmP,EAAAD,EAAAlP,WAAAkP,EAAAnP,WACAoP,EAAA,IACAlU,GAAA,UAAA5B,QAAA6V,EAAAnP,WAAAoP,EAAA,KAAAC,QAAA,UAGA,OAAAnU,GAMAoU,UA3KA,SA2KA9X,EAAAmR,GACA9Y,KAAAia,QAAAvX,IAAA1C,KAAAia,SAAAhQ,IAAA,SAAA+S,EAAA0C,GAMA,OALAA,IAAA/X,IACAqV,EAAApI,QAAAkE,EAAA7O,IAAA,SAAAnI,GAAA,OAAAgX,IAAAhX,KACAkb,EAAAH,OAAA/D,MAAA,GACAkE,EAAAF,MAAAC,KAAAjE,GAEAkE,KAGA2C,aArLA,SAqLAhY,EAAAmR,GACA,IAAAiE,EAAA/c,KAAAia,QAAAtS,GAAAmV,MAAAC,KACAA,EAAAlT,SAAAiP,GACAiE,IAAA1S,OAAA,SAAAvI,GAAA,OAAAA,IAAAgX,KAEAiE,EAAAxb,KAAAuX,GACAiE,EAAAra,IAAAqa,IAEA/c,KAAAyf,UAAA9X,EAAAoV,IAEA6C,YA/LA,SA+LAjY,GAAA,IAAAkY,EAAA7f,KACAA,KAAAia,QAAAvX,IAAA1C,KAAAia,SAAAhQ,IAAA,SAAA+S,EAAA0C,GACA,GAAA/X,IAAA+X,GAAA,MAAA/X,EACA,OAAAqV,EAEA3b,QAAAC,IAAAoB,IAAAmd,EAAA5P,WAAAyP,GACA,IAAAhS,EAAAmS,EAAA5P,UAAAyP,GACA,IAAAhS,EACA,OAAAsP,EAEA,IAAA8C,EAAApS,EAAAkM,cAAAvP,OAAA,SAAA0V,GAAA,OAAAA,EAAAlG,UAAA5P,IAAA,SAAA8V,GAAA,OAAAA,EAAAjH,MAUA,OATAkE,EAAApI,QAAA3J,QAAA,SAAAyH,GACAA,EAAAoM,WAAAgB,EAAAjW,SAAA6I,EAAAoG,OAEAkE,EAAAgD,WAAAhD,EAAApI,QAAAvK,OAAA,SAAAqI,GAAA,OAAAA,EAAAoG,MAAAhU,OAAA,GACAkY,EAAA2B,WAAA3B,EAAAgD,aACAhD,EAAA8B,UAAA9B,EAAApI,QAAA9P,SAAAgb,EAAAhb,UAAAkY,EAAApI,QAAA/H,KAAA,SAAA6F,GAAA,OAAAA,EAAAoM,YACA9B,EAAA6B,OAAA7B,EAAAgD,aAAAhD,EAAA8B,UACA9B,EAAA2B,WAAA,GAEA3B,KAGAiD,OAtNA,SAsNAtY,GACA,IAAAuY,EAAAlgB,KAAAmgB,MAAAD,KACAA,IACAA,EAAAE,UAAA,GAIAzY,EAAA3H,KAAAka,YACAla,KAAA2a,eAAA,sBAEA3a,KAAA2a,eAAA,uBAGA3a,KAAA4a,oBAAA5a,KAAAka,YACAla,KAAAka,YAAAvS,GAEA0Y,cAtOA,WAsOA,IAAAC,EAAAtgB,KAEAugB,EAAAvgB,KAAA4c,cAAAvS,OAAA,SAAAoL,GAAA,OAAA6K,EAAA9B,mBAAA/I,KAAA3Q,OACAuX,EAAArc,KAAAqc,SACAmE,EAAArT,KAAAiK,MAAAmJ,EAAAlE,EAAA,KAGAoE,EAAA,kLAAAhX,OAGA8W,EAHA,mGAAA9W,OAIA4S,EAAAkE,EAJA,iGAAA9W,OAKA+W,EALA,6KAAA/W,OAQA+W,EARA,gFAaMjZ,EAAA,EAAN0W,SACAjO,MAAA,UACAkO,QAAAuC,EACAtC,kBAAA,OACAC,iBAAA,OACAC,mBAAA,uBACAC,UAAA,uBACAC,qBAAA,IACAnK,KAAA,WACAkM,EAAAI,WACArM,MAAA,SAAAxI,GACAxK,QAAAC,IAAAuK,MAGA6U,OAxQA,WAwQA,IAAAC,EAAA3gB,KACAA,KAAA4f,cACA,IAAAW,EAAAvgB,KAAA4c,cAAAvS,OAAA,SAAAoL,GAAA,OAAAkL,EAAAnC,mBAAA/I,KAAA3Q,OACA,GAAAyb,EAAAvgB,KAAAqc,UAAArc,KAAA4gB,eAAA,CACA,IAAAC,EAAA,2KAAApX,OAGAzJ,KAAAqc,SAAAkE,EAHA,iGAOQhZ,EAAA,EAARL,OACA8I,MAAA,KACAkO,QAAA2C,EACA1C,kBAAA,OACAG,UAAA,wBACAC,qBAAA,QAbA,CAiBA,IAAAuC,EAAA9gB,KAAA4c,cAAAvS,OAAA,SAAAoL,GAAA,OAAAA,EAAAuH,OAAA6B,SAAA/Z,OAEAic,GADA/gB,KAAA4c,cAAAvS,OAAA,SAAAoL,GAAA,OAAAA,EAAAuH,OAAA8B,YAAAha,OACAqI,KAAAiK,MAAA0J,EAAA9gB,KAAAqc,SAAA,MAGArc,KAAA4c,cAAAvS,OAAA,SAAAoL,GAAA,OAAAA,EAAAuH,OAAA2B,YACA1T,QAAA,SAAAyC,GACAmD,GAAAmQ,gBAAAtT,EAAArB,UAAA+H,KACA,SAAA6M,GACAA,IACAA,GAAAC,gBAAAxT,EAAArB,SAAA+D,WAAA,IAEA1C,EAAAsP,OAAA6B,QACAsC,MAAAF,EAAA9Q,cACA8Q,EAAA9Q,WAAA,GAEA8Q,EAAA9Q,eAEAgR,MAAAF,EAAA7Q,cACA6Q,EAAA7Q,WAAA,GAEA6Q,EAAA7Q,cAEA/O,QAAAC,IAAA2f,GACApQ,GAAA6E,OAAAuL,GACA7M,KAAA,WACA/S,QAAAC,IAAA,iBAOAtB,KAAAma,cAAA,EAGA,IAEAiH,EAAA,GAEAL,GAAA,IACA,KACA,OACAK,EAAA,yBACAL,GAAA,IACA,KACA,MACAK,EAAA,yBACAL,GAAA,IACA,KACA,MACAK,EAAA,yBACAL,GAAA,IACA,KACA,QACAK,EAAA,0BAEA,KACA,QACAA,EAAA,uBAGA,IAAAC,EAAA,uGAAA5X,OAEAsX,GAAA,aAAAA,GAAA,qBAFA,MAAAtX,OAEAsX,EAFA,gEAAAtX,OAGAqX,EAHA,KAAArX,OAGAzJ,KAAAqc,SAHA,kDAOM9U,EAAA,EAANL,OACA8I,MAAA,UACAkO,QAAAmD,EACAlD,kBAAA,KACAG,UAAA8C,EACA7C,qBAAA,IAEAve,KAAAsa,WAAA,IAEAgH,gBA1WA,WA2WA,IAAAjH,EAAAqC,MAAA5C,MAAA9Z,KAAAuhB,YACAlH,EAAApK,UAAAoK,EAAApK,UAAAhG,IAAA,SAAAwL,GAAA,OAAAiH,MACAlD,MAAA/D,GAAApJ,SAAAoJ,EAAApJ,SACAuN,cAAAnE,EAAAmE,cAAAnE,EAAAmE,cAAA3P,IAAA,SAAAnI,GAAA,OAAA4a,MACA5a,GACAgX,IAAA1P,GAAAC,YAAAvH,GAAA,cAEAuI,OAAA,SAAAoL,GACA,IAAAA,EAAA5F,UAAA,IAAA4F,EAAAmE,cAAA9U,OAEA,OADAzD,QAAAC,IAAA,kBAAAmU,IACA,EAGA,IAAA+L,EAAApY,GAAA6C,WAAAwJ,EAAAmE,cAAA,WACA,OAAA4H,EAAA1c,SAAA0c,EAAA,MAAA3H,QAEA,OADAxY,QAAAC,IAAA,gBAAAmU,IACA,EAGA,IACAgM,EADArY,GAAA6C,WAAAwJ,EAAAmE,cAAA,YACA3P,IAAA,SAAAyX,GACA,GAAAA,EAAA5c,OAAA,GACA,IAAAuG,EAAAqR,MAAAgF,EAAA,IAIA,OAHAtY,GAAA6C,WAAAyV,EAAA,WAAA5c,SAAA4c,EAAA5c,SACAuG,EAAAsW,SAAA,GAEAtW,EAEA,OAAAqW,EAAA,KAGA,OAAAD,EAAA5U,KAAA,SAAAvC,GAAA,OAAAA,EAAAqX,WACAtgB,QAAAC,IAAA,wBAAAmU,IACA,IAEAA,EAAAmE,cAAAxQ,GAAA6D,WAAAwU,IACA,KAEApH,EAAApK,UAAA7G,GAAA6D,WAAAoN,EAAApK,WAEAjQ,KAAAqa,WACAra,KAAAua,aAAAva,KAAAuhB,WAAAlV,SACArM,KAAA4hB,uBAEAC,eAvZA,SAuZAnU,EAAAqS,GACA,OAAA/f,KAAAma,cAAAna,KAAA4e,YAAAlR,EAAAsP,OAAA2B,UACAjR,EAAAsP,OAAApI,QAAA3K,IAAA,SAAAyI,GAAA,OAAAA,EAAAoG,MAAAjP,SAAAkW,EAAAjH,MAAAiH,EAAAlG,QAAA,oBAEA,WAEA+H,oBA7ZA,WA6ZA,IAAAE,EAAA9hB,KACA6Q,GAAAkR,UAAA/hB,KAAAuhB,WAAAtR,UAAAhG,IAAA,SAAAwL,GAAA,OAAAA,EAAApJ,YACA+H,KAAA,SAAAvF,GAEAiT,EAAAtH,aAAA3L,EAAA5E,IAAA,SAAAK,GAAA,OAAAoS,MAAApS,GAAA+B,SAAA/B,EAAA4W,uBASAc,aAAA,SAAAC,GAEA,IAAA/B,EAAAlgB,KAAAmgB,MAAAD,KACAA,IACAlgB,KAAA6a,kBAAAqF,EAAAE,UACA/e,QAAAC,IAAA,qBAAAtB,KAAA6a,qBAGAqH,MAAA,SAAAD,GACA,OAAAA,EAAAxiB,WACA,WACAO,KAAAka,YAAAla,KAAAqc,SAAA,GACArc,KAAAigB,OAAAjgB,KAAAka,YAAA,GAEA,MACA,YACAla,KAAAka,YAAA,GACAla,KAAAigB,OAAAjgB,KAAAka,YAAA,GAEA,MACA,SACAla,KAAAya,eAAA,EACA,MACA,WAEA,IAAAyF,EAAAlgB,KAAAmgB,MAAAD,KACA,GAAAA,EAAA,CACA,IAAAiC,EAAAjC,EAAAE,UACA/e,QAAAC,IAAA,4BAAAtB,KAAA6a,kBAAA,eAAAsH,GAGA,OAAAniB,KAAA6a,mBACA7a,KAAA6a,mBAAA,GACAsH,GAAA,GACA9gB,QAAAC,IAAA,eACAtB,KAAAya,eAAA,GAEApZ,QAAAC,IAAA,oBASA8gB,iBAxdA,SAwdAC,GAAA,IAAAC,EAAAtiB,KAEA,QAAAqiB,EAAAE,OAAAC,QAAAC,gBAEAJ,EAAAK,kBAEA1iB,KAAA8a,kBAAA,EACA9a,KAAA+a,gBAAAsH,EAAAE,OAAAI,IACA3iB,KAAAgb,gBAAAqH,EAAAE,OAAAK,KAAA,KAGAhe,UAAAie,SACAje,UAAAie,QAAA,IAIAte,SAAAC,iBAAA,UAAAxE,KAAA8iB,eAGA9iB,KAAA+iB,UAAA,WACAT,EAAAU,qCAGA3hB,QAAAC,IAAA,iBACA,IAAA2hB,EAAAX,EAAAY,IAAArb,cAAA,0BACAsb,EAAAb,EAAAY,IAAArb,cAAA,0BACAub,EAAAd,EAAAY,IAAArb,cAAA,kBAEAxG,QAAAC,IAAA,aAAA2hB,GACA5hB,QAAAC,IAAA,eAAA6hB,GACA9hB,QAAAC,IAAA,SAAA8hB,GAEAD,IACA9hB,QAAAC,IAAA,iBAAAb,OAAA+G,iBAAA2b,IACA9hB,QAAAC,IAAA,iBAAA6hB,EAAAE,0BAGAD,IACA/hB,QAAAC,IAAA,WAAAb,OAAA+G,iBAAA4b,IACA/hB,QAAAC,IAAA,WAAA8hB,EAAAC,8BAQAL,mCAvgBA,WAwgBA,IAAAM,EAAAtjB,KAAAkjB,IAAArb,cAAA,+BACA,GAAAyb,EAAA,CACA,IAAAC,EAAA,GAGAC,EAAA,EAGA,GAAA/iB,OAAAuE,KAAAvE,OAAAuE,IAAApF,SACA4jB,EAAA/iB,OAAAuE,IAAApF,aACA,CAEA,IAAA6jB,EAAAjc,iBAAAjD,SAAA2B,iBACAwd,iBAAA,qBAAAC,OACAF,IACAD,EAAAze,IAAA0e,EAAAG,QAAA,cAKAnjB,OAAAojB,YAAA,MACAN,EAAA,IAIA,IAAAO,EAAAP,EAAAC,EACAF,EAAAnd,MAAA4d,IAAA,GAAAta,OAAAqa,EAAA,QAMAhB,cAxiBA,SAwiBAT,GACA,WAAAA,EAAAhc,KAAArG,KAAA8a,kBACA9a,KAAAif,qBAKAA,kBA/iBA,WAgjBAjf,KAAA8a,kBAAA,EACA9a,KAAA+a,gBAAA,GACA/a,KAAAgb,gBAAA,GAGAhb,KAAAgkB,sBAGAzf,SAAAgC,oBAAA,UAAAvG,KAAA8iB,gBAIAkB,oBA5jBA,WA6jBAhkB,KAAAib,UAAA,EACAjb,KAAAkb,WAAA,EACAlb,KAAAmb,WAAA,EACAnb,KAAAwb,YAAA,EACAxb,KAAAyb,WAAA,EACAzb,KAAA8b,iBAAA,EACA9b,KAAA+b,YAAA,EACA/b,KAAAgc,YAAA,EACAhc,KAAAic,cAAA,EACAjc,KAAAmc,cAAA,EACAnc,KAAAsb,WAAA,EACAtb,KAAAub,WAAA,EACAvb,KAAAikB,YAAA,GAIAC,YA7kBA,WA8kBAlkB,KAAAmgB,MAAAgE,eACAnkB,KAAA0b,kBAAA1b,KAAAmgB,MAAAgE,aAAAC,aACApkB,KAAA2b,mBAAA3b,KAAAmgB,MAAAgE,aAAAE,cAEArkB,KAAAmgB,MAAAmE,iBACAtkB,KAAA4b,eAAA5b,KAAAmgB,MAAAmE,eAAAC,YACAvkB,KAAA6b,gBAAA7b,KAAAmgB,MAAAmE,eAAAE,gBAMAC,OA1lBA,WA2lBAzkB,KAAAib,UAAA9N,KAAAuX,IAAA,IAAA1kB,KAAAib,UAAA,GACAjb,KAAA2kB,0BAIAC,QAhmBA,WAimBA5kB,KAAAib,UAAA9N,KAAA0X,IAAA7kB,KAAAib,UAAA,QACAjb,KAAA2kB,0BAIAG,UAtmBA,WAumBA9kB,KAAAib,UAAA,EACAjb,KAAAkb,WAAA,EACAlb,KAAAmb,WAAA,GAIA4J,YA7mBA,SA6mBA1C,GACAA,EAAA2C,iBAEA,IACAC,EADA5C,EAAA6C,OACA,SACAC,EAAAhY,KAAAuX,IAAAvX,KAAA0X,IAAA7kB,KAAAib,UAAAgK,EAAA,OAGAG,EAAAplB,KAAAmgB,MAAAmE,eAAAjB,wBACAgC,EAAAhD,EAAAiD,QAAAF,EAAAG,KAAAH,EAAA1N,MAAA,EACA8N,EAAAnD,EAAAoD,QAAAL,EAAArB,IAAAqB,EAAAM,OAAA,EAGAC,EAAAR,EAAAnlB,KAAAib,UACAjb,KAAAkb,WAAAlb,KAAAkb,WAAAmK,GAAA,EAAAM,GACA3lB,KAAAmb,WAAAnb,KAAAmb,WAAAqK,GAAA,EAAAG,GAEA3lB,KAAAib,UAAAkK,EACAnlB,KAAA2kB,0BAIAiB,iBAnoBA,SAmoBA3D,GAMA,GAJAA,EAAA+C,gBAAA/C,EAAA+C,iBACA/C,EAAAS,iBAAAT,EAAAS,kBAGA1iB,KAAAib,UAAA,GAEA,OAAAgH,EAAAxiB,WACA,WACAO,KAAAkb,YAAA,GACA,MACA,YACAlb,KAAAkb,YAAA,GACA,MACA,SACAlb,KAAAmb,YAAA,GACA,MACA,WACAnb,KAAAmb,YAAA,GAGAnb,KAAA2kB,2BAMAkB,sBA/pBA,SA+pBAxD,GAKA,GAHAA,EAAA2C,iBACA3C,EAAAK,kBAEA,IAAAL,EAAAyD,QAAAhhB,OAAA,CACA,IAAA0B,EAAAgI,OACAuX,EAAA1D,EAAAyD,QAAA,GAGAE,EAAAxf,EAAAxG,KAAAmc,cACA8J,EAAA9Y,KAAA+Y,IAAAH,EAAAT,QAAAtlB,KAAAsb,YACA6K,EAAAhZ,KAAA+Y,IAAAH,EAAAN,QAAAzlB,KAAAub,YACA6K,EAAAjZ,KAAAkZ,KAAAJ,IAAAE,KAGA,GAAAH,EAAAhmB,KAAAsmB,gBAAAF,EAAApmB,KAAAumB,kBAGA,YADAvmB,KAAAwmB,qBAAAnE,GAKAriB,KAAAmc,cAAA3V,EACAxG,KAAAsb,WAAAyK,EAAAT,QACAtlB,KAAAub,WAAAwK,EAAAN,QACAzlB,KAAAikB,YAAA,EAGAjkB,KAAAwb,YAAA,EACAxb,KAAAsb,WAAAyK,EAAAT,QACAtlB,KAAAub,WAAAwK,EAAAN,QAIAzlB,KAAAmgB,MAAAmE,gBACAtkB,KAAAmgB,MAAAmE,eAAAte,UAAAC,IAAA,iBAGA,OAAAoc,EAAAyD,QAAAhhB,OAAA,CAEA9E,KAAAyb,WAAA,EACAzb,KAAAwb,YAAA,EAEA,IAAAiL,EAAApE,EAAAyD,QAAA,GACAY,EAAArE,EAAAyD,QAAA,GAEA9lB,KAAAob,gBAAApb,KAAA2mB,YAAAF,EAAAC,GACA1mB,KAAAqb,YAAArb,KAAAib,UAIAjb,KAAAmgB,MAAAmE,gBACAtkB,KAAAmgB,MAAAmE,eAAAte,UAAAR,OAAA,cAOAghB,qBA3tBA,SA2tBAnE,GAEA,IAAAriB,KAAAib,UAEAjb,KAAA4mB,YAAA,EAAAvE,EAAAyD,QAAA,IAGA9lB,KAAA8kB,aAKA+B,qBAvuBA,SAuuBAxE,GAIA,GAHAA,EAAA2C,iBACA3C,EAAAK,kBAEA,IAAAL,EAAAyD,QAAAhhB,QAAA9E,KAAAwb,WAAA,CAEA,IAAAsL,EAAAzE,EAAAyD,QAAA,GAAAR,QAAAtlB,KAAAsb,WACA4J,EAAA7C,EAAAyD,QAAA,GAAAL,QAAAzlB,KAAAub,WAGApO,KAAAkZ,KAAAS,IAAA5B,KACA,IACAllB,KAAAikB,YAAA,GAIAjkB,KAAAkb,YAAA4L,EACA9mB,KAAAmb,YAAA+J,EAEAllB,KAAAsb,WAAA+G,EAAAyD,QAAA,GAAAR,QACAtlB,KAAAub,WAAA8G,EAAAyD,QAAA,GAAAL,QAEAzlB,KAAA2kB,8BACA,OAAAtC,EAAAyD,QAAAhhB,QAAA9E,KAAAyb,UAAA,CAEAzb,KAAAikB,YAAA,EAEA,IAAAwC,EAAApE,EAAAyD,QAAA,GACAY,EAAArE,EAAAyD,QAAA,GAGAiB,EADA/mB,KAAA2mB,YAAAF,EAAAC,GACA1mB,KAAAob,gBAGApb,KAAAib,UAAA9N,KAAAuX,IAAAvX,KAAA0X,IAAA7kB,KAAAqb,YAAA0L,EAAA,OACA/mB,KAAA2kB,2BAKAqC,oBA/wBA,SA+wBA3E,GASA,GAPAA,EAAA2C,iBACA3C,EAAAK,kBAEAL,EAAAyD,QAAAhhB,OAAA,IACA9E,KAAAyb,WAAA,GAGA,IAAA4G,EAAAyD,QAAAhhB,OAAA,CAIA,GAFA9E,KAAAinB,qBAAA5E,GAIA,YADAriB,KAAAif,oBAIAjf,KAAAwb,YAAA,EAGAxb,KAAAmgB,MAAAmE,gBACAtkB,KAAAmgB,MAAAmE,eAAAte,UAAAR,OAAA,cAMAyhB,qBA3yBA,SA2yBA5E,GAGA,OAAAriB,KAAAikB,aAKA,QAAA5B,EAAAE,OAAAC,YAKAH,EAAAE,OAAAvc,UAAA+B,SAAA,2BACAsa,EAAAE,OAAAvc,UAAA+B,SAAA,4BAQA4e,YAj0BA,SAi0BAF,EAAAC,GACA,IAAAQ,EAAAT,EAAAnB,QAAAoB,EAAApB,QACA6B,EAAAV,EAAAhB,QAAAiB,EAAAjB,QACA,OAAAtY,KAAAkZ,KAAAa,IAAAC,MAIAxC,uBAx0BA,WAy0BA,GAAA3kB,KAAAmgB,MAAAgE,cAAAnkB,KAAAmgB,MAAAmE,eAAA,CAEA,IAcA8C,EAAAC,EAdAjE,EAAApjB,KAAAmgB,MAAAgE,aACAhB,EAAAnjB,KAAAmgB,MAAAmE,eAIAgD,GADAlE,EAAAC,wBACAF,EAAAE,yBAGAkE,EAAAnE,EAAAoE,YAAAxnB,KAAAib,UACAwM,EAAArE,EAAAsE,aAAA1nB,KAAAib,UASAmM,EAFAG,GAAAD,EAAA5P,OAEA4P,EAAA5P,MAAA6P,GAAA,GAGAA,EAAAD,EAAA5P,OAAA,EAKA2P,EAFAI,GAAAH,EAAA5B,QAEA4B,EAAA5B,OAAA+B,GAAA,GAGAA,EAAAH,EAAA5B,QAAA,EAIA1lB,KAAAkb,WACAlb,KAAAmb,WAEAnb,KAAAkb,WAAA/N,KAAA0X,KAAAuC,EAAAja,KAAAuX,IAAA0C,EAAApnB,KAAAkb,aACAlb,KAAAmb,WAAAhO,KAAA0X,KAAAwC,EAAAla,KAAAuX,IAAA2C,EAAArnB,KAAAmb,eAKAwM,sBAr3BA,SAq3BAtF,IAGAA,EAAAE,OAAAvc,UAAA+B,SAAA,0BACAsa,EAAAE,OAAAvc,UAAA+B,SAAA,2BACA/H,KAAAif,qBAKA2I,qBA/3BA,SA+3BAvF,KAKAwF,wBAp4BA,SAo4BAxF,GACAA,EAAAK,mBAKAoF,8BA14BA,SA04BAzF,GAEAA,EAAAK,kBACAL,EAAA2C,iBAEA,IAAAhlB,KAAAib,UAEAjb,KAAA4mB,YAAA,EAAAvE,GAGAriB,KAAA8kB,aAKAiD,kBAz5BA,SAy5BA1F,GAEAA,EAAAK,kBACAL,EAAA2C,iBAGA3C,EAAAE,SAAAviB,KAAAmgB,MAAAgE,cACAnkB,KAAA8nB,8BAAAzF,IAKAuE,YAr6BA,SAq6BAzB,EAAA6C,GACA,GAAAhoB,KAAAmgB,MAAAmE,eAAA,CAEA,IACAc,EADAplB,KAAAmgB,MAAAmE,eACAjB,wBAGAiC,EAAA0C,EAAA1C,QACAG,EAAAuC,EAAAvC,QAIAJ,EAAAC,EAAAF,EAAAG,KAAAH,EAAA1N,MAAA,EACA8N,EAAAC,EAAAL,EAAArB,IAAAqB,EAAAM,OAAA,EAGAC,EAAAR,EAAAnlB,KAAAib,UAGAjb,KAAAkb,WAAAlb,KAAAkb,WAAAmK,GAAAM,EAAA,GACA3lB,KAAAmb,WAAAnb,KAAAmb,WAAAqK,GAAAG,EAAA,GAEA3lB,KAAAib,UAAAkK,EACAnlB,KAAA2kB,2BAIAsD,gBAh8BA,SAg8BA5F,GACAhhB,QAAAC,IAAA,oBACA4mB,OAAA7F,EAAA6F,OACA5C,QAAAjD,EAAAiD,QACAG,QAAApD,EAAAoD,QACAlD,OAAAF,EAAAE,OAAAC,UAGA,IAAAH,EAAA6F,SAEA7F,EAAA2C,iBACA3C,EAAAK,kBAEA1iB,KAAA8b,iBAAA,EACA9b,KAAA+b,YAAAsG,EAAAiD,QACAtlB,KAAAgc,YAAAqG,EAAAoD,QAEApkB,QAAAC,IAAA,WACAwa,gBAAA9b,KAAA8b,gBACAqM,OAAAnoB,KAAA+b,YACAqM,OAAApoB,KAAAgc,cAIAhc,KAAAmgB,MAAAmE,gBACAtkB,KAAAmgB,MAAAmE,eAAAte,UAAAC,IAAA,cAKAoiB,gBA99BA,SA89BAhG,GACA,GAAAriB,KAAA8b,gBAAA,CAIAuG,EAAA2C,iBACA3C,EAAAK,kBAEA,IAAAoE,EAAAzE,EAAAiD,QAAAtlB,KAAA+b,YACAmJ,EAAA7C,EAAAoD,QAAAzlB,KAAAgc,YAEA3a,QAAAC,IAAA,oBACAwa,gBAAA9b,KAAA8b,gBACAgL,SACA5B,SACAoD,kBAAAtoB,KAAAkb,WACAqN,kBAAAvoB,KAAAmb,WACAF,UAAAjb,KAAAib,YAIAjb,KAAAkb,YAAA4L,EACA9mB,KAAAmb,YAAA+J,EAEA7jB,QAAAC,IAAA,UACAknB,cAAAxoB,KAAAkb,WACAuN,cAAAzoB,KAAAmb,aAGAnb,KAAA2kB,yBAEA3kB,KAAA+b,YAAAsG,EAAAiD,QACAtlB,KAAAgc,YAAAqG,EAAAoD,UAIAiD,cAlgCA,SAkgCArG,GACAriB,KAAA8b,kBAEAuG,EAAA2C,iBACA3C,EAAAK,kBAEA1iB,KAAA8b,iBAAA,EAGA9b,KAAAmgB,MAAAmE,gBACAtkB,KAAAmgB,MAAAmE,eAAAte,UAAAR,OAAA,cAKAmjB,iBAjhCA,SAihCAtG,GACAriB,KAAA8b,iBACA9b,KAAA0oB,cAAArG,KAIAuG,OACArH,YACAzR,KAAAtD,OACAqc,QAFA,WAGA,OAAA/O,KAGAwC,eACAxM,KAAAgZ,QACAD,SAAA,GAEArM,SACA1M,KAAAgZ,QACAD,SAAA,GAEAE,OACAjZ,KAAAgZ,QACAD,SAAA,GAEAjI,gBACA9Q,KAAAgZ,QACAD,SAAA,GAEAjK,YACA9O,KAAAgZ,QACAD,SAAA,IAGA7gB,OACAuZ,WADA,WAEAvhB,KAAAshB,oBAGAvhB,QAhqCA,WAiqCAC,KAAAshB,kBACAjgB,QAAAC,IAAA,QACA,IACAgD,KAAA0kB,OAAAC,aAAA,GACA5nB,QAAAC,IAAA,UACA,MAAAuK,IAIA7L,KAAA+e,2BAGAmK,UA7qCA,WA8qCA7nB,QAAAC,IAAA,QACA,IACAgD,KAAA0kB,OAAAC,aAAA,GACA5nB,QAAAC,IAAA,UACA,MAAAuK,IAIA7L,KAAAkf,4BAGA3a,SAAAgC,oBAAA,UAAAvG,KAAA8iB,iBCn5CeqG,IADE3gB,OAFP,WAAgB,IAAA+N,EAAAvW,KAAayI,EAAA8N,EAAA7N,eAA0BC,EAAA4N,EAAA3N,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,OAAiBygB,aAAa7pB,KAAA,SAAA8pB,QAAA,iBAAAtmB,MAAAwT,EAAA,MAAAkB,WAAA,QAAA6R,IAAA,UAAwFC,IAAA,OAAAzgB,YAAA,YAAAgO,IAAyC0S,WAAAjT,EAAAyL,gBAA+BrZ,EAAA,eAAoBG,YAAA,eAAAD,OAAkCmH,MAAAuG,EAAA8D,SAAArK,MAAAiJ,MAAA,GAAAwQ,aAAA,GAAAC,aAAA,MAAwE5S,IAAK6S,aAAApT,EAAAuH,WAAA8L,cAAA,SAAA1S,GAA2DX,EAAAkE,eAAAlE,EAAAkE,kBAAyClE,EAAAE,GAAA,KAAA9N,EAAA,cAA+BE,OAAOtJ,KAAA,UAAeoJ,EAAA,OAAYygB,aAAa7pB,KAAA,OAAA8pB,QAAA,SAAAtmB,MAAAwT,EAAA,cAAAkB,WAAA,kBAAkF3O,YAAA,iBAAAgO,IAAmChP,MAAA,SAAAoP,GAAyBA,EAAAwL,kBAAyBnM,EAAAkE,eAAA,MAA4B9R,EAAA,OAAYG,YAAA,uCAAAgO,IAAuDhP,MAAA,SAAAoP,GAAyBA,EAAAwL,sBAA4B/Z,EAAA,OAAYG,YAAA,cAAwBH,EAAA,MAAA4N,EAAAE,GAAA,UAAAF,EAAAE,GAAA,KAAA9N,EAAA,QAAmDG,YAAA,gBAA0ByN,EAAAE,GAAAF,EAAAY,GAAAZ,EAAA2D,YAAA,SAAA3D,EAAAY,GAAAZ,EAAA8F,eAAA9F,EAAAE,GAAA,KAAA9N,EAAA,WAA+FG,YAAA,qBAAgCyN,EAAAS,GAAAT,EAAA,uBAAA7I,EAAA/F,GAAiD,OAAAgB,EAAA,WAAqBtC,IAAAsB,EAAAkB,OAAaghB,KAAA,OAAYlhB,EAAA,OAAYG,YAAA,qCAAAghB,MAAAvT,EAAAkI,oBAAA/Q,EAAA/F,GAAAmP,IAAgGhP,MAAA,SAAAoP,GAAyB,OAAAX,EAAA0J,OAAAtY,OAAuB4O,EAAAE,GAAA,iCAAAF,EAAAY,GAAAxP,EAAA,uCAA0F,WAAA4O,EAAAE,GAAA,KAAA9N,EAAA,OAAmCG,YAAA,uBAAiCH,EAAA,cAAmBE,OAAOtJ,KAAAgX,EAAAoE,eAAAjE,KAAA,YAA2CH,EAAAqG,cAAArG,EAAA2D,aAA0RvR,EAAA,OAAuCtC,IAAAkQ,EAAA2D,YAAApR,YAAA,kBAAgDH,EAAA,OAAYG,YAAA,6BAAuCH,EAAA,OAAYG,YAAA,kBAAAgO,IAAkChP,MAAAyO,EAAA6L,oBAA8B7L,EAAAS,GAAAT,EAAA4I,iBAAA5I,EAAAqG,cAAArG,EAAA2D,cAAA,SAAA6P,GAAgF,OAAAphB,EAAA,OAAiBG,YAAA,iBAAAkhB,UAAuCpkB,UAAA2Q,EAAAY,GAAA4S,QAAyBxT,EAAAE,GAAA,KAAA9N,EAAA,OAAwBG,YAAA,kBAA4ByN,EAAAE,GAAAF,EAAAY,GAAAZ,EAAA8I,gBAAA9I,EAAAqG,cAAArG,EAAA2D,mBAAA,GAAA3D,EAAAE,GAAA,KAAAF,EAAAqG,cAAArG,EAAA2D,aAAA,QAAAvR,EAAA,OAAmJG,YAAA,sBAAgCH,EAAA,sBAA2BmO,IAAIhP,MAAA,SAAAoP,GAAyBA,EAAAwL,oBAA2BpL,OAAQvU,MAAAwT,EAAAqG,cAAArG,EAAA2D,aAAA8C,OAAAF,MAAA,KAAAvF,SAAA,SAAAC,GAAsFjB,EAAA0T,KAAA1T,EAAAqG,cAAArG,EAAA2D,aAAA8C,OAAAF,MAAA,OAAAtF,IAAuEC,WAAA,kDAA4D9O,EAAA,OAAYG,YAAA,eAA0ByN,EAAAS,GAAAT,EAAAqG,cAAArG,EAAA2D,aAAA,uBAAA6F,EAAAjI,GAA+E,OAAAnP,EAAA,OAAiBtC,IAAAyR,EAAAhP,YAAA,yBAAAghB,OAAmDI,kBAAA3T,EAAAqG,cAAArG,EAAA2D,aAAA8C,OAAAF,MAAAC,KAAAlT,SAAAkW,EAAAjH,KAAAqR,iBAAApK,EAAAlG,UAAAtD,EAAA4D,cAAA5D,EAAAqG,cAAArG,EAAA2D,aAAA8C,OAAA2B,WAAApI,EAAAqI,YAAAwL,oBAAArK,EAAAlG,UAAAtD,EAAA4D,eAAA4F,EAAAlG,SAAAtD,EAAAqG,cAAArG,EAAA2D,aAAA8C,OAAAgD,YAAAzJ,EAAAqI,aAAArI,EAAAqG,cAAArG,EAAA2D,aAAA8C,OAAAF,MAAAC,KAAAlT,SAAAkW,EAAAjH,MAAybhC,IAAKhP,MAAA,SAAAoP,GAAyB,OAAAX,EAAAoJ,aAAApJ,EAAA2D,YAAA6F,EAAAjH,SAAuDnQ,EAAA,OAAYG,YAAA,mBAA6BH,EAAA,OAAYG,YAAA,iBAA2ByN,EAAAE,GAAAF,EAAAY,GAAAZ,EAAA6D,YAAAtC,OAAAvB,EAAAE,GAAA,KAAA9N,EAAA,OAA8DG,YAAA,cAAAkhB,UAAoCpkB,UAAA2Q,EAAAY,GAAA4I,EAAAlQ,WAAoCiH,IAAKhP,MAAAyO,EAAA6L,oBAA8B7L,EAAAE,GAAA,KAAA9N,EAAA,gBAAiCG,YAAA,kBAAAD,OAAqCtJ,KAAAwgB,EAAAjH,IAAAuR,gBAAA9T,EAAAsL,eAAAtL,EAAAqG,cAAArG,EAAA2D,aAAA6F,OAAiG,OAAQ,SAAAxJ,EAAAoB,KAAApB,EAAAE,GAAA,KAAAF,EAAAqG,cAAArG,EAAA2D,aAAAgD,QAA48C3G,EAAAoB,KAA58ChP,EAAA,OAAwFG,YAAA,sBAAgCH,EAAA,mBAAwB2O,OAAOvU,MAAAwT,EAAAqG,cAAArG,EAAA2D,aAAA8C,OAAAH,OAAA,IAAAtF,SAAA,SAAAC,GAAsFjB,EAAA0T,KAAA1T,EAAAqG,cAAArG,EAAA2D,aAAA8C,OAAAH,OAAA,MAAArF,IAAuEC,WAAA,kDAA4D9O,EAAA,OAAYG,YAAA,eAA0ByN,EAAAS,GAAAT,EAAAqG,cAAArG,EAAA2D,aAAA,uBAAA6F,EAAAjI,GAA+E,OAAAnP,EAAA,OAAiBtC,IAAAyR,EAAAhP,YAAA,yBAAAghB,OAAmDI,kBAAA3T,EAAAqG,cAAArG,EAAA2D,aAAA8C,OAAAH,OAAA/D,MAAAiH,EAAAjH,IAAAqR,iBAAApK,EAAAlG,UAAAtD,EAAA4D,cAAA5D,EAAAqG,cAAArG,EAAA2D,aAAA8C,OAAA2B,WAAApI,EAAAqI,YAAAwL,oBAAArK,EAAAlG,UAAAtD,EAAA4D,eAAA4F,EAAAlG,SAAAtD,EAAAqG,cAAArG,EAAA2D,aAAA8C,OAAAgD,YAAAzJ,EAAAqI,aAAArI,EAAAqG,cAAArG,EAAA2D,aAAA8C,OAAAH,OAAA/D,MAAAiH,EAAAjH,KAA6ahC,IAAKhP,MAAA,SAAAoP,GAAyB,OAAAX,EAAAkJ,UAAAlJ,EAAA2D,aAAA6F,EAAAjH,UAAsDnQ,EAAA,OAAYG,YAAA,mBAA6BH,EAAA,OAAYG,YAAA,iBAA2ByN,EAAAE,GAAAF,EAAAY,GAAAZ,EAAA6D,YAAAtC,OAAAvB,EAAAE,GAAA,KAAA9N,EAAA,OAA8DG,YAAA,cAAAkhB,UAAoCpkB,UAAA2Q,EAAAY,GAAA4I,EAAAlQ,WAAoCiH,IAAKhP,MAAAyO,EAAA6L,oBAA8B7L,EAAAE,GAAA,KAAA9N,EAAA,aAA8BG,YAAA,eAAAD,OAAkCtJ,KAAAwgB,EAAAjH,IAAAuR,gBAAA9T,EAAAsL,eAAAtL,EAAAqG,cAAArG,EAAA2D,aAAA6F,OAAiG,OAAQ,SAAAxJ,EAAAE,GAAA,KAAAF,EAAA4D,eAAA5D,EAAAqI,YAAArI,EAAAqG,cAAArG,EAAA2D,aAAA8C,OAAA2B,UAAAhW,EAAA,OAAwIG,YAAA,sBAAgCH,EAAA,OAAYG,YAAA,oBAA8BH,EAAA,YAAiBE,OAAOtJ,KAAA,YAAiBgX,EAAAE,GAAA,KAAA9N,EAAA,QAAA4N,EAAAE,GAAA,cAAAF,EAAAE,GAAA,KAAA9N,EAAA,OAAoEG,YAAA,mBAAAkhB,UAAyCpkB,UAAA2Q,EAAAY,GAAAZ,EAAAqG,cAAArG,EAAA2D,aAAAoQ,UAAA,SAA0ExT,IAAKhP,MAAAyO,EAAA6L,sBAA8B7L,EAAAoB,SAA5rIhP,EAAA,OAAkDG,YAAA,iBAA2BH,EAAA,OAAYG,YAAA,6BAAuCH,EAAA,OAAYG,YAAA,oBAA8BH,EAAA,OAAYG,YAAA,mBAA6ByN,EAAAE,GAAA,YAAAF,EAAAE,GAAA,KAAA9N,EAAA,OAA2CG,YAAA,kBAA4ByN,EAAAE,GAAA,uBAAk6H,GAAAF,EAAAE,GAAA,KAAAF,EAAAqG,cAAArG,EAAA2D,aAAAvR,EAAA,OAAkFG,YAAA,0BAAoCH,EAAA,OAAYG,YAAA,eAAyByN,EAAA2D,YAAA,EAAAvR,EAAA,cAAuCG,YAAA,0BAAAD,OAA6CuO,MAAA,IAAWN,IAAKhP,MAAA,SAAAoP,GAAyB,OAAAX,EAAA0J,OAAA1J,EAAA2D,YAAA,OAAuCvR,EAAA,YAAiBE,OAAOtJ,KAAA,gBAAqBgX,EAAAE,GAAA,2CAAAF,EAAAoB,KAAApB,EAAAE,GAAA,KAAAF,EAAA2D,YAAA3D,EAAA8F,SAAA,EAAA1T,EAAA,cAA2HG,YAAA,0BAAAD,OAA6CiH,KAAA,OAAAsH,MAAA,IAAyBN,IAAKhP,MAAA,SAAAoP,GAAyB,OAAAX,EAAA0J,OAAA1J,EAAA2D,YAAA,OAAuC3D,EAAAE,GAAA,2CAAA9N,EAAA,YAAmEE,OAAOtJ,KAAA,YAAgB,GAAAgX,EAAAoB,MAAA,GAAApB,EAAAE,GAAA,KAAA9N,EAAA,OAAyCG,YAAA,eAAyByN,EAAAqI,aAAArI,EAAAqG,cAAArG,EAAA2D,aAAA8C,OAAA2B,UAAAhW,EAAA,cAA0FG,YAAA,6BAAAD,OAAgDiH,KAAA,UAAAsH,MAAA,GAAAc,MAAA,IAAuCpB,IAAKhP,MAAA,SAAAoP,GAAyB,OAAAX,EAAAqJ,YAAArJ,EAAA2D,iBAA0CvR,EAAA,YAAiBE,OAAOtJ,KAAA,WAAgBgX,EAAAE,GAAA,4CAAAF,EAAAoB,KAAApB,EAAAE,GAAA,KAAAF,EAAA+D,UAAmR/D,EAAAoB,KAAnRhP,EAAA,cAA4GG,YAAA,mCAAAD,OAAsDiH,KAAA,UAAAsH,MAAA,GAAAc,MAAA,IAAuCpB,IAAKhP,MAAAyO,EAAA8J,iBAA2B1X,EAAA,YAAiBE,OAAOtJ,KAAA,aAAkBgX,EAAAE,GAAA,kDAAAF,EAAAoB,KAAApB,EAAAE,GAAA,KAAAF,EAAA,iBAAA5N,EAAA,OAA0HG,YAAA,wBAAAgO,IAAwChP,MAAAyO,EAAAoR,yBAAmChf,EAAA,OAAYG,YAAA,6BAAAgO,IAA6ChP,MAAA,SAAAoP,GAAyBA,EAAAwL,sBAA4B/Z,EAAA,YAAiBG,YAAA,eAAAD,OAAkCtJ,KAAA,SAAeuX,IAAKhP,MAAAyO,EAAAqO,WAAqBrO,EAAAE,GAAA,KAAA9N,EAAA,QAAyBG,YAAA,cAAwByN,EAAAE,GAAAF,EAAAY,GAAAhK,KAAAiK,MAAA,IAAAb,EAAA0E,YAAA,OAAA1E,EAAAE,GAAA,KAAA9N,EAAA,YAAmFG,YAAA,eAAAD,OAAkCtJ,KAAA,QAAcuX,IAAKhP,MAAAyO,EAAAkO,UAAoBlO,EAAAE,GAAA,KAAA9N,EAAA,YAA6BG,YAAA,eAAAD,OAAkCtJ,KAAA,SAAAyQ,MAAA,MAA6B8G,IAAKhP,MAAAyO,EAAAuO,aAAuBvO,EAAAE,GAAA,KAAA9N,EAAA,YAA6BG,YAAA,0BAAAD,OAA6CtJ,KAAA,SAAeuX,IAAKhP,MAAAyO,EAAA0I,sBAA+B,GAAA1I,EAAAE,GAAA,KAAA9N,EAAA,OAA4B4gB,IAAA,iBAAAzgB,YAAA,wBAAAgO,IAA6DhP,MAAAyO,EAAAqR,qBAAA2C,SAAAhU,EAAAwR,kBAAAyC,UAAAjU,EAAA0R,gBAAAwC,UAAAlU,EAAA8R,gBAAAqC,QAAAnU,EAAAmS,cAAAiC,WAAApU,EAAAoS,iBAAAa,WAAAjT,EAAAsP,sBAAA+E,UAAArU,EAAAsQ,qBAAAgE,SAAAtU,EAAAyQ,oBAAA8D,MAAAvU,EAAAwO,eAAwUpc,EAAA,OAAY4gB,IAAA,eAAAzgB,YAAA,gBAAA3C,MAAAoQ,EAAA,WAAA1N,OAA6E8Z,IAAApM,EAAAwE,gBAAA6H,IAAArM,EAAAyE,iBAAoDlE,IAAKiU,KAAAxU,EAAA2N,YAAA8G,UAAA,SAAA9T,GAAoDA,EAAA8N,kBAAyBuF,SAAA,SAAArT,GAAsD,OAAzBA,EAAAwL,kBAAyBnM,EAAAuR,8BAAA5Q,WAAmDX,EAAAoB,MAAA,IAE7mR5O,oBCChC,IAuBekiB,GAvBUhiB,EAAQ,OAcjBiiB,CACdlR,GACAmP,IAT6B,EAV/B,SAAoBhgB,GAClBF,EAAQ,SAaS,kBAEU,MAUG,6XCmGhC6H,EAAA,EAAAC,IAAAyH,EAAA,GACA1H,EAAA,EAAAC,IAAAM,EAAA,GAAAN,IAAAO,EAAA,GACAR,EAAA,EAAAC,IAAAK,EAAA,GACAN,EAAA,EAAAC,IAAAI,EAAA,GACAL,EAAA,EAAAC,IAAAxJ,EAAA,GACAuJ,EAAA,EAAAC,IAAAU,EAAA,GACAX,EAAA,EAAAC,IAAAW,EAAA,GAEA,IAAAyZ,IACA5rB,KAAA,eACAC,KAFA,WAGA,OACA4rB,YACAC,cAAA,EACAC,YACAjf,SAAA,IAEAkf,eACAC,oBAGAhZ,UACAiZ,aADA,WAEA,OAAAzrB,KAAA2D,OAAAoP,OAAAD,UAAA,WAEA4Y,cAJA,WAKA,kBAAA1rB,KAAAyrB,aAAA,OAAAzrB,KAAAyrB,eAGAlrB,SAEAud,WAFA,WAIArd,OAAAC,kBACAD,OAAAC,kBAAAO,SAGAjB,KAAA+D,QAAAC,QAGA2nB,kBAXA,eAAAC,EAAAhqB,IAAAC,EAAAC,EAAAC,KAAA,SAAAC,IAAA,IAAA8Q,EAAAoD,EAAA2V,EAAA/X,EAAA,OAAAjS,EAAAC,EAAAQ,KAAA,SAAAC,GAAA,cAAAA,EAAAC,KAAAD,EAAAE,MAAA,cAYAqQ,EAAA9S,KAAAyrB,aAZAlpB,EAAAC,KAAA,EAAAD,EAAAE,KAAA,EAeAkT,GAAAzG,MAAA,YAAA+G,SAAA,IAAAvF,UAfA,cAeAwF,EAfA3T,EAAAS,MAkBA6oB,EAAA3V,EAAA7L,OAAA,SAAAsD,GAEA,OADAA,EAAAmF,UAAA,aACAA,KAIA5F,KAAA,SAAApL,EAAAqU,GACA,OAAArU,EAAAkO,MAAAoP,MAAA,IAAAhJ,OAAA,SAAAtU,EAAAqU,GAAA,OAAArU,EAAAqU,EAAAvL,WAAA,OACAuL,EAAAnG,MAAAoP,MAAA,IAAAhJ,OAAA,SAAAtU,EAAAqU,GAAA,OAAArU,EAAAqU,EAAAvL,WAAA,SAIAkJ,EAAA+X,EAAA5hB,IAAA,SAAA0D,GACA,OAAAkD,GAAA3B,MAAA,mBAAAuB,MAAA9C,EAAAsC,WAAA6b,OAAA,cACA1X,KAAA,SAAAvF,GACA,IAAAkd,EAAAvf,OAAApB,YAAAyD,EAAA5E,IAAA,SAAA+hB,GAAA,OAAAA,EAAA9K,gBAAA+K,MACAD,GAAAE,MAAAF,EAAA5b,iBAEA+b,IAAArf,KAAAif,GAAAlf,KAAA,SAAA4I,GAAA,OAAAA,EAAAyW,MAAA,IACA,OAAAD,MAAAte,GAAAoe,WAAAI,wBArCA5pB,EAAAE,KAAA,GAyCA6R,EAAAxS,EAAAyS,IAAAT,GAzCA,QAyCA9T,KAAAorB,SAzCA7oB,EAAAS,KAAAT,EAAAE,KAAA,iBAAAF,EAAAC,KAAA,GAAAD,EAAAW,GAAAX,EAAA,SA2CAlB,QAAA8B,MAAA,YAAAZ,EAAAW,IACAlD,KAAAorB,YA5CA,yBAAA7oB,EAAAiB,SAAAxB,EAAAhC,OAAA,oCAAA4rB,EAAAnoB,MAAAzD,KAAA0D,YAAA,GAgDA0oB,WAhDA,eAAAC,EAAAzqB,IAAAC,EAAAC,EAAAC,KAAA,SAAAwR,EAgDA6J,GAhDA,IAAAvO,EAAA,OAAAhN,EAAAC,EAAAQ,KAAA,SAAAkR,GAAA,cAAAA,EAAAhR,KAAAgR,EAAA/Q,MAAA,WAiDA2a,EAAA+O,gBAjDA,CAAA3Y,EAAA/Q,KAAA,gBAkDAzC,KAAAsrB,WAAAjf,SAAA+Q,EAAA/Q,SACArM,KAAAurB,YAAAnO,EAnDA5J,EAAAhR,KAAA,EAAAgR,EAAA/Q,KAAA,EAuDAoO,GAAAkR,UAAA3E,EAAAnN,eAvDA,OAuDApB,EAvDA2E,EAAAxQ,KAwDAhD,KAAAwrB,eAAA3c,EAxDA2E,EAAA/Q,KAAA,iBAAA+Q,EAAAhR,KAAA,GAAAgR,EAAAtQ,GAAAsQ,EAAA,SA0DAnS,QAAA8B,MAAA,YAAAqQ,EAAAtQ,IACAlD,KAAAwrB,kBA3DA,QA8DAxrB,KAAAqrB,cAAA,EA9DA7X,EAAA/Q,KAAA,iBAgEAzC,KAAAssB,OAAAlP,EAAA/Q,UAhEA,yBAAAmH,EAAAhQ,SAAA+P,EAAAvT,OAAA,2BAAAkV,GAAA,OAAAmX,EAAA5oB,MAAAzD,KAAA0D,YAAA,GAqEA6oB,eArEA,WAsEA,OAAAvsB,KAAAurB,YAAAtb,UAAAjQ,KAAAurB,YAAAtb,UAAAnL,OAAA,GAIA0nB,eA1EA,WA2EA,OAAAxsB,KAAAurB,YAAAtb,WAAAjQ,KAAAwrB,eAAA1mB,OACA9E,KAAAwrB,eAAAnhB,OAAA,SAAA2hB,GAAA,OAAAA,EAAA5b,WAAA,IAAAtL,OADA,GAKA2nB,gBAhFA,WAiFA,IAAAzsB,KAAAurB,YAAAtb,YAAAjQ,KAAAwrB,eAAA1mB,OACA,OAAA9E,KAAAusB,iBAEA,IAAAG,EAAA1sB,KAAAwrB,eAAAnhB,OAAA,SAAA2hB,GAAA,OACAA,EAAA5b,YAAA,IAAA4b,EAAA7b,YAAA,OACArL,OACA,OAAA9E,KAAAusB,iBAAAG,GAGAJ,OA1FA,SA0FAjgB,GAAA,IAAA7L,EAAAR,KAAAsc,EAAA5Y,UAAAoB,OAAA,QAAAlC,IAAAc,UAAA,IAAAA,UAAA,GAAA8Y,EAAA9Y,UAAAoB,OAAA,QAAAlC,IAAAc,UAAA,IAAAA,UAAA,GACA1D,KAAAqrB,cAAA,EACA1V,GAAAzG,MAAA,YAAAC,OAAA9C,GAAA+C,QACAgF,KAAA,SAAAgJ,GACA,OAAA9I,EAAAxS,EAAAyS,KAAA6I,GAAA3T,OAAA/G,IAAA0a,EAAAnN,UAAAhG,IAAA,SAAAwL,GAAA,OAAA9E,GAAAzB,MAAA,YAAAC,OAAAsG,GAAArG,eAEAgF,KAAA,SAAAlK,GAAA,IAAAC,EAAAwiB,KAAAziB,GAAAkT,EAAAjT,EAAA,GAAA8F,EAAA9F,EAAAyiB,MAAA,GACAxP,EAAAnN,YACAmN,EAIA5c,EAAAuD,QAAAxC,MACAhC,KAAA,aACAwT,QACAwO,WAAAnE,EACAd,gBACAE,aARUjV,EAAA,EAAVL,OAAAgX,QAAA,eAcA2O,aAjHA,SAiHAxgB,GAAA,IAAAnI,EAAAlE,KACAA,KAAAqrB,cAAA,EACA1V,GAAAqL,gBAAA3U,GACA+H,KAAA,SAAAxD,GAEA,OADAA,QACAC,GAAAtB,OAAAqB,EAAAX,iBACAmE,KAAA,WACA/S,QAAAC,IAAA,uBACA4C,EAAAynB,wBAMA5rB,QApJA,eAAA+sB,EAAAlrB,IAAAC,EAAAC,EAAAC,KAAA,SAAA6R,IAAA,OAAA/R,EAAAC,EAAAQ,KAAA,SAAA2R,GAAA,cAAAA,EAAAzR,KAAAyR,EAAAxR,MAAA,cAAAwR,EAAAxR,KAAA,EAqJAzC,KAAA2rB,oBArJA,wBAAA1X,EAAAzQ,SAAAoQ,EAAA5T,SAAA,yBAAA8sB,EAAArpB,MAAAzD,KAAA0D,YAAA,GAyJAsE,OACA+kB,0BACAC,QADA,WAEAhtB,KAAA2rB,qBAEAsB,WAAA,KChSeC,IADE1kB,OAFP,WAAgB,IAAA+N,EAAAvW,KAAayI,EAAA8N,EAAA7N,eAA0BC,EAAA4N,EAAA3N,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,OAAiBG,YAAA,kBAA4BH,EAAA,eAAoBG,YAAA,mBAAAD,OAAsCmH,MAAAuG,EAAAmV,cAAAzS,MAAA,GAAAwQ,aAAA,IAAqD3S,IAAK6S,aAAApT,EAAAuH,cAA6BvH,EAAAE,GAAA,KAAA9N,EAAA,OAAwBG,YAAA,uBAAiCH,EAAA,OAAYG,YAAA,oBAA8BH,EAAA,MAAWG,YAAA,kBAA4ByN,EAAAE,GAAAF,EAAAY,GAAAZ,EAAAkV,iBAAAlV,EAAAE,GAAA,KAAA9N,EAAA,KAAyDG,YAAA,kBAA4ByN,EAAAE,GAAA,KAAAF,EAAAY,GAAAZ,EAAA6U,SAAAtmB,QAAA,YAAAyR,EAAAE,GAAA,KAAA9N,EAAA,cAAmFE,OAAOtJ,KAAA,cAAmBgX,EAAA6U,SAAAtmB,OAAA,EAAA6D,EAAA,YAA2CG,YAAA,YAAAD,OAA+B8N,aAAA,EAAAC,OAAA,KAA4BL,EAAAS,GAAAT,EAAA,kBAAA6G,EAAA5b,GAA4C,OAAAmH,EAAA,iBAA2BtC,IAAA+W,EAAA/Q,SAAAvD,YAAA,iBAAA3C,OAAuD8Q,kBAAA,IAAAzV,EAAA,KAA0CqH,OAASgO,UAAA,IAAeC,IAAKhP,MAAA,SAAAoP,GAAyB,OAAAX,EAAA6V,WAAAhP,OAA8BzU,EAAA,OAAYG,YAAA,sBAAgCH,EAAA,OAAYG,YAAA,cAAwBH,EAAA,YAAiBE,OAAOtJ,KAAA,UAAAqY,KAAA,KAAAC,MAAAuF,EAAA+O,gBAAA,kDAA6G,GAAA5V,EAAAE,GAAA,KAAA9N,EAAA,OAA4BG,YAAA,cAAwBH,EAAA,MAAWG,YAAA,eAAyByN,EAAAE,GAAAF,EAAAY,GAAAiG,EAAApN,UAAAuG,EAAAE,GAAA,KAAA9N,EAAA,KAAmDG,YAAA,cAAwByN,EAAAE,GAAA,SAAAF,EAAAY,GAAAiG,EAAAnN,UAAAmN,EAAAnN,UAAAnL,OAAA,MAAAyR,EAAAE,GAAA,KAAA2G,EAAA,gBAAAzU,EAAA,OAAqHG,YAAA,gBAA0BH,EAAA,WAAgBE,OAAOiH,KAAA,UAAA8H,KAAA,UAAgCrB,EAAAE,GAAA,aAAAF,EAAAoB,OAAApB,EAAAE,GAAA,KAAA9N,EAAA,OAAuDG,YAAA,eAAyBH,EAAA,YAAiBE,OAAOtJ,KAAA,YAAgB,SAAU,GAAAoJ,EAAA,OAAeG,YAAA,gBAA0BH,EAAA,OAAYG,YAAA,eAAyBH,EAAA,YAAiBE,OAAOtJ,KAAA,YAAAqY,KAAA,KAAAC,MAAA,wBAA4D,GAAAtB,EAAAE,GAAA,KAAA9N,EAAA,KAA0BG,YAAA,eAAyByN,EAAAE,GAAA,cAAAF,EAAAE,GAAA,KAAA9N,EAAA,cAAoDE,OAAOiH,KAAA,UAAAsH,MAAA,IAA4BN,IAAKhP,MAAA,SAAAoP,GAAyB,OAAAX,EAAAxS,QAAAxC,KAAA,SAA+BgV,EAAAE,GAAA,8DAAAF,EAAAE,GAAA,KAAA9N,EAAA,aAAmGG,YAAA,eAAAD,OAAkCskB,SAAA,SAAA/V,MAAA,IAA+BN,IAAKO,gBAAA,SAAAH,GAAiCX,EAAA8U,cAAA,IAA0B/T,OAAQvU,MAAAwT,EAAA,aAAAgB,SAAA,SAAAC,GAAkDjB,EAAA8U,aAAA7T,GAAqBC,WAAA,kBAA4B9O,EAAA,OAAYG,YAAA,iBAA2BH,EAAA,OAAYG,YAAA,iBAA2BH,EAAA,OAAYG,YAAA,gBAA0BH,EAAA,MAAA4N,EAAAE,GAAA,YAAAF,EAAAE,GAAA,KAAA9N,EAAA,KAAkDG,YAAA,eAAyByN,EAAAE,GAAAF,EAAAY,GAAAZ,EAAAgV,YAAAvb,YAAAuG,EAAAE,GAAA,KAAA9N,EAAA,YAAuEG,YAAA,aAAAD,OAAgCtJ,KAAA,SAAeuX,IAAKhP,MAAA,SAAAoP,GAAyBX,EAAA8U,cAAA,OAA2B,GAAA9U,EAAAE,GAAA,KAAA9N,EAAA,OAA4BG,YAAA,gBAA0BH,EAAA,OAAYG,YAAA,cAAAghB,OAAiCsD,SAAA,IAAA7W,EAAAkW,mBAAwC3V,IAAKhP,MAAA,SAAAoP,GAAyBX,EAAAkW,kBAAA,GAAAlW,EAAA+V,OAAA/V,EAAA+U,WAAAjf,UAAA,UAAgF1D,EAAA,OAAYG,YAAA,oBAA8BH,EAAA,YAAiBE,OAAOtJ,KAAA,WAAe,GAAAgX,EAAAE,GAAA,KAAA9N,EAAA,OAA4BG,YAAA,gBAA0BH,EAAA,QAAaG,YAAA,iBAA2ByN,EAAAE,GAAA,SAAAF,EAAAE,GAAA,KAAA9N,EAAA,QAAyCG,YAAA,iBAA2ByN,EAAAE,GAAAF,EAAAY,GAAAZ,EAAAkW,mBAAA,WAAAlW,EAAAE,GAAA,KAAA9N,EAAA,OAAwEG,YAAA,sBAAAghB,OAAyCsD,SAAA,IAAA7W,EAAAgW,kBAAuCzV,IAAKhP,MAAA,SAAAoP,GAAyBX,EAAAgW,iBAAA,GAAAhW,EAAA+V,OAAA/V,EAAA+U,WAAAjf,cAAkE1D,EAAA,OAAYG,YAAA,gBAA0BH,EAAA,YAAiBE,OAAOtJ,KAAA,aAAiB,GAAAgX,EAAAE,GAAA,KAAA9N,EAAA,OAA4BG,YAAA,gBAA0BH,EAAA,QAAaG,YAAA,iBAA2ByN,EAAAE,GAAA,UAAAF,EAAAE,GAAA,KAAA9N,EAAA,QAA0CG,YAAA,iBAA2ByN,EAAAE,GAAAF,EAAAY,GAAAZ,EAAAgW,kBAAA,WAAAhW,EAAAE,GAAA,KAAA9N,EAAA,OAAuEG,YAAA,sBAAAghB,OAAyCsD,SAAA,IAAA7W,EAAAiW,kBAAuC1V,IAAKhP,MAAA,SAAAoP,GAAyBX,EAAAiW,iBAAA,GAAAjW,EAAA+V,OAAA/V,EAAA+U,WAAAjf,UAAA,OAAwE1D,EAAA,OAAYG,YAAA,gBAA0BH,EAAA,YAAiBE,OAAOtJ,KAAA,iBAAqB,GAAAgX,EAAAE,GAAA,KAAA9N,EAAA,OAA4BG,YAAA,gBAA0BH,EAAA,QAAaG,YAAA,iBAA2ByN,EAAAE,GAAA,UAAAF,EAAAE,GAAA,KAAA9N,EAAA,QAA0CG,YAAA,iBAA2ByN,EAAAE,GAAAF,EAAAY,GAAAZ,EAAAiW,kBAAA,WAAAjW,EAAAE,GAAA,KAAA9N,EAAA,OAAuEG,YAAA,qBAAAgO,IAAqChP,MAAA,SAAAoP,GAAyB,OAAAX,EAAAsW,aAAAtW,EAAA+U,WAAAjf,cAAmD1D,EAAA,OAAYG,YAAA,gBAA0BH,EAAA,YAAiBE,OAAOtJ,KAAA,eAAmB,GAAAgX,EAAAE,GAAA,KAAA9N,EAAA,OAA4BG,YAAA,gBAA0BH,EAAA,QAAaG,YAAA,iBAA2ByN,EAAAE,GAAA,UAAAF,EAAAE,GAAA,KAAA9N,EAAA,QAA0CG,YAAA,iBAA2ByN,EAAAE,GAAA,uBAEhgJ1N,oBCChC,IAuBeskB,GAvBUpkB,EAAQ,OAcjBqkB,CACdnC,GACA+B,IAT6B,EAV/B,SAAoB/jB,GAClBF,EAAQ,SAaS,kBAEU,MAUG,QCpBhCskB,IAAIxc,IAAIyc,KAEO,IAAAC,GAAA,IAAID,KACfE,SAEQ9pB,KAAM,IACNrE,KAAM,WACNouB,UAAWhV,KAGX/U,KAAM,sBACNrE,KAAM,eACNouB,UAAWxC,GACXvC,OAAO,IAGPhlB,KAAM,QACNrE,KAAM,aACNouB,UAAW3T,GACX4O,OAAO,mJCLnB,GAZA2E,IAAIxc,IAAI6c,MACJC,mBAEJN,IAAIxc,IAAJ9J,GAAA,GAEAsmB,IAAIO,UAAU5Z,MAAQ6Z,KACtBR,IAAIO,UAAU5Z,MAAM8Z,MAAQA,KAEvBxhB,OAAOpB,cACRoB,OAAOpB,YAAc6iB,GAAM7iB,cAG1BE,MAAMwiB,UAAU/jB,KACjB,IACImkB,IAAsB5iB,MAAMwiB,UAAW,QACnC/qB,MAAO,SAAU6G,GACb,OAAOqkB,GAAMlkB,KAAK/J,KAAM4J,IAE5BukB,YAAY,IAElB,MAAOtiB,GACLP,MAAMwiB,UAAU/jB,KAAO,SAAUH,GAC7B,OAAOqkB,GAAMlkB,KAAK/J,KAAM4J,ICrBpC2jB,IAAI9f,OAAO2gB,eAAgB,EAG3B,IAAIb,KACFc,GAAI,OACJZ,UACAa,YAAchvB,OACdivB,SAAU","file":"static/js/app.37f220b243a383aea601.js","sourcesContent":["<template>\n <div id=\"app\">\n <transition :name=\"direction\">\n <router-view class=\"appView\"/>\n </transition>\n </div>\n</template>\n\n<script>\n export default {\n name: 'App',\n data: () => ({\n direction: \"slide-right\",\n lastBackPressTime: 0, // 上次按返回键的时间\n backPressInterval: 2000, // 双击返回键的时间间隔(毫秒)\n immersed: 20, // 沉浸式状态栏高度,默认值\n navHeight: 46, // 导航栏高度\n isImmersed: false // 是否为沉浸式状态栏\n }),\n mounted() {\n // H5 plus事件处理\n this.initPlusReady();\n // 初始化全局返回管理\n this.initGlobalBackManager();\n },\n beforeDestroy() {\n // 移除返回键监听\n this.removeBackButtonListener();\n // 清理动态注入的样式\n this.cleanupImmersiveStyles();\n // 清理全局返回管理器\n this.cleanupGlobalBackManager();\n },\n methods: {\n // 初始化全局返回管理器\n initGlobalBackManager() {\n // 创建全局返回管理器\n window.GlobalBackManager = {\n // 返回拦截器列表\n interceptors: [],\n \n // 添加返回拦截器\n addInterceptor: (interceptor) => {\n this.addBackInterceptor(interceptor);\n },\n \n // 移除返回拦截器\n removeInterceptor: (interceptor) => {\n this.removeBackInterceptor(interceptor);\n },\n \n // 执行返回操作\n goBack: () => {\n this.handleGlobalBack();\n }\n };\n \n // 在Vue原型上添加全局返回方法,方便组件调用\n this.$root.globalBack = () => {\n this.handleGlobalBack();\n };\n \n console.log('全局返回管理器初始化完成');\n },\n \n // 添加返回拦截器\n addBackInterceptor(interceptor) {\n if (typeof interceptor === 'function') {\n window.GlobalBackManager.interceptors.push(interceptor);\n }\n },\n \n // 移除返回拦截器\n removeBackInterceptor(interceptor) {\n const index = window.GlobalBackManager.interceptors.indexOf(interceptor);\n if (index > -1) {\n window.GlobalBackManager.interceptors.splice(index, 1);\n }\n },\n \n // 处理全局返回逻辑\n async handleGlobalBack() {\n // 按照后进先出的顺序执行拦截器\n const interceptors = [...window.GlobalBackManager.interceptors].reverse();\n \n for (let interceptor of interceptors) {\n try {\n // 拦截器返回 true 表示拦截返回操作,false 表示继续\n const shouldIntercept = await interceptor();\n if (shouldIntercept) {\n console.log('返回操作被拦截');\n return; // 被拦截,停止执行\n }\n } catch (error) {\n console.error('返回拦截器执行错误:', error);\n }\n }\n \n // 没有被拦截,执行默认返回逻辑\n this.executeDefaultBack();\n },\n \n // 执行默认返回逻辑\n executeDefaultBack() {\n const currentPath = this.$route.path;\n \n // 如果当前在首页,实现双击退出功能\n if (currentPath === '/') {\n this.handleHomePageBack();\n return;\n }\n \n // 检查是否有弹窗需要关闭\n if (this.hasOpenDialog()) {\n this.closeTopDialog();\n return;\n }\n \n // 否则返回上一页\n this.$router.back();\n },\n initPlusReady() {\n // H5 plus事件处理\n const plusReady = () => {\n // plus准备完成后初始化功能\n this.setupImmersiveStatusBar();\n this.addBackButtonListener();\n };\n \n if (window.plus) {\n plusReady();\n } else {\n document.addEventListener('plusready', plusReady, false);\n }\n \n // 在非plus环境下也尝试检测沉浸式状态栏\n this.detectImmersiveMode();\n },\n detectImmersiveMode() {\n // 获取状态栏高度,参考你提供的代码\n this.immersed = 20; // 默认高度\n var ms = (/Html5Plus\\/.+\\s\\(.*(Immersed\\/(\\d+\\.?\\d*).*)\\)/gi).exec(navigator.userAgent);\n if (ms && ms.length >= 3) { \n // 当前环境为沉浸式状态栏模式\n this.immersed = parseFloat(ms[2]); // 获取状态栏的高度\n this.isImmersed = true;\n console.log('检测到沉浸式状态栏,高度:', this.immersed);\n } else {\n this.isImmersed = false;\n this.immersed = 0; // 非沉浸式模式不需要额外高度\n console.log('非沉浸式状态栏模式');\n }\n // this.isImmersed = true;\n // this.immersed = 46;\n \n // 设置全局变量供其他地方使用\n window.app = window.app || {};\n window.app.immersed = this.immersed;\n window.app.navHeight = this.navHeight;\n window.app.isImmersed = this.isImmersed;\n \n // 应用沉浸式样式\n this.applyImmersiveStyles();\n },\n setupImmersiveStatusBar() {\n // 如果在 plus 环境中,可以进行更精确的设置\n if (typeof plus !== 'undefined') {\n try {\n // 获取更精确的状态栏高度\n const statusBarHeight = plus.navigator.getStatusBarHeight();\n if (statusBarHeight > 0) {\n this.immersed = statusBarHeight;\n this.isImmersed = true;\n \n // 更新全局变量\n window.app = window.app || {};\n window.app.immersed = this.immersed;\n window.app.navHeight = this.navHeight;\n window.app.isImmersed = this.isImmersed;\n }\n \n // 重新应用样式\n this.applyImmersiveStyles();\n \n console.log('沉浸式状态栏设置完成,高度:', this.immersed);\n } catch (error) {\n console.warn('设置沉浸式状态栏失败:', error);\n }\n }\n },\n applyImmersiveStyles() {\n // 只有在沉浸式模式下才注入样式\n if (this.isImmersed && this.immersed > 0) {\n this.injectImmersiveStyles();\n }\n },\n injectImmersiveStyles() {\n // 移除已存在的沉浸式样式\n const existingStyle = document.getElementById('immersive-style');\n if (existingStyle) {\n existingStyle.remove();\n }\n \n // 注册沉浸状态栏style,参考你提供的代码结构\n var styleEle = document.createElement('style');\n styleEle.id = 'immersive-style';\n styleEle.innerHTML = \n // 适配 Vant 导航栏组件 - 增加padding使导航栏延伸到状态栏\n '.van-nav-bar { padding-top: ' + this.immersed + 'px !important; height: ' + (this.navHeight + this.immersed) + 'px !important; }' +\n \n // 确保导航栏背景渐变完全覆盖状态栏区域\n '.van-nav-bar::before { content: \"\"; position: absolute; top: 0; left: 0; right: 0; height: ' + this.immersed + 'px; background: var(--primary-gradient); z-index: -1; }' +\n \n // 调整导航栏标题和按钮位置,确保在状态栏下方正确显示\n '.van-nav-bar__title { margin-top: 0 !important; }' +\n '.van-nav-bar__left, .van-nav-bar__right { margin-top: 0 !important; }' +\n \n // 调整应用主体容器,重置之前的padding然后只设置必要的top值\n '#app { padding-top: ' + (this.navHeight + this.immersed) + 'px !important; }' +\n \n // 调整页面视图容器的最小高度\n '.appView { min-height: calc(100vh - ' + (this.navHeight + this.immersed) + 'px) !important; }' +\n \n // 适配各页面容器的padding,确保内容不被状态栏遮挡\n '.question-container { padding-top: ' + (this.immersed + 60) + 'px !important; }' +\n '.page-container { padding-top: ' + (this.immersed + 60) + 'px !important; }' +\n '.category-container { padding-top: ' + (this.immersed + 60) + 'px !important; }' +\n \n // 为固定定位的导航栏确保正确定位\n '.van-nav-bar[class*=\"fixed\"] { position: fixed !important; top: 0 !important; z-index: 1000 !important; }' +\n \n // 添加一个辅助类来标识沉浸式模式\n 'body { --immersed-height: ' + this.immersed + 'px; --nav-total-height: ' + (this.navHeight + this.immersed) + 'px; }' +\n 'body.immersive-mode #app { /* 为沉浸式模式提供额外样式钩子 */ }';\n \n document.head.appendChild(styleEle);\n \n // 添加沉浸式模式标识类到body\n document.body.classList.add('immersive-mode');\n \n console.log('沉浸式样式已注入');\n },\n cleanupImmersiveStyles() {\n // 移除动态注入的样式\n const existingStyle = document.getElementById('immersive-style');\n if (existingStyle) {\n existingStyle.remove();\n }\n \n // 移除沉浸式模式标识类\n document.body.classList.remove('immersive-mode');\n \n // 清理CSS变量\n document.documentElement.style.removeProperty('--immersed-height');\n document.documentElement.style.removeProperty('--nav-total-height');\n \n // 清理全局变量\n if (window.app) {\n delete window.app.immersed;\n delete window.app.navHeight;\n delete window.app.isImmersed;\n }\n },\n \n // 清理全局返回管理器\n cleanupGlobalBackManager() {\n if (window.GlobalBackManager) {\n // 清空拦截器\n window.GlobalBackManager.interceptors = [];\n // 删除全局对象\n delete window.GlobalBackManager;\n }\n \n // 清理Vue原型上的方法\n if (this.$root.globalBack) {\n delete this.$root.globalBack;\n }\n \n console.log('全局返回管理器已清理');\n },\n addBackButtonListener() {\n // 检查是否在uniapp环境中\n if (typeof plus !== 'undefined') {\n plus.key.addEventListener(\"backbutton\", this.onBackButton, false);\n }\n },\n removeBackButtonListener() {\n if (typeof plus !== 'undefined') {\n plus.key.removeEventListener(\"backbutton\", this.onBackButton);\n }\n },\n onBackButton() {\n // 使用全局返回管理器处理返回逻辑\n this.handleGlobalBack();\n },\n handleHomePageBack() {\n const currentTime = new Date().getTime();\n \n // 如果距离上次按返回键的时间小于设定间隔,则退出应用\n if (currentTime - this.lastBackPressTime < this.backPressInterval) {\n plus.runtime.quit();\n return;\n }\n \n // 记录本次按键时间\n this.lastBackPressTime = currentTime;\n \n // 显示提示信息\n this.showExitTip();\n },\n showExitTip() {\n // 优先使用 Vant 的 Toast 组件\n if (this.$toast) {\n this.$toast('再按一次退出应用');\n } else if (typeof this.$Toast !== 'undefined') {\n this.$Toast('再按一次退出应用');\n } else {\n // 如果没有 Toast 组件,使用 HTML5+ 原生提示\n if (typeof plus !== 'undefined' && plus.nativeUI) {\n plus.nativeUI.toast('再按一次退出应用');\n } else {\n // 最后的备选方案,使用 alert\n alert('再按一次退出应用');\n }\n }\n },\n hasOpenDialog() {\n // 检查是否有 Vant 的弹窗组件打开\n const dialogs = document.querySelectorAll('.van-overlay, .van-popup, .van-dialog, .van-action-sheet, .van-picker');\n return Array.from(dialogs).some(dialog => {\n const style = window.getComputedStyle(dialog);\n return style.display !== 'none' && style.visibility !== 'hidden';\n });\n },\n closeTopDialog() {\n // 尝试关闭最顶层的弹窗\n const dialogs = document.querySelectorAll('.van-overlay, .van-popup .van-popup--center, .van-dialog, .van-action-sheet, .van-picker');\n \n // 查找最后一个可见的弹窗并关闭\n for (let i = dialogs.length - 1; i >= 0; i--) {\n const dialog = dialogs[i];\n const style = window.getComputedStyle(dialog);\n if (style.display !== 'none' && style.visibility !== 'hidden') {\n // 尝试触发关闭按钮点击\n const closeBtn = dialog.querySelector('.van-popup__close-icon, .van-dialog__confirm, .van-picker__cancel');\n if (closeBtn) {\n closeBtn.click();\n return;\n }\n \n // 如果没有找到关闭按钮,尝试点击遮罩层关闭\n if (dialog.classList.contains('van-overlay')) {\n dialog.click();\n return;\n }\n \n // 最后尝试手动隐藏\n dialog.style.display = 'none';\n return;\n }\n }\n }\n },\n watch: {\n $route(to, from) {\n // 定义页面层级:数字越大表示层级越深\n const getPageLevel = (path) => {\n if (path === '/') return 1; // 主页:第1层\n if (path.startsWith('/category/')) return 2; // 分类页:第2层\n if (path === '/exam') return 3; // 答题页:第3层\n return 1; // 默认层级\n };\n \n const toLevel = getPageLevel(to.path);\n const fromLevel = getPageLevel(from.path);\n \n // 向下钻取(层级增加):从右往左滑动\n // 向上返回(层级减少):从左往右滑动\n if (toLevel > fromLevel) {\n this.direction = \"slide-left\"; // 进入下级页面\n } else if (toLevel < fromLevel) {\n this.direction = \"slide-right\"; // 返回上级页面\n } else {\n // 同级之间的切换,保持从右往左\n this.direction = \"slide-left\";\n }\n }\n }\n }\n</script>\n\n<style>\n #app {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n color: var(--text-primary);\n padding-top: 46px;\n background: var(--bg-primary);\n min-height: 100vh;\n }\n\n * {\n box-sizing: border-box;\n }\n\n .appView {\n position: absolute;\n width: 100%;\n left: 0;\n top: 0;\n background: var(--bg-primary);\n min-height: calc(100vh - 60px);\n overflow-x: hidden;\n will-change: left, opacity;\n backface-visibility: hidden;\n -webkit-backface-visibility: hidden;\n padding-top: 0;\n }\n\n /* 向左滑动动画 - 进入下级页面 */\n .slide-left-enter-active {\n transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n z-index: 10;\n }\n\n .slide-left-leave-active {\n transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n z-index: 5;\n }\n\n .slide-left-enter {\n left: 100%;\n opacity: 0;\n }\n\n .slide-left-enter-to {\n left: 0;\n opacity: 1;\n }\n\n .slide-left-leave {\n left: 0;\n opacity: 1;\n }\n\n .slide-left-leave-to {\n left: -25%;\n opacity: 0.4;\n }\n\n /* 向右滑动动画 - 返回上级页面 */\n .slide-right-enter-active {\n transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n z-index: 5;\n }\n\n .slide-right-leave-active {\n transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n z-index: 10;\n }\n\n .slide-right-enter {\n left: -25%;\n opacity: 0.4;\n }\n\n .slide-right-enter-to {\n left: 0;\n opacity: 1;\n }\n\n .slide-right-leave {\n left: 0;\n opacity: 1;\n }\n\n .slide-right-leave-to {\n left: 100%;\n opacity: 0;\n }\n\n /* 防止动画过程中的闪烁 */\n .slide-left-enter-active .appView,\n .slide-left-leave-active .appView,\n .slide-right-enter-active .appView,\n .slide-right-leave-active .appView {\n pointer-events: none;\n }\n\n\n p {\n margin: 0;\n color: var(--text-secondary);\n }\n\n /* 沉浸式模式基础样式 */\n .immersive-mode {\n position: relative; /* 为沉浸式模式提供定位上下文 */\n }\n\n /* 美化导航栏 */\n .van-nav-bar {\n background: var(--primary-gradient) !important;\n box-shadow: var(--shadow-md);\n }\n\n .van-nav-bar__title {\n color: var(--text-white) !important;\n font-weight: 600;\n }\n\n .van-nav-bar__arrow,\n .van-nav-bar__text {\n color: var(--text-white) !important;\n }\n\n /* 美化标签栏 */\n .van-tabbar {\n background: var(--bg-card) !important;\n box-shadow: 0 -2px 12px rgba(0, 196, 167, 0.1);\n border-top: 1px solid var(--border-light);\n }\n\n .van-tabbar-item--active {\n color: var(--primary-color) !important;\n }\n\n .van-tabbar-item--active .van-icon {\n color: var(--primary-color) !important;\n }\n\n img {\n width: 100%;\n }\n</style>\n\n\n\n// WEBPACK FOOTER //\n// src/App.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"app\"}},[_c('transition',{attrs:{\"name\":_vm.direction}},[_c('router-view',{staticClass:\"appView\"})],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-14b4ff9a\",\"hasScoped\":false,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/App.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-14b4ff9a\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../node_modules/vue-loader/lib/selector?type=styles&index=0!./App.vue\")\n}\nvar normalizeComponent = require(\"!../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../node_modules/vue-loader/lib/selector?type=script&index=0!./App.vue\"\nimport __vue_script__ from \"!!babel-loader!../node_modules/vue-loader/lib/selector?type=script&index=0!./App.vue\"\n/* template */\nimport __vue_template__ from \"!!../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-14b4ff9a\\\",\\\"hasScoped\\\":false,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../node_modules/vue-loader/lib/selector?type=template&index=0!./App.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/App.vue\n// module id = null\n// module chunks = ","export default {\n getHashCode(obj) {\n return this.getStrHashCode(this.getMessage(obj).concat(this.getPropertyNames(obj)).join(''));\n },\n getPropertyNames(_self, deep = 10) {\n if (deep <= 0) {\n return '';\n }\n if (!_self || ['string', 'number', 'boolean', 'function'].includes(typeof _self) || _self instanceof Date) {\n return '';\n }\n return this.flat(\n Object.entries(_self).map(([key, value]) => [key, this.getPropertyNames(value, deep--)])\n ).filter(r => r != null && r !== '')\n },\n getMessage(_self, deep) {\n deep == null && (deep = 10);\n if (deep <= 0) {\n return '';\n }\n if (!_self || ['string', 'number', 'boolean', 'function'].includes(typeof _self) || _self instanceof Date) {\n return [_self != null ? _self.toString() : ''];\n }\n return this.flat(\n Object.keys(_self).map(key => {\n return this.getMessage(_self[key], deep--);\n })\n ).filter(r => r != null && r !== '');\n },\n getStrHashCode(str) {\n let hash = 0, i, chr, len;\n if (str.length === 0) return hash;\n for (i = 0, len = str.length; i < len; i++) {\n chr = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + chr;\n hash |= 0; // Convert to 32bit integer\n }\n return hash + '';\n },\n flat(arr, deep = Infinity) {\n let ret = [];\n let dirty = false;\n arr.forEach(item => {\n if (Array.isArray(item)) {\n dirty = true;\n ret.push(...item)\n } else {\n ret.push(item)\n }\n });\n return dirty && deep > 0 ? this.flat(ret, deep--) : ret\n },\n fromEntries(arr) {\n let result = {};\n arr.forEach(a => {\n if (a instanceof Array) {\n result[a[0]] = a[1];\n }\n });\n return result;\n },\n storage: {\n getItem(key) {\n let itemStr = localStorage.getItem('__exam_s0_' + key);\n let result = null;\n try {\n result = JSON.parse(itemStr);\n } catch (e) {\n console.log(`No valid item for key [${key}] to get in storage.`);\n }\n return result;\n },\n setItem(key, value) {\n let result = null;\n try {\n result = JSON.stringify(value);\n localStorage.setItem('__exam_s0_' + key, result);\n } catch (e) {\n console.log(`Not valid item for key [${key}] to set.`);\n }\n },\n removeItem(key) {\n localStorage.removeItem('__exam_s0_' + key);\n },\n },\n groupArray(arr, groupedBy) {\n let array = arr.map(a => ({hashCode: this.getHashCode(a), item: a}));\n if (!(groupedBy instanceof Array)) {\n groupedBy = [groupedBy];\n }\n let checkedArr = array.map(a => ({\n hashCode: a.hashCode,\n checkItem: Object.fromEntries(\n groupedBy.map(groupBy => [groupBy, (a.item || {})[groupBy]])\n )\n })).map(a => ({...a, checkedHashCode: this.getHashCode(a.checkItem)}));\n let checkedMap = {};\n checkedArr.forEach(a => {\n let hashArr = checkedMap[a.checkedHashCode];\n if (!hashArr) {\n hashArr = [];\n }\n hashArr.push(array.find(arr => arr.hashCode === a.hashCode).item);\n checkedMap[a.checkedHashCode] = hashArr;\n });\n return Object.values(checkedMap);\n },\n duplicateRemoval(arr) {\n let array = arr.map(a => ({item: a}));\n let grouped = this.groupArray(array, 'item');\n return grouped.map(g => g[0].item);\n },\n randomSort(arr) {\n return arr.sort(() => {\n return Math.random() - 0.5;\n })\n }\n}\n\n\n// WEBPACK FOOTER //\n// ./src/utils/index.js","import Dexie from \"dexie\";\n\nconst dexieDB = new Dexie('_qa_db');\ndexieDB.version(1).stores({\n config: 'key, value, createDate, modifyDate',\n question: 'hashCode, describe, type, createDate, modifyDate',\n bank: 'hashCode, title, *questions, createDate, modifyDate',\n historyRecord: 'relatedQuestion, rightTimes, errorTimes, maxTime, minTime, totalTime, createDate, modifyDate'\n});\ndexieDB.version(2).stores({\n bank: 'hashCode, title, *questions, category, createDate, modifyDate',\n});\ndexieDB.version(3).stores({\n question: 'hashCode, describe, type, createDate, modifyDate, analysis',\n});\nconst configDB = dexieDB['config'];\nconst questionDB = dexieDB['question'];\nconst bankDB = dexieDB['bank'];\nconst historyRecordDB = dexieDB['historyRecord'];\n\nexport {dexieDB, configDB, questionDB, bankDB, historyRecordDB};\n\n\n// WEBPACK FOOTER //\n// ./src/db/index.js","import {dexieDB, configDB, questionDB, bankDB, historyRecordDB} from '../db';\n\nclass BaseDao {\n constructor(db, defaultEntry) {\n this.db = db;\n this.defaultEntry = defaultEntry || {};\n this.db.hook('creating', (primKey, obj) => {\n obj.createDate = Date.now();\n obj.modifyDate = Date.now();\n });\n this.db.hook('updating', (changed, key, origin) => {\n changed['modifiedDate'] = Date.now();\n if (!origin['createdDate']) {\n changed['createdDate'] = Date.now();\n }\n console.log({...changed});\n return changed;\n })\n }\n\n async upsert(records) {\n if (records instanceof Array) {\n return this.db.bulkPut(records.map(r => ({...this.defaultEntry, ...r})));\n }\n return this.db.put({...this.defaultEntry, ...records});\n }\n\n query(field) {\n return this.db.where(field);\n }\n\n queryByHashCode(hashCode) {\n return this.query('hashCode').equals(hashCode).first();\n }\n\n async delete(keys) {\n if (keys instanceof Array) {\n return this.db.bulkDelete(keys);\n }\n return this.db.delete(keys);\n }\n}\n\n\nclass ConfigDao extends BaseDao {\n constructor() {\n super(configDB, {value: null});\n }\n}\n\nclass QuestionDao extends BaseDao {\n constructor() {\n super(questionDB, {\n describe: '',\n type: 'option'\n });\n }\n}\n\nclass BankDao extends BaseDao {\n constructor() {\n super(bankDB, {\n title: '',\n questions: []\n });\n }\n}\n\nclass HistoryRecordDao extends BaseDao {\n constructor() {\n super(historyRecordDB, {\n rightTimes: 0, errorTimes: 0, maxTime: 0, minTime: 0, totalTime: 0\n });\n }\n\n queryByHashCode(hashCode) {\n return this.query('relatedQuestion').equals(hashCode).first();\n }\n\n queryMany(hashCodeList) {\n return this.query('relatedQuestion').anyOf(hashCodeList).toArray();\n }\n}\n\nconst configDao = new ConfigDao();\nconst questionDao = new QuestionDao();\nconst bankDao = new BankDao();\nconst historyRecordDao = new HistoryRecordDao();\n\nexport {configDao, questionDao, bankDao, historyRecordDao}\n\n\n// WEBPACK FOOTER //\n// ./src/dao/index.js","export default {\n version: '1.1.5',\n domain:'//palerock.cn',\n // domain:'//localhost'\n}\n\n\n// WEBPACK FOOTER //\n// ./src/config/index.js","<template>\n <div class=\"home-index\">\n <div class=\"welcome-section\">\n <div class=\"welcome-card theme-card\">\n <div class=\"welcome-content\">\n <h2 class=\"gradient-text welcome-title\">欢迎使用答题神器</h2>\n <p>智能题库管理,轻松备考复习</p>\n </div>\n </div>\n </div>\n\n <transition name=\"slide-up\" mode=\"out-in\">\n <van-grid :column-num=\"2\" :gutter=\"16\" class=\"category-grid\">\n <van-grid-item\n icon=\"plus\"\n clickable\n @click=\"showImporter\"\n class=\"grid-item-enhanced import-item\">\n <div slot=\"text\" class=\"grid-text\">\n <span class=\"grid-title\">开始答题</span>\n <span class=\"grid-subtitle\">导入题库</span>\n </div>\n </van-grid-item>\n <van-grid-item\n v-for=\"(category, index) in categories\"\n :key=\"category\"\n icon=\"notes-o\"\n clickable\n @click=\"goToCategory(category)\"\n class=\"grid-item-enhanced category-item\"\n :style=\"{ 'animation-delay': (index * 0.1) + 's' }\">\n <div slot=\"text\" class=\"grid-text\">\n <span class=\"grid-title\">{{ category }}</span>\n <span class=\"grid-subtitle\">题库分类</span>\n </div>\n </van-grid-item>\n </van-grid>\n\n </transition>\n <van-popup v-model=\"isShowImporter\" class=\"import-popup\" round @click-overlay=\"isShowImporter = false\">\n <div class=\"exam-import-box theme-card\">\n <div class=\"popup-header\">\n <h3>导入题库</h3>\n <van-icon name=\"cross\" @click=\"isShowImporter = false\" class=\"close-icon\" />\n </div>\n \n <div v-if=\"isFromOnline\" class=\"online-libs-container\">\n <div v-if=\"loadingOnlineLibs\" class=\"loading-container\">\n <div class=\"loading-spinner\"></div>\n <p>{{ loadingProgress }}</p>\n <div v-if=\"totalLibsCount > 0\" class=\"progress-bar\">\n <div class=\"progress-fill\" :style=\"{ width: `${(loadedLibsCount / totalLibsCount) * 100}%` }\"></div>\n </div>\n </div>\n <div v-else-if=\"loadingError\" class=\"loading-container error-state\">\n <van-icon name=\"warning-o\" size=\"32\" color=\"var(--error-color)\" />\n <p class=\"error-message\">{{ loadingError }}</p>\n <van-button type=\"primary\" size=\"small\" round @click=\"retryLoadOnlineLibs\">\n 重试加载\n </van-button>\n </div>\n <div v-else-if=\"!onlineLibs || onlineLibs.length === 0\" class=\"loading-container\">\n <div class=\"loading-spinner\"></div>\n <p>准备加载题库...</p>\n </div>\n <van-checkbox-group v-model=\"onlineSelects\" v-else>\n <van-cell-group class=\"lib-cell-group\">\n <van-cell v-for=\"(lib, oi) in onlineLibs\"\n clickable\n @click=\"selectLib(lib)\"\n :key=\"oi\"\n class=\"lib-cell\">\n <template slot=\"title\">\n <div class=\"lib-info\">\n <span class=\"lib-title\">{{ lib.title }}</span>\n <span class=\"lib-category\">{{ lib.category || 'default' }}</span>\n </div>\n </template>\n <van-checkbox slot=\"right-icon\" :name=\"lib.hashCode\"></van-checkbox>\n </van-cell>\n </van-cell-group>\n </van-checkbox-group>\n </div>\n \n <div v-if=\"!isFromOnline\" class=\"manual-import\">\n <van-cell-group class=\"import-field-group\">\n <van-field\n v-model=\"questionLib\"\n label=\"题库内容\"\n type=\"textarea\"\n placeholder=\"请输入JSON格式的题库数据\"\n rows=\"8\"\n class=\"import-field\"></van-field>\n </van-cell-group>\n </div>\n \n <div class=\"popup-actions\">\n <van-button \n type=\"info\" \n size=\"large\" \n block \n round\n @click=\"importLib\"\n class=\"theme-button action-button\">\n <van-icon name=\"plus\" />\n 导入题库\n </van-button>\n <van-button \n type=\"primary\" \n size=\"large\" \n block \n round\n @click=\"importFromExist\"\n class=\"theme-button action-button\">\n <van-icon name=\"cloud-o\" />\n 获取在线题库\n </van-button>\n </div>\n </div>\n </van-popup>\n </div>\n</template>\n\n<script>\nimport Vue from 'vue';\nimport {Grid, GridItem} from 'vant';\nimport {Popup} from 'vant';\nimport {Button} from 'vant';\nimport {Field} from 'vant';\nimport {Cell, CellGroup} from 'vant';\nimport utils from '../../utils';\nimport {questionDao, historyRecordDao, bankDao, configDao} from '../../dao';\nimport {Dialog} from 'vant';\nimport config from \"@/config\";\nimport {Checkbox, CheckboxGroup} from 'vant';\nimport { Loading } from 'vant';\nimport { Tag } from 'vant';\nimport { Icon } from 'vant';\n\nVue.use(Loading);\nVue.use(Dialog);\nVue.use(Field).use(Cell).use(CellGroup);\nVue.use(Button);\nVue.use(Popup);\nVue.use(Grid).use(GridItem);\nVue.use(Checkbox).use(CheckboxGroup);\nVue.use(Tag);\nVue.use(Icon);\n\nconst existsMap = 'https://unpkg.com/@palerock/exam-qa@latest/lib-json';\nexport default {\n name: \"HomeIndex\",\n data() {\n return {\n isShowImporter: false,\n isFromOnline: false,\n onlineLibs: [],\n onlineSelects: [],\n questionLib: '',\n categories: [],\n loadingOnlineLibs: false,\n loadingProgress: '准备加载题库...',\n totalLibsCount: 0,\n loadedLibsCount: 0,\n loadingError: null\n }\n },\n computed: {\n selectedLibs() {\n let res = this.onlineLibs.filter(lib => this.onlineSelects.includes(lib.hashCode)).map(lib => ({...lib}));\n res.forEach(r => {\n delete r.hashCode;\n });\n return res;\n }\n },\n methods: {\n goToCategory(category) {\n this.$router.push({\n name: 'CategoryPage',\n params: { category }\n });\n },\n selectLib(lib) {\n this.onlineSelects.includes(lib.hashCode) ? (this.onlineSelects = this.onlineSelects.filter(s => s !== lib.hashCode)) : (this.onlineSelects = [...this.onlineSelects, lib.hashCode])\n this.questionLib = JSON.stringify(this.selectedLibs);\n },\n showImporter() {\n this.isShowImporter = true;\n this.isFromOnline = false;\n },\n async importFromExist() {\n this.isFromOnline = true;\n this.loadingError = null;\n await this.loadOnlineLibs();\n },\n \n async loadOnlineLibs() {\n this.loadingOnlineLibs = true;\n this.loadingProgress = '正在获取题库列表...';\n this.totalLibsCount = 0;\n this.loadedLibsCount = 0;\n \n try {\n const res = await this.fetchOnlineLib();\n this.onlineLibs = res.filter(r => r && r.data).map(r => ({\n ...r.data, hashCode: r.data.hashCode || utils.getHashCode(r.data.title + r.data.category)\n }));\n this.loadingProgress = `成功加载 ${this.onlineLibs.length} 个题库`;\n this.loadingError = null;\n } catch (e) {\n console.error('获取在线题库失败:', e);\n this.loadingError = '加载失败,请检查网络连接后重试';\n this.loadingProgress = '';\n } finally {\n this.loadingOnlineLibs = false;\n }\n },\n \n retryLoadOnlineLibs() {\n this.loadOnlineLibs();\n },\n async fetchOnlineLib() {\n try {\n // 获取题库映射文件\n this.loadingProgress = '正在获取题库列表...';\n const maps = (await this.$http.get(existsMap + \"/map.json\")).data || []\n \n if (maps.length === 0) {\n this.loadingProgress = '未找到可用题库';\n return [];\n }\n \n this.totalLibsCount = maps.length;\n this.loadedLibsCount = 0;\n this.loadingProgress = `准备并发加载 ${maps.length} 个题库...`;\n \n // 使用Promise.all并发加载所有题库文件,大幅提升加载速度\n const promises = maps.map((map, index) => {\n return this.$http.get(existsMap + \"/\" + map)\n .then(result => {\n this.loadedLibsCount++;\n this.loadingProgress = `正在并发加载题库 (${this.loadedLibsCount}/${this.totalLibsCount})`;\n return result;\n })\n .catch(error => {\n this.loadedLibsCount++;\n console.warn(`加载题库 ${map} 失败:`, error);\n this.loadingProgress = `正在并发加载题库 (${this.loadedLibsCount}/${this.totalLibsCount}) - 部分失败`;\n return null; // 某个题库加载失败时不影响其他题库\n });\n });\n \n const libs = await Promise.all(promises);\n \n // 过滤掉加载失败的题库\n const validLibs = libs.filter(lib => lib !== null);\n this.loadingProgress = `加载完成! 成功: ${validLibs.length}, 失败: ${maps.length - validLibs.length}`;\n \n return validLibs;\n } catch (error) {\n console.error('获取在线题库列表失败:', error);\n this.loadingProgress = '加载失败,请重试';\n throw error;\n }\n },\n async importLib() {\n try {\n let lib = JSON.parse(this.questionLib);\n let importCount = 0;\n \n if (lib instanceof Array) {\n const results = await Promise.all(lib.map(async l => {\n return await this.importSingleLib(l);\n }));\n importCount = results.filter(r => r).length;\n } else {\n const result = await this.importSingleLib(lib);\n importCount = result ? 1 : 0;\n }\n \n // 显示导入成功提示\n if (importCount > 0) {\n this.$toast.success(`成功导入 ${importCount} 个题库!`);\n } else {\n this.$toast.fail('未找到有效的题库数据');\n }\n \n } catch (e) {\n console.error('导入题库失败:', e);\n this.$toast.fail(`题库格式错误:${utils.getMessage(e)}`);\n }\n \n await this.initCategories(); // 刷新分类列表\n this.isShowImporter = false;\n this.questionLib = '';\n },\n async importSingleLib(lib) {\n if (!lib.questions || lib.questions.length === 0) {\n return false;\n }\n lib.questions.forEach(q=>{\n q.hashCode = q.hashCode || utils.getHashCode(q)\n })\n const bank = {\n ...lib,\n questions: lib.questions.map(q=>q.hashCode)\n }\n bank.hashCode = lib.hashCode || utils.getHashCode(bank)\n await questionDao.upsert(lib.questions)\n .then(()=>{\n return bankDao.upsert([bank]);\n })\n return true;\n },\n async initCategories() {\n await bankDao.query('hashCode').notEqual('').toArray().then(banks => {\n banks = banks.map(b => {\n b.category = b.category || 'default'\n return b\n })\n this.categories = banks.reduce((ac, item) => {\n if (!ac.includes(item.category)) {\n ac.push(item.category)\n }\n return ac\n }, [])\n })\n },\n },\n mounted() {\n this.initCategories();\n // configDao.query('key').equals('hasSync').first()\n // .then(hasSync => {\n // hasSync = !!hasSync;\n // if (!hasSync) {\n // this.syncDataToIndexDB();\n // }\n // });\n }\n}\n</script>\n\n<style scoped>\n.home-index {\n padding: 0;\n animation: fadeIn 0.6s ease-out;\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n/* 欢迎区域 */\n.welcome-section {\n margin-bottom: 24px;\n}\n\n.welcome-card {\n padding: 36px 28px;\n text-align: center;\n background: linear-gradient(135deg, #00c4a7 0%, #26a69a 50%, #4dd0e1 100%);\n color: var(--text-white);\n border: none;\n border-radius: var(--border-radius-lg);\n box-shadow: \n 0 12px 32px rgba(0, 196, 167, 0.2),\n 0 4px 16px rgba(0, 196, 167, 0.1),\n inset 0 1px 0 rgba(255, 255, 255, 0.1);\n position: relative;\n overflow: hidden;\n}\n\n.welcome-card::before {\n content: '';\n position: absolute;\n top: 0;\n left: -100%;\n width: 100%;\n height: 100%;\n background: linear-gradient(90deg, \n transparent 0%, \n rgba(255, 255, 255, 0.1) 50%, \n transparent 100%);\n animation: cardShimmer 3s ease-in-out infinite;\n z-index: 1;\n}\n\n.welcome-content {\n position: relative;\n z-index: 2;\n}\n\n@keyframes cardShimmer {\n 0% {\n left: -100%;\n }\n 50% {\n left: 100%;\n }\n 100% {\n left: 100%;\n }\n}\n\n/* 基础h2样式被.welcome-title覆盖 */\n\n.welcome-title {\n font-size: 32px !important;\n font-weight: 800 !important;\n letter-spacing: 0.8px;\n color: #ffffff !important;\n animation: titleBounceIn 0.8s cubic-bezier(0.68, -0.55, 0.265, 1.55) both;\n margin: 0 0 12px 0 !important;\n line-height: 1.2;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n\n.welcome-content p {\n margin: 0;\n font-size: 16px;\n font-weight: 500;\n color: rgba(248, 255, 254, 0.85);\n letter-spacing: 0.3px;\n animation: fadeInUp 0.8s ease-out 0.3s both;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n@keyframes fadeInUp {\n 0% {\n opacity: 0;\n transform: translateY(20px);\n }\n 100% {\n opacity: 0.95;\n transform: translateY(0);\n }\n}\n\n@keyframes titleBounceIn {\n 0% {\n opacity: 0;\n transform: scale(0.3) translateY(-50px);\n }\n 40% {\n opacity: 0.8;\n transform: scale(1.1) translateY(-10px);\n }\n 70% {\n opacity: 1;\n transform: scale(0.95) translateY(5px);\n }\n 100% {\n opacity: 1;\n transform: scale(1) translateY(0);\n }\n}\n\n/* 网格样式 */\n.category-grid {\n animation: slideUp 0.6s ease-out;\n}\n\n@keyframes slideUp {\n from {\n opacity: 0;\n transform: translateY(30px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.grid-item-enhanced {\n transition: all var(--transition-normal);\n animation: gridItemAppear 0.6s ease-out both;\n}\n\n@keyframes gridItemAppear {\n from {\n opacity: 0;\n transform: translateY(20px) scale(0.9);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n}\n\n.grid-item-enhanced:active {\n transform: scale(0.95);\n}\n\n.import-item .van-grid-item__content {\n background: var(--primary-gradient) !important;\n color: var(--text-white) !important;\n border-radius: var(--border-radius-md);\n box-shadow: var(--shadow-md);\n}\n\n.import-item .van-icon {\n color: var(--text-white) !important;\n}\n\n.category-item .van-grid-item__content {\n background: var(--bg-card) !important;\n border: 1px solid var(--border-light);\n border-radius: var(--border-radius-md);\n box-shadow: var(--shadow-sm);\n transition: all var(--transition-normal);\n}\n\n.category-item .van-grid-item__content:hover {\n box-shadow: var(--shadow-md);\n transform: translateY(-2px);\n}\n\n.grid-text {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 4px;\n}\n\n.grid-title {\n font-weight: 600;\n font-size: 14px;\n text-align: center;;\n}\n\n.grid-subtitle {\n font-size: 12px;\n opacity: 0.7;\n}\n\n\n/* 弹窗样式 */\n.import-popup .van-popup {\n background: transparent;\n}\n\n.exam-import-box {\n width: 90vw;\n max-width: 400px;\n margin: 20px auto;\n padding: 24px;\n border-radius: var(--border-radius-lg);\n border: none;\n box-shadow: none;\n}\n\n.popup-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 20px;\n padding-bottom: 16px;\n border-bottom: 1px solid var(--border-light);\n}\n\n.popup-header h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--text-primary);\n}\n\n.close-icon {\n font-size: 18px;\n color: var(--text-light);\n cursor: pointer;\n padding: 4px;\n border-radius: var(--border-radius-sm);\n transition: all var(--transition-fast);\n}\n\n.close-icon:active {\n background: var(--bg-secondary);\n color: var(--text-secondary);\n}\n\n/* 在线题库 */\n.online-libs-container {\n max-height: 300px;\n overflow-y: auto;\n margin-bottom: 20px;\n}\n\n.loading-container {\n text-align: center;\n padding: 40px 20px;\n color: var(--text-secondary);\n}\n\n.progress-bar {\n width: 100%;\n height: 4px;\n background: var(--bg-secondary);\n border-radius: var(--border-radius-sm);\n margin-top: 16px;\n overflow: hidden;\n}\n\n.progress-fill {\n height: 100%;\n background: var(--primary-gradient);\n border-radius: var(--border-radius-sm);\n transition: width 0.3s ease;\n}\n\n.loading-spinner {\n width: 24px;\n height: 24px;\n border: 3px solid var(--bg-secondary);\n border-top: 3px solid var(--primary-color);\n border-radius: 50%;\n animation: spin 1s linear infinite;\n margin: 0 auto 12px;\n}\n\n@keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}\n\n.error-state {\n padding: 40px 20px;\n}\n\n.error-message {\n color: var(--error-color);\n font-size: 14px;\n margin: 12px 0 16px 0;\n}\n\n.lib-cell-group .van-cell {\n border-radius: var(--border-radius-sm);\n margin-bottom: 8px;\n border: 1px solid var(--border-light);\n transition: all var(--transition-fast);\n}\n\n.lib-cell:active {\n background: var(--bg-secondary);\n transform: scale(0.98);\n}\n\n.lib-info {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.lib-title {\n font-weight: 500;\n font-size: 14px;\n color: var(--text-primary);\n}\n\n.lib-category {\n font-size: 12px;\n color: var(--text-secondary);\n background: var(--bg-secondary);\n padding: 2px 8px;\n border-radius: var(--border-radius-sm);\n display: inline-block;\n width: fit-content;\n}\n\n/* 手动导入 */\n.manual-import {\n margin-bottom: 20px;\n}\n\n.import-field-group .van-cell {\n border-radius: var(--border-radius-sm);\n border: 1px solid var(--border-light);\n}\n\n.import-field .van-field__control {\n font-size: 12px;\n line-height: 1.4;\n}\n\n/* 弹窗按钮 */\n.popup-actions {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.action-button {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n font-weight: 500;\n box-shadow: var(--shadow-sm);\n}\n\n.action-button:active {\n transform: scale(0.98);\n}\n\n\n/* 全局按钮美化 */\n.van-button {\n border-radius: var(--border-radius-md) !important;\n font-weight: 500;\n transition: all var(--transition-fast) !important;\n}\n\n.van-button--primary {\n background: var(--primary-color) !important;\n border-color: var(--primary-color) !important;\n}\n\n.van-button--info {\n background: var(--info-color) !important;\n border-color: var(--info-color) !important;\n}\n\n.van-button--warning {\n background: var(--warning-color) !important;\n border-color: var(--warning-color) !important;\n}\n\n.van-button--danger {\n background: var(--error-color) !important;\n border-color: var(--error-color) !important;\n}\n\n/* 标签美化 */\n.van-tag--warning {\n background: var(--warning-color) !important;\n color: var(--text-white) !important;\n border-radius: var(--border-radius-sm) !important;\n}\n</style>\n\n\n// WEBPACK FOOTER //\n// src/components/home-pages/HomeIndex.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"home-index\"},[_vm._m(0),_vm._v(\" \"),_c('transition',{attrs:{\"name\":\"slide-up\",\"mode\":\"out-in\"}},[_c('van-grid',{staticClass:\"category-grid\",attrs:{\"column-num\":2,\"gutter\":16}},[_c('van-grid-item',{staticClass:\"grid-item-enhanced import-item\",attrs:{\"icon\":\"plus\",\"clickable\":\"\"},on:{\"click\":_vm.showImporter}},[_c('div',{staticClass:\"grid-text\",attrs:{\"slot\":\"text\"},slot:\"text\"},[_c('span',{staticClass:\"grid-title\"},[_vm._v(\"开始答题\")]),_vm._v(\" \"),_c('span',{staticClass:\"grid-subtitle\"},[_vm._v(\"导入题库\")])])]),_vm._v(\" \"),_vm._l((_vm.categories),function(category,index){return _c('van-grid-item',{key:category,staticClass:\"grid-item-enhanced category-item\",style:({ 'animation-delay': (index * 0.1) + 's' }),attrs:{\"icon\":\"notes-o\",\"clickable\":\"\"},on:{\"click\":function($event){return _vm.goToCategory(category)}}},[_c('div',{staticClass:\"grid-text\",attrs:{\"slot\":\"text\"},slot:\"text\"},[_c('span',{staticClass:\"grid-title\"},[_vm._v(_vm._s(category))]),_vm._v(\" \"),_c('span',{staticClass:\"grid-subtitle\"},[_vm._v(\"题库分类\")])])])})],2)],1),_vm._v(\" \"),_c('van-popup',{staticClass:\"import-popup\",attrs:{\"round\":\"\"},on:{\"click-overlay\":function($event){_vm.isShowImporter = false}},model:{value:(_vm.isShowImporter),callback:function ($$v) {_vm.isShowImporter=$$v},expression:\"isShowImporter\"}},[_c('div',{staticClass:\"exam-import-box theme-card\"},[_c('div',{staticClass:\"popup-header\"},[_c('h3',[_vm._v(\"导入题库\")]),_vm._v(\" \"),_c('van-icon',{staticClass:\"close-icon\",attrs:{\"name\":\"cross\"},on:{\"click\":function($event){_vm.isShowImporter = false}}})],1),_vm._v(\" \"),(_vm.isFromOnline)?_c('div',{staticClass:\"online-libs-container\"},[(_vm.loadingOnlineLibs)?_c('div',{staticClass:\"loading-container\"},[_c('div',{staticClass:\"loading-spinner\"}),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.loadingProgress))]),_vm._v(\" \"),(_vm.totalLibsCount > 0)?_c('div',{staticClass:\"progress-bar\"},[_c('div',{staticClass:\"progress-fill\",style:({ width: (((_vm.loadedLibsCount / _vm.totalLibsCount) * 100) + \"%\") })})]):_vm._e()]):(_vm.loadingError)?_c('div',{staticClass:\"loading-container error-state\"},[_c('van-icon',{attrs:{\"name\":\"warning-o\",\"size\":\"32\",\"color\":\"var(--error-color)\"}}),_vm._v(\" \"),_c('p',{staticClass:\"error-message\"},[_vm._v(_vm._s(_vm.loadingError))]),_vm._v(\" \"),_c('van-button',{attrs:{\"type\":\"primary\",\"size\":\"small\",\"round\":\"\"},on:{\"click\":_vm.retryLoadOnlineLibs}},[_vm._v(\"\\n 重试加载\\n \")])],1):(!_vm.onlineLibs || _vm.onlineLibs.length === 0)?_c('div',{staticClass:\"loading-container\"},[_c('div',{staticClass:\"loading-spinner\"}),_vm._v(\" \"),_c('p',[_vm._v(\"准备加载题库...\")])]):_c('van-checkbox-group',{model:{value:(_vm.onlineSelects),callback:function ($$v) {_vm.onlineSelects=$$v},expression:\"onlineSelects\"}},[_c('van-cell-group',{staticClass:\"lib-cell-group\"},_vm._l((_vm.onlineLibs),function(lib,oi){return _c('van-cell',{key:oi,staticClass:\"lib-cell\",attrs:{\"clickable\":\"\"},on:{\"click\":function($event){return _vm.selectLib(lib)}}},[_c('template',{slot:\"title\"},[_c('div',{staticClass:\"lib-info\"},[_c('span',{staticClass:\"lib-title\"},[_vm._v(_vm._s(lib.title))]),_vm._v(\" \"),_c('span',{staticClass:\"lib-category\"},[_vm._v(_vm._s(lib.category || 'default'))])])]),_vm._v(\" \"),_c('van-checkbox',{attrs:{\"slot\":\"right-icon\",\"name\":lib.hashCode},slot:\"right-icon\"})],2)}),1)],1)],1):_vm._e(),_vm._v(\" \"),(!_vm.isFromOnline)?_c('div',{staticClass:\"manual-import\"},[_c('van-cell-group',{staticClass:\"import-field-group\"},[_c('van-field',{staticClass:\"import-field\",attrs:{\"label\":\"题库内容\",\"type\":\"textarea\",\"placeholder\":\"请输入JSON格式的题库数据\",\"rows\":\"8\"},model:{value:(_vm.questionLib),callback:function ($$v) {_vm.questionLib=$$v},expression:\"questionLib\"}})],1)],1):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"popup-actions\"},[_c('van-button',{staticClass:\"theme-button action-button\",attrs:{\"type\":\"info\",\"size\":\"large\",\"block\":\"\",\"round\":\"\"},on:{\"click\":_vm.importLib}},[_c('van-icon',{attrs:{\"name\":\"plus\"}}),_vm._v(\"\\n 导入题库\\n \")],1),_vm._v(\" \"),_c('van-button',{staticClass:\"theme-button action-button\",attrs:{\"type\":\"primary\",\"size\":\"large\",\"block\":\"\",\"round\":\"\"},on:{\"click\":_vm.importFromExist}},[_c('van-icon',{attrs:{\"name\":\"cloud-o\"}}),_vm._v(\"\\n 获取在线题库\\n \")],1)],1)])])],1)}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"welcome-section\"},[_c('div',{staticClass:\"welcome-card theme-card\"},[_c('div',{staticClass:\"welcome-content\"},[_c('h2',{staticClass:\"gradient-text welcome-title\"},[_vm._v(\"欢迎使用答题神器\")]),_vm._v(\" \"),_c('p',[_vm._v(\"智能题库管理,轻松备考复习\")])])])])}]\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-2eda658d\",\"hasScoped\":true,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/home-pages/HomeIndex.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-2eda658d\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./HomeIndex.vue\")\n}\nvar normalizeComponent = require(\"!../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./HomeIndex.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./HomeIndex.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-2eda658d\\\",\\\"hasScoped\\\":true,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./HomeIndex.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-2eda658d\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/home-pages/HomeIndex.vue\n// module id = null\n// module chunks = ","<template>\n <div>\n <van-button type=\"default\">默认按钮</van-button>\n <van-button type=\"primary\">主要按钮</van-button>\n <van-button type=\"info\">信息按钮</van-button>\n <van-button type=\"warning\">警告按钮</van-button>\n <van-button type=\"danger\">危险按钮</van-button>\n </div>\n</template>\n\n<script>\n import Vue from 'vue';\n import { Button } from 'vant';\n\n Vue.use(Button);\n\n export default {\n name: 'HelloWorld',\n data() {\n return {\n msg: 'Welcome to Your Vue.js App'\n }\n }\n }\n</script>\n\n\n\n// WEBPACK FOOTER //\n// src/components/HelloWorld.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('van-button',{attrs:{\"type\":\"default\"}},[_vm._v(\"默认按钮\")]),_vm._v(\" \"),_c('van-button',{attrs:{\"type\":\"primary\"}},[_vm._v(\"主要按钮\")]),_vm._v(\" \"),_c('van-button',{attrs:{\"type\":\"info\"}},[_vm._v(\"信息按钮\")]),_vm._v(\" \"),_c('van-button',{attrs:{\"type\":\"warning\"}},[_vm._v(\"警告按钮\")]),_vm._v(\" \"),_c('van-button',{attrs:{\"type\":\"danger\"}},[_vm._v(\"危险按钮\")])],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-a0448bfc\",\"hasScoped\":false,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/HelloWorld.vue\n// module id = null\n// module chunks = ","var normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./HelloWorld.vue\"\nimport __vue_script__ from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./HelloWorld.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-a0448bfc\\\",\\\"hasScoped\\\":false,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./HelloWorld.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/HelloWorld.vue\n// module id = null\n// module chunks = ","<template>\n <div class=\"home-page\">\n <van-nav-bar\n :title=\"activePage.label\"\n fixed\n ></van-nav-bar>\n <div class=\"is-relation page-container\">\n <transition name=\"fade\" mode=\"out-in\">\n <component :is=\"activePage.api\" :key=\"activeTabIndex\"></component>\n </transition>\n <p class=\"version-text text-align-center is-absolute\">{{version}}</p>\n </div>\n </div>\n</template>\n\n<script>\n import Vue from 'vue';\n import {NavBar} from 'vant';\n import {Tabbar, TabbarItem} from 'vant';\n import HomeIndex from \"@/components/home-pages/HomeIndex\";\n import HelloWorld from \"@/components/HelloWorld\";\n import config from \"@/config\";\n\n Vue.use(NavBar).use(Tabbar).use(TabbarItem);\n\n export default {\n name: \"HomePage\",\n data() {\n return {\n activeTabIndex: 0,\n pages: [\n {title: '主页', label: 'Home', api: HomeIndex, icon: 'home-o'},\n // {title: '搜索', label: '搜索', api: HelloWorld, icon: 'search'},\n // {title: '朋友', label: '朋友', api: HomeIndex, icon: 'friends-o'},\n // {title: '设置', label: '设置', api: HomeIndex, icon: 'setting-o'},\n ],\n }\n },\n computed: {\n activePage() {\n return this.pages[this.activeTabIndex] || {};\n },\n version() {\n return config.version;\n }\n }\n }\n</script>\n\n<style scoped>\n.home-page {\n background: var(--bg-primary);\n}\n\n.page-container {\n padding: 20px;\n padding-top: 66px; /* 46px (导航栏) + 20px (内容间距) */\n padding-bottom: 80px;\n min-height: calc(100vh - 140px);\n}\n\n.version-text {\n bottom: 80px;\n color: var(--text-light);\n font-size: 12px;\n opacity: 0.6;\n pointer-events: none;\n width: calc(100% - 40px);\n}\n\n.custom-tabbar {\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n}\n\n/* 页面切换动画 */\n.fade-enter-active, .fade-leave-active {\n transition: all var(--transition-normal);\n}\n\n.fade-enter, .fade-leave-to {\n opacity: 0;\n transform: translateY(20px);\n}\n</style>\n\n\n// WEBPACK FOOTER //\n// src/components/HomePage.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"home-page\"},[_c('van-nav-bar',{attrs:{\"title\":_vm.activePage.label,\"fixed\":\"\"}}),_vm._v(\" \"),_c('div',{staticClass:\"is-relation page-container\"},[_c('transition',{attrs:{\"name\":\"fade\",\"mode\":\"out-in\"}},[_c(_vm.activePage.api,{key:_vm.activeTabIndex,tag:\"component\"})],1),_vm._v(\" \"),_c('p',{staticClass:\"version-text text-align-center is-absolute\"},[_vm._v(_vm._s(_vm.version))])],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-08264cc4\",\"hasScoped\":true,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/HomePage.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-08264cc4\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./HomePage.vue\")\n}\nvar normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./HomePage.vue\"\nimport __vue_script__ from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./HomePage.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-08264cc4\\\",\\\"hasScoped\\\":true,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./HomePage.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-08264cc4\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/HomePage.vue\n// module id = null\n// module chunks = ","<template>\n <div ref=\"root\" class=\"exam-root\" v-finger:swipe=\"swipe\" @touchstart=\"onTouchStart\">\n <van-nav-bar\n :title=\"examInfo.title\"\n fixed\n left-arrow\n right-text=\"目录\"\n @click-left=\"handleBack\"\n @click-right=\"showAcButtons = !showAcButtons\"\n class=\"exam-nav-bar\"\n ></van-nav-bar>\n <transition name=\"fade\">\n <div class=\"ac-qn-backdrop\" v-show=\"showAcButtons\" @click.stop=\"showAcButtons = false\">\n <div class=\"exam-p-around-small ac-qn theme-card\" @click.stop>\n <div class=\"qn-header\">\n <h3>题目导航</h3>\n <span class=\"qn-progress\">{{ questionNum + 1 }} / {{ totalNum }}</span>\n </div>\n <van-row class=\"question-nav-grid\">\n <van-col span=\"4\" v-for=\"(question,i) in questionsInfo\" :key=\"i\">\n <div class=\"exam-circle exam-done theme-button\" @click=\"turnTo(i)\"\n :class=\"getQuestionNavClass(question, i)\">\n {{ i + 1 }}\n </div>\n </van-col>\n </van-row>\n </div>\n </div>\n </transition>\n <div class=\"question-container\">\n <transition :name=\"transitionName\" mode=\"out-in\">\n <div class=\"loading-item\" v-if=\"!questionsInfo[questionNum]\">\n <div class=\"question-card theme-card\">\n <div class=\"question-header\">\n <div class=\"question-title\">加载中...</div>\n <div class=\"question-desc\">正在加载题目数据</div>\n </div>\n </div>\n </div>\n <div class=\"question-item\" \n :key=\"questionNum\" v-else>\n <div class=\"question-card theme-card\">\n <div class=\"question-header\" @click=\"handleImageClick\">\n <div class=\"question-title\" v-for=\"t in getQuestionTitle(questionsInfo[questionNum])\" v-html=\"t\">\n </div>\n <div class=\"question-desc\">{{ getQuestionDesc(questionsInfo[questionNum]) }}</div>\n </div>\n <div v-if=\"questionsInfo[questionNum].isMulti\" class=\"options-container\">\n <van-checkbox-group v-model=\"questionsInfo[questionNum].answer.multi.apis\" @click.stop>\n <div class=\"option-list\">\n <div v-for=\"(option, oi) in questionsInfo[questionNum].answerOptions\"\n class=\"option-item theme-card\"\n @click=\"toggleAnswer(questionNum, option.api)\"\n :key=\"oi\"\n :class=\"{'option-selected': questionsInfo[questionNum].answer.multi.apis.includes(option.api), 'option-correct': option.isRight&&(isShowResult||(questionsInfo[questionNum].answer.isChecked&&isPractice)), 'option-incorrect': !option.isRight&&(isShowResult||(!option.isRight&&questionsInfo[questionNum].answer.isAnswered&&isPractice)) && questionsInfo[questionNum].answer.multi.apis.includes(option.api)}\">\n <div class=\"option-content\">\n <div class=\"option-label\">{{ letterIndex[oi] }}</div>\n <div class=\"option-text\" v-html=\"option.describe\" @click=\"handleImageClick\"></div>\n <van-checkbox :name=\"option.api\" :checked-color=\"getOptionColor(questionsInfo[questionNum],option)\" class=\"option-checkbox\"></van-checkbox>\n </div>\n </div>\n </div>\n </van-checkbox-group>\n </div>\n <div v-if=\"!questionsInfo[questionNum].isMulti\" class=\"options-container\">\n <van-radio-group v-model=\"questionsInfo[questionNum].answer.single.api\">\n <div class=\"option-list\">\n <div v-for=\"(option, oi) in questionsInfo[questionNum].answerOptions\"\n class=\"option-item theme-card\"\n @click=\"setAnswer(questionNum, [option.api])\"\n :key=\"oi\"\n :class=\"{'option-selected': questionsInfo[questionNum].answer.single.api === option.api, 'option-correct': option.isRight&&(isShowResult||(questionsInfo[questionNum].answer.isChecked&&isPractice)), 'option-incorrect': !option.isRight&&(isShowResult||(!option.isRight&&questionsInfo[questionNum].answer.isAnswered&&isPractice)) && questionsInfo[questionNum].answer.single.api === option.api}\">\n <div class=\"option-content\">\n <div class=\"option-label\">{{ letterIndex[oi] }}</div>\n <div class=\"option-text\" v-html=\"option.describe\" @click=\"handleImageClick\"></div>\n <van-radio :name=\"option.api\" :checked-color=\"getOptionColor(questionsInfo[questionNum],option)\" class=\"option-radio\"></van-radio>\n </div>\n </div>\n </div>\n </van-radio-group>\n </div>\n <div class=\"question-analysis\" \n v-if=\"isShowResult || !(isPractice&&!questionsInfo[questionNum].answer.isChecked)\">\n <div class=\"analysis-header\">\n <van-icon name=\"info-o\" />\n <span>题目解析</span>\n </div>\n <div class=\"analysis-content\" v-html=\"questionsInfo[questionNum].analysis || '暂无解析'\" @click=\"handleImageClick\"></div>\n </div>\n </div>\n </div>\n </transition>\n </div>\n <div class=\"ac-buttons theme-card\" v-if=\"questionsInfo[questionNum]\">\n <div class=\"button-row\">\n <van-button \n round \n v-if=\"questionNum>0\" \n @click=\"turnTo(questionNum-1)\"\n class=\"nav-button theme-button\">\n <van-icon name=\"arrow-left\" />\n 上一题\n </van-button>\n <van-button \n type=\"info\" \n round \n v-if=\"questionNum<totalNum-1\" \n @click=\"turnTo(questionNum+1)\"\n class=\"nav-button theme-button\">\n 下一题\n <van-icon name=\"arrow\" />\n </van-button>\n </div>\n <div class=\"button-row\">\n <van-button \n type=\"warning\" \n round \n block\n v-if=\"isPractice&&!questionsInfo[questionNum].answer.isChecked\"\n @click=\"checkResult(questionNum)\"\n class=\"action-button theme-button\">\n <van-icon name=\"eye-o\" />\n 检查答案\n </van-button>\n <van-button \n type=\"primary\" \n round \n block\n v-if=\"!hasSubmit\" \n @click=\"confirmSubmit\"\n class=\"submit-button theme-button pulse\">\n <van-icon name=\"success\" />\n 提交答案\n </van-button>\n </div>\n </div>\n\n <!-- 图片预览弹窗 -->\n <div v-if=\"showImagePreview\" class=\"image-preview-overlay\" @click=\"handleBackgroundClick\">\n <!-- 顶部控制栏 -->\n <div class=\"image-preview-controls-bar\" @click.stop>\n <van-icon name=\"minus\" class=\"control-icon\" @click=\"zoomOut\" />\n <span class=\"zoom-text\">{{ Math.round(zoomLevel * 100) }}%</span>\n <van-icon name=\"plus\" class=\"control-icon\" @click=\"zoomIn\" />\n <van-icon name=\"replay\" class=\"control-icon\" @click=\"resetZoom\" title=\"重置\" />\n <van-icon name=\"cross\" class=\"control-icon close-icon\" @click=\"closeImagePreview\" />\n </div>\n \n <!-- 图片容器 -->\n <div \n class=\"image-preview-content\" \n ref=\"imageContainer\"\n @click=\"handleContainerClick\"\n @dblclick=\"handleDoubleClick\"\n @mousedown=\"handleMouseDown\"\n @mousemove=\"handleMouseMove\"\n @mouseup=\"handleMouseUp\"\n @mouseleave=\"handleMouseLeave\"\n @touchstart=\"handleImageTouchStart\"\n @touchmove=\"handleImageTouchMove\"\n @touchend=\"handleImageTouchEnd\"\n @wheel=\"handleWheel\"\n >\n <img \n :src=\"previewImageSrc\" \n :alt=\"previewImageAlt\" \n class=\"preview-image\"\n ref=\"previewImage\"\n :style=\"imageStyle\"\n @load=\"onImageLoad\"\n @dragstart.prevent\n @dblclick.stop=\"handlePreviewImageDoubleClick\"\n />\n </div>\n </div>\n\n </div>\n</template>\n\n<script>\nimport Vue from 'vue';\nimport {NavBar} from 'vant';\nimport {Panel} from 'vant';\nimport {Button} from 'vant';\nimport {Cell, CellGroup} from 'vant';\nimport {RadioGroup, Radio} from 'vant';\nimport {Checkbox, CheckboxGroup} from 'vant';\nimport {Dialog} from 'vant';\nimport {Row, Col} from 'vant';\nimport {Icon} from 'vant';\nimport utils from '../../utils';\nimport {historyRecordDao, bankDao} from '../../dao'\n\nVue.use(Row).use(Col);\n// 全局注册\nVue.use(Dialog);\nVue.use(Checkbox).use(CheckboxGroup);\nVue.use(RadioGroup);\nVue.use(Radio);\nVue.use(Cell).use(CellGroup);\nVue.use(Icon);\n\nconst defaultQuestionInfo = {\n required: true,\n score: 1,\n usingScore: false,\n type: 'option', // text, number\n describe: 'Do you love me?Do you love me?Do you love me?Do you love me?Do you love me?Do you love me?Do you love me?Do you love me?Do you love me?Do you love me?Do you love me?Do you love me?Do you love me?',\n answerOptions: [\n {api: 'A', describe: 'Yes', isRight: true},\n {api: 'B', describe: 'No'}\n ]\n};\n\nconst defaultExamInfo = {\n title: '试题测试',\n questions: [defaultQuestionInfo]\n};\n\nVue.use(NavBar).use(Panel).use(Button);\n\nexport default {\n name: \"DoExamPage\",\n data() {\n return {\n answers: [],\n questionNum: 0,\n isShowResult: false,\n letterIndex: [...'ABCDEFGHIJKLMNOPQRSTUVWXYZ'],\n examInfo: {},\n hasSubmit: false,\n examHashCode: 0,\n historyExams: [],\n showAcButtons: false,\n backInterceptor: null, // 返回拦截器\n transitionName: 'question-slide-right',\n previousQuestionNum: 0,\n panStartScrollTop: null, // 记录滑动开始时的scrollTop\n showImagePreview: false, // 是否显示图片预览\n previewImageSrc: '', // 预览图片地址\n previewImageAlt: '', // 预览图片描述\n \n // 图片缩放和拖拽相关\n zoomLevel: 1, // 缩放级别\n translateX: 0, // X轴位移\n translateY: 0, // Y轴位移\n initialDistance: 0, // 双指初始距离\n initialZoom: 1, // 初始缩放级别\n lastTouchX: 0, // 上次触摸X坐标\n lastTouchY: 0, // 上次触摸Y坐标\n isDragging: false, // 是否正在拖拽\n isZooming: false, // 是否正在缩放\n imageNaturalWidth: 0, // 图片原始宽度\n imageNaturalHeight: 0, // 图片原始高度\n containerWidth: 0, // 容器宽度\n containerHeight: 0, // 容器高度\n \n // 鼠标拖动相关\n isMouseDragging: false, // 是否正在鼠标拖拽\n mouseStartX: 0, // 鼠标开始X坐标\n mouseStartY: 0, // 鼠标开始Y坐标\n lastClickTime: 0, // 上次点击时间(用于检测双击)\n doubleClickDelay: 300, // 双击检测延迟(毫秒)\n \n // 触摸双击检测相关\n lastTouchTime: 0, // 上次触摸时间\n lastTouchX: 0, // 上次触摸X坐标\n lastTouchY: 0, // 上次触摸Y坐标\n doubleTapDelay: 300, // 双击检测延迟(毫秒)\n doubleTapDistance: 50, // 双击位置允许的最大距离差(像素)\n touchMoved: false, // 是否有明显的触摸移动\n }\n },\n computed: {\n totalNum() {\n return this.questions.length;\n },\n questions() {\n return (this.examInfo.questions || []).filter(\n q => {\n return this.isReviewError ? this.historyErrorHashCodes.includes(q.hashCode) : (this.neverDo ? (!this.doneHashCodes.includes(q.hashCode)) : true)\n }\n ).map((q, i) => ({...q, active: i === this.questionNum}));\n },\n questionsInfo() {\n return this.questions.map(\n (q, i) => {\n if (!this.answers[i]) {\n this.answers[i] = {results: [{}], single: {}, multi: {apis: []}}\n }\n return {\n ...q,\n answer: this.answers[i] || {},\n orderNum: i + 1,\n isMulti: q.answerOptions.filter(opt => opt.isRight).length > 1\n }\n }\n )\n },\n historyErrorHashCodes() {\n return this.historyExams.filter(exam => exam.errorTimes > 0).map(exam => exam.hashCode);\n },\n doneHashCodes(){\n return this.historyExams.filter(exam => exam.errorTimes + exam.rightTimes > 0).map(exam => exam.hashCode);\n },\n \n // 图片样式计算\n imageStyle() {\n let cursor = 'zoom-in';\n if (this.zoomLevel > 1) {\n cursor = this.isDragging || this.isMouseDragging ? 'grabbing' : 'grab';\n }\n \n return {\n transform: `translate(${this.translateX}px, ${this.translateY}px) scale(${this.zoomLevel})`,\n transformOrigin: 'center center',\n transition: this.isDragging || this.isZooming || this.isMouseDragging ? 'none' : 'transform 0.3s ease',\n cursor: cursor,\n userSelect: 'none',\n WebkitUserSelect: 'none',\n MozUserSelect: 'none',\n msUserSelect: 'none'\n };\n }\n },\n methods: {\n handleBack() {\n // 使用全局返回管理器\n if (window.GlobalBackManager) {\n window.GlobalBackManager.goBack();\n } else {\n // 降级处理:如果全局返回管理器不存在,使用原有逻辑\n this.originalHandleBack();\n }\n },\n \n // 原有的返回处理逻辑(保留作为降级方案)\n originalHandleBack() {\n // 检查是否需要确认退出\n if (this.shouldConfirmExit()) {\n Dialog.confirm({\n title: '确认退出',\n message: '当次答题没有保存,是否确认退出?',\n confirmButtonText: '确认退出',\n cancelButtonText: '继续答题',\n confirmButtonColor: 'var(--warning-color)',\n className: 'custom-warning-dialog',\n closeOnClickOverlay: true\n }).then(() => {\n this.$router.back();\n }).catch(() => {\n // 用户取消,不执行任何操作\n });\n } else {\n // 直接返回\n this.$router.back();\n }\n },\n \n // 判断是否需要确认退出\n shouldConfirmExit() {\n // 如果已经提交答案,不需要确认\n if (this.hasSubmit) {\n return false;\n }\n \n // 检查是否至少答了一题\n const answeredCount = this.questionsInfo.filter(q => this.isQuestionAnswered(q)).length;\n return answeredCount > 0;\n },\n \n // 获取题目导航的样式类\n getQuestionNavClass(question, index) {\n let classes = {};\n \n // 当前题目\n classes['exam-current'] = this.questionNum === index;\n \n // 如果是结果显示模式或练习模式且已检查\n if (this.isShowResult || (question.answer.isChecked && this.isPractice)) {\n if (question.answer.isPass) {\n classes['exam-right'] = true; // 绿色 - 检查后正确\n } else if (question.answer.isMistake) {\n classes['exam-error'] = true; // 红色 - 检查后错误\n }\n } else {\n // 未检查状态,根据是否作答显示颜色\n if (this.isQuestionAnswered(question)) {\n classes['exam-answered'] = true; // 蓝色 - 未检查但已作答\n }\n // 未作答保持默认颜色(不添加特殊class)\n }\n \n return classes;\n },\n \n // 注册返回拦截器\n registerBackInterceptor() {\n if (window.GlobalBackManager) {\n // 创建拦截器函数\n this.backInterceptor = () => {\n // 如果图片预览弹窗打开,优先关闭弹窗\n if (this.showImagePreview) {\n this.closeImagePreview();\n return true; // 拦截返回操作\n }\n \n // 检查是否需要确认退出\n if (this.shouldConfirmExit()) {\n // 显示确认弹窗\n Dialog.confirm({\n title: '确认退出',\n message: '当次答题没有保存,是否确认退出?',\n confirmButtonText: '确认退出',\n cancelButtonText: '继续答题',\n confirmButtonColor: 'var(--warning-color)',\n className: 'custom-warning-dialog',\n closeOnClickOverlay: true\n }).then(() => {\n // 用户确认退出,移除拦截器并返回\n this.unregisterBackInterceptor();\n this.$router.back();\n }).catch(() => {\n // 用户取消,不执行任何操作\n });\n return true; // 拦截返回操作\n }\n return false; // 不拦截,继续正常返回流程\n };\n \n // 注册拦截器\n window.GlobalBackManager.addInterceptor(this.backInterceptor);\n console.log('答题页面返回拦截器已注册');\n }\n },\n \n // 移除返回拦截器\n unregisterBackInterceptor() {\n if (window.GlobalBackManager && this.backInterceptor) {\n window.GlobalBackManager.removeInterceptor(this.backInterceptor);\n this.backInterceptor = null;\n console.log('答题页面返回拦截器已移除');\n }\n },\n \n // 检查题目是否已答题\n isQuestionAnswered(question) {\n if (!question || !question.answer) return false;\n \n if (question.isMulti) {\n // 多选题:检查是否选择了至少一个选项\n return question.answer.multi && question.answer.multi.apis && question.answer.multi.apis.length > 0;\n } else {\n // 单选题:检查是否选择了选项\n return question.answer.single && question.answer.single.api;\n }\n },\n getQuestionTitle(question) {\n if (!question || !question.describe) {\n return [`(${this.questionNum + 1}/${this.totalNum})`, '加载中...'];\n }\n return [`(${this.questionNum + 1}/${this.totalNum})`, question.describe].join(' ').split('\\n');\n },\n getQuestionDesc(question) {\n if (!question) {\n return '加载中...';\n }\n let result = '';\n if (!question.required) {\n result += '(可选)'\n }\n if (question.type === 'option') {\n if (question.isMulti) {\n result += '多选题'\n } else {\n result += '单选题'\n }\n }\n let errorExam = this.historyExams.find(exam => exam.hashCode === question.hashCode);\n if (errorExam) {\n if (this.isReviewError) {\n if (errorExam.errorTimes) {\n result += ` (做错次数: ${errorExam.errorTimes})`;\n }\n }\n const totalTimes = errorExam.errorTimes + errorExam.rightTimes;\n if (totalTimes > 0) {\n result += `(历史正确率:${(errorExam.rightTimes / totalTimes * 100).toFixed(0)}%)`;\n }\n }\n return result\n },\n /**\n * @param i\n * @param api {Array}\n */\n setAnswer(i, api) {\n this.answers = [...this.answers].map((answer, ai) => {\n if (ai === i) {\n answer.results = api.map(a => ({api: a}));\n answer.single.api = api[0];\n answer.multi.apis = api;\n }\n return answer;\n });\n },\n toggleAnswer(i, api) {\n let apis = this.answers[i].multi.apis;\n if (apis.includes(api)) {\n apis = apis.filter(a => a !== api);\n } else {\n apis.push(api);\n apis = [...apis];\n }\n this.setAnswer(i, apis);\n },\n checkResult(i) {\n this.answers = [...this.answers].map((answer, ai) => {\n if (i !== ai && i != null) {\n return answer;\n }\n console.log([...this.questions], ai)\n let question = this.questions[ai];\n if (!question) {\n return answer;\n }\n let rightAnswers = question.answerOptions.filter(option => option.isRight).map(option => option.api);\n answer.results.forEach(res => {\n res.isMistake = !rightAnswers.includes(res.api);\n });\n answer.isAnswered = answer.results.filter(res => res.api).length > 0;\n if (!answer.isChecked && answer.isAnswered) {\n answer.isMistake = answer.results.length !== rightAnswers.length || !!answer.results.find(res => res.isMistake);\n answer.isPass = answer.isAnswered && !answer.isMistake;\n answer.isChecked = true;\n }\n return answer;\n })\n },\n turnTo(i) {\n const root = this.$refs.root;\n if (root) {\n root.scrollTop = 0;\n }\n \n // 设置过渡动画方向\n if (i > this.questionNum) {\n this.transitionName = 'question-slide-left';\n } else {\n this.transitionName = 'question-slide-right';\n }\n \n this.previousQuestionNum = this.questionNum;\n this.questionNum = i;\n },\n confirmSubmit() {\n // 计算答题状态\n const answeredNum = this.questionsInfo.filter(q => this.isQuestionAnswered(q)).length;\n const totalNum = this.totalNum;\n const progressRate = Math.round((answeredNum / totalNum) * 100);\n \n // 简化的弹窗内容\n const messageContent = `\n <div class=\"submit-dialog-content\">\n <div class=\"stats-row\">\n <span class=\"stat-text\">已答 <strong class=\"primary\">${answeredNum}</strong></span>\n <span class=\"stat-text\">未答 <strong class=\"secondary\">${totalNum - answeredNum}</strong></span>\n <span class=\"stat-text\">完成 <strong class=\"success\">${progressRate}%</strong></span>\n </div>\n <div class=\"progress-bar-container\">\n <div class=\"progress-bar\" style=\"width: ${progressRate}%;\"></div>\n </div>\n </div>\n `;\n\n Dialog.confirm({\n title: '📋 提交答案',\n message: messageContent,\n confirmButtonText: '确认提交',\n cancelButtonText: '继续答题',\n confirmButtonColor: 'var(--primary-color)',\n className: 'custom-submit-dialog',\n closeOnClickOverlay: true\n }).then(() => {\n this.submit();\n }).catch(e => {\n console.log(e);\n });\n },\n submit() {\n this.checkResult();\n let answeredNum = this.questionsInfo.filter(q => this.isQuestionAnswered(q)).length;\n if (answeredNum < this.totalNum && this.requireAllDone) {\n const unfinishedContent = `\n <div class=\"simple-dialog-content\">\n <div class=\"simple-message\">\n 还有 <strong class=\"warning\">${this.totalNum - answeredNum}</strong> 道题未答完\n </div>\n </div>\n `;\n Dialog.alert({\n title: '提醒',\n message: unfinishedContent,\n confirmButtonText: '继续答题',\n className: 'custom-warning-dialog',\n closeOnClickOverlay: true\n });\n return;\n }\n let rightNum = this.questionsInfo.filter(q => q.answer.isPass).length;\n let wrongNum = this.questionsInfo.filter(q => q.answer.isMistake).length;\n let rightRate = Math.round((rightNum / this.totalNum) * 100);\n \n // 录入错误信息\n let checkedQuestion = this.questionsInfo.filter(q => q.answer.isChecked);\n checkedQuestion.forEach(question => {\n historyRecordDao.queryByHashCode(question.hashCode).then(\n codeInfo => {\n if (!codeInfo) {\n codeInfo = {relatedQuestion: question.hashCode, errorTimes: 0};\n }\n if (question.answer.isPass) {\n if (isNaN(codeInfo.rightTimes)){\n codeInfo.rightTimes = 0;\n }\n codeInfo.rightTimes++;\n } else {\n if (isNaN(codeInfo.errorTimes)){\n codeInfo.errorTimes = 0;\n }\n codeInfo.errorTimes++;\n }\n console.log(codeInfo)\n historyRecordDao.upsert(codeInfo)\n .then(() => {\n console.log('做题信息已保存');\n });\n }\n );\n });\n\n // 显示答题结果\n this.isShowResult = true;\n \n // 根据正确率显示不同的emoji和评价\n let emoji = '';\n let evaluation = '';\n let dialogClass = '';\n \n if (rightRate >= 90) {\n emoji = '🎉';\n evaluation = '太棒了!';\n dialogClass = 'custom-success-dialog';\n } else if (rightRate >= 80) {\n emoji = '👏';\n evaluation = '很好!';\n dialogClass = 'custom-success-dialog';\n } else if (rightRate >= 70) {\n emoji = '👍';\n evaluation = '不错!';\n dialogClass = 'custom-warning-dialog';\n } else if (rightRate >= 60) {\n emoji = '💪';\n evaluation = '继续努力!';\n dialogClass = 'custom-warning-dialog';\n } else {\n emoji = '📚';\n evaluation = '多多练习!';\n dialogClass = 'custom-error-dialog';\n }\n \n const resultContent = `\n <div class=\"result-dialog-content\">\n <div class=\"result-score ${rightRate >= 70 ? 'success' : rightRate >= 60 ? 'warning' : 'error'}\">${rightRate}%</div>\n <div class=\"result-summary\">正确 ${rightNum}/${this.totalNum} 题</div>\n </div>\n `;\n \n Dialog.alert({\n title: '📊 答题结果',\n message: resultContent,\n confirmButtonText: '确定',\n className: dialogClass,\n closeOnClickOverlay: true\n });\n this.hasSubmit = true;\n },\n adaptExamConfig() {\n let examInfo = {...defaultExamInfo, ...this.examConfig};\n examInfo.questions = examInfo.questions.map(q => ({\n ...defaultQuestionInfo, ...q, hashCode: q.hashCode,\n answerOptions: !q.answerOptions ? [] : q.answerOptions.map(a => ({\n ...a,\n api: utils.getHashCode(a) + ''\n }))\n })).filter(q => {\n if (!q.describe || q.answerOptions.length === 0) {\n console.log('错误的题目(无描述或无答案).', q);\n return false;\n }\n // 去掉无正确答案的问题\n const checkNoAnswer = utils.groupArray(q.answerOptions, 'isRight');\n if (checkNoAnswer.length === 1 && !checkNoAnswer[0][0].isRight) {\n console.log('错误的题目(无正确答案).', q);\n return false;\n }\n // 去掉问题中重复的答案\n const checkDuplicate = utils.groupArray(q.answerOptions, 'describe');\n const resultAnswers = checkDuplicate.map(checks => {\n if (checks.length > 1) {\n const result = {...checks[0]};\n if (utils.groupArray(checks, 'isRight').length !== checks.length) {\n result.invalid = true;\n }\n return result;\n }\n return checks[0];\n });\n // 去掉答案中有重复描述且对错不一的问题\n if (resultAnswers.find(r => r.invalid)) {\n console.log('错误的题目(答案中有重复描述且对错不一).', q);\n return false;\n }\n q.answerOptions = utils.randomSort(resultAnswers);\n return true;\n });\n examInfo.questions = utils.randomSort(examInfo.questions);\n\n this.examInfo = examInfo;\n this.examHashCode = this.examConfig.hashCode;\n this.loadHistoryExamInfo();\n },\n getOptionColor(question, option) {\n if (this.isShowResult || (this.isPractice && question.answer.isChecked)) {\n return question.answer.results.map(res => res.api).includes(option.api) && option.isRight ? '#44af11' : '#cd0000'\n }\n return '#1989fa';\n },\n loadHistoryExamInfo() {\n historyRecordDao.queryMany(this.examConfig.questions.map(q => q.hashCode))\n .then(records => {\n // console.log(records.map(r => r.relatedQuestion));\n this.historyExams = records.map(r => ({...r, hashCode: r.relatedQuestion}));\n // console.log(this.historyExams);\n });\n // const errorMapKey = 'errorMap_' + this.examHashCode;\n // let errorMap = utils.storage.getItem(errorMapKey);\n // if (errorMap) {\n // this.historyExams = Object.entries(errorMap).map(([key, value]) => ({hashCode: key, ...value}));\n // }\n },\n onTouchStart: function (evt) {\n // 在触摸开始时记录scrollTop\n const root = this.$refs.root\n if (root) {\n this.panStartScrollTop = root.scrollTop\n console.log('touch开始,scrollTop:', this.panStartScrollTop)\n }\n },\n swipe: function (evt) {\n switch (evt.direction) {\n case 'Left':\n if (this.questionNum < this.totalNum - 1) {\n this.turnTo(this.questionNum + 1);\n }\n break;\n case 'Right':\n if (this.questionNum > 0) {\n this.turnTo(this.questionNum - 1);\n }\n break;\n case 'Up':\n this.showAcButtons = false\n break;\n case 'Down':\n // 需要同时检查滑动开始和结束时的scrollTop都小于等于5\n const root = this.$refs.root\n if (root) {\n const currentScrollTop = root.scrollTop\n console.log('swipe Down触发,开始scrollTop:', this.panStartScrollTop, '结束scrollTop:', currentScrollTop)\n \n // 只有当滑动开始时和结束时的scrollTop都小于等于5时才显示目录\n if (this.panStartScrollTop !== null && \n this.panStartScrollTop <= 5 && \n currentScrollTop <= 5) {\n console.log('满足条件,显示目录弹窗')\n this.showAcButtons = true\n } else {\n console.log('不满足条件,不显示目录弹窗')\n }\n }\n break\n default:\n }\n },\n \n // 处理图片点击事件\n handleImageClick(event) {\n // 检查点击的是否是图片\n if (event.target.tagName.toLowerCase() === 'img') {\n // 只有在真正点击图片时才阻止事件冒泡\n event.stopPropagation();\n \n this.showImagePreview = true;\n this.previewImageSrc = event.target.src;\n this.previewImageAlt = event.target.alt || '图片';\n \n // 为了更好的用户体验,添加轻微的震动反馈\n if (navigator.vibrate) {\n navigator.vibrate(50);\n }\n \n // 添加键盘监听\n document.addEventListener('keydown', this.handleKeyDown);\n \n // 确保控制栏位置正确适配沉浸式状态栏\n this.$nextTick(() => {\n this.adjustImagePreviewControlsPosition();\n \n // 调试DOM元素和事件绑定\n console.log('图片预览打开后DOM检查:');\n const overlay = this.$el.querySelector('.image-preview-overlay');\n const container = this.$el.querySelector('.image-preview-content');\n const img = this.$el.querySelector('.preview-image');\n \n console.log('overlay元素:', overlay);\n console.log('container元素:', container);\n console.log('img元素:', img);\n \n if (container) {\n console.log('container计算样式:', window.getComputedStyle(container));\n console.log('container位置信息:', container.getBoundingClientRect());\n }\n \n if (img) {\n console.log('img计算样式:', window.getComputedStyle(img));\n console.log('img位置信息:', img.getBoundingClientRect());\n }\n });\n }\n // 如果不是图片,不阻止事件冒泡,让选项正常被选中\n },\n \n // 调整图片预览控制栏位置以适配沉浸式状态栏\n adjustImagePreviewControlsPosition() {\n const controlsBar = this.$el.querySelector('.image-preview-controls-bar');\n if (controlsBar) {\n let topOffset = 20; // 默认顶部间距\n \n // 获取沉浸式状态栏高度\n let immersedHeight = 0;\n \n // 优先从全局变量获取\n if (window.app && window.app.immersed) {\n immersedHeight = window.app.immersed;\n } else {\n // 从CSS变量获取\n const cssImmersedHeight = getComputedStyle(document.documentElement)\n .getPropertyValue('--immersed-height').trim();\n if (cssImmersedHeight) {\n immersedHeight = parseFloat(cssImmersedHeight.replace('px', '')) || 0;\n }\n }\n \n // 在移动端使用更小的间距\n if (window.innerWidth <= 768) {\n topOffset = 10;\n }\n \n // 计算最终位置\n const finalTop = topOffset + immersedHeight;\n controlsBar.style.top = `${finalTop}px`;\n \n }\n },\n \n // 键盘事件处理\n handleKeyDown(event) {\n if (event.key === 'Escape' && this.showImagePreview) {\n this.closeImagePreview();\n }\n },\n \n // 关闭图片预览\n closeImagePreview() {\n this.showImagePreview = false;\n this.previewImageSrc = '';\n this.previewImageAlt = '';\n \n // 重置缩放和位移\n this.resetImageTransform();\n \n // 移除键盘监听\n document.removeEventListener('keydown', this.handleKeyDown);\n },\n \n // 重置图片变换\n resetImageTransform() {\n this.zoomLevel = 1;\n this.translateX = 0;\n this.translateY = 0;\n this.isDragging = false;\n this.isZooming = false;\n this.isMouseDragging = false;\n this.mouseStartX = 0;\n this.mouseStartY = 0;\n this.lastClickTime = 0;\n this.lastTouchTime = 0;\n this.lastTouchX = 0;\n this.lastTouchY = 0;\n this.touchMoved = false;\n },\n \n // 图片加载完成\n onImageLoad() {\n if (this.$refs.previewImage) {\n this.imageNaturalWidth = this.$refs.previewImage.naturalWidth;\n this.imageNaturalHeight = this.$refs.previewImage.naturalHeight;\n \n if (this.$refs.imageContainer) {\n this.containerWidth = this.$refs.imageContainer.clientWidth;\n this.containerHeight = this.$refs.imageContainer.clientHeight;\n }\n }\n },\n \n // 放大\n zoomIn() {\n this.zoomLevel = Math.min(this.zoomLevel * 1.2, 5);\n this.constrainImagePosition();\n },\n \n // 缩小\n zoomOut() {\n this.zoomLevel = Math.max(this.zoomLevel / 1.2, 0.1);\n this.constrainImagePosition();\n },\n \n // 重置缩放\n resetZoom() {\n this.zoomLevel = 1;\n this.translateX = 0;\n this.translateY = 0;\n },\n \n // 鼠标滚轮缩放\n handleWheel(event) {\n event.preventDefault();\n \n const delta = event.deltaY;\n const zoomFactor = delta > 0 ? 0.9 : 1.1;\n const newZoom = Math.min(Math.max(this.zoomLevel * zoomFactor, 0.1), 5);\n \n // 计算缩放中心点\n const rect = this.$refs.imageContainer.getBoundingClientRect();\n const centerX = event.clientX - rect.left - rect.width / 2;\n const centerY = event.clientY - rect.top - rect.height / 2;\n \n // 调整位移以保持缩放中心点\n const zoomChange = newZoom / this.zoomLevel;\n this.translateX = this.translateX + centerX * (1 - zoomChange);\n this.translateY = this.translateY + centerY * (1 - zoomChange);\n \n this.zoomLevel = newZoom;\n this.constrainImagePosition();\n },\n \n // 图片预览专用的滑动处理,阻止传播到根元素\n handleImageSwipe(evt) {\n // 阻止事件传播,防止触发题目切换\n evt.preventDefault && evt.preventDefault();\n evt.stopPropagation && evt.stopPropagation();\n \n // 在图片预览中,左右滑动用于移动图片而不是切换题目\n if (this.zoomLevel > 1) {\n // 当图片被放大时,滑动移动图片\n switch (evt.direction) {\n case 'Left':\n this.translateX -= 50;\n break;\n case 'Right':\n this.translateX += 50;\n break;\n case 'Up':\n this.translateY += 50;\n break;\n case 'Down':\n this.translateY -= 50;\n break;\n }\n this.constrainImagePosition();\n }\n // 如果图片没有放大(zoomLevel = 1),则忽略滑动,不进行任何操作\n },\n\n // 图片触摸开始 - 专门处理图片预览的触摸事件\n handleImageTouchStart(event) {\n \n event.preventDefault();\n event.stopPropagation(); // 阻止事件冒泡到根元素\n \n if (event.touches.length === 1) {\n const currentTime = Date.now();\n const touch = event.touches[0];\n \n // 检测双击\n const timeDiff = currentTime - this.lastTouchTime;\n const distanceX = Math.abs(touch.clientX - this.lastTouchX);\n const distanceY = Math.abs(touch.clientY - this.lastTouchY);\n const distance = Math.sqrt(distanceX * distanceX + distanceY * distanceY);\n \n \n if (timeDiff < this.doubleTapDelay && distance < this.doubleTapDistance) {\n // 双击检测成功\n this.handleTouchDoubleTap(event);\n return; // 不继续处理拖拽\n }\n \n // 记录此次触摸信息\n this.lastTouchTime = currentTime;\n this.lastTouchX = touch.clientX;\n this.lastTouchY = touch.clientY;\n this.touchMoved = false;\n \n // 立即开始拖拽准备,不延迟\n this.isDragging = true;\n this.lastTouchX = touch.clientX;\n this.lastTouchY = touch.clientY;\n \n \n // 添加拖拽样式\n if (this.$refs.imageContainer) {\n this.$refs.imageContainer.classList.add('dragging');\n }\n \n } else if (event.touches.length === 2) {\n // 双指缩放\n this.isZooming = true;\n this.isDragging = false;\n \n const touch1 = event.touches[0];\n const touch2 = event.touches[1];\n \n this.initialDistance = this.getDistance(touch1, touch2);\n this.initialZoom = this.zoomLevel;\n \n \n // 移除拖拽样式\n if (this.$refs.imageContainer) {\n this.$refs.imageContainer.classList.remove('dragging');\n }\n }\n },\n \n \n // 处理触摸双击\n handleTouchDoubleTap(event) {\n \n if (this.zoomLevel === 1) {\n // 如果当前是原始大小,放大到2倍\n this.zoomToPoint(2, event.touches[0]);\n } else {\n // 如果已经放大,重置到原始大小\n this.resetZoom();\n }\n },\n \n // 图片触摸移动 - 专门处理图片预览的触摸事件\n handleImageTouchMove(event) {\n event.preventDefault();\n event.stopPropagation(); // 阻止事件冒泡到根元素\n \n if (event.touches.length === 1 && this.isDragging) {\n // 单指拖拽\n const deltaX = event.touches[0].clientX - this.lastTouchX;\n const deltaY = event.touches[0].clientY - this.lastTouchY;\n \n // 检查移动距离,如果超过阈值则标记为移动\n const moveDistance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n if (moveDistance > 5) { // 移动超过5像素才算真正移动\n this.touchMoved = true;\n }\n \n \n this.translateX += deltaX;\n this.translateY += deltaY;\n \n this.lastTouchX = event.touches[0].clientX;\n this.lastTouchY = event.touches[0].clientY;\n \n this.constrainImagePosition();\n } else if (event.touches.length === 2 && this.isZooming) {\n // 双指缩放\n this.touchMoved = true; // 缩放时也标记为移动\n \n const touch1 = event.touches[0];\n const touch2 = event.touches[1];\n \n const currentDistance = this.getDistance(touch1, touch2);\n const scaleChange = currentDistance / this.initialDistance;\n \n \n this.zoomLevel = Math.min(Math.max(this.initialZoom * scaleChange, 0.1), 5);\n this.constrainImagePosition();\n }\n },\n \n // 图片触摸结束 - 专门处理图片预览的触摸事件\n handleImageTouchEnd(event) {\n \n event.preventDefault();\n event.stopPropagation(); // 阻止事件冒泡到根元素\n \n if (event.touches.length < 2) {\n this.isZooming = false;\n }\n \n if (event.touches.length === 0) {\n // 检查是否是单击背景关闭\n const isBackgroundClick = this.checkBackgroundClick(event);\n \n if (isBackgroundClick) {\n this.closeImagePreview();\n return;\n }\n \n this.isDragging = false;\n \n // 移除拖拽样式\n if (this.$refs.imageContainer) {\n this.$refs.imageContainer.classList.remove('dragging');\n }\n }\n },\n \n // 检查是否是背景点击\n checkBackgroundClick(event) {\n \n // 如果有明显移动,不算单击\n if (this.touchMoved) {\n return false;\n }\n \n // 如果点击的是图片,不关闭\n if (event.target.tagName === 'IMG') {\n return false;\n }\n \n // 如果点击的是容器或背景层\n if (event.target.classList.contains('image-preview-content') || \n event.target.classList.contains('image-preview-overlay')) {\n return true;\n }\n \n return false;\n },\n \n // 计算两点间距离\n getDistance(touch1, touch2) {\n const dx = touch1.clientX - touch2.clientX;\n const dy = touch1.clientY - touch2.clientY;\n return Math.sqrt(dx * dx + dy * dy);\n },\n \n // 约束图片位置,防止拖出边界\n constrainImagePosition() {\n if (!this.$refs.previewImage || !this.$refs.imageContainer) return;\n \n const img = this.$refs.previewImage;\n const container = this.$refs.imageContainer;\n \n // 获取图片和容器的实际尺寸\n const imgRect = img.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect();\n \n // 计算缩放后的图片尺寸\n const scaledWidth = img.offsetWidth * this.zoomLevel;\n const scaledHeight = img.offsetHeight * this.zoomLevel;\n \n \n // 如果图片比容器小,允许在容器范围内自由移动\n // 如果图片比容器大,限制在合理范围内\n let maxTranslateX, maxTranslateY;\n \n if (scaledWidth <= containerRect.width) {\n // 图片宽度小于容器,允许在容器范围内移动\n maxTranslateX = (containerRect.width - scaledWidth) / 2;\n } else {\n // 图片宽度大于容器,限制不超出边界\n maxTranslateX = (scaledWidth - containerRect.width) / 2;\n }\n \n if (scaledHeight <= containerRect.height) {\n // 图片高度小于容器,允许在容器范围内移动\n maxTranslateY = (containerRect.height - scaledHeight) / 2;\n } else {\n // 图片高度大于容器,限制不超出边界\n maxTranslateY = (scaledHeight - containerRect.height) / 2;\n }\n \n // 约束位移范围\n const oldTranslateX = this.translateX;\n const oldTranslateY = this.translateY;\n \n this.translateX = Math.max(-maxTranslateX, Math.min(maxTranslateX, this.translateX));\n this.translateY = Math.max(-maxTranslateY, Math.min(maxTranslateY, this.translateY));\n \n },\n \n // 处理单击背景退出\n handleBackgroundClick(event) {\n \n // 只有点击overlay背景层或容器空白区域才关闭\n if (event.target.classList.contains('image-preview-overlay') || \n event.target.classList.contains('image-preview-content')) {\n this.closeImagePreview();\n }\n },\n \n // 处理容器点击事件\n handleContainerClick(event) {\n // 容器点击不阻止传播,让背景点击处理\n },\n \n // 处理预览图片单击事件\n handlePreviewImageClick(event) {\n event.stopPropagation();\n // 图片单击不做任何操作,防止关闭预览\n },\n \n // 处理预览图片双击事件\n handlePreviewImageDoubleClick(event) {\n \n event.stopPropagation();\n event.preventDefault();\n \n if (this.zoomLevel === 1) {\n // 如果当前是原始大小,放大到2倍\n this.zoomToPoint(2, event);\n } else {\n // 如果已经放大,重置到原始大小\n this.resetZoom();\n }\n },\n \n // 处理容器双击事件\n handleDoubleClick(event) {\n \n event.stopPropagation();\n event.preventDefault();\n \n // 只有当双击的不是图片本身时才处理容器双击\n if (event.target !== this.$refs.previewImage) {\n this.handlePreviewImageDoubleClick(event);\n }\n },\n \n // 缩放到指定点\n zoomToPoint(newZoom, eventOrTouch) {\n if (!this.$refs.imageContainer) return;\n \n const container = this.$refs.imageContainer;\n const rect = container.getBoundingClientRect();\n \n // 支持鼠标事件和触摸事件\n const clientX = eventOrTouch.clientX;\n const clientY = eventOrTouch.clientY;\n \n \n // 计算点击点相对于容器中心的偏移\n const centerX = clientX - rect.left - rect.width / 2;\n const centerY = clientY - rect.top - rect.height / 2;\n \n // 计算缩放前后的位置调整\n const zoomChange = newZoom / this.zoomLevel;\n \n // 调整位移以保持点击点在缩放中心\n this.translateX = this.translateX - centerX * (zoomChange - 1);\n this.translateY = this.translateY - centerY * (zoomChange - 1);\n \n this.zoomLevel = newZoom;\n this.constrainImagePosition();\n },\n \n // 鼠标按下事件\n handleMouseDown(event) {\n console.log('=== 鼠标按下事件触发 ===', { \n button: event.button,\n clientX: event.clientX,\n clientY: event.clientY,\n target: event.target.tagName\n });\n \n if (event.button !== 0) return; // 只处理左键\n \n event.preventDefault();\n event.stopPropagation();\n \n this.isMouseDragging = true;\n this.mouseStartX = event.clientX;\n this.mouseStartY = event.clientY;\n \n console.log('开始拖拽状态:', { \n isMouseDragging: this.isMouseDragging, \n startX: this.mouseStartX, \n startY: this.mouseStartY \n });\n \n // 添加拖拽样式\n if (this.$refs.imageContainer) {\n this.$refs.imageContainer.classList.add('dragging');\n }\n },\n \n // 鼠标移动事件\n handleMouseMove(event) {\n if (!this.isMouseDragging) {\n return;\n }\n \n event.preventDefault();\n event.stopPropagation();\n \n const deltaX = event.clientX - this.mouseStartX;\n const deltaY = event.clientY - this.mouseStartY;\n \n console.log('=== 鼠标移动事件触发 ===', { \n isMouseDragging: this.isMouseDragging,\n deltaX, \n deltaY, \n currentTranslateX: this.translateX, \n currentTranslateY: this.translateY,\n zoomLevel: this.zoomLevel\n });\n \n // 简化拖动逻辑:任何时候都允许拖动\n this.translateX += deltaX;\n this.translateY += deltaY;\n \n console.log('拖动后位置:', { \n newTranslateX: this.translateX, \n newTranslateY: this.translateY \n });\n \n this.constrainImagePosition();\n \n this.mouseStartX = event.clientX;\n this.mouseStartY = event.clientY;\n },\n \n // 鼠标松开事件\n handleMouseUp(event) {\n if (!this.isMouseDragging) return;\n \n event.preventDefault();\n event.stopPropagation();\n \n this.isMouseDragging = false;\n \n // 移除拖拽样式\n if (this.$refs.imageContainer) {\n this.$refs.imageContainer.classList.remove('dragging');\n }\n },\n \n // 鼠标离开事件\n handleMouseLeave(event) {\n if (this.isMouseDragging) {\n this.handleMouseUp(event);\n }\n }\n },\n props: {\n examConfig: {\n type: Object,\n default() {\n return defaultExamInfo;\n }\n },\n isReviewError: {\n type: Boolean,\n default: false\n },\n neverDo: {\n type: Boolean,\n default: false\n },\n isNew: {\n type: Boolean,\n default: false\n },\n requireAllDone: {\n type: Boolean,\n default: false\n },\n isPractice: {\n type: Boolean,\n default: true\n }\n },\n watch: {\n examConfig() {\n this.adaptExamConfig();\n }\n },\n mounted() {\n this.adaptExamConfig();\n console.log('开始答题');\n try {\n plus.device.setWakelock(true);\n console.log('打开屏幕常亮');\n } catch (e) {\n // ignore\n }\n // 注册返回拦截器\n this.registerBackInterceptor();\n \n },\n destroyed() {\n console.log('结束答题');\n try {\n plus.device.setWakelock(false);\n console.log('关闭屏幕常亮');\n } catch (e) {\n // ignore\n }\n // 移除返回拦截器\n this.unregisterBackInterceptor();\n \n // 清理键盘监听器\n document.removeEventListener('keydown', this.handleKeyDown);\n }\n}\n</script>\n\n<style scoped>\n.exam-root {\n overflow-x: hidden;\n top: 0;\n bottom: 0;\n background: var(--bg-primary);\n min-height: 100vh;\n}\n\n/* 导航栏美化 */\n.exam-nav-bar {\n background: var(--primary-gradient) !important;\n box-shadow: var(--shadow-md);\n}\n\n/* 题目导航弹窗 */\n.ac-qn-backdrop {\n position: fixed;\n top: 46px;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.6);\n z-index: 1000;\n display: flex;\n align-items: center;\n justify-content: center;\n backdrop-filter: blur(4px);\n -webkit-backdrop-filter: blur(4px);\n}\n\n.ac-qn {\n z-index: 1001;\n background: var(--bg-card);\n border-radius: var(--border-radius-lg);\n max-width: 90vw;\n max-height: 80vh;\n overflow-y: auto;\n animation: popIn 0.3s ease-out;\n}\n\n@keyframes popIn {\n from {\n opacity: 0;\n transform: scale(0.8) translateY(20px);\n }\n to {\n opacity: 1;\n transform: scale(1) translateY(0);\n }\n}\n\n.qn-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n padding-bottom: 12px;\n border-bottom: 1px solid var(--border-light);\n}\n\n.qn-header h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--text-primary);\n}\n\n.qn-progress {\n font-size: 14px;\n color: var(--primary-color);\n font-weight: 500;\n background: var(--bg-secondary);\n padding: 4px 8px;\n border-radius: var(--border-radius-sm);\n}\n\n.question-nav-grid {\n gap: 8px;\n}\n\n.exam-circle {\n height: 2.5rem;\n width: 2.5rem;\n border: 2px solid var(--primary-color);\n border-radius: 50%;\n line-height: 2.1rem;\n text-align: center;\n color: var(--primary-color);\n cursor: pointer;\n margin-bottom: 8px;\n font-weight: 600;\n font-size: 14px;\n transition: all var(--transition-fast);\n position: relative;\n overflow: hidden;\n}\n\n.exam-circle:active {\n transform: scale(0.9);\n}\n\n.exam-circle.exam-error {\n color: var(--error-color);\n border-color: var(--error-color);\n animation: wobble 0.5s ease-in-out;\n}\n\n.exam-circle.exam-right {\n color: var(--success-color);\n border-color: var(--success-color);\n position: relative;\n}\n\n.exam-circle.exam-right::after {\n content: '✓';\n position: absolute;\n top: 6px;\n left: 6px;\n width: 16px;\n height: 16px;\n background: var(--success-color);\n color: white;\n border-radius: 50%;\n font-size: 10px;\n line-height: 16px;\n text-align: center;\n}\n\n.exam-circle.exam-answered {\n color: var(--info-color);\n border-color: var(--info-color);\n position: relative;\n}\n\n.exam-circle.exam-answered::after {\n content: '●';\n position: absolute;\n top: 6px;\n left: 6px;\n width: 16px;\n height: 16px;\n background: var(--info-color);\n color: white;\n border-radius: 50%;\n font-size: 8px;\n line-height: 16px;\n text-align: center;\n}\n\n.exam-circle.exam-current {\n background: var(--primary-gradient);\n color: var(--text-white);\n border-color: transparent;\n box-shadow: var(--shadow-md);\n transform: scale(1.1);\n}\n\n.exam-circle.exam-error.exam-current {\n background: var(--error-color);\n border-color: var(--error-color);\n}\n\n.exam-circle.exam-right.exam-current {\n background: var(--success-color);\n border-color: var(--success-color);\n}\n\n.exam-circle.exam-answered.exam-current {\n background: var(--info-color);\n border-color: var(--info-color);\n}\n\n/* 题目容器 */\n.question-container {\n position: relative;\n width: 100%;\n min-height: calc(100vh - 180px);\n padding-bottom: 120px;\n padding-top: 60px;\n padding-left: 16px;\n padding-right: 16px;\n}\n\n.question-item {\n width: 100%;\n padding: 0 8px;\n}\n\n.question-card {\n background: var(--bg-card);\n border-radius: var(--border-radius-lg);\n overflow: hidden;\n animation: questionSlideIn 0.5s ease-out;\n}\n\n@keyframes questionSlideIn {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n/* 题目头部 */\n.question-header {\n padding: 20px;\n background: var(--bg-secondary);\n border-bottom: 1px solid var(--border-light);\n}\n\n.question-title {\n font-size: 16px;\n font-weight: 600;\n color: var(--text-primary);\n line-height: 1.6;\n margin-bottom: 8px;\n word-break: break-word;\n white-space: break-spaces;\n}\n\n.question-desc {\n font-size: 12px;\n color: var(--text-secondary);\n background: var(--bg-card);\n padding: 6px 12px;\n border-radius: var(--border-radius-sm);\n display: inline-block;\n}\n\n/* 选项容器 */\n.options-container {\n padding: 16px;\n}\n\n.option-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.option-item {\n border: 2px solid var(--border-light);\n border-radius: var(--border-radius-md);\n transition: all var(--transition-normal);\n cursor: pointer;\n overflow: hidden;\n position: relative;\n}\n\n.option-item:active {\n transform: scale(0.98);\n}\n\n.option-item.option-selected {\n border-color: var(--primary-color);\n background: var(--bg-overlay);\n box-shadow: var(--shadow-sm);\n}\n\n.option-item.option-correct {\n border-color: var(--success-color);\n background: rgba(76, 175, 80, 0.1);\n}\n\n.option-item.option-incorrect {\n border-color: var(--error-color);\n background: rgba(244, 67, 54, 0.1);\n animation: shake 0.5s ease-in-out;\n}\n\n@keyframes shake {\n 0%, 100% { transform: translateX(0); }\n 25% { transform: translateX(-5px); }\n 75% { transform: translateX(5px); }\n}\n\n.option-content {\n display: flex;\n align-items: center;\n padding: 16px;\n gap: 12px;\n}\n\n.option-label {\n width: 32px;\n height: 32px;\n background: var(--primary-color);\n color: var(--text-white);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-weight: 600;\n font-size: 14px;\n flex-shrink: 0;\n transition: all var(--transition-fast);\n}\n\n.option-correct .option-label {\n background: var(--success-color);\n}\n\n.option-incorrect .option-label {\n background: var(--error-color);\n}\n\n.option-text {\n flex: 1;\n font-size: 14px;\n line-height: 1.6;\n color: var(--text-primary);\n word-break: break-word;\n white-space: break-spaces;\n}\n\n.option-checkbox,\n.option-radio {\n flex-shrink: 0;\n}\n\n/* 题目解析 */\n.question-analysis {\n margin: 16px;\n padding: 16px;\n background: var(--bg-secondary);\n border-radius: var(--border-radius-md);\n border-left: 4px solid var(--info-color);\n animation: analysisAppear 0.5s ease-out;\n}\n\n@keyframes analysisAppear {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.analysis-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 12px;\n font-weight: 600;\n color: var(--info-color);\n font-size: 14px;\n}\n\n.analysis-content {\n font-size: 14px;\n line-height: 1.6;\n color: var(--text-secondary);\n word-break: break-word;\n white-space: break-spaces;\n}\n\n/* 底部按钮区域 */\n.ac-buttons {\n position: fixed;\n bottom: 0;\n left: 0;\n right: 0;\n padding: 16px;\n background: var(--bg-card);\n box-shadow: 0 -4px 20px rgba(0, 196, 167, 0.15);\n border-top: 1px solid var(--border-light);\n z-index: 100;\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n}\n\n.button-row {\n display: flex;\n gap: 12px;\n margin-bottom: 8px;\n}\n\n.button-row:last-child {\n margin-bottom: 0;\n}\n\n.nav-button {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n font-weight: 500;\n box-shadow: var(--shadow-sm);\n}\n\n.action-button,\n.submit-button {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n font-weight: 600;\n font-size: 16px;\n height: 48px;\n box-shadow: var(--shadow-md);\n}\n\n.submit-button {\n background: var(--primary-gradient) !important;\n border: none;\n position: relative;\n overflow: hidden;\n}\n\n.submit-button::before {\n content: '';\n position: absolute;\n top: 0;\n left: -100%;\n width: 100%;\n height: 100%;\n background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);\n transition: left 0.6s;\n}\n\n.submit-button:active::before {\n left: 100%;\n}\n\n/* 全局美化 */\n.van-cell {\n border-radius: var(--border-radius-sm) !important;\n margin-bottom: 4px;\n border: 1px solid var(--border-light);\n}\n\n.van-checkbox,\n.van-radio {\n margin-right: 0 !important;\n}\n\n.van-checkbox__icon--checked,\n.van-radio__icon--checked {\n background-color: var(--primary-color) !important;\n border-color: var(--primary-color) !important;\n}\n\n/* 过渡动画 */\n.fade-enter-active, .fade-leave-active {\n transition: all var(--transition-normal);\n}\n\n.fade-enter, .fade-leave-to {\n opacity: 0;\n transform: scale(0.9);\n}\n\n/* 题目切换动画 - 向左滑动 (下一题) */\n.question-slide-left-enter-active,\n.question-slide-left-leave-active {\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.question-slide-left-enter {\n opacity: 0;\n transform: translateX(100px);\n}\n\n.question-slide-left-leave-to {\n opacity: 0;\n transform: translateX(-100px);\n}\n\n/* 题目切换动画 - 向右滑动 (上一题) */\n.question-slide-right-enter-active,\n.question-slide-right-leave-active {\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.question-slide-right-enter {\n opacity: 0;\n transform: translateX(-100px);\n}\n\n.question-slide-right-leave-to {\n opacity: 0;\n transform: translateX(100px);\n}\n\n.question-item {\n padding: 0 4px;\n margin: 10px 0 50px 0;\n}\n\n/* 图片预览弹窗样式 */\n.image-preview-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.95);\n z-index: 2000;\n animation: fadeIn 0.3s ease-out;\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n/* 顶部控制栏 */\n.image-preview-controls-bar {\n position: fixed;\n top: calc(20px + var(--immersed-height, 0px));\n left: 50%;\n transform: translateX(-50%);\n display: flex;\n align-items: center;\n gap: 16px;\n background: rgba(255, 255, 255, 0.95);\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n padding: 12px 20px;\n border-radius: 50px;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);\n z-index: 2001;\n animation: slideDown 0.3s ease-out;\n}\n\n@keyframes slideDown {\n from {\n opacity: 0;\n transform: translateX(-50%) translateY(-20px);\n }\n to {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n }\n}\n\n.control-icon {\n font-size: 20px;\n color: #333;\n cursor: pointer;\n padding: 8px;\n border-radius: 50%;\n transition: all var(--transition-fast);\n background: transparent;\n border: none;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n}\n\n.control-icon:hover {\n background: rgba(0, 0, 0, 0.1);\n transform: scale(1.1);\n}\n\n.control-icon:active {\n transform: scale(0.95);\n}\n\n.close-icon {\n color: #ff4757;\n font-size: 22px;\n}\n\n.close-icon:hover {\n background: rgba(255, 71, 87, 0.1);\n}\n\n.zoom-text {\n font-size: 14px;\n color: #333;\n font-weight: 600;\n min-width: 50px;\n text-align: center;\n background: rgba(0, 0, 0, 0.05);\n padding: 6px 12px;\n border-radius: 20px;\n border: none;\n}\n\n/* 图片容器 - 全屏无边框 */\n.image-preview-content {\n position: fixed;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n display: flex;\n justify-content: center;\n align-items: center;\n overflow: hidden;\n touch-action: none; /* 禁用默认触摸行为 */\n user-select: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n}\n\n.preview-image {\n max-width: none; /* 移除宽度限制 */\n max-height: none; /* 移除高度限制 */\n width: auto;\n height: auto;\n object-fit: contain;\n border-radius: 0; /* 无边框 */\n box-shadow: none; /* 无阴影 */\n}\n\n/* 当图片被缩放时的拖拽光标 */\n.image-preview-content.dragging {\n cursor: grabbing !important;\n}\n\n.image-preview-content.dragging .preview-image {\n cursor: grabbing !important;\n}\n\n/* 图片预览拖拽优化 */\n.image-preview-content {\n /* 防止图片在拖拽时被选中 */\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n \n /* 防止长按时出现上下文菜单 */\n -webkit-touch-callout: none;\n -webkit-tap-highlight-color: transparent;\n}\n\n.preview-image {\n /* 防止图片拖拽时出现虚影 */\n -webkit-user-drag: none;\n -khtml-user-drag: none;\n -moz-user-drag: none;\n -o-user-drag: none;\n \n /* 提高拖拽性能 */\n will-change: transform;\n backface-visibility: hidden;\n -webkit-backface-visibility: hidden;\n}\n\n/* 为图片添加点击提示样式 */\n.question-title img,\n.option-text img,\n.analysis-content img {\n cursor: pointer;\n border-radius: var(--border-radius-sm);\n transition: all var(--transition-fast);\n border: 2px solid transparent;\n}\n\n.question-title img:hover,\n.option-text img:hover,\n.analysis-content img:hover {\n border-color: var(--primary-color);\n box-shadow: 0 2px 8px rgba(0, 196, 167, 0.3);\n transform: scale(1.02);\n}\n\n.question-title img:active,\n.option-text img:active,\n.analysis-content img:active {\n transform: scale(0.98);\n}\n\n/* 响应式设计 */\n@media (max-width: 768px) {\n .question-container {\n padding-left: 8px;\n padding-right: 8px;\n }\n \n .question-item {\n padding: 0 4px;\n }\n \n .exam-circle {\n height: 2rem;\n width: 2rem;\n line-height: 1.6rem;\n font-size: 12px;\n }\n \n .option-content {\n padding: 12px;\n }\n \n .option-label {\n width: 28px;\n height: 28px;\n font-size: 12px;\n }\n \n /* 移动端控制栏优化 */\n .image-preview-controls-bar {\n top: calc(10px + var(--immersed-height, 0px));\n padding: 8px 16px;\n gap: 12px;\n border-radius: 40px;\n }\n \n .control-icon {\n font-size: 18px;\n padding: 6px;\n width: 36px;\n height: 36px;\n }\n \n .close-icon {\n font-size: 20px;\n }\n \n .zoom-text {\n font-size: 12px;\n min-width: 45px;\n padding: 4px 8px;\n border-radius: 18px;\n }\n \n /* 移动端触摸优化 */\n .image-preview-content {\n -webkit-overflow-scrolling: touch;\n }\n \n /* 防止移动端双击缩放页面 */\n .image-preview-overlay {\n touch-action: manipulation;\n }\n}\n</style>\n\n\n// WEBPACK FOOTER //\n// src/components/exam/DoExamPage.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{directives:[{name:\"finger\",rawName:\"v-finger:swipe\",value:(_vm.swipe),expression:\"swipe\",arg:\"swipe\"}],ref:\"root\",staticClass:\"exam-root\",on:{\"touchstart\":_vm.onTouchStart}},[_c('van-nav-bar',{staticClass:\"exam-nav-bar\",attrs:{\"title\":_vm.examInfo.title,\"fixed\":\"\",\"left-arrow\":\"\",\"right-text\":\"目录\"},on:{\"click-left\":_vm.handleBack,\"click-right\":function($event){_vm.showAcButtons = !_vm.showAcButtons}}}),_vm._v(\" \"),_c('transition',{attrs:{\"name\":\"fade\"}},[_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.showAcButtons),expression:\"showAcButtons\"}],staticClass:\"ac-qn-backdrop\",on:{\"click\":function($event){$event.stopPropagation();_vm.showAcButtons = false}}},[_c('div',{staticClass:\"exam-p-around-small ac-qn theme-card\",on:{\"click\":function($event){$event.stopPropagation();}}},[_c('div',{staticClass:\"qn-header\"},[_c('h3',[_vm._v(\"题目导航\")]),_vm._v(\" \"),_c('span',{staticClass:\"qn-progress\"},[_vm._v(_vm._s(_vm.questionNum + 1)+\" / \"+_vm._s(_vm.totalNum))])]),_vm._v(\" \"),_c('van-row',{staticClass:\"question-nav-grid\"},_vm._l((_vm.questionsInfo),function(question,i){return _c('van-col',{key:i,attrs:{\"span\":\"4\"}},[_c('div',{staticClass:\"exam-circle exam-done theme-button\",class:_vm.getQuestionNavClass(question, i),on:{\"click\":function($event){return _vm.turnTo(i)}}},[_vm._v(\"\\n \"+_vm._s(i + 1)+\"\\n \")])])}),1)],1)])]),_vm._v(\" \"),_c('div',{staticClass:\"question-container\"},[_c('transition',{attrs:{\"name\":_vm.transitionName,\"mode\":\"out-in\"}},[(!_vm.questionsInfo[_vm.questionNum])?_c('div',{staticClass:\"loading-item\"},[_c('div',{staticClass:\"question-card theme-card\"},[_c('div',{staticClass:\"question-header\"},[_c('div',{staticClass:\"question-title\"},[_vm._v(\"加载中...\")]),_vm._v(\" \"),_c('div',{staticClass:\"question-desc\"},[_vm._v(\"正在加载题目数据\")])])])]):_c('div',{key:_vm.questionNum,staticClass:\"question-item\"},[_c('div',{staticClass:\"question-card theme-card\"},[_c('div',{staticClass:\"question-header\",on:{\"click\":_vm.handleImageClick}},[_vm._l((_vm.getQuestionTitle(_vm.questionsInfo[_vm.questionNum])),function(t){return _c('div',{staticClass:\"question-title\",domProps:{\"innerHTML\":_vm._s(t)}})}),_vm._v(\" \"),_c('div',{staticClass:\"question-desc\"},[_vm._v(_vm._s(_vm.getQuestionDesc(_vm.questionsInfo[_vm.questionNum])))])],2),_vm._v(\" \"),(_vm.questionsInfo[_vm.questionNum].isMulti)?_c('div',{staticClass:\"options-container\"},[_c('van-checkbox-group',{on:{\"click\":function($event){$event.stopPropagation();}},model:{value:(_vm.questionsInfo[_vm.questionNum].answer.multi.apis),callback:function ($$v) {_vm.$set(_vm.questionsInfo[_vm.questionNum].answer.multi, \"apis\", $$v)},expression:\"questionsInfo[questionNum].answer.multi.apis\"}},[_c('div',{staticClass:\"option-list\"},_vm._l((_vm.questionsInfo[_vm.questionNum].answerOptions),function(option,oi){return _c('div',{key:oi,staticClass:\"option-item theme-card\",class:{'option-selected': _vm.questionsInfo[_vm.questionNum].answer.multi.apis.includes(option.api), 'option-correct': option.isRight&&(_vm.isShowResult||(_vm.questionsInfo[_vm.questionNum].answer.isChecked&&_vm.isPractice)), 'option-incorrect': !option.isRight&&(_vm.isShowResult||(!option.isRight&&_vm.questionsInfo[_vm.questionNum].answer.isAnswered&&_vm.isPractice)) && _vm.questionsInfo[_vm.questionNum].answer.multi.apis.includes(option.api)},on:{\"click\":function($event){return _vm.toggleAnswer(_vm.questionNum, option.api)}}},[_c('div',{staticClass:\"option-content\"},[_c('div',{staticClass:\"option-label\"},[_vm._v(_vm._s(_vm.letterIndex[oi]))]),_vm._v(\" \"),_c('div',{staticClass:\"option-text\",domProps:{\"innerHTML\":_vm._s(option.describe)},on:{\"click\":_vm.handleImageClick}}),_vm._v(\" \"),_c('van-checkbox',{staticClass:\"option-checkbox\",attrs:{\"name\":option.api,\"checked-color\":_vm.getOptionColor(_vm.questionsInfo[_vm.questionNum],option)}})],1)])}),0)])],1):_vm._e(),_vm._v(\" \"),(!_vm.questionsInfo[_vm.questionNum].isMulti)?_c('div',{staticClass:\"options-container\"},[_c('van-radio-group',{model:{value:(_vm.questionsInfo[_vm.questionNum].answer.single.api),callback:function ($$v) {_vm.$set(_vm.questionsInfo[_vm.questionNum].answer.single, \"api\", $$v)},expression:\"questionsInfo[questionNum].answer.single.api\"}},[_c('div',{staticClass:\"option-list\"},_vm._l((_vm.questionsInfo[_vm.questionNum].answerOptions),function(option,oi){return _c('div',{key:oi,staticClass:\"option-item theme-card\",class:{'option-selected': _vm.questionsInfo[_vm.questionNum].answer.single.api === option.api, 'option-correct': option.isRight&&(_vm.isShowResult||(_vm.questionsInfo[_vm.questionNum].answer.isChecked&&_vm.isPractice)), 'option-incorrect': !option.isRight&&(_vm.isShowResult||(!option.isRight&&_vm.questionsInfo[_vm.questionNum].answer.isAnswered&&_vm.isPractice)) && _vm.questionsInfo[_vm.questionNum].answer.single.api === option.api},on:{\"click\":function($event){return _vm.setAnswer(_vm.questionNum, [option.api])}}},[_c('div',{staticClass:\"option-content\"},[_c('div',{staticClass:\"option-label\"},[_vm._v(_vm._s(_vm.letterIndex[oi]))]),_vm._v(\" \"),_c('div',{staticClass:\"option-text\",domProps:{\"innerHTML\":_vm._s(option.describe)},on:{\"click\":_vm.handleImageClick}}),_vm._v(\" \"),_c('van-radio',{staticClass:\"option-radio\",attrs:{\"name\":option.api,\"checked-color\":_vm.getOptionColor(_vm.questionsInfo[_vm.questionNum],option)}})],1)])}),0)])],1):_vm._e(),_vm._v(\" \"),(_vm.isShowResult || !(_vm.isPractice&&!_vm.questionsInfo[_vm.questionNum].answer.isChecked))?_c('div',{staticClass:\"question-analysis\"},[_c('div',{staticClass:\"analysis-header\"},[_c('van-icon',{attrs:{\"name\":\"info-o\"}}),_vm._v(\" \"),_c('span',[_vm._v(\"题目解析\")])],1),_vm._v(\" \"),_c('div',{staticClass:\"analysis-content\",domProps:{\"innerHTML\":_vm._s(_vm.questionsInfo[_vm.questionNum].analysis || '暂无解析')},on:{\"click\":_vm.handleImageClick}})]):_vm._e()])])])],1),_vm._v(\" \"),(_vm.questionsInfo[_vm.questionNum])?_c('div',{staticClass:\"ac-buttons theme-card\"},[_c('div',{staticClass:\"button-row\"},[(_vm.questionNum>0)?_c('van-button',{staticClass:\"nav-button theme-button\",attrs:{\"round\":\"\"},on:{\"click\":function($event){return _vm.turnTo(_vm.questionNum-1)}}},[_c('van-icon',{attrs:{\"name\":\"arrow-left\"}}),_vm._v(\"\\n 上一题\\n \")],1):_vm._e(),_vm._v(\" \"),(_vm.questionNum<_vm.totalNum-1)?_c('van-button',{staticClass:\"nav-button theme-button\",attrs:{\"type\":\"info\",\"round\":\"\"},on:{\"click\":function($event){return _vm.turnTo(_vm.questionNum+1)}}},[_vm._v(\"\\n 下一题\\n \"),_c('van-icon',{attrs:{\"name\":\"arrow\"}})],1):_vm._e()],1),_vm._v(\" \"),_c('div',{staticClass:\"button-row\"},[(_vm.isPractice&&!_vm.questionsInfo[_vm.questionNum].answer.isChecked)?_c('van-button',{staticClass:\"action-button theme-button\",attrs:{\"type\":\"warning\",\"round\":\"\",\"block\":\"\"},on:{\"click\":function($event){return _vm.checkResult(_vm.questionNum)}}},[_c('van-icon',{attrs:{\"name\":\"eye-o\"}}),_vm._v(\"\\n 检查答案\\n \")],1):_vm._e(),_vm._v(\" \"),(!_vm.hasSubmit)?_c('van-button',{staticClass:\"submit-button theme-button pulse\",attrs:{\"type\":\"primary\",\"round\":\"\",\"block\":\"\"},on:{\"click\":_vm.confirmSubmit}},[_c('van-icon',{attrs:{\"name\":\"success\"}}),_vm._v(\"\\n 提交答案\\n \")],1):_vm._e()],1)]):_vm._e(),_vm._v(\" \"),(_vm.showImagePreview)?_c('div',{staticClass:\"image-preview-overlay\",on:{\"click\":_vm.handleBackgroundClick}},[_c('div',{staticClass:\"image-preview-controls-bar\",on:{\"click\":function($event){$event.stopPropagation();}}},[_c('van-icon',{staticClass:\"control-icon\",attrs:{\"name\":\"minus\"},on:{\"click\":_vm.zoomOut}}),_vm._v(\" \"),_c('span',{staticClass:\"zoom-text\"},[_vm._v(_vm._s(Math.round(_vm.zoomLevel * 100))+\"%\")]),_vm._v(\" \"),_c('van-icon',{staticClass:\"control-icon\",attrs:{\"name\":\"plus\"},on:{\"click\":_vm.zoomIn}}),_vm._v(\" \"),_c('van-icon',{staticClass:\"control-icon\",attrs:{\"name\":\"replay\",\"title\":\"重置\"},on:{\"click\":_vm.resetZoom}}),_vm._v(\" \"),_c('van-icon',{staticClass:\"control-icon close-icon\",attrs:{\"name\":\"cross\"},on:{\"click\":_vm.closeImagePreview}})],1),_vm._v(\" \"),_c('div',{ref:\"imageContainer\",staticClass:\"image-preview-content\",on:{\"click\":_vm.handleContainerClick,\"dblclick\":_vm.handleDoubleClick,\"mousedown\":_vm.handleMouseDown,\"mousemove\":_vm.handleMouseMove,\"mouseup\":_vm.handleMouseUp,\"mouseleave\":_vm.handleMouseLeave,\"touchstart\":_vm.handleImageTouchStart,\"touchmove\":_vm.handleImageTouchMove,\"touchend\":_vm.handleImageTouchEnd,\"wheel\":_vm.handleWheel}},[_c('img',{ref:\"previewImage\",staticClass:\"preview-image\",style:(_vm.imageStyle),attrs:{\"src\":_vm.previewImageSrc,\"alt\":_vm.previewImageAlt},on:{\"load\":_vm.onImageLoad,\"dragstart\":function($event){$event.preventDefault();},\"dblclick\":function($event){$event.stopPropagation();return _vm.handlePreviewImageDoubleClick($event)}}})])]):_vm._e()],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-6760d575\",\"hasScoped\":true,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/exam/DoExamPage.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-6760d575\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./DoExamPage.vue\")\n}\nvar normalizeComponent = require(\"!../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./DoExamPage.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./DoExamPage.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-6760d575\\\",\\\"hasScoped\\\":true,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./DoExamPage.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-6760d575\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/exam/DoExamPage.vue\n// module id = null\n// module chunks = ","<template>\n <div class=\"category-page\">\n <van-nav-bar\n :title=\"categoryTitle\"\n fixed\n left-arrow\n @click-left=\"handleBack\"\n class=\"category-nav-bar\"\n ></van-nav-bar>\n \n <div class=\"category-container\">\n <div class=\"category-header\">\n <h2 class=\"gradient-text\">{{ categoryName }}</h2>\n <p class=\"category-desc\">共 {{ examList.length }} 个题库</p>\n </div>\n\n <transition name=\"slide-up\">\n <van-grid :column-num=\"1\" :gutter=\"12\" class=\"exam-grid\" v-if=\"examList.length > 0\">\n <van-grid-item\n v-for=\"(exam, index) in examList\"\n :key=\"exam.hashCode\"\n clickable\n @click=\"showOption(exam)\"\n class=\"exam-item-card\"\n :style=\"{ 'animation-delay': (index * 0.05) + 's' }\">\n <div class=\"exam-card-content\">\n <div class=\"exam-icon\">\n <van-icon name=\"notes-o\" size=\"24\" :color=\"exam.hasHistoryError ? 'var(--warning-color)' : 'var(--primary-color)'\" />\n </div>\n <div class=\"exam-info\">\n <h3 class=\"exam-title\">{{ exam.title }}</h3>\n <p class=\"exam-meta\">题目数量: {{ exam.questions ? exam.questions.length : 0 }}</p>\n <div class=\"exam-status\" v-if=\"exam.hasHistoryError\">\n <van-tag type=\"warning\" size=\"mini\">有错题</van-tag>\n </div>\n </div>\n <div class=\"exam-arrow\">\n <van-icon name=\"arrow\" />\n </div>\n </div>\n </van-grid-item>\n </van-grid>\n \n <div v-else class=\"empty-state\">\n <div class=\"empty-icon\">\n <van-icon name=\"warning-o\" size=\"48\" color=\"var(--text-light)\" />\n </div>\n <p class=\"empty-text\">该分类下暂无题库</p>\n <van-button type=\"primary\" round @click=\"$router.push('/')\">\n 返回首页\n </van-button>\n </div>\n </transition>\n </div>\n\n <!-- 答题选项弹窗 -->\n <van-popup v-model=\"isShowOption\" position=\"bottom\" round class=\"option-popup\" @click-overlay=\"isShowOption = false\">\n <div class=\"exam-options\">\n <div class=\"popup-header\">\n <div class=\"header-info\">\n <h3>选择答题模式</h3>\n <p class=\"exam-title\">{{ currentExam.title }}</p>\n </div>\n <van-icon name=\"cross\" @click=\"isShowOption = false\" class=\"close-icon\" />\n </div>\n <div class=\"option-grid\">\n <div class=\"option-item\" \n :class=\"{ disabled: getUndoneCounts() === 0 }\"\n @click=\"getUndoneCounts() > 0 && doExam(optionInfo.hashCode, false, true)\">\n <div class=\"option-icon new\">\n <van-icon name=\"edit\" />\n </div>\n <div class=\"option-info\">\n <span class=\"option-title\">未做题</span>\n <span class=\"option-count\">{{ getUndoneCounts() }}题</span>\n </div>\n </div>\n <div class=\"option-item primary\" \n :class=\"{ disabled: getTotalCounts() === 0 }\"\n @click=\"getTotalCounts() > 0 && doExam(optionInfo.hashCode)\">\n <div class=\"option-icon\">\n <van-icon name=\"replay\" />\n </div>\n <div class=\"option-info\">\n <span class=\"option-title\">重新测试</span>\n <span class=\"option-count\">{{ getTotalCounts() }}题</span>\n </div>\n </div>\n <div class=\"option-item warning\" \n :class=\"{ disabled: getErrorCounts() === 0 }\"\n @click=\"getErrorCounts() > 0 && doExam(optionInfo.hashCode, true)\">\n <div class=\"option-icon\">\n <van-icon name=\"question-o\" />\n </div>\n <div class=\"option-info\">\n <span class=\"option-title\">复习错题</span>\n <span class=\"option-count\">{{ getErrorCounts() }}题</span>\n </div>\n </div>\n <div class=\"option-item danger\" @click=\"clearHistory(optionInfo.hashCode)\">\n <div class=\"option-icon\">\n <van-icon name=\"delete-o\" />\n </div>\n <div class=\"option-info\">\n <span class=\"option-title\">清空记录</span>\n <span class=\"option-count\">重置</span>\n </div>\n </div>\n </div>\n </div>\n </van-popup>\n </div>\n</template>\n\n<script>\nimport Vue from 'vue';\nimport {NavBar} from 'vant';\nimport {Grid, GridItem} from 'vant';\nimport {Popup} from 'vant';\nimport {Button} from 'vant';\nimport {Dialog} from 'vant';\nimport {Tag} from 'vant';\nimport {Icon} from 'vant';\nimport {questionDao, historyRecordDao, bankDao} from '../dao';\n\nVue.use(NavBar);\nVue.use(Grid).use(GridItem);\nVue.use(Popup);\nVue.use(Button);\nVue.use(Dialog);\nVue.use(Tag);\nVue.use(Icon);\n\nexport default {\n name: \"CategoryPage\",\n data() {\n return {\n examList: [],\n isShowOption: false,\n optionInfo: {\n hashCode: ''\n },\n currentExam: {},\n historyRecords: []\n }\n },\n computed: {\n categoryName() {\n return this.$route.params.category || 'default';\n },\n categoryTitle() {\n return this.categoryName === 'default' ? '默认分类' : this.categoryName;\n }\n },\n methods: {\n // 处理返回操作\n handleBack() {\n // 使用全局返回管理器\n if (window.GlobalBackManager) {\n window.GlobalBackManager.goBack();\n } else {\n // 降级处理:如果全局返回管理器不存在,使用原有逻辑\n this.$router.back();\n }\n },\n async loadCategoryExams() {\n const category = this.categoryName;\n \n try {\n const banks = await bankDao.query('hashCode').notEqual('').toArray();\n \n // 过滤出当前分类的题库\n const filteredBanks = banks.filter(bank => {\n const bankCategory = bank.category || 'default';\n return bankCategory === category;\n });\n \n // 排序\n filteredBanks.sort((a, b) => {\n return a.title.split('').reduce((a, b) => a + b.charCodeAt(0), 0) - \n b.title.split('').reduce((a, b) => a + b.charCodeAt(0), 0);\n });\n \n // 获取历史记录\n const promises = filteredBanks.map(bank => {\n return historyRecordDao.query('relatedQuestion').anyOf(bank.questions).sortBy('createDate')\n .then(records => {\n const errorMap = Object.fromEntries(records.map(record => [record.relatedQuestion, {\n ...record, times: record.errorTimes\n }]));\n const hasHistoryError = !!Object.values(errorMap).find(q => q.times > 0);\n return {...bank, errorMap, hasHistoryError}\n });\n });\n \n this.examList = await Promise.all(promises);\n } catch (error) {\n console.error('加载分类题库失败:', error);\n this.examList = [];\n }\n },\n \n async showOption(exam) {\n if (exam.hasHistoryError) {\n this.optionInfo.hashCode = exam.hashCode;\n this.currentExam = exam;\n \n // 加载历史记录用于计算题目数量\n try {\n const records = await historyRecordDao.queryMany(exam.questions || []);\n this.historyRecords = records;\n } catch (error) {\n console.error('加载历史记录失败:', error);\n this.historyRecords = [];\n }\n \n this.isShowOption = true;\n } else {\n this.doExam(exam.hashCode);\n }\n },\n \n // 获取总题目数量\n getTotalCounts() {\n return this.currentExam.questions ? this.currentExam.questions.length : 0;\n },\n \n // 获取错题数量\n getErrorCounts() {\n if (!this.currentExam.questions || !this.historyRecords.length) return 0;\n return this.historyRecords.filter(record => record.errorTimes > 0).length;\n },\n \n // 获取未做题数量\n getUndoneCounts() {\n if (!this.currentExam.questions || !this.historyRecords.length) {\n return this.getTotalCounts();\n }\n const doneQuestions = this.historyRecords.filter(record => \n (record.errorTimes || 0) + (record.rightTimes || 0) > 0\n ).length;\n return this.getTotalCounts() - doneQuestions;\n },\n \n doExam(hashCode, isReviewError = false, neverDo = false) {\n this.isShowOption = false; // 关闭弹窗\n bankDao.query('hashCode').equals(hashCode).first()\n .then(exam => {\n return Promise.all([exam, ...exam.questions.map(q => questionDao.query('hashCode').equals(q).first())])\n })\n .then(([exam, ...questions]) => {\n exam.questions = questions;\n if (!exam) {\n Dialog.alert({message: '该题库已失效!'});\n return;\n }\n this.$router.push({\n name: 'DoExamPage',\n params: {\n examConfig: exam,\n isReviewError,\n neverDo\n }\n })\n });\n },\n \n clearHistory(hashCode) {\n this.isShowOption = false; // 先关闭弹窗\n bankDao.queryByHashCode(hashCode)\n .then(bankDao => {\n bankDao = bankDao || {};\n return historyRecordDao.delete(bankDao.questions || []);\n }).then(() => {\n console.log('remove the history.');\n this.loadCategoryExams(); // 重新加载数据\n }\n );\n }\n },\n \n async mounted() {\n await this.loadCategoryExams();\n },\n \n // 监听路由参数变化\n watch: {\n '$route.params.category': {\n handler() {\n this.loadCategoryExams();\n },\n immediate: false\n }\n }\n}\n</script>\n\n<style scoped>\n.category-page {\n background: var(--bg-primary);\n min-height: 100vh;\n}\n\n.category-nav-bar {\n background: var(--primary-gradient) !important;\n box-shadow: var(--shadow-md);\n}\n\n.category-container {\n padding: 66px 16px 20px 16px; /* 46px (导航栏) + 20px (顶部间距) */\n animation: fadeIn 0.6s ease-out;\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.category-header {\n text-align: center;\n margin-bottom: 24px;\n padding: 20px;\n background: var(--bg-card);\n border-radius: var(--border-radius-lg);\n box-shadow: var(--shadow-sm);\n}\n\n.category-header h2 {\n margin: 0 0 8px 0;\n font-size: 24px;\n font-weight: 600;\n}\n\n.category-desc {\n margin: 0;\n color: var(--text-secondary);\n font-size: 14px;\n}\n\n/* 考试列表样式 */\n.exam-grid .van-grid-item {\n padding: 0 !important;\n overflow: hidden; /* 防止内容溢出网格项 */\n}\n\n.exam-grid .van-grid-item__content {\n padding: 0 !important;\n overflow: hidden; /* 防止内容溢出 */\n}\n\n.exam-item-card {\n animation: examItemAppear 0.5s ease-out both;\n width: 100%;\n overflow: hidden; /* 防止卡片内容溢出 */\n}\n\n@keyframes examItemAppear {\n from {\n opacity: 0;\n transform: translateX(-20px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n}\n\n.exam-card-content {\n display: flex;\n align-items: center;\n padding: 0 16px;\n width: 100%;\n min-width: 0; /* 确保flex子元素可以收缩 */\n}\n\n.exam-icon {\n margin-right: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n background: var(--bg-secondary);\n border-radius: var(--border-radius-sm);\n}\n\n.exam-info {\n flex: 1;\n min-width: 0; /* 确保flex子元素可以收缩到0宽度 */\n overflow: hidden; /* 防止内容溢出 */\n}\n\n.exam-title {\n margin: 0 0 4px 0;\n font-size: 15px; /* 稍微减小字体 */\n font-weight: 600;\n color: var(--text-primary);\n line-height: 1.4;\n /* 允许最多2行显示,超出则省略 */\n display: -webkit-box;\n -webkit-line-clamp: 2;\n line-clamp: 2; /* 标准属性 */\n -webkit-box-orient: vertical;\n overflow: hidden;\n word-break: break-word; /* 允许在任意位置换行 */\n hyphens: auto; /* 自动断词 */\n}\n\n.exam-meta {\n margin: 0 0 4px 0;\n font-size: 12px;\n color: var(--text-secondary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.exam-status {\n margin-top: 4px;\n}\n\n.exam-arrow {\n color: var(--text-light);\n margin-left: 8px;\n}\n\n/* 空状态 */\n.empty-state {\n text-align: center;\n padding: 60px 20px;\n color: var(--text-secondary);\n}\n\n.empty-icon {\n margin-bottom: 16px;\n}\n\n.empty-text {\n margin: 0 0 24px 0;\n font-size: 16px;\n color: var(--text-secondary);\n}\n\n/* 弹窗样式 */\n.option-popup .van-popup {\n background: transparent;\n}\n\n.exam-options {\n width: 90vw;\n max-width: 380px;\n margin: 16px auto;\n padding: 20px;\n border-radius: var(--border-radius-lg);\n background: var(--bg-card);\n}\n\n.popup-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 16px;\n padding-bottom: 12px;\n border-bottom: 1px solid var(--border-light);\n}\n\n.header-info h3 {\n margin: 0 0 4px 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--text-primary);\n}\n\n.exam-title {\n margin: 0;\n font-size: 14px;\n color: var(--text-secondary);\n font-weight: normal;\n}\n\n.close-icon {\n font-size: 18px;\n color: var(--text-light);\n cursor: pointer;\n padding: 4px;\n border-radius: var(--border-radius-sm);\n transition: all var(--transition-fast);\n}\n\n.close-icon:active {\n background: var(--bg-secondary);\n color: var(--text-secondary);\n}\n\n.option-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 10px;\n}\n\n.option-item {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 16px 12px;\n border-radius: var(--border-radius-md);\n background: var(--bg-secondary);\n border: 2px solid transparent;\n cursor: pointer;\n transition: all var(--transition-fast);\n text-align: center;\n min-height: 80px;\n justify-content: center;\n}\n\n.option-item:active {\n transform: scale(0.95);\n}\n\n.option-item.disabled {\n opacity: 0.5;\n cursor: not-allowed;\n pointer-events: none;\n}\n\n.option-item.disabled .option-icon {\n background: var(--text-light);\n}\n\n.option-item.disabled .option-title,\n.option-item.disabled .option-count {\n color: var(--text-light);\n}\n\n.option-item.primary {\n background: var(--bg-overlay);\n border-color: var(--primary-color);\n}\n\n.option-item.warning {\n background: rgba(255, 152, 0, 0.1);\n border-color: var(--warning-color);\n}\n\n.option-item.danger {\n background: rgba(244, 67, 54, 0.1);\n border-color: var(--error-color);\n}\n\n.option-item.new {\n background: rgba(76, 175, 80, 0.1);\n border-color: var(--success-color);\n}\n\n.option-icon {\n width: 32px;\n height: 32px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 8px;\n background: var(--primary-color);\n color: var(--text-white);\n}\n\n.option-item.warning .option-icon {\n background: var(--warning-color);\n}\n\n.option-item.danger .option-icon {\n background: var(--error-color);\n}\n\n.option-item.new .option-icon {\n background: var(--success-color);\n}\n\n.option-icon .van-icon {\n font-size: 16px;\n}\n\n.option-info {\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n\n.option-title {\n font-weight: 600;\n font-size: 14px;\n color: var(--text-primary);\n margin-bottom: 2px;\n line-height: 1.2;\n}\n\n.option-count {\n font-size: 12px;\n color: var(--text-secondary);\n font-weight: 500;\n}\n\n/* 移动端优化 */\n@media (max-width: 480px) {\n .exam-options {\n width: 95vw;\n margin: 12px auto;\n padding: 16px;\n }\n \n .popup-header {\n margin-bottom: 12px;\n padding-bottom: 10px;\n }\n \n .header-info h3 {\n font-size: 16px;\n }\n \n .exam-title {\n font-size: 13px;\n }\n \n .option-grid {\n gap: 8px;\n }\n \n .option-item {\n padding: 12px 8px;\n min-height: 70px;\n }\n \n .option-icon {\n width: 28px;\n height: 28px;\n margin-bottom: 6px;\n }\n \n .option-icon .van-icon {\n font-size: 14px;\n }\n \n .option-title {\n font-size: 13px;\n }\n \n .option-count {\n font-size: 11px;\n }\n}\n\n/* 过渡动画 */\n.slide-up-enter-active, .slide-up-leave-active {\n transition: all var(--transition-normal);\n}\n\n.slide-up-enter, .slide-up-leave-to {\n opacity: 0;\n transform: translateY(30px);\n}\n</style>\n\n\n\n// WEBPACK FOOTER //\n// src/components/CategoryPage.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"category-page\"},[_c('van-nav-bar',{staticClass:\"category-nav-bar\",attrs:{\"title\":_vm.categoryTitle,\"fixed\":\"\",\"left-arrow\":\"\"},on:{\"click-left\":_vm.handleBack}}),_vm._v(\" \"),_c('div',{staticClass:\"category-container\"},[_c('div',{staticClass:\"category-header\"},[_c('h2',{staticClass:\"gradient-text\"},[_vm._v(_vm._s(_vm.categoryName))]),_vm._v(\" \"),_c('p',{staticClass:\"category-desc\"},[_vm._v(\"共 \"+_vm._s(_vm.examList.length)+\" 个题库\")])]),_vm._v(\" \"),_c('transition',{attrs:{\"name\":\"slide-up\"}},[(_vm.examList.length > 0)?_c('van-grid',{staticClass:\"exam-grid\",attrs:{\"column-num\":1,\"gutter\":12}},_vm._l((_vm.examList),function(exam,index){return _c('van-grid-item',{key:exam.hashCode,staticClass:\"exam-item-card\",style:({ 'animation-delay': (index * 0.05) + 's' }),attrs:{\"clickable\":\"\"},on:{\"click\":function($event){return _vm.showOption(exam)}}},[_c('div',{staticClass:\"exam-card-content\"},[_c('div',{staticClass:\"exam-icon\"},[_c('van-icon',{attrs:{\"name\":\"notes-o\",\"size\":\"24\",\"color\":exam.hasHistoryError ? 'var(--warning-color)' : 'var(--primary-color)'}})],1),_vm._v(\" \"),_c('div',{staticClass:\"exam-info\"},[_c('h3',{staticClass:\"exam-title\"},[_vm._v(_vm._s(exam.title))]),_vm._v(\" \"),_c('p',{staticClass:\"exam-meta\"},[_vm._v(\"题目数量: \"+_vm._s(exam.questions ? exam.questions.length : 0))]),_vm._v(\" \"),(exam.hasHistoryError)?_c('div',{staticClass:\"exam-status\"},[_c('van-tag',{attrs:{\"type\":\"warning\",\"size\":\"mini\"}},[_vm._v(\"有错题\")])],1):_vm._e()]),_vm._v(\" \"),_c('div',{staticClass:\"exam-arrow\"},[_c('van-icon',{attrs:{\"name\":\"arrow\"}})],1)])])}),1):_c('div',{staticClass:\"empty-state\"},[_c('div',{staticClass:\"empty-icon\"},[_c('van-icon',{attrs:{\"name\":\"warning-o\",\"size\":\"48\",\"color\":\"var(--text-light)\"}})],1),_vm._v(\" \"),_c('p',{staticClass:\"empty-text\"},[_vm._v(\"该分类下暂无题库\")]),_vm._v(\" \"),_c('van-button',{attrs:{\"type\":\"primary\",\"round\":\"\"},on:{\"click\":function($event){return _vm.$router.push('/')}}},[_vm._v(\"\\n 返回首页\\n \")])],1)],1)],1),_vm._v(\" \"),_c('van-popup',{staticClass:\"option-popup\",attrs:{\"position\":\"bottom\",\"round\":\"\"},on:{\"click-overlay\":function($event){_vm.isShowOption = false}},model:{value:(_vm.isShowOption),callback:function ($$v) {_vm.isShowOption=$$v},expression:\"isShowOption\"}},[_c('div',{staticClass:\"exam-options\"},[_c('div',{staticClass:\"popup-header\"},[_c('div',{staticClass:\"header-info\"},[_c('h3',[_vm._v(\"选择答题模式\")]),_vm._v(\" \"),_c('p',{staticClass:\"exam-title\"},[_vm._v(_vm._s(_vm.currentExam.title))])]),_vm._v(\" \"),_c('van-icon',{staticClass:\"close-icon\",attrs:{\"name\":\"cross\"},on:{\"click\":function($event){_vm.isShowOption = false}}})],1),_vm._v(\" \"),_c('div',{staticClass:\"option-grid\"},[_c('div',{staticClass:\"option-item\",class:{ disabled: _vm.getUndoneCounts() === 0 },on:{\"click\":function($event){_vm.getUndoneCounts() > 0 && _vm.doExam(_vm.optionInfo.hashCode, false, true)}}},[_c('div',{staticClass:\"option-icon new\"},[_c('van-icon',{attrs:{\"name\":\"edit\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"option-info\"},[_c('span',{staticClass:\"option-title\"},[_vm._v(\"未做题\")]),_vm._v(\" \"),_c('span',{staticClass:\"option-count\"},[_vm._v(_vm._s(_vm.getUndoneCounts())+\"题\")])])]),_vm._v(\" \"),_c('div',{staticClass:\"option-item primary\",class:{ disabled: _vm.getTotalCounts() === 0 },on:{\"click\":function($event){_vm.getTotalCounts() > 0 && _vm.doExam(_vm.optionInfo.hashCode)}}},[_c('div',{staticClass:\"option-icon\"},[_c('van-icon',{attrs:{\"name\":\"replay\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"option-info\"},[_c('span',{staticClass:\"option-title\"},[_vm._v(\"重新测试\")]),_vm._v(\" \"),_c('span',{staticClass:\"option-count\"},[_vm._v(_vm._s(_vm.getTotalCounts())+\"题\")])])]),_vm._v(\" \"),_c('div',{staticClass:\"option-item warning\",class:{ disabled: _vm.getErrorCounts() === 0 },on:{\"click\":function($event){_vm.getErrorCounts() > 0 && _vm.doExam(_vm.optionInfo.hashCode, true)}}},[_c('div',{staticClass:\"option-icon\"},[_c('van-icon',{attrs:{\"name\":\"question-o\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"option-info\"},[_c('span',{staticClass:\"option-title\"},[_vm._v(\"复习错题\")]),_vm._v(\" \"),_c('span',{staticClass:\"option-count\"},[_vm._v(_vm._s(_vm.getErrorCounts())+\"题\")])])]),_vm._v(\" \"),_c('div',{staticClass:\"option-item danger\",on:{\"click\":function($event){return _vm.clearHistory(_vm.optionInfo.hashCode)}}},[_c('div',{staticClass:\"option-icon\"},[_c('van-icon',{attrs:{\"name\":\"delete-o\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"option-info\"},[_c('span',{staticClass:\"option-title\"},[_vm._v(\"清空记录\")]),_vm._v(\" \"),_c('span',{staticClass:\"option-count\"},[_vm._v(\"重置\")])])])])])])],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-c5d00de0\",\"hasScoped\":true,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/CategoryPage.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-c5d00de0\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./CategoryPage.vue\")\n}\nvar normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./CategoryPage.vue\"\nimport __vue_script__ from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./CategoryPage.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-c5d00de0\\\",\\\"hasScoped\\\":true,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./CategoryPage.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-c5d00de0\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/CategoryPage.vue\n// module id = null\n// module chunks = ","import Vue from 'vue'\nimport Router from 'vue-router'\nimport HomePage from \"@/components/HomePage\";\nimport DoExamPage from \"@/components/exam/DoExamPage\";\nimport CategoryPage from \"@/components/CategoryPage\";\n\nVue.use(Router);\n\nexport default new Router({\n routes: [\n {\n path: '/',\n name: 'HomePage',\n component: HomePage\n },\n {\n path: '/category/:category',\n name: 'CategoryPage',\n component: CategoryPage,\n props: true\n },\n {\n path: '/exam',\n name: 'DoExamPage',\n component: DoExamPage,\n props: true\n }\n ]\n})\n\n\n\n// WEBPACK FOOTER //\n// ./src/router/index.js","import Vue from 'vue'\nimport axios from 'axios'\nimport jsonp from 'jsonp'\nimport Utils from '../utils'\nimport AlloyFinger from 'alloyfinger'\nimport AlloyFingerPlugin from 'alloyfinger/vue/alloy_finger_vue'\nimport { Toast } from 'vant'\n\nVue.use(AlloyFingerPlugin,{\n AlloyFinger\n});\nVue.use(Toast);\n\nVue.prototype.$http = axios;\nVue.prototype.$http.jsonp = jsonp;\n\nif (!Object.fromEntries) {\n Object.fromEntries = Utils.fromEntries;\n}\n\nif (!Array.prototype.flat) {\n try {\n Object.defineProperty(Array.prototype, 'flat', {\n value: function (deep) {\n return Utils.flat(this, deep);\n },\n enumerable: false\n })\n } catch (e) {\n Array.prototype.flat = function (deep) {\n return Utils.flat(this, deep);\n }\n }\n}\n\n\n// WEBPACK FOOTER //\n// ./src/plugins/index.js","// The Vue build version to load with the `import` command\n// (runtime-only or standalone) has been set in webpack.base.conf with an alias.\nimport Vue from 'vue'\nimport App from './App'\nimport router from './router'\nimport './assets/common.css';\nimport './assets/theme.css';\nimport './plugins';\n\nVue.config.productionTip = false;\n\n/* eslint-disable no-new */\nnew Vue({\n el: '#app',\n router,\n components: { App },\n template: '<App/>'\n});\n\n\n\n// WEBPACK FOOTER //\n// ./src/main.js"],"sourceRoot":""}
|