1&&arguments[1]!==void 0?arguments[1]:{},n=window.Promise||function(P){function w(){}P(w,w)},a=function(P){var w=P.target;if(w===fe){N();return}D.indexOf(w)!==-1&&F({target:w})},i=function(){if(!(Z||!f.original)){var P=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;Math.abs(Ke-P)>z.scrollOffset&&setTimeout(N,150)}},l=function(P){var w=P.key||P.keyCode;(w==="Escape"||w==="Esc"||w===27)&&N()},d=function(){var P=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},w=P;if(P.background&&(fe.style.background=P.background),P.container&&P.container instanceof Object&&(w.container=re({},z.container,P.container)),P.template){var O=ge(P.template)?P.template:document.querySelector(P.template);w.template=O}return z=re({},z,w),D.forEach(function(j){j.dispatchEvent(ue("medium-zoom:update",{detail:{zoom:U}}))}),U},m=function(){var P=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};return o(re({},z,P))},y=function(){for(var P=arguments.length,w=Array(P),O=0;O0?w.reduce(function(T,K){return[].concat(T,Xe(K))},[]):D;return j.forEach(function(T){T.classList.remove("medium-zoom-image"),T.dispatchEvent(ue("medium-zoom:detach",{detail:{zoom:U}}))}),D=D.filter(function(T){return j.indexOf(T)===-1}),U},k=function(P,w){var O=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return D.forEach(function(j){j.addEventListener("medium-zoom:"+P,w,O)}),ne.push({type:"medium-zoom:"+P,listener:w,options:O}),U},S=function(P,w){var O=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return D.forEach(function(j){j.removeEventListener("medium-zoom:"+P,w,O)}),ne=ne.filter(function(j){return!(j.type==="medium-zoom:"+P&&j.listener.toString()===w.toString())}),U},E=function(){var P=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},w=P.target,O=function(){var T={width:document.documentElement.clientWidth,height:document.documentElement.clientHeight,left:0,top:0,right:0,bottom:0},K=void 0,J=void 0;if(z.container)if(z.container instanceof Object)T=re({},T,z.container),K=T.width-T.left-T.right-z.margin*2,J=T.height-T.top-T.bottom-z.margin*2;else{var ce=ge(z.container)?z.container:document.querySelector(z.container),ae=ce.getBoundingClientRect(),Ve=ae.width,ft=ae.height,ht=ae.left,_t=ae.top;T=re({},T,{width:Ve,height:ft,left:ht,top:_t})}K=K||T.width-z.margin*2,J=J||T.height-z.margin*2;var ve=f.zoomedHd||f.original,gt=Ye(ve)?K:ve.naturalWidth||K,bt=Ye(ve)?J:ve.naturalHeight||J,he=ve.getBoundingClientRect(),kt=he.top,$t=he.left,we=he.width,Te=he.height,yt=Math.min(Math.max(we,gt),K)/we,Lt=Math.min(Math.max(Te,bt),J)/Te,Ie=Math.min(yt,Lt),Pt=(-$t+(K-we)/2+z.margin+T.left)/Ie,St=(-kt+(J-Te)/2+z.margin+T.top)/Ie,Je="scale("+Ie+") translate3d("+Pt+"px, "+St+"px, 0)";f.zoomed.style.transform=Je,f.zoomedHd&&(f.zoomedHd.style.transform=Je)};return new n(function(j){if(w&&D.indexOf(w)===-1){j(U);return}var T=function Ve(){Z=!1,f.zoomed.removeEventListener("transitionend",Ve),f.original.dispatchEvent(ue("medium-zoom:opened",{detail:{zoom:U}})),j(U)};if(f.zoomed){j(U);return}if(w)f.original=w;else if(D.length>0){var K=D;f.original=K[0]}else{j(U);return}if(f.original.dispatchEvent(ue("medium-zoom:open",{detail:{zoom:U}})),Ke=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,Z=!0,f.zoomed=Gt(f.original),document.body.appendChild(fe),z.template){var J=ge(z.template)?z.template:document.querySelector(z.template);f.template=document.createElement("div"),f.template.appendChild(J.content.cloneNode(!0)),document.body.appendChild(f.template)}if(f.original.parentElement&&f.original.parentElement.tagName==="PICTURE"&&f.original.currentSrc&&(f.zoomed.src=f.original.currentSrc),document.body.appendChild(f.zoomed),window.requestAnimationFrame(function(){document.body.classList.add("medium-zoom--opened")}),f.original.classList.add("medium-zoom-image--hidden"),f.zoomed.classList.add("medium-zoom-image--opened"),f.zoomed.addEventListener("click",N),f.zoomed.addEventListener("transitionend",T),f.original.getAttribute("data-zoom-src")){f.zoomedHd=f.zoomed.cloneNode(),f.zoomedHd.removeAttribute("srcset"),f.zoomedHd.removeAttribute("sizes"),f.zoomedHd.removeAttribute("loading"),f.zoomedHd.src=f.zoomed.getAttribute("data-zoom-src"),f.zoomedHd.onerror=function(){clearInterval(ce),console.warn("Unable to reach the zoom image target "+f.zoomedHd.src),f.zoomedHd=null,O()};var ce=setInterval(function(){f.zoomedHd.complete&&(clearInterval(ce),f.zoomedHd.classList.add("medium-zoom-image--opened"),f.zoomedHd.addEventListener("click",N),document.body.appendChild(f.zoomedHd),O())},10)}else if(f.original.hasAttribute("srcset")){f.zoomedHd=f.zoomed.cloneNode(),f.zoomedHd.removeAttribute("sizes"),f.zoomedHd.removeAttribute("loading");var ae=f.zoomedHd.addEventListener("load",function(){f.zoomedHd.removeEventListener("load",ae),f.zoomedHd.classList.add("medium-zoom-image--opened"),f.zoomedHd.addEventListener("click",N),document.body.appendChild(f.zoomedHd),O()})}else O()})},N=function(){return new n(function(P){if(Z||!f.original){P(U);return}var w=function O(){f.original.classList.remove("medium-zoom-image--hidden"),document.body.removeChild(f.zoomed),f.zoomedHd&&document.body.removeChild(f.zoomedHd),document.body.removeChild(fe),f.zoomed.classList.remove("medium-zoom-image--opened"),f.template&&document.body.removeChild(f.template),Z=!1,f.zoomed.removeEventListener("transitionend",O),f.original.dispatchEvent(ue("medium-zoom:closed",{detail:{zoom:U}})),f.original=null,f.zoomed=null,f.zoomedHd=null,f.template=null,P(U)};Z=!0,document.body.classList.remove("medium-zoom--opened"),f.zoomed.style.transform="",f.zoomedHd&&(f.zoomedHd.style.transform=""),f.template&&(f.template.style.transition="opacity 150ms",f.template.style.opacity=0),f.original.dispatchEvent(ue("medium-zoom:close",{detail:{zoom:U}})),f.zoomed.addEventListener("transitionend",w)})},F=function(){var P=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},w=P.target;return f.original?N():E({target:w})},C=function(){return z},Y=function(){return D},X=function(){return f.original},D=[],ne=[],Z=!1,Ke=0,z=t,f={original:null,zoomed:null,zoomedHd:null,template:null};Object.prototype.toString.call(e)==="[object Object]"?z=e:(e||typeof e=="string")&&y(e),z=re({margin:0,background:"#fff",scrollOffset:40,container:null,template:null},z);var fe=Ut(z.background);document.addEventListener("click",a),document.addEventListener("keyup",l),document.addEventListener("scroll",i),window.addEventListener("resize",N);var U={open:E,close:N,toggle:F,update:d,clone:m,attach:y,detach:I,on:k,off:S,getOptions:C,getImages:Y,getZoomedImage:X};return U};function Wt(o,e){e===void 0&&(e={});var t=e.insertAt;if(!(typeof document>"u")){var n=document.head||document.getElementsByTagName("head")[0],a=document.createElement("style");a.type="text/css",t==="top"&&n.firstChild?n.insertBefore(a,n.firstChild):n.appendChild(a),a.styleSheet?a.styleSheet.cssText=o:a.appendChild(document.createTextNode(o))}}var Rt=".medium-zoom-overlay{position:fixed;top:0;right:0;bottom:0;left:0;opacity:0;transition:opacity .3s;will-change:opacity}.medium-zoom--opened .medium-zoom-overlay{cursor:pointer;cursor:zoom-out;opacity:1}.medium-zoom-image{cursor:pointer;cursor:zoom-in;transition:transform .3s cubic-bezier(.2,0,.2,1)!important}.medium-zoom-image--hidden{visibility:hidden}.medium-zoom-image--opened{position:relative;cursor:pointer;cursor:zoom-out;will-change:transform}";Wt(Rt);const Kt={key:0,class:"VPBackdrop"},Jt=_({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(o){return(e,t)=>(s(),b(Ae,{name:"fade"},{default:p(()=>[e.show?(s(),u("div",Kt)):h("",!0)]),_:1}))}}),Yt=$(Jt,[["__scopeId","data-v-eab00006"]]),V=Vt;function Xt(o,e){let t,n=!1;return()=>{t&&clearTimeout(t),n?t=setTimeout(o,e):(o(),(n=!0)&&setTimeout(()=>n=!1,e))}}function He(o){return o.startsWith("/")?o:`/${o}`}function je(o){const{pathname:e,search:t,hash:n,protocol:a}=new URL(o,"http://a.com");if(wt(o)||o.startsWith("#")||!a.startsWith("http")||!Tt(e))return o;const{site:i}=V(),l=e.endsWith("/")||e.endsWith(".html")?o:o.replace(/(?:(^\.+)\/)?.*$/,`$1${e.replace(/(\.md)?$/,i.value.cleanUrls?"":".html")}${t}${n}`);return Be(l)}function me({correspondingLink:o=!1}={}){const{site:e,localeIndex:t,page:n,theme:a,hash:i}=V(),l=L(()=>{var m,y;return{label:(m=e.value.locales[t.value])==null?void 0:m.label,link:((y=e.value.locales[t.value])==null?void 0:y.link)||(t.value==="root"?"/":`/${t.value}/`)}});return{localeLinks:L(()=>Object.entries(e.value.locales).flatMap(([m,y])=>l.value.label===y.label?[]:{text:y.label,link:Zt(y.link||(m==="root"?"/":`/${m}/`),a.value.i18nRouting!==!1&&o,n.value.relativePath.slice(l.value.link.length-1),!e.value.cleanUrls)+i.value})),currentLang:l}}function Zt(o,e,t,n){return e?o.replace(/\/$/,"")+He(t.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,n?".html":"")):o}const Qt=o=>(G("data-v-60b89e81"),o=o(),q(),o),xt={class:"NotFound"},eo={class:"code"},to={class:"title"},oo=Qt(()=>v("div",{class:"divider"},null,-1)),no={class:"quote"},ao={class:"action"},so=["href","aria-label"],ro=_({__name:"NotFound",setup(o){const{theme:e}=V(),{currentLang:t}=me();return(n,a)=>{var i,l,d,m,y;return s(),u("div",xt,[v("p",eo,A(((i=r(e).notFound)==null?void 0:i.code)??"404"),1),v("h1",to,A(((l=r(e).notFound)==null?void 0:l.title)??"PAGE NOT FOUND"),1),oo,v("blockquote",no,A(((d=r(e).notFound)==null?void 0:d.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),v("div",ao,[v("a",{class:"link",href:r(Be)(r(t).link),"aria-label":((m=r(e).notFound)==null?void 0:m.linkLabel)??"go to home"},A(((y=r(e).notFound)==null?void 0:y.linkText)??"Take me home"),9,so)])])}}}),io=$(ro,[["__scopeId","data-v-60b89e81"]]);function at(o,e){if(Array.isArray(o))return be(o);if(o==null)return[];e=He(e);const t=Object.keys(o).sort((a,i)=>i.split("/").length-a.split("/").length).find(a=>e.startsWith(He(a))),n=t?o[t]:[];return Array.isArray(n)?be(n):be(n.items,n.base)}function lo(o){const e=[];let t=0;for(const n in o){const a=o[n];if(a.items){t=e.push(a);continue}e[t]||e.push({items:[]}),e[t].items.push(a)}return e}function co(o){const e=[];function t(n){for(const a of n)a.text&&a.link&&e.push({text:a.text,link:a.link,docFooterText:a.docFooterText}),a.items&&t(a.items)}return t(o),e}function Me(o,e){return Array.isArray(e)?e.some(t=>Me(o,t)):ie(o,e.link)?!0:e.items?Me(o,e.items):!1}function be(o,e){return[...o].map(t=>{const n={...t},a=n.base||e;return a&&n.link&&(n.link=a+n.link),n.items&&(n.items=be(n.items,a)),n})}function oe(){const{frontmatter:o,page:e,theme:t}=V(),n=Ee("(min-width: 960px)"),a=H(!1),i=L(()=>{const F=t.value.sidebar,C=e.value.relativePath;return F?at(F,C):[]}),l=H(i.value);ee(i,(F,C)=>{JSON.stringify(F)!==JSON.stringify(C)&&(l.value=i.value)});const d=L(()=>o.value.sidebar!==!1&&l.value.length>0&&o.value.layout!=="home"),m=L(()=>y?o.value.aside==null?t.value.aside==="left":o.value.aside==="left":!1),y=L(()=>o.value.layout==="home"?!1:o.value.aside!=null?!!o.value.aside:t.value.aside!==!1),I=L(()=>d.value&&n.value),k=L(()=>d.value?lo(l.value):[]);function S(){a.value=!0}function E(){a.value=!1}function N(){a.value?E():S()}return{isOpen:a,sidebar:l,sidebarGroups:k,hasSidebar:d,hasAside:y,leftAside:m,isSidebarEnabled:I,open:S,close:E,toggle:N}}function uo(o,e){let t;$e(()=>{t=o.value?document.activeElement:void 0}),te(()=>{window.addEventListener("keyup",n)}),Oe(()=>{window.removeEventListener("keyup",n)});function n(a){a.key==="Escape"&&o.value&&(e(),t==null||t.focus())}}function vo(o){const{page:e,hash:t}=V(),n=H(!1),a=L(()=>o.value.collapsed!=null),i=L(()=>!!o.value.link),l=H(!1),d=()=>{l.value=ie(e.value.relativePath,o.value.link)};ee([e,o,t],d),te(d);const m=L(()=>l.value?!0:o.value.items?Me(e.value.relativePath,o.value.items):!1),y=L(()=>!!(o.value.items&&o.value.items.length));$e(()=>{n.value=!!(a.value&&o.value.collapsed)}),Fe(()=>{(l.value||m.value)&&(n.value=!1)});function I(){a.value&&(n.value=!n.value)}return{collapsed:n,collapsible:a,isLink:i,isActiveLink:l,hasActiveLink:m,hasChildren:y,toggle:I}}function po(){const{hasSidebar:o}=oe(),e=Ee("(min-width: 960px)"),t=Ee("(min-width: 1280px)");return{isAsideEnabled:L(()=>!t.value&&!e.value?!1:o.value?t.value:e.value)}}const mo=/\b(?:VPBadge|header-anchor|footnote-ref|ignore-header)\b/,ze=[];function st(o){return typeof o.outline=="object"&&!Array.isArray(o.outline)&&o.outline.label||o.outlineTitle||"On this page"}function Ue(o){const e=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(t=>t.id&&t.hasChildNodes()).map(t=>{const n=Number(t.tagName[1]);return{element:t,title:fo(t),link:"#"+t.id,level:n}});return ho(e,o)}function fo(o){let e="";for(const t of o.childNodes)if(t.nodeType===1){if(mo.test(t.className))continue;e+=t.textContent}else t.nodeType===3&&(e+=t.textContent);return e.trim()}function ho(o,e){if(e===!1)return[];const t=(typeof e=="object"&&!Array.isArray(e)?e.level:e)||2,[n,a]=typeof t=="number"?[t,t]:t==="deep"?[2,6]:t;return bo(o,n,a)}function _o(o,e){const{isAsideEnabled:t}=po(),n=Xt(i,100);let a=null;te(()=>{requestAnimationFrame(i),window.addEventListener("scroll",n)}),It(()=>{l(location.hash)}),Oe(()=>{window.removeEventListener("scroll",n)});function i(){if(!t.value)return;const d=window.scrollY,m=window.innerHeight,y=document.body.offsetHeight,I=Math.abs(d+m-y)<1,k=ze.map(({element:E,link:N})=>({link:N,top:go(E)})).filter(({top:E})=>!Number.isNaN(E)).sort((E,N)=>E.top-N.top);if(!k.length){l(null);return}if(d<1){l(null);return}if(I){l(k[k.length-1].link);return}let S=null;for(const{link:E,top:N}of k){if(N>d+Nt()+4)break;S=E}l(S)}function l(d){a&&a.classList.remove("active"),d==null?a=null:a=o.value.querySelector(`a[href="${decodeURIComponent(d)}"]`);const m=a;m?(m.classList.add("active"),e.value.style.top=m.offsetTop+39+"px",e.value.style.opacity="1"):(e.value.style.top="33px",e.value.style.opacity="0")}}function go(o){let e=0;for(;o!==document.body;){if(o===null)return NaN;e+=o.offsetTop,o=o.offsetParent}return e}function bo(o,e,t){ze.length=0;const n=[],a=[];return o.forEach(i=>{const l={...i,children:[]};let d=a[a.length-1];for(;d&&d.level>=l.level;)a.pop(),d=a[a.length-1];if(l.element.classList.contains("ignore-header")||d&&"shouldIgnore"in d){a.push({level:l.level,shouldIgnore:!0});return}l.level>t||l.level{const a=le("VPDocOutlineItem",!0);return s(),u("ul",{class:M(["VPDocOutlineItem",t.root?"root":"nested"])},[(s(!0),u(B,null,W(t.headers,({children:i,link:l,title:d})=>(s(),u("li",null,[v("a",{class:"outline-link",href:l,onClick:e,title:d},A(d),9,ko),i!=null&&i.length?(s(),b(a,{key:0,headers:i},null,8,["headers"])):h("",!0)]))),256))],2)}}}),rt=$($o,[["__scopeId","data-v-c8fd7940"]]),yo={class:"content"},Lo={"aria-level":"2",class:"outline-title",id:"doc-outline-aria-label",role:"heading"},Po=_({__name:"VPDocAsideOutline",setup(o){const{frontmatter:e,theme:t}=V(),n=Qe([]);ye(()=>{n.value=Ue(e.value.outline??t.value.outline)});const a=H(),i=H();return _o(a,i),(l,d)=>(s(),u("nav",{"aria-labelledby":"doc-outline-aria-label",class:M(["VPDocAsideOutline",{"has-outline":n.value.length>0}]),ref_key:"container",ref:a},[v("div",yo,[v("div",{class:"outline-marker",ref_key:"marker",ref:i},null,512),v("div",Lo,A(r(st)(r(t))),1),g(rt,{headers:n.value,root:!0},null,8,["headers"])])],2))}}),So=$(Po,[["__scopeId","data-v-beb6bc9f"]]),Vo={class:"VPDocAsideCarbonAds"},wo=_({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(o){const e=()=>null;return(t,n)=>(s(),u("div",Vo,[g(r(e),{"carbon-ads":t.carbonAds},null,8,["carbon-ads"])]))}}),To=o=>(G("data-v-c4200bf2"),o=o(),q(),o),Io={class:"VPDocAside"},No=To(()=>v("div",{class:"spacer"},null,-1)),Eo=_({__name:"VPDocAside",setup(o){const{theme:e}=V();return(t,n)=>(s(),u("div",Io,[c(t.$slots,"aside-top",{},void 0,!0),c(t.$slots,"aside-outline-before",{},void 0,!0),g(So),c(t.$slots,"aside-outline-after",{},void 0,!0),No,c(t.$slots,"aside-ads-before",{},void 0,!0),r(e).carbonAds?(s(),b(wo,{key:0,"carbon-ads":r(e).carbonAds},null,8,["carbon-ads"])):h("",!0),c(t.$slots,"aside-ads-after",{},void 0,!0),c(t.$slots,"aside-bottom",{},void 0,!0)]))}}),Co=$(Eo,[["__scopeId","data-v-c4200bf2"]]);function Ho(){const{theme:o,page:e}=V();return L(()=>{const{text:t="Edit this page",pattern:n=""}=o.value.editLink||{};let a;return typeof n=="function"?a=n(e.value):a=n.replace(/:path/g,e.value.filePath),{url:a,text:t}})}function Mo(){const{page:o,theme:e,frontmatter:t}=V();return L(()=>{var y,I,k,S,E,N,F,C;const n=at(e.value.sidebar,o.value.relativePath),a=co(n),i=zo(a,Y=>Y.link.replace(/[?#].*$/,"")),l=i.findIndex(Y=>ie(o.value.relativePath,Y.link)),d=((y=e.value.docFooter)==null?void 0:y.prev)===!1&&!t.value.prev||t.value.prev===!1,m=((I=e.value.docFooter)==null?void 0:I.next)===!1&&!t.value.next||t.value.next===!1;return{prev:d?void 0:{text:(typeof t.value.prev=="string"?t.value.prev:typeof t.value.prev=="object"?t.value.prev.text:void 0)??((k=i[l-1])==null?void 0:k.docFooterText)??((S=i[l-1])==null?void 0:S.text),link:(typeof t.value.prev=="object"?t.value.prev.link:void 0)??((E=i[l-1])==null?void 0:E.link)},next:m?void 0:{text:(typeof t.value.next=="string"?t.value.next:typeof t.value.next=="object"?t.value.next.text:void 0)??((N=i[l+1])==null?void 0:N.docFooterText)??((F=i[l+1])==null?void 0:F.text),link:(typeof t.value.next=="object"?t.value.next.link:void 0)??((C=i[l+1])==null?void 0:C.link)}}})}function zo(o,e){const t=new Set;return o.filter(n=>{const a=e(n);return t.has(a)?!1:t.add(a)})}const x=_({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(o){const e=o,t=L(()=>e.tag??(e.href?"a":"span")),n=L(()=>e.href&&xe.test(e.href)||e.target==="_blank");return(a,i)=>(s(),b(Q(t.value),{class:M(["VPLink",{link:a.href,"vp-external-link-icon":n.value,"no-icon":a.noIcon}]),href:a.href?r(je)(a.href):void 0,target:a.target??(n.value?"_blank":void 0),rel:a.rel??(n.value?"noreferrer":void 0)},{default:p(()=>[c(a.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),Ao={class:"VPLastUpdated"},Bo=["datetime"],Oo=_({__name:"VPDocFooterLastUpdated",setup(o){const{theme:e,page:t,lang:n}=V(),a=L(()=>new Date(t.value.lastUpdated)),i=L(()=>a.value.toISOString()),l=H("");return te(()=>{$e(()=>{var d,m,y;l.value=new Intl.DateTimeFormat((m=(d=e.value.lastUpdated)==null?void 0:d.formatOptions)!=null&&m.forceLocale?n.value:void 0,((y=e.value.lastUpdated)==null?void 0:y.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(a.value)})}),(d,m)=>{var y;return s(),u("p",Ao,[de(A(((y=r(e).lastUpdated)==null?void 0:y.text)||r(e).lastUpdatedText||"Last updated")+": ",1),v("time",{datetime:i.value},A(l.value),9,Bo)])}}}),Fo=$(Oo,[["__scopeId","data-v-32a58613"]]),it=o=>(G("data-v-35768638"),o=o(),q(),o),Do={key:0,class:"VPDocFooter"},jo={key:0,class:"edit-info"},Uo={key:0,class:"edit-link"},Go=it(()=>v("span",{class:"vpi-square-pen edit-link-icon"},null,-1)),qo={key:1,class:"last-updated"},Wo={key:1,class:"prev-next","aria-labelledby":"doc-footer-aria-label"},Ro=it(()=>v("span",{class:"visually-hidden",id:"doc-footer-aria-label"},"Pager",-1)),Ko={class:"pager"},Jo=["innerHTML"],Yo=["innerHTML"],Xo={class:"pager"},Zo=["innerHTML"],Qo=["innerHTML"],xo=_({__name:"VPDocFooter",setup(o){const{theme:e,page:t,frontmatter:n}=V(),a=Ho(),i=Mo(),l=L(()=>e.value.editLink&&n.value.editLink!==!1),d=L(()=>t.value.lastUpdated),m=L(()=>l.value||d.value||i.value.prev||i.value.next);return(y,I)=>{var k,S,E,N;return m.value?(s(),u("footer",Do,[c(y.$slots,"doc-footer-before",{},void 0,!0),l.value||d.value?(s(),u("div",jo,[l.value?(s(),u("div",Uo,[g(x,{class:"edit-link-button",href:r(a).url,"no-icon":!0},{default:p(()=>[Go,de(" "+A(r(a).text),1)]),_:1},8,["href"])])):h("",!0),d.value?(s(),u("div",qo,[g(Fo)])):h("",!0)])):h("",!0),(k=r(i).prev)!=null&&k.link||(S=r(i).next)!=null&&S.link?(s(),u("nav",Wo,[Ro,v("div",Ko,[(E=r(i).prev)!=null&&E.link?(s(),b(x,{key:0,class:"pager-link prev",href:r(i).prev.link},{default:p(()=>{var F;return[v("span",{class:"desc",innerHTML:((F=r(e).docFooter)==null?void 0:F.prev)||"Previous page"},null,8,Jo),v("span",{class:"title",innerHTML:r(i).prev.text},null,8,Yo)]}),_:1},8,["href"])):h("",!0)]),v("div",Xo,[(N=r(i).next)!=null&&N.link?(s(),b(x,{key:0,class:"pager-link next",href:r(i).next.link},{default:p(()=>{var F;return[v("span",{class:"desc",innerHTML:((F=r(e).docFooter)==null?void 0:F.next)||"Next page"},null,8,Zo),v("span",{class:"title",innerHTML:r(i).next.text},null,8,Qo)]}),_:1},8,["href"])):h("",!0)])])):h("",!0)])):h("",!0)}}}),en=$(xo,[["__scopeId","data-v-35768638"]]),tn=o=>(G("data-v-4d316cbc"),o=o(),q(),o),on={class:"container"},nn=tn(()=>v("div",{class:"aside-curtain"},null,-1)),an={class:"aside-container"},sn={class:"aside-content"},rn={class:"content"},ln={class:"content-container"},cn={class:"main"},un=_({__name:"VPDoc",setup(o){const{theme:e}=V(),t=pe(),{hasSidebar:n,hasAside:a,leftAside:i}=oe(),l=L(()=>t.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(d,m)=>{const y=le("Content");return s(),u("div",{class:M(["VPDoc",{"has-sidebar":r(n),"has-aside":r(a)}])},[c(d.$slots,"doc-top",{},void 0,!0),v("div",on,[r(a)?(s(),u("div",{key:0,class:M(["aside",{"left-aside":r(i)}])},[nn,v("div",an,[v("div",sn,[g(Co,null,{"aside-top":p(()=>[c(d.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":p(()=>[c(d.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":p(()=>[c(d.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[c(d.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[c(d.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[c(d.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):h("",!0),v("div",rn,[v("div",ln,[c(d.$slots,"doc-before",{},void 0,!0),v("main",cn,[g(y,{class:M(["vp-doc",[l.value,r(e).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),g(en,null,{"doc-footer-before":p(()=>[c(d.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),c(d.$slots,"doc-after",{},void 0,!0)])])]),c(d.$slots,"doc-bottom",{},void 0,!0)],2)}}}),dn=$(un,[["__scopeId","data-v-4d316cbc"]]),vn=_({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{},target:{},rel:{}},setup(o){const e=o,t=L(()=>e.href&&xe.test(e.href)),n=L(()=>e.tag||(e.href?"a":"button"));return(a,i)=>(s(),b(Q(n.value),{class:M(["VPButton",[a.size,a.theme]]),href:a.href?r(je)(a.href):void 0,target:e.target??(t.value?"_blank":void 0),rel:e.rel??(t.value?"noreferrer":void 0)},{default:p(()=>[de(A(a.text),1)]),_:1},8,["class","href","target","rel"]))}}),pn=$(vn,[["__scopeId","data-v-70e9ece9"]]),mn=["src","alt"],fn=_({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(o){return(e,t)=>{const n=le("VPImage",!0);return e.image?(s(),u(B,{key:0},[typeof e.image=="string"||"src"in e.image?(s(),u("img",se({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:r(Be)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,mn)):(s(),u(B,{key:1},[g(n,se({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),g(n,se({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):h("",!0)}}}),ke=$(fn,[["__scopeId","data-v-4d0b3a1f"]]),hn=o=>(G("data-v-b684e0c8"),o=o(),q(),o),_n={class:"container"},gn={class:"main"},bn={class:"heading"},kn=["innerHTML"],$n=["innerHTML"],yn=["innerHTML"],Ln={key:0,class:"actions"},Pn={key:0,class:"image"},Sn={class:"image-container"},Vn=hn(()=>v("div",{class:"image-bg"},null,-1)),wn=_({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(o){const e=Le("hero-image-slot-exists");return(t,n)=>(s(),u("div",{class:M(["VPHero",{"has-image":t.image||r(e)}])},[v("div",_n,[v("div",gn,[c(t.$slots,"home-hero-info-before",{},void 0,!0),c(t.$slots,"home-hero-info",{},()=>[v("h1",bn,[t.name?(s(),u("span",{key:0,innerHTML:t.name,class:"name clip"},null,8,kn)):h("",!0),t.text?(s(),u("span",{key:1,innerHTML:t.text,class:"text"},null,8,$n)):h("",!0)]),t.tagline?(s(),u("p",{key:0,innerHTML:t.tagline,class:"tagline"},null,8,yn)):h("",!0)],!0),c(t.$slots,"home-hero-info-after",{},void 0,!0),t.actions?(s(),u("div",Ln,[(s(!0),u(B,null,W(t.actions,a=>(s(),u("div",{key:a.link,class:"action"},[g(pn,{tag:"a",size:"medium",theme:a.theme,text:a.text,href:a.link,target:a.target,rel:a.rel},null,8,["theme","text","href","target","rel"])]))),128))])):h("",!0),c(t.$slots,"home-hero-actions-after",{},void 0,!0)]),t.image||r(e)?(s(),u("div",Pn,[v("div",Sn,[Vn,c(t.$slots,"home-hero-image",{},()=>[t.image?(s(),b(ke,{key:0,class:"image-src",image:t.image},null,8,["image"])):h("",!0)],!0)])])):h("",!0)])],2))}}),Tn=$(wn,[["__scopeId","data-v-b684e0c8"]]),In=_({__name:"VPHomeHero",setup(o){const{frontmatter:e}=V();return(t,n)=>r(e).hero?(s(),b(Tn,{key:0,class:"VPHomeHero",name:r(e).hero.name,text:r(e).hero.text,tagline:r(e).hero.tagline,image:r(e).hero.image,actions:r(e).hero.actions},{"home-hero-info-before":p(()=>[c(t.$slots,"home-hero-info-before")]),"home-hero-info":p(()=>[c(t.$slots,"home-hero-info")]),"home-hero-info-after":p(()=>[c(t.$slots,"home-hero-info-after")]),"home-hero-actions-after":p(()=>[c(t.$slots,"home-hero-actions-after")]),"home-hero-image":p(()=>[c(t.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):h("",!0)}}),Nn=o=>(G("data-v-8c30a0c0"),o=o(),q(),o),En={class:"box"},Cn={key:0,class:"icon"},Hn=["innerHTML"],Mn=["innerHTML"],zn=["innerHTML"],An={key:4,class:"link-text"},Bn={class:"link-text-value"},On=Nn(()=>v("span",{class:"vpi-arrow-right link-text-icon"},null,-1)),Fn=_({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(o){return(e,t)=>(s(),b(x,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:p(()=>[v("article",En,[typeof e.icon=="object"&&e.icon.wrap?(s(),u("div",Cn,[g(ke,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(s(),b(ke,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(s(),u("div",{key:2,class:"icon",innerHTML:e.icon},null,8,Hn)):h("",!0),v("h2",{class:"title",innerHTML:e.title},null,8,Mn),e.details?(s(),u("p",{key:3,class:"details",innerHTML:e.details},null,8,zn)):h("",!0),e.linkText?(s(),u("div",An,[v("p",Bn,[de(A(e.linkText)+" ",1),On])])):h("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),Dn=$(Fn,[["__scopeId","data-v-8c30a0c0"]]),jn={key:0,class:"VPFeatures"},Un={class:"container"},Gn={class:"items"},qn=_({__name:"VPFeatures",props:{features:{}},setup(o){const e=o,t=L(()=>{const n=e.features.length;if(n){if(n===2)return"grid-2";if(n===3)return"grid-3";if(n%3===0)return"grid-6";if(n>3)return"grid-4"}else return});return(n,a)=>n.features?(s(),u("div",jn,[v("div",Un,[v("div",Gn,[(s(!0),u(B,null,W(n.features,i=>(s(),u("div",{key:i.title,class:M(["item",[t.value]])},[g(Dn,{icon:i.icon,title:i.title,details:i.details,link:i.link,"link-text":i.linkText,rel:i.rel,target:i.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):h("",!0)}}),Wn=$(qn,[["__scopeId","data-v-7cef5655"]]),Rn=_({__name:"VPHomeFeatures",setup(o){const{frontmatter:e}=V();return(t,n)=>r(e).features?(s(),b(Wn,{key:0,class:"VPHomeFeatures",features:r(e).features},null,8,["features"])):h("",!0)}}),Kn=_({__name:"VPHomeContent",setup(o){const{width:e}=Et({initialWidth:0,includeScrollbar:!1});return(t,n)=>(s(),u("div",{class:"vp-doc container",style:et(r(e)?{"--vp-offset":`calc(50% - ${r(e)/2}px)`}:{})},[c(t.$slots,"default",{},void 0,!0)],4))}}),Jn=$(Kn,[["__scopeId","data-v-5377254e"]]),Yn=_({__name:"VPHome",setup(o){const{frontmatter:e,theme:t}=V();return(n,a)=>{const i=le("Content");return s(),u("div",{class:M(["VPHome",{"external-link-icon-enabled":r(t).externalLinkIcon}])},[c(n.$slots,"home-hero-before",{},void 0,!0),g(In,null,{"home-hero-info-before":p(()=>[c(n.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":p(()=>[c(n.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":p(()=>[c(n.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":p(()=>[c(n.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":p(()=>[c(n.$slots,"home-hero-image",{},void 0,!0)]),_:3}),c(n.$slots,"home-hero-after",{},void 0,!0),c(n.$slots,"home-features-before",{},void 0,!0),g(Rn),c(n.$slots,"home-features-after",{},void 0,!0),r(e).markdownStyles!==!1?(s(),b(Jn,{key:0},{default:p(()=>[g(i)]),_:1})):(s(),b(i,{key:1}))],2)}}}),Xn=$(Yn,[["__scopeId","data-v-1bcd8668"]]),Zn={},Qn={class:"VPPage"};function xn(o,e){const t=le("Content");return s(),u("div",Qn,[c(o.$slots,"page-top"),g(t),c(o.$slots,"page-bottom")])}const ea=$(Zn,[["render",xn]]),ta=_({__name:"VPContent",setup(o){const{page:e,frontmatter:t}=V(),{hasSidebar:n}=oe();return(a,i)=>(s(),u("div",{class:M(["VPContent",{"has-sidebar":r(n),"is-home":r(t).layout==="home"}]),id:"VPContent"},[r(e).isNotFound?c(a.$slots,"not-found",{key:0},()=>[g(io)],!0):r(t).layout==="page"?(s(),b(ea,{key:1},{"page-top":p(()=>[c(a.$slots,"page-top",{},void 0,!0)]),"page-bottom":p(()=>[c(a.$slots,"page-bottom",{},void 0,!0)]),_:3})):r(t).layout==="home"?(s(),b(Xn,{key:2},{"home-hero-before":p(()=>[c(a.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":p(()=>[c(a.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":p(()=>[c(a.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":p(()=>[c(a.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":p(()=>[c(a.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":p(()=>[c(a.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":p(()=>[c(a.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":p(()=>[c(a.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":p(()=>[c(a.$slots,"home-features-after",{},void 0,!0)]),_:3})):r(t).layout&&r(t).layout!=="doc"?(s(),b(Q(r(t).layout),{key:3})):(s(),b(dn,{key:4},{"doc-top":p(()=>[c(a.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":p(()=>[c(a.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":p(()=>[c(a.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":p(()=>[c(a.$slots,"doc-before",{},void 0,!0)]),"doc-after":p(()=>[c(a.$slots,"doc-after",{},void 0,!0)]),"aside-top":p(()=>[c(a.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":p(()=>[c(a.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[c(a.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[c(a.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[c(a.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":p(()=>[c(a.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),oa=$(ta,[["__scopeId","data-v-8d143afd"]]),na={class:"container"},aa=["innerHTML"],sa=["innerHTML"],ra=_({__name:"VPFooter",setup(o){const{theme:e,frontmatter:t}=V(),{hasSidebar:n}=oe();return(a,i)=>r(e).footer&&r(t).footer!==!1?(s(),u("footer",{key:0,class:M(["VPFooter",{"has-sidebar":r(n)}])},[v("div",na,[r(e).footer.message?(s(),u("p",{key:0,class:"message",innerHTML:r(e).footer.message},null,8,aa)):h("",!0),r(e).footer.copyright?(s(),u("p",{key:1,class:"copyright",innerHTML:r(e).footer.copyright},null,8,sa)):h("",!0)])],2)):h("",!0)}}),ia=$(ra,[["__scopeId","data-v-45624e61"]]);function la(){const{theme:o,frontmatter:e}=V(),t=Qe([]),n=L(()=>t.value.length>0);return ye(()=>{t.value=Ue(e.value.outline??o.value.outline)}),{headers:t,hasLocalNav:n}}const ca=o=>(G("data-v-bd1fb31f"),o=o(),q(),o),ua={class:"menu-text"},da=ca(()=>v("span",{class:"vpi-chevron-right icon"},null,-1)),va={class:"header"},pa={class:"outline"},ma=_({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(o){const e=o,{theme:t}=V(),n=H(!1),a=H(0),i=H(),l=H();function d(k){var S;(S=i.value)!=null&&S.contains(k.target)||(n.value=!1)}ee(n,k=>{if(k){document.addEventListener("click",d);return}document.removeEventListener("click",d)}),Ce("Escape",()=>{n.value=!1}),ye(()=>{n.value=!1});function m(){n.value=!n.value,a.value=window.innerHeight+Math.min(window.scrollY-e.navHeight,0)}function y(k){k.target.classList.contains("outline-link")&&(l.value&&(l.value.style.transition="none"),De(()=>{n.value=!1}))}function I(){n.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(k,S)=>(s(),u("div",{class:"VPLocalNavOutlineDropdown",style:et({"--vp-vh":a.value+"px"}),ref_key:"main",ref:i},[k.headers.length>0?(s(),u("button",{key:0,onClick:m,class:M({open:n.value})},[v("span",ua,A(r(st)(r(t))),1),da],2)):(s(),u("button",{key:1,onClick:I},A(r(t).returnToTopLabel||"Return to top"),1)),g(Ae,{name:"flyout"},{default:p(()=>[n.value?(s(),u("div",{key:0,ref_key:"items",ref:l,class:"items",onClick:y},[v("div",va,[v("a",{class:"top-link",href:"#",onClick:I},A(r(t).returnToTopLabel||"Return to top"),1)]),v("div",pa,[g(rt,{headers:k.headers},null,8,["headers"])])],512)):h("",!0)]),_:1})],4))}}),fa=$(ma,[["__scopeId","data-v-bd1fb31f"]]),ha=o=>(G("data-v-3eeb2970"),o=o(),q(),o),_a={class:"container"},ga=["aria-expanded"],ba=ha(()=>v("span",{class:"vpi-align-left menu-icon"},null,-1)),ka={class:"menu-text"},$a=_({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(o){const{theme:e,frontmatter:t}=V(),{hasSidebar:n}=oe(),{headers:a}=la(),{y:i}=tt(),l=H(0);te(()=>{l.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),ye(()=>{a.value=Ue(t.value.outline??e.value.outline)});const d=L(()=>a.value.length===0),m=L(()=>d.value&&!n.value),y=L(()=>({VPLocalNav:!0,"has-sidebar":n.value,empty:d.value,fixed:m.value}));return(I,k)=>r(t).layout!=="home"&&(!m.value||r(i)>=l.value)?(s(),u("div",{key:0,class:M(y.value)},[v("div",_a,[r(n)?(s(),u("button",{key:0,class:"menu","aria-expanded":I.open,"aria-controls":"VPSidebarNav",onClick:k[0]||(k[0]=S=>I.$emit("open-menu"))},[ba,v("span",ka,A(r(e).sidebarMenuLabel||"Menu"),1)],8,ga)):h("",!0),g(fa,{headers:r(a),navHeight:l.value},null,8,["headers","navHeight"])])],2)):h("",!0)}}),ya=$($a,[["__scopeId","data-v-3eeb2970"]]);function La(){const o=H(!1);function e(){o.value=!0,window.addEventListener("resize",a)}function t(){o.value=!1,window.removeEventListener("resize",a)}function n(){o.value?t():e()}function a(){window.outerWidth>=768&&t()}const i=pe();return ee(()=>i.path,t),{isScreenOpen:o,openScreen:e,closeScreen:t,toggleScreen:n}}const Pa={},Sa={class:"VPSwitch",type:"button",role:"switch"},Va={class:"check"},wa={key:0,class:"icon"};function Ta(o,e){return s(),u("button",Sa,[v("span",Va,[o.$slots.default?(s(),u("span",wa,[c(o.$slots,"default",{},void 0,!0)])):h("",!0)])])}const Ia=$(Pa,[["render",Ta],["__scopeId","data-v-4ec3b2fe"]]),lt=o=>(G("data-v-ae950ac5"),o=o(),q(),o),Na=lt(()=>v("span",{class:"vpi-sun sun"},null,-1)),Ea=lt(()=>v("span",{class:"vpi-moon moon"},null,-1)),Ca=_({__name:"VPSwitchAppearance",setup(o){const{isDark:e,theme:t}=V(),n=Le("toggle-appearance",()=>{e.value=!e.value}),a=H("");return Fe(()=>{a.value=e.value?t.value.lightModeSwitchTitle||"Switch to light theme":t.value.darkModeSwitchTitle||"Switch to dark theme"}),(i,l)=>(s(),b(Ia,{title:a.value,class:"VPSwitchAppearance","aria-checked":r(e),onClick:r(n)},{default:p(()=>[Na,Ea]),_:1},8,["title","aria-checked","onClick"]))}}),Ge=$(Ca,[["__scopeId","data-v-ae950ac5"]]),Ha={key:0,class:"VPNavBarAppearance"},Ma=_({__name:"VPNavBarAppearance",setup(o){const{site:e}=V();return(t,n)=>r(e).appearance&&r(e).appearance!=="force-dark"&&r(e).appearance!=="force-auto"?(s(),u("div",Ha,[g(Ge)])):h("",!0)}}),za=$(Ma,[["__scopeId","data-v-764c0058"]]),qe=H();let ct=!1,Ne=0;function Aa(o){const e=H(!1);if(Pe){!ct&&Ba(),Ne++;const t=ee(qe,n=>{var a,i,l;n===o.el.value||(a=o.el.value)!=null&&a.contains(n)?(e.value=!0,(i=o.onFocus)==null||i.call(o)):(e.value=!1,(l=o.onBlur)==null||l.call(o))});Oe(()=>{t(),Ne--,Ne||Oa()})}return Ct(e)}function Ba(){document.addEventListener("focusin",ut),ct=!0,qe.value=document.activeElement}function Oa(){document.removeEventListener("focusin",ut)}function ut(){qe.value=document.activeElement}const Fa={class:"VPMenuLink"},Da=["innerHTML"],ja=_({__name:"VPMenuLink",props:{item:{}},setup(o){const{page:e}=V();return(t,n)=>(s(),u("div",Fa,[g(x,{class:M({active:r(ie)(r(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel,"no-icon":t.item.noIcon},{default:p(()=>[v("span",{innerHTML:t.item.text},null,8,Da)]),_:1},8,["class","href","target","rel","no-icon"])]))}}),Se=$(ja,[["__scopeId","data-v-acee1e57"]]),Ua={class:"VPMenuGroup"},Ga={key:0,class:"title"},qa=_({__name:"VPMenuGroup",props:{text:{},items:{}},setup(o){return(e,t)=>(s(),u("div",Ua,[e.text?(s(),u("p",Ga,A(e.text),1)):h("",!0),(s(!0),u(B,null,W(e.items,n=>(s(),u(B,null,["link"in n?(s(),b(Se,{key:0,item:n},null,8,["item"])):h("",!0)],64))),256))]))}}),Wa=$(qa,[["__scopeId","data-v-9e18ca71"]]),Ra={class:"VPMenu"},Ka={key:0,class:"items"},Ja=_({__name:"VPMenu",props:{items:{}},setup(o){return(e,t)=>(s(),u("div",Ra,[e.items?(s(),u("div",Ka,[(s(!0),u(B,null,W(e.items,n=>(s(),u(B,{key:JSON.stringify(n)},["link"in n?(s(),b(Se,{key:0,item:n},null,8,["item"])):"component"in n?(s(),b(Q(n.component),se({key:1,ref_for:!0},n.props),null,16)):(s(),b(Wa,{key:2,text:n.text,items:n.items},null,8,["text","items"]))],64))),128))])):h("",!0),c(e.$slots,"default",{},void 0,!0)]))}}),Ya=$(Ja,[["__scopeId","data-v-3e022afb"]]),Xa=o=>(G("data-v-95325d79"),o=o(),q(),o),Za=["aria-expanded","aria-label"],Qa={key:0,class:"text"},xa=["innerHTML"],es=Xa(()=>v("span",{class:"vpi-chevron-down text-icon"},null,-1)),ts={key:1,class:"vpi-more-horizontal icon"},os={class:"menu"},ns=_({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(o){const e=H(!1),t=H();Aa({el:t,onBlur:n});function n(){e.value=!1}return(a,i)=>(s(),u("div",{class:"VPFlyout",ref_key:"el",ref:t,onMouseenter:i[1]||(i[1]=l=>e.value=!0),onMouseleave:i[2]||(i[2]=l=>e.value=!1)},[v("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":e.value,"aria-label":a.label,onClick:i[0]||(i[0]=l=>e.value=!e.value)},[a.button||a.icon?(s(),u("span",Qa,[a.icon?(s(),u("span",{key:0,class:M([a.icon,"option-icon"])},null,2)):h("",!0),a.button?(s(),u("span",{key:1,innerHTML:a.button},null,8,xa)):h("",!0),es])):(s(),u("span",ts))],8,Za),v("div",os,[g(Ya,{items:a.items},{default:p(()=>[c(a.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),We=$(ns,[["__scopeId","data-v-95325d79"]]),as=["href","aria-label","innerHTML"],ss=_({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(o){const e=o,t=H();te(async()=>{var i;await De();const a=(i=t.value)==null?void 0:i.children[0];a instanceof HTMLElement&&a.className.startsWith("vpi-social-")&&(getComputedStyle(a).maskImage||getComputedStyle(a).webkitMaskImage)==="none"&&a.style.setProperty("--icon",`url('https://api.iconify.design/simple-icons/${e.icon}.svg')`)});const n=L(()=>typeof e.icon=="object"?e.icon.svg:` `);return(a,i)=>(s(),u("a",{ref_key:"el",ref:t,class:"VPSocialLink no-icon",href:a.link,"aria-label":a.ariaLabel??(typeof a.icon=="string"?a.icon:""),target:"_blank",rel:"noopener",innerHTML:n.value},null,8,as))}}),rs=$(ss,[["__scopeId","data-v-71029e87"]]),is={class:"VPSocialLinks"},ls=_({__name:"VPSocialLinks",props:{links:{}},setup(o){return(e,t)=>(s(),u("div",is,[(s(!0),u(B,null,W(e.links,({link:n,icon:a,ariaLabel:i})=>(s(),b(rs,{key:n,icon:a,link:n,ariaLabel:i},null,8,["icon","link","ariaLabel"]))),128))]))}}),Re=$(ls,[["__scopeId","data-v-c9b9e435"]]),cs={key:0,class:"group translations"},us={class:"trans-title"},ds={key:1,class:"group"},vs={class:"item appearance"},ps={class:"label"},ms={class:"appearance-action"},fs={key:2,class:"group"},hs={class:"item social-links"},_s=_({__name:"VPNavBarExtra",setup(o){const{site:e,theme:t}=V(),{localeLinks:n,currentLang:a}=me({correspondingLink:!0}),i=L(()=>n.value.length&&a.value.label||e.value.appearance||t.value.socialLinks);return(l,d)=>i.value?(s(),b(We,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:p(()=>[r(n).length&&r(a).label?(s(),u("div",cs,[v("p",us,A(r(a).label),1),(s(!0),u(B,null,W(r(n),m=>(s(),b(Se,{key:m.link,item:m},null,8,["item"]))),128))])):h("",!0),r(e).appearance&&r(e).appearance!=="force-dark"&&r(e).appearance!=="force-auto"?(s(),u("div",ds,[v("div",vs,[v("p",ps,A(r(t).darkModeSwitchLabel||"Appearance"),1),v("div",ms,[g(Ge)])])])):h("",!0),r(t).socialLinks?(s(),u("div",fs,[v("div",hs,[g(Re,{class:"social-links-list",links:r(t).socialLinks},null,8,["links"])])])):h("",!0)]),_:1})):h("",!0)}}),gs=$(_s,[["__scopeId","data-v-cc85dc96"]]),bs=o=>(G("data-v-e08ccaba"),o=o(),q(),o),ks=["aria-expanded"],$s=bs(()=>v("span",{class:"container"},[v("span",{class:"top"}),v("span",{class:"middle"}),v("span",{class:"bottom"})],-1)),ys=[$s],Ls=_({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(o){return(e,t)=>(s(),u("button",{type:"button",class:M(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:t[0]||(t[0]=n=>e.$emit("click"))},ys,10,ks))}}),Ps=$(Ls,[["__scopeId","data-v-e08ccaba"]]),Ss=["innerHTML"],Vs=_({__name:"VPNavBarMenuLink",props:{item:{}},setup(o){const{page:e}=V();return(t,n)=>(s(),b(x,{class:M({VPNavBarMenuLink:!0,active:r(ie)(r(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel,"no-icon":t.item.noIcon,tabindex:"0"},{default:p(()=>[v("span",{innerHTML:t.item.text},null,8,Ss)]),_:1},8,["class","href","target","rel","no-icon"]))}}),ws=$(Vs,[["__scopeId","data-v-bbf7f74d"]]),Ts=_({__name:"VPNavBarMenuGroup",props:{item:{}},setup(o){const e=o,{page:t}=V(),n=i=>"component"in i?!1:"link"in i?ie(t.value.relativePath,i.link,!!e.item.activeMatch):i.items.some(n),a=L(()=>n(e.item));return(i,l)=>(s(),b(We,{class:M({VPNavBarMenuGroup:!0,active:r(ie)(r(t).relativePath,i.item.activeMatch,!!i.item.activeMatch)||a.value}),button:i.item.text,items:i.item.items},null,8,["class","button","items"]))}}),Is=o=>(G("data-v-d53bf4df"),o=o(),q(),o),Ns={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},Es=Is(()=>v("span",{id:"main-nav-aria-label",class:"visually-hidden"}," Main Navigation ",-1)),Cs=_({__name:"VPNavBarMenu",setup(o){const{theme:e}=V();return(t,n)=>r(e).nav?(s(),u("nav",Ns,[Es,(s(!0),u(B,null,W(r(e).nav,a=>(s(),u(B,{key:JSON.stringify(a)},["link"in a?(s(),b(ws,{key:0,item:a},null,8,["item"])):"component"in a?(s(),b(Q(a.component),se({key:1,ref_for:!0},a.props),null,16)):(s(),b(Ts,{key:2,item:a},null,8,["item"]))],64))),128))])):h("",!0)}}),Hs=$(Cs,[["__scopeId","data-v-d53bf4df"]]);function Ms(o){const{localeIndex:e,theme:t}=V();function n(a){var N,F,C;const i=a.split("."),l=(N=t.value.search)==null?void 0:N.options,d=l&&typeof l=="object",m=d&&((C=(F=l.locales)==null?void 0:F[e.value])==null?void 0:C.translations)||null,y=d&&l.translations||null;let I=m,k=y,S=o;const E=i.pop();for(const Y of i){let X=null;const D=S==null?void 0:S[Y];D&&(X=S=D);const ne=k==null?void 0:k[Y];ne&&(X=k=ne);const Z=I==null?void 0:I[Y];Z&&(X=I=Z),D||(S=X),ne||(k=X),Z||(I=X)}return(I==null?void 0:I[E])??(k==null?void 0:k[E])??(S==null?void 0:S[E])??""}return n}const zs=["aria-label"],As={class:"DocSearch-Button-Container"},Bs=v("span",{class:"vp-icon DocSearch-Search-Icon"},null,-1),Os={class:"DocSearch-Button-Placeholder"},Fs=v("span",{class:"DocSearch-Button-Keys"},[v("kbd",{class:"DocSearch-Button-Key"}),v("kbd",{class:"DocSearch-Button-Key"},"K")],-1),Ze=_({__name:"VPNavBarSearchButton",setup(o){const t=Ms({button:{buttonText:"Search",buttonAriaLabel:"Search"}});return(n,a)=>(s(),u("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":r(t)("button.buttonAriaLabel")},[v("span",As,[Bs,v("span",Os,A(r(t)("button.buttonText")),1)]),Fs],8,zs))}}),Ds={class:"VPNavBarSearch"},js={id:"local-search"},Us={key:1,id:"docsearch"},Gs=_({__name:"VPNavBarSearch",setup(o){const e=Ht(()=>Mt(()=>import("./VPLocalSearchBox.DPqQBmGX.js"),__vite__mapDeps([0,1]))),t=()=>null,{theme:n}=V(),a=H(!1),i=H(!1);te(()=>{});function l(){a.value||(a.value=!0,setTimeout(d,16))}function d(){const k=new Event("keydown");k.key="k",k.metaKey=!0,window.dispatchEvent(k),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||d()},16)}function m(k){const S=k.target,E=S.tagName;return S.isContentEditable||E==="INPUT"||E==="SELECT"||E==="TEXTAREA"}const y=H(!1);Ce("k",k=>{(k.ctrlKey||k.metaKey)&&(k.preventDefault(),y.value=!0)}),Ce("/",k=>{m(k)||(k.preventDefault(),y.value=!0)});const I="local";return(k,S)=>{var E;return s(),u("div",Ds,[r(I)==="local"?(s(),u(B,{key:0},[y.value?(s(),b(r(e),{key:0,onClose:S[0]||(S[0]=N=>y.value=!1)})):h("",!0),v("div",js,[g(Ze,{onClick:S[1]||(S[1]=N=>y.value=!0)})])],64)):r(I)==="algolia"?(s(),u(B,{key:1},[a.value?(s(),b(r(t),{key:0,algolia:((E=r(n).search)==null?void 0:E.options)??r(n).algolia,onVnodeBeforeMount:S[2]||(S[2]=N=>i.value=!0)},null,8,["algolia"])):h("",!0),i.value?h("",!0):(s(),u("div",Us,[g(Ze,{onClick:l})]))],64)):h("",!0)])}}}),qs=_({__name:"VPNavBarSocialLinks",setup(o){const{theme:e}=V();return(t,n)=>r(e).socialLinks?(s(),b(Re,{key:0,class:"VPNavBarSocialLinks",links:r(e).socialLinks},null,8,["links"])):h("",!0)}}),Ws=$(qs,[["__scopeId","data-v-d6e28fe5"]]),Rs=["href","rel","target"],Ks=["innerHTML"],Js={key:2},Ys=_({__name:"VPNavBarTitle",setup(o){const{site:e,theme:t}=V(),{hasSidebar:n}=oe(),{currentLang:a}=me(),i=L(()=>{var m;return typeof t.value.logoLink=="string"?t.value.logoLink:(m=t.value.logoLink)==null?void 0:m.link}),l=L(()=>{var m;return typeof t.value.logoLink=="string"||(m=t.value.logoLink)==null?void 0:m.rel}),d=L(()=>{var m;return typeof t.value.logoLink=="string"||(m=t.value.logoLink)==null?void 0:m.target});return(m,y)=>(s(),u("div",{class:M(["VPNavBarTitle",{"has-sidebar":r(n)}])},[v("a",{class:"title",href:i.value??r(je)(r(a).link),rel:l.value,target:d.value},[c(m.$slots,"nav-bar-title-before",{},void 0,!0),r(t).logo?(s(),b(ke,{key:0,class:"logo",image:r(t).logo},null,8,["image"])):h("",!0),r(t).siteTitle?(s(),u("span",{key:1,innerHTML:r(t).siteTitle},null,8,Ks)):r(t).siteTitle===void 0?(s(),u("span",Js,A(r(e).title),1)):h("",!0),c(m.$slots,"nav-bar-title-after",{},void 0,!0)],8,Rs)],2))}}),Xs=$(Ys,[["__scopeId","data-v-211643ab"]]),Zs={class:"items"},Qs={class:"title"},xs=_({__name:"VPNavBarTranslations",setup(o){const{theme:e}=V(),{localeLinks:t,currentLang:n}=me({correspondingLink:!0});return(a,i)=>r(t).length&&r(n).label?(s(),b(We,{key:0,class:"VPNavBarTranslations",icon:"vpi-languages",label:r(e).langMenuLabel||"Change language"},{default:p(()=>[v("div",Zs,[v("p",Qs,A(r(n).label),1),(s(!0),u(B,null,W(r(t),l=>(s(),b(Se,{key:l.link,item:l},null,8,["item"]))),128))])]),_:1},8,["label"])):h("",!0)}}),er=$(xs,[["__scopeId","data-v-9d8c2f62"]]),tr=o=>(G("data-v-511c2cc9"),o=o(),q(),o),or={class:"wrapper"},nr={class:"container"},ar={class:"title"},sr={class:"content"},rr={class:"content-body"},ir=tr(()=>v("div",{class:"divider"},[v("div",{class:"divider-line"})],-1)),lr=_({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(o){const e=o,{y:t}=tt(),{hasSidebar:n}=oe(),{frontmatter:a}=V(),i=H({});return Fe(()=>{i.value={"has-sidebar":n.value,home:a.value.layout==="home",top:t.value===0,"screen-open":e.isScreenOpen}}),(l,d)=>(s(),u("div",{class:M(["VPNavBar",i.value])},[v("div",or,[v("div",nr,[v("div",ar,[g(Xs,null,{"nav-bar-title-before":p(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),v("div",sr,[v("div",rr,[c(l.$slots,"nav-bar-content-before",{},void 0,!0),g(Gs,{class:"search"}),g(Hs,{class:"menu"}),g(er,{class:"translations"}),g(za,{class:"appearance"}),g(Ws,{class:"social-links"}),g(gs,{class:"extra"}),c(l.$slots,"nav-bar-content-after",{},void 0,!0),g(Ps,{class:"hamburger",active:l.isScreenOpen,onClick:d[0]||(d[0]=m=>l.$emit("toggle-screen"))},null,8,["active"])])])])]),ir],2))}}),cr=$(lr,[["__scopeId","data-v-511c2cc9"]]),ur={key:0,class:"VPNavScreenAppearance"},dr={class:"text"},vr=_({__name:"VPNavScreenAppearance",setup(o){const{site:e,theme:t}=V();return(n,a)=>r(e).appearance&&r(e).appearance!=="force-dark"&&r(e).appearance!=="force-auto"?(s(),u("div",ur,[v("p",dr,A(r(t).darkModeSwitchLabel||"Appearance"),1),g(Ge)])):h("",!0)}}),pr=$(vr,[["__scopeId","data-v-15ad096a"]]),mr=["innerHTML"],fr=_({__name:"VPNavScreenMenuLink",props:{item:{}},setup(o){const e=Le("close-screen");return(t,n)=>(s(),b(x,{class:"VPNavScreenMenuLink",href:t.item.link,target:t.item.target,rel:t.item.rel,"no-icon":t.item.noIcon,onClick:r(e)},{default:p(()=>[v("span",{innerHTML:t.item.text},null,8,mr)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),hr=$(fr,[["__scopeId","data-v-4fb78c30"]]),_r=["innerHTML"],gr=_({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(o){const e=Le("close-screen");return(t,n)=>(s(),b(x,{class:"VPNavScreenMenuGroupLink",href:t.item.link,target:t.item.target,rel:t.item.rel,"no-icon":t.item.noIcon,onClick:r(e)},{default:p(()=>[v("span",{innerHTML:t.item.text},null,8,_r)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),dt=$(gr,[["__scopeId","data-v-64059e46"]]),br={class:"VPNavScreenMenuGroupSection"},kr={key:0,class:"title"},$r=_({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(o){return(e,t)=>(s(),u("div",br,[e.text?(s(),u("p",kr,A(e.text),1)):h("",!0),(s(!0),u(B,null,W(e.items,n=>(s(),b(dt,{key:n.text,item:n},null,8,["item"]))),128))]))}}),yr=$($r,[["__scopeId","data-v-52a35d42"]]),Lr=o=>(G("data-v-1e2bb94d"),o=o(),q(),o),Pr=["aria-controls","aria-expanded"],Sr=["innerHTML"],Vr=Lr(()=>v("span",{class:"vpi-plus button-icon"},null,-1)),wr=["id"],Tr={key:0,class:"item"},Ir={key:1,class:"item"},Nr={key:2,class:"group"},Er=_({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(o){const e=o,t=H(!1),n=L(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function a(){t.value=!t.value}return(i,l)=>(s(),u("div",{class:M(["VPNavScreenMenuGroup",{open:t.value}])},[v("button",{class:"button","aria-controls":n.value,"aria-expanded":t.value,onClick:a},[v("span",{class:"button-text",innerHTML:i.text},null,8,Sr),Vr],8,Pr),v("div",{id:n.value,class:"items"},[(s(!0),u(B,null,W(i.items,d=>(s(),u(B,{key:JSON.stringify(d)},["link"in d?(s(),u("div",Tr,[g(dt,{item:d},null,8,["item"])])):"component"in d?(s(),u("div",Ir,[(s(),b(Q(d.component),se({ref_for:!0},d.props,{"screen-menu":""}),null,16))])):(s(),u("div",Nr,[g(yr,{text:d.text,items:d.items},null,8,["text","items"])]))],64))),128))],8,wr)],2))}}),Cr=$(Er,[["__scopeId","data-v-1e2bb94d"]]),Hr={key:0,class:"VPNavScreenMenu"},Mr=_({__name:"VPNavScreenMenu",setup(o){const{theme:e}=V();return(t,n)=>r(e).nav?(s(),u("nav",Hr,[(s(!0),u(B,null,W(r(e).nav,a=>(s(),u(B,{key:JSON.stringify(a)},["link"in a?(s(),b(hr,{key:0,item:a},null,8,["item"])):"component"in a?(s(),b(Q(a.component),se({key:1,ref_for:!0},a.props,{"screen-menu":""}),null,16)):(s(),b(Cr,{key:2,text:a.text||"",items:a.items},null,8,["text","items"]))],64))),128))])):h("",!0)}}),zr=_({__name:"VPNavScreenSocialLinks",setup(o){const{theme:e}=V();return(t,n)=>r(e).socialLinks?(s(),b(Re,{key:0,class:"VPNavScreenSocialLinks",links:r(e).socialLinks},null,8,["links"])):h("",!0)}}),vt=o=>(G("data-v-da51982f"),o=o(),q(),o),Ar=vt(()=>v("span",{class:"vpi-languages icon lang"},null,-1)),Br=vt(()=>v("span",{class:"vpi-chevron-down icon chevron"},null,-1)),Or={class:"list"},Fr=_({__name:"VPNavScreenTranslations",setup(o){const{localeLinks:e,currentLang:t}=me({correspondingLink:!0}),n=H(!1);function a(){n.value=!n.value}return(i,l)=>r(e).length&&r(t).label?(s(),u("div",{key:0,class:M(["VPNavScreenTranslations",{open:n.value}])},[v("button",{class:"title",onClick:a},[Ar,de(" "+A(r(t).label)+" ",1),Br]),v("ul",Or,[(s(!0),u(B,null,W(r(e),d=>(s(),u("li",{key:d.link,class:"item"},[g(x,{class:"link",href:d.link},{default:p(()=>[de(A(d.text),1)]),_:2},1032,["href"])]))),128))])],2)):h("",!0)}}),Dr=$(Fr,[["__scopeId","data-v-da51982f"]]),jr={class:"container"},Ur=_({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(o){const e=H(null),t=ot(Pe?document.body:null);return(n,a)=>(s(),b(Ae,{name:"fade",onEnter:a[0]||(a[0]=i=>t.value=!0),onAfterLeave:a[1]||(a[1]=i=>t.value=!1)},{default:p(()=>[n.open?(s(),u("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e,id:"VPNavScreen"},[v("div",jr,[c(n.$slots,"nav-screen-content-before",{},void 0,!0),g(Mr,{class:"menu"}),g(Dr,{class:"translations"}),g(pr,{class:"appearance"}),g(zr,{class:"social-links"}),c(n.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):h("",!0)]),_:3}))}}),Gr=$(Ur,[["__scopeId","data-v-9cc6cbea"]]),qr={key:0,class:"VPNav"},Wr=_({__name:"VPNav",setup(o){const{isScreenOpen:e,closeScreen:t,toggleScreen:n}=La(),{frontmatter:a}=V(),i=L(()=>a.value.navbar!==!1);return nt("close-screen",t),$e(()=>{Pe&&document.documentElement.classList.toggle("hide-nav",!i.value)}),(l,d)=>i.value?(s(),u("header",qr,[g(cr,{"is-screen-open":r(e),onToggleScreen:r(n)},{"nav-bar-title-before":p(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":p(()=>[c(l.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":p(()=>[c(l.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),g(Gr,{open:r(e)},{"nav-screen-content-before":p(()=>[c(l.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":p(()=>[c(l.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):h("",!0)}}),Rr=$(Wr,[["__scopeId","data-v-1f7b0f5c"]]),pt=o=>(G("data-v-6092ddf2"),o=o(),q(),o),Kr=["role","tabindex"],Jr=pt(()=>v("div",{class:"indicator"},null,-1)),Yr=pt(()=>v("span",{class:"vpi-chevron-right caret-icon"},null,-1)),Xr=[Yr],Zr={key:1,class:"items"},Qr=_({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(o){const e=o,{collapsed:t,collapsible:n,isLink:a,isActiveLink:i,hasActiveLink:l,hasChildren:d,toggle:m}=vo(L(()=>e.item)),y=L(()=>d.value?"section":"div"),I=L(()=>a.value?"a":"div"),k=L(()=>d.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),S=L(()=>a.value?void 0:"button"),E=L(()=>[[`level-${e.depth}`],{collapsible:n.value},{collapsed:t.value},{"is-link":a.value},{"is-active":i.value},{"has-active":l.value}]);function N(C){"key"in C&&C.key!=="Enter"||!e.item.link&&m()}function F(){e.item.link&&m()}return(C,Y)=>{const X=le("VPSidebarItem",!0);return s(),b(Q(y.value),{class:M(["VPSidebarItem",E.value])},{default:p(()=>[C.item.text?(s(),u("div",se({key:0,class:"item",role:S.value},zt(C.item.items?{click:N,keydown:N}:{},!0),{tabindex:C.item.items&&0}),[Jr,C.item.link?(s(),b(x,{key:0,tag:I.value,class:"link",href:C.item.link,rel:C.item.rel,target:C.item.target},{default:p(()=>[(s(),b(Q(k.value),{class:"text",innerHTML:C.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(s(),b(Q(k.value),{key:1,class:"text",innerHTML:C.item.text},null,8,["innerHTML"])),C.item.collapsed!=null&&C.item.items&&C.item.items.length?(s(),u("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:F,onKeydown:At(F,["enter"]),tabindex:"0"},Xr,32)):h("",!0)],16,Kr)):h("",!0),C.item.items&&C.item.items.length?(s(),u("div",Zr,[C.depth<5?(s(!0),u(B,{key:0},W(C.item.items,D=>(s(),b(X,{key:D.text,item:D,depth:C.depth+1},null,8,["item","depth"]))),128)):h("",!0)])):h("",!0)]),_:1},8,["class"])}}}),xr=$(Qr,[["__scopeId","data-v-6092ddf2"]]),ei=_({__name:"VPSidebarGroup",props:{items:{}},setup(o){const e=H(!0);let t=null;return te(()=>{t=setTimeout(()=>{t=null,e.value=!1},300)}),Bt(()=>{t!=null&&(clearTimeout(t),t=null)}),(n,a)=>(s(!0),u(B,null,W(n.items,i=>(s(),u("div",{key:i.text,class:M(["group",{"no-transition":e.value}])},[g(xr,{item:i,depth:0},null,8,["item"])],2))),128))}}),ti=$(ei,[["__scopeId","data-v-7eb7a422"]]),mt=o=>(G("data-v-130e406e"),o=o(),q(),o),oi=mt(()=>v("div",{class:"curtain"},null,-1)),ni={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},ai=mt(()=>v("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),si=_({__name:"VPSidebar",props:{open:{type:Boolean}},setup(o){const{sidebarGroups:e,hasSidebar:t}=oe(),n=o,a=H(null),i=ot(Pe?document.body:null);ee([n,a],()=>{var d;n.open?(i.value=!0,(d=a.value)==null||d.focus()):i.value=!1},{immediate:!0,flush:"post"});const l=H(0);return ee(e,()=>{l.value+=1},{deep:!0}),(d,m)=>r(t)?(s(),u("aside",{key:0,class:M(["VPSidebar",{open:d.open}]),ref_key:"navEl",ref:a,onClick:m[0]||(m[0]=Ot(()=>{},["stop"]))},[oi,v("nav",ni,[ai,c(d.$slots,"sidebar-nav-before",{},void 0,!0),(s(),b(ti,{items:r(e),key:l.value},null,8,["items"])),c(d.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):h("",!0)}}),ri=$(si,[["__scopeId","data-v-130e406e"]]),ii=_({__name:"VPSkipLink",setup(o){const{theme:e}=V(),t=pe(),n=H();ee(()=>t.path,()=>n.value.focus());function a({target:i}){const l=document.getElementById(decodeURIComponent(i.hash).slice(1));if(l){const d=()=>{l.removeAttribute("tabindex"),l.removeEventListener("blur",d)};l.setAttribute("tabindex","-1"),l.addEventListener("blur",d),l.focus(),window.scrollTo(0,0)}}return(i,l)=>(s(),u(B,null,[v("span",{ref_key:"backToTop",ref:n,tabindex:"-1"},null,512),v("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:a},A(r(e).skipToContentLabel||"Skip to content"),1)],64))}}),li=$(ii,[["__scopeId","data-v-5d3e946a"]]),ci=_({__name:"Layout",setup(o){const{isOpen:e,open:t,close:n}=oe(),a=pe();ee(()=>a.path,n),uo(e,n);const{frontmatter:i}=V(),l=Ft(),d=L(()=>!!l["home-hero-image"]);return nt("hero-image-slot-exists",d),(m,y)=>{const I=le("Content");return r(i).layout!==!1?(s(),u("div",{key:0,class:M(["Layout",r(i).pageClass])},[c(m.$slots,"layout-top",{},void 0,!0),g(li),g(Yt,{class:"backdrop",show:r(e),onClick:r(n)},null,8,["show","onClick"]),g(Rr,null,{"nav-bar-title-before":p(()=>[c(m.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[c(m.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":p(()=>[c(m.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":p(()=>[c(m.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":p(()=>[c(m.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":p(()=>[c(m.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),g(ya,{open:r(e),onOpenMenu:r(t)},null,8,["open","onOpenMenu"]),g(ri,{open:r(e)},{"sidebar-nav-before":p(()=>[c(m.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":p(()=>[c(m.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),g(oa,null,{"page-top":p(()=>[c(m.$slots,"page-top",{},void 0,!0)]),"page-bottom":p(()=>[c(m.$slots,"page-bottom",{},void 0,!0)]),"not-found":p(()=>[c(m.$slots,"not-found",{},void 0,!0)]),"home-hero-before":p(()=>[c(m.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":p(()=>[c(m.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":p(()=>[c(m.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":p(()=>[c(m.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":p(()=>[c(m.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":p(()=>[c(m.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":p(()=>[c(m.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":p(()=>[c(m.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":p(()=>[c(m.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":p(()=>[c(m.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":p(()=>[c(m.$slots,"doc-before",{},void 0,!0)]),"doc-after":p(()=>[c(m.$slots,"doc-after",{},void 0,!0)]),"doc-top":p(()=>[c(m.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":p(()=>[c(m.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":p(()=>[c(m.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":p(()=>[c(m.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":p(()=>[c(m.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[c(m.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[c(m.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[c(m.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),g(ia),c(m.$slots,"layout-bottom",{},void 0,!0)],2)):(s(),b(I,{key:1}))}}}),ui=$(ci,[["__scopeId","data-v-fbfa64bf"]]),di={Layout:ui},vi={class:"ad"},pi=["src","onClick"],mi={__name:"layout",setup(o){const{Layout:e}=di,t=Dt({list:[],toLink(n){n.link?window.open(n.link):window.open(`https://cool-js.com/ad/${n.id}`)},get(){fetch("https://service.cool-js.com/api/app/info/ad/list",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({channel:1})}).then(n=>n.json()).then(n=>{this.list=n.data})}});return te(()=>{t.get()}),(n,a)=>(s(),b(r(e),null,{"sidebar-nav-before":p(()=>[v("div",vi,[(s(!0),u(B,null,W(t.list,i=>(s(),u("img",{key:i,src:i.pic,onClick:l=>t.toLink(i)},null,8,pi))),128))])]),_:1}))}},fi=$(mi,[["__scopeId","data-v-96d1ba1f"]]),_i={Layout:fi,setup(){const o=pe(),e=()=>{new qt("[data-zoomable]",{background:"var(--vp-c-bg)"})};te(()=>{e()}),ee(()=>o.path,()=>De(()=>e()))}};export{_i as R,Ms as c,V as u};
diff --git a/.vitepress/dist/assets/index.md.Dsd7aigo.js b/.vitepress/dist/assets/index.md.Dsd7aigo.js
new file mode 100644
index 0000000..bac7ded
--- /dev/null
+++ b/.vitepress/dist/assets/index.md.Dsd7aigo.js
@@ -0,0 +1 @@
+import{_ as l,a as t,o as i}from"./chunks/framework.BjhQB2K5.js";const n=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Cool Admin(Java版)","text":"一个很酷的后台管理系统开发框架","tagline":"开源免费、Ai编码、流程编排、扩展插件、模块化","actions":[{"theme":"brand","text":"快速开始","link":"/src/guide/quick.md"},{"theme":"alt","text":"源码下载","link":"/src/introduce/src"}],"image":{"src":"/show/admin.png","alt":"cool-admin"}},"features":[{"title":"Ai编码+流程编排","icon":" ","details":"框架结合Ai大模型微调训练,让Ai更懂框架,只需少量文字描述即可零代码实现部分功能。流程编排Ai开发必备神器,只需拖动配置,即可实现Ai开发的核心功能。"},{"title":"快速开发","icon":" ","details":"通过Ai自动化编码,简单功能实现零代码开发,复杂的功能也只需少量代码配置即可。大大提高软件研发速度,快速迭代,快速试错降低成本,提高市场竞争力。"},{"title":"扩展插件","icon":" ","details":"支持插件扩展,通过插件扩展功能,实现功能快速迭代。如支付、文件上传、短信等功能可以通过安装插件的方式动态继承,不需要或者需要更换,卸载重装即可,配置不用写在代码里,代码简洁清晰。"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1720593505000}'),a={name:"index.md"};function c(h,e,d,p,s,v){return i(),t("div")}const m=l(a,[["render",c]]);export{n as __pageData,m as default};
diff --git a/.vitepress/dist/assets/index.md.Dsd7aigo.lean.js b/.vitepress/dist/assets/index.md.Dsd7aigo.lean.js
new file mode 100644
index 0000000..bac7ded
--- /dev/null
+++ b/.vitepress/dist/assets/index.md.Dsd7aigo.lean.js
@@ -0,0 +1 @@
+import{_ as l,a as t,o as i}from"./chunks/framework.BjhQB2K5.js";const n=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Cool Admin(Java版)","text":"一个很酷的后台管理系统开发框架","tagline":"开源免费、Ai编码、流程编排、扩展插件、模块化","actions":[{"theme":"brand","text":"快速开始","link":"/src/guide/quick.md"},{"theme":"alt","text":"源码下载","link":"/src/introduce/src"}],"image":{"src":"/show/admin.png","alt":"cool-admin"}},"features":[{"title":"Ai编码+流程编排","icon":" ","details":"框架结合Ai大模型微调训练,让Ai更懂框架,只需少量文字描述即可零代码实现部分功能。流程编排Ai开发必备神器,只需拖动配置,即可实现Ai开发的核心功能。"},{"title":"快速开发","icon":" ","details":"通过Ai自动化编码,简单功能实现零代码开发,复杂的功能也只需少量代码配置即可。大大提高软件研发速度,快速迭代,快速试错降低成本,提高市场竞争力。"},{"title":"扩展插件","icon":" ","details":"支持插件扩展,通过插件扩展功能,实现功能快速迭代。如支付、文件上传、短信等功能可以通过安装插件的方式动态继承,不需要或者需要更换,卸载重装即可,配置不用写在代码里,代码简洁清晰。"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1720593505000}'),a={name:"index.md"};function c(h,e,d,p,s,v){return i(),t("div")}const m=l(a,[["render",c]]);export{n as __pageData,m as default};
diff --git a/.vitepress/dist/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 b/.vitepress/dist/assets/inter-italic-cyrillic-ext.r48I6akx.woff2
new file mode 100644
index 0000000..b6b603d
Binary files /dev/null and b/.vitepress/dist/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 differ
diff --git a/.vitepress/dist/assets/inter-italic-cyrillic.By2_1cv3.woff2 b/.vitepress/dist/assets/inter-italic-cyrillic.By2_1cv3.woff2
new file mode 100644
index 0000000..def40a4
Binary files /dev/null and b/.vitepress/dist/assets/inter-italic-cyrillic.By2_1cv3.woff2 differ
diff --git a/.vitepress/dist/assets/inter-italic-greek-ext.1u6EdAuj.woff2 b/.vitepress/dist/assets/inter-italic-greek-ext.1u6EdAuj.woff2
new file mode 100644
index 0000000..e070c3d
Binary files /dev/null and b/.vitepress/dist/assets/inter-italic-greek-ext.1u6EdAuj.woff2 differ
diff --git a/.vitepress/dist/assets/inter-italic-greek.DJ8dCoTZ.woff2 b/.vitepress/dist/assets/inter-italic-greek.DJ8dCoTZ.woff2
new file mode 100644
index 0000000..a3c16ca
Binary files /dev/null and b/.vitepress/dist/assets/inter-italic-greek.DJ8dCoTZ.woff2 differ
diff --git a/.vitepress/dist/assets/inter-italic-latin-ext.CN1xVJS-.woff2 b/.vitepress/dist/assets/inter-italic-latin-ext.CN1xVJS-.woff2
new file mode 100644
index 0000000..2210a89
Binary files /dev/null and b/.vitepress/dist/assets/inter-italic-latin-ext.CN1xVJS-.woff2 differ
diff --git a/.vitepress/dist/assets/inter-italic-latin.C2AdPX0b.woff2 b/.vitepress/dist/assets/inter-italic-latin.C2AdPX0b.woff2
new file mode 100644
index 0000000..790d62d
Binary files /dev/null and b/.vitepress/dist/assets/inter-italic-latin.C2AdPX0b.woff2 differ
diff --git a/.vitepress/dist/assets/inter-italic-vietnamese.BSbpV94h.woff2 b/.vitepress/dist/assets/inter-italic-vietnamese.BSbpV94h.woff2
new file mode 100644
index 0000000..1eec077
Binary files /dev/null and b/.vitepress/dist/assets/inter-italic-vietnamese.BSbpV94h.woff2 differ
diff --git a/.vitepress/dist/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 b/.vitepress/dist/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2
new file mode 100644
index 0000000..2cfe615
Binary files /dev/null and b/.vitepress/dist/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 differ
diff --git a/.vitepress/dist/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 b/.vitepress/dist/assets/inter-roman-cyrillic.C5lxZ8CY.woff2
new file mode 100644
index 0000000..e3886dd
Binary files /dev/null and b/.vitepress/dist/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 differ
diff --git a/.vitepress/dist/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 b/.vitepress/dist/assets/inter-roman-greek-ext.CqjqNYQ-.woff2
new file mode 100644
index 0000000..36d6748
Binary files /dev/null and b/.vitepress/dist/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 differ
diff --git a/.vitepress/dist/assets/inter-roman-greek.BBVDIX6e.woff2 b/.vitepress/dist/assets/inter-roman-greek.BBVDIX6e.woff2
new file mode 100644
index 0000000..2bed1e8
Binary files /dev/null and b/.vitepress/dist/assets/inter-roman-greek.BBVDIX6e.woff2 differ
diff --git a/.vitepress/dist/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 b/.vitepress/dist/assets/inter-roman-latin-ext.4ZJIpNVo.woff2
new file mode 100644
index 0000000..9a8d1e2
Binary files /dev/null and b/.vitepress/dist/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 differ
diff --git a/.vitepress/dist/assets/inter-roman-latin.Di8DUHzh.woff2 b/.vitepress/dist/assets/inter-roman-latin.Di8DUHzh.woff2
new file mode 100644
index 0000000..07d3c53
Binary files /dev/null and b/.vitepress/dist/assets/inter-roman-latin.Di8DUHzh.woff2 differ
diff --git a/.vitepress/dist/assets/inter-roman-vietnamese.BjW4sHH5.woff2 b/.vitepress/dist/assets/inter-roman-vietnamese.BjW4sHH5.woff2
new file mode 100644
index 0000000..57bdc22
Binary files /dev/null and b/.vitepress/dist/assets/inter-roman-vietnamese.BjW4sHH5.woff2 differ
diff --git a/.vitepress/dist/assets/src_about_index.md.-unb0L2u.js b/.vitepress/dist/assets/src_about_index.md.-unb0L2u.js
new file mode 100644
index 0000000..1b8bcc5
--- /dev/null
+++ b/.vitepress/dist/assets/src_about_index.md.-unb0L2u.js
@@ -0,0 +1 @@
+import{_ as a,a as e,o as t,aj as r}from"./chunks/framework.BjhQB2K5.js";const o="/show/wechat.png",i="/show/douyin.png",s="/show/mp.png",x=JSON.parse('{"title":"交流合作","description":"","frontmatter":{},"headers":[],"relativePath":"src/about/index.md","filePath":"src/about/index.md","lastUpdated":1720593505000}'),n={name:"src/about/index.md"},c=r('交流合作 如果我们的项目对你有用,欢迎加入我们大家庭一起讨论,共创一些美好的事情。
微信 扫一扫加入微信开发交流群
抖音 主要是做一些技术教程、技术分享、框架更新、插件分享等内容。你可以在这边了解到一些关于我们框架的最新动态,还可以了解到一些前沿的技术,特别是跟 Ai 相关的,有兴趣的可以关注我们。
B 站 COOL 团队哔哩哔哩官方账户
公众号 COOL 的一些最新资讯、技术分享、框架更新、插件分享等
',13),h=[c];function l(p,d,_,m,u,b){return t(),e("div",null,h)}const q=a(n,[["render",l]]);export{x as __pageData,q as default};
diff --git a/.vitepress/dist/assets/src_about_index.md.-unb0L2u.lean.js b/.vitepress/dist/assets/src_about_index.md.-unb0L2u.lean.js
new file mode 100644
index 0000000..b6a6e9c
--- /dev/null
+++ b/.vitepress/dist/assets/src_about_index.md.-unb0L2u.lean.js
@@ -0,0 +1 @@
+import{_ as a,a as e,o as t,aj as r}from"./chunks/framework.BjhQB2K5.js";const o="/show/wechat.png",i="/show/douyin.png",s="/show/mp.png",x=JSON.parse('{"title":"交流合作","description":"","frontmatter":{},"headers":[],"relativePath":"src/about/index.md","filePath":"src/about/index.md","lastUpdated":1720593505000}'),n={name:"src/about/index.md"},c=r("",13),h=[c];function l(p,d,_,m,u,b){return t(),e("div",null,h)}const q=a(n,[["render",l]]);export{x as __pageData,q as default};
diff --git a/.vitepress/dist/assets/src_guide_ai.md.aIl2n3N7.js b/.vitepress/dist/assets/src_guide_ai.md.aIl2n3N7.js
new file mode 100644
index 0000000..b90a389
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_ai.md.aIl2n3N7.js
@@ -0,0 +1 @@
+import{_ as a}from"./chunks/code.VH4xl6Z5.js";import{_ as e,a as t,o as r,aj as i}from"./chunks/framework.BjhQB2K5.js";const g=JSON.parse('{"title":"Ai 编码","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/ai.md","filePath":"src/guide/ai.md","lastUpdated":1721207284000}'),o={name:"src/guide/ai.md"},s=i('Ai 编码 通过微调大模型学习框架特有写法,实现简单功能从 Api 接口到前端页面的一键生成
B 站视频教程
在线演示
',5),_=[s];function c(n,p,d,l,m,h){return r(),t("div",null,_)}const b=e(o,[["render",c]]);export{g as __pageData,b as default};
diff --git a/.vitepress/dist/assets/src_guide_ai.md.aIl2n3N7.lean.js b/.vitepress/dist/assets/src_guide_ai.md.aIl2n3N7.lean.js
new file mode 100644
index 0000000..5591980
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_ai.md.aIl2n3N7.lean.js
@@ -0,0 +1 @@
+import{_ as a}from"./chunks/code.VH4xl6Z5.js";import{_ as e,a as t,o as r,aj as i}from"./chunks/framework.BjhQB2K5.js";const g=JSON.parse('{"title":"Ai 编码","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/ai.md","filePath":"src/guide/ai.md","lastUpdated":1721207284000}'),o={name:"src/guide/ai.md"},s=i("",5),_=[s];function c(n,p,d,l,m,h){return r(),t("div",null,_)}const b=e(o,[["render",c]]);export{g as __pageData,b as default};
diff --git a/.vitepress/dist/assets/src_guide_cache.md.DYexoE7d.js b/.vitepress/dist/assets/src_guide_cache.md.DYexoE7d.js
new file mode 100644
index 0000000..c9e91ea
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_cache.md.DYexoE7d.js
@@ -0,0 +1,49 @@
+import{_ as s,a as i,o as a,aj as n}from"./chunks/framework.BjhQB2K5.js";const y=JSON.parse('{"title":"缓存","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/cache.md","filePath":"src/guide/cache.md","lastUpdated":1724685357000}'),h={name:"src/guide/cache.md"},l=n(`缓存 为了不过多依赖环境,框架自带基于 springCache 默认实现了两种缓存
caffeine 无需额外安装软件,由 Ben Manes 开发的一个 Java 缓存库,旨在提供高性能、高效的缓存解决方案。 redis 需安装 redis,提供了一种高效且可靠的解决方案,能够显著提升应用程序的性能和响应速度。 yaml spring :
+ # caffeine 缓存
+ cache :
+ type : caffeine
+ file : cache
+
+ #redis 缓存
+# cache:
+# type: redis
+# data:
+# redis:
+# host: 127.0.0.1
+# port: 6379
+# database: 0
+# password: 可以选择你想使用的缓存,性能要求比较高或有分布式部署需求的建议配置成 redis
使用 java @ CacheConfig ( cacheNames = { "comm" })
+@ Service
+public class DemoCacheServiceImpl implements DemoCacheService {
+ @ Cacheable ( key = "targetClass + methodName +#p0" )
+ @ Override
+ public Object test (String id ) {
+ System.out. println ( "我被调用了" );
+ return "我被缓存了" ;
+ }
+} 框架特有的通用工具类,CoolCache java @ Service
+public class DemoCacheServiceImpl implements DemoCacheService {
+ @ Resource
+ CoolCache coolCache;
+
+ @ Override
+ public Object test (String id ) {
+ coolCache. set ( "a" , 1 );
+ return coolCache. get ( "a" , Integer.class);
+ }
+} 通过coolCache缓存模板,获取数据 java public Object logistics (String num) {
+ // 物流单号
+ String num = orderInfoEntity. getLogistics (). getNum ();
+ String cacheKey = "logistics:" + orderId + ":" + num;
+ // 获取物流信息
+ return coolCache. get (cacheKey, Duration. ofMinutes ( 30 ),
+ () -> {
+ // 从第三方 或者DB 获取数据
+ Object invoke = CoolPluginInvokers. invoke ( "wuliu" , "query" , num, "" );
+ if (ObjUtil. isEmpty (invoke)) {
+ return null ;
+ }
+ String result = (String) invoke;
+ return JSONUtil. parseObj (result). get ( "result" );
+ });
+} `,12),k=[l];function t(p,e,E,r,d,g){return a(),i("div",null,k)}const o=s(h,[["render",t]]);export{y as __pageData,o as default};
diff --git a/.vitepress/dist/assets/src_guide_cache.md.DYexoE7d.lean.js b/.vitepress/dist/assets/src_guide_cache.md.DYexoE7d.lean.js
new file mode 100644
index 0000000..65b6118
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_cache.md.DYexoE7d.lean.js
@@ -0,0 +1 @@
+import{_ as s,a as i,o as a,aj as n}from"./chunks/framework.BjhQB2K5.js";const y=JSON.parse('{"title":"缓存","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/cache.md","filePath":"src/guide/cache.md","lastUpdated":1724685357000}'),h={name:"src/guide/cache.md"},l=n("",12),k=[l];function t(p,e,E,r,d,g){return a(),i("div",null,k)}const o=s(h,[["render",t]]);export{y as __pageData,o as default};
diff --git a/.vitepress/dist/assets/src_guide_controller.md.ChJ_NED0.js b/.vitepress/dist/assets/src_guide_controller.md.ChJ_NED0.js
new file mode 100644
index 0000000..b324f95
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_controller.md.ChJ_NED0.js
@@ -0,0 +1,120 @@
+import{_ as s,a as i,o as a,aj as n}from"./chunks/framework.BjhQB2K5.js";const F=JSON.parse('{"title":"控制器","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/controller.md","filePath":"src/guide/controller.md","lastUpdated":1725802894000}'),h={name:"src/guide/controller.md"},k=n(`控制器 所有的 controller 都继承自 BaseController,该父类已经实现了以下六个基础方法:add、delete、update、page、list、info,可以大大简化代码,使得 controller 更加简洁。
示例 java @ Tag ( name = "测试CURD" , description = "测试CURD" )
+@ CoolRestController ( value = "/cool" , api = { "add" , "delete" , "update" , "page" , "list" , "info" })
+public class AdminDemoInfoController extends BaseController < DemoService , DemoEntity > {
+ @ Override
+ protected void init (HttpServletRequest request , JSONObject requestParams ) {
+ // 可以在这边实现一下列表数据排序规则,查询条件过滤,返回哪些字段等
+ }
+} 这样就默认实现了以下六个接口:
POST 新增 POST 删除 POST 修改 POST 分页查询 POST 查询列表 GET 根据列表查询单个信息 等 6 个接口 查询配置 java @ Tag ( name = "测试CURD" , description = "测试CURD" )
+@ CoolRestController ( value = "/cool" , api = { "add" , "delete" , "update" , "page" , "list" , "info" })
+public class AdminDemoInfoController extends BaseController < DemoService , DemoEntity > {
+ @ Override
+ protected void init (HttpServletRequest request , JSONObject requestParams ) {
+ setPageOption ( createOp () // 分页查询配置
+ . fieldEq ( "status" ) // 字段全匹配,对应请求参数中同名参数
+ . keyWordLikeFields ( "name" , "phone" ) // 需要模糊查询的字段,对应请求参数中的 keyWord
+ . select ( "name" , "phone" , "age" ) // 返回字段
+ . queryWrapper (QueryWrapper. create ())); // 其他查询方式 具体看 https://mybatis-flex.com/zh/base/querywrapper.html文档
+ setListOption ( createOp ()); // 列表查询 跟分页查询一样
+ }
+} 以上是针对Entity单表查询方式,如果我们有需要连表查询,查询另一张表的字段,这样就需要在Entity加上另一张表的的字段,针对这种场景,我们可以使用 自定义的查询方式
java public class AppMarketCouponUserController extends BaseController < MarketCouponUserService , MarketCouponUserEntity > {
+ protected void init (HttpServletRequest request , JSONObject requestParams ) {
+ setPageOption (
+ createOp ()
+ . select (MARKET_COUPON_INFO_ENTITY.ALL_COLUMNS,
+ MARKET_COUPON_USER_ENTITY.STATUS. as ( "useStatus" )) // 查询连表字段
+ . queryWrapper (
+ QueryWrapper. create ()
+ . from (MARKET_COUPON_USER_ENTITY)
+ . leftJoin (MARKET_COUPON_INFO_ENTITY) // leftJoin 连表查询
+ . on (MARKET_COUPON_USER_ENTITY.USER_ID. eq (
+ CoolSecurityUtil. getCurrentUserId ())
+ . and (MARKET_COUPON_USER_ENTITY.COUPON_ID. eq (
+ MARKET_COUPON_INFO_ENTITY.ID))))
+ . queryModeEnum (QueryModeEnum.CUSTOM) // 自定义查询模式,默认为ENTITY 实体,自定义场景主要使用在关联表查询插件,
+ // 需要返回的字段分布在各个表里,需要组装数据,通过这种方式,就不需要在entity 中加非存储数据库的字段;默认转成map,注意如果该表有json字段,
+ // 需要通过下面的 transform 手动进行转换
+ . asType (Map.class) // 默认为Map,也可以自己定义VO
+ . transform (o -> {
+ Map map = (Map) o; // 没有设置asType ,自定义类型默认为 map
+ if (ObjUtil. isNotEmpty (map. get ( "condition" ))) {
+ map. put ( "condition" ,
+ JSONUtil. toBean (map. get ( "condition" ). toString (), Map.class));
+ }
+ })); // 其他查询方式 具体看 https://mybatis-flex.com/zh/base/querywrapper.html文档
+ }
+} 查询模式queryModeEnum 还有 ENTITY_WITH_RELATIONS, 实体中 使用了关联查询 @RelationOneToMany 如下面这个订单查询,订单产品列表也一并查出
关联查询用法参考:https://mybatis-flex.com/zh/base/relations-query.html
java @ Getter
+@ Setter
+@ Table ( value = "order_info" , comment = "订单信息" )
+public class OrderInfoEntity extends BaseEntity < OrderInfoEntity > {
+
+ @ Index
+ @ ColumnDefine ( comment = "用户ID" , notNull = true )
+ private Long userId;
+ // ......
+ // 订单商品列表
+ @ Ignore
+ @ Column ( ignore = true )
+ @ RelationOneToMany ( selfField = "id" , targetField = "orderId" )
+ private List< OrderGoodsEntity > goodsList;
+} 请求参数 为了方便获取参数,框架封装了一个请求属性,将 URL、表单、body
等参数封装在了一个 JSONObject requestParams,开发者可以从中方便的获取各种参数;
java @ Tag ( name = "测试CURD" , description = "测试CURD" )
+@ CoolRestController ( value = "/cool" , api = { "add" , "delete" , "update" , "page" , "list" , "info" })
+public class AdminDemoInfoController extends BaseController < DemoService , DemoEntity > {
+ @ Override
+ protected void init (HttpServletRequest request , JSONObject requestParams ) {
+ // 可以在这边实现一下列表数据排序规则,查询条件过滤,返回哪些字段等
+ }
+
+ @ PostMapping ( "/test" )
+ public R test (@ RequestAttribute JSONObject requestparams , String user ) {
+ System.out. println (requestparams. getStr ( "user" ));
+ return R. ok ();
+ }
+} 重写实现 默认实现了通用的六个接口方法,如果不满足需求,可以在对应的 service 中重写方法。
java @ Tag ( name = "测试CURD" , description = "测试CURD" )
+@ CoolRestController ( value = "/cool" , api = { "add" , "delete" , "update" , "page" , "list" , "info" })
+public class AdminDemoInfoController extends BaseController < DemoService , DemoEntity > {
+ @ Override
+ protected void init (HttpServletRequest request , JSONObject requestParams ) {
+ // 可以在这边实现一下列表数据排序规则,查询条件过滤,返回哪些字段等
+ }
+
+ @ Override
+ @ PostMapping ( "/page" )
+ protected R page (JSONObject requestParams , CrudOption< DemoEntity > option ) {
+ // 重写逻辑
+ return super . page (requestParams, option);
+ }
+} 同样也可以对 service 进行重写
java @ Service
+public class DemoServiceImpl extends BaseServiceImpl < DemoMapper , DemoEntity > implements DemoService {
+ @ Override
+ public Object page (JSONObject requestParams , Page< DemoEntity > page , QueryWrapper< DemoEntity > queryWrapper ) {
+ // 重写逻辑
+ return super . page (requestParams, page, queryWrapper);
+ }
+} 和传统的 controller 对比一下是简化了不少,接下来我们看看实现的原理
原理 接口路由规则 // 模块目录
+├── modules
+│ └── demo(模块名)
+│ │ └── controller(接口)
+│ │ │ └── admin(后端接口)
+│ │ │ │ └── AdminDemoInfoController.java
+│ │ │ └── app(前端接口)
+│ │ │ │ └── AppDemoInfoController.java 生成的路由前缀为: /admin/demo/info/xxx 与/app/demo/info/xxx 规则为: admin(app)/模块名/AdminDemoInfoController 转成小写替换掉 admin(app)、模块名和 controller 如果在 AdminDemoInfoController.java 同级下有个 AdminDemoUserInfoController.java文件 该接口解析的前缀则是 /admin/demo/user/info/xxx
注意
这个解析规则在 v7.1.3(2024-08-25) 版本才有,在历史版本中需在 admin 包下加一级 user 包,否则这个controller eps识别不了
自定义路由注解 java public @ interface CoolRestController {
+
+ @ AliasFor ( annotation = RequestMapping.class)
+ String name () default "" ;
+
+ @ AliasFor ( annotation = RequestMapping.class)
+ String [] value () default {};
+
+ String [] api () default {};
+} 我们不直接使用 spring 自带的注解,而是对它做一层封装,controller 上加了这个注解后
将由以下这个类实现自动配置模块路由,该类继承了 spring 的 RequestMappingHandlerMapping,并重写了 getMappingForMethod 方法
根据一定规则生成 path,返回给 spring 做解析。
java public class AutoPrefixUrlMapping extends RequestMappingHandlerMapping {
+
+ @ Override
+ protected RequestMappingInfo getMappingForMethod (Method method , Class< ? > handlerType ) {
+ CoolRestController [] annotations = handlerType. getAnnotationsByType (CoolRestController.class);
+ RequestMappingInfo info = super . getMappingForMethod (method, handlerType);
+ // ... 按规则组装 path
+ info = info. mutate (). paths (path). build (). combine (info);
+ return info;
+ }
+} `,36),t=[k];function l(p,e,E,r,d,g){return a(),i("div",null,t)}const o=s(h,[["render",l]]);export{F as __pageData,o as default};
diff --git a/.vitepress/dist/assets/src_guide_controller.md.ChJ_NED0.lean.js b/.vitepress/dist/assets/src_guide_controller.md.ChJ_NED0.lean.js
new file mode 100644
index 0000000..12f6b31
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_controller.md.ChJ_NED0.lean.js
@@ -0,0 +1 @@
+import{_ as s,a as i,o as a,aj as n}from"./chunks/framework.BjhQB2K5.js";const F=JSON.parse('{"title":"控制器","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/controller.md","filePath":"src/guide/controller.md","lastUpdated":1725802894000}'),h={name:"src/guide/controller.md"},k=n("",36),t=[k];function l(p,e,E,r,d,g){return a(),i("div",null,t)}const o=s(h,[["render",l]]);export{F as __pageData,o as default};
diff --git a/.vitepress/dist/assets/src_guide_db.md.CH-r16iF.js b/.vitepress/dist/assets/src_guide_db.md.CH-r16iF.js
new file mode 100644
index 0000000..19de8c6
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_db.md.CH-r16iF.js
@@ -0,0 +1 @@
+import{_ as t,a as d,o as r,aj as e}from"./chunks/framework.BjhQB2K5.js";const m=JSON.parse('{"title":"数据库","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/db.md","filePath":"src/guide/db.md","lastUpdated":1721036629000}'),a={name:"src/guide/db.md"},s=e('数据库 Cool Admin 集成了比 Mybatis-Plus 更加强大的,Mybatis-Flex ,详细用法请查看 Mybatis-Flex 官网文档
主要特点;
更轻量:除了 MyBatis 本身,再无任何第三方依赖,因此会带来更高的自主性、把控性和稳定性。在任何一个系统中,依赖越多,稳定性越差。
更灵活:提供了非常灵活的 QueryWrapper,支持关联查询、多表查询、多主键、逻辑删除、乐观锁更新、数据填充、数据脱敏等等。
高性能:通过独特的架构,没有任何 MyBatis 拦截器、在 SQL 执行的过程中,没有任何的 SQL Parse,因此会带来指数级的性能增长。
功能对比 功能或特点 MyBatis-Flex MyBatis-Plus Fluent-MyBatis 对 entity 的基本增删改查 ✅ ✅ ✅ 分页查询 ✅ ✅ ✅ 分页查询之总量缓存 ✅ ✅ ❌ 分页查询无 SQL 解析设计(更轻量,及更高性能) ✅ ❌ ✅ 多表查询: from 多张表 ✅ ❌ ❌ 多表查询: left join、inner join 等等 ✅ ❌ ✅ 多表查询: union,union all ✅ ❌ ✅ 单主键配置 ✅ ✅ ✅ 多种 id 生成策略 ✅ ✅ ✅ 支持多主键、复合主键 ✅ ❌ ❌ 字段的 typeHandler 配置 ✅ ✅ ✅ 除了 MyBatis,无其他第三方依赖(更轻量) ✅ ❌ ❌ QueryWrapper 是否支持在微服务项目下进行 RPC 传输 ✅ ❌ 未知 逻辑删除 ✅ ✅ ✅ 乐观锁 ✅ ✅ ✅ SQL 审计 ✅ ❌ ❌ 数据填充 ✅ ✅ ✅ 数据脱敏 ✅ ✔️ (收费) ❌ 字段权限 ✅ ✔️ (收费) ❌ 字段加密 ✅ ✔️ (收费) ❌ 字典回写 ✅ ✔️ (收费) ❌ Db + Row ✅ ❌ ❌ Entity 监听 ✅ ❌ ❌ 多数据源支持 ✅ 借助其他框架或收费 ❌ 多数据源是否支持 Spring 的事务管理,比如 @Transactional 和 TransactionTemplate 等 ✅ ❌ ❌ 多数据源是否支持 "非 Spring" 项目 ✅ ❌ ❌ 多租户 ✅ ✅ ❌ 动态表名 ✅ ✅ ❌ 动态 Schema ✅ ❌ ❌
注意
以上内容来自第三方相关产品的官方文档或第三方平台,若有错误,欢迎纠正。
支持数据库 MyBatis-Flex 支持的数据库类型,如下表格所示,我们还可以通过自定义方言的方式,持续添加更多的数据库支持。
数据库 描述 mysql MySQL 数据库 mariadb MariaDB 数据库 oracle Oracle11g 及以下数据库 oracle12c Oracle12c 及以上数据库 db2 DB2 数据库 H2 H2 数据库 hsql HSQL 数据库 sqlite SQLite 数据库 postgresql PostgreSQL 数据库 sqlserver2005 SQLServer2005 数据库 sqlserver SQLServer 数据库 dm 达梦数据库 xugu 虚谷数据库 kingbasees 人大金仓数据库 phoenix Phoenix HBase 数据库 gauss Gauss 数据库 clickhouse ClickHouse 数据库 gbase 南大通用(华库)数据库 gbase-8s 南大通用数据库 GBase 8s oscar 神通数据库 sybase Sybase ASE 数据库 OceanBase OceanBase 数据库 Firebird Firebird 数据库 derby Derby 数据库 highgo 瀚高数据库 cubrid CUBRID 数据库 goldilocks GOLDILOCKS 数据库 csiidb CSIIDB 数据库 hana SAP_HANA 数据库 impala Impala 数据库 vertica Vertica 数据库 xcloud 行云数据库 redshift 亚马逊 redshift 数据库 openGauss 华为 openGauss 数据库 TDengine TDengine 数据库 informix Informix 数据库 greenplum Greenplum 数据库 uxdb 优炫数据库 Doris Doris 数据库 Hive SQL Hive 数据库 lealone Lealone 数据库 sinodb 星瑞格数据库
注意
虽然 Mybatis-flex 支持很多数据库,但是 Cool Admin 是具体的业务框架,无法做到全部支持,那样工作量太大了。但是它为我们提供了改造的可能,理论上你只需修改一些不兼容的代码就可以正常运行了。
除了 Mysql,我们正在适配:PostgreSQL、Sqlite
自动建表 根据 Java 实体,自动映射成数据库的表结构。
用过 JPA 的都知道,JPA 有一项重要的能力就是表结构自动维护,这让我们可以可以专注于业务逻辑和实体,而不需要关心数据库的表、列的配置,尤其是开发过程中频繁的新增表及变更表结构,节省了大量手动工作。
框架集成了Auto Table ,可以自动创建表,并且支持表字段的修改。
注意
切勿在生产环境开启自动建表功能,因为这可能会造成数据丢失。
',16),o=[s];function i(l,n,c,p,h,b){return r(),d("div",null,o)}const g=t(a,[["render",i]]);export{m as __pageData,g as default};
diff --git a/.vitepress/dist/assets/src_guide_db.md.CH-r16iF.lean.js b/.vitepress/dist/assets/src_guide_db.md.CH-r16iF.lean.js
new file mode 100644
index 0000000..a620b5a
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_db.md.CH-r16iF.lean.js
@@ -0,0 +1 @@
+import{_ as t,a as d,o as r,aj as e}from"./chunks/framework.BjhQB2K5.js";const m=JSON.parse('{"title":"数据库","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/db.md","filePath":"src/guide/db.md","lastUpdated":1721036629000}'),a={name:"src/guide/db.md"},s=e("",16),o=[s];function i(l,n,c,p,h,b){return r(),d("div",null,o)}const g=t(a,[["render",i]]);export{m as __pageData,g as default};
diff --git a/.vitepress/dist/assets/src_guide_deploy.md.CVc1dXEU.js b/.vitepress/dist/assets/src_guide_deploy.md.CVc1dXEU.js
new file mode 100644
index 0000000..6361cf4
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_deploy.md.CVc1dXEU.js
@@ -0,0 +1,93 @@
+import{_ as s,a as i,o as a,aj as n}from"./chunks/framework.BjhQB2K5.js";const o=JSON.parse('{"title":"项目部署","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/deploy.md","filePath":"src/guide/deploy.md","lastUpdated":1721207284000}'),l={name:"src/guide/deploy.md"},h=n(`项目部署 🔥 低价云服务器推荐
注意
以下教程以 Nodejs 版本为例,Java 版本的也可以参考
普通方式 本部署教程以 node 版本+宝塔为例,其他部署方式也可以参考这个流程。
cool-admin 部署视频教程
1、部署流程(以宝塔为例): 拉取前后端代码; 本地配置完数据库运行,等待数据库初始化完成; 打包前后端代码,打包之前注意配置生产环境的数据库配置config/config.prod.ts,查看 midway 官方多环境配置文档 ; 服务器环境准备,安装宝塔、mysql、nodejs、nginx、pnpm 等; 上传前后端代码到服务器; 安装依赖,编译打包后端服务,启动服务; 配置 nginx 反向代理; 访问域名,如果一切正常,恭喜你,部署成功! 注意
线上的数据库是需要本地传上去的,安全考虑生产环境不会自动初始化数据库; 前端访问后端的接口地址默认是前端根地址+/api,所以需要配置 nginx 反向代理/api 到后端服务; 2、推荐使用 pnpm 安装依赖 pnpm 官网
安装
配置淘宝镜像
bash pnpm config set registry https://registry.npmmirror.com 3、PM2 运行后端服务 shell // 命令行安装 pm2
+npm install pm2 -g 常用命令
shell // 启动一个服务
+pm2 start
+// 列出当前的服务
+pm2 list
+// 停止某个服务
+pm2 stop
+// 重启某个服务
+pm2 restart
+// 删除某个服务
+pm2 delete
+// 查看服务的输出日志
+pm2 logs cluster 方式启动
shell // -i 表示 number-instances 实例数量
+// max 表示 PM2将自动检测可用CPU的数量 可以自己指定数量
+pm2 start ./bootstrap.js -i max --name cool-admin ( 改成自己的应用名称 )
+
+// 重启
+pm2 restart cool-admin 日志
shell pm2 logs cool-admin
+
+// 默认的日志位置
+/root/.pm2/logs 4、nginx 配置示例 ts upstream cool {
+ server 127.0 . 0.1 : 8001 ;
+ }
+server
+{
+ ...
+ # 前端打包完放这边
+ root / home / test / front;
+
+ # 防止刷新404
+ location / {
+ try_files $uri $uri / / index.html;
+ }
+
+ # 代理服务端地址 访问 / api 表示访问服务端接口而不是静态资源
+ location / api /
+ {
+ proxy_pass http : //cool/;
+ proxy_set_header Host $host;
+ proxy_set_header X - Real - IP $remote_addr;
+ proxy_set_header X - Forwarded - For $proxy_add_x_forwarded_for;
+ proxy_set_header REMOTE - HOST $remote_addr;
+
+ proxy_cache_bypass no_cache;
+
+ #缓存相关配置
+ #proxy_cache cache_one;
+ #proxy_cache_key $host$request_uri$is_args$args;
+ #proxy_cache_valid 200 304 301 302 1h;
+
+ #持久化连接相关配置
+ proxy_connect_timeout 3000s;
+ proxy_read_timeout 86400s;
+ proxy_send_timeout 3000s;
+ #proxy_http_version 1.1 ;
+ #proxy_set_header Upgrade $http_upgrade;
+ #proxy_set_header Connection "upgrade" ;
+
+ add_header X - Cache $upstream_cache_status;
+
+ #expires 12h;
+ }
+
+ # socket需额外配置
+ location / socket {
+ proxy_pass http : //cool/socket;
+ proxy_connect_timeout 3600s; #配置点1
+ proxy_read_timeout 3600s; #配置点2,如果没效,可以考虑这个时间配置长一点
+ proxy_send_timeout 3600s; #配置点3
+ proxy_set_header Host $host;
+ proxy_set_header X - Real - IP $remote_addr;
+ proxy_set_header X - Forwarded - For $proxy_add_x_forwarded_for;
+ proxy_set_header REMOTE - HOST $remote_addr;
+ #proxy_bind $remote_addr transparent;
+ proxy_http_version 1.1 ;
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header Connection "upgrade" ;
+ rewrite / socket / (. * ) / $1 break ;
+ proxy_redirect off;
+
+ }
+} Docker 方式 docker 部署的配置方式可以参考普通的部署方式,以下是 docker 部署的简单流程;
cool-admin 部署视频教程(Docker 方式)
1、部署流程(以宝塔为例): 拉取前后端代码; 本地配置完数据库运行,等待数据库初始化完成; 打包后端和前端镜像; 创建 docker network; docker 运行后端和前端; 访问如果登录页正常出现验证码,恭喜你,部署成功! 2、打包镜像 注意
打包镜像之前,需要确保前端和后端在本地运行过一次,让前端能够自动生成eps.json文件,该文件是前端自动扫描后端接口生成的,有了该文件,前端不需要特意写调用接口的 service。
如果你是自动化部署,你需要把生成的eps.json也提交到代码仓库,否则你将无法正常访问你的 api 接口。
shell // 创建docker network
+docker network create cool
+
+// 打包后端镜像
+docker build -t cool-admin-midway:1.0 .
+
+// 打包前端镜像
+docker build -t cool-admin-vue:1.0 . 3、运行 shell // 运行后端
+docker run --network cool -p 8001:8001 --name midway cool-admin-midway:1.0
+
+// 运行后端
+docker run --network cool -p 80:80 --name vue cool-admin-vue:1.0 注意事项 docker 部署,建议将缓存换成 redis,文件上传换成云存储,如:oss,防止操作不当导致的数据丢失。
`,37),p=[h];function t(k,e,r,d,E,F){return a(),i("div",null,p)}const c=s(l,[["render",t]]);export{o as __pageData,c as default};
diff --git a/.vitepress/dist/assets/src_guide_deploy.md.CVc1dXEU.lean.js b/.vitepress/dist/assets/src_guide_deploy.md.CVc1dXEU.lean.js
new file mode 100644
index 0000000..7e144c8
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_deploy.md.CVc1dXEU.lean.js
@@ -0,0 +1 @@
+import{_ as s,a as i,o as a,aj as n}from"./chunks/framework.BjhQB2K5.js";const o=JSON.parse('{"title":"项目部署","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/deploy.md","filePath":"src/guide/deploy.md","lastUpdated":1721207284000}'),l={name:"src/guide/deploy.md"},h=n("",37),p=[h];function t(k,e,r,d,E,F){return a(),i("div",null,p)}const c=s(l,[["render",t]]);export{o as __pageData,c as default};
diff --git a/.vitepress/dist/assets/src_guide_dev.md.DM1UjwvK.js b/.vitepress/dist/assets/src_guide_dev.md.DM1UjwvK.js
new file mode 100644
index 0000000..a4efa0d
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_dev.md.DM1UjwvK.js
@@ -0,0 +1,16 @@
+import{_ as s}from"./chunks/code.VH4xl6Z5.js";import{_ as i,a,o as n,aj as e}from"./chunks/framework.BjhQB2K5.js";const l="/guide/gen-vue.png",u=JSON.parse('{"title":"开发方式","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/dev.md","filePath":"src/guide/dev.md","lastUpdated":1721036629000}'),t={name:"src/guide/dev.md"},p=e('开发方式 Cool Admin 推荐两种快速开发方式,可以大大节省开发时间,降低开发成本,提高开发效率。
Ai 全自动 零代码开发(非低代码),通过微调大模型学习框架特有写法,实现简单功能从 Api 接口到前端页面的一键生成
开发过程只需点一点,调一调,不用写一行代码
B 站视频教程
半自动 只需三步,创建实体类生成表,生成后端代码,生成前端代码
编写实体类,重启生成表; 运行代码生成器,生成 Service、Controller 等 文件:src/test/java/com/cool/CoolAdminJavaApplicationTests.java
java public class CoolCodeGeneratorTest {
+ public static void main ( String [] args ) {
+ CodeGenerator codeGenerator = new CodeGenerator ();
+ codeGenerator. init ();
+
+ CodeModel codeModel = new CodeModel ();
+ codeModel. setType (CodeTypeEnum.ADMIN);
+ codeModel. setName ( "测试CURD" );
+ codeModel. setModule ( "demo" );
+ codeModel. setEntity (DemoEntity.class);
+
+ codeGenerator. controller (codeModel);
+ codeGenerator. mapper (codeModel);
+ codeGenerator. service (codeModel);
+ }
+} 自动生成前端页面,通过管理后台菜单管理的快速创建即可生成 Ui 组件会根据字段智能选择
',15),h=[p];function k(r,d,E,o,c,g){return n(),a("div",null,h)}const _=i(t,[["render",k]]);export{u as __pageData,_ as default};
diff --git a/.vitepress/dist/assets/src_guide_dev.md.DM1UjwvK.lean.js b/.vitepress/dist/assets/src_guide_dev.md.DM1UjwvK.lean.js
new file mode 100644
index 0000000..28e3797
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_dev.md.DM1UjwvK.lean.js
@@ -0,0 +1 @@
+import{_ as s}from"./chunks/code.VH4xl6Z5.js";import{_ as i,a,o as n,aj as e}from"./chunks/framework.BjhQB2K5.js";const l="/guide/gen-vue.png",u=JSON.parse('{"title":"开发方式","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/dev.md","filePath":"src/guide/dev.md","lastUpdated":1721036629000}'),t={name:"src/guide/dev.md"},p=e("",15),h=[p];function k(r,d,E,o,c,g){return n(),a("div",null,h)}const _=i(t,[["render",k]]);export{u as __pageData,_ as default};
diff --git a/.vitepress/dist/assets/src_guide_dir.md.Bywk12Mo.js b/.vitepress/dist/assets/src_guide_dir.md.Bywk12Mo.js
new file mode 100644
index 0000000..768ebbe
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_dir.md.Bywk12Mo.js
@@ -0,0 +1,25 @@
+import{_ as s,a,o as n,aj as p}from"./chunks/framework.BjhQB2K5.js";const h=JSON.parse('{"title":"目录结构","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/dir.md","filePath":"src/guide/dir.md","lastUpdated":1721036629000}'),e={name:"src/guide/dir.md"},l=p(`目录结构 项目按照模块化的方式组织,每个模块都有其特有的功能,清晰明了便于管理。
结构 .
+main
+├─ java
+│ ├─ com.cool
+│ ├─ core 核心包
+│ │ ├─ annotation
+│ │ └─ ...
+│ ├─ modules 模块包
+│ │ ├─ base 基础模块(系统用户、菜单、资源、角色)
+│ │ │ ├─ controller
+│ │ │ ├─ entity
+│ │ │ ├─ mapper
+│ │ │ └─ service
+│ │ ├─ dict 字段模块
+│ │ ├─ plugin 插件模块
+│ │ ├─ recycle 数据回收站模块
+│ │ ├─ space 文件管理模块
+│ │ ├─ task 定时任务模块
+│ │ └─ user 用户管理模块(c端用户)
+│ └─ CoolApplication
+└─ resources 资源文件
+ ├─ cool
+ │ └─ data
+ │ └─ db 初始化数据json文件
+ └─ mapper mapper xml 文件 提示
core 为核心模块,包括一些核心的组件工具 modules 为业务模块,业务代码放在这边,在新增功能模块时,按上面的包结构新增即可 比如你有一个订单管理的模块,在 modules 新增一个 order 包,在 order 包下创建 controller、entity、mapper、service 等包
`,5),i=[l];function c(t,o,r,d,u,_){return n(),a("div",null,i)}const b=s(e,[["render",c]]);export{h as __pageData,b as default};
diff --git a/.vitepress/dist/assets/src_guide_dir.md.Bywk12Mo.lean.js b/.vitepress/dist/assets/src_guide_dir.md.Bywk12Mo.lean.js
new file mode 100644
index 0000000..7b304d2
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_dir.md.Bywk12Mo.lean.js
@@ -0,0 +1 @@
+import{_ as s,a,o as n,aj as p}from"./chunks/framework.BjhQB2K5.js";const h=JSON.parse('{"title":"目录结构","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/dir.md","filePath":"src/guide/dir.md","lastUpdated":1721036629000}'),e={name:"src/guide/dir.md"},l=p("",5),i=[l];function c(t,o,r,d,u,_){return n(),a("div",null,i)}const b=s(e,[["render",c]]);export{h as __pageData,b as default};
diff --git a/.vitepress/dist/assets/src_guide_exception.md.1HCd76m1.js b/.vitepress/dist/assets/src_guide_exception.md.1HCd76m1.js
new file mode 100644
index 0000000..f9610ba
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_exception.md.1HCd76m1.js
@@ -0,0 +1,59 @@
+import{_ as s,a as i,o as a,aj as n}from"./chunks/framework.BjhQB2K5.js";const F=JSON.parse('{"title":"统一异常处理","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/exception.md","filePath":"src/guide/exception.md","lastUpdated":1721036629000}'),h={name:"src/guide/exception.md"},k=n(`统一异常处理 提供了简化的业务异常抛出工具
CoolPreconditions.check(check != null, "用户名已存在"); 异常统一捕获 java @ RestControllerAdvice
+@ Slf4j
+public class CoolExceptionHandler {
+
+ @ ExceptionHandler (CoolException.class)
+ public R handleRRException (CoolException e ) {
+ R r = new R ();
+ r. put ( "code" , e. getCode ());
+ r. put ( "message" , e. getMessage ());
+
+ return r;
+ }
+
+ @ ExceptionHandler (DuplicateKeyException.class)
+ public R handleDuplicateKeyException (DuplicateKeyException e ) {
+ log. error (e. getMessage (), e);
+ return R. error ( "已存在该记录" );
+ }
+
+ @ ExceptionHandler (BadCredentialsException.class)
+ public R handleBadCredentialsException (BadCredentialsException e ) {
+ log. error (e. getMessage (), e);
+ return R. error ( "账户密码不正确" );
+ }
+
+ @ ExceptionHandler (HttpRequestMethodNotSupportedException.class)
+ public R handleHttpRequestMethodNotSupportedException (HttpRequestMethodNotSupportedException e ) {
+ log. error (e. getMessage (), e);
+ return R. error ( "不支持该请求方式,请区分POST、GET等请求方式是否正确" );
+ }
+
+ @ ExceptionHandler (IllegalArgumentException.class)
+ public R handleIllegalArgumentException (IllegalArgumentException e ) {
+ log. error (e. getMessage (), e);
+ return R. error (e. getMessage ());
+ }
+
+ @ ExceptionHandler (Exception.class)
+ public R handleException (Exception e ) {
+ log. error (e. getMessage (), e);
+ return R. error ();
+ }
+} 一般抛异常写法
java public Long add (JSONObject requestParams, BaseSysUserEntity entity) {
+ BaseSysUserEntity check = getOne (
+ Wrappers. < BaseSysUserEntity > lambdaQuery (). eq (BaseSysUserEntity :: getUsername, entity. getUsername ()));
+ if (check != null ) {
+ throw new CoolException ( "用户名已存在" );
+ }
+ entity. setPassword (MD5. create (). digestHex (entity. getPassword ()));
+ super . add (requestParams, entity);
+ return entity. getId ();
+} 系统提供了 业务校验的工具,无需手动通过 if 判断,在 手动抛异常 通过 CoolPreconditions.check 方法第一个参数如果为 true 即抛异常,异常信息为 "用户名已存在", 会更加简洁
java public Long add (JSONObject requestParams, BaseSysUserEntity entity) {
+ BaseSysUserEntity check = getOne (
+ Wrappers. < BaseSysUserEntity > lambdaQuery (). eq (BaseSysUserEntity :: getUsername, entity. getUsername ()));
+ CoolPreconditions. check (check != null , "用户名已存在" );
+ entity. setPassword (MD5. create (). digestHex (entity. getPassword ()));
+ super . add (requestParams, entity);
+ return entity. getId ();
+} `,9),t=[k];function l(p,e,E,r,d,g){return a(),i("div",null,t)}const c=s(h,[["render",l]]);export{F as __pageData,c as default};
diff --git a/.vitepress/dist/assets/src_guide_exception.md.1HCd76m1.lean.js b/.vitepress/dist/assets/src_guide_exception.md.1HCd76m1.lean.js
new file mode 100644
index 0000000..c7c6293
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_exception.md.1HCd76m1.lean.js
@@ -0,0 +1 @@
+import{_ as s,a as i,o as a,aj as n}from"./chunks/framework.BjhQB2K5.js";const F=JSON.parse('{"title":"统一异常处理","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/exception.md","filePath":"src/guide/exception.md","lastUpdated":1721036629000}'),h={name:"src/guide/exception.md"},k=n("",9),t=[k];function l(p,e,E,r,d,g){return a(),i("div",null,t)}const c=s(h,[["render",l]]);export{F as __pageData,c as default};
diff --git a/.vitepress/dist/assets/src_guide_flow.md.DMDsOCkF.js b/.vitepress/dist/assets/src_guide_flow.md.DMDsOCkF.js
new file mode 100644
index 0000000..056a923
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_flow.md.DMDsOCkF.js
@@ -0,0 +1 @@
+import{_ as e}from"./chunks/flow.YLaN3zCE.js";import{_ as a,a as t,o as r,aj as o}from"./chunks/framework.BjhQB2K5.js";const u=JSON.parse('{"title":"Ai 流程编排","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/flow.md","filePath":"src/guide/flow.md","lastUpdated":1722911664000}'),i={name:"src/guide/flow.md"},s=o('Ai 流程编排 视频演示
点击前往插件市场下载安装
开发 Ai 应用必备!!!
随着 Ai 的火热,很多应用希望接入 Ai 的能力,但是每次都是用代码手搓,容易把我们累死,而是也非常不灵活。
于是我们面向开发者和软件开发公司,做了一个 Ai 流程编排功能,结合知识库,通过拖动配置,很容易就能完成一个 Ai 的核心流程。
因此如果你需要开发 Ai 相关应用,这个可能会给你带来巨大的帮助。
',8),_=[s];function p(l,c,n,d,m,f){return r(),t("div",null,_)}const g=a(i,[["render",p]]);export{u as __pageData,g as default};
diff --git a/.vitepress/dist/assets/src_guide_flow.md.DMDsOCkF.lean.js b/.vitepress/dist/assets/src_guide_flow.md.DMDsOCkF.lean.js
new file mode 100644
index 0000000..54ab812
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_flow.md.DMDsOCkF.lean.js
@@ -0,0 +1 @@
+import{_ as e}from"./chunks/flow.YLaN3zCE.js";import{_ as a,a as t,o as r,aj as o}from"./chunks/framework.BjhQB2K5.js";const u=JSON.parse('{"title":"Ai 流程编排","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/flow.md","filePath":"src/guide/flow.md","lastUpdated":1722911664000}'),i={name:"src/guide/flow.md"},s=o("",8),_=[s];function p(l,c,n,d,m,f){return r(),t("div",null,_)}const g=a(i,[["render",p]]);export{u as __pageData,g as default};
diff --git a/.vitepress/dist/assets/src_guide_i18n.md.CMvzuL3k.js b/.vitepress/dist/assets/src_guide_i18n.md.CMvzuL3k.js
new file mode 100644
index 0000000..76dafc0
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_i18n.md.CMvzuL3k.js
@@ -0,0 +1,4 @@
+import{_ as i,a as l,o as a,aj as e}from"./chunks/framework.BjhQB2K5.js";const _=JSON.parse('{"title":"国际化多语言(v8.0新增)","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/i18n.md","filePath":"src/guide/i18n.md","lastUpdated":1744512083000}'),s={name:"src/guide/i18n.md"},t=e(`国际化多语言(v8.0新增) i18n(Internationalization 的缩写,首末字符 i 和 n 之间有 18 个字母)是软件国际化的标准缩写。它是指让软件支持多种语言和地区的功能,使得同一个软件可以面向不同语言地区的用户,显示相应的语言界面。
随着互联网的发展,越来越多的企业开始走向国际化,多语言的支持已经成为了一个必备的功能。Cool Admin 也对此做了支持。
实现 多语言是需要前后端共同支持的,前端请前往前端文档查看
与其它实现方案不同的是,Cool Admin前后端的多语言都是基于大模型翻译的(比传统机翻更加准确),无需手动配置,只要开启就能自动翻译,而且不需要改变任何原有代码。
以前该怎么写还是怎么写!!!
使用 1、引入插件 在官网下载并安装国际化多语言插件
安装后,框架就会自动扫描并翻译成对应的语言。
当你在控制台看到这样的输出,则代表成功
console // 翻译中
+/ i18n translate...
+// 翻译成功
+✅国际化 翻译 成功!!! 2、实现原理 只要开启并配置了国际化,在开发环境下重启,框架就会自动扫描菜单、字典、异常消息(CoolPreconditions.check...),并调用大模型对其进行翻译
翻译完成之后会默认在路径assets/i18n下生成对应种类的语言文件,如果这个文件存在
则该种类的国际化将不会进行翻译,也就是后续你有新增相关的内容,要让其再次翻译,得对应地删除相应的文件。
3、语言配置对照表
简体中文(zh-cn) 美国英语(en) 阿塞拜疆语(az) 德语(de) 葡萄牙语(pt) 西班牙语(es) 丹麦语(da) 法语(fr) 挪威语(nb-NO) 繁体中文(zh-tw) 意大利语(it) 韩语(ko) 日语(ja) 荷兰语(nl) 越南语(vi) 俄语(ru) 土耳其语(tr) 巴西葡萄牙语(pt-br) 波斯语(fa) 泰语(th) 印度尼西亚语(id) 保加利亚语(bg) 普什图语(pa) 波兰语(pl) 芬兰语(fi) 瑞典语(sv) 希腊语(el) 斯洛伐克语(sk) 加泰罗尼亚语(ca) 捷克语(cs) 乌克兰语(uk) 土库曼语(tk) 泰米尔语(ta) 拉脱维亚语(lv) 南非荷兰语(af) 爱沙尼亚语(et) 斯洛文尼亚语(sl) 阿拉伯语(ar) 希伯来语(he) 立陶宛语(lt) 蒙古语(mn) 哈萨克语(kk) 匈牙利语(hu) 罗马尼亚语(ro) 库尔德语(ku) 库尔德语 (ckb) 维吾尔语 (ug-cn) 高棉语 (km) 塞尔维亚语 (sr) 巴斯克语 (eu) 吉尔吉斯语 (ky) 亚美尼亚语 (hy-am) 克罗地亚语(hr) 世界语 (eo) 孟加拉语 (bn) 马来语 (ms) `,17),n=[t];function r(p,o,c,h,d,k){return a(),l("div",null,n)}const m=i(s,[["render",r]]);export{_ as __pageData,m as default};
diff --git a/.vitepress/dist/assets/src_guide_i18n.md.CMvzuL3k.lean.js b/.vitepress/dist/assets/src_guide_i18n.md.CMvzuL3k.lean.js
new file mode 100644
index 0000000..39a8fb6
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_i18n.md.CMvzuL3k.lean.js
@@ -0,0 +1 @@
+import{_ as i,a as l,o as a,aj as e}from"./chunks/framework.BjhQB2K5.js";const _=JSON.parse('{"title":"国际化多语言(v8.0新增)","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/i18n.md","filePath":"src/guide/i18n.md","lastUpdated":1744512083000}'),s={name:"src/guide/i18n.md"},t=e("",17),n=[t];function r(p,o,c,h,d,k){return a(),l("div",null,n)}const m=i(s,[["render",r]]);export{_ as __pageData,m as default};
diff --git a/.vitepress/dist/assets/src_guide_initData.md.BhdPvNop.js b/.vitepress/dist/assets/src_guide_initData.md.BhdPvNop.js
new file mode 100644
index 0000000..c609081
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_initData.md.BhdPvNop.js
@@ -0,0 +1,33 @@
+import{_ as s,a as i,o as a,aj as n}from"./chunks/framework.BjhQB2K5.js";const g=JSON.parse('{"title":"数据初始化","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/initData.md","filePath":"src/guide/initData.md","lastUpdated":1721812009000}'),p={name:"src/guide/initData.md"},l=n(`数据初始化 有些功能模块上线时,需要初始化一些数据
可以在 resources 下的 cool/data/db 目录创建 demo.json 文件
json 格式如下,demo 为表的名称,里面是个数组,数组里可以包含多个对象,每个对象中的 key 为表的字段,value 为对应的值
规范:实体需以 Entity 结尾
json {
+ "demo" : [
+ {
+ "keyName" : "rich" ,
+ "name" : "富文本参数" ,
+ "remark" : null
+ },
+ {
+ "keyName" : "json" ,
+ "name" : "JSON参数" ,
+ "remark" : null
+ }
+ ]
+} 创建 demo.json 文件后,在项目启动的时候会去加载该文件,并实现值的插入
处理逻辑在以下方法
java package com.cool.core;
+
+
+/**
+ * 数据库初始数据初始化 在 classpath:cool/data/db 目录下创建.json文件 并定义表数据,
+ * 由该类统一执行初始化
+ **/
+@ Slf4j
+@ RequiredArgsConstructor
+public class DBFromJsonInit implements ApplicationRunner {
+ @ Override
+ public void run (ApplicationArguments args ) {
+ // 初始化自定义的数据
+ extractedDb ();
+ // 初始化菜单数据
+ extractedMenu ();
+ log. info ( "数据初始化完成!" );
+ }
+ //......
+} 注意:如果同一张表历史已经有初始化过数据,在某个版本需要新增数据的话,要新增一个.json 文件; 比如 demoV2.json, 如果在原文件直接修改将不生效,加载成功后文件名称将被当作唯一键标识,不会重复初始化。
`,10),t=[l];function h(k,e,E,d,r,o){return a(),i("div",null,t)}const y=s(p,[["render",h]]);export{g as __pageData,y as default};
diff --git a/.vitepress/dist/assets/src_guide_initData.md.BhdPvNop.lean.js b/.vitepress/dist/assets/src_guide_initData.md.BhdPvNop.lean.js
new file mode 100644
index 0000000..bff8e46
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_initData.md.BhdPvNop.lean.js
@@ -0,0 +1 @@
+import{_ as s,a as i,o as a,aj as n}from"./chunks/framework.BjhQB2K5.js";const g=JSON.parse('{"title":"数据初始化","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/initData.md","filePath":"src/guide/initData.md","lastUpdated":1721812009000}'),p={name:"src/guide/initData.md"},l=n("",10),t=[l];function h(k,e,E,d,r,o){return a(),i("div",null,t)}const y=s(p,[["render",h]]);export{g as __pageData,y as default};
diff --git a/.vitepress/dist/assets/src_guide_lock.md.C8JTDlsP.js b/.vitepress/dist/assets/src_guide_lock.md.C8JTDlsP.js
new file mode 100644
index 0000000..350dd71
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_lock.md.C8JTDlsP.js
@@ -0,0 +1,11 @@
+import{_ as a,a as s,o as n,aj as e}from"./chunks/framework.BjhQB2K5.js";const h=JSON.parse('{"title":"锁","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/lock.md","filePath":"src/guide/lock.md","lastUpdated":1724694022000}'),p={name:"src/guide/lock.md"},t=e(`锁 简单锁的使用
如果项目中启用了redis,锁是基于redis 实现,否则使用 ReentrantLock
// 注入锁
+private final CoolLock coolLock;
+
+String key = "lockKey";
+// 尝试获取锁
+if (coolLock.tryLock(key, Duration.ofMillis(noRepeatSubmit.expireTime()))) {
+ // TODO 获取锁后的逻辑
+
+ // 释放锁
+ coolLock.unlock(key);
+} `,4),o=[t];function c(l,i,r,d,_,k){return n(),s("div",null,o)}const m=a(p,[["render",c]]);export{h as __pageData,m as default};
diff --git a/.vitepress/dist/assets/src_guide_lock.md.C8JTDlsP.lean.js b/.vitepress/dist/assets/src_guide_lock.md.C8JTDlsP.lean.js
new file mode 100644
index 0000000..560da19
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_lock.md.C8JTDlsP.lean.js
@@ -0,0 +1 @@
+import{_ as a,a as s,o as n,aj as e}from"./chunks/framework.BjhQB2K5.js";const h=JSON.parse('{"title":"锁","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/lock.md","filePath":"src/guide/lock.md","lastUpdated":1724694022000}'),p={name:"src/guide/lock.md"},t=e("",4),o=[t];function c(l,i,r,d,_,k){return n(),s("div",null,o)}const m=a(p,[["render",c]]);export{h as __pageData,m as default};
diff --git a/.vitepress/dist/assets/src_guide_noRepeatSubmit.md.CvFjLc1r.js b/.vitepress/dist/assets/src_guide_noRepeatSubmit.md.CvFjLc1r.js
new file mode 100644
index 0000000..e8caaf0
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_noRepeatSubmit.md.CvFjLc1r.js
@@ -0,0 +1,28 @@
+import{_ as s,a as i,o as a,aj as n}from"./chunks/framework.BjhQB2K5.js";const o=JSON.parse('{"title":"防重复提交","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/noRepeatSubmit.md","filePath":"src/guide/noRepeatSubmit.md","lastUpdated":1724694022000}'),t={name:"src/guide/noRepeatSubmit.md"},h=n(`防重复提交 基于用户维度的防重复提交,该接口需要登录鉴权
java @ Aspect
+@ Component
+@ RequiredArgsConstructor
+public class NoRepeatSubmitAspect {
+
+ private final CoolLock coolLock;
+
+ @ Around ( "@annotation(noRepeatSubmit)" )
+ public Object around (ProceedingJoinPoint joinPoint , NoRepeatSubmit noRepeatSubmit ) throws Throwable {
+ HttpServletRequest request = ((ServletRequestAttributes) Objects. requireNonNull (
+ RequestContextHolder. getRequestAttributes ())). getRequest ();
+ String key = request. getRequestURI () + ":" + CoolSecurityUtil. getCurrentUserId ();
+ // 加锁
+ CoolPreconditions. check ( ! coolLock. tryLock (key, Duration. ofMillis (noRepeatSubmit. expireTime ())), "请勿重复操作" );
+ try {
+ return joinPoint. proceed ();
+ } finally {
+ // 移除锁
+ coolLock. unlock (key);
+ }
+ }
+} 使用 在controller接口上加上 @NoRepeatSubmit 注解
java @ Operation ( summary = "'领取优惠券'" )
+ @ PostMapping ( "/receive" )
+ @ NoRepeatSubmit
+ public R receive (@ RequestAttribute () JSONObject requestParams) {
+ Long couponId = requestParams. get ( "couponId" , Long.class);
+ return R. ok (marketCouponInfoService. receive (couponId, CoolSecurityUtil. getCurrentUserId ()));
+ } `,5),k=[h];function p(l,e,E,r,d,g){return a(),i("div",null,k)}const c=s(t,[["render",p]]);export{o as __pageData,c as default};
diff --git a/.vitepress/dist/assets/src_guide_noRepeatSubmit.md.CvFjLc1r.lean.js b/.vitepress/dist/assets/src_guide_noRepeatSubmit.md.CvFjLc1r.lean.js
new file mode 100644
index 0000000..c8ca9fd
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_noRepeatSubmit.md.CvFjLc1r.lean.js
@@ -0,0 +1 @@
+import{_ as s,a as i,o as a,aj as n}from"./chunks/framework.BjhQB2K5.js";const o=JSON.parse('{"title":"防重复提交","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/noRepeatSubmit.md","filePath":"src/guide/noRepeatSubmit.md","lastUpdated":1724694022000}'),t={name:"src/guide/noRepeatSubmit.md"},h=n("",5),k=[h];function p(l,e,E,r,d,g){return a(),i("div",null,k)}const c=s(t,[["render",p]]);export{o as __pageData,c as default};
diff --git a/.vitepress/dist/assets/src_guide_plugin.md.DSQp6REO.js b/.vitepress/dist/assets/src_guide_plugin.md.DSQp6REO.js
new file mode 100644
index 0000000..66e3d7a
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_plugin.md.DSQp6REO.js
@@ -0,0 +1,237 @@
+import{_ as s,a as i,o as a,aj as n}from"./chunks/framework.BjhQB2K5.js";const l="/guide/plugin-install.gif",c=JSON.parse('{"title":"扩展插件","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/plugin.md","filePath":"src/guide/plugin.md","lastUpdated":1721271330000}'),p={name:"src/guide/plugin.md"},t=n('扩展插件 为了丰富系统功能,我们提供了插件系统,可以通过插件的方式来扩展系统功能。
而不用一味地堆功能,导致系统臃肿。你可以自己开发插件,也可以使用别人开发的插件。
点击前往插件市场
使用插件 1、安装 首先下载插件包,然后在系统中安装插件包。插件包可以通过官网下载插件 。
打开后台管理系统,点击左侧菜单扩展管理/插件管理,点击+按钮,选择插件包进行安装。
2、调用 安装插件之后,就可以在代码中调用插件的方法了。
java package com.cool.core.base.controller;
+
+import cn.hutool.core.util.ObjUtil;
+import com.cool.core.util.CoolPluginInvokers;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+@ Controller
+@ RequiredArgsConstructor
+public class CommonController {
+
+ @ PostMapping ( "/testPlugin/invokeMethod" )
+ @ ResponseBody
+ public String invokeMethod (@ RequestParam String key , @ RequestParam String methodName ) {
+ Object result = null ;
+ if (ObjUtil. isEmpty (methodName)) {
+ result = CoolPluginInvokers. invokePlugin (key);
+ } else {
+ result = CoolPluginInvokers. invokePlugin (key, methodName);
+ }
+ System.out. println (result);
+ return "invokeMethod Result: " + result;
+ }
+} 运行结果
2024-07-13T20:01:18.543+08:00 INFO 32615 --- [cool-admin-java] [nio-8001-exec-5] com.cool.core.util.CoolPluginInvokers : 调用插件类: test, 方法: invokePlugin 参数: []
+Hello invokePlugin
+2024-07-13T20:01:18.543+08:00 DEBUG 32615 --- [cool-admin-java] [ task-5] c.c.m.b.m.sys.BaseSysLogMapper.insert : ==> Preparing: INSERT INTO \`base_sys_log\`(\`action\`, \`ip\`, \`params\`, \`create_time\`, \`update_time\`) VALUES (?, ?, ?, now(), now())
+2024-07-13T20:01:18.544+08:00 DEBUG 32615 --- [cool-admin-java] [ task-5] c.c.m.b.m.sys.BaseSysLogMapper.insert : ==> Parameters: /testPlugin/invokeMethod(String), 127.0.0.1(String), {"key":"test"}(String)
+2024-07-13T20:01:18.554+08:00 DEBUG 32615 --- [cool-admin-java] [ task-5] c.c.m.b.m.sys.BaseSysLogMapper.insert : <== Updates: 1
+2024-07-13T20:01:18.557+08:00 INFO 32615 --- [cool-admin-java] [nio-8001-exec-5] com.cool.core.plugin.BaseCoolPlugin : 调用主应用: coolCache, 方法: set
+2024-07-13T20:01:18.558+08:00 INFO 32615 --- [cool-admin-java] [nio-8001-exec-5] com.cool.core.plugin.BaseCoolPlugin : 调用主应用: coolCache, 方法: get
+缓存结果:一个项目用COOL就够了
+2024-07-13T20:01:18.559+08:00 INFO 32615 --- [cool-admin-java] [nio-8001-exec-5] com.cool.core.plugin.BaseCoolPlugin : 调用主应用: coolPluginService, 方法: getInstance
+2024-07-13T20:01:18.564+08:00 INFO 32615 --- [cool-admin-java] [nio-8001-exec-5] com.cool.core.plugin.BaseCoolPlugin : 调用其他插件aliyun-oss, 方法: invokePlugin
+{OSSAccessKeyId=LTAI5t8xtPD99YzSJQCC, signature=krlJ0Uv96TBliAgPJI/KyI=, success_action_status=200, host=https://xxx.oss-cn-hangzhou.aliyuncs.com, policy=eyJleHB0wNy0xM1QxMjowMTo0OC41NjVaIiwiY29uZGl0aW9ucyI6W1siY29udGVudC1sZW5ndGgtcmFuZ2UiLDAsNTI0Mjg4MDBdXX0=}
+ ______ ___ ___ _____ _ ______ ____ ____ _____ ____ _____
+ .' ___ | .' \`. .' \`.|_ _| V7.x / \\ |_ _ \`.|_ \\ / _||_ _||_ \\|_ _|
+/ .' \\_|/ .-. \\/ .-. \\ | | ______ / _ \\ | | \`. \\ | \\/ | | | | \\ | |
+| | | | | || | | | | | _|______|/ ___ \\ | | | | | |\\ /| | | | | |\\ \\| |
+\\ \`.___.'\\\\ \`-' /\\ \`-' /_| |__/ | _/ / \\ \\_ _| |_.' /_| |_\\/_| |_ _| |_ _| |_\\ |_
+ \`.____ .' \`.___.' \`.___.'|________| |____| |____||______.'|_____||_____||_____||_____|\\____|
+:: https://java.cool-admin.com ::
+Hello invokePlugin 对应插件内的方法
java package com.cool.plugin;
+
+import cn.hutool.core.io.IoUtil;
+import cn.hutool.core.util.StrUtil;
+import com.cool.core.annotation.CoolPlugin;
+import com.cool.core.plugin.BaseCoolPlugin;
+import java.io.InputStream;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * - 类必须要有 @CoolPlugin 注解,一个插件jar有且只能有一个类被 @CoolPlugin 注解
+ * - 类必须继承 BaseCoolPlugin, 并实现 invokePlugin
+ * 插件方法
+ */
+@ Slf4j
+@ CoolPlugin
+public class MyCoolPlugin extends BaseCoolPlugin {
+
+ @ Override
+ public Object invokePlugin (String... params ) {
+ System.out. println ( "Hello invokePlugin" );
+ useCache ();
+ usePlugin ();
+ getParentResource ();
+ return "Hello invokePlugin" ;
+ }
+
+ /**
+ * 使用缓存,使用cool-admin的缓存,开发的时候只是模拟
+ */
+ private void useCache () {
+ // 调用主应用设置缓存
+ invokeMain ( "coolCache" , "set" , "a" , "一个项目用COOL就够了" );
+ // 调用主应用获取缓存
+ Object cache =
+ invokeMain ( "coolCache" , "get" , "a" );
+ System.out. println ( "缓存结果:" + cache);
+ }
+
+ /**
+ * 调用其他插件
+ */
+ private void usePlugin () {
+ // 获得其他插件,开发的时候无法调试,只有安装到cool-admin中才能调试 xxx 为插件key
+ Object result = invokeOtherPlugin ( "aliyun-oss" , "invokePlugin" );
+ System.out. println (result);
+ }
+
+ /**
+ * 获取主应用resources目录下的资源文件
+ */
+ private void getParentResource () {
+ ClassLoader classLoader = getClass (). getClassLoader ();
+ ClassLoader parentClassLoader = classLoader. getParent ();
+ // 获取主应用resources下的 banner.txt 文件内容
+ InputStream inputStream = parentClassLoader. getResourceAsStream ( "banner.txt" );
+ System.out. println (StrUtil. str (IoUtil. readBytes (inputStream), "UTF-8" ));
+ }
+} 其中我们可以在插件包里通过 invokeMain 方法去调用主应用的一些对象方法
比如 coolCache 缓存对象, 通过反射实现
在加载 jar 包时会想该插件注入 ApplicationContext,使得可以在插件中获取主应用中的 bean
3、配置 有时候开发时的配置和生产环境的配置是不一样的,我们可以通过配置文件来实现。
例如原本的配置文件是这样的
json {
+ "appId" : "xxxxx" ,
+ "appSecret" : "xxxxx" ,
+ "filePath" : "banner.txt"
+} 其中 banner.txt 为主应用 resources 资源目录下的文件,路径可以自己指定,范围在 resources 下
开发插件 1、脚手架 为了方便开发插件和统一插件开发规范,我们提供了插件脚手架,可以快速开发我们的插件。
脚手架源码仓库:
https://github.com/cool-team-official/cool-admin-java-plugin
或
https://gitee.com/cool-team-official/cool-admin-java-plugin
2、目录结构 .
+main
+├─ java
+│ └─ com.cool
+│ ├─core 核心包
+│ │ ├─ annotation
+│ │ └─ ...
+│ └─ plugin
+│ └─ MyCoolPlugin 插件包,插件类放在这个包下,在打包的时候选择要打包的插件,加上@CoolPlugin注解
+├─ resources
+│ └─ plugin.json 插件信息配置文件
+test
+│
+│─ java
+│ └─ com.cool.plugin
+│ └─ MyCoolPluginTest 插件运行测试类 3、开发过程 json {
+ "name" : "测试" ,
+ "key" : "demo-plugin" ,
+ "hook" : "" ,
+ "version" : "1.0.0" ,
+ "description" : "插件描述" ,
+ "author" : "作者" ,
+ "logo" : "assets/logo.png" ,
+ "readme" : "assets/README.md" ,
+ "config" : {
+ "aaa" : "xxx" ,
+ "bbb" : "xxx"
+ }
+} config 是插件的配置信息,不同的插件有不同的配置,上面只是个例子,实际开发中可以根据自己的需求来配置,在后台插件管理里可以动态修改
4、字段解释 字段 说明 name 角色数组 key 插件唯一标识 hook 插件钩子,比如替换系统的上传组件,upload version 版本号 description 插件描述 author 作者 logo 插件 logo,建议尺寸 256x256 readme 插件介绍,会展示在插件的详情中 config 插件配置, 每个插件的配置各不相同
插件详解 java package com.cool.plugin;
+
+import com.cool.core.annotation.CoolPlugin;
+import com.cool.core.plugin.BaseCoolPlugin;
+import net.sourceforge.pinyin4j.PinyinHelper;
+import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
+import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
+import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
+
+/**
+ * - 类必须要有 @CoolPlugin 注解,一个插件jar有且只能有一个类被 @CoolPlugin 注解
+ * - 类必须继承 BaseCoolPlugin
+ */
+@ CoolPlugin
+public class DemoCoolPlugin extends BaseCoolPlugin {
+
+ @ Override
+ public Object invokePlugin (String... params ) {
+ String chineseChar = params[ 0 ]; // 汉字字符
+ HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat ();
+ format. setToneType (HanyuPinyinToneType.WITHOUT_TONE); // 不带声调
+
+ String pinyin = null ;
+ try {
+ pinyin = PinyinHelper. toHanyuPinyinString (chineseChar, format, "" );
+ } catch (BadHanyuPinyinOutputFormatCombination e ) {
+ throw new RuntimeException (e);
+ }
+ System.out. println ( "汉字:" + chineseChar + ",拼音:" + pinyin);
+ Object cache = invokeMain ( "coolCache" , "get" , "verify:img:4fd03504-47ac-4b57-b8e4-3c64059230d0" );
+ return String. format ( "hello,%s 我是插件" , chineseChar);
+ }
+} 类必须要有 @CoolPlugin 注解,一个插件 jar 有且只能有一个类被 @CoolPlugin 注解 类必须继承 BaseCoolPlugin, 并实现 invokePlugin 插件方法 满足以上条件,在插件导入时才能被识别到。 在提供的插件脚手架中已经应用了常用的依赖如 hutool 等 在开发过程中如果需要引入第三方类库,可使用 maven 引入依赖,如我们这边示例使用到了中文转拼音 xml < dependency >
+ < groupId >cn.hutool</ groupId >
+ < artifactId >hutool-all</ artifactId >
+ < version >5.8.26</ version >
+</ dependency >
+<!--***以上包在主应用已经引入,避免插件过大不会在打入jar包中***-->
+<!--***为了开发插件如果引入了主应用已经有的maven依赖可以在下面的 maven-shade-plugin 中排除掉不打入jar***-->
+<!--以下包会打入jar,主应用没有这些依赖,不然调用时会报错-->
+< dependency >
+ < groupId >com.belerweb</ groupId >
+ < artifactId >pinyin4j</ artifactId >
+ < version >2.5.0</ version >
+</ dependency > 在我们脚手架上你可以发现,我们还引入了其他包 springframework、hutool 等,这会使得打包结果很臃肿,这边使用到了 maven-shade-plugin maven 插件可以在打包的时候将在我们 cool-admin-java 主应用项目已经有的依赖给排除掉,避免打包结果过大
xml <!--***为了开发插件如果引入了主应用已经有的maven依赖可以在下面的 maven-shade-plugin 中排除掉不打入jar***-->
+< build >
+ < plugins >
+ < plugin >
+ < groupId >org.apache.maven.plugins</ groupId >
+ < artifactId >maven-shade-plugin</ artifactId >
+ < version >3.2.4</ version >
+ < executions >
+ < execution >
+ < phase >package</ phase >
+ < goals >
+ < goal >shade</ goal >
+ </ goals >
+ < configuration >
+ < artifactSet >
+ < excludes >
+ <!--主应用以有这些依赖,打包时可以排除-->
+ < exclude >org.springframework:spring-beans</ exclude >
+ < exclude >org.springframework:spring-core</ exclude >
+ < exclude >org.springframework:spring-jcl</ exclude >
+ < exclude >org.springframework:spring-context</ exclude >
+ < exclude >org.springframework:spring-aop</ exclude >
+ < exclude >org.springframework:spring-expression</ exclude >
+ < exclude >io.micrometer:micrometer-observation:jar</ exclude >
+ < exclude >io.micrometer:micrometer-commons:jar</ exclude >
+ < exclude >jakarta.annotation:jakarta.annotation-api</ exclude >
+ < exclude >org.slf4j:slf4j-api</ exclude >
+ < exclude >org.projectlombok:lombok</ exclude >
+ < exclude >cn.hutool:hutool-core</ exclude >
+ < exclude >cn.hutool:hutool-json</ exclude >
+ < exclude >org.springframework:spring-beans</ exclude >
+ < exclude >io.micrometer:micrometer-observation</ exclude >
+ < exclude >io.micrometer:micrometer-commons</ exclude >
+ </ excludes >
+ </ artifactSet >
+ </ configuration >
+ </ execution >
+ </ executions >
+ </ plugin >
+ </ plugins >
+</ build > 在执行打包的过程,可以在打包日志中查看我们排除和引入了哪些包
Including 为引入 Excluding 为排除引入 [INFO] --- maven-shade-plugin:3.2.4:shade (default) @ cool-admin-java-plugin ---
+[INFO] Including com.belerweb:pinyin4j:jar:2.5.0 in the shaded jar.
+[INFO] Excluding org.springframework:spring-beans:jar:6.1.6 from the shaded jar.
+[INFO] Excluding org.springframework:spring-core:jar:6.1.6 from the shaded jar.
+[INFO] Excluding org.springframework:spring-jcl:jar:6.1.6 from the shaded jar.
+[INFO] Excluding org.springframework:spring-context:jar:6.1.6 from the shaded jar.
+[INFO] Excluding org.springframework:spring-aop:jar:6.1.6 from the shaded jar.
+[INFO] Excluding org.springframework:spring-expression:jar:6.1.6 from the shaded jar.
+[INFO] Excluding io.micrometer:micrometer-observation:jar:1.12.5 from the shaded jar.
+[INFO] Excluding io.micrometer:micrometer-commons:jar:1.12.5 from the shaded jar.
+[INFO] Excluding jakarta.annotation:jakarta.annotation-api:jar:2.1.1 from the shaded jar.
+[INFO] Excluding org.slf4j:slf4j-api:jar:2.0.13 from the shaded jar.
+[INFO] Excluding org.projectlombok:lombok:jar:1.18.32 from the shaded jar.
+[INFO] Excluding cn.hutool:hutool-core:jar:5.8.26 from the shaded jar.
+[INFO] Excluding cn.hutool:hutool-json:jar:5.8.26 from the shaded jar. 打包 打包命令
打包结果, 在 target 目录下 .cool 后缀的文件,就是我们的插件包
target/cool-admin-java-plugin-1.0-SNAPSHOT.cool 其中对应的包名称 可在 pom.xml 中的 properties 里指定
xml < properties >
+ < cool.plugin.name >my_cool_plugin</ cool.plugin.name >
+</ properties > 最终打出的包为: my_cool_plugin.cool
安装插件 在后台插件管理页面,安装插件将打包好的.cool 文件上传。
实现原理 动态加载 Jar 包
实现动态加载的技术方案 在 SpringBoot 中实现动态加载 Jar 包: URLClassLoader 是 Java 标准库中提供的一个类加载器,它可以加载指定的 URL 资源,包括本地文件系统、远程服务器和 JAR 文件等。 通过 URLClassLoader,我们可以在运行时动态地加载外部的 Jar 包或类。
优势:
1、灵活性高:可以动态指定 Jar 包的位置和版本。 2、可控性强:可以通过代码控制加载、卸载和替换 Jar 包。
实现方法:
java URL jarUrl = new URL ( "jar:file:" + new File (jarFilePath). getAbsolutePath () + "!/" );
+DynamicJarClassLoader dynamicJarClassLoader = new DynamicJarClassLoader ( new URL []{jarUrl}, Thread. currentThread (). getContextClassLoader ()); 动态加载 Jar 包具有以下几个显著的优势:
1、灵活性: 动态加载允许应用程序在运行时根据需求加载、卸载和替换 Jar 包或其内部的类和资源,提供了极大的灵活性。 2、可维护性: 通过动态加载,可以将应用程序的核心逻辑和配置分离,使得代码更加清晰、模块化,提高了代码的可维护性。 3、热更新: 动态加载使得应用程序能够在不停机的情况下进行热更新,大大提高了系统的可用性和稳定性。 4、扩展性: 通过动态加载,可以轻松地添加新的功能模块或服务,实现应用程序的快速扩展和升级。 `,64),h=[t];function k(e,E,r,g,d,o){return a(),i("div",null,h)}const u=s(p,[["render",k]]);export{c as __pageData,u as default};
diff --git a/.vitepress/dist/assets/src_guide_plugin.md.DSQp6REO.lean.js b/.vitepress/dist/assets/src_guide_plugin.md.DSQp6REO.lean.js
new file mode 100644
index 0000000..4692aad
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_plugin.md.DSQp6REO.lean.js
@@ -0,0 +1 @@
+import{_ as s,a as i,o as a,aj as n}from"./chunks/framework.BjhQB2K5.js";const l="/guide/plugin-install.gif",c=JSON.parse('{"title":"扩展插件","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/plugin.md","filePath":"src/guide/plugin.md","lastUpdated":1721271330000}'),p={name:"src/guide/plugin.md"},t=n("",64),h=[t];function k(e,E,r,g,d,o){return a(),i("div",null,h)}const u=s(p,[["render",k]]);export{c as __pageData,u as default};
diff --git a/.vitepress/dist/assets/src_guide_quick.md.g_DIbvkh.js b/.vitepress/dist/assets/src_guide_quick.md.g_DIbvkh.js
new file mode 100644
index 0000000..82dd82c
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_quick.md.g_DIbvkh.js
@@ -0,0 +1,13 @@
+import{_ as a}from"./chunks/admin.CyLBVO1a.js";import{_ as s,a as i,o as e,aj as n}from"./chunks/framework.BjhQB2K5.js";const l="/guide/run.png",E=JSON.parse('{"title":"快速开始","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/quick.md","filePath":"src/guide/quick.md","lastUpdated":1721271330000}'),t={name:"src/guide/quick.md"},p=n(`快速开始 开始使用 Cool-Admin!!!
环境准备 Java Jdk >= 17 (注意:选择 GraalVM) Mysql >= 5.7 (推荐 8.0) Maven >= 3.6 (推荐 3.9) 运行系统 1、拉取源码 项目是前后端分离的,需要分别拉取前后端代码到本地,源码仓库
2、配置数据库 后端修改数据库配置,配置文件位于src/resources/application-local.yml
以 Mysql 为例,其他数据库适配中...
Mysql(>=5.7版本),建议 8.0,首次启动会自动初始化并导入数据
yaml # mysql,驱动已经内置,无需安装
+spring :
+ datasource :
+ url : jdbc:mysql://127.0.0.1:3306/cool?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2b8
+ username : root
+ password : 123456
+ driver-class-name : com.mysql.cj.jdbc.Driver 3、启动后端服务 启动文件:src/main/java/com/cool/CoolApplication.java,控制台打印出下面信息,说明后端服务启动成功
2024-07-15T14:38:45.382+08:00 INFO 31908 --- [cool-admin-java] [ main] c.c.c.plugin.service.CoolPluginService : 没有可初始化的插件
+2024-07-15T14:38:45.383+08:00 INFO 31908 --- [cool-admin-java] [ main] com.cool.core.eps.EpsEvent : 构建eps信息
+2024-07-15T14:38:45.941+08:00 INFO 31908 --- [cool-admin-java] [ task-1] o.springdoc.api.AbstractOpenApiResource : Init duration for springdoc-openapi is: 556 ms
+2024-07-15T14:38:46.101+08:00 INFO 31908 --- [cool-admin-java] [pool-3-thread-1] com.cool.core.eps.CoolEps : 初始化eps完成,服务启动成功,端口:8001 访问:http://127.0.0.1:8001 ,你将会看到后端的欢迎页面
4、启动前端服务 点击前往前端项目详细文档
在项目根目录下(跟 package.json 同级)执行命令:
shell # 安装依赖
+npm install
+# 启动
+npm run dev 访问http://127.0.0.1:9000/ 默认账户密码
账户:admin 密码:123456
',24),r=[p];function h(o,c,d,k,g,u){return e(),i("div",null,r)}const b=s(t,[["render",h]]);export{E as __pageData,b as default};
diff --git a/.vitepress/dist/assets/src_guide_quick.md.g_DIbvkh.lean.js b/.vitepress/dist/assets/src_guide_quick.md.g_DIbvkh.lean.js
new file mode 100644
index 0000000..401d7f2
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_quick.md.g_DIbvkh.lean.js
@@ -0,0 +1 @@
+import{_ as a}from"./chunks/admin.CyLBVO1a.js";import{_ as s,a as i,o as e,aj as n}from"./chunks/framework.BjhQB2K5.js";const l="/guide/run.png",E=JSON.parse('{"title":"快速开始","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/quick.md","filePath":"src/guide/quick.md","lastUpdated":1721271330000}'),t={name:"src/guide/quick.md"},p=n("",24),r=[p];function h(o,c,d,k,g,u){return e(),i("div",null,r)}const b=s(t,[["render",h]]);export{E as __pageData,b as default};
diff --git a/.vitepress/dist/assets/src_guide_recordLog.md.B0w4IZH7.js b/.vitepress/dist/assets/src_guide_recordLog.md.B0w4IZH7.js
new file mode 100644
index 0000000..6f2e6e9
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_recordLog.md.B0w4IZH7.js
@@ -0,0 +1,22 @@
+import{_ as s,a as i,o as a,aj as n}from"./chunks/framework.BjhQB2K5.js";const g=JSON.parse('{"title":"请求日志记录","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/recordLog.md","filePath":"src/guide/recordLog.md","lastUpdated":1722705865000}'),e={name:"src/guide/recordLog.md"},p=n(`请求日志记录 记录接口请求日志入库
java public class BaseLogFilter implements Filter {
+ @ Resource
+ private BaseSysLogService baseSysLogService;
+
+ @ Override
+ public void doFilter (ServletRequest servletRequest , ServletResponse servletResponse , FilterChain filterChain )
+ throws IOException, ServletException {
+ // 记录日志
+ HttpServletRequest request = (HttpServletRequest) servletRequest;
+ baseSysLogService. record (request, (JSONObject) request. getAttribute ( "requestParams" ));
+ filterChain. doFilter (servletRequest, servletResponse);
+ }
+
+} 同时如果个别接口需要忽略记录请求日志
可以在yml文件中配置, 默认忽略APP端接口
# 忽略url
+ignored:
+ # 忽略记录请求日志url
+ logUrls:
+ - /
+ - /app/**
+ - /css/*
+ - /js/*
+ - /favicon.ico `,6),t=[p];function l(h,k,r,d,E,c){return a(),i("div",null,t)}const y=s(e,[["render",l]]);export{g as __pageData,y as default};
diff --git a/.vitepress/dist/assets/src_guide_recordLog.md.B0w4IZH7.lean.js b/.vitepress/dist/assets/src_guide_recordLog.md.B0w4IZH7.lean.js
new file mode 100644
index 0000000..f3e59f8
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_recordLog.md.B0w4IZH7.lean.js
@@ -0,0 +1 @@
+import{_ as s,a as i,o as a,aj as n}from"./chunks/framework.BjhQB2K5.js";const g=JSON.parse('{"title":"请求日志记录","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/recordLog.md","filePath":"src/guide/recordLog.md","lastUpdated":1722705865000}'),e={name:"src/guide/recordLog.md"},p=n("",6),t=[p];function l(h,k,r,d,E,c){return a(),i("div",null,t)}const y=s(e,[["render",l]]);export{g as __pageData,y as default};
diff --git a/.vitepress/dist/assets/src_guide_security.md.BFmZQZP9.js b/.vitepress/dist/assets/src_guide_security.md.BFmZQZP9.js
new file mode 100644
index 0000000..155df27
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_security.md.BFmZQZP9.js
@@ -0,0 +1,235 @@
+import{_ as s,a as i,o as a,aj as n}from"./chunks/framework.BjhQB2K5.js";const c=JSON.parse('{"title":"权限校验","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/security.md","filePath":"src/guide/security.md","lastUpdated":1736439326000}'),h={name:"src/guide/security.md"},l=n(`权限校验 采用 spring-security 与 jwt 作为框架安全与权限校验。
配置 yaml cool :
+ # token 相关配置
+ token :
+ # 过期时间 单位:秒 半小时
+ expire : 1800
+ # 刷新token过期时间 单位:秒 7天
+ refreshExpire : 604800 原理 1、系统启动的时候,系统会查询并向spring-security 加载所有设置的权限;
java @ Component
+public class MySecurityMetadataSource implements FilterInvocationSecurityMetadataSource {
+ @ Resource
+ private BaseSysPermsService baseSysPermsService;
+
+ private Map< String , Collection< ConfigAttribute >> map = null ;
+
+ /**
+ * 加载权限表中所有操作请求权限
+ */
+ public void loadResourceDefine () {
+ map = new HashMap<>();
+ Collection< ConfigAttribute > configAttributes;
+ ConfigAttribute cfg;
+ String [] perms = baseSysPermsService. getAllPerms ();
+ // 获取启用的权限操作请求
+ for (String perm : perms) {
+ configAttributes = new ArrayList<>();
+ cfg = new SecurityConfig (perm);
+ // 作为MyAccessDecisionManager类的decide的第三个参数
+ configAttributes. add (cfg);
+ // 用权限的path作为map的key,用ConfigAttribute的集合作为value
+ map. put (perm. replaceAll ( ":" , "/" ), configAttributes);
+ }
+ }
+
+ /**
+ * 判定用户请求的url是否在权限表中 如果在权限表中,则返回给decide方法,用来判定用户是否有此权限 如果不在权限表中则放行
+ *
+ * @param o
+ * @return
+ * @throws IllegalArgumentException
+ */
+ @ Override
+ public Collection< ConfigAttribute > getAttributes (Object o ) throws IllegalArgumentException {
+ if (map == null ) {
+ loadResourceDefine ();
+ }
+ // Object中包含用户请求request
+ String url = ((FilterInvocation) o). getRequestUrl ();
+ return map. get (url. replace ( "/admin/" , "" ). split ( "[?]" )[ 0 ]);
+
+ }
+
+ @ Override
+ public Collection< ConfigAttribute > getAllConfigAttributes () {
+ return new ArrayList<>();
+ }
+
+ @ Override
+ public boolean supports (Class< ? > aClass ) {
+ return true ;
+ }
+} 2、用户登录,查询该用户所具有的权限并缓存;
java /**
+ * 获得用户信息
+ */
+@ Component
+public class JwtUserDetailsServiceImpl implements UserDetailsService {
+ @ Resource
+ private BaseSysUserService baseSysUserService;
+ @ Resource
+ private BaseSysPermsService baseSysPermsService;
+ @ Resource
+ private CoolCache coolCache;
+
+ @ Override
+ public UserDetails loadUserByUsername (String username ) throws UsernameNotFoundException {
+ BaseSysUserEntity sysUserEntity = baseSysUserService. getOne (Wrappers. < BaseSysUserEntity > lambdaQuery ()
+ . eq (BaseSysUserEntity :: getUsername, username). eq (BaseSysUserEntity :: getStatus, 1 ));
+ if (ObjectUtil. isEmpty (sysUserEntity)) {
+ throw new UsernameNotFoundException ( "用户名不存在" );
+ }
+ List< GrantedAuthority > authority = new ArrayList<>();
+ String [] perms = baseSysPermsService. getPerms (sysUserEntity. getId ());
+ for (String perm : perms) {
+ authority. add ( new SimpleGrantedAuthority (perm));
+ }
+ Long [] departmentIds = baseSysPermsService. getDepartmentIdsByRoleIds (sysUserEntity. getId ());
+ JwtUser jwtUser = new JwtUser (sysUserEntity. getUsername (), sysUserEntity. getPassword (), authority,
+ sysUserEntity. getStatus () == 1 );
+ Long [] roleIds = baseSysPermsService. getRoles (sysUserEntity);
+ coolCache. set ( "admin:userDetails:" + jwtUser. getUsername (), jwtUser);
+ coolCache. set ( "admin:passwordVersion:" + sysUserEntity. getId (), sysUserEntity. getPasswordV ());
+ coolCache. set ( "admin:userInfo:" + sysUserEntity. getId (), sysUserEntity);
+ coolCache. set ( "admin:department:" + sysUserEntity. getId (), departmentIds);
+ coolCache. set ( "admin:roleIds:" + sysUserEntity. getId (), roleIds);
+ return jwtUser;
+ }
+} 3、每次调用接口的时候spring-security 权限拦截器校验当前用户权限;
java /**
+ * 权限管理拦截器
+ * 监控用户行为
+ */
+@ Slf4j
+@ Component
+public class MyFilterSecurityInterceptor extends AbstractSecurityInterceptor implements Filter {
+ @ Resource
+ private FilterInvocationSecurityMetadataSource securityMetadataSource;
+
+
+ @ Autowired
+ public void setMyAccessDecisionManager (MyAccessDecisionManager myAccessDecisionManager ) {
+ super . setAccessDecisionManager (myAccessDecisionManager);
+ }
+
+ @ Override
+ public void init (FilterConfig filterConfig ) throws ServletException {
+ }
+
+ @ Override
+ public void doFilter (ServletRequest request , ServletResponse response , FilterChain chain ) throws IOException, ServletException {
+ FilterInvocation fi = new FilterInvocation (request, response, chain);
+ invoke (fi);
+ }
+
+ public void invoke (FilterInvocation fi ) throws IOException, ServletException {
+ InterceptorStatusToken token = super . beforeInvocation (fi);
+ try {
+ fi. getChain (). doFilter (fi. getRequest (), fi. getResponse ());
+ } finally {
+ super . afterInvocation (token, null );
+ }
+ }
+
+ @ Override
+ public void destroy () {
+ }
+
+ @ Override
+ public Class< ? > getSecureObjectClass () {
+ return FilterInvocation.class;
+ }
+
+ @ Override
+ public SecurityMetadataSource obtainSecurityMetadataSource () {
+ return this .securityMetadataSource;
+ }
+} 4.鉴权拦截配置 jwt
java @ EnableWebSecurity
+@ Configuration
+@ Slf4j
+public class JwtSecurityConfig {
+
+ // 用户详情
+ @ Resource
+ private UserDetailsService userDetailsService;
+
+ @ Resource
+ private JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter;
+ // 401
+ @ Resource
+ private EntryPointUnauthorizedHandler entryPointUnauthorizedHandler;
+ // 403
+ @ Resource
+ private RestAccessDeniedHandler restAccessDeniedHandler;
+ // 忽略权限控制的地址
+ @ Resource
+ private IgnoredUrlsProperties ignoredUrlsProperties;
+
+ @ Bean
+ public SecurityFilterChain securityFilterChain (HttpSecurity httpSecurity ) throws Exception {
+ return httpSecurity
+ . authorizeHttpRequests (
+ conf -> conf. requestMatchers (ignoredUrlsProperties. getUrls (). stream (). toArray ( String [] ::new ))
+ . permitAll (). anyRequest (). authenticated ())
+ . headers (config -> config. frameOptions (HeadersConfigurer.FrameOptionsConfig :: disable))
+ // 允许网页iframe
+ . csrf (AbstractHttpConfigurer :: disable)
+ . sessionManagement (conf -> conf. sessionCreationPolicy (SessionCreationPolicy.STATELESS))
+ . addFilterBefore (jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class)
+ . exceptionHandling (config -> {
+ config. authenticationEntryPoint (entryPointUnauthorizedHandler);
+ config. accessDeniedHandler (restAccessDeniedHandler);
+ }). build ();
+ }
+
+ @ Bean
+ public PasswordEncoder passwordEncoder () {
+ return new PasswordEncoder () {
+ @ Override
+ public String encode (CharSequence rawPassword ) {
+ return DigestUtils. md5DigestAsHex (((String) rawPassword). getBytes ());
+ }
+
+ @ Override
+ public boolean matches (CharSequence rawPassword , String encodedPassword ) {
+ return encodedPassword. equals (DigestUtils. md5DigestAsHex (((String) rawPassword). getBytes ()));
+ }
+ };
+ }
+
+ @ Bean
+ public AuthenticationProvider authenticationProvider () {
+ DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider ();
+ authProvider. setUserDetailsService (userDetailsService);
+ authProvider. setPasswordEncoder ( passwordEncoder ());
+ return authProvider;
+ }
+
+ @ Bean
+ public AuthenticationManager authenticationManager (AuthenticationConfiguration config ) throws Exception {
+ return config. getAuthenticationManager ();
+ }
+} 当前用户 获取当前用户信息
后端用户 java @ GetMapping ( "/person" )
+public R person (@ RequestAttribute () Long adminUserId); java Long userId = CoolSecurityUtil. getCurrentUserId ();
+ String username = CoolSecurityUtil. getAdminUsername (); 获得用户信息 请求过程中会解析 token,并将用户信息存在整个请求过程中的 requestParams java JSONObject userInfo = CoolSecurityUtil. getAdminUserInfo (requestParams); userInfo
字段 类型 说明 roleIds Long[] 角色数组 username String 用户名 userId Long 用户 ID passwordVersion Integer 密码版本号
应用用户 java Long userId = CoolSecurityUtil. getCurrentUserId (); 忽略 token 开放接口,忽略 token 校验
方式一: 注解 方法上 通过在方法上加TokenIgnore注解可以的接口不会进行 token 校验
java @ TokenIgnore
+@ GetMapping ( "/eps" )
+public R eps () {
+ return R. ok (coolEps. getApp ());
+} 类上 也可以注解在类上
java /**
+ * 字典信息
+ */
+@ TokenIgnore ( value = { "page" })
+@ CoolRestController ( api = { "add" , "delete" , "update" , "page" , "list" , "info" })
+public class AdminDictInfoController { } 注意
无论是注解在方法还是类上,都必须配合CoolRestController使用,其它的无效
方式二: 配置文件 在配置文件中加需要忽略的路径,支持通配
yaml # 忽略url
+ignored :
+ # 忽略后台鉴权url
+ adminAuthUrls :
+ - /
+ - /upload/**
+ - /actuator/**
+ - /download/**
+ - /static/**
+ - /favicon.ico
+ - /v3/api-docs/**
+ - /swagger
+ - /swagger-ui/**
+ - /css/*
+ - /js/*
+ - /druid/**
+ - /admin/base/open/** `,39),t=[l];function k(p,e,E,r,d,g){return a(),i("div",null,t)}const F=s(h,[["render",k]]);export{c as __pageData,F as default};
diff --git a/.vitepress/dist/assets/src_guide_security.md.BFmZQZP9.lean.js b/.vitepress/dist/assets/src_guide_security.md.BFmZQZP9.lean.js
new file mode 100644
index 0000000..2966644
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_security.md.BFmZQZP9.lean.js
@@ -0,0 +1 @@
+import{_ as s,a as i,o as a,aj as n}from"./chunks/framework.BjhQB2K5.js";const c=JSON.parse('{"title":"权限校验","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/security.md","filePath":"src/guide/security.md","lastUpdated":1736439326000}'),h={name:"src/guide/security.md"},l=n("",39),t=[l];function k(p,e,E,r,d,g){return a(),i("div",null,t)}const F=s(h,[["render",k]]);export{c as __pageData,F as default};
diff --git a/.vitepress/dist/assets/src_guide_service.md.CokY9neI.js b/.vitepress/dist/assets/src_guide_service.md.CokY9neI.js
new file mode 100644
index 0000000..bbf6540
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_service.md.CokY9neI.js
@@ -0,0 +1,20 @@
+import{_ as s,a as i,o as a,aj as n}from"./chunks/framework.BjhQB2K5.js";const g=JSON.parse('{"title":"服务","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/service.md","filePath":"src/guide/service.md","lastUpdated":1721036629000}'),e={name:"src/guide/service.md"},l=n(`服务 处理业务逻辑的代码应该被封装在服务中。
Crud BaseService中集成了常用的 CRUD 操作,可以参考BaseService的实现。
修改前后 可以重写modifyBefore和modifyAfter方法,在修改数据之前或之后做一些处理
java /**
+ * 修改之前
+ *
+ * @param requestParams 请求参数
+ * @param t 对应实体
+ * @param type 修改类型
+ */
+@ Override
+public void modifyBefore (JSONObject requestParams, T t, ModifyEnum type) {
+
+} java /**
+ * 修改之后
+ *
+ * @param requestParams 请求参数
+ * @param t 对应实体
+ * @param type 修改类型
+ */
+@ Override
+public void modifyAfter (JSONObject requestParams, T t, ModifyEnum type) {
+} `,10),p=[l];function t(h,k,r,d,c,o){return a(),i("div",null,p)}const y=s(e,[["render",t]]);export{g as __pageData,y as default};
diff --git a/.vitepress/dist/assets/src_guide_service.md.CokY9neI.lean.js b/.vitepress/dist/assets/src_guide_service.md.CokY9neI.lean.js
new file mode 100644
index 0000000..b2734b4
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_service.md.CokY9neI.lean.js
@@ -0,0 +1 @@
+import{_ as s,a as i,o as a,aj as n}from"./chunks/framework.BjhQB2K5.js";const g=JSON.parse('{"title":"服务","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/service.md","filePath":"src/guide/service.md","lastUpdated":1721036629000}'),e={name:"src/guide/service.md"},l=n("",10),p=[l];function t(h,k,r,d,c,o){return a(),i("div",null,p)}const y=s(e,[["render",t]]);export{g as __pageData,y as default};
diff --git a/.vitepress/dist/assets/src_guide_swagger.md.CCfA6TBH.js b/.vitepress/dist/assets/src_guide_swagger.md.CCfA6TBH.js
new file mode 100644
index 0000000..4076b6e
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_swagger.md.CCfA6TBH.js
@@ -0,0 +1,8 @@
+import{_ as s,a as i,o as a,aj as t}from"./chunks/framework.BjhQB2K5.js";const y=JSON.parse('{"title":"swagger 文档","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/swagger.md","filePath":"src/guide/swagger.md","lastUpdated":1720593505000}'),h={name:"src/guide/swagger.md"},n=t(`swagger 文档 默认集成springdoc ,作为文档。
java @ Tag ( name = "测试CURD" , description = "测试CURD" )
+@ CoolRestController ( value = "/cool" , api = { "add" , "delete" , "update" , "page" , "list" , "info" })
+public class AdminDemoInfoController extends BaseController < DemoService , DemoEntity > {
+ @ Override
+ protected void init (HttpServletRequest request , JSONObject requestParams ) {
+ // 可以在这边实现一下列表数据排序规则,查询条件过滤,返回哪些字段等
+ }
+} 系统启动完成访问:http://127.0.0.1:8001/swagger-ui/index.html#/
`,4),e=[n];function k(l,p,r,E,d,g){return a(),i("div",null,e)}const F=s(h,[["render",k]]);export{y as __pageData,F as default};
diff --git a/.vitepress/dist/assets/src_guide_swagger.md.CCfA6TBH.lean.js b/.vitepress/dist/assets/src_guide_swagger.md.CCfA6TBH.lean.js
new file mode 100644
index 0000000..7a6ff25
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_swagger.md.CCfA6TBH.lean.js
@@ -0,0 +1 @@
+import{_ as s,a as i,o as a,aj as t}from"./chunks/framework.BjhQB2K5.js";const y=JSON.parse('{"title":"swagger 文档","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/swagger.md","filePath":"src/guide/swagger.md","lastUpdated":1720593505000}'),h={name:"src/guide/swagger.md"},n=t("",4),e=[n];function k(l,p,r,E,d,g){return a(),i("div",null,e)}const F=s(h,[["render",k]]);export{y as __pageData,F as default};
diff --git a/.vitepress/dist/assets/src_guide_tenant.md.CP_z92JB.js b/.vitepress/dist/assets/src_guide_tenant.md.CP_z92JB.js
new file mode 100644
index 0000000..5b87426
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_tenant.md.CP_z92JB.js
@@ -0,0 +1,5 @@
+import{_ as a,a as e,o as t,aj as i}from"./chunks/framework.BjhQB2K5.js";const u=JSON.parse('{"title":"多租户(v8.0新增)","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/tenant.md","filePath":"src/guide/tenant.md","lastUpdated":1744512083000}'),s={name:"src/guide/tenant.md"},n=i(`多租户(v8.0新增) 多租户(Multi-tenancy)是一种软件架构模式,允许单个应用实例服务多个租户(客户组织)。每个租户的数据是相互隔离的,但共享同一个应用程序代码和基础设施。
主要特点 数据隔离: 确保不同租户之间的数据严格分离,互不可见 资源共享: 多个租户共享同一套应用程序代码和基础设施 独立配置: 每个租户可以有自己的个性化配置和定制化需求 成本优化: 通过资源共享降低运营和维护成本 实现 1、数据隔离 多租户的数据隔离有许多种方案,但最为常见的是以列进行隔离的方式。Cool Admin 通过在TenantEntity中加入指定的列(租户ID tenantId)对数据进行隔离。
如果登录的用户token信息有携带tenantId,则框架会自动注入tenantId。
使用 1、开启多租户 框架默认关闭多租户,需要手动开启 enable修改为 true
yaml # Cool相关配置
+cool :
+ multi-tenant :
+ # 是否开启多租户,默认关闭
+ enable : false 关于tenantId的使用请参考 mybatis-flex
2、继承对象调整 对于需要租户隔离的表,需要对应的表实体继承对象进行调整 BaseEntity -> TenantEntity
`,15),l=[n];function h(r,o,d,p,c,k){return t(),e("div",null,l)}const m=a(s,[["render",h]]);export{u as __pageData,m as default};
diff --git a/.vitepress/dist/assets/src_guide_tenant.md.CP_z92JB.lean.js b/.vitepress/dist/assets/src_guide_tenant.md.CP_z92JB.lean.js
new file mode 100644
index 0000000..4454c1a
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_tenant.md.CP_z92JB.lean.js
@@ -0,0 +1 @@
+import{_ as a,a as e,o as t,aj as i}from"./chunks/framework.BjhQB2K5.js";const u=JSON.parse('{"title":"多租户(v8.0新增)","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/tenant.md","filePath":"src/guide/tenant.md","lastUpdated":1744512083000}'),s={name:"src/guide/tenant.md"},n=i("",15),l=[n];function h(r,o,d,p,c,k){return t(),e("div",null,l)}const m=a(s,[["render",h]]);export{u as __pageData,m as default};
diff --git a/.vitepress/dist/assets/src_guide_uniqueIDGen.md.BNiKKfQz.js b/.vitepress/dist/assets/src_guide_uniqueIDGen.md.BNiKKfQz.js
new file mode 100644
index 0000000..762ce90
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_uniqueIDGen.md.BNiKKfQz.js
@@ -0,0 +1,30 @@
+import{_ as s,a as i,o as a,aj as n}from"./chunks/framework.BjhQB2K5.js";const o=JSON.parse('{"title":"唯一id","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/uniqueIDGen.md","filePath":"src/guide/uniqueIDGen.md","lastUpdated":1725802894000}'),t={name:"src/guide/uniqueIDGen.md"},h=n(`唯一id 基于表来完成分布式ID生成
原理参考美团点评分布式ID
java @ Table ( value = "leaf_alloc" , comment = "唯一id分配" )
+public class LeafAllocEntity extends BaseEntity < LeafAllocEntity > {
+
+ @ UniIndex
+ @ ColumnDefine ( comment = "业务key ,比如orderId" , length = 20 , notNull = true )
+ private String key;
+
+ @ ColumnDefine ( comment = "当前最大id" , defaultValue = "1" , notNull = true )
+ private Long maxId;
+
+ @ ColumnDefine ( comment = "步长" , defaultValue = "500" , notNull = true )
+ private Integer step;
+
+ @ ColumnDefine ( comment = "描述" )
+ private String description;
+} 用法
// 注入service
+private final IDGenService idGenService;
+// 获取id,入参为key: orderId 需要提取初始化到上面那个
+Long orderId = idGenService.next("orderId"); 项目启动自动插入数据参考 数据初始化
json {
+ "leaf_alloc" : [{
+ "key" : "orderId" ,
+ "max_id" : 1 ,
+ "step" : 500 ,
+ "description" : "订单ID"
+ }]
+} 启用唯一ID组件,默认禁用, 如需启用调整为 true
yaml # 分布式唯一ID组件
+leaf :
+ segment :
+ # 默认禁用,如需启用调整为 true
+ enable : false `,10),l=[h];function p(k,e,d,E,r,g){return a(),i("div",null,l)}const c=s(t,[["render",p]]);export{o as __pageData,c as default};
diff --git a/.vitepress/dist/assets/src_guide_uniqueIDGen.md.BNiKKfQz.lean.js b/.vitepress/dist/assets/src_guide_uniqueIDGen.md.BNiKKfQz.lean.js
new file mode 100644
index 0000000..831a99a
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_uniqueIDGen.md.BNiKKfQz.lean.js
@@ -0,0 +1 @@
+import{_ as s,a as i,o as a,aj as n}from"./chunks/framework.BjhQB2K5.js";const o=JSON.parse('{"title":"唯一id","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/uniqueIDGen.md","filePath":"src/guide/uniqueIDGen.md","lastUpdated":1725802894000}'),t={name:"src/guide/uniqueIDGen.md"},h=n("",10),l=[h];function p(k,e,d,E,r,g){return a(),i("div",null,l)}const c=s(t,[["render",p]]);export{o as __pageData,c as default};
diff --git a/.vitepress/dist/assets/src_guide_upload.md.D-dQqFKU.js b/.vitepress/dist/assets/src_guide_upload.md.D-dQqFKU.js
new file mode 100644
index 0000000..768c640
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_upload.md.D-dQqFKU.js
@@ -0,0 +1,37 @@
+import{_ as s,a as i,o as a,aj as n}from"./chunks/framework.BjhQB2K5.js";const o=JSON.parse('{"title":"文件上传","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/upload.md","filePath":"src/guide/upload.md","lastUpdated":1738945691000}'),l={name:"src/guide/upload.md"},h=n(`文件上传 框架自带两种文件上传方式本地上传与云存储,与前端紧密结合,
前端会根据后端返回的上传模式进行本地上传或者云存储签名直传(不经过服务器,直接上传到对应的云存储)
TIP
安装云存储插件,如 Oss,系统的文件上传就会自动替换成云存储上传的方式,云存储上传服务端值提供签名供前端直传到对应的云存储
使用 application.yml
yaml spring :
+ # Web设置
+ web :
+ resources :
+ add-mappings : true
+ static-locations : classpath:/static/,file:./assets/public/,file:/Users/mac/Desktop
+cool :
+ # 文件上传相关
+ file :
+ #上传模式
+ mode : local
+ # 本地上传配置
+ local :
+ # 文件根地址
+ base-url : http://127.0.0.1:\${server.port}/upload
+ # 可选,文件存放路径 线上环境请用nginx等静态服务器代理
+ uploadPath : /Users/mac/Desktop/upload # 默认是相对路径,也支持绝对路径(注意: 需和上面的 spring Web设置配合使用) 动静分离有许多好处,如不占用主服务器带宽,防止上传恶意文件等。
条件允许的话尽量选择云存储上传,如:oss 还可以对图片进行各种如压缩、裁剪、水印等处理,方便一张图片使用在多种场景。
java @ RequiredArgsConstructor
+@ Tag ( name = "系统通用" , description = "系统通用" )
+@ CoolRestController ()
+public class AdminBaseCommController {
+ final private FileUploadStrategyFactory fileUploadStrategyFactory;
+
+ @ Operation ( summary = "文件上传" )
+ @ PostMapping ( value = "/upload" , consumes = {MediaType.MULTIPART_FORM_DATA_VALUE,
+ MediaType.ALL_VALUE})
+ public R upload (
+ @ RequestPart ( value = "file" , required = false ) @ Parameter ( description = "文件" ) MultipartFile [] files ,
+ HttpServletRequest request ) {
+ return R. ok (fileUploadStrategyFactory. upload (files, request));
+ }
+
+ @ Operation ( summary = "文件上传模式" )
+ @ GetMapping ( "/uploadMode" )
+ public R uploadMode () {
+ return R. ok (fileUploadStrategyFactory. getMode ());
+ }
+} `,11),p=[h];function k(t,e,E,r,d,g){return a(),i("div",null,p)}const F=s(l,[["render",k]]);export{o as __pageData,F as default};
diff --git a/.vitepress/dist/assets/src_guide_upload.md.D-dQqFKU.lean.js b/.vitepress/dist/assets/src_guide_upload.md.D-dQqFKU.lean.js
new file mode 100644
index 0000000..819510a
--- /dev/null
+++ b/.vitepress/dist/assets/src_guide_upload.md.D-dQqFKU.lean.js
@@ -0,0 +1 @@
+import{_ as s,a as i,o as a,aj as n}from"./chunks/framework.BjhQB2K5.js";const o=JSON.parse('{"title":"文件上传","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/upload.md","filePath":"src/guide/upload.md","lastUpdated":1738945691000}'),l={name:"src/guide/upload.md"},h=n("",11),p=[h];function k(t,e,E,r,d,g){return a(),i("div",null,p)}const F=s(l,[["render",k]]);export{o as __pageData,F as default};
diff --git a/.vitepress/dist/assets/src_introduce_index.md.BaUz4Xtw.js b/.vitepress/dist/assets/src_introduce_index.md.BaUz4Xtw.js
new file mode 100644
index 0000000..e560fb1
--- /dev/null
+++ b/.vitepress/dist/assets/src_introduce_index.md.BaUz4Xtw.js
@@ -0,0 +1 @@
+import{_ as a}from"./chunks/admin.CyLBVO1a.js";import{_ as i}from"./chunks/flow.YLaN3zCE.js";import{_ as l,a as e,o as t,aj as o}from"./chunks/framework.BjhQB2K5.js";const q=JSON.parse('{"title":"简介","description":"","frontmatter":{},"headers":[],"relativePath":"src/introduce/index.md","filePath":"src/introduce/index.md","lastUpdated":1721036629000}'),r={name:"src/introduce/index.md"},n=o('简介
技术选型 按照简单、常用的技术进行选择,减少技术栈的复杂度。
一、环境要求 Java Jdk >= 17 选择 graalvm Mysql >= 5.7 Maven >= 3.6 二、后端框架 Spring Boot 3.x Mybatis Flex Auto Table Hutool 三、前端框架 为什么选择 Cool Admin? 随着技术不断地发展,特别是最近 Ai 相关的技术发展,以往的框架已经越来越不能满足现代化的开发需求。
Cool Admin 做为后来者有后发优势,主要特点:
Ai 编码,从页面到后端代码,部分功能实现零代码; Ai 流程编排,专门为 Ai 开发设计的,Ai 开发几乎不用写代码,只需拖一拖即可; 扩展插件,可插拔,如支付、短信这类功能的插件可以通过后台动态安装卸载,灵活又不臃肿; 代码简洁,不像一般代码生成器生成一堆冗余代码,Cool 只需极少编码即可实现大部分需求; ......
内置功能 用户管理:呈现公司组织部门树形结构,用户是系统操作者,该功能主要完成系统用户配置。 菜单管理:配置系统菜单,操作权限标识等。 角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。 参数管理:对系统动态配置常用参数。 字典管理:对系统中经常使用的一些较为固定的数据进行维护。 请求日志:接口的请求入参日志,便于问题排查。 操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。 定时任务:在线(添加、修改、删除)任务调度包含执行结果日志。 文件管理:支持静态资源文件上传云端进行云管理。 数据回收站:数据有 n 天的保留,支持回滚操作。 前后端插件:支持动态安装、卸载插件,实现功能可插拔。 ',18),d=[n];function s(c,h,m,u,_,p){return t(),e("div",null,d)}const A=l(r,[["render",s]]);export{q as __pageData,A as default};
diff --git a/.vitepress/dist/assets/src_introduce_index.md.BaUz4Xtw.lean.js b/.vitepress/dist/assets/src_introduce_index.md.BaUz4Xtw.lean.js
new file mode 100644
index 0000000..90e57d1
--- /dev/null
+++ b/.vitepress/dist/assets/src_introduce_index.md.BaUz4Xtw.lean.js
@@ -0,0 +1 @@
+import{_ as a}from"./chunks/admin.CyLBVO1a.js";import{_ as i}from"./chunks/flow.YLaN3zCE.js";import{_ as l,a as e,o as t,aj as o}from"./chunks/framework.BjhQB2K5.js";const q=JSON.parse('{"title":"简介","description":"","frontmatter":{},"headers":[],"relativePath":"src/introduce/index.md","filePath":"src/introduce/index.md","lastUpdated":1721036629000}'),r={name:"src/introduce/index.md"},n=o("",18),d=[n];function s(c,h,m,u,_,p){return t(),e("div",null,d)}const A=l(r,[["render",s]]);export{q as __pageData,A as default};
diff --git a/.vitepress/dist/assets/src_introduce_show.md.Ck0DuCIX.js b/.vitepress/dist/assets/src_introduce_show.md.Ck0DuCIX.js
new file mode 100644
index 0000000..e84aff6
--- /dev/null
+++ b/.vitepress/dist/assets/src_introduce_show.md.Ck0DuCIX.js
@@ -0,0 +1 @@
+import{_ as e}from"./chunks/admin.CyLBVO1a.js";import{_ as t,a,o,aj as r}from"./chunks/framework.BjhQB2K5.js";const w=JSON.parse('{"title":"演示","description":"","frontmatter":{},"headers":[],"relativePath":"src/introduce/show.md","filePath":"src/introduce/show.md","lastUpdated":1720593505000}'),s={name:"src/introduce/show.md"},c=r('演示
功能几乎跟nodejs 版本一致
https://show.cool-admin.com
账户:admin 密码:123456
',5),n=[c];function _(i,d,p,h,l,m){return o(),a("div",null,n)}const T=t(s,[["render",_]]);export{w as __pageData,T as default};
diff --git a/.vitepress/dist/assets/src_introduce_show.md.Ck0DuCIX.lean.js b/.vitepress/dist/assets/src_introduce_show.md.Ck0DuCIX.lean.js
new file mode 100644
index 0000000..73efb8f
--- /dev/null
+++ b/.vitepress/dist/assets/src_introduce_show.md.Ck0DuCIX.lean.js
@@ -0,0 +1 @@
+import{_ as e}from"./chunks/admin.CyLBVO1a.js";import{_ as t,a,o,aj as r}from"./chunks/framework.BjhQB2K5.js";const w=JSON.parse('{"title":"演示","description":"","frontmatter":{},"headers":[],"relativePath":"src/introduce/show.md","filePath":"src/introduce/show.md","lastUpdated":1720593505000}'),s={name:"src/introduce/show.md"},c=r("",5),n=[c];function _(i,d,p,h,l,m){return o(),a("div",null,n)}const T=t(s,[["render",_]]);export{w as __pageData,T as default};
diff --git a/.vitepress/dist/assets/src_introduce_src.md.UlNmfnNt.js b/.vitepress/dist/assets/src_introduce_src.md.UlNmfnNt.js
new file mode 100644
index 0000000..6013f2b
--- /dev/null
+++ b/.vitepress/dist/assets/src_introduce_src.md.UlNmfnNt.js
@@ -0,0 +1 @@
+import{_ as a,a as o,o as e,aj as t}from"./chunks/framework.BjhQB2K5.js";const _=JSON.parse('{"title":"源码","description":"","frontmatter":{},"headers":[],"relativePath":"src/introduce/src.md","filePath":"src/introduce/src.md","lastUpdated":1722935307000}'),r={name:"src/introduce/src.md"},c=t('源码 项目是开源免费、可商用、无需授权的,为了使项目能够持续,不要吝啬你们免费的Star哦!!!你的Star是我们最大的动力!!!
后端(点个 Star 哦) https://github.com/cool-team-official/cool-admin-java
或
https://gitee.com/cool-team-official/cool-admin-java
或
https://gitcode.com/cool_team/cool-admin-java
前端(点个 Star 哦) 点击前往前端项目详细文档
https://github.com/cool-team-official/cool-admin-vue
或
https://gitee.com/cool-team-official/cool-admin-vue
或
https://gitcode.com/cool_team/cool-admin-vue
文档 (Star 哦) 如果文档有缺失,欢迎提交pr,您的贡献可能会给其他人来带巨大的帮助。
https://github.com/cool-team-official/cool-admin-java-docs
或
https://gitee.com/cool-team-official/cool-admin-java-docs
',20),i=[c];function l(n,s,m,p,d,h){return e(),o("div",null,i)}const u=a(r,[["render",l]]);export{_ as __pageData,u as default};
diff --git a/.vitepress/dist/assets/src_introduce_src.md.UlNmfnNt.lean.js b/.vitepress/dist/assets/src_introduce_src.md.UlNmfnNt.lean.js
new file mode 100644
index 0000000..a4669b8
--- /dev/null
+++ b/.vitepress/dist/assets/src_introduce_src.md.UlNmfnNt.lean.js
@@ -0,0 +1 @@
+import{_ as a,a as o,o as e,aj as t}from"./chunks/framework.BjhQB2K5.js";const _=JSON.parse('{"title":"源码","description":"","frontmatter":{},"headers":[],"relativePath":"src/introduce/src.md","filePath":"src/introduce/src.md","lastUpdated":1722935307000}'),r={name:"src/introduce/src.md"},c=t("",20),i=[c];function l(n,s,m,p,d,h){return e(),o("div",null,i)}const u=a(r,[["render",l]]);export{_ as __pageData,u as default};
diff --git a/.vitepress/dist/assets/src_question_common.md.Caojqqth.js b/.vitepress/dist/assets/src_question_common.md.Caojqqth.js
new file mode 100644
index 0000000..f8d2157
--- /dev/null
+++ b/.vitepress/dist/assets/src_question_common.md.Caojqqth.js
@@ -0,0 +1 @@
+import{_ as e,a as t,o as a,aj as o}from"./chunks/framework.BjhQB2K5.js";const u=JSON.parse('{"title":"常见问题","description":"","frontmatter":{},"headers":[],"relativePath":"src/question/common.md","filePath":"src/question/common.md","lastUpdated":1721036629000}'),l={name:"src/question/common.md"},i=o('常见问题 项目中常见的问题
1、找不到类似xxxTableDef文件 框架用到了Mybatis Flex 的 APT 功能 ,在项目编译的时候会自动生成这些文件。
你可以这样做:
Build 你的项目; 执行 maven 的mvn compile命令; 配置完数据库直接启动; 【推荐】开启 idea 的Build project automatically自动编译功能(Settings -> Build, Execution, Deployment -> Compiler -> Build Project Automatically); 这些方式都可以解决这个问题。
',7),r=[i];function c(n,s,d,_,m,p){return a(),t("div",null,r)}const x=e(l,[["render",c]]);export{u as __pageData,x as default};
diff --git a/.vitepress/dist/assets/src_question_common.md.Caojqqth.lean.js b/.vitepress/dist/assets/src_question_common.md.Caojqqth.lean.js
new file mode 100644
index 0000000..36501d8
--- /dev/null
+++ b/.vitepress/dist/assets/src_question_common.md.Caojqqth.lean.js
@@ -0,0 +1 @@
+import{_ as e,a as t,o as a,aj as o}from"./chunks/framework.BjhQB2K5.js";const u=JSON.parse('{"title":"常见问题","description":"","frontmatter":{},"headers":[],"relativePath":"src/question/common.md","filePath":"src/question/common.md","lastUpdated":1721036629000}'),l={name:"src/question/common.md"},i=o("",7),r=[i];function c(n,s,d,_,m,p){return a(),t("div",null,r)}const x=e(l,[["render",c]]);export{u as __pageData,x as default};
diff --git a/.vitepress/dist/assets/src_todo_plan.md.pGnBM6_r.js b/.vitepress/dist/assets/src_todo_plan.md.pGnBM6_r.js
new file mode 100644
index 0000000..a39f975
--- /dev/null
+++ b/.vitepress/dist/assets/src_todo_plan.md.pGnBM6_r.js
@@ -0,0 +1 @@
+import{_ as a,a as t,o as e,aj as o}from"./chunks/framework.BjhQB2K5.js";const u=JSON.parse('{"title":"计划","description":"","frontmatter":{},"headers":[],"relativePath":"src/todo/plan.md","filePath":"src/todo/plan.md","lastUpdated":1721037096000}'),l={name:"src/todo/plan.md"},i=o('计划 以下是我们的一些计划,如果你有更好的建议,欢迎联系我们。
完善插件 Ai 流程编排插件 文件上传插件 短信插件 支付插件 微信 SDK 插件 ',4),r=[i];function s(n,_,c,d,p,h){return e(),t("div",null,r)}const f=a(l,[["render",s]]);export{u as __pageData,f as default};
diff --git a/.vitepress/dist/assets/src_todo_plan.md.pGnBM6_r.lean.js b/.vitepress/dist/assets/src_todo_plan.md.pGnBM6_r.lean.js
new file mode 100644
index 0000000..6ac6c52
--- /dev/null
+++ b/.vitepress/dist/assets/src_todo_plan.md.pGnBM6_r.lean.js
@@ -0,0 +1 @@
+import{_ as a,a as t,o as e,aj as o}from"./chunks/framework.BjhQB2K5.js";const u=JSON.parse('{"title":"计划","description":"","frontmatter":{},"headers":[],"relativePath":"src/todo/plan.md","filePath":"src/todo/plan.md","lastUpdated":1721037096000}'),l={name:"src/todo/plan.md"},i=o("",4),r=[i];function s(n,_,c,d,p,h){return e(),t("div",null,r)}const f=a(l,[["render",s]]);export{u as __pageData,f as default};
diff --git a/.vitepress/dist/assets/src_todo_update.md.DUbMUQW8.js b/.vitepress/dist/assets/src_todo_update.md.DUbMUQW8.js
new file mode 100644
index 0000000..8934e1b
--- /dev/null
+++ b/.vitepress/dist/assets/src_todo_update.md.DUbMUQW8.js
@@ -0,0 +1 @@
+import{_ as a,a as e,o as l,aj as i}from"./chunks/framework.BjhQB2K5.js";const _=JSON.parse('{"title":"更新","description":"","frontmatter":{},"headers":[],"relativePath":"src/todo/update.md","filePath":"src/todo/update.md","lastUpdated":1744512083000}'),t={name:"src/todo/update.md"},r=i('更新 因为有你们的支持,cool-admin 会持续不断地更新,如果方便请点下 Star,这将会给我们带来更多的动力!!!
v8.0.0(2025-04-13) 新增: 支持多租户,全局动态注入查询条件详情 新增: 支持多语言,基于大模型自动翻译,无需更改原有代码详情 优化: 响应类型封装优化 by @ximu-tao 升级: 升级autotable和mybatis-flex版本,涉及包结构变更 com.tangzc.autotable -> org.dromara.autotable 升级: AI 自动编码(基于DeepSeek R1) v7.1.3(2024-08-25) 新增: list和page支持关联查询,支持自定义返回结果类型,并可以在init方法中初始化返回字段类型及数据组装函数定义(参考:控制器 ) 新增: 分布式ID生成组件(参考:分布式ID ) 新增: 锁工具(参考:锁工具 ) 新增: 防重提交注解(参考:防重提交 ) 调整: 缓存数据模板(参考:缓存 ) 调整: 优化eps解析规则 (参考:解析规则 ) 调整: 优化角色修改循环单个处理为批量处理,并异步进行刷新用户权限 调整: 图形验证码获取区分app和admin 修复: 初始化数据,指定id插入不生效问题 修复: 后台人员查询列表字段关联错误 v7.1.2(2024-08-04) 新增: 支持postgresql 新增: 忽略记录请求日志url配置 新增: app端手机密码登录和手机验证码登录 调整: 鉴权调整兼容app端 调整: 优化插件过大加载慢问题,移除插件jar文件落库 修复: refreshToken可以当token使用问题 v7.1.1(2024-07-15) 新增 Ai 自动编码功能,简单功能零代码实现; 新增后台扩展插件,如文件上传、支付、短信等功能可以通过安装插件的方式添加; v7.1.0(2024-06-27) 升级到 Springboot3.x; 升级所有相关依赖到最新; 跟进Nodejs 版 相关功能; 优化若干问题; ',12),o=[r];function h(s,c,n,d,u,p){return l(),e("div",null,o)}const f=a(t,[["render",h]]);export{_ as __pageData,f as default};
diff --git a/.vitepress/dist/assets/src_todo_update.md.DUbMUQW8.lean.js b/.vitepress/dist/assets/src_todo_update.md.DUbMUQW8.lean.js
new file mode 100644
index 0000000..dcef672
--- /dev/null
+++ b/.vitepress/dist/assets/src_todo_update.md.DUbMUQW8.lean.js
@@ -0,0 +1 @@
+import{_ as a,a as e,o as l,aj as i}from"./chunks/framework.BjhQB2K5.js";const _=JSON.parse('{"title":"更新","description":"","frontmatter":{},"headers":[],"relativePath":"src/todo/update.md","filePath":"src/todo/update.md","lastUpdated":1744512083000}'),t={name:"src/todo/update.md"},r=i("",12),o=[r];function h(s,c,n,d,u,p){return l(),e("div",null,o)}const f=a(t,[["render",h]]);export{_ as __pageData,f as default};
diff --git a/.vitepress/dist/assets/style.BaGxxT1-.css b/.vitepress/dist/assets/style.BaGxxT1-.css
new file mode 100644
index 0000000..05f8b71
--- /dev/null
+++ b/.vitepress/dist/assets/style.BaGxxT1-.css
@@ -0,0 +1 @@
+@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-cyrillic.C5lxZ8CY.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-greek-ext.CqjqNYQ-.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-greek.BBVDIX6e.woff2) format("woff2");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-vietnamese.BjW4sHH5.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-latin-ext.4ZJIpNVo.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-latin.Di8DUHzh.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-cyrillic-ext.r48I6akx.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-cyrillic.By2_1cv3.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-greek-ext.1u6EdAuj.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-greek.DJ8dCoTZ.woff2) format("woff2");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-vietnamese.BSbpV94h.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-latin-ext.CN1xVJS-.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-latin.C2AdPX0b.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Punctuation SC;font-weight:400;src:local("PingFang SC Regular"),local("Noto Sans CJK SC"),local("Microsoft YaHei");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:500;src:local("PingFang SC Medium"),local("Noto Sans CJK SC"),local("Microsoft YaHei");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:600;src:local("PingFang SC Semibold"),local("Noto Sans CJK SC Bold"),local("Microsoft YaHei Bold");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:700;src:local("PingFang SC Semibold"),local("Noto Sans CJK SC Bold"),local("Microsoft YaHei Bold");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}:root{--vp-c-white: #ffffff;--vp-c-black: #000000;--vp-c-neutral: var(--vp-c-black);--vp-c-neutral-inverse: var(--vp-c-white)}.dark{--vp-c-neutral: var(--vp-c-white);--vp-c-neutral-inverse: var(--vp-c-black)}:root{--vp-c-gray-1: #dddde3;--vp-c-gray-2: #e4e4e9;--vp-c-gray-3: #ebebef;--vp-c-gray-soft: rgba(142, 150, 170, .14);--vp-c-indigo-1: #3451b2;--vp-c-indigo-2: #3a5ccc;--vp-c-indigo-3: #5672cd;--vp-c-indigo-soft: rgba(100, 108, 255, .14);--vp-c-purple-1: #6f42c1;--vp-c-purple-2: #7e4cc9;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .14);--vp-c-green-1: #18794e;--vp-c-green-2: #299764;--vp-c-green-3: #30a46c;--vp-c-green-soft: rgba(16, 185, 129, .14);--vp-c-yellow-1: #915930;--vp-c-yellow-2: #946300;--vp-c-yellow-3: #9f6a00;--vp-c-yellow-soft: rgba(234, 179, 8, .14);--vp-c-red-1: #b8272c;--vp-c-red-2: #d5393e;--vp-c-red-3: #e0575b;--vp-c-red-soft: rgba(244, 63, 94, .14);--vp-c-sponsor: #db2777}.dark{--vp-c-gray-1: #515c67;--vp-c-gray-2: #414853;--vp-c-gray-3: #32363f;--vp-c-gray-soft: rgba(101, 117, 133, .16);--vp-c-indigo-1: #a8b1ff;--vp-c-indigo-2: #5c73e7;--vp-c-indigo-3: #3e63dd;--vp-c-indigo-soft: rgba(100, 108, 255, .16);--vp-c-purple-1: #c8abfa;--vp-c-purple-2: #a879e6;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .16);--vp-c-green-1: #3dd68c;--vp-c-green-2: #30a46c;--vp-c-green-3: #298459;--vp-c-green-soft: rgba(16, 185, 129, .16);--vp-c-yellow-1: #f9b44e;--vp-c-yellow-2: #da8b17;--vp-c-yellow-3: #a46a0a;--vp-c-yellow-soft: rgba(234, 179, 8, .16);--vp-c-red-1: #f66f81;--vp-c-red-2: #f14158;--vp-c-red-3: #b62a3c;--vp-c-red-soft: rgba(244, 63, 94, .16)}:root{--vp-c-bg: #ffffff;--vp-c-bg-alt: #f6f6f7;--vp-c-bg-elv: #ffffff;--vp-c-bg-soft: #f6f6f7}.dark{--vp-c-bg: #1b1b1f;--vp-c-bg-alt: #161618;--vp-c-bg-elv: #202127;--vp-c-bg-soft: #202127}:root{--vp-c-border: #c2c2c4;--vp-c-divider: #e2e2e3;--vp-c-gutter: #e2e2e3}.dark{--vp-c-border: #3c3f44;--vp-c-divider: #2e2e32;--vp-c-gutter: #000000}:root{--vp-c-text-1: #3c3c43;--vp-c-text-2: #67676c;--vp-c-text-3: #929295}.dark{--vp-c-text-1: #dfdfd6;--vp-c-text-2: #98989f;--vp-c-text-3: #6a6a71}:root{--vp-c-default-1: var(--vp-c-gray-1);--vp-c-default-2: var(--vp-c-gray-2);--vp-c-default-3: var(--vp-c-gray-3);--vp-c-default-soft: var(--vp-c-gray-soft);--vp-c-brand-1: var(--vp-c-indigo-1);--vp-c-brand-2: var(--vp-c-indigo-2);--vp-c-brand-3: var(--vp-c-indigo-3);--vp-c-brand-soft: var(--vp-c-indigo-soft);--vp-c-brand: var(--vp-c-brand-1);--vp-c-tip-1: var(--vp-c-brand-1);--vp-c-tip-2: var(--vp-c-brand-2);--vp-c-tip-3: var(--vp-c-brand-3);--vp-c-tip-soft: var(--vp-c-brand-soft);--vp-c-note-1: var(--vp-c-brand-1);--vp-c-note-2: var(--vp-c-brand-2);--vp-c-note-3: var(--vp-c-brand-3);--vp-c-note-soft: var(--vp-c-brand-soft);--vp-c-success-1: var(--vp-c-green-1);--vp-c-success-2: var(--vp-c-green-2);--vp-c-success-3: var(--vp-c-green-3);--vp-c-success-soft: var(--vp-c-green-soft);--vp-c-important-1: var(--vp-c-purple-1);--vp-c-important-2: var(--vp-c-purple-2);--vp-c-important-3: var(--vp-c-purple-3);--vp-c-important-soft: var(--vp-c-purple-soft);--vp-c-warning-1: var(--vp-c-yellow-1);--vp-c-warning-2: var(--vp-c-yellow-2);--vp-c-warning-3: var(--vp-c-yellow-3);--vp-c-warning-soft: var(--vp-c-yellow-soft);--vp-c-danger-1: var(--vp-c-red-1);--vp-c-danger-2: var(--vp-c-red-2);--vp-c-danger-3: var(--vp-c-red-3);--vp-c-danger-soft: var(--vp-c-red-soft);--vp-c-caution-1: var(--vp-c-red-1);--vp-c-caution-2: var(--vp-c-red-2);--vp-c-caution-3: var(--vp-c-red-3);--vp-c-caution-soft: var(--vp-c-red-soft)}:root{--vp-font-family-base: "Inter", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--vp-font-family-mono: ui-monospace, "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace;font-optical-sizing:auto}:root:where(:lang(zh)){--vp-font-family-base: "Punctuation SC", "Inter", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"}:root{--vp-shadow-1: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--vp-shadow-2: 0 3px 12px rgba(0, 0, 0, .07), 0 1px 4px rgba(0, 0, 0, .07);--vp-shadow-3: 0 12px 32px rgba(0, 0, 0, .1), 0 2px 6px rgba(0, 0, 0, .08);--vp-shadow-4: 0 14px 44px rgba(0, 0, 0, .12), 0 3px 9px rgba(0, 0, 0, .12);--vp-shadow-5: 0 18px 56px rgba(0, 0, 0, .16), 0 4px 12px rgba(0, 0, 0, .16)}:root{--vp-z-index-footer: 10;--vp-z-index-local-nav: 20;--vp-z-index-nav: 30;--vp-z-index-layout-top: 40;--vp-z-index-backdrop: 50;--vp-z-index-sidebar: 60}@media (min-width: 960px){:root{--vp-z-index-sidebar: 25}}:root{--vp-layout-max-width: 1440px}:root{--vp-header-anchor-symbol: "#"}:root{--vp-code-line-height: 1.7;--vp-code-font-size: .875em;--vp-code-color: var(--vp-c-brand-1);--vp-code-link-color: var(--vp-c-brand-1);--vp-code-link-hover-color: var(--vp-c-brand-2);--vp-code-bg: var(--vp-c-default-soft);--vp-code-block-color: var(--vp-c-text-2);--vp-code-block-bg: var(--vp-c-bg-alt);--vp-code-block-divider-color: var(--vp-c-gutter);--vp-code-lang-color: var(--vp-c-text-3);--vp-code-line-highlight-color: var(--vp-c-default-soft);--vp-code-line-number-color: var(--vp-c-text-3);--vp-code-line-diff-add-color: var(--vp-c-success-soft);--vp-code-line-diff-add-symbol-color: var(--vp-c-success-1);--vp-code-line-diff-remove-color: var(--vp-c-danger-soft);--vp-code-line-diff-remove-symbol-color: var(--vp-c-danger-1);--vp-code-line-warning-color: var(--vp-c-warning-soft);--vp-code-line-error-color: var(--vp-c-danger-soft);--vp-code-copy-code-border-color: var(--vp-c-divider);--vp-code-copy-code-bg: var(--vp-c-bg-soft);--vp-code-copy-code-hover-border-color: var(--vp-c-divider);--vp-code-copy-code-hover-bg: var(--vp-c-bg);--vp-code-copy-code-active-text: var(--vp-c-text-2);--vp-code-copy-copied-text-content: "Copied";--vp-code-tab-divider: var(--vp-code-block-divider-color);--vp-code-tab-text-color: var(--vp-c-text-2);--vp-code-tab-bg: var(--vp-code-block-bg);--vp-code-tab-hover-text-color: var(--vp-c-text-1);--vp-code-tab-active-text-color: var(--vp-c-text-1);--vp-code-tab-active-bar-color: var(--vp-c-brand-1)}:lang(es),:lang(pt){--vp-code-copy-copied-text-content: "Copiado"}:lang(fa){--vp-code-copy-copied-text-content: "کپی شد"}:lang(ko){--vp-code-copy-copied-text-content: "복사됨"}:lang(ru){--vp-code-copy-copied-text-content: "Скопировано"}:lang(zh){--vp-code-copy-copied-text-content: "已复制"}:root{--vp-button-brand-border: transparent;--vp-button-brand-text: var(--vp-c-white);--vp-button-brand-bg: var(--vp-c-brand-3);--vp-button-brand-hover-border: transparent;--vp-button-brand-hover-text: var(--vp-c-white);--vp-button-brand-hover-bg: var(--vp-c-brand-2);--vp-button-brand-active-border: transparent;--vp-button-brand-active-text: var(--vp-c-white);--vp-button-brand-active-bg: var(--vp-c-brand-1);--vp-button-alt-border: transparent;--vp-button-alt-text: var(--vp-c-text-1);--vp-button-alt-bg: var(--vp-c-default-3);--vp-button-alt-hover-border: transparent;--vp-button-alt-hover-text: var(--vp-c-text-1);--vp-button-alt-hover-bg: var(--vp-c-default-2);--vp-button-alt-active-border: transparent;--vp-button-alt-active-text: var(--vp-c-text-1);--vp-button-alt-active-bg: var(--vp-c-default-1);--vp-button-sponsor-border: var(--vp-c-text-2);--vp-button-sponsor-text: var(--vp-c-text-2);--vp-button-sponsor-bg: transparent;--vp-button-sponsor-hover-border: var(--vp-c-sponsor);--vp-button-sponsor-hover-text: var(--vp-c-sponsor);--vp-button-sponsor-hover-bg: transparent;--vp-button-sponsor-active-border: var(--vp-c-sponsor);--vp-button-sponsor-active-text: var(--vp-c-sponsor);--vp-button-sponsor-active-bg: transparent}:root{--vp-custom-block-font-size: 14px;--vp-custom-block-code-font-size: 13px;--vp-custom-block-info-border: transparent;--vp-custom-block-info-text: var(--vp-c-text-1);--vp-custom-block-info-bg: var(--vp-c-default-soft);--vp-custom-block-info-code-bg: var(--vp-c-default-soft);--vp-custom-block-note-border: transparent;--vp-custom-block-note-text: var(--vp-c-text-1);--vp-custom-block-note-bg: var(--vp-c-default-soft);--vp-custom-block-note-code-bg: var(--vp-c-default-soft);--vp-custom-block-tip-border: transparent;--vp-custom-block-tip-text: var(--vp-c-text-1);--vp-custom-block-tip-bg: var(--vp-c-tip-soft);--vp-custom-block-tip-code-bg: var(--vp-c-tip-soft);--vp-custom-block-important-border: transparent;--vp-custom-block-important-text: var(--vp-c-text-1);--vp-custom-block-important-bg: var(--vp-c-important-soft);--vp-custom-block-important-code-bg: var(--vp-c-important-soft);--vp-custom-block-warning-border: transparent;--vp-custom-block-warning-text: var(--vp-c-text-1);--vp-custom-block-warning-bg: var(--vp-c-warning-soft);--vp-custom-block-warning-code-bg: var(--vp-c-warning-soft);--vp-custom-block-danger-border: transparent;--vp-custom-block-danger-text: var(--vp-c-text-1);--vp-custom-block-danger-bg: var(--vp-c-danger-soft);--vp-custom-block-danger-code-bg: var(--vp-c-danger-soft);--vp-custom-block-caution-border: transparent;--vp-custom-block-caution-text: var(--vp-c-text-1);--vp-custom-block-caution-bg: var(--vp-c-caution-soft);--vp-custom-block-caution-code-bg: var(--vp-c-caution-soft);--vp-custom-block-details-border: var(--vp-custom-block-info-border);--vp-custom-block-details-text: var(--vp-custom-block-info-text);--vp-custom-block-details-bg: var(--vp-custom-block-info-bg);--vp-custom-block-details-code-bg: var(--vp-custom-block-info-code-bg)}:root{--vp-input-border-color: var(--vp-c-border);--vp-input-bg-color: var(--vp-c-bg-alt);--vp-input-switch-bg-color: var(--vp-c-default-soft)}:root{--vp-nav-height: 64px;--vp-nav-bg-color: var(--vp-c-bg);--vp-nav-screen-bg-color: var(--vp-c-bg);--vp-nav-logo-height: 24px}.hide-nav{--vp-nav-height: 0px}.hide-nav .VPSidebar{--vp-nav-height: 22px}:root{--vp-local-nav-bg-color: var(--vp-c-bg)}:root{--vp-sidebar-width: 272px;--vp-sidebar-bg-color: var(--vp-c-bg-alt)}:root{--vp-backdrop-bg-color: rgba(0, 0, 0, .6)}:root{--vp-home-hero-name-color: var(--vp-c-brand-1);--vp-home-hero-name-background: transparent;--vp-home-hero-image-background-image: none;--vp-home-hero-image-filter: none}:root{--vp-badge-info-border: transparent;--vp-badge-info-text: var(--vp-c-text-2);--vp-badge-info-bg: var(--vp-c-default-soft);--vp-badge-tip-border: transparent;--vp-badge-tip-text: var(--vp-c-tip-1);--vp-badge-tip-bg: var(--vp-c-tip-soft);--vp-badge-warning-border: transparent;--vp-badge-warning-text: var(--vp-c-warning-1);--vp-badge-warning-bg: var(--vp-c-warning-soft);--vp-badge-danger-border: transparent;--vp-badge-danger-text: var(--vp-c-danger-1);--vp-badge-danger-bg: var(--vp-c-danger-soft)}:root{--vp-carbon-ads-text-color: var(--vp-c-text-1);--vp-carbon-ads-poweredby-color: var(--vp-c-text-2);--vp-carbon-ads-bg-color: var(--vp-c-bg-soft);--vp-carbon-ads-hover-text-color: var(--vp-c-brand-1);--vp-carbon-ads-hover-poweredby-color: var(--vp-c-text-1)}:root{--vp-local-search-bg: var(--vp-c-bg);--vp-local-search-result-bg: var(--vp-c-bg);--vp-local-search-result-border: var(--vp-c-divider);--vp-local-search-result-selected-bg: var(--vp-c-bg);--vp-local-search-result-selected-border: var(--vp-c-brand-1);--vp-local-search-highlight-bg: var(--vp-c-brand-1);--vp-local-search-highlight-text: var(--vp-c-neutral-inverse)}@media (prefers-reduced-motion: reduce){*,:before,:after{animation-delay:-1ms!important;animation-duration:1ms!important;animation-iteration-count:1!important;background-attachment:initial!important;scroll-behavior:auto!important;transition-duration:0s!important;transition-delay:0s!important}}*,:before,:after{box-sizing:border-box}html{line-height:1.4;font-size:16px;-webkit-text-size-adjust:100%}html.dark{color-scheme:dark}body{margin:0;width:100%;min-width:320px;min-height:100vh;line-height:24px;font-family:var(--vp-font-family-base);font-size:16px;font-weight:400;color:var(--vp-c-text-1);background-color:var(--vp-c-bg);font-synthesis:style;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;line-height:24px;font-size:16px;font-weight:400}p{margin:0}strong,b{font-weight:600}a,area,button,[role=button],input,label,select,summary,textarea{touch-action:manipulation}a{color:inherit;text-decoration:inherit}ol,ul{list-style:none;margin:0;padding:0}blockquote{margin:0}pre,code,kbd,samp{font-family:var(--vp-font-family-mono)}img,svg,video,canvas,audio,iframe,embed,object{display:block}figure{margin:0}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{border:0;padding:0;line-height:inherit;color:inherit}button{padding:0;font-family:inherit;background-color:transparent;background-image:none}button:enabled,[role=button]:enabled{cursor:pointer}button:focus,button:focus-visible{outline:1px dotted;outline:4px auto -webkit-focus-ring-color}button:focus:not(:focus-visible){outline:none!important}input:focus,textarea:focus,select:focus{outline:none}table{border-collapse:collapse}input{background-color:transparent}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:var(--vp-c-text-3)}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:var(--vp-c-text-3)}input::placeholder,textarea::placeholder{color:var(--vp-c-text-3)}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}textarea{resize:vertical}select{-webkit-appearance:none}fieldset{margin:0;padding:0}h1,h2,h3,h4,h5,h6,li,p{overflow-wrap:break-word}vite-error-overlay{z-index:9999}mjx-container{overflow-x:auto}mjx-container>svg{display:inline-block;margin:auto}[class^=vpi-],[class*=" vpi-"],.vp-icon{width:1em;height:1em}[class^=vpi-].bg,[class*=" vpi-"].bg,.vp-icon.bg{background-size:100% 100%;background-color:transparent}[class^=vpi-]:not(.bg),[class*=" vpi-"]:not(.bg),.vp-icon:not(.bg){-webkit-mask:var(--icon) no-repeat;mask:var(--icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit}.vpi-align-left{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M21 6H3M15 12H3M17 18H3'/%3E%3C/svg%3E")}.vpi-arrow-right,.vpi-arrow-down,.vpi-arrow-left,.vpi-arrow-up{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5l7 7-7 7'/%3E%3C/svg%3E")}.vpi-chevron-right,.vpi-chevron-down,.vpi-chevron-left,.vpi-chevron-up{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 18 6-6-6-6'/%3E%3C/svg%3E")}.vpi-chevron-down,.vpi-arrow-down{transform:rotate(90deg)}.vpi-chevron-left,.vpi-arrow-left{transform:rotate(180deg)}.vpi-chevron-up,.vpi-arrow-up{transform:rotate(-90deg)}.vpi-square-pen{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7'/%3E%3Cpath d='M18.375 2.625a2.121 2.121 0 1 1 3 3L12 15l-4 1 1-4Z'/%3E%3C/svg%3E")}.vpi-plus{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5v14'/%3E%3C/svg%3E")}.vpi-sun{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='4'/%3E%3Cpath d='M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41'/%3E%3C/svg%3E")}.vpi-moon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z'/%3E%3C/svg%3E")}.vpi-more-horizontal{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='1'/%3E%3Ccircle cx='19' cy='12' r='1'/%3E%3Ccircle cx='5' cy='12' r='1'/%3E%3C/svg%3E")}.vpi-languages{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m5 8 6 6M4 14l6-6 2-3M2 5h12M7 2h1M22 22l-5-10-5 10M14 18h6'/%3E%3C/svg%3E")}.vpi-heart{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z'/%3E%3C/svg%3E")}.vpi-search{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.3-4.3'/%3E%3C/svg%3E")}.vpi-layout-list{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='7' height='7' x='3' y='3' rx='1'/%3E%3Crect width='7' height='7' x='3' y='14' rx='1'/%3E%3Cpath d='M14 4h7M14 9h7M14 15h7M14 20h7'/%3E%3C/svg%3E")}.vpi-delete{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M20 5H9l-7 7 7 7h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2ZM18 9l-6 6M12 9l6 6'/%3E%3C/svg%3E")}.vpi-corner-down-left{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 10-5 5 5 5'/%3E%3Cpath d='M20 4v7a4 4 0 0 1-4 4H4'/%3E%3C/svg%3E")}:root{--vp-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3C/svg%3E");--vp-icon-copied: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3Cpath d='m9 14 2 2 4-4'/%3E%3C/svg%3E")}.visually-hidden{position:absolute;width:1px;height:1px;white-space:nowrap;clip:rect(0 0 0 0);clip-path:inset(50%);overflow:hidden}.custom-block{border:1px solid transparent;border-radius:8px;padding:16px 16px 8px;line-height:24px;font-size:var(--vp-custom-block-font-size);color:var(--vp-c-text-2)}.custom-block.info{border-color:var(--vp-custom-block-info-border);color:var(--vp-custom-block-info-text);background-color:var(--vp-custom-block-info-bg)}.custom-block.info a,.custom-block.info code{color:var(--vp-c-brand-1)}.custom-block.info a:hover,.custom-block.info a:hover>code{color:var(--vp-c-brand-2)}.custom-block.info code{background-color:var(--vp-custom-block-info-code-bg)}.custom-block.note{border-color:var(--vp-custom-block-note-border);color:var(--vp-custom-block-note-text);background-color:var(--vp-custom-block-note-bg)}.custom-block.note a,.custom-block.note code{color:var(--vp-c-brand-1)}.custom-block.note a:hover,.custom-block.note a:hover>code{color:var(--vp-c-brand-2)}.custom-block.note code{background-color:var(--vp-custom-block-note-code-bg)}.custom-block.tip{border-color:var(--vp-custom-block-tip-border);color:var(--vp-custom-block-tip-text);background-color:var(--vp-custom-block-tip-bg)}.custom-block.tip a,.custom-block.tip code{color:var(--vp-c-tip-1)}.custom-block.tip a:hover,.custom-block.tip a:hover>code{color:var(--vp-c-tip-2)}.custom-block.tip code{background-color:var(--vp-custom-block-tip-code-bg)}.custom-block.important{border-color:var(--vp-custom-block-important-border);color:var(--vp-custom-block-important-text);background-color:var(--vp-custom-block-important-bg)}.custom-block.important a,.custom-block.important code{color:var(--vp-c-important-1)}.custom-block.important a:hover,.custom-block.important a:hover>code{color:var(--vp-c-important-2)}.custom-block.important code{background-color:var(--vp-custom-block-important-code-bg)}.custom-block.warning{border-color:var(--vp-custom-block-warning-border);color:var(--vp-custom-block-warning-text);background-color:var(--vp-custom-block-warning-bg)}.custom-block.warning a,.custom-block.warning code{color:var(--vp-c-warning-1)}.custom-block.warning a:hover,.custom-block.warning a:hover>code{color:var(--vp-c-warning-2)}.custom-block.warning code{background-color:var(--vp-custom-block-warning-code-bg)}.custom-block.danger{border-color:var(--vp-custom-block-danger-border);color:var(--vp-custom-block-danger-text);background-color:var(--vp-custom-block-danger-bg)}.custom-block.danger a,.custom-block.danger code{color:var(--vp-c-danger-1)}.custom-block.danger a:hover,.custom-block.danger a:hover>code{color:var(--vp-c-danger-2)}.custom-block.danger code{background-color:var(--vp-custom-block-danger-code-bg)}.custom-block.caution{border-color:var(--vp-custom-block-caution-border);color:var(--vp-custom-block-caution-text);background-color:var(--vp-custom-block-caution-bg)}.custom-block.caution a,.custom-block.caution code{color:var(--vp-c-caution-1)}.custom-block.caution a:hover,.custom-block.caution a:hover>code{color:var(--vp-c-caution-2)}.custom-block.caution code{background-color:var(--vp-custom-block-caution-code-bg)}.custom-block.details{border-color:var(--vp-custom-block-details-border);color:var(--vp-custom-block-details-text);background-color:var(--vp-custom-block-details-bg)}.custom-block.details a{color:var(--vp-c-brand-1)}.custom-block.details a:hover,.custom-block.details a:hover>code{color:var(--vp-c-brand-2)}.custom-block.details code{background-color:var(--vp-custom-block-details-code-bg)}.custom-block-title{font-weight:600}.custom-block p+p{margin:8px 0}.custom-block.details summary{margin:0 0 8px;font-weight:700;cursor:pointer;-webkit-user-select:none;user-select:none}.custom-block.details summary+p{margin:8px 0}.custom-block a{color:inherit;font-weight:600;text-decoration:underline;text-underline-offset:2px;transition:opacity .25s}.custom-block a:hover{opacity:.75}.custom-block code{font-size:var(--vp-custom-block-code-font-size)}.custom-block.custom-block th,.custom-block.custom-block blockquote>p{font-size:var(--vp-custom-block-font-size);color:inherit}.dark .vp-code span{color:var(--shiki-dark, inherit)}html:not(.dark) .vp-code span{color:var(--shiki-light, inherit)}.vp-code-group{margin-top:16px}.vp-code-group .tabs{position:relative;display:flex;margin-right:-24px;margin-left:-24px;padding:0 12px;background-color:var(--vp-code-tab-bg);overflow-x:auto;overflow-y:hidden;box-shadow:inset 0 -1px var(--vp-code-tab-divider)}@media (min-width: 640px){.vp-code-group .tabs{margin-right:0;margin-left:0;border-radius:8px 8px 0 0}}.vp-code-group .tabs input{position:fixed;opacity:0;pointer-events:none}.vp-code-group .tabs label{position:relative;display:inline-block;border-bottom:1px solid transparent;padding:0 12px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-code-tab-text-color);white-space:nowrap;cursor:pointer;transition:color .25s}.vp-code-group .tabs label:after{position:absolute;right:8px;bottom:-1px;left:8px;z-index:1;height:2px;border-radius:2px;content:"";background-color:transparent;transition:background-color .25s}.vp-code-group label:hover{color:var(--vp-code-tab-hover-text-color)}.vp-code-group input:checked+label{color:var(--vp-code-tab-active-text-color)}.vp-code-group input:checked+label:after{background-color:var(--vp-code-tab-active-bar-color)}.vp-code-group div[class*=language-],.vp-block{display:none;margin-top:0!important;border-top-left-radius:0!important;border-top-right-radius:0!important}.vp-code-group div[class*=language-].active,.vp-block.active{display:block}.vp-block{padding:20px 24px}.vp-doc h1,.vp-doc h2,.vp-doc h3,.vp-doc h4,.vp-doc h5,.vp-doc h6{position:relative;font-weight:600;outline:none}.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:28px}.vp-doc h2{margin:48px 0 16px;border-top:1px solid var(--vp-c-divider);padding-top:24px;letter-spacing:-.02em;line-height:32px;font-size:24px}.vp-doc h3{margin:32px 0 0;letter-spacing:-.01em;line-height:28px;font-size:20px}.vp-doc h4{margin:24px 0 0;letter-spacing:-.01em;line-height:24px;font-size:18px}.vp-doc .header-anchor{position:absolute;top:0;left:0;margin-left:-.87em;font-weight:500;-webkit-user-select:none;user-select:none;opacity:0;text-decoration:none;transition:color .25s,opacity .25s}.vp-doc .header-anchor:before{content:var(--vp-header-anchor-symbol)}.vp-doc h1:hover .header-anchor,.vp-doc h1 .header-anchor:focus,.vp-doc h2:hover .header-anchor,.vp-doc h2 .header-anchor:focus,.vp-doc h3:hover .header-anchor,.vp-doc h3 .header-anchor:focus,.vp-doc h4:hover .header-anchor,.vp-doc h4 .header-anchor:focus,.vp-doc h5:hover .header-anchor,.vp-doc h5 .header-anchor:focus,.vp-doc h6:hover .header-anchor,.vp-doc h6 .header-anchor:focus{opacity:1}@media (min-width: 768px){.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:32px}}.vp-doc h2 .header-anchor{top:24px}.vp-doc p,.vp-doc summary{margin:16px 0}.vp-doc p{line-height:28px}.vp-doc blockquote{margin:16px 0;border-left:2px solid var(--vp-c-divider);padding-left:16px;transition:border-color .5s;color:var(--vp-c-text-2)}.vp-doc blockquote>p{margin:0;font-size:16px;transition:color .5s}.vp-doc a{font-weight:500;color:var(--vp-c-brand-1);text-decoration:underline;text-underline-offset:2px;transition:color .25s,opacity .25s}.vp-doc a:hover{color:var(--vp-c-brand-2)}.vp-doc strong{font-weight:600}.vp-doc ul,.vp-doc ol{padding-left:1.25rem;margin:16px 0}.vp-doc ul{list-style:disc}.vp-doc ol{list-style:decimal}.vp-doc li+li{margin-top:8px}.vp-doc li>ol,.vp-doc li>ul{margin:8px 0 0}.vp-doc table{display:block;border-collapse:collapse;margin:20px 0;overflow-x:auto}.vp-doc tr{background-color:var(--vp-c-bg);border-top:1px solid var(--vp-c-divider);transition:background-color .5s}.vp-doc tr:nth-child(2n){background-color:var(--vp-c-bg-soft)}.vp-doc th,.vp-doc td{border:1px solid var(--vp-c-divider);padding:8px 16px}.vp-doc th{text-align:left;font-size:14px;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-doc td{font-size:14px}.vp-doc hr{margin:16px 0;border:none;border-top:1px solid var(--vp-c-divider)}.vp-doc .custom-block{margin:16px 0}.vp-doc .custom-block p{margin:8px 0;line-height:24px}.vp-doc .custom-block p:first-child{margin:0}.vp-doc .custom-block div[class*=language-]{margin:8px 0;border-radius:8px}.vp-doc .custom-block div[class*=language-] code{font-weight:400;background-color:transparent}.vp-doc .custom-block .vp-code-group .tabs{margin:0;border-radius:8px 8px 0 0}.vp-doc :not(pre,h1,h2,h3,h4,h5,h6)>code{font-size:var(--vp-code-font-size);color:var(--vp-code-color)}.vp-doc :not(pre)>code{border-radius:4px;padding:3px 6px;background-color:var(--vp-code-bg);transition:color .25s,background-color .5s}.vp-doc a>code{color:var(--vp-code-link-color)}.vp-doc a:hover>code{color:var(--vp-code-link-hover-color)}.vp-doc h1>code,.vp-doc h2>code,.vp-doc h3>code,.vp-doc h4>code{font-size:.9em}.vp-doc div[class*=language-],.vp-block{position:relative;margin:16px -24px;background-color:var(--vp-code-block-bg);overflow-x:auto;transition:background-color .5s}@media (min-width: 640px){.vp-doc div[class*=language-],.vp-block{border-radius:8px;margin:16px 0}}@media (max-width: 639px){.vp-doc li div[class*=language-]{border-radius:8px 0 0 8px}}.vp-doc div[class*=language-]+div[class*=language-],.vp-doc div[class$=-api]+div[class*=language-],.vp-doc div[class*=language-]+div[class$=-api]>div[class*=language-]{margin-top:-8px}.vp-doc [class*=language-] pre,.vp-doc [class*=language-] code{direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.vp-doc [class*=language-] pre{position:relative;z-index:1;margin:0;padding:20px 0;background:transparent;overflow-x:auto}.vp-doc [class*=language-] code{display:block;padding:0 24px;width:fit-content;min-width:100%;line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-block-color);transition:color .5s}.vp-doc [class*=language-] code .highlighted{background-color:var(--vp-code-line-highlight-color);transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .highlighted.error{background-color:var(--vp-code-line-error-color)}.vp-doc [class*=language-] code .highlighted.warning{background-color:var(--vp-code-line-warning-color)}.vp-doc [class*=language-] code .diff{transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .diff:before{position:absolute;left:10px}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){filter:blur(.095rem);opacity:.4;transition:filter .35s,opacity .35s}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){opacity:.7;transition:filter .35s,opacity .35s}.vp-doc [class*=language-]:hover .has-focused-lines .line:not(.has-focus){filter:blur(0);opacity:1}.vp-doc [class*=language-] code .diff.remove{background-color:var(--vp-code-line-diff-remove-color);opacity:.7}.vp-doc [class*=language-] code .diff.remove:before{content:"-";color:var(--vp-code-line-diff-remove-symbol-color)}.vp-doc [class*=language-] code .diff.add{background-color:var(--vp-code-line-diff-add-color)}.vp-doc [class*=language-] code .diff.add:before{content:"+";color:var(--vp-code-line-diff-add-symbol-color)}.vp-doc div[class*=language-].line-numbers-mode{padding-left:32px}.vp-doc .line-numbers-wrapper{position:absolute;top:0;bottom:0;left:0;z-index:3;border-right:1px solid var(--vp-code-block-divider-color);padding-top:20px;width:32px;text-align:center;font-family:var(--vp-font-family-mono);line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-line-number-color);transition:border-color .5s,color .5s}.vp-doc [class*=language-]>button.copy{direction:ltr;position:absolute;top:12px;right:12px;z-index:3;border:1px solid var(--vp-code-copy-code-border-color);border-radius:4px;width:40px;height:40px;background-color:var(--vp-code-copy-code-bg);opacity:0;cursor:pointer;background-image:var(--vp-icon-copy);background-position:50%;background-size:20px;background-repeat:no-repeat;transition:border-color .25s,background-color .25s,opacity .25s}.vp-doc [class*=language-]:hover>button.copy,.vp-doc [class*=language-]>button.copy:focus{opacity:1}.vp-doc [class*=language-]>button.copy:hover,.vp-doc [class*=language-]>button.copy.copied{border-color:var(--vp-code-copy-code-hover-border-color);background-color:var(--vp-code-copy-code-hover-bg)}.vp-doc [class*=language-]>button.copy.copied,.vp-doc [class*=language-]>button.copy:hover.copied{border-radius:0 4px 4px 0;background-color:var(--vp-code-copy-code-hover-bg);background-image:var(--vp-icon-copied)}.vp-doc [class*=language-]>button.copy.copied:before,.vp-doc [class*=language-]>button.copy:hover.copied:before{position:relative;top:-1px;transform:translate(calc(-100% - 1px));display:flex;justify-content:center;align-items:center;border:1px solid var(--vp-code-copy-code-hover-border-color);border-right:0;border-radius:4px 0 0 4px;padding:0 10px;width:fit-content;height:40px;text-align:center;font-size:12px;font-weight:500;color:var(--vp-code-copy-code-active-text);background-color:var(--vp-code-copy-code-hover-bg);white-space:nowrap;content:var(--vp-code-copy-copied-text-content)}.vp-doc [class*=language-]>span.lang{position:absolute;top:2px;right:8px;z-index:2;font-size:12px;font-weight:500;-webkit-user-select:none;user-select:none;color:var(--vp-code-lang-color);transition:color .4s,opacity .4s}.vp-doc [class*=language-]:hover>button.copy+span.lang,.vp-doc [class*=language-]>button.copy:focus+span.lang{opacity:0}.vp-doc .VPTeamMembers{margin-top:24px}.vp-doc .VPTeamMembers.small.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}.vp-doc .VPTeamMembers.small.count-2 .container,.vp-doc .VPTeamMembers.small.count-3 .container{max-width:100%!important}.vp-doc .VPTeamMembers.medium.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}:is(.vp-external-link-icon,.vp-doc a[href*="://"],.vp-doc a[target=_blank]):not(:is(.no-icon,svg a,:has(img,svg))):after{display:inline-block;margin-top:-1px;margin-left:4px;width:11px;height:11px;background:currentColor;color:var(--vp-c-text-3);flex-shrink:0;--icon: url("data:image/svg+xml, %3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none' /%3E%3Cpath d='M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z' /%3E%3C/svg%3E");-webkit-mask-image:var(--icon);mask-image:var(--icon)}.vp-external-link-icon:after{content:""}.external-link-icon-enabled :is(.vp-doc a[href*="://"],.vp-doc a[target=_blank]):not(:is(.no-icon,svg a,:has(img,svg))):after{content:"";color:currentColor}.vp-sponsor{border-radius:16px;overflow:hidden}.vp-sponsor.aside{border-radius:12px}.vp-sponsor-section+.vp-sponsor-section{margin-top:4px}.vp-sponsor-tier{margin:0 0 4px!important;text-align:center;letter-spacing:1px!important;line-height:24px;width:100%;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-sponsor.normal .vp-sponsor-tier{padding:13px 0 11px;font-size:14px}.vp-sponsor.aside .vp-sponsor-tier{padding:9px 0 7px;font-size:12px}.vp-sponsor-grid+.vp-sponsor-tier{margin-top:4px}.vp-sponsor-grid{display:flex;flex-wrap:wrap;gap:4px}.vp-sponsor-grid.xmini .vp-sponsor-grid-link{height:64px}.vp-sponsor-grid.xmini .vp-sponsor-grid-image{max-width:64px;max-height:22px}.vp-sponsor-grid.mini .vp-sponsor-grid-link{height:72px}.vp-sponsor-grid.mini .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.small .vp-sponsor-grid-link{height:96px}.vp-sponsor-grid.small .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.medium .vp-sponsor-grid-link{height:112px}.vp-sponsor-grid.medium .vp-sponsor-grid-image{max-width:120px;max-height:36px}.vp-sponsor-grid.big .vp-sponsor-grid-link{height:184px}.vp-sponsor-grid.big .vp-sponsor-grid-image{max-width:192px;max-height:56px}.vp-sponsor-grid[data-vp-grid="2"] .vp-sponsor-grid-item{width:calc((100% - 4px)/2)}.vp-sponsor-grid[data-vp-grid="3"] .vp-sponsor-grid-item{width:calc((100% - 4px * 2) / 3)}.vp-sponsor-grid[data-vp-grid="4"] .vp-sponsor-grid-item{width:calc((100% - 12px)/4)}.vp-sponsor-grid[data-vp-grid="5"] .vp-sponsor-grid-item{width:calc((100% - 16px)/5)}.vp-sponsor-grid[data-vp-grid="6"] .vp-sponsor-grid-item{width:calc((100% - 4px * 5) / 6)}.vp-sponsor-grid-item{flex-shrink:0;width:100%;background-color:var(--vp-c-bg-soft);transition:background-color .25s}.vp-sponsor-grid-item:hover{background-color:var(--vp-c-default-soft)}.vp-sponsor-grid-item:hover .vp-sponsor-grid-image{filter:grayscale(0) invert(0)}.vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.dark .vp-sponsor-grid-item:hover{background-color:var(--vp-c-white)}.dark .vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.vp-sponsor-grid-link{display:flex}.vp-sponsor-grid-box{display:flex;justify-content:center;align-items:center;width:100%}.vp-sponsor-grid-image{max-width:100%;filter:grayscale(1);transition:filter .25s}.dark .vp-sponsor-grid-image{filter:grayscale(1) invert(1)}.VPBadge{display:inline-block;margin-left:2px;border:1px solid transparent;border-radius:12px;padding:0 10px;line-height:22px;font-size:12px;font-weight:500;transform:translateY(-2px)}.VPBadge.small{padding:0 6px;line-height:18px;font-size:10px;transform:translateY(-8px)}.VPDocFooter .VPBadge{display:none}.vp-doc h1>.VPBadge{margin-top:4px;vertical-align:top}.vp-doc h2>.VPBadge{margin-top:3px;padding:0 8px;vertical-align:top}.vp-doc h3>.VPBadge{vertical-align:middle}.vp-doc h4>.VPBadge,.vp-doc h5>.VPBadge,.vp-doc h6>.VPBadge{vertical-align:middle;line-height:18px}.VPBadge.info{border-color:var(--vp-badge-info-border);color:var(--vp-badge-info-text);background-color:var(--vp-badge-info-bg)}.VPBadge.tip{border-color:var(--vp-badge-tip-border);color:var(--vp-badge-tip-text);background-color:var(--vp-badge-tip-bg)}.VPBadge.warning{border-color:var(--vp-badge-warning-border);color:var(--vp-badge-warning-text);background-color:var(--vp-badge-warning-bg)}.VPBadge.danger{border-color:var(--vp-badge-danger-border);color:var(--vp-badge-danger-text);background-color:var(--vp-badge-danger-bg)}.VPBackdrop[data-v-eab00006]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--vp-z-index-backdrop);background:var(--vp-backdrop-bg-color);transition:opacity .5s}.VPBackdrop.fade-enter-from[data-v-eab00006],.VPBackdrop.fade-leave-to[data-v-eab00006]{opacity:0}.VPBackdrop.fade-leave-active[data-v-eab00006]{transition-duration:.25s}@media (min-width: 1280px){.VPBackdrop[data-v-eab00006]{display:none}}.NotFound[data-v-60b89e81]{padding:64px 24px 96px;text-align:center}@media (min-width: 768px){.NotFound[data-v-60b89e81]{padding:96px 32px 168px}}.code[data-v-60b89e81]{line-height:64px;font-size:64px;font-weight:600}.title[data-v-60b89e81]{padding-top:12px;letter-spacing:2px;line-height:20px;font-size:20px;font-weight:700}.divider[data-v-60b89e81]{margin:24px auto 18px;width:64px;height:1px;background-color:var(--vp-c-divider)}.quote[data-v-60b89e81]{margin:0 auto;max-width:256px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.action[data-v-60b89e81]{padding-top:20px}.link[data-v-60b89e81]{display:inline-block;border:1px solid var(--vp-c-brand-1);border-radius:16px;padding:3px 16px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:border-color .25s,color .25s}.link[data-v-60b89e81]:hover{border-color:var(--vp-c-brand-2);color:var(--vp-c-brand-2)}.root[data-v-c8fd7940]{position:relative;z-index:1}.nested[data-v-c8fd7940]{padding-right:16px;padding-left:16px}.outline-link[data-v-c8fd7940]{display:block;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color .5s}.outline-link[data-v-c8fd7940]:hover,.outline-link.active[data-v-c8fd7940]{color:var(--vp-c-text-1);transition:color .25s}.outline-link.nested[data-v-c8fd7940]{padding-left:13px}.VPDocAsideOutline[data-v-beb6bc9f]{display:none}.VPDocAsideOutline.has-outline[data-v-beb6bc9f]{display:block}.content[data-v-beb6bc9f]{position:relative;border-left:1px solid var(--vp-c-divider);padding-left:16px;font-size:13px;font-weight:500}.outline-marker[data-v-beb6bc9f]{position:absolute;top:32px;left:-1px;z-index:0;opacity:0;width:2px;border-radius:2px;height:18px;background-color:var(--vp-c-brand-1);transition:top .25s cubic-bezier(0,1,.5,1),background-color .5s,opacity .25s}.outline-title[data-v-beb6bc9f]{line-height:32px;font-size:14px;font-weight:600}.VPDocAside[data-v-c4200bf2]{display:flex;flex-direction:column;flex-grow:1}.spacer[data-v-c4200bf2]{flex-grow:1}.VPDocAside[data-v-c4200bf2] .spacer+.VPDocAsideSponsors,.VPDocAside[data-v-c4200bf2] .spacer+.VPDocAsideCarbonAds{margin-top:24px}.VPDocAside[data-v-c4200bf2] .VPDocAsideSponsors+.VPDocAsideCarbonAds{margin-top:16px}.VPLastUpdated[data-v-32a58613]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 640px){.VPLastUpdated[data-v-32a58613]{line-height:32px;font-size:14px;font-weight:500}}.VPDocFooter[data-v-35768638]{margin-top:64px}.edit-info[data-v-35768638]{padding-bottom:18px}@media (min-width: 640px){.edit-info[data-v-35768638]{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}.edit-link-button[data-v-35768638]{display:flex;align-items:center;border:0;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.edit-link-button[data-v-35768638]:hover{color:var(--vp-c-brand-2)}.edit-link-icon[data-v-35768638]{margin-right:8px}.prev-next[data-v-35768638]{border-top:1px solid var(--vp-c-divider);padding-top:24px;display:grid;grid-row-gap:8px}@media (min-width: 640px){.prev-next[data-v-35768638]{grid-template-columns:repeat(2,1fr);grid-column-gap:16px}}.pager-link[data-v-35768638]{display:block;border:1px solid var(--vp-c-divider);border-radius:8px;padding:11px 16px 13px;width:100%;height:100%;transition:border-color .25s}.pager-link[data-v-35768638]:hover{border-color:var(--vp-c-brand-1)}.pager-link.next[data-v-35768638]{margin-left:auto;text-align:right}.desc[data-v-35768638]{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.title[data-v-35768638]{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.VPDoc[data-v-4d316cbc]{padding:32px 24px 96px;width:100%}@media (min-width: 768px){.VPDoc[data-v-4d316cbc]{padding:48px 32px 128px}}@media (min-width: 960px){.VPDoc[data-v-4d316cbc]{padding:48px 32px 0}.VPDoc:not(.has-sidebar) .container[data-v-4d316cbc]{display:flex;justify-content:center;max-width:992px}.VPDoc:not(.has-sidebar) .content[data-v-4d316cbc]{max-width:752px}}@media (min-width: 1280px){.VPDoc .container[data-v-4d316cbc]{display:flex;justify-content:center}.VPDoc .aside[data-v-4d316cbc]{display:block}}@media (min-width: 1440px){.VPDoc:not(.has-sidebar) .content[data-v-4d316cbc]{max-width:784px}.VPDoc:not(.has-sidebar) .container[data-v-4d316cbc]{max-width:1104px}}.container[data-v-4d316cbc]{margin:0 auto;width:100%}.aside[data-v-4d316cbc]{position:relative;display:none;order:2;flex-grow:1;padding-left:32px;width:100%;max-width:256px}.left-aside[data-v-4d316cbc]{order:1;padding-left:unset;padding-right:32px}.aside-container[data-v-4d316cbc]{position:fixed;top:0;padding-top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + var(--vp-doc-top-height, 0px) + 48px);width:224px;height:100vh;overflow-x:hidden;overflow-y:auto;scrollbar-width:none}.aside-container[data-v-4d316cbc]::-webkit-scrollbar{display:none}.aside-curtain[data-v-4d316cbc]{position:fixed;bottom:0;z-index:10;width:224px;height:32px;background:linear-gradient(transparent,var(--vp-c-bg) 70%)}.aside-content[data-v-4d316cbc]{display:flex;flex-direction:column;min-height:calc(100vh - (var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px));padding-bottom:32px}.content[data-v-4d316cbc]{position:relative;margin:0 auto;width:100%}@media (min-width: 960px){.content[data-v-4d316cbc]{padding:0 32px 128px}}@media (min-width: 1280px){.content[data-v-4d316cbc]{order:1;margin:0;min-width:640px}}.content-container[data-v-4d316cbc]{margin:0 auto}.VPDoc.has-aside .content-container[data-v-4d316cbc]{max-width:688px}.VPButton[data-v-70e9ece9]{display:inline-block;border:1px solid transparent;text-align:center;font-weight:600;white-space:nowrap;transition:color .25s,border-color .25s,background-color .25s}.VPButton[data-v-70e9ece9]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-70e9ece9]{border-radius:20px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-70e9ece9]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-70e9ece9]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-70e9ece9]:hover{border-color:var(--vp-button-brand-hover-border);color:var(--vp-button-brand-hover-text);background-color:var(--vp-button-brand-hover-bg)}.VPButton.brand[data-v-70e9ece9]:active{border-color:var(--vp-button-brand-active-border);color:var(--vp-button-brand-active-text);background-color:var(--vp-button-brand-active-bg)}.VPButton.alt[data-v-70e9ece9]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-70e9ece9]:hover{border-color:var(--vp-button-alt-hover-border);color:var(--vp-button-alt-hover-text);background-color:var(--vp-button-alt-hover-bg)}.VPButton.alt[data-v-70e9ece9]:active{border-color:var(--vp-button-alt-active-border);color:var(--vp-button-alt-active-text);background-color:var(--vp-button-alt-active-bg)}.VPButton.sponsor[data-v-70e9ece9]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-70e9ece9]:hover{border-color:var(--vp-button-sponsor-hover-border);color:var(--vp-button-sponsor-hover-text);background-color:var(--vp-button-sponsor-hover-bg)}.VPButton.sponsor[data-v-70e9ece9]:active{border-color:var(--vp-button-sponsor-active-border);color:var(--vp-button-sponsor-active-text);background-color:var(--vp-button-sponsor-active-bg)}html:not(.dark) .VPImage.dark[data-v-4d0b3a1f]{display:none}.dark .VPImage.light[data-v-4d0b3a1f]{display:none}.VPHero[data-v-b684e0c8]{margin-top:calc((var(--vp-nav-height) + var(--vp-layout-top-height, 0px)) * -1);padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px) 24px 48px}@media (min-width: 640px){.VPHero[data-v-b684e0c8]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 48px 64px}}@media (min-width: 960px){.VPHero[data-v-b684e0c8]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 64px 64px}}.container[data-v-b684e0c8]{display:flex;flex-direction:column;margin:0 auto;max-width:1152px}@media (min-width: 960px){.container[data-v-b684e0c8]{flex-direction:row}}.main[data-v-b684e0c8]{position:relative;z-index:10;order:2;flex-grow:1;flex-shrink:0}.VPHero.has-image .container[data-v-b684e0c8]{text-align:center}@media (min-width: 960px){.VPHero.has-image .container[data-v-b684e0c8]{text-align:left}}@media (min-width: 960px){.main[data-v-b684e0c8]{order:1;width:calc((100% / 3) * 2)}.VPHero.has-image .main[data-v-b684e0c8]{max-width:592px}}.heading[data-v-b684e0c8]{display:flex;flex-direction:column}.name[data-v-b684e0c8],.text[data-v-b684e0c8]{width:fit-content;max-width:392px;letter-spacing:-.4px;line-height:40px;font-size:32px;font-weight:700;white-space:pre-wrap}.VPHero.has-image .name[data-v-b684e0c8],.VPHero.has-image .text[data-v-b684e0c8]{margin:0 auto}.name[data-v-b684e0c8]{color:var(--vp-home-hero-name-color)}.clip[data-v-b684e0c8]{background:var(--vp-home-hero-name-background);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:var(--vp-home-hero-name-color)}@media (min-width: 640px){.name[data-v-b684e0c8],.text[data-v-b684e0c8]{max-width:576px;line-height:56px;font-size:48px}}@media (min-width: 960px){.name[data-v-b684e0c8],.text[data-v-b684e0c8]{line-height:64px;font-size:56px}.VPHero.has-image .name[data-v-b684e0c8],.VPHero.has-image .text[data-v-b684e0c8]{margin:0}}.tagline[data-v-b684e0c8]{padding-top:8px;max-width:392px;line-height:28px;font-size:18px;font-weight:500;white-space:pre-wrap;color:var(--vp-c-text-2)}.VPHero.has-image .tagline[data-v-b684e0c8]{margin:0 auto}@media (min-width: 640px){.tagline[data-v-b684e0c8]{padding-top:12px;max-width:576px;line-height:32px;font-size:20px}}@media (min-width: 960px){.tagline[data-v-b684e0c8]{line-height:36px;font-size:24px}.VPHero.has-image .tagline[data-v-b684e0c8]{margin:0}}.actions[data-v-b684e0c8]{display:flex;flex-wrap:wrap;margin:-6px;padding-top:24px}.VPHero.has-image .actions[data-v-b684e0c8]{justify-content:center}@media (min-width: 640px){.actions[data-v-b684e0c8]{padding-top:32px}}@media (min-width: 960px){.VPHero.has-image .actions[data-v-b684e0c8]{justify-content:flex-start}}.action[data-v-b684e0c8]{flex-shrink:0;padding:6px}.image[data-v-b684e0c8]{order:1;margin:-76px -24px -48px}@media (min-width: 640px){.image[data-v-b684e0c8]{margin:-108px -24px -48px}}@media (min-width: 960px){.image[data-v-b684e0c8]{flex-grow:1;order:2;margin:0;min-height:100%}}.image-container[data-v-b684e0c8]{position:relative;margin:0 auto;width:320px;height:320px}@media (min-width: 640px){.image-container[data-v-b684e0c8]{width:392px;height:392px}}@media (min-width: 960px){.image-container[data-v-b684e0c8]{display:flex;justify-content:center;align-items:center;width:100%;height:100%;transform:translate(-32px,-32px)}}.image-bg[data-v-b684e0c8]{position:absolute;top:50%;left:50%;border-radius:50%;width:192px;height:192px;background-image:var(--vp-home-hero-image-background-image);filter:var(--vp-home-hero-image-filter);transform:translate(-50%,-50%)}@media (min-width: 640px){.image-bg[data-v-b684e0c8]{width:256px;height:256px}}@media (min-width: 960px){.image-bg[data-v-b684e0c8]{width:320px;height:320px}}[data-v-b684e0c8] .image-src{position:absolute;top:50%;left:50%;max-width:192px;max-height:192px;transform:translate(-50%,-50%)}@media (min-width: 640px){[data-v-b684e0c8] .image-src{max-width:256px;max-height:256px}}@media (min-width: 960px){[data-v-b684e0c8] .image-src{max-width:320px;max-height:320px}}.VPFeature[data-v-8c30a0c0]{display:block;border:1px solid var(--vp-c-bg-soft);border-radius:12px;height:100%;background-color:var(--vp-c-bg-soft);transition:border-color .25s,background-color .25s}.VPFeature.link[data-v-8c30a0c0]:hover{border-color:var(--vp-c-brand-1)}.box[data-v-8c30a0c0]{display:flex;flex-direction:column;padding:24px;height:100%}.box[data-v-8c30a0c0]>.VPImage{margin-bottom:20px}.icon[data-v-8c30a0c0]{display:flex;justify-content:center;align-items:center;margin-bottom:20px;border-radius:6px;background-color:var(--vp-c-default-soft);width:48px;height:48px;font-size:24px;transition:background-color .25s}.title[data-v-8c30a0c0]{line-height:24px;font-size:16px;font-weight:600}.details[data-v-8c30a0c0]{flex-grow:1;padding-top:8px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.link-text[data-v-8c30a0c0]{padding-top:8px}.link-text-value[data-v-8c30a0c0]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.link-text-icon[data-v-8c30a0c0]{margin-left:6px}.VPFeatures[data-v-7cef5655]{position:relative;padding:0 24px}@media (min-width: 640px){.VPFeatures[data-v-7cef5655]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-7cef5655]{padding:0 64px}}.container[data-v-7cef5655]{margin:0 auto;max-width:1152px}.items[data-v-7cef5655]{display:flex;flex-wrap:wrap;margin:-8px}.item[data-v-7cef5655]{padding:8px;width:100%}@media (min-width: 640px){.item.grid-2[data-v-7cef5655],.item.grid-4[data-v-7cef5655],.item.grid-6[data-v-7cef5655]{width:50%}}@media (min-width: 768px){.item.grid-2[data-v-7cef5655],.item.grid-4[data-v-7cef5655]{width:50%}.item.grid-3[data-v-7cef5655],.item.grid-6[data-v-7cef5655]{width:calc(100% / 3)}}@media (min-width: 960px){.item.grid-4[data-v-7cef5655]{width:25%}}.container[data-v-5377254e]{margin:auto;width:100%;max-width:1280px;padding:0 24px}@media (min-width: 640px){.container[data-v-5377254e]{padding:0 48px}}@media (min-width: 960px){.container[data-v-5377254e]{width:100%;padding:0 64px}}.vp-doc[data-v-5377254e] .VPHomeSponsors,.vp-doc[data-v-5377254e] .VPTeamPage{margin-left:var(--vp-offset, calc(50% - 50vw) );margin-right:var(--vp-offset, calc(50% - 50vw) )}.vp-doc[data-v-5377254e] .VPHomeSponsors h2{border-top:none;letter-spacing:normal}.vp-doc[data-v-5377254e] .VPHomeSponsors a,.vp-doc[data-v-5377254e] .VPTeamPage a{text-decoration:none}.VPHome[data-v-1bcd8668]{margin-bottom:96px}@media (min-width: 768px){.VPHome[data-v-1bcd8668]{margin-bottom:128px}}.VPContent[data-v-8d143afd]{flex-grow:1;flex-shrink:0;margin:var(--vp-layout-top-height, 0px) auto 0;width:100%}.VPContent.is-home[data-v-8d143afd]{width:100%;max-width:100%}.VPContent.has-sidebar[data-v-8d143afd]{margin:0}@media (min-width: 960px){.VPContent[data-v-8d143afd]{padding-top:var(--vp-nav-height)}.VPContent.has-sidebar[data-v-8d143afd]{margin:var(--vp-layout-top-height, 0px) 0 0;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPContent.has-sidebar[data-v-8d143afd]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.VPFooter[data-v-45624e61]{position:relative;z-index:var(--vp-z-index-footer);border-top:1px solid var(--vp-c-gutter);padding:32px 24px;background-color:var(--vp-c-bg)}.VPFooter.has-sidebar[data-v-45624e61]{display:none}.VPFooter[data-v-45624e61] a{text-decoration-line:underline;text-underline-offset:2px;transition:color .25s}.VPFooter[data-v-45624e61] a:hover{color:var(--vp-c-text-1)}@media (min-width: 768px){.VPFooter[data-v-45624e61]{padding:32px}}.container[data-v-45624e61]{margin:0 auto;max-width:var(--vp-layout-max-width);text-align:center}.message[data-v-45624e61],.copyright[data-v-45624e61]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.VPLocalNavOutlineDropdown[data-v-bd1fb31f]{padding:12px 20px 11px}@media (min-width: 960px){.VPLocalNavOutlineDropdown[data-v-bd1fb31f]{padding:12px 36px 11px}}.VPLocalNavOutlineDropdown button[data-v-bd1fb31f]{display:block;font-size:12px;font-weight:500;line-height:24px;color:var(--vp-c-text-2);transition:color .5s;position:relative}.VPLocalNavOutlineDropdown button[data-v-bd1fb31f]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPLocalNavOutlineDropdown button.open[data-v-bd1fb31f]{color:var(--vp-c-text-1)}.icon[data-v-bd1fb31f]{display:inline-block;vertical-align:middle;margin-left:2px;font-size:14px;transform:rotate(0);transition:transform .25s}@media (min-width: 960px){.VPLocalNavOutlineDropdown button[data-v-bd1fb31f]{font-size:14px}.icon[data-v-bd1fb31f]{font-size:16px}}.open>.icon[data-v-bd1fb31f]{transform:rotate(90deg)}.items[data-v-bd1fb31f]{position:absolute;top:40px;right:16px;left:16px;display:grid;gap:1px;border:1px solid var(--vp-c-border);border-radius:8px;background-color:var(--vp-c-gutter);max-height:calc(var(--vp-vh, 100vh) - 86px);overflow:hidden auto;box-shadow:var(--vp-shadow-3)}@media (min-width: 960px){.items[data-v-bd1fb31f]{right:auto;left:calc(var(--vp-sidebar-width) + 32px);width:320px}}.header[data-v-bd1fb31f]{background-color:var(--vp-c-bg-soft)}.top-link[data-v-bd1fb31f]{display:block;padding:0 16px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.outline[data-v-bd1fb31f]{padding:8px 0;background-color:var(--vp-c-bg-soft)}.flyout-enter-active[data-v-bd1fb31f]{transition:all .2s ease-out}.flyout-leave-active[data-v-bd1fb31f]{transition:all .15s ease-in}.flyout-enter-from[data-v-bd1fb31f],.flyout-leave-to[data-v-bd1fb31f]{opacity:0;transform:translateY(-16px)}.VPLocalNav[data-v-3eeb2970]{position:sticky;top:0;left:0;z-index:var(--vp-z-index-local-nav);border-bottom:1px solid var(--vp-c-gutter);padding-top:var(--vp-layout-top-height, 0px);width:100%;background-color:var(--vp-local-nav-bg-color)}.VPLocalNav.fixed[data-v-3eeb2970]{position:fixed}@media (min-width: 960px){.VPLocalNav[data-v-3eeb2970]{top:var(--vp-nav-height)}.VPLocalNav.has-sidebar[data-v-3eeb2970]{padding-left:var(--vp-sidebar-width)}.VPLocalNav.empty[data-v-3eeb2970]{display:none}}@media (min-width: 1280px){.VPLocalNav[data-v-3eeb2970]{display:none}}@media (min-width: 1440px){.VPLocalNav.has-sidebar[data-v-3eeb2970]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.container[data-v-3eeb2970]{display:flex;justify-content:space-between;align-items:center}.menu[data-v-3eeb2970]{display:flex;align-items:center;padding:12px 24px 11px;line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.menu[data-v-3eeb2970]:hover{color:var(--vp-c-text-1);transition:color .25s}@media (min-width: 768px){.menu[data-v-3eeb2970]{padding:0 32px}}@media (min-width: 960px){.menu[data-v-3eeb2970]{display:none}}.menu-icon[data-v-3eeb2970]{margin-right:8px;font-size:14px}.VPOutlineDropdown[data-v-3eeb2970]{padding:12px 24px 11px}@media (min-width: 768px){.VPOutlineDropdown[data-v-3eeb2970]{padding:12px 32px 11px}}.VPSwitch[data-v-4ec3b2fe]{position:relative;border-radius:11px;display:block;width:40px;height:22px;flex-shrink:0;border:1px solid var(--vp-input-border-color);background-color:var(--vp-input-switch-bg-color);transition:border-color .25s!important}.VPSwitch[data-v-4ec3b2fe]:hover{border-color:var(--vp-c-brand-1)}.check[data-v-4ec3b2fe]{position:absolute;top:1px;left:1px;width:18px;height:18px;border-radius:50%;background-color:var(--vp-c-neutral-inverse);box-shadow:var(--vp-shadow-1);transition:transform .25s!important}.icon[data-v-4ec3b2fe]{position:relative;display:block;width:18px;height:18px;border-radius:50%;overflow:hidden}.icon[data-v-4ec3b2fe] [class^=vpi-]{position:absolute;top:3px;left:3px;width:12px;height:12px;color:var(--vp-c-text-2)}.dark .icon[data-v-4ec3b2fe] [class^=vpi-]{color:var(--vp-c-text-1);transition:opacity .25s!important}.sun[data-v-ae950ac5]{opacity:1}.moon[data-v-ae950ac5],.dark .sun[data-v-ae950ac5]{opacity:0}.dark .moon[data-v-ae950ac5]{opacity:1}.dark .VPSwitchAppearance[data-v-ae950ac5] .check{transform:translate(18px)}.VPNavBarAppearance[data-v-764c0058]{display:none}@media (min-width: 1280px){.VPNavBarAppearance[data-v-764c0058]{display:flex;align-items:center}}.VPMenuGroup+.VPMenuLink[data-v-acee1e57]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.link[data-v-acee1e57]{display:block;border-radius:6px;padding:0 12px;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);white-space:nowrap;transition:background-color .25s,color .25s}.link[data-v-acee1e57]:hover{color:var(--vp-c-brand-1);background-color:var(--vp-c-default-soft)}.link.active[data-v-acee1e57]{color:var(--vp-c-brand-1)}.VPMenuGroup[data-v-9e18ca71]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.VPMenuGroup[data-v-9e18ca71]:first-child{margin-top:0;border-top:0;padding-top:0}.VPMenuGroup+.VPMenuGroup[data-v-9e18ca71]{margin-top:12px;border-top:1px solid var(--vp-c-divider)}.title[data-v-9e18ca71]{padding:0 12px;line-height:32px;font-size:14px;font-weight:600;color:var(--vp-c-text-2);white-space:nowrap;transition:color .25s}.VPMenu[data-v-3e022afb]{border-radius:12px;padding:12px;min-width:128px;border:1px solid var(--vp-c-divider);background-color:var(--vp-c-bg-elv);box-shadow:var(--vp-shadow-3);transition:background-color .5s;max-height:calc(100vh - var(--vp-nav-height));overflow-y:auto}.VPMenu[data-v-3e022afb] .group{margin:0 -12px;padding:0 12px 12px}.VPMenu[data-v-3e022afb] .group+.group{border-top:1px solid var(--vp-c-divider);padding:11px 12px 12px}.VPMenu[data-v-3e022afb] .group:last-child{padding-bottom:0}.VPMenu[data-v-3e022afb] .group+.item{border-top:1px solid var(--vp-c-divider);padding:11px 16px 0}.VPMenu[data-v-3e022afb] .item{padding:0 16px;white-space:nowrap}.VPMenu[data-v-3e022afb] .label{flex-grow:1;line-height:28px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.VPMenu[data-v-3e022afb] .action{padding-left:24px}.VPFlyout[data-v-95325d79]{position:relative}.VPFlyout[data-v-95325d79]:hover{color:var(--vp-c-brand-1);transition:color .25s}.VPFlyout:hover .text[data-v-95325d79]{color:var(--vp-c-text-2)}.VPFlyout:hover .icon[data-v-95325d79]{fill:var(--vp-c-text-2)}.VPFlyout.active .text[data-v-95325d79]{color:var(--vp-c-brand-1)}.VPFlyout.active:hover .text[data-v-95325d79]{color:var(--vp-c-brand-2)}.button[aria-expanded=false]+.menu[data-v-95325d79]{opacity:0;visibility:hidden;transform:translateY(0)}.VPFlyout:hover .menu[data-v-95325d79],.button[aria-expanded=true]+.menu[data-v-95325d79]{opacity:1;visibility:visible;transform:translateY(0)}.button[data-v-95325d79]{display:flex;align-items:center;padding:0 12px;height:var(--vp-nav-height);color:var(--vp-c-text-1);transition:color .5s}.text[data-v-95325d79]{display:flex;align-items:center;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.option-icon[data-v-95325d79]{margin-right:0;font-size:16px}.text-icon[data-v-95325d79]{margin-left:4px;font-size:14px}.icon[data-v-95325d79]{font-size:20px;transition:fill .25s}.menu[data-v-95325d79]{position:absolute;top:calc(var(--vp-nav-height) / 2 + 20px);right:0;opacity:0;visibility:hidden;transition:opacity .25s,visibility .25s,transform .25s}.VPSocialLink[data-v-71029e87]{display:flex;justify-content:center;align-items:center;width:36px;height:36px;color:var(--vp-c-text-2);transition:color .5s}.VPSocialLink[data-v-71029e87]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPSocialLink[data-v-71029e87]>svg,.VPSocialLink[data-v-71029e87]>[class^=vpi-social-]{width:20px;height:20px;fill:currentColor}.VPSocialLinks[data-v-c9b9e435]{display:flex;justify-content:center}.VPNavBarExtra[data-v-cc85dc96]{display:none;margin-right:-12px}@media (min-width: 768px){.VPNavBarExtra[data-v-cc85dc96]{display:block}}@media (min-width: 1280px){.VPNavBarExtra[data-v-cc85dc96]{display:none}}.trans-title[data-v-cc85dc96]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.item.appearance[data-v-cc85dc96],.item.social-links[data-v-cc85dc96]{display:flex;align-items:center;padding:0 12px}.item.appearance[data-v-cc85dc96]{min-width:176px}.appearance-action[data-v-cc85dc96]{margin-right:-2px}.social-links-list[data-v-cc85dc96]{margin:-4px -8px}.VPNavBarHamburger[data-v-e08ccaba]{display:flex;justify-content:center;align-items:center;width:48px;height:var(--vp-nav-height)}@media (min-width: 768px){.VPNavBarHamburger[data-v-e08ccaba]{display:none}}.container[data-v-e08ccaba]{position:relative;width:16px;height:14px;overflow:hidden}.VPNavBarHamburger:hover .top[data-v-e08ccaba]{top:0;left:0;transform:translate(4px)}.VPNavBarHamburger:hover .middle[data-v-e08ccaba]{top:6px;left:0;transform:translate(0)}.VPNavBarHamburger:hover .bottom[data-v-e08ccaba]{top:12px;left:0;transform:translate(8px)}.VPNavBarHamburger.active .top[data-v-e08ccaba]{top:6px;transform:translate(0) rotate(225deg)}.VPNavBarHamburger.active .middle[data-v-e08ccaba]{top:6px;transform:translate(16px)}.VPNavBarHamburger.active .bottom[data-v-e08ccaba]{top:6px;transform:translate(0) rotate(135deg)}.VPNavBarHamburger.active:hover .top[data-v-e08ccaba],.VPNavBarHamburger.active:hover .middle[data-v-e08ccaba],.VPNavBarHamburger.active:hover .bottom[data-v-e08ccaba]{background-color:var(--vp-c-text-2);transition:top .25s,background-color .25s,transform .25s}.top[data-v-e08ccaba],.middle[data-v-e08ccaba],.bottom[data-v-e08ccaba]{position:absolute;width:16px;height:2px;background-color:var(--vp-c-text-1);transition:top .25s,background-color .5s,transform .25s}.top[data-v-e08ccaba]{top:0;left:0;transform:translate(0)}.middle[data-v-e08ccaba]{top:6px;left:0;transform:translate(8px)}.bottom[data-v-e08ccaba]{top:12px;left:0;transform:translate(4px)}.VPNavBarMenuLink[data-v-bbf7f74d]{display:flex;align-items:center;padding:0 12px;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.VPNavBarMenuLink.active[data-v-bbf7f74d],.VPNavBarMenuLink[data-v-bbf7f74d]:hover{color:var(--vp-c-brand-1)}.VPNavBarMenu[data-v-d53bf4df]{display:none}@media (min-width: 768px){.VPNavBarMenu[data-v-d53bf4df]{display:flex}}/*! @docsearch/css 3.8.2 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */:root{--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:rgba(101,108,133,.8);--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 hsla(0,0%,100%,.5),0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px rgba(30,35,90,.4);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 1px 0 rgba(30,35,90,.4);--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 rgba(69,98,155,.12)}html[data-theme=dark]{--docsearch-text-color:#f5f6f7;--docsearch-container-background:rgba(9,10,17,.8);--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 rgba(3,4,9,.3);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 1px 1px 0 #0304094d;--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 rgba(73,76,106,.5),0 -4px 8px 0 rgba(0,0,0,.2);--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}.DocSearch-Button{align-items:center;background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;display:flex;font-weight:500;height:36px;justify-content:space-between;margin:0 0 0 16px;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:none}.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border:0;border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 2px;position:relative;top:-1px;width:20px}.DocSearch-Button-Key--pressed{box-shadow:var(--docsearch-key-pressed-shadow);transform:translate3d(0,1px,0)}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder{display:none}}.DocSearch--active{overflow:hidden!important}.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:none;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator{display:none}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{animation:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}}.DocSearch-Reset{animation:fade-in .1s ease-in forwards;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Cancel{display:none}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:transparent}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Help{font-size:.9em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{color:var(--docsearch-muted-color);display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--deleting{transition:none}}.DocSearch-Hit--deleting{opacity:0;transition:all .25s linear}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--favoriting{transition:none}}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:all .25s linear;transition-delay:.25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;stroke-width:var(--docsearch-icon-stroke-width);width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit[aria-selected=true] mark{text-decoration:underline}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color);stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:background-color .1s ease-in}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{transition:none}}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:none}}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:none;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border:0;border-radius:2px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;width:20px}.DocSearch-VisuallyHiddenForAccessibility{clip:rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}@media (max-width:768px){:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Dropdown{max-height:calc(var(--docsearch-vh, 1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Cancel{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:none;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}[class*=DocSearch]{--docsearch-primary-color: var(--vp-c-brand-1);--docsearch-highlight-color: var(--docsearch-primary-color);--docsearch-text-color: var(--vp-c-text-1);--docsearch-muted-color: var(--vp-c-text-2);--docsearch-searchbox-shadow: none;--docsearch-searchbox-background: transparent;--docsearch-searchbox-focus-background: transparent;--docsearch-key-gradient: transparent;--docsearch-key-shadow: none;--docsearch-modal-background: var(--vp-c-bg-soft);--docsearch-footer-background: var(--vp-c-bg)}.dark [class*=DocSearch]{--docsearch-modal-shadow: none;--docsearch-footer-shadow: none;--docsearch-logo-color: var(--vp-c-text-2);--docsearch-hit-background: var(--vp-c-default-soft);--docsearch-hit-color: var(--vp-c-text-2);--docsearch-hit-shadow: none}.DocSearch-Button{display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:48px;height:55px;background:transparent;transition:border-color .25s}.DocSearch-Button:hover{background:transparent}.DocSearch-Button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.DocSearch-Button-Key--pressed{transform:none;box-shadow:none}.DocSearch-Button:focus:not(:focus-visible){outline:none!important}@media (min-width: 768px){.DocSearch-Button{justify-content:flex-start;border:1px solid transparent;border-radius:8px;padding:0 10px 0 12px;width:100%;height:40px;background-color:var(--vp-c-bg-alt)}.DocSearch-Button:hover{border-color:var(--vp-c-brand-1);background:var(--vp-c-bg-alt)}}.DocSearch-Button .DocSearch-Button-Container{display:flex;align-items:center}.DocSearch-Button .DocSearch-Search-Icon{position:relative;width:16px;height:16px;color:var(--vp-c-text-1);fill:currentColor;transition:color .5s}.DocSearch-Button:hover .DocSearch-Search-Icon{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Search-Icon{top:1px;margin-right:8px;width:14px;height:14px;color:var(--vp-c-text-2)}}.DocSearch-Button .DocSearch-Button-Placeholder{display:none;margin-top:2px;padding:0 16px 0 0;font-size:13px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.DocSearch-Button:hover .DocSearch-Button-Placeholder{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Placeholder{display:inline-block}}.DocSearch-Button .DocSearch-Button-Keys{direction:ltr;display:none;min-width:auto}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Keys{display:flex;align-items:center}}.DocSearch-Button .DocSearch-Button-Key{display:block;margin:2px 0 0;border:1px solid var(--vp-c-divider);border-right:none;border-radius:4px 0 0 4px;padding-left:6px;min-width:0;width:auto;height:22px;line-height:22px;font-family:var(--vp-font-family-base);font-size:12px;font-weight:500;transition:color .5s,border-color .5s}.DocSearch-Button .DocSearch-Button-Key+.DocSearch-Button-Key{border-right:1px solid var(--vp-c-divider);border-left:none;border-radius:0 4px 4px 0;padding-left:2px;padding-right:6px}.DocSearch-Button .DocSearch-Button-Key:first-child{font-size:0!important}.DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"Ctrl";font-size:12px;letter-spacing:normal;color:var(--docsearch-muted-color)}.mac .DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"⌘"}.DocSearch-Button .DocSearch-Button-Key:first-child>*{display:none}.DocSearch-Search-Icon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' stroke-width='1.6' viewBox='0 0 20 20'%3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' d='m14.386 14.386 4.088 4.088-4.088-4.088A7.533 7.533 0 1 1 3.733 3.733a7.533 7.533 0 0 1 10.653 10.653z'/%3E%3C/svg%3E")}.VPNavBarSearch{display:flex;align-items:center}@media (min-width: 768px){.VPNavBarSearch{flex-grow:1;padding-left:24px}}@media (min-width: 960px){.VPNavBarSearch{padding-left:32px}}.dark .DocSearch-Footer{border-top:1px solid var(--vp-c-divider)}.DocSearch-Form{border:1px solid var(--vp-c-brand-1);background-color:var(--vp-c-white)}.dark .DocSearch-Form{background-color:var(--vp-c-default-soft)}.DocSearch-Screen-Icon>svg{margin:auto}.VPNavBarSocialLinks[data-v-d6e28fe5]{display:none}@media (min-width: 1280px){.VPNavBarSocialLinks[data-v-d6e28fe5]{display:flex;align-items:center}}.title[data-v-211643ab]{display:flex;align-items:center;border-bottom:1px solid transparent;width:100%;height:var(--vp-nav-height);font-size:16px;font-weight:600;color:var(--vp-c-text-1);transition:opacity .25s}@media (min-width: 960px){.title[data-v-211643ab]{flex-shrink:0}.VPNavBarTitle.has-sidebar .title[data-v-211643ab]{border-bottom-color:var(--vp-c-divider)}}[data-v-211643ab] .logo{margin-right:8px;height:var(--vp-nav-logo-height)}.VPNavBarTranslations[data-v-9d8c2f62]{display:none}@media (min-width: 1280px){.VPNavBarTranslations[data-v-9d8c2f62]{display:flex;align-items:center}}.title[data-v-9d8c2f62]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.VPNavBar[data-v-511c2cc9]{position:relative;height:var(--vp-nav-height);pointer-events:none;white-space:nowrap;transition:background-color .25s}.VPNavBar.screen-open[data-v-511c2cc9]{transition:none;background-color:var(--vp-nav-bg-color);border-bottom:1px solid var(--vp-c-divider)}.VPNavBar[data-v-511c2cc9]:not(.home){background-color:var(--vp-nav-bg-color)}@media (min-width: 960px){.VPNavBar[data-v-511c2cc9]:not(.home){background-color:transparent}.VPNavBar[data-v-511c2cc9]:not(.has-sidebar):not(.home.top){background-color:var(--vp-nav-bg-color)}}.wrapper[data-v-511c2cc9]{padding:0 8px 0 24px}@media (min-width: 768px){.wrapper[data-v-511c2cc9]{padding:0 32px}}@media (min-width: 960px){.VPNavBar.has-sidebar .wrapper[data-v-511c2cc9]{padding:0}}.container[data-v-511c2cc9]{display:flex;justify-content:space-between;margin:0 auto;max-width:calc(var(--vp-layout-max-width) - 64px);height:var(--vp-nav-height);pointer-events:none}.container>.title[data-v-511c2cc9],.container>.content[data-v-511c2cc9]{pointer-events:none}.container[data-v-511c2cc9] *{pointer-events:auto}@media (min-width: 960px){.VPNavBar.has-sidebar .container[data-v-511c2cc9]{max-width:100%}}.title[data-v-511c2cc9]{flex-shrink:0;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .title[data-v-511c2cc9]{position:absolute;top:0;left:0;z-index:2;padding:0 32px;width:var(--vp-sidebar-width);height:var(--vp-nav-height);background-color:transparent}}@media (min-width: 1440px){.VPNavBar.has-sidebar .title[data-v-511c2cc9]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}.content[data-v-511c2cc9]{flex-grow:1}@media (min-width: 960px){.VPNavBar.has-sidebar .content[data-v-511c2cc9]{position:relative;z-index:1;padding-right:32px;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .content[data-v-511c2cc9]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2 + 32px);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.content-body[data-v-511c2cc9]{display:flex;justify-content:flex-end;align-items:center;height:var(--vp-nav-height);transition:background-color .5s}@media (min-width: 960px){.VPNavBar:not(.home.top) .content-body[data-v-511c2cc9]{position:relative;background-color:var(--vp-nav-bg-color)}.VPNavBar:not(.has-sidebar):not(.home.top) .content-body[data-v-511c2cc9]{background-color:transparent}}@media (max-width: 767px){.content-body[data-v-511c2cc9]{column-gap:.5rem}}.menu+.translations[data-v-511c2cc9]:before,.menu+.appearance[data-v-511c2cc9]:before,.menu+.social-links[data-v-511c2cc9]:before,.translations+.appearance[data-v-511c2cc9]:before,.appearance+.social-links[data-v-511c2cc9]:before{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--vp-c-divider);content:""}.menu+.appearance[data-v-511c2cc9]:before,.translations+.appearance[data-v-511c2cc9]:before{margin-right:16px}.appearance+.social-links[data-v-511c2cc9]:before{margin-left:16px}.social-links[data-v-511c2cc9]{margin-right:-8px}.divider[data-v-511c2cc9]{width:100%;height:1px}@media (min-width: 960px){.VPNavBar.has-sidebar .divider[data-v-511c2cc9]{padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .divider[data-v-511c2cc9]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.divider-line[data-v-511c2cc9]{width:100%;height:1px;transition:background-color .5s}.VPNavBar:not(.home) .divider-line[data-v-511c2cc9]{background-color:var(--vp-c-gutter)}@media (min-width: 960px){.VPNavBar:not(.home.top) .divider-line[data-v-511c2cc9]{background-color:var(--vp-c-gutter)}.VPNavBar:not(.has-sidebar):not(.home.top) .divider[data-v-511c2cc9]{background-color:var(--vp-c-gutter)}}.VPNavScreenAppearance[data-v-15ad096a]{display:flex;justify-content:space-between;align-items:center;border-radius:8px;padding:12px 14px 12px 16px;background-color:var(--vp-c-bg-soft)}.text[data-v-15ad096a]{line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.VPNavScreenMenuLink[data-v-4fb78c30]{display:block;border-bottom:1px solid var(--vp-c-divider);padding:12px 0 11px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:border-color .25s,color .25s}.VPNavScreenMenuLink[data-v-4fb78c30]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupLink[data-v-64059e46]{display:block;margin-left:12px;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-1);transition:color .25s}.VPNavScreenMenuGroupLink[data-v-64059e46]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupSection[data-v-52a35d42]{display:block}.title[data-v-52a35d42]{line-height:32px;font-size:13px;font-weight:700;color:var(--vp-c-text-2);transition:color .25s}.VPNavScreenMenuGroup[data-v-1e2bb94d]{border-bottom:1px solid var(--vp-c-divider);height:48px;overflow:hidden;transition:border-color .5s}.VPNavScreenMenuGroup .items[data-v-1e2bb94d]{visibility:hidden}.VPNavScreenMenuGroup.open .items[data-v-1e2bb94d]{visibility:visible}.VPNavScreenMenuGroup.open[data-v-1e2bb94d]{padding-bottom:10px;height:auto}.VPNavScreenMenuGroup.open .button[data-v-1e2bb94d]{padding-bottom:6px;color:var(--vp-c-brand-1)}.VPNavScreenMenuGroup.open .button-icon[data-v-1e2bb94d]{transform:rotate(45deg)}.button[data-v-1e2bb94d]{display:flex;justify-content:space-between;align-items:center;padding:12px 4px 11px 0;width:100%;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.button[data-v-1e2bb94d]:hover{color:var(--vp-c-brand-1)}.button-icon[data-v-1e2bb94d]{transition:transform .25s}.group[data-v-1e2bb94d]:first-child{padding-top:0}.group+.group[data-v-1e2bb94d],.group+.item[data-v-1e2bb94d]{padding-top:4px}.VPNavScreenTranslations[data-v-da51982f]{height:24px;overflow:hidden}.VPNavScreenTranslations.open[data-v-da51982f]{height:auto}.title[data-v-da51982f]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-text-1)}.icon[data-v-da51982f]{font-size:16px}.icon.lang[data-v-da51982f]{margin-right:8px}.icon.chevron[data-v-da51982f]{margin-left:4px}.list[data-v-da51982f]{padding:4px 0 0 24px}.link[data-v-da51982f]{line-height:32px;font-size:13px;color:var(--vp-c-text-1)}.VPNavScreen[data-v-9cc6cbea]{position:fixed;top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px));right:0;bottom:0;left:0;padding:0 32px;width:100%;background-color:var(--vp-nav-screen-bg-color);overflow-y:auto;transition:background-color .25s;pointer-events:auto}.VPNavScreen.fade-enter-active[data-v-9cc6cbea],.VPNavScreen.fade-leave-active[data-v-9cc6cbea]{transition:opacity .25s}.VPNavScreen.fade-enter-active .container[data-v-9cc6cbea],.VPNavScreen.fade-leave-active .container[data-v-9cc6cbea]{transition:transform .25s ease}.VPNavScreen.fade-enter-from[data-v-9cc6cbea],.VPNavScreen.fade-leave-to[data-v-9cc6cbea]{opacity:0}.VPNavScreen.fade-enter-from .container[data-v-9cc6cbea],.VPNavScreen.fade-leave-to .container[data-v-9cc6cbea]{transform:translateY(-8px)}@media (min-width: 768px){.VPNavScreen[data-v-9cc6cbea]{display:none}}.container[data-v-9cc6cbea]{margin:0 auto;padding:24px 0 96px;max-width:288px}.menu+.translations[data-v-9cc6cbea],.menu+.appearance[data-v-9cc6cbea],.translations+.appearance[data-v-9cc6cbea]{margin-top:24px}.menu+.social-links[data-v-9cc6cbea]{margin-top:16px}.appearance+.social-links[data-v-9cc6cbea]{margin-top:16px}.VPNav[data-v-1f7b0f5c]{position:relative;top:var(--vp-layout-top-height, 0px);left:0;z-index:var(--vp-z-index-nav);width:100%;pointer-events:none;transition:background-color .5s}@media (min-width: 960px){.VPNav[data-v-1f7b0f5c]{position:fixed}}.VPSidebarItem.level-0[data-v-6092ddf2]{padding-bottom:24px}.VPSidebarItem.collapsed.level-0[data-v-6092ddf2]{padding-bottom:10px}.item[data-v-6092ddf2]{position:relative;display:flex;width:100%}.VPSidebarItem.collapsible>.item[data-v-6092ddf2]{cursor:pointer}.indicator[data-v-6092ddf2]{position:absolute;top:6px;bottom:6px;left:-17px;width:2px;border-radius:2px;transition:background-color .25s}.VPSidebarItem.level-2.is-active>.item>.indicator[data-v-6092ddf2],.VPSidebarItem.level-3.is-active>.item>.indicator[data-v-6092ddf2],.VPSidebarItem.level-4.is-active>.item>.indicator[data-v-6092ddf2],.VPSidebarItem.level-5.is-active>.item>.indicator[data-v-6092ddf2]{background-color:var(--vp-c-brand-1)}.link[data-v-6092ddf2]{display:flex;align-items:center;flex-grow:1}.text[data-v-6092ddf2]{flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;transition:color .25s}.VPSidebarItem.level-0 .text[data-v-6092ddf2]{font-weight:700;color:var(--vp-c-text-1)}.VPSidebarItem.level-1 .text[data-v-6092ddf2],.VPSidebarItem.level-2 .text[data-v-6092ddf2],.VPSidebarItem.level-3 .text[data-v-6092ddf2],.VPSidebarItem.level-4 .text[data-v-6092ddf2],.VPSidebarItem.level-5 .text[data-v-6092ddf2]{font-weight:500;color:var(--vp-c-text-2)}.VPSidebarItem.level-0.is-link>.item>.link:hover .text[data-v-6092ddf2],.VPSidebarItem.level-1.is-link>.item>.link:hover .text[data-v-6092ddf2],.VPSidebarItem.level-2.is-link>.item>.link:hover .text[data-v-6092ddf2],.VPSidebarItem.level-3.is-link>.item>.link:hover .text[data-v-6092ddf2],.VPSidebarItem.level-4.is-link>.item>.link:hover .text[data-v-6092ddf2],.VPSidebarItem.level-5.is-link>.item>.link:hover .text[data-v-6092ddf2]{color:var(--vp-c-brand-1)}.VPSidebarItem.level-0.has-active>.item>.text[data-v-6092ddf2],.VPSidebarItem.level-1.has-active>.item>.text[data-v-6092ddf2],.VPSidebarItem.level-2.has-active>.item>.text[data-v-6092ddf2],.VPSidebarItem.level-3.has-active>.item>.text[data-v-6092ddf2],.VPSidebarItem.level-4.has-active>.item>.text[data-v-6092ddf2],.VPSidebarItem.level-5.has-active>.item>.text[data-v-6092ddf2],.VPSidebarItem.level-0.has-active>.item>.link>.text[data-v-6092ddf2],.VPSidebarItem.level-1.has-active>.item>.link>.text[data-v-6092ddf2],.VPSidebarItem.level-2.has-active>.item>.link>.text[data-v-6092ddf2],.VPSidebarItem.level-3.has-active>.item>.link>.text[data-v-6092ddf2],.VPSidebarItem.level-4.has-active>.item>.link>.text[data-v-6092ddf2],.VPSidebarItem.level-5.has-active>.item>.link>.text[data-v-6092ddf2]{color:var(--vp-c-text-1)}.VPSidebarItem.level-0.is-active>.item .link>.text[data-v-6092ddf2],.VPSidebarItem.level-1.is-active>.item .link>.text[data-v-6092ddf2],.VPSidebarItem.level-2.is-active>.item .link>.text[data-v-6092ddf2],.VPSidebarItem.level-3.is-active>.item .link>.text[data-v-6092ddf2],.VPSidebarItem.level-4.is-active>.item .link>.text[data-v-6092ddf2],.VPSidebarItem.level-5.is-active>.item .link>.text[data-v-6092ddf2]{color:var(--vp-c-brand-1)}.caret[data-v-6092ddf2]{display:flex;justify-content:center;align-items:center;margin-right:-7px;width:32px;height:32px;color:var(--vp-c-text-3);cursor:pointer;transition:color .25s;flex-shrink:0}.item:hover .caret[data-v-6092ddf2]{color:var(--vp-c-text-2)}.item:hover .caret[data-v-6092ddf2]:hover{color:var(--vp-c-text-1)}.caret-icon[data-v-6092ddf2]{font-size:18px;transform:rotate(90deg);transition:transform .25s}.VPSidebarItem.collapsed .caret-icon[data-v-6092ddf2]{transform:rotate(0)}.VPSidebarItem.level-1 .items[data-v-6092ddf2],.VPSidebarItem.level-2 .items[data-v-6092ddf2],.VPSidebarItem.level-3 .items[data-v-6092ddf2],.VPSidebarItem.level-4 .items[data-v-6092ddf2],.VPSidebarItem.level-5 .items[data-v-6092ddf2]{border-left:1px solid var(--vp-c-divider);padding-left:16px}.VPSidebarItem.collapsed .items[data-v-6092ddf2]{display:none}.no-transition[data-v-7eb7a422] .caret-icon{transition:none}.group+.group[data-v-7eb7a422]{border-top:1px solid var(--vp-c-divider);padding-top:10px}@media (min-width: 960px){.group[data-v-7eb7a422]{padding-top:10px;width:calc(var(--vp-sidebar-width) - 64px)}}.VPSidebar[data-v-130e406e]{position:fixed;top:var(--vp-layout-top-height, 0px);bottom:0;left:0;z-index:var(--vp-z-index-sidebar);padding:32px 32px 96px;width:calc(100vw - 64px);max-width:320px;background-color:var(--vp-sidebar-bg-color);opacity:0;box-shadow:var(--vp-c-shadow-3);overflow-x:hidden;overflow-y:auto;transform:translate(-100%);transition:opacity .5s,transform .25s ease;overscroll-behavior:contain}.VPSidebar.open[data-v-130e406e]{opacity:1;visibility:visible;transform:translate(0);transition:opacity .25s,transform .5s cubic-bezier(.19,1,.22,1)}.dark .VPSidebar[data-v-130e406e]{box-shadow:var(--vp-shadow-1)}@media (min-width: 960px){.VPSidebar[data-v-130e406e]{padding-top:var(--vp-nav-height);width:var(--vp-sidebar-width);max-width:100%;background-color:var(--vp-sidebar-bg-color);opacity:1;visibility:visible;box-shadow:none;transform:translate(0)}}@media (min-width: 1440px){.VPSidebar[data-v-130e406e]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}@media (min-width: 960px){.curtain[data-v-130e406e]{position:sticky;top:-64px;left:0;z-index:1;margin-top:calc(var(--vp-nav-height) * -1);margin-right:-32px;margin-left:-32px;height:var(--vp-nav-height);background-color:var(--vp-sidebar-bg-color)}}.nav[data-v-130e406e]{outline:0}.VPSkipLink[data-v-5d3e946a]{top:8px;left:8px;padding:8px 16px;z-index:999;border-radius:8px;font-size:12px;font-weight:700;text-decoration:none;color:var(--vp-c-brand-1);box-shadow:var(--vp-shadow-3);background-color:var(--vp-c-bg)}.VPSkipLink[data-v-5d3e946a]:focus{height:auto;width:auto;clip:auto;clip-path:none}@media (min-width: 1280px){.VPSkipLink[data-v-5d3e946a]{top:14px;left:16px}}.Layout[data-v-fbfa64bf]{display:flex;flex-direction:column;min-height:100vh}.VPHomeSponsors[data-v-8fc72023]{border-top:1px solid var(--vp-c-gutter);padding-top:88px!important}.VPHomeSponsors[data-v-8fc72023]{margin:96px 0}@media (min-width: 768px){.VPHomeSponsors[data-v-8fc72023]{margin:128px 0}}.VPHomeSponsors[data-v-8fc72023]{padding:0 24px}@media (min-width: 768px){.VPHomeSponsors[data-v-8fc72023]{padding:0 48px}}@media (min-width: 960px){.VPHomeSponsors[data-v-8fc72023]{padding:0 64px}}.container[data-v-8fc72023]{margin:0 auto;max-width:1152px}.love[data-v-8fc72023]{margin:0 auto;width:fit-content;font-size:28px;color:var(--vp-c-text-3)}.icon[data-v-8fc72023]{display:inline-block}.message[data-v-8fc72023]{margin:0 auto;padding-top:10px;max-width:320px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.sponsors[data-v-8fc72023]{padding-top:32px}.action[data-v-8fc72023]{padding-top:40px;text-align:center}.VPTeamMembersItem[data-v-6c2f56da]{display:flex;flex-direction:column;gap:2px;border-radius:12px;width:100%;height:100%;overflow:hidden}.VPTeamMembersItem.small .profile[data-v-6c2f56da]{padding:32px}.VPTeamMembersItem.small .data[data-v-6c2f56da]{padding-top:20px}.VPTeamMembersItem.small .avatar[data-v-6c2f56da]{width:64px;height:64px}.VPTeamMembersItem.small .name[data-v-6c2f56da]{line-height:24px;font-size:16px}.VPTeamMembersItem.small .affiliation[data-v-6c2f56da]{padding-top:4px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .desc[data-v-6c2f56da]{padding-top:12px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .links[data-v-6c2f56da]{margin:0 -16px -20px;padding:10px 0 0}.VPTeamMembersItem.medium .profile[data-v-6c2f56da]{padding:48px 32px}.VPTeamMembersItem.medium .data[data-v-6c2f56da]{padding-top:24px;text-align:center}.VPTeamMembersItem.medium .avatar[data-v-6c2f56da]{width:96px;height:96px}.VPTeamMembersItem.medium .name[data-v-6c2f56da]{letter-spacing:.15px;line-height:28px;font-size:20px}.VPTeamMembersItem.medium .affiliation[data-v-6c2f56da]{padding-top:4px;font-size:16px}.VPTeamMembersItem.medium .desc[data-v-6c2f56da]{padding-top:16px;max-width:288px;font-size:16px}.VPTeamMembersItem.medium .links[data-v-6c2f56da]{margin:0 -16px -12px;padding:16px 12px 0}.profile[data-v-6c2f56da]{flex-grow:1;background-color:var(--vp-c-bg-soft)}.data[data-v-6c2f56da]{text-align:center}.avatar[data-v-6c2f56da]{position:relative;flex-shrink:0;margin:0 auto;border-radius:50%;box-shadow:var(--vp-shadow-3)}.avatar-img[data-v-6c2f56da]{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;object-fit:cover}.name[data-v-6c2f56da]{margin:0;font-weight:600}.affiliation[data-v-6c2f56da]{margin:0;font-weight:500;color:var(--vp-c-text-2)}.org.link[data-v-6c2f56da]{color:var(--vp-c-text-2);transition:color .25s}.org.link[data-v-6c2f56da]:hover{color:var(--vp-c-brand-1)}.desc[data-v-6c2f56da]{margin:0 auto}.desc[data-v-6c2f56da] a{font-weight:500;color:var(--vp-c-brand-1);text-decoration-style:dotted;transition:color .25s}.links[data-v-6c2f56da]{display:flex;justify-content:center;height:56px}.sp-link[data-v-6c2f56da]{display:flex;justify-content:center;align-items:center;text-align:center;padding:16px;font-size:14px;font-weight:500;color:var(--vp-c-sponsor);background-color:var(--vp-c-bg-soft);transition:color .25s,background-color .25s}.sp .sp-link.link[data-v-6c2f56da]:hover,.sp .sp-link.link[data-v-6c2f56da]:focus{outline:none;color:var(--vp-c-white);background-color:var(--vp-c-sponsor)}.sp-icon[data-v-6c2f56da]{margin-right:8px;font-size:16px}.VPTeamMembers.small .container[data-v-f01b895f]{grid-template-columns:repeat(auto-fit,minmax(224px,1fr))}.VPTeamMembers.small.count-1 .container[data-v-f01b895f]{max-width:276px}.VPTeamMembers.small.count-2 .container[data-v-f01b895f]{max-width:576px}.VPTeamMembers.small.count-3 .container[data-v-f01b895f]{max-width:876px}.VPTeamMembers.medium .container[data-v-f01b895f]{grid-template-columns:repeat(auto-fit,minmax(256px,1fr))}@media (min-width: 375px){.VPTeamMembers.medium .container[data-v-f01b895f]{grid-template-columns:repeat(auto-fit,minmax(288px,1fr))}}.VPTeamMembers.medium.count-1 .container[data-v-f01b895f]{max-width:368px}.VPTeamMembers.medium.count-2 .container[data-v-f01b895f]{max-width:760px}.container[data-v-f01b895f]{display:grid;gap:24px;margin:0 auto;max-width:1152px}.VPTeamPage[data-v-73e0e62b]{margin:96px 0}@media (min-width: 768px){.VPTeamPage[data-v-73e0e62b]{margin:128px 0}}.VPHome .VPTeamPageTitle[data-v-73e0e62b-s]{border-top:1px solid var(--vp-c-gutter);padding-top:88px!important}.VPTeamPageSection+.VPTeamPageSection[data-v-73e0e62b-s],.VPTeamMembers+.VPTeamPageSection[data-v-73e0e62b-s]{margin-top:64px}.VPTeamMembers+.VPTeamMembers[data-v-73e0e62b-s]{margin-top:24px}@media (min-width: 768px){.VPTeamPageTitle+.VPTeamPageSection[data-v-73e0e62b-s]{margin-top:16px}.VPTeamPageSection+.VPTeamPageSection[data-v-73e0e62b-s],.VPTeamMembers+.VPTeamPageSection[data-v-73e0e62b-s]{margin-top:96px}}.VPTeamMembers[data-v-73e0e62b-s]{padding:0 24px}@media (min-width: 768px){.VPTeamMembers[data-v-73e0e62b-s]{padding:0 48px}}@media (min-width: 960px){.VPTeamMembers[data-v-73e0e62b-s]{padding:0 64px}}.VPTeamPageSection[data-v-2c02948d]{padding:0 32px}@media (min-width: 768px){.VPTeamPageSection[data-v-2c02948d]{padding:0 48px}}@media (min-width: 960px){.VPTeamPageSection[data-v-2c02948d]{padding:0 64px}}.title[data-v-2c02948d]{position:relative;margin:0 auto;max-width:1152px;text-align:center;color:var(--vp-c-text-2)}.title-line[data-v-2c02948d]{position:absolute;top:16px;left:0;width:100%;height:1px;background-color:var(--vp-c-divider)}.title-text[data-v-2c02948d]{position:relative;display:inline-block;padding:0 24px;letter-spacing:0;line-height:32px;font-size:20px;font-weight:500;background-color:var(--vp-c-bg)}.lead[data-v-2c02948d]{margin:0 auto;max-width:480px;padding-top:12px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.members[data-v-2c02948d]{padding-top:40px}.VPTeamPageTitle[data-v-1c3aa502]{padding:48px 32px;text-align:center}@media (min-width: 768px){.VPTeamPageTitle[data-v-1c3aa502]{padding:64px 48px 48px}}@media (min-width: 960px){.VPTeamPageTitle[data-v-1c3aa502]{padding:80px 64px 48px}}.title[data-v-1c3aa502]{letter-spacing:0;line-height:44px;font-size:36px;font-weight:500}@media (min-width: 768px){.title[data-v-1c3aa502]{letter-spacing:-.5px;line-height:56px;font-size:48px}}.lead[data-v-1c3aa502]{margin:0 auto;max-width:512px;padding-top:12px;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 768px){.lead[data-v-1c3aa502]{max-width:592px;letter-spacing:.15px;line-height:28px;font-size:20px}}:root{--vp-home-hero-name-color: transparent;--vp-home-hero-name-background: -webkit-linear-gradient( 120deg, #bd34fe 30%, #41d1ff );--vp-home-hero-image-background-image: linear-gradient( -45deg, #bd34fe 50%, #47caff 50% );--vp-home-hero-image-filter: blur(44px)}@media (min-width: 640px){:root{--vp-home-hero-image-filter: blur(56px)}}@media (min-width: 960px){:root{--vp-home-hero-image-filter: blur(68px)}}@media (min-width: 960px){:root .image-src{max-width:400px;max-height:320px}}@media (min-width: 960px){.VPHero.has-image .name{padding-bottom:20px}.VPHero.has-image .text{padding-bottom:2px}}.medium-zoom-overlay,.medium-zoom-image{z-index:1000}.ad img[data-v-96d1ba1f]{display:block;width:100%;margin-top:10px;border-radius:8px;cursor:pointer}.ad img[data-v-96d1ba1f]:hover{opacity:.9}.VPLocalSearchBox[data-v-ffdd78e7]{position:fixed;z-index:100;top:0;right:0;bottom:0;left:0;display:flex}.backdrop[data-v-ffdd78e7]{position:absolute;top:0;right:0;bottom:0;left:0;background:var(--vp-backdrop-bg-color);transition:opacity .5s}.shell[data-v-ffdd78e7]{position:relative;padding:12px;margin:64px auto;display:flex;flex-direction:column;gap:16px;background:var(--vp-local-search-bg);width:min(100vw - 60px,900px);height:min-content;max-height:min(100vh - 128px,900px);border-radius:6px}@media (max-width: 767px){.shell[data-v-ffdd78e7]{margin:0;width:100vw;height:100vh;max-height:none;border-radius:0}}.search-bar[data-v-ffdd78e7]{border:1px solid var(--vp-c-divider);border-radius:4px;display:flex;align-items:center;padding:0 12px;cursor:text}@media (max-width: 767px){.search-bar[data-v-ffdd78e7]{padding:0 8px}}.search-bar[data-v-ffdd78e7]:focus-within{border-color:var(--vp-c-brand-1)}.local-search-icon[data-v-ffdd78e7]{display:block;font-size:18px}.navigate-icon[data-v-ffdd78e7]{display:block;font-size:14px}.search-icon[data-v-ffdd78e7]{margin:8px}@media (max-width: 767px){.search-icon[data-v-ffdd78e7]{display:none}}.search-input[data-v-ffdd78e7]{padding:6px 12px;font-size:inherit;width:100%}@media (max-width: 767px){.search-input[data-v-ffdd78e7]{padding:6px 4px}}.search-actions[data-v-ffdd78e7]{display:flex;gap:4px}@media (any-pointer: coarse){.search-actions[data-v-ffdd78e7]{gap:8px}}@media (min-width: 769px){.search-actions.before[data-v-ffdd78e7]{display:none}}.search-actions button[data-v-ffdd78e7]{padding:8px}.search-actions button[data-v-ffdd78e7]:not([disabled]):hover,.toggle-layout-button.detailed-list[data-v-ffdd78e7]{color:var(--vp-c-brand-1)}.search-actions button.clear-button[data-v-ffdd78e7]:disabled{opacity:.37}.search-keyboard-shortcuts[data-v-ffdd78e7]{font-size:.8rem;opacity:75%;display:flex;flex-wrap:wrap;gap:16px;line-height:14px}.search-keyboard-shortcuts span[data-v-ffdd78e7]{display:flex;align-items:center;gap:4px}@media (max-width: 767px){.search-keyboard-shortcuts[data-v-ffdd78e7]{display:none}}.search-keyboard-shortcuts kbd[data-v-ffdd78e7]{background:#8080801a;border-radius:4px;padding:3px 6px;min-width:24px;display:inline-block;text-align:center;vertical-align:middle;border:1px solid rgba(128,128,128,.15);box-shadow:0 2px 2px #0000001a}.results[data-v-ffdd78e7]{display:flex;flex-direction:column;gap:6px;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain}.result[data-v-ffdd78e7]{display:flex;align-items:center;gap:8px;border-radius:4px;transition:none;line-height:1rem;border:solid 2px var(--vp-local-search-result-border);outline:none}.result>div[data-v-ffdd78e7]{margin:12px;width:100%;overflow:hidden}@media (max-width: 767px){.result>div[data-v-ffdd78e7]{margin:8px}}.titles[data-v-ffdd78e7]{display:flex;flex-wrap:wrap;gap:4px;position:relative;z-index:1001;padding:2px 0}.title[data-v-ffdd78e7]{display:flex;align-items:center;gap:4px}.title.main[data-v-ffdd78e7]{font-weight:500}.title-icon[data-v-ffdd78e7]{opacity:.5;font-weight:500;color:var(--vp-c-brand-1)}.title svg[data-v-ffdd78e7]{opacity:.5}.result.selected[data-v-ffdd78e7]{--vp-local-search-result-bg: var(--vp-local-search-result-selected-bg);border-color:var(--vp-local-search-result-selected-border)}.excerpt-wrapper[data-v-ffdd78e7]{position:relative}.excerpt[data-v-ffdd78e7]{opacity:50%;pointer-events:none;max-height:140px;overflow:hidden;position:relative;margin-top:4px}.result.selected .excerpt[data-v-ffdd78e7]{opacity:1}.excerpt[data-v-ffdd78e7] *{font-size:.8rem!important;line-height:130%!important}.titles[data-v-ffdd78e7] mark,.excerpt[data-v-ffdd78e7] mark{background-color:var(--vp-local-search-highlight-bg);color:var(--vp-local-search-highlight-text);border-radius:2px;padding:0 2px}.excerpt[data-v-ffdd78e7] .vp-code-group .tabs{display:none}.excerpt[data-v-ffdd78e7] .vp-code-group div[class*=language-]{border-radius:8px!important}.excerpt-gradient-bottom[data-v-ffdd78e7]{position:absolute;bottom:-1px;left:0;width:100%;height:8px;background:linear-gradient(transparent,var(--vp-local-search-result-bg));z-index:1000}.excerpt-gradient-top[data-v-ffdd78e7]{position:absolute;top:-1px;left:0;width:100%;height:8px;background:linear-gradient(var(--vp-local-search-result-bg),transparent);z-index:1000}.result.selected .titles[data-v-ffdd78e7],.result.selected .title-icon[data-v-ffdd78e7]{color:var(--vp-c-brand-1)!important}.no-results[data-v-ffdd78e7]{font-size:.9rem;text-align:center;padding:12px}svg[data-v-ffdd78e7]{flex:none}
diff --git a/.vitepress/dist/hashmap.json b/.vitepress/dist/hashmap.json
new file mode 100644
index 0000000..2dc5a70
--- /dev/null
+++ b/.vitepress/dist/hashmap.json
@@ -0,0 +1 @@
+{"index.md":"Dsd7aigo","readme.md":"Rd2D_BZq","src_about_index.md":"-unb0L2u","src_guide_ai.md":"aIl2n3N7","src_guide_cache.md":"DYexoE7d","src_guide_controller.md":"ChJ_NED0","src_guide_db.md":"CH-r16iF","src_guide_deploy.md":"CVc1dXEU","src_guide_dev.md":"DM1UjwvK","src_guide_dir.md":"Bywk12Mo","src_guide_exception.md":"1HCd76m1","src_guide_flow.md":"DMDsOCkF","src_guide_i18n.md":"CMvzuL3k","src_guide_initdata.md":"BhdPvNop","src_guide_lock.md":"C8JTDlsP","src_guide_norepeatsubmit.md":"CvFjLc1r","src_guide_plugin.md":"DSQp6REO","src_guide_quick.md":"g_DIbvkh","src_guide_recordlog.md":"B0w4IZH7","src_guide_security.md":"BFmZQZP9","src_guide_service.md":"CokY9neI","src_guide_swagger.md":"CCfA6TBH","src_guide_tenant.md":"CP_z92JB","src_guide_uniqueidgen.md":"BNiKKfQz","src_guide_upload.md":"D-dQqFKU","src_introduce_index.md":"BaUz4Xtw","src_introduce_show.md":"Ck0DuCIX","src_introduce_src.md":"UlNmfnNt","src_question_common.md":"Caojqqth","src_todo_plan.md":"pGnBM6_r","src_todo_update.md":"DUbMUQW8"}
diff --git a/.vitepress/dist/index.html b/.vitepress/dist/index.html
new file mode 100644
index 0000000..c8d6243
--- /dev/null
+++ b/.vitepress/dist/index.html
@@ -0,0 +1,25 @@
+
+
+
+
+
+ Cool Admin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Skip to content Cool Admin(Java版) 一个很酷的后台管理系统开发框架 开源免费、Ai编码、流程编排、扩展插件、模块化
Ai编码+流程编排 框架结合Ai大模型微调训练,让Ai更懂框架,只需少量文字描述即可零代码实现部分功能。流程编排Ai开发必备神器,只需拖动配置,即可实现Ai开发的核心功能。
快速开发 通过Ai自动化编码,简单功能实现零代码开发,复杂的功能也只需少量代码配置即可。大大提高软件研发速度,快速迭代,快速试错降低成本,提高市场竞争力。
扩展插件 支持插件扩展,通过插件扩展功能,实现功能快速迭代。如支付、文件上传、短信等功能可以通过安装插件的方式动态继承,不需要或者需要更换,卸载重装即可,配置不用写在代码里,代码简洁清晰。
+
+
+
+
\ No newline at end of file
diff --git a/.vitepress/dist/src/about/index.html b/.vitepress/dist/src/about/index.html
new file mode 100644
index 0000000..e76963c
--- /dev/null
+++ b/.vitepress/dist/src/about/index.html
@@ -0,0 +1,25 @@
+
+
+
+
+
+ 交流合作 | Cool Admin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.vitepress/dist/src/guide/ai.html b/.vitepress/dist/src/guide/ai.html
new file mode 100644
index 0000000..41351b8
--- /dev/null
+++ b/.vitepress/dist/src/guide/ai.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+ Ai 编码 | Cool Admin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.vitepress/dist/src/guide/cache.html b/.vitepress/dist/src/guide/cache.html
new file mode 100644
index 0000000..13aa1e5
--- /dev/null
+++ b/.vitepress/dist/src/guide/cache.html
@@ -0,0 +1,73 @@
+
+
+
+
+
+ 缓存 | Cool Admin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.vitepress/dist/src/guide/controller.html b/.vitepress/dist/src/guide/controller.html
new file mode 100644
index 0000000..4f64656
--- /dev/null
+++ b/.vitepress/dist/src/guide/controller.html
@@ -0,0 +1,144 @@
+
+
+
+
+
+ 控制器 | Cool Admin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.vitepress/dist/src/guide/db.html b/.vitepress/dist/src/guide/db.html
new file mode 100644
index 0000000..c6f28b0
--- /dev/null
+++ b/.vitepress/dist/src/guide/db.html
@@ -0,0 +1,25 @@
+
+
+
+
+
+ 数据库 | Cool Admin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.vitepress/dist/src/guide/deploy.html b/.vitepress/dist/src/guide/deploy.html
new file mode 100644
index 0000000..5e65a4a
--- /dev/null
+++ b/.vitepress/dist/src/guide/deploy.html
@@ -0,0 +1,117 @@
+
+
+
+
+
+ 项目部署 | Cool Admin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.vitepress/dist/src/guide/dev.html b/.vitepress/dist/src/guide/dev.html
new file mode 100644
index 0000000..ff4c67b
--- /dev/null
+++ b/.vitepress/dist/src/guide/dev.html
@@ -0,0 +1,41 @@
+
+
+
+
+
+ 开发方式 | Cool Admin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.vitepress/dist/src/guide/dir.html b/.vitepress/dist/src/guide/dir.html
new file mode 100644
index 0000000..59d1020
--- /dev/null
+++ b/.vitepress/dist/src/guide/dir.html
@@ -0,0 +1,49 @@
+
+
+
+
+
+ 目录结构 | Cool Admin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.vitepress/dist/src/guide/exception.html b/.vitepress/dist/src/guide/exception.html
new file mode 100644
index 0000000..aac6a21
--- /dev/null
+++ b/.vitepress/dist/src/guide/exception.html
@@ -0,0 +1,83 @@
+
+
+
+
+
+ 统一异常处理 | Cool Admin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.vitepress/dist/src/guide/flow.html b/.vitepress/dist/src/guide/flow.html
new file mode 100644
index 0000000..4fce21a
--- /dev/null
+++ b/.vitepress/dist/src/guide/flow.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+ Ai 流程编排 | Cool Admin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.vitepress/dist/src/guide/i18n.html b/.vitepress/dist/src/guide/i18n.html
new file mode 100644
index 0000000..730ec65
--- /dev/null
+++ b/.vitepress/dist/src/guide/i18n.html
@@ -0,0 +1,28 @@
+
+
+
+
+
+ 国际化多语言(v8.0新增) | Cool Admin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.vitepress/dist/src/guide/initData.html b/.vitepress/dist/src/guide/initData.html
new file mode 100644
index 0000000..bba01b3
--- /dev/null
+++ b/.vitepress/dist/src/guide/initData.html
@@ -0,0 +1,57 @@
+
+
+
+
+
+ 数据初始化 | Cool Admin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.vitepress/dist/src/guide/lock.html b/.vitepress/dist/src/guide/lock.html
new file mode 100644
index 0000000..e2e64c8
--- /dev/null
+++ b/.vitepress/dist/src/guide/lock.html
@@ -0,0 +1,35 @@
+
+
+
+
+
+ 锁 | Cool Admin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.vitepress/dist/src/guide/noRepeatSubmit.html b/.vitepress/dist/src/guide/noRepeatSubmit.html
new file mode 100644
index 0000000..b40cc90
--- /dev/null
+++ b/.vitepress/dist/src/guide/noRepeatSubmit.html
@@ -0,0 +1,52 @@
+
+
+
+
+
+ 防重复提交 | Cool Admin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.vitepress/dist/src/guide/plugin.html b/.vitepress/dist/src/guide/plugin.html
new file mode 100644
index 0000000..db776df
--- /dev/null
+++ b/.vitepress/dist/src/guide/plugin.html
@@ -0,0 +1,261 @@
+
+
+
+
+
+ 扩展插件 | Cool Admin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.vitepress/dist/src/guide/quick.html b/.vitepress/dist/src/guide/quick.html
new file mode 100644
index 0000000..e5b944a
--- /dev/null
+++ b/.vitepress/dist/src/guide/quick.html
@@ -0,0 +1,38 @@
+
+
+
+
+
+ 快速开始 | Cool Admin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.vitepress/dist/src/guide/recordLog.html b/.vitepress/dist/src/guide/recordLog.html
new file mode 100644
index 0000000..96b2538
--- /dev/null
+++ b/.vitepress/dist/src/guide/recordLog.html
@@ -0,0 +1,46 @@
+
+
+
+
+
+ 请求日志记录 | Cool Admin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.vitepress/dist/src/guide/security.html b/.vitepress/dist/src/guide/security.html
new file mode 100644
index 0000000..e992485
--- /dev/null
+++ b/.vitepress/dist/src/guide/security.html
@@ -0,0 +1,259 @@
+
+
+
+
+
+ 权限校验 | Cool Admin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.vitepress/dist/src/guide/service.html b/.vitepress/dist/src/guide/service.html
new file mode 100644
index 0000000..7f64aef
--- /dev/null
+++ b/.vitepress/dist/src/guide/service.html
@@ -0,0 +1,44 @@
+
+
+
+
+
+ 服务 | Cool Admin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.vitepress/dist/src/guide/swagger.html b/.vitepress/dist/src/guide/swagger.html
new file mode 100644
index 0000000..7001d0c
--- /dev/null
+++ b/.vitepress/dist/src/guide/swagger.html
@@ -0,0 +1,32 @@
+
+
+
+
+
+ swagger 文档 | Cool Admin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.vitepress/dist/src/guide/tenant.html b/.vitepress/dist/src/guide/tenant.html
new file mode 100644
index 0000000..176dddb
--- /dev/null
+++ b/.vitepress/dist/src/guide/tenant.html
@@ -0,0 +1,29 @@
+
+
+
+
+
+ 多租户(v8.0新增) | Cool Admin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.vitepress/dist/src/guide/uniqueIDGen.html b/.vitepress/dist/src/guide/uniqueIDGen.html
new file mode 100644
index 0000000..da7720c
--- /dev/null
+++ b/.vitepress/dist/src/guide/uniqueIDGen.html
@@ -0,0 +1,54 @@
+
+
+
+
+
+ 唯一id | Cool Admin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.vitepress/dist/src/guide/upload.html b/.vitepress/dist/src/guide/upload.html
new file mode 100644
index 0000000..ffd3188
--- /dev/null
+++ b/.vitepress/dist/src/guide/upload.html
@@ -0,0 +1,61 @@
+
+
+
+
+
+ 文件上传 | Cool Admin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.vitepress/dist/src/introduce/index.html b/.vitepress/dist/src/introduce/index.html
new file mode 100644
index 0000000..96c415b
--- /dev/null
+++ b/.vitepress/dist/src/introduce/index.html
@@ -0,0 +1,27 @@
+
+
+
+
+
+ 简介 | Cool Admin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.vitepress/dist/src/introduce/show.html b/.vitepress/dist/src/introduce/show.html
new file mode 100644
index 0000000..24c132e
--- /dev/null
+++ b/.vitepress/dist/src/introduce/show.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+ 演示 | Cool Admin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.vitepress/dist/src/introduce/src.html b/.vitepress/dist/src/introduce/src.html
new file mode 100644
index 0000000..7cc4e43
--- /dev/null
+++ b/.vitepress/dist/src/introduce/src.html
@@ -0,0 +1,25 @@
+
+
+
+
+
+ 源码 | Cool Admin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.vitepress/dist/src/question/common.html b/.vitepress/dist/src/question/common.html
new file mode 100644
index 0000000..1f86736
--- /dev/null
+++ b/.vitepress/dist/src/question/common.html
@@ -0,0 +1,25 @@
+
+
+
+
+
+ 常见问题 | Cool Admin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.vitepress/dist/src/todo/plan.html b/.vitepress/dist/src/todo/plan.html
new file mode 100644
index 0000000..1e61c5f
--- /dev/null
+++ b/.vitepress/dist/src/todo/plan.html
@@ -0,0 +1,25 @@
+
+
+
+
+
+ 计划 | Cool Admin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.vitepress/dist/src/todo/update.html b/.vitepress/dist/src/todo/update.html
new file mode 100644
index 0000000..64e51d9
--- /dev/null
+++ b/.vitepress/dist/src/todo/update.html
@@ -0,0 +1,25 @@
+
+
+
+
+
+ 更新 | Cool Admin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.vitepress/dist/vp-icons.css b/.vitepress/dist/vp-icons.css
new file mode 100644
index 0000000..ddc5bd8
--- /dev/null
+++ b/.vitepress/dist/vp-icons.css
@@ -0,0 +1 @@
+.vpi-social-github{--icon:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' width='24' height='24'%3E%3Cpath fill='black' d='M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E")}
\ No newline at end of file
diff --git a/docs/.vitepress/cache/deps_temp_8f7ae8d7/chunk-AU3CLKKL.js b/docs/.vitepress/cache/deps_temp_8f7ae8d7/chunk-AU3CLKKL.js
deleted file mode 100644
index 9263a20..0000000
--- a/docs/.vitepress/cache/deps_temp_8f7ae8d7/chunk-AU3CLKKL.js
+++ /dev/null
@@ -1,11440 +0,0 @@
-// node_modules/@vue/shared/dist/shared.esm-bundler.js
-function makeMap(str, expectsLowerCase) {
- const set2 = new Set(str.split(","));
- return expectsLowerCase ? (val) => set2.has(val.toLowerCase()) : (val) => set2.has(val);
-}
-var EMPTY_OBJ = true ? Object.freeze({}) : {};
-var EMPTY_ARR = true ? Object.freeze([]) : [];
-var NOOP = () => {
-};
-var NO = () => false;
-var isOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && // uppercase letter
-(key.charCodeAt(2) > 122 || key.charCodeAt(2) < 97);
-var isModelListener = (key) => key.startsWith("onUpdate:");
-var extend = Object.assign;
-var remove = (arr, el) => {
- const i = arr.indexOf(el);
- if (i > -1) {
- arr.splice(i, 1);
- }
-};
-var hasOwnProperty = Object.prototype.hasOwnProperty;
-var hasOwn = (val, key) => hasOwnProperty.call(val, key);
-var isArray = Array.isArray;
-var isMap = (val) => toTypeString(val) === "[object Map]";
-var isSet = (val) => toTypeString(val) === "[object Set]";
-var isDate = (val) => toTypeString(val) === "[object Date]";
-var isRegExp = (val) => toTypeString(val) === "[object RegExp]";
-var isFunction = (val) => typeof val === "function";
-var isString = (val) => typeof val === "string";
-var isSymbol = (val) => typeof val === "symbol";
-var isObject = (val) => val !== null && typeof val === "object";
-var isPromise = (val) => {
- return (isObject(val) || isFunction(val)) && isFunction(val.then) && isFunction(val.catch);
-};
-var objectToString = Object.prototype.toString;
-var toTypeString = (value) => objectToString.call(value);
-var toRawType = (value) => {
- return toTypeString(value).slice(8, -1);
-};
-var isPlainObject = (val) => toTypeString(val) === "[object Object]";
-var isIntegerKey = (key) => isString(key) && key !== "NaN" && key[0] !== "-" && "" + parseInt(key, 10) === key;
-var isReservedProp = makeMap(
- // the leading comma is intentional so empty string "" is also included
- ",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"
-);
-var isBuiltInDirective = makeMap(
- "bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo"
-);
-var cacheStringFunction = (fn) => {
- const cache = /* @__PURE__ */ Object.create(null);
- return (str) => {
- const hit = cache[str];
- return hit || (cache[str] = fn(str));
- };
-};
-var camelizeRE = /-(\w)/g;
-var camelize = cacheStringFunction((str) => {
- return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : "");
-});
-var hyphenateRE = /\B([A-Z])/g;
-var hyphenate = cacheStringFunction(
- (str) => str.replace(hyphenateRE, "-$1").toLowerCase()
-);
-var capitalize = cacheStringFunction((str) => {
- return str.charAt(0).toUpperCase() + str.slice(1);
-});
-var toHandlerKey = cacheStringFunction((str) => {
- const s = str ? `on${capitalize(str)}` : ``;
- return s;
-});
-var hasChanged = (value, oldValue) => !Object.is(value, oldValue);
-var invokeArrayFns = (fns, ...arg) => {
- for (let i = 0; i < fns.length; i++) {
- fns[i](...arg);
- }
-};
-var def = (obj, key, value, writable = false) => {
- Object.defineProperty(obj, key, {
- configurable: true,
- enumerable: false,
- writable,
- value
- });
-};
-var looseToNumber = (val) => {
- const n = parseFloat(val);
- return isNaN(n) ? val : n;
-};
-var toNumber = (val) => {
- const n = isString(val) ? Number(val) : NaN;
- return isNaN(n) ? val : n;
-};
-var _globalThis;
-var getGlobalThis = () => {
- return _globalThis || (_globalThis = typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : {});
-};
-var GLOBALS_ALLOWED = "Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error";
-var isGloballyAllowed = makeMap(GLOBALS_ALLOWED);
-function normalizeStyle(value) {
- if (isArray(value)) {
- const res = {};
- for (let i = 0; i < value.length; i++) {
- const item = value[i];
- const normalized = isString(item) ? parseStringStyle(item) : normalizeStyle(item);
- if (normalized) {
- for (const key in normalized) {
- res[key] = normalized[key];
- }
- }
- }
- return res;
- } else if (isString(value) || isObject(value)) {
- return value;
- }
-}
-var listDelimiterRE = /;(?![^(]*\))/g;
-var propertyDelimiterRE = /:([^]+)/;
-var styleCommentRE = /\/\*[^]*?\*\//g;
-function parseStringStyle(cssText) {
- const ret = {};
- cssText.replace(styleCommentRE, "").split(listDelimiterRE).forEach((item) => {
- if (item) {
- const tmp = item.split(propertyDelimiterRE);
- tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());
- }
- });
- return ret;
-}
-function stringifyStyle(styles) {
- let ret = "";
- if (!styles || isString(styles)) {
- return ret;
- }
- for (const key in styles) {
- const value = styles[key];
- if (isString(value) || typeof value === "number") {
- const normalizedKey = key.startsWith(`--`) ? key : hyphenate(key);
- ret += `${normalizedKey}:${value};`;
- }
- }
- return ret;
-}
-function normalizeClass(value) {
- let res = "";
- if (isString(value)) {
- res = value;
- } else if (isArray(value)) {
- for (let i = 0; i < value.length; i++) {
- const normalized = normalizeClass(value[i]);
- if (normalized) {
- res += normalized + " ";
- }
- }
- } else if (isObject(value)) {
- for (const name in value) {
- if (value[name]) {
- res += name + " ";
- }
- }
- }
- return res.trim();
-}
-function normalizeProps(props) {
- if (!props) return null;
- let { class: klass, style } = props;
- if (klass && !isString(klass)) {
- props.class = normalizeClass(klass);
- }
- if (style) {
- props.style = normalizeStyle(style);
- }
- return props;
-}
-var HTML_TAGS = "html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot";
-var SVG_TAGS = "svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view";
-var MATH_TAGS = "annotation,annotation-xml,maction,maligngroup,malignmark,math,menclose,merror,mfenced,mfrac,mfraction,mglyph,mi,mlabeledtr,mlongdiv,mmultiscripts,mn,mo,mover,mpadded,mphantom,mprescripts,mroot,mrow,ms,mscarries,mscarry,msgroup,msline,mspace,msqrt,msrow,mstack,mstyle,msub,msubsup,msup,mtable,mtd,mtext,mtr,munder,munderover,none,semantics";
-var VOID_TAGS = "area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr";
-var isHTMLTag = makeMap(HTML_TAGS);
-var isSVGTag = makeMap(SVG_TAGS);
-var isMathMLTag = makeMap(MATH_TAGS);
-var isVoidTag = makeMap(VOID_TAGS);
-var specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`;
-var isSpecialBooleanAttr = makeMap(specialBooleanAttrs);
-var isBooleanAttr = makeMap(
- specialBooleanAttrs + `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,inert,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected`
-);
-function includeBooleanAttr(value) {
- return !!value || value === "";
-}
-var isKnownHtmlAttr = makeMap(
- `accept,accept-charset,accesskey,action,align,allow,alt,async,autocapitalize,autocomplete,autofocus,autoplay,background,bgcolor,border,buffered,capture,challenge,charset,checked,cite,class,code,codebase,color,cols,colspan,content,contenteditable,contextmenu,controls,coords,crossorigin,csp,data,datetime,decoding,default,defer,dir,dirname,disabled,download,draggable,dropzone,enctype,enterkeyhint,for,form,formaction,formenctype,formmethod,formnovalidate,formtarget,headers,height,hidden,high,href,hreflang,http-equiv,icon,id,importance,inert,integrity,ismap,itemprop,keytype,kind,label,lang,language,loading,list,loop,low,manifest,max,maxlength,minlength,media,min,multiple,muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,preload,radiogroup,readonly,referrerpolicy,rel,required,reversed,rows,rowspan,sandbox,scope,scoped,selected,shape,size,sizes,slot,span,spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,target,title,translate,type,usemap,value,width,wrap`
-);
-var isKnownSvgAttr = makeMap(
- `xmlns,accent-height,accumulate,additive,alignment-baseline,alphabetic,amplitude,arabic-form,ascent,attributeName,attributeType,azimuth,baseFrequency,baseline-shift,baseProfile,bbox,begin,bias,by,calcMode,cap-height,class,clip,clipPathUnits,clip-path,clip-rule,color,color-interpolation,color-interpolation-filters,color-profile,color-rendering,contentScriptType,contentStyleType,crossorigin,cursor,cx,cy,d,decelerate,descent,diffuseConstant,direction,display,divisor,dominant-baseline,dur,dx,dy,edgeMode,elevation,enable-background,end,exponent,fill,fill-opacity,fill-rule,filter,filterRes,filterUnits,flood-color,flood-opacity,font-family,font-size,font-size-adjust,font-stretch,font-style,font-variant,font-weight,format,from,fr,fx,fy,g1,g2,glyph-name,glyph-orientation-horizontal,glyph-orientation-vertical,glyphRef,gradientTransform,gradientUnits,hanging,height,href,hreflang,horiz-adv-x,horiz-origin-x,id,ideographic,image-rendering,in,in2,intercept,k,k1,k2,k3,k4,kernelMatrix,kernelUnitLength,kerning,keyPoints,keySplines,keyTimes,lang,lengthAdjust,letter-spacing,lighting-color,limitingConeAngle,local,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mask,maskContentUnits,maskUnits,mathematical,max,media,method,min,mode,name,numOctaves,offset,opacity,operator,order,orient,orientation,origin,overflow,overline-position,overline-thickness,panose-1,paint-order,path,pathLength,patternContentUnits,patternTransform,patternUnits,ping,pointer-events,points,pointsAtX,pointsAtY,pointsAtZ,preserveAlpha,preserveAspectRatio,primitiveUnits,r,radius,referrerPolicy,refX,refY,rel,rendering-intent,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,result,rotate,rx,ry,scale,seed,shape-rendering,slope,spacing,specularConstant,specularExponent,speed,spreadMethod,startOffset,stdDeviation,stemh,stemv,stitchTiles,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,string,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,style,surfaceScale,systemLanguage,tabindex,tableValues,target,targetX,targetY,text-anchor,text-decoration,text-rendering,textLength,to,transform,transform-origin,type,u1,u2,underline-position,underline-thickness,unicode,unicode-bidi,unicode-range,units-per-em,v-alphabetic,v-hanging,v-ideographic,v-mathematical,values,vector-effect,version,vert-adv-y,vert-origin-x,vert-origin-y,viewBox,viewTarget,visibility,width,widths,word-spacing,writing-mode,x,x-height,x1,x2,xChannelSelector,xlink:actuate,xlink:arcrole,xlink:href,xlink:role,xlink:show,xlink:title,xlink:type,xmlns:xlink,xml:base,xml:lang,xml:space,y,y1,y2,yChannelSelector,z,zoomAndPan`
-);
-function isRenderableAttrValue(value) {
- if (value == null) {
- return false;
- }
- const type = typeof value;
- return type === "string" || type === "number" || type === "boolean";
-}
-function looseCompareArrays(a, b) {
- if (a.length !== b.length) return false;
- let equal = true;
- for (let i = 0; equal && i < a.length; i++) {
- equal = looseEqual(a[i], b[i]);
- }
- return equal;
-}
-function looseEqual(a, b) {
- if (a === b) return true;
- let aValidType = isDate(a);
- let bValidType = isDate(b);
- if (aValidType || bValidType) {
- return aValidType && bValidType ? a.getTime() === b.getTime() : false;
- }
- aValidType = isSymbol(a);
- bValidType = isSymbol(b);
- if (aValidType || bValidType) {
- return a === b;
- }
- aValidType = isArray(a);
- bValidType = isArray(b);
- if (aValidType || bValidType) {
- return aValidType && bValidType ? looseCompareArrays(a, b) : false;
- }
- aValidType = isObject(a);
- bValidType = isObject(b);
- if (aValidType || bValidType) {
- if (!aValidType || !bValidType) {
- return false;
- }
- const aKeysCount = Object.keys(a).length;
- const bKeysCount = Object.keys(b).length;
- if (aKeysCount !== bKeysCount) {
- return false;
- }
- for (const key in a) {
- const aHasKey = a.hasOwnProperty(key);
- const bHasKey = b.hasOwnProperty(key);
- if (aHasKey && !bHasKey || !aHasKey && bHasKey || !looseEqual(a[key], b[key])) {
- return false;
- }
- }
- }
- return String(a) === String(b);
-}
-function looseIndexOf(arr, val) {
- return arr.findIndex((item) => looseEqual(item, val));
-}
-var isRef = (val) => {
- return !!(val && val.__v_isRef === true);
-};
-var toDisplayString = (val) => {
- return isString(val) ? val : val == null ? "" : isArray(val) || isObject(val) && (val.toString === objectToString || !isFunction(val.toString)) ? isRef(val) ? toDisplayString(val.value) : JSON.stringify(val, replacer, 2) : String(val);
-};
-var replacer = (_key, val) => {
- if (isRef(val)) {
- return replacer(_key, val.value);
- } else if (isMap(val)) {
- return {
- [`Map(${val.size})`]: [...val.entries()].reduce(
- (entries, [key, val2], i) => {
- entries[stringifySymbol(key, i) + " =>"] = val2;
- return entries;
- },
- {}
- )
- };
- } else if (isSet(val)) {
- return {
- [`Set(${val.size})`]: [...val.values()].map((v) => stringifySymbol(v))
- };
- } else if (isSymbol(val)) {
- return stringifySymbol(val);
- } else if (isObject(val) && !isArray(val) && !isPlainObject(val)) {
- return String(val);
- }
- return val;
-};
-var stringifySymbol = (v, i = "") => {
- var _a;
- return (
- // Symbol.description in es2019+ so we need to cast here to pass
- // the lib: es2016 check
- isSymbol(v) ? `Symbol(${(_a = v.description) != null ? _a : i})` : v
- );
-};
-
-// node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js
-function warn(msg, ...args) {
- console.warn(`[Vue warn] ${msg}`, ...args);
-}
-var activeEffectScope;
-var EffectScope = class {
- constructor(detached = false) {
- this.detached = detached;
- this._active = true;
- this.effects = [];
- this.cleanups = [];
- this.parent = activeEffectScope;
- if (!detached && activeEffectScope) {
- this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push(
- this
- ) - 1;
- }
- }
- get active() {
- return this._active;
- }
- run(fn) {
- if (this._active) {
- const currentEffectScope = activeEffectScope;
- try {
- activeEffectScope = this;
- return fn();
- } finally {
- activeEffectScope = currentEffectScope;
- }
- } else if (true) {
- warn(`cannot run an inactive effect scope.`);
- }
- }
- /**
- * This should only be called on non-detached scopes
- * @internal
- */
- on() {
- activeEffectScope = this;
- }
- /**
- * This should only be called on non-detached scopes
- * @internal
- */
- off() {
- activeEffectScope = this.parent;
- }
- stop(fromParent) {
- if (this._active) {
- let i, l;
- for (i = 0, l = this.effects.length; i < l; i++) {
- this.effects[i].stop();
- }
- for (i = 0, l = this.cleanups.length; i < l; i++) {
- this.cleanups[i]();
- }
- if (this.scopes) {
- for (i = 0, l = this.scopes.length; i < l; i++) {
- this.scopes[i].stop(true);
- }
- }
- if (!this.detached && this.parent && !fromParent) {
- const last = this.parent.scopes.pop();
- if (last && last !== this) {
- this.parent.scopes[this.index] = last;
- last.index = this.index;
- }
- }
- this.parent = void 0;
- this._active = false;
- }
- }
-};
-function effectScope(detached) {
- return new EffectScope(detached);
-}
-function recordEffectScope(effect2, scope = activeEffectScope) {
- if (scope && scope.active) {
- scope.effects.push(effect2);
- }
-}
-function getCurrentScope() {
- return activeEffectScope;
-}
-function onScopeDispose(fn) {
- if (activeEffectScope) {
- activeEffectScope.cleanups.push(fn);
- } else if (true) {
- warn(
- `onScopeDispose() is called when there is no active effect scope to be associated with.`
- );
- }
-}
-var activeEffect;
-var ReactiveEffect = class {
- constructor(fn, trigger2, scheduler, scope) {
- this.fn = fn;
- this.trigger = trigger2;
- this.scheduler = scheduler;
- this.active = true;
- this.deps = [];
- this._dirtyLevel = 4;
- this._trackId = 0;
- this._runnings = 0;
- this._shouldSchedule = false;
- this._depsLength = 0;
- recordEffectScope(this, scope);
- }
- get dirty() {
- if (this._dirtyLevel === 2 || this._dirtyLevel === 3) {
- this._dirtyLevel = 1;
- pauseTracking();
- for (let i = 0; i < this._depsLength; i++) {
- const dep = this.deps[i];
- if (dep.computed) {
- triggerComputed(dep.computed);
- if (this._dirtyLevel >= 4) {
- break;
- }
- }
- }
- if (this._dirtyLevel === 1) {
- this._dirtyLevel = 0;
- }
- resetTracking();
- }
- return this._dirtyLevel >= 4;
- }
- set dirty(v) {
- this._dirtyLevel = v ? 4 : 0;
- }
- run() {
- this._dirtyLevel = 0;
- if (!this.active) {
- return this.fn();
- }
- let lastShouldTrack = shouldTrack;
- let lastEffect = activeEffect;
- try {
- shouldTrack = true;
- activeEffect = this;
- this._runnings++;
- preCleanupEffect(this);
- return this.fn();
- } finally {
- postCleanupEffect(this);
- this._runnings--;
- activeEffect = lastEffect;
- shouldTrack = lastShouldTrack;
- }
- }
- stop() {
- if (this.active) {
- preCleanupEffect(this);
- postCleanupEffect(this);
- this.onStop && this.onStop();
- this.active = false;
- }
- }
-};
-function triggerComputed(computed3) {
- return computed3.value;
-}
-function preCleanupEffect(effect2) {
- effect2._trackId++;
- effect2._depsLength = 0;
-}
-function postCleanupEffect(effect2) {
- if (effect2.deps.length > effect2._depsLength) {
- for (let i = effect2._depsLength; i < effect2.deps.length; i++) {
- cleanupDepEffect(effect2.deps[i], effect2);
- }
- effect2.deps.length = effect2._depsLength;
- }
-}
-function cleanupDepEffect(dep, effect2) {
- const trackId = dep.get(effect2);
- if (trackId !== void 0 && effect2._trackId !== trackId) {
- dep.delete(effect2);
- if (dep.size === 0) {
- dep.cleanup();
- }
- }
-}
-function effect(fn, options) {
- if (fn.effect instanceof ReactiveEffect) {
- fn = fn.effect.fn;
- }
- const _effect = new ReactiveEffect(fn, NOOP, () => {
- if (_effect.dirty) {
- _effect.run();
- }
- });
- if (options) {
- extend(_effect, options);
- if (options.scope) recordEffectScope(_effect, options.scope);
- }
- if (!options || !options.lazy) {
- _effect.run();
- }
- const runner = _effect.run.bind(_effect);
- runner.effect = _effect;
- return runner;
-}
-function stop(runner) {
- runner.effect.stop();
-}
-var shouldTrack = true;
-var pauseScheduleStack = 0;
-var trackStack = [];
-function pauseTracking() {
- trackStack.push(shouldTrack);
- shouldTrack = false;
-}
-function resetTracking() {
- const last = trackStack.pop();
- shouldTrack = last === void 0 ? true : last;
-}
-function pauseScheduling() {
- pauseScheduleStack++;
-}
-function resetScheduling() {
- pauseScheduleStack--;
- while (!pauseScheduleStack && queueEffectSchedulers.length) {
- queueEffectSchedulers.shift()();
- }
-}
-function trackEffect(effect2, dep, debuggerEventExtraInfo) {
- var _a;
- if (dep.get(effect2) !== effect2._trackId) {
- dep.set(effect2, effect2._trackId);
- const oldDep = effect2.deps[effect2._depsLength];
- if (oldDep !== dep) {
- if (oldDep) {
- cleanupDepEffect(oldDep, effect2);
- }
- effect2.deps[effect2._depsLength++] = dep;
- } else {
- effect2._depsLength++;
- }
- if (true) {
- (_a = effect2.onTrack) == null ? void 0 : _a.call(effect2, extend({ effect: effect2 }, debuggerEventExtraInfo));
- }
- }
-}
-var queueEffectSchedulers = [];
-function triggerEffects(dep, dirtyLevel, debuggerEventExtraInfo) {
- var _a;
- pauseScheduling();
- for (const effect2 of dep.keys()) {
- let tracking;
- if (effect2._dirtyLevel < dirtyLevel && (tracking != null ? tracking : tracking = dep.get(effect2) === effect2._trackId)) {
- effect2._shouldSchedule || (effect2._shouldSchedule = effect2._dirtyLevel === 0);
- effect2._dirtyLevel = dirtyLevel;
- }
- if (effect2._shouldSchedule && (tracking != null ? tracking : tracking = dep.get(effect2) === effect2._trackId)) {
- if (true) {
- (_a = effect2.onTrigger) == null ? void 0 : _a.call(effect2, extend({ effect: effect2 }, debuggerEventExtraInfo));
- }
- effect2.trigger();
- if ((!effect2._runnings || effect2.allowRecurse) && effect2._dirtyLevel !== 2) {
- effect2._shouldSchedule = false;
- if (effect2.scheduler) {
- queueEffectSchedulers.push(effect2.scheduler);
- }
- }
- }
- }
- resetScheduling();
-}
-var createDep = (cleanup, computed3) => {
- const dep = /* @__PURE__ */ new Map();
- dep.cleanup = cleanup;
- dep.computed = computed3;
- return dep;
-};
-var targetMap = /* @__PURE__ */ new WeakMap();
-var ITERATE_KEY = Symbol(true ? "iterate" : "");
-var MAP_KEY_ITERATE_KEY = Symbol(true ? "Map key iterate" : "");
-function track(target, type, key) {
- if (shouldTrack && activeEffect) {
- let depsMap = targetMap.get(target);
- if (!depsMap) {
- targetMap.set(target, depsMap = /* @__PURE__ */ new Map());
- }
- let dep = depsMap.get(key);
- if (!dep) {
- depsMap.set(key, dep = createDep(() => depsMap.delete(key)));
- }
- trackEffect(
- activeEffect,
- dep,
- true ? {
- target,
- type,
- key
- } : void 0
- );
- }
-}
-function trigger(target, type, key, newValue, oldValue, oldTarget) {
- const depsMap = targetMap.get(target);
- if (!depsMap) {
- return;
- }
- let deps = [];
- if (type === "clear") {
- deps = [...depsMap.values()];
- } else if (key === "length" && isArray(target)) {
- const newLength = Number(newValue);
- depsMap.forEach((dep, key2) => {
- if (key2 === "length" || !isSymbol(key2) && key2 >= newLength) {
- deps.push(dep);
- }
- });
- } else {
- if (key !== void 0) {
- deps.push(depsMap.get(key));
- }
- switch (type) {
- case "add":
- if (!isArray(target)) {
- deps.push(depsMap.get(ITERATE_KEY));
- if (isMap(target)) {
- deps.push(depsMap.get(MAP_KEY_ITERATE_KEY));
- }
- } else if (isIntegerKey(key)) {
- deps.push(depsMap.get("length"));
- }
- break;
- case "delete":
- if (!isArray(target)) {
- deps.push(depsMap.get(ITERATE_KEY));
- if (isMap(target)) {
- deps.push(depsMap.get(MAP_KEY_ITERATE_KEY));
- }
- }
- break;
- case "set":
- if (isMap(target)) {
- deps.push(depsMap.get(ITERATE_KEY));
- }
- break;
- }
- }
- pauseScheduling();
- for (const dep of deps) {
- if (dep) {
- triggerEffects(
- dep,
- 4,
- true ? {
- target,
- type,
- key,
- newValue,
- oldValue,
- oldTarget
- } : void 0
- );
- }
- }
- resetScheduling();
-}
-function getDepFromReactive(object, key) {
- const depsMap = targetMap.get(object);
- return depsMap && depsMap.get(key);
-}
-var isNonTrackableKeys = makeMap(`__proto__,__v_isRef,__isVue`);
-var builtInSymbols = new Set(
- Object.getOwnPropertyNames(Symbol).filter((key) => key !== "arguments" && key !== "caller").map((key) => Symbol[key]).filter(isSymbol)
-);
-var arrayInstrumentations = createArrayInstrumentations();
-function createArrayInstrumentations() {
- const instrumentations = {};
- ["includes", "indexOf", "lastIndexOf"].forEach((key) => {
- instrumentations[key] = function(...args) {
- const arr = toRaw(this);
- for (let i = 0, l = this.length; i < l; i++) {
- track(arr, "get", i + "");
- }
- const res = arr[key](...args);
- if (res === -1 || res === false) {
- return arr[key](...args.map(toRaw));
- } else {
- return res;
- }
- };
- });
- ["push", "pop", "shift", "unshift", "splice"].forEach((key) => {
- instrumentations[key] = function(...args) {
- pauseTracking();
- pauseScheduling();
- const res = toRaw(this)[key].apply(this, args);
- resetScheduling();
- resetTracking();
- return res;
- };
- });
- return instrumentations;
-}
-function hasOwnProperty2(key) {
- if (!isSymbol(key)) key = String(key);
- const obj = toRaw(this);
- track(obj, "has", key);
- return obj.hasOwnProperty(key);
-}
-var BaseReactiveHandler = class {
- constructor(_isReadonly = false, _isShallow = false) {
- this._isReadonly = _isReadonly;
- this._isShallow = _isShallow;
- }
- get(target, key, receiver) {
- const isReadonly2 = this._isReadonly, isShallow2 = this._isShallow;
- if (key === "__v_isReactive") {
- return !isReadonly2;
- } else if (key === "__v_isReadonly") {
- return isReadonly2;
- } else if (key === "__v_isShallow") {
- return isShallow2;
- } else if (key === "__v_raw") {
- if (receiver === (isReadonly2 ? isShallow2 ? shallowReadonlyMap : readonlyMap : isShallow2 ? shallowReactiveMap : reactiveMap).get(target) || // receiver is not the reactive proxy, but has the same prototype
- // this means the reciever is a user proxy of the reactive proxy
- Object.getPrototypeOf(target) === Object.getPrototypeOf(receiver)) {
- return target;
- }
- return;
- }
- const targetIsArray = isArray(target);
- if (!isReadonly2) {
- if (targetIsArray && hasOwn(arrayInstrumentations, key)) {
- return Reflect.get(arrayInstrumentations, key, receiver);
- }
- if (key === "hasOwnProperty") {
- return hasOwnProperty2;
- }
- }
- const res = Reflect.get(target, key, receiver);
- if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) {
- return res;
- }
- if (!isReadonly2) {
- track(target, "get", key);
- }
- if (isShallow2) {
- return res;
- }
- if (isRef2(res)) {
- return targetIsArray && isIntegerKey(key) ? res : res.value;
- }
- if (isObject(res)) {
- return isReadonly2 ? readonly(res) : reactive(res);
- }
- return res;
- }
-};
-var MutableReactiveHandler = class extends BaseReactiveHandler {
- constructor(isShallow2 = false) {
- super(false, isShallow2);
- }
- set(target, key, value, receiver) {
- let oldValue = target[key];
- if (!this._isShallow) {
- const isOldValueReadonly = isReadonly(oldValue);
- if (!isShallow(value) && !isReadonly(value)) {
- oldValue = toRaw(oldValue);
- value = toRaw(value);
- }
- if (!isArray(target) && isRef2(oldValue) && !isRef2(value)) {
- if (isOldValueReadonly) {
- return false;
- } else {
- oldValue.value = value;
- return true;
- }
- }
- }
- const hadKey = isArray(target) && isIntegerKey(key) ? Number(key) < target.length : hasOwn(target, key);
- const result = Reflect.set(target, key, value, receiver);
- if (target === toRaw(receiver)) {
- if (!hadKey) {
- trigger(target, "add", key, value);
- } else if (hasChanged(value, oldValue)) {
- trigger(target, "set", key, value, oldValue);
- }
- }
- return result;
- }
- deleteProperty(target, key) {
- const hadKey = hasOwn(target, key);
- const oldValue = target[key];
- const result = Reflect.deleteProperty(target, key);
- if (result && hadKey) {
- trigger(target, "delete", key, void 0, oldValue);
- }
- return result;
- }
- has(target, key) {
- const result = Reflect.has(target, key);
- if (!isSymbol(key) || !builtInSymbols.has(key)) {
- track(target, "has", key);
- }
- return result;
- }
- ownKeys(target) {
- track(
- target,
- "iterate",
- isArray(target) ? "length" : ITERATE_KEY
- );
- return Reflect.ownKeys(target);
- }
-};
-var ReadonlyReactiveHandler = class extends BaseReactiveHandler {
- constructor(isShallow2 = false) {
- super(true, isShallow2);
- }
- set(target, key) {
- if (true) {
- warn(
- `Set operation on key "${String(key)}" failed: target is readonly.`,
- target
- );
- }
- return true;
- }
- deleteProperty(target, key) {
- if (true) {
- warn(
- `Delete operation on key "${String(key)}" failed: target is readonly.`,
- target
- );
- }
- return true;
- }
-};
-var mutableHandlers = new MutableReactiveHandler();
-var readonlyHandlers = new ReadonlyReactiveHandler();
-var shallowReactiveHandlers = new MutableReactiveHandler(
- true
-);
-var shallowReadonlyHandlers = new ReadonlyReactiveHandler(true);
-var toShallow = (value) => value;
-var getProto = (v) => Reflect.getPrototypeOf(v);
-function get(target, key, isReadonly2 = false, isShallow2 = false) {
- target = target["__v_raw"];
- const rawTarget = toRaw(target);
- const rawKey = toRaw(key);
- if (!isReadonly2) {
- if (hasChanged(key, rawKey)) {
- track(rawTarget, "get", key);
- }
- track(rawTarget, "get", rawKey);
- }
- const { has: has2 } = getProto(rawTarget);
- const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive;
- if (has2.call(rawTarget, key)) {
- return wrap(target.get(key));
- } else if (has2.call(rawTarget, rawKey)) {
- return wrap(target.get(rawKey));
- } else if (target !== rawTarget) {
- target.get(key);
- }
-}
-function has(key, isReadonly2 = false) {
- const target = this["__v_raw"];
- const rawTarget = toRaw(target);
- const rawKey = toRaw(key);
- if (!isReadonly2) {
- if (hasChanged(key, rawKey)) {
- track(rawTarget, "has", key);
- }
- track(rawTarget, "has", rawKey);
- }
- return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey);
-}
-function size(target, isReadonly2 = false) {
- target = target["__v_raw"];
- !isReadonly2 && track(toRaw(target), "iterate", ITERATE_KEY);
- return Reflect.get(target, "size", target);
-}
-function add(value) {
- value = toRaw(value);
- const target = toRaw(this);
- const proto = getProto(target);
- const hadKey = proto.has.call(target, value);
- if (!hadKey) {
- target.add(value);
- trigger(target, "add", value, value);
- }
- return this;
-}
-function set(key, value) {
- value = toRaw(value);
- const target = toRaw(this);
- const { has: has2, get: get2 } = getProto(target);
- let hadKey = has2.call(target, key);
- if (!hadKey) {
- key = toRaw(key);
- hadKey = has2.call(target, key);
- } else if (true) {
- checkIdentityKeys(target, has2, key);
- }
- const oldValue = get2.call(target, key);
- target.set(key, value);
- if (!hadKey) {
- trigger(target, "add", key, value);
- } else if (hasChanged(value, oldValue)) {
- trigger(target, "set", key, value, oldValue);
- }
- return this;
-}
-function deleteEntry(key) {
- const target = toRaw(this);
- const { has: has2, get: get2 } = getProto(target);
- let hadKey = has2.call(target, key);
- if (!hadKey) {
- key = toRaw(key);
- hadKey = has2.call(target, key);
- } else if (true) {
- checkIdentityKeys(target, has2, key);
- }
- const oldValue = get2 ? get2.call(target, key) : void 0;
- const result = target.delete(key);
- if (hadKey) {
- trigger(target, "delete", key, void 0, oldValue);
- }
- return result;
-}
-function clear() {
- const target = toRaw(this);
- const hadItems = target.size !== 0;
- const oldTarget = true ? isMap(target) ? new Map(target) : new Set(target) : void 0;
- const result = target.clear();
- if (hadItems) {
- trigger(target, "clear", void 0, void 0, oldTarget);
- }
- return result;
-}
-function createForEach(isReadonly2, isShallow2) {
- return function forEach(callback, thisArg) {
- const observed = this;
- const target = observed["__v_raw"];
- const rawTarget = toRaw(target);
- const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive;
- !isReadonly2 && track(rawTarget, "iterate", ITERATE_KEY);
- return target.forEach((value, key) => {
- return callback.call(thisArg, wrap(value), wrap(key), observed);
- });
- };
-}
-function createIterableMethod(method, isReadonly2, isShallow2) {
- return function(...args) {
- const target = this["__v_raw"];
- const rawTarget = toRaw(target);
- const targetIsMap = isMap(rawTarget);
- const isPair = method === "entries" || method === Symbol.iterator && targetIsMap;
- const isKeyOnly = method === "keys" && targetIsMap;
- const innerIterator = target[method](...args);
- const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive;
- !isReadonly2 && track(
- rawTarget,
- "iterate",
- isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY
- );
- return {
- // iterator protocol
- next() {
- const { value, done } = innerIterator.next();
- return done ? { value, done } : {
- value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),
- done
- };
- },
- // iterable protocol
- [Symbol.iterator]() {
- return this;
- }
- };
- };
-}
-function createReadonlyMethod(type) {
- return function(...args) {
- if (true) {
- const key = args[0] ? `on key "${args[0]}" ` : ``;
- warn(
- `${capitalize(type)} operation ${key}failed: target is readonly.`,
- toRaw(this)
- );
- }
- return type === "delete" ? false : type === "clear" ? void 0 : this;
- };
-}
-function createInstrumentations() {
- const mutableInstrumentations2 = {
- get(key) {
- return get(this, key);
- },
- get size() {
- return size(this);
- },
- has,
- add,
- set,
- delete: deleteEntry,
- clear,
- forEach: createForEach(false, false)
- };
- const shallowInstrumentations2 = {
- get(key) {
- return get(this, key, false, true);
- },
- get size() {
- return size(this);
- },
- has,
- add,
- set,
- delete: deleteEntry,
- clear,
- forEach: createForEach(false, true)
- };
- const readonlyInstrumentations2 = {
- get(key) {
- return get(this, key, true);
- },
- get size() {
- return size(this, true);
- },
- has(key) {
- return has.call(this, key, true);
- },
- add: createReadonlyMethod("add"),
- set: createReadonlyMethod("set"),
- delete: createReadonlyMethod("delete"),
- clear: createReadonlyMethod("clear"),
- forEach: createForEach(true, false)
- };
- const shallowReadonlyInstrumentations2 = {
- get(key) {
- return get(this, key, true, true);
- },
- get size() {
- return size(this, true);
- },
- has(key) {
- return has.call(this, key, true);
- },
- add: createReadonlyMethod("add"),
- set: createReadonlyMethod("set"),
- delete: createReadonlyMethod("delete"),
- clear: createReadonlyMethod("clear"),
- forEach: createForEach(true, true)
- };
- const iteratorMethods = [
- "keys",
- "values",
- "entries",
- Symbol.iterator
- ];
- iteratorMethods.forEach((method) => {
- mutableInstrumentations2[method] = createIterableMethod(method, false, false);
- readonlyInstrumentations2[method] = createIterableMethod(method, true, false);
- shallowInstrumentations2[method] = createIterableMethod(method, false, true);
- shallowReadonlyInstrumentations2[method] = createIterableMethod(
- method,
- true,
- true
- );
- });
- return [
- mutableInstrumentations2,
- readonlyInstrumentations2,
- shallowInstrumentations2,
- shallowReadonlyInstrumentations2
- ];
-}
-var [
- mutableInstrumentations,
- readonlyInstrumentations,
- shallowInstrumentations,
- shallowReadonlyInstrumentations
-] = createInstrumentations();
-function createInstrumentationGetter(isReadonly2, shallow) {
- const instrumentations = shallow ? isReadonly2 ? shallowReadonlyInstrumentations : shallowInstrumentations : isReadonly2 ? readonlyInstrumentations : mutableInstrumentations;
- return (target, key, receiver) => {
- if (key === "__v_isReactive") {
- return !isReadonly2;
- } else if (key === "__v_isReadonly") {
- return isReadonly2;
- } else if (key === "__v_raw") {
- return target;
- }
- return Reflect.get(
- hasOwn(instrumentations, key) && key in target ? instrumentations : target,
- key,
- receiver
- );
- };
-}
-var mutableCollectionHandlers = {
- get: createInstrumentationGetter(false, false)
-};
-var shallowCollectionHandlers = {
- get: createInstrumentationGetter(false, true)
-};
-var readonlyCollectionHandlers = {
- get: createInstrumentationGetter(true, false)
-};
-var shallowReadonlyCollectionHandlers = {
- get: createInstrumentationGetter(true, true)
-};
-function checkIdentityKeys(target, has2, key) {
- const rawKey = toRaw(key);
- if (rawKey !== key && has2.call(target, rawKey)) {
- const type = toRawType(target);
- warn(
- `Reactive ${type} contains both the raw and reactive versions of the same object${type === `Map` ? ` as keys` : ``}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.`
- );
- }
-}
-var reactiveMap = /* @__PURE__ */ new WeakMap();
-var shallowReactiveMap = /* @__PURE__ */ new WeakMap();
-var readonlyMap = /* @__PURE__ */ new WeakMap();
-var shallowReadonlyMap = /* @__PURE__ */ new WeakMap();
-function targetTypeMap(rawType) {
- switch (rawType) {
- case "Object":
- case "Array":
- return 1;
- case "Map":
- case "Set":
- case "WeakMap":
- case "WeakSet":
- return 2;
- default:
- return 0;
- }
-}
-function getTargetType(value) {
- return value["__v_skip"] || !Object.isExtensible(value) ? 0 : targetTypeMap(toRawType(value));
-}
-function reactive(target) {
- if (isReadonly(target)) {
- return target;
- }
- return createReactiveObject(
- target,
- false,
- mutableHandlers,
- mutableCollectionHandlers,
- reactiveMap
- );
-}
-function shallowReactive(target) {
- return createReactiveObject(
- target,
- false,
- shallowReactiveHandlers,
- shallowCollectionHandlers,
- shallowReactiveMap
- );
-}
-function readonly(target) {
- return createReactiveObject(
- target,
- true,
- readonlyHandlers,
- readonlyCollectionHandlers,
- readonlyMap
- );
-}
-function shallowReadonly(target) {
- return createReactiveObject(
- target,
- true,
- shallowReadonlyHandlers,
- shallowReadonlyCollectionHandlers,
- shallowReadonlyMap
- );
-}
-function createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) {
- if (!isObject(target)) {
- if (true) {
- warn(
- `value cannot be made ${isReadonly2 ? "readonly" : "reactive"}: ${String(
- target
- )}`
- );
- }
- return target;
- }
- if (target["__v_raw"] && !(isReadonly2 && target["__v_isReactive"])) {
- return target;
- }
- const existingProxy = proxyMap.get(target);
- if (existingProxy) {
- return existingProxy;
- }
- const targetType = getTargetType(target);
- if (targetType === 0) {
- return target;
- }
- const proxy = new Proxy(
- target,
- targetType === 2 ? collectionHandlers : baseHandlers
- );
- proxyMap.set(target, proxy);
- return proxy;
-}
-function isReactive(value) {
- if (isReadonly(value)) {
- return isReactive(value["__v_raw"]);
- }
- return !!(value && value["__v_isReactive"]);
-}
-function isReadonly(value) {
- return !!(value && value["__v_isReadonly"]);
-}
-function isShallow(value) {
- return !!(value && value["__v_isShallow"]);
-}
-function isProxy(value) {
- return value ? !!value["__v_raw"] : false;
-}
-function toRaw(observed) {
- const raw = observed && observed["__v_raw"];
- return raw ? toRaw(raw) : observed;
-}
-function markRaw(value) {
- if (Object.isExtensible(value)) {
- def(value, "__v_skip", true);
- }
- return value;
-}
-var toReactive = (value) => isObject(value) ? reactive(value) : value;
-var toReadonly = (value) => isObject(value) ? readonly(value) : value;
-var COMPUTED_SIDE_EFFECT_WARN = `Computed is still dirty after getter evaluation, likely because a computed is mutating its own dependency in its getter. State mutations in computed getters should be avoided. Check the docs for more details: https://vuejs.org/guide/essentials/computed.html#getters-should-be-side-effect-free`;
-var ComputedRefImpl = class {
- constructor(getter, _setter, isReadonly2, isSSR) {
- this.getter = getter;
- this._setter = _setter;
- this.dep = void 0;
- this.__v_isRef = true;
- this["__v_isReadonly"] = false;
- this.effect = new ReactiveEffect(
- () => getter(this._value),
- () => triggerRefValue(
- this,
- this.effect._dirtyLevel === 2 ? 2 : 3
- )
- );
- this.effect.computed = this;
- this.effect.active = this._cacheable = !isSSR;
- this["__v_isReadonly"] = isReadonly2;
- }
- get value() {
- const self2 = toRaw(this);
- if ((!self2._cacheable || self2.effect.dirty) && hasChanged(self2._value, self2._value = self2.effect.run())) {
- triggerRefValue(self2, 4);
- }
- trackRefValue(self2);
- if (self2.effect._dirtyLevel >= 2) {
- if (this._warnRecursive) {
- warn(COMPUTED_SIDE_EFFECT_WARN, `
-
-getter: `, this.getter);
- }
- triggerRefValue(self2, 2);
- }
- return self2._value;
- }
- set value(newValue) {
- this._setter(newValue);
- }
- // #region polyfill _dirty for backward compatibility third party code for Vue <= 3.3.x
- get _dirty() {
- return this.effect.dirty;
- }
- set _dirty(v) {
- this.effect.dirty = v;
- }
- // #endregion
-};
-function computed(getterOrOptions, debugOptions, isSSR = false) {
- let getter;
- let setter;
- const onlyGetter = isFunction(getterOrOptions);
- if (onlyGetter) {
- getter = getterOrOptions;
- setter = true ? () => {
- warn("Write operation failed: computed value is readonly");
- } : NOOP;
- } else {
- getter = getterOrOptions.get;
- setter = getterOrOptions.set;
- }
- const cRef = new ComputedRefImpl(getter, setter, onlyGetter || !setter, isSSR);
- if (debugOptions && !isSSR) {
- cRef.effect.onTrack = debugOptions.onTrack;
- cRef.effect.onTrigger = debugOptions.onTrigger;
- }
- return cRef;
-}
-function trackRefValue(ref2) {
- var _a;
- if (shouldTrack && activeEffect) {
- ref2 = toRaw(ref2);
- trackEffect(
- activeEffect,
- (_a = ref2.dep) != null ? _a : ref2.dep = createDep(
- () => ref2.dep = void 0,
- ref2 instanceof ComputedRefImpl ? ref2 : void 0
- ),
- true ? {
- target: ref2,
- type: "get",
- key: "value"
- } : void 0
- );
- }
-}
-function triggerRefValue(ref2, dirtyLevel = 4, newVal, oldVal) {
- ref2 = toRaw(ref2);
- const dep = ref2.dep;
- if (dep) {
- triggerEffects(
- dep,
- dirtyLevel,
- true ? {
- target: ref2,
- type: "set",
- key: "value",
- newValue: newVal,
- oldValue: oldVal
- } : void 0
- );
- }
-}
-function isRef2(r) {
- return !!(r && r.__v_isRef === true);
-}
-function ref(value) {
- return createRef(value, false);
-}
-function shallowRef(value) {
- return createRef(value, true);
-}
-function createRef(rawValue, shallow) {
- if (isRef2(rawValue)) {
- return rawValue;
- }
- return new RefImpl(rawValue, shallow);
-}
-var RefImpl = class {
- constructor(value, __v_isShallow) {
- this.__v_isShallow = __v_isShallow;
- this.dep = void 0;
- this.__v_isRef = true;
- this._rawValue = __v_isShallow ? value : toRaw(value);
- this._value = __v_isShallow ? value : toReactive(value);
- }
- get value() {
- trackRefValue(this);
- return this._value;
- }
- set value(newVal) {
- const useDirectValue = this.__v_isShallow || isShallow(newVal) || isReadonly(newVal);
- newVal = useDirectValue ? newVal : toRaw(newVal);
- if (hasChanged(newVal, this._rawValue)) {
- const oldVal = this._rawValue;
- this._rawValue = newVal;
- this._value = useDirectValue ? newVal : toReactive(newVal);
- triggerRefValue(this, 4, newVal, oldVal);
- }
- }
-};
-function triggerRef(ref2) {
- triggerRefValue(ref2, 4, true ? ref2.value : void 0);
-}
-function unref(ref2) {
- return isRef2(ref2) ? ref2.value : ref2;
-}
-function toValue(source) {
- return isFunction(source) ? source() : unref(source);
-}
-var shallowUnwrapHandlers = {
- get: (target, key, receiver) => unref(Reflect.get(target, key, receiver)),
- set: (target, key, value, receiver) => {
- const oldValue = target[key];
- if (isRef2(oldValue) && !isRef2(value)) {
- oldValue.value = value;
- return true;
- } else {
- return Reflect.set(target, key, value, receiver);
- }
- }
-};
-function proxyRefs(objectWithRefs) {
- return isReactive(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers);
-}
-var CustomRefImpl = class {
- constructor(factory) {
- this.dep = void 0;
- this.__v_isRef = true;
- const { get: get2, set: set2 } = factory(
- () => trackRefValue(this),
- () => triggerRefValue(this)
- );
- this._get = get2;
- this._set = set2;
- }
- get value() {
- return this._get();
- }
- set value(newVal) {
- this._set(newVal);
- }
-};
-function customRef(factory) {
- return new CustomRefImpl(factory);
-}
-function toRefs(object) {
- if (!isProxy(object)) {
- warn(`toRefs() expects a reactive object but received a plain one.`);
- }
- const ret = isArray(object) ? new Array(object.length) : {};
- for (const key in object) {
- ret[key] = propertyToRef(object, key);
- }
- return ret;
-}
-var ObjectRefImpl = class {
- constructor(_object, _key, _defaultValue) {
- this._object = _object;
- this._key = _key;
- this._defaultValue = _defaultValue;
- this.__v_isRef = true;
- }
- get value() {
- const val = this._object[this._key];
- return val === void 0 ? this._defaultValue : val;
- }
- set value(newVal) {
- this._object[this._key] = newVal;
- }
- get dep() {
- return getDepFromReactive(toRaw(this._object), this._key);
- }
-};
-var GetterRefImpl = class {
- constructor(_getter) {
- this._getter = _getter;
- this.__v_isRef = true;
- this.__v_isReadonly = true;
- }
- get value() {
- return this._getter();
- }
-};
-function toRef(source, key, defaultValue) {
- if (isRef2(source)) {
- return source;
- } else if (isFunction(source)) {
- return new GetterRefImpl(source);
- } else if (isObject(source) && arguments.length > 1) {
- return propertyToRef(source, key, defaultValue);
- } else {
- return ref(source);
- }
-}
-function propertyToRef(source, key, defaultValue) {
- const val = source[key];
- return isRef2(val) ? val : new ObjectRefImpl(source, key, defaultValue);
-}
-var TrackOpTypes = {
- "GET": "get",
- "HAS": "has",
- "ITERATE": "iterate"
-};
-var TriggerOpTypes = {
- "SET": "set",
- "ADD": "add",
- "DELETE": "delete",
- "CLEAR": "clear"
-};
-
-// node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js
-var stack = [];
-function pushWarningContext(vnode) {
- stack.push(vnode);
-}
-function popWarningContext() {
- stack.pop();
-}
-function warn$1(msg, ...args) {
- pauseTracking();
- const instance = stack.length ? stack[stack.length - 1].component : null;
- const appWarnHandler = instance && instance.appContext.config.warnHandler;
- const trace = getComponentTrace();
- if (appWarnHandler) {
- callWithErrorHandling(
- appWarnHandler,
- instance,
- 11,
- [
- // eslint-disable-next-line no-restricted-syntax
- msg + args.map((a) => {
- var _a, _b;
- return (_b = (_a = a.toString) == null ? void 0 : _a.call(a)) != null ? _b : JSON.stringify(a);
- }).join(""),
- instance && instance.proxy,
- trace.map(
- ({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>`
- ).join("\n"),
- trace
- ]
- );
- } else {
- const warnArgs = [`[Vue warn]: ${msg}`, ...args];
- if (trace.length && // avoid spamming console during tests
- true) {
- warnArgs.push(`
-`, ...formatTrace(trace));
- }
- console.warn(...warnArgs);
- }
- resetTracking();
-}
-function getComponentTrace() {
- let currentVNode = stack[stack.length - 1];
- if (!currentVNode) {
- return [];
- }
- const normalizedStack = [];
- while (currentVNode) {
- const last = normalizedStack[0];
- if (last && last.vnode === currentVNode) {
- last.recurseCount++;
- } else {
- normalizedStack.push({
- vnode: currentVNode,
- recurseCount: 0
- });
- }
- const parentInstance = currentVNode.component && currentVNode.component.parent;
- currentVNode = parentInstance && parentInstance.vnode;
- }
- return normalizedStack;
-}
-function formatTrace(trace) {
- const logs = [];
- trace.forEach((entry, i) => {
- logs.push(...i === 0 ? [] : [`
-`], ...formatTraceEntry(entry));
- });
- return logs;
-}
-function formatTraceEntry({ vnode, recurseCount }) {
- const postfix = recurseCount > 0 ? `... (${recurseCount} recursive calls)` : ``;
- const isRoot = vnode.component ? vnode.component.parent == null : false;
- const open = ` at <${formatComponentName(
- vnode.component,
- vnode.type,
- isRoot
- )}`;
- const close = `>` + postfix;
- return vnode.props ? [open, ...formatProps(vnode.props), close] : [open + close];
-}
-function formatProps(props) {
- const res = [];
- const keys = Object.keys(props);
- keys.slice(0, 3).forEach((key) => {
- res.push(...formatProp(key, props[key]));
- });
- if (keys.length > 3) {
- res.push(` ...`);
- }
- return res;
-}
-function formatProp(key, value, raw) {
- if (isString(value)) {
- value = JSON.stringify(value);
- return raw ? value : [`${key}=${value}`];
- } else if (typeof value === "number" || typeof value === "boolean" || value == null) {
- return raw ? value : [`${key}=${value}`];
- } else if (isRef2(value)) {
- value = formatProp(key, toRaw(value.value), true);
- return raw ? value : [`${key}=Ref<`, value, `>`];
- } else if (isFunction(value)) {
- return [`${key}=fn${value.name ? `<${value.name}>` : ``}`];
- } else {
- value = toRaw(value);
- return raw ? value : [`${key}=`, value];
- }
-}
-function assertNumber(val, type) {
- if (false) return;
- if (val === void 0) {
- return;
- } else if (typeof val !== "number") {
- warn$1(`${type} is not a valid number - got ${JSON.stringify(val)}.`);
- } else if (isNaN(val)) {
- warn$1(`${type} is NaN - the duration expression might be incorrect.`);
- }
-}
-var ErrorCodes = {
- "SETUP_FUNCTION": 0,
- "0": "SETUP_FUNCTION",
- "RENDER_FUNCTION": 1,
- "1": "RENDER_FUNCTION",
- "WATCH_GETTER": 2,
- "2": "WATCH_GETTER",
- "WATCH_CALLBACK": 3,
- "3": "WATCH_CALLBACK",
- "WATCH_CLEANUP": 4,
- "4": "WATCH_CLEANUP",
- "NATIVE_EVENT_HANDLER": 5,
- "5": "NATIVE_EVENT_HANDLER",
- "COMPONENT_EVENT_HANDLER": 6,
- "6": "COMPONENT_EVENT_HANDLER",
- "VNODE_HOOK": 7,
- "7": "VNODE_HOOK",
- "DIRECTIVE_HOOK": 8,
- "8": "DIRECTIVE_HOOK",
- "TRANSITION_HOOK": 9,
- "9": "TRANSITION_HOOK",
- "APP_ERROR_HANDLER": 10,
- "10": "APP_ERROR_HANDLER",
- "APP_WARN_HANDLER": 11,
- "11": "APP_WARN_HANDLER",
- "FUNCTION_REF": 12,
- "12": "FUNCTION_REF",
- "ASYNC_COMPONENT_LOADER": 13,
- "13": "ASYNC_COMPONENT_LOADER",
- "SCHEDULER": 14,
- "14": "SCHEDULER"
-};
-var ErrorTypeStrings$1 = {
- ["sp"]: "serverPrefetch hook",
- ["bc"]: "beforeCreate hook",
- ["c"]: "created hook",
- ["bm"]: "beforeMount hook",
- ["m"]: "mounted hook",
- ["bu"]: "beforeUpdate hook",
- ["u"]: "updated",
- ["bum"]: "beforeUnmount hook",
- ["um"]: "unmounted hook",
- ["a"]: "activated hook",
- ["da"]: "deactivated hook",
- ["ec"]: "errorCaptured hook",
- ["rtc"]: "renderTracked hook",
- ["rtg"]: "renderTriggered hook",
- [0]: "setup function",
- [1]: "render function",
- [2]: "watcher getter",
- [3]: "watcher callback",
- [4]: "watcher cleanup function",
- [5]: "native event handler",
- [6]: "component event handler",
- [7]: "vnode hook",
- [8]: "directive hook",
- [9]: "transition hook",
- [10]: "app errorHandler",
- [11]: "app warnHandler",
- [12]: "ref function",
- [13]: "async component loader",
- [14]: "scheduler flush. This is likely a Vue internals bug. Please open an issue at https://github.com/vuejs/core ."
-};
-function callWithErrorHandling(fn, instance, type, args) {
- try {
- return args ? fn(...args) : fn();
- } catch (err) {
- handleError(err, instance, type);
- }
-}
-function callWithAsyncErrorHandling(fn, instance, type, args) {
- if (isFunction(fn)) {
- const res = callWithErrorHandling(fn, instance, type, args);
- if (res && isPromise(res)) {
- res.catch((err) => {
- handleError(err, instance, type);
- });
- }
- return res;
- }
- if (isArray(fn)) {
- const values = [];
- for (let i = 0; i < fn.length; i++) {
- values.push(callWithAsyncErrorHandling(fn[i], instance, type, args));
- }
- return values;
- } else if (true) {
- warn$1(
- `Invalid value type passed to callWithAsyncErrorHandling(): ${typeof fn}`
- );
- }
-}
-function handleError(err, instance, type, throwInDev = true) {
- const contextVNode = instance ? instance.vnode : null;
- if (instance) {
- let cur = instance.parent;
- const exposedInstance = instance.proxy;
- const errorInfo = true ? ErrorTypeStrings$1[type] : `https://vuejs.org/error-reference/#runtime-${type}`;
- while (cur) {
- const errorCapturedHooks = cur.ec;
- if (errorCapturedHooks) {
- for (let i = 0; i < errorCapturedHooks.length; i++) {
- if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) {
- return;
- }
- }
- }
- cur = cur.parent;
- }
- const appErrorHandler = instance.appContext.config.errorHandler;
- if (appErrorHandler) {
- pauseTracking();
- callWithErrorHandling(
- appErrorHandler,
- null,
- 10,
- [err, exposedInstance, errorInfo]
- );
- resetTracking();
- return;
- }
- }
- logError(err, type, contextVNode, throwInDev);
-}
-function logError(err, type, contextVNode, throwInDev = true) {
- if (true) {
- const info = ErrorTypeStrings$1[type];
- if (contextVNode) {
- pushWarningContext(contextVNode);
- }
- warn$1(`Unhandled error${info ? ` during execution of ${info}` : ``}`);
- if (contextVNode) {
- popWarningContext();
- }
- if (throwInDev) {
- throw err;
- } else {
- console.error(err);
- }
- } else {
- console.error(err);
- }
-}
-var isFlushing = false;
-var isFlushPending = false;
-var queue = [];
-var flushIndex = 0;
-var pendingPostFlushCbs = [];
-var activePostFlushCbs = null;
-var postFlushIndex = 0;
-var resolvedPromise = Promise.resolve();
-var currentFlushPromise = null;
-var RECURSION_LIMIT = 100;
-function nextTick(fn) {
- const p2 = currentFlushPromise || resolvedPromise;
- return fn ? p2.then(this ? fn.bind(this) : fn) : p2;
-}
-function findInsertionIndex(id) {
- let start = flushIndex + 1;
- let end = queue.length;
- while (start < end) {
- const middle = start + end >>> 1;
- const middleJob = queue[middle];
- const middleJobId = getId(middleJob);
- if (middleJobId < id || middleJobId === id && middleJob.pre) {
- start = middle + 1;
- } else {
- end = middle;
- }
- }
- return start;
-}
-function queueJob(job) {
- if (!queue.length || !queue.includes(
- job,
- isFlushing && job.allowRecurse ? flushIndex + 1 : flushIndex
- )) {
- if (job.id == null) {
- queue.push(job);
- } else {
- queue.splice(findInsertionIndex(job.id), 0, job);
- }
- queueFlush();
- }
-}
-function queueFlush() {
- if (!isFlushing && !isFlushPending) {
- isFlushPending = true;
- currentFlushPromise = resolvedPromise.then(flushJobs);
- }
-}
-function invalidateJob(job) {
- const i = queue.indexOf(job);
- if (i > flushIndex) {
- queue.splice(i, 1);
- }
-}
-function queuePostFlushCb(cb) {
- if (!isArray(cb)) {
- if (!activePostFlushCbs || !activePostFlushCbs.includes(
- cb,
- cb.allowRecurse ? postFlushIndex + 1 : postFlushIndex
- )) {
- pendingPostFlushCbs.push(cb);
- }
- } else {
- pendingPostFlushCbs.push(...cb);
- }
- queueFlush();
-}
-function flushPreFlushCbs(instance, seen, i = isFlushing ? flushIndex + 1 : 0) {
- if (true) {
- seen = seen || /* @__PURE__ */ new Map();
- }
- for (; i < queue.length; i++) {
- const cb = queue[i];
- if (cb && cb.pre) {
- if (instance && cb.id !== instance.uid) {
- continue;
- }
- if (checkRecursiveUpdates(seen, cb)) {
- continue;
- }
- queue.splice(i, 1);
- i--;
- cb();
- }
- }
-}
-function flushPostFlushCbs(seen) {
- if (pendingPostFlushCbs.length) {
- const deduped = [...new Set(pendingPostFlushCbs)].sort(
- (a, b) => getId(a) - getId(b)
- );
- pendingPostFlushCbs.length = 0;
- if (activePostFlushCbs) {
- activePostFlushCbs.push(...deduped);
- return;
- }
- activePostFlushCbs = deduped;
- if (true) {
- seen = seen || /* @__PURE__ */ new Map();
- }
- for (postFlushIndex = 0; postFlushIndex < activePostFlushCbs.length; postFlushIndex++) {
- const cb = activePostFlushCbs[postFlushIndex];
- if (checkRecursiveUpdates(seen, cb)) {
- continue;
- }
- if (cb.active !== false) cb();
- }
- activePostFlushCbs = null;
- postFlushIndex = 0;
- }
-}
-var getId = (job) => job.id == null ? Infinity : job.id;
-var comparator = (a, b) => {
- const diff = getId(a) - getId(b);
- if (diff === 0) {
- if (a.pre && !b.pre) return -1;
- if (b.pre && !a.pre) return 1;
- }
- return diff;
-};
-function flushJobs(seen) {
- isFlushPending = false;
- isFlushing = true;
- if (true) {
- seen = seen || /* @__PURE__ */ new Map();
- }
- queue.sort(comparator);
- const check = true ? (job) => checkRecursiveUpdates(seen, job) : NOOP;
- try {
- for (flushIndex = 0; flushIndex < queue.length; flushIndex++) {
- const job = queue[flushIndex];
- if (job && job.active !== false) {
- if (check(job)) {
- continue;
- }
- callWithErrorHandling(job, null, 14);
- }
- }
- } finally {
- flushIndex = 0;
- queue.length = 0;
- flushPostFlushCbs(seen);
- isFlushing = false;
- currentFlushPromise = null;
- if (queue.length || pendingPostFlushCbs.length) {
- flushJobs(seen);
- }
- }
-}
-function checkRecursiveUpdates(seen, fn) {
- if (!seen.has(fn)) {
- seen.set(fn, 1);
- } else {
- const count = seen.get(fn);
- if (count > RECURSION_LIMIT) {
- const instance = fn.ownerInstance;
- const componentName = instance && getComponentName(instance.type);
- handleError(
- `Maximum recursive updates exceeded${componentName ? ` in component <${componentName}>` : ``}. This means you have a reactive effect that is mutating its own dependencies and thus recursively triggering itself. Possible sources include component template, render function, updated hook or watcher source function.`,
- null,
- 10
- );
- return true;
- } else {
- seen.set(fn, count + 1);
- }
- }
-}
-var isHmrUpdating = false;
-var hmrDirtyComponents = /* @__PURE__ */ new Set();
-if (true) {
- getGlobalThis().__VUE_HMR_RUNTIME__ = {
- createRecord: tryWrap(createRecord),
- rerender: tryWrap(rerender),
- reload: tryWrap(reload)
- };
-}
-var map = /* @__PURE__ */ new Map();
-function registerHMR(instance) {
- const id = instance.type.__hmrId;
- let record = map.get(id);
- if (!record) {
- createRecord(id, instance.type);
- record = map.get(id);
- }
- record.instances.add(instance);
-}
-function unregisterHMR(instance) {
- map.get(instance.type.__hmrId).instances.delete(instance);
-}
-function createRecord(id, initialDef) {
- if (map.has(id)) {
- return false;
- }
- map.set(id, {
- initialDef: normalizeClassComponent(initialDef),
- instances: /* @__PURE__ */ new Set()
- });
- return true;
-}
-function normalizeClassComponent(component) {
- return isClassComponent(component) ? component.__vccOpts : component;
-}
-function rerender(id, newRender) {
- const record = map.get(id);
- if (!record) {
- return;
- }
- record.initialDef.render = newRender;
- [...record.instances].forEach((instance) => {
- if (newRender) {
- instance.render = newRender;
- normalizeClassComponent(instance.type).render = newRender;
- }
- instance.renderCache = [];
- isHmrUpdating = true;
- instance.effect.dirty = true;
- instance.update();
- isHmrUpdating = false;
- });
-}
-function reload(id, newComp) {
- const record = map.get(id);
- if (!record) return;
- newComp = normalizeClassComponent(newComp);
- updateComponentDef(record.initialDef, newComp);
- const instances = [...record.instances];
- for (const instance of instances) {
- const oldComp = normalizeClassComponent(instance.type);
- if (!hmrDirtyComponents.has(oldComp)) {
- if (oldComp !== record.initialDef) {
- updateComponentDef(oldComp, newComp);
- }
- hmrDirtyComponents.add(oldComp);
- }
- instance.appContext.propsCache.delete(instance.type);
- instance.appContext.emitsCache.delete(instance.type);
- instance.appContext.optionsCache.delete(instance.type);
- if (instance.ceReload) {
- hmrDirtyComponents.add(oldComp);
- instance.ceReload(newComp.styles);
- hmrDirtyComponents.delete(oldComp);
- } else if (instance.parent) {
- instance.parent.effect.dirty = true;
- queueJob(() => {
- instance.parent.update();
- hmrDirtyComponents.delete(oldComp);
- });
- } else if (instance.appContext.reload) {
- instance.appContext.reload();
- } else if (typeof window !== "undefined") {
- window.location.reload();
- } else {
- console.warn(
- "[HMR] Root or manually mounted instance modified. Full reload required."
- );
- }
- }
- queuePostFlushCb(() => {
- for (const instance of instances) {
- hmrDirtyComponents.delete(
- normalizeClassComponent(instance.type)
- );
- }
- });
-}
-function updateComponentDef(oldComp, newComp) {
- extend(oldComp, newComp);
- for (const key in oldComp) {
- if (key !== "__file" && !(key in newComp)) {
- delete oldComp[key];
- }
- }
-}
-function tryWrap(fn) {
- return (id, arg) => {
- try {
- return fn(id, arg);
- } catch (e) {
- console.error(e);
- console.warn(
- `[HMR] Something went wrong during Vue component hot-reload. Full reload required.`
- );
- }
- };
-}
-var devtools$1;
-var buffer = [];
-var devtoolsNotInstalled = false;
-function emit$1(event, ...args) {
- if (devtools$1) {
- devtools$1.emit(event, ...args);
- } else if (!devtoolsNotInstalled) {
- buffer.push({ event, args });
- }
-}
-function setDevtoolsHook$1(hook, target) {
- var _a, _b;
- devtools$1 = hook;
- if (devtools$1) {
- devtools$1.enabled = true;
- buffer.forEach(({ event, args }) => devtools$1.emit(event, ...args));
- buffer = [];
- } else if (
- // handle late devtools injection - only do this if we are in an actual
- // browser environment to avoid the timer handle stalling test runner exit
- // (#4815)
- typeof window !== "undefined" && // some envs mock window but not fully
- window.HTMLElement && // also exclude jsdom
- // eslint-disable-next-line no-restricted-syntax
- !((_b = (_a = window.navigator) == null ? void 0 : _a.userAgent) == null ? void 0 : _b.includes("jsdom"))
- ) {
- const replay = target.__VUE_DEVTOOLS_HOOK_REPLAY__ = target.__VUE_DEVTOOLS_HOOK_REPLAY__ || [];
- replay.push((newHook) => {
- setDevtoolsHook$1(newHook, target);
- });
- setTimeout(() => {
- if (!devtools$1) {
- target.__VUE_DEVTOOLS_HOOK_REPLAY__ = null;
- devtoolsNotInstalled = true;
- buffer = [];
- }
- }, 3e3);
- } else {
- devtoolsNotInstalled = true;
- buffer = [];
- }
-}
-function devtoolsInitApp(app, version2) {
- emit$1("app:init", app, version2, {
- Fragment,
- Text,
- Comment,
- Static
- });
-}
-function devtoolsUnmountApp(app) {
- emit$1("app:unmount", app);
-}
-var devtoolsComponentAdded = createDevtoolsComponentHook(
- "component:added"
- /* COMPONENT_ADDED */
-);
-var devtoolsComponentUpdated = createDevtoolsComponentHook(
- "component:updated"
- /* COMPONENT_UPDATED */
-);
-var _devtoolsComponentRemoved = createDevtoolsComponentHook(
- "component:removed"
- /* COMPONENT_REMOVED */
-);
-var devtoolsComponentRemoved = (component) => {
- if (devtools$1 && typeof devtools$1.cleanupBuffer === "function" && // remove the component if it wasn't buffered
- !devtools$1.cleanupBuffer(component)) {
- _devtoolsComponentRemoved(component);
- }
-};
-function createDevtoolsComponentHook(hook) {
- return (component) => {
- emit$1(
- hook,
- component.appContext.app,
- component.uid,
- component.parent ? component.parent.uid : void 0,
- component
- );
- };
-}
-var devtoolsPerfStart = createDevtoolsPerformanceHook(
- "perf:start"
- /* PERFORMANCE_START */
-);
-var devtoolsPerfEnd = createDevtoolsPerformanceHook(
- "perf:end"
- /* PERFORMANCE_END */
-);
-function createDevtoolsPerformanceHook(hook) {
- return (component, type, time) => {
- emit$1(hook, component.appContext.app, component.uid, component, type, time);
- };
-}
-function devtoolsComponentEmit(component, event, params) {
- emit$1(
- "component:emit",
- component.appContext.app,
- component,
- event,
- params
- );
-}
-function emit(instance, event, ...rawArgs) {
- if (instance.isUnmounted) return;
- const props = instance.vnode.props || EMPTY_OBJ;
- if (true) {
- const {
- emitsOptions,
- propsOptions: [propsOptions]
- } = instance;
- if (emitsOptions) {
- if (!(event in emitsOptions) && true) {
- if (!propsOptions || !(toHandlerKey(event) in propsOptions)) {
- warn$1(
- `Component emitted event "${event}" but it is neither declared in the emits option nor as an "${toHandlerKey(event)}" prop.`
- );
- }
- } else {
- const validator = emitsOptions[event];
- if (isFunction(validator)) {
- const isValid = validator(...rawArgs);
- if (!isValid) {
- warn$1(
- `Invalid event arguments: event validation failed for event "${event}".`
- );
- }
- }
- }
- }
- }
- let args = rawArgs;
- const isModelListener2 = event.startsWith("update:");
- const modelArg = isModelListener2 && event.slice(7);
- if (modelArg && modelArg in props) {
- const modifiersKey = `${modelArg === "modelValue" ? "model" : modelArg}Modifiers`;
- const { number, trim } = props[modifiersKey] || EMPTY_OBJ;
- if (trim) {
- args = rawArgs.map((a) => isString(a) ? a.trim() : a);
- }
- if (number) {
- args = rawArgs.map(looseToNumber);
- }
- }
- if (true) {
- devtoolsComponentEmit(instance, event, args);
- }
- if (true) {
- const lowerCaseEvent = event.toLowerCase();
- if (lowerCaseEvent !== event && props[toHandlerKey(lowerCaseEvent)]) {
- warn$1(
- `Event "${lowerCaseEvent}" is emitted in component ${formatComponentName(
- instance,
- instance.type
- )} but the handler is registered for "${event}". Note that HTML attributes are case-insensitive and you cannot use v-on to listen to camelCase events when using in-DOM templates. You should probably use "${hyphenate(
- event
- )}" instead of "${event}".`
- );
- }
- }
- let handlerName;
- let handler = props[handlerName = toHandlerKey(event)] || // also try camelCase event handler (#2249)
- props[handlerName = toHandlerKey(camelize(event))];
- if (!handler && isModelListener2) {
- handler = props[handlerName = toHandlerKey(hyphenate(event))];
- }
- if (handler) {
- callWithAsyncErrorHandling(
- handler,
- instance,
- 6,
- args
- );
- }
- const onceHandler = props[handlerName + `Once`];
- if (onceHandler) {
- if (!instance.emitted) {
- instance.emitted = {};
- } else if (instance.emitted[handlerName]) {
- return;
- }
- instance.emitted[handlerName] = true;
- callWithAsyncErrorHandling(
- onceHandler,
- instance,
- 6,
- args
- );
- }
-}
-function normalizeEmitsOptions(comp, appContext, asMixin = false) {
- const cache = appContext.emitsCache;
- const cached = cache.get(comp);
- if (cached !== void 0) {
- return cached;
- }
- const raw = comp.emits;
- let normalized = {};
- let hasExtends = false;
- if (__VUE_OPTIONS_API__ && !isFunction(comp)) {
- const extendEmits = (raw2) => {
- const normalizedFromExtend = normalizeEmitsOptions(raw2, appContext, true);
- if (normalizedFromExtend) {
- hasExtends = true;
- extend(normalized, normalizedFromExtend);
- }
- };
- if (!asMixin && appContext.mixins.length) {
- appContext.mixins.forEach(extendEmits);
- }
- if (comp.extends) {
- extendEmits(comp.extends);
- }
- if (comp.mixins) {
- comp.mixins.forEach(extendEmits);
- }
- }
- if (!raw && !hasExtends) {
- if (isObject(comp)) {
- cache.set(comp, null);
- }
- return null;
- }
- if (isArray(raw)) {
- raw.forEach((key) => normalized[key] = null);
- } else {
- extend(normalized, raw);
- }
- if (isObject(comp)) {
- cache.set(comp, normalized);
- }
- return normalized;
-}
-function isEmitListener(options, key) {
- if (!options || !isOn(key)) {
- return false;
- }
- key = key.slice(2).replace(/Once$/, "");
- return hasOwn(options, key[0].toLowerCase() + key.slice(1)) || hasOwn(options, hyphenate(key)) || hasOwn(options, key);
-}
-var currentRenderingInstance = null;
-var currentScopeId = null;
-function setCurrentRenderingInstance(instance) {
- const prev = currentRenderingInstance;
- currentRenderingInstance = instance;
- currentScopeId = instance && instance.type.__scopeId || null;
- return prev;
-}
-function pushScopeId(id) {
- currentScopeId = id;
-}
-function popScopeId() {
- currentScopeId = null;
-}
-var withScopeId = (_id) => withCtx;
-function withCtx(fn, ctx = currentRenderingInstance, isNonScopedSlot) {
- if (!ctx) return fn;
- if (fn._n) {
- return fn;
- }
- const renderFnWithContext = (...args) => {
- if (renderFnWithContext._d) {
- setBlockTracking(-1);
- }
- const prevInstance = setCurrentRenderingInstance(ctx);
- let res;
- try {
- res = fn(...args);
- } finally {
- setCurrentRenderingInstance(prevInstance);
- if (renderFnWithContext._d) {
- setBlockTracking(1);
- }
- }
- if (true) {
- devtoolsComponentUpdated(ctx);
- }
- return res;
- };
- renderFnWithContext._n = true;
- renderFnWithContext._c = true;
- renderFnWithContext._d = true;
- return renderFnWithContext;
-}
-var accessedAttrs = false;
-function markAttrsAccessed() {
- accessedAttrs = true;
-}
-function renderComponentRoot(instance) {
- const {
- type: Component,
- vnode,
- proxy,
- withProxy,
- propsOptions: [propsOptions],
- slots,
- attrs,
- emit: emit2,
- render: render2,
- renderCache,
- props,
- data,
- setupState,
- ctx,
- inheritAttrs
- } = instance;
- const prev = setCurrentRenderingInstance(instance);
- let result;
- let fallthroughAttrs;
- if (true) {
- accessedAttrs = false;
- }
- try {
- if (vnode.shapeFlag & 4) {
- const proxyToUse = withProxy || proxy;
- const thisProxy = setupState.__isScriptSetup ? new Proxy(proxyToUse, {
- get(target, key, receiver) {
- warn$1(
- `Property '${String(
- key
- )}' was accessed via 'this'. Avoid using 'this' in templates.`
- );
- return Reflect.get(target, key, receiver);
- }
- }) : proxyToUse;
- result = normalizeVNode(
- render2.call(
- thisProxy,
- proxyToUse,
- renderCache,
- true ? shallowReadonly(props) : props,
- setupState,
- data,
- ctx
- )
- );
- fallthroughAttrs = attrs;
- } else {
- const render22 = Component;
- if (attrs === props) {
- markAttrsAccessed();
- }
- result = normalizeVNode(
- render22.length > 1 ? render22(
- true ? shallowReadonly(props) : props,
- true ? {
- get attrs() {
- markAttrsAccessed();
- return shallowReadonly(attrs);
- },
- slots,
- emit: emit2
- } : { attrs, slots, emit: emit2 }
- ) : render22(
- true ? shallowReadonly(props) : props,
- null
- )
- );
- fallthroughAttrs = Component.props ? attrs : getFunctionalFallthrough(attrs);
- }
- } catch (err) {
- blockStack.length = 0;
- handleError(err, instance, 1);
- result = createVNode(Comment);
- }
- let root = result;
- let setRoot = void 0;
- if (result.patchFlag > 0 && result.patchFlag & 2048) {
- [root, setRoot] = getChildRoot(result);
- }
- if (fallthroughAttrs && inheritAttrs !== false) {
- const keys = Object.keys(fallthroughAttrs);
- const { shapeFlag } = root;
- if (keys.length) {
- if (shapeFlag & (1 | 6)) {
- if (propsOptions && keys.some(isModelListener)) {
- fallthroughAttrs = filterModelListeners(
- fallthroughAttrs,
- propsOptions
- );
- }
- root = cloneVNode(root, fallthroughAttrs, false, true);
- } else if (!accessedAttrs && root.type !== Comment) {
- const allAttrs = Object.keys(attrs);
- const eventAttrs = [];
- const extraAttrs = [];
- for (let i = 0, l = allAttrs.length; i < l; i++) {
- const key = allAttrs[i];
- if (isOn(key)) {
- if (!isModelListener(key)) {
- eventAttrs.push(key[2].toLowerCase() + key.slice(3));
- }
- } else {
- extraAttrs.push(key);
- }
- }
- if (extraAttrs.length) {
- warn$1(
- `Extraneous non-props attributes (${extraAttrs.join(", ")}) were passed to component but could not be automatically inherited because component renders fragment or text root nodes.`
- );
- }
- if (eventAttrs.length) {
- warn$1(
- `Extraneous non-emits event listeners (${eventAttrs.join(", ")}) were passed to component but could not be automatically inherited because component renders fragment or text root nodes. If the listener is intended to be a component custom event listener only, declare it using the "emits" option.`
- );
- }
- }
- }
- }
- if (vnode.dirs) {
- if (!isElementRoot(root)) {
- warn$1(
- `Runtime directive used on component with non-element root node. The directives will not function as intended.`
- );
- }
- root = cloneVNode(root, null, false, true);
- root.dirs = root.dirs ? root.dirs.concat(vnode.dirs) : vnode.dirs;
- }
- if (vnode.transition) {
- if (!isElementRoot(root)) {
- warn$1(
- `Component inside renders non-element root node that cannot be animated.`
- );
- }
- root.transition = vnode.transition;
- }
- if (setRoot) {
- setRoot(root);
- } else {
- result = root;
- }
- setCurrentRenderingInstance(prev);
- return result;
-}
-var getChildRoot = (vnode) => {
- const rawChildren = vnode.children;
- const dynamicChildren = vnode.dynamicChildren;
- const childRoot = filterSingleRoot(rawChildren, false);
- if (!childRoot) {
- return [vnode, void 0];
- } else if (childRoot.patchFlag > 0 && childRoot.patchFlag & 2048) {
- return getChildRoot(childRoot);
- }
- const index = rawChildren.indexOf(childRoot);
- const dynamicIndex = dynamicChildren ? dynamicChildren.indexOf(childRoot) : -1;
- const setRoot = (updatedRoot) => {
- rawChildren[index] = updatedRoot;
- if (dynamicChildren) {
- if (dynamicIndex > -1) {
- dynamicChildren[dynamicIndex] = updatedRoot;
- } else if (updatedRoot.patchFlag > 0) {
- vnode.dynamicChildren = [...dynamicChildren, updatedRoot];
- }
- }
- };
- return [normalizeVNode(childRoot), setRoot];
-};
-function filterSingleRoot(children, recurse = true) {
- let singleRoot;
- for (let i = 0; i < children.length; i++) {
- const child = children[i];
- if (isVNode(child)) {
- if (child.type !== Comment || child.children === "v-if") {
- if (singleRoot) {
- return;
- } else {
- singleRoot = child;
- if (recurse && singleRoot.patchFlag > 0 && singleRoot.patchFlag & 2048) {
- return filterSingleRoot(singleRoot.children);
- }
- }
- }
- } else {
- return;
- }
- }
- return singleRoot;
-}
-var getFunctionalFallthrough = (attrs) => {
- let res;
- for (const key in attrs) {
- if (key === "class" || key === "style" || isOn(key)) {
- (res || (res = {}))[key] = attrs[key];
- }
- }
- return res;
-};
-var filterModelListeners = (attrs, props) => {
- const res = {};
- for (const key in attrs) {
- if (!isModelListener(key) || !(key.slice(9) in props)) {
- res[key] = attrs[key];
- }
- }
- return res;
-};
-var isElementRoot = (vnode) => {
- return vnode.shapeFlag & (6 | 1) || vnode.type === Comment;
-};
-function shouldUpdateComponent(prevVNode, nextVNode, optimized) {
- const { props: prevProps, children: prevChildren, component } = prevVNode;
- const { props: nextProps, children: nextChildren, patchFlag } = nextVNode;
- const emits = component.emitsOptions;
- if ((prevChildren || nextChildren) && isHmrUpdating) {
- return true;
- }
- if (nextVNode.dirs || nextVNode.transition) {
- return true;
- }
- if (optimized && patchFlag >= 0) {
- if (patchFlag & 1024) {
- return true;
- }
- if (patchFlag & 16) {
- if (!prevProps) {
- return !!nextProps;
- }
- return hasPropsChanged(prevProps, nextProps, emits);
- } else if (patchFlag & 8) {
- const dynamicProps = nextVNode.dynamicProps;
- for (let i = 0; i < dynamicProps.length; i++) {
- const key = dynamicProps[i];
- if (nextProps[key] !== prevProps[key] && !isEmitListener(emits, key)) {
- return true;
- }
- }
- }
- } else {
- if (prevChildren || nextChildren) {
- if (!nextChildren || !nextChildren.$stable) {
- return true;
- }
- }
- if (prevProps === nextProps) {
- return false;
- }
- if (!prevProps) {
- return !!nextProps;
- }
- if (!nextProps) {
- return true;
- }
- return hasPropsChanged(prevProps, nextProps, emits);
- }
- return false;
-}
-function hasPropsChanged(prevProps, nextProps, emitsOptions) {
- const nextKeys = Object.keys(nextProps);
- if (nextKeys.length !== Object.keys(prevProps).length) {
- return true;
- }
- for (let i = 0; i < nextKeys.length; i++) {
- const key = nextKeys[i];
- if (nextProps[key] !== prevProps[key] && !isEmitListener(emitsOptions, key)) {
- return true;
- }
- }
- return false;
-}
-function updateHOCHostEl({ vnode, parent }, el) {
- while (parent) {
- const root = parent.subTree;
- if (root.suspense && root.suspense.activeBranch === vnode) {
- root.el = vnode.el;
- }
- if (root === vnode) {
- (vnode = parent.vnode).el = el;
- parent = parent.parent;
- } else {
- break;
- }
- }
-}
-var COMPONENTS = "components";
-var DIRECTIVES = "directives";
-function resolveComponent(name, maybeSelfReference) {
- return resolveAsset(COMPONENTS, name, true, maybeSelfReference) || name;
-}
-var NULL_DYNAMIC_COMPONENT = Symbol.for("v-ndc");
-function resolveDynamicComponent(component) {
- if (isString(component)) {
- return resolveAsset(COMPONENTS, component, false) || component;
- } else {
- return component || NULL_DYNAMIC_COMPONENT;
- }
-}
-function resolveDirective(name) {
- return resolveAsset(DIRECTIVES, name);
-}
-function resolveAsset(type, name, warnMissing = true, maybeSelfReference = false) {
- const instance = currentRenderingInstance || currentInstance;
- if (instance) {
- const Component = instance.type;
- if (type === COMPONENTS) {
- const selfName = getComponentName(
- Component,
- false
- );
- if (selfName && (selfName === name || selfName === camelize(name) || selfName === capitalize(camelize(name)))) {
- return Component;
- }
- }
- const res = (
- // local registration
- // check instance[type] first which is resolved for options API
- resolve(instance[type] || Component[type], name) || // global registration
- resolve(instance.appContext[type], name)
- );
- if (!res && maybeSelfReference) {
- return Component;
- }
- if (warnMissing && !res) {
- const extra = type === COMPONENTS ? `
-If this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement.` : ``;
- warn$1(`Failed to resolve ${type.slice(0, -1)}: ${name}${extra}`);
- }
- return res;
- } else if (true) {
- warn$1(
- `resolve${capitalize(type.slice(0, -1))} can only be used in render() or setup().`
- );
- }
-}
-function resolve(registry, name) {
- return registry && (registry[name] || registry[camelize(name)] || registry[capitalize(camelize(name))]);
-}
-var isSuspense = (type) => type.__isSuspense;
-var suspenseId = 0;
-var SuspenseImpl = {
- name: "Suspense",
- // In order to make Suspense tree-shakable, we need to avoid importing it
- // directly in the renderer. The renderer checks for the __isSuspense flag
- // on a vnode's type and calls the `process` method, passing in renderer
- // internals.
- __isSuspense: true,
- process(n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, rendererInternals) {
- if (n1 == null) {
- mountSuspense(
- n2,
- container,
- anchor,
- parentComponent,
- parentSuspense,
- namespace,
- slotScopeIds,
- optimized,
- rendererInternals
- );
- } else {
- if (parentSuspense && parentSuspense.deps > 0 && !n1.suspense.isInFallback) {
- n2.suspense = n1.suspense;
- n2.suspense.vnode = n2;
- n2.el = n1.el;
- return;
- }
- patchSuspense(
- n1,
- n2,
- container,
- anchor,
- parentComponent,
- namespace,
- slotScopeIds,
- optimized,
- rendererInternals
- );
- }
- },
- hydrate: hydrateSuspense,
- normalize: normalizeSuspenseChildren
-};
-var Suspense = SuspenseImpl;
-function triggerEvent(vnode, name) {
- const eventListener = vnode.props && vnode.props[name];
- if (isFunction(eventListener)) {
- eventListener();
- }
-}
-function mountSuspense(vnode, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, rendererInternals) {
- const {
- p: patch,
- o: { createElement }
- } = rendererInternals;
- const hiddenContainer = createElement("div");
- const suspense = vnode.suspense = createSuspenseBoundary(
- vnode,
- parentSuspense,
- parentComponent,
- container,
- hiddenContainer,
- anchor,
- namespace,
- slotScopeIds,
- optimized,
- rendererInternals
- );
- patch(
- null,
- suspense.pendingBranch = vnode.ssContent,
- hiddenContainer,
- null,
- parentComponent,
- suspense,
- namespace,
- slotScopeIds
- );
- if (suspense.deps > 0) {
- triggerEvent(vnode, "onPending");
- triggerEvent(vnode, "onFallback");
- patch(
- null,
- vnode.ssFallback,
- container,
- anchor,
- parentComponent,
- null,
- // fallback tree will not have suspense context
- namespace,
- slotScopeIds
- );
- setActiveBranch(suspense, vnode.ssFallback);
- } else {
- suspense.resolve(false, true);
- }
-}
-function patchSuspense(n1, n2, container, anchor, parentComponent, namespace, slotScopeIds, optimized, { p: patch, um: unmount, o: { createElement } }) {
- const suspense = n2.suspense = n1.suspense;
- suspense.vnode = n2;
- n2.el = n1.el;
- const newBranch = n2.ssContent;
- const newFallback = n2.ssFallback;
- const { activeBranch, pendingBranch, isInFallback, isHydrating } = suspense;
- if (pendingBranch) {
- suspense.pendingBranch = newBranch;
- if (isSameVNodeType(newBranch, pendingBranch)) {
- patch(
- pendingBranch,
- newBranch,
- suspense.hiddenContainer,
- null,
- parentComponent,
- suspense,
- namespace,
- slotScopeIds,
- optimized
- );
- if (suspense.deps <= 0) {
- suspense.resolve();
- } else if (isInFallback) {
- if (!isHydrating) {
- patch(
- activeBranch,
- newFallback,
- container,
- anchor,
- parentComponent,
- null,
- // fallback tree will not have suspense context
- namespace,
- slotScopeIds,
- optimized
- );
- setActiveBranch(suspense, newFallback);
- }
- }
- } else {
- suspense.pendingId = suspenseId++;
- if (isHydrating) {
- suspense.isHydrating = false;
- suspense.activeBranch = pendingBranch;
- } else {
- unmount(pendingBranch, parentComponent, suspense);
- }
- suspense.deps = 0;
- suspense.effects.length = 0;
- suspense.hiddenContainer = createElement("div");
- if (isInFallback) {
- patch(
- null,
- newBranch,
- suspense.hiddenContainer,
- null,
- parentComponent,
- suspense,
- namespace,
- slotScopeIds,
- optimized
- );
- if (suspense.deps <= 0) {
- suspense.resolve();
- } else {
- patch(
- activeBranch,
- newFallback,
- container,
- anchor,
- parentComponent,
- null,
- // fallback tree will not have suspense context
- namespace,
- slotScopeIds,
- optimized
- );
- setActiveBranch(suspense, newFallback);
- }
- } else if (activeBranch && isSameVNodeType(newBranch, activeBranch)) {
- patch(
- activeBranch,
- newBranch,
- container,
- anchor,
- parentComponent,
- suspense,
- namespace,
- slotScopeIds,
- optimized
- );
- suspense.resolve(true);
- } else {
- patch(
- null,
- newBranch,
- suspense.hiddenContainer,
- null,
- parentComponent,
- suspense,
- namespace,
- slotScopeIds,
- optimized
- );
- if (suspense.deps <= 0) {
- suspense.resolve();
- }
- }
- }
- } else {
- if (activeBranch && isSameVNodeType(newBranch, activeBranch)) {
- patch(
- activeBranch,
- newBranch,
- container,
- anchor,
- parentComponent,
- suspense,
- namespace,
- slotScopeIds,
- optimized
- );
- setActiveBranch(suspense, newBranch);
- } else {
- triggerEvent(n2, "onPending");
- suspense.pendingBranch = newBranch;
- if (newBranch.shapeFlag & 512) {
- suspense.pendingId = newBranch.component.suspenseId;
- } else {
- suspense.pendingId = suspenseId++;
- }
- patch(
- null,
- newBranch,
- suspense.hiddenContainer,
- null,
- parentComponent,
- suspense,
- namespace,
- slotScopeIds,
- optimized
- );
- if (suspense.deps <= 0) {
- suspense.resolve();
- } else {
- const { timeout, pendingId } = suspense;
- if (timeout > 0) {
- setTimeout(() => {
- if (suspense.pendingId === pendingId) {
- suspense.fallback(newFallback);
- }
- }, timeout);
- } else if (timeout === 0) {
- suspense.fallback(newFallback);
- }
- }
- }
- }
-}
-var hasWarned = false;
-function createSuspenseBoundary(vnode, parentSuspense, parentComponent, container, hiddenContainer, anchor, namespace, slotScopeIds, optimized, rendererInternals, isHydrating = false) {
- if (!hasWarned) {
- hasWarned = true;
- console[console.info ? "info" : "log"](
- ` is an experimental feature and its API will likely change.`
- );
- }
- const {
- p: patch,
- m: move,
- um: unmount,
- n: next,
- o: { parentNode, remove: remove2 }
- } = rendererInternals;
- let parentSuspenseId;
- const isSuspensible = isVNodeSuspensible(vnode);
- if (isSuspensible) {
- if (parentSuspense && parentSuspense.pendingBranch) {
- parentSuspenseId = parentSuspense.pendingId;
- parentSuspense.deps++;
- }
- }
- const timeout = vnode.props ? toNumber(vnode.props.timeout) : void 0;
- if (true) {
- assertNumber(timeout, `Suspense timeout`);
- }
- const initialAnchor = anchor;
- const suspense = {
- vnode,
- parent: parentSuspense,
- parentComponent,
- namespace,
- container,
- hiddenContainer,
- deps: 0,
- pendingId: suspenseId++,
- timeout: typeof timeout === "number" ? timeout : -1,
- activeBranch: null,
- pendingBranch: null,
- isInFallback: !isHydrating,
- isHydrating,
- isUnmounted: false,
- effects: [],
- resolve(resume = false, sync = false) {
- if (true) {
- if (!resume && !suspense.pendingBranch) {
- throw new Error(
- `suspense.resolve() is called without a pending branch.`
- );
- }
- if (suspense.isUnmounted) {
- throw new Error(
- `suspense.resolve() is called on an already unmounted suspense boundary.`
- );
- }
- }
- const {
- vnode: vnode2,
- activeBranch,
- pendingBranch,
- pendingId,
- effects,
- parentComponent: parentComponent2,
- container: container2
- } = suspense;
- let delayEnter = false;
- if (suspense.isHydrating) {
- suspense.isHydrating = false;
- } else if (!resume) {
- delayEnter = activeBranch && pendingBranch.transition && pendingBranch.transition.mode === "out-in";
- if (delayEnter) {
- activeBranch.transition.afterLeave = () => {
- if (pendingId === suspense.pendingId) {
- move(
- pendingBranch,
- container2,
- anchor === initialAnchor ? next(activeBranch) : anchor,
- 0
- );
- queuePostFlushCb(effects);
- }
- };
- }
- if (activeBranch) {
- if (parentNode(activeBranch.el) !== suspense.hiddenContainer) {
- anchor = next(activeBranch);
- }
- unmount(activeBranch, parentComponent2, suspense, true);
- }
- if (!delayEnter) {
- move(pendingBranch, container2, anchor, 0);
- }
- }
- setActiveBranch(suspense, pendingBranch);
- suspense.pendingBranch = null;
- suspense.isInFallback = false;
- let parent = suspense.parent;
- let hasUnresolvedAncestor = false;
- while (parent) {
- if (parent.pendingBranch) {
- parent.effects.push(...effects);
- hasUnresolvedAncestor = true;
- break;
- }
- parent = parent.parent;
- }
- if (!hasUnresolvedAncestor && !delayEnter) {
- queuePostFlushCb(effects);
- }
- suspense.effects = [];
- if (isSuspensible) {
- if (parentSuspense && parentSuspense.pendingBranch && parentSuspenseId === parentSuspense.pendingId) {
- parentSuspense.deps--;
- if (parentSuspense.deps === 0 && !sync) {
- parentSuspense.resolve();
- }
- }
- }
- triggerEvent(vnode2, "onResolve");
- },
- fallback(fallbackVNode) {
- if (!suspense.pendingBranch) {
- return;
- }
- const { vnode: vnode2, activeBranch, parentComponent: parentComponent2, container: container2, namespace: namespace2 } = suspense;
- triggerEvent(vnode2, "onFallback");
- const anchor2 = next(activeBranch);
- const mountFallback = () => {
- if (!suspense.isInFallback) {
- return;
- }
- patch(
- null,
- fallbackVNode,
- container2,
- anchor2,
- parentComponent2,
- null,
- // fallback tree will not have suspense context
- namespace2,
- slotScopeIds,
- optimized
- );
- setActiveBranch(suspense, fallbackVNode);
- };
- const delayEnter = fallbackVNode.transition && fallbackVNode.transition.mode === "out-in";
- if (delayEnter) {
- activeBranch.transition.afterLeave = mountFallback;
- }
- suspense.isInFallback = true;
- unmount(
- activeBranch,
- parentComponent2,
- null,
- // no suspense so unmount hooks fire now
- true
- // shouldRemove
- );
- if (!delayEnter) {
- mountFallback();
- }
- },
- move(container2, anchor2, type) {
- suspense.activeBranch && move(suspense.activeBranch, container2, anchor2, type);
- suspense.container = container2;
- },
- next() {
- return suspense.activeBranch && next(suspense.activeBranch);
- },
- registerDep(instance, setupRenderEffect, optimized2) {
- const isInPendingSuspense = !!suspense.pendingBranch;
- if (isInPendingSuspense) {
- suspense.deps++;
- }
- const hydratedEl = instance.vnode.el;
- instance.asyncDep.catch((err) => {
- handleError(err, instance, 0);
- }).then((asyncSetupResult) => {
- if (instance.isUnmounted || suspense.isUnmounted || suspense.pendingId !== instance.suspenseId) {
- return;
- }
- instance.asyncResolved = true;
- const { vnode: vnode2 } = instance;
- if (true) {
- pushWarningContext(vnode2);
- }
- handleSetupResult(instance, asyncSetupResult, false);
- if (hydratedEl) {
- vnode2.el = hydratedEl;
- }
- const placeholder = !hydratedEl && instance.subTree.el;
- setupRenderEffect(
- instance,
- vnode2,
- // component may have been moved before resolve.
- // if this is not a hydration, instance.subTree will be the comment
- // placeholder.
- parentNode(hydratedEl || instance.subTree.el),
- // anchor will not be used if this is hydration, so only need to
- // consider the comment placeholder case.
- hydratedEl ? null : next(instance.subTree),
- suspense,
- namespace,
- optimized2
- );
- if (placeholder) {
- remove2(placeholder);
- }
- updateHOCHostEl(instance, vnode2.el);
- if (true) {
- popWarningContext();
- }
- if (isInPendingSuspense && --suspense.deps === 0) {
- suspense.resolve();
- }
- });
- },
- unmount(parentSuspense2, doRemove) {
- suspense.isUnmounted = true;
- if (suspense.activeBranch) {
- unmount(
- suspense.activeBranch,
- parentComponent,
- parentSuspense2,
- doRemove
- );
- }
- if (suspense.pendingBranch) {
- unmount(
- suspense.pendingBranch,
- parentComponent,
- parentSuspense2,
- doRemove
- );
- }
- }
- };
- return suspense;
-}
-function hydrateSuspense(node, vnode, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, rendererInternals, hydrateNode) {
- const suspense = vnode.suspense = createSuspenseBoundary(
- vnode,
- parentSuspense,
- parentComponent,
- node.parentNode,
- // eslint-disable-next-line no-restricted-globals
- document.createElement("div"),
- null,
- namespace,
- slotScopeIds,
- optimized,
- rendererInternals,
- true
- );
- const result = hydrateNode(
- node,
- suspense.pendingBranch = vnode.ssContent,
- parentComponent,
- suspense,
- slotScopeIds,
- optimized
- );
- if (suspense.deps === 0) {
- suspense.resolve(false, true);
- }
- return result;
-}
-function normalizeSuspenseChildren(vnode) {
- const { shapeFlag, children } = vnode;
- const isSlotChildren = shapeFlag & 32;
- vnode.ssContent = normalizeSuspenseSlot(
- isSlotChildren ? children.default : children
- );
- vnode.ssFallback = isSlotChildren ? normalizeSuspenseSlot(children.fallback) : createVNode(Comment);
-}
-function normalizeSuspenseSlot(s) {
- let block;
- if (isFunction(s)) {
- const trackBlock = isBlockTreeEnabled && s._c;
- if (trackBlock) {
- s._d = false;
- openBlock();
- }
- s = s();
- if (trackBlock) {
- s._d = true;
- block = currentBlock;
- closeBlock();
- }
- }
- if (isArray(s)) {
- const singleChild = filterSingleRoot(s);
- if (!singleChild && s.filter((child) => child !== NULL_DYNAMIC_COMPONENT).length > 0) {
- warn$1(` slots expect a single root node.`);
- }
- s = singleChild;
- }
- s = normalizeVNode(s);
- if (block && !s.dynamicChildren) {
- s.dynamicChildren = block.filter((c) => c !== s);
- }
- return s;
-}
-function queueEffectWithSuspense(fn, suspense) {
- if (suspense && suspense.pendingBranch) {
- if (isArray(fn)) {
- suspense.effects.push(...fn);
- } else {
- suspense.effects.push(fn);
- }
- } else {
- queuePostFlushCb(fn);
- }
-}
-function setActiveBranch(suspense, branch) {
- suspense.activeBranch = branch;
- const { vnode, parentComponent } = suspense;
- let el = branch.el;
- while (!el && branch.component) {
- branch = branch.component.subTree;
- el = branch.el;
- }
- vnode.el = el;
- if (parentComponent && parentComponent.subTree === vnode) {
- parentComponent.vnode.el = el;
- updateHOCHostEl(parentComponent, el);
- }
-}
-function isVNodeSuspensible(vnode) {
- const suspensible = vnode.props && vnode.props.suspensible;
- return suspensible != null && suspensible !== false;
-}
-function injectHook(type, hook, target = currentInstance, prepend = false) {
- if (target) {
- const hooks = target[type] || (target[type] = []);
- const wrappedHook = hook.__weh || (hook.__weh = (...args) => {
- pauseTracking();
- const reset = setCurrentInstance(target);
- const res = callWithAsyncErrorHandling(hook, target, type, args);
- reset();
- resetTracking();
- return res;
- });
- if (prepend) {
- hooks.unshift(wrappedHook);
- } else {
- hooks.push(wrappedHook);
- }
- return wrappedHook;
- } else if (true) {
- const apiName = toHandlerKey(ErrorTypeStrings$1[type].replace(/ hook$/, ""));
- warn$1(
- `${apiName} is called when there is no active component instance to be associated with. Lifecycle injection APIs can only be used during execution of setup(). If you are using async setup(), make sure to register lifecycle hooks before the first await statement.`
- );
- }
-}
-var createHook = (lifecycle) => (hook, target = currentInstance) => {
- if (!isInSSRComponentSetup || lifecycle === "sp") {
- injectHook(lifecycle, (...args) => hook(...args), target);
- }
-};
-var onBeforeMount = createHook("bm");
-var onMounted = createHook("m");
-var onBeforeUpdate = createHook("bu");
-var onUpdated = createHook("u");
-var onBeforeUnmount = createHook("bum");
-var onUnmounted = createHook("um");
-var onServerPrefetch = createHook("sp");
-var onRenderTriggered = createHook(
- "rtg"
-);
-var onRenderTracked = createHook(
- "rtc"
-);
-function onErrorCaptured(hook, target = currentInstance) {
- injectHook("ec", hook, target);
-}
-function validateDirectiveName(name) {
- if (isBuiltInDirective(name)) {
- warn$1("Do not use built-in directive ids as custom directive id: " + name);
- }
-}
-function withDirectives(vnode, directives) {
- if (currentRenderingInstance === null) {
- warn$1(`withDirectives can only be used inside render functions.`);
- return vnode;
- }
- const instance = getComponentPublicInstance(currentRenderingInstance);
- const bindings = vnode.dirs || (vnode.dirs = []);
- for (let i = 0; i < directives.length; i++) {
- let [dir, value, arg, modifiers = EMPTY_OBJ] = directives[i];
- if (dir) {
- if (isFunction(dir)) {
- dir = {
- mounted: dir,
- updated: dir
- };
- }
- if (dir.deep) {
- traverse(value);
- }
- bindings.push({
- dir,
- instance,
- value,
- oldValue: void 0,
- arg,
- modifiers
- });
- }
- }
- return vnode;
-}
-function invokeDirectiveHook(vnode, prevVNode, instance, name) {
- const bindings = vnode.dirs;
- const oldBindings = prevVNode && prevVNode.dirs;
- for (let i = 0; i < bindings.length; i++) {
- const binding = bindings[i];
- if (oldBindings) {
- binding.oldValue = oldBindings[i].value;
- }
- let hook = binding.dir[name];
- if (hook) {
- pauseTracking();
- callWithAsyncErrorHandling(hook, instance, 8, [
- vnode.el,
- binding,
- vnode,
- prevVNode
- ]);
- resetTracking();
- }
- }
-}
-function renderList(source, renderItem, cache, index) {
- let ret;
- const cached = cache && cache[index];
- if (isArray(source) || isString(source)) {
- ret = new Array(source.length);
- for (let i = 0, l = source.length; i < l; i++) {
- ret[i] = renderItem(source[i], i, void 0, cached && cached[i]);
- }
- } else if (typeof source === "number") {
- if (!Number.isInteger(source)) {
- warn$1(`The v-for range expect an integer value but got ${source}.`);
- }
- ret = new Array(source);
- for (let i = 0; i < source; i++) {
- ret[i] = renderItem(i + 1, i, void 0, cached && cached[i]);
- }
- } else if (isObject(source)) {
- if (source[Symbol.iterator]) {
- ret = Array.from(
- source,
- (item, i) => renderItem(item, i, void 0, cached && cached[i])
- );
- } else {
- const keys = Object.keys(source);
- ret = new Array(keys.length);
- for (let i = 0, l = keys.length; i < l; i++) {
- const key = keys[i];
- ret[i] = renderItem(source[key], key, i, cached && cached[i]);
- }
- }
- } else {
- ret = [];
- }
- if (cache) {
- cache[index] = ret;
- }
- return ret;
-}
-function createSlots(slots, dynamicSlots) {
- for (let i = 0; i < dynamicSlots.length; i++) {
- const slot = dynamicSlots[i];
- if (isArray(slot)) {
- for (let j = 0; j < slot.length; j++) {
- slots[slot[j].name] = slot[j].fn;
- }
- } else if (slot) {
- slots[slot.name] = slot.key ? (...args) => {
- const res = slot.fn(...args);
- if (res) res.key = slot.key;
- return res;
- } : slot.fn;
- }
- }
- return slots;
-}
-function defineComponent(options, extraOptions) {
- return isFunction(options) ? (
- // #8326: extend call and options.name access are considered side-effects
- // by Rollup, so we have to wrap it in a pure-annotated IIFE.
- (() => extend({ name: options.name }, extraOptions, { setup: options }))()
- ) : options;
-}
-var isAsyncWrapper = (i) => !!i.type.__asyncLoader;
-function defineAsyncComponent(source) {
- if (isFunction(source)) {
- source = { loader: source };
- }
- const {
- loader,
- loadingComponent,
- errorComponent,
- delay = 200,
- timeout,
- // undefined = never times out
- suspensible = true,
- onError: userOnError
- } = source;
- let pendingRequest = null;
- let resolvedComp;
- let retries = 0;
- const retry = () => {
- retries++;
- pendingRequest = null;
- return load();
- };
- const load = () => {
- let thisRequest;
- return pendingRequest || (thisRequest = pendingRequest = loader().catch((err) => {
- err = err instanceof Error ? err : new Error(String(err));
- if (userOnError) {
- return new Promise((resolve2, reject) => {
- const userRetry = () => resolve2(retry());
- const userFail = () => reject(err);
- userOnError(err, userRetry, userFail, retries + 1);
- });
- } else {
- throw err;
- }
- }).then((comp) => {
- if (thisRequest !== pendingRequest && pendingRequest) {
- return pendingRequest;
- }
- if (!comp) {
- warn$1(
- `Async component loader resolved to undefined. If you are using retry(), make sure to return its return value.`
- );
- }
- if (comp && (comp.__esModule || comp[Symbol.toStringTag] === "Module")) {
- comp = comp.default;
- }
- if (comp && !isObject(comp) && !isFunction(comp)) {
- throw new Error(`Invalid async component load result: ${comp}`);
- }
- resolvedComp = comp;
- return comp;
- }));
- };
- return defineComponent({
- name: "AsyncComponentWrapper",
- __asyncLoader: load,
- get __asyncResolved() {
- return resolvedComp;
- },
- setup() {
- const instance = currentInstance;
- if (resolvedComp) {
- return () => createInnerComp(resolvedComp, instance);
- }
- const onError = (err) => {
- pendingRequest = null;
- handleError(
- err,
- instance,
- 13,
- !errorComponent
- );
- };
- if (suspensible && instance.suspense || isInSSRComponentSetup) {
- return load().then((comp) => {
- return () => createInnerComp(comp, instance);
- }).catch((err) => {
- onError(err);
- return () => errorComponent ? createVNode(errorComponent, {
- error: err
- }) : null;
- });
- }
- const loaded = ref(false);
- const error = ref();
- const delayed = ref(!!delay);
- if (delay) {
- setTimeout(() => {
- delayed.value = false;
- }, delay);
- }
- if (timeout != null) {
- setTimeout(() => {
- if (!loaded.value && !error.value) {
- const err = new Error(
- `Async component timed out after ${timeout}ms.`
- );
- onError(err);
- error.value = err;
- }
- }, timeout);
- }
- load().then(() => {
- loaded.value = true;
- if (instance.parent && isKeepAlive(instance.parent.vnode)) {
- instance.parent.effect.dirty = true;
- queueJob(instance.parent.update);
- }
- }).catch((err) => {
- onError(err);
- error.value = err;
- });
- return () => {
- if (loaded.value && resolvedComp) {
- return createInnerComp(resolvedComp, instance);
- } else if (error.value && errorComponent) {
- return createVNode(errorComponent, {
- error: error.value
- });
- } else if (loadingComponent && !delayed.value) {
- return createVNode(loadingComponent);
- }
- };
- }
- });
-}
-function createInnerComp(comp, parent) {
- const { ref: ref2, props, children, ce } = parent.vnode;
- const vnode = createVNode(comp, props, children);
- vnode.ref = ref2;
- vnode.ce = ce;
- delete parent.vnode.ce;
- return vnode;
-}
-function renderSlot(slots, name, props = {}, fallback, noSlotted) {
- if (currentRenderingInstance.isCE || currentRenderingInstance.parent && isAsyncWrapper(currentRenderingInstance.parent) && currentRenderingInstance.parent.isCE) {
- if (name !== "default") props.name = name;
- return createVNode("slot", props, fallback && fallback());
- }
- let slot = slots[name];
- if (slot && slot.length > 1) {
- warn$1(
- `SSR-optimized slot function detected in a non-SSR-optimized render function. You need to mark this component with $dynamic-slots in the parent template.`
- );
- slot = () => [];
- }
- if (slot && slot._c) {
- slot._d = false;
- }
- openBlock();
- const validSlotContent = slot && ensureValidVNode(slot(props));
- const rendered = createBlock(
- Fragment,
- {
- key: props.key || // slot content array of a dynamic conditional slot may have a branch
- // key attached in the `createSlots` helper, respect that
- validSlotContent && validSlotContent.key || `_${name}`
- },
- validSlotContent || (fallback ? fallback() : []),
- validSlotContent && slots._ === 1 ? 64 : -2
- );
- if (!noSlotted && rendered.scopeId) {
- rendered.slotScopeIds = [rendered.scopeId + "-s"];
- }
- if (slot && slot._c) {
- slot._d = true;
- }
- return rendered;
-}
-function ensureValidVNode(vnodes) {
- return vnodes.some((child) => {
- if (!isVNode(child)) return true;
- if (child.type === Comment) return false;
- if (child.type === Fragment && !ensureValidVNode(child.children))
- return false;
- return true;
- }) ? vnodes : null;
-}
-function toHandlers(obj, preserveCaseIfNecessary) {
- const ret = {};
- if (!isObject(obj)) {
- warn$1(`v-on with no argument expects an object value.`);
- return ret;
- }
- for (const key in obj) {
- ret[preserveCaseIfNecessary && /[A-Z]/.test(key) ? `on:${key}` : toHandlerKey(key)] = obj[key];
- }
- return ret;
-}
-var getPublicInstance = (i) => {
- if (!i) return null;
- if (isStatefulComponent(i)) return getComponentPublicInstance(i);
- return getPublicInstance(i.parent);
-};
-var publicPropertiesMap = (
- // Move PURE marker to new line to workaround compiler discarding it
- // due to type annotation
- extend(/* @__PURE__ */ Object.create(null), {
- $: (i) => i,
- $el: (i) => i.vnode.el,
- $data: (i) => i.data,
- $props: (i) => true ? shallowReadonly(i.props) : i.props,
- $attrs: (i) => true ? shallowReadonly(i.attrs) : i.attrs,
- $slots: (i) => true ? shallowReadonly(i.slots) : i.slots,
- $refs: (i) => true ? shallowReadonly(i.refs) : i.refs,
- $parent: (i) => getPublicInstance(i.parent),
- $root: (i) => getPublicInstance(i.root),
- $emit: (i) => i.emit,
- $options: (i) => __VUE_OPTIONS_API__ ? resolveMergedOptions(i) : i.type,
- $forceUpdate: (i) => i.f || (i.f = () => {
- i.effect.dirty = true;
- queueJob(i.update);
- }),
- $nextTick: (i) => i.n || (i.n = nextTick.bind(i.proxy)),
- $watch: (i) => __VUE_OPTIONS_API__ ? instanceWatch.bind(i) : NOOP
- })
-);
-var isReservedPrefix = (key) => key === "_" || key === "$";
-var hasSetupBinding = (state, key) => state !== EMPTY_OBJ && !state.__isScriptSetup && hasOwn(state, key);
-var PublicInstanceProxyHandlers = {
- get({ _: instance }, key) {
- if (key === "__v_skip") {
- return true;
- }
- const { ctx, setupState, data, props, accessCache, type, appContext } = instance;
- if (key === "__isVue") {
- return true;
- }
- let normalizedProps;
- if (key[0] !== "$") {
- const n = accessCache[key];
- if (n !== void 0) {
- switch (n) {
- case 1:
- return setupState[key];
- case 2:
- return data[key];
- case 4:
- return ctx[key];
- case 3:
- return props[key];
- }
- } else if (hasSetupBinding(setupState, key)) {
- accessCache[key] = 1;
- return setupState[key];
- } else if (data !== EMPTY_OBJ && hasOwn(data, key)) {
- accessCache[key] = 2;
- return data[key];
- } else if (
- // only cache other properties when instance has declared (thus stable)
- // props
- (normalizedProps = instance.propsOptions[0]) && hasOwn(normalizedProps, key)
- ) {
- accessCache[key] = 3;
- return props[key];
- } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {
- accessCache[key] = 4;
- return ctx[key];
- } else if (!__VUE_OPTIONS_API__ || shouldCacheAccess) {
- accessCache[key] = 0;
- }
- }
- const publicGetter = publicPropertiesMap[key];
- let cssModule, globalProperties;
- if (publicGetter) {
- if (key === "$attrs") {
- track(instance.attrs, "get", "");
- markAttrsAccessed();
- } else if (key === "$slots") {
- track(instance, "get", key);
- }
- return publicGetter(instance);
- } else if (
- // css module (injected by vue-loader)
- (cssModule = type.__cssModules) && (cssModule = cssModule[key])
- ) {
- return cssModule;
- } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {
- accessCache[key] = 4;
- return ctx[key];
- } else if (
- // global properties
- globalProperties = appContext.config.globalProperties, hasOwn(globalProperties, key)
- ) {
- {
- return globalProperties[key];
- }
- } else if (currentRenderingInstance && (!isString(key) || // #1091 avoid internal isRef/isVNode checks on component instance leading
- // to infinite warning loop
- key.indexOf("__v") !== 0)) {
- if (data !== EMPTY_OBJ && isReservedPrefix(key[0]) && hasOwn(data, key)) {
- warn$1(
- `Property ${JSON.stringify(
- key
- )} must be accessed via $data because it starts with a reserved character ("$" or "_") and is not proxied on the render context.`
- );
- } else if (instance === currentRenderingInstance) {
- warn$1(
- `Property ${JSON.stringify(key)} was accessed during render but is not defined on instance.`
- );
- }
- }
- },
- set({ _: instance }, key, value) {
- const { data, setupState, ctx } = instance;
- if (hasSetupBinding(setupState, key)) {
- setupState[key] = value;
- return true;
- } else if (setupState.__isScriptSetup && hasOwn(setupState, key)) {
- warn$1(`Cannot mutate