// ==UserScript== // @name 江苏省执业药师协会学习助手 // @namespace https://www.wlxy.live/ // @version 1.0 // @description 江苏省执业药师协会(www.jslpa.cn):请在「我的课程」页使用;勾选课程、自动完成视频学时与考试;免费体验 1 门课,专业版不限。 // @author 柠檬真酸 // @icon https://huaweicloudobs.ahjxjy.cn/895789f9086469785b846d30c0ed95f9.png // @match *://www.jslpa.cn/* // @match *://jslpa.cn/* // @noframes // @antifeature payment 免费体验1门课含考试,升级专业版不限 // @antifeature membership 需会员授权 // @grant GM_setValue // @grant GM_getValue // @grant GM_xmlhttpRequest // @grant GM_openInTab // @grant unsafeWindow // @connect www.jslpa.cn // @connect jslpa.cn // @connect huaweicloudobs.ahjxjy.cn // @connect oa30.ahzsksw.cn // @connect ahzsksw.cn // @connect card.wlxy.live // @connect * // @require https://mirrors.sustech.edu.cn/cdnjs/ajax/libs/vue/3.4.27/vue.global.prod.min.js // @require https://mirrors.sustech.edu.cn/cdnjs/ajax/libs/vue-demi/0.14.6/index.iife.js // @require data:application/javascript,%3Bwindow.Vue%3DVue%3B // @require https://mirrors.sustech.edu.cn/cdnjs/ajax/libs/dompurify/3.1.6/purify.min.js // @require https://mirrors.sustech.edu.cn/cdnjs/ajax/libs/crypto-js/4.2.0/crypto-js.min.js // @require https://mirrors.sustech.edu.cn/cdnjs/ajax/libs/pinia/2.2.4/pinia.iife.prod.js // @run-at document-idle // @tag 江苏省执业药师协会 // @tag 继续教育 // @tag 学习辅助 // @license All Rights Reserved // ==/UserScript== (function(Vue,DOMPurify,Pinia,CryptoJS){ "use strict"; (()=>{var fe="1.0",qe="\u6C5F\u82CF\u7701\u6267\u4E1A\u836F\u5E08\u534F\u4F1A\u5B66\u4E60\u52A9\u624B",Q="__JSLPA_WATCH_BOO\ T__",k=location.hostname.replace(/^www\./,""),Ne=location.origin,Tt="/UserView/CourseList";function me(){let e=String(location. pathname||"").replace(/\/+$/,"")||"/";return/\/UserView\/CourseList$/i.test(e)}function Ue(){return`${location.origin}${Tt}`} var z={enabled:`jslpa_enabled_${k}`,pace:`jslpa_pace_${k}`,onlyIncomplete:`jslpa_only_incomplete_${k}`,autoExam:`jslpa_a\ uto_exam_${k}`,selected:`jslpa_selected_${k}`,panelPos:`jslpa_panel_pos_${k}`,collapsed:`jslpa_collapsed_${k}`,examBank:`\ jslpa_exam_bank_${k}`},P={efficiency:"efficiency",realtime:"realtime"},De=120,Oe=120,Be=16,xe=300,ge="https://huaweiclou\ dobs.ahjxjy.cn/895789f9086469785b846d30c0ed95f9.png",Fe="\u514D\u8D39\u53EF\u4F53\u9A8C 1 \u95E8\u8BFE\uFF08\u542B\u8003\u8BD5\uFF09\uFF1B\u4E13\u4E1A\u7248\u4E0D\u9650\u3002\u5B66\u65F6\u6309\u5E73\u53F0\u6B63\u5E38\u8282\u594F\u63A8\u8FDB\u3002", Ge="903117129",He="https://qun.qq.com/universal-share/share?ac=1&authKey=rxdL6YIJ0%2FxOEemjLqTGULvl5aAfJIVQcIvkvnwvmL%2F\ AmpFZnSafajYHgSXMUXvx&busi_data=eyJncm91cENvZGUiOiI5MDMxMTcxMjkiLCJ0b2tlbiI6IlB2dkFGSm5XRXBrSEhtQVFTUGQzdVNZakhNWDNMbW1k\ ODA2enpoMi9obDh4SWp0YzBDODNFaGtwRU44Z0hyU0siLCJ1aW4iOiIxMjU0MzE1MTQifQ%3D%3D&data=9oyJixSPcigCQW-saV5eXlcMwV9C6J36XySx-r\ DHwVwNlofvRmd2ze5sLwFtHTbYbG4nAWIUrI0qftC6aTX9xg&svctype=4&tempid=h5_group_info",Z="https://oa30.ahzsksw.cn",L="jslpa_cl\ oud_token_v1",ee="jslpa_cloud_lease_cache_v1",q="https://card.wlxy.live/details/2478B42E",M=1;var te=null;function be(e){te=e}var n={enabled:!1,stopFlag:!1,running:!1,pace:P.realtime,onlyIncomplete:!0,autoExam:!0,learningCourses:[],completedCourses:[], zyCourses:[],gxCourses:[],selectedIds:new Set,selectMode:"all",chapters:[],activeCourse:null,currentCourse:"",currentChapter:"", logs:[],task:"",panelHint:"",reportInterval:Oe,semester:new Date().getFullYear(),userName:"",examBank:{},queueVideoTotal:0, queueVideoDone:0,queueExamTotal:0,queueExamDone:0,studyModeHintTimer:null,cloudApiBase:Z,cloudToken:String(localStorage. getItem(L)||"").trim(),cloudLease:"",cloudLeaseExp:0,cloudTier:"unknown",cloudProExpireAt:0,freeCourseLimit:M,freeUsedCourses:0, proBuyUrl:q,remotePanelNotice:"",cloudReady:!1},A=null;function Ve(e){A=e}function B(e){return new Promise(t=>setTimeout(t,Math.max(0,e)))}function j(e){return String(e??"").replace(/&/g,"&"). replace(//g,">")}function y(e,t){let o=String(e||"");return o.length>t?o.slice(0,t)+"\u2026":o} function C(e){let t=Math.max(0,Math.floor(Number(e)||0)),o=Math.floor(t/60),r=t%60;return`${o}:${String(r).padStart(2,"0")}`}function F(e,t){try{let o=GM_getValue(e,null);return o==null?t:typeof o=="string"?JSON.parse(o):o}catch{return t}}function G(e,t){ GM_setValue(e,JSON.stringify(t))}var Je=()=>{};function Ye(e){Je=typeof e=="function"?e:()=>{}}function p(e,t){let o={t:Date.now(),msg:String(e||""),type:t|| "info"};n.logs.unshift(o),n.logs.length>xe&&(n.logs.length=xe),Je()}function Pt(e){try{let t=document.cookie.match(new RegExp("(?:^|; )"+e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")+"=([^;]*)")); return t?decodeURIComponent(t[1]):""}catch{return""}}function ne(){let e=String(n.userName||localStorage.getItem("userNa\ me")||"").trim();if(e)return`jslpa:${e}`;let t=String(localStorage.getItem("jslpa_platform_uid")||"").trim();if(t)return`\ jslpa:uid:${t}`;let o=String(Pt("ASP.NET_SessionId")||localStorage.getItem("jslpa_sid_fallback")||"").trim();if(o){try{localStorage. setItem("jslpa_sid_fallback",o)}catch{}return`jslpa:sid:${o}`}return""}function We(){try{if(typeof unsafeWindow<"u"&&unsafeWindow) return unsafeWindow}catch{}return window}function v(e,t,o){let r=e.startsWith("http")?e:`${Ne}${e}`,s=(o||(t===void 0?"G\ ET":"POST")).toUpperCase(),a=!(s==="GET"||t===void 0||t===null),i=a?JSON.stringify(t):null,l={Accept:"application/json, \ text/plain, */*"};a&&(l["Content-Type"]="application/json;charset=UTF-8");let d=(c,f)=>{let b={};try{b=JSON.parse(c||"{}")}catch(h){ let T=String(c||"").slice(0,80).replace(/\s+/g," ");throw new Error(`\u54CD\u5E94\u975E JSON(HTTP ${f}): ${T||h.message}`)} let w=b.code!=null?Number(b.code):f;if(w===401)throw new Error(b.msg||"\u767B\u5F55\u5DF2\u5931\u6548\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55"); if(w!==200&&f>=400)throw new Error(b.msg||b.message||`HTTP ${f}`);if(w!==200&&b.msg){let h=new Error(b.msg);throw h.code= w,h.payload=b,h}return b},u=()=>new Promise((c,f)=>{try{let w=We().XMLHttpRequest||XMLHttpRequest,h=new w;h.open(s,r,!0), h.withCredentials=!0,h.timeout=3e4,Object.keys(l).forEach(T=>{try{h.setRequestHeader(T,l[T])}catch{}}),h.onload=()=>{try{ c(d(h.responseText||"",h.status))}catch(T){f(T)}},h.onerror=()=>f(new Error("\u9875\u9762\u8BF7\u6C42\u5931\u8D25")),h.ontimeout= ()=>f(new Error("\u8BF7\u6C42\u8D85\u65F6")),h.send(i)}catch(b){f(b)}}),x=()=>new Promise((c,f)=>{if(typeof GM_xmlhttpRequest!= "function"){f(new Error("GM_xmlhttpRequest \u4E0D\u53EF\u7528"));return}GM_xmlhttpRequest({method:s,url:r,headers:l,data:i|| void 0,anonymous:!1,withCredentials:!0,timeout:3e4,onload(b){try{c(d(b.responseText||"",b.status))}catch(w){f(w)}},onerror(){ f(new Error("GM \u8BF7\u6C42\u5931\u8D25"))},ontimeout(){f(new Error("GM \u8BF7\u6C42\u8D85\u65F6"))}})}),g=()=>{let c=We(), f=c.fetch||fetch;return typeof f!="function"?Promise.reject(new Error("\u65E0 fetch")):f.call(c,r,{method:s,headers:l,body:i, credentials:"include"}).then(async b=>d(await b.text(),b.status))};return u().catch(c=>x().catch(f=>g().catch(b=>{throw new Error( c.message||f.message||b.message||"\u7F51\u7EDC\u8BF7\u6C42\u5931\u8D25")})))}async function I(){try{let e=await v("/api/\ User/Status",null,"GET"),t=e&&e.res||{},o=t.WorkName||t.workName||t.UserName||t.username||t.Name||"";if(o){n.userName=String( o).trim();try{localStorage.setItem("userName",n.userName)}catch{}}let r=t.UserID||t.userid||t.Id||t.id||t.Mobile||t.mobile|| "";if(r)try{localStorage.setItem("jslpa_platform_uid",String(r).trim())}catch{}return n.userName||""}catch{return n.userName|| ""}}var he=()=>{};function Ke(e){he=typeof e=="function"?e:()=>{}}function Qe(){n.enabled=!!GM_getValue(z.enabled,!1),n.pace= P.realtime,GM_setValue(z.pace,P.realtime),n.onlyIncomplete=GM_getValue(z.onlyIncomplete,!0)!==!1,n.autoExam=GM_getValue( z.autoExam,!0)!==!1,n.examBank=F(z.examBank,{})||{};let e=F(z.selected,null);e&&typeof e=="object"&&!Array.isArray(e)?(n. selectMode=e.mode==="none"||e.mode==="partial"?e.mode:"all",n.selectedIds=new Set(Array.isArray(e.ids)?e.ids:[])):Array. isArray(e)?(n.selectMode=e.length?"partial":"all",n.selectedIds=new Set(e)):(n.selectMode="all",n.selectedIds=new Set)}function oe(){ G(z.selected,{mode:n.selectMode,ids:Array.from(n.selectedIds)})}function Mt(){return[...n.zyCourses||[],...n.gxCourses|| []]}function ze(e){return n.selectMode==="none"?!1:n.selectMode==="all"?!0:n.selectedIds.has(e)}function N(){if(n.selectMode=== "none")return[];let e=Mt();return n.selectMode==="all"?e.slice():e.filter(t=>n.selectedIds.has(t.id))}function Ze(){n.selectMode= "all",n.selectedIds=new Set,oe(),he()}function et(){n.selectMode="none",n.selectedIds=new Set,oe(),he()}function ye(e){return Number( e.DEGREE)>=1||e.axios===!0}function _(e,t){if(!e)return 0;if(t&&t.completedView||e.ispassed||e.myCourseStatus&&e.myCourseStatus. completed)return 100;let o=e._chapters;if(Array.isArray(o)&&o.length){let r=o.filter(s=>ye(s)).length;return Math.round( r/o.length*100)}return e.ispassed_exam?100:Number(e.courseProgress)||0}function At(e){return`\u5B66\u4E60\u8FDB\u5EA6 ${_( e)}%`}function It(e){return e.ispassed_exam||e.myExamStatus&&e.myExamStatus.isPass?"\u8003\u8BD5\uFF1A\u5408\u683C":e.isExam? _(e)<99.5?"\u8003\u8BD5\uFF1A\u5F85\u5B8C\u6210":e.examcan>0?"\u8003\u8BD5\uFF1A\u53EF\u8003":"\u8003\u8BD5\uFF1A\u5F85\u5B8C\u6210": e.ispassed||_(e)>=99.5?"\u8003\u8BD5\uFF1A\u5408\u683C":"\u8003\u8BD5\uFF1A\u65E0"}function Rt(e){return e.ispassed_exam|| e.myExamStatus&&e.myExamStatus.isPass||!e.isExam&&(e.ispassed||_(e)>=99.5)?"#16a34a":e.isExam?_(e)>=99.5?"#b45309":"#647\ 48b":"#94a3b8"}function tt(){G(z.examBank,n.examBank||{})}function we(e){let t=_(e);return t<99.5&&!e.ispassed?!1:e.isExam? !!(e.ispassed_exam||e.myExamStatus&&e.myExamStatus.isPass):!!(e.ispassed||t>=99.5)}function Xe(e,t,o){let r=String(e.ClassID|| e.classid||e.id||"").trim();if(!r)return null;let s=e.ClassSetName||e.coursename||e.name||r,a=!!(e.isexam||e.isExam),i=!!e. ispassed,l=!!e.ispassed_exam;return{id:r,name:s,title:s,year:t||e.teacherwork||"",kind:o||"zy",isExam:a,ispassed:i,ispassed_exam:l, examcan:Number(e.examcan||0),isface:e.isface!==!1,grade:e.grade,teachername:e.teachername||"",myCourseStatus:{completed:i, passed:l},myExamStatus:{isPass:l,isExam:a},courseProgress:i?100:0}}async function je(e,t){let o=e.slice(),r=3;async function s(){ for(;o.length&&!n.stopFlag;){let a=o.shift();try{let i=await re(a.id);i&&(a._chapters=i.chapter||[],a.ispassed=!!i.ispassed|| a.ispassed,a.ispassed_exam=!!i.ispassed_exam||a.ispassed_exam,a.isExam=i.isExam!=null?i.isExam:a.isExam,a.examcan=i.examcan!= null?i.examcan:a.examcan,a.isface=i.isface!=null?i.isface:a.isface,a.name=i.name||a.name,a.myCourseStatus={completed:a.ispassed, passed:a.ispassed_exam},a.myExamStatus={isPass:a.ispassed_exam,isExam:a.isExam},a.courseProgress=_(a))}catch{}typeof t== "function"&&t()}}await Promise.all(Array.from({length:r},()=>s()))}async function H(e){let t=e||{};await I();let o=await v( "/api/Course/List",null,"POST"),r=o&&o.res||[];if(!Array.isArray(r))throw new Error("\u8BFE\u7A0B\u5217\u8868\u683C\u5F0F\u5F02\u5E38"); let s=[],a=[];for(let l of r){let d=l.year||"";for(let u of l.list||[]){let x=Xe(u,d,"zy");x&&s.push(x)}for(let u of l.gxk_list|| []){let x=Xe(u,d,"gx");x&&a.push(x)}}n.zyCourses=s,n.gxCourses=a,n.learningCourses=s,n.completedCourses=a;let i=[...s,...a]; return i.length?t.enrich===!1?{learning:s,completed:a,zy:s,gx:a,all:i}:(await je(i,t.onProgress),{learning:s,completed:a, zy:s,gx:a,all:i}):{learning:[],completed:[],zy:[],gx:[],all:[]}}async function re(e){let t=await v("/api/Course/Details", {classid:e}),o=t&&t.res||null;if(!o)return null;let r=(o.chapters||[]).map((s,a)=>{let i=Number(s.duration)||0,l=a+1;return{ id:s.KEYLIST,KEYLIST:s.KEYLIST,index:l,name:`\u7B2C${l}\u7AE0`,title:`\u7B2C${l}\u7AE0`,DEGREE:Number(s.DEGREE)||0,duration:i, lastTime:i*.98,timespan:0,axios:Number(s.DEGREE)>=1,isComplete:Number(s.DEGREE)>=1}});return{id:e,name:o.coursename||e,isExam:!!o. isexam,ispassed:!!o.ispassed,ispassed_exam:!!o.ispassed_exam,examcan:Number(o.examcan||0),isface:o.isface!==!1,grade:o.grade, chapter:r,projectId:o.isexam?e:""}}function _e(e,t){let o=t||{},r=!!o.checkable,s=!!o.checked,a=!!o.isActive,i=e.name||e. title||e.id,l=_(e),d=we(e),u=a?"#16a34a":"#e2e8f0",x=a?"#f0fdf4":d?"#f1f5f9":"#f8fafc",g=d?"#64748b":"#0f172a",c=Rt(e),f=e. kind==="gx"?'\u516C\u9700':'\u4E13\u4E1A',b=d?'\u5DF2\u5B8C\u6210':"",w=r?``:"",h=r?"label":"div";return`<${h} style="display:flex;gap:7px;align-items\ :flex-start;background:${x};border:1px solid ${u};border-radius:8px;padding:7px;margin-bottom:6px;${r?"cursor:pointer;": ""}${d?"opacity:.95;":""}"> ${w} ${j(i)}${f}${b} ${j(At(e))} ${j(It(e))} `}function m(e){if(te){let t=te.querySelector("#"+e);if(t)return t}return document.getElementById(e)}function $(e,t){if(!e) return;let o=typeof DOMPurify<"u"&&DOMPurify.sanitize?DOMPurify.sanitize(t,{USE_PROFILES:{html:!0}}):t;e.innerHTML=o}var ot=()=>{};function rt(e){ot=typeof e=="function"?e:()=>{}}var nt=Promise.resolve();function qt(e){let t=nt.then(e,e); return nt=t.then(()=>{},()=>{}),t}function Nt(){return String(n.cloudApiBase||Z).replace(/\/+$/,"")}function Ee(){return String( n.proBuyUrl||q).trim()||q}function Ut(){return n.cloudTier==="pro"}function Dt(){try{let e=JSON.parse(localStorage.getItem( ee)||"null"),t=String(e?.lease||"").trim(),o=Number(e?.exp||0);return!t||!Number.isFinite(o)||o*1e3<=Date.now()+15e3?null: e}catch{return null}}function V(e,t,o){if(!e||!t){localStorage.removeItem(ee);return}localStorage.setItem(ee,JSON.stringify( Object.assign({lease:e,exp:t},o||{})))}function Ot(e,t){if(!e)return`HTTP ${t}`;if(typeof e.message=="string"&&e.message. trim())return e.message.trim();let o=e.detail;if(typeof o=="string"&&o.trim())return o.trim();if(Array.isArray(o)&&o.length){ let r=o[0];if(typeof r=="string")return r;if(r&&typeof r.msg=="string")return r.msg}return o&&typeof o=="object"&&typeof o. msg=="string"?o.msg:`HTTP ${t}`}function Bt(e){let t=String(e||"").trim(),o={"invalid token":"\u6FC0\u6D3B\u7801\u65E0\u6548", revoked:"\u6FC0\u6D3B\u7801\u5DF2\u505C\u7528",expired:"\u6FC0\u6D3B\u7801\u5DF2\u8FC7\u671F",expired_after_activation:"\ \u5DF2\u8FC7\u671F\uFF0C\u8BF7\u91CD\u65B0\u5F00\u901A",token_bound_to_other_learning_user:"\u6FC0\u6D3B\u7801\u5DF2\u7ED1\u5B9A\u5176\u4ED6\u8D26\u53F7", free_course_quota_exceeded:"\u514D\u8D39\u4F53\u9A8C\u6B21\u6570\u5DF2\u7528\u5B8C\uFF0C\u8BF7\u5347\u7EA7\u4E13\u4E1A\u7248", free_quota_exhausted:"\u514D\u8D39\u4F53\u9A8C\u6B21\u6570\u5DF2\u7528\u5B8C\uFF0C\u8BF7\u5347\u7EA7\u4E13\u4E1A\u7248", invalid_lease:"\u4F1A\u8BDD\u5DF2\u5931\u6548\uFF0C\u8BF7\u91CD\u8BD5",rate_limited:"\u8BF7\u6C42\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5", missing_learning_user_id:"\u672A\u767B\u5F55\uFF0C\u8BF7\u5148\u767B\u5F55\u5E73\u53F0"};return o[t]||o[t.toLowerCase()]|| t||"\u64CD\u4F5C\u5931\u8D25"}function Ft(){if(typeof GM_xmlhttpRequest=="function")return GM_xmlhttpRequest;try{if(typeof GM< "u"&&typeof GM.xmlHttpRequest=="function")return GM.xmlHttpRequest}catch{}return null}function st(e,t,o){let s=`${Nt()}${e. startsWith("/")?e:`/${e}`}`,a={Accept:"application/json","Content-Type":"application/json"},i=ne();i&&(a["x-learning-use\ r-id"]=encodeURIComponent(i)),n.cloudToken&&(a.Authorization=`Bearer ${n.cloudToken}`);let l=o==null?null:JSON.stringify( o),d=Ft();return d?new Promise((u,x)=>{let g={method:t||"GET",url:s,headers:a,timeout:2e4,anonymous:!0,responseType:"tex\ t",onload:c=>u({status:Number(c.status)||0,text:String(c.responseText||"")}),onerror:()=>x(new Error("\u65E0\u6CD5\u8FDE\u63A5\u6388\u6743\u670D\u52A1\uFF0C\u8BF7\u786E\u8BA4\u5DF2\u5141\u8BB8 oa\ 30.ahzsksw.cn")),ontimeout:()=>x(new Error("\u6388\u6743\u670D\u52A1\u8BF7\u6C42\u8D85\u65F6"))};l!=null&&(g.data=l);try{ d(g)}catch(c){x(c instanceof Error?c:new Error(String(c)))}}):Promise.reject(new Error("\u5F53\u524D\u73AF\u5883\u65E0 GM_xmlhttpRequest\uFF0C\u8BF7\u7528 Tampe\ rmonkey/\u811A\u672C\u732B\u5B89\u88C5"))}async function se(e,t,o){let r=await st(e,t,o),s=String(r.text||"").trim(),a=null; if(s)try{a=JSON.parse(s)}catch{throw new Error(`\u670D\u52A1\u5F02\u5E38(HTTP ${r.status})`)}if(r.status>=400){let i=Ot( a,r.status),l=new Error(Bt(i));throw l.status=r.status,l.data=a,l}return a||{}}async function at(){return n.cloudToken&& await se("/api/license/verify","GET",null),!0}async function J(e){n.cloudToken=String(n.cloudToken||localStorage.getItem( L)||"").trim();let t=e?null:Dt();if(t?.lease)return n.cloudLease=t.lease,n.cloudLeaseExp=Number(t.exp||0),t.tier&&(n.cloudTier= String(t.tier)),t.free_course_limit!=null&&(n.freeCourseLimit=Number(t.free_course_limit)||M),t.free_used_courses!=null&& (n.freeUsedCourses=Number(t.free_used_courses)||0),t.pro_expires_at&&(n.cloudProExpireAt=Number(t.pro_expires_at)||0),n. cloudReady=!0,S(),!0;if(!ne())try{await I()}catch{}let o=ne();if(!o)throw new Error("\u672A\u767B\u5F55\uFF0C\u8BF7\u5148\u767B\u5F55\u5E73\u53F0\u540E\u518D\u540C\u6B65\u4F1A\u5458"); let r=await se("/api/jslpa/lease","POST",{learning_user_id:o,name:n.userName||"",userName:n.userName||""}),s=String(r.lease|| ""),a=Number(r.exp||0);if(!s)throw new Error("\u5F00\u901A\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5");if(n.cloudLease= s,n.cloudLeaseExp=a,n.cloudTier=String(r.tier||"free"),n.freeCourseLimit=Number(r.free_course_limit!=null?r.free_course_limit: M)||M,n.freeUsedCourses=Number(r.free_used_courses!=null?r.free_used_courses:0)||0,n.cloudProExpireAt=Number(r.pro_expires_at|| 0)||0,r.proBuyUrl){let i=String(r.proBuyUrl).trim();i&&(n.proBuyUrl=i)}return V(s,a,{tier:n.cloudTier,free_course_limit:n. freeCourseLimit,free_used_courses:n.freeUsedCourses,pro_expires_at:n.cloudProExpireAt}),n.cloudReady=!0,S(),!0}async function it(e){ await J(!1);let t=String(e?.id||e?.classId||"").trim(),o=await se("/api/jslpa/course/consume","POST",{lease:n.cloudLease, course_id:t,course_name:String(e?.name||e?.title||"")});return o.tier&&(n.cloudTier=String(o.tier)),o.free_used_courses!= null&&(n.freeUsedCourses=Number(o.free_used_courses)||0),o.free_course_limit!=null&&(n.freeCourseLimit=Number(o.free_course_limit)|| n.freeCourseLimit),V(n.cloudLease,n.cloudLeaseExp,{tier:n.cloudTier,free_course_limit:n.freeCourseLimit,free_used_courses:n. freeUsedCourses,pro_expires_at:n.cloudProExpireAt}),S(),o}async function Gt(){try{let e=await st("/api/jslpa/panel-notic\ e","GET",null);if(e.status===200&&e.text){n.remotePanelNotice=String(e.text).trim();let t=m("nmg-panel-notice-text");t&& n.remotePanelNotice&&(t.textContent=n.remotePanelNotice)}}catch{}}async function Ht(){try{let e=await se("/api/jslpa/cli\ ent-config","GET",null);e.cloudApiBase&&(n.cloudApiBase=String(e.cloudApiBase).replace(/\/+$/,"")),e.freeCourseLimit!=null&& (n.freeCourseLimit=Number(e.freeCourseLimit)||M),e.proBuyUrl&&(n.proBuyUrl=String(e.proBuyUrl).trim()||q)}catch{}}function S(){ let e=n.cloudTier==="pro"?n.cloudProExpireAt?`\u4E13\u4E1A\u7248\uFF08\u81F3 ${new Date(n.cloudProExpireAt*1e3).toLocaleDateString()}\ \uFF09`:"\u4E13\u4E1A\u7248":n.cloudTier==="unknown"?"\u672A\u540C\u6B65":`\u514D\u8D39\u7248\uFF08\u5DF2\u7528 ${n.freeUsedCourses}\ /${n.freeCourseLimit} \u95E8\uFF09`,t=m("nmg-cloud-tier");t&&(t.textContent=e);let o=m("nmg-pro-buy");o&&(o.href=Ee());let r=m( "nmg-pro-banner");r&&(r.style.display=Ut()?"none":""),ot()}async function ae(e){return qt(async()=>(await I().catch(()=>{}), await Ht().catch(()=>{}),await Gt().catch(()=>{}),await J(!!e),S(),!0))}var Vt=120*1e3,U=()=>{},Se=()=>{},Y=()=>{},dt=async()=>({ok:!0,skipped:!0});function ut(e){e&&typeof e.upd=="function"&& (U=e.upd),e&&typeof e.hint=="function"&&(Se=e.hint),e&&typeof e.clear=="function"&&(Y=e.clear),e&&typeof e.exam=="functi\ on"&&(dt=e.exam)}function Jt(e){return(e&&e.chapter||[]).filter(o=>n.onlyIncomplete?!ye(o):!0)}async function Yt(e){let t=await v("/api/C\ ourse/Play",{chapterid:e});return t&&t.res||{times:0}}async function lt(e,t){return await v("/api/Course/Times",{ChapterID:e, times:Math.floor(Number(t)||0)})}async function Wt(e,t){return await v("/api/Course/Chapter",{ChapterID:e,ClassID:t,wx:0})} function ve(e,t,o){let r=o>0?Math.min(100,Math.round(t/o*100)):0,s=e?`${e} \xB7 `:"";Se(`\u5B66\u4E60\u4E2D \xB7 ${s}${C( t)}/${C(o)} ${r}% \xB7 \u811A\u672C\u8FD0\u884C\u4E2D`),n.task=`${y(e||"\u5B66\u4E60\u4E2D",10)} \xB7 ${C(t)}/${C(o)}`,U()} async function Ce(e,t){let o=Math.max(0,Number(e)||0)*1e3,r=0;for(;o>0&&!n.stopFlag;){let s=Math.min(5e3,o);if(await B(s), o-=s,r+=s,typeof t=="function"&&r>=Vt){r=0;try{t(o)}catch{}}}}async function ct(e,t,o,r){let s=Math.floor(Number(t)||0), a=Math.floor(Number(o)||0),i=Math.max(0,a-s),l=Math.floor(Number(r&&r.duration)||0),d=r&&r.chapterLabel||"",u=Date.now(), x=()=>{let g=Math.floor((Date.now()-u)/1e3),c=Math.min(a,s+Math.max(0,g));ve(d,c,l)};if(i>0&&await Ce(i,x),n.stopFlag)return null; try{return await lt(e,a)}catch(g){let c=String(g.message||g);if(!/播放速度异常|速度异常/.test(c))throw g;let f=Math. max(i,60);return p(`\u5E73\u53F0\u9650\u901F\uFF1A\u8865\u7B49 ${C(f)} \u540E\u91CD\u8BD5 ${C(a)}\u2026`,"progress"),await Ce( f,x),n.stopFlag?null:await lt(e,a)}}async function Xt(e,t,o){let r=Math.floor(Number(t.duration)||0),s=t.name||t.title|| `\u7B2C${t.index||"?"}\u7AE0`;if(r<=0)throw new Error(`\u7AE0\u8282\u300C${s}\u300D\u65E0\u6709\u6548\u65F6\u957F`);let a=await Yt( t.id),i=Math.floor(Number(a.times)||0);i<0&&(i=0);let l=Math.floor(t.lastTime||r*.98),d=De,u=e.name||e.title||"",x={duration:r, chapterLabel:s};for(n.currentCourse=u,n.currentChapter=s,n.task=`${y(u,14)} \xB7 ${y(s,12)}`,ve(s,i,r),p(`\u5F00\u59CB\u5B66\u4E60 \xB7 ${u}\ \xB7 ${s}\uFF08\u5DF2\u770B ${C(i)}/${C(r)}\uFF09`,"progress"),i>=l&&p("\u672C\u7AE0\u8FDB\u5EA6\u5DF2\u8FBE\u5B8C\u64AD\u9608\u503C\uFF0C\u63D0\u4EA4\u7AE0\u8282\u5B8C\u6210\u2026", "info");il&&(c=l),c<=i&&(c=Math.min(i+1,l)),await ct(t.id,i,c,x),n.stopFlag)return;i=c, ve(s,i,r)}if(n.stopFlag||(i{};function ft(e){Le=typeof e=="function"?e:()=>{}}function $e(e,t){let o=String(e||"").trim();if(o)return`id\ :${o}`;let r=String(t||"").replace(/<[^>]+>/g,"").replace(/\s+/g,"").slice(0,80);return r?`stem:${r}`:""}function ie(e){ return e?((!n.examBank||typeof n.examBank!="object")&&(n.examBank={}),n.examBank[e]||null):null}function ke(e,t){if(!e)return; (!n.examBank||typeof n.examBank!="object")&&(n.examBank={});let o=n.examBank[e]||{};n.examBank[e]={...o,...t}}function Kt(e){ let t=0,o=0,r=e&&e.questions||[];for(let s of r){let a=$e(s.subject_code,s.subject);if(!a)continue;let i=String(s.subject_type_code|| ""),l=String(s.selects||"").trim(),d=String(s.result||"").trim(),u=String(s.right??""),x=ie(a)||{type:i,tried:[]};if(u=== "1"||u==="true"){l&&(ke(a,{type:i,answer:l,tried:[]}),t+=1);continue}if(d){ke(a,{type:i,answer:d,tried:[]}),t+=1;continue} if(l){let g=Array.isArray(x.tried)?x.tried.slice():[];g.includes(l)||g.push(l),ke(a,{type:i,tried:g,answer:x.answer||""}), o+=1}}return(t||o)&&tt(),{learned:t,markedWrong:o,total:r.length}}function Qt(e){return(e.list||e.options||[]).map(o=>String( o.result_id||"")).filter(Boolean)}function Zt(e,t){let o=new Set((t||[]).map(String));for(let r of e)if(!o.has(r))return r; return e[0]||"A"}function en(e,t){let o=new Set((t||[]).map(String)),r=e.join(""),s=[];if(e.length){s.push(r);for(let a=0;a< e.length;a++)s.push(e.filter((i,l)=>l!==a).join(""));for(let a=1;a{},xt=()=>{},Pe=()=>{},Te=()=>{};function gt(e){e&&(e.upd&&(R=e.upd),e.hint&&(xt=e.hint),e.clear&&(Pe=e.clear), e.lists&&(Te=e.lists))}async function Me(){if(!n.running){n.running=!0,n.stopFlag=!1;try{p("\u5237\u65B0\u8BFE\u7A0B\u5217\u8868\u2026", "info"),await H({enrich:!1}),Te();let e=N().filter(t=>n.onlyIncomplete?we(t)?!1:_(t)<99.5&&!t.ispassed?!0:!!(n.autoExam&& t.isExam&&!(t.myExamStatus||{}).isPass&&!t.ispassed_exam):!0);if(n.queueVideoTotal=0,n.queueVideoDone=0,n.queueExamTotal= e.filter(t=>t.isExam&&!t.ispassed_exam).length,n.queueExamDone=0,R(),!e.length){p("\u52FE\u9009\u8BFE\u7A0B\u5747\u5DF2\u5B66\u5B8C\uFF0C\u65E0\u9700\u7EE7\u7EED", "info");return}p(`\u5F00\u59CB\u987A\u5E8F\u5B66\u4E60 \xB7 ${e.length} \u95E8\u8BFE${n.autoExam?"\uFF08\u542B\u81EA\u52A8\u8003\u8BD5\uFF09": ""}`,"info");for(let t of e){if(n.stopFlag)break;try{await J(!1),await it(t)}catch(o){p(`\u65E0\u6CD5\u7EE7\u7EED: ${o.message|| o}`,"error");break}try{await pt(t)}catch(o){p(`\u8BFE\u7A0B\u5931\u8D25\u300C${t.name||t.id}\u300D: ${o.message||o}`,"er\ ror")}}n.stopFlag||(p("\u5168\u90E8\u4EFB\u52A1\u5B8C\u6210","info"),await H({enrich:!1}),Te())}catch(e){p(`\u9519\u8BEF: ${e. message||e}`,"error")}finally{n.running=!1,n.enabled=!1,GM_setValue(z.enabled,!1),n.stopFlag||(n.task="",n.currentCourse= "",n.currentChapter="",n.activeCourse=null),R()}}}function le(){n.stopFlag=!0,n.enabled=!1,GM_setValue(z.enabled,!1),n.task= "\u5DF2\u505C\u6B62",Pe(),R(),p("\u81EA\u52A8\u770B\u8BFE\u5DF2\u6682\u505C","info")}function bt(){if(!(n.running||n.enabled)){ if(n.pace=P.realtime,GM_setValue(z.pace,n.pace),n.selectMode==="none"||!N().length){xt("\u8BF7\u5148\u52FE\u9009\u81F3\u5C11\u4E00\u95E8\u8BFE\u7A0B"), R();return}Pe(),I().then(()=>J(!0)).then(()=>{n.enabled=!0,n.stopFlag=!1,GM_setValue(z.enabled,!0),R(),p("\u81EA\u52A8\u770B\u8BFE\u5DF2\u5F00\u542F", "info"),Me()}).catch(e=>{p(`\u65E0\u6CD5\u5F00\u59CB: ${e.message||e}`,"error"),R()})}}function W(){A&&(A.cloudTier=n.cloudTier,A.freeUsedCourses=n.freeUsedCourses,A.freeCourseLimit=n.freeCourseLimit,A.running= !!(n.running||n.enabled))}function ht(e,t){if(!(!e||!t||typeof t.createPinia!="function"))try{let{createPinia:o,defineStore:r}=t, s=r("nmg12371",{state:()=>({cloudTier:n.cloudTier,freeUsedCourses:n.freeUsedCourses,freeCourseLimit:n.freeCourseLimit,running:!1})}), a=o(),i=e.createApp({render:()=>null});i.use(a);let l=document.createElement("div");l.style.display="none",document.body. appendChild(l),i.mount(l),Ve(s()),W()}catch{}}var zt=null,yt=null;function on(){let e=m("nmg-start"),t=m("nmg-stop");e&&(e.disabled=!!n.enabled||!!n.running,e.classList. toggle("zjzx-btn-off",!!n.enabled||!!n.running)),t&&(t.disabled=!n.enabled&&!n.running,t.classList.toggle("zjzx-btn-off", !n.enabled&&!n.running))}function de(e){n.panelHint=String(e||"");let t=m("nmg-start-hint");t&&(n.panelHint?(t.style.display= "",t.textContent=n.panelHint):(t.style.display="none",t.textContent=""))}function X(){de("")}function rn(){let e=N(),t=0, o=0,r=0,s=0;for(let a of e)t+=1,_(a)>=99.5&&(o+=1),a.isExam&&(r+=1,(a.myExamStatus||{}).isPass&&(s+=1));n.queueVideoTotal= t,n.queueVideoDone=o,n.queueExamTotal=n.autoExam?r:0,n.queueExamDone=n.autoExam?s:0}function E(){rn();let e=m("nmg-auto-\ status");e&&(n.running||n.enabled?(e.textContent=n.running?"\u8FD0\u884C\u4E2D":"\u5DF2\u5F00\u542F",e.style.background= "#dcfce7",e.style.borderColor="#86efac",e.style.color="#166534"):(e.textContent="\u5DF2\u505C\u6B62",e.style.background= "#fff",e.style.borderColor="#cbd5e1",e.style.color="#334155"));let t=n.queueVideoDone,o=n.queueVideoTotal,r=o>0?Math.round( t/o*100):0,s=(x,g)=>{let c=m(x);c&&(c.textContent=g)};s("nmg-queue-done",String(t)),s("nmg-queue-total",String(o)),s("nm\ g-queue-percent",`${r}%`),s("nmg-queue-exam",n.autoExam?`${n.queueExamDone} / ${n.queueExamTotal||"\u2014"}`:"\u2014");let a=m( "nmg-queue-progress");a&&(a.style.width=`${r}%`),s("nmg-current-course",y(n.currentCourse||"\u65E0",28)),s("nmg-current-\ chapter",y(n.currentChapter||"\u65E0",28)),s("nmg-current-task",y(n.task||"\u70B9\u5F00\u59CB\u540E\u81EA\u52A8\u63D0\u4EA4", 36));let i=m("nmg-current-course"),l=m("nmg-current-chapter"),d=m("nmg-current-task");i&&(i.title=n.currentCourse||""),l&& (l.title=n.currentChapter||""),d&&(d.title=n.task||"");let u=m("nmg-queue-text");if(u){let g=N().length;n.selectMode==="\ none"?u.textContent="\u672A\u52FE\u9009\u4EFB\u4F55\u8BFE\u7A0B":n.selectMode==="all"&&(n.zyCourses?.length||n.gxCourses?. length)?u.textContent=`\u5DF2\u9009\u5168\u90E8 ${g} \u95E8 \xB7 \u89C6\u9891 ${t}/${o}${n.autoExam&&n.queueExamTotal?` \ \xB7 \u8003\u8BD5 ${n.queueExamDone}/${n.queueExamTotal}`:n.autoExam?" \xB7 \u81EA\u52A8\u8003\u8BD5":""}`:u.textContent= g?`\u5DF2\u9009 ${g} \u95E8 \xB7 \u89C6\u9891 ${t}/${o}${n.autoExam&&n.queueExamTotal?` \xB7 \u8003\u8BD5 ${n.queueExamDone}\ /${n.queueExamTotal}`:n.autoExam?" \xB7 \u81EA\u52A8\u8003\u8BD5":""}`:"\u672A\u52FE\u9009\u4EFB\u4F55\u8BFE\u7A0B"}on(), W()}function sn(e){let t=m("nmg-auto-panel");t&&(t.querySelectorAll(".zjzx-tab-btn").forEach(o=>{o.classList.toggle("act\ ive",o.dataset.tab===e)}),t.querySelectorAll(".zjzx-pane").forEach(o=>{o.classList.toggle("active",o.dataset.pane===e)}))} function Ae(e,t){let o=e.querySelector("#nmg-btn-min"),r=e.querySelector("#nmg-btn-max");e.classList.toggle("zjzx-panel-\ min",!!t),e.classList.toggle("zjzx-panel-max",!t),o&&(o.style.display=t?"none":""),r&&(r.style.display=t?"":"none")}function an(e){ let t=e.querySelector("#nmg-panel-header");if(!t)return;let o=!1,r=0,s=0,a=0,i=0;t.addEventListener("mousedown",l=>{if(l. target?.closest("#nmg-panel-controls, .zjzx-panel-ctl"))return;o=!0,r=l.clientX,s=l.clientY;let d=e.getBoundingClientRect(); a=d.left,i=d.top,e.style.right="auto",e.style.bottom="auto",l.preventDefault()}),document.addEventListener("mousemove",l=>{ if(!o)return;let d=Math.max(0,Math.min(window.innerWidth-e.offsetWidth,a+(l.clientX-r))),u=Math.max(0,Math.min(window.innerHeight- e.offsetHeight,i+(l.clientY-s)));e.style.left=`${d}px`,e.style.top=`${u}px`}),document.addEventListener("mouseup",()=>{if(!o) return;o=!1;let l=e.getBoundingClientRect();G(z.panelPos,{left:l.left,top:l.top})})}function ln(e){let t=document.createElement( "style");t.textContent=` :host{all:initial;} #nmg-auto-panel{position:fixed;right:20px;top:80px;z-index:999999;width:412px;display:flex;flex-direction:column;bac\ kground:#f4f7fb;border:1px solid #dbe4f0;border-radius:16px;box-shadow:0 16px 40px rgba(15,23,42,.17);font-family:-apple\ -system,BlinkMacSystemFont,"Segoe UI",Roboto,"PingFang SC","Microsoft YaHei",sans-serif;font-size:12px;color:#0f172a;ove\ rflow:hidden;transition:max-height .22s ease,box-shadow .22s ease;} #nmg-auto-panel.zjzx-panel-max{max-height:min(92vh,780px);} #nmg-auto-panel.zjzx-panel-min{max-height:none;box-shadow:0 10px 28px rgba(15,23,42,.14);} #nmg-auto-panel.zjzx-panel-min #nmg-panel-header{border-bottom:none;} #nmg-auto-panel.zjzx-panel-min #nmg-panel-body,#nmg-auto-panel.zjzx-panel-min #nmg-panel-footer,#nmg-auto-panel.zjzx\ -panel-min .zjzx-footer-extra{display:none !important;} #nmg-panel-header{flex:0 0 auto;padding:8px 11px;background:linear-gradient(180deg,#f8ecd5,#f4e8cf);border-bottom:1p\ x solid #e5dbc6;display:flex;justify-content:space-between;align-items:center;cursor:move;user-select:none;} #nmg-panel-body{flex:1 1 auto;min-height:0;overflow-y:auto;padding:8px;} .zjzx-footer-extra{flex:0 0 auto;} #nmg-panel-footer{flex:0 0 auto;padding:7px 11px;background:#eef2f7;border-top:1px solid #dbe4f0;font-size:12px;} #nmg-panel-brand{display:flex;align-items:center;gap:9px;min-width:0;flex:1;} #nmg-panel-logo{width:30px;height:30px;border-radius:9px;object-fit:cover;box-shadow:0 2px 9px rgba(15,23,42,.11);bo\ rder:1px solid rgba(148,163,184,.45);background:#fff;flex:0 0 auto;} #nmg-panel-title{font-size:13px;font-weight:900;color:#9a3412;line-height:1.26;display:flex;align-items:flex-start;g\ ap:5px;flex-wrap:wrap;} .zjzx-panel-title-text{flex:1 1 12em;min-width:0;letter-spacing:-0.01em;} #nmg-panel-sub{display:flex;flex-wrap:wrap;align-items:center;gap:3px 5px;margin-top:3px;line-height:1.32;} .zjzx-sub-chip{font-size:11px;color:#7c2d12;background:rgba(255,255,255,.62);padding:2px 7px;border-radius:999px;bor\ der:1px solid rgba(180,83,9,.18);font-weight:700;} .zjzx-sub-chip-em{color:#0f766e;background:rgba(236,253,245,.9);border-color:rgba(15,118,110,.28);} .zjzx-sub-dot{color:#d6d3d1;font-size:10px;font-weight:400;} .zjzx-panel-ctl .zjzx-ctl-ico{display:block;box-sizing:border-box;margin:0 auto;} .zjzx-ctl-min{width:10px;height:2px;background:#64748b;border-radius:1px;} .zjzx-ctl-plus{font-size:16px;line-height:1;font-weight:700;color:#64748b;} .zjzx-panel-version{font-size:11px;font-weight:900;color:#64748b;padding:2px 7px;border-radius:999px;background:#f1f\ 5f9;border:1px solid #e2e8f0;} #nmg-panel-controls{display:flex;align-items:center;gap:5px;flex:0 0 auto;} .zjzx-panel-ctl{border:none;background:#fff;color:#64748b;width:28px;height:28px;border-radius:999px;cursor:pointer;\ box-shadow:0 1px 2px rgba(15,23,42,.1);font-size:15px;line-height:1;font-weight:900;padding:0;} .zjzx-card{background:#fff;border:1px solid #d9e2ee;border-radius:12px;padding:7px 9px;margin-bottom:7px;} .zjzx-card-status{padding:6px 8px;margin-bottom:6px;} .zjzx-status-row{display:flex;justify-content:space-between;align-items:center;gap:7px;line-height:1.28;} .zjzx-status-label{font-size:11px;color:#64748b;font-weight:700;} .zjzx-status-main{margin-top:3px;} .zjzx-status-metrics{display:flex;align-items:center;gap:5px;font-size:12px;color:#475569;min-width:0;flex:1;} .zjzx-status-metrics em{font-style:normal;font-weight:900;color:#0f172a;} .zjzx-metric-div{color:#cbd5e1;} .zjzx-card-status .zjzx-progress-pct{font-size:14px;font-weight:900;color:#0369a1;flex:0 0 auto;} .zjzx-card-status .zjzx-progress-bar{height:5px;margin-top:4px;margin-bottom:0;} .zjzx-progress-bar{height:9px;border-radius:999px;background:#e2e8f0;overflow:hidden;margin-top:5px;} .zjzx-progress-bar>span{display:block;height:100%;width:0;background:linear-gradient(90deg,#22d3ee,#2563eb);transiti\ on:width .2s ease;} .zjzx-list-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px;} .zjzx-list-head-actions{display:flex;align-items:center;gap:5px;} .zjzx-log-clear-btn{border:1px solid #cbd5e1;background:#fff;color:#64748b;padding:1px 7px;border-radius:999px;font-\ size:10px;font-weight:700;cursor:pointer;line-height:1.4;} .zjzx-plan-select{width:100%;border:1px solid #cbd5e1;border-radius:8px;padding:6px 9px;font-size:12px;background:#f\ ff;color:#0f172a;} .zjzx-list-title{font-size:12px;color:#64748b;font-weight:700;} .zjzx-list-tag{font-size:11px;color:#92400e;background:#ffedd5;border:1px solid #fdba74;border-radius:999px;padding:\ 2px 7px;} .zjzx-empty-state{padding:12px 7px;text-align:center;color:#94a3b8;font-size:12px;font-weight:900;} #nmg-course-list,#nmg-completed-list,#nmg-run-log{max-height:188px;overflow-y:auto;background:#f8fafc;border:1px sol\ id #dbe4f0;border-radius:11px;padding:5px;} .zjzx-chapter-course{margin-bottom:7px;border:1px solid #dbe4f0;border-radius:9px;background:#fff;overflow:hidden;} .zjzx-chapter-title{padding:6px 9px;background:#eaf1ff;border-bottom:1px solid #dbe4f0;color:#1d4ed8;font-size:12px;\ font-weight:700;display:flex;justify-content:space-between;gap:8px;} .zjzx-chapter-item{padding:5px 9px;font-size:12px;display:flex;justify-content:space-between;gap:7px;border-bottom:1\ px dashed #eef2f7;} .zjzx-chapter-item:last-child{border-bottom:none;} .zjzx-footer-extra{padding:6px 9px;background:#f8fafc;border-top:1px solid #e2e8f0;opacity:.95;} .zjzx-ann{position:relative;font-size:12px;color:#334155;line-height:1.42;background:linear-gradient(180deg,#fffdf5,\ #fff7e6);border:1px solid #fcd34d;border-radius:11px;padding:8px 9px 8px 11px;margin-bottom:0;} .zjzx-ann-text{display:block;word-break:break-word;} .zjzx-ann::before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:linear-gradient(180deg,#f5\ 9e0b,#ef4444);border-top-left-radius:11px;border-bottom-left-radius:11px;} .zjzx-qq-row{display:flex;align-items:center;justify-content:space-between;gap:9px;margin-top:5px;} .zjzx-qq-text{font-size:12px;color:#475569;} .zjzx-qq-title{font-size:13px;font-weight:800;color:#0f172a;} .zjzx-qq-btn{border:none;background:linear-gradient(135deg,#1d4ed8,#0ea5e9);color:#fff;padding:5px 12px;border-radiu\ s:999px;font-size:12px;font-weight:800;cursor:pointer;} .zjzx-study-mode-hint{margin-top:5px;padding:7px 9px;border-radius:9px;border:1px solid #e2e8f0;font-size:11px;line-\ height:1.42;} .zjzx-study-mode-hint-title{display:block;font-weight:800;margin-bottom:3px;} .zjzx-study-mode-hint-body{margin:0;color:#475569;} .zjzx-study-mode-hint-efficiency{background:linear-gradient(135deg,#eff6ff,#f0f9ff);border-color:#bfdbfe;color:#1e3a\ 8a;} .zjzx-study-mode-hint-realtime{background:linear-gradient(135deg,#fffbeb,#fef3c7);border-color:#f59e0b;color:#78350f\ ;} .zjzx-start-hint{font-size:11px;color:#b45309;background:#fffbeb;border:1px solid #fcd34d;border-radius:7px;padding:\ 5px 7px;margin-bottom:5px;line-height:1.32;text-align:center;font-weight:600;} .zjzx-tabbar{display:flex;gap:6px;margin-bottom:7px;} .zjzx-tab-btn{flex:1;border:1px solid #cbd5e1;background:#f8fafc;color:#475569;padding:4px 4px;border-radius:9px;cur\ sor:pointer;font-weight:700;font-size:11px;} .zjzx-tab-btn.active{background:linear-gradient(135deg,#1d4ed8,#0ea5e9);color:#fff;border-color:transparent;} .zjzx-pane{display:none;}.zjzx-pane.active{display:block;} .zjzx-btn-row{display:flex;gap:7px;margin-bottom:6px;flex-wrap:wrap;} .zjzx-btn-row-nowrap{flex-wrap:nowrap;} .zjzx-btn{flex:1;border:none;color:#fff;padding:7px 9px;border-radius:10px;cursor:pointer;font-weight:800;font-size:\ 12px;min-width:68px;} .zjzx-btn-action{min-width:0 !important;flex:1 1 0 !important;} .zjzx-btn-ico{font-size:13px;line-height:1;display:inline-flex;align-items:center;margin-right:5px;} .zjzx-btn-label{white-space:nowrap;} .zjzx-btn-start{background:#16a34a;}.zjzx-btn-stop{background:#ef4444;} .zjzx-btn-start.zjzx-btn-off,.zjzx-btn-start:disabled{background:#cbd5e1 !important;color:#64748b !important;cursor:\ not-allowed;box-shadow:none;pointer-events:none;} .zjzx-btn-stop.zjzx-btn-off,.zjzx-btn-stop:disabled{background:#e2e8f0 !important;color:#94a3b8 !important;cursor:no\ t-allowed;box-shadow:none;pointer-events:none;} .zjzx-btn-ghost{border:1px solid #cbd5e1;background:#fff;color:#0f172a;flex:0 0 auto;} .zjzx-meta-row{display:flex;justify-content:space-between;gap:7px;font-size:12px;margin-bottom:5px;align-items:cente\ r;} .zjzx-meta-label{color:#64748b;}.zjzx-meta-value{font-weight:700;text-align:right;} .zjzx-card-current{padding:5px 8px;margin-bottom:6px;} .zjzx-card-current .zjzx-meta-row{font-size:11px;margin-bottom:2px;gap:5px;line-height:1.28;align-items:flex-start;}\ .zjzx-card-current .zjzx-meta-row:last-child{margin-bottom:0;} .zjzx-card-current .zjzx-meta-label{flex:0 0 auto;font-size:10px;white-space:nowrap;} .zjzx-card-current .zjzx-meta-value{flex:1 1 auto;min-width:0;font-size:11px;font-weight:600;text-align:right;word-b\ reak:break-all;line-height:1.28;} .zjzx-card-actions{padding:6px 8px;} .zjzx-study-mode-block{margin-bottom:5px;} .zjzx-study-mode-block .zjzx-study-mode-row{display:flex;align-items:center;gap:5px;margin-bottom:0;} .zjzx-study-mode-block .zjzx-plan-select{flex:1 1 auto;min-width:0;width:auto;padding:3px 22px 3px 7px;font-size:11p\ x;line-height:1.25;border-radius:7px;} #nmg-auto-status{padding:2px 7px;border-radius:999px;font-weight:900;font-size:11px;background:#fff;border:1px solid\ #cbd5e1;} .zjzx-log-row{padding:4px 6px;border-bottom:1px dashed #d4deea;font-size:12px;line-height:1.42;} .zjzx-log-row.err{color:#b91c1c}.zjzx-log-row.prog{color:#0369a1} .zjzx-settings-check{display:flex;gap:6px;align-items:center;margin:6px 0;font-size:12px;font-weight:700;color:#3341\ 55;} .zjzx-pro-banner{margin:0 0 8px;padding:9px 10px;border-radius:11px;background:linear-gradient(135deg,#fff7ed,#fef3c\ 7);border:1px solid #fdba74;} .zjzx-pro-banner-title{font-size:12px;font-weight:900;color:#9a3412;margin-bottom:3px;} .zjzx-pro-banner-desc{font-size:11px;color:#78350f;line-height:1.38;margin-bottom:7px;} .zjzx-btn-pro{display:inline-block;text-decoration:none;background:linear-gradient(135deg,#ea580c,#f59e0b);color:#ff\ f;padding:6px 12px;border-radius:999px;font-size:11px;font-weight:800;} .zjzx-token-input{flex:1;min-width:0;border:1px solid #cbd5e1;border-radius:8px;padding:5px 8px;font-size:12px;} `,e.appendChild(t)}function ce(){let e=m("nmg-run-log");e&&$(e,n.logs.slice(0,80).map(t=>{let o=t.type==="error"?"err": t.type==="progress"?"prog":"",r=new Date(t.t).toLocaleTimeString();return`
[${r}] ${j(t.msg)}\
`}).join(""))}function cn(){let e=[],t=[m("nmg-course-list"),m("nmg-completed-list")];for(let r of t)r&&r.querySelectorAll( 'input[type="checkbox"]').forEach(s=>{s.checked&&e.push(s.getAttribute("data-id"))});let o=(n.zyCourses?.length||0)+(n.gxCourses?. length||0);e.length?o>0&&e.length===o?(n.selectMode="all",n.selectedIds=new Set):(n.selectMode="partial",n.selectedIds=new Set( e)):(n.selectMode="none",n.selectedIds=new Set),oe(),X(),E()}function jt(e){e&&e.querySelectorAll('input[type="checkbox"\ ]').forEach(t=>{t.addEventListener("change",()=>cn())})}function D(){let e=m("nmg-course-list");if(!e)return;let t=n.zyCourses|| n.learningCourses||[];if(!t.length){$(e,'
\u6682\u65E0\u4E13\u4E1A\u8BFE
\u767B\u5F55\u540E\u5C06\u81EA\u52A8\u52A0\u8F7D\uFF0C\u4E5F\u53EF\u70B9\u300C\u5237\u65B0\u8BFE\u7A0B\u300D
'), E();return}let o=n.activeCourse&&n.activeCourse.id;$(e,t.map(r=>_e(r,{checkable:!0,checked:ze(r.id),isActive:r.id===o})). join("")),jt(e),E()}function O(){let e=m("nmg-completed-list");if(!e)return;let t=n.gxCourses||n.completedCourses||[];if(!t. length){$(e,'
\u6682\u65E0\u516C\u9700\u8BFE
\u767B\u5F55\u540E\u5C06\u81EA\u52A8\u52A0\u8F7D
'); return}let o=n.activeCourse&&n.activeCourse.id;$(e,t.map(r=>_e(r,{checkable:!0,checked:ze(r.id),isActive:r.id===o})).join( "")),jt(e)}async function wt(){let e=m("nmg-course-list");e&&$(e,'
\u6B63\u5728\u52A0\u8F7D\u8BFE\u7A0B\u2026
'); try{let{all:t}=await H({enrich:!1});D(),O(),E(),p(`\u5DF2\u52A0\u8F7D\u5217\u8868 \xB7 \u4E13\u4E1A\u8BFE ${(n.zyCourses|| []).length} \xB7 \u516C\u9700\u8BFE ${(n.gxCourses||[]).length}\uFF08\u6B63\u5728\u540C\u6B65\u7AE0\u8282\u8FDB\u5EA6\u2026\uFF09`, "info"),t&&t.length&&(await je(t,()=>{D(),O(),E()}),D(),O(),p(`\u8FDB\u5EA6\u5DF2\u540C\u6B65 \xB7 \u4E13\u4E1A\u8BFE ${(n. zyCourses||[]).length} \xB7 \u516C\u9700\u8BFE ${(n.gxCourses||[]).length}`,"info"),E())}catch(t){let o=t&&t.message?t.message: String(t);throw p(`\u52A0\u8F7D\u8BFE\u7A0B\u5931\u8D25: ${o}`,"error"),e&&$(e,`
\u52A0\u8F7D\u5931\u8D25
${j(o)}
\u8BF7\u786E\u8BA4\u5DF2\u767B\u5F55\u672C\u7AD9\u540E\u70B9\u300C\u5237\u65B0\u8BFE\u7A0B\u300D
`),t}}function _t(){ let e=document.getElementById("nmg-panel-host");e&&e.remove(),be(null)}function ue(){document.getElementById("jslpa-guid\ e-panel")?.remove(),document.getElementById("jslpa-guide-style")?.remove()}function dn(){if(document.getElementById("jsl\ pa-guide-style")||!document.head)return;let e=document.createElement("style");e.id="jslpa-guide-style",e.textContent=` #jslpa-guide-panel{position:fixed;right:20px;top:80px;z-index:999999;width:360px;background:#f4f7fb;border:1px solid\ #dbe4f0;border-radius:16px;box-shadow:0 16px 40px rgba(15,23,42,.17);font-family:-apple-system,BlinkMacSystemFont,"Sego\ e UI",Roboto,"PingFang SC","Microsoft YaHei",sans-serif;color:#0f172a;overflow:hidden;} #jslpa-guide-panel .jslpa-guide-hd{display:flex;align-items:center;gap:8px;padding:10px 12px;background:linear-gradi\ ent(180deg,#eff6ff,#e0f2fe);border-bottom:1px solid #dbe4f0;cursor:move;user-select:none;} #jslpa-guide-panel .jslpa-guide-hd img{width:28px;height:28px;border-radius:8px;object-fit:cover;border:1px solid rg\ ba(148,163,184,.45);background:#fff;} #jslpa-guide-panel .jslpa-guide-title{font-size:13px;font-weight:900;color:#1d4ed8;} #jslpa-guide-panel .jslpa-guide-bd{padding:12px;font-size:12px;line-height:1.55;color:#334155;} #jslpa-guide-panel .jslpa-guide-bd h4{margin:0 0 8px;font-size:13px;color:#0f172a;} #jslpa-guide-panel .jslpa-guide-bd ol{margin:0 0 10px;padding-left:18px;} #jslpa-guide-panel .jslpa-guide-bd li{margin:4px 0;} #jslpa-guide-panel .jslpa-guide-tip{background:#eff6ff;border:1px solid #bfdbfe;border-radius:10px;padding:8px 10px;\ color:#1e40af;font-weight:700;} #jslpa-guide-panel .jslpa-guide-actions{display:flex;gap:8px;margin-top:10px;} #jslpa-guide-panel .jslpa-guide-btn{flex:1;border:none;border-radius:10px;padding:8px 10px;font-weight:800;cursor:po\ inter;background:linear-gradient(135deg,#1d4ed8,#0ea5e9);color:#fff;} #jslpa-guide-panel .jslpa-guide-btn.ghost{background:#fff;color:#0f172a;border:1px solid #cbd5e1;} `,document.head.appendChild(e)}function Et(){if(document.getElementById("jslpa-guide-panel"))return;dn();let e=document. createElement("div");e.id="jslpa-guide-panel",e.innerHTML=`
\u8BF7\u5230\u300C\u6211\u7684\u8BFE\u7A0B\u300D\u4F7F\u7528\u52A9\u624B

