PageSourceSearch

https://chiichen.github.io/assets/app-BNrZTL3A.js

js chiichen.github.io collected 2026-10-03 08:47:24 UTC 595,889 bytes, 2,946 lines download raw bytes

1const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/index.html-YETGA09y.js","assets/plugin-vue_export-helper-DlAUqK2U.js","assets/intro.html-aAcg9F57.js","assets/index.html-C_5r_V8B.js","assets/intro.html-C8VhyVo5.js","assets/index.html-wZV3AXFP.js","assets/index.html-orl_LX3C.js","assets/template.html-CbudOp4G.js","assets/template.html-RpriovyG.js","assets/Electromagnetic-Formula.html-Ct6h15Yg.js","assets/index.html-C5cYkuMx.js","assets/Chapter0-Introduce.html-zLloqbXE.js","assets/Chapter1-Compiler-composition .html-CRiNvmmb.js","assets/Chapter2-Lexical-Analysis.html-4a5iRaBc.js","assets/Chapter3-Gramma-Analysis.html-CJ1KHEVw.js","assets/Chapter4-Semantic-Analysis.html-C2ivyV1y.js","assets/Chapter5-Code-Generation.html-BLBI86od.js","assets/index.html--zYO5N0J.js","assets/Chapter1-Internet-And-Ethernet.html-CVNSgBWS.js","assets/Chapter2-Application-Layer.html-DiYt4uUu.js","assets/Chapter3-Transport-Layer.html-EEmYTEPq.js","assets/Chapter4-Net-Layer.html-DO6HRWX2.js","assets/Chapter5-Link-Layer.html-CZfnQgFZ.js","assets/Computer-Network-7th-Edition-Exercises-Answers.html-C2vBqRv0.js","assets/index.html-Cz2XHtDk.js","assets/Chapter1-Introduction.html-BmUt9feG.js","assets/Chapter10-Storage-and-File-Structure.html-BD2EFUFn.js","assets/Chapter11-Indexing-and-Hashing.html-BCobjAFz.js","assets/Chapter12-Query-Processing.html-BTpqqk7t.js","assets/Chapter13-Query-Optimization.html-Ds0TlEug.js","assets/Chapter14-Transactions.html-Do1UJBDn.js","assets/Chapter15-Concurrency-Control.html-oH4rfM1X.js","assets/Chapter16-Recovery-System.html-9aqHeeTm.js","assets/Chapter2-Introduction-to-Relational-Model.html-QWRm3XbA.js","assets/Chapter3-Introduction-to-SQL.html-uUemDQdX.js","assets/Chapter6-Formal-Relational-Query-Languages.html-ZpeRKUwN.js","assets/Chapter7-Entity-Relationship-Model.html-BR11w4YK.js","assets/Chapter8-Relational-Database-Design.html-Cd9mroBM.js","assets/index.html-DDBQmvzP.js","assets/index.html-DJRtN_cA.js","assets/Review-Note.html-UzDGg65g.js","assets/Chapter1-Introdction.html-DKi-mysd.js","assets/Chapter2-Processes-and-Threads.html-BBMWQXw5.js","assets/Chapter3-Memory-Management.html-BSXxX_md.js","assets/Chapter4-File-System.html-DnRsjsRm.js","assets/Chapter5-IO.html-B79Xt5HR.js","assets/Chapter6-Deadlocks.html-d4eNqaWK.js","assets/index.html-Cwq2JqA1.js","assets/2019-Review-Notes.html-CkXHUa4C.js","assets/Chapter1-Indroduction.html-BPrIGoZm.js","assets/Chapter10-Project-Communication-Management.html-KG8ZURhF.js","assets/Chapter11-Project-Risk-Management.html-B5_od_73.js","assets/Chapter12-Project-Precurement-Management.html-aYpUx7Y2.js","assets/Chapter13-Project-Stakeholder-Management.html-DxE_7n5G.js","assets/Chapter2-Project-Management-and-IT-Environment.html-DxLrzPxF.js","assets/Chapter3-Project-Management-Process-group.html-CgsJO5ou.js","assets/Chapter4-Project-Integration-Management.html-Dg4CcYwE.js","assets/Chapter5-Project-Scope-Management.html-CPs_fApU.js","assets/Chapter6-Project-Schedule-Management.html-BFCROfr7.js","assets/Chapter7-Project-Cost-Management.html-CwEKh27c.js","assets/Chapter8-Project-Quality-Management.html-BEwwAJpa.js","assets/Chapter9-Project-Resource-Management.html-CVLH9bts.js","assets/index.html-DHLTjJrB.js","assets/Chapter1-Basic-Concepts-of-Software-Testing.html-DIinpS3J.js","assets/Chapter2-Software-Testing-Technology.html-BiCWr4XU.js","assets/Chapter3-Software-Testing-Process.html-D1VP-ocs.js","assets/Chapter4-Software-Testing-Management.html-kuhZXlEV.js","assets/Chapter5-Software-Maintenance.html-Dz7VYXMI.js","assets/index.html-DKJGOq3o.js","assets/Review-Quick-Note.html-D09ctbIQ.js","assets/Chapter0绪论.html-Cf8iocsm.js","assets/Chapter10可测试性.html-BR-MHCjD.js","assets/Chapter11易用性.html-JQEMGUfq.js","assets/Chapter12其它质量属性.html-61VrjwPO.js","assets/Chapter13模式和策略.html-D72jS6dv.js","assets/image-3-CtzX0pUA.js","assets/Chapter14质量属性建模与分析.html-DWfFXtub.js","assets/Chapter15敏捷项目中的架构.html-Bkjoy4Ok.js","assets/Chapter16架构与需求.html-Bc2EUejs.js","assets/Chapter17设计架构.html-DdaZGzkn.js","assets/Chapter19架构实现与测试.html-C2d-mrD8.js","assets/Chapter1什么是软件架构.html-DM5B1e-c.js","assets/Chapter2为什么软件架构重要.html-CXxPrrsY.js","assets/Chapter4理解质量属性.html-CWvS2nIB.js","assets/Chapter5可用性.html-BWIuLm5C.js","assets/Chapter6互操作性.html-DA7mdhu4.js","assets/Chapter7可修改性.html-V8seVc_v.js","assets/Chapter8性能.html-BgdVwN9c.js","assets/Chapter9安全性.html-BwhWm9cC.js","assets/Chpater21架构评估.html-DER5W5Dp.js","assets/复习提纲.html-Cb1gC5vk.js","assets/DragonOS招新任务.html-DebaNl3R.js","assets/NUMA Balance实现浅析.html-CJnJNNCO.js","assets/NUMA Balancing.html-594LRFJm.js","assets/vscode qemu开发Linux内核.html-DU_4D5Dq.js","assets/Common-rust-lifetime-misconceptions.html-BmPpfRw_.js","assets/Inlinable-dyn-extension-traits.html-CpyLiZ7n.js","assets/Type-erase-via-trait.html-DVRKJY1f.js","assets/index.html-DaeLZXUD.js","assets/gRPC-introduction.html-ClWVgZr3.js","assets/Application-of-decltype-auto.html-B1yndWPT.js","assets/index.html-CcgJUhsW.js","assets/Chapter0前言.html-BEapDesS.js","assets/Chapter1词法分析器之Chumsky.html-D18RPp2k.js","assets/HelloWorld.html-FT0WdztZ.js","assets/微信底层解析.html-DLEVaEax.js","assets/Electrostatic-energy-of-a-solid-charged-sphere.html-BAnUstYA.js","assets/index.html-DTX_nWsL.js","assets/LWN针对多层内存系统重新进行NUMA平衡.html-B3xNoTfT.js","assets/LinuxKernelMap.html-DBz3k1as.js","assets/Ubuntu编译安装内核.html-DWJni9H0.js","assets/SurfaceView异常释放.html-D3pSHZn_.js","assets/could not dial endpoint 'orderer-api.127-0-0-1.nip.io.html-B9S6p0tU.js","assets/edition设置引起的rust编译器报错.html-DCyO_3UL.js","assets/解决MacOS中找不到头文件的问题.html-BuSu4aDl.js","assets/记一次 GP Debug 的心路历程.html-DKgY-2V3.js","assets/Github中配置Cargo项目的Workflow.html-Bp1r6YZC.js","assets/基于Ninja的代码Intellisense实践.html-RaPkYtGB.js","assets/解决在VSCode里刷Leetcode的重定义问题.html-Pu1uauDE.js","assets/震惊!1等于0.html-BTaJn2kQ.js","assets/高级语言的编译-链接及装载过程介绍.html-BBVdeFB2.js","assets/腾讯WXG日常实习面经.html-t4L0aPqW.js","assets/UML复习简记.html-C7U9xO5g.js","assets/电磁学公式.html-7ziO2EOh.js","assets/Chapter1-Introdction.html-B__qhFlX.js","assets/Chapter2-Processes-and-Threads.html-DRJhN5_I.js","assets/Chapter3-Memory-Management.html-C2yO3c8r.js","assets/Chapter4-File-System.html-BTI51gel.js","assets/Chapter5-IO.html-BeL5vIwd.js","assets/Chapter6-Deadlocks.html-TQLDNWF4.js","assets/Chapter1 Introduction.html-BGLjWyB0.js","assets/Chapter10 Storage and File Structure.html-C4zoWWkk.js","assets/Chapter11 Indexing and Hashing.html-BuXIkMxb.js","assets/Chapter12 Query Processing.html-BwshKEqi.js","assets/Chapter13 Query Optimization.html-DuMUukBk.js","assets/Chapter14 Transactions.html-DyNZsLXI.js","assets/Chapter15 Concurrency Control.html-BLTQuU_A.js","assets/Chapter16 Recovery System.html-DrbLf4jM.js","assets/Chapter2 Introduction to Relational Model.html-CWDePNbl.js","assets/Chapter3 Introduction to SQL.html-PcqjKvp6.js","assets/Chapter6 Formal Relational Query Languages.html-C-CITR3-.js","assets/Chapter7 Entity-Relationship Model.html-C3dlxV0o.js","assets/Chapter8 Relational Database Design.html-DaWwIQxe.js","assets/电工å
1¤ä¹ ç¬”è®°.html-D67YF8SQ.js","assets/Chapter0 前言.html-LuZz2PZL.js","assets/Chapter1 编译器组成.html-Fn_pQS-w.js","assets/Chapter2 词法分析.html-CzVGFKgE.js","assets/Chapter3 语法分析.html-Bh-3ADnE.js","assets/Chapter4 语义分析.html-B7PXGMZB.js","assets/Chapter5 代码生成.html-CVjCAUHG.js","assets/Chapter1-Internet-And-Ethernet.html-C-9Xuq8Z.js","assets/Chapter2-Application-Layer.html-WZ4AZRAj.js","assets/Chapter3-Transport-Layer.html-bNDEImbC.js","assets/Chapter4-Net-Layer.html-BP2JUK_8.js","assets/Chapter5-Link-Layer.html-CIpTQANk.js","assets/计算机网络习题答案.html-PrKfTcSr.js","assets/Chapter0绪论.html-Yo0SUuMY.js","assets/Chapter10可测试性.html-CWujBN8I.js","assets/Chapter11易用性.html-CfzfMm5s.js","assets/Chapter12其它质量属性.html-XT_VYprB.js","assets/Chapter13模式和策略.html-EbsDQoc9.js","assets/image-3-BN3ZsJbc.js","assets/Chapter14质量属性建模与分析.html-CDxajzAQ.js","assets/Chapter15敏捷项目中的架构.html-b5ZeM0am.js","assets/Chapter16架构与需求.html-f89X53UU.js","assets/Chapter17设计架构.html-BHqDbf5H.js","assets/Chapter19架构实现与测试.html-DbiylV6Z.js","assets/Chapter1什么是软件架构.html-9fwLXsLk.js","assets/Chapter2为什么软件架构重要.html-BXvmwIc8.js","assets/Chapter4理解质量属性.html-Gs6mp7Xo.js","assets/Chapter5可用性.html-CGNRizp9.js","assets/Chapter6互操作性.html-xI7XGjta.js","assets/Chapter7可修改性.html-BSexyxlF.js","assets/Chapter8性能.html-Chumtrc7.js","assets/Chapter9安全性.html-C-0F27pz.js","assets/Chpater21架构评估.html-D3Xv5gSL.js","assets/复习提纲.html-H28RAhJM.js","assets/2019_IT项目管理_复习笔记.html-BAXM3ljW.js","assets/第10章项目沟通管理.html-C0LGDNJ3.js","assets/第11章项目风险管理.html-DJYAejeM.js","assets/第12章项目采购管理.html-Cjku4GUD.js","assets/第13章项目干系人管理.html-OlNmkdFw.js","assets/第1章项目管理概述.html-CwfUdhDk.js","assets/第2章项目管理与IT环境.html-B1wrGF24.js","assets/第3章项目管理过程组.html-DV1DJigE.js","assets/第4章项目整合管理.html-TSXiMNjo.js","assets/第5章项目范围管理.html-D7p1W_8m.js","assets/第6章项目进度管理.html-CwJo0WPY.js","assets/第7章项目成本管理.html-DXGdGUPF.js","assets/第8章项目质量管理.html-DIKn7aO8.js","assets/第9章项目资源管理.html-B3BBa8Iz.js","assets/eBPF开发入门.html--jgOkGqr.js","assets/eBPF进阶.html-DOoMWt7o.js","assets/parsec3.0介绍和安装.html-yqyt2yCI.js","assets/实心带点球体静电能的推导.html-BQSQ619B.js","assets/404.html-DV9s1QPM.js","assets/index.html-Dcg9IgOc.js","assets/index.html-DpWoDPUH.js","assets/index.html-D1NgC7iz.js","assets/index.html-Cnz2Q9dZ.js","assets/index.html-BKRjkylM.js","assets/index.html-BkxL9G7_.js","assets/index.html-B1Yh9mmK.js","assets/index.html-FTmIUoTB.js","assets/index.html-ATb4HyhK.js","assets/index.html-BQK6UsSw.js","assets/index.html-DrOCFIpg.js","assets/index.html-DBU1K_mw.js","assets/index.html-DBryfvtk.js","assets/index.html-DSDCueEQ.js","assets/index.html-DkvAVC3c.js","assets/index.html-CVbIAoDQ.js","assets/index.html-DpgRwehu.js","assets/index.html-CSsf5bFD.js","assets/index.html-D27VIWIF.js","assets/index.html-B_kOGNbv.js","assets/index.html-DU0KML1V.js","assets/index.html-D1rkzPei.js","assets/index.html-C8lvctGT.js","assets/index.html-CwQr9tB-.js","assets/index.html-BjU-G-oI.js","assets/index.html-BBVwDLPB.js","assets/index.html-wjaD3daL.js","assets/index.html-B7zE7Q9s.js","assets/index.html-D_vQFdsU.js","assets/index.html-DilxTCk_.js","assets/index.html-CnZ45Uuc.js","assets/index.html-DZ5tg3ni.js","assets/index.html-jU68d02k.js","assets/index.html-k3YCqsy5.js","assets/index.html-CNhZRGSk.js","assets/index.html-DcQYggPt.js","assets/index.html-CCI9xwiK.js","assets/index.html-8lTzfNMG.js","assets/index.html-D6QDlfNa.js","assets/index.html-jVqdmdpt.js","assets/index.html-qpuhgllv.js","assets/index.html-BOjteK4x.js","assets/index.html-BHW9IgeH.js","assets/index.html-qePvQ5JA.js","assets/index.html-qGyZD0wt.js","assets/index.html-DQp6ZkyO.js","assets/index.html-DAKoyw8C.js","assets/index.html-BnRWuDam.js","assets/index.html-DeeWx8t7.js","assets/index.html-WMK7AWly.js","assets/index.html-CKDsLbz3.js","assets/index.html-CB2lTQ_q.js","assets/index.html-C9tyrsGX.js","assets/index.html-CdKNtx-B.js","assets/index.html-CzZ4JKQL.js","assets/index.html-DYfJMyxV.js","assets/index.html-DriE9wDH.js","assets/index.html-D95HKI4r.js","assets/index.html-C7tk-ejl.js","assets/index.html-BwgW4E-j.js","assets/index.html-9VhO3xlj.js","assets/index.html-DAhHl2op.js","assets/index.html-xA0eyb6O.js","assets/index.html-C_eX1Ynf.js","assets/index.html-DOKQ2ISX.js","assets/index.html-BORN9I3_.js","assets/index.html-CWT09Wu0.js","assets/index.html-C2nAykk6.js","assets/index.html--g6J5k6Z.js","assets/index.html-wVhHts_p.js","assets/index.html-OpyBQpG0.js","assets/index.html-CB9YnIe0.js","assets/index.html-Ca_BYD7r.js","assets/index.html-C2iVoXbw.js","assets/index.html-Bj_yKuof.js","assets/index.html-BWCouv6v.js","assets/index.html-DGmpymMc.js","assets/index.html-l9UggtWt.js","assets/index.html-B--YBRDl.js","assets/index.html-BIfAGlxE.js","assets/index.html-BUSptF5Z.js","assets/index.html-BD22xLUY.js","assets/index.html-ByAT6Nhr.js","assets/index.html-M6CCUenj.js","assets/index.html-BxTkUZy6.js","assets/index.html-BgP9Haxr.js","assets/index.html-W-jWEkAG.js","assets/BlurText-BDLINKHs.js"])))=>i.map(i=>d[i]);
2/**
3* @vue/shared v3.5.12
4* (c) 2018-present Yuxi (Evan) You and Vue contributors
5* @license MIT
6**//*! #__NO_SIDE_EFFECTS__ */function Wa(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const ke={},Un=[],It=()=>{},Qp=()=>!1,Fi=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Ga=e=>e.startsWith("onUpdate:"),Ne=Object.assign,qa=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Yp=Object.prototype.hasOwnProperty,Ee=(e,t)=>Yp.call(e,t),ne=Array.isArray,Wn=e=>Bl(e)==="[object Map]",yo=e=>Bl(e)==="[object Set]",le=e=>typeof e=="function",Le=e=>typeof e=="string",dn=e=>typeof e=="symbol",Te=e=>e!==null&&typeof e=="object",_o=e=>(Te(e)||le(e))&&le(e.then)&&le(e.catch),bo=Object.prototype.toString,Bl=e=>bo.call(e),Jp=e=>Bl(e).slice(8,-1),ko=e=>Bl(e)==="[object Object]",Ka=e=>Le(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Gn=Wa(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),yl=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},Xp=/-(\w)/g,et=yl(e=>e.replace(Xp,(t,n)=>n?n.toUpperCase():"")),Zp=/\B([A-Z])/g,Fn=yl(e=>e.replace(Zp,"-$1").toLowerCase()),Si=yl(e=>e.charAt(0).toUpperCase()+e.slice(1)),Vl=yl(e=>e?`on${Si(e)}`:""),cn=(e,t)=>!Object.is(e,t),Nl=(e,...t)=>{for(let n=0;n<e.length;n++)e[n](...t)},Co=(e,t,n,i=!1)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:i,value:n})},ed=e=>{const t=parseFloat(e);return isNaN(t)?e:t},td=e=>{const t=Le(e)?Number(e):NaN;return isNaN(t)?e:t};let Gr;const _l=()=>Gr||(Gr=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Qa(e){if(ne(e)){const t={};for(let n=0;n<e.length;n++){const i=e[n],l=Le(i)?ad(i):Qa(i);if(l)for(const a in l)t[a]=l[a]}return t}else if(Le(e)||Te(e))return e}const nd=/;(?![^(]*\))/g,id=/:([^]+)/,ld=/\/\*[^]*?\*\//g;function ad(e){const t={};return e.replace(ld,"").split(nd).forEach(n=>{if(n){const i=n.split(id);i.length>1&&(t[i[0].trim()]=i[1].trim())}}),t}function Ya(e){let t="";if(Le(e))t=e;else if(ne(e))for(let n=0;n<e.length;n++){const i=Ya(e[n]);i&&(t+=i+" ")}else if(Te(e))for(const n in e)e[n]&&(t+=n+" ");return t.trim()}const rd="itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly",sd=Wa(rd);function Do(e){return!!e||e===""}const To=e=>!!(e&&e.__v_isRef===!0),od=e=>Le(e)?e:e==null?"":ne(e)||Te(e)&&(e.toString===bo||!le(e.toString))?To(e)?od(e.value):JSON.stringify(e,wo,2):String(e),wo=(e,t)=>To(t)?wo(e,t.value):Wn(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[i,l],a)=>(n[$l(i,a)+" =>"]=l,n),{})}:yo(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>$l(n))}:dn(t)?$l(t):Te(t)&&!ne(t)&&!ko(t)?String(t):t,$l=(e,t="")=>{var n;return dn(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/**
7* @vue/reactivity v3.5.12
8* (c) 2018-present Yuxi (Evan) You and Vue contributors
9* @license MIT
vendor: 5,943 bytes, line 10
10**/let qe;class cd{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=qe,!t&&qe&&(this.index=(qe.scopes||(qe.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t<n;t++)this.scopes[t].pause();for(t=0,n=this.effects.length;t<n;t++)this.effects[t].pause()}}resume(){if(this._active&&this._isPaused){this._isPaused=!1;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t<n;t++)this.scopes[t].resume();for(t=0,n=this.effects.length;t<n;t++)this.effects[t].resume()}}run(t){if(this._active){const n=qe;try{return qe=this,t()}finally{qe=n}}}on(){qe=this}off(){qe=this.parent}stop(t){if(this._active){let n,i;for(n=0,i=this.effects.length;n<i;n++)this.effects[n].stop();for(n=0,i=this.cleanups.length;n<i;n++)this.cleanups[n]();if(this.scopes)for(n=0,i=this.scopes.length;n<i;n++)this.scopes[n].stop(!0);if(!this.detached&&this.parent&&!t){const l=this.parent.scopes.pop();l&&l!==this&&(this.parent.scopes[this.index]=l,l.index=this.index)}this.parent=void 0,this._active=!1}}}function xo(){return qe}function ud(e,t=!1){qe&&qe.cleanups.push(e)}let be;const jl=new WeakSet;class Fo{constructor(t){this.fn=t,this.deps=void 0,this.depsTail=void 0,this.flags=5,this.next=void 0,this.cleanup=void 0,this.scheduler=void 0,qe&&qe.active&&qe.effects.push(this)}pause(){this.flags|=64}resume(){this.flags&64&&(this.flags&=-65,jl.has(this)&&(jl.delete(this),this.trigger()))}notify(){this.flags&2&&!(this.flags&32)||this.flags&8||Po(this)}run(){if(!(this.flags&1))return this.fn();this.flags|=2,qr(this),Ro(this);const t=be,n=bt;be=this,bt=!0;try{return this.fn()}finally{Lo(this),be=t,bt=n,this.flags&=-3}}stop(){if(this.flags&1){for(let t=this.deps;t;t=t.nextDep)Za(t);this.deps=this.depsTail=void 0,qr(this),this.onStop&&this.onStop(),this.flags&=-2}}trigger(){this.flags&64?jl.add(this):this.scheduler?this.scheduler():this.runIfDirty()}runIfDirty(){Ea(this)&&this.run()}get dirty(){return Ea(this)}}let So=0,fi,gi;function Po(e,t=!1){if(e.flags|=8,t){e.next=gi,gi=e;return}e.next=fi,fi=e}function Ja(){So++}function Xa(){if(--So>0)return;if(gi){let t=gi;for(gi=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;fi;){let t=fi;for(fi=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(i){e||(e=i)}t=n}}if(e)throw e}function Ro(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Lo(e){let t,n=e.depsTail,i=n;for(;i;){const l=i.prevDep;i.version===-1?(i===n&&(n=l),Za(i),pd(i)):t=i,i.dep.activeLink=i.prevActiveLink,i.prevActiveLink=void 0,i=l}e.deps=t,e.depsTail=n}function Ea(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Oo(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Oo(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===bi))return;e.globalVersion=bi;const t=e.dep;if(e.flags|=2,t.version>0&&!e.isSSR&&e.deps&&!Ea(e)){e.flags&=-3;return}const n=be,i=bt;be=e,bt=!0;try{Ro(e);const l=e.fn(e._value);(t.version===0||cn(l,e._value))&&(e._value=l,t.version++)}catch(l){throw t.version++,l}finally{be=n,bt=i,Lo(e),e.flags&=-3}}function Za(e,t=!1){const{dep:n,prevSub:i,nextSub:l}=e;if(i&&(i.nextSub=l,e.prevSub=void 0),l&&(l.prevSub=i,e.nextSub=void 0),n.subs===e&&(n.subs=i,!i&&n.computed)){n.computed.flags&=-5;for(let a=n.computed.deps;a;a=a.nextDep)Za(a,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function pd(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let bt=!0;const Io=[];function hn(){Io.push(bt),bt=!1}function En(){const e=Io.pop();bt=e===void 0?!0:e}function qr(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=be;be=void 0;try{t()}finally{be=n}}}let bi=0;class dd{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class bl{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0}track(t){if(!be||!bt||be===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==be)n=this.activeLink=new dd(be,this),be.deps?(n.prevDep=be.depsTail,be.depsTail.nextDep=n,be.depsTail=n):be.deps=be.depsTail=n,Mo(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const i=n.nextDep;i.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=i),n.prevDep=be.depsTail,n.nextDep=void 0,be.depsTail.nextDep=n,be.depsTail=n,be.deps===n&&(be.deps=i)}return n}trigger(t){this.version++,bi++,this.notify(t)}notify(t){Ja();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{Xa()}}}function Mo(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let i=t.deps;i;i=i.nextDep)Mo(i)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const ol=new WeakMap,kn=Symbol(""),fa=Symbol(""),ki=Symbol("");function ze(e,t,n){if(bt&&be){let i=ol.get(e);i||ol.set(e,i=new Map);let l=i.get(n);l||(i.set(n,l=new bl),l.map=i,l.key=n),l.track()}}function Ut(e,t,n,i,l,a){const r=ol.get(e);if(!r){bi++;return}const o=c=>{c&&c.trigger()};if(Ja(),t==="clear")r.forEach(o);else{const c=ne(e),d=c&&Ka(n);if(c&&n==="length"){const u=Number(i);r.forEach((p,h)=>{(h==="length"||h===ki||!dn(h)&&h>=u)&&o(p)})}else switch((n!==void 0||r.has(void 0))&&o(r.get(n)),d&&o(r.get(ki)),t){case"add":c?d&&o(r.get("length")):(o(r.get(kn)),Wn(e)&&o(r.get(fa)));break;case"delete":c||(o(r.get(kn)),Wn(e)&&o(r.get(fa)));break;case"set":Wn(e)&&o(r.get(kn));break}}Xa()}function hd(e,t){const n=ol.get(e);return n&&n.get(t)}function In(e){const t=pe(e);return t===e?t:(ze(t,"iterate",ki),kt(e)?t:t.map(Ke))}function er(e){return ze(e=pe(e),"iterate",ki),e}const Ed={__proto__:null,[Symbol.iterator](){return Hl(this,Symbol.iterator,Ke)}
vendor: 2,623 bytes, line 10
10,concat(...e){return In(this).concat(...e.map(t=>ne(t)?In(t):t))},entries(){return Hl(this,"entries",e=>(e[1]=Ke(e[1]),e))},every(e,t){return Vt(this,"every",e,t,void 0,arguments)},filter(e,t){return Vt(this,"filter",e,t,n=>n.map(Ke),arguments)},find(e,t){return Vt(this,"find",e,t,Ke,arguments)},findIndex(e,t){return Vt(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return Vt(this,"findLast",e,t,Ke,arguments)},findLastIndex(e,t){return Vt(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return Vt(this,"forEach",e,t,void 0,arguments)},includes(...e){return zl(this,"includes",e)},indexOf(...e){return zl(this,"indexOf",e)},join(e){return In(this).join(e)},lastIndexOf(...e){return zl(this,"lastIndexOf",e)},map(e,t){return Vt(this,"map",e,t,void 0,arguments)},pop(){return pi(this,"pop")},push(...e){return pi(this,"push",e)},reduce(e,...t){return Kr(this,"reduce",e,t)},reduceRight(e,...t){return Kr(this,"reduceRight",e,t)},shift(){return pi(this,"shift")},some(e,t){return Vt(this,"some",e,t,void 0,arguments)},splice(...e){return pi(this,"splice",e)},toReversed(){return In(this).toReversed()},toSorted(e){return In(this).toSorted(e)},toSpliced(...e){return In(this).toSpliced(...e)},unshift(...e){return pi(this,"unshift",e)},values(){return Hl(this,"values",Ke)}};function Hl(e,t,n){const i=er(e),l=i[t]();return i!==e&&!kt(e)&&(l._next=l.next,l.next=()=>{const a=l._next();return a.value&&(a.value=n(a.value)),a}),l}const fd=Array.prototype;function Vt(e,t,n,i,l,a){const r=er(e),o=r!==e&&!kt(e),c=r[t];if(c!==fd[t]){const p=c.apply(e,a);return o?Ke(p):p}let d=n;r!==e&&(o?d=function(p,h){return n.call(this,Ke(p),h,e)}:n.length>2&&(d=function(p,h){return n.call(this,p,h,e)}));const u=c.call(r,d,i);return o&&l?l(u):u}function Kr(e,t,n,i){const l=er(e);let a=n;return l!==e&&(kt(e)?n.length>3&&(a=function(r,o,c){return n.call(this,r,o,c,e)}):a=function(r,o,c){return n.call(this,r,Ke(o),c,e)}),l[t](a,...i)}function zl(e,t,n){const i=pe(e);ze(i,"iterate",ki);const l=i[t](...n);return(l===-1||l===!1)&&tr(n[0])?(n[0]=pe(n[0]),i[t](...n)):l}function pi(e,t,n=[]){hn(),Ja();const i=pe(e)[t].apply(e,n);return Xa(),En(),i}const gd=Wa("__proto__,__v_isRef,__isVue"),Vo=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(dn));function md(e){dn(e)||(e=String(e));const t=pe(this);return ze(t,"has",e),t.hasOwnProperty(e)}class No{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,i){const l=this._isReadonly,a=this._isShallow;if(n==="__v_isReactive")return!l;if(n==="__v_isReadonly")return l;if(n==="__v_isShallow")return a;
vendor: 8,060 bytes, lines 10-13
10if(n==="__v_raw")return i===(l?a?Wo:Uo:a?zo:Ho).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(i)?t:void 0;const r=ne(t);if(!l){let c;if(r&&(c=Ed[n]))return c;if(n==="hasOwnProperty")return md}const o=Reflect.get(t,n,Re(t)?t:i);return(dn(n)?Vo.has(n):gd(n))||(l||ze(t,"get",n),a)?o:Re(o)?r&&Ka(n)?o:o.value:Te(o)?l?Kt(o):Tn(o):o}}class $o extends No{constructor(t=!1){super(!1,t)}set(t,n,i,l){let a=t[n];if(!this._isShallow){const c=wn(a);if(!kt(i)&&!wn(i)&&(a=pe(a),i=pe(i)),!ne(t)&&Re(a)&&!Re(i))return c?!1:(a.value=i,!0)}const r=ne(t)&&Ka(n)?Number(n)<t.length:Ee(t,n),o=Reflect.set(t,n,i,Re(t)?t:l);return t===pe(l)&&(r?cn(i,a)&&Ut(t,"set",n,i):Ut(t,"add",n,i)),o}deleteProperty(t,n){const i=Ee(t,n);t[n];const l=Reflect.deleteProperty(t,n);return l&&i&&Ut(t,"delete",n,void 0),l}has(t,n){const i=Reflect.has(t,n);return(!dn(n)||!Vo.has(n))&&ze(t,"has",n),i}ownKeys(t){return ze(t,"iterate",ne(t)?"length":kn),Reflect.ownKeys(t)}}class jo extends No{constructor(t=!1){super(!0,t)}set(t,n){return!0}deleteProperty(t,n){return!0}}const vd=new $o,Ad=new jo,Bd=new $o(!0),yd=new jo(!0),ga=e=>e,qi=e=>Reflect.getPrototypeOf(e);function _d(e,t,n){return function(...i){const l=this.__v_raw,a=pe(l),r=Wn(a),o=e==="entries"||e===Symbol.iterator&&r,c=e==="keys"&&r,d=l[e](...i),u=n?ga:t?ma:Ke;return!t&&ze(a,"iterate",c?fa:kn),{next(){const{value:p,done:h}=d.next();return h?{value:p,done:h}:{value:o?[u(p[0]),u(p[1])]:u(p),done:h}},[Symbol.iterator](){return this}}}}function Ki(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function bd(e,t){const n={get(l){const a=this.__v_raw,r=pe(a),o=pe(l);e||(cn(l,o)&&ze(r,"get",l),ze(r,"get",o));const{has:c}=qi(r),d=t?ga:e?ma:Ke;if(c.call(r,l))return d(a.get(l));if(c.call(r,o))return d(a.get(o));a!==r&&a.get(l)},get size(){const l=this.__v_raw;return!e&&ze(pe(l),"iterate",kn),Reflect.get(l,"size",l)},has(l){const a=this.__v_raw,r=pe(a),o=pe(l);return e||(cn(l,o)&&ze(r,"has",l),ze(r,"has",o)),l===o?a.has(l):a.has(l)||a.has(o)},forEach(l,a){const r=this,o=r.__v_raw,c=pe(o),d=t?ga:e?ma:Ke;return!e&&ze(c,"iterate",kn),o.forEach((u,p)=>l.call(a,d(u),d(p),r))}};return Ne(n,e?{add:Ki("add"),set:Ki("set"),delete:Ki("delete"),clear:Ki("clear")}:{add(l){!t&&!kt(l)&&!wn(l)&&(l=pe(l));const a=pe(this);return qi(a).has.call(a,l)||(a.add(l),Ut(a,"add",l,l)),this},set(l,a){!t&&!kt(a)&&!wn(a)&&(a=pe(a));const r=pe(this),{has:o,get:c}=qi(r);let d=o.call(r,l);d||(l=pe(l),d=o.call(r,l));const u=c.call(r,l);return r.set(l,a),d?cn(a,u)&&Ut(r,"set",l,a):Ut(r,"add",l,a),this},delete(l){const a=pe(this),{has:r,get:o}=qi(a);let c=r.call(a,l);c||(l=pe(l),c=r.call(a,l)),o&&o.call(a,l);const d=a.delete(l);return c&&Ut(a,"delete",l,void 0),d},clear(){const l=pe(this),a=l.size!==0,r=l.clear();return a&&Ut(l,"clear",void 0,void 0),r}}),["keys","values","entries",Symbol.iterator].forEach(l=>{n[l]=_d(l,e,t)}),n}function kl(e,t){const n=bd(e,t);return(i,l,a)=>l==="__v_isReactive"?!e:l==="__v_isReadonly"?e:l==="__v_raw"?i:Reflect.get(Ee(n,l)&&l in i?n:i,l,a)}const kd={get:kl(!1,!1)},Cd={get:kl(!1,!0)},Dd={get:kl(!0,!1)},Td={get:kl(!0,!0)},Ho=new WeakMap,zo=new WeakMap,Uo=new WeakMap,Wo=new WeakMap;function wd(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function xd(e){return e.__v_skip||!Object.isExtensible(e)?0:wd(Jp(e))}function Tn(e){return wn(e)?e:Cl(e,!1,vd,kd,Ho)}function Go(e){return Cl(e,!1,Bd,Cd,zo)}function Kt(e){return Cl(e,!0,Ad,Dd,Uo)}function Fd(e){return Cl(e,!0,yd,Td,Wo)}function Cl(e,t,n,i,l){if(!Te(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const a=l.get(e);if(a)return a;const r=xd(e);if(r===0)return e;const o=new Proxy(e,r===2?i:n);return l.set(e,o),o}function qn(e){return wn(e)?qn(e.__v_raw):!!(e&&e.__v_isReactive)}function wn(e){return!!(e&&e.__v_isReadonly)}function kt(e){return!!(e&&e.__v_isShallow)}function tr(e){return e?!!e.__v_raw:!1}function pe(e){const t=e&&e.__v_raw;return t?pe(t):e}function Sd(e){return!Ee(e,"__v_skip")&&Object.isExtensible(e)&&Co(e,"__v_skip",!0),e}const Ke=e=>Te(e)?Tn(e):e,ma=e=>Te(e)?Kt(e):e;function Re(e){return e?e.__v_isRef===!0:!1}function se(e){return qo(e,!1)}function ae(e){return qo(e,!0)}function qo(e,t){return Re(e)?e:new Pd(e,t)}class Pd{constructor(t,n){this.dep=new bl,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:pe(t),this._value=n?t:Ke(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,i=this.__v_isShallow||kt(t)||wn(t);t=i?t:pe(t),cn(t,n)&&(this._rawValue=t,this._value=i?t:Ke(t),this.dep.trigger())}}function un(e){return Re(e)?e.value:e}function de(e){return le(e)?e():un(e)}const Rd={get:(e,t,n)=>t==="__v_raw"?e:un(Reflect.get(e,t,n)),set:(e,t,n,i)=>{const l=e[t];return Re(l)&&!Re(n)?(l.value=n,!0):Reflect.set(e,t,n,i)}};function Ko(e){return qn(e)?e:new Proxy(e,Rd)}class Ld{constructor(t){this.__v_isRef=!0,this._value=void 0;const n=this.dep=new bl,{get:i,set:l}=t(n.track.bind(n),n.trigger.bind(n));this._get=i,this._set=l}get value(){return this._value=this._get()}set value(t){this._set(t)}}function Qo(e){return new Ld(e)}class Od{constructor(t,n,i){this._object=t,this._key=n,this._defaultValue=i,this.__v_isRef=!0,this._value=void 0}get value(){const t=this._object[this._key];return this._value=t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return hd(pe(this._object),this._key)}}class Id{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0,this._value=void 0}get value(){return this._value=this._getter()}}function ii(e,t,n){return Re(e)?e:le(e)?new Id(e):Te(e)&&arguments.length>1?Md(e,t,n):se(e)}function Md(e,t,n){const i=e[t];return Re(i)?i:new Od(e,t,n)}class Vd{constructor(t,n,i){this.fn=t,this.setter=n,this._value=void 0,this.dep=new bl(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=bi-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=i}notify(){if(this.flags|=16,!(this.flags&8)&&be!==this)return Po(this,!0),!0}get value(){const t=this.dep.track();return Oo(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function Nd(e,t,n=!1){let i,l;return le(e)?i=e:(i=e.get,l=e.set),new Vd(i,l,n)}const Qi={},cl=new WeakMap;let Bn;function $d(e,t=!1,n=Bn){if(n){let i=cl.get(n);i||cl.set(n,i=[]),i.push(e)}}function jd(e,t,n=ke){const{immediate:i,deep:l,once:a,scheduler:r,augmentJob:o,call:c}=n,d=_=>l?_:kt(_)||l===!1||l===0?on(_,1):on(_);let u,p,h,E,v=!1,B=!1;if(Re(e)?(p=()=>e.value,v=kt(e)):qn(e)?(p=()=>d(e),v=!0):ne(e)?(B=!0,v=e.some(_=>qn(_)||kt(_)),p=()=>e.map(_=>{if(Re(_))return _.value;if(qn(_))return d(_);if(le(_))return c?c(_,2):_()})):le(e)?t?p=c?()=>c(e,2):e:p=()=>{if(h){hn();try{h()}finally{En()}}const _=Bn;Bn=u;try{return c?c(e,3,[E]):e(E)}finally{Bn=_}}:p=It,t&&l){const _=p,P=l===!0?1/0:l;p=()=>on(_(),P)}const k=xo(),D=()=>{u.stop(),k&&qa(k.effects,u)};if(a&&t){const _=t;t=(...P)=>{_(...P),D()}}let y=B?new Array(e.length).fill(Qi):Qi;const m=_=>{if(!(!(u.flags&1)||!u.dirty&&!_))if(t){const P=u.run();if(l||v||(B?P.some((H,M)=>cn(H,y[M])):cn(P,y))){h&&h();const H=Bn;Bn=u;try{const M=[P,y===Qi?void 0:B&&y[0]===Qi?[]:y,E];c?c(t,3,M):t(...M),y=P}finally{Bn=H}}}else u.run()};return o&&o(m),u=new Fo(p),u.scheduler=r?()=>r(m,!1):m,E=_=>$d(_,!1,u),h=u.onStop=()=>{const _=cl.get(u);if(_){if(c)c(_,4);else for(const P of _)P();cl.delete(u)}},t?i?m(!0):y=u.run():r?r(m.bind(null,!0),!0):u.run(),D.pause=u.pause.bind(u),D.resume=u.resume.bind(u),D.stop=D,D}function on(e,t=1/0,n){if(t<=0||!Te(e)||e.__v_skip||(n=n||new Set,n.has(e)))return e;if(n.add(e),t--,Re(e))on(e.value,t,n);else if(ne(e))for(let i=0;i<e.length;i++)on(e[i],t,n);else if(yo(e)||Wn(e))e.forEach(i=>{on(i,t,n)});else if(ko(e)){for(const i in e)on(e[i],t,n);for(const i of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,i)&&on(e[i],t,n)}return e}/**
11* @vue/runtime-core v3.5.12
12* (c) 2018-present Yuxi (Evan) You and Vue contributors
13* @license MIT
14**/function Pi(e,t,n,i){try{return i?e(...i):e()}catch(l){Ri(l,t,n)}}function Dt(e,t,n,i){if(le(e)){const l=Pi(e,t,n,i);return l&&_o(l)&&l.catch(a=>{Ri(a,t,n)}),l}if(ne(e)){const l=[];for(let a=0;a<e.length;a++)l.push(Dt(e[a],t,n,i));return l}}function Ri(e,t,n,i=!0){const l=t?t.vnode:null,{errorHandler:a,throwUnhandledErrorInProduction:r}=t&&t.appContext.config||ke;if(t){let o=t.parent;const c=t.proxy,d=`https://vuejs.org/error-reference/#runtime-${n}`;for(;o;){const u=o.ec;if(u){for(let p=0;p<u.length;p++)if(u[p](e,c,d)===!1)return}o=o.parent}if(a){hn(),Pi(a,null,10,[e,c,d]),En();return}}Hd(e,n,l,i,r)}function Hd(e,t,n,i=!0,l=!1){if(l)throw e;console.error(e)}const Qe=[];let Lt=-1;const Kn=[];let ln=null,Nn=0;const Yo=Promise.resolve();let ul=null;function fn(e){const t=ul||Yo;return e?t.then(this?e.bind(this):e):t}function zd(e){let t=Lt+1,n=Qe.length;for(;t<n;){const i=t+n>>>1,l=Qe[i],a=Ci(l);a<e||a===e&&l.flags&2?t=i+1:n=i}return t}function nr(e){if(!(e.flags&1)){const t=Ci(e),n=Qe[Qe.length-1];!n||!(e.flags&2)&&t>=Ci(n)?Qe.push(e):Qe.splice(zd(t),0,e),e.flags|=1,Jo()}}function Jo(){ul||(ul=Yo.then(Xo))}function Ud(e){ne(e)?Kn.push(...e):ln&&e.id===-1?ln.splice(Nn+1,0,e):e.flags&1||(Kn.push(e),e.flags|=1),Jo()}function Qr(e,t,n=Lt+1){for(;n<Qe.length;n++){const i=Qe[n];if(i&&i.flags&2){if(e&&i.id!==e.uid)continue;Qe.splice(n,1),n--,i.flags&4&&(i.flags&=-2),i(),i.flags&4||(i.flags&=-2)}}}function pl(e){if(Kn.length){const t=[...new Set(Kn)].sort((n,i)=>Ci(n)-Ci(i));if(Kn.length=0,ln){ln.push(...t);return}for(ln=t,Nn=0;Nn<ln.length;Nn++){const n=ln[Nn];n.flags&4&&(n.flags&=-2),n.flags&8||n(),n.flags&=-2}ln=null,Nn=0}}const Ci=e=>e.id==null?e.flags&2?-1:1/0:e.id;function Xo(e){try{for(Lt=0;Lt<Qe.length;Lt++){const t=Qe[Lt];t&&!(t.flags&8)&&(t.flags&4&&(t.flags&=-2),Pi(t,t.i,t.i?15:14),t.flags&4||(t.flags&=-2))}}finally{for(;Lt<Qe.length;Lt++){const t=Qe[Lt];t&&(t.flags&=-2)}Lt=-1,Qe.length=0,pl(),ul=null,(Qe.length||Kn.length)&&Xo()}}let ut=null,Zo=null;function dl(e){const t=ut;return ut=e,Zo=e&&e.type.__scopeId||null,t}function Wd(e,t=ut,n){if(!t||e._n)return e;const i=(...l)=>{i._d&&ss(-1);const a=dl(t);let r;try{r=e(...l)}finally{dl(a),i._d&&ss(1)}return r};return i._n=!0,i._c=!0,i._d=!0,i}function Ot(e,t,n,i){const l=e.dirs,a=t&&t.dirs;for(let r=0;r<l.length;r++){const o=l[r];a&&(o.oldValue=a[r].value);let c=o.dir[i];c&&(hn(),Dt(c,n,8,[e.el,o,e,t]),En())}}const Gd=Symbol("_vte"),ec=e=>e.__isTeleport,an=Symbol("_leaveCb"),Yi=Symbol("_enterCb");function tc(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return ye(()=>{e.isMounted=!0}),rr(()=>{e.isUnmounting=!0}),e}const ft=[Function,Array],nc={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:ft,onEnter:ft,onAfterEnter:ft,onEnterCancelled:ft,onBeforeLeave:ft,onLeave:ft,onAfterLeave:ft,onLeaveCancelled:ft,onBeforeAppear:ft,onAppear:ft,onAfterAppear:ft,onAppearCancelled:ft},ic=e=>{const t=e.subTree;return t.component?ic(t.component):t},qd={name:"BaseTransition",props:nc,setup(e,{slots:t}){const n=Pn(),i=tc();return()=>{const l=t.default&&ir(t.default(),!0);if(!l||!l.length)return;const a=lc(l),r=pe(e),{mode:o}=r;if(i.isLeaving)return Ul(a);const c=Yr(a);if(!c)return Ul(a);let d=Di(c,r,i,n,h=>d=h);c.type!==Ze&&xn(c,d);const u=n.subTree,p=u&&Yr(u);if(p&&p.type!==Ze&&!yn(c,p)&&ic(n).type!==Ze){const h=Di(p,r,i,n);if(xn(p,h),o==="out-in"&&c.type!==Ze)return i.isLeaving=!0,h.afterLeave=()=>{i.isLeaving=!1,n.job.flags&8||n.update(),delete h.afterLeave},Ul(a);o==="in-out"&&c.type!==Ze&&(h.delayLeave=(E,v,B)=>{const k=ac(i,p);k[String(p.key)]=p,E[an]=()=>{v(),E[an]=void 0,delete d.delayedLeave},d.delayedLeave=B})}return a}}};function lc(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==Ze){t=n;break}}return t}const Kd=qd;function ac(e,t){const{leavingVNodes:n}=e;let i=n.get(t.type);return i||(i=Object.create(null),n.set(t.type,i)),i}function Di(e,t,n,i,l){const{appear:a,mode:r,persisted:o=!1,onBeforeEnter:c,onEnter:d,onAfterEnter:u,onEnterCancelled:p,onBeforeLeave:h,onLeave:E,onAfterLeave:v,onLeaveCancelled:B,onBeforeAppear:k,onAppear:D,onAfterAppear:y,onAppearCancelled:m}=t,_=String(e.key),P=ac(n,e),H=(T,R)=>{T&&Dt(T,i,9,R)},M=(T,R)=>{const j=R[1];H(T,R),ne(T)?T.every(L=>L.length<=1)&&j():T.length<=1&&j()},z={mode:r,persisted:o,beforeEnter(T){let R=c;if(!n.isMounted)if(a)R=k||c;else return;T[an]&&T[an](!0);const j=P[_];j&&yn(e,j)&&j.el[an]&&j.el[an](),H(R,[T])},enter(T){let R=d,j=u,L=p;if(!n.isMounted)if(a)R=D||d,j=y||u,L=m||p;else return;let Y=!1;const G=T[Yi]=J=>{Y||(Y=!0,J?H(L,[T]):H(j,[T]),z.delayedLeave&&z.delayedLeave(),T[Yi]=void 0)};R?M(R,[T,G]):G()},leave(T,R){const j=String(e.key);if(T[Yi]&&T[Yi](!0),n.isUnmounting)return R();H(h,[T]);let L=!1;const Y=T[an]=G=>{L||(L=!0,R(),G?H(B,[T]):H(v,[T]),T[an]=void 0,P[j]===e&&delete P[j])};P[j]=e,E?M(E,[T,Y]):Y()},clone(T){const R=Di(T,t,n,i,l);return l&&l(R),R}};return z}function Ul(e){if(Li(e))return e=pn(e),e.children=null,e}function Yr(e){if(!Li(e))return ec(e.type)&&e.children?lc(e.children):e;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&le(n.default))return n.default()}}function xn(e,t){e.shapeFlag&6&&e.component?(e.transition=t,xn(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function ir(e,t=!1,n){let i=[],l=0;for(let a=0;a<e.length;a++){let r=e[a];const o=n==null?r.key:String(n)+String(r.key!=null?r.key:a);r.type===Xe?(r.patchFlag&128&&l++,i=i.concat(ir(r.children,t,o))):(t||r.type!==Ze)&&i.push(o!=null?pn(r,{key:o}):r)}if(l>1)for(let a=0;a<i.length;a++)i[a].patchFlag=-2;return i}/*! #__NO_SIDE_EFFECTS__ */function I(e,t){return le(e)?Ne({name:e.name},t,{setup:e}):e}function lr(){const e=Pn();return e?(e.appContext.config.idPrefix||"v")+"-"+e.ids[0]+e.ids[1]++:""}
vendor: 28,538 bytes, lines 14-15
14function ar(e){e.ids=[e.ids[0]+e.ids[2]+++"-",0,0]}function hl(e,t,n,i,l=!1){if(ne(e)){e.forEach((v,B)=>hl(v,t&&(ne(t)?t[B]:t),n,i,l));return}if(Qn(i)&&!l)return;const a=i.shapeFlag&4?pr(i.component):i.el,r=l?null:a,{i:o,r:c}=e,d=t&&t.r,u=o.refs===ke?o.refs={}:o.refs,p=o.setupState,h=pe(p),E=p===ke?()=>!1:v=>Ee(h,v);if(d!=null&&d!==c&&(Le(d)?(u[d]=null,E(d)&&(p[d]=null)):Re(d)&&(d.value=null)),le(c))Pi(c,o,12,[r,u]);else{const v=Le(c),B=Re(c);if(v||B){const k=()=>{if(e.f){const D=v?E(c)?p[c]:u[c]:c.value;l?ne(D)&&qa(D,a):ne(D)?D.includes(a)||D.push(a):v?(u[c]=[a],E(c)&&(p[c]=u[c])):(c.value=[a],e.k&&(u[e.k]=c.value))}else v?(u[c]=r,E(c)&&(p[c]=r)):B&&(c.value=r,e.k&&(u[e.k]=r))};r?(k.id=-1,ot(k,n)):k()}}}let Jr=!1;const Mn=()=>{Jr||(console.error("Hydration completed but contains mismatches."),Jr=!0)},Qd=e=>e.namespaceURI.includes("svg")&&e.tagName!=="foreignObject",Yd=e=>e.namespaceURI.includes("MathML"),Ji=e=>{if(e.nodeType===1){if(Qd(e))return"svg";if(Yd(e))return"mathml"}},Hn=e=>e.nodeType===8;function Jd(e){const{mt:t,p:n,o:{patchProp:i,createText:l,nextSibling:a,parentNode:r,remove:o,insert:c,createComment:d}}=e,u=(m,_)=>{if(!_.hasChildNodes()){n(null,m,_),pl(),_._vnode=m;return}p(_.firstChild,m,null,null,null),pl(),_._vnode=m},p=(m,_,P,H,M,z=!1)=>{z=z||!!_.dynamicChildren;const T=Hn(m)&&m.data==="[",R=()=>B(m,_,P,H,M,T),{type:j,ref:L,shapeFlag:Y,patchFlag:G}=_;let J=m.nodeType;_.el=m,G===-2&&(z=!1,_.dynamicChildren=null);let V=null;switch(j){case Dn:J!==3?_.children===""?(c(_.el=l(""),r(m),m),V=m):V=R():(m.data!==_.children&&(Mn(),m.data=_.children),V=a(m));break;case Ze:y(m)?(V=a(m),D(_.el=m.content.firstChild,m,P)):J!==8||T?V=R():V=a(m);break;case vi:if(T&&(m=a(m),J=m.nodeType),J===1||J===3){V=m;const te=!_.children.length;for(let Q=0;Q<_.staticCount;Q++)te&&(_.children+=V.nodeType===1?V.outerHTML:V.data),Q===_.staticCount-1&&(_.anchor=V),V=a(V);return T?a(V):V}else R();break;case Xe:T?V=v(m,_,P,H,M,z):V=R();break;default:if(Y&1)(J!==1||_.type.toLowerCase()!==m.tagName.toLowerCase())&&!y(m)?V=R():V=h(m,_,P,H,M,z);else if(Y&6){_.slotScopeIds=M;const te=r(m);if(T?V=k(m):Hn(m)&&m.data==="teleport start"?V=k(m,m.data,"teleport end"):V=a(m),t(_,te,null,P,H,Ji(te),z),Qn(_)){let Q;T?(Q=Me(Xe),Q.anchor=V?V.previousSibling:te.lastChild):Q=m.nodeType===3?Sc(""):Me("div"),Q.el=m,_.component.subTree=Q}}else Y&64?J!==8?V=R():V=_.type.hydrate(m,_,P,H,M,z,e,E):Y&128&&(V=_.type.hydrate(m,_,P,H,Ji(r(m)),M,z,e,p))}return L!=null&&hl(L,null,H,_),V},h=(m,_,P,H,M,z)=>{z=z||!!_.dynamicChildren;const{type:T,props:R,patchFlag:j,shapeFlag:L,dirs:Y,transition:G}=_,J=T==="input"||T==="option";if(J||j!==-1){Y&&Ot(_,null,P,"created");let V=!1;if(y(m)){V=_c(null,G)&&P&&P.vnode.props&&P.vnode.props.appear;const Q=m.content.firstChild;V&&G.beforeEnter(Q),D(Q,m,P),_.el=m=Q}if(L&16&&!(R&&(R.innerHTML||R.textContent))){let Q=E(m.firstChild,_,m,P,H,M,z);for(;Q;){Xi(m,1)||Mn();const ce=Q;Q=Q.nextSibling,o(ce)}}else if(L&8){let Q=_.children;Q[0]===`
15`&&(m.tagName==="PRE"||m.tagName==="TEXTAREA")&&(Q=Q.slice(1)),m.textContent!==Q&&(Xi(m,0)||Mn(),m.textContent=_.children)}if(R){if(J||!z||j&48){const Q=m.tagName.includes("-");for(const ce in R)(J&&(ce.endsWith("value")||ce==="indeterminate")||Fi(ce)&&!Gn(ce)||ce[0]==="."||Q)&&i(m,ce,null,R[ce],void 0,P)}else if(R.onClick)i(m,"onClick",null,R.onClick,void 0,P);else if(j&4&&qn(R.style))for(const Q in R.style)R.style[Q]}let te;(te=R&&R.onVnodeBeforeMount)&&gt(te,P,_),Y&&Ot(_,null,P,"beforeMount"),((te=R&&R.onVnodeMounted)||Y||V)&&wc(()=>{te&&gt(te,P,_),V&&G.enter(m),Y&&Ot(_,null,P,"mounted")},H)}return m.nextSibling},E=(m,_,P,H,M,z,T)=>{T=T||!!_.dynamicChildren;const R=_.children,j=R.length;for(let L=0;L<j;L++){const Y=T?R[L]:R[L]=vt(R[L]),G=Y.type===Dn;m?(G&&!T&&L+1<j&&vt(R[L+1]).type===Dn&&(c(l(m.data.slice(Y.children.length)),P,a(m)),m.data=Y.children),m=p(m,Y,H,M,z,T)):G&&!Y.children?c(Y.el=l(""),P):(Xi(P,1)||Mn(),n(null,Y,P,null,H,M,Ji(P),z))}return m},v=(m,_,P,H,M,z)=>{const{slotScopeIds:T}=_;T&&(M=M?M.concat(T):T);const R=r(m),j=E(a(m),_,R,P,H,M,z);return j&&Hn(j)&&j.data==="]"?a(_.anchor=j):(Mn(),c(_.anchor=d("]"),R,j),j)},B=(m,_,P,H,M,z)=>{if(Xi(m.parentElement,1)||Mn(),_.el=null,z){const j=k(m);for(;;){const L=a(m);if(L&&L!==j)o(L);else break}}const T=a(m),R=r(m);return o(m),n(null,_,R,T,P,H,Ji(R),M),T},k=(m,_="[",P="]")=>{let H=0;for(;m;)if(m=a(m),m&&Hn(m)&&(m.data===_&&H++,m.data===P)){if(H===0)return a(m);H--}return m},D=(m,_,P)=>{const H=_.parentNode;H&&H.replaceChild(m,_);let M=P;for(;M;)M.vnode.el===_&&(M.vnode.el=M.subTree.el=m),M=M.parent},y=m=>m.nodeType===1&&m.tagName==="TEMPLATE";return[u,p]}const Xr="data-allow-mismatch",Xd={0:"text",1:"children",2:"class",3:"style",4:"attribute"};function Xi(e,t){if(t===0||t===1)for(;e&&!e.hasAttribute(Xr);)e=e.parentElement;const n=e&&e.getAttribute(Xr);if(n==null)return!1;if(n==="")return!0;{const i=n.split(",");return t===0&&i.includes("children")?!0:n.split(",").includes(Xd[t])}}_l().requestIdleCallback;_l().cancelIdleCallback;function Zd(e,t){if(Hn(e)&&e.data==="["){let n=1,i=e.nextSibling;for(;i;){if(i.nodeType===1){if(t(i)===!1)break}else if(Hn(i))if(i.data==="]"){if(--n===0)break}else i.data==="["&&n++;i=i.nextSibling}}else t(e)}const Qn=e=>!!e.type.__asyncLoader;/*! #__NO_SIDE_EFFECTS__ */function rc(e){le(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:i,delay:l=200,hydrate:a,timeout:r,suspensible:o=!0,onError:c}=e;let d=null,u,p=0;const h=()=>(p++,d=null,E()),E=()=>{let v;return d||(v=d=t().catch(B=>{if(B=B instanceof Error?B:new Error(String(B)),c)return new Promise((k,D)=>{c(B,()=>k(h()),()=>D(B),p+1)});throw B}).then(B=>v!==d&&d?d:(B&&(B.__esModule||B[Symbol.toStringTag]==="Module")&&(B=B.default),u=B,B)))};return I({name:"AsyncComponentWrapper",__asyncLoader:E,__asyncHydrate(v,B,k){const D=a?()=>{const y=a(k,m=>Zd(v,m));y&&(B.bum||(B.bum=[])).push(y)}:k;u?D():E().then(()=>!B.isUnmounted&&D())},get __asyncResolved(){return u},setup(){const v=Ie;if(ar(v),u)return()=>Wl(u,v);const B=m=>{d=null,Ri(m,v,13,!i)};if(o&&v.suspense||Xn)return E().then(m=>()=>Wl(m,v)).catch(m=>(B(m),()=>i?Me(i,{error:m}):null));const k=se(!1),D=se(),y=se(!!l);return l&&setTimeout(()=>{y.value=!1},l),r!=null&&setTimeout(()=>{if(!k.value&&!D.value){const m=new Error(`Async component timed out after ${r}ms.`);B(m),D.value=m}},r),E().then(()=>{k.value=!0,v.parent&&Li(v.parent.vnode)&&v.parent.update()}).catch(m=>{B(m),D.value=m}),()=>{if(k.value&&u)return Wl(u,v);if(D.value&&i)return Me(i,{error:D.value});if(n&&!y.value)return Me(n)}}})}function Wl(e,t){const{ref:n,props:i,children:l,ce:a}=t.vnode,r=Me(e,i,l);return r.ref=n,r.ce=a,delete t.vnode.ce,r}const Li=e=>e.type.__isKeepAlive;function eh(e,t){sc(e,"a",t)}function th(e,t){sc(e,"da",t)}function sc(e,t,n=Ie){const i=e.__wdc||(e.__wdc=()=>{let l=n;for(;l;){if(l.isDeactivated)return;l=l.parent}return e()});if(Dl(t,i,n),n){let l=n.parent;for(;l&&l.parent;)Li(l.parent.vnode)&&nh(i,t,n,l),l=l.parent}}function nh(e,t,n,i){const l=Dl(t,e,i,!0);Sn(()=>{qa(i[t],l)},n)}function Dl(e,t,n=Ie,i=!1){if(n){const l=n[e]||(n[e]=[]),a=t.__weh||(t.__weh=(...r)=>{hn();const o=Oi(n),c=Dt(t,n,e,r);return o(),En(),c});return i?l.unshift(a):l.push(a),a}}const Qt=e=>(t,n=Ie)=>{(!Xn||e==="sp")&&Dl(e,(...i)=>t(...i),n)},ih=Qt("bm"),ye=Qt("m"),lh=Qt("bu"),oc=Qt("u"),rr=Qt("bum"),Sn=Qt("um"),ah=Qt("sp"),rh=Qt("rtg"),sh=Qt("rtc");function oh(e,t=Ie){Dl("ec",e,t)}const ch="components";function xe(e,t){return ph(ch,e,!0,t)||e}const uh=Symbol.for("v-ndc");function ph(e,t,n=!0,i=!1){const l=ut||Ie;if(l){const a=l.type;{const o=Yh(a,!1);if(o&&(o===t||o===et(t)||o===Si(et(t))))return a}const r=Zr(l[e]||a[e],t)||Zr(l.appContext[e],t);return!r&&i?a:r}}function Zr(e,t){return e&&(e[t]||e[et(t)]||e[Si(et(t))])}const va=e=>e?Pc(e)?pr(e):va(e.parent):null,mi=Ne(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>va(e.parent),$root:e=>va(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>uc(e),$forceUpdate:e=>e.f||(e.f=()=>{nr(e.update)}),$nextTick:e=>e.n||(e.n=fn.bind(e.proxy)),$watch:e=>Sh.bind(e)}),Gl=(e,t)=>e!==ke&&!e.__isScriptSetup&&Ee(e,t),dh={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:i,data:l,props:a,accessCache:r,type:o,appContext:c}=e;let d;if(t[0]!=="$"){const E=r[t];if(E!==void 0)switch(E){case 1:return i[t];case 2:return l[t];case 4:return n[t];case 3:return a[t]}else{if(Gl(i,t))return r[t]=1,i[t];if(l!==ke&&Ee(l,t))return r[t]=2,l[t];if((d=e.propsOptions[0])&&Ee(d,t))return r[t]=3,a[t];if(n!==ke&&Ee(n,t))return r[t]=4,n[t];Aa&&(r[t]=0)}}const u=mi[t];let p,h;if(u)return t==="$attrs"&&ze(e.attrs,"get",""),u(e);if((p=o.__cssModules)&&(p=p[t]))return p;if(n!==ke&&Ee(n,t))return r[t]=4,n[t];if(h=c.config.globalProperties,Ee(h,t))return h[t]},set({_:e},t,n){const{data:i,setupState:l,ctx:a}=e;return Gl(l,t)?(l[t]=n,!0):i!==ke&&Ee(i,t)?(i[t]=n,!0):Ee(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(a[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:i,appContext:l,propsOptions:a}},r){let o;return!!n[r]||e!==ke&&Ee(e,r)||Gl(t,r)||(o=a[0])&&Ee(o,r)||Ee(i,r)||Ee(mi,r)||Ee(l.config.globalProperties,r)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:Ee(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function es(e){return ne(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let Aa=!0;function hh(e){const t=uc(e),n=e.proxy,i=e.ctx;Aa=!1,t.beforeCreate&&ts(t.beforeCreate,e,"bc");const{data:l,computed:a,methods:r,watch:o,provide:c,inject:d,created:u,beforeMount:p,mounted:h,beforeUpdate:E,updated:v,activated:B,deactivated:k,beforeDestroy:D,beforeUnmount:y,destroyed:m,unmounted:_,render:P,renderTracked:H,renderTriggered:M,errorCaptured:z,serverPrefetch:T,expose:R,inheritAttrs:j,components:L,directives:Y,filters:G}=t;if(d&&Eh(d,i,null),r)for(const te in r){const Q=r[te];le(Q)&&(i[te]=Q.bind(n))}if(l){const te=l.call(n,n);Te(te)&&(e.data=Tn(te))}if(Aa=!0,a)for(const te in a){const Q=a[te],ce=le(Q)?Q.bind(n,n):le(Q.get)?Q.get.bind(n,n):It,nt=!le(Q)&&le(Q.set)?Q.set.bind(n):It,Ue=b({get:ce,set:nt});Object.defineProperty(i,te,{enumerable:!0,configurable:!0,get:()=>Ue.value,set:$e=>Ue.value=$e})}if(o)for(const te in o)cc(o[te],i,n,te);if(c){const te=le(c)?c.call(n):c;Reflect.ownKeys(te).forEach(Q=>{Ct(Q,te[Q])})}u&&ts(u,e,"c");function V(te,Q){ne(Q)?Q.forEach(ce=>te(ce.bind(n))):Q&&te(Q.bind(n))}if(V(ih,p),V(ye,h),V(lh,E),V(oc,v),V(eh,B),V(th,k),V(oh,z),V(sh,H),V(rh,M),V(rr,y),V(Sn,_),V(ah,T),ne(R))if(R.length){const te=e.exposed||(e.exposed={});R.forEach(Q=>{Object.defineProperty(te,Q,{get:()=>n[Q],set:ce=>n[Q]=ce})})}else e.exposed||(e.exposed={});P&&e.render===It&&(e.render=P),j!=null&&(e.inheritAttrs=j),L&&(e.components=L),Y&&(e.directives=Y),T&&ar(e)}function Eh(e,t,n=It){ne(e)&&(e=Ba(e));for(const i in e){const l=e[i];let a;Te(l)?"default"in l?a=ve(l.from||i,l.default,!0):a=ve(l.from||i):a=ve(l),Re(a)?Object.defineProperty(t,i,{enumerable:!0,configurable:!0,get:()=>a.value,set:r=>a.value=r}):t[i]=a}}function ts(e,t,n){Dt(ne(e)?e.map(i=>i.bind(t.proxy)):e.bind(t.proxy),t,n)}function cc(e,t,n,i){let l=i.includes(".")?Cc(n,i):()=>n[i];if(Le(e)){const a=t[e];le(a)&&we(l,a)}else if(le(e))we(l,e.bind(n));else if(Te(e))if(ne(e))e.forEach(a=>cc(a,t,n,i));else{const a=le(e.handler)?e.handler.bind(n):t[e.handler];le(a)&&we(l,a,e)}}function uc(e){const t=e.type,{mixins:n,extends:i}=t,{mixins:l,optionsCache:a,config:{optionMergeStrategies:r}}=e.appContext,o=a.get(t);let c;return o?c=o:!l.length&&!n&&!i?c=t:(c={},l.length&&l.forEach(d=>El(c,d,r,!0)),El(c,t,r)),Te(t)&&a.set(t,c),c}function El(e,t,n,i=!1){const{mixins:l,extends:a}=t;a&&El(e,a,n,!0),l&&l.forEach(r=>El(e,r,n,!0));for(const r in t)if(!(i&&r==="expose")){const o=fh[r]||n&&n[r];e[r]=o?o(e[r],t[r]):t[r]}return e}const fh={data:ns,props:is,emits:is,methods:Ei,computed:Ei,beforeCreate:We,created:We,beforeMount:We,mounted:We,beforeUpdate:We,updated:We,beforeDestroy:We,beforeUnmount:We,destroyed:We,unmounted:We,activated:We,deactivated:We,errorCaptured:We,serverPrefetch:We,components:Ei,directives:Ei,watch:mh,provide:ns,inject:gh};function ns(e,t){return t?e?function(){return Ne(le(e)?e.call(this,this):e,le(t)?t.call(this,this):t)}:t:e}function gh(e,t){return Ei(Ba(e),Ba(t))}function Ba(e){if(ne(e)){const t={};for(let n=0;n<e.length;n++)t[e[n]]=e[n];return t}return e}function We(e,t){return e?[...new Set([].concat(e,t))]:t}function Ei(e,t){return e?Ne(Object.create(null),e,t):t}function is(e,t){return e?ne(e)&&ne(t)?[...new Set([...e,...t])]:Ne(Object.create(null),es(e),es(t??{})):t}function mh(e,t){if(!e)return t;if(!t)return e;const n=Ne(Object.create(null),e);for(const i in t)n[i]=We(e[i],t[i]);return n}function pc(){return{app:null,config:{isNativeTag:Qp,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let vh=0;function Ah(e,t){return function(i,l=null){le(i)||(i=Ne({},i)),l!=null&&!Te(l)&&(l=null);const a=pc(),r=new WeakSet,o=[];let c=!1;const d=a.app={_uid:vh++,_component:i,_props:l,_container:null,_context:a,_instance:null,version:Xh,get config(){return a.config},set config(u){},use(u,...p){return r.has(u)||(u&&le(u.install)?(r.add(u),u.install(d,...p)):le(u)&&(r.add(u),u(d,...p))),d},mixin(u){return a.mixins.includes(u)||a.mixins.push(u),d},component(u,p){return p?(a.components[u]=p,d):a.components[u]},directive(u,p){return p?(a.directives[u]=p,d):a.directives[u]},mount(u,p,h){if(!c){const E=d._ceVNode||Me(i,l);return E.appContext=a,h===!0?h="svg":h===!1&&(h=void 0),p&&t?t(E,u):e(E,u,h),c=!0,d._container=u,u.__vue_app__=d,pr(E.component)}},onUnmount(u){o.push(u)},unmount(){c&&(Dt(o,d._instance,16),e(null,d._container),delete d._container.__vue_app__)},provide(u,p){return a.provides[u]=p,d},runWithContext(u){const p=Cn;Cn=d;try{return u()}finally{Cn=p}}};return d}}let Cn=null;function Ct(e,t){if(Ie){let n=Ie.provides;const i=Ie.parent&&Ie.parent.provides;i===n&&(n=Ie.provides=Object.create(i)),n[e]=t}}function ve(e,t,n=!1){const i=Ie||ut;if(i||Cn){const l=Cn?Cn._context.provides:i?i.parent==null?i.vnode.appContext&&i.vnode.appContext.provides:i.parent.provides:void 0;if(l&&e in l)return l[e];if(arguments.length>1)return n&&le(t)?t.call(i&&i.proxy):t}}function dc(){return!!(Ie||ut||Cn)}const hc={},Ec=()=>Object.create(hc),fc=e=>Object.getPrototypeOf(e)===hc;function Bh(e,t,n,i=!1){const l={},a=Ec();e.propsDefaults=Object.create(null),gc(e,t,l,a);for(const r in e.propsOptions[0])r in l||(l[r]=void 0);n?e.props=i?l:Go(l):e.type.props?e.props=l:e.props=a,e.attrs=a}function yh(e,t,n,i){const{props:l,attrs:a,vnode:{patchFlag:r}}=e,o=pe(l),[c]=e.propsOptions;let d=!1;if((i||r>0)&&!(r&16)){if(r&8){const u=e.vnode.dynamicProps;for(let p=0;p<u.length;p++){let h=u[p];if(Tl(e.emitsOptions,h))continue;const E=t[h];if(c)if(Ee(a,h))E!==a[h]&&(a[h]=E,d=!0);else{const v=et(h);l[v]=ya(c,o,v,E,e,!1)}else E!==a[h]&&(a[h]=E,d=!0)}}}else{gc(e,t,l,a)&&(d=!0);let u;for(const p in o)(!t||!Ee(t,p)&&((u=Fn(p))===p||!Ee(t,u)))&&(c?n&&(n[p]!==void 0||n[u]!==void 0)&&(l[p]=ya(c,o,p,void 0,e,!0)):delete l[p]);if(a!==o)for(const p in a)(!t||!Ee(t,p))&&(delete a[p],d=!0)}d&&Ut(e.attrs,"set","")}function gc(e,t,n,i){const[l,a]=e.propsOptions;let r=!1,o;if(t)for(let c in t){if(Gn(c))continue;const d=t[c];let u;l&&Ee(l,u=et(c))?!a||!a.includes(u)?n[u]=d:(o||(o={}))[u]=d:Tl(e.emitsOptions,c)||(!(c in i)||d!==i[c])&&(i[c]=d,r=!0)}if(a){const c=pe(n),d=o||ke;for(let u=0;u<a.length;u++){const p=a[u];n[p]=ya(l,c,p,d[p],e,!Ee(d,p))}}return r}function ya(e,t,n,i,l,a){const r=e[n];if(r!=null){const o=Ee(r,"default");if(o&&i===void 0){const c=r.default;if(r.type!==Function&&!r.skipFactory&&le(c)){const{propsDefaults:d}=l;if(n in d)i=d[n];else{const u=Oi(l);i=d[n]=c.call(null,t),u()}}else i=c;l.ce&&l.ce._setProp(n,i)}r[0]&&(a&&!o?i=!1:r[1]&&(i===""||i===Fn(n))&&(i=!0))}return i}const _h=new WeakMap;function mc(e,t,n=!1){const i=n?_h:t.propsCache,l=i.get(e);if(l)return l;const a=e.props,r={},o=[];let c=!1;if(!le(e)){const u=p=>{c=!0;const[h,E]=mc(p,t,!0);Ne(r,h),E&&o.push(...E)};!n&&t.mixins.length&&t.mixins.forEach(u),e.extends&&u(e.extends),e.mixins&&e.mixins.forEach(u)}if(!a&&!c)return Te(e)&&i.set(e,Un),Un;if(ne(a))for(let u=0;u<a.length;u++){const p=et(a[u]);ls(p)&&(r[p]=ke)}else if(a)for(const u in a){const p=et(u);if(ls(p)){const h=a[u],E=r[p]=ne(h)||le(h)?{type:h}:Ne({},h),v=E.type;let B=!1,k=!0;if(ne(v))for(let D=0;D<v.length;++D){const y=v[D],m=le(y)&&y.name;if(m==="Boolean"){B=!0;break}else m==="String"&&(k=!1)}else B=le(v)&&v.name==="Boolean";E[0]=B,E[1]=k,(B||Ee(E,"default"))&&o.push(p)}}const d=[r,o];return Te(e)&&i.set(e,d),d}function ls(e){return e[0]!=="$"&&!Gn(e)}const vc=e=>e[0]==="_"||e==="$stable",sr=e=>ne(e)?e.map(vt):[vt(e)],bh=(e,t,n)=>{if(t._n)return t;const i=Wd((...l)=>sr(t(...l)),n);return i._c=!1,i},Ac=(e,t,n)=>{const i=e._ctx;for(const l in e){if(vc(l))continue;const a=e[l];if(le(a))t[l]=bh(l,a,i);else if(a!=null){const r=sr(a);t[l]=()=>r}}},Bc=(e,t)=>{const n=sr(t);e.slots.default=()=>n},yc=(e,t,n)=>{for(const i in t)(n||i!=="_")&&(e[i]=t[i])},kh=(e,t,n)=>{const i=e.slots=Ec();if(e.vnode.shapeFlag&32){const l=t._;l?(yc(i,t,n),n&&Co(i,"_",l,!0)):Ac(t,i)}else t&&Bc(e,t)},Ch=(e,t,n)=>{const{vnode:i,slots:l}=e;let a=!0,r=ke;if(i.shapeFlag&32){const o=t._;o?n&&o===1?a=!1:yc(l,t,n):(a=!t.$stable,Ac(t,l)),r=t}else t&&(Bc(e,t),r={default:1});if(a)for(const o in l)!vc(o)&&r[o]==null&&delete l[o]},ot=wc;function Dh(e){return Th(e,Jd)}function Th(e,t){const n=_l();n.__VUE__=!0;const{insert:i,remove:l,patchProp:a,createElement:r,createText:o,createComment:c,setText:d,setElementText:u,parentNode:p,nextSibling:h,setScopeId:E=It,insertStaticContent:v}=e,B=(g,A,C,F=null,x=null,S=null,W=void 0,$=null,N=!!A.dynamicChildren)=>{if(g===A)return;g&&!yn(g,A)&&(F=w(g),$e(g,x,S,!0),g=null),A.patchFlag===-2&&(N=!1,A.dynamicChildren=null);const{type:O,ref:ee,shapeFlag:q}=A;switch(O){case Dn:k(g,A,C,F);break;case Ze:D(g,A,C,F);break;case vi:g==null&&y(A,C,F,W);break;case Xe:L(g,A,C,F,x,S,W,$,N);break;default:q&1?P(g,A,C,F,x,S,W,$,N):q&6?Y(g,A,C,F,x,S,W,$,N):(q&64||q&128)&&O.process(g,A,C,F,x,S,W,$,N,X)}ee!=null&&x&&hl(ee,g&&g.ref,S,A||g,!A)},k=(g,A,C,F)=>{if(g==null)i(A.el=o(A.children),C,F);else{const x=A.el=g.el;A.children!==g.children&&d(x,A.children)}},D=(g,A,C,F)=>{g==null?i(A.el=c(A.children||""),C,F):A.el=g.el},y=(g,A,C,F)=>{[g.el,g.anchor]=v(g.children,A,C,F,g.el,g.anchor)},m=({el:g,anchor:A},C,F)=>{let x;for(;g&&g!==A;)x=h(g),i(g,C,F),g=x;i(A,C,F)},_=({el:g,anchor:A})=>{let C;for(;g&&g!==A;)C=h(g),l(g),g=C;l(A)},P=(g,A,C,F,x,S,W,$,N)=>{A.type==="svg"?W="svg":A.type==="math"&&(W="mathml"),g==null?H(A,C,F,x,S,W,$,N):T(g,A,x,S,W,$,N)},H=(g,A,C,F,x,S,W,$)=>{let N,O;const{props:ee,shapeFlag:q,transition:Z,dirs:ie}=g;if(N=g.el=r(g.type,S,ee&&ee.is,ee),q&8?u(N,g.children):q&16&&z(g.children,N,null,F,x,ql(g,S),W,$),ie&&Ot(g,null,F,"created"),M(N,g,g.scopeId,W,F),ee){for(const _e in ee)_e!=="value"&&!Gn(_e)&&a(N,_e,null,ee[_e],S,F);"value"in ee&&a(N,"value",null,ee.value,S),(O=ee.onVnodeBeforeMount)&&gt(O,F,g)}ie&&Ot(g,null,F,"beforeMount");const ue=_c(x,Z);ue&&Z.beforeEnter(N),i(N,A,C),((O=ee&&ee.onVnodeMounted)||ue||ie)&&ot(()=>{O&&gt(O,F,g),ue&&Z.enter(N),ie&&Ot(g,null,F,"mounted")},x)},M=(g,A,C,F,x)=>{if(C&&E(g,C),F)for(let S=0;S<F.length;S++)E(g,F[S]);if(x){let S=x.subTree;if(A===S||Tc(S.type)&&(S.ssContent===A||S.ssFallback===A)){const W=x.vnode;M(g,W,W.scopeId,W.slotScopeIds,x.parent)}}},z=(g,A,C,F,x,S,W,$,N=0)=>{for(let O=N;O<g.length;O++){const ee=g[O]=$?rn(g[O]):vt(g[O]);B(null,ee,A,C,F,x,S,W,$)}},T=(g,A,C,F,x,S,W)=>{const $=A.el=g.el;let{patchFlag:N,dynamicChildren:O,dirs:ee}=A;N|=g.patchFlag&16;const q=g.props||ke,Z=A.props||ke;let ie;if(C&&mn(C,!1),(ie=Z.onVnodeBeforeUpdate)&&gt(ie,C,A,g),ee&&Ot(A,g,C,"beforeUpdate"),C&&mn(C,!0),(q.innerHTML&&Z.innerHTML==null||q.textContent&&Z.textContent==null)&&u($,""),O?R(g.dynamicChildren,O,$,C,F,ql(A,x),S):W||Q(g,A,$,null,C,F,ql(A,x),S,!1),N>0){if(N&16)j($,q,Z,C,x);else if(N&2&&q.class!==Z.class&&a($,"class",null,Z.class,x),N&4&&a($,"style",q.style,Z.style,x),N&8){const ue=A.dynamicProps;for(let _e=0;_e<ue.length;_e++){const ge=ue[_e],at=q[ge],He=Z[ge];(He!==at||ge==="value")&&a($,ge,at,He,x,C)}}N&1&&g.children!==A.children&&u($,A.children)}else!W&&O==null&&j($,q,Z,C,x);((ie=Z.onVnodeUpdated)||ee)&&ot(()=>{ie&&gt(ie,C,A,g),ee&&Ot(A,g,C,"updated")},F)},R=(g,A,C,F,x,S,W)=>{for(let $=0;$<A.length;$++){const N=g[$],O=A[$],ee=N.el&&(N.type===Xe||!yn(N,O)||N.shapeFlag&70)?p(N.el):C;B(N,O,ee,null,F,x,S,W,!0)}},j=(g,A,C,F,x)=>{if(A!==C){if(A!==ke)for(const S in A)!Gn(S)&&!(S in C)&&a(g,S,A[S],null,x,F);for(const S in C){if(Gn(S))continue;const W=C[S],$=A[S];W!==$&&S!=="value"&&a(g,S,$,W,x,F)}"value"in C&&a(g,"value",A.value,C.value,x)}},L=(g,A,C,F,x,S,W,$,N)=>{const O=A.el=g?g.el:o(""),ee=A.anchor=g?g.anchor:o("");let{patchFlag:q,dynamicChildren:Z,slotScopeIds:ie}=A;ie&&($=$?$.concat(ie):ie),g==null?(i(O,C,F),i(ee,C,F),z(A.children||[],C,ee,x,S,W,$,N)):q>0&&q&64&&Z&&g.dynamicChildren?(R(g.dynamicChildren,Z,C,x,S,W,$),(A.key!=null||x&&A===x.subTree)&&bc(g,A,!0)):Q(g,A,C,ee,x,S,W,$,N)},Y=(g,A,C,F,x,S,W,$,N)=>{A.slotScopeIds=$,g==null?A.shapeFlag&512?x.ctx.activate(A,C,F,W,N):G(A,C,F,x,S,W,N):J(g,A,N)},G=(g,A,C,F,x,S,W)=>{const $=g.component=Wh(g,F,x);if(Li(g)&&($.ctx.renderer=X),Gh($,!1,W),$.asyncDep){if(x&&x.registerDep($,V,W),!g.el){const N=$.subTree=Me(Ze);D(null,N,A,C)}}else V($,g,A,C,x,S,W)},J=(g,A,C)=>{const F=A.component=g.component;if(Ih(g,A,C))if(F.asyncDep&&!F.asyncResolved){te(F,A,C);return}else F.next=A,F.update();else A.el=g.el,F.vnode=A},V=(g,A,C,F,x,S,W)=>{const $=()=>{if(g.isMounted){let{next:q,bu:Z,u:ie,parent:ue,vnode:_e}=g;{const rt=kc(g);if(rt){q&&(q.el=_e.el,te(g,q,W)),rt.asyncDep.then(()=>{g.isUnmounted||$()});return}}let ge=q,at;mn(g,!1),q?(q.el=_e.el,te(g,q,W)):q=_e,Z&&Nl(Z),(at=q.props&&q.props.onVnodeBeforeUpdate)&&gt(at,ue,q,_e),mn(g,!0);const He=Kl(g),yt=g.subTree;g.subTree=He,B(yt,He,p(yt.el),w(yt),g,x,S),q.el=He.el,ge===null&&Mh(g,He.el),ie&&ot(ie,x),(at=q.props&&q.props.onVnodeUpdated)&&ot(()=>gt(at,ue,q,_e),x)}else{let q;const{el:Z,props:ie}=A,{bm:ue,m:_e,parent:ge,root:at,type:He}=g,yt=Qn(A);if(mn(g,!1),ue&&Nl(ue),!yt&&(q=ie&&ie.onVnodeBeforeMount)&&gt(q,ge,A),mn(g,!0),Z&&Be){const rt=()=>{g.subTree=Kl(g),Be(Z,g.subTree,g,x,null)};yt&&He.__asyncHydrate?He.__asyncHydrate(Z,g,rt):rt()}else{at.ce&&at.ce._injectChildStyle(He);const rt=g.subTree=Kl(g);B(null,rt,C,F,g,x,S),A.el=rt.el}if(_e&&ot(_e,x),!yt&&(q=ie&&ie.onVnodeMounted)){const rt=A;ot(()=>gt(q,ge,rt),x)}(A.shapeFlag&256||ge&&Qn(ge.vnode)&&ge.vnode.shapeFlag&256)&&g.a&&ot(g.a,x),g.isMounted=!0,A=C=F=null}};g.scope.on();const N=g.effect=new Fo($);g.scope.off();const O=g.update=N.run.bind(N),ee=g.job=N.runIfDirty.bind(N);ee.i=g,ee.id=g.uid,N.scheduler=()=>nr(ee),mn(g,!0),O()},te=(g,A,C)=>{A.component=g;const F=g.vnode.props;g.vnode=A,g.next=null,yh(g,A.props,F,C),Ch(g,A.children,C),hn(),Qr(g),En()},Q=(g,A,C,F,x,S,W,$,N=!1)=>{const O=g&&g.children,ee=g?g.shapeFlag:0,q=A.children,{patchFlag:Z,shapeFlag:ie}=A;if(Z>0){if(Z&128){nt(O,q,C,F,x,S,W,$,N);return}else if(Z&256){ce(O,q,C,F,x,S,W,$,N);return}}ie&8?(ee&16&&je(O,x,S),q!==O&&u(C,q)):ee&16?ie&16?nt(O,q,C,F,x,S,W,$,N):je(O,x,S,!0):(ee&8&&u(C,""),ie&16&&z(q,C,F,x,S,W,$,N))},ce=(g,A,C,F,x,S,W,$,N)=>{g=g||Un,A=A||Un;const O=g.length,ee=A.length,q=Math.min(O,ee);let Z;for(Z=0;Z<q;Z++){const ie=A[Z]=N?rn(A[Z]):vt(A[Z]);B(g[Z],ie,C,null,x,S,W,$,N)}O>ee?je(g,x,S,!0,!1,q):z(A,C,F,x,S,W,$,N,q)},nt=(g,A,C,F,x,S,W,$,N)=>{let O=0;const ee=A.length;let q=g.length-1,Z=ee-1;for(;O<=q&&O<=Z;){const ie=g[O],ue=A[O]=N?rn(A[O]):vt(A[O]);if(yn(ie,ue))B(ie,ue,C,null,x,S,W,$,N);else break;O++}for(;O<=q&&O<=Z;){const ie=g[q],ue=A[Z]=N?rn(A[Z]):vt(A[Z]);if(yn(ie,ue))B(ie,ue,C,null,x,S,W,$,N);else break;q--,Z--}if(O>q){if(O<=Z){const ie=Z+1,ue=ie<ee?A[ie].el:F;for(;O<=Z;)B(null,A[O]=N?rn(A[O]):vt(A[O]),C,ue,x,S,W,$,N),O++}}else if(O>Z)for(;O<=q;)$e(g[O],x,S,!0),O++;else{const ie=O,ue=O,_e=new Map;for(O=ue;O<=Z;O++){const st=A[O]=N?rn(A[O]):vt(A[O]);st.key!=null&&_e.set(st.key,O)}let ge,at=0;const He=Z-ue+1;let yt=!1,rt=0;const ui=new Array(He);for(O=0;O<He;O++)ui[O]=0;for(O=ie;O<=q;O++){const st=g[O];if(at>=He){$e(st,x,S,!0);continue}let Rt;if(st.key!=null)Rt=_e.get(st.key);else for(ge=ue;ge<=Z;ge++)if(ui[ge-ue]===0&&yn(st,A[ge])){Rt=ge;break}Rt===void 0?$e(st,x,S,!0):(ui[Rt-ue]=O+1,Rt>=rt?rt=Rt:yt=!0,B(st,A[Rt],C,null,x,S,W,$,N),at++)}const Ur=yt?wh(ui):Un;for(ge=Ur.length-1,O=He-1;O>=0;O--){const st=ue+O,Rt=A[st],Wr=st+1<ee?A[st+1].el:F;ui[O]===0?B(null,Rt,C,Wr,x,S,W,$,N):yt&&(ge<0||O!==Ur[ge]?Ue(Rt,C,Wr,2):ge--)}}},Ue=(g,A,C,F,x=null)=>{const{el:S,type:W,transition:$,children:N,shapeFlag:O}=g;if(O&6){Ue(g.component.subTree,A,C,F);return}if(O&128){g.suspense.move(A,C,F);return}if(O&64){W.move(g,A,C,X);return}if(W===Xe){i(S,A,C);for(let q=0;q<N.length;q++)Ue(N[q],A,C,F);i(g.anchor,A,C);return}if(W===vi){m(g,A,C);return}if(F!==2&&O&1&&$)if(F===0)$.beforeEnter(S),i(S,A,C),ot(()=>$.enter(S),x);else{const{leave:q,delayLeave:Z,afterLeave:ie}=$,ue=()=>i(S,A,C),_e=()=>{q(S,()=>{ue(),ie&&ie()})};Z?Z(S,ue,_e):_e()}else i(S,A,C)},$e=(g,A,C,F=!1,x=!1)=>{const{type:S,props:W,ref:$,children:N,dynamicChildren:O,shapeFlag:ee,patchFlag:q,dirs:Z,cacheIndex:ie}=g;if(q===-2&&(x=!1),$!=null&&hl($,null,C,g,!0),ie!=null&&(A.renderCache[ie]=void 0),ee&256){A.ctx.deactivate(g);return}const ue=ee&1&&Z,_e=!Qn(g);let ge;if(_e&&(ge=W&&W.onVnodeBeforeUnmount)&&gt(ge,A,g),ee&6)lt(g.component,C,F);else{if(ee&128){g.suspense.unmount(C,F);return}ue&&Ot(g,null,A,"beforeUnmount"),ee&64?g.type.remove(g,A,C,X,F):O&&!O.hasOnce&&(S!==Xe||q>0&&q&64)?je(O,A,C,!1,!0):(S===Xe&&q&384||!x&&ee&16)&&je(N,A,C),F&&it(g)}(_e&&(ge=W&&W.onVnodeUnmounted)||ue)&&ot(()=>{ge&&gt(ge,A,g),ue&&Ot(g,null,A,"unmounted")},C)},it=g=>{const{type:A,el:C,anchor:F,transition:x}=g;if(A===Xe){Mt(C,F);return}if(A===vi){_(g);return}const S=()=>{l(C),x&&!x.persisted&&x.afterLeave&&x.afterLeave()};if(g.shapeFlag&1&&x&&!x.persisted){const{leave:W,delayLeave:$}=x,N=()=>W(C,S);$?$(g.el,S,N):N()}else S()},Mt=(g,A)=>{let C;for(;g!==A;)C=h(g),l(g),g=C;l(A)},lt=(g,A,C)=>{const{bum:F,scope:x,job:S,subTree:W,um:$,m:N,a:O}=g;as(N),as(O),F&&Nl(F),x.stop(),S&&(S.flags|=8,$e(W,g,A,C)),$&&ot($,A),ot(()=>{g.isUnmounted=!0},A),A&&A.pendingBranch&&!A.isUnmounted&&g.asyncDep&&!g.asyncResolved&&g.suspenseId===A.pendingId&&(A.deps--,A.deps===0&&A.resolve())},je=(g,A,C,F=!1,x=!1,S=0)=>{for(let W=S;W<g.length;W++)$e(g[W],A,C,F,x)},w=g=>{if(g.shapeFlag&6)return w(g.component.subTree);if(g.shapeFlag&128)return g.suspense.next();const A=h(g.anchor||g.el),C=A&&A[Gd];return C?h(C):A};let K=!1;const U=(g,A,C)=>{g==null?A._vnode&&$e(A._vnode,null,null,!0):B(A._vnode||null,g,A,null,null,null,C),A._vnode=g,K||(K=!0,Qr(),pl(),K=!1)},X={p:B,um:$e,m:Ue,r:it,mt:G,mc:z,pc:Q,pbc:R,n:w,o:e};let re,Be;return t&&([re,Be]=t(X)),{render:U,hydrate:re,createApp:Ah(U,re)}}function ql({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function mn({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function _c(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function bc(e,t,n=!1){const i=e.children,l=t.children;if(ne(i)&&ne(l))for(let a=0;a<i.length;a++){const r=i[a];let o=l[a];o.shapeFlag&1&&!o.dynamicChildren&&((o.patchFlag<=0||o.patchFlag===32)&&(o=l[a]=rn(l[a]),o.el=r.el),!n&&o.patchFlag!==-2&&bc(r,o)),o.type===Dn&&(o.el=r.el)}}function wh(e){const t=e.slice(),n=[0];let i,l,a,r,o;const c=e.length;for(i=0;i<c;i++){const d=e[i];if(d!==0){if(l=n[n.length-1],e[l]<d){t[i]=l,n.push(i);continue}for(a=0,r=n.length-1;a<r;)o=a+r>>1,e[n[o]]<d?a=o+1:r=o;d<e[n[a]]&&(a>0&&(t[i]=n[a-1]),n[a]=i)}}for(a=n.length,r=n[a-1];a-- >0;)n[a]=r,r=t[r];return n}function kc(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:kc(t)}function as(e){if(e)for(let t=0;t<e.length;t++)e[t].flags|=8}const xh=Symbol.for("v-scx"),Fh=()=>ve(xh);function or(e,t){return cr(e,null,t)}function we(e,t,n){return cr(e,t,n)}function cr(e,t,n=ke){const{immediate:i,deep:l,flush:a,once:r}=n,o=Ne({},n),c=t&&i||!t&&a!=="post";let d;if(Xn){if(a==="sync"){const E=Fh();d=E.__watcherHandles||(E.__watcherHandles=[])}else if(!c){const E=()=>{};return E.stop=It,E.resume=It,E.pause=It,E}}const u=Ie;o.call=(E,v,B)=>Dt(E,u,v,B);let p=!1;
vendor: 4,883 bytes, line 15
15a==="post"?o.scheduler=E=>{ot(E,u&&u.suspense)}:a!=="sync"&&(p=!0,o.scheduler=(E,v)=>{v?E():nr(E)}),o.augmentJob=E=>{t&&(E.flags|=4),p&&(E.flags|=2,u&&(E.id=u.uid,E.i=u))};const h=jd(e,t,o);return Xn&&(d?d.push(h):c&&h()),h}function Sh(e,t,n){const i=this.proxy,l=Le(e)?e.includes(".")?Cc(i,e):()=>i[e]:e.bind(i,i);let a;le(t)?a=t:(a=t.handler,n=t);const r=Oi(this),o=cr(l,a.bind(i),n);return r(),o}function Cc(e,t){const n=t.split(".");return()=>{let i=e;for(let l=0;l<n.length&&i;l++)i=i[n[l]];return i}}const Ph=(e,t)=>t==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${et(t)}Modifiers`]||e[`${Fn(t)}Modifiers`];function Rh(e,t,...n){if(e.isUnmounted)return;const i=e.vnode.props||ke;let l=n;const a=t.startsWith("update:"),r=a&&Ph(i,t.slice(7));r&&(r.trim&&(l=n.map(u=>Le(u)?u.trim():u)),r.number&&(l=n.map(ed)));let o,c=i[o=Vl(t)]||i[o=Vl(et(t))];!c&&a&&(c=i[o=Vl(Fn(t))]),c&&Dt(c,e,6,l);const d=i[o+"Once"];if(d){if(!e.emitted)e.emitted={};else if(e.emitted[o])return;e.emitted[o]=!0,Dt(d,e,6,l)}}function Dc(e,t,n=!1){const i=t.emitsCache,l=i.get(e);if(l!==void 0)return l;const a=e.emits;let r={},o=!1;if(!le(e)){const c=d=>{const u=Dc(d,t,!0);u&&(o=!0,Ne(r,u))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!a&&!o?(Te(e)&&i.set(e,null),null):(ne(a)?a.forEach(c=>r[c]=null):Ne(r,a),Te(e)&&i.set(e,r),r)}function Tl(e,t){return!e||!Fi(t)?!1:(t=t.slice(2).replace(/Once$/,""),Ee(e,t[0].toLowerCase()+t.slice(1))||Ee(e,Fn(t))||Ee(e,t))}function Kl(e){const{type:t,vnode:n,proxy:i,withProxy:l,propsOptions:[a],slots:r,attrs:o,emit:c,render:d,renderCache:u,props:p,data:h,setupState:E,ctx:v,inheritAttrs:B}=e,k=dl(e);let D,y;try{if(n.shapeFlag&4){const _=l||i,P=_;D=vt(d.call(P,_,u,p,E,h,v)),y=o}else{const _=t;D=vt(_.length>1?_(p,{attrs:o,slots:r,emit:c}):_(p,null)),y=t.props?o:Lh(o)}}catch(_){Ai.length=0,Ri(_,e,1),D=Me(Ze)}let m=D;if(y&&B!==!1){const _=Object.keys(y),{shapeFlag:P}=m;_.length&&P&7&&(a&&_.some(Ga)&&(y=Oh(y,a)),m=pn(m,y,!1,!0))}return n.dirs&&(m=pn(m,null,!1,!0),m.dirs=m.dirs?m.dirs.concat(n.dirs):n.dirs),n.transition&&xn(m,n.transition),D=m,dl(k),D}const Lh=e=>{let t;for(const n in e)(n==="class"||n==="style"||Fi(n))&&((t||(t={}))[n]=e[n]);return t},Oh=(e,t)=>{const n={};for(const i in e)(!Ga(i)||!(i.slice(9)in t))&&(n[i]=e[i]);return n};function Ih(e,t,n){const{props:i,children:l,component:a}=e,{props:r,children:o,patchFlag:c}=t,d=a.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return i?rs(i,r,d):!!r;if(c&8){const u=t.dynamicProps;for(let p=0;p<u.length;p++){const h=u[p];if(r[h]!==i[h]&&!Tl(d,h))return!0}}}else return(l||o)&&(!o||!o.$stable)?!0:i===r?!1:i?r?rs(i,r,d):!0:!!r;return!1}function rs(e,t,n){const i=Object.keys(t);if(i.length!==Object.keys(e).length)return!0;for(let l=0;l<i.length;l++){const a=i[l];if(t[a]!==e[a]&&!Tl(n,a))return!0}return!1}function Mh({vnode:e,parent:t},n){for(;t;){const i=t.subTree;if(i.suspense&&i.suspense.activeBranch===e&&(i.el=e.el),i===e)(e=t.vnode).el=n,t=t.parent;else break}}const Tc=e=>e.__isSuspense;function wc(e,t){t&&t.pendingBranch?ne(e)?t.effects.push(...e):t.effects.push(e):Ud(e)}const Xe=Symbol.for("v-fgt"),Dn=Symbol.for("v-txt"),Ze=Symbol.for("v-cmt"),vi=Symbol.for("v-stc"),Ai=[];let pt=null;function V2(e=!1){Ai.push(pt=e?null:[])}function Vh(){Ai.pop(),pt=Ai[Ai.length-1]||null}let Ti=1;function ss(e){Ti+=e,e<0&&pt&&(pt.hasOnce=!0)}function Nh(e){return e.dynamicChildren=Ti>0?pt||Un:null,Vh(),Ti>0&&pt&&pt.push(e),e}function N2(e,t,n,i,l,a){return Nh(Fc(e,t,n,i,l,a,!0))}function fl(e){return e?e.__v_isVNode===!0:!1}function yn(e,t){return e.type===t.type&&e.key===t.key}const xc=({key:e})=>e??null,al=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?Le(e)||Re(e)||le(e)?{i:ut,r:e,k:t,f:!!n}:e:null);function Fc(e,t=null,n=null,i=0,l=null,a=e===Xe?0:1,r=!1,o=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&xc(t),ref:t&&al(t),scopeId:Zo,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:a,patchFlag:i,dynamicProps:l,dynamicChildren:null,appContext:null,ctx:ut};return o?(ur(c,n),a&128&&e.normalize(c)):n&&(c.shapeFlag|=Le(n)?8:16),Ti>0&&!r&&pt&&(c.patchFlag>0||a&6)&&c.patchFlag!==32&&pt.push(c),c}const Me=$h;function $h(e,t=null,n=null,i=0,l=null,a=!1){if((!e||e===uh)&&(e=Ze),fl(e)){const o=pn(e,t,!0);return n&&ur(o,n),Ti>0&&!a&&pt&&(o.shapeFlag&6?pt[pt.indexOf(e)]=o:pt.push(o)),o.patchFlag=-2,o}if(Jh(e)&&(e=e.__vccOpts),t){t=jh(t);let{class:o,style:c}=t;o&&!Le(o)&&(t.class=Ya(o)),Te(c)&&(tr(c)&&!ne(c)&&(c=Ne({},c)),t.style=Qa(c))}const r=Le(e)?1:Tc(e)?128:ec(e)?64:Te(e)?4:le(e)?2:0;return Fc(e,t,n,i,l,r,a,!0)}function jh(e){return e?tr(e)||fc(e)?Ne({},e):e:null}
vendor: 4,679 bytes, lines 15-18
15function pn(e,t,n=!1,i=!1){const{props:l,ref:a,patchFlag:r,children:o,transition:c}=e,d=t?Hh(l||{},t):l,u={__v_isVNode:!0,__v_skip:!0,type:e.type,props:d,key:d&&xc(d),ref:t&&t.ref?n&&a?ne(a)?a.concat(al(t)):[a,al(t)]:al(t):a,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:o,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Xe?r===-1?16:r|16:r,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:c,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&pn(e.ssContent),ssFallback:e.ssFallback&&pn(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return c&&i&&xn(u,c.clone(u)),u}function Sc(e=" ",t=0){return Me(Dn,null,e,t)}function $2(e,t){const n=Me(vi,null,e);return n.staticCount=t,n}function vt(e){return e==null||typeof e=="boolean"?Me(Ze):ne(e)?Me(Xe,null,e.slice()):fl(e)?rn(e):Me(Dn,null,String(e))}function rn(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:pn(e)}function ur(e,t){let n=0;const{shapeFlag:i}=e;if(t==null)t=null;else if(ne(t))n=16;else if(typeof t=="object")if(i&65){const l=t.default;l&&(l._c&&(l._d=!1),ur(e,l()),l._c&&(l._d=!0));return}else{n=32;const l=t._;!l&&!fc(t)?t._ctx=ut:l===3&&ut&&(ut.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else le(t)?(t={default:t,_ctx:ut},n=32):(t=String(t),i&64?(n=16,t=[Sc(t)]):n=8);e.children=t,e.shapeFlag|=n}function Hh(...e){const t={};for(let n=0;n<e.length;n++){const i=e[n];for(const l in i)if(l==="class")t.class!==i.class&&(t.class=Ya([t.class,i.class]));else if(l==="style")t.style=Qa([t.style,i.style]);else if(Fi(l)){const a=t[l],r=i[l];r&&a!==r&&!(ne(a)&&a.includes(r))&&(t[l]=a?[].concat(a,r):r)}else l!==""&&(t[l]=i[l])}return t}function gt(e,t,n,i=null){Dt(e,t,7,[n,i])}const zh=pc();let Uh=0;function Wh(e,t,n){const i=e.type,l=(t?t.appContext:e.appContext)||zh,a={uid:Uh++,vnode:e,type:i,parent:t,appContext:l,root:null,next:null,subTree:null,effect:null,update:null,job:null,scope:new cd(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:t?t.provides:Object.create(l.provides),ids:t?t.ids:["",0,0],accessCache:null,renderCache:[],components:null,directives:null,propsOptions:mc(i,l),emitsOptions:Dc(i,l),emit:null,emitted:null,propsDefaults:ke,inheritAttrs:i.inheritAttrs,ctx:ke,data:ke,props:ke,attrs:ke,slots:ke,refs:ke,setupState:ke,setupContext:null,suspense:n,suspenseId:n?n.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};return a.ctx={_:a},a.root=t?t.root:a,a.emit=Rh.bind(null,a),e.ce&&e.ce(a),a}let Ie=null;const Pn=()=>Ie||ut;let gl,_a;{const e=_l(),t=(n,i)=>{let l;return(l=e[n])||(l=e[n]=[]),l.push(i),a=>{l.length>1?l.forEach(r=>r(a)):l[0](a)}};gl=t("__VUE_INSTANCE_SETTERS__",n=>Ie=n),_a=t("__VUE_SSR_SETTERS__",n=>Xn=n)}const Oi=e=>{const t=Ie;return gl(e),e.scope.on(),()=>{e.scope.off(),gl(t)}},os=()=>{Ie&&Ie.scope.off(),gl(null)};function Pc(e){return e.vnode.shapeFlag&4}let Xn=!1;function Gh(e,t=!1,n=!1){t&&_a(t);const{props:i,children:l}=e.vnode,a=Pc(e);Bh(e,i,a,t),kh(e,l,n);const r=a?qh(e,t):void 0;return t&&_a(!1),r}function qh(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,dh);const{setup:i}=n;if(i){hn();const l=e.setupContext=i.length>1?Qh(e):null,a=Oi(e),r=Pi(i,e,0,[e.props,l]),o=_o(r);if(En(),a(),(o||e.sp)&&!Qn(e)&&ar(e),o){if(r.then(os,os),t)return r.then(c=>{cs(e,c)}).catch(c=>{Ri(c,e,0)});e.asyncDep=r}else cs(e,r)}else Rc(e)}function cs(e,t,n){le(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Te(t)&&(e.setupState=Ko(t)),Rc(e)}function Rc(e,t,n){const i=e.type;e.render||(e.render=i.render||It);{const l=Oi(e);hn();try{hh(e)}finally{En(),l()}}}const Kh={get(e,t){return ze(e,"get",""),e[t]}};function Qh(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,Kh),slots:e.slots,emit:e.emit,expose:t}}function pr(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Ko(Sd(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in mi)return mi[n](e)},has(t,n){return n in t||n in mi}})):e.proxy}function Yh(e,t=!0){return le(e)?e.displayName||e.name:e.name||t&&e.__name}function Jh(e){return le(e)&&"__vccOpts"in e}const b=(e,t)=>Nd(e,t,Xn);function s(e,t,n){const i=arguments.length;return i===2?Te(t)&&!ne(t)?fl(t)?Me(e,null,[t]):Me(e,t):Me(e,null,t):(i>3?n=Array.prototype.slice.call(arguments,2):i===3&&fl(n)&&(n=[n]),Me(e,t,n))}const Xh="3.5.12";/**
16* @vue/runtime-dom v3.5.12
17* (c) 2018-present Yuxi (Evan) You and Vue contributors
18* @license MIT
19**/let ba;const us=typeof window<"u"&&window.trustedTypes;if(us)try{ba=us.createPolicy("vue",{createHTML:e=>e})}catch{}const Lc=ba?e=>ba.createHTML(e):e=>e,Zh="http://www.w3.org/2000/svg",eE="http://www.w3.org/1998/Math/MathML",zt=typeof document<"u"?document:null,ps=zt&&zt.createElement("template"),tE={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,i)=>{const l=t==="svg"?zt.createElementNS(Zh,e):t==="mathml"?zt.createElementNS(eE,e):n?zt.createElement(e,{is:n}):zt.createElement(e);return e==="select"&&i&&i.multiple!=null&&l.setAttribute("multiple",i.multiple),l},createText:e=>zt.createTextNode(e),createComment:e=>zt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>zt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,i,l,a){const r=n?n.previousSibling:t.lastChild;if(l&&(l===a||l.nextSibling))for(;t.insertBefore(l.cloneNode(!0),n),!(l===a||!(l=l.nextSibling)););else{ps.innerHTML=Lc(i==="svg"?`<svg>${e}</svg>`:i==="mathml"?`<math>${e}</math>`:e);const o=ps.content;if(i==="svg"||i==="mathml"){const c=o.firstChild;for(;c.firstChild;)o.appendChild(c.firstChild);o.removeChild(c)}t.insertBefore(o,n)}return[r?r.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},en="transition",di="animation",Zn=Symbol("_vtc"),Oc={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Ic=Ne({},nc,Oc),nE=e=>(e.displayName="Transition",e.props=Ic,e),ei=nE((e,{slots:t})=>s(Kd,Mc(e),t)),vn=(e,t=[])=>{ne(e)?e.forEach(n=>n(...t)):e&&e(...t)},ds=e=>e?ne(e)?e.some(t=>t.length>1):e.length>1:!1;function Mc(e){const t={};for(const L in e)L in Oc||(t[L]=e[L]);if(e.css===!1)return t;const{name:n="v",type:i,duration:l,enterFromClass:a=`${n}-enter-from`,enterActiveClass:r=`${n}-enter-active`,enterToClass:o=`${n}-enter-to`,appearFromClass:c=a,appearActiveClass:d=r,appearToClass:u=o,leaveFromClass:p=`${n}-leave-from`,leaveActiveClass:h=`${n}-leave-active`,leaveToClass:E=`${n}-leave-to`}=e,v=iE(l),B=v&&v[0],k=v&&v[1],{onBeforeEnter:D,onEnter:y,onEnterCancelled:m,onLeave:_,onLeaveCancelled:P,onBeforeAppear:H=D,onAppear:M=y,onAppearCancelled:z=m}=t,T=(L,Y,G)=>{nn(L,Y?u:o),nn(L,Y?d:r),G&&G()},R=(L,Y)=>{L._isLeaving=!1,nn(L,p),nn(L,E),nn(L,h),Y&&Y()},j=L=>(Y,G)=>{const J=L?M:y,V=()=>T(Y,L,G);vn(J,[Y,V]),hs(()=>{nn(Y,L?c:a),jt(Y,L?u:o),ds(J)||Es(Y,i,B,V)})};return Ne(t,{onBeforeEnter(L){vn(D,[L]),jt(L,a),jt(L,r)},onBeforeAppear(L){vn(H,[L]),jt(L,c),jt(L,d)},onEnter:j(!1),onAppear:j(!0),onLeave(L,Y){L._isLeaving=!0;const G=()=>R(L,Y);jt(L,p),jt(L,h),Nc(),hs(()=>{L._isLeaving&&(nn(L,p),jt(L,E),ds(_)||Es(L,i,k,G))}),vn(_,[L,G])},onEnterCancelled(L){T(L,!1),vn(m,[L])},onAppearCancelled(L){T(L,!0),vn(z,[L])},onLeaveCancelled(L){R(L),vn(P,[L])}})}function iE(e){if(e==null)return null;if(Te(e))return[Ql(e.enter),Ql(e.leave)];{const t=Ql(e);return[t,t]}}function Ql(e){return td(e)}function jt(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[Zn]||(e[Zn]=new Set)).add(t)}function nn(e,t){t.split(/\s+/).forEach(i=>i&&e.classList.remove(i));const n=e[Zn];n&&(n.delete(t),n.size||(e[Zn]=void 0))}function hs(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let lE=0;function Es(e,t,n,i){const l=e._endId=++lE,a=()=>{l===e._endId&&i()};if(n!=null)return setTimeout(a,n);const{type:r,timeout:o,propCount:c}=Vc(e,t);if(!r)return i();const d=r+"end";let u=0;const p=()=>{e.removeEventListener(d,h),a()},h=E=>{E.target===e&&++u>=c&&p()};setTimeout(()=>{u<c&&p()},o+1),e.addEventListener(d,h)}function Vc(e,t){const n=window.getComputedStyle(e),i=v=>(n[v]||"").split(", "),l=i(`${en}Delay`),a=i(`${en}Duration`),r=fs(l,a),o=i(`${di}Delay`),c=i(`${di}Duration`),d=fs(o,c);let u=null,p=0,h=0;t===en?r>0&&(u=en,p=r,h=a.length):t===di?d>0&&(u=di,p=d,h=c.length):(p=Math.max(r,d),u=p>0?r>d?en:di:null,h=u?u===en?a.length:c.length:0);const E=u===en&&/\b(transform|all)(,|$)/.test(i(`${en}Property`).toString());return{type:u,timeout:p,propCount:h,hasTransform:E}}function fs(e,t){for(;e.length<t.length;)e=e.concat(e);return Math.max(...t.map((n,i)=>gs(n)+gs(e[i])))}function gs(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function Nc(){return document.body.offsetHeight}function aE(e,t,n){const i=e[Zn];i&&(t=(t?[t,...i]:[...i]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const ms=Symbol("_vod"),rE=Symbol("_vsh"),sE=Symbol(""),oE=/(^|;)\s*display\s*:/;function cE(e,t,n){const i=e.style,l=Le(n);let a=!1;if(n&&!l){if(t)if(Le(t))for(const r of t.split(";")){const o=r.slice(0,r.indexOf(":")).trim();n[o]==null&&rl(i,o,"")}else for(const r in t)n[r]==null&&rl(i,r,"");for(const r in n)r==="display"&&(a=!0),rl(i,r,n[r])}else if(l){if(t!==n){const r=i[sE];r&&(n+=";"+r),i.cssText=n,a=oE.test(n)}}else t&&e.removeAttribute("style");ms in e&&(e[ms]=a?i.display:"",e[rE]&&(i.display="none"))}const vs=/\s*!important$/;function rl(e,t,n){if(ne(n))n.forEach(i=>
vendor: 4,382 bytes, line 19
19rl(e,t,i));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const i=uE(e,t);vs.test(n)?e.setProperty(Fn(i),n.replace(vs,""),"important"):e[i]=n}}const As=["Webkit","Moz","ms"],Yl={};function uE(e,t){const n=Yl[t];if(n)return n;let i=et(t);if(i!=="filter"&&i in e)return Yl[t]=i;i=Si(i);for(let l=0;l<As.length;l++){const a=As[l]+i;if(a in e)return Yl[t]=a}return t}const Bs="http://www.w3.org/1999/xlink";function ys(e,t,n,i,l,a=sd(t)){i&&t.startsWith("xlink:")?n==null?e.removeAttributeNS(Bs,t.slice(6,t.length)):e.setAttributeNS(Bs,t,n):n==null||a&&!Do(n)?e.removeAttribute(t):e.setAttribute(t,a?"":dn(n)?String(n):n)}function _s(e,t,n,i,l){if(t==="innerHTML"||t==="textContent"){n!=null&&(e[t]=t==="innerHTML"?Lc(n):n);return}const a=e.tagName;if(t==="value"&&a!=="PROGRESS"&&!a.includes("-")){const o=a==="OPTION"?e.getAttribute("value")||"":e.value,c=n==null?e.type==="checkbox"?"on":"":String(n);(o!==c||!("_value"in e))&&(e.value=c),n==null&&e.removeAttribute(t),e._value=n;return}let r=!1;if(n===""||n==null){const o=typeof e[t];o==="boolean"?n=Do(n):n==null&&o==="string"?(n="",r=!0):o==="number"&&(n=0,r=!0)}try{e[t]=n}catch{}r&&e.removeAttribute(l||t)}function pE(e,t,n,i){e.addEventListener(t,n,i)}function dE(e,t,n,i){e.removeEventListener(t,n,i)}const bs=Symbol("_vei");function hE(e,t,n,i,l=null){const a=e[bs]||(e[bs]={}),r=a[t];if(i&&r)r.value=i;else{const[o,c]=EE(t);if(i){const d=a[t]=mE(i,l);pE(e,o,d,c)}else r&&(dE(e,o,r,c),a[t]=void 0)}}const ks=/(?:Once|Passive|Capture)$/;function EE(e){let t;if(ks.test(e)){t={};let i;for(;i=e.match(ks);)e=e.slice(0,e.length-i[0].length),t[i[0].toLowerCase()]=!0}return[e[2]===":"?e.slice(3):Fn(e.slice(2)),t]}let Jl=0;const fE=Promise.resolve(),gE=()=>Jl||(fE.then(()=>Jl=0),Jl=Date.now());function mE(e,t){const n=i=>{if(!i._vts)i._vts=Date.now();else if(i._vts<=n.attached)return;Dt(vE(i,n.value),t,5,[i])};return n.value=e,n.attached=gE(),n}function vE(e,t){if(ne(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(i=>l=>!l._stopped&&i&&i(l))}else return t}const Cs=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,AE=(e,t,n,i,l,a)=>{const r=l==="svg";t==="class"?aE(e,i,r):t==="style"?cE(e,n,i):Fi(t)?Ga(t)||hE(e,t,n,i,a):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):BE(e,t,i,r))?(_s(e,t,i),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&ys(e,t,i,r,a,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!Le(i))?_s(e,et(t),i,a,t):(t==="true-value"?e._trueValue=i:t==="false-value"&&(e._falseValue=i),ys(e,t,i,r))};function BE(e,t,n,i){if(i)return!!(t==="innerHTML"||t==="textContent"||t in e&&Cs(t)&&le(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const l=e.tagName;if(l==="IMG"||l==="VIDEO"||l==="CANVAS"||l==="SOURCE")return!1}return Cs(t)&&Le(n)?!1:t in e}const $c=new WeakMap,jc=new WeakMap,ml=Symbol("_moveCb"),Ds=Symbol("_enterCb"),yE=e=>(delete e.props.mode,e),_E=yE({name:"TransitionGroup",props:Ne({},Ic,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=Pn(),i=tc();let l,a;return oc(()=>{if(!l.length)return;const r=e.moveClass||`${e.name||"v"}-move`;if(!DE(l[0].el,n.vnode.el,r))return;l.forEach(bE),l.forEach(kE);const o=l.filter(CE);Nc(),o.forEach(c=>{const d=c.el,u=d.style;jt(d,r),u.transform=u.webkitTransform=u.transitionDuration="";const p=d[ml]=h=>{h&&h.target!==d||(!h||/transform$/.test(h.propertyName))&&(d.removeEventListener("transitionend",p),d[ml]=null,nn(d,r))};d.addEventListener("transitionend",p)})}),()=>{const r=pe(e),o=Mc(r);let c=r.tag||Xe;if(l=[],a)for(let d=0;d<a.length;d++){const u=a[d];u.el&&u.el instanceof Element&&(l.push(u),xn(u,Di(u,o,i,n)),$c.set(u,u.el.getBoundingClientRect()))}a=t.default?ir(t.default()):[];for(let d=0;d<a.length;d++){const u=a[d];u.key!=null&&xn(u,Di(u,o,i,n))}return Me(c,null,a)}}}),Hc=_E;function bE(e){const t=e.el;t[ml]&&t[ml](),t[Ds]&&t[Ds]()}function kE(e){jc.set(e,e.el.getBoundingClientRect())}function CE(e){const t=$c.get(e),n=jc.get(e),i=t.left-n.left,l=t.top-n.top;if(i||l){const a=e.el.style;return a.transform=a.webkitTransform=`translate(${i}px,${l}px)`,a.transitionDuration="0s",e}}function DE(e,t,n){const i=e.cloneNode(),l=e[Zn];l&&l.forEach(o=>
19{o.split(/\s+/).forEach(c=>c&&i.classList.remove(c))}),n.split(/\s+/).forEach(o=>o&&i.classList.add(o)),i.style.display="none";const a=t.nodeType===1?t:t.parentNode;a.appendChild(i);const{hasTransform:r}=Vc(i);return a.removeChild(i),r}const TE=Ne({patchProp:AE},tE);let Xl,Ts=!1;function wE(){return Xl=Ts?Xl:Dh(TE),Ts=!0,Xl}const xE=(...e)=>{const t=wE().createApp(...e),{mount:n}=t;return t.mount=i=>{const l=SE(i);if(l)return n(l,!0,FE(l))},t};function FE(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function SE(e){return Le(e)?document.querySelector(e):e}var Ii=e=>/^[a-z][a-z0-9+.-]*:/.test(e)||e.startsWith("//"),PE=/.md((\?|#).*)?$/,dr=(e,t="/")=>Ii(e)||e.startsWith("/")&&!e.startsWith(t)&&!PE.test(e),li=e=>/^(https?:)?\/\//.test(e),ws=e=>{if(!e||e.endsWith("/"))return e;let t=e.replace(/(^|\/)README.md$/i,"$1index.html");return t.endsWith(".md")?t=`${t.substring(0,t.length-3)}.html`:t.endsWith(".html")||(t=`${t}.html`),t.endsWith("/index.html")&&(t=t.substring(0,t.length-10)),t},RE="http://.",LE=(e,t)=>{if(!e.startsWith("/")&&t){const n=t.slice(0,t.lastIndexOf("/"));return ws(new URL(`${n}/${e}`,RE).pathname)}return ws(e)},OE=(e,t)=>{const n=Object.keys(e).sort((i,l)=>{const a=l.split("/").length-i.split("/").length;return a!==0?a:l.length-i.length});for(const i of n)if(t.startsWith(i))return i;return"/"},IE=(e,t="/")=>{const n=e.replace(/^(?:https?:)?\/\/[^/]*/,"");return n.startsWith(t)?`/${n.slice(t.length)}`:n},ME=/(#|\?)/,zc=e=>{const[t,...n]=e.split(ME);return{pathname:t,hashAndQueries:n.join("")}},VE=["link","meta","script","style","noscript","template"],NE=["title","base"],$E=([e,t,n])=>NE.includes(e)?e:VE.includes(e)?e==="meta"&&t.name?`${e}.${t.name}`:e==="template"&&t.id?`${e}.${t.id}`:JSON.stringify([e,Object.entries(t).map(([i,l])=>typeof l=="boolean"?l?[i,""]:null:[i,l]).filter(i=>i!=null).sort(([i],[l])=>i.localeCompare(l)),n]):null,jE=e=>{const t=new Set,n=[];return e.forEach(i=>{const l=$E(i);l&&!t.has(l)&&(t.add(l),n.push(i))}),n},HE=e=>e.startsWith("/")?e:`/${e}`,Uc=e=>e.endsWith("/")||e.endsWith(".html")?e:`${e}/`,hr=e=>e.endsWith("/")?e.slice(0,-1):e,Er=e=>e.startsWith("/")?e.slice(1):e,zE=e=>typeof e=="function",ai=e=>Object.prototype.toString.call(e)==="[object Object]",me=e=>typeof e=="string";const UE="modulepreload",WE=function(e){return"/"+e},xs={},f=function(t,n,i){let l=Promise.resolve();if(n&&n.length>0){let c=function(d){return Promise.all(d.map(u=>Promise.resolve(u).then(p=>({status:"fulfilled",value:p}),p=>({status:"rejected",reason:p}))))};document.getElementsByTagName("link");const r=document.querySelector("meta[property=csp-nonce]"),o=r?.nonce||r?.getAttribute("nonce");l=c(n.map(d=>{if(d=WE(d),d in xs)return;xs[d]=!0;const u=d.endsWith(".css"),p=u?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${d}"]${p}`))return;const h=document.createElement("link");if(h.rel=u?"stylesheet":UE,u||(h.as="script"),h.crossOrigin="",h.href=d,o&&h.setAttribute("nonce",o),document.head.appendChild(h),u)return new Promise((E,v)=>{h.addEventListener("load",E),h.addEventListener("error",()=>v(new Error(`Unable to preload CSS for ${d}`)))})}))}function a(r){const o=new Event("vite:preloadError",{cancelable:!0});if(o.payload=r,window.dispatchEvent(o),!o.defaultPrevented)throw r}return l.then(r=>{for(const o of r||[])o.status==="rejected"&&a(o.reason);return t().catch(a)})},GE=JSON.parse("{}"),qE=Object.fromEntries([["/",{loader:()=>f(()=>import("./index.html-YETGA09y.js"),__vite__mapDeps([0,1])),meta:{title:"博客主页",icon:"home"}}],["/intro.html",{loader:()=>f(()=>import("./intro.html-aAcg9F57.js"),__vite__mapDeps([2,1])),meta:{date:1696994087e3,cover:"/assets/images/cover3.jpg",excerpt:`
20<p>将你的个人介绍和档案放置在此处。</p>
21`,readingTime:{minutes:.07,words:22},title:"介绍页",icon:"info",type:"article"}}],["/en/",{loader:()=>f(()=>import("./index.html-C_5r_V8B.js"),__vite__mapDeps([3,1])),meta:{title:"Blog Home",icon:"home"}}],["/en/intro.html",{loader:()=>f(()=>import("./intro.html-C8VhyVo5.js"),__vite__mapDeps([4,1])),meta:{date:1696994087e3,cover:"/assets/images/cover3.jpg",excerpt:`
22<p>Place your introduction and profile here.</p>
23`,readingTime:{minutes:.04,words:12},title:"Intro Page",icon:"info",type:"article"}}],["/notes/",{loader:()=>f(()=>import("./index.html-wZV3AXFP.js"),__vite__mapDeps([5,1])),meta:{date:1714837884e3,readingTime:{minutes:.03,words:9}
23,title:"学习笔记",icon:"lightbulb",type:"article"}}],["/posts/",{loader:()=>f(()=>import("./index.html-orl_LX3C.js"),__vite__mapDeps([6,1])),meta:{date:1714837884e3,readingTime:{minutes:.03,words:9},title:"编程技术",icon:"lightbulb",type:"article"}}],["/posts/template.html",{loader:()=>f(()=>import("./template.html-CbudOp4G.js"),__vite__mapDeps([7,1])),meta:{title:"template",icon:"page",order:1,index:!1}}],["/en/posts/template.html",{loader:()=>f(()=>import("./template.html-RpriovyG.js"),__vite__mapDeps([8,1])),meta:{title:"template",icon:"page",order:1,index:!1}}],["/notes/College-Physics/Electromagnetic-Formula.html",{loader:()=>f(()=>import("./Electromagnetic-Formula.html-Ct6h15Yg.js"),__vite__mapDeps([9,1])),meta:{author:"chiichen",date:1698624e6,category:["课程笔记"],tag:["大学物理"],sticky:!1,isOriginal:!0,excerpt:`<h2>14 章——静电场</h2>
24<h3>1.库仑定律</h3>
25<h3>2.经典模型的电场强度</h3>
26<h4>电偶极子的电场强度</h4>
27<ul>
28<li>外电场对电偶极子的力矩和取向作用</li>
29</ul>
30<h4>细棒的电场强度</h4>
31<h4>圆环的电场强度</h4>
32<h4>圆盘的电场强度</h4>
33<h3>3.高斯定理</h3>
34<ul>
35<li>在真空中,通过任意闭合曲面的电场强度通量等于该曲面所包围的所有电荷的代数和除以</li>
36</ul>
37<h4>计算场强的方法:</h4>
38<ol>
39<li>根据叠加原理通过积分求各部分产生的电场强度之和</li>
40<li>利用高斯定理(主要解决电场强度均匀分布或者具有对称性的问题)</li>
41<li>由计算</li>
42</ol>`,readingTime:{minutes:5.25,words:1574},title:"电磁学公式",icon:"page",order:1,type:"article"}}],["/notes/College-Physics/",{loader:()=>f(()=>import("./index.html-C5cYkuMx.js"),__vite__mapDeps([10,1])),meta:{date:1714837884e3,readingTime:{minutes:.03,words:9},title:"大学物理",icon:"lightbulb",type:"article"}}],["/notes/Compile-Principles/Chapter0-Introduce.html",{loader:()=>f(()=>import("./Chapter0-Introduce.html-zLloqbXE.js"),__vite__mapDeps([11,1])),meta:{author:"chiichen",date:16969824e5,category:["课程笔记"],tag:["编译原理"],sticky:!0,isOriginal:!0,excerpt:`<h2>前言</h2>
43<h3>写给华工软院学生</h3>
44<ol>
45<li>2021 级编译原理考试难度较低,复习优先级低,不建议花太多时间准备。虽然根据老师不同(以徐老师为例),可能上课的内容比较深入,让学生产生了这门科目难度很大的错觉。诚然要彻底理解编译原理需要花费大量的时间,但考试内容基本都是简单的算法,只要把几个重要算法理解了,都不需要把每个概念搞的非常清楚,考试都基本不会出问题。</li>
46<li>编译原理博大精深,作为计算机底层设计的一部分,课堂上教授的内容少之又少,甚至可以说和一些工程实践是<code>严重脱钩</code>的,比如上课会花很大的精力教你自动机和自动机的相关算法,但是在实际工程运用中,我们有诸如 <code>lexer</code> 的工具帮我们完成这个工作,而且如果是编写一个简单的词法分析器,甚至只需要简单的 <code>最长字串匹配</code> 就能实现一个词法分析。仅凭课堂上学的内容,大概率连怎么写一个 TinyC(精简版的 C 语言) 都不知道。感兴趣的同学可以认真钻研一番,这对编程能力会有极大的提高。</li>
47</ol>`,readingTime:{minutes:1.59,words:478},title:"Chapter0 前言",icon:"page",order:1,type:"article"}}],["/notes/Compile-Principles/Chapter1-Compiler-composition%20.html",{loader:()=>f(()=>import("./Chapter1-Compiler-composition .html-CRiNvmmb.js"),__vite__mapDeps([12,1])),meta:{author:"chiichen",date:16969824e5,category:["课程笔记"],tag:["编译原理"],sticky:!0,isOriginal:!0,excerpt:`<h3>编译器的结构</h3>
48<ul>
49<li>词法分析 Lexical analysis (Scanning)</li>
50<li>语法分析 Syntax analysis (Parsing)</li>
51<li>语义分析 Semantic analysis</li>
52</ul>
53<div class="hint-container info">
54<p class="hint-container-title">相关信息</p>
55<p>以上三步的目的是通过分析输入代码,生成能被统一处理的中间层代码,亦即编译器前端(front-end)</p>
56</div>
57<ul>
58<li>中间代码生成 IR Generation</li>
59<li>中间代码优化 IR Optimization</li>
60<li>最终代码生成 Generation</li>
61<li>最终代码优化 Optimization</li>
62</ul>`,readingTime:{minutes:.97,words:291},title:"Chapter1 编译器组成",icon:"page",order:1,type:"article"}}],["/notes/Compile-Principles/Chapter2-Lexical-Analysis.html",{loader:()=>f(()=>import("./Chapter2-Lexical-Analysis.html-4a5iRaBc.js"),__vite__mapDeps([13,1])
62),meta:{author:"chiichen",date:16969824e5,category:["课程笔记"],tag:["编译原理"],sticky:!0,isOriginal:!0,excerpt:`<h2>大纲</h2>
63<ul>
64<li>扫描过程 Scanning Process</li>
65<li>正则表达式 Regular Expressions</li>
66<li>有限自动机 Finite Automata(NFA(nondeterministic 非确定性有限自动机) and DFA(deterministic 确定性))</li>
67<li>RE 转换 NFA(McNaughton-Yamda-Thompson algorithm)</li>
68<li>NFA 转换 DFA(子集算法 Subset construction Algorithm)</li>
69<li>最小化 DFA(State-Minimization Algorithm)</li>
70</ul>`,readingTime:{minutes:5.74,words:1723},title:"Chapter2 词法分析",icon:"page",order:1,type:"article"}}],["/notes/Compile-Principles/Chapter3-Gramma-Analysis.html",{loader:()=>f(()=>import("./Chapter3-Gramma-Analysis.html-CJ1KHEVw.js"),__vite__mapDeps([14,1])),meta:{author:"chiichen",date:16969824e5,category:["课程笔记"],tag:["编译原理"],sticky:!0,isOriginal:!0,excerpt:`<h2>大纲</h2>
71<ul>
72<li>语法分析的形式化——上下文无关文法</li>
73<li>语法分析算法</li>
74</ul>
75<h2>上下文无关文法(CFG)</h2>
76<ul>
77<li>是用来描述一个编程语言的语法结构的文法</li>
78<li>和正则表达式一样,可以表示递归的规则,而且更强大</li>
79<li>是正则表达式的严格超集</li>
80</ul>
81<h3>Chomsky 语言层级</h3>
82<table>
83<thead>
84<tr>
85<th>Chomsky hierarchy</th>
86<th>Production(产生式)</th>
87<th>Explanation</th>
88</tr>
89</thead>
90<tbody>
91<tr>
92<td>unrestricted(type 0)(自然语言)</td>
93<td></td>
94<td>无严格约束</td>
95</tr>
96<tr>
97<td>context sensitive(type 1)(上下文有关文法)</td>
98<td></td>
99<td>在不同的上下文中,可能被不同的替换</td>
100</tr>
101<tr>
102<td>context free(type 2)(上下文无关文法)</td>
103<td></td>
104<td>在任何出现的地方都会被替换</td>
105</tr>
106<tr>
107<td>regular(type 3)(正则表达式)</td>
108<td></td>
109<td>等价于正则表达式</td>
110</tr>
111</tbody>
112</table>`,readingTime:{minutes:15.67,words:4702},title:"Chapter3 语法分析",icon:"page",order:1,type:"article"}}],["/notes/Compile-Principles/Chapter4-Semantic-Analysis.html",{loader:()=>f(()=>import("./Chapter4-Semantic-Analysis.html-C2ivyV1y.js"),__vite__mapDeps([15,1])),meta:{author:"chiichen",date:16969824e5,category:["课程笔记"],tag:["编译原理"],sticky:!0,isOriginal:!0,excerpt:`<h2>目录</h2>
113<h2>介绍</h2>
114<ul>
115<li>语义分析核心是类型检查(Type check)和作用域检查(Scope check)</li>
116<li>语义通过属性的值来刻画</li>
117<li>通过一系列属性等式来进行计算,按照一定的顺序进行计算</li>
118</ul>
119<h2>Recursive AST Walk</h2>
120<ul>
121<li>一种语义分析的实现方法,本书暂时不表</li>
122</ul>
123<h2>Attribute Grammars</h2>
124<h3>语法制导的语法分析(Syntax-Directed Semantics Analysis )</h3>
125<ul>
126<li>又称 SDS、SDT、SDD</li>
127<li>属性是附着在文法符号上的</li>
128</ul>`,readingTime:{minutes:8.95,words:2685},title:"Chapter4 语义分析",icon:"page",order:1,type:"article"}}],["/notes/Compile-Principles/Chapter5-Code-Generation.html",{loader:()=>f(()=>import("./Chapter5-Code-Generation.html-BLBI86od.js"),__vite__mapDeps([16,1])),meta:{author:"chiichen",date:16969824e5,category:["课程笔记"],tag:["编译原理"],sticky:!0,isOriginal:!0,excerpt:`<h2>介绍</h2>
129<ul>
130<li>代码生成取决于:源代码、目标系统体系结构、运行时环境</li>
131<li>代码生成可以被划分为三步:</li>
132</ul>
133<ol>
134<li>生成中间代码(IR Iermediate code 码)</li>
135<li>生成某种汇编形式的代码,而不是真正的可执行代码</li>
136<li>优化目标代码</li>
137</ol>
138<h2>中间代码</h2>
139<ul>
140<li>以三地址码(TAC Three Address code)为例</li>
141</ul>
142<h3>生成三地址码</h3>
143<h4>运算</h4>
144<figure><figcaption>[TAC_Code1.png]</figcaption></figure>`,readingTime:{minutes:7.65,words:2294},title:"Chapter5 语法生成",icon:"page",order:1,type:"article"}}],["/notes/Compile-Principles/",{loader:()=>f(()=>import("./index.html--zYO5N0J.js"),__vite__mapDeps([17,1])),meta:{date:1714837884e3,readingTime:{minutes:.03,words:9},title:"编译原理",icon:"lightbulb",type:"article"}}],["/notes/Computer-Network/Chapter1-Internet-And-Ethernet.html",{loader:()=>f(()=>import("./Chapter1-Internet-And-Ethernet.html-CVNSgBWS.js"),__vite__mapDeps([18,1])),meta:{author:"chiichen",date:16863552e5,category:["课程笔记"],tag:["计算机网络"],sticky:!1,isOriginal:!0,excerpt:`<h2>网络模型</h2>
145<figure><figcaption>网络基础模型</figcaption></figure>
146<ul>
147<li>组网设备(networking device):组成网络中除计算机之外的部分,即 proxy 部分的设备</li>
148<li>一个计算机网络利用组网设备和数据链路(data links)去连接若干台地理上分离的计算机,通过完善的网络协议(protocol)和网络应用来达成共享网络资源和信息传输的功能</li>
149<li>在网络中,信息以离散的二进制比特流传输,每组二进制比特流被称为 data packets(数据包)</li>
150</ul>
151<h3>问题</h3>`,readingTime:{minutes:6.37,words:1912},title:"Chapter1 Internet And Ethernet",icon:"page",order:1,type:"article"}}],["/notes/Computer-Network/Chapter2-Application-Layer.html",{loader:()=>f(()=>import("./Chapter2-Application-Layer.html-DiYt4uUu.js"),__vite__mapDeps([19,1])),meta:{author:"chiichen",date:16863552e5,category:["课程笔记"],tag:["计算机网络"],sticky:!1,isOriginal:!0,excerpt:`<h2>应用层协议原理</h2>
152<h3>网络应用程序体系结构</h3>
153<h4>客户-服务器结构(Client-Server)</h4>
154<ul>
155<li>
156<p>Web、FTP、Telnet、电子邮件都是通过这种结构进行构建的,由一个总是打开的主机,称为服务器(Server),用来服务来自许多被称为客户(Client)其他主机的请求。</p>
157</li>
158<li>
159<p>而在这种结构下,单台主机通常会难以应付大量的请求,因此会在配备了大量主机的数据中心(data center)中创建虚拟服务器来满足客户端请求的需求ã€
159‚</p>
160</li>
161</ul>
162<h4>P2P 体系结构(Peer-to-peer)</h4>`,readingTime:{minutes:17.34,words:5201},title:"Chapter2 Application Layer",icon:"page",order:1,type:"article"}}],["/notes/Computer-Network/Chapter3-Transport-Layer.html",{loader:()=>f(()=>import("./Chapter3-Transport-Layer.html-EEmYTEPq.js"),__vite__mapDeps([20,1])),meta:{author:"chiichen",date:16867008e5,category:["课程笔记"],tag:["计算机网络"],sticky:!1,isOriginal:!0,excerpt:`<h2>多路复用与多路分解</h2>
163<ul>
164<li>在接收端,运输层检查运输层报文中的几个字段——源端口号和目标端口号。来将报文定向到某个特定的 socket(注意,不是直接把数据发送到进程)的工作被称为多路分解(demultiplexing)。</li>
165<li>在源主机从不同 socket 中收集数据块,并为每个数据块封装上首部信息从而生成报文段,然后将报文段传递到网络层的工作称为多路复用(multiplexing)</li>
166<li>运输层和进程之间的数据交换是以 socket 为媒介实现的。</li>
167<li>端口号是一个 16bit 的数,大小为 0~65535。0~1023 范围的端口号被称为周知端口号(well-known port number),通常是被保留用作例如 HTTP、FTP 等协议使用</li>
168</ul>`,readingTime:{minutes:32.15,words:9645},title:"Chapter3 Transport Layer",icon:"page",order:1,type:"article"}}],["/notes/Computer-Network/Chapter4-Net-Layer.html",{loader:()=>f(()=>import("./Chapter4-Net-Layer.html-DO6HRWX2.js"),__vite__mapDeps([21,1])),meta:{author:"chiichen",date:16870464e5,category:["课程笔记"],tag:["计算机网络"],sticky:!1,isOriginal:!0,excerpt:`<h2>路由器工作原理</h2>
169<h3>输入端口处理和基于目的地转发</h3>
170<figure><figcaption>输入端口处理.png</figcaption></figure>
171<h4>最长前缀匹配(Longest Prefix Match LPM)</h4>
172<ul>
173<li>用来决定路由器如何进行转发,例如下表,其中 link 表示当前路由器连接到其他路由器的不同链路,当地址为 28.1.2.3 时,选择链路 3,当地址为 28.33.5.4 时,选择链路 4</li>
174</ul>
175<table>
176<thead>
177<tr>
178<th>dest</th>
179<th>link</th>
180</tr>
181</thead>
182<tbody>
183<tr>
184<td>default</td>
185<td>1</td>
186</tr>
187<tr>
188<td>171.33.0.0/16</td>
189<td>5</td>
190</tr>
191<tr>
192<td>23.0.0.0/24</td>
193<td>2</td>
194</tr>
195<tr>
196<td>28.0.0.0/24</td>
197<td>3</td>
198</tr>
199<tr>
200<td>28.33.5.0/8</td>
201<td>4</td>
202</tr>
203</tbody>
204</table>`,readingTime:{minutes:25.51,words:7652},title:"Chapter4 Net Layer",icon:"page",order:1,type:"article"}}],["/notes/Computer-Network/Chapter5-Link-Layer.html",{loader:()=>f(()=>import("./Chapter5-Link-Layer.html-CZfnQgFZ.js"),__vite__mapDeps([22,1])),meta:{author:"chiichen",date:16870464e5,category:["课程笔记"],tag:["计算机网络"],sticky:!1,isOriginal:!0,excerpt:`<h2>链路层概述</h2>
205<ul>
206<li>链路层中运行协议的设备被称为节点,而通信信道被称为链路。</li>
207</ul>
208<h3>链路层提供的服务</h3>
209<ul>
210<li>成帧(framing)。帧的结构由具体的链路层协议规定</li>
211<li>链路接入(link access)。媒体访问控制(Medium Access Control, MAC)协议规定了帧在链路上传输的规则。MAC 用于协调多个节点的帧传输。</li>
212<li>可靠交付(reliable delivery)。链路层协议保证无差错地经链路层移动每个网络层数据包。链路层的 RD 通常是通过在本地(发生错误的链路)确认重传,而不是在整个端到端路径上重传。因此在高差错率的链路,例如无线链路中广泛使用。而在低差错率的链路,例如光纤、电缆等有线链路中的链路层协议不提供 RD。</li>
213<li>差错检测和纠正。链路层的差错检测通常更复杂,而且用硬件实现。而差错纠正意味着接收方不仅能检测出差错,还能够准确定位到帧中差错出现的位置。</li>
214</ul>`,readingTime:{minutes:18.72,words:5617},title:"Chapter5 Link Layer",icon:"page",order:1,type:"article"}}],["/notes/Computer-Network/Computer-Network-7th-Edition-Exercises-Answers.html",{loader:()=>f(()=>import("./Computer-Network-7th-Edition-Exercises-Answers.html-C2vBqRv0.js"),__vite__mapDeps([23,1])),meta:{date:170616319e4,excerpt:`
215<h2>复习题和习题参考答案</h2>
216<h3>版本时间:2016年12月</h3>
217<p>本文档包含Jim Kurose和Keith Ross编写的《计算机网络:自顶向下方法(第7版)》复习题和习题的参考答案。这些答案只对指导老师有效。请不要复制或者分发给其他人(即使是其他指导老师)。请不要在公共网络发布任何参考答案。如果有需要,我们很乐意提供此参考答案(最新版)。</p>
218<p>声明:这些年来,很多同学和同事帮助我们准备此参考答案。特别感谢Honggang Zhang,Rakesh Kumar,Prithula Dhungel和VijayAnnapureddy。同时也感谢提建议和修正错误的所有读者。</p>`,readingTime:{minutes:172.07,words:51622},title:"计算机网络:自顶向下方法,第7版",type:"article"}}],["/notes/Computer-Network/",{loader:()=>f(()=>
218import("./index.html-Cz2XHtDk.js"),__vite__mapDeps([24,1])),meta:{date:1714837884e3,readingTime:{minutes:.03,words:10},title:"计算机网络",icon:"lightbulb",type:"article"}}],["/notes/Database/Chapter1-Introduction.html",{loader:()=>f(()=>import("./Chapter1-Introduction.html-BmUt9feG.js"),__vite__mapDeps([25,1])),meta:{author:"chiichen",date:1698624e6,category:["课程笔记"],tag:["数据库"],sticky:!1,isOriginal:!0,excerpt:`<h2>Database Management System (DBMS)</h2>
219<ul>
220<li>DBMS 包括:
221<ol>
222<li>相关数据的集合</li>
223<li>访问数据的程序集</li>
224<li>一个既方便又高效的使用环境</li>
225</ol>
226</li>
227</ul>
228<h2>文件系统存储数据的缺点</h2>
229<ul>
230<li>
231<p>数据冗余和不一致:多种文件格式,不同文件中的信息重复</p>
232</li>
233<li>
234<p>访问数据困难:需要编写新程序来执行每项新任务</p>
235</li>
236<li>
237<p>数据隔离——多个文件和格式</p>
238</li>
239<li>
240<p>完整性问题 :</p>
241<ul>
242<li>完整性约束(例如,帐户余额 &gt; 0)被“隐藏”在程序代码中,而不是明确声明</li>
243<li>很难添加新的约束或更改现有的约束</li>
244</ul>
245</li>
246<li>
247<p>更新的原子性</p>
248<ul>
249<li>故障可能会使数据库处于与执行的部分更新不一致的状态</li>
250<li>示例:资金从一个账户转移到另一个账户要么完成,要么根本不发生</li>
251</ul>
252</li>
253<li>
254<p>多用户并发访问</p>
255<ul>
256<li>并发访问以提高性能</li>
257<li>不受控制的并发访问可能会导致不一致</li>
258<li>示例:两个人同时读取余额(例如 100)并通过提款(例如每人 50)来更新余额</li>
259</ul>
260</li>
261<li>
262<p>安全问题 难以向用户提供对部分(但不是全部)数据的访问权限</p>
263</li>
264</ul>`,readingTime:{minutes:5.23,words:1569},title:"Chapter1 Introduction",icon:"page",order:1,type:"article"}}],["/notes/Database/Chapter10-Storage-and-File-Structure.html",{loader:()=>f(()=>import("./Chapter10-Storage-and-File-Structure.html-BD2EFUFn.js"),__vite__mapDeps([26,1])),meta:{author:"chiichen",date:17038944e5,category:["课程笔记"],tag:["数据库"],sticky:!1,isOriginal:!0,excerpt:`<h2>物理存储媒介(Physical Storage Media)</h2>
265<ul>
266<li>磁盘
267<ul>
268<li>1 block = 多个连续的 sector</li>
269<li>1 个文件(哈希文件除外)= 多个连续的 block</li>
270</ul>
271</li>
272<li>磁头与磁盘
273<ul>
274<li>磁头往磁盘读写数据的最小单位是 sector</li>
275</ul>
276</li>
277<li>内存与磁盘
278<ul>
279<li>内存与磁盘交换信息的最小单位是 block</li>
280</ul>
281</li>
282<li>开销=寻道时间+ 旋转时间+传输时间</li>
283<li>数据库只关注:
284<ul>
285<li>寻道次数</li>
286<li>传输磁盘块个数</li>
287</ul>
288</li>
289<li>设访问的磁盘块依次分别是: B1, B2
290<ul>
291<li>寻道次数 : 如果 B1, B2 相邻, 则寻道 1 次</li>
292<li>传输磁盘块的个数: 无论相邻与否, 都是 2.<br>
293</li>
294</ul>
295</li>
296</ul>`,readingTime:{minutes:4.76,words:1428},title:"Chapter10 Storage and File Structure",icon:"page",order:1,type:"article"}}],["/notes/Database/Chapter11-Indexing-and-Hashing.html",{loader:()=>f(()=>import("./Chapter11-Indexing-and-Hashing.html-BCobjAFz.js"),__vite__mapDeps([27,1])),meta:{author:"chiichen",date:17039808e5,category:["课程笔记"],tag:["数据库"],sticky:!1,isOriginal:!0,excerpt:`<h2>基本概念</h2>
297<ul>
298<li>索引机制用于加速对所需数据的访问。例如,图书馆中的作者目录。</li>
299<li>搜索键(Search Key)是用于在文件中查找记录的一组属性。</li>
300<li>索引文件由记录(称为索引条目)组成,形式为:</li>
301</ul>
302<table>
303<thead>
304<tr>
305<th>search-key</th>
306<th>pointer</th>
307</tr>
308</thead>
309</table>
310<ul>
311<li>索引文件通常比原始文件小得多。</li>
312<li>基本的两种索引类型:
313<ul>
314<li>有序索引(Ordered indices):搜索键按排序顺序存储。</li>
315<li>哈希索引(Hash indices):使用“哈希函数”,将搜索键均匀分布在“桶”中。</li>
316</ul>
317</li>
318</ul>`,readingTime:{minutes:14.89,words:4466},title:"Chapter11 Indexing and Hashing",icon:"page",order:1,type:"article"}}],["/notes/Database/Chapter12-Query-Processing.html",{loader:()=>f(()=>import("./Chapter12-Query-Processing.html-BTpqqk7t.js"),__vite__mapDeps([28,1])),meta:{author:"chiichen",date:17039808e5,category:["课程笔记"],tag:["数据库"],sticky:!1,isOriginal:!0,excerpt:`<h2>查询处理的基本步骤</h2>
319<ol>
320<li>语法分析与翻译</li>
321<li>优化</li>
322<li>执行<br>
323</li>
324</ol>
325<h3>语法分析与翻译</h3>
326<ul>
327<li>将查询转换为内部形式,然后将其转换为关系代数。</li>
328<li>解析器检查语法,验证关系。</li>
329</ul>
330<h3>执行</h3>
331<ul>
332<li>查询执行引擎接收查询执行计划,执行该计划,并返回查询的结果。</li>
333</ul>
334<h3>优化</h3>
335<ul>
336<li>关系代数表达式可能有许多等价的表达式。<br>
337例如,等价于 。</li>
338<li>每个关系代数操作可以使用多种不同的算法进行执行。相应地,关系代数表达式可以以多种方式进行执行。指定详细执行策略的注释表达式称为<code>执行计划或计算计划(evaluation-plan)</code>。</li>
339<li>例如,可以使用薪水索引来查找薪水小于 75000 的讲师,或者执行完整的关系扫描并丢弃薪水大于等于 75000 的讲师。</li>
340<li><code>查询优化(Query Optimization)</code>:在所有等价的执行计划中选择成本最低的计划。</li>
341<li>成本是使用数据库目录中的统计信息进行估算的。</li>
342<li>例如,每个关系中的元组数量、元组大小等。</li>
343</ul>`,readingTime:{minutes:19.39,words:5817},title:"Chapter12 Query Processing",icon:"page",order:1,type:"article"}}],["/notes/Database/Chapter13-Query-Optimization.html",{loader:()=>f(()=>import("./Chapter13-Query-Optimization.html-Ds0TlEug.js"),__vite__mapDeps([29,1])),meta:{author:"chiichen",date:17039808e5,category:["课程笔记"],tag:["数据库"],sticky:!1,isOriginal:!0,excerpt:`<h2>简介</h2>
344<ul>
345<li>
345优化给定查询的方法:
346<ul>
347<li>等价表达式(整体优化)</li>
348<li>对每个操作的不同算法(局部优化)</li>
349</ul>
350</li>
351<li>执行计划(evaluation plan)定义了每个操作要用什么算法完成以及如何协调操作的执行</li>
352<li>查询的不同评估计划之间的成本差异可能是巨大的。例如,在某些情况下可能是秒级别与天级别的差异。</li>
353<li>基于成本的查询优化的步骤如下:
354<ol>
355<li>使用等价规则生成逻辑上等价的表达式。</li>
356<li>对生成的表达式进行注释,以获取备选的查询计划。</li>
357<li>根据估计的成本选择最便宜的计划。</li>
358</ol>
359</li>
360<li>计划成本的估算基于以下因素:
361<ul>
362<li>关系的统计信息,例如元组数量,属性的不同值数量等。</li>
363<li>中间结果的统计估计,用于计算复杂表达式的成本。</li>
364<li>使用统计数据计算的算法的成本公式。</li>
365</ul>
366</li>
367</ul>`,readingTime:{minutes:4.6,words:1381},title:"Chapter13 Query Optimization",icon:"page",order:1,type:"article"}}],["/notes/Database/Chapter14-Transactions.html",{loader:()=>f(()=>import("./Chapter14-Transactions.html-Do1UJBDn.js"),__vite__mapDeps([30,1])),meta:{author:"chiichen",date:17039808e5,category:["课程笔记"],tag:["数据库"],sticky:!1,isOriginal:!0,excerpt:`<h2>简介</h2>
368<ul>
369<li><code>事务(Transaction)</code>是程序执行的一个单位,它访问并可能更新各种数据项。</li>
370<li>例如,从账户 A 转账 50 美元到账户 B 的事务:
371<ol>
372<li>读取(A)</li>
373<li>A := A - 50</li>
374<li>写入(A)</li>
375<li>读取(B)</li>
376<li>B := B + 50</li>
377<li>写入(B)</li>
378</ol>
379</li>
380<li>处理的两个主要问题是:
381<ul>
382<li>各种类型的故障,如硬件故障和系统崩溃。</li>
383<li>多个事务的并发执行。</li>
384</ul>
385</li>
386</ul>`,readingTime:{minutes:13.07,words:3920},title:"Chapter14 Transactions",icon:"page",order:1,type:"article"}}],["/notes/Database/Chapter15-Concurrency-Control.html",{loader:()=>f(()=>import("./Chapter15-Concurrency-Control.html-oH4rfM1X.js"),__vite__mapDeps([31,1])),meta:{author:"chiichen",date:17040672e5,category:["课程笔记"],tag:["数据库"],sticky:!1,isOriginal:!0,excerpt:`<h2>基于锁的协议(Lock-Based Protocols)</h2>
387<ul>
388<li>锁是一种控制对数据项并发访问的机制。</li>
389<li>数据项可以以两种模式进行锁定:
390<ol>
391<li>独占(X)模式:数据项既可以读取也可以写入。使用 lock-X 指令请求 X 锁。</li>
392<li>共享(S)模式:数据项只能读取。使用 lock-S 指令请求 S 锁。</li>
393</ol>
394</li>
395<li>锁请求发送给并发控制管理器。只有在请求被授予后,事务才能继续进行。</li>
396</ul>
397<figure><figcaption>事务执行锁定的示例</figcaption></figure>`,readingTime:{minutes:10.09,words:3028},title:"Chapter15 Concurrency Control",icon:"page",order:1,type:"article"}}],["/notes/Database/Chapter16-Recovery-System.html",{loader:()=>f(()=>import("./Chapter16-Recovery-System.html-9aqHeeTm.js"),__vite__mapDeps([32,1])),meta:{author:"chiichen",date:17040672e5,category:["课程笔记"],tag:["数据库"],sticky:!1,isOriginal:!0,excerpt:`<h2>故障分类</h2>
398<ul>
399<li>事务故障:
400<ul>
401<li>逻辑错误:由于某些内部错误条件(例如 A 的余额不足,无法扣款),事务无法完成。</li>
402<li>系统错误:数据库系统必须由于错误条件(例如死锁)终止活动事务。</li>
403</ul>
404</li>
405<li>系统崩溃:
406<ul>
407<li>由于电源故障或其他硬件或软件故障,系统崩溃。</li>
408</ul>
409</li>
410<li>停止故障假设:
411<ul>
412<li>假设非易失性存储内容在系统崩溃时不会被破坏。</li>
413<li>数据库系统具有许多完整性检查来防止磁盘数据的损坏。</li>
414</ul>
415</li>
416<li>磁盘故障:
417<ul>
418<li>磁头碰撞或类似的磁盘故障破坏了全部或部分磁盘存储。</li>
419<li>假设破坏是可检测的:磁盘驱动器使用校验和来检测故障。</li>
420</ul>
421</li>
422</ul>`,readingTime:{minutes:13.34,words:4001},title:"Chapter16 Recovery System",icon:"page",order:1,type:"article"}}],["/notes/Database/Chapter2-Introduction-to-Relational-Model.html",{loader:()=>f(()=>import("./Chapter2-Introduction-to-Relational-Model.html-QWRm3XbA.js"),__vite__mapDeps([33,1])),meta:{author:"chiichen",date:17036352e5,category:["课程笔记"],tag:["数据库"],sticky:!1,isOriginal:!0,excerpt:`<h2>关系(Relation)</h2>
423<figure><figcaption>Example of a Relation</figcaption></figure>
424<h3>属性值(Attribute Types)</h3>
425<ul>
426<li>每个属性允许的值集合称为属性的域(domain)。</li>
427<li>属性值(通常)要求是原子(atomic)的,即不可分割的。</li>
428<li>特殊值 null 是每个域的成员。</li>
429<li>null 值在许多操作的定义中引起了复杂性。</li>
430</ul>
431<h3>关系模式和实例(Relation Schema and Instance)</h3>`,readingTime:{minutes:3.32,words:995},title:"Chapter2 Introduction to Relational Model",icon:"page",order:1,type:"article"}}],["/notes/Database/Chapter3-Introduction-to-SQL.html",{loader:()=>f(()=>import("./Chapter3-Introduction-to-SQL.html-uUemDQdX.js"),__vite__mapDeps([34,1])),meta:{author:"chiichen",date:17036352e5,category:["课程笔记"],tag:["数据库"],sticky:!1,isOriginal:!0,excerpt:`<h2>SQL 数据定义语言(data-definition language,DDL)</h2>
432<ul>
433<li>
433SQL 数据定义语言( data-definition language ,DDL)允许指定关于关系的信息,包括:
434<ul>
435<li>每个关系的模式。</li>
436<li>每个属性关联的值域。</li>
437<li>完整性约束。</li>
438<li>此外,我们稍后将看到,还可以包括其他信息,例如:
439<ul>
440<li>每个关系要维护的索引集合。</li>
441<li>每个关系的安全性和授权信息。</li>
442<li>每个关系在磁盘上的物理存储结构。</li>
443</ul>
444</li>
445</ul>
446</li>
447<li>简而言之,SQL 的数据定义语言(DDL)提供了一种定义关系的信息的方式,包括关系模式、属性的值域以及与关系相关的完整性约束等。它还允许指定索引、安全性和授权信息以及关系在磁盘上的物理存储结构。</li>
448</ul>`,readingTime:{minutes:.86,words:259},title:"Chapter3 Introduction to SQL",icon:"page",order:1,type:"article"}}],["/notes/Database/Chapter6-Formal-Relational-Query-Languages.html",{loader:()=>f(()=>import("./Chapter6-Formal-Relational-Query-Languages.html-ZpeRKUwN.js"),__vite__mapDeps([35,1])),meta:{author:"chiichen",date:1703808e6,category:["课程笔记"],tag:["数据库"],sticky:!1,isOriginal:!0,excerpt:`<h2>分类</h2>
449<p>关系代数(Relational Algebra)、元组关系演算(Tuple Relational Calculus)和域关系演算(Domain Relational Calculus)是用于关系数据库的不同查询语言和形式。它们的主要区别如下:</p>
450<ol>
451<li>
452<p>关系代数(Relational Algebra):<br>
453关系代数是一种基于集合论的查询语言,用于操作关系数据库中的关系。它使用一组操作符,如选择(selection)、投影(projection)、连接(join)、并(union)、差(difference)等来执行关系操作。关系代数提供了一种形式化的方法来描述和操作关系数据库中的关系。</p>
454</li>
455<li>
456<p>元组关系演算(Tuple Relational Calculus):<br>
457元组关系演算是一种基于逻辑的查询语言,用于描述关系数据库中的查询。它使用逻辑谓词(predicate)来描述所需的元组集合。元组关系演算的查询结果是满足指定谓词的关系中的元组集合。元组关系演算描述了所需的结果,而不是如何计算结果。</p>
458</li>
459<li>
460<p>域关系演算(Domain Relational Calculus):<br>
461域关系演算也是一种基于逻辑的查询语言,用于描述关系数据库中的查询。它使用逻辑谓词来描述所需的属性集合。域关系演算的查询结果是满足指定谓词的关系中的属性集合。域关系演算描述了所需的属性,而不是如何计算结果。</p>
462</li>
463</ol>`,readingTime:{minutes:6.61,words:1982},title:"Chapter6 Formal Relational Query Languages",icon:"page",order:1,type:"article"}}],["/notes/Database/Chapter7-Entity-Relationship-Model.html",{loader:()=>f(()=>import("./Chapter7-Entity-Relationship-Model.html-BR11w4YK.js"),__vite__mapDeps([36,1])),meta:{author:"chiichen",date:1703808e6,category:["课程笔记"],tag:["数据库"],sticky:!1,isOriginal:!0,excerpt:`<h2>建模</h2>
464<ul>
465<li>一个数据库可以被建模为:
466<ul>
467<li>实体的集合,</li>
468<li>实体之间的关系。</li>
469</ul>
470</li>
471</ul>
472<h3>实体集</h3>
473<ul>
474<li>实体(entity)是存在的对象,并且可与其他对象区分开来。
475<ul>
476<li>例如:具体的人、公司、事件、植物。</li>
477</ul>
478</li>
479<li>实体具有属性(attribute)。
480<ul>
481<li>例如:人有姓名和地址。</li>
482</ul>
483</li>
484<li>实体集(entity set)是一组具有相同属性的同类实体的集合。
485<ul>
486<li>例如:所有人、公司、树木、假日的集合。<br>
487</li>
488</ul>
489</li>
490</ul>`,readingTime:{minutes:12.77,words:3832},title:"Chapter7 Entity-Relationship Model",icon:"page",order:1,type:"article"}}],["/notes/Database/Chapter8-Relational-Database-Design.html",{loader:()=>f(()=>import("./Chapter8-Relational-Database-Design.html-Cd9mroBM.js"),__vite__mapDeps([37,1])),meta:{author:"chiichen",date:17038944e5,category:["课程笔记"],tag:["数据库"],sticky:!1,isOriginal:!0,excerpt:`<h2>分解(decompose)</h2>
491<figure><figcaption>Example</figcaption></figure>
492<ul>
493<li>如果分解后无法重建原始信息,那么就是有损分解(Lossy Decomposition),反之则为无损分解(Lossless-Join Decomposition)<br>
494<br>
495</li>
496<li>所以我们需要一个理论来告诉我们怎么合理的分解关系。好的分解要做到:
497<ol>
498<li>无损分解</li>
499<li>依赖保存</li>
500</ol>
501</li>
502<li>BCNF 分解可以保证无损,3NF 可以保证依赖保存,但是 3NF 无法保证没有冗余,因此需要在 BCNF 和 3NF 间权衡</li>
503</ul>`,readingTime:{minutes:20.15,words:6045},title:"Chapter8 Relational Database Design",icon:"page",order:1,type:"article"}}],["/notes/Database/",{loader:()=>f(()=>import("./index.html-DDBQmvzP.js"),__vite__mapDeps([38,1])),meta:{date:1714837884e3,readingTime:{minutes:.03,words:8},title:"数据库",icon:"lightbulb",type:"article"}}],["/notes/Electrical-Engineering/",{loader:()=>f(()=>import("./index.html-DJRtN_cA.js"),__vite__mapDeps([39,1])),meta:{date:1714890096e3,readingTime:{minutes:.03,words:8},title:"电工学",icon:"littlebulb",type:"article"}}],["/notes/Electrical-Engineering/Review-Note.html",{loader:()=>f(()=>import("./Review-Note.html-UzDGg65g.js"),__vite__mapDeps([40,1])),meta:{author:"chiichen",date:16863552e5,category:["课程笔记"],tag:["计算机网络"],sticky:!1,isOriginal:!0,excerpt:`
504<h2>
5041.参考方向、参考极性、关联与非关联</h2>
505<ul>
506<li>电流的方向并非实际方向,而是假定的,电压的极性也并非实际极性。</li>
507<li>关联:电流从电压的正极流入</li>
508<li>非关联:电流从电压的负极流入<br>
509(均为参考方向/极性)<br>
510![[关联与非关联]]</li>
511</ul>
512<h2>2.欧姆定律</h2>
513<ul>
514<li>关联:</li>
515<li>非关联:</li>
516<li array=""> $$<br>
517\\begin{array}{c}Y\\rightarrow\\Delta:R_1=\\frac{R_bR_c}{R_a+R_b+R_c}, R_2=\\frac{R_aR_c}{R_a+R_b+R_c}, R_3=\\frac{R_aR_b}{R_a+R_b+R_c}\\<br>
518\\Delta\\rightarrow Y: R_a=\\frac{R_1 R_2 + R_2 R_3 + R_3 R_1}{R_1},  R_b=\\frac{R_1 R_2 + R_2 R_3 +  R_3 R_1}{R_2},  Rc=\\frac{R1_R2 + R2_R3 +  R3_R1}{RC}<br>
519\\end</li>
520</ul>`,readingTime:{minutes:14.3,words:4290},title:"电工学复习笔记",icon:"page",order:1,type:"article"}}],["/notes/Operating-System/Chapter1-Introdction.html",{loader:()=>f(()=>import("./Chapter1-Introdction.html-DKi-mysd.js"),__vite__mapDeps([41,1])),meta:{author:"chiichen",date:16793568e5,category:["课程笔记"],tag:["操作系统"],sticky:!1,isOriginal:!0,excerpt:`<h2>目录</h2>
521<ol>
522<li>什么是操作系统</li>
523<li>操作系统的历史</li>
524<li>操作系统硬件</li>
525<li>操作系统 zoo</li>
526<li>操作系统概念</li>
527<li>系统调用</li>
528<li>操作系统结构</li>
529</ol>
530<h2>什么是操作系统</h2>
531<ul>
532<li>操作系统的位置</li>
533</ul>
534<!-- ![操作系统的位置](<images/Chapter1-Introdction/操作系统的位置>) -->
535<h3>操作系统的功能</h3>
536<ul>
537<li>自上而下:虚拟机,扩展机(extended machine),隐藏底层复杂丑陋的接口,给用户简洁,高效的接口</li>
538<li>自下而上:资源管理器(resource manager),允许多个程序同时运行(多进程),调度资源以实现时间、空间上的复用。管理、保护内存安全,管理 I/O 设备</li>
539</ul>`,readingTime:{minutes:7.96,words:2389},title:"Chapter1 Introdction",icon:"page",order:1,type:"article"}}],["/notes/Operating-System/Chapter2-Processes-and-Threads.html",{loader:()=>f(()=>import("./Chapter2-Processes-and-Threads.html-BBMWQXw5.js"),__vite__mapDeps([42,1])),meta:{author:"chiichen",date:168048e7,category:["课程笔记"],tag:["操作系统"],sticky:!1,isOriginal:!0,excerpt:`<h2>进程</h2>
540<ul>
541<li>顺序执行:单道程序系统中,一个具有独立功能的程序独占处理器直到最终结束的过程称为程序的顺序执行</li>
542<li>顺序性:程序的结构是顺序执行的(可能有 switch 或者 loop)</li>
543<li>封闭性:独占所有资源</li>
544<li>可重复性:初始状态相同,运行多少次结果都相同</li>
545<li>并发执行:所有上述特性都没有</li>
546<li>为了描述并发的行为,引入了进程的概念</li>
547</ul>
548<h3>进程模型</h3>
549<ul>
550<li>在进程的模型中,所有可运行软件都被以进程的集合组成起来</li>
551</ul>
552<h3>进程概念</h3>`,readingTime:{minutes:21.42,words:6425},title:"Chapter2 Processes and Threads",icon:"page",order:1,type:"article"}}],["/notes/Operating-System/Chapter3-Memory-Management.html",{loader:()=>f(()=>import("./Chapter3-Memory-Management.html-BSXxX_md.js"),__vite__mapDeps([43,1])),meta:{author:"chiichen",date:16831584e5,category:["课程笔记"],tag:["操作系统"],sticky:!1,isOriginal:!0,excerpt:`<h2>No Memory Abstraction</h2>
553<ul>
554<li>所有程序必须硬编码硬件物理地址<br>
555内存中不可能同时运行两个应用(也可以用方法实现同时存放 IB
555M360)</li>
556</ul>
557<h3>静态重定位(Static reloacation)</h3>
558<ul>
559<li>在进程加载到内存中的时候就映射到一个指定的物理地址上</li>
560<li>优点是不需要硬件支持</li>
561<li>缺点是会减慢加载的速度,而且加载后不再能在内存中移动位置,除非再进行一次重定位,而且加载器需要用某种方式显式地声明哪个是地址,哪个是常量</li>
562</ul>
563<h2>Address Space</h2>`,readingTime:{minutes:14.87,words:4460},title:"Chapter3 Memory Management",icon:"page",order:1,type:"article"}}],["/notes/Operating-System/Chapter4-File-System.html",{loader:()=>f(()=>import("./Chapter4-File-System.html-DnRsjsRm.js"),__vite__mapDeps([44,1])),meta:{author:"chiichen",date:16847136e5,category:["课程笔记"],tag:["操作系统"],sticky:!1,isOriginal:!0,excerpt:`<h2>文件(Files)</h2>
564<h3>目录</h3>
565<ul>
566<li>目录也是一个文件</li>
567<li>目录保存了文件名和文件存储位置的对应关系</li>
568</ul>
569<h3>文件名</h3>
570<ul>
571<li>由有效名(Valid name)和扩展名(Extension)组成</li>
572<li>至多 255 个字符</li>
573<li>支持数字、字母、特殊字符,例如不支持冒号,因为冒号在 windows 系统中是路径分隔符</li>
574<li>Windows 不区分大小写,linux 区分</li>
575</ul>
576<h3>文件结构</h3>
577<ol>
578<li>字、字节序列</li>
579<li>简单的记录结构:线性,定长</li>
580<li>复杂的结构:
581<ul>
582<li>记录树<br>
583</li>
584</ul>
585</li>
586</ol>`,readingTime:{minutes:10.92,words:3276},title:"Chapter4 File System",icon:"page",order:1,type:"article"}}],["/notes/Operating-System/Chapter5-IO.html",{loader:()=>f(()=>import("./Chapter5-IO.html-B79Xt5HR.js"),__vite__mapDeps([45,1])),meta:{author:"chiichen",date:16860096e5,category:["课程笔记"],tag:["操作系统"],sticky:!1,isOriginal:!0,excerpt:`<h2>I/O 硬件</h2>
587<h3>I/O 设备</h3>
588<ul>
589<li>块设备:把信息存储在定长的块中,每个块都有自己的地址。块的大小从 512B 到 32KB 不等。可以独立读写每个块。例如:硬盘,U 盘等</li>
590<li>字符设备:发送或者接收一个字符序列,不可寻址,也没有 seek 操作。例如:打印机、网卡、鼠标等。</li>
591</ul>
592<h3>设备控制器</h3>
593<ul>
594<li>有的是集成在主板上,有的是从外部插入的。例如 PCIe 插槽中的插入部件。通常就是设备控制器(controller)或者叫做设备适配器(adapter)</li>
595</ul>
596<figure><figcaption>io硬件控制器.png</figcaption></figure>`,readingTime:{minutes:9.44,words:2832},title:"Chapter5 IO",icon:"page",order:1,type:"article"}}],["/notes/Operating-System/Chapter6-Deadlocks.html",{loader:()=>f(()=>import("./Chapter6-Deadlocks.html-d4eNqaWK.js"),__vite__mapDeps([46,1])),meta:{author:"chiichen",date:16822944e5,category:["课程笔记"],tag:["操作系统"],sticky:!1,isOriginal:!0,excerpt:`<h2>资源</h2>
597<h3>分类</h3>
598<ul>
599<li>可抢占式(preemptable)资源:可以被从一个进程中拿走而不带来负面影响(例如 CPU、内存)。</li>
600<li>不可抢占式(Nonpreemptable)资源:会导致进程失败如果被拿走(例如 CD 刻录机)。</li>
601</ul>
602<h3>资源的取用</h3>
603<ul>
604<li>每个进程会按以下步骤利用资源:</li>
605</ul>
606<ol>
607<li>请求资源</li>
608<li>使用资源</li>
609<li>释放资源</li>
610</ol>
611<ul>
612<li>如果请求资源被拒绝就一定要等待,请求资源的进程阻塞,可能会因此 fail with error code</li>
613</ul>`,readingTime:{minutes:8.37,words:2512},title:"Chapter6 Deadlocks",icon:"page",order:1,type:"article"}}],["/notes/Operating-System/",{loader:()=>f(()=>import("./index.html-Cwq2JqA1.js"),__vite__mapDeps([47,1])),meta:{date:1714837884e3,readingTime:{minutes:.03,words:9},title:"操作系统",icon:"lightbulb",type:"article"}}],["/notes/Software-Project-Management/2019-Review-Notes.html",{loader:()=>f(()=>import("./2019-Review-Notes.html-CkXHUa4C.js"),__vite__mapDeps([48,1])),meta:{author:"chiichen",date:17028576e5,category:["课程笔记"],tag:["软件项目管理"],sticky:!1,excerpt:`
614<h2>整理人:彭晓轩</h2>
615<h2>Ver1.0 整理日期:2019/11/26</h2>
616<h2>Ver2.0、Ver2.1 整理日期:2019/11/27</h2>
617<h2>Ver3.0 整理日期:2019/11/29(终版,不再更新)</h2>
618<h5>修改说明:Ver2.0 额外补充了部分知识点以及修正了部分拼写错误,Ver2.1 添加了必需的额外的中文翻译以及再次修正部分拼写错误,Ver3.0 再次添加了部分知识点,现在已经相对比较完备了,以及修正了部分拼写错误</h5>
619<h2>注:整理不易,大家可以在这个基础上自行调整优化笔记,内容不全,3.0 版本的内容相对还是比较详细的了,⭐ 标记是笔者认为的重点,笔者建议复习的时候可以这份笔记为主,前提是已经看过一遍 PPT 或者书本!有需要的同学另外还要附加其他资料去看。转载请标明原作者和相关文档链接</h2>`,readingTime:{minutes:15.32,words:4595},title:"软件项目管理2019复习笔记",icon:"page",order:1,type:"article"}}],["/notes/Software-Project-Management/Chapter1-Indroduction.html",{loader:()=>f(()=>import("./Chapter1-Indroduction.html-BPrIGoZm.js"),__vite__mapDeps([49,1])),meta:{author:"chiichen",date:17017344e5,category:["课程笔记"],tag:["软件项目管理"],sticky:!1,isOriginal:!0,excerpt:`<h2>概要</h2>
620<ul>
621<li>体会到对更好的项目管理(尤其是 IT 项目管理)不断增长的需求ã€
621‚</li>
622<li>解释什么是项目,列举 IT 项目的例子,列出项目的各种特征,并千描述项目管理的约束。</li>
623<li>定义项目管理,并论述项目管理框架中的关键因素,包括牙项目干系人、项目管理的知识领域、常用工具和技术,以及项目成功的要素。</li>
624<li>讨论项目管理、项目集管理和项目组合管理之间的关系,以及它们中的每一个对企业成功的重要性。</li>
625<li>通过描述项目经理做些什么、需要什么技能、理想的技能给组合(能力三角形)和 IT 项目经理的就业机会来了解项目经理的角色。</li>
626<li>描述项目管理专业,包括它的历史、PMI 等专业组织的作用月、项目管理资格认证和职业道德的重要性,以及项目管理软件的更新。</li>
627</ul>`,readingTime:{minutes:7.81,words:2344},title:"第1章 项目管理概述",icon:"page",order:1,type:"article"}}],["/notes/Software-Project-Management/Chapter10-Project-Communication-Management.html",{loader:()=>f(()=>import("./Chapter10-Project-Communication-Management.html-KG8ZURhF.js"),__vite__mapDeps([50,1])),meta:{author:"chiichen",date:1702944e6,category:["课程笔记"],tag:["软件项目管理"],sticky:!1,isOriginal:!0,excerpt:`<h2>讨论问题</h2>
628<ol>
629<li>项目沟通管理的 3 个过程</li>
630<li>项目沟通管理计划应包括哪些内容?</li>
631<li>发布信息应该注意哪些方面?</li>
632<li>绩效报告</li>
633<li>改善沟通的一些建议</li>
634<li>如何有效开会?</li>
635<li>如何更高效使用电子邮件或其他通讯工具?</li>
636</ol>
637<h2>项目沟通管理</h2>
638<ul>
639<li>项目沟通管理的目标是确保项目信息能够及时且适当地生成、收集、发送、存储和部署。项目沟通管理中包含以下 3 个主要过程:
640<ol>
641<li><code>计划沟通</code>管理包括确定干系人的信息和沟通需求——谁需要什么信息?他们什么时候需要这些信息?如何将信息发送给他们?这个过程的输出包括沟通管理计划、项目管理计划更新和项目文档更新。</li>
642<li><code>管理沟通</code>包括对沟通管理计划中的项目沟通进行创建、发布、存储、检索和处置。这个过程的主要输出包括项目沟通、项目管理计划更新、项目文档更新和组织过程资产更新。</li>
643<li><code>控制沟通</code>包括确保干系人的沟通需求得到满足。</li>
644</ol>
645</li>
646</ul>`,readingTime:{minutes:6.45,words:1936},title:"第10章 项目沟通管理",icon:"page",order:1,type:"article"}}],["/notes/Software-Project-Management/Chapter11-Project-Risk-Management.html",{loader:()=>f(()=>import("./Chapter11-Project-Risk-Management.html-B5_od_73.js"),__vite__mapDeps([51,1])),meta:{author:"chiichen",date:1702944e6,category:["课程笔记"],tag:["软件项目管理"],sticky:!1,isOriginal:!0,excerpt:`<h2>讨论问题</h2>
647<ol>
648<li>项目风险管理的 6 个过程</li>
649<li>风险效用函数可以分为哪几类?</li>
650<li>风险管理计划的主要主题?</li>
651<li>风险的分类?</li>
652<li>风险识别的工具包括?</li>
653<li>风险登记册应包括哪些内容?</li>
654<li>定性风险分析的两种方法?</li>
655<li>定量风险分析的几个方法?</li>
656<li>应对负风险的几种策略?</li>
657<li>应对正风险的几种策略?</li>
658<li>风险监控的工具和技术包括?</li>
659</ol>
660<h2>项目风险管理</h2>
661<ul>
662<li>项目风险的的一般定义是对实现项目目标可能产生消极<code>或积极</code>影响的不确定性。</li>
663<li><code>风险效用(risk utility)</code>是指从潜在收益中获得的满足感或愉悦感的程度。如下图所示,分为:<code>风险规避型(risk-averse)</code>、<code>风险偏好型(risk-seeking)</code>和<code>风险中立型(risk-neutral)</code>,Y 轴代表效用,或者说是从人冒险中获得的愉悦。X 轴显示的是潜在的回报或机会的价值。<br>
664</li>
665<li>风险管理涉及 6 个主要过程: 1. 计划风险管理:针对某一项目决定如何制定与计划风险管理活动。这个过程的主要输出是风险管理计划。 2. 识别风险:指确定哪些风险会影响项目并记录风险特性的过程。这个过程的主要输出是风险登记册、风险报告和项目文档更新。 3. 实施定性风险分析:指按照发生的可能性和影响程
665度对风险进行优先排序的过程。在识别风险之后,项目团队可以使用各种工具和技术对风险进行排序并更新风险登记册中的信息。主要输出是项目文档更新。 4. 实施定量风险分析:指就已识别风险对项目整体目标的影响进行定量分析的过程。这个过程的主要输出是项目文档更新。 5. 计划风险响应:指采取措施来提高实现项目目标的概率、减少风险对实现项目目标的威胁的过程。利用预先制定的风险管理过程,项目团队可以制定流风险响应策略,这些策略常常导致变更请求、项目管理计划更新和项目文档更新。 6. 实施风险响应:指实施风险响应策略。输出包括变更请求和项目文档更新。 7. 监控风险:包括在项目生命周期中,监控已知的风险、识别新所的风险、实施风险响应计划,并评估风险响应策略的有效性。此过程的主要输出包括工工作绩效信息、变更请求、项目管理计划更新、项目文档更新、组织过程资产更新。<br>
666</li>
667</ul>`,readingTime:{minutes:20.63,words:6190},title:"第11章 项目风险管理",icon:"page",order:1,type:"article"}}],["/notes/Software-Project-Management/Chapter12-Project-Precurement-Management.html",{loader:()=>f(()=>import("./Chapter12-Project-Precurement-Management.html-aYpUx7Y2.js"),__vite__mapDeps([52,1])),meta:{author:"chiichen",date:1702944e6,category:["课程笔记"],tag:["软件项目管理"],sticky:!1,isOriginal:!0,excerpt:`<h2>讨论问题</h2>
668<ol>
669<li>项目采购管理的 3 个过程</li>
670<li>规划采购的工具和技巧?</li>
671<li>采购管理计划包括的内容?</li>
672<li>常见的采购文件?</li>
673<li>实施采购的过程?</li>
674</ol>
675<h2>项目采购管理</h2>
676<ul>
677<li>采购(procurement)意味着从外部来源获得产品或者服务。采购一词广泛用于政府,许多私人企业使用外购和外包。</li>
678<li>项目采购管理(project precurement management)有 3 个主要过程:
679<ol>
680<li><code>计划采购管理</code>包括决定采购什么、何时采购和如何采购。在采购计划中,决策者需要明确外包什么、决定合同类型,并且向潜在卖方描述工作的内容。卖方(sellers)包括承包商或向其他组织和个人提供产品或服务的供应商。该过程的输出包括采购管理计划、采购策略、投标文件、采购工作说明书、来源选择标准、自制或购买决策、独立成本估算、变更请求、项目文档更新和组织过程资产更新。</li>
681<li><code>实施采购</code>包括获得卖方回应、选择卖方并授予合同。该过程的输出包括选择卖方、达成协议、变更请求、项目管理计划更新、项目文档更新和组织过程资产更新。</li>
682<li><code>控制采购</code>包括管理与卖方的关系、监控合同履行情况、适当地进行更改和结清合同。该过程的主要输出包括结束采购、工作绩效信息、采购文件更新、变更请求、项目管理计划更新、项目文档更新和组织过程资产更新。</li>
683</ol>
684</li>
685</ul>`,readingTime:{minutes:13.26,words:3979},title:"第12章 项目采购管理",icon:"page",order:1,type:"article"}}],["/notes/Software-Project-Management/Chapter13-Project-Stakeholder-Management.html",{loader:()=>f(()=>import("./Chapter13-Project-Stakeholder-Management.html-DxE_7n5G.js"),__vite__mapDeps([53,1])),meta:{author:"chiichen",date:17031168e5,category:["课程笔记"],tag:["软件项目管理"],sticky:!1,isOriginal:!0,excerpt:`<h2>讨论问题</h2>
686<ol>
687<li>项目干系人管理的 4 个过程</li>
688<li>干系人登记表包括哪些内容?</li>
689<li>干系人参与等级?</li>
690<li>干系人管理计划包括?</li>
691<li>参与度控制的方法?</li>
692<li>期望管理矩阵包括哪些条目?</li>
693</ol>
694<h2>项目干系人管理</h2>
695<ul>
696<li>项目干系人管理的目的是识别受项目影响的所有人员与组织、分析干系人的期望,并使干系人在项目的整个生命周期中有效参与项目决策。项目经理和他他们的团队必须与干系人进行良好的沟通,并及时解决问题使干系人满意。</li>
697<li>项目干系人管理的 4 个过程如下:
698<ol>
699<li><code>识别干系人</code>是指识别参与项目或受项目影响的所有人员,并确确å
699®šç®¡ç†å¹²ç³»äººå…³ç³»çš„æœ€ä½³æ–¹å¼ã€‚这个过程的主要输出是干系人登记册。</li>
700<li><code>计划干系人</code>参与是指根据干系人的需求、兴趣和潜在影响,硕确定使干系人有效参与项目决策和活动的策略。这个过程的输出是干系人参与计划。</li>
701<li><code>管理干系人</code>参与是指与项目干系人沟通并一同工作,从人而满足他们的需求和期望、解决问题,并促进他们参与项目决策和活动。这个过程的输出是变更请求、项目管理计划更新和项目文档更新。</li>
702<li><code>监督干系人</code>参与是指监督干系人关系,并根据干系人的需求调整计划和策略以吸引干系人参与。这个过程的输出是工作绩效信息、变更请求、项目管理计划更新和项目文档更新。</li>
703</ol>
704</li>
705</ul>`,readingTime:{minutes:8.02,words:2406},title:"第13章 项目干系人管理",icon:"page",order:1,type:"article"}}],["/notes/Software-Project-Management/Chapter2-Project-Management-and-IT-Environment.html",{loader:()=>f(()=>import("./Chapter2-Project-Management-and-IT-Environment.html-DxLrzPxF.js"),__vite__mapDeps([54,1])),meta:{author:"chiichen",date:17019072e5,category:["课程笔记"],tag:["软件项目管理"],sticky:!1,isOriginal:!0,excerpt:`<h2>概要</h2>
706<ul>
707<li>定义项目管理的系统观以及如何将项目管理应用于 IT 项目中。</li>
708<li>总结组织的相关要点,包括组织的 4 个框架、组织结构和组织文化。</li>
709<li>解释为什么项目干系人管理和企业高层的承诺对项目成功至关重要。</li>
710<li>区分项目生命周期和产品生命周期之间的异同。</li>
711<li>讨论 IT 项目的独特性和多样性。</li>
712<li>总结影响 IT 项目管理的最新趋势,包括全球化、外包、虚拟团队和敏捷项目管理。</li>
713</ul>
714<h2>项目管理的系统观</h2>
715<p>为了高效地处理复杂的情况,项目经理必须以整体的观点认识项目,并且理<br>
716解该项目是如何与更大的组织进行联系的。<code>系统思考(systems thinking)</code>描述了这种整体的<br>
717观点。</p>`,readingTime:{minutes:8.78,words:2634},title:"第2章 项目管理与IT环境",icon:"page",order:1,type:"article"}}],["/notes/Software-Project-Management/Chapter3-Project-Management-Process-group.html",{loader:()=>f(()=>import("./Chapter3-Project-Management-Process-group.html-CgsJO5ou.js"),__vite__mapDeps([55,1])),meta:{author:"chiichen",date:17021664e5,category:["课程笔记"],tag:["软件项目管理"],sticky:!1,isOriginal:!0,excerpt:`<h2>概要</h2>
718<ul>
719<li>描述 5 大项目管理过程组及其各自典型的活动水平,以及它们之间的相互关系。</li>
720<li>了解项目管理过程组与项目管理知识领域之间的相互关系。</li>
721<li>讨论组织如何开发 IT 项目管理方法论来满足自身的需要。</li>
722<li>回顾一个组织应用项目管理过程组管理 IT 项目的案例研究,描述每个过程组的输出,了解有效的项目启动、项目计划、项目执行、项目监控和项目收尾是如何促进项目成功的。</li>
723<li>回顾应用敏捷方法管理的同一个 IT 项目的案例研究,并比比较敏捷方法和预测方法之间的关键区别。</li>
724<li>描述为每个过程组创建文档的几个模板。</li>
725</ul>`,readingTime:{minutes:6.88,words:2063},title:"第3章 项目管理过程组",icon:"page",order:1,type:"article"}}],["/notes/Software-Project-Management/Chapter4-Project-Integration-Management.html",{loader:()=>f(()=>import("./Chapter4-Project-Integration-Management.html-Dg4CcYwE.js"),__vite__mapDeps([56,1])),meta:{author:"chiichen",date:17021664e5,category:["课程笔记"],tag:["软件项目管理"],sticky:!1,isOriginal:!0,excerpt:`<h2>讨论问题</h2>
726<ol>
727<li>项目集成管理的过程</li>
728<li>选择 IT 项目的计划过程</li>
729<li>选择项目的 5 个常用技术</li>
730<li>NPV 的计算步骤</li>
731<li>综合变更控制的 3 个主要目标</li>
732<li>在组织中,设立变更请求书的意义?如何建立一个好的变更请求管理过程?</li>
733</ol>
734<h2>什么是项目整合管理</h2>
735<ul>
736<li>
737<p><code>项目整合管理(project integration management)</code>包括在整个项目生命周期中协调所有其他的项目管理知识领域。这种整合确保了项目的所有因素能在正确的时间集合在一起,从而成功地完成项目。根据《项目管理知识体系指南(第 6 版)》所述,项目整合管理包括 7 个主要过程:</p>
738<ol>
739<li>制定项目章程。即与项目干系人一起合作,制定正式批准项目的文件——章程。</li>
740<li>制定项目管理计划。即协调项目计划的所有组成部分,并把它它们整合为一份一致的连贯的文件——项目管理计划。</li>
741<li>指导与管理项目工作。即通过实施项目管理计划中的活动,来执行项目管理计划。</li>
742<li>管理项目知识。即使用现有知识并生成新知识,以实现项目目标,并帮助组织学习。</li>
743<li>监控项目工作。即监督项目工作是否符合项目的绩效目标。</li>
744<li>实施整体变更控制。即在整个项目生命周期中识别、评估和管理变更。</li>
745<li>项目或阶段收尾。即终结项目或阶段的所有活动,从而而正式结束项目或阶段。</li>
746</ol>
747</li>
748<li>
749<p>项目经理要协调项目资源、统领全局,解决项目冲突,而完成这些任务的首要方法就是项目整合管理</p>
750</li>
751<li>
752<p>良好的项目整合管理对满足干系人的需求至关重要。项目整合管理包括界面管理。<code>界面管理(interface management)</code>涉及明确和管理众多项目元素相互作用的交界点。界面管理的主要工具是沟通和关系。随着项目参与人员的增加,交界点的数量可能会呈现指数级增长。</p>
753</li>
754<li>
755<p>
755项目整合管理是在整个组织的环境中进行的,而不仅仅发生在一个特定项目的内部。项目经理必须将项目的工作和组织的运营整合起来。</p>
756</li>
757</ul>`,readingTime:{minutes:24.03,words:7210},title:"第4章 项目整合管理",icon:"page",order:1,type:"article"}}],["/notes/Software-Project-Management/Chapter5-Project-Scope-Management.html",{loader:()=>f(()=>import("./Chapter5-Project-Scope-Management.html-CPs_fApU.js"),__vite__mapDeps([57,1])),meta:{author:"chiichen",date:17023392e5,category:["课程笔记"],tag:["软件项目管理"],sticky:!1,isOriginal:!0,excerpt:`<h2>讨论问题</h2>
758<ol>
759<li>项目范围管理涉及的 6 个主要过程</li>
760<li>范围管理计划包括哪些信息?</li>
761<li>收集需求的常用方法</li>
762<li>制定工作分解结构(WBS)的方法</li>
763<li>范围控制的目标</li>
764<li>公司应遵循哪些最佳实践来避免出现主要的范围问题?</li>
765<li>范围蔓延产生的原因?是否可以避免?如何预防范围蔓延的产生?</li>
766</ol>
767<h2>什么是项目范围管理</h2>
768<ul>
769<li>项目管理最重要也最难做的一项工作就是定义项目范围。范围是指开发项目产品所涉及的所有工作和用于开发产品的所有过程。</li>
770<li>项目范围管理(project scope management)是指界定和控制项目中应包括什么和不包括什么所涉及的过程。该过程确保了项目团队和干系人对项目的可交付成果以及生产这些可交付成果所进行的工作达成共识。项目范围管理包含 6 个主要过程:
771<ol>
772<li>计划范围管理:是指确定如何管理项目的范围和需求。</li>
773<li>收集需求:是指定义并记录产品的特点和功能,以及开发这些品的过程。</li>
774<li>定义范围:是指审查范围管理计划、项目章程、需求文档和组织过程资产来制定一份范围说明书,并且在需求的扩展和变更请求得到批准时增加更多的信息。</li>
775<li>创建工作分解结构:是指将主要的项目可交付成果分解成更细小和更易管理的组成部分。</li>
776<li>确认范围:是指项目可交付成果的正式验收。关键项目干系人,比如项目的客户以及项目发起人在这一过程中进行审查,然后正式验收项目的可交付成果。如果不接受现在的可交付成果,那么客户或项目发起人通常会请求变更。</li>
777<li>控制范围:是指对项目范围的变化进行控制,这对许多 IT 项目而言是一种挑战。范围变更经常影响团队实现项目的时间目标和成本目标的能力,因此项目经理必须仔细权衡范围变更的成本及收益。</li>
778</ol>
779</li>
780</ul>`,readingTime:{minutes:14.43,words:4329},title:"第5章 项目范围管理",icon:"page",order:1,type:"article"}}],["/notes/Software-Project-Management/Chapter6-Project-Schedule-Management.html",{loader:()=>f(()=>import("./Chapter6-Project-Schedule-Management.html-BFCROfr7.js"),__vite__mapDeps([58,1])),meta:{author:"chiichen",date:17027712e5,category:["课程笔记"],tag:["软件项目管理"],sticky:!1,isOriginal:!0,excerpt:`<h2>讨论问题</h2>
781<ol>
782<li>项目进度管理中的 6 个主要过程</li>
783<li>一个进度管理计划应该包括哪些信息?</li>
784<li>依赖的四种类型</li>
785<li>辅助进度制订过程的工具和技术有哪些?</li>
786<li>SMART 准则是怎样定义里程碑的?</li>
787<li>使用关键路径来缩短项目进度有哪三个主要技术?</li>
788</ol>
789<h2>项目进度管理(Project Schedule Management)中的 6 个主要过程</h2>
790<ol>
791<li><code>计划进度管理</code>是指确定将用于计划、执行和控制项目进度的政策、流程和文档。</li>
792<li><code>定义活动</code>是指识别项目团队成员和干系人必须执行并产生生项目的可交付成果的特定活动。<code>活动(activity)</code>或<code>任务(task)</code>是工作的组成要素,通常出出现在工作分解结构中,有预计的持续时间、成本和资源要求。</li>
793<li><code>排列活动顺序</code>是指识别和记录项目活动之间的关系,包括需求农、资源分解结构和项目文档更新。</li>
794<li><code>估算活动持续时间</code>是指估算完成单项活动所需的工作时间。</li>
795<li><code>制定进度计划</code>是指分析活动顺序、资源需求和活动持续时间估算来创建项目进度计划。</li>
796<li><code>控制进度</code>是指控制和管理项目进度的变更。</li>
797</ol>`,readingTime:{minutes:20.89,words:6268},title:"第6章 项目进度管理",icon:"page",order:1,type:"article"}}],["/notes/Software-Project-Management/Chapter7-Project-Cost-Management.html",{loader:()=>f(()=>import("./Chapter7-Project-Cost-Management.html-CwEKh27c.js"),__vite__mapDeps([59,1])
797),meta:{author:"chiichen",date:17028576e5,category:["课程笔记"],tag:["软件项目管理"],sticky:!1,isOriginal:!0,excerpt:`<h2>讨论问题</h2>
798<ol>
799<li>项目成本管理的 4 个过程</li>
800<li>成本管理计划应该包括哪些信息?</li>
801<li>三种基本的成本估算类型</li>
802<li>成本估算的工具和技术有哪些?</li>
803<li>挣值公式(EV, CV, SV, CPI, SPI)</li>
804</ol>
805<h2>项目成本管理</h2>
806<ul>
807<li>成本<code>超支(overrun)</code>是实际成本超过估计的额外百分比或金额。</li>
808<li>本章通过计划成本管理、创建良好的成本估算以及使用挣值管理(EVM)来辅助成本控制</li>
809</ul>
810<h3>项目成本管理是什么</h3>`,readingTime:{minutes:16.47,words:4941},title:"第7章 项目成本管理",icon:"page",order:1,type:"article"}}],["/notes/Software-Project-Management/Chapter8-Project-Quality-Management.html",{loader:()=>f(()=>import("./Chapter8-Project-Quality-Management.html-BEwwAJpa.js"),__vite__mapDeps([60,1])),meta:{author:"chiichen",date:17028576e5,category:["课程笔记"],tag:["软件项目管理"],sticky:!1,isOriginal:!0,excerpt:`<h2>讨论问题</h2>
811<ol>
812<li>项目质量管理的 3 个过程</li>
813<li>IT 项目中影响质量的重要范围部分包括什么?</li>
814<li>质量控制过程的主要输出是什么?</li>
815<li>7 种基本的质量工具</li>
816<li>DMAIC 改进过程代表哪五个阶段</li>
817<li>CMMI 的能力层级有哪几个</li>
818</ol>
819<h2>项目质量管理</h2>
820<ul>
821<li><code>项目质量管理(project quality management)</code>的目的是确保项目满足它所应满足的需求。</li>
822<li>项目质量管理包括 3 个主要过程:
823<ol>
824<li><code>计划质量管理</code>包括确定哪些质量要求和标准与项目相关,以及如何满足这些要求和标准。将质量标准纳入项目设计是质量计划的关键部分。质量计划的主要要输出是质量管理计划、质量度量标准、项目管理计划更新和项目文档更新。<code>度量标准(metric)</code>是一个测量标准。常见的度量标准包括产品的故障率、产品和服务的可用性以及客户满意度。</li>
825<li><code>管理质量</code>包括将质量管理计划转换为可执行的质量活动。这些些活动必须遵守组织的质量政策。该过程的主要输出是质量报告、测试和评估文档、变更更请求、项目管理计划更新以及项目文档更新。</li>
826<li><code>控制质量</code>包括监控具体的项目结果,以确保它们是完整的、正确的并满足客户的期望。这个过程通常与技术工具及质量管理技术相关,如帕累托图、质量控制图及统计抽样。质量控制的主要输出包括质量控制测量、经验证的可交付成果、工作绩效信息、变更请求、项目管理计划更新和项目文档更新。</li>
827</ol>
828</li>
829</ul>`,readingTime:{minutes:15.75,words:4726},title:"第8章 项目质量管理",icon:"page",order:1,type:"article"}}],["/notes/Software-Project-Management/Chapter9-Project-Resource-Management.html",{loader:()=>f(()=>import("./Chapter9-Project-Resource-Management.html-CVLH9bts.js"),__vite__mapDeps([61,1])),meta:{author:"chiichen",date:17028576e5,category:["课程笔记"],tag:["软件项目管理"],sticky:!1,isOriginal:!0,excerpt:`<h2>讨论问题</h2>
830<ol>
831<li>项目资源管理的 6 个过程</li>
832<li>马斯洛需求层次理论从低到高是哪几层?</li>
833<li>项目经理运用哪 7 种习惯来提高项目工作的效率?</li>
834<li>资源平衡的优点是什么</li>
835<li>塔克曼模型描述的团队建设的 5 个阶段?</li>
836<li>管理项目团队的工具和技术</li>
837</ol>
838<h2>项目资源管理</h2>
839<ul>
840<li>项目资源管理包含使项目涉及的人力和物力资源(设施、设备、材料、物资等)得到最有效利用的全过程。人力资源管理包括所有的项目干系人:发起人、客户、项目团队成员、支持人员以及项目供应商等。项目资源管理包括以下 6 个过程:
841<ol>
842<li><code>计划资源管理</code>包括确定如何评估、获取、管理和使用项目资源。这个过程的主要输出是资源管理计划、团队章程和项目文档更新。</li>
843<li><code>估算活动资源</code>包括估算完成项目工作所需的人力和物力资源。输出包括资源需求、估算依据、资源分解结构和项目文档更新。</li>
844<li><code>获取资源</code>包括获取团队成员、设施、设备、材料、物资和其他所需资源。输出包括物力资源和项目团队分配、资源日历、请求更改和一些文档的更新。</li>
845<li><code>建设项目团队</code>包括为了提高项目绩效而对个人技能和项目团队技能的建设。团队建设技能对许多项目经理来说通常是一个挑战。这个过程的主要输出是团队绩效评估、变更请求和一些文档的更新。</li>
846<li><code>管理项目团队</code>包括跟踪团队成员绩效、激励团队成员、提供及时反馈、解决问题和冲突,以及协调变化来帮助提高项目绩效。这个过程的输出包括变更请求、项目管理计划更新、项目文档更新和组织过程资产更新。</li>
847<li><code>控制资源</code>保证项目的物力资源能按计划获取,监控计划与实际的资源利用率,并在需要时采取纠正措施。输出包括工作绩效信息、变更请求、项目管理计划更新和项目文档更新。</li>
848</ol>
849</li>
850</ul>`,readingTime:{minutes:22.82,words:6845},title:"第9章 项目资源管理",icon:"page",order:1,type:"article"}}],["/notes/Software-Project-Management/",{loader:()=>f(()=>import("./index.html-DHLTjJrB.js"),__vite__mapDeps([62,1])),meta:{date:1714837884e3,readingTime:{minutes:.04,words:11},title:"软件项目管理",icon:"lightbulb",type:"article"}}],["/notes/Software-Testing-and-Maintenance/Chapter1-Basic-Concepts-of-Software-Testing.html",{loader:()=>f(()=>import("./Chapter1-Basic-Concepts-of-Software-Testing.html-DIinpS3J.js"),__vite__mapDeps([63,1])
850),meta:{author:"chiichen",date:17149536e5,category:["课程笔记"],tag:["软件测试与维护"],sticky:!1,isOriginal:!0,excerpt:`<h2>Fault, Error and Failure</h2>
851<ul>
852<li>软件故障(Fault):软件中的静态缺陷。</li>
853<li>软件失败(Failure):相对于需求或其他预期行为的描述,表现出的外部错误行为。</li>
854<li>软件错误(Error):某些故障表现出的错误内部状态。</li>
855</ul>
856<div class="hint-container info">
857<p class="hint-container-title">例如</p>
858<ul>
859<li>患者向医生提供一份症状清单——失败</li>
860<li>医生尝试诊断根本原因,即疾病——故障</li>
861<li>医生可能会寻找异常的内部状况(高血压、心律不齐、血液中的细菌)——错误<br>
862:::</li>
863</ul>
864<h2>Bug</h2>
865<ul>
866<li>Bug 可能是 Fault, Error 或者 Failure</li>
867<li>Bug 往往出现在<code>软件规约(Software Specification)</code>阶段</li>
868</ul>
869<h2>What Effort Goes Into a Software Product</h2>
870<h3>用户需求(Customer Requirements)</h3>
871<ul>
872<li>需要了解用户需求</li>
873<li>通常需要通过调研同类产品,用户调查等方式进行</li>
874<li>为了决定产品最终要包含哪些<code>features</code></li>
875</ul>
876<h3>软件规约(Specifications)</h3>
877<ul>
878<li>格说明汇集了所有这些信息以及任何未明确表述但又是强制性的要求,真正定义了产品将是什么、将做什么以及它将呈现什么样子。</li>
879</ul>
880<h3>进度计划(Scheduling)</h3>
881<ul>
882<li>目的是为了判断当前的完成进度</li>
883</ul>
884<h3>文档</h3>
885<p>软件设计文档</p>
886<ul>
887<li>架构</li>
888<li>数据流图</li>
889<li>状态转换图</li>
890<li>流程图</li>
891<li>代码注释<br>
892测试文档</li>
893<li>测试计划</li>
894<li>测试用例</li>
895<li>错误报告</li>
896<li>测试工具和自动化</li>
897<li>指标、统计和总结</li>
898</ul>
899<h2>What Parts Make Up a Software Product?</h2>
900<figure><figcaption>What Parts Make Up a Software Product</figcaption></figure>
901<h2>
901软件测试模型(Models of Software Testing)</h2>
902<ul>
903<li>瀑布模型(Waterfall Model)</li>
904<li>螺旋模型(Spiral Model)</li>
905<li>V Model</li>
906<li>W Model</li>
907<li>敏捷模型(Agile Model)</li>
908<li>极限开发(Extreme Programing, XP)</li>
909</ul>
910<h3>瀑布模型(Waterfall Model)</h3>
911<ul>
912<li>所有的计划在最开始就完成了,一旦创建,就不应更改。</li>
913<li>随后的各个阶段之间没有任何重叠。</li>
914<li>通常,任何人在测试完成后的最后一刻才有机会“看到”程序。</li>
915</ul>
916<figure><figcaption>Waterfall-Model</figcaption></figure>
917<ul>
918<li>优点:
919<ol>
920<li>如果早期就确保需求和设计是完全正确的,那么这将在后期节省大量时间和精力。</li>
921<li>强调了文档化的重要性,将所有知识集中存放在一个中央资料库中,新团队成员可以轻松参考。</li>
922</ol>
923</li>
924<li>缺点:
925<ol>
926<li>在项目结束前,很少有可见的进展迹象。</li>
927<li>它不灵活,无法应对变化。</li>
928<li>生成所有文档耗时较长。</li>
929<li>测试仅在项目结束时进行——这可能会在存在时间或预算约束的情况下意味着妥协。</li>
930<li>必须整体测试程序,这可能导致测试不完整。</li>
931<li>如果测试发现一个需要重新设计的故障,可能会因为涉及的麻烦而被忽略。</li>
932<li>如果客户不满意,可能会导致维护阶段较长,以解决他们的问题。</li>
933</ol>
934</li>
935</ul>
936<h3>螺旋模型(Spiral Model)</h3>
937<ul>
938<li>以风险驱动的开发过程</li>
939<li>瀑布模型与快速原型迭代模型的结合</li>
940<li>始于一个设计目标,以客户审查进度结束。</li>
941</ul>
942<figure><figcaption>Spiral Model</figcaption></figure>
943<table>
944<thead>
945<tr>
946<th>优点</th>
947<th>缺点</th>
948</tr>
949</thead>
950<tbody>
951<tr>
952<td>后期可以增加或更改附加功能</td>
953<td>严格遵循螺旋模型的协议以确保其顺利运行</td>
954</tr>
955<tr>
956<td>由于原型构建是按小片段进行的,因此成本估算变得容易</td>
957<td>持续或反复的开发有助于风险管理</td>
958</tr>
959<tr>
960<td>开发速度快,系统地添加功能</td>
961<td>由于有中间阶段,文档更详细</td>
962</tr>
963<tr>
964<td>总是有客户反馈的空间</td>
965<td>螺旋软件开发不适用于小型项目,可能会花费很多</td>
966</tr>
967</tbody>
968</table>
969<h3>V Model</h3>
970<ul>
971<li>瀑布模型的扩展</li>
972<li>通过标记生命周期的每个阶段与测试活动之间的关系,强调验证与确认</li>
973<li>一旦代码实现完成,测试就开始了。</li>
974<li>从单元测试开始,然后逐层向上进行测试,直到完成验收测试阶段。</li>
975</ul>
976<figure><figcaption>V Model</figcaption></figure>
977<table>
978<thead>
979<tr>
980<th>强度</th>
981<th>弱点</th>
982</tr>
983</thead>
984<tbody>
985<tr>
986<td>由于模型的简单性,易于管理</td>
987<td>像瀑布模型一样,直到生命周期的后期才产生可工作的软件</td>
988</tr>
989<tr>
990<td>它鼓励在所有阶段进行验证和验证</td>
991<td>对于需求在中等至高度变化的风险下,它是不适用的</td>
992</tr>
993<tr>
994<td>每个阶段都有具体的可交付成果和审查过程</td>
995<td>有建议称,对于长期、复杂和面向对象的项目的模型来说,这也是一个糟糕的模型</td>
996</tr>
997<tr>
998<td>它赋予测试与开发同等的重要性,而不是将其作为一个在最后阶段才考虑的次要事项</td>
999<td></td>
1000</tr>
1001</tbody>
1002</table>
1003<h3>W Model</h3>
1004<ul>
1005<li>V Model 的扩展</li>
1006<li>测试不是在代码实现之后进行。</li>
1007<li>测试过程与开发过程平行进行。</li>
1008<li>开发与测试之间的协作。</li>
1009<li>测试不仅仅是测试用例的构建、执行和评估。</li>
1010</ul>
1011<figure><figcaption>W Model</figcaption></figure>
1012<h3>敏捷模型(Agile Model)</h3>
1013<p>为了有效测试:</p>
1014<ul>
1015<li>
1016<p>当开发者与客户就即将进行的迭代需求进行“协商”时,测试人员必须是这些对话的全面参与者。</p>
1017</li>
1018<li>
1019<p>测试人员应立即将对话中达成一致的要求转化为测试用例。</p>
1020</li>
1021<li>
1022<p>当需求发生变更时,测试人员应立即参与其中,因为大家都清楚相应的测试用例也必须进行修改。</p>
1023</li>
1024<li>
1025<p>增量模型从软件系统的部分简单实现开始。每次增量时,äº
1025§å“éƒ½ä¼šéšç€å¢žå¼ºåŠŸèƒ½çš„æ·»åŠ è€Œè¿›åŒ–ï¼Œç›´åˆ°æœ€ç»ˆç‰ˆæœ¬ã€‚</p>
1026</li>
1027<li>
1028<p>测试是增量模型的重要部分,并在每次迭代的末尾进行。这意味着测试在开发过程的早期开始,并且总体的测试量更多。</p>
1029</li>
1030<li>
1031<p>大量的测试是回归测试的形式,并且可以大量复用早期增量的测试用例和测试数据。</p>
1032</li>
1033</ul>
1034<h3>极限开发(Extreme Programming)</h3>
1035<ul>
1036<li>极限编程(XP)是敏捷软件开发哲学的一个子集。</li>
1037<li>它强调代码审查、持续集成和自动化测试,以及非常短的迭代周期。</li>
1038<li>它倾向于进行中的设计细化(或重构),而不是大型初始设计阶段,尽可能保持当前实现简单。</li>
1039<li>它倾向于实时沟通,最好是面对面,而不是写文档,并且认为工作软件是进步的主要衡量标准。</li>
1040<li>这种方法还强调团队合作。管理者、客户和开发人员都是致力于交付高质量软件的团队的一部分。</li>
1041<li>程序员负责测试他们自己的工作;测试人员专注于帮助客户选择和编写功能性测试,并定期运行这些测试。</li>
1042</ul>
1043<h4>用户故事和故事卡(User Stories and Story Card)</h4>
1044<ul>
1045<li>用户故事是用日常语言编写的一个或多个句子,捕捉到软件系统需要执行的一个方面。</li>
1046<li>这些通常被写在被称为故事卡的纸卡上</li>
1047<li>故事卡被排序以反映系统的开发</li>
1048<li>这应该怎么做呢?首先优先考虑最困难的部分或组件?或者按照用户操作的顺序?</li>
1049</ul>
1050<figure><figcaption>Extreme Programming</figcaption></figure>
1051<h2>现实中的软件测试(The Realities of Software Testing)</h2>
1052<ol>
1053<li>
1054<p>完全测试一个程序是不可能的</p>
1055</li>
1056<li>
1057<p>软件测试是一种基于风险的练习</p>
1058</li>
1059<li>
1060<p>测试不能证明不存在缺陷</p>
1061</li>
1062<li>
1063<p>你发现的错误越多,存在的错误就越多</p>
1064</li>
1065<li>
1066<p>农药悖论</p>
1067</li>
1068<li>
1069<p>你发现的所有错误并非都会被修复</p>
1070</li>
1071<li>
1072<p>何时认定为一个错误是困难的</p>
1073</li>
1074<li>
1075<p>产品规格永远不是最终的</p>
1076</li>
1077<li>
1078<p>软件测试人员并非项目团队中最受欢迎的成员</p>
1079</li>
1080<li>
1081<p>软件测试是一种受到纪律约束的技术性职业</p>
1082</li>
1083</ol>
1084<h2>Validation &amp; Verification</h2>
1085<ul>
1086<li>Verification: How do we ensure software satisfies its requirements</li>
1087<li>Validation: How to we ensure the software requirements satisfy its intended use?</li>
1088<li>换言之,就是<code>building a program correctly</code>和<code>Building a correct program</code></li>
1089</ul>
1090<figure><figcaption>Validation &amp; Verification</figcaption></figure>
1091<h2>Quality Control&amp;Quality Assurance</h2>
1092<ul>
1093<li>Quality Control:验证产品的正确性,当发现与设计不一致的时候进行纠正。</li>
1094<li>Quality Assurance:充当支持执行全面质量管理的角色</li>
1095</ul>
1096<h2>Tester &amp;
1096 QA | Software Testing &amp; SQA</h2>
1097<ul>
1098<li>
1099<p>软件测试员(QC):检测软件产品,找出缺陷,评价软件质量</p>
1100</li>
1101<li>
1102<p>质量保证人员(QA):检测软件过程,创建和加强促进软件开发并防止软件缺陷的标准、方法和过程。</p>
1103</li>
1104<li>
1105<p>SQA 是管理工作、审查对象是流程、强调以预防为主</p>
1106</li>
1107<li>
1108<p>测试(Testing)是技术工作、测试对象是产品、主要是事后检查</p>
1109</li>
1110</ul>
1111</div>`,readingTime:{minutes:7.44,words:2232},title:"第1章 软件测试的基本概念",icon:"page",order:1,type:"article"}}],["/notes/Software-Testing-and-Maintenance/Chapter2-Software-Testing-Technology.html",{loader:()=>f(()=>import("./Chapter2-Software-Testing-Technology.html-BiCWr4XU.js"),__vite__mapDeps([64,1])),meta:{author:"chiichen",date:171504e7,category:["课程笔记"],tag:["软件测试与维护"],sticky:!1,isOriginal:!0,excerpt:`<h2>静态验证(Static Verification)与动态验证(Dynamic Verification)</h2>
1112<ul>
1113<li>
1114<p>静态验证是指在不运行程序的情况下对程序进行验证</p>
1115</li>
1116<li>
1117<p>动态验证是指借助测试用例等方式,通过运行成勋来对程序进行验证,将输入值(input value)输入程序中,将真实输出(actual value)与预期输出(expected value)做比对,来判断程序的正确性<br>
1118</p>
1119</li>
1120<li>
1121<p>理想系统(ideal system)由规范表示,而真实系统是实际代码。</p>
1122</li>
1123<li>
1124<p>测试成功并不需要通过结果。 失败的测试也会传授一些关于系统的新知识</p>
1125</li>
1126</ul>`,readingTime:{minutes:28.94,words:8683},title:"第2章 软件测试技术",icon:"page",order:1,type:"article"}}],["/notes/Software-Testing-and-Maintenance/Chapter3-Software-Testing-Process.html",{loader:()=>f(()=>import("./Chapter3-Software-Testing-Process.html-D1VP-ocs.js"),__vite__mapDeps([65,1])),meta:{author:"chiichen",date:17153856e5,category:["课程笔记"],tag:["软件测试与维护"],sticky:!1,isOriginal:!0,excerpt:`<figure><figcaption>Brief  comparison of software testing phases</figcaption></figure>
1127<h2>单元测试(Unit Test)</h2>
1128<ul>
1129<li>“单元”:明确的功能、规格定义,与其他部分明确的接口定义。
1130<ul>
1131<li>结构化程序设计:函数或子过程;</li>
1132<li>面向对象:类或类的方法;</li>
1133<li>一个菜单、屏幕显示界面或对话框等。</li>
1134</ul>
1135</li>
1136<li>单元测试也称模块测试,这是针对最小的可测试软件元素-模块进行测试工作。单元测试目的在于发现各模块内部可能存在的各种差错。</li>
1137<li>在单元测试时,如果模块不是独立的程序,需要辅助测试模块。有两种辅助模块:
1138<ul>
1139<li>驱动模块(Driver):所测模块的主程序:它接收测试数据,把这些数据传递给所测试模块,最后再输出实测结果。当被测试模块能完成一定功能时,也可以不要驱动模块。</li>
1140<li>桩模块(Stub):用来代替所测模块调用的子模块。<br>
1141</li>
1142</ul>
1143</li>
1144</ul>`,readingTime:{minutes:13.31,words:3994},title:"第3章 软件测试过程",icon:"page",order:1,type:"article"}}],["/notes/Software-Testing-and-Maintenance/Chapter4-Software-Testing-Management.html",{loader:()=>f(()=>import("./Chapter4-Software-Testing-Management.html-kuhZXlEV.js"),__vite__mapDeps([66,1])),meta:{author:"chiichen",date:1715472e6,category:["课程笔记"],tag:["软件测试与维护"],sticky:!1,isOriginal:!0,excerpt:`<h2>软件测试环境(Software Testing Environment)</h2>
1145<ul>
1146<li>软件测试环境包括<code>设计环境</code>,<code>实施环境</code>和<code>管理环境</code>三部分,是指为了完成软件测试工作所必需的硬件、软件、设备、数据的总称。</li>
1147<li>软件测试环境是软件测试实施的一个重要阶段,软件测试环境适合与否会严重影响测试结果的真实性和正确性。测试环境是软件测试的基础</li>
1148</ul>
1149<h3>软件测试环境的要素(Elements of software testing environment)</h3>
1150<ul>
1151<li>一般来说,配置测试环境应该满足五个基本要素是:<code>硬件</code>、<code>软件</code>、<code>网络环境</code>、<code>数据准备</code>、<code>测试工具</code>。其中硬件、软件是测试环境中的最基本的两个要素,并派生出后三者。</li>
1152</ul>`,readingTime:{minutes:14.04,words:4212},title:"第4章 软件测试管理",icon:"page",order:1,type:"article"}}],["/notes/Software-Testing-and-Maintenance/Chapter5-Software-Maintenance.html",{loader:()=>f(()=>import("./Chapter5-Software-Maintenance.html-Dz7VYXMI.js"),__vite__mapDeps([67,1])),meta:{author:"chiichen",date:1715472e6,category:["课程笔记"],tag:["软件测试与维护"],sticky:!1,isOriginal:!0,excerpt:`<h2>
1152软件维护的定义(Definition of Software Maintenance)</h2>
1153<ul>
1154<li>软件维护是指软件系统交付使用以后,为了改正错误或满足新的需要而修改软件的过程。</li>
1155<li>一般来说,要求进行维护的原因大致有以下几种:
1156<ol>
1157<li>改正程序中的错误和缺陷。</li>
1158<li>改进设计以适应新的软、硬件环境。</li>
1159<li>增加新的应用范围。</li>
1160</ol>
1161</li>
1162</ul>
1163<h2>软件维护的类型(Types of Software maintenance)</h2>
1164<ul>
1165<li>根据软件维护的不同原因,软件维护可以分成以下类型:
1166<ol>
1167<li>改正性维护</li>
1168<li>适应性维护</li>
1169<li>完善性维护</li>
1170<li>预防性维护</li>
1171</ol>
1172</li>
1173</ul>`,readingTime:{minutes:15.42,words:4625},title:"第5章 软件测试维护",icon:"page",order:1,type:"article"}}],["/notes/Software-Testing-and-Maintenance/",{loader:()=>f(()=>import("./index.html-DKJGOq3o.js"),__vite__mapDeps([68,1])),meta:{date:1715001357e3,readingTime:{minutes:.04,words:12},title:"软件测试与维护",icon:"lightbulb",type:"article"}}],["/notes/UML/Review-Quick-Note.html",{loader:()=>f(()=>import("./Review-Quick-Note.html-D09ctbIQ.js"),__vite__mapDeps([69,1])),meta:{author:"chiichen",date:17044992e5,category:["课程笔记"],tag:["UML"],sticky:!1,isOriginal:!0,excerpt:`<h2>第一章</h2>
1174<ul>
1175<li>分析-设计:提出问题-解决问题</li>
1176<li>用例(use case):人们使用应用的情节或者场景</li>
1177<li>领域模型(domain model):不是对软件对象的描述,是对真实世界中的概念的一种可视化,也被称为概念对象模型。</li>
1178<li>顺序图(交互图的一种):用来描述软件对象之间的信息流</li>
1179<li>设计类图(design class deagram):表述软件类,缩小代码和领域模型之间的差距,被称为低表示差距(lower representational gap)</li>
1180<li>UML 的三种应用方法:草图、蓝图(逆向工程:代码可视化,便于理解;前向工程:指导代码生成)、编程语言</li>
1181<li>敏捷建模(agile modeling)强调了把 UML 作为草图的方式</li>
1182<li>UML 的三种透视图:概念透视图(描述现实世界中的事务),规格说明软件透视图(描述软件的接口等信息,但是不约定特定实现),实现透视图(描述在指定技术例如 java 中的实现)</li>
1183<li>相对应的,在这三种图中的 UML 类被分别称为概念类(conceptual class)、软件类和实现类</li>
1184</ul>`,readingTime:{minutes:26.8,words:8041},title:"UML复习简记",icon:"page",order:1,type:"article"}}],["/notes/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter0%E7%BB%AA%E8%AE%BA.html",{loader:()=>f(()=>import("./Chapter0绪论.html-Cf8iocsm.js"),__vite__mapDeps([70,1])),meta:{author:"chiichen",date:17023392e5,category:["课程笔记"],tag:["软件体系结构"],sticky:!1,isOriginal:!0,excerpt:`<h2>教材</h2>
1185<p>软件构架实践(第 3 版),L.Bass,P.Clements,andR.Kazman,清华大学出版社(2013)</p>
1186<h2>主要内容</h2>
1187`,readingTime:{minutes:.29,words:87},title:"Chapter0 绪论",icon:"page",order:1,type:"article"}}],["/notes/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter10%E5%8F%AF%E6%B5%8B%E8%AF%95%E6%80%A7.html",{loader:()=>f(()=>import("./Chapter10可测试性.html-BR-MHCjD.js"),__vite__mapDeps([71,1])),meta:{author:"chiichen",date:17026848e5,category:["课程笔记"],tag:["软件体系结构"],sticky:!1,isOriginal:!0,excerpt:`<h2>可测试性是什么?</h2>
1188<ul>
1189<li>软件的可测试性是指通过(通常是基于执行的)测试来展示其错误的难易程度。</li>
1190<li>可测试性是指系统在下一次测试执行中失败的概率。</li>
1191<li>如果系统存在错误,我们希望它能在测试过程中尽快失败。</li>
1192<li>要使一个系统具有可测试性,必须能够控制每个组件的输入(并可能操作其内部状态),然后观察其输出(以及可能的内部状态)。</li>
1193</ul>
1194<h2>可测试性策略的目标</h2>
1195<ul>
1196<li>可测试性策略的目标是在软件开发完成的一个增量中实现更容易的测试。</li>
1197<li>可测试性策略可以分为两个类别:
1198<ul>
1199<li>第一个类别涉及向系统添加可控性和可观察性。</li>
1200<li>第二个类别涉及限制系统设计中的复杂性。</li>
1201</ul>
1202</li>
1203</ul>`,readingTime:{minutes:3.27,words:981},title:"Chapter10 可测试性",icon:"page",order:1,type:"article"}}],["/notes/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter11%E6%98%93%E7%94%A8%E6%80%A7.html",{loader:()=>f(()=>import("./Chapter11易用性.html-JQEMGUfq.js"),__vite__mapDeps([72,1])),meta:{author:"chiichen",date:17026848e5,category:["课程笔记"],tag:["软件体系结构"],sticky:!1,isOriginal:!0,excerpt:`<h2>什么是易用性?</h2>
1204<ul>
1205<li>易用性关注用户完成所需任务的难易程度以及系统提供的用户支持。</li>
1206<li>易用性是改善系统质量的最便宜和最简单的方式之一。</li>
1207<li>易用性包括以下几个方面:
1208<ul>
1209<li>高效使用系统。</li>
1210<li>学习系统的功能。</li>
1211<li>尽量减少错误的影响。</li>
1212<li>
1212使系统适应用户需求。</li>
1213<li>提高用户的信心和满意度。</li>
1214</ul>
1215</li>
1216</ul>
1217<h2>易用性策略</h2>
1218<figure><figcaption>Usability tactics</figcaption></figure>`,readingTime:{minutes:1.72,words:516},title:"Chapter11 易用性",icon:"page",order:1,type:"article"}}],["/notes/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter12%E5%85%B6%E5%AE%83%E8%B4%A8%E9%87%8F%E5%B1%9E%E6%80%A7.html",{loader:()=>f(()=>import("./Chapter12其它质量属性.html-61VrjwPO.js"),__vite__mapDeps([73,1])),meta:{author:"chiichen",date:17026848e5,category:["课程笔记"],tag:["软件体系结构"],sticky:!1,isOriginal:!0,excerpt:`<h2>可移植性(Portability)</h2>
1219<ul>
1220<li>可移植性也是一种特殊形式的可修改性。</li>
1221<li>可移植性指的是将为一个平台构建的软件更改为在不同平台上运行的便捷程度。</li>
1222</ul>
1223<h2>开发可分发性(Development Distributability)</h2>
1224<ul>
1225<li>开发可分发性是指设计软件以支持分布式软件开发的质量。</li>
1226<li>系统是使用全球分布的团队开发的。</li>
1227<li>目的是最大限度减少团队之间的协调。</li>
1228</ul>
1229<h2>可扩展性(Scalability)</h2>
1230<ul>
1231<li>水平可扩展性(扩展外部)指向逻辑单元添加更多资源,例如向集群添加另一个服务器。</li>
1232<li>垂直可扩展性(扩展内部)指向物理单元添加更多资源,例如向计算机添加更多内存。</li>
1233<li>可产生可衡量的改进,而无需中断操作。</li>
1234</ul>`,readingTime:{minutes:2.04,words:613},title:"Chapter12 其它质量属性",icon:"page",order:1,type:"article"}}],["/notes/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter13%E6%A8%A1%E5%BC%8F%E5%92%8C%E7%AD%96%E7%95%A5.html",{loader:()=>f(()=>import("./Chapter13模式和策略.html-D72jS6dv.js"),__vite__mapDeps([74,75,1])),meta:{author:"chiichen",date:17026848e5,category:["课程笔记"],tag:["软件体系结构"],sticky:!1,isOriginal:!0,excerpt:`<h2>什么是模式(Pattern)?</h2>
1235<ul>
1236<li><code>架构模式(An architecture pattern)</code>是一组在实践中反复出现的设计决策的集合。</li>
1237<li>它具有已知的可重用性属性,并描述了一类架构。</li>
1238</ul>
1239<h2>架构模式(An architecture pattern)</h2>
1240<ul>
1241<li>模块模式
1242<ul>
1243<li>分层模式</li>
1244</ul>
1245</li>
1246<li>组件与连接器模式
1247<ul>
1248<li>代理模式</li>
1249<li>模型-视图-控制器模式</li>
1250<li>管道-过滤器模式</li>
1251<li>客户端-服务器模式</li>
1252<li>对等模式</li>
1253<li>面向服务的架构(SOA)模式</li>
1254<li>发布-订阅模式</li>
1255<li>共享数据模式</li>
1256</ul>
1257</li>
1258<li>分配模式
1259<ul>
1260<li>Map-Reduce 模式</li>
1261<li>多层模式</li>
1262</ul>
1263</li>
1264</ul>`,readingTime:{minutes:14.67,words:4400},title:"Chapter13 模式和策略",icon:"page",order:1,type:"article"}}],["/notes/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter14%E8%B4%A8%E9%87%8F%E5%B1%9E%E6%80%A7%E5%BB%BA%E6%A8%A1%E4%B8%8E%E5%88%86%E6%9E%90.html",{loader:()=>f(()=>import("./Chapter14质量属性建模与分析.html-DWfFXtub.js"),__vite__mapDeps([76,1])),meta:{author:"chiichen",date:17026848e5,category:["课程笔记"],tag:["软件体系结构"],sticky:!1,isOriginal:!0,excerpt:`<h2>我们如何了解软件的质量属性?</h2>
1265<ul>
1266<li>实验和测量</li>
1267<li>分析模型</li>
1268<li>模拟</li>
1269</ul>
1270<h2>建模架构以支持质量属性分析</h2>
1271<ul>
1272<li>一些质量属性,尤其是性能和可用性,已经有了被广泛理解和经过时间验证的分析模型,可以用于辅助分析。</li>
1273<li>通过分析模型,我们指的是支持定量分析的模型。</li>
1274</ul>
1275<h3>性能建模</h3>
1276<figure><figcaption>Performance Models</figcaption></figure>
1277<ul>
1278<li>参数:事件的到达速率、选择的排队规则、选择的调度算法、网络拓扑、网络带宽、选择的路由算法、事件的服务时间</li>
1279</ul>`,readingTime:{minutes:2.44,words:731},title:"Chapter14 质量属性建模与分析",icon:"page",order:1,type:"article"}}],["/notes/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter15%E6%95%8F%E6%8D%B7%E9%A1%B9%E7%9B%AE%E4%B8%AD%E7%9A%84%E6%9E%B6%E6%9E%84.html",{loader:()=>f(()=>import("./Chapter15敏捷项目中的架构.html-Bkjoy4Ok.js"),__vite__mapDeps([77,1])),meta:{author:"chiichen",date:17028576e5,category:["课程笔记"],tag:["软件体系结构"],sticky:!1,isOriginal:!0,excerpt:`<h2>敏捷宣言</h2>
1280<ul>
1281<li>Individuals and interactions over processes and tools 人机交互重于过程和工具</li>
1282<li>Working software over comprehensive documentation 可以工作的软件重于求全责备的文档</li>
1283<li>Customer collaboration over contract negotiation 客户协作重于合同谈判</li>
1284<li>Responding to change over following a plan 随时应对变化重于循规蹈矩</li>
1285</ul>`,readingTime:{minutes:3.73,words:1118},title:"Chapter15 敏捷项目中的架构",icon:"page",order:1,type:"article"}}],["/notes/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter16%E6%9E%B6%E6%9E%84%E4%B8%8E%E9%9C%80%E6%B1%82.html",{loader:()=>f(()=>import("./Chapter16架构与需求.html-Bc2EUejs.js"),__vite__mapDeps([78,1])),meta:{author:"chiichen",date:17028576e5,category:["课程笔记"],tag:["软件体系结构"],sticky:!1,isOriginal:!0,excerpt:`<h2>具有架构重要性的需求(Architecturally Significant Requirement ,ASR)</h2>
1286<ul>
1287<li>并非所有需求都是平等的。</li>
1288<li>具有架构重要性的需求(ASR)是对架构产生深远影响的需求ã€
1288‚</li>
1289<li>我们如何找到这些需求呢?</li>
1290</ul>
1291<h2>捕捉架构重要性需求的方法</h2>
1292<ul>
1293<li>从需求文档中获取</li>
1294<li>通过与利益相关者进行面谈</li>
1295<li>通过理解业务目标</li>
1296<li>在效用树中(In Utility Tree)</li>
1297</ul>
1298<h3>具有架构重要性的需求和需求文档</h3>`,readingTime:{minutes:5.62,words:1686},title:"Chapter16 架构与需求",icon:"page",order:1,type:"article"}}],["/notes/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter17%E8%AE%BE%E8%AE%A1%E6%9E%B6%E6%9E%84.html",{loader:()=>f(()=>import("./Chapter17设计架构.html-DdaZGzkn.js"),__vite__mapDeps([79,1])),meta:{author:"chiichen",date:17028576e5,category:["课程笔记"],tag:["软件体系结构"],sticky:!1,isOriginal:!0,excerpt:`<h2>设计策略(Design Strategy)</h2>
1299<ul>
1300<li>分解(Decomposition)</li>
1301<li>面向架构重要性需求的设计(Designing to Architecturally Significant Requirements)</li>
1302<li>生成和测试(Generate and Test)</li>
1303</ul>
1304<h2>分解(Decomposition)</h2>
1305<ul>
1306<li>架构决定了质量属性</li>
1307<li>重要的质量属性是整个系统的特征。</li>
1308<li>设计从整个系统开始
1309<ul>
1310<li>整个系统被分解为各个部分</li>
1311<li>每个部分可能继承全部或部分质量属性需求</li>
1312</ul>
1313</li>
1314</ul>`,readingTime:{minutes:5.13,words:1540},title:"Chapter17 设计架构",icon:"page",order:1,type:"article"}}],["/notes/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter19%E6%9E%B6%E6%9E%84%E5%AE%9E%E7%8E%B0%E4%B8%8E%E6%B5%8B%E8%AF%95.html",{loader:()=>f(()=>import("./Chapter19架构实现与测试.html-C2d-mrD8.js"),__vite__mapDeps([80,1])),meta:{author:"chiichen",date:17028576e5,category:["课程笔记"],tag:["软件体系结构"],sticky:!1,isOriginal:!0,excerpt:`<h2>架构与实现</h2>
1315<ul>
1316<li>保持代码和架构一致的技术:
1317<ul>
1318<li>在代码中嵌入设计(Embedding the Design in the Code)</li>
1319<li>框架</li>
1320<li>代码模板</li>
1321</ul>
1322</li>
1323</ul>
1324<h3>在代码中嵌入设计(Embedding the Design in the Code)</h3>
1325<ul>
1326<li>架构作为实现的蓝图。这意味着:
1327<ul>
1328<li>实现者知道他们正在实现的架构结构。例如,层次结构、发布-订阅、MVC、代理等。</li>
1329<li>他们可以将架构结构作为注释记录在代码中。这样,任何接手代码的人都会了解一些约束条件。</li>
1330<li>然后,工具可以自动关联代码和架构。</li>
1331</ul>
1332</li>
1333</ul>`,readingTime:{minutes:3.74,words:1123},title:"Chapter19 架构实现与测试",icon:"page",order:1,type:"article"}}],["/notes/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter1%E4%BB%80%E4%B9%88%E6%98%AF%E8%BD%AF%E4%BB%B6%E6%9E%B6%E6%9E%84.html",{loader:()=>f(()=>import("./Chapter1什么是软件架构.html-DM5B1e-c.js"),__vite__mapDeps([81,1])),meta:{author:"chiichen",date:17024256e5,category:["课程笔记"],tag:["软件体系结构"],sticky:!1,isOriginal:!0,excerpt:`<h2>什么是软件架构</h2>
1334<p>系统的软件架构是用于推理系统的一组结构,包括软件元素、它们之间的关系以及它们的属性。</p>
1335<div class="hint-container info">
1336<p class="hint-container-title">什么是推理</p>
1337<p>在这里,"推理"指的是通过对系统的结构、元素和属性进行分析和推导,从而得出关于系统行为、性能、可靠性以及其他方面的合理推断和判断。通过推理,架构师和利益相关者(Stakeholders)可以理解系统的特性、功能和约束,并做出相应的决策,如优化系统设计、改进系统性能、预测系统行为等。推理可以基于已有的知识、经验、规则和模型,并结合对系统需求和上下文的理解进行推断和推测。因此,推理在软件架构中是一种重要的思维和分析方式,用于评估和决策系统的设计和实现。</p>
1338</div>`,readingTime:{minutes:12.24,words:3671},title:"Chapter1 什么是软件架构",icon:"page",order:1,type:"article"}}],["/notes/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter2%E4%B8%BA%E4%BB%80%E4%B9%88%E8%BD%AF%E4%BB%B6%E6%9E%B6%E6%9E%84%E9%87%8D%E8%A6%81.html",{loader:()=>f(()=>import("./Chapter2为什么软件架构重要.html-CXxPrrsY.js"),__vite__mapDeps([82,1])),meta:{author:"chiichen",date:17024256e5,category:["课程笔记"],tag:["软件体系结构"],sticky:!1,isOriginal:!0,excerpt:`<h2>抑制或促进系统的质量属性</h2>
1339<ul>
1340<li>系统能否展现其所期望(或要求的)质量属性,在很大程度上取决于其架构。
1341<ul>
1342<li>性能</li>
1343<li>可修改性</li>
1344<li>安全性</li>
1345<li>可扩展性</li>
1346<li>可重用性</li>
1347</ul>
1348</li>
1349</ul>
1350<h2>推理和管理变更</h2>
1351<ul>
1352<li>
1352典型软件系统的总成本中,大约 80%发生在初始部署之后:
1353<ul>
1354<li>适应新功能</li>
1355<li>适应新环境</li>
1356<li>修复错误等等。</li>
1357</ul>
1358</li>
1359<li>每个架构将可能的变更划分为三个类别:
1360<ul>
1361<li>本地变更可以通过修改单个元素来完成。</li>
1362<li>非本地变更需要对多个元素进行修改,但保持底层架构方法不变。</li>
1363<li>架构变更会影响元素彼此交互的基本方式,并且将需要进行更大范围的更改。</li>
1364</ul>
1365</li>
1366<li>显然,本地变更是最理想的。</li>
1367<li>一个好的架构是指最常见的变更是本地变更,因此更容易进行。</li>
1368</ul>`,readingTime:{minutes:3.09,words:927},title:"Chapter2 为什么软件架构重要",icon:"page",order:1,type:"article"}}],["/notes/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter4%E7%90%86%E8%A7%A3%E8%B4%A8%E9%87%8F%E5%B1%9E%E6%80%A7.html",{loader:()=>f(()=>import("./Chapter4理解质量属性.html-CWvS2nIB.js"),__vite__mapDeps([83,1])),meta:{author:"chiichen",date:17024256e5,category:["课程笔记"],tag:["软件体系结构"],sticky:!1,isOriginal:!0,excerpt:`<h2>架构与需求</h2>
1369<p>系统需求可以分为以下几类:</p>
1370<ul>
1371<li>功能需求(Functional Requirements):说明系统必须完成的功能、运行时行为或对运行时刺激的反应。</li>
1372<li>质量属性需求(Quality Attribute Requirements):对功能需求进行限定,例如功能执行的速度要求、对错误输入的容错性要求等。</li>
1373<li>约束(Constraints):约束是一个没有自由度的设计决策。</li>
1374</ul>
1375<h3>功能性(Functionality)</h3>
1376<ul>
1377<li>功能性是系统按照其预期进行工作的能力。</li>
1378<li>功能性与架构有着奇特的关系:
1379<ul>
1380<li>功能性并不决定架构;</li>
1381</ul>
1382</li>
1383</ul>`,readingTime:{minutes:7.2,words:2160},title:"Chapter4 理解质量属性",icon:"page",order:1,type:"article"}}],["/notes/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter5%E5%8F%AF%E7%94%A8%E6%80%A7.html",{loader:()=>f(()=>import("./Chapter5可用性.html-BWIuLm5C.js"),__vite__mapDeps([84,1])),meta:{author:"chiichen",date:17024256e5,category:["课程笔记"],tag:["软件体系结构"],sticky:!1,isOriginal:!0,excerpt:`<h2>什么是可用性(Availability)</h2>
1384<ul>
1385<li>可用性指的是软件具备在需要时随时可用并准备好执行任务的属性。</li>
1386<li>可用性是指系统能够掩盖或修复故障,以使累积的服务中断时间不超过指定时间间隔内的要求值。</li>
1387<li>可用性的目标是通过减轻故障来最小化服务中断时间。</li>
1388</ul>
1389<div class="hint-container info">
1390<p class="hint-container-title">可用性(Availability)与可靠性(reliability)或可信性(r dependability)的区别</p>
1391<ul>
1392<li>可用性包括通常所称的可靠性。</li>
1393<li>可用性还涵盖了其他考虑因素,例如由于定期维护导致的服务中断。</li>
1394<li>可用性与以下因素密切相关
1395<ul>
1396<li>安全性,例如拒绝服务攻击</li>
1397<li>性能</li>
1398<li>...</li>
1399</ul>
1400</li>
1401</ul>
1402</div>`,readingTime:{minutes:4.44,words:1333},title:"Chapter5 可用性",icon:"page",order:1,type:"article"}}],["/notes/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter6%E4%BA%92%E6%93%8D%E4%BD%9C%E6%80%A7.html",{loader:()=>f(()=>import("./Chapter6互操作性.html-DA7mdhu4.js"),__vite__mapDeps([85,1])),meta:{author:"chiichen",date:1702512e6,category:["课程笔记"],tag:["软件体系结构"],sticky:!1,isOriginal:!0,excerpt:`<h2>什么是互操作性?</h2>
1403<ul>
1404<li>互操作性是指在特定环境下,两个或多个系统能够通过接口有意义地交换信息的程度。</li>
1405<li>对于系统的互操作性的任何讨论都需要明确指出与谁以及在什么情况下进行交互。</li>
1406<li>语法互操作性是指交换数据的能力。</li>
1407<li>语义互操作性是指解释交换的数据的能力。</li>
1408<li>实现互操作性的两种视角:
1409<ul>
1410<li>在了解外部系统接口的基础上,将该知识设计到系统中。</li>
1411<li>在没有了解其他系统的情况下,以更通用的方式设计系统以实现互操作性。</li>
1412</ul>
1413</li>
1414</ul>
1415<h3>动机</h3>`,readingTime:{minutes:5.56,words:1667},title:"Chapter6 互操作性",icon:"page",order:1,type:"article"}}],["/notes/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter7%E5%8F%AF%E4%BF%AE%E6%94%B9%E6%80%A7.html",{loader:()=>f(()=>import("./Chapter7可修改性.html-V8seVc_v.js"),__vite__mapDeps([86,75,1])),meta:{author:"chiichen",date:1702512e6,category:["课程笔记"],tag:["软件体系结构"],sticky:!1,isOriginal:!0,excerpt:`<h2>什么是可修改性(Modifiability)?</h2>
1416<ul>
1417<li>可修改性涉及变化,我们对它的兴趣在于变化的成本和风险。</li>
1418<li>为了规划可修改性,架构师必须考虑四个问题:
1419<ul>
1420<li>什么可以改变?</li>
1421<li>变化的可能性有多大?</li>
1422<li>变化何时发生,由谁进行?</li>
1423<li>变化的成本是多少?</li>
1424</ul>
1425</li>
1426</ul>
1427<h3>什么可以改变</h3>
1428<ul>
1429<li>系统的功能</li>
1430<li>
1430平台,即硬件、操作系统和中间件</li>
1431<li>系统运行的环境
1432<ul>
1433<li>必须与之互操作的系统</li>
1434<li>用于通信的协议</li>
1435</ul>
1436</li>
1437<li>容量
1438<ul>
1439<li>支持的用户数量</li>
1440<li>同时操作的数量</li>
1441</ul>
1442</li>
1443</ul>`,readingTime:{minutes:6.61,words:1982},title:"Chapter7 可修改性",icon:"page",order:1,type:"article"}}],["/notes/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter8%E6%80%A7%E8%83%BD.html",{loader:()=>f(()=>import("./Chapter8性能.html-BgdVwN9c.js"),__vite__mapDeps([87,1])),meta:{author:"chiichen",date:1702512e6,category:["课程笔记"],tag:["软件体系结构"],sticky:!1,isOriginal:!0,excerpt:`<h2>什么是性能?</h2>
1444<ul>
1445<li>它与时间有关</li>
1446<li>性能是关于时间以及软件系统满足时间要求的能力</li>
1447<li>当事件发生时,系统必须及时对其做出响应
1448<ul>
1449<li>事件包括中断、消息、来自用户或其他系统的请求,或标记时间流逝的时钟事件</li>
1450</ul>
1451</li>
1452</ul>
1453<h3>性能建模</h3>
1454<ul>
1455<li>响应时间的两个基本因素</li>
1456<li>处理时间指系统用于响应的工作时间</li>
1457<li>阻塞时间指系统无法响应的时间</li>
1458<li>阻塞时间的原因包括
1459<ul>
1460<li>资源争用</li>
1461<li>资源的可用性</li>
1462<li>对其他因素的依赖</li>
1463</ul>
1464</li>
1465</ul>`,readingTime:{minutes:9.85,words:2955},title:"Chapter8 性能",icon:"page",order:1,type:"article"}}],["/notes/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter9%E5%AE%89%E5%85%A8%E6%80%A7.html",{loader:()=>f(()=>import("./Chapter9安全性.html-BwhWm9cC.js"),__vite__mapDeps([88,1])),meta:{author:"chiichen",date:17026848e5,category:["课程笔记"],tag:["软件体系结构"],sticky:!1,isOriginal:!0,excerpt:`<h2>什么是安全(Security)</h2>
1466<ul>
1467<li>安全是系统保护数据和信息免受未经授权访问的能力的度量,同时仍然向经授权的人员和系统提供访问权限。</li>
1468<li>针对计算机系统的有意为害行为称为攻击。</li>
1469<li>攻击可以采取不同形式:
1470<ul>
1471<li>未经授权的尝试访问/修改数据或服务</li>
1472<li>旨在拒绝合法用户的服务</li>
1473</ul>
1474</li>
1475<li>安全具有三个主要特征,即 CIA:</li>
1476<li>保密性(Confidentiality)是数据或服务受到未经授权访问的保护性质。
1477<ul>
1478<li>例如,黑客无法在政府计算机上访问您的个人所得税申报表。</li>
1479</ul>
1480</li>
1481<li>完整性(Integrity)是数据或服务不受未经授权操纵的性质。
1482<ul>
1483<li>例如,您的成绩自从教师分配以来没有被更改。</li>
1484</ul>
1485</li>
1486<li>可用性(Availability)是系统能够供合法使用的性质。
1487<ul>
1488<li>例如,拒绝服务攻击阻止您从在线书店订购一本书。</li>
1489</ul>
1490</li>
1491<li>支持 CIA 的其他特征包括:
1492<ul>
1493<li>身份验证验证交易参与方的身份,并检查他们是否真实身份与其所声称的一致。</li>
1494<li>授权授予用户执行任务的权限。</li>
1495</ul>
1496</li>
1497</ul>`,readingTime:{minutes:4.02,words:1206},title:"Chapter9 安全性",icon:"page",order:1,type:"article"}}],["/notes/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chpater21%E6%9E%B6%E6%9E%84%E8%AF%84%E4%BC%B0.html",{loader:()=>f(()=>import("./Chpater21架构评估.html-DER5W5Dp.js"),__vite__mapDeps([89,1])),meta:{author:"chiichen",date:17028576e5,category:["课程笔记"],tag:["软件体系结构"],sticky:!1,isOriginal:!0,excerpt:`<h2>三种评估形式</h2>
1498<ul>
1499<li>设计过程中由设计师进行的评估。</li>
1500<li>设计过程中由同行进行的评估。</li>
1501<li>架构设计完成后由外部人员进行的分析。</li>
1502</ul>
1503<h3>设计师的评估(Evaluation by the Designer)</h3>
1504<ul>
1505<li>每当设计师做出关键设计决策时,应对选择的备选方案进行评估。</li>
1506<li>“生成和测试”方法中的“测试”部分。</li>
1507<li>需要进行多少分析?有三个因素包括:
1508<ul>
1509<li>决策的重要性。</li>
1510<li>潜在备选方案的数量。更多的备选方案需要更多的时间进行评估。</li>
1511<li>足够好与完美相对。不要在决策上花费超过其价值的时间。</li>
1512</ul>
1513</li>
1514</ul>`,readingTime:{minutes:9.11,words:2732},title:"Chpater21 架构评估",icon:"page",order:1,type:"article"}}],["/notes/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/%E5%A4%8D%E4%B9%A0%E6%8F%90%E7%BA%B2.html",{loader:()=>f(()=>import("./复习提纲.html-Cb1gC5vk.js"),__vite__mapDeps([90,1])),meta:{author:"chiichen",date:17023392e5,category:["课程笔记"],tag:["软件体系结构"],sticky:!1,isOriginal:!0,excerpt:`<h2>Part I Introduction of software architecture</h2>
1515<p>– What? definition, 3 types of structures,architecture patterns &amp; tactics<br>
1516– Why?</p>
1517<h2>Part II Quality attributes</h2>
1518<p>– Availability, interoperability, modifiability,performance, security, testability, usability andothers<br>
1519– Definitions, general scenarios &amp; concretescenarios of quality attributes, tactics<br>
1520– Architecture patterns and tactics<br>
1521– Quality attributes modeling and analysis:availability and performance</p>`,readingTime:{minutes:.73,words:220},title:"2023年期末考复习提纲",icon:"page",order:1,type:"article"}}],["/posts/DragonOS/DragonOS%E6%8B%9B%E6%96%B0%E4%BB%BB%E5%8A%A1.html",{loader:()=>f(()=>import("./DragonOS招新任务.html-DebaNl3R.js"),__vite__mapDeps([91,1])),meta:{author:"chiichen",date:17088192e5,category:["DragonOS"],tag:["DragonOS"],sticky:!1,isOriginal:!0,excerpt:`<h2>简介</h2>
1522<p>ramfs 指内存文件系统,其显著特性为所有文件均保存于内存中,不同于通常理解的保存在硬盘上的文件。因此内存文件系统屏蔽掉了跟硬盘这类底层硬件交互的部分,抽离出来了文件系统的基础功能,适合作为操作系统入门任务。</p>
1523<h2>任务介绍</h2>
1524<ol>
1525<li>系统中已经有完成的 ramfs 模块,位于<code>kernel/src/filesystem/ramfs/mod.rs</code>中,你需要做的就是把这个 ramfs 替换为自己的实现,当然,对现有代码的借鉴是允许的,但是你要知其然并知其所以然,知道代码这样设计背后的含义,比如为什么要加锁,为什么要用 Arc。</li>
1526<li>替换完之后你需要编写测试程序测试你的 ramfs,现在的推荐做法是在内核初始化文件系统的代码中,多初始化一个 ramfs 并挂载到根目录,然后编写用户程序,测试这个文件系统的基本功能,例如创建、删除目录,读写文件。</li>
1527</ol>`,readingTime:{minutes:1.77,words:530},title:"DragonOS招新任务",icon:"page",order:1,type:"article"}}],["/posts/Linux%E5%86%85%E6%A0%B8/NUMA%20Balance%E5%AE%9E%E7%8E%B0%E6%B5%85%E6%9E%90.html",{loader:()=>f(()=>import("./NUMA Balance实现浅析.html-CJnJNNCO.js"),__vite__mapDeps([92,1])),meta:{author:"chiichen",date:16981056e5,category:["笔记","Linux 内核"],tag:["Linux 内核","内存管理","NUMA"],sticky:!0,excerpt:`<h2>参考资料</h2>
1528<p>转载于<a href="https://blog.csdn.net/faxiang1230/article/details/123709414" target="_blank" rel="noopener noreferrer">numa balance 实现浅析</a>,原作者为<a href="https://blog.csdn.net/faxiang1230?type=blog" target="_blank" rel="noopener noreferrer">wjx5210<br>
1529</a>,遵循 CC 4.0 BY 版权协议</p>
1530<h2>NUMA balance 的背景</h2>`,readingTime:{minutes:22.01,words:6603},title:"NUMA Balance实现浅析",icon:"page",order:1,type:"article"}}],["/posts/Linux%E5%86%85%E6%A0%B8/NUMA%20Balancing.html",{loader:()=>f(()=>import("./NUMA Balancing.html-594LRFJm.js"),__vite__mapDeps([93,1])),meta:{author:"chiichen",date:16975008e5,category:["笔记","Linux 内核"],tag:["Linux 内核","NUMA"],sticky:!1,excerpt:`<h2>
1530<a class="header-anchor" href="#numa-balancing-in-kernel-doc"><span></span></a><a href="https://www.kernel.org/doc/Documentation/sysctl/kernel.txt" target="_blank" rel="noopener noreferrer">numa_balancing in kernel doc</a></h2>
1531<p>Enables/disables automatic page fault based NUMA memory<br>
1532balancing. Memory is moved automatically to nodes<br>
1533that access it often.</p>`,readingTime:{minutes:1.61,words:484},title:"NUMA Balancing",icon:"page",order:1,type:"article"}}],["/posts/Linux%E5%86%85%E6%A0%B8/vscode%20qemu%E5%BC%80%E5%8F%91Linux%E5%86%85%E6%A0%B8.html",{loader:()=>f(()=>import("./vscode qemu开发Linux内核.html-DU_4D5Dq.js"),__vite__mapDeps([94,1])),meta:{author:"chiichen",date:16984512e5,category:["笔记","Linux 内核"],tag:["Linux 内核","开发环境"],sticky:!0,excerpt:`<p>参考于<a href="http://kerneltravel.net/blog/2021/debug_kernel_szp/" target="_blank" rel="noopener noreferrer">QEMU 调试 Linux 内核环境搭建</a></p>
1534<h2>获取 Linux 源码</h2>
1535<ul>
1536<li>略</li>
1537</ul>
1538<h2>编译 Linux 内核</h2>
1539<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">cd</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> /linux</span></span>
1540<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">export</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> ARCH</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">x86</span></span>
1541<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">make</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">  x86_64_defconfig</span></span>
1542<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 如果想要更好的clangd补全就用clang编译(make CC=clang x86_64_defconfig ) ,但是clang在部分模块可能需要特殊的编译选</span></span>
1543<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 项才能编译,所以还是推荐用默认的gcc编译,尽管这样clangd的效果会差一点</span></span>
1544<span class="line"></span>
1545<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># ./scripts/config --file .config -e CONFIG_NUMA_BALANCE CONFIG_NUMA_BALANCING_DEFAULT_ENABLED CONFIG_NUMA</span></span>
1546<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># Todo 还有一些nuuma_balance相关设置项要打开,不然后面要在编译时手动选择Y</span></span></code></pre>
1547<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>`,readingTime:{minutes:2.04,words:612},title:"vscode+qemu开发Linux内核",icon:"page",order:1,type:"article"}}],["/posts/Rust/Common-rust-lifetime-misconceptions.html",{loader:()=>f(()=>import("./Common-rust-lifetime-misconceptions.html-BmPpfRw_.js"),__vite__mapDeps([95,1])),meta:{author:"chiichen",date:16981056e5,category:["笔记","Rust"],tag:["Rust"],sticky:!0,excerpt:`<h2>转载自</h2>
1548<p><a href="https://github.com/whfuyn/rust-blog/blob/master/posts/Rust%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E7%9A%84%E5%B8%B8%E8%A7%81%E8%AF%AF%E8%A7%A3.md" target="_blank" rel="noopener noreferrer">中文译者</a>,以及<a href="https://github.com/pretzelhammer/rust-blog/blob/master/posts/common-rust-lifetime-misconceptions.md" target="_blank" rel="noopener noreferrer">原文</a>,根据约定,本文中所有代码都使用 Apache License Version 2.0 或 MIT License</p>`,readingTime:{minutes:32.35,words:9704},title:"Rust生命周期常见误区",icon:"page",order:1,type:"article"}}],["/posts/Rust/Inlinable-dyn-extension-traits.html",{loader:()=>f(()=>import("./Inlinable-dyn-extension-traits.html-CpyLiZ7n.js"),__vite__mapDeps([96,1])),meta:{author:"chiichen",date:17204832e5,category:["笔记","Rust"],tag:["Rust"],sticky:!0,excerpt:`
1549<p><strong>原作者: <a href="https://github.com/daniel5151/inlinable-dyn-extension-traits/blob/master/writeup.md" target="_blank" rel="noopener noreferrer">daniel5151</a></strong></p>
1550<p><strong>注意:</strong> 如果你时间紧迫,只想看所有方法的列表及其优缺点ï¼
1550Œè¯·è·³åˆ°<a href="#summary-and-comparisons">总结和比较</a>部分。</p>
1551<h2>一个激励示例 - 可扩展协议</h2>`,readingTime:{minutes:13.26,words:3977},title:"Rust中的Optional Trait",icon:"page",order:1,type:"article"}}],["/posts/Rust/Type-erase-via-trait.html",{loader:()=>f(()=>import("./Type-erase-via-trait.html-DVRKJY1f.js"),__vite__mapDeps([97,1])),meta:{author:"chiichen",date:17144352e5,category:["笔记","Rust"],tag:["Rust"],sticky:!0,excerpt:`<h2>为什么要类型擦除</h2>
1552<p>这里的类型擦除和通常我们听到的,在 Java 里的类型擦除不太一样,这里的类型擦除是指,通过某些手段,屏蔽掉一些我们不关心的范型,从而达到统一存储的目的,这样说可能很抽象,直接看代码</p>
1553<div class="language-rust line-numbers-mode" data-highlighter="shiki" data-ext="rust" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-rust"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">pub</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> trait</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B"> Source</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">{</span></span>
1554<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    type</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B"> Event</span></span>
1555<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    pub</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> fn</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> poll</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(&amp;</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">self</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)-&gt;</span><span style="--shiki-light:#0184BC;--shiki-dark:#E5C07B">Result</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&lt;</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">Self</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">::</span><span style="--shiki-light:#0184BC;--shiki-dark:#E5C07B">Event</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#0184BC;--shiki-dark:#E5C07B">SourceError</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span>
1556<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
1557<span class="line"></span>
1558<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">pub</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> struct</span><span style="--shiki-light:#0184BC;--shiki-dark:#E5C07B"> SourceEntry</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&lt;</span><span style="--shiki-light:#0184BC;--shiki-dark:#E5C07B">S</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span><span style="--shiki-light:#0184BC;--shiki-dark:#E5C07B">Source</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#0184BC;--shiki-dark:#E5C07B">T</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;{</span></span>
1559<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    source</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span><span style="--shiki-light:#0184BC;--shiki-dark:#E5C07B">S</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
1560<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    callback</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#0184BC;--shiki-dark:#E5C07B">Box</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&lt;</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">dyn</span><span style="--shiki-light:#0184BC;--shiki-dark:#E5C07B"> Fn</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#0184BC;--shiki-dark:#E5C07B">S</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">::</span><span style="--shiki-light:#0184BC;--shiki-dark:#E5C07B">Event</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#0184BC;--shiki-dark:#E5C07B">T</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)&gt;</span></span>
1561<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
1562<span class="line"></span>
1563<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">pub</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> struct</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B"> SourceList</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&lt;</span><span style="--shiki-light:#0184BC;--shiki-dark:#E5C07B">S</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span><span style="--shiki-light:#0184BC;--shiki-dark:#E5C07B">Source</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#0184BC;--shiki-dark:#E5C07B">T</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;{</span></span>
1564<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    sources</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span><span style="--shiki-light:#0184BC;--shiki-dark:#E5C07B">Vec</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&lt;</span><span style="--shiki-light:#0184BC;--shiki-dark:#E5C07B">Rc</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&lt;</span><span style="--shiki-light:#0184BC;--shiki-dark:#E5C07B">RefCell</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&lt;</span><span style="--shiki-light:#0184BC;--shiki-dark:#E5C07B">SourceEntry</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&lt;</span><span style="--shiki-light:#0184BC;--shiki-dark:#E5C07B">S</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#0184BC;--shiki-dark:#E5C07B">T</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;&gt;&gt;&gt;</span></span>
1565<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span></code></pre>
1566<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>`,readingTime:{minutes:2.73,words:818},title:"利用Erased-trait进行类型擦除",icon:"page",order:1,type:"article"}}],["/posts/backend/",{loader:()=>f(()=>import("./index.html-DaeLZXUD.js"),__vite__mapDeps([98,1])),meta:{date:1714837884e3,readingTime:{minutes:.03,words:9},title:"后端技术",icon:"lightbulb",type:"article"}}],["/posts/backend/gRPC-introduction.html",{loader:()=>f(()=>import("./gRPC-introduction.html-ClWVgZr3.js"),__vite__mapDeps([99,1])),meta:{author:"chiichen",date:17172e8,category:["笔记","后端"],tag:["后端","gRPC","go"],sticky:!0,isOriginal:!0,excerpt:`<h2>什么是 gRPC</h2>
1567<h2>前期准备</h2>
1568<p>在本篇内容中,我们将通过<code>go+gin+gRPC</code>的组合来初步认识 gRPC,并实现一个简单的网关应用</p>
1569<h3>Go 环境安装</h3>
1570<p>略</p>
1571<h3>创建项目</h3>
1572<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">mkdir</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> app-gateway</span></span>
1573<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">cd</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> app-gateway</span></span>
1574<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">go</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mod</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> init</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> app-gateway</span></span></code></pre>
1575<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>`,readingTime:{minutes:3.29,words:986},title:"gRPC入门",icon:"page",order:1,type:"article"}}],["/posts/cpp/Application-of-decltype-auto.html",{loader:()=>f(()=>import("./Application-of-decltype-auto.html-B1yndWPT.js"),__vite__mapDeps([100,
15751])),meta:{author:"chiichen",date:16976736e5,category:["C++"],tag:["C++"],sticky:!1,excerpt:`<h2>非模板中应用</h2>
1576<p>印象中 google 的 C++编程规范手册说过,如果不是为了代码更安全或者不熟悉项目的人读起来更方便,尽量不要使用类型推导,比如为了省显示类型书写。</p>
1577<h3>最常见推导</h3>
1578<p>对于变量或者普通的返回值来说,常见有 4 种 auto 用法,还有一种<code>const auto &amp;&amp;</code>基本没有用,不去讨论。</p>
1579<ol>
1580<li><code>auto</code>: 产生拷贝,可以修改</li>
1581<li><code>auto&amp;</code>: 左值引用,接受左值,可以修改</li>
1582<li><code>const auto&amp;</code>: const 引用,可以接受左右值,不可修改</li>
1583<li><code>auto&amp;&amp;</code>: 万能引用,可以接受左右值,const 引用时不能修改</li>
1584</ol>`,readingTime:{minutes:8.78,words:2635},title:"decltype(auto)的应用",icon:"page",order:1,type:"article"}}],["/posts/cpp/",{loader:()=>f(()=>import("./index.html-CcgJUhsW.js"),__vite__mapDeps([101,1])),meta:{date:1714837884e3,readingTime:{minutes:.02,words:6},title:"C++",icon:"lightbulb",type:"article"}}],["/posts/rcc%E7%BC%96%E8%AF%91%E5%99%A8/Chapter0%E5%89%8D%E8%A8%80.html",{loader:()=>f(()=>import("./Chapter0前言.html-BEapDesS.js"),__vite__mapDeps([102,1])),meta:{author:"chiichen",date:16989696e5,category:["笔记","编译器"],tag:["编译器"],sticky:!1,isOriginal:!0,excerpt:`<h2>开端</h2>
1585<p>本笔记是本人研究编译器开发<a href="https://github.com/RccCommunity/rcc" target="_blank" rel="noopener noreferrer">rcc</a>的思考笔记,涵盖了在开发过程中的思考和记录,希望有助于其它学生/开发者</p>
1586<h2>语言计划</h2>
1587<p>希望结合 go 语言的指针+gc 的特性和 rust 的错误处理、枚举类型等语法特性,实现一个类似于用 gc+指针 替换掉所有权机制的 rust 语言(r 门),面向非系统场景下的编程。当然这是一个非常初步的目标(写于项目开始 2023/11/03),可能将来会有所改变,但这是初步的目标,以此为勉励吧</p>`,readingTime:{minutes:.74,words:223},title:"Chapter0 前言",icon:"page",order:1,type:"article"}}],["/posts/rcc%E7%BC%96%E8%AF%91%E5%99%A8/Chapter1%E8%AF%8D%E6%B3%95%E5%88%86%E6%9E%90%E5%99%A8%E4%B9%8BChumsky.html",{loader:()=>f(()=>import("./Chapter1词法分析器之Chumsky.html-D18RPp2k.js"),__vite__mapDeps([103,1])),meta:{author:"chiichen",date:16989696e5,category:["笔记","编译器"],tag:["编译器","词法分析"],sticky:!1,isOriginal:!0,excerpt:`<h2>库的选择</h2>
1588<p>一开始我其实是选择的<a href="https://docs.rs/nom/7.1.3/nom/index.html" target="_blank" rel="noopener noreferrer">nom</a>这个库来完成词法分析的,但是写了一段时间之后还是选择了<a href="https://docs.rs/chumsky/1.0.0-alpha.6/chumsky/index.html" target="_blank" rel="noopener noreferrer">chumsky</a>,有几点因素在里面:</p>
1589<ol>
1590<li>左递归问题:其实<code>nom</code>写起来要比<code>chumsky</code>优雅很多,因为前者的主题是一系列函数指针,类型很清晰,但是后者是泛型对象,一旦报错就是嵌套几十层的泛型可读性几乎为零,而且前者是<code>PEC</code>(Parser Expression Combinator),可以把每个函数的职责划分得很清楚,而后者是 <code>PEG</code>(Parser Expression Generator),相对来说没有这么优雅。但是这一切都被左递归打破了。大多数学生都知道,消除左递归的方法就是重写文法,然而重写文法会导致每个产生式之间的大量耦合,使得原来职责清晰的函数变得很答辩。而<code>chumsky</code>虽然也没有提供便捷的处理方法(<a href="https://github.com/zesterer/chumsky/discussions/575" target="_blank" rel="noopener noreferrer">#575</a>)但是例如<code>recursive</code>闭包的存在使得这部分处理更加直接明了,相比于<code>nom</code>有更好的可读性</li>
1591<li>错误恢复和抛出:在编译器中,错误处理其实是很重要的一部分,这直接关系到用户的编程体验,<code>chumsky</code>恰恰是考虑到了这点,它有一个孪生的<a href="https://github.com/zesterer/ariadne" target="_blank" rel="noopener noreferrer">ariadne</a>库,可以生成一些可视化程度较高的错误信息,而且在分析的过程中提供了错误恢复的操作,这些都是<code>nom</code>缺乏的</li>
1592</ol>`,readingTime:{minutes:1.85,words:556},title:"Chapter1 词法分析器之Chumsky",icon:"page",order:1,type:"article"}}],["/posts/rcc%E7%BC%96%E8%AF%91%E5%99%A8/HelloWorld.html",{loader:()=>f(()=>import("./HelloWorld.html-FT0WdztZ.js"),__vite__mapDeps([104,1])),meta:{author:"chiichen",date:16987968e5,category:["笔记","编译器"],tag:["编译器"],sticky:!1,isOriginal:!0,excerpt:`<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> apt-get</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -y</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> clang</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> curl</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> llvm-14.0.0-dev</span></span></code></pre>
1593<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div>`,readingTime:{minutes:1.06,words:318},title:"template",icon:"page",order:1,type:"article"}}],["/posts/%E5%BE%AE%E4%BF%A1/%E5%BE%AE%E4%BF%A1%E5%BA%95%E5%B1%82%E8%A7%A3%E6%9E%90.html",{loader:()=>f(()=>import("./微信底层解析.html-DLEVaEax.js"),__vite__mapDeps([105,1])),meta:{author:"chiichen",date:17087328e5,category:["笔记","微信"],tag:["微信","客户端"],sticky:!0,isOriginal:!0,readingTime:{minutes:.45,words:136},title:"微信底层解析",icon:"page",order:1,type:"article"}}],["/notes/College-Physics/Formula-Derivation/Electrostatic-energy-of-a-solid-charged-sphere.html",{loader:()=>f(()=>import("./Electrostatic-energy-of-a-solid-charged-sphere.html-BAnUstYA.js"),__vite__mapDeps([106,1])),meta:{author:"chiichen",date:16776288e5,category:["课程笔记"],tag:["计算机网络"],sticky:!1,isOriginal:!0,excerpt:`
1594<p>考虑一个半径为 ( a ) 的均匀带电球体,总电荷量为 ( Q )。我们需要计算这个球体的静电能。</p>
1595<h2>1. 电场</h2>
1596<p>根据高斯定律,球体内外的电场分别为:</p>
1597<p></p>
1598<p>其中,() 是电荷密度。</p>
1599<h2>2. 球内电势</h2>
1600<p>球内任意点 (  ) 处的电势 () 可以通过积分电场得到:</p>
1601<p>对于 (  ) 的情况:</p>
1602<p>计算积分:</p>
1603<h2>3. 静电能</h2>
1604<p>静电能 (  ) 为电荷密度和电势的乘积在整个球体体积上的积分:</p>
1605<p>计算积分:</p>
1606<p>因此:</p>
1607<p>将 () 代入:</p>`,readingTime:{minutes:2.21,words:663},title:"实心带电球体静电能的推导",icon:"page",order:1,type:"article"}}],["/notes/College-Physics/Formula-Derivation/",{loader:()=>f(()=>import("./index.html-DTX_nWsL.js"),__vite__mapDeps([107,1])),meta:{date:1714837884e3,readingTime:{minutes:.03,words:9},title:"推导过程",icon:"lightbulb",type:"article"}}],["/posts/Linux%E5%86%85%E6%A0%B8/Patch%E8%A7%A3%E8%AF%BB/LWN%E9%92%88%E5%AF%B9%E5%A4%9A%E5%B1%82%E5%86%85%E5%AD%98%E7%B3%BB%E7%BB%9F%E9%87%8D%E6%96%B0%E8%BF%9B%E8%A1%8CNUMA%E5%B9%B3%E8%A1%A1.html",{loader:()=>f(()=>import("./LWN针对多层内存系统重新进行NUMA平衡.html-B3xNoTfT.js"),__vite__mapDeps([108,1])),meta:{author:"chiichen",date:1698624e6,category:["笔记","Linux 内核"],tag:["Linux 内核","内存管理","NUMA"],sticky:!1,excerpt:`<h2>参考</h2>
1608<p>转载自 <a href="https://mp.weixin.qq.com/s?__biz=Mzg2MjE0NDE5OA==&amp;mid=2247486608&amp;idx=1&amp;sn=51eb34edabfbcc6f730dd9c0efb1c0c6&amp;chksm=ce0d1f39f97a962f20b3501bdbc6684ba043b88f924ba8db52aa77710b91899d7a2e069c0d95&amp;scene=126&amp;&amp;sessionid=0" target="_blank" rel="noopener noreferrer">LWN:针对多层内存系统重新进行 NUMA 平衡!</a>,作者为公众号:Linux News 搬运工,原文创作时间为 2022-05-17</p>`,readingTime:{minutes:9.37,words:2810},title:"LWN:针对多层内存系统重新进行NUMA平衡",icon:"page",order:1,type:"article"}}],["/posts/Linux%E5%86%85%E6%A0%B8/%E5%86%85%E6%A0%B8%E5%88%86%E6%9E%90/LinuxKernelMap.html",{loader:()=>f(()=>import("./LinuxKernelMap.html-DBz3k1as.js"),__vite__mapDeps([109,1])),meta:{author:"chiichen",date:16981056e5,category:["笔记","Linux 内核"],tag:["Linux 内核"],sticky:!0,excerpt:`<p>转载自<a href="https://github.com/makelinux/linux_kernel_map" target="_blank" rel="noopener noreferrer">github.com/makelinux/linux_kernel_map</a></p>
1609<figure><figcaption>Linux Kernel Map</figcaption></figure>
1610`,readingTime:{minutes:.23,words:69},title:"Linux Kernel Map",icon:"page",order:1,type:"article"}}],["/posts/Linux%E5%86%85%E6%A0%B8/%E5%86%85%E6%A0%B8%E5%BC%80%E5%8F%91/Ubuntu%E7%BC%96%E8%AF%91%E5%AE%89%E8%A3%85%E5%86%85%E6%A0%B8.html",{loader:()=>f(()=>import("./Ubuntu编译安装内核.html-DWJni9H0.js"),__vite__mapDeps([110,1])),meta:{author:"chiichen",date:17000064e5,category:["Linux内核"],tag:["Linux内核"],sticky:!1,excerpt:`<h2>下载目标内核代码</h2>
1611<p>略</p>
1612<h2>安装依赖</h2>
1613<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> apt</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> gdb</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> bison</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> m4</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> autoconf</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> automake</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> libtool</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> libncurses5-dev</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> build-essential</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> fakeroot</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> debhelper</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">
1613 libelf-dev</span></span></code></pre>
1614<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div>`,readingTime:{minutes:2.87,words:860},title:"Ubuntu编译安装内核",icon:"page",order:1,type:"article"}}],["/posts/%E6%9D%82%E8%B0%88/Debug%E6%9D%82%E8%B0%88/SurfaceView%E5%BC%82%E5%B8%B8%E9%87%8A%E6%94%BE.html",{loader:()=>f(()=>import("./SurfaceView异常释放.html-D3pSHZn_.js"),__vite__mapDeps([111,1])),meta:{author:"chiichen",date:17121024e5,category:["杂谈","Debug杂谈"],tag:["Android"],sticky:!1,excerpt:`<h2>背景</h2>
1615<p>最近在研究通过 Rust 进行 Android Native 渲染的相关内容,基本方法是,在 Android 里创建一个 Surface View,然后在 OnSurfaceCreated 方法处,将一个 SurfaceHolder 通过 JNI 传到 Rust 层,获取 ANativeWindow 指针,同时搭配<code>raw_window_handler</code>和<code>wgpu</code>进行渲染。当然这里还有很多细节,例如 Rust 侧事件循环的设计等等,后续有时间可以单独出一篇特辑。</p>
1616<h2>Bug 出现</h2>
1617<p>Bug 的出现首先要从 Andoird 的刷新原理开始讲起(无特别说明,以下部分的安卓版本均为测试机版本——Android 12)</p>`,readingTime:{minutes:2.26,words:677},title:"Surface View 异常释放引起的 Segv Fault",icon:"page",order:1,type:"article"}}],["/posts/%E6%9D%82%E8%B0%88/Debug%E6%9D%82%E8%B0%88/could%20not%20dial%20endpoint%20'orderer-api.127-0-0-1.nip.io.html",{loader:()=>f(()=>import("./could not dial endpoint 'orderer-api.127-0-0-1.nip.io.html-B9S6p0tU.js"),__vite__mapDeps([112,1])),meta:{author:"chiichen",date:16975872e5,category:["杂谈","Debug杂谈","网络问题"],tag:["Debug","网络问题"],sticky:!1,excerpt:`<h2><a class="header-anchor" href="#could-not-dial-endpoint-orderer-api-127-0-0-1-nip-io-8080"><span>could not dial endpoint '</span></a><a href="http://orderer-api.127-0-0-1.nip.io:8080" target="_blank" rel="noopener noreferrer">orderer-api.127-0-0-1.nip.io:8080</a>'</h2>
1618<p>今天完成区块链实验的时候,在用 <code>IBM-BlockChain-Platform</code> vscode 插件完成实验内容的时候,在部署服务到 <code>Local Docker</code> 时出现了如下错误</p>`,readingTime:{minutes:1.93,words:580},title:"could not dial endpoint 'orderer-api.127-0-0-1.nip.io:8080' 问题解决",icon:"page",order:1,type:"article"}}],["/posts/%E6%9D%82%E8%B0%88/Debug%E6%9D%82%E8%B0%88/edition%E8%AE%BE%E7%BD%AE%E5%BC%95%E8%B5%B7%E7%9A%84rust%E7%BC%96%E8%AF%91%E5%99%A8%E6%8A%A5%E9%94%99.html",{loader:()=>f(()=>import("./edition设置引起的rust编译器报错.html-DCyO_3UL.js"),__vite__mapDeps([113,1])),meta:{author:"chiichen",date:17000064e5,category:["杂谈","Debug杂谈","Rust"],tag:["Rust"],sticky:!1,excerpt:`<h2>背景</h2>
1619<p>交流过程可见于 <a href="https://github.com/zesterer/chumsky/discussions/564" target="_blank" rel="noopener noreferrer">Github Discussions</a>。起因是我在学习 rust 的一个 PEG(Parser Expression Generator)库来实现编译器的时候,看到了这段示例代码 <a href="https://github.com/zesterer/chumsky/blob/main/examples/nano_rust.rs" target="_blank" rel="noopener noreferrer">nano_rs</a>,当我把它复制进我的项目中时发生了报错</p>`,readingTime:{minutes:1.7,words:511}
1619,title:"Edition 设置引起的一个 Rust 编译器报错",icon:"page",order:1,type:"article"}}],["/posts/%E6%9D%82%E8%B0%88/Debug%E6%9D%82%E8%B0%88/%E8%A7%A3%E5%86%B3MacOS%E4%B8%AD%E6%89%BE%E4%B8%8D%E5%88%B0%E5%A4%B4%E6%96%87%E4%BB%B6%E7%9A%84%E9%97%AE%E9%A2%98.html",{loader:()=>f(()=>import("./解决MacOS中找不到头文件的问题.html-BuSu4aDl.js"),__vite__mapDeps([114,1])),meta:{author:"chiichen",date:17091648e5,category:["杂谈","Debug杂谈"],tag:["MacOS","Debug"],sticky:!1,excerpt:`<h2>背景</h2>
1620<p>在交叉编译 LVGL 的时候一直出现找不到头文件的问题,但是 Intellisense 却又能定位到头文件位置</p>
1621<h2>解决方法</h2>
1622<p>因为 MacOS 中的头文件不在<code>usr/include</code>等目录下,而是在<code>/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/</code>目录下,创建这个软连接后就解决了问题</p>
1623<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> ln</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -s</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">*</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> /usr/local/include/</span></span></code></pre>
1624<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div>`,readingTime:{minutes:.44,words:132},title:"解决MacOS中找不到头文件的问题",icon:"page",order:1,type:"article"}}],["/posts/%E6%9D%82%E8%B0%88/Debug%E6%9D%82%E8%B0%88/%E8%AE%B0%E4%B8%80%E6%AC%A1%20GP%20Debug%20%E7%9A%84%E5%BF%83%E8%B7%AF%E5%8E%86%E7%A8%8B.html",{loader:()=>f(()=>import("./记一次 GP Debug 的心路历程.html-DKgY-2V3.js"),__vite__mapDeps([115,1])),meta:{author:"chiichen",date:16976736e5,category:["杂谈","Debug杂谈"],tag:["General Protection","Debug"],sticky:!1,excerpt:`<h2>背景</h2>
1625<p>背景是在重构完 Signal 之后,一开始用我们自己的 libc 测试 signal 功能没有问题,但是在用 relibc 测试的时候出问题了,出错的原因就是一个 Userland 的 General Protection(GP),这个东西是一个硬件异常,通常是由于汇编指令出错或者内存访问出错导致,比如把一个未对齐的内存地址作为某个指令的操作数,而这个指令要求这个内存地址是 8/16 对齐的。</p>
1626<h2>初步分析</h2>
1627<p>在查看 GP 的 RIP ,反汇编了用户空间的测试程序之后,看到了对应的汇编代码是</p>
1628<div class="language-x86asm line-numbers-mode" data-highlighter="shiki" data-ext="x86asm" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-x86asm"><span class="line"><span>movapd %XMM0 0xe0(rsp)</span></span></code></pre>
1629<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div>`,readingTime:{minutes:6.71,words:2014},title:"记一次 GP Debug 的心路历程",icon:"page",order:1,type:"article"}}],["/posts/%E6%9D%82%E8%B0%88/%E7%BC%96%E7%A8%8B%E6%9D%82%E8%B0%88/Github%E4%B8%AD%E9%85%8D%E7%BD%AECargo%E9%A1%B9%E7%9B%AE%E7%9A%84Workflow.html",{loader:()=>f(()=>import("./Github中配置Cargo项目的Workflow.html-Bp1r6YZC.js"),__vite__mapDeps([116,1])),meta:{author:"chiichen",date:16993152e5,category:["杂谈","编程杂谈"],tag:["Github Workflow"],sticky:!1,excerpt:`<h2>项目背景</h2>
1630<p><a href="https://github.com/RccCommunity/rcc" target="_blank" rel="noopener noreferrer">rcc 编译器</a></p>
1631<h2>示例</h2>
1632<div class="language-yml line-numbers-mode" data-highlighter="shiki" data-ext="yml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-yml"><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">name</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">Rust</span></span>
1633<span class="line"></span>
1634<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">on</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: [</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">push</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">pull_request</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]</span></span>
1635<span class="line"></span>
1636<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">
1636env</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
1637<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  CARGO_TERM_COLOR</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">always</span></span>
1638<span class="line"></span>
1639<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">jobs</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
1640<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  check</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
1641<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    runs-on</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">ubuntu-latest</span></span>
1642<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    steps</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
1643<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      - </span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">name</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">Check out</span></span>
1644<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        uses</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">actions/checkout@v3</span></span>
1645<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      - </span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">name</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">Set up cargo cache</span></span>
1646<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        uses</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">actions/cache@v3</span></span>
1647<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        with</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
1648<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">          path</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span>
1649<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">            ./target</span></span>
1650<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">            ~/.cargo</span></span>
1651<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">          key</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">debug-\${{ runner.os }}-\${{ hashFiles('rust-toolchain.toml') }}-\${{ hashFiles('Cargo.lock') }}</span></span>
1652<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">          restore-keys</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span>
1653<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">            debug-\${{ runner.os }}-\${{ hashFiles('rust-toolchain.toml') }}-</span></span>
1654<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">            debug-\${{ runner.os }}-</span></span>
1655<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      - </span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">name</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">Install Rust</span></span>
1656<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        uses</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">actions-rs/toolchain@v1</span></span>
1657<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        with</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
1658<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">          profile</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">minimal</span></span>
1659<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">          toolchain</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">nightly</span></span>
1660<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">
1660          override</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">true</span></span>
1661<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">          components</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">rustfmt, clippy</span></span>
1662<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      - </span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">name</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">Lint</span></span>
1663<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        run</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span>
1664<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">          cargo fmt --all -- --check</span></span>
1665<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">          cargo clippy -- -D warnings</span></span>
1666<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      - </span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">name</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">Install cargo check tools</span></span>
1667<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        run</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span>
1668<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">          cargo install --locked cargo-deny || true</span></span>
1669<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">          cargo install --locked cargo-outdated || true</span></span>
1670<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">          cargo install --locked cargo-udeps || true</span></span>
1671<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">          cargo install --locked cargo-audit || true</span></span>
1672<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">          cargo install --locked cargo-pants || true</span></span>
1673<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      - </span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">name</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">Rustfmt</span></span>
1674<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        run</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">cargo fmt --all -- --check</span></span>
1675<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      - </span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">name</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">Check</span></span>
1676<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        run</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|</span></span>
1677<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">          cargo deny check</span></span>
1678<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">          cargo outdated</span></span>
1679<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">          cargo udeps</span></span>
1680<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">          rm -rf ~/.cargo/advisory-db</span></span>
1681<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">          cargo audit</span></span>
1682<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">          cargo pants</span></span>
1683<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      - </span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">name</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">Test</span></span>
1684<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        run</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">cargo test</span></span>
1685<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      - </span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">name</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">Build</span></span>
1686<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        run</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">cargo build --verbose</span></span></code></pre>
1687<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>`,readingTime:{minutes:.83,words:250},title:"Github 中配置 Cargo 项目的 Workflow",icon:"page",order:1,type:"article"}}],["/posts/%E6%9D%82%E8%B0%88/%E7%BC%96%E7%A8%8B%E6%9D%82%E8%B0%88/%E5%9F%BA%E4%BA%8ENinja%E7%9A%84%E4%BB%A3%E7%A0%81Intellisense%E5%AE%9E%E8%B7%B5.html",{loader:()=>f(()=>import("./基于Ninja的代码Intellisense实践.html-RaPkYtGB.js"),__vite__mapDeps([117,1])),meta:{author:"chiichen",date:17089056e5,category:["杂谈"],tag:["杂谈/编程杂谈"],sticky:!1,isOriginal:!0,excerpt:`<h2>插件安装</h2>
1688<p>在 VSCode 中安装 clangd 作为前端,要记得关闭 C/C++的 Intellisense</p>
1689<h2>生成 compile_commands.json</h2>
1690<p>在 Ninja 输出目录,以<code>out</code>为例,执行</p>
1691<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">ninja</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -C</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> out</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -t</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">
1691  compdb</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> cxx</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> cc</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> &gt; </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">compile_commands.json</span></span></code></pre>
1692<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div>`,readingTime:{minutes:.37,words:112},title:"基于Ninja的代码Intellisense实践",icon:"page",order:1,type:"article"}}],["/posts/%E6%9D%82%E8%B0%88/%E7%BC%96%E7%A8%8B%E6%9D%82%E8%B0%88/%E8%A7%A3%E5%86%B3%E5%9C%A8VSCode%E9%87%8C%E5%88%B7Leetcode%E7%9A%84%E9%87%8D%E5%AE%9A%E4%B9%89%E9%97%AE%E9%A2%98.html",{loader:()=>f(()=>import("./解决在VSCode里刷Leetcode的重定义问题.html-Pu1uauDE.js"),__vite__mapDeps([118,1])),meta:{author:"chiichen",date:17063136e5,category:["杂谈"],tag:["杂谈/编程杂谈"],sticky:!1,isOriginal:!0,excerpt:`<h2>背景</h2>
1693<p>最近刷了几道 Leetcode,感觉没有补全写得太不舒服了,所以用 Leetcode 官方插件搭配 VSCode 写,用 xmake 构建,用 clangd 提供代码补全,写起来体验很好,但是还是有一个小问题</p>
1694<h2>问题</h2>
1695<p>比如以下默认代码</p>
1696<div class="language-cpp line-numbers-mode" data-highlighter="shiki" data-ext="cpp" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-cpp"><span class="line"></span>
1697<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// Definition for a binary tree node.</span></span>
1698<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// struct TreeNode {</span></span>
1699<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">//   int val;</span></span>
1700<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">//   TreeNode *left;</span></span>
1701<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">//   TreeNode *right;</span></span>
1702<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">//   TreeNode() : val(0), left(nullptr), right(nullptr) {}</span></span>
1703<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">//   TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}</span></span>
1704<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">//   TreeNode(int x, TreeNode *left, TreeNode *right)</span></span>
1705<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">//       : val(x), left(left), right(right) {}</span></span>
1706<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// };</span></span>
1707<span class="line"></span>
1708<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B"> Solution</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span></span>
1709<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">public:</span></span>
1710<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">  bool</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> isValidBST</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B">
1710TreeNode</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> *</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">root</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) {}</span></span>
1711<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">};</span></span></code></pre>
1712<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>`,readingTime:{minutes:1.41,words:423},title:"解决在VSCode里刷Leetcode的重定义问题",icon:"page",order:1,type:"article"}}],["/posts/%E6%9D%82%E8%B0%88/%E7%BC%96%E7%A8%8B%E6%9D%82%E8%B0%88/%E9%9C%87%E6%83%8A!1%E7%AD%89%E4%BA%8E0.html",{loader:()=>f(()=>import("./震惊!1等于0.html-BTaJn2kQ.js"),__vite__mapDeps([119,1])),meta:{author:"chiichen",date:16974144e5,category:["杂谈"],tag:["杂谈/编程杂谈"],sticky:!1,isOriginal:!0,excerpt:`<h2>事情的起因</h2>
1713<p>起因是我正在 DragonOS 写 Signal 相关的代码,然后 Page fault 了,经过一系列排查之后,发现 RIP 寄存器的值好像不太对,把内核反编译之后发现确实不对,它没指向任何一个函数入口。到这一步,很自然的想法是栈损坏了,或者某些原因导致了 Dirty bit。这里先提一嘴,就是 DragonOS 里中断栈帧的 RIP 是 <code>u64</code>,而 Signal 中的函数指针是 <code>c_void</code>。后者在 rust 中打日志的时候会被格式化成十六进制。</p>
1714<h2>扑朔迷离</h2>
1715<p>后面我就想怎么回事呢,这个值不对。它是怎么个不对法呢,就是有如下代码,就是很简单的打日志</p>`,readingTime:{minutes:2.18,words:654},title:"震惊,1=0",icon:"page",order:1,type:"article"}}],["/posts/%E6%9D%82%E8%B0%88/%E7%BC%96%E7%A8%8B%E6%9D%82%E8%B0%88/%E9%AB%98%E7%BA%A7%E8%AF%AD%E8%A8%80%E7%9A%84%E7%BC%96%E8%AF%91-%E9%93%BE%E6%8E%A5%E5%8F%8A%E8%A3%85%E8%BD%BD%E8%BF%87%E7%A8%8B%E4%BB%8B%E7%BB%8D.html",{loader:()=>f(()=>import("./高级语言的编译-链接及装载过程介绍.html-BBVdeFB2.js"),__vite__mapDeps([120,1])),meta:{author:"chiichen",date:16974144e5,category:["杂谈"],tag:["杂谈/编程杂谈"],sticky:!1,excerpt:`<h2>转载</h2>
1716<p>转载自<a href="https://tech.meituan.com/2015/01/22/linker.html" target="_blank" rel="noopener noreferrer">美团技术团队</a></p>
1717<h2>引言</h2>
1718<p>随着越来越多功能强大的高级语言的出现,在服务器计算能力不是瓶颈的条件下,很多同学会选择开发效率高,功能强大的虚拟机支持的高级语言(Java),或者脚本语言(Python,Php)作为实现功能的首选,而不会选择开发效率低,而运行效率高的 C/C++ 作为开发语言。而这些语言一般情况下是运行在虚拟机或者解释器中,而不需要直接跟操作系统直接打交道。</p>`,readingTime:{minutes:29.97,words:8992},title:"高级语言的编译:链接及装载过程介绍",icon:"page",order:1,type:"article"}}],["/posts/%E6%9D%82%E8%B0%88/%E9%9D%A2%E7%BB%8F/%E8%85%BE%E8%AE%AFWXG%E6%97%A5%E5%B8%B8%E5%AE%9E%E4%B9%A0%E9%9D%A2%E7%BB%8F.html",{loader:()=>f(()=>import("./腾讯WXG日常实习面经.html-t4L0aPqW.js"),__vite__mapDeps([121,1])),meta:{author:"chiichen",date:17066592e5,category:["面经"],tag:["面经"],sticky:!1,isOriginal:!0,excerpt:`<h2>结果</h2>
1719<p>2024-01-30 一面<br>
17202024-01-31 二面<br>
17212024-02-02 主管面<br>
17222024-02-04 HR 面<br>
17232024-02-05 OC</p>
1724<h2>背景</h2>
1725<p>2024-01-20 左右投的简历,一开始投的是 C++后台开发 WXG——公众号与小程序 。2024-01-27, WXG 小程序客户端的面试官问我对这个方向感不感兴趣,我说还挺感兴趣的,然后约了一面 30 号下午,面试官说希望面试紧凑一点,面试顺利的话争取在年前(2024-02-10)发 offer。</p>
1726<p>项目主要一个是 DragonOS 操作系统内核,另一个是低代码平台。</p>`,readingTime:{minutes:7.75,words:2324},title:"腾讯WXG日常实习面经",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/UML/UML%E5%A4%8D%E4%B9%A0%E7%AE%80%E8%AE%B0.html",{loader:()=>f(()=>import("./UML复习简记.html-C7U9xO5g.js"),__vite__mapDeps([122,1])),meta:{author:"chiichen",date:17044992e5,category:["课程笔记"],tag:["UML"],sticky:!1,isOriginal:!0,excerpt:`<h2>第一章</h2>
1727<ul>
1728<li>分析-设计:提出问题-解决问题</li>
1729<li>
1729用例(use case):人们使用应用的情节或者场景</li>
1730<li>领域模型(domain model):不是对软件对象的描述,是对真实世界中的概念的一种可视化,也被称为概念对象模型。</li>
1731<li>顺序图(交互图的一种):用来描述软件对象之间的信息流</li>
1732<li>设计类图(design class deagram):表述软件类,缩小代码和领域模型之间的差距,被称为低表示差距(lower representational gap)</li>
1733<li>UML 的三种应用方法:草图、蓝图(逆向工程:代码可视化,便于理解;前向工程:指导代码生成)、编程语言</li>
1734<li>敏捷建模(agile modeling)强调了把 UML 作为草图的方式</li>
1735<li>UML 的三种透视图:概念透视图(描述现实世界中的事务),规格说明软件透视图(描述软件的接口等信息,但是不约定特定实现),实现透视图(描述在指定技术例如 java 中的实现)</li>
1736<li>相对应的,在这三种图中的 UML 类被分别称为概念类(conceptual class)、软件类和实现类</li>
1737</ul>`,readingTime:{minutes:26.8,words:8041},title:"UML复习简记",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E5%A4%A7%E7%89%A9/%E7%94%B5%E7%A3%81%E5%AD%A6%E5%85%AC%E5%BC%8F.html",{loader:()=>f(()=>import("./电磁学公式.html-7ziO2EOh.js"),__vite__mapDeps([123,1])),meta:{author:"chiichen",date:1698624e6,category:["课程笔记"],tag:["大学物理"],sticky:!1,isOriginal:!0,excerpt:`<h2>14 章——静电场</h2>
1738<h3>1.库仑定律</h3>
1739<h3>2.经典模型的电场强度</h3>
1740<h4>电偶极子的电场强度</h4>
1741<ul>
1742<li>外电场对电偶极子的力矩和取向作用</li>
1743</ul>
1744<h4>细棒的电场强度</h4>
1745<h4>圆环的电场强度</h4>
1746<h4>圆盘的电场强度</h4>
1747<h3>3.高斯定理</h3>
1748<ul>
1749<li>在真空中,通过任意闭合曲面的电场强度通量等于该曲面所包围的所有电荷的代数和除以</li>
1750</ul>
1751<h4>计算场强的方法:</h4>
1752<ol>
1753<li>根据叠加原理通过积分求各部分产生的电场强度之和</li>
1754<li>利用高斯定理(主要解决电场强度均匀分布或者具有对称性的问题)</li>
1755<li>由计算</li>
1756</ol>`,readingTime:{minutes:5.25,words:1574},title:"电磁学公式",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/Chapter1-Introdction.html",{loader:()=>f(()=>import("./Chapter1-Introdction.html-B__qhFlX.js"),__vite__mapDeps([124,1])),meta:{author:"chiichen",date:16793568e5,category:["课程笔记"],tag:["操作系统"],sticky:!1,isOriginal:!0,excerpt:`<h2>目录</h2>
1757<ol>
1758<li>什么是操作系统</li>
1759<li>操作系统的历史</li>
1760<li>操作系统硬件</li>
1761<li>操作系统 zoo</li>
1762<li>操作系统概念</li>
1763<li>系统调用</li>
1764<li>操作系统结构</li>
1765</ol>
1766<h2>什么是操作系统</h2>
1767<ul>
1768<li>操作系统的位置</li>
1769</ul>
1770<!-- ![操作系统的位置](<images/Chapter1-Introdction/操作系统的位置>) -->
1771<h3>操作系统的功能</h3>
1772<ul>
1773<li>自上而下:虚拟机,扩展机(extended machine),隐藏底层复杂丑陋的接口,给用户简洁,高效的接口</li>
1774<li>自下而上:资源管理器(resource manager),允许多个程序同时运行(多进程),调度资源以实现时间、空间上的复用。管理、保护内存安全,管理 I/O 设备</li>
1775</ul>`,readingTime:{minutes:7.96,words:2389},title:"Chapter1 Introdction",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/Chapter2-Processes-and-Threads.html",{loader:()=>f(()=>import("./Chapter2-Processes-and-Threads.html-DRJhN5_I.js"),__vite__mapDeps([125,1])),meta:{author:"chiichen",date:168048e7,category:["课程笔记"],tag:["操作系统"],sticky:!1,isOriginal:!0,excerpt:`<h2>进程</h2>
1776<ul>
1777<li>顺序执行:单道程序系统中,一个具有独立功能的程序独占处理器直到最终结束的过程称为程序的顺序执行</li>
1778<li>顺序性:程序的结构是顺序执行的(可能有 switch 或者 loop)</li>
1779<li>封闭性:独占所有资源</li>
1780<li>可重复性:初始状态相同,运行多少次结果都相同</li>
1781<li>并发执行:所有上述特性都没有</li>
1782<li>为了描述并发的行为,引入了进程的概念</li>
1783</ul>
1784<h3>进程模型</h3>
1785<ul>
1786<li>在进程的模型中,所有可运行软件都被以进程的集合组成起来</li>
1787</ul>
1788<h3>进程概念</h3>`,readingTime:{minutes:21.42,words:6425},title:"Chapter2 Processes and Threads",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/Chapter3-Memory-Management.html",{loader:()=>f(()=>import("./Chapter3-Memory-Management.html-C2yO3c8r.js"),__vite__mapDeps([126,1])),meta:{author:"chiichen",date:16831584e5,category:["课程笔记"],tag:["操作系统"],sticky:!1,isOriginal:!0,excerpt:`<h2>No Memory Abstraction</h2>
1789<ul>
1790<li>所有程序必须硬编码硬件物理地址<br>
1791内存中不可能同时运行两个应用(也可以用方法实现同时存放 IB
1791M360)</li>
1792</ul>
1793<h3>静态重定位(Static reloacation)</h3>
1794<ul>
1795<li>在进程加载到内存中的时候就映射到一个指定的物理地址上</li>
1796<li>优点是不需要硬件支持</li>
1797<li>缺点是会减慢加载的速度,而且加载后不再能在内存中移动位置,除非再进行一次重定位,而且加载器需要用某种方式显式地声明哪个是地址,哪个是常量</li>
1798</ul>
1799<h2>Address Space</h2>`,readingTime:{minutes:14.87,words:4460},title:"Chapter3 Memory Management",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/Chapter4-File-System.html",{loader:()=>f(()=>import("./Chapter4-File-System.html-BTI51gel.js"),__vite__mapDeps([127,1])),meta:{author:"chiichen",date:16847136e5,category:["课程笔记"],tag:["操作系统"],sticky:!1,isOriginal:!0,excerpt:`<h2>文件(Files)</h2>
1800<h3>目录</h3>
1801<ul>
1802<li>目录也是一个文件</li>
1803<li>目录保存了文件名和文件存储位置的对应关系</li>
1804</ul>
1805<h3>文件名</h3>
1806<ul>
1807<li>由有效名(Valid name)和扩展名(Extension)组成</li>
1808<li>至多 255 个字符</li>
1809<li>支持数字、字母、特殊字符,例如不支持冒号,因为冒号在 windows 系统中是路径分隔符</li>
1810<li>Windows 不区分大小写,linux 区分</li>
1811</ul>
1812<h3>文件结构</h3>
1813<ol>
1814<li>字、字节序列</li>
1815<li>简单的记录结构:线性,定长</li>
1816<li>复杂的结构:
1817<ul>
1818<li>记录树<br>
1819</li>
1820</ul>
1821</li>
1822</ol>`,readingTime:{minutes:10.92,words:3276},title:"Chapter4 File System",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/Chapter5-IO.html",{loader:()=>f(()=>import("./Chapter5-IO.html-BeL5vIwd.js"),__vite__mapDeps([128,1])),meta:{author:"chiichen",date:16860096e5,category:["课程笔记"],tag:["操作系统"],sticky:!1,isOriginal:!0,excerpt:`<h2>I/O 硬件</h2>
1823<h3>I/O 设备</h3>
1824<ul>
1825<li>块设备:把信息存储在定长的块中,每个块都有自己的地址。块的大小从 512B 到 32KB 不等。可以独立读写每个块。例如:硬盘,U 盘等</li>
1826<li>字符设备:发送或者接收一个字符序列,不可寻址,也没有 seek 操作。例如:打印机、网卡、鼠标等。</li>
1827</ul>
1828<h3>设备控制器</h3>
1829<ul>
1830<li>有的是集成在主板上,有的是从外部插入的。例如 PCIe 插槽中的插入部件。通常就是设备控制器(controller)或者叫做设备适配器(adapter)</li>
1831</ul>
1832<figure><figcaption>io硬件控制器.png</figcaption></figure>`,readingTime:{minutes:9.44,words:2832},title:"Chapter5 IO",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/Chapter6-Deadlocks.html",{loader:()=>f(()=>import("./Chapter6-Deadlocks.html-TQLDNWF4.js"),__vite__mapDeps([129,1])),meta:{author:"chiichen",date:16822944e5,category:["课程笔记"],tag:["操作系统"],sticky:!1,isOriginal:!0,excerpt:`<h2>资源</h2>
1833<h3>分类</h3>
1834<ul>
1835<li>可抢占式(preemptable)资源:可以被从一个进程中拿走而不带来负面影响(例如 CPU、内存)。</li>
1836<li>不可抢占式(Nonpreemptable)资源:会导致进程失败如果被拿走(例如 CD 刻录机)。</li>
1837</ul>
1838<h3>资源的取用</h3>
1839<ul>
1840<li>每个进程会按以下步骤利用资源:</li>
1841</ul>
1842<ol>
1843<li>请求资源</li>
1844<li>使用资源</li>
1845<li>释放资源</li>
1846</ol>
1847<ul>
1848<li>如果请求资源被拒绝就一定要等待,请求资源的进程阻塞,可能会因此 fail with error code</li>
1849</ul>`,readingTime:{minutes:8.37,words:2512},title:"Chapter6 Deadlocks",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E5%BA%93/Chapter1%20Introduction.html",{loader:()=>f(()=>import("./Chapter1 Introduction.html-BGLjWyB0.js"),__vite__mapDeps([130,1])),meta:{author:"chiichen",date:1698624e6,category:["课程笔记"],tag:["数据库"],sticky:!1,isOriginal:!0,excerpt:`<h2>Database Management System (DBMS)</h2>
1850<ul>
1851<li>DBMS 包括:
1852<ol>
1853<li>相关数据的集合</li>
1854<li>访问数据的程序集</li>
1855<li>一个既方便又高效的使用环境</li>
1856</ol>
1857</li>
1858</ul>
1859<h2>文件系统存储数据的缺点</h2>
1860<ul>
1861<li>
1862<p>数据冗余和不一致:多种文件格式,不同文件中的信息重复</p>
1863</li>
1864<li>
1865<p>访问数据困难:需要编写新程序来执行每项新任务</p>
1866</li>
1867<li>
1868<p>数据隔离——多个文件和格式</p>
1869</li>
1870<li>
1871<p>完整性问题 :</p>
1872<ul>
1873<li>完整性约束(例如,帐户余额 &gt; 0)被“隐藏”在程序代码中,而不是明确声明</li>
1874<li>很难添加新的约束或更改现有的约束</li>
1875</ul>
1876</li>
1877<li>
1878<p>更新的原子性</p>
1879<ul>
1880<li>故障可能会使数据库处于与执行的部分更新不一致的状态</li>
1881<li>示例:资金从一个账户转移到另一个账户要么完成,要么根本不发生</li>
1882</ul>
1883</li>
1884<li>
1885<p>多用户并发访问</p>
1886<ul>
1887<li>并发访问以提高性能</li>
1888<li>不受控制的并发访问可能会导致不一致</li>
1889<li>示例:两个人同时读取余额(例如 100)并通过提款(例如每人 50)来更新余额</li>
1890</ul>
1891</li>
1892<li>
1893<p>安全问题 难以向用户提供对部分(但不是全部)数据的访问权限</p>
1894</li>
1895</ul>`,readingTime:{minutes:5.23,words:1569},title:"Chapter1 Introduction",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E5%BA%93/Chapter10%20Storage%20and%20File%20Structure.html",{loader:()=>f(()=>import("./Chapter10 Storage and File Structure.html-C4zoWWkk.js"),__vite__mapDeps([131,1])),meta:{author:"chiichen",date:17038944e5,category:["课程笔记"],tag:["数据库"],sticky:!1,isOriginal:!0,excerpt:`<h2>物理存储媒介(Physical Storage Media)</h2>
1896<ul>
1897<li>磁盘
1898<ul>
1899<li>1 block = 多个连续的 sector</li>
1900<li>1 个文件(哈希文件除外)= 多个连续的 block</li>
1901</ul>
1902</li>
1903<li>
1903磁头与磁盘
1904<ul>
1905<li>磁头往磁盘读写数据的最小单位是 sector</li>
1906</ul>
1907</li>
1908<li>内存与磁盘
1909<ul>
1910<li>内存与磁盘交换信息的最小单位是 block</li>
1911</ul>
1912</li>
1913<li>开销=寻道时间+ 旋转时间+传输时间</li>
1914<li>数据库只关注:
1915<ul>
1916<li>寻道次数</li>
1917<li>传输磁盘块个数</li>
1918</ul>
1919</li>
1920<li>设访问的磁盘块依次分别是: B1, B2
1921<ul>
1922<li>寻道次数 : 如果 B1, B2 相邻, 则寻道 1 次</li>
1923<li>传输磁盘块的个数: 无论相邻与否, 都是 2.<br>
1924</li>
1925</ul>
1926</li>
1927</ul>`,readingTime:{minutes:4.76,words:1428},title:"Chapter10 Storage and File Structure",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E5%BA%93/Chapter11%20Indexing%20and%20Hashing.html",{loader:()=>f(()=>import("./Chapter11 Indexing and Hashing.html-BuXIkMxb.js"),__vite__mapDeps([132,1])),meta:{author:"chiichen",date:17039808e5,category:["课程笔记"],tag:["数据库"],sticky:!1,isOriginal:!0,excerpt:`<h2>基本概念</h2>
1928<ul>
1929<li>索引机制用于加速对所需数据的访问。例如,图书馆中的作者目录。</li>
1930<li>搜索键(Search Key)是用于在文件中查找记录的一组属性。</li>
1931<li>索引文件由记录(称为索引条目)组成,形式为:</li>
1932</ul>
1933<table>
1934<thead>
1935<tr>
1936<th>search-key</th>
1937<th>pointer</th>
1938</tr>
1939</thead>
1940</table>
1941<ul>
1942<li>索引文件通常比原始文件小得多。</li>
1943<li>基本的两种索引类型:
1944<ul>
1945<li>有序索引(Ordered indices):搜索键按排序顺序存储。</li>
1946<li>哈希索引(Hash indices):使用“哈希函数”,将搜索键均匀分布在“桶”中。</li>
1947</ul>
1948</li>
1949</ul>`,readingTime:{minutes:14.89,words:4466},title:"Chapter11 Indexing and Hashing",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E5%BA%93/Chapter12%20Query%20Processing.html",{loader:()=>f(()=>import("./Chapter12 Query Processing.html-BwshKEqi.js"),__vite__mapDeps([133,1])),meta:{author:"chiichen",date:17039808e5,category:["课程笔记"],tag:["数据库"],sticky:!1,isOriginal:!0,excerpt:`<h2>查询处理的基本步骤</h2>
1950<ol>
1951<li>语法分析与翻译</li>
1952<li>优化</li>
1953<li>执行<br>
1954</li>
1955</ol>
1956<h3>语法分析与翻译</h3>
1957<ul>
1958<li>将查询转换为内部形式,然后将其转换为关系代数。</li>
1959<li>解析器检查语法,验证关系。</li>
1960</ul>
1961<h3>执行</h3>
1962<ul>
1963<li>查询执行引擎接收查询执行计划,执行该计划,并返回查询的结果。</li>
1964</ul>
1965<h3>优化</h3>
1966<ul>
1967<li>关系代数表达式可能有许多等价的表达式。<br>
1968例如,等价于 。</li>
1969<li>每个关系代数操作可以使用多种不同的算法进行执行。相应地,关系代数表达式可以以多种方式进行执行。指定详细执行策略的注释表达式称为<code>执行计划或计算计划(evaluation-plan)</code>。</li>
1970<li>例如,可以使用薪水索引来查找薪水小于 75000 的讲师,或者执行完整的关系扫描并丢弃薪水大于等于 75000 的讲师。</li>
1971<li><code>查询优化(Query Optimization)</code>:在所有等价的执行计划中选择成本最低的计划。</li>
1972<li>成本是使用数据库目录中的统计信息进行估算的。</li>
1973<li>例如,每个关系中的元组数量、元组大小等。</li>
1974</ul>`,readingTime:{minutes:19.39,words:5817},title:"Chapter12 Query Processing",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E5%BA%93/Chapter13%20Query%20Optimization.html",{loader:()=>f(()=>import("./Chapter13 Query Optimization.html-DuMUukBk.js"),__vite__mapDeps([134,1])),meta:{author:"chiichen",date:17039808e5,category:["课程笔记"],tag:["数据库"],sticky:!1,isOriginal:!0,excerpt:`<h2>简介</h2>
1975<ul>
1976<li>优化给定查询的方法:
1977<ul>
1978<li>等价表达式(整体优化)</li>
1979<li>对每个操作的不同算法(局部优化)</li>
1980</ul>
1981</li>
1982<li>执行计划(evaluation plan)定义了每个操作要用什么算法完成以及如何协调操作的执行</li>
1983<li>查询的不同评估计划之间的成本差异可能是巨大的。例如,在某些情况下可能是秒级别与天级别的差异。</li>
1984<li>基于成本的查询优化的步骤如下:
1985<ol>
1986<li>使用等价规则生成逻辑上等价的表达式。</li>
1987<li>
1987对生成的表达式进行注释,以获取备选的查询计划。</li>
1988<li>根据估计的成本选择最便宜的计划。</li>
1989</ol>
1990</li>
1991<li>计划成本的估算基于以下因素:
1992<ul>
1993<li>关系的统计信息,例如元组数量,属性的不同值数量等。</li>
1994<li>中间结果的统计估计,用于计算复杂表达式的成本。</li>
1995<li>使用统计数据计算的算法的成本公式。</li>
1996</ul>
1997</li>
1998</ul>`,readingTime:{minutes:4.6,words:1381},title:"Chapter13 Query Optimization",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E5%BA%93/Chapter14%20Transactions.html",{loader:()=>f(()=>import("./Chapter14 Transactions.html-DyNZsLXI.js"),__vite__mapDeps([135,1])),meta:{author:"chiichen",date:17039808e5,category:["课程笔记"],tag:["数据库"],sticky:!1,isOriginal:!0,excerpt:`<h2>简介</h2>
1999<ul>
2000<li><code>事务(Transaction)</code>是程序执行的一个单位,它访问并可能更新各种数据项。</li>
2001<li>例如,从账户 A 转账 50 美元到账户 B 的事务:
2002<ol>
2003<li>读取(A)</li>
2004<li>A := A - 50</li>
2005<li>写入(A)</li>
2006<li>读取(B)</li>
2007<li>B := B + 50</li>
2008<li>写入(B)</li>
2009</ol>
2010</li>
2011<li>处理的两个主要问题是:
2012<ul>
2013<li>各种类型的故障,如硬件故障和系统崩溃。</li>
2014<li>多个事务的并发执行。</li>
2015</ul>
2016</li>
2017</ul>`,readingTime:{minutes:13.07,words:3920},title:"Chapter14 Transactions",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E5%BA%93/Chapter15%20Concurrency%20Control.html",{loader:()=>f(()=>import("./Chapter15 Concurrency Control.html-BLTQuU_A.js"),__vite__mapDeps([136,1])),meta:{author:"chiichen",date:17040672e5,category:["课程笔记"],tag:["数据库"],sticky:!1,isOriginal:!0,excerpt:`<h2>基于锁的协议(Lock-Based Protocols)</h2>
2018<ul>
2019<li>锁是一种控制对数据项并发访问的机制。</li>
2020<li>数据项可以以两种模式进行锁定:
2021<ol>
2022<li>独占(X)模式:数据项既可以读取也可以写入。使用 lock-X 指令请求 X 锁。</li>
2023<li>共享(S)模式:数据项只能读取。使用 lock-S 指令请求 S 锁。</li>
2024</ol>
2025</li>
2026<li>锁请求发送给并发控制管理器。只有在请求被授予后,事务才能继续进行。</li>
2027</ul>
2028<figure><figcaption>事务执行锁定的示例</figcaption></figure>`,readingTime:{minutes:10.09,words:3028},title:"Chapter15 Concurrency Control",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E5%BA%93/Chapter16%20Recovery%20System.html",{loader:()=>f(()=>import("./Chapter16 Recovery System.html-DrbLf4jM.js"),__vite__mapDeps([137,1])),meta:{author:"chiichen",date:17040672e5,category:["课程笔记"],tag:["数据库"],sticky:!1,isOriginal:!0,excerpt:`<h2>故障分类</h2>
2029<ul>
2030<li>事务故障:
2031<ul>
2032<li>逻辑错误:由于某些内部错误条件(例如 A 的余额不足,无法扣款),事务无法完成。</li>
2033<li>系统错误:数据库系统必须由于错误条件(例如死锁)终止活动事务。</li>
2034</ul>
2035</li>
2036<li>系统崩溃:
2037<ul>
2038<li>由于电源故障或其他硬件或软件故障,系统崩溃。</li>
2039</ul>
2040</li>
2041<li>停止故障假设:
2042<ul>
2043<li>假设非易失性存储内容在系统崩溃时不会被破坏。</li>
2044<li>数据库系统具有许多完整性检查来防止磁盘数据的损坏。</li>
2045</ul>
2046</li>
2047<li>磁盘故障:
2048<ul>
2049<li>磁头碰撞或类似的磁盘故障破坏了全部或部分磁盘存储。</li>
2050<li>假设破坏是可检测的:磁盘驱动器使用校验和来检测故障。</li>
2051</ul>
2052</li>
2053</ul>`,readingTime:{minutes:13.34,words:4001},title:"Chapter16 Recovery System",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E5%BA%93/Chapter2%20Introduction%20to%20Relational%20Model.html",{loader:()=>f(()=>import("./Chapter2 Introduction to Relational Model.html-CWDePNbl.js"),__vite__mapDeps([138,1])),meta:{author:"chiichen",date:17036352e5,category:["课程笔记"],tag:["数据库"],sticky:!1,isOriginal:!0,excerpt:`<h2>关系(Relation)</h2>
2054<figure><figcaption>Example of a Relation</figcaption></figure>
2055<h3>属性值(Attribute Types)</h3>
2056<ul>
2057<li>每个属性允许的值集合称为属性的域(domain)。</li>
2058<li>属性值(通常)要求是原子(atomic)的,即不可分割的。</li>
2059<li>特殊值 null 是每个域的成员。</li>
2060<li>null 值在许多操作的定义中引起了复杂性。</li>
2061</ul>
2062<h3>关系模式和实例(Relation Schema and Instance)</h3>`,readingTime:{minutes:3.32,words:995},title:"Chapter2 Introduction to Relational Model",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E5%BA%93/Chapter3%20Introduction%20to%20SQL.html",{loader:()=>f(()=>import("./Chapter3 Introduction to SQL.html-PcqjKvp6.js"),__vite__mapDeps([139,1])),meta:{author:"chiichen",date:17036352e5,category:["课程笔记"],tag:["数据库"],sticky:!1,isOriginal:!0,excerpt:`<h2>SQL 数据定义语言(data-definition language,DDL)</h2>
2063<ul>
2064<li>
2064SQL 数据定义语言( data-definition language ,DDL)允许指定关于关系的信息,包括:
2065<ul>
2066<li>每个关系的模式。</li>
2067<li>每个属性关联的值域。</li>
2068<li>完整性约束。</li>
2069<li>此外,我们稍后将看到,还可以包括其他信息,例如:
2070<ul>
2071<li>每个关系要维护的索引集合。</li>
2072<li>每个关系的安全性和授权信息。</li>
2073<li>每个关系在磁盘上的物理存储结构。</li>
2074</ul>
2075</li>
2076</ul>
2077</li>
2078<li>简而言之,SQL 的数据定义语言(DDL)提供了一种定义关系的信息的方式,包括关系模式、属性的值域以及与关系相关的完整性约束等。它还允许指定索引、安全性和授权信息以及关系在磁盘上的物理存储结构。</li>
2079</ul>`,readingTime:{minutes:.86,words:259},title:"Chapter3 Introduction to SQL",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E5%BA%93/Chapter6%20Formal%20Relational%20Query%20Languages.html",{loader:()=>f(()=>import("./Chapter6 Formal Relational Query Languages.html-C-CITR3-.js"),__vite__mapDeps([140,1])),meta:{author:"chiichen",date:1703808e6,category:["课程笔记"],tag:["数据库"],sticky:!1,isOriginal:!0,excerpt:`<h2>分类</h2>
2080<p>关系代数(Relational Algebra)、元组关系演算(Tuple Relational Calculus)和域关系演算(Domain Relational Calculus)是用于关系数据库的不同查询语言和形式。它们的主要区别如下:</p>
2081<ol>
2082<li>
2083<p>关系代数(Relational Algebra):<br>
2084关系代数是一种基于集合论的查询语言,用于操作关系数据库中的关系。它使用一组操作符,如选择(selection)、投影(projection)、连接(join)、并(union)、差(difference)等来执行关系操作。关系代数提供了一种形式化的方法来描述和操作关系数据库中的关系。</p>
2085</li>
2086<li>
2087<p>元组关系演算(Tuple Relational Calculus):<br>
2088元组关系演算是一种基于逻辑的查询语言,用于描述关系数据库中的查询。它使用逻辑谓词(predicate)来描述所需的元组集合。元组关系演算的查询结果是满足指定谓词的关系中的元组集合。元组关系演算描述了所需的结果,而不是如何计算结果。</p>
2089</li>
2090<li>
2091<p>域关系演算(Domain Relational Calculus):<br>
2092域关系演算也是一种基于逻辑的查询语言,用于描述关系数据库中的查询。它使用逻辑谓词来描述所需的属性集合。域关系演算的查询结果是满足指定谓词的关系中的属性集合。域关系演算描述了所需的属性,而不是如何计算结果。</p>
2093</li>
2094</ol>`,readingTime:{minutes:6.61,words:1982},title:"Chapter6 Formal Relational Query Languages",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E5%BA%93/Chapter7%20Entity-Relationship%20Model.html",{loader:()=>f(()=>import("./Chapter7 Entity-Relationship Model.html-C3dlxV0o.js"),__vite__mapDeps([141,1])),meta:{author:"chiichen",date:1703808e6,category:["课程笔记"],tag:["数据库"],sticky:!1,isOriginal:!0,excerpt:`<h2>建模</h2>
2095<ul>
2096<li>一个数据库可以被建模为:
2097<ul>
2098<li>实体的集合,</li>
2099<li>实体之间的关系。</li>
2100</ul>
2101</li>
2102</ul>
2103<h3>实体集</h3>
2104<ul>
2105<li>实体(entity)是存在的对象,并且可与其他对象区分开来。
2106<ul>
2107<li>例如:具体的人、公司、事件、植物。</li>
2108</ul>
2109</li>
2110<li>实体具有属性(attribute)。
2111<ul>
2112<li>例如:人有姓名和地址。</li>
2113</ul>
2114</li>
2115<li>实体集(entity set)是一组具有相同属性的同类实体的集合。
2116<ul>
2117<li>例如:所有人、公司、树木、假日的集合。<br>
2118</li>
2119</ul>
2120</li>
2121</ul>`,readingTime:{minutes:12.77,words:3832},title:"Chapter7 Entity-Relationship Model",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E5%BA%93/Chapter8%20Relational%20Database%20Design.html",{loader:()=>f(()=>import("./Chapter8 Relational Database Design.html-DaWwIQxe.js"),__vite__mapDeps([142,1])
2121),meta:{author:"chiichen",date:17038944e5,category:["课程笔记"],tag:["数据库"],sticky:!1,isOriginal:!0,excerpt:`<h2>分解(decompose)</h2>
2122<figure><figcaption>Example</figcaption></figure>
2123<ul>
2124<li>如果分解后无法重建原始信息,那么就是有损分解(Lossy Decomposition),反之则为无损分解(Lossless-Join Decomposition)<br>
2125<br>
2126</li>
2127<li>所以我们需要一个理论来告诉我们怎么合理的分解关系。好的分解要做到:
2128<ol>
2129<li>无损分解</li>
2130<li>依赖保存</li>
2131</ol>
2132</li>
2133<li>BCNF 分解可以保证无损,3NF 可以保证依赖保存,但是 3NF 无法保证没有冗余,因此需要在 BCNF 和 3NF 间权衡</li>
2134</ul>`,readingTime:{minutes:20.15,words:6045},title:"Chapter8 Relational Database Design",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E7%94%B5%E5%B7%A5/%E7%94%B5%E5%B7%A5%E5%A4%8D%E4%B9%A0%E7%AC%94%E8%AE%B0.html",{loader:()=>f(()=>import("./电工复习笔记.html-D67YF8SQ.js"),__vite__mapDeps([143,1])),meta:{date:1704537535e3,excerpt:`<p>#笔记/复习笔记</p>
2135<h1>第一章 电路的基本概念与基本定律</h1>
2136<h2>1.参考方向、参考极性、关联与非关联</h2>
2137<ul>
2138<li>电流的方向并非实际方向,而是假定的,电压的极性也并非实际极性。</li>
2139<li>关联:电流从电压的正极流入</li>
2140<li>非关联:电流从电压的负极流入<br>
2141(均为参考方向/极性)<br>
2142![[关联与非关联]]</li>
2143</ul>
2144<h2>2.欧姆定律</h2>
2145<ul>
2146<li>关联:</li>
2147<li>非关联:</li>
2148<li array=""> $$<br>
2149\\begin{array}{c}Y\\rightarrow\\Delta:R_1=\\frac{R_bR_c}{R_a+R_b+R_c}, R_2=\\frac{R_aR_c}{R_a+R_b+R_c}, R_3=\\frac{R_aR_b}{R_a+R_b+R_c}\\<br>
2150\\Delta\\rightarrow Y: R_a=\\frac{R_1 R_2 + R_2 R_3 + R_3 R_1}{R_1},  R_b=\\frac{R_1 R_2 + R_2 R_3 +  R_3 R_1}{R_2},  Rc=\\frac{R1_R2 + R2_R3 +  R3_R1}{RC}<br>
2151\\end</li>
2152</ul>`,readingTime:{minutes:14.11,words:4234},title:"第一章 电路的基本概念与基本定律",type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E7%BC%96%E8%AF%91%E5%8E%9F%E7%90%86/Chapter0%20%E5%89%8D%E8%A8%80.html",{loader:()=>f(()=>import("./Chapter0 前言.html-LuZz2PZL.js"),__vite__mapDeps([144,1])),meta:{author:"chiichen",date:16969824e5,category:["课程笔记"],tag:["编译原理"],sticky:!0,isOriginal:!0,excerpt:`<h2>前言</h2>
2153<h3>写给华工软院学生</h3>
2154<ol>
2155<li>2021 级编译原理考试难度较低,复习优先级低,不建议花太多时间准备。虽然根据老师不同(以徐老师为例),可能上课的内容比较深入,让学生产生了这门科目难度很大的错觉。诚然要彻底理解编译原理需要花费大量的时间,但考试内容基本都是简单的算法,只要把几个重要算法理解了,都不需要把每个概念搞的非常清楚,考试都基本不会出问题。</li>
2156<li>编译原理博大精深,作为计算机底层设计的一部分,课堂上教授的内容少之又少,甚至可以说和一些工程实践是<code>严重脱钩</code>的,比如上课会花很大的精力教你自动机和自动机的相关算法,但是在实际工程运用中,我们有诸如 <code>lexer</code> 的工具帮我们完成这个工作,而且如果是编写一个简单的词法分析器,甚至只需要简单的 <code>最长字串匹配</code> 就能实现一个词法分析。仅凭课堂上学的内容,大概率连怎么写一个 TinyC(精简版的 C 语言) 都不知道。感兴趣的同学可以认真钻研一番,这对编程能力会有极大的提高。</li>
2157</ol>`,readingTime:{minutes:1.59,words:478},title:"Chapter0 前言",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E7%BC%96%E8%AF%91%E5%8E%9F%E7%90%86/Chapter1%20%E7%BC%96%E8%AF%91%E5%99%A8%E7%BB%84%E6%88%90.html",{loader:()=>f(()=>import("./Chapter1 编译器组成.html-Fn_pQS-w.js"),__vite__mapDeps([145,1])),meta:{author:"chiichen",date:16969824e5,category:["课程笔记"],tag:["编译原理"],sticky:!0,isOriginal:!0,excerpt:`<h2>Chapter1 编译器组成</h2>
2158<h3>编译器的结构</h3>
2159<ul>
2160<li>词法分析 Lexical analysis (Scanning)</li>
2161<li>语法分析 Syntax analysis (Parsing)</li>
2162<li>语义分析 Semantic analysis</li>
2163</ul>
2164<div class="hint-container info">
2165<p class="hint-container-title">相关信息</p>
2166<p>以上三步的目的是通过分析输入代码,生成能被统一处理的中间层代码,亦即编译器前端(front-end)</p>
2167</div>`,readingTime:{minutes:.99,words:297},title:"Chapter1 编译器组成",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E7%BC%96%E8%AF%91%E5%8E%9F%E7%90%86/Chapter2%20%E8%AF%8D%E6%B3%95%E5%88%86%E6%9E%90.html",{loader:()=>f(()=>import("./Chapter2 词法分析.html-CzVGFKgE.js"),__vite__mapDeps([146,1])),meta:{author:"chiichen",date:16969824e5,category:["课程笔记"],tag:["编译原理"],sticky:!0,isOriginal:!0,excerpt:`
2168<h2>大纲</h2>
2169<ul>
2170<li>扫描过程 Scanning Process</li>
2171<li>正则表达式 Regular Expressions</li>
2172<li>有限自动机 Finite Automata(NFA(nondeterministic 非确定性有限自动机) and DFA(deterministic 确定性))</li>
2173<li>RE 转换 NFA(McNaughton-Yamda-Thompson algorithm)</li>
2174<li>NFA 转换 DFA(子集算法 Subset construction Algorithm)</li>
2175<li>最小化 DFA(State-Minimization Algorithm)</li>
2176</ul>`,readingTime:{minutes:5.75,words:1724}
2176,title:"Chapter2 词法分析",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E7%BC%96%E8%AF%91%E5%8E%9F%E7%90%86/Chapter3%20%E8%AF%AD%E6%B3%95%E5%88%86%E6%9E%90.html",{loader:()=>f(()=>import("./Chapter3 语法分析.html-Bh-3ADnE.js"),__vite__mapDeps([147,1])),meta:{author:"chiichen",date:16969824e5,category:["课程笔记"],tag:["编译原理"],sticky:!0,isOriginal:!0,excerpt:`
2177<ul>
2178<li>正则表达式的能力有限,无法分析具体的语法细节(例如嵌套、的 n 值),与其等价的有穷自动机同理,因此引入了下推自动机和上下文有关、无关文法</li>
2179</ul>
2180<h1>大纲</h1>
2181<ul>
2182<li>语法分析的形式化——上下文无关文法</li>
2183<li>语法分析算法</li>
2184</ul>
2185<h1>上下文无关文法(CFG)</h1>
2186<ul>
2187<li>是用来描述一个编程语言的语法结构的文法</li>
2188<li>和正则表达式一样,可以表示递归的规则,而且更强大</li>
2189<li>是正则表达式的严格超集</li>
2190</ul>
2191<h2>Chomsky 语言层级</h2>
2192<table>
2193<thead>
2194<tr>
2195<th>Chomsky hierarchy</th>
2196<th>Production(产生式)</th>
2197<th>Explanation</th>
2198</tr>
2199</thead>
2200<tbody>
2201<tr>
2202<td>unrestricted(type 0)(自然语言)</td>
2203<td></td>
2204<td>无严格约束</td>
2205</tr>
2206<tr>
2207<td>context sensitive(type 1)(上下文有关文法)</td>
2208<td></td>
2209<td>在不同的上下文中,可能被不同的替换</td>
2210</tr>
2211<tr>
2212<td>context free(type 2)(上下文无关文法)</td>
2213<td></td>
2214<td>在任何出现的地方都会被替换</td>
2215</tr>
2216<tr>
2217<td>regular(type 3)(正则表达式)</td>
2218<td></td>
2219<td>等价于正则表达式</td>
2220</tr>
2221</tbody>
2222</table>`,readingTime:{minutes:15.92,words:4775},title:"Chapter3 语法分析",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E7%BC%96%E8%AF%91%E5%8E%9F%E7%90%86/Chapter4%20%E8%AF%AD%E4%B9%89%E5%88%86%E6%9E%90.html",{loader:()=>f(()=>import("./Chapter4 语义分析.html-B7PXGMZB.js"),__vite__mapDeps([148,1])),meta:{author:"chiichen",date:16969824e5,category:["课程笔记"],tag:["编译原理"],sticky:!0,isOriginal:!0,excerpt:`
2223<h2>目录</h2>
2224<h2>介绍</h2>
2225<ul>
2226<li>语义分析核心是类型检查(Type check)和作用域检查(Scope check)</li>
2227<li>语义通过属性的值来刻画</li>
2228<li>通过一系列属性等式来进行计算,按照一定的顺序进行计算</li>
2229</ul>
2230<h2>Recursive AST Walk</h2>
2231<ul>
2232<li>一种语义分析的实现方法,本书暂时不表</li>
2233</ul>
2234<h2>Attribute Grammars</h2>
2235<h3>语法制导的语法分析(Syntax-Directed Semantics Analysis )</h3>
2236<ul>
2237<li>又称 SDS、SDT、SDD</li>
2238<li>属性是附着在文法符号上的</li>
2239</ul>`,readingTime:{minutes:8.97,words:2690},title:"Chapter4 语义分析",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E7%BC%96%E8%AF%91%E5%8E%9F%E7%90%86/Chapter5%20%E4%BB%A3%E7%A0%81%E7%94%9F%E6%88%90.html",{loader:()=>f(()=>import("./Chapter5 代码生成.html-CVjCAUHG.js"),__vite__mapDeps([149,1])),meta:{author:"chiichen",date:16969824e5,category:["课程笔记"],tag:["编译原理"],sticky:!0,isOriginal:!0,excerpt:`
2240<h2>介绍</h2>
2241<ul>
2242<li>代码生成取决于:源代码、目标系统体系结构、运行时环境</li>
2243<li>代码生成可以被划分为三步:</li>
2244</ul>
2245<ol>
2246<li>生成中间代码(IR Iermediate code 码)</li>
2247<li>生成某种汇编形式的代码,而不是真正的可执行代码</li>
2248<li>优化目标代码</li>
2249</ol>
2250<h2>中间代码</h2>
2251<ul>
2252<li>以三地址码(TAC Three Address code)为例</li>
2253</ul>
2254<h3>生成三地址码</h3>
2255<h4>运算</h4>
2256<figure><figcaption>[TAC_Code1.png]</figcaption></figure>`,readingTime:{minutes:7.63,words:2290},title:"Chapter5 语法生成",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/Chapter1-Internet-And-Ethernet.html",{loader:()=>f(()=>import("./Chapter1-Internet-And-Ethernet.html-C-9Xuq8Z.js"),__vite__mapDeps([150,1])),meta:{author:"chiichen",date:16863552e5,category:["课程笔记"],tag:["计算机网络"],sticky:!1,isOriginal:!0,excerpt:`<h2>网络模型</h2>
2257<figure><figcaption>网络基础模型</figcaption></figure>
2258<ul>
2259<li>组网设备(networking device):组成网络中除计算机之外的部分,即 proxy 部分的设备</li>
2260<li>一个计算机网络利用组网设备和数据链路(data links)去连接若干台地理上分离的计算机,通过完善的网络协议(protocol)和网络应用来达成共享网络资源和信息传输的功能</li>
2261<li>在网络中,信息以离散的二进制比特流传输,每组二进制比特流被称为 data packets(数据包)</li>
2262</ul>
2263<h3>问题</h3>`,readingTime:{minutes:6.37,words:1912},title:"Chapter1 Internet And Ethernet",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/Chapter2-Application-Layer.html",{loader:()=>f(()=>import("./Chapter2-Application-Layer.html-WZ4AZRAj.js"),__vite__mapDeps([151,1])),meta:{author:"chiichen",date:16863552e5,category:["课程笔记"],tag:["计算机网络"],sticky:!1,isOriginal:!0,excerpt:`<h2>应用层协议原理</h2>
2264<h3>网络应用程序体系结构</h3>
2265<h4>客户-服务器结构(Client-Server)</h4>
2266<ul>
2267<li>
2268<p>Web、FTP、Telnet、电子邮件都是通过这种结构进行构建的,由一个总是打开的主机,称为服务器(Server),用来服务来自许多被称为客户(Client)其他主机的请求。</p>
2269</li>
2270<li>
2271<p>而在这种结构下,单台主机通常会难以应付大量的请求,因此会在配备了大量主机的数据中心(data center)中创建虚拟服务器来满足客户端请求的需求ã€
2271‚</p>
2272</li>
2273</ul>
2274<h4>P2P 体系结构(Peer-to-peer)</h4>`,readingTime:{minutes:17.34,words:5201},title:"Chapter2 Application Layer",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/Chapter3-Transport-Layer.html",{loader:()=>f(()=>import("./Chapter3-Transport-Layer.html-bNDEImbC.js"),__vite__mapDeps([152,1])),meta:{author:"chiichen",date:16867008e5,category:["课程笔记"],tag:["计算机网络"],sticky:!1,isOriginal:!0,excerpt:`<h2>多路复用与多路分解</h2>
2275<ul>
2276<li>在接收端,运输层检查运输层报文中的几个字段——源端口号和目标端口号。来将报文定向到某个特定的 socket(注意,不是直接把数据发送到进程)的工作被称为多路分解(demultiplexing)。</li>
2277<li>在源主机从不同 socket 中收集数据块,并为每个数据块封装上首部信息从而生成报文段,然后将报文段传递到网络层的工作称为多路复用(multiplexing)</li>
2278<li>运输层和进程之间的数据交换是以 socket 为媒介实现的。</li>
2279<li>端口号是一个 16bit 的数,大小为 0~65535。0~1023 范围的端口号被称为周知端口号(well-known port number),通常是被保留用作例如 HTTP、FTP 等协议使用</li>
2280</ul>`,readingTime:{minutes:32.15,words:9645},title:"Chapter3 Transport Layer",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/Chapter4-Net-Layer.html",{loader:()=>f(()=>import("./Chapter4-Net-Layer.html-BP2JUK_8.js"),__vite__mapDeps([153,1])),meta:{author:"chiichen",date:16870464e5,category:["课程笔记"],tag:["计算机网络"],sticky:!1,isOriginal:!0,excerpt:`<h2>路由器工作原理</h2>
2281<h3>输入端口处理和基于目的地转发</h3>
2282<figure><figcaption>输入端口处理.png</figcaption></figure>
2283<h4>最长前缀匹配(Longest Prefix Match LPM)</h4>
2284<ul>
2285<li>用来决定路由器如何进行转发,例如下表,其中 link 表示当前路由器连接到其他路由器的不同链路,当地址为 28.1.2.3 时,选择链路 3,当地址为 28.33.5.4 时,选择链路 4</li>
2286</ul>
2287<table>
2288<thead>
2289<tr>
2290<th>dest</th>
2291<th>link</th>
2292</tr>
2293</thead>
2294<tbody>
2295<tr>
2296<td>default</td>
2297<td>1</td>
2298</tr>
2299<tr>
2300<td>171.33.0.0/16</td>
2301<td>5</td>
2302</tr>
2303<tr>
2304<td>23.0.0.0/24</td>
2305<td>2</td>
2306</tr>
2307<tr>
2308<td>28.0.0.0/24</td>
2309<td>3</td>
2310</tr>
2311<tr>
2312<td>28.33.5.0/8</td>
2313<td>4</td>
2314</tr>
2315</tbody>
2316</table>`,readingTime:{minutes:25.51,words:7652},title:"Chapter4 Net Layer",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/Chapter5-Link-Layer.html",{loader:()=>f(()=>import("./Chapter5-Link-Layer.html-CIpTQANk.js"),__vite__mapDeps([154,1])),meta:{author:"chiichen",date:16870464e5,category:["课程笔记"],tag:["计算机网络"],sticky:!1,isOriginal:!0,excerpt:`<h2>链路层概述</h2>
2317<ul>
2318<li>链路层中运行协议的设备被称为节点,而通信信道被称为链路。</li>
2319</ul>
2320<h3>链路层提供的服务</h3>
2321<ul>
2322<li>成帧(framing)。帧的结构由具体的链路层协议规定</li>
2323<li>链路接入(link access)。媒体访问控制(Medium Access Control, MAC)协议规定了帧在链路上传输的规则。MAC 用于协调多个节点的帧传输。</li>
2324<li>可靠交付(reliable delivery)。链路层协议保证无差错地经链路层移动每个网络层数据包。链路层的 RD 通常是通过在本地(发生错误的链路)确认重传,而不是在整个端到端路径上重传。因此在高差错率的链路,例如无线链路中广泛使用。而在低差错率的链路,例如光纤、电缆等有线链路中的链路层协议不提供 RD。</li>
2325<li>差错检测和纠正。链路层的差错检测通常更复杂,而且用硬件实现。而差错纠正意味着接收方不仅能检测出差错,还能够准确定位到帧中差错出现的位置。</li>
2326</ul>`,readingTime:{minutes:18.72,words:5617},title:"Chapter5 Link Layer",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E4%B9%A0%E9%A2%98%E7%AD%94%E6%A1%88.html",{loader:()=>f(()=>import("./计算机网络习题答案.html-PrKfTcSr.js"),__vite__mapDeps([155,1])),meta:{date:170616319e4,excerpt:`
2327<h2>复习题和习题参考答案</h2>
2328<h3>版本时间:2016年12月</h3>
2329<p>本文档包含Jim Kurose和Keith Ross编写的《计算机网络:自顶向下方法(第7版)》复习题和习题的参考答案。这些答案只对指导老师有效。请不要复制或者分发给其他人(即使是其他指导老师)。请不要在公共网络发布任何参考答案。如果有需要,我们很乐意提供此参考答案(最新版)。</p>
2330<p>声明:这些年来,很多同学和同事帮助我们准备此参考答案。特别感谢Honggang Zhang,Rakesh Kumar,Prithula Dhungel和VijayAnnapureddy。同时也感谢提建议和修正错误的所有读者。</p>`,readingTime:{minutes:172.07,words:51622},title:"计算机网络:自顶向下方法,第7版",type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter0%E7%BB%AA%E8%AE%BA.html",{loader:()=>f(()=>import("./Chapter0绪论.html-Yo0SUuMY.js"),__vite__mapDeps([156,1])),meta:{author:"chiichen",date:17023392e5,category:["课程笔记"],tag:["软件体系结构"],sticky:!1,isOriginal:!0,excerpt:`<h2>教材</h2>
2331<p>软件构架实践(第 3 版),L.Bass,P.Clements,andR.Kazman,清华大学出版社(2013)</p>
2332<h2>主要内容</h2>
2333`,readingTime:{minutes:.29,words:87},title:"Chapter0 绪论",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter10%E5%8F%AF%E6%B5%8B%E8%AF%95%E6%80%A7.html",{loader:()=>f(()=>import("./Chapter10可测试性.html-CWujBN8I.js"),__vite__mapDeps([157,1])),meta:{author:"chiichen",date:17026848e5,category:["课程笔记"],tag:["软件体系结构"],sticky:!1,isOriginal:!0,excerpt:`<h2>可测试性是什么?</h2>
2334<ul>
2335<li>软件的可测试性是指通过(通常是基于执行的)测试来展示其错误的难易程度。</li>
2336<li>可测试性是指系统在下一次测试执行中失败的概率。</li>
2337<li>
2337如果系统存在错误,我们希望它能在测试过程中尽快失败。</li>
2338<li>要使一个系统具有可测试性,必须能够控制每个组件的输入(并可能操作其内部状态),然后观察其输出(以及可能的内部状态)。</li>
2339</ul>
2340<h2>可测试性策略的目标</h2>
2341<ul>
2342<li>可测试性策略的目标是在软件开发完成的一个增量中实现更容易的测试。</li>
2343<li>可测试性策略可以分为两个类别:
2344<ul>
2345<li>第一个类别涉及向系统添加可控性和可观察性。</li>
2346<li>第二个类别涉及限制系统设计中的复杂性。</li>
2347</ul>
2348</li>
2349</ul>`,readingTime:{minutes:3.27,words:981},title:"Chapter10 可测试性",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter11%E6%98%93%E7%94%A8%E6%80%A7.html",{loader:()=>f(()=>import("./Chapter11易用性.html-CfzfMm5s.js"),__vite__mapDeps([158,1])),meta:{author:"chiichen",date:17026848e5,category:["课程笔记"],tag:["软件体系结构"],sticky:!1,isOriginal:!0,excerpt:`<h2>什么是易用性?</h2>
2350<ul>
2351<li>易用性关注用户完成所需任务的难易程度以及系统提供的用户支持。</li>
2352<li>易用性是改善系统质量的最便宜和最简单的方式之一。</li>
2353<li>易用性包括以下几个方面:
2354<ul>
2355<li>高效使用系统。</li>
2356<li>学习系统的功能。</li>
2357<li>尽量减少错误的影响。</li>
2358<li>使系统适应用户需求。</li>
2359<li>提高用户的信心和满意度。</li>
2360</ul>
2361</li>
2362</ul>
2363<h2>易用性策略</h2>
2364<figure><figcaption>Usability tactics</figcaption></figure>`,readingTime:{minutes:1.72,words:516},title:"Chapter11 易用性",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter12%E5%85%B6%E5%AE%83%E8%B4%A8%E9%87%8F%E5%B1%9E%E6%80%A7.html",{loader:()=>f(()=>import("./Chapter12其它质量属性.html-XT_VYprB.js"),__vite__mapDeps([159,1])),meta:{author:"chiichen",date:17026848e5,category:["课程笔记"],tag:["软件体系结构"],sticky:!1,isOriginal:!0,excerpt:`<h2>可移植性(Portability)</h2>
2365<ul>
2366<li>可移植性也是一种特殊形式的可修改性。</li>
2367<li>可移植性指的是将为一个平台构建的软件更改为在不同平台上运行的便捷程度。</li>
2368</ul>
2369<h2>开发可分发性(Development Distributability)</h2>
2370<ul>
2371<li>开发可分发性是指设计软件以支持分布式软件开发的质量。</li>
2372<li>系统是使用全球分布的团队开发的。</li>
2373<li>目的是最大限度减少团队之间的协调。</li>
2374</ul>
2375<h2>可扩展性(Scalability)</h2>
2376<ul>
2377<li>水平可扩展性(扩展外部)指向逻辑单元添加更多资源,例如向集群添加另一个服务器。</li>
2378<li>垂直可扩展性(扩展内部)指向物理单元添加更多资源,例如向计算机添加更多内存。</li>
2379<li>可产生可衡量的改进,而无需中断操作。</li>
2380</ul>`,readingTime:{minutes:2.04,words:613},title:"Chapter12 其它质量属性",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter13%E6%A8%A1%E5%BC%8F%E5%92%8C%E7%AD%96%E7%95%A5.html",{loader:()=>f(()=>import("./Chapter13模式和策略.html-EbsDQoc9.js"),__vite__mapDeps([160,161,1])),meta:{author:"chiichen",date:17026848e5,category:["课程笔记"],tag:["软件体系结构"],sticky:!1,isOriginal:!0,excerpt:`<h2>什么是模式(Pattern)?</h2>
2381<ul>
2382<li><code>架构模式(An architecture pattern)</code>是一组在实践中反复出现的设计决策的集合。</li>
2383<li>它具有已知的可重用性属性,并描述了一类架构。</li>
2384</ul>
2385<h2>架构模式(An architecture pattern)</h2>
2386<ul>
2387<li>模块模式
2388<ul>
2389<li>分层模式</li>
2390</ul>
2391</li>
2392<li>组件与连接器模式
2393<ul>
2394<li>代理模式</li>
2395<li>模型-视图-控制器模式</li>
2396<li>管道-过滤器模式</li>
2397<li>客户端-服务器模式</li>
2398<li>对等模式</li>
2399<li>面向服务的架构(SOA)模式</li>
2400<li>发布-订阅模式</li>
2401<li>共享数据模式</li>
2402</ul>
2403</li>
2404<li>分配模式
2405<ul>
2406<li>Map-Reduce 模式</li>
2407<li>多层模式</li>
2408</ul>
2409</li>
2410</ul>`,readingTime:{minutes:14.67,words:4400},title:"Chapter13 模式和策略",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter14%E8%B4%A8%E9%87%8F%E5%B1%9E%E6%80%A7%E5%BB%BA%E6%A8%A1%E4%B8%8E%E5%88%86%E6%9E%90.html",{loader:()=>f(()=>import("./Chapter14质量属性建模与分析.html-CDxajzAQ.js"),__vite__mapDeps([162,1])),meta:{author:"chiichen",date:17026848e5,category:["课程笔记"],tag:["软件体系结构"],sticky:!1,isOriginal:!0,excerpt:`<h2>我们如何了解软件的质量属性?</h2>
2411<ul>
2412<li>实验和测量</li>
2413<li>分析模型</li>
2414<li>模拟</li>
2415</ul>
2416<h2>建模架构以支持质量属性分析</h2>
2417<ul>
2418<li>一些质量属性,尤其是性能和可用性,已经有了被广泛理解和经过时间验证的分析模型,可以用于辅助分析。</li>
2419<li>通过分析模型,我们指的是支持定量分析的模型。</li>
2420</ul>
2421<h3>性能建模</h3>
2422<figure><figcaption>Performance Models</figcaption></figure>
2423<ul>
2424<li>参数:事件的到达速率、选择的排队规则、选择的调度算法、网络拓扑、网络带宽、选择的路由算法、事件的服务时间</li>
2425</ul>`,readingTime:{minutes:2.44,words:731}
2425,title:"Chapter14 质量属性建模与分析",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter15%E6%95%8F%E6%8D%B7%E9%A1%B9%E7%9B%AE%E4%B8%AD%E7%9A%84%E6%9E%B6%E6%9E%84.html",{loader:()=>f(()=>import("./Chapter15敏捷项目中的架构.html-b5ZeM0am.js"),__vite__mapDeps([163,1])),meta:{author:"chiichen",date:17028576e5,category:["课程笔记"],tag:["软件体系结构"],sticky:!1,isOriginal:!0,excerpt:`<h2>敏捷宣言</h2>
2426<ul>
2427<li>Individuals and interactions over processes and tools 人机交互重于过程和工具</li>
2428<li>Working software over comprehensive documentation 可以工作的软件重于求全责备的文档</li>
2429<li>Customer collaboration over contract negotiation 客户协作重于合同谈判</li>
2430<li>Responding to change over following a plan 随时应对变化重于循规蹈矩</li>
2431</ul>`,readingTime:{minutes:3.73,words:1118},title:"Chapter15 敏捷项目中的架构",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter16%E6%9E%B6%E6%9E%84%E4%B8%8E%E9%9C%80%E6%B1%82.html",{loader:()=>f(()=>import("./Chapter16架构与需求.html-f89X53UU.js"),__vite__mapDeps([164,1])),meta:{author:"chiichen",date:17028576e5,category:["课程笔记"],tag:["软件体系结构"],sticky:!1,isOriginal:!0,excerpt:`<h2>具有架构重要性的需求(Architecturally Significant Requirement ,ASR)</h2>
2432<ul>
2433<li>并非所有需求都是平等的。</li>
2434<li>具有架构重要性的需求(ASR)是对架构产生深远影响的需求ã€
2434‚</li>
2435<li>我们如何找到这些需求呢?</li>
2436</ul>
2437<h2>捕捉架构重要性需求的方法</h2>
2438<ul>
2439<li>从需求文档中获取</li>
2440<li>通过与利益相关者进行面谈</li>
2441<li>通过理解业务目标</li>
2442<li>在效用树中(In Utility Tree)</li>
2443</ul>
2444<h3>具有架构重要性的需求和需求文档</h3>`,readingTime:{minutes:5.62,words:1686},title:"Chapter16 架构与需求",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter17%E8%AE%BE%E8%AE%A1%E6%9E%B6%E6%9E%84.html",{loader:()=>f(()=>import("./Chapter17设计架构.html-BHqDbf5H.js"),__vite__mapDeps([165,1])),meta:{author:"chiichen",date:17028576e5,category:["课程笔记"],tag:["软件体系结构"],sticky:!1,isOriginal:!0,excerpt:`<h2>设计策略(Design Strategy)</h2>
2445<ul>
2446<li>分解(Decomposition)</li>
2447<li>面向架构重要性需求的设计(Designing to Architecturally Significant Requirements)</li>
2448<li>生成和测试(Generate and Test)</li>
2449</ul>
2450<h2>分解(Decomposition)</h2>
2451<ul>
2452<li>架构决定了质量属性</li>
2453<li>重要的质量属性是整个系统的特征。</li>
2454<li>设计从整个系统开始
2455<ul>
2456<li>整个系统被分解为各个部分</li>
2457<li>每个部分可能继承全部或部分质量属性需求</li>
2458</ul>
2459</li>
2460</ul>`,readingTime:{minutes:5.13,words:1540},title:"Chapter17 设计架构",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter19%E6%9E%B6%E6%9E%84%E5%AE%9E%E7%8E%B0%E4%B8%8E%E6%B5%8B%E8%AF%95.html",{loader:()=>f(()=>import("./Chapter19架构实现与测试.html-DbiylV6Z.js"),__vite__mapDeps([166,1])),meta:{author:"chiichen",date:17028576e5,category:["课程笔记"],tag:["软件体系结构"],sticky:!1,isOriginal:!0,excerpt:`<h2>架构与实现</h2>
2461<ul>
2462<li>保持代码和架构一致的技术:
2463<ul>
2464<li>在代码中嵌入设计(Embedding the Design in the Code)</li>
2465<li>框架</li>
2466<li>代码模板</li>
2467</ul>
2468</li>
2469</ul>
2470<h3>在代码中嵌入设计(Embedding the Design in the Code)</h3>
2471<ul>
2472<li>架构作为实现的蓝图。这意味着:
2473<ul>
2474<li>实现者知道他们正在实现的架构结构。例如,层次结构、发布-订阅、MVC、代理等。</li>
2475<li>他们可以将架构结构作为注释记录在代码中。这样,任何接手代码的人都会了解一些约束条件。</li>
2476<li>然后,工具可以自动关联代码和架构。</li>
2477</ul>
2478</li>
2479</ul>`,readingTime:{minutes:3.74,words:1123},title:"Chapter19 架构实现与测试",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter1%E4%BB%80%E4%B9%88%E6%98%AF%E8%BD%AF%E4%BB%B6%E6%9E%B6%E6%9E%84.html",{loader:()=>f(()=>import("./Chapter1什么是软件架构.html-9fwLXsLk.js"),__vite__mapDeps([167,1])),meta:{author:"chiichen",date:17024256e5,category:["课程笔记"],tag:["软件体系结构"],sticky:!1,isOriginal:!0,excerpt:`<h2>什么是软件架构</h2>
2480<p>系统的软件架构是用于推理系统的一组结构,包括软件元素、它们之间的关系以及它们的属性。</p>
2481<div class="hint-container info">
2482<p class="hint-container-title">什么是推理</p>
2483<p>在这里,"推理"指的是通过对系统的结构、元素和属性进行分析和推导,从而得出关于系统行为、性能、可靠性以及其他方面的合理推断和判断。通过推理,架构师和利益相关者(Stakeholders)可以理解系统的特性、功能和约束,并做出相应的决策,如优化系统设计、改进系统性能、预测系统行为等。推理可以基于已有的知识、经验、规则和模型,并结合对系统需求和上下文的理解进行推断和推测。因此,推理在软件架构中是一种重要的思维和分析方式,用于评估和决策系统的设计和实现。</p>
2484</div>`,readingTime:{minutes:12.24,words:3671},title:"Chapter1 什么是软件架构",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter2%E4%B8%BA%E4%BB%80%E4%B9%88%E8%BD%AF%E4%BB%B6%E6%9E%B6%E6%9E%84%E9%87%8D%E8%A6%81.html",{loader:()=>f(()=>import("./Chapter2为什么软件架构重要.html-BXvmwIc8.js"),__vite__mapDeps([168,1])),meta:{author:"chiichen",date:17024256e5,category:["课程笔记"],tag:["软件体系结构"],sticky:!1,isOriginal:!0,excerpt:`<h2>抑制或促进系统的质量属性</h2>
2485<ul>
2486<li>系统能否展现其所期望(或要求的)质量属性,在很大程度上取决于其架构。
2487<ul>
2488<li>性能</li>
2489<li>可修改性</li>
2490<li>安全性</li>
2491<li>可扩展性</li>
2492<li>可重用性</li>
2493</ul>
2494</li>
2495</ul>
2496<h2>推理和管理变更</h2>
2497<ul>
2498<li>
2498典型软件系统的总成本中,大约 80%发生在初始部署之后:
2499<ul>
2500<li>适应新功能</li>
2501<li>适应新环境</li>
2502<li>修复错误等等。</li>
2503</ul>
2504</li>
2505<li>每个架构将可能的变更划分为三个类别:
2506<ul>
2507<li>本地变更可以通过修改单个元素来完成。</li>
2508<li>非本地变更需要对多个元素进行修改,但保持底层架构方法不变。</li>
2509<li>架构变更会影响元素彼此交互的基本方式,并且将需要进行更大范围的更改。</li>
2510</ul>
2511</li>
2512<li>显然,本地变更是最理想的。</li>
2513<li>一个好的架构是指最常见的变更是本地变更,因此更容易进行。</li>
2514</ul>`,readingTime:{minutes:3.09,words:927},title:"Chapter2 为什么软件架构重要",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter4%E7%90%86%E8%A7%A3%E8%B4%A8%E9%87%8F%E5%B1%9E%E6%80%A7.html",{loader:()=>f(()=>import("./Chapter4理解质量属性.html-Gs6mp7Xo.js"),__vite__mapDeps([169,1])),meta:{author:"chiichen",date:17024256e5,category:["课程笔记"],tag:["软件体系结构"],sticky:!1,isOriginal:!0,excerpt:`<h2>架构与需求</h2>
2515<p>系统需求可以分为以下几类:</p>
2516<ul>
2517<li>功能需求(Functional Requirements):说明系统必须完成的功能、运行时行为或对运行时刺激的反应。</li>
2518<li>质量属性需求(Quality Attribute Requirements):对功能需求进行限定,例如功能执行的速度要求、对错误输入的容错性要求等。</li>
2519<li>约束(Constraints):约束是一个没有自由度的设计决策。</li>
2520</ul>
2521<h3>功能性(Functionality)</h3>
2522<ul>
2523<li>功能性是系统按照其预期进行工作的能力。</li>
2524<li>功能性与架构有着奇特的关系:
2525<ul>
2526<li>功能性并不决定架构;</li>
2527</ul>
2528</li>
2529</ul>`,readingTime:{minutes:7.2,words:2160},title:"Chapter4 理解质量属性",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter5%E5%8F%AF%E7%94%A8%E6%80%A7.html",{loader:()=>f(()=>import("./Chapter5可用性.html-CGNRizp9.js"),__vite__mapDeps([170,1])),meta:{author:"chiichen",date:17024256e5,category:["课程笔记"],tag:["软件体系结构"],sticky:!1,isOriginal:!0,excerpt:`<h2>什么是可用性(Availability)</h2>
2530<ul>
2531<li>可用性指的是软件具备在需要时随时可用并准备好执行任务的属性。</li>
2532<li>可用性是指系统能够掩盖或修复故障,以使累积的服务中断时间不超过指定时间间隔内的要求值。</li>
2533<li>可用性的目标是通过减轻故障来最小化服务中断时间。</li>
2534</ul>
2535<div class="hint-container info">
2536<p class="hint-container-title">可用性(Availability)与可靠性(reliability)或可信性(r dependability)的区别</p>
2537<ul>
2538<li>可用性包括通常所称的可靠性。</li>
2539<li>可用性还涵盖了其他考虑因素,例如由于定期维护导致的服务中断。</li>
2540<li>可用性与以下因素密切相关
2541<ul>
2542<li>安全性,例如拒绝服务攻击</li>
2543<li>性能</li>
2544<li>...</li>
2545</ul>
2546</li>
2547</ul>
2548</div>`,readingTime:{minutes:4.44,words:1333},title:"Chapter5 可用性",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter6%E4%BA%92%E6%93%8D%E4%BD%9C%E6%80%A7.html",{loader:()=>f(()=>import("./Chapter6互操作性.html-xI7XGjta.js"),__vite__mapDeps([171,1])),meta:{author:"chiichen",date:1702512e6,category:["课程笔记"],tag:["软件体系结构"],sticky:!1,isOriginal:!0,excerpt:`<h2>什么是互操作性?</h2>
2549<ul>
2550<li>互操作性是指在特定环境下,两个或多个系统能够通过接口有意义地交换信息的程度。</li>
2551<li>对于系统的互操作性的任何讨论都需要明确指出与谁以及在什么情况下进行交互。</li>
2552<li>语法互操作性是指交换数据的能力。</li>
2553<li>语义互操作性是指解释交换的数据的能力。</li>
2554<li>实现互操作性的两种视角:
2555<ul>
2556<li>在了解外部系统接口的基础上,将该知识设计到系统中。</li>
2557<li>在没有了解其他系统的情况下,以更通用的方式设计系统以实现互操作性。</li>
2558</ul>
2559</li>
2560</ul>
2561<h3>动机</h3>`,readingTime:{minutes:5.56,words:1667},title:"Chapter6 互操作性",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter7%E5%8F%AF%E4%BF%AE%E6%94%B9%E6%80%A7.html",{loader:()=>f(()=>import("./Chapter7可修改性.html-BSexyxlF.js"),__vite__mapDeps([172,161,1])),meta:{author:"chiichen",date:1702512e6,category:["课程笔记"],tag:["软件体系结构"],sticky:!1,isOriginal:!0,excerpt:`<h2>什么是可修改性(Modifiability)?</h2>
2562<ul>
2563<li>可修改性涉及变化,我们对它的兴趣在于变化的成本和风险。</li>
2564<li>为了规划可修改性,架构师必须考虑四个问题:
2565<ul>
2566<li>什么可以改变?</li>
2567<li>变化的可能性有多大?</li>
2568<li>变化何时发生,由谁进行?</li>
2569<li>变化的成本是多少?</li>
2570</ul>
2571</li>
2572</ul>
2573<h3>什么可以改变</h3>
2574<ul>
2575<li>系统的功能</li>
2576<li>
2576平台,即硬件、操作系统和中间件</li>
2577<li>系统运行的环境
2578<ul>
2579<li>必须与之互操作的系统</li>
2580<li>用于通信的协议</li>
2581</ul>
2582</li>
2583<li>容量
2584<ul>
2585<li>支持的用户数量</li>
2586<li>同时操作的数量</li>
2587</ul>
2588</li>
2589</ul>`,readingTime:{minutes:6.61,words:1982},title:"Chapter7 可修改性",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter8%E6%80%A7%E8%83%BD.html",{loader:()=>f(()=>import("./Chapter8性能.html-Chumtrc7.js"),__vite__mapDeps([173,1])),meta:{author:"chiichen",date:1702512e6,category:["课程笔记"],tag:["软件体系结构"],sticky:!1,isOriginal:!0,excerpt:`<h2>什么是性能?</h2>
2590<ul>
2591<li>它与时间有关</li>
2592<li>性能是关于时间以及软件系统满足时间要求的能力</li>
2593<li>当事件发生时,系统必须及时对其做出响应
2594<ul>
2595<li>事件包括中断、消息、来自用户或其他系统的请求,或标记时间流逝的时钟事件</li>
2596</ul>
2597</li>
2598</ul>
2599<h3>性能建模</h3>
2600<ul>
2601<li>响应时间的两个基本因素</li>
2602<li>处理时间指系统用于响应的工作时间</li>
2603<li>阻塞时间指系统无法响应的时间</li>
2604<li>阻塞时间的原因包括
2605<ul>
2606<li>资源争用</li>
2607<li>资源的可用性</li>
2608<li>对其他因素的依赖</li>
2609</ul>
2610</li>
2611</ul>`,readingTime:{minutes:9.85,words:2955},title:"Chapter8 性能",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter9%E5%AE%89%E5%85%A8%E6%80%A7.html",{loader:()=>f(()=>import("./Chapter9安全性.html-C-0F27pz.js"),__vite__mapDeps([174,1])),meta:{author:"chiichen",date:17026848e5,category:["课程笔记"],tag:["软件体系结构"],sticky:!1,isOriginal:!0,excerpt:`<h2>什么是安全(Security)</h2>
2612<ul>
2613<li>安全是系统保护数据和信息免受未经授权访问的能力的度量,同时仍然向经授权的人员和系统提供访问权限。</li>
2614<li>针对计算机系统的有意为害行为称为攻击。</li>
2615<li>攻击可以采取不同形式:
2616<ul>
2617<li>未经授权的尝试访问/修改数据或服务</li>
2618<li>旨在拒绝合法用户的服务</li>
2619</ul>
2620</li>
2621<li>安全具有三个主要特征,即 CIA:</li>
2622<li>保密性(Confidentiality)是数据或服务受到未经授权访问的保护性质。
2623<ul>
2624<li>例如,黑客无法在政府计算机上访问您的个人所得税申报表。</li>
2625</ul>
2626</li>
2627<li>完整性(Integrity)是数据或服务不受未经授权操纵的性质。
2628<ul>
2629<li>例如,您的成绩自从教师分配以来没有被更改。</li>
2630</ul>
2631</li>
2632<li>可用性(Availability)是系统能够供合法使用的性质。
2633<ul>
2634<li>例如,拒绝服务攻击阻止您从在线书店订购一本书。</li>
2635</ul>
2636</li>
2637<li>支持 CIA 的其他特征包括:
2638<ul>
2639<li>身份验证验证交易参与方的身份,并检查他们是否真实身份与其所声称的一致。</li>
2640<li>授权授予用户执行任务的权限。</li>
2641</ul>
2642</li>
2643</ul>`,readingTime:{minutes:4.02,words:1206},title:"Chapter9 安全性",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chpater21%E6%9E%B6%E6%9E%84%E8%AF%84%E4%BC%B0.html",{loader:()=>f(()=>import("./Chpater21架构评估.html-D3Xv5gSL.js"),__vite__mapDeps([175,1])),meta:{author:"chiichen",date:17028576e5,category:["课程笔记"],tag:["软件体系结构"],sticky:!1,isOriginal:!0,excerpt:`<h2>三种评估形式</h2>
2644<ul>
2645<li>设计过程中由设计师进行的评估。</li>
2646<li>设计过程中由同行进行的评估。</li>
2647<li>架构设计完成后由外部人员进行的分析。</li>
2648</ul>
2649<h3>设计师的评估(Evaluation by the Designer)</h3>
2650<ul>
2651<li>每当设计师做出关键设计决策时,应对选择的备选方案进行评估。</li>
2652<li>“生成和测试”方法中的“测试”部分。</li>
2653<li>需要进行多少分析?有三个因素包括:
2654<ul>
2655<li>决策的重要性。</li>
2656<li>潜在备选方案的数量。更多的备选方案需要更多的时间进行评估。</li>
2657<li>足够好与完美相对。不要在决策上花费超过其价值的时间。</li>
2658</ul>
2659</li>
2660</ul>`,readingTime:{minutes:9.11,words:2732},title:"Chpater21 架构评估",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/%E5%A4%8D%E4%B9%A0%E6%8F%90%E7%BA%B2.html",{loader:()=>f(()=>import("./复习提纲.html-H28RAhJM.js"),__vite__mapDeps([176,1])),meta:{author:"chiichen",date:17023392e5,category:["课程笔记"],tag:["软件体系结构"],sticky:!1,isOriginal:!0,excerpt:`<h2>Part I Introduction of software architecture</h2>
2661<p>– What? definition, 3 types of structures,architecture patterns &amp; tactics<br>
2662– Why?</p>
2663<h2>Part II Quality attributes</h2>
2664<p>– Availability, interoperability, modifiability,performance, security, testability, usability andothers<br>
2665– Definitions, general scenarios &amp; concretescenarios of quality attributes, tactics<br>
2666– Architecture patterns and tactics<br>
2667– Quality attributes modeling and analysis:availability and performance</p>`,readingTime:{minutes:.73,words:220},title:"2023年期末考复习提纲",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/2019_IT%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86_%E5%A4%8D%E4%B9%A0%E7%AC%94%E8%AE%B0.html",{loader:()=>f(()=>import("./2019_IT项目管理_复习笔记.html-BAXM3ljW.js"),__vite__mapDeps([177,1])),meta:{author:"chiichen",date:17028576e5,category:["课程笔记"],tag:["软件项目管理"],sticky:!1,excerpt:`
2668<h2>整理人:彭晓轩</h2>
2669<h2>Ver1.0 整理日期:2019/11/26</h2>
2670<h2>Ver2.0、Ver2.1 整理日期:2019/11/27</h2>
2671<h2>Ver3.0 整理日期:2019/11/29(终版,不再更新)</h2>
2672<h5>修改说明:Ver2.0 额外补充了部分知识点以及修正了部分拼写错误,Ver2.1 添加了必需的额外的中文翻译以及再次修正部分拼写错误,Ver3.0 再次添加了部分知识点,现在已经相对比较完备了,以及修正了部分拼写错误</h5>
2673<h2>注:整理不易,大家可以在这个基础上自行调整优化笔记,内容不全,3.0 版本的内容相对还是比较详细的了,⭐ 标记是笔者认为的重点,笔者建议复习的时候可以这份笔记为主,前提是已经看过一遍 PPT 或者书本!有需要的同学另外还要附加其他资料去看。转载请标明原作者和相关文档链接</h2>`,readingTime:{minutes:15.32,words:4595},title:"软件项目管理2019复习笔记",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/%E7%AC%AC10%E7%AB%A0%E9%A1%B9%E7%9B%AE%E6%B2%9F%E9%80%9A%E7%AE%A1%E7%90%86.html",{loader:()=>f(()=>import("./第10章项目沟通管理.html-C0LGDNJ3.js"),__vite__mapDeps([178,1])),meta:{author:"chiichen",date:1702944e6,category:["课程笔记"],tag:["软件项目管理"],sticky:!1,isOriginal:!0,excerpt:`<h2>讨论问题</h2>
2674<ol>
2675<li>项目沟通管理的 3 个过程</li>
2676<li>项目沟通管理计划应包括哪些内容?</li>
2677<li>发布信息应该注意哪些方面?</li>
2678<li>绩效报告</li>
2679<li>改善沟通的一些建议</li>
2680<li>如何有效开会?</li>
2681<li>如何更高效使用电子邮件或其他通讯工具?</li>
2682</ol>
2683<h2>项目沟通管理</h2>
2684<ul>
2685<li>项目沟通管理的目标是确保项目信息能够及时且适当地生成、收集、发送、存储和部署。项目沟通管理中包含以下 3 个主要过程:
2686<ol>
2687<li><code>计划沟通</code>管理包括确定干系人的信息和沟通需求——谁需要什么信息?他们什么时候需要这些信息?如何将信息发送给他们?这个过程的输出包括沟通管理计划、项目管理计划更新和项目文档更新。</li>
2688<li><code>管理沟通</code>
2688包括对沟通管理计划中的项目沟通进行创建、发布、存储、检索和处置。这个过程的主要输出包括项目沟通、项目管理计划更新、项目文档更新和组织过程资产更新。</li>
2689<li><code>控制沟通</code>包括确保干系人的沟通需求得到满足。</li>
2690</ol>
2691</li>
2692</ul>`,readingTime:{minutes:6.45,words:1936},title:"第10章 项目沟通管理",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/%E7%AC%AC11%E7%AB%A0%E9%A1%B9%E7%9B%AE%E9%A3%8E%E9%99%A9%E7%AE%A1%E7%90%86.html",{loader:()=>f(()=>import("./第11章项目风险管理.html-DJYAejeM.js"),__vite__mapDeps([179,1])),meta:{author:"chiichen",date:1702944e6,category:["课程笔记"],tag:["软件项目管理"],sticky:!1,isOriginal:!0,excerpt:`<h2>讨论问题</h2>
2693<ol>
2694<li>项目风险管理的 6 个过程</li>
2695<li>风险效用函数可以分为哪几类?</li>
2696<li>风险管理计划的主要主题?</li>
2697<li>风险的分类?</li>
2698<li>风险识别的工具包括?</li>
2699<li>风险登记册应包括哪些内容?</li>
2700<li>定性风险分析的两种方法?</li>
2701<li>定量风险分析的几个方法?</li>
2702<li>应对负风险的几种策略?</li>
2703<li>应对正风险的几种策略?</li>
2704<li>风险监控的工具和技术包括?</li>
2705</ol>
2706<h2>项目风险管理</h2>
2707<ul>
2708<li>项目风险的的一般定义是对实现项目目标可能产生消极<code>或积极</code>影响的不确定性。</li>
2709<li><code>风险效用(risk utility)</code>是指从潜在收益中获得的满足感或愉悦感的程度。如下图所示,分为:<code>风险规避型(risk-averse)</code>、<code>风险偏好型(risk-seeking)</code>和<code>风险中立型(risk-neutral)</code>,Y 轴代表效用,或者说是从人冒险中获得的愉悦。X 轴显示的是潜在的回报或机会的价值。<br>
2710</li>
2711<li>风险管理涉及 6 个主要过程: 1. 计划风险管理:针对某一项目决定如何制定与计划风险管理活动。这个过程的主要输出是风险管理计划。 2. 识别风险:指确定哪些风险会影响项目并记录风险特性的过程。这个过程的主要输出是风险登记册、风险报告和项目文档更新。 3. 实施定性风险分析:指按照发生的可能性和影响程度对风险进行优先排序的过程。在识别风险之后,项目团队可以使用各种工具和技术对风险进行排序并更新风险登记册中的信息。主要输出是项目文档更新。 4. 实施定量风险分析:指就已识别风险对项目整体目标的影响进行定量分析的过程。这个过程的主要输出是项目文档更新。 5. 计划风险响应:指采取措施来提高实现项目目标的概率、减少风险对实现项目目标的威胁的过程。利用预先制定的风险管理过程,项目团队可以制定流风险响应策略,这些策略常常导致变更请求、项目管理计划更新和项目文档更新。 6. 实施风险响应:指实施风险响应策略。输出包括变更请求和项目文档更新。 7. 监控风险:包括在项目生命周期中,监控已知的风险、识别新所的风险、实施风险响应计划,并评估风险响应策略的有效性。此过程的主要输出包括工工作绩效信息、变更请求、项目管理计划更新、项目文档更新、组织过程资产更新。<br>
2712</li>
2713</ul>`,readingTime:{minutes:20.63,words:6190},title:"第11章 项目风险管理",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/%E7%AC%AC12%E7%AB%A0%E9%A1%B9%E7%9B%AE%E9%87%87%E8%B4%AD%E7%AE%A1%E7%90%86.html",{loader:()=>f(()=>import("./第12章项目采购管理.html-Cjku4GUD.js"),__vite__mapDeps([180,1])),meta:{author:"chiichen",date:1702944e6,category:["课程笔记"],tag:["软件项目管理"],sticky:!1,isOriginal:!0,excerpt:`<h2>讨论问题</h2>
2714<ol>
2715<li>项目采购管理的 3 个过程</li>
2716<li>规划采购的工具和技巧?</li>
2717<li>采购管理计划包括的内容?</li>
2718<li>常见的采购文件?</li>
2719<li>实施采购的过程?</li>
2720</ol>
2721<h2>项目采购管理</h2>
2722<ul>
2723<li>采购(procurement)意味着从外部来源获得产品或者服务。采购一词广泛用于政府,许多私人企业使用外购和外包。</li>
2724<li>项目采购管理(project precurement management)有 3 个主要过程:
2725<ol>
2726<li><code>计划采购管理</code>包括决定采购什么、何时采购和如何采购。在采购计划中,决策者需要明确外包什么、决定合同类型,并且向潜在卖方描述工作的内容。卖方(sellers)包括承包商或向其他组织和个人æ
2726ä¾›äº§å“æˆ–服务的供应商。该过程的输出包括采购管理计划、采购策略、投标文件、采购工作说明书、来源选择标准、自制或购买决策、独立成本估算、变更请求、项目文档更新和组织过程资产更新。</li>
2727<li><code>实施采购</code>包括获得卖方回应、选择卖方并授予合同。该过程的输出包括选择卖方、达成协议、变更请求、项目管理计划更新、项目文档更新和组织过程资产更新。</li>
2728<li><code>控制采购</code>包括管理与卖方的关系、监控合同履行情况、适当地进行更改和结清合同。该过程的主要输出包括结束采购、工作绩效信息、采购文件更新、变更请求、项目管理计划更新、项目文档更新和组织过程资产更新。</li>
2729</ol>
2730</li>
2731</ul>`,readingTime:{minutes:13.26,words:3979},title:"第12章 项目采购管理",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/%E7%AC%AC13%E7%AB%A0%E9%A1%B9%E7%9B%AE%E5%B9%B2%E7%B3%BB%E4%BA%BA%E7%AE%A1%E7%90%86.html",{loader:()=>f(()=>import("./第13章项目干系人管理.html-OlNmkdFw.js"),__vite__mapDeps([181,1])),meta:{author:"chiichen",date:17031168e5,category:["课程笔记"],tag:["软件项目管理"],sticky:!1,isOriginal:!0,excerpt:`<h2>讨论问题</h2>
2732<ol>
2733<li>项目干系人管理的 4 个过程</li>
2734<li>干系人登记表包括哪些内容?</li>
2735<li>干系人参与等级?</li>
2736<li>干系人管理计划包括?</li>
2737<li>参与度控制的方法?</li>
2738<li>期望管理矩阵包括哪些条目?</li>
2739</ol>
2740<h2>项目干系人管理</h2>
2741<ul>
2742<li>项目干系人管理的目的是识别受项目影响的所有人员与组织、分析干系人的期望,并使干系人在项目的整个生命周期中有效参与项目决策。项目经理和他他们的团队必须与干系人进行良好的沟通,并及时解决问题使干系人满意。</li>
2743<li>项目干系人管理的 4 个过程如下:
2744<ol>
2745<li><code>识别干系人</code>是指识别参与项目或受项目影响的所有人员,并确确å
2745®šç®¡ç†å¹²ç³»äººå…³ç³»çš„æœ€ä½³æ–¹å¼ã€‚这个过程的主要输出是干系人登记册。</li>
2746<li><code>计划干系人</code>参与是指根据干系人的需求、兴趣和潜在影响,硕确定使干系人有效参与项目决策和活动的策略。这个过程的输出是干系人参与计划。</li>
2747<li><code>管理干系人</code>参与是指与项目干系人沟通并一同工作,从人而满足他们的需求和期望、解决问题,并促进他们参与项目决策和活动。这个过程的输出是变更请求、项目管理计划更新和项目文档更新。</li>
2748<li><code>监督干系人</code>参与是指监督干系人关系,并根据干系人的需求调整计划和策略以吸引干系人参与。这个过程的输出是工作绩效信息、变更请求、项目管理计划更新和项目文档更新。</li>
2749</ol>
2750</li>
2751</ul>`,readingTime:{minutes:8.02,words:2406},title:"第13章 项目干系人管理",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/%E7%AC%AC1%E7%AB%A0%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86%E6%A6%82%E8%BF%B0.html",{loader:()=>f(()=>import("./第1章项目管理概述.html-CwfUdhDk.js"),__vite__mapDeps([182,1])),meta:{author:"chiichen",date:17017344e5,category:["课程笔记"],tag:["软件项目管理"],sticky:!1,isOriginal:!0,excerpt:`<h2>概要</h2>
2752<ul>
2753<li>体会到对更好的项目管理(尤其是 IT 项目管理)不断增长的需求。</li>
2754<li>解释什么是项目,列举 IT 项目的例子,列出项目的各种特征,并千描述项目管理的约束。</li>
2755<li>定义项目管理,并论述项目管理框架中的关键因素,包括牙项目干系人、项目管理的知识领域、常用工具和技术,以及项目成功的要素。</li>
2756<li>讨论项目管理、项目集管理和项目组合管理之间的关系,以及它们中的每一个对企业成功的重要性。</li>
2757<li>通过描述项目经理做些什么、需要什么技能、理想的技能给组合(能力三角形)和 IT 项目经理的就业机会来了解项目经理的角色。</li>
2758<li>描述项目管理专业,包括它的历史、PMI 等专业组织的作用月、项目管理资格认证和职业道德的重要性,以及项目管理软件的更新。</li>
2759</ul>`,readingTime:{minutes:7.81,words:2344},title:"第1章 项目管理概述",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/%E7%AC%AC2%E7%AB%A0%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86%E4%B8%8EIT%E7%8E%AF%E5%A2%83.html",{loader:()=>f(()=>import("./第2章项目管理与IT环境.html-B1wrGF24.js"),__vite__mapDeps([183,1])),meta:{author:"chiichen",date:17019072e5,category:["课程笔记"],tag:["软件项目管理"],sticky:!1,isOriginal:!0,excerpt:`<h2>概要</h2>
2760<ul>
2761<li>定义项目管理的系统观以及如何将项目管理应用于 IT 项目中。</li>
2762<li>总结组织的相关要点,包括组织的 4 个框架、组织结构和组织文化。</li>
2763<li>解释为什么项目干系人管理和企业高层的承诺对项目成功至关重要。</li>
2764<li>区分项目生命周期和产品生命周期之间的异同。</li>
2765<li>讨论 IT 项目的独特性和多样性。</li>
2766<li>总结影响 IT 项目管理的最新趋势,包括全球化、外包、虚拟团队和敏捷项目管理。</li>
2767</ul>
2768<h2>项目管理的系统观</h2>
2769<p>为了高效地处理复杂的情况,项目经理必须以整体的观点认识项目,并且理<br>
2770解该项目是如何与更大的组织进行联系的。<code>系统思考(systems thinking)</code>描述了这种整体的<br>
2771观点。</p>`,readingTime:{minutes:8.78,words:2634},title:"第2章 项目管理与IT环境",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/%E7%AC%AC3%E7%AB%A0%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86%E8%BF%87%E7%A8%8B%E7%BB%84.html",{loader:()=>f(()=>import("./第3章项目管理过程组.html-DV1DJigE.js"),__vite__mapDeps([184,1])),meta:{author:"chiichen",date:17021664e5,category:["课程笔记"],tag:["软件项目管理"],sticky:!1,isOriginal:!0,excerpt:`<h2>概要</h2>
2772<ul>
2773<li>描述 5 大项目管理过程组及其各自典型的活动水平,以及它们之间的相互关系。</li>
2774<li>了解项目管理过程组与项目管理知识领域之间的相互关系。</li>
2775<li>讨论组织如何开发 IT 项目管理方法论来满足自身的需要。</li>
2776<li>回顾一个组织应用项目管理过程组管理 IT 项目的案例研究,描述每个过程组的输出,了解有效的项目启动、项目计划、项目执行、项目监控和项目收尾是如何促进项目成功的。</li>
2777<li>回顾应用敏捷方法管理的同一个 IT 项目的案例研究,并比比较敏捷方法和预测方法之间的关键区别。</li>
2778<li>描述为每个过程组创建文档的几个模板。</li>
2779</ul>`,readingTime:{minutes:6.88,words:2063},title:"第3章 项目管理过程组",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/%E7%AC%AC4%E7%AB%A0%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88%E7%AE%A1%E7%90%86.html",{loader:()=>f(()=>import("./第4章项目整合管理.html-TSXiMNjo.js"),__vite__mapDeps([185,1])),meta:{author:"chiichen",date:17021664e5,category:["课程笔记"],tag:["软件项目管理"],sticky:!1,isOriginal:!0,excerpt:`<h2>讨论问题</h2>
2780<ol>
2781<li>项目集成管理的过程</li>
2782<li>选择 IT 项目的计划过程</li>
2783<li>选择项目的 5 个常用技术</li>
2784<li>NPV 的计算步骤</li>
2785<li>综合变更控制的 3 个主要目标</li>
2786<li>在组织中,设立变更请求书的意义?如何建立一个好的变更请求管理过程?</li>
2787</ol>
2788<h2>什么是项目整合管理</h2>
2789<ul>
2790<li>
2791<p><code>项目整合管理(project integration management)</code>包括在整个项目生命周期中协调所有其他的项目管理知识领域。这种整合确保了项目的所有因素能在正确的时间集合在一起,从而成功地完成项目。根据《项目管理知识体系指南(第 6 版)》所述,项目整合管理包括 7 个主要过程:</p>
2792<ol>
2793<li>制定项目章程。即与项目干系人一起合作,制定正式批准项目的文件——章程。</li>
2794<li>制定项目管理计划。即协调项目计划的所有组成部分,并把它它们整合为一份一致的连贯的文件——项目管理计划。</li>
2795<li>指导与管理项目工作。即通过实施项目管理计划中的活动,来执行项目管理计划。</li>
2796<li>管理项目知识。即使用现有知识并生成新知识,以实现项目目标,并帮助组织学习。</li>
2797<li>监控项目工作。即监督项目工作是否符合项目的绩效目标。</li>
2798<li>实施整体变更控制。即在整个项目生命周期中识别、评估和管理变更。</li>
2799<li>项目或阶段收尾。即终结项目或阶段的所有活动,从而而正式结束项目或阶段。</li>
2800</ol>
2801</li>
2802<li>
2803<p>项目经理要协调项目资源、统领全局,解决项目冲突,而完成这些任务的首要方法就是项目整合管理</p>
2804</li>
2805<li>
2806<p>良好的项目整合管理对满足干系人的需求至关重要。项目整合管理包括界面管理。<code>界面管理(interface management)</code>涉及明确和管理众多项目元素相互作用的交界点。界面管理的主要工具是沟通和关系。随着项目参与人员的增加,交界点的数量可能会呈现指数级增长。</p>
2807</li>
2808<li>
2809<p>
2809项目整合管理是在整个组织的环境中进行的,而不仅仅发生在一个特定项目的内部。项目经理必须将项目的工作和组织的运营整合起来。</p>
2810</li>
2811</ul>`,readingTime:{minutes:24.03,words:7210},title:"第4章 项目整合管理",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/%E7%AC%AC5%E7%AB%A0%E9%A1%B9%E7%9B%AE%E8%8C%83%E5%9B%B4%E7%AE%A1%E7%90%86.html",{loader:()=>f(()=>import("./第5章项目范围管理.html-D7p1W_8m.js"),__vite__mapDeps([186,1])),meta:{author:"chiichen",date:17023392e5,category:["课程笔记"],tag:["软件项目管理"],sticky:!1,isOriginal:!0,excerpt:`<h2>讨论问题</h2>
2812<ol>
2813<li>项目范围管理涉及的 6 个主要过程</li>
2814<li>范围管理计划包括哪些信息?</li>
2815<li>收集需求的常用方法</li>
2816<li>制定工作分解结构(WBS)的方法</li>
2817<li>范围控制的目标</li>
2818<li>公司应遵循哪些最佳实践来避免出现主要的范围问题?</li>
2819<li>范围蔓延产生的原因?是否可以避免?如何预防范围蔓延的产生?</li>
2820</ol>
2821<h2>什么是项目范围管理</h2>
2822<ul>
2823<li>项目管理最重要也最难做的一项工作就是定义项目范围。范围是指开发项目产品所涉及的所有工作和用于开发产品的所有过程。</li>
2824<li>项目范围管理(project scope management)是指界定和控制项目中应包括什么和不包括什么所涉及的过程。该过程确保了项目团队和干系人对项目的可交付成果以及生产这些可交付成果所进行的工作达成共识。项目范围管理包含 6 个主要过程:
2825<ol>
2826<li>计划范围管理:是指确定如何管理项目的范围和需求。</li>
2827<li>收集需求:是指定义并记录产品的特点和功能,以及开发这些品的过程。</li>
2828<li>定义范围:是指审查范围管理计划、项目章程、需求文档和组织过程资产来制定一份范围说明书,并且在需求的扩展和变更请求得到批准时增加更多的信息。</li>
2829<li>创建工作分解结构:是指将主要的项目可交付成果分解成更细小和更易管理的组成部分。</li>
2830<li>确认范围:是指项目可交付成果的正式验收。关键项目干系人,比如项目的客户以及项目发起人在这一过程中进行审查,然后正式验收项目的可交付成果。如果不接受现在的可交付成果,那么客户或项目发起人通常会请求变更。</li>
2831<li>控制范围:是指对项目范围的变化进行控制,这对许多 IT 项目而言是一种挑战。范围变更经常影响团队实现项目的时间目标和成本目标的能力,因此项目经理必须仔细权衡范围变更的成本及收益。</li>
2832</ol>
2833</li>
2834</ul>`,readingTime:{minutes:14.43,words:4329},title:"第5章 项目范围管理",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/%E7%AC%AC6%E7%AB%A0%E9%A1%B9%E7%9B%AE%E8%BF%9B%E5%BA%A6%E7%AE%A1%E7%90%86.html",{loader:()=>f(()=>import("./第6章项目进度管理.html-CwJo0WPY.js"),__vite__mapDeps([187,1])),meta:{author:"chiichen",date:17027712e5,category:["课程笔记"],tag:["软件项目管理"],sticky:!1,isOriginal:!0,excerpt:`<h2>讨论问题</h2>
2835<ol>
2836<li>项目进度管理中的 6 个主要过程</li>
2837<li>一个进度管理计划应该包括哪些信息?</li>
2838<li>依赖的四种类型</li>
2839<li>辅助进度制订过程的工具和技术有哪些?</li>
2840<li>SMART 准则是怎样定义里程碑的?</li>
2841<li>使用关键路径来缩短项目进度有哪三个主要技术?</li>
2842</ol>
2843<h2>项目进度管理(Project Schedule Management)中的 6 个主要过程</h2>
2844<ol>
2845<li><code>计划进度管理</code>是指确定将用于计划、执行和控制项目进度的政策、流程和文档。</li>
2846<li><code>定义活动</code>是指识别项目团队成员和干系人必须执行并产生生项目的可交付成果的特定活动。<code>活动(activity)</code>或<code>任务(task)</code>是工作的组成要素,通常出出现在工作分解结构中,有预计的持续时间、成本和资源要求。</li>
2847<li><code>排列活动顺序</code>是指识别和记录项目活动之间的关系,包括需求农、资源分解结构和项目文档更新。</li>
2848<li><code>估算活动持续时间</code>是指估算完成单项活动所需的工作时间。</li>
2849<li><code>制定进度计划</code>是指分析活动顺序、资源需求和活动持续时间估算来创建项目进度计划。</li>
2850<li><code>控制进度</code>是指控制和管理项目进度的变更。</li>
2851</ol>`,readingTime:{minutes:20.89,words:6268},title:"第6章 项目进度管理",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/%E7%AC%AC7%E7%AB%A0%E9%A1%B9%E7%9B%AE%E6%88%90%E6%9C%AC%E7%AE%A1%E7%90%86.html",{loader:()=>f(()=>import("./第7章项目成本管理.html-DXGdGUPF.js"),__vite__mapDeps([188,1])),meta:{author:"chiichen",date:17028576e5,category:["课程笔记"],tag:["软件项目管理"],sticky:!1,isOriginal:!0,excerpt:`<h2>讨论问题</h2>
2852<ol>
2853<li>项目成本管理的 4 个过程</li>
2854<li>成本管理计划应该包括哪些信息?</li>
2855<li>三种基本的成本估算类型</li>
2856<li>成本估算的工具和技术有哪些?</li>
2857<li>挣值公式(EV, CV, SV, CPI, SPI)</li>
2858</ol>
2859<h2>项目成本管理</h2>
2860<ul>
2861<li>成本<code>超支(overrun)</code>是实际成本超过估计的额外百分比或金额。</li>
2862<li>本章通过计划成本管理、创建良好的成本估算以及ä
2862½¿ç”¨æŒ£å€¼ç®¡ç†(EVM)来辅助成本控制</li>
2863</ul>
2864<h3>项目成本管理是什么</h3>`,readingTime:{minutes:16.47,words:4941},title:"第7章 项目成本管理",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/%E7%AC%AC8%E7%AB%A0%E9%A1%B9%E7%9B%AE%E8%B4%A8%E9%87%8F%E7%AE%A1%E7%90%86.html",{loader:()=>f(()=>import("./第8章项目质量管理.html-DIKn7aO8.js"),__vite__mapDeps([189,1])),meta:{author:"chiichen",date:17028576e5,category:["课程笔记"],tag:["软件项目管理"],sticky:!1,isOriginal:!0,excerpt:`<h2>讨论问题</h2>
2865<ol>
2866<li>项目质量管理的 3 个过程</li>
2867<li>IT 项目中影响质量的重要范围部分包括什么?</li>
2868<li>质量控制过程的主要输出是什么?</li>
2869<li>7 种基本的质量工具</li>
2870<li>DMAIC 改进过程代表哪五个阶段</li>
2871<li>CMMI 的能力层级有哪几个</li>
2872</ol>
2873<h2>项目质量管理</h2>
2874<ul>
2875<li><code>项目质量管理(project quality management)</code>的目的是确保项目满足它所应满足的需求。</li>
2876<li>项目质量管理包括 3 个主要过程:
2877<ol>
2878<li><code>计划质量管理</code>包括确定哪些质量要求和标准与项目相关,以及如何满足这些要求和标准。将质量标准纳入项目设计是质量计划的关键部分。质量计划的主要要输出是质量管理计划、质量度量标准、项目管理计划更新和项目文档更新。<code>度量标准(metric)</code>是一个测量标准。常见的度量标准包括产品的故障率、产品和服务的可用性以及客户满意度。</li>
2879<li><code>管理质量</code>包括将质量管理计划转换为可执行的质量活动。这些些活动必须遵守组织的质量政策。该过程的主要输出是质量报告、测试和评估文档、变更更请求、项目管理计划更新以及项目文档更新。</li>
2880<li><code>控制质量</code>包括监控具体的项目结果,以确保它们是完整的、正确的并满足客户的期望。这个过程通常与技术工具及质量管理技术相关,如帕累托图、质量控制图及统计抽样。质量控制的主要输出包括质量控制测量、经验证的可交付成果、工作绩效信息、变更请求、项目管理计划更新和项目文档更新。</li>
2881</ol>
2882</li>
2883</ul>`,readingTime:{minutes:15.75,words:4726},title:"第8章 项目质量管理",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/%E7%AC%AC9%E7%AB%A0%E9%A1%B9%E7%9B%AE%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86.html",{loader:()=>f(()=>import("./第9章项目资源管理.html-B3BBa8Iz.js"),__vite__mapDeps([190,1])),meta:{author:"chiichen",date:17028576e5,category:["课程笔记"],tag:["软件项目管理"],sticky:!1,isOriginal:!0,excerpt:`<h2>讨论问题</h2>
2884<ol>
2885<li>项目资源管理的 6 个过程</li>
2886<li>马斯洛需求层次理论从低到高是哪几层?</li>
2887<li>项目经理运用哪 7 种习惯来提高项目工作的效率?</li>
2888<li>资源平衡的优点是什么</li>
2889<li>塔克曼模型描述的团队建设的 5 个阶段?</li>
2890<li>管理项目团队的工具和技术</li>
2891</ol>
2892<h2>项目资源管理</h2>
2893<ul>
2894<li>项目资源管理包含使项目涉及的人力和物力资源(设施、设备、材料、物资等)得到最有效利用的全过程。人力资源管理包括所有的项目干系人:发起人、客户、项目团队成员、支持人员以及项目供应商等。项目资源管理包括以下 6 个过程:
2895<ol>
2896<li><code>计划资源管理</code>包括确定如何评估、获取、管理和使用项目资源。这个过程的主要输出是资源管理计划、团队章程和项目文档更新。</li>
2897<li><code>估算活动资源</code>包括估算完成项目工作所需的人力和物力资源。输出包括资源需求、估算依据、资源分解结构和项目文档更新。</li>
2898<li><code>获取资源</code>包括获取团队成员、设施、设备、材料、物资和其他所需资源。输出包括物力资源和项目团队分配、资源日历、请求更改和一些文档的更新。</li>
2899<li><code>建设项目团队</code>包括为了提高项目绩效而对个人技能和项目团队技能的建设。团队建设技能对许多项目经理来说通常是一个挑战。这个过程的主要输出是团队绩效评估、变更请求和一些文档的更新。</li>
2900<li><code>管理项目团队</code>包括跟踪团队成员绩效、激励团队成员、提供及时反馈、解决问题和冲突,以及协调变化来帮助提高项目绩效。这个过程的输出包括变更请求、项目管理计划更新、项目文档更新和组织过程资产更新。</li>
2901<li><code>控制资源</code>保证项目的物力资源能按计划获取,监控计划与实际的资源利用率,并在需要时采取纠正措施。输出包括工作绩效信息、变更请求、项目管理计划更新和项目文档更新。</li>
2902</ol>
2903</li>
2904</ul>`,readingTime:{minutes:22.82,words:6845},title:"第9章 项目资源管理",icon:"page",order:1,type:"article"}}],["/posts/Linux%E5%86%85%E6%A0%B8/%E5%86%85%E6%A0%B8%E5%BC%80%E5%8F%91/eBPF%E5%BC%80%E5%8F%91/eBPF%E5%BC%80%E5%8F%91%E5%85%A5%E9%97%A8.html",{loader:()=>f(()=>import("./eBPF开发入门.html--jgOkGqr.js"),__vite__mapDeps([191,1])),meta:{author:"chiichen",date:17000064e5,category:["杂谈","Linux内核"],tag:["Linux内核","eBPF"],sticky:!1,excerpt:`<h2>依赖安装</h2>
2905<h3>Rust 安装</h3>
2906<p>
2906需要安装 Nightly 版本,略</p>
2907<h3>系统依赖安装</h3>
2908<p>安装 bpf-linker 依赖和 bpftool 工具</p>
2909<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> apt-get</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> update</span></span>
2910<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> apt-get</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> llvm</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> clang</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -y</span></span>
2911<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">cargo</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> bpf-linker</span></span></code></pre>
2912<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>`,readingTime:{minutes:5.96,words:1788},title:"eBPF开发入门",icon:"page",order:1,type:"article"}}],["/posts/Linux%E5%86%85%E6%A0%B8/%E5%86%85%E6%A0%B8%E5%BC%80%E5%8F%91/eBPF%E5%BC%80%E5%8F%91/eBPF%E8%BF%9B%E9%98%B6.html",{loader:()=>f(()=>import("./eBPF进阶.html-DOoMWt7o.js"),__vite__mapDeps([192,1])),meta:{author:"chiichen",date:17000928e5,category:["杂谈","Linux内核"],tag:["Linux内核","eBPF"],sticky:!1,excerpt:`<h2>背景</h2>
2913<p>在上一篇博客中我们跟着官方的 example 完成了一个 eBPF 应用的运行,接下来就要尝试为自己的需求编写一个 eBPF 应用了。我的需求是获取一个应用负载在内存地址空间上的访存频率。初步的想法是利用 Numa Balancing 中的 Page 标记,通过 Page-fault 计数来实现这个功能。</p>
2914<h2>前期构建</h2>
2915<p>首先,我们是需要知道哪个 tracepoint 可以提供给我们的 eBPF 程序来挂载。</p>
2916<p>通过命令来获取内核提供的 Tracepoint:</p>
2917<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">$</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> sudo</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">  find</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> /sys/kernel/debug/tracing/events</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -type</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> d</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> | </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">grep</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> page_fault</span></span>
2918<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">/sys/kernel/debug/tracing/events/kvmmmu/handle_mmio_page_fault</span></span>
2919<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">/sys/kernel/debug/tracing/events/kvmmmu/fast_page_fault</span></span>
2920<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">/sys/kernel/debug/tracing/events/kvm/kvm_page_fault</span></span>
2921<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">/sys/kernel/debug/tracing/events/iommu/io_page_fault</span></span>
2922<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">/sys/kernel/debug/tracing/events/exceptions/page_fault_user</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> # 这是我们想要的</span></span>
2923<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">/sys/kernel/debug/tracing/events/exceptions/page_fault_kernel</span></span></code></pre>
2924<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>`,readingTime:{minutes:1.54,words:462},title:"eBPF进阶",icon:"page",order:1,type:"article"}}],["/posts/Linux%E5%86%85%E6%A0%B8/%E5%86%85%E6%A0%B8%E5%BC%80%E5%8F%91/%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/parsec3.0%E4%BB%8B%E7%BB%8D%E5%92%8C%E5%AE%89%E8%A3%85.html",{loader:()=>f(()=>import("./parsec3.0介绍和安装.html-yqyt2yCI.js"),__vite__mapDeps([193,1])),meta:{author:"chiichen",date:17000064e5,category:["Linux内核"],tag:["Linux内核","性能测试"],sticky:!1,excerpt:`<h2>转载信息</h2>
2925<p>转载自<a href="https://www.jianshu.com/p/b301f0dc0678" target="_blank" rel="noopener noreferrer">parsec3.0 介绍和安装</a></p>
2926<h2>依赖安装</h2>
2927<h3>安装 gcc g++ m4</h3>
2928<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 如果是 Ubuntu 请使用 yum install gcc gcc-c++ m4 -y</span></span>
2929<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">yum</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> gcc</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> gcc-c++</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> m4</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -y</span></span></code></pre>
2930<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div>`,readingTime:{minutes:2.2,words:661},title:"PARSEC测试套件 3.0 介绍和安装",icon:"page",order:1,type:"article"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E5%A4%A7%E7%89%A9/%E5%85%B7%E4%BD%93%E6%8E%A8%E5%AF%BC/%E5%AE%9E%E5%BF%83%E5%B8%A6%E7%82%B9%E7%90%83%E4%BD%93%E9%9D%99%E7%94%B5%E8%83%BD%E7%9A%84%E6%8E%A8%E5%AF%BC.html",{loader:()=>f(()=>import("./实心带点球体静电能的推导.html-BQSQ619B.js"),__vite__mapDeps([194,1])),meta:{author:"chiichen",date:16776288e5,category:["课程笔记"],tag:["计算机网络"],sticky:!1,isOriginal:!0,excerpt:`<h2>推导过程</h2>
2931<p>当我们考虑一个实心球体的静电能时,我们可以假设球体带有均匀的电荷密度。我们希望推导出球体的静电能,即球体内部的电荷与外部的电荷之间的相互作用能。</p>
2932<p>首先,考虑球体内部的一个体积元素,该体积元素距离球心的距离为。该体积元素所带电荷量可以表示为:</p>
2933<p>接下来,我们考虑球体内部的一个点电荷元素与体积元素之间的相互作用能。根据库伦定律,两个电荷之间的相互作用能可以表示为:</p>
2934<p>其中,是真空介电常数。</p>
2935<p>现在我们来计算球体内部的所有点电荷元素与体积元素之间的相互作用能的总和。由于球体带有均匀的电荷密度,我们可以将看作是球体内部的其他体积元素的电荷,而表示的体积元素则是球体内部的一个体积小球。因此,我们可以将表示为球体内部的所有体积小球与其他体积元素之间相互作用能的总和。这可以通过对体积元素进行积分来实现。</p>`,readingTime:{minutes:2.93,words:880},title:"实心带点球体静电能的推导",icon:"page",order:1,type:"article"}}],["/404.html",{loader:()=>f(()=>import("./404.html-DV9s1QPM.js"),__vite__mapDeps([195,1])),meta:{title:""}}],["/en/posts/",{loader:()=>f(()=>import("./index.html-Dcg9IgOc.js"),__vite__mapDeps([196,1])),meta:{title:"Posts"}}],["/notes/UML/",{loader:()=>f(()=>import("./index.html-DpWoDPUH.js"),__vite__mapDeps([197,1])),meta:{title:"UML"}}],["/notes/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/",{loader:()=>f(()=>import("./index.html-D1NgC7iz.js"),__vite__mapDeps([198,1])),meta:{title:"软件体系结构"}}],["/posts/DragonOS/",{loader:()=>f(()=>import("./index.html-Cnz2Q9dZ.js"),__vite__mapDeps([199,1])),meta:{title:"Dragon OS"}}],["/posts/Linux%E5%86%85%E6%A0%B8/",{loader:()=>f(()=>import("./index.html-BKRjkylM.js"),__vite__mapDeps([200,1])),meta:{title:"Linux内核"}}],["/posts/Rust/",{loader:()=>f(()=>import("./index.html-BkxL9G7_.js"),__vite__mapDeps([201,1])),meta:{title:"Rust"}}],["/posts/rcc%E7%BC%96%E8%AF%91%E5%99%A8/",{loader:()=>f(()=>import("./index.html-B1Yh9mmK.js"),__vite__mapDeps([202,1])),meta:{title:"Rcc编译器"}}],["/posts/%E5%BE%AE%E4%BF%A1/",{loader:()=>f(()=>import("./index.html-FTmIUoTB.js"),__vite__mapDeps([203,1])),meta:{title:"微信"}}],["/posts/Linux%E5%86%85%E6%A0%B8/Patch%E8%A7%A3%E8%AF%BB/",{loader:()=>f(()=>import("./index.html-ATb4HyhK.js"),__vite__mapDeps([204,1])),meta:{title:"Patch解读"}}],["/posts/Linux%E5%86%85%E6%A0%B8/%E5%86%85%E6%A0%B8%E5%88%86%E6%9E%90/",{loader:()=>f(()=>import("./index.html-BQK6UsSw.js"),__vite__mapDeps([205,1])),meta:{title:"内核分析"}}],["/posts/Linux%E5%86%85%E6%A0%B8/%E5%86%85%E6%A0%B8%E5%BC%80%E5%8F%91/",{loader:()=>f(()=>import("./index.html-DrOCFIpg.js"),__vite__mapDeps([206,1])),meta:{title:"内核开发"}}],["/posts/%E6%9D%82%E8%B0%88/Debug%E6%9D%82%E8%B0%88/",{loader:()=>f(()=>import("./index.html-DBU1K_mw.js"),__vite__mapDeps([207,1])),meta:{title:"Debug杂谈"}}],["/posts/%E6%9D%82%E8%B0%88/",{loader:()=>f(()=>import("./index.html-DBryfvtk.js"),__vite__mapDeps([208,1])),meta:{title:"杂谈"}}],["/posts/%E6%9D%82%E8%B0%88/%E7%BC%96%E7%A8%8B%E6%9D%82%E8%B0%88/",{loader:()=>f(()=>import("./index.html-DSDCueEQ.js"),__vite__mapDeps([209,1])),meta:{title:"编程杂谈"}}],["/posts/%E6%9D%82%E8%B0%88/%E9%9D%A2%E7%BB%8F/",{loader:()=>f(()=>import("./index.html-DkvAVC3c.js"),__vite__mapDeps([210,1])),meta:{title:"面经"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/UML/",{loader:()=>f(()=>import("./index.html-CVbIAoDQ.js"),__vite__mapDeps([211,1])),meta:{title:"UML"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/",{loader:()=>f(()=>import("./index.html-DpgRwehu.js"),__vite__mapDeps([212,1])),meta:{title:"课程笔记"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E5%A4%A7%E7%89%A9/",{loader:()=>f(()=>import("./index.html-CSsf5bFD.js"),__vite__mapDeps([213,1])),meta:{title:"大物"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/",{loader:()=>f(()=>import("./index.html-D27VIWIF.js"),__vite__mapDeps([214,1])),meta:{title:"操作系统"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E5%BA%93/",{loader:()=>f(()=>import("./index.html-B_kOGNbv.js"),__vite__mapDeps([215,1])),meta:{title:"数据库"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E7%94%B5%E5%B7%A5/",{loader:()=>f(()=>import("./index.html-DU0KML1V.js"),__vite__mapDeps([216,1])),meta:{title:"电工"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E7%BC%96%E8%AF%91%E5%8E%9F%E7%90%86/",{loader:()=>f(()=>import("./index.html-D1rkzPei.js"),__vite__mapDeps([217,1])),meta:{title:"编译原理"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/",{loader:()=>f(()=>import("./index.html-C8lvctGT.js"),__vite__mapDeps([218,1])),meta:{title:"计算机网络"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/",{loader:()=>f(()=>import("./index.html-CwQr9tB-.js"),__vite__mapDeps([219,1])),meta:{title:"软件体系结构"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/",{loader:()=>f(()=>import("./index.html-BjU-G-oI.js"),__vite__mapDeps([220,1])),meta:{title:"软件项目管理"}}],["/posts/Linux%E5%86%85%E6%A0%B8/%E5%86%85%E6%A0%B8%E5%BC%80%E5%8F%91/eBPF%E5%BC%80%E5%8F%91/",{loader:()=>f(()=>import("./index.html-BBVwDLPB.js"),__vite__mapDeps([221,1])),meta:{title:"E BPF开发"}}],["/posts/Linux%E5%86%85%E6%A0%B8/%E5%86%85%E6%A0%B8%E5%BC%80%E5%8F%91/%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/",{loader:()=>f(()=>import("./index.html-wjaD3daL.js"),__vite__mapDeps([222,1])),meta:{title:"性能测试"}}],["/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E5%A4%A7%E7%89%A9/%E5%85%B7%E4%BD%93%E6%8E%A8%E5%AF%BC/",{loader:()=>f(()=>import("./index.html-B7zE7Q9s.js"),__vite__mapDeps([223,1])),meta:{title:"具体推导"}}],["/category/",{loader:()=>f(()=>import("./index.html-D_vQFdsU.js"),__vite__mapDeps([224,1])),meta:{title:"分类",index:!1}
2935}],["/category/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/",{loader:()=>f(()=>import("./index.html-DilxTCk_.js"),__vite__mapDeps([225,1])),meta:{title:"课程笔记 分类",index:!1}}],["/category/dragonos/",{loader:()=>f(()=>import("./index.html-CnZ45Uuc.js"),__vite__mapDeps([226,1])),meta:{title:"DragonOS 分类",index:!1}}],["/category/%E7%AC%94%E8%AE%B0/",{loader:()=>f(()=>import("./index.html-DZ5tg3ni.js"),__vite__mapDeps([227,1])),meta:{title:"笔记 分类",index:!1}}],["/category/linux-%E5%86%85%E6%A0%B8/",{loader:()=>f(()=>import("./index.html-jU68d02k.js"),__vite__mapDeps([228,1])),meta:{title:"Linux 内核 分类",index:!1}}],["/category/rust/",{loader:()=>f(()=>import("./index.html-k3YCqsy5.js"),__vite__mapDeps([229,1])),meta:{title:"Rust 分类",index:!1}}],["/category/%E5%90%8E%E7%AB%AF/",{loader:()=>f(()=>import("./index.html-CNhZRGSk.js"),__vite__mapDeps([230,1])),meta:{title:"后端 分类",index:!1}}],["/category/c__/",{loader:()=>f(()=>import("./index.html-DcQYggPt.js"),__vite__mapDeps([231,1])),meta:{title:"C++ 分类",index:!1}}],["/category/%E7%BC%96%E8%AF%91%E5%99%A8/",{loader:()=>f(()=>import("./index.html-CCI9xwiK.js"),__vite__mapDeps([232,1])),meta:{title:"编译器 分类",index:!1}}],["/category/%E5%BE%AE%E4%BF%A1/",{loader:()=>f(()=>import("./index.html-8lTzfNMG.js"),__vite__mapDeps([233,1])),meta:{title:"微信 分类",index:!1}}],["/category/linux%E5%86%85%E6%A0%B8/",{loader:()=>f(()=>import("./index.html-D6QDlfNa.js"),__vite__mapDeps([234,1])),meta:{title:"Linux内核 分类",index:!1}}],["/category/%E6%9D%82%E8%B0%88/",{loader:()=>f(()=>import("./index.html-jVqdmdpt.js"),__vite__mapDeps([235,1])),meta:{title:"杂谈 分类",index:!1}}],["/category/debug%E6%9D%82%E8%B0%88/",{loader:()=>f(()=>import("./index.html-qpuhgllv.js"),__vite__mapDeps([236,1])),meta:{title:"Debug杂谈 分类",index:!1}}],["/category/%E7%BD%91%E7%BB%9C%E9%97%AE%E9%A2%98/",{loader:()=>f(()=>import("./index.html-BOjteK4x.js"),__vite__mapDeps([237,1])),meta:{title:"网络问题 分类",index:!1}}],["/category/%E7%BC%96%E7%A8%8B%E6%9D%82%E8%B0%88/",{loader:()=>f(()=>import("./index.html-BHW9IgeH.js"),__vite__mapDeps([238,1])),meta:{title:"编程杂谈 分类",index:!1}}],["/category/%E9%9D%A2%E7%BB%8F/",{loader:()=>f(()=>import("./index.html-qePvQ5JA.js"),__vite__mapDeps([239,1])),meta:{title:"面经 分类",index:!1}}],["/en/category/",{loader:()=>f(()=>import("./index.html-qGyZD0wt.js"),__vite__mapDeps([240,1])),meta:{title:"Category",index:!1}}],["/tag/",{loader:()=>f(()=>import("./index.html-DQp6ZkyO.js"),__vite__mapDeps([241,1])),meta:{title:"标签",index:!1}}],["/tag/%E5%A4%A7%E5%AD%A6%E7%89%A9%E7%90%86/",{loader:()=>f(()=>import("./index.html-DAKoyw8C.js"),__vite__mapDeps([242,1])),meta:{title:"标签: 大学物理",index:!1}}],["/tag/%E7%BC%96%E8%AF%91%E5%8E%9F%E7%90%86/",{loader:()=>f(()=>import("./index.html-BnRWuDam.js"),__vite__mapDeps([243,1])),meta:{title:"标签: 编译原理",index:!1}}],["/tag/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/",{loader:()=>f(()=>import("./index.html-DeeWx8t7.js"),__vite__mapDeps([244,1])),meta:{title:"标签: 计算机网络",index:!1}}],["/tag/%E6%95%B0%E6%8D%AE%E5%BA%93/",{loader:()=>f(()=>import("./index.html-WMK7AWly.js"),__vite__mapDeps([245,1])),meta:{title:"标签: 数据库",index:!1}}],["/tag/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/",{loader:()=>f(()=>import("./index.html-CKDsLbz3.js"),__vite__mapDeps([246,1])),meta:{title:"标签: 操作系统",index:!1}}],["/tag/%E8%BD%AF%E4%BB%B6%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/",{loader:()=>f(()=>import("./index.html-CB2lTQ_q.js"),__vite__mapDeps([247,1])),meta:{title:"标签: 软件项目管理",index:!1}}],["/tag/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95%E4%B8%8E%E7%BB%B4%E6%8A%A4/",{loader:()=>f(()=>import("./index.html-C9tyrsGX.js"),__vite__mapDeps([248,1])),meta:{title:"标签: 软件测试与维护",index:!1}}],["/tag/uml/",{loader:()=>f(()=>import("./index.html-CdKNtx-B.js"),__vite__mapDeps([249,1])),meta:{title:"标签: UML",index:!1}}],["/tag/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/",{loader:()=>f(()=>import("./index.html-CzZ4JKQL.js"),__vite__mapDeps([250,1])),meta:{title:"标签: 软ä
2935»¶ä½“系结构",index:!1}}],["/tag/dragonos/",{loader:()=>f(()=>import("./index.html-DYfJMyxV.js"),__vite__mapDeps([251,1])),meta:{title:"标签: DragonOS",index:!1}}],["/tag/linux-%E5%86%85%E6%A0%B8/",{loader:()=>f(()=>import("./index.html-DriE9wDH.js"),__vite__mapDeps([252,1])),meta:{title:"标签: Linux 内核",index:!1}}],["/tag/%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86/",{loader:()=>f(()=>import("./index.html-D95HKI4r.js"),__vite__mapDeps([253,1])),meta:{title:"标签: 内存管理",index:!1}}],["/tag/numa/",{loader:()=>f(()=>import("./index.html-C7tk-ejl.js"),__vite__mapDeps([254,1])),meta:{title:"标签: NUMA",index:!1}}],["/tag/%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83/",{loader:()=>f(()=>import("./index.html-BwgW4E-j.js"),__vite__mapDeps([255,1])),meta:{title:"标签: 开发环境",index:!1}}],["/tag/rust/",{loader:()=>f(()=>import("./index.html-9VhO3xlj.js"),__vite__mapDeps([256,1])),meta:{title:"标签: Rust",index:!1}}],["/tag/%E5%90%8E%E7%AB%AF/",{loader:()=>f(()=>import("./index.html-DAhHl2op.js"),__vite__mapDeps([257,1])),meta:{title:"标签: 后端",index:!1}}],["/tag/grpc/",{loader:()=>f(()=>import("./index.html-xA0eyb6O.js"),__vite__mapDeps([258,1])),meta:{title:"标签: gRPC",index:!1}}],["/tag/go/",{loader:()=>f(()=>import("./index.html-C_eX1Ynf.js"),__vite__mapDeps([259,1])),meta:{title:"标签: go",index:!1}
2935}],["/tag/c__/",{loader:()=>f(()=>import("./index.html-DOKQ2ISX.js"),__vite__mapDeps([260,1])),meta:{title:"标签: C++",index:!1}}],["/tag/%E7%BC%96%E8%AF%91%E5%99%A8/",{loader:()=>f(()=>import("./index.html-BORN9I3_.js"),__vite__mapDeps([261,1])),meta:{title:"标签: 编译器",index:!1}}],["/tag/%E8%AF%8D%E6%B3%95%E5%88%86%E6%9E%90/",{loader:()=>f(()=>import("./index.html-CWT09Wu0.js"),__vite__mapDeps([262,1])),meta:{title:"标签: 词法分析",index:!1}}],["/tag/%E5%BE%AE%E4%BF%A1/",{loader:()=>f(()=>import("./index.html-C2nAykk6.js"),__vite__mapDeps([263,1])),meta:{title:"标签: 微信",index:!1}}],["/tag/%E5%AE%A2%E6%88%B7%E7%AB%AF/",{loader:()=>f(()=>import("./index.html--g6J5k6Z.js"),__vite__mapDeps([264,1])),meta:{title:"标签: 客户端",index:!1}}],["/tag/linux%E5%86%85%E6%A0%B8/",{loader:()=>f(()=>import("./index.html-wVhHts_p.js"),__vite__mapDeps([265,1])),meta:{title:"标签: Linux内核",index:!1}}],["/tag/android/",{loader:()=>f(()=>import("./index.html-OpyBQpG0.js"),__vite__mapDeps([266,1])),meta:{title:"标签: Android",index:!1}}],["/tag/debug/",{loader:()=>f(()=>import("./index.html-CB9YnIe0.js"),__vite__mapDeps([267,1])),meta:{title:"标签: Debug",index:!1}}],["/tag/%E7%BD%91%E7%BB%9C%E9%97%AE%E9%A2%98/",{loader:()=>f(()=>import("./index.html-Ca_BYD7r.js"),__vite__mapDeps([268,1])),meta:{title:"标签: 网络问题",index:!1}}],["/tag/macos/",{loader:()=>f(()=>import("./index.html-C2iVoXbw.js"),__vite__mapDeps([269,1])),meta:{title:"标签: MacOS",index:!1}}],["/tag/general-protection/",{loader:()=>f(()=>import("./index.html-Bj_yKuof.js"),__vite__mapDeps([270,1])),meta:{title:"标签: General Protection",index:!1}}],["/tag/github-workflow/",{loader:()=>f(()=>import("./index.html-BWCouv6v.js"),__vite__mapDeps([271,1])),meta:{title:"标签: Github Workflow",index:!1}
vendor: 25,801 bytes, lines 2935-2943
2935}],["/tag/%E6%9D%82%E8%B0%88%E7%BC%96%E7%A8%8B%E6%9D%82%E8%B0%88/",{loader:()=>f(()=>import("./index.html-DGmpymMc.js"),__vite__mapDeps([272,1])),meta:{title:"标签: 杂谈/编程杂谈",index:!1}}],["/tag/%E9%9D%A2%E7%BB%8F/",{loader:()=>f(()=>import("./index.html-l9UggtWt.js"),__vite__mapDeps([273,1])),meta:{title:"标签: 面经",index:!1}}],["/tag/ebpf/",{loader:()=>f(()=>import("./index.html-B--YBRDl.js"),__vite__mapDeps([274,1])),meta:{title:"标签: eBPF",index:!1}}],["/tag/%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/",{loader:()=>f(()=>import("./index.html-BIfAGlxE.js"),__vite__mapDeps([275,1])),meta:{title:"标签: 性能测试",index:!1}}],["/en/tag/",{loader:()=>f(()=>import("./index.html-BUSptF5Z.js"),__vite__mapDeps([276,1])),meta:{title:"Tag",index:!1}}],["/article/",{loader:()=>f(()=>import("./index.html-BD22xLUY.js"),__vite__mapDeps([277,1])),meta:{title:"文章",index:!1}}],["/en/article/",{loader:()=>f(()=>import("./index.html-ByAT6Nhr.js"),__vite__mapDeps([278,1])),meta:{title:"Articles",index:!1}}],["/star/",{loader:()=>f(()=>import("./index.html-M6CCUenj.js"),__vite__mapDeps([279,1])),meta:{title:"星标",index:!1}}],["/en/star/",{loader:()=>f(()=>import("./index.html-BxTkUZy6.js"),__vite__mapDeps([280,1])),meta:{title:"Star",index:!1}}],["/timeline/",{loader:()=>f(()=>import("./index.html-BgP9Haxr.js"),__vite__mapDeps([281,1])),meta:{title:"时间轴",index:!1}}],["/en/timeline/",{loader:()=>f(()=>import("./index.html-W-jWEkAG.js"),__vite__mapDeps([282,1])),meta:{title:"Timeline",index:!1}}]]);/*!
2936 * vue-router v4.6.3
2937 * (c) 2025 Eduardo San Martin Morote
2938 * @license MIT
2939 */const $n=typeof document<"u";function Wc(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function KE(e){return e.__esModule||e[Symbol.toStringTag]==="Module"||e.default&&Wc(e.default)}const he=Object.assign;function Zl(e,t){const n={};for(const i in t){const l=t[i];n[i]=Tt(l)?l.map(e):e(l)}return n}const Bi=()=>{},Tt=Array.isArray;function Fs(e,t){const n={};for(const i in e)n[i]=i in t?t[i]:e[i];return n}const Gc=/#/g,QE=/&/g,YE=/\//g,JE=/=/g,XE=/\?/g,qc=/\+/g,ZE=/%5B/g,e0=/%5D/g,Kc=/%5E/g,t0=/%60/g,Qc=/%7B/g,n0=/%7C/g,Yc=/%7D/g,i0=/%20/g;function fr(e){return e==null?"":encodeURI(""+e).replace(n0,"|").replace(ZE,"[").replace(e0,"]")}function l0(e){return fr(e).replace(Qc,"{").replace(Yc,"}").replace(Kc,"^")}function ka(e){return fr(e).replace(qc,"%2B").replace(i0,"+").replace(Gc,"%23").replace(QE,"%26").replace(t0,"`").replace(Qc,"{").replace(Yc,"}").replace(Kc,"^")}function a0(e){return ka(e).replace(JE,"%3D")}function r0(e){return fr(e).replace(Gc,"%23").replace(XE,"%3F")}function s0(e){return r0(e).replace(YE,"%2F")}function wi(e){if(e==null)return null;try{return decodeURIComponent(""+e)}catch{}return""+e}const o0=/\/$/,c0=e=>e.replace(o0,"");function ea(e,t,n="/"){let i,l={},a="",r="";const o=t.indexOf("#");let c=t.indexOf("?");return c=o>=0&&c>o?-1:c,c>=0&&(i=t.slice(0,c),a=t.slice(c,o>0?o:t.length),l=e(a.slice(1))),o>=0&&(i=i||t.slice(0,o),r=t.slice(o,t.length)),i=h0(i??t,n),{fullPath:i+a+r,path:i,query:l,hash:wi(r)}}function u0(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}function Ss(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function p0(e,t,n){const i=t.matched.length-1,l=n.matched.length-1;return i>-1&&i===l&&ti(t.matched[i],n.matched[l])&&Jc(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function ti(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function Jc(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(!d0(e[n],t[n]))return!1;return!0}function d0(e,t){return Tt(e)?Ps(e,t):Tt(t)?Ps(t,e):e===t}function Ps(e,t){return Tt(t)?e.length===t.length&&e.every((n,i)=>n===t[i]):e.length===1&&e[0]===t}function h0(e,t){if(e.startsWith("/"))return e;if(!e)return t;const n=t.split("/"),i=e.split("/"),l=i[i.length-1];(l===".."||l===".")&&i.push("");let a=n.length-1,r,o;for(r=0;r<i.length;r++)if(o=i[r],o!==".")if(o==="..")a>1&&a--;else break;return n.slice(0,a).join("/")+"/"+i.slice(r).join("/")}const Ht={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0};let Ca=(function(e){return e.pop="pop",e.push="push",e})({}),ta=(function(e){return e.back="back",e.forward="forward",e.unknown="",e})({});function E0(e){if(!e)if($n){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),c0(e)}const f0=/^[^#]+#/;function g0(e,t){return e.replace(f0,"#")+t}function m0(e,t){const n=document.documentElement.getBoundingClientRect(),i=e.getBoundingClientRect();return{behavior:t.behavior,left:i.left-n.left-(t.left||0),top:i.top-n.top-(t.top||0)}}const wl=()=>({left:window.scrollX,top:window.scrollY});function v0(e){let t;if("el"in e){const n=e.el,i=typeof n=="string"&&n.startsWith("#"),l=typeof n=="string"?i?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!l)return;t=m0(l,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.scrollX,t.top!=null?t.top:window.scrollY)}function Rs(e,t){return(history.state?history.state.position-t:-1)+e}const Da=new Map;function A0(e,t){Da.set(e,t)}function B0(e){const t=Da.get(e);return Da.delete(e),t}function y0(e){return typeof e=="string"||e&&typeof e=="object"}function Xc(e){return typeof e=="string"||typeof e=="symbol"}let Se=(function(e){return e[e.MATCHER_NOT_FOUND=1]="MATCHER_NOT_FOUND",e[e.NAVIGATION_GUARD_REDIRECT=2]="NAVIGATION_GUARD_REDIRECT",e[e.NAVIGATION_ABORTED=4]="NAVIGATION_ABORTED",e[e.NAVIGATION_CANCELLED=8]="NAVIGATION_CANCELLED",e[e.NAVIGATION_DUPLICATED=16]="NAVIGATION_DUPLICATED",e})({});const Zc=Symbol("");Se.MATCHER_NOT_FOUND+"",Se.NAVIGATION_GUARD_REDIRECT+"",Se.NAVIGATION_ABORTED+"",Se.NAVIGATION_CANCELLED+"",Se.NAVIGATION_DUPLICATED+"";function ni(e,t){return he(new Error,{type:e,[Zc]:!0},t)}function Nt(e,t){return e instanceof Error&&Zc in e&&(t==null||!!(e.type&t))}const _0=["params","query","hash"];function b0(e){if(typeof e=="string")return e;if(e.path!=null)return e.path;const t={};for(const n of _0)n in e&&(t[n]=e[n]);return JSON.stringify(t,null,2)}function k0(e){const t={};if(e===""||e==="?")return t;const n=(e[0]==="?"?e.slice(1):e).split("&");for(let i=0;i<n.length;++i){const l=n[i].replace(qc," "),a=l.indexOf("="),r=wi(a<0?l:l.slice(0,a)),o=a<0?null:wi(l.slice(a+1));if(r in t){let c=t[r];Tt(c)||(c=t[r]=[c]),c.push(o)}else t[r]=o}return t}function Ls(e){let t="";for(let n in e){const i=e[n];if(n=a0(n),i==null){i!==void 0&&(t+=(t.length?"&":"")+n);continue}(Tt(i)?i.map(l=>l&&ka(l)):[i&&ka(i)]).forEach(l=>{l!==void 0&&(t+=(t.length?"&":"")+n,l!=null&&(t+="="+l))})}return t}function C0(e){const t={};for(const n in e){const i=e[n];i!==void 0&&(t[n]=Tt(i)?i.map(l=>l==null?null:""+l):i==null?i:""+i)}return t}const D0=Symbol(""),Os=Symbol(""),xl=Symbol(""),gr=Symbol(""),Ta=Symbol("");function hi(){let e=[];function t(i){return e.push(i),()=>{const l=e.indexOf(i);l>-1&&e.splice(l,1)}}function n(){e=[]}return{add:t,list:()=>e.slice(),reset:n}}function sn(e,t,n,i,l,a=r=>r()){const r=i&&(i.enterCallbacks[l]=i.enterCallbacks[l]||[]);return()=>new Promise((o,c)=>{const d=h=>{h===!1?c(ni(Se.NAVIGATION_ABORTED,{from:n,to:t})):h instanceof Error?c(h):y0(h)?c(ni(Se.NAVIGATION_GUARD_REDIRECT,{from:t,to:h})):(r&&i.enterCallbacks[l]===r&&typeof h=="function"&&r.push(h),o())},u=a(()=>e.call(i&&i.instances[l],t,n,d));let p=Promise.resolve(u);e.length<3&&(p=p.then(d)),p.catch(h=>c(h))})}function na(e,t,n,i,l=a=>a()){const a=[];for(const r of e)for(const o in r.components){let c=r.components[o];if(!(t!=="beforeRouteEnter"&&!r.instances[o]))if(Wc(c)){const d=(c.__vccOpts||c)[t];d&&a.push(sn(d,n,i,r,o,l))}else{let d=c();a.push(()=>d.then(u=>{if(!u)throw new Error(`Couldn't resolve component "${o}" at "${r.path}"`);const p=KE(u)?u.default:u;r.mods[o]=u,r.components[o]=p;const h=(p.__vccOpts||p)[t];return h&&sn(h,n,i,r,o,l)()}))}}return a}function T0(e,t){const n=[],i=[],l=[],a=Math.max(t.matched.length,e.matched.length);for(let r=0;r<a;r++){const o=t.matched[r];o&&(e.matched.find(d=>ti(d,o))?i.push(o):n.push(o));const c=e.matched[r];c&&(t.matched.find(d=>ti(d,c))||l.push(c))}return[n,i,l]}/*!
2940 * vue-router v4.6.3
2941 * (c) 2025 Eduardo San Martin Morote
2942 * @license MIT
2943 */let w0=()=>location.protocol+"//"+location.host;function eu(e,t){const{pathname:n,search:i,hash:l}=t,a=e.indexOf("#");if(a>-1){let r=l.includes(e.slice(a))?e.slice(a).length:1,o=l.slice(r);return o[0]!=="/"&&(o="/"+o),Ss(o,"")}return Ss(n,e)+i+l}function x0(e,t,n,i){let l=[],a=[],r=null;const o=({state:h})=>{const E=eu(e,location),v=n.value,B=t.value;let k=0;if(h){if(n.value=E,t.value=h,r&&r===v){r=null;return}k=B?h.position-B.position:0}else i(E);l.forEach(D=>{D(n.value,v,{delta:k,type:Ca.pop,direction:k?k>0?ta.forward:ta.back:ta.unknown})})};function c(){r=n.value}function d(h){l.push(h);const E=()=>{const v=l.indexOf(h);v>-1&&l.splice(v,1)};return a.push(E),E}function u(){if(document.visibilityState==="hidden"){const{history:h}=window;if(!h.state)return;h.replaceState(he({},h.state,{scroll:wl()}),"")}}function p(){for(const h of a)h();a=[],window.removeEventListener("popstate",o),window.removeEventListener("pagehide",u),document.removeEventListener("visibilitychange",u)}return window.addEventListener("popstate",o),window.addEventListener("pagehide",u),document.addEventListener("visibilitychange",u),{pauseListeners:c,listen:d,destroy:p}}function Is(e,t,n,i=!1,l=!1){return{back:e,current:t,forward:n,replaced:i,position:window.history.length,scroll:l?wl():null}}function F0(e){const{history:t,location:n}=window,i={value:eu(e,n)},l={value:t.state};l.value||a(i.value,{back:null,current:i.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function a(c,d,u){const p=e.indexOf("#"),h=p>-1?(n.host&&document.querySelector("base")?e:e.slice(p))+c:w0()+e+c;try{t[u?"replaceState":"pushState"](d,"",h),l.value=d}catch(E){console.error(E),n[u?"replace":"assign"](h)}}function r(c,d){a(c,he({},t.state,Is(l.value.back,c,l.value.forward,!0),d,{position:l.value.position}),!0),i.value=c}function o(c,d){const u=he({},l.value,t.state,{forward:c,scroll:wl()});a(u.current,u,!0),a(c,he({},Is(i.value,c,null),{position:u.position+1},d),!1),i.value=c}return{location:i,state:l,push:o,replace:r}}function S0(e){e=E0(e);const t=F0(e),n=x0(e,t.state,t.location,t.replace);function i(a,r=!0){r||n.pauseListeners(),history.go(a)}const l=he({location:"",base:e,go:i,createHref:g0.bind(null,e)},t,n);return Object.defineProperty(l,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(l,"state",{enumerable:!0,get:()=>t.state.value}),l}let _n=(function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.Group=2]="Group",e})({});var Oe=(function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.ParamRegExp=2]="ParamRegExp",e[e.ParamRegExpEnd=3]="ParamRegExpEnd",e[e.EscapeNext=4]="EscapeNext",e})(Oe||{});const P0={type:_n.Static,value:""},R0=/[a-zA-Z0-9_]/;function L0(e){if(!e)return[[]];if(e==="/")return[[P0]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(E){throw new Error(`ERR (${n})/"${d}": ${E}`)}let n=Oe.Static,i=n;const l=[];let a;function r(){a&&l.push(a),a=[]}let o=0,c,d="",u="";function p(){d&&(n===Oe.Static?a.push({type:_n.Static,value:d}):n===Oe.Param||n===Oe.ParamRegExp||n===Oe.ParamRegExpEnd?(a.length>1&&(c==="*"||c==="+")&&t(`A repeatable param (${d}) must be alone in its segment. eg: '/:ids+.`),a.push({type:_n.Param,value:d,regexp:u,repeatable:c==="*"||c==="+",optional:c==="*"||c==="?"})):t("Invalid state to consume buffer"),d="")}function h(){d+=c}for(;o<e.length;){if(c=e[o++],c==="\\"&&n!==Oe.ParamRegExp){i=n,n=Oe.EscapeNext;continue}switch(n){case Oe.Static:c==="/"?(d&&p(),r()):c===":"?(p(),n=Oe.Param):h();break;case Oe.EscapeNext:h(),n=i;break;case Oe.Param:c==="("?n=Oe.ParamRegExp:R0.test(c)?h():(p(),n=Oe.Static,c!=="*"&&c!=="?"&&c!=="+"&&o--);break;case Oe.ParamRegExp:c===")"?u[u.length-1]=="\\"?u=u.slice(0,-1)+c:n=Oe.ParamRegExpEnd:u+=c;break;case Oe.ParamRegExpEnd:p(),n=Oe.Static,c!=="*"&&c!=="?"&&c!=="+"&&o--,u="";break;default:t("Unknown state");break}}return n===Oe.ParamRegExp&&t(`Unfinished custom RegExp for param "${d}"`),p(),r(),l}const Ms="[^/]+?",O0={sensitive:!1,strict:!1,start:!0,end:!0};var Ge=(function(e){return e[e._multiplier=10]="_multiplier",e[e.Root=90]="Root",e[e.Segment=40]="Segment",e[e.SubSegment=30]="SubSegment",e[e.Static=40]="Static",e[e.Dynamic=20]="Dynamic",e[e.BonusCustomRegExp=10]="BonusCustomRegExp",e[e.BonusWildcard=-50]="BonusWildcard",e[e.BonusRepeatable=-20]="BonusRepeatable",e[e.BonusOptional=-8]="BonusOptional",e[e.BonusStrict=.7000000000000001]="BonusStrict",e[e.BonusCaseSensitive=.25]="BonusCaseSensitive",e})(Ge||{});const I0=/[.+*?^${}()[\]/\\]/g;function M0(e,t){const n=he({},O0,t),i=[];let l=n.start?"^":"";const a=[];for(const d of e){const u=d.length?[]:[Ge.Root];n.strict&&!d.length&&(l+="/");for(let p=0;p<d.length;p++){const h=d[p];let E=Ge.Segment+(n.sensitive?Ge.BonusCaseSensitive:0);if(h.type===_n.Static)p||(l+="/"),l+=h.value.replace(I0,"\\$&"),E+=Ge.Static;else if(h.type===_n.Param){const{value:v,repeatable:B,optional:k,regexp:D}=h;a.push({name:v,repeatable:B,optional:k});const y=D||Ms;if(y!==Ms){E+=Ge.BonusCustomRegExp;try{`${y}`}catch(_){throw new Error(`Invalid custom RegExp for param "${v}" (${y}): `+_.message)}}let m=B?`((?:${y})(?:/(?:${y}))*)`:`(${y})`;p||(m=k&&d.length<2?`(?:/${m})`:"/"+m),k&&(m+="?"),l+=m,E+=Ge.Dynamic,k&&(E+=Ge.BonusOptional),B&&(E+=Ge.BonusRepeatable),y===".*"&&(E+=Ge.BonusWildcard)}u.push(E)}i.push(u)}if(n.strict&&n.end){const d=i.length-1;i[d][i[d].length-1]+=Ge.BonusStrict}n.strict||(l+="/?"),n.end?l+="$":n.strict&&!l.endsWith("/")&&(l+="(?:/|$)");const r=new RegExp(l,n.sensitive?"":"i");function o(d){const u=d.match(r),p={};if(!u)return null;for(let h=1;h<u.length;h++){const E=u[h]||"",v=a[h-1];p[v.name]=E&&v.repeatable?E.split("/"):E}return p}function c(d){let u="",p=!1;for(const h of e){(!p||!u.endsWith("/"))&&(u+="/"),p=!1;for(const E of h)if(E.type===_n.Static)u+=E.value;else if(E.type===_n.Param){const{value:v,repeatable:B,optional:k}=E,D=v in d?d[v]:"";if(Tt(D)&&!B)throw new Error(`Provided param "${v}" is an array but it is not repeatable (* or + modifiers)`);const y=Tt(D)?D.join("/"):D;if(!y)if(k)h.length<2&&(u.endsWith("/")?u=u.slice(0,-1):p=!0);else throw new Error(`Missing required param "${v}"`);u+=y}}return u||"/"}return{re:r,score:i,keys:a,parse:o,stringify:c}}function V0(e,t){let n=0;for(;n<e.length&&n<t.length;){const i=t[n]-e[n];if(i)return i;n++}return e.length<t.length?e.length===1&&e[0]===Ge.Static+Ge.Segment?-1:1:e.length>t.length?t.length===1&&t[0]===Ge.Static+Ge.Segment?1:-1:0}function tu(e,t){let n=0;const i=e.score,l=t.score;for(;n<i.length&&n<l.length;){const a=V0(i[n],l[n]);if(a)return a;n++}if(Math.abs(l.length-i.length)===1){if(Vs(i))return 1;if(Vs(l))return-1}return l.length-i.length}function Vs(e){const t=e[e.length-1];return e.length>0&&t[t.length-1]<0}const N0={strict:!1,end:!0,sensitive:!1};function $0(e,t,n){const i=M0(L0(e.path),n),l=he(i,{record:e,parent:t,children:[],alias:[]});return t&&!l.record.aliasOf==!t.record.aliasOf&&t.children.push(l),l}function j0(e,t){const n=[],i=new Map;t=Fs(N0,t);function l(p){return i.get(p)}function a(p,h,E){const v=!E,B=$s(p);B.aliasOf=E&&E.record;const k=Fs(t,p),D=[B];if("alias"in p){const _=typeof p.alias=="string"?[p.alias]:p.alias;for(const P of _)D.push($s(he({},B,{components:E?E.record.components:B.components,path:P,aliasOf:E?E.record:B})))}let y,m;for(const _ of D){const{path:P}=_;if(h&&P[0]!=="/"){const H=h.record.path,M=H[H.length-1]==="/"?"":"/";_.path=h.record.path+(P&&M+P)}if(y=$0(_,h,k),E?E.alias.push(y):(m=m||y,m!==y&&m.alias.push(y),v&&p.name&&!js(y)&&r(p.name)),nu(y)&&c(y),B.children){const H=B.children;for(let M=0;M<H.length;M++)a(H[M],y,E&&E.children[M])}E=E||y}return m?()=>{r(m)}:Bi}function r(p){if(Xc(p)){const h=i.get(p);h&&(i.delete(p),n.splice(n.indexOf(h),1),h.children.forEach(r),h.alias.forEach(r))}else{const h=n.indexOf(p);h>-1&&(n.splice(h,1),p.record.name&&i.delete(p.record.name),p.children.forEach(r),p.alias.forEach(r))}}function o(){return n}function c(p){const h=U0(p,n);n.splice(h,0,p),p.record.name&&!js(p)&&i.set(p.record.name,p)}function d(p,h){let E,v={},B,k;if("name"in p&&p.name){if(E=i.get(p.name),!E)throw ni(Se.MATCHER_NOT_FOUND,{location:p});k=E.record.name,v=he(Ns(h.params,E.keys.filter(m=>!m.optional).concat(E.parent?E.parent.keys.filter(m=>m.optional):[]).map(m=>m.name)),p.params&&Ns(p.params,E.keys.map(m=>m.name))),B=E.stringify(v)}else if(p.path!=null)B=p.path,E=n.find(m=>m.re.test(B)),E&&(v=E.parse(B),k=E.record.name);else{if(E=h.name?i.get(h.name):n.find(m=>m.re.test(h.path)),!E)throw ni(Se.MATCHER_NOT_FOUND,{location:p,currentLocation:h});k=E.record.name,v=he({},h.params,p.params),B=E.stringify(v)}const D=[];let y=E;for(;y;)D.unshift(y.record),y=y.parent;return{name:k,path:B,params:v,matched:D,meta:z0(D)}}e.forEach(p=>a(p));function u(){n.length=0,i.clear()}return{addRoute:a,resolve:d,removeRoute:r,clearRoutes:u,getRoutes:o,getRecordMatcher:l}}function Ns(e,t){const n={};for(const i of t)i in e&&(n[i]=e[i]);return n}function $s(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:H0(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function H0(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const i in e.components)t[i]=typeof n=="object"?n[i]:n;return t}function js(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function z0(e){return e.reduce((t,n)=>he(t,n.meta),{})}function U0(e,t){let n=0,i=t.length;for(;n!==i;){const a=n+i>>1;tu(e,t[a])<0?i=a:n=a+1}const l=W0(e);return l&&(i=t.lastIndexOf(l,i-1)),i}function W0(e){let t=e;for(;t=t.parent;)if(nu(t)&&tu(e,t)===0)return t}function nu({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function Hs(e){const t=ve(xl),n=ve(gr),i=b(()=>{const c=un(e.to);return t.resolve(c)}),l=b(()=>{const{matched:c}=i.value,{length:d}=c,u=c[d-1],p=n.matched;if(!u||!p.length)return-1;const h=p.findIndex(ti.bind(null,u));if(h>-1)return h;const E=zs(c[d-2]);return d>1&&zs(u)===E&&p[p.length-1].path!==E?p.findIndex(ti.bind(null,c[d-2])):h}),a=b(()=>l.value>-1&&Y0(n.params,i.value.params)),r=b(()=>l.value>-1&&l.value===n.matched.length-1&&Jc(n.params,i.value.params));function o(c={}){if(Q0(c)){const d=t[un(e.replace)?"replace":"push"](un(e.to)).catch(Bi);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>d),d}return Promise.resolve()}return{route:i,href:b(()=>i.value.href),isActive:a,isExactActive:r,navigate:o}}function G0(e){return e.length===1?e[0]:e}const q0=I({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:Hs,setup(e,{slots:t}){const n=Tn(Hs(e)),{options:i}=ve(xl),l=b(()=>({[Us(e.activeClass,i.linkActiveClass,"router-link-active")]:n.isActive,[Us(e.exactActiveClass,i.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const a=t.default&&G0(t.default(n));return e.custom?a:s("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:l.value},a)}}}),K0=q0;function Q0(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function Y0(e,t){for(const n in t){const i=t[n],l=e[n];if(typeof i=="string"){if(i!==l)return!1}else if(!Tt(l)||l.length!==i.length||i.some((a,r)=>a!==l[r]))return!1}return!0}function zs(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const Us=(e,t,n)=>e??t??n,J0=I({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const i=ve(Ta),l=b(()=>e.route||i.value),a=ve(Os,0),r=b(()=>{let d=un(a);const{matched:u}=l.value;let p;for(;(p=u[d])&&!p.components;)d++;return d}),o=b(()=>l.value.matched[r.value]);Ct(Os,b(()=>r.value+1)),Ct(D0,o),Ct(Ta,l);const c=se();return we(()=>[c.value,o.value,e.name],([d,u,p],[h,E,v])=>{u&&(u.instances[p]=d,E&&E!==u&&d&&d===h&&(u.leaveGuards.size||(u.leaveGuards=E.leaveGuards),u.updateGuards.size||(u.updateGuards=E.updateGuards))),d&&u&&(!E||!ti(u,E)||!h)&&(u.enterCallbacks[p]||[]).forEach(B=>B(d))},{flush:"post"}),()=>{const d=l.value,u=e.name,p=o.value,h=p&&p.components[u];if(!h)return Ws(n.default,{Component:h,route:d});const E=p.props[u],v=E?E===!0?d.params:typeof E=="function"?E(d):E:null,k=s(h,he({},v,t,{onVnodeUnmounted:D=>{D.component.isUnmounted&&(p.instances[u]=null)},ref:c}));return Ws(n.default,{Component:k,route:d})||k}}});function Ws(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const X0=J0;function Z0(e){const t=j0(e.routes,e),n=e.parseQuery||k0,i=e.stringifyQuery||Ls,l=e.history,a=hi(),r=hi(),o=hi(),c=ae(Ht);let d=Ht;$n&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const u=Zl.bind(null,w=>""+w),p=Zl.bind(null,s0),h=Zl.bind(null,wi);function E(w,K){let U,X;return Xc(w)?(U=t.getRecordMatcher(w),X=K):X=w,t.addRoute(X,U)}function v(w){const K=t.getRecordMatcher(w);K&&t.removeRoute(K)}function B(){return t.getRoutes().map(w=>w.record)}function k(w){return!!t.getRecordMatcher(w)}function D(w,K){if(K=he({},K||c.value),typeof w=="string"){const A=ea(n,w,K.path),C=t.resolve({path:A.path},K),F=l.createHref(A.fullPath);return he(A,C,{params:h(C.params),hash:wi(A.hash),redirectedFrom:void 0,href:F})}let U;if(w.path!=null)U=he({},w,{path:ea(n,w.path,K.path).path});else{const A=he({},w.params);for(const C in A)A[C]==null&&delete A[C];U=he({},w,{params:p(A)}),K.params=p(K.params)}const X=t.resolve(U,K),re=w.hash||"";X.params=u(h(X.params));const Be=u0(i,he({},w,{hash:l0(re),path:X.path})),g=l.createHref(Be);return he({fullPath:Be,hash:re,query:i===Ls?C0(w.query):w.query||{}},X,{redirectedFrom:void 0,href:g})}function y(w){return typeof w=="string"?ea(n,w,c.value.path):he({},w)}function m(w,K){if(d!==w)return ni(Se.NAVIGATION_CANCELLED,{from:K,to:w})}function _(w){return M(w)}function P(w){return _(he(y(w),{replace:!0}))}function H(w,K){const U=w.matched[w.matched.length-1];if(U&&U.redirect){const{redirect:X}=U;let re=typeof X=="function"?X(w,K):X;return typeof re=="string"&&(re=re.includes("?")||re.includes("#")?re=y(re):{path:re},re.params={}),he({query:w.query,hash:w.hash,params:re.path!=null?{}:w.params},re)}}function M(w,K){const U=d=D(w),X=c.value,re=w.state,Be=w.force,g=w.replace===!0,A=H(U,X);if(A)return M(he(y(A),{state:typeof A=="object"?he({},re,A.state):re,force:Be,replace:g}),K||U);const C=U;C.redirectedFrom=K;let F;return!Be&&p0(i,X,U)&&(F=ni(Se.NAVIGATION_DUPLICATED,{to:C,from:X}),Ue(X,X,!0,!1)),(F?Promise.resolve(F):R(C,X)).catch(x=>Nt(x)?Nt(x,Se.NAVIGATION_GUARD_REDIRECT)?x:nt(x):Q(x,C,X)).then(x=>{if(x){if(Nt(x,Se.NAVIGATION_GUARD_REDIRECT))return M(he({replace:g},y(x.to),{state:typeof x.to=="object"?he({},re,x.to.state):re,force:Be}),K||C)}else x=L(C,X,!0,g,re);return j(C,X,x),x})}function z(w,K){const U=m(w,K);return U?Promise.reject(U):Promise.resolve()}function T(w){const K=Mt.values().next().value;return K&&typeof K.runWithContext=="function"?K.runWithContext(w):w()}function R(w,K){let U;const[X,re,Be]=T0(w,K);U=na(X.reverse(),"beforeRouteLeave",w,K);for(const A of X)A.leaveGuards.forEach(C=>{U.push(sn(C,w,K))});const g=z.bind(null,w,K);return U.push(g),je(U).then(()=>{U=[];for(const A of a.list())U.push(sn(A,w,K));return U.push(g),je(U)}).then(()=>{U=na(re,"beforeRouteUpdate",w,K);for(const A of re)A.updateGuards.forEach(C=>{U.push(sn(C,w,K))});return U.push(g),je(U)}).then(()=>{U=[];for(const A of Be)if(A.beforeEnter)if(Tt(A.beforeEnter))for(const C of A.beforeEnter)U.push(sn(C,w,K));else U.push(sn(A.beforeEnter,w,K));return U.push(g),je(U)}).then(()=>(w.matched.forEach(A=>A.enterCallbacks={}),U=na(Be,"beforeRouteEnter",w,K,T),U.push(g),je(U))).then(()=>{U=[];for(const A of r.list())U.push(sn(A,w,K));return U.push(g),je(U)}).catch(A=>Nt(A,Se.NAVIGATION_CANCELLED)?A:Promise.reject(A))}function j(w,K,U){o.list().forEach(X=>T(()=>X(w,K,U)))}function L(w,K,U,X,re){const Be=m(w,K);if(Be)return Be;const g=K===Ht,A=$n?history.state:{};U&&(X||g?l.replace(w.fullPath,he({scroll:g&&A&&A.scroll},re)):l.push(w.fullPath,re)),c.value=w,Ue(w,K,U,g),nt()}let Y;function G(){Y||(Y=l.listen((w,K,U)=>{if(!lt.listening)return;const X=D(w),re=H(X,lt.currentRoute.value);if(re){M(he(re,{replace:!0,force:!0}),X).catch(Bi);return}d=X;const Be=c.value;$n&&A0(Rs(Be.fullPath,U.delta),wl()),R(X,Be).catch(g=>Nt(g,Se.NAVIGATION_ABORTED|Se.NAVIGATION_CANCELLED)?g:Nt(g,Se.NAVIGATION_GUARD_REDIRECT)?(M(he(y(g.to),{force:!0}),X).then(A=>{Nt(A,Se.NAVIGATION_ABORTED|Se.NAVIGATION_DUPLICATED)&&!U.delta&&U.type===Ca.pop&&l.go(-1,!1)}).catch(Bi),Promise.reject()):(U.delta&&l.go(-U.delta,!1),Q(g,X,Be))).then(g=>{g=g||L(X,Be,!1),g&&(U.delta&&!Nt(g,Se.NAVIGATION_CANCELLED)?l.go(-U.delta,!1):U.type===Ca.pop&&Nt(g,Se.NAVIGATION_ABORTED|Se.NAVIGATION_DUPLICATED)&&l.go(-1,!1)),j(X,Be,g)}).catch(Bi)}))}let J=hi(),V=hi(),te;function Q(w,K,U){nt(w);const X=V.list();
2943return X.length?X.forEach(re=>re(w,K,U)):console.error(w),Promise.reject(w)}function ce(){return te&&c.value!==Ht?Promise.resolve():new Promise((w,K)=>{J.add([w,K])})}function nt(w){return te||(te=!w,G(),J.list().forEach(([K,U])=>w?U(w):K()),J.reset()),w}function Ue(w,K,U,X){const{scrollBehavior:re}=e;if(!$n||!re)return Promise.resolve();const Be=!U&&B0(Rs(w.fullPath,0))||(X||!U)&&history.state&&history.state.scroll||null;return fn().then(()=>re(w,K,Be)).then(g=>g&&v0(g)).catch(g=>Q(g,w,K))}const $e=w=>l.go(w);let it;const Mt=new Set,lt={currentRoute:c,listening:!0,addRoute:E,removeRoute:v,clearRoutes:t.clearRoutes,hasRoute:k,getRoutes:B,resolve:D,options:e,push:_,replace:P,go:$e,back:()=>$e(-1),forward:()=>$e(1),beforeEach:a.add,beforeResolve:r.add,afterEach:o.add,onError:V.add,isReady:ce,install(w){w.component("RouterLink",K0),w.component("RouterView",X0),w.config.globalProperties.$router=lt,Object.defineProperty(w.config.globalProperties,"$route",{enumerable:!0,get:()=>un(c)}),$n&&!it&&c.value===Ht&&(it=!0,_(l.location).catch(X=>{}));const K={};for(const X in Ht)Object.defineProperty(K,X,{get:()=>c.value[X],enumerable:!0});w.provide(xl,lt),w.provide(gr,Go(K)),w.provide(Ta,c);const U=w.unmount;Mt.add(w),w.unmount=function(){Mt.delete(w),Mt.size<1&&(d=Ht,Y&&Y(),Y=null,c.value=Ht,it=!1,te=!1),U()}}};function je(w){return w.reduce((K,U)=>K.then(()=>T(U)),Promise.resolve())}return lt}function Yt(){return ve(xl)}function xt(e){return ve(gr)}var mr=Symbol(""),Ft=()=>{const e=ve(mr);if(!e)throw new Error("useClientData() is called without provider.");return e},ef=()=>Ft().pageComponent,tf=()=>Ft().pageData,iu=()=>Ft().pageFrontmatter,nf=()=>Ft().pageHead,lu=()=>Ft().pageLang,lf=()=>Ft().pageLayout,Fl=()=>Ft().routeLocale,af=()=>Ft().routePath,rf=()=>Ft().routes,sf=()=>Ft().siteData,gn=Ft,Et=iu,Sl=lu,Pl=tf,wa=new Set,Jt=e=>{wa.add(e),Sn(()=>{wa.delete(e)})},of=Symbol(""),xa=ae(GE),Yn=ae(qE),au=(e,t)=>{const n=LE(e,t);if(Yn.value[n])return n;const i=encodeURI(n);if(Yn.value[i])return i;const l=xa.value[n]||xa.value[i];return l||n},At=(e,t)=>{const{pathname:n,hashAndQueries:i}=zc(e),l=au(n,t),a=l+i;return Yn.value[l]?{...Yn.value[l],path:a,notFound:!1}:{...Yn.value["/404.html"],path:a,notFound:!0}},cf=(e,t)=>{const{pathname:n,hashAndQueries:i}=zc(e);return au(n,t)+i},uf=e=>{if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)&&!(e.currentTarget&&e.currentTarget.getAttribute("target")?.match(/\b_blank\b/i)))return e.preventDefault(),!0},Ve=I({name:"RouteLink",props:{to:{type:String,required:!0},active:Boolean,activeClass:{type:String,default:"route-link-active"}},slots:Object,setup(e,{slots:t}){const n=Yt(),i=xt(),l=b(()=>e.to.startsWith("#")||e.to.startsWith("?")?e.to:`/${cf(e.to,i.path).substring(1)}`);return()=>s("a",{class:["route-link",{[e.activeClass]:e.active}],href:l.value,onClick:(a={})=>{uf(a)&&n.push(e.to).catch()}},t.default())}}),pf=I({name:"AutoLink",props:{config:{type:Object,required:!0}},slots:Object,setup(e,{slots:t}){const n=ii(e,"config"),i=xt(),l=sf(),a=b(()=>Ii(n.value.link)),r=b(()=>n.value.target||(a.value?"_blank":void 0)),o=b(()=>r.value==="_blank"),c=b(()=>!a.value&&!o.value),d=b(()=>n.value.rel||(o.value?"noopener noreferrer":null)),u=b(()=>n.value.ariaLabel??n.value.text),p=b(()=>{if(n.value.exact)return!1;const E=Object.keys(l.value.locales);return E.length?E.every(v=>v!==n.value.link):n.value.link!=="/"}),h=b(()=>c.value?n.value.activeMatch?(n.value.activeMatch instanceof RegExp?n.value.activeMatch:new RegExp(n.value.activeMatch,"u")).test(i.path):p.value?i.path.startsWith(n.value.link):i.path===n.value.link:!1);return()=>{const{before:E,after:v,default:B}=t,k=B?.(n.value)??[E?.(n.value),n.value.text,v?.(n.value)];return c.value?s(Ve,{class:"auto-link",to:n.value.link,active:h.value,"aria-label":u.value},()=>k):s("a",{class:"auto-link external-link",href:n.value.link,"aria-label":u.value,rel:d.value,target:r.value},k)}}}),vr=I({name:"ClientOnly",setup(e,t){const n=se(!1);return ye(()=>{n.value=!0}),()=>n.value?t.slots.default?.():null}}),Zi=e=>
2943{wa.forEach(t=>t(e))},ru=I({name:"Content",props:{path:{type:String,required:!1,default:""}},setup(e){const t=ef(),n=b(()=>{if(!e.path)return t.value;const l=At(e.path);return rc(async()=>l.loader().then(({comp:a})=>a))}),i=iu();return we(i,()=>{Zi("updated")},{deep:!0,flush:"post"}),()=>s(n.value,{onVnodeMounted:()=>{Zi("mounted")},onVnodeUpdated:()=>{Zi("updated")},onVnodeBeforeUnmount:()=>{Zi("beforeUnmount")}})}}),df="Layout",hf="en-US",An=Tn({resolveLayouts:e=>e.reduce((t,n)=>({...t,...n.layouts}),{}),resolvePageHead:(e,t,n)=>{const i=me(t.description)?t.description:n.description,l=[...Array.isArray(t.head)?t.head:[],...n.head,["title",{},e],["meta",{name:"description",content:i}]];return jE(l)},resolvePageHeadTitle:(e,t)=>[e.title,t.title].filter(n=>!!n).join(" | "),resolvePageLang:(e,t)=>e.lang||t.lang||hf,resolvePageLayout:(e,t)=>{const n=me(e.frontmatter.layout)?e.frontmatter.layout:df;if(!t[n])throw new Error(`[vuepress] Cannot resolve layout: ${n}`);return t[n]},resolveRouteLocale:(e,t)=>OE(e,decodeURI(t)),resolveSiteLocaleData:({base:e,locales:t,...n},i)=>({...n,...t[i],head:[...t[i]?.head??[],...n.head]})}),St=(e={})=>e,Ce=e=>li(e)?e:`/${Er(e)}`,Ef=Object.defineProperty,ff=(e,t)=>{for(var n in t)Ef(e,n,{get:t[n],enumerable:!0})},gf={};ff(gf,{COMPONENT_STATE_TYPE:()=>mf,INSPECTOR_ID:()=>vf,INSPECTOR_LABEL:()=>Af,INSPECTOR_NODES:()=>Bf,INSPECTOR_STATE_SECTION_NAME:()=>yf,PLUGIN_ID:()=>su,PLUGIN_LABEL:()=>Ar});var su="org.vuejs.vuepress",Ar="VuePress",mf=Ar,vf=su,Af=Ar,Gs={id:"INTERNAL",label:"Internal",keys:["layouts","routes","redirects"]},qs={id:"SITE",label:"Site",keys:["siteData","siteLocaleData"]},Ks={id:"ROUTE",label:"Route",keys:["routePath","routeLocale"]},Qs={id:"PAGE",label:"Page",keys:["pageData","pageFrontmatter","pageLang","pageHead","pageHeadTitle","pageLayout","pageComponent"]},Bf={[Gs.id]:Gs,[qs.id]:qs,[Ks.id]:Ks,[Qs.id]:Qs},yf="State";const Ys=e=>typeof e=="number"?`${e}px`:e,Br=({size:e=48,stroke:t=4,wrapper:n=!0,height:i=2*e})=>{const l=s("span",{style:`--loading-icon: url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' preserveAspectRatio='xMidYMid' viewBox='25 25 50 50'%3E%3CanimateTransform attributeName='transform' type='rotate' dur='2s' keyTimes='0;1' repeatCount='indefinite' values='0;360'%3E%3C/animateTransform%3E%3Ccircle cx='50' cy='50' r='20' fill='none' stroke='currentColor' stroke-width='${t}' stroke-linecap='round'%3E%3Canimate attributeName='stroke-dasharray' dur='1.5s' keyTimes='0;0.5;1' repeatCount='indefinite' values='1,200;90,200;1,200'%3E%3C/animate%3E%3Canimate attributeName='stroke-dashoffset' dur='1.5s' keyTimes='0;0.5;1' repeatCount='indefinite' values='0;-35px;-125px'%3E%3C/animate%3E%3C/circle%3E%3C/svg%3E");--icon-size: ${Ys(e)};display: inline-block;width: var(--icon-size);height: var(--icon-size);background-color: currentcolor;-webkit-mask-image: var(--loading-icon);mask-image: var(--loading-icon)`});return n?s("div",{style:`display: flex;align-items: center;justify-content: center;height: ${Ys(i)}`},l):l};Br.displayName="LoadingIcon";const yr=(e,{slots:t})=>t.default();var ct=Uint8Array,zn=Uint16Array,_f=Int32Array,ou=new ct([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),cu=new ct([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),bf=new ct([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),uu=function(e,t){for(var n=new zn(31),i=0;i<31;++i)n[i]=t+=1<<e[i-1];for(var l=new _f(n[30]),i=1;i<30;++i)for(var a=n[i];a<n[i+1];++a)l[a]=a-n[i]<<5|i;return{b:n,r:l}},pu=uu(ou,2),du=pu.b,kf=pu.r;du[28]=258,kf[258]=28;var Cf=uu(cu,0),Df=Cf.b,Fa=new zn(32768);for(var De=0;De<32768;++De){var tn=(De&43690)>>1|(De&21845)<<1;tn=(tn&52428)>>2|(tn&13107)<<2,tn=(tn&61680)>>4|(tn&3855)<<4,Fa[De]=((tn&65280)>>8|(tn&255)<<8)>>1}var yi=(function(e,t,n){for(var i=e.length,l=0,a=new zn(t);l<i;++l)e[l]&&++a[e[l]-1];var r=new zn(t);for(l=1;l<t;++l)r[l]=r[l-1]+a[l-1]<<1;var o;if(n){o=new zn(1<<t);var c=15-t;for(l=0;l<i;++l)if(e[l])for(var d=l<<4|e[l],u=t-e[l],p=r[e[l]-1]++<<u,h=p|(1<<u)-1;p<=h;++p)o[Fa[p]>>c]=d}else for(o=new zn(i),l=0;l<i;++l)e[l]&&(o[l]=Fa[r[e[l]-1]++]>>15-e[l]);return o}
2943),Mi=new ct(288);for(var De=0;De<144;++De)Mi[De]=8;for(var De=144;De<256;++De)Mi[De]=9;for(var De=256;De<280;++De)Mi[De]=7;for(var De=280;De<288;++De)Mi[De]=8;var hu=new ct(32);for(var De=0;De<32;++De)hu[De]=5;var Tf=yi(Mi,9,1),wf=yi(hu,5,1),ia=function(e){for(var t=e[0],n=1;n<e.length;++n)e[n]>t&&(t=e[n]);return t},_t=function(e,t,n){var i=t/8|0;return(e[i]|e[i+1]<<8)>>(t&7)&n},la=function(e,t){var n=t/8|0;return(e[n]|e[n+1]<<8|e[n+2]<<16)>>(t&7)},xf=function(e){return(e+7)/8|0},Eu=function(e,t,n){return(t==null||t<0)&&(t=0),(n==null||n>e.length)&&(n=e.length),new ct(e.subarray(t,n))},Ff=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],mt=function(e,t,n){var i=new Error(t||Ff[e]);if(i.code=e,Error.captureStackTrace&&Error.captureStackTrace(i,mt),!n)throw i;return i},Sf=function(e,t,n,i){var l=e.length,a=0;if(!l||t.f&&!t.l)return n||new ct(0);var r=!n,o=r||t.i!=2,c=t.i;r&&(n=new ct(l*3));var d=function(re){var Be=n.length;if(re>Be){var g=new ct(Math.max(Be*2,re));g.set(n),n=g}},u=t.f||0,p=t.p||0,h=t.b||0,E=t.l,v=t.d,B=t.m,k=t.n,D=l*8;do{if(!E){u=_t(e,p,1);var y=_t(e,p+1,3);if(p+=3,y)if(y==1)E=Tf,v=wf,B=9,k=5;else if(y==2){var H=_t(e,p,31)+257,M=_t(e,p+10,15)+4,z=H+_t(e,p+5,31)+1;p+=14;for(var T=new ct(z),R=new ct(19),j=0;j<M;++j)R[bf[j]]=_t(e,p+j*3,7);p+=M*3;for(var L=ia(R),Y=(1<<L)-1,G=yi(R,L,1),j=0;j<z;){var J=G[_t(e,p,Y)];p+=J&15;var m=J>>4;if(m<16)T[j++]=m;else{var V=0,te=0;for(m==16?(te=3+_t(e,p,3),p+=2,V=T[j-1]):m==17?(te=3+_t(e,p,7),p+=3):m==18&&(te=11+_t(e,p,127),p+=7);te--;)T[j++]=V}}var Q=T.subarray(0,H),ce=T.subarray(H);B=ia(Q),k=ia(ce),E=yi(Q,B,1),v=yi(ce,k,1)}else mt(1);else{var m=xf(p)+4,_=e[m-4]|e[m-3]<<8,P=m+_;if(P>l){c&&mt(0);break}o&&d(h+_),n.set(e.subarray(m,P),h),t.b=h+=_,t.p=p=P*8,t.f=u;continue}if(p>D){c&&mt(0);break}}o&&d(h+131072);for(var nt=(1<<B)-1,Ue=(1<<k)-1,$e=p;;$e=p){var V=E[la(e,p)&nt],it=V>>4;if(p+=V&15,p>D){c&&mt(0);break}if(V||mt(2),it<256)n[h++]=it;else if(it==256){$e=p,E=null;break}else{var Mt=it-254;if(it>264){var j=it-257,lt=ou[j];Mt=_t(e,p,(1<<lt)-1)+du[j],p+=lt}var je=v[la(e,p)&Ue],w=je>>4;je||mt(3),p+=je&15;var ce=Df[w];if(w>3){var lt=cu[w];ce+=la(e,p)&(1<<lt)-1,p+=lt}if(p>D){c&&mt(0);break}o&&d(h+131072);var K=h+Mt;if(h<ce){var U=a-ce,X=Math.min(ce,K);for(U+h<0&&mt(3);h<X;++h)n[h]=i[U+h]}for(;h<K;++h)n[h]=n[h-ce]}}t.l=E,t.p=$e,t.b=h,t.f=u,E&&(u=1,t.m=B,t.d=v,t.n=k)}while(!u);return h!=n.length&&r?Eu(n,0,h):n.subarray(0,h)},Pf=new ct(0),Rf=function(e,t){return((e[0]&15)!=8||e[0]>>4>7||(e[0]<<8|e[1])%31)&&mt(6,"invalid zlib data"),(e[1]>>5&1)==1&&mt(6,"invalid zlib data: "+(e[1]&32?"need":"unexpected")+" dictionary"),(e[1]>>3&4)+2};function Lf(e,t){return Sf(e.subarray(Rf(e),-4),{i:2},t,t)}var Sa=typeof TextDecoder<"u"&&new TextDecoder,Of=0;try{Sa.decode(Pf,{stream:!0}),Of=1}catch{}var If=function(e){for(var t="",n=0;;){var i=e[n++],l=(i>127)+(i>223)+(i>239);if(n+l>e.length)return{s:t,r:Eu(e,n-1)};l?l==3?(i=((i&15)<<18|(e[n++]&63)<<12|(e[n++]&63)<<6|e[n++]&63)-65536,t+=String.fromCharCode(55296|i>>10,56320|i&1023)):l&1?t+=String.fromCharCode((i&31)<<6|e[n++]&63):t+=String.fromCharCode((i&15)<<12|(e[n++]&63)<<6|e[n++]&63):t+=String.fromCharCode(i)}};function Mf(e,t){{for(var n=new ct(e.length),i=0;i<e.length;++i)n[i]=e.charCodeAt(i);return n}for(var l=e.length,i=0;i<l;++i);}function Vf(e,t){var n;if(Sa)return Sa.decode(e);var i=If(e),l=i.s,n=i.r;return n.length&&mt(8),l}const Js=e=>{const t=atob(e);return Vf(Lf(Mf(t)))},Nf=()=>/\b(iPhone|iPod)\b/i.test(navigator.userAgent),fu=()=>/macintosh|mac os x/i.test(navigator.userAgent),_r=()=>{const e=!!(navigator.maxTouchPoints&&navigator.maxTouchPoints>0);return/\b(iPad)\b/i.test(navigator.userAgent)||fu()&&e},$f=()=>Nf()||_r(),gu=()=>fu()&&!$f(),Xs=()=>document.documentElement.getAttribute("data-theme")==="dark",mu=[...new Array(6)].map((e,t)=>`[vp-content] h${t+1}`).join(","),jf=(e,t=2)=>{if(t===!1)return[];const[n,i]=typeof t=="number"?[t,t]:t==="deep"?[2,6]:t,l=e.filter(r=>r.level>=n&&r.level<=i),a=[];e:for(let r=0;r<l.length;r++){const o=l[r];if(r===0)a.push(o);else{for(let c=r-1;c>=0;c--){const d=l[c];if(d.level<o.level){d.children.push(o);continue e}}a.push(o)}}return a},Hf=(e,t=[])=>{let n;if(t.length){const i=e.cloneNode(!0);
2943i.querySelectorAll(t.join(",")).forEach(l=>{l.remove()}),n=i.textContent||""}else n=e.textContent||"";return n.trim()},zf=(e=mu,t=[])=>Array.from(document.querySelectorAll(e)).filter(n=>n.id&&n.hasChildNodes()).map(n=>({element:n,title:Hf(n,t),link:`#${n.id}`,slug:n.id,level:Number(n.tagName[1]),children:[]})),Uf=({selector:e=mu,levels:t=2,ignore:n=[]}={})=>jf(zf(e,n),t),vu=e=>typeof e<"u",sl=e=>typeof e=="number",{isArray:Wt}=Array,vl=(e,t)=>me(e)&&e.startsWith(t),Wf=(e,t)=>me(e)&&e.endsWith(t),{entries:Rn}=Object,{keys:Gt}=Object,br=e=>{if(e){if(typeof e=="number")return new Date(e);const t=Date.parse(e.toString());if(!Number.isNaN(t))return new Date(t)}return null},Rl=e=>vl(e,"/")&&e[1]!=="/",Au=e=>e.every(t=>t.type===Ze?!0:t.type===Xe?t.children==null||Wt(t.children)&&Au(t.children):!1),Jn=e=>e==null?!0:Wt(e)?Au(e):!1,ht=(e,t)=>{const n=(t?._instance??Pn())?.appContext.components;return n?e in n||et(e)in n||Si(et(e))in n:!1},aa="message-container";class kr{elements;constructor(){this.elements={}}static get containerElement(){let t=document.getElementById(aa);return t||(t=document.createElement("div"),t.id=aa,document.body.appendChild(t),t)}getElement(t){return this.elements[t]}pop(t,n=2e3,i=!0){const l=Date.now(),a=document.createElement("div");return a.className="message-item move-in",a.innerHTML=t,kr.containerElement.appendChild(a),this.elements[l]=a,i&&a.addEventListener("click",()=>{this.close(l)}),n>0&&setTimeout(()=>{this.close(l)},n),l}close(t){if(t){const n=this.elements[t];n.classList.remove("move-in"),n.classList.add("move-out"),n.addEventListener("animationend",()=>{n.remove(),delete this.elements[t]})}else Gt(this.elements).forEach(n=>{this.close(Number(n))})}destroy(){const t=document.getElementById(aa);t&&document.body.removeChild(t),this.elements={}}}const Gf=Symbol(""),Pa=se(!1);typeof document<"u"&&(Pa.value=Xs(),new MutationObserver(()=>{Pa.value=Xs()}).observe(document.documentElement,{attributeFilter:["data-theme"],attributes:!0}));const qf=()=>Kt(ve(Gf,Pa)),Kf=(e={})=>{const t=se([]);return Jt(n=>{t.value=n==="beforeUnmount"?[]:Uf(de(e))}),t},Qf=e=>{const t=Fl();return b(()=>de(e)[t.value]??{})},ri=Qf;function Ln(e){return xo()?(ud(e),!0):!1}const ra=new WeakMap,Yf=(...e)=>{var t;const n=e[0],i=(t=Pn())==null?void 0:t.proxy;if(i==null&&!dc())throw new Error("injectLocal must be called in setup");return i&&ra.has(i)&&n in ra.get(i)?ra.get(i)[n]:ve(...e)},Vi=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const Jf=e=>e!=null,Xf=Object.prototype.toString,Zf=e=>Xf.call(e)==="[object Object]",qt=()=>{},Zs=e1();function e1(){var e,t;return Vi&&((e=window?.navigator)==null?void 0:e.userAgent)&&(/iP(?:ad|hone|od)/.test(window.navigator.userAgent)||((t=window?.navigator)==null?void 0:t.maxTouchPoints)>2&&/iPad|Macintosh/.test(window?.navigator.userAgent))}function Bu(...e){if(e.length!==1)return ii(...e);const t=e[0];return typeof t=="function"?Kt(Qo(()=>({get:t,set:qt}))):se(t)}function Cr(e,t){function n(...i){return new Promise((l,a)=>{Promise.resolve(e(()=>t.apply(this,i),{fn:t,thisArg:this,args:i})).then(l).catch(a)})}return n}const yu=e=>e();function t1(e,t={}){let n,i,l=qt;const a=c=>{clearTimeout(c),l(),l=qt};let r;return c=>{const d=de(e),u=de(t.maxWait);return n&&a(n),d<=0||u!==void 0&&u<=0?(i&&(a(i),i=void 0),Promise.resolve(c())):new Promise((p,h)=>{l=t.rejectOnCancel?h:p,r=c,u&&!i&&(i=setTimeout(()=>{n&&a(n),i=void 0,p(r())},u)),n=setTimeout(()=>{i&&a(i),i=void 0,p(c())},d)})}}function n1(...e){let t=0,n,i=!0,l=qt,a,r,o,c,d;!Re(e[0])&&typeof e[0]=="object"?{delay:r,trailing:o=!0,leading:c=!0,rejectOnCancel:d=!1}=e[0]:[r,o=!0,c=!0,d=!1]=e;const u=()=>{n&&(clearTimeout(n),n=void 0,l(),l=qt)};return h=>{const E=de(r),v=Date.now()-t,B=()=>a=h();return u(),E<=0?(t=Date.now(),B()):(v>E&&(c||!i)?(t=Date.now(),B()):o&&(a=new Promise((k,D)=>{l=d?D:k,n=setTimeout(()=>{t=Date.now(),i=!0,k(B()),u()},Math.max(0,E-v))})),!c&&!n&&(n=setTimeout(()=>i=!0,E)),i=!1,a)}}function i1(e=yu,t={}){const{initialState:n="active"}=t,i=Bu(n==="active");function l(){i.value=!1}function a(){i.value=!0}const r=(...o)=>{i.value&&e(...o)};return{isActive:Kt(i),pause:l,resume:a,eventFilter:r}}function l1(e){let t;function n(){return t||(t=e()),t}return n.reset=async()=>{const i=t;t=void 0,i&&await i},n}function eo(e){return e.endsWith("rem")?Number.parseFloat(e)*16:Number.parseFloat(e)}function _i(e){return Array.isArray(e)?e:[e]}function _u(e){return Pn()}
2943function bu(e,t=200,n={}){return Cr(t1(t,n),e)}function ku(e,t=200,n=!1,i=!0,l=!1){return Cr(n1(t,n,i,l),e)}function a1(e,t,n={}){const{eventFilter:i=yu,...l}=n;return we(e,Cr(i,t),l)}function r1(e,t,n={}){const{eventFilter:i,initialState:l="active",...a}=n,{eventFilter:r,pause:o,resume:c,isActive:d}=i1(i,{initialState:l});return{stop:a1(e,t,{...a,eventFilter:r}),pause:o,resume:c,isActive:d}}function si(e,t=!0,n){_u()?ye(e,n):t?e():fn(e)}function s1(e,t){_u()&&Sn(e,t)}function o1(e,t,n={}){const{immediate:i=!0,immediateCallback:l=!1}=n,a=ae(!1);let r;function o(){r&&(clearTimeout(r),r=void 0)}function c(){a.value=!1,o()}function d(...u){l&&e(),o(),a.value=!0,r=setTimeout(()=>{a.value=!1,r=void 0,e(...u)},de(t))}return i&&(a.value=!0,Vi&&d()),Ln(c),{isPending:Fd(a),start:d,stop:c}}function Ra(e=!1,t={}){const{truthyValue:n=!0,falsyValue:i=!1}=t,l=Re(e),a=ae(e);function r(o){if(arguments.length)return a.value=o,a.value;{const c=de(n);return a.value=a.value===c?de(i):c,a.value}}return l?r:[a,r]}function wt(e,t,n){return we(e,t,{...n,immediate:!0})}const Je=Vi?window:void 0,Cu=Vi?window.document:void 0,Du=Vi?window.navigator:void 0;function dt(e){var t;const n=de(e);return(t=n?.$el)!=null?t:n}function fe(...e){const t=[],n=()=>{t.forEach(o=>o()),t.length=0},i=(o,c,d,u)=>(o.addEventListener(c,d,u),()=>o.removeEventListener(c,d,u)),l=b(()=>{const o=_i(de(e[0])).filter(c=>c!=null);return o.every(c=>typeof c!="string")?o:void 0}),a=wt(()=>{var o,c;return[(c=(o=l.value)==null?void 0:o.map(d=>dt(d)))!=null?c:[Je].filter(d=>d!=null),_i(de(l.value?e[1]:e[0])),_i(un(l.value?e[2]:e[1])),de(l.value?e[3]:e[2])]},([o,c,d,u])=>{if(n(),!o?.length||!c?.length||!d?.length)return;const p=Zf(u)?{...u}:u;t.push(...o.flatMap(h=>c.flatMap(E=>d.map(v=>i(h,E,v,p)))))},{flush:"post"}),r=()=>{a(),n()};return Ln(n),r}function c1(){const e=ae(!1),t=Pn();return t&&ye(()=>{e.value=!0},t),e}function oi(e){const t=c1();return b(()=>(t.value,!!e()))}function Tu(e,t,n={}){const{window:i=Je,...l}=n;let a;const r=oi(()=>i&&"MutationObserver"in i),o=()=>{a&&(a.disconnect(),a=void 0)},c=b(()=>{const h=de(e),E=_i(h).map(dt).filter(Jf);return new Set(E)}),d=we(c,h=>{o(),r.value&&h.size&&(a=new MutationObserver(t),h.forEach(E=>a.observe(E,l)))},{immediate:!0,flush:"post"}),u=()=>a?.takeRecords(),p=()=>{d(),o()};return Ln(p),{isSupported:r,stop:p,takeRecords:u}}function u1(e,t,n={}){const{window:i=Je,document:l=i?.document,flush:a="sync"}=n;if(!i||!l)return qt;let r;const o=u=>{r?.(),r=u},c=or(()=>{const u=dt(e);if(u){const{stop:p}=Tu(l,h=>{h.map(v=>[...v.removedNodes]).flat().some(v=>v===u||v.contains(u))&&t(h)},{window:i,childList:!0,subtree:!0});o(p)}},{flush:a}),d=()=>{c(),o()};return Ln(d),d}const p1=Symbol("vueuse-ssr-width");function d1(){const e=dc()?Yf(p1,null):null;return typeof e=="number"?e:void 0}function Dr(e,t={}){const{window:n=Je,ssrWidth:i=d1()}=t,l=oi(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function"),a=ae(typeof i=="number"),r=ae(),o=ae(!1),c=d=>{o.value=d.matches};return or(()=>{if(a.value){a.value=!l.value;const d=de(e).split(",");o.value=d.some(u=>{const p=u.includes("not all"),h=u.match(/\(\s*min-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/),E=u.match(/\(\s*max-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/);let v=!!(h||E);return h&&v&&(v=i>=eo(h[1])),E&&v&&(v=i<=eo(E[1])),p?!v:v});return}l.value&&(r.value=n.matchMedia(de(e)),o.value=r.value.matches)}),fe(r,"change",c,{passive:!0}),b(()=>o.value)}function to(e,t={}){const{controls:n=!1,navigator:i=Du}=t,l=oi(()=>i&&"permissions"in i),a=ae(),r=typeof e=="string"?{name:e}:e,o=ae(),c=()=>{var u,p;o.value=(p=(u=a.value)==null?void 0:u.state)!=null?p:"prompt"};fe(a,"change",c,{passive:!0});const d=l1(async()=>{if(l.value){if(!a.value)try{a.value=await i.permissions.query(r)}catch{a.value=void 0}finally{c()}if(n)return pe(a.value)}});return d(),n?{state:o,isSupported:l,query:d}:o}function h1(e={}){const{navigator:t=Du,read:n=!1,source:i,copiedDuring:l=1500,legacy:a=!1}=e,r=oi(()=>t&&"clipboard"in t),o=to("clipboard-read"),c=to("clipboard-write"),d=b(()=>r.value||a),u=ae(""),p=ae(!1),h=o1(()=>p.value=!1,l,{immediate:!1});async function E(){let y=!(r.value&&D(o.value));if(!y)try{u.value=await t.clipboard.readText()}catch{y=!0}y&&(u.value=k())}d.value&&n&&fe(["copy","cut"],E,{passive:!0});async function v(y=de(i)){if(d.value&&y!=null){let m=!(r.value&&D(c.value));if(!m)try{await t.clipboard.writeText(y)}catch{m=!0}m&&B(y),u.value=y,p.value=!0,h.start()}}
2943function B(y){const m=document.createElement("textarea");m.value=y??"",m.style.position="absolute",m.style.opacity="0",document.body.appendChild(m),m.select(),document.execCommand("copy"),m.remove()}function k(){var y,m,_;return(_=(m=(y=document?.getSelection)==null?void 0:y.call(document))==null?void 0:m.toString())!=null?_:""}function D(y){return y==="granted"||y==="prompt"}return{isSupported:d,text:u,copied:p,copy:v}}const el=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},tl="__vueuse_ssr_handlers__",E1=f1();function f1(){return tl in el||(el[tl]=el[tl]||{}),el[tl]}function g1(e,t){return E1[e]||t}function m1(e){return Dr("(prefers-color-scheme: dark)",e)}function v1(e){return e==null?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":typeof e=="boolean"?"boolean":typeof e=="string"?"string":typeof e=="object"?"object":Number.isNaN(e)?"any":"number"}const A1={boolean:{read:e=>e==="true",write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}},no="vueuse-storage";function Ni(e,t,n,i={}){var l;const{flush:a="pre",deep:r=!0,listenToStorageChanges:o=!0,writeDefaults:c=!0,mergeDefaults:d=!1,shallow:u,window:p=Je,eventFilter:h,onError:E=G=>{console.error(G)},initOnMounted:v}=i,B=(u?ae:se)(typeof t=="function"?t():t),k=b(()=>de(e));if(!n)try{n=g1("getDefaultStorage",()=>{var G;return(G=Je)==null?void 0:G.localStorage})()}catch(G){E(G)}if(!n)return B;const D=de(t),y=v1(D),m=(l=i.serializer)!=null?l:A1[y],{pause:_,resume:P}=r1(B,G=>R(G),{flush:a,deep:r,eventFilter:h});we(k,()=>L(),{flush:a});let H=!1;const M=G=>{v&&!H||L(G)},z=G=>{v&&!H||Y(G)};p&&o&&(n instanceof Storage?fe(p,"storage",M,{passive:!0}):fe(p,no,z)),v?si(()=>{H=!0,L()}):L();function T(G,J){if(p){const V={key:k.value,oldValue:G,newValue:J,storageArea:n};p.dispatchEvent(n instanceof Storage?new StorageEvent("storage",V):new CustomEvent(no,{detail:V}))}}function R(G){try{const J=n.getItem(k.value);if(G==null)T(J,null),n.removeItem(k.value);else{const V=m.write(G);J!==V&&(n.setItem(k.value,V),T(J,V))}}catch(J){E(J)}}function j(G){const J=G?G.newValue:n.getItem(k.value);if(J==null)return c&&D!=null&&n.setItem(k.value,m.write(D)),D;if(!G&&d){const V=m.read(J);return typeof d=="function"?d(V,D):y==="object"&&!Array.isArray(V)?{...D,...V}:V}else return typeof J!="string"?J:m.read(J)}function L(G){if(!(G&&G.storageArea!==n)){if(G&&G.key==null){B.value=D;return}if(!(G&&G.key!==k.value)){_();try{const J=m.write(B.value);(G===void 0||G?.newValue!==J)&&(B.value=j(G))}catch(J){E(J)}finally{G?fn(P):P()}}}}function Y(G){L(G.detail)}return B}function B1(e,t,n={}){const{window:i=Je,...l}=n;let a;const r=oi(()=>i&&"ResizeObserver"in i),o=()=>{a&&(a.disconnect(),a=void 0)},c=b(()=>{const p=de(e);return Array.isArray(p)?p.map(h=>dt(h)):[dt(p)]}),d=we(c,p=>{if(o(),r.value&&i){a=new ResizeObserver(t);for(const h of p)h&&a.observe(h,l)}},{immediate:!0,flush:"post"}),u=()=>{o(),d()};return Ln(u),{isSupported:r,stop:u}}function y1(e,t={}){const{delayEnter:n=0,delayLeave:i=0,triggerOnRemoval:l=!1,window:a=Je}=t,r=ae(!1);let o;const c=d=>{const u=d?n:i;o&&(clearTimeout(o),o=void 0),u?o=setTimeout(()=>r.value=d,u):r.value=d};return a&&(fe(e,"mouseenter",()=>c(!0),{passive:!0}),fe(e,"mouseleave",()=>c(!1),{passive:!0}),l&&u1(b(()=>dt(e)),()=>c(!1))),r}function _1(e,t={width:0,height:0},n={}){const{window:i=Je,box:l="content-box"}=n,a=b(()=>{var p,h;return(h=(p=dt(e))==null?void 0:p.namespaceURI)==null?void 0:h.includes("svg")}),r=ae(t.width),o=ae(t.height),{stop:c}=B1(e,([p])=>{const h=l==="border-box"?p.borderBoxSize:l==="content-box"?p.contentBoxSize:p.devicePixelContentBoxSize;if(i&&a.value){const E=dt(e);if(E){const v=E.getBoundingClientRect();r.value=v.width,o.value=v.height}}else if(h){const E=_i(h);r.value=E.reduce((v,{inlineSize:B})=>v+B,0),o.value=E.reduce((v,{blockSize:B})=>v+B,0)}else r.value=p.contentRect.width,o.value=p.contentRect.height},n);si(()=>{const p=dt(e);p&&(r.value="offsetWidth"in p?p.offsetWidth:t.width,o.value="offsetHeight"in p?p.offsetHeight:t.height)});const d=we(()=>dt(e),p=>{r.value=p?t.width:0,o.value=p?t.height:0});function u(){c(),d()}return{width:r,height:o,stop:u}}const io=["fullscreenchange","webkitfullscreenchange","webkitendfullscreen","mozfullscreenchange","MSFullscreenChange"];function Ll(e,t={}){const{document:n=Cu,autoExit:i=!1}=t,l=b(()=>{var y;return(y=dt(e))!=null?y:n?.documentElement}),a=ae(!1),r=b(()=>["requestFullscreen","webkitRequestFullscreen","webkitEnterFullscreen","webkitEnterFullScreen","webkitRequestFullScreen","mozRequestFullScreen","msRequestFullscreen"].find(y=>n&&y in n||l.value&&y in l.value)),o=b(()=>["exitFullscreen","webkitExitFullscreen","webkitExitFullScreen","webkitCancelFullScreen","mozCancelFullScreen","msExitFullscreen"].find(y=>n&&y in n||l.value&&y in l.value)),c=b(()=>["fullScreen","webkitIsFullScreen","webkitDisplayingFullscreen","mozFullScreen","msFullscreenElement"].find(y=>n&&y in n||l.value&&y in l.value)),d=["fullscreenElement","webkitFullscreenElement","mozFullScreenElement","msFullscreenElement"].find(y=>n&&y in n),u=oi(()=>l.value&&n&&r.value!==void 0&&o.value!==void 0&&c.value!==void 0),p=()=>d?n?.[d]===l.value:!1,h=()=>
2943{if(c.value){if(n&&n[c.value]!=null)return n[c.value];{const y=l.value;if(y?.[c.value]!=null)return!!y[c.value]}}return!1};async function E(){if(!(!u.value||!a.value)){if(o.value)if(n?.[o.value]!=null)await n[o.value]();else{const y=l.value;y?.[o.value]!=null&&await y[o.value]()}a.value=!1}}async function v(){if(!u.value||a.value)return;h()&&await E();const y=l.value;r.value&&y?.[r.value]!=null&&(await y[r.value](),a.value=!0)}async function B(){await(a.value?E():v())}const k=()=>{const y=h();(!y||y&&p())&&(a.value=y)},D={capture:!1,passive:!0};return fe(n,io,k,D),fe(()=>dt(l),io,k,D),si(k,!1),i&&Ln(E),{isSupported:u,isFullscreen:a,enter:v,exit:E,toggle:B}}function sa(e){return typeof Window<"u"&&e instanceof Window?e.document.documentElement:typeof Document<"u"&&e instanceof Document?e.documentElement:e}const lo=1;function b1(e,t={}){const{throttle:n=0,idle:i=200,onStop:l=qt,onScroll:a=qt,offset:r={left:0,right:0,top:0,bottom:0},observe:o={mutation:!1},eventListenerOptions:c={capture:!1,passive:!0},behavior:d="auto",window:u=Je,onError:p=T=>{console.error(T)}}=t,h=typeof o=="boolean"?{mutation:o}:o,E=ae(0),v=ae(0),B=b({get(){return E.value},set(T){D(T,void 0)}}),k=b({get(){return v.value},set(T){D(void 0,T)}});function D(T,R){var j,L,Y,G;if(!u)return;const J=de(e);if(!J)return;(Y=J instanceof Document?u.document.body:J)==null||Y.scrollTo({top:(j=de(R))!=null?j:k.value,left:(L=de(T))!=null?L:B.value,behavior:de(d)});const V=((G=J?.document)==null?void 0:G.documentElement)||J?.documentElement||J;B!=null&&(E.value=V.scrollLeft),k!=null&&(v.value=V.scrollTop)}const y=ae(!1),m=Tn({left:!0,right:!1,top:!0,bottom:!1}),_=Tn({left:!1,right:!1,top:!1,bottom:!1}),P=T=>{y.value&&(y.value=!1,_.left=!1,_.right=!1,_.top=!1,_.bottom=!1,l(T))},H=bu(P,n+i),M=T=>{var R;if(!u)return;const j=((R=T?.document)==null?void 0:R.documentElement)||T?.documentElement||dt(T),{display:L,flexDirection:Y,direction:G}=getComputedStyle(j),J=G==="rtl"?-1:1,V=j.scrollLeft;_.left=V<E.value,_.right=V>E.value;const te=Math.abs(V*J)<=(r.left||0),Q=Math.abs(V*J)+j.clientWidth>=j.scrollWidth-(r.right||0)-lo;L==="flex"&&Y==="row-reverse"?(m.left=Q,m.right=te):(m.left=te,m.right=Q),E.value=V;let ce=j.scrollTop;T===u.document&&!ce&&(ce=u.document.body.scrollTop),_.top=ce<v.value,_.bottom=ce>v.value;const nt=Math.abs(ce)<=(r.top||0),Ue=Math.abs(ce)+j.clientHeight>=j.scrollHeight-(r.bottom||0)-lo;L==="flex"&&Y==="column-reverse"?(m.top=Ue,m.bottom=nt):(m.top=nt,m.bottom=Ue),v.value=ce},z=T=>{var R;if(!u)return;const j=(R=T.target.documentElement)!=null?R:T.target;M(j),y.value=!0,H(T),a(T)};return fe(e,"scroll",n?ku(z,n,!0,!1):z,c),si(()=>{try{const T=de(e);if(!T)return;M(T)}catch(T){p(T)}}),h?.mutation&&e!=null&&e!==u&&e!==document&&Tu(e,()=>{const T=de(e);T&&M(T)},{attributes:!0,childList:!0,subtree:!0}),fe(e,"scrollend",P,c),{x:B,y:k,isScrolling:y,arrivedState:m,directions:_,measure(){const T=de(e);u&&T&&M(T)}}}function k1(e,t,n={}){const{window:i=Je}=n;return Ni(e,t,i?.localStorage,n)}function C1(e={}){const{window:t=Je}=e;if(!t)return ae(["en"]);const n=t.navigator,i=ae(n.languages);return fe(t,"languagechange",()=>{i.value=n.languages},{passive:!0}),i}function oa(e,t=qt,n={}){const{immediate:i=!0,manual:l=!1,type:a="text/javascript",async:r=!0,crossOrigin:o,referrerPolicy:c,noModule:d,defer:u,document:p=Cu,attrs:h={},nonce:E=void 0}=n,v=ae(null);let B=null;const k=m=>new Promise((_,P)=>{const H=R=>(v.value=R,_(R),R);if(!p){_(!1);return}let M=!1,z=p.querySelector(`script[src="${de(e)}"]`);z?z.hasAttribute("data-loaded")&&H(z):(z=p.createElement("script"),z.type=a,z.async=r,z.src=de(e),u&&(z.defer=u),o&&(z.crossOrigin=o),d&&(z.noModule=d),c&&(z.referrerPolicy=c),E&&(z.nonce=E),Object.entries(h).forEach(([R,j])=>z?.setAttribute(R,j)),M=!0);const T={passive:!0};fe(z,"error",R=>P(R),T),fe(z,"abort",R=>P(R),T),fe(z,"load",()=>{z.setAttribute("data-loaded","true"),t(z),H(z)},T),M&&(z=p.head.appendChild(z)),m||H(z)}),D=(m=!0)=>(B||(B=k(m)),B),y=()=>{if(!p)return;B=null,v.value&&(v.value=null);const m=p.querySelector(`script[src="${de(e)}"]`);m&&p.head.removeChild(m)};return i&&!l&&si(D),l||s1(y),{scriptTag:v,load:D,unload:y}}function wu(e){const t=window.getComputedStyle(e);
2943if(t.overflowX==="scroll"||t.overflowY==="scroll"||t.overflowX==="auto"&&e.clientWidth<e.scrollWidth||t.overflowY==="auto"&&e.clientHeight<e.scrollHeight)return!0;{const n=e.parentNode;return!n||n.tagName==="BODY"?!1:wu(n)}}function D1(e){const t=e||window.event,n=t.target;return wu(n)?!1:t.touches.length>1?!0:(t.preventDefault&&t.preventDefault(),!1)}const ca=new WeakMap;function Tr(e,t=!1){const n=ae(t);let i=null,l="";we(Bu(e),o=>{const c=sa(de(o));if(c){const d=c;if(ca.get(d)||ca.set(d,d.style.overflow),d.style.overflow!=="hidden"&&(l=d.style.overflow),d.style.overflow==="hidden")return n.value=!0;if(n.value)return d.style.overflow="hidden"}},{immediate:!0});const a=()=>{const o=sa(de(e));!o||n.value||(Zs&&(i=fe(o,"touchmove",c=>{D1(c)},{passive:!1})),o.style.overflow="hidden",n.value=!0)},r=()=>{const o=sa(de(e));!o||!n.value||(Zs&&i?.(),o.style.overflow=l,ca.delete(o),n.value=!1)};return Ln(r),b({get(){return n.value},set(o){o?a():r()}})}function T1(e,t,n={}){const{window:i=Je}=n;return Ni(e,t,i?.sessionStorage,n)}function w1(e={}){const{window:t=Je,...n}=e;return b1(t,n)}function x1(e={}){const{window:t=Je,initialWidth:n=Number.POSITIVE_INFINITY,initialHeight:i=Number.POSITIVE_INFINITY,listenOrientation:l=!0,includeScrollbar:a=!0,type:r="inner"}=e,o=ae(n),c=ae(i),d=()=>{if(t)if(r==="outer")o.value=t.outerWidth,c.value=t.outerHeight;else if(r==="visual"&&t.visualViewport){const{width:p,height:h,scale:E}=t.visualViewport;o.value=Math.round(p*E),c.value=Math.round(h*E)}else a?(o.value=t.innerWidth,c.value=t.innerHeight):(o.value=t.document.documentElement.clientWidth,c.value=t.document.documentElement.clientHeight)};d(),si(d);const u={passive:!0};if(fe("resize",d,u),t&&r==="visual"&&t.visualViewport&&fe(t.visualViewport,"resize",d,u),l){const p=Dr("(orientation: portrait)");we(p,()=>d())}return{width:o,height:c}}const F1=()=>{const e=rf();return b(()=>Object.keys(e.value))},xu=(e=!0)=>{const{frontmatter:t,page:n}=gn();return b(()=>t.value.contributors===!1||!de(e)?[]:n.value.git.contributors??[])};var ao={"/":{contributors:"贡献者",changelog:"更新日志",timeOn:"于",viewChangelog:"查看所有更新日志",latestUpdateAt:"最近更新"},"/en/":{contributors:"Contributors",changelog:"Changelog",timeOn:"on",viewChangelog:"View All Changelog",latestUpdateAt:"Last Updated"}};const S1=typeof ao>"u"?{}:ao,Fu=()=>ri(S1),P1=(e=!0)=>{const{lang:t,page:n}=gn(),i=Fu();return b(()=>{if(!de(e))return null;const l=n.value.git?.updatedTime??n.value.git?.changelog?.[0].time;if(!l)return null;const a=new Date(l),r=new Intl.DateTimeFormat(t.value,{dateStyle:"short",timeStyle:"short"}).format(l);return{date:a,text:r,iso:a.toISOString(),locale:i.value.latestUpdateAt}})},R1=({level:e=2,text:t,anchor:n})=>s(`h${e||2}`,{id:n,tabindex:"-1"},s("a",{href:`#${n}`,class:"header-anchor"},s("span",t))),L1=({name:e,url:t,avatar:n})=>s(t?"a":"span",{href:t,target:"_blank",rel:"noreferrer",class:"vp-contributor"},[n?s("img",{src:n,alt:"",class:"vp-contributor-avatar"}):null,s("span",{class:"vp-contributor-name"},e)]),O1=I({name:"GitContributors",props:{title:String,headerLevel:{type:Number,default:2}},setup(e){const t=xu(),n=Fu();return()=>t.value.length?[s(R1,{level:e.headerLevel,anchor:"doc-contributors",text:e.title||n.value.contributors}),s("div",{class:"vp-contributors"},t.value.map(i=>s(L1,i)))]:null}}),I1={enhance:({app:e})=>{e.component("GitContributors",O1)}},M1=Object.freeze(Object.defineProperty({__proto__:null,default:I1},Symbol.toStringTag,{value:"Module"})),V1=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:"Module"})),N1=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:"Module"}));let $1={};const j1=()=>$1,H1=e=>`data:image/svg+xml;charset=utf8,${e.replace(/<br>/g,"<br />").replace(/%/g,"%25").replace(/"/g,"%22").replace(/'/g,"%27").replace(/&/g,"%26").replace(/#/g,"%23").replace(/{/g,"%7B").replace(/}/g,"%7D").replace(/</g,"%3C").replace(/>/g,"%3E")}`,z1='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1316 1024" fill="currentColor"><path d="M658.286 0C415.89 0 0 297.106 0 512c0 214.82 415.89 512 658.286 512 242.322 0 658.285-294.839 658.285-512S900.608 0 658.286 0zm0 877.714c-161.573 0-512-221.769-512-365.714 0-144.018 350.427-365.714 512-365.714 161.572 0 512 217.16 512 365.714s-350.428 365.714-512 365.714z"/><path d="M658.286 292.571a219.429 219.429 0 1 0 0 438.858 219.429 219.429 0 0 0 0-438.858zm0 292.572a73.143 73.143 0 1 1 0-146.286 73.143 73.143 0 0 1 0 146.286z"/></svg>',U1='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" fill="currentColor"><path d="M828.976 894.125H190.189c-70.55 0-127.754-57.185-127.754-127.753V606.674c0-17.634 14.31-31.933 31.933-31.933h63.889c17.634 0 31.932 14.299 31.932 31.933v95.822c0 35.282 28.596 63.877 63.877 63.877h511.033c35.281 0 63.877-28.595 63.877-63.877v-95.822c0-17.634 14.298-31.933 31.943-31.933h63.878c17.635 0 31.933 14.299 31.933 31.933v159.7c0 70.566-57.191 127.751-127.754 127.751zM249.939 267.51c12.921-12.92 33.885-12.92 46.807 0l148.97 148.972V94.893c0-17.634 14.302-31.947 31.934-31.947h63.876c17.638 0 31.946 14.313 31.946 31.947v321.589l148.97-148.972c12.922-12.92 33.876-12.92 46.797 0l46.814 46.818c12.922 12.922 12.922 33.874 0 46.807L552.261 624.93c-1.14 1.138-21.664 13.684-42.3
294315 13.693-20.877.01-41.88-12.542-43.021-13.693L203.122 361.135c-12.923-12.934-12.923-33.885 0-46.807l46.817-46.818z"/></svg>',Vn={useMaxWidth:!1};var W1=I({name:"Mermaid",props:{code:{type:String,required:!0},title:String},setup(e){const t=lr(),n=qf(),{themeVariables:i,...l}=j1(),a=ae(),r=b(()=>Js(e.code)),o=se(""),c=async()=>{const{default:p}=await f(async()=>{const{default:h}=await import("./mermaid.esm.min-BAXkhqed.js").then(E=>E.b8);return{default:h}},[]);p.initialize({theme:n.value?"dark":"default",themeVariables:{dark:n.value,...zE(i)?i(n.value):i},flowchart:Vn,sequence:Vn,journey:Vn,gantt:Vn,er:Vn,pie:Vn,...l,startOnLoad:!1}),o.value=(await p.render(t,r.value)).svg},d=()=>{const{body:p}=document,h=document.createElement("div");h.classList.add("mermaid-preview"),h.innerHTML=o.value,p.appendChild(h),h.addEventListener("click",()=>{p.removeChild(h)})},u=()=>{const p=H1(o.value),h=document.createElement("a");h.setAttribute("href",p),h.setAttribute("download",`${e.title?Js(e.title):t}.svg`),h.click()};return ye(()=>{wt(n,c,{flush:"post"})}),()=>[s("div",{class:"mermaid-actions"},[s("button",{class:"preview-button",title:"preview",innerHTML:z1,onClick:d}),s("button",{class:"download-button",title:"download",innerHTML:U1,onClick:u})]),s("div",{ref:a,class:"mermaid-wrapper"},o.value?s("div",{class:"mermaid-content",innerHTML:o.value}):s(Br,{class:"mermaid-loading",height:96}))]}});const G1=St({enhance:({app:e})=>{e.component("Mermaid",W1)}}),q1=Object.freeze(Object.defineProperty({__proto__:null,default:G1},Symbol.toStringTag,{value:"Module"})),K1=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:"Module"})),Q1=St({setup(){fe("beforeprint",()=>{document.querySelectorAll("details").forEach(e=>{e.open=!0})},{passive:!0})}}),Y1=Object.freeze(Object.defineProperty({__proto__:null,default:Q1},Symbol.toStringTag,{value:"Module"})),J1=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:"Module"})),X1="VUEPRESS_CODE_TAB_STORE",nl=Ni(X1,{}),Z1=I({name:"CodeTabs",props:{active:{type:Number,default:0},data:{type:Array,required:!0},tabId:String},slots:Object,setup(e,{slots:t}){let n=e.data.map(()=>lr());const i=se(e.active),l=ae([]),a=()=>{e.tabId&&(nl.value[e.tabId]=e.data[i.value].id)},r=(u=i.value)=>{i.value=u<l.value.length-1?u+1:0,l.value[i.value].focus()},o=(u=i.value)=>{i.value=u>0?u-1:l.value.length-1,l.value[i.value].focus()},c=(u,p)=>{u.key===" "||u.key==="Enter"?(u.preventDefault(),i.value=p):u.key==="ArrowRight"?(u.preventDefault(),r()):u.key==="ArrowLeft"&&(u.preventDefault(),o()),e.tabId&&(nl.value[e.tabId]=e.data[i.value].id)},d=()=>{if(e.tabId){const u=e.data.findIndex(({id:p})=>nl.value[e.tabId]===p);if(u!==-1)return u}return e.active};return ye(()=>{i.value=d(),we(()=>e.tabId&&nl.value[e.tabId],(u,p)=>{if(e.tabId&&u!==p){const h=e.data.findIndex(({id:E})=>E===u);h!==-1&&(i.value=h)}})}),()=>e.data.length?s("div",{class:"vp-code-tabs"},[s("div",{class:"vp-code-tabs-nav",role:"tablist"},e.data.map(({id:u},p)=>{const h=p===i.value;return s("button",{type:"button",ref:E=>{E&&(l.value[p]=E)},class:["vp-code-tab-nav",{active:h}],role:"tab","aria-controls":n[p],"aria-selected":h,onClick:()=>{i.value=p,a()},onKeydown:E=>{c(E,p)}},t[`title${p}`]({value:u,isActive:h}))})),e.data.map(({id:u},p)=>{const h=p===i.value;return s("div",{class:["vp-code-tab",{active:h}],id:n[p],role:"tabpanel","aria-expanded":h},[s("div",{class:"vp-code-tab-title"},t[`title${p}`]({value:u,isActive:h})),t[`tab${p}`]({value:u,isActive:h})])})]):null}}),e8="VUEPRESS_TAB_STORE",ua=Ni(e8,{}),t8=I({name:"Tabs",props:{active:{type:Number,default:0},data:{type:Array,required:!0},tabId:String},slots:Object,setup(e,{slots:t}){let n=e.data.map(()=>lr());const i=se(e.active),l=ae([]),a=()=>{e.tabId&&(ua.value[e.tabId]=e.data[i.value].id)},r=(u=i.value)=>{i.value=u<l.value.length-1?u+1:0,l.value[i.value].focus()},o=(u=i.value)=>{i.value=u>0?u-1:l.value.length-1,l.value[i.value].focus()},c=(u,p)=>{u.key===" "||u.key==="Enter"?(u.preventDefault(),i.value=p):u.key==="ArrowRight"?(u.preventDefault(),r()):u.key==="ArrowLeft"&&(u.preventDefault(),o()),a()},d=()=>
2943{if(e.tabId){const u=e.data.findIndex(({id:p})=>ua.value[e.tabId]===p);if(u!==-1)return u}return e.active};return ye(()=>{i.value=d(),we(()=>e.tabId&&ua.value[e.tabId],(u,p)=>{if(e.tabId&&u!==p){const h=e.data.findIndex(({id:E})=>E===u);h!==-1&&(i.value=h)}})}),()=>e.data.length?s("div",{class:"vp-tabs"},[s("div",{class:"vp-tabs-nav",role:"tablist"},e.data.map(({id:u},p)=>{const h=p===i.value;return s("button",{type:"button",ref:E=>{E&&(l.value[p]=E)},class:["vp-tab-nav",{active:h}],role:"tab","aria-controls":n[p],"aria-selected":h,onClick:()=>{i.value=p,a()},onKeydown:E=>{c(E,p)}},t[`title${p}`]({value:u,isActive:h}))})),e.data.map(({id:u},p)=>{const h=p===i.value;return s("div",{class:["vp-tab",{active:h}],id:n[p],role:"tabpanel","aria-expanded":h},[s("div",{class:"vp-tab-title"},t[`title${p}`]({value:u,isActive:h})),t[`tab${p}`]({value:u,isActive:h})])})]):null}}),n8={enhance:({app:e})=>{e.component("CodeTabs",Z1),e.component("Tabs",t8)}},i8=Object.freeze(Object.defineProperty({__proto__:null,default:n8},Symbol.toStringTag,{value:"Module"})),l8=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:"Module"})),a8=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:"Module"})),r8=JSON.parse(`{"encrypt":{},"author":{"name":"chiichen"},"logo":"/KissingCat.jpg","repo":"chiichen/chiichen.github.io","docsBranch":"master","docsDir":"src","blog":{"medias":{"BiliBili":"https://space.bilibili.com/8427907?spm_id_from=333.1007.0.0","Email":"mailto:[email protected]","GitHub":"https://github.com/chiichen","Gmail":"mailto:[email protected]","Steam":"https://steamcommunity.com/profiles/76561198280284334/","Zhihu":"https://www.zhihu.com/people/hacker.fucker"}},"locales":{"/":{"lang":"zh-CN","navbarLocales":{"langName":"简体中文","selectLangAriaLabel":"选择语言"},"metaLocales":{"author":"作者","date":"写作日期","origin":"原创","views":"访问量","category":"分类","tag":"标签","readingTime":"阅读时间","words":"字数","toc":"此页内容","prev":"上一页","next":"下一页","contributors":"贡献者","editLink":"在 GitHub 上编辑此页","print":"打印"},"blogLocales":{"article":"文章","articleList":"文章列表","category":"分类","tag":"标签","timeline":"时间轴","timelineTitle":"昨日不在","all":"全部","intro":"个人介绍","star":"星标","empty":"$text 为空"},"paginationLocales":{"prev":"上一页","next":"下一页","navigate":"跳转到","action":"前往","errorText":"请输入 1 到 $page 之前的页码!"},"outlookLocales":{"themeColor":"主题色","darkmode":"外观","fullscreen":"全屏"},"routerLocales":{"skipToContent":"跳至主要內容","notFoundTitle":"页面不存在","notFoundMsg":["这里什么也没有","我们是怎么来到这儿的?","这 是 四 零 四 !","看起来你访问了一个失效的链接"],"back":"返回上一页","home":"带我回家"},"navbar":["/",{"text":"编程技术","icon":"edit","prefix":"/posts/","children":[{"text":"Linux内核","icon":"edit","prefix":"Linux内核/","children":[{"text":"VsCode+Qemu开发Linux内核","icon":"edit","link":"vscode qemu开发Linux内核"},{"text":"Linux内核Numa实现细节","icon":"edit","link":"NUMA Balance实现浅析"},{"text":"Patch:多层内存Numa Balancing","icon":"edit","link":"Patch解读/LWN针对多层内存系统重新进行NUMA平衡"}]},{"text":"杂谈","icon":"edit","prefix":"杂谈/","children":[{"text":"震惊!!1=0","icon":"page","link":"编程杂谈/震惊!1等于0.md"},{"text":"记一次 GP Debug 的心路历程","icon":"page","link":"Debug杂谈/记一次 GP Debug 的心路历程.md"},{"text":"高级语言的编译:链接及装载过程介绍","icon":"page","link":"编程杂谈/高级语言的编译-链接及装载过程介绍"}]},{"text":"Rust生命周期常见误区","icon":"page","link":"Rust/Rust生命周期常见误区.md"}]},{"text":"课程笔记","icon":"note","prefix":"/notes","children":[{"text":"编译原理","icon":"edit","prefix":"Compile-Principles/","children":[{"text":"编译原理笔记","icon":"edit","link":"Chapter0-Introduce"}]},{"text":"数据库","icon":"edit","prefix":"Database/","children":[{"text":"数据库笔记","icon":"edit","link":"Chapter1-Introduction"}]},{"text":"大学物理","icon":"edit","prefix":"College-Physics/","children":[{"text":"电磁学公式汇总","icon":"edit","link":"Electromagnetic-Formula"}]}]}],"sidebar":{"/":["",{"text":"编程技术","icon":"note","prefix":"posts/","children":"structure"},{"text":"课程笔记","icon":"note","prefix":"notes/","children":"structure"},"intro"]},"footer":"闪耀的群星也有黯淡之时","displayFooter":true,"blog":{"description":"Programmer","intro":"/intro.html","roundAvatar":true}},"/en/":{"lang":"en-US","navbarLocales":{"langName":"English","selectLangAriaLabel":"Select language"},"metaLocales":{"author":"Author","date":"Writing Date","origin":"Original","views":"Page views","category":"Category","tag":"Tag","readingTime":"Reading Time","words":"Words","toc":"On This Page","prev":"Prev","next":"Next","contributors":"Contributors","editLink":"Edit this page on GitHub","print":"Print"},"blogLocales":{"article":"Articles","articleList":"Article List","category":"Category","tag":"Tag","timeline":"Timeline","timelineTitle":"Yesterday Once More!","all":"All","intro":"Personal Intro","star":"Star","empty":"No $text"},"paginationLocales":{"prev":"Prev","next":"Next","navigate":"Jump to","action":"Go","errorText":"Please enter a number between 1 and $page !"},"outlookLocales":{"themeColor":"Theme Color","darkmode":"Theme Mode","fullscreen":"Full Screen"},"routerLocales":{"skipToContent":"Skip to main content","notFoundTitle":"Page not found","notFoundMsg":["There’s nothing here.","How did we get here?","That’s a Four-Oh-Four.","Looks like we've got some broken links."],"back":"Go back","home":"Take me home"},"navbar":["/en/",{"text":"Posts","icon":"edit","prefix":"/en/posts/","children":[]}],"sidebar":{"/en/":["",{"text":"Articles","icon":"note","prefix":"posts/","children":"structure"},"intro"]},"footer":"Default footer","displayFooter":true,"blog":{"description":"Programmer","intro":"/en/intro.html"}}}}`),s8=se(r8),Su=()=>s8,Pu=Symbol(""),o8=()=>{const e=ve(Pu);if(!e)throw new Error("useThemeLocaleData() is called without provider.");return e},c8=(e,t)=>{const{locales:n,...i}=e;return{...i,...n?.[t]}},u8=St({enhance({app:e}){const t=Su(),n=e._context.provides[mr],i=b(()=>c8(t.value,n.routeLocale.value));e.provide(Pu,i),Object.defineProperties(e.config.globalProperties,{$theme:{get(){return t.value}},$themeLocale:{get(){return i.value}}})}}),p8=Object.freeze(Object.defineProperty({__proto__:null,default:u8},Symbol.toStringTag,{value:"Module"}));var d8={"/":{backToTop:"返回顶部"},"/en/":{backToTop:"Back to top"}};const h8=I({name:"BackToTop",setup(){const e=Et(),t=ri(d8),n=ae(),{height:i}=_1(n),{height:l}=x1(),{y:a}=w1(),r=b(()=>(e.value.backToTop??!0)&&a.value>100),o=b(()=>a.value/(i.value-l.value)*100);return ye(()=>
2943{n.value=document.body}),()=>s(ei,{name:"fade-in"},()=>r.value?s("button",{type:"button",class:"vp-back-to-top-button","aria-label":t.value.backToTop,onClick:()=>{window.scrollTo({top:0,behavior:"smooth"})}},[s("span",{class:"vp-scroll-progress",role:"progressbar","aria-labelledby":"loadinglabel","aria-valuenow":o.value},s("svg",s("circle",{cx:"26",cy:"26",r:"24",fill:"none",stroke:"currentColor","stroke-width":"4","stroke-dasharray":`${Math.PI*o.value*.48} ${Math.PI*(100-o.value)*.48}`}))),s("div",{class:"back-to-top-icon"})]):null)}}),E8=St({rootComponents:[h8]}),f8=Object.freeze(Object.defineProperty({__proto__:null,default:E8},Symbol.toStringTag,{value:"Module"})),g8=/language-(shellscript|shell|bash|sh|zsh)/,m8=({selector:e,ignoreSelector:t,inlineSelector:n,duration:i=2e3,locales:l,showInMobile:a,transform:r})=>{const o=Dr("(max-width: 419px)"),c=b(()=>!o.value||a),d=ri(l),u=B=>{if(B.hasAttribute("copy-code"))return;const k=document.createElement("button");k.type="button",k.classList.add("vp-copy-code-button"),k.setAttribute("aria-label",d.value.copy),k.setAttribute("data-copied",d.value.copied),B.parentElement?.insertBefore(k,B),B.setAttribute("copy-code","")},p=()=>{document.body.classList.toggle("no-copy-code",!c.value),c.value&&document.querySelectorAll(e).forEach(u)};wt(c,()=>fn(p),{flush:"post"}),Jt(B=>{B!=="beforeUnmount"&&p()});const{copy:h}=h1({legacy:!0}),E=new WeakMap,v=async(B,k,D)=>{const y=k.cloneNode(!0);r&&r(y);let m=y.textContent||"";if(g8.test(B.className)&&(m=m.replace(/^ *(\$|>) /gm,"")),await h(m),i<=0)return;D.classList.add("copied"),clearTimeout(E.get(D));const _=setTimeout(()=>{D.classList.remove("copied"),D.blur(),E.delete(D)},i);E.set(D,_)};fe("click",B=>{const k=B.target;if(c.value&&k.matches('div[class*="language-"] > button.vp-copy-code-button')){const D=k.parentElement,y=k.nextElementSibling;if(!D||!y)return;v(D,y,k)}},{passive:!0})};var v8={"/":{copy:"复制代码",copied:"已复制"},"/en/":{copy:"Copy code",copied:"Copied"}};const A8=St({setup:()=>{m8({selector:'[vp-content] div[class*="language-"] pre',ignoreSelector:"",inlineSelector:"",locales:v8,duration:2e3,showInMobile:!1})}}),B8=Object.freeze(Object.defineProperty({__proto__:null,default:A8},Symbol.toStringTag,{value:"Module"})),y8=I({name:"VPIcon",props:{type:{type:String,default:"unknown"},prefix:String,icon:String,color:String,size:[String,Number],verticalAlign:String,sizing:{type:String,default:"height"}},setup(e){const t=b(()=>e.icon?li(e.icon)?e.icon:Rl(e.icon)?Ce(e.icon):null:null),n=b(()=>{const l={},{type:a,verticalAlign:r,size:o,sizing:c}=e,d={sizing:c};return e.color&&(l.color=e.color),o&&(l["--icon-size"]=Number.isNaN(Number(o))?o:`${o}px`),r&&(l["--icon-vertical-align"]=r),a==="iconify"&&(c!=="height"&&(d.width=e.size||"1em"),c!=="width"&&(d.height=e.size||"1em")),Gt(l).length&&(d.style=l),d}),i=l=>l.includes("fa-")||/^fa.$/.test(l)?l:`fa-${l}`;return()=>{const{type:l,icon:a,prefix:r="",sizing:o}=e;if(!a)return null;if(t.value)return s("img",{class:"vp-icon",src:t.value,alt:"","aria-hidden":"","no-view":"",...n.value});if(l==="iconify")return s("iconify-icon",{key:a,class:"vp-icon",icon:a.includes(":")?a:`${r}${a}`,...n.value});if(l==="fontawesome"){const[c,d]=a.includes(":")?a.split(":",2):["fas",a];return s("i",{key:a,class:["vp-icon",c.length===1?`fa${c}`:i(c),...d.split(" ").map(i),o==="height"?"":"fa-fw"],...n.value})}return s("i",{key:a,class:["vp-icon",a.includes(" ")?a:`${r}${a}`],...n.value})}}}),_8={enhance:({app:e})=>{ht("VPIcon")||e.component("VPIcon",t=>s(y8,{type:"fontawesome",prefix:"",...t}))},setup:()=>{oa("https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6/js/solid.min.js",()=>{},{attrs:{"data-auto-replace-svg":"nest"}}),oa("https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6/js/regular.min.js",()=>{},{attrs:{"data-auto-replace-svg":"nest"}}),oa("https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6/js/fontawesome.min.js",()=>{},{attrs:{"data-auto-replace-svg":"nest"}})}},b8=Object.freeze(Object.defineProperty({__proto__:null,default:_8},Symbol.toStringTag,{value:"Module"})),k8=se({}),Ru=Symbol(""),C8=()=>ve(Ru),D8=e=>{e.provide(Ru,k8)},Lu=e=>new Promise((t,n)=>{e.complete?t({type:"image",element:e,src:e.src,width:e.naturalWi
2943dth,height:e.naturalHeight,alt:e.alt,msrc:e.src}):(e.onload=()=>{t(Lu(e))},e.onerror=()=>{n()})}),T8='<div class="photo-swipe-loading"><svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" preserveAspectRatio="xMidYMid" viewBox="25 25 50 50"><animateTransform attributeName="transform" type="rotate" dur="2s" keyTimes="0;1" repeatCount="indefinite" values="0;360"></animateTransform><circle cx="50" cy="50" r="20" fill="none" stroke="currentColor" stroke-width="4" stroke-linecap="round"><animate attributeName="stroke-dasharray" dur="1.5s" keyTimes="0;0.5;1" repeatCount="indefinite" values="1,200;90,200;1,200"></animate><animate attributeName="stroke-dashoffset" dur="1.5s" keyTimes="0;0.5;1" repeatCount="indefinite" values="0;-35px;-125px"></animate></circle></svg></div>',w8=(e,{download:t=!0,fullscreen:n=!0}={})=>{e.on("uiRegister",()=>{if(e.ui.registerElement({name:"bulletsIndicator",className:"photo-swipe-bullets-indicator",appendTo:"wrapper",onInit:i=>{const l=[];let a=-1;for(let r=0;r<e.getNumItems();r++){const o=document.createElement("div");o.className="photo-swipe-bullet",o.onclick=c=>{e.goTo(l.indexOf(c.target))},l.push(o),i.appendChild(o)}e.on("change",()=>{a>=0&&l[a].classList.remove("active"),l[e.currIndex].classList.add("active"),a=e.currIndex})}}),n){const{isSupported:i,toggle:l}=Ll();i.value&&e.ui.registerElement({name:"fullscreen",order:7,isButton:!0,html:'<svg class="pswp__icn" viewB
2943ox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg"><path d="M249.5 270.833H437v-75H212a37.5 37.5 0 0 0-37.5 37.5v225h75v-187.5zm-37.5 600h225v-75H249.5v-187.5h-75v225a37.5 37.5 0 0 0 37.5 37.5zm637.5-37.5v-225h-75v187.5H587v75h225a37.5 37.5 0 0 0 37.5-37.5zM587 270.833h187.5v187.5h75v-225a37.5 37.5 0 0 0-37.5-37.5H587v75z"/></svg>',onClick:()=>{l()}})}t&&e.ui.registerElement({name:"download",order:8,isButton:!0,tagName:"a",html:{isCustomSVG:!0,inner:'<path d="M20.5 14.3 17.1 18V10h-2.2v7.9l-3.4-3.6L10 16l6 6.1 6-6.1-1.5-1.6ZM23 23H9v2h14" id="pswp__icn-download"/>',outlineID:"pswp__icn-download"},onInit:i=>{i.setAttribute("download",""),i.setAttribute("target","_blank"),i.setAttribute("rel","noopener"),e.on("change",()=>{i.setAttribute("href",e.currSlide.data.src)})}})})},x8=({selector:e,locales:t,download:n=!0,fullscreen:i=!0,scrollToClose:l=!0})=>{const a=C8(),r=ri(t),o=Et(),c=b(()=>{const{photoSwipe:E}=o.value;return E===!1?null:me(E)?E:Wt(e)?e.join(", "):e}),d=b(()=>({...a.value,...r.value,download:n,fullscreen:i,scrollToClose:l}));let u=null,p=0,h=null;fe("click",async E=>{const v=E.target;if(!c.value||!u||!v.matches(c.value))return;p!==0&&h.destroy();const B=Date.now(),k=await u,D=Array.from(document.querySelectorAll(c.value)),y=D.map(_=>({html:T8,element:_,msrc:_.src})),m=D.findIndex(_=>_===v);h=new k({preloaderDelay:0,showHideAnimationType:"zoom",...d.value,dataSource:y,index:m,...l?{closeOnVerticalDrag:!0,wheelToZoom:!1}:{}}),p=B,w8(h,{download:n,fullscreen:i}),h.init(),h.on("destroy",()=>{h=null,p=0}),D.map((_,P)=>Lu(_).then(H=>{p===B&&(y.splice(P,1,H),h?.refreshSlideContent(P))}))},{passive:!0}),fe("wheel",()=>{d.value.scrollToClose&&h?.close()}),ye(()=>{("requestIdleCallback"in window?window.requestIdleCallback:setTimeout)(()=>{u=f(async()=>{const{default:E}=await import("./photoswipe.esm-CKV1Bsxh.js");return{default:E}},[]).then(({default:E})=>E)})}),Sn(()=>{h?.destroy()})};var F8={"/":{closeTitle:"关闭",downloadTitle:"下载图片",fullscreenTitle:"切换全屏",zoomTitle:"缩放",arrowPrevTitle:"上一个 (左箭头)",arrowNextTitle:"下一个 (右箭头)"},"/en/":{closeTitle:"Close",downloadTitle:"Download Image",fullscreenTitle:"Switch to fullscreen",zoomTitle:"Zoom in/out",arrowPrevTitle:"Prev (Arrow Left)",arrowNextTitle:"Next (Arrow Right)"}};const S8="[vp-content] :not(a) > img:not([no-view])",P8=F8,R8=!0,L8=!0,O8=!0;var I8=St({enhance:({app:e})=>{D8(e)},setup:()=>{x8({selector:S8,locales:P8,download:R8,fullscreen:L8,scrollToClose:O8})}});const M8=Object.freeze(Object.defineProperty({__proto__:null,default:I8},Symbol.toStringTag,{value:"Module"})),Ou=({type:e="info",text:t="",vertical:n,color:i,bgColor:l},{slots:a})=>s("span",{class:["vp-badge",e,{diy:!!(i||l)}],style:{backgroundColor:l??!1,color:i??!1,verticalAlign:n??!1}},a.default?.()??t);Ou.displayName="Badge";const V8={enhance:({app:e})=>{ht("Badge")||e.component("Badge",Ou)},setup:()=>{},rootComponents:[]},N8=Object.freeze(Object.defineProperty({__proto__:null,default:V8},Symbol.toStringTag,{value:"Module"})),ro=async(e,t)=>{const{path:n,query:i}=e.currentRoute.value,{scrollBehavior:l}=e.options;e.options.scrollBehavior=void 0,await e.replace({path:n,query:i,hash:t}),e.options.scrollBehavior=l},$8=({headerLinkSelector:e,headerAnchorSelector:t,delay:n,offset:i=5})=>{const l=Yt();fe("scroll",bu(()=>{const r=Math.max(window.scrollY,document.documentElement.scrollTop,document.body.scrollTop);if(Math.abs(r)<i){ro(l,"");return}const c=window.innerHeight+r,d=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight),u=Math.abs(d-c)<i,p=Array.from(document.querySelectorAll(e)),E=Array.from(document.querySelectorAll(t)).filter(v=>p.some(B=>B.hash===v.hash));for(let v=0;v<E.length;v++){const B=E[v],k=E[v+1],D=r>=(B.parentElement?.offsetTop??0)-i,y=!k||r<(k.parentElement?.offsetTop??0)-i;if(!(D&&y))continue;const _=decodeURIComponent(l.currentRoute.value.hash),P=decodeURIComponent(B.hash);if(_===P)return;if(u){for(let H=v+1;H<E.length;H++)if(_===decodeURIComponent(E[H].hash))return}ro(l,P);return}},n))},j8=".vp-sidebar-link, .vp-toc-link",H8=".header-anchor",z8=200,U8=5,W8=St({setup(){$8({headerLinkSelector:j8,headerAnchorSelector:H8,delay:z8,offset:U8})}}),G8=Object.freeze(Object.defineProperty({__proto__:null,default:W8},Symbol.toStringTag,{value:"Module"}));let Iu=e=>me(e.title)?{title:e.title}:null;const Mu=Symbol(""),q8=e=>{Iu=e},K8=()=>ve(Mu),Q8=e=>{e.provide(Mu,Iu)};var Y8={"/":{title:"目录",empty:"暂无目录"},"/en/":{title:"Catalog",empty:"No catalog"}},J8=I({name:"Catalog",props:{base:String,level:{type:Number,default:3},index:Boolean,hideHeading:Boolean},setup(e){const{page:t,routes:n,site:i}=gn(),l=K8(),a=ri(Y8),r=ae(Rn(n.value).map(([c,{meta:d}])=>{const u=l(d);if(!u)return null;const p=c.split("/").length;return{level:Wf(c,"/")?p-2:p-1,base:c.replace(/\/[^/]+\/?$/,"/"),path:c,...u}}).filter(c=>ai(c)&&me(c.title))),o=b(()=>{const c=e.base?HE(Uc(e.base)):t.value.path.replace(/\/[^/]+$/,"/"),d=c.split("/").length-2,u=[];return r.value.filter(({level:p,path:h})=>{if(!vl(h,c)||h===c)return!1;if(c==="/"){const E=Gt(i.value.locales).filter(v=>v!=="/");if(h==="/404.html"||E.some(v=>vl(h,v)))return!1}return p-d<=e.level}).sort(({title:p,level:h,order:E},{title:v,level:B,order:k})=>h-B||(sl(E)?sl(k)?E>0?k>
29430?E-k:-1:k<0?E-k:1:E:sl(k)?k:p.localeCompare(v))).forEach(p=>{const{base:h,level:E}=p;switch(E-d){case 1:{u.push(p);break}case 2:{const v=u.find(B=>B.path===h);v&&(v.children??=[]).push(p);break}default:{const v=u.find(B=>B.path===h.replace(/\/[^/]+\/$/,"/"));if(v){const B=v.children?.find(k=>k.path===h);B&&(B.children??=[]).push(p)}}}}),u});return()=>{const c=o.value.some(d=>d.children);return s("div",{class:["vp-catalog",{index:e.index}]},[e.hideHeading?null:s("h2",{class:"vp-catalog-main-title"},a.value.title),o.value.length?s(e.index?"ol":"ul",{class:["vp-catalog-list",{deep:c}]},o.value.map(({children:d=[],title:u,path:p,content:h})=>{const E=s(Ve,{class:"vp-catalog-title",to:p},()=>h?s(h):u);return s("li",{class:"vp-catalog-item"},c?[s("h3",{id:u,class:["vp-catalog-child-title",{"has-children":d.length}]},[s("a",{href:`#${u}`,class:"vp-catalog-header-anchor","aria-hidden":!0}),E]),d.length?s(e.index?"ol":"ul",{class:"vp-child-catalogs"},d.map(({children:v=[],content:B,path:k,title:D})=>s("li",{class:"vp-child-catalog"},[s("div",{class:["vp-catalog-sub-title",{"has-children":v.length}]},[s("a",{href:`#${D}`,class:"vp-catalog-header-anchor"}),s(Ve,{class:"vp-catalog-title",to:k},()=>B?s(B):D)]),v.length?s(e.index?"ol":"div",{class:e.index?"vp-sub-catalogs":"vp-sub-catalogs-wrapper"},v.map(({content:y,path:m,title:_})=>e.index?s("li",{class:"vp-sub-catalog"},s(Ve,{to:m},()=>y?s(y):_)):s(Ve,{class:"vp-sub-catalog-link",to:m},()=>y?s(y):_))):null]))):null]:s("div",{class:"vp-catalog-child-title"},E))})):s("p",{class:"vp-empty-catalog"},a.value.empty)])}}}),X8=St({enhance:({app:e})=>{Q8(e),ht("Catalog",e)||e.component("Catalog",J8)}});const Z8=Object.freeze(Object.defineProperty({__proto__:null,default:X8},Symbol.toStringTag,{value:"Module"}));/**
2944 * NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress
2945 * @license MIT
2946 */const so=(e,t)=>{e.classList.add(t)},oo=(e,t)=>{e.classList.remove(t)},eg=e=>{e?.parentNode?.removeChild(e)},pa=(e,t,n)=>e<t?t:e>n?n:e,co=e=>(-1+e)*100,tg=(()=>{const e=[],t=()=>{const n=e.shift();n&&n(t)};return n=>{e.push(n),e.length===1&&t()}})(),ng=e=>e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(t,n)=>n.toUpperCase()),il=(()=>{const e=["Webkit","O","Moz","ms"],t={},n=a=>{const{style:r}=document.body;if(a in r)return a;const o=a.charAt(0).toUpperCase()+a.slice(1);let c=e.length;for(;c--;){const d=`${e[c]}${o}`;if(d in r)return d}return a},i=a=>{const r=ng(a);return t[r]??=n(r)},l=(a,r,o)=>{a.style[i(r)]=o};return(a,r)=>{for(const o in r){const c=r[o];Object.hasOwn(r,o)&&vu(c)&&l(a,o,c)}}})(),$t={minimum:.08,easing:"ease",speed:200,trickleRate:.02,trickleSpeed:800,barSelector:'[role="bar"]',parent:"body",template:'<div class="bar" role="bar"></div>'},Fe={percent:null,isRendered:()=>!!document.getElementById("nprogress"),set:e=>{const{speed:t,easing:n}=$t,i=Fe.isStarted(),l=pa(e,$t.minimum,1);Fe.percent=l===1?null:l;const a=Fe.render(!i),r=a.querySelector($t.barSelector);return a.offsetWidth,tg(o=>{il(r,{transform:`translate3d(${co(l)}%,0,0)`,transition:`all ${t}ms ${n}`}),l===1?(il(a,{transition:"none",opacity:"1"}),a.offsetWidth,setTimeout(()=>{il(a,{transition:`all ${t}ms linear`,opacity:"0"}),setTimeout(()=>{Fe.remove(),o()},t)},t)):setTimeout(()=>{o()},t)}),Fe},isStarted:()=>typeof Fe.percent=="number",start:()=>{Fe.percent||Fe.set(0);const e=()=>{setTimeout(()=>{Fe.percent&&(Fe.trickle(),e())},$t.trickleSpeed)};return e(),Fe},done:e=>!e&&!Fe.percent?Fe:Fe.increase(.3+.5*Math.random()).set(1),increase:e=>{let{percent:t}=Fe;return t?(t=pa(t+(typeof e=="number"?e:(1-t)*pa(Math.random()*t,.1,.95)),0,.994),Fe.set(t)):Fe.start()},trickle:()=>Fe.increase(Math.random()*$t.trickleRate),render:e=>{if(Fe.isRendered())return document.getElementById("nprogress");so(document.documentElement,"nprogress-busy");const t=document.createElement("div");t.id="nprogress",t.innerHTML=$t.template;const n=t.querySelector($t.barSelector),i=document.querySelector($t.parent),l=e?"-100":co(Fe.percent??0);return il(n,{transition:"all 0 linear",transform:`translate3d(${l}%,0,0)`}),i&&(i!==document.body&&so(i,"nprogress-custom-parent"),i.appendChild(t)),t},remove:()=>{oo(document.documentElement,"nprogress-busy"),oo(document.querySelector($t.parent),"nprogress-custom-parent"),eg(document.getElementById("nprogress"))}},ig=()=>{ye(()=>{const e=Yt(),t=new Set;t.add(e.currentRoute.value.path),e.beforeEach(n=>{t.has(n.path)||Fe.start()}),e.afterEach(n=>{t.add(n.path),Fe.done()})})},lg=St({setup(){ig()}}),ag=Object.freeze(Object.defineProperty({__proto__:null,default:lg},Symbol.toStringTag,{value:"Module"}));var rg={provider:"Giscus",lightTheme:"https://unpkg.com/[email protected]/templates/giscus/light.css",darkTheme:"https://unpkg.com/[email protected]/templates/giscus/dark.css",repo:"chiichen/chiichen.github.io",repoId:"R_kgDOKevcoA",category:"Announcements",categoryId:"DIC_kwDOKevcoM4CaDrF",mapping:"title"};const sg=rg,og=se(sg),Vu=Symbol(""),Nu=()=>ve(Vu),cg=Nu,ug=e=>{e.provide(Vu,Kt(og))},uo=["ar","be","bg","ca","cs","da","de","en","eo","es","eu","fa","fr","gr","hbs","he","hu","id","it","ja","kh","ko","nl","pl","pt","ro","ru","th","tr","uk","uz","vi","zh-CN","zh-HK","zh-TW"];var pg=I({name:"GiscusComment",props:{identifier:{type:String,required:!0},darkmode:Boolean},setup(e){const t=cg(),n=Sl(),i=b(()=>!!(t.value.repo&&t.value.repoId&&t.value.category&&t.value.categoryId)),l=se(!1),a=b(()=>{if(uo.includes(n.value))return n.value;const o=n.value.split("-")[0];return uo.includes(o)?o:"en"}),r=b(()=>({repo:t.value.repo,repoId:t.value.repoId,category:t.value.category,categoryId:t.value.categoryId,lang:a.value,theme:e.darkmode?t.value.darkTheme||"dark":t.value.lightTheme||"light",mapping:t.value.mapping||"pathname",term:e.identifier,inputPosition:t.value.inputPosition||"top",reactionsEnabled:t.value.reactionsEnabled===!1?"0":"1",strict:t.value.strict===!1?"0":"1",loading:t.value.lazyLoading===!1?"eager":"lazy",emitMetadata:"0"}));return ye(async()=>{await f(()=>import("./giscus-BACEvYzX.js"),[]),l.value=!0}),()=>i.value?s("div",{id:"comment",class:["giscus-wrapper",{"input-top":t.value.inputPosition!=="bottom"}]},l.value?s("giscus-widget",r.value):s(Br)):null}}),dg=I({name:"CommentService",props:{identifier:String,darkmode:Boolean},setup(e){const{frontmatter:t,page:n}=gn(),i=Nu(),l=b(()=>t.value.comment??i.value.comment??!0);return()=>s(pg,{class:"vp-comment","vp-comment":"",identifier:e.identifier??t.value.commentID??n.value.path,darkmode:e.darkmode,style:{display:l.value?"block":"none"}})}}),hg=St({enhance:({app:e})=>{ug(e),e.component("CommentService",dg)}});const Eg=Object.freeze(Object.defineProperty({__proto__:null,default:hg},Symbol.toStringTag,{value:"Module"})),$u="VUEPRESS_REDIRECT_STATUS",po=k1($u,{}),ho=T1($u,{}),fg=e=>{const t=C1(),n=Fl(),i=Rn(e.config);return b(()=>{if(i.some(([l])=>n.value===l)){for(const l of t.value)for(const[a,r]of i)if(r.includes(l))return a===n.value?null:{lang:l,localePath:a}}return null})};var gg=I({name:"RedirectModal",props:{config:{type:Object,required:!0},locales:{type:Object,required:!0}},setup(e){const t=Yt(),{routeLocale:n,routePath:i}=gn(),l=fg(e.config),a=se(),r=Tr(a),o=se(!1),c=b(()=>{if(!l.value)return null;const{lang:u,localePath:p}=l.value,h=[e.locales[p],e.locales[n.value]];return{hint:h.map(({hint:E})=>E.replace("$1",u)),switch:h.map(({switch:E})=>E.replace("$1",u)).join(" / "),cancel:h.map(({cancel:E})=>E).join(" / "),remember:h.map(({remember:E})=>E).join(" / ")}}),d=()=>{ho.value[n.value]=!0,o.value&&(po.value[n.value]=!0),r.value=!1};return we(i,()=>{r.value=!1}),ye(async()=>
2946{a.value=document.body,await fn(),l.value&&!ho.value[n.value]&&!po.value[n.value]&&(r.value=!0)}),rr(()=>{r.value=!1}),()=>s(Hc,{name:"fade-in-scale-up"},()=>r.value?s("div",{key:"mask",class:"redirect-modal-mask"},s("div",{key:"popup",class:"redirect-modal-wrapper"},[s("div",{class:"redirect-modal-content"},c.value?.hint.map(u=>s("p",u))),s("div",{class:"redirect-modal-hint"},[s("input",{id:"remember-redirect",type:"checkbox",value:o.value,onChange:()=>{o.value=!o.value}}),s("label",{for:"remember-redirect"},c.value?.remember)]),s("button",{type:"button",class:"redirect-modal-action primary",onClick:()=>{d(),t.replace(i.value.replace(n.value,l.value.localePath))}},c.value?.switch),s("button",{type:"button",class:"redirect-modal-action",onClick:()=>{d()}},c.value?.cancel)])):null)}}),mg={config:{"/":["zh-CN"],"/en/":["en-US"]},autoLocale:!1,defaultLocale:"/en/",localeFallback:!0,defaultBehavior:"defaultLocale"},vg={"/":{name:"简体中文",hint:"你的首选语言是 $1,是否切换到该语言?",switch:"切换到 $1",cancel:"取消",remember:"记住我的选择"},"/en/":{name:"English",hint:"Your primary language is $1, do you want to switch to it?",switch:"Switch to $1",cancel:"Cancel",remember:"Remember my choice"}};const ju=mg;var Ag=St({setup(){},rootComponents:[()=>s(gg,{config:ju,locales:vg})]});const Bg=Object.freeze(Object.defineProperty({__proto__:null,config:ju,default:Ag},Symbol.toStringTag,{value:"Module"}));var Eo={"/":{word:"约 $word 字",less1Minute:"小于 1 分钟",time:"大约 $time 分钟"},"/en/":{word:"About $word words",less1Minute:"Less than 1 minute",time:"About $time min"}};const Hu=()=>{const e=Pl();return b(()=>e.value.readingTime??null)},zu=(e,t)=>{const{minutes:n,words:i}=e,{less1Minute:l,word:a,time:r}=t;return{time:n<1?l:r.replace("$time",Math.round(n).toString()),words:a.replace("$word",i.toString())}},fo={words:"",time:""},La=typeof Eo>"u"?null:Eo,Uu=()=>La?ri(La):b(()=>null),yg=()=>{if(La===null)return b(()=>fo);const e=Hu(),t=Uu();return b(()=>e.value&&t.value?zu(e.value,t.value):fo)},Oa=()=>null,Ae=({name:e="",color:t="currentColor",ariaLabel:n},{attrs:i,slots:l})=>s("svg",{xmlns:"http://www.w3.org/2000/svg",class:["icon",`${e}-icon`],viewBox:"0 0 1024 1024",fill:t,"aria-label":n??`${e} icon`,...i},l.default());Ae.displayName="IconBase";const _g=e=>li(e)?e:`https://github.com/${e}`,wr=(e="")=>!li(e)||e.includes("github.com")?"GitHub":e.includes("bitbucket.org")?"Bitbucket":e.includes("gitlab.com")?"GitLab":e.includes("gitee.com")?"Gitee":null,Wu=()=>s(Ae,{name:"github"},()=>s("path",{d:"M511.957 21.333C241.024 21.333 21.333 240.981 21.333 512c0 216.832 140.544 400.725 335.574 465.664 24.49 4.395 32.256-10.07 32.256-23.083 0-11.69.256-44.245 0-85.205-136.448 29.61-164.736-64.64-164.736-64.64-22.315-56.704-54.4-71.765-54.4-71.765-44.587-30.464 3.285-29.824 3.285-29.824 49.195 3.413 75.179 50.517 75.179 50.517 43.776 75.008 114.816 53.333 142.762 40.79 4.523-31.66 17.152-53.377 31.19-65.537-108.971-12.458-223.488-54.485-223.488-242.602 0-53.547 19.114-97.323 50.517-131.67-5.035-12.33-21.93-62.293 4.779-129.834 0 0 41.258-13.184 134.912 50.346a469.803 469.803 0 0 1 122.88-16.554c41.642.213 83.626 5.632 122.88 16.554 93.653-63.488 134.784-50.346 134.784-50.346 26.752 67.541 9.898 117.504 4.864 129.834 31.402 34.347 50.474 78.123 50.474 131.67 0 188.586-114.73 230.016-224.042 242.09 17.578 15.232 33.578 44.672 33.578 90.454v135.85c0 13.142 7.936 27.606 32.854 22.87C862.25 912.597 1002.667 728.747 1002.667 512c0-271.019-219.648-490.667-490.71-490.667z"}));Wu.displayName="GitHubIcon";const Gu=()=>s(Ae,{name:"gitee"},()=>s("path",{d:"M512 992C246.92 992 32 777.08 32 512S246.92 32 512 32s480 214.92 480 480-214.92 480-480 480zm242.97-533.34H482.39a23.7 23.7 0 0 0-23.7 23.7l-.03 59.28c0 13.08 10.59 23.7 23.7 23.7h165.96a23.7 23.7 0 0 1 23.7 23.7v11.85a71.1 71.1 0 0 1-71.1 71.1H375.71a23.7 23.7 0 0 1-23.7-23.7V423.11a71.1 71.1 0 0 1 71.1-71.1h331.8a23.7 23.7 0 0 0 23.7-23.7l.06-59.25a23.73 23.73 0 0 0-23.7-23.73H423.11a177.78 177.78 0 0 0-177.78 177.75v331.83c0 13.08 10.62 23.7 23.7 23.7h349.62a159.99 159.99 0 0 0 159.99-159.99V482.33a23.7 23.7 0 0 0-23.7-23.7z"}));Gu.displayName="GiteeIcon";const qu=()=>s(Ae,{name:"bitbucket"},()=>s("path",{d:"M575.256 490.862c6.29 47.981-52.005 85.723-92.563 61.147-45.714-20.004-45.714-92.562-1.133-113.152 38.29-23.442 93.696 7.424 93.696 52.005zm63.451-11.996c-10.276-81.152-102.29-134.839-177.152-101.156-47.433 21.138-79.433 71.424-77.129 124.562 2.853 69.705 69.157 126.866 138.862 120.576S647.3 548.571 638.708 478.83zm136.558-309.723c-25.161-33.134-67.986-38.839-105.728-45.13-106.862-17.151-216.576-17.7-323.438 1.134-35.438 5.706-75.447 11.996-97.719 43.996 36.572 34.3
294604 88.576 39.424 135.424 45.129 84.553 10.862 171.447 11.447 256 .585 47.433-5.705 99.987-10.276 135.424-45.714zm32.585 591.433c-16.018 55.99-6.839 131.438-66.304 163.986-102.29 56.576-226.304 62.867-338.87 42.862-59.43-10.862-129.135-29.696-161.72-85.723-14.3-54.858-23.442-110.848-32.585-166.84l3.438-9.142 10.276-5.157c170.277 112.567 408.576 112.567 579.438 0 26.844 8.01 6.84 40.558 6.29 60.014zm103.424-549.157c-19.42 125.148-41.728 249.71-63.415 374.272-6.29 36.572-41.728 57.162-71.424 72.558-106.862 53.724-231.424 62.866-348.562 50.286-79.433-8.558-160.585-29.696-225.134-79.433-30.28-23.443-30.28-63.415-35.986-97.134-20.005-117.138-42.862-234.277-57.161-352.585 6.839-51.42 64.585-73.728 107.447-89.71 57.16-21.138 118.272-30.866 178.87-36.571 129.134-12.58 261.157-8.01 386.304 28.562 44.581 13.13 92.563 31.415 122.844 69.705 13.714 17.7 9.143 40.01 6.29 60.014z"}));qu.displayName="BitbucketIcon";const Ku=()=>s(Ae,{name:"source"},()=>s("path",{d:"M601.92 475.2c0 76.428-8.91 83.754-28.512 99.594-14.652 11.88-43.956 14.058-78.012 16.434-18.81 1.386-40.392 2.97-62.172 6.534-18.612 2.97-36.432 9.306-53.064 17.424V299.772c37.818-21.978 63.36-62.766 63.36-109.692 0-69.894-56.826-126.72-126.72-126.72S190.08 120.186 190.08 190.08c0 46.926 25.542 87.714 63.36 109.692v414.216c-37.818 21.978-63.36 62.766-63.36 109.692 0 69.894 56.826 126.72 126.72 126.72s126.72-56.826 126.72-126.72c0-31.086-11.286-59.598-29.7-81.576 13.266-9.504 27.522-17.226 39.996-19.206 16.038-2.574 32.868-3.762 50.688-5.148 48.312-3.366 103.158-7.326 148.896-44.55 61.182-49.698 74.25-103.158 75.24-187.902V475.2h-126.72zM316.8 126.72c34.848 0 63.36 28.512 63.36 63.36s-28.512 63.36-63.36 63.36-63.36-28.512-63.36-63.36 28.512-63.36 63.36-63.36zm0 760.32c-34.848 0-63.36-28.512-63.36-63.36s28.512-63.36 63.36-63.36 63.36 28.512 63.36 63.36-28.512 63.36-63.36 63.36zM823.68 158.4h-95.04V63.36h-126.72v95.04h-95.04v126.72h95.04v95.04h126.72v-95.04h95.04z"}));Ku.displayName="SourceIcon";const bg=({link:e,type:t=wr(e??"")})=>{if(!t)return null;const n=t.toLowerCase();return s(n==="bitbucket"?qu:n==="github"?Wu:n==="gitlab"?"GitLab":n==="gitee"?Gu:Ku)},kg=(e,t=0)=>{let n=3735928559^t,i=1103547991^t;for(let l=0,a;l<e.length;l++)a=e.charCodeAt(l),n=Math.imul(n^a,2654435761),i=Math.imul(i^a,1597334677);return n=Math.imul(n^n>>>16,2246822507),n^=Math.imul(i^i>>>13,3266489909),i=Math.imul(i^i>>>16,2246822507),i^=Math.imul(n^n>>>13,3266489909),4294967296*(2097151&i)+(n>>>0)},$i=(e,t)=>kg(e)%t,Qu=/#.*$/u,Cg=e=>{const t=Qu.exec(e);return t?t[0]:""},go=e=>decodeURI(e).replace(Qu,"").replace(/\/index\.html$/iu,"/").replace(/\/(README|index)\.md$/iu,"/").replace(/\.(?:html|md)$/iu,""),Yu=(e,t)=>{if(!vu(t))return!1;const n=go(e.path),i=go(t),l=Cg(t);return l?l===e.hash&&(!i||n===i):n===i},Dg="719px",Tg="1440px",wg="9",ci={mobileBreakPoint:Dg,pcBreakPoint:Tg,colorNumber:wg},On=()=>Su(),Pt=()=>o8(),Pe=()=>({...gn(),theme:On(),themeLocale:Pt()}),tt=()=>{const e=On();return b(()=>!!e.value.pure)},Ju=()=>{const e=Pt();return b(()=>e.value.author)},mo=e=>ai(e)&&me(e.name),xi=(e,t=!1)=>e?Wt(e)?e.map(n=>me(n)?{name:n}:mo(n)?n:null).filter(n=>n!==null):me(e)?[{name:e}]:mo(e)?[e]:(console.error(`Expect "author" to be \`AuthorInfo[] | AuthorInfo | string[] | string ${t?"":"| false"} | undefined\`, but got`,e),[]):[],Xu=(e,t)=>{if(e){if(Wt(e)&&e.every(me))return e;if(me(e))return[e];console.error(`Expect ${t} to be \`string[] | string | undefined\`, but got`,e)}return[]},Zu=e=>Xu(e,"category"),ep=e=>Xu(e,"tag"),tp=()=>{const e=Et(),t=Ju();return b(()=>{const{author:n}=e.value;return n?xi(n):n===!1?[]:xi(t.value,!1)})},xg=()=>{const e=Et(),t=ve(Symbol.for("categoryMap"),null);return b(()=>Zu(e.value.category??e.value.categories).map(n=>({name:n,path:t?.value.map[n]?.path??""})))},Fg=()=>{const e=Et(),t=ve(Symbol.for("tagMap"),null);return b(()=>ep(e.value.tag??e.value.tags).map(n=>({name:n,path:t?.value.map[n]?.path??""})))},Sg=()=>{const{frontmatter:e,page:t}=Pe();return b(()=>{const n=br(e.value.date);if(n)return n;const{createdTime:i}=t.value.git??{};return i?new Date(i):null})},Pg=()=>{const{frontmatter:e,themeLocale:t}=Pe(),n=tp(),i=xg(),l=Fg(),a=Sg(),r=Hu(),o=yg(),c=b(()=>({author:n.value,category:i.value,date:a.value,tag:l.value,isOriginal:e.value.isOriginal??!1,readingTime:r.value,readingTimeLocale:o.value,pageview:e.value.pageview??!0})),d=b(()=>e.value.pageInfo??t.value.pageInfo??null);return{info:c,items:d}},Bt=()=>{const e=Pt();return b(()=>e.value.metaLocales)},Rg="http://.",Xt=()=>{const e=Yt(),t=xt();return n=>{if(!n)return;if(Ii(n))return window.open(n);if(Rl(n))return t.fullPath===n?void 0:void e.push(n);const i=t.path.slice(0,t.path.lastIndexOf("/"));return void e.push(new URL(`${i}/${encodeURI(n)}`,Rg).pathname)}},np=()=>s(Ae,{name:"author"},()=>s("path",{d:"M649.6 633.6c86.4-48 147.2-144 147.2-249.6 0-160-128-288-288-288s-288 128-288 288c0 108.8 57.6 201.6 147.2 249.6-121.6 48-214.4 153.6-240 288-3.2 9.6 0 19.2 6.4 25.6 3.2 9.6 12.8 12.8 22.4 12.8h704c9.6 0 19.2-3.2 25.6-12.8 6.4-6.4 9.6-16 6.4-25.6-25.6-134.4-121.6-240-243.2-288z"}));np.displayName="AuthorIcon";const ip=()=>s(Ae,{name:"calendar"},()=>s("path",{d:"M716.4 110.137c0-18.753-14.72-33.473-33.472-33.473-18.753 0-33.473 14.72-33.473 33.473v33.473h66.993v-33.473zm-334.87 0c0-18.7
294653-14.72-33.473-33.473-33.473s-33.52 14.72-33.52 33.473v33.473h66.993v-33.473zm468.81 33.52H716.4v100.465c0 18.753-14.72 33.473-33.472 33.473a33.145 33.145 0 01-33.473-33.473V143.657H381.53v100.465c0 18.753-14.72 33.473-33.473 33.473a33.145 33.145 0 01-33.473-33.473V143.657H180.6A134.314 134.314 0 0046.66 277.595v535.756A134.314 134.314 0 00180.6 947.289h669.74a134.36 134.36 0 00133.94-133.938V277.595a134.314 134.314 0 00-133.94-133.938zm33.473 267.877H147.126a33.145 33.145 0 01-33.473-33.473c0-18.752 14.72-33.473 33.473-33.473h736.687c18.752 0 33.472 14.72 33.472 33.473a33.145 33.145 0 01-33.472 33.473z"}));ip.displayName="CalendarIcon";const lp=()=>s(Ae,{name:"category"},()=>s("path",{d:"M148.41 106.992h282.176c22.263 0 40.31 18.048 40.31 40.31V429.48c0 22.263-18.047 40.31-40.31 40.31H148.41c-22.263 0-40.311-18.047-40.311-40.31V147.302c0-22.263 18.048-40.31 40.311-40.31zM147.556 553.478H429.73c22.263 0 40.311 18.048 40.311 40.31v282.176c0 22.263-18.048 40.312-40.31 40.312H147.555c-22.263 0-40.311-18.049-40.311-40.312V593.79c0-22.263 18.048-40.311 40.31-40.311zM593.927 106.992h282.176c22.263 0 40.31 18.048 40.31 40.31V429.48c0 22.263-18.047 40.31-40.31 40.31H593.927c-22.263 0-40.311-18.047-40.311-40.31V147.302c0-22.263 18.048-40.31 40.31-40.31zM730.22 920.502H623.926c-40.925 0-74.22-33.388-74.22-74.425V623.992c0-41.038 33.387-74.424 74.425-74.424h222.085c41.038 0 74.424 33.226 74.424 74.067v114.233c0 10.244-8.304 18.548-18.547 18.548s-18.548-8.304-18.548-18.548V623.635c0-20.388-16.746-36.974-37.33-36.974H624.13c-20.585 0-37.331 16.747-37.331 37.33v222.086c0 20.585 16.654 37.331 37.126 37.331H730.22c10.243 0 18.547 8.304 18.547 18.547 0 10.244-8.304 18.547-18.547 18.547z"}));lp.displayName="CategoryIcon";const ap=()=>s(Ae,{name:"print"},()=>s("path",{d:"M819.2 364.8h-44.8V128c0-17.067-14.933-32-32-32H281.6c-17.067 0-32 14.933-32 32v236.8h-44.8C145.067 364.8 96 413.867 96 473.6v192c0 59.733 49.067 108.8 108.8 108.8h44.8V896c0 17.067 14.933 32 32 32h460.8c17.067 0 32-14.933 32-32V774.4h44.8c59.733 0 108.8-49.067 108.8-108.8v-192c0-59.733-49.067-108.8-108.8-108.8zM313.6 160h396.8v204.8H313.6V160zm396.8 704H313.6V620.8h396.8V864zM864 665.6c0 25.6-19.2 44.8-44.8 44.8h-44.8V588.8c0-17.067-14.933-32-32-32H281.6c-17.067 0-32 14.933-32 32v121.6h-44.8c-25.6 0-44.8-19.2-44.8-44.8v-192c0-25.6 19.2-44.8 44.8-44.8h614.4c25.6 0 44.8 19.2 44.8 44.8v192z"}));ap.displayName="PrintIcon";const rp=()=>s(Ae,{name:"tag"},()=>s("path",{d:"M939.902 458.563L910.17 144.567c-1.507-16.272-14.465-29.13-30.737-30.737L565.438 84.098h-.402c-3.215 0-5.726 1.005-7.634 2.913l-470.39 470.39a10.004 10.004 0 000 14.164l365.423 365.424c1.909 1.908 4.42 2.913 7.132 2.913s5.223-1.005 7.132-2.913l470.39-470.39c2.01-2.11 3.014-5.023 2.813-8.036zm-240.067-72.121c-35.458 0-64.286-28.828-64.286-64.286s28.828-64.285 64.286-64.285 64.286 28.828 64.286 64.285-28.829 64.286-64.286 64.286z"}));rp.displayName="TagIcon";const sp=()=>s(Ae,{name:"timer"},()=>s("path",{d:"M799.387 122.15c4.402-2.978 7.38-7.897 7.38-13.463v-1.165c0-8.933-7.38-16.312-16.312-16.312H256.33c-8.933 0-16.311 7.38-16.311 16.312v1.165c0 5.825 2.977 10.874 7.637 13.592 4.143 194.44 97.22 354.963 220.201 392.763-122.204 37.542-214.893 196.511-220.2 389.397-4.661 5.049-7.638 11.651-7.638 19.03v5.825h566.49v-5.825c0-7.379-2.849-13.981-7.509-18.9-5.049-193.016-97.867-351.985-220.2-389.527 123.24-37.67 216.446-198.453 220.588-392.892zM531.16 450.445v352.632c117.674 1.553 211.787 40.778 211.787 88.676H304.097c0-48.286 95.149-87.382 213.728-88.676V450.445c-93.077-3.107-167.901-81.297-167.901-177.093 0-8.803 6.99-15.793 15.793-15.793 8.803 0 15.794 6.99 15.794 15.793 0 80.261 63.69 145.635 142.01 145.635s142.011-65.374 142.011-145.635c0-8.803 6.99-15.793 15.794-15.793s15.793 6.99 15.793 15.793c0 95.019-73.789 172.82-165.96 177.093z"}));sp.displayName="TimerIcon";const op=()=>s(Ae,{name:"word"},()=>[s("path",{d:"M518.217 432.64V73.143A73.143 73.143 0 01603.43 1.097a512 512 0 01419.474 419.474 73.143 73.143 0 01-72.046 85.212H591.36a73.143 73.143 0 01-73.143-73.143z"}),s("path",{d:"M493.714 566.857h340.297a73.143 73.143 0 0173.143 85.577A457.143 457.143 0 11371.566 117.76a73.143 73.143 0 0185.577 73.143v339.383a36.571 36.571 0 0036.571 36.571z"})]);op.displayName="WordIcon";var Lg=I({name:"AuthorInfo",inheritAttrs:!1,props:{author:{type:Array,required:!0}},setup(e){const t=Bt(),n=tt();return()=>e.author.length?s("span",{class:"page-author-info","aria-label":`${t.value.author}${n.value?"":"🖊"}`,...n.value?{}:{"data-balloon-pos":"up"}},[s(np),s("span",e.author.map(i=>i.url?s("a",{class:"page-author-item",href:i.url,target:"_blank",rel:"noopener noreferrer"},i.name):s("span",{class:"page-author-item"},i.name))),s("span",{property:"author",content:e.author.map(i=>i.name).join(", ")})]):null}}),Og=I({name:"CategoryInfo",inheritAttrs:!1,props:{category:{type:Array,required:!0}},setup(e){const t=Bt(),n=Xt(),i=tt();return()=>e.category.length?s("span",{class:"page-category-info","aria-label":`${t.value.category}${i.value?"":"🌈"}`,...i.value?{}:{"data-balloon-pos":"up"}},[s(lp),e.category.map(({name:l,path:a})=>s("span",{class:["page-category-item",{[`color${$i(l,Number(ci.colorNumber))}`]:!i.value,clickable:a}],role:a?"navigation":"",onClick:()=>{a&&n(a)}},l)),s("meta",{property:"articleSection",content:e.category.map(({name:l})=>l).join(",")})]):null}}),Ig=I({name:"DateInfo",inheritAttrs:!1,props:{date:Object},setup(e){const t=Sl(),n=Bt(),i=tt(),l=b(()=>new Intl.DateTimeFormat(t.value,{dateStyle:"short"})),a=b(()=>e.date?l.value.format(e.date):null);return()=>e.date?s("span",{class:"page-date-info","aria-label":`${n.value.date}${i.value?"":"📅"}`,...i.value?{}:{"data-balloon-pos":"up"}},[s(ip),s("span",{"data-allow-mismatch":"text"},a.value),s("meta",{property:"datePublished",content:e.date.toISOString()||""})]):null}}),Mg=I({name:"OriginalInfo",inheritAttrs:!1,props:{isOriginal:Boolean},setup(e){const t=Bt();return()=>e.isOriginal?s("span",{class:"page-original-info"},t.value.origin):null}}),Vg=I({name:"ReadingTimeInfo",inheritAttrs:!1,props:{readingTime:Object,readingTimeLocale:Object},setup(e){const t=Bt(),n=tt(),i=b(()=>{if(!e.readingTime)return null;const{minutes:l}=e.readingTime;return l<1?"PT1M":`PT${Math.round(l)}M`});return()=>e.readingTimeLocale?.time?s("span",{class:"page-reading-time-info","aria-label":`${t.value.readingTime}${n.value?"":"⌛"}`,...n.value?{}:{"data-balloon-pos":"up"}},[s(sp),s("span",e.readingTimeLocale.time),s("meta",{property:"timeRequired",content:i.value})]):null}}),Ng=I({name:"TagInfo",inheritAttrs:!1,props:{tag:Array},setup(e){const t=Bt(),n=Xt(),i=tt();return()=>e.tag?.length?s("span",{class:"page-tag-info","aria-label":`${t.value.tag}${i.value?"":"🏷"}`,...i.value?{}:{"data-balloon-pos":"up"}},[s(rp),e.tag.map(({name:l,path:a})=>s("span",{class:["page-tag-item",{[`color${$i(l,Number(ci.colorNumber))}`]:!i.value,clickable:a}],role:a?"navigation":"",onClick:()=>{a&&n(a)}},l)),s("meta",{property:"keywords",content:e.tag.map(({name:l})=>l).join(",")})]):null}}),$g=I({name:"ReadTimeInfo",inheritAttrs:!1,props:{readingTime:Object,readingTimeLocale:Object},setup(e){const t=Bt(),n=tt();return()=>e.readingTimeLocale?.words?s("span",{class:"page-word-info","aria-label":`${t.value.words}${n.value?"":"🔠"}`,...n.value?{}:{"data-balloon-pos":"up"}},[s(op),s("span",e.readingTimeLocale.words),s("meta",{property:"wordCount",content:e.readingTime?.words})]):null}}),cp=I({name:"PageInfo",components:{AuthorInfo:Lg,CategoryInfo:Og,DateInfo:Ig,OriginalInfo:Mg,PageViewInfo:Oa,ReadingTimeInfo:Vg,TagInfo:Ng,WordInfo:$g},props:{items:[Boolean,Array],info:{type:Object,required:!0}},setup(e){const t=tt();return()=>{const n=e.items??["Author","Original","Date","PageView","ReadingTime","Category","Tag"];return n?s("div",{class:"page-info"},n.map(i=>s(xe(`${i}Info`),{...e.info,isPure:t.value}))):null}}});const xr={"/posts/":[{text:"C++",prefix:"cpp/",collapsible:!0,icon:"lightbulb",children:["Application-of-decltype-auto"]},{text:"Dragon OS",prefix:"DragonOS/",collapsible:!0,children:["DragonOS招新任务"]},{text:"Linux内核",prefix:"Linux内核/",collapsible:!0,children:["NUMA Balance实现浅析","NUMA Balancing","vscode qemu开发Linux内核",{text:"Patch解读",prefix:"Patch解读/",collapsible:!0,children:["LWN针对多层内存系统重新进行NUMA平衡"]},{text:"内核分析",prefix:"内核分析/",collapsible:!0,children:["LinuxKernelMap"]},{text:"内核开发",prefix:"内核开发/",collapsible:!0,children:["Ubuntu编译安装内核",{text:"E BPF开发",prefix:"eBPF开发/",collapsible:!0,children:["eBPF开发入门","eBPF进阶"]},{text:"性能测试",prefix:"性能测试/",collapsible:!0,children:["parsec3.0介绍和安装"]}]}]},{text:"Rcc编译器",prefix:"rcc编译器/",collapsible:!0,children:["Chapter0前言","Chapter1词法分析器之Chumsky","HelloWorld"]},{text:"Rust",prefix:"Rust/",collapsible:!0,children:["Inlinable-dyn-extension-traits","Common-rust-lifetime-misconceptions","Type-erase-via-trait"]},{text:"后端技术",prefix:"backend/",collapsible:!0,icon:"lightbulb",children:["gRPC-introduction"]},{text:"微信",prefix:"微信/",collapsible:!0,children:["微信底层解析"]},{text:"杂谈",prefix:"杂谈/",collapsible:!0,children:[{text:"Debug杂谈",prefix:"Debug杂谈/",collapsible:!0,children:["could not dial endpoint 'orderer-api.127-0-0-1.nip.io","edition设置引起的rust编译器报错","SurfaceView异常释放","解决MacOS中找不到头文件的问题","记一次 GP Debug 的心路历程"]},{text:"编程杂谈",prefix:"编程杂谈/",collapsible:!0,children:["Github中配置Cargo项目的Workflow","基于Ninja的代码Intellisense实践","解决在VSCode里刷Leetcode的重定义问题","震惊!1等于0","高级语言的编译-链接及装载过程介绍"]},{text:"面经",prefix:"面经/",collapsible:!0,children:["腾讯WXG日常实习面经"]}]},{text:"课程笔记",prefix:"课程笔记/",collapsible:!0,children:[{text:"UML",prefix:"UML/",collapsible:!0,children:["UML复习简记"]},{text:"大物",prefix:"大物/",collapsible:!0,children:["电磁学公式",{text:"具体推导",prefix:"具体推导/",collapsible:!0,children:["实心带点球体静电能的推导"]}]},{text:"操作系统",prefix:"操作系统/",collapsible:!0,children:["Chapter1-Introdction","Chapter2-Processes-and-Threads","Chapter3-Memory-Management","Chapter4-File-System","Chapter5-IO","Chapter6-Deadlocks"]},{text:"数据库",prefix:"数据库/",collapsible:!0,children:["Chapter1 Introduction","Chapter2 Introduction to Relational Model","Chapter3 Introduction to SQL","Chapter6 Formal Relational Query Languages","Chapter7 Entity-Relationship Model","Chapter8 Relational Database Design","Chapter10 Storage and File Structure","Chapter11 Indexing and Hashing","Chapter12 Query Processing","Chapter13 Query Optimization","Chapter14 Transactions","Chapter15 Concurrency Control","Chapter16 Recovery System"]},{text:"电工",prefix:"电工/",collapsible:!0,children:["电工复习笔记"]},{text:"编译原理",prefix:"编译原理/",collapsible:!0,children:["Chapter0 前言","Chapter1 编译器组成","Chapter2 词法分析","Chapter3 语法分析","Chapter4 语义分析","Chapter5 代ç 
2946ç”Ÿæˆ"]},{text:"计算机网络",prefix:"计算机网络/",collapsible:!0,children:["Chapter1-Internet-And-Ethernet","Chapter2-Application-Layer","Chapter3-Transport-Layer","Chapter4-Net-Layer","Chapter5-Link-Layer","计算机网络习题答案"]},{text:"软件体系结构",prefix:"软件体系结构/",collapsible:!0,children:["复习提纲","Chapter0绪论","Chapter1什么是软件架构","Chapter2为什么软件架构重要","Chapter4理解质量属性","Chapter5可用性","Chapter6互操作性","Chapter7可修改性","Chapter8性能","Chapter9安全性","Chapter10可测试性","Chapter11易用性","Chapter12其它质量属性","Chapter13模式和策略","Chapter14质量属性建模与分析","Chapter15敏捷项目中的架构","Chapter16架构与需求","Chapter17设计架构","Chapter19架构实现与测试","Chpater21架构评估"]},{text:"软件项目管理",prefix:"软件项目管理/",collapsible:!0,children:["第1章项目管理概述","第2章项目管理与IT环境","第3章项目管理过程组","第4章项目整合管理","第5章项目范围管理","第6章项目进度管理","第7章项目成本管理","第8章项目质量管理","第9章项目资源管理","第10章项目沟通管理","第11章项目风险管理","第12章项目采购管理","第13章项目干系人管理","2019_IT项目管理_复习笔记"]}]}],"/notes/":[{text:"UML",prefix:"UML/",collapsible:!0,children:["Review-Quick-Note"]},{text:"大学物理",prefix:"College-Physics/",collapsible:!0,icon:"lightbulb",children:["Electromagnetic-Formula",{text:"推导过程",prefix:"Formula-Derivation/",collapsible:!0,icon:"lightbulb",children:["Electrostatic-energy-of-a-solid-charged-sphere"]}]},{text:"操作系统",prefix:"Operating-System/",collapsible:!0,icon:"lightbulb",children:["Chapter1-Introdction","Chapter2-Processes-and-Threads","Chapter3-Memory-Management","Chapter4-File-System","Chapter5-IO","Chapter6-Deadlocks"]},{text:"数据库",prefix:"Database/",collapsible:!0,icon:"lightbulb",children:["Chapter1-Introduction","Chapter2-Introduction-to-Relational-Model","Chapter3-Introduction-to-SQL","Chapter6-Formal-Relational-Query-Languages","Chapter7-Entity-Relationship-Model","Chapter8-Relational-Database-Design","Chapter10-Storage-and-File-Structure","Chapter11-Indexing-and-Hashing","Chapter12-Query-Processing","Chapter13-Query-Optimization","Chapter14-Transactions","Chapter15-Concurrency-Control","Chapter16-Recovery-System"]},{text:"电工学",prefix:"Electrical-Engineering/",collapsible:!0,icon:"littlebulb",children:["Review-Note"]},{text:"编译原理",prefix:"Compile-Principles/",collapsible:!0,icon:"lightbulb",children:["Chapter0-Introduce","Chapter1-Compiler-composition ","Chapter2-Lexical-Analysis","Chapter3-Gramma-Analysis","Chapter4-Semantic-Analysis","Chapter5-Code-Generation"]},{text:"计算机网络",prefix:"Computer-Network/",collapsible:!0,icon:"lightbulb",children:["Chapter1-Internet-And-Ethernet","Chapter2-Application-Layer","Chapter3-Transport-Layer","Chapter4-Net-Layer","Chapter5-Link-Layer","Computer-Network-7th-Edition-Exercises-Answers"]},{text:"软件体系结构",prefix:"软件体系结构/",collapsible:!0,children:["复习提纲","Chapter0绪论","Chapter1什么是软件架构","Chapter2为什么软件架构重要","Chapter4理解质量属性","Chapter5可用性","Chapter6互操作性","Chapter7可修改性","Chapter8性能","Chapter9安全性","Chapter10可测试性","Chapter11易用性","Chapter12其它质量属性","Chapter13模式和策略","Chapter14质量属性建模与分析","Chapter15敏捷项目中的架构","Chapter16架构与需求","Chapter17设计架构","Chapter19架构实现与测试","Chpater21架构评估"]},{text:"软件测试与维护",prefix:"Software-Testing-and-Maintenance/",collapsible:!0,icon:"lightbulb",children:["Chapter1-Basic-Concepts-of-Software-Testing","Chapter2-Software-Testing-Technology","Chapter3-Software-Testing-Process","Chapter4-Software-Testing-Management","Chapter5-Software-Maintenance"]},{text:"软件项目管理",prefix:"Software-Project-Management/",collapsible:!0,icon:"lightbulb",children:["Chapter1-Indroduction","Chapter2-Project-Management-and-IT-Environment","Chapter3-Project-Management-Process-group","Chapter4-Project-Integration-Management","Chapter5-Project-Scope-Management","Chapter6-Project-Schedule-Management","Chapter7-Project-Cost-Management","Chapter8-Project-Quality-Management","Chapter9-Project-Resource-Management","Chapter10-Project-Communication-Management","Chapter11-Project-Risk-Management","Chapter12-Project-Precurement-Management","Chapter13-Project-Stakeholder-Management","2019-Review-Notes"]}],"/en/posts/":[]},up=Symbol(""),ji=()=>{const e=ve(up);if(!e)throw new Error("useDarkMode() is called without provider.");return e},jg=e=>{const t=m1(),n=On(),i=b(()=>n.value.darkmode??"switch"),l=Ni("vuepress-theme-hope-scheme","auto"),a=b(()=>{const o=i.value;return o==="disable"?!1:o==="enable"?!0:o==="auto"?t.value:o==="toggle"?l.value==="dark":l.value==="dark"||l.value==="auto"&&t.value}),r=b(()=>{const o=i.value;return o==="switch"||o==="toggle"});e.provide(up,{canToggle:r,config:i,isDarkMode:a,status:l}),Object.defineProperties(e.config.globalProperties,{$isDarkMode:{get:()=>a.value}})},Hg=()=>{const{config:e,isDarkMode:t,status:n}=ji();or(()=>{e.value==="disable"?n.value="light":e.value==="enable"?n.value="dark":e.value==="toggle"&&n.value==="auto"&&(n.value="light")}),fe("beforeprint",()=>{t.value&&document.documentElement.setAttribute("data-theme","light")}),fe("afterprint",()=>{t.value&&document.documentElement.setAttribute("data-theme","dark")}),ye(()=>{wt(t,i=>
2946{document.documentElement.setAttribute("data-theme",i?"dark":"light")})})},Ia=e=>!Ii(e)&&!dr(e),Al=(e,t=!1,n)=>{const{meta:i,path:l,notFound:a}=At(e,n);return a?{text:l,link:l}:{text:!t&&i.shortTitle?i.shortTitle:i.title||l,link:l,icon:i.icon}},bn=(e="",t="")=>Ii(t)||Rl(t)?t:`${Uc(e)}${t}`,pp=(e,t)=>{const n=me(e)?Al(bn(t,e)):me(e.link)?{...e,link:Ia(e.link)?At(bn(t,e.link)).path:e.link}:e;if("children"in n){const i=bn(t,n.prefix),l=n.children==="structure"?xr[i]:n.children;return{...n,prefix:i,children:l.map(a=>pp(a,i))}}return{...n}},Ma=({config:e,prefix:t=""})=>e.map(n=>pp(n,t)),zg=({config:e,routePath:t})=>{const n=Gt(e).sort((i,l)=>l.length-i.length);for(const i of n)if(vl(decodeURI(t),i)){const l=e[i];return Ma({config:l==="structure"?xr[i]:l||[],prefix:i})}return console.warn(`${decodeURI(t)} is missing it's sidebar config.`),[]},Ug=({config:e,routeLocale:t,routePath:n})=>e==="structure"?Ma({config:xr[t],prefix:t}):Wt(e)?Ma({config:e}):ai(e)?zg({config:e,routePath:n}):[],dp=Symbol(""),Wg=()=>{const{frontmatter:e,routeLocale:t,routePath:n,themeLocale:i}=Pe(),l=b(()=>e.value.home?!1:e.value.sidebar??i.value.sidebar??"structure"),a=b(()=>Ug({config:l.value,routeLocale:t.value,routePath:n.value}));Ct(dp,a)},Fr=()=>{const e=ve(dp);if(!e)throw new Error("useSidebarItems() is called without provider.");return e};var Gg=I({name:"PageFooter",setup(){const{frontmatter:e,theme:t,themeLocale:n}=Pe(),i=tp(),l=b(()=>{const{copyright:d,footer:u}=e.value;return u!==!1&&!!(d||u||n.value.displayFooter)}),a=b(()=>{const{footer:d}=e.value;return me(d)?d:n.value.footer??""}),r=b(()=>i.value.map(({name:d})=>d).join(", ")),o=d=>`Copyright © ${new Date().getFullYear()} ${r.value} ${d?`${d} Licensed`:""}`,c=b(()=>{const{copyright:d,license:u=""}=e.value,{license:p}=t.value,{copyright:h}=n.value;return d??(u?o(u):h??(r.value||p?o(p):!1))});return()=>l.value?s("footer",{class:"vp-footer-wrapper","vp-footer":""},[a.value?s("div",{class:"vp-footer",innerHTML:a.value}):null,c.value?s("div",{class:"vp-copyright",innerHTML:c.value}):null]):null}});const hp=()=>s(Ae,{name:"outlook"},()=>[s("path",{d:"M224 800c0 9.6 3.2 44.8 6.4 54.4 6.4 48-48 76.8-48 76.8s80 41.6 147.2 0 134.4-134.4 38.4-195.2c-22.4-12.8-41.6-19.2-57.6-19.2C259.2 716.8 227.2 761.6 224 800zM560 675.2l-32 51.2c-51.2 51.2-83.2 32-83.2 32 25.6 67.2 0 112-12.8 128 25.6 6.4 51.2 9.6 80 9.6 54.4 0 102.4-9.6 150.4-32l0 0c3.2 0 3.2-3.2 3.2-3.2 22.4-16 12.8-35.2 6.4-44.8-9.6-12.8-12.8-25.6-12.8-41.6 0-54.4 60.8-99.2 137.6-99.2 6.4 0 12.8 0 22.4 0 12.8 0 38.4 9.6 48-25.6 0-3.2 0-3.2 3.2-6.4 0-3.2 3.2-6.4 3.2-6.4 6.4-16 6.4-16 6.4-19.2 9.6-35.2 16-73.6 16-115.2 0-105.6-41.6-198.4-108.8-268.8C704 396.8 560 675.2 560 675.2zM224 419.2c0-28.8 22.4-51.2 51.2-51.2 28.8 0 51.2 22.4 51.2 51.2 0 28.8-22.4 51.2-51.2 51.2C246.4 470.4 224 448 224 419.2zM320 284.8c0-22.4 19.2-41.6 41.6-41.6 22.4 0 41.6 19.2 41.6 41.6 0 22.4-19.2 41.6-41.6 41.6C339.2 326.4 320 307.2 320 284.8zM457.6 208c0-12.8 12.8-25.6 25.6-25.6 12.8 0 25.6 12.8 25.6 25.6 0 12.8-12.8 25.6-25.6 25.6C470.4 233.6 457.6 220.8 457.6 208zM128 505.6C128 592 153.6 672 201.6 736c28.8-60.8 112-60.8 124.8-60.8-16-51.2 16-99.2 16-99.2l316.8-422.4c-48-19.2-99.2-32-150.4-32C297.6 118.4 128 291.2 128 505.6zM764.8 86.4c-22.4 19.2-390.4 518.4-390.4 518.4-22.4 28.8-12.8 76.8 22.4 99.2l9.6 6.4c35.2 22.4 80 12.8 99.2-25.6 0 0 6.4-12.8 9.6-19.2 54.4-105.6 275.2-524.8 288-553.6 6.4-19.2-3.2-32-19.2-32C777.6 76.8 771.2 80 764.8 86.4z"})]);hp.displayName="AppearanceIcon";const Ep=()=>s(Ae,{name:"auto"},()=>s("path",{d:"M512 992C246.92 992 32 777.08 32 512S246.92 32 512 32s480 214.92 480 480-214.92 480-480 480zm0-840c-198.78 0-360 161.22-360 360 0 198.84 161.22 360 360 360s360-161.16 360-360c0-198.78-161.22-360-360-360zm0 660V212c165.72 0 300 134.34 300 300 0 165.72-134.28 300-300 300z"}));Ep.displayName="AutoColorModeIcon";const fp=()=>s(Ae,{name:"light"},()=>s("path",{d:"M952 552h-80a40 40 0 0 1 0-80h80a40 40 0 0 1 0 80zM801.88 280.08a41 41 0 0 1-57.96-57.96l57.96-58a41.04 41.04 0 0 1 58 58l-58 57.96zM512 752a240 240 0 1 1 0-480 240 240 0 0 1 0 480zm0-560a40 40 0 0 1-40-40V72a40 40 0 0 1 80 0v80a40 40 0 0 1-40 40zm-289.88 88.08-58
2946-57.96a41.04 41.04 0 0 1 58-58l57.96 58a41 41 0 0 1-57.96 57.96zM192 512a40 40 0 0 1-40 40H72a40 40 0 0 1 0-80h80a40 40 0 0 1 40 40zm30.12 231.92a41 41 0 0 1 57.96 57.96l-57.96 58a41.04 41.04 0 0 1-58-58l58-57.96zM512 832a40 40 0 0 1 40 40v80a40 40 0 0 1-80 0v-80a40 40 0 0 1 40-40zm289.88-88.08 58 57.96a41.04 41.04 0 0 1-58 58l-57.96-58a41 41 0 0 1 57.96-57.96z"}));fp.displayName="LightColorModeIcon";const gp=()=>s(Ae,{name:"dark"},()=>s("path",{d:"M524.8 938.667h-4.267a439.893 439.893 0 0 1-313.173-134.4 446.293 446.293 0 0 1-11.093-597.334A432.213 432.213 0 0 1 366.933 90.027a42.667 42.667 0 0 1 45.227 9.386 42.667 42.667 0 0 1 10.24 42.667 358.4 358.4 0 0 0 82.773 375.893 361.387 361.387 0 0 0 376.747 82.774 42.667 42.667 0 0 1 54.187 55.04 433.493 433.493 0 0 1-99.84 154.88 438.613 438.613 0 0 1-311.467 128z"}));gp.displayName="DarkColorModeIcon";var mp=I({name:"ColorModeSwitch",setup(){const{config:e,isDarkMode:t,status:n}=ji(),i=tt(),l=()=>{e.value==="switch"?n.value={light:"dark",dark:"auto",auto:"light"}[n.value]:n.value=n.value==="light"?"dark":"light"},a=async r=>{if(!(document.startViewTransition&&!window.matchMedia("(prefers-reduced-motion: reduce)").matches&&!i.value)){l();return}const o=r.clientX,c=r.clientY,d=Math.hypot(Math.max(o,innerWidth-o),Math.max(c,innerHeight-c)),u=t.value;await document.startViewTransition(async()=>{l(),await fn()}).ready,t.value!==u&&document.documentElement.animate({clipPath:t.value?[`circle(${d}px at ${o}px ${c}px)`,`circle(0px at ${o}px ${c}px)`]:[`circle(0px at ${o}px ${c}px)`,`circle(${d}px at ${o}px ${c}px)`]},{duration:400,pseudoElement:t.value?"::view-transition-old(root)":"::view-transition-new(root)"})};return()=>s("button",{type:"button",class:"vp-color-mode-switch",id:"color-mode-switch",onClick:a},[s(Ep,{style:{display:n.value==="auto"?"block":"none"}}),s(gp,{style:{display:n.value==="dark"?"block":"none"}}),s(fp,{style:{display:n.value==="light"?"block":"none"}})])}});const vp=()=>{const e=Pt();return b(()=>e.value.outlookLocales)};var qg=I({name:"ColorMode",setup(){const e=vp(),{canToggle:t}=ji();return()=>t.value?s("div",{class:"vp-color-mode"},[s("label",{class:"vp-color-mode-title",for:"color-mode-switch"},e.value.darkmode),s(mp)]):null}});const Ap=()=>s(Ae,{name:"cancel-fullscreen"},()=>s("path",{d:"M778.468 78.62H247.922c-102.514 0-186.027 83.513-186.027 186.027V795.08c0 102.514 83.513 186.027 186.027 186.027h530.432c102.514 0 186.71-83.513 186.026-186.027V264.647C964.494 162.02 880.981 78.62 778.468 78.62zM250.88 574.35h171.122c23.324 0 43.122 19.115 43.804 43.805v171.121c0 24.008-19.114 43.122-43.122 43.122-12.06 0-22.641-5.006-30.378-12.743s-12.743-19.115-12.743-30.379V722.83L224.597 877.91c-16.953 16.952-44.6 16.952-61.553 0-16.953-16.954-16.953-44.602 0-61.554L318.009 661.39h-66.446c-24.007 0-43.122-19.114-43.122-43.122 0-24.12 18.432-43.918 42.439-43.918zm521.899-98.873H601.657c-23.325 0-43.122-19.114-43.805-43.804V260.55c0-24.007 19.115-43.122 43.122-43.122 12.06 0 22.642 5.007 30.379 12.743s12.743 19.115 12.743 30.38v66.445l154.965-154.965c16.953-16.953 44.601-16.953 61.554 0 16.953 16.953 16.953 44.6 0 61.554L705.536 388.55h66.446c24.007 0 43.122 19.115 43.122 43.122.114 24.007-18.318 43.804-42.325 43.804z"}));Ap.displayName="CancelFullScreenIcon";const Bp=()=>s(Ae,{name:"enter-fullscreen"},()=>s("path",{d:"M762.773 90.24h-497.28c-96.106 0-174.4 78.293-174.4 174.4v497.28c0 96.107 78.294 174.4 174.4 174.4h497.28c96.107 0 175.04-78.293 174.4-174.4V264.64c0-96.213-78.186-174.4-174.4-174.4zm-387.2 761.173H215.04c-21.867 0-40.427-17.92-41.067-41.066V649.92c0-22.507 17.92-40.427 40.427-40.427 11.307 0 21.227 4.694 28.48 11.947 7.253 7.253 11.947 17.92 11.947 28.48v62.293l145.28-145.28c15.893-15.893 41.813-15.893 57.706 0 15.894 15.894 15.894 41.814 0 57.707l-145.28 145.28h62.294c22.506 0 40.426 17.92 40.426 40.427s-17.173 41.066-39.68 41.066zM650.24 165.76h160.427c21.866 0 40.426 17.92 41.066 41.067v160.426c0 22.507-17.92 40.427-40.426 40.427-11.307 0-21.227-4.693-28.48-11.947-7.254-7.253-11.947-17.92-11.947-28.48v-62.186L625.6 450.347c-15.893 15.893-41.813 15.893-57.707 0-15.893-15.894-15.893-41.814 0-57.707l145.28-145.28H650.88c-22.507 0-40.427-17.92-40.427-40.427s17.174-41.173 39.787-41.173z"}));Bp.displayName="EnterFullScreenIcon";var yp=I({name:"ToggleFullScreenButton",setup(){const{isSupported:e,isFullscreen:t,toggle:n}=Ll();return()=>e.value?s("button",{type:"button",id:"full-screen-switch",class:"full-screen",ariaPressed:t.value,onClick:()=>n()},t.value?s(Ap):s(Bp)):null}}),Kg=I({name:"ToggleFullScreenButton",setup(){const e=vp(),{isSupported:t}=Ll();return()=>t.value?s("div",{class:"full-screen-wrapper"},[s("label",{class:"full-screen-title",for:"full-screen-switch"},e.value.fullscreen),s(yp)]):null}}),_p=I({name:"AppearanceSettings",setup(){const e=On(),t=tt(),n=b(()=>!t.value&&e.value.fullscreen);return()=>s(vr,()=>[null,s(qg),n.value?s(Kg):null])}}),Qg=I({name:"AppearanceButton",setup(){const e=On(),{canToggle:t}=ji(),{isSupported:n}=Ll(),i=tt(),l=se(!1),a=b(()=>!i.value&&e.value.fullscreen&&n),r=b(()=>t.value||a.value);return Jt(()=>{l.value=!1}),()=>r.value?s("div",{class:"vp-nav-item hide-in-mobile"},t.value&&!a.value?s(mp):a.value&&!t.value?s(yp):s("button",{type:"button",class:["vp-appearance-button",{open:l.value}],tabindex:"-1","aria-hidden":!0},[s(hp),s("div",{class:"vp-appearance-dropdown"},s(_p))])):null}});const bp=()=>s(Ae,{name:"i18n"},()=>[s("path",{d:"M379.392 460.8 494.08 575.488l-42.496 102.4L307.2 532.48 138.24 701.44l-71.68-72.704L234.496 460.8l-45.056-45.056c-27.136-27.136-51.2-66.56-66.56-108.544h112.64c7.68 14.336 16.896 27.136 26.112 35.84l45.568 46.08 45.056-45.056C382.976 312.32 409.6 247.808 409.6 204.8H0V102.4h256V0h102.4v102.4h256v102.4H512c0 70.144-37.888 161.28-87.04 210.944L378.88 460.8zM576 870.4 512 1024H409.6l256-614.4H768l256 614.4H921.6l-64-153.6H576zM618.496 768h196.608L716.8 532.48 618.496 768z"})]);bp.displayName="I18nIcon";const Ye=({config:e,iconSizing:t="both"},{emit:n,slots:i})=>{const{icon:l}=e;return s(pf,{config:e,onFocusout:()=>{n("focusout")}},{...i,before:i.before??(l?()=>s(xe("VPIcon"),{icon:l,sizing:t}):null)})};Ye.displayName="AutoLink";var kp=I({name:"NavbarDropdown",props:{config:{type:Object,required:!0}},slots:Object,setup(e,{slots:t}){const n=ii(e,"config"),i=b(()=>n.value.ariaLabel??n.value.text),l=se(!1),a=r=>{r.detail===0&&(l.value=!l.value)};return Jt(()=>{l.value=!1}),()=>s("div",{class:["vp-dropdown-wrapper",{open:l.value}]},[s("button",{type:"button",class:"vp-dropdown-title","aria-label":i.value,onClick:a},[t.title?.()??[s(xe("VPIcon"),{icon:n.value.icon}),e.config.text],s("span",{class:"arrow"}),s("ul",{class:"vp-dropdown"},n.value.children.map((r,o)=>{const c=o===n.value.children.length-1;return s("li",{class:"vp-dropdown-item"},"children"in r?[s("h4",{class:"vp-dropdown-subtitle"},r.link?s(Ye,{config:r,onFocusout:()=>
2946{r.children.length===0&&c&&(l.value=!1)}}):r.text),s("ul",{class:"vp-dropdown-subitems"},r.children.map((d,u)=>s("li",{class:"vp-dropdown-subitem"},s(Ye,{config:d,onFocusout:()=>{u===r.children.length-1&&c&&(l.value=!1)}}))))]:s(Ye,{config:r,onFocusout:()=>{c&&(l.value=!1)}}))}))])])}});const Yg=()=>{const{routeLocale:e,site:t,siteLocale:n,theme:i,themeLocale:l}=Pe(),a=F1(),r=xt(),o=se(!1);return ye(()=>{o.value=!0}),b(()=>{const c=Gt(t.value.locales),d=Rn(i.value.extraLocales??{});if(c.length<2&&!d.length)return null;const{path:u,fullPath:p}=r,{navbarLocales:h}=l.value;return{text:"",ariaLabel:h.selectLangAriaLabel,children:[...c.map(E=>{const v=t.value.locales[E]??{},B=i.value.locales[E]??{},k=v.lang,D=B.navbarLocales.langName;let y;if(k===n.value.lang)y=p;else{const m=u.replace(e.value,E);y=a.value.some(_=>_===m)?o.value?p.replace(u,m):m:B.home??E}return{text:D,link:y}}),...d.map(([E,v])=>({text:E,link:v.replace(":route",(o.value?p:v).replace(e.value,""))}))]}})};var Jg=I({name:"LanguageDropdown",setup(){const e=Yg();return()=>e.value?s("div",{class:"vp-nav-item"},s(kp,{config:e.value},{title:()=>
2946s(bp,{"aria-label":e.value?.ariaLabel,style:{width:"1rem",height:"1rem",verticalAlign:"middle"}})})):null}}),Xg=I({name:"NavScreenMenu",props:{config:{type:Object,required:!0}},setup(e){const t=ii(e,"config"),n=xt(),i=b(()=>t.value.ariaLabel??t.value.text),l=se(!1),a=(r,o)=>o[o.length-1]===r;return Jt(()=>{l.value=!1}),we(()=>n.fullPath,()=>{l.value=!1}),()=>[s("button",{type:"button",class:["vp-nav-screen-menu-title",{active:l.value}],"aria-label":i.value,onClick:()=>{l.value=!l.value}},[s("span",{class:"text"},[s(xe("VPIcon"),{icon:t.value.icon,sizing:"both"}),e.config.text]),s("span",{class:["arrow",l.value?"down":"end"]})]),s("ul",{class:["vp-nav-screen-menu",{hide:!l.value}]},t.value.children.map(r=>s("li",{class:"vp-nav-screen-menu-item"},"children"in r?[s("h4",{class:"vp-nav-screen-menu-subtitle"},r.link?s(Ye,{config:r,onFocusout:()=>{a(r,t.value.children)&&r.children.length===0&&(l.value=!1)}}):r.text),s("ul",{class:"vp-nav-screen-menu-subitems"},r.children.map(o=>s("li",{class:"vp-nav-screen-menu-subitem"},s(Ye,{config:o,onFocusout:()=>{a(o,r.children)&&a(r,t.value.children)&&(l.value=!1)}}))))]:s(Ye,{config:r,onFocusout:()=>{a(r,t.value.children)&&(l.value=!1)}}))))]}});const Cp=(e,t="")=>me(e)?Al(bn(t,e)):"children"in e?{...e,...e.link&&Ia(e.link)?{link:At(bn(t,e.link)).path}:{},children:e.children.map(n=>Cp(n,bn(t,e.prefix)))}:{...e,link:Ia(e.link)?At(bn(t,e.link)).path:e.link},Dp=()=>{const e=Pt();return b(()=>(e.value.navbar||[]).map(t=>Cp(t)))};var Zg=I({name:"NavScreenLinks",setup(){const e=Dp();return()=>e.value.length?s("nav",{class:"nav-screen-links"},e.value.map(t=>s("div",{class:"navbar-links-item"},"children"in t?s(Xg,{config:t}):s(Ye,{config:t})))):null}});const{mobileBreakPoint:em,pcBreakPoint:tm}=ci,vo=e=>e.endsWith("px")?Number(e.slice(0,-2)):null,Ol=()=>{const e=se(!1),t=se(!1),n=()=>{e.value=window.innerWidth<=(vo(em)??719),t.value=window.innerWidth>=(vo(tm)??1440)};return fe("resize",n,!1),fe("orientationchange",n,!1),ye(()=>{n()}),{isMobile:e,isPC:t}};var nm=I({name:"NavScreen",props:{show:Boolean},slots:Object,setup(e,{slots:t}){const{isMobile:n}=Ol(),i=ae(),l=Tr(i);return Jt(()=>{l.value=!1}),we(n,a=>{!a&&e.show&&(l.value=!1)}),ye(()=>{i.value=document.body}),Sn(()=>{l.value=!1}),()=>s(ei,{name:"fade-in-down",onEnter:()=>{l.value=!0},onAfterLeave:()=>{l.value=!1}},()=>e.show?s("div",{id:"nav-screen",class:"vp-nav-screen"},s("div",{class:"vp-nav-screen-container"},[t.navScreenTop?.(),s(Zg),s("div",{class:"vp-appearance-wrapper"},s(_p)),t.navScreenBottom?.()])):null)}}),im=I({name:"NavbarBrand",setup(){const{routeLocale:e,siteLocale:t,themeLocale:n}=Pe(),i=b(()=>n.value.home??e.value),l=b(()=>t.value.title),a=b(()=>n.value.navbarTitle??l.value),r=b(()=>n.value.logo?Ce(n.value.logo):null),o=b(()=>n.value.logoDark?Ce(n.value.logoDark):null);return()=>s(Ve,{to:i.value,class:"vp-brand","aria-label":n.value.routerLocales.home},()=>[r.value?s("img",{class:["vp-nav-logo",{light:!!o.value}],src:r.value,alt:""}):null,o.value?s("img",{class:["vp-nav-logo dark"],src:o.value,alt:""}):null,a.value?s("span",{class:["vp-site-name",{"hide-in-pad":r.value&&(n.value.hideSiteNameOnMobile??!0)}]},a.value):null])}}),lm=I({name:"NavbarLinks",setup(){const e=Dp();return()=>e.value.length?s("nav",{class:"vp-nav-links"},e.value.map(t=>s("div",{class:"vp-nav-item hide-in-mobile"},"children"in t?s(kp,{config:t}):s(Ye,{config:t,iconSizing:"height"})))):null}});const am=()=>{const e=Pt(),t=b(()=>e.value.repo),n=b(()=>t.value?_g(t.value):null),i=b(()=>t.value?wr(t.value):null),l=b(()=>n.value?e.value.repoLabel??i.value??"Source":null);return b(()=>!n.value||!l.value||e.value.repoDisplay===!1?null:{type:i.value??"Source",label:l.value,link:n.value})};var rm=I({name:"RepoLink",setup(){const e=am();return()=>e.value?s("div",{class:"vp-nav-item vp-action"},s("a",{class:"vp-action-link",href:e.value.link,target:"_blank",rel:"noopener noreferrer","aria-label":e.value.label},s(bg,{type:e.value.type,style:{width:"1.25rem",height:"1.25rem",verticalAlign:"middle"}}))):null}});const Tp=({active:e=!1},{emit:t})=>s("button",{type:"button",class:["vp-toggle-navbar-button",{"is-active":e}],"aria-label":"Toggle Navbar","aria-expanded":e,"aria-controls":"nav-screen",onClick:()=>{t("toggle")}},s("span",[s("span",{class:"vp-top"}),s("span",{class:"vp-middle"}),s("span",{class:"vp-bottom"})]));Tp.displayName="ToggleNavbarButton";const Va=(e,{emit:t})=>s("button",{type:"button",class:"vp-toggle-sidebar-button",title:"Toggle Sidebar",onClick:()=>{t("toggle")}},s("span",{class:"icon"}));Va.displayName="ToggleSidebarButton",Va.emits=["toggle"];var sm=I({name:"NavBar",emits:["toggleSidebar"],slots:Object,setup(e,{emit:t,slots:n}){const i=Pt(),{isMobile:l}=Ol(),a=se(!1),r=b(()=>{const{navbarAutoHide:u="mobile"}=i.value;return u!=="none"&&(u==="always"||l.value)}),o=b(()=>i.value.navbarLayout??{start:["Brand"],center:["Links"],end:["Language","Repo","Outlook","Search"]}),c={Brand:im,Language:Jg,Links:lm,Repo:rm,Outlook:Qg,Search:ht("SearchBox")?xe("SearchBox"):Oa},d=u=>c[u]??(ht(u)?xe(u):Oa);return Jt(()=>{a.value=!1}),we(l,u=>{u||(a.value=!1)}),()=>[s("header",{key:"navbar",id:"navbar",class:["vp-navbar",{"auto-hide":r.value}],"vp-navbar":""},[s("div",{class:"vp-navbar-start"},[s(Va,{onToggle:()=>
2946{a.value&&(a.value=!1),t("toggleSidebar")}}),o.value.start?.map(u=>s(d(u)))]),s("div",{class:"vp-navbar-center"},[o.value.center?.map(u=>s(d(u)))]),s("div",{class:"vp-navbar-end"},[o.value.end?.map(u=>s(d(u))),s(Tp,{active:a.value,onToggle:()=>{a.value=!a.value}})])]),s(nm,{show:a.value},n)]}});const Sr=(e,t)=>t.activeMatch?new RegExp(t.activeMatch,"u").test(e.path):Yu(e,t.link);var om=I({name:"SidebarChild",props:{config:{type:Object,required:!0}},setup(e){const t=xt();return()=>me(e.config.link)?s(Ye,{class:["vp-sidebar-link",{active:Sr(t,e.config)}],config:{...e.config,exact:!0}}):s("p",e,[s(xe("VPIcon"),{icon:e.config.icon,sizing:"both"}),e.config.text])}});const Pr=(e,t)=>"children"in t?!!t.prefix&&Yu(e,t.prefix)||t.children.some(n=>Pr(e,n)):Sr(e,t);var cm=I({name:"SidebarGroup",props:{config:{type:Object,required:!0},open:{type:Boolean,required:!0}},emits:["toggle"],setup(e,{emit:t}){const n=xt(),i=se(!1),l=b(()=>Pr(n,e.config)),a=b(()=>Sr(n,e.config)),r=b(()=>e.open||e.config.expanded&&!i.value);return()=>{const{collapsible:o,children:c=[],icon:d,prefix:u,link:p,text:h}=e.config;return s("section",{class:"vp-sidebar-group"},[s(o?"button":"p",{class:["vp-sidebar-header",{clickable:o||p,exact:a.value,active:l.value}],...o?{type:"button",onClick:()=>{i.value=!0,t("toggle")}}:{}},[s(xe("VPIcon"),{icon:d,sizing:"both"}),p?s(Ye,{class:"vp-sidebar-title no-external-link-icon",config:{text:h,link:p}}):s("span",{class:"vp-sidebar-title"},h),o?s("span",{class:["vp-arrow",r.value?"down":"end"]}):null]),r.value||!o?s(wp,{key:u,config:c}):null])}}}),wp=I({name:"SidebarLinks",props:{config:{type:Array,required:!0}},setup(e){const t=xt(),n=af(),i=se(-1),l=a=>{i.value=a===i.value?-1:a};return wt(n,()=>{const a=e.config.findIndex(r=>Pr(t,r));i.value=a},{flush:"post"}),()=>s("ul",{class:"vp-sidebar-links"},e.config.map((a,r)=>s("li","children"in a?s(cm,{config:a,open:r===i.value,onToggle:()=>{l(r)}}):s(om,{config:a}))))}}),um=I({name:"SideBar",slots:Object,setup(e,{slots:t}){const n=xt(),i=Fr(),l=ae();return ye(()=>{wt(()=>n.hash,a=>{const r=document.querySelector(`.vp-sidebar a.vp-sidebar-link[href="${n.path}${a}"]`);if(!r)return;const{top:o,height:c}=l.value.getBoundingClientRect(),{top:d,height:u}=r.getBoundingClientRect();d<o?r.scrollIntoView(!0):d+u>o+c&&r.scrollIntoView(!1)})}),()=>s("aside",{ref:l,key:"sidebar",id:"sidebar",class:"vp-sidebar","vp-sidebar":""},[t.sidebarTop?.(),t.sidebarItems?.(i.value)??s(wp,{config:i.value}),t.sidebarBottom?.()])}}),Rr=I({name:"MainLayout",props:{containerClass:String,noNavbar:Boolean,noSidebar:Boolean,noToc:Boolean},slots:Object,setup(e,{slots:t}){const{frontmatter:n,theme:i,themeLocale:l}=Pe(),{isMobile:a,isPC:r}=Ol(),o=tt(),[c,d]=Ra(!1),[u,p]=Ra(!1),h=Fr(),E=ae(),v=Tr(E),B=se(!1),k=b(()=>e.noNavbar||n.value.navbar===!1||l.value.navbar===!1?!1:!!(l.value.logo??l.value.repo??l.value.navbar)),D=b(()=>n.value.externalLinkIcon??i.value.externalLinkIcon??!0),y=b(()=>!e.noToc&&!n.value.home&&!!(n.value.toc??l.value.toc??!0)),m={x:0,y:0},_=M=>{m.x=M.changedTouches[0].clientX,m.y=M.changedTouches[0].clientY},P=M=>{const z=M.changedTouches[0].clientX-m.x,T=M.changedTouches[0].clientY-m.y;Math.abs(z)>Math.abs(T)*1.5&&Math.abs(z)>40&&(z>0&&m.x<=80?d(!0):d(!1))};let H=0;return fe("scroll",ku(()=>{const M=window.scrollY;M<=58||M<H?B.value=!1:H+200<M&&!c.value&&(B.value=!0),H=M},300,!0)),we(a,M=>{M||d(!1)}),we(c,M=>{v.value=M}),Jt(()=>{d(!1)}),ye(()=>{E.value=document.body}),Sn(()=>{v.value=!1}),()=>{const M=t.sidebarTop?.(),z=t.sidebarItems?.(h.value),T=t.sidebarBottom?.(),R=Jn(M)&&Jn(z)&&Jn(T),j=e.noSidebar||n.value.sidebar===!1||(n.value.home||h.value.length===0)&&R;return s(ht("GlobalEncrypt")?xe("GlobalEncrypt"):yr,()=>s("div",{class:["theme-container",{"hide-navbar":B.value,"no-navbar":!k.value,"sidebar-collapsed":!a.value&&!r.value&&u.value,"sidebar-open":a.value&&c.value,"no-sidebar":j,"external-link-icon":D.value,pure:o.value,"has-toc":y.value},e.containerClass??"",n.value.containerClass??""],"vp-container":"",onTouchStart:_,onTouchEnd:P},[k.value?s(sm,{onToggleSidebar:()=>d()},t):null,s(ei,{name:"fade-in"},()=>c.value?s("div",{class:"vp-sidebar-mask",onClick:()=>d(!1)}):null),s(ei,{name:"fade-in"},()=>a.value?null:s("div",{class:"toggle-sidebar-wrapper",onClick:()=>p()},s("span",{class:["arrow",u.value?"end":"start"]}))),j?null:s(um,null,t),t.default(),s(Gg)]))}}});const xp=()=>{const{frontmatter:e,themeLocale:t}=Pe(),n=b(()=>e.value.changelog??((t.value.changelog??!1)&&!e.value.home)),i=b(()=>{const{contributors:a,home:r}=e.value;return Wt(a)?r?!1:t.value.contributors??!0:a??(r?!1:t.value.contributors??!0)}),l=b(()=>e.value.lastUpdated??t.value.lastUpdated??!0);
2946return{changelog:n,contributors:i,lastUpdated:l}};var Il=I({name:"MarkdownContent",props:{custom:Boolean},slots:Object,setup(e,{slots:t}){const n=On(),{changelog:i,contributors:l}=xp(),a=se(),r=y1(a,{delayEnter:sl(n.value.focus)?n.value.focus:1500,delayLeave:0}),o=b(()=>!!(n.value.focus??n.value.pure)&&r.value);return ye(()=>{const c=document.documentElement;wt(o,d=>{d?c.classList.add("is-focusing"):c.classList.remove("is-focusing")})}),()=>s("div",{class:{custom:e.custom},"vp-content":""},[t.contentBefore?.(),s(ru,{ref:a,id:"markdown-content"}),t.contentAfter?.(),i.value&&ht("GitChangelog")?s(xe("GitChangelog")):null,l.value==="content"&&ht("GitContributors")?s(xe("GitContributors")):null])}}),Lr=I({name:"SkipLink",props:{content:{type:String,default:"main-content"}},setup(e){const t=Pt(),n=ae(),i=({target:l})=>{const a=document.querySelector(l.hash);if(a){const r=()=>{a.removeAttribute("tabindex"),a.removeEventListener("blur",r)};a.setAttribute("tabindex","-1"),a.addEventListener("blur",r),a.focus(),window.scrollTo(0,0)}};return Jt(()=>{n.value?.focus()}),()=>[s("span",{ref:n,tabindex:"-1"}),s("a",{href:`#${e.content}`,class:"vp-skip-link sr-only",onClick:i},t.value.routerLocales.skipToContent)]}});const Na=()=>s(Ae,{name:"slide-down"},()=>s("path",{d:"M108.775 312.23c13.553 0 27.106 3.734 39.153 11.806l375.205 250.338 363.641-252.808c32.587-21.624 76.499-12.83 98.123 19.757 21.685 32.467 12.95 76.56-19.576 98.184l-402.854 278.89c-23.733 15.901-54.694 15.962-78.547.12L69.501 442.097c-32.647-21.685-41.441-65.777-19.817-98.304 13.734-20.54 36.201-31.563 59.09-31.563Z"}));Na.displayName="SlideDownIcon";const Or=(e,{emit:t})=>s("button",{type:"button",class:"vp-hero-slide-down-button",onClick:()=>t("click")},[s(Na),s(Na)]);Or.displayName="HeroSlideDownButton";var oe=I({name:"DropTransition",props:{delay:{type:Number,default:0},duration:{type:Number,default:.25},group:Boolean,appear:Boolean},slots:Object,setup(e,{slots:t}){const n=l=>{l.style.transition=`transform ${e.duration}s ease-in-out ${e.delay}s, opacity ${e.duration}s ease-in-out ${e.delay}s`,l.style.transform="translateY(-20px)",l.style.opacity="0"},i=l=>{l.style.transform="translateY(0)",l.style.opacity="1"};return()=>{const l={name:"drop",appear:e.appear,onAppear:n,onAfterAppear:i,onEnter:n,onAfterEnter:i,onBeforeLeave:n};return e.group?s(Hc,l,t.default):s(ei,l,t.default)}}});let da=null,ha=null;const $a={wait:()=>da,pending:()=>{da=new Promise(e=>{ha=e})},resolve:()=>{ha?.(),da=null,ha=null}};var pm=I({name:"MainFadeInUpTransition",slots:Object,setup(e,{slots:t}){const n=tt();return()=>n.value?s(yr,t.default):s(ei,{name:"fade-in-up",mode:"out-in",onBeforeEnter:$a.resolve,onBeforeLeave:$a.pending},t.default)}}),dm=I({name:"PageTitle",setup(){const{frontmatter:e,page:t,themeLocale:n}=Pe(),{info:i,items:l}=Pg();return()=>s("div",{class:"vp-page-title"},[s("h1",[n.value.titleIcon===!1?null:s(xe("VPIcon"),{icon:e.value.icon}),t.value.title]),s(cp,{info:i.value,items:l.value}),s("hr")])}});const hm=(e,t)=>{const n=e.replace(t,"/").split("/"),i=[];let l=hr(t);return n.forEach((a,r)=>{r!==n.length-1?(l+=`${a}/`,i.push({link:l,name:a||"Home"})):a!==""&&(l+=a,i.push({link:l,name:a}))}),i};var Em=I({name:"BreadCrumb",setup(){const{frontmatter:e,page:t,routeLocale:n,routePath:i,themeLocale:l}=Pe(),a=ae([]),r=b(()=>(e.value.breadcrumb??l.value.breadcrumb??!0)&&a.value.length>1),o=b(()=>e.value.breadcrumbIcon??l.value.breadcrumbIcon??!0),c=()=>{const d=hm(t.value.path,n.value).map(({link:u,name:p})=>{const{path:h,meta:E,notFound:v}=At(u);return v||E.breadcrumbExclude?null:{title:E.shortTitle||E.title||p,icon:E.icon,path:h}}).filter(u=>u!==null);d.length>1&&(a.value=d)};return ye(()=>{wt(i,c)}),()=>s("nav",{class:["vp-breadcrumb",{disable:!r.value}]},r.value?s("ol",{vocab:"https://schema.org/",typeof:"BreadcrumbList"},a.value.map((d,u)=>s("li",{class:{"is-active":a.value.length-1===u},property:"itemListElement",typeof:"ListItem"},[s(Ve,{to:d.path,property:"item",typeof:"WebPage"},()=>[o.value?s(xe("VPIcon"),{icon:d.icon}):null,s("span",{property:"name"},d.title||"Unknown")]),s("meta",{property:"position",content:u+1})]))):[])}});const Ao=(e,t)=>e===!1?e:ai(e)?{...e,link:Al(e.link,!0,t).link}:me(e)?Al(e,!0,t):null,ja=(e,t,n)=>{const i=e.findIndex(a=>a.link===t);if(i!==-1){if(!e[i+n])return null;const a=e[i+n];return a.link?a:"prefix"in a&&!At(a.prefix).notFound?{...a,link:a.prefix}:null}for(const a of e)if("children"in a){const r=ja(a.children,t,n);if(r)return r}const l=e.findIndex(a=>"prefix"in a&&a.prefix===t);if(l!==-1){if(!e[l+n])return null;const a=e[l+n];return a.link?a:"prefix"in a&&!At(a.prefix).notFound?{...a,link:a.prefix}:null}return null},fm=()=>{const{frontmatter:e,routePath:t,themeLocale:n}=Pe(),i=Fr(),l=b(()=>{const r=Ao(e.value.prev,t.value);return r===!1?null:r??(n.value.prevLink===!1?null:ja(i.value,t.value,-1))}),a=b(()=>{const r=Ao(e.value.next,t.value);return r===!1?null:r??(n.value.nextLink===!1?null:ja(i.value,t.value,1))});return{prevLink:l,nextLink:a}};var gm=I({name:"PageNav",setup(){const e=Bt(),t=Xt(),{prevLink:n,nextLink:i}=fm();return fe("keydown",l=>
2946{l.altKey&&(l.key==="ArrowRight"?i.value&&(t(i.value.link),l.preventDefault()):l.key==="ArrowLeft"&&n.value&&(t(n.value.link),l.preventDefault()))}),()=>n.value||i.value?s("nav",{class:"vp-page-nav"},[n.value?s(Ye,{class:"prev",config:n.value},()=>[s("div",{class:"hint"},[s("span",{class:"arrow start"}),e.value.prev]),s("div",{class:"link"},[s(xe("VPIcon"),{icon:n.value?.icon}),n.value?.text])]):null,i.value?s(Ye,{class:"next",config:i.value},()=>[s("div",{class:"hint"},[e.value.next,s("span",{class:"arrow end"})]),s("div",{class:"link"},[i.value?.text,s(xe("VPIcon"),{icon:i.value?.icon})])]):null]):null}}),mm=I({name:"PrintButton",setup(){const e=Bt(),t=On();return()=>t.value.print===!1?null:s("button",{type:"button",class:"print-button",title:e.value.print,onClick:()=>{window.print()}},s(ap))}});const Bo={selector:[...Array.from({length:6}).map((e,t)=>`#markdown-content > h${t+1}`),"[vp-content] > h2"].join(", "),levels:"deep",ignore:[".vp-badge",".vp-icon"]};var vm=I({name:"TOC",props:{items:Array},slots:Object,setup(e,{slots:t}){const{frontmatter:n,themeLocale:i}=Pe(),l=b(()=>{const k=n.value.toc??i.value.toc;return ai(k)?{...Bo,...k}:k??!0?Bo:void 0}),a=Kf(l),r=xt(),o=Bt(),[c,d]=Ra(),u=ae(),p=se("-2rem"),h=k=>{u.value?.scrollTo({top:k,behavior:"smooth"})},E=()=>{if(u.value){const k=document.querySelector(".vp-toc-item.active");k?p.value=`${k.getBoundingClientRect().top-u.value.getBoundingClientRect().top+u.value.scrollTop}px`:p.value="-2rem"}else p.value="-2rem"};ye(()=>{wt(()=>r.hash,k=>{if(u.value){const D=document.querySelector(`#toc a.vp-toc-link[href$="${k}"]`);if(!D)return;const{top:y,height:m}=u.value.getBoundingClientRect(),{top:_,height:P}=D.getBoundingClientRect();_<y?h(u.value.scrollTop+_-y):_+P>y+m&&h(u.value.scrollTop+_+P-y-m)}},{flush:"post"}),wt(()=>r.fullPath,E,{flush:"post"})});const v=({title:k,level:D,slug:y})=>s(Ve,{to:`#${y}`,class:["vp-toc-link",`level${D}`],onClick:()=>{d()}},()=>k),B=k=>k.length?s("ul",{class:"vp-toc-list"},k.map(D=>{const y=B(D.children);return[s("li",{class:["vp-toc-item",{active:r.hash===`#${D.slug}`}]},v(D)),y?s("li",y):null]})):null;return()=>l.value||e.items?.length?s(vr,()=>{const k=e.items?.length?B(e.items):B(a.value),D=t.toc?.(a.value)??(k?[s("div",{class:"vp-toc-header",onClick:()=>{d()}},[o.value.toc,s(mm),s("div",{class:["arrow",c.value?"down":"end"]})]),s("div",{class:["vp-toc-wrapper",c.value?"open":""],ref:u},[k,s("div",{class:"vp-toc-marker",style:{top:p.value}})])]:null),y=t.tocBefore?.(),m=t.tocAfter?.();return Jn(D)&&Jn(y)&&Jn(m)?null:s("div",{class:"vp-toc-placeholder"},[s("aside",{id:"toc","vp-toc":""},[y,D,m])])}):null}});const Fp=()=>s(Ae,{name:"edit"},()=>[s("path",{d:"M430.818 653.65a60.46 60.46 0 0 1-50.96-93.281l71.69-114.012 7.773-10.365L816.038 80.138A60.46 60.46 0 0 1 859.225 62a60.46 60.46 0 0 1 43.186 18.138l43.186 43.186a60.46 60.46 0 0 1 0 86.373L588.879 565.55l-8.637 8.637-117.466 68.234a60.46 60.46 0 0 1-31.958 11.229z"}),s("path",{d:"M728.802 962H252.891A190.883 190.883 0 0 1 62.008 771.98V296.934a190.883 190.883 0 0 1 190.883-192.61h267.754a60.46 60.46 0 0 1 0 120.92H252.891a69.962 69.962 0 0 0-69.098 69.099V771.98a69.962 69.962 0 0 0 69.098 69.098h475.911A69.962 69.962 0 0 0 797.9 771.98V503.363a60.46 60.46 0 1 1 120.922 0V771.98A190.883 190.883 0 0 1 728.802 962z"})]);Fp.displayName="EditIcon";const Am={GitHub:":repo/edit/:branch/:path",GitLab:":repo/-/edit/:branch/:path",Gitee:":repo/edit/:branch/:path",Bitbucket:":repo/src/:branch/:path?mode=edit&spa=0&at=:branch&fileviewer=file-view-default"},Bm=({docsRepo:e,docsBranch:t,docsDir:n,filePathRelative:i,editLinkPattern:l})=>{if(!i)return null;const a=wr(e);let r;return l?r=l:a!==null&&(r=Am[a]),r?r.replace(/:repo/u,li(e)?e:`https://github.com/${e}`).replace(/:branch/u,t).replace(/:path/u,Er(`${hr(n)}/${i}`)):null},ym=()=>{const{frontmatter:e,page:t,themeLocale:n}=Pe(),i=Bt();return b(()=>{const{repo:l,docsRepo:a=l,docsBranch:r="main",docsDir:o="",editLink:c,editLinkPattern:d=""}=n.value;if(!(e.value.editLink??c??!0)||!a)return null;const u=Bm({docsRepo:a,docsBranch:r,docsDir:o,editLinkPattern:d,filePathRelative:t.value.filePathRelative});return u?{text:i.value.editLink,link:u}:null})};
2946var _m=I({name:"PageMeta",setup(){const e=xp(),t=xu(),n=ym(),i=P1(e.lastUpdated),l=Bt();return()=>s("footer",{class:"vp-page-meta"},[n.value?s("div",{class:"vp-meta-item edit-link"},s(Ye,{class:"vp-meta-label",config:n.value},{before:()=>s(Fp)})):null,s("div",{class:"vp-meta-item git-info"},[(!e.changelog.value||!ht("GitChangelog"))&&i.value?s("div",{class:"update-time"},[s("span",{class:"vp-meta-label"},i.value.locale),s("time",{class:"vp-meta-info",datetime:i.value.iso,"data-allow-mismatch":""},i.value.text)]):null,e.contributors.value&&e.contributors.value!=="content"&&t.value.length?s("div",{class:"contributors"},[s("span",{class:"vp-meta-label"},`${l.value.contributors}: `),t.value.map(({email:a,name:r},o,c)=>[s("span",{class:"vp-meta-info",title:`email: ${a}`},r),o!==c.length-1?",":""])]):null])])}}),bm=I({name:"PageContent",slots:Object,setup(e,{slots:t}){const{frontmatter:n}=Pe(),{isDarkMode:i}=ji();return()=>s("main",{id:"main-content",class:"vp-page"},s(ht("LocalEncrypt")?xe("LocalEncrypt"):yr,()=>[t.pageTop?.(),n.value.cover?s("div",{class:"page-cover"},s("img",{src:Ce(n.value.cover),alt:"","no-view":""}
2946)):null,s(Em),s(dm),s(vm,null,t),t.content?.()??s(Il,null,t),s(_m),s(gm),ht("CommentService")?s(xe("CommentService"),{darkmode:i.value}):null,t.pageBottom?.()]))}});const Ha=(e,{slots:t})=>{const{bgImage:n,bgImageDark:i,bgImageStyle:l,color:a,description:r,image:o,imageDark:c,header:d,features:u=[]}=e;return s("div",{class:"vp-feature-wrapper"},[n?s("div",{class:["vp-feature-bg",{light:i}],style:[{"background-image":`url(${n})`},l]}):null,i?s("div",{class:"vp-feature-bg dark",style:[{"background-image":`url(${i})`},l]}):null,s("div",{class:"vp-feature",style:a?{color:a}:{}},[t.image?.(e)??[o?s("img",{class:["vp-feature-image",{light:c}],src:Ce(o),alt:""}):null,c?s("img",{class:"vp-feature-image dark",src:Ce(c),alt:""}):null],t.info?.(e)??[d?s("h2",{class:"vp-feature-header"},d):null,r?s("div",{class:"vp-feature-description",innerHTML:r}):null],u.length?s("div",{class:"vp-features"},u.map(({icon:p,title:h,details:E,link:v})=>{const B=[s("h3",{class:"vp-feature-title"},[s(xe("VPIcon"),{icon:p}),s("span",{innerHTML:h})]),s("div",{class:"vp-feature-details",innerHTML:E})];return v?dr(v)?s("a",{class:"vp-feature-item link",href:v,"aria-label":h,target:"_blank"},B):s(Ve,{class:"vp-feature-item link",to:v,"aria-label":h},()=>B):s("div",{class:"vp-feature-item"},B)})):null])])};Ha.displayName="FeaturePanel";var km=I({name:"HeroInfo",slots:Object,setup(e,{slots:t}){const{frontmatter:n,siteLocale:i}=Pe(),l=b(()=>{const{heroText:c,tagline:d,heroStyle:u,heroFullScreen:p=!1}=n.value;return{text:c??(i.value.title||"Hello"),tagline:d??i.value.description,style:u??null,isFullScreen:p}}),a=b(()=>{const{heroImage:c,heroImageDark:d,heroAlt:u,heroImageStyle:p}=n.value;return{image:c?Ce(c):null,imageDark:d?Ce(d):null,style:p??null,alt:u??""}}),r=b(()=>{const{bgImage:c,bgImageDark:d,bgImageStyle:u}=n.value;return{image:me(c)?Ce(c):null,imageDark:me(d)?Ce(d):null,style:u??null}}),o=b(()=>n.value.actions??[]);return()=>s("header",{class:["vp-hero-info-wrapper",{"hero-fullscreen":l.value.isFullScreen}],style:l.value.style},[t.heroBg?.(r.value)??[r.value.image?s("div",{class:["vp-hero-mask",{light:r.value.imageDark}],style:[{"background-image":`url(${r.value.image})`},r.value.style]}):null,r.value.imageDark?s("div",{class:"vp-hero-mask dark",style:[{"background-image":`url(${r.value.imageDark})`},r.value.style]}):null],s("div",{class:"vp-hero-info"},[t.heroLogo?.(a.value)??s(oe,{appear:!0,group:!0},()=>{const{image:c,imageDark:d,style:u,alt:p}=a.value;return[c?s("img",{key:"light",class:["vp-hero-image",{light:d}],style:u,src:c,alt:p}):null,d?s("img",{key:"dark",class:"vp-hero-image dark",style:u,src:d,alt:p}):null]}),t.heroInfo?.(l.value)??s("div",{class:"vp-hero-infos"},[l.value.text?s(oe,{appear:!0,delay:.04},()=>s("h1",{id:"main-title",class:"vp-hero-title"},l.value.text)):null,l.value.tagline?s(oe,{appear:!0,delay:.08},()=>s("div",{id:"main-description",innerHTML:l.value.tagline})):null,o.value.length?s(oe,{appear:!0,delay:.12},()=>s("p",{class:"vp-hero-actions"},o.value.map(c=>s(Ye,{class:["vp-hero-action",c.type??"default","no-external-link-icon"],config:c})))):null])]),l.value.isFullScreen?s(Or,{onClick:()=>window.scrollTo({top:window.innerHeight-(document.querySelector("[vp-navbar]")?.clientHeight??0),behavior:"smooth"})}):null])}});const Sp=(e,{slots:t})=>{const{bgImage:n,bgImageDark:i,bgImageStyle:l,color:a,description:r,image:o,imageDark:c,header:d,highlights:u=[],type:p="un-order"}=e;return s("div",{class:"vp-highlight-wrapper",style:a?{color:a}:{}},[n?s("div",{class:["vp-highlight-bg",{light:i}],style:[{"background-image":`url(${n})`},l]}):null,i?s("div",{class:"vp-highlight-bg dark",style:[{"background-image":`url(${i})`},l]}):null,s("div",{class:"vp-highlight"},[t.image?.(e)??[o?s("img",{class:["vp-highlight-image",{light:c}],src:Ce(o),alt:""}):null,c?s("img",{class:"vp-highlight-image dark",src:Ce(c),alt:""}):null],t.info?.(e)??[s("div",{class:"vp-highlight-info-wrapper"},s("div",{class:"vp-highlight-info"},[d?s("h2",{class:"vp-highlight-header",innerHTML:d}):null,r?s("div",{class:"vp-highlight-description",innerHTML:r}):null,t.highlights?.(u)??s(p==="order"?"ol":p==="no-order"?"dl":"ul",{class:"vp-highlights"},u.map(({icon:h,title:E,details:v,link:B})=>{const k=[s(p==="no-order"?"dt":"h3",{class:"vp-highlight-title"},[h?s(xe("VPIcon"),{class:"vp-highlight-icon",icon:h}
2946):null,s("span",{innerHTML:E})]),v?s(p==="no-order"?"dd":"div",{class:"vp-highlight-details",innerHTML:v}):null];return s(p==="no-order"?"div":"li",{class:["vp-highlight-item-wrapper",{link:B}]},B?dr(B)?s("a",{class:"vp-highlight-item link",href:B,"aria-label":E,target:"_blank"},k):s(Ve,{class:"vp-highlight-item link",to:B,"aria-label":E},()=>k):s("div",{class:"vp-highlight-item"},k))}))]))]])])};Sp.displayName="HighlightSection";var Cm=I({name:"HomePage",slots:Object,setup(e,{slots:t}){const n=Et();return()=>{const{features:i,highlights:l}=n.value;return s("main",{id:"main-content",class:"vp-page vp-project-home","aria-labelledby":n.value.heroText===""?"":"main-title"},[t.heroBefore?.(),s(km,null,t),t.heroAfter?.(),Wt(l)?l.map(a=>"features"in a?s(Ha,a):s(Sp,a)):Wt(i)?s(oe,{appear:!0,delay:.24},()=>s(Ha,{features:i})):null,t.content?.()??s(oe,{appear:!0,delay:.32},()=>s(Il,null,t))])}}}),Dm=I({name:"PortfolioHero",slots:Object,setup(e,{slots:t}){const n=Ju(),i=Et(),l=se(0),a=b(()=>i.value.titles?.[l.value]??""),r=se(""),o=b(()=>{const{name:h,avatar:E,avatarDark:v,avatarAlt:B,avatarStyle:k}=i.value;return{name:h??n.value.name,avatar:E?Ce(E):null,avatarDark:v?Ce(v):null,alt:(B||h)??"",style:k??null}}),c=b(()=>{const{bgImage:h,bgImageDark:E,bgImageStyle:v}=i.value;return{image:me(h)?Ce(h):null,imageDark:me(E)?Ce(E):null,style:v??null}}),d=b(()=>{const{welcome:h,name:E,titles:v=[],medias:B}=i.value;return{name:E??n.value.name,welcome:h??"👋 Hi There, I'm",title:r.value,titles:v,medias:B??null}}),u=()=>{r.value="";let h=0,E=!1;const v=async()=>{if(!E)if(r.value+=a.value[h],h+=1,await fn(),h<a.value.length)setTimeout(()=>{v()},150);else{const B=d.value.titles.length;setTimeout(()=>{l.value=B<=1||l.value===d.value.titles.length-1?0:l.value+1},1e3)}};return v(),()=>{E=!0}};let p;return ye(()=>{wt(a,()=>{p?.(),p=u()})}),()=>s("section",{id:"portfolio",class:["vp-portfolio",{bg:c.value.image}]},[t.portfolioBg?.(c.value)??[c.value.image?s("div",{class:["vp-portfolio-mask",{light:c.value.imageDark}],style:[{background:`url(${c.value.image}) center/cover no-repeat`},c.value.style]}):null,c.value.imageDark?s("div",{class:"vp-portfolio-mask dark",style:[{background:`url(${c.value.imageDark}) center/cover no-repeat`},c.value.style]}):null],t.portfolioAvatar?.(o.value)??s("div",{class:"vp-portfolio-avatar"},[s(oe,{delay:.04},()=>{const{avatar:h,avatarDark:E,name:v,alt:B,style:k}=o.value;return[h?s("img",{key:"light",class:{light:E},src:h,title:v,alt:B,style:k}):null,E?s("img",{key:"dark",class:"dark",src:E,title:v,alt:B,style:k}):null]})]),s("div",{class:"vp-portfolio-container"},t.portfolioInfo?.(d.value)??s("div",{class:"vp-portfolio-info"},[s(oe,{appear:!0,delay:.08},()=>s("h6",{class:"vp-portfolio-welcome"},d.value.welcome)),s(oe,{appear:!0,delay:.12},()=>s("h1",{class:"vp-portfolio-name",id:"main-title"},d.value.name)),s(oe,{appear:!0,delay:.16},()=>s("h2",{class:"vp-portfolio-title"},r.value)),s(oe,{appear:!0,delay:.2},()=>d.value.medias?s("div",{class:"vp-portfolio-medias"},d.value.medias.map(({name:h,url:E,icon:v})=>s("a",{class:"vp-portfolio-media",href:E,rel:"noopener noreferrer",target:"_blank",title:h},s(xe("VPIcon"),{icon:v,sizing:"both"})))):ht("SocialMedias")?s(xe("SocialMedias")):null)]))])}}),Tm=I({name:"PortfolioHome",slots:Object,setup(e,{slots:t}){const n=Et();return()=>{const i=n.value.content??"portfolio";return s("main",{id:"main-content",class:"vp-page vp-portfolio-home","aria-labelledby":"main-title"},[s(Dm,null,t),i==="none"?null:t.content?.()??s("div",s(oe,{appear:!0,delay:.24},()=>s(Il,{class:{"vp-portfolio-content":i==="portfolio"}},t)))])}}}),wm=I({name:"Layout",slots:Object,setup(e,{slots:t}){const{frontmatter:n,page:i}=Pe();return()=>[s(Lr),s(Rr,null,{...t,default:t.default??(()=>n.value.portfolio?s(Tm,null,t):n.value.home?s(Cm,null,t):s(pm,()=>s(bm,{key:i.value.path},t))),navScreenBottom:t.navScreenBottom??(ht("BloggerInfo")?()=>s(xe("BloggerInfo")):null)})]}}),xm=I({name:"NotFound",slots:Object,setup(e,{slots:t}){const{routeLocale:n,theme:i,themeLocale:l}=Pe(),a=Yt(),r=se(!1),o=b(()=>i.value.locales[r.value?n.value:"/"].routerLocales),c=()=>
2946{if(!r.value)return o.value.notFoundMsg[0];const d=o.value.notFoundMsg;return d[Math.floor(Math.random()*d.length)]};return ye(()=>{r.value=!0}),()=>[s(Lr),s(Rr,{noSidebar:!0},{...t,default:()=>s("main",{id:"main-content",class:"vp-page not-found"},t.default?.()??[s("div",{class:"not-found-hint"},[s("p",{class:"error-code"},"404"),s("h1",{class:"error-title"},o.value.notFoundTitle),s("p",{class:"error-hint"},c())]),s("div",{class:"actions"},[s("button",{type:"button",class:"action-button",onClick:()=>{window.history.go(-1)}},o.value.back),s("button",{type:"button",class:"action-button",onClick:()=>{a.push(l.value.home??n.value)}},o.value.home)])])})]}});const Pp=()=>s(Ae,{name:"lock"},()=>s("path",{d:"M787.168 952.268H236.832c-30.395 0-55.033-24.638-55.033-55.033V429.45c0-30.395 24.638-55.034 55.033-55.034h82.55V264.35c0-106.38 86.238-192.618 192.618-192.618S704.618 157.97 704.618 264.35v110.066h82.55c30.395 0 55.033 24.639 55.033 55.034v467.785c0 30.395-24.639 55.033-55.033 55.033zM484.483 672.046v115.122h55.034V672.046c31.99-11.373 55.033-41.605 55.033-77.496 0-45.592-36.958-82.55-82.55-82.55s-82.55 36.958-82.55 82.55c0 35.89 23.042 66.123 55.033 77.496zM622.067 264.35c0-60.788-49.28-110.067-110.067-110.067s-110.067 49.28-110.067 110.067v110.066h220.135V264.35z"}));Pp.displayName="LockIcon";const Fm=JSON.parse('{"category":{"/":{"path":"/category/","map":{"课程笔记":{"path":"/category/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/","indexes":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139]},"DragonOS":{"path":"/category/dragonos/","indexes":[140]},"笔记":{"path":"/category/%E7%AC%94%E8%AE%B0/","indexes":[141,142,143,144,145,146,147,148,149,150,151,152,153]},"Linux 内核":{"path":"/category/linux-%E5%86%85%E6%A0%B8/","indexes":[145,146,148,152,153]},"Rust":{"path":"/category/rust/","indexes":[141,143,147,154]},"后端":{"path":"/category/%E5%90%8E%E7%AB%AF/","indexes":[142]},"C++":{"path":"/category/c__/","indexes":[155]},"编译器":{"path":"/category/%E7%BC%96%E8%AF%91%E5%99%A8/","indexes":[149,150,151]},"微信":{"path":"/category/%E5%BE%AE%E4%BF%A1/","indexes":[144]},"Linux内核":{"path":"/category/linux%E5%86%85%E6%A0%B8/","indexes":[156,157,158,159]},"杂谈":{"path":"/category/%E6%9D%82%E8%B0%88/","indexes":[160,161,162,163,156,154,158,164,165,166,167,168]},"Debug杂谈":{"path":"/category/debug%E6%9D%82%E8%B0%88/","indexes":[160,161,154,165,166]},"网络问题":{"path":"/category/%E7%BD%91%E7%BB%9C%E9%97%AE%E9%A2%98/","indexes":[166]},"编程杂谈":{"path":"/category/%E7%BC%96%E7%A8%8B%E6%9D%82%E8%B0%88/","indexes":[164]},"面经":{"path":"/category/%E9%9D%A2%E7%BB%8F/","indexes":[169]}}},"/en/":{"path":"/en/category/","map":{}}},"tag":{"/":{"path":"/tag/","map":{"大学物理":{"path":"/tag/%E5%A4%A7%E5%AD%A6%E7%89%A9%E7%90%86/","indexes":[111,113]},"编译原理":{"path":"/tag/%E7%BC%96%E8%AF%91%E5%8E%9F%E7%90%86/","indexes":[0,1,2,3,4,5,6,7,8,9,10,11]},"计算机网络":{"path":"/tag/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/","indexes":[115,116,117,118,119,120,121,122,123,124,125,138,139]},"数据库":{"path":"/tag/%E6%95%B0%E6%8D%AE%E5%BA%93/","indexes":[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,112,114]},"操作系统":{"path":"/tag/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/","indexes":[126,127,128,129,130,131,132,133,134,135,136,137]},"软件项目管理":{"path":"/tag/%E8%BD%AF%E4%BB%B6%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/","indexes":[43,44,45,46,47,48,49,50,51,52,53,54,65,66,67,68,69,70,97,102,103,104,105,106,107,108,109,110]},"软件测试与维护":{"path":"/tag/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95%E4%B8%8E%E7%BB%B4%E6%8A%A4/","indexes":[12,13,14,15,16]},"UML":{"path":"/tag/uml/","indexes":[17,18]},"软件体系结构":{"path":"/tag/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/","indexes":[55,56,57,58,59,60,61,62,63,64,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,98,99,100,101]},"DragonOS":{"path":"/tag/dragonos/","indexes":[140]},"Linux 内核":{"path":"/tag/linux-%E5%86%85%E6%A0%B8/","indexes":[145,146,148,152,153]},"内存管理":{"path":"/tag/%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86/","indexes":[146,152]},"NUMA":{"path":"/tag/numa/","indexes":[146,152,153]},"开发环境":{"path":"/tag/%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83/","indexes":[145]},"Rust":{"path":"/tag/rust/","indexes":[141,143,147,154]},"后端":{"path":"/tag/%E5%90%8E%E7%AB%AF/","indexes":[142]},"gRPC":{"path":"/tag/grpc/","indexes":[142]},"go":{"path":"/tag/go/","indexes":[142]},"C++":{"path":"/tag/c__/","indexes":[155]},"编译器":{"path":"/tag/%E7%BC%96%E8%AF%91%E5%99%A8/","indexes":[149,150,151]},"词法分析":{"path":"/tag/%E8%AF%8D%E6%B3%95%E5%88%86%E6%9E%90/","indexes":[150]},"微信":{"path":"/tag/%E5%BE%AE%E4%BF%A1/","indexes":[144]},"客户端":{"path":"/tag/%E5%AE%A2%E6%88%B7%E7%AB%AF/","indexes":[144]},"Linux内核":{"path":"/tag/linux%E5%86%85%E6%A0%B8/","indexes":[156,157,158,159]},"Android":{"path":"/tag/android/","indexes":[160]},"Debug":{"path":"/tag/debug/","indexes":[161,165,166]},"网络问题":{"path":"/tag/%E7%BD%91%E7%BB%9C%E9%97%AE%E9%A2%98/","indexes":[166]},"MacOS":{"path":"/tag/macos/","indexes":[161]},"General Protection":{"path":"/tag/general-protection/","indexes":[165]},"Github Workflow":{"path":"/tag/github-workflow/","indexes":[164]},"杂谈/编程杂谈":{"path":"/tag/%E6%9D%82%E8%B0%88%E7%BC%96%E7%A8%8B%E6%9D%82%E8%B0%88/","indexes":[162,163,167,168]},"面经":{"path":"/tag/%E9%9D%A2%E7%BB%8F/","indexes":[169]},"eBPF":{"path":"/tag/ebpf/","indexes":[156,158]},"性能测试":{"path":"/tag/%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/","indexes":[159]}}},"/en/":{"path":"/en/tag/","map":{}}}}'),Rp=JSON.parse(`["/notes/Compile-Principles/Chapter0-Introduce.html","/notes/Compile-Principles/Chapter1-Compiler-composition%20.html","/notes/Compile-Principles/Chapter2-Lexical-Analysis.html","/notes/Compile-Principles/Chapter3-Gramma-Analysis.html","/notes/Compile-Principles/Chapter4-Semantic-Analysis.html","/notes/Compile-Principles/Chapter5-Code-Generation.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E7%BC%96%E8%AF%91%E5%8E%9F%E7%90%86/Chapter0%20%E5%89%8D%E8%A8%80.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E7%BC%96%E8%AF%91%E5%8E%9F%E7%90%86/Chapter1%20%E7%BC%96%E8%AF%91%E5%99%A8%E7%BB%84%E6%88%90.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E7%BC%96%E8%AF%91%E5%8E%9F%E7%90%86/Chapter2%20%E8%AF%8D%E6%B3%95%E5%88%86%E6%9E%90.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E7%BC%96%E8%AF%91%E5%8E%9F%E7%90%86/Chapter3%20%E8%AF%AD%E6%B3%95%E5%88%86%E6%9E%90.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E7%BC%96%E8%AF%91%E5%8E%9F%E7%90%86/Chapter4%20%E8%AF%AD%E4%B9%89%E5%88%86%E6%9E%90.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E7%BC%96%E8%AF%91%E5%8E%9F%E7%90%86/Chapter5%20%E4%BB%A3%E7%A0%81%E7%94%9F%E6%88%90.html","/notes/Software-Testing-and-Maintenance/Chapter4-Software-Testing-Management.html","/notes/Software-Testing-and-Maintenance/Chapter5-Software-Maintenance.html","/notes/Software-Testing-and-Maintenance/Chapter3-Software-Testing-Process.html","/notes/Software-Testing-and-Maintenance/Chapter2-Software-Testing-Technology.html","/notes/Software-Testing-and-Maintenance/Chapter1-Basic-Concepts-of-Software-Testing.html","/notes/UML/Review-Quick-Note.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/UML/UML%E5%A4%8D%E4%B9%A0%E7%AE%80%E8%AE%B0.html","/notes/Database/Chapter15-Concurrency-Control.html","/notes/Database/Chapter16-Recovery-System.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E5%BA%93/Chapter15%20Concurrency%20Control.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E5%BA%93/Chapter16%20Recovery%20System.html","/notes/Database/Chapter11-Indexing-and-Hashing.html","/notes/Database/Chapter12-Query-Processing.html","/notes/Database/Chapter13-Query-Optimization.html","/notes/Database/Chapter14-Transactions.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E5%BA%93/Chapter11%20Indexing%20and%20Hashing.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E5%BA%93/Chapter12%20Query%20Processing.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E5%BA%93/Chapter13%20Query%20Optimization.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E5%BA%93/Chapter14%20Transactions.html","/notes/Database/Chapter10-Storage-and-File-Structure.html","/notes/Database/Chapter8-Relational-Database-Design.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E5%BA%93/Chapter10%20Storage%20and%20File%20Structure.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E5%BA%93/Chapter8%20Relational%20Database%20Design.html","/notes/Database/Chapter6-Formal-Relational-Query-Languages.html","/notes/Database/Chapter7-Entity-Relationship-Model.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E5%BA%93/Chapter6%20Formal%20Relational%20Query%20Languages.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E5%BA%93/Chapter7%20Entity-Relationship%20Model.html","/notes/Database/Chapter2-Introduction-to-Relational-Model.html","/notes/Database/Chapter3-Introduction-to-SQL.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E5%BA%93/Chapter2%20Introduction%20to%20Relational%20Model.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E5%BA%93/Chapter3%20Introduction%20to%20SQL.html","/notes/Software-Project-Management/Chapter13-Project-Stakeholder-Management.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/%E7%AC%AC13%E7%AB%A0%E9%A1%B9%E7%9B%AE%E5%B9%B2%E7%B3%BB%E4%BA%BA%E7%AE%A1%E7%90%86.html","/notes/Software-Project-Management/Chapter10-Project-Communication-Management.html","/notes/Software-Project-Management/Chapter11-Project-Risk-Management.html","/notes/Software-Project-Management/Chapter12-Project-Precurement-Management.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/%E7%AC%AC10%E7%AB%A0%E9%A1%B9%E7%9B%AE%E6%B2%9F%E9%80%9A%E7%AE%A1%E7%90%86.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/%E7%AC%AC11%E7%AB%A0%E9%A1%B9%E7%9B%AE%E9%A3%8E%E9%99%A9%E7%AE%A1%E7%90%86.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/%E7%AC%AC12%E7%AB%A0%E9%A1%B9%E7%9B%AE%E9%87%87%E8%B4%AD%E7%AE%A1%E7%90%86.html","/notes/Software-Project-Management/2019-Review-Notes.html","/notes/Software-Project-Management/Chapter7-Project-Cost-Management.html","/notes/Software-Project-Management/Chapter8-Project-Quality-Management.html","/notes/Software-Project-Management/Chapter9-Project-Resource-Management.html","/notes/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter15%E6%95%8F%E6%8D%B7%E9%A1%B9%E7%9B%AE%E4%B8%AD%E7%9A%84%E6%9E%B6%E6%9E%84.html","/notes/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter16%E6%9E%B6%E6%9E%84%E4%B8%8E%E9%9C%80%E6%B1%82.html","/notes/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter17%E8%AE%BE%E8%AE%A1%E6%9E%B6%E6%9E%84.html","/notes/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter19%E6%9E%B6%E6%9E%84%E5%AE%9E%E7%8E%B0%E4%B8%8E%E6%B5%8B%E8%AF%95.html","/notes/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chpater21%E6%9E%B6%E6%9E%84%E8%AF%84%E4%BC%B0.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter15%E6%95%8F%E6%8D%B7%E9%A1%B9%E7%9B%AE%E4%B8%AD%E7%9A%84%E6%9E%B6%E6%9E%84.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter16%E6%9E%B6%E6%9E%84%E4%B8%8E%E9%9C%80%E6%B1%82.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter17%E8%AE%BE%E8%AE%A1%E6%9E%B6%E6%9E%84.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter19%E6%9E%B6%E6%9E%84%E5%AE%9E%E7%8E%B0%E4%B8%8E%E6%B5%8B%E8%AF%95.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chpater21%E6%9E%B6%E6%9E%84%E8%AF%84%E4%BC%B0.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/2019_IT%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86_%E5%A4%8D%E4%B9%A0%E7%AC%94%E8%AE%B0.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/%E7%AC%AC7%E7%AB%A0%E9%A1%B9%E7%9B%AE%E6%88%90%E6%9C%AC%E7%AE%A1%E7%90%86.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/%E7%AC%AC8%E7%AB%A0%E9%A1%B9%E7%9B%AE%E8%B4%A8%E9%87%8F%E7%AE%A1%E7%90%86.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/%E7%AC%AC9%E7%AB%A0%E9%A1%B9%E7%9B%AE%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86.html","/notes/Software-Project-Management/Chapter6-Project-Schedule-Management.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/%E7%AC%AC6%E7%AB%A0%E9%A1%B9%E7%9B%AE%E8%BF%9B%E5%BA%A6%E7%AE%A1%E7%90%86.html","/notes/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter10%E5%8F%AF%E6%B5%8B%E8%AF%95%E6%80%A7.html","/notes/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter11%E6%98%93%E7%94%A8%E6%80%A7.html","/notes/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter12%E5%85%B6%E5%AE%83%E8%B4%A8%E9%87%8F%E5%B1%9E%E6%80%A7.html","/notes/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter13%E6%A8%A1%E5%BC%8F%E5%92%8C%E7%AD%96%E7%95%A5.html","/notes/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter14%E8%B4%A8%E9%87%8F%E5%B1%9E%E6%80%A7%E5%BB%BA%E6%A8%A1%E4%B8%8E%E5%88%86%E6%9E%90.html","/notes/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter9%E5%AE%89%E5%85%A8%E6%80%A7.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter10%E5%8F%AF%E6%B5%8B%E8%AF%95%E6%80%A7.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter11%E6%98%93%E7%94%A8%E6%80%A7.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter12%E5%85%B6%E5%AE%83%E8%B4%A8%E9%87%8F%E5%B1%9E%E6%80%A7.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter13%E6%A8%A1%E5%BC%8F%E5%92%8C%E7%AD%96%E7%95%A5.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter14%E8%B4%A8%E9%87%8F%E5%B1%9E%E6%80%A7%E5%BB%BA%E6%A8%A1%E4%B8%8E%E5%88%86%E6%9E%90.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter9%E5%AE%89%E5%85%A8%E6%80%A7.html","/notes/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter6%E4%BA%92%E6%93%8D%E4%BD%9C%E6%80%A7.html","/notes/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter7%E5%8F%AF%E4%BF%AE%E6%94%B9%E6%80%A7.html","/notes/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter8%E6%80%A7%E8%83%BD.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter6%E4%BA%92%E6%93%8D%E4%BD%9C%E6%80%A7.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter7%E5%8F%AF%E4%BF%AE%E6%94%B9%E6%80%A7.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter8%E6%80%A7%E8%83%BD.html","/notes/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter1%E4%BB%80%E4%B9%88%E6%98%AF%E8%BD%AF%E4%BB%B6%E6%9E%B6%E6%9E%84.html","/notes/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter2%E4%B8%BA%E4%BB%80%
2946E4%B9%88%E8%BD%AF%E4%BB%B6%E6%9E%B6%E6%9E%84%E9%87%8D%E8%A6%81.html","/notes/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter4%E7%90%86%E8%A7%A3%E8%B4%A8%E9%87%8F%E5%B1%9E%E6%80%A7.html","/notes/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter5%E5%8F%AF%E7%94%A8%E6%80%A7.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter1%E4%BB%80%E4%B9%88%E6%98%AF%E8%BD%AF%E4%BB%B6%E6%9E%B6%E6%9E%84.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter2%E4%B8%BA%E4%BB%80%E4%B9%88%E8%BD%AF%E4%BB%B6%E6%9E%B6%E6%9E%84%E9%87%8D%E8%A6%81.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter4%E7%90%86%E8%A7%A3%E8%B4%A8%E9%87%8F%E5%B1%9E%E6%80%A7.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter5%E5%8F%AF%E7%94%A8%E6%80%A7.html","/notes/Software-Project-Management/Chapter5-Project-Scope-Management.html","/notes/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter0%E7%BB%AA%E8%AE%BA.html","/notes/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/%E5%A4%8D%E4%B9%A0%E6%8F%90%E7%BA%B2.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/Chapter0%E7%BB%AA%E8%AE%BA.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/%E5%A4%8D%E4%B9%A0%E6%8F%90%E7%BA%B2.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/%E7%AC%AC5%E7%AB%A0%E9%A1%B9%E7%9B%AE%E8%8C%83%E5%9B%B4%E7%AE%A1%E7%90%86.html","/notes/Software-Project-Management/Chapter3-Project-Management-Process-group.html","/notes/Software-Project-Management/Chapter4-Project-Integration-Management.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/%E7%AC%AC3%E7%AB%A0%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86%E8%BF%87%E7%A8%8B%E7%BB%84.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/%E7%AC%AC4%E7%AB%A0%E9%A1%B9%E7%9B%AE%E6%95%B4%E5%90%88%E7%AE%A1%E7%90%86.html","/notes/Software-Project-Management/Chapter2-Project-Management-and-IT-Environment.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/%E7%AC%AC2%E7%AB%A0%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86%E4%B8%8EIT%E7%8E%AF%E5%A2%83.html","/notes/Software-Project-Management/Chapter1-Indroduction.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%BD%AF%E4%BB%B6%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/%E7%AC%AC1%E7%AB%A0%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86%E6%A6%82%E8%BF%B0.html","/notes/College-Physics/Electromagnetic-Formula.html","/notes/Database/Chapter1-Introduction.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E5%A4%A7%E7%89%A9/%E7%94%B5%E7%A3%81%E5%AD%A6%E5%85%AC%E5%BC%8F.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E5%BA%93/Chapter1%20Introduction.html","/notes/Computer-Network/Chapter4-Net-Layer.html","/notes/Computer-Network/Chapter5-Link-Layer.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/Chapter4-Net-Layer.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/Chapter5-Link-Layer.html","/notes/Computer-Network/Chapter3-Transport-Layer.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/Chapter3-Transport-Layer.html","/notes/Computer-Network/Chapter1-Internet-And-Ethernet.html","/notes/Computer-Network/Chapter2-Application-Layer.html","/notes/Electrical-Engineering/Review-Note.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/Chapter1-Internet-And-Ethernet.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/Chapter2-Application-Layer.html","/notes/Operating-System/Chapter5-IO.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/Chapter5-IO.html","/notes/Operating-System/Chapter4-File-System.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/Chapter4-File-System.html","/notes/Operating-System/Chapter3-Memory-Management.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/Chapter3-Memory-Management.html","/notes/Operating-System/Chapter6-Deadlocks.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/Chapter6-Deadlocks.html","/notes/Operating-System/Chapter2-Processes-and-Threads.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/Chapter2-Processes-and-Threads.html","/notes/Operating-System/Chapter1-Introdction.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/Chapter1-Introdction.html","/notes/College-Physics/Formula-Derivation/Electrostatic-energy-of-a-solid-charged-sphere.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E5%A4%A7%E7%89%A9/%E5%85%B7%E4%BD%93%E6%8E%A8%E5%AF%BC/%E5%AE%9E%E5%BF%83%E5%B8%A6%E7%82%B9%E7%90%83%E4%BD%93%E9%9D%99%E7%94%B5%E8%83%BD%E7%9A%84%E6%8E%A8%E5%AF%BC.html","/posts/DragonOS/DragonOS%E6%8B%9B%E6%96%B0%E4%BB%BB%E5%8A%A1.html","/posts/Rust/Inlinable-dyn-extension-traits.html","/posts/backend/gRPC-introduction.html","/posts/Rust/Type-erase-via-trait.html","/posts/%E5%BE%AE%E4%BF%A1/%E5%BE%AE%E4%BF%A1%E5%BA%95%E5%B1%82%E8%A7%A3%E6%9E%90.html","/posts/Linux%E5%86%85%E6%A0%B8/vscode%20qemu%E5%BC%80%E5%8F%91Linux%E5%86%85%E6%A0%B8.html","/posts/Linux%E5%86%85%E6%A0%B8/NUMA%20Balance%E5%AE%9E%E7%8E%B0%E6%B5%85%E6%9E%90.html","/posts/Rust/Common-rust-lifetime-misconceptions.html","/posts/Linux%E5%86%85%E6%A0%B8/%E5%86%85%E6%A0%B8%E5%88%86%E6%9E%90/LinuxKernelMap.html","/posts/rcc%E7%BC%96%E8%AF%91%E5%99%A8/Chapter0%E5%89%8D%E8%A8%80.html","/posts/rcc%E7%BC%96%E8%AF%91%E5%99%A8/Chapter1%E8%AF%8D%E6%B3%95%E5%88%86%E6%9E%90%E5%99%A8%E4%B9%8BChumsky.html","/posts/rcc%E7%BC%96%E8%AF%91%E5%99%A8/HelloWorld.html","/posts/Linux%E5%86%85%E6%A0%B8/Patch%E8%A7%A3%E8%AF%BB/LWN%E9%92%88%E5%AF%B9%E5%A4%9A%E5%B1%82%E5%86%85%E5%AD%98%E7%B3%BB%E7%BB%9F%E9%87%8D%E6%96%B0%E8%BF%9B%E8%A1%8CNUMA%E5%B9%B3%E8%A1%A1.html","/posts/Linux%E5%86%85%E6%A0%B8/NUMA%20Balancing.html","/posts/%E6%9D%82%E8%B0%88/Debug%E6%9D%82%E8%B0%88/edition%E8%AE%BE%E7%BD%AE%E5%BC%95%E8%B5%B7%E7%9A%84rust%E7%BC%96%E8%AF%91%E5%99%A8%E6%8A%A5%E9%94%99.html","/posts/cpp/Application-of-decltype-auto.html","/posts/Linux%E5%86%85%E6%A0%B8/%E5%86%85%E6%A0%B8%E5%BC%80%E5%8F%91/eBPF%E5%BC%80%E5%8F%91/eBPF%E8%BF%9B%E9%98%B6.html","/posts/Linux%E5%86%85%E6%A0%B8/%E5%86%85%E6%A0%B8%E5%BC%80%E5%8F%91/Ubuntu%E7%BC%96%E8%AF%91%E5%AE%89%E8%A3%85%E5%86%85%E6%A0%B8.html","/posts/Linux%E5%86%85%E6%A0%B8/%E5%86%85%E6%A0%B8%E5%BC%80%E5%8F%91/eBPF%E5%BC%80%E5%8F%91/eBPF%E5%BC%80%E5%8F%91%E5%85%A5%E9%97%A8.html","/posts/Linux%E5%86%85%E6%A0%B8/%E5%86%85%E6%A0%B8%E5%BC%80%E5%8F%91/%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/parsec3.0%E4%BB%8B%E7%BB%8D%E5%92%8C%E5%AE%89%E8%A3%85.html","/posts/%E6%9D%82%E8%B0%88/Debug%E6%9D%82%E8%B0%88/SurfaceView%E5%BC%82%E5%B8%B8%E9%87%8A%E6%94%BE.html","/posts/%E6%9D%82%E8%B0%88/Debug%E6%9D%82%E8%B0%88/%E8%A7%A3%E5%86%B3MacOS%E4%B8%AD%E6%89%BE%E4%B8%8D%E5%88%B0%E5%A4%B4%E6%96%87%E4%BB%B6%E7%9A%84%E9%97%AE%E9%A2%98.html","/posts/%E6%9D%82%E8%B0%88/%E7%BC%96%E7%A8%8B%E6%9D%82%E8%B0%88/%E5%9F%BA%E4%BA%8ENinja%E7%9A%84%E4%BB%A3%E7%A0%81Intellisense%E5%AE%9E%E8%B7%B5.html","/posts/%E6%9D%82%E8%B0%88/%E7%BC%96%E7%A8%8B%E6%9D%82%E8%B0%88/%E8%A7%A3%E5%86%B3%E5%9C%A8VSCode%E9%87%8C%E5%88%B7Leetcode%E7%9A%84%E9%87%8D%E5%AE%9A%E4%B9%89%E9%97%AE%E9%A2%98.html","/posts/%E6%9D%82%E8%B0%88/%E7%BC%96%E7%A8%8B%E6%9D%82%E8%B0%88/Github%E4%B8%AD%E9%85%8D%E7%BD%AECargo%E9%A1%B9%E7%9B%AE%E7%9A%84Workflow.html","/posts/%E6%9D%82%E8%B0%88/Debug%E6%9D%82%E8%B0%88/%E8%AE%B0%E4%B8%80%E6%AC%A1%20GP%20Debug%20%E
29467%9A%84%E5%BF%83%E8%B7%AF%E5%8E%86%E7%A8%8B.html","/posts/%E6%9D%82%E8%B0%88/Debug%E6%9D%82%E8%B0%88/could%20not%20dial%20endpoint%20'orderer-api.127-0-0-1.nip.io.html","/posts/%E6%9D%82%E8%B0%88/%E7%BC%96%E7%A8%8B%E6%9D%82%E8%B0%88/%E9%9C%87%E6%83%8A!1%E7%AD%89%E4%BA%8E0.html","/posts/%E6%9D%82%E8%B0%88/%E7%BC%96%E7%A8%8B%E6%9D%82%E8%B0%88/%E9%AB%98%E7%BA%A7%E8%AF%AD%E8%A8%80%E7%9A%84%E7%BC%96%E8%AF%91-%E9%93%BE%E6%8E%A5%E5%8F%8A%E8%A3%85%E8%BD%BD%E8%BF%87%E7%A8%8B%E4%BB%8B%E7%BB%8D.html","/posts/%E6%9D%82%E8%B0%88/%E9%9D%A2%E7%BB%8F/%E8%85%BE%E8%AE%AFWXG%E6%97%A5%E5%B8%B8%E5%AE%9E%E4%B9%A0%E9%9D%A2%E7%BB%8F.html","/notes/Software-Testing-and-Maintenance/","/notes/Electrical-Engineering/","/notes/","/posts/","/notes/College-Physics/","/notes/Compile-Principles/","/notes/Computer-Network/","/notes/Database/","/notes/Operating-System/","/notes/Software-Project-Management/","/posts/backend/","/posts/cpp/","/notes/College-Physics/Formula-Derivation/","/notes/Computer-Network/Computer-Network-7th-Edition-Exercises-Answers.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E4%B9%A0%E9%A2%98%E7%AD%94%E6%A1%88.html","/posts/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E7%94%B5%E5%B7%A5/%E7%94%B5%E5%B7%A5%E5%A4%8D%E4%B9%A0%E7%AC%94%E8%AE%B0.html","/intro.html","/en/intro.html"]`),Sm=JSON.parse('{"article":{"/":{"path":"/article/","indexes":[141,142,143,144,145,146,147,148,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,170,16,171,172,173,174,175,176,177,178,179,180,181,182,160,161,162,140,169,163,183,184,185,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,156,157,154,158,159,164,149,150,151,111,112,152,113,114,155,165,166,153,167,168,186,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139]},"/en/":{"path":"/en/article/","indexes":[187]}},"star":{"/":{"path":"/star/","indexes":[141,143,145,146,147,148]},"/en/":{"path":"/en/star/","indexes":[]}},"timeline":{"/":{"path":"/timeline/","indexes":[141,142,12,13,14,15,170,16,171,172,173,174,175,176,177,178,179,180,181,182,143,160,161,162,140,144,169,163,183,184,185,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,156,157,154,158,159,164,149,150,151,111,112,152,113,114,145,146,147,148,155,165,166,153,167,168,186,0,1,2,3,4,5,6,7,8,9,10,11,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139]},"/en/":{"path":"/en/timeline/","indexes":[187]}}}'),za=ae(Fm);Kt(za);const Lp=e=>{const{frontmatter:t,page:n,routeLocale:i}=gn();return b(()=>{const l=e??t.value.blog?.key??"";if(!l)return console.warn("useBlogCategory: key not found"),{path:"/",map:{}};if(!(l in za.value))throw new Error(`useBlogCategory: key ${l} is invalid`);const a=za.value[l][i.value],r={path:a.path,map:{}};for(const o in a.map){const c=a.map[o];r.map[o]={path:c.path,items:[]};for(const d of c.indexes){const{path:u,meta:p}=At(Rp[d]);r.map[o].items.push({path:u,info:p})}n.value.path===c.path&&(r.currentItems=r.map[o].items)}return r})},Ua=ae(Sm);Kt(Ua);const Ml=e=>{const{frontmatter:t,routeLocale:n}=gn();return b(()=>{const i=e??t.value.blog?.key??"";if(!i)return console.warn("useBlogType: key not found"),{path:"/",items:[]};if(!(i in Ua.value))throw new Error(`useBlogType: key ${e} is invalid`);const l=Ua.value[i][n.value],a={path:l.path,items:[]};for(const r of l.indexes){const{path:o,meta:c}=At(Rp[r]);a.items.push({path:o,info:c})}return a})},Pm={BiliBili:'<svg xmlns="http://www.w3.org/2000/svg" class="vp-social-media-icon bilibili-icon" viewBox="0 0 1024 1024"><circle cx="512" cy="512" r="512" fill="#1296db"/><path fill="#fff" d="M745.363 177.725a47 47 0 0 1 0 66.3L702.5 286.85h44A141 141 0 0 1 887 427.512v281.25a141 141 0 0 1-141 140.626H277.25A141 141 0 0 1 137 708.763v-281.25a141 141 0 0 1 141-141h43.725l-42.788-42.825a47 47 0 1 1 66.263-66.3l99.45 99.45c2.963 2.962 5.438 6.187 7.425 9.637h120.487c1.988-3.45 4.5-6.75 7.463-9.675l99.413-99.45a47 47 0 0 1 66.3 0zm1.012 203.25h-468.75a47 47 0 0 0-46.763 43.388l-.112 3.525v281.25c0 24.712 19.125 44.962 43.387 46.724l3.488.15h468.75a47 47 0 0 0 46.763-43.387l.112-3.487v-281.25c0-26-21-47-47-46.876zm-375 93.75c26 0 47 21 47 47v47a47 47 0 1 1-93.75 0V521.6c0-26 21-47 47-47zm281.25 0c26 0 47 21 47 47v47a47 47 0 1 1-93.75 0V521.6c0-26 21-47 47-47z"/></svg>',Email:'<svg xmlns="http://www.w3.org/2000/svg" class="vp-social-media-icon email-icon" viewB
2946ox="0 0 1024 1024"><circle cx="512" cy="512" r="512" fill="#1384FF"/><path fill="#fff" d="M270.077 286.233H751.99c32.933 0 59.86 24.855 60.274 55.51l-301.023 157L210.217 341.88c.207-30.723 26.927-55.717 59.86-55.717zm-59.929 115.714-.276 277.756c0 30.931 27.134 56.2 60.205 56.2H751.99c33.14 0 60.274-25.269 60.274-56.2V401.81L518.283 551.492a15.88 15.88 0 0 1-14.43 0L210.148 401.947z"/></svg>',GitHub:'<svg xmlns="http://www.w3.org/2000/svg" class="vp-social-media-icon github-icon" viewBox="0 0 1024 1024"><circle cx="512" cy="512" r="512" fill="#171515"/><path fill="#fff" d="M509.423 146.442c-200.317 0-362.756 162.42-362.756 362.8 0 160.266 103.936 296.24 248.109 344.217 18.139 3.327 24.76-7.872 24.76-17.486 0-8.613-.313-31.427-.49-61.702-100.912 21.923-122.205-48.63-122.205-48.63-16.495-41.91-40.28-53.067-40.28-53.067-32.937-22.51 2.492-22.053 2.492-22.053 36.407 2.566 55.568 37.386 55.568 37.386 32.362 55.438 84.907 39.43 105.58 30.143 3.296-23.444 12.667-39.43 23.032-48.498-80.557-9.156-165.246-40.28-165.246-179.297 0-39.604 14.135-71.988 37.342-97.348-3.731-9.178-16.18-46.063 3.556-96.009 0 0 30.46-9.754 99.76 37.19 28.937-8.048 59.97-12.071 90.823-12.211 30.807.14 61.843 4.165 90.822 12.21 69.26-46.944 99.663-37.189 99.663-37.189 19.792 49.946 7.34 86.831 3.61 96.01 23.25 25.359 37.29 57.742 37.29 97.347 0 139.366-84.82 170.033-165.637 179.013 13.026 11.2 24.628 33.342 24.628 67.182 0 48.498-.445 87.627-.445 99.521 0 9.702 6.535 20.988 24.945 17.444 144.03-48.067 247.881-183.95 247.881-344.175 0-200.378-162.442-362.798-362.802-362.798z"/></svg>',Gmail:'<svg xmlns="http://www.w3.org/2000/svg" class="vp-social-media-icon gmail-icon" viewBox="0 0 1024 1024"><circle cx="512" cy="512" r="512" fill="#DB4437"/><path fill="#E67C73" d="M277.48 285.567h465.767v441.362H277.48V285.567z"/><path fill="#FFF" d="M282.543 285.567h-10.645c-25.962 0-47.122 21.808-47.122 48.705v343.952c0 26.897 21.08 48.705 47.122 48.705h24.976V407.954l213.49 169.95 213.489-169.95V726.93h24.975c26.04 0 47.123-21.809 47.123-48.705V334.272c0-26.897-21.134-48.705-47.123-48.705h-10.644L510.364 480.44 282.542 285.567z"/></svg>',Steam:'<svg xmlns="http://www.w3.org/2000/svg" class="vp-social-media-icon steam-icon" viewBox="0 0 1024 1024"><circle cx="512" cy="512" r="488" fill="#fff"/><path fill="#13227a" d="M1008 512c0 274-222.4 496-496.8 496-227.6 0-419.2-152.6-478-360.8l190.4 78.6c12.8 64.2 69.8 112.8 137.8 112.8 78.4 0 143.8-64.8 140.4-147l169-120.4c104.2 2.6 191.6-81.8 191.6-187 0-103.2-84-187-187.4-187s-187.4 84-187.4 187v2.4L369.2 558c-31-1.8-61.4 6.8-87 24.2L16 472.2C36.4 216.8 250.2 16 511.2 16 785.6 16 1008 238 1008 512zM327.4 768.6l-61-25.2a105.58 105.58 0 0 0 54.4 51.6c53.8 22.4 115.6-3.2 138-56.8 10.8-26 11-54.6.2-80.6-10.8-26-31-46.4-57-57.2-25.8-10.8-53.4-10.4-77.8-1.2l63 26c39.6 16.4 58.4 61.8 41.8 101.4-16.6 39.8-62 58.4-101.6 42zM675 508.8c-68.8 0-124.8-56-124.8-124.6s56-124.6 124.8-124.6 124.8 56 124.8 124.6S744 508.8 675 508.8zm.2-31.2c51.8 0 93.8-42 93.8-93.6 0-51.8-42-93.6-93.8-93.6s-93.8 42-93.8 93.6c.2 51.6 42.2 93.6 93.8 93.6z"/></svg>',Zhihu:'<svg xmlns="http://www.w3.org/2000/svg" class="vp-social-media-icon zhihu-icon" viewBox="0 0 1024 1024"><circle cx="512" cy="512" r="512" fill="#006CE2"/><path fill="#fff" d="M513.65 491.261H411.551c1.615-16.154 5.815-60.095 5.815-84.973 0-24.88-.323-60.742-.323-60.742h102.744V329.39c0-21.647-9.37-31.34-17.124-31.34h-178.67s5.169-17.77 10.015-36.186c4.846-18.417 15.832-44.264 15.832-44.264-63.003 4.2-67.958 50.941-81.743 92.729-13.787 41.785-24.556 62.356-44.586 107.912 27.786 0 55.249-13.57 66.879-32.309 11.631-18.74 16.908-40.71 16.908-40.71h62.035v59.019c0 21.107-3.878 87.45-3.878 87.45H254.742c-19.386 0-29.724 48.894-29.724 48.894h133.76c-8.4 75.82-26.493 106.191-51.91 152.716-25.418 46.525-92.728 99.406-92.728 99.406 41.033 11.63 86.589-3.555 105.974-21.972 19.386-18.417 35.863-49.756 47.817-72.838 11.954-23.081 21.972-65.124 21.972-65.124L498.462 766.86s4.846-24.233 6.461-39.418c1.616-15.186-.755-26.385-4.63-35.433-3.878-9.046-15.509-21.54-31.018-39.634-15.507-18.094-48.034-52.879-48.034-52.879s-15.832 11.63-28.108 21.001c9.046-21.97 16.262-79.695 16.262-79.695h122.343v-20.249c.003-17.66-7.319-29.29-18.089-29.29zm287.337-200.747h-234.35a4.308 4.308 0 0 0-4.309 4.308v435.099a4.308 4.308 0 0 0 4.308 4.308h40.226l14.7 50.402 81.096-50.402h98.328a4.308 4.308 0 0 0 4.308-4.308v-435.1a4.308 4.308 0 0 0-4.308-4.308zM755.97 684.47h-52.343l-61.548 39.095-10.823-39.095h-18.738V338.116H755.97v346.355z"/></svg>'};var Rm=[];const Hi=()=>{const{theme:e,themeLocale:t}=Pe();return b(()=>({...e.value.blog,...t.value.blog}))};var Op=I({name:"SocialMedias",setup(){const e=Hi(),t=tt(),n=b(()=>Rn(e.value.medias??{}).map(([i,l])=>typeof l=="string"?{name:i,icon:Pm[i],link:l}:{name:i,...l}));return()=>n.value.length?s("div",{class:"vp-social-medias"},n.value.map(({name:i,icon:l,link:a})=>s("a",{class:"vp-social-media",href:a,rel:"noopener noreferrer",target:"_blank","aria-label":i||"",...t.value?{}:{"data-balloon-pos":"up"},innerHTML:li(l)?`<img class="vp-social-media-icon ${i}-icon" src="${l}">`:l}))):null}});const Ip=Symbol(""),zi=()=>{const e=ve(Ip);if(!e)throw new Error("useArticles() is called without provider.");return e},Lm=()=>{const e=Ml("article");Ct(Ip,e)},Zt=()=>{const e=Pt();return b(()=>e.value.blogLocales)},Mp=Symbol.for("categoryMap"),Ui=()=>{const e=ve(Mp);if(!e)throw new Error("useCategoryMap() is called without provider.");return e},Om=()=>{const e=Lp("category");Ct(Mp,e)},Vp=Symbol.for("tagMap"),Wi=()=>{const e=ve(Vp);if(!e)throw new Error("useTagMap() is called without provider.");return e},Im=()=>{const e=Lp("tag");Ct(Vp,e)},Np=Symbol(""),Ir=()=>{const e=ve(Np);if(!e)throw new Error("useTimeline() is called without provider.");return e},Mm=()=>{const e=Ml("timeline"),t=Sl(),n=b(()=>{const i=[];
2946return e.value.items.forEach(({info:l,path:a})=>{const r=br(l.date);if(r){const o=r.getFullYear();i[0]?.year!==o&&i.unshift({year:o,items:[]}),i[0].items.push({date:r.toLocaleDateString(t.value,{month:"numeric",day:"numeric"}),info:l,path:a})}}),{...e.value,config:i.reverse()}});Ct(Np,n)};var Mr=I({name:"BloggerInfo",slots:Object,setup(e,{slots:t}){const n=Zt(),i=Hi(),{siteLocale:l,themeLocale:a}=Pe(),r=zi(),o=Ui(),c=Wi(),d=Ir(),u=Xt(),p=b(()=>({name:i.value.name??xi(a.value.author)[0]?.name??l.value.title,avatar:i.value.avatar??a.value.logo??null,description:i.value.description??null})),h=b(()=>i.value.intro);return()=>{const{article:E,category:v,tag:B,timeline:k}=n.value,D=[[r.value.path,r.value.items.length,E],[o.value.path,Gt(o.value.map).length,v],[c.value.path,Gt(c.value.map).length,B],[d.value.path,d.value.items.length,k]];return s("div",{class:"vp-blogger-info",vocab:"https://schema.org/",typeof:"Person"},t.bloggerInfo?.(p.value)??[s("div",{class:"vp-blogger",...h.value?{"aria-label":n.value.intro,"data-balloon-pos":"down",role:"link",onClick:()=>{u(h.value)}}:{}},[p.value.avatar?s("img",{class:"vp-blogger-avatar",src:Ce(p.value.avatar),property:"image",alt:"Blogger Avatar",loading:"lazy"}):null,p.value.name?s("div",{class:"vp-blogger-name",property:"name"},p.value.name):null,p.value.description?s("div",{class:"vp-blogger-description",innerHTML:p.value.description}):null,h.value?s("meta",{property:"url",content:Ce(h.value)}):null]),s("div",{class:"vp-blog-counts"},D.map(([y,m,_])=>s(Ve,{class:"vp-blog-count",to:y},()=>[s("div",{class:"count"},m),s("div",_)]))),s(Op)])}}});const $p=Symbol(""),Vr=()=>{const e=ve($p);if(!e)throw new Error("useStars() is called without provider.");return e},Vm=()=>{const e=Ml("star");Ct($p,e)},Nr=()=>s(Ae,{name:"category"},()=>s("path",{d:"M148.41 106.992h282.176c22.263 0 40.31 18.048 40.31 40.31V429.48c0 22.263-18.047 40.31-40.31 40.31H148.41c-22.263 0-40.311-18.047-40.311-40.31V147.302c0-22.263 18.048-40.31 40.311-40.31zM147.556 553.478H429.73c22.263 0 40.311 18.048 40.311 40.31v282.176c0 22.263-18.048 40.312-40.31 40.312H147.555c-22.263 0-40.311-18.049-40.311-40.312V593.79c0-22.263 18.048-40.311 40.31-40.311zM593.927 106.992h282.176c22.263 0 40.31 18.048 40.31 40.31V429.48c0 22.263-18.047 40.31-40.31 40.31H593.927c-22.263 0-40.311-18.047-40.311-40.31V147.302c0-22.263 18.048-40.31 40.31-40.31zM730.22 920.502H623.926c-40.925 0-74.22-33.388-74.22-74.425V623.992c0-41.038 33.387-74.424 74.425-74.424h222.085c41.038 0 74.424 33.226 74.424 74.067v114.233c0 10.244-8.304 18.548-18.547 18.548s-18.548-8.304-18.548-18.548V623.635c0-20.388-16.746-36.974-37.33-36.974H624.13c-20.585 0-37.331 16.747-37.331 37.33v222.086c0 20.585 16.654 37.331 37.126 37.331H730.22c10.243 0 18.547 8.304 18.547 18.547 0 10.244-8.304 18.547-18.547 18.547z"}));Nr.displayName="CategoryIcon";const $r=()=>s(Ae,{name:"tag"},()=>s("path",{d:"M939.902 458.563L910.17 144.567c-1.507-16.272-14.465-29.13-30.737-30.737L565.438 84.098h-.402c-3.215 0-5.726 1.005-7.634 2.913l-470.39 470.39a10.004 10.004 0 000 14.164l365.423 365.424c1.909 1.908 4.42 2.913 7.132 2.913s5.223-1.005 7.132-2.913l470.39-470.39c2.01-2.11 3.014-5.023 2.813-8.036zm-240.067-72.121c-35.458 0-64.286-28.828-64.286-64.286s28.828-64.285 64.286-64.285 64.286 28.828 64.286 64.285-28.829 64.286-64.286 64.286z"}));$r.displayName="TagIcon";const jr=()=>s(Ae,{name:"timeline"},()=>s("path",{d:"M511.997 70.568c-243.797 0-441.429 197.633-441.429 441.435 0 243.797 197.632 441.429 441.43 441.429S953.431 755.8 953.431 512.002c0-243.796-197.637-441.434-441.435-441.434zm150.158 609.093-15.605 15.61c-8.621 8.615-22.596 8.615-31.215 0L472.197 552.126c-4.95-4.944-4.34-14.888-4.34-24.677V247.14c0-12.19 9.882-22.07 22.07-22.07h22.07c12.19 0 22.07 9.882 22.07 22.07v273.218l128.088 128.088c8.62 8.62 8.62 22.595 0 31.215zm0 0"}));jr.displayName="TimelineIcon";const jp=()=>s(Ae,{name:"slides"},()=>s("path",{d:"M896 170.667v426.666a85.333 85.333 0 0 1-85.333 85.334h-256v61.184l192.597 115.584-43.861 73.13-148.736-89.173v95.275h-85.334v-95.318l-148.736 89.216-43.861-73.13 192.597-115.627v-61.141h-256A85.333 85.333 0 0 1 128 597.333V170.667H85.333V85.333h853.334v85.334H896zm-682.667 0v426.666h597.334V170.667H213.333zM426.667 512h-85.334V341.333h85.334V512zm128 0h-85.334V256h85.334v256zm128 0h-85.334V384h85.334v128z"}));jp.displayName="SlideIcon";const Hp=()=>s(Ae,{name:"sticky"},()=>[s("path",{d:"m381.3 733.8l-161.9 118c-5.9 4.5-13.2 6.6-20.1 6.6-8.7 0-17.7-3.4-24.3-10-12.2-12.2-13.9-31.3-3.5-45.2l144.5-195.5-113.6-112.9c-11.1-11.1-13.2-28.4-5.5-42 5.5-8.7 52.1-76.4 155.5-51 1.8 0.3 3.5 0.3 5.6 0.7 4.2 0.3 9 0.7 14.2 1.7 21.9 3.5 60.8-13.9 94.5-42.7 32.3-27.5 53.1-59.4 53.1-81.6 0-5.2 0-10.8-0.3-16-0.7-20.8-2.1-52.8 21.5-76.4 28.1-28.1 72.9-30.6 103.9-5.2 0.6 0.3 1 1 1.7 1.7 16.7 16.3 187.5 187.2 189.3 188.9 14.5 14.6 22.9 34.4 22.9 55.3 0 20.8-8 40.2-22.9 54.8-23.7 23.6-56 22.6-77.1 21.6-4.9 0-10.5-0.4-15.7-0.4-20.8 0-45.8 14.6-70.5 41.3-34.3 37.5-55.5 85.8-53.8 10
29467.7 0.7 6.9 2.1 19.1 2.4 20.8 25 101.4-42.7 147.6-50.7 152.8-13.9 8.4-31.6 6.3-42.7-4.8l-112.1-112.2z"})]);Hp.displayName="StickyIcon";const Hr=()=>s(Ae,{name:"article"},()=>s("path",{d:"M853.333 938.667H170.667A42.667 42.667 0 0 1 128 896V128a42.667 42.667 0 0 1 42.667-42.667h682.666A42.667 42.667 0 0 1 896 128v768a42.667 42.667 0 0 1-42.667 42.667zm-42.666-85.334V170.667H213.333v682.666h597.334zM298.667 256h170.666v170.667H298.667V256zm0 256h426.666v85.333H298.667V512zm0 170.667h426.666V768H298.667v-85.333zm256-384h170.666V384H554.667v-85.333z"}));Hr.displayName="ArticleIcon";const Nm=e=>{const t=Pt();return b(()=>{const{["author"]:n}=e.value;return n?xi(n):n===!1?[]:xi(t.value.author,!1)})},$m=e=>{const t=Ui();return b(()=>Zu(e.value.category).map(n=>({name:n,path:t.value.map[n].path})))},jm=e=>{const t=Wi();return b(()=>ep(e.value.tag).map(n=>({name:n,path:t.value.map[n].path})))},Hm=e=>b(()=>{const{["date"]:t}=e.value;return br(t)}),zm=e=>{const t=ii(e,"info"),n=Hi(),i=Nm(t),l=$m(t),a=jm(t),r=Hm(t),o=Uu(),c=b(()=>({author:i.value,category:l.value,date:r.value,tag:a.value,isOriginal:t.value.isOriginal??!1,readingTime:t.value.readingTime??null,readingTimeLocale:t.value.readingTime&&o.value?zu(t.value.readingTime,o.value):null,pageview:e.path})),d=b(()=>n.value.articleInfo??null);return{info:c,items:d}};var Um=I({name:"ArticleItem",props:{info:{type:Object,required:!0},path:{type:String,required:!0}},slots:Object,setup(e,{slots:t}){const n=ii(e,"info"),{info:i,items:l}=zm(e),a=Yt();return()=>{const{title:r,type:o,isEncrypted:c=!1,cover:d=null,excerpt:u=null,sticky:p}=n.value,h=i.value;return s("div",{class:"vp-article-wrapper",onClick:E=>{E.target?.matches("summary")||(E.preventDefault(),a.push(e.path))}},s("article",{class:"vp-article-item",vocab:"https://schema.org/",typeof:"Article"},[t.articleCover?.({cover:d})??(d?[s("img",{class:"vp-article-cover",src:Ce(d),alt:"",loading:"lazy"}),s("meta",{property:"image",content:Ce(d)})]:[]),p?s(Hp):null,s(Ve,{to:e.path},()=>t.articleTitle?.({title:r,isEncrypted:c,type:o})??s("header",{class:"vp-article-title"},[c?s(Pp):null,o==="slide"?s(jp):null,s("span",{property:"headline"},r)])),t.articleExcerpt?.({excerpt:u})??(u?s("div",{class:"vp-article-excerpt",innerHTML:u}):null),s("hr",{class:"vp-article-hr"}),t.articleInfo?.(h)??s(cp,{info:h,items:l.value,onClick:E=>{E.stopPropagation()}})]))}}});const Wm='<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M64 512a448 448 0 1 0 896 0 448 448 0 1 0-896 0Z" fill="#FA5151"/><path d="m557.3 512 113.1-113.1c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L512 466.7 398.9 353.6c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L466.7 512 353.6 625.1c-12.5 12.5-12.5 32.8 0 45.3 6.2 6.2 14.4 9.4 22.6 9.4s16.4-3.1 22.6-9.4L512 557.3l113.1 113.1c6.2 6.2 14.4 9.4 22.6 9.4s16.4-3.1 22.6-9.4c12.5-12.5 12.5-32.8 0-45.3L557.3 512z" fill="#FFF"/></svg>';var Gm=I({name:"Pagination",props:{total:{type:Number,default:10},perPage:{type:Number,default:10},current:{type:Number,default:1}},emits:["updateCurrentPage"],setup(e,{emit:t}){const n=new kr,i=Pt(),l=se(""),a=b(()=>i.value.paginationLocales),r=b(()=>Math.ceil(e.total/e.perPage)),o=b(()=>!!r.value&&r.value!==1),c=b(()=>r.value<7?!1:e.current>4),d=b(()=>r.value<7?!1:e.current<r.value-3),u=b(()=>{const{current:E}=e;let v=1,B=r.value;const k=[];r.value>=7&&(E<=4&&E<r.value-3?(v=1,B=5):E>4&&E>=r.value-3?(B=r.value,v=r.value-4):r.value>7&&(v=E-2,B=E+2));for(let D=v;D<=B;D++)k.push(D);return k}),p=E=>{t("updateCurrentPage",E)},h=E=>{const v=parseInt(E,10);v<=r.value&&v>0?p(v):n.pop(`${Wm}${a.value.errorText.replace(/\$page/gu,r.value.toString())}`)};return()=>s("div",{class:"vp-pagination"},o.value?s("nav",{class:"vp-pagination-list"},[s("div",{class:"vp-pagination-number "},[e.current>1?s("div",{class:"prev",role:"navigation",unselectable:"on",onClick:()=>{p(e.current-1)}},a.value.prev):null,c.value?[s("div",{role:"navigation",onClick:()=>{p(1)}},1),s("div",{class:"ellipsis"},"...")]:null,u.value.map(E=>s("div",{key:E,class:{active:e.current===E},role:"navigation",onClick:()=>{p(E)}},E)),d.value?[s("div",{class:"ellipsis"},"..."),s("div",{role:"navigation",onClick:()=>{p(r.value)}},r.value)]:null,e.current<r.value?s("div",{class:"next",role:"navigation",unselectable:"on",onClick:()=>{p(e.current+1)}},a.value.next):null]),s("div",{class:"vp-pagination-nav"},[s("label",{for:"navigation-text"},`${a.value.navigate}: `),s("input",{id:"navigation-text",value:l.value,onInput:({target:E})=>{l.value=E.value},onKeydown:E=>
2946{E.key==="Enter"&&(E.preventDefault(),h(l.value))}}),s("button",{class:"vp-pagination-button",type:"button",role:"navigation",title:a.value.action,onClick:()=>{h(l.value)}},a.value.action)])]):[])}}),zr=I({name:"ArticleList",props:{items:{type:Array,required:!0}},slots:Object,setup(e,{slots:t}){const n=xt(),i=Yt(),l=Zt(),a=Hi(),r=se(1),o=b(()=>a.value.articlePerPage??10),c=b(()=>e.items.slice((r.value-1)*o.value,r.value*o.value)),d=async u=>{r.value=u;const p={...n.query};!(p.page===u.toString()||u===1&&!p.page)&&(u===1?delete p.page:p.page=u.toString(),await i.push({path:n.path,query:p}))};return ye(()=>{const{page:u}=n.query;d(u?Number(u):1),we(r,()=>{const p=document.querySelector("#article-list").getBoundingClientRect().top+window.scrollY;setTimeout(()=>{window.scrollTo(0,p)},100)})}),()=>s("div",{id:"article-list",class:"vp-article-list",role:"feed"},c.value.length?[...c.value.map(({info:u,path:p},h)=>s(oe,{appear:!0,delay:h*.04},()=>s(Um,{key:p,info:u,path:p},t))),s(Gm,{current:r.value,perPage:o.value,total:e.items.length,onUpdateCurrentPage:d})]:s("h2",{class:"vp-empty-hint"},l.value.empty.replace("$text",l.value.article.toLocaleLowerCase())))}});const qm="//theme-hope-assets.vuejs.press/hero/default.jpg";var Km=I({name:"BlogHero",slots:Object,setup(e,{slots:t}){const{frontmatter:n,siteLocale:i}=Pe(),l=b(()=>{const{heroText:o,heroStyle:c,tagline:d,heroFullScreen:u=!1}=n.value;return{text:o??(i.value.title||"Hello"),tagline:d??"",style:c??null,isFullScreen:u}}),a=b(()=>{const{heroImage:o,heroImageDark:c,heroAlt:d,heroImageStyle:u}=n.value;return{image:o?Ce(o):null,imageDark:c?Ce(c):null,style:u??null,alt:d??""}}),r=b(()=>{const{bgImage:o,bgImageDark:c,bgImageStyle:d}=n.value;return{image:me(o)?Ce(o):o===!1?null:qm,imageDark:me(c)?Ce(c):null,style:d??null}});return()=>n.value.hero===!1?null:s("div",{class:["vp-blog-hero",{"hero-fullscreen":n.value.heroFullScreen,"no-bg":!r.value.image}]},[t.heroBg?.(r.value)??[r.value.image?s("div",{class:["vp-blog-mask",{light:r.value.imageDark}],style:[{background:`url(${r.value.image}) center/cover no-repeat`},r.value.style]}):null,r.value.imageDark?s("div",{class:"vp-blog-mask dark",style:[{background:`url(${r.value.imageDark}) center/cover no-repeat`},r.value.style]}):null],t.heroLogo?.(a.value)??s(oe,{appear:!0,group:!0,delay:.04},()=>{const{image:o,imageDark:c,style:d,alt:u}=a.value;return[o?s("img",{key:"light",class:["vp-blog-hero-image",{light:c}],style:d,src:o,alt:u}):null,c?s("img",{key:"dark",class:"vp-blog-hero-image dark",style:d,src:c,alt:u}):null]}),t.heroInfo?.(l.value)??s("div",{class:"vp-blog-hero-info"},[s(oe,{appear:!0,delay:.08},()=>l.value.text?s("h1",{class:"vp-blog-hero-title"},l.value.text):null),s(oe,{appear:!0,delay:.12},()=>l.value.tagline?s("div",{class:"vp-blog-hero-description",innerHTML:l.value.tagline}):null)]),n.value.heroFullScreen?s(Or,{onClick:()=>window.scrollTo({top:window.innerHeight-(document.querySelector("[vp-navbar]")?.clientHeight??0),behavior:"smooth"})}):null])}}),Qm=I({name:"ArticlesInfo",setup(){const e=zi(),t=Zt(),n=Vr(),i=Xt(),l=b(()=>e.value.items.length),a=b(()=>n.value.items);return()=>s(oe,()=>s("div",{class:"vp-star-article-wrapper"},[s("div",{class:"title",onClick:()=>{i(e.value.path)}},[s(Hr),s("span",{class:"num"},l.value),t.value.article]),s("hr"),a.value.length?s("ul",{class:"vp-star-articles"},a.value.map(({info:r,path:o},c)=>s(oe,{appear:!0,delay:.08*(c+1)},()=>s("li",{class:"vp-star-article"},s(Ve,{to:o},()=>r.title))))):s("div",{class:"vp-star-article-empty"},t.value.empty.replace("$text",t.value.star))]))}}),zp=I({name:"CategoryList",setup(){const e=Pl(),t=Ui();return()=>s("ul",{class:"vp-category-list"},Rn(t.value.map).sort(([,n],[,i])=>i.items.length-n.items.length).map(([n,{path:i,items:l}])=>s("li",{class:"vp-category-item"},s(Ve,{class:["vp-category",`color${$i(n,Number(ci.colorNumber))}`,{active:i===e.value.path}],to:i},()=>[n,s("span",{class:"vp-category-count"},l.length)]))))}}),Ym=I({name:"CategoriesInfo",setup(){const e=Zt(),t=Ui(),n=Xt(),i=b(()=>Gt(t.value.map).length);return()=>s("div",{class:"vp-category-wrapper"},[i.value?[s("div",{class:"title",onClick:()=>{n(t.value.path)}},[s(Nr),s("span",{class:"num"},i.value),e.value.category]),s("hr"),s(oe,{delay:.04},()=>s(zp))]:s("div",{class:"vp-category-empty"},e.value.empty.replace("$text",e.value.category))])}}),Up=I({name:"TagList",setup(){const e=Et(),t=Wi(),n=i=>i===e.value.blog?.name;return()=>s("ul",{class:"vp-tag-list"},Rn(t.value.map).sort(([,i],[,l])=>l.items.length-i.items.length).map(([i,{path:l,items:a}])=>s("li",{class:"vp-tag-item"},s(Ve,{class:["vp-tag",`color${$i(i,Number(ci.colorNumber))}`,{active:n(i)}],to:l},()=>[i,s("span",{class:"vp-tag-count"}
2946,a.length)]))))}}),Jm=I({name:"TagsInfo",setup(){const e=Zt(),t=Wi(),n=Xt(),i=b(()=>Gt(t.value.map).length);return()=>s("div",{class:"vp-tag-wrapper"},[i.value?[s("div",{class:"title",onClick:()=>{n(t.value.path)}},[s($r),s("span",{class:"num"},i.value),e.value.tag]),s("hr"),s(oe,{delay:.04},()=>s(Up))]:s("div",{class:"vp-tag-empty"},e.value.empty.replace("$text",e.value.tag))])}}),Xm=I({name:"TimelineList",setup(){const e=Zt(),t=Ir(),n=Xt();return()=>s("div",{class:"timeline-list-wrapper"},[s("div",{class:"title",onClick:()=>{n(t.value.path)}},[s(jr),s("span",{class:"num"},t.value.items.length),e.value.timeline]),s("hr"),s("div",{class:"timeline-content"},s("ul",{class:"timeline-list"},t.value.config.map(({year:i,items:l},a)=>s(oe,{appear:!0,delay:.08*(a+1)},()=>s("li",[s("h3",{class:"timeline-year"},i),s("ul",{class:"timeline-year-wrapper"},l.map(({date:r,info:o,path:c})=>s("li",{class:"timeline-item"},[s("span",{class:"timeline-date"},r),s(Ve,{class:"timeline-title",to:c},()=>o.title)])))])))))])}});const Zm={article:Hr,category:Nr,tag:$r,timeline:jr};var Wp=I({name:"InfoList",setup(){const e=Zt(),t=se("article");return()=>s("div",{class:"vp-blog-infos"},[s("div",{class:"vp-blog-type-switcher"},Rn(Zm).map(([n,i])=>s("button",{type:"button",class:"vp-blog-type-button",onClick:()=>{t.value=n}},s("div",{class:["vp-blog-type-icon-wrapper",{active:t.value===n}],"aria-label":e.value[n],"data-balloon-pos":"down"},s(i))))),s(oe,()=>t.value==="article"?s(Qm):t.value==="category"?s(Ym):t.value==="tag"?s(Jm):s(Xm))])}});const Gi=(e,{slots:t})=>s("aside",{class:"vp-blog-info-wrapper"},[t.infoBefore?.(),s(oe,()=>s(Mr,{},t)),s(oe,{delay:.04},()=>s(Wp)),t.infoAfter?.()]);Gi.displayName="InfoPanel";var e2=I({name:"ProjectPanel",props:{items:{type:Array,required:!0}},setup(e){const t=tt(),n=Xt();return()=>s("div",{class:"vp-project-panel"},e.items.map(({icon:i,link:l,name:a,desc:r,background:o})=>s("a",{class:["vp-project-card",{[`color${$i(a,Number(ci.colorNumber))}`]:!t.value&&!o}],...o?{style:o}:{},href:Rl(l)?Ce(l):l,onClick:c=>{n(l),c.preventDefault()}},[i?s(xe("VPIcon"),{class:"vp-project-icon",icon:i}):null,s("div",{class:"vp-project-name"},a),s("div",{class:"vp-project-desc"},r)])))}}),t2=I({name:"BlogHome",slots:Object,setup(e,{slots:t}){const n=zi(),i=Et(),l=b(()=>i.value.projects??[]);return()=>s("div",{class:"vp-page vp-blog-home"},[t.heroBefore?.(),s(Km,{},t),t.heroAfter?.(),s("div",{class:"blog-page-wrapper"},[s("main",{id:"main-content",class:"vp-blog-main"},[t.articlesBefore?.()??(l.value.length?s(oe,{appear:!0,delay:.16},()=>s(e2,{items:l.value})):null),s(oe,{appear:!0,delay:.24},()=>s(zr,{items:n.value.items},t)),t.articlesAfter?.()]),s(oe,{appear:!0,delay:.16},()=>s(Gi,{key:"blog"},t))]),t.content?.()??s(oe,{appear:!0,delay:.28},()=>s(Il,{},t))])}}),n2=I({name:"BlogMainLayout",slots:Object,setup(e,{slots:t}){const{isMobile:n}=Ol();return()=>[s(Lr),s(Rr,{noSidebar:!n.value,noToc:!0},{...t,navScreenBottom:()=>t.navScreenBottom?.()??s(Mr,{},t),sidebarItems:i=>t.sidebarItems?.(i)??(n.value?s(Wp):null)})]}}),i2=I({name:"CategoryPage",slots:Object,setup(e,{slots:t}){const n=Pl(),i=Et(),l=Ui(),a=Wi(),r=b(()=>{const o=i.value.blog;if(o?.type!=="category")return null;const{name:c,key:d}=o;return d==="category"?{component:zp,items:c?l.value.map[c].items:null}:d==="tag"?{component:Up,items:c?a.value.map[c].items:null}:null});return()=>s("div",{class:"vp-page vp-blog"},s("div",{class:"blog-page-wrapper"},[s("main",{id:"main-content",class:"vp-blog-main"},t.default?.()??[s(oe,{appear:!0},()=>r.value?s(r.value.component):null),t.articlesBefore?.(),r.value?.items?s(oe,{appear:!0,delay:.08},()=>[s(zr,{key:n.value.path,items:r.value.items},t)]):null,t.articlesAfter?.()]),s(oe,{delay:.16},()=>s(Gi,{key:"blog"},t))]))}}),l2=I({name:"TimelineItems",setup(){const e=Hi(),t=Zt(),n=Ir(),i=b(()=>e.value.timeline??t.value.timelineTitle);return()=>s("div",{class:"timeline-wrapper"},s("ul",{class:"timeline-content"},[s(oe,()=>s("li",{class:"motto"},i.value)),n.value.config.map(({year:l,items:a},r)=>s(oe,{appear:!0,delay:.08*(r+1),group:!0},()=>[s("h3",{key:"title",id:l,class:"timeline-year-title"}
2946,s("span",l)),s("li",{key:"content",class:"timeline-year-list"},[s("ul",{class:"timeline-year-wrapper"},a.map(({date:o,info:c,path:d})=>s("li",{class:"timeline-item"},[s("span",{class:"timeline-date"},o),s(Ve,{class:"timeline-title",to:d},()=>c.title)])))])]))]))}});const Gp=(e,{slots:t})=>s("div",{class:"vp-page vp-blog"},s("div",{class:"blog-page-wrapper"},[s("main",{id:"main-content",class:"vp-blog-main"},[t.articlesBefore?.(),s(oe,{appear:!0},()=>s(l2)),t.articlesAfter?.()]),s(oe,{appear:!0},()=>s(Gi,{key:"blog"},t))]));Gp.displayName="TimelinePage";var a2=I({name:"ArticleType",setup(){const{page:e,routeLocale:t}=Pe(),n=zi(),i=Vr(),l=Zt(),a=b(()=>[{text:l.value.all,path:n.value.path},{text:l.value.star,path:i.value.path},...Rm.map(({key:r,path:o})=>{const c=o.replace(/^\//,t.value);return{text:l.value[r]??At(c).meta.title??r,path:c}})]);return()=>s("ul",{class:"vp-article-type-wrapper"},a.value.map(r=>s("li",{class:["vp-article-type",{active:r.path===e.value.path}]},s(Ve,{to:r.path},()=>r.text))))}}),r2=I({name:"TypePage",slots:Object,setup(e,{slots:t}){const n=Ml(),i=Et(),l=Pl(),a=zi(),r=Vr(),o=b(()=>{const c=i.value.blog;return c?.type!=="type"||!c.key?a.value.items:c.key==="star"?r.value.items:n.value.items});return()=>s("div",{class:"vp-page vp-blog"},s("div",{class:"blog-page-wrapper"},[s("main",{id:"main-content",class:"vp-blog-main"},t.default?.()??[s(oe,()=>s(a2)),t.articlesBefore?.(),s(oe,{appear:!0,delay:.08},()=>s(zr,{key:l.value.path,items:o.value})),t.articlesAfter?.()]),s(oe,{appear:!0,delay:.08},()=>s(Gi,{key:"blog"},t))]))}}),s2=I({name:"Blog",slots:Object,setup(e,{slots:t}){const n=Et();return()=>{const{type:i,key:l}=n.value.blog??{};return s(n2,null,{...t,default:()=>t.default?.()??s(i==="category"?i2:i==="type"?l==="timeline"?Gp:r2:t2,null,t)})}}});const o2=()=>{Lm(),Om(),Vm(),Im(),Mm()};q8(e=>{const t=e.title,n=e.index??!0,i=e.icon;return n?{title:t,content:i?()=>[s(xe("VPIcon"),{icon:i,sizing:"both"}),t]:null,order:e.order,index:e.index}:null});const c2={enhance:({app:e,router:t})=>{const{scrollBehavior:n}=t.options;t.options.scrollBehavior=async(...i)=>(await $a.wait(),n(...i)),jg(e),e.component("BloggerInfo",Mr),e.component("SocialMedias",Op)},setup:()=>{Hg(),Wg(),o2()},layouts:{Layout:wm,NotFound:xm,Blog:s2}},u2=Object.freeze(Object.defineProperty({__proto__:null,default:c2},Symbol.toStringTag,{value:"Module"})),p2={enhance:({app:e})=>{e.component("BlurText",rc(()=>f(()=>import("./BlurText-BDLINKHs.js"),__vite__mapDeps([283,1]))))}},d2=Object.freeze(Object.defineProperty({__proto__:null,default:p2},Symbol.toStringTag,{value:"Module"}));function h2(e,t,n){var i,l,a;n===void 0&&(n={});var r=(i=n.isImmediate)!=null&&i,o=(l=n.callback)!=null&&l,c=n.maxWait,d=Date.now(),u=[];function p(){if(c!==void 0){var E=Date.now()-d;if(E+t>=c)return c-E}return t}var h=function(){var E=[].slice.call(arguments),v=this;return new Promise(function(B,k){var D=r&&a===void 0;if(a!==void 0&&clearTimeout(a),a=setTimeout(function(){if(a=void 0,d=Date.now(),!r){var m=e.apply(v,E);o&&o(m),u.forEach(function(_){return(0,_.resolve)(m)}),u=[]}},p()),D){var y=e.apply(v,E);return o&&o(y),B(y)}u.push({resolve:B,reject:k})})};return h.cancel=function(E){a!==void 0&&clearTimeout(a),u.forEach(function(v){return(0,v.reject)(E)}),u=[]},h}var E2={appId:"KPJEYDTI5K",apiKey:"80f988070f3872d6d0e6595399a2a9d3",indexName:"chiichenio",locales:{"/":{placeholder:"搜索文档",translations:{button:{buttonText:"搜索文档",buttonAriaLabel:"搜索文档"},modal:{searchBox:{clearButtonTitle:"清除查询条件",clearButtonAriaLabel:"清除查询条件",closeButtonText:"关闭",closeButtonAriaLabel:"关闭",placeholderText:"搜索文档",placeholderTextAskAi:"向 AI 助手提问",placeholderTextAskAiStreaming:"回答中...",searchInputLabel:"搜索",backToKeywordSearchButtonText:"返回关键字搜索",backToKeywordSearchButtonAriaLabel:"返回关键字搜索",newConversationPlaceholder:"询问问题",conversationHistoryTitle:"对话历史",startNewConversationText:"新对话",viewConversationHistoryText:"对话历史",resetButtonTitle:"清除查询条件",resetButtonAriaLabel:"清除查询条件",cancelButtonText:"取消",cancelButtonAriaLabel:"取消"},startScreen:{recentSearchesTitle:"搜索历史",noRecentSearchesText:"没有搜索历史",saveRecentSearchButtonTitle:"保存至搜索历史",removeRecentSearchButtonTitle:"从搜索历史中移除",favoriteSearchesTitle:"收藏",removeFavoriteSearchButtonTitle:"从收藏中移除",recentConversationsTitle:"最近对话",removeRecentConversationButtonTitle:"从最近对话中移除"},errorScreen:{titleText:"无法获取结果",helpText:"你可能需要检查你的网络连接"},noResultsScreen:{noResultsText:"无法找到相关结果",suggestedQueryText:"你可以尝试查询",reportMissingResultsText:"你认为该查询应该有结果?",reportMissingResultsLinkText:"点击反馈"},resultsScreen:{askAiPlaceholder:"询问AI:",noResultsAskAiPlaceholder:"没有找到文档?让 AI 来帮忙:"},askAiScreen:{disclaimerText:"AI 助手的回答可能不准确。自行验证回复。",relatedSourcesText:"相关资源",thinkingText:"思考中...",copyButtonText:"复制",copyButtonCopiedText:"已复制",copyButtonTitle:"复制",likeButtonTitle:"有帮助",dislikeButtonTitle:"没帮助",thanksForFeedbackText:"感谢您的反馈!",preToolCallText:"搜索中...",duringToolCallText:"搜索",afterToolCallText:"已搜索",stoppedStreamingText:"你停止了此回复"},footer:{selectText:"选择",submitQuestionText:"提交问题",selectKeyAriaLabel:"回车键",navigateText:"切换",navigateUpKeyAriaLabel:"上箭头",n
2946avigateDownKeyAriaLabel:"下箭头",closeText:"关闭",backToSearchText:"返回搜索",closeKeyAriaLabel:"ESC 键",poweredByText:"搜索提供者",searchByText:"搜索提供者"}}}},"/en/":{placeholder:"Search Documentation",translations:{button:{buttonText:"Search Documentation"}}}}};const f2=(e,t)=>{const n=fe("keydown",i=>{const{keyboardShortcuts:l={}}=e.value,a=l["Ctrl/Cmd+K"]!==!1&&i.key==="k"&&(gu()||_r()?i.metaKey:i.ctrlKey),r=l["/"]!==!1&&i.key==="/";(a||r)&&(i.preventDefault(),t(),n())})},g2=()=>{const e=Yt();return{transformItems:t=>t.map(n=>({...n,url:`/${Er(IE(n.url,"/"))}`})),navigator:{navigate:({itemUrl:t})=>{e.push(t.replace("/","/"))}},transformSearchClient:t=>({...t,search:h2(t.search,500)})}},m2=E2,v2=se(m2),qp=Symbol(""),A2=()=>{const e=ve(qp),t=Fl();return b(()=>({...e.value,...e.value.locales?.[t.value]}))},B2=e=>{e.provide(qp,Kt(v2))},y2=(e,t=[])=>[`lang:${e}`,...Array.isArray(t)?t:[t]],_2=(e,t)=>{const{indices:n,indexName:i,searchParameters:l}=e;return(n??[{name:i??"",searchParameters:l}]).map(a=>{if(me(a))return{name:a,searchParameters:l};const{searchParameters:r,...o}=a;return{...o,searchParameters:{...r,facetFilters:y2(t,r?.facetFilters)}}})},b2=({buttonText:e="Search",buttonAriaLabel:t=e}={})=>{const n=gu()||_r();return`<button type="button" aria-label="${t}" aria-keyshortcuts="${n?"Command":"Control"}+k" class="DocSearch DocSearch-Button"><span class="DocSearch-Button-Container"><svg width="20" height="20" viewBox="0 0 24 24" aria-hidden="true" class="DocSearch-Search-Icon"><circle cx="11" cy="11" r="8" stroke="currentColor" fill="none" stroke-width="1.4"></circle><path d="m21 21-4.3-4.3" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key DocSearch-Button-Key--${n?"command":"ctrl"}">${n?"⌘":"Ctrl"}</kbd><kbd class="DocSearch-Button-Key DocSearch-Button-Key--pressed">K</kbd></span></button>`},Kp=()=>
2946{if(document.querySelector(".DocSearch-Modal"))return;const e=new Event("keydown");e.key="k",e.metaKey=!0,window.dispatchEvent(e),setTimeout(Kp,16)},k2=e=>{const t="algolia-preconnect";("requestIdleCallback"in window?window.requestIdleCallback:setTimeout)(()=>{if(document.head.querySelector(`#${t}`))return;const n=document.createElement("link");n.id=t,n.rel="preconnect",n.href=`https://${e}-dsn.algolia.net`,n.crossOrigin="",document.head.appendChild(n)})},C2=I({name:"DocSearch",props:{containerId:{type:String,default:"docsearch-container"},options:{type:Object,default:()=>({})}},setup(e){const t=A2(),n=g2(),i=Sl(),l=Fl(),a=se(!1),r=se(!1),o=b(()=>{const{locales:u={},...p}=e.options;return{...t.value,...p,...u[l.value]}}),c=async()=>{const{default:u}=await f(async()=>{const{default:p}=await import("./index-PJms1hp3.js");return{default:p}},[]);u({...n,...o.value,container:`#${e.containerId}`,indices:_2(o.value,i.value)}),a.value=!0},d=()=>{r.value||a.value||(r.value=!0,c(),Kp(),we(l,c))};return f2(o,d),ye(()=>{k2(o.value.appId)}),()=>[s("div",{id:e.containerId,style:{display:a.value?"block":"none"}}),a.value?null:s("div",{onClick:d,innerHTML:b2(o.value.translations?.button)})]}}),D2={enhance({app:e}){B2(e),e.component("SearchBox",C2)}},T2=Object.freeze(Object.defineProperty({__proto__:null,default:D2},Symbol.toStringTag,{value:"Module"})),ll=[M1,V1,N1,q1,K1,Y1,J1,i8,l8,a8,p8,f8,B8,b8,M8,N8,G8,Z8,ag,Eg,Bg,u2,d2,T2].map(e=>e.default).filter(Boolean),w2=JSON.parse(`{"base":"/","lang":"en-US","title":"","description":"","head":[["script",{"src":"https://www.googletagmanager.com/gtag/js?id=G-0ENBRM6T52","async":true}],["script",{},"\\n        window.dataLayer = window.dataLayer || [];\\n        function gtag(){dataLayer.push(arguments);}\\n        gtag('js', new Date());\\n        gtag('config', 'G-0ENBRM6T52');\\n      "],["link",{"rel":"icon","href":"/KissingCat.jpg"}]],"locales":{"/":{"lang":"zh-CN","title":"chiichen's Blog","description":"博客杂谈"},"/en/":{"lang":"en-US","title":"chiichen's Blog","description":"A blog of mine"}}}`);var jn=ae(w2),x2=S0,F2=()=>{const e=Z0({history:x2(hr("/")),routes:[{name:"vuepress-route",path:"/:catchAll(.*)",components:{}}
2946],scrollBehavior:(t,n,i)=>i||(t.hash?{el:t.hash}:{top:0})});return e.beforeResolve(async(t,n)=>{if(t.path!==n.path||n===Ht){const i=At(t.fullPath);if(i.path!==t.fullPath)return i.path;const l=await i.loader();t.meta={...i.meta,_pageChunk:l}}else t.path===n.path&&(t.meta=n.meta)}),e},S2=e=>{e.component("ClientOnly",vr),e.component("Content",ru),e.component("RouteLink",Ve)},P2=(e,t,n)=>{const i=b(()=>t.currentRoute.value.path),l=Qo((k,D)=>({get(){return k(),t.currentRoute.value.meta._pageChunk},set(y){t.currentRoute.value.meta._pageChunk=y,D()}})),a=b(()=>An.resolveLayouts(n)),r=b(()=>An.resolveRouteLocale(jn.value.locales,i.value)),o=b(()=>An.resolveSiteLocaleData(jn.value,r.value)),c=b(()=>l.value.comp),d=b(()=>l.value.data),u=b(()=>d.value.frontmatter),p=b(()=>An.resolvePageHeadTitle(d.value,o.value)),h=b(()=>An.resolvePageHead(p.value,u.value,o.value)),E=b(()=>An.resolvePageLang(d.value,o.value)),v=b(()=>An.resolvePageLayout(d.value,a.value)),B={layouts:a,pageData:d,pageComponent:c,pageFrontmatter:u,pageHead:h,pageHeadTitle:p,pageLang:E,pageLayout:v,redirects:xa,routeLocale:r,routePath:i,routes:Yn,siteData:jn,siteLocaleData:o,frontmatter:u,head:h,headTitle:p,lang:E,page:d,site:jn,siteLocale:o};return e.provide(mr,B),Object.defineProperties(e.config.globalProperties,{$pageFrontmatter:{get:()=>u.value},$pageHead:{get:()=>h.value},$pageHeadTitle:{get:()=>p.value},$pageLang:{get:()=>E.value},$pageData:{get:()=>d.value},$routeLocale:{get:()=>r.value},$withBase:{get:()=>Ce},$frontmatter:{get:()=>u.value},$head:{get:()=>h.value},$headTitle:{get:()=>p.value},$lang:{get:()=>E.value},$page:{get:()=>d.value},$site:{get:()=>jn.value},$siteLocale:{get:()=>o.value}}),B},R2=([e,t,n=""])=>{const i=Object.entries(t).map(([o,c])=>me(c)?`[${o}=${JSON.stringify(c)}]`:c?`[${o}]`:"").join(""),l=`head > ${e}${i}`;return Array.from(document.querySelectorAll(l)).find(o=>o.innerText===n)??null},L2=([e,t,n])=>{if(!me(e))return null;const i=document.createElement(e);return ai(t)&&Object.entries(t).forEach(([l,a])=>{me(a)?i.setAttribute(l,a):a&&i.setAttribute(l,"")}),me(n)&&i.appendChild(document.createTextNode(n)),i},O2=()=>{const e=nf(),t=lu();let n=[];const i=()=>{e.value.forEach(r=>{const o=R2(r);o&&n.push(o)})},l=()=>{const r=[];return e.value.forEach(o=>{const c=L2(o);c&&r.push(c)}),r},a=()=>{document.documentElement.lang=t.value;const r=l();n.forEach((o,c)=>{const d=r.findIndex(u=>o.isEqualNode(u));d===-1?(o.remove(),delete n[c]):r.splice(d,1)}),r.forEach(o=>document.head.appendChild(o)),n=[...n.filter(o=>!!o),...r]};Ct(of,a),ye(()=>{i(),we(e,a,{immediate:!1})})},I2=xE,M2=async()=>{const e=I2({name:"Vuepress",setup(){O2();for(const l of ll)l.setup?.();const n=ll.flatMap(({rootComponents:l=[]})=>l.map(a=>s(a))),i=lf();return()=>[s(i.value),n]}}),t=F2();S2(e),P2(e,t,ll);for(const n of ll)await n.enhance?.({app:e,router:t,siteData:jn});return e.use(t),{app:e,router:t}};M2().then(({app:e,router:t})=>{t.isReady().then(()=>{e.mount("#app")})});export{f as _,Fc as a,Sc as b,N2 as c,M2 as createVueApp,$2 as d,Me as e,V2 as o,xe as r,od as t};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.