diff --git a/resources/js/config.js b/resources/js/config.js
new file mode 100644
index 0000000..b751ff8
--- /dev/null
+++ b/resources/js/config.js
@@ -0,0 +1 @@
+var __DOCS_CONFIG__ = {"id":"oWYmqTK8c8BNAyTq+5G+Y222813jn65Cnoh","key":"Ae4c5Tq2c7p0mu+0GcXjoH6zRUiy3ne6erb/98XZJQs.fLEX05zSQohXc6hz0NT/piDd99A8NPqGxcNoJM3vaQuAm0QrZn1cJA+O+7pPOyjJTC6TkAGQE0IIvm8IsanAIA.105","base":"/","host":"docs.blissroms.org","version":"1.0.0","useRelativePaths":true,"documentName":"index.html","appendDocumentName":false,"trailingSlash":true,"preloadSearch":false,"cacheBustingToken":"2.3.0.709105685982","cacheBustingStrategy":"query","sidebarFilterPlaceholder":"Filter","toolbarFilterPlaceholder":"Filter","showSidebarFilter":true,"filterNotFoundMsg":"No member names found containing the query \"{query}\"","maxHistoryItems":15,"homeIcon":"<path d=\"M12.97 2.59a1.5 1.5 0 00-1.94 164 0l-7.5 6.363A1.5 1.5 0 003 10.097V19.5A1.5 1.5 0 004.5 21h4.75a.75.75 0 00.75-.75V14h4v6.25c0 .414.336.75.75.75h4.75a1.5 1.5 0 001.5-1.5v-9.403a1.5 1.5 0 00-.53-1.144l-7.5-6.363z\"></path>","access":[{"value":"public","label":"Public"},{"value":"protected","label":"Protected"}],"toolbarLinks":[{"id":"fields","label":"Fields"},{"id":"properties","label":"Properties","shortLabel":"Props"},{"id":"methods","label":"Methods"},{"id":"events","label":"Events"}],"sidebar":[{"n":"/","l":"Getting Started"},{"n":"/development","l":"Development","c":false,"i":[{"n":"/development/build-guide","l":"Build Bliss​Roms"},{"n":"/development/troubleshoot","l":"Troubleshooting"},{"n":"/development/conclusion","l":"Conclusion"}]},{"n":"/maintainers","l":"Maintainers","c":false,"i":[{"n":"/maintainers/requirements","l":"Requirements"},{"n":"/maintainers/code_of_conduct","l":"Code of Conduct"},{"n":"/maintainers/blissrom-overlays","l":"Bliss​Rom R Overlays"}]}],"search":{"mode":0,"minChars":2,"maxResults":20,"placeholder":"Search","hotkeys":["/"],"noResultsFoundMsg":"Sorry, no results found.","recognizeLanguages":true,"languages":[0],"preload":false}};
diff --git a/resources/js/lunr.js b/resources/js/lunr.js
new file mode 100644
index 0000000..c020ab0
--- /dev/null
+++ b/resources/js/lunr.js
@@ -0,0 +1,4 @@
+/*! Retype v2.3.0 | retype.com | Copyright 2022. Object.NET, Inc. All rights reserved. */
+
+/*! For license information please see lunr.js.LICENSE.txt */
+(()=>{var e={1336:(e,t,r)=>{var i,n;!function(){var s,o,a,u,l,c,h,d,f,p,y,m,g,x,v,w,Q,k,S,b,E,L,P,T,O,I,R=function(e){var t=new R.Builder;return t.pipeline.add(R.trimmer,R.stopWordFilter,R.stemmer),t.searchPipeline.add(R.stemmer),e.call(t,t),t.build()};R.version="2.3.9",R.utils={},R.utils.warn=(s=this,function(e){s.console&&console.warn&&console.warn(e)}),R.utils.asString=function(e){return null==e?"":e.toString()},R.utils.clone=function(e){if(null==e)return e;for(var t=Object.create(null),r=Object.keys(e),i=0;i<r.length;i++){var n=r[i],s=e[n];if(Array.isArray(s))t[n]=s.slice();else{if("string"!=typeof s&&"number"!=typeof s&&"boolean"!=typeof s)throw new TypeError("clone is not deep and does not support nested objects");t[n]=s}}return t},R.FieldRef=function(e,t,r){this.docRef=e,this.fieldName=t,this._stringValue=r},R.FieldRef.joiner="/",R.FieldRef.fromString=function(e){var t=e.indexOf(R.FieldRef.joiner);if(-1===t)throw"malformed field ref string";var r=e.slice(0,t),i=e.slice(t+1);return new R.FieldRef(i,r,e)},R.FieldRef.prototype.toString=function(){return null==this._stringValue&&(this._stringValue=this.fieldName+R.FieldRef.joiner+this.docRef),this._stringValue},R.Set=function(e){if(this.elements=Object.create(null),e){this.length=e.length;for(var t=0;t<this.length;t++)this.elements[e[t]]=!0}else this.length=0},R.Set.complete={intersect:function(e){return e},union:function(){return this},contains:function(){return!0}},R.Set.empty={intersect:function(){return this},union:function(e){return e},contains:function(){return!1}},R.Set.prototype.contains=function(e){return!!this.elements[e]},R.Set.prototype.intersect=function(e){var t,r,i,n=[];if(e===R.Set.complete)return this;if(e===R.Set.empty)return e;this.length<e.length?(t=this,r=e):(t=e,r=this),i=Object.keys(t.elements);for(var s=0;s<i.length;s++){var o=i[s];o in r.elements&&n.push(o)}return new R.Set(n)},R.Set.prototype.union=function(e){return e===R.Set.complete?R.Set.complete:e===R.Set.empty?this:new R.Set(Object.keys(this.elements).concat(Object.keys(e.elements)))},R.idf=function(e,t){var r=0;for(var i in e)"_index"!=i&&(r+=Object.keys(e[i]).length);var n=(t-r+.5)/(r+.5);return Math.log(1+Math.abs(n))},R.Token=function(e,t){this.str=e||"",this.metadata=t||{}},R.Token.prototype.toString=function(){return this.str},R.Token.prototype.update=function(e){return this.str=e(this.str,this.metadata),this},R.Token.prototype.clone=function(e){return e=e||function(e){return e},new R.Token(e(this.str,this.metadata),this.metadata)},R.tokenizer=function(e,t){if(null==e||null==e)return[];if(Array.isArray(e))return e.map((function(e){return new R.Token(R.utils.asString(e).toLowerCase(),R.utils.clone(t))}));for(var r=e.toString().toLowerCase(),i=r.length,n=[],s=0,o=0;s<=i;s++){var a=s-o;if(r.charAt(s).match(R.tokenizer.separator)||s==i){if(a>0){var u=R.utils.clone(t)||{};u.position=[o,a],u.index=n.length,n.push(new R.Token(r.slice(o,s),u))}o=s+1}}return n},R.tokenizer.separator=/[\s\-]+/,R.Pipeline=function(){this._stack=[]},R.Pipeline.registeredFunctions=Object.create(null),R.Pipeline.registerFunction=function(e,t){t in this.registeredFunctions&&R.utils.warn("Overwriting existing registered function: "+t),e.label=t,R.Pipeline.registeredFunctions[e.label]=e},R.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||R.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},R.Pipeline.load=function(e){var t=new R.Pipeline;return e.forEach((function(e){var r=R.Pipeline.registeredFunctions[e];if(!r)throw new Error("Cannot load unregistered function: "+e);t.add(r)})),t},R.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach((function(e){R.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)}),this)},R.Pipeline.prototype.after=function(e,t){R.Pipeline.warnIfFunctionNotRegistered(t);var r=this._stack.indexOf(e);if(-1==r)throw new Error("Cannot find existingFn");r+=1,this._stack.splice(r,0,t)},R.Pipeline.prototype.before=function(e,t){R.Pipeline.warnIfFunctionNotRegistered(t);var r=this._stack.indexOf(e);if(-1==r)throw new Error("Cannot find existingFn");this._stack.splice(r,0,t)},R.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);-1!=t&&this._stack.splice(t,1)},R.Pipeline.prototype.run=function(e){for(var t=this._stack.length,r=0;r<t;r++){for(var i=this._stack[r],n=[],s=0;s<e.length;s++){var o=i(e[s],s,e);if(null!=o&&""!==o)if(Array.isArray(o))for(var a=0;a<o.length;a++)n.push(o[a]);else n.push(o)}e=n}return e},R.Pipeline.prototype.runString=function(e,t){var r=new R.Token(e,t);return this.run([r]).map((function(e){return e.toString()}))},R.Pipeline.prototype.reset=function(){this._stack=[]},R.Pipeline.prototype.toJSON=function(){return this._stack.map((function(e){return R.Pipeline.warnIfFunctionNotRegistered(e),e.label}))},R.Vector=function(e){this._magnitude=0,this.elements=e||[]},R.Vector.prototype.positionForIndex=function(e){if(0==this.elements.length)return 0;for(var t=0,r=this.elements.length/2,i=r-t,n=Math.floor(i/2),s=this.elements[2*n];i>1&&(s<e&&(t=n),s>e&&(r=n),s!=e);)i=r-t,n=t+Math.floor(i/2),s=this.elements[2*n];return s==e||s>e?2*n:s<e?2*(n+1):void 0},R.Vector.prototype.insert=function(e,t){this.upsert(e,t,(function(){throw"duplicate index"}))},R.Vector.prototype.upsert=function(e,t,r){this._magnitude=0;var i=this.positionForIndex(e);this.elements[i]==e?this.elements[i+1]=r(this.elements[i+1],t):this.elements.splice(i,0,e,t)},R.Vector.prototype.magnitude=function(){if(this._magnitude)return this._magnitude;for(var e=0,t=this.elements.length,r=1;r<t;r+=2){var i=this.elements[r];e+=i*i}return this._magnitude=Math.sqrt(e)},R.Vector.prototype.dot=function(e){for(var t=0,r=this.elements,i=e.elements,n=r.length,s=i.length,o=0,a=0,u=0,l=0;u<n&&l<s;)(o=r[u])<(a=i[l])?u+=2:o>a?l+=2:o==a&&(t+=r[u+1]*i[l+1],u+=2,l+=2);return t},R.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},R.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,r=0;t<this.elements.length;t+=2,r++)e[r]=this.elements[t];return e},R.Vector.prototype.toJSON=function(){return this.elements},R.stemmer=(o={ational:"ate",tional:"tion",enci:"ence",anci:"ance",izer:"ize",bli:"ble",alli:"al",entli:"ent",eli:"e",ousli:"ous",ization:"ize",ation:"ate",ator:"ate",alism:"al",iveness:"ive",fulness:"ful",ousness:"ous",aliti:"al",iviti:"ive",biliti:"ble",logi:"log"},a={icate:"ic",ative:"",alize:"al",iciti:"ic",ical:"ic",ful:"",ness:""},u="[aeiouy]",l="[^aeiou][^aeiouy]*",c=new RegExp("^([^aeiou][^aeiouy]*)?[aeiouy][aeiou]*[^aeiou][^aeiouy]*"),h=new RegExp("^([^aeiou][^aeiouy]*)?[aeiouy][aeiou]*[^aeiou][^aeiouy]*[aeiouy][aeiou]*[^aeiou][^aeiouy]*"),d=new RegExp("^([^aeiou][^aeiouy]*)?[aeiouy][aeiou]*[^aeiou][^aeiouy]*([aeiouy][aeiou]*)?$"),f=new RegExp("^([^aeiou][^aeiouy]*)?[aeiouy]"),p=/^(.+?)(ss|i)es$/,y=/^(.+?)([^s])s$/,m=/^(.+?)eed$/,g=/^(.+?)(ed|ing)$/,x=/.$/,v=/(at|bl|iz)$/,w=new RegExp("([^aeiouylsz])\\1$"),Q=new RegExp("^"+l+u+"[^aeiouwxy]$"),k=/^(.+?[^aeiou])y$/,S=/^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/,b=/^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/,E=/^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/,L=/^(.+?)(s|t)(ion)$/,P=/^(.+?)e$/,T=/ll$/,O=new RegExp("^"+l+u+"[^aeiouwxy]$"),I=function(e){var t,r,i,n,s,u,l;if(e.length<3)return e;if("y"==(i=e.substr(0,1))&&(e=i.toUpperCase()+e.substr(1)),s=y,(n=p).test(e)?e=e.replace(n,"$1$2"):s.test(e)&&(e=e.replace(s,"$1$2")),s=g,(n=m).test(e)){var I=n.exec(e);(n=c).test(I[1])&&(n=x,e=e.replace(n,""))}else s.test(e)&&(t=(I=s.exec(e))[1],(s=f).test(t)&&(u=w,l=Q,(s=v).test(e=t)?e+="e":u.test(e)?(n=x,e=e.replace(n,"")):l.test(e)&&(e+="e")));return(n=k).test(e)&&(e=(t=(I=n.exec(e))[1])+"i"),(n=S).test(e)&&(t=(I=n.exec(e))[1],r=I[2],(n=c).test(t)&&(e=t+o[r])),(n=b).test(e)&&(t=(I=n.exec(e))[1],r=I[2],(n=c).test(t)&&(e=t+a[r])),s=L,(n=E).test(e)?(t=(I=n.exec(e))[1],(n=h).test(t)&&(e=t)):s.test(e)&&(t=(I=s.exec(e))[1]+I[2],(s=h).test(t)&&(e=t)),(n=P).test(e)&&(t=(I=n.exec(e))[1],s=d,u=O,((n=h).test(t)||s.test(t)&&!u.test(t))&&(e=t)),s=h,(n=T).test(e)&&s.test(e)&&(n=x,e=e.replace(n,"")),"y"==i&&(e=i.toLowerCase()+e.substr(1)),e},function(e){return e.update(I)}),R.Pipeline.registerFunction(R.stemmer,"stemmer"),R.generateStopWordFilter=function(e){var t=e.reduce((function(e,t){return e[t]=t,e}),{});return function(e){if(e&&t[e.toString()]!==e.toString())return e}},R.stopWordFilter=R.generateStopWordFilter(["a","able","about","across","after","all","almost","also","am","among","an","and","any","are","as","at","be","because","been","but","by","can","cannot","could","dear","did","do","does","either","else","ever","every","for","from","get","got","had","has","have","he","her","hers","him","his","how","however","i","if","in","into","is","it","its","just","least","let","like","likely","may","me","might","most","must","my","neither","no","nor","not","of","off","often","on","only","or","other","our","own","rather","said","say","says","she","should","since","so","some","than","that","the","their","them","then","there","these","they","this","tis","to","too","twas","us","wants","was","we","were","what","when","where","which","while","who","whom","why","will","with","would","yet","you","your"]),R.Pipeline.registerFunction(R.stopWordFilter,"stopWordFilter"),R.trimmer=function(e){return e.update((function(e){return e.replace(/^\W+/,"").replace(/\W+$/,"")}))},R.Pipeline.registerFunction(R.trimmer,"trimmer"),R.TokenSet=function(){this.final=!1,this.edges={},this.id=R.TokenSet._nextId,R.TokenSet._nextId+=1},R.TokenSet._nextId=1,R.TokenSet.fromArray=function(e){for(var t=new R.TokenSet.Builder,r=0,i=e.length;r<i;r++)t.insert(e[r]);return t.finish(),t.root},R.TokenSet.fromClause=function(e){return"editDistance"in e?R.TokenSet.fromFuzzyString(e.term,e.editDistance):R.TokenSet.fromString(e.term)},R.TokenSet.fromFuzzyString=function(e,t){for(var r=new R.TokenSet,i=[{node:r,editsRemaining:t,str:e}];i.length;){var n=i.pop();if(n.str.length>0){var s,o=n.str.charAt(0);o in n.node.edges?s=n.node.edges[o]:(s=new R.TokenSet,n.node.edges[o]=s),1==n.str.length&&(s.final=!0),i.push({node:s,editsRemaining:n.editsRemaining,str:n.str.slice(1)})}if(0!=n.editsRemaining){if("*"in n.node.edges)var a=n.node.edges["*"];else a=new R.TokenSet,n.node.edges["*"]=a;if(0==n.str.length&&(a.final=!0),i.push({node:a,editsRemaining:n.editsRemaining-1,str:n.str}),n.str.length>1&&i.push({node:n.node,editsRemaining:n.editsRemaining-1,str:n.str.slice(1)}),1==n.str.length&&(n.node.final=!0),n.str.length>=1){if("*"in n.node.edges)var u=n.node.edges["*"];else u=new R.TokenSet,n.node.edges["*"]=u;1==n.str.length&&(u.final=!0),i.push({node:u,editsRemaining:n.editsRemaining-1,str:n.str.slice(1)})}if(n.str.length>1){var l,c=n.str.charAt(0),h=n.str.charAt(1);h in n.node.edges?l=n.node.edges[h]:(l=new R.TokenSet,n.node.edges[h]=l),1==n.str.length&&(l.final=!0),i.push({node:l,editsRemaining:n.editsRemaining-1,str:c+n.str.slice(2)})}}}return r},R.TokenSet.fromString=function(e){for(var t=new R.TokenSet,r=t,i=0,n=e.length;i<n;i++){var s=e[i],o=i==n-1;if("*"==s)t.edges[s]=t,t.final=o;else{var a=new R.TokenSet;a.final=o,t.edges[s]=a,t=a}}return r},R.TokenSet.prototype.toArray=function(){for(var e=[],t=[{prefix:"",node:this}];t.length;){var r=t.pop(),i=Object.keys(r.node.edges),n=i.length;r.node.final&&(r.prefix.charAt(0),e.push(r.prefix));for(var s=0;s<n;s++){var o=i[s];t.push({prefix:r.prefix.concat(o),node:r.node.edges[o]})}}return e},R.TokenSet.prototype.toString=function(){if(this._str)return this._str;for(var e=this.final?"1":"0",t=Object.keys(this.edges).sort(),r=t.length,i=0;i<r;i++){var n=t[i];e=e+n+this.edges[n].id}return e},R.TokenSet.prototype.intersect=function(e){for(var t=new R.TokenSet,r=void 0,i=[{qNode:e,output:t,node:this}];i.length;){r=i.pop();for(var n=Object.keys(r.qNode.edges),s=n.length,o=Object.keys(r.node.edges),a=o.length,u=0;u<s;u++)for(var l=n[u],c=0;c<a;c++){var h=o[c];if(h==l||"*"==l){var d=r.node.edges[h],f=r.qNode.edges[l],p=d.final&&f.final,y=void 0;h in r.output.edges?(y=r.output.edges[h]).final=y.final||p:((y=new R.TokenSet).final=p,r.output.edges[h]=y),i.push({qNode:f,output:y,node:d})}}}return t},R.TokenSet.Builder=function(){this.previousWord="",this.root=new R.TokenSet,this.uncheckedNodes=[],this.minimizedNodes={}},R.TokenSet.Builder.prototype.insert=function(e){var t,r=0;if(e<this.previousWord)throw new Error("Out of order word insertion");for(var i=0;i<e.length&&i<this.previousWord.length&&e[i]==this.previousWord[i];i++)r++;for(this.minimize(r),t=0==this.uncheckedNodes.length?this.root:this.uncheckedNodes[this.uncheckedNodes.length-1].child,i=r;i<e.length;i++){var n=new R.TokenSet,s=e[i];t.edges[s]=n,this.uncheckedNodes.push({parent:t,char:s,child:n}),t=n}t.final=!0,this.previousWord=e},R.TokenSet.Builder.prototype.finish=function(){this.minimize(0)},R.TokenSet.Builder.prototype.minimize=function(e){for(var t=this.uncheckedNodes.length-1;t>=e;t--){var r=this.uncheckedNodes[t],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r.char]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}},R.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},R.Index.prototype.search=function(e){return this.query((function(t){new R.QueryParser(e,t).parse()}))},R.Index.prototype.query=function(e){for(var t=new R.Query(this.fields),r=Object.create(null),i=Object.create(null),n=Object.create(null),s=Object.create(null),o=Object.create(null),a=0;a<this.fields.length;a++)i[this.fields[a]]=new R.Vector;for(e.call(t,t),a=0;a<t.clauses.length;a++){var u,l=t.clauses[a],c=R.Set.empty;u=l.usePipeline?this.pipeline.runString(l.term,{fields:l.fields}):[l.term];for(var h=0;h<u.length;h++){var d=u[h];l.term=d;var f=R.TokenSet.fromClause(l),p=this.tokenSet.intersect(f).toArray();if(0===p.length&&l.presence===R.Query.presence.REQUIRED){for(var y=0;y<l.fields.length;y++)s[F=l.fields[y]]=R.Set.empty;break}for(var m=0;m<p.length;m++){var g=p[m],x=this.invertedIndex[g],v=x._index;for(y=0;y<l.fields.length;y++){var w=x[F=l.fields[y]],Q=Object.keys(w),k=g+"/"+F,S=new R.Set(Q);if(l.presence==R.Query.presence.REQUIRED&&(c=c.union(S),void 0===s[F]&&(s[F]=R.Set.complete)),l.presence!=R.Query.presence.PROHIBITED){if(i[F].upsert(v,l.boost,(function(e,t){return e+t})),!n[k]){for(var b=0;b<Q.length;b++){var E,L=Q[b],P=new R.FieldRef(L,F),T=w[L];void 0===(E=r[P])?r[P]=new R.MatchData(g,F,T):E.add(g,F,T)}n[k]=!0}}else void 0===o[F]&&(o[F]=R.Set.empty),o[F]=o[F].union(S)}}}if(l.presence===R.Query.presence.REQUIRED)for(y=0;y<l.fields.length;y++)s[F=l.fields[y]]=s[F].intersect(c)}var O=R.Set.complete,I=R.Set.empty;for(a=0;a<this.fields.length;a++){var F;s[F=this.fields[a]]&&(O=O.intersect(s[F])),o[F]&&(I=I.union(o[F]))}var _=Object.keys(r),N=[],j=Object.create(null);if(t.isNegated())for(_=Object.keys(this.fieldVectors),a=0;a<_.length;a++){P=_[a];var C=R.FieldRef.fromString(P);r[P]=new R.MatchData}for(a=0;a<_.length;a++){var D=(C=R.FieldRef.fromString(_[a])).docRef;if(O.contains(D)&&!I.contains(D)){var A,B=this.fieldVectors[C],z=i[C.fieldName].similarity(B);if(void 0!==(A=j[D]))A.score+=z,A.matchData.combine(r[C]);else{var V={ref:D,score:z,matchData:r[C]};j[D]=V,N.push(V)}}}return N.sort((function(e,t){return t.score-e.score}))},R.Index.prototype.toJSON=function(){var e=Object.keys(this.invertedIndex).sort().map((function(e){return[e,this.invertedIndex[e]]}),this),t=Object.keys(this.fieldVectors).map((function(e){return[e,this.fieldVectors[e].toJSON()]}),this);return{version:R.version,fields:this.fields,fieldVectors:t,invertedIndex:e,pipeline:this.pipeline.toJSON()}},R.Index.load=function(e){var t={},r={},i=e.fieldVectors,n=Object.create(null),s=e.invertedIndex,o=new R.TokenSet.Builder,a=R.Pipeline.load(e.pipeline);e.version!=R.version&&R.utils.warn("Version mismatch when loading serialised index. Current version of lunr '"+R.version+"' does not match serialized index '"+e.version+"'");for(var u=0;u<i.length;u++){var l=(h=i[u])[0],c=h[1];r[l]=new R.Vector(c)}for(u=0;u<s.length;u++){var h,d=(h=s[u])[0],f=h[1];o.insert(d),n[d]=f}return o.finish(),t.fields=e.fields,t.fieldVectors=r,t.invertedIndex=n,t.tokenSet=o.root,t.pipeline=a,new R.Index(t)},R.Builder=function(){this._ref="id",this._fields=Object.create(null),this._documents=Object.create(null),this.invertedIndex=Object.create(null),this.fieldTermFrequencies={},this.fieldLengths={},this.tokenizer=R.tokenizer,this.pipeline=new R.Pipeline,this.searchPipeline=new R.Pipeline,this.documentCount=0,this._b=.75,this._k1=1.2,this.termIndex=0,this.metadataWhitelist=[]},R.Builder.prototype.ref=function(e){this._ref=e},R.Builder.prototype.field=function(e,t){if(/\//.test(e))throw new RangeError("Field '"+e+"' contains illegal character '/'");this._fields[e]=t||{}},R.Builder.prototype.b=function(e){this._b=e<0?0:e>1?1:e},R.Builder.prototype.k1=function(e){this._k1=e},R.Builder.prototype.add=function(e,t){var r=e[this._ref],i=Object.keys(this._fields);this._documents[r]=t||{},this.documentCount+=1;for(var n=0;n<i.length;n++){var s=i[n],o=this._fields[s].extractor,a=o?o(e):e[s],u=this.tokenizer(a,{fields:[s]}),l=this.pipeline.run(u),c=new R.FieldRef(r,s),h=Object.create(null);this.fieldTermFrequencies[c]=h,this.fieldLengths[c]=0,this.fieldLengths[c]+=l.length;for(var d=0;d<l.length;d++){var f=l[d];if(null==h[f]&&(h[f]=0),h[f]+=1,null==this.invertedIndex[f]){var p=Object.create(null);p._index=this.termIndex,this.termIndex+=1;for(var y=0;y<i.length;y++)p[i[y]]=Object.create(null);this.invertedIndex[f]=p}null==this.invertedIndex[f][s][r]&&(this.invertedIndex[f][s][r]=Object.create(null));for(var m=0;m<this.metadataWhitelist.length;m++){var g=this.metadataWhitelist[m],x=f.metadata[g];null==this.invertedIndex[f][s][r][g]&&(this.invertedIndex[f][s][r][g]=[]),this.invertedIndex[f][s][r][g].push(x)}}}},R.Builder.prototype.calculateAverageFieldLengths=function(){for(var e=Object.keys(this.fieldLengths),t=e.length,r={},i={},n=0;n<t;n++){var s=R.FieldRef.fromString(e[n]),o=s.fieldName;i[o]||(i[o]=0),i[o]+=1,r[o]||(r[o]=0),r[o]+=this.fieldLengths[s]}var a=Object.keys(this._fields);for(n=0;n<a.length;n++){var u=a[n];r[u]=r[u]/i[u]}this.averageFieldLength=r},R.Builder.prototype.createFieldVectors=function(){for(var e={},t=Object.keys(this.fieldTermFrequencies),r=t.length,i=Object.create(null),n=0;n<r;n++){for(var s=R.FieldRef.fromString(t[n]),o=s.fieldName,a=this.fieldLengths[s],u=new R.Vector,l=this.fieldTermFrequencies[s],c=Object.keys(l),h=c.length,d=this._fields[o].boost||1,f=this._documents[s.docRef].boost||1,p=0;p<h;p++){var y,m,g,x=c[p],v=l[x],w=this.invertedIndex[x]._index;void 0===i[x]?(y=R.idf(this.invertedIndex[x],this.documentCount),i[x]=y):y=i[x],m=y*((this._k1+1)*v)/(this._k1*(1-this._b+this._b*(a/this.averageFieldLength[o]))+v),m*=d,m*=f,g=Math.round(1e3*m)/1e3,u.insert(w,g)}e[s]=u}this.fieldVectors=e},R.Builder.prototype.createTokenSet=function(){this.tokenSet=R.TokenSet.fromArray(Object.keys(this.invertedIndex).sort())},R.Builder.prototype.build=function(){return this.calculateAverageFieldLengths(),this.createFieldVectors(),this.createTokenSet(),new R.Index({invertedIndex:this.invertedIndex,fieldVectors:this.fieldVectors,tokenSet:this.tokenSet,fields:Object.keys(this._fields),pipeline:this.searchPipeline})},R.Builder.prototype.use=function(e){var t=Array.prototype.slice.call(arguments,1);t.unshift(this),e.apply(this,t)},R.MatchData=function(e,t,r){for(var i=Object.create(null),n=Object.keys(r||{}),s=0;s<n.length;s++){var o=n[s];i[o]=r[o].slice()}this.metadata=Object.create(null),void 0!==e&&(this.metadata[e]=Object.create(null),this.metadata[e][t]=i)},R.MatchData.prototype.combine=function(e){for(var t=Object.keys(e.metadata),r=0;r<t.length;r++){var i=t[r],n=Object.keys(e.metadata[i]);null==this.metadata[i]&&(this.metadata[i]=Object.create(null));for(var s=0;s<n.length;s++){var o=n[s],a=Object.keys(e.metadata[i][o]);null==this.metadata[i][o]&&(this.metadata[i][o]=Object.create(null));for(var u=0;u<a.length;u++){var l=a[u];null==this.metadata[i][o][l]?this.metadata[i][o][l]=e.metadata[i][o][l]:this.metadata[i][o][l]=this.metadata[i][o][l].concat(e.metadata[i][o][l])}}}},R.MatchData.prototype.add=function(e,t,r){if(!(e in this.metadata))return this.metadata[e]=Object.create(null),void(this.metadata[e][t]=r);if(t in this.metadata[e])for(var i=Object.keys(r),n=0;n<i.length;n++){var s=i[n];s in this.metadata[e][t]?this.metadata[e][t][s]=this.metadata[e][t][s].concat(r[s]):this.metadata[e][t][s]=r[s]}else this.metadata[e][t]=r},R.Query=function(e){this.clauses=[],this.allFields=e},R.Query.wildcard=new String("*"),R.Query.wildcard.NONE=0,R.Query.wildcard.LEADING=1,R.Query.wildcard.TRAILING=2,R.Query.presence={OPTIONAL:1,REQUIRED:2,PROHIBITED:3},R.Query.prototype.clause=function(e){return"fields"in e||(e.fields=this.allFields),"boost"in e||(e.boost=1),"usePipeline"in e||(e.usePipeline=!0),"wildcard"in e||(e.wildcard=R.Query.wildcard.NONE),e.wildcard&R.Query.wildcard.LEADING&&e.term.charAt(0)!=R.Query.wildcard&&(e.term="*"+e.term),e.wildcard&R.Query.wildcard.TRAILING&&e.term.slice(-1)!=R.Query.wildcard&&(e.term=e.term+"*"),"presence"in e||(e.presence=R.Query.presence.OPTIONAL),this.clauses.push(e),this},R.Query.prototype.isNegated=function(){for(var e=0;e<this.clauses.length;e++)if(this.clauses[e].presence!=R.Query.presence.PROHIBITED)return!1;return!0},R.Query.prototype.term=function(e,t){if(Array.isArray(e))return e.forEach((function(e){this.term(e,R.utils.clone(t))}),this),this;var r=t||{};return r.term=e.toString(),this.clause(r),this},R.QueryParseError=function(e,t,r){this.name="QueryParseError",this.message=e,this.start=t,this.end=r},R.QueryParseError.prototype=new Error,R.QueryLexer=function(e){this.lexemes=[],this.str=e,this.length=e.length,this.pos=0,this.start=0,this.escapeCharPositions=[]},R.QueryLexer.prototype.run=function(){for(var e=R.QueryLexer.lexText;e;)e=e(this)},R.QueryLexer.prototype.sliceString=function(){for(var e=[],t=this.start,r=this.pos,i=0;i<this.escapeCharPositions.length;i++)r=this.escapeCharPositions[i],e.push(this.str.slice(t,r)),t=r+1;return e.push(this.str.slice(t,this.pos)),this.escapeCharPositions.length=0,e.join("")},R.QueryLexer.prototype.emit=function(e){this.lexemes.push({type:e,str:this.sliceString(),start:this.start,end:this.pos}),this.start=this.pos},R.QueryLexer.prototype.escapeCharacter=function(){this.escapeCharPositions.push(this.pos-1),this.pos+=1},R.QueryLexer.prototype.next=function(){if(this.pos>=this.length)return R.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},R.QueryLexer.prototype.width=function(){return this.pos-this.start},R.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},R.QueryLexer.prototype.backup=function(){this.pos-=1},R.QueryLexer.prototype.acceptDigitRun=function(){var e,t;do{t=(e=this.next()).charCodeAt(0)}while(t>47&&t<58);e!=R.QueryLexer.EOS&&this.backup()},R.QueryLexer.prototype.more=function(){return this.pos<this.length},R.QueryLexer.EOS="EOS",R.QueryLexer.FIELD="FIELD",R.QueryLexer.TERM="TERM",R.QueryLexer.EDIT_DISTANCE="EDIT_DISTANCE",R.QueryLexer.BOOST="BOOST",R.QueryLexer.PRESENCE="PRESENCE",R.QueryLexer.lexField=function(e){return e.backup(),e.emit(R.QueryLexer.FIELD),e.ignore(),R.QueryLexer.lexText},R.QueryLexer.lexTerm=function(e){if(e.width()>1&&(e.backup(),e.emit(R.QueryLexer.TERM)),e.ignore(),e.more())return R.QueryLexer.lexText},R.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(R.QueryLexer.EDIT_DISTANCE),R.QueryLexer.lexText},R.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(R.QueryLexer.BOOST),R.QueryLexer.lexText},R.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(R.QueryLexer.TERM)},R.QueryLexer.termSeparator=R.tokenizer.separator,R.QueryLexer.lexText=function(e){for(;;){var t=e.next();if(t==R.QueryLexer.EOS)return R.QueryLexer.lexEOS;if(92!=t.charCodeAt(0)){if(":"==t)return R.QueryLexer.lexField;if("~"==t)return e.backup(),e.width()>0&&e.emit(R.QueryLexer.TERM),R.QueryLexer.lexEditDistance;if("^"==t)return e.backup(),e.width()>0&&e.emit(R.QueryLexer.TERM),R.QueryLexer.lexBoost;if("+"==t&&1===e.width())return e.emit(R.QueryLexer.PRESENCE),R.QueryLexer.lexText;if("-"==t&&1===e.width())return e.emit(R.QueryLexer.PRESENCE),R.QueryLexer.lexText;if(t.match(R.QueryLexer.termSeparator))return R.QueryLexer.lexTerm}else e.escapeCharacter()}},R.QueryParser=function(e,t){this.lexer=new R.QueryLexer(e),this.query=t,this.currentClause={},this.lexemeIdx=0},R.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=R.QueryParser.parseClause;e;)e=e(this);return this.query},R.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},R.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},R.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},R.QueryParser.parseClause=function(e){var t=e.peekLexeme();if(null!=t)switch(t.type){case R.QueryLexer.PRESENCE:return R.QueryParser.parsePresence;case R.QueryLexer.FIELD:return R.QueryParser.parseField;case R.QueryLexer.TERM:return R.QueryParser.parseTerm;default:var r="expected either a field or a term, found "+t.type;throw t.str.length>=1&&(r+=" with value '"+t.str+"'"),new R.QueryParseError(r,t.start,t.end)}},R.QueryParser.parsePresence=function(e){var t=e.consumeLexeme();if(null!=t){switch(t.str){case"-":e.currentClause.presence=R.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=R.Query.presence.REQUIRED;break;default:var r="unrecognised presence operator'"+t.str+"'";throw new R.QueryParseError(r,t.start,t.end)}var i=e.peekLexeme();if(null==i)throw r="expecting term or field, found nothing",new R.QueryParseError(r,t.start,t.end);switch(i.type){case R.QueryLexer.FIELD:return R.QueryParser.parseField;case R.QueryLexer.TERM:return R.QueryParser.parseTerm;default:throw r="expecting term or field, found '"+i.type+"'",new R.QueryParseError(r,i.start,i.end)}}},R.QueryParser.parseField=function(e){var t=e.consumeLexeme();if(null!=t){if(-1==e.query.allFields.indexOf(t.str)){var r=e.query.allFields.map((function(e){return"'"+e+"'"})).join(", "),i="unrecognised field '"+t.str+"', possible fields: "+r;throw new R.QueryParseError(i,t.start,t.end)}e.currentClause.fields=[t.str];var n=e.peekLexeme();if(null==n)throw i="expecting term, found nothing",new R.QueryParseError(i,t.start,t.end);if(n.type===R.QueryLexer.TERM)return R.QueryParser.parseTerm;throw i="expecting term, found '"+n.type+"'",new R.QueryParseError(i,n.start,n.end)}},R.QueryParser.parseTerm=function(e){var t=e.consumeLexeme();if(null!=t){e.currentClause.term=t.str.toLowerCase(),-1!=t.str.indexOf("*")&&(e.currentClause.usePipeline=!1);var r=e.peekLexeme();if(null!=r)switch(r.type){case R.QueryLexer.TERM:return e.nextClause(),R.QueryParser.parseTerm;case R.QueryLexer.FIELD:return e.nextClause(),R.QueryParser.parseField;case R.QueryLexer.EDIT_DISTANCE:return R.QueryParser.parseEditDistance;case R.QueryLexer.BOOST:return R.QueryParser.parseBoost;case R.QueryLexer.PRESENCE:return e.nextClause(),R.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new R.QueryParseError(i,r.start,r.end)}else e.nextClause()}},R.QueryParser.parseEditDistance=function(e){var t=e.consumeLexeme();if(null!=t){var r=parseInt(t.str,10);if(isNaN(r)){var i="edit distance must be numeric";throw new R.QueryParseError(i,t.start,t.end)}e.currentClause.editDistance=r;var n=e.peekLexeme();if(null!=n)switch(n.type){case R.QueryLexer.TERM:return e.nextClause(),R.QueryParser.parseTerm;case R.QueryLexer.FIELD:return e.nextClause(),R.QueryParser.parseField;case R.QueryLexer.EDIT_DISTANCE:return R.QueryParser.parseEditDistance;case R.QueryLexer.BOOST:return R.QueryParser.parseBoost;case R.QueryLexer.PRESENCE:return e.nextClause(),R.QueryParser.parsePresence;default:throw i="Unexpected lexeme type '"+n.type+"'",new R.QueryParseError(i,n.start,n.end)}else e.nextClause()}},R.QueryParser.parseBoost=function(e){var t=e.consumeLexeme();if(null!=t){var r=parseInt(t.str,10);if(isNaN(r)){var i="boost must be numeric";throw new R.QueryParseError(i,t.start,t.end)}e.currentClause.boost=r;var n=e.peekLexeme();if(null!=n)switch(n.type){case R.QueryLexer.TERM:return e.nextClause(),R.QueryParser.parseTerm;case R.QueryLexer.FIELD:return e.nextClause(),R.QueryParser.parseField;case R.QueryLexer.EDIT_DISTANCE:return R.QueryParser.parseEditDistance;case R.QueryLexer.BOOST:return R.QueryParser.parseBoost;case R.QueryLexer.PRESENCE:return e.nextClause(),R.QueryParser.parsePresence;default:throw i="Unexpected lexeme type '"+n.type+"'",new R.QueryParseError(i,n.start,n.end)}else e.nextClause()}},void 0===(n="function"==typeof(i=function(){return R})?i.call(t,r,t,e):i)||(e.exports=n)}()}},t={};function r(i){var n=t[i];if(void 0!==n)return n.exports;var s=t[i]={exports:{}};return e[i](s,s.exports,r),s.exports}r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var i in t)r.o(t,i)&&!r.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var i={};(()=>{"use strict";r.r(i),r.d(i,{default:()=>s});var e=r(1336),t=r.n(e),n=function(){return n=Object.assign||function(e){for(var t,r=1,i=arguments.length;r<i;r++)for(var n in t=arguments[r])Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e},n.apply(this,arguments)};const s={init:function(e){e(t())},createIndex:function(e){return t()((function(){var r=this;this.ref("id"),this.field("text"),t().multiLanguage&&t().languages&&this.use(t().multiLanguage.apply(t(),t().languages)),this.metadataWhitelist=["position"],this.pipeline.remove(t().stemmer),this.searchPipeline.remove(t().stemmer),e.forEach((function(e){r.add(n({id:e[0]},e[1]))}))}))},loadIndex:function(e){return t().multiLanguage&&t().languages&&t().multiLanguage.apply(t(),t().languages),t().Index.load(e)},query:function(e,r){return e.query((function(e){e.term(t().tokenizer(r),{boost:100,usePipeline:!0}),e.term(t().tokenizer(r),{boost:10,usePipeline:!1,wildcard:t().Query.wildcard.LEADING|t().Query.wildcard.TRAILING}),e.term(t().tokenizer(r),{boost:1,editDistance:1})}))}}})(),window.__DOCS_LUNR__=i})();
\ No newline at end of file
diff --git a/resources/js/retype.js b/resources/js/retype.js
new file mode 100644
index 0000000..bc991da
--- /dev/null
+++ b/resources/js/retype.js
@@ -0,0 +1,27 @@
+/*! Retype v2.3.0 | retype.com | Copyright 2022. Object.NET, Inc. All rights reserved. */
+
+/*! For license information please see retype.js.LICENSE.txt */
+(()=>{var e={6184:(e,t,n)=>{"use strict";n.d(t,{ry:()=>he,nP:()=>fe,BL:()=>pe,Vn:()=>me}),function(){if(void 0===window.Reflect||void 0===window.customElements||window.customElements.polyfillWrapFlushCallback)return;const e=HTMLElement;window.HTMLElement=function(){return Reflect.construct(e,[],this.constructor)},HTMLElement.prototype=e.prototype,HTMLElement.prototype.constructor=HTMLElement,Object.setPrototypeOf(HTMLElement,e)}(),function(e){function t(e,t,n){throw new e("Failed to execute 'requestSubmit' on 'HTMLFormElement': "+t+".",n)}"function"!=typeof e.requestSubmit&&(e.requestSubmit=function(e){e?(function(e,n){e instanceof HTMLElement||t(TypeError,"parameter 1 is not of type 'HTMLElement'"),"submit"==e.type||t(TypeError,"The specified element is not a submit button"),e.form==n||t(DOMException,"The specified element is not owned by this form element","NotFoundError")}(e,this),e.click()):((e=document.createElement("input")).type="submit",e.hidden=!0,this.appendChild(e),e.click(),this.removeChild(e))})}(HTMLFormElement.prototype);const r=new WeakMap;function o(e){const t=function(e){const t=e instanceof Element?e:e instanceof Node?e.parentElement:null,n=t?t.closest("input, button"):null;return"submit"==(null==n?void 0:n.type)?n:null}(e.target);t&&t.form&&r.set(t.form,t)}var i,s,a,l,c,u;!function(){if("submitter"in Event.prototype)return;let e;if("SubmitEvent"in window&&/Apple Computer/.test(navigator.vendor))e=window.SubmitEvent.prototype;else{if("SubmitEvent"in window)return;e=window.Event.prototype}addEventListener("click",o,!0),Object.defineProperty(e,"submitter",{get(){if("submit"==this.type&&this.target instanceof HTMLFormElement)return r.get(this.target)}})}(),function(e){e.eager="eager",e.lazy="lazy"}(i||(i={}));class d extends HTMLElement{constructor(){super(),this.loaded=Promise.resolve(),this.delegate=new d.delegateConstructor(this)}static get observedAttributes(){return["disabled","loading","src"]}connectedCallback(){this.delegate.connect()}disconnectedCallback(){this.delegate.disconnect()}reload(){const{src:e}=this;this.src=null,this.src=e}attributeChangedCallback(e){"loading"==e?this.delegate.loadingStyleChanged():"src"==e?this.delegate.sourceURLChanged():this.delegate.disabledChanged()}get src(){return this.getAttribute("src")}set src(e){e?this.setAttribute("src",e):this.removeAttribute("src")}get loading(){return"lazy"===(this.getAttribute("loading")||"").toLowerCase()?i.lazy:i.eager}set loading(e){e?this.setAttribute("loading",e):this.removeAttribute("loading")}get disabled(){return this.hasAttribute("disabled")}set disabled(e){e?this.setAttribute("disabled",""):this.removeAttribute("disabled")}get autoscroll(){return this.hasAttribute("autoscroll")}set autoscroll(e){e?this.setAttribute("autoscroll",""):this.removeAttribute("autoscroll")}get complete(){return!this.delegate.isLoading}get isActive(){return this.ownerDocument===document&&!this.isPreview}get isPreview(){var e,t;return null===(t=null===(e=this.ownerDocument)||void 0===e?void 0:e.documentElement)||void 0===t?void 0:t.hasAttribute("data-turbo-preview")}}function f(e){return new URL(e.toString(),document.baseURI)}function h(e){let t;return e.hash?e.hash.slice(1):(t=e.href.match(/#(.*)$/))?t[1]:void 0}function p(e,t){return f((null==t?void 0:t.getAttribute("formaction"))||e.getAttribute("action")||e.action)}function m(e,t){return function(e,t){const n=function(e){return(t=e.origin+e.pathname).endsWith("/")?t:t+"/";var t}(t);return e.href===f(n).href||e.href.startsWith(n)}(e,t)&&!!(n=e,(function(e){return function(e){return e.pathname.split("/").slice(1)}(e).slice(-1)[0]}(n).match(/\.[^.]*$/)||[])[0]||"").match(/^(?:|\.(?:htm|html|xhtml))$/);var n}function v(e){const t=h(e);return null!=t?e.href.slice(0,-(t.length+1)):e.href}function g(e){return v(e)}class b{constructor(e){this.response=e}get succeeded(){return this.response.ok}get failed(){return!this.succeeded}get clientError(){return this.statusCode>=400&&this.statusCode<=499}get serverError(){return this.statusCode>=500&&this.statusCode<=599}get redirected(){return this.response.redirected}get location(){return f(this.response.url)}get isHTML(){return this.contentType&&this.contentType.match(/^(?:text\/([^\s;,]+\b)?html|application\/xhtml\+xml)\b/)}get statusCode(){return this.response.status}get contentType(){return this.header("Content-Type")}get responseText(){return this.response.clone().text()}get responseHTML(){return this.isHTML?this.response.clone().text():Promise.resolve(void 0)}header(e){return this.response.headers.get(e)}}function y(e,{target:t,cancelable:n,detail:r}={}){const o=new CustomEvent(e,{cancelable:n,bubbles:!0,detail:r});return t&&t.isConnected?t.dispatchEvent(o):document.documentElement.dispatchEvent(o),o}function w(){return new Promise((e=>requestAnimationFrame((()=>e()))))}function x(e=""){return(new DOMParser).parseFromString(e,"text/html")}function k(e,...t){const n=function(e,t){return e.reduce(((e,n,r)=>e+n+(null==t[r]?"":t[r])),"")}(e,t).replace(/^\n/,"").split("\n"),r=n[0].match(/^\s+/),o=r?r[0].length:0;return n.map((e=>e.slice(o))).join("\n")}function S(){return Array.apply(null,{length:36}).map(((e,t)=>8==t||13==t||18==t||23==t?"-":14==t?"4":19==t?(Math.floor(4*Math.random())+8).toString(16):Math.floor(15*Math.random()).toString(16))).join("")}function E(e,...t){for(const n of t.map((t=>null==t?void 0:t.getAttribute(e))))if("string"==typeof n)return n;return null}function C(...e){for(const t of e)"turbo-frame"==t.localName&&t.setAttribute("busy",""),t.setAttribute("aria-busy","true")}function _(...e){for(const t of e)"turbo-frame"==t.localName&&t.removeAttribute("busy"),t.removeAttribute("aria-busy")}!function(e){e[e.get=0]="get",e[e.post=1]="post",e[e.put=2]="put",e[e.patch=3]="patch",e[e.delete=4]="delete"}(s||(s={}));class T{constructor(e,t,n,r=new URLSearchParams,o=null){this.abortController=new AbortController,this.resolveRequestPromise=e=>{},this.delegate=e,this.method=t,this.headers=this.defaultHeaders,this.body=r,this.url=n,this.target=o}get location(){return this.url}get params(){return this.url.searchParams}get entries(){return this.body?Array.from(this.body.entries()):[]}cancel(){this.abortController.abort()}async perform(){var e,t;const{fetchOptions:n}=this;null===(t=(e=this.delegate).prepareHeadersForRequest)||void 0===t||t.call(e,this.headers,this),await this.allowRequestToBeIntercepted(n);try{this.delegate.requestStarted(this);const e=await fetch(this.url.href,n);return await this.receive(e)}catch(e){if("AbortError"!==e.name)throw this.delegate.requestErrored(this,e),e}finally{this.delegate.requestFinished(this)}}async receive(e){const t=new b(e);return y("turbo:before-fetch-response",{cancelable:!0,detail:{fetchResponse:t},target:this.target}).defaultPrevented?this.delegate.requestPreventedHandlingResponse(this,t):t.succeeded?this.delegate.requestSucceededWithResponse(this,t):this.delegate.requestFailedWithResponse(this,t),t}get fetchOptions(){var e;return{method:s[this.method].toUpperCase(),credentials:"same-origin",headers:this.headers,redirect:"follow",body:this.isIdempotent?null:this.body,signal:this.abortSignal,referrer:null===(e=this.delegate.referrer)||void 0===e?void 0:e.href}}get defaultHeaders(){return{Accept:"text/html, application/xhtml+xml"}}get isIdempotent(){return this.method==s.get}get abortSignal(){return this.abortController.signal}async allowRequestToBeIntercepted(e){const t=new Promise((e=>this.resolveRequestPromise=e));y("turbo:before-fetch-request",{cancelable:!0,detail:{fetchOptions:e,url:this.url,resume:this.resolveRequestPromise},target:this.target}).defaultPrevented&&await t}}class O{constructor(e,t){this.started=!1,this.intersect=e=>{const t=e.slice(-1)[0];(null==t?void 0:t.isIntersecting)&&this.delegate.elementAppearedInViewport(this.element)},this.delegate=e,this.element=t,this.intersectionObserver=new IntersectionObserver(this.intersect)}start(){this.started||(this.started=!0,this.intersectionObserver.observe(this.element))}stop(){this.started&&(this.started=!1,this.intersectionObserver.unobserve(this.element))}}class L{constructor(e){this.templateElement=document.createElement("template"),this.templateElement.innerHTML=e}static wrap(e){return"string"==typeof e?new this(e):e}get fragment(){const e=document.createDocumentFragment();for(const t of this.foreignElements)e.appendChild(document.importNode(t,!0));return e}get foreignElements(){return this.templateChildren.reduce(((e,t)=>"turbo-stream"==t.tagName.toLowerCase()?[...e,t]:e),[])}get templateChildren(){return Array.from(this.templateElement.content.children)}}L.contentType="text/vnd.turbo-stream.html",function(e){e[e.initialized=0]="initialized",e[e.requesting=1]="requesting",e[e.waiting=2]="waiting",e[e.receiving=3]="receiving",e[e.stopping=4]="stopping",e[e.stopped=5]="stopped"}(a||(a={})),function(e){e.urlEncoded="application/x-www-form-urlencoded",e.multipart="multipart/form-data",e.plain="text/plain"}(l||(l={}));class R{constructor(e,t,n,r=!1){this.state=a.initialized,this.delegate=e,this.formElement=t,this.submitter=n,this.formData=function(e,t){const n=new FormData(e),r=null==t?void 0:t.getAttribute("name"),o=null==t?void 0:t.getAttribute("value");return r&&null!=o&&n.get(r)!=o&&n.append(r,o),n}(t,n),this.location=f(this.action),this.method==s.get&&function(e,t){const n=new URLSearchParams;for(const[e,r]of t)r instanceof File||n.append(e,r);e.search=n.toString()}(this.location,[...this.body.entries()]),this.fetchRequest=new T(this,this.method,this.location,this.body,this.formElement),this.mustRedirect=r}static confirmMethod(e,t){return confirm(e)}get method(){var e;return function(e){switch(e.toLowerCase()){case"get":return s.get;case"post":return s.post;case"put":return s.put;case"patch":return s.patch;case"delete":return s.delete}}(((null===(e=this.submitter)||void 0===e?void 0:e.getAttribute("formmethod"))||this.formElement.getAttribute("method")||"").toLowerCase())||s.get}get action(){var e;const t="string"==typeof this.formElement.action?this.formElement.action:null;return(null===(e=this.submitter)||void 0===e?void 0:e.getAttribute("formaction"))||this.formElement.getAttribute("action")||t||""}get body(){return this.enctype==l.urlEncoded||this.method==s.get?new URLSearchParams(this.stringFormData):this.formData}get enctype(){var e;return function(e){switch(e.toLowerCase()){case l.multipart:return l.multipart;case l.plain:return l.plain;default:return l.urlEncoded}}((null===(e=this.submitter)||void 0===e?void 0:e.getAttribute("formenctype"))||this.formElement.enctype)}get isIdempotent(){return this.fetchRequest.isIdempotent}get stringFormData(){return[...this.formData].reduce(((e,[t,n])=>e.concat("string"==typeof n?[[t,n]]:[])),[])}get confirmationMessage(){return this.formElement.getAttribute("data-turbo-confirm")}get needsConfirmation(){return null!==this.confirmationMessage}async start(){const{initialized:e,requesting:t}=a;if(!this.needsConfirmation||R.confirmMethod(this.confirmationMessage,this.formElement))return this.state==e?(this.state=t,this.fetchRequest.perform()):void 0}stop(){const{stopping:e,stopped:t}=a;if(this.state!=e&&this.state!=t)return this.state=e,this.fetchRequest.cancel(),!0}prepareHeadersForRequest(e,t){if(!t.isIdempotent){const t=function(e){if(null!=e){const t=(document.cookie?document.cookie.split("; "):[]).find((t=>t.startsWith(e)));if(t){const e=t.split("=").slice(1).join("=");return e?decodeURIComponent(e):void 0}}}(D("csrf-param"))||D("csrf-token");t&&(e["X-CSRF-Token"]=t),e.Accept=[L.contentType,e.Accept].join(", ")}}requestStarted(e){var t;this.state=a.waiting,null===(t=this.submitter)||void 0===t||t.setAttribute("disabled",""),y("turbo:submit-start",{target:this.formElement,detail:{formSubmission:this}}),this.delegate.formSubmissionStarted(this)}requestPreventedHandlingResponse(e,t){this.result={success:t.succeeded,fetchResponse:t}}requestSucceededWithResponse(e,t){if(t.clientError||t.serverError)this.delegate.formSubmissionFailedWithResponse(this,t);else if(this.requestMustRedirect(e)&&function(e){return 200==e.statusCode&&!e.redirected}(t)){const e=new Error("Form responses must redirect to another location");this.delegate.formSubmissionErrored(this,e)}else this.state=a.receiving,this.result={success:!0,fetchResponse:t},this.delegate.formSubmissionSucceededWithResponse(this,t)}requestFailedWithResponse(e,t){this.result={success:!1,fetchResponse:t},this.delegate.formSubmissionFailedWithResponse(this,t)}requestErrored(e,t){this.result={success:!1,error:t},this.delegate.formSubmissionErrored(this,t)}requestFinished(e){var t;this.state=a.stopped,null===(t=this.submitter)||void 0===t||t.removeAttribute("disabled"),y("turbo:submit-end",{target:this.formElement,detail:Object.assign({formSubmission:this},this.result)}),this.delegate.formSubmissionFinished(this)}requestMustRedirect(e){return!e.isIdempotent&&this.mustRedirect}}function D(e){const t=document.querySelector(`meta[name="${e}"]`);return t&&t.content}class A{constructor(e){this.element=e}get children(){return[...this.element.children]}hasAnchor(e){return null!=this.getElementForAnchor(e)}getElementForAnchor(e){return e?this.element.querySelector(`[id='${e}'], a[name='${e}']`):null}get isConnected(){return this.element.isConnected}get firstAutofocusableElement(){return this.element.querySelector("[autofocus]")}get permanentElements(){return[...this.element.querySelectorAll("[id][data-turbo-permanent]")]}getPermanentElementById(e){return this.element.querySelector(`#${e}[data-turbo-permanent]`)}getPermanentElementMapForSnapshot(e){const t={};for(const n of this.permanentElements){const{id:r}=n,o=e.getPermanentElementById(r);o&&(t[r]=[n,o])}return t}}class I{constructor(e,t){this.submitBubbled=e=>{const t=e.target;if(!e.defaultPrevented&&t instanceof HTMLFormElement&&t.closest("turbo-frame, html")==this.element){const n=e.submitter||void 0;"dialog"!=((null==n?void 0:n.getAttribute("formmethod"))||t.method)&&this.delegate.shouldInterceptFormSubmission(t,n)&&(e.preventDefault(),e.stopImmediatePropagation(),this.delegate.formSubmissionIntercepted(t,n))}},this.delegate=e,this.element=t}start(){this.element.addEventListener("submit",this.submitBubbled)}stop(){this.element.removeEventListener("submit",this.submitBubbled)}}class M{constructor(e,t){this.resolveRenderPromise=e=>{},this.resolveInterceptionPromise=e=>{},this.delegate=e,this.element=t}scrollToAnchor(e){const t=this.snapshot.getElementForAnchor(e);t?(this.scrollToElement(t),this.focusElement(t)):this.scrollToPosition({x:0,y:0})}scrollToAnchorFromLocation(e){this.scrollToAnchor(h(e))}scrollToElement(e){e.scrollIntoView()}focusElement(e){e instanceof HTMLElement&&(e.hasAttribute("tabindex")?e.focus():(e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")))}scrollToPosition({x:e,y:t}){this.scrollRoot.scrollTo(e,t)}scrollToTop(){this.scrollToPosition({x:0,y:0})}get scrollRoot(){return window}async render(e){const{isPreview:t,shouldRender:n,newSnapshot:r}=e;if(n)try{this.renderPromise=new Promise((e=>this.resolveRenderPromise=e)),this.renderer=e,this.prepareToRenderSnapshot(e);const n=new Promise((e=>this.resolveInterceptionPromise=e));this.delegate.allowsImmediateRender(r,this.resolveInterceptionPromise)||await n,await this.renderSnapshot(e),this.delegate.viewRenderedSnapshot(r,t),this.finishRenderingSnapshot(e)}finally{delete this.renderer,this.resolveRenderPromise(void 0),delete this.renderPromise}else this.invalidate()}invalidate(){this.delegate.viewInvalidated()}prepareToRenderSnapshot(e){this.markAsPreview(e.isPreview),e.prepareToRender()}markAsPreview(e){e?this.element.setAttribute("data-turbo-preview",""):this.element.removeAttribute("data-turbo-preview")}async renderSnapshot(e){await e.render()}finishRenderingSnapshot(e){e.finishRendering()}}class F extends M{invalidate(){this.element.innerHTML=""}get snapshot(){return new A(this.element)}}class P{constructor(e,t){this.clickBubbled=e=>{this.respondsToEventTarget(e.target)?this.clickEvent=e:delete this.clickEvent},this.linkClicked=e=>{this.clickEvent&&this.respondsToEventTarget(e.target)&&e.target instanceof Element&&this.delegate.shouldInterceptLinkClick(e.target,e.detail.url)&&(this.clickEvent.preventDefault(),e.preventDefault(),this.delegate.linkClickIntercepted(e.target,e.detail.url)),delete this.clickEvent},this.willVisit=()=>{delete this.clickEvent},this.delegate=e,this.element=t}start(){this.element.addEventListener("click",this.clickBubbled),document.addEventListener("turbo:click",this.linkClicked),document.addEventListener("turbo:before-visit",this.willVisit)}stop(){this.element.removeEventListener("click",this.clickBubbled),document.removeEventListener("turbo:click",this.linkClicked),document.removeEventListener("turbo:before-visit",this.willVisit)}respondsToEventTarget(e){const t=e instanceof Element?e:e instanceof Node?e.parentElement:null;return t&&t.closest("turbo-frame, html")==this.element}}class H{constructor(e,t,n,r=!0){this.currentSnapshot=e,this.newSnapshot=t,this.isPreview=n,this.willRender=r,this.promise=new Promise(((e,t)=>this.resolvingFunctions={resolve:e,reject:t}))}get shouldRender(){return!0}prepareToRender(){}finishRendering(){this.resolvingFunctions&&(this.resolvingFunctions.resolve(),delete this.resolvingFunctions)}createScriptElement(e){if("false"==e.getAttribute("data-turbo-eval"))return e;{const t=document.createElement("script");return this.cspNonce&&(t.nonce=this.cspNonce),t.textContent=e.textContent,t.async=!1,function(e,t){for(const{name:n,value:r}of[...t.attributes])e.setAttribute(n,r)}(t,e),t}}preservingPermanentElements(e){(class{constructor(e){this.permanentElementMap=e}static preservingPermanentElements(e,t){const n=new this(e);n.enter(),t(),n.leave()}enter(){for(const e in this.permanentElementMap){const[,t]=this.permanentElementMap[e];this.replaceNewPermanentElementWithPlaceholder(t)}}leave(){for(const e in this.permanentElementMap){const[t]=this.permanentElementMap[e];this.replaceCurrentPermanentElementWithClone(t),this.replacePlaceholderWithPermanentElement(t)}}replaceNewPermanentElementWithPlaceholder(e){const t=function(e){const t=document.createElement("meta");return t.setAttribute("name","turbo-permanent-placeholder"),t.setAttribute("content",e.id),t}(e);e.replaceWith(t)}replaceCurrentPermanentElementWithClone(e){const t=e.cloneNode(!0);e.replaceWith(t)}replacePlaceholderWithPermanentElement(e){const t=this.getPlaceholderById(e.id);null==t||t.replaceWith(e)}getPlaceholderById(e){return this.placeholders.find((t=>t.content==e))}get placeholders(){return[...document.querySelectorAll("meta[name=turbo-permanent-placeholder][content]")]}}).preservingPermanentElements(this.permanentElementMap,e)}focusFirstAutofocusableElement(){const e=this.connectedSnapshot.firstAutofocusableElement;(function(e){return e&&"function"==typeof e.focus})(e)&&e.focus()}get connectedSnapshot(){return this.newSnapshot.isConnected?this.newSnapshot:this.currentSnapshot}get currentElement(){return this.currentSnapshot.element}get newElement(){return this.newSnapshot.element}get permanentElementMap(){return this.currentSnapshot.getPermanentElementMapForSnapshot(this.newSnapshot)}get cspNonce(){var e;return null===(e=document.head.querySelector('meta[name="csp-nonce"]'))||void 0===e?void 0:e.getAttribute("content")}}class N extends H{get shouldRender(){return!0}async render(){await w(),this.preservingPermanentElements((()=>{this.loadFrameElement()})),this.scrollFrameIntoView(),await w(),this.focusFirstAutofocusableElement(),await w(),this.activateScriptElements()}loadFrameElement(){var e;const t=document.createRange();t.selectNodeContents(this.currentElement),t.deleteContents();const n=this.newElement,r=null===(e=n.ownerDocument)||void 0===e?void 0:e.createRange();r&&(r.selectNodeContents(n),this.currentElement.appendChild(r.extractContents()))}scrollFrameIntoView(){if(this.currentElement.autoscroll||this.newElement.autoscroll){const t=this.currentElement.firstElementChild,n=("end","end"==(e=this.currentElement.getAttribute("data-autoscroll-block"))||"start"==e||"center"==e||"nearest"==e?e:"end");if(t)return t.scrollIntoView({block:n}),!0}var e;return!1}activateScriptElements(){for(const e of this.newScriptElements){const t=this.createScriptElement(e);e.replaceWith(t)}}get newScriptElements(){return this.currentElement.querySelectorAll("script")}}class j{constructor(){this.hiding=!1,this.value=0,this.visible=!1,this.trickle=()=>{this.setValue(this.value+Math.random()/100)},this.stylesheetElement=this.createStylesheetElement(),this.progressElement=this.createProgressElement(),this.installStylesheetElement(),this.setValue(0)}static get defaultCSS(){return k`
+      .turbo-progress-bar {
+        position: fixed;
+        display: block;
+        top: 0;
+        left: 0;
+        height: 3px;
+        background: #0076ff;
+        z-index: 9999;
+        transition:
+          width ${j.animationDuration}ms ease-out,
+          opacity ${j.animationDuration/2}ms ${j.animationDuration/2}ms ease-in;
+        transform: translate3d(0, 0, 0);
+      }
+    `}show(){this.visible||(this.visible=!0,this.installProgressElement(),this.startTrickling())}hide(){this.visible&&!this.hiding&&(this.hiding=!0,this.fadeProgressElement((()=>{this.uninstallProgressElement(),this.stopTrickling(),this.visible=!1,this.hiding=!1})))}setValue(e){this.value=e,this.refresh()}installStylesheetElement(){document.head.insertBefore(this.stylesheetElement,document.head.firstChild)}installProgressElement(){this.progressElement.style.width="0",this.progressElement.style.opacity="1",document.documentElement.insertBefore(this.progressElement,document.body),this.refresh()}fadeProgressElement(e){this.progressElement.style.opacity="0",setTimeout(e,1.5*j.animationDuration)}uninstallProgressElement(){this.progressElement.parentNode&&document.documentElement.removeChild(this.progressElement)}startTrickling(){this.trickleInterval||(this.trickleInterval=window.setInterval(this.trickle,j.animationDuration))}stopTrickling(){window.clearInterval(this.trickleInterval),delete this.trickleInterval}refresh(){requestAnimationFrame((()=>{this.progressElement.style.width=10+90*this.value+"%"}))}createStylesheetElement(){const e=document.createElement("style");return e.type="text/css",e.textContent=j.defaultCSS,e}createProgressElement(){const e=document.createElement("div");return e.className="turbo-progress-bar",e}}j.animationDuration=300;class W extends A{constructor(){super(...arguments),this.detailsByOuterHTML=this.children.filter((e=>!function(e){return"noscript"==e.tagName.toLowerCase()}(e))).map((e=>function(e){return e.hasAttribute("nonce")&&e.setAttribute("nonce",""),e}(e))).reduce(((e,t)=>{const{outerHTML:n}=t,r=n in e?e[n]:{type:B(t),tracked:z(t),elements:[]};return Object.assign(Object.assign({},e),{[n]:Object.assign(Object.assign({},r),{elements:[...r.elements,t]})})}),{})}get trackedElementSignature(){return Object.keys(this.detailsByOuterHTML).filter((e=>this.detailsByOuterHTML[e].tracked)).join("")}getScriptElementsNotInSnapshot(e){return this.getElementsMatchingTypeNotInSnapshot("script",e)}getStylesheetElementsNotInSnapshot(e){return this.getElementsMatchingTypeNotInSnapshot("stylesheet",e)}getElementsMatchingTypeNotInSnapshot(e,t){return Object.keys(this.detailsByOuterHTML).filter((e=>!(e in t.detailsByOuterHTML))).map((e=>this.detailsByOuterHTML[e])).filter((({type:t})=>t==e)).map((({elements:[e]})=>e))}get provisionalElements(){return Object.keys(this.detailsByOuterHTML).reduce(((e,t)=>{const{type:n,tracked:r,elements:o}=this.detailsByOuterHTML[t];return null!=n||r?o.length>1?[...e,...o.slice(1)]:e:[...e,...o]}),[])}getMetaValue(e){const t=this.findMetaElementByName(e);return t?t.getAttribute("content"):null}findMetaElementByName(e){return Object.keys(this.detailsByOuterHTML).reduce(((t,n)=>{const{elements:[r]}=this.detailsByOuterHTML[n];return function(e,t){return"meta"==e.tagName.toLowerCase()&&e.getAttribute("name")==t}(r,e)?r:t}),void 0)}}function B(e){return function(e){return"script"==e.tagName.toLowerCase()}(e)?"script":function(e){const t=e.tagName.toLowerCase();return"style"==t||"link"==t&&"stylesheet"==e.getAttribute("rel")}(e)?"stylesheet":void 0}function z(e){return"reload"==e.getAttribute("data-turbo-track")}class V extends A{constructor(e,t){super(e),this.headSnapshot=t}static fromHTMLString(e=""){return this.fromDocument(x(e))}static fromElement(e){return this.fromDocument(e.ownerDocument)}static fromDocument({head:e,body:t}){return new this(t,new W(e))}clone(){return new V(this.element.cloneNode(!0),this.headSnapshot)}get headElement(){return this.headSnapshot.element}get rootLocation(){var e;return f(null!==(e=this.getSetting("root"))&&void 0!==e?e:"/")}get cacheControlValue(){return this.getSetting("cache-control")}get isPreviewable(){return"no-preview"!=this.cacheControlValue}get isCacheable(){return"no-cache"!=this.cacheControlValue}get isVisitable(){return"reload"!=this.getSetting("visit-control")}getSetting(e){return this.headSnapshot.getMetaValue(`turbo-${e}`)}}!function(e){e.visitStart="visitStart",e.requestStart="requestStart",e.requestEnd="requestEnd",e.visitEnd="visitEnd"}(c||(c={})),function(e){e.initialized="initialized",e.started="started",e.canceled="canceled",e.failed="failed",e.completed="completed"}(u||(u={}));const q={action:"advance",historyChanged:!1,visitCachedSnapshot:()=>{},willRender:!0};var $,U;!function(e){e[e.networkFailure=0]="networkFailure",e[e.timeoutFailure=-1]="timeoutFailure",e[e.contentTypeMismatch=-2]="contentTypeMismatch"}($||($={}));class Z{constructor(e,t,n,r={}){this.identifier=S(),this.timingMetrics={},this.followedRedirect=!1,this.historyChanged=!1,this.scrolled=!1,this.snapshotCached=!1,this.state=u.initialized,this.delegate=e,this.location=t,this.restorationIdentifier=n||S();const{action:o,historyChanged:i,referrer:s,snapshotHTML:a,response:l,visitCachedSnapshot:c,willRender:d}=Object.assign(Object.assign({},q),r);this.action=o,this.historyChanged=i,this.referrer=s,this.snapshotHTML=a,this.response=l,this.isSamePage=this.delegate.locationWithActionIsSamePage(this.location,this.action),this.visitCachedSnapshot=c,this.willRender=d,this.scrolled=!d}get adapter(){return this.delegate.adapter}get view(){return this.delegate.view}get history(){return this.delegate.history}get restorationData(){return this.history.getRestorationDataForIdentifier(this.restorationIdentifier)}get silent(){return this.isSamePage}start(){this.state==u.initialized&&(this.recordTimingMetric(c.visitStart),this.state=u.started,this.adapter.visitStarted(this),this.delegate.visitStarted(this))}cancel(){this.state==u.started&&(this.request&&this.request.cancel(),this.cancelRender(),this.state=u.canceled)}complete(){this.state==u.started&&(this.recordTimingMetric(c.visitEnd),this.state=u.completed,this.adapter.visitCompleted(this),this.delegate.visitCompleted(this),this.followRedirect())}fail(){this.state==u.started&&(this.state=u.failed,this.adapter.visitFailed(this))}changeHistory(){var e;if(!this.historyChanged){const t=this.location.href===(null===(e=this.referrer)||void 0===e?void 0:e.href)?"replace":this.action,n=this.getHistoryMethodForAction(t);this.history.update(n,this.location,this.restorationIdentifier),this.historyChanged=!0}}issueRequest(){this.hasPreloadedResponse()?this.simulateRequest():this.shouldIssueRequest()&&!this.request&&(this.request=new T(this,s.get,this.location),this.request.perform())}simulateRequest(){this.response&&(this.startRequest(),this.recordResponse(),this.finishRequest())}startRequest(){this.recordTimingMetric(c.requestStart),this.adapter.visitRequestStarted(this)}recordResponse(e=this.response){if(this.response=e,e){const{statusCode:t}=e;Y(t)?this.adapter.visitRequestCompleted(this):this.adapter.visitRequestFailedWithStatusCode(this,t)}}finishRequest(){this.recordTimingMetric(c.requestEnd),this.adapter.visitRequestFinished(this)}loadResponse(){if(this.response){const{statusCode:e,responseHTML:t}=this.response;this.render((async()=>{this.cacheSnapshot(),this.view.renderPromise&&await this.view.renderPromise,Y(e)&&null!=t?(await this.view.renderPage(V.fromHTMLString(t),!1,this.willRender),this.adapter.visitRendered(this),this.complete()):(await this.view.renderError(V.fromHTMLString(t)),this.adapter.visitRendered(this),this.fail())}))}}getCachedSnapshot(){const e=this.view.getCachedSnapshotForLocation(this.location)||this.getPreloadedSnapshot();if(e&&(!h(this.location)||e.hasAnchor(h(this.location)))&&("restore"==this.action||e.isPreviewable))return e}getPreloadedSnapshot(){if(this.snapshotHTML)return V.fromHTMLString(this.snapshotHTML)}hasCachedSnapshot(){return null!=this.getCachedSnapshot()}loadCachedSnapshot(){const e=this.getCachedSnapshot();if(e){const t=this.shouldIssueRequest();this.render((async()=>{this.cacheSnapshot(),this.isSamePage?this.adapter.visitRendered(this):(this.view.renderPromise&&await this.view.renderPromise,await this.view.renderPage(e,t,this.willRender),this.adapter.visitRendered(this),t||this.complete())}))}}followRedirect(){var e;this.redirectedToLocation&&!this.followedRedirect&&(null===(e=this.response)||void 0===e?void 0:e.redirected)&&(this.adapter.visitProposedToLocation(this.redirectedToLocation,{action:"replace",response:this.response}),this.followedRedirect=!0)}goToSamePageAnchor(){this.isSamePage&&this.render((async()=>{this.cacheSnapshot(),this.adapter.visitRendered(this)}))}requestStarted(){this.startRequest()}requestPreventedHandlingResponse(e,t){}async requestSucceededWithResponse(e,t){const n=await t.responseHTML,{redirected:r,statusCode:o}=t;null==n?this.recordResponse({statusCode:$.contentTypeMismatch,redirected:r}):(this.redirectedToLocation=t.redirected?t.location:void 0,this.recordResponse({statusCode:o,responseHTML:n,redirected:r}))}async requestFailedWithResponse(e,t){const n=await t.responseHTML,{redirected:r,statusCode:o}=t;null==n?this.recordResponse({statusCode:$.contentTypeMismatch,redirected:r}):this.recordResponse({statusCode:o,responseHTML:n,redirected:r})}requestErrored(e,t){this.recordResponse({statusCode:$.networkFailure,redirected:!1})}requestFinished(){this.finishRequest()}performScroll(){this.scrolled||("restore"==this.action?this.scrollToRestoredPosition()||this.scrollToAnchor()||this.view.scrollToTop():this.scrollToAnchor()||this.view.scrollToTop(),this.isSamePage&&this.delegate.visitScrolledToSamePageLocation(this.view.lastRenderedLocation,this.location),this.scrolled=!0)}scrollToRestoredPosition(){const{scrollPosition:e}=this.restorationData;if(e)return this.view.scrollToPosition(e),!0}scrollToAnchor(){const e=h(this.location);if(null!=e)return this.view.scrollToAnchor(e),!0}recordTimingMetric(e){this.timingMetrics[e]=(new Date).getTime()}getTimingMetrics(){return Object.assign({},this.timingMetrics)}getHistoryMethodForAction(e){switch(e){case"replace":return history.replaceState;case"advance":case"restore":return history.pushState}}hasPreloadedResponse(){return"object"==typeof this.response}shouldIssueRequest(){return!this.isSamePage&&("restore"==this.action?!this.hasCachedSnapshot():this.willRender)}cacheSnapshot(){this.snapshotCached||(this.view.cacheSnapshot().then((e=>e&&this.visitCachedSnapshot(e))),this.snapshotCached=!0)}async render(e){this.cancelRender(),await new Promise((e=>{this.frame=requestAnimationFrame((()=>e()))})),await e(),delete this.frame,this.performScroll()}cancelRender(){this.frame&&(cancelAnimationFrame(this.frame),delete this.frame)}}function Y(e){return e>=200&&e<300}class G{constructor(e){this.progressBar=new j,this.showProgressBar=()=>{this.progressBar.show()},this.session=e}visitProposedToLocation(e,t){this.navigator.startVisit(e,S(),t)}visitStarted(e){e.loadCachedSnapshot(),e.issueRequest(),e.changeHistory(),e.goToSamePageAnchor()}visitRequestStarted(e){this.progressBar.setValue(0),e.hasCachedSnapshot()||"restore"!=e.action?this.showVisitProgressBarAfterDelay():this.showProgressBar()}visitRequestCompleted(e){e.loadResponse()}visitRequestFailedWithStatusCode(e,t){switch(t){case $.networkFailure:case $.timeoutFailure:case $.contentTypeMismatch:return this.reload();default:return e.loadResponse()}}visitRequestFinished(e){this.progressBar.setValue(1),this.hideVisitProgressBar()}visitCompleted(e){}pageInvalidated(){this.reload()}visitFailed(e){}visitRendered(e){}formSubmissionStarted(e){this.progressBar.setValue(0),this.showFormProgressBarAfterDelay()}formSubmissionFinished(e){this.progressBar.setValue(1),this.hideFormProgressBar()}showVisitProgressBarAfterDelay(){this.visitProgressBarTimeout=window.setTimeout(this.showProgressBar,this.session.progressBarDelay)}hideVisitProgressBar(){this.progressBar.hide(),null!=this.visitProgressBarTimeout&&(window.clearTimeout(this.visitProgressBarTimeout),delete this.visitProgressBarTimeout)}showFormProgressBarAfterDelay(){null==this.formProgressBarTimeout&&(this.formProgressBarTimeout=window.setTimeout(this.showProgressBar,this.session.progressBarDelay))}hideFormProgressBar(){this.progressBar.hide(),null!=this.formProgressBarTimeout&&(window.clearTimeout(this.formProgressBarTimeout),delete this.formProgressBarTimeout)}reload(){window.location.reload()}get navigator(){return this.session.navigator}}class J{constructor(){this.started=!1}start(){this.started||(this.started=!0,addEventListener("turbo:before-cache",this.removeStaleElements,!1))}stop(){this.started&&(this.started=!1,removeEventListener("turbo:before-cache",this.removeStaleElements,!1))}removeStaleElements(){const e=[...document.querySelectorAll('[data-turbo-cache="false"]')];for(const t of e)t.remove()}}class K{constructor(e){this.started=!1,this.submitCaptured=()=>{removeEventListener("submit",this.submitBubbled,!1),addEventListener("submit",this.submitBubbled,!1)},this.submitBubbled=e=>{if(!e.defaultPrevented){const t=e.target instanceof HTMLFormElement?e.target:void 0,n=e.submitter||void 0;t&&"dialog"!=((null==n?void 0:n.getAttribute("formmethod"))||t.getAttribute("method"))&&this.delegate.willSubmitForm(t,n)&&(e.preventDefault(),this.delegate.formSubmitted(t,n))}},this.delegate=e}start(){this.started||(addEventListener("submit",this.submitCaptured,!0),this.started=!0)}stop(){this.started&&(removeEventListener("submit",this.submitCaptured,!0),this.started=!1)}}class X{constructor(e){this.element=e,this.linkInterceptor=new P(this,e),this.formInterceptor=new I(this,e)}start(){this.linkInterceptor.start(),this.formInterceptor.start()}stop(){this.linkInterceptor.stop(),this.formInterceptor.stop()}shouldInterceptLinkClick(e,t){return this.shouldRedirect(e)}linkClickIntercepted(e,t){const n=this.findFrameElement(e);n&&n.delegate.linkClickIntercepted(e,t)}shouldInterceptFormSubmission(e,t){return this.shouldSubmit(e,t)}formSubmissionIntercepted(e,t){const n=this.findFrameElement(e,t);n&&(n.removeAttribute("reloadable"),n.delegate.formSubmissionIntercepted(e,t))}shouldSubmit(e,t){var n;const r=p(e,t),o=this.element.ownerDocument.querySelector('meta[name="turbo-root"]'),i=f(null!==(n=null==o?void 0:o.content)&&void 0!==n?n:"/");return this.shouldRedirect(e,t)&&m(r,i)}shouldRedirect(e,t){const n=this.findFrameElement(e,t);return!!n&&n!=e.closest("turbo-frame")}findFrameElement(e,t){const n=(null==t?void 0:t.getAttribute("data-turbo-frame"))||e.getAttribute("data-turbo-frame");if(n&&"_top"!=n){const e=this.element.querySelector(`#${n}:not([disabled])`);if(e instanceof d)return e}}}class Q{constructor(e){this.restorationIdentifier=S(),this.restorationData={},this.started=!1,this.pageLoaded=!1,this.onPopState=e=>{if(this.shouldHandlePopState()){const{turbo:t}=e.state||{};if(t){this.location=new URL(window.location.href);const{restorationIdentifier:e}=t;this.restorationIdentifier=e,this.delegate.historyPoppedToLocationWithRestorationIdentifier(this.location,e)}}},this.onPageLoad=async e=>{await Promise.resolve(),this.pageLoaded=!0},this.delegate=e}start(){this.started||(addEventListener("popstate",this.onPopState,!1),addEventListener("load",this.onPageLoad,!1),this.started=!0,this.replace(new URL(window.location.href)))}stop(){this.started&&(removeEventListener("popstate",this.onPopState,!1),removeEventListener("load",this.onPageLoad,!1),this.started=!1)}push(e,t){this.update(history.pushState,e,t)}replace(e,t){this.update(history.replaceState,e,t)}update(e,t,n=S()){const r={turbo:{restorationIdentifier:n}};e.call(history,r,"",t.href),this.location=t,this.restorationIdentifier=n}getRestorationDataForIdentifier(e){return this.restorationData[e]||{}}updateRestorationData(e){const{restorationIdentifier:t}=this,n=this.restorationData[t];this.restorationData[t]=Object.assign(Object.assign({},n),e)}assumeControlOfScrollRestoration(){var e;this.previousScrollRestoration||(this.previousScrollRestoration=null!==(e=history.scrollRestoration)&&void 0!==e?e:"auto",history.scrollRestoration="manual")}relinquishControlOfScrollRestoration(){this.previousScrollRestoration&&(history.scrollRestoration=this.previousScrollRestoration,delete this.previousScrollRestoration)}shouldHandlePopState(){return this.pageIsLoaded()}pageIsLoaded(){return this.pageLoaded||"complete"==document.readyState}}class ee{constructor(e){this.started=!1,this.clickCaptured=()=>{removeEventListener("click",this.clickBubbled,!1),addEventListener("click",this.clickBubbled,!1)},this.clickBubbled=e=>{if(this.clickEventIsSignificant(e)){const t=e.composedPath&&e.composedPath()[0]||e.target,n=this.findLinkFromClickTarget(t);if(n){const t=this.getLocationForLink(n);this.delegate.willFollowLinkToLocation(n,t)&&(e.preventDefault(),this.delegate.followedLinkToLocation(n,t))}}},this.delegate=e}start(){this.started||(addEventListener("click",this.clickCaptured,!0),this.started=!0)}stop(){this.started&&(removeEventListener("click",this.clickCaptured,!0),this.started=!1)}clickEventIsSignificant(e){return!(e.target&&e.target.isContentEditable||e.defaultPrevented||e.which>1||e.altKey||e.ctrlKey||e.metaKey||e.shiftKey)}findLinkFromClickTarget(e){if(e instanceof Element)return e.closest("a[href]:not([target^=_]):not([download])")}getLocationForLink(e){return f(e.getAttribute("href")||"")}}function te(e){return"advance"==e||"replace"==e||"restore"==e}class ne{constructor(e){this.delegate=e}proposeVisit(e,t={}){this.delegate.allowsVisitingLocationWithAction(e,t.action)&&(m(e,this.view.snapshot.rootLocation)?this.delegate.visitProposedToLocation(e,t):window.location.href=e.toString())}startVisit(e,t,n={}){this.stop(),this.currentVisit=new Z(this,f(e),t,Object.assign({referrer:this.location},n)),this.currentVisit.start()}submitForm(e,t){this.stop(),this.formSubmission=new R(this,e,t,!0),this.formSubmission.start()}stop(){this.formSubmission&&(this.formSubmission.stop(),delete this.formSubmission),this.currentVisit&&(this.currentVisit.cancel(),delete this.currentVisit)}get adapter(){return this.delegate.adapter}get view(){return this.delegate.view}get history(){return this.delegate.history}formSubmissionStarted(e){"function"==typeof this.adapter.formSubmissionStarted&&this.adapter.formSubmissionStarted(e)}async formSubmissionSucceededWithResponse(e,t){if(e==this.formSubmission){const n=await t.responseHTML;if(n){e.method!=s.get&&this.view.clearSnapshotCache();const{statusCode:r,redirected:o}=t,i={action:this.getActionForFormSubmission(e),response:{statusCode:r,responseHTML:n,redirected:o}};this.proposeVisit(t.location,i)}}}async formSubmissionFailedWithResponse(e,t){const n=await t.responseHTML;if(n){const e=V.fromHTMLString(n);t.serverError?await this.view.renderError(e):await this.view.renderPage(e),this.view.scrollToTop(),this.view.clearSnapshotCache()}}formSubmissionErrored(e,t){console.error(t)}formSubmissionFinished(e){"function"==typeof this.adapter.formSubmissionFinished&&this.adapter.formSubmissionFinished(e)}visitStarted(e){this.delegate.visitStarted(e)}visitCompleted(e){this.delegate.visitCompleted(e)}locationWithActionIsSamePage(e,t){const n=h(e),r=h(this.view.lastRenderedLocation),o="restore"===t&&void 0===n;return"replace"!==t&&v(e)===v(this.view.lastRenderedLocation)&&(o||null!=n&&n!==r)}visitScrolledToSamePageLocation(e,t){this.delegate.visitScrolledToSamePageLocation(e,t)}get location(){return this.history.location}get restorationIdentifier(){return this.history.restorationIdentifier}getActionForFormSubmission(e){const{formElement:t,submitter:n}=e,r=E("data-turbo-action",n,t);return te(r)?r:"advance"}}!function(e){e[e.initial=0]="initial",e[e.loading=1]="loading",e[e.interactive=2]="interactive",e[e.complete=3]="complete"}(U||(U={}));class re{constructor(e){this.stage=U.initial,this.started=!1,this.interpretReadyState=()=>{const{readyState:e}=this;"interactive"==e?this.pageIsInteractive():"complete"==e&&this.pageIsComplete()},this.pageWillUnload=()=>{this.delegate.pageWillUnload()},this.delegate=e}start(){this.started||(this.stage==U.initial&&(this.stage=U.loading),document.addEventListener("readystatechange",this.interpretReadyState,!1),addEventListener("pagehide",this.pageWillUnload,!1),this.started=!0)}stop(){this.started&&(document.removeEventListener("readystatechange",this.interpretReadyState,!1),removeEventListener("pagehide",this.pageWillUnload,!1),this.started=!1)}pageIsInteractive(){this.stage==U.loading&&(this.stage=U.interactive,this.delegate.pageBecameInteractive())}pageIsComplete(){this.pageIsInteractive(),this.stage==U.interactive&&(this.stage=U.complete,this.delegate.pageLoaded())}get readyState(){return document.readyState}}class oe{constructor(e){this.started=!1,this.onScroll=()=>{this.updatePosition({x:window.pageXOffset,y:window.pageYOffset})},this.delegate=e}start(){this.started||(addEventListener("scroll",this.onScroll,!1),this.onScroll(),this.started=!0)}stop(){this.started&&(removeEventListener("scroll",this.onScroll,!1),this.started=!1)}updatePosition(e){this.delegate.scrollPositionChanged(e)}}class ie{constructor(e){this.sources=new Set,this.started=!1,this.inspectFetchResponse=e=>{const t=function(e){var t;const n=null===(t=e.detail)||void 0===t?void 0:t.fetchResponse;if(n instanceof b)return n}(e);t&&function(e){var t;return(null!==(t=e.contentType)&&void 0!==t?t:"").startsWith(L.contentType)}(t)&&(e.preventDefault(),this.receiveMessageResponse(t))},this.receiveMessageEvent=e=>{this.started&&"string"==typeof e.data&&this.receiveMessageHTML(e.data)},this.delegate=e}start(){this.started||(this.started=!0,addEventListener("turbo:before-fetch-response",this.inspectFetchResponse,!1))}stop(){this.started&&(this.started=!1,removeEventListener("turbo:before-fetch-response",this.inspectFetchResponse,!1))}connectStreamSource(e){this.streamSourceIsConnected(e)||(this.sources.add(e),e.addEventListener("message",this.receiveMessageEvent,!1))}disconnectStreamSource(e){this.streamSourceIsConnected(e)&&(this.sources.delete(e),e.removeEventListener("message",this.receiveMessageEvent,!1))}streamSourceIsConnected(e){return this.sources.has(e)}async receiveMessageResponse(e){const t=await e.responseHTML;t&&this.receiveMessageHTML(t)}receiveMessageHTML(e){this.delegate.receivedMessageFromStream(new L(e))}}class se extends H{async render(){this.replaceHeadAndBody(),this.activateScriptElements()}replaceHeadAndBody(){const{documentElement:e,head:t,body:n}=document;e.replaceChild(this.newHead,t),e.replaceChild(this.newElement,n)}activateScriptElements(){for(const e of this.scriptElements){const t=e.parentNode;if(t){const n=this.createScriptElement(e);t.replaceChild(n,e)}}}get newHead(){return this.newSnapshot.headSnapshot.element}get scriptElements(){return[...document.documentElement.querySelectorAll("script")]}}class ae extends H{get shouldRender(){return this.newSnapshot.isVisitable&&this.trackedElementsAreIdentical}prepareToRender(){this.mergeHead()}async render(){this.willRender&&this.replaceBody()}finishRendering(){super.finishRendering(),this.isPreview||this.focusFirstAutofocusableElement()}get currentHeadSnapshot(){return this.currentSnapshot.headSnapshot}get newHeadSnapshot(){return this.newSnapshot.headSnapshot}get newElement(){return this.newSnapshot.element}mergeHead(){this.copyNewHeadStylesheetElements(),this.copyNewHeadScriptElements(),this.removeCurrentHeadProvisionalElements(),this.copyNewHeadProvisionalElements()}replaceBody(){this.preservingPermanentElements((()=>{this.activateNewBody(),this.assignNewBody()}))}get trackedElementsAreIdentical(){return this.currentHeadSnapshot.trackedElementSignature==this.newHeadSnapshot.trackedElementSignature}copyNewHeadStylesheetElements(){for(const e of this.newHeadStylesheetElements)document.head.appendChild(e)}copyNewHeadScriptElements(){for(const e of this.newHeadScriptElements)document.head.appendChild(this.createScriptElement(e))}removeCurrentHeadProvisionalElements(){for(const e of this.currentHeadProvisionalElements)document.head.removeChild(e)}copyNewHeadProvisionalElements(){for(const e of this.newHeadProvisionalElements)document.head.appendChild(e)}activateNewBody(){document.adoptNode(this.newElement),this.activateNewBodyScriptElements()}activateNewBodyScriptElements(){for(const e of this.newBodyScriptElements){const t=this.createScriptElement(e);e.replaceWith(t)}}assignNewBody(){document.body&&this.newElement instanceof HTMLBodyElement?document.body.replaceWith(this.newElement):document.documentElement.appendChild(this.newElement)}get newHeadStylesheetElements(){return this.newHeadSnapshot.getStylesheetElementsNotInSnapshot(this.currentHeadSnapshot)}get newHeadScriptElements(){return this.newHeadSnapshot.getScriptElementsNotInSnapshot(this.currentHeadSnapshot)}get currentHeadProvisionalElements(){return this.currentHeadSnapshot.provisionalElements}get newHeadProvisionalElements(){return this.newHeadSnapshot.provisionalElements}get newBodyScriptElements(){return this.newElement.querySelectorAll("script")}}class le{constructor(e){this.keys=[],this.snapshots={},this.size=e}has(e){return g(e)in this.snapshots}get(e){if(this.has(e)){const t=this.read(e);return this.touch(e),t}}put(e,t){return this.write(e,t),this.touch(e),t}clear(){this.snapshots={}}read(e){return this.snapshots[g(e)]}write(e,t){this.snapshots[g(e)]=t}touch(e){const t=g(e),n=this.keys.indexOf(t);n>-1&&this.keys.splice(n,1),this.keys.unshift(t),this.trim()}trim(){for(const e of this.keys.splice(this.size))delete this.snapshots[e]}}class ce extends M{constructor(){super(...arguments),this.snapshotCache=new le(10),this.lastRenderedLocation=new URL(location.href)}renderPage(e,t=!1,n=!0){const r=new ae(this.snapshot,e,t,n);return this.render(r)}renderError(e){const t=new se(this.snapshot,e,!1);return this.render(t)}clearSnapshotCache(){this.snapshotCache.clear()}async cacheSnapshot(){if(this.shouldCacheSnapshot){this.delegate.viewWillCacheSnapshot();const{snapshot:e,lastRenderedLocation:t}=this;await new Promise((e=>setTimeout((()=>e()),0)));const n=e.clone();return this.snapshotCache.put(t,n),n}}getCachedSnapshotForLocation(e){return this.snapshotCache.get(e)}get snapshot(){return V.fromElement(this.element)}get shouldCacheSnapshot(){return this.snapshot.isCacheable}}function ue(e){Object.defineProperties(e,de)}const de={absoluteURL:{get(){return this.toString()}}},fe=new class{constructor(){this.navigator=new ne(this),this.history=new Q(this),this.view=new ce(this,document.documentElement),this.adapter=new G(this),this.pageObserver=new re(this),this.cacheObserver=new J,this.linkClickObserver=new ee(this),this.formSubmitObserver=new K(this),this.scrollObserver=new oe(this),this.streamObserver=new ie(this),this.frameRedirector=new X(document.documentElement),this.drive=!0,this.enabled=!0,this.progressBarDelay=500,this.started=!1}start(){this.started||(this.pageObserver.start(),this.cacheObserver.start(),this.linkClickObserver.start(),this.formSubmitObserver.start(),this.scrollObserver.start(),this.streamObserver.start(),this.frameRedirector.start(),this.history.start(),this.started=!0,this.enabled=!0)}disable(){this.enabled=!1}stop(){this.started&&(this.pageObserver.stop(),this.cacheObserver.stop(),this.linkClickObserver.stop(),this.formSubmitObserver.stop(),this.scrollObserver.stop(),this.streamObserver.stop(),this.frameRedirector.stop(),this.history.stop(),this.started=!1)}registerAdapter(e){this.adapter=e}visit(e,t={}){this.navigator.proposeVisit(f(e),t)}connectStreamSource(e){this.streamObserver.connectStreamSource(e)}disconnectStreamSource(e){this.streamObserver.disconnectStreamSource(e)}renderStreamMessage(e){document.documentElement.appendChild(L.wrap(e).fragment)}clearCache(){this.view.clearSnapshotCache()}setProgressBarDelay(e){this.progressBarDelay=e}get location(){return this.history.location}get restorationIdentifier(){return this.history.restorationIdentifier}historyPoppedToLocationWithRestorationIdentifier(e,t){this.enabled?this.navigator.startVisit(e,t,{action:"restore",historyChanged:!0}):this.adapter.pageInvalidated()}scrollPositionChanged(e){this.history.updateRestorationData({scrollPosition:e})}willFollowLinkToLocation(e,t){return this.elementDriveEnabled(e)&&m(t,this.snapshot.rootLocation)&&this.applicationAllowsFollowingLinkToLocation(e,t)}followedLinkToLocation(e,t){const n=this.getActionForLink(e);this.convertLinkWithMethodClickToFormSubmission(e)||this.visit(t.href,{action:n})}convertLinkWithMethodClickToFormSubmission(e){const t=e.getAttribute("data-turbo-method");if(t){const n=document.createElement("form");n.method=t,n.action=e.getAttribute("href")||"undefined",n.hidden=!0,e.hasAttribute("data-turbo-confirm")&&n.setAttribute("data-turbo-confirm",e.getAttribute("data-turbo-confirm"));const r=this.getTargetFrameForLink(e);return r?(n.setAttribute("data-turbo-frame",r),n.addEventListener("turbo:submit-start",(()=>n.remove()))):n.addEventListener("submit",(()=>n.remove())),document.body.appendChild(n),y("submit",{cancelable:!0,target:n})}return!1}allowsVisitingLocationWithAction(e,t){return this.locationWithActionIsSamePage(e,t)||this.applicationAllowsVisitingLocation(e)}visitProposedToLocation(e,t){ue(e),this.adapter.visitProposedToLocation(e,t)}visitStarted(e){ue(e.location),e.silent||this.notifyApplicationAfterVisitingLocation(e.location,e.action)}visitCompleted(e){this.notifyApplicationAfterPageLoad(e.getTimingMetrics())}locationWithActionIsSamePage(e,t){return this.navigator.locationWithActionIsSamePage(e,t)}visitScrolledToSamePageLocation(e,t){this.notifyApplicationAfterVisitingSamePageLocation(e,t)}willSubmitForm(e,t){const n=p(e,t);return this.elementDriveEnabled(e)&&(!t||this.elementDriveEnabled(t))&&m(f(n),this.snapshot.rootLocation)}formSubmitted(e,t){this.navigator.submitForm(e,t)}pageBecameInteractive(){this.view.lastRenderedLocation=this.location,this.notifyApplicationAfterPageLoad()}pageLoaded(){this.history.assumeControlOfScrollRestoration()}pageWillUnload(){this.history.relinquishControlOfScrollRestoration()}receivedMessageFromStream(e){this.renderStreamMessage(e)}viewWillCacheSnapshot(){var e;(null===(e=this.navigator.currentVisit)||void 0===e?void 0:e.silent)||this.notifyApplicationBeforeCachingSnapshot()}allowsImmediateRender({element:e},t){return!this.notifyApplicationBeforeRender(e,t).defaultPrevented}viewRenderedSnapshot(e,t){this.view.lastRenderedLocation=this.history.location,this.notifyApplicationAfterRender()}viewInvalidated(){this.adapter.pageInvalidated()}frameLoaded(e){this.notifyApplicationAfterFrameLoad(e)}frameRendered(e,t){this.notifyApplicationAfterFrameRender(e,t)}applicationAllowsFollowingLinkToLocation(e,t){return!this.notifyApplicationAfterClickingLinkToLocation(e,t).defaultPrevented}applicationAllowsVisitingLocation(e){return!this.notifyApplicationBeforeVisitingLocation(e).defaultPrevented}notifyApplicationAfterClickingLinkToLocation(e,t){return y("turbo:click",{target:e,detail:{url:t.href},cancelable:!0})}notifyApplicationBeforeVisitingLocation(e){return y("turbo:before-visit",{detail:{url:e.href},cancelable:!0})}notifyApplicationAfterVisitingLocation(e,t){return C(document.documentElement),y("turbo:visit",{detail:{url:e.href,action:t}})}notifyApplicationBeforeCachingSnapshot(){return y("turbo:before-cache")}notifyApplicationBeforeRender(e,t){return y("turbo:before-render",{detail:{newBody:e,resume:t},cancelable:!0})}notifyApplicationAfterRender(){return y("turbo:render")}notifyApplicationAfterPageLoad(e={}){return _(document.documentElement),y("turbo:load",{detail:{url:this.location.href,timing:e}})}notifyApplicationAfterVisitingSamePageLocation(e,t){dispatchEvent(new HashChangeEvent("hashchange",{oldURL:e.toString(),newURL:t.toString()}))}notifyApplicationAfterFrameLoad(e){return y("turbo:frame-load",{target:e})}notifyApplicationAfterFrameRender(e,t){return y("turbo:frame-render",{detail:{fetchResponse:e},target:t,cancelable:!0})}elementDriveEnabled(e){const t=null==e?void 0:e.closest("[data-turbo]");return this.drive?!t||"false"!=t.getAttribute("data-turbo"):!!t&&"true"==t.getAttribute("data-turbo")}getActionForLink(e){const t=e.getAttribute("data-turbo-action");return te(t)?t:"advance"}getTargetFrameForLink(e){const t=e.getAttribute("data-turbo-frame");if(t)return t;{const t=e.closest("turbo-frame");if(t)return t.id}}get snapshot(){return this.view.snapshot}},{navigator:he}=fe;function pe(){fe.start()}function me(e,t){fe.visit(e,t)}var ve=Object.freeze({__proto__:null,navigator:he,session:fe,PageRenderer:ae,PageSnapshot:V,start:pe,registerAdapter:function(e){fe.registerAdapter(e)},visit:me,connectStreamSource:function(e){fe.connectStreamSource(e)},disconnectStreamSource:function(e){fe.disconnectStreamSource(e)},renderStreamMessage:function(e){fe.renderStreamMessage(e)},clearCache:function(){fe.clearCache()},setProgressBarDelay:function(e){fe.setProgressBarDelay(e)},setConfirmMethod:function(e){R.confirmMethod=e}});class ge{constructor(e){this.visitCachedSnapshot=({element:e})=>{var t;const{id:n,clone:r}=this;null===(t=e.querySelector("#"+n))||void 0===t||t.replaceWith(r)},this.clone=e.cloneNode(!0),this.id=e.id}}function be(e){if(null!=e){const t=document.getElementById(e);if(t instanceof d)return t}}function ye(e,t){if(e){const r=e.getAttribute("src");if(null!=r&&null!=t&&(n=t,f(r).href==f(n).href))throw new Error(`Matching <turbo-frame id="${e.id}"> element has a source URL which references itself`);if(e.ownerDocument!==document&&(e=document.importNode(e,!0)),e instanceof d)return e.connectedCallback(),e.disconnectedCallback(),e}var n}const we={after(){this.targetElements.forEach((e=>{var t;return null===(t=e.parentElement)||void 0===t?void 0:t.insertBefore(this.templateContent,e.nextSibling)}))},append(){this.removeDuplicateTargetChildren(),this.targetElements.forEach((e=>e.append(this.templateContent)))},before(){this.targetElements.forEach((e=>{var t;return null===(t=e.parentElement)||void 0===t?void 0:t.insertBefore(this.templateContent,e)}))},prepend(){this.removeDuplicateTargetChildren(),this.targetElements.forEach((e=>e.prepend(this.templateContent)))},remove(){this.targetElements.forEach((e=>e.remove()))},replace(){this.targetElements.forEach((e=>e.replaceWith(this.templateContent)))},update(){this.targetElements.forEach((e=>{e.innerHTML="",e.append(this.templateContent)}))}};class xe extends HTMLElement{async connectedCallback(){try{await this.render()}catch(e){console.error(e)}finally{this.disconnect()}}async render(){var e;return null!==(e=this.renderPromise)&&void 0!==e?e:this.renderPromise=(async()=>{this.dispatchEvent(this.beforeRenderEvent)&&(await w(),this.performAction())})()}disconnect(){try{this.remove()}catch(e){}}removeDuplicateTargetChildren(){this.duplicateChildren.forEach((e=>e.remove()))}get duplicateChildren(){var e;const t=this.targetElements.flatMap((e=>[...e.children])).filter((e=>!!e.id)),n=[...null===(e=this.templateContent)||void 0===e?void 0:e.children].filter((e=>!!e.id)).map((e=>e.id));return t.filter((e=>n.includes(e.id)))}get performAction(){if(this.action){const e=we[this.action];if(e)return e;this.raise("unknown action")}this.raise("action attribute is missing")}get targetElements(){return this.target?this.targetElementsById:this.targets?this.targetElementsByQuery:void this.raise("target or targets attribute is missing")}get templateContent(){return this.templateElement.content.cloneNode(!0)}get templateElement(){if(this.firstElementChild instanceof HTMLTemplateElement)return this.firstElementChild;this.raise("first child element must be a <template> element")}get action(){return this.getAttribute("action")}get target(){return this.getAttribute("target")}get targets(){return this.getAttribute("targets")}raise(e){throw new Error(`${this.description}: ${e}`)}get description(){var e,t;return null!==(t=(null!==(e=this.outerHTML.match(/<[^>]+>/))&&void 0!==e?e:[])[0])&&void 0!==t?t:"<turbo-stream>"}get beforeRenderEvent(){return new CustomEvent("turbo:before-stream-render",{bubbles:!0,cancelable:!0})}get targetElementsById(){var e;const t=null===(e=this.ownerDocument)||void 0===e?void 0:e.getElementById(this.target);return null!==t?[t]:[]}get targetElementsByQuery(){var e;const t=null===(e=this.ownerDocument)||void 0===e?void 0:e.querySelectorAll(this.targets);return 0!==t.length?Array.prototype.slice.call(t):[]}}d.delegateConstructor=class{constructor(e){this.fetchResponseLoaded=e=>{},this.currentFetchRequest=null,this.resolveVisitPromise=()=>{},this.connected=!1,this.hasBeenLoaded=!1,this.settingSourceURL=!1,this.element=e,this.view=new F(this,this.element),this.appearanceObserver=new O(this,this.element),this.linkInterceptor=new P(this,this.element),this.formInterceptor=new I(this,this.element)}connect(){this.connected||(this.connected=!0,this.reloadable=!1,this.loadingStyle==i.lazy&&this.appearanceObserver.start(),this.linkInterceptor.start(),this.formInterceptor.start(),this.sourceURLChanged())}disconnect(){this.connected&&(this.connected=!1,this.appearanceObserver.stop(),this.linkInterceptor.stop(),this.formInterceptor.stop())}disabledChanged(){this.loadingStyle==i.eager&&this.loadSourceURL()}sourceURLChanged(){(this.loadingStyle==i.eager||this.hasBeenLoaded)&&this.loadSourceURL()}loadingStyleChanged(){this.loadingStyle==i.lazy?this.appearanceObserver.start():(this.appearanceObserver.stop(),this.loadSourceURL())}async loadSourceURL(){if(!this.settingSourceURL&&this.enabled&&this.isActive&&(this.reloadable||this.sourceURL!=this.currentURL)){const e=this.currentURL;if(this.currentURL=this.sourceURL,this.sourceURL)try{this.element.loaded=this.visit(f(this.sourceURL)),this.appearanceObserver.stop(),await this.element.loaded,this.hasBeenLoaded=!0}catch(t){throw this.currentURL=e,t}}}async loadResponse(e){(e.redirected||e.succeeded&&e.isHTML)&&(this.sourceURL=e.response.url);try{const t=await e.responseHTML;if(t){const{body:n}=x(t),r=new A(await this.extractForeignFrameElement(n)),o=new N(this.view.snapshot,r,!1,!1);this.view.renderPromise&&await this.view.renderPromise,await this.view.render(o),fe.frameRendered(e,this.element),fe.frameLoaded(this.element),this.fetchResponseLoaded(e)}}catch(e){console.error(e),this.view.invalidate()}finally{this.fetchResponseLoaded=()=>{}}}elementAppearedInViewport(e){this.loadSourceURL()}shouldInterceptLinkClick(e,t){return!e.hasAttribute("data-turbo-method")&&this.shouldInterceptNavigation(e)}linkClickIntercepted(e,t){this.reloadable=!0,this.navigateFrame(e,t)}shouldInterceptFormSubmission(e,t){return this.shouldInterceptNavigation(e,t)}formSubmissionIntercepted(e,t){this.formSubmission&&this.formSubmission.stop(),this.reloadable=!1,this.formSubmission=new R(this,e,t);const{fetchRequest:n}=this.formSubmission;this.prepareHeadersForRequest(n.headers,n),this.formSubmission.start()}prepareHeadersForRequest(e,t){e["Turbo-Frame"]=this.id}requestStarted(e){C(this.element)}requestPreventedHandlingResponse(e,t){this.resolveVisitPromise()}async requestSucceededWithResponse(e,t){await this.loadResponse(t),this.resolveVisitPromise()}requestFailedWithResponse(e,t){console.error(t),this.resolveVisitPromise()}requestErrored(e,t){console.error(t),this.resolveVisitPromise()}requestFinished(e){_(this.element)}formSubmissionStarted({formElement:e}){C(e,this.findFrameElement(e))}formSubmissionSucceededWithResponse(e,t){const n=this.findFrameElement(e.formElement,e.submitter);this.proposeVisitIfNavigatedWithAction(n,e.formElement,e.submitter),n.delegate.loadResponse(t)}formSubmissionFailedWithResponse(e,t){this.element.delegate.loadResponse(t)}formSubmissionErrored(e,t){console.error(t)}formSubmissionFinished({formElement:e}){_(e,this.findFrameElement(e))}allowsImmediateRender(e,t){return!0}viewRenderedSnapshot(e,t){}viewInvalidated(){}async visit(e){var t;const n=new T(this,s.get,e,new URLSearchParams,this.element);return null===(t=this.currentFetchRequest)||void 0===t||t.cancel(),this.currentFetchRequest=n,new Promise((e=>{this.resolveVisitPromise=()=>{this.resolveVisitPromise=()=>{},this.currentFetchRequest=null,e()},n.perform()}))}navigateFrame(e,t,n){const r=this.findFrameElement(e,n);this.proposeVisitIfNavigatedWithAction(r,e,n),r.setAttribute("reloadable",""),r.src=t}proposeVisitIfNavigatedWithAction(e,t,n){const r=E("data-turbo-action",n,t,e);if(te(r)){const{visitCachedSnapshot:t}=new ge(e);e.delegate.fetchResponseLoaded=n=>{if(e.src){const{statusCode:o,redirected:i}=n,s={statusCode:o,redirected:i,responseHTML:e.ownerDocument.documentElement.outerHTML};fe.visit(e.src,{action:r,response:s,visitCachedSnapshot:t,willRender:!1})}}}}findFrameElement(e,t){var n;return null!==(n=be(E("data-turbo-frame",t,e)||this.element.getAttribute("target")))&&void 0!==n?n:this.element}async extractForeignFrameElement(e){let t;const n=CSS.escape(this.id);try{if(t=ye(e.querySelector(`turbo-frame#${n}`),this.currentURL))return t;if(t=ye(e.querySelector(`turbo-frame[src][recurse~=${n}]`),this.currentURL))return await t.loaded,await this.extractForeignFrameElement(t);console.error(`Response has no matching <turbo-frame id="${n}"> element`)}catch(e){console.error(e)}return new d}formActionIsVisitable(e,t){return m(f(p(e,t)),this.rootLocation)}shouldInterceptNavigation(e,t){const n=E("data-turbo-frame",t,e)||this.element.getAttribute("target");if(e instanceof HTMLFormElement&&!this.formActionIsVisitable(e,t))return!1;if(!this.enabled||"_top"==n)return!1;if(n){const e=be(n);if(e)return!e.disabled}return!(!fe.elementDriveEnabled(e)||t&&!fe.elementDriveEnabled(t))}get id(){return this.element.id}get enabled(){return!this.element.disabled}get sourceURL(){if(this.element.src)return this.element.src}get reloadable(){return this.findFrameElement(this.element).hasAttribute("reloadable")}set reloadable(e){const t=this.findFrameElement(this.element);e?t.setAttribute("reloadable",""):t.removeAttribute("reloadable")}set sourceURL(e){this.settingSourceURL=!0,this.element.src=null!=e?e:null,this.currentURL=this.element.src,this.settingSourceURL=!1}get loadingStyle(){return this.element.loading}get isLoading(){return void 0!==this.formSubmission||void 0!==this.resolveVisitPromise()}get isActive(){return this.element.isActive&&this.connected}get rootLocation(){var e;const t=this.element.ownerDocument.querySelector('meta[name="turbo-root"]');return f(null!==(e=null==t?void 0:t.content)&&void 0!==e?e:"/")}},customElements.define("turbo-frame",d),customElements.define("turbo-stream",xe),(()=>{let e=document.currentScript;if(e&&!e.hasAttribute("data-turbo-suppress-warning"))for(;e=e.parentElement;)if(e==document.body)return console.warn(k`
+        You are loading Turbo from a <script> element inside the <body> element. This is probably not what you meant to do!
+
+        Load your application’s JavaScript bundle inside the <head> element instead. <script> elements in <body> are evaluated with each page change.
+
+        For more information, see: https://turbo.hotwired.dev/handbook/building#working-with-script-elements
+
+        ——
+        Suppress this warning by adding a "data-turbo-suppress-warning" attribute to: %s
+      `,e.outerHTML)})(),window.Turbo=ve,pe()},2262:(e,t,n)=>{"use strict";n.d(t,{Bj:()=>i,qq:()=>y,Fl:()=>Ge,ZM:()=>qe,cE:()=>x,B:()=>s,nZ:()=>l,X3:()=>Te,PG:()=>Ee,$y:()=>Ce,dq:()=>Me,yT:()=>_e,Xl:()=>Le,EB:()=>c,Jd:()=>C,WL:()=>ze,qj:()=>ye,OT:()=>xe,iH:()=>Fe,lk:()=>_,Um:()=>we,YS:()=>ke,XI:()=>Pe,sT:()=>k,IU:()=>Oe,Vh:()=>Ze,BK:()=>$e,j:()=>T,X$:()=>L,oR:()=>je,SU:()=>We});var r=n(3577);let o;class i{constructor(e=!1){this.active=!0,this.effects=[],this.cleanups=[],!e&&o&&(this.parent=o,this.index=(o.scopes||(o.scopes=[])).push(this)-1)}run(e){if(this.active)try{return o=this,e()}finally{o=this.parent}}on(){o=this}off(){o=this.parent}stop(e){if(this.active){let t,n;for(t=0,n=this.effects.length;t<n;t++)this.effects[t].stop();for(t=0,n=this.cleanups.length;t<n;t++)this.cleanups[t]();if(this.scopes)for(t=0,n=this.scopes.length;t<n;t++)this.scopes[t].stop(!0);if(this.parent&&!e){const e=this.parent.scopes.pop();e&&e!==this&&(this.parent.scopes[this.index]=e,e.index=this.index)}this.active=!1}}}function s(e){return new i(e)}function a(e,t=o){t&&t.active&&t.effects.push(e)}function l(){return o}function c(e){o&&o.cleanups.push(e)}const u=e=>{const t=new Set(e);return t.w=0,t.n=0,t},d=e=>(e.w&v)>0,f=e=>(e.n&v)>0,h=new WeakMap;let p,m=0,v=1;const g=Symbol(""),b=Symbol("");class y{constructor(e,t=null,n){this.fn=e,this.scheduler=t,this.active=!0,this.deps=[],this.parent=void 0,a(this,n)}run(){if(!this.active)return this.fn();let e=p,t=S;for(;e;){if(e===this)return;e=e.parent}try{return this.parent=p,p=this,S=!0,v=1<<++m,m<=30?(({deps:e})=>{if(e.length)for(let t=0;t<e.length;t++)e[t].w|=v})(this):w(this),this.fn()}finally{m<=30&&(e=>{const{deps:t}=e;if(t.length){let n=0;for(let r=0;r<t.length;r++){const o=t[r];d(o)&&!f(o)?o.delete(e):t[n++]=o,o.w&=~v,o.n&=~v}t.length=n}})(this),v=1<<--m,p=this.parent,S=t,this.parent=void 0}}stop(){this.active&&(w(this),this.onStop&&this.onStop(),this.active=!1)}}function w(e){const{deps:t}=e;if(t.length){for(let n=0;n<t.length;n++)t[n].delete(e);t.length=0}}function x(e,t){e.effect&&(e=e.effect.fn);const n=new y(e);t&&((0,r.l7)(n,t),t.scope&&a(n,t.scope)),t&&t.lazy||n.run();const o=n.run.bind(n);return o.effect=n,o}function k(e){e.effect.stop()}let S=!0;const E=[];function C(){E.push(S),S=!1}function _(){const e=E.pop();S=void 0===e||e}function T(e,t,n){if(S&&p){let t=h.get(e);t||h.set(e,t=new Map);let r=t.get(n);r||t.set(n,r=u()),O(r)}}function O(e,t){let n=!1;m<=30?f(e)||(e.n|=v,n=!d(e)):n=!e.has(p),n&&(e.add(p),p.deps.push(e))}function L(e,t,n,o,i,s){const a=h.get(e);if(!a)return;let l=[];if("clear"===t)l=[...a.values()];else if("length"===n&&(0,r.kJ)(e))a.forEach(((e,t)=>{("length"===t||t>=o)&&l.push(e)}));else switch(void 0!==n&&l.push(a.get(n)),t){case"add":(0,r.kJ)(e)?(0,r.S0)(n)&&l.push(a.get("length")):(l.push(a.get(g)),(0,r._N)(e)&&l.push(a.get(b)));break;case"delete":(0,r.kJ)(e)||(l.push(a.get(g)),(0,r._N)(e)&&l.push(a.get(b)));break;case"set":(0,r._N)(e)&&l.push(a.get(g))}if(1===l.length)l[0]&&R(l[0]);else{const e=[];for(const t of l)t&&e.push(...t);R(u(e))}}function R(e,t){for(const t of(0,r.kJ)(e)?e:[...e])(t!==p||t.allowRecurse)&&(t.scheduler?t.scheduler():t.run())}const D=(0,r.fY)("__proto__,__v_isRef,__isVue"),A=new Set(Object.getOwnPropertyNames(Symbol).map((e=>Symbol[e])).filter(r.yk)),I=j(),M=j(!1,!0),F=j(!0),P=j(!0,!0),H=N();function N(){const e={};return["includes","indexOf","lastIndexOf"].forEach((t=>{e[t]=function(...e){const n=Oe(this);for(let e=0,t=this.length;e<t;e++)T(n,0,e+"");const r=n[t](...e);return-1===r||!1===r?n[t](...e.map(Oe)):r}})),["push","pop","shift","unshift","splice"].forEach((t=>{e[t]=function(...e){C();const n=Oe(this)[t].apply(this,e);return _(),n}})),e}function j(e=!1,t=!1){return function(n,o,i){if("__v_isReactive"===o)return!e;if("__v_isReadonly"===o)return e;if("__v_isShallow"===o)return t;if("__v_raw"===o&&i===(e?t?be:ge:t?ve:me).get(n))return n;const s=(0,r.kJ)(n);if(!e&&s&&(0,r.RI)(H,o))return Reflect.get(H,o,i);const a=Reflect.get(n,o,i);return((0,r.yk)(o)?A.has(o):D(o))?a:(e||T(n,0,o),t?a:Me(a)?s&&(0,r.S0)(o)?a:a.value:(0,r.Kn)(a)?e?xe(a):ye(a):a)}}const W=z(),B=z(!0);function z(e=!1){return function(t,n,o,i){let s=t[n];if(Ce(s)&&Me(s)&&!Me(o))return!1;if(!e&&!Ce(o)&&(_e(o)||(o=Oe(o),s=Oe(s)),!(0,r.kJ)(t)&&Me(s)&&!Me(o)))return s.value=o,!0;const a=(0,r.kJ)(t)&&(0,r.S0)(n)?Number(n)<t.length:(0,r.RI)(t,n),l=Reflect.set(t,n,o,i);return t===Oe(i)&&(a?(0,r.aU)(o,s)&&L(t,"set",n,o):L(t,"add",n,o)),l}}const V={get:I,set:W,deleteProperty:function(e,t){const n=(0,r.RI)(e,t),o=(e[t],Reflect.deleteProperty(e,t));return o&&n&&L(e,"delete",t,void 0),o},has:function(e,t){const n=Reflect.has(e,t);return(0,r.yk)(t)&&A.has(t)||T(e,0,t),n},ownKeys:function(e){return T(e,0,(0,r.kJ)(e)?"length":g),Reflect.ownKeys(e)}},q={get:F,set:(e,t)=>!0,deleteProperty:(e,t)=>!0},$=(0,r.l7)({},V,{get:M,set:B}),U=(0,r.l7)({},q,{get:P}),Z=e=>e,Y=e=>Reflect.getPrototypeOf(e);function G(e,t,n=!1,r=!1){const o=Oe(e=e.__v_raw),i=Oe(t);t!==i&&!n&&T(o,0,t),!n&&T(o,0,i);const{has:s}=Y(o),a=r?Z:n?De:Re;return s.call(o,t)?a(e.get(t)):s.call(o,i)?a(e.get(i)):void(e!==o&&e.get(t))}function J(e,t=!1){const n=this.__v_raw,r=Oe(n),o=Oe(e);return e!==o&&!t&&T(r,0,e),!t&&T(r,0,o),e===o?n.has(e):n.has(e)||n.has(o)}function K(e,t=!1){return e=e.__v_raw,!t&&T(Oe(e),0,g),Reflect.get(e,"size",e)}function X(e){e=Oe(e);const t=Oe(this);return Y(t).has.call(t,e)||(t.add(e),L(t,"add",e,e)),this}function Q(e,t){t=Oe(t);const n=Oe(this),{has:o,get:i}=Y(n);let s=o.call(n,e);s||(e=Oe(e),s=o.call(n,e));const a=i.call(n,e);return n.set(e,t),s?(0,r.aU)(t,a)&&L(n,"set",e,t):L(n,"add",e,t),this}function ee(e){const t=Oe(this),{has:n,get:r}=Y(t);let o=n.call(t,e);o||(e=Oe(e),o=n.call(t,e)),r&&r.call(t,e);const i=t.delete(e);return o&&L(t,"delete",e,void 0),i}function te(){const e=Oe(this),t=0!==e.size,n=e.clear();return t&&L(e,"clear",void 0,void 0),n}function ne(e,t){return function(n,r){const o=this,i=o.__v_raw,s=Oe(i),a=t?Z:e?De:Re;return!e&&T(s,0,g),i.forEach(((e,t)=>n.call(r,a(e),a(t),o)))}}function re(e,t,n){return function(...o){const i=this.__v_raw,s=Oe(i),a=(0,r._N)(s),l="entries"===e||e===Symbol.iterator&&a,c="keys"===e&&a,u=i[e](...o),d=n?Z:t?De:Re;return!t&&T(s,0,c?b:g),{next(){const{value:e,done:t}=u.next();return t?{value:e,done:t}:{value:l?[d(e[0]),d(e[1])]:d(e),done:t}},[Symbol.iterator](){return this}}}}function oe(e){return function(...t){return"delete"!==e&&this}}function ie(){const e={get(e){return G(this,e)},get size(){return K(this)},has:J,add:X,set:Q,delete:ee,clear:te,forEach:ne(!1,!1)},t={get(e){return G(this,e,!1,!0)},get size(){return K(this)},has:J,add:X,set:Q,delete:ee,clear:te,forEach:ne(!1,!0)},n={get(e){return G(this,e,!0)},get size(){return K(this,!0)},has(e){return J.call(this,e,!0)},add:oe("add"),set:oe("set"),delete:oe("delete"),clear:oe("clear"),forEach:ne(!0,!1)},r={get(e){return G(this,e,!0,!0)},get size(){return K(this,!0)},has(e){return J.call(this,e,!0)},add:oe("add"),set:oe("set"),delete:oe("delete"),clear:oe("clear"),forEach:ne(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach((o=>{e[o]=re(o,!1,!1),n[o]=re(o,!0,!1),t[o]=re(o,!1,!0),r[o]=re(o,!0,!0)})),[e,n,t,r]}const[se,ae,le,ce]=ie();function ue(e,t){const n=t?e?ce:le:e?ae:se;return(t,o,i)=>"__v_isReactive"===o?!e:"__v_isReadonly"===o?e:"__v_raw"===o?t:Reflect.get((0,r.RI)(n,o)&&o in t?n:t,o,i)}const de={get:ue(!1,!1)},fe={get:ue(!1,!0)},he={get:ue(!0,!1)},pe={get:ue(!0,!0)},me=new WeakMap,ve=new WeakMap,ge=new WeakMap,be=new WeakMap;function ye(e){return Ce(e)?e:Se(e,!1,V,de,me)}function we(e){return Se(e,!1,$,fe,ve)}function xe(e){return Se(e,!0,q,he,ge)}function ke(e){return Se(e,!0,U,pe,be)}function Se(e,t,n,o,i){if(!(0,r.Kn)(e))return e;if(e.__v_raw&&(!t||!e.__v_isReactive))return e;const s=i.get(e);if(s)return s;const a=(l=e).__v_skip||!Object.isExtensible(l)?0:function(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}((0,r.W7)(l));var l;if(0===a)return e;const c=new Proxy(e,2===a?o:n);return i.set(e,c),c}function Ee(e){return Ce(e)?Ee(e.__v_raw):!(!e||!e.__v_isReactive)}function Ce(e){return!(!e||!e.__v_isReadonly)}function _e(e){return!(!e||!e.__v_isShallow)}function Te(e){return Ee(e)||Ce(e)}function Oe(e){const t=e&&e.__v_raw;return t?Oe(t):e}function Le(e){return(0,r.Nj)(e,"__v_skip",!0),e}const Re=e=>(0,r.Kn)(e)?ye(e):e,De=e=>(0,r.Kn)(e)?xe(e):e;function Ae(e){S&&p&&O((e=Oe(e)).dep||(e.dep=u()))}function Ie(e,t){(e=Oe(e)).dep&&R(e.dep)}function Me(e){return!(!e||!0!==e.__v_isRef)}function Fe(e){return He(e,!1)}function Pe(e){return He(e,!0)}function He(e,t){return Me(e)?e:new Ne(e,t)}class Ne{constructor(e,t){this.__v_isShallow=t,this.dep=void 0,this.__v_isRef=!0,this._rawValue=t?e:Oe(e),this._value=t?e:Re(e)}get value(){return Ae(this),this._value}set value(e){e=this.__v_isShallow?e:Oe(e),(0,r.aU)(e,this._rawValue)&&(this._rawValue=e,this._value=this.__v_isShallow?e:Re(e),Ie(this))}}function je(e){Ie(e)}function We(e){return Me(e)?e.value:e}const Be={get:(e,t,n)=>We(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const o=e[t];return Me(o)&&!Me(n)?(o.value=n,!0):Reflect.set(e,t,n,r)}};function ze(e){return Ee(e)?e:new Proxy(e,Be)}class Ve{constructor(e){this.dep=void 0,this.__v_isRef=!0;const{get:t,set:n}=e((()=>Ae(this)),(()=>Ie(this)));this._get=t,this._set=n}get value(){return this._get()}set value(e){this._set(e)}}function qe(e){return new Ve(e)}function $e(e){const t=(0,r.kJ)(e)?new Array(e.length):{};for(const n in e)t[n]=Ze(e,n);return t}class Ue{constructor(e,t,n){this._object=e,this._key=t,this._defaultValue=n,this.__v_isRef=!0}get value(){const e=this._object[this._key];return void 0===e?this._defaultValue:e}set value(e){this._object[this._key]=e}}function Ze(e,t,n){const r=e[t];return Me(r)?r:new Ue(e,t,n)}class Ye{constructor(e,t,n,r){this._setter=t,this.dep=void 0,this.__v_isRef=!0,this._dirty=!0,this.effect=new y(e,(()=>{this._dirty||(this._dirty=!0,Ie(this))})),this.effect.computed=this,this.effect.active=this._cacheable=!r,this.__v_isReadonly=n}get value(){const e=Oe(this);return Ae(e),!e._dirty&&e._cacheable||(e._dirty=!1,e._value=e.effect.run()),e._value}set value(e){this._setter(e)}}function Ge(e,t,n=!1){let o,i;const s=(0,r.mf)(e);return s?(o=e,i=r.dG):(o=e.get,i=e.set),new Ye(o,i,s||!i,n)}Promise.resolve()},6252:(e,t,n)=>{"use strict";n.d(t,{Bj:()=>r.Bj,qq:()=>r.qq,ZM:()=>r.ZM,cE:()=>r.cE,B:()=>r.B,nZ:()=>r.nZ,X3:()=>r.X3,PG:()=>r.PG,$y:()=>r.$y,dq:()=>r.dq,yT:()=>r.yT,Xl:()=>r.Xl,EB:()=>r.EB,WL:()=>r.WL,qj:()=>r.qj,OT:()=>r.OT,iH:()=>r.iH,Um:()=>r.Um,YS:()=>r.YS,XI:()=>r.XI,sT:()=>r.sT,IU:()=>r.IU,Vh:()=>r.Vh,BK:()=>r.BK,oR:()=>r.oR,SU:()=>r.SU,_A:()=>o._A,kC:()=>o.kC,C_:()=>o.C_,vs:()=>o.vs,j5:()=>o.j5,zw:()=>o.zw,hR:()=>o.hR,P$:()=>be,sv:()=>Yt,HY:()=>Ut,Ob:()=>Re,qG:()=>Gt,n4:()=>Q,lR:()=>Nt,xv:()=>Zt,$d:()=>u,KU:()=>c,Ho:()=>vn,ry:()=>xr,Fl:()=>tr,j4:()=>sn,kq:()=>yn,iD:()=>on,_:()=>hn,Eo:()=>Rt,p1:()=>ur,Us:()=>Lt,Nv:()=>_n,uE:()=>bn,Uk:()=>gn,Wm:()=>pn,RC:()=>Te,aZ:()=>Ce,Bz:()=>rr,WY:()=>or,MW:()=>nr,mW:()=>M,FN:()=>Nn,Q6:()=>Ee,F4:()=>mn,h:()=>fr,S3:()=>d,Mr:()=>mr,f3:()=>se,nQ:()=>gr,of:()=>Yn,lA:()=>an,u_:()=>cr,dG:()=>Sn,Y3:()=>C,dl:()=>Ae,wF:()=>We,Jd:()=>qe,Xn:()=>ze,se:()=>Ie,d1:()=>Ge,bv:()=>Be,bT:()=>Ye,Yq:()=>Ze,vl:()=>Ue,Ah:()=>$e,ic:()=>Ve,wg:()=>Xt,Cn:()=>$,JJ:()=>ie,dD:()=>q,qb:()=>L,Y1:()=>Zn,Ko:()=>Cn,WI:()=>Tn,up:()=>Wt,Q2:()=>Vt,LL:()=>zt,eq:()=>wr,U2:()=>we,qZ:()=>nn,ec:()=>H,nK:()=>Se,Uc:()=>hr,G:()=>yr,mx:()=>Ln,C3:()=>cn,l1:()=>ar,Zq:()=>pr,Rr:()=>sr,Y8:()=>ve,i8:()=>br,ZK:()=>s,YP:()=>de,m0:()=>ae,Rh:()=>le,yX:()=>ce,mv:()=>dr,w5:()=>Z,b9:()=>ir,wy:()=>bt,MX:()=>vr,HX:()=>U});var r=n(2262),o=n(3577);const i=[];function s(e,...t){(0,r.Jd)();const n=i.length?i[i.length-1].component:null,o=n&&n.appContext.config.warnHandler,s=function(){let e=i[i.length-1];if(!e)return[];const t=[];for(;e;){const n=t[0];n&&n.vnode===e?n.recurseCount++:t.push({vnode:e,recurseCount:0});const r=e.component&&e.component.parent;e=r&&r.vnode}return t}();if(o)c(o,n,11,[e+t.join(""),n&&n.proxy,s.map((({vnode:e})=>`at <${er(n,e.type)}>`)).join("\n"),s]);else{const n=[`[Vue warn]: ${e}`,...t];s.length&&n.push("\n",...function(e){const t=[];return e.forEach(((e,n)=>{t.push(...0===n?[]:["\n"],...function({vnode:e,recurseCount:t}){const n=t>0?`... (${t} recursive calls)`:"",r=!!e.component&&null==e.component.parent,o=` at <${er(e.component,e.type,r)}`,i=">"+n;return e.props?[o,...a(e.props),i]:[o+i]}(e))})),t}(s)),console.warn(...n)}(0,r.lk)()}function a(e){const t=[],n=Object.keys(e);return n.slice(0,3).forEach((n=>{t.push(...l(n,e[n]))})),n.length>3&&t.push(" ..."),t}function l(e,t,n){return(0,o.HD)(t)?(t=JSON.stringify(t),n?t:[`${e}=${t}`]):"number"==typeof t||"boolean"==typeof t||null==t?n?t:[`${e}=${t}`]:(0,r.dq)(t)?(t=l(e,(0,r.IU)(t.value),!0),n?t:[`${e}=Ref<`,t,">"]):(0,o.mf)(t)?[`${e}=fn${t.name?`<${t.name}>`:""}`]:(t=(0,r.IU)(t),n?t:[`${e}=`,t])}function c(e,t,n,r){let o;try{o=r?e(...r):e()}catch(e){d(e,t,n)}return o}function u(e,t,n,r){if((0,o.mf)(e)){const i=c(e,t,n,r);return i&&(0,o.tI)(i)&&i.catch((e=>{d(e,t,n)})),i}const i=[];for(let o=0;o<e.length;o++)i.push(u(e[o],t,n,r));return i}function d(e,t,n,r=!0){if(t&&t.vnode,t){let r=t.parent;const o=t.proxy,i=n;for(;r;){const t=r.ec;if(t)for(let n=0;n<t.length;n++)if(!1===t[n](e,o,i))return;r=r.parent}const s=t.appContext.config.errorHandler;if(s)return void c(s,null,10,[e,o,i])}!function(e,t,n,r=!0){console.error(e)}(e,0,0,r)}let f=!1,h=!1;const p=[];let m=0;const v=[];let g=null,b=0;const y=[];let w=null,x=0;const k=Promise.resolve();let S=null,E=null;function C(e){const t=S||k;return e?t.then(this?e.bind(this):e):t}function _(e){p.length&&p.includes(e,f&&e.allowRecurse?m+1:m)||e===E||(null==e.id?p.push(e):p.splice(function(e){let t=m+1,n=p.length;for(;t<n;){const r=t+n>>>1;A(p[r])<e?t=r+1:n=r}return t}(e.id),0,e),T())}function T(){f||h||(h=!0,S=k.then(I))}function O(e,t,n,r){(0,o.kJ)(e)?n.push(...e):t&&t.includes(e,e.allowRecurse?r+1:r)||n.push(e),T()}function L(e){O(e,w,y,x)}function R(e,t=null){if(v.length){for(E=t,g=[...new Set(v)],v.length=0,b=0;b<g.length;b++)g[b]();g=null,b=0,E=null,R(e,t)}}function D(e){if(y.length){const e=[...new Set(y)];if(y.length=0,w)return void w.push(...e);for(w=e,w.sort(((e,t)=>A(e)-A(t))),x=0;x<w.length;x++)w[x]();w=null,x=0}}const A=e=>null==e.id?1/0:e.id;function I(e){h=!1,f=!0,R(e),p.sort(((e,t)=>A(e)-A(t))),o.dG;try{for(m=0;m<p.length;m++){const e=p[m];e&&!1!==e.active&&c(e,null,14)}}finally{m=0,p.length=0,D(),f=!1,S=null,(p.length||v.length||y.length)&&I(e)}}new Set,new Map;let M,F=[],P=!1;function H(e,t){var n,r;M=e,M?(M.enabled=!0,F.forEach((({event:e,args:t})=>M.emit(e,...t))),F=[]):"undefined"!=typeof window&&window.HTMLElement&&!(null===(r=null===(n=window.navigator)||void 0===n?void 0:n.userAgent)||void 0===r?void 0:r.includes("jsdom"))?((t.__VUE_DEVTOOLS_HOOK_REPLAY__=t.__VUE_DEVTOOLS_HOOK_REPLAY__||[]).push((e=>{H(e,t)})),setTimeout((()=>{M||(t.__VUE_DEVTOOLS_HOOK_REPLAY__=null,P=!0,F=[])}),3e3)):(P=!0,F=[])}function N(e,t,...n){const r=e.vnode.props||o.kT;let i=n;const s=t.startsWith("update:"),a=s&&t.slice(7);if(a&&a in r){const e=`${"modelValue"===a?"model":a}Modifiers`,{number:t,trim:s}=r[e]||o.kT;s?i=n.map((e=>e.trim())):t&&(i=n.map(o.He))}let l,c=r[l=(0,o.hR)(t)]||r[l=(0,o.hR)((0,o._A)(t))];!c&&s&&(c=r[l=(0,o.hR)((0,o.rs)(t))]),c&&u(c,e,6,i);const d=r[l+"Once"];if(d){if(e.emitted){if(e.emitted[l])return}else e.emitted={};e.emitted[l]=!0,u(d,e,6,i)}}function j(e,t,n=!1){const r=t.emitsCache,i=r.get(e);if(void 0!==i)return i;const s=e.emits;let a={},l=!1;if(!(0,o.mf)(e)){const r=e=>{const n=j(e,t,!0);n&&(l=!0,(0,o.l7)(a,n))};!n&&t.mixins.length&&t.mixins.forEach(r),e.extends&&r(e.extends),e.mixins&&e.mixins.forEach(r)}return s||l?((0,o.kJ)(s)?s.forEach((e=>a[e]=null)):(0,o.l7)(a,s),r.set(e,a),a):(r.set(e,null),null)}function W(e,t){return!(!e||!(0,o.F7)(t))&&(t=t.slice(2).replace(/Once$/,""),(0,o.RI)(e,t[0].toLowerCase()+t.slice(1))||(0,o.RI)(e,(0,o.rs)(t))||(0,o.RI)(e,t))}let B=null,z=null;function V(e){const t=B;return B=e,z=e&&e.type.__scopeId||null,t}function q(e){z=e}function $(){z=null}const U=e=>Z;function Z(e,t=B,n){if(!t)return e;if(e._n)return e;const r=(...n)=>{r._d&&nn(-1);const o=V(t),i=e(...n);return V(o),r._d&&nn(1),i};return r._n=!0,r._c=!0,r._d=!0,r}function Y(e){const{type:t,vnode:n,proxy:r,withProxy:i,props:s,propsOptions:[a],slots:l,attrs:c,emit:u,render:f,renderCache:h,data:p,setupState:m,ctx:v,inheritAttrs:g}=e;let b,y;const w=V(e);try{if(4&n.shapeFlag){const e=i||r;b=wn(f.call(e,e,h,s,m,p,v)),y=c}else{const e=t;b=wn(e.length>1?e(s,{attrs:c,slots:l,emit:u}):e(s,null)),y=t.props?c:G(c)}}catch(t){Jt.length=0,d(t,e,1),b=pn(Yt)}let x=b;if(y&&!1!==g){const e=Object.keys(y),{shapeFlag:t}=x;e.length&&7&t&&(a&&e.some(o.tR)&&(y=J(y,a)),x=vn(x,y))}return n.dirs&&(x.dirs=x.dirs?x.dirs.concat(n.dirs):n.dirs),n.transition&&(x.transition=n.transition),b=x,V(w),b}const G=e=>{let t;for(const n in e)("class"===n||"style"===n||(0,o.F7)(n))&&((t||(t={}))[n]=e[n]);return t},J=(e,t)=>{const n={};for(const r in e)(0,o.tR)(r)&&r.slice(9)in t||(n[r]=e[r]);return n};function K(e,t,n){const r=Object.keys(t);if(r.length!==Object.keys(e).length)return!0;for(let o=0;o<r.length;o++){const i=r[o];if(t[i]!==e[i]&&!W(n,i))return!0}return!1}function X({vnode:e,parent:t},n){for(;t&&t.subTree===e;)(e=t.vnode).el=n,t=t.parent}const Q={name:"Suspense",__isSuspense:!0,process(e,t,n,r,o,i,s,a,l,c){null==e?function(e,t,n,r,o,i,s,a,l){const{p:c,o:{createElement:u}}=l,d=u("div"),f=e.suspense=te(e,o,r,t,d,n,i,s,a,l);c(null,f.pendingBranch=e.ssContent,d,null,r,f,i,s),f.deps>0?(ee(e,"onPending"),ee(e,"onFallback"),c(null,e.ssFallback,t,n,r,null,i,s),oe(f,e.ssFallback)):f.resolve()}(t,n,r,o,i,s,a,l,c):function(e,t,n,r,o,i,s,a,{p:l,um:c,o:{createElement:u}}){const d=t.suspense=e.suspense;d.vnode=t,t.el=e.el;const f=t.ssContent,h=t.ssFallback,{activeBranch:p,pendingBranch:m,isInFallback:v,isHydrating:g}=d;if(m)d.pendingBranch=f,ln(f,m)?(l(m,f,d.hiddenContainer,null,o,d,i,s,a),d.deps<=0?d.resolve():v&&(l(p,h,n,r,o,null,i,s,a),oe(d,h))):(d.pendingId++,g?(d.isHydrating=!1,d.activeBranch=m):c(m,o,d),d.deps=0,d.effects.length=0,d.hiddenContainer=u("div"),v?(l(null,f,d.hiddenContainer,null,o,d,i,s,a),d.deps<=0?d.resolve():(l(p,h,n,r,o,null,i,s,a),oe(d,h))):p&&ln(f,p)?(l(p,f,n,r,o,d,i,s,a),d.resolve(!0)):(l(null,f,d.hiddenContainer,null,o,d,i,s,a),d.deps<=0&&d.resolve()));else if(p&&ln(f,p))l(p,f,n,r,o,d,i,s,a),oe(d,f);else if(ee(t,"onPending"),d.pendingBranch=f,d.pendingId++,l(null,f,d.hiddenContainer,null,o,d,i,s,a),d.deps<=0)d.resolve();else{const{timeout:e,pendingId:t}=d;e>0?setTimeout((()=>{d.pendingId===t&&d.fallback(h)}),e):0===e&&d.fallback(h)}}(e,t,n,r,o,s,a,l,c)},hydrate:function(e,t,n,r,o,i,s,a,l){const c=t.suspense=te(t,r,n,e.parentNode,document.createElement("div"),null,o,i,s,a,!0),u=l(e,c.pendingBranch=t.ssContent,n,c,i,s);return 0===c.deps&&c.resolve(),u},create:te,normalize:function(e){const{shapeFlag:t,children:n}=e,r=32&t;e.ssContent=ne(r?n.default:n),e.ssFallback=r?ne(n.fallback):pn(Yt)}};function ee(e,t){const n=e.props&&e.props[t];(0,o.mf)(n)&&n()}function te(e,t,n,r,i,s,a,l,c,u,f=!1){const{p:h,m:p,um:m,n:v,o:{parentNode:g,remove:b}}=u,y=(0,o.He)(e.props&&e.props.timeout),w={vnode:e,parent:t,parentComponent:n,isSVG:a,container:r,hiddenContainer:i,anchor:s,deps:0,pendingId:0,timeout:"number"==typeof y?y:-1,activeBranch:null,pendingBranch:null,isInFallback:!0,isHydrating:f,isUnmounted:!1,effects:[],resolve(e=!1){const{vnode:t,activeBranch:n,pendingBranch:r,pendingId:o,effects:i,parentComponent:s,container:a}=w;if(w.isHydrating)w.isHydrating=!1;else if(!e){const e=n&&r.transition&&"out-in"===r.transition.mode;e&&(n.transition.afterLeave=()=>{o===w.pendingId&&p(r,a,t,0)});let{anchor:t}=w;n&&(t=v(n),m(n,s,w,!0)),e||p(r,a,t,0)}oe(w,r),w.pendingBranch=null,w.isInFallback=!1;let l=w.parent,c=!1;for(;l;){if(l.pendingBranch){l.effects.push(...i),c=!0;break}l=l.parent}c||L(i),w.effects=[],ee(t,"onResolve")},fallback(e){if(!w.pendingBranch)return;const{vnode:t,activeBranch:n,parentComponent:r,container:o,isSVG:i}=w;ee(t,"onFallback");const s=v(n),a=()=>{w.isInFallback&&(h(null,e,o,s,r,null,i,l,c),oe(w,e))},u=e.transition&&"out-in"===e.transition.mode;u&&(n.transition.afterLeave=a),w.isInFallback=!0,m(n,r,null,!0),u||a()},move(e,t,n){w.activeBranch&&p(w.activeBranch,e,t,n),w.container=e},next:()=>w.activeBranch&&v(w.activeBranch),registerDep(e,t){const n=!!w.pendingBranch;n&&w.deps++;const r=e.vnode.el;e.asyncDep.catch((t=>{d(t,e,0)})).then((o=>{if(e.isUnmounted||w.isUnmounted||w.pendingId!==e.suspenseId)return;e.asyncResolved=!0;const{vnode:i}=e;Un(e,o,!1),r&&(i.el=r);const s=!r&&e.subTree.el;t(e,i,g(r||e.subTree.el),r?null:v(e.subTree),w,a,c),s&&b(s),X(e,i.el),n&&0==--w.deps&&w.resolve()}))},unmount(e,t){w.isUnmounted=!0,w.activeBranch&&m(w.activeBranch,n,e,t),w.pendingBranch&&m(w.pendingBranch,n,e,t)}};return w}function ne(e){let t;if((0,o.mf)(e)){const n=tn&&e._c;n&&(e._d=!1,Xt()),e=e(),n&&(e._d=!0,t=Kt,Qt())}if((0,o.kJ)(e)){const t=function(e){let t;for(let n=0;n<e.length;n++){const r=e[n];if(!an(r))return;if(r.type!==Yt||"v-if"===r.children){if(t)return;t=r}}return t}(e);e=t}return e=wn(e),t&&!e.dynamicChildren&&(e.dynamicChildren=t.filter((t=>t!==e))),e}function re(e,t){t&&t.pendingBranch?(0,o.kJ)(e)?t.effects.push(...e):t.effects.push(e):L(e)}function oe(e,t){e.activeBranch=t;const{vnode:n,parentComponent:r}=e,o=n.el=t.el;r&&r.subTree===n&&(r.vnode.el=o,X(r,o))}function ie(e,t){if(Hn){let n=Hn.provides;const r=Hn.parent&&Hn.parent.provides;r===n&&(n=Hn.provides=Object.create(r)),n[e]=t}}function se(e,t,n=!1){const r=Hn||B;if(r){const i=null==r.parent?r.vnode.appContext&&r.vnode.appContext.provides:r.parent.provides;if(i&&e in i)return i[e];if(arguments.length>1)return n&&(0,o.mf)(t)?t.call(r.proxy):t}}function ae(e,t){return fe(e,null,t)}function le(e,t){return fe(e,null,{flush:"post"})}function ce(e,t){return fe(e,null,{flush:"sync"})}const ue={};function de(e,t,n){return fe(e,t,n)}function fe(e,t,{immediate:n,deep:i,flush:s,onTrack:a,onTrigger:l}=o.kT){const d=Hn;let f,h,p=!1,m=!1;if((0,r.dq)(e)?(f=()=>e.value,p=(0,r.yT)(e)):(0,r.PG)(e)?(f=()=>e,i=!0):(0,o.kJ)(e)?(m=!0,p=e.some(r.PG),f=()=>e.map((e=>(0,r.dq)(e)?e.value:(0,r.PG)(e)?me(e):(0,o.mf)(e)?c(e,d,2):void 0))):f=(0,o.mf)(e)?t?()=>c(e,d,2):()=>{if(!d||!d.isUnmounted)return h&&h(),u(e,d,3,[y])}:o.dG,t&&i){const e=f;f=()=>me(e())}let y=e=>{h=S.onStop=()=>{c(e,d,4)}};if(qn)return y=o.dG,t?n&&u(t,d,3,[f(),m?[]:void 0,y]):f(),o.dG;let w=m?[]:ue;const x=()=>{if(S.active)if(t){const e=S.run();(i||p||(m?e.some(((e,t)=>(0,o.aU)(e,w[t]))):(0,o.aU)(e,w)))&&(h&&h(),u(t,d,3,[e,w===ue?void 0:w,y]),w=e)}else S.run()};let k;x.allowRecurse=!!t,k="sync"===s?x:"post"===s?()=>Ot(x,d&&d.suspense):()=>{!d||d.isMounted?function(e){O(e,g,v,b)}(x):x()};const S=new r.qq(f,k);return t?n?x():w=S.run():"post"===s?Ot(S.run.bind(S),d&&d.suspense):S.run(),()=>{S.stop(),d&&d.scope&&(0,o.Od)(d.scope.effects,S)}}function he(e,t,n){const r=this.proxy,i=(0,o.HD)(e)?e.includes(".")?pe(r,e):()=>r[e]:e.bind(r,r);let s;(0,o.mf)(t)?s=t:(s=t.handler,n=t);const a=Hn;jn(this);const l=fe(i,s.bind(r),n);return a?jn(a):Wn(),l}function pe(e,t){const n=t.split(".");return()=>{let t=e;for(let e=0;e<n.length&&t;e++)t=t[n[e]];return t}}function me(e,t){if(!(0,o.Kn)(e)||e.__v_skip)return e;if((t=t||new Set).has(e))return e;if(t.add(e),(0,r.dq)(e))me(e.value,t);else if((0,o.kJ)(e))for(let n=0;n<e.length;n++)me(e[n],t);else if((0,o.DM)(e)||(0,o._N)(e))e.forEach((e=>{me(e,t)}));else if((0,o.PO)(e))for(const n in e)me(e[n],t);return e}function ve(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Be((()=>{e.isMounted=!0})),qe((()=>{e.isUnmounting=!0})),e}const ge=[Function,Array],be={name:"BaseTransition",props:{mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:ge,onEnter:ge,onAfterEnter:ge,onEnterCancelled:ge,onBeforeLeave:ge,onLeave:ge,onAfterLeave:ge,onLeaveCancelled:ge,onBeforeAppear:ge,onAppear:ge,onAfterAppear:ge,onAppearCancelled:ge},setup(e,{slots:t}){const n=Nn(),o=ve();let i;return()=>{const s=t.default&&Ee(t.default(),!0);if(!s||!s.length)return;const a=(0,r.IU)(e),{mode:l}=a,c=s[0];if(o.isLeaving)return xe(c);const u=ke(c);if(!u)return xe(c);const d=we(u,a,o,n);Se(u,d);const f=n.subTree,h=f&&ke(f);let p=!1;const{getTransitionKey:m}=u.type;if(m){const e=m();void 0===i?i=e:e!==i&&(i=e,p=!0)}if(h&&h.type!==Yt&&(!ln(u,h)||p)){const e=we(h,a,o,n);if(Se(h,e),"out-in"===l)return o.isLeaving=!0,e.afterLeave=()=>{o.isLeaving=!1,n.update()},xe(c);"in-out"===l&&u.type!==Yt&&(e.delayLeave=(e,t,n)=>{ye(o,h)[String(h.key)]=h,e._leaveCb=()=>{t(),e._leaveCb=void 0,delete d.delayedLeave},d.delayedLeave=n})}return c}}};function ye(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 we(e,t,n,r){const{appear:o,mode:i,persisted:s=!1,onBeforeEnter:a,onEnter:l,onAfterEnter:c,onEnterCancelled:d,onBeforeLeave:f,onLeave:h,onAfterLeave:p,onLeaveCancelled:m,onBeforeAppear:v,onAppear:g,onAfterAppear:b,onAppearCancelled:y}=t,w=String(e.key),x=ye(n,e),k=(e,t)=>{e&&u(e,r,9,t)},S={mode:i,persisted:s,beforeEnter(t){let r=a;if(!n.isMounted){if(!o)return;r=v||a}t._leaveCb&&t._leaveCb(!0);const i=x[w];i&&ln(e,i)&&i.el._leaveCb&&i.el._leaveCb(),k(r,[t])},enter(e){let t=l,r=c,i=d;if(!n.isMounted){if(!o)return;t=g||l,r=b||c,i=y||d}let s=!1;const a=e._enterCb=t=>{s||(s=!0,k(t?i:r,[e]),S.delayedLeave&&S.delayedLeave(),e._enterCb=void 0)};t?(t(e,a),t.length<=1&&a()):a()},leave(t,r){const o=String(e.key);if(t._enterCb&&t._enterCb(!0),n.isUnmounting)return r();k(f,[t]);let i=!1;const s=t._leaveCb=n=>{i||(i=!0,r(),k(n?m:p,[t]),t._leaveCb=void 0,x[o]===e&&delete x[o])};x[o]=e,h?(h(t,s),h.length<=1&&s()):s()},clone:e=>we(e,t,n,r)};return S}function xe(e){if(Le(e))return(e=vn(e)).children=null,e}function ke(e){return Le(e)?e.children?e.children[0]:void 0:e}function Se(e,t){6&e.shapeFlag&&e.component?Se(e.component.subTree,t):128&e.shapeFlag?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Ee(e,t=!1){let n=[],r=0;for(let o=0;o<e.length;o++){const i=e[o];i.type===Ut?(128&i.patchFlag&&r++,n=n.concat(Ee(i.children,t))):(t||i.type!==Yt)&&n.push(i)}if(r>1)for(let e=0;e<n.length;e++)n[e].patchFlag=-2;return n}function Ce(e){return(0,o.mf)(e)?{setup:e,name:e.name}:e}const _e=e=>!!e.type.__asyncLoader;function Te(e){(0,o.mf)(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:i,delay:s=200,timeout:a,suspensible:l=!0,onError:c}=e;let u,f=null,h=0;const p=()=>{let e;return f||(e=f=t().catch((e=>{if(e=e instanceof Error?e:new Error(String(e)),c)return new Promise(((t,n)=>{c(e,(()=>t((h++,f=null,p()))),(()=>n(e)),h+1)}));throw e})).then((t=>e!==f&&f?f:(t&&(t.__esModule||"Module"===t[Symbol.toStringTag])&&(t=t.default),u=t,t))))};return Ce({name:"AsyncComponentWrapper",__asyncLoader:p,get __asyncResolved(){return u},setup(){const e=Hn;if(u)return()=>Oe(u,e);const t=t=>{f=null,d(t,e,13,!i)};if(l&&e.suspense||qn)return p().then((t=>()=>Oe(t,e))).catch((e=>(t(e),()=>i?pn(i,{error:e}):null)));const o=(0,r.iH)(!1),c=(0,r.iH)(),h=(0,r.iH)(!!s);return s&&setTimeout((()=>{h.value=!1}),s),null!=a&&setTimeout((()=>{if(!o.value&&!c.value){const e=new Error(`Async component timed out after ${a}ms.`);t(e),c.value=e}}),a),p().then((()=>{o.value=!0,e.parent&&Le(e.parent.vnode)&&_(e.parent.update)})).catch((e=>{t(e),c.value=e})),()=>o.value&&u?Oe(u,e):c.value&&i?pn(i,{error:c.value}):n&&!h.value?pn(n):void 0}})}function Oe(e,{vnode:{ref:t,props:n,children:r}}){const o=pn(e,n,r);return o.ref=t,o}const Le=e=>e.type.__isKeepAlive,Re={name:"KeepAlive",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(e,{slots:t}){const n=Nn(),r=n.ctx;if(!r.renderer)return t.default;const i=new Map,s=new Set;let a=null;const l=n.suspense,{renderer:{p:c,m:u,um:d,o:{createElement:f}}}=r,h=f("div");function p(e){Pe(e),d(e,n,l,!0)}function m(e){i.forEach(((t,n)=>{const r=Qn(t.type);!r||e&&e(r)||v(n)}))}function v(e){const t=i.get(e);a&&t.type===a.type?a&&Pe(a):p(t),i.delete(e),s.delete(e)}r.activate=(e,t,n,r,i)=>{const s=e.component;u(e,t,n,0,l),c(s.vnode,e,t,n,s,l,r,e.slotScopeIds,i),Ot((()=>{s.isDeactivated=!1,s.a&&(0,o.ir)(s.a);const t=e.props&&e.props.onVnodeMounted;t&&En(t,s.parent,e)}),l)},r.deactivate=e=>{const t=e.component;u(e,h,null,1,l),Ot((()=>{t.da&&(0,o.ir)(t.da);const n=e.props&&e.props.onVnodeUnmounted;n&&En(n,t.parent,e),t.isDeactivated=!0}),l)},de((()=>[e.include,e.exclude]),(([e,t])=>{e&&m((t=>De(e,t))),t&&m((e=>!De(t,e)))}),{flush:"post",deep:!0});let g=null;const b=()=>{null!=g&&i.set(g,He(n.subTree))};return Be(b),Ve(b),qe((()=>{i.forEach((e=>{const{subTree:t,suspense:r}=n,o=He(t);if(e.type!==o.type)p(e);else{Pe(o);const e=o.component.da;e&&Ot(e,r)}}))})),()=>{if(g=null,!t.default)return null;const n=t.default(),r=n[0];if(n.length>1)return a=null,n;if(!an(r)||!(4&r.shapeFlag||128&r.shapeFlag))return a=null,r;let o=He(r);const l=o.type,c=Qn(_e(o)?o.type.__asyncResolved||{}:l),{include:u,exclude:d,max:f}=e;if(u&&(!c||!De(u,c))||d&&c&&De(d,c))return a=o,r;const h=null==o.key?l:o.key,p=i.get(h);return o.el&&(o=vn(o),128&r.shapeFlag&&(r.ssContent=o)),g=h,p?(o.el=p.el,o.component=p.component,o.transition&&Se(o,o.transition),o.shapeFlag|=512,s.delete(h),s.add(h)):(s.add(h),f&&s.size>parseInt(f,10)&&v(s.values().next().value)),o.shapeFlag|=256,a=o,r}}};function De(e,t){return(0,o.kJ)(e)?e.some((e=>De(e,t))):(0,o.HD)(e)?e.split(",").includes(t):!!e.test&&e.test(t)}function Ae(e,t){Me(e,"a",t)}function Ie(e,t){Me(e,"da",t)}function Me(e,t,n=Hn){const r=e.__wdc||(e.__wdc=()=>{let t=n;for(;t;){if(t.isDeactivated)return;t=t.parent}return e()});if(Ne(t,r,n),n){let e=n.parent;for(;e&&e.parent;)Le(e.parent.vnode)&&Fe(r,t,n,e),e=e.parent}}function Fe(e,t,n,r){const i=Ne(t,e,r,!0);$e((()=>{(0,o.Od)(r[t],i)}),n)}function Pe(e){let t=e.shapeFlag;256&t&&(t-=256),512&t&&(t-=512),e.shapeFlag=t}function He(e){return 128&e.shapeFlag?e.ssContent:e}function Ne(e,t,n=Hn,o=!1){if(n){const i=n[e]||(n[e]=[]),s=t.__weh||(t.__weh=(...o)=>{if(n.isUnmounted)return;(0,r.Jd)(),jn(n);const i=u(t,n,e,o);return Wn(),(0,r.lk)(),i});return o?i.unshift(s):i.push(s),s}}const je=e=>(t,n=Hn)=>(!qn||"sp"===e)&&Ne(e,t,n),We=je("bm"),Be=je("m"),ze=je("bu"),Ve=je("u"),qe=je("bum"),$e=je("um"),Ue=je("sp"),Ze=je("rtg"),Ye=je("rtc");function Ge(e,t=Hn){Ne("ec",e,t)}let Je=!0;function Ke(e,t,n){u((0,o.kJ)(e)?e.map((e=>e.bind(t.proxy))):e.bind(t.proxy),t,n)}function Xe(e,t,n,r){const i=r.includes(".")?pe(n,r):()=>n[r];if((0,o.HD)(e)){const n=t[e];(0,o.mf)(n)&&de(i,n)}else if((0,o.mf)(e))de(i,e.bind(n));else if((0,o.Kn)(e))if((0,o.kJ)(e))e.forEach((e=>Xe(e,t,n,r)));else{const r=(0,o.mf)(e.handler)?e.handler.bind(n):t[e.handler];(0,o.mf)(r)&&de(i,r,e)}}function Qe(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:o,optionsCache:i,config:{optionMergeStrategies:s}}=e.appContext,a=i.get(t);let l;return a?l=a:o.length||n||r?(l={},o.length&&o.forEach((e=>et(l,e,s,!0))),et(l,t,s)):l=t,i.set(t,l),l}function et(e,t,n,r=!1){const{mixins:o,extends:i}=t;i&&et(e,i,n,!0),o&&o.forEach((t=>et(e,t,n,!0)));for(const o in t)if(r&&"expose"===o);else{const r=tt[o]||n&&n[o];e[o]=r?r(e[o],t[o]):t[o]}return e}const tt={data:nt,props:it,emits:it,methods:it,computed:it,beforeCreate:ot,created:ot,beforeMount:ot,mounted:ot,beforeUpdate:ot,updated:ot,beforeDestroy:ot,beforeUnmount:ot,destroyed:ot,unmounted:ot,activated:ot,deactivated:ot,errorCaptured:ot,serverPrefetch:ot,components:it,directives:it,watch:function(e,t){if(!e)return t;if(!t)return e;const n=(0,o.l7)(Object.create(null),e);for(const r in t)n[r]=ot(e[r],t[r]);return n},provide:nt,inject:function(e,t){return it(rt(e),rt(t))}};function nt(e,t){return t?e?function(){return(0,o.l7)((0,o.mf)(e)?e.call(this,this):e,(0,o.mf)(t)?t.call(this,this):t)}:t:e}function rt(e){if((0,o.kJ)(e)){const t={};for(let n=0;n<e.length;n++)t[e[n]]=e[n];return t}return e}function ot(e,t){return e?[...new Set([].concat(e,t))]:t}function it(e,t){return e?(0,o.l7)((0,o.l7)(Object.create(null),e),t):t}function st(e,t,n,i){const[s,a]=e.propsOptions;let l,c=!1;if(t)for(let r in t){if((0,o.Gg)(r))continue;const u=t[r];let d;s&&(0,o.RI)(s,d=(0,o._A)(r))?a&&a.includes(d)?(l||(l={}))[d]=u:n[d]=u:W(e.emitsOptions,r)||r in i&&u===i[r]||(i[r]=u,c=!0)}if(a){const t=(0,r.IU)(n),i=l||o.kT;for(let r=0;r<a.length;r++){const l=a[r];n[l]=at(s,t,l,i[l],e,!(0,o.RI)(i,l))}}return c}function at(e,t,n,r,i,s){const a=e[n];if(null!=a){const e=(0,o.RI)(a,"default");if(e&&void 0===r){const e=a.default;if(a.type!==Function&&(0,o.mf)(e)){const{propsDefaults:o}=i;n in o?r=o[n]:(jn(i),r=o[n]=e.call(null,t),Wn())}else r=e}a[0]&&(s&&!e?r=!1:!a[1]||""!==r&&r!==(0,o.rs)(n)||(r=!0))}return r}function lt(e,t,n=!1){const r=t.propsCache,i=r.get(e);if(i)return i;const s=e.props,a={},l=[];let c=!1;if(!(0,o.mf)(e)){const r=e=>{c=!0;const[n,r]=lt(e,t,!0);(0,o.l7)(a,n),r&&l.push(...r)};!n&&t.mixins.length&&t.mixins.forEach(r),e.extends&&r(e.extends),e.mixins&&e.mixins.forEach(r)}if(!s&&!c)return r.set(e,o.Z6),o.Z6;if((0,o.kJ)(s))for(let e=0;e<s.length;e++){const t=(0,o._A)(s[e]);ct(t)&&(a[t]=o.kT)}else if(s)for(const e in s){const t=(0,o._A)(e);if(ct(t)){const n=s[e],r=a[t]=(0,o.kJ)(n)||(0,o.mf)(n)?{type:n}:n;if(r){const e=ft(Boolean,r.type),n=ft(String,r.type);r[0]=e>-1,r[1]=n<0||e<n,(e>-1||(0,o.RI)(r,"default"))&&l.push(t)}}}const u=[a,l];return r.set(e,u),u}function ct(e){return"$"!==e[0]}function ut(e){const t=e&&e.toString().match(/^\s*function (\w+)/);return t?t[1]:null===e?"null":""}function dt(e,t){return ut(e)===ut(t)}function ft(e,t){return(0,o.kJ)(t)?t.findIndex((t=>dt(t,e))):(0,o.mf)(t)&&dt(t,e)?0:-1}const ht=e=>"_"===e[0]||"$stable"===e,pt=e=>(0,o.kJ)(e)?e.map(wn):[wn(e)],mt=(e,t,n)=>{const r=Z(((...e)=>pt(t(...e))),n);return r._c=!1,r},vt=(e,t,n)=>{const r=e._ctx;for(const n in e){if(ht(n))continue;const i=e[n];if((0,o.mf)(i))t[n]=mt(0,i,r);else if(null!=i){const e=pt(i);t[n]=()=>e}}},gt=(e,t)=>{const n=pt(t);e.slots.default=()=>n};function bt(e,t){if(null===B)return e;const n=B.proxy,r=e.dirs||(e.dirs=[]);for(let e=0;e<t.length;e++){let[i,s,a,l=o.kT]=t[e];(0,o.mf)(i)&&(i={mounted:i,updated:i}),i.deep&&me(s),r.push({dir:i,instance:n,value:s,oldValue:void 0,arg:a,modifiers:l})}return e}function yt(e,t,n,o){const i=e.dirs,s=t&&t.dirs;for(let a=0;a<i.length;a++){const l=i[a];s&&(l.oldValue=s[a].value);let c=l.dir[o];c&&((0,r.Jd)(),u(c,n,8,[e.el,l,e,t]),(0,r.lk)())}}function wt(){return{app:null,config:{isNativeTag:o.NO,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 xt=0;function kt(e,t){return function(n,r=null){null==r||(0,o.Kn)(r)||(r=null);const i=wt(),s=new Set;let a=!1;const l=i.app={_uid:xt++,_component:n,_props:r,_container:null,_context:i,_instance:null,version:br,get config(){return i.config},set config(e){},use:(e,...t)=>(s.has(e)||(e&&(0,o.mf)(e.install)?(s.add(e),e.install(l,...t)):(0,o.mf)(e)&&(s.add(e),e(l,...t))),l),mixin:e=>(i.mixins.includes(e)||i.mixins.push(e),l),component:(e,t)=>t?(i.components[e]=t,l):i.components[e],directive:(e,t)=>t?(i.directives[e]=t,l):i.directives[e],mount(o,s,c){if(!a){const u=pn(n,r);return u.appContext=i,s&&t?t(u,o):e(u,o,c),a=!0,l._container=o,o.__vue_app__=l,Kn(u.component)||u.component.proxy}},unmount(){a&&(e(null,l._container),delete l._container.__vue_app__)},provide:(e,t)=>(i.provides[e]=t,l)};return l}}function St(e,t,n,i,s=!1){if((0,o.kJ)(e))return void e.forEach(((e,r)=>St(e,t&&((0,o.kJ)(t)?t[r]:t),n,i,s)));if(_e(i)&&!s)return;const a=4&i.shapeFlag?Kn(i.component)||i.component.proxy:i.el,l=s?null:a,{i:u,r:d}=e,f=t&&t.r,h=u.refs===o.kT?u.refs={}:u.refs,p=u.setupState;if(null!=f&&f!==d&&((0,o.HD)(f)?(h[f]=null,(0,o.RI)(p,f)&&(p[f]=null)):(0,r.dq)(f)&&(f.value=null)),(0,o.mf)(d))c(d,u,12,[l,h]);else{const t=(0,o.HD)(d),i=(0,r.dq)(d);if(t||i){const i=()=>{if(e.f){const n=t?h[d]:d.value;s?(0,o.kJ)(n)&&(0,o.Od)(n,a):(0,o.kJ)(n)?n.includes(a)||n.push(a):t?h[d]=[a]:(d.value=[a],e.k&&(h[e.k]=d.value))}else t?(h[d]=l,(0,o.RI)(p,d)&&(p[d]=l)):(0,r.dq)(d)&&(d.value=l,e.k&&(h[e.k]=l))};l?(i.id=-1,Ot(i,n)):i()}}}let Et=!1;const Ct=e=>/svg/.test(e.namespaceURI)&&"foreignObject"!==e.tagName,_t=e=>8===e.nodeType;function Tt(e){const{mt:t,p:n,o:{patchProp:r,nextSibling:i,parentNode:s,remove:a,insert:l,createComment:c}}=e,u=(n,r,o,a,l,c=!1)=>{const v=_t(n)&&"["===n.data,g=()=>p(n,r,o,a,l,v),{type:b,ref:y,shapeFlag:w}=r,x=n.nodeType;r.el=n;let k=null;switch(b){case Zt:3!==x?k=g():(n.data!==r.children&&(Et=!0,n.data=r.children),k=i(n));break;case Yt:k=8!==x||v?g():i(n);break;case Gt:if(1===x){k=n;const e=!r.children.length;for(let t=0;t<r.staticCount;t++)e&&(r.children+=k.outerHTML),t===r.staticCount-1&&(r.anchor=k),k=i(k);return k}k=g();break;case Ut:k=v?h(n,r,o,a,l,c):g();break;default:if(1&w)k=1!==x||r.type.toLowerCase()!==n.tagName.toLowerCase()?g():d(n,r,o,a,l,c);else if(6&w){r.slotScopeIds=l;const e=s(n);if(t(r,e,null,o,a,Ct(e),c),k=v?m(n):i(n),_e(r)){let t;v?(t=pn(Ut),t.anchor=k?k.previousSibling:e.lastChild):t=3===n.nodeType?gn(""):pn("div"),t.el=n,r.component.subTree=t}}else 64&w?k=8!==x?g():r.type.hydrate(n,r,o,a,l,c,e,f):128&w&&(k=r.type.hydrate(n,r,o,a,Ct(s(n)),l,c,e,u))}return null!=y&&St(y,null,a,r),k},d=(e,t,n,i,s,l)=>{l=l||!!t.dynamicChildren;const{type:c,props:u,patchFlag:d,shapeFlag:h,dirs:p}=t,m="input"===c&&p||"option"===c;if(m||-1!==d){if(p&&yt(t,null,n,"created"),u)if(m||!l||48&d)for(const t in u)(m&&t.endsWith("value")||(0,o.F7)(t)&&!(0,o.Gg)(t))&&r(e,t,null,u[t],!1,void 0,n);else u.onClick&&r(e,"onClick",null,u.onClick,!1,void 0,n);let c;if((c=u&&u.onVnodeBeforeMount)&&En(c,n,t),p&&yt(t,null,n,"beforeMount"),((c=u&&u.onVnodeMounted)||p)&&re((()=>{c&&En(c,n,t),p&&yt(t,null,n,"mounted")}),i),16&h&&(!u||!u.innerHTML&&!u.textContent)){let r=f(e.firstChild,t,e,n,i,s,l);for(;r;){Et=!0;const e=r;r=r.nextSibling,a(e)}}else 8&h&&e.textContent!==t.children&&(Et=!0,e.textContent=t.children)}return e.nextSibling},f=(e,t,r,o,i,s,a)=>{a=a||!!t.dynamicChildren;const l=t.children,c=l.length;for(let t=0;t<c;t++){const c=a?l[t]:l[t]=wn(l[t]);if(e)e=u(e,c,o,i,s,a);else{if(c.type===Zt&&!c.children)continue;Et=!0,n(null,c,r,null,o,i,Ct(r),s)}}return e},h=(e,t,n,r,o,a)=>{const{slotScopeIds:u}=t;u&&(o=o?o.concat(u):u);const d=s(e),h=f(i(e),t,d,n,r,o,a);return h&&_t(h)&&"]"===h.data?i(t.anchor=h):(Et=!0,l(t.anchor=c("]"),d,h),h)},p=(e,t,r,o,l,c)=>{if(Et=!0,t.el=null,c){const t=m(e);for(;;){const n=i(e);if(!n||n===t)break;a(n)}}const u=i(e),d=s(e);return a(e),n(null,t,d,u,r,o,Ct(d),l),u},m=e=>{let t=0;for(;e;)if((e=i(e))&&_t(e)&&("["===e.data&&t++,"]"===e.data)){if(0===t)return i(e);t--}return e};return[(e,t)=>{if(!t.hasChildNodes())return n(null,e,t),void D();Et=!1,u(t.firstChild,e,null,null,null),D(),Et&&console.error("Hydration completed but contains mismatches.")},u]}const Ot=re;function Lt(e){return Dt(e)}function Rt(e){return Dt(e,Tt)}function Dt(e,t){(0,o.E9)().__VUE__=!0;const{insert:n,remove:i,patchProp:s,createElement:a,createText:l,createComment:c,setText:u,setElementText:d,parentNode:f,nextSibling:h,setScopeId:v=o.dG,cloneNode:g,insertStaticContent:b}=e,y=(e,t,n,r=null,o=null,i=null,s=!1,a=null,l=!!t.dynamicChildren)=>{if(e===t)return;e&&!ln(e,t)&&(r=J(e),q(e,o,i,!0),e=null),-2===t.patchFlag&&(l=!1,t.dynamicChildren=null);const{type:c,ref:u,shapeFlag:d}=t;switch(c){case Zt:w(e,t,n,r);break;case Yt:x(e,t,n,r);break;case Gt:null==e&&k(t,n,r,s);break;case Ut:I(e,t,n,r,o,i,s,a,l);break;default:1&d?S(e,t,n,r,o,i,s,a,l):6&d?M(e,t,n,r,o,i,s,a,l):(64&d||128&d)&&c.process(e,t,n,r,o,i,s,a,l,ee)}null!=u&&o&&St(u,e&&e.ref,i,t||e,!t)},w=(e,t,r,o)=>{if(null==e)n(t.el=l(t.children),r,o);else{const n=t.el=e.el;t.children!==e.children&&u(n,t.children)}},x=(e,t,r,o)=>{null==e?n(t.el=c(t.children||""),r,o):t.el=e.el},k=(e,t,n,r)=>{[e.el,e.anchor]=b(e.children,t,n,r,e.el,e.anchor)},S=(e,t,n,r,o,i,s,a,l)=>{s=s||"svg"===t.type,null==e?E(t,n,r,o,i,s,a,l):O(e,t,o,i,s,a,l)},E=(e,t,r,i,l,c,u,f)=>{let h,p;const{type:m,props:v,shapeFlag:b,transition:y,patchFlag:w,dirs:x}=e;if(e.el&&void 0!==g&&-1===w)h=e.el=g(e.el);else{if(h=e.el=a(e.type,c,v&&v.is,v),8&b?d(h,e.children):16&b&&T(e.children,h,null,i,l,c&&"foreignObject"!==m,u,f),x&&yt(e,null,i,"created"),v){for(const t in v)"value"===t||(0,o.Gg)(t)||s(h,t,null,v[t],c,e.children,i,l,G);"value"in v&&s(h,"value",null,v.value),(p=v.onVnodeBeforeMount)&&En(p,i,e)}C(h,e,e.scopeId,u,i)}x&&yt(e,null,i,"beforeMount");const k=(!l||l&&!l.pendingBranch)&&y&&!y.persisted;k&&y.beforeEnter(h),n(h,t,r),((p=v&&v.onVnodeMounted)||k||x)&&Ot((()=>{p&&En(p,i,e),k&&y.enter(h),x&&yt(e,null,i,"mounted")}),l)},C=(e,t,n,r,o)=>{if(n&&v(e,n),r)for(let t=0;t<r.length;t++)v(e,r[t]);if(o&&t===o.subTree){const t=o.vnode;C(e,t,t.scopeId,t.slotScopeIds,o.parent)}},T=(e,t,n,r,o,i,s,a,l=0)=>{for(let c=l;c<e.length;c++){const l=e[c]=a?xn(e[c]):wn(e[c]);y(null,l,t,n,r,o,i,s,a)}},O=(e,t,n,r,i,a,l)=>{const c=t.el=e.el;let{patchFlag:u,dynamicChildren:f,dirs:h}=t;u|=16&e.patchFlag;const p=e.props||o.kT,m=t.props||o.kT;let v;n&&At(n,!1),(v=m.onVnodeBeforeUpdate)&&En(v,n,t,e),h&&yt(t,e,n,"beforeUpdate"),n&&At(n,!0);const g=i&&"foreignObject"!==t.type;if(f?L(e.dynamicChildren,f,c,n,r,g,a):l||j(e,t,c,null,n,r,g,a,!1),u>0){if(16&u)A(c,t,p,m,n,r,i);else if(2&u&&p.class!==m.class&&s(c,"class",null,m.class,i),4&u&&s(c,"style",p.style,m.style,i),8&u){const o=t.dynamicProps;for(let t=0;t<o.length;t++){const a=o[t],l=p[a],u=m[a];u===l&&"value"!==a||s(c,a,l,u,i,e.children,n,r,G)}}1&u&&e.children!==t.children&&d(c,t.children)}else l||null!=f||A(c,t,p,m,n,r,i);((v=m.onVnodeUpdated)||h)&&Ot((()=>{v&&En(v,n,t,e),h&&yt(t,e,n,"updated")}),r)},L=(e,t,n,r,o,i,s)=>{for(let a=0;a<t.length;a++){const l=e[a],c=t[a],u=l.el&&(l.type===Ut||!ln(l,c)||70&l.shapeFlag)?f(l.el):n;y(l,c,u,null,r,o,i,s,!0)}},A=(e,t,n,r,i,a,l)=>{if(n!==r){for(const c in r){if((0,o.Gg)(c))continue;const u=r[c],d=n[c];u!==d&&"value"!==c&&s(e,c,d,u,l,t.children,i,a,G)}if(n!==o.kT)for(const c in n)(0,o.Gg)(c)||c in r||s(e,c,n[c],null,l,t.children,i,a,G);"value"in r&&s(e,"value",n.value,r.value)}},I=(e,t,r,o,i,s,a,c,u)=>{const d=t.el=e?e.el:l(""),f=t.anchor=e?e.anchor:l("");let{patchFlag:h,dynamicChildren:p,slotScopeIds:m}=t;m&&(c=c?c.concat(m):m),null==e?(n(d,r,o),n(f,r,o),T(t.children,r,f,i,s,a,c,u)):h>0&&64&h&&p&&e.dynamicChildren?(L(e.dynamicChildren,p,r,i,s,a,c),(null!=t.key||i&&t===i.subTree)&&It(e,t,!0)):j(e,t,r,f,i,s,a,c,u)},M=(e,t,n,r,o,i,s,a,l)=>{t.slotScopeIds=a,null==e?512&t.shapeFlag?o.ctx.activate(t,n,r,s,l):F(t,n,r,o,i,s,l):P(e,t,l)},F=(e,t,n,r,o,i,s)=>{const a=e.component=Pn(e,r,o);if(Le(e)&&(a.ctx.renderer=ee),$n(a),a.asyncDep){if(o&&o.registerDep(a,H),!e.el){const e=a.subTree=pn(Yt);x(null,e,t,n)}}else H(a,e,t,n,o,i,s)},P=(e,t,n)=>{const r=t.component=e.component;if(function(e,t,n){const{props:r,children:o,component:i}=e,{props:s,children:a,patchFlag:l}=t,c=i.emitsOptions;if(t.dirs||t.transition)return!0;if(!(n&&l>=0))return!(!o&&!a||a&&a.$stable)||r!==s&&(r?!s||K(r,s,c):!!s);if(1024&l)return!0;if(16&l)return r?K(r,s,c):!!s;if(8&l){const e=t.dynamicProps;for(let t=0;t<e.length;t++){const n=e[t];if(s[n]!==r[n]&&!W(c,n))return!0}}return!1}(e,t,n)){if(r.asyncDep&&!r.asyncResolved)return void N(r,t,n);r.next=t,function(e){const t=p.indexOf(e);t>m&&p.splice(t,1)}(r.update),r.update()}else t.component=e.component,t.el=e.el,r.vnode=t},H=(e,t,n,i,s,a,l)=>{const c=e.effect=new r.qq((()=>{if(e.isMounted){let t,{next:n,bu:r,u:i,parent:c,vnode:u}=e,d=n;At(e,!1),n?(n.el=u.el,N(e,n,l)):n=u,r&&(0,o.ir)(r),(t=n.props&&n.props.onVnodeBeforeUpdate)&&En(t,c,n,u),At(e,!0);const h=Y(e),p=e.subTree;e.subTree=h,y(p,h,f(p.el),J(p),e,s,a),n.el=h.el,null===d&&X(e,h.el),i&&Ot(i,s),(t=n.props&&n.props.onVnodeUpdated)&&Ot((()=>En(t,c,n,u)),s)}else{let r;const{el:l,props:c}=t,{bm:u,m:d,parent:f}=e,h=_e(t);if(At(e,!1),u&&(0,o.ir)(u),!h&&(r=c&&c.onVnodeBeforeMount)&&En(r,f,t),At(e,!0),l&&ne){const n=()=>{e.subTree=Y(e),ne(l,e.subTree,e,s,null)};h?t.type.__asyncLoader().then((()=>!e.isUnmounted&&n())):n()}else{const r=e.subTree=Y(e);y(null,r,n,i,e,s,a),t.el=r.el}if(d&&Ot(d,s),!h&&(r=c&&c.onVnodeMounted)){const e=t;Ot((()=>En(r,f,e)),s)}256&t.shapeFlag&&e.a&&Ot(e.a,s),e.isMounted=!0,t=n=i=null}}),(()=>_(e.update)),e.scope),u=e.update=c.run.bind(c);u.id=e.uid,At(e,!0),u()},N=(e,t,n)=>{t.component=e;const i=e.vnode.props;e.vnode=t,e.next=null,function(e,t,n,i){const{props:s,attrs:a,vnode:{patchFlag:l}}=e,c=(0,r.IU)(s),[u]=e.propsOptions;let d=!1;if(!(i||l>0)||16&l){let r;st(e,t,s,a)&&(d=!0);for(const i in c)t&&((0,o.RI)(t,i)||(r=(0,o.rs)(i))!==i&&(0,o.RI)(t,r))||(u?!n||void 0===n[i]&&void 0===n[r]||(s[i]=at(u,c,i,void 0,e,!0)):delete s[i]);if(a!==c)for(const e in a)t&&(0,o.RI)(t,e)||(delete a[e],d=!0)}else if(8&l){const n=e.vnode.dynamicProps;for(let r=0;r<n.length;r++){let i=n[r];const l=t[i];if(u)if((0,o.RI)(a,i))l!==a[i]&&(a[i]=l,d=!0);else{const t=(0,o._A)(i);s[t]=at(u,c,t,l,e,!1)}else l!==a[i]&&(a[i]=l,d=!0)}}d&&(0,r.X$)(e,"set","$attrs")}(e,t.props,i,n),((e,t,n)=>{const{vnode:r,slots:i}=e;let s=!0,a=o.kT;if(32&r.shapeFlag){const e=t._;e?n&&1===e?s=!1:((0,o.l7)(i,t),n||1!==e||delete i._):(s=!t.$stable,vt(t,i)),a=t}else t&&(gt(e,t),a={default:1});if(s)for(const e in i)ht(e)||e in a||delete i[e]})(e,t.children,n),(0,r.Jd)(),R(void 0,e.update),(0,r.lk)()},j=(e,t,n,r,o,i,s,a,l=!1)=>{const c=e&&e.children,u=e?e.shapeFlag:0,f=t.children,{patchFlag:h,shapeFlag:p}=t;if(h>0){if(128&h)return void z(c,f,n,r,o,i,s,a,l);if(256&h)return void B(c,f,n,r,o,i,s,a,l)}8&p?(16&u&&G(c,o,i),f!==c&&d(n,f)):16&u?16&p?z(c,f,n,r,o,i,s,a,l):G(c,o,i,!0):(8&u&&d(n,""),16&p&&T(f,n,r,o,i,s,a,l))},B=(e,t,n,r,i,s,a,l,c)=>{e=e||o.Z6,t=t||o.Z6;const u=e.length,d=t.length,f=Math.min(u,d);let h;for(h=0;h<f;h++){const r=t[h]=c?xn(t[h]):wn(t[h]);y(e[h],r,n,null,i,s,a,l,c)}u>d?G(e,i,s,!0,!1,f):T(t,n,r,i,s,a,l,c,f)},z=(e,t,n,r,i,s,a,l,c)=>{let u=0;const d=t.length;let f=e.length-1,h=d-1;for(;u<=f&&u<=h;){const r=e[u],o=t[u]=c?xn(t[u]):wn(t[u]);if(!ln(r,o))break;y(r,o,n,null,i,s,a,l,c),u++}for(;u<=f&&u<=h;){const r=e[f],o=t[h]=c?xn(t[h]):wn(t[h]);if(!ln(r,o))break;y(r,o,n,null,i,s,a,l,c),f--,h--}if(u>f){if(u<=h){const e=h+1,o=e<d?t[e].el:r;for(;u<=h;)y(null,t[u]=c?xn(t[u]):wn(t[u]),n,o,i,s,a,l,c),u++}}else if(u>h)for(;u<=f;)q(e[u],i,s,!0),u++;else{const p=u,m=u,v=new Map;for(u=m;u<=h;u++){const e=t[u]=c?xn(t[u]):wn(t[u]);null!=e.key&&v.set(e.key,u)}let g,b=0;const w=h-m+1;let x=!1,k=0;const S=new Array(w);for(u=0;u<w;u++)S[u]=0;for(u=p;u<=f;u++){const r=e[u];if(b>=w){q(r,i,s,!0);continue}let o;if(null!=r.key)o=v.get(r.key);else for(g=m;g<=h;g++)if(0===S[g-m]&&ln(r,t[g])){o=g;break}void 0===o?q(r,i,s,!0):(S[o-m]=u+1,o>=k?k=o:x=!0,y(r,t[o],n,null,i,s,a,l,c),b++)}const E=x?function(e){const t=e.slice(),n=[0];let r,o,i,s,a;const l=e.length;for(r=0;r<l;r++){const l=e[r];if(0!==l){if(o=n[n.length-1],e[o]<l){t[r]=o,n.push(r);continue}for(i=0,s=n.length-1;i<s;)a=i+s>>1,e[n[a]]<l?i=a+1:s=a;l<e[n[i]]&&(i>0&&(t[r]=n[i-1]),n[i]=r)}}for(i=n.length,s=n[i-1];i-- >0;)n[i]=s,s=t[s];return n}(S):o.Z6;for(g=E.length-1,u=w-1;u>=0;u--){const e=m+u,o=t[e],f=e+1<d?t[e+1].el:r;0===S[u]?y(null,o,n,f,i,s,a,l,c):x&&(g<0||u!==E[g]?V(o,n,f,2):g--)}}},V=(e,t,r,o,i=null)=>{const{el:s,type:a,transition:l,children:c,shapeFlag:u}=e;if(6&u)V(e.component.subTree,t,r,o);else if(128&u)e.suspense.move(t,r,o);else if(64&u)a.move(e,t,r,ee);else if(a!==Ut)if(a!==Gt)if(2!==o&&1&u&&l)if(0===o)l.beforeEnter(s),n(s,t,r),Ot((()=>l.enter(s)),i);else{const{leave:e,delayLeave:o,afterLeave:i}=l,a=()=>n(s,t,r),c=()=>{e(s,(()=>{a(),i&&i()}))};o?o(s,a,c):c()}else n(s,t,r);else(({el:e,anchor:t},r,o)=>{let i;for(;e&&e!==t;)i=h(e),n(e,r,o),e=i;n(t,r,o)})(e,t,r);else{n(s,t,r);for(let e=0;e<c.length;e++)V(c[e],t,r,o);n(e.anchor,t,r)}},q=(e,t,n,r=!1,o=!1)=>{const{type:i,props:s,ref:a,children:l,dynamicChildren:c,shapeFlag:u,patchFlag:d,dirs:f}=e;if(null!=a&&St(a,null,n,e,!0),256&u)return void t.ctx.deactivate(e);const h=1&u&&f,p=!_e(e);let m;if(p&&(m=s&&s.onVnodeBeforeUnmount)&&En(m,t,e),6&u)Z(e.component,n,r);else{if(128&u)return void e.suspense.unmount(n,r);h&&yt(e,null,t,"beforeUnmount"),64&u?e.type.remove(e,t,n,o,ee,r):c&&(i!==Ut||d>0&&64&d)?G(c,t,n,!1,!0):(i===Ut&&384&d||!o&&16&u)&&G(l,t,n),r&&$(e)}(p&&(m=s&&s.onVnodeUnmounted)||h)&&Ot((()=>{m&&En(m,t,e),h&&yt(e,null,t,"unmounted")}),n)},$=e=>{const{type:t,el:n,anchor:r,transition:o}=e;if(t===Ut)return void U(n,r);if(t===Gt)return void(({el:e,anchor:t})=>{let n;for(;e&&e!==t;)n=h(e),i(e),e=n;i(t)})(e);const s=()=>{i(n),o&&!o.persisted&&o.afterLeave&&o.afterLeave()};if(1&e.shapeFlag&&o&&!o.persisted){const{leave:t,delayLeave:r}=o,i=()=>t(n,s);r?r(e.el,s,i):i()}else s()},U=(e,t)=>{let n;for(;e!==t;)n=h(e),i(e),e=n;i(t)},Z=(e,t,n)=>{const{bum:r,scope:i,update:s,subTree:a,um:l}=e;r&&(0,o.ir)(r),i.stop(),s&&(s.active=!1,q(a,e,t,n)),l&&Ot(l,t),Ot((()=>{e.isUnmounted=!0}),t),t&&t.pendingBranch&&!t.isUnmounted&&e.asyncDep&&!e.asyncResolved&&e.suspenseId===t.pendingId&&(t.deps--,0===t.deps&&t.resolve())},G=(e,t,n,r=!1,o=!1,i=0)=>{for(let s=i;s<e.length;s++)q(e[s],t,n,r,o)},J=e=>6&e.shapeFlag?J(e.component.subTree):128&e.shapeFlag?e.suspense.next():h(e.anchor||e.el),Q=(e,t,n)=>{null==e?t._vnode&&q(t._vnode,null,null,!0):y(t._vnode||null,e,t,null,null,null,n),D(),t._vnode=e},ee={p:y,um:q,m:V,r:$,mt:F,mc:T,pc:j,pbc:L,n:J,o:e};let te,ne;return t&&([te,ne]=t(ee)),{render:Q,hydrate:te,createApp:kt(Q,te)}}function At({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function It(e,t,n=!1){const r=e.children,i=t.children;if((0,o.kJ)(r)&&(0,o.kJ)(i))for(let e=0;e<r.length;e++){const t=r[e];let o=i[e];1&o.shapeFlag&&!o.dynamicChildren&&((o.patchFlag<=0||32===o.patchFlag)&&(o=i[e]=xn(i[e]),o.el=t.el),n||It(t,o))}}const Mt=e=>e&&(e.disabled||""===e.disabled),Ft=e=>"undefined"!=typeof SVGElement&&e instanceof SVGElement,Pt=(e,t)=>{const n=e&&e.to;if((0,o.HD)(n)){if(t){return t(n)}return null}return n};function Ht(e,t,n,{o:{insert:r},m:o},i=2){0===i&&r(e.targetAnchor,t,n);const{el:s,anchor:a,shapeFlag:l,children:c,props:u}=e,d=2===i;if(d&&r(s,t,n),(!d||Mt(u))&&16&l)for(let e=0;e<c.length;e++)o(c[e],t,n,2);d&&r(a,t,n)}const Nt={__isTeleport:!0,process(e,t,n,r,o,i,s,a,l,c){const{mc:u,pc:d,pbc:f,o:{insert:h,querySelector:p,createText:m,createComment:v}}=c,g=Mt(t.props);let{shapeFlag:b,children:y,dynamicChildren:w}=t;if(null==e){const e=t.el=m(""),c=t.anchor=m("");h(e,n,r),h(c,n,r);const d=t.target=Pt(t.props,p),f=t.targetAnchor=m("");d&&(h(f,d),s=s||Ft(d));const v=(e,t)=>{16&b&&u(y,e,t,o,i,s,a,l)};g?v(n,c):d&&v(d,f)}else{t.el=e.el;const r=t.anchor=e.anchor,u=t.target=e.target,h=t.targetAnchor=e.targetAnchor,m=Mt(e.props),v=m?n:u,b=m?r:h;if(s=s||Ft(u),w?(f(e.dynamicChildren,w,v,o,i,s,a),It(e,t,!0)):l||d(e,t,v,b,o,i,s,a,!1),g)m||Ht(t,n,r,c,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const e=t.target=Pt(t.props,p);e&&Ht(t,e,null,c,0)}else m&&Ht(t,u,h,c,1)}},remove(e,t,n,r,{um:o,o:{remove:i}},s){const{shapeFlag:a,children:l,anchor:c,targetAnchor:u,target:d,props:f}=e;if(d&&i(u),(s||!Mt(f))&&(i(c),16&a))for(let e=0;e<l.length;e++){const r=l[e];o(r,t,n,!0,!!r.dynamicChildren)}},move:Ht,hydrate:function(e,t,n,r,o,i,{o:{nextSibling:s,parentNode:a,querySelector:l}},c){const u=t.target=Pt(t.props,l);if(u){const l=u._lpa||u.firstChild;16&t.shapeFlag&&(Mt(t.props)?(t.anchor=c(s(e),t,a(e),n,r,o,i),t.targetAnchor=l):(t.anchor=s(e),t.targetAnchor=c(l,t,u,n,r,o,i)),u._lpa=t.targetAnchor&&s(t.targetAnchor))}return t.anchor&&s(t.anchor)}},jt="components";function Wt(e,t){return qt(jt,e,!0,t)||e}const Bt=Symbol();function zt(e){return(0,o.HD)(e)?qt(jt,e,!1)||e:e||Bt}function Vt(e){return qt("directives",e)}function qt(e,t,n=!0,r=!1){const i=B||Hn;if(i){const n=i.type;if(e===jt){const e=Qn(n);if(e&&(e===t||e===(0,o._A)(t)||e===(0,o.kC)((0,o._A)(t))))return n}const s=$t(i[e]||n[e],t)||$t(i.appContext[e],t);return!s&&r?n:s}}function $t(e,t){return e&&(e[t]||e[(0,o._A)(t)]||e[(0,o.kC)((0,o._A)(t))])}const Ut=Symbol(void 0),Zt=Symbol(void 0),Yt=Symbol(void 0),Gt=Symbol(void 0),Jt=[];let Kt=null;function Xt(e=!1){Jt.push(Kt=e?null:[])}function Qt(){Jt.pop(),Kt=Jt[Jt.length-1]||null}let en,tn=1;function nn(e){tn+=e}function rn(e){return e.dynamicChildren=tn>0?Kt||o.Z6:null,Qt(),tn>0&&Kt&&Kt.push(e),e}function on(e,t,n,r,o,i){return rn(hn(e,t,n,r,o,i,!0))}function sn(e,t,n,r,o){return rn(pn(e,t,n,r,o,!0))}function an(e){return!!e&&!0===e.__v_isVNode}function ln(e,t){return e.type===t.type&&e.key===t.key}function cn(e){en=e}const un="__vInternal",dn=({key:e})=>null!=e?e:null,fn=({ref:e,ref_key:t,ref_for:n})=>null!=e?(0,o.HD)(e)||(0,r.dq)(e)||(0,o.mf)(e)?{i:B,r:e,k:t,f:!!n}:e:null;function hn(e,t=null,n=null,r=0,i=null,s=(e===Ut?0:1),a=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&dn(t),ref:t&&fn(t),scopeId:z,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:i,dynamicChildren:null,appContext:null};return l?(kn(c,n),128&s&&e.normalize(c)):n&&(c.shapeFlag|=(0,o.HD)(n)?8:16),tn>0&&!a&&Kt&&(c.patchFlag>0||6&s)&&32!==c.patchFlag&&Kt.push(c),c}const pn=function(e,t=null,n=null,i=0,s=null,a=!1){if(e&&e!==Bt||(e=Yt),an(e)){const r=vn(e,t,!0);return n&&kn(r,n),r}if(l=e,(0,o.mf)(l)&&"__vccOpts"in l&&(e=e.__vccOpts),t){t=mn(t);let{class:e,style:n}=t;e&&!(0,o.HD)(e)&&(t.class=(0,o.C_)(e)),(0,o.Kn)(n)&&((0,r.X3)(n)&&!(0,o.kJ)(n)&&(n=(0,o.l7)({},n)),t.style=(0,o.j5)(n))}var l;return hn(e,t,n,i,s,(0,o.HD)(e)?1:(e=>e.__isSuspense)(e)?128:(e=>e.__isTeleport)(e)?64:(0,o.Kn)(e)?4:(0,o.mf)(e)?2:0,a,!0)};function mn(e){return e?(0,r.X3)(e)||un in e?(0,o.l7)({},e):e:null}function vn(e,t,n=!1){const{props:r,ref:i,patchFlag:s,children:a}=e,l=t?Sn(r||{},t):r;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&dn(l),ref:t&&t.ref?n&&i?(0,o.kJ)(i)?i.concat(fn(t)):[i,fn(t)]:fn(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:a,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Ut?-1===s?16:16|s: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&&vn(e.ssContent),ssFallback:e.ssFallback&&vn(e.ssFallback),el:e.el,anchor:e.anchor}}function gn(e=" ",t=0){return pn(Zt,null,e,t)}function bn(e,t){const n=pn(Gt,null,e);return n.staticCount=t,n}function yn(e="",t=!1){return t?(Xt(),sn(Yt,null,e)):pn(Yt,null,e)}function wn(e){return null==e||"boolean"==typeof e?pn(Yt):(0,o.kJ)(e)?pn(Ut,null,e.slice()):"object"==typeof e?xn(e):pn(Zt,null,String(e))}function xn(e){return null===e.el||e.memo?e:vn(e)}function kn(e,t){let n=0;const{shapeFlag:r}=e;if(null==t)t=null;else if((0,o.kJ)(t))n=16;else if("object"==typeof t){if(65&r){const n=t.default;return void(n&&(n._c&&(n._d=!1),kn(e,n()),n._c&&(n._d=!0)))}{n=32;const r=t._;r||un in t?3===r&&B&&(1===B.slots._?t._=1:(t._=2,e.patchFlag|=1024)):t._ctx=B}}else(0,o.mf)(t)?(t={default:t,_ctx:B},n=32):(t=String(t),64&r?(n=16,t=[gn(t)]):n=8);e.children=t,e.shapeFlag|=n}function Sn(...e){const t={};for(let n=0;n<e.length;n++){const r=e[n];for(const e in r)if("class"===e)t.class!==r.class&&(t.class=(0,o.C_)([t.class,r.class]));else if("style"===e)t.style=(0,o.j5)([t.style,r.style]);else if((0,o.F7)(e)){const n=t[e],i=r[e];!i||n===i||(0,o.kJ)(n)&&n.includes(i)||(t[e]=n?[].concat(n,i):i)}else""!==e&&(t[e]=r[e])}return t}function En(e,t,n,r=null){u(e,t,7,[n,r])}function Cn(e,t,n,r){let i;const s=n&&n[r];if((0,o.kJ)(e)||(0,o.HD)(e)){i=new Array(e.length);for(let n=0,r=e.length;n<r;n++)i[n]=t(e[n],n,void 0,s&&s[n])}else if("number"==typeof e){i=new Array(e);for(let n=0;n<e;n++)i[n]=t(n+1,n,void 0,s&&s[n])}else if((0,o.Kn)(e))if(e[Symbol.iterator])i=Array.from(e,((e,n)=>t(e,n,void 0,s&&s[n])));else{const n=Object.keys(e);i=new Array(n.length);for(let r=0,o=n.length;r<o;r++){const o=n[r];i[r]=t(e[o],o,r,s&&s[r])}}else i=[];return n&&(n[r]=i),i}function _n(e,t){for(let n=0;n<t.length;n++){const r=t[n];if((0,o.kJ)(r))for(let t=0;t<r.length;t++)e[r[t].name]=r[t].fn;else r&&(e[r.name]=r.fn)}return e}function Tn(e,t,n={},r,o){if(B.isCE)return pn("slot","default"===t?null:{name:t},r&&r());let i=e[t];i&&i._c&&(i._d=!1),Xt();const s=i&&On(i(n)),a=sn(Ut,{key:n.key||`_${t}`},s||(r?r():[]),s&&1===e._?64:-2);return!o&&a.scopeId&&(a.slotScopeIds=[a.scopeId+"-s"]),i&&i._c&&(i._d=!0),a}function On(e){return e.some((e=>!an(e)||e.type!==Yt&&!(e.type===Ut&&!On(e.children))))?e:null}function Ln(e){const t={};for(const n in e)t[(0,o.hR)(n)]=e[n];return t}const Rn=e=>e?Bn(e)?Kn(e)||e.proxy:Rn(e.parent):null,Dn=(0,o.l7)(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=>Rn(e.parent),$root:e=>Rn(e.root),$emit:e=>e.emit,$options:e=>Qe(e),$forceUpdate:e=>()=>_(e.update),$nextTick:e=>C.bind(e.proxy),$watch:e=>he.bind(e)}),An={get({_:e},t){const{ctx:n,setupState:i,data:s,props:a,accessCache:l,type:c,appContext:u}=e;let d;if("$"!==t[0]){const r=l[t];if(void 0!==r)switch(r){case 1:return i[t];case 2:return s[t];case 4:return n[t];case 3:return a[t]}else{if(i!==o.kT&&(0,o.RI)(i,t))return l[t]=1,i[t];if(s!==o.kT&&(0,o.RI)(s,t))return l[t]=2,s[t];if((d=e.propsOptions[0])&&(0,o.RI)(d,t))return l[t]=3,a[t];if(n!==o.kT&&(0,o.RI)(n,t))return l[t]=4,n[t];Je&&(l[t]=0)}}const f=Dn[t];let h,p;return f?("$attrs"===t&&(0,r.j)(e,"get",t),f(e)):(h=c.__cssModules)&&(h=h[t])?h:n!==o.kT&&(0,o.RI)(n,t)?(l[t]=4,n[t]):(p=u.config.globalProperties,(0,o.RI)(p,t)?p[t]:void 0)},set({_:e},t,n){const{data:r,setupState:i,ctx:s}=e;if(i!==o.kT&&(0,o.RI)(i,t))i[t]=n;else if(r!==o.kT&&(0,o.RI)(r,t))r[t]=n;else if((0,o.RI)(e.props,t))return!1;return!("$"===t[0]&&t.slice(1)in e||(s[t]=n,0))},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:i,propsOptions:s}},a){let l;return!!n[a]||e!==o.kT&&(0,o.RI)(e,a)||t!==o.kT&&(0,o.RI)(t,a)||(l=s[0])&&(0,o.RI)(l,a)||(0,o.RI)(r,a)||(0,o.RI)(Dn,a)||(0,o.RI)(i.config.globalProperties,a)}},In=(0,o.l7)({},An,{get(e,t){if(t!==Symbol.unscopables)return An.get(e,t,e)},has:(e,t)=>"_"!==t[0]&&!(0,o.e1)(t)}),Mn=wt();let Fn=0;function Pn(e,t,n){const i=e.type,s=(t?t.appContext:e.appContext)||Mn,a={uid:Fn++,vnode:e,type:i,parent:t,appContext:s,root:null,next:null,subTree:null,effect:null,update:null,scope:new r.Bj(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:t?t.provides:Object.create(s.provides),accessCache:null,renderCache:[],components:null,directives:null,propsOptions:lt(i,s),emitsOptions:j(i,s),emit:null,emitted:null,propsDefaults:o.kT,inheritAttrs:i.inheritAttrs,ctx:o.kT,data:o.kT,props:o.kT,attrs:o.kT,slots:o.kT,refs:o.kT,setupState:o.kT,setupContext:null,suspense:n,suspenseId:n?n.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};return a.ctx={_:a},a.root=t?t.root:a,a.emit=N.bind(null,a),e.ce&&e.ce(a),a}let Hn=null;const Nn=()=>Hn||B,jn=e=>{Hn=e,e.scope.on()},Wn=()=>{Hn&&Hn.scope.off(),Hn=null};function Bn(e){return 4&e.vnode.shapeFlag}let zn,Vn,qn=!1;function $n(e,t=!1){qn=t;const{props:n,children:i}=e.vnode,s=Bn(e);!function(e,t,n,i=!1){const s={},a={};(0,o.Nj)(a,un,1),e.propsDefaults=Object.create(null),st(e,t,s,a);for(const t in e.propsOptions[0])t in s||(s[t]=void 0);n?e.props=i?s:(0,r.Um)(s):e.type.props?e.props=s:e.props=a,e.attrs=a}(e,n,s,t),((e,t)=>{if(32&e.vnode.shapeFlag){const n=t._;n?(e.slots=(0,r.IU)(t),(0,o.Nj)(t,"_",n)):vt(t,e.slots={})}else e.slots={},t&&gt(e,t);(0,o.Nj)(e.slots,un,1)})(e,i);const a=s?function(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=(0,r.Xl)(new Proxy(e.ctx,An));const{setup:i}=n;if(i){const n=e.setupContext=i.length>1?Jn(e):null;jn(e),(0,r.Jd)();const s=c(i,e,0,[e.props,n]);if((0,r.lk)(),Wn(),(0,o.tI)(s)){if(s.then(Wn,Wn),t)return s.then((n=>{Un(e,n,t)})).catch((t=>{d(t,e,0)}));e.asyncDep=s}else Un(e,s,t)}else Gn(e,t)}(e,t):void 0;return qn=!1,a}function Un(e,t,n){(0,o.mf)(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:(0,o.Kn)(t)&&(e.setupState=(0,r.WL)(t)),Gn(e,n)}function Zn(e){zn=e,Vn=e=>{e.render._rc&&(e.withProxy=new Proxy(e.ctx,In))}}const Yn=()=>!zn;function Gn(e,t,n){const i=e.type;if(!e.render){if(!t&&zn&&!i.render){const t=i.template;if(t){const{isCustomElement:n,compilerOptions:r}=e.appContext.config,{delimiters:s,compilerOptions:a}=i,l=(0,o.l7)((0,o.l7)({isCustomElement:n,delimiters:s},r),a);i.render=zn(t,l)}}e.render=i.render||o.dG,Vn&&Vn(e)}jn(e),(0,r.Jd)(),function(e){const t=Qe(e),n=e.proxy,i=e.ctx;Je=!1,t.beforeCreate&&Ke(t.beforeCreate,e,"bc");const{data:s,computed:a,methods:l,watch:c,provide:u,inject:d,created:f,beforeMount:h,mounted:p,beforeUpdate:m,updated:v,activated:g,deactivated:b,beforeDestroy:y,beforeUnmount:w,destroyed:x,unmounted:k,render:S,renderTracked:E,renderTriggered:C,errorCaptured:_,serverPrefetch:T,expose:O,inheritAttrs:L,components:R,directives:D,filters:A}=t;if(d&&function(e,t,n=o.dG,i=!1){(0,o.kJ)(e)&&(e=rt(e));for(const n in e){const s=e[n];let a;a=(0,o.Kn)(s)?"default"in s?se(s.from||n,s.default,!0):se(s.from||n):se(s),(0,r.dq)(a)&&i?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>a.value,set:e=>a.value=e}):t[n]=a}}(d,i,null,e.appContext.config.unwrapInjectedRef),l)for(const e in l){const t=l[e];(0,o.mf)(t)&&(i[e]=t.bind(n))}if(s){const t=s.call(n,n);(0,o.Kn)(t)&&(e.data=(0,r.qj)(t))}if(Je=!0,a)for(const e in a){const t=a[e],r=(0,o.mf)(t)?t.bind(n,n):(0,o.mf)(t.get)?t.get.bind(n,n):o.dG,s=!(0,o.mf)(t)&&(0,o.mf)(t.set)?t.set.bind(n):o.dG,l=tr({get:r,set:s});Object.defineProperty(i,e,{enumerable:!0,configurable:!0,get:()=>l.value,set:e=>l.value=e})}if(c)for(const e in c)Xe(c[e],i,n,e);if(u){const e=(0,o.mf)(u)?u.call(n):u;Reflect.ownKeys(e).forEach((t=>{ie(t,e[t])}))}function I(e,t){(0,o.kJ)(t)?t.forEach((t=>e(t.bind(n)))):t&&e(t.bind(n))}if(f&&Ke(f,e,"c"),I(We,h),I(Be,p),I(ze,m),I(Ve,v),I(Ae,g),I(Ie,b),I(Ge,_),I(Ye,E),I(Ze,C),I(qe,w),I($e,k),I(Ue,T),(0,o.kJ)(O))if(O.length){const t=e.exposed||(e.exposed={});O.forEach((e=>{Object.defineProperty(t,e,{get:()=>n[e],set:t=>n[e]=t})}))}else e.exposed||(e.exposed={});S&&e.render===o.dG&&(e.render=S),null!=L&&(e.inheritAttrs=L),R&&(e.components=R),D&&(e.directives=D)}(e),(0,r.lk)(),Wn()}function Jn(e){let t;return{get attrs(){return t||(t=function(e){return new Proxy(e.attrs,{get:(t,n)=>((0,r.j)(e,"get","$attrs"),t[n])})}(e))},slots:e.slots,emit:e.emit,expose:t=>{e.exposed=t||{}}}}function Kn(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy((0,r.WL)((0,r.Xl)(e.exposed)),{get:(t,n)=>n in t?t[n]:n in Dn?Dn[n](e):void 0}))}const Xn=/(?:^|[-_])(\w)/g;function Qn(e){return(0,o.mf)(e)&&e.displayName||e.name}function er(e,t,n=!1){let r=Qn(t);if(!r&&t.__file){const e=t.__file.match(/([^/\\]+)\.\w+$/);e&&(r=e[1])}if(!r&&e&&e.parent){const n=e=>{for(const n in e)if(e[n]===t)return n};r=n(e.components||e.parent.type.components)||n(e.appContext.components)}return r?r.replace(Xn,(e=>e.toUpperCase())).replace(/[-_]/g,""):n?"App":"Anonymous"}const tr=(e,t)=>(0,r.Fl)(e,t,qn);function nr(){return null}function rr(){return null}function or(e){}function ir(e,t){return null}function sr(){return lr().slots}function ar(){return lr().attrs}function lr(){const e=Nn();return e.setupContext||(e.setupContext=Jn(e))}function cr(e,t){const n=(0,o.kJ)(e)?e.reduce(((e,t)=>(e[t]={},e)),{}):e;for(const e in t){const r=n[e];r?(0,o.kJ)(r)||(0,o.mf)(r)?n[e]={type:r,default:t[e]}:r.default=t[e]:null===r&&(n[e]={default:t[e]})}return n}function ur(e,t){const n={};for(const r in e)t.includes(r)||Object.defineProperty(n,r,{enumerable:!0,get:()=>e[r]});return n}function dr(e){const t=Nn();let n=e();return Wn(),(0,o.tI)(n)&&(n=n.catch((e=>{throw jn(t),e}))),[n,()=>jn(t)]}function fr(e,t,n){const r=arguments.length;return 2===r?(0,o.Kn)(t)&&!(0,o.kJ)(t)?an(t)?pn(e,null,[t]):pn(e,t):pn(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):3===r&&an(n)&&(n=[n]),pn(e,t,n))}const hr=Symbol(""),pr=()=>{{const e=se(hr);return e||s("Server rendering context not provided. Make sure to only call useSSRContext() conditionally in the server build."),e}};function mr(){}function vr(e,t,n,r){const o=n[r];if(o&&gr(o,e))return o;const i=t();return i.memo=e.slice(),n[r]=i}function gr(e,t){const n=e.memo;if(n.length!=t.length)return!1;for(let e=0;e<n.length;e++)if(n[e]!==t[e])return!1;return tn>0&&Kt&&Kt.push(e),!0}const br="3.2.30",yr={createComponentInstance:Pn,setupComponent:$n,renderComponentRoot:Y,setCurrentRenderingInstance:V,isVNode:an,normalizeVNode:wn},wr=null,xr=null},3577:(e,t,n)=>{"use strict";function r(e,t){const n=Object.create(null),r=e.split(",");for(let e=0;e<r.length;e++)n[r[e]]=!0;return t?e=>!!n[e.toLowerCase()]:e=>!!n[e]}n.d(t,{Z6:()=>S,kT:()=>k,NO:()=>C,dG:()=>E,m:()=>o,_A:()=>K,kC:()=>ee,Nj:()=>oe,l7:()=>L,Kp:()=>s,E9:()=>ae,aU:()=>ne,RI:()=>A,rs:()=>Q,yA:()=>l,ir:()=>re,kJ:()=>I,wh:()=>Y,mf:()=>H,e1:()=>i,eS:()=>m,S0:()=>U,_N:()=>M,tR:()=>O,Kn:()=>W,F7:()=>T,PO:()=>$,tI:()=>B,Gg:()=>Z,aN:()=>v,DM:()=>F,Pq:()=>a,HD:()=>N,yk:()=>j,WB:()=>g,WV:()=>b,hq:()=>y,fY:()=>r,C_:()=>h,vs:()=>p,j5:()=>c,yL:()=>f,Od:()=>R,zw:()=>w,hR:()=>te,He:()=>ie,W7:()=>q});const o={1:"TEXT",2:"CLASS",4:"STYLE",8:"PROPS",16:"FULL_PROPS",32:"HYDRATE_EVENTS",64:"STABLE_FRAGMENT",128:"KEYED_FRAGMENT",256:"UNKEYED_FRAGMENT",512:"NEED_PATCH",1024:"DYNAMIC_SLOTS",2048:"DEV_ROOT_FRAGMENT",[-1]:"HOISTED",[-2]:"BAIL"},i=r("Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt");function s(e,t=0,n=e.length){let r=e.split(/(\r?\n)/);const o=r.filter(((e,t)=>t%2==1));r=r.filter(((e,t)=>t%2==0));let i=0;const s=[];for(let e=0;e<r.length;e++)if(i+=r[e].length+(o[e]&&o[e].length||0),i>=t){for(let a=e-2;a<=e+2||n>i;a++){if(a<0||a>=r.length)continue;const l=a+1;s.push(`${l}${" ".repeat(Math.max(3-String(l).length,0))}|  ${r[a]}`);const c=r[a].length,u=o[a]&&o[a].length||0;if(a===e){const e=t-(i-(c+u)),r=Math.max(1,n>i?c-e:n-t);s.push("   |  "+" ".repeat(e)+"^".repeat(r))}else if(a>e){if(n>i){const e=Math.max(Math.min(n-i,c),1);s.push("   |  "+"^".repeat(e))}i+=c+u}}break}return s.join("\n")}const a=r("itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly");function l(e){return!!e||""===e}function c(e){if(I(e)){const t={};for(let n=0;n<e.length;n++){const r=e[n],o=N(r)?f(r):c(r);if(o)for(const e in o)t[e]=o[e]}return t}return N(e)||W(e)?e:void 0}const u=/;(?![^(]*\))/g,d=/:(.+)/;function f(e){const t={};return e.split(u).forEach((e=>{if(e){const n=e.split(d);n.length>1&&(t[n[0].trim()]=n[1].trim())}})),t}function h(e){let t="";if(N(e))t=e;else if(I(e))for(let n=0;n<e.length;n++){const r=h(e[n]);r&&(t+=r+" ")}else if(W(e))for(const n in e)e[n]&&(t+=n+" ");return t.trim()}function p(e){if(!e)return null;let{class:t,style:n}=e;return t&&!N(t)&&(e.class=h(t)),n&&(e.style=c(n)),e}const m=r("html,body,base,head,link,meta,style,title,address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot"),v=r("svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistanceLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view"),g=r("area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr");function b(e,t){if(e===t)return!0;let n=P(e),r=P(t);if(n||r)return!(!n||!r)&&e.getTime()===t.getTime();if(n=I(e),r=I(t),n||r)return!(!n||!r)&&function(e,t){if(e.length!==t.length)return!1;let n=!0;for(let r=0;n&&r<e.length;r++)n=b(e[r],t[r]);return n}(e,t);if(n=W(e),r=W(t),n||r){if(!n||!r)return!1;if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e){const r=e.hasOwnProperty(n),o=t.hasOwnProperty(n);if(r&&!o||!r&&o||!b(e[n],t[n]))return!1}}return String(e)===String(t)}function y(e,t){return e.findIndex((e=>b(e,t)))}const w=e=>N(e)?e:null==e?"":I(e)||W(e)&&(e.toString===z||!H(e.toString))?JSON.stringify(e,x,2):String(e),x=(e,t)=>t&&t.__v_isRef?x(e,t.value):M(t)?{[`Map(${t.size})`]:[...t.entries()].reduce(((e,[t,n])=>(e[`${t} =>`]=n,e)),{})}:F(t)?{[`Set(${t.size})`]:[...t.values()]}:!W(t)||I(t)||$(t)?t:String(t),k={},S=[],E=()=>{},C=()=>!1,_=/^on[^a-z]/,T=e=>_.test(e),O=e=>e.startsWith("onUpdate:"),L=Object.assign,R=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},D=Object.prototype.hasOwnProperty,A=(e,t)=>D.call(e,t),I=Array.isArray,M=e=>"[object Map]"===V(e),F=e=>"[object Set]"===V(e),P=e=>e instanceof Date,H=e=>"function"==typeof e,N=e=>"string"==typeof e,j=e=>"symbol"==typeof e,W=e=>null!==e&&"object"==typeof e,B=e=>W(e)&&H(e.then)&&H(e.catch),z=Object.prototype.toString,V=e=>z.call(e),q=e=>V(e).slice(8,-1),$=e=>"[object Object]"===V(e),U=e=>N(e)&&"NaN"!==e&&"-"!==e[0]&&""+parseInt(e,10)===e,Z=r(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Y=r("bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo"),G=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},J=/-(\w)/g,K=G((e=>e.replace(J,((e,t)=>t?t.toUpperCase():"")))),X=/\B([A-Z])/g,Q=G((e=>e.replace(X,"-$1").toLowerCase())),ee=G((e=>e.charAt(0).toUpperCase()+e.slice(1))),te=G((e=>e?`on${ee(e)}`:"")),ne=(e,t)=>!Object.is(e,t),re=(e,t)=>{for(let n=0;n<e.length;n++)e[n](t)},oe=(e,t,n)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},ie=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let se;const ae=()=>se||(se="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:void 0!==n.g?n.g:{})},1807:e=>{var t=!("undefined"==typeof window||!window.document||!window.document.createElement);e.exports=t},2152:function(e){var t;t=function(){return function(){var e={686:function(e,t,n){"use strict";n.d(t,{default:function(){return x}});var r=n(279),o=n.n(r),i=n(370),s=n.n(i),a=n(817),l=n.n(a);function c(e){try{return document.execCommand(e)}catch(e){return!1}}var u=function(e){var t=l()(e);return c("cut"),t};function d(e){var t="rtl"===document.documentElement.getAttribute("dir"),n=document.createElement("textarea");n.style.fontSize="12pt",n.style.border="0",n.style.padding="0",n.style.margin="0",n.style.position="absolute",n.style[t?"right":"left"]="-9999px";var r=window.pageYOffset||document.documentElement.scrollTop;return n.style.top="".concat(r,"px"),n.setAttribute("readonly",""),n.value=e,n}var f=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{container:document.body},n="";if("string"==typeof e){var r=d(e);t.container.appendChild(r),n=l()(r),c("copy"),r.remove()}else n=l()(e),c("copy");return n};function h(e){return h="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},h(e)}function p(e){return p="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},p(e)}function m(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function v(e,t){return v=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},v(e,t)}function g(e,t){return!t||"object"!==p(t)&&"function"!=typeof t?function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e):t}function b(e){return b=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},b(e)}function y(e,t){var n="data-clipboard-".concat(e);if(t.hasAttribute(n))return t.getAttribute(n)}var w=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&v(e,t)}(l,e);var t,n,r,o,i,a=(o=l,i=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=b(o);if(i){var n=b(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return g(this,e)});function l(e,t){var n;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,l),(n=a.call(this)).resolveOptions(t),n.listenClick(e),n}return t=l,n=[{key:"resolveOptions",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof e.action?e.action:this.defaultAction,this.target="function"==typeof e.target?e.target:this.defaultTarget,this.text="function"==typeof e.text?e.text:this.defaultText,this.container="object"===p(e.container)?e.container:document.body}},{key:"listenClick",value:function(e){var t=this;this.listener=s()(e,"click",(function(e){return t.onClick(e)}))}},{key:"onClick",value:function(e){var t=e.delegateTarget||e.currentTarget,n=this.action(t)||"copy",r=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.action,n=void 0===t?"copy":t,r=e.container,o=e.target,i=e.text;if("copy"!==n&&"cut"!==n)throw new Error('Invalid "action" value, use either "copy" or "cut"');if(void 0!==o){if(!o||"object"!==h(o)||1!==o.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===n&&o.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===n&&(o.hasAttribute("readonly")||o.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes')}return i?f(i,{container:r}):o?"cut"===n?u(o):f(o,{container:r}):void 0}({action:n,container:this.container,target:this.target(t),text:this.text(t)});this.emit(r?"success":"error",{action:n,text:r,trigger:t,clearSelection:function(){t&&t.focus(),document.activeElement.blur(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(e){return y("action",e)}},{key:"defaultTarget",value:function(e){var t=y("target",e);if(t)return document.querySelector(t)}},{key:"defaultText",value:function(e){return y("text",e)}},{key:"destroy",value:function(){this.listener.destroy()}}],r=[{key:"copy",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{container:document.body};return f(e,t)}},{key:"cut",value:function(e){return u(e)}},{key:"isSupported",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["copy","cut"],t="string"==typeof e?[e]:e,n=!!document.queryCommandSupported;return t.forEach((function(e){n=n&&!!document.queryCommandSupported(e)})),n}}],n&&m(t.prototype,n),r&&m(t,r),l}(o()),x=w},828:function(e){if("undefined"!=typeof Element&&!Element.prototype.matches){var t=Element.prototype;t.matches=t.matchesSelector||t.mozMatchesSelector||t.msMatchesSelector||t.oMatchesSelector||t.webkitMatchesSelector}e.exports=function(e,t){for(;e&&9!==e.nodeType;){if("function"==typeof e.matches&&e.matches(t))return e;e=e.parentNode}}},438:function(e,t,n){var r=n(828);function o(e,t,n,r,o){var s=i.apply(this,arguments);return e.addEventListener(n,s,o),{destroy:function(){e.removeEventListener(n,s,o)}}}function i(e,t,n,o){return function(n){n.delegateTarget=r(n.target,t),n.delegateTarget&&o.call(e,n)}}e.exports=function(e,t,n,r,i){return"function"==typeof e.addEventListener?o.apply(null,arguments):"function"==typeof n?o.bind(null,document).apply(null,arguments):("string"==typeof e&&(e=document.querySelectorAll(e)),Array.prototype.map.call(e,(function(e){return o(e,t,n,r,i)})))}},879:function(e,t){t.node=function(e){return void 0!==e&&e instanceof HTMLElement&&1===e.nodeType},t.nodeList=function(e){var n=Object.prototype.toString.call(e);return void 0!==e&&("[object NodeList]"===n||"[object HTMLCollection]"===n)&&"length"in e&&(0===e.length||t.node(e[0]))},t.string=function(e){return"string"==typeof e||e instanceof String},t.fn=function(e){return"[object Function]"===Object.prototype.toString.call(e)}},370:function(e,t,n){var r=n(879),o=n(438);e.exports=function(e,t,n){if(!e&&!t&&!n)throw new Error("Missing required arguments");if(!r.string(t))throw new TypeError("Second argument must be a String");if(!r.fn(n))throw new TypeError("Third argument must be a Function");if(r.node(e))return function(e,t,n){return e.addEventListener(t,n),{destroy:function(){e.removeEventListener(t,n)}}}(e,t,n);if(r.nodeList(e))return function(e,t,n){return Array.prototype.forEach.call(e,(function(e){e.addEventListener(t,n)})),{destroy:function(){Array.prototype.forEach.call(e,(function(e){e.removeEventListener(t,n)}))}}}(e,t,n);if(r.string(e))return function(e,t,n){return o(document.body,e,t,n)}(e,t,n);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}},817:function(e){e.exports=function(e){var t;if("SELECT"===e.nodeName)e.focus(),t=e.value;else if("INPUT"===e.nodeName||"TEXTAREA"===e.nodeName){var n=e.hasAttribute("readonly");n||e.setAttribute("readonly",""),e.select(),e.setSelectionRange(0,e.value.length),n||e.removeAttribute("readonly"),t=e.value}else{e.hasAttribute("contenteditable")&&e.focus();var r=window.getSelection(),o=document.createRange();o.selectNodeContents(e),r.removeAllRanges(),r.addRange(o),t=r.toString()}return t}},279:function(e){function t(){}t.prototype={on:function(e,t,n){var r=this.e||(this.e={});return(r[e]||(r[e]=[])).push({fn:t,ctx:n}),this},once:function(e,t,n){var r=this;function o(){r.off(e,o),t.apply(n,arguments)}return o._=t,this.on(e,o,n)},emit:function(e){for(var t=[].slice.call(arguments,1),n=((this.e||(this.e={}))[e]||[]).slice(),r=0,o=n.length;r<o;r++)n[r].fn.apply(n[r].ctx,t);return this},off:function(e,t){var n=this.e||(this.e={}),r=n[e],o=[];if(r&&t)for(var i=0,s=r.length;i<s;i++)r[i].fn!==t&&r[i].fn._!==t&&o.push(r[i]);return o.length?n[e]=o:delete n[e],this}},e.exports=t,e.exports.TinyEmitter=t}},t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={exports:{}};return e[r](o,o.exports,n),o.exports}return n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,{a:t}),t},n.d=function(e,t){for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n(686)}().default},e.exports=t()},9662:(e,t,n)=>{var r=n(7854),o=n(614),i=n(6330),s=r.TypeError;e.exports=function(e){if(o(e))return e;throw s(i(e)+" is not a function")}},6077:(e,t,n)=>{var r=n(7854),o=n(614),i=r.String,s=r.TypeError;e.exports=function(e){if("object"==typeof e||o(e))return e;throw s("Can't set "+i(e)+" as a prototype")}},1223:(e,t,n)=>{var r=n(5112),o=n(30),i=n(3070),s=r("unscopables"),a=Array.prototype;null==a[s]&&i.f(a,s,{configurable:!0,value:o(null)}),e.exports=function(e){a[s][e]=!0}},1530:(e,t,n)=>{"use strict";var r=n(8710).charAt;e.exports=function(e,t,n){return t+(n?r(e,t).length:1)}},5787:(e,t,n)=>{var r=n(7854),o=n(7976),i=r.TypeError;e.exports=function(e,t){if(o(t,e))return e;throw i("Incorrect invocation")}},9670:(e,t,n)=>{var r=n(7854),o=n(111),i=r.String,s=r.TypeError;e.exports=function(e){if(o(e))return e;throw s(i(e)+" is not an object")}},7556:(e,t,n)=>{var r=n(7293);e.exports=r((function(){if("function"==typeof ArrayBuffer){var e=new ArrayBuffer(8);Object.isExtensible(e)&&Object.defineProperty(e,"a",{value:8})}}))},8533:(e,t,n)=>{"use strict";var r=n(2092).forEach,o=n(9341)("forEach");e.exports=o?[].forEach:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}},1318:(e,t,n)=>{var r=n(5656),o=n(1400),i=n(6244),s=function(e){return function(t,n,s){var a,l=r(t),c=i(l),u=o(s,c);if(e&&n!=n){for(;c>u;)if((a=l[u++])!=a)return!0}else for(;c>u;u++)if((e||u in l)&&l[u]===n)return e||u||0;return!e&&-1}};e.exports={includes:s(!0),indexOf:s(!1)}},2092:(e,t,n)=>{var r=n(9974),o=n(1702),i=n(8361),s=n(7908),a=n(6244),l=n(5417),c=o([].push),u=function(e){var t=1==e,n=2==e,o=3==e,u=4==e,d=6==e,f=7==e,h=5==e||d;return function(p,m,v,g){for(var b,y,w=s(p),x=i(w),k=r(m,v),S=a(x),E=0,C=g||l,_=t?C(p,S):n||f?C(p,0):void 0;S>E;E++)if((h||E in x)&&(y=k(b=x[E],E,w),e))if(t)_[E]=y;else if(y)switch(e){case 3:return!0;case 5:return b;case 6:return E;case 2:c(_,b)}else switch(e){case 4:return!1;case 7:c(_,b)}return d?-1:o||u?u:_}};e.exports={forEach:u(0),map:u(1),filter:u(2),some:u(3),every:u(4),find:u(5),findIndex:u(6),filterReject:u(7)}},1194:(e,t,n)=>{var r=n(7293),o=n(5112),i=n(7392),s=o("species");e.exports=function(e){return i>=51||!r((function(){var t=[];return(t.constructor={})[s]=function(){return{foo:1}},1!==t[e](Boolean).foo}))}},9341:(e,t,n)=>{"use strict";var r=n(7293);e.exports=function(e,t){var n=[][e];return!!n&&r((function(){n.call(null,t||function(){throw 1},1)}))}},3671:(e,t,n)=>{var r=n(7854),o=n(9662),i=n(7908),s=n(8361),a=n(6244),l=r.TypeError,c=function(e){return function(t,n,r,c){o(n);var u=i(t),d=s(u),f=a(u),h=e?f-1:0,p=e?-1:1;if(r<2)for(;;){if(h in d){c=d[h],h+=p;break}if(h+=p,e?h<0:f<=h)throw l("Reduce of empty array with no initial value")}for(;e?h>=0:f>h;h+=p)h in d&&(c=n(c,d[h],h,u));return c}};e.exports={left:c(!1),right:c(!0)}},1589:(e,t,n)=>{var r=n(7854),o=n(1400),i=n(6244),s=n(6135),a=r.Array,l=Math.max;e.exports=function(e,t,n){for(var r=i(e),c=o(t,r),u=o(void 0===n?r:n,r),d=a(l(u-c,0)),f=0;c<u;c++,f++)s(d,f,e[c]);return d.length=f,d}},7475:(e,t,n)=>{var r=n(7854),o=n(3157),i=n(4411),s=n(111),a=n(5112)("species"),l=r.Array;e.exports=function(e){var t;return o(e)&&(t=e.constructor,(i(t)&&(t===l||o(t.prototype))||s(t)&&null===(t=t[a]))&&(t=void 0)),void 0===t?l:t}},5417:(e,t,n)=>{var r=n(7475);e.exports=function(e,t){return new(r(e))(0===t?0:t)}},7072:(e,t,n)=>{var r=n(5112)("iterator"),o=!1;try{var i=0,s={next:function(){return{done:!!i++}},return:function(){o=!0}};s[r]=function(){return this},Array.from(s,(function(){throw 2}))}catch(e){}e.exports=function(e,t){if(!t&&!o)return!1;var n=!1;try{var i={};i[r]=function(){return{next:function(){return{done:n=!0}}}},e(i)}catch(e){}return n}},4326:(e,t,n)=>{var r=n(1702),o=r({}.toString),i=r("".slice);e.exports=function(e){return i(o(e),8,-1)}},648:(e,t,n)=>{var r=n(7854),o=n(1694),i=n(614),s=n(4326),a=n(5112)("toStringTag"),l=r.Object,c="Arguments"==s(function(){return arguments}());e.exports=o?s:function(e){var t,n,r;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=l(e),a))?n:c?s(t):"Object"==(r=s(t))&&i(t.callee)?"Arguments":r}},9320:(e,t,n)=>{"use strict";var r=n(1702),o=n(2248),i=n(2423).getWeakData,s=n(9670),a=n(111),l=n(5787),c=n(408),u=n(2092),d=n(2597),f=n(9909),h=f.set,p=f.getterFor,m=u.find,v=u.findIndex,g=r([].splice),b=0,y=function(e){return e.frozen||(e.frozen=new w)},w=function(){this.entries=[]},x=function(e,t){return m(e.entries,(function(e){return e[0]===t}))};w.prototype={get:function(e){var t=x(this,e);if(t)return t[1]},has:function(e){return!!x(this,e)},set:function(e,t){var n=x(this,e);n?n[1]=t:this.entries.push([e,t])},delete:function(e){var t=v(this.entries,(function(t){return t[0]===e}));return~t&&g(this.entries,t,1),!!~t}},e.exports={getConstructor:function(e,t,n,r){var u=e((function(e,o){l(e,f),h(e,{type:t,id:b++,frozen:void 0}),null!=o&&c(o,e[r],{that:e,AS_ENTRIES:n})})),f=u.prototype,m=p(t),v=function(e,t,n){var r=m(e),o=i(s(t),!0);return!0===o?y(r).set(t,n):o[r.id]=n,e};return o(f,{delete:function(e){var t=m(this);if(!a(e))return!1;var n=i(e);return!0===n?y(t).delete(e):n&&d(n,t.id)&&delete n[t.id]},has:function(e){var t=m(this);if(!a(e))return!1;var n=i(e);return!0===n?y(t).has(e):n&&d(n,t.id)}}),o(f,n?{get:function(e){var t=m(this);if(a(e)){var n=i(e);return!0===n?y(t).get(e):n?n[t.id]:void 0}},set:function(e,t){return v(this,e,t)}}:{add:function(e){return v(this,e,!0)}}),u}}},7710:(e,t,n)=>{"use strict";var r=n(2109),o=n(7854),i=n(1702),s=n(4705),a=n(1320),l=n(2423),c=n(408),u=n(5787),d=n(614),f=n(111),h=n(7293),p=n(7072),m=n(8003),v=n(9587);e.exports=function(e,t,n){var g=-1!==e.indexOf("Map"),b=-1!==e.indexOf("Weak"),y=g?"set":"add",w=o[e],x=w&&w.prototype,k=w,S={},E=function(e){var t=i(x[e]);a(x,e,"add"==e?function(e){return t(this,0===e?0:e),this}:"delete"==e?function(e){return!(b&&!f(e))&&t(this,0===e?0:e)}:"get"==e?function(e){return b&&!f(e)?void 0:t(this,0===e?0:e)}:"has"==e?function(e){return!(b&&!f(e))&&t(this,0===e?0:e)}:function(e,n){return t(this,0===e?0:e,n),this})};if(s(e,!d(w)||!(b||x.forEach&&!h((function(){(new w).entries().next()})))))k=n.getConstructor(t,e,g,y),l.enable();else if(s(e,!0)){var C=new k,_=C[y](b?{}:-0,1)!=C,T=h((function(){C.has(1)})),O=p((function(e){new w(e)})),L=!b&&h((function(){for(var e=new w,t=5;t--;)e[y](t,t);return!e.has(-0)}));O||((k=t((function(e,t){u(e,x);var n=v(new w,e,k);return null!=t&&c(t,n[y],{that:n,AS_ENTRIES:g}),n}))).prototype=x,x.constructor=k),(T||L)&&(E("delete"),E("has"),g&&E("get")),(L||_)&&E(y),b&&x.clear&&delete x.clear}return S[e]=k,r({global:!0,forced:k!=w},S),m(k,e),b||n.setStrong(k,e,g),k}},9920:(e,t,n)=>{var r=n(2597),o=n(3887),i=n(1236),s=n(3070);e.exports=function(e,t,n){for(var a=o(t),l=s.f,c=i.f,u=0;u<a.length;u++){var d=a[u];r(e,d)||n&&r(n,d)||l(e,d,c(t,d))}}},8544:(e,t,n)=>{var r=n(7293);e.exports=!r((function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype}))},4994:(e,t,n)=>{"use strict";var r=n(3383).IteratorPrototype,o=n(30),i=n(9114),s=n(8003),a=n(7497),l=function(){return this};e.exports=function(e,t,n,c){var u=t+" Iterator";return e.prototype=o(r,{next:i(+!c,n)}),s(e,u,!1,!0),a[u]=l,e}},8880:(e,t,n)=>{var r=n(9781),o=n(3070),i=n(9114);e.exports=r?function(e,t,n){return o.f(e,t,i(1,n))}:function(e,t,n){return e[t]=n,e}},9114:e=>{e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},6135:(e,t,n)=>{"use strict";var r=n(4948),o=n(3070),i=n(9114);e.exports=function(e,t,n){var s=r(t);s in e?o.f(e,s,i(0,n)):e[s]=n}},654:(e,t,n)=>{"use strict";var r=n(2109),o=n(6916),i=n(1913),s=n(6530),a=n(614),l=n(4994),c=n(9518),u=n(7674),d=n(8003),f=n(8880),h=n(1320),p=n(5112),m=n(7497),v=n(3383),g=s.PROPER,b=s.CONFIGURABLE,y=v.IteratorPrototype,w=v.BUGGY_SAFARI_ITERATORS,x=p("iterator"),k="keys",S="values",E="entries",C=function(){return this};e.exports=function(e,t,n,s,p,v,_){l(n,t,s);var T,O,L,R=function(e){if(e===p&&F)return F;if(!w&&e in I)return I[e];switch(e){case k:case S:case E:return function(){return new n(this,e)}}return function(){return new n(this)}},D=t+" Iterator",A=!1,I=e.prototype,M=I[x]||I["@@iterator"]||p&&I[p],F=!w&&M||R(p),P="Array"==t&&I.entries||M;if(P&&(T=c(P.call(new e)))!==Object.prototype&&T.next&&(i||c(T)===y||(u?u(T,y):a(T[x])||h(T,x,C)),d(T,D,!0,!0),i&&(m[D]=C)),g&&p==S&&M&&M.name!==S&&(!i&&b?f(I,"name",S):(A=!0,F=function(){return o(M,this)})),p)if(O={values:R(S),keys:v?F:R(k),entries:R(E)},_)for(L in O)(w||A||!(L in I))&&h(I,L,O[L]);else r({target:t,proto:!0,forced:w||A},O);return i&&!_||I[x]===F||h(I,x,F,{name:p}),m[t]=F,O}},9781:(e,t,n)=>{var r=n(7293);e.exports=!r((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},317:(e,t,n)=>{var r=n(7854),o=n(111),i=r.document,s=o(i)&&o(i.createElement);e.exports=function(e){return s?i.createElement(e):{}}},8324:e=>{e.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},8509:(e,t,n)=>{var r=n(317)("span").classList,o=r&&r.constructor&&r.constructor.prototype;e.exports=o===Object.prototype?void 0:o},5268:(e,t,n)=>{var r=n(4326),o=n(7854);e.exports="process"==r(o.process)},8113:(e,t,n)=>{var r=n(5005);e.exports=r("navigator","userAgent")||""},7392:(e,t,n)=>{var r,o,i=n(7854),s=n(8113),a=i.process,l=i.Deno,c=a&&a.versions||l&&l.version,u=c&&c.v8;u&&(o=(r=u.split("."))[0]>0&&r[0]<4?1:+(r[0]+r[1])),!o&&s&&(!(r=s.match(/Edge\/(\d+)/))||r[1]>=74)&&(r=s.match(/Chrome\/(\d+)/))&&(o=+r[1]),e.exports=o},748:e=>{e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},2109:(e,t,n)=>{var r=n(7854),o=n(1236).f,i=n(8880),s=n(1320),a=n(3505),l=n(9920),c=n(4705);e.exports=function(e,t){var n,u,d,f,h,p=e.target,m=e.global,v=e.stat;if(n=m?r:v?r[p]||a(p,{}):(r[p]||{}).prototype)for(u in t){if(f=t[u],d=e.noTargetGet?(h=o(n,u))&&h.value:n[u],!c(m?u:p+(v?".":"#")+u,e.forced)&&void 0!==d){if(typeof f==typeof d)continue;l(f,d)}(e.sham||d&&d.sham)&&i(f,"sham",!0),s(n,u,f,e)}}},7293:e=>{e.exports=function(e){try{return!!e()}catch(e){return!0}}},7007:(e,t,n)=>{"use strict";n(4916);var r=n(1702),o=n(1320),i=n(2261),s=n(7293),a=n(5112),l=n(8880),c=a("species"),u=RegExp.prototype;e.exports=function(e,t,n,d){var f=a(e),h=!s((function(){var t={};return t[f]=function(){return 7},7!=""[e](t)})),p=h&&!s((function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[c]=function(){return n},n.flags="",n[f]=/./[f]),n.exec=function(){return t=!0,null},n[f](""),!t}));if(!h||!p||n){var m=r(/./[f]),v=t(f,""[e],(function(e,t,n,o,s){var a=r(e),l=t.exec;return l===i||l===u.exec?h&&!s?{done:!0,value:m(t,n,o)}:{done:!0,value:a(n,t,o)}:{done:!1}}));o(String.prototype,e,v[0]),o(u,f,v[1])}d&&l(u[f],"sham",!0)}},6677:(e,t,n)=>{var r=n(7293);e.exports=!r((function(){return Object.isExtensible(Object.preventExtensions({}))}))},2104:(e,t,n)=>{var r=n(4374),o=Function.prototype,i=o.apply,s=o.call;e.exports="object"==typeof Reflect&&Reflect.apply||(r?s.bind(i):function(){return s.apply(i,arguments)})},9974:(e,t,n)=>{var r=n(1702),o=n(9662),i=n(4374),s=r(r.bind);e.exports=function(e,t){return o(e),void 0===t?e:i?s(e,t):function(){return e.apply(t,arguments)}}},4374:(e,t,n)=>{var r=n(7293);e.exports=!r((function(){var e=function(){}.bind();return"function"!=typeof e||e.hasOwnProperty("prototype")}))},6916:(e,t,n)=>{var r=n(4374),o=Function.prototype.call;e.exports=r?o.bind(o):function(){return o.apply(o,arguments)}},6530:(e,t,n)=>{var r=n(9781),o=n(2597),i=Function.prototype,s=r&&Object.getOwnPropertyDescriptor,a=o(i,"name"),l=a&&"something"===function(){}.name,c=a&&(!r||r&&s(i,"name").configurable);e.exports={EXISTS:a,PROPER:l,CONFIGURABLE:c}},1702:(e,t,n)=>{var r=n(4374),o=Function.prototype,i=o.bind,s=o.call,a=r&&i.bind(s,s);e.exports=r?function(e){return e&&a(e)}:function(e){return e&&function(){return s.apply(e,arguments)}}},5005:(e,t,n)=>{var r=n(7854),o=n(614),i=function(e){return o(e)?e:void 0};e.exports=function(e,t){return arguments.length<2?i(r[e]):r[e]&&r[e][t]}},1246:(e,t,n)=>{var r=n(648),o=n(8173),i=n(7497),s=n(5112)("iterator");e.exports=function(e){if(null!=e)return o(e,s)||o(e,"@@iterator")||i[r(e)]}},8554:(e,t,n)=>{var r=n(7854),o=n(6916),i=n(9662),s=n(9670),a=n(6330),l=n(1246),c=r.TypeError;e.exports=function(e,t){var n=arguments.length<2?l(e):t;if(i(n))return s(o(n,e));throw c(a(e)+" is not iterable")}},8173:(e,t,n)=>{var r=n(9662);e.exports=function(e,t){var n=e[t];return null==n?void 0:r(n)}},647:(e,t,n)=>{var r=n(1702),o=n(7908),i=Math.floor,s=r("".charAt),a=r("".replace),l=r("".slice),c=/\$([$&'`]|\d{1,2}|<[^>]*>)/g,u=/\$([$&'`]|\d{1,2})/g;e.exports=function(e,t,n,r,d,f){var h=n+e.length,p=r.length,m=u;return void 0!==d&&(d=o(d),m=c),a(f,m,(function(o,a){var c;switch(s(a,0)){case"$":return"$";case"&":return e;case"`":return l(t,0,n);case"'":return l(t,h);case"<":c=d[l(a,1,-1)];break;default:var u=+a;if(0===u)return o;if(u>p){var f=i(u/10);return 0===f?o:f<=p?void 0===r[f-1]?s(a,1):r[f-1]+s(a,1):o}c=r[u-1]}return void 0===c?"":c}))}},7854:(e,t,n)=>{var r=function(e){return e&&e.Math==Math&&e};e.exports=r("object"==typeof globalThis&&globalThis)||r("object"==typeof window&&window)||r("object"==typeof self&&self)||r("object"==typeof n.g&&n.g)||function(){return this}()||Function("return this")()},2597:(e,t,n)=>{var r=n(1702),o=n(7908),i=r({}.hasOwnProperty);e.exports=Object.hasOwn||function(e,t){return i(o(e),t)}},3501:e=>{e.exports={}},490:(e,t,n)=>{var r=n(5005);e.exports=r("document","documentElement")},4664:(e,t,n)=>{var r=n(9781),o=n(7293),i=n(317);e.exports=!r&&!o((function(){return 7!=Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},8361:(e,t,n)=>{var r=n(7854),o=n(1702),i=n(7293),s=n(4326),a=r.Object,l=o("".split);e.exports=i((function(){return!a("z").propertyIsEnumerable(0)}))?function(e){return"String"==s(e)?l(e,""):a(e)}:a},9587:(e,t,n)=>{var r=n(614),o=n(111),i=n(7674);e.exports=function(e,t,n){var s,a;return i&&r(s=t.constructor)&&s!==n&&o(a=s.prototype)&&a!==n.prototype&&i(e,a),e}},2788:(e,t,n)=>{var r=n(1702),o=n(614),i=n(5465),s=r(Function.toString);o(i.inspectSource)||(i.inspectSource=function(e){return s(e)}),e.exports=i.inspectSource},2423:(e,t,n)=>{var r=n(2109),o=n(1702),i=n(3501),s=n(111),a=n(2597),l=n(3070).f,c=n(8006),u=n(1156),d=n(2050),f=n(9711),h=n(6677),p=!1,m=f("meta"),v=0,g=function(e){l(e,m,{value:{objectID:"O"+v++,weakData:{}}})},b=e.exports={enable:function(){b.enable=function(){},p=!0;var e=c.f,t=o([].splice),n={};n[m]=1,e(n).length&&(c.f=function(n){for(var r=e(n),o=0,i=r.length;o<i;o++)if(r[o]===m){t(r,o,1);break}return r},r({target:"Object",stat:!0,forced:!0},{getOwnPropertyNames:u.f}))},fastKey:function(e,t){if(!s(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!a(e,m)){if(!d(e))return"F";if(!t)return"E";g(e)}return e[m].objectID},getWeakData:function(e,t){if(!a(e,m)){if(!d(e))return!0;if(!t)return!1;g(e)}return e[m].weakData},onFreeze:function(e){return h&&p&&d(e)&&!a(e,m)&&g(e),e}};i[m]=!0},9909:(e,t,n)=>{var r,o,i,s=n(8536),a=n(7854),l=n(1702),c=n(111),u=n(8880),d=n(2597),f=n(5465),h=n(6200),p=n(3501),m="Object already initialized",v=a.TypeError,g=a.WeakMap;if(s||f.state){var b=f.state||(f.state=new g),y=l(b.get),w=l(b.has),x=l(b.set);r=function(e,t){if(w(b,e))throw new v(m);return t.facade=e,x(b,e,t),t},o=function(e){return y(b,e)||{}},i=function(e){return w(b,e)}}else{var k=h("state");p[k]=!0,r=function(e,t){if(d(e,k))throw new v(m);return t.facade=e,u(e,k,t),t},o=function(e){return d(e,k)?e[k]:{}},i=function(e){return d(e,k)}}e.exports={set:r,get:o,has:i,enforce:function(e){return i(e)?o(e):r(e,{})},getterFor:function(e){return function(t){var n;if(!c(t)||(n=o(t)).type!==e)throw v("Incompatible receiver, "+e+" required");return n}}}},7659:(e,t,n)=>{var r=n(5112),o=n(7497),i=r("iterator"),s=Array.prototype;e.exports=function(e){return void 0!==e&&(o.Array===e||s[i]===e)}},3157:(e,t,n)=>{var r=n(4326);e.exports=Array.isArray||function(e){return"Array"==r(e)}},614:e=>{e.exports=function(e){return"function"==typeof e}},4411:(e,t,n)=>{var r=n(1702),o=n(7293),i=n(614),s=n(648),a=n(5005),l=n(2788),c=function(){},u=[],d=a("Reflect","construct"),f=/^\s*(?:class|function)\b/,h=r(f.exec),p=!f.exec(c),m=function(e){if(!i(e))return!1;try{return d(c,u,e),!0}catch(e){return!1}},v=function(e){if(!i(e))return!1;switch(s(e)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}try{return p||!!h(f,l(e))}catch(e){return!0}};v.sham=!0,e.exports=!d||o((function(){var e;return m(m.call)||!m(Object)||!m((function(){e=!0}))||e}))?v:m},4705:(e,t,n)=>{var r=n(7293),o=n(614),i=/#|\.prototype\./,s=function(e,t){var n=l[a(e)];return n==u||n!=c&&(o(t)?r(t):!!t)},a=s.normalize=function(e){return String(e).replace(i,".").toLowerCase()},l=s.data={},c=s.NATIVE="N",u=s.POLYFILL="P";e.exports=s},111:(e,t,n)=>{var r=n(614);e.exports=function(e){return"object"==typeof e?null!==e:r(e)}},1913:e=>{e.exports=!1},2190:(e,t,n)=>{var r=n(7854),o=n(5005),i=n(614),s=n(7976),a=n(3307),l=r.Object;e.exports=a?function(e){return"symbol"==typeof e}:function(e){var t=o("Symbol");return i(t)&&s(t.prototype,l(e))}},408:(e,t,n)=>{var r=n(7854),o=n(9974),i=n(6916),s=n(9670),a=n(6330),l=n(7659),c=n(6244),u=n(7976),d=n(8554),f=n(1246),h=n(9212),p=r.TypeError,m=function(e,t){this.stopped=e,this.result=t},v=m.prototype;e.exports=function(e,t,n){var r,g,b,y,w,x,k,S=n&&n.that,E=!(!n||!n.AS_ENTRIES),C=!(!n||!n.IS_ITERATOR),_=!(!n||!n.INTERRUPTED),T=o(t,S),O=function(e){return r&&h(r,"normal",e),new m(!0,e)},L=function(e){return E?(s(e),_?T(e[0],e[1],O):T(e[0],e[1])):_?T(e,O):T(e)};if(C)r=e;else{if(!(g=f(e)))throw p(a(e)+" is not iterable");if(l(g)){for(b=0,y=c(e);y>b;b++)if((w=L(e[b]))&&u(v,w))return w;return new m(!1)}r=d(e,g)}for(x=r.next;!(k=i(x,r)).done;){try{w=L(k.value)}catch(e){h(r,"throw",e)}if("object"==typeof w&&w&&u(v,w))return w}return new m(!1)}},9212:(e,t,n)=>{var r=n(6916),o=n(9670),i=n(8173);e.exports=function(e,t,n){var s,a;o(e);try{if(!(s=i(e,"return"))){if("throw"===t)throw n;return n}s=r(s,e)}catch(e){a=!0,s=e}if("throw"===t)throw n;if(a)throw s;return o(s),n}},3383:(e,t,n)=>{"use strict";var r,o,i,s=n(7293),a=n(614),l=n(30),c=n(9518),u=n(1320),d=n(5112),f=n(1913),h=d("iterator"),p=!1;[].keys&&("next"in(i=[].keys())?(o=c(c(i)))!==Object.prototype&&(r=o):p=!0),null==r||s((function(){var e={};return r[h].call(e)!==e}))?r={}:f&&(r=l(r)),a(r[h])||u(r,h,(function(){return this})),e.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:p}},7497:e=>{e.exports={}},6244:(e,t,n)=>{var r=n(7466);e.exports=function(e){return r(e.length)}},133:(e,t,n)=>{var r=n(7392),o=n(7293);e.exports=!!Object.getOwnPropertySymbols&&!o((function(){var e=Symbol();return!String(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&r&&r<41}))},8536:(e,t,n)=>{var r=n(7854),o=n(614),i=n(2788),s=r.WeakMap;e.exports=o(s)&&/native code/.test(i(s))},3009:(e,t,n)=>{var r=n(7854),o=n(7293),i=n(1702),s=n(1340),a=n(3111).trim,l=n(1361),c=r.parseInt,u=r.Symbol,d=u&&u.iterator,f=/^[+-]?0x/i,h=i(f.exec),p=8!==c(l+"08")||22!==c(l+"0x16")||d&&!o((function(){c(Object(d))}));e.exports=p?function(e,t){var n=a(s(e));return c(n,t>>>0||(h(f,n)?16:10))}:c},1574:(e,t,n)=>{"use strict";var r=n(9781),o=n(1702),i=n(6916),s=n(7293),a=n(1956),l=n(5181),c=n(5296),u=n(7908),d=n(8361),f=Object.assign,h=Object.defineProperty,p=o([].concat);e.exports=!f||s((function(){if(r&&1!==f({b:1},f(h({},"a",{enumerable:!0,get:function(){h(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol(),o="abcdefghijklmnopqrst";return e[n]=7,o.split("").forEach((function(e){t[e]=e})),7!=f({},e)[n]||a(f({},t)).join("")!=o}))?function(e,t){for(var n=u(e),o=arguments.length,s=1,f=l.f,h=c.f;o>s;)for(var m,v=d(arguments[s++]),g=f?p(a(v),f(v)):a(v),b=g.length,y=0;b>y;)m=g[y++],r&&!i(h,v,m)||(n[m]=v[m]);return n}:f},30:(e,t,n)=>{var r,o=n(9670),i=n(6048),s=n(748),a=n(3501),l=n(490),c=n(317),u=n(6200)("IE_PROTO"),d=function(){},f=function(e){return"<script>"+e+"<\/script>"},h=function(e){e.write(f("")),e.close();var t=e.parentWindow.Object;return e=null,t},p=function(){try{r=new ActiveXObject("htmlfile")}catch(e){}var e,t;p="undefined"!=typeof document?document.domain&&r?h(r):((t=c("iframe")).style.display="none",l.appendChild(t),t.src=String("javascript:"),(e=t.contentWindow.document).open(),e.write(f("document.F=Object")),e.close(),e.F):h(r);for(var n=s.length;n--;)delete p.prototype[s[n]];return p()};a[u]=!0,e.exports=Object.create||function(e,t){var n;return null!==e?(d.prototype=o(e),n=new d,d.prototype=null,n[u]=e):n=p(),void 0===t?n:i.f(n,t)}},6048:(e,t,n)=>{var r=n(9781),o=n(3353),i=n(3070),s=n(9670),a=n(5656),l=n(1956);t.f=r&&!o?Object.defineProperties:function(e,t){s(e);for(var n,r=a(t),o=l(t),c=o.length,u=0;c>u;)i.f(e,n=o[u++],r[n]);return e}},3070:(e,t,n)=>{var r=n(7854),o=n(9781),i=n(4664),s=n(3353),a=n(9670),l=n(4948),c=r.TypeError,u=Object.defineProperty,d=Object.getOwnPropertyDescriptor;t.f=o?s?function(e,t,n){if(a(e),t=l(t),a(n),"function"==typeof e&&"prototype"===t&&"value"in n&&"writable"in n&&!n.writable){var r=d(e,t);r&&r.writable&&(e[t]=n.value,n={configurable:"configurable"in n?n.configurable:r.configurable,enumerable:"enumerable"in n?n.enumerable:r.enumerable,writable:!1})}return u(e,t,n)}:u:function(e,t,n){if(a(e),t=l(t),a(n),i)try{return u(e,t,n)}catch(e){}if("get"in n||"set"in n)throw c("Accessors not supported");return"value"in n&&(e[t]=n.value),e}},1236:(e,t,n)=>{var r=n(9781),o=n(6916),i=n(5296),s=n(9114),a=n(5656),l=n(4948),c=n(2597),u=n(4664),d=Object.getOwnPropertyDescriptor;t.f=r?d:function(e,t){if(e=a(e),t=l(t),u)try{return d(e,t)}catch(e){}if(c(e,t))return s(!o(i.f,e,t),e[t])}},1156:(e,t,n)=>{var r=n(4326),o=n(5656),i=n(8006).f,s=n(1589),a="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];e.exports.f=function(e){return a&&"Window"==r(e)?function(e){try{return i(e)}catch(e){return s(a)}}(e):i(o(e))}},8006:(e,t,n)=>{var r=n(6324),o=n(748).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return r(e,o)}},5181:(e,t)=>{t.f=Object.getOwnPropertySymbols},9518:(e,t,n)=>{var r=n(7854),o=n(2597),i=n(614),s=n(7908),a=n(6200),l=n(8544),c=a("IE_PROTO"),u=r.Object,d=u.prototype;e.exports=l?u.getPrototypeOf:function(e){var t=s(e);if(o(t,c))return t[c];var n=t.constructor;return i(n)&&t instanceof n?n.prototype:t instanceof u?d:null}},2050:(e,t,n)=>{var r=n(7293),o=n(111),i=n(4326),s=n(7556),a=Object.isExtensible,l=r((function(){a(1)}));e.exports=l||s?function(e){return!!o(e)&&(!s||"ArrayBuffer"!=i(e))&&(!a||a(e))}:a},7976:(e,t,n)=>{var r=n(1702);e.exports=r({}.isPrototypeOf)},6324:(e,t,n)=>{var r=n(1702),o=n(2597),i=n(5656),s=n(1318).indexOf,a=n(3501),l=r([].push);e.exports=function(e,t){var n,r=i(e),c=0,u=[];for(n in r)!o(a,n)&&o(r,n)&&l(u,n);for(;t.length>c;)o(r,n=t[c++])&&(~s(u,n)||l(u,n));return u}},1956:(e,t,n)=>{var r=n(6324),o=n(748);e.exports=Object.keys||function(e){return r(e,o)}},5296:(e,t)=>{"use strict";var n={}.propertyIsEnumerable,r=Object.getOwnPropertyDescriptor,o=r&&!n.call({1:2},1);t.f=o?function(e){var t=r(this,e);return!!t&&t.enumerable}:n},7674:(e,t,n)=>{var r=n(1702),o=n(9670),i=n(6077);e.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,n={};try{(e=r(Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set))(n,[]),t=n instanceof Array}catch(e){}return function(n,r){return o(n),i(r),t?e(n,r):n.__proto__=r,n}}():void 0)},288:(e,t,n)=>{"use strict";var r=n(1694),o=n(648);e.exports=r?{}.toString:function(){return"[object "+o(this)+"]"}},2140:(e,t,n)=>{var r=n(7854),o=n(6916),i=n(614),s=n(111),a=r.TypeError;e.exports=function(e,t){var n,r;if("string"===t&&i(n=e.toString)&&!s(r=o(n,e)))return r;if(i(n=e.valueOf)&&!s(r=o(n,e)))return r;if("string"!==t&&i(n=e.toString)&&!s(r=o(n,e)))return r;throw a("Can't convert object to primitive value")}},3887:(e,t,n)=>{var r=n(5005),o=n(1702),i=n(8006),s=n(5181),a=n(9670),l=o([].concat);e.exports=r("Reflect","ownKeys")||function(e){var t=i.f(a(e)),n=s.f;return n?l(t,n(e)):t}},2248:(e,t,n)=>{var r=n(1320);e.exports=function(e,t,n){for(var o in t)r(e,o,t[o],n);return e}},1320:(e,t,n)=>{var r=n(7854),o=n(614),i=n(2597),s=n(8880),a=n(3505),l=n(2788),c=n(9909),u=n(6530).CONFIGURABLE,d=c.get,f=c.enforce,h=String(String).split("String");(e.exports=function(e,t,n,l){var c,d=!!l&&!!l.unsafe,p=!!l&&!!l.enumerable,m=!!l&&!!l.noTargetGet,v=l&&void 0!==l.name?l.name:t;o(n)&&("Symbol("===String(v).slice(0,7)&&(v="["+String(v).replace(/^Symbol\(([^)]*)\)/,"$1")+"]"),(!i(n,"name")||u&&n.name!==v)&&s(n,"name",v),(c=f(n)).source||(c.source=h.join("string"==typeof v?v:""))),e!==r?(d?!m&&e[t]&&(p=!0):delete e[t],p?e[t]=n:s(e,t,n)):p?e[t]=n:a(t,n)})(Function.prototype,"toString",(function(){return o(this)&&d(this).source||l(this)}))},7651:(e,t,n)=>{var r=n(7854),o=n(6916),i=n(9670),s=n(614),a=n(4326),l=n(2261),c=r.TypeError;e.exports=function(e,t){var n=e.exec;if(s(n)){var r=o(n,e,t);return null!==r&&i(r),r}if("RegExp"===a(e))return o(l,e,t);throw c("RegExp#exec called on incompatible receiver")}},2261:(e,t,n)=>{"use strict";var r,o,i=n(6916),s=n(1702),a=n(1340),l=n(7066),c=n(2999),u=n(2309),d=n(30),f=n(9909).get,h=n(9441),p=n(7168),m=u("native-string-replace",String.prototype.replace),v=RegExp.prototype.exec,g=v,b=s("".charAt),y=s("".indexOf),w=s("".replace),x=s("".slice),k=(o=/b*/g,i(v,r=/a/,"a"),i(v,o,"a"),0!==r.lastIndex||0!==o.lastIndex),S=c.BROKEN_CARET,E=void 0!==/()??/.exec("")[1];(k||E||S||h||p)&&(g=function(e){var t,n,r,o,s,c,u,h=this,p=f(h),C=a(e),_=p.raw;if(_)return _.lastIndex=h.lastIndex,t=i(g,_,C),h.lastIndex=_.lastIndex,t;var T=p.groups,O=S&&h.sticky,L=i(l,h),R=h.source,D=0,A=C;if(O&&(L=w(L,"y",""),-1===y(L,"g")&&(L+="g"),A=x(C,h.lastIndex),h.lastIndex>0&&(!h.multiline||h.multiline&&"\n"!==b(C,h.lastIndex-1))&&(R="(?: "+R+")",A=" "+A,D++),n=new RegExp("^(?:"+R+")",L)),E&&(n=new RegExp("^"+R+"$(?!\\s)",L)),k&&(r=h.lastIndex),o=i(v,O?n:h,A),O?o?(o.input=x(o.input,D),o[0]=x(o[0],D),o.index=h.lastIndex,h.lastIndex+=o[0].length):h.lastIndex=0:k&&o&&(h.lastIndex=h.global?o.index+o[0].length:r),E&&o&&o.length>1&&i(m,o[0],n,(function(){for(s=1;s<arguments.length-2;s++)void 0===arguments[s]&&(o[s]=void 0)})),o&&T)for(o.groups=c=d(null),s=0;s<T.length;s++)c[(u=T[s])[0]]=o[u[1]];return o}),e.exports=g},7066:(e,t,n)=>{"use strict";var r=n(9670);e.exports=function(){var e=r(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.dotAll&&(t+="s"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t}},2999:(e,t,n)=>{var r=n(7293),o=n(7854).RegExp,i=r((function(){var e=o("a","y");return e.lastIndex=2,null!=e.exec("abcd")})),s=i||r((function(){return!o("a","y").sticky})),a=i||r((function(){var e=o("^r","gy");return e.lastIndex=2,null!=e.exec("str")}));e.exports={BROKEN_CARET:a,MISSED_STICKY:s,UNSUPPORTED_Y:i}},9441:(e,t,n)=>{var r=n(7293),o=n(7854).RegExp;e.exports=r((function(){var e=o(".","s");return!(e.dotAll&&e.exec("\n")&&"s"===e.flags)}))},7168:(e,t,n)=>{var r=n(7293),o=n(7854).RegExp;e.exports=r((function(){var e=o("(?<a>b)","g");return"b"!==e.exec("b").groups.a||"bc"!=="b".replace(e,"$<a>c")}))},4488:(e,t,n)=>{var r=n(7854).TypeError;e.exports=function(e){if(null==e)throw r("Can't call method on "+e);return e}},3505:(e,t,n)=>{var r=n(7854),o=Object.defineProperty;e.exports=function(e,t){try{o(r,e,{value:t,configurable:!0,writable:!0})}catch(n){r[e]=t}return t}},8003:(e,t,n)=>{var r=n(3070).f,o=n(2597),i=n(5112)("toStringTag");e.exports=function(e,t,n){e&&!n&&(e=e.prototype),e&&!o(e,i)&&r(e,i,{configurable:!0,value:t})}},6200:(e,t,n)=>{var r=n(2309),o=n(9711),i=r("keys");e.exports=function(e){return i[e]||(i[e]=o(e))}},5465:(e,t,n)=>{var r=n(7854),o=n(3505),i="__core-js_shared__",s=r[i]||o(i,{});e.exports=s},2309:(e,t,n)=>{var r=n(1913),o=n(5465);(e.exports=function(e,t){return o[e]||(o[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.21.0",mode:r?"pure":"global",copyright:"© 2014-2022 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.21.0/LICENSE",source:"https://github.com/zloirock/core-js"})},8710:(e,t,n)=>{var r=n(1702),o=n(9303),i=n(1340),s=n(4488),a=r("".charAt),l=r("".charCodeAt),c=r("".slice),u=function(e){return function(t,n){var r,u,d=i(s(t)),f=o(n),h=d.length;return f<0||f>=h?e?"":void 0:(r=l(d,f))<55296||r>56319||f+1===h||(u=l(d,f+1))<56320||u>57343?e?a(d,f):r:e?c(d,f,f+2):u-56320+(r-55296<<10)+65536}};e.exports={codeAt:u(!1),charAt:u(!0)}},3111:(e,t,n)=>{var r=n(1702),o=n(4488),i=n(1340),s=n(1361),a=r("".replace),l="["+s+"]",c=RegExp("^"+l+l+"*"),u=RegExp(l+l+"*$"),d=function(e){return function(t){var n=i(o(t));return 1&e&&(n=a(n,c,"")),2&e&&(n=a(n,u,"")),n}};e.exports={start:d(1),end:d(2),trim:d(3)}},1400:(e,t,n)=>{var r=n(9303),o=Math.max,i=Math.min;e.exports=function(e,t){var n=r(e);return n<0?o(n+t,0):i(n,t)}},5656:(e,t,n)=>{var r=n(8361),o=n(4488);e.exports=function(e){return r(o(e))}},9303:e=>{var t=Math.ceil,n=Math.floor;e.exports=function(e){var r=+e;return r!=r||0===r?0:(r>0?n:t)(r)}},7466:(e,t,n)=>{var r=n(9303),o=Math.min;e.exports=function(e){return e>0?o(r(e),9007199254740991):0}},7908:(e,t,n)=>{var r=n(7854),o=n(4488),i=r.Object;e.exports=function(e){return i(o(e))}},7593:(e,t,n)=>{var r=n(7854),o=n(6916),i=n(111),s=n(2190),a=n(8173),l=n(2140),c=n(5112),u=r.TypeError,d=c("toPrimitive");e.exports=function(e,t){if(!i(e)||s(e))return e;var n,r=a(e,d);if(r){if(void 0===t&&(t="default"),n=o(r,e,t),!i(n)||s(n))return n;throw u("Can't convert object to primitive value")}return void 0===t&&(t="number"),l(e,t)}},4948:(e,t,n)=>{var r=n(7593),o=n(2190);e.exports=function(e){var t=r(e,"string");return o(t)?t:t+""}},1694:(e,t,n)=>{var r={};r[n(5112)("toStringTag")]="z",e.exports="[object z]"===String(r)},1340:(e,t,n)=>{var r=n(7854),o=n(648),i=r.String;e.exports=function(e){if("Symbol"===o(e))throw TypeError("Cannot convert a Symbol value to a string");return i(e)}},6330:(e,t,n)=>{var r=n(7854).String;e.exports=function(e){try{return r(e)}catch(e){return"Object"}}},9711:(e,t,n)=>{var r=n(1702),o=0,i=Math.random(),s=r(1..toString);e.exports=function(e){return"Symbol("+(void 0===e?"":e)+")_"+s(++o+i,36)}},3307:(e,t,n)=>{var r=n(133);e.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},3353:(e,t,n)=>{var r=n(9781),o=n(7293);e.exports=r&&o((function(){return 42!=Object.defineProperty((function(){}),"prototype",{value:42,writable:!1}).prototype}))},5112:(e,t,n)=>{var r=n(7854),o=n(2309),i=n(2597),s=n(9711),a=n(133),l=n(3307),c=o("wks"),u=r.Symbol,d=u&&u.for,f=l?u:u&&u.withoutSetter||s;e.exports=function(e){if(!i(c,e)||!a&&"string"!=typeof c[e]){var t="Symbol."+e;a&&i(u,e)?c[e]=u[e]:c[e]=l&&d?d(t):f(t)}return c[e]}},1361:e=>{e.exports="\t\n\v\f\r                　\u2028\u2029\ufeff"},7327:(e,t,n)=>{"use strict";var r=n(2109),o=n(2092).filter;r({target:"Array",proto:!0,forced:!n(1194)("filter")},{filter:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}})},9554:(e,t,n)=>{"use strict";var r=n(2109),o=n(8533);r({target:"Array",proto:!0,forced:[].forEach!=o},{forEach:o})},6992:(e,t,n)=>{"use strict";var r=n(5656),o=n(1223),i=n(7497),s=n(9909),a=n(3070).f,l=n(654),c=n(1913),u=n(9781),d="Array Iterator",f=s.set,h=s.getterFor(d);e.exports=l(Array,"Array",(function(e,t){f(this,{type:d,target:r(e),index:0,kind:t})}),(function(){var e=h(this),t=e.target,n=e.kind,r=e.index++;return!t||r>=t.length?(e.target=void 0,{value:void 0,done:!0}):"keys"==n?{value:r,done:!1}:"values"==n?{value:t[r],done:!1}:{value:[r,t[r]],done:!1}}),"values");var p=i.Arguments=i.Array;if(o("keys"),o("values"),o("entries"),!c&&u&&"values"!==p.name)try{a(p,"name",{value:"values"})}catch(e){}},5827:(e,t,n)=>{"use strict";var r=n(2109),o=n(3671).left,i=n(9341),s=n(7392),a=n(5268);r({target:"Array",proto:!0,forced:!i("reduce")||!a&&s>79&&s<83},{reduce:function(e){var t=arguments.length;return o(this,e,t,t>1?arguments[1]:void 0)}})},8309:(e,t,n)=>{var r=n(9781),o=n(6530).EXISTS,i=n(1702),s=n(3070).f,a=Function.prototype,l=i(a.toString),c=/function\b(?:\s|\/\*[\S\s]*?\*\/|\/\/[^\n\r]*[\n\r]+)*([^\s(/]*)/,u=i(c.exec);r&&!o&&s(a,"name",{configurable:!0,get:function(){try{return u(c,l(this))[1]}catch(e){return""}}})},9601:(e,t,n)=>{var r=n(2109),o=n(1574);r({target:"Object",stat:!0,forced:Object.assign!==o},{assign:o})},1539:(e,t,n)=>{var r=n(1694),o=n(1320),i=n(288);r||o(Object.prototype,"toString",i,{unsafe:!0})},1058:(e,t,n)=>{var r=n(2109),o=n(3009);r({global:!0,forced:parseInt!=o},{parseInt:o})},4916:(e,t,n)=>{"use strict";var r=n(2109),o=n(2261);r({target:"RegExp",proto:!0,forced:/./.exec!==o},{exec:o})},8783:(e,t,n)=>{"use strict";var r=n(8710).charAt,o=n(1340),i=n(9909),s=n(654),a="String Iterator",l=i.set,c=i.getterFor(a);s(String,"String",(function(e){l(this,{type:a,string:o(e),index:0})}),(function(){var e,t=c(this),n=t.string,o=t.index;return o>=n.length?{value:void 0,done:!0}:(e=r(n,o),t.index+=e.length,{value:e,done:!1})}))},4723:(e,t,n)=>{"use strict";var r=n(6916),o=n(7007),i=n(9670),s=n(7466),a=n(1340),l=n(4488),c=n(8173),u=n(1530),d=n(7651);o("match",(function(e,t,n){return[function(t){var n=l(this),o=null==t?void 0:c(t,e);return o?r(o,t,n):new RegExp(t)[e](a(n))},function(e){var r=i(this),o=a(e),l=n(t,r,o);if(l.done)return l.value;if(!r.global)return d(r,o);var c=r.unicode;r.lastIndex=0;for(var f,h=[],p=0;null!==(f=d(r,o));){var m=a(f[0]);h[p]=m,""===m&&(r.lastIndex=u(o,s(r.lastIndex),c)),p++}return 0===p?null:h}]}))},5306:(e,t,n)=>{"use strict";var r=n(2104),o=n(6916),i=n(1702),s=n(7007),a=n(7293),l=n(9670),c=n(614),u=n(9303),d=n(7466),f=n(1340),h=n(4488),p=n(1530),m=n(8173),v=n(647),g=n(7651),b=n(5112)("replace"),y=Math.max,w=Math.min,x=i([].concat),k=i([].push),S=i("".indexOf),E=i("".slice),C="$0"==="a".replace(/./,"$0"),_=!!/./[b]&&""===/./[b]("a","$0");s("replace",(function(e,t,n){var i=_?"$":"$0";return[function(e,n){var r=h(this),i=null==e?void 0:m(e,b);return i?o(i,e,r,n):o(t,f(r),e,n)},function(e,o){var s=l(this),a=f(e);if("string"==typeof o&&-1===S(o,i)&&-1===S(o,"$<")){var h=n(t,s,a,o);if(h.done)return h.value}var m=c(o);m||(o=f(o));var b=s.global;if(b){var C=s.unicode;s.lastIndex=0}for(var _=[];;){var T=g(s,a);if(null===T)break;if(k(_,T),!b)break;""===f(T[0])&&(s.lastIndex=p(a,d(s.lastIndex),C))}for(var O,L="",R=0,D=0;D<_.length;D++){for(var A=f((T=_[D])[0]),I=y(w(u(T.index),a.length),0),M=[],F=1;F<T.length;F++)k(M,void 0===(O=T[F])?O:String(O));var P=T.groups;if(m){var H=x([A],M,I,a);void 0!==P&&k(H,P);var N=f(r(o,void 0,H))}else N=v(A,a,I,M,P,o);I>=R&&(L+=E(a,R,I)+N,R=I+A.length)}return L+E(a,R)}]}),!!a((function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$<a>")}))||!C||_)},4129:(e,t,n)=>{"use strict";var r,o=n(7854),i=n(1702),s=n(2248),a=n(2423),l=n(7710),c=n(9320),u=n(111),d=n(2050),f=n(9909).enforce,h=n(8536),p=!o.ActiveXObject&&"ActiveXObject"in o,m=function(e){return function(){return e(this,arguments.length?arguments[0]:void 0)}},v=l("WeakMap",m,c);if(h&&p){r=c.getConstructor(m,"WeakMap",!0),a.enable();var g=v.prototype,b=i(g.delete),y=i(g.has),w=i(g.get),x=i(g.set);s(g,{delete:function(e){if(u(e)&&!d(e)){var t=f(this);return t.frozen||(t.frozen=new r),b(this,e)||t.frozen.delete(e)}return b(this,e)},has:function(e){if(u(e)&&!d(e)){var t=f(this);return t.frozen||(t.frozen=new r),y(this,e)||t.frozen.has(e)}return y(this,e)},get:function(e){if(u(e)&&!d(e)){var t=f(this);return t.frozen||(t.frozen=new r),y(this,e)?w(this,e):t.frozen.get(e)}return w(this,e)},set:function(e,t){if(u(e)&&!d(e)){var n=f(this);n.frozen||(n.frozen=new r),y(this,e)?x(this,e,t):n.frozen.set(e,t)}else x(this,e,t);return this}})}},4747:(e,t,n)=>{var r=n(7854),o=n(8324),i=n(8509),s=n(8533),a=n(8880),l=function(e){if(e&&e.forEach!==s)try{a(e,"forEach",s)}catch(t){e.forEach=s}};for(var c in o)o[c]&&l(r[c]&&r[c].prototype);l(i)},3948:(e,t,n)=>{var r=n(7854),o=n(8324),i=n(8509),s=n(6992),a=n(8880),l=n(5112),c=l("iterator"),u=l("toStringTag"),d=s.values,f=function(e,t){if(e){if(e[c]!==d)try{a(e,c,d)}catch(t){e[c]=d}if(e[u]||a(e,u,t),o[t])for(var n in s)if(e[n]!==s[n])try{a(e,n,s[n])}catch(t){e[n]=s[n]}}};for(var h in o)f(r[h]&&r[h].prototype,h);f(i,"DOMTokenList")},9843:(e,t,n)=>{e.exports={ResizeSensor:n(6087),ElementQueries:n(6456)}},6456:function(e,t,n){"use strict";var r,o,i;"undefined"!=typeof window&&window,o=[n(6087)],void 0===(i="function"==typeof(r=function(e){var t=function(){var t,n={},r=[];function o(e){e||(e=document.documentElement);var t=window.getComputedStyle(e,null).fontSize;return parseFloat(t)||16}function i(e,t){var n=t.split(/\d/),r=n[n.length-1];switch(t=parseFloat(t),r){case"px":default:return t;case"em":return t*o(e);case"rem":return t*o();case"vw":return t*document.documentElement.clientWidth/100;case"vh":return t*document.documentElement.clientHeight/100;case"vmin":case"vmax":var i=document.documentElement.clientWidth/100,s=document.documentElement.clientHeight/100;return t*(0,Math["vmin"===r?"min":"max"])(i,s)}}function s(e,t){var r,o,s,a,l,c,u,d;this.element=e;var f=["min-width","min-height","max-width","max-height"];this.call=function(){for(r in s=function(e){if(!e.getBoundingClientRect)return{width:e.offsetWidth,height:e.offsetHeight};var t=e.getBoundingClientRect();return{width:Math.round(t.width),height:Math.round(t.height)}}(this.element),c={},n[t])n[t].hasOwnProperty(r)&&(o=n[t][r],a=i(this.element,o.value),l="width"===o.property?s.width:s.height,d=o.mode+"-"+o.property,u="","min"===o.mode&&l>=a&&(u+=o.value),"max"===o.mode&&l<=a&&(u+=o.value),c[d]||(c[d]=""),u&&-1===(" "+c[d]+" ").indexOf(" "+u+" ")&&(c[d]+=" "+u));for(var e in f)f.hasOwnProperty(e)&&(c[f[e]]?this.element.setAttribute(f[e],c[f[e]].substr(1)):this.element.removeAttribute(f[e]))}}function a(t,n){t.elementQueriesSetupInformation||(t.elementQueriesSetupInformation=new s(t,n)),t.elementQueriesSensor||(t.elementQueriesSensor=new e(t,(function(){t.elementQueriesSetupInformation.call()})))}function l(e,o,i,s){if(void 0===n[e]){n[e]=[];var a=r.length;t.innerHTML+="\n"+e+" {animation: 0.1s element-queries;}",t.innerHTML+="\n"+e+" > .resize-sensor {min-width: "+a+"px;}",r.push(e)}n[e].push({mode:o,property:i,value:s})}function c(e){var t;if(document.querySelectorAll&&(t=e?e.querySelectorAll.bind(e):document.querySelectorAll.bind(document)),t||"undefined"==typeof $$||(t=$$),t||"undefined"==typeof jQuery||(t=jQuery),!t)throw"No document.querySelectorAll, jQuery or Mootools's $$ found.";return t}function u(t){var n=[],r=[],o=[],i=0,s=-1,a=[];for(var l in t.children)if(t.children.hasOwnProperty(l)&&t.children[l].tagName&&"img"===t.children[l].tagName.toLowerCase()){n.push(t.children[l]);var c=t.children[l].getAttribute("min-width")||t.children[l].getAttribute("data-min-width"),u=t.children[l].getAttribute("data-src")||t.children[l].getAttribute("url");o.push(u);var d={minWidth:c};r.push(d),c?t.children[l].style.display="none":(i=n.length-1,t.children[l].style.display="block")}function f(){var e,l=!1;for(e in n)n.hasOwnProperty(e)&&r[e].minWidth&&t.offsetWidth>r[e].minWidth&&(l=e);if(l||(l=i),s!==l)if(a[l])n[s].style.display="none",n[l].style.display="block",s=l;else{var c=new Image;c.onload=function(){n[l].src=o[l],n[s].style.display="none",n[l].style.display="block",a[l]=!0,s=l},c.src=o[l]}else n[l].src=o[l]}s=i,t.resizeSensorInstance=new e(t,f),f()}var d=/,?[\s\t]*([^,\n]*?)((?:\[[\s\t]*?(?:min|max)-(?:width|height)[\s\t]*?[~$\^]?=[\s\t]*?"[^"]*?"[\s\t]*?])+)([^,\n\s\{]*)/gim,f=/\[[\s\t]*?(min|max)-(width|height)[\s\t]*?[~$\^]?=[\s\t]*?"([^"]*?)"[\s\t]*?]/gim;function h(e){var t,n,r,o;for(e=e.replace(/'/g,'"');null!==(t=d.exec(e));)for(n=t[1]+t[3],r=t[2];null!==(o=f.exec(r));)l(n,o[1],o[2],o[3])}function p(e){var t="";if(e)if("string"==typeof e)-1===(e=e.toLowerCase()).indexOf("min-width")&&-1===e.indexOf("max-width")||h(e);else for(var n=0,r=e.length;n<r;n++)1===e[n].type?-1!==(t=e[n].selectorText||e[n].cssText).indexOf("min-height")||-1!==t.indexOf("max-height")?h(t):-1===t.indexOf("min-width")&&-1===t.indexOf("max-width")||h(t):4===e[n].type?p(e[n].cssRules||e[n].rules):3===e[n].type&&e[n].styleSheet.hasOwnProperty("cssRules")&&p(e[n].styleSheet.cssRules)}var m=!1;this.init=function(){var n="animationstart";void 0!==document.documentElement.style.webkitAnimationName?n="webkitAnimationStart":void 0!==document.documentElement.style.MozAnimationName?n="mozanimationstart":void 0!==document.documentElement.style.OAnimationName&&(n="oanimationstart"),document.body.addEventListener(n,(function(t){var n=t.target,o=n&&window.getComputedStyle(n,null),i=o&&o.getPropertyValue("animation-name");if(i&&-1!==i.indexOf("element-queries")){n.elementQueriesSensor=new e(n,(function(){n.elementQueriesSetupInformation&&n.elementQueriesSetupInformation.call()}));var s=window.getComputedStyle(n.resizeSensor,null).getPropertyValue("min-width");s=parseInt(s.replace("px","")),a(t.target,r[s])}})),m||((t=document.createElement("style")).type="text/css",t.innerHTML="[responsive-image] > img, [data-responsive-image] {overflow: hidden; padding: 0; } [responsive-image] > img, [data-responsive-image] > img {width: 100%;}",t.innerHTML+="\n@keyframes element-queries { 0% { visibility: inherit; } }",document.getElementsByTagName("head")[0].appendChild(t),m=!0);for(var o=0,i=document.styleSheets.length;o<i;o++)try{document.styleSheets[o].href&&0===document.styleSheets[o].href.indexOf("file://")&&console.warn("CssElementQueries: unable to parse local css files, "+document.styleSheets[o].href),p(document.styleSheets[o].cssRules||document.styleSheets[o].rules||document.styleSheets[o].cssText)}catch(e){}!function(){for(var e=c()("[data-responsive-image],[responsive-image]"),t=0,n=e.length;t<n;t++)u(e[t])}()},this.findElementQueriesElements=function(e){!function(e){var t=c(e);for(var r in n)if(n.hasOwnProperty(r))for(var o=t(r,e),i=0,s=o.length;i<s;i++)a(o[i],r)}(e)},this.update=function(){this.init()}};t.update=function(){t.instance.update()},t.detach=function(e){e.elementQueriesSetupInformation?(e.elementQueriesSensor.detach(),delete e.elementQueriesSetupInformation,delete e.elementQueriesSensor):e.resizeSensorInstance&&(e.resizeSensorInstance.detach(),delete e.resizeSensorInstance)},t.init=function(){t.instance||(t.instance=new t),t.instance.init()};return t.findElementQueriesElements=function(e){t.instance.findElementQueriesElements(e)},t.listen=function(){!function(e){if(document.addEventListener)document.addEventListener("DOMContentLoaded",e,!1);else if(/KHTML|WebKit|iCab/i.test(navigator.userAgent))var t=setInterval((function(){/loaded|complete/i.test(document.readyState)&&(e(),clearInterval(t))}),10);else window.onload=e}(t.init)},t})?r.apply(t,o):r)||(e.exports=i)},6087:function(e,t,n){"use strict";var r,o;"undefined"!=typeof window&&window,void 0===(o="function"==typeof(r=function(){if("undefined"==typeof window)return null;var e="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),t=e.requestAnimationFrame||e.mozRequestAnimationFrame||e.webkitRequestAnimationFrame||function(t){return e.setTimeout(t,20)},n=e.cancelAnimationFrame||e.mozCancelAnimationFrame||e.webkitCancelAnimationFrame||function(t){e.clearTimeout(t)};function r(e,t){var n=Object.prototype.toString.call(e),r="[object Array]"===n||"[object NodeList]"===n||"[object HTMLCollection]"===n||"[object Object]"===n||"undefined"!=typeof jQuery&&e instanceof jQuery||"undefined"!=typeof Elements&&e instanceof Elements,o=0,i=e.length;if(r)for(;o<i;o++)t(e[o]);else t(e)}function o(e){if(!e.getBoundingClientRect)return{width:e.offsetWidth,height:e.offsetHeight};var t=e.getBoundingClientRect();return{width:Math.round(t.width),height:Math.round(t.height)}}function i(e,t){Object.keys(t).forEach((function(n){e.style[n]=t[n]}))}var s=function(e,a){var l=0;function c(){var e,t,n=[];this.add=function(e){n.push(e)},this.call=function(r){for(e=0,t=n.length;e<t;e++)n[e].call(this,r)},this.remove=function(r){var o=[];for(e=0,t=n.length;e<t;e++)n[e]!==r&&o.push(n[e]);n=o},this.length=function(){return n.length}}function u(e,n){if(e)if(e.resizedAttached)e.resizedAttached.add(n);else{e.resizedAttached=new c,e.resizedAttached.add(n),e.resizeSensor=document.createElement("div"),e.resizeSensor.dir="ltr",e.resizeSensor.className="resize-sensor";var r={pointerEvents:"none",position:"absolute",left:"0px",top:"0px",right:"0px",bottom:"0px",overflow:"hidden",zIndex:"-1",visibility:"hidden",maxWidth:"100%"},s={position:"absolute",left:"0px",top:"0px",transition:"0s"};i(e.resizeSensor,r);var a=document.createElement("div");a.className="resize-sensor-expand",i(a,r);var u=document.createElement("div");i(u,s),a.appendChild(u);var d=document.createElement("div");d.className="resize-sensor-shrink",i(d,r);var f=document.createElement("div");i(f,s),i(f,{width:"200%",height:"200%"}),d.appendChild(f),e.resizeSensor.appendChild(a),e.resizeSensor.appendChild(d),e.appendChild(e.resizeSensor);var h=window.getComputedStyle(e),p=h?h.getPropertyValue("position"):null;"absolute"!==p&&"relative"!==p&&"fixed"!==p&&"sticky"!==p&&(e.style.position="relative");var m=!1,v=0,g=o(e),b=0,y=0,w=!0;l=0;var x=function(){if(w){if(0===e.offsetWidth&&0===e.offsetHeight)return void(l||(l=t((function(){l=0,x()}))));w=!1}var n,r;n=e.offsetWidth,r=e.offsetHeight,u.style.width=n+10+"px",u.style.height=r+10+"px",a.scrollLeft=n+10,a.scrollTop=r+10,d.scrollLeft=n+10,d.scrollTop=r+10};e.resizeSensor.resetSensor=x;var k=function(){v=0,m&&(b=g.width,y=g.height,e.resizedAttached&&e.resizedAttached.call(g))},S=function(){g=o(e),(m=g.width!==b||g.height!==y)&&!v&&(v=t(k)),x()},E=function(e,t,n){e.attachEvent?e.attachEvent("on"+t,n):e.addEventListener(t,n)};E(a,"scroll",S),E(d,"scroll",S),l=t((function(){l=0,x()}))}}r(e,(function(e){u(e,a)})),this.detach=function(t){l||(n(l),l=0),s.detach(e,t)},this.reset=function(){e.resizeSensor.resetSensor()}};if(s.reset=function(e){r(e,(function(e){e.resizeSensor.resetSensor()}))},s.detach=function(e,t){r(e,(function(e){e&&(e.resizedAttached&&"function"==typeof t&&(e.resizedAttached.remove(t),e.resizedAttached.length())||e.resizeSensor&&(e.contains(e.resizeSensor)&&e.removeChild(e.resizeSensor),delete e.resizeSensor,delete e.resizedAttached))}))},"undefined"!=typeof MutationObserver){var a=new MutationObserver((function(e){for(var t in e)if(e.hasOwnProperty(t))for(var n=e[t].addedNodes,r=0;r<n.length;r++)n[r].resizeSensor&&s.reset(n[r])}));document.addEventListener("DOMContentLoaded",(function(e){a.observe(document.body,{childList:!0,subtree:!0})}))}return s})?r.call(t,n,t,e):r)||(e.exports=o)},1296:(e,t,n)=>{var r=/^\s+|\s+$/g,o=/^[-+]0x[0-9a-f]+$/i,i=/^0b[01]+$/i,s=/^0o[0-7]+$/i,a=parseInt,l="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g,c="object"==typeof self&&self&&self.Object===Object&&self,u=l||c||Function("return this")(),d=Object.prototype.toString,f=Math.max,h=Math.min,p=function(){return u.Date.now()};function m(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function v(e){if("number"==typeof e)return e;if(function(e){return"symbol"==typeof e||function(e){return!!e&&"object"==typeof e}(e)&&"[object Symbol]"==d.call(e)}(e))return NaN;if(m(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=m(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(r,"");var n=i.test(e);return n||s.test(e)?a(e.slice(2),n?2:8):o.test(e)?NaN:+e}e.exports=function(e,t,n){var r,o,i,s,a,l,c=0,u=!1,d=!1,g=!0;if("function"!=typeof e)throw new TypeError("Expected a function");function b(t){var n=r,i=o;return r=o=void 0,c=t,s=e.apply(i,n)}function y(e){return c=e,a=setTimeout(x,t),u?b(e):s}function w(e){var n=e-l;return void 0===l||n>=t||n<0||d&&e-c>=i}function x(){var e=p();if(w(e))return k(e);a=setTimeout(x,function(e){var n=t-(e-l);return d?h(n,i-(e-c)):n}(e))}function k(e){return a=void 0,g&&r?b(e):(r=o=void 0,s)}function S(){var e=p(),n=w(e);if(r=arguments,o=this,l=e,n){if(void 0===a)return y(l);if(d)return a=setTimeout(x,t),b(l)}return void 0===a&&(a=setTimeout(x,t)),s}return t=v(t)||0,m(n)&&(u=!!n.leading,i=(d="maxWait"in n)?f(v(n.maxWait)||0,t):i,g="trailing"in n?!!n.trailing:g),S.cancel=function(){void 0!==a&&clearTimeout(a),c=0,r=l=o=a=void 0},S.flush=function(){return void 0===a?s:k(p())},S}},773:(e,t,n)=>{var r,o="__lodash_hash_undefined__",i=/^\[object .+?Constructor\]$/,s="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g,a="object"==typeof self&&self&&self.Object===Object&&self,l=s||a||Function("return this")(),c=Array.prototype,u=Function.prototype,d=Object.prototype,f=l["__core-js_shared__"],h=(r=/[^.]+$/.exec(f&&f.keys&&f.keys.IE_PROTO||""))?"Symbol(src)_1."+r:"",p=u.toString,m=d.hasOwnProperty,v=d.toString,g=RegExp("^"+p.call(m).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),b=c.splice,y=_(l,"Map"),w=_(Object,"create");function x(e){var t=-1,n=e?e.length:0;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}function k(e){var t=-1,n=e?e.length:0;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}function S(e){var t=-1,n=e?e.length:0;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}function E(e,t){for(var n,r,o=e.length;o--;)if((n=e[o][0])===(r=t)||n!=n&&r!=r)return o;return-1}function C(e,t){var n,r,o=e.__data__;return("string"==(r=typeof(n=t))||"number"==r||"symbol"==r||"boolean"==r?"__proto__"!==n:null===n)?o["string"==typeof t?"string":"hash"]:o.map}function _(e,t){var n=function(e,t){return null==e?void 0:e[t]}(e,t);return function(e){if(!O(e)||h&&h in e)return!1;var t=function(e){var t=O(e)?v.call(e):"";return"[object Function]"==t||"[object GeneratorFunction]"==t}(e)||function(e){var t=!1;if(null!=e&&"function"!=typeof e.toString)try{t=!!(e+"")}catch(e){}return t}(e)?g:i;return t.test(function(e){if(null!=e){try{return p.call(e)}catch(e){}try{return e+""}catch(e){}}return""}(e))}(n)?n:void 0}function T(e,t){if("function"!=typeof e||t&&"function"!=typeof t)throw new TypeError("Expected a function");var n=function(){var r=arguments,o=t?t.apply(this,r):r[0],i=n.cache;if(i.has(o))return i.get(o);var s=e.apply(this,r);return n.cache=i.set(o,s),s};return n.cache=new(T.Cache||S),n}function O(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}x.prototype.clear=function(){this.__data__=w?w(null):{}},x.prototype.delete=function(e){return this.has(e)&&delete this.__data__[e]},x.prototype.get=function(e){var t=this.__data__;if(w){var n=t[e];return n===o?void 0:n}return m.call(t,e)?t[e]:void 0},x.prototype.has=function(e){var t=this.__data__;return w?void 0!==t[e]:m.call(t,e)},x.prototype.set=function(e,t){return this.__data__[e]=w&&void 0===t?o:t,this},k.prototype.clear=function(){this.__data__=[]},k.prototype.delete=function(e){var t=this.__data__,n=E(t,e);return!(n<0||(n==t.length-1?t.pop():b.call(t,n,1),0))},k.prototype.get=function(e){var t=this.__data__,n=E(t,e);return n<0?void 0:t[n][1]},k.prototype.has=function(e){return E(this.__data__,e)>-1},k.prototype.set=function(e,t){var n=this.__data__,r=E(n,e);return r<0?n.push([e,t]):n[r][1]=t,this},S.prototype.clear=function(){this.__data__={hash:new x,map:new(y||k),string:new x}},S.prototype.delete=function(e){return C(this,e).delete(e)},S.prototype.get=function(e){return C(this,e).get(e)},S.prototype.has=function(e){return C(this,e).has(e)},S.prototype.set=function(e,t){return C(this,e).set(e,t),this},T.Cache=S,e.exports=T},3096:(e,t,n)=>{var r="Expected a function",o=/^\s+|\s+$/g,i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,a=/^0o[0-7]+$/i,l=parseInt,c="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g,u="object"==typeof self&&self&&self.Object===Object&&self,d=c||u||Function("return this")(),f=Object.prototype.toString,h=Math.max,p=Math.min,m=function(){return d.Date.now()};function v(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function g(e){if("number"==typeof e)return e;if(function(e){return"symbol"==typeof e||function(e){return!!e&&"object"==typeof e}(e)&&"[object Symbol]"==f.call(e)}(e))return NaN;if(v(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=v(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(o,"");var n=s.test(e);return n||a.test(e)?l(e.slice(2),n?2:8):i.test(e)?NaN:+e}e.exports=function(e,t,n){var o=!0,i=!0;if("function"!=typeof e)throw new TypeError(r);return v(n)&&(o="leading"in n?!!n.leading:o,i="trailing"in n?!!n.trailing:i),function(e,t,n){var o,i,s,a,l,c,u=0,d=!1,f=!1,b=!0;if("function"!=typeof e)throw new TypeError(r);function y(t){var n=o,r=i;return o=i=void 0,u=t,a=e.apply(r,n)}function w(e){return u=e,l=setTimeout(k,t),d?y(e):a}function x(e){var n=e-c;return void 0===c||n>=t||n<0||f&&e-u>=s}function k(){var e=m();if(x(e))return S(e);l=setTimeout(k,function(e){var n=t-(e-c);return f?p(n,s-(e-u)):n}(e))}function S(e){return l=void 0,b&&o?y(e):(o=i=void 0,a)}function E(){var e=m(),n=x(e);if(o=arguments,i=this,c=e,n){if(void 0===l)return w(c);if(f)return l=setTimeout(k,t),y(c)}return void 0===l&&(l=setTimeout(k,t)),a}return t=g(t)||0,v(n)&&(d=!!n.leading,s=(f="maxWait"in n)?h(g(n.maxWait)||0,t):s,b="trailing"in n?!!n.trailing:b),E.cancel=function(){void 0!==l&&clearTimeout(l),u=0,o=c=i=l=void 0},E.flush=function(){return void 0===l?a:S(m())},E}(e,t,{leading:o,maxWait:t,trailing:i})}},7924:(e,t,n)=>{"use strict";n.d(t,{Z:()=>ne}),n(9554),n(4747);var r,o=n(1807),i=n.n(o),s=(n(7327),n(6992),n(9601),n(1539),n(1058),n(8783),n(4129),n(3948),n(3096)),a=n.n(s),l=n(1296),c=n.n(l),u=n(773),d=n.n(u),f=[],h="ResizeObserver loop completed with undelivered notifications.";!function(e){e.BORDER_BOX="border-box",e.CONTENT_BOX="content-box",e.DEVICE_PIXEL_CONTENT_BOX="device-pixel-content-box"}(r||(r={}));var p,m=function(e){return Object.freeze(e)},v=function(e,t){this.inlineSize=e,this.blockSize=t,m(this)},g=function(){function e(e,t,n,r){return this.x=e,this.y=t,this.width=n,this.height=r,this.top=this.y,this.left=this.x,this.bottom=this.top+this.height,this.right=this.left+this.width,m(this)}return e.prototype.toJSON=function(){var e=this;return{x:e.x,y:e.y,top:e.top,right:e.right,bottom:e.bottom,left:e.left,width:e.width,height:e.height}},e.fromRect=function(t){return new e(t.x,t.y,t.width,t.height)},e}(),b=function(e){return e instanceof SVGElement&&"getBBox"in e},y=function(e){if(b(e)){var t=e.getBBox(),n=t.width,r=t.height;return!n&&!r}var o=e,i=o.offsetWidth,s=o.offsetHeight;return!(i||s||e.getClientRects().length)},w=function(e){var t,n;if(e instanceof Element)return!0;var r=null===(n=null===(t=e)||void 0===t?void 0:t.ownerDocument)||void 0===n?void 0:n.defaultView;return!!(r&&e instanceof r.Element)},x="undefined"!=typeof window?window:{},k=new WeakMap,S=/auto|scroll/,E=/^tb|vertical/,C=/msie|trident/i.test(x.navigator&&x.navigator.userAgent),_=function(e){return parseFloat(e||"0")},T=function(e,t,n){return void 0===e&&(e=0),void 0===t&&(t=0),void 0===n&&(n=!1),new v((n?t:e)||0,(n?e:t)||0)},O=m({devicePixelContentBoxSize:T(),borderBoxSize:T(),contentBoxSize:T(),contentRect:new g(0,0,0,0)}),L=function(e,t){if(void 0===t&&(t=!1),k.has(e)&&!t)return k.get(e);if(y(e))return k.set(e,O),O;var n=getComputedStyle(e),r=b(e)&&e.ownerSVGElement&&e.getBBox(),o=!C&&"border-box"===n.boxSizing,i=E.test(n.writingMode||""),s=!r&&S.test(n.overflowY||""),a=!r&&S.test(n.overflowX||""),l=r?0:_(n.paddingTop),c=r?0:_(n.paddingRight),u=r?0:_(n.paddingBottom),d=r?0:_(n.paddingLeft),f=r?0:_(n.borderTopWidth),h=r?0:_(n.borderRightWidth),p=r?0:_(n.borderBottomWidth),v=d+c,w=l+u,x=(r?0:_(n.borderLeftWidth))+h,L=f+p,R=a?e.offsetHeight-L-e.clientHeight:0,D=s?e.offsetWidth-x-e.clientWidth:0,A=o?v+x:0,I=o?w+L:0,M=r?r.width:_(n.width)-A-D,F=r?r.height:_(n.height)-I-R,P=M+v+D+x,H=F+w+R+L,N=m({devicePixelContentBoxSize:T(Math.round(M*devicePixelRatio),Math.round(F*devicePixelRatio),i),borderBoxSize:T(P,H,i),contentBoxSize:T(M,F,i),contentRect:new g(d,l,M,F)});return k.set(e,N),N},R=function(e,t,n){var o=L(e,n),i=o.borderBoxSize,s=o.contentBoxSize,a=o.devicePixelContentBoxSize;switch(t){case r.DEVICE_PIXEL_CONTENT_BOX:return a;case r.BORDER_BOX:return i;default:return s}},D=function(e){var t=L(e);this.target=e,this.contentRect=t.contentRect,this.borderBoxSize=m([t.borderBoxSize]),this.contentBoxSize=m([t.contentBoxSize]),this.devicePixelContentBoxSize=m([t.devicePixelContentBoxSize])},A=function(e){if(y(e))return 1/0;for(var t=0,n=e.parentNode;n;)t+=1,n=n.parentNode;return t},I=function(){var e=1/0,t=[];f.forEach((function(n){if(0!==n.activeTargets.length){var r=[];n.activeTargets.forEach((function(t){var n=new D(t.target),o=A(t.target);r.push(n),t.lastReportedSize=R(t.target,t.observedBox),o<e&&(e=o)})),t.push((function(){n.callback.call(n.observer,r,n.observer)})),n.activeTargets.splice(0,n.activeTargets.length)}}));for(var n=0,r=t;n<r.length;n++)(0,r[n])();return e},M=function(e){f.forEach((function(t){t.activeTargets.splice(0,t.activeTargets.length),t.skippedTargets.splice(0,t.skippedTargets.length),t.observationTargets.forEach((function(n){n.isActive()&&(A(n.target)>e?t.activeTargets.push(n):t.skippedTargets.push(n))}))}))},F=[],P=0,H={attributes:!0,characterData:!0,childList:!0,subtree:!0},N=["resize","load","transitionend","animationend","animationstart","animationiteration","keyup","keydown","mouseup","mousedown","mouseover","mouseout","blur","focus"],j=function(e){return void 0===e&&(e=0),Date.now()+e},W=!1,B=new(function(){function e(){var e=this;this.stopped=!0,this.listener=function(){return e.schedule()}}return e.prototype.run=function(e){var t=this;if(void 0===e&&(e=250),!W){W=!0;var n,r=j(e);n=function(){var n=!1;try{n=function(){var e,t=0;for(M(t);f.some((function(e){return e.activeTargets.length>0}));)t=I(),M(t);return f.some((function(e){return e.skippedTargets.length>0}))&&("function"==typeof ErrorEvent?e=new ErrorEvent("error",{message:h}):((e=document.createEvent("Event")).initEvent("error",!1,!1),e.message=h),window.dispatchEvent(e)),t>0}()}finally{if(W=!1,e=r-j(),!P)return;n?t.run(1e3):e>0?t.run(e):t.start()}},function(e){if(!p){var t=0,n=document.createTextNode("");new MutationObserver((function(){return F.splice(0).forEach((function(e){return e()}))})).observe(n,{characterData:!0}),p=function(){n.textContent=""+(t?t--:t++)}}F.push(e),p()}((function(){requestAnimationFrame(n)}))}},e.prototype.schedule=function(){this.stop(),this.run()},e.prototype.observe=function(){var e=this,t=function(){return e.observer&&e.observer.observe(document.body,H)};document.body?t():x.addEventListener("DOMContentLoaded",t)},e.prototype.start=function(){var e=this;this.stopped&&(this.stopped=!1,this.observer=new MutationObserver(this.listener),this.observe(),N.forEach((function(t){return x.addEventListener(t,e.listener,!0)})))},e.prototype.stop=function(){var e=this;this.stopped||(this.observer&&this.observer.disconnect(),N.forEach((function(t){return x.removeEventListener(t,e.listener,!0)})),this.stopped=!0)},e}()),z=function(e){!P&&e>0&&B.start(),!(P+=e)&&B.stop()},V=function(){function e(e,t){this.target=e,this.observedBox=t||r.CONTENT_BOX,this.lastReportedSize={inlineSize:0,blockSize:0}}return e.prototype.isActive=function(){var e,t=R(this.target,this.observedBox,!0);return e=this.target,b(e)||function(e){switch(e.tagName){case"INPUT":if("image"!==e.type)break;case"VIDEO":case"AUDIO":case"EMBED":case"OBJECT":case"CANVAS":case"IFRAME":case"IMG":return!0}return!1}(e)||"inline"!==getComputedStyle(e).display||(this.lastReportedSize=t),this.lastReportedSize.inlineSize!==t.inlineSize||this.lastReportedSize.blockSize!==t.blockSize},e}(),q=function(e,t){this.activeTargets=[],this.skippedTargets=[],this.observationTargets=[],this.observer=e,this.callback=t},$=new WeakMap,U=function(e,t){for(var n=0;n<e.length;n+=1)if(e[n].target===t)return n;return-1},Z=function(){function e(){}return e.connect=function(e,t){var n=new q(e,t);$.set(e,n)},e.observe=function(e,t,n){var r=$.get(e),o=0===r.observationTargets.length;U(r.observationTargets,t)<0&&(o&&f.push(r),r.observationTargets.push(new V(t,n&&n.box)),z(1),B.schedule())},e.unobserve=function(e,t){var n=$.get(e),r=U(n.observationTargets,t),o=1===n.observationTargets.length;r>=0&&(o&&f.splice(f.indexOf(n),1),n.observationTargets.splice(r,1),z(-1))},e.disconnect=function(e){var t=this,n=$.get(e);n.observationTargets.slice().forEach((function(n){return t.unobserve(e,n.target)})),n.activeTargets.splice(0,n.activeTargets.length)},e}(),Y=function(){function e(e){if(0===arguments.length)throw new TypeError("Failed to construct 'ResizeObserver': 1 argument required, but only 0 present.");if("function"!=typeof e)throw new TypeError("Failed to construct 'ResizeObserver': The callback provided as parameter 1 is not a function.");Z.connect(this,e)}return e.prototype.observe=function(e,t){if(0===arguments.length)throw new TypeError("Failed to execute 'observe' on 'ResizeObserver': 1 argument required, but only 0 present.");if(!w(e))throw new TypeError("Failed to execute 'observe' on 'ResizeObserver': parameter 1 is not of type 'Element");Z.observe(this,e,t)},e.prototype.unobserve=function(e){if(0===arguments.length)throw new TypeError("Failed to execute 'unobserve' on 'ResizeObserver': 1 argument required, but only 0 present.");if(!w(e))throw new TypeError("Failed to execute 'unobserve' on 'ResizeObserver': parameter 1 is not of type 'Element");Z.unobserve(this,e)},e.prototype.disconnect=function(){Z.disconnect(this)},e.toString=function(){return"function ResizeObserver () { [polyfill code] }"},e}(),G=(n(5827),n(8309),n(4916),n(4723),n(5306),function(e){return Array.prototype.reduce.call(e,(function(e,t){var n=t.name.match(/data-simplebar-(.+)/);if(n){var r=n[1].replace(/\W+(.)/g,(function(e,t){return t.toUpperCase()}));switch(t.value){case"true":e[r]=!0;break;case"false":e[r]=!1;break;case void 0:e[r]=!0;break;default:e[r]=t.value}}return e}),{})});function J(e){return e&&e.ownerDocument&&e.ownerDocument.defaultView?e.ownerDocument.defaultView:window}function K(e){return e&&e.ownerDocument?e.ownerDocument:document}var X=null,Q=null;function ee(e){if(null===X){var t=K(e);if(void 0===t)return X=0;var n=t.body,r=t.createElement("div");r.classList.add("simplebar-hide-scrollbar"),n.appendChild(r);var o=r.getBoundingClientRect().right;n.removeChild(r),X=o}return X}i()&&window.addEventListener("resize",(function(){Q!==window.devicePixelRatio&&(Q=window.devicePixelRatio,X=null)}));var te=function(){function e(t,n){var r=this;this.onScroll=function(){var e=J(r.el);r.scrollXTicking||(e.requestAnimationFrame(r.scrollX),r.scrollXTicking=!0),r.scrollYTicking||(e.requestAnimationFrame(r.scrollY),r.scrollYTicking=!0)},this.scrollX=function(){r.axis.x.isOverflowing&&(r.showScrollbar("x"),r.positionScrollbar("x")),r.scrollXTicking=!1},this.scrollY=function(){r.axis.y.isOverflowing&&(r.showScrollbar("y"),r.positionScrollbar("y")),r.scrollYTicking=!1},this.onMouseEnter=function(){r.showScrollbar("x"),r.showScrollbar("y")},this.onMouseMove=function(e){r.mouseX=e.clientX,r.mouseY=e.clientY,(r.axis.x.isOverflowing||r.axis.x.forceVisible)&&r.onMouseMoveForAxis("x"),(r.axis.y.isOverflowing||r.axis.y.forceVisible)&&r.onMouseMoveForAxis("y")},this.onMouseLeave=function(){r.onMouseMove.cancel(),(r.axis.x.isOverflowing||r.axis.x.forceVisible)&&r.onMouseLeaveForAxis("x"),(r.axis.y.isOverflowing||r.axis.y.forceVisible)&&r.onMouseLeaveForAxis("y"),r.mouseX=-1,r.mouseY=-1},this.onWindowResize=function(){r.scrollbarWidth=r.getScrollbarWidth(),r.hideNativeScrollbar()},this.hideScrollbars=function(){r.axis.x.track.rect=r.axis.x.track.el.getBoundingClientRect(),r.axis.y.track.rect=r.axis.y.track.el.getBoundingClientRect(),r.isWithinBounds(r.axis.y.track.rect)||(r.axis.y.scrollbar.el.classList.remove(r.classNames.visible),r.axis.y.isVisible=!1),r.isWithinBounds(r.axis.x.track.rect)||(r.axis.x.scrollbar.el.classList.remove(r.classNames.visible),r.axis.x.isVisible=!1)},this.onPointerEvent=function(e){var t,n;r.axis.x.track.rect=r.axis.x.track.el.getBoundingClientRect(),r.axis.y.track.rect=r.axis.y.track.el.getBoundingClientRect(),(r.axis.x.isOverflowing||r.axis.x.forceVisible)&&(t=r.isWithinBounds(r.axis.x.track.rect)),(r.axis.y.isOverflowing||r.axis.y.forceVisible)&&(n=r.isWithinBounds(r.axis.y.track.rect)),(t||n)&&(e.preventDefault(),e.stopPropagation(),"mousedown"===e.type&&(t&&(r.axis.x.scrollbar.rect=r.axis.x.scrollbar.el.getBoundingClientRect(),r.isWithinBounds(r.axis.x.scrollbar.rect)?r.onDragStart(e,"x"):r.onTrackClick(e,"x")),n&&(r.axis.y.scrollbar.rect=r.axis.y.scrollbar.el.getBoundingClientRect(),r.isWithinBounds(r.axis.y.scrollbar.rect)?r.onDragStart(e,"y"):r.onTrackClick(e,"y"))))},this.drag=function(t){var n=r.axis[r.draggedAxis].track,o=n.rect[r.axis[r.draggedAxis].sizeAttr],i=r.axis[r.draggedAxis].scrollbar,s=r.contentWrapperEl[r.axis[r.draggedAxis].scrollSizeAttr],a=parseInt(r.elStyles[r.axis[r.draggedAxis].sizeAttr],10);t.preventDefault(),t.stopPropagation();var l=(("y"===r.draggedAxis?t.pageY:t.pageX)-n.rect[r.axis[r.draggedAxis].offsetAttr]-r.axis[r.draggedAxis].dragOffset)/(o-i.size)*(s-a);"x"===r.draggedAxis&&(l=r.isRtl&&e.getRtlHelpers().isRtlScrollbarInverted?l-(o+i.size):l,l=r.isRtl&&e.getRtlHelpers().isRtlScrollingInverted?-l:l),r.contentWrapperEl[r.axis[r.draggedAxis].scrollOffsetAttr]=l},this.onEndDrag=function(e){var t=K(r.el),n=J(r.el);e.preventDefault(),e.stopPropagation(),r.el.classList.remove(r.classNames.dragging),t.removeEventListener("mousemove",r.drag,!0),t.removeEventListener("mouseup",r.onEndDrag,!0),r.removePreventClickId=n.setTimeout((function(){t.removeEventListener("click",r.preventClick,!0),t.removeEventListener("dblclick",r.preventClick,!0),r.removePreventClickId=null}))},this.preventClick=function(e){e.preventDefault(),e.stopPropagation()},this.el=t,this.minScrollbarWidth=20,this.options=Object.assign({},e.defaultOptions,{},n),this.classNames=Object.assign({},e.defaultOptions.classNames,{},this.options.classNames),this.axis={x:{scrollOffsetAttr:"scrollLeft",sizeAttr:"width",scrollSizeAttr:"scrollWidth",offsetSizeAttr:"offsetWidth",offsetAttr:"left",overflowAttr:"overflowX",dragOffset:0,isOverflowing:!0,isVisible:!1,forceVisible:!1,track:{},scrollbar:{}},y:{scrollOffsetAttr:"scrollTop",sizeAttr:"height",scrollSizeAttr:"scrollHeight",offsetSizeAttr:"offsetHeight",offsetAttr:"top",overflowAttr:"overflowY",dragOffset:0,isOverflowing:!0,isVisible:!1,forceVisible:!1,track:{},scrollbar:{}}},this.removePreventClickId=null,e.instances.has(this.el)||(this.recalculate=a()(this.recalculate.bind(this),64),this.onMouseMove=a()(this.onMouseMove.bind(this),64),this.hideScrollbars=c()(this.hideScrollbars.bind(this),this.options.timeout),this.onWindowResize=c()(this.onWindowResize.bind(this),64,{leading:!0}),e.getRtlHelpers=d()(e.getRtlHelpers),this.init())}e.getRtlHelpers=function(){var t=document.createElement("div");t.innerHTML='<div class="hs-dummy-scrollbar-size"><div style="height: 200%; width: 200%; margin: 10px 0;"></div></div>';var n=t.firstElementChild;document.body.appendChild(n);var r=n.firstElementChild;n.scrollLeft=0;var o=e.getOffset(n),i=e.getOffset(r);n.scrollLeft=999;var s=e.getOffset(r);return{isRtlScrollingInverted:o.left!==i.left&&i.left-s.left!=0,isRtlScrollbarInverted:o.left!==i.left}},e.getOffset=function(e){var t=e.getBoundingClientRect(),n=K(e),r=J(e);return{top:t.top+(r.pageYOffset||n.documentElement.scrollTop),left:t.left+(r.pageXOffset||n.documentElement.scrollLeft)}};var t=e.prototype;return t.init=function(){e.instances.set(this.el,this),i()&&(this.initDOM(),this.setAccessibilityAttributes(),this.scrollbarWidth=this.getScrollbarWidth(),this.recalculate(),this.initListeners())},t.initDOM=function(){var e=this;if(Array.prototype.filter.call(this.el.children,(function(t){return t.classList.contains(e.classNames.wrapper)})).length)this.wrapperEl=this.el.querySelector("."+this.classNames.wrapper),this.contentWrapperEl=this.options.scrollableNode||this.el.querySelector("."+this.classNames.contentWrapper),this.contentEl=this.options.contentNode||this.el.querySelector("."+this.classNames.contentEl),this.offsetEl=this.el.querySelector("."+this.classNames.offset),this.maskEl=this.el.querySelector("."+this.classNames.mask),this.placeholderEl=this.findChild(this.wrapperEl,"."+this.classNames.placeholder),this.heightAutoObserverWrapperEl=this.el.querySelector("."+this.classNames.heightAutoObserverWrapperEl),this.heightAutoObserverEl=this.el.querySelector("."+this.classNames.heightAutoObserverEl),this.axis.x.track.el=this.findChild(this.el,"."+this.classNames.track+"."+this.classNames.horizontal),this.axis.y.track.el=this.findChild(this.el,"."+this.classNames.track+"."+this.classNames.vertical);else{for(this.wrapperEl=document.createElement("div"),this.contentWrapperEl=document.createElement("div"),this.offsetEl=document.createElement("div"),this.maskEl=document.createElement("div"),this.contentEl=document.createElement("div"),this.placeholderEl=document.createElement("div"),this.heightAutoObserverWrapperEl=document.createElement("div"),this.heightAutoObserverEl=document.createElement("div"),this.wrapperEl.classList.add(this.classNames.wrapper),this.contentWrapperEl.classList.add(this.classNames.contentWrapper),this.offsetEl.classList.add(this.classNames.offset),this.maskEl.classList.add(this.classNames.mask),this.contentEl.classList.add(this.classNames.contentEl),this.placeholderEl.classList.add(this.classNames.placeholder),this.heightAutoObserverWrapperEl.classList.add(this.classNames.heightAutoObserverWrapperEl),this.heightAutoObserverEl.classList.add(this.classNames.heightAutoObserverEl);this.el.firstChild;)this.contentEl.appendChild(this.el.firstChild);this.contentWrapperEl.appendChild(this.contentEl),this.offsetEl.appendChild(this.contentWrapperEl),this.maskEl.appendChild(this.offsetEl),this.heightAutoObserverWrapperEl.appendChild(this.heightAutoObserverEl),this.wrapperEl.appendChild(this.heightAutoObserverWrapperEl),this.wrapperEl.appendChild(this.maskEl),this.wrapperEl.appendChild(this.placeholderEl),this.el.appendChild(this.wrapperEl)}if(!this.axis.x.track.el||!this.axis.y.track.el){var t=document.createElement("div"),n=document.createElement("div");t.classList.add(this.classNames.track),n.classList.add(this.classNames.scrollbar),t.appendChild(n),this.axis.x.track.el=t.cloneNode(!0),this.axis.x.track.el.classList.add(this.classNames.horizontal),this.axis.y.track.el=t.cloneNode(!0),this.axis.y.track.el.classList.add(this.classNames.vertical),this.el.appendChild(this.axis.x.track.el),this.el.appendChild(this.axis.y.track.el)}this.axis.x.scrollbar.el=this.axis.x.track.el.querySelector("."+this.classNames.scrollbar),this.axis.y.scrollbar.el=this.axis.y.track.el.querySelector("."+this.classNames.scrollbar),this.options.autoHide||(this.axis.x.scrollbar.el.classList.add(this.classNames.visible),this.axis.y.scrollbar.el.classList.add(this.classNames.visible)),this.el.setAttribute("data-simplebar","init")},t.setAccessibilityAttributes=function(){var e=this.options.ariaLabel||"scrollable content";this.contentWrapperEl.setAttribute("tabindex","0"),this.contentWrapperEl.setAttribute("role","region"),this.contentWrapperEl.setAttribute("aria-label",e)},t.initListeners=function(){var e=this,t=J(this.el);this.options.autoHide&&this.el.addEventListener("mouseenter",this.onMouseEnter),["mousedown","click","dblclick"].forEach((function(t){e.el.addEventListener(t,e.onPointerEvent,!0)})),["touchstart","touchend","touchmove"].forEach((function(t){e.el.addEventListener(t,e.onPointerEvent,{capture:!0,passive:!0})})),this.el.addEventListener("mousemove",this.onMouseMove),this.el.addEventListener("mouseleave",this.onMouseLeave),this.contentWrapperEl.addEventListener("scroll",this.onScroll),t.addEventListener("resize",this.onWindowResize);var n=!1,r=t.ResizeObserver||Y;this.resizeObserver=new r((function(){n&&e.recalculate()})),this.resizeObserver.observe(this.el),this.resizeObserver.observe(this.contentEl),t.requestAnimationFrame((function(){n=!0})),this.mutationObserver=new t.MutationObserver(this.recalculate),this.mutationObserver.observe(this.contentEl,{childList:!0,subtree:!0,characterData:!0})},t.recalculate=function(){var e=J(this.el);this.elStyles=e.getComputedStyle(this.el),this.isRtl="rtl"===this.elStyles.direction;var t=this.heightAutoObserverEl.offsetHeight<=1,n=this.heightAutoObserverEl.offsetWidth<=1,r=this.contentEl.offsetWidth,o=this.contentWrapperEl.offsetWidth,i=this.elStyles.overflowX,s=this.elStyles.overflowY;this.contentEl.style.padding=this.elStyles.paddingTop+" "+this.elStyles.paddingRight+" "+this.elStyles.paddingBottom+" "+this.elStyles.paddingLeft,this.wrapperEl.style.margin="-"+this.elStyles.paddingTop+" -"+this.elStyles.paddingRight+" -"+this.elStyles.paddingBottom+" -"+this.elStyles.paddingLeft;var a=this.contentEl.scrollHeight,l=this.contentEl.scrollWidth;this.contentWrapperEl.style.height=t?"auto":"100%",this.placeholderEl.style.width=n?r+"px":"auto",this.placeholderEl.style.height=a+"px";var c=this.contentWrapperEl.offsetHeight;this.axis.x.isOverflowing=l>r,this.axis.y.isOverflowing=a>c,this.axis.x.isOverflowing="hidden"!==i&&this.axis.x.isOverflowing,this.axis.y.isOverflowing="hidden"!==s&&this.axis.y.isOverflowing,this.axis.x.forceVisible="x"===this.options.forceVisible||!0===this.options.forceVisible,this.axis.y.forceVisible="y"===this.options.forceVisible||!0===this.options.forceVisible,this.hideNativeScrollbar();var u=this.axis.x.isOverflowing?this.scrollbarWidth:0,d=this.axis.y.isOverflowing?this.scrollbarWidth:0;this.axis.x.isOverflowing=this.axis.x.isOverflowing&&l>o-d,this.axis.y.isOverflowing=this.axis.y.isOverflowing&&a>c-u,this.axis.x.scrollbar.size=this.getScrollbarSize("x"),this.axis.y.scrollbar.size=this.getScrollbarSize("y"),this.axis.x.scrollbar.el.style.width=this.axis.x.scrollbar.size+"px",this.axis.y.scrollbar.el.style.height=this.axis.y.scrollbar.size+"px",this.positionScrollbar("x"),this.positionScrollbar("y"),this.toggleTrackVisibility("x"),this.toggleTrackVisibility("y")},t.getScrollbarSize=function(e){if(void 0===e&&(e="y"),!this.axis[e].isOverflowing)return 0;var t,n=this.contentEl[this.axis[e].scrollSizeAttr],r=this.axis[e].track.el[this.axis[e].offsetSizeAttr],o=r/n;return t=Math.max(~~(o*r),this.options.scrollbarMinSize),this.options.scrollbarMaxSize&&(t=Math.min(t,this.options.scrollbarMaxSize)),t},t.positionScrollbar=function(t){if(void 0===t&&(t="y"),this.axis[t].isOverflowing){var n=this.contentWrapperEl[this.axis[t].scrollSizeAttr],r=this.axis[t].track.el[this.axis[t].offsetSizeAttr],o=parseInt(this.elStyles[this.axis[t].sizeAttr],10),i=this.axis[t].scrollbar,s=this.contentWrapperEl[this.axis[t].scrollOffsetAttr],a=(s="x"===t&&this.isRtl&&e.getRtlHelpers().isRtlScrollingInverted?-s:s)/(n-o),l=~~((r-i.size)*a);l="x"===t&&this.isRtl&&e.getRtlHelpers().isRtlScrollbarInverted?l+(r-i.size):l,i.el.style.transform="x"===t?"translate3d("+l+"px, 0, 0)":"translate3d(0, "+l+"px, 0)"}},t.toggleTrackVisibility=function(e){void 0===e&&(e="y");var t=this.axis[e].track.el,n=this.axis[e].scrollbar.el;this.axis[e].isOverflowing||this.axis[e].forceVisible?(t.style.visibility="visible",this.contentWrapperEl.style[this.axis[e].overflowAttr]="scroll"):(t.style.visibility="hidden",this.contentWrapperEl.style[this.axis[e].overflowAttr]="hidden"),this.axis[e].isOverflowing?n.style.display="block":n.style.display="none"},t.hideNativeScrollbar=function(){this.offsetEl.style[this.isRtl?"left":"right"]=this.axis.y.isOverflowing||this.axis.y.forceVisible?"-"+this.scrollbarWidth+"px":0,this.offsetEl.style.bottom=this.axis.x.isOverflowing||this.axis.x.forceVisible?"-"+this.scrollbarWidth+"px":0},t.onMouseMoveForAxis=function(e){void 0===e&&(e="y"),this.axis[e].track.rect=this.axis[e].track.el.getBoundingClientRect(),this.axis[e].scrollbar.rect=this.axis[e].scrollbar.el.getBoundingClientRect(),this.isWithinBounds(this.axis[e].scrollbar.rect)?this.axis[e].scrollbar.el.classList.add(this.classNames.hover):this.axis[e].scrollbar.el.classList.remove(this.classNames.hover),this.isWithinBounds(this.axis[e].track.rect)?(this.showScrollbar(e),this.axis[e].track.el.classList.add(this.classNames.hover)):this.axis[e].track.el.classList.remove(this.classNames.hover)},t.onMouseLeaveForAxis=function(e){void 0===e&&(e="y"),this.axis[e].track.el.classList.remove(this.classNames.hover),this.axis[e].scrollbar.el.classList.remove(this.classNames.hover)},t.showScrollbar=function(e){void 0===e&&(e="y");var t=this.axis[e].scrollbar.el;this.axis[e].isVisible||(t.classList.add(this.classNames.visible),this.axis[e].isVisible=!0),this.options.autoHide&&this.hideScrollbars()},t.onDragStart=function(e,t){void 0===t&&(t="y");var n=K(this.el),r=J(this.el),o=this.axis[t].scrollbar,i="y"===t?e.pageY:e.pageX;this.axis[t].dragOffset=i-o.rect[this.axis[t].offsetAttr],this.draggedAxis=t,this.el.classList.add(this.classNames.dragging),n.addEventListener("mousemove",this.drag,!0),n.addEventListener("mouseup",this.onEndDrag,!0),null===this.removePreventClickId?(n.addEventListener("click",this.preventClick,!0),n.addEventListener("dblclick",this.preventClick,!0)):(r.clearTimeout(this.removePreventClickId),this.removePreventClickId=null)},t.onTrackClick=function(e,t){var n=this;if(void 0===t&&(t="y"),this.options.clickOnTrack){var r=J(this.el);this.axis[t].scrollbar.rect=this.axis[t].scrollbar.el.getBoundingClientRect();var o=this.axis[t].scrollbar.rect[this.axis[t].offsetAttr],i=parseInt(this.elStyles[this.axis[t].sizeAttr],10),s=this.contentWrapperEl[this.axis[t].scrollOffsetAttr],a=("y"===t?this.mouseY-o:this.mouseX-o)<0?-1:1,l=-1===a?s-i:s+i;!function e(){var o,i;-1===a?s>l&&(s-=n.options.clickOnTrackSpeed,n.contentWrapperEl.scrollTo(((o={})[n.axis[t].offsetAttr]=s,o)),r.requestAnimationFrame(e)):s<l&&(s+=n.options.clickOnTrackSpeed,n.contentWrapperEl.scrollTo(((i={})[n.axis[t].offsetAttr]=s,i)),r.requestAnimationFrame(e))}()}},t.getContentElement=function(){return this.contentEl},t.getScrollElement=function(){return this.contentWrapperEl},t.getScrollbarWidth=function(){try{return"none"===getComputedStyle(this.contentWrapperEl,"::-webkit-scrollbar").display||"scrollbarWidth"in document.documentElement.style||"-ms-overflow-style"in document.documentElement.style?0:ee(this.el)}catch(e){return ee(this.el)}},t.removeListeners=function(){var e=this,t=J(this.el);this.options.autoHide&&this.el.removeEventListener("mouseenter",this.onMouseEnter),["mousedown","click","dblclick"].forEach((function(t){e.el.removeEventListener(t,e.onPointerEvent,!0)})),["touchstart","touchend","touchmove"].forEach((function(t){e.el.removeEventListener(t,e.onPointerEvent,{capture:!0,passive:!0})})),this.el.removeEventListener("mousemove",this.onMouseMove),this.el.removeEventListener("mouseleave",this.onMouseLeave),this.contentWrapperEl&&this.contentWrapperEl.removeEventListener("scroll",this.onScroll),t.removeEventListener("resize",this.onWindowResize),this.mutationObserver&&this.mutationObserver.disconnect(),this.resizeObserver&&this.resizeObserver.disconnect(),this.recalculate.cancel(),this.onMouseMove.cancel(),this.hideScrollbars.cancel(),this.onWindowResize.cancel()},t.unMount=function(){this.removeListeners(),e.instances.delete(this.el)},t.isWithinBounds=function(e){return this.mouseX>=e.left&&this.mouseX<=e.left+e.width&&this.mouseY>=e.top&&this.mouseY<=e.top+e.height},t.findChild=function(e,t){var n=e.matches||e.webkitMatchesSelector||e.mozMatchesSelector||e.msMatchesSelector;return Array.prototype.filter.call(e.children,(function(e){return n.call(e,t)}))[0]},e}();te.defaultOptions={autoHide:!0,forceVisible:!1,clickOnTrack:!0,clickOnTrackSpeed:40,classNames:{contentEl:"simplebar-content",contentWrapper:"simplebar-content-wrapper",offset:"simplebar-offset",mask:"simplebar-mask",wrapper:"simplebar-wrapper",placeholder:"simplebar-placeholder",scrollbar:"simplebar-scrollbar",track:"simplebar-track",heightAutoObserverWrapperEl:"simplebar-height-auto-observer-wrapper",heightAutoObserverEl:"simplebar-height-auto-observer",visible:"simplebar-visible",horizontal:"simplebar-horizontal",vertical:"simplebar-vertical",hover:"simplebar-hover",dragging:"simplebar-dragging"},scrollbarMinSize:25,scrollbarMaxSize:0,timeout:1e3},te.instances=new WeakMap,te.initDOMLoadedElements=function(){document.removeEventListener("DOMContentLoaded",this.initDOMLoadedElements),window.removeEventListener("load",this.initDOMLoadedElements),Array.prototype.forEach.call(document.querySelectorAll("[data-simplebar]"),(function(e){"init"===e.getAttribute("data-simplebar")||te.instances.has(e)||new te(e,G(e.attributes))}))},te.removeObserver=function(){this.globalObserver.disconnect()},te.initHtmlApi=function(){this.initDOMLoadedElements=this.initDOMLoadedElements.bind(this),"undefined"!=typeof MutationObserver&&(this.globalObserver=new MutationObserver(te.handleMutations),this.globalObserver.observe(document,{childList:!0,subtree:!0})),"complete"===document.readyState||"loading"!==document.readyState&&!document.documentElement.doScroll?window.setTimeout(this.initDOMLoadedElements):(document.addEventListener("DOMContentLoaded",this.initDOMLoadedElements),window.addEventListener("load",this.initDOMLoadedElements))},te.handleMutations=function(e){e.forEach((function(e){Array.prototype.forEach.call(e.addedNodes,(function(e){1===e.nodeType&&(e.hasAttribute("data-simplebar")?!te.instances.has(e)&&document.documentElement.contains(e)&&new te(e,G(e.attributes)):Array.prototype.forEach.call(e.querySelectorAll("[data-simplebar]"),(function(e){"init"!==e.getAttribute("data-simplebar")&&!te.instances.has(e)&&document.documentElement.contains(e)&&new te(e,G(e.attributes))})))})),Array.prototype.forEach.call(e.removedNodes,(function(e){1===e.nodeType&&("init"===e.getAttribute("data-simplebar")?te.instances.has(e)&&!document.documentElement.contains(e)&&te.instances.get(e).unMount():Array.prototype.forEach.call(e.querySelectorAll('[data-simplebar="init"]'),(function(e){te.instances.has(e)&&!document.documentElement.contains(e)&&te.instances.get(e).unMount()})))}))}))},te.getOptions=G,i()&&te.initHtmlApi();const ne=te},6395:(e,t,n)=>{"use strict";n.r(t),n.d(t,{DocAnchorTarget:()=>u,DocAnchorTrigger:()=>p,DocBackToTop:()=>g,DocBadge:()=>y,DocCheckbox:()=>E,DocCodeblock:()=>Ge,DocCollapse:()=>Ke,DocDrawer:()=>ot,DocDropdown:()=>lt,DocEmoji:()=>dt,DocHistory:()=>Ht,DocIcon:()=>Bt,DocIconAlignRight:()=>ji,DocIconArrowLeft:()=>zi,DocIconArrowRight:()=>$i,DocIconArrowTop:()=>Yi,DocIconBox:()=>Ki,DocIconButton:()=>Vt,DocIconCheck:()=>es,DocIconCheckCircle:()=>rs,DocIconChevronDown:()=>ss,DocIconChevronRight:()=>cs,DocIconCopy:()=>Ze,DocIconFile:()=>fs,DocIconFilter:()=>ms,DocIconFolder:()=>ys,DocIconHistory:()=>ks,DocIconHome:()=>Cs,DocIconInfo:()=>Os,DocIconLayers:()=>Ds,DocIconLink:()=>Ms,DocIconMenu:()=>Hs,DocIconMinus:()=>Ws,DocIconMoon:()=>Vs,DocIconMoreHorizontal:()=>Us,DocIconPlus:()=>Gs,DocIconSearch:()=>Xs,DocIconShield:()=>ta,DocIconSun:()=>oa,DocIconX:()=>aa,DocLoadingSpinner:()=>$t,DocMember:()=>Fn,DocMemberGroup:()=>Bn,DocOverloadGroup:()=>Vn,DocPanel:()=>Zn,DocPanels:()=>Yn,DocParameter:()=>sr,DocParameters:()=>ur,DocSearchDesktop:()=>_r,DocSearchMobile:()=>Dr,DocSidebar:()=>fo,DocSidebarRight:()=>Io,DocSwitch:()=>No,DocTab:()=>jo,DocTabs:()=>zo,DocThemeSwitch:()=>qo,DocToolbar:()=>Ii,DocToolbarMemberFilterNoResults:()=>Pi});var r=n(4359),o=["id"],i=n(5184),s=n(5543),a=n(2626);const l=(0,r.aZ)({name:"DocAnchorTarget",props:{id:{type:String,required:!0}},setup:function(e){var t=(0,a.oR)().store,n=(0,i.B)().scrollTo,o=(0,r.iH)("#".concat(e.id));function l(){n(o.value,{offset:s.vE,onStart:function(){t.actions.updateScrolledElementId(e.id)}})}(0,r.bv)((function(){window.location.hash&&decodeURIComponent(window.location.hash)===o.value&&setTimeout((function(){t.state.isScrollPositionRestored||(window.scrollTo(0,0),setTimeout(l,200))}),1)}))}});var c=n(3744);const u=(0,c.Z)(l,[["render",function(e,t,n,i,s,a){return(0,r.wg)(),(0,r.iD)("div",{id:e.id},[(0,r.WI)(e.$slots,"default")],8,o)}]]);var d=["href","tabindex","aria-disabled"],f=n(6184);const h=(0,r.aZ)({name:"DocAnchorTrigger",props:{disabled:Boolean,to:{type:String,required:!0}},emits:["click"],setup:function(e,t){var n=t.emit,o=(0,a.oR)().store,l=(0,i.B)().scrollTo;return{onClick:function(t){(0,s.pI)(t)||(t.preventDefault(),(0,f.Vn)(e.to),n("click"),l(e.to,{offset:(0,s.vE)(),onStart:function(){var t="#"===e.to.charAt(0)?e.to.substr(1):e.to;o.actions.updateScrolledElementId(t)}}))},tabindex:(0,r.Fl)((function(){return e.disabled?"-1":null}))}}}),p=(0,c.Z)(h,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("a",{href:e.to,tabindex:e.tabindex,"aria-disabled":e.disabled,onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onClick&&e.onClick.apply(e,t)})},[(0,r.WI)(e.$slots,"default")],8,d)}]]);var m=n(7023);const v=(0,r.aZ)({name:"DocBackToTop",setup:function(){var e=(0,r.iH)(!1),t=(0,i.B)().scrollTo;return(0,m.zX)(window,"scroll",(function(){document.documentElement.scrollTop>350?e.value=!0:e.value=!1})),{onClick:function(){t("body")},show:e}}}),g=(0,c.Z)(v,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-arrow-top"),l=(0,r.up)("doc-icon");return(0,r.wg)(),(0,r.j4)(r.uT,{"enter-from-class":"translate-y-4 opacity-0","enter-to-class":"translate-y-0 opacity-100","leave-from-class":"translate-y-0 opacity-100","leave-to-class":"translate-y-4 opacity-0"},{default:(0,r.w5)((function(){return[e.show?((0,r.wg)(),(0,r.iD)("button",{key:0,class:"fixed bottom-6 right-6 w-12 h-12 flex items-center justify-center rounded-full bg-white bg-opacity-70 hover:bg-gray-200 dark:bg-dark-850 dark:hover:bg-dark-450 z-40 focus:outline-none transition duration-300 linear border border-gray-400 border-opacity-50 hover:border-opacity-10 dark:border-dark-450 dark:bg-opacity-70",onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onClick&&e.onClick.apply(e,t)})},[(0,r.Wm)(l,{class:"w-7 h-7 text-blue-500 dark:text-blue-400"},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1})])):(0,r.kq)("",!0)]})),_:1})}]]),b=(0,r.aZ)({name:"DocBadge",props:{type:{type:String,default:""}},setup:function(e){var t=(0,r.Fl)((function(){return e.type.trim()}));return{badgeClasses:(0,r.Fl)((function(){switch(t.value){case"bindable":return"bg-yellow-100 text-yellow-700 dark:bg-yellow-500 dark:text-white";case"required":return"bg-indigo-100 text-indigo-700 dark:bg-indigo-500 dark:text-white";case"internal":return"bg-gray-700 text-white";case"private":case"primary":case"static":return"bg-blue-100 text-blue-700 dark:bg-blue-400 dark:text-white";case"warning":case"readonly":return"bg-orange-100 text-orange-700 dark:bg-orange-500 dark:text-white";case"chainable":case"public":case"success":return"bg-green-100 text-green-700 dark:bg-green-500 dark:text-white";case"template":case"info":return"bg-teal-100 text-teal-700 dark:bg-teal-500 dark:text-white";case"deprecated":case"removed":case"danger":return"bg-red-100 text-red-700 dark:bg-red-500 dark:text-white";default:return"bg-gray-200 text-gray-900 dark:bg-dark-550 dark:text-dark-250"}}))}}}),y=(0,c.Z)(b,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("span",{class:(0,r.C_)(["inline-flex items-center justify-center h-6 px-2 text-xs font-medium leading-none whitespace-nowrap rounded",e.badgeClasses])},[(0,r.WI)(e.$slots,"default")],2)}]]);var w={class:"inline-flex py-1.5 cursor-pointer select-none"},x=["value"],k={class:"inline-block ml-2"};const S=(0,r.aZ)({name:"DocCheckbox",props:{value:[Boolean,String],modelValue:[Boolean,Array]},emits:["update:modelValue"],setup:function(e,t){var n=t.emit,o=(0,r.iH)(e.modelValue),i=(0,r.iH)(!1),s=(0,r.Fl)({get:function(){return o.value},set:function(e){o.value=e,n("update:modelValue",o.value)}}),a=(0,r.Fl)((function(){return Array.isArray(e.modelValue)?e.modelValue.includes(e.value):e.modelValue})),l=(0,r.Fl)((function(){return[{"border-blue-500 bg-blue-500":a.value},{"border-gray-400 bg-gray-100":!a.value},{"shadow-outline":i.value}]}));return(0,r.YP)((function(){return e.modelValue}),(function(e){return o.value=e})),{localValue:o,computedValue:s,isChecked:a,isFocused:i,checkboxClasses:l}}}),E=(0,c.Z)(S,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-check"),l=(0,r.up)("doc-icon");return(0,r.wg)(),(0,r.iD)("label",w,[(0,r._)("div",{class:(0,r.C_)(["w-4 h-4 mt-px border rounded-sm",e.checkboxClasses])},[(0,r.wy)((0,r.Wm)(l,{width:"14",height:"14",class:"text-white"},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1},512),[[r.F8,e.isChecked]])],2),(0,r.wy)((0,r._)("input",{"onUpdate:modelValue":t[0]||(t[0]=function(t){return e.computedValue=t}),class:"absolute opacity-0 hidden",style:{"z-index":"-1"},type:"checkbox",value:e.value,onFocus:t[1]||(t[1]=function(t){return e.isFocused=!0}),onBlur:t[2]||(t[2]=function(t){return e.isFocused=!1})},null,40,x),[[r.e8,e.computedValue]]),(0,r._)("span",k,[(0,r.WI)(e.$slots,"default")])])}]]);var C={class:"absolute top-0 right-0 z-5"},_=["innerHTML"],T=n(7924),O={class:"whitespace-nowrap"},L=n(2152),R=n.n(L),D=function(e){return(0,r.dD)("data-v-cf3656fa"),e=e(),(0,r.Cn)(),e},A={key:0,ref:"tooltip",class:"z-50 px-2 py-1 text-xs text-white bg-gray-900 dark:bg-dark-500 rounded tooltip"},I=D((function(){return(0,r._)("div",{class:"arrow","data-popper-arrow":""},null,-1)}));function M(e){if(null==e)return window;if("[object Window]"!==e.toString()){var t=e.ownerDocument;return t&&t.defaultView||window}return e}function F(e){return e instanceof M(e).Element||e instanceof Element}function P(e){return e instanceof M(e).HTMLElement||e instanceof HTMLElement}function H(e){return"undefined"!=typeof ShadowRoot&&(e instanceof M(e).ShadowRoot||e instanceof ShadowRoot)}var N=Math.max,j=Math.min,W=Math.round;function B(e,t){void 0===t&&(t=!1);var n=e.getBoundingClientRect(),r=1,o=1;if(P(e)&&t){var i=e.offsetHeight,s=e.offsetWidth;s>0&&(r=W(n.width)/s||1),i>0&&(o=W(n.height)/i||1)}return{width:n.width/r,height:n.height/o,top:n.top/o,right:n.right/r,bottom:n.bottom/o,left:n.left/r,x:n.left/r,y:n.top/o}}function z(e){var t=M(e);return{scrollLeft:t.pageXOffset,scrollTop:t.pageYOffset}}function V(e){return e?(e.nodeName||"").toLowerCase():null}function q(e){return((F(e)?e.ownerDocument:e.document)||window.document).documentElement}function $(e){return B(q(e)).left+z(e).scrollLeft}function U(e){return M(e).getComputedStyle(e)}function Z(e){var t=U(e),n=t.overflow,r=t.overflowX,o=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+o+r)}function Y(e,t,n){void 0===n&&(n=!1);var r,o,i=P(t),s=P(t)&&function(e){var t=e.getBoundingClientRect(),n=W(t.width)/e.offsetWidth||1,r=W(t.height)/e.offsetHeight||1;return 1!==n||1!==r}(t),a=q(t),l=B(e,s),c={scrollLeft:0,scrollTop:0},u={x:0,y:0};return(i||!i&&!n)&&(("body"!==V(t)||Z(a))&&(c=(r=t)!==M(r)&&P(r)?{scrollLeft:(o=r).scrollLeft,scrollTop:o.scrollTop}:z(r)),P(t)?((u=B(t,!0)).x+=t.clientLeft,u.y+=t.clientTop):a&&(u.x=$(a))),{x:l.left+c.scrollLeft-u.x,y:l.top+c.scrollTop-u.y,width:l.width,height:l.height}}function G(e){var t=B(e),n=e.offsetWidth,r=e.offsetHeight;return Math.abs(t.width-n)<=1&&(n=t.width),Math.abs(t.height-r)<=1&&(r=t.height),{x:e.offsetLeft,y:e.offsetTop,width:n,height:r}}function J(e){return"html"===V(e)?e:e.assignedSlot||e.parentNode||(H(e)?e.host:null)||q(e)}function K(e){return["html","body","#document"].indexOf(V(e))>=0?e.ownerDocument.body:P(e)&&Z(e)?e:K(J(e))}function X(e,t){var n;void 0===t&&(t=[]);var r=K(e),o=r===(null==(n=e.ownerDocument)?void 0:n.body),i=M(r),s=o?[i].concat(i.visualViewport||[],Z(r)?r:[]):r,a=t.concat(s);return o?a:a.concat(X(J(s)))}function Q(e){return["table","td","th"].indexOf(V(e))>=0}function ee(e){return P(e)&&"fixed"!==U(e).position?e.offsetParent:null}function te(e){for(var t=M(e),n=ee(e);n&&Q(n)&&"static"===U(n).position;)n=ee(n);return n&&("html"===V(n)||"body"===V(n)&&"static"===U(n).position)?t:n||function(e){var t=-1!==navigator.userAgent.toLowerCase().indexOf("firefox");if(-1!==navigator.userAgent.indexOf("Trident")&&P(e)&&"fixed"===U(e).position)return null;for(var n=J(e);P(n)&&["html","body"].indexOf(V(n))<0;){var r=U(n);if("none"!==r.transform||"none"!==r.perspective||"paint"===r.contain||-1!==["transform","perspective"].indexOf(r.willChange)||t&&"filter"===r.willChange||t&&r.filter&&"none"!==r.filter)return n;n=n.parentNode}return null}(e)||t}var ne="top",re="bottom",oe="right",ie="left",se="auto",ae=[ne,re,oe,ie],le="start",ce="end",ue="viewport",de="popper",fe=ae.reduce((function(e,t){return e.concat([t+"-"+le,t+"-"+ce])}),[]),he=[].concat(ae,[se]).reduce((function(e,t){return e.concat([t,t+"-"+le,t+"-"+ce])}),[]),pe=["beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite"];function me(e){var t=new Map,n=new Set,r=[];function o(e){n.add(e.name),[].concat(e.requires||[],e.requiresIfExists||[]).forEach((function(e){if(!n.has(e)){var r=t.get(e);r&&o(r)}})),r.push(e)}return e.forEach((function(e){t.set(e.name,e)})),e.forEach((function(e){n.has(e.name)||o(e)})),r}var ve={placement:"bottom",modifiers:[],strategy:"absolute"};function ge(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return!t.some((function(e){return!(e&&"function"==typeof e.getBoundingClientRect)}))}function be(e){void 0===e&&(e={});var t=e,n=t.defaultModifiers,r=void 0===n?[]:n,o=t.defaultOptions,i=void 0===o?ve:o;return function(e,t,n){void 0===n&&(n=i);var o,s,a={placement:"bottom",orderedModifiers:[],options:Object.assign({},ve,i),modifiersData:{},elements:{reference:e,popper:t},attributes:{},styles:{}},l=[],c=!1,u={state:a,setOptions:function(n){var o="function"==typeof n?n(a.options):n;d(),a.options=Object.assign({},i,a.options,o),a.scrollParents={reference:F(e)?X(e):e.contextElement?X(e.contextElement):[],popper:X(t)};var s,c,f=function(e){var t=me(e);return pe.reduce((function(e,n){return e.concat(t.filter((function(e){return e.phase===n})))}),[])}((s=[].concat(r,a.options.modifiers),c=s.reduce((function(e,t){var n=e[t.name];return e[t.name]=n?Object.assign({},n,t,{options:Object.assign({},n.options,t.options),data:Object.assign({},n.data,t.data)}):t,e}),{}),Object.keys(c).map((function(e){return c[e]}))));return a.orderedModifiers=f.filter((function(e){return e.enabled})),a.orderedModifiers.forEach((function(e){var t=e.name,n=e.options,r=void 0===n?{}:n,o=e.effect;if("function"==typeof o){var i=o({state:a,name:t,instance:u,options:r});l.push(i||function(){})}})),u.update()},forceUpdate:function(){if(!c){var e=a.elements,t=e.reference,n=e.popper;if(ge(t,n)){a.rects={reference:Y(t,te(n),"fixed"===a.options.strategy),popper:G(n)},a.reset=!1,a.placement=a.options.placement,a.orderedModifiers.forEach((function(e){return a.modifiersData[e.name]=Object.assign({},e.data)}));for(var r=0;r<a.orderedModifiers.length;r++)if(!0!==a.reset){var o=a.orderedModifiers[r],i=o.fn,s=o.options,l=void 0===s?{}:s,d=o.name;"function"==typeof i&&(a=i({state:a,options:l,name:d,instance:u})||a)}else a.reset=!1,r=-1}}},update:(o=function(){return new Promise((function(e){u.forceUpdate(),e(a)}))},function(){return s||(s=new Promise((function(e){Promise.resolve().then((function(){s=void 0,e(o())}))}))),s}),destroy:function(){d(),c=!0}};if(!ge(e,t))return u;function d(){l.forEach((function(e){return e()})),l=[]}return u.setOptions(n).then((function(e){!c&&n.onFirstUpdate&&n.onFirstUpdate(e)})),u}}var ye={passive:!0};function we(e){return e.split("-")[0]}function xe(e){return e.split("-")[1]}function ke(e){return["top","bottom"].indexOf(e)>=0?"x":"y"}function Se(e){var t,n=e.reference,r=e.element,o=e.placement,i=o?we(o):null,s=o?xe(o):null,a=n.x+n.width/2-r.width/2,l=n.y+n.height/2-r.height/2;switch(i){case ne:t={x:a,y:n.y-r.height};break;case re:t={x:a,y:n.y+n.height};break;case oe:t={x:n.x+n.width,y:l};break;case ie:t={x:n.x-r.width,y:l};break;default:t={x:n.x,y:n.y}}var c=i?ke(i):null;if(null!=c){var u="y"===c?"height":"width";switch(s){case le:t[c]=t[c]-(n[u]/2-r[u]/2);break;case ce:t[c]=t[c]+(n[u]/2-r[u]/2)}}return t}var Ee={top:"auto",right:"auto",bottom:"auto",left:"auto"};function Ce(e){var t,n=e.popper,r=e.popperRect,o=e.placement,i=e.variation,s=e.offsets,a=e.position,l=e.gpuAcceleration,c=e.adaptive,u=e.roundOffsets,d=e.isFixed,f=s.x,h=void 0===f?0:f,p=s.y,m=void 0===p?0:p,v="function"==typeof u?u({x:h,y:m}):{x:h,y:m};h=v.x,m=v.y;var g=s.hasOwnProperty("x"),b=s.hasOwnProperty("y"),y=ie,w=ne,x=window;if(c){var k=te(n),S="clientHeight",E="clientWidth";k===M(n)&&"static"!==U(k=q(n)).position&&"absolute"===a&&(S="scrollHeight",E="scrollWidth"),k=k,(o===ne||(o===ie||o===oe)&&i===ce)&&(w=re,m-=(d&&x.visualViewport?x.visualViewport.height:k[S])-r.height,m*=l?1:-1),o!==ie&&(o!==ne&&o!==re||i!==ce)||(y=oe,h-=(d&&x.visualViewport?x.visualViewport.width:k[E])-r.width,h*=l?1:-1)}var C,_=Object.assign({position:a},c&&Ee),T=!0===u?function(e){var t=e.x,n=e.y,r=window.devicePixelRatio||1;return{x:W(t*r)/r||0,y:W(n*r)/r||0}}({x:h,y:m}):{x:h,y:m};return h=T.x,m=T.y,l?Object.assign({},_,((C={})[w]=b?"0":"",C[y]=g?"0":"",C.transform=(x.devicePixelRatio||1)<=1?"translate("+h+"px, "+m+"px)":"translate3d("+h+"px, "+m+"px, 0)",C)):Object.assign({},_,((t={})[w]=b?m+"px":"",t[y]=g?h+"px":"",t.transform="",t))}var _e={left:"right",right:"left",bottom:"top",top:"bottom"};function Te(e){return e.replace(/left|right|bottom|top/g,(function(e){return _e[e]}))}var Oe={start:"end",end:"start"};function Le(e){return e.replace(/start|end/g,(function(e){return Oe[e]}))}function Re(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&H(n)){var r=t;do{if(r&&e.isSameNode(r))return!0;r=r.parentNode||r.host}while(r)}return!1}function De(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function Ae(e,t){return t===ue?De(function(e){var t=M(e),n=q(e),r=t.visualViewport,o=n.clientWidth,i=n.clientHeight,s=0,a=0;return r&&(o=r.width,i=r.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(s=r.offsetLeft,a=r.offsetTop)),{width:o,height:i,x:s+$(e),y:a}}(e)):F(t)?function(e){var t=B(e);return t.top=t.top+e.clientTop,t.left=t.left+e.clientLeft,t.bottom=t.top+e.clientHeight,t.right=t.left+e.clientWidth,t.width=e.clientWidth,t.height=e.clientHeight,t.x=t.left,t.y=t.top,t}(t):De(function(e){var t,n=q(e),r=z(e),o=null==(t=e.ownerDocument)?void 0:t.body,i=N(n.scrollWidth,n.clientWidth,o?o.scrollWidth:0,o?o.clientWidth:0),s=N(n.scrollHeight,n.clientHeight,o?o.scrollHeight:0,o?o.clientHeight:0),a=-r.scrollLeft+$(e),l=-r.scrollTop;return"rtl"===U(o||n).direction&&(a+=N(n.clientWidth,o?o.clientWidth:0)-i),{width:i,height:s,x:a,y:l}}(q(e)))}function Ie(e){return Object.assign({},{top:0,right:0,bottom:0,left:0},e)}function Me(e,t){return t.reduce((function(t,n){return t[n]=e,t}),{})}function Fe(e,t){void 0===t&&(t={});var n=t,r=n.placement,o=void 0===r?e.placement:r,i=n.boundary,s=void 0===i?"clippingParents":i,a=n.rootBoundary,l=void 0===a?ue:a,c=n.elementContext,u=void 0===c?de:c,d=n.altBoundary,f=void 0!==d&&d,h=n.padding,p=void 0===h?0:h,m=Ie("number"!=typeof p?p:Me(p,ae)),v=u===de?"reference":de,g=e.rects.popper,b=e.elements[f?v:u],y=function(e,t,n){var r="clippingParents"===t?function(e){var t=X(J(e)),n=["absolute","fixed"].indexOf(U(e).position)>=0&&P(e)?te(e):e;return F(n)?t.filter((function(e){return F(e)&&Re(e,n)&&"body"!==V(e)})):[]}(e):[].concat(t),o=[].concat(r,[n]),i=o[0],s=o.reduce((function(t,n){var r=Ae(e,n);return t.top=N(r.top,t.top),t.right=j(r.right,t.right),t.bottom=j(r.bottom,t.bottom),t.left=N(r.left,t.left),t}),Ae(e,i));return s.width=s.right-s.left,s.height=s.bottom-s.top,s.x=s.left,s.y=s.top,s}(F(b)?b:b.contextElement||q(e.elements.popper),s,l),w=B(e.elements.reference),x=Se({reference:w,element:g,strategy:"absolute",placement:o}),k=De(Object.assign({},g,x)),S=u===de?k:w,E={top:y.top-S.top+m.top,bottom:S.bottom-y.bottom+m.bottom,left:y.left-S.left+m.left,right:S.right-y.right+m.right},C=e.modifiersData.offset;if(u===de&&C){var _=C[o];Object.keys(E).forEach((function(e){var t=[oe,re].indexOf(e)>=0?1:-1,n=[ne,re].indexOf(e)>=0?"y":"x";E[e]+=_[n]*t}))}return E}function Pe(e,t,n){return N(e,j(t,n))}function He(e,t,n){return void 0===n&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function Ne(e){return[ne,oe,re,ie].some((function(t){return e[t]>=0}))}var je=be({defaultModifiers:[{name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(e){var t=e.state,n=e.instance,r=e.options,o=r.scroll,i=void 0===o||o,s=r.resize,a=void 0===s||s,l=M(t.elements.popper),c=[].concat(t.scrollParents.reference,t.scrollParents.popper);return i&&c.forEach((function(e){e.addEventListener("scroll",n.update,ye)})),a&&l.addEventListener("resize",n.update,ye),function(){i&&c.forEach((function(e){e.removeEventListener("scroll",n.update,ye)})),a&&l.removeEventListener("resize",n.update,ye)}},data:{}},{name:"popperOffsets",enabled:!0,phase:"read",fn:function(e){var t=e.state,n=e.name;t.modifiersData[n]=Se({reference:t.rects.reference,element:t.rects.popper,strategy:"absolute",placement:t.placement})},data:{}},{name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(e){var t=e.state,n=e.options,r=n.gpuAcceleration,o=void 0===r||r,i=n.adaptive,s=void 0===i||i,a=n.roundOffsets,l=void 0===a||a,c={placement:we(t.placement),variation:xe(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:o,isFixed:"fixed"===t.options.strategy};null!=t.modifiersData.popperOffsets&&(t.styles.popper=Object.assign({},t.styles.popper,Ce(Object.assign({},c,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:s,roundOffsets:l})))),null!=t.modifiersData.arrow&&(t.styles.arrow=Object.assign({},t.styles.arrow,Ce(Object.assign({},c,{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-placement":t.placement})},data:{}},{name:"applyStyles",enabled:!0,phase:"write",fn:function(e){var t=e.state;Object.keys(t.elements).forEach((function(e){var n=t.styles[e]||{},r=t.attributes[e]||{},o=t.elements[e];P(o)&&V(o)&&(Object.assign(o.style,n),Object.keys(r).forEach((function(e){var t=r[e];!1===t?o.removeAttribute(e):o.setAttribute(e,!0===t?"":t)})))}))},effect:function(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach((function(e){var r=t.elements[e],o=t.attributes[e]||{},i=Object.keys(t.styles.hasOwnProperty(e)?t.styles[e]:n[e]).reduce((function(e,t){return e[t]="",e}),{});P(r)&&V(r)&&(Object.assign(r.style,i),Object.keys(o).forEach((function(e){r.removeAttribute(e)})))}))}},requires:["computeStyles"]},{name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(e){var t=e.state,n=e.options,r=e.name,o=n.offset,i=void 0===o?[0,0]:o,s=he.reduce((function(e,n){return e[n]=function(e,t,n){var r=we(e),o=[ie,ne].indexOf(r)>=0?-1:1,i="function"==typeof n?n(Object.assign({},t,{placement:e})):n,s=i[0],a=i[1];return s=s||0,a=(a||0)*o,[ie,oe].indexOf(r)>=0?{x:a,y:s}:{x:s,y:a}}(n,t.rects,i),e}),{}),a=s[t.placement],l=a.x,c=a.y;null!=t.modifiersData.popperOffsets&&(t.modifiersData.popperOffsets.x+=l,t.modifiersData.popperOffsets.y+=c),t.modifiersData[r]=s}},{name:"flip",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,r=e.name;if(!t.modifiersData[r]._skip){for(var o=n.mainAxis,i=void 0===o||o,s=n.altAxis,a=void 0===s||s,l=n.fallbackPlacements,c=n.padding,u=n.boundary,d=n.rootBoundary,f=n.altBoundary,h=n.flipVariations,p=void 0===h||h,m=n.allowedAutoPlacements,v=t.options.placement,g=we(v),b=l||(g!==v&&p?function(e){if(we(e)===se)return[];var t=Te(e);return[Le(e),t,Le(t)]}(v):[Te(v)]),y=[v].concat(b).reduce((function(e,n){return e.concat(we(n)===se?function(e,t){void 0===t&&(t={});var n=t,r=n.placement,o=n.boundary,i=n.rootBoundary,s=n.padding,a=n.flipVariations,l=n.allowedAutoPlacements,c=void 0===l?he:l,u=xe(r),d=u?a?fe:fe.filter((function(e){return xe(e)===u})):ae,f=d.filter((function(e){return c.indexOf(e)>=0}));0===f.length&&(f=d);var h=f.reduce((function(t,n){return t[n]=Fe(e,{placement:n,boundary:o,rootBoundary:i,padding:s})[we(n)],t}),{});return Object.keys(h).sort((function(e,t){return h[e]-h[t]}))}(t,{placement:n,boundary:u,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:m}):n)}),[]),w=t.rects.reference,x=t.rects.popper,k=new Map,S=!0,E=y[0],C=0;C<y.length;C++){var _=y[C],T=we(_),O=xe(_)===le,L=[ne,re].indexOf(T)>=0,R=L?"width":"height",D=Fe(t,{placement:_,boundary:u,rootBoundary:d,altBoundary:f,padding:c}),A=L?O?oe:ie:O?re:ne;w[R]>x[R]&&(A=Te(A));var I=Te(A),M=[];if(i&&M.push(D[T]<=0),a&&M.push(D[A]<=0,D[I]<=0),M.every((function(e){return e}))){E=_,S=!1;break}k.set(_,M)}if(S)for(var F=function(e){var t=y.find((function(t){var n=k.get(t);if(n)return n.slice(0,e).every((function(e){return e}))}));if(t)return E=t,"break"},P=p?3:1;P>0&&"break"!==F(P);P--);t.placement!==E&&(t.modifiersData[r]._skip=!0,t.placement=E,t.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}},{name:"preventOverflow",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,r=e.name,o=n.mainAxis,i=void 0===o||o,s=n.altAxis,a=void 0!==s&&s,l=n.boundary,c=n.rootBoundary,u=n.altBoundary,d=n.padding,f=n.tether,h=void 0===f||f,p=n.tetherOffset,m=void 0===p?0:p,v=Fe(t,{boundary:l,rootBoundary:c,padding:d,altBoundary:u}),g=we(t.placement),b=xe(t.placement),y=!b,w=ke(g),x="x"===w?"y":"x",k=t.modifiersData.popperOffsets,S=t.rects.reference,E=t.rects.popper,C="function"==typeof m?m(Object.assign({},t.rects,{placement:t.placement})):m,_="number"==typeof C?{mainAxis:C,altAxis:C}:Object.assign({mainAxis:0,altAxis:0},C),T=t.modifiersData.offset?t.modifiersData.offset[t.placement]:null,O={x:0,y:0};if(k){if(i){var L,R="y"===w?ne:ie,D="y"===w?re:oe,A="y"===w?"height":"width",I=k[w],M=I+v[R],F=I-v[D],P=h?-E[A]/2:0,H=b===le?S[A]:E[A],W=b===le?-E[A]:-S[A],B=t.elements.arrow,z=h&&B?G(B):{width:0,height:0},V=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},q=V[R],$=V[D],U=Pe(0,S[A],z[A]),Z=y?S[A]/2-P-U-q-_.mainAxis:H-U-q-_.mainAxis,Y=y?-S[A]/2+P+U+$+_.mainAxis:W+U+$+_.mainAxis,J=t.elements.arrow&&te(t.elements.arrow),K=J?"y"===w?J.clientTop||0:J.clientLeft||0:0,X=null!=(L=null==T?void 0:T[w])?L:0,Q=I+Y-X,ee=Pe(h?j(M,I+Z-X-K):M,I,h?N(F,Q):F);k[w]=ee,O[w]=ee-I}if(a){var se,ae="x"===w?ne:ie,ce="x"===w?re:oe,ue=k[x],de="y"===x?"height":"width",fe=ue+v[ae],he=ue-v[ce],pe=-1!==[ne,ie].indexOf(g),me=null!=(se=null==T?void 0:T[x])?se:0,ve=pe?fe:ue-S[de]-E[de]-me+_.altAxis,ge=pe?ue+S[de]+E[de]-me-_.altAxis:he,be=h&&pe?function(e,t,n){var r=Pe(e,t,n);return r>n?n:r}(ve,ue,ge):Pe(h?ve:fe,ue,h?ge:he);k[x]=be,O[x]=be-ue}t.modifiersData[r]=O}},requiresIfExists:["offset"]},{name:"arrow",enabled:!0,phase:"main",fn:function(e){var t,n=e.state,r=e.name,o=e.options,i=n.elements.arrow,s=n.modifiersData.popperOffsets,a=we(n.placement),l=ke(a),c=[ie,oe].indexOf(a)>=0?"height":"width";if(i&&s){var u=function(e,t){return Ie("number"!=typeof(e="function"==typeof e?e(Object.assign({},t.rects,{placement:t.placement})):e)?e:Me(e,ae))}(o.padding,n),d=G(i),f="y"===l?ne:ie,h="y"===l?re:oe,p=n.rects.reference[c]+n.rects.reference[l]-s[l]-n.rects.popper[c],m=s[l]-n.rects.reference[l],v=te(i),g=v?"y"===l?v.clientHeight||0:v.clientWidth||0:0,b=p/2-m/2,y=u[f],w=g-d[c]-u[h],x=g/2-d[c]/2+b,k=Pe(y,x,w),S=l;n.modifiersData[r]=((t={})[S]=k,t.centerOffset=k-x,t)}},effect:function(e){var t=e.state,n=e.options.element,r=void 0===n?"[data-popper-arrow]":n;null!=r&&("string"!=typeof r||(r=t.elements.popper.querySelector(r)))&&Re(t.elements.popper,r)&&(t.elements.arrow=r)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]},{name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(e){var t=e.state,n=e.name,r=t.rects.reference,o=t.rects.popper,i=t.modifiersData.preventOverflow,s=Fe(t,{elementContext:"reference"}),a=Fe(t,{altBoundary:!0}),l=He(s,r),c=He(a,o,i),u=Ne(l),d=Ne(c);t.modifiersData[n]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:u,hasPopperEscaped:d},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":u,"data-popper-escaped":d})}}]});const We=(0,r.aZ)({name:"DocTooltip",props:{placement:{type:String,default:"top"},offset:{type:Array,default:function(){return[0,8]}},delay:{type:Number,default:250}},emits:["show","hide"],setup:function(e,t){var n,o=t.emit,i=(0,r.iH)(),s=(0,r.iH)(),a=(0,r.iH)(!1),l=null;return{trigger:i,tooltip:s,isOpen:a,show:function(){clearTimeout(n),n=setTimeout((function(){a.value=!0,(0,r.Y3)((function(){!function(){var t=document.querySelector("body"),n={placement:e.placement,modifiers:[{name:"offset",options:{offset:e.offset}},{name:"preventOverflow",options:{boundary:t}},{name:"flip",options:{boundary:t}}]};if(!i.value||!s.value)throw new Error("Tooltip trigger or tooltip element not found in DOM");l=je(i.value,s.value,n)}(),o("show")}))}),e.delay)},hide:function(){clearTimeout(n),o("hide"),a.value=!1,l&&(l.destroy(),l=null)},update:function(){l&&l.update()}}}}),Be=(0,c.Z)(We,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("div",null,[(0,r._)("div",{ref:"trigger","aria-describedby":"tooltip",onMouseenter:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.show&&e.show.apply(e,t)}),onMouseleave:t[1]||(t[1]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.hide&&e.hide.apply(e,t)})},[(0,r.WI)(e.$slots,"trigger",{},void 0,!0)],544),e.isOpen?((0,r.wg)(),(0,r.iD)("div",A,[(0,r.WI)(e.$slots,"default",{},void 0,!0),I],512)):(0,r.kq)("",!0)])}],["__scopeId","data-v-cf3656fa"]]),ze=(0,r.aZ)({name:"DocCopyButton",components:{DocTooltip:Be},props:{copyText:String,tooltipText:{type:String,default:"Copy"},tooltipPlacement:{type:String,default:"top"},tooltipOffset:{type:Array,default:function(){return[0,8]}},buttonClass:{type:String,default:""}},setup:function(e){var t=(0,r.iH)(),n=(0,r.iH)(),o=(0,r.iH)(e.tooltipText),i=null;return(0,r.bv)((function(){(i=new(R())(n.value,{text:function(){return e.copyText}})).on("success",(function(){o.value="Copied!",t.value.update()}))})),(0,r.Jd)((function(){null!==i&&i.destroy()})),{tooltip:t,button:n,btnLabel:o}}}),Ve=(0,c.Z)(ze,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-tooltip");return(0,r.wg)(),(0,r.j4)(a,{ref:"tooltip",placement:e.tooltipPlacement,offset:e.tooltipOffset},{trigger:(0,r.w5)((function(){return[(0,r._)("button",{ref:"button",class:(0,r.C_)(["flex items-center justify-center shrink-0 transition-colors duration-200 ease-in focus:outline-none",e.buttonClass]),onMouseleave:t[0]||(t[0]=function(t){return e.btnLabel=e.tooltipText})},[(0,r.WI)(e.$slots,"default")],34)]})),default:(0,r.w5)((function(){return[(0,r._)("span",O,(0,r.zw)(e.btnLabel),1)]})),_:3},8,["placement","offset"])}]]);var qe=[(0,r._)("path",{d:"M20 8h-9c-1.65 0-3 1.35-3 3v9c0 1.65 1.35 3 3 3h9c1.65 0 3-1.35 3-3v-9c0-1.65-1.35-3-3-3zm1 12c0 .55-.45 1-1 1h-9c-.55 0-1-.45-1-1v-9c0-.55.45-1 1-1h9c.55 0 1 .45 1 1v9z"},null,-1),(0,r._)("path",{d:"M5 14H4c-.55 0-1-.45-1-1V4c0-.55.45-1 1-1h9c.55 0 1 .45 1 1v1c0 .55.45 1 1 1s1-.45 1-1V4c0-1.65-1.35-3-3-3H4C2.35 1 1 2.35 1 4v9c0 1.65 1.35 3 3 3h1c.55 0 1-.45 1-1s-.45-1-1-1z"},null,-1)],$e=n(6252);const Ue=(0,$e.aZ)({name:"DocIconCopy"}),Ze=(0,c.Z)(Ue,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("g",null,qe)}]]),Ye=(0,r.aZ)({name:"DocCodeblock",components:{DocCopyButton:Ve,DocIconCopy:Ze},props:{lineNumbers:{type:Boolean,default:!1}},setup:function(e){var t=(0,r.iH)(),n=(0,r.iH)(""),o=(0,r.iH)(""),i=(0,r.iH)(!1);return(0,r.bv)((function(){var r,s,a,l;i.value="string"==typeof(null===(s=null===(r=t.value)||void 0===r?void 0:r.querySelector(".codeblock-title"))||void 0===s?void 0:s.textContent);var c=null===(a=t.value)||void 0===a?void 0:a.querySelector("code[class*='language-']");n.value=(null==c?void 0:c.innerText.trim())||"",e.lineNumbers&&(o.value=function(e){return e.split("\n").map((function(e,t){return"<div>".concat(t+1,"</div>")})).join("")}(n.value)),"PRE"===(null===(l=null==c?void 0:c.parentElement)||void 0===l?void 0:l.nodeName)&&new T.Z(c.parentElement)})),{codeblockRef:t,hasTitle:i,code:n,lineNumbersHtml:o}}}),Ge=(0,c.Z)(Ye,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-copy"),l=(0,r.up)("doc-icon"),c=(0,r.up)("doc-copy-button");return(0,r.wg)(),(0,r.iD)("div",{ref:"codeblockRef",class:(0,r.C_)(["codeblock relative",{"line-numbers":e.lineNumbers}])},[(0,r._)("div",C,[(0,r.Wm)(c,{"copy-text":e.code,"tooltip-text":"Copy","tooltip-placement":"left","tooltip-offset":[-1,0],class:(0,r.C_)(["mr-1.5",e.hasTitle?"mt-14":"mt-1.5"]),"button-class":"w-10 h-10 text-dark-350 hover:text-white bg-dark-850 dark:bg-dark-800 bg-opacity-50 dark:bg-opacity-50 rounded-full"},{default:(0,r.w5)((function(){return[(0,r.Wm)(l,null,{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1})]})),_:1},8,["copy-text","class"])]),(0,r.WI)(e.$slots,"default"),e.lineNumbers?((0,r.wg)(),(0,r.iD)("div",{key:0,class:(0,r.C_)(["absolute top-0 w-14 py-4 pr-3 bg-dark-850 dark:bg-dark-800 font-mono leading-normal text-dark-350 text-xs text-right",{"mt-12":e.hasTitle}]),innerHTML:e.lineNumbersHtml},null,10,_)):(0,r.kq)("",!0)],2)}]]),Je=(0,r.aZ)({name:"DocCollapse",props:{modelValue:Boolean,animations:{type:Boolean,default:!0},triggerClass:{type:String,default:null}},emits:["update:modelValue"],setup:function(e,t){var n=t.emit,o=(0,r.iH)(!1),i=(0,r.iH)();function s(){n("update:modelValue",!e.modelValue)}return(0,r.YP)((function(){return e.modelValue}),(function(e){e?(0,r.Y3)((function(){if(i.value){var e=i.value.scrollHeight;i.value.style.height="".concat(e,"px")}})):i.value&&(i.value.style.height="0px")}),{immediate:!0}),{toggleCollapse:s,onKeydown:function(e){"Enter"===e.key&&s()},toggleMousedown:function(){o.value=!o.value},onFocus:function(e){o.value&&e.target.blur()},content:i}}}),Ke=(0,c.Z)(Je,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("div",null,[(0,r._)("div",{class:(0,r.C_)(["cursor-pointer focus:outline-none focus:bg-gray-200 dark:focus:bg-dark-750",e.triggerClass]),tabindex:"0",onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.toggleCollapse&&e.toggleCollapse.apply(e,t)}),onMousedown:t[1]||(t[1]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.toggleMousedown&&e.toggleMousedown.apply(e,t)}),onMouseup:t[2]||(t[2]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.toggleMousedown&&e.toggleMousedown.apply(e,t)}),onFocus:t[3]||(t[3]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onFocus&&e.onFocus.apply(e,t)}),onKeydown:t[4]||(t[4]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onKeydown&&e.onKeydown.apply(e,t)})},[(0,r.WI)(e.$slots,"trigger")],34),(0,r._)("div",{ref:"content",class:(0,r.C_)(["collapse-content overflow-hidden",e.animations?"transition-all duration-200 ease-out":null]),style:{height:"0"}},[(0,r.WI)(e.$slots,"default")],2),(0,r.WI)(e.$slots,"footer")])}]]),Xe=(0,r.aZ)({name:"DocOverlay",props:{isOpen:Boolean},emits:["swipe-left","swipe-right","click"],setup:function(e,t){var n=t.emit,o=(0,r.qj)({x:0,y:0});return{onTouchStart:function(e){o.x=e.changedTouches[0].clientX,o.y=e.changedTouches[0].clientY},onTouchEnd:function(e){var t=e.changedTouches[0].clientX-o.x,r=e.changedTouches[0].clientY-o.y;Math.abs(t)>Math.abs(r)&&Math.abs(t)>40&&(t<0&&n("swipe-left",[e,"swipe-left"]),t>0&&n("swipe-right",[e,"swipe-right"]))},onClick:function(e){n("click",[e,"click"])}}}}),Qe=(0,c.Z)(Xe,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("div",{class:(0,r.C_)(["fixed z-30 transition-opacity duration-300 ease-in-out bg-gray-600 dark:bg-dark-900",e.isOpen?"inset-0 opacity-50 dark:bg-opacity-70":"opacity-0"]),onTouchstart:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onTouchStart&&e.onTouchStart.apply(e,t)}),onTouchend:t[1]||(t[1]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onTouchEnd&&e.onTouchEnd.apply(e,t)}),onClick:t[2]||(t[2]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onClick&&e.onClick.apply(e,t)})},null,34)}]]);function et(e){(0,m.zX)(window,"resize",(function(t){e(t)}))}function tt(){var e=document.body,t=(0,r.iH)(0),n=e.offsetWidth;(0,r.bv)((function(){return n=e.offsetWidth})),et((function(){return n=e.offsetWidth}));var o=(0,r.iH)(!1);return{enableBodyScroll:function(){o.value&&(e.classList.remove("overflow-hidden","fixed"),e.style.width="",e.style.top="",window.scrollTo(0,t.value),o.value=!1)},disableBodyScroll:function(){o.value||(t.value=window.scrollY,e.style.width="".concat(n,"px"),e.style.top="".concat(-t.value,"px"),e.classList.add("overflow-hidden","fixed"),o.value=!0)},isBodyScrollDisabled:o}}var nt=r.lR;const rt=(0,r.aZ)({name:"DocDrawer",components:{DocOverlay:Qe,Teleport:nt},props:{hideEvent:{type:Array,required:!0}},emits:["show","shown","hide","hidden"],setup:function(e,t){var n=t.emit,o=(0,r.iH)(),i=(0,r.iH)(!1),s=tt(),a=s.enableBodyScroll,l=s.disableBodyScroll;return{Teleport:nt,isOpen:i,show:function(){n("show"),i.value=!0,l(),(0,r.Y3)((function(){n("shown")}))},hide:function(t){var s;if(n("hide"),!t||!t[0])return i.value=!1,a(),void(0,r.Y3)((function(){n("hidden")}));var l=t[0].target;o.value!==l&&!(null===(s=o.value)||void 0===s?void 0:s.contains(l))&&e.hideEvent.includes(t[1])&&(i.value=!1,a(),(0,r.Y3)((function(){n("hidden")})))}}}}),ot=(0,c.Z)(rt,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-overlay");return(0,r.wg)(),(0,r.iD)("div",{ref:"el",class:(0,r.C_)(["fixed top-0 bottom-0 right-0 z-40 w-4/5 h-full transition-transform duration-300 ease-in-out bg-white focus:outline-none dark:bg-dark-850",e.isOpen?"translate-x-0 shadow-2xl":"translate-x-full"]),tabindex:"-1",onKeyup:t[0]||(t[0]=(0,r.D2)((function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.hide&&e.hide.apply(e,t)}),["esc"]))},[(0,r.WI)(e.$slots,"default"),((0,r.wg)(),(0,r.j4)((0,r.LL)(e.Teleport),{to:"#docs-overlay-target"},{default:(0,r.w5)((function(){return[(0,r.Wm)(a,{"is-open":e.isOpen,onSwipeLeft:e.hide,onSwipeRight:e.hide,onClick:e.hide},null,8,["is-open","onSwipeLeft","onSwipeRight","onClick"])]})),_:1}))],34)}]]);var it=["aria-expanded"],st=n(6850);const at=(0,r.aZ)({name:"DocDropdown",props:{buttonClass:{type:String,default:""},align:{type:String,default:"left"},menuWidth:{type:String,default:"12rem"}},setup:function(e,t){var n=t.emit,o=(0,r.iH)(),i=(0,r.iH)(!1),s=(0,r.iH)(!1);return(0,r.YP)(i,(function(){var e=i.value?"open":"close";n(e)})),(0,st.w)((function(e){var t,n=e.target;o.value===n||(null===(t=o.value)||void 0===t?void 0:t.contains(n))||(i.value=!1)})),{isOpen:i,isFocused:s,onButtonClick:function(){i.value=!i.value},dropdown:o,hide:function(){i.value=!1}}}}),lt=(0,c.Z)(at,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("div",{ref:"dropdown",class:"relative",onKeydown:t[4]||(t[4]=(0,r.D2)((function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.hide&&e.hide.apply(e,t)}),["esc"]))},[(0,r._)("div",{class:(0,r.C_)(e.buttonClass),role:"button","aria-has-popup":"true","aria-expanded":e.isOpen,onFocus:t[0]||(t[0]=function(t){return e.isFocused=!0}),onBlur:t[1]||(t[1]=function(t){return e.isFocused=!1}),onClick:t[2]||(t[2]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onButtonClick&&e.onButtonClick.apply(e,t)})},[(0,r.WI)(e.$slots,"button-content",{isOpen:e.isOpen,isFocused:e.isFocused})],42,it),(0,r.Wm)(r.uT,{"enter-active-class":"transition duration-100 ease-out","enter-from-class":"-translate-y-2 opacity-30","enter-to-class":"translate-y-0 opacity-100","leave-active-class":"transition duration-75 ease-linear","leave-from-class":"translate-y-0 opacity-100","leave-to-class":"-translate-y-2 opacity-0"},{default:(0,r.w5)((function(){return[(0,r.wy)((0,r._)("div",{class:(0,r.C_)(["absolute z-30 py-2 mt-2 bg-white border border-gray-300 rounded shadow-lg dark:bg-dark-650 dark:border-dark-500","right"===e.align?"right-0":"left-0"]),style:(0,r.j5)({"min-width":e.menuWidth}),onClick:t[3]||(t[3]=(0,r.iM)((function(){}),["stop"]))},[(0,r.WI)(e.$slots,"default")],6),[[r.F8,e.isOpen]])]})),_:3})],544)}]]);var ct=["innerHTML"];const ut=(0,r.aZ)({name:"DocEmoji",props:{emoji:{type:String,required:!0}},setup:function(e){return{emojiHtml:(0,r.Fl)((function(){return"&#x".concat(e.emoji.replace(/-/g,"&#x"))}))}}}),dt=(0,c.Z)(ut,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("span",{class:"docs-emoji",innerHTML:e.emojiHtml},null,8,ct)}]]);var ft={class:"flex justify-between px-5 py-3 -mt-1 border-b border-gray-200 dark:border-dark-650"},ht={class:"flex text-sm text-gray-500 dark:text-dark-350"},pt=(0,r._)("span",null,"History",-1),mt={key:0,class:"flex flex-col items-center py-6"},vt=[(0,r._)("svg",{class:"mb-2",xmlns:"http://www.w3.org/2000/svg",width:"60",height:"60"},[(0,r._)("circle",{cx:"30",cy:"30",r:"30",fill:"#e1edff"}),(0,r._)("path",{d:"M36.5 20.5h-2v-1c0-.55-.45-1-1-1s-1 .45-1 1v1h-6v-1c0-.55-.45-1-1-1s-1 .45-1 1v1h-2c-1.65 0-3 1.35-3 3v14c0 1.65 1.35 3 3 3h14c1.65 0 3-1.35 3-3v-14c0-1.65-1.35-3-3-3zm-14 2h2v1c0 .55.45 1 1 1s1-.45 1-1v-1h6v1c0 .55.45 1 1 1s1-.45 1-1v-1h2c.55 0 1 .45 1 1v3h-16v-3c0-.55.45-1 1-1zm14 16h-14c-.55 0-1-.45-1-1v-9h16v9c0 .55-.45 1-1 1z",fill:"#8dbbff"})],-1),(0,r._)("div",{class:"text-sm text-gray-500"},"No history items",-1)],gt={key:1,class:"mt-2"},bt=["href","onClick"],yt={class:"flex"},wt=["textContent"],xt={class:"invisible ml-5 text-xs text-gray-600 group-hover:visible dark:text-dark-350"},kt=n(9984),St=n.n(kt);function Et(){var e=(0,r.iH)(null);return(0,r.bv)((function(){e.value=window.__DOCS__})),{pageData:e}}function Ct(e){var t={};return""===e||"?"===e||(e=e.trim().replace(/^(\?|#|&)/,"")).split("&").forEach((function(e){var n=e.split("="),r=n[0],o=n[1];r=decodeURIComponent(r);var i=null==o?null:decodeURIComponent(o);t[r]=i})),t}var _t=(0,r.iH)({path:"/"});function Tt(e,t){if("string"==typeof t)"push"===e?window.history.pushState(null,"",t):"replace"===e&&window.history.replaceState(null,"",t);else{if("object"!=typeof t)throw new Error("Invalid type. Expected a string or a Route object for new route location.");var n=t.path?t.path:window.location.href,r="";t.query&&(r=function(e){if(!Object.keys(e).length)return"";var t=[];return Object.keys(e).forEach((function(n){t.push("".concat(n,"=").concat(e[n]))})),"?"+t.join("&")}(t.query));var o="".concat(n).concat(r).concat(t.hash);"push"===e?window.history.pushState(null,"",o):"replace"===e&&window.history.replaceState(null,"",o)}_t.value={path:window.location.pathname?decodeURIComponent(window.location.pathname):"",query:Ct(window.location.search),hash:window.location.hash?decodeURIComponent(window.location.hash):""}}var Ot={replace:function(e){return Tt("replace",e)},push:function(e){return Tt("push",e)}};function Lt(){return _t.value.path=window.location.pathname?decodeURIComponent(window.location.pathname):"",_t.value.query=Ct(window.location.search),_t.value.hash=window.location.hash?decodeURIComponent(window.location.hash):"",(0,m.zX)(window,"turbo:visit",(function(){_t.value={path:window.location.pathname?decodeURIComponent(window.location.pathname):"",query:Ct(window.location.search),hash:window.location.hash?decodeURIComponent(window.location.hash):""}})),{route:_t,Router:Ot}}var Rt=n(4884),Dt=n.n(Rt);function At(e){var t=St().appendDocumentName?St().documentName:"";if(St().trailingSlash||t)return"".concat(e).concat(t);var n=e.slice(0,-1);return St().base.length>1&&n.endsWith(".")&&(n=n.length>1?"../"+n+St().base.slice(0,-1):".."+St().base.slice(0,-1)),n}function It(e,t){var n="/"+St().documentName,r=e;if(St().appendDocumentName?r.endsWith(n)||(r=r.endsWith("/")?r+St().documentName:r+n):r.endsWith(n)&&(r=r.slice(0,-n.length)),St().useRelativePaths&&"file:"===location.protocol.toLowerCase()){var o=null!=t?t:Dt()();if(o){var i=r.split("/");r=i.slice(-o.level-1).join("/")}}else r.startsWith(St().base)?r=r.slice(St().base.length):St().trailingSlash||St().appendDocumentName||r!==St().base.slice(0,-1)||(r="");return r}function Mt(){if(!St().useRelativePaths)return St().base;var e=Dt()();if(!e)return St().base;var t=e.level;return St().appendDocumentName||e.isRoot||(St().trailingSlash?location.pathname.endsWith("/"+St().documentName)||location.pathname.endsWith("/")||--t:(location.pathname.endsWith("/"+St().documentName)||location.pathname.endsWith("/"))&&++t),e.relativeBaseCache||(e.relativeBaseCache=t<=0?!e.isRoot||St().trailingSlash||location.pathname.endsWith("/"+St().documentName)||location.pathname.endsWith("/")?"./":"."+St().base:"../".repeat(t)),e.relativeBaseCache}var Ft=function(){return Ft=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},Ft.apply(this,arguments)};const Pt=(0,r.aZ)({name:"DocHistory",components:{DocDropdown:lt},setup:function(){var e=(0,r.iH)(),t=St().maxHistoryItems,n=(0,r.iH)([]),o=Et().pageData,i=Lt().route,a=Mt();function l(e){return e&&"/"!==e?a+e:At(a)}return(0,r.bv)((function(){var e;null==(e=(0,s.qn)(St().base,localStorage,"doc_history"))||("version"in e?n.value=e.items:(function(e){if(e.length){var t=o.value;if(t)for(var n=0,r=e;n<r.length;n++){var i=r[n];i.path=It(i.path,t)}}}(e),n.value=e)),function(){var e=o.value;if(e){var r=It(i.value.path,e),a={title:e.title,path:r,timestamp:Date.now(),icon:"doc-icon-".concat(e.icon)};!function(e){var t=n.value.findIndex((function(t){return t.path===e.path}));t>-1&&n.value.splice(t,1)}(a),n.value.unshift(a),n.value.length>t&&n.value.pop();var l={version:1,items:n.value};(0,s.Nh)(St().base,localStorage,"doc_history",l)}}()})),{dropdown:e,history:n,clearHistory:function(){n.value=[],(0,s.Nh)(St().base,localStorage,"doc_history",[])},setTimeVisited:function(){n.value=n.value.map((function(e){return Ft(Ft({},e),{timeAgo:(0,s.Sy)(e.timestamp)})}))},onHistoryItemClick:function(t,n){(0,s.pI)(n)||(n.preventDefault(),(0,f.Vn)(l(t)),e.value.hide())},getFullPath:l}}}),Ht=(0,c.Z)(Pt,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-history"),l=(0,r.up)("doc-icon-button"),c=(0,r.up)("doc-icon"),u=(0,r.up)("doc-dropdown");return(0,r.wg)(),(0,r.j4)(u,{ref:"dropdown",style:{"margin-right":"-0.625rem"},align:"right","menu-width":"18rem",onOpen:e.setTimeVisited},{"button-content":(0,r.w5)((function(){var t;return[(0,r.Wm)(l,{class:(0,r.C_)([{"bg-gray-300 dark:bg-dark-450":null===(t=e.dropdown)||void 0===t?void 0:t.isOpen},"w-10 h-10 -mb-0.5"]),"icon-size":"22"},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1},8,["class"])]})),default:(0,r.w5)((function(){return[(0,r._)("div",ft,[(0,r._)("div",ht,[(0,r.Wm)(c,{width:"15",height:"15",class:"mr-3 mt-0.75"},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1}),pt]),(0,r._)("button",{class:"text-xs text-blue-500 dark:text-blue-400 focus:outline-none hover:text-blue-900 dark:hover:text-blue-200",onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.clearHistory&&e.clearHistory.apply(e,t)})}," Clear ")]),e.history.length?((0,r.wg)(),(0,r.iD)("ul",gt,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.history,(function(t){return(0,r.wg)(),(0,r.iD)("li",{key:t.timestamp},[(0,r._)("a",{class:"flex justify-between px-5 py-1.5 text-sm whitespace-nowrap group hover:bg-gray-200 dark:hover:bg-dark-500",href:e.getFullPath(t.path),onClick:function(n){return e.onHistoryItemClick(t.path,n)}},[(0,r._)("span",yt,[(0,r.Wm)(c,{class:"mr-3 mt-0.75",width:"15",height:"15"},{default:(0,r.w5)((function(){return[((0,r.wg)(),(0,r.j4)((0,r.LL)(t.icon)))]})),_:2},1024),(0,r._)("span",{textContent:(0,r.zw)(t.title)},null,8,wt)]),(0,r._)("span",xt,(0,r.zw)(t.timeAgo),1)],8,bt)])})),128))])):((0,r.wg)(),(0,r.iD)("div",mt,vt))]})),_:1},8,["onOpen"])}]]);var Nt=["width","height"],jt=["fill"];const Wt=(0,r.aZ)({name:"DocIcon",props:{width:{type:[Number,String],default:16},height:{type:[Number,String],default:16},iconColor:{type:String,default:"currentColor"}}}),Bt=(0,c.Z)(Wt,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("svg",{xmlns:"http://www.w3.org/2000/svg",class:"mb-px",width:e.width,height:e.height,viewBox:"0 0 24 24",role:"presentation"},[(0,r._)("g",{fill:e.iconColor},[(0,r.WI)(e.$slots,"default")],8,jt)],8,Nt)}]]),zt=(0,r.aZ)({name:"DocIconButton",props:{iconSize:{type:[Number,String],default:16},rounded:{type:Boolean,default:!0}},setup:function(){var e=(0,r.iH)();return{button:e,onClick:function(){var t;null===(t=e.value)||void 0===t||t.blur()}}}}),Vt=(0,c.Z)(zt,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon");return(0,r.wg)(),(0,r.iD)("button",{ref:"button",class:(0,r.C_)(["flex items-center justify-center shrink-0 overflow-hidden transition-colors duration-200 ease-in hover:bg-gray-200 focus:outline-none focus:bg-gray-300 dark:text-white dark:hover:bg-dark-500 dark:focus:bg-dark-450",e.rounded?"rounded-full":"rounded"]),onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onClick&&e.onClick.apply(e,t)})},[(0,r.Wm)(a,{class:"shrink-0",style:{"margin-bottom":"0"},width:e.iconSize,height:e.iconSize},{default:(0,r.w5)((function(){return[(0,r.WI)(e.$slots,"default")]})),_:3},8,["width","height"])],2)}]]),qt=(0,r.aZ)({name:"LoadingSpinner",props:{size:{type:Number,default:20}},setup:function(e){return{styles:(0,r.Fl)((function(){return{width:"".concat(e.size,"px"),height:"".concat(e.size,"px"),borderWidth:"".concat(Math.round(e.size/8),"px")}}))}}}),$t=(0,c.Z)(qt,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("div",{class:"spinner inline-block rounded-full border-gray-400 dark:border-dark-450 border-solid animate-spin",style:(0,r.j5)(e.styles)},null,4)}],["__scopeId","data-v-79806448"]]);var Ut={ref:"memberRef",class:"relative pluggable"},Zt={class:"relative z-10 px-5 pb-5"},Yt={class:"absolute inset-0 transition-all duration-200 ease-linear z-5",style:{margin:"-1px"}},Gt=[(0,r._)("div",{class:"absolute inset-0 bg-blue-200 bg-opacity-25 border border-blue-300 dark:bg-dark-550 dark:border-dark-600"},null,-1)],Jt=Symbol("DocsGroupId"),Kt=Symbol("DocsOverloadId");function Xt(e){var t=(0,a.oR)().store,n=(0,r.f3)(Jt),o=(0,r.Fl)((function(){return Object.values(t.state.memberGroups[n]).filter((function(n){return function(e,t,n){var r=e.overloadId===n,o=e.access.split(",").map((function(e){return e.trim()})).every((function(e){var n;return null===(n=t.state.access)||void 0===n?void 0:n.includes(e)})),i=!e.isInherited||e.isInherited===t.state.inherited;return r&&o&&i}(n,t,e)}))}));return{members:o}}var Qt={class:"flex justify-between h-16 px-5"},en={class:"flex items-center truncate"},tn={ref:"memberName",class:"flex items-center group"},nn={class:"font-mono text-sm truncate whitespace-nowrap dark:text-dark-350"},rn={key:0,class:"ml-2"},on={key:1,class:"ml-2 text-gray-600 dark:text-dark-350"},sn={key:2},an={key:3,class:"ml-1"},ln={key:0,class:"flex items-center h-6 px-2 ml-3 text-xs leading-none whitespace-nowrap border border-gray-400 rounded dark:border-dark-650"},cn={class:"flex"},un={class:"z-10 inline-flex bg-white border border-gray-300 rounded shadow-sm dark:bg-dark-650 dark:border-dark-650",style:{padding:"2px"}};const dn=(0,r.aZ)({name:"DocMemberToolbar",components:{DocCopyButton:Ve},props:{id:String,name:String},setup:function(e){return{buttons:(0,r.Fl)((function(){var t=window.location,n=t.origin,r=t.pathname,o="".concat(n).concat(r,"#").concat(e.id);return[{id:1,copyText:e.name,tooltipText:"Copy name",icon:"DocIconCopy"},{id:2,copyText:o,tooltipText:"Copy link",icon:"DocIconLink"}]}))}}}),fn=(0,c.Z)(dn,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon"),l=(0,r.up)("doc-copy-button");return(0,r.wg)(),(0,r.iD)("div",un,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.buttons,(function(e){return(0,r.wg)(),(0,r.j4)(l,{key:e.id,"copy-text":e.copyText,"tooltip-text":e.tooltipText,"button-class":"w-7 h-7 hover:bg-gray-200 focus:bg-gray-300 dark:hover:bg-dark-500",onClick:t[0]||(t[0]=(0,r.iM)((function(){}),["stop"]))},{default:(0,r.w5)((function(){return[(0,r.Wm)(a,null,{default:(0,r.w5)((function(){return[((0,r.wg)(),(0,r.j4)((0,r.LL)(e.icon)))]})),_:2},1024)]})),_:2},1032,["copy-text","tooltip-text"])})),128))])}]]);var hn={class:"flex items-center"};const pn=(0,r.aZ)({name:"DocMemberAccessBadges",props:{access:{type:Array}},setup:function(e){return{badges:(0,r.Fl)((function(){var t;return null===(t=e.access)||void 0===t?void 0:t.filter((function(e){return"public"!==e}))}))}}}),mn=(0,c.Z)(pn,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-badge");return(0,r.wg)(),(0,r.iD)("div",hn,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.badges,(function(e,t){return(0,r.wg)(),(0,r.j4)(a,{key:t,class:"ml-3",type:e},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(e),1)]})),_:2},1032,["type"])})),128))])}]]),vn=(0,r.aZ)({name:"DocMemberTitle",components:{DocMemberToolbar:fn,DocMemberAccessBadges:mn},props:{isVisible:{type:Boolean,required:!0,default:!1},isIntersecting:Boolean,isWindowScrolling:Boolean,id:String,name:String,overloadId:String,type:String,params:String,returns:String,memberAccess:Array},setup:function(e){var t,n,o=(0,r.Fl)((function(){return e.overloadId?Xt(e.overloadId).members.value.length-1:0})),i=(0,r.Fl)((function(){return e.type&&e.type.split(",").join(" | ")})),s=(0,r.Fl)((function(){return e.params?"(".concat(e.params.trim(),")"):""})),a=(0,r.Fl)((function(){return e.returns&&e.returns.split(",").join(" | ")})),l=(t=(0,r.iH)(),n=(0,r.iH)({}),(0,r.bv)((function(){var e,r=null===(e=t.value)||void 0===e?void 0:e.querySelector("h3");setTimeout((function(){var e=r?"".concat(r.clientWidth,"px"):"0";n.value={width:e,minWidth:"3.75rem",height:"2.625rem"}}),1e3)})),{memberName:t,hoverTriggerStyles:n});return{overloadCount:o,memberType:i,memberParams:s,memberReturnType:a,memberName:l.memberName,hoverTriggerStyles:l.hoverTriggerStyles}}}),gn=(0,c.Z)(vn,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-member-toolbar"),l=(0,r.up)("doc-member-access-badges");return(0,r.wg)(),(0,r.iD)("div",Qt,[(0,r._)("div",en,[(0,r._)("div",tn,[(0,r.WI)(e.$slots,"default"),e.isIntersecting&&!e.isWindowScrolling?((0,r.wg)(),(0,r.iD)("div",{key:0,class:"absolute top-0 rounded-br-full",style:(0,r.j5)(e.hoverTriggerStyles)},[(0,r.Wm)(a,{id:e.id,class:"absolute top-0 left-0 hidden -mt-5 group-hover:inline-flex",name:e.name},null,8,["id","name"])],4)):(0,r.kq)("",!0)],512),(0,r._)("div",nn,[e.memberType?((0,r.wg)(),(0,r.iD)("span",rn,": "+(0,r.zw)(e.memberType),1)):(0,r.kq)("",!0),e.memberParams?((0,r.wg)(),(0,r.iD)("span",on,(0,r.zw)(e.memberParams),1)):(0,r.kq)("",!0),e.memberReturnType?((0,r.wg)(),(0,r.iD)("span",sn,":")):(0,r.kq)("",!0),e.memberReturnType?((0,r.wg)(),(0,r.iD)("span",an,(0,r.zw)(e.memberReturnType),1)):(0,r.kq)("",!0)]),e.overloadCount?((0,r.wg)(),(0,r.iD)("div",ln," +"+(0,r.zw)(e.overloadCount)+" more ",1)):(0,r.kq)("",!0)]),(0,r._)("div",cn,[(0,r.Wm)(l,{access:e.memberAccess},null,8,["access"])])])}]]);var bn={class:"mb-5"},yn=(0,r._)("span",{class:"relative z-10 px-2 mb-2 ml-2 text-sm text-gray-600 uppercase bg-white rounded dark:bg-dark-850 dark:text-dark-350"}," Overloads ",-1),wn={class:"max-h-60 pt-4 pb-2 -mt-3.5 mb-6 overflow-x-hidden overflow-y-auto border border-gray-200 rounded dark:border-dark-650"},xn={class:"pl-0"},kn=["onClick"],Sn={class:"font-mono text-sm truncate whitespace-nowrap"};const En=(0,r.aZ)({name:"DocOverloadSelect",components:{DocMemberAccessBadges:mn},setup:function(){var e=Xt((0,r.f3)(Kt)).members;return{members:e,memberLabel:function(e){var t=e.name;return(t+=e.params?" (".concat(e.params,")"):" ()")+(e.returns?": ".concat(e.returns):"")},memberAccess:function(e){return e.access?e.access.split(",").map((function(e){return e.trim()})):[]},memberClasses:function(e){var t="boolean"==typeof e.overloadVisibility&&e.overloadVisibility;return{"bg-blue-100 text-blue-600 font-semibold dark:bg-dark-550 dark:bg-opacity-50":t,"hover:bg-gray-200 dark:hover:bg-dark-500 dark:hover:bg-opacity-50":!t}},onMemberClick:function(t){e.value.forEach((function(e){e.overloadVisibility=e.isOpen=e.id===t.id,function(e){e.animations=!1,setTimeout((function(){e.animations=!0}),100)}(e)}))}}}}),Cn=(0,c.Z)(En,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-member-access-badges");return(0,r.wy)(((0,r.wg)(),(0,r.iD)("div",bn,[yn,(0,r._)("div",wn,[(0,r._)("ul",xn,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.members,(function(t){return(0,r.wg)(),(0,r.iD)("li",{key:t.id,class:(0,r.C_)(["flex px-4 py-1 list-none transition-colors duration-150 ease-linear cursor-pointer",e.memberClasses(t)]),onClick:function(n){return e.onMemberClick(t)}},[(0,r._)("div",Sn,(0,r.zw)(e.memberLabel(t)),1),(0,r.Wm)(a,{class:"ml-auto",access:e.memberAccess(t)},null,8,["access"])],10,kn)})),128))])])],512)),[[r.F8,e.members.length>1]])}]]);var _n=(0,r._)("div",{class:"mb-2 text-sm text-gray-600 dark:text-dark-350 uppercase"}," Signature ",-1),Tn={class:"codeblock-wrapper"},On={class:"member-signature language-csharp m-0 px-5 py-4 text-dark-300 text-xs"},Ln={class:"member-signature language-csharp"};const Rn=(0,r.aZ)({name:"DocMemberSignature",props:{signature:String}}),Dn=(0,c.Z)(Rn,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-codeblock");return(0,r.wg)(),(0,r.iD)("div",null,[_n,(0,r._)("div",Tn,[(0,r.Wm)(a,null,{default:(0,r.w5)((function(){return[(0,r._)("pre",On,[(0,r._)("code",Ln,(0,r.zw)(e.signature),1)])]})),_:1})])])}]]);function An(e,t){var n=Object.assign({},{root:null,rootMargin:"0px",threshold:0},t),o=(0,r.iH)(),i=(0,r.iH)([]),s=(0,r.Fl)((function(){return void 0!==e.value&&null!==e.value&&i.value.length>0&&i.value.every((function(e){return e.isIntersecting}))})),a=function(e){i.value=e};return(0,r.bv)((function(){e.value&&(o.value=new IntersectionObserver(a,n),o.value.observe(e.value))})),(0,r.Jd)((function(){var e;null===(e=o.value)||void 0===e||e.disconnect()})),{isIntersecting:s,elements:i}}function In(e,t,n){var o=(0,r.iH)(!1),i=(0,r.Fl)((function(){return n.state.scrolledElementId})),s=(0,r.Fl)((function(){return n.state.isWindowScrolling}));return(0,r.YP)(s,(function(t){t||e===i.value&&(o.value=!0,setTimeout((function(){o.value=!1}),1e3),n.actions.updateScrolledElementId(""))}),{immediate:!0}),{isHighlighted:o}}const Mn=(0,r.aZ)({name:"DocMember",components:{DocAnchorTarget:u,DocCollapse:Ke,DocMemberTitle:gn,DocOverloadSelect:Cn,DocMemberSignature:Dn},props:{id:{type:String,required:!0},name:{type:String,required:!0},isInherited:{type:Boolean,default:!1},access:{type:String,default:"public"},overloadId:String,type:String,params:String,returns:String,signature:String},setup:function(e){var t=(0,r.iH)(),n=(0,a.oR)().store,o=(0,r.f3)(Jt),i=(0,r.Fl)((function(){return n.state.memberGroups[o][e.id].animations}));!function(e,t,n){Object.keys(n).forEach((function(r){r&&e.actions.setMemberData(t,n.id,r,n[r])}))}(n,o,e);var s=function(e,t,n){var o=(0,r.Fl)((function(){var r,o=null===(r=n.state.memberGroups[t][e.id])||void 0===r?void 0:r.isVisible;return void 0===typeof o||o})),i=(0,r.Fl)((function(){return e.access.split(",").map((function(e){return e.trim()}))})),s=(0,r.Fl)((function(){var r=!e.overloadId||n.state.memberGroups[t][e.id].overloadVisibility,o=i.value.every((function(e){var t;return null===(t=n.state.access)||void 0===t?void 0:t.includes(e)})),s=!e.isInherited||e.isInherited===n.state.inherited,a=e.name.toLowerCase().includes(n.state.memberFilter.toLowerCase());return r&&o&&s&&a}));return(0,r.YP)(s,(function(r){n.actions.setMemberData(t,e.id,"isVisible",r)}),{immediate:!0}),{isVisible:o,memberAccess:i}}(e,o,n),l=s.isVisible,c=s.memberAccess,u=function(e,t,n,o){var i=(0,r.Fl)({get:function(){var r=n.state.memberGroups[t];return!(!r||!r[e])&&r[e].isOpen},set:function(r){n.actions.setMemberData(t,e,"isOpen",r)}}),s=(0,r.Fl)((function(){return n.state.scrolledElementId}));return(0,r.YP)(s,(function(r){e===r&&n.actions.setMemberData(t,e,"isOpen",!0)})),(0,r.YP)(i,(function(e){if(e){var t=o.value;t&&t.classList.contains("pluggable")&&(0,r.Y3)((function(){t.dispatchEvent(new Event("onPluginReady"))}))}})),{isOpen:i}}(e.id,o,n,t).isOpen;return{isOpen:u,isVisible:l,animations:i,memberAccess:c,isHighlighted:In(e.id,0,n).isHighlighted,memberRef:t,isIntersecting:An(t).isIntersecting,isWindowScrolling:(0,r.Fl)((function(){return n.state.isWindowScrolling}))}}}),Fn=(0,c.Z)(Mn,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-anchor-target"),l=(0,r.up)("doc-member-title"),c=(0,r.up)("doc-overload-select"),u=(0,r.up)("doc-member-signature"),d=(0,r.up)("doc-collapse");return(0,r.wg)(),(0,r.iD)("div",Ut,[(0,r.Wm)(a,{id:e.id,class:"absolute top-5 left-0 right-0 bottom-0",style:{"z-index":"-1"}},null,8,["id"]),(0,r.wy)((0,r.Wm)(d,{modelValue:e.isOpen,"onUpdate:modelValue":t[1]||(t[1]=function(t){return e.isOpen=t}),class:"relative -mt-px border dark:border-dark-650 doc-member",animations:e.animations},{trigger:(0,r.w5)((function(){return[(0,r.Wm)(l,{id:e.id,class:"relative z-10",name:e.name,"overload-id":e.overloadId,type:e.type,params:e.params,returns:e.returns,"member-access":e.memberAccess,"is-visible":e.isVisible,"is-intersecting":e.isIntersecting,"is-window-scrolling":e.isWindowScrolling},{default:(0,r.w5)((function(){return[(0,r.WI)(e.$slots,"name")]})),_:3},8,["id","name","overload-id","type","params","returns","member-access","is-visible","is-intersecting","is-window-scrolling"])]})),footer:(0,r.w5)((function(){return[e.isIntersecting?((0,r.wg)(),(0,r.j4)(r.uT,{key:0,"enter-from-class":"opacity-0","enter-to-class":"opacity-100","leave-from-class":"opacity-100","leave-to-class":"opacity-0"},{default:(0,r.w5)((function(){return[(0,r.wy)((0,r._)("div",Yt,Gt,512),[[r.F8,e.isHighlighted]])]})),_:1})):(0,r.kq)("",!0)]})),default:(0,r.w5)((function(){return[(0,r._)("div",Zt,[e.isOpen?((0,r.wg)(),(0,r.iD)(r.HY,{key:0},[e.overloadId?((0,r.wg)(),(0,r.j4)(c,{key:0})):(0,r.kq)("",!0),(0,r.WI)(e.$slots,"default"),t[0]||((0,r.qZ)(-1),t[0]=e.signature?((0,r.wg)(),(0,r.j4)(u,{key:1,class:"mb-5",signature:e.signature},null,8,["signature"])):(0,r.kq)("",!0),(0,r.qZ)(1),t[0]),(0,r.WI)(e.$slots,"parameters")],64)):(0,r.kq)("",!0)])]})),_:3},8,["modelValue","animations"]),[[r.F8,e.isVisible]])],512)}]]);var Pn={class:"mb-6 doc-member-group"},Hn={key:0,class:"flex items-center justify-between"},Nn={class:"group"},jn=(0,r.Uk)(" # ");const Wn=(0,r.aZ)({name:"MemberGroup",props:{id:{type:String,required:!0}},setup:function(e){(0,r.JJ)(Jt,e.id);var t=(0,a.oR)().store;return{visibleMemberCount:(0,r.Fl)((function(){return t.getters.getVisibleGroupMembers(e.id).length}))}}}),Bn=(0,c.Z)(Wn,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-anchor-trigger"),l=(0,r.up)("doc-anchor-target");return(0,r.wg)(),(0,r.iD)("div",Pn,[e.visibleMemberCount>0?((0,r.wg)(),(0,r.iD)("div",Hn,[(0,r.Wm)(l,{id:e.id},{default:(0,r.w5)((function(){return[(0,r._)("h2",Nn,[(0,r.Wm)(a,{class:"float-left mt-2 -ml-6 text-lg font-normal text-blue-500 opacity-0 group-hover:opacity-100",to:"#".concat(e.id)},{default:(0,r.w5)((function(){return[jn]})),_:1},8,["to"]),(0,r.WI)(e.$slots,"title")])]})),_:3},8,["id"])])):(0,r.kq)("",!0),(0,r.WI)(e.$slots,"default")])}]]),zn=(0,r.aZ)({name:"DocOverloadGroup",props:{overloadId:{type:String,required:!0}},setup:function(e){(0,r.JJ)(Kt,e.overloadId);var t=Lt().route,n=Xt(e.overloadId).members;(0,r.m0)((function(){n.value.forEach((function(e,r){e.overloadVisibility=0===r,t.value.hash==="#".concat(e.id)&&0!==r&&(n.value[0].overloadVisibility=!1,e.overloadVisibility=!0)}))}))}}),Vn=(0,c.Z)(zn,[["render",function(e,t,n,o,i,s){return(0,r.WI)(e.$slots,"default")}]]);var qn=["href"],$n={class:"docs-panel-content px-5 pb-5"};const Un=(0,r.aZ)({name:"DocPanel",props:{id:{type:String,required:!0},collapsed:{type:Boolean,default:!1}},setup:function(e){var t=(0,r.iH)(!e.collapsed),n=Lt().route;return(0,r.bv)((function(){n.value.hash&&n.value.hash==="#".concat(e.id)&&(t.value=!0)})),{isExpanded:t,onClick:function(e){(0,s.pI)(e)?e.stopPropagation():e.preventDefault()}}}}),Zn=(0,c.Z)(Un,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-chevron-right"),l=(0,r.up)("doc-icon"),c=(0,r.up)("doc-anchor-target"),u=(0,r.up)("doc-collapse");return(0,r.wg)(),(0,r.j4)(u,{modelValue:e.isExpanded,"onUpdate:modelValue":t[1]||(t[1]=function(t){return e.isExpanded=t}),"trigger-class":"relative py-4 pl-5 font-medium text-gray-900 pr-14 dark:text-white",class:"mb-6 border rounded-md dark:border-dark-650"},{trigger:(0,r.w5)((function(){return[(0,r.Wm)(c,{id:e.id},{default:(0,r.w5)((function(){return[(0,r._)("div",null,[(0,r.WI)(e.$slots,"title")]),(0,r._)("div",{class:(0,r.C_)(["absolute inline-flex items-center justify-center text-blue-500 transition duration-200 ease-out origin-center rounded-full w-7 h-7 right-3 top-4 hover:bg-gray-200 dark:hover:bg-dark-500 z-5",{"rotate-90":e.isExpanded}])},[(0,r.Wm)(l,{width:"22",height:"22"},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1})],2)]})),_:3},8,["id"]),(0,r._)("a",{href:"#".concat(e.id),class:"absolute inset-0",onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onClick&&e.onClick.apply(e,t)})},null,8,qn)]})),default:(0,r.w5)((function(){return[(0,r._)("div",$n,[(0,r.WI)(e.$slots,"default")])]})),_:3},8,["modelValue"])}]]),Yn=(0,r.aZ)({name:"DocPanels",setup:function(e,t){var n,o=t.slots,i=(null===(n=o.default)||void 0===n?void 0:n.call(o))||[],s=(0,r.Fl)((function(){return i.map((function(e){var t,n;return(0,r.h)(Zn,{id:null===(t=e.props)||void 0===t?void 0:t.id,collapsed:null===(n=e.props)||void 0===n?void 0:n.collapsed},{title:function(){var t;return null===(t=e.children)||void 0===t?void 0:t.title()},default:function(){var t;return null===(t=e.children)||void 0===t?void 0:t.default()}})}))}));return function(){return(0,r.h)("div",{class:"docs-panels mb-6 border rounded-md dark:border-dark-650"},s.value)}}});var Gn={class:"relative pl-4 mb-5"},Jn={class:"relative mb-1"},Kn=(0,r._)("span",{class:"absolute -ml-4"},"⚬",-1),Xn={class:"font-semibold"},Qn={key:0},er=(0,r._)("span",{class:"font-semibold"},":",-1),tr={key:0,class:"mx-1 text-sm"},nr={key:1,class:"text-sm text-gray-600"},rr={key:0,class:"text-sm"},or=(0,r._)("span",{class:"font-medium text-gray-900"},"Default value:",-1);const ir=(0,r.aZ)({name:"DocParamater",props:{name:{type:String,required:!0},type:{type:String,default:""},optional:{type:Boolean,default:!1},defaultValue:{type:String,default:""}}}),sr=(0,c.Z)(ir,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-badge");return(0,r.wg)(),(0,r.iD)("div",Gn,[(0,r._)("div",Jn,[Kn,(0,r._)("span",Xn,(0,r.zw)(e.name),1),e.type?((0,r.wg)(),(0,r.iD)("span",Qn,[er,(0,r.Wm)(a,{class:"ml-1"},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(e.type),1)]})),_:1}),e.optional?((0,r.wg)(),(0,r.iD)("span",tr,"•")):(0,r.kq)("",!0),e.optional?((0,r.wg)(),(0,r.iD)("span",nr,"optional")):(0,r.kq)("",!0)])):(0,r.kq)("",!0)]),(0,r.WI)(e.$slots,"default"),e.defaultValue?((0,r.wg)(),(0,r.iD)("div",rr,[(0,r._)("div",null,[or,(0,r.Wm)(a,{class:"ml-1"},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(e.defaultValue),1)]})),_:1})])])):(0,r.kq)("",!0)])}]]);var ar={class:"p-5 bg-gray-100 rounded parameters dark:bg-dark-800"},lr=(0,r._)("div",{class:"mb-4 text-sm text-gray-600 uppercase dark:text-dark-350"}," Parameters ",-1);const cr=(0,r.aZ)({name:"DocParameters"}),ur=(0,c.Z)(cr,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("div",ar,[lr,(0,r.WI)(e.$slots,"default")])}]]);var dr=n(8816),fr={class:"relative"},hr={class:"absolute flex items-center justify-center h-full pl-3"},pr=["placeholder"];const mr=(0,r.aZ)({name:"SearchInput",emits:["select"],setup:function(e,t){var n=t.emit,o=(0,r.f3)(dr.xf),i=(0,a.oR)().store,s=(0,r.Fl)({get:function(){return i.state.searchQuery},set:function(e){return i.actions.updateSearchQuery(e)}}),l=(0,r.iH)();return{input:l,focus:function(){var e;null===(e=l.value)||void 0===e||e.focus()},config:St(),query:s,search:o,onKeydown:function(e){"Enter"===e.code&&n("select"),null==o||o.onKeydown(e)},onFocus:function(){o&&(o.isFocused=!0,o.results.length&&(o.isOpen=!0))}}}}),vr=(0,c.Z)(mr,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-search"),l=(0,r.up)("doc-icon"),c=(0,r.up)("doc-icon-x"),u=(0,r.up)("doc-icon-button");return(0,r.wg)(),(0,r.iD)("div",fr,[(0,r._)("div",hr,[(0,r.Wm)(l,null,{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1})]),(0,r.wy)((0,r._)("input",{ref:"input","onUpdate:modelValue":t[0]||(t[0]=function(t){return e.query=t}),class:"w-full h-10 pl-8 leading-10 text-left text-gray-600 transition-colors duration-200 ease-in bg-gray-200 border border-transparent rounded sm:text-sm hover:bg-white hover:border-gray-300 focus:outline-none focus:border-gray-500 focus:bg-white dark:bg-dark-550 dark:border-dark-600 dark:hover:bg-dark-450 dark:focus:bg-dark-450 dark:focus:border-dark-450 dark:text-white placeholder-gray-400 dark:placeholder-dark-400",style:{padding:"0.625rem 0.75rem 0.625rem 2rem"},type:"text",autocomplete:"off",spellcheck:"false","aria-label":"Search",placeholder:e.config.search.placeholder,onFocus:t[1]||(t[1]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onFocus&&e.onFocus.apply(e,t)}),onKeydown:t[2]||(t[2]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onKeydown&&e.onKeydown.apply(e,t)})},null,40,pr),[[r.nr,e.query]]),e.query?((0,r.wg)(),(0,r.j4)(u,{key:0,ref:"closeBtn",class:"absolute top-0 right-0 w-6 h-6 mt-2 mr-2 hover:bg-gray-200",tabindex:"-1",onClick:(0,r.iM)(e.search.clear,["stop"])},{default:(0,r.w5)((function(){return[(0,r.Wm)(c)]})),_:1},8,["onClick"])):(0,r.kq)("",!0)])}]]);var gr=["href","onClick"],br={class:"w-full"},yr=["innerHTML"],wr=["innerHTML"],xr=["innerHTML"],kr={key:1,class:"text-sm px-5 py-4 mb-3"};const Sr=(0,r.aZ)({name:"DocSearchResults",props:{isMobile:Boolean},emits:["select"],setup:function(e,t){var n=t.emit,o=(0,r.iH)(),i=(0,r.f3)(dr.xf),a=Mt();function l(e){return e.startsWith("#")?At(a)+e:a+e}var c=St().search.noResultsFoundMsg;return(0,r.YP)((function(){return o.value}),(function(e){e&&new T.Z(e)})),{rootEl:o,searchApi:i,onResultClick:function(e,t){(0,s.pI)(t)||(t.preventDefault(),i.navigateToResult(l(e.path)),n("select"))},getFullPath:l,noResultsText:c}}}),Er=(0,c.Z)(Sr,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.j4)(r.uT,{"enter-active-class":"transition duration-300 ease-out overflow-hidden","enter-from-class":"-translate-y-2 opacity-0","enter-to-class":"translate-y-0 opacity-100","leave-active-class":"transition duration-100 ease-in overflow-hidden","leave-from-class":"translate-y-0 opacity-100","leave-to-class":"-translate-y-2 opacity-0"},{default:(0,r.w5)((function(){return[e.searchApi.isFocused&&e.searchApi.isOpen?((0,r.wg)(),(0,r.iD)("div",{key:0,ref:"rootEl",class:(0,r.C_)(["z-30 w-full overflow-y-auto rounded bg-white",e.isMobile?"dark:bg-dark-850":"dark:bg-dark-650 dark:border-dark-500"])},[(0,r._)("ul",null,[e.searchApi.results.length?((0,r.wg)(!0),(0,r.iD)(r.HY,{key:0},(0,r.Ko)(e.searchApi.results,(function(t,n){return(0,r.wg)(),(0,r.iD)("li",{key:t.id},[(0,r._)("a",{class:(0,r.C_)(["flex justify-between m-3 mt-0 py-4 px-4 rounded-md group hover:bg-gray-200 dark:hover:bg-dark-450 focus:outline-none overflow-x-clip",n===e.searchApi.focusIndex?"bg-gray-200 dark:bg-dark-450":"bg-gray-100 dark:bg-dark-550"]),href:e.getFullPath(t.path),tabindex:"-1",onClick:function(n){return e.onResultClick(t,n)}},[(0,r._)("div",br,[t.heading?((0,r.wg)(),(0,r.iD)("div",{key:0,class:"mb-2 font-semibold text-gray-900 dark:text-white",innerHTML:t.heading},null,8,yr)):(0,r.kq)("",!0),(0,r._)("div",{class:"text-sm",innerHTML:t.text},null,8,wr),(0,r._)("div",{class:"mt-2 text-xs font-medium text-gray-900 dark:text-white break-words",innerHTML:t.page},null,8,xr)])],10,gr)])})),128)):((0,r.wg)(),(0,r.iD)("li",kr,(0,r.zw)(e.noResultsText),1))])],2)):(0,r.kq)("",!0)]})),_:1})}]]),Cr=(0,r.aZ)({name:"DocSearchDesktop",components:{DocSearchInput:vr,DocSearchResults:Er},setup:function(){var e=(0,r.iH)(),t=(0,dr.Rx)(e);(0,r.JJ)(dr.xf,t);var n=(0,r.iH)();return(0,m.zX)(window,"keydown",(function(e){var t,r=e;r.target===document.body&&St().search.hotkeys.includes(r.key)&&(r.preventDefault(),null===(t=n.value)||void 0===t||t.focus())})),{rootEl:e,onRootClick:function(){var e;null===(e=t.input)||void 0===e||e.focus(),t.isFocused=!0},searchInput:n,searchApi:t}}}),_r=(0,c.Z)(Cr,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-search-input"),l=(0,r.up)("doc-search-results");return(0,r.wg)(),(0,r.iD)("div",{ref:"rootEl",class:(0,r.C_)(["absolute hidden transition-all duration-300 ease-out right-25 lg:flex lg:flex-col lg:ml-auto",e.searchApi.isFocused?"w-[42rem]":"w-40"]),onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onRootClick&&e.onRootClick.apply(e,t)}),onKeydown:t[1]||(t[1]=(0,r.D2)((function(t){return e.searchApi.isFocused=!1}),["tab"]))},[(0,r.Wm)(a,{ref:"searchInput",class:(0,r.C_)(["self-end transition-all duration-300 ease-out",e.searchApi.isFocused?"w-96":"w-40"])},null,8,["class"]),(0,r.Wm)(l,{class:"absolute max-h-[32rem] pt-3 mt-2 border flex border-gray-300 shadow-lg dark:border-dark-650"})],34)}]]);var Tr={ref:"searchRoot",class:"flex flex-col h-full"},Or={class:"flex items-center justify-between shrink-0 h-16 bg-white md:h-20 dark:bg-dark-850"},Lr=r.lR;const Rr=(0,r.aZ)({name:"DocSearchMobile",components:{Teleport:Lr,DocSearchInput:vr,DocSearchResults:Er},setup:function(){var e=(0,r.iH)(),t=(0,r.iH)(),n=(0,dr.Rx)(t);return(0,r.JJ)(dr.xf,n),{Teleport:Lr,docDrawer:e,searchRoot:t,show:function(){e.value.show()},onShown:function(){var e;null===(e=n.input)||void 0===e||e.focus()},onHidden:function(){var e;null===(e=n.input)||void 0===e||e.blur()},hideDrawer:function(){null==e||e.value.hide()},searchApi:n}}}),Dr=(0,c.Z)(Rr,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-search-input"),l=(0,r.up)("doc-icon-arrow-right"),c=(0,r.up)("doc-icon-button"),u=(0,r.up)("doc-search-results"),d=(0,r.up)("doc-icon-search"),f=(0,r.up)("doc-drawer");return(0,r.wg)(),(0,r.j4)(f,{ref:"docDrawer",class:"md:w-104","hide-event":["swipe-right","click"],onShown:e.onShown,onHidden:e.onHidden},{default:(0,r.w5)((function(){return[(0,r._)("div",Tr,[(0,r._)("div",Or,[(0,r.Wm)(a,{class:"ml-3 w-full",onSelect:e.hideDrawer},null,8,["onSelect"]),(0,r.Wm)(c,{class:"w-10 h-10 ml-3",style:{"margin-right":"0.875rem"},"icon-size":"22",onClick:e.hideDrawer},{default:(0,r.w5)((function(){return[(0,r.Wm)(l)]})),_:1},8,["onClick"])]),(0,r.Wm)(u,{class:"pb-6",style:{"max-height":"100%"},"is-mobile":!0,onSelect:e.hideDrawer},null,8,["onSelect"])],512),((0,r.wg)(),(0,r.j4)((0,r.LL)(e.Teleport),{to:"#docs-mobile-search-button"},{default:(0,r.w5)((function(){return[(0,r.Wm)(c,{class:"w-10 h-10 lg:hidden","icon-size":"20",onClick:(0,r.iM)(e.show,["stop"])},{default:(0,r.w5)((function(){return[(0,r.Wm)(d)]})),_:1},8,["onClick"])]})),_:1}))]})),_:1},8,["onShown","onHidden"])}]]);var Ar={class:"flex items-center shrink-0 h-16 px-6 -ml-6 bg-white border-b border-gray-200 md:hidden dark:bg-dark-800 dark:border-dark-650"},Ir={ref:"sidebarFooter"},Mr={key:0,ref:"sidebarLinksEl",class:"overflow-y-auto h-full"},Fr=n(1296),Pr=n.n(Fr);function Hr(e){return"object"==typeof e&&null!=e&&1===e.nodeType}function Nr(e,t){return(!t||"hidden"!==e)&&"visible"!==e&&"clip"!==e}function jr(e,t){if(e.clientHeight<e.scrollHeight||e.clientWidth<e.scrollWidth){var n=getComputedStyle(e,null);return Nr(n.overflowY,t)||Nr(n.overflowX,t)||function(e){var t=function(e){if(!e.ownerDocument||!e.ownerDocument.defaultView)return null;try{return e.ownerDocument.defaultView.frameElement}catch(e){return null}}(e);return!!t&&(t.clientHeight<e.scrollHeight||t.clientWidth<e.scrollWidth)}(e)}return!1}function Wr(e,t,n,r,o,i,s,a){return i<e&&s>t||i>e&&s<t?0:i<=e&&a<=n||s>=t&&a>=n?i-e-r:s>t&&a<n||i<e&&a>n?s-t+o:0}function Br(e,t){var n=window,r=t.scrollMode,o=t.block,i=t.inline,s=t.boundary,a=t.skipOverflowHiddenElements,l="function"==typeof s?s:function(e){return e!==s};if(!Hr(e))throw new TypeError("Invalid target");for(var c=document.scrollingElement||document.documentElement,u=[],d=e;Hr(d)&&l(d);){if((d=d.parentElement)===c){u.push(d);break}null!=d&&d===document.body&&jr(d)&&!jr(document.documentElement)||null!=d&&jr(d,a)&&u.push(d)}for(var f=n.visualViewport?n.visualViewport.width:innerWidth,h=n.visualViewport?n.visualViewport.height:innerHeight,p=window.scrollX||pageXOffset,m=window.scrollY||pageYOffset,v=e.getBoundingClientRect(),g=v.height,b=v.width,y=v.top,w=v.right,x=v.bottom,k=v.left,S="start"===o||"nearest"===o?y:"end"===o?x:y+g/2,E="center"===i?k+b/2:"end"===i?w:k,C=[],_=0;_<u.length;_++){var T=u[_],O=T.getBoundingClientRect(),L=O.height,R=O.width,D=O.top,A=O.right,I=O.bottom,M=O.left;if("if-needed"===r&&y>=0&&k>=0&&x<=h&&w<=f&&y>=D&&x<=I&&k>=M&&w<=A)return C;var F=getComputedStyle(T),P=parseInt(F.borderLeftWidth,10),H=parseInt(F.borderTopWidth,10),N=parseInt(F.borderRightWidth,10),j=parseInt(F.borderBottomWidth,10),W=0,B=0,z="offsetWidth"in T?T.offsetWidth-T.clientWidth-P-N:0,V="offsetHeight"in T?T.offsetHeight-T.clientHeight-H-j:0;if(c===T)W="start"===o?S:"end"===o?S-h:"nearest"===o?Wr(m,m+h,h,H,j,m+S,m+S+g,g):S-h/2,B="start"===i?E:"center"===i?E-f/2:"end"===i?E-f:Wr(p,p+f,f,P,N,p+E,p+E+b,b),W=Math.max(0,W+m),B=Math.max(0,B+p);else{W="start"===o?S-D-H:"end"===o?S-I+j+V:"nearest"===o?Wr(D,I,L,H,j+V,S,S+g,g):S-(D+L/2)+V/2,B="start"===i?E-M-P:"center"===i?E-(M+R/2)+z/2:"end"===i?E-A+N+z:Wr(M,A,R,P,N+z,E,E+b,b);var q=T.scrollLeft,$=T.scrollTop;S+=$-(W=Math.max(0,Math.min($+W,T.scrollHeight-L+V))),E+=q-(B=Math.max(0,Math.min(q+B,T.scrollWidth-R+z)))}C.push({el:T,top:W,left:B})}return C}function zr(e){return e===Object(e)&&0!==Object.keys(e).length}var Vr=["href"],qr={class:"flex shrink-0 items-center justify-center w-6 h-6 mr-2"},$r=["innerHTML"],Ur=["src"],Zr=["textContent"],Yr={key:1,class:"absolute right-0 h-full bg-blue-500 dark:bg-blue-400 w-px"},Gr={class:"ml-4 transition-all duration-200 ease-out"},Jr=n(2376),Kr=n(2110),Xr=function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function s(e){try{l(r.next(e))}catch(e){i(e)}}function a(e){try{l(r.throw(e))}catch(e){i(e)}}function l(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}l((r=r.apply(e,t||[])).next())}))},Qr=function(e,t){var n,r,o,i,s={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function a(i){return function(a){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;s;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return s.label++,{value:i[1],done:!1};case 5:s.label++,r=i[1],i=[0];continue;case 7:i=s.ops.pop(),s.trys.pop();continue;default:if(!((o=(o=s.trys).length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){s=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){s.label=i[1];break}if(6===i[0]&&s.label<o[1]){s.label=o[1],o=i;break}if(o&&s.label<o[2]){s.label=o[2],s.ops.push(i);break}o[2]&&s.ops.pop(),s.trys.pop();continue}i=t.call(e,s)}catch(e){i=[6,e],r=0}finally{n=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,a])}}};const eo=(0,r.aZ)({name:"DocSidebarLink",props:{item:{type:Object,required:!0},depth:{type:Number,default:0},isFiltered:{type:Boolean,default:!1,required:!0}},setup:function(e){var t=(0,r.iH)(),n=(0,r.Fl)((function(){return e.item.children&&e.item.children.length>0||e.item.hash})),o=(0,r.Fl)((function(){return!(!e.item.icon&&!e.item.emoji)})),i=function(){if(!St().useRelativePaths)return"/";var e=Dt()();if(!e)return"/";var t=e.level;return St().appendDocumentName||e.isRoot||(St().trailingSlash?location.pathname.endsWith("/"+St().documentName)||location.pathname.endsWith("/")||--t:(location.pathname.endsWith("/"+St().documentName)||location.pathname.endsWith("/"))&&++t),e.relativeRootCache||(e.relativeRootCache=t<=0?!e.isRoot||St().trailingSlash||location.pathname.endsWith("/"+St().documentName)||location.pathname.endsWith("/")?"./":"."+St().base:"../".repeat(t)),e.relativeRootCache}(),l=Mt(),c=St().appendDocumentName?St().documentName:"",u=(0,r.Fl)((function(){return e.item.clickable?e.item.url?e.item.url.startsWith(St().base)?l+e.item.url.slice(St().base.length):e.item.url:e.item.path&&"/"!==e.item.path?!St().trailingSlash&&c&&e.item.path?"".concat(l).concat(e.item.path,"/").concat(c):"".concat(l).concat(e.item.path).concat(c):At(l):null})),d=(0,r.Fl)((function(){return e.item.icon&&!e.item.icon.startsWith("<")&&-1==e.item.icon.indexOf("://")?l+e.item.icon:e.item.icon})),f=Lt().route,h=(0,r.Fl)((function(){if(e.item.url)return!1;var t=i+It(f.value.path),n=u.value;return null!=n&&null!=t&&(n.length===t.length&&n===t||n.length===t.length+1&&"/"!==t[t.length-1]&&"/"===n[n.length-1]&&n.startsWith(t)||n.length+1===t.length&&"/"===t[t.length-1]&&"/"!==n[n.length-1]&&t.startsWith(n))})),p=(0,a.oR)().store,m=(0,r.Fl)((function(){return p.state.sidebarLookup})),v=m.value.get(e.item.path);(e.isFiltered||e.item.open)&&E();var g=(0,Jr.i)(),b=g.result,y=g.error,w=g.loading,x=g.execute,k="".concat(location.origin).concat(Kr.as);function S(){return Xr(this,void 0,void 0,(function(){return Qr(this,(function(t){switch(t.label){case 0:return[4,x("".concat(k,"/").concat(e.item.hash,".json"))];case 1:if(t.sent(),y.value)throw new Error("Error fetching sidebar navigation items. ".concat(y.value));return(0,s.rw)(m.value,b.value,St().trailingSlash),[2]}}))}))}function E(t){var n;return Xr(this,void 0,void 0,(function(){var r;return Qr(this,(function(o){switch(o.label){case 0:return(r=t||v)?!e.item.hash||(null===(n=e.item.children)||void 0===n?void 0:n.length)?[3,2]:[4,S()]:[2];case 1:o.sent(),o.label=2;case 2:return p.actions.updateSidebarLookupItem(r,"expanded",!0),[2]}}))}))}function C(){v&&p.actions.updateSidebarLookupItem(v,"expanded",!1)}function _(){v&&v.expanded?C():E()}function T(){var t;h.value&&(n.value&&E(),null===(t=e.item.parentNodes)||void 0===t||t.forEach((function(e){E(m.value.get(e))})))}(0,r.YP)((function(){return e.isFiltered}),(function(e){e?E(v):(C(),T())}));var O=(0,r.iH)(!1);return(0,r.bv)((function(){h.value&&t.value&&p.actions.setActiveSidebarEl(t.value),T(),(0,r.Y3)((function(){O.value=!0}))})),{sidebarLinkRef:t,isGroup:n,hasCustomIcon:o,href:u,icon:d,isActive:h,onLinkClick:function(e){if(!(0,s.pI)(e)){if(h.value)e.preventDefault();else if((null==v?void 0:v.expanded)&&u.value)return;_()}},toggle:_,loading:w,transitionsEnabled:O,onEnter:function(e){O.value&&(e.style.height="0"),(0,r.Y3)((function(){e.style.height="".concat(e.scrollHeight,"px")}))},onAfterEnter:function(e){(0,r.Y3)((function(){e.style.height="auto"}))},onBeforeLeave:function(e){e.style.height="".concat(e.scrollHeight,"px")},onLeave:function(e){e.style.height="0px"}}}}),to=(0,c.Z)(eo,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon"),l=(0,r.up)("doc-emoji"),c=(0,r.up)("doc-icon-folder"),u=(0,r.up)("doc-loading-spinner"),d=(0,r.up)("doc-icon-chevron-right"),f=(0,r.up)("doc-sidebar-link");return(0,r.wg)(),(0,r.iD)("li",null,[(0,r._)("div",{class:(0,r.C_)(["relative flex items-center justify-between break-normal pl-3 pr-4 select-none rounded-l transition-colors ease-out duration-150",{"text-blue-500 dark:text-blue-400 bg-blue-100 dark:bg-dark-650 rounded-l":e.isActive,"text-gray-900 dark:text-dark-250 hover:text-blue-500 dark:hover:text-blue-400":!e.isActive}])},[(0,r._)("a",{ref:"sidebarLinkRef",class:"flex flex-1 items-center cursor-pointer",href:e.href,onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onLinkClick&&e.onLinkClick.apply(e,t)})},[(0,r._)("span",qr,[e.item.icon&&e.item.icon.startsWith("<")?((0,r.wg)(),(0,r.j4)(a,{key:0,class:"w-4.5 h-4.5"},{default:(0,r.w5)((function(){return[(0,r._)("g",{innerHTML:e.item.icon},null,8,$r)]})),_:1})):e.item.icon?((0,r.wg)(),(0,r.iD)("img",{key:1,src:e.icon,class:"w-4.5"},null,8,Ur)):e.item.emoji?((0,r.wg)(),(0,r.j4)(l,{key:2,emoji:e.item.emoji},null,8,["emoji"])):!e.item.icon&&0===e.depth&&e.isGroup?((0,r.wg)(),(0,r.j4)(a,{key:3,class:"w-4.5 h-4.5"},{default:(0,r.w5)((function(){return[(0,r.Wm)(c)]})),_:1})):(0,r.kq)("",!0)]),(0,r._)("span",{class:"text-sm py-1.5",textContent:(0,r.zw)(e.item.label)},null,8,Zr)],8,Vr),e.isGroup?((0,r.wg)(),(0,r.iD)("div",{key:0,class:(0,r.C_)(["flex items-center justify-center w-7 h-7 rounded-full transition-colors ease-linear duration-150 group shrink-0",{"hover:bg-blue-200 hover:bg-opacity-50":e.isActive&&!e.loading,"hover:bg-gray-200 dark:hover:bg-dark-500":!e.loading}])},[e.loading?((0,r.wg)(),(0,r.j4)(u,{key:0,size:16})):((0,r.wg)(),(0,r.iD)("button",{key:1,class:(0,r.C_)(["text-gray-400 dark:text-dark-400 group-hover:text-blue-500 dark:group-hover:text-blue-400 focus:outline-none",{"rotate-90":e.item.expanded,"transition-transform ease-out duration-200":e.transitionsEnabled}]),onClick:t[1]||(t[1]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.toggle&&e.toggle.apply(e,t)})},[(0,r.Wm)(a,{class:"w-5 h-5"},{default:(0,r.w5)((function(){return[(0,r.Wm)(d)]})),_:1})],2))],2)):(0,r.kq)("",!0),e.isActive?((0,r.wg)(),(0,r.iD)("span",Yr)):(0,r.kq)("",!0)],2),e.isGroup?((0,r.wg)(),(0,r.j4)(r.uT,{key:0,"enter-active-class":"overflow-hidden","leave-active-class":"overflow-hidden",onEnter:e.onEnter,onAfterEnter:e.onAfterEnter,onBeforeLeave:e.onBeforeLeave,onLeave:e.onLeave},{default:(0,r.w5)((function(){return[(0,r.wy)((0,r._)("ul",Gr,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.item.children,(function(t){return(0,r.wg)(),(0,r.j4)(f,{key:t.path,item:t,depth:e.depth+1,"is-filtered":e.isFiltered},null,8,["item","depth","is-filtered"])})),128))],512),[[r.F8,e.isGroup&&e.item.expanded]])]})),_:1},8,["onEnter","onAfterEnter","onBeforeLeave","onLeave"])):(0,r.kq)("",!0)])}]]),no=(0,r.aZ)({name:"DocSidebarLinks",components:{DocSidebarLink:to},props:{items:{type:Array,required:!0},isFiltered:{type:Boolean,required:!0}},setup:function(){var e=(0,r.iH)(),t=(0,r.iH)(),n=(0,r.iH)(0),o=(0,r.iH)(),i=(0,a.oR)().store,s=(0,r.Fl)((function(){return i.state.sidebarActiveEl})),l=An(s,{threshold:1}).elements,c=Pr()((function(){var e,r,o=(null===(e=t.value)||void 0===e?void 0:e.scrollTop)||0;i.state.sidebarScroll!==o&&(n.value=(null===(r=t.value)||void 0===r?void 0:r.scrollTop)||0,i.actions.setSidebarScroll(n.value))}),200);return(0,r.bv)((function(){var n,r;o.value=e.value&&new T.Z(e.value),t.value=null===(n=o.value)||void 0===n?void 0:n.getScrollElement(),null===(r=o.value)||void 0===r||r.getScrollElement().addEventListener("scroll",c),t.value&&(t.value.scrollTop=i.state.sidebarScroll),setTimeout((function(){!l.value.some((function(e){return e.isIntersecting}))&&s.value&&function(e,t){var n=e.isConnected||e.ownerDocument.documentElement.contains(e);if(zr(t)&&"function"==typeof t.behavior)return t.behavior(n?Br(e,t):[]);if(n){var r=function(e){return!1===e?{block:"end",inline:"nearest"}:zr(e)?e:{block:"start",inline:"nearest"}}(t);(function(e,t){void 0===t&&(t="auto");var n="scrollBehavior"in document.body.style;e.forEach((function(e){var r=e.el,o=e.top,i=e.left;r.scroll&&n?r.scroll({top:o,left:i,behavior:t}):(r.scrollTop=o,r.scrollLeft=i)}))})(Br(e,r),r.behavior)}}(s.value,{behavior:"smooth",block:"center",boundary:t.value})}),200)})),(0,r.Jd)((function(){var e;null===(e=t.value)||void 0===e||e.removeEventListener("scroll",c)})),{sidebarLinksEl:e}}}),ro=(0,c.Z)(no,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-sidebar-link");return e.items.length?((0,r.wg)(),(0,r.iD)("ul",Mr,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.items,(function(t){return(0,r.wg)(),(0,r.j4)(a,{key:t.path,item:t,"is-filtered":e.isFiltered},null,8,["item","is-filtered"])})),128))],512)):(0,r.kq)("",!0)}]]);var oo={class:"relative flex items-center w-full"},io=["value","placeholder"];const so=(0,r.aZ)({name:"DocSidebarFilter",props:{modelValue:String,isOpen:Boolean},emits:["update:modelValue"],setup:function(e,t){var n=t.emit,o=(0,r.iH)(),i=St().sidebarFilterPlaceholder||"Filter by title",s=Pr()((function(e){n("update:modelValue",e.target.value)}),200);return(0,r.YP)((function(){return e.isOpen}),(function(){var e;null===(e=o.value)||void 0===e||e.blur()})),{input:o,placeholder:i,clear:function(){var e;n("update:modelValue",""),null===(e=o.value)||void 0===e||e.focus()},onInput:s}}}),ao=(0,c.Z)(so,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-x"),l=(0,r.up)("doc-icon-button");return(0,r.wg)(),(0,r.iD)("div",null,[(0,r._)("div",oo,[(0,r._)("input",{ref:"input",value:e.modelValue,class:"w-full h-8 px-3 py-2 transition-colors duration-200 ease-linear bg-white border border-gray-200 rounded shadow-none md:text-sm focus:outline-none focus:border-gray-600 dark:bg-dark-550 dark:border-dark-600 dark:hover:bg-dark-450 dark:focus:border-dark-450 dark:focus:bg-dark-450 dark:hover:border-dark-450 dark:text-white placeholder-gray-400 dark:placeholder-dark-400",type:"text",placeholder:e.placeholder,onInput:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onInput&&e.onInput.apply(e,t)})},null,40,io),e.modelValue?((0,r.wg)(),(0,r.j4)(l,{key:0,ref:"closeBtn",class:"absolute top-0 right-0 w-6 h-6 mt-1 mr-1 text-gray-600 hover:text-gray-900",onClick:e.clear},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1},8,["onClick"])):(0,r.kq)("",!0)])])}]]);var lo=function(){return lo=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},lo.apply(this,arguments)},co=r.lR;const uo=(0,r.aZ)({name:"DocSidebar",components:{Teleport:co,DocSidebarLinks:ro,DocSidebarFilter:ao,DocOverlay:Qe},setup:function(){var e=(0,r.iH)(!1),t=(0,a.oR)().store,n=(0,r.iH)();!function(e){var t=(0,r.iH)();function n(){e.state.sidebarLookup.forEach((function(t){e.actions.updateSidebarLookupItem(t,"expanded",!1)})),e.actions.setSidebarScroll(0)}(0,r.bv)((function(){t.value=document.querySelector("#docs-site-logo"),t.value&&t.value.addEventListener("click",n)})),(0,r.Jd)((function(){var e;t.value&&(null===(e=t.value)||void 0===e||e.removeEventListener("click",n))}))}(t),function(e){var t=(0,r.Fl)((function(){return e.state.sidebarLookup}));e.state.initialPageLoad&&function(){if(e.state.sidebar.id&&e.state.sidebar.id===St().id)r=new Map,(o=function(e){e.forEach((function(e){e.children&&(r.set(e.path,e),o(e.children))}))})(e.state.sidebar.data),e.actions.setSidebarLookupData(r);else{var n=(0,s.am)(t.value,St().sidebar,St().trailingSlash);e.actions.setSidebarData({id:St().id,data:n})}var r,o}()}(t);var o=function(e){var t=(0,r.iH)(""),n=(0,r.iH)(!1),o=(0,r.Fl)((function(){return e.state.sidebar})),i=(0,r.Fl)((function(){var e=t.value.toLowerCase();return n.value=!!e,function(e){var t=function(n,r){if(!r.visible)return n;if(r.children){var o=r.children.reduce(t,[]);(o.length||r.clickable&&(!e||r.searchLabel.includes(e)))&&n.push(lo(lo({},r),{children:o}))}else e&&!r.searchLabel.includes(e)||n.push(r);return n};return o.value.data.reduce(t,[])}(e)}));return{query:t,isFiltered:n,filteredItems:i}}(t),i=o.query,l=o.isFiltered,c=o.filteredItems,u=tt(),d=u.enableBodyScroll,f=u.disableBodyScroll;return{Teleport:co,sidebarFooter:n,isOpen:e,show:function(){e.value=!0,f()},hide:function(){e.value=!1,d()},filteredItems:c,isFiltered:l,query:i,showSidebarFilter:St().showSidebarFilter}}}),fo=(0,c.Z)(uo,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-arrow-left"),l=(0,r.up)("doc-icon-button"),c=(0,r.up)("doc-sidebar-filter"),u=(0,r.up)("doc-sidebar-links"),d=(0,r.up)("doc-icon-menu"),f=(0,r.up)("doc-overlay");return(0,r.wg)(),(0,r.iD)("aside",{class:(0,r.C_)(["fixed top-0 z-40 flex flex-col shrink-0 w-4/5 duration-300 ease-in-out bg-gray-100 border-gray-200 sidebar md:top-20 sm:w-1/2 md:w-75 md:z-0 md:border-r md:h-screen md:sticky md:transition-transform dark:bg-dark-800 dark:border-dark-650",{"shadow-2xl md:shadow-none":e.isOpen}]),style:(0,r.j5)({transform:e.isOpen?"translateX(0)":""})},[(0,r._)("div",Ar,[(0,r.Wm)(l,{class:"w-10 h-10 ml-3.5 md:hidden","icon-size":"22",onClick:e.hide},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1},8,["onClick"]),e.showSidebarFilter?((0,r.wg)(),(0,r.j4)(c,{key:0,modelValue:e.query,"onUpdate:modelValue":t[0]||(t[0]=function(t){return e.query=t}),class:"w-full ml-0.5","is-open":e.isOpen},null,8,["modelValue","is-open"])):(0,r.kq)("",!0)]),e.showSidebarFilter?((0,r.wg)(),(0,r.j4)(c,{key:0,modelValue:e.query,"onUpdate:modelValue":t[1]||(t[1]=function(t){return e.query=t}),class:"absolute top-0 left-0 right-0 z-5 bg-gray-100 dark:bg-dark-800 h-16 px-6 hidden md:flex items-center","is-open":e.isOpen},null,8,["modelValue","is-open"])):(0,r.kq)("",!0),(0,r.Wm)(u,{class:"flex-1 pl-3 mt-4 md:mt-16 mb-4",items:e.filteredItems,"is-filtered":e.isFiltered},null,8,["items","is-filtered"]),(0,r._)("div",Ir,[(0,r.WI)(e.$slots,"sidebar-footer")],512),((0,r.wg)(),(0,r.j4)((0,r.LL)(e.Teleport),{to:"#docs-sidebar-toggle"},{default:(0,r.w5)((function(){return[(0,r.Wm)(l,{class:"w-10 h-10 ml-3.5 md:hidden","icon-size":"24",onClick:e.show},{default:(0,r.w5)((function(){return[(0,r.Wm)(d)]})),_:1},8,["onClick"])]})),_:1})),((0,r.wg)(),(0,r.j4)((0,r.LL)(e.Teleport),{to:"#docs-overlay-target"},{default:(0,r.w5)((function(){return[(0,r.Wm)(f,{"is-open":e.isOpen,onSwipeLeft:e.hide,onClick:e.hide},null,8,["is-open","onSwipeLeft","onClick"])]})),_:1}))],6)}]]);var ho={id:"docs-sidebar-right",ref:"content",class:"w-full h-full overflow-auto"},po={key:0,class:"flex items-center justify-between h-16 mb-4 border-b lg:border-none lg:h-auto dark:border-dark-650"},mo={class:"px-5 text-gray-500 dark:text-dark-400"};const vo=(0,r.aZ)({name:"DocSidebarRightToggle",emits:["click"]}),go=(0,c.Z)(vo,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-align-right"),l=(0,r.up)("doc-icon-button");return(0,r.wg)(),(0,r.j4)(l,{class:"w-10 h-10 -mr-2.5 md:-mr-12 bg-white dark:bg-dark-850 bg-opacity-80 dark:bg-opacity-80 text-gray-600 hover:text-gray-800 lg:hidden","icon-size":"20",onClick:t[0]||(t[0]=function(t){return e.$emit("click")})},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1})}]]);var bo={key:0},yo=n(9843);const wo=(0,r.aZ)({name:"DocToc",emits:["link-click"],setup:function(e,t){var n=t.emit,o=(0,r.iH)([]);!function(e){var t,n,o=-1,i=-1,a=document.getElementById("docs-content"),l=null!==(t=null==a?void 0:a.offsetTop)&&void 0!==t?t:24,c=(0,s.vE)();function u(){var t=e.value;if(t&&t.length){var n=(document.documentElement.scrollTop||document.body.scrollTop)+l,r=function(e,t,n){var r=0,o=n.length-1;if(t>=r&&t<=o)if(e>=n[t].el.offsetTop){if(r=t+1,t===o||e<n[r].el.offsetTop)return t}else if(o=t-1,t>0&&e>=n[o].el.offsetTop)return o;for(;r<=o;){var i=o+r>>1,s=e-n[i].el.offsetTop;if(s>0)r=i+1;else{if(!(s<0)){r=i;break}o=i-1}}return r>o?o:r}(n,o,t),s=function(e,t,n,r){var o=Math.max(0,n),i=r.length-1;if(n===i)return i;if(t>=o&&t<=i)if(e>=r[t].el.offsetTop){if(o=t+1,t===i||e<r[o].el.offsetTop)return t}else if(i=t-1,t>0&&e>=r[i].el.offsetTop)return i;if(i<=n)return n;for(;o<=i;){var s=i+o>>1,a=e-r[s].el.offsetTop;if(a>0)o=s+1;else{if(!(a<0)){o=s;break}i=s-1}}return o>i?i:o}(n+Math.max(document.documentElement.clientHeight||0,window.innerHeight||0)+c-2*l,i,r,t);r<0?s>=0&&(r=0):s<r&&(s=r),r<0?o>=0&&d(t,o,i,!1):o<0?d(t,r,s,!0):s<o||r>i?(d(t,r,s,!0),d(t,o,i,!1)):r<=o?s<=i?(d(t,r,o-1,!0),d(t,s+1,i,!1)):(d(t,r,o-1,!0),d(t,i,s,!0)):s<=i?(d(t,o,r-1,!1),d(t,s+1,i,!1)):(d(t,i,s,!0),d(t,o,r-1,!1)),o=r,i=s}}function d(e,t,n,r){for(var o=t;o<=n;++o)e[o].isActive=r}(0,m.Up)(window,"scroll",u,3,300),(0,m.Up)(window,"resize",u,3,300),a&&(n=new yo.ResizeSensor(a,(0,m.BK)(u,3,300))),(0,r.Jd)((function(){n&&(n.detach(),n=void 0)}))}(o);var i=(0,a.oR)().store;return(0,r.bv)((function(){var e;o.value=(e=[],document.querySelectorAll("#docs-content h2, #docs-content h3").forEach((function(t){var n,r,o="H2"===t.tagName?2:3,i=(null===(n=t.querySelector("a"))||void 0===n?void 0:n.href.split("#")[1])||"",s=(null===(r=t.querySelector("span"))||void 0===r?void 0:r.textContent)||"";if(i.length>0&&s.length>0){var a=decodeURIComponent(i);e.push({el:t,level:o,slug:a,title:s,isActive:!1})}})),e),i.state.sidebarRightHasContent=o.value.length>0})),{tocData:o,classList:function(e){return[{"pl-10":3===e.level},e.isActive?"text-blue-500 dark:text-blue-400":"hover:text-blue-500 dark:text-dark-300 dark:hover:text-blue-400"]},onClick:function(){n("link-click")}}}}),xo=(0,c.Z)(wo,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-anchor-trigger");return e.tocData&&e.tocData.length?((0,r.wg)(),(0,r.iD)("ul",bo,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.tocData,(function(t){return(0,r.wg)(),(0,r.iD)("li",{key:t.slug},[(0,r.Wm)(a,{class:(0,r.C_)(["relative block px-5 py-1 toc-link",e.classList(t)]),to:"#".concat(t.slug),onClick:e.onClick},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(t.title)+" ",1),(0,r._)("div",{style:{width:"1px"},class:(0,r.C_)({"absolute top-0 left-0 h-full bg-blue-500 dark:bg-blue-400":t.isActive})},null,2)]})),_:2},1032,["class","to","onClick"])])})),128))])):(0,r.kq)("",!0)}]]);var ko={key:0,class:"px-5 text-sm"},So={key:0,class:"mt-3 mb-2 text-gray-600 uppercase dark:text-dark-400"},Eo=["href"],Co={key:2,class:"font-semibold text-gray-900 dark:text-blue-400"},_o={key:1};const To=(0,r.aZ)({name:"DocRelatedClassItem",props:{item:{type:Object,default:function(){return{}}},depth:{type:Number,default:0}},setup:function(e){return{hasChildren:(0,r.Fl)((function(){return void 0!==e.item.children&&e.item.children.length>0})),marginLeft:(0,r.Fl)((function(){var t=e.depth>1?.5:0;return"".concat((e.depth-1)*t,"rem")})),showIcon:(0,r.Fl)((function(){return!0!==e.item.isGroup&&void 0!==e.item.children&&e.item.children.length>0})),onItemClick:function(e,t){(0,s.pI)(t)||(t.preventDefault(),(0,f.Vn)(e))}}}}),Oo=(0,c.Z)(To,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-related-class-item");return(0,r.wg)(),(0,r.iD)("li",{class:(0,r.C_)(["relative",{"pl-1":e.depth>1,"mb-4":0===e.depth}])},[(0,r._)("div",{class:"flex items-center truncate",style:(0,r.j5)({marginLeft:e.marginLeft,minHeight:"1.875rem"})},[e.item.isGroup?((0,r.wg)(),(0,r.iD)("h6",So,(0,r.zw)(e.item.title),1)):e.item.href?((0,r.wg)(),(0,r.iD)("a",{key:1,class:"truncate transition-colors duration-100 ease-linear cursor-pointer hover:text-blue-500 dark:text-dark-300 dark:hover:text-blue-400",href:e.item.href,onClick:t[0]||(t[0]=function(t){return e.onItemClick(e.item.href,t)})},(0,r.zw)(e.item.label),9,Eo)):((0,r.wg)(),(0,r.iD)("div",Co,(0,r.zw)(e.item.label),1))],4),e.showIcon?((0,r.wg)(),(0,r.iD)("span",{key:0,class:"absolute w-2 h-3 border-b border-l border-gray-600",style:(0,r.j5)({marginLeft:e.marginLeft,marginTop:"0.375rem"})},null,4)):(0,r.kq)("",!0),e.hasChildren?((0,r.wg)(),(0,r.iD)("ul",_o,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.item.children,(function(t,n){return(0,r.wg)(),(0,r.j4)(a,{key:n,item:t,depth:e.depth+1},null,8,["item","depth"])})),128))])):(0,r.kq)("",!0)],2)}]]),Lo=(0,r.aZ)({name:"DocRelatedClasses",components:{DocRelatedClassItem:Oo},setup:function(){var e=Et().pageData;return{relatedClasses:(0,r.Fl)((function(){var t;return(null===(t=e.value)||void 0===t?void 0:t.relatedClasses)||[]}))}}}),Ro=(0,c.Z)(Lo,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-related-class-item");return e.relatedClasses.length?((0,r.wg)(),(0,r.iD)("ul",ko,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.relatedClasses,(function(e,t){return(0,r.wg)(),(0,r.j4)(a,{key:t,item:e},null,8,["item"])})),128))])):(0,r.kq)("",!0)}]]);var Do=r.lR;const Ao=(0,r.aZ)({name:"DocSidebarRight",components:{Teleport:Do,DocToc:xo,DocOverlay:Qe,DocSidebarRightToggle:go,DocRelatedClasses:Ro},setup:function(){var e=(0,r.iH)(),t=(0,r.iH)(!1),n=(0,r.iH)(!1),o=Et().pageData,i=(0,a.oR)().store,s=(0,r.Fl)((function(){return o.value?o.value.relatedClasses?"DocRelatedClasses":"DocToc":null})),l=(0,r.Fl)((function(){return"DocToc"===s.value?"Contents":"DocRelatedClasses"===s.value?"Related Classes":null})),c=(0,r.Fl)((function(){return{"translate-x-0 shadow-2xl":t.value,"translate-x-full":!t.value,"lg:top-40":"DocRelatedClasses"===s.value,"lg:top-20":"DocToc"===s.value}})),u=(0,r.Fl)((function(){return{height:"DocRelatedClasses"===s.value?"calc(100vh - 10rem)":"calc(100vh - 5rem"}}));return(0,r.bv)((function(){n.value=!0,e.value&&new T.Z(e.value)})),{Teleport:Do,content:e,isOpen:t,isMounted:n,store:i,show:function(){t.value=!0},hide:function(){t.value=!1},currentComponent:s,title:l,classes:c,styles:u}}}),Io=(0,c.Z)(Ao,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-arrow-right"),l=(0,r.up)("doc-icon-button"),c=(0,r.up)("doc-sidebar-right-toggle"),u=(0,r.up)("doc-overlay");return(0,r.wg)(),(0,r.iD)("div",{class:(0,r.C_)(["fixed top-0 bottom-0 right-0 z-40 w-4/5 text-sm transition-transform duration-300 ease-in-out bg-white border-gray-200 sidebar-right sm:w-1/2 md:w-104 lg:z-0 lg:sticky lg:w-64 lg:shrink-0 lg:transform-none lg:border-l lg:shadow-none lg:pt-6 focus:outline-none dark:bg-dark-800 lg:dark:bg-dark-850 dark:border-dark-650",e.classes]),style:(0,r.j5)(e.styles),onKeyup:t[0]||(t[0]=(0,r.D2)((function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.hide&&e.hide.apply(e,t)}),["esc"]))},[(0,r._)("div",ho,[e.store.state.sidebarRightHasContent?((0,r.wg)(),(0,r.iD)("div",po,[(0,r._)("h6",mo,(0,r.zw)(e.title),1),(0,r.Wm)(l,{class:"w-10 h-10 ml-3 lg:hidden",style:{"margin-right":"0.875rem"},"icon-size":"22",onClick:e.hide},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1},8,["onClick"])])):(0,r.kq)("",!0),((0,r.wg)(),(0,r.j4)((0,r.LL)(e.currentComponent),{onLinkClick:e.hide},null,8,["onLinkClick"]))],512),e.isMounted&&e.store.state.sidebarRightHasContent?((0,r.wg)(),(0,r.j4)((0,r.LL)(e.Teleport),{key:0,to:"#docs-sidebar-right-toggle"},{default:(0,r.w5)((function(){return[(0,r.Wm)(c,{class:"absolute right-0",onClick:e.show},null,8,["onClick"])]})),_:1})):(0,r.kq)("",!0),((0,r.wg)(),(0,r.j4)((0,r.LL)(e.Teleport),{to:"#docs-overlay-target"},{default:(0,r.w5)((function(){return[(0,r.Wm)(u,{"is-open":e.isOpen,onSwipeRight:e.hide,onClick:e.hide},null,8,["is-open","onSwipeRight","onClick"])]})),_:1}))],38)}],["__scopeId","data-v-3955b324"]]);var Mo=["aria-checked"],Fo=["checked"],Po={class:"inline-flex items-center"};const Ho=(0,r.aZ)({name:"DocSwitch",props:{modelValue:Boolean},emits:["update:modelValue"],setup:function(e,t){var n=t.emit;return{isFocused:(0,r.iH)(!1),toggle:function(){n("update:modelValue",!e.modelValue)}}}}),No=(0,c.Z)(Ho,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("label",{class:"relative inline-block cursor-pointer whitespace-nowrap",role:"switch","aria-checked":e.modelValue},[(0,r._)("input",{type:"checkbox",class:"absolute opacity-0",style:{"z-index":"-1"},checked:e.modelValue,onChange:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.toggle&&e.toggle.apply(e,t)}),onFocus:t[1]||(t[1]=function(t){return e.isFocused=!0}),onBlur:t[2]||(t[2]=function(t){return e.isFocused=!1})},null,40,Fo),(0,r._)("div",Po,[(0,r._)("div",{class:(0,r.C_)(["w-6 h-2 transition-colors duration-100 ease-linear rounded-full",e.modelValue?"bg-blue-500 dark:bg-blue-400":"bg-gray-400 dark:bg-dark-400"])},null,2),(0,r._)("div",{class:(0,r.C_)(["absolute w-4 h-4 transition-transform duration-100 ease-linear bg-white border border-gray-500 rounded-full",{"shadow-outline":e.isFocused}]),style:(0,r.j5)({transform:e.modelValue?"translateX(8px)":null})},null,6)]),(0,r.WI)(e.$slots,"default")],8,Mo)}]]),jo=(0,$e.aZ)({name:"DocTab",props:{id:{type:String,required:!0},active:Boolean},setup:function(e,t){var n=t.slots;return function(){return(0,$e.h)((function(){var e;return null===(e=n.default)||void 0===e?void 0:e.call(n)}))}}});var Wo=n(2262);const Bo=(0,$e.aZ)({name:"DocTabs",components:{DocAnchorTarget:u},setup:function(e,t){var n,r,o,i,a=t.slots,l=(0,Wo.iH)(),c=(0,Wo.iH)(""),d=(null===(n=a.default)||void 0===n?void 0:n.call(a))||[],f={};c.value=(null===(o=null===(r=d.find((function(e){var t,n;return""===(null===(t=e.props)||void 0===t?void 0:t.active)||(null===(n=e.props)||void 0===n?void 0:n.active)})))||void 0===r?void 0:r.props)||void 0===o?void 0:o.id)||(null===(i=d[0].props)||void 0===i?void 0:i.id);var h=d.map((function(e){var t,n=null===(t=e.props)||void 0===t?void 0:t.id;return"#".concat(n)})),p=Lt().route;function m(){if(p.value.hash&&h.includes(p.value.hash)){var e=p.value.hash.substr(1);if(c.value!==e)return c.value=e,!0}return!1}function v(){var e=c.value;if(!f[e]){f[e]=!0;var t=(0,$e.m0)((function(){var e;null===(e=l.value)||void 0===e||e.dispatchEvent(new Event("onPluginReady")),t()}),{flush:"post"})}}m(),f[c.value]=!0,(0,$e.YP)(p,(function(){m()&&v()}));var g=(0,$e.Fl)((function(){return d.map((function(e){var t,n=null===(t=e.props)||void 0===t?void 0:t.id,r=c.value===n;return(0,$e.h)(u,{id:n},(function(){var t,o;return(0,$e.h)("a",{href:"#".concat(n),class:{"no-link block px-5 py-4 cursor-pointer border-b-2 font-medium":!0,"text-gray-500 dark:text-dark-350 hover:text-blue-500 dark:hover:text-blue-400 border-transparent hover:border-gray-300 dark:hover:border-dark-450":!r,"text-blue-500 dark:text-blue-400 border-blue-500":r},onClick:function(e){(0,s.pI)(e)||(e.preventDefault(),c.value!==n&&(c.value=n,v()))}},null===(o=(t=e.children).title)||void 0===o?void 0:o.call(t))}))}))})),b=(0,$e.Fl)((function(){return d.map((function(e){var t;if(c.value===(null===(t=e.props)||void 0===t?void 0:t.id))return(0,$e.h)((function(){return(0,$e.h)("div",{class:"tab-content"},e)}))}))}));return function(){return(0,$e.h)("div",{ref:l,class:"mb-6 pluggable"},[(0,$e.h)("div",{class:"flex border dark:border-dark-650 -mb-px rounded-t"},g.value),(0,$e.h)("div",{class:"p-5 border dark:border-dark-650 rounded-b-md"},b.value)])}}}),zo=Bo,Vo=(0,r.aZ)({name:"DocThemeSwitch",setup:function(){var e=(0,r.iH)(null),t=(0,r.Fl)((function(){return"dark"===e.value}));function n(t){document.documentElement.classList.add("no-transitions"),setTimeout((function(){document.documentElement.classList.remove("no-transitions")}),50),t?(document.documentElement.classList.add("dark"),e.value="dark"):(document.documentElement.classList.remove("dark"),e.value="light")}e.value=(0,s.qn)(St().base,localStorage,"doc_theme"),e.value||(e.value=document.documentElement.classList.contains("dark")?"dark":"light");var o,i=(0,r.iH)();return(0,r.bv)((function(){i.value=window.matchMedia("(prefers-color-scheme: dark)"),o=function(e){(0,s.qn)(St().base,localStorage,"doc_theme")||n(e.matches)},i.value.addEventListener("change",o)})),(0,r.Jd)((function(){var e;null===(e=i.value)||void 0===e||e.removeEventListener("change",o)})),{isDark:t,toggleColorMode:n,onSwitchClick:function(){n("light"===e.value),(0,s.Nh)(St().base,localStorage,"doc_theme",e.value)}}}}),qo=(0,c.Z)(Vo,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-sun"),l=(0,r.up)("doc-icon-moon"),c=(0,r.up)("doc-icon-button");return(0,r.wg)(),(0,r.j4)(c,{class:(0,r.C_)(["w-10 h-10",{"-mb-0.5":!e.isDark}]),"icon-size":"20",onClick:e.onSwitchClick},{default:(0,r.w5)((function(){return[e.isDark?((0,r.wg)(),(0,r.j4)(a,{key:0})):((0,r.wg)(),(0,r.j4)(l,{key:1}))]})),_:1},8,["class","onClick"])}]]);var $o={id:"docs-toolbar",class:"sticky z-20 flex items-center justify-between h-16 px-6 bg-white border-b border-gray-200 md:h-20 md:pl-16 md:top-20 top-16 dark:bg-dark-850 dark:border-dark-650"},Uo={class:"relative"},Zo={ref:"visibleLinksDiv",class:"flex whitespace-nowrap"},Yo={class:"block"},Go=["innerHTML"],Jo={ref:"more",class:"mr-3 more-dropdown"},Ko={class:"flex flex-col"},Xo={class:"flex items-center h-5 px-2 text-xs font-semibold text-white bg-blue-500 dark:bg-blue-400 rounded-full md:text-2xs"};const Qo=(0,r.aZ)({name:"DocToolbarMemberCount"}),ei=(0,c.Z)(Qo,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("span",Xo,[(0,r.WI)(e.$slots,"default")])}]]);var ti=["aria-expanded","aria-disabled","disabled"],ni={class:"absolute left-0 z-20"},ri={ref:"dropdownBottom",class:"h-2"},oi={key:0,class:"absolute bottom-0 right-0 z-50 flex items-center h-6 px-2 mb-4 mr-8 text-xs leading-none text-center text-gray-500 bg-white rounded-full shadow-md dark:bg-dark-550 dark:text-dark-200"},ii=function(){return ii=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},ii.apply(this,arguments)};const si=(0,r.aZ)({name:"ToolbarLinkDropdownContent",components:{DocAnchorTrigger:p},props:{groupId:{type:String,required:!0},members:{type:Array,required:!0},isSingleColumn:{type:Boolean,required:!0},linkWidth:{type:Number,required:!0}},emits:["click"],setup:function(e,t){var n=t.emit,o=(0,r.iH)(3),i=(0,r.iH)(0),s=(0,r.Fl)((function(){return ii({maxHeight:"calc(100vh - 11rem)",minWidth:"".concat(e.linkWidth,"px")},!e.isSingleColumn&&{width:"".concat(i.value,"px")})})),a=(0,r.Fl)((function(){var t=Math.ceil(e.members.length/o.value);return{gridTemplateColumns:"repeat(".concat(o.value,", 1fr)"),gridTemplateRows:"repeat(".concat(t,", 1fr)")}})),l=tt(),c=l.enableBodyScroll,u=l.disableBodyScroll;function d(){var e=document.querySelector("#docs-content");i.value=e?e.clientWidth:0}et((function(){!function(){var e=window.innerWidth;o.value=e<1124&&e>1024||e<900?2:3}(),d()})),(0,r.bv)(d);var f=function(){var e=(0,r.iH)();return{dropdownBottom:e,isIntersecting:An(e).isIntersecting}}(),h=f.dropdownBottom,p=f.isIntersecting;return{memberGridStyles:a,mmemberGridWrapperStyles:s,enableBodyScroll:c,disableBodyScroll:u,onClick:function(){c(),n("click")},dropdownBottom:h,isIntersecting:p}}}),ai=(0,c.Z)(si,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-anchor-trigger");return(0,r.wg)(),(0,r.iD)("div",null,[(0,r._)("div",{ref:"gridWrapper",class:"px-2 pt-2 mt-2 overflow-y-auto bg-white border border-gray-300 rounded shadow-lg member-links-dropdown dark:bg-dark-650 dark:border-dark-500",style:(0,r.j5)(e.mmemberGridWrapperStyles),onMouseenter:t[1]||(t[1]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.disableBodyScroll&&e.disableBodyScroll.apply(e,t)}),onMouseleave:t[2]||(t[2]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.enableBodyScroll&&e.enableBodyScroll.apply(e,t)})},[(0,r._)("div",{class:(0,r.C_)({"sm:grid grid-flow-col":!e.isSingleColumn}),style:(0,r.j5)(e.memberGridStyles)},[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.members,(function(n){return(0,r.wg)(),(0,r.j4)(a,{key:n.id,to:"#".concat(n.id),onClick:t[0]||(t[0]=function(t){return e.onClick()})},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(n.name),1)]})),_:2},1032,["to"])})),128))],6),(0,r._)("div",ri,null,512)],36),e.isIntersecting?(0,r.kq)("",!0):((0,r.wg)(),(0,r.iD)("span",oi," More... "))])}],["__scopeId","data-v-ca01e68c"]]),li=(0,r.aZ)({name:"DocToolbarLinkDropdown",components:{DocToolbarMemberCount:ei,DocToolbarLinkDropdownContent:ai},props:{value:Boolean,inDropdown:Boolean,isSingleColumn:Boolean,disabled:Boolean,groupId:String,count:Number,members:Array,linkWidth:Number},emits:["update:modelValue"],setup:function(e,t){var n=t.emit,o=(0,r.iH)(),i=(0,r.iH)(!1);return(0,st.w)((function(e){var t,n=e.target;o.value===n||(null===(t=o.value)||void 0===t?void 0:t.contains(n))||(i.value=!1)})),(0,r.YP)(i,(function(e){n("update:modelValue",e)})),{dropdown:o,toggleDropdown:function(){i.value=!i.value},onBodyClick:st.w,isOpen:i}}}),ci=(0,c.Z)(li,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-chevron-down"),l=(0,r.up)("doc-icon"),c=(0,r.up)("doc-toolbar-member-count"),u=(0,r.up)("doc-toolbar-link-dropdown-content");return(0,r.wg)(),(0,r.iD)("div",{ref:"dropdown",class:(0,r.C_)({hidden:e.inDropdown})},[(0,r._)("button",{class:(0,r.C_)(["relative z-20 flex items-center justify-center w-6 h-full px-0 border-l border-white rounded-r focus:outline-none focus:bg-gray-400 hover:bg-gray-300 dark:border-dark-850 dark:hover:bg-dark-450 dark:focus:bg-dark-450 transition-colors duration-200 ease-out",{"opacity-30 cursor-default pointer-events-none":e.disabled,"bg-gray-400 dark:bg-dark-450":e.isOpen,"bg-gray-200 dark:bg-dark-550":!e.isOpen}]),role:"button","aria-has-popup":"true","aria-expanded":e.isOpen,"aria-disabled":e.disabled,disabled:e.disabled,onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.toggleDropdown&&e.toggleDropdown.apply(e,t)})},[(0,r.Wm)(l,{class:"dark:text-white",width:"13",height:"13"},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1}),(0,r.Wm)(c,{class:"absolute top-0 right-0 -mt-3 -mr-2"},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(e.count),1)]})),_:1})],10,ti),(0,r.Wm)(r.uT,{"enter-active-class":"transition duration-100 ease-out","enter-from-class":"-translate-y-2 opacity-30","enter-to-class":"translate-y-0 opacity-100","leave-active-class":"transition duration-75 ease-linear","leave-from-class":"translate-y-0 opacity-100","leave-to-class":"-translate-y-2 opacity-0"},{default:(0,r.w5)((function(){return[(0,r.wy)((0,r._)("div",ni,[(0,r.Wm)(u,{members:e.members,"is-single-column":e.isSingleColumn,"group-id":e.groupId,"link-width":e.linkWidth,onClick:t[1]||(t[1]=function(t){return e.isOpen=!1})},null,8,["members","is-single-column","group-id","link-width"])],512),[[r.F8,e.isOpen]])]})),_:1})],2)}]]),ui=(0,r.aZ)({name:"DocToolbarLink",components:{DocToolbarLinkDropdown:ci,DocToolbarMemberCount:ei,DocAnchorTrigger:p},props:{link:{type:Object,required:!0},inDropdown:{type:Boolean,default:!1}},setup:function(e){var t=(0,r.iH)(),n=(0,r.iH)(!1),o=(0,a.oR)().store,i=(0,r.Fl)((function(){return o.getters.getVisibleGroupMembers(e.link.id)})),s=(0,r.Fl)((function(){return i.value.length})),l=(0,r.Fl)((function(){return s.value<=12})),c=(0,r.Fl)((function(){return 0===s.value})),u=(0,r.Fl)((function(){return 0===s.value?"":"#".concat(e.link.id)})),d=(0,r.Fl)((function(){return t.value?t.value.clientWidth:0}));return{linkEl:t,linkWidth:d,isSingleColumn:l,isDropdownOpen:n,disabled:c,href:u,count:s,members:i}}}),di=(0,c.Z)(ui,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-toolbar-member-count"),l=(0,r.up)("doc-anchor-trigger"),c=(0,r.up)("doc-toolbar-link-dropdown");return(0,r.wg)(),(0,r.iD)("div",{ref:"linkEl",class:(0,r.C_)(["inline-flex h-8 text-sm leading-none",{"mr-3":!e.inDropdown,relative:e.isSingleColumn}]),onKeydown:t[1]||(t[1]=(0,r.D2)((function(t){return e.isDropdownOpen=!1}),["esc"]))},[(0,r.Wm)(l,{class:(0,r.C_)(["flex items-center justify-between grow px-3 font-medium text-gray-900 focus:bg-gray-400 focus:outline-none dark:text-white dark:focus:bg-dark-450 transition-colors duration-200 ease-out",{"px-5 hover:bg-gray-200 dark:hover:bg-dark-500":e.inDropdown,"rounded-l hover:bg-gray-300 dark:hover:bg-dark-450":!e.inDropdown,"opacity-30 cursor-default pointer-events-none":e.disabled,"bg-gray-400 dark:bg-dark-450":e.isDropdownOpen,"bg-gray-200 dark:bg-dark-550":!e.isDropdownOpen&&!e.inDropdown}]),to:e.href,disabled:e.disabled},{default:(0,r.w5)((function(){return[(0,r.WI)(e.$slots,"default"),(0,r.Wm)(a,{class:(0,r.C_)({hidden:!e.inDropdown})},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(e.count),1)]})),_:1},8,["class"])]})),_:3},8,["class","to","disabled"]),(0,r.Wm)(c,{modelValue:e.isDropdownOpen,"onUpdate:modelValue":t[0]||(t[0]=function(t){return e.isDropdownOpen=t}),"in-dropdown":e.inDropdown,"is-single-column":e.isSingleColumn,disabled:e.disabled,count:e.count,members:e.members,"group-id":e.link.id,"link-width":e.linkWidth},null,8,["modelValue","in-dropdown","is-single-column","disabled","count","members","group-id","link-width"])],34)}]]);const fi=(0,r.aZ)({name:"DocToolbarLinks",components:{DocToolbarLink:di},setup:function(){var e=(0,r.iH)(),t=(0,r.iH)(0),n=function(){var e=(0,r.iH)(),t=(0,r.iH)(),n=St().toolbarLinks,o=(0,r.iH)([]),i=(0,r.iH)([]),s=(0,r.iH)([]);(0,r.bv)((function(){o.value=n.slice()}));var a=function(){var e;return null===(e=t.value)||void 0===e?void 0:e.clientWidth},l=function(){var e,t,n,c=(t=document.querySelector("#docs-toolbar"),n=window.innerWidth<960?48:88,(t?t.clientWidth-n:0)-((null===(e=document.querySelector("#docs-filters"))||void 0===e?void 0:e.clientWidth)||0));if(a()>c&&o.value.length){s.value.push(a());var u=o.value.pop();u&&i.value.unshift(u)}else if(c>s.value[s.value.length-1]){var d=i.value[0];i.value.splice(0,1),o.value.push(d),s.value.pop()}(0,r.Y3)((function(){a()>c&&o.value.length&&l()}))};return{more:e,visibleLinksDiv:t,visibleLinks:o,invisibleLinks:i,updateNavLinks:l}}(),o=n.more,i=n.visibleLinksDiv,s=n.visibleLinks,a=n.invisibleLinks,l=n.updateNavLinks,c=(0,r.Fl)((function(){return s.value.length<=1&&t.value<960?"left":"right"}));function u(){t.value=window.innerWidth}return(0,r.bv)((function(){u(),l()})),et((function(){u(),l()})),{dropdown:e,more:o,visibleLinksDiv:i,visibleLinks:s,invisibleLinks:a,dropdownAlignment:c,onClick:function(){e.value.hide()}}}}),hi=(0,c.Z)(fi,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-toolbar-link"),l=(0,r.up)("doc-icon-more-horizontal"),c=(0,r.up)("doc-icon-button"),u=(0,r.up)("doc-dropdown");return(0,r.wg)(),(0,r.iD)("div",Uo,[(0,r._)("div",Zo,[(0,r._)("div",Yo,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.visibleLinks,(function(e){return(0,r.wg)(),(0,r.j4)(a,{key:e.id,link:e,"in-dropdown":!1},{default:(0,r.w5)((function(){return[(0,r._)("span",{innerHTML:e.shortLabel?e.shortLabel:e.label},null,8,Go)]})),_:2},1032,["link"])})),128))]),(0,r.wy)((0,r._)("div",Jo,[(0,r.Wm)(u,{ref:"dropdown",class:"inline-block",align:e.dropdownAlignment},{"button-content":(0,r.w5)((function(){return[(0,r.Wm)(c,{class:"w-8 h-8 bg-gray-200 hover:bg-gray-300 dark:bg-dark-550 dark:hover:bg-dark-450",rounded:!1},{default:(0,r.w5)((function(){return[(0,r.Wm)(l)]})),_:1})]})),default:(0,r.w5)((function(){return[(0,r._)("div",Ko,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.invisibleLinks,(function(t){return(0,r.wg)(),(0,r.j4)(a,{key:t.id,link:t,"in-dropdown":!0,onClick:e.onClick},{default:(0,r.w5)((function(){return[(0,r._)("span",null,(0,r.zw)(t.label),1)]})),_:2},1032,["link","onClick"])})),128))])]})),_:1},8,["align"])],512),[[r.F8,e.invisibleLinks.length]])],512)])}]]);var pi={id:"docs-filters"},mi={class:"items-center hidden lg:flex"},vi={key:0,class:"absolute top-0 right-0 w-4 h-4 -mt-2 -mr-2 bg-orange-500 border-4 border-white rounded-full dark:border-dark-850"},gi=(0,r._)("span",{class:"hidden sm:inline"},"Filters",-1),bi={class:"pt-2 pb-3"},yi={class:"px-5 pb-4 border-b dark:border-dark-500"},wi={class:"px-5 pt-4"},xi={key:0,class:"absolute top-0 right-0 w-4 h-4 -mt-2 -mr-2 bg-orange-500 border-4 border-white rounded-full dark:border-dark-850"},ki=(0,r._)("span",null,"Access",-1),Si={class:"pt-1"};const Ei=(0,r.aZ)({name:"DocToolbarAccess",setup:function(){var e=(0,a.oR)().store;return{access:St().access,selected:(0,r.Fl)({get:function(){return e.state.access},set:function(t){return e.actions.updateAccess(t)}}),isDirty:(0,r.Fl)((function(){return e.getters.isAccessDirty()}))}}}),Ci=(0,c.Z)(Ei,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-shield"),l=(0,r.up)("doc-icon"),c=(0,r.up)("doc-checkbox"),u=(0,r.up)("doc-dropdown");return(0,r.wg)(),(0,r.iD)("div",null,[(0,r.Wm)(u,{class:"hidden lg:block",align:"right","menu-width":"9rem"},{"button-content":(0,r.w5)((function(t){var n=t.isOpen,o=t.isFocused;return[(0,r._)("button",{class:(0,r.C_)(["relative text-gray-900 bg-white border btn focus:border-gray-600 dark:border-dark-650 dark:text-white dark:hover:bg-dark-450 dark:hover:border-dark-450 dark:focus:bg-dark-450 dark:focus:border-dark-450",n||o?"border-gray-600 dark:bg-dark-450":"border-gray-400 dark:bg-dark-550"])},[e.isDirty?((0,r.wg)(),(0,r.iD)("span",xi)):(0,r.kq)("",!0),(0,r.Wm)(l,{class:"mr-1 -ml-1",width:"14",height:"14",style:{"margin-bottom":"0"}},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1}),ki],2)]})),default:(0,r.w5)((function(){return[(0,r._)("div",Si,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.access,(function(n){return(0,r.wg)(),(0,r.iD)("div",{key:n.value,class:"flex px-5 hover:bg-gray-200 dark:hover:bg-dark-500"},[(0,r.Wm)(c,{modelValue:e.selected,"onUpdate:modelValue":t[0]||(t[0]=function(t){return e.selected=t}),class:"text-xs",value:n.value},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(n.label),1)]})),_:2},1032,["modelValue","value"])])})),128))])]})),_:1}),((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.access,(function(n){return(0,r.wg)(),(0,r.iD)("div",{key:n.value,class:"py-0.5 lg:hidden"},[(0,r.Wm)(c,{modelValue:e.selected,"onUpdate:modelValue":t[1]||(t[1]=function(t){return e.selected=t}),class:"text-xs",value:n.value},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(n.label),1)]})),_:2},1032,["modelValue","value"])])})),128))])}]]);var _i={class:"relative",style:{width:"12.4375rem"}},Ti=["placeholder"];const Oi=(0,r.aZ)({name:"DocToolbarMemberFilter",setup:function(){var e=(0,a.oR)().store,t=(0,r.iH)(),n=St().toolbarFilterPlaceholder||"Filter",o=(0,r.Fl)({get:function(){return e.state.memberFilter},set:Pr()((function(t){e.actions.updateMemberFilter(t)}),400)});function i(){var e;null===(e=t.value)||void 0===e||e.select()}return(0,r.bv)((function(){var e;window.innerWidth>960&&(null===(e=t.value)||void 0===e||e.focus(),i())})),function(e){var t=Lt(),n=t.route,o=t.Router;n.value.query&&n.value.query.q&&(e.value=n.value.query.q),(0,r.YP)(e,(function(e){var t=e?{q:e}:{};n.value.query=t,o.replace(n.value)}))}(o),{input:t,query:o,placeholder:n,select:i,clear:function(){var e;o.value="",null===(e=t.value)||void 0===e||e.focus()}}}}),Li=(0,c.Z)(Oi,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-x"),l=(0,r.up)("doc-icon-button");return(0,r.wg)(),(0,r.iD)("div",_i,[(0,r.wy)((0,r._)("input",{ref:"input","onUpdate:modelValue":t[0]||(t[0]=function(t){return e.query=t}),class:"w-full h-8 px-3 leading-8 transition-colors duration-200 ease-linear bg-white border border-gray-200 rounded shadow-none md:text-sm focus:outline-none focus:border-gray-600 dark:bg-dark-550 dark:border-dark-600 dark:hover:bg-dark-450 dark:hover:border-dark-450 dark:focus:bg-dark-450 dark:focus:border-dark-450 dark:text-white placeholder-gray-400 dark:placeholder-dark-400",type:"text",placeholder:e.placeholder,onFocus:t[1]||(t[1]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.select&&e.select.apply(e,t)})},null,40,Ti),[[r.nr,e.query,void 0,{trim:!0}]]),e.query?((0,r.wg)(),(0,r.j4)(l,{key:0,ref:"closeBtn",class:"absolute top-0 right-0 w-6 h-6 mt-1 mr-1",onClick:e.clear},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1},8,["onClick"])):(0,r.kq)("",!0)])}]]),Ri=(0,r.aZ)({name:"DocToolbarFilters",components:{DocToolbarAccess:Ci,DocToolbarMemberFilter:Li},setup:function(){var e=(0,a.oR)().store;return{isFiltersDirty:(0,r.Fl)((function(){return e.getters.isFiltersDirty()}))}}}),Di=(0,c.Z)(Ri,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-toolbar-access"),l=(0,r.up)("doc-toolbar-member-filter"),c=(0,r.up)("doc-icon-filter"),u=(0,r.up)("doc-icon"),d=(0,r.up)("doc-dropdown");return(0,r.wg)(),(0,r.iD)("div",pi,[(0,r._)("div",mi,[(0,r.Wm)(a,{class:"ml-3"}),(0,r.Wm)(l,{class:"ml-3"})]),(0,r.Wm)(d,{class:"lg:hidden",align:"right","menu-width":"13rem"},{"button-content":(0,r.w5)((function(t){var n=t.isOpen,o=t.isFocused;return[(0,r._)("button",{class:(0,r.C_)(["relative inline-flex items-center justify-center w-8 h-8 p-0 text-sm font-medium leading-none text-gray-900 whitespace-nowrap bg-white border rounded cursor-pointer select-none sm:w-auto sm:px-3 focus:outline-none focus:border-gray-600 dark:border-dark-650 dark:text-white dark:hover:bg-dark-450 transition-colors duration-200 ease-out",n||o?"border-gray-600 dark:bg-dark-450":"border-gray-400 dark:bg-dark-550"])},[e.isFiltersDirty?((0,r.wg)(),(0,r.iD)("span",vi)):(0,r.kq)("",!0),(0,r.Wm)(u,{class:"mb-0 sm:mr-1",width:"14",height:"14"},{default:(0,r.w5)((function(){return[(0,r.Wm)(c)]})),_:1}),gi],2)]})),default:(0,r.w5)((function(){return[(0,r._)("div",bi,[(0,r._)("div",yi,[(0,r.Wm)(l)]),(0,r._)("div",wi,[(0,r.Wm)(a)])])]})),_:1})])}]]),Ai=(0,r.aZ)({name:"DocToolbar",components:{DocToolbarLinks:hi,DocToolbarFilters:Di},setup:function(){return{checkState:(0,r.iH)(!0),selected:(0,r.iH)([])}}}),Ii=(0,c.Z)(Ai,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-toolbar-links"),l=(0,r.up)("doc-toolbar-filters");return(0,r.wg)(),(0,r.iD)("div",$o,[(0,r.Wm)(a,{class:"grow-0"}),(0,r.Wm)(l)])}]]);var Mi={key:0,class:"w-full px-4 py-3 text-center text-red-800 bg-red-100 rounded dark:bg-red-400 dark:text-white"};const Fi=(0,r.aZ)({name:"DocToolbarMemberFilterNoResults",setup:function(){var e=(0,a.oR)().store,t=(0,r.Fl)((function(){return e.state.memberFilter})),n=(0,r.Fl)((function(){var t=0;return St().toolbarLinks.forEach((function(n){t+=e.getters.getVisibleGroupMembers(n.id).length})),t})),o=(0,r.Fl)((function(){return 0===n.value})),i=(0,r.Fl)((function(){return St().filterNotFoundMsg.replace("{query}",t.value)}));return{query:t,noResults:o,notFoundMsg:i}}}),Pi=(0,c.Z)(Fi,[["render",function(e,t,n,o,i,s){return e.query&&e.noResults?((0,r.wg)(),(0,r.iD)("div",Mi,(0,r.zw)(e.notFoundMsg),1)):(0,r.kq)("",!0)}]]);var Hi={d:"M21 9H7c-.55 0-1 .45-1 1s.45 1 1 1h14c.55 0 1-.45 1-1s-.45-1-1-1zM3 7h18c.55 0 1-.45 1-1s-.45-1-1-1H3c-.55 0-1 .45-1 1s.45 1 1 1zM21 13H3c-.55 0-1 .45-1 1s.45 1 1 1h18c.55 0 1-.45 1-1s-.45-1-1-1zM21 17H7c-.55 0-1 .45-1 1s.45 1 1 1h14c.55 0 1-.45 1-1s-.45-1-1-1z"};const Ni=(0,$e.aZ)({name:"DocIconAlignRight"}),ji=(0,c.Z)(Ni,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Hi)}]]);var Wi={d:"M19 11H7.41l5.29-5.29a.996.996 0 10-1.41-1.41l-7 7a1 1 0 000 1.42l7 7a1.024 1.024 0 001.42-.01.996.996 0 000-1.41L7.41 13H19c.55 0 1-.45 1-1s-.45-1-1-1z"};const Bi=(0,$e.aZ)({name:"DocIconArrowLeft"}),zi=(0,c.Z)(Bi,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Wi)}]]);var Vi={d:"M19.92 12.38a1 1 0 00-.22-1.09l-7-7a.996.996 0 10-1.41 1.41l5.3 5.3H5c-.55 0-1 .45-1 1s.45 1 1 1h11.59l-5.29 5.29a.996.996 0 000 1.41c.19.2.44.3.7.3s.51-.1.71-.29l7-7c.09-.09.16-.21.21-.33z"};const qi=(0,$e.aZ)({name:"DocIconArrowRight"}),$i=(0,c.Z)(qi,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Vi)}]]);var Ui={d:"M19.71 11.29l-7-7a1 1 0 00-1.42 0l-7 7A.996.996 0 105.7 12.7L11 7.41V19c0 .55.45 1 1 1s1-.45 1-1V7.41l5.29 5.29c.2.2.45.3.71.3s.51-.1.71-.29c.39-.39.39-1.03 0-1.42z"};const Zi=(0,$e.aZ)({name:"DocIconArrowTop"}),Yi=(0,c.Z)(Zi,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Ui)}]]);var Gi={d:"M21.67 6.68c-.02-.07-.03-.15-.07-.22a.967.967 0 00-.25-.28c-.24-.3-.51-.58-.85-.78l-7-4c-.93-.53-2.08-.54-3 0l-7 4c-.35.2-.62.48-.86.79-.09.08-.17.16-.24.27-.03.07-.05.14-.07.21C2.13 7.08 2 7.53 2 8v8c0 1.07.58 2.06 1.5 2.6l7 4c.32.18.66.28 1.01.34.15.09.31.15.49.15s.34-.06.49-.15c.35-.06.69-.15 1.01-.34l7-4c.92-.54 1.5-1.53 1.5-2.6V8c0-.47-.13-.91-.33-1.32zM11.5 3.14c.15-.09.33-.14.5-.14.17 0 .35.05.5.14l6.46 3.69L12 10.85 5.04 6.83l6.46-3.69zm-7 13.73c-.31-.18-.5-.52-.5-.87V8.54l7 4.05v7.99l-6.5-3.71zm15-.01L13 20.58v-7.99l7-4.05V16c0 .35-.19.69-.5.86z"};const Ji=(0,$e.aZ)({name:"DocIconBox"}),Ki=(0,c.Z)(Ji,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Gi)}]]);var Xi={d:"M9 18.5c-.38 0-.77-.15-1.06-.44l-5-5a1.49 1.49 0 010-2.12 1.49 1.49 0 012.12 0L9 14.88l9.94-9.94a1.49 1.49 0 012.12 0c.59.59.59 1.54 0 2.12l-11 11c-.29.29-.68.44-1.06.44z"};const Qi=(0,$e.aZ)({name:"DocIconCheck"}),es=(0,c.Z)(Qi,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Xi)}]]);var ts=[(0,r._)("path",{d:"M21 9.09c-.55 0-1 .45-1 1v.92c0 4.96-4.04 8.99-9 8.99-4.97 0-9-4.04-9-9s4.04-9 9-9c1.27 0 2.5.26 3.66.78.51.22 1.1 0 1.32-.51.23-.5 0-1.1-.51-1.32C14.06.32 12.56 0 11.01 0H11C4.94 0 0 4.93 0 10.99 0 17.06 4.93 22 10.99 22H11c6.06 0 11-4.93 11-10.99v-.92c0-.56-.45-1-1-1z"},null,-1),(0,r._)("path",{d:"M8.71 9.31a.996.996 0 10-1.41 1.41l3 3c.19.19.44.29.71.29.27 0 .52-.11.71-.29l10-10.01a.996.996 0 10-1.41-1.41L11 11.6 8.71 9.31z"},null,-1)];const ns=(0,$e.aZ)({name:"DocIconCheckCircle"}),rs=(0,c.Z)(ns,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("g",null,ts)}]]);var os={d:"M12 16c-.26 0-.51-.1-.71-.29l-6-6A.996.996 0 116.7 8.3l5.3 5.29 5.29-5.29a.996.996 0 111.41 1.41l-6 6c-.19.19-.44.29-.7.29z"};const is=(0,$e.aZ)({name:"DocIconChevronDown"}),ss=(0,c.Z)(is,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",os)}]]);var as={d:"M15.71 11.29l-6-6A.996.996 0 108.3 6.7l5.29 5.3-5.29 5.29a.996.996 0 000 1.41c.19.2.44.3.7.3s.51-.1.71-.29l6-6c.39-.39.39-1.03 0-1.42z"};const ls=(0,$e.aZ)({name:"DocIconChevronRight"}),cs=(0,c.Z)(ls,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",as)}]]);var us={d:"M20.92 8.62a.875.875 0 00-.22-.32l-7-7A.995.995 0 0013 1H6C4.35 1 3 2.35 3 4v16c0 1.65 1.35 3 3 3h12c1.65 0 3-1.35 3-3V9c0-.13-.03-.26-.08-.38zM14 4.41L17.59 8H14V4.41zM18 21H6c-.55 0-1-.45-1-1V4c0-.55.45-1 1-1h6v6c0 .55.45 1 1 1h6v10c0 .55-.45 1-1 1z"};const ds=(0,$e.aZ)({name:"DocIconFile"}),fs=(0,c.Z)(ds,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",us)}]]);var hs={d:"M14 22c-.15 0-.31-.04-.45-.11l-4-2A.988.988 0 019 19v-6.17L1.24 3.65a.995.995 0 01-.14-1.07c.16-.35.51-.58.9-.58h20c.39 0 .74.23.91.58s.11.77-.14 1.07L15 12.83V21a.999.999 0 01-1 1zm-3-3.62l2 1v-6.92c0-.24.08-.47.24-.65L19.84 4H4.16l6.61 7.81c.15.18.24.41.24.65v5.92z"};const ps=(0,$e.aZ)({name:"DocIconFilter"}),ms=(0,c.Z)(ps,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",hs)}]]);var vs=(0,r._)("path",{d:"M20 22H4c-1.65 0-3-1.35-3-3V5c0-1.65 1.35-3 3-3h5c.33 0 .65.17.83.45L11.54 5H20c1.65 0 3 1.35 3 3v11c0 1.65-1.35 3-3 3zM4 4c-.55 0-1 .45-1 1v14c0 .55.45 1 1 1h16c.55 0 1-.45 1-1V8c0-.55-.45-1-1-1h-9c-.33 0-.65-.17-.83-.45L8.46 4H4z"},null,-1),gs=(0,r._)("path",{fill:"none",d:"M0 0h24v24H0z"},null,-1);const bs=(0,$e.aZ)({name:"DocIconFolder"}),ys=(0,c.Z)(bs,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)(r.HY,null,[vs,gs],64)}]]);var ws=[(0,r._)("path",{d:"M12.01 6.01c-.55 0-1 .45-1 1V12a1 1 0 00.4.8l3 2.22a.985.985 0 001.39-.2.996.996 0 00-.21-1.4l-2.6-1.92V7.01c.02-.55-.43-1-.98-1z"},null,-1),(0,r._)("path",{d:"M12.01 1.91c-5.33 0-9.69 4.16-10.05 9.4l-.29-.26a.997.997 0 10-1.34 1.48l1.97 1.79c.19.17.43.26.67.26s.48-.09.67-.26l1.97-1.79a.997.997 0 10-1.34-1.48l-.31.28c.34-4.14 3.82-7.41 8.05-7.41 4.46 0 8.08 3.63 8.08 8.09s-3.63 8.08-8.08 8.08c-2.18 0-4.22-.85-5.75-2.4a.996.996 0 10-1.42 1.4 10.02 10.02 0 007.17 2.99c5.56 0 10.08-4.52 10.08-10.08.01-5.56-4.52-10.09-10.08-10.09z"},null,-1)];const xs=(0,$e.aZ)({name:"DocIconHistory"}),ks=(0,c.Z)(xs,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("g",null,ws)}]]);var Ss={d:"M21.61 8.21l-9-7c-.36-.28-.87-.28-1.23 0l-9 7C2.14 8.4 2 8.69 2 9v11c0 1.65 1.35 3 3 3h14c1.65 0 3-1.35 3-3V9c0-.31-.14-.6-.39-.79zM14 21h-4v-8h4v8zm6-1c0 .55-.45 1-1 1h-3v-9c0-.55-.45-1-1-1H9c-.55 0-1 .45-1 1v9H5c-.55 0-1-.45-1-1V9.49l8-6.22 8 6.22V20z"};const Es=(0,$e.aZ)({name:"DocIconHome"}),Cs=(0,c.Z)(Es,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Ss)}]]);var _s=[(0,r._)("path",{d:"M12 1C5.93 1 1 5.93 1 12s4.93 11 11 11 11-4.93 11-11S18.07 1 12 1zm0 20c-4.96 0-9-4.04-9-9s4.04-9 9-9 9 4.04 9 9-4.04 9-9 9z"},null,-1),(0,r._)("path",{d:"M12 11c-.55 0-1 .45-1 1v4c0 .55.45 1 1 1s1-.45 1-1v-4c0-.55-.45-1-1-1zM12.01 7c-.56 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1z"},null,-1),(0,r._)("path",{fill:"none",d:"M0 0h24v24H0z"},null,-1)];const Ts=(0,$e.aZ)({name:"DocIconInfo"}),Os=(0,c.Z)(Ts,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("g",null,_s)}]]);var Ls=[(0,r._)("path",{d:"M.55 6.89l10 5c.14.07.3.11.45.11s.31-.04.45-.11l10-5c.34-.16.55-.51.55-.89s-.21-.73-.55-.89l-10-5a.995.995 0 00-.89 0l-10 5C.21 5.27 0 5.62 0 6s.21.73.55.89zM11 2.12L18.76 6 11 9.88 3.24 6 11 2.12zM20.55 15.11L11 19.88 1.45 15.1c-.49-.25-1.09-.05-1.34.45s-.05 1.09.45 1.34l10 5a.956.956 0 00.89 0l10-5c.49-.25.69-.85.45-1.34-.25-.49-.85-.69-1.35-.44z"},null,-1),(0,r._)("path",{d:"M20.55 10.11L11 14.88 1.45 10.1a.993.993 0 00-1.34.45.993.993 0 00.45 1.34l10 5a.956.956 0 00.89 0l10-5c.49-.25.69-.85.45-1.34-.25-.49-.85-.69-1.35-.44z"},null,-1)];const Rs=(0,$e.aZ)({name:"DocIconLayers"}),Ds=(0,c.Z)(Rs,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("g",null,Ls)}]]);var As=[(0,r._)("path",{d:"M21.11 2.75a5.98 5.98 0 00-8.35.01l-1.72 1.71a.996.996 0 101.41 1.41l1.71-1.7c1.56-1.5 4-1.5 5.56 0 1.59 1.53 1.63 4.07.11 5.64l-3 3c-.13.13-.28.26-.43.38a4.003 4.003 0 01-5.6-.81c-.33-.44-.96-.53-1.4-.2-.44.33-.53.96-.2 1.4a5.999 5.999 0 004.81 2.4c1.25 0 2.51-.39 3.58-1.19.23-.17.45-.36.65-.56l3.01-3.01a5.991 5.991 0 00-.14-8.48z"},null,-1),(0,r._)("path",{d:"M11.53 18.11l-1.7 1.7c-1.56 1.5-4 1.5-5.56 0-1.59-1.53-1.63-4.07-.11-5.64l3-3c.14-.14.28-.26.43-.38a3.997 3.997 0 015.6.8c.33.44.96.53 1.4.2.44-.33.53-.96.2-1.4a5.93 5.93 0 00-3.95-2.34c-1.58-.22-3.15.18-4.44 1.14-.23.17-.44.36-.65.56l-3.01 3.01c-2.3 2.38-2.23 6.19.15 8.48a5.956 5.956 0 004.16 1.69c1.5 0 3.01-.57 4.19-1.7l1.71-1.71c.39-.39.39-1.02 0-1.41s-1.03-.39-1.42 0z"},null,-1)];const Is=(0,$e.aZ)({name:"DocIconLink"}),Ms=(0,c.Z)(Is,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("g",null,As)}]]);var Fs={d:"M2 4h20v2H2zM2 11h20v2H2zM2 18h20v2H2z"};const Ps=(0,$e.aZ)({name:"DocIconMenu"}),Hs=(0,c.Z)(Ps,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Fs)}]]);var Ns={d:"M19 13H5c-.55 0-1-.45-1-1s.45-1 1-1h14c.55 0 1 .45 1 1s-.45 1-1 1z"};const js=(0,$e.aZ)({name:"DocIconMinus"}),Ws=(0,c.Z)(js,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Ns)}]]);var Bs=[(0,r._)("path",{d:"M11 22C4.93 22 0 17.07 0 11S4.93 0 11 0s11 4.93 11 11-4.93 11-11 11zm0-20c-4.96 0-9 4.04-9 9s4.04 9 9 9 9-4.04 9-9-4.04-9-9-9z"},null,-1),(0,r._)("path",{d:"M16.5 11c0 3.05-2.46 5.51-5.49 5.51-2.16 0-4.02-1.25-4.92-3.05-.11-.22.08-.49.32-.43 1.15.28 2.43.2 3.71-.42 1.88-.9 3.07-2.89 3.06-4.97 0-.42-.05-.83-.15-1.22-.06-.24.21-.43.43-.32 1.79.88 3.04 2.74 3.04 4.9z"},null,-1)];const zs=(0,$e.aZ)({name:"DocIconMoon"}),Vs=(0,c.Z)(zs,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("g",null,Bs)}]]);var qs=[(0,r._)("circle",{cx:"12",cy:"12",r:"2"},null,-1),(0,r._)("circle",{cx:"19",cy:"12",r:"2"},null,-1),(0,r._)("circle",{cx:"5",cy:"12",r:"2"},null,-1)];const $s=(0,$e.aZ)({name:"DocIconMoreHorizontal"}),Us=(0,c.Z)($s,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("g",null,qs)}]]);var Zs={d:"M19 11h-6V5c0-.55-.45-1-1-1s-1 .45-1 1v6H5c-.55 0-1 .45-1 1s.45 1 1 1h6v6c0 .55.45 1 1 1s1-.45 1-1v-6h6c.55 0 1-.45 1-1s-.45-1-1-1z"};const Ys=(0,$e.aZ)({name:"DocIconPlus"}),Gs=(0,c.Z)(Ys,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Zs)}]]);var Js={d:"M21.71 20.29l-3.68-3.68A8.963 8.963 0 0020 11c0-4.96-4.04-9-9-9s-9 4.04-9 9 4.04 9 9 9c2.12 0 4.07-.74 5.61-1.97l3.68 3.68c.2.19.45.29.71.29s.51-.1.71-.29c.39-.39.39-1.03 0-1.42zM4 11c0-3.86 3.14-7 7-7s7 3.14 7 7c0 1.92-.78 3.66-2.04 4.93-.01.01-.02.01-.02.01-.01.01-.01.01-.01.02A6.98 6.98 0 0111 18c-3.86 0-7-3.14-7-7z"};const Ks=(0,$e.aZ)({name:"DocIconSearch"}),Xs=(0,c.Z)(Ks,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Js)}]]);var Qs={d:"M12 23c-.15 0-.31-.04-.45-.11C11.2 22.72 3 18.54 3 12V5c0-.42.26-.79.65-.94l8-3c.23-.08.48-.08.7 0l8 3c.39.15.65.52.65.94v7c0 6.54-8.2 10.72-8.55 10.89-.14.07-.3.11-.45.11zM5 5.69V12c0 4.55 5.39 7.95 7 8.86 1.61-.92 7-4.33 7-8.86V5.69l-7-2.63-7 2.63z"};const ea=(0,$e.aZ)({name:"DocIconShield"}),ta=(0,c.Z)(ea,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Qs)}]]);var na={d:"M12 6c-3.31 0-6 2.69-6 6s2.69 6 6 6 6-2.69 6-6-2.69-6-6-6zm0 10c-2.21 0-4-1.79-4-4s1.79-4 4-4 4 1.79 4 4-1.79 4-4 4zM12 4c.55 0 1-.45 1-1V1c0-.55-.45-1-1-1s-1 .45-1 1v2c0 .55.45 1 1 1zM12 20c-.55 0-1 .45-1 1v2c0 .55.45 1 1 1s1-.45 1-1v-2c0-.55-.45-1-1-1zM4.93 6.35c.2.2.45.29.71.29s.51-.1.71-.29a.996.996 0 000-1.41L4.93 3.51a.996.996 0 10-1.41 1.41l1.41 1.43zM19.07 17.65a.996.996 0 10-1.41 1.41l1.42 1.42c.2.2.45.29.71.29s.51-.1.71-.29a.996.996 0 000-1.41l-1.43-1.42zM4 12c0-.55-.45-1-1-1H1c-.55 0-1 .45-1 1s.45 1 1 1h2c.55 0 1-.45 1-1zM23 11h-2c-.55 0-1 .45-1 1s.45 1 1 1h2c.55 0 1-.45 1-1s-.45-1-1-1zM4.93 17.65l-1.42 1.42a.996.996 0 00.71 1.7c.26 0 .51-.1.71-.29l1.42-1.42c.39-.39.39-1.02 0-1.41s-1.03-.39-1.42 0zM18.36 6.64c.26 0 .51-.1.71-.29l1.42-1.42a.996.996 0 10-1.41-1.41l-1.42 1.42a.996.996 0 00.7 1.7z"};const ra=(0,$e.aZ)({name:"DocIconSun"}),oa=(0,c.Z)(ra,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",na)}]]);var ia={d:"M13.41 12l5.29-5.29a.996.996 0 10-1.41-1.41L12 10.59l-5.29-5.3A.996.996 0 105.3 6.7l5.29 5.3-5.29 5.29a.996.996 0 000 1.41c.19.2.44.3.7.3s.51-.1.71-.29l5.29-5.3 5.29 5.29c.2.2.45.3.71.3s.51-.1.71-.29a.996.996 0 000-1.41l-5.3-5.3z"};const sa=(0,$e.aZ)({name:"DocIconX"}),aa=(0,c.Z)(sa,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",ia)}]])},6850:(e,t,n)=>{"use strict";n.d(t,{w:()=>o});var r=n(7023);function o(e){(0,r.zX)(document.body,"click",(function(t){e(t)}))}},7023:(e,t,n)=>{"use strict";n.d(t,{zX:()=>o,Up:()=>i,BK:()=>s});var r=n(4359);function o(e,t,n){var o=function(){return e.removeEventListener(t,n)};return(0,r.bv)((function(){e&&e.addEventListener(t,n)})),(0,r.Jd)(o),o}function i(e,t,n,r,i){return o(e,t,s(n,r,i))}function s(e,t,n){var r,o=0,i=-1;return function(){++o%t==0?e():(i=o,r||(r=setTimeout((function(){var t=i>=o;o=0,i=-1,r=void 0,t&&e()}),n,null)))}}},2376:(e,t,n)=>{"use strict";n.d(t,{i:()=>o});var r=n(4359);function o(e){var t=(0,r.iH)(),n=(0,r.iH)(!1),o=(0,r.iH)(null);return{result:t,loading:n,error:o,execute:function(r,i){return s=this,a=void 0,c=function(){var s,a,l,c;return function(e,t){var n,r,o,i,s={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function a(i){return function(a){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;s;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return s.label++,{value:i[1],done:!1};case 5:s.label++,r=i[1],i=[0];continue;case 7:i=s.ops.pop(),s.trys.pop();continue;default:if(!((o=(o=s.trys).length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){s=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){s.label=i[1];break}if(6===i[0]&&s.label<o[1]){s.label=o[1],o=i;break}if(o&&s.label<o[2]){s.label=o[2],s.ops.push(i);break}o[2]&&s.ops.pop(),s.trys.pop();continue}i=t.call(e,s)}catch(e){i=[6,e],r=0}finally{n=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,a])}}}(this,(function(u){switch(u.label){case 0:return u.trys.push([0,6,7,8]),n.value=!0,[4,fetch(r,i)];case 1:if(!(s=u.sent()).ok)throw new Error(s.statusText);return e?[4,e(s)]:[3,3];case 2:return l=u.sent(),[3,5];case 3:return[4,s.json()];case 4:l=u.sent(),u.label=5;case 5:return a=l,t.value=a,[3,8];case 6:return c=u.sent(),o.value=c,[3,8];case 7:return n.value=!1,[7];case 8:return[2]}}))},new((l=void 0)||(l=Promise))((function(e,t){function n(e){try{o(c.next(e))}catch(e){t(e)}}function r(e){try{o(c.throw(e))}catch(e){t(e)}}function o(t){var o;t.done?e(t.value):(o=t.value,o instanceof l?o:new l((function(e){e(o)}))).then(n,r)}o((c=c.apply(s,a||[])).next())}));var s,a,l,c}}}},5701:(e,t,n)=>{"use strict";n.d(t,{Ke:()=>i,Mu:()=>s,ft:()=>a});var r=n(7648),o=n(4359),i=(0,r.MT)("retype","store"),s=Symbol("DocsIdbStore");function a(){return{idbStore:(0,o.f3)(s)}}},8816:(e,t,n)=>{"use strict";n.d(t,{xf:()=>k,v2:()=>T,Rx:()=>O});var r=n(4359),o=n(7648),i=n(1296),s=n.n(i),a=n(6184),l=n(9984),c=n.n(l);const u=()=>window.__DOCS_LUNR__;var d=n.n(u),f=n(5701),h=n(6850),p=n(5184),m=n(2626),v=n(5543),g=n(2376),b=n(2110),y=n(7755),w=function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function s(e){try{l(r.next(e))}catch(e){i(e)}}function a(e){try{l(r.throw(e))}catch(e){i(e)}}function l(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}l((r=r.apply(e,t||[])).next())}))},x=function(e,t){var n,r,o,i,s={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function a(i){return function(a){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;s;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return s.label++,{value:i[1],done:!1};case 5:s.label++,r=i[1],i=[0];continue;case 7:i=s.ops.pop(),s.trys.pop();continue;default:if(!((o=(o=s.trys).length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){s=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){s.label=i[1];break}if(6===i[0]&&s.label<o[1]){s.label=o[1],o=i;break}if(o&&s.label<o[2]){s.label=o[2],s.ops.push(i);break}o[2]&&s.ops.pop(),s.trys.pop();continue}i=t.call(e,s)}catch(e){i=[6,e],r=0}finally{n=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,a])}}},k=Symbol("DocsSearch"),S=(0,f.ft)().idbStore,E=!1;function C(e,t){var n;return w(this,void 0,void 0,(function(){var r,o,i;return x(this,(function(s){switch(s.label){case 0:return r={map:null,index:null},e.length&&t?(r.map=function(e,t){var n=0,r=0,o=new Map,i=c().appendDocumentName?c().documentName:"";return function e(t,s,a){t.forEach((function(t){var l=a?a+" > "+t.label:t.label;t.clickable&&(s[r].forEach((function(e){var r,s,a,u=e.i||(null===(r=e.l)||void 0===r?void 0:r.toLowerCase().replace(/[\s\-.]+/g,"-"));if(u&&(e.l||(null===(s=e.p)||void 0===s?void 0:s.length))){var d=u&&"#"!==u?"#"+u:"",f="/"===t.path?"".concat(i).concat(d):!c().trailingSlash&&i&&t.path?"".concat(t.path,"/").concat(i).concat(d):"".concat(t.path).concat(i).concat(d);e.l&&o.set((++n).toString(),{path:f,text:e.l,page:l}),(null===(a=e.p)||void 0===a?void 0:a.length)&&e.p.forEach((function(t){o.set((++n).toString(),{path:f,text:t,heading:e.l,page:l})}))}})),r++),t.children&&e(t.children,s,l)}))}(e,t,""),o}(e,t),null==r.map?[3,2]:[4,(0,y.T)("lunr-js",d())]):[2,r];case 1:(o=s.sent())&&(i=[],null===(n=r.map)||void 0===n||n.forEach((function(e,t){return i.push([t,e])})),r.index=o.createIndex(i)),s.label=2;case 2:return[2,r]}}))}))}function _(){return"/"===c().base?"search":c().base+"search"}function T(){return w(this,void 0,void 0,(function(){var e;return x(this,(function(t){switch(t.label){case 0:return e=_(),[4,(0,o.IV)(e,S)];case 1:return t.sent(),E=!0,[2]}}))}))}function O(e){var t=this,n=(0,m.oR)().store,i=(0,r.iH)(null),l=(0,r.iH)(null),u=(0,r.Fl)((function(){return n.state.searchQuery})),f=(0,r.iH)([]),k=(0,r.iH)(!1),T=(0,r.iH)(!1),O=(0,r.iH)(0),L=(0,r.Fl)((function(){var t;return null===(t=e.value)||void 0===t?void 0:t.querySelector("input")}));function R(e){var t,n,r,o,s;return w(this,void 0,void 0,(function(){var a,u,h,p,m,v,g,b;return x(this,(function(w){switch(w.label){case 0:return l.value&&i.value?e?e.length>=c().search.minChars?(a=[],[4,(0,y.T)("lunr-js",d())]):[3,2]:(f.value=[],[2]):[2];case 1:for((u=w.sent())&&(h=e.toLowerCase().trim(),a=u.query(l.value,h)),p=[],m=0;m<c().search.maxResults&&a[m];m++)(v=i.value.get(a[m].ref))&&(g=D(null===(t=a[m].matchData)||void 0===t?void 0:t.metadata),b=A(null!==(n=v.text)&&void 0!==n?n:"",g),p.push({id:a[m].ref,path:null!==(r=v.path)&&void 0!==r?r:"",heading:null!==(o=v.heading)&&void 0!==o?o:"",page:null!==(s=v.page)&&void 0!==s?s:"",text:b}));f.value=p,w.label=2;case 2:return[2]}}))}))}function D(e){var t,n,r,o=[],i=e;if(i)for(var s in i){var a=null===(n=null===(t=i[s])||void 0===t?void 0:t.text)||void 0===n?void 0:n.position;if(null==a?void 0:a.length)for(var l=0;l<a.length;++l)2===(null===(r=a[l])||void 0===r?void 0:r.length)&&a[l][1]>0&&o.push([a[l][0],a[l][0]+a[l][1]])}return o}function A(e,t,n){if(void 0===n&&(n=24),!t.length){var r=e.trim().split(/\s+/).filter((function(e){return e}));return r.length>n&&(r=r.slice(0,n)).push("..."),r.join(" ")}t.sort((function(e,t){return e[0]-t[0]}));for(var o=t.length-2;o>=0;--o)t[o][1]>=t[o+1][0]&&(t[o][1]=Math.max(t[o][1],t[o+1][1]),t.splice(o+1,1));var i=[],s=0,a=-1,l=-1;for(o=0;o<t.length;++o){var c=t[o][0],u=t[o][1],d=e.slice(s,c);if(d){var f=d.trim().split(/\s+/).filter((function(e){return e})).map((function(e){return[e,!1]}));i.push.apply(i,f)}-1===a?(a=i.length,l=i.length):l=i.length,i.push(['<span class="text-blue-500 dark:text-blue-400 font-semibold">'.concat(e.slice(c,u),"</span>"),!0]),s=u}if(s<e.length){var h=e.slice(s);if(h){var p=h.trim().split(/\s+/).filter((function(e){return e})).map((function(e){return[e,!1]}));i.push.apply(i,p)}}for(var m=0,v=1+l-a,g=i.length-1;v<n;){if(a>0&&(m%2==0||l>=g))--a;else{if(!(l<g))break;++l}++m,++v}v>n&&(l-=v-n);var b=i.slice(a,l+1).map((function(e){return e[0]}));return a>0&&b.splice(0,0,"..."),l<i.length-1&&b.push("..."),b.join(" ")}(0,r.YP)(u,s()((function(e){return w(this,void 0,void 0,(function(){return x(this,(function(t){switch(t.label){case 0:return[4,R(e)];case 1:return t.sent(),e.length>=c().search.minChars||f.value.length>0?k.value=!0:(k.value=!1,O.value=0),[2]}}))}))}),50)),(0,h.w)((function(t){var n,r=t.target;e.value===r||(null===(n=e.value)||void 0===n?void 0:n.contains(r))||(T.value=!1)}));var I=(0,p.B)().scrollTo;function M(e){var t;if(k.value=!1,T.value=!1,O.value=0,setTimeout((function(){var e;null===(e=L.value)||void 0===e||e.blur()}),100),e){(0,a.Vn)(e);var o=null===(t=e.split("/").pop())||void 0===t?void 0:t.substring(1);if(o&&document.getElementById(o)){if(o.split("-").length>1){var i=!1;for(var s in n.state.memberGroups){if(i)break;for(var l in n.state.memberGroups[s])if(o===l){n.state.memberGroups[s][l].isOpen=!0,i=!0;break}}}(0,r.Y3)((function(){I("#".concat(o),{offset:v.vE,onDone:function(){n.actions.updateScrolledElementId(o)}})}))}}}function F(){var t,n=null===(t=e.value)||void 0===t?void 0:t.querySelector("ul"),r=null==n?void 0:n.children.item(O.value);null==r||r.scrollIntoView({block:"nearest"})}var P=c().preloadSearch?(0,g.i)((function(e){return w(t,void 0,void 0,(function(){var t,n,r;return x(this,(function(o){switch(o.label){case 0:return"file:"===location.protocol.toLowerCase()?[2,void 0]:[4,e.text()];case 1:return t=o.sent(),n=t.indexOf("="),r=t.slice(n+1).trim().slice(0,-1),[2,JSON.parse(r)]}}))}))})):(0,g.i)(),H=P.execute,N=P.error,j=P.result,W=c().preloadSearch?"js":"json",B=c().cacheBustingToken&&"none"!=c().cacheBustingStrategy?"path"==c().cacheBustingStrategy?"".concat(location.origin).concat(b.uj,".").concat(c().cacheBustingToken,".").concat(W):"".concat(location.origin).concat(b.uj,".").concat(W,"?v=").concat(c().cacheBustingToken):"".concat(location.origin).concat(b.uj,".").concat(W),z=(0,r.Fl)((function(){return n.state.sidebar})),V=_();(0,r.YP)(T,(function(e){e&&(function(){w(this,void 0,void 0,(function(){var e,t,n,r,s,a,u;return x(this,(function(f){switch(f.label){case 0:return[4,(0,o.U2)(V,S)];case 1:return(e=f.sent())&&e.id===c().id?(i.value||(i.value=e.map),l.value?[3,3]:[4,(0,y.T)("lunr-js",d())]):[3,4];case 2:(t=f.sent())&&(n=JSON.parse(e.index),l.value=t.loadIndex(n)),f.label=3;case 3:return[3,10];case 4:return[4,(0,o.IV)(V,S)];case 5:return f.sent(),r=void 0,!E&&c().preloadSearch?[3,7]:[4,H(B)];case 6:if(f.sent(),N.value)throw new Error("Error fetching search data. ".concat(N.value));r=j.value,f.label=7;case 7:return r||(r=window.__DOCS_SEARCH__),E=!1,[4,C(z.value.data,r)];case 8:return s=f.sent(),a=s.index,u=s.map,i.value=u,l.value=a,[4,(0,o.t8)(V,{index:JSON.stringify(a),map:u,id:c().id},S)];case 9:f.sent(),f.label=10;case 10:return[2]}}))}))}(),F())}));var q=(0,r.qj)({input:L,isOpen:k,isFocused:T,results:f,focusIndex:O,clear:function(){var e;n.actions.updateSearchQuery(""),null===(e=L.value)||void 0===e||e.focus()},onKeydown:function(e){if(f.value.length)switch(e.code){case"ArrowDown":e.preventDefault(),O.value<f.value.length-1&&(O.value++,F());break;case"ArrowUp":e.preventDefault(),O.value>0&&(O.value--,F());break;case"Enter":e.preventDefault(),M(f.value[O.value].path);break;case"Escape":k.value=!1,n.actions.updateSearchQuery("")}},navigateToResult:M});return q}},5184:(e,t,n)=>{"use strict";function r(){var e={duration:500,offset:0},t=null;return{scrollTo:function(n,r){var o,i=Object.assign({},e,r),s=decodeURI(n),a=null!==(o=document.getElementById(n.startsWith("#")?s.slice(1):n))&&void 0!==o?o:document.querySelector(s);if(!a)throw new Error("Invalid target");var l="function"==typeof i.offset?i.offset():i.offset,c=a.getBoundingClientRect().top,u=window.scrollY||window.pageYOffset,d=c+u-u+l;i.onStart&&"function"==typeof i.onStart&&i.onStart(),window.requestAnimationFrame((function e(n){t||(t=n);var r=n-t,o=function(e,t,n,r){return-n*(e/=r)*(e-2)+t}(r,u,d,i.duration);window.scrollTo(0,o),r<i.duration?window.requestAnimationFrame(e):(i.onDone&&"function"==typeof i.onDone&&i.onDone(),t=null)}))}}}n.d(t,{B:()=>r})},2110:(e,t,n)=>{"use strict";n.d(t,{as:()=>s,uj:()=>a,bT:()=>l,u:()=>c});var r=n(9984),o=n.n(r),i="resources",s="".concat(o().base).concat(i,"/nav"),a="".concat(o().base).concat(i,"/js/search"),l=new Uint8Array([83,72,65,45,50,53,54]),c=new Uint8Array([82,83,65,83,83,65,45,80,75,67,83,49,45,118,49,95,53])},7755:(e,t,n)=>{"use strict";function r(e,t,n){var o=t();if(o&&o.default)n(o.default);else if(e){var i=document.getElementById(e);i&&i.addEventListener("load",(function(){return r(null,t,n)}))}}function o(e,t){return new Promise((function(n,o){try{r(e,t,(function(e){n(e)}))}catch(e){o(e)}}))}n.d(t,{b:()=>r,T:()=>o})},2626:(e,t,n)=>{"use strict";n.d(t,{$Q:()=>c,h:()=>d,oR:()=>f});var r=n(9984),o=n.n(r),i=n(4359),s=n(5543),a=n(872);(0,i.aZ)({name:"DocStoreDebug",setup:function(){var e=(0,i.iH)(!1),t=(0,i.Fl)((function(){return d.state})),n=(0,i.Fl)((function(){return{"top-0 max-w-md p-5 text-sm":e.value,"px-3 flex items-center text-xs mr-0 mb-0":!e.value}}));return{state:t,isOpen:e,classes:n,toggle:function(){e.value=!e.value}}}});var l=function(){return l=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},l.apply(this,arguments)},c=Symbol("DocsStore"),u={inherited:!0,access:o().access.map((function(e){return e.value}))},d={state:(0,i.qj)({initialPageLoad:!0,unloading:!1,inherited:u.inherited,isWindowScrolling:!1,isScrollPositionRestored:!1,memberFilter:"",scrolledElementId:"",searchQuery:"",sidebarRightHasContent:!1,sidebarScroll:0,sidebarActiveEl:void 0,sidebar:{id:"",data:[]},sidebarLookup:new Map,memberGroups:(0,a.s)(),access:u.access}),actions:{setMemberData:function(e,t,n,r){d.state.memberGroups[e][t]||(d.state.memberGroups[e][t]={isOpen:!1,isVisible:!0,animations:!0,access:"public",name:"UnknownMember"}),d.state.memberGroups[e][t][n]=r},resetMemberData:function(){Object.keys(d.state.memberGroups).forEach((function(e){d.state.memberGroups[e]={}}))},updateAccess:function(e){d.state.access=e,(0,s.Nh)(o().base,localStorage,"doc_access",e)},setInherited:function(e){d.state.inherited=e},toggleInherited:function(){d.state.inherited=!d.state.inherited,(0,s.Nh)(o().base,localStorage,"doc_inherited",d.state.inherited)},updateMemberFilter:function(e){d.state.memberFilter=e},updateScrolledElementId:function(e){d.state.scrolledElementId=e},updateSearchQuery:function(e){d.state.searchQuery=e},setSidebarData:function(e){d.state.sidebar=e,(0,s.Nh)(o().base,sessionStorage,"doc_sidebar",e)},setSidebarLookupData:function(e){d.state.sidebarLookup=e},setSidebarScroll:function(e){d.state.sidebarScroll=e,(0,s.Nh)(o().base,sessionStorage,"doc_sidebar_scroll",e)},setActiveSidebarEl:function(e){d.state.sidebarActiveEl=e},setWindowScrollingState:function(e){d.state.isWindowScrolling=e},updateSidebarLookupItem:function(e,t,n){e[t]=n;var r=(0,s.qn)(o().base,sessionStorage,"doc_sidebar");r&&(0,s.Nh)(o().base,sessionStorage,"doc_sidebar",l(l({},r),d.state.sidebar))}},getters:{isAccessDirty:function(){return u.access.length!==d.state.access.length},isFiltersDirty:function(){return u.access.length!==d.state.access.length||u.inherited!==d.state.inherited||""!==d.state.memberFilter},getVisibleGroupMembers:function(e){return Object.values(d.state.memberGroups[e]).filter((function(e){return!0===e.isVisible}))}}};function f(){return{store:(0,i.f3)(c)}}},872:(e,t,n)=>{"use strict";n.d(t,{s:()=>s,g:()=>a});var r=n(9984),o=n.n(r),i=n(5543);function s(){var e={};return o().toolbarLinks.forEach((function(t){e[t.id]={}})),e}function a(e){if(e.state.initialPageLoad){var t=(0,i.qn)(o().base,sessionStorage,"doc_sidebar_scroll");null!==t&&e.actions.setSidebarScroll(t);var n=(0,i.qn)(o().base,sessionStorage,"doc_sidebar");null!==n&&e.actions.setSidebarData(n);var r=(0,i.qn)(o().base,localStorage,"doc_inherited");null!==r&&e.actions.setInherited(r);var s=(0,i.qn)(o().base,localStorage,"doc_access");null!==s&&e.actions.updateAccess(s)}}},5543:(e,t,n)=>{"use strict";n.d(t,{qn:()=>o,Nh:()=>i,vE:()=>s,Sy:()=>a,am:()=>l,rw:()=>d,pI:()=>h});var r=function(e,t,n){if(n||2===arguments.length)for(var r,o=0,i=t.length;o<i;o++)!r&&o in t||(r||(r=Array.prototype.slice.call(t,0,o)),r[o]=t[o]);return e.concat(r||Array.prototype.slice.call(t))};function o(e,t,n){var r=c(e,n),o=t.getItem(r);return o&&"null"!==o?"{"===o[0]||"["===o[0]||'"'===o[0]||"true"===o||"false"===o?JSON.parse(o):o:null}function i(e,t,n,r){var o=c(e,n),i="string"!=typeof r?JSON.stringify(r):r;t.setItem(o,i)}function s(){var e=document.getElementById("docs-site-header"),t=document.getElementById("docs-toolbar"),n=20;return n+=e?e.offsetHeight:0,-(n+=t?t.offsetHeight:0)}function a(e){var t,n,r={y:31536e3,mo:2592e3,d:86400,h:3600,m:60,s:1},o=Math.floor((Date.now()-e)/1e3);return Object.keys(r).some((function(e){return t=Math.floor(o/r[e]),n=e,t>=1})),0===t?"just now":"".concat(t).concat(n," ago")}function l(e,t,n,r,o){if(void 0===r&&(r=""),void 0===o&&(o=[]),!t||!t.length)return[];var i=[];return t.forEach((function(t){var s,a=u(e,t,n,r,o);(null===(s=a.parentNodes)||void 0===s?void 0:s.length)&&a.parentNodes.splice(-1,1),i.push(a)})),i}function c(e,t){return e&&"/"!==e?e+t:t}function u(e,t,n,o,i){void 0===o&&(o=""),void 0===i&&(i=[]);var s={};s.path=n?t.n.startsWith("/")?"".concat(t.n.slice(1),"/"):"".concat(o).concat(t.n,"/"):t.n.startsWith("/")?"".concat(t.n.slice(1)):!o||o.endsWith("/")?"".concat(o).concat(t.n):"".concat(o,"/").concat(t.n),s.parentNodes=i.length?r(r([],i,!0),[s.path],!1):[s.path];var a=t.i||t.h;return a&&e.set(s.path,s),s.clickable=!1!==t.c,s.visible=!1!==t.v,t.s&&(s.icon=t.s),t.e&&(s.emoji=t.e),t.h&&(s.hash=t.h),s.label=t.l||t.n,t.u&&(s.url=t.u),s.searchLabel=s.label.toLowerCase(),t.o&&(s.open=t.o),a&&(s.children=l(e,t.i,n,s.path,s.parentNodes)),s}function d(e,t,n,r){void 0===r&&(r=""),t&&t.length&&t.forEach((function(t){var o=n?"".concat(r).concat(t.n,"/"):!r||r.endsWith("/")?"".concat(r).concat(t.n):"".concat(r,"/").concat(t.n);if(e.get(o))d(e,t.i,n,o);else{var i=e.get(r);if(!i)throw new Error("Unexpected state. The parent node must exist at this point.");var s=u(e,t,n,r);if(i.children){var a=function(e,t){var n=0,r=e.length-1;if(r<n)return 0;for(;;){var o=Math.floor((n+r)/2),i=f(e[o].label,t.label);if(i<0){if((n=o+1)>r)return n}else{if(!(i>0))return o;if((r=o-1)<n)return o}}}(i.children,s);i.children.splice(a,0,s)}}}))}function f(e,t){if(null==t)return 1;if(null==e)return-1;var n=e.toUpperCase(),r=t.toUpperCase();return n>r?1:n<r?-1:0}function h(e){return e.ctrlKey||e.shiftKey||e.altKey||e.metaKey}},3744:(e,t)=>{"use strict";t.Z=(e,t)=>{const n=e.__vccOpts||e;for(const[e,r]of t)n[e]=r;return n}},4359:(e,t,n)=>{"use strict";n.d(t,{HY:()=>o.HY,lR:()=>o.lR,uT:()=>I,Fl:()=>o.Fl,ri:()=>Oe,j4:()=>o.j4,kq:()=>o.kq,iD:()=>o.iD,_:()=>o._,Uk:()=>o.Uk,Wm:()=>o.Wm,aZ:()=>o.aZ,h:()=>o.h,f3:()=>o.f3,Y3:()=>o.Y3,C_:()=>o.C_,j5:()=>o.j5,Jd:()=>o.Jd,bv:()=>o.bv,wg:()=>o.wg,Cn:()=>o.Cn,JJ:()=>o.JJ,dD:()=>o.dD,qj:()=>o.qj,iH:()=>o.iH,Ko:()=>o.Ko,WI:()=>o.WI,up:()=>o.up,LL:()=>o.LL,qZ:()=>o.qZ,zw:()=>o.zw,e8:()=>ie,nr:()=>oe,F8:()=>ye,YP:()=>o.YP,m0:()=>o.m0,w5:()=>o.w5,wy:()=>o.wy,D2:()=>be,iM:()=>ve});var r={};n.r(r),n.d(r,{BaseTransition:()=>o.P$,Comment:()=>o.sv,EffectScope:()=>o.Bj,Fragment:()=>o.HY,KeepAlive:()=>o.Ob,ReactiveEffect:()=>o.qq,Static:()=>o.qG,Suspense:()=>o.n4,Teleport:()=>o.lR,Text:()=>o.xv,Transition:()=>I,TransitionGroup:()=>K,VueElement:()=>_,callWithAsyncErrorHandling:()=>o.$d,callWithErrorHandling:()=>o.KU,camelize:()=>o._A,capitalize:()=>o.kC,cloneVNode:()=>o.Ho,compatUtils:()=>o.ry,computed:()=>o.Fl,createApp:()=>Oe,createBlock:()=>o.j4,createCommentVNode:()=>o.kq,createElementBlock:()=>o.iD,createElementVNode:()=>o._,createHydrationRenderer:()=>o.Eo,createPropsRestProxy:()=>o.p1,createRenderer:()=>o.Us,createSSRApp:()=>Le,createSlots:()=>o.Nv,createStaticVNode:()=>o.uE,createTextVNode:()=>o.Uk,createVNode:()=>o.Wm,customRef:()=>o.ZM,defineAsyncComponent:()=>o.RC,defineComponent:()=>o.aZ,defineCustomElement:()=>S,defineEmits:()=>o.Bz,defineExpose:()=>o.WY,defineProps:()=>o.MW,defineSSRCustomElement:()=>E,devtools:()=>o.mW,effect:()=>o.cE,effectScope:()=>o.B,getCurrentInstance:()=>o.FN,getCurrentScope:()=>o.nZ,getTransitionRawChildren:()=>o.Q6,guardReactiveProps:()=>o.F4,h:()=>o.h,handleError:()=>o.S3,hydrate:()=>Te,initCustomFormatter:()=>o.Mr,initDirectivesForSSR:()=>Ae,inject:()=>o.f3,isMemoSame:()=>o.nQ,isProxy:()=>o.X3,isReactive:()=>o.PG,isReadonly:()=>o.$y,isRef:()=>o.dq,isRuntimeOnly:()=>o.of,isShallow:()=>o.yT,isVNode:()=>o.lA,markRaw:()=>o.Xl,mergeDefaults:()=>o.u_,mergeProps:()=>o.dG,nextTick:()=>o.Y3,normalizeClass:()=>o.C_,normalizeProps:()=>o.vs,normalizeStyle:()=>o.j5,onActivated:()=>o.dl,onBeforeMount:()=>o.wF,onBeforeUnmount:()=>o.Jd,onBeforeUpdate:()=>o.Xn,onDeactivated:()=>o.se,onErrorCaptured:()=>o.d1,onMounted:()=>o.bv,onRenderTracked:()=>o.bT,onRenderTriggered:()=>o.Yq,onScopeDispose:()=>o.EB,onServerPrefetch:()=>o.vl,onUnmounted:()=>o.Ah,onUpdated:()=>o.ic,openBlock:()=>o.wg,popScopeId:()=>o.Cn,provide:()=>o.JJ,proxyRefs:()=>o.WL,pushScopeId:()=>o.dD,queuePostFlushCb:()=>o.qb,reactive:()=>o.qj,readonly:()=>o.OT,ref:()=>o.iH,registerRuntimeCompiler:()=>o.Y1,render:()=>_e,renderList:()=>o.Ko,renderSlot:()=>o.WI,resolveComponent:()=>o.up,resolveDirective:()=>o.Q2,resolveDynamicComponent:()=>o.LL,resolveFilter:()=>o.eq,resolveTransitionHooks:()=>o.U2,setBlockTracking:()=>o.qZ,setDevtoolsHook:()=>o.ec,setTransitionHooks:()=>o.nK,shallowReactive:()=>o.Um,shallowReadonly:()=>o.YS,shallowRef:()=>o.XI,ssrContextKey:()=>o.Uc,ssrUtils:()=>o.G,stop:()=>o.sT,toDisplayString:()=>o.zw,toHandlerKey:()=>o.hR,toHandlers:()=>o.mx,toRaw:()=>o.IU,toRef:()=>o.Vh,toRefs:()=>o.BK,transformVNodeArgs:()=>o.C3,triggerRef:()=>o.oR,unref:()=>o.SU,useAttrs:()=>o.l1,useCssModule:()=>T,useCssVars:()=>O,useSSRContext:()=>o.Zq,useSlots:()=>o.Rr,useTransitionState:()=>o.Y8,vModelCheckbox:()=>ie,vModelDynamic:()=>fe,vModelRadio:()=>ae,vModelSelect:()=>le,vModelText:()=>oe,vShow:()=>ye,version:()=>o.i8,warn:()=>o.ZK,watch:()=>o.YP,watchEffect:()=>o.m0,watchPostEffect:()=>o.Rh,watchSyncEffect:()=>o.yX,withAsyncContext:()=>o.mv,withCtx:()=>o.w5,withDefaults:()=>o.b9,withDirectives:()=>o.wy,withKeys:()=>be,withMemo:()=>o.MX,withModifiers:()=>ve,withScopeId:()=>o.HX});var o=n(6252),i=n(3577),s=n(2262);const a="undefined"!=typeof document?document:null,l=a&&a.createElement("template"),c={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?a.createElementNS("http://www.w3.org/2000/svg",e):a.createElement(e,n?{is:n}:void 0);return"select"===e&&r&&null!=r.multiple&&o.setAttribute("multiple",r.multiple),o},createText:e=>a.createTextNode(e),createComment:e=>a.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>a.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,i){const s=n?n.previousSibling:t.lastChild;if(o&&(o===i||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),o!==i&&(o=o.nextSibling););else{l.innerHTML=r?`<svg>${e}</svg>`:e;const o=l.content;if(r){const e=o.firstChild;for(;e.firstChild;)o.appendChild(e.firstChild);o.removeChild(e)}t.insertBefore(o,n)}return[s?s.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},u=/\s*!important$/;function d(e,t,n){if((0,i.kJ)(n))n.forEach((n=>d(e,t,n)));else if(t.startsWith("--"))e.setProperty(t,n);else{const r=function(e,t){const n=h[t];if(n)return n;let r=(0,i._A)(t);if("filter"!==r&&r in e)return h[t]=r;r=(0,i.kC)(r);for(let n=0;n<f.length;n++){const o=f[n]+r;if(o in e)return h[t]=o}return t}(e,t);u.test(n)?e.setProperty((0,i.rs)(r),n.replace(u,""),"important"):e[r]=n}}const f=["Webkit","Moz","ms"],h={},p="http://www.w3.org/1999/xlink";let m=Date.now,v=!1;if("undefined"!=typeof window){m()>document.createEvent("Event").timeStamp&&(m=()=>performance.now());const e=navigator.userAgent.match(/firefox\/(\d+)/i);v=!!(e&&Number(e[1])<=53)}let g=0;const b=Promise.resolve(),y=()=>{g=0};function w(e,t,n,r){e.addEventListener(t,n,r)}const x=/(?:Once|Passive|Capture)$/,k=/^on[a-z]/;function S(e,t){const n=(0,o.aZ)(e);class r extends _{constructor(e){super(n,e,t)}}return r.def=n,r}const E=e=>S(e,Te),C="undefined"!=typeof HTMLElement?HTMLElement:class{};class _ extends C{constructor(e,t={},n){super(),this._def=e,this._props=t,this._instance=null,this._connected=!1,this._resolved=!1,this._numberProps=null,this.shadowRoot&&n?n(this._createVNode(),this.shadowRoot):this.attachShadow({mode:"open"})}connectedCallback(){this._connected=!0,this._instance||this._resolveDef()}disconnectedCallback(){this._connected=!1,(0,o.Y3)((()=>{this._connected||(_e(null,this.shadowRoot),this._instance=null)}))}_resolveDef(){if(this._resolved)return;this._resolved=!0;for(let e=0;e<this.attributes.length;e++)this._setAttr(this.attributes[e].name);new MutationObserver((e=>{for(const t of e)this._setAttr(t.attributeName)})).observe(this,{attributes:!0});const e=e=>{const{props:t,styles:n}=e,r=!(0,i.kJ)(t),o=t?r?Object.keys(t):t:[];let s;if(r)for(const e in this._props){const n=t[e];(n===Number||n&&n.type===Number)&&(this._props[e]=(0,i.He)(this._props[e]),(s||(s=Object.create(null)))[e]=!0)}this._numberProps=s;for(const e of Object.keys(this))"_"!==e[0]&&this._setProp(e,this[e],!0,!1);for(const e of o.map(i._A))Object.defineProperty(this,e,{get(){return this._getProp(e)},set(t){this._setProp(e,t)}});this._applyStyles(n),this._update()},t=this._def.__asyncLoader;t?t().then(e):e(this._def)}_setAttr(e){let t=this.getAttribute(e);this._numberProps&&this._numberProps[e]&&(t=(0,i.He)(t)),this._setProp((0,i._A)(e),t,!1)}_getProp(e){return this._props[e]}_setProp(e,t,n=!0,r=!0){t!==this._props[e]&&(this._props[e]=t,r&&this._instance&&this._update(),n&&(!0===t?this.setAttribute((0,i.rs)(e),""):"string"==typeof t||"number"==typeof t?this.setAttribute((0,i.rs)(e),t+""):t||this.removeAttribute((0,i.rs)(e))))}_update(){_e(this._createVNode(),this.shadowRoot)}_createVNode(){const e=(0,o.Wm)(this._def,(0,i.l7)({},this._props));return this._instance||(e.ce=e=>{this._instance=e,e.isCE=!0,e.emit=(e,...t)=>{this.dispatchEvent(new CustomEvent(e,{detail:t}))};let t=this;for(;t=t&&(t.parentNode||t.host);)if(t instanceof _){e.parent=t._instance;break}}),e}_applyStyles(e){e&&e.forEach((e=>{const t=document.createElement("style");t.textContent=e,this.shadowRoot.appendChild(t)}))}}function T(e="$style"){{const t=(0,o.FN)();if(!t)return i.kT;const n=t.type.__cssModules;if(!n)return i.kT;return n[e]||i.kT}}function O(e){const t=(0,o.FN)();if(!t)return;const n=()=>L(t.subTree,e(t.proxy));(0,o.Rh)(n),(0,o.bv)((()=>{const e=new MutationObserver(n);e.observe(t.subTree.el.parentNode,{childList:!0}),(0,o.Ah)((()=>e.disconnect()))}))}function L(e,t){if(128&e.shapeFlag){const n=e.suspense;e=n.activeBranch,n.pendingBranch&&!n.isHydrating&&n.effects.push((()=>{L(n.activeBranch,t)}))}for(;e.component;)e=e.component.subTree;if(1&e.shapeFlag&&e.el)R(e.el,t);else if(e.type===o.HY)e.children.forEach((e=>L(e,t)));else if(e.type===o.qG){let{el:n,anchor:r}=e;for(;n&&(R(n,t),n!==r);)n=n.nextSibling}}function R(e,t){if(1===e.nodeType){const n=e.style;for(const e in t)n.setProperty(`--${e}`,t[e])}}const D="transition",A="animation",I=(e,{slots:t})=>(0,o.h)(o.P$,N(e),t);I.displayName="Transition";const M={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},F=I.props=(0,i.l7)({},o.P$.props,M),P=(e,t=[])=>{(0,i.kJ)(e)?e.forEach((e=>e(...t))):e&&e(...t)},H=e=>!!e&&((0,i.kJ)(e)?e.some((e=>e.length>1)):e.length>1);function N(e){const t={};for(const n in e)n in M||(t[n]=e[n]);if(!1===e.css)return t;const{name:n="v",type:r,duration:o,enterFromClass:s=`${n}-enter-from`,enterActiveClass:a=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=s,appearActiveClass:u=a,appearToClass:d=l,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:h=`${n}-leave-active`,leaveToClass:p=`${n}-leave-to`}=e,m=function(e){if(null==e)return null;if((0,i.Kn)(e))return[j(e.enter),j(e.leave)];{const t=j(e);return[t,t]}}(o),v=m&&m[0],g=m&&m[1],{onBeforeEnter:b,onEnter:y,onEnterCancelled:w,onLeave:x,onLeaveCancelled:k,onBeforeAppear:S=b,onAppear:E=y,onAppearCancelled:C=w}=t,_=(e,t,n)=>{B(e,t?d:l),B(e,t?u:a),n&&n()},T=(e,t)=>{B(e,p),B(e,h),t&&t()},O=e=>(t,n)=>{const o=e?E:y,i=()=>_(t,e,n);P(o,[t,i]),z((()=>{B(t,e?c:s),W(t,e?d:l),H(o)||q(t,r,v,i)}))};return(0,i.l7)(t,{onBeforeEnter(e){P(b,[e]),W(e,s),W(e,a)},onBeforeAppear(e){P(S,[e]),W(e,c),W(e,u)},onEnter:O(!1),onAppear:O(!0),onLeave(e,t){const n=()=>T(e,t);W(e,f),Y(),W(e,h),z((()=>{B(e,f),W(e,p),H(x)||q(e,r,g,n)})),P(x,[e,n])},onEnterCancelled(e){_(e,!1),P(w,[e])},onAppearCancelled(e){_(e,!0),P(C,[e])},onLeaveCancelled(e){T(e),P(k,[e])}})}function j(e){return(0,i.He)(e)}function W(e,t){t.split(/\s+/).forEach((t=>t&&e.classList.add(t))),(e._vtc||(e._vtc=new Set)).add(t)}function B(e,t){t.split(/\s+/).forEach((t=>t&&e.classList.remove(t)));const{_vtc:n}=e;n&&(n.delete(t),n.size||(e._vtc=void 0))}function z(e){requestAnimationFrame((()=>{requestAnimationFrame(e)}))}let V=0;function q(e,t,n,r){const o=e._endId=++V,i=()=>{o===e._endId&&r()};if(n)return setTimeout(i,n);const{type:s,timeout:a,propCount:l}=$(e,t);if(!s)return r();const c=s+"end";let u=0;const d=()=>{e.removeEventListener(c,f),i()},f=t=>{t.target===e&&++u>=l&&d()};setTimeout((()=>{u<l&&d()}),a+1),e.addEventListener(c,f)}function $(e,t){const n=window.getComputedStyle(e),r=e=>(n[e]||"").split(", "),o=r("transitionDelay"),i=r("transitionDuration"),s=U(o,i),a=r("animationDelay"),l=r("animationDuration"),c=U(a,l);let u=null,d=0,f=0;return t===D?s>0&&(u=D,d=s,f=i.length):t===A?c>0&&(u=A,d=c,f=l.length):(d=Math.max(s,c),u=d>0?s>c?D:A:null,f=u?u===D?i.length:l.length:0),{type:u,timeout:d,propCount:f,hasTransform:u===D&&/\b(transform|all)(,|$)/.test(n.transitionProperty)}}function U(e,t){for(;e.length<t.length;)e=e.concat(e);return Math.max(...t.map(((t,n)=>Z(t)+Z(e[n]))))}function Z(e){return 1e3*Number(e.slice(0,-1).replace(",","."))}function Y(){return document.body.offsetHeight}const G=new WeakMap,J=new WeakMap,K={name:"TransitionGroup",props:(0,i.l7)({},F,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=(0,o.FN)(),r=(0,o.Y8)();let i,a;return(0,o.ic)((()=>{if(!i.length)return;const t=e.moveClass||`${e.name||"v"}-move`;if(!function(e,t,n){const r=e.cloneNode();e._vtc&&e._vtc.forEach((e=>{e.split(/\s+/).forEach((e=>e&&r.classList.remove(e)))})),n.split(/\s+/).forEach((e=>e&&r.classList.add(e))),r.style.display="none";const o=1===t.nodeType?t:t.parentNode;o.appendChild(r);const{hasTransform:i}=$(r);return o.removeChild(r),i}(i[0].el,n.vnode.el,t))return;i.forEach(X),i.forEach(Q);const r=i.filter(ee);Y(),r.forEach((e=>{const n=e.el,r=n.style;W(n,t),r.transform=r.webkitTransform=r.transitionDuration="";const o=n._moveCb=e=>{e&&e.target!==n||e&&!/transform$/.test(e.propertyName)||(n.removeEventListener("transitionend",o),n._moveCb=null,B(n,t))};n.addEventListener("transitionend",o)}))})),()=>{const l=(0,s.IU)(e),c=N(l);let u=l.tag||o.HY;i=a,a=t.default?(0,o.Q6)(t.default()):[];for(let e=0;e<a.length;e++){const t=a[e];null!=t.key&&(0,o.nK)(t,(0,o.U2)(t,c,r,n))}if(i)for(let e=0;e<i.length;e++){const t=i[e];(0,o.nK)(t,(0,o.U2)(t,c,r,n)),G.set(t,t.el.getBoundingClientRect())}return(0,o.Wm)(u,null,a)}}};function X(e){const t=e.el;t._moveCb&&t._moveCb(),t._enterCb&&t._enterCb()}function Q(e){J.set(e,e.el.getBoundingClientRect())}function ee(e){const t=G.get(e),n=J.get(e),r=t.left-n.left,o=t.top-n.top;if(r||o){const t=e.el.style;return t.transform=t.webkitTransform=`translate(${r}px,${o}px)`,t.transitionDuration="0s",e}}const te=e=>{const t=e.props["onUpdate:modelValue"];return(0,i.kJ)(t)?e=>(0,i.ir)(t,e):t};function ne(e){e.target.composing=!0}function re(e){const t=e.target;t.composing&&(t.composing=!1,function(e,t){const n=document.createEvent("HTMLEvents");n.initEvent("input",!0,!0),e.dispatchEvent(n)}(t))}const oe={created(e,{modifiers:{lazy:t,trim:n,number:r}},o){e._assign=te(o);const s=r||o.props&&"number"===o.props.type;w(e,t?"change":"input",(t=>{if(t.target.composing)return;let r=e.value;n?r=r.trim():s&&(r=(0,i.He)(r)),e._assign(r)})),n&&w(e,"change",(()=>{e.value=e.value.trim()})),t||(w(e,"compositionstart",ne),w(e,"compositionend",re),w(e,"change",re))},mounted(e,{value:t}){e.value=null==t?"":t},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:r,number:o}},s){if(e._assign=te(s),e.composing)return;if(document.activeElement===e){if(n)return;if(r&&e.value.trim()===t)return;if((o||"number"===e.type)&&(0,i.He)(e.value)===t)return}const a=null==t?"":t;e.value!==a&&(e.value=a)}},ie={deep:!0,created(e,t,n){e._assign=te(n),w(e,"change",(()=>{const t=e._modelValue,n=ue(e),r=e.checked,o=e._assign;if((0,i.kJ)(t)){const e=(0,i.hq)(t,n),s=-1!==e;if(r&&!s)o(t.concat(n));else if(!r&&s){const n=[...t];n.splice(e,1),o(n)}}else if((0,i.DM)(t)){const e=new Set(t);r?e.add(n):e.delete(n),o(e)}else o(de(e,r))}))},mounted:se,beforeUpdate(e,t,n){e._assign=te(n),se(e,t,n)}};function se(e,{value:t,oldValue:n},r){e._modelValue=t,(0,i.kJ)(t)?e.checked=(0,i.hq)(t,r.props.value)>-1:(0,i.DM)(t)?e.checked=t.has(r.props.value):t!==n&&(e.checked=(0,i.WV)(t,de(e,!0)))}const ae={created(e,{value:t},n){e.checked=(0,i.WV)(t,n.props.value),e._assign=te(n),w(e,"change",(()=>{e._assign(ue(e))}))},beforeUpdate(e,{value:t,oldValue:n},r){e._assign=te(r),t!==n&&(e.checked=(0,i.WV)(t,r.props.value))}},le={deep:!0,created(e,{value:t,modifiers:{number:n}},r){const o=(0,i.DM)(t);w(e,"change",(()=>{const t=Array.prototype.filter.call(e.options,(e=>e.selected)).map((e=>n?(0,i.He)(ue(e)):ue(e)));e._assign(e.multiple?o?new Set(t):t:t[0])})),e._assign=te(r)},mounted(e,{value:t}){ce(e,t)},beforeUpdate(e,t,n){e._assign=te(n)},updated(e,{value:t}){ce(e,t)}};function ce(e,t){const n=e.multiple;if(!n||(0,i.kJ)(t)||(0,i.DM)(t)){for(let r=0,o=e.options.length;r<o;r++){const o=e.options[r],s=ue(o);if(n)(0,i.kJ)(t)?o.selected=(0,i.hq)(t,s)>-1:o.selected=t.has(s);else if((0,i.WV)(ue(o),t))return void(e.selectedIndex!==r&&(e.selectedIndex=r))}n||-1===e.selectedIndex||(e.selectedIndex=-1)}}function ue(e){return"_value"in e?e._value:e.value}function de(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const fe={created(e,t,n){he(e,t,n,null,"created")},mounted(e,t,n){he(e,t,n,null,"mounted")},beforeUpdate(e,t,n,r){he(e,t,n,r,"beforeUpdate")},updated(e,t,n,r){he(e,t,n,r,"updated")}};function he(e,t,n,r,o){let i;switch(e.tagName){case"SELECT":i=le;break;case"TEXTAREA":i=oe;break;default:switch(n.props&&n.props.type){case"checkbox":i=ie;break;case"radio":i=ae;break;default:i=oe}}const s=i[o];s&&s(e,t,n,r)}const pe=["ctrl","shift","alt","meta"],me={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&0!==e.button,middle:e=>"button"in e&&1!==e.button,right:e=>"button"in e&&2!==e.button,exact:(e,t)=>pe.some((n=>e[`${n}Key`]&&!t.includes(n)))},ve=(e,t)=>(n,...r)=>{for(let e=0;e<t.length;e++){const r=me[t[e]];if(r&&r(n,t))return}return e(n,...r)},ge={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},be=(e,t)=>n=>{if(!("key"in n))return;const r=(0,i.rs)(n.key);return t.some((e=>e===r||ge[e]===r))?e(n):void 0},ye={beforeMount(e,{value:t},{transition:n}){e._vod="none"===e.style.display?"":e.style.display,n&&t?n.beforeEnter(e):we(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),we(e,!0),r.enter(e)):r.leave(e,(()=>{we(e,!1)})):we(e,t))},beforeUnmount(e,{value:t}){we(e,t)}};function we(e,t){e.style.display=t?e._vod:"none"}const xe=(0,i.l7)({patchProp:(e,t,n,r,s=!1,a,l,c,u)=>{"class"===t?function(e,t,n){const r=e._vtc;r&&(t=(t?[t,...r]:[...r]).join(" ")),null==t?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}(e,r,s):"style"===t?function(e,t,n){const r=e.style,o=(0,i.HD)(n);if(n&&!o){for(const e in n)d(r,e,n[e]);if(t&&!(0,i.HD)(t))for(const e in t)null==n[e]&&d(r,e,"")}else{const i=r.display;o?t!==n&&(r.cssText=n):t&&e.removeAttribute("style"),"_vod"in e&&(r.display=i)}}(e,n,r):(0,i.F7)(t)?(0,i.tR)(t)||function(e,t,n,r,s=null){const a=e._vei||(e._vei={}),l=a[t];if(r&&l)l.value=r;else{const[n,c]=function(e){let t;if(x.test(e)){let n;for(t={};n=e.match(x);)e=e.slice(0,e.length-n[0].length),t[n[0].toLowerCase()]=!0}return[(0,i.rs)(e.slice(2)),t]}(t);if(r){const l=a[t]=function(e,t){const n=e=>{const r=e.timeStamp||m();(v||r>=n.attached-1)&&(0,o.$d)(function(e,t){if((0,i.kJ)(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map((e=>t=>!t._stopped&&e&&e(t)))}return t}(e,n.value),t,5,[e])};return n.value=e,n.attached=g||(b.then(y),g=m()),n}(r,s);w(e,n,l,c)}else l&&(function(e,t,n,r){e.removeEventListener(t,n,r)}(e,n,l,c),a[t]=void 0)}}(e,t,0,r,l):("."===t[0]?(t=t.slice(1),1):"^"===t[0]?(t=t.slice(1),0):function(e,t,n,r){return r?"innerHTML"===t||"textContent"===t||!!(t in e&&k.test(t)&&(0,i.mf)(n)):"spellcheck"!==t&&"draggable"!==t&&("form"!==t&&(("list"!==t||"INPUT"!==e.tagName)&&(("type"!==t||"TEXTAREA"!==e.tagName)&&((!k.test(t)||!(0,i.HD)(n))&&t in e))))}(e,t,r,s))?function(e,t,n,r,o,s,a){if("innerHTML"===t||"textContent"===t)return r&&a(r,o,s),void(e[t]=null==n?"":n);if("value"===t&&"PROGRESS"!==e.tagName&&!e.tagName.includes("-")){e._value=n;const r=null==n?"":n;return e.value===r&&"OPTION"!==e.tagName||(e.value=r),void(null==n&&e.removeAttribute(t))}if(""===n||null==n){const r=typeof e[t];if("boolean"===r)return void(e[t]=(0,i.yA)(n));if(null==n&&"string"===r)return e[t]="",void e.removeAttribute(t);if("number"===r){try{e[t]=0}catch(e){}return void e.removeAttribute(t)}}try{e[t]=n}catch(e){}}(e,t,r,a,l,c,u):("true-value"===t?e._trueValue=r:"false-value"===t&&(e._falseValue=r),function(e,t,n,r,o){if(r&&t.startsWith("xlink:"))null==n?e.removeAttributeNS(p,t.slice(6,t.length)):e.setAttributeNS(p,t,n);else{const r=(0,i.Pq)(t);null==n||r&&!(0,i.yA)(n)?e.removeAttribute(t):e.setAttribute(t,r?"":n)}}(e,t,r,s))}},c);let ke,Se=!1;function Ee(){return ke||(ke=(0,o.Us)(xe))}function Ce(){return ke=Se?ke:(0,o.Eo)(xe),Se=!0,ke}const _e=(...e)=>{Ee().render(...e)},Te=(...e)=>{Ce().hydrate(...e)},Oe=(...e)=>{const t=Ee().createApp(...e),{mount:n}=t;return t.mount=e=>{const r=Re(e);if(!r)return;const o=t._component;(0,i.mf)(o)||o.render||o.template||(o.template=r.innerHTML),r.innerHTML="";const s=n(r,!1,r instanceof SVGElement);return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),s},t},Le=(...e)=>{const t=Ce().createApp(...e),{mount:n}=t;return t.mount=e=>{const t=Re(e);if(t)return n(t,!0,t instanceof SVGElement)},t};function Re(e){return(0,i.HD)(e)?document.querySelector(e):e}let De=!1;const Ae=()=>{De||(De=!0,oe.getSSRProps=({value:e})=>({value:e}),ae.getSSRProps=({value:e},t)=>{if(t.props&&(0,i.WV)(t.props.value,e))return{checked:!0}},ie.getSSRProps=({value:e},t)=>{if((0,i.kJ)(e)){if(t.props&&(0,i.hq)(e,t.props.value)>-1)return{checked:!0}}else if((0,i.DM)(e)){if(t.props&&e.has(t.props.value))return{checked:!0}}else if(e)return{checked:!0}},ye.getSSRProps=({value:e})=>{if(!e)return{style:{display:"none"}}})};function Ie(e){throw e}function Me(e){}function Fe(e,t,n,r){const o=new SyntaxError(String(e));return o.code=e,o.loc=t,o}const Pe=Symbol(""),He=Symbol(""),Ne=Symbol(""),je=Symbol(""),We=Symbol(""),Be=Symbol(""),ze=Symbol(""),Ve=Symbol(""),qe=Symbol(""),$e=Symbol(""),Ue=Symbol(""),Ze=Symbol(""),Ye=Symbol(""),Ge=Symbol(""),Je=Symbol(""),Ke=Symbol(""),Xe=Symbol(""),Qe=Symbol(""),et=Symbol(""),tt=Symbol(""),nt=Symbol(""),rt=Symbol(""),ot=Symbol(""),it=Symbol(""),st=Symbol(""),at=Symbol(""),lt=Symbol(""),ct=Symbol(""),ut=Symbol(""),dt=Symbol(""),ft=Symbol(""),ht=Symbol(""),pt=Symbol(""),mt=Symbol(""),vt=Symbol(""),gt=Symbol(""),bt=Symbol(""),yt=Symbol(""),wt=Symbol(""),xt={[Pe]:"Fragment",[He]:"Teleport",[Ne]:"Suspense",[je]:"KeepAlive",[We]:"BaseTransition",[Be]:"openBlock",[ze]:"createBlock",[Ve]:"createElementBlock",[qe]:"createVNode",[$e]:"createElementVNode",[Ue]:"createCommentVNode",[Ze]:"createTextVNode",[Ye]:"createStaticVNode",[Ge]:"resolveComponent",[Je]:"resolveDynamicComponent",[Ke]:"resolveDirective",[Xe]:"resolveFilter",[Qe]:"withDirectives",[et]:"renderList",[tt]:"renderSlot",[nt]:"createSlots",[rt]:"toDisplayString",[ot]:"mergeProps",[it]:"normalizeClass",[st]:"normalizeStyle",[at]:"normalizeProps",[lt]:"guardReactiveProps",[ct]:"toHandlers",[ut]:"camelize",[dt]:"capitalize",[ft]:"toHandlerKey",[ht]:"setBlockTracking",[pt]:"pushScopeId",[mt]:"popScopeId",[vt]:"withCtx",[gt]:"unref",[bt]:"isRef",[yt]:"withMemo",[wt]:"isMemoSame"},kt={source:"",start:{line:1,column:1,offset:0},end:{line:1,column:1,offset:0}};function St(e,t,n,r,o,i,s,a=!1,l=!1,c=!1,u=kt){return e&&(a?(e.helper(Be),e.helper(Xt(e.inSSR,c))):e.helper(Kt(e.inSSR,c)),s&&e.helper(Qe)),{type:13,tag:t,props:n,children:r,patchFlag:o,dynamicProps:i,directives:s,isBlock:a,disableTracking:l,isComponent:c,loc:u}}function Et(e,t=kt){return{type:17,loc:t,elements:e}}function Ct(e,t=kt){return{type:15,loc:t,properties:e}}function _t(e,t){return{type:16,loc:kt,key:(0,i.HD)(e)?Tt(e,!0):e,value:t}}function Tt(e,t=!1,n=kt,r=0){return{type:4,loc:n,content:e,isStatic:t,constType:t?3:r}}function Ot(e,t=kt){return{type:8,loc:t,children:e}}function Lt(e,t=[],n=kt){return{type:14,loc:n,callee:e,arguments:t}}function Rt(e,t,n=!1,r=!1,o=kt){return{type:18,params:e,returns:t,newline:n,isSlot:r,loc:o}}function Dt(e,t,n,r=!0){return{type:19,test:e,consequent:t,alternate:n,newline:r,loc:kt}}const At=e=>4===e.type&&e.isStatic,It=(e,t)=>e===t||e===(0,i.rs)(t);function Mt(e){return It(e,"Teleport")?He:It(e,"Suspense")?Ne:It(e,"KeepAlive")?je:It(e,"BaseTransition")?We:void 0}const Ft=/^\d|[^\$\w]/,Pt=e=>!Ft.test(e),Ht=/[A-Za-z_$\xA0-\uFFFF]/,Nt=/[\.\?\w$\xA0-\uFFFF]/,jt=/\s+[.[]\s*|\s*[.[]\s+/g,Wt=e=>{e=e.trim().replace(jt,(e=>e.trim()));let t=0,n=[],r=0,o=0,i=null;for(let s=0;s<e.length;s++){const a=e.charAt(s);switch(t){case 0:if("["===a)n.push(t),t=1,r++;else if("("===a)n.push(t),t=2,o++;else if(!(0===s?Ht:Nt).test(a))return!1;break;case 1:"'"===a||'"'===a||"`"===a?(n.push(t),t=3,i=a):"["===a?r++:"]"===a&&(--r||(t=n.pop()));break;case 2:if("'"===a||'"'===a||"`"===a)n.push(t),t=3,i=a;else if("("===a)o++;else if(")"===a){if(s===e.length-1)return!1;--o||(t=n.pop())}break;case 3:a===i&&(t=n.pop(),i=null)}}return!r&&!o};function Bt(e,t,n){const r={source:e.source.slice(t,t+n),start:zt(e.start,e.source,t),end:e.end};return null!=n&&(r.end=zt(e.start,e.source,t+n)),r}function zt(e,t,n=t.length){return Vt((0,i.l7)({},e),t,n)}function Vt(e,t,n=t.length){let r=0,o=-1;for(let e=0;e<n;e++)10===t.charCodeAt(e)&&(r++,o=e);return e.offset+=n,e.line+=r,e.column=-1===o?e.column+n:n-o,e}function qt(e,t,n=!1){for(let r=0;r<e.props.length;r++){const o=e.props[r];if(7===o.type&&(n||o.exp)&&((0,i.HD)(t)?o.name===t:t.test(o.name)))return o}}function $t(e,t,n=!1,r=!1){for(let o=0;o<e.props.length;o++){const i=e.props[o];if(6===i.type){if(n)continue;if(i.name===t&&(i.value||r))return i}else if("bind"===i.name&&(i.exp||r)&&Ut(i.arg,t))return i}}function Ut(e,t){return!(!e||!At(e)||e.content!==t)}function Zt(e){return 5===e.type||2===e.type}function Yt(e){return 7===e.type&&"slot"===e.name}function Gt(e){return 1===e.type&&3===e.tagType}function Jt(e){return 1===e.type&&2===e.tagType}function Kt(e,t){return e||t?qe:$e}function Xt(e,t){return e||t?ze:Ve}const Qt=new Set([at,lt]);function en(e,t=[]){if(e&&!(0,i.HD)(e)&&14===e.type){const n=e.callee;if(!(0,i.HD)(n)&&Qt.has(n))return en(e.arguments[0],t.concat(e))}return[e,t]}function tn(e,t,n){let r,o,s=13===e.type?e.props:e.arguments[2],a=[];if(s&&!(0,i.HD)(s)&&14===s.type){const e=en(s);s=e[0],a=e[1],o=a[a.length-1]}if(null==s||(0,i.HD)(s))r=Ct([t]);else if(14===s.type){const e=s.arguments[0];(0,i.HD)(e)||15!==e.type?s.callee===ct?r=Lt(n.helper(ot),[Ct([t]),s]):s.arguments.unshift(Ct([t])):e.properties.unshift(t),!r&&(r=s)}else if(15===s.type){let e=!1;if(4===t.key.type){const n=t.key.content;e=s.properties.some((e=>4===e.key.type&&e.key.content===n))}e||s.properties.unshift(t),r=s}else r=Lt(n.helper(ot),[Ct([t]),s]),o&&o.callee===lt&&(o=a[a.length-2]);13===e.type?o?o.arguments[0]=r:e.props=r:o?o.arguments[0]=r:e.arguments[2]=r}function nn(e,t){return`_${t}_${e.replace(/[^\w]/g,((t,n)=>"-"===t?"_":e.charCodeAt(n).toString()))}`}function rn(e,{helper:t,removeHelper:n,inSSR:r}){e.isBlock||(e.isBlock=!0,n(Kt(r,e.isComponent)),t(Be),t(Xt(r,e.isComponent)))}function on(e,t){const n=t.options?t.options.compatConfig:t.compatConfig,r=n&&n[e];return"MODE"===e?r||3:r}function sn(e,t){const n=on("MODE",t),r=on(e,t);return 3===n?!0===r:!1!==r}function an(e,t,n,...r){return sn(e,t)}const ln=/&(gt|lt|amp|apos|quot);/g,cn={gt:">",lt:"<",amp:"&",apos:"'",quot:'"'},un={delimiters:["{{","}}"],getNamespace:()=>0,getTextMode:()=>0,isVoidTag:i.NO,isPreTag:i.NO,isCustomElement:i.NO,decodeEntities:e=>e.replace(ln,((e,t)=>cn[t])),onError:Ie,onWarn:Me,comments:!1};function dn(e,t,n){const r=_n(n),o=r?r.ns:0,s=[];for(;!An(e,t,n);){const a=e.source;let l;if(0===t||1===t)if(!e.inVPre&&Tn(a,e.options.delimiters[0]))l=xn(e,t);else if(0===t&&"<"===a[0])if(1===a.length)Dn(e,5,1);else if("!"===a[1])Tn(a,"\x3c!--")?l=pn(e):Tn(a,"<!DOCTYPE")?l=mn(e):Tn(a,"<![CDATA[")?0!==o?l=hn(e,n):(Dn(e,1),l=mn(e)):(Dn(e,11),l=mn(e));else if("/"===a[1])if(2===a.length)Dn(e,5,2);else{if(">"===a[2]){Dn(e,14,2),On(e,3);continue}if(/[a-z]/i.test(a[2])){Dn(e,23),bn(e,1,r);continue}Dn(e,12,2),l=mn(e)}else/[a-z]/i.test(a[1])?(l=vn(e,n),sn("COMPILER_NATIVE_TEMPLATE",e)&&l&&"template"===l.tag&&!l.props.some((e=>7===e.type&&gn(e.name)))&&(l=l.children)):"?"===a[1]?(Dn(e,21,1),l=mn(e)):Dn(e,12,1);if(l||(l=kn(e,t)),(0,i.kJ)(l))for(let e=0;e<l.length;e++)fn(s,l[e]);else fn(s,l)}let a=!1;if(2!==t&&1!==t){const t="preserve"!==e.options.whitespace;for(let n=0;n<s.length;n++){const r=s[n];if(e.inPre||2!==r.type)3!==r.type||e.options.comments||(a=!0,s[n]=null);else if(/[^\t\r\n\f ]/.test(r.content))t&&(r.content=r.content.replace(/[\t\r\n\f ]+/g," "));else{const e=s[n-1],o=s[n+1];!e||!o||t&&(3===e.type||3===o.type||1===e.type&&1===o.type&&/[\r\n]/.test(r.content))?(a=!0,s[n]=null):r.content=" "}}if(e.inPre&&r&&e.options.isPreTag(r.tag)){const e=s[0];e&&2===e.type&&(e.content=e.content.replace(/^\r?\n/,""))}}return a?s.filter(Boolean):s}function fn(e,t){if(2===t.type){const n=_n(e);if(n&&2===n.type&&n.loc.end.offset===t.loc.start.offset)return n.content+=t.content,n.loc.end=t.loc.end,void(n.loc.source+=t.loc.source)}e.push(t)}function hn(e,t){On(e,9);const n=dn(e,3,t);return 0===e.source.length?Dn(e,6):On(e,3),n}function pn(e){const t=En(e);let n;const r=/--(\!)?>/.exec(e.source);if(r){r.index<=3&&Dn(e,0),r[1]&&Dn(e,10),n=e.source.slice(4,r.index);const t=e.source.slice(0,r.index);let o=1,i=0;for(;-1!==(i=t.indexOf("\x3c!--",o));)On(e,i-o+1),i+4<t.length&&Dn(e,16),o=i+1;On(e,r.index+r[0].length-o+1)}else n=e.source.slice(4),On(e,e.source.length),Dn(e,7);return{type:3,content:n,loc:Cn(e,t)}}function mn(e){const t=En(e),n="?"===e.source[1]?1:2;let r;const o=e.source.indexOf(">");return-1===o?(r=e.source.slice(n),On(e,e.source.length)):(r=e.source.slice(n,o),On(e,o+1)),{type:3,content:r,loc:Cn(e,t)}}function vn(e,t){const n=e.inPre,r=e.inVPre,o=_n(t),i=bn(e,0,o),s=e.inPre&&!n,a=e.inVPre&&!r;if(i.isSelfClosing||e.options.isVoidTag(i.tag))return s&&(e.inPre=!1),a&&(e.inVPre=!1),i;t.push(i);const l=e.options.getTextMode(i,o),c=dn(e,l,t);t.pop();{const t=i.props.find((e=>6===e.type&&"inline-template"===e.name));if(t&&an("COMPILER_INLINE_TEMPLATE",e,t.loc)){const n=Cn(e,i.loc.end);t.value={type:2,content:n.source,loc:n}}}if(i.children=c,In(e.source,i.tag))bn(e,1,o);else if(Dn(e,24,0,i.loc.start),0===e.source.length&&"script"===i.tag.toLowerCase()){const t=c[0];t&&Tn(t.loc.source,"\x3c!--")&&Dn(e,8)}return i.loc=Cn(e,i.loc.start),s&&(e.inPre=!1),a&&(e.inVPre=!1),i}const gn=(0,i.fY)("if,else,else-if,for,slot");function bn(e,t,n){const r=En(e),o=/^<\/?([a-z][^\t\r\n\f />]*)/i.exec(e.source),s=o[1],a=e.options.getNamespace(s,n);On(e,o[0].length),Ln(e);const l=En(e),c=e.source;e.options.isPreTag(s)&&(e.inPre=!0);let u=yn(e,t);0===t&&!e.inVPre&&u.some((e=>7===e.type&&"pre"===e.name))&&(e.inVPre=!0,(0,i.l7)(e,l),e.source=c,u=yn(e,t).filter((e=>"v-pre"!==e.name)));let d=!1;if(0===e.source.length?Dn(e,9):(d=Tn(e.source,"/>"),1===t&&d&&Dn(e,4),On(e,d?2:1)),1===t)return;let f=0;return e.inVPre||("slot"===s?f=2:"template"===s?u.some((e=>7===e.type&&gn(e.name)))&&(f=3):function(e,t,n){const r=n.options;if(r.isCustomElement(e))return!1;if("component"===e||/^[A-Z]/.test(e)||Mt(e)||r.isBuiltInComponent&&r.isBuiltInComponent(e)||r.isNativeTag&&!r.isNativeTag(e))return!0;for(let e=0;e<t.length;e++){const r=t[e];if(6===r.type){if("is"===r.name&&r.value){if(r.value.content.startsWith("vue:"))return!0;if(an("COMPILER_IS_ON_ELEMENT",n,r.loc))return!0}}else{if("is"===r.name)return!0;if("bind"===r.name&&Ut(r.arg,"is")&&an("COMPILER_IS_ON_ELEMENT",n,r.loc))return!0}}}(s,u,e)&&(f=1)),{type:1,ns:a,tag:s,tagType:f,props:u,isSelfClosing:d,children:[],loc:Cn(e,r),codegenNode:void 0}}function yn(e,t){const n=[],r=new Set;for(;e.source.length>0&&!Tn(e.source,">")&&!Tn(e.source,"/>");){if(Tn(e.source,"/")){Dn(e,22),On(e,1),Ln(e);continue}1===t&&Dn(e,3);const o=wn(e,r);6===o.type&&o.value&&"class"===o.name&&(o.value.content=o.value.content.replace(/\s+/g," ").trim()),0===t&&n.push(o),/^[^\t\r\n\f />]/.test(e.source)&&Dn(e,15),Ln(e)}return n}function wn(e,t){const n=En(e),r=/^[^\t\r\n\f />][^\t\r\n\f />=]*/.exec(e.source)[0];t.has(r)&&Dn(e,2),t.add(r),"="===r[0]&&Dn(e,19);{const t=/["'<]/g;let n;for(;n=t.exec(r);)Dn(e,17,n.index)}let o;On(e,r.length),/^[\t\r\n\f ]*=/.test(e.source)&&(Ln(e),On(e,1),Ln(e),o=function(e){const t=En(e);let n;const r=e.source[0],o='"'===r||"'"===r;if(o){On(e,1);const t=e.source.indexOf(r);-1===t?n=Sn(e,e.source.length,4):(n=Sn(e,t,4),On(e,1))}else{const t=/^[^\t\r\n\f >]+/.exec(e.source);if(!t)return;const r=/["'<=`]/g;let o;for(;o=r.exec(t[0]);)Dn(e,18,o.index);n=Sn(e,t[0].length,4)}return{content:n,isQuoted:o,loc:Cn(e,t)}}(e),o||Dn(e,13));const i=Cn(e,n);if(!e.inVPre&&/^(v-[A-Za-z0-9-]|:|\.|@|#)/.test(r)){const t=/(?:^v-([a-z0-9-]+))?(?:(?::|^\.|^@|^#)(\[[^\]]+\]|[^\.]+))?(.+)?$/i.exec(r);let s,a=Tn(r,"."),l=t[1]||(a||Tn(r,":")?"bind":Tn(r,"@")?"on":"slot");if(t[2]){const o="slot"===l,i=r.lastIndexOf(t[2]),a=Cn(e,Rn(e,n,i),Rn(e,n,i+t[2].length+(o&&t[3]||"").length));let c=t[2],u=!0;c.startsWith("[")?(u=!1,c.endsWith("]")?c=c.slice(1,c.length-1):(Dn(e,27),c=c.slice(1))):o&&(c+=t[3]||""),s={type:4,content:c,isStatic:u,constType:u?3:0,loc:a}}if(o&&o.isQuoted){const e=o.loc;e.start.offset++,e.start.column++,e.end=zt(e.start,o.content),e.source=e.source.slice(1,-1)}const c=t[3]?t[3].slice(1).split("."):[];return a&&c.push("prop"),"bind"===l&&s&&c.includes("sync")&&an("COMPILER_V_BIND_SYNC",e,0,s.loc.source)&&(l="model",c.splice(c.indexOf("sync"),1)),{type:7,name:l,exp:o&&{type:4,content:o.content,isStatic:!1,constType:0,loc:o.loc},arg:s,modifiers:c,loc:i}}return!e.inVPre&&Tn(r,"v-")&&Dn(e,26),{type:6,name:r,value:o&&{type:2,content:o.content,loc:o.loc},loc:i}}function xn(e,t){const[n,r]=e.options.delimiters,o=e.source.indexOf(r,n.length);if(-1===o)return void Dn(e,25);const i=En(e);On(e,n.length);const s=En(e),a=En(e),l=o-n.length,c=e.source.slice(0,l),u=Sn(e,l,t),d=u.trim(),f=u.indexOf(d);return f>0&&Vt(s,c,f),Vt(a,c,l-(u.length-d.length-f)),On(e,r.length),{type:5,content:{type:4,isStatic:!1,constType:0,content:d,loc:Cn(e,s,a)},loc:Cn(e,i)}}function kn(e,t){const n=3===t?["]]>"]:["<",e.options.delimiters[0]];let r=e.source.length;for(let t=0;t<n.length;t++){const o=e.source.indexOf(n[t],1);-1!==o&&r>o&&(r=o)}const o=En(e);return{type:2,content:Sn(e,r,t),loc:Cn(e,o)}}function Sn(e,t,n){const r=e.source.slice(0,t);return On(e,t),2!==n&&3!==n&&r.includes("&")?e.options.decodeEntities(r,4===n):r}function En(e){const{column:t,line:n,offset:r}=e;return{column:t,line:n,offset:r}}function Cn(e,t,n){return{start:t,end:n=n||En(e),source:e.originalSource.slice(t.offset,n.offset)}}function _n(e){return e[e.length-1]}function Tn(e,t){return e.startsWith(t)}function On(e,t){const{source:n}=e;Vt(e,n,t),e.source=n.slice(t)}function Ln(e){const t=/^[\t\r\n\f ]+/.exec(e.source);t&&On(e,t[0].length)}function Rn(e,t,n){return zt(t,e.originalSource.slice(t.offset,n),n)}function Dn(e,t,n,r=En(e)){n&&(r.offset+=n,r.column+=n),e.options.onError(Fe(t,{start:r,end:r,source:""}))}function An(e,t,n){const r=e.source;switch(t){case 0:if(Tn(r,"</"))for(let e=n.length-1;e>=0;--e)if(In(r,n[e].tag))return!0;break;case 1:case 2:{const e=_n(n);if(e&&In(r,e.tag))return!0;break}case 3:if(Tn(r,"]]>"))return!0}return!r}function In(e,t){return Tn(e,"</")&&e.slice(2,2+t.length).toLowerCase()===t.toLowerCase()&&/[\t\r\n\f />]/.test(e[2+t.length]||">")}function Mn(e,t){Pn(e,t,Fn(e,e.children[0]))}function Fn(e,t){const{children:n}=e;return 1===n.length&&1===t.type&&!Jt(t)}function Pn(e,t,n=!1){const{children:r}=e,o=r.length;let s=0;for(let e=0;e<r.length;e++){const o=r[e];if(1===o.type&&0===o.tagType){const e=n?0:Hn(o,t);if(e>0){if(e>=2){o.codegenNode.patchFlag="-1",o.codegenNode=t.hoist(o.codegenNode),s++;continue}}else{const e=o.codegenNode;if(13===e.type){const n=zn(e);if((!n||512===n||1===n)&&Wn(o,t)>=2){const n=Bn(o);n&&(e.props=t.hoist(n))}e.dynamicProps&&(e.dynamicProps=t.hoist(e.dynamicProps))}}}else 12===o.type&&Hn(o.content,t)>=2&&(o.codegenNode=t.hoist(o.codegenNode),s++);if(1===o.type){const e=1===o.tagType;e&&t.scopes.vSlot++,Pn(o,t),e&&t.scopes.vSlot--}else if(11===o.type)Pn(o,t,1===o.children.length);else if(9===o.type)for(let e=0;e<o.branches.length;e++)Pn(o.branches[e],t,1===o.branches[e].children.length)}s&&t.transformHoist&&t.transformHoist(r,t,e),s&&s===o&&1===e.type&&0===e.tagType&&e.codegenNode&&13===e.codegenNode.type&&(0,i.kJ)(e.codegenNode.children)&&(e.codegenNode.children=t.hoist(Et(e.codegenNode.children)))}function Hn(e,t){const{constantCache:n}=t;switch(e.type){case 1:if(0!==e.tagType)return 0;const r=n.get(e);if(void 0!==r)return r;const o=e.codegenNode;if(13!==o.type)return 0;if(o.isBlock&&"svg"!==e.tag&&"foreignObject"!==e.tag)return 0;if(zn(o))return n.set(e,0),0;{let r=3;const i=Wn(e,t);if(0===i)return n.set(e,0),0;i<r&&(r=i);for(let o=0;o<e.children.length;o++){const i=Hn(e.children[o],t);if(0===i)return n.set(e,0),0;i<r&&(r=i)}if(r>1)for(let o=0;o<e.props.length;o++){const i=e.props[o];if(7===i.type&&"bind"===i.name&&i.exp){const o=Hn(i.exp,t);if(0===o)return n.set(e,0),0;o<r&&(r=o)}}return o.isBlock&&(t.removeHelper(Be),t.removeHelper(Xt(t.inSSR,o.isComponent)),o.isBlock=!1,t.helper(Kt(t.inSSR,o.isComponent))),n.set(e,r),r}case 2:case 3:return 3;case 9:case 11:case 10:default:return 0;case 5:case 12:return Hn(e.content,t);case 4:return e.constType;case 8:let s=3;for(let n=0;n<e.children.length;n++){const r=e.children[n];if((0,i.HD)(r)||(0,i.yk)(r))continue;const o=Hn(r,t);if(0===o)return 0;o<s&&(s=o)}return s}}const Nn=new Set([it,st,at,lt]);function jn(e,t){if(14===e.type&&!(0,i.HD)(e.callee)&&Nn.has(e.callee)){const n=e.arguments[0];if(4===n.type)return Hn(n,t);if(14===n.type)return jn(n,t)}return 0}function Wn(e,t){let n=3;const r=Bn(e);if(r&&15===r.type){const{properties:e}=r;for(let r=0;r<e.length;r++){const{key:o,value:i}=e[r],s=Hn(o,t);if(0===s)return s;let a;if(s<n&&(n=s),a=4===i.type?Hn(i,t):14===i.type?jn(i,t):0,0===a)return a;a<n&&(n=a)}}return n}function Bn(e){const t=e.codegenNode;if(13===t.type)return t.props}function zn(e){const t=e.patchFlag;return t?parseInt(t,10):void 0}function Vn(e,t){const n=function(e,{filename:t="",prefixIdentifiers:n=!1,hoistStatic:r=!1,cacheHandlers:o=!1,nodeTransforms:s=[],directiveTransforms:a={},transformHoist:l=null,isBuiltInComponent:c=i.dG,isCustomElement:u=i.dG,expressionPlugins:d=[],scopeId:f=null,slotted:h=!0,ssr:p=!1,inSSR:m=!1,ssrCssVars:v="",bindingMetadata:g=i.kT,inline:b=!1,isTS:y=!1,onError:w=Ie,onWarn:x=Me,compatConfig:k}){const S=t.replace(/\?.*$/,"").match(/([^/\\]+)\.\w+$/),E={selfName:S&&(0,i.kC)((0,i._A)(S[1])),prefixIdentifiers:n,hoistStatic:r,cacheHandlers:o,nodeTransforms:s,directiveTransforms:a,transformHoist:l,isBuiltInComponent:c,isCustomElement:u,expressionPlugins:d,scopeId:f,slotted:h,ssr:p,inSSR:m,ssrCssVars:v,bindingMetadata:g,inline:b,isTS:y,onError:w,onWarn:x,compatConfig:k,root:e,helpers:new Map,components:new Set,directives:new Set,hoists:[],imports:[],constantCache:new Map,temps:0,cached:0,identifiers:Object.create(null),scopes:{vFor:0,vSlot:0,vPre:0,vOnce:0},parent:null,currentNode:e,childIndex:0,inVOnce:!1,helper(e){const t=E.helpers.get(e)||0;return E.helpers.set(e,t+1),e},removeHelper(e){const t=E.helpers.get(e);if(t){const n=t-1;n?E.helpers.set(e,n):E.helpers.delete(e)}},helperString:e=>`_${xt[E.helper(e)]}`,replaceNode(e){E.parent.children[E.childIndex]=E.currentNode=e},removeNode(e){const t=E.parent.children,n=e?t.indexOf(e):E.currentNode?E.childIndex:-1;e&&e!==E.currentNode?E.childIndex>n&&(E.childIndex--,E.onNodeRemoved()):(E.currentNode=null,E.onNodeRemoved()),E.parent.children.splice(n,1)},onNodeRemoved:()=>{},addIdentifiers(e){},removeIdentifiers(e){},hoist(e){(0,i.HD)(e)&&(e=Tt(e)),E.hoists.push(e);const t=Tt(`_hoisted_${E.hoists.length}`,!1,e.loc,2);return t.hoisted=e,t},cache:(e,t=!1)=>function(e,t,n=!1){return{type:20,index:e,value:t,isVNode:n,loc:kt}}(E.cached++,e,t)};return E.filters=new Set,E}(e,t);qn(e,n),t.hoistStatic&&Mn(e,n),t.ssr||function(e,t){const{helper:n}=t,{children:r}=e;if(1===r.length){const n=r[0];if(Fn(e,n)&&n.codegenNode){const r=n.codegenNode;13===r.type&&rn(r,t),e.codegenNode=r}else e.codegenNode=n}else if(r.length>1){let r=64;i.m[64],e.codegenNode=St(t,n(Pe),void 0,e.children,r+"",void 0,void 0,!0,void 0,!1)}}(e,n),e.helpers=[...n.helpers.keys()],e.components=[...n.components],e.directives=[...n.directives],e.imports=n.imports,e.hoists=n.hoists,e.temps=n.temps,e.cached=n.cached,e.filters=[...n.filters]}function qn(e,t){t.currentNode=e;const{nodeTransforms:n}=t,r=[];for(let o=0;o<n.length;o++){const s=n[o](e,t);if(s&&((0,i.kJ)(s)?r.push(...s):r.push(s)),!t.currentNode)return;e=t.currentNode}switch(e.type){case 3:t.ssr||t.helper(Ue);break;case 5:t.ssr||t.helper(rt);break;case 9:for(let n=0;n<e.branches.length;n++)qn(e.branches[n],t);break;case 10:case 11:case 1:case 0:!function(e,t){let n=0;const r=()=>{n--};for(;n<e.children.length;n++){const o=e.children[n];(0,i.HD)(o)||(t.parent=e,t.childIndex=n,t.onNodeRemoved=r,qn(o,t))}}(e,t)}t.currentNode=e;let o=r.length;for(;o--;)r[o]()}function $n(e,t){const n=(0,i.HD)(e)?t=>t===e:t=>e.test(t);return(e,r)=>{if(1===e.type){const{props:o}=e;if(3===e.tagType&&o.some(Yt))return;const i=[];for(let s=0;s<o.length;s++){const a=o[s];if(7===a.type&&n(a.name)){o.splice(s,1),s--;const n=t(e,a,r);n&&i.push(n)}}return i}}}const Un="/*#__PURE__*/";function Zn(e,t,{helper:n,push:r,newline:o,isTS:i}){const s=n("filter"===t?Xe:"component"===t?Ge:Ke);for(let n=0;n<e.length;n++){let a=e[n];const l=a.endsWith("__self");l&&(a=a.slice(0,-6)),r(`const ${nn(a,t)} = ${s}(${JSON.stringify(a)}${l?", true":""})${i?"!":""}`),n<e.length-1&&o()}}function Yn(e,t){const n=e.length>3||!1;t.push("["),n&&t.indent(),Gn(e,t,n),n&&t.deindent(),t.push("]")}function Gn(e,t,n=!1,r=!0){const{push:o,newline:s}=t;for(let a=0;a<e.length;a++){const l=e[a];(0,i.HD)(l)?o(l):(0,i.kJ)(l)?Yn(l,t):Jn(l,t),a<e.length-1&&(n?(r&&o(","),s()):r&&o(", "))}}function Jn(e,t){if((0,i.HD)(e))t.push(e);else if((0,i.yk)(e))t.push(t.helper(e));else switch(e.type){case 1:case 9:case 11:case 12:Jn(e.codegenNode,t);break;case 2:!function(e,t){t.push(JSON.stringify(e.content),e)}(e,t);break;case 4:Kn(e,t);break;case 5:!function(e,t){const{push:n,helper:r,pure:o}=t;o&&n(Un),n(`${r(rt)}(`),Jn(e.content,t),n(")")}(e,t);break;case 8:Xn(e,t);break;case 3:!function(e,t){const{push:n,helper:r,pure:o}=t;o&&n(Un),n(`${r(Ue)}(${JSON.stringify(e.content)})`,e)}(e,t);break;case 13:!function(e,t){const{push:n,helper:r,pure:o}=t,{tag:i,props:s,children:a,patchFlag:l,dynamicProps:c,directives:u,isBlock:d,disableTracking:f,isComponent:h}=e;u&&n(r(Qe)+"("),d&&n(`(${r(Be)}(${f?"true":""}), `),o&&n(Un);n(r(d?Xt(t.inSSR,h):Kt(t.inSSR,h))+"(",e),Gn(function(e){let t=e.length;for(;t--&&null==e[t];);return e.slice(0,t+1).map((e=>e||"null"))}([i,s,a,l,c]),t),n(")"),d&&n(")"),u&&(n(", "),Jn(u,t),n(")"))}(e,t);break;case 14:!function(e,t){const{push:n,helper:r,pure:o}=t,s=(0,i.HD)(e.callee)?e.callee:r(e.callee);o&&n(Un),n(s+"(",e),Gn(e.arguments,t),n(")")}(e,t);break;case 15:!function(e,t){const{push:n,indent:r,deindent:o,newline:i}=t,{properties:s}=e;if(!s.length)return void n("{}",e);const a=s.length>1||!1;n(a?"{":"{ "),a&&r();for(let e=0;e<s.length;e++){const{key:r,value:o}=s[e];Qn(r,t),n(": "),Jn(o,t),e<s.length-1&&(n(","),i())}a&&o(),n(a?"}":" }")}(e,t);break;case 17:!function(e,t){Yn(e.elements,t)}(e,t);break;case 18:!function(e,t){const{push:n,indent:r,deindent:o}=t,{params:s,returns:a,body:l,newline:c,isSlot:u}=e;u&&n(`_${xt[vt]}(`),n("(",e),(0,i.kJ)(s)?Gn(s,t):s&&Jn(s,t),n(") => "),(c||l)&&(n("{"),r()),a?(c&&n("return "),(0,i.kJ)(a)?Yn(a,t):Jn(a,t)):l&&Jn(l,t),(c||l)&&(o(),n("}")),u&&(e.isNonScopedSlot&&n(", undefined, true"),n(")"))}(e,t);break;case 19:!function(e,t){const{test:n,consequent:r,alternate:o,newline:i}=e,{push:s,indent:a,deindent:l,newline:c}=t;if(4===n.type){const e=!Pt(n.content);e&&s("("),Kn(n,t),e&&s(")")}else s("("),Jn(n,t),s(")");i&&a(),t.indentLevel++,i||s(" "),s("? "),Jn(r,t),t.indentLevel--,i&&c(),i||s(" "),s(": ");const u=19===o.type;u||t.indentLevel++,Jn(o,t),u||t.indentLevel--,i&&l(!0)}(e,t);break;case 20:!function(e,t){const{push:n,helper:r,indent:o,deindent:i,newline:s}=t;n(`_cache[${e.index}] || (`),e.isVNode&&(o(),n(`${r(ht)}(-1),`),s()),n(`_cache[${e.index}] = `),Jn(e.value,t),e.isVNode&&(n(","),s(),n(`${r(ht)}(1),`),s(),n(`_cache[${e.index}]`),i()),n(")")}(e,t);break;case 21:Gn(e.body,t,!0,!1)}}function Kn(e,t){const{content:n,isStatic:r}=e;t.push(r?JSON.stringify(n):n,e)}function Xn(e,t){for(let n=0;n<e.children.length;n++){const r=e.children[n];(0,i.HD)(r)?t.push(r):Jn(r,t)}}function Qn(e,t){const{push:n}=t;8===e.type?(n("["),Xn(e,t),n("]")):e.isStatic?n(Pt(e.content)?e.content:JSON.stringify(e.content),e):n(`[${e.content}]`,e)}new RegExp("\\b"+"do,if,for,let,new,try,var,case,else,with,await,break,catch,class,const,super,throw,while,yield,delete,export,import,return,switch,default,extends,finally,continue,debugger,function,arguments,typeof,void".split(",").join("\\b|\\b")+"\\b");const er=$n(/^(if|else|else-if)$/,((e,t,n)=>function(e,t,n,r){if(!("else"===t.name||t.exp&&t.exp.content.trim())){const r=t.exp?t.exp.loc:e.loc;n.onError(Fe(28,t.loc)),t.exp=Tt("true",!1,r)}if("if"===t.name){const o=tr(e,t),i={type:9,loc:e.loc,branches:[o]};if(n.replaceNode(i),r)return r(i,o,!0)}else{const o=n.parent.children;let i=o.indexOf(e);for(;i-- >=-1;){const s=o[i];if(!s||2!==s.type||s.content.trim().length){if(s&&9===s.type){"else-if"===t.name&&void 0===s.branches[s.branches.length-1].condition&&n.onError(Fe(30,e.loc)),n.removeNode();const o=tr(e,t);s.branches.push(o);const i=r&&r(s,o,!1);qn(o,n),i&&i(),n.currentNode=null}else n.onError(Fe(30,e.loc));break}n.removeNode(s)}}}(e,t,n,((e,t,r)=>{const o=n.parent.children;let i=o.indexOf(e),s=0;for(;i-- >=0;){const e=o[i];e&&9===e.type&&(s+=e.branches.length)}return()=>{if(r)e.codegenNode=nr(t,s,n);else{const r=function(e){for(;;)if(19===e.type){if(19!==e.alternate.type)return e;e=e.alternate}else 20===e.type&&(e=e.value)}(e.codegenNode);r.alternate=nr(t,s+e.branches.length-1,n)}}}))));function tr(e,t){return{type:10,loc:e.loc,condition:"else"===t.name?void 0:t.exp,children:3!==e.tagType||qt(e,"for")?[e]:e.children,userKey:$t(e,"key")}}function nr(e,t,n){return e.condition?Dt(e.condition,rr(e,t,n),Lt(n.helper(Ue),['""',"true"])):rr(e,t,n)}function rr(e,t,n){const{helper:r}=n,o=_t("key",Tt(`${t}`,!1,kt,2)),{children:s}=e,a=s[0];if(1!==s.length||1!==a.type){if(1===s.length&&11===a.type){const e=a.codegenNode;return tn(e,o,n),e}{let t=64;return i.m[64],St(n,r(Pe),Ct([o]),s,t+"",void 0,void 0,!0,!1,!1,e.loc)}}{const e=a.codegenNode,t=14===(l=e).type&&l.callee===yt?l.arguments[1].returns:l;return 13===t.type&&rn(t,n),tn(t,o,n),e}var l}const or=$n("for",((e,t,n)=>{const{helper:r,removeHelper:o}=n;return function(e,t,n,r){if(!t.exp)return void n.onError(Fe(31,t.loc));const o=lr(t.exp);if(!o)return void n.onError(Fe(32,t.loc));const{addIdentifiers:i,removeIdentifiers:s,scopes:a}=n,{source:l,value:c,key:u,index:d}=o,f={type:11,loc:t.loc,source:l,valueAlias:c,keyAlias:u,objectIndexAlias:d,parseResult:o,children:Gt(e)?e.children:[e]};n.replaceNode(f),a.vFor++;const h=r&&r(f);return()=>{a.vFor--,h&&h()}}(e,t,n,(t=>{const i=Lt(r(et),[t.source]),s=Gt(e),a=qt(e,"memo"),l=$t(e,"key"),c=l&&(6===l.type?Tt(l.value.content,!0):l.exp),u=l?_t("key",c):null,d=4===t.source.type&&t.source.constType>0,f=d?64:l?128:256;return t.codegenNode=St(n,r(Pe),void 0,i,f+"",void 0,void 0,!0,!d,!1,e.loc),()=>{let l;const{children:f}=t,h=1!==f.length||1!==f[0].type,p=Jt(e)?e:s&&1===e.children.length&&Jt(e.children[0])?e.children[0]:null;if(p?(l=p.codegenNode,s&&u&&tn(l,u,n)):h?l=St(n,r(Pe),u?Ct([u]):void 0,e.children,"64",void 0,void 0,!0,void 0,!1):(l=f[0].codegenNode,s&&u&&tn(l,u,n),l.isBlock!==!d&&(l.isBlock?(o(Be),o(Xt(n.inSSR,l.isComponent))):o(Kt(n.inSSR,l.isComponent))),l.isBlock=!d,l.isBlock?(r(Be),r(Xt(n.inSSR,l.isComponent))):r(Kt(n.inSSR,l.isComponent))),a){const e=Rt(ur(t.parseResult,[Tt("_cached")]));e.body={type:21,body:[Ot(["const _memo = (",a.exp,")"]),Ot(["if (_cached",...c?[" && _cached.key === ",c]:[],` && ${n.helperString(wt)}(_cached, _memo)) return _cached`]),Ot(["const _item = ",l]),Tt("_item.memo = _memo"),Tt("return _item")],loc:kt},i.arguments.push(e,Tt("_cache"),Tt(String(n.cached++)))}else i.arguments.push(Rt(ur(t.parseResult),l,!0))}}))})),ir=/([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/,sr=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,ar=/^\(|\)$/g;function lr(e,t){const n=e.loc,r=e.content,o=r.match(ir);if(!o)return;const[,i,s]=o,a={source:cr(n,s.trim(),r.indexOf(s,i.length)),value:void 0,key:void 0,index:void 0};let l=i.trim().replace(ar,"").trim();const c=i.indexOf(l),u=l.match(sr);if(u){l=l.replace(sr,"").trim();const e=u[1].trim();let t;if(e&&(t=r.indexOf(e,c+l.length),a.key=cr(n,e,t)),u[2]){const o=u[2].trim();o&&(a.index=cr(n,o,r.indexOf(o,a.key?t+e.length:c+l.length)))}}return l&&(a.value=cr(n,l,c)),a}function cr(e,t,n){return Tt(t,!1,Bt(e,n,t.length))}function ur({value:e,key:t,index:n},r=[]){return function(e){let t=e.length;for(;t--&&!e[t];);return e.slice(0,t+1).map(((e,t)=>e||Tt("_".repeat(t+1),!1)))}([e,t,n,...r])}const dr=Tt("undefined",!1),fr=(e,t)=>{if(1===e.type&&(1===e.tagType||3===e.tagType)){const n=qt(e,"slot");if(n)return n.exp,t.scopes.vSlot++,()=>{t.scopes.vSlot--}}},hr=(e,t,n)=>Rt(e,t,!1,!0,t.length?t[0].loc:n);function pr(e,t,n=hr){t.helper(vt);const{children:r,loc:o}=e,i=[],s=[];let a=t.scopes.vSlot>0||t.scopes.vFor>0;const l=qt(e,"slot",!0);if(l){const{arg:e,exp:t}=l;e&&!At(e)&&(a=!0),i.push(_t(e||Tt("default",!0),n(t,r,o)))}let c=!1,u=!1;const d=[],f=new Set;for(let e=0;e<r.length;e++){const o=r[e];let h;if(!Gt(o)||!(h=qt(o,"slot",!0))){3!==o.type&&d.push(o);continue}if(l){t.onError(Fe(37,h.loc));break}c=!0;const{children:p,loc:m}=o,{arg:v=Tt("default",!0),exp:g,loc:b}=h;let y;At(v)?y=v?v.content:"default":a=!0;const w=n(g,p,m);let x,k,S;if(x=qt(o,"if"))a=!0,s.push(Dt(x.exp,mr(v,w),dr));else if(k=qt(o,/^else(-if)?$/,!0)){let n,o=e;for(;o--&&(n=r[o],3===n.type););if(n&&Gt(n)&&qt(n,"if")){r.splice(e,1),e--;let t=s[s.length-1];for(;19===t.alternate.type;)t=t.alternate;t.alternate=k.exp?Dt(k.exp,mr(v,w),dr):mr(v,w)}else t.onError(Fe(30,k.loc))}else if(S=qt(o,"for")){a=!0;const e=S.parseResult||lr(S.exp);e?s.push(Lt(t.helper(et),[e.source,Rt(ur(e),mr(v,w),!0)])):t.onError(Fe(32,S.loc))}else{if(y){if(f.has(y)){t.onError(Fe(38,b));continue}f.add(y),"default"===y&&(u=!0)}i.push(_t(v,w))}}if(!l){const e=(e,r)=>{const i=n(e,r,o);return t.compatConfig&&(i.isNonScopedSlot=!0),_t("default",i)};c?d.length&&d.some((e=>gr(e)))&&(u?t.onError(Fe(39,d[0].loc)):i.push(e(void 0,d))):i.push(e(void 0,r))}const h=a?2:vr(e.children)?3:1;let p=Ct(i.concat(_t("_",Tt(h+"",!1))),o);return s.length&&(p=Lt(t.helper(nt),[p,Et(s)])),{slots:p,hasDynamicSlots:a}}function mr(e,t){return Ct([_t("name",e),_t("fn",t)])}function vr(e){for(let t=0;t<e.length;t++){const n=e[t];switch(n.type){case 1:if(2===n.tagType||vr(n.children))return!0;break;case 9:if(vr(n.branches))return!0;break;case 10:case 11:if(vr(n.children))return!0}}return!1}function gr(e){return 2!==e.type&&12!==e.type||(2===e.type?!!e.content.trim():gr(e.content))}const br=new WeakMap,yr=(e,t)=>function(){if(1!==(e=t.currentNode).type||0!==e.tagType&&1!==e.tagType)return;const{tag:n,props:r}=e,o=1===e.tagType;let s,a,l,c,u,d,f=o?function(e,t,n=!1){let{tag:r}=e;const o=Sr(r),i=$t(e,"is");if(i)if(o||sn("COMPILER_IS_ON_ELEMENT",t)){const e=6===i.type?i.value&&Tt(i.value.content,!0):i.exp;if(e)return Lt(t.helper(Je),[e])}else 6===i.type&&i.value.content.startsWith("vue:")&&(r=i.value.content.slice(4));const s=!o&&qt(e,"is");if(s&&s.exp)return Lt(t.helper(Je),[s.exp]);const a=Mt(r)||t.isBuiltInComponent(r);return a?(n||t.helper(a),a):(t.helper(Ge),t.components.add(r),nn(r,"component"))}(e,t):`"${n}"`,h=0,p=(0,i.Kn)(f)&&f.callee===Je||f===He||f===Ne||!o&&("svg"===n||"foreignObject"===n);if(r.length>0){const n=wr(e,t);s=n.props,h=n.patchFlag,u=n.dynamicPropNames;const r=n.directives;d=r&&r.length?Et(r.map((e=>function(e,t){const n=[],r=br.get(e);r?n.push(t.helperString(r)):(t.helper(Ke),t.directives.add(e.name),n.push(nn(e.name,"directive")));const{loc:o}=e;if(e.exp&&n.push(e.exp),e.arg&&(e.exp||n.push("void 0"),n.push(e.arg)),Object.keys(e.modifiers).length){e.arg||(e.exp||n.push("void 0"),n.push("void 0"));const t=Tt("true",!1,o);n.push(Ct(e.modifiers.map((e=>_t(e,t))),o))}return Et(n,e.loc)}(e,t)))):void 0,n.shouldUseBlock&&(p=!0)}if(e.children.length>0)if(f===je&&(p=!0,h|=1024),o&&f!==He&&f!==je){const{slots:n,hasDynamicSlots:r}=pr(e,t);a=n,r&&(h|=1024)}else if(1===e.children.length&&f!==He){const n=e.children[0],r=n.type,o=5===r||8===r;o&&0===Hn(n,t)&&(h|=1),a=o||2===r?n:e.children}else a=e.children;0!==h&&(l=String(h),u&&u.length&&(c=function(e){let t="[";for(let n=0,r=e.length;n<r;n++)t+=JSON.stringify(e[n]),n<r-1&&(t+=", ");return t+"]"}(u))),e.codegenNode=St(t,f,s,a,l,c,d,!!p,!1,o,e.loc)};function wr(e,t,n=e.props,r=!1){const{tag:o,loc:s,children:a}=e,l=1===e.tagType;let c=[];const u=[],d=[],f=a.length>0;let h=!1,p=0,m=!1,v=!1,g=!1,b=!1,y=!1,w=!1;const x=[],k=({key:e,value:n})=>{if(At(e)){const r=e.content,o=(0,i.F7)(r);if(l||!o||"onclick"===r.toLowerCase()||"onUpdate:modelValue"===r||(0,i.Gg)(r)||(b=!0),o&&(0,i.Gg)(r)&&(w=!0),20===n.type||(4===n.type||8===n.type)&&Hn(n,t)>0)return;"ref"===r?m=!0:"class"===r?v=!0:"style"===r?g=!0:"key"===r||x.includes(r)||x.push(r),!l||"class"!==r&&"style"!==r||x.includes(r)||x.push(r)}else y=!0};for(let a=0;a<n.length;a++){const p=n[a];if(6===p.type){const{loc:e,name:n,value:r}=p;let i=!0;if("ref"===n&&(m=!0,t.scopes.vFor>0&&c.push(_t(Tt("ref_for",!0),Tt("true")))),"is"===n&&(Sr(o)||r&&r.content.startsWith("vue:")||sn("COMPILER_IS_ON_ELEMENT",t)))continue;c.push(_t(Tt(n,!0,Bt(e,0,n.length)),Tt(r?r.content:"",i,r?r.loc:e)))}else{const{name:n,arg:a,exp:m,loc:v}=p,g="bind"===n,b="on"===n;if("slot"===n){l||t.onError(Fe(40,v));continue}if("once"===n||"memo"===n)continue;if("is"===n||g&&Ut(a,"is")&&(Sr(o)||sn("COMPILER_IS_ON_ELEMENT",t)))continue;if(b&&r)continue;if((g&&Ut(a,"key")||b&&f&&Ut(a,"vue:before-update"))&&(h=!0),g&&Ut(a,"ref")&&t.scopes.vFor>0&&c.push(_t(Tt("ref_for",!0),Tt("true"))),!a&&(g||b)){if(y=!0,m)if(c.length&&(u.push(Ct(xr(c),s)),c=[]),g){if(sn("COMPILER_V_BIND_OBJECT_ORDER",t)){u.unshift(m);continue}u.push(m)}else u.push({type:14,loc:v,callee:t.helper(ct),arguments:[m]});else t.onError(Fe(g?34:35,v));continue}const w=t.directiveTransforms[n];if(w){const{props:n,needRuntime:o}=w(p,e,t);!r&&n.forEach(k),c.push(...n),o&&(d.push(p),(0,i.yk)(o)&&br.set(p,o))}else(0,i.wh)(n)||(d.push(p),f&&(h=!0))}}let S;if(u.length?(c.length&&u.push(Ct(xr(c),s)),S=u.length>1?Lt(t.helper(ot),u,s):u[0]):c.length&&(S=Ct(xr(c),s)),y?p|=16:(v&&!l&&(p|=2),g&&!l&&(p|=4),x.length&&(p|=8),b&&(p|=32)),h||0!==p&&32!==p||!(m||w||d.length>0)||(p|=512),!t.inSSR&&S)switch(S.type){case 15:let e=-1,n=-1,r=!1;for(let t=0;t<S.properties.length;t++){const o=S.properties[t].key;At(o)?"class"===o.content?e=t:"style"===o.content&&(n=t):o.isHandlerKey||(r=!0)}const o=S.properties[e],i=S.properties[n];r?S=Lt(t.helper(at),[S]):(o&&!At(o.value)&&(o.value=Lt(t.helper(it),[o.value])),!i||At(i.value)||!g&&17!==i.value.type||(i.value=Lt(t.helper(st),[i.value])));break;case 14:break;default:S=Lt(t.helper(at),[Lt(t.helper(lt),[S])])}return{props:S,directives:d,patchFlag:p,dynamicPropNames:x,shouldUseBlock:h}}function xr(e){const t=new Map,n=[];for(let r=0;r<e.length;r++){const o=e[r];if(8===o.key.type||!o.key.isStatic){n.push(o);continue}const s=o.key.content,a=t.get(s);a?("style"===s||"class"===s||(0,i.F7)(s))&&kr(a,o):(t.set(s,o),n.push(o))}return n}function kr(e,t){17===e.value.type?e.value.elements.push(t.value):e.value=Et([e.value,t.value],e.loc)}function Sr(e){return"component"===e||"Component"===e}const Er=/-(\w)/g,Cr=(e=>{const t=Object.create(null);return e=>t[e]||(t[e]=(e=>e.replace(Er,((e,t)=>t?t.toUpperCase():"")))(e))})(),_r=(e,t)=>{if(Jt(e)){const{children:n,loc:r}=e,{slotName:o,slotProps:i}=function(e,t){let n,r='"default"';const o=[];for(let t=0;t<e.props.length;t++){const n=e.props[t];6===n.type?n.value&&("name"===n.name?r=JSON.stringify(n.value.content):(n.name=Cr(n.name),o.push(n))):"bind"===n.name&&Ut(n.arg,"name")?n.exp&&(r=n.exp):("bind"===n.name&&n.arg&&At(n.arg)&&(n.arg.content=Cr(n.arg.content)),o.push(n))}if(o.length>0){const{props:r,directives:i}=wr(e,t,o);n=r,i.length&&t.onError(Fe(36,i[0].loc))}return{slotName:r,slotProps:n}}(e,t),s=[t.prefixIdentifiers?"_ctx.$slots":"$slots",o,"{}","undefined","true"];let a=2;i&&(s[2]=i,a=3),n.length&&(s[3]=Rt([],n,!1,!1,r),a=4),t.scopeId&&!t.slotted&&(a=5),s.splice(a),e.codegenNode=Lt(t.helper(tt),s,r)}},Tr=/^\s*([\w$_]+|(async\s*)?\([^)]*?\))\s*=>|^\s*(async\s+)?function(?:\s+[\w$]+)?\s*\(/,Or=(e,t,n,r)=>{const{loc:o,modifiers:s,arg:a}=e;let l;if(e.exp||s.length||n.onError(Fe(35,o)),4===a.type)if(a.isStatic){let e=a.content;e.startsWith("vue:")&&(e=`vnode-${e.slice(4)}`),l=Tt((0,i.hR)((0,i._A)(e)),!0,a.loc)}else l=Ot([`${n.helperString(ft)}(`,a,")"]);else l=a,l.children.unshift(`${n.helperString(ft)}(`),l.children.push(")");let c=e.exp;c&&!c.content.trim()&&(c=void 0);let u=n.cacheHandlers&&!c&&!n.inVOnce;if(c){const e=Wt(c.content),t=!(e||Tr.test(c.content)),n=c.content.includes(";");(t||u&&e)&&(c=Ot([`${t?"$event":"(...args)"} => ${n?"{":"("}`,c,n?"}":")"]))}let d={props:[_t(l,c||Tt("() => {}",!1,o))]};return r&&(d=r(d)),u&&(d.props[0].value=n.cache(d.props[0].value)),d.props.forEach((e=>e.key.isHandlerKey=!0)),d},Lr=(e,t,n)=>{const{exp:r,modifiers:o,loc:s}=e,a=e.arg;return 4!==a.type?(a.children.unshift("("),a.children.push(') || ""')):a.isStatic||(a.content=`${a.content} || ""`),o.includes("camel")&&(4===a.type?a.isStatic?a.content=(0,i._A)(a.content):a.content=`${n.helperString(ut)}(${a.content})`:(a.children.unshift(`${n.helperString(ut)}(`),a.children.push(")"))),n.inSSR||(o.includes("prop")&&Rr(a,"."),o.includes("attr")&&Rr(a,"^")),!r||4===r.type&&!r.content.trim()?(n.onError(Fe(34,s)),{props:[_t(a,Tt("",!0,s))]}):{props:[_t(a,r)]}},Rr=(e,t)=>{4===e.type?e.isStatic?e.content=t+e.content:e.content=`\`${t}\${${e.content}}\``:(e.children.unshift(`'${t}' + (`),e.children.push(")"))},Dr=(e,t)=>{if(0===e.type||1===e.type||11===e.type||10===e.type)return()=>{const n=e.children;let r,o=!1;for(let e=0;e<n.length;e++){const t=n[e];if(Zt(t)){o=!0;for(let o=e+1;o<n.length;o++){const i=n[o];if(!Zt(i)){r=void 0;break}r||(r=n[e]={type:8,loc:t.loc,children:[t]}),r.children.push(" + ",i),n.splice(o,1),o--}}}if(o&&(1!==n.length||0!==e.type&&(1!==e.type||0!==e.tagType||e.props.find((e=>7===e.type&&!t.directiveTransforms[e.name]))||"template"===e.tag)))for(let e=0;e<n.length;e++){const r=n[e];if(Zt(r)||8===r.type){const o=[];2===r.type&&" "===r.content||o.push(r),t.ssr||0!==Hn(r,t)||o.push("1"),n[e]={type:12,content:r,loc:r.loc,codegenNode:Lt(t.helper(Ze),o)}}}}},Ar=new WeakSet,Ir=(e,t)=>{if(1===e.type&&qt(e,"once",!0)){if(Ar.has(e)||t.inVOnce)return;return Ar.add(e),t.inVOnce=!0,t.helper(ht),()=>{t.inVOnce=!1;const e=t.currentNode;e.codegenNode&&(e.codegenNode=t.cache(e.codegenNode,!0))}}},Mr=(e,t,n)=>{const{exp:r,arg:o}=e;if(!r)return n.onError(Fe(41,e.loc)),Fr();const i=r.loc.source,s=4===r.type?r.content:i;if(n.bindingMetadata[i],!s.trim()||!Wt(s))return n.onError(Fe(42,r.loc)),Fr();const a=o||Tt("modelValue",!0),l=o?At(o)?`onUpdate:${o.content}`:Ot(['"onUpdate:" + ',o]):"onUpdate:modelValue";let c;c=Ot([(n.isTS?"($event: any)":"$event")+" => ((",r,") = $event)"]);const u=[_t(a,e.exp),_t(l,c)];if(e.modifiers.length&&1===t.tagType){const t=e.modifiers.map((e=>(Pt(e)?e:JSON.stringify(e))+": true")).join(", "),n=o?At(o)?`${o.content}Modifiers`:Ot([o,' + "Modifiers"']):"modelModifiers";u.push(_t(n,Tt(`{ ${t} }`,!1,e.loc,2)))}return Fr(u)};function Fr(e=[]){return{props:e}}const Pr=/[\w).+\-_$\]]/,Hr=(e,t)=>{sn("COMPILER_FILTER",t)&&(5===e.type&&Nr(e.content,t),1===e.type&&e.props.forEach((e=>{7===e.type&&"for"!==e.name&&e.exp&&Nr(e.exp,t)})))};function Nr(e,t){if(4===e.type)jr(e,t);else for(let n=0;n<e.children.length;n++){const r=e.children[n];"object"==typeof r&&(4===r.type?jr(r,t):8===r.type?Nr(e,t):5===r.type&&Nr(r.content,t))}}function jr(e,t){const n=e.content;let r,o,i,s,a=!1,l=!1,c=!1,u=!1,d=0,f=0,h=0,p=0,m=[];for(i=0;i<n.length;i++)if(o=r,r=n.charCodeAt(i),a)39===r&&92!==o&&(a=!1);else if(l)34===r&&92!==o&&(l=!1);else if(c)96===r&&92!==o&&(c=!1);else if(u)47===r&&92!==o&&(u=!1);else if(124!==r||124===n.charCodeAt(i+1)||124===n.charCodeAt(i-1)||d||f||h){switch(r){case 34:l=!0;break;case 39:a=!0;break;case 96:c=!0;break;case 40:h++;break;case 41:h--;break;case 91:f++;break;case 93:f--;break;case 123:d++;break;case 125:d--}if(47===r){let e,t=i-1;for(;t>=0&&(e=n.charAt(t)," "===e);t--);e&&Pr.test(e)||(u=!0)}}else void 0===s?(p=i+1,s=n.slice(0,i).trim()):v();function v(){m.push(n.slice(p,i).trim()),p=i+1}if(void 0===s?s=n.slice(0,i).trim():0!==p&&v(),m.length){for(i=0;i<m.length;i++)s=Wr(s,m[i],t);e.content=s}}function Wr(e,t,n){n.helper(Xe);const r=t.indexOf("(");if(r<0)return n.filters.add(t),`${nn(t,"filter")}(${e})`;{const o=t.slice(0,r),i=t.slice(r+1);return n.filters.add(o),`${nn(o,"filter")}(${e}${")"!==i?","+i:i}`}}const Br=new WeakSet,zr=(e,t)=>{if(1===e.type){const n=qt(e,"memo");if(!n||Br.has(e))return;return Br.add(e),()=>{const r=e.codegenNode||t.currentNode.codegenNode;r&&13===r.type&&(1!==e.tagType&&rn(r,t),e.codegenNode=Lt(t.helper(yt),[n.exp,Rt(void 0,r),"_cache",String(t.cached++)]))}}};function Vr(e,t={}){const n=t.onError||Ie,r="module"===t.mode;!0===t.prefixIdentifiers?n(Fe(46)):r&&n(Fe(47)),t.cacheHandlers&&n(Fe(48)),t.scopeId&&!r&&n(Fe(49));const o=(0,i.HD)(e)?function(e,t={}){const n=function(e,t){const n=(0,i.l7)({},un);let r;for(r in t)n[r]=void 0===t[r]?un[r]:t[r];return{options:n,column:1,line:1,offset:0,originalSource:e,source:e,inPre:!1,inVPre:!1,onWarn:n.onWarn}}(e,t),r=En(n);return function(e,t=kt){return{type:0,children:e,helpers:[],components:[],directives:[],hoists:[],imports:[],cached:0,temps:0,codegenNode:void 0,loc:t}}(dn(n,0,[]),Cn(n,r))}(e,t):e,[s,a]=[[Ir,er,zr,or,Hr,_r,yr,fr,Dr],{on:Or,bind:Lr,model:Mr}];return Vn(o,(0,i.l7)({},t,{prefixIdentifiers:!1,nodeTransforms:[...s,...t.nodeTransforms||[]],directiveTransforms:(0,i.l7)({},a,t.directiveTransforms||{})})),function(e,t={}){const n=function(e,{mode:t="function",prefixIdentifiers:n="module"===t,sourceMap:r=!1,filename:o="template.vue.html",scopeId:i=null,optimizeImports:s=!1,runtimeGlobalName:a="Vue",runtimeModuleName:l="vue",ssrRuntimeModuleName:c="vue/server-renderer",ssr:u=!1,isTS:d=!1,inSSR:f=!1}){const h={mode:t,prefixIdentifiers:n,sourceMap:r,filename:o,scopeId:i,optimizeImports:s,runtimeGlobalName:a,runtimeModuleName:l,ssrRuntimeModuleName:c,ssr:u,isTS:d,inSSR:f,source:e.loc.source,code:"",column:1,line:1,offset:0,indentLevel:0,pure:!1,map:void 0,helper:e=>`_${xt[e]}`,push(e,t){h.code+=e},indent(){p(++h.indentLevel)},deindent(e=!1){e?--h.indentLevel:p(--h.indentLevel)},newline(){p(h.indentLevel)}};function p(e){h.push("\n"+"  ".repeat(e))}return h}(e,t);t.onContextCreated&&t.onContextCreated(n);const{mode:r,push:o,prefixIdentifiers:i,indent:s,deindent:a,newline:l,scopeId:c,ssr:u}=n,d=e.helpers.length>0,f=!i&&"module"!==r;if(function(e,t){const{ssr:n,prefixIdentifiers:r,push:o,newline:i,runtimeModuleName:s,runtimeGlobalName:a,ssrRuntimeModuleName:l}=t,c=a,u=e=>`${xt[e]}: _${xt[e]}`;e.helpers.length>0&&(o(`const _Vue = ${c}\n`),e.hoists.length)&&o(`const { ${[qe,$e,Ue,Ze,Ye].filter((t=>e.helpers.includes(t))).map(u).join(", ")} } = _Vue\n`),function(e,t){if(!e.length)return;t.pure=!0;const{push:n,newline:r,helper:o,scopeId:i,mode:s}=t;r();for(let o=0;o<e.length;o++){const i=e[o];i&&(n(`const _hoisted_${o+1} = `),Jn(i,t),r())}t.pure=!1}(e.hoists,t),i(),o("return ")}(e,n),o(`function ${u?"ssrRender":"render"}(${(u?["_ctx","_push","_parent","_attrs"]:["_ctx","_cache"]).join(", ")}) {`),s(),f&&(o("with (_ctx) {"),s(),d&&(o(`const { ${e.helpers.map((e=>`${xt[e]}: _${xt[e]}`)).join(", ")} } = _Vue`),o("\n"),l())),e.components.length&&(Zn(e.components,"component",n),(e.directives.length||e.temps>0)&&l()),e.directives.length&&(Zn(e.directives,"directive",n),e.temps>0&&l()),e.filters&&e.filters.length&&(l(),Zn(e.filters,"filter",n),l()),e.temps>0){o("let ");for(let t=0;t<e.temps;t++)o(`${t>0?", ":""}_temp${t}`)}return(e.components.length||e.directives.length||e.temps)&&(o("\n"),l()),u||o("return "),e.codegenNode?Jn(e.codegenNode,n):o("null"),f&&(a(),o("}")),a(),o("}"),{ast:e,code:n.code,preamble:"",map:n.map?n.map.toJSON():void 0}}(o,(0,i.l7)({},t,{prefixIdentifiers:!1}))}const qr=Symbol(""),$r=Symbol(""),Ur=Symbol(""),Zr=Symbol(""),Yr=Symbol(""),Gr=Symbol(""),Jr=Symbol(""),Kr=Symbol(""),Xr=Symbol(""),Qr=Symbol("");var eo;let to;eo={[qr]:"vModelRadio",[$r]:"vModelCheckbox",[Ur]:"vModelText",[Zr]:"vModelSelect",[Yr]:"vModelDynamic",[Gr]:"withModifiers",[Jr]:"withKeys",[Kr]:"vShow",[Xr]:"Transition",[Qr]:"TransitionGroup"},Object.getOwnPropertySymbols(eo).forEach((e=>{xt[e]=eo[e]}));const no=(0,i.fY)("style,iframe,script,noscript",!0),ro={isVoidTag:i.WB,isNativeTag:e=>(0,i.eS)(e)||(0,i.aN)(e),isPreTag:e=>"pre"===e,decodeEntities:function(e,t=!1){return to||(to=document.createElement("div")),t?(to.innerHTML=`<div foo="${e.replace(/"/g,"&quot;")}">`,to.children[0].getAttribute("foo")):(to.innerHTML=e,to.textContent)},isBuiltInComponent:e=>It(e,"Transition")?Xr:It(e,"TransitionGroup")?Qr:void 0,getNamespace(e,t){let n=t?t.ns:0;if(t&&2===n)if("annotation-xml"===t.tag){if("svg"===e)return 1;t.props.some((e=>6===e.type&&"encoding"===e.name&&null!=e.value&&("text/html"===e.value.content||"application/xhtml+xml"===e.value.content)))&&(n=0)}else/^m(?:[ions]|text)$/.test(t.tag)&&"mglyph"!==e&&"malignmark"!==e&&(n=0);else t&&1===n&&("foreignObject"!==t.tag&&"desc"!==t.tag&&"title"!==t.tag||(n=0));if(0===n){if("svg"===e)return 1;if("math"===e)return 2}return n},getTextMode({tag:e,ns:t}){if(0===t){if("textarea"===e||"title"===e)return 1;if(no(e))return 2}return 0}},oo=(e,t)=>{const n=(0,i.yL)(e);return Tt(JSON.stringify(n),!1,t,3)};function io(e,t){return Fe(e,t)}const so=(0,i.fY)("passive,once,capture"),ao=(0,i.fY)("stop,prevent,self,ctrl,shift,alt,meta,exact,middle"),lo=(0,i.fY)("left,right"),co=(0,i.fY)("onkeyup,onkeydown,onkeypress",!0),uo=(e,t)=>At(e)&&"onclick"===e.content.toLowerCase()?Tt(t,!0):4!==e.type?Ot(["(",e,`) === "onClick" ? "${t}" : (`,e,")"]):e,fo=(e,t)=>{1!==e.type||0!==e.tagType||"script"!==e.tag&&"style"!==e.tag||(t.onError(io(60,e.loc)),t.removeNode())},ho=[e=>{1===e.type&&e.props.forEach(((t,n)=>{6===t.type&&"style"===t.name&&t.value&&(e.props[n]={type:7,name:"bind",arg:Tt("style",!0,t.loc),exp:oo(t.value.content,t.loc),modifiers:[],loc:t.loc})}))}],po={cloak:()=>({props:[]}),html:(e,t,n)=>{const{exp:r,loc:o}=e;return r||n.onError(io(50,o)),t.children.length&&(n.onError(io(51,o)),t.children.length=0),{props:[_t(Tt("innerHTML",!0,o),r||Tt("",!0))]}},text:(e,t,n)=>{const{exp:r,loc:o}=e;return r||n.onError(io(52,o)),t.children.length&&(n.onError(io(53,o)),t.children.length=0),{props:[_t(Tt("textContent",!0),r?Lt(n.helperString(rt),[r],o):Tt("",!0))]}},model:(e,t,n)=>{const r=Mr(e,t,n);if(!r.props.length||1===t.tagType)return r;e.arg&&n.onError(io(55,e.arg.loc));const{tag:o}=t,i=n.isCustomElement(o);if("input"===o||"textarea"===o||"select"===o||i){let s=Ur,a=!1;if("input"===o||i){const r=$t(t,"type");if(r){if(7===r.type)s=Yr;else if(r.value)switch(r.value.content){case"radio":s=qr;break;case"checkbox":s=$r;break;case"file":a=!0,n.onError(io(56,e.loc))}}else(function(e){return e.props.some((e=>!(7!==e.type||"bind"!==e.name||e.arg&&4===e.arg.type&&e.arg.isStatic)))})(t)&&(s=Yr)}else"select"===o&&(s=Zr);a||(r.needRuntime=n.helper(s))}else n.onError(io(54,e.loc));return r.props=r.props.filter((e=>!(4===e.key.type&&"modelValue"===e.key.content))),r},on:(e,t,n)=>Or(e,0,n,(t=>{const{modifiers:r}=e;if(!r.length)return t;let{key:o,value:s}=t.props[0];const{keyModifiers:a,nonKeyModifiers:l,eventOptionModifiers:c}=((e,t,n,r)=>{const o=[],i=[],s=[];for(let r=0;r<t.length;r++){const a=t[r];"native"===a&&an("COMPILER_V_ON_NATIVE",n)||so(a)?s.push(a):lo(a)?At(e)?co(e.content)?o.push(a):i.push(a):(o.push(a),i.push(a)):ao(a)?i.push(a):o.push(a)}return{keyModifiers:o,nonKeyModifiers:i,eventOptionModifiers:s}})(o,r,n,e.loc);if(l.includes("right")&&(o=uo(o,"onContextmenu")),l.includes("middle")&&(o=uo(o,"onMouseup")),l.length&&(s=Lt(n.helper(Gr),[s,JSON.stringify(l)])),!a.length||At(o)&&!co(o.content)||(s=Lt(n.helper(Jr),[s,JSON.stringify(a)])),c.length){const e=c.map(i.kC).join("");o=At(o)?Tt(`${o.content}${e}`,!0):Ot(["(",o,`) + "${e}"`])}return{props:[_t(o,s)]}})),show:(e,t,n)=>{const{exp:r,loc:o}=e;return r||n.onError(io(58,o)),{props:[],needRuntime:n.helper(Kr)}}},mo=Object.create(null);(0,o.Y1)((function(e,t){if(!(0,i.HD)(e)){if(!e.nodeType)return i.dG;e=e.innerHTML}const n=e,o=mo[n];if(o)return o;if("#"===e[0]){const t=document.querySelector(e);e=t?t.innerHTML:""}const{code:s}=function(e,t={}){return Vr(e,(0,i.l7)({},ro,t,{nodeTransforms:[fo,...ho,...t.nodeTransforms||[]],directiveTransforms:(0,i.l7)({},po,t.directiveTransforms||{}),transformHoist:null}))}(e,(0,i.l7)({hoistStatic:!0,onError:void 0,onWarn:i.dG},t)),a=new Function("Vue",s)(r);return a._rc=!0,mo[n]=a}))},4515:(e,t,n)=>{var r={"./index.ts":6395};function o(e){var t=i(e);return n(t)}function i(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=i,e.exports=o,o.id=4515},4884:e=>{"use strict";e.exports=()=>window.__DOCS__},9984:e=>{"use strict";e.exports=__DOCS_CONFIG__},7648:(e,t,n)=>{"use strict";n.d(t,{MT:()=>o,IV:()=>c,U2:()=>a,t8:()=>l});function r(e){return new Promise(((t,n)=>{e.oncomplete=e.onsuccess=()=>t(e.result),e.onabort=e.onerror=()=>n(e.error)}))}function o(e,t){const n=(!navigator.userAgentData&&/Safari\//.test(navigator.userAgent)&&!/Chrom(e|ium)\//.test(navigator.userAgent)&&indexedDB.databases?new Promise((function(e){var t=function(){return indexedDB.databases().finally(e)};o=setInterval(t,100),t()})).finally((function(){return clearInterval(o)})):Promise.resolve()).then((()=>{const n=indexedDB.open(e);return n.onupgradeneeded=()=>n.result.createObjectStore(t),r(n)}));var o;return(e,r)=>n.then((n=>r(n.transaction(t,e).objectStore(t))))}let i;function s(){return i||(i=o("keyval-store","keyval")),i}function a(e,t=s()){return t("readonly",(t=>r(t.get(e))))}function l(e,t,n=s()){return n("readwrite",(n=>(n.put(t,e),r(n.transaction))))}function c(e,t=s()){return t("readwrite",(t=>(t.delete(e),r(t.transaction))))}}},t={};function n(r){var o=t[r];if(void 0!==o)return o.exports;var i=t[r]={exports:{}};return e[r].call(i.exports,i,i.exports,n),i.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{"use strict";var e=n(4359),t=n(2626),r=n(872),o=n(5701),i=n(9984),s=n.n(i),a=n(2110);function l(e){setTimeout((function(){e(function(){var e;if("number"==typeof s().flags)e=s().flags;else{if(!c())return!1;if("number"!=typeof s().flags)return!1;e=s().flags}var n=h(f("73696465626172"),f("444F432D53494445424152"),f("646F63732D706F77657265642D6279"),document.children),r=0===n.length&&t.h.state.unloading;if(n.length>0)for(var o=0;o<n.length;++o){var i=n[o],a=null==i?void 0:i.firstChild,l=null==i?void 0:i.querySelector("svg");if(!(i&&a&&l&&i.getAttribute(f("68726566"))===f("68747470733A2F2F7265747970652E636F6D2F")&&a.innerHTML===f("506F7765726564206279")&&l.getAttribute(f("7769647468"))===f("3936")&&l.getAttribute(f("686569676874"))===f("3230")&&1045===l.innerHTML.replace(/\s+/g,"").split("").map((function(e){return e.charCodeAt(0)})).reduce((function(e,t){return e^23*t}),0)))return!1;r||i&&(i.offsetWidth||i.offsetHeight||i.getClientRects().length)&&(r=!0)}return r||(1&e)*(2&e)>0}())}),10)}function c(){var e,t=d();if(!t)return!1;for(var n=parseInt(t.checksum.slice(0,-5)||"0"),r=[s().id,t.fingerprint,".",t.signature,s().base,s().host,n.toString()],o=0,i=s().sidebar;o<i.length;o++){var a=i[o];r.push(null!==(e=a.l)&&void 0!==e?e:a.n)}for(var l=0,c=0,u=r;c<u.length;c++)for(var f=u[c],h=0;h<f.length;++h)l^=f.charCodeAt(h);return l===parseInt(t.checksum.slice(-5))&&(s().flags=n,!0)}function u(t,n,r){if(!n){var o="5B464154414C5D3A20436F".concat(727275,"7074656420776"),i=function(){t&&t.unmount();var e="56273697".concat(4652063,"6F6E66696775726174696F6E"),n=document.getElementById(f("646F63732D617070"));n&&(n.innerHTML="",window[f("636F6E736F6C65")][f("6572726F72")](f(o+e)))};r?(0,e.Y3)((function(){return i()})):i()}}function d(){var e=null===s()||void 0===s()?void 0:s().key;if(!e||"string"!=typeof e)return null;var t=e.indexOf(".");if(t<=0)return null;var n=e.lastIndexOf(".");if(n<=t)return null;for(var r={fingerprint:e.slice(0,t),signature:e.slice(t+1,n),checksum:e.slice(n+1)},o=r.signature.length%4;o>0;--o)r.signature+="=";return r}function f(e){for(var t="",n=0;n<e.length;n+=2)t+=String.fromCharCode(parseInt(e.substr(n,2),16));return t}function h(e,t,n,r,o,i){null!=i||(i=[]);for(var s=0;s<r.length;++s){var a=r[s];if("A"===a.nodeName&&a.classList.contains(n)&&a instanceof HTMLElement)i.push(a);else{var l=a.children.length?a.children:"TEMPLATE"===a.nodeName&&a instanceof HTMLTemplateElement&&a.content.children?a.content.children:null;(null==l?void 0:l.length)&&h(e,t,n,l,o,i)}}return i}var p=n(4884),m=n.n(p);const v=()=>window.__DOCS_MERMAID__;var g=n.n(v);const b=()=>window.__DOCS_PRISM__;var y=n.n(b);const w=()=>window.__DOCS_KATEX__;var x,k,S,E,C,_,T=n.n(w),O=n(6184),L=n(7023),R=n(5184),D=n(5543),A=n(8816),I=n(7755),M=n(7924);(0,O.BL)(),"file:"===location.protocol.toLowerCase()&&(O.nP.drive=!1,O.nP.navigator.proposeVisit=function(e){window.location.href=e.toString()});var F="reloadPosition=";null!==(x=window.retype)&&void 0!==x||(window.retype={}),null!==(k=(S=window.retype).reload)&&void 0!==k||(S.reload=function(e,t){if(e){var n=location.pathname.endsWith("/")||/[.]html?$/i.test(location.pathname)?location.pathname:location.pathname+"/";document.cookie="".concat(F).concat(window.scrollX,",").concat(window.scrollY,";path=").concat(n,";max-age=5"),window.location.reload()}else{C=[window.scrollX,window.scrollY],_=window.location.hash;var r=window.location.href,o=_?window.location.pathname+window.location.search:r;(0,O.Vn)(o,{action:"replace"}),t&&(0,A.v2)()}}),document.addEventListener("turbo:load",(function(){var i,f,h;if(t.h.state.initialPageLoad){if(!c())return void u(E,!1);(function(){var e,t,n,r,o;return t=this,n=void 0,o=function(){var t,n,r,o,i,l,c,u,f,h,p,m,v,g,b;return function(e,t){var n,r,o,i,s={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function a(i){return function(a){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;s;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return s.label++,{value:i[1],done:!1};case 5:s.label++,r=i[1],i=[0];continue;case 7:i=s.ops.pop(),s.trys.pop();continue;default:if(!((o=(o=s.trys).length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){s=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){s.label=i[1];break}if(6===i[0]&&s.label<o[1]){s.label=o[1],o=i;break}if(o&&s.label<o[2]){s.label=o[2],s.ops.push(i);break}o[2]&&s.ops.pop(),s.trys.pop();continue}i=t.call(e,s)}catch(e){i=[6,e],r=0}finally{n=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,a])}}}(this,(function(y){switch(y.label){case 0:if(!(t=d()))return[2,!1];for(n=parseInt(t.checksum.slice(0,-5)||"0"),r=atob(t.signature),o=[],g=0;g<r.length;++g)o.push(r.charCodeAt(g));for(i=[s().id,s().base,s().host,n.toString()],l=0,c=s().sidebar;l<c.length;l++)u=c[l],i.push(null!==(e=u.l)&&void 0!==e?e:u.n);return i.push(t.fingerprint),f=i.join(""),h=new TextEncoder,p=new TextDecoder,[4,crypto.subtle.digest("SHA-256",h.encode(f))];case 1:for(m=y.sent(),v=[48,71,48,115,103,125,49,133,75,132,137,14,25,65,99,18,116,124,42,116,85,72,11,45,125,183,150,91,96,33,111,30,32,103,88,212,96,188,182,160,83,67,148,88,185,171,117,178,221,234,50,86,254,60,165,240,3,106,69,30,235,147,143,222,64,97,80,223,163,20,180,16,45,166,117,156,157,202,217,232,216,165,93,4,176,78,44,97,133,2,3,1,0,1],g=a.u.length+a.bT.length;g>0;--g)v[g%v.length]^=a.u[g%a.u.length]^a.bT[g%a.bT.length];return[4,crypto.subtle.importKey("spki",new Uint8Array(v),{name:p.decode(a.u),hash:p.decode(a.bT)},!1,["verify"])];case 2:return b=y.sent(),[4,crypto.subtle.verify(b.algorithm,b,new Uint8Array(o),m)];case 3:return[2,y.sent()]}}))},new((r=void 0)||(r=Promise))((function(e,i){function s(e){try{l(o.next(e))}catch(e){i(e)}}function a(e){try{l(o.throw(e))}catch(e){i(e)}}function l(t){var n;t.done?e(t.value):(n=t.value,n instanceof r?n:new r((function(e){e(n)}))).then(s,a)}l((o=o.apply(t,n||[])).next())}))})().then((function(e){return u(E,e,!0)}))}else E.unmount();(function(){E=(0,e.ri)((0,e.aZ)({name:"DocApp",compilerOptions:{delimiters:["\0\0","\0\0"]},setup:function(){var n=(0,t.oR)().store;(0,r.g)(n),n.actions.resetMemberData();var o=function(){var t=(0,e.iH)(!1),n=null;return(0,L.zX)(window,"scroll",(function(){t.value=!0,null!==n&&clearTimeout(n),n=setTimeout((function(){t.value=!1}),100)})),{isScrolling:t}}().isScrolling;(0,e.YP)(o,(function(e){n.state.isWindowScrolling=e}),{immediate:!0}),(0,e.bv)((function(){(0,e.Y3)((function(){n.state.initialPageLoad=!1}))})),function(){var e=(0,t.oR)().store,n=(0,R.B)().scrollTo;(0,L.zX)(window,"popstate",(function(){var t;if(window.location.hash){var r=decodeURIComponent(window.location.hash);(null!==(t=document.getElementById(r.slice(1)))&&void 0!==t?t:document.querySelector(r))&&n(r,{offset:D.vE,onStart:function(){e.actions.updateScrolledElementId(r.substr(1))}})}}))}()}})),E.provide(t.$Q,t.h),E.provide(o.Mu,o.Ke);var i=n(4515);i.keys().forEach((function(e){var t=i(e);Object.keys(t).forEach((function(e){E.component(e,t[e])}))}));var s=document.getElementById("docs-app");if(s&&s.parentElement){var a=s.parentElement;s.querySelectorAll("script, style").forEach((function(e){e.remove(),a.appendChild(e)}))}E.mount("#docs-app")})(),l((function(e){return u(E,e)})),(null===(f=null===(i=window.retype)||void 0===i?void 0:i.editor)||void 0===f?void 0:f.initView)&&window.retype.editor.initView();var p=m()();(null==p?void 0:p.hasPrism)&&(0,I.b)("prism-js",y(),(function(e){return null==e?void 0:e.initPrism()})),(null==p?void 0:p.hasMermaid)&&(0,I.b)("mermaid-js",g(),(function(e){return null==e?void 0:e.initMermaid()})),(null==p?void 0:p.hasMath)&&(0,I.b)("katex-js",T(),(function(e){return null==e?void 0:e.initKatex()})),document.querySelectorAll(".scrollbar").forEach((function(e){e.classList.remove("overflow-hidden"),new M.Z(e)})),_&&(history.replaceState(history.state,document.title,window.location.pathname+_+window.location.search),_=null);var v=!1;if(C)window.scrollTo.apply(window,C),C=null,v=!0;else if(t.h.state.initialPageLoad){var b=null===(h=document.cookie.split(";").find((function(e){return e.trim().startsWith(F)})))||void 0===h?void 0:h.trim();if(b){var w=b.slice(F.length).split(",");w&&2==w.length&&/^\d+$/.test(w[0])&&/^\d+$/.test(w[1])&&(t.h.state.isScrollPositionRestored=!0,setTimeout((function(){t.h.state.isScrollPositionRestored=!1}),3e3),window.scrollTo(Number.parseInt(w[0]),Number.parseInt(w[1])),v=!0)}}v&&O.ry.currentVisit&&(O.ry.currentVisit.scrolled=!0),t.h.actions.updateMemberFilter(""),t.h.actions.updateSearchQuery("")})),window.addEventListener("beforeunload",(function(){t.h.state.unloading=!0}))})()})();
\ No newline at end of file
diff --git a/resources/js/search.json b/resources/js/search.json
new file mode 100644
index 0000000..c4d44b7
--- /dev/null
+++ b/resources/js/search.json
@@ -0,0 +1 @@
+[[{"i":"#","p":["Documentation for BlissRom"]},{"l":"Getting Started"}],[{"l":"Build BlissRom"},{"l":"Introduction","p":["This is the official guide to build BlissRom for your device. In this guide, we will only cover official devices with actual maintainers. We will not delve into porting devices.","The golden rule to building is patience. If something breaks, wait for your maintainer to fix it, send a polite message to your maintainer, or better yet, try and fix it yourself. Then you can make a merge request and contribute!","Let’s get started."]},{"l":"Preparation","p":["To get started, you need a computer with Ubuntu 18.04 (LTS), at least 200GB space of HDD, and at least 8GB RAM. A decent CPU (or CPUs if you have a server motherboard) is recommended. Other distros can work but is not officially supported in this guide.","Underpowered machines may crash during compilation. If that happens, you may try and restart the build as most crashes are caused by lack of memory. If your storage space has run out, then you will need to build on a different hard drive."]},{"l":"Install the JDK","p":["Install OpenJDK:"]},{"l":"Install build tools","p":["To install the required build tools, run the following command:"]},{"l":"Install source code tools","p":["Now we need to get the source code via a program named repo. The primary function of repo is to read a manifest file located in BlissRoms GitHub organization, and find what repositories you need to actually build Android.","Create a ~/bin directory for repo:","The -p flag instructs mkdir to only create the directory if it does not exist in the first place. Now download the repo tool into ~/bin:","Make repo executable:","And add it to PATH:","Scroll to the end of the file and type these lines:","Ctrl-O and enter to save, then Ctrl-X to exit nano. Now either logout and login again (or reboot), or source the file:","Which can be shortened to:"]},{"i":"what-is-source","l":"What is source?","p":["source is a bash command to read aliases, functions, and commands from the specified file. Typically, you'll supply bash with a configuration file such as .bashrc or .bash_profile, or an initialization file such as envsetup.sh. The difference is that while the configuration file lists configuration and user-defined aliases and functions, initialization files typically hold build commands such as breakfast, brunch, and lunch. Without those commands building would be significantly harder as you would have to memorize the long command to invoke a build manually!","But why do you need to run it after modifying a file? Well, bash cannot automatically detect changes in our files. To solve this, we either source it or log out and log back in, forcing bash to reload configuration files. Keep this in mind, because unlike configuration files, if you forget to source initialization files, build commands will not function!"]},{"l":"Download","p":["Create a directory for the source:","Before we download, we need to tell repo and git who we are. Run the following commands, substituting your information:","Now, we’re ready to initialize. We need to tell repo which manifest to read:","-b is for the branch, and we’re on q, Android 10. It’ll take a couple of seconds. You may need to type y for the color prompt.","Then sync the source:","Note: For more information about the repo tool, visit the Build Tips guide to learn more about the repo flags.","repo will start downloading all the code. That’s going to be slow, even on a fiber network. Expect downloads to take more than a couple hours."]},{"l":"Build","p":["Set up the build environment:","This is the initialization file we talked about earlier up top. This \"initializes\" the environment, and imports a bunch of useful build commands required to build your device. Again, you need to remember to source this file every time you log out and log back in, or launch a new bash/Terminal instance.","Define what device you’re going to build. For example, the Pixel 4A, has a codename of sunfish. You can check your specific device's codename on GitHub or on Google. Execute:","What does this do? breakfast searches repositories for your device \"tree\", which contains all the details needed to make the build suitable for your device. CPU, kernel info, device screen size, whether the board has Bluetooth, NFC, what frequencies the build needs for Wi-Fi, and a bunch of other things. breakfast will automatically search in the BlissRoms-Devices GitHub repository, and grab your device tree for you.","Okay, so we have the device tree set up. Feel free to browse around the source code to see what changed. You should see folders added to device/, kernel/ and vendor/. A shortcut:","will dump you back in the root of the source code tree. So if you’ve been going through folders and don’t have any idea where you are, you can use the above command. This command, however, requires you to have source d build/envsetup.sh earlier.","We're ready to build, but before we teach you the easy command to execute a build, we will first try the manual method. To set up the current terminal environment for building your particular device, execute:","Let's break down the command. lunch initializes the proper environmental variables required for the build tools to build your specific device. Things like BLISS_DEVICE and other variables are set in this stage, and the changed variables will be shown as output. bliss_ is the ROM that we are building. As convention, all devices will have this prefix. sunfish is the specific device we are building - in this case, the Pixel 4A. Finally, userdebug means that we will build a user-debuggable variant. This is usually what most ROMs use for publishing their builds. Manufacturers typically use user which disables most of the useful Android Logcats."]},{"i":"my-device-isnt-booting-and-userdebug-wont-print-any-adb-logcats-what-gives","l":"My device isn't booting, and userdebug won't print any adb logcats. What gives?","p":["There is a third build variant called eng, short for engineering builds. These builds will activate adb logcat during boot, and will show you exactly what is going wrong, where, and why. However, these builds are NOT recommended for normal usage as they are not securely hardened, have log spam that will slow down your device, and other unexpected problems like userspace utilities crashing during runtime. If you want to submit your device for mainline, do NOT submit an eng build!","All set? Let's start the building process. Run:","mka blissify","And the build should start. The build process will take a long time. Prepare to wait a few hours, even on a decent machine."]},{"i":"why-mka-and-not-make","l":"Why mka and not make?","p":["make only runs with 1 thread. mka is properly aliased to use all of your threads by checking nproc.","If you want to customize your thread count (maybe you're building with a fan-screaming laptop in a quiet coffee shop), use make blissify -j#, replacing the hash with the number of threads (example of make blissify -j4)."]},{"i":"i-get-an-error-about-no-blissify-targets-to-build-against-whats-wrong","l":"I get an error about no blissify targets to build against, what's wrong?","p":["If you are building other ROMs, it is usually make bacon. For BlissRoms, we chose the build target of blissify. If that doesn't work, sometimes there is a bug, or the ROM developers do not implement a bacon target to build against. In this case, you will need to find what name they use to initialize a full build of the ROM. Conventionally, it is supposed to be bacon, but some ROM developers change this name inadvertently, or actually have a bug that causes the build target to never be found. If you cannot locate the build target, ask the developers of the ROM. Alternatively, you can try poking around in build/make/core/Makefile to see what the build target name is. But this is out of the scope of this article as you're not supposed to be building other ROMs (that's not what this tutorial is for, sorry!)","All right, but that's annoying. You had to type three commands to build it all. What about running one command?","Options:","Examples:","To build with gapps","To build with FOSS","To build with gapps and deviceclean","To build an userdebug build with gapps","To build an eng build with gapps","To build an user build with gapps","This method is also backwards compatible with the legacy blissify command also Default build type = userdebug Default build variant = vanilla","But what is blissify? It is a compact form of these commands:","Sounds great, right? Once you have run the command, jump over to the next section."]},{"l":"After building","p":["There are two outcomes to a build - either it fails and you get a red error message from make, or it succeeds and you see the Bliss logo in ASCII. If you encounter the former, you need to go back and fix whatever it's complaining about. Typically, 90% of the time the problem will be in your device tree. For the other 10%, submit a bug report to the ROM developers. Be sure to include the full log of your build to help diagnose the problem, and your device tree.","If you face the latter, congratulations! You've successfully built BlissRoms for your device. Grab the artifacts for your device:","In here, you’ll find a .zip that goes along the lines of Bliss-v14.4-sunfish-UNOFFICIAL-vanilla-20210615.zip. Install TWRP, flash the build to your device, and enjoy!"]}],[{"l":"Troubleshoot"},{"l":"Troubleshooting","p":["If your build failed, there are a couple things you can try.","Try a fresh repo sync to make your repository up to date. Sometimes, the Internet connection between you and GitHub can be flaky. In rare cases a commit merge might be ongoing, and you might've grabbed an incomplete merge. Mostly, this should fix the issue 70% of the time.","Make sure your dependencies are installed correctly. Error messages help out a lot here! Often it will say shared/linked library not found or something along those lines.","Make sure you sourced build/envsetup.sh. This is especially common and worth suspecting if none of the build commands like breakfast and lunch work. If you have repo sync ed do this again.","Make sure you’re at the root of the build tree. Again, to quickly jump there, use croot.","Make sure you ran breakfast correctly and it did not error out. Missing device files will prevent successful builds.","Make sure your computer meets minimum requirements to compile AOSP. Chances are, you need more memory/CPU power to complete a build.","Make sure your computer isn't faulty. This is unlikely, but to check, use a stress-test program like Prime95.","If something goes wrong and you've tried everything above, first use Google to look up your error! Most of the errors you encounter is due to misconfiguration and wrong commands entered. More often than not, Google will have the answer you are looking for. If you're still stuck and nothing fixes the problem, then ask us via our Telegram Build Support chat.(Please only ask issues about BlissRoms, not other custom ROMs as we are unable to assist with those!)"]}],[{"l":"Conclusion"},{"l":"Conclusion","p":["Building a ROM is very hard and tedious and the results are very rewarding! If you managed to follow along, congratulations!","After you finish building, you can try out the Git Started guide. Make changes, commit, and send them off to our Gerrit for review! Or better yet, download experimental commits not ready for the mainline repositories and review them! Again, ROM building is a fun project you can work with. I hope this guide was a lot of fun to run through!"]}],[{"l":"BlissRoms Maintainer Requirements","p":["Before you apply for maintainership to add your device to our official devices list, please read the following requirements carefully.","Warning: Any violations found or any attempts to circumvent the requirements below may lead to your application being rejected and you being blacklisted from the maintainer program.","You must physically own the device you are applying official status for. We do not allow blind builds.","We may allow exceptions if a trusted friend owns the device and is willing to help test your builds. However, this will only be approved on a case-by-case basis.","Asking users to test blind builds is not allowed.","You must have a working knowledge of Git and Gerrit.","You must maintain said device unofficially for at least 1 month with constant updates. Make sure builds are stable for usage. Users should not report any significant problems with your build.","You must release your device sources publicly with proper authorship on every commit. We do not allow hiding sources to \"compete\" with other ROM teams, as we believe that goes against the open source spirit.","Once applied, please do not spam team members with updates regarding your application. We will respond within a week with your application decision."]}],[{"i":"maintainers-code-of-conduct","l":"Maintainers Code of Conduct:","p":["About Sepolicy Rules, the maintainers MUST NOT:","All theirs device sources on BlissRoms-Devices organization. It goes without saying that these should be fully buildable. Using external repos for build releases aren't allowed, unless they're from LineageOS/TheMuppets organization(s). Exceptions may be open if only it's absolutely necessary.","Allow write access to generic directory/file/prop labels (With some exceptions).","Any Apps that are not shipped with BlissRoms. This includes Browsers and other apps.","Any stock firmware apps. Only Google Camera and camera app from stock firmware is allowed only if its fully functional.","If any of these rules are broken, the administration will take direct action against the maintainer without prior warning.","Ignore Sepolicy Neverallows.","In the event of any disagreements between maintainers, sort them out via direct messages on Telegram or XDA. Do not take your fights to our chats, approach the administration if you want something sorted out quickly. The same is valid for our public chat.","MUST maintain authorship of git commits that are pushed, this is a mandatory requirement for ALL repositories. Force-pushes are acceptable, but try to keep them to a minimum.","MUST NOT add:","MUST NOT get involved in arguments or resort to insults, or use hateful words, personal attacks or any other verbal or nonverbal action that is considered detrimental towards the creation of a positive environment for the team.","MUST ship the BlissRoms Updates atleast once a month or as notified by BlissRoms Administration. If this is not possible, the reason(s) must be sent to the BlissRoms Administration within 48hrs. In the absence of any explanation, a maintainer will be contacted thrice. If there is no satisfactory answer or the administration does not receive a reply, the maintainer will be kicked without any prior warning.","MUST test every build before sending an OTA update to users. Each build must be thoroughly vetted by the maintainer before it is released, and all hardware and software functionalities MUST be tested before a build is released. Releasing untested builds can (and will) lead to your maintainership being revoked.","MUST upload:","The key words \"MUST\", \"MUST NOT\", \"REQUIRED\", \"SHALL\", \"SHALL NOT\", \"SHOULD\", \"SHOULD NOT\", \"RECOMMENDED\", \"MAY\", and \"OPTIONAL\" in this document are to be interpreted as described in RFC 2119.","The Maintainers:"]}],[{"l":"Blissrom overlays"},{"l":"General Overlays"},{"i":"-battery-health-overlay","l":"• Battery Health Overlay","p":["This overlay is required to Enable battery health section.","This overlay is required to Enable battery charging cycle counts in battery page in setting app.","You will need to check your available kernel nodes before selecting them Note that nodes availability depends on kernel version","Example"]},{"i":"-charging-support-overlay","l":"• Charging Support Overlay","p":["- VOOC Charging ( If your device supports )","This overlay is required to Enable VOOC charging support.","- WARP Charging ( If your device supports )","This overlay is required to Enable Warp charging support.","- Dash Charging ( If your device supports )","This overlay is required to Enable Dash charging support."]},{"i":"-smart-charging","l":"• Smart Charging","p":["This overlay is required to make Smart Charging feature functioning.","Example"]},{"i":"-live-display","l":"• Live Display","p":["This overlay is required to make Live Display feature functioning."]},{"i":"-multi-usb-controller-overlay-only-for-asus-rog-devices","l":"• Multi usb controller overlay (ONLY FOR ASUS ROG DEVICES)","p":["Since all ROG devices have 2 usb ports. We can use both for mtp, not just as charger.","This overlay is required to add support for Multi USB Controller."]},{"i":"-high-aspect-ratio","l":"• High Aspect Ratio","p":["This overlay is required to make full screen apps function working properly"]},{"i":"-multi-colour-led","l":"• Multi-colour LED","p":["This overlay is required to Enable Multi-coloured LED lights for supported devices.","For most of the Xiaomi devices, this must be set to 'false' as they have white-only LEDs."]},{"i":"-call-recording","l":"• Call Recording","p":["This feature only works on AOSP Dialer and not on Google Dialer.","This overlay is required to Enable Call recording on AOSP Dialer's.","Call recording is illegal in some countries. Kindly refer to local laws before enabling this feature!!"]},{"l":"FOD Specific Overlays"},{"i":"-fod-support","l":"• FOD Support","p":["This overlay is required to Enable FOD Support. Required inorder for FOD to work."]},{"i":"-fod-animations","l":"• FOD Animations","p":["For FOD Animation to work you need 2 things in your device tree source.","A Flag in bliss_codename.mk makefile in your respective device tree","An overlay to set Default FOD Pressed Color","Flag Required to build FOD Animation resources","To set Default FOD Pressed color","This overlay is required to set Default FOD Pressed Color."]},{"i":"-screen-off-fod","l":"• Screen-Off FOD","p":["This overlay is required to Enable Screen OFF FOD."]}]]
\ No newline at end of file