\u4F7F\u7528\u8BF4\u660E

  1. \u6253\u5F00\u5DE6\u4FA7/\u9876\u90E8\u83DC\u5355\u8FDB\u5165 \u6211\u7684\u8BFE\u7A0B
  2. \u5730\u5740\u9700\u4E3A /UserView/CourseList
  3. \u4EC5\u5728\u8BE5\u9875\u542F\u52A8\u5B8C\u6574\u5B66\u4E60\u9762\u677F\uFF1B\u5176\u4ED6\u9875\u9762\u4E0D\u8FD0\u884C
\u8BF7\u5148\u767B\u5F55\u534F\u4F1A\u7F51\u7AD9\uFF0C\u518D\u8FDB\u5165\u300C\u6211\u7684\u8BFE\u7A0B\u300D\u52FE\u9009\u8BFE\u7A0B\u5E76\u5F00\u59CB\u3002
`,document.body.appendChild(e);let t=e.querySelector("#jslpa-guide-drag"),o=!1,r=0,s=0,a=0,i=0;t?.addEventListener("mo\ usedown",l=>{if(l.button!==0)return;o=!0;let d=e.getBoundingClientRect();r=l.clientX,s=l.clientY,a=d.left,i=d.top,l.preventDefault()}), window.addEventListener("mousemove",l=>{o&&(e.style.left=`${Math.max(8,a+l.clientX-r)}px`,e.style.top=`${Math.max(8,i+l. clientY-s)}px`,e.style.right="auto")}),window.addEventListener("mouseup",()=>{o=!1}),e.querySelector("#jslpa-guide-go")?. addEventListener("click",()=>{location.href=Ue()}),e.querySelector("#jslpa-guide-hide")?.addEventListener("click",()=>{e. remove()})}function vt(e,t,o){ue();let r=document.getElementById("nmg-panel-host");r&&r.remove();let s=document.createElement( "div");s.id="nmg-panel-host",document.body.appendChild(s);let a=s.attachShadow({mode:"closed"});ln(a);let i=document.createElement( "div");a.appendChild(i),be(i);let l=n.remotePanelNotice||Fe,d=String(typeof GM_info<"u"&&GM_info?.script?.version||"").trim(), u=document.createElement("div");u.id="nmg-auto-panel",u.className="zjzx-panel-max",u.innerHTML=`
${j(qe)}\ v${j(d)}
\u4E00\u952E\u5B8C\u6210\u89C6\u9891\u5B66\u65F6\xB7\u5B66\u5B8C\u81EA\u52A8\u8003\u8BD5\xB7\u7701\u65F6\u7701\u5FC3
\u8FD0\u884C\u72B6\u6001 \u5DF2\u505C\u6B62
0/0 \u89C6\u9891\u5DF2\u5B66\u4E60 \xB7 \u8003\u8BD5 \u2014
0%
\u4E13\u4E1A\u8BFE
\u4E13\u4E1A
\u6B63\u5728\u52A0\u8F7D\u4E13\u4E1A\u8BFE\u2026
\u516C\u9700\u8BFE
\u516C\u9700
\u6B63\u5728\u52A0\u8F7D\u516C\u9700\u8BFE\u2026
\u8FD0\u884C\u65E5\u5FD7
\u5B9E\u65F6\u65E5\u5FD7
\u5347\u7EA7\u4E13\u4E1A\u7248
\u514D\u8D39\u53EF\u4F53\u9A8C ${n.freeCourseLimit} \u95E8\u8BFE\uFF08\u542B\u89C6\u9891\u5B66\u65F6\u4E0E\u8BFE\u540E\u8003\u8BD5\uFF09\uFF1B\u4E13\u4E1A\u7248\u4E0D\u9650\u8BFE\u7A0B\ \u6570\uFF0C\u6FC0\u6D3B\u540E\u7EA6 30 \u5929\u6709\u6548\u3002
\u7ACB\u5373\u8D2D\u4E70\u4E13\u4E1A\u7248
\u4E13\u4E1A\u7248\u4F1A\u5458
\u4F1A\u5458\u72B6\u6001\u52A0\u8F7D\u4E2D\u2026
\u6FC0\u6D3B\u7801
\u5F53\u524D\u8BFE\u7A0B\u65E0
\u5F53\u524D\u7AE0\u8282\u65E0
\u5F53\u524D\u4EFB\u52A1\u70B9\u5F00\u59CB\u540E\u81EA\u52A8\u63D0\u4EA4
`,i.appendChild(u);let x=F(z.panelPos,null);x&&x.left!=null&&(u.style.left=`${x.left}px`,u.style.top=`${x.top}px`,u.style. right="auto"),Ae(u,!!GM_getValue(z.collapsed,!1)),an(u),m("nmg-btn-min")?.addEventListener("click",c=>{c.stopPropagation(), GM_setValue(z.collapsed,!0),Ae(u,!0)}),m("nmg-btn-max")?.addEventListener("click",c=>{c.stopPropagation(),GM_setValue(z. collapsed,!1),Ae(u,!1)}),u.querySelectorAll(".zjzx-tab-btn").forEach(c=>{c.addEventListener("click",()=>sn(c.dataset.tab))}), m("nmg-clear-log")?.addEventListener("click",()=>{n.logs=[],ce()}),m("nmg-select-all")?.addEventListener("click",Ze),m("\ nmg-deselect-all")?.addEventListener("click",et),m("nmg-refresh-courses")?.addEventListener("click",()=>{wt().catch(()=>{})}), m("nmg-start").addEventListener("click",bt),m("nmg-stop").addEventListener("click",le),m("nmg-join-qq")?.addEventListener( "click",()=>{try{window.open(He,"_blank")}catch{}});let g=m("nmg-cloud-token");g&&(g.value=n.cloudToken||""),m("nmg-save\ -token")?.addEventListener("click",async()=>{let c=m("nmg-save-token");if(c&&c.dataset.busy==="1")return;c&&(c.dataset.busy= "1",c.disabled=!0);let f=String(g?.value||"").trim();n.cloudToken=f,f?localStorage.setItem(L,f):localStorage.removeItem( L),V("",0),n.cloudLease="";try{f&&await at(),await ae(!0),p(f?`\u6FC0\u6D3B\u7801\u5DF2\u4FDD\u5B58 \xB7 ${n.cloudTier=== "pro"?"\u4E13\u4E1A\u7248":"\u514D\u8D39\u7248"}`:"\u5DF2\u6E05\u9664\u6FC0\u6D3B\u7801","info")}catch(b){n.cloudTier=f? "unknown":"free",S(),p(`\u4FDD\u5B58\u5931\u8D25: ${b.message||b}`,"error")}finally{c&&(c.dataset.busy="0",c.disabled=!1)}}), m("nmg-clear-token")?.addEventListener("click",async()=>{n.cloudToken="",localStorage.removeItem(L),V("",0),n.cloudLease= "",n.cloudProExpireAt=0,g&&(g.value="");try{await ae(!0),p("\u5DF2\u5207\u6362\u4E3A\u514D\u8D39\u7248","info")}catch(c){ n.cloudTier="free",S(),p(`\u5237\u65B0\u5931\u8D25: ${c.message||c}`,"error")}}),ce(),E(),S(),zt=e,yt=t,ht(zt,yt),wt().catch( c=>p(`\u52A0\u8F7D\u8BFE\u7A0B\u5931\u8D25: ${c.message}`,"error")).finally(()=>{ae(!0).catch(c=>{n.cloudTier=n.cloudToken? "unknown":"free",S(),p(`\u4F1A\u5458\u72B6\u6001\u540C\u6B65\u5931\u8D25: ${c.message||c}`,"error")})})}function Ct(e){if(typeof e!="function")return()=>{};let t="__JSLPA_SPA_ROUTE_WATCH__";if(window[t])return window[t];let o=`${location. pathname}${location.search}${location.hash}`,r=()=>{let a=`${location.pathname}${location.search}${location.hash}`;if(a!== o){o=a;try{e()}catch{}}},s=a=>function(...i){let l=a.apply(this,i);return queueMicrotask(r),l};try{history.pushState=s(history. pushState.bind(history)),history.replaceState=s(history.replaceState.bind(history))}catch{}return window.addEventListener( "popstate",r),window.addEventListener("hashchange",r),window[t]=()=>{window.removeEventListener("popstate",r),window.removeEventListener( "hashchange",r)},window[t]}var St="jslpa-hide-rules-modal",un="modalTime";function pe(){let e=new Date,t={year:e.getFullYear(),mounth:e.getMonth()+ 1,date:e.getDate(),toggle:1};try{localStorage.setItem(un,JSON.stringify(t))}catch{}}function pn(){if(document.getElementById( St)||!document.head)return;let e=document.createElement("style");e.id=St,e.textContent=` #alert2022, #alert2022.el-dialog, .el-dialog__wrapper:has(#alert2022), .v-modal:has(+ .el-dialog__wrapper #alert2022) { display: none !important; visibility: hidden !important; pointer-events: none !important; } `,document.head.appendChild(e)}function Ie(){pe();let e=document.getElementById("alert2022");if(e){let o=e.closest(".e\ l-dialog__wrapper")||e;o.style.display="none";let r=document.querySelector(".v-modal");r&&(r.style.display="none")}let t=document. querySelectorAll("a, button, .el-button, span");for(let o of t){let r=String(o.textContent||"").trim();if(r==="\u4ECA\u65E5\u4E0D\u518D\u63D0\u793A"|| r==="\u6211\u77E5\u9053\u4E86"){try{o.click()}catch{}if(r==="\u4ECA\u65E5\u4E0D\u518D\u63D0\u793A")break}}}function kt(){ if(window.__JSLPA_RULES_SUPPRESS__)return;window.__JSLPA_RULES_SUPPRESS__=!0;let e=()=>{pe(),pn(),Ie()};e(),document.readyState=== "loading"&&document.addEventListener("DOMContentLoaded",e,{once:!0});let t=0,o=setInterval(()=>{Ie(),++t>=40&&clearInterval( o)},500);try{new MutationObserver(()=>{document.getElementById("alert2022")&&Ie()}).observe(document.documentElement,{childList:!0, subtree:!0})}catch{}setInterval(pe,1800*1e3),document.addEventListener("visibilitychange",()=>{document.visibilityState=== "visible"&&pe()})}var Lt=!1,K=!1,Re=null;function fn(){Lt||(Lt=!0,Ye(ce),rt(W),ut({upd:E,exam:mt,hint:de,clear:X}),ft(E),gt({upd:E,hint:de, clear:X,lists:()=>{D(),O()}}),Ke(()=>{X(),D(),O(),E()}))}function mn(){if(K||!Re)return;K=!0,window[Q]=fe,ue(),fn(),Qe(); let{Vue:e,Pinia:t,DOMPurify:o}=Re,r=()=>vt(e,t,o);document.readyState==="loading"?document.addEventListener("DOMContentL\ oaded",r,{once:!0}):r(),n.enabled&&setTimeout(()=>{K&&me()&&Me()},1200)}function xn(){if(K){try{(n.enabled||n.running)&& le()}catch{}_t(),K=!1;try{delete window[Q]}catch{window[Q]=void 0}}}function $t(){if(me()){ue(),mn();return}xn();let e=()=>Et(); document.readyState==="loading"?document.addEventListener("DOMContentLoaded",e,{once:!0}):e()}function gn(e,t,o,r){window. top===window.self&&(window.__JSLPA_ENTRY__||(window.__JSLPA_ENTRY__=fe,Re={Vue:e,DOMPurify:t,Pinia:o,CryptoJS:r},kt(),$t(), Ct($t)))}gn(Vue,DOMPurify,Pinia,CryptoJS);})(); })(Vue,DOMPurify,Pinia,CryptoJS);