diff --git a/docs/.vuepress/client.ts b/docs/.vuepress/client.ts new file mode 100644 index 0000000..61a1d1a --- /dev/null +++ b/docs/.vuepress/client.ts @@ -0,0 +1,7 @@ +import { defineClientConfig } from '@vuepress/client'; + +export default defineClientConfig({ + enhance({ app, router, siteData }) {}, + setup() {}, + rootComponents: [], +}); diff --git a/docs/.vuepress/config.ts b/docs/.vuepress/config.ts new file mode 100644 index 0000000..1419922 --- /dev/null +++ b/docs/.vuepress/config.ts @@ -0,0 +1,45 @@ +import { defaultTheme, defineUserConfig } from 'vuepress'; +import { searchPlugin } from '@vuepress/plugin-search'; +import { shikiPlugin } from '@vuepress/plugin-shiki'; +import markdownItFootnote from 'markdown-it-footnote'; +import { navbarEn } from './config/navbar/en'; +import { sidebarEn } from './config/sidebar/en'; +import { head } from './config/head'; + +export default defineUserConfig({ + base: '/', + head, + locales: { + '/': { + lang: 'en-US', + title: 'zProtect Documentation', + description: 'Documentation for all things zProtect.', + } + }, + theme: defaultTheme({ + contributors: false, + docsRepo: 'https://github.com/zProtect-Development/Documentation', + docsBranch: 'main', + docsDir: 'docs', + editLink: true, + editLinkPattern: ':repo/edit/:branch/:path', + lastUpdated: true, + logo: '/logo.png', + locales: { + '/': { + sidebar: sidebarEn, + navbar: navbarEn, + }, + } + }), + plugins: [ + searchPlugin({ + }), + shikiPlugin({ + theme: 'dark-plus', + }), + ], + extendsMarkdown: (md) => { + md.use(markdownItFootnote) + } +}); diff --git a/docs/.vuepress/config/head.ts b/docs/.vuepress/config/head.ts new file mode 100644 index 0000000..dd6ff45 --- /dev/null +++ b/docs/.vuepress/config/head.ts @@ -0,0 +1,27 @@ +import type { HeadConfig } from '@vuepress/core'; + +export const head: HeadConfig[] = [ + [ + 'link', + { + rel: 'icon', + type: 'image/png', + sizes: '16x16', + href: `/favicon-16.png`, + }, + ], + [ + 'link', + { + rel: 'icon', + type: 'image/png', + sizes: '32x32', + href: `/favicon-32.png`, + }, + ], + ['meta', { name: 'theme-color', content: '#936edb' }], + ['meta', { name: 'og:title', content: 'zProtect Documentation' }], + ['meta', { name: 'og:type', content: 'website' }], + ['meta', { name: 'og:image', content: '/og.png' }], + ['meta', { name: 'og:url', content: 'https://docs.zprotect.dev/' }], +] \ No newline at end of file diff --git a/docs/.vuepress/config/navbar/en.ts b/docs/.vuepress/config/navbar/en.ts new file mode 100644 index 0000000..e368833 --- /dev/null +++ b/docs/.vuepress/config/navbar/en.ts @@ -0,0 +1,9 @@ +import type { NavbarConfig } from 'vuepress'; + +export const navbarEn: NavbarConfig = [ + { + text: 'Return to zProtect.dev', + link: 'https://zprotect.dev', + target: '_self', + }, +]; diff --git a/docs/.vuepress/config/sidebar/en.ts b/docs/.vuepress/config/sidebar/en.ts new file mode 100644 index 0000000..d2d2513 --- /dev/null +++ b/docs/.vuepress/config/sidebar/en.ts @@ -0,0 +1,28 @@ +import type { SidebarConfig } from '@vuepress/theme-default' + +export const sidebarEn: SidebarConfig = { + '/': [ + { + text: 'Documentation', + children: [ + '/index.md', + '/config.md', + '/commandline.md', + ], + }, + { + text: 'Changelog', + children: [ + '/changelog/0.2.md', + '/changelog/0.1.md', + ], + }, + { + text: 'Legal', + children: [ + '/privacy.md', + '/terms.md', + ], + }, + ], +}; diff --git a/docs/.vuepress/dist/404.html b/docs/.vuepress/dist/404.html new file mode 100644 index 0000000..7f656b7 --- /dev/null +++ b/docs/.vuepress/dist/404.html @@ -0,0 +1,33 @@ + + + + + + + + + zProtect Documentation + + + + +

404

That's a Four-Oh-Four.
Take me home
+ + + diff --git a/docs/.vuepress/dist/assets/0.1.html.7d525fed.js b/docs/.vuepress/dist/assets/0.1.html.7d525fed.js new file mode 100644 index 0000000..826aed0 --- /dev/null +++ b/docs/.vuepress/dist/assets/0.1.html.7d525fed.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-17d8839a","path":"/changelog/0.1.html","title":"zProtect 0.1","lang":"en-US","frontmatter":{},"excerpt":"","headers":[],"git":{"updatedTime":1661203612000},"filePathRelative":"changelog/0.1.md"}');export{e as data}; diff --git a/docs/.vuepress/dist/assets/0.1.html.94430b3b.js b/docs/.vuepress/dist/assets/0.1.html.94430b3b.js new file mode 100644 index 0000000..34d4470 --- /dev/null +++ b/docs/.vuepress/dist/assets/0.1.html.94430b3b.js @@ -0,0 +1 @@ +import{_ as t,o as a,c,a as e,e as o}from"./app.fe610a35.js";const r={},s=e("h1",{id:"zprotect-0-1",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#zprotect-0-1","aria-hidden":"true"},"#"),o(" zProtect 0.1")],-1),_=e("ul",null,[e("li",null,"Initial Release")],-1),n=[s,_];function l(i,d){return a(),c("div",null,n)}var u=t(r,[["render",l],["__file","0.1.html.vue"]]);export{u as default}; diff --git a/docs/.vuepress/dist/assets/0.2.html.43bc391f.js b/docs/.vuepress/dist/assets/0.2.html.43bc391f.js new file mode 100644 index 0000000..526a7fe --- /dev/null +++ b/docs/.vuepress/dist/assets/0.2.html.43bc391f.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-198d5c39","path":"/changelog/0.2.html","title":"zProtect 0.2","lang":"en-US","frontmatter":{},"excerpt":"","headers":[],"git":{"updatedTime":1661725005000},"filePathRelative":"changelog/0.2.md"}');export{e as data}; diff --git a/docs/.vuepress/dist/assets/0.2.html.ad5891ed.js b/docs/.vuepress/dist/assets/0.2.html.ad5891ed.js new file mode 100644 index 0000000..53e2465 --- /dev/null +++ b/docs/.vuepress/dist/assets/0.2.html.ad5891ed.js @@ -0,0 +1 @@ +import{_ as t,o as r,c as l,a as e,e as o}from"./app.fe610a35.js";const a={},n=e("h1",{id:"zprotect-0-2",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#zprotect-0-2","aria-hidden":"true"},"#"),o(" zProtect 0.2")],-1),s=e("ul",null,[e("li",null,"Full rewrite of all transformers that previously existed in 0.1."),e("li",null,"Full rewrite of the obfuscator core to allow more flexibility with jar files and read / write features."),e("li",null,"Brand new YAML configuration system, we no longer use JSON."),e("li",null,"Brand new Bundler System for the web.")],-1),i=[n,s];function c(d,u){return r(),l("div",null,i)}var f=t(a,[["render",c],["__file","0.2.html.vue"]]);export{f as default}; diff --git a/docs/.vuepress/dist/assets/404.e86a7fd5.js b/docs/.vuepress/dist/assets/404.e86a7fd5.js new file mode 100644 index 0000000..7801163 --- /dev/null +++ b/docs/.vuepress/dist/assets/404.e86a7fd5.js @@ -0,0 +1 @@ +import{_ as i,f as d,u as p,g as f,o as v,c as k,a as e,t as c,b as g,w as L,h as l,r as x,e as B}from"./app.fe610a35.js";const N={class:"theme-container"},T={class:"page"},b={class:"theme-default-content"},C=e("h1",null,"404",-1),M=d({__name:"404",setup(R){var a,s,n;const _=p(),o=f(),t=(a=o.value.notFound)!=null?a:["Not Found"],r=()=>t[Math.floor(Math.random()*t.length)],u=(s=o.value.home)!=null?s:_.value,m=(n=o.value.backToHome)!=null?n:"Back to home";return(V,w)=>{const h=x("RouterLink");return v(),k("div",N,[e("main",T,[e("div",b,[C,e("blockquote",null,c(r()),1),g(h,{to:l(u)},{default:L(()=>[B(c(l(m)),1)]),_:1},8,["to"])])])])}}});var F=i(M,[["__file","404.vue"]]);export{F as default}; diff --git a/docs/.vuepress/dist/assets/404.html.7d858b3d.js b/docs/.vuepress/dist/assets/404.html.7d858b3d.js new file mode 100644 index 0000000..c4c5770 --- /dev/null +++ b/docs/.vuepress/dist/assets/404.html.7d858b3d.js @@ -0,0 +1 @@ +const t=JSON.parse('{"key":"v-3706649a","path":"/404.html","title":"","lang":"en-US","frontmatter":{"layout":"404"},"excerpt":"","headers":[],"git":{},"filePathRelative":null}');export{t as data}; diff --git a/docs/.vuepress/dist/assets/404.html.cbce7884.js b/docs/.vuepress/dist/assets/404.html.cbce7884.js new file mode 100644 index 0000000..a50a916 --- /dev/null +++ b/docs/.vuepress/dist/assets/404.html.cbce7884.js @@ -0,0 +1 @@ +import{_ as e,o as _,c}from"./app.fe610a35.js";const r={};function t(o,a){return _(),c("div")}var s=e(r,[["render",t],["__file","404.html.vue"]]);export{s as default}; diff --git a/docs/.vuepress/dist/assets/Layout.d3d80637.js b/docs/.vuepress/dist/assets/Layout.d3d80637.js new file mode 100644 index 0000000..af48f21 --- /dev/null +++ b/docs/.vuepress/dist/assets/Layout.d3d80637.js @@ -0,0 +1 @@ +import{_ as w,r as R,o as n,c as i,b as L,f as S,i as P,j as h,k as pe,h as e,F as I,l as A,m as y,a as b,t as T,n as W,p as J,q as C,w as B,s as ve,v as $,e as j,x as Y,y as Be,z as Ne,A as He,B as Q,C as Z,D as q,E as he,G as me,H as E,u as fe,g as H,T as be,I as z,J as ge,K as G,L as X,M as Ie,N as Me,O as ee,P as ke,Q as $e,d as De,R as te,S as Pe,U as K,V as ae,W as Ee,X as Re,Y as Ae,Z as Oe,$ as Fe,a0 as ze,a1 as We}from"./app.fe610a35.js";const Ue={},Ve={class:"theme-default-content"};function Ke(v,a){const t=R("Content");return n(),i("div",Ve,[L(t)])}var je=w(Ue,[["render",Ke],["__file","HomeContent.vue"]]);const qe={key:0,class:"features"},Ge=S({__name:"HomeFeatures",setup(v){const a=P(),t=h(()=>pe(a.value.features)?a.value.features:[]);return(u,o)=>e(t).length?(n(),i("div",qe,[(n(!0),i(I,null,A(e(t),_=>(n(),i("div",{key:_.title,class:"feature"},[b("h2",null,T(_.title),1),b("p",null,T(_.details),1)]))),128))])):y("",!0)}});var Xe=w(Ge,[["__file","HomeFeatures.vue"]]);const Ye=["innerHTML"],Je=["textContent"],Qe=S({__name:"HomeFooter",setup(v){const a=P(),t=h(()=>a.value.footer),u=h(()=>a.value.footerHtml);return(o,_)=>e(t)?(n(),i(I,{key:0},[e(u)?(n(),i("div",{key:0,class:"footer",innerHTML:e(t)},null,8,Ye)):(n(),i("div",{key:1,class:"footer",textContent:T(e(t))},null,8,Je))],64)):y("",!0)}});var Ze=w(Qe,[["__file","HomeFooter.vue"]]);const et=["href","rel","target","aria-label"],tt=S({inheritAttrs:!1}),at=S({...tt,__name:"AutoLink",props:{item:{type:Object,required:!0}},setup(v){const a=v,t=W(),u=He(),{item:o}=J(a),_=h(()=>Y(o.value.link)),f=h(()=>Be(o.value.link)||Ne(o.value.link)),c=h(()=>{if(!f.value){if(o.value.target)return o.value.target;if(_.value)return"_blank"}}),r=h(()=>c.value==="_blank"),s=h(()=>!_.value&&!f.value&&!r.value),l=h(()=>{if(!f.value){if(o.value.rel)return o.value.rel;if(r.value)return"noopener noreferrer"}}),p=h(()=>o.value.ariaLabel||o.value.text),d=h(()=>{const k=Object.keys(u.value.locales);return k.length?!k.some(m=>m===o.value.link):o.value.link!=="/"}),g=h(()=>d.value?t.path.startsWith(o.value.link):!1),x=h(()=>s.value?o.value.activeMatch?new RegExp(o.value.activeMatch).test(t.path):g.value:!1);return(k,m)=>{const N=R("RouterLink"),M=R("AutoLinkExternalIcon");return e(s)?(n(),C(N,ve({key:0,class:{"router-link-active":e(x)},to:e(o).link,"aria-label":e(p)},k.$attrs),{default:B(()=>[$(k.$slots,"before"),j(" "+T(e(o).text)+" ",1),$(k.$slots,"after")]),_:3},16,["class","to","aria-label"])):(n(),i("a",ve({key:1,class:"external-link",href:e(o).link,rel:e(l),target:e(c),"aria-label":e(p)},k.$attrs),[$(k.$slots,"before"),j(" "+T(e(o).text)+" ",1),e(r)?(n(),C(M,{key:0})):y("",!0),$(k.$slots,"after")],16,et))}}});var D=w(at,[["__file","AutoLink.vue"]]);const nt={class:"hero"},ot={key:0,id:"main-title"},rt={key:1,class:"description"},st={key:2,class:"actions"},lt=S({__name:"HomeHero",setup(v){const a=P(),t=Q(),u=Z(),o=h(()=>u.value&&a.value.heroImageDark!==void 0?a.value.heroImageDark:a.value.heroImage),_=h(()=>a.value.heroText===null?null:a.value.heroText||t.value.title||"Hello"),f=h(()=>a.value.heroAlt||_.value||"hero"),c=h(()=>a.value.tagline===null?null:a.value.tagline||t.value.description||"Welcome to your VuePress site"),r=h(()=>pe(a.value.actions)?a.value.actions.map(({text:l,link:p,type:d="primary"})=>({text:l,link:p,type:d})):[]),s=()=>{if(!o.value)return null;const l=q("img",{src:he(o.value),alt:f.value});return a.value.heroImageDark===void 0?l:q(me,()=>l)};return(l,p)=>(n(),i("header",nt,[L(s),e(_)?(n(),i("h1",ot,T(e(_)),1)):y("",!0),e(c)?(n(),i("p",rt,T(e(c)),1)):y("",!0),e(r).length?(n(),i("p",st,[(n(!0),i(I,null,A(e(r),d=>(n(),C(D,{key:d.text,class:E(["action-button",[d.type]]),item:d},null,8,["class","item"]))),128))])):y("",!0)]))}});var ut=w(lt,[["__file","HomeHero.vue"]]);const it={class:"home"},ct=S({__name:"Home",setup(v){return(a,t)=>(n(),i("main",it,[L(ut),L(Xe),L(je),L(Ze)]))}});var dt=w(ct,[["__file","Home.vue"]]);const vt=S({__name:"NavbarBrand",setup(v){const a=fe(),t=Q(),u=H(),o=Z(),_=h(()=>u.value.home||a.value),f=h(()=>t.value.title),c=h(()=>o.value&&u.value.logoDark!==void 0?u.value.logoDark:u.value.logo),r=()=>{if(!c.value)return null;const s=q("img",{class:"logo",src:he(c.value),alt:f.value});return u.value.logoDark===void 0?s:q(me,()=>s)};return(s,l)=>{const p=R("RouterLink");return n(),C(p,{to:e(_)},{default:B(()=>[L(r),e(f)?(n(),i("span",{key:0,class:E(["site-name",{"can-hide":e(c)}])},T(e(f)),3)):y("",!0)]),_:1},8,["to"])}}});var _t=w(vt,[["__file","NavbarBrand.vue"]]);const pt=S({__name:"DropdownTransition",setup(v){const a=u=>{u.style.height=u.scrollHeight+"px"},t=u=>{u.style.height=""};return(u,o)=>(n(),C(be,{name:"dropdown",onEnter:a,onAfterEnter:t,onBeforeLeave:a},{default:B(()=>[$(u.$slots,"default")]),_:3}))}});var Le=w(pt,[["__file","DropdownTransition.vue"]]);const ht=["aria-label"],mt={class:"title"},ft=b("span",{class:"arrow down"},null,-1),bt=["aria-label"],gt={class:"title"},kt={class:"navbar-dropdown"},$t={class:"navbar-dropdown-subtitle"},Lt={key:1},yt={class:"navbar-dropdown-subitem-wrapper"},wt=S({__name:"NavbarDropdown",props:{item:{type:Object,required:!0}},setup(v){const a=v,{item:t}=J(a),u=h(()=>t.value.ariaLabel||t.value.text),o=z(!1),_=W();ge(()=>_.path,()=>{o.value=!1});const f=r=>{r.detail===0?o.value=!o.value:o.value=!1},c=(r,s)=>s[s.length-1]===r;return(r,s)=>(n(),i("div",{class:E(["navbar-dropdown-wrapper",{open:o.value}])},[b("button",{class:"navbar-dropdown-title",type:"button","aria-label":e(u),onClick:f},[b("span",mt,T(e(t).text),1),ft],8,ht),b("button",{class:"navbar-dropdown-title-mobile",type:"button","aria-label":e(u),onClick:s[0]||(s[0]=l=>o.value=!o.value)},[b("span",gt,T(e(t).text),1),b("span",{class:E(["arrow",o.value?"down":"right"])},null,2)],8,bt),L(Le,null,{default:B(()=>[G(b("ul",kt,[(n(!0),i(I,null,A(e(t).children,l=>(n(),i("li",{key:l.text,class:"navbar-dropdown-item"},[l.children?(n(),i(I,{key:0},[b("h4",$t,[l.link?(n(),C(D,{key:0,item:l,onFocusout:p=>c(l,e(t).children)&&l.children.length===0&&(o.value=!1)},null,8,["item","onFocusout"])):(n(),i("span",Lt,T(l.text),1))]),b("ul",yt,[(n(!0),i(I,null,A(l.children,p=>(n(),i("li",{key:p.link,class:"navbar-dropdown-subitem"},[L(D,{item:p,onFocusout:d=>c(p,l.children)&&c(l,e(t).children)&&(o.value=!1)},null,8,["item","onFocusout"])]))),128))])],64)):(n(),C(D,{key:1,item:l,onFocusout:p=>c(l,e(t).children)&&(o.value=!1)},null,8,["item","onFocusout"]))]))),128))],512),[[X,o.value]])]),_:1})],2))}});var St=w(wt,[["__file","NavbarDropdown.vue"]]);const _e=v=>decodeURI(v).replace(/#.*$/,"").replace(/(index)?\.(md|html)$/,""),Ct=(v,a)=>{if(a.hash===v)return!0;const t=_e(a.path),u=_e(v);return t===u},ye=(v,a)=>v.link&&Ct(v.link,a)?!0:v.children?v.children.some(t=>ye(t,a)):!1,we=v=>!Y(v)||/github\.com/.test(v)?"GitHub":/bitbucket\.org/.test(v)?"Bitbucket":/gitlab\.com/.test(v)?"GitLab":/gitee\.com/.test(v)?"Gitee":null,Tt={GitHub:":repo/edit/:branch/:path",GitLab:":repo/-/edit/:branch/:path",Gitee:":repo/edit/:branch/:path",Bitbucket:":repo/src/:branch/:path?mode=edit&spa=0&at=:branch&fileviewer=file-view-default"},xt=({docsRepo:v,editLinkPattern:a})=>{if(a)return a;const t=we(v);return t!==null?Tt[t]:null},Bt=({docsRepo:v,docsBranch:a,docsDir:t,filePathRelative:u,editLinkPattern:o})=>{if(!u)return null;const _=xt({docsRepo:v,editLinkPattern:o});return _?_.replace(/:repo/,Y(v)?v:`https://github.com/${v}`).replace(/:branch/,a).replace(/:path/,Ie(`${Me(t)}/${u}`)):null},Nt={key:0,class:"navbar-items"},Ht=S({__name:"NavbarItems",setup(v){const a=()=>{const s=ee(),l=fe(),p=Q(),d=H();return h(()=>{var M,O,F;const g=Object.keys(p.value.locales);if(g.length<2)return[];const x=s.currentRoute.value.path,k=s.currentRoute.value.fullPath,m=s.currentRoute.value.hash;return[{text:(M=d.value.selectLanguageText)!=null?M:"unknown language",ariaLabel:(F=(O=d.value.selectLanguageAriaLabel)!=null?O:d.value.selectLanguageText)!=null?F:"unknown language",children:g.map(U=>{var re,se,le,ue,ie,ce;const Ce=(se=(re=p.value.locales)==null?void 0:re[U])!=null?se:{},ne=(ue=(le=d.value.locales)==null?void 0:le[U])!=null?ue:{},oe=`${Ce.lang}`,Te=(ie=ne.selectLanguageName)!=null?ie:oe;let V;if(oe===p.value.lang)V=k;else{const de=x.replace(l.value,U);s.getRoutes().some(xe=>xe.path===de)?V=`${de}${m}`:V=(ce=ne.home)!=null?ce:U}return{text:Te,link:V}})}]})},t=()=>{const s=H(),l=h(()=>s.value.repo),p=h(()=>l.value?we(l.value):null),d=h(()=>l.value&&!Y(l.value)?`https://github.com/${l.value}`:l.value),g=h(()=>d.value?s.value.repoLabel?s.value.repoLabel:p.value===null?"Source":p.value:null);return h(()=>!d.value||!g.value?[]:[{text:g.value,link:d.value}])},u=s=>ke(s)?$e(s):s.children?{...s,children:s.children.map(u)}:s,_=(()=>{const s=H();return h(()=>(s.value.navbar||[]).map(u))})(),f=a(),c=t(),r=h(()=>[..._.value,...f.value,...c.value]);return(s,l)=>e(r).length?(n(),i("nav",Nt,[(n(!0),i(I,null,A(e(r),p=>(n(),i("div",{key:p.text,class:"navbar-item"},[p.children?(n(),C(St,{key:0,item:p},null,8,["item"])):(n(),C(D,{key:1,item:p},null,8,["item"]))]))),128))])):y("",!0)}});var Se=w(Ht,[["__file","NavbarItems.vue"]]);const It=["title"],Mt={class:"icon",focusable:"false",viewBox:"0 0 32 32"},Dt=De('',9),Pt=[Dt],Et={class:"icon",focusable:"false",viewBox:"0 0 32 32"},Rt=b("path",{d:"M13.502 5.414a15.075 15.075 0 0 0 11.594 18.194a11.113 11.113 0 0 1-7.975 3.39c-.138 0-.278.005-.418 0a11.094 11.094 0 0 1-3.2-21.584M14.98 3a1.002 1.002 0 0 0-.175.016a13.096 13.096 0 0 0 1.825 25.981c.164.006.328 0 .49 0a13.072 13.072 0 0 0 10.703-5.555a1.01 1.01 0 0 0-.783-1.565A13.08 13.08 0 0 1 15.89 4.38A1.015 1.015 0 0 0 14.98 3z",fill:"currentColor"},null,-1),At=[Rt],Ot=S({__name:"ToggleColorModeButton",setup(v){const a=H(),t=Z(),u=()=>{t.value=!t.value};return(o,_)=>(n(),i("button",{class:"toggle-color-mode-button",title:e(a).toggleColorMode,onClick:u},[G((n(),i("svg",Mt,Pt,512)),[[X,!e(t)]]),G((n(),i("svg",Et,At,512)),[[X,e(t)]])],8,It))}});var Ft=w(Ot,[["__file","ToggleColorModeButton.vue"]]);const zt=["title"],Wt=b("div",{class:"icon","aria-hidden":"true"},[b("span"),b("span"),b("span")],-1),Ut=[Wt],Vt=S({__name:"ToggleSidebarButton",emits:["toggle"],setup(v){const a=H();return(t,u)=>(n(),i("div",{class:"toggle-sidebar-button",title:e(a).toggleSidebar,"aria-expanded":"false",role:"button",tabindex:"0",onClick:u[0]||(u[0]=o=>t.$emit("toggle"))},Ut,8,zt))}});var Kt=w(Vt,[["__file","ToggleSidebarButton.vue"]]);const jt=S({__name:"Navbar",emits:["toggle-sidebar"],setup(v){const a=H(),t=z(null),u=z(null),o=z(0),_=h(()=>o.value?{maxWidth:o.value+"px"}:{});te(()=>{const r=f(t.value,"paddingLeft")+f(t.value,"paddingRight"),s=()=>{var l;window.innerWidth<=719?o.value=0:o.value=t.value.offsetWidth-r-(((l=u.value)==null?void 0:l.offsetWidth)||0)};s(),window.addEventListener("resize",s,!1),window.addEventListener("orientationchange",s,!1)});function f(c,r){var p,d,g;const s=(g=(d=(p=c==null?void 0:c.ownerDocument)==null?void 0:p.defaultView)==null?void 0:d.getComputedStyle(c,null))==null?void 0:g[r],l=Number.parseInt(s,10);return Number.isNaN(l)?0:l}return(c,r)=>{const s=R("NavbarSearch");return n(),i("header",{ref_key:"navbar",ref:t,class:"navbar"},[L(Kt,{onToggle:r[0]||(r[0]=l=>c.$emit("toggle-sidebar"))}),b("span",{ref_key:"navbarBrand",ref:u},[L(_t)],512),b("div",{class:"navbar-items-wrapper",style:Pe(e(_))},[$(c.$slots,"before"),L(Se,{class:"can-hide"}),$(c.$slots,"after"),e(a).colorModeSwitch?(n(),C(Ft,{key:0})):y("",!0),L(s)],4)],512)}}});var qt=w(jt,[["__file","Navbar.vue"]]);const Gt={class:"page-meta"},Xt={key:0,class:"meta-item edit-link"},Yt={key:1,class:"meta-item last-updated"},Jt={class:"meta-item-label"},Qt={class:"meta-item-info"},Zt={key:2,class:"meta-item contributors"},ea={class:"meta-item-label"},ta={class:"meta-item-info"},aa=["title"],na=j(", "),oa=S({__name:"PageMeta",setup(v){const a=()=>{const r=H(),s=K(),l=P();return h(()=>{var M,O,F;if(!((O=(M=l.value.editLink)!=null?M:r.value.editLink)!=null?O:!0))return null;const{repo:d,docsRepo:g=d,docsBranch:x="main",docsDir:k="",editLinkText:m}=r.value;if(!g)return null;const N=Bt({docsRepo:g,docsBranch:x,docsDir:k,filePathRelative:s.value.filePathRelative,editLinkPattern:(F=l.value.editLinkPattern)!=null?F:r.value.editLinkPattern});return N?{text:m!=null?m:"Edit this page",link:N}:null})},t=()=>{const r=H(),s=K(),l=P();return h(()=>{var g,x,k,m;return!((x=(g=l.value.lastUpdated)!=null?g:r.value.lastUpdated)!=null?x:!0)||!((k=s.value.git)!=null&&k.updatedTime)?null:new Date((m=s.value.git)==null?void 0:m.updatedTime).toLocaleString()})},u=()=>{const r=H(),s=K(),l=P();return h(()=>{var d,g,x,k;return((g=(d=l.value.contributors)!=null?d:r.value.contributors)!=null?g:!0)&&(k=(x=s.value.git)==null?void 0:x.contributors)!=null?k:null})},o=H(),_=a(),f=t(),c=u();return(r,s)=>{const l=R("ClientOnly");return n(),i("footer",Gt,[e(_)?(n(),i("div",Xt,[L(D,{class:"meta-item-label",item:e(_)},null,8,["item"])])):y("",!0),e(f)?(n(),i("div",Yt,[b("span",Jt,T(e(o).lastUpdatedText)+": ",1),L(l,null,{default:B(()=>[b("span",Qt,T(e(f)),1)]),_:1})])):y("",!0),e(c)&&e(c).length?(n(),i("div",Zt,[b("span",ea,T(e(o).contributorsText)+": ",1),b("span",ta,[(n(!0),i(I,null,A(e(c),(p,d)=>(n(),i(I,{key:d},[b("span",{class:"contributor",title:`email: ${p.email}`},T(p.name),9,aa),d!==e(c).length-1?(n(),i(I,{key:0},[na],64)):y("",!0)],64))),128))])])):y("",!0)])}}});var ra=w(oa,[["__file","PageMeta.vue"]]);const sa={key:0,class:"page-nav"},la={class:"inner"},ua={key:0,class:"prev"},ia={key:1,class:"next"},ca=S({__name:"PageNav",setup(v){const a=r=>r===!1?null:ke(r)?$e(r):Ee(r)?r:!1,t=(r,s,l)=>{const p=r.findIndex(d=>d.link===s);if(p!==-1){const d=r[p+l];return d!=null&&d.link?d:null}for(const d of r)if(d.children){const g=t(d.children,s,l);if(g)return g}return null},u=P(),o=ae(),_=W(),f=h(()=>{const r=a(u.value.prev);return r!==!1?r:t(o.value,_.path,-1)}),c=h(()=>{const r=a(u.value.next);return r!==!1?r:t(o.value,_.path,1)});return(r,s)=>e(f)||e(c)?(n(),i("nav",sa,[b("p",la,[e(f)?(n(),i("span",ua,[L(D,{item:e(f)},null,8,["item"])])):y("",!0),e(c)?(n(),i("span",ia,[L(D,{item:e(c)},null,8,["item"])])):y("",!0)])])):y("",!0)}});var da=w(ca,[["__file","PageNav.vue"]]);const va={class:"page"},_a={class:"theme-default-content"},pa=S({__name:"Page",setup(v){return(a,t)=>{const u=R("Content");return n(),i("main",va,[$(a.$slots,"top"),b("div",_a,[$(a.$slots,"content-top"),L(u),$(a.$slots,"content-bottom")]),L(ra),L(da),$(a.$slots,"bottom")])}}});var ha=w(pa,[["__file","Page.vue"]]);const ma=["onKeydown"],fa={class:"sidebar-item-children"},ba=S({__name:"SidebarItem",props:{item:{type:Object,required:!0},depth:{type:Number,required:!1,default:0}},setup(v){const a=v,{item:t,depth:u}=J(a),o=W(),_=ee(),f=h(()=>ye(t.value,o)),c=h(()=>({"sidebar-item":!0,"sidebar-heading":u.value===0,active:f.value,collapsible:t.value.collapsible})),[r,s]=Re(f.value),l=d=>{t.value.collapsible&&(d.preventDefault(),s())},p=_.afterEach(d=>{Ae(()=>{r.value=t.value.collapsible?f.value:!0})});return Oe(()=>{p()}),(d,g)=>{var k;const x=R("SidebarItem",!0);return n(),i("li",null,[e(t).link?(n(),C(D,{key:0,class:E(e(c)),item:e(t)},null,8,["class","item"])):(n(),i("p",{key:1,tabindex:"0",class:E(e(c)),onClick:l,onKeydown:Fe(l,["enter"])},[j(T(e(t).text)+" ",1),e(t).collapsible?(n(),i("span",{key:0,class:E(["arrow",e(r)?"down":"right"])},null,2)):y("",!0)],42,ma)),(k=e(t).children)!=null&&k.length?(n(),C(Le,{key:2},{default:B(()=>[G(b("ul",fa,[(n(!0),i(I,null,A(e(t).children,m=>(n(),C(x,{key:`${e(u)}${m.text}${m.link}`,item:m,depth:e(u)+1},null,8,["item","depth"]))),128))],512),[[X,e(r)]])]),_:1})):y("",!0)])}}});var ga=w(ba,[["__file","SidebarItem.vue"]]);const ka={key:0,class:"sidebar-items"},$a=S({__name:"SidebarItems",setup(v){const a=W(),t=ae();return te(()=>{ge(()=>a.hash,u=>{const o=document.querySelector(".sidebar");if(!o)return;const _=document.querySelector(`.sidebar a.sidebar-item[href="${a.path}${u}"]`);if(!_)return;const{top:f,height:c}=o.getBoundingClientRect(),{top:r,height:s}=_.getBoundingClientRect();rf+c&&_.scrollIntoView(!1)})}),(u,o)=>e(t).length?(n(),i("ul",ka,[(n(!0),i(I,null,A(e(t),_=>(n(),C(ga,{key:`${_.text}${_.link}`,item:_},null,8,["item"]))),128))])):y("",!0)}});var La=w($a,[["__file","SidebarItems.vue"]]);const ya={class:"sidebar"},wa=S({__name:"Sidebar",setup(v){return(a,t)=>(n(),i("aside",ya,[L(Se),$(a.$slots,"top"),L(La),$(a.$slots,"bottom")]))}});var Sa=w(wa,[["__file","Sidebar.vue"]]);const Ca=S({__name:"Layout",setup(v){const a=K(),t=P(),u=H(),o=h(()=>t.value.navbar!==!1&&u.value.navbar!==!1),_=ae(),f=z(!1),c=m=>{f.value=typeof m=="boolean"?m:!f.value},r={x:0,y:0},s=m=>{r.x=m.changedTouches[0].clientX,r.y=m.changedTouches[0].clientY},l=m=>{const N=m.changedTouches[0].clientX-r.x,M=m.changedTouches[0].clientY-r.y;Math.abs(N)>Math.abs(M)&&Math.abs(N)>40&&(N>0&&r.x<=80?c(!0):c(!1))},p=h(()=>[{"no-navbar":!o.value,"no-sidebar":!_.value.length,"sidebar-open":f.value},t.value.pageClass]);let d;te(()=>{d=ee().afterEach(()=>{c(!1)})}),ze(()=>{d()});const g=We(),x=g.resolve,k=g.pending;return(m,N)=>(n(),i("div",{class:E(["theme-container",e(p)]),onTouchstart:s,onTouchend:l},[$(m.$slots,"navbar",{},()=>[e(o)?(n(),C(qt,{key:0,onToggleSidebar:c},{before:B(()=>[$(m.$slots,"navbar-before")]),after:B(()=>[$(m.$slots,"navbar-after")]),_:3})):y("",!0)]),b("div",{class:"sidebar-mask",onClick:N[0]||(N[0]=M=>c(!1))}),$(m.$slots,"sidebar",{},()=>[L(Sa,null,{top:B(()=>[$(m.$slots,"sidebar-top")]),bottom:B(()=>[$(m.$slots,"sidebar-bottom")]),_:3})]),$(m.$slots,"page",{},()=>[e(t).home?(n(),C(dt,{key:0})):(n(),C(be,{key:1,name:"fade-slide-y",mode:"out-in",onBeforeEnter:e(x),onBeforeLeave:e(k)},{default:B(()=>[(n(),C(ha,{key:e(a).path},{top:B(()=>[$(m.$slots,"page-top")]),"content-top":B(()=>[$(m.$slots,"page-content-top")]),"content-bottom":B(()=>[$(m.$slots,"page-content-bottom")]),bottom:B(()=>[$(m.$slots,"page-bottom")]),_:3}))]),_:3},8,["onBeforeEnter","onBeforeLeave"]))])],34))}});var xa=w(Ca,[["__file","Layout.vue"]]);export{xa as default}; diff --git a/docs/.vuepress/dist/assets/app.fe610a35.js b/docs/.vuepress/dist/assets/app.fe610a35.js new file mode 100644 index 0000000..48938e2 --- /dev/null +++ b/docs/.vuepress/dist/assets/app.fe610a35.js @@ -0,0 +1,10 @@ +const cr={},_i="modulepreload",Eo={},wi="/",ve=function(t,n){return!n||n.length===0?t():Promise.all(n.map(r=>{if(r=`${wi}${r}`,r in Eo)return;Eo[r]=!0;const o=r.endsWith(".css"),s=o?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${r}"]${s}`))return;const l=document.createElement("link");if(l.rel=o?"stylesheet":_i,o||(l.as="script",l.crossOrigin=""),l.href=r,document.head.appendChild(l),o)return new Promise((i,a)=>{l.addEventListener("load",i),l.addEventListener("error",()=>a(new Error(`Unable to preload CSS for ${r}`)))})})).then(()=>t())},Ei={"v-06f9211a":()=>ve(()=>import("./commandline.html.0cdd07e7.js"),[]).then(({data:e})=>e),"v-31071e3e":()=>ve(()=>import("./config.html.24d9df8b.js"),[]).then(({data:e})=>e),"v-8daa1a0e":()=>ve(()=>import("./index.html.9efec093.js"),[]).then(({data:e})=>e),"v-08eb506c":()=>ve(()=>import("./privacy.html.b7d51f10.js"),[]).then(({data:e})=>e),"v-e0bdb92a":()=>ve(()=>import("./terms.html.c69bbe45.js"),[]).then(({data:e})=>e),"v-17d8839a":()=>ve(()=>import("./0.1.html.7d525fed.js"),[]).then(({data:e})=>e),"v-198d5c39":()=>ve(()=>import("./0.2.html.43bc391f.js"),[]).then(({data:e})=>e),"v-d0e1d8bc":()=>ve(()=>import("./commandline.html.15f2e1ec.js"),[]).then(({data:e})=>e),"v-296358af":()=>ve(()=>import("./config.html.533c1ab4.js"),[]).then(({data:e})=>e),"v-2d0ad528":()=>ve(()=>import("./index.html.3175b1e4.js"),[]).then(({data:e})=>e),"v-3706649a":()=>ve(()=>import("./404.html.7d858b3d.js"),[]).then(({data:e})=>e)};function Kr(e,t){const n=Object.create(null),r=e.split(",");for(let o=0;o!!n[o.toLowerCase()]:o=>!!n[o]}const Ci="itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly",xi=Kr(Ci);function Is(e){return!!e||e===""}function Yn(e){if(G(e)){const t={};for(let n=0;n{if(n){const r=n.split(Pi);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function _n(e){let t="";if(me(e))t=e;else if(G(e))for(let n=0;nme(e)?e:e==null?"":G(e)||we(e)&&(e.toString===Ds||!X(e.toString))?JSON.stringify(e,ks,2):String(e),ks=(e,t)=>t&&t.__v_isRef?ks(e,t.value):jt(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,o])=>(n[`${r} =>`]=o,n),{})}:Ms(t)?{[`Set(${t.size})`]:[...t.values()]}:we(t)&&!G(t)&&!Fs(t)?String(t):t,pe={},Bt=[],Ye=()=>{},Oi=()=>!1,Li=/^on[^a-z]/,wn=e=>Li.test(e),Wr=e=>e.startsWith("onUpdate:"),Se=Object.assign,qr=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Ai=Object.prototype.hasOwnProperty,re=(e,t)=>Ai.call(e,t),G=Array.isArray,jt=e=>Gn(e)==="[object Map]",Ms=e=>Gn(e)==="[object Set]",X=e=>typeof e=="function",me=e=>typeof e=="string",Yr=e=>typeof e=="symbol",we=e=>e!==null&&typeof e=="object",Ns=e=>we(e)&&X(e.then)&&X(e.catch),Ds=Object.prototype.toString,Gn=e=>Ds.call(e),Ii=e=>Gn(e).slice(8,-1),Fs=e=>Gn(e)==="[object Object]",Gr=e=>me(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,sn=Kr(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Jn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},ki=/-(\w)/g,Xe=Jn(e=>e.replace(ki,(t,n)=>n?n.toUpperCase():"")),Mi=/\B([A-Z])/g,Mt=Jn(e=>e.replace(Mi,"-$1").toLowerCase()),Qn=Jn(e=>e.charAt(0).toUpperCase()+e.slice(1)),ur=Jn(e=>e?`on${Qn(e)}`:""),hn=(e,t)=>!Object.is(e,t),fr=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},Hs=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let Co;const Ni=()=>Co||(Co=typeof globalThis!="undefined"?globalThis:typeof self!="undefined"?self:typeof window!="undefined"?window:typeof global!="undefined"?global:{});let Ne;class Di{constructor(t=!1){this.active=!0,this.effects=[],this.cleanups=[],!t&&Ne&&(this.parent=Ne,this.index=(Ne.scopes||(Ne.scopes=[])).push(this)-1)}run(t){if(this.active){const n=Ne;try{return Ne=this,t()}finally{Ne=n}}}on(){Ne=this}off(){Ne=this.parent}stop(t){if(this.active){let n,r;for(n=0,r=this.effects.length;n{const t=new Set(e);return t.w=0,t.n=0,t},zs=e=>(e.w&bt)>0,$s=e=>(e.n&bt)>0,$i=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let n=0;for(let r=0;r{(c==="length"||c>=r)&&i.push(a)});else switch(n!==void 0&&i.push(l.get(n)),t){case"add":G(e)?Gr(n)&&i.push(l.get("length")):(i.push(l.get(At)),jt(e)&&i.push(l.get(Rr)));break;case"delete":G(e)||(i.push(l.get(At)),jt(e)&&i.push(l.get(Rr)));break;case"set":jt(e)&&i.push(l.get(At));break}if(i.length===1)i[0]&&Tr(i[0]);else{const a=[];for(const c of i)c&&a.push(...c);Tr(Jr(a))}}function Tr(e,t){const n=G(e)?e:[...e];for(const r of n)r.computed&&So(r);for(const r of n)r.computed||So(r)}function So(e,t){(e!==We||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}const ji=Kr("__proto__,__v_isRef,__isVue"),Us=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Yr)),Ui=Zr(),Vi=Zr(!1,!0),Ki=Zr(!0),Po=Wi();function Wi(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const r=ae(this);for(let s=0,l=this.length;s{e[t]=function(...n){Gt();const r=ae(this)[t].apply(this,n);return Jt(),r}}),e}function Zr(e=!1,t=!1){return function(r,o,s){if(o==="__v_isReactive")return!e;if(o==="__v_isReadonly")return e;if(o==="__v_isShallow")return t;if(o==="__v_raw"&&s===(e?t?aa:Ys:t?qs:Ws).get(r))return r;const l=G(r);if(!e&&l&&re(Po,o))return Reflect.get(Po,o,s);const i=Reflect.get(r,o,s);return(Yr(o)?Us.has(o):ji(o))||(e||He(r,"get",o),t)?i:Ce(i)?l&&Gr(o)?i:i.value:we(i)?e?to(i):Qt(i):i}}const qi=Vs(),Yi=Vs(!0);function Vs(e=!1){return function(n,r,o,s){let l=n[r];if(pn(l)&&Ce(l)&&!Ce(o))return!1;if(!e&&!pn(o)&&(Or(o)||(o=ae(o),l=ae(l)),!G(n)&&Ce(l)&&!Ce(o)))return l.value=o,!0;const i=G(n)&&Gr(r)?Number(r)e,Zn=e=>Reflect.getPrototypeOf(e);function Pn(e,t,n=!1,r=!1){e=e.__v_raw;const o=ae(e),s=ae(t);n||(t!==s&&He(o,"get",t),He(o,"get",s));const{has:l}=Zn(o),i=r?Xr:n?ro:mn;if(l.call(o,t))return i(e.get(t));if(l.call(o,s))return i(e.get(s));e!==o&&e.get(t)}function Rn(e,t=!1){const n=this.__v_raw,r=ae(n),o=ae(e);return t||(e!==o&&He(r,"has",e),He(r,"has",o)),e===o?n.has(e):n.has(e)||n.has(o)}function Tn(e,t=!1){return e=e.__v_raw,!t&&He(ae(e),"iterate",At),Reflect.get(e,"size",e)}function Ro(e){e=ae(e);const t=ae(this);return Zn(t).has.call(t,e)||(t.add(e),st(t,"add",e,e)),this}function To(e,t){t=ae(t);const n=ae(this),{has:r,get:o}=Zn(n);let s=r.call(n,e);s||(e=ae(e),s=r.call(n,e));const l=o.call(n,e);return n.set(e,t),s?hn(t,l)&&st(n,"set",e,t):st(n,"add",e,t),this}function Oo(e){const t=ae(this),{has:n,get:r}=Zn(t);let o=n.call(t,e);o||(e=ae(e),o=n.call(t,e)),r&&r.call(t,e);const s=t.delete(e);return o&&st(t,"delete",e,void 0),s}function Lo(){const e=ae(this),t=e.size!==0,n=e.clear();return t&&st(e,"clear",void 0,void 0),n}function On(e,t){return function(r,o){const s=this,l=s.__v_raw,i=ae(l),a=t?Xr:e?ro:mn;return!e&&He(i,"iterate",At),l.forEach((c,u)=>r.call(o,a(c),a(u),s))}}function Ln(e,t,n){return function(...r){const o=this.__v_raw,s=ae(o),l=jt(s),i=e==="entries"||e===Symbol.iterator&&l,a=e==="keys"&&l,c=o[e](...r),u=n?Xr:t?ro:mn;return!t&&He(s,"iterate",a?Rr:At),{next(){const{value:d,done:h}=c.next();return h?{value:d,done:h}:{value:i?[u(d[0]),u(d[1])]:u(d),done:h}},[Symbol.iterator](){return this}}}}function ct(e){return function(...t){return e==="delete"?!1:this}}function ea(){const e={get(s){return Pn(this,s)},get size(){return Tn(this)},has:Rn,add:Ro,set:To,delete:Oo,clear:Lo,forEach:On(!1,!1)},t={get(s){return Pn(this,s,!1,!0)},get size(){return Tn(this)},has:Rn,add:Ro,set:To,delete:Oo,clear:Lo,forEach:On(!1,!0)},n={get(s){return Pn(this,s,!0)},get size(){return Tn(this,!0)},has(s){return Rn.call(this,s,!0)},add:ct("add"),set:ct("set"),delete:ct("delete"),clear:ct("clear"),forEach:On(!0,!1)},r={get(s){return Pn(this,s,!0,!0)},get size(){return Tn(this,!0)},has(s){return Rn.call(this,s,!0)},add:ct("add"),set:ct("set"),delete:ct("delete"),clear:ct("clear"),forEach:On(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(s=>{e[s]=Ln(s,!1,!1),n[s]=Ln(s,!0,!1),t[s]=Ln(s,!1,!0),r[s]=Ln(s,!0,!0)}),[e,n,t,r]}const[ta,na,ra,oa]=ea();function eo(e,t){const n=t?e?oa:ra:e?na:ta;return(r,o,s)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?r:Reflect.get(re(n,o)&&o in r?n:r,o,s)}const sa={get:eo(!1,!1)},la={get:eo(!1,!0)},ia={get:eo(!0,!1)},Ws=new WeakMap,qs=new WeakMap,Ys=new WeakMap,aa=new WeakMap;function ca(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function ua(e){return e.__v_skip||!Object.isExtensible(e)?0:ca(Ii(e))}function Qt(e){return pn(e)?e:no(e,!1,Ks,sa,Ws)}function fa(e){return no(e,!1,Xi,la,qs)}function to(e){return no(e,!0,Zi,ia,Ys)}function no(e,t,n,r,o){if(!we(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const s=o.get(e);if(s)return s;const l=ua(e);if(l===0)return e;const i=new Proxy(e,l===2?r:n);return o.set(e,i),i}function Ut(e){return pn(e)?Ut(e.__v_raw):!!(e&&e.__v_isReactive)}function pn(e){return!!(e&&e.__v_isReadonly)}function Or(e){return!!(e&&e.__v_isShallow)}function Gs(e){return Ut(e)||pn(e)}function ae(e){const t=e&&e.__v_raw;return t?ae(t):e}function Js(e){return Fn(e,"__v_skip",!0),e}const mn=e=>we(e)?Qt(e):e,ro=e=>we(e)?to(e):e;function Qs(e){vt&&We&&(e=ae(e),js(e.dep||(e.dep=Jr())))}function Zs(e,t){e=ae(e),e.dep&&Tr(e.dep)}function Ce(e){return!!(e&&e.__v_isRef===!0)}function ye(e){return el(e,!1)}function Xs(e){return el(e,!0)}function el(e,t){return Ce(e)?e:new da(e,t)}class da{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:ae(t),this._value=n?t:mn(t)}get value(){return Qs(this),this._value}set value(t){t=this.__v_isShallow?t:ae(t),hn(t,this._rawValue)&&(this._rawValue=t,this._value=this.__v_isShallow?t:mn(t),Zs(this))}}function Ge(e){return Ce(e)?e.value:e}const ha={get:(e,t,n)=>Ge(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const o=e[t];return Ce(o)&&!Ce(n)?(o.value=n,!0):Reflect.set(e,t,n,r)}};function tl(e){return Ut(e)?e:new Proxy(e,ha)}function pa(e){const t=G(e)?new Array(e.length):{};for(const n in e)t[n]=ga(e,n);return t}class ma{constructor(t,n,r){this._object=t,this._key=n,this._defaultValue=r,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}}function ga(e,t,n){const r=e[t];return Ce(r)?r:new ma(e,t,n)}class va{constructor(t,n,r,o){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this._dirty=!0,this.effect=new Qr(t,()=>{this._dirty||(this._dirty=!0,Zs(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!o,this.__v_isReadonly=r}get value(){const t=ae(this);return Qs(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}function ya(e,t,n=!1){let r,o;const s=X(e);return s?(r=e,o=Ye):(r=e.get,o=e.set),new va(r,o,s||!o,n)}function yt(e,t,n,r){let o;try{o=r?e(...r):e()}catch(s){En(s,t,n)}return o}function Ue(e,t,n,r){if(X(e)){const s=yt(e,t,n,r);return s&&Ns(s)&&s.catch(l=>{En(l,t,n)}),s}const o=[];for(let s=0;s>>1;gn(De[r])nt&&De.splice(t,1)}function ol(e,t,n,r){G(e)?n.push(...e):(!t||!t.includes(e,e.allowRecurse?r+1:r))&&n.push(e),rl()}function Ea(e){ol(e,on,ln,Ht)}function Ca(e){ol(e,ht,an,zt)}function Xn(e,t=null){if(ln.length){for(Ar=t,on=[...new Set(ln)],ln.length=0,Ht=0;Htgn(n)-gn(r)),zt=0;zte.id==null?1/0:e.id;function sl(e){Lr=!1,Hn=!0,Xn(e),De.sort((n,r)=>gn(n)-gn(r));const t=Ye;try{for(nt=0;ntg.trim())),d&&(o=n.map(Hs))}let i,a=r[i=ur(t)]||r[i=ur(Xe(t))];!a&&s&&(a=r[i=ur(Mt(t))]),a&&Ue(a,e,6,o);const c=r[i+"Once"];if(c){if(!e.emitted)e.emitted={};else if(e.emitted[i])return;e.emitted[i]=!0,Ue(c,e,6,o)}}function ll(e,t,n=!1){const r=t.emitsCache,o=r.get(e);if(o!==void 0)return o;const s=e.emits;let l={},i=!1;if(!X(e)){const a=c=>{const u=ll(c,t,!0);u&&(i=!0,Se(l,u))};!n&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}return!s&&!i?(r.set(e,null),null):(G(s)?s.forEach(a=>l[a]=null):Se(l,s),r.set(e,l),l)}function er(e,t){return!e||!wn(t)?!1:(t=t.slice(2).replace(/Once$/,""),re(e,t[0].toLowerCase()+t.slice(1))||re(e,Mt(t))||re(e,t))}let Pe=null,il=null;function $n(e){const t=Pe;return Pe=e,il=e&&e.type.__scopeId||null,t}function Sa(e,t=Pe,n){if(!t||e._n)return e;const r=(...o)=>{r._d&&Bo(-1);const s=$n(t),l=e(...o);return $n(s),r._d&&Bo(1),l};return r._n=!0,r._c=!0,r._d=!0,r}function dr(e){const{type:t,vnode:n,proxy:r,withProxy:o,props:s,propsOptions:[l],slots:i,attrs:a,emit:c,render:u,renderCache:d,data:h,setupState:g,ctx:_,inheritAttrs:L}=e;let R,m;const b=$n(e);try{if(n.shapeFlag&4){const N=o||r;R=Ke(u.call(N,N,d,s,g,h,_)),m=a}else{const N=t;R=Ke(N.length>1?N(s,{attrs:a,slots:i,emit:c}):N(s,null)),m=t.props?a:Pa(a)}}catch(N){un.length=0,En(N,e,1),R=be(Fe)}let S=R;if(m&&L!==!1){const N=Object.keys(m),{shapeFlag:B}=S;N.length&&B&7&&(l&&N.some(Wr)&&(m=Ra(m,l)),S=_t(S,m))}return n.dirs&&(S=_t(S),S.dirs=S.dirs?S.dirs.concat(n.dirs):n.dirs),n.transition&&(S.transition=n.transition),R=S,$n(b),R}const Pa=e=>{let t;for(const n in e)(n==="class"||n==="style"||wn(n))&&((t||(t={}))[n]=e[n]);return t},Ra=(e,t)=>{const n={};for(const r in e)(!Wr(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function Ta(e,t,n){const{props:r,children:o,component:s}=e,{props:l,children:i,patchFlag:a}=t,c=s.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&a>=0){if(a&1024)return!0;if(a&16)return r?Ao(r,l,c):!!l;if(a&8){const u=t.dynamicProps;for(let d=0;de.__isSuspense;function al(e,t){t&&t.pendingBranch?G(e)?t.effects.push(...e):t.effects.push(e):Ca(e)}function It(e,t){if(Ee){let n=Ee.provides;const r=Ee.parent&&Ee.parent.provides;r===n&&(n=Ee.provides=Object.create(r)),n[e]=t}}function xe(e,t,n=!1){const r=Ee||Pe;if(r){const o=r.parent==null?r.vnode.appContext&&r.vnode.appContext.provides:r.parent.provides;if(o&&e in o)return o[e];if(arguments.length>1)return n&&X(t)?t.call(r.proxy):t}}const Io={};function ot(e,t,n){return cl(e,t,n)}function cl(e,t,{immediate:n,deep:r,flush:o,onTrack:s,onTrigger:l}=pe){const i=Ee;let a,c=!1,u=!1;if(Ce(e)?(a=()=>e.value,c=Or(e)):Ut(e)?(a=()=>e,r=!0):G(e)?(u=!0,c=e.some(m=>Ut(m)||Or(m)),a=()=>e.map(m=>{if(Ce(m))return m.value;if(Ut(m))return Lt(m);if(X(m))return yt(m,i,2)})):X(e)?t?a=()=>yt(e,i,2):a=()=>{if(!(i&&i.isUnmounted))return d&&d(),Ue(e,i,3,[h])}:a=Ye,t&&r){const m=a;a=()=>Lt(m())}let d,h=m=>{d=R.onStop=()=>{yt(m,i,4)}};if(Wt)return h=Ye,t?n&&Ue(t,i,3,[a(),u?[]:void 0,h]):a(),Ye;let g=u?[]:Io;const _=()=>{if(!!R.active)if(t){const m=R.run();(r||c||(u?m.some((b,S)=>hn(b,g[S])):hn(m,g)))&&(d&&d(),Ue(t,i,3,[m,g===Io?void 0:g,h]),g=m)}else R.run()};_.allowRecurse=!!t;let L;o==="sync"?L=_:o==="post"?L=()=>Le(_,i&&i.suspense):L=()=>Ea(_);const R=new Qr(a,L);return t?n?_():g=R.run():o==="post"?Le(R.run.bind(R),i&&i.suspense):R.run(),()=>{R.stop(),i&&i.scope&&qr(i.scope.effects,R)}}function Aa(e,t,n){const r=this.proxy,o=me(e)?e.includes(".")?ul(r,e):()=>r[e]:e.bind(r,r);let s;X(t)?s=t:(s=t.handler,n=t);const l=Ee;Kt(this);const i=cl(o,s.bind(r),n);return l?Kt(l):kt(),i}function ul(e,t){const n=t.split(".");return()=>{let r=e;for(let o=0;o{Lt(n,t)});else if(Fs(e))for(const n in e)Lt(e[n],t);return e}function Ia(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return it(()=>{e.isMounted=!0}),nr(()=>{e.isUnmounting=!0}),e}const Be=[Function,Array],ka={name:"BaseTransition",props:{mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Be,onEnter:Be,onAfterEnter:Be,onEnterCancelled:Be,onBeforeLeave:Be,onLeave:Be,onAfterLeave:Be,onLeaveCancelled:Be,onBeforeAppear:Be,onAppear:Be,onAfterAppear:Be,onAppearCancelled:Be},setup(e,{slots:t}){const n=kl(),r=Ia();let o;return()=>{const s=t.default&&hl(t.default(),!0);if(!s||!s.length)return;let l=s[0];if(s.length>1){for(const L of s)if(L.type!==Fe){l=L;break}}const i=ae(e),{mode:a}=i;if(r.isLeaving)return hr(l);const c=ko(l);if(!c)return hr(l);const u=Ir(c,i,r,n);kr(c,u);const d=n.subTree,h=d&&ko(d);let g=!1;const{getTransitionKey:_}=c.type;if(_){const L=_();o===void 0?o=L:L!==o&&(o=L,g=!0)}if(h&&h.type!==Fe&&(!Tt(c,h)||g)){const L=Ir(h,i,r,n);if(kr(h,L),a==="out-in")return r.isLeaving=!0,L.afterLeave=()=>{r.isLeaving=!1,n.update()},hr(l);a==="in-out"&&c.type!==Fe&&(L.delayLeave=(R,m,b)=>{const S=dl(r,h);S[String(h.key)]=h,R._leaveCb=()=>{m(),R._leaveCb=void 0,delete u.delayedLeave},u.delayedLeave=b})}return l}}},fl=ka;function dl(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function Ir(e,t,n,r){const{appear:o,mode:s,persisted:l=!1,onBeforeEnter:i,onEnter:a,onAfterEnter:c,onEnterCancelled:u,onBeforeLeave:d,onLeave:h,onAfterLeave:g,onLeaveCancelled:_,onBeforeAppear:L,onAppear:R,onAfterAppear:m,onAppearCancelled:b}=t,S=String(e.key),N=dl(n,e),B=(v,Y)=>{v&&Ue(v,r,9,Y)},z=(v,Y)=>{const $=Y[1];B(v,Y),G(v)?v.every(K=>K.length<=1)&&$():v.length<=1&&$()},M={mode:s,persisted:l,beforeEnter(v){let Y=i;if(!n.isMounted)if(o)Y=L||i;else return;v._leaveCb&&v._leaveCb(!0);const $=N[S];$&&Tt(e,$)&&$.el._leaveCb&&$.el._leaveCb(),B(Y,[v])},enter(v){let Y=a,$=c,K=u;if(!n.isMounted)if(o)Y=R||a,$=m||c,K=b||u;else return;let w=!1;const D=v._enterCb=A=>{w||(w=!0,A?B(K,[v]):B($,[v]),M.delayedLeave&&M.delayedLeave(),v._enterCb=void 0)};Y?z(Y,[v,D]):D()},leave(v,Y){const $=String(e.key);if(v._enterCb&&v._enterCb(!0),n.isUnmounting)return Y();B(d,[v]);let K=!1;const w=v._leaveCb=D=>{K||(K=!0,Y(),D?B(_,[v]):B(g,[v]),v._leaveCb=void 0,N[$]===e&&delete N[$])};N[$]=e,h?z(h,[v,w]):w()},clone(v){return Ir(v,t,n,r)}};return M}function hr(e){if(Cn(e))return e=_t(e),e.children=null,e}function ko(e){return Cn(e)?e.children?e.children[0]:void 0:e}function kr(e,t){e.shapeFlag&6&&e.component?kr(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function hl(e,t=!1,n){let r=[],o=0;for(let s=0;s1)for(let s=0;s!!e.type.__asyncLoader;function Me(e){X(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:r,delay:o=200,timeout:s,suspensible:l=!0,onError:i}=e;let a=null,c,u=0;const d=()=>(u++,a=null,h()),h=()=>{let g;return a||(g=a=t().catch(_=>{if(_=_ instanceof Error?_:new Error(String(_)),i)return new Promise((L,R)=>{i(_,()=>L(d()),()=>R(_),u+1)});throw _}).then(_=>g!==a&&a?a:(_&&(_.__esModule||_[Symbol.toStringTag]==="Module")&&(_=_.default),c=_,_)))};return ze({name:"AsyncComponentWrapper",__asyncLoader:h,get __asyncResolved(){return c},setup(){const g=Ee;if(c)return()=>pr(c,g);const _=b=>{a=null,En(b,g,13,!r)};if(l&&g.suspense||Wt)return h().then(b=>()=>pr(b,g)).catch(b=>(_(b),()=>r?be(r,{error:b}):null));const L=ye(!1),R=ye(),m=ye(!!o);return o&&setTimeout(()=>{m.value=!1},o),s!=null&&setTimeout(()=>{if(!L.value&&!R.value){const b=new Error(`Async component timed out after ${s}ms.`);_(b),R.value=b}},s),h().then(()=>{L.value=!0,g.parent&&Cn(g.parent.vnode)&&lo(g.parent.update)}).catch(b=>{_(b),R.value=b}),()=>{if(L.value&&c)return pr(c,g);if(R.value&&r)return be(r,{error:R.value});if(n&&!m.value)return be(n)}}})}function pr(e,{vnode:{ref:t,props:n,children:r,shapeFlag:o},parent:s}){const l=be(e,n,r);return l.ref=t,l}const Cn=e=>e.type.__isKeepAlive;function Ma(e,t){pl(e,"a",t)}function Na(e,t){pl(e,"da",t)}function pl(e,t,n=Ee){const r=e.__wdc||(e.__wdc=()=>{let o=n;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(tr(t,r,n),n){let o=n.parent;for(;o&&o.parent;)Cn(o.parent.vnode)&&Da(r,t,n,o),o=o.parent}}function Da(e,t,n,r){const o=tr(t,e,r,!0);io(()=>{qr(r[t],o)},n)}function tr(e,t,n=Ee,r=!1){if(n){const o=n[e]||(n[e]=[]),s=t.__weh||(t.__weh=(...l)=>{if(n.isUnmounted)return;Gt(),Kt(n);const i=Ue(t,n,e,l);return kt(),Jt(),i});return r?o.unshift(s):o.push(s),s}}const lt=e=>(t,n=Ee)=>(!Wt||e==="sp")&&tr(e,t,n),ml=lt("bm"),it=lt("m"),Fa=lt("bu"),Ha=lt("u"),nr=lt("bum"),io=lt("um"),za=lt("sp"),$a=lt("rtg"),Ba=lt("rtc");function ja(e,t=Ee){tr("ec",e,t)}function fh(e,t){const n=Pe;if(n===null)return e;const r=sr(n)||n.proxy,o=e.dirs||(e.dirs=[]);for(let s=0;st(l,i,void 0,s&&s[i]));else{const l=Object.keys(e);o=new Array(l.length);for(let i=0,a=l.length;iVn(t)?!(t.type===Fe||t.type===Ae&&!yl(t.children)):!0)?e:null}const Mr=e=>e?Ml(e)?sr(e)||e.proxy:Mr(e.parent):null,Bn=Se(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Mr(e.parent),$root:e=>Mr(e.root),$emit:e=>e.emit,$options:e=>_l(e),$forceUpdate:e=>e.f||(e.f=()=>lo(e.update)),$nextTick:e=>e.n||(e.n=so.bind(e.proxy)),$watch:e=>Aa.bind(e)}),Wa={get({_:e},t){const{ctx:n,setupState:r,data:o,props:s,accessCache:l,type:i,appContext:a}=e;let c;if(t[0]!=="$"){const g=l[t];if(g!==void 0)switch(g){case 1:return r[t];case 2:return o[t];case 4:return n[t];case 3:return s[t]}else{if(r!==pe&&re(r,t))return l[t]=1,r[t];if(o!==pe&&re(o,t))return l[t]=2,o[t];if((c=e.propsOptions[0])&&re(c,t))return l[t]=3,s[t];if(n!==pe&&re(n,t))return l[t]=4,n[t];Nr&&(l[t]=0)}}const u=Bn[t];let d,h;if(u)return t==="$attrs"&&He(e,"get",t),u(e);if((d=i.__cssModules)&&(d=d[t]))return d;if(n!==pe&&re(n,t))return l[t]=4,n[t];if(h=a.config.globalProperties,re(h,t))return h[t]},set({_:e},t,n){const{data:r,setupState:o,ctx:s}=e;return o!==pe&&re(o,t)?(o[t]=n,!0):r!==pe&&re(r,t)?(r[t]=n,!0):re(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(s[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:o,propsOptions:s}},l){let i;return!!n[l]||e!==pe&&re(e,l)||t!==pe&&re(t,l)||(i=s[0])&&re(i,l)||re(r,l)||re(Bn,l)||re(o.config.globalProperties,l)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:re(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};let Nr=!0;function qa(e){const t=_l(e),n=e.proxy,r=e.ctx;Nr=!1,t.beforeCreate&&No(t.beforeCreate,e,"bc");const{data:o,computed:s,methods:l,watch:i,provide:a,inject:c,created:u,beforeMount:d,mounted:h,beforeUpdate:g,updated:_,activated:L,deactivated:R,beforeDestroy:m,beforeUnmount:b,destroyed:S,unmounted:N,render:B,renderTracked:z,renderTriggered:M,errorCaptured:v,serverPrefetch:Y,expose:$,inheritAttrs:K,components:w,directives:D,filters:A}=t;if(c&&Ya(c,r,null,e.appContext.config.unwrapInjectedRef),l)for(const Z in l){const te=l[Z];X(te)&&(r[Z]=te.bind(n))}if(o){const Z=o.call(n,n);we(Z)&&(e.data=Qt(Z))}if(Nr=!0,s)for(const Z in s){const te=s[Z],_e=X(te)?te.bind(n,n):X(te.get)?te.get.bind(n,n):Ye,Re=!X(te)&&X(te.set)?te.set.bind(n):Ye,Ie=ue({get:_e,set:Re});Object.defineProperty(r,Z,{enumerable:!0,configurable:!0,get:()=>Ie.value,set:$e=>Ie.value=$e})}if(i)for(const Z in i)bl(i[Z],r,n,Z);if(a){const Z=X(a)?a.call(n):a;Reflect.ownKeys(Z).forEach(te=>{It(te,Z[te])})}u&&No(u,e,"c");function H(Z,te){G(te)?te.forEach(_e=>Z(_e.bind(n))):te&&Z(te.bind(n))}if(H(ml,d),H(it,h),H(Fa,g),H(Ha,_),H(Ma,L),H(Na,R),H(ja,v),H(Ba,z),H($a,M),H(nr,b),H(io,N),H(za,Y),G($))if($.length){const Z=e.exposed||(e.exposed={});$.forEach(te=>{Object.defineProperty(Z,te,{get:()=>n[te],set:_e=>n[te]=_e})})}else e.exposed||(e.exposed={});B&&e.render===Ye&&(e.render=B),K!=null&&(e.inheritAttrs=K),w&&(e.components=w),D&&(e.directives=D)}function Ya(e,t,n=Ye,r=!1){G(e)&&(e=Dr(e));for(const o in e){const s=e[o];let l;we(s)?"default"in s?l=xe(s.from||o,s.default,!0):l=xe(s.from||o):l=xe(s),Ce(l)&&r?Object.defineProperty(t,o,{enumerable:!0,configurable:!0,get:()=>l.value,set:i=>l.value=i}):t[o]=l}}function No(e,t,n){Ue(G(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function bl(e,t,n,r){const o=r.includes(".")?ul(n,r):()=>n[r];if(me(e)){const s=t[e];X(s)&&ot(o,s)}else if(X(e))ot(o,e.bind(n));else if(we(e))if(G(e))e.forEach(s=>bl(s,t,n,r));else{const s=X(e.handler)?e.handler.bind(n):t[e.handler];X(s)&&ot(o,s,e)}}function _l(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:o,optionsCache:s,config:{optionMergeStrategies:l}}=e.appContext,i=s.get(t);let a;return i?a=i:!o.length&&!n&&!r?a=t:(a={},o.length&&o.forEach(c=>jn(a,c,l,!0)),jn(a,t,l)),s.set(t,a),a}function jn(e,t,n,r=!1){const{mixins:o,extends:s}=t;s&&jn(e,s,n,!0),o&&o.forEach(l=>jn(e,l,n,!0));for(const l in t)if(!(r&&l==="expose")){const i=Ga[l]||n&&n[l];e[l]=i?i(e[l],t[l]):t[l]}return e}const Ga={data:Do,props:St,emits:St,methods:St,computed:St,beforeCreate:Te,created:Te,beforeMount:Te,mounted:Te,beforeUpdate:Te,updated:Te,beforeDestroy:Te,beforeUnmount:Te,destroyed:Te,unmounted:Te,activated:Te,deactivated:Te,errorCaptured:Te,serverPrefetch:Te,components:St,directives:St,watch:Qa,provide:Do,inject:Ja};function Do(e,t){return t?e?function(){return Se(X(e)?e.call(this,this):e,X(t)?t.call(this,this):t)}:t:e}function Ja(e,t){return St(Dr(e),Dr(t))}function Dr(e){if(G(e)){const t={};for(let n=0;n0)&&!(l&16)){if(l&8){const u=e.vnode.dynamicProps;for(let d=0;d{a=!0;const[h,g]=El(d,t,!0);Se(l,h),g&&i.push(...g)};!n&&t.mixins.length&&t.mixins.forEach(u),e.extends&&u(e.extends),e.mixins&&e.mixins.forEach(u)}if(!s&&!a)return r.set(e,Bt),Bt;if(G(s))for(let u=0;u-1,g[1]=L<0||_-1||re(g,"default"))&&i.push(d)}}}const c=[l,i];return r.set(e,c),c}function Fo(e){return e[0]!=="$"}function Ho(e){const t=e&&e.toString().match(/^\s*function (\w+)/);return t?t[1]:e===null?"null":""}function zo(e,t){return Ho(e)===Ho(t)}function $o(e,t){return G(t)?t.findIndex(n=>zo(n,e)):X(t)&&zo(t,e)?0:-1}const Cl=e=>e[0]==="_"||e==="$stable",ao=e=>G(e)?e.map(Ke):[Ke(e)],ec=(e,t,n)=>{if(t._n)return t;const r=Sa((...o)=>ao(t(...o)),n);return r._c=!1,r},xl=(e,t,n)=>{const r=e._ctx;for(const o in e){if(Cl(o))continue;const s=e[o];if(X(s))t[o]=ec(o,s,r);else if(s!=null){const l=ao(s);t[o]=()=>l}}},Sl=(e,t)=>{const n=ao(t);e.slots.default=()=>n},tc=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=ae(t),Fn(t,"_",n)):xl(t,e.slots={})}else e.slots={},t&&Sl(e,t);Fn(e.slots,or,1)},nc=(e,t,n)=>{const{vnode:r,slots:o}=e;let s=!0,l=pe;if(r.shapeFlag&32){const i=t._;i?n&&i===1?s=!1:(Se(o,t),!n&&i===1&&delete o._):(s=!t.$stable,xl(t,o)),l=t}else t&&(Sl(e,t),l={default:1});if(s)for(const i in o)!Cl(i)&&!(i in l)&&delete o[i]};function Pl(){return{app:null,config:{isNativeTag:Oi,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let rc=0;function oc(e,t){return function(r,o=null){X(r)||(r=Object.assign({},r)),o!=null&&!we(o)&&(o=null);const s=Pl(),l=new Set;let i=!1;const a=s.app={_uid:rc++,_component:r,_props:o,_container:null,_context:s,_instance:null,version:Cc,get config(){return s.config},set config(c){},use(c,...u){return l.has(c)||(c&&X(c.install)?(l.add(c),c.install(a,...u)):X(c)&&(l.add(c),c(a,...u))),a},mixin(c){return s.mixins.includes(c)||s.mixins.push(c),a},component(c,u){return u?(s.components[c]=u,a):s.components[c]},directive(c,u){return u?(s.directives[c]=u,a):s.directives[c]},mount(c,u,d){if(!i){const h=be(r,o);return h.appContext=s,u&&t?t(h,c):e(h,c,d),i=!0,a._container=c,c.__vue_app__=a,sr(h.component)||h.component.proxy}},unmount(){i&&(e(null,a._container),delete a._container.__vue_app__)},provide(c,u){return s.provides[c]=u,a}};return a}}function Un(e,t,n,r,o=!1){if(G(e)){e.forEach((h,g)=>Un(h,t&&(G(t)?t[g]:t),n,r,o));return}if(Vt(r)&&!o)return;const s=r.shapeFlag&4?sr(r.component)||r.component.proxy:r.el,l=o?null:s,{i,r:a}=e,c=t&&t.r,u=i.refs===pe?i.refs={}:i.refs,d=i.setupState;if(c!=null&&c!==a&&(me(c)?(u[c]=null,re(d,c)&&(d[c]=null)):Ce(c)&&(c.value=null)),X(a))yt(a,i,12,[l,u]);else{const h=me(a),g=Ce(a);if(h||g){const _=()=>{if(e.f){const L=h?u[a]:a.value;o?G(L)&&qr(L,s):G(L)?L.includes(s)||L.push(s):h?(u[a]=[s],re(d,a)&&(d[a]=u[a])):(a.value=[s],e.k&&(u[e.k]=a.value))}else h?(u[a]=l,re(d,a)&&(d[a]=l)):g&&(a.value=l,e.k&&(u[e.k]=l))};l?(_.id=-1,Le(_,n)):_()}}}let ut=!1;const An=e=>/svg/.test(e.namespaceURI)&&e.tagName!=="foreignObject",In=e=>e.nodeType===8;function sc(e){const{mt:t,p:n,o:{patchProp:r,createText:o,nextSibling:s,parentNode:l,remove:i,insert:a,createComment:c}}=e,u=(m,b)=>{if(!b.hasChildNodes()){n(null,m,b),zn(),b._vnode=m;return}ut=!1,d(b.firstChild,m,null,null,null),zn(),b._vnode=m,ut&&console.error("Hydration completed but contains mismatches.")},d=(m,b,S,N,B,z=!1)=>{const M=In(m)&&m.data==="[",v=()=>L(m,b,S,N,B,M),{type:Y,ref:$,shapeFlag:K,patchFlag:w}=b,D=m.nodeType;b.el=m,w===-2&&(z=!1,b.dynamicChildren=null);let A=null;switch(Y){case vn:D!==3?b.children===""?(a(b.el=o(""),l(m),m),A=m):A=v():(m.data!==b.children&&(ut=!0,m.data=b.children),A=s(m));break;case Fe:D!==8||M?A=v():A=s(m);break;case cn:if(D!==1&&D!==3)A=v();else{A=m;const ne=!b.children.length;for(let H=0;H{z=z||!!b.dynamicChildren;const{type:M,props:v,patchFlag:Y,shapeFlag:$,dirs:K}=b,w=M==="input"&&K||M==="option";if(w||Y!==-1){if(K&&Ze(b,null,S,"created"),v)if(w||!z||Y&48)for(const A in v)(w&&A.endsWith("value")||wn(A)&&!sn(A))&&r(m,A,null,v[A],!1,void 0,S);else v.onClick&&r(m,"onClick",null,v.onClick,!1,void 0,S);let D;if((D=v&&v.onVnodeBeforeMount)&&je(D,S,b),K&&Ze(b,null,S,"beforeMount"),((D=v&&v.onVnodeMounted)||K)&&al(()=>{D&&je(D,S,b),K&&Ze(b,null,S,"mounted")},N),$&16&&!(v&&(v.innerHTML||v.textContent))){let A=g(m.firstChild,b,m,S,N,B,z);for(;A;){ut=!0;const ne=A;A=A.nextSibling,i(ne)}}else $&8&&m.textContent!==b.children&&(ut=!0,m.textContent=b.children)}return m.nextSibling},g=(m,b,S,N,B,z,M)=>{M=M||!!b.dynamicChildren;const v=b.children,Y=v.length;for(let $=0;${const{slotScopeIds:M}=b;M&&(B=B?B.concat(M):M);const v=l(m),Y=g(s(m),b,v,S,N,B,z);return Y&&In(Y)&&Y.data==="]"?s(b.anchor=Y):(ut=!0,a(b.anchor=c("]"),v,Y),Y)},L=(m,b,S,N,B,z)=>{if(ut=!0,b.el=null,z){const Y=R(m);for(;;){const $=s(m);if($&&$!==Y)i($);else break}}const M=s(m),v=l(m);return i(m),n(null,b,v,M,S,N,An(v),B),M},R=m=>{let b=0;for(;m;)if(m=s(m),m&&In(m)&&(m.data==="["&&b++,m.data==="]")){if(b===0)return s(m);b--}return m};return[u,d]}const Le=al;function lc(e){return ic(e,sc)}function ic(e,t){const n=Ni();n.__VUE__=!0;const{insert:r,remove:o,patchProp:s,createElement:l,createText:i,createComment:a,setText:c,setElementText:u,parentNode:d,nextSibling:h,setScopeId:g=Ye,cloneNode:_,insertStaticContent:L}=e,R=(f,p,y,x=null,C=null,T=null,F=!1,O=null,k=!!p.dynamicChildren)=>{if(f===p)return;f&&!Tt(f,p)&&(x=U(f),Oe(f,C,T,!0),f=null),p.patchFlag===-2&&(k=!1,p.dynamicChildren=null);const{type:P,ref:W,shapeFlag:V}=p;switch(P){case vn:m(f,p,y,x);break;case Fe:b(f,p,y,x);break;case cn:f==null&&S(p,y,x,F);break;case Ae:D(f,p,y,x,C,T,F,O,k);break;default:V&1?z(f,p,y,x,C,T,F,O,k):V&6?A(f,p,y,x,C,T,F,O,k):(V&64||V&128)&&P.process(f,p,y,x,C,T,F,O,k,fe)}W!=null&&C&&Un(W,f&&f.ref,T,p||f,!p)},m=(f,p,y,x)=>{if(f==null)r(p.el=i(p.children),y,x);else{const C=p.el=f.el;p.children!==f.children&&c(C,p.children)}},b=(f,p,y,x)=>{f==null?r(p.el=a(p.children||""),y,x):p.el=f.el},S=(f,p,y,x)=>{[f.el,f.anchor]=L(f.children,p,y,x,f.el,f.anchor)},N=({el:f,anchor:p},y,x)=>{let C;for(;f&&f!==p;)C=h(f),r(f,y,x),f=C;r(p,y,x)},B=({el:f,anchor:p})=>{let y;for(;f&&f!==p;)y=h(f),o(f),f=y;o(p)},z=(f,p,y,x,C,T,F,O,k)=>{F=F||p.type==="svg",f==null?M(p,y,x,C,T,F,O,k):$(f,p,C,T,F,O,k)},M=(f,p,y,x,C,T,F,O)=>{let k,P;const{type:W,props:V,shapeFlag:q,transition:Q,patchFlag:oe,dirs:de}=f;if(f.el&&_!==void 0&&oe===-1)k=f.el=_(f.el);else{if(k=f.el=l(f.type,T,V&&V.is,V),q&8?u(k,f.children):q&16&&Y(f.children,k,null,x,C,T&&W!=="foreignObject",F,O),de&&Ze(f,null,x,"created"),V){for(const ge in V)ge!=="value"&&!sn(ge)&&s(k,ge,null,V[ge],T,f.children,x,C,I);"value"in V&&s(k,"value",null,V.value),(P=V.onVnodeBeforeMount)&&je(P,x,f)}v(k,f,f.scopeId,F,x)}de&&Ze(f,null,x,"beforeMount");const he=(!C||C&&!C.pendingBranch)&&Q&&!Q.persisted;he&&Q.beforeEnter(k),r(k,p,y),((P=V&&V.onVnodeMounted)||he||de)&&Le(()=>{P&&je(P,x,f),he&&Q.enter(k),de&&Ze(f,null,x,"mounted")},C)},v=(f,p,y,x,C)=>{if(y&&g(f,y),x)for(let T=0;T{for(let P=k;P{const O=p.el=f.el;let{patchFlag:k,dynamicChildren:P,dirs:W}=p;k|=f.patchFlag&16;const V=f.props||pe,q=p.props||pe;let Q;y&&Et(y,!1),(Q=q.onVnodeBeforeUpdate)&&je(Q,y,p,f),W&&Ze(p,f,y,"beforeUpdate"),y&&Et(y,!0);const oe=C&&p.type!=="foreignObject";if(P?K(f.dynamicChildren,P,O,y,x,oe,T):F||_e(f,p,O,null,y,x,oe,T,!1),k>0){if(k&16)w(O,p,V,q,y,x,C);else if(k&2&&V.class!==q.class&&s(O,"class",null,q.class,C),k&4&&s(O,"style",V.style,q.style,C),k&8){const de=p.dynamicProps;for(let he=0;he{Q&&je(Q,y,p,f),W&&Ze(p,f,y,"updated")},x)},K=(f,p,y,x,C,T,F)=>{for(let O=0;O{if(y!==x){for(const O in x){if(sn(O))continue;const k=x[O],P=y[O];k!==P&&O!=="value"&&s(f,O,P,k,F,p.children,C,T,I)}if(y!==pe)for(const O in y)!sn(O)&&!(O in x)&&s(f,O,y[O],null,F,p.children,C,T,I);"value"in x&&s(f,"value",y.value,x.value)}},D=(f,p,y,x,C,T,F,O,k)=>{const P=p.el=f?f.el:i(""),W=p.anchor=f?f.anchor:i("");let{patchFlag:V,dynamicChildren:q,slotScopeIds:Q}=p;Q&&(O=O?O.concat(Q):Q),f==null?(r(P,y,x),r(W,y,x),Y(p.children,y,W,C,T,F,O,k)):V>0&&V&64&&q&&f.dynamicChildren?(K(f.dynamicChildren,q,y,C,T,F,O),(p.key!=null||C&&p===C.subTree)&&Rl(f,p,!0)):_e(f,p,y,W,C,T,F,O,k)},A=(f,p,y,x,C,T,F,O,k)=>{p.slotScopeIds=O,f==null?p.shapeFlag&512?C.ctx.activate(p,y,x,F,k):ne(p,y,x,C,T,F,k):H(f,p,k)},ne=(f,p,y,x,C,T,F)=>{const O=f.component=gc(f,x,C);if(Cn(f)&&(O.ctx.renderer=fe),vc(O),O.asyncDep){if(C&&C.registerDep(O,Z),!f.el){const k=O.subTree=be(Fe);b(null,k,p,y)}return}Z(O,f,p,y,C,T,F)},H=(f,p,y)=>{const x=p.component=f.component;if(Ta(f,p,y))if(x.asyncDep&&!x.asyncResolved){te(x,p,y);return}else x.next=p,wa(x.update),x.update();else p.el=f.el,x.vnode=p},Z=(f,p,y,x,C,T,F)=>{const O=()=>{if(f.isMounted){let{next:W,bu:V,u:q,parent:Q,vnode:oe}=f,de=W,he;Et(f,!1),W?(W.el=oe.el,te(f,W,F)):W=oe,V&&fr(V),(he=W.props&&W.props.onVnodeBeforeUpdate)&&je(he,Q,W,oe),Et(f,!0);const ge=dr(f),Ve=f.subTree;f.subTree=ge,R(Ve,ge,d(Ve.el),U(Ve),f,C,T),W.el=ge.el,de===null&&Oa(f,ge.el),q&&Le(q,C),(he=W.props&&W.props.onVnodeUpdated)&&Le(()=>je(he,Q,W,oe),C)}else{let W;const{el:V,props:q}=p,{bm:Q,m:oe,parent:de}=f,he=Vt(p);if(Et(f,!1),Q&&fr(Q),!he&&(W=q&&q.onVnodeBeforeMount)&&je(W,de,p),Et(f,!0),V&&J){const ge=()=>{f.subTree=dr(f),J(V,f.subTree,f,C,null)};he?p.type.__asyncLoader().then(()=>!f.isUnmounted&&ge()):ge()}else{const ge=f.subTree=dr(f);R(null,ge,y,x,f,C,T),p.el=ge.el}if(oe&&Le(oe,C),!he&&(W=q&&q.onVnodeMounted)){const ge=p;Le(()=>je(W,de,ge),C)}(p.shapeFlag&256||de&&Vt(de.vnode)&&de.vnode.shapeFlag&256)&&f.a&&Le(f.a,C),f.isMounted=!0,p=y=x=null}},k=f.effect=new Qr(O,()=>lo(P),f.scope),P=f.update=()=>k.run();P.id=f.uid,Et(f,!0),P()},te=(f,p,y)=>{p.component=f;const x=f.vnode.props;f.vnode=p,f.next=null,Xa(f,p.props,x,y),nc(f,p.children,y),Gt(),Xn(void 0,f.update),Jt()},_e=(f,p,y,x,C,T,F,O,k=!1)=>{const P=f&&f.children,W=f?f.shapeFlag:0,V=p.children,{patchFlag:q,shapeFlag:Q}=p;if(q>0){if(q&128){Ie(P,V,y,x,C,T,F,O,k);return}else if(q&256){Re(P,V,y,x,C,T,F,O,k);return}}Q&8?(W&16&&I(P,C,T),V!==P&&u(y,V)):W&16?Q&16?Ie(P,V,y,x,C,T,F,O,k):I(P,C,T,!0):(W&8&&u(y,""),Q&16&&Y(V,y,x,C,T,F,O,k))},Re=(f,p,y,x,C,T,F,O,k)=>{f=f||Bt,p=p||Bt;const P=f.length,W=p.length,V=Math.min(P,W);let q;for(q=0;qW?I(f,C,T,!0,!1,V):Y(p,y,x,C,T,F,O,k,V)},Ie=(f,p,y,x,C,T,F,O,k)=>{let P=0;const W=p.length;let V=f.length-1,q=W-1;for(;P<=V&&P<=q;){const Q=f[P],oe=p[P]=k?pt(p[P]):Ke(p[P]);if(Tt(Q,oe))R(Q,oe,y,null,C,T,F,O,k);else break;P++}for(;P<=V&&P<=q;){const Q=f[V],oe=p[q]=k?pt(p[q]):Ke(p[q]);if(Tt(Q,oe))R(Q,oe,y,null,C,T,F,O,k);else break;V--,q--}if(P>V){if(P<=q){const Q=q+1,oe=Qq)for(;P<=V;)Oe(f[P],C,T,!0),P++;else{const Q=P,oe=P,de=new Map;for(P=oe;P<=q;P++){const ke=p[P]=k?pt(p[P]):Ke(p[P]);ke.key!=null&&de.set(ke.key,P)}let he,ge=0;const Ve=q-oe+1;let Nt=!1,bo=0;const Zt=new Array(Ve);for(P=0;P=Ve){Oe(ke,C,T,!0);continue}let Qe;if(ke.key!=null)Qe=de.get(ke.key);else for(he=oe;he<=q;he++)if(Zt[he-oe]===0&&Tt(ke,p[he])){Qe=he;break}Qe===void 0?Oe(ke,C,T,!0):(Zt[Qe-oe]=P+1,Qe>=bo?bo=Qe:Nt=!0,R(ke,p[Qe],y,null,C,T,F,O,k),ge++)}const _o=Nt?ac(Zt):Bt;for(he=_o.length-1,P=Ve-1;P>=0;P--){const ke=oe+P,Qe=p[ke],wo=ke+1{const{el:T,type:F,transition:O,children:k,shapeFlag:P}=f;if(P&6){$e(f.component.subTree,p,y,x);return}if(P&128){f.suspense.move(p,y,x);return}if(P&64){F.move(f,p,y,fe);return}if(F===Ae){r(T,p,y);for(let V=0;VO.enter(T),C);else{const{leave:V,delayLeave:q,afterLeave:Q}=O,oe=()=>r(T,p,y),de=()=>{V(T,()=>{oe(),Q&&Q()})};q?q(T,oe,de):de()}else r(T,p,y)},Oe=(f,p,y,x=!1,C=!1)=>{const{type:T,props:F,ref:O,children:k,dynamicChildren:P,shapeFlag:W,patchFlag:V,dirs:q}=f;if(O!=null&&Un(O,null,y,f,!0),W&256){p.ctx.deactivate(f);return}const Q=W&1&&q,oe=!Vt(f);let de;if(oe&&(de=F&&F.onVnodeBeforeUnmount)&&je(de,p,f),W&6)j(f.component,y,x);else{if(W&128){f.suspense.unmount(y,x);return}Q&&Ze(f,null,p,"beforeUnmount"),W&64?f.type.remove(f,p,y,C,fe,x):P&&(T!==Ae||V>0&&V&64)?I(P,p,y,!1,!0):(T===Ae&&V&384||!C&&W&16)&&I(k,p,y),x&&wt(f)}(oe&&(de=F&&F.onVnodeUnmounted)||Q)&&Le(()=>{de&&je(de,p,f),Q&&Ze(f,null,p,"unmounted")},y)},wt=f=>{const{type:p,el:y,anchor:x,transition:C}=f;if(p===Ae){E(y,x);return}if(p===cn){B(f);return}const T=()=>{o(y),C&&!C.persisted&&C.afterLeave&&C.afterLeave()};if(f.shapeFlag&1&&C&&!C.persisted){const{leave:F,delayLeave:O}=C,k=()=>F(y,T);O?O(f.el,T,k):k()}else T()},E=(f,p)=>{let y;for(;f!==p;)y=h(f),o(f),f=y;o(p)},j=(f,p,y)=>{const{bum:x,scope:C,update:T,subTree:F,um:O}=f;x&&fr(x),C.stop(),T&&(T.active=!1,Oe(F,f,p,y)),O&&Le(O,p),Le(()=>{f.isUnmounted=!0},p),p&&p.pendingBranch&&!p.isUnmounted&&f.asyncDep&&!f.asyncResolved&&f.suspenseId===p.pendingId&&(p.deps--,p.deps===0&&p.resolve())},I=(f,p,y,x=!1,C=!1,T=0)=>{for(let F=T;Ff.shapeFlag&6?U(f.component.subTree):f.shapeFlag&128?f.suspense.next():h(f.anchor||f.el),le=(f,p,y)=>{f==null?p._vnode&&Oe(p._vnode,null,null,!0):R(p._vnode||null,f,p,null,null,null,y),zn(),p._vnode=f},fe={p:R,um:Oe,m:$e,r:wt,mt:ne,mc:Y,pc:_e,pbc:K,n:U,o:e};let ee,J;return t&&([ee,J]=t(fe)),{render:le,hydrate:ee,createApp:oc(le,ee)}}function Et({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function Rl(e,t,n=!1){const r=e.children,o=t.children;if(G(r)&&G(o))for(let s=0;s>1,e[n[i]]0&&(t[r]=n[s-1]),n[s]=r)}}for(s=n.length,l=n[s-1];s-- >0;)n[s]=l,l=t[l];return n}const cc=e=>e.__isTeleport,Ae=Symbol(void 0),vn=Symbol(void 0),Fe=Symbol(void 0),cn=Symbol(void 0),un=[];let qe=null;function rr(e=!1){un.push(qe=e?null:[])}function uc(){un.pop(),qe=un[un.length-1]||null}let yn=1;function Bo(e){yn+=e}function Tl(e){return e.dynamicChildren=yn>0?qe||Bt:null,uc(),yn>0&&qe&&qe.push(e),e}function Ol(e,t,n,r,o,s){return Tl(Il(e,t,n,r,o,s,!0))}function Ll(e,t,n,r,o){return Tl(be(e,t,n,r,o,!0))}function Vn(e){return e?e.__v_isVNode===!0:!1}function Tt(e,t){return e.type===t.type&&e.key===t.key}const or="__vInternal",Al=({key:e})=>e!=null?e:null,Nn=({ref:e,ref_key:t,ref_for:n})=>e!=null?me(e)||Ce(e)||X(e)?{i:Pe,r:e,k:t,f:!!n}:e:null;function Il(e,t=null,n=null,r=0,o=null,s=e===Ae?0:1,l=!1,i=!1){const a={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Al(t),ref:t&&Nn(t),scopeId:il,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:s,patchFlag:r,dynamicProps:o,dynamicChildren:null,appContext:null};return i?(uo(a,n),s&128&&e.normalize(a)):n&&(a.shapeFlag|=me(n)?8:16),yn>0&&!l&&qe&&(a.patchFlag>0||s&6)&&a.patchFlag!==32&&qe.push(a),a}const be=fc;function fc(e,t=null,n=null,r=0,o=null,s=!1){if((!e||e===Va)&&(e=Fe),Vn(e)){const i=_t(e,t,!0);return n&&uo(i,n),yn>0&&!s&&qe&&(i.shapeFlag&6?qe[qe.indexOf(e)]=i:qe.push(i)),i.patchFlag|=-2,i}if(Ec(e)&&(e=e.__vccOpts),t){t=dc(t);let{class:i,style:a}=t;i&&!me(i)&&(t.class=_n(i)),we(a)&&(Gs(a)&&!G(a)&&(a=Se({},a)),t.style=Yn(a))}const l=me(e)?1:La(e)?128:cc(e)?64:we(e)?4:X(e)?2:0;return Il(e,t,n,r,o,l,s,!0)}function dc(e){return e?Gs(e)||or in e?Se({},e):e:null}function _t(e,t,n=!1){const{props:r,ref:o,patchFlag:s,children:l}=e,i=t?hc(r||{},t):r;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:i,key:i&&Al(i),ref:t&&t.ref?n&&o?G(o)?o.concat(Nn(t)):[o,Nn(t)]:Nn(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:l,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Ae?s===-1?16:s|16:s,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&_t(e.ssContent),ssFallback:e.ssFallback&&_t(e.ssFallback),el:e.el,anchor:e.anchor}}function co(e=" ",t=0){return be(vn,null,e,t)}function hh(e,t){const n=be(cn,null,e);return n.staticCount=t,n}function ph(e="",t=!1){return t?(rr(),Ll(Fe,null,e)):be(Fe,null,e)}function Ke(e){return e==null||typeof e=="boolean"?be(Fe):G(e)?be(Ae,null,e.slice()):typeof e=="object"?pt(e):be(vn,null,String(e))}function pt(e){return e.el===null||e.memo?e:_t(e)}function uo(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(G(t))n=16;else if(typeof t=="object")if(r&65){const o=t.default;o&&(o._c&&(o._d=!1),uo(e,o()),o._c&&(o._d=!0));return}else{n=32;const o=t._;!o&&!(or in t)?t._ctx=Pe:o===3&&Pe&&(Pe.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else X(t)?(t={default:t,_ctx:Pe},n=32):(t=String(t),r&64?(n=16,t=[co(t)]):n=8);e.children=t,e.shapeFlag|=n}function hc(...e){const t={};for(let n=0;nEe||Pe,Kt=e=>{Ee=e,e.scope.on()},kt=()=>{Ee&&Ee.scope.off(),Ee=null};function Ml(e){return e.vnode.shapeFlag&4}let Wt=!1;function vc(e,t=!1){Wt=t;const{props:n,children:r}=e.vnode,o=Ml(e);Za(e,n,o,t),tc(e,r);const s=o?yc(e,t):void 0;return Wt=!1,s}function yc(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=Js(new Proxy(e.ctx,Wa));const{setup:r}=n;if(r){const o=e.setupContext=r.length>1?_c(e):null;Kt(e),Gt();const s=yt(r,e,0,[e.props,o]);if(Jt(),kt(),Ns(s)){if(s.then(kt,kt),t)return s.then(l=>{jo(e,l,t)}).catch(l=>{En(l,e,0)});e.asyncDep=s}else jo(e,s,t)}else Nl(e,t)}function jo(e,t,n){X(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:we(t)&&(e.setupState=tl(t)),Nl(e,n)}let Uo;function Nl(e,t,n){const r=e.type;if(!e.render){if(!t&&Uo&&!r.render){const o=r.template;if(o){const{isCustomElement:s,compilerOptions:l}=e.appContext.config,{delimiters:i,compilerOptions:a}=r,c=Se(Se({isCustomElement:s,delimiters:i},l),a);r.render=Uo(o,c)}}e.render=r.render||Ye}Kt(e),Gt(),qa(e),Jt(),kt()}function bc(e){return new Proxy(e.attrs,{get(t,n){return He(e,"get","$attrs"),t[n]}})}function _c(e){const t=r=>{e.exposed=r||{}};let n;return{get attrs(){return n||(n=bc(e))},slots:e.slots,emit:e.emit,expose:t}}function sr(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(tl(Js(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Bn)return Bn[n](e)}}))}function wc(e,t=!0){return X(e)?e.displayName||e.name:e.name||t&&e.__name}function Ec(e){return X(e)&&"__vccOpts"in e}const ue=(e,t)=>ya(e,t,Wt);function ie(e,t,n){const r=arguments.length;return r===2?we(t)&&!G(t)?Vn(t)?be(e,null,[t]):be(e,t):be(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&Vn(n)&&(n=[n]),be(e,t,n))}const Cc="3.2.37",xc="http://www.w3.org/2000/svg",Ot=typeof document!="undefined"?document:null,Vo=Ot&&Ot.createElement("template"),Sc={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const o=t?Ot.createElementNS(xc,e):Ot.createElement(e,n?{is:n}:void 0);return e==="select"&&r&&r.multiple!=null&&o.setAttribute("multiple",r.multiple),o},createText:e=>Ot.createTextNode(e),createComment:e=>Ot.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Ot.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},cloneNode(e){const t=e.cloneNode(!0);return"_value"in e&&(t._value=e._value),t},insertStaticContent(e,t,n,r,o,s){const l=n?n.previousSibling:t.lastChild;if(o&&(o===s||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===s||!(o=o.nextSibling)););else{Vo.innerHTML=r?`${e}`:e;const i=Vo.content;if(r){const a=i.firstChild;for(;a.firstChild;)i.appendChild(a.firstChild);i.removeChild(a)}t.insertBefore(i,n)}return[l?l.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}};function Pc(e,t,n){const r=e._vtc;r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}function Rc(e,t,n){const r=e.style,o=me(n);if(n&&!o){for(const s in n)Hr(r,s,n[s]);if(t&&!me(t))for(const s in t)n[s]==null&&Hr(r,s,"")}else{const s=r.display;o?t!==n&&(r.cssText=n):t&&e.removeAttribute("style"),"_vod"in e&&(r.display=s)}}const Ko=/\s*!important$/;function Hr(e,t,n){if(G(n))n.forEach(r=>Hr(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=Tc(e,t);Ko.test(n)?e.setProperty(Mt(r),n.replace(Ko,""),"important"):e[r]=n}}const Wo=["Webkit","Moz","ms"],mr={};function Tc(e,t){const n=mr[t];if(n)return n;let r=Xe(t);if(r!=="filter"&&r in e)return mr[t]=r;r=Qn(r);for(let o=0;o{let e=Date.now,t=!1;if(typeof window!="undefined"){Date.now()>document.createEvent("Event").timeStamp&&(e=performance.now.bind(performance));const n=navigator.userAgent.match(/firefox\/(\d+)/i);t=!!(n&&Number(n[1])<=53)}return[e,t]})();let zr=0;const Ic=Promise.resolve(),kc=()=>{zr=0},Mc=()=>zr||(Ic.then(kc),zr=Dl());function Nc(e,t,n,r){e.addEventListener(t,n,r)}function Dc(e,t,n,r){e.removeEventListener(t,n,r)}function Fc(e,t,n,r,o=null){const s=e._vei||(e._vei={}),l=s[t];if(r&&l)l.value=r;else{const[i,a]=Hc(t);if(r){const c=s[t]=zc(r,o);Nc(e,i,c,a)}else l&&(Dc(e,i,l,a),s[t]=void 0)}}const Yo=/(?:Once|Passive|Capture)$/;function Hc(e){let t;if(Yo.test(e)){t={};let n;for(;n=e.match(Yo);)e=e.slice(0,e.length-n[0].length),t[n[0].toLowerCase()]=!0}return[Mt(e.slice(2)),t]}function zc(e,t){const n=r=>{const o=r.timeStamp||Dl();(Ac||o>=n.attached-1)&&Ue($c(r,n.value),t,5,[r])};return n.value=e,n.attached=Mc(),n}function $c(e,t){if(G(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>o=>!o._stopped&&r&&r(o))}else return t}const Go=/^on[a-z]/,Bc=(e,t,n,r,o=!1,s,l,i,a)=>{t==="class"?Pc(e,r,o):t==="style"?Rc(e,n,r):wn(t)?Wr(t)||Fc(e,t,n,r,l):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):jc(e,t,r,o))?Lc(e,t,r,s,l,i,a):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),Oc(e,t,r,o))};function jc(e,t,n,r){return r?!!(t==="innerHTML"||t==="textContent"||t in e&&Go.test(t)&&X(n)):t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||Go.test(t)&&me(n)?!1:t in e}const ft="transition",Xt="animation",fo=(e,{slots:t})=>ie(fl,Uc(e),t);fo.displayName="Transition";const Fl={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};fo.props=Se({},fl.props,Fl);const Ct=(e,t=[])=>{G(e)?e.forEach(n=>n(...t)):e&&e(...t)},Jo=e=>e?G(e)?e.some(t=>t.length>1):e.length>1:!1;function Uc(e){const t={};for(const w in e)w in Fl||(t[w]=e[w]);if(e.css===!1)return t;const{name:n="v",type:r,duration:o,enterFromClass:s=`${n}-enter-from`,enterActiveClass:l=`${n}-enter-active`,enterToClass:i=`${n}-enter-to`,appearFromClass:a=s,appearActiveClass:c=l,appearToClass:u=i,leaveFromClass:d=`${n}-leave-from`,leaveActiveClass:h=`${n}-leave-active`,leaveToClass:g=`${n}-leave-to`}=e,_=Vc(o),L=_&&_[0],R=_&&_[1],{onBeforeEnter:m,onEnter:b,onEnterCancelled:S,onLeave:N,onLeaveCancelled:B,onBeforeAppear:z=m,onAppear:M=b,onAppearCancelled:v=S}=t,Y=(w,D,A)=>{xt(w,D?u:i),xt(w,D?c:l),A&&A()},$=(w,D)=>{w._isLeaving=!1,xt(w,d),xt(w,g),xt(w,h),D&&D()},K=w=>(D,A)=>{const ne=w?M:b,H=()=>Y(D,w,A);Ct(ne,[D,H]),Qo(()=>{xt(D,w?a:s),dt(D,w?u:i),Jo(ne)||Zo(D,r,L,H)})};return Se(t,{onBeforeEnter(w){Ct(m,[w]),dt(w,s),dt(w,l)},onBeforeAppear(w){Ct(z,[w]),dt(w,a),dt(w,c)},onEnter:K(!1),onAppear:K(!0),onLeave(w,D){w._isLeaving=!0;const A=()=>$(w,D);dt(w,d),qc(),dt(w,h),Qo(()=>{!w._isLeaving||(xt(w,d),dt(w,g),Jo(N)||Zo(w,r,R,A))}),Ct(N,[w,A])},onEnterCancelled(w){Y(w,!1),Ct(S,[w])},onAppearCancelled(w){Y(w,!0),Ct(v,[w])},onLeaveCancelled(w){$(w),Ct(B,[w])}})}function Vc(e){if(e==null)return null;if(we(e))return[gr(e.enter),gr(e.leave)];{const t=gr(e);return[t,t]}}function gr(e){return Hs(e)}function dt(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e._vtc||(e._vtc=new Set)).add(t)}function xt(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const{_vtc:n}=e;n&&(n.delete(t),n.size||(e._vtc=void 0))}function Qo(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let Kc=0;function Zo(e,t,n,r){const o=e._endId=++Kc,s=()=>{o===e._endId&&r()};if(n)return setTimeout(s,n);const{type:l,timeout:i,propCount:a}=Wc(e,t);if(!l)return r();const c=l+"end";let u=0;const d=()=>{e.removeEventListener(c,h),s()},h=g=>{g.target===e&&++u>=a&&d()};setTimeout(()=>{u(n[_]||"").split(", "),o=r(ft+"Delay"),s=r(ft+"Duration"),l=Xo(o,s),i=r(Xt+"Delay"),a=r(Xt+"Duration"),c=Xo(i,a);let u=null,d=0,h=0;t===ft?l>0&&(u=ft,d=l,h=s.length):t===Xt?c>0&&(u=Xt,d=c,h=a.length):(d=Math.max(l,c),u=d>0?l>c?ft:Xt:null,h=u?u===ft?s.length:a.length:0);const g=u===ft&&/\b(transform|all)(,|$)/.test(n[ft+"Property"]);return{type:u,timeout:d,propCount:h,hasTransform:g}}function Xo(e,t){for(;e.lengthes(n)+es(e[r])))}function es(e){return Number(e.slice(0,-1).replace(",","."))*1e3}function qc(){return document.body.offsetHeight}const Yc={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},mh=(e,t)=>n=>{if(!("key"in n))return;const r=Mt(n.key);if(t.some(o=>o===r||Yc[o]===r))return e(n)},gh={beforeMount(e,{value:t},{transition:n}){e._vod=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):en(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),en(e,!0),r.enter(e)):r.leave(e,()=>{en(e,!1)}):en(e,t))},beforeUnmount(e,{value:t}){en(e,t)}};function en(e,t){e.style.display=t?e._vod:"none"}const Gc=Se({patchProp:Bc},Sc);let vr,ts=!1;function Jc(){return vr=ts?vr:lc(Gc),ts=!0,vr}const Qc=(...e)=>{const t=Jc().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=Zc(r);if(o)return n(o,!0,o instanceof SVGElement)},t};function Zc(e){return me(e)?document.querySelector(e):e}const Xc=JSON.parse('{"base":"/","lang":"en-US","title":"","description":"","head":[["link",{"rel":"icon","type":"image/png","sizes":"16x16","href":"/favicon-16.png"}],["link",{"rel":"icon","type":"image/png","sizes":"32x32","href":"/favicon-32.png"}],["meta",{"name":"theme-color","content":"#936edb"}],["meta",{"name":"og:title","content":"zProtect Documentation"}],["meta",{"name":"og:type","content":"website"}],["meta",{"name":"og:image","content":"/og.png"}],["meta",{"name":"og:url","content":"https://docs.zprotect.dev/"}]],"locales":{"/":{"lang":"en-US","title":"zProtect Documentation","description":"Documentation for all things zProtect."}}}');var eu=([e,t,n])=>e==="meta"&&t.name?`${e}.${t.name}`:["title","base"].includes(e)?e:e==="template"&&t.id?`${e}.${t.id}`:JSON.stringify([e,t,n]),tu=e=>{const t=new Set,n=[];return e.forEach(r=>{const o=eu(r);t.has(o)||(t.add(o),n.push(r))}),n},nu=e=>/^(https?:)?\/\//.test(e),vh=e=>/^mailto:/.test(e),yh=e=>/^tel:/.test(e),Hl=e=>Object.prototype.toString.call(e)==="[object Object]",ru=e=>e.replace(/\/$/,""),ou=e=>e.replace(/^\//,""),zl=(e,t)=>{const n=Object.keys(e).sort((r,o)=>{const s=o.split("/").length-r.split("/").length;return s!==0?s:o.length-r.length});for(const r of n)if(t.startsWith(r))return r;return"/"};const $l={"v-06f9211a":Me(()=>ve(()=>import("./commandline.html.18ab6d88.js"),[])),"v-31071e3e":Me(()=>ve(()=>import("./config.html.4750604a.js"),[])),"v-8daa1a0e":Me(()=>ve(()=>import("./index.html.8005e5a3.js"),[])),"v-08eb506c":Me(()=>ve(()=>import("./privacy.html.5ecb4b69.js"),[])),"v-e0bdb92a":Me(()=>ve(()=>import("./terms.html.a0651db1.js"),[])),"v-17d8839a":Me(()=>ve(()=>import("./0.1.html.94430b3b.js"),[])),"v-198d5c39":Me(()=>ve(()=>import("./0.2.html.ad5891ed.js"),[])),"v-d0e1d8bc":Me(()=>ve(()=>import("./commandline.html.4dc00259.js"),[])),"v-296358af":Me(()=>ve(()=>import("./config.html.2e9b9f19.js"),[])),"v-2d0ad528":Me(()=>ve(()=>import("./index.html.7c543494.js"),[])),"v-3706649a":Me(()=>ve(()=>import("./404.html.cbce7884.js"),[]))},su={404:Me(()=>ve(()=>import("./404.e86a7fd5.js"),[])),Layout:Me(()=>ve(()=>import("./Layout.d3d80637.js"),[]))};var Bl=ye(Ei),jl=to({key:"",path:"",title:"",lang:"",frontmatter:{},excerpt:"",headers:[]}),rt=ye(jl),xn=()=>rt;cr.webpackHot&&(__VUE_HMR_RUNTIME__.updatePageData=e=>{Bl.value[e.key]=()=>Promise.resolve(e),e.key===rt.value.key&&(rt.value=e)});var Ul=Symbol(""),lu=()=>{const e=xe(Ul);if(!e)throw new Error("usePageFrontmatter() is called without provider.");return e},Vl=Symbol(""),iu=()=>{const e=xe(Vl);if(!e)throw new Error("usePageHead() is called without provider.");return e},au=Symbol(""),Kl=Symbol(""),cu=()=>{const e=xe(Kl);if(!e)throw new Error("usePageLang() is called without provider.");return e},ho=Symbol(""),Wl=()=>{const e=xe(ho);if(!e)throw new Error("useRouteLocale() is called without provider.");return e},gt=ye(Xc),uu=()=>gt;cr.webpackHot&&(__VUE_HMR_RUNTIME__.updateSiteData=e=>{gt.value=e});var ql=Symbol(""),bh=()=>{const e=xe(ql);if(!e)throw new Error("useSiteLocaleData() is called without provider.");return e},fu=Symbol(""),Pt=Qt({resolvePageData:async e=>{const t=Bl.value[e],n=await(t==null?void 0:t());return n!=null?n:jl},resolvePageFrontmatter:e=>e.frontmatter,resolvePageHead:(e,t,n)=>{const r=me(t.description)?t.description:n.description,o=[...G(t.head)?t.head:[],...n.head,["title",{},e],["meta",{name:"description",content:r}]];return tu(o)},resolvePageHeadTitle:(e,t)=>`${e.title?`${e.title} | `:""}${t.title}`,resolvePageLang:e=>e.lang||"en",resolveRouteLocale:(e,t)=>zl(e,t),resolveSiteLocaleData:(e,t)=>({...e,...e.locales[t]})}),du=ze({name:"ClientOnly",setup(e,t){const n=ye(!1);return it(()=>{n.value=!0}),()=>{var r,o;return n.value?(o=(r=t.slots).default)==null?void 0:o.call(r):null}}}),hu=ze({name:"Content",props:{pageKey:{type:String,required:!1,default:""}},setup(e){const t=xn(),n=ue(()=>$l[e.pageKey||t.value.key]);return()=>n.value?ie(n.value):ie("div","404 Not Found")}}),ns=ze({name:"Vuepress",setup(){const e=xn(),t=ue(()=>{let n;if(e.value.path){const r=e.value.frontmatter.layout;me(r)?n=r:n="Layout"}else n="404";return su[n]||Ua(n,!1)});return()=>ie(t.value)}}),pu=e=>nu(e)?e:`${uu().value.base}${ou(e)}`,at=e=>e;function Yl(e,t,n){var r,o,s;t===void 0&&(t=50),n===void 0&&(n={});var l=(r=n.isImmediate)!=null&&r,i=(o=n.callback)!=null&&o,a=n.maxWait,c=Date.now(),u=[];function d(){if(a!==void 0){var g=Date.now()-c;if(g+t>=a)return a-g}return t}var h=function(){var g=[].slice.call(arguments),_=this;return new Promise(function(L,R){var m=l&&s===void 0;if(s!==void 0&&clearTimeout(s),s=setTimeout(function(){if(s=void 0,c=Date.now(),!l){var S=e.apply(_,g);i&&i(S),u.forEach(function(N){return(0,N.resolve)(S)}),u=[]}},d()),m){var b=e.apply(_,g);return i&&i(b),L(b)}u.push({resolve:L,reject:R})})};return h.cancel=function(g){s!==void 0&&clearTimeout(s),u.forEach(function(_){return(0,_.reject)(g)}),u=[]},h}/*! + * vue-router v4.1.4 + * (c) 2022 Eduardo San Martin Morote + * @license MIT + */const $t=typeof window!="undefined";function mu(e){return e.__esModule||e[Symbol.toStringTag]==="Module"}const ce=Object.assign;function yr(e,t){const n={};for(const r in t){const o=t[r];n[r]=Je(o)?o.map(e):e(o)}return n}const fn=()=>{},Je=Array.isArray,gu=/\/$/,vu=e=>e.replace(gu,"");function br(e,t,n="/"){let r,o={},s="",l="";const i=t.indexOf("#");let a=t.indexOf("?");return i=0&&(a=-1),a>-1&&(r=t.slice(0,a),s=t.slice(a+1,i>-1?i:t.length),o=e(s)),i>-1&&(r=r||t.slice(0,i),l=t.slice(i,t.length)),r=wu(r!=null?r:t,n),{fullPath:r+(s&&"?")+s+l,path:r,query:o,hash:l}}function yu(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}function rs(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function bu(e,t,n){const r=t.matched.length-1,o=n.matched.length-1;return r>-1&&r===o&&qt(t.matched[r],n.matched[o])&&Gl(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function qt(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function Gl(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(!_u(e[n],t[n]))return!1;return!0}function _u(e,t){return Je(e)?os(e,t):Je(t)?os(t,e):e===t}function os(e,t){return Je(t)?e.length===t.length&&e.every((n,r)=>n===t[r]):e.length===1&&e[0]===t}function wu(e,t){if(e.startsWith("/"))return e;if(!e)return t;const n=t.split("/"),r=e.split("/");let o=n.length-1,s,l;for(s=0;s1&&o--;else break;return n.slice(0,o).join("/")+"/"+r.slice(s-(s===r.length?1:0)).join("/")}var bn;(function(e){e.pop="pop",e.push="push"})(bn||(bn={}));var dn;(function(e){e.back="back",e.forward="forward",e.unknown=""})(dn||(dn={}));function Eu(e){if(!e)if($t){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),vu(e)}const Cu=/^[^#]+#/;function xu(e,t){return e.replace(Cu,"#")+t}function Su(e,t){const n=document.documentElement.getBoundingClientRect(),r=e.getBoundingClientRect();return{behavior:t.behavior,left:r.left-n.left-(t.left||0),top:r.top-n.top-(t.top||0)}}const lr=()=>({left:window.pageXOffset,top:window.pageYOffset});function Pu(e){let t;if("el"in e){const n=e.el,r=typeof n=="string"&&n.startsWith("#"),o=typeof n=="string"?r?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!o)return;t=Su(o,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.pageXOffset,t.top!=null?t.top:window.pageYOffset)}function ss(e,t){return(history.state?history.state.position-t:-1)+e}const $r=new Map;function Ru(e,t){$r.set(e,t)}function Tu(e){const t=$r.get(e);return $r.delete(e),t}let Ou=()=>location.protocol+"//"+location.host;function Jl(e,t){const{pathname:n,search:r,hash:o}=t,s=e.indexOf("#");if(s>-1){let i=o.includes(e.slice(s))?e.slice(s).length:1,a=o.slice(i);return a[0]!=="/"&&(a="/"+a),rs(a,"")}return rs(n,e)+r+o}function Lu(e,t,n,r){let o=[],s=[],l=null;const i=({state:h})=>{const g=Jl(e,location),_=n.value,L=t.value;let R=0;if(h){if(n.value=g,t.value=h,l&&l===_){l=null;return}R=L?h.position-L.position:0}else r(g);o.forEach(m=>{m(n.value,_,{delta:R,type:bn.pop,direction:R?R>0?dn.forward:dn.back:dn.unknown})})};function a(){l=n.value}function c(h){o.push(h);const g=()=>{const _=o.indexOf(h);_>-1&&o.splice(_,1)};return s.push(g),g}function u(){const{history:h}=window;!h.state||h.replaceState(ce({},h.state,{scroll:lr()}),"")}function d(){for(const h of s)h();s=[],window.removeEventListener("popstate",i),window.removeEventListener("beforeunload",u)}return window.addEventListener("popstate",i),window.addEventListener("beforeunload",u),{pauseListeners:a,listen:c,destroy:d}}function ls(e,t,n,r=!1,o=!1){return{back:e,current:t,forward:n,replaced:r,position:window.history.length,scroll:o?lr():null}}function Au(e){const{history:t,location:n}=window,r={value:Jl(e,n)},o={value:t.state};o.value||s(r.value,{back:null,current:r.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function s(a,c,u){const d=e.indexOf("#"),h=d>-1?(n.host&&document.querySelector("base")?e:e.slice(d))+a:Ou()+e+a;try{t[u?"replaceState":"pushState"](c,"",h),o.value=c}catch(g){console.error(g),n[u?"replace":"assign"](h)}}function l(a,c){const u=ce({},t.state,ls(o.value.back,a,o.value.forward,!0),c,{position:o.value.position});s(a,u,!0),r.value=a}function i(a,c){const u=ce({},o.value,t.state,{forward:a,scroll:lr()});s(u.current,u,!0);const d=ce({},ls(r.value,a,null),{position:u.position+1},c);s(a,d,!1),r.value=a}return{location:r,state:o,push:i,replace:l}}function Iu(e){e=Eu(e);const t=Au(e),n=Lu(e,t.state,t.location,t.replace);function r(s,l=!0){l||n.pauseListeners(),history.go(s)}const o=ce({location:"",base:e,go:r,createHref:xu.bind(null,e)},t,n);return Object.defineProperty(o,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(o,"state",{enumerable:!0,get:()=>t.state.value}),o}function ku(e){return typeof e=="string"||e&&typeof e=="object"}function Ql(e){return typeof e=="string"||typeof e=="symbol"}const tt={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0},Zl=Symbol("");var is;(function(e){e[e.aborted=4]="aborted",e[e.cancelled=8]="cancelled",e[e.duplicated=16]="duplicated"})(is||(is={}));function Yt(e,t){return ce(new Error,{type:e,[Zl]:!0},t)}function et(e,t){return e instanceof Error&&Zl in e&&(t==null||!!(e.type&t))}const as="[^/]+?",Mu={sensitive:!1,strict:!1,start:!0,end:!0},Nu=/[.+*?^${}()[\]/\\]/g;function Du(e,t){const n=ce({},Mu,t),r=[];let o=n.start?"^":"";const s=[];for(const c of e){const u=c.length?[]:[90];n.strict&&!c.length&&(o+="/");for(let d=0;dt.length?t.length===1&&t[0]===40+40?1:-1:0}function Hu(e,t){let n=0;const r=e.score,o=t.score;for(;n0&&t[t.length-1]<0}const zu={type:0,value:""},$u=/[a-zA-Z0-9_]/;function Bu(e){if(!e)return[[]];if(e==="/")return[[zu]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(g){throw new Error(`ERR (${n})/"${c}": ${g}`)}let n=0,r=n;const o=[];let s;function l(){s&&o.push(s),s=[]}let i=0,a,c="",u="";function d(){!c||(n===0?s.push({type:0,value:c}):n===1||n===2||n===3?(s.length>1&&(a==="*"||a==="+")&&t(`A repeatable param (${c}) must be alone in its segment. eg: '/:ids+.`),s.push({type:1,value:c,regexp:u,repeatable:a==="*"||a==="+",optional:a==="*"||a==="?"})):t("Invalid state to consume buffer"),c="")}function h(){c+=a}for(;i{l(b)}:fn}function l(u){if(Ql(u)){const d=r.get(u);d&&(r.delete(u),n.splice(n.indexOf(d),1),d.children.forEach(l),d.alias.forEach(l))}else{const d=n.indexOf(u);d>-1&&(n.splice(d,1),u.record.name&&r.delete(u.record.name),u.children.forEach(l),u.alias.forEach(l))}}function i(){return n}function a(u){let d=0;for(;d=0&&(u.record.path!==n[d].record.path||!Xl(u,n[d]));)d++;n.splice(d,0,u),u.record.name&&!fs(u)&&r.set(u.record.name,u)}function c(u,d){let h,g={},_,L;if("name"in u&&u.name){if(h=r.get(u.name),!h)throw Yt(1,{location:u});L=h.record.name,g=ce(us(d.params,h.keys.filter(b=>!b.optional).map(b=>b.name)),u.params&&us(u.params,h.keys.map(b=>b.name))),_=h.stringify(g)}else if("path"in u)_=u.path,h=n.find(b=>b.re.test(_)),h&&(g=h.parse(_),L=h.record.name);else{if(h=d.name?r.get(d.name):n.find(b=>b.re.test(d.path)),!h)throw Yt(1,{location:u,currentLocation:d});L=h.record.name,g=ce({},d.params,u.params),_=h.stringify(g)}const R=[];let m=h;for(;m;)R.unshift(m.record),m=m.parent;return{name:L,path:_,params:g,matched:R,meta:Wu(R)}}return e.forEach(u=>s(u)),{addRoute:s,resolve:c,removeRoute:l,getRoutes:i,getRecordMatcher:o}}function us(e,t){const n={};for(const r of t)r in e&&(n[r]=e[r]);return n}function Vu(e){return{path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:void 0,beforeEnter:e.beforeEnter,props:Ku(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}}}function Ku(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const r in e.components)t[r]=typeof n=="boolean"?n:n[r];return t}function fs(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function Wu(e){return e.reduce((t,n)=>ce(t,n.meta),{})}function ds(e,t){const n={};for(const r in e)n[r]=r in t?t[r]:e[r];return n}function Xl(e,t){return t.children.some(n=>n===e||Xl(e,n))}const ei=/#/g,qu=/&/g,Yu=/\//g,Gu=/=/g,Ju=/\?/g,ti=/\+/g,Qu=/%5B/g,Zu=/%5D/g,ni=/%5E/g,Xu=/%60/g,ri=/%7B/g,ef=/%7C/g,oi=/%7D/g,tf=/%20/g;function po(e){return encodeURI(""+e).replace(ef,"|").replace(Qu,"[").replace(Zu,"]")}function nf(e){return po(e).replace(ri,"{").replace(oi,"}").replace(ni,"^")}function Br(e){return po(e).replace(ti,"%2B").replace(tf,"+").replace(ei,"%23").replace(qu,"%26").replace(Xu,"`").replace(ri,"{").replace(oi,"}").replace(ni,"^")}function rf(e){return Br(e).replace(Gu,"%3D")}function of(e){return po(e).replace(ei,"%23").replace(Ju,"%3F")}function sf(e){return e==null?"":of(e).replace(Yu,"%2F")}function Kn(e){try{return decodeURIComponent(""+e)}catch{}return""+e}function lf(e){const t={};if(e===""||e==="?")return t;const r=(e[0]==="?"?e.slice(1):e).split("&");for(let o=0;os&&Br(s)):[r&&Br(r)]).forEach(s=>{s!==void 0&&(t+=(t.length?"&":"")+n,s!=null&&(t+="="+s))})}return t}function af(e){const t={};for(const n in e){const r=e[n];r!==void 0&&(t[n]=Je(r)?r.map(o=>o==null?null:""+o):r==null?r:""+r)}return t}const cf=Symbol(""),ps=Symbol(""),ir=Symbol(""),mo=Symbol(""),jr=Symbol("");function tn(){let e=[];function t(r){return e.push(r),()=>{const o=e.indexOf(r);o>-1&&e.splice(o,1)}}function n(){e=[]}return{add:t,list:()=>e,reset:n}}function mt(e,t,n,r,o){const s=r&&(r.enterCallbacks[o]=r.enterCallbacks[o]||[]);return()=>new Promise((l,i)=>{const a=d=>{d===!1?i(Yt(4,{from:n,to:t})):d instanceof Error?i(d):ku(d)?i(Yt(2,{from:t,to:d})):(s&&r.enterCallbacks[o]===s&&typeof d=="function"&&s.push(d),l())},c=e.call(r&&r.instances[o],t,n,a);let u=Promise.resolve(c);e.length<3&&(u=u.then(a)),u.catch(d=>i(d))})}function _r(e,t,n,r){const o=[];for(const s of e)for(const l in s.components){let i=s.components[l];if(!(t!=="beforeRouteEnter"&&!s.instances[l]))if(uf(i)){const c=(i.__vccOpts||i)[t];c&&o.push(mt(c,n,r,s,l))}else{let a=i();o.push(()=>a.then(c=>{if(!c)return Promise.reject(new Error(`Couldn't resolve component "${l}" at "${s.path}"`));const u=mu(c)?c.default:c;s.components[l]=u;const h=(u.__vccOpts||u)[t];return h&&mt(h,n,r,s,l)()}))}}return o}function uf(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function ms(e){const t=xe(ir),n=xe(mo),r=ue(()=>t.resolve(Ge(e.to))),o=ue(()=>{const{matched:a}=r.value,{length:c}=a,u=a[c-1],d=n.matched;if(!u||!d.length)return-1;const h=d.findIndex(qt.bind(null,u));if(h>-1)return h;const g=gs(a[c-2]);return c>1&&gs(u)===g&&d[d.length-1].path!==g?d.findIndex(qt.bind(null,a[c-2])):h}),s=ue(()=>o.value>-1&&pf(n.params,r.value.params)),l=ue(()=>o.value>-1&&o.value===n.matched.length-1&&Gl(n.params,r.value.params));function i(a={}){return hf(a)?t[Ge(e.replace)?"replace":"push"](Ge(e.to)).catch(fn):Promise.resolve()}return{route:r,href:ue(()=>r.value.href),isActive:s,isExactActive:l,navigate:i}}const ff=ze({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"}},useLink:ms,setup(e,{slots:t}){const n=Qt(ms(e)),{options:r}=xe(ir),o=ue(()=>({[vs(e.activeClass,r.linkActiveClass,"router-link-active")]:n.isActive,[vs(e.exactActiveClass,r.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const s=t.default&&t.default(n);return e.custom?s:ie("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:o.value},s)}}}),df=ff;function hf(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function pf(e,t){for(const n in t){const r=t[n],o=e[n];if(typeof r=="string"){if(r!==o)return!1}else if(!Je(o)||o.length!==r.length||r.some((s,l)=>s!==o[l]))return!1}return!0}function gs(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const vs=(e,t,n)=>e!=null?e:t!=null?t:n,mf=ze({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const r=xe(jr),o=ue(()=>e.route||r.value),s=xe(ps,0),l=ue(()=>{let c=Ge(s);const{matched:u}=o.value;let d;for(;(d=u[c])&&!d.components;)c++;return c}),i=ue(()=>o.value.matched[l.value]);It(ps,ue(()=>l.value+1)),It(cf,i),It(jr,o);const a=ye();return ot(()=>[a.value,i.value,e.name],([c,u,d],[h,g,_])=>{u&&(u.instances[d]=c,g&&g!==u&&c&&c===h&&(u.leaveGuards.size||(u.leaveGuards=g.leaveGuards),u.updateGuards.size||(u.updateGuards=g.updateGuards))),c&&u&&(!g||!qt(u,g)||!h)&&(u.enterCallbacks[d]||[]).forEach(L=>L(c))},{flush:"post"}),()=>{const c=o.value,u=e.name,d=i.value,h=d&&d.components[u];if(!h)return ys(n.default,{Component:h,route:c});const g=d.props[u],_=g?g===!0?c.params:typeof g=="function"?g(c):g:null,R=ie(h,ce({},_,t,{onVnodeUnmounted:m=>{m.component.isUnmounted&&(d.instances[u]=null)},ref:a}));return ys(n.default,{Component:R,route:c})||R}}});function ys(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const si=mf;function gf(e){const t=Uu(e.routes,e),n=e.parseQuery||lf,r=e.stringifyQuery||hs,o=e.history,s=tn(),l=tn(),i=tn(),a=Xs(tt);let c=tt;$t&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const u=yr.bind(null,E=>""+E),d=yr.bind(null,sf),h=yr.bind(null,Kn);function g(E,j){let I,U;return Ql(E)?(I=t.getRecordMatcher(E),U=j):U=E,t.addRoute(U,I)}function _(E){const j=t.getRecordMatcher(E);j&&t.removeRoute(j)}function L(){return t.getRoutes().map(E=>E.record)}function R(E){return!!t.getRecordMatcher(E)}function m(E,j){if(j=ce({},j||a.value),typeof E=="string"){const J=br(n,E,j.path),f=t.resolve({path:J.path},j),p=o.createHref(J.fullPath);return ce(J,f,{params:h(f.params),hash:Kn(J.hash),redirectedFrom:void 0,href:p})}let I;if("path"in E)I=ce({},E,{path:br(n,E.path,j.path).path});else{const J=ce({},E.params);for(const f in J)J[f]==null&&delete J[f];I=ce({},E,{params:d(E.params)}),j.params=d(j.params)}const U=t.resolve(I,j),le=E.hash||"";U.params=u(h(U.params));const fe=yu(r,ce({},E,{hash:nf(le),path:U.path})),ee=o.createHref(fe);return ce({fullPath:fe,hash:le,query:r===hs?af(E.query):E.query||{}},U,{redirectedFrom:void 0,href:ee})}function b(E){return typeof E=="string"?br(n,E,a.value.path):ce({},E)}function S(E,j){if(c!==E)return Yt(8,{from:j,to:E})}function N(E){return M(E)}function B(E){return N(ce(b(E),{replace:!0}))}function z(E){const j=E.matched[E.matched.length-1];if(j&&j.redirect){const{redirect:I}=j;let U=typeof I=="function"?I(E):I;return typeof U=="string"&&(U=U.includes("?")||U.includes("#")?U=b(U):{path:U},U.params={}),ce({query:E.query,hash:E.hash,params:"path"in U?{}:E.params},U)}}function M(E,j){const I=c=m(E),U=a.value,le=E.state,fe=E.force,ee=E.replace===!0,J=z(I);if(J)return M(ce(b(J),{state:typeof J=="object"?ce({},le,J.state):le,force:fe,replace:ee}),j||I);const f=I;f.redirectedFrom=j;let p;return!fe&&bu(r,U,I)&&(p=Yt(16,{to:f,from:U}),Re(U,U,!0,!1)),(p?Promise.resolve(p):Y(f,U)).catch(y=>et(y)?et(y,2)?y:_e(y):Z(y,f,U)).then(y=>{if(y){if(et(y,2))return M(ce({replace:ee},b(y.to),{state:typeof y.to=="object"?ce({},le,y.to.state):le,force:fe}),j||f)}else y=K(f,U,!0,ee,le);return $(f,U,y),y})}function v(E,j){const I=S(E,j);return I?Promise.reject(I):Promise.resolve()}function Y(E,j){let I;const[U,le,fe]=vf(E,j);I=_r(U.reverse(),"beforeRouteLeave",E,j);for(const J of U)J.leaveGuards.forEach(f=>{I.push(mt(f,E,j))});const ee=v.bind(null,E,j);return I.push(ee),Dt(I).then(()=>{I=[];for(const J of s.list())I.push(mt(J,E,j));return I.push(ee),Dt(I)}).then(()=>{I=_r(le,"beforeRouteUpdate",E,j);for(const J of le)J.updateGuards.forEach(f=>{I.push(mt(f,E,j))});return I.push(ee),Dt(I)}).then(()=>{I=[];for(const J of E.matched)if(J.beforeEnter&&!j.matched.includes(J))if(Je(J.beforeEnter))for(const f of J.beforeEnter)I.push(mt(f,E,j));else I.push(mt(J.beforeEnter,E,j));return I.push(ee),Dt(I)}).then(()=>(E.matched.forEach(J=>J.enterCallbacks={}),I=_r(fe,"beforeRouteEnter",E,j),I.push(ee),Dt(I))).then(()=>{I=[];for(const J of l.list())I.push(mt(J,E,j));return I.push(ee),Dt(I)}).catch(J=>et(J,8)?J:Promise.reject(J))}function $(E,j,I){for(const U of i.list())U(E,j,I)}function K(E,j,I,U,le){const fe=S(E,j);if(fe)return fe;const ee=j===tt,J=$t?history.state:{};I&&(U||ee?o.replace(E.fullPath,ce({scroll:ee&&J&&J.scroll},le)):o.push(E.fullPath,le)),a.value=E,Re(E,j,I,ee),_e()}let w;function D(){w||(w=o.listen((E,j,I)=>{if(!wt.listening)return;const U=m(E),le=z(U);if(le){M(ce(le,{replace:!0}),U).catch(fn);return}c=U;const fe=a.value;$t&&Ru(ss(fe.fullPath,I.delta),lr()),Y(U,fe).catch(ee=>et(ee,12)?ee:et(ee,2)?(M(ee.to,U).then(J=>{et(J,20)&&!I.delta&&I.type===bn.pop&&o.go(-1,!1)}).catch(fn),Promise.reject()):(I.delta&&o.go(-I.delta,!1),Z(ee,U,fe))).then(ee=>{ee=ee||K(U,fe,!1),ee&&(I.delta&&!et(ee,8)?o.go(-I.delta,!1):I.type===bn.pop&&et(ee,20)&&o.go(-1,!1)),$(U,fe,ee)}).catch(fn)}))}let A=tn(),ne=tn(),H;function Z(E,j,I){_e(E);const U=ne.list();return U.length?U.forEach(le=>le(E,j,I)):console.error(E),Promise.reject(E)}function te(){return H&&a.value!==tt?Promise.resolve():new Promise((E,j)=>{A.add([E,j])})}function _e(E){return H||(H=!E,D(),A.list().forEach(([j,I])=>E?I(E):j()),A.reset()),E}function Re(E,j,I,U){const{scrollBehavior:le}=e;if(!$t||!le)return Promise.resolve();const fe=!I&&Tu(ss(E.fullPath,0))||(U||!I)&&history.state&&history.state.scroll||null;return so().then(()=>le(E,j,fe)).then(ee=>ee&&Pu(ee)).catch(ee=>Z(ee,E,j))}const Ie=E=>o.go(E);let $e;const Oe=new Set,wt={currentRoute:a,listening:!0,addRoute:g,removeRoute:_,hasRoute:R,getRoutes:L,resolve:m,options:e,push:N,replace:B,go:Ie,back:()=>Ie(-1),forward:()=>Ie(1),beforeEach:s.add,beforeResolve:l.add,afterEach:i.add,onError:ne.add,isReady:te,install(E){const j=this;E.component("RouterLink",df),E.component("RouterView",si),E.config.globalProperties.$router=j,Object.defineProperty(E.config.globalProperties,"$route",{enumerable:!0,get:()=>Ge(a)}),$t&&!$e&&a.value===tt&&($e=!0,N(o.location).catch(le=>{}));const I={};for(const le in tt)I[le]=ue(()=>a.value[le]);E.provide(ir,j),E.provide(mo,Qt(I)),E.provide(jr,a);const U=E.unmount;Oe.add(E),E.unmount=function(){Oe.delete(E),Oe.size<1&&(c=tt,w&&w(),w=null,a.value=tt,$e=!1,H=!1),U()}}};return wt}function Dt(e){return e.reduce((t,n)=>t.then(()=>n()),Promise.resolve())}function vf(e,t){const n=[],r=[],o=[],s=Math.max(t.matched.length,e.matched.length);for(let l=0;lqt(c,i))?r.push(i):n.push(i));const a=e.matched[l];a&&(t.matched.find(c=>qt(c,a))||o.push(a))}return[n,r,o]}function ar(){return xe(ir)}function go(){return xe(mo)}const yf=({headerLinkSelector:e,headerAnchorSelector:t,delay:n,offset:r=5})=>{const o=ar(),s=xn(),i=Yl(()=>{var R,m,b,S;const a=Math.max(window.scrollY,document.documentElement.scrollTop,document.body.scrollTop);if(Math.abs(a-0)g.some(B=>B.hash===N.hash));for(let N=0;N=((m=(R=B.parentElement)==null?void 0:R.offsetTop)!=null?m:0)-r,v=!z||a<((S=(b=z.parentElement)==null?void 0:b.offsetTop)!=null?S:0)-r;if(!(M&&v))continue;const $=decodeURIComponent(o.currentRoute.value.hash),K=decodeURIComponent(B.hash);if($===K)return;if(h){for(let w=N+1;w{i(),window.addEventListener("scroll",i)}),nr(()=>{window.removeEventListener("scroll",i)}),ot(()=>s.value.path,i)},bs=async(e,...t)=>{const{scrollBehavior:n}=e.options;e.options.scrollBehavior=void 0,await e.replace(...t).finally(()=>e.options.scrollBehavior=n)},bf="a.sidebar-item",_f=".header-anchor",wf=300,Ef=5;var Cf=at({setup(){yf({headerLinkSelector:bf,headerAnchorSelector:_f,delay:wf,offset:Ef})}});const _s=()=>window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,xf=()=>window.scrollTo({top:0,behavior:"smooth"});const Sf=ze({name:"BackToTop",setup(){const e=ye(0),t=ue(()=>e.value>300),n=Yl(()=>{e.value=_s()},100);it(()=>{e.value=_s(),window.addEventListener("scroll",()=>n())});const r=ie("div",{class:"back-to-top",onClick:xf});return()=>ie(fo,{name:"back-to-top"},()=>t.value?r:null)}});var Pf=at({rootComponents:[Sf]});const Rf=ie("svg",{class:"external-link-icon",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",x:"0px",y:"0px",viewBox:"0 0 100 100",width:"15",height:"15"},[ie("path",{fill:"currentColor",d:"M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"}),ie("polygon",{fill:"currentColor",points:"45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"})]),Tf=ze({name:"ExternalLinkIcon",props:{locales:{type:Object,required:!1,default:()=>({})}},setup(e){const t=Wl(),n=ue(()=>{var r;return(r=e.locales[t.value])!=null?r:{openInNewWindow:"open in new window"}});return()=>ie("span",[Rf,ie("span",{class:"external-link-icon-sr-only"},n.value.openInNewWindow)])}}),Of={"/":{openInNewWindow:"open in new window"}};var Lf=at({enhance({app:e}){e.component("ExternalLinkIcon",ie(Tf,{locales:Of}))}});/*! medium-zoom 1.0.6 | MIT License | https://github.com/francoischalifour/medium-zoom */var Rt=Object.assign||function(e){for(var t=1;t1&&arguments[1]!==void 0?arguments[1]:{},r=window.Promise||function(w){function D(){}w(D,D)},o=function(w){var D=w.target;if(D===Y){_();return}S.indexOf(D)!==-1&&L({target:D})},s=function(){if(!(B||!v.original)){var w=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;Math.abs(z-w)>M.scrollOffset&&setTimeout(_,150)}},l=function(w){var D=w.key||w.keyCode;(D==="Escape"||D==="Esc"||D===27)&&_()},i=function(){var w=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},D=w;if(w.background&&(Y.style.background=w.background),w.container&&w.container instanceof Object&&(D.container=Rt({},M.container,w.container)),w.template){var A=Dn(w.template)?w.template:document.querySelector(w.template);D.template=A}return M=Rt({},M,D),S.forEach(function(ne){ne.dispatchEvent(Ft("medium-zoom:update",{detail:{zoom:$}}))}),$},a=function(){var w=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};return e(Rt({},M,w))},c=function(){for(var w=arguments.length,D=Array(w),A=0;A0?D.reduce(function(H,Z){return[].concat(H,Es(Z))},[]):S;return ne.forEach(function(H){H.classList.remove("medium-zoom-image"),H.dispatchEvent(Ft("medium-zoom:detach",{detail:{zoom:$}}))}),S=S.filter(function(H){return ne.indexOf(H)===-1}),$},d=function(w,D){var A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return S.forEach(function(ne){ne.addEventListener("medium-zoom:"+w,D,A)}),N.push({type:"medium-zoom:"+w,listener:D,options:A}),$},h=function(w,D){var A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return S.forEach(function(ne){ne.removeEventListener("medium-zoom:"+w,D,A)}),N=N.filter(function(ne){return!(ne.type==="medium-zoom:"+w&&ne.listener.toString()===D.toString())}),$},g=function(){var w=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},D=w.target,A=function(){var H={width:document.documentElement.clientWidth,height:document.documentElement.clientHeight,left:0,top:0,right:0,bottom:0},Z=void 0,te=void 0;if(M.container)if(M.container instanceof Object)H=Rt({},H,M.container),Z=H.width-H.left-H.right-M.margin*2,te=H.height-H.top-H.bottom-M.margin*2;else{var _e=Dn(M.container)?M.container:document.querySelector(M.container),Re=_e.getBoundingClientRect(),Ie=Re.width,$e=Re.height,Oe=Re.left,wt=Re.top;H=Rt({},H,{width:Ie,height:$e,left:Oe,top:wt})}Z=Z||H.width-M.margin*2,te=te||H.height-M.margin*2;var E=v.zoomedHd||v.original,j=ws(E)?Z:E.naturalWidth||Z,I=ws(E)?te:E.naturalHeight||te,U=E.getBoundingClientRect(),le=U.top,fe=U.left,ee=U.width,J=U.height,f=Math.min(j,Z)/ee,p=Math.min(I,te)/J,y=Math.min(f,p),x=(-fe+(Z-ee)/2+M.margin+H.left)/y,C=(-le+(te-J)/2+M.margin+H.top)/y,T="scale("+y+") translate3d("+x+"px, "+C+"px, 0)";v.zoomed.style.transform=T,v.zoomedHd&&(v.zoomedHd.style.transform=T)};return new r(function(ne){if(D&&S.indexOf(D)===-1){ne($);return}var H=function Ie(){B=!1,v.zoomed.removeEventListener("transitionend",Ie),v.original.dispatchEvent(Ft("medium-zoom:opened",{detail:{zoom:$}})),ne($)};if(v.zoomed){ne($);return}if(D)v.original=D;else if(S.length>0){var Z=S;v.original=Z[0]}else{ne($);return}if(v.original.dispatchEvent(Ft("medium-zoom:open",{detail:{zoom:$}})),z=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,B=!0,v.zoomed=kf(v.original),document.body.appendChild(Y),M.template){var te=Dn(M.template)?M.template:document.querySelector(M.template);v.template=document.createElement("div"),v.template.appendChild(te.content.cloneNode(!0)),document.body.appendChild(v.template)}if(document.body.appendChild(v.zoomed),window.requestAnimationFrame(function(){document.body.classList.add("medium-zoom--opened")}),v.original.classList.add("medium-zoom-image--hidden"),v.zoomed.classList.add("medium-zoom-image--opened"),v.zoomed.addEventListener("click",_),v.zoomed.addEventListener("transitionend",H),v.original.getAttribute("data-zoom-src")){v.zoomedHd=v.zoomed.cloneNode(),v.zoomedHd.removeAttribute("srcset"),v.zoomedHd.removeAttribute("sizes"),v.zoomedHd.src=v.zoomed.getAttribute("data-zoom-src"),v.zoomedHd.onerror=function(){clearInterval(_e),console.warn("Unable to reach the zoom image target "+v.zoomedHd.src),v.zoomedHd=null,A()};var _e=setInterval(function(){v.zoomedHd.complete&&(clearInterval(_e),v.zoomedHd.classList.add("medium-zoom-image--opened"),v.zoomedHd.addEventListener("click",_),document.body.appendChild(v.zoomedHd),A())},10)}else if(v.original.hasAttribute("srcset")){v.zoomedHd=v.zoomed.cloneNode(),v.zoomedHd.removeAttribute("sizes"),v.zoomedHd.removeAttribute("loading");var Re=v.zoomedHd.addEventListener("load",function(){v.zoomedHd.removeEventListener("load",Re),v.zoomedHd.classList.add("medium-zoom-image--opened"),v.zoomedHd.addEventListener("click",_),document.body.appendChild(v.zoomedHd),A()})}else A()})},_=function(){return new r(function(w){if(B||!v.original){w($);return}var D=function A(){v.original.classList.remove("medium-zoom-image--hidden"),document.body.removeChild(v.zoomed),v.zoomedHd&&document.body.removeChild(v.zoomedHd),document.body.removeChild(Y),v.zoomed.classList.remove("medium-zoom-image--opened"),v.template&&document.body.removeChild(v.template),B=!1,v.zoomed.removeEventListener("transitionend",A),v.original.dispatchEvent(Ft("medium-zoom:closed",{detail:{zoom:$}})),v.original=null,v.zoomed=null,v.zoomedHd=null,v.template=null,w($)};B=!0,document.body.classList.remove("medium-zoom--opened"),v.zoomed.style.transform="",v.zoomedHd&&(v.zoomedHd.style.transform=""),v.template&&(v.template.style.transition="opacity 150ms",v.template.style.opacity=0),v.original.dispatchEvent(Ft("medium-zoom:close",{detail:{zoom:$}})),v.zoomed.addEventListener("transitionend",D)})},L=function(){var w=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},D=w.target;return v.original?_():g({target:D})},R=function(){return M},m=function(){return S},b=function(){return v.original},S=[],N=[],B=!1,z=0,M=n,v={original:null,zoomed:null,zoomedHd:null,template:null};Object.prototype.toString.call(t)==="[object Object]"?M=t:(t||typeof t=="string")&&c(t),M=Rt({margin:0,background:"#fff",scrollOffset:40,container:null,template:null},M);var Y=If(M.background);document.addEventListener("click",o),document.addEventListener("keyup",l),document.addEventListener("scroll",s),window.addEventListener("resize",_);var $={open:g,close:_,toggle:L,update:i,clone:a,attach:c,detach:u,on:d,off:h,getOptions:R,getImages:m,getZoomedImage:b};return $};function Nf(e,t){t===void 0&&(t={});var n=t.insertAt;if(!(!e||typeof document=="undefined")){var r=document.head||document.getElementsByTagName("head")[0],o=document.createElement("style");o.type="text/css",n==="top"&&r.firstChild?r.insertBefore(o,r.firstChild):r.appendChild(o),o.styleSheet?o.styleSheet.cssText=e:o.appendChild(document.createTextNode(e))}}var Df=".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}";Nf(Df);var Ff=Mf;const Hf=Symbol("mediumZoom");const zf=".theme-default-content > img, .theme-default-content :not(a) > img",$f={},Bf=300;var jf=at({enhance({app:e,router:t}){const n=Ff($f);n.refresh=(r=zf)=>{n.detach(),n.attach(r)},e.provide(Hf,n),t.afterEach(()=>{setTimeout(()=>n.refresh(),Bf)})}});/** + * NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress + * @license MIT + */const se={settings:{minimum:.08,easing:"ease",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,barSelector:'[role="bar"]',parent:"body",template:'
'},status:null,set:e=>{const t=se.isStarted();e=wr(e,se.settings.minimum,1),se.status=e===1?null:e;const n=se.render(!t),r=n.querySelector(se.settings.barSelector),o=se.settings.speed,s=se.settings.easing;return n.offsetWidth,Uf(l=>{Mn(r,{transform:"translate3d("+Cs(e)+"%,0,0)",transition:"all "+o+"ms "+s}),e===1?(Mn(n,{transition:"none",opacity:"1"}),n.offsetWidth,setTimeout(function(){Mn(n,{transition:"all "+o+"ms linear",opacity:"0"}),setTimeout(function(){se.remove(),l()},o)},o)):setTimeout(()=>l(),o)}),se},isStarted:()=>typeof se.status=="number",start:()=>{se.status||se.set(0);const e=()=>{setTimeout(()=>{!se.status||(se.trickle(),e())},se.settings.trickleSpeed)};return se.settings.trickle&&e(),se},done:e=>!e&&!se.status?se:se.inc(.3+.5*Math.random()).set(1),inc:e=>{let t=se.status;return t?(typeof e!="number"&&(e=(1-t)*wr(Math.random()*t,.1,.95)),t=wr(t+e,0,.994),se.set(t)):se.start()},trickle:()=>se.inc(Math.random()*se.settings.trickleRate),render:e=>{if(se.isRendered())return document.getElementById("nprogress");xs(document.documentElement,"nprogress-busy");const t=document.createElement("div");t.id="nprogress",t.innerHTML=se.settings.template;const n=t.querySelector(se.settings.barSelector),r=e?"-100":Cs(se.status||0),o=document.querySelector(se.settings.parent);return Mn(n,{transition:"all 0 linear",transform:"translate3d("+r+"%,0,0)"}),o!==document.body&&xs(o,"nprogress-custom-parent"),o==null||o.appendChild(t),t},remove:()=>{Ss(document.documentElement,"nprogress-busy"),Ss(document.querySelector(se.settings.parent),"nprogress-custom-parent");const e=document.getElementById("nprogress");e&&Vf(e)},isRendered:()=>!!document.getElementById("nprogress")},wr=(e,t,n)=>en?n:e,Cs=e=>(-1+e)*100,Uf=function(){const e=[];function t(){const n=e.shift();n&&n(t)}return function(n){e.push(n),e.length===1&&t()}}(),Mn=function(){const e=["Webkit","O","Moz","ms"],t={};function n(l){return l.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,function(i,a){return a.toUpperCase()})}function r(l){const i=document.body.style;if(l in i)return l;let a=e.length;const c=l.charAt(0).toUpperCase()+l.slice(1);let u;for(;a--;)if(u=e[a]+c,u in i)return u;return l}function o(l){return l=n(l),t[l]||(t[l]=r(l))}function s(l,i,a){i=o(i),l.style[i]=a}return function(l,i){for(const a in i){const c=i[a];c!==void 0&&Object.prototype.hasOwnProperty.call(i,a)&&s(l,a,c)}}}(),li=(e,t)=>(typeof e=="string"?e:vo(e)).indexOf(" "+t+" ")>=0,xs=(e,t)=>{const n=vo(e),r=n+t;li(n,t)||(e.className=r.substring(1))},Ss=(e,t)=>{const n=vo(e);if(!li(e,t))return;const r=n.replace(" "+t+" "," ");e.className=r.substring(1,r.length-1)},vo=e=>(" "+(e.className||"")+" ").replace(/\s+/gi," "),Vf=e=>{e&&e.parentNode&&e.parentNode.removeChild(e)};const Kf=()=>{it(()=>{const e=ar(),t=new Set;t.add(e.currentRoute.value.path),e.beforeEach(n=>{t.has(n.path)||se.start()}),e.afterEach(n=>{t.add(n.path),se.done()})})};var Wf=at({setup(){Kf()}});const qf=JSON.parse(`{"contributors":false,"docsRepo":"https://github.com/zProtect-Development/Documentation","docsBranch":"main","docsDir":"docs","editLink":true,"editLinkPattern":":repo/edit/:branch/:path","lastUpdated":true,"logo":"/logo.png","locales":{"/":{"sidebar":{"/":[{"text":"Documentation","children":["/index.md","/config.md","/commandline.md"]},{"text":"Changelog","children":["/changelog/0.2.md","/changelog/0.1.md"]},{"text":"Legal","children":["/privacy.md","/terms.md"]}]},"navbar":[{"text":"Return to zProtect.dev","link":"https://zprotect.dev","target":"_self"}],"selectLanguageName":"English"}},"colorMode":"auto","colorModeSwitch":true,"navbar":[],"repo":null,"selectLanguageText":"Languages","selectLanguageAriaLabel":"Select language","sidebar":"auto","sidebarDepth":2,"editLinkText":"Edit this page","lastUpdatedText":"Last Updated","contributorsText":"Contributors","notFound":["There's nothing here.","How did we get here?","That's a Four-Oh-Four.","Looks like we've got some broken links."],"backToHome":"Take me home","openInNewWindow":"open in new window","toggleColorMode":"toggle color mode","toggleSidebar":"toggle sidebar"}`),ii=ye(qf),Yf=()=>ii;cr.webpackHot&&(__VUE_HMR_RUNTIME__.updateThemeData=e=>{ii.value=e});const ai=Symbol(""),Gf=()=>{const e=xe(ai);if(!e)throw new Error("useThemeLocaleData() is called without provider.");return e},Jf=(e,t)=>{var n;return{...e,...(n=e.locales)==null?void 0:n[t]}};var Qf=at({enhance({app:e}){const t=Yf(),n=e._context.provides[ho],r=ue(()=>Jf(t.value,n.value));e.provide(ai,r),Object.defineProperties(e.config.globalProperties,{$theme:{get(){return t.value}},$themeLocale:{get(){return r.value}}})}}),ci=(e,t)=>{const n=e.__vccOpts||e;for(const[r,o]of t)n[r]=o;return n};const Zf=ze({__name:"Badge",props:{type:{type:String,required:!1,default:"tip"},text:{type:String,required:!1,default:""},vertical:{type:String,required:!1,default:void 0}},setup(e){return(t,n)=>(rr(),Ol("span",{class:_n(["badge",e.type]),style:Yn({verticalAlign:e.vertical})},[vl(t.$slots,"default",{},()=>[co(Ti(e.text),1)])],6))}});var Xf=ci(Zf,[["__file","Badge.vue"]]);const ed=ze({name:"CodeGroup",setup(e,{slots:t}){const n=ye(-1),r=ye([]),o=(i=n.value)=>{i{i>0?n.value=i-1:n.value=r.value.length-1,r.value[n.value].focus()},l=(i,a)=>{i.key===" "||i.key==="Enter"?(i.preventDefault(),n.value=a):i.key==="ArrowRight"?(i.preventDefault(),o(a)):i.key==="ArrowLeft"&&(i.preventDefault(),s(a))};return()=>{var a;const i=(((a=t.default)==null?void 0:a.call(t))||[]).filter(c=>c.type.name==="CodeGroupItem").map(c=>(c.props===null&&(c.props={}),c));return i.length===0?null:(n.value<0||n.value>i.length-1?(n.value=i.findIndex(c=>c.props.active===""||c.props.active===!0),n.value===-1&&(n.value=0)):i.forEach((c,u)=>{c.props.active=u===n.value}),ie("div",{class:"code-group"},[ie("div",{class:"code-group__nav"},ie("ul",{class:"code-group__ul"},i.map((c,u)=>{const d=u===n.value;return ie("li",{class:"code-group__li"},ie("button",{ref:h=>{h&&(r.value[u]=h)},class:{"code-group__nav-tab":!0,"code-group__nav-tab-active":d},ariaPressed:d,ariaExpanded:d,onClick:()=>n.value=u,onKeydown:h=>l(h,u)},c.props.title))}))),i]))}}}),td=["aria-selected"],nd=ze({name:"CodeGroupItem"}),rd=ze({...nd,props:{title:{type:String,required:!0},active:{type:Boolean,required:!1,default:!1}},setup(e){return(t,n)=>(rr(),Ol("div",{class:_n(["code-group-item",{"code-group-item__active":e.active}]),"aria-selected":e.active},[vl(t.$slots,"default")],10,td))}});var od=ci(rd,[["__file","CodeGroupItem.vue"]]),Ps;const Sn=typeof window!="undefined",sd=e=>typeof e=="string",Er=()=>{};Sn&&((Ps=window==null?void 0:window.navigator)==null?void 0:Ps.userAgent)&&/iP(ad|hone|od)/.test(window.navigator.userAgent);function ld(e,t){function n(...r){e(()=>t.apply(this,r),{fn:t,thisArg:this,args:r})}return n}const ui=e=>e();function id(e=ui){const t=ye(!0);function n(){t.value=!1}function r(){t.value=!0}return{isActive:t,pause:n,resume:r,eventFilter:(...s)=>{t.value&&e(...s)}}}function fi(e){return Hi()?(zi(e),!0):!1}function ad(e,t=!0){kl()?ml(e):t?e():so(e)}function _h(e=!1,t={}){const{truthyValue:n=!0,falsyValue:r=!1}=t,o=Ce(e),s=ye(e);function l(i){return arguments.length?(s.value=i,s.value):(s.value=s.value===Ge(n)?Ge(r):Ge(n),s.value)}return o?l:[s,l]}var Rs=Object.getOwnPropertySymbols,cd=Object.prototype.hasOwnProperty,ud=Object.prototype.propertyIsEnumerable,fd=(e,t)=>{var n={};for(var r in e)cd.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Rs)for(var r of Rs(e))t.indexOf(r)<0&&ud.call(e,r)&&(n[r]=e[r]);return n};function dd(e,t,n={}){const r=n,{eventFilter:o=ui}=r,s=fd(r,["eventFilter"]);return ot(e,ld(o,t),s)}var hd=Object.defineProperty,pd=Object.defineProperties,md=Object.getOwnPropertyDescriptors,Wn=Object.getOwnPropertySymbols,di=Object.prototype.hasOwnProperty,hi=Object.prototype.propertyIsEnumerable,Ts=(e,t,n)=>t in e?hd(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,gd=(e,t)=>{for(var n in t||(t={}))di.call(t,n)&&Ts(e,n,t[n]);if(Wn)for(var n of Wn(t))hi.call(t,n)&&Ts(e,n,t[n]);return e},vd=(e,t)=>pd(e,md(t)),yd=(e,t)=>{var n={};for(var r in e)di.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Wn)for(var r of Wn(e))t.indexOf(r)<0&&hi.call(e,r)&&(n[r]=e[r]);return n};function bd(e,t,n={}){const r=n,{eventFilter:o}=r,s=yd(r,["eventFilter"]),{eventFilter:l,pause:i,resume:a,isActive:c}=id(o);return{stop:dd(e,t,vd(gd({},s),{eventFilter:l})),pause:i,resume:a,isActive:c}}function _d(e){var t;const n=Ge(e);return(t=n==null?void 0:n.$el)!=null?t:n}const qn=Sn?window:void 0;Sn&&window.document;Sn&&window.navigator;Sn&&window.location;function wd(...e){let t,n,r,o;if(sd(e[0])?([n,r,o]=e,t=qn):[t,n,r,o]=e,!t)return Er;let s=Er;const l=ot(()=>_d(t),a=>{s(),a&&(a.addEventListener(n,r,o),s=()=>{a.removeEventListener(n,r,o),s=Er})},{immediate:!0,flush:"post"}),i=()=>{l(),s()};return fi(i),i}function Ed(e,t={}){const{window:n=qn}=t,r=Boolean(n&&"matchMedia"in n&&typeof n.matchMedia=="function");let o;const s=ye(!1),l=()=>{!r||(o||(o=n.matchMedia(e)),s.value=o.matches)};return ad(()=>{l(),o&&("addEventListener"in o?o.addEventListener("change",l):o.addListener(l),fi(()=>{"removeEventListener"in o?o.removeEventListener("change",l):o.removeListener(l)}))}),s}const Ur=typeof globalThis!="undefined"?globalThis:typeof window!="undefined"?window:typeof global!="undefined"?global:typeof self!="undefined"?self:{},Vr="__vueuse_ssr_handlers__";Ur[Vr]=Ur[Vr]||{};const Cd=Ur[Vr];function xd(e,t){return Cd[e]||t}function Sd(e){return e==null?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":typeof e=="boolean"?"boolean":typeof e=="string"?"string":typeof e=="object"||Array.isArray(e)?"object":Number.isNaN(e)?"any":"number"}const Pd={boolean:{read:e=>e==="true",write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}};function Rd(e,t,n,r={}){var o;const{flush:s="pre",deep:l=!0,listenToStorageChanges:i=!0,writeDefaults:a=!0,shallow:c,window:u=qn,eventFilter:d,onError:h=z=>{console.error(z)}}=r,g=(c?Xs:ye)(t);if(!n)try{n=xd("getDefaultStorage",()=>{var z;return(z=qn)==null?void 0:z.localStorage})()}catch(z){h(z)}if(!n)return g;const _=Ge(t),L=Sd(_),R=(o=r.serializer)!=null?o:Pd[L],{pause:m,resume:b}=bd(g,()=>S(g.value),{flush:s,deep:l,eventFilter:d});return u&&i&&wd(u,"storage",B),B(),g;function S(z){try{z==null?n.removeItem(e):n.setItem(e,R.write(z))}catch(M){h(M)}}function N(z){if(!(z&&z.key!==e)){m();try{const M=z?z.newValue:n.getItem(e);return M==null?(a&&_!==null&&n.setItem(e,R.write(_)),_):typeof M!="string"?M:R.read(M)}catch(M){h(M)}finally{b()}}}function B(z){z&&z.key!==e||(g.value=N(z))}}function Td(e){return Ed("(prefers-color-scheme: dark)",e)}var Os;(function(e){e.UP="UP",e.RIGHT="RIGHT",e.DOWN="DOWN",e.LEFT="LEFT",e.NONE="NONE"})(Os||(Os={}));const pi=Symbol(""),wh=()=>{const e=xe(pi);if(!e)throw new Error("useDarkMode() is called without provider.");return e},Od=()=>{const e=yi(),t=Td(),n=Rd("vuepress-color-scheme",e.value.colorMode),r=ue({get(){return e.value.colorModeSwitch?n.value==="auto"?t.value:n.value==="dark":e.value.colorMode==="dark"},set(o){o===t.value?n.value="auto":n.value=o?"dark":"light"}});It(pi,r),Ld(r)},Ld=e=>{const t=(n=e.value)=>{const r=window==null?void 0:window.document.querySelector("html");r==null||r.classList.toggle("dark",n)};it(()=>{ot(e,t,{immediate:!0})}),io(()=>t())},mi=(...e)=>{const n=ar().resolve(...e),r=n.matched[n.matched.length-1];if(!(r!=null&&r.redirect))return n;const{redirect:o}=r,s=X(o)?o(n):o,l=me(s)?{path:s}:s;return mi({hash:n.hash,query:n.query,params:n.params,...l})},Ad=e=>{const t=mi(encodeURI(e));return{text:t.meta.title||e,link:t.name==="404"?e:t.fullPath}};let Cr=null,nn=null;const Id={wait:()=>Cr,pending:()=>{Cr=new Promise(e=>nn=e)},resolve:()=>{nn==null||nn(),Cr=null,nn=null}},kd=()=>Id,gi=Symbol("sidebarItems"),Eh=()=>{const e=xe(gi);if(!e)throw new Error("useSidebarItems() is called without provider.");return e},Md=()=>{const e=yi(),t=lu(),n=ue(()=>Nd(t.value,e.value));It(gi,n)},Nd=(e,t)=>{var o,s,l,i;const n=(s=(o=e.sidebar)!=null?o:t.sidebar)!=null?s:"auto",r=(i=(l=e.sidebarDepth)!=null?l:t.sidebarDepth)!=null?i:2;return e.home||n===!1?[]:n==="auto"?Fd(r):G(n)?vi(n,r):Hl(n)?Hd(n,r):[]},Dd=(e,t)=>({text:e.title,link:`#${e.slug}`,children:yo(e.children,t)}),yo=(e,t)=>t>0?e.map(n=>Dd(n,t-1)):[],Fd=e=>{const t=xn();return[{text:t.value.title,children:yo(t.value.headers,e)}]},vi=(e,t)=>{const n=go(),r=xn(),o=s=>{var i;let l;if(me(s)?l=Ad(s):l=s,l.children)return{...l,children:l.children.map(a=>o(a))};if(l.link===n.path){const a=((i=r.value.headers[0])==null?void 0:i.level)===1?r.value.headers[0].children:r.value.headers;return{...l,children:yo(a,t)}}return l};return e.map(s=>o(s))},Hd=(e,t)=>{var s;const n=go(),r=zl(e,n.path),o=(s=e[r])!=null?s:[];return vi(o,t)},yi=()=>Gf();var zd=at({enhance({app:e,router:t}){e.component("Badge",Xf),e.component("CodeGroup",ed),e.component("CodeGroupItem",od),e.component("AutoLinkExternalIcon",()=>{const r=e.component("ExternalLinkIcon");return r?ie(r):null}),e.component("NavbarSearch",()=>{const r=e.component("Docsearch")||e.component("SearchBox");return r?ie(r):null});const n=t.options.scrollBehavior;t.options.scrollBehavior=async(...r)=>(await kd().wait(),n(...r))},setup(){Od(),Md()}});const $d=(e,t)=>t.some(n=>{if(me(n))return n===e.key;const{key:r,ctrl:o=!1,shift:s=!1,alt:l=!1}=n;return r===e.key&&o===e.ctrlKey&&s===e.shiftKey&&l===e.altKey}),Bd=/[^\x00-\x7F]/,jd=e=>e.split(/\s+/g).map(t=>t.trim()).filter(t=>!!t),Ls=e=>e.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),As=(e,t)=>{const n=t.join(" "),r=jd(e);if(Bd.test(e))return r.some(l=>n.toLowerCase().indexOf(l)>-1);const o=e.endsWith(" ");return new RegExp(r.map((l,i)=>r.length===i+1&&!o?`(?=.*\\b${Ls(l)})`:`(?=.*\\b${Ls(l)}\\b)`).join("")+".+","gi").test(n)},Ud=({input:e,hotKeys:t})=>{if(t.value.length===0)return;const n=r=>{!e.value||$d(r,t.value)&&!e.value.contains(r.target)&&(r.preventDefault(),e.value.focus())};it(()=>{document.addEventListener("keydown",n)}),nr(()=>{document.removeEventListener("keydown",n)})},Vd=[{title:"Command Line Tool",headers:[{level:2,title:"Introduction",slug:"introduction",children:[]},{level:2,title:"Downloads",slug:"downloads",children:[]}],path:"/commandline.html",pathLocale:"/",extraFields:[]},{title:"Configuration Options",headers:[{level:2,title:"Introduction",slug:"introduction",children:[]},{level:2,title:"Value Types",slug:"value-types",children:[{level:3,title:"Boolean",slug:"boolean",children:[]},{level:3,title:"String",slug:"string",children:[]},{level:3,title:"String Array",slug:"string-array",children:[]},{level:3,title:"Simple Option",slug:"simple-option",children:[]},{level:3,title:"Option with Path",slug:"option-with-path",children:[]}]},{level:2,title:"Options",slug:"options",children:[{level:3,title:"libraries",slug:"libraries",children:[]},{level:3,title:"exclusions",slug:"exclusions",children:[]},{level:3,title:"ForceExclusions",slug:"forceexclusions",children:[]},{level:3,title:"Watermark",slug:"watermark",children:[]}]},{level:2,title:"Transformers",slug:"transformers",children:[{level:3,title:"AntiDebug",slug:"antidebug",children:[]},{level:3,title:"DecompilerCrasher",slug:"decompilercrasher",children:[]},{level:3,title:"BadAnnotationCrasher",slug:"badannotationcrasher",children:[]},{level:3,title:"Flow",slug:"flow",children:[]}]},{level:2,title:"Renamers",slug:"renamers",children:[{level:3,title:"ClassRenamer",slug:"classrenamer",children:[]},{level:3,title:"FieldRenamer",slug:"fieldrenamer",children:[]},{level:3,title:"LocalVariableRenamer",slug:"localvariablerenamer",children:[]},{level:3,title:"MethodRenamer",slug:"methodrenamer",children:[]}]},{level:2,title:"Optimization",slug:"optimization",children:[{level:3,title:"EnumOptimiser",slug:"enumoptimiser",children:[]},{level:3,title:"FinalRemover",slug:"finalremover",children:[]},{level:3,title:"HideClassMembers",slug:"hideclassmembers",children:[]},{level:3,title:"InsnRemover",slug:"insnremover",children:[]},{level:3,title:"KotlinMetadataRemover",slug:"kotlinmetadataremover",children:[]},{level:3,title:"NOPInsnRemover",slug:"nopinsnremover",children:[]},{level:3,title:"RemoveSignatures",slug:"removesignatures",children:[]}]},{level:2,title:"Poolers",slug:"poolers",children:[{level:3,title:"NumberPooler",slug:"numberpooler",children:[]},{level:3,title:"StringPooler",slug:"stringpooler",children:[]}]},{level:2,title:"Shrinking",slug:"shrinking",children:[{level:3,title:"LineNumberRemover",slug:"linenumberremover",children:[]},{level:3,title:"LocalVariableRemover",slug:"localvariableremover",children:[]},{level:3,title:"RemoveInnerClasses",slug:"removeinnerclasses",children:[]},{level:3,title:"SourceDebugRemover",slug:"sourcedebugremover",children:[]},{level:3,title:"SourceFileRemover",slug:"sourcefileremover",children:[]}]},{level:2,title:"Shufflers",slug:"shufflers",children:[{level:3,title:"ShuffleFields",slug:"shufflefields",children:[]},{level:3,title:"ShuffleMethods",slug:"shufflemethods",children:[]},{level:3,title:"ShuffleClasses",slug:"shuffleclasses",children:[]}]},{level:2,title:"Example",slug:"example",children:[]}],path:"/config.html",pathLocale:"/",extraFields:[]},{title:"General Information",headers:[{level:2,title:"Product Description",slug:"product-description",children:[]},{level:2,title:"Obfuscation Bundles",slug:"obfuscation-bundles",children:[]},{level:2,title:"FAQ",slug:"faq",children:[{level:3,title:"What is the difference between a commercial license and a non-commercial license?",slug:"what-is-the-difference-between-a-commercial-license-and-a-non-commercial-license",children:[]},{level:3,title:"How do I remove the watermark?",slug:"how-do-i-remove-the-watermark",children:[]},{level:3,title:"I currently have a non-commercial license. How do I upgrade to a commercial license?",slug:"i-currently-have-a-non-commercial-license-how-do-i-upgrade-to-a-commercial-license",children:[]}]}],path:"/",pathLocale:"/",extraFields:[]},{title:"Privacy Policy",headers:[{level:2,title:"Interpretation and Definitions",slug:"interpretation-and-definitions",children:[{level:3,title:"Interpretation",slug:"interpretation",children:[]},{level:3,title:"Definitions",slug:"definitions",children:[]}]},{level:2,title:"Collecting and Using Your Personal Data",slug:"collecting-and-using-your-personal-data",children:[{level:3,title:"Types of Data Collected",slug:"types-of-data-collected",children:[]},{level:3,title:"Retention of Your Personal Data",slug:"retention-of-your-personal-data",children:[]},{level:3,title:"Disclosure of Your Personal Data",slug:"disclosure-of-your-personal-data",children:[]}]},{level:2,title:"Children's Privacy",slug:"children-s-privacy",children:[]},{level:2,title:"Links to Other Websites",slug:"links-to-other-websites",children:[]},{level:2,title:"Changes to this Privacy Policy",slug:"changes-to-this-privacy-policy",children:[]},{level:2,title:"Contact Us",slug:"contact-us",children:[]}],path:"/privacy.html",pathLocale:"/",extraFields:[]},{title:"Terms of Service",headers:[{level:2,title:"Interpretation and Definitions",slug:"interpretation-and-definitions",children:[{level:3,title:"Interpretation",slug:"interpretation",children:[]},{level:3,title:"Definitions",slug:"definitions",children:[]}]},{level:2,title:"Use of the Website",slug:"use-of-the-website",children:[]},{level:2,title:"Use of Our Products",slug:"use-of-our-products",children:[]},{level:2,title:"Data Processing",slug:"data-processing",children:[]},{level:2,title:"Disclaimer",slug:"disclaimer",children:[]}],path:"/terms.html",pathLocale:"/",extraFields:[]},{title:"zProtect 0.1",headers:[],path:"/changelog/0.1.html",pathLocale:"/",extraFields:[]},{title:"zProtect 0.2",headers:[],path:"/changelog/0.2.html",pathLocale:"/",extraFields:[]},{title:"Command Line Tool",headers:[],path:"/zh/commandline.html",pathLocale:"/",extraFields:[]},{title:"Configuration Options",headers:[{level:2,title:"Introduction",slug:"introduction",children:[]},{level:2,title:"Value Types",slug:"value-types",children:[{level:3,title:"Boolean",slug:"boolean",children:[]},{level:3,title:"String",slug:"string",children:[]},{level:3,title:"String Array",slug:"string-array",children:[]},{level:3,title:"Simple Option",slug:"simple-option",children:[]},{level:3,title:"Option with Path",slug:"option-with-path",children:[]}]},{level:2,title:"Options",slug:"options",children:[{level:3,title:"Output",slug:"output",children:[]},{level:3,title:"Libraries",slug:"libraries",children:[]},{level:3,title:"Exclusions",slug:"exclusions",children:[]},{level:3,title:"ForceExclusions",slug:"forceexclusions",children:[]},{level:3,title:"Watermark",slug:"watermark",children:[]}]},{level:2,title:"Transformers",slug:"transformers",children:[{level:3,title:"AntiDebug",slug:"antidebug",children:[]},{level:3,title:"DecompilerCrasher",slug:"decompilercrasher",children:[]},{level:3,title:"BadAnnotationCrasher",slug:"badannotationcrasher",children:[]},{level:3,title:"Flow",slug:"flow",children:[]}]},{level:2,title:"Renamers",slug:"renamers",children:[{level:3,title:"ClassRenamer",slug:"classrenamer",children:[]},{level:3,title:"FieldRenamer",slug:"fieldrenamer",children:[]},{level:3,title:"LocalVariableRenamer",slug:"localvariablerenamer",children:[]},{level:3,title:"MethodRenamer",slug:"methodrenamer",children:[]}]},{level:2,title:"Optimization",slug:"optimization",children:[{level:3,title:"EnumOptimiser",slug:"enumoptimiser",children:[]},{level:3,title:"FinalRemover",slug:"finalremover",children:[]},{level:3,title:"HideClassMembers",slug:"hideclassmembers",children:[]},{level:3,title:"InsnRemover",slug:"insnremover",children:[]},{level:3,title:"KotlinMetadataRemover",slug:"kotlinmetadataremover",children:[]},{level:3,title:"NOPInsnRemover",slug:"nopinsnremover",children:[]},{level:3,title:"RemoveSignatures",slug:"removesignatures",children:[]}]},{level:2,title:"Poolers",slug:"poolers",children:[{level:3,title:"NumberPooler",slug:"numberpooler",children:[]},{level:3,title:"StringPooler",slug:"stringpooler",children:[]}]},{level:2,title:"Shrinking",slug:"shrinking",children:[{level:3,title:"LineNumberRemover",slug:"linenumberremover",children:[]},{level:3,title:"LocalVariableRemover",slug:"localvariableremover",children:[]},{level:3,title:"RemoveInnerClasses",slug:"removeinnerclasses",children:[]},{level:3,title:"SourceDebugRemover",slug:"sourcedebugremover",children:[]},{level:3,title:"SourceFileRemover",slug:"sourcefileremover",children:[]}]},{level:2,title:"Shufflers",slug:"shufflers",children:[{level:3,title:"ShuffleFields",slug:"shufflefields",children:[]},{level:3,title:"ShuffleMethods",slug:"shufflemethods",children:[]},{level:3,title:"ShuffleClasses",slug:"shuffleclasses",children:[]}]},{level:2,title:"Example",slug:"example",children:[]}],path:"/zh/config.html",pathLocale:"/",extraFields:[]},{title:"General Information",headers:[{level:2,title:"Product Description",slug:"product-description",children:[]},{level:2,title:"FAQ",slug:"faq",children:[{level:3,title:"What is the difference between a commercial license and a non-commercial license?",slug:"what-is-the-difference-between-a-commercial-license-and-a-non-commercial-license",children:[]},{level:3,title:"How do I remove the watermark?",slug:"how-do-i-remove-the-watermark",children:[]},{level:3,title:"I currently have a non-commercial license. How do I upgrade to a commercial license?",slug:"i-currently-have-a-non-commercial-license-how-do-i-upgrade-to-a-commercial-license",children:[]}]}],path:"/zh/",pathLocale:"/",extraFields:[]},{title:"",headers:[],path:"/404.html",pathLocale:"/",extraFields:[]}],bi=ye(Vd),Kd=()=>bi;cr.webpackHot&&(__VUE_HMR_RUNTIME__.updateSearchIndex=e=>{bi.value=e});const Wd=({searchIndex:e,routeLocale:t,query:n,maxSuggestions:r})=>{const o=ue(()=>e.value.filter(s=>s.pathLocale===t.value));return ue(()=>{const s=n.value.trim().toLowerCase();if(!s)return[];const l=[],i=(a,c)=>{As(s,[c.title])&&l.push({link:`${a.path}#${c.slug}`,title:a.title,header:c.title});for(const u of c.children){if(l.length>=r.value)return;i(a,u)}};for(const a of o.value){if(l.length>=r.value)break;if(As(s,[a.title,...a.extraFields])){l.push({link:a.path,title:a.title});continue}for(const c of a.headers){if(l.length>=r.value)break;i(a,c)}}return l})},qd=e=>{const t=ye(0);return{focusIndex:t,focusNext:()=>{t.value{t.value>0?t.value-=1:t.value=e.value.length-1}}},Yd=ze({name:"SearchBox",props:{locales:{type:Object,required:!1,default:()=>({})},hotKeys:{type:Array,required:!1,default:()=>[]},maxSuggestions:{type:Number,required:!1,default:5}},setup(e){const{locales:t,hotKeys:n,maxSuggestions:r}=pa(e),o=ar(),s=Wl(),l=Kd(),i=ye(null),a=ye(!1),c=ye(""),u=ue(()=>{var S;return(S=t.value[s.value])!=null?S:{}}),d=Wd({searchIndex:l,routeLocale:s,query:c,maxSuggestions:r}),{focusIndex:h,focusNext:g,focusPrev:_}=qd(d);Ud({input:i,hotKeys:n});const L=ue(()=>a.value&&!!d.value.length),R=()=>{!L.value||_()},m=()=>{!L.value||g()},b=S=>{if(!L.value)return;const N=d.value[S];!N||o.push(N.link).then(()=>{c.value="",h.value=0})};return()=>ie("form",{class:"search-box",role:"search"},[ie("input",{ref:i,type:"search",placeholder:u.value.placeholder,autocomplete:"off",spellcheck:!1,value:c.value,onFocus:()=>a.value=!0,onBlur:()=>a.value=!1,onInput:S=>c.value=S.target.value,onKeydown:S=>{switch(S.key){case"ArrowUp":{R();break}case"ArrowDown":{m();break}case"Enter":{S.preventDefault(),b(h.value);break}}}}),L.value&&ie("ul",{class:"suggestions",onMouseleave:()=>h.value=-1},d.value.map(({link:S,title:N,header:B},z)=>ie("li",{class:["suggestion",{focus:h.value===z}],onMouseenter:()=>h.value=z,onMousedown:()=>b(z)},ie("a",{href:S,onClick:M=>M.preventDefault()},[ie("span",{class:"page-title"},N),B&&ie("span",{class:"page-header"},`> ${B}`)]))))])}});const Gd={},Jd=["s","/"],Qd=5;var Zd=at({enhance({app:e}){e.component("SearchBox",t=>ie(Yd,{locales:Gd,hotKeys:Jd,maxSuggestions:Qd,...t}))}}),Xd=at({enhance({app:e,router:t,siteData:n}){},setup(){},rootComponents:[]});const xr=[Cf,Pf,Lf,jf,Wf,Qf,zd,Zd,Xd],eh=[["v-06f9211a","/commandline.html",{title:"Command Line Tool"},["/commandline","/commandline.md"]],["v-31071e3e","/config.html",{title:"Configuration Options"},["/config","/config.md"]],["v-8daa1a0e","/",{title:"General Information"},["/index.html","/index.md"]],["v-08eb506c","/privacy.html",{title:"Privacy Policy"},["/privacy","/privacy.md"]],["v-e0bdb92a","/terms.html",{title:"Terms of Service"},["/terms","/terms.md"]],["v-17d8839a","/changelog/0.1.html",{title:"zProtect 0.1"},["/changelog/0.1","/changelog/0.1.md"]],["v-198d5c39","/changelog/0.2.html",{title:"zProtect 0.2"},["/changelog/0.2","/changelog/0.2.md"]],["v-d0e1d8bc","/zh/commandline.html",{title:"Command Line Tool"},["/zh/commandline","/zh/commandline.md"]],["v-296358af","/zh/config.html",{title:"Configuration Options"},["/zh/config","/zh/config.md"]],["v-2d0ad528","/zh/",{title:"General Information"},["/zh/index.html","/zh/index.md"]],["v-3706649a","/404.html",{title:""},["/404"]]];var th=()=>eh.reduce((e,[t,n,r,o])=>(e.push({name:t,path:n,component:ns,meta:r},...o.map(s=>({path:s,redirect:n}))),e),[{name:"404",path:"/:catchAll(.*)",component:ns}]),nh=Iu,rh=()=>{const e=gf({history:nh(ru(gt.value.base)),routes:th(),scrollBehavior:(t,n,r)=>r||(t.hash?{el:t.hash}:{top:0})});return e.beforeResolve(async(t,n)=>{var r;(t.path!==n.path||n===tt)&&([rt.value]=await Promise.all([Pt.resolvePageData(t.name),(r=$l[t.name])==null?void 0:r.__asyncLoader()]))}),e},oh=e=>{e.component("ClientOnly",du),e.component("Content",hu)},sh=(e,t)=>{const n=ue(()=>Pt.resolveRouteLocale(gt.value.locales,t.currentRoute.value.path)),r=ue(()=>Pt.resolveSiteLocaleData(gt.value,n.value)),o=ue(()=>Pt.resolvePageFrontmatter(rt.value)),s=ue(()=>Pt.resolvePageHeadTitle(rt.value,r.value)),l=ue(()=>Pt.resolvePageHead(s.value,o.value,r.value)),i=ue(()=>Pt.resolvePageLang(rt.value));return e.provide(ho,n),e.provide(ql,r),e.provide(Ul,o),e.provide(au,s),e.provide(Vl,l),e.provide(Kl,i),Object.defineProperties(e.config.globalProperties,{$frontmatter:{get:()=>o.value},$head:{get:()=>l.value},$headTitle:{get:()=>s.value},$lang:{get:()=>i.value},$page:{get:()=>rt.value},$routeLocale:{get:()=>n.value},$site:{get:()=>gt.value},$siteLocale:{get:()=>r.value},$withBase:{get:()=>pu}}),{pageData:rt,pageFrontmatter:o,pageHead:l,pageHeadTitle:s,pageLang:i,routeLocale:n,siteData:gt,siteLocaleData:r}},lh=()=>{const e=go(),t=iu(),n=cu(),r=ye([]),o=()=>{t.value.forEach(l=>{const i=ih(l);i&&r.value.push(i)})},s=()=>{document.documentElement.lang=n.value,r.value.forEach(l=>{l.parentNode===document.head&&document.head.removeChild(l)}),r.value.splice(0,r.value.length),t.value.forEach(l=>{const i=ah(l);i!==null&&(document.head.appendChild(i),r.value.push(i))})};It(fu,s),it(()=>{o(),s(),ot(()=>e.path,()=>s())})},ih=([e,t,n=""])=>{const r=Object.entries(t).map(([i,a])=>me(a)?`[${i}="${a}"]`:a===!0?`[${i}]`:"").join(""),o=`head > ${e}${r}`;return Array.from(document.querySelectorAll(o)).find(i=>i.innerText===n)||null},ah=([e,t,n])=>{if(!me(e))return null;const r=document.createElement(e);return Hl(t)&&Object.entries(t).forEach(([o,s])=>{me(s)?r.setAttribute(o,s):s===!0&&r.setAttribute(o,"")}),me(n)&&r.appendChild(document.createTextNode(n)),r},ch=Qc,uh=async()=>{var n;const e=ch({name:"VuepressApp",setup(){var r;lh();for(const o of xr)(r=o.setup)==null||r.call(o);return()=>[ie(si),...xr.flatMap(({rootComponents:o=[]})=>o.map(s=>ie(s)))]}}),t=rh();oh(e),sh(e,t);for(const r of xr)await((n=r.enhance)==null?void 0:n.call(r,{app:e,router:t,siteData:gt}));return e.use(t),{app:e,router:t}};uh().then(({app:e,router:t})=>{t.isReady().then(()=>{e.mount("#app")})});export{mh as $,uu as A,bh as B,wh as C,ie as D,pu as E,Ae as F,du as G,_n as H,ye as I,ot as J,fh as K,gh as L,ou as M,ru as N,ar as O,me as P,Ad as Q,it as R,Yn as S,fo as T,xn as U,Eh as V,Hl as W,_h as X,so as Y,nr as Z,ci as _,Il as a,io as a0,kd as a1,be as b,Ol as c,uh as createVueApp,hh as d,co as e,ze as f,yi as g,Ge as h,lu as i,ue as j,G as k,dh as l,ph as m,go as n,rr as o,pa as p,Ll as q,Ua as r,hc as s,Ti as t,Wl as u,vl as v,Sa as w,nu as x,vh as y,yh as z}; diff --git a/docs/.vuepress/dist/assets/back-to-top.8efcbe56.svg b/docs/.vuepress/dist/assets/back-to-top.8efcbe56.svg new file mode 100644 index 0000000..8323678 --- /dev/null +++ b/docs/.vuepress/dist/assets/back-to-top.8efcbe56.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/.vuepress/dist/assets/commandline.html.0cdd07e7.js b/docs/.vuepress/dist/assets/commandline.html.0cdd07e7.js new file mode 100644 index 0000000..a8c10fa --- /dev/null +++ b/docs/.vuepress/dist/assets/commandline.html.0cdd07e7.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-06f9211a","path":"/commandline.html","title":"Command Line Tool","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Introduction","slug":"introduction","children":[]},{"level":2,"title":"Downloads","slug":"downloads","children":[]}],"git":{"updatedTime":1663162001000},"filePathRelative":"commandline.md"}');export{e as data}; diff --git a/docs/.vuepress/dist/assets/commandline.html.15f2e1ec.js b/docs/.vuepress/dist/assets/commandline.html.15f2e1ec.js new file mode 100644 index 0000000..402d28c --- /dev/null +++ b/docs/.vuepress/dist/assets/commandline.html.15f2e1ec.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-d0e1d8bc","path":"/zh/commandline.html","title":"Command Line Tool","lang":"en-US","frontmatter":{},"excerpt":"","headers":[],"git":{"updatedTime":1661350568000},"filePathRelative":"zh/commandline.md"}');export{e as data}; diff --git a/docs/.vuepress/dist/assets/commandline.html.18ab6d88.js b/docs/.vuepress/dist/assets/commandline.html.18ab6d88.js new file mode 100644 index 0000000..646239d --- /dev/null +++ b/docs/.vuepress/dist/assets/commandline.html.18ab6d88.js @@ -0,0 +1 @@ +import{_ as r,o as l,c,a as e,b as o,d as s,e as n,r as d}from"./app.fe610a35.js";const a={},i=s('

Command Line Tool

Introduction

The zProtect web interface uses a bundle.zst file to recieve data. This is created using the zProtect command line tool. Other operations would also be available in the future. Please use the --help flag on the command line tool for more information on available operations.

Downloads

',4),_=e("thead",null,[e("tr",null,[e("th",null,"Operating System"),e("th",null,"Architecture"),e("th",null,"Download")])],-1),h=e("td",null,"Windows",-1),u=e("td",null,"64-bit (AMD64)",-1),b={href:"https://objects.n23.io/4bcb968ea2654ee1be650d6be455725e:bucket1/zprotect-cli%2Fv0%2Fzprotect-windows-amd64.exe",target:"_blank",rel:"noopener noreferrer"},p=n("Here"),f=e("td",null,null,-1),m=e("td",null,"32-bit (i386)",-1),k={href:"https://objects.n23.io/4bcb968ea2654ee1be650d6be455725e:bucket1/zprotect-cli%2Fv0%2Fzprotect-windows-386.exe",target:"_blank",rel:"noopener noreferrer"},z=n("Here"),x=e("td",null,"MacOs (Darwin)",-1),F=e("td",null,"64-bit (AMD64)",-1),v={href:"https://objects.n23.io/4bcb968ea2654ee1be650d6be455725e:bucket1/zprotect-cli%2Fv0%2Fzprotect-darwin-amd64",target:"_blank",rel:"noopener noreferrer"},w=n("Here"),g=e("td",null,null,-1),A=e("td",null,"64-bit (AArch64)",-1),j={href:"https://objects.n23.io/4bcb968ea2654ee1be650d6be455725e:bucket1/zprotect-cli%2Fv0%2Fzprotect-darwin-arm64",target:"_blank",rel:"noopener noreferrer"},H=n("Here"),D=e("td",null,"Linux",-1),L=e("td",null,"64-bit (AMD64)",-1),M={href:"https://objects.n23.io/4bcb968ea2654ee1be650d6be455725e:bucket1/zprotect-cli%2Fv0%2Fzprotect-linux-amd64",target:"_blank",rel:"noopener noreferrer"},N=n("Here"),T=e("td",null,null,-1),V=e("td",null,"64-bit (AArch64)",-1),B={href:"https://objects.n23.io/4bcb968ea2654ee1be650d6be455725e:bucket1/zprotect-cli%2Fv0%2Fzprotect-linux-arm64",target:"_blank",rel:"noopener noreferrer"},E=n("Here"),I=e("td",null,null,-1),O=e("td",null,"32-bit (i386)",-1),P={href:"https://objects.n23.io/4bcb968ea2654ee1be650d6be455725e:bucket1/zprotect-cli%2Fv0%2Fzprotect-linux-386",target:"_blank",rel:"noopener noreferrer"},y=n("Here"),C=e("td",null,null,-1),S=e("td",null,"32-bit (AArch32)",-1),W={href:"https://objects.n23.io/4bcb968ea2654ee1be650d6be455725e:bucket1/zprotect-cli%2Fv0%2Fzprotect-linux-arm",target:"_blank",rel:"noopener noreferrer"},q=n("Here");function G(J,K){const t=d("ExternalLinkIcon");return l(),c("div",null,[i,e("table",null,[_,e("tbody",null,[e("tr",null,[h,u,e("td",null,[e("a",b,[p,o(t)])])]),e("tr",null,[f,m,e("td",null,[e("a",k,[z,o(t)])])]),e("tr",null,[x,F,e("td",null,[e("a",v,[w,o(t)])])]),e("tr",null,[g,A,e("td",null,[e("a",j,[H,o(t)])])]),e("tr",null,[D,L,e("td",null,[e("a",M,[N,o(t)])])]),e("tr",null,[T,V,e("td",null,[e("a",B,[E,o(t)])])]),e("tr",null,[I,O,e("td",null,[e("a",P,[y,o(t)])])]),e("tr",null,[C,S,e("td",null,[e("a",W,[q,o(t)])])])])])])}var R=r(a,[["render",G],["__file","commandline.html.vue"]]);export{R as default}; diff --git a/docs/.vuepress/dist/assets/commandline.html.4dc00259.js b/docs/.vuepress/dist/assets/commandline.html.4dc00259.js new file mode 100644 index 0000000..d56f020 --- /dev/null +++ b/docs/.vuepress/dist/assets/commandline.html.4dc00259.js @@ -0,0 +1 @@ +import{_ as n,o as a,c as t,a as e,e as o}from"./app.fe610a35.js";const c={},l=e("h1",{id:"command-line-tool",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#command-line-tool","aria-hidden":"true"},"#"),o(" Command Line Tool")],-1),i=e("p",null,[o("Documentation coming soon. In the mean time, please use the "),e("code",null,"--help"),o(" flag for more information.")],-1),m=[l,i];function r(s,d){return a(),t("div",null,m)}var h=n(c,[["render",r],["__file","commandline.html.vue"]]);export{h as default}; diff --git a/docs/.vuepress/dist/assets/config.html.24d9df8b.js b/docs/.vuepress/dist/assets/config.html.24d9df8b.js new file mode 100644 index 0000000..06a8ef2 --- /dev/null +++ b/docs/.vuepress/dist/assets/config.html.24d9df8b.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-31071e3e","path":"/config.html","title":"Configuration Options","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Introduction","slug":"introduction","children":[]},{"level":2,"title":"Value Types","slug":"value-types","children":[{"level":3,"title":"Boolean","slug":"boolean","children":[]},{"level":3,"title":"String","slug":"string","children":[]},{"level":3,"title":"String Array","slug":"string-array","children":[]},{"level":3,"title":"Simple Option","slug":"simple-option","children":[]},{"level":3,"title":"Option with Path","slug":"option-with-path","children":[]}]},{"level":2,"title":"Options","slug":"options","children":[{"level":3,"title":"libraries","slug":"libraries","children":[]},{"level":3,"title":"exclusions","slug":"exclusions","children":[]},{"level":3,"title":"ForceExclusions","slug":"forceexclusions","children":[]},{"level":3,"title":"Watermark","slug":"watermark","children":[]}]},{"level":2,"title":"Transformers","slug":"transformers","children":[{"level":3,"title":"AntiDebug","slug":"antidebug","children":[]},{"level":3,"title":"DecompilerCrasher","slug":"decompilercrasher","children":[]},{"level":3,"title":"BadAnnotationCrasher","slug":"badannotationcrasher","children":[]},{"level":3,"title":"Flow","slug":"flow","children":[]}]},{"level":2,"title":"Renamers","slug":"renamers","children":[{"level":3,"title":"ClassRenamer","slug":"classrenamer","children":[]},{"level":3,"title":"FieldRenamer","slug":"fieldrenamer","children":[]},{"level":3,"title":"LocalVariableRenamer","slug":"localvariablerenamer","children":[]},{"level":3,"title":"MethodRenamer","slug":"methodrenamer","children":[]}]},{"level":2,"title":"Optimization","slug":"optimization","children":[{"level":3,"title":"EnumOptimiser","slug":"enumoptimiser","children":[]},{"level":3,"title":"FinalRemover","slug":"finalremover","children":[]},{"level":3,"title":"HideClassMembers","slug":"hideclassmembers","children":[]},{"level":3,"title":"InsnRemover","slug":"insnremover","children":[]},{"level":3,"title":"KotlinMetadataRemover","slug":"kotlinmetadataremover","children":[]},{"level":3,"title":"NOPInsnRemover","slug":"nopinsnremover","children":[]},{"level":3,"title":"RemoveSignatures","slug":"removesignatures","children":[]}]},{"level":2,"title":"Poolers","slug":"poolers","children":[{"level":3,"title":"NumberPooler","slug":"numberpooler","children":[]},{"level":3,"title":"StringPooler","slug":"stringpooler","children":[]}]},{"level":2,"title":"Shrinking","slug":"shrinking","children":[{"level":3,"title":"LineNumberRemover","slug":"linenumberremover","children":[]},{"level":3,"title":"LocalVariableRemover","slug":"localvariableremover","children":[]},{"level":3,"title":"RemoveInnerClasses","slug":"removeinnerclasses","children":[]},{"level":3,"title":"SourceDebugRemover","slug":"sourcedebugremover","children":[]},{"level":3,"title":"SourceFileRemover","slug":"sourcefileremover","children":[]}]},{"level":2,"title":"Shufflers","slug":"shufflers","children":[{"level":3,"title":"ShuffleFields","slug":"shufflefields","children":[]},{"level":3,"title":"ShuffleMethods","slug":"shufflemethods","children":[]},{"level":3,"title":"ShuffleClasses","slug":"shuffleclasses","children":[]}]},{"level":2,"title":"Example","slug":"example","children":[]}],"git":{"updatedTime":1661874443000},"filePathRelative":"config.md"}');export{e as data}; diff --git a/docs/.vuepress/dist/assets/config.html.2e9b9f19.js b/docs/.vuepress/dist/assets/config.html.2e9b9f19.js new file mode 100644 index 0000000..e88ddf6 --- /dev/null +++ b/docs/.vuepress/dist/assets/config.html.2e9b9f19.js @@ -0,0 +1,107 @@ +import{_ as r,o as p,c,a as s,b as a,e,d as i,r as l}from"./app.fe610a35.js";const t={},d=s("h1",{id:"configuration-options",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#configuration-options","aria-hidden":"true"},"#"),e(" Configuration Options")],-1),h=s("h2",{id:"introduction",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#introduction","aria-hidden":"true"},"#"),e(" Introduction")],-1),u=e("zProtect uses the "),m={href:"https://en.wikipedia.org/wiki/YAML",target:"_blank",rel:"noopener noreferrer"},D=e("YAML"),v=e(" data serialization language for configuring the behavior of the zProtect obfuscator. It is possible to hand-write the configuration file to upload on the web interface, however, you may wish to use the configurator tool in the zProtect dashboard area."),y=i(`

Value Types

There are a few value types used in the zProtect configuration, which are listed below.

Boolean

Only accepts true and false as the value.

For example:

# A key with value as true
+key1: true
+
+# A key with value as false
+key2: false
+

String

Accepts any text character.

For example:

# A key with a string value
+key: value
+

String Array

A list of strings, separated by a newline and prefixed with a dash.

For example:

# An array with entries
+key:
+- something
+- another thing
+
+# An empty array
+empty: []
+

Simple Option

A string array with a boolean value enabled.

For example:

# Option enabled
+key:
+  enabled: true
+

Option with Path

A string array with a boolean key enabled and a string key path.

For example:

# Option enabled
+key:
+  enabled: true
+  path: something
+

Options

These options specify runtime information and general configuration.

Output

Name of the obfuscated JAR file.

Value type: string

Libraries

Dependencies required to obfuscate your jar to prevent "Not found" errors.

Value type: string array

Exclusions

Class files and directories that should be ignored by the obfuscator. They will not have any obfuscation applied to them.

Value type: string array

ForceExclusions

Note

Transformer priority will fix this in the future.

Class files and directories that should be blacklisted by the obfuscator before processing. This will prevent issues with exclusions if the regular exclusions fail for some unknown reason.

Value type: string array

Watermark

Adds a watermark to the obfuscated JAR for advertisement. Only removable for users with a Commercial License.

Value type: boolean

Transformers

These options specify wherether to enable available obfuscation techniques.

`,42),b={id:"antidebug",tabindex:"-1"},f=s("a",{class:"header-anchor",href:"#antidebug","aria-hidden":"true"},"#",-1),C=e(" AntiDebug "),g=s("div",{class:"custom-container tip"},[s("p",{class:"custom-container-title"},"Warning!"),s("p",null,"This option may cause issues with certain programs.")],-1),x=s("p",null,"Blocks debugging options on terminal.",-1),_=s("p",null,[e("Value type: "),s("a",{href:"#simple-option"},[s("code",null,"simple option")])],-1),k={id:"decompilercrasher",tabindex:"-1"},w=s("a",{class:"header-anchor",href:"#decompilercrasher","aria-hidden":"true"},"#",-1),A=e(" DecompilerCrasher "),R=i(`

Warning!

This option is very buggy at the moment and will likely cause problems. You are strongly advised not to use this.

Manipulates instructions to crash decompilers.

Value type: simple option

BadAnnotationCrasher

Manipulates annotations to break bad decompilers. This should not cause any major issues.

Value type: simple option

Flow

Adds fake jumps, and such to code.

Value type: simple option

Renamers

Renames various components of your jar's contents.

ClassRenamer

Renames class files.

Value type: option with path

FieldRenamer

Renames field names.

Value type: simple option

LocalVariableRenamer

Renames local variables.

Value type: simple option

MethodRenamer

Renames methods.

Value type: simple option

Optimization

EnumOptimiser

Value type: simple option

FinalRemover

Value type: simple option

HideClassMembers

Value type: simple option

InsnRemover

Value type: simple option

KotlinMetadataRemover

Value type: simple option

NOPInsnRemover

Value type: simple option

RemoveSignatures

Value type: simple option

Poolers

NumberPooler

Value type: simple option

StringPooler

Value type: simple option

Shrinking

LineNumberRemover

Value type: simple option

LocalVariableRemover

Value type: simple option

RemoveInnerClasses

Value type: simple option

SourceDebugRemover

Value type: simple option

SourceFileRemover

Value type: simple option

Shufflers

ShuffleFields

Value type: simple option

ShuffleMethods

Value type: simple option

ShuffleClasses

Value type: simple option

Example

Below is a fully functional example configuration file with some zProtect transformers enabled and some disabled.

# Blocks debugging options on terminal, may cause issues with certain programs.
+AntiDebug:
+  enabled: false
+
+# Manipulates instructions to crash decompilers. Currently very buggy at the moment and will likely cause problems.
+# Strongly advised not to use this.
+DecompilerCrasher:
+  enabled: false
+
+# Manipulates annotations to break bad decompilers.
+# This should not cause any major issues with Spigot jars.
+BadAnnotationCrasher:
+  enabled: true
+
+# Adds fake jumps, and such to code.
+Flow:
+  enabled: false
+
+# Renames various components of your jar's contents.
+# Renames class files.
+ClassRenamer:
+  enabled: false
+  path: ""
+
+# Renames field names.
+FieldRenamer:
+  enabled: false
+
+# Renames local variables.
+LocalVariableRenamer:
+  enabled: false
+
+# Renames methods.
+MethodRenamer:
+  enabled: false
+
+# Optimization
+EnumOptimiser:
+  enabled: false
+
+FinalRemover:
+  enabled: false
+
+HideClassMembers:
+  enabled: false
+
+InsnRemover:
+  enabled: false
+
+KotlinMetadataRemover:
+  enabled: false
+
+NOPInsnRemover:
+  enabled: false
+
+RemoveSignatures:
+  enabled: false
+
+# Poolers
+NumberPooler:
+  enabled: false
+
+StringPooler:
+  enabled: false
+
+# Shrinking
+LineNumberRemover:
+  enabled: false
+
+LocalVariableRemover:
+  enabled: false
+
+RemoveInnerClasses:
+  enabled: false
+
+SourceDebugRemover:
+  enabled: false
+
+SourceFileRemover:
+  enabled: false
+
+# Shufflers
+ShuffleFields: false
+ShuffleMethods: false
+ShuffleClasses: false
+
`,64);function V(E,S){const o=l("ExternalLinkIcon"),n=l("Badge");return p(),c("div",null,[d,h,s("p",null,[u,s("a",m,[D,a(o)]),v]),y,s("h3",b,[f,C,a(n,{type:"warning",text:"incompatibilities",vertical:"top"})]),g,x,_,s("h3",k,[w,A,a(n,{type:"danger",text:"issues",vertical:"top"})]),R])}var O=r(t,[["render",V],["__file","config.html.vue"]]);export{O as default}; diff --git a/docs/.vuepress/dist/assets/config.html.4750604a.js b/docs/.vuepress/dist/assets/config.html.4750604a.js new file mode 100644 index 0000000..e1abda5 --- /dev/null +++ b/docs/.vuepress/dist/assets/config.html.4750604a.js @@ -0,0 +1,103 @@ +import{_ as p,o as t,c,a as e,b as a,w as d,e as s,d as o,r as n}from"./app.fe610a35.js";const h={},m=e("h1",{id:"configuration-options",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#configuration-options","aria-hidden":"true"},"#"),s(" Configuration Options")],-1),u=e("h2",{id:"introduction",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#introduction","aria-hidden":"true"},"#"),s(" Introduction")],-1),D=s("zProtect uses the "),v={href:"https://en.wikipedia.org/wiki/YAML",target:"_blank",rel:"noopener noreferrer"},y=s("YAML"),b=s(" data serialization language for configuring the behavior of the zProtect obfuscator. It is possible to hand-write the configuration file to upload on the web interface, however, you may wish to modify the "),f=e("a",{href:"#example"},"example file",-1),C=s(" or generate one using the "),g=s("command line tool"),x=s("."),_=o(`

Value Types

There are a few value types used in the zProtect configuration, which are listed below.

Boolean

Only accepts true and false as the value.

For example:

# A key with value as true
+key1: true
+
+# A key with value as false
+key2: false
+

String

Accepts any text character.

For example:

# A key with a string value
+key: value
+

String Array

A list of strings, separated by a newline and prefixed with a dash.

For example:

# An array with entries
+key:
+- something
+- another thing
+
+# An empty array
+empty: []
+

Simple Option

A string array with a boolean value enabled.

For example:

# Option enabled
+key:
+  enabled: true
+

Option with Path

A string array with a boolean key enabled and a string key path.

For example:

# Option enabled
+key:
+  enabled: true
+  path: something
+

Options

These options specify runtime information and general configuration.

libraries

Dependencies required to obfuscate your jar to prevent "Not found" errors.

Value type: string array

exclusions

Class files and directories that should be ignored by the obfuscator. They will not have any obfuscation applied to them.

Value type: string array

ForceExclusions

Note

Transformer priority will fix this in the future.

Class files and directories that should be blacklisted by the obfuscator before processing. This will prevent issues with exclusions if the regular exclusions fail for some unknown reason.

Value type: string array

Watermark

Adds a watermark to the obfuscated JAR for advertisement. Only removable for users with a Commercial License.

Value type: boolean

Transformers

These options specify wherether to enable available obfuscation techniques.

`,39),k={id:"antidebug",tabindex:"-1"},R=e("a",{class:"header-anchor",href:"#antidebug","aria-hidden":"true"},"#",-1),w=s(" AntiDebug "),V=e("div",{class:"custom-container tip"},[e("p",{class:"custom-container-title"},"Warning!"),e("p",null,"This option may cause issues with certain programs.")],-1),A=e("p",null,"Blocks debugging options on terminal.",-1),E=e("p",null,[s("Value type: "),e("a",{href:"#simple-option"},[e("code",null,"simple option")])],-1),S={id:"decompilercrasher",tabindex:"-1"},M=e("a",{class:"header-anchor",href:"#decompilercrasher","aria-hidden":"true"},"#",-1),F=s(" DecompilerCrasher "),N=o(`

Warning!

This option is very buggy at the moment and will likely cause problems. You are strongly advised not to use this.

Manipulates instructions to crash decompilers.

Value type: simple option

BadAnnotationCrasher

Manipulates annotations to break bad decompilers. This should not cause any major issues.

Value type: simple option

Flow

Adds fake jumps, and such to code.

Value type: simple option

Renamers

Renames various components of your JAR's contents.

ClassRenamer

Renames class files.

Value type: option with path

FieldRenamer

Renames field names.

Value type: simple option

LocalVariableRenamer

Renames local variables.

Value type: simple option

MethodRenamer

Renames methods.

Value type: simple option

Optimization

Modifies or removes various aspects of your jar file to make debugging harder.

EnumOptimiser

Removes all clone call(s) and returns an array to optimize enum values.

Value type: simple option

FinalRemover

Removes finals from your code.

Value type: simple option

HideClassMembers

Mark classes as synthetic to hide them from bad decompilers.

Value type: simple option

InsnRemover

Removes the instructions const_. and tableswitch.

Value type: simple option

KotlinMetadataRemover

Removes Kotlin-specific Metadata such as NotNull, Nullable, etc.

Value type: simple option

NOPInsnRemover

Removes extended type information.

Value type: simple option

RemoveSignatures

Removes the signature attribute from classes and methods.

Value type: simple option

Poolers

Move values into an array to make the resulting JAR harder.

NumberPooler

Moves numbers into an array.

Value type: simple option

StringPooler

Moves strings into an array.

Value type: simple option

Shrinking

Remove various attributes to make it harder to understand the resulting JAR.

LineNumberRemover

Removes line numbers so StackTraces show (Unknown) on errors.

Value type: simple option

LocalVariableRemover

Removes the local variable attribute from methods.

Value type: simple option

RemoveInnerClasses

Removes various attributes such as outerClass, outerMethod, etc. from the class.

Value type: simple option

SourceDebugRemover

Removes the SourceDebug attribute from the class.

Value type: simple option

SourceFileRemover

Removes the SourceFile attribute from the class.

Value type: simple option

Shufflers

Randomly shuffles various elements of your jar file to make it more difficult to find them.

ShuffleFields

Randomly shuffles elements in the mutable list of fields.

Value type: simple option

ShuffleMethods

Randomly shuffles elements in the mutable list of methods.

Value type: simple option

ShuffleClasses

Randomly shuffles elements in the mutable list of classes.

Value type: simple option

Example

Below is a fully functional example configuration file with some zProtect transformers enabled and some disabled.

# zProtect Configuration File Version 1
+# Reference: https://docs.zprotect.dev/config.html
+
+# May cause issues with certain programs.
+antiDebug:
+  enabled: false
+
+# Strongly advised not to use this.
+decompilerCrasher:
+  enabled: false
+
+badAnnotationCrasher:
+  enabled: true
+
+flow:
+  enabled: false
+
+classRenamer:
+  enabled: false
+  path: ""
+
+fieldRenamer:
+  enabled: false
+
+localVariableRenamer:
+  enabled: false
+
+methodRenamer:
+  enabled: false
+
+# Optimization
+enumOptimiser:
+  enabled: false
+
+finalRemover:
+  enabled: false
+
+hideClassMembers:
+  enabled: false
+
+insnRemover:
+  enabled: false
+
+kotlinMetadataRemover:
+  enabled: false
+
+NOPInsnRemover:
+  enabled: false
+
+removeSignatures:
+  enabled: false
+
+# Poolers
+numberPooler:
+  enabled: false
+
+stringPooler:
+  enabled: false
+
+# Shrinking
+lineNumberRemover:
+  enabled: false
+
+localVariableRemover:
+  enabled: false
+
+removeInnerClasses:
+  enabled: false
+
+sourceDebugRemover:
+  enabled: false
+
+sourceFileRemover:
+  enabled: false
+
+# Shufflers
+shuffleFields: false
+
+shuffleMethods: false
+
+shuffleClasses: false
+
`,85);function O(P,T){const i=n("ExternalLinkIcon"),r=n("RouterLink"),l=n("Badge");return t(),c("div",null,[m,u,e("p",null,[D,e("a",v,[y,a(i)]),b,f,C,a(r,{to:"/commandline.html"},{default:d(()=>[g]),_:1}),x]),_,e("h3",k,[R,w,a(l,{type:"warning",text:"incompatibilities",vertical:"top"})]),V,A,E,e("h3",S,[M,F,a(l,{type:"danger",text:"issues",vertical:"top"})]),N])}var L=p(h,[["render",O],["__file","config.html.vue"]]);export{L as default}; diff --git a/docs/.vuepress/dist/assets/config.html.533c1ab4.js b/docs/.vuepress/dist/assets/config.html.533c1ab4.js new file mode 100644 index 0000000..973a809 --- /dev/null +++ b/docs/.vuepress/dist/assets/config.html.533c1ab4.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-296358af","path":"/zh/config.html","title":"Configuration Options","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Introduction","slug":"introduction","children":[]},{"level":2,"title":"Value Types","slug":"value-types","children":[{"level":3,"title":"Boolean","slug":"boolean","children":[]},{"level":3,"title":"String","slug":"string","children":[]},{"level":3,"title":"String Array","slug":"string-array","children":[]},{"level":3,"title":"Simple Option","slug":"simple-option","children":[]},{"level":3,"title":"Option with Path","slug":"option-with-path","children":[]}]},{"level":2,"title":"Options","slug":"options","children":[{"level":3,"title":"Output","slug":"output","children":[]},{"level":3,"title":"Libraries","slug":"libraries","children":[]},{"level":3,"title":"Exclusions","slug":"exclusions","children":[]},{"level":3,"title":"ForceExclusions","slug":"forceexclusions","children":[]},{"level":3,"title":"Watermark","slug":"watermark","children":[]}]},{"level":2,"title":"Transformers","slug":"transformers","children":[{"level":3,"title":"AntiDebug","slug":"antidebug","children":[]},{"level":3,"title":"DecompilerCrasher","slug":"decompilercrasher","children":[]},{"level":3,"title":"BadAnnotationCrasher","slug":"badannotationcrasher","children":[]},{"level":3,"title":"Flow","slug":"flow","children":[]}]},{"level":2,"title":"Renamers","slug":"renamers","children":[{"level":3,"title":"ClassRenamer","slug":"classrenamer","children":[]},{"level":3,"title":"FieldRenamer","slug":"fieldrenamer","children":[]},{"level":3,"title":"LocalVariableRenamer","slug":"localvariablerenamer","children":[]},{"level":3,"title":"MethodRenamer","slug":"methodrenamer","children":[]}]},{"level":2,"title":"Optimization","slug":"optimization","children":[{"level":3,"title":"EnumOptimiser","slug":"enumoptimiser","children":[]},{"level":3,"title":"FinalRemover","slug":"finalremover","children":[]},{"level":3,"title":"HideClassMembers","slug":"hideclassmembers","children":[]},{"level":3,"title":"InsnRemover","slug":"insnremover","children":[]},{"level":3,"title":"KotlinMetadataRemover","slug":"kotlinmetadataremover","children":[]},{"level":3,"title":"NOPInsnRemover","slug":"nopinsnremover","children":[]},{"level":3,"title":"RemoveSignatures","slug":"removesignatures","children":[]}]},{"level":2,"title":"Poolers","slug":"poolers","children":[{"level":3,"title":"NumberPooler","slug":"numberpooler","children":[]},{"level":3,"title":"StringPooler","slug":"stringpooler","children":[]}]},{"level":2,"title":"Shrinking","slug":"shrinking","children":[{"level":3,"title":"LineNumberRemover","slug":"linenumberremover","children":[]},{"level":3,"title":"LocalVariableRemover","slug":"localvariableremover","children":[]},{"level":3,"title":"RemoveInnerClasses","slug":"removeinnerclasses","children":[]},{"level":3,"title":"SourceDebugRemover","slug":"sourcedebugremover","children":[]},{"level":3,"title":"SourceFileRemover","slug":"sourcefileremover","children":[]}]},{"level":2,"title":"Shufflers","slug":"shufflers","children":[{"level":3,"title":"ShuffleFields","slug":"shufflefields","children":[]},{"level":3,"title":"ShuffleMethods","slug":"shufflemethods","children":[]},{"level":3,"title":"ShuffleClasses","slug":"shuffleclasses","children":[]}]},{"level":2,"title":"Example","slug":"example","children":[]}],"git":{"updatedTime":1661350568000},"filePathRelative":"zh/config.md"}');export{e as data}; diff --git a/docs/.vuepress/dist/assets/index.html.3175b1e4.js b/docs/.vuepress/dist/assets/index.html.3175b1e4.js new file mode 100644 index 0000000..9d9a82e --- /dev/null +++ b/docs/.vuepress/dist/assets/index.html.3175b1e4.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-2d0ad528","path":"/zh/","title":"General Information","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Product Description","slug":"product-description","children":[]},{"level":2,"title":"FAQ","slug":"faq","children":[{"level":3,"title":"What is the difference between a commercial license and a non-commercial license?","slug":"what-is-the-difference-between-a-commercial-license-and-a-non-commercial-license","children":[]},{"level":3,"title":"How do I remove the watermark?","slug":"how-do-i-remove-the-watermark","children":[]},{"level":3,"title":"I currently have a non-commercial license. How do I upgrade to a commercial license?","slug":"i-currently-have-a-non-commercial-license-how-do-i-upgrade-to-a-commercial-license","children":[]}]}],"git":{"updatedTime":1661350568000},"filePathRelative":"zh/index.md"}');export{e as data}; diff --git a/docs/.vuepress/dist/assets/index.html.7c543494.js b/docs/.vuepress/dist/assets/index.html.7c543494.js new file mode 100644 index 0000000..e85cc9b --- /dev/null +++ b/docs/.vuepress/dist/assets/index.html.7c543494.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as o,d as t}from"./app.fe610a35.js";const r={},n=t('

General Information

Product Description

zProtect is an online obfuscation platform. Our product makes your Java\u2122 software (and by extention, languages that transpile to Java\u2122[1]) more difficult to reverse engineer.

FAQ

What is the difference between a commercial license and a non-commercial license?

A non-commercial license has licensing limits that disallow the use of the zProtect obfuscator on any software that you intend to distribute commercially (i.e. for monetary gain). However, a commercial license lifts these limits, and allows you to use the zProtect obfuscator on any software.

How do I remove the watermark?

A commercial license is required to unlock the option to remove the watermark. This behavior is intentional.

I currently have a non-commercial license. How do I upgrade to a commercial license?

At the moment, it is not possible to upgrade to a commercial license from a non-commercial license on the web interface. Please contact zProtect support to discuss your options.


  1. Guarunteed support for Kotlin\u2122 and Java\u2122. Other JVM languages are supported on a best effort basis. \u21A9\uFE0E

',12),i=[n];function c(s,l){return a(),o("div",null,i)}var h=e(r,[["render",c],["__file","index.html.vue"]]);export{h as default}; diff --git a/docs/.vuepress/dist/assets/index.html.8005e5a3.js b/docs/.vuepress/dist/assets/index.html.8005e5a3.js new file mode 100644 index 0000000..8d36718 --- /dev/null +++ b/docs/.vuepress/dist/assets/index.html.8005e5a3.js @@ -0,0 +1 @@ +import{_ as i,o as s,c,a as n,b as a,w as t,d as r,e,r as l}from"./app.fe610a35.js";const d={},h=r('

General Information

Product Description

zProtect is an online obfuscation platform. Our product makes your Java\u2122 software (and by extention, languages that transpile to Java\u2122[1]) more difficult to reverse engineer.

Obfuscation Bundles

',4),m=e("For better efficency and lower bandwidth usage, users are required to create zProtect "),f=n("code",null,"bundle.zst",-1),u=e(" files using the zProtect command line tool's "),p=e("bundle command"),_=e(". You may download this tool "),b=e("here"),w=e("."),v=r('

FAQ

What is the difference between a commercial license and a non-commercial license?

A non-commercial license has licensing limits that disallow the use of the zProtect obfuscator on any software that you intend to distribute commercially (i.e. for monetary gain). However, a commercial license lifts these limits, and allows you to use the zProtect obfuscator on any software.

How do I remove the watermark?

A commercial license is required to unlock the option to remove the watermark. This behavior is intentional.

I currently have a non-commercial license. How do I upgrade to a commercial license?

At the moment, it is not possible to upgrade to a commercial license from a non-commercial license on the web interface. Please contact zProtect support to discuss your options.


  1. Guarunteed support for Kotlin\u2122 and Java\u2122. Other JVM languages are supported on a best effort basis. \u21A9\uFE0E

',9);function g(x,y){const o=l("RouterLink");return s(),c("div",null,[h,n("p",null,[m,f,u,a(o,{to:"/commandline.html"},{default:t(()=>[p]),_:1}),_,a(o,{to:"/commandline.html#downloads"},{default:t(()=>[b]),_:1}),w]),v])}var P=i(d,[["render",g],["__file","index.html.vue"]]);export{P as default}; diff --git a/docs/.vuepress/dist/assets/index.html.9efec093.js b/docs/.vuepress/dist/assets/index.html.9efec093.js new file mode 100644 index 0000000..9e63049 --- /dev/null +++ b/docs/.vuepress/dist/assets/index.html.9efec093.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-8daa1a0e","path":"/","title":"General Information","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Product Description","slug":"product-description","children":[]},{"level":2,"title":"Obfuscation Bundles","slug":"obfuscation-bundles","children":[]},{"level":2,"title":"FAQ","slug":"faq","children":[{"level":3,"title":"What is the difference between a commercial license and a non-commercial license?","slug":"what-is-the-difference-between-a-commercial-license-and-a-non-commercial-license","children":[]},{"level":3,"title":"How do I remove the watermark?","slug":"how-do-i-remove-the-watermark","children":[]},{"level":3,"title":"I currently have a non-commercial license. How do I upgrade to a commercial license?","slug":"i-currently-have-a-non-commercial-license-how-do-i-upgrade-to-a-commercial-license","children":[]}]}],"git":{"updatedTime":1661707252000},"filePathRelative":"index.md"}');export{e as data}; diff --git a/docs/.vuepress/dist/assets/privacy.html.5ecb4b69.js b/docs/.vuepress/dist/assets/privacy.html.5ecb4b69.js new file mode 100644 index 0000000..1240002 --- /dev/null +++ b/docs/.vuepress/dist/assets/privacy.html.5ecb4b69.js @@ -0,0 +1 @@ +import{_ as e,o,c as a,d as i}from"./app.fe610a35.js";const t={},r=i('

Privacy Policy

This Privacy Policy describes Our policies and procedures on the collection, use and disclosure of Your information when You use the Service and tells You about Your privacy rights and how the law protects You.

We use Your Personal data to provide and improve the Service. By using the Service, You agree to the collection and use of information in accordance with this Privacy Policy.

Interpretation and Definitions

Interpretation

The words of which the initial letter is capitalized have meanings defined under the following conditions. The following definitions shall have the same meaning regardless of whether they appear in singular or in plural.

Definitions

For the purposes of this Privacy Policy:

  • Account means a unique account created for You to access our Service or parts of our Service.

  • Company (referred to as either "the Company", "We", "Us" or "Our" in this Agreement) refers to NextStorm Software.

  • Cookies are small files that are placed on Your computer, mobile device or any other device by a website, containing the details of Your browsing history on that website among its many uses.

  • Country refers to: The United Kingdom of Great Britain and Northern Ireland

  • Device means any device that can access the Service such as acomputer, a cellphone or a digital tablet.

  • Personal Data is any information that relates to an identified oridentifiable individual.

  • Service refers to the Website.

  • Service Provider means any natural or legal person who processes the data on behalf of the Company. It refers to third-party companies or individuals employed by the Company to facilitate the Service, toprovide the Service on behalf of the Company, to perform services related to the Service or to assist the Company in analyzing how the Service is used.

  • Usage Data refers to data collected automatically, either generatedby the use of the Service or from the Service infrastructure itself(for example, the duration of a page visit).

  • Website refers to the zProtect website, accessible from https:/zprotect.dev, and any associated services.

  • You means the individual accessing or using the Service, or the company, or other legal entity on behalf of which such individual is accessing or using the Service, as applicable.

Collecting and Using Your Personal Data

Types of Data Collected

Personal Data

While using Our Service, We may ask You to provide Us with certain personally identifiable information that can be used to contact or identify You. Personally identifiable information may include, but is not limited to:

  • Email address

  • Usage Data

Usage Data

Usage Data is collected automatically when using the Service.

Usage Data may include information such as Your Device's Internet Protocol address (IP address), browser type, browser version, the pages of our Service that You visit, the time and date of Your visit, the time spent on those pages, unique device identifiers and other diagnostic data.

When You access the Service by or through a mobile device, We may collect certain information automatically, including, but not limited to, the type of mobile device You use, Your mobile device unique ID, the IP address of Your mobile device, Your mobile operating system, the type of mobile Internet browser You use, unique device identifiers and other diagnostic data.

We may also collect information that Your browser sends whenever You visit our Service or when You access the Service by or through a mobile device.

Tracking Technologies and Cookies

We use Cookies and similar tracking technologies to track the activity on Our Service and store certain information. Tracking technologies used are beacons, tags, and scripts to collect and track information and to improve and analyze Our Service. The technologies We use may include:

  • Cookies or Browser Cookies. A cookie is a small file placed on Your Device. You can instruct Your browser to refuse all Cookies or to indicate when a Cookie is being sent. However, if You do not accept Cookies, You may not be able to use some parts of our Service. Unless you have adjusted Your browser setting so that it will refuse Cookies, our Service may use Cookies.

  • Web Beacons. Certain sections of our Service and our emails may contain small electronic files known as web beacons (also referred to as clear gifs, pixel tags, and single-pixel gifs) that permit the Company, for example, to count users who have visited those pages or opened an email and for other related website statistics (for example, recording the popularity of a certain section and verifying system and server integrity).

Cookies can be "Persistent" or "Session" Cookies. Persistent Cookies remain on Your personal computer or mobile device when You go offline, while Session Cookies are deleted as soon as You close Your web browser. Learn more about cookies: What are cookies? by Cloudflare.

We use both Session and Persistent Cookies for the purposes set out below:

  • Necessary / Essential Cookies

    Type: Session Cookies

    Administered by: Us

    Purpose: These Cookies are essential to provide You with services available through the Website and to enable You to use some of its features. They help to authenticate users and prevent fraudulent use of user accounts. Without these Cookies, the services that You have asked for cannot be provided, and We only use these Cookies to provide You with those services.

    • Cookies Policy / Notice Acceptance Cookies

    Type: Persistent Cookies

    Administered by: Us

    Purpose: These Cookies identify if users have accepted the use of cookies on the Website.

    -nFunctionality Cookies

    Type: Persistent Cookies

    Administered by: Us

    Purpose: These Cookies allow us to remember choices You make when You use the Website, such as remembering your login details or language preference. The purpose of these Cookies is to provide You with a more personal experience and to avoid You having to re-enter your preferences every time You use the Website.

For more information about the cookies we use and your choices regarding cookies, please visit our Cookies Policy or the Cookies section of our Privacy Policy. Use of Your Personal Data

The Company may use Personal Data for the following purposes:

  • To provide and maintain our Service, including to monitor the usage of our Service.

  • To manage Your Account: to manage Your registration as a user of the Service. The Personal Data You provide can give You access to different functionalities of the Service that are available to You as a registered user.

  • For the performance of a contract: the development, compliance and undertaking of the purchase contract for the products, items or services You have purchased or of any other contract with Us through the Service.

  • To contact You: To contact You by email, telephone calls, SMS, or other equivalent forms of electronic communication, such as a mobile application's push notifications regarding updates or informative communications related to the functionalities, products or contracted services, including the security updates, when necessary or reasonable for their implementation.

  • To provide You with news, special offers and general information about other goods, services and events which we offer that are similar to those that you have already purchased or enquired about unless You have opted not to receive such information.

  • To manage Your requests: To attend and manage Your requests to Us.

  • For business transfers: We may use Your information to evaluate or conduct a merger, divestiture, restructuring, reorganization, dissolution, or other sale or transfer of some or all of Our assets, whether as a going concern or as part of bankruptcy, liquidation, or similar proceeding, in which Personal Data held by Us about our Service users is among the assets transferred.

  • For other purposes: We may use Your information for other purposes, such as data analysis, identifying usage trends, determining the effectiveness of our promotional campaigns and to evaluate and improve our Service, products, services, marketing and your experience.

We may share Your personal information in the following situations:

  • With Service Providers: We may share Your personal information with Service Providers to monitor and analyze the use of our Service, to contact You.
  • For business transfers: We may share or transfer Your personal information in connection with, or during negotiations of, any merger, sale of Company assets, financing, or acquisition of all or a portion of Our business to another company.
  • With Affiliates: We may share Your information with Our affiliates, in which case we will require those affiliates to honor this Privacy Policy. Affiliates include Our parent company and any other subsidiaries, joint venture partners or other companies that We control or that are under common control with Us.
  • With business partners: We may share Your information with Our business partners to offer You certain products, services or promotions.
  • With other users: when You share personal information or otherwise interact in the public areas with other users, such information may be viewed by all users and may be publicly distributed outside.
  • With Your consent: We may disclose Your personal information for any other purpose with Your consent.

Retention of Your Personal Data

The Company will retain Your Personal Data only for as long as is necessary for the purposes set out in this Privacy Policy. We will retain and use Your Personal Data to the extent necessary to comply with our legal obligations (for example, if we are required to retain your data to comply with applicable laws), resolve disputes, and enforce our legal agreements and policies.

The Company will also retain Usage Data for internal analysis purposes. Usage Data is generally retained for a shorter period of time, except when this data is used to strengthen the security or to improve the functionality of Our Service, or We are legally obligated to retain this data for longer time periods. Transfer of Your Personal Data

Your information, including Personal Data, is processed at the Company's operating offices and in any other places where the parties involved in the processing are located. It means that this information may be transferred to \u2014 and maintained on \u2014 computers located outside of Your state, province, country or other governmental jurisdiction where the data protection laws may differ than those from Your jurisdiction.

Your consent to this Privacy Policy followed by Your submission of such information represents Your agreement to that transfer.

The Company will take all steps reasonably necessary to ensure that Your data is treated securely and in accordance with this Privacy Policy and no transfer of Your Personal Data will take place to an organization or a country unless there are adequate controls in place including the security of Your data and other personal information.

Disclosure of Your Personal Data

Business Transactions

If the Company is involved in a merger, acquisition or asset sale, Your Personal Data may be transferred. We will provide notice before Your Personal Data is transferred and becomes subject to a different Privacy Policy.

Law enforcement

Under certain circumstances, the Company may be required to disclose Your Personal Data if required to do so by law or in response to valid requests by public authorities (e.g. a court or a government agency). Other legal requirements

The Company may disclose Your Personal Data in the good faith belief that such action is necessary to:

  • Comply with a legal obligation
  • Protect and defend the rights or property of the Company
  • Prevent or investigate possible wrongdoing in connection with the Service
  • Protect the personal safety of Users of the Service or the public
  • Protect against legal liability

Security of Your Personal Data

The security of Your Personal Data is important to Us, but remember that no method of transmission over the Internet, or method of electronic storage is 100% secure. While We strive to use commercially acceptable means to protect Your Personal Data, We cannot guarantee its absolute security.

Children's Privacy

Our Service does not address anyone under the age of 13. We do not knowingly collect personally identifiable information from anyone under the age of 13. If You are a parent or guardian and You are aware that Your child has provided Us with Personal Data, please contact Us. If We become aware that We have collected Personal Data from anyone under the age of 13 without verification of parental consent, We take steps to remove that information from Our servers.

If We need to rely on consent as a legal basis for processing Your information and Your country requires consent from a parent, We may require Your parent's consent before We collect and use that information.

Our Service may contain links to other websites that are not operated by Us. If You click on a third party link, You will be directed to that third party's site. We strongly advise You to review the Privacy Policy of every site You visit.

We have no control over and assume no responsibility for the content, privacy policies or practices of any third party sites or services.

Changes to this Privacy Policy

We may update Our Privacy Policy from time to time. We will notify You of any changes by posting the new Privacy Policy on this page.

We will let You know via email and/or a prominent notice on Our Service, prior to the change becoming effective and update the "Last updated" date at the top of this Privacy Policy.

You are advised to review this Privacy Policy periodically for any changes. Changes to this Privacy Policy are effective when they are posted on this page.

Contact Us

If you have any questions about this Privacy Policy, You can contact us:

  • By email: info@n23.io
  • By Discord: https://discord.com/invite/dnGKGuwvGH (Preferred)
',58),s=[r];function n(c,l){return o(),a("div",null,s)}var u=e(t,[["render",n],["__file","privacy.html.vue"]]);export{u as default}; diff --git a/docs/.vuepress/dist/assets/privacy.html.b7d51f10.js b/docs/.vuepress/dist/assets/privacy.html.b7d51f10.js new file mode 100644 index 0000000..e1e09ee --- /dev/null +++ b/docs/.vuepress/dist/assets/privacy.html.b7d51f10.js @@ -0,0 +1 @@ +const e=JSON.parse(`{"key":"v-08eb506c","path":"/privacy.html","title":"Privacy Policy","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Interpretation and Definitions","slug":"interpretation-and-definitions","children":[{"level":3,"title":"Interpretation","slug":"interpretation","children":[]},{"level":3,"title":"Definitions","slug":"definitions","children":[]}]},{"level":2,"title":"Collecting and Using Your Personal Data","slug":"collecting-and-using-your-personal-data","children":[{"level":3,"title":"Types of Data Collected","slug":"types-of-data-collected","children":[]},{"level":3,"title":"Retention of Your Personal Data","slug":"retention-of-your-personal-data","children":[]},{"level":3,"title":"Disclosure of Your Personal Data","slug":"disclosure-of-your-personal-data","children":[]}]},{"level":2,"title":"Children's Privacy","slug":"children-s-privacy","children":[]},{"level":2,"title":"Links to Other Websites","slug":"links-to-other-websites","children":[]},{"level":2,"title":"Changes to this Privacy Policy","slug":"changes-to-this-privacy-policy","children":[]},{"level":2,"title":"Contact Us","slug":"contact-us","children":[]}],"git":{"updatedTime":null},"filePathRelative":"privacy.md"}`);export{e as data}; diff --git a/docs/.vuepress/dist/assets/search.0782d0d1.svg b/docs/.vuepress/dist/assets/search.0782d0d1.svg new file mode 100644 index 0000000..03d8391 --- /dev/null +++ b/docs/.vuepress/dist/assets/search.0782d0d1.svg @@ -0,0 +1 @@ + diff --git a/docs/.vuepress/dist/assets/style.8bf88d10.css b/docs/.vuepress/dist/assets/style.8bf88d10.css new file mode 100644 index 0000000..0a75935 --- /dev/null +++ b/docs/.vuepress/dist/assets/style.8bf88d10.css @@ -0,0 +1 @@ +:root{--back-to-top-z-index: 5;--back-to-top-color: #3eaf7c;--back-to-top-color-hover: #71cda3}.back-to-top{cursor:pointer;position:fixed;bottom:2rem;right:2.5rem;width:2rem;height:1.2rem;background-color:var(--back-to-top-color);-webkit-mask:url(/assets/back-to-top.8efcbe56.svg) no-repeat;mask:url(/assets/back-to-top.8efcbe56.svg) no-repeat;z-index:var(--back-to-top-z-index)}.back-to-top:hover{background-color:var(--back-to-top-color-hover)}@media (max-width: 959px){.back-to-top{display:none}}.back-to-top-enter-active,.back-to-top-leave-active{transition:opacity .3s}.back-to-top-enter-from,.back-to-top-leave-to{opacity:0}:root{--external-link-icon-color: #aaa}.external-link-icon{position:relative;display:inline-block;color:var(--external-link-icon-color);vertical-align:middle;top:-1px}.external-link-icon-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}:root{--medium-zoom-z-index: 100;--medium-zoom-bg-color: #ffffff;--medium-zoom-opacity: 1}.medium-zoom-overlay{background-color:var(--medium-zoom-bg-color)!important;z-index:var(--medium-zoom-z-index)}.medium-zoom-overlay~img{z-index:calc(var(--medium-zoom-z-index) + 1)}.medium-zoom--opened .medium-zoom-overlay{opacity:var(--medium-zoom-opacity)}:root{--nprogress-color: #29d;--nprogress-z-index: 1031}#nprogress{pointer-events:none}#nprogress .bar{background:var(--nprogress-color);position:fixed;z-index:var(--nprogress-z-index);top:0;left:0;width:100%;height:2px}:root{--c-brand: #3eaf7c;--c-brand-light: #4abf8a;--c-bg: #ffffff;--c-bg-light: #f3f4f5;--c-bg-lighter: #eeeeee;--c-bg-navbar: var(--c-bg);--c-bg-sidebar: var(--c-bg);--c-bg-arrow: #cccccc;--c-text: #2c3e50;--c-text-accent: var(--c-brand);--c-text-light: #3a5169;--c-text-lighter: #4e6e8e;--c-text-lightest: #6a8bad;--c-text-quote: #999999;--c-border: #eaecef;--c-border-dark: #dfe2e5;--c-tip: #42b983;--c-tip-bg: var(--c-bg-light);--c-tip-title: var(--c-text);--c-tip-text: var(--c-text);--c-tip-text-accent: var(--c-text-accent);--c-warning: #e7c000;--c-warning-bg: #fffae3;--c-warning-title: #ad9000;--c-warning-text: #746000;--c-warning-text-accent: var(--c-text);--c-danger: #cc0000;--c-danger-bg: #ffe0e0;--c-danger-title: #990000;--c-danger-text: #660000;--c-danger-text-accent: var(--c-text);--c-details-bg: #eeeeee;--c-badge-tip: var(--c-tip);--c-badge-warning: var(--c-warning);--c-badge-danger: var(--c-danger);--t-color: .3s ease;--t-transform: .3s ease;--code-bg-color: #282c34;--code-hl-bg-color: rgba(0, 0, 0, .66);--code-ln-color: #9e9e9e;--code-ln-wrapper-width: 3.5rem;--font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;--font-family-code: Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace;--navbar-height: 3.6rem;--navbar-padding-v: .7rem;--navbar-padding-h: 1.5rem;--sidebar-width: 20rem;--sidebar-width-mobile: calc(var(--sidebar-width) * .82);--content-width: 740px;--homepage-width: 960px}.back-to-top{--back-to-top-color: var(--c-brand);--back-to-top-color-hover: var(--c-brand-light)}.DocSearch{--docsearch-primary-color: var(--c-brand);--docsearch-text-color: var(--c-text);--docsearch-highlight-color: var(--c-brand);--docsearch-muted-color: var(--c-text-quote);--docsearch-container-background: rgba(9, 10, 17, .8);--docsearch-modal-background: var(--c-bg-light);--docsearch-searchbox-background: var(--c-bg-lighter);--docsearch-searchbox-focus-background: var(--c-bg);--docsearch-searchbox-shadow: inset 0 0 0 2px var(--c-brand);--docsearch-hit-color: var(--c-text-light);--docsearch-hit-active-color: var(--c-bg);--docsearch-hit-background: var(--c-bg);--docsearch-hit-shadow: 0 1px 3px 0 var(--c-border-dark);--docsearch-footer-background: var(--c-bg)}.external-link-icon{--external-link-icon-color: var(--c-text-quote)}.medium-zoom-overlay{--medium-zoom-bg-color: var(--c-bg)}#nprogress{--nprogress-color: var(--c-brand)}.pwa-popup{--pwa-popup-text-color: var(--c-text);--pwa-popup-bg-color: var(--c-bg);--pwa-popup-border-color: var(--c-brand);--pwa-popup-shadow: 0 4px 16px var(--c-brand);--pwa-popup-btn-text-color: var(--c-bg);--pwa-popup-btn-bg-color: var(--c-brand);--pwa-popup-btn-hover-bg-color: var(--c-brand-light)}.search-box{--search-bg-color: var(--c-bg);--search-accent-color: var(--c-brand);--search-text-color: var(--c-text);--search-border-color: var(--c-border);--search-item-text-color: var(--c-text-lighter);--search-item-focus-bg-color: var(--c-bg-light)}html.dark{--c-brand: #3aa675;--c-brand-light: #349469;--c-bg: #22272e;--c-bg-light: #2b313a;--c-bg-lighter: #262c34;--c-text: #adbac7;--c-text-light: #96a7b7;--c-text-lighter: #8b9eb0;--c-text-lightest: #8094a8;--c-border: #3e4c5a;--c-border-dark: #34404c;--c-tip: #318a62;--c-warning: #ceab00;--c-warning-bg: #7e755b;--c-warning-title: #ceac03;--c-warning-text: #362e00;--c-danger: #940000;--c-danger-bg: #806161;--c-danger-title: #610000;--c-danger-text: #3a0000;--c-details-bg: #323843;--code-hl-bg-color: #363b46}html.dark .DocSearch{--docsearch-logo-color: var(--c-text);--docsearch-modal-shadow: inset 1px 1px 0 0 #2c2e40, 0 3px 8px 0 #000309;--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-gradient: linear-gradient(-225deg, #444950, #1c1e21);--docsearch-footer-shadow: inset 0 1px 0 0 rgba(73, 76, 106, .5), 0 -4px 8px 0 rgba(0, 0, 0, .2)}html,body{padding:0;margin:0;background-color:var(--c-bg);transition:background-color var(--t-color)}html.dark{color-scheme:dark}html{font-size:16px}body{font-family:var(--font-family);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:1rem;color:var(--c-text)}a{font-weight:500;color:var(--c-text-accent);text-decoration:none;overflow-wrap:break-word}p a code{font-weight:400;color:var(--c-text-accent)}kbd{font-family:var(--font-family-code);color:var(--c-text);background:var(--c-bg-lighter);border:solid .15rem var(--c-border-dark);border-bottom:solid .25rem var(--c-border-dark);border-radius:.15rem;padding:0 .15em}code{font-family:var(--font-family-code);color:var(--c-text-lighter);padding:.25rem .5rem;margin:0;font-size:.85em;background-color:var(--c-bg-lighter);border-radius:3px;overflow-wrap:break-word;transition:background-color var(--t-color)}blockquote{font-size:1rem;color:var(--c-text-quote);border-left:.2rem solid var(--c-border-dark);margin:1rem 0;padding:.25rem 0 .25rem 1rem}blockquote>p{margin:0}ul,ol{padding-left:1.2em}strong{font-weight:600}h1,h2,h3,h4,h5,h6{font-weight:600;line-height:1.25}h1:focus-visible,h2:focus-visible,h3:focus-visible,h4:focus-visible,h5:focus-visible,h6:focus-visible{outline:none}h1:hover .header-anchor,h2:hover .header-anchor,h3:hover .header-anchor,h4:hover .header-anchor,h5:hover .header-anchor,h6:hover .header-anchor{opacity:1}h1{font-size:2.2rem}h2{font-size:1.65rem;padding-bottom:.3rem;border-bottom:1px solid var(--c-border);transition:border-color var(--t-color)}h3{font-size:1.35rem}h4{font-size:1.15rem}h5{font-size:1.05rem}h6{font-size:1rem}a.header-anchor{font-size:.85em;float:left;margin-left:-.87em;padding-right:.23em;margin-top:.125em;opacity:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}a.header-anchor:hover{text-decoration:none}a.header-anchor:focus-visible{opacity:1}p,ul,ol{line-height:1.7}hr{border:0;border-top:1px solid var(--c-border)}table{border-collapse:collapse;margin:1rem 0;display:block;overflow-x:auto;transition:border-color var(--t-color)}tr{border-top:1px solid var(--c-border-dark);transition:border-color var(--t-color)}tr:nth-child(2n){background-color:var(--c-bg-light);transition:background-color var(--t-color)}th,td{padding:.6em 1em;border:1px solid var(--c-border-dark);transition:border-color var(--t-color)}.arrow{display:inline-block;width:0;height:0}.arrow.up{border-left:4px solid transparent;border-right:4px solid transparent;border-bottom:6px solid var(--c-bg-arrow)}.arrow.down{border-left:4px solid transparent;border-right:4px solid transparent;border-top:6px solid var(--c-bg-arrow)}.arrow.right{border-top:4px solid transparent;border-bottom:4px solid transparent;border-left:6px solid var(--c-bg-arrow)}.arrow.left{border-top:4px solid transparent;border-bottom:4px solid transparent;border-right:6px solid var(--c-bg-arrow)}.badge{display:inline-block;font-size:14px;height:18px;line-height:18px;border-radius:3px;padding:0 6px;color:var(--c-bg);vertical-align:top;transition:color var(--t-color),background-color var(--t-color)}.badge.tip{background-color:var(--c-badge-tip)}.badge.warning{background-color:var(--c-badge-warning)}.badge.danger{background-color:var(--c-badge-danger)}.badge+.badge{margin-left:5px}code[class*=language-],pre[class*=language-]{color:#ccc;background:none;font-family:var(--font-family-code);font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.comment,.token.block-comment,.token.prolog,.token.doctype,.token.cdata{color:#999}.token.punctuation{color:#ccc}.token.tag,.token.attr-name,.token.namespace,.token.deleted{color:#ec5975}.token.function-name{color:#6196cc}.token.boolean,.token.number,.token.function{color:#f08d49}.token.property,.token.class-name,.token.constant,.token.symbol{color:#f8c555}.token.selector,.token.important,.token.atrule,.token.keyword,.token.builtin{color:#cc99cd}.token.string,.token.char,.token.attr-value,.token.regex,.token.variable{color:#7ec699}.token.operator,.token.entity,.token.url{color:#67cdcc}.token.important,.token.bold{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:#3eaf7c}.theme-default-content pre,.theme-default-content pre[class*=language-]{line-height:1.4;padding:1.3rem 1.5rem;margin:.85rem 0;border-radius:6px;overflow:auto}.theme-default-content pre code,.theme-default-content pre[class*=language-] code{color:#fff;padding:0;background-color:transparent;border-radius:0;overflow-wrap:unset;-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.theme-default-content .line-number{font-family:var(--font-family-code)}div[class*=language-]{position:relative;background-color:var(--code-bg-color);border-radius:6px}div[class*=language-]:before{position:absolute;z-index:3;top:.8em;right:1em;font-size:.75rem;color:var(--code-ln-color)}div[class*=language-] pre,div[class*=language-] pre[class*=language-]{background:transparent!important;position:relative;z-index:1}div[class*=language-] .highlight-lines{-webkit-user-select:none;-moz-user-select:none;user-select:none;padding-top:1.3rem;position:absolute;top:0;left:0;width:100%;line-height:1.4}div[class*=language-] .highlight-lines .highlight-line{background-color:var(--code-hl-bg-color)}div[class*=language-]:not(.line-numbers-mode) .line-numbers{display:none}div[class*=language-].line-numbers-mode .highlight-lines .highlight-line{position:relative}div[class*=language-].line-numbers-mode .highlight-lines .highlight-line:before{content:" ";position:absolute;z-index:2;left:0;top:0;display:block;width:var(--code-ln-wrapper-width);height:100%}div[class*=language-].line-numbers-mode pre{margin-left:var(--code-ln-wrapper-width);padding-left:1rem;vertical-align:middle}div[class*=language-].line-numbers-mode .line-numbers{position:absolute;top:0;width:var(--code-ln-wrapper-width);text-align:center;color:var(--code-ln-color);padding-top:1.25rem;line-height:1.4;counter-reset:line-number}div[class*=language-].line-numbers-mode .line-numbers .line-number{position:relative;z-index:3;-webkit-user-select:none;-moz-user-select:none;user-select:none;height:1.4em}div[class*=language-].line-numbers-mode .line-numbers .line-number:before{counter-increment:line-number;content:counter(line-number);font-size:.85em}div[class*=language-].line-numbers-mode:after{content:"";position:absolute;top:0;left:0;width:var(--code-ln-wrapper-width);height:100%;border-radius:6px 0 0 6px;border-right:1px solid var(--code-hl-bg-color)}div[class*=language-].ext-c:before{content:"c"}div[class*=language-].ext-cpp:before{content:"cpp"}div[class*=language-].ext-cs:before{content:"cs"}div[class*=language-].ext-css:before{content:"css"}div[class*=language-].ext-dart:before{content:"dart"}div[class*=language-].ext-docker:before{content:"docker"}div[class*=language-].ext-fs:before{content:"fs"}div[class*=language-].ext-go:before{content:"go"}div[class*=language-].ext-html:before{content:"html"}div[class*=language-].ext-java:before{content:"java"}div[class*=language-].ext-js:before{content:"js"}div[class*=language-].ext-json:before{content:"json"}div[class*=language-].ext-kt:before{content:"kt"}div[class*=language-].ext-less:before{content:"less"}div[class*=language-].ext-makefile:before{content:"makefile"}div[class*=language-].ext-md:before{content:"md"}div[class*=language-].ext-php:before{content:"php"}div[class*=language-].ext-py:before{content:"py"}div[class*=language-].ext-rb:before{content:"rb"}div[class*=language-].ext-rs:before{content:"rs"}div[class*=language-].ext-sass:before{content:"sass"}div[class*=language-].ext-scss:before{content:"scss"}div[class*=language-].ext-sh:before{content:"sh"}div[class*=language-].ext-styl:before{content:"styl"}div[class*=language-].ext-ts:before{content:"ts"}div[class*=language-].ext-toml:before{content:"toml"}div[class*=language-].ext-vue:before{content:"vue"}div[class*=language-].ext-yml:before{content:"yml"}@media (max-width: 419px){.theme-default-content div[class*=language-]{margin:.85rem -1.5rem;border-radius:0}}.code-group__nav{margin-top:.85rem;margin-bottom:calc(-1.7rem - 6px);padding-bottom:calc(1.7rem - 6px);padding-left:10px;padding-top:10px;border-top-left-radius:6px;border-top-right-radius:6px;background-color:var(--code-bg-color)}.code-group__ul{margin:auto 0;padding-left:0;display:inline-flex;list-style:none}.code-group__nav-tab{border:0;padding:5px;cursor:pointer;background-color:transparent;font-size:.85em;line-height:1.4;color:#ffffffe6;font-weight:600}.code-group__nav-tab:focus{outline:none}.code-group__nav-tab:focus-visible{outline:1px solid rgba(255,255,255,.9)}.code-group__nav-tab-active{border-bottom:var(--c-brand) 1px solid}@media (max-width: 419px){.code-group__nav{margin-left:-1.5rem;margin-right:-1.5rem;border-radius:0}}.code-group-item{display:none}.code-group-item__active{display:block}.code-group-item>pre{background-color:orange}.custom-container{transition:color var(--t-color),border-color var(--t-color),background-color var(--t-color)}.custom-container .custom-container-title{font-weight:600}.custom-container .custom-container-title:not(:only-child){margin-bottom:-.4rem}.custom-container.tip,.custom-container.warning,.custom-container.danger{padding:.1rem 1.5rem;border-left-width:.5rem;border-left-style:solid;margin:1rem 0}.custom-container.tip{border-color:var(--c-tip);background-color:var(--c-tip-bg);color:var(--c-tip-text)}.custom-container.tip .custom-container-title{color:var(--c-tip-title)}.custom-container.tip a{color:var(--c-tip-text-accent)}.custom-container.warning{border-color:var(--c-warning);background-color:var(--c-warning-bg);color:var(--c-warning-text)}.custom-container.warning .custom-container-title{color:var(--c-warning-title)}.custom-container.warning a{color:var(--c-warning-text-accent)}.custom-container.danger{border-color:var(--c-danger);background-color:var(--c-danger-bg);color:var(--c-danger-text)}.custom-container.danger .custom-container-title{color:var(--c-danger-title)}.custom-container.danger a{color:var(--c-danger-text-accent)}.custom-container.details{display:block;position:relative;border-radius:2px;margin:1.6em 0;padding:1.6em;background-color:var(--c-details-bg)}.custom-container.details h4{margin-top:0}.custom-container.details figure:last-child,.custom-container.details p:last-child{margin-bottom:0;padding-bottom:0}.custom-container.details summary{outline:none;cursor:pointer}.home{padding:var(--navbar-height) 2rem 0;max-width:var(--homepage-width);margin:0 auto;display:block}.home .hero{text-align:center}.home .hero img{max-width:100%;max-height:280px;display:block;margin:3rem auto 1.5rem}.home .hero h1{font-size:3rem}.home .hero h1,.home .hero .description,.home .hero .actions{margin:1.8rem auto}.home .hero .actions{display:flex;flex-wrap:wrap;gap:1rem;justify-content:center}.home .hero .description{max-width:35rem;font-size:1.6rem;line-height:1.3;color:var(--c-text-lightest)}.home .hero .action-button{display:inline-block;font-size:1.2rem;padding:.8rem 1.6rem;border-width:2px;border-style:solid;border-radius:4px;transition:background-color var(--t-color);box-sizing:border-box}.home .hero .action-button.primary{color:var(--c-bg);background-color:var(--c-brand);border-color:var(--c-brand)}.home .hero .action-button.primary:hover{background-color:var(--c-brand-light)}.home .hero .action-button.secondary{color:var(--c-brand);background-color:var(--c-bg);border-color:var(--c-brand)}.home .hero .action-button.secondary:hover{color:var(--c-bg);background-color:var(--c-brand-light)}.home .features{border-top:1px solid var(--c-border);transition:border-color var(--t-color);padding:1.2rem 0;margin-top:2.5rem;display:flex;flex-wrap:wrap;align-items:flex-start;align-content:stretch;justify-content:space-between}.home .feature{flex-grow:1;flex-basis:30%;max-width:30%}.home .feature h2{font-size:1.4rem;font-weight:500;border-bottom:none;padding-bottom:0;color:var(--c-text-light)}.home .feature p{color:var(--c-text-lighter)}.home .theme-default-content{padding:0;margin:0}.home .footer{padding:2.5rem;border-top:1px solid var(--c-border);text-align:center;color:var(--c-text-lighter);transition:border-color var(--t-color)}@media (max-width: 719px){.home .features{flex-direction:column}.home .feature{max-width:100%;padding:0 2.5rem}}@media (max-width: 419px){.home{padding-left:1.5rem;padding-right:1.5rem}.home .hero img{max-height:210px;margin:2rem auto 1.2rem}.home .hero h1{font-size:2rem}.home .hero h1,.home .hero .description,.home .hero .actions{margin:1.2rem auto}.home .hero .description{font-size:1.2rem}.home .hero .action-button{font-size:1rem;padding:.6rem 1.2rem}.home .feature h2{font-size:1.25rem}}.page{padding-top:var(--navbar-height);padding-left:var(--sidebar-width)}.navbar{position:fixed;z-index:20;top:0;left:0;right:0;height:var(--navbar-height);box-sizing:border-box;border-bottom:1px solid var(--c-border);background-color:var(--c-bg-navbar);transition:background-color var(--t-color),border-color var(--t-color)}.sidebar{font-size:16px;width:var(--sidebar-width);position:fixed;z-index:10;margin:0;top:var(--navbar-height);left:0;bottom:0;box-sizing:border-box;border-right:1px solid var(--c-border);overflow-y:auto;scrollbar-width:thin;scrollbar-color:var(--c-brand) var(--c-border);background-color:var(--c-bg-sidebar);transition:transform var(--t-transform),background-color var(--t-color),border-color var(--t-color)}.sidebar::-webkit-scrollbar{width:7px}.sidebar::-webkit-scrollbar-track{background-color:var(--c-border)}.sidebar::-webkit-scrollbar-thumb{background-color:var(--c-brand)}.sidebar-mask{position:fixed;z-index:9;top:0;left:0;width:100vw;height:100vh;display:none}.theme-container.sidebar-open .sidebar-mask{display:block}.theme-container.sidebar-open .navbar>.toggle-sidebar-button .icon span:nth-child(1){transform:rotate(45deg) translate3d(5.5px,5.5px,0)}.theme-container.sidebar-open .navbar>.toggle-sidebar-button .icon span:nth-child(2){transform:scale3d(0,1,1)}.theme-container.sidebar-open .navbar>.toggle-sidebar-button .icon span:nth-child(3){transform:rotate(-45deg) translate3d(6px,-6px,0)}.theme-container.sidebar-open .navbar>.toggle-sidebar-button .icon span:nth-child(1),.theme-container.sidebar-open .navbar>.toggle-sidebar-button .icon span:nth-child(3){transform-origin:center}.theme-container.no-navbar .theme-default-content h1,.theme-container.no-navbar .theme-default-content h2,.theme-container.no-navbar .theme-default-content h3,.theme-container.no-navbar .theme-default-content h4,.theme-container.no-navbar .theme-default-content h5,.theme-container.no-navbar .theme-default-content h6{margin-top:1.5rem;padding-top:0}.theme-container.no-navbar .page{padding-top:0}.theme-container.no-navbar .sidebar{top:0}@media (min-width: 720px){.theme-container.no-sidebar .sidebar{display:none}.theme-container.no-sidebar .page{padding-left:0}}.theme-default-content a:hover{text-decoration:underline}.theme-default-content img{max-width:100%}.theme-default-content h1,.theme-default-content h2,.theme-default-content h3,.theme-default-content h4,.theme-default-content h5,.theme-default-content h6{margin-top:calc(.5rem - var(--navbar-height));padding-top:calc(1rem + var(--navbar-height));margin-bottom:0}.theme-default-content h1:first-child,.theme-default-content h2:first-child,.theme-default-content h3:first-child,.theme-default-content h4:first-child,.theme-default-content h5:first-child,.theme-default-content h6:first-child{margin-bottom:1rem}.theme-default-content h1:first-child+p,.theme-default-content h1:first-child+pre,.theme-default-content h1:first-child+.custom-container,.theme-default-content h2:first-child+p,.theme-default-content h2:first-child+pre,.theme-default-content h2:first-child+.custom-container,.theme-default-content h3:first-child+p,.theme-default-content h3:first-child+pre,.theme-default-content h3:first-child+.custom-container,.theme-default-content h4:first-child+p,.theme-default-content h4:first-child+pre,.theme-default-content h4:first-child+.custom-container,.theme-default-content h5:first-child+p,.theme-default-content h5:first-child+pre,.theme-default-content h5:first-child+.custom-container,.theme-default-content h6:first-child+p,.theme-default-content h6:first-child+pre,.theme-default-content h6:first-child+.custom-container{margin-top:2rem}@media (max-width: 959px){.sidebar{font-size:15px;width:var(--sidebar-width-mobile)}.page{padding-left:var(--sidebar-width-mobile)}}@media (max-width: 719px){.sidebar{top:0;padding-top:var(--navbar-height);transform:translate(-100%)}.page{padding-left:0}.theme-container.sidebar-open .sidebar{transform:translate(0)}.theme-container.no-navbar .sidebar{padding-top:0}}@media (max-width: 419px){h1{font-size:1.9rem}}.navbar{--navbar-line-height: calc( var(--navbar-height) - 2 * var(--navbar-padding-v) );padding:var(--navbar-padding-v) var(--navbar-padding-h);line-height:var(--navbar-line-height)}.navbar .logo{height:var(--navbar-line-height);margin-right:var(--navbar-padding-v);vertical-align:top}.navbar .site-name{font-size:1.3rem;font-weight:600;color:var(--c-text);position:relative}.navbar .navbar-items-wrapper{display:flex;position:absolute;box-sizing:border-box;top:var(--navbar-padding-v);right:var(--navbar-padding-h);height:var(--navbar-line-height);padding-left:var(--navbar-padding-h);white-space:nowrap;font-size:.9rem}.navbar .navbar-items-wrapper .search-box{flex:0 0 auto;vertical-align:top}@media (max-width: 719px){.navbar{padding-left:4rem}.navbar .can-hide{display:none}.navbar .site-name{width:calc(100vw - 9.4rem);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}}.navbar-items{display:inline-block}.navbar-items a{display:inline-block;line-height:1.4rem;color:inherit}.navbar-items a:hover,.navbar-items a.router-link-active{color:var(--c-text-accent)}.navbar-items .navbar-item{position:relative;display:inline-block;margin-left:1.5rem;line-height:var(--navbar-line-height)}.navbar-items .navbar-item:first-child{margin-left:0}@media (max-width: 719px){.navbar-items .navbar-item{margin-left:0}}@media (min-width: 719px){.navbar-items a:hover,.navbar-items a.router-link-active{color:var(--c-text)}.navbar-item>a:hover,.navbar-item>a.router-link-active{margin-bottom:-2px;border-bottom:2px solid var(--c-text-accent)}}.toggle-sidebar-button{position:absolute;top:.6rem;left:1rem;display:none;padding:.6rem;cursor:pointer}.toggle-sidebar-button .icon{display:flex;flex-direction:column;justify-content:center;align-items:center;width:1.25rem;height:1.25rem;cursor:inherit}.toggle-sidebar-button .icon span{display:inline-block;width:100%;height:2px;border-radius:2px;background-color:var(--c-text);transition:transform var(--t-transform)}.toggle-sidebar-button .icon span:nth-child(2){margin:6px 0}@media screen and (max-width: 719px){.toggle-sidebar-button{display:block}}.toggle-color-mode-button{display:flex;margin:auto;margin-left:1rem;border:0;background:none;color:var(--c-text);opacity:.8;cursor:pointer}.toggle-color-mode-button:hover{opacity:1}.toggle-color-mode-button .icon{width:1.25rem;height:1.25rem}.DocSearch{transition:background-color var(--t-color)}.navbar-dropdown-wrapper{cursor:pointer}.navbar-dropdown-wrapper .navbar-dropdown-title,.navbar-dropdown-wrapper .navbar-dropdown-title-mobile{display:block;font-size:.9rem;font-family:inherit;cursor:inherit;padding:inherit;line-height:1.4rem;background:transparent;border:none;font-weight:500;color:var(--c-text)}.navbar-dropdown-wrapper .navbar-dropdown-title:hover,.navbar-dropdown-wrapper .navbar-dropdown-title-mobile:hover{border-color:transparent}.navbar-dropdown-wrapper .navbar-dropdown-title .arrow,.navbar-dropdown-wrapper .navbar-dropdown-title-mobile .arrow{vertical-align:middle;margin-top:-1px;margin-left:.4rem}.navbar-dropdown-wrapper .navbar-dropdown-title-mobile{display:none;font-weight:600;font-size:inherit}.navbar-dropdown-wrapper .navbar-dropdown-title-mobile:hover{color:var(--c-text-accent)}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item{color:inherit;line-height:1.7rem}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subtitle{margin:.45rem 0 0;border-top:1px solid var(--c-border);padding:1rem 0 .45rem;font-size:.9rem}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subtitle>span{padding:0 1.5rem 0 1.25rem}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subtitle>a{font-weight:inherit}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subtitle>a.router-link-active:after{display:none}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subitem-wrapper{padding:0;list-style:none}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subitem-wrapper .navbar-dropdown-subitem{font-size:.9em}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item a{display:block;line-height:1.7rem;position:relative;border-bottom:none;font-weight:400;margin-bottom:0;padding:0 1.5rem 0 1.25rem}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item a:hover,.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item a.router-link-active{color:var(--c-text-accent)}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item a.router-link-active:after{content:"";width:0;height:0;border-left:5px solid var(--c-text-accent);border-top:3px solid transparent;border-bottom:3px solid transparent;position:absolute;top:calc(50% - 2px);left:9px}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item:first-child .navbar-dropdown-subtitle{margin-top:0;padding-top:0;border-top:0}@media (max-width: 719px){.navbar-dropdown-wrapper.open .navbar-dropdown-title,.navbar-dropdown-wrapper.open .navbar-dropdown-title-mobile{margin-bottom:.5rem}.navbar-dropdown-wrapper .navbar-dropdown-title,.navbar-dropdown-wrapper .navbar-dropdown-title-mobile{display:none}.navbar-dropdown-wrapper .navbar-dropdown-title-mobile{display:block}.navbar-dropdown-wrapper .navbar-dropdown{transition:height .1s ease-out;overflow:hidden}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subtitle{border-top:0;margin-top:0;padding-top:0;padding-bottom:0}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subtitle,.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item>a{font-size:15px;line-height:2rem}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subitem{font-size:14px;padding-left:1rem}}@media (min-width: 720px){.navbar-dropdown-wrapper{height:1.8rem}.navbar-dropdown-wrapper:hover .navbar-dropdown,.navbar-dropdown-wrapper.open .navbar-dropdown{display:block!important}.navbar-dropdown-wrapper.open:blur{display:none}.navbar-dropdown-wrapper .navbar-dropdown{display:none;height:auto!important;box-sizing:border-box;max-height:calc(100vh - 2.7rem);overflow-y:auto;position:absolute;top:100%;right:0;background-color:var(--c-bg-navbar);padding:.6rem 0;border:1px solid var(--c-border);border-bottom-color:var(--c-border-dark);text-align:left;border-radius:.25rem;white-space:nowrap;margin:0}}.page{padding-bottom:2rem;display:block}.page .theme-default-content{max-width:var(--content-width);margin:0 auto;padding:2rem 2.5rem;padding-top:0}@media (max-width: 959px){.page .theme-default-content{padding:2rem}}@media (max-width: 419px){.page .theme-default-content{padding:1.5rem}}.page-meta{max-width:var(--content-width);margin:0 auto;padding:1rem 2.5rem;overflow:auto}@media (max-width: 959px){.page-meta{padding:2rem}}@media (max-width: 419px){.page-meta{padding:1.5rem}}.page-meta .meta-item{cursor:default;margin-top:.8rem}.page-meta .meta-item .meta-item-label{font-weight:500;color:var(--c-text-lighter)}.page-meta .meta-item .meta-item-info{font-weight:400;color:var(--c-text-quote)}.page-meta .edit-link{display:inline-block;margin-right:.25rem}.page-meta .last-updated{float:right}@media (max-width: 719px){.page-meta .last-updated{font-size:.8em;float:none}.page-meta .contributors{font-size:.8em}}.page-nav{max-width:var(--content-width);margin:0 auto;padding:1rem 2.5rem 2rem;padding-bottom:0}@media (max-width: 959px){.page-nav{padding:2rem}}@media (max-width: 419px){.page-nav{padding:1.5rem}}.page-nav .inner{min-height:2rem;margin-top:0;border-top:1px solid var(--c-border);transition:border-color var(--t-color);padding-top:1rem;overflow:auto}.page-nav .prev a:before{content:"\2190"}.page-nav .next{float:right}.page-nav .next a:after{content:"\2192"}.sidebar ul{padding:0;margin:0;list-style-type:none}.sidebar a{display:inline-block}.sidebar .navbar-items{display:none;border-bottom:1px solid var(--c-border);transition:border-color var(--t-color);padding:.5rem 0 .75rem}.sidebar .navbar-items a{font-weight:600}.sidebar .navbar-items .navbar-item{display:block;line-height:1.25rem;font-size:1.1em;padding:.5rem 0 .5rem 1.5rem}.sidebar .sidebar-items{padding:1.5rem 0}@media (max-width: 719px){.sidebar .navbar-items{display:block}.sidebar .navbar-items .navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item a.router-link-active:after{top:calc(1rem - 2px)}.sidebar .sidebar-items{padding:1rem 0}}.sidebar-item{cursor:default;border-left:.25rem solid transparent;color:var(--c-text)}.sidebar-item:focus-visible{outline-width:1px;outline-offset:-1px}.sidebar-item.active:not(p.sidebar-heading){font-weight:600;color:var(--c-text-accent);border-left-color:var(--c-text-accent)}.sidebar-item.sidebar-heading{transition:color .15s ease;font-size:1.1em;font-weight:700;padding:.35rem 1.5rem .35rem 1.25rem;width:100%;box-sizing:border-box;margin:0}.sidebar-item.sidebar-heading+.sidebar-item-children{transition:height .1s ease-out;overflow:hidden;margin-bottom:.75rem}.sidebar-item.sidebar-heading.collapsible{cursor:pointer}.sidebar-item.sidebar-heading.collapsible .arrow{position:relative;top:-.12em;left:.5em}.sidebar-item:not(.sidebar-heading){font-size:1em;font-weight:400;display:inline-block;margin:0;padding:.35rem 1rem .35rem 2rem;line-height:1.4;width:100%;box-sizing:border-box}.sidebar-item:not(.sidebar-heading)+.sidebar-item-children{padding-left:1rem;font-size:.95em}.sidebar-item-children .sidebar-item-children .sidebar-item:not(.sidebar-heading){padding:.25rem 1rem .25rem 1.75rem}.sidebar-item-children .sidebar-item-children .sidebar-item:not(.sidebar-heading).active{font-weight:500;border-left-color:transparent}a.sidebar-heading+.sidebar-item-children .sidebar-item:not(.sidebar-heading).active{border-left-color:transparent}a.sidebar-item{cursor:pointer}a.sidebar-item:hover{color:var(--c-text-accent)}.table-of-contents .badge{vertical-align:middle}.dropdown-enter-from,.dropdown-leave-to{height:0!important}.fade-slide-y-enter-active{transition:all .2s ease}.fade-slide-y-leave-active{transition:all .2s cubic-bezier(1,.5,.8,1)}.fade-slide-y-enter-from,.fade-slide-y-leave-to{transform:translateY(10px);opacity:0}:root{scroll-behavior:smooth;--c-brand: #936edb !important;--c-brand-light: #b39ae6 !important;--c-tip: #b39ae6 !important}html.dark{--c-brand: #936edb !important;--c-brand-light: #b39ae6 !important;--c-tip: #b39ae6 !important}:root{--search-bg-color: #ffffff;--search-accent-color: #3eaf7c;--search-text-color: #2c3e50;--search-border-color: #eaecef;--search-item-text-color: #5d81a5;--search-item-focus-bg-color: #f3f4f5;--search-input-width: 8rem;--search-result-width: 20rem}.search-box{display:inline-block;position:relative;margin-left:1rem}.search-box input{cursor:text;width:var(--search-input-width);height:2rem;color:var(--search-text-color);display:inline-block;border:1px solid var(--search-border-color);border-radius:2rem;font-size:.9rem;line-height:2rem;padding:0 .5rem 0 2rem;outline:none;transition:all ease .3s;background:var(--search-bg-color) url(/assets/search.0782d0d1.svg) .6rem .5rem no-repeat;background-size:1rem}.search-box input:focus{cursor:auto;border-color:var(--search-accent-color)}.search-box .suggestions{background:var(--search-bg-color);width:var(--search-result-width);position:absolute;top:2rem;right:0;border:1px solid var(--search-border-color);border-radius:6px;padding:.4rem;list-style-type:none}.search-box .suggestion{line-height:1.4;padding:.4rem .6rem;border-radius:4px;cursor:pointer}.search-box .suggestion.focus{background-color:var(--search-item-focus-bg-color)}.search-box .suggestion.focus a{color:var(--search-accent-color)}.search-box .suggestion a{white-space:normal;color:var(--search-item-text-color)}.search-box .suggestion .page-title{font-weight:600}.search-box .suggestion .page-header{font-size:.9em;margin-left:.25em}@media (max-width: 720px){.search-box input{cursor:pointer;width:0;border-color:transparent;position:relative}.search-box input:focus{cursor:text;left:0;width:10rem}}@media (max-width: 420px){.search-box input:focus{width:8rem}.search-box .suggestions{width:calc(100vw - 4rem);right:-.5rem}} diff --git a/docs/.vuepress/dist/assets/terms.html.a0651db1.js b/docs/.vuepress/dist/assets/terms.html.a0651db1.js new file mode 100644 index 0000000..35dbfc9 --- /dev/null +++ b/docs/.vuepress/dist/assets/terms.html.a0651db1.js @@ -0,0 +1 @@ +import{_ as e,o as i,c as t,d as r}from"./app.fe610a35.js";const o={},s=r('

Terms of Service

This Terms of Service describes Our policies and restrictions on the use of Our Products and the Services.

Interpretation and Definitions

Interpretation

The words of which the initial letter is capitalized have meanings defined under the following conditions. The following definitions shall have the same meaning regardless of whether they appear in singular or in plural.

Definitions

For the purposes of this Terms of Service:

  • Company (referred to as either "the Company", "We", "Us" or "Our" in this Agreement) refers to NextStorm Software.

  • Personal Data is any information that relates to an identified oridentifiable individual.

  • Service refers to the Website.

  • Website refers to the zProtect website, accessible from https:/zprotect.dev, and any associated services.

  • You means the individual accessing or using the Service, or the company, or other legal entity on behalf of which such individual is accessing or using the Service, as applicable.

Use of the Website

Your access to this Website means you automatically agree to the Terms of Use and the Privacy Policy.

This Website is for your personal and non-commercial use. You may not modify, copy, distribute, transmit, display, publish, licence any products or services obtained from this Website.

You will not use the Website for any purpose that is unlawful by these Terms of Use. You may not use the website in any manner that may harm, disable or cause burden on any server or networks of this website.

Use of Our Products

It is forbidden to distribute, sell, reverse engineer, modify, decompile, deobfuscate, or unarchive zProtect products or any other binaries provided without explicit permission from the Company.

It is forbidden to share or resell the licences of Our products without permission. zProtect is all right reserved.

It is forbidden to distribute false or abusive information about Our products and the Company.

The Company has the right to suspend your licence of any zProtect product in case of violation of any of these rules. Data processing

Data Processing

By using any of Our services you consent to the processing of your personal data in order to protect Our services from misuse, detect bugs, prevent fraud and improve Our services.

We collect and may process the following data:

  • Emails;
  • Internet Protocol (IP) used to access Our services;
  • Active sessions on Our website and related sites;
  • Different types of information about your device and local time.

Disclaimer

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

THE ZPROTECT TEAM ALSO RESERVES THE RIGHT TO SUSPEND YOUR LICENCE TO ZPROTECT PRODUCTS AT ANY TIME WITHOUT GIVEN NOTICE.

',24),a=[s];function n(d,h){return i(),t("div",null,a)}var l=e(o,[["render",n],["__file","terms.html.vue"]]);export{l as default}; diff --git a/docs/.vuepress/dist/assets/terms.html.c69bbe45.js b/docs/.vuepress/dist/assets/terms.html.c69bbe45.js new file mode 100644 index 0000000..2f4dd3f --- /dev/null +++ b/docs/.vuepress/dist/assets/terms.html.c69bbe45.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-e0bdb92a","path":"/terms.html","title":"Terms of Service","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Interpretation and Definitions","slug":"interpretation-and-definitions","children":[{"level":3,"title":"Interpretation","slug":"interpretation","children":[]},{"level":3,"title":"Definitions","slug":"definitions","children":[]}]},{"level":2,"title":"Use of the Website","slug":"use-of-the-website","children":[]},{"level":2,"title":"Use of Our Products","slug":"use-of-our-products","children":[]},{"level":2,"title":"Data Processing","slug":"data-processing","children":[]},{"level":2,"title":"Disclaimer","slug":"disclaimer","children":[]}],"git":{"updatedTime":null},"filePathRelative":"terms.md"}');export{e as data}; diff --git a/docs/.vuepress/dist/changelog/0.1.html b/docs/.vuepress/dist/changelog/0.1.html new file mode 100644 index 0000000..0f40778 --- /dev/null +++ b/docs/.vuepress/dist/changelog/0.1.html @@ -0,0 +1,33 @@ + + + + + + + + + zProtect 0.1 | zProtect Documentation + + + + + + + + diff --git a/docs/.vuepress/dist/changelog/0.2.html b/docs/.vuepress/dist/changelog/0.2.html new file mode 100644 index 0000000..366f510 --- /dev/null +++ b/docs/.vuepress/dist/changelog/0.2.html @@ -0,0 +1,33 @@ + + + + + + + + + zProtect 0.2 | zProtect Documentation + + + + +

zProtect 0.2

  • Full rewrite of all transformers that previously existed in 0.1.
  • Full rewrite of the obfuscator core to allow more flexibility with jar files and read / write features.
  • Brand new YAML configuration system, we no longer use JSON.
  • Brand new Bundler System for the web.
+ + + diff --git a/docs/.vuepress/dist/commandline.html b/docs/.vuepress/dist/commandline.html new file mode 100644 index 0000000..d865625 --- /dev/null +++ b/docs/.vuepress/dist/commandline.html @@ -0,0 +1,33 @@ + + + + + + + + + Command Line Tool | zProtect Documentation + + + + +

Command Line Tool

Introduction

The zProtect web interface uses a bundle.zst file to recieve data. This is created using the zProtect command line tool. Other operations would also be available in the future. Please use the --help flag on the command line tool for more information on available operations.

Downloads

Operating SystemArchitectureDownload
Windows64-bit (AMD64)Hereopen in new window
32-bit (i386)Hereopen in new window
MacOs (Darwin)64-bit (AMD64)Hereopen in new window
64-bit (AArch64)Hereopen in new window
Linux64-bit (AMD64)Hereopen in new window
64-bit (AArch64)Hereopen in new window
32-bit (i386)Hereopen in new window
32-bit (AArch32)Hereopen in new window
+ + + diff --git a/docs/.vuepress/dist/config.html b/docs/.vuepress/dist/config.html new file mode 100644 index 0000000..b1fa05d --- /dev/null +++ b/docs/.vuepress/dist/config.html @@ -0,0 +1,135 @@ + + + + + + + + + Configuration Options | zProtect Documentation + + + + +

Configuration Options

Introduction

zProtect uses the YAMLopen in new window data serialization language for configuring the behavior of the zProtect obfuscator. It is possible to hand-write the configuration file to upload on the web interface, however, you may wish to modify the example file or generate one using the command line tool.

Value Types

There are a few value types used in the zProtect configuration, which are listed below.

Boolean

Only accepts true and false as the value.

For example:

# A key with value as true
+key1: true
+
+# A key with value as false
+key2: false
+

String

Accepts any text character.

For example:

# A key with a string value
+key: value
+

String Array

A list of strings, separated by a newline and prefixed with a dash.

For example:

# An array with entries
+key:
+- something
+- another thing
+
+# An empty array
+empty: []
+

Simple Option

A string array with a boolean value enabled.

For example:

# Option enabled
+key:
+  enabled: true
+

Option with Path

A string array with a boolean key enabled and a string key path.

For example:

# Option enabled
+key:
+  enabled: true
+  path: something
+

Options

These options specify runtime information and general configuration.

libraries

Dependencies required to obfuscate your jar to prevent "Not found" errors.

Value type: string array

exclusions

Class files and directories that should be ignored by the obfuscator. They will not have any obfuscation applied to them.

Value type: string array

ForceExclusions

Note

Transformer priority will fix this in the future.

Class files and directories that should be blacklisted by the obfuscator before processing. This will prevent issues with exclusions if the regular exclusions fail for some unknown reason.

Value type: string array

Watermark

Adds a watermark to the obfuscated JAR for advertisement. Only removable for users with a Commercial License.

Value type: boolean

Transformers

These options specify wherether to enable available obfuscation techniques.

AntiDebug incompatibilities

Warning!

This option may cause issues with certain programs.

Blocks debugging options on terminal.

Value type: simple option

DecompilerCrasher issues

Warning!

This option is very buggy at the moment and will likely cause problems. You are strongly advised not to use this.

Manipulates instructions to crash decompilers.

Value type: simple option

BadAnnotationCrasher

Manipulates annotations to break bad decompilers. This should not cause any major issues.

Value type: simple option

Flow

Adds fake jumps, and such to code.

Value type: simple option

Renamers

Renames various components of your JAR's contents.

ClassRenamer

Renames class files.

Value type: option with path

FieldRenamer

Renames field names.

Value type: simple option

LocalVariableRenamer

Renames local variables.

Value type: simple option

MethodRenamer

Renames methods.

Value type: simple option

Optimization

Modifies or removes various aspects of your jar file to make debugging harder.

EnumOptimiser

Removes all clone call(s) and returns an array to optimize enum values.

Value type: simple option

FinalRemover

Removes finals from your code.

Value type: simple option

HideClassMembers

Mark classes as synthetic to hide them from bad decompilers.

Value type: simple option

InsnRemover

Removes the instructions const_. and tableswitch.

Value type: simple option

KotlinMetadataRemover

Removes Kotlin-specific Metadata such as NotNull, Nullable, etc.

Value type: simple option

NOPInsnRemover

Removes extended type information.

Value type: simple option

RemoveSignatures

Removes the signature attribute from classes and methods.

Value type: simple option

Poolers

Move values into an array to make the resulting JAR harder.

NumberPooler

Moves numbers into an array.

Value type: simple option

StringPooler

Moves strings into an array.

Value type: simple option

Shrinking

Remove various attributes to make it harder to understand the resulting JAR.

LineNumberRemover

Removes line numbers so StackTraces show (Unknown) on errors.

Value type: simple option

LocalVariableRemover

Removes the local variable attribute from methods.

Value type: simple option

RemoveInnerClasses

Removes various attributes such as outerClass, outerMethod, etc. from the class.

Value type: simple option

SourceDebugRemover

Removes the SourceDebug attribute from the class.

Value type: simple option

SourceFileRemover

Removes the SourceFile attribute from the class.

Value type: simple option

Shufflers

Randomly shuffles various elements of your jar file to make it more difficult to find them.

ShuffleFields

Randomly shuffles elements in the mutable list of fields.

Value type: simple option

ShuffleMethods

Randomly shuffles elements in the mutable list of methods.

Value type: simple option

ShuffleClasses

Randomly shuffles elements in the mutable list of classes.

Value type: simple option

Example

Below is a fully functional example configuration file with some zProtect transformers enabled and some disabled.

# zProtect Configuration File Version 1
+# Reference: https://docs.zprotect.dev/config.html
+
+# May cause issues with certain programs.
+antiDebug:
+  enabled: false
+
+# Strongly advised not to use this.
+decompilerCrasher:
+  enabled: false
+
+badAnnotationCrasher:
+  enabled: true
+
+flow:
+  enabled: false
+
+classRenamer:
+  enabled: false
+  path: ""
+
+fieldRenamer:
+  enabled: false
+
+localVariableRenamer:
+  enabled: false
+
+methodRenamer:
+  enabled: false
+
+# Optimization
+enumOptimiser:
+  enabled: false
+
+finalRemover:
+  enabled: false
+
+hideClassMembers:
+  enabled: false
+
+insnRemover:
+  enabled: false
+
+kotlinMetadataRemover:
+  enabled: false
+
+NOPInsnRemover:
+  enabled: false
+
+removeSignatures:
+  enabled: false
+
+# Poolers
+numberPooler:
+  enabled: false
+
+stringPooler:
+  enabled: false
+
+# Shrinking
+lineNumberRemover:
+  enabled: false
+
+localVariableRemover:
+  enabled: false
+
+removeInnerClasses:
+  enabled: false
+
+sourceDebugRemover:
+  enabled: false
+
+sourceFileRemover:
+  enabled: false
+
+# Shufflers
+shuffleFields: false
+
+shuffleMethods: false
+
+shuffleClasses: false
+
+ + + diff --git a/docs/.vuepress/dist/favicon.ico b/docs/.vuepress/dist/favicon.ico new file mode 100644 index 0000000..ee5ca74 Binary files /dev/null and b/docs/.vuepress/dist/favicon.ico differ diff --git a/docs/.vuepress/dist/index.html b/docs/.vuepress/dist/index.html new file mode 100644 index 0000000..9f972e4 --- /dev/null +++ b/docs/.vuepress/dist/index.html @@ -0,0 +1,33 @@ + + + + + + + + + General Information | zProtect Documentation + + + + +

General Information

Product Description

zProtect is an online obfuscation platform. Our product makes your Java™ software (and by extention, languages that transpile to Java™[1]) more difficult to reverse engineer.

Obfuscation Bundles

For better efficency and lower bandwidth usage, users are required to create zProtect bundle.zst files using the zProtect command line tool's bundle command. You may download this tool here.

FAQ

What is the difference between a commercial license and a non-commercial license?

A non-commercial license has licensing limits that disallow the use of the zProtect obfuscator on any software that you intend to distribute commercially (i.e. for monetary gain). However, a commercial license lifts these limits, and allows you to use the zProtect obfuscator on any software.

How do I remove the watermark?

A commercial license is required to unlock the option to remove the watermark. This behavior is intentional.

I currently have a non-commercial license. How do I upgrade to a commercial license?

At the moment, it is not possible to upgrade to a commercial license from a non-commercial license on the web interface. Please contact zProtect support to discuss your options.


  1. Guarunteed support for Kotlin™ and Java™. Other JVM languages are supported on a best effort basis. ↩︎

+ + + diff --git a/docs/.vuepress/dist/logo.png b/docs/.vuepress/dist/logo.png new file mode 100644 index 0000000..fb8a57e Binary files /dev/null and b/docs/.vuepress/dist/logo.png differ diff --git a/docs/.vuepress/dist/og.png b/docs/.vuepress/dist/og.png new file mode 100644 index 0000000..06fa098 Binary files /dev/null and b/docs/.vuepress/dist/og.png differ diff --git a/docs/.vuepress/dist/privacy.html b/docs/.vuepress/dist/privacy.html new file mode 100644 index 0000000..e312c32 --- /dev/null +++ b/docs/.vuepress/dist/privacy.html @@ -0,0 +1,33 @@ + + + + + + + + + Privacy Policy | zProtect Documentation + + + + +

Privacy Policy

This Privacy Policy describes Our policies and procedures on the collection, use and disclosure of Your information when You use the Service and tells You about Your privacy rights and how the law protects You.

We use Your Personal data to provide and improve the Service. By using the Service, You agree to the collection and use of information in accordance with this Privacy Policy.

Interpretation and Definitions

Interpretation

The words of which the initial letter is capitalized have meanings defined under the following conditions. The following definitions shall have the same meaning regardless of whether they appear in singular or in plural.

Definitions

For the purposes of this Privacy Policy:

  • Account means a unique account created for You to access our Service or parts of our Service.

  • Company (referred to as either "the Company", "We", "Us" or "Our" in this Agreement) refers to NextStorm Software.

  • Cookies are small files that are placed on Your computer, mobile device or any other device by a website, containing the details of Your browsing history on that website among its many uses.

  • Country refers to: The United Kingdom of Great Britain and Northern Ireland

  • Device means any device that can access the Service such as acomputer, a cellphone or a digital tablet.

  • Personal Data is any information that relates to an identified oridentifiable individual.

  • Service refers to the Website.

  • Service Provider means any natural or legal person who processes the data on behalf of the Company. It refers to third-party companies or individuals employed by the Company to facilitate the Service, toprovide the Service on behalf of the Company, to perform services related to the Service or to assist the Company in analyzing how the Service is used.

  • Usage Data refers to data collected automatically, either generatedby the use of the Service or from the Service infrastructure itself(for example, the duration of a page visit).

  • Website refers to the zProtect website, accessible from https:/zprotect.dev, and any associated services.

  • You means the individual accessing or using the Service, or the company, or other legal entity on behalf of which such individual is accessing or using the Service, as applicable.

Collecting and Using Your Personal Data

Types of Data Collected

Personal Data

While using Our Service, We may ask You to provide Us with certain personally identifiable information that can be used to contact or identify You. Personally identifiable information may include, but is not limited to:

  • Email address

  • Usage Data

Usage Data

Usage Data is collected automatically when using the Service.

Usage Data may include information such as Your Device's Internet Protocol address (IP address), browser type, browser version, the pages of our Service that You visit, the time and date of Your visit, the time spent on those pages, unique device identifiers and other diagnostic data.

When You access the Service by or through a mobile device, We may collect certain information automatically, including, but not limited to, the type of mobile device You use, Your mobile device unique ID, the IP address of Your mobile device, Your mobile operating system, the type of mobile Internet browser You use, unique device identifiers and other diagnostic data.

We may also collect information that Your browser sends whenever You visit our Service or when You access the Service by or through a mobile device.

Tracking Technologies and Cookies

We use Cookies and similar tracking technologies to track the activity on Our Service and store certain information. Tracking technologies used are beacons, tags, and scripts to collect and track information and to improve and analyze Our Service. The technologies We use may include:

  • Cookies or Browser Cookies. A cookie is a small file placed on Your Device. You can instruct Your browser to refuse all Cookies or to indicate when a Cookie is being sent. However, if You do not accept Cookies, You may not be able to use some parts of our Service. Unless you have adjusted Your browser setting so that it will refuse Cookies, our Service may use Cookies.

  • Web Beacons. Certain sections of our Service and our emails may contain small electronic files known as web beacons (also referred to as clear gifs, pixel tags, and single-pixel gifs) that permit the Company, for example, to count users who have visited those pages or opened an email and for other related website statistics (for example, recording the popularity of a certain section and verifying system and server integrity).

Cookies can be "Persistent" or "Session" Cookies. Persistent Cookies remain on Your personal computer or mobile device when You go offline, while Session Cookies are deleted as soon as You close Your web browser. Learn more about cookies: What are cookies? by Cloudflare.

We use both Session and Persistent Cookies for the purposes set out below:

  • Necessary / Essential Cookies

    Type: Session Cookies

    Administered by: Us

    Purpose: These Cookies are essential to provide You with services available through the Website and to enable You to use some of its features. They help to authenticate users and prevent fraudulent use of user accounts. Without these Cookies, the services that You have asked for cannot be provided, and We only use these Cookies to provide You with those services.

    • Cookies Policy / Notice Acceptance Cookies

    Type: Persistent Cookies

    Administered by: Us

    Purpose: These Cookies identify if users have accepted the use of cookies on the Website.

    -nFunctionality Cookies

    Type: Persistent Cookies

    Administered by: Us

    Purpose: These Cookies allow us to remember choices You make when You use the Website, such as remembering your login details or language preference. The purpose of these Cookies is to provide You with a more personal experience and to avoid You having to re-enter your preferences every time You use the Website.

For more information about the cookies we use and your choices regarding cookies, please visit our Cookies Policy or the Cookies section of our Privacy Policy. Use of Your Personal Data

The Company may use Personal Data for the following purposes:

  • To provide and maintain our Service, including to monitor the usage of our Service.

  • To manage Your Account: to manage Your registration as a user of the Service. The Personal Data You provide can give You access to different functionalities of the Service that are available to You as a registered user.

  • For the performance of a contract: the development, compliance and undertaking of the purchase contract for the products, items or services You have purchased or of any other contract with Us through the Service.

  • To contact You: To contact You by email, telephone calls, SMS, or other equivalent forms of electronic communication, such as a mobile application's push notifications regarding updates or informative communications related to the functionalities, products or contracted services, including the security updates, when necessary or reasonable for their implementation.

  • To provide You with news, special offers and general information about other goods, services and events which we offer that are similar to those that you have already purchased or enquired about unless You have opted not to receive such information.

  • To manage Your requests: To attend and manage Your requests to Us.

  • For business transfers: We may use Your information to evaluate or conduct a merger, divestiture, restructuring, reorganization, dissolution, or other sale or transfer of some or all of Our assets, whether as a going concern or as part of bankruptcy, liquidation, or similar proceeding, in which Personal Data held by Us about our Service users is among the assets transferred.

  • For other purposes: We may use Your information for other purposes, such as data analysis, identifying usage trends, determining the effectiveness of our promotional campaigns and to evaluate and improve our Service, products, services, marketing and your experience.

We may share Your personal information in the following situations:

  • With Service Providers: We may share Your personal information with Service Providers to monitor and analyze the use of our Service, to contact You.
  • For business transfers: We may share or transfer Your personal information in connection with, or during negotiations of, any merger, sale of Company assets, financing, or acquisition of all or a portion of Our business to another company.
  • With Affiliates: We may share Your information with Our affiliates, in which case we will require those affiliates to honor this Privacy Policy. Affiliates include Our parent company and any other subsidiaries, joint venture partners or other companies that We control or that are under common control with Us.
  • With business partners: We may share Your information with Our business partners to offer You certain products, services or promotions.
  • With other users: when You share personal information or otherwise interact in the public areas with other users, such information may be viewed by all users and may be publicly distributed outside.
  • With Your consent: We may disclose Your personal information for any other purpose with Your consent.

Retention of Your Personal Data

The Company will retain Your Personal Data only for as long as is necessary for the purposes set out in this Privacy Policy. We will retain and use Your Personal Data to the extent necessary to comply with our legal obligations (for example, if we are required to retain your data to comply with applicable laws), resolve disputes, and enforce our legal agreements and policies.

The Company will also retain Usage Data for internal analysis purposes. Usage Data is generally retained for a shorter period of time, except when this data is used to strengthen the security or to improve the functionality of Our Service, or We are legally obligated to retain this data for longer time periods. Transfer of Your Personal Data

Your information, including Personal Data, is processed at the Company's operating offices and in any other places where the parties involved in the processing are located. It means that this information may be transferred to — and maintained on — computers located outside of Your state, province, country or other governmental jurisdiction where the data protection laws may differ than those from Your jurisdiction.

Your consent to this Privacy Policy followed by Your submission of such information represents Your agreement to that transfer.

The Company will take all steps reasonably necessary to ensure that Your data is treated securely and in accordance with this Privacy Policy and no transfer of Your Personal Data will take place to an organization or a country unless there are adequate controls in place including the security of Your data and other personal information.

Disclosure of Your Personal Data

Business Transactions

If the Company is involved in a merger, acquisition or asset sale, Your Personal Data may be transferred. We will provide notice before Your Personal Data is transferred and becomes subject to a different Privacy Policy.

Law enforcement

Under certain circumstances, the Company may be required to disclose Your Personal Data if required to do so by law or in response to valid requests by public authorities (e.g. a court or a government agency). Other legal requirements

The Company may disclose Your Personal Data in the good faith belief that such action is necessary to:

  • Comply with a legal obligation
  • Protect and defend the rights or property of the Company
  • Prevent or investigate possible wrongdoing in connection with the Service
  • Protect the personal safety of Users of the Service or the public
  • Protect against legal liability

Security of Your Personal Data

The security of Your Personal Data is important to Us, but remember that no method of transmission over the Internet, or method of electronic storage is 100% secure. While We strive to use commercially acceptable means to protect Your Personal Data, We cannot guarantee its absolute security.

Children's Privacy

Our Service does not address anyone under the age of 13. We do not knowingly collect personally identifiable information from anyone under the age of 13. If You are a parent or guardian and You are aware that Your child has provided Us with Personal Data, please contact Us. If We become aware that We have collected Personal Data from anyone under the age of 13 without verification of parental consent, We take steps to remove that information from Our servers.

If We need to rely on consent as a legal basis for processing Your information and Your country requires consent from a parent, We may require Your parent's consent before We collect and use that information.

Our Service may contain links to other websites that are not operated by Us. If You click on a third party link, You will be directed to that third party's site. We strongly advise You to review the Privacy Policy of every site You visit.

We have no control over and assume no responsibility for the content, privacy policies or practices of any third party sites or services.

Changes to this Privacy Policy

We may update Our Privacy Policy from time to time. We will notify You of any changes by posting the new Privacy Policy on this page.

We will let You know via email and/or a prominent notice on Our Service, prior to the change becoming effective and update the "Last updated" date at the top of this Privacy Policy.

You are advised to review this Privacy Policy periodically for any changes. Changes to this Privacy Policy are effective when they are posted on this page.

Contact Us

If you have any questions about this Privacy Policy, You can contact us:

  • By email: info@n23.io
  • By Discord: https://discord.com/invite/dnGKGuwvGH (Preferred)
+ + + diff --git a/docs/.vuepress/dist/terms.html b/docs/.vuepress/dist/terms.html new file mode 100644 index 0000000..56a3817 --- /dev/null +++ b/docs/.vuepress/dist/terms.html @@ -0,0 +1,33 @@ + + + + + + + + + Terms of Service | zProtect Documentation + + + + +

Terms of Service

This Terms of Service describes Our policies and restrictions on the use of Our Products and the Services.

Interpretation and Definitions

Interpretation

The words of which the initial letter is capitalized have meanings defined under the following conditions. The following definitions shall have the same meaning regardless of whether they appear in singular or in plural.

Definitions

For the purposes of this Terms of Service:

  • Company (referred to as either "the Company", "We", "Us" or "Our" in this Agreement) refers to NextStorm Software.

  • Personal Data is any information that relates to an identified oridentifiable individual.

  • Service refers to the Website.

  • Website refers to the zProtect website, accessible from https:/zprotect.dev, and any associated services.

  • You means the individual accessing or using the Service, or the company, or other legal entity on behalf of which such individual is accessing or using the Service, as applicable.

Use of the Website

Your access to this Website means you automatically agree to the Terms of Use and the Privacy Policy.

This Website is for your personal and non-commercial use. You may not modify, copy, distribute, transmit, display, publish, licence any products or services obtained from this Website.

You will not use the Website for any purpose that is unlawful by these Terms of Use. You may not use the website in any manner that may harm, disable or cause burden on any server or networks of this website.

Use of Our Products

It is forbidden to distribute, sell, reverse engineer, modify, decompile, deobfuscate, or unarchive zProtect products or any other binaries provided without explicit permission from the Company.

It is forbidden to share or resell the licences of Our products without permission. zProtect is all right reserved.

It is forbidden to distribute false or abusive information about Our products and the Company.

The Company has the right to suspend your licence of any zProtect product in case of violation of any of these rules. Data processing

Data Processing

By using any of Our services you consent to the processing of your personal data in order to protect Our services from misuse, detect bugs, prevent fraud and improve Our services.

We collect and may process the following data:

  • Emails;
  • Internet Protocol (IP) used to access Our services;
  • Active sessions on Our website and related sites;
  • Different types of information about your device and local time.

Disclaimer

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

THE ZPROTECT TEAM ALSO RESERVES THE RIGHT TO SUSPEND YOUR LICENCE TO ZPROTECT PRODUCTS AT ANY TIME WITHOUT GIVEN NOTICE.

+ + + diff --git a/docs/.vuepress/dist/zh/commandline.html b/docs/.vuepress/dist/zh/commandline.html new file mode 100644 index 0000000..5e6057f --- /dev/null +++ b/docs/.vuepress/dist/zh/commandline.html @@ -0,0 +1,33 @@ + + + + + + + + + Command Line Tool | zProtect Documentation + + + + + + + + diff --git a/docs/.vuepress/dist/zh/config.html b/docs/.vuepress/dist/zh/config.html new file mode 100644 index 0000000..70d562f --- /dev/null +++ b/docs/.vuepress/dist/zh/config.html @@ -0,0 +1,139 @@ + + + + + + + + + Configuration Options | zProtect Documentation + + + + +

Configuration Options

Introduction

zProtect uses the YAMLopen in new window data serialization language for configuring the behavior of the zProtect obfuscator. It is possible to hand-write the configuration file to upload on the web interface, however, you may wish to use the configurator tool in the zProtect dashboard area.

Value Types

There are a few value types used in the zProtect configuration, which are listed below.

Boolean

Only accepts true and false as the value.

For example:

# A key with value as true
+key1: true
+
+# A key with value as false
+key2: false
+

String

Accepts any text character.

For example:

# A key with a string value
+key: value
+

String Array

A list of strings, separated by a newline and prefixed with a dash.

For example:

# An array with entries
+key:
+- something
+- another thing
+
+# An empty array
+empty: []
+

Simple Option

A string array with a boolean value enabled.

For example:

# Option enabled
+key:
+  enabled: true
+

Option with Path

A string array with a boolean key enabled and a string key path.

For example:

# Option enabled
+key:
+  enabled: true
+  path: something
+

Options

These options specify runtime information and general configuration.

Output

Name of the obfuscated JAR file.

Value type: string

Libraries

Dependencies required to obfuscate your jar to prevent "Not found" errors.

Value type: string array

Exclusions

Class files and directories that should be ignored by the obfuscator. They will not have any obfuscation applied to them.

Value type: string array

ForceExclusions

Note

Transformer priority will fix this in the future.

Class files and directories that should be blacklisted by the obfuscator before processing. This will prevent issues with exclusions if the regular exclusions fail for some unknown reason.

Value type: string array

Watermark

Adds a watermark to the obfuscated JAR for advertisement. Only removable for users with a Commercial License.

Value type: boolean

Transformers

These options specify wherether to enable available obfuscation techniques.

AntiDebug incompatibilities

Warning!

This option may cause issues with certain programs.

Blocks debugging options on terminal.

Value type: simple option

DecompilerCrasher issues

Warning!

This option is very buggy at the moment and will likely cause problems. You are strongly advised not to use this.

Manipulates instructions to crash decompilers.

Value type: simple option

BadAnnotationCrasher

Manipulates annotations to break bad decompilers. This should not cause any major issues.

Value type: simple option

Flow

Adds fake jumps, and such to code.

Value type: simple option

Renamers

Renames various components of your jar's contents.

ClassRenamer

Renames class files.

Value type: option with path

FieldRenamer

Renames field names.

Value type: simple option

LocalVariableRenamer

Renames local variables.

Value type: simple option

MethodRenamer

Renames methods.

Value type: simple option

Optimization

EnumOptimiser

Value type: simple option

FinalRemover

Value type: simple option

HideClassMembers

Value type: simple option

InsnRemover

Value type: simple option

KotlinMetadataRemover

Value type: simple option

NOPInsnRemover

Value type: simple option

RemoveSignatures

Value type: simple option

Poolers

NumberPooler

Value type: simple option

StringPooler

Value type: simple option

Shrinking

LineNumberRemover

Value type: simple option

LocalVariableRemover

Value type: simple option

RemoveInnerClasses

Value type: simple option

SourceDebugRemover

Value type: simple option

SourceFileRemover

Value type: simple option

Shufflers

ShuffleFields

Value type: simple option

ShuffleMethods

Value type: simple option

ShuffleClasses

Value type: simple option

Example

Below is a fully functional example configuration file with some zProtect transformers enabled and some disabled.

# Blocks debugging options on terminal, may cause issues with certain programs.
+AntiDebug:
+  enabled: false
+
+# Manipulates instructions to crash decompilers. Currently very buggy at the moment and will likely cause problems.
+# Strongly advised not to use this.
+DecompilerCrasher:
+  enabled: false
+
+# Manipulates annotations to break bad decompilers.
+# This should not cause any major issues with Spigot jars.
+BadAnnotationCrasher:
+  enabled: true
+
+# Adds fake jumps, and such to code.
+Flow:
+  enabled: false
+
+# Renames various components of your jar's contents.
+# Renames class files.
+ClassRenamer:
+  enabled: false
+  path: ""
+
+# Renames field names.
+FieldRenamer:
+  enabled: false
+
+# Renames local variables.
+LocalVariableRenamer:
+  enabled: false
+
+# Renames methods.
+MethodRenamer:
+  enabled: false
+
+# Optimization
+EnumOptimiser:
+  enabled: false
+
+FinalRemover:
+  enabled: false
+
+HideClassMembers:
+  enabled: false
+
+InsnRemover:
+  enabled: false
+
+KotlinMetadataRemover:
+  enabled: false
+
+NOPInsnRemover:
+  enabled: false
+
+RemoveSignatures:
+  enabled: false
+
+# Poolers
+NumberPooler:
+  enabled: false
+
+StringPooler:
+  enabled: false
+
+# Shrinking
+LineNumberRemover:
+  enabled: false
+
+LocalVariableRemover:
+  enabled: false
+
+RemoveInnerClasses:
+  enabled: false
+
+SourceDebugRemover:
+  enabled: false
+
+SourceFileRemover:
+  enabled: false
+
+# Shufflers
+ShuffleFields: false
+ShuffleMethods: false
+ShuffleClasses: false
+
+ + + diff --git a/docs/.vuepress/dist/zh/index.html b/docs/.vuepress/dist/zh/index.html new file mode 100644 index 0000000..0e2fd89 --- /dev/null +++ b/docs/.vuepress/dist/zh/index.html @@ -0,0 +1,33 @@ + + + + + + + + + General Information | zProtect Documentation + + + + +

General Information

Product Description

zProtect is an online obfuscation platform. Our product makes your Java™ software (and by extention, languages that transpile to Java™[1]) more difficult to reverse engineer.

FAQ

What is the difference between a commercial license and a non-commercial license?

A non-commercial license has licensing limits that disallow the use of the zProtect obfuscator on any software that you intend to distribute commercially (i.e. for monetary gain). However, a commercial license lifts these limits, and allows you to use the zProtect obfuscator on any software.

How do I remove the watermark?

A commercial license is required to unlock the option to remove the watermark. This behavior is intentional.

I currently have a non-commercial license. How do I upgrade to a commercial license?

At the moment, it is not possible to upgrade to a commercial license from a non-commercial license on the web interface. Please contact zProtect support to discuss your options.


  1. Guarunteed support for Kotlin™ and Java™. Other JVM languages are supported on a best effort basis. ↩︎

+ + + diff --git a/docs/.vuepress/public/favicon.ico b/docs/.vuepress/public/favicon.ico new file mode 100644 index 0000000..ee5ca74 Binary files /dev/null and b/docs/.vuepress/public/favicon.ico differ diff --git a/docs/.vuepress/public/logo.png b/docs/.vuepress/public/logo.png new file mode 100644 index 0000000..fb8a57e Binary files /dev/null and b/docs/.vuepress/public/logo.png differ diff --git a/docs/.vuepress/public/og.png b/docs/.vuepress/public/og.png new file mode 100644 index 0000000..06fa098 Binary files /dev/null and b/docs/.vuepress/public/og.png differ diff --git a/docs/.vuepress/styles/index.scss b/docs/.vuepress/styles/index.scss new file mode 100644 index 0000000..4fc1e4d --- /dev/null +++ b/docs/.vuepress/styles/index.scss @@ -0,0 +1,19 @@ +:root { + scroll-behavior: smooth; + + // brand colors + --c-brand: #936edb !important; + --c-brand-light: #b39ae6 !important; + + // custom tip + --c-tip: #b39ae6 !important; +} + +html.dark { + // brand colors + --c-brand: #936edb !important; + --c-brand-light: #b39ae6 !important; + + // custom tip + --c-tip: #b39ae6 !important; +} diff --git a/docs/changelog/0.1.md b/docs/changelog/0.1.md new file mode 100644 index 0000000..7c257cb --- /dev/null +++ b/docs/changelog/0.1.md @@ -0,0 +1,3 @@ +# zProtect 0.1 + +- Initial Release \ No newline at end of file diff --git a/docs/changelog/0.2.md b/docs/changelog/0.2.md new file mode 100644 index 0000000..758cf47 --- /dev/null +++ b/docs/changelog/0.2.md @@ -0,0 +1,6 @@ +# zProtect 0.2 + +- Full rewrite of all transformers that previously existed in 0.1. +- Full rewrite of the obfuscator core to allow more flexibility with jar files and read / write features. +- Brand new YAML configuration system, we no longer use JSON. +- Brand new Bundler System for the web. \ No newline at end of file diff --git a/docs/commandline.md b/docs/commandline.md new file mode 100644 index 0000000..e3bb4c4 --- /dev/null +++ b/docs/commandline.md @@ -0,0 +1,17 @@ +# Command Line Tool + +## Introduction +The zProtect web interface uses a bundle.zst file to recieve data. This is created using the zProtect command line tool. Other operations would also be available in the future. Please use the `--help` flag on the command line tool for more information on available operations. + +## Downloads + +| Operating System | Architecture | Download | +| ---------------- | ---------------- | ---------------------------------------------------------------------------------------------------------------------- | +| Windows | 64-bit (AMD64) | [Here](https://objects.n23.io/4bcb968ea2654ee1be650d6be455725e:bucket1/zprotect-cli%2Fv0%2Fzprotect-windows-amd64.exe) | +| | 32-bit (i386) | [Here](https://objects.n23.io/4bcb968ea2654ee1be650d6be455725e:bucket1/zprotect-cli%2Fv0%2Fzprotect-windows-386.exe) | +| MacOs (Darwin) | 64-bit (AMD64) | [Here](https://objects.n23.io/4bcb968ea2654ee1be650d6be455725e:bucket1/zprotect-cli%2Fv0%2Fzprotect-darwin-amd64) | +| | 64-bit (AArch64) | [Here](https://objects.n23.io/4bcb968ea2654ee1be650d6be455725e:bucket1/zprotect-cli%2Fv0%2Fzprotect-darwin-arm64) | +| Linux | 64-bit (AMD64) | [Here](https://objects.n23.io/4bcb968ea2654ee1be650d6be455725e:bucket1/zprotect-cli%2Fv0%2Fzprotect-linux-amd64) | +| | 64-bit (AArch64) | [Here](https://objects.n23.io/4bcb968ea2654ee1be650d6be455725e:bucket1/zprotect-cli%2Fv0%2Fzprotect-linux-arm64) | +| | 32-bit (i386) | [Here](https://objects.n23.io/4bcb968ea2654ee1be650d6be455725e:bucket1/zprotect-cli%2Fv0%2Fzprotect-linux-386) | +| | 32-bit (AArch32) | [Here](https://objects.n23.io/4bcb968ea2654ee1be650d6be455725e:bucket1/zprotect-cli%2Fv0%2Fzprotect-linux-arm) | diff --git a/docs/config.md b/docs/config.md new file mode 100644 index 0000000..58580ce --- /dev/null +++ b/docs/config.md @@ -0,0 +1,330 @@ +# Configuration Options + +## Introduction + +zProtect uses the [YAML](https://en.wikipedia.org/wiki/YAML) data serialization language for configuring the behavior of the zProtect obfuscator. It is possible to hand-write the configuration file to upload on the web interface, however, you may wish to modify the [example file](#example) or generate one using the [command line tool](./commandline.md). + +## Value Types +There are a few value types used in the zProtect configuration, which are listed below. + +### Boolean +Only accepts `true` and `false` as the value. + +For example: +```yaml +# A key with value as true +key1: true + +# A key with value as false +key2: false +``` + +### String +Accepts any text character. + +For example: +```yaml +# A key with a string value +key: value +``` + +### String Array +A list of [`strings`](#string), separated by a newline and prefixed with a dash. + +For example: +```yaml +# An array with entries +key: +- something +- another thing + +# An empty array +empty: [] +``` + +### Simple Option +A [`string array`](#string-array) with a [`boolean`](#boolean) value `enabled`. + +For example: +```yaml +# Option enabled +key: + enabled: true +``` + +### Option with Path +A [`string array`](#string-array) with a [`boolean`](#boolean) key `enabled` and a [`string`](#string) key `path`. + +For example: +```yaml +# Option enabled +key: + enabled: true + path: something +``` + + +## Options +These options specify runtime information and general configuration. + +### libraries +Dependencies required to obfuscate your jar to prevent "Not found" errors. + +Value type: [`string array`](#string-array) + +### exclusions +Class files and directories that should be ignored by the obfuscator. They will not have any obfuscation applied to them. + +Value type: [`string array`](#string-array) + +### ForceExclusions +::: tip Note +Transformer priority will fix this in the future. +::: +Class files and directories that should be blacklisted by the obfuscator before processing. This will prevent issues with exclusions if the regular exclusions fail for some unknown reason. + +Value type: [`string array`](#string-array) + +### Watermark +Adds a watermark to the obfuscated JAR for advertisement. Only removable for users with a Commercial License. + +Value type: [`boolean`](#boolean) + +## Transformers +These options specify wherether to enable available obfuscation techniques. + +### AntiDebug +::: tip Warning! +This option may cause issues with certain programs. +::: + +Blocks debugging options on terminal. + +Value type: [`simple option`](#simple-option) + +### DecompilerCrasher +::: tip Warning! +This option is very buggy at the moment and will likely cause problems. +You are strongly advised not to use this. +::: + +Manipulates instructions to crash decompilers. + +Value type: [`simple option`](#simple-option) + +### BadAnnotationCrasher +Manipulates annotations to break bad decompilers. This should not cause any major issues. + +Value type: [`simple option`](#simple-option) + +### Flow +Adds fake jumps, and such to code. + +Value type: [`simple option`](#simple-option) + +## Renamers +Renames various components of your JAR's contents. + +### ClassRenamer +Renames class files. + +Value type: [`option with path`](#option-with-path) + +### FieldRenamer +Renames field names. + +Value type: [`simple option`](#simple-option) + +### LocalVariableRenamer +Renames local variables. + +Value type: [`simple option`](#simple-option) + +### MethodRenamer +Renames methods. + +Value type: [`simple option`](#simple-option) + +## Optimization +Modifies or removes various aspects of your jar file to make debugging harder. + +### EnumOptimiser +Removes all clone call(s) and returns an array to optimize enum values. + +Value type: [`simple option`](#simple-option) + +### FinalRemover +Removes finals from your code. + +Value type: [`simple option`](#simple-option) + +### HideClassMembers +Mark classes as synthetic to hide them from bad decompilers. + +Value type: [`simple option`](#simple-option) + +### InsnRemover +Removes the instructions `const_.` and `tableswitch`. + +Value type: [`simple option`](#simple-option) + +### KotlinMetadataRemover +Removes Kotlin-specific Metadata such as `NotNull`, `Nullable`, etc. + +Value type: [`simple option`](#simple-option) + +### NOPInsnRemover +Removes extended type information. + +Value type: [`simple option`](#simple-option) + +### RemoveSignatures +Removes the signature attribute from classes and methods. + +Value type: [`simple option`](#simple-option) + +## Poolers +Move values into an array to make the resulting JAR harder. + +### NumberPooler +Moves numbers into an array. + +Value type: [`simple option`](#simple-option) + +### StringPooler +Moves strings into an array. + +Value type: [`simple option`](#simple-option) + +## Shrinking +Remove various attributes to make it harder to understand the resulting JAR. + +### LineNumberRemover +Removes line numbers so StackTraces show `(Unknown)` on errors. + +Value type: [`simple option`](#simple-option) + +### LocalVariableRemover +Removes the local variable attribute from methods. + +Value type: [`simple option`](#simple-option) + +### RemoveInnerClasses +Removes various attributes such as `outerClass`, `outerMethod`, etc. from the class. + +Value type: [`simple option`](#simple-option) + +### SourceDebugRemover +Removes the `SourceDebug` attribute from the class. + +Value type: [`simple option`](#simple-option) + +### SourceFileRemover +Removes the `SourceFile` attribute from the class. + +Value type: [`simple option`](#simple-option) + +## Shufflers +Randomly shuffles various elements of your jar file to make it more difficult to find them. + +### ShuffleFields +Randomly shuffles elements in the mutable list of fields. + +Value type: [`simple option`](#simple-option) + +### ShuffleMethods +Randomly shuffles elements in the mutable list of methods. + +Value type: [`simple option`](#simple-option) + +### ShuffleClasses +Randomly shuffles elements in the mutable list of classes. + +Value type: [`simple option`](#simple-option) + +## Example +Below is a fully functional example configuration file with some zProtect transformers enabled and some disabled. + +```yaml +# zProtect Configuration File Version 1 +# Reference: https://docs.zprotect.dev/config.html + +# May cause issues with certain programs. +antiDebug: + enabled: false + +# Strongly advised not to use this. +decompilerCrasher: + enabled: false + +badAnnotationCrasher: + enabled: true + +flow: + enabled: false + +classRenamer: + enabled: false + path: "" + +fieldRenamer: + enabled: false + +localVariableRenamer: + enabled: false + +methodRenamer: + enabled: false + +# Optimization +enumOptimiser: + enabled: false + +finalRemover: + enabled: false + +hideClassMembers: + enabled: false + +insnRemover: + enabled: false + +kotlinMetadataRemover: + enabled: false + +NOPInsnRemover: + enabled: false + +removeSignatures: + enabled: false + +# Poolers +numberPooler: + enabled: false + +stringPooler: + enabled: false + +# Shrinking +lineNumberRemover: + enabled: false + +localVariableRemover: + enabled: false + +removeInnerClasses: + enabled: false + +sourceDebugRemover: + enabled: false + +sourceFileRemover: + enabled: false + +# Shufflers +shuffleFields: false + +shuffleMethods: false + +shuffleClasses: false +``` \ No newline at end of file diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..d686074 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,19 @@ +# General Information + +## Product Description +zProtect is an online obfuscation platform. Our product makes your Java™ software (and by extention, languages that transpile to Java™[^1]) more difficult to reverse engineer. + +## Obfuscation Bundles +For better efficency and lower bandwidth usage, users are required to create zProtect `bundle.zst` files using the zProtect command line tool's [bundle command](./commandline.md). You may download this tool [here](./commandline.md#downloads). + +## FAQ +### What is the difference between a commercial license and a non-commercial license? +A non-commercial license has licensing limits that disallow the use of the zProtect obfuscator on any software that you intend to distribute commercially (i.e. for monetary gain). However, a commercial license lifts these limits, and allows you to use the zProtect obfuscator on any software. + +### How do I remove the watermark? +A commercial license is required to unlock the option to remove the watermark. This behavior is intentional. + +### I currently have a non-commercial license. How do I upgrade to a commercial license? +At the moment, it is not possible to upgrade to a commercial license from a non-commercial license on the web interface. Please contact zProtect support to discuss your options. + +[^1]: Guarunteed support for Kotlin™ and Java™. Other JVM languages are supported on a best effort basis. diff --git a/docs/privacy.md b/docs/privacy.md new file mode 100644 index 0000000..7f99cd0 --- /dev/null +++ b/docs/privacy.md @@ -0,0 +1,179 @@ +# Privacy Policy + +This Privacy Policy describes Our policies and procedures on the collection, use and disclosure of Your information when You use the Service and tells You about Your privacy rights and how the law protects You. + +We use Your Personal data to provide and improve the Service. By using the Service, You agree to the collection and use of information in accordance with this Privacy Policy. + +## Interpretation and Definitions +### Interpretation + +The words of which the initial letter is capitalized have meanings defined under the following conditions. The following definitions shall have the same meaning regardless of whether they appear in singular or in plural. + +### Definitions + +For the purposes of this Privacy Policy: + +- Account means a unique account created for You to access our Service or parts of our Service. + +- Company (referred to as either "the Company", "We", "Us" or "Our" in this Agreement) refers to NextStorm Software. + +- Cookies are small files that are placed on Your computer, mobile device or any other device by a website, containing the details of Your browsing history on that website among its many uses. + +- Country refers to: The United Kingdom of Great Britain and Northern Ireland + +- Device means any device that can access the Service such as acomputer, a cellphone or a digital tablet. + +- Personal Data is any information that relates to an identified oridentifiable individual. + +- Service refers to the Website. + +- Service Provider means any natural or legal person who processes the data on behalf of the Company. It refers to third-party companies or individuals employed by the Company to facilitate the Service, toprovide the Service on behalf of the Company, to perform services related to the Service or to assist the Company in analyzing how the Service is used. + +- Usage Data refers to data collected automatically, either generatedby the use of the Service or from the Service infrastructure itself(for example, the duration of a page visit). + +- Website refers to the zProtect website, accessible from https:/zprotect.dev, and any associated services. + +- You means the individual accessing or using the Service, or the company, or other legal entity on behalf of which such individual is accessing or using the Service, as applicable. + +## Collecting and Using Your Personal Data +### Types of Data Collected +#### Personal Data + +While using Our Service, We may ask You to provide Us with certain personally identifiable information that can be used to contact or identify You. Personally identifiable information may include, but is not limited to: + +- Email address + +- Usage Data + +#### Usage Data + +Usage Data is collected automatically when using the Service. + +Usage Data may include information such as Your Device's Internet Protocol address (IP address), browser type, browser version, the pages of our Service that You visit, the time and date of Your visit, the time spent on those pages, unique device identifiers and other diagnostic data. + +When You access the Service by or through a mobile device, We may collect certain information automatically, including, but not limited to, the type of mobile device You use, Your mobile device unique ID, the IP address of Your mobile device, Your mobile operating system, the type of mobile Internet browser You use, unique device identifiers and other diagnostic data. + +We may also collect information that Your browser sends whenever You visit our Service or when You access the Service by or through a mobile device. + +#### Tracking Technologies and Cookies + +We use Cookies and similar tracking technologies to track the activity on Our Service and store certain information. Tracking technologies used are beacons, tags, and scripts to collect and track information and to improve and analyze Our Service. The technologies We use may include: + +- Cookies or Browser Cookies. A cookie is a small file placed on Your Device. You can instruct Your browser to refuse all Cookies or to indicate when a Cookie is being sent. However, if You do not accept Cookies, You may not be able to use some parts of our Service. Unless you have adjusted Your browser setting so that it will refuse Cookies, our Service may use Cookies. + +- Web Beacons. Certain sections of our Service and our emails may contain small electronic files known as web beacons (also referred to as clear gifs, pixel tags, and single-pixel gifs) that permit the Company, for example, to count users who have visited those pages or opened an email and for other related website statistics (for example, recording the popularity of a certain section and verifying system and server integrity). + +Cookies can be "Persistent" or "Session" Cookies. Persistent Cookies remain on Your personal computer or mobile device when You go offline, while Session Cookies are deleted as soon as You close Your web browser. Learn more about cookies: What are cookies? by Cloudflare. + +We use both Session and Persistent Cookies for the purposes set out below: + +- Necessary / Essential Cookies + + Type: Session Cookies + + Administered by: Us + + Purpose: These Cookies are essential to provide You with services available through the Website and to enable You to use some of its features. They help to authenticate users and prevent fraudulent use of user accounts. Without these Cookies, the services that You have asked for cannot be provided, and We only use these Cookies to provide You with those services. + + - Cookies Policy / Notice Acceptance Cookies + + Type: Persistent Cookies + + Administered by: Us + + Purpose: These Cookies identify if users have accepted the use of cookies on the Website. + + -nFunctionality Cookies + + Type: Persistent Cookies + + Administered by: Us + + Purpose: These Cookies allow us to remember choices You make when You use the Website, such as remembering your login details or language preference. The purpose of these Cookies is to provide You with a more personal experience and to avoid You having to re-enter your preferences every time You use the Website. + +For more information about the cookies we use and your choices regarding cookies, please visit our Cookies Policy or the Cookies section of our Privacy Policy. +Use of Your Personal Data + +The Company may use Personal Data for the following purposes: + +- To provide and maintain our Service, including to monitor the usage of our Service. + +- To manage Your Account: to manage Your registration as a user of the Service. The Personal Data You provide can give You access to different functionalities of the Service that are available to You as a registered user. + +- For the performance of a contract: the development, compliance and undertaking of the purchase contract for the products, items or services You have purchased or of any other contract with Us through the Service. + +- To contact You: To contact You by email, telephone calls, SMS, or other equivalent forms of electronic communication, such as a mobile application's push notifications regarding updates or informative communications related to the functionalities, products or contracted services, including the security updates, when necessary or reasonable for their implementation. + +- To provide You with news, special offers and general information about other goods, services and events which we offer that are similar to those that you have already purchased or enquired about unless You have opted not to receive such information. + +- To manage Your requests: To attend and manage Your requests to Us. + +- For business transfers: We may use Your information to evaluate or conduct a merger, divestiture, restructuring, reorganization, dissolution, or other sale or transfer of some or all of Our assets, whether as a going concern or as part of bankruptcy, liquidation, or similar proceeding, in which Personal Data held by Us about our Service users is among the assets transferred. + +- For other purposes: We may use Your information for other purposes, such as data analysis, identifying usage trends, determining the effectiveness of our promotional campaigns and to evaluate and improve our Service, products, services, marketing and your experience. + +We may share Your personal information in the following situations: + +- With Service Providers: We may share Your personal information with Service Providers to monitor and analyze the use of our Service, to contact You. +- For business transfers: We may share or transfer Your personal information in connection with, or during negotiations of, any merger, sale of Company assets, financing, or acquisition of all or a portion of Our business to another company. +- With Affiliates: We may share Your information with Our affiliates, in which case we will require those affiliates to honor this Privacy Policy. Affiliates include Our parent company and any other subsidiaries, joint venture partners or other companies that We control or that are under common control with Us. +- With business partners: We may share Your information with Our business partners to offer You certain products, services or promotions. +- With other users: when You share personal information or otherwise interact in the public areas with other users, such information may be viewed by all users and may be publicly distributed outside. +- With Your consent: We may disclose Your personal information for any other purpose with Your consent. + +### Retention of Your Personal Data + +The Company will retain Your Personal Data only for as long as is necessary for the purposes set out in this Privacy Policy. We will retain and use Your Personal Data to the extent necessary to comply with our legal obligations (for example, if we are required to retain your data to comply with applicable laws), resolve disputes, and enforce our legal agreements and policies. + +The Company will also retain Usage Data for internal analysis purposes. Usage Data is generally retained for a shorter period of time, except when this data is used to strengthen the security or to improve the functionality of Our Service, or We are legally obligated to retain this data for longer time periods. +Transfer of Your Personal Data + +Your information, including Personal Data, is processed at the Company's operating offices and in any other places where the parties involved in the processing are located. It means that this information may be transferred to — and maintained on — computers located outside of Your state, province, country or other governmental jurisdiction where the data protection laws may differ than those from Your jurisdiction. + +Your consent to this Privacy Policy followed by Your submission of such information represents Your agreement to that transfer. + +The Company will take all steps reasonably necessary to ensure that Your data is treated securely and in accordance with this Privacy Policy and no transfer of Your Personal Data will take place to an organization or a country unless there are adequate controls in place including the security of Your data and other personal information. + +### Disclosure of Your Personal Data +#### Business Transactions + +If the Company is involved in a merger, acquisition or asset sale, Your Personal Data may be transferred. We will provide notice before Your Personal Data is transferred and becomes subject to a different Privacy Policy. +#### Law enforcement + +Under certain circumstances, the Company may be required to disclose Your Personal Data if required to do so by law or in response to valid requests by public authorities (e.g. a court or a government agency). +Other legal requirements + +The Company may disclose Your Personal Data in the good faith belief that such action is necessary to: + +- Comply with a legal obligation +- Protect and defend the rights or property of the Company +- Prevent or investigate possible wrongdoing in connection with the Service +- Protect the personal safety of Users of the Service or the public +- Protect against legal liability + +#### Security of Your Personal Data + +The security of Your Personal Data is important to Us, but remember that no method of transmission over the Internet, or method of electronic storage is 100% secure. While We strive to use commercially acceptable means to protect Your Personal Data, We cannot guarantee its absolute security. +## Children's Privacy + +Our Service does not address anyone under the age of 13. We do not knowingly collect personally identifiable information from anyone under the age of 13. If You are a parent or guardian and You are aware that Your child has provided Us with Personal Data, please contact Us. If We become aware that We have collected Personal Data from anyone under the age of 13 without verification of parental consent, We take steps to remove that information from Our servers. + +If We need to rely on consent as a legal basis for processing Your information and Your country requires consent from a parent, We may require Your parent's consent before We collect and use that information. +## Links to Other Websites + +Our Service may contain links to other websites that are not operated by Us. If You click on a third party link, You will be directed to that third party's site. We strongly advise You to review the Privacy Policy of every site You visit. + +We have no control over and assume no responsibility for the content, privacy policies or practices of any third party sites or services. +## Changes to this Privacy Policy + +We may update Our Privacy Policy from time to time. We will notify You of any changes by posting the new Privacy Policy on this page. + +We will let You know via email and/or a prominent notice on Our Service, prior to the change becoming effective and update the "Last updated" date at the top of this Privacy Policy. + +You are advised to review this Privacy Policy periodically for any changes. Changes to this Privacy Policy are effective when they are posted on this page. +## Contact Us + +If you have any questions about this Privacy Policy, You can contact us: + +- By email: info@n23.io +- By Discord: https://discord.com/invite/dnGKGuwvGH (Preferred) \ No newline at end of file diff --git a/docs/terms.md b/docs/terms.md new file mode 100644 index 0000000..48e388a --- /dev/null +++ b/docs/terms.md @@ -0,0 +1,56 @@ +# Terms of Service + +This Terms of Service describes Our policies and restrictions on the use of Our Products and the Services. + +## Interpretation and Definitions +### Interpretation + +The words of which the initial letter is capitalized have meanings defined under the following conditions. The following definitions shall have the same meaning regardless of whether they appear in singular or in plural. + +### Definitions + +For the purposes of this Terms of Service: + +- Company (referred to as either "the Company", "We", "Us" or "Our" in this Agreement) refers to NextStorm Software. + +- Personal Data is any information that relates to an identified oridentifiable individual. + +- Service refers to the Website. + +- Website refers to the zProtect website, accessible from https:/zprotect.dev, and any associated services. + +- You means the individual accessing or using the Service, or the company, or other legal entity on behalf of which such individual is accessing or using the Service, as applicable. + +## Use of the Website + +Your access to this Website means you automatically agree to the Terms of Use and the Privacy Policy. + +This Website is for your personal and non-commercial use. You may not modify, copy, distribute, transmit, display, publish, licence any products or services obtained from this Website. + +You will not use the Website for any purpose that is unlawful by these Terms of Use. You may not use the website in any manner that may harm, disable or cause burden on any server or networks of this website. +## Use of Our Products + +It is forbidden to distribute, sell, reverse engineer, modify, decompile, deobfuscate, or unarchive zProtect products or any other binaries provided without explicit permission from the Company. + +It is forbidden to share or resell the licences of Our products without permission. zProtect is all right reserved. + +It is forbidden to distribute false or abusive information about Our products and the Company. + +The Company has the right to suspend your licence of any zProtect product in case of violation of any of these rules. +Data processing + +## Data Processing +By using any of Our services you consent to the processing of your personal data in order to protect Our services from misuse, detect bugs, prevent fraud and improve Our services. + +We collect and may process the following data: + +- Emails; +- Internet Protocol (IP) used to access Our services; +- Active sessions on Our website and related sites; +- Different types of information about your device and local time. + +## Disclaimer + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +THE ZPROTECT TEAM ALSO RESERVES THE RIGHT TO SUSPEND YOUR LICENCE TO ZPROTECT PRODUCTS AT ANY TIME WITHOUT GIVEN NOTICE. \ No newline at end of file diff --git a/docs/zh/commandline.md b/docs/zh/commandline.md new file mode 100644 index 0000000..fbc686a --- /dev/null +++ b/docs/zh/commandline.md @@ -0,0 +1,3 @@ +# Command Line Tool + +Documentation coming soon. In the mean time, please use the `--help` flag for more information. diff --git a/docs/zh/config.md b/docs/zh/config.md new file mode 100644 index 0000000..a63d8b8 --- /dev/null +++ b/docs/zh/config.md @@ -0,0 +1,318 @@ +# Configuration Options + +## Introduction + +zProtect uses the [YAML](https://en.wikipedia.org/wiki/YAML) data serialization language for configuring the behavior of the zProtect obfuscator. It is possible to hand-write the configuration file to upload on the web interface, however, you may wish to use the configurator tool in the zProtect dashboard area. + +## Value Types +There are a few value types used in the zProtect configuration, which are listed below. + +### Boolean +Only accepts `true` and `false` as the value. + +For example: +```yaml +# A key with value as true +key1: true + +# A key with value as false +key2: false +``` + +### String +Accepts any text character. + +For example: +```yaml +# A key with a string value +key: value +``` + +### String Array +A list of [`strings`](#string), separated by a newline and prefixed with a dash. + +For example: +```yaml +# An array with entries +key: +- something +- another thing + +# An empty array +empty: [] +``` + +### Simple Option +A [`string array`](#string-array) with a [`boolean`](#boolean) value `enabled`. + +For example: +```yaml +# Option enabled +key: + enabled: true +``` + +### Option with Path +A [`string array`](#string-array) with a [`boolean`](#boolean) key `enabled` and a [`string`](#string) key `path`. + +For example: +```yaml +# Option enabled +key: + enabled: true + path: something +``` + + +## Options +These options specify runtime information and general configuration. + +### Output +Name of the obfuscated JAR file. + +Value type: [`string`](#string) + +### Libraries +Dependencies required to obfuscate your jar to prevent "Not found" errors. + +Value type: [`string array`](#string-array) + +### Exclusions +Class files and directories that should be ignored by the obfuscator. They will not have any obfuscation applied to them. + +Value type: [`string array`](#string-array) + +### ForceExclusions +::: tip Note +Transformer priority will fix this in the future. +::: +Class files and directories that should be blacklisted by the obfuscator before processing. This will prevent issues with exclusions if the regular exclusions fail for some unknown reason. + +Value type: [`string array`](#string-array) + +### Watermark +Adds a watermark to the obfuscated JAR for advertisement. Only removable for users with a Commercial License. + +Value type: [`boolean`](#boolean) + +## Transformers +These options specify wherether to enable available obfuscation techniques. + +### AntiDebug +::: tip Warning! +This option may cause issues with certain programs. +::: + +Blocks debugging options on terminal. + +Value type: [`simple option`](#simple-option) + +### DecompilerCrasher +::: tip Warning! +This option is very buggy at the moment and will likely cause problems. +You are strongly advised not to use this. +::: + +Manipulates instructions to crash decompilers. + +Value type: [`simple option`](#simple-option) + +### BadAnnotationCrasher +Manipulates annotations to break bad decompilers. This should not cause any major issues. + +Value type: [`simple option`](#simple-option) + +### Flow +Adds fake jumps, and such to code. + +Value type: [`simple option`](#simple-option) + +## Renamers +Renames various components of your jar's contents. + +### ClassRenamer +Renames class files. + +Value type: [`option with path`](#option-with-path) + +### FieldRenamer +Renames field names. + +Value type: [`simple option`](#simple-option) + +### LocalVariableRenamer +Renames local variables. + +Value type: [`simple option`](#simple-option) + +### MethodRenamer +Renames methods. + +Value type: [`simple option`](#simple-option) + +## Optimization + +### EnumOptimiser + +Value type: [`simple option`](#simple-option) + +### FinalRemover + +Value type: [`simple option`](#simple-option) + +### HideClassMembers + +Value type: [`simple option`](#simple-option) + +### InsnRemover + +Value type: [`simple option`](#simple-option) + +### KotlinMetadataRemover + +Value type: [`simple option`](#simple-option) + +### NOPInsnRemover + +Value type: [`simple option`](#simple-option) + +### RemoveSignatures + +Value type: [`simple option`](#simple-option) + +## Poolers + +### NumberPooler + +Value type: [`simple option`](#simple-option) + +### StringPooler + +Value type: [`simple option`](#simple-option) + +## Shrinking + +### LineNumberRemover + +Value type: [`simple option`](#simple-option) + +### LocalVariableRemover + +Value type: [`simple option`](#simple-option) + +### RemoveInnerClasses + +Value type: [`simple option`](#simple-option) + +### SourceDebugRemover + +Value type: [`simple option`](#simple-option) + +### SourceFileRemover + +Value type: [`simple option`](#simple-option) + +## Shufflers + +### ShuffleFields + +Value type: [`simple option`](#simple-option) + +### ShuffleMethods + +Value type: [`simple option`](#simple-option) + +### ShuffleClasses + +Value type: [`simple option`](#simple-option) + +## Example +Below is a fully functional example configuration file with some zProtect transformers enabled and some disabled. + +```yaml +# Blocks debugging options on terminal, may cause issues with certain programs. +AntiDebug: + enabled: false + +# Manipulates instructions to crash decompilers. Currently very buggy at the moment and will likely cause problems. +# Strongly advised not to use this. +DecompilerCrasher: + enabled: false + +# Manipulates annotations to break bad decompilers. +# This should not cause any major issues with Spigot jars. +BadAnnotationCrasher: + enabled: true + +# Adds fake jumps, and such to code. +Flow: + enabled: false + +# Renames various components of your jar's contents. +# Renames class files. +ClassRenamer: + enabled: false + path: "" + +# Renames field names. +FieldRenamer: + enabled: false + +# Renames local variables. +LocalVariableRenamer: + enabled: false + +# Renames methods. +MethodRenamer: + enabled: false + +# Optimization +EnumOptimiser: + enabled: false + +FinalRemover: + enabled: false + +HideClassMembers: + enabled: false + +InsnRemover: + enabled: false + +KotlinMetadataRemover: + enabled: false + +NOPInsnRemover: + enabled: false + +RemoveSignatures: + enabled: false + +# Poolers +NumberPooler: + enabled: false + +StringPooler: + enabled: false + +# Shrinking +LineNumberRemover: + enabled: false + +LocalVariableRemover: + enabled: false + +RemoveInnerClasses: + enabled: false + +SourceDebugRemover: + enabled: false + +SourceFileRemover: + enabled: false + +# Shufflers +ShuffleFields: false +ShuffleMethods: false +ShuffleClasses: false +``` \ No newline at end of file diff --git a/docs/zh/index.md b/docs/zh/index.md new file mode 100644 index 0000000..a63222d --- /dev/null +++ b/docs/zh/index.md @@ -0,0 +1,16 @@ +# General Information + +## Product Description +zProtect is an online obfuscation platform. Our product makes your Java™ software (and by extention, languages that transpile to Java™[^1]) more difficult to reverse engineer. + +## FAQ +### What is the difference between a commercial license and a non-commercial license? +A non-commercial license has licensing limits that disallow the use of the zProtect obfuscator on any software that you intend to distribute commercially (i.e. for monetary gain). However, a commercial license lifts these limits, and allows you to use the zProtect obfuscator on any software. + +### How do I remove the watermark? +A commercial license is required to unlock the option to remove the watermark. This behavior is intentional. + +### I currently have a non-commercial license. How do I upgrade to a commercial license? +At the moment, it is not possible to upgrade to a commercial license from a non-commercial license on the web interface. Please contact zProtect support to discuss your options. + +[^1]: Guarunteed support for Kotlin™ and Java™. Other JVM languages are supported on a best effort basis.