diff --git a/CHANGELOG.md b/CHANGELOG.md
index a8b3166..8d4f64f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,30 @@
# Changelog
+## 0.0.68
+
+This corrective release ships the plugin security and reliability fixes
+closed on the paid mainline after the 0.0.67 package was built.
+
+- Filter hidden and traversal-encoded asset references before publishing so a
+ malicious note cannot upload `.obsidian` configuration or files outside the
+ vault, and list what was skipped.
+- Cancel any pending login poll when an account switch's logout fails, so a
+ later poll cannot silently complete a sign-in behind the user's back.
+- Serve the browser confirmation pages that host sign-in and sign-out forms
+ with a same-origin referrer policy so the enforced origin binding accepts
+ real browsers.
+- Require explicit per-device account selection before approval during
+ browser-based login.
+- Make share creation idempotent, including the fallback re-publish used when
+ an existing share disappeared concurrently, so a retry never leaves a
+ duplicate public link.
+- Keep session tokens and pending-login verifiers in Obsidian SecretStorage
+ with lifecycle-safe timers.
+- Hide the Folder Share entry on Free plans and warn before an Advanced
+ Import consumes one of the remaining monthly allowances.
+- Preserve completed Advanced Imports for later review and resolve the
+ cancel-versus-review race on finished import jobs.
+
## 0.0.67
- Bind Obsidian browser login completion to its initiating plugin with S256
diff --git a/manifest.json b/manifest.json
index e3d51e3..f246dc1 100644
--- a/manifest.json
+++ b/manifest.json
@@ -1,7 +1,7 @@
{
"id": "docferry",
"name": "DocFerry",
- "version": "0.0.67",
+ "version": "0.0.68",
"minAppVersion": "1.12.7",
"description": "Save links as notes, import DocFerry shares, and publish secure note shares with a free Bondie account; Pro adds folder sharing, theme styling, and Advanced Import.",
"author": "Bondie",
diff --git a/package-lock.json b/package-lock.json
index 66aba15..eb196b9 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "docferry-obsidian-plugin",
- "version": "0.0.67",
+ "version": "0.0.68",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "docferry-obsidian-plugin",
- "version": "0.0.67",
+ "version": "0.0.68",
"license": "MIT",
"devDependencies": {
"@codemirror/state": "6.5.0",
diff --git a/package.json b/package.json
index daab82e..fc930fb 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "docferry-obsidian-plugin",
- "version": "0.0.67",
+ "version": "0.0.68",
"private": true,
"description": "Save public links as notes, publish secure notes, and unlock Pro folder sharing and media summaries.",
"scripts": {
diff --git a/plugin/README.md b/plugin/README.md
index 051ac20..7c82439 100644
--- a/plugin/README.md
+++ b/plugin/README.md
@@ -1,20 +1,139 @@
-# DocFerry plugin source
+
>>6)+v(128|L&63):v(224|L>>>12&15)+v(128|L>>>6&63)+v(128|L&63)}else{var L=65536+(C.charCodeAt(0)-55296)*1024+(C.charCodeAt(1)-56320);return v(240|L>>>18&7)+v(128|L>>>12&63)+v(128|L>>>6&63)+v(128|L&63)}},x=/[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g,k=function(C){return C.replace(x,S)},N=function(C){var L=[0,2,1][C.length%3],D=C.charCodeAt(0)<<16|(C.length>1?C.charCodeAt(1):0)<<8|(C.length>2?C.charCodeAt(2):0),z=[d.charAt(D>>>18),d.charAt(D>>>12&63),L>=2?"=":d.charAt(D>>>6&63),L>=1?"=":d.charAt(D&63)];return z.join("")},R=t.btoa?function(b){return t.btoa(b)}:function(b){return b.replace(/[\s\S]{1,3}/g,N)},F=l?function(b){return(b.constructor===l.constructor?b:new l(b)).toString("base64")}:function(b){return R(k(b))},j=function(C,L){return L?F(String(C)).replace(/[+\/]/g,function(D){return D=="+"?"-":"_"}).replace(/=/g,""):F(String(C))},M=function(C){return j(C,!0)},J=new RegExp(["[\xC0-\xDF][\x80-\xBF]","[\xE0-\xEF][\x80-\xBF]{2}","[\xF0-\xF7][\x80-\xBF]{3}"].join("|"),"g"),_=function(C){switch(C.length){case 4:var L=(7&C.charCodeAt(0))<<18|(63&C.charCodeAt(1))<<12|(63&C.charCodeAt(2))<<6|63&C.charCodeAt(3),D=L-65536;return v((D>>>10)+55296)+v((D&1023)+56320);case 3:return v((15&C.charCodeAt(0))<<12|(63&C.charCodeAt(1))<<6|63&C.charCodeAt(2));default:return v((31&C.charCodeAt(0))<<6|63&C.charCodeAt(1))}},P=function(C){return C.replace(J,_)},E=function(C){var L=C.length,D=L%4,z=(L>0?w[C.charAt(0)]<<18:0)|(L>1?w[C.charAt(1)]<<12:0)|(L>2?w[C.charAt(2)]<<6:0)|(L>3?w[C.charAt(3)]:0),G=[v(z>>>16),v(z>>>8&255),v(z&255)];return G.length-=[0,0,2,1][D],G.join("")},I=t.atob?function(b){return t.atob(b)}:function(b){return b.replace(/[\s\S]{1,4}/g,E)},p=l?function(b){return(b.constructor===l.constructor?b:new l(b,"base64")).toString()}:function(b){return P(I(b))},f=function(C){return p(String(C).replace(/[-_]/g,function(L){return L=="-"?"+":"/"}).replace(/[^A-Za-z0-9\+\/]/g,""))},y=function(){var C=t.Base64;return t.Base64=i,C},g={VERSION:s,atob:I,btoa:R,fromBase64:f,toBase64:j,utob:k,encode:j,encodeURI:M,btou:P,decode:f,noConflict:y};return g})();a.exports=e}),"./lib/crypto.js":(function(a,c,e){(function(t){var i=e("./node_modules/@babel/runtime/helpers/typeof.js"),s=s||(function(l,d){var w={},v=w.lib={},S=function(){},x=v.Base={extend:function(P){S.prototype=this;var E=new S;return P&&E.mixIn(P),E.hasOwnProperty("init")||(E.init=function(){E.$super.init.apply(this,arguments)}),E.init.prototype=E,E.$super=this,E},create:function(){var P=this.extend();return P.init.apply(P,arguments),P},init:function(){},mixIn:function(P){for(var E in P)P.hasOwnProperty(E)&&(this[E]=P[E]);P.hasOwnProperty("toString")&&(this.toString=P.toString)},clone:function(){return this.init.prototype.extend(this)}},k=v.WordArray=x.extend({init:function(P,E){P=this.words=P||[],this.sigBytes=E!=d?E:4*P.length},toString:function(P){return(P||R).stringify(this)},concat:function(P){var E=this.words,I=P.words,p=this.sigBytes;if(P=P.sigBytes,this.clamp(),p%4)for(var f=0;f>>2]|=(I[f>>>2]>>>24-8*(f%4)&255)<<24-8*((p+f)%4);else if(65535>>2]=I[f>>>2];else E.push.apply(E,I);return this.sigBytes+=P,this},clamp:function(){var P=this.words,E=this.sigBytes;P[E>>>2]&=4294967295<<32-8*(E%4),P.length=l.ceil(E/4)},clone:function(){var P=x.clone.call(this);return P.words=this.words.slice(0),P},random:function(P){for(var E=[],I=0;I>>2]>>>24-8*(p%4)&255;I.push((f>>>4).toString(16)),I.push((f&15).toString(16))}return I.join("")},parse:function(P){for(var E=P.length,I=[],p=0;p>>3]|=parseInt(P.substr(p,2),16)<<24-4*(p%8);return new k.init(I,E/2)}},F=N.Latin1={stringify:function(P){var E=P.words;P=P.sigBytes;for(var I=[],p=0;p>>2]>>>24-8*(p%4)&255));return I.join("")},parse:function(P){for(var E=P.length,I=[],p=0;p>>2]|=(P.charCodeAt(p)&255)<<24-8*(p%4);return new k.init(I,E)}},j=N.Utf8={stringify:function(P){try{return decodeURIComponent(escape(F.stringify(P)))}catch(E){throw Error("Malformed UTF-8 data")}},parse:function(P){return F.parse(unescape(encodeURIComponent(P)))}},M=v.BufferedBlockAlgorithm=x.extend({reset:function(){this._data=new k.init,this._nDataBytes=0},_append:function(P){typeof P=="string"&&(P=j.parse(P)),this._data.concat(P),this._nDataBytes+=P.sigBytes},_process:function(P){var E=this._data,I=E.words,p=E.sigBytes,f=this.blockSize,y=p/(4*f),y=P?l.ceil(y):l.max((y|0)-this._minBufferSize,0);if(P=y*f,p=l.min(4*P,p),P){for(var g=0;gP;P++){if(16>P)v[P]=k[N+P]|0;else{var E=v[P-3]^v[P-8]^v[P-14]^v[P-16];v[P]=E<<1|E>>>31}E=(F<<5|F>>>27)+_+v[P],E=20>P?E+((j&M|~j&J)+1518500249):40>P?E+((j^M^J)+1859775393):60>P?E+((j&M|j&J|M&J)-1894007588):E+((j^M^J)-899497514),_=J,J=M,M=j<<30|j>>>2,j=F,F=E}R[0]=R[0]+F|0,R[1]=R[1]+j|0,R[2]=R[2]+M|0,R[3]=R[3]+J|0,R[4]=R[4]+_|0},_doFinalize:function(){var k=this._data,N=k.words,R=8*this._nDataBytes,F=8*k.sigBytes;return N[F>>>5]|=128<<24-F%32,N[(F+64>>>9<<4)+14]=Math.floor(R/4294967296),N[(F+64>>>9<<4)+15]=R,k.sigBytes=4*N.length,this._process(),this._hash},clone:function(){var k=w.clone.call(this);return k._hash=this._hash.clone(),k}});l.SHA1=w._createHelper(S),l.HmacSHA1=w._createHmacHelper(S)})(),(function(){var l=s,d=l.enc.Utf8;l.algo.HMAC=l.lib.Base.extend({init:function(v,S){v=this._hasher=new v.init,typeof S=="string"&&(S=d.parse(S));var x=v.blockSize,k=4*x;S.sigBytes>k&&(S=v.finalize(S)),S.clamp();for(var N=this._oKey=S.clone(),R=this._iKey=S.clone(),F=N.words,j=R.words,M=0;M>>2]>>>24-M%4*8&255,_=N[M+1>>>2]>>>24-(M+1)%4*8&255,P=N[M+2>>>2]>>>24-(M+2)%4*8&255,E=J<<16|_<<8|P,I=0;I<4&&M+I*.75>>6*(3-I)&63));var p=F.charAt(64);if(p)for(;j.length%4;)j.push(p);return j.join("")},parse:function(k){var N=k.length,R=this._map,F=R.charAt(64);if(F){var j=k.indexOf(F);j!=-1&&(N=j)}for(var M=[],J=0,_=0;_>>6-_%4*2;M[J>>>2]|=(P|E)<<24-J%4*8,J++}return w.create(M,J)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})(),i(t)==="object"?t.exports=s:window.CryptoJS=s}).call(this,e("./node_modules/webpack/buildin/module.js")(a))}),"./lib/json2xml.js":(function(a,c,e){var t=e("./node_modules/@babel/runtime/helpers/typeof.js"),i="a-zA-Z_\xC0-\xD6\xD8-\xF6\xF8-\xFF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FFF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD",s="-.0-9\xB7\u0300-\u036F\u203F\u2040",l=new RegExp("^([^"+i+"])|^((x|X)(m|M)(l|L))|([^"+i+s+"])","g"),d=/[^\x09\x0A\x0D\x20-\xFF\x85\xA0-\uD7FF\uE000-\uFDCF\uFDE0-\uFFFD]/gm,w=function(N){var R=[];if(N instanceof Object)for(var F in N)N.hasOwnProperty(F)&&R.push(F);return R},v=function(N,R){var F=function(M,J,_,P,E){var I=R.indent!==void 0?R.indent:" ",p=R.prettyPrint?`
-`+new Array(P).join(I):"";R.removeIllegalNameCharacters&&(M=M.replace(l,"_"));var f=[p,"<",M,_||""];return J&&J.length>0?(f.push(">"),f.push(J),E&&f.push(p),f.push(""),f.push(M),f.push(">")):f.push("/>"),f.join("")};return(function j(M,J,_){var P=t(M);switch((Array.isArray?Array.isArray(M):M instanceof Array)?P="array":M instanceof Date&&(P="date"),P){case"array":var E=[];return M.map(function(y){E.push(j(y,1,_+1))}),R.prettyPrint&&E.push(`
-`),E.join("");break;case"date":return M.toJSON?M.toJSON():M+"";case"object":var I=[];for(var p in M)if(M.hasOwnProperty(p))if(M[p]instanceof Array)for(var f=0;f0&&I.push(`
-`),I.join("");break;case"function":return M();default:return R.escape?x(M):""+M}})(N,0,0)},S=function(N){var R=['"),R.join("")};function x(k){return(""+k).replace(/&/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""").replace(d,"")}a.exports=function(k,N){if(N||(N={xmlHeader:{standalone:!0},prettyPrint:!0,indent:" ",escape:!0}),typeof k=="string")try{k=JSON.parse(k.toString())}catch(M){return!1}var R="",F="";N&&(t(N)=="object"?(N.xmlHeader&&(R=S(!!N.xmlHeader.standalone)),typeof N.docType!="undefined"&&(F="")):R=S()),N=N||{};var j=[R,N.prettyPrint&&F?`
-`:"",F,v(k,N)];return j.join("").replace(/\n{2,}/g,`
-`).replace(/\s+$/g,"")}}),"./lib/md5.js":(function(a,c,e){(function(t){var i,s=e("./node_modules/@babel/runtime/helpers/typeof.js");(function(){"use strict";var l=(typeof window=="undefined"?"undefined":s(window))==="object",d=l?window:{};d.JS_MD5_NO_WINDOW&&(l=!1);var w=!l&&(typeof self=="undefined"?"undefined":s(self))==="object";w&&(d=self);var v=!d.JS_MD5_NO_COMMON_JS&&s(t)==="object"&&t.exports,S=e("./node_modules/webpack/buildin/amd-options.js"),x=!d.JS_MD5_NO_ARRAY_BUFFER&&typeof ArrayBuffer!="undefined",k="0123456789abcdef".split(""),N=[128,32768,8388608,-2147483648],R=[0,8,16,24],F=["hex","array","digest","buffer","arrayBuffer","base64"],j="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""),M=[],J;if(x){var _=new ArrayBuffer(68);J=new Uint8Array(_),M=new Uint32Array(_)}(d.JS_MD5_NO_NODE_JS||!Array.isArray)&&(Array.isArray=function(f){return Object.prototype.toString.call(f)==="[object Array]"}),x&&(d.JS_MD5_NO_ARRAY_BUFFER_IS_VIEW||!ArrayBuffer.isView)&&(ArrayBuffer.isView=function(f){return s(f)==="object"&&f.buffer&&f.buffer.constructor===ArrayBuffer});var P=function(y){return function(g,b){return new I(!0).update(g,b)[y]()}},E=function(){var y=P("hex");y.getCtx=y.create=function(){return new I},y.update=function(C){return y.create().update(C)};for(var g=0;g>6,z[C++]=128|g&63):g<55296||g>=57344?(z[C++]=224|g>>12,z[C++]=128|g>>6&63,z[C++]=128|g&63):(g=65536+((g&1023)<<10|f.charCodeAt(++b)&1023),z[C++]=240|g>>18,z[C++]=128|g>>12&63,z[C++]=128|g>>6&63,z[C++]=128|g&63);else for(C=this.start;b>2]|=g<>2]|=(192|g>>6)<>2]|=(128|g&63)<=57344?(D[C>>2]|=(224|g>>12)<>2]|=(128|g>>6&63)<>2]|=(128|g&63)<>2]|=(240|g>>18)<>2]|=(128|g>>12&63)<>2]|=(128|g>>6&63)<>2]|=(128|g&63)<=64?(this.start=C-64,this.hash(),this.hashed=!0):this.start=C}return this.bytes>4294967295&&(this.hBytes+=this.bytes/4294967296<<0,this.bytes=this.bytes%4294967296),this}},I.prototype.finalize=function(){if(!this.finalized){this.finalized=!0;var f=this.blocks,y=this.lastByteIndex;f[y>>2]|=N[y&3],y>=56&&(this.hashed||this.hash(),f[0]=f[16],f[16]=f[1]=f[2]=f[3]=f[4]=f[5]=f[6]=f[7]=f[8]=f[9]=f[10]=f[11]=f[12]=f[13]=f[14]=f[15]=0),f[14]=this.bytes<<3,f[15]=this.hBytes<<3|this.bytes>>>29,this.hash()}},I.prototype.hash=function(){var f,y,g,b,C,L,D=this.blocks;this.first?(f=D[0]-680876937,f=(f<<7|f>>>25)-271733879<<0,b=(-1732584194^f&2004318071)+D[1]-117830708,b=(b<<12|b>>>20)+f<<0,g=(-271733879^b&(f^-271733879))+D[2]-1126478375,g=(g<<17|g>>>15)+b<<0,y=(f^g&(b^f))+D[3]-1316259209,y=(y<<22|y>>>10)+g<<0):(f=this.h0,y=this.h1,g=this.h2,b=this.h3,f+=(b^y&(g^b))+D[0]-680876936,f=(f<<7|f>>>25)+y<<0,b+=(g^f&(y^g))+D[1]-389564586,b=(b<<12|b>>>20)+f<<0,g+=(y^b&(f^y))+D[2]+606105819,g=(g<<17|g>>>15)+b<<0,y+=(f^g&(b^f))+D[3]-1044525330,y=(y<<22|y>>>10)+g<<0),f+=(b^y&(g^b))+D[4]-176418897,f=(f<<7|f>>>25)+y<<0,b+=(g^f&(y^g))+D[5]+1200080426,b=(b<<12|b>>>20)+f<<0,g+=(y^b&(f^y))+D[6]-1473231341,g=(g<<17|g>>>15)+b<<0,y+=(f^g&(b^f))+D[7]-45705983,y=(y<<22|y>>>10)+g<<0,f+=(b^y&(g^b))+D[8]+1770035416,f=(f<<7|f>>>25)+y<<0,b+=(g^f&(y^g))+D[9]-1958414417,b=(b<<12|b>>>20)+f<<0,g+=(y^b&(f^y))+D[10]-42063,g=(g<<17|g>>>15)+b<<0,y+=(f^g&(b^f))+D[11]-1990404162,y=(y<<22|y>>>10)+g<<0,f+=(b^y&(g^b))+D[12]+1804603682,f=(f<<7|f>>>25)+y<<0,b+=(g^f&(y^g))+D[13]-40341101,b=(b<<12|b>>>20)+f<<0,g+=(y^b&(f^y))+D[14]-1502002290,g=(g<<17|g>>>15)+b<<0,y+=(f^g&(b^f))+D[15]+1236535329,y=(y<<22|y>>>10)+g<<0,f+=(g^b&(y^g))+D[1]-165796510,f=(f<<5|f>>>27)+y<<0,b+=(y^g&(f^y))+D[6]-1069501632,b=(b<<9|b>>>23)+f<<0,g+=(f^y&(b^f))+D[11]+643717713,g=(g<<14|g>>>18)+b<<0,y+=(b^f&(g^b))+D[0]-373897302,y=(y<<20|y>>>12)+g<<0,f+=(g^b&(y^g))+D[5]-701558691,f=(f<<5|f>>>27)+y<<0,b+=(y^g&(f^y))+D[10]+38016083,b=(b<<9|b>>>23)+f<<0,g+=(f^y&(b^f))+D[15]-660478335,g=(g<<14|g>>>18)+b<<0,y+=(b^f&(g^b))+D[4]-405537848,y=(y<<20|y>>>12)+g<<0,f+=(g^b&(y^g))+D[9]+568446438,f=(f<<5|f>>>27)+y<<0,b+=(y^g&(f^y))+D[14]-1019803690,b=(b<<9|b>>>23)+f<<0,g+=(f^y&(b^f))+D[3]-187363961,g=(g<<14|g>>>18)+b<<0,y+=(b^f&(g^b))+D[8]+1163531501,y=(y<<20|y>>>12)+g<<0,f+=(g^b&(y^g))+D[13]-1444681467,f=(f<<5|f>>>27)+y<<0,b+=(y^g&(f^y))+D[2]-51403784,b=(b<<9|b>>>23)+f<<0,g+=(f^y&(b^f))+D[7]+1735328473,g=(g<<14|g>>>18)+b<<0,y+=(b^f&(g^b))+D[12]-1926607734,y=(y<<20|y>>>12)+g<<0,C=y^g,f+=(C^b)+D[5]-378558,f=(f<<4|f>>>28)+y<<0,b+=(C^f)+D[8]-2022574463,b=(b<<11|b>>>21)+f<<0,L=b^f,g+=(L^y)+D[11]+1839030562,g=(g<<16|g>>>16)+b<<0,y+=(L^g)+D[14]-35309556,y=(y<<23|y>>>9)+g<<0,C=y^g,f+=(C^b)+D[1]-1530992060,f=(f<<4|f>>>28)+y<<0,b+=(C^f)+D[4]+1272893353,b=(b<<11|b>>>21)+f<<0,L=b^f,g+=(L^y)+D[7]-155497632,g=(g<<16|g>>>16)+b<<0,y+=(L^g)+D[10]-1094730640,y=(y<<23|y>>>9)+g<<0,C=y^g,f+=(C^b)+D[13]+681279174,f=(f<<4|f>>>28)+y<<0,b+=(C^f)+D[0]-358537222,b=(b<<11|b>>>21)+f<<0,L=b^f,g+=(L^y)+D[3]-722521979,g=(g<<16|g>>>16)+b<<0,y+=(L^g)+D[6]+76029189,y=(y<<23|y>>>9)+g<<0,C=y^g,f+=(C^b)+D[9]-640364487,f=(f<<4|f>>>28)+y<<0,b+=(C^f)+D[12]-421815835,b=(b<<11|b>>>21)+f<<0,L=b^f,g+=(L^y)+D[15]+530742520,g=(g<<16|g>>>16)+b<<0,y+=(L^g)+D[2]-995338651,y=(y<<23|y>>>9)+g<<0,f+=(g^(y|~b))+D[0]-198630844,f=(f<<6|f>>>26)+y<<0,b+=(y^(f|~g))+D[7]+1126891415,b=(b<<10|b>>>22)+f<<0,g+=(f^(b|~y))+D[14]-1416354905,g=(g<<15|g>>>17)+b<<0,y+=(b^(g|~f))+D[5]-57434055,y=(y<<21|y>>>11)+g<<0,f+=(g^(y|~b))+D[12]+1700485571,f=(f<<6|f>>>26)+y<<0,b+=(y^(f|~g))+D[3]-1894986606,b=(b<<10|b>>>22)+f<<0,g+=(f^(b|~y))+D[10]-1051523,g=(g<<15|g>>>17)+b<<0,y+=(b^(g|~f))+D[1]-2054922799,y=(y<<21|y>>>11)+g<<0,f+=(g^(y|~b))+D[8]+1873313359,f=(f<<6|f>>>26)+y<<0,b+=(y^(f|~g))+D[15]-30611744,b=(b<<10|b>>>22)+f<<0,g+=(f^(b|~y))+D[6]-1560198380,g=(g<<15|g>>>17)+b<<0,y+=(b^(g|~f))+D[13]+1309151649,y=(y<<21|y>>>11)+g<<0,f+=(g^(y|~b))+D[4]-145523070,f=(f<<6|f>>>26)+y<<0,b+=(y^(f|~g))+D[11]-1120210379,b=(b<<10|b>>>22)+f<<0,g+=(f^(b|~y))+D[2]+718787259,g=(g<<15|g>>>17)+b<<0,y+=(b^(g|~f))+D[9]-343485551,y=(y<<21|y>>>11)+g<<0,this.first?(this.h0=f+1732584193<<0,this.h1=y-271733879<<0,this.h2=g-1732584194<<0,this.h3=b+271733878<<0,this.first=!1):(this.h0=this.h0+f<<0,this.h1=this.h1+y<<0,this.h2=this.h2+g<<0,this.h3=this.h3+b<<0)},I.prototype.hex=function(){this.finalize();var f=this.h0,y=this.h1,g=this.h2,b=this.h3;return k[f>>4&15]+k[f&15]+k[f>>12&15]+k[f>>8&15]+k[f>>20&15]+k[f>>16&15]+k[f>>28&15]+k[f>>24&15]+k[y>>4&15]+k[y&15]+k[y>>12&15]+k[y>>8&15]+k[y>>20&15]+k[y>>16&15]+k[y>>28&15]+k[y>>24&15]+k[g>>4&15]+k[g&15]+k[g>>12&15]+k[g>>8&15]+k[g>>20&15]+k[g>>16&15]+k[g>>28&15]+k[g>>24&15]+k[b>>4&15]+k[b&15]+k[b>>12&15]+k[b>>8&15]+k[b>>20&15]+k[b>>16&15]+k[b>>28&15]+k[b>>24&15]},I.prototype.toString=I.prototype.hex,I.prototype.digest=function(f){if(f==="hex")return this.hex();this.finalize();var y=this.h0,g=this.h1,b=this.h2,C=this.h3,L=[y&255,y>>8&255,y>>16&255,y>>24&255,g&255,g>>8&255,g>>16&255,g>>24&255,b&255,b>>8&255,b>>16&255,b>>24&255,C&255,C>>8&255,C>>16&255,C>>24&255];return L},I.prototype.array=I.prototype.digest,I.prototype.arrayBuffer=function(){this.finalize();var f=new ArrayBuffer(16),y=new Uint32Array(f);return y[0]=this.h0,y[1]=this.h1,y[2]=this.h2,y[3]=this.h3,f},I.prototype.buffer=I.prototype.arrayBuffer,I.prototype.base64=function(){for(var f,y,g,b="",C=this.array(),L=0;L<15;)f=C[L++],y=C[L++],g=C[L++],b+=j[f>>>2]+j[(f<<4|y>>>4)&63]+j[(y<<2|g>>>6)&63]+j[g&63];return f=C[L],b+=j[f>>>2]+j[f<<4&63]+"==",b};var p=E();v?t.exports=p:(d.md5=p,S&&(i=(function(){return p}).call(p,e,p,t),i!==void 0&&(t.exports=i)))})()}).call(this,e("./node_modules/webpack/buildin/module.js")(a))}),"./lib/request.js":(function(a,c,e){var t=e("./node_modules/@babel/runtime/helpers/typeof.js"),i=function(S){switch(t(S)){case"string":return S;case"boolean":return S?"true":"false";case"number":return isFinite(S)?S:"";default:return""}},s=function(S,x,k,N){return x=x||"&",k=k||"=",S===null&&(S=void 0),t(S)==="object"?Object.keys(S).map(function(R){var F=encodeURIComponent(i(R))+k;return Array.isArray(S[R])?S[R].map(function(j){return F+encodeURIComponent(i(j))}).join(x):F+encodeURIComponent(i(S[R]))}).filter(Boolean).join(x):N?encodeURIComponent(i(N))+k+encodeURIComponent(i(S)):""},l=function(S,x,k){var N={},R=x.getAllResponseHeaders();return R&&R.length>0&&R.trim().split(`
-`).forEach(function(F){if(F){var j=F.indexOf(":"),M=F.substr(0,j).trim().toLowerCase(),J=F.substr(j+1).trim();N[M]=J}}),{error:S,statusCode:x.status,statusMessage:x.statusText,headers:N,body:k}},d=function(S,x){return!x&&x==="text"?S.responseText:S.response},w=function(S,x){var k=(S.method||"GET").toUpperCase(),N=S.url;if(S.qs){var R=s(S.qs);R&&(N+=(N.indexOf("?")===-1?"?":"&")+R)}var F=new XMLHttpRequest;if(F.open(k,N,!0),F.responseType=S.dataType||"text",S.xhrFields)for(var j in S.xhrFields)F[j]=S.xhrFields[j];var M=S.headers;if(M)for(var J in M)M.hasOwnProperty(J)&&J.toLowerCase()!=="content-length"&&J.toLowerCase()!=="user-agent"&&J.toLowerCase()!=="origin"&&J.toLowerCase()!=="host"&&F.setRequestHeader(J,M[J]);return S.onProgress&&F.upload&&(F.upload.onprogress=S.onProgress),S.onDownloadProgress&&(F.onprogress=S.onDownloadProgress),S.timeout&&(F.timeout=S.timeout),F.ontimeout=function(_){var P=new Error("timeout");x(l(P,F))},F.onload=function(){x(l(null,F,d(F,S.dataType)))},F.onerror=function(_){var P=d(F,S.dataType);if(P)x(l(null,F,P));else{var E=F.statusText;!E&&F.status===0&&(E=new Error("CORS blocked or network error")),x(l(E,F,P))}},F.send(S.body||""),F};a.exports=w}),"./lib/xml2json.js":(function(a,c,e){var t=e("./node_modules/@xmldom/xmldom/lib/index.js").DOMParser,i=function(){this.version="1.3.5";var l={mergeCDATA:!0,normalize:!0,stripElemPrefix:!0},d=new RegExp(/(?!xmlns)^.*:/),w=new RegExp(/^\s+|\s+$/g);return this.grokType=function(v){return/^\s*$/.test(v)?null:/^(?:true|false)$/i.test(v)?v.toLowerCase()==="true":isFinite(v)?parseFloat(v):v},this.parseString=function(v,S){if(v){var x=this.stringToXML(v);return x.getElementsByTagName("parsererror").length?null:this.parseXML(x,S)}else return null},this.parseXML=function(v,S){for(var x in S)l[x]=S[x];var k={},N=0,R="",F=v.childNodes.length;if(F)for(var j,M,J,_=0;_()=>(u||a((u={exports:{}}).exports,u),u.exports),Yi=(a,u)=>{for(var e in u)lr(a,e,{get:u[e],enumerable:!0})},Ln=(a,u,e,t)=>{if(u&&typeof u=="object"||typeof u=="function")for(let r of Gi(u))!Qi.call(a,r)&&r!==e&&lr(a,r,{get:()=>u[r],enumerable:!(t=zi(u,r))||t.enumerable});return a};var Xi=(a,u,e)=>(e=a!=null?Ki(Ji(a)):{},Ln(u||!a||!a.__esModule?lr(e,"default",{value:a,enumerable:!0}):e,a)),Zi=a=>Ln(lr({},"__esModule",{value:!0}),a);var Mn=Wi((zt,jr)=>{(function(u,e){typeof zt=="object"&&typeof jr=="object"?jr.exports=e():typeof define=="function"&&define.amd?define([],e):typeof zt=="object"?zt.COS=e():u.COS=e()})(zt,function(){return(function(a){var u={};function e(t){if(u[t])return u[t].exports;var r=u[t]={i:t,l:!1,exports:{}};return a[t].call(r.exports,r,r.exports,e),r.l=!0,r.exports}return e.m=a,e.c=u,e.d=function(t,r,o){e.o(t,r)||Object.defineProperty(t,r,{enumerable:!0,get:o})},e.r=function(t){typeof Symbol!="undefined"&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},e.t=function(t,r){if(r&1&&(t=e(t)),r&8||r&4&&typeof t=="object"&&t&&t.__esModule)return t;var o=Object.create(null);if(e.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:t}),r&2&&typeof t!="string")for(var l in t)e.d(o,l,function(d){return t[d]}.bind(null,l));return o},e.n=function(t){var r=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(r,"a",r),r},e.o=function(t,r){return Object.prototype.hasOwnProperty.call(t,r)},e.p="/dist/",e(e.s="./index.js")})({"./index.js":(function(a,u,e){var t=e("./src/cos.js");a.exports=t}),"./lib/base64.js":(function(a,u){var e=(function(t){t=t||{};var r=t.Base64,o="2.1.9",l,d="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",b=(function(w){for(var C={},M=0,D=w.length;M>>6)+y(128|M&63):y(224|M>>>12&15)+y(128|M>>>6&63)+y(128|M&63)}else{var M=65536+(C.charCodeAt(0)-55296)*1024+(C.charCodeAt(1)-56320);return y(240|M>>>18&7)+y(128|M>>>12&63)+y(128|M>>>6&63)+y(128|M&63)}},x=/[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g,k=function(C){return C.replace(x,S)},F=function(C){var M=[0,2,1][C.length%3],D=C.charCodeAt(0)<<16|(C.length>1?C.charCodeAt(1):0)<<8|(C.length>2?C.charCodeAt(2):0),q=[d.charAt(D>>>18),d.charAt(D>>>12&63),M>=2?"=":d.charAt(D>>>6&63),M>=1?"=":d.charAt(D&63)];return q.join("")},P=t.btoa?function(w){return t.btoa(w)}:function(w){return w.replace(/[\s\S]{1,3}/g,F)},L=l?function(w){return(w.constructor===l.constructor?w:new l(w)).toString("base64")}:function(w){return P(k(w))},j=function(C,M){return M?L(String(C)).replace(/[+\/]/g,function(D){return D=="+"?"-":"_"}).replace(/=/g,""):L(String(C))},N=function(C){return j(C,!0)},W=new RegExp(["[\xC0-\xDF][\x80-\xBF]","[\xE0-\xEF][\x80-\xBF]{2}","[\xF0-\xF7][\x80-\xBF]{3}"].join("|"),"g"),_=function(C){switch(C.length){case 4:var M=(7&C.charCodeAt(0))<<18|(63&C.charCodeAt(1))<<12|(63&C.charCodeAt(2))<<6|63&C.charCodeAt(3),D=M-65536;return y((D>>>10)+55296)+y((D&1023)+56320);case 3:return y((15&C.charCodeAt(0))<<12|(63&C.charCodeAt(1))<<6|63&C.charCodeAt(2));default:return y((31&C.charCodeAt(0))<<6|63&C.charCodeAt(1))}},B=function(C){return C.replace(W,_)},E=function(C){var M=C.length,D=M%4,q=(M>0?b[C.charAt(0)]<<18:0)|(M>1?b[C.charAt(1)]<<12:0)|(M>2?b[C.charAt(2)]<<6:0)|(M>3?b[C.charAt(3)]:0),z=[y(q>>>16),y(q>>>8&255),y(q&255)];return z.length-=[0,0,2,1][D],z.join("")},I=t.atob?function(w){return t.atob(w)}:function(w){return w.replace(/[\s\S]{1,4}/g,E)},p=l?function(w){return(w.constructor===l.constructor?w:new l(w,"base64")).toString()}:function(w){return B(I(w))},f=function(C){return p(String(C).replace(/[-_]/g,function(M){return M=="-"?"+":"/"}).replace(/[^A-Za-z0-9\+\/]/g,""))},v=function(){var C=t.Base64;return t.Base64=r,C},m={VERSION:o,atob:I,btoa:P,fromBase64:f,toBase64:j,utob:k,encode:j,encodeURI:N,btou:B,decode:f,noConflict:v};return m})();a.exports=e}),"./lib/crypto.js":(function(a,u,e){(function(t){var r=e("./node_modules/@babel/runtime/helpers/typeof.js"),o=o||(function(l,d){var b={},y=b.lib={},S=function(){},x=y.Base={extend:function(B){S.prototype=this;var E=new S;return B&&E.mixIn(B),E.hasOwnProperty("init")||(E.init=function(){E.$super.init.apply(this,arguments)}),E.init.prototype=E,E.$super=this,E},create:function(){var B=this.extend();return B.init.apply(B,arguments),B},init:function(){},mixIn:function(B){for(var E in B)B.hasOwnProperty(E)&&(this[E]=B[E]);B.hasOwnProperty("toString")&&(this.toString=B.toString)},clone:function(){return this.init.prototype.extend(this)}},k=y.WordArray=x.extend({init:function(B,E){B=this.words=B||[],this.sigBytes=E!=d?E:4*B.length},toString:function(B){return(B||P).stringify(this)},concat:function(B){var E=this.words,I=B.words,p=this.sigBytes;if(B=B.sigBytes,this.clamp(),p%4)for(var f=0;f>>2]|=(I[f>>>2]>>>24-8*(f%4)&255)<<24-8*((p+f)%4);else if(65535>>2]=I[f>>>2];else E.push.apply(E,I);return this.sigBytes+=B,this},clamp:function(){var B=this.words,E=this.sigBytes;B[E>>>2]&=4294967295<<32-8*(E%4),B.length=l.ceil(E/4)},clone:function(){var B=x.clone.call(this);return B.words=this.words.slice(0),B},random:function(B){for(var E=[],I=0;I>>2]>>>24-8*(p%4)&255;I.push((f>>>4).toString(16)),I.push((f&15).toString(16))}return I.join("")},parse:function(B){for(var E=B.length,I=[],p=0;p>>3]|=parseInt(B.substr(p,2),16)<<24-4*(p%8);return new k.init(I,E/2)}},L=F.Latin1={stringify:function(B){var E=B.words;B=B.sigBytes;for(var I=[],p=0;p>>2]>>>24-8*(p%4)&255));return I.join("")},parse:function(B){for(var E=B.length,I=[],p=0;p>>2]|=(B.charCodeAt(p)&255)<<24-8*(p%4);return new k.init(I,E)}},j=F.Utf8={stringify:function(B){try{return decodeURIComponent(escape(L.stringify(B)))}catch(E){throw Error("Malformed UTF-8 data")}},parse:function(B){return L.parse(unescape(encodeURIComponent(B)))}},N=y.BufferedBlockAlgorithm=x.extend({reset:function(){this._data=new k.init,this._nDataBytes=0},_append:function(B){typeof B=="string"&&(B=j.parse(B)),this._data.concat(B),this._nDataBytes+=B.sigBytes},_process:function(B){var E=this._data,I=E.words,p=E.sigBytes,f=this.blockSize,v=p/(4*f),v=B?l.ceil(v):l.max((v|0)-this._minBufferSize,0);if(B=v*f,p=l.min(4*B,p),B){for(var m=0;mB;B++){if(16>B)y[B]=k[F+B]|0;else{var E=y[B-3]^y[B-8]^y[B-14]^y[B-16];y[B]=E<<1|E>>>31}E=(L<<5|L>>>27)+_+y[B],E=20>B?E+((j&N|~j&W)+1518500249):40>B?E+((j^N^W)+1859775393):60>B?E+((j&N|j&W|N&W)-1894007588):E+((j^N^W)-899497514),_=W,W=N,N=j<<30|j>>>2,j=L,L=E}P[0]=P[0]+L|0,P[1]=P[1]+j|0,P[2]=P[2]+N|0,P[3]=P[3]+W|0,P[4]=P[4]+_|0},_doFinalize:function(){var k=this._data,F=k.words,P=8*this._nDataBytes,L=8*k.sigBytes;return F[L>>>5]|=128<<24-L%32,F[(L+64>>>9<<4)+14]=Math.floor(P/4294967296),F[(L+64>>>9<<4)+15]=P,k.sigBytes=4*F.length,this._process(),this._hash},clone:function(){var k=b.clone.call(this);return k._hash=this._hash.clone(),k}});l.SHA1=b._createHelper(S),l.HmacSHA1=b._createHmacHelper(S)})(),(function(){var l=o,d=l.enc.Utf8;l.algo.HMAC=l.lib.Base.extend({init:function(y,S){y=this._hasher=new y.init,typeof S=="string"&&(S=d.parse(S));var x=y.blockSize,k=4*x;S.sigBytes>k&&(S=y.finalize(S)),S.clamp();for(var F=this._oKey=S.clone(),P=this._iKey=S.clone(),L=F.words,j=P.words,N=0;N>>2]>>>24-N%4*8&255,_=F[N+1>>>2]>>>24-(N+1)%4*8&255,B=F[N+2>>>2]>>>24-(N+2)%4*8&255,E=W<<16|_<<8|B,I=0;I<4&&N+I*.75>>6*(3-I)&63));var p=L.charAt(64);if(p)for(;j.length%4;)j.push(p);return j.join("")},parse:function(k){var F=k.length,P=this._map,L=P.charAt(64);if(L){var j=k.indexOf(L);j!=-1&&(F=j)}for(var N=[],W=0,_=0;_>>6-_%4*2;N[W>>>2]|=(B|E)<<24-W%4*8,W++}return b.create(N,W)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})(),r(t)==="object"?t.exports=o:window.CryptoJS=o}).call(this,e("./node_modules/webpack/buildin/module.js")(a))}),"./lib/json2xml.js":(function(a,u,e){var t=e("./node_modules/@babel/runtime/helpers/typeof.js"),r="a-zA-Z_\xC0-\xD6\xD8-\xF6\xF8-\xFF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FFF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD",o="-.0-9\xB7\u0300-\u036F\u203F\u2040",l=new RegExp("^([^"+r+"])|^((x|X)(m|M)(l|L))|([^"+r+o+"])","g"),d=/[^\x09\x0A\x0D\x20-\xFF\x85\xA0-\uD7FF\uE000-\uFDCF\uFDE0-\uFFFD]/gm,b=function(F){var P=[];if(F instanceof Object)for(var L in F)F.hasOwnProperty(L)&&P.push(L);return P},y=function(F,P){var L=function(N,W,_,B,E){var I=P.indent!==void 0?P.indent:" ",p=P.prettyPrint?`
+`+new Array(B).join(I):"";P.removeIllegalNameCharacters&&(N=N.replace(l,"_"));var f=[p,"<",N,_||""];return W&&W.length>0?(f.push(">"),f.push(W),E&&f.push(p),f.push(""),f.push(N),f.push(">")):f.push("/>"),f.join("")};return(function j(N,W,_){var B=t(N);switch((Array.isArray?Array.isArray(N):N instanceof Array)?B="array":N instanceof Date&&(B="date"),B){case"array":var E=[];return N.map(function(v){E.push(j(v,1,_+1))}),P.prettyPrint&&E.push(`
+`),E.join("");break;case"date":return N.toJSON?N.toJSON():N+"";case"object":var I=[];for(var p in N)if(N.hasOwnProperty(p))if(N[p]instanceof Array)for(var f=0;f0&&I.push(`
+`),I.join("");break;case"function":return N();default:return P.escape?x(N):""+N}})(F,0,0)},S=function(F){var P=['"),P.join("")};function x(k){return(""+k).replace(/&/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""").replace(d,"")}a.exports=function(k,F){if(F||(F={xmlHeader:{standalone:!0},prettyPrint:!0,indent:" ",escape:!0}),typeof k=="string")try{k=JSON.parse(k.toString())}catch(N){return!1}var P="",L="";F&&(t(F)=="object"?(F.xmlHeader&&(P=S(!!F.xmlHeader.standalone)),typeof F.docType!="undefined"&&(L="")):P=S()),F=F||{};var j=[P,F.prettyPrint&&L?`
+`:"",L,y(k,F)];return j.join("").replace(/\n{2,}/g,`
+`).replace(/\s+$/g,"")}}),"./lib/md5.js":(function(a,u,e){(function(t){var r,o=e("./node_modules/@babel/runtime/helpers/typeof.js");(function(){"use strict";var l=(typeof window=="undefined"?"undefined":o(window))==="object",d=l?window:{};d.JS_MD5_NO_WINDOW&&(l=!1);var b=!l&&(typeof self=="undefined"?"undefined":o(self))==="object";b&&(d=self);var y=!d.JS_MD5_NO_COMMON_JS&&o(t)==="object"&&t.exports,S=e("./node_modules/webpack/buildin/amd-options.js"),x=!d.JS_MD5_NO_ARRAY_BUFFER&&typeof ArrayBuffer!="undefined",k="0123456789abcdef".split(""),F=[128,32768,8388608,-2147483648],P=[0,8,16,24],L=["hex","array","digest","buffer","arrayBuffer","base64"],j="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""),N=[],W;if(x){var _=new ArrayBuffer(68);W=new Uint8Array(_),N=new Uint32Array(_)}(d.JS_MD5_NO_NODE_JS||!Array.isArray)&&(Array.isArray=function(f){return Object.prototype.toString.call(f)==="[object Array]"}),x&&(d.JS_MD5_NO_ARRAY_BUFFER_IS_VIEW||!ArrayBuffer.isView)&&(ArrayBuffer.isView=function(f){return o(f)==="object"&&f.buffer&&f.buffer.constructor===ArrayBuffer});var B=function(v){return function(m,w){return new I(!0).update(m,w)[v]()}},E=function(){var v=B("hex");v.getCtx=v.create=function(){return new I},v.update=function(C){return v.create().update(C)};for(var m=0;m>6,q[C++]=128|m&63):m<55296||m>=57344?(q[C++]=224|m>>12,q[C++]=128|m>>6&63,q[C++]=128|m&63):(m=65536+((m&1023)<<10|f.charCodeAt(++w)&1023),q[C++]=240|m>>18,q[C++]=128|m>>12&63,q[C++]=128|m>>6&63,q[C++]=128|m&63);else for(C=this.start;w>2]|=m<>2]|=(192|m>>6)<
>2]|=(128|m&63)<
=57344?(D[C>>2]|=(224|m>>12)<
>2]|=(128|m>>6&63)<
>2]|=(128|m&63)<
>2]|=(240|m>>18)<
>2]|=(128|m>>12&63)<
>2]|=(128|m>>6&63)<
>2]|=(128|m&63)<
=64?(this.start=C-64,this.hash(),this.hashed=!0):this.start=C}return this.bytes>4294967295&&(this.hBytes+=this.bytes/4294967296<<0,this.bytes=this.bytes%4294967296),this}},I.prototype.finalize=function(){if(!this.finalized){this.finalized=!0;var f=this.blocks,v=this.lastByteIndex;f[v>>2]|=F[v&3],v>=56&&(this.hashed||this.hash(),f[0]=f[16],f[16]=f[1]=f[2]=f[3]=f[4]=f[5]=f[6]=f[7]=f[8]=f[9]=f[10]=f[11]=f[12]=f[13]=f[14]=f[15]=0),f[14]=this.bytes<<3,f[15]=this.hBytes<<3|this.bytes>>>29,this.hash()}},I.prototype.hash=function(){var f,v,m,w,C,M,D=this.blocks;this.first?(f=D[0]-680876937,f=(f<<7|f>>>25)-271733879<<0,w=(-1732584194^f&2004318071)+D[1]-117830708,w=(w<<12|w>>>20)+f<<0,m=(-271733879^w&(f^-271733879))+D[2]-1126478375,m=(m<<17|m>>>15)+w<<0,v=(f^m&(w^f))+D[3]-1316259209,v=(v<<22|v>>>10)+m<<0):(f=this.h0,v=this.h1,m=this.h2,w=this.h3,f+=(w^v&(m^w))+D[0]-680876936,f=(f<<7|f>>>25)+v<<0,w+=(m^f&(v^m))+D[1]-389564586,w=(w<<12|w>>>20)+f<<0,m+=(v^w&(f^v))+D[2]+606105819,m=(m<<17|m>>>15)+w<<0,v+=(f^m&(w^f))+D[3]-1044525330,v=(v<<22|v>>>10)+m<<0),f+=(w^v&(m^w))+D[4]-176418897,f=(f<<7|f>>>25)+v<<0,w+=(m^f&(v^m))+D[5]+1200080426,w=(w<<12|w>>>20)+f<<0,m+=(v^w&(f^v))+D[6]-1473231341,m=(m<<17|m>>>15)+w<<0,v+=(f^m&(w^f))+D[7]-45705983,v=(v<<22|v>>>10)+m<<0,f+=(w^v&(m^w))+D[8]+1770035416,f=(f<<7|f>>>25)+v<<0,w+=(m^f&(v^m))+D[9]-1958414417,w=(w<<12|w>>>20)+f<<0,m+=(v^w&(f^v))+D[10]-42063,m=(m<<17|m>>>15)+w<<0,v+=(f^m&(w^f))+D[11]-1990404162,v=(v<<22|v>>>10)+m<<0,f+=(w^v&(m^w))+D[12]+1804603682,f=(f<<7|f>>>25)+v<<0,w+=(m^f&(v^m))+D[13]-40341101,w=(w<<12|w>>>20)+f<<0,m+=(v^w&(f^v))+D[14]-1502002290,m=(m<<17|m>>>15)+w<<0,v+=(f^m&(w^f))+D[15]+1236535329,v=(v<<22|v>>>10)+m<<0,f+=(m^w&(v^m))+D[1]-165796510,f=(f<<5|f>>>27)+v<<0,w+=(v^m&(f^v))+D[6]-1069501632,w=(w<<9|w>>>23)+f<<0,m+=(f^v&(w^f))+D[11]+643717713,m=(m<<14|m>>>18)+w<<0,v+=(w^f&(m^w))+D[0]-373897302,v=(v<<20|v>>>12)+m<<0,f+=(m^w&(v^m))+D[5]-701558691,f=(f<<5|f>>>27)+v<<0,w+=(v^m&(f^v))+D[10]+38016083,w=(w<<9|w>>>23)+f<<0,m+=(f^v&(w^f))+D[15]-660478335,m=(m<<14|m>>>18)+w<<0,v+=(w^f&(m^w))+D[4]-405537848,v=(v<<20|v>>>12)+m<<0,f+=(m^w&(v^m))+D[9]+568446438,f=(f<<5|f>>>27)+v<<0,w+=(v^m&(f^v))+D[14]-1019803690,w=(w<<9|w>>>23)+f<<0,m+=(f^v&(w^f))+D[3]-187363961,m=(m<<14|m>>>18)+w<<0,v+=(w^f&(m^w))+D[8]+1163531501,v=(v<<20|v>>>12)+m<<0,f+=(m^w&(v^m))+D[13]-1444681467,f=(f<<5|f>>>27)+v<<0,w+=(v^m&(f^v))+D[2]-51403784,w=(w<<9|w>>>23)+f<<0,m+=(f^v&(w^f))+D[7]+1735328473,m=(m<<14|m>>>18)+w<<0,v+=(w^f&(m^w))+D[12]-1926607734,v=(v<<20|v>>>12)+m<<0,C=v^m,f+=(C^w)+D[5]-378558,f=(f<<4|f>>>28)+v<<0,w+=(C^f)+D[8]-2022574463,w=(w<<11|w>>>21)+f<<0,M=w^f,m+=(M^v)+D[11]+1839030562,m=(m<<16|m>>>16)+w<<0,v+=(M^m)+D[14]-35309556,v=(v<<23|v>>>9)+m<<0,C=v^m,f+=(C^w)+D[1]-1530992060,f=(f<<4|f>>>28)+v<<0,w+=(C^f)+D[4]+1272893353,w=(w<<11|w>>>21)+f<<0,M=w^f,m+=(M^v)+D[7]-155497632,m=(m<<16|m>>>16)+w<<0,v+=(M^m)+D[10]-1094730640,v=(v<<23|v>>>9)+m<<0,C=v^m,f+=(C^w)+D[13]+681279174,f=(f<<4|f>>>28)+v<<0,w+=(C^f)+D[0]-358537222,w=(w<<11|w>>>21)+f<<0,M=w^f,m+=(M^v)+D[3]-722521979,m=(m<<16|m>>>16)+w<<0,v+=(M^m)+D[6]+76029189,v=(v<<23|v>>>9)+m<<0,C=v^m,f+=(C^w)+D[9]-640364487,f=(f<<4|f>>>28)+v<<0,w+=(C^f)+D[12]-421815835,w=(w<<11|w>>>21)+f<<0,M=w^f,m+=(M^v)+D[15]+530742520,m=(m<<16|m>>>16)+w<<0,v+=(M^m)+D[2]-995338651,v=(v<<23|v>>>9)+m<<0,f+=(m^(v|~w))+D[0]-198630844,f=(f<<6|f>>>26)+v<<0,w+=(v^(f|~m))+D[7]+1126891415,w=(w<<10|w>>>22)+f<<0,m+=(f^(w|~v))+D[14]-1416354905,m=(m<<15|m>>>17)+w<<0,v+=(w^(m|~f))+D[5]-57434055,v=(v<<21|v>>>11)+m<<0,f+=(m^(v|~w))+D[12]+1700485571,f=(f<<6|f>>>26)+v<<0,w+=(v^(f|~m))+D[3]-1894986606,w=(w<<10|w>>>22)+f<<0,m+=(f^(w|~v))+D[10]-1051523,m=(m<<15|m>>>17)+w<<0,v+=(w^(m|~f))+D[1]-2054922799,v=(v<<21|v>>>11)+m<<0,f+=(m^(v|~w))+D[8]+1873313359,f=(f<<6|f>>>26)+v<<0,w+=(v^(f|~m))+D[15]-30611744,w=(w<<10|w>>>22)+f<<0,m+=(f^(w|~v))+D[6]-1560198380,m=(m<<15|m>>>17)+w<<0,v+=(w^(m|~f))+D[13]+1309151649,v=(v<<21|v>>>11)+m<<0,f+=(m^(v|~w))+D[4]-145523070,f=(f<<6|f>>>26)+v<<0,w+=(v^(f|~m))+D[11]-1120210379,w=(w<<10|w>>>22)+f<<0,m+=(f^(w|~v))+D[2]+718787259,m=(m<<15|m>>>17)+w<<0,v+=(w^(m|~f))+D[9]-343485551,v=(v<<21|v>>>11)+m<<0,this.first?(this.h0=f+1732584193<<0,this.h1=v-271733879<<0,this.h2=m-1732584194<<0,this.h3=w+271733878<<0,this.first=!1):(this.h0=this.h0+f<<0,this.h1=this.h1+v<<0,this.h2=this.h2+m<<0,this.h3=this.h3+w<<0)},I.prototype.hex=function(){this.finalize();var f=this.h0,v=this.h1,m=this.h2,w=this.h3;return k[f>>4&15]+k[f&15]+k[f>>12&15]+k[f>>8&15]+k[f>>20&15]+k[f>>16&15]+k[f>>28&15]+k[f>>24&15]+k[v>>4&15]+k[v&15]+k[v>>12&15]+k[v>>8&15]+k[v>>20&15]+k[v>>16&15]+k[v>>28&15]+k[v>>24&15]+k[m>>4&15]+k[m&15]+k[m>>12&15]+k[m>>8&15]+k[m>>20&15]+k[m>>16&15]+k[m>>28&15]+k[m>>24&15]+k[w>>4&15]+k[w&15]+k[w>>12&15]+k[w>>8&15]+k[w>>20&15]+k[w>>16&15]+k[w>>28&15]+k[w>>24&15]},I.prototype.toString=I.prototype.hex,I.prototype.digest=function(f){if(f==="hex")return this.hex();this.finalize();var v=this.h0,m=this.h1,w=this.h2,C=this.h3,M=[v&255,v>>8&255,v>>16&255,v>>24&255,m&255,m>>8&255,m>>16&255,m>>24&255,w&255,w>>8&255,w>>16&255,w>>24&255,C&255,C>>8&255,C>>16&255,C>>24&255];return M},I.prototype.array=I.prototype.digest,I.prototype.arrayBuffer=function(){this.finalize();var f=new ArrayBuffer(16),v=new Uint32Array(f);return v[0]=this.h0,v[1]=this.h1,v[2]=this.h2,v[3]=this.h3,f},I.prototype.buffer=I.prototype.arrayBuffer,I.prototype.base64=function(){for(var f,v,m,w="",C=this.array(),M=0;M<15;)f=C[M++],v=C[M++],m=C[M++],w+=j[f>>>2]+j[(f<<4|v>>>4)&63]+j[(v<<2|m>>>6)&63]+j[m&63];return f=C[M],w+=j[f>>>2]+j[f<<4&63]+"==",w};var p=E();y?t.exports=p:(d.md5=p,S&&(r=(function(){return p}).call(p,e,p,t),r!==void 0&&(t.exports=r)))})()}).call(this,e("./node_modules/webpack/buildin/module.js")(a))}),"./lib/request.js":(function(a,u,e){var t=e("./node_modules/@babel/runtime/helpers/typeof.js"),r=function(S){switch(t(S)){case"string":return S;case"boolean":return S?"true":"false";case"number":return isFinite(S)?S:"";default:return""}},o=function(S,x,k,F){return x=x||"&",k=k||"=",S===null&&(S=void 0),t(S)==="object"?Object.keys(S).map(function(P){var L=encodeURIComponent(r(P))+k;return Array.isArray(S[P])?S[P].map(function(j){return L+encodeURIComponent(r(j))}).join(x):L+encodeURIComponent(r(S[P]))}).filter(Boolean).join(x):F?encodeURIComponent(r(F))+k+encodeURIComponent(r(S)):""},l=function(S,x,k){var F={},P=x.getAllResponseHeaders();return P&&P.length>0&&P.trim().split(`
+`).forEach(function(L){if(L){var j=L.indexOf(":"),N=L.substr(0,j).trim().toLowerCase(),W=L.substr(j+1).trim();F[N]=W}}),{error:S,statusCode:x.status,statusMessage:x.statusText,headers:F,body:k}},d=function(S,x){return!x&&x==="text"?S.responseText:S.response},b=function(S,x){var k=(S.method||"GET").toUpperCase(),F=S.url;if(S.qs){var P=o(S.qs);P&&(F+=(F.indexOf("?")===-1?"?":"&")+P)}var L=new XMLHttpRequest;if(L.open(k,F,!0),L.responseType=S.dataType||"text",S.xhrFields)for(var j in S.xhrFields)L[j]=S.xhrFields[j];var N=S.headers;if(N)for(var W in N)N.hasOwnProperty(W)&&W.toLowerCase()!=="content-length"&&W.toLowerCase()!=="user-agent"&&W.toLowerCase()!=="origin"&&W.toLowerCase()!=="host"&&L.setRequestHeader(W,N[W]);return S.onProgress&&L.upload&&(L.upload.onprogress=S.onProgress),S.onDownloadProgress&&(L.onprogress=S.onDownloadProgress),S.timeout&&(L.timeout=S.timeout),L.ontimeout=function(_){var B=new Error("timeout");x(l(B,L))},L.onload=function(){x(l(null,L,d(L,S.dataType)))},L.onerror=function(_){var B=d(L,S.dataType);if(B)x(l(null,L,B));else{var E=L.statusText;!E&&L.status===0&&(E=new Error("CORS blocked or network error")),x(l(E,L,B))}},L.send(S.body||""),L};a.exports=b}),"./lib/xml2json.js":(function(a,u,e){var t=e("./node_modules/@xmldom/xmldom/lib/index.js").DOMParser,r=function(){this.version="1.3.5";var l={mergeCDATA:!0,normalize:!0,stripElemPrefix:!0},d=new RegExp(/(?!xmlns)^.*:/),b=new RegExp(/^\s+|\s+$/g);return this.grokType=function(y){return/^\s*$/.test(y)?null:/^(?:true|false)$/i.test(y)?y.toLowerCase()==="true":isFinite(y)?parseFloat(y):y},this.parseString=function(y,S){if(y){var x=this.stringToXML(y);return x.getElementsByTagName("parsererror").length?null:this.parseXML(x,S)}else return null},this.parseXML=function(y,S){for(var x in S)l[x]=S[x];var k={},F=0,P="",L=y.childNodes.length;if(L)for(var j,N,W,_=0;_=P+E||P?new java.lang.String(_,P,E)+"":_}"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(_){R.prototype[_]=function(){return null}});function J(_,P){_.currentElement?_.currentElement.appendChild(P):_.doc.appendChild(P)}c.__DOMHandler=R,c.normalizeLineEndings=x,c.DOMParser=k}),"./node_modules/@xmldom/xmldom/lib/dom.js":(function(a,c,e){var t=e("./node_modules/@xmldom/xmldom/lib/conventions.js"),i=t.find,s=t.NAMESPACE;function l(o){return o!==""}function d(o){return o?o.split(/[\t\n\f\r ]+/).filter(l):[]}function w(o,r){return o.hasOwnProperty(r)||(o[r]=!0),o}function v(o){if(!o)return[];var r=d(o);return Object.keys(r.reduce(w,{}))}function S(o){return function(r){return o&&o.indexOf(r)!==-1}}function x(o,r){for(var u in o)Object.prototype.hasOwnProperty.call(o,u)&&(r[u]=o[u])}function k(o,r){var u=o.prototype;if(!(u instanceof r)){let m=function(){};var h=m;m.prototype=r.prototype,m=new m,x(u,m),o.prototype=u=m}u.constructor!=o&&(typeof o!="function"&&console.error("unknown Class:"+o),u.constructor=o)}var N={},R=N.ELEMENT_NODE=1,F=N.ATTRIBUTE_NODE=2,j=N.TEXT_NODE=3,M=N.CDATA_SECTION_NODE=4,J=N.ENTITY_REFERENCE_NODE=5,_=N.ENTITY_NODE=6,P=N.PROCESSING_INSTRUCTION_NODE=7,E=N.COMMENT_NODE=8,I=N.DOCUMENT_NODE=9,p=N.DOCUMENT_TYPE_NODE=10,f=N.DOCUMENT_FRAGMENT_NODE=11,y=N.NOTATION_NODE=12,g={},b={},C=g.INDEX_SIZE_ERR=(b[1]="Index size error",1),L=g.DOMSTRING_SIZE_ERR=(b[2]="DOMString size error",2),D=g.HIERARCHY_REQUEST_ERR=(b[3]="Hierarchy request error",3),z=g.WRONG_DOCUMENT_ERR=(b[4]="Wrong document",4),G=g.INVALID_CHARACTER_ERR=(b[5]="Invalid character",5),Z=g.NO_DATA_ALLOWED_ERR=(b[6]="No data allowed",6),re=g.NO_MODIFICATION_ALLOWED_ERR=(b[7]="No modification allowed",7),$=g.NOT_FOUND_ERR=(b[8]="Not found",8),K=g.NOT_SUPPORTED_ERR=(b[9]="Not supported",9),oe=g.INUSE_ATTRIBUTE_ERR=(b[10]="Attribute in use",10),ie=g.INVALID_STATE_ERR=(b[11]="Invalid state",11),ge=g.SYNTAX_ERR=(b[12]="Syntax error",12),ne=g.INVALID_MODIFICATION_ERR=(b[13]="Invalid modification",13),Q=g.NAMESPACE_ERR=(b[14]="Invalid namespace",14),ue=g.INVALID_ACCESS_ERR=(b[15]="Invalid access",15);function ee(o,r){if(r instanceof Error)var u=r;else u=this,Error.call(this,b[o]),this.message=b[o],Error.captureStackTrace&&Error.captureStackTrace(this,ee);return u.code=o,r&&(this.message=this.message+": "+r),u}ee.prototype=Error.prototype,x(g,ee);function te(){}te.prototype={length:0,item:function(o){return o>=0&&o=0){for(var m=r.length-1;h0},lookupPrefix:function(o){for(var r=this;r;){var u=r._nsMap;if(u){for(var h in u)if(Object.prototype.hasOwnProperty.call(u,h)&&u[h]===o)return h}r=r.nodeType==F?r.ownerDocument:r.parentNode}return null},lookupNamespaceURI:function(o){for(var r=this;r;){var u=r._nsMap;if(u&&Object.prototype.hasOwnProperty.call(u,o))return u[o];r=r.nodeType==F?r.ownerDocument:r.parentNode}return null},isDefaultNamespace:function(o){var r=this.lookupPrefix(o);return r==null}};function Fe(o){return o=="<"&&"<"||o==">"&&">"||o=="&"&&"&"||o=='"'&&"""||""+o.charCodeAt()+";"}x(N,ye),x(N,ye.prototype);function Ue(o,r){if(r(o))return!0;if(o=o.firstChild)do if(Ue(o,r))return!0;while(o=o.nextSibling)}function Re(){this.ownerDocument=this}function it(o,r,u){o&&o._inc++;var h=u.namespaceURI;h===s.XMLNS&&(r._nsMap[u.prefix?u.localName:""]=u.value)}function Je(o,r,u,h){o&&o._inc++;var m=u.namespaceURI;m===s.XMLNS&&delete r._nsMap[u.prefix?u.localName:""]}function We(o,r,u){if(o&&o._inc){o._inc++;var h=r.childNodes;if(u)h[h.length++]=u;else{for(var m=r.firstChild,A=0;m;)h[A++]=m,m=m.nextSibling;h.length=A,delete h[h.length]}}}function je(o,r){var u=r.previousSibling,h=r.nextSibling;return u?u.nextSibling=h:o.firstChild=h,h?h.previousSibling=u:o.lastChild=u,r.parentNode=null,r.previousSibling=null,r.nextSibling=null,We(o.ownerDocument,o),r}function V(o){return o&&(o.nodeType===ye.DOCUMENT_NODE||o.nodeType===ye.DOCUMENT_FRAGMENT_NODE||o.nodeType===ye.ELEMENT_NODE)}function T(o){return o&&(O(o)||W(o)||U(o)||o.nodeType===ye.DOCUMENT_FRAGMENT_NODE||o.nodeType===ye.COMMENT_NODE||o.nodeType===ye.PROCESSING_INSTRUCTION_NODE)}function U(o){return o&&o.nodeType===ye.DOCUMENT_TYPE_NODE}function O(o){return o&&o.nodeType===ye.ELEMENT_NODE}function W(o){return o&&o.nodeType===ye.TEXT_NODE}function X(o,r){var u=o.childNodes||[];if(i(u,O)||U(r))return!1;var h=i(u,U);return!(r&&h&&u.indexOf(h)>u.indexOf(r))}function he(o,r){var u=o.childNodes||[];function h(A){return O(A)&&A!==r}if(i(u,h))return!1;var m=i(u,U);return!(r&&m&&u.indexOf(m)>u.indexOf(r))}function we(o,r,u){if(!V(o))throw new ee(D,"Unexpected parent node type "+o.nodeType);if(u&&u.parentNode!==o)throw new ee($,"child not in parent");if(!T(r)||U(r)&&o.nodeType!==ye.DOCUMENT_NODE)throw new ee(D,"Unexpected node type "+r.nodeType+" for parent node type "+o.nodeType)}function Ee(o,r,u){var h=o.childNodes||[],m=r.childNodes||[];if(r.nodeType===ye.DOCUMENT_FRAGMENT_NODE){var A=m.filter(O);if(A.length>1||i(m,W))throw new ee(D,"More than one element or text in fragment");if(A.length===1&&!X(o,u))throw new ee(D,"Element in fragment can not be inserted before doctype")}if(O(r)&&!X(o,u))throw new ee(D,"Only one element can be added and only after doctype");if(U(r)){if(i(h,U))throw new ee(D,"Only one doctype is allowed");var B=i(h,O);if(u&&h.indexOf(B)1||i(m,W))throw new ee(D,"More than one element or text in fragment");if(A.length===1&&!he(o,u))throw new ee(D,"Element in fragment can not be inserted before doctype")}if(O(r)&&!he(o,u))throw new ee(D,"Only one element can be added and only after doctype");if(U(r)){let pe=function(ce){return U(ce)&&ce!==u};var H=pe;if(i(h,pe))throw new ee(D,"Only one doctype is allowed");var B=i(h,O);if(u&&h.indexOf(B)0&&Ue(u.documentElement,function(m){if(m!==u&&m.nodeType===R){var A=m.getAttribute("class");if(A){var B=o===A;if(!B){var H=v(A);B=r.every(S(H))}B&&h.push(m)}}}),h})},createElement:function(o){var r=new Pe;r.ownerDocument=this,r.nodeName=o,r.tagName=o,r.localName=o,r.childNodes=new te;var u=r.attributes=new le;return u._ownerElement=r,r},createDocumentFragment:function(){var o=new ct;return o.ownerDocument=this,o.childNodes=new te,o},createTextNode:function(o){var r=new Ze;return r.ownerDocument=this,r.appendData(o),r},createComment:function(o){var r=new xe;return r.ownerDocument=this,r.appendData(o),r},createCDATASection:function(o){var r=new ot;return r.ownerDocument=this,r.appendData(o),r},createProcessingInstruction:function(o,r){var u=new nt;return u.ownerDocument=this,u.tagName=u.nodeName=u.target=o,u.nodeValue=u.data=r,u},createAttribute:function(o){var r=new He;return r.ownerDocument=this,r.name=o,r.nodeName=o,r.localName=o,r.specified=!0,r},createEntityReference:function(o){var r=new mt;return r.ownerDocument=this,r.nodeName=o,r},createElementNS:function(o,r){var u=new Pe,h=r.split(":"),m=u.attributes=new le;return u.childNodes=new te,u.ownerDocument=this,u.nodeName=r,u.tagName=r,u.namespaceURI=o,h.length==2?(u.prefix=h[0],u.localName=h[1]):u.localName=r,m._ownerElement=u,u},createAttributeNS:function(o,r){var u=new He,h=r.split(":");return u.ownerDocument=this,u.nodeName=r,u.name=r,u.namespaceURI=o,u.specified=!0,h.length==2?(u.prefix=h[0],u.localName=h[1]):u.localName=r,u}},k(Re,ye);function Pe(){this._nsMap={}}Pe.prototype={nodeType:R,hasAttribute:function(o){return this.getAttributeNode(o)!=null},getAttribute:function(o){var r=this.getAttributeNode(o);return r&&r.value||""},getAttributeNode:function(o){return this.attributes.getNamedItem(o)},setAttribute:function(o,r){var u=this.ownerDocument.createAttribute(o);u.value=u.nodeValue=""+r,this.setAttributeNode(u)},removeAttribute:function(o){var r=this.getAttributeNode(o);r&&this.removeAttributeNode(r)},appendChild:function(o){return o.nodeType===f?this.insertBefore(o,null):qe(this,o)},setAttributeNode:function(o){return this.attributes.setNamedItem(o)},setAttributeNodeNS:function(o){return this.attributes.setNamedItemNS(o)},removeAttributeNode:function(o){return this.attributes.removeNamedItem(o.nodeName)},removeAttributeNS:function(o,r){var u=this.getAttributeNodeNS(o,r);u&&this.removeAttributeNode(u)},hasAttributeNS:function(o,r){return this.getAttributeNodeNS(o,r)!=null},getAttributeNS:function(o,r){var u=this.getAttributeNodeNS(o,r);return u&&u.value||""},setAttributeNS:function(o,r,u){var h=this.ownerDocument.createAttributeNS(o,r);h.value=h.nodeValue=""+u,this.setAttributeNode(h)},getAttributeNodeNS:function(o,r){return this.attributes.getNamedItemNS(o,r)},getElementsByTagName:function(o){return new de(this,function(r){var u=[];return Ue(r,function(h){h!==r&&h.nodeType==R&&(o==="*"||h.tagName==o)&&u.push(h)}),u})},getElementsByTagNameNS:function(o,r){return new de(this,function(u){var h=[];return Ue(u,function(m){m!==u&&m.nodeType===R&&(o==="*"||m.namespaceURI===o)&&(r==="*"||m.localName==r)&&h.push(m)}),h})}},Re.prototype.getElementsByTagName=Pe.prototype.getElementsByTagName,Re.prototype.getElementsByTagNameNS=Pe.prototype.getElementsByTagNameNS,k(Pe,ye);function He(){}He.prototype.nodeType=F,k(He,ye);function rt(){}rt.prototype={data:"",substringData:function(o,r){return this.data.substring(o,o+r)},appendData:function(o){o=this.data+o,this.nodeValue=this.data=o,this.length=o.length},insertData:function(o,r){this.replaceData(o,0,r)},appendChild:function(o){throw new Error(b[D])},deleteData:function(o,r){this.replaceData(o,r,"")},replaceData:function(o,r,u){var h=this.data.substring(0,o),m=this.data.substring(o+r);u=h+u+m,this.nodeValue=this.data=u,this.length=u.length}},k(rt,ye);function Ze(){}Ze.prototype={nodeName:"#text",nodeType:j,splitText:function(o){var r=this.data,u=r.substring(o);r=r.substring(0,o),this.data=this.nodeValue=r,this.length=r.length;var h=this.ownerDocument.createTextNode(u);return this.parentNode&&this.parentNode.insertBefore(h,this.nextSibling),h}},k(Ze,rt);function xe(){}xe.prototype={nodeName:"#comment",nodeType:E},k(xe,rt);function ot(){}ot.prototype={nodeName:"#cdata-section",nodeType:M},k(ot,rt);function st(){}st.prototype.nodeType=p,k(st,ye);function gt(){}gt.prototype.nodeType=y,k(gt,ye);function Rt(){}Rt.prototype.nodeType=_,k(Rt,ye);function mt(){}mt.prototype.nodeType=J,k(mt,ye);function ct(){}ct.prototype.nodeName="#document-fragment",ct.prototype.nodeType=f,k(ct,ye);function nt(){}nt.prototype.nodeType=P,k(nt,ye);function wt(){}wt.prototype.serializeToString=function(o,r,u){return jt.call(o,r,u)},ye.prototype.toString=jt;function jt(o,r){var u=[],h=this.nodeType==9&&this.documentElement||this,m=h.prefix,A=h.namespaceURI;if(A&&m==null){var m=h.lookupPrefix(A);if(m==null)var B=[{namespace:A,prefix:null}]}return se(this,u,o,r,B),u.join("")}function Zt(o,r,u){var h=o.prefix||"",m=o.namespaceURI;if(!m||h==="xml"&&m===s.XML||m===s.XMLNS)return!1;for(var A=u.length;A--;){var B=u[A];if(B.prefix===h)return B.namespace!==m}return!0}function qt(o,r,u){o.push(" ",r,'="',u.replace(/[<>&"\t\n\r]/g,Fe),'"')}function se(o,r,u,h,m){if(m||(m=[]),h)if(o=h(o),o){if(typeof o=="string"){r.push(o);return}}else return;switch(o.nodeType){case R:var A=o.attributes,B=A.length,Le=o.firstChild,H=o.tagName;u=s.isHTML(o.namespaceURI)||u;var pe=H;if(!u&&!o.prefix&&o.namespaceURI){for(var ce,ve=0;ve=0;Y--){var be=m[Y];if(be.prefix===""&&be.namespace===o.namespaceURI){ce=be.namespace;break}}if(ce!==o.namespaceURI)for(var Y=m.length-1;Y>=0;Y--){var be=m[Y];if(be.namespace===o.namespaceURI){be.prefix&&(pe=be.prefix+":"+H);break}}}r.push("<",pe);for(var Ve=0;Ve"),u&&/^script$/i.test(H))for(;Le;)Le.data?r.push(Le.data):se(Le,r,u,h,m.slice()),Le=Le.nextSibling;else for(;Le;)se(Le,r,u,h,m.slice()),Le=Le.nextSibling;r.push("",pe,">")}else r.push("/>");return;case I:case f:for(var Le=o.firstChild;Le;)se(Le,r,u,h,m.slice()),Le=Le.nextSibling;return;case F:return qt(r,o.name,o.value);case j:return r.push(o.data.replace(/[<&>]/g,Fe));case M:return r.push("");case E:return r.push("");case p:var Te=o.publicId,Se=o.systemId;if(r.push("");else if(Se&&Se!=".")r.push(" SYSTEM ",Se,">");else{var Ae=o.internalSubset;Ae&&r.push(" [",Ae,"]"),r.push(">")}return;case P:return r.push("",o.target," ",o.data,"?>");case J:return r.push("&",o.nodeName,";");default:r.push("??",o.nodeName)}}function $t(o,r,u){var h;switch(r.nodeType){case R:h=r.cloneNode(!1),h.ownerDocument=o;case f:break;case F:u=!0;break}if(h||(h=r.cloneNode(!1)),h.ownerDocument=o,h.parentNode=null,u)for(var m=r.firstChild;m;)h.appendChild($t(o,m,u)),m=m.nextSibling;return h}function Bt(o,r,u){var h=new r.constructor;for(var m in r)if(Object.prototype.hasOwnProperty.call(r,m)){var A=r[m];typeof A!="object"&&A!=h[m]&&(h[m]=A)}switch(r.childNodes&&(h.childNodes=new te),h.ownerDocument=o,h.nodeType){case R:var B=r.attributes,H=h.attributes=new le,pe=B.length;H._ownerElement=h;for(var ce=0;ce",lt:"<",quot:'"'}),c.HTML_ENTITIES=t({Aacute:"\xC1",aacute:"\xE1",Abreve:"\u0102",abreve:"\u0103",ac:"\u223E",acd:"\u223F",acE:"\u223E\u0333",Acirc:"\xC2",acirc:"\xE2",acute:"\xB4",Acy:"\u0410",acy:"\u0430",AElig:"\xC6",aelig:"\xE6",af:"\u2061",Afr:"\u{1D504}",afr:"\u{1D51E}",Agrave:"\xC0",agrave:"\xE0",alefsym:"\u2135",aleph:"\u2135",Alpha:"\u0391",alpha:"\u03B1",Amacr:"\u0100",amacr:"\u0101",amalg:"\u2A3F",AMP:"&",amp:"&",And:"\u2A53",and:"\u2227",andand:"\u2A55",andd:"\u2A5C",andslope:"\u2A58",andv:"\u2A5A",ang:"\u2220",ange:"\u29A4",angle:"\u2220",angmsd:"\u2221",angmsdaa:"\u29A8",angmsdab:"\u29A9",angmsdac:"\u29AA",angmsdad:"\u29AB",angmsdae:"\u29AC",angmsdaf:"\u29AD",angmsdag:"\u29AE",angmsdah:"\u29AF",angrt:"\u221F",angrtvb:"\u22BE",angrtvbd:"\u299D",angsph:"\u2222",angst:"\xC5",angzarr:"\u237C",Aogon:"\u0104",aogon:"\u0105",Aopf:"\u{1D538}",aopf:"\u{1D552}",ap:"\u2248",apacir:"\u2A6F",apE:"\u2A70",ape:"\u224A",apid:"\u224B",apos:"'",ApplyFunction:"\u2061",approx:"\u2248",approxeq:"\u224A",Aring:"\xC5",aring:"\xE5",Ascr:"\u{1D49C}",ascr:"\u{1D4B6}",Assign:"\u2254",ast:"*",asymp:"\u2248",asympeq:"\u224D",Atilde:"\xC3",atilde:"\xE3",Auml:"\xC4",auml:"\xE4",awconint:"\u2233",awint:"\u2A11",backcong:"\u224C",backepsilon:"\u03F6",backprime:"\u2035",backsim:"\u223D",backsimeq:"\u22CD",Backslash:"\u2216",Barv:"\u2AE7",barvee:"\u22BD",Barwed:"\u2306",barwed:"\u2305",barwedge:"\u2305",bbrk:"\u23B5",bbrktbrk:"\u23B6",bcong:"\u224C",Bcy:"\u0411",bcy:"\u0431",bdquo:"\u201E",becaus:"\u2235",Because:"\u2235",because:"\u2235",bemptyv:"\u29B0",bepsi:"\u03F6",bernou:"\u212C",Bernoullis:"\u212C",Beta:"\u0392",beta:"\u03B2",beth:"\u2136",between:"\u226C",Bfr:"\u{1D505}",bfr:"\u{1D51F}",bigcap:"\u22C2",bigcirc:"\u25EF",bigcup:"\u22C3",bigodot:"\u2A00",bigoplus:"\u2A01",bigotimes:"\u2A02",bigsqcup:"\u2A06",bigstar:"\u2605",bigtriangledown:"\u25BD",bigtriangleup:"\u25B3",biguplus:"\u2A04",bigvee:"\u22C1",bigwedge:"\u22C0",bkarow:"\u290D",blacklozenge:"\u29EB",blacksquare:"\u25AA",blacktriangle:"\u25B4",blacktriangledown:"\u25BE",blacktriangleleft:"\u25C2",blacktriangleright:"\u25B8",blank:"\u2423",blk12:"\u2592",blk14:"\u2591",blk34:"\u2593",block:"\u2588",bne:"=\u20E5",bnequiv:"\u2261\u20E5",bNot:"\u2AED",bnot:"\u2310",Bopf:"\u{1D539}",bopf:"\u{1D553}",bot:"\u22A5",bottom:"\u22A5",bowtie:"\u22C8",boxbox:"\u29C9",boxDL:"\u2557",boxDl:"\u2556",boxdL:"\u2555",boxdl:"\u2510",boxDR:"\u2554",boxDr:"\u2553",boxdR:"\u2552",boxdr:"\u250C",boxH:"\u2550",boxh:"\u2500",boxHD:"\u2566",boxHd:"\u2564",boxhD:"\u2565",boxhd:"\u252C",boxHU:"\u2569",boxHu:"\u2567",boxhU:"\u2568",boxhu:"\u2534",boxminus:"\u229F",boxplus:"\u229E",boxtimes:"\u22A0",boxUL:"\u255D",boxUl:"\u255C",boxuL:"\u255B",boxul:"\u2518",boxUR:"\u255A",boxUr:"\u2559",boxuR:"\u2558",boxur:"\u2514",boxV:"\u2551",boxv:"\u2502",boxVH:"\u256C",boxVh:"\u256B",boxvH:"\u256A",boxvh:"\u253C",boxVL:"\u2563",boxVl:"\u2562",boxvL:"\u2561",boxvl:"\u2524",boxVR:"\u2560",boxVr:"\u255F",boxvR:"\u255E",boxvr:"\u251C",bprime:"\u2035",Breve:"\u02D8",breve:"\u02D8",brvbar:"\xA6",Bscr:"\u212C",bscr:"\u{1D4B7}",bsemi:"\u204F",bsim:"\u223D",bsime:"\u22CD",bsol:"\\",bsolb:"\u29C5",bsolhsub:"\u27C8",bull:"\u2022",bullet:"\u2022",bump:"\u224E",bumpE:"\u2AAE",bumpe:"\u224F",Bumpeq:"\u224E",bumpeq:"\u224F",Cacute:"\u0106",cacute:"\u0107",Cap:"\u22D2",cap:"\u2229",capand:"\u2A44",capbrcup:"\u2A49",capcap:"\u2A4B",capcup:"\u2A47",capdot:"\u2A40",CapitalDifferentialD:"\u2145",caps:"\u2229\uFE00",caret:"\u2041",caron:"\u02C7",Cayleys:"\u212D",ccaps:"\u2A4D",Ccaron:"\u010C",ccaron:"\u010D",Ccedil:"\xC7",ccedil:"\xE7",Ccirc:"\u0108",ccirc:"\u0109",Cconint:"\u2230",ccups:"\u2A4C",ccupssm:"\u2A50",Cdot:"\u010A",cdot:"\u010B",cedil:"\xB8",Cedilla:"\xB8",cemptyv:"\u29B2",cent:"\xA2",CenterDot:"\xB7",centerdot:"\xB7",Cfr:"\u212D",cfr:"\u{1D520}",CHcy:"\u0427",chcy:"\u0447",check:"\u2713",checkmark:"\u2713",Chi:"\u03A7",chi:"\u03C7",cir:"\u25CB",circ:"\u02C6",circeq:"\u2257",circlearrowleft:"\u21BA",circlearrowright:"\u21BB",circledast:"\u229B",circledcirc:"\u229A",circleddash:"\u229D",CircleDot:"\u2299",circledR:"\xAE",circledS:"\u24C8",CircleMinus:"\u2296",CirclePlus:"\u2295",CircleTimes:"\u2297",cirE:"\u29C3",cire:"\u2257",cirfnint:"\u2A10",cirmid:"\u2AEF",cirscir:"\u29C2",ClockwiseContourIntegral:"\u2232",CloseCurlyDoubleQuote:"\u201D",CloseCurlyQuote:"\u2019",clubs:"\u2663",clubsuit:"\u2663",Colon:"\u2237",colon:":",Colone:"\u2A74",colone:"\u2254",coloneq:"\u2254",comma:",",commat:"@",comp:"\u2201",compfn:"\u2218",complement:"\u2201",complexes:"\u2102",cong:"\u2245",congdot:"\u2A6D",Congruent:"\u2261",Conint:"\u222F",conint:"\u222E",ContourIntegral:"\u222E",Copf:"\u2102",copf:"\u{1D554}",coprod:"\u2210",Coproduct:"\u2210",COPY:"\xA9",copy:"\xA9",copysr:"\u2117",CounterClockwiseContourIntegral:"\u2233",crarr:"\u21B5",Cross:"\u2A2F",cross:"\u2717",Cscr:"\u{1D49E}",cscr:"\u{1D4B8}",csub:"\u2ACF",csube:"\u2AD1",csup:"\u2AD0",csupe:"\u2AD2",ctdot:"\u22EF",cudarrl:"\u2938",cudarrr:"\u2935",cuepr:"\u22DE",cuesc:"\u22DF",cularr:"\u21B6",cularrp:"\u293D",Cup:"\u22D3",cup:"\u222A",cupbrcap:"\u2A48",CupCap:"\u224D",cupcap:"\u2A46",cupcup:"\u2A4A",cupdot:"\u228D",cupor:"\u2A45",cups:"\u222A\uFE00",curarr:"\u21B7",curarrm:"\u293C",curlyeqprec:"\u22DE",curlyeqsucc:"\u22DF",curlyvee:"\u22CE",curlywedge:"\u22CF",curren:"\xA4",curvearrowleft:"\u21B6",curvearrowright:"\u21B7",cuvee:"\u22CE",cuwed:"\u22CF",cwconint:"\u2232",cwint:"\u2231",cylcty:"\u232D",Dagger:"\u2021",dagger:"\u2020",daleth:"\u2138",Darr:"\u21A1",dArr:"\u21D3",darr:"\u2193",dash:"\u2010",Dashv:"\u2AE4",dashv:"\u22A3",dbkarow:"\u290F",dblac:"\u02DD",Dcaron:"\u010E",dcaron:"\u010F",Dcy:"\u0414",dcy:"\u0434",DD:"\u2145",dd:"\u2146",ddagger:"\u2021",ddarr:"\u21CA",DDotrahd:"\u2911",ddotseq:"\u2A77",deg:"\xB0",Del:"\u2207",Delta:"\u0394",delta:"\u03B4",demptyv:"\u29B1",dfisht:"\u297F",Dfr:"\u{1D507}",dfr:"\u{1D521}",dHar:"\u2965",dharl:"\u21C3",dharr:"\u21C2",DiacriticalAcute:"\xB4",DiacriticalDot:"\u02D9",DiacriticalDoubleAcute:"\u02DD",DiacriticalGrave:"`",DiacriticalTilde:"\u02DC",diam:"\u22C4",Diamond:"\u22C4",diamond:"\u22C4",diamondsuit:"\u2666",diams:"\u2666",die:"\xA8",DifferentialD:"\u2146",digamma:"\u03DD",disin:"\u22F2",div:"\xF7",divide:"\xF7",divideontimes:"\u22C7",divonx:"\u22C7",DJcy:"\u0402",djcy:"\u0452",dlcorn:"\u231E",dlcrop:"\u230D",dollar:"$",Dopf:"\u{1D53B}",dopf:"\u{1D555}",Dot:"\xA8",dot:"\u02D9",DotDot:"\u20DC",doteq:"\u2250",doteqdot:"\u2251",DotEqual:"\u2250",dotminus:"\u2238",dotplus:"\u2214",dotsquare:"\u22A1",doublebarwedge:"\u2306",DoubleContourIntegral:"\u222F",DoubleDot:"\xA8",DoubleDownArrow:"\u21D3",DoubleLeftArrow:"\u21D0",DoubleLeftRightArrow:"\u21D4",DoubleLeftTee:"\u2AE4",DoubleLongLeftArrow:"\u27F8",DoubleLongLeftRightArrow:"\u27FA",DoubleLongRightArrow:"\u27F9",DoubleRightArrow:"\u21D2",DoubleRightTee:"\u22A8",DoubleUpArrow:"\u21D1",DoubleUpDownArrow:"\u21D5",DoubleVerticalBar:"\u2225",DownArrow:"\u2193",Downarrow:"\u21D3",downarrow:"\u2193",DownArrowBar:"\u2913",DownArrowUpArrow:"\u21F5",DownBreve:"\u0311",downdownarrows:"\u21CA",downharpoonleft:"\u21C3",downharpoonright:"\u21C2",DownLeftRightVector:"\u2950",DownLeftTeeVector:"\u295E",DownLeftVector:"\u21BD",DownLeftVectorBar:"\u2956",DownRightTeeVector:"\u295F",DownRightVector:"\u21C1",DownRightVectorBar:"\u2957",DownTee:"\u22A4",DownTeeArrow:"\u21A7",drbkarow:"\u2910",drcorn:"\u231F",drcrop:"\u230C",Dscr:"\u{1D49F}",dscr:"\u{1D4B9}",DScy:"\u0405",dscy:"\u0455",dsol:"\u29F6",Dstrok:"\u0110",dstrok:"\u0111",dtdot:"\u22F1",dtri:"\u25BF",dtrif:"\u25BE",duarr:"\u21F5",duhar:"\u296F",dwangle:"\u29A6",DZcy:"\u040F",dzcy:"\u045F",dzigrarr:"\u27FF",Eacute:"\xC9",eacute:"\xE9",easter:"\u2A6E",Ecaron:"\u011A",ecaron:"\u011B",ecir:"\u2256",Ecirc:"\xCA",ecirc:"\xEA",ecolon:"\u2255",Ecy:"\u042D",ecy:"\u044D",eDDot:"\u2A77",Edot:"\u0116",eDot:"\u2251",edot:"\u0117",ee:"\u2147",efDot:"\u2252",Efr:"\u{1D508}",efr:"\u{1D522}",eg:"\u2A9A",Egrave:"\xC8",egrave:"\xE8",egs:"\u2A96",egsdot:"\u2A98",el:"\u2A99",Element:"\u2208",elinters:"\u23E7",ell:"\u2113",els:"\u2A95",elsdot:"\u2A97",Emacr:"\u0112",emacr:"\u0113",empty:"\u2205",emptyset:"\u2205",EmptySmallSquare:"\u25FB",emptyv:"\u2205",EmptyVerySmallSquare:"\u25AB",emsp:"\u2003",emsp13:"\u2004",emsp14:"\u2005",ENG:"\u014A",eng:"\u014B",ensp:"\u2002",Eogon:"\u0118",eogon:"\u0119",Eopf:"\u{1D53C}",eopf:"\u{1D556}",epar:"\u22D5",eparsl:"\u29E3",eplus:"\u2A71",epsi:"\u03B5",Epsilon:"\u0395",epsilon:"\u03B5",epsiv:"\u03F5",eqcirc:"\u2256",eqcolon:"\u2255",eqsim:"\u2242",eqslantgtr:"\u2A96",eqslantless:"\u2A95",Equal:"\u2A75",equals:"=",EqualTilde:"\u2242",equest:"\u225F",Equilibrium:"\u21CC",equiv:"\u2261",equivDD:"\u2A78",eqvparsl:"\u29E5",erarr:"\u2971",erDot:"\u2253",Escr:"\u2130",escr:"\u212F",esdot:"\u2250",Esim:"\u2A73",esim:"\u2242",Eta:"\u0397",eta:"\u03B7",ETH:"\xD0",eth:"\xF0",Euml:"\xCB",euml:"\xEB",euro:"\u20AC",excl:"!",exist:"\u2203",Exists:"\u2203",expectation:"\u2130",ExponentialE:"\u2147",exponentiale:"\u2147",fallingdotseq:"\u2252",Fcy:"\u0424",fcy:"\u0444",female:"\u2640",ffilig:"\uFB03",fflig:"\uFB00",ffllig:"\uFB04",Ffr:"\u{1D509}",ffr:"\u{1D523}",filig:"\uFB01",FilledSmallSquare:"\u25FC",FilledVerySmallSquare:"\u25AA",fjlig:"fj",flat:"\u266D",fllig:"\uFB02",fltns:"\u25B1",fnof:"\u0192",Fopf:"\u{1D53D}",fopf:"\u{1D557}",ForAll:"\u2200",forall:"\u2200",fork:"\u22D4",forkv:"\u2AD9",Fouriertrf:"\u2131",fpartint:"\u2A0D",frac12:"\xBD",frac13:"\u2153",frac14:"\xBC",frac15:"\u2155",frac16:"\u2159",frac18:"\u215B",frac23:"\u2154",frac25:"\u2156",frac34:"\xBE",frac35:"\u2157",frac38:"\u215C",frac45:"\u2158",frac56:"\u215A",frac58:"\u215D",frac78:"\u215E",frasl:"\u2044",frown:"\u2322",Fscr:"\u2131",fscr:"\u{1D4BB}",gacute:"\u01F5",Gamma:"\u0393",gamma:"\u03B3",Gammad:"\u03DC",gammad:"\u03DD",gap:"\u2A86",Gbreve:"\u011E",gbreve:"\u011F",Gcedil:"\u0122",Gcirc:"\u011C",gcirc:"\u011D",Gcy:"\u0413",gcy:"\u0433",Gdot:"\u0120",gdot:"\u0121",gE:"\u2267",ge:"\u2265",gEl:"\u2A8C",gel:"\u22DB",geq:"\u2265",geqq:"\u2267",geqslant:"\u2A7E",ges:"\u2A7E",gescc:"\u2AA9",gesdot:"\u2A80",gesdoto:"\u2A82",gesdotol:"\u2A84",gesl:"\u22DB\uFE00",gesles:"\u2A94",Gfr:"\u{1D50A}",gfr:"\u{1D524}",Gg:"\u22D9",gg:"\u226B",ggg:"\u22D9",gimel:"\u2137",GJcy:"\u0403",gjcy:"\u0453",gl:"\u2277",gla:"\u2AA5",glE:"\u2A92",glj:"\u2AA4",gnap:"\u2A8A",gnapprox:"\u2A8A",gnE:"\u2269",gne:"\u2A88",gneq:"\u2A88",gneqq:"\u2269",gnsim:"\u22E7",Gopf:"\u{1D53E}",gopf:"\u{1D558}",grave:"`",GreaterEqual:"\u2265",GreaterEqualLess:"\u22DB",GreaterFullEqual:"\u2267",GreaterGreater:"\u2AA2",GreaterLess:"\u2277",GreaterSlantEqual:"\u2A7E",GreaterTilde:"\u2273",Gscr:"\u{1D4A2}",gscr:"\u210A",gsim:"\u2273",gsime:"\u2A8E",gsiml:"\u2A90",Gt:"\u226B",GT:">",gt:">",gtcc:"\u2AA7",gtcir:"\u2A7A",gtdot:"\u22D7",gtlPar:"\u2995",gtquest:"\u2A7C",gtrapprox:"\u2A86",gtrarr:"\u2978",gtrdot:"\u22D7",gtreqless:"\u22DB",gtreqqless:"\u2A8C",gtrless:"\u2277",gtrsim:"\u2273",gvertneqq:"\u2269\uFE00",gvnE:"\u2269\uFE00",Hacek:"\u02C7",hairsp:"\u200A",half:"\xBD",hamilt:"\u210B",HARDcy:"\u042A",hardcy:"\u044A",hArr:"\u21D4",harr:"\u2194",harrcir:"\u2948",harrw:"\u21AD",Hat:"^",hbar:"\u210F",Hcirc:"\u0124",hcirc:"\u0125",hearts:"\u2665",heartsuit:"\u2665",hellip:"\u2026",hercon:"\u22B9",Hfr:"\u210C",hfr:"\u{1D525}",HilbertSpace:"\u210B",hksearow:"\u2925",hkswarow:"\u2926",hoarr:"\u21FF",homtht:"\u223B",hookleftarrow:"\u21A9",hookrightarrow:"\u21AA",Hopf:"\u210D",hopf:"\u{1D559}",horbar:"\u2015",HorizontalLine:"\u2500",Hscr:"\u210B",hscr:"\u{1D4BD}",hslash:"\u210F",Hstrok:"\u0126",hstrok:"\u0127",HumpDownHump:"\u224E",HumpEqual:"\u224F",hybull:"\u2043",hyphen:"\u2010",Iacute:"\xCD",iacute:"\xED",ic:"\u2063",Icirc:"\xCE",icirc:"\xEE",Icy:"\u0418",icy:"\u0438",Idot:"\u0130",IEcy:"\u0415",iecy:"\u0435",iexcl:"\xA1",iff:"\u21D4",Ifr:"\u2111",ifr:"\u{1D526}",Igrave:"\xCC",igrave:"\xEC",ii:"\u2148",iiiint:"\u2A0C",iiint:"\u222D",iinfin:"\u29DC",iiota:"\u2129",IJlig:"\u0132",ijlig:"\u0133",Im:"\u2111",Imacr:"\u012A",imacr:"\u012B",image:"\u2111",ImaginaryI:"\u2148",imagline:"\u2110",imagpart:"\u2111",imath:"\u0131",imof:"\u22B7",imped:"\u01B5",Implies:"\u21D2",in:"\u2208",incare:"\u2105",infin:"\u221E",infintie:"\u29DD",inodot:"\u0131",Int:"\u222C",int:"\u222B",intcal:"\u22BA",integers:"\u2124",Integral:"\u222B",intercal:"\u22BA",Intersection:"\u22C2",intlarhk:"\u2A17",intprod:"\u2A3C",InvisibleComma:"\u2063",InvisibleTimes:"\u2062",IOcy:"\u0401",iocy:"\u0451",Iogon:"\u012E",iogon:"\u012F",Iopf:"\u{1D540}",iopf:"\u{1D55A}",Iota:"\u0399",iota:"\u03B9",iprod:"\u2A3C",iquest:"\xBF",Iscr:"\u2110",iscr:"\u{1D4BE}",isin:"\u2208",isindot:"\u22F5",isinE:"\u22F9",isins:"\u22F4",isinsv:"\u22F3",isinv:"\u2208",it:"\u2062",Itilde:"\u0128",itilde:"\u0129",Iukcy:"\u0406",iukcy:"\u0456",Iuml:"\xCF",iuml:"\xEF",Jcirc:"\u0134",jcirc:"\u0135",Jcy:"\u0419",jcy:"\u0439",Jfr:"\u{1D50D}",jfr:"\u{1D527}",jmath:"\u0237",Jopf:"\u{1D541}",jopf:"\u{1D55B}",Jscr:"\u{1D4A5}",jscr:"\u{1D4BF}",Jsercy:"\u0408",jsercy:"\u0458",Jukcy:"\u0404",jukcy:"\u0454",Kappa:"\u039A",kappa:"\u03BA",kappav:"\u03F0",Kcedil:"\u0136",kcedil:"\u0137",Kcy:"\u041A",kcy:"\u043A",Kfr:"\u{1D50E}",kfr:"\u{1D528}",kgreen:"\u0138",KHcy:"\u0425",khcy:"\u0445",KJcy:"\u040C",kjcy:"\u045C",Kopf:"\u{1D542}",kopf:"\u{1D55C}",Kscr:"\u{1D4A6}",kscr:"\u{1D4C0}",lAarr:"\u21DA",Lacute:"\u0139",lacute:"\u013A",laemptyv:"\u29B4",lagran:"\u2112",Lambda:"\u039B",lambda:"\u03BB",Lang:"\u27EA",lang:"\u27E8",langd:"\u2991",langle:"\u27E8",lap:"\u2A85",Laplacetrf:"\u2112",laquo:"\xAB",Larr:"\u219E",lArr:"\u21D0",larr:"\u2190",larrb:"\u21E4",larrbfs:"\u291F",larrfs:"\u291D",larrhk:"\u21A9",larrlp:"\u21AB",larrpl:"\u2939",larrsim:"\u2973",larrtl:"\u21A2",lat:"\u2AAB",lAtail:"\u291B",latail:"\u2919",late:"\u2AAD",lates:"\u2AAD\uFE00",lBarr:"\u290E",lbarr:"\u290C",lbbrk:"\u2772",lbrace:"{",lbrack:"[",lbrke:"\u298B",lbrksld:"\u298F",lbrkslu:"\u298D",Lcaron:"\u013D",lcaron:"\u013E",Lcedil:"\u013B",lcedil:"\u013C",lceil:"\u2308",lcub:"{",Lcy:"\u041B",lcy:"\u043B",ldca:"\u2936",ldquo:"\u201C",ldquor:"\u201E",ldrdhar:"\u2967",ldrushar:"\u294B",ldsh:"\u21B2",lE:"\u2266",le:"\u2264",LeftAngleBracket:"\u27E8",LeftArrow:"\u2190",Leftarrow:"\u21D0",leftarrow:"\u2190",LeftArrowBar:"\u21E4",LeftArrowRightArrow:"\u21C6",leftarrowtail:"\u21A2",LeftCeiling:"\u2308",LeftDoubleBracket:"\u27E6",LeftDownTeeVector:"\u2961",LeftDownVector:"\u21C3",LeftDownVectorBar:"\u2959",LeftFloor:"\u230A",leftharpoondown:"\u21BD",leftharpoonup:"\u21BC",leftleftarrows:"\u21C7",LeftRightArrow:"\u2194",Leftrightarrow:"\u21D4",leftrightarrow:"\u2194",leftrightarrows:"\u21C6",leftrightharpoons:"\u21CB",leftrightsquigarrow:"\u21AD",LeftRightVector:"\u294E",LeftTee:"\u22A3",LeftTeeArrow:"\u21A4",LeftTeeVector:"\u295A",leftthreetimes:"\u22CB",LeftTriangle:"\u22B2",LeftTriangleBar:"\u29CF",LeftTriangleEqual:"\u22B4",LeftUpDownVector:"\u2951",LeftUpTeeVector:"\u2960",LeftUpVector:"\u21BF",LeftUpVectorBar:"\u2958",LeftVector:"\u21BC",LeftVectorBar:"\u2952",lEg:"\u2A8B",leg:"\u22DA",leq:"\u2264",leqq:"\u2266",leqslant:"\u2A7D",les:"\u2A7D",lescc:"\u2AA8",lesdot:"\u2A7F",lesdoto:"\u2A81",lesdotor:"\u2A83",lesg:"\u22DA\uFE00",lesges:"\u2A93",lessapprox:"\u2A85",lessdot:"\u22D6",lesseqgtr:"\u22DA",lesseqqgtr:"\u2A8B",LessEqualGreater:"\u22DA",LessFullEqual:"\u2266",LessGreater:"\u2276",lessgtr:"\u2276",LessLess:"\u2AA1",lesssim:"\u2272",LessSlantEqual:"\u2A7D",LessTilde:"\u2272",lfisht:"\u297C",lfloor:"\u230A",Lfr:"\u{1D50F}",lfr:"\u{1D529}",lg:"\u2276",lgE:"\u2A91",lHar:"\u2962",lhard:"\u21BD",lharu:"\u21BC",lharul:"\u296A",lhblk:"\u2584",LJcy:"\u0409",ljcy:"\u0459",Ll:"\u22D8",ll:"\u226A",llarr:"\u21C7",llcorner:"\u231E",Lleftarrow:"\u21DA",llhard:"\u296B",lltri:"\u25FA",Lmidot:"\u013F",lmidot:"\u0140",lmoust:"\u23B0",lmoustache:"\u23B0",lnap:"\u2A89",lnapprox:"\u2A89",lnE:"\u2268",lne:"\u2A87",lneq:"\u2A87",lneqq:"\u2268",lnsim:"\u22E6",loang:"\u27EC",loarr:"\u21FD",lobrk:"\u27E6",LongLeftArrow:"\u27F5",Longleftarrow:"\u27F8",longleftarrow:"\u27F5",LongLeftRightArrow:"\u27F7",Longleftrightarrow:"\u27FA",longleftrightarrow:"\u27F7",longmapsto:"\u27FC",LongRightArrow:"\u27F6",Longrightarrow:"\u27F9",longrightarrow:"\u27F6",looparrowleft:"\u21AB",looparrowright:"\u21AC",lopar:"\u2985",Lopf:"\u{1D543}",lopf:"\u{1D55D}",loplus:"\u2A2D",lotimes:"\u2A34",lowast:"\u2217",lowbar:"_",LowerLeftArrow:"\u2199",LowerRightArrow:"\u2198",loz:"\u25CA",lozenge:"\u25CA",lozf:"\u29EB",lpar:"(",lparlt:"\u2993",lrarr:"\u21C6",lrcorner:"\u231F",lrhar:"\u21CB",lrhard:"\u296D",lrm:"\u200E",lrtri:"\u22BF",lsaquo:"\u2039",Lscr:"\u2112",lscr:"\u{1D4C1}",Lsh:"\u21B0",lsh:"\u21B0",lsim:"\u2272",lsime:"\u2A8D",lsimg:"\u2A8F",lsqb:"[",lsquo:"\u2018",lsquor:"\u201A",Lstrok:"\u0141",lstrok:"\u0142",Lt:"\u226A",LT:"<",lt:"<",ltcc:"\u2AA6",ltcir:"\u2A79",ltdot:"\u22D6",lthree:"\u22CB",ltimes:"\u22C9",ltlarr:"\u2976",ltquest:"\u2A7B",ltri:"\u25C3",ltrie:"\u22B4",ltrif:"\u25C2",ltrPar:"\u2996",lurdshar:"\u294A",luruhar:"\u2966",lvertneqq:"\u2268\uFE00",lvnE:"\u2268\uFE00",macr:"\xAF",male:"\u2642",malt:"\u2720",maltese:"\u2720",Map:"\u2905",map:"\u21A6",mapsto:"\u21A6",mapstodown:"\u21A7",mapstoleft:"\u21A4",mapstoup:"\u21A5",marker:"\u25AE",mcomma:"\u2A29",Mcy:"\u041C",mcy:"\u043C",mdash:"\u2014",mDDot:"\u223A",measuredangle:"\u2221",MediumSpace:"\u205F",Mellintrf:"\u2133",Mfr:"\u{1D510}",mfr:"\u{1D52A}",mho:"\u2127",micro:"\xB5",mid:"\u2223",midast:"*",midcir:"\u2AF0",middot:"\xB7",minus:"\u2212",minusb:"\u229F",minusd:"\u2238",minusdu:"\u2A2A",MinusPlus:"\u2213",mlcp:"\u2ADB",mldr:"\u2026",mnplus:"\u2213",models:"\u22A7",Mopf:"\u{1D544}",mopf:"\u{1D55E}",mp:"\u2213",Mscr:"\u2133",mscr:"\u{1D4C2}",mstpos:"\u223E",Mu:"\u039C",mu:"\u03BC",multimap:"\u22B8",mumap:"\u22B8",nabla:"\u2207",Nacute:"\u0143",nacute:"\u0144",nang:"\u2220\u20D2",nap:"\u2249",napE:"\u2A70\u0338",napid:"\u224B\u0338",napos:"\u0149",napprox:"\u2249",natur:"\u266E",natural:"\u266E",naturals:"\u2115",nbsp:"\xA0",nbump:"\u224E\u0338",nbumpe:"\u224F\u0338",ncap:"\u2A43",Ncaron:"\u0147",ncaron:"\u0148",Ncedil:"\u0145",ncedil:"\u0146",ncong:"\u2247",ncongdot:"\u2A6D\u0338",ncup:"\u2A42",Ncy:"\u041D",ncy:"\u043D",ndash:"\u2013",ne:"\u2260",nearhk:"\u2924",neArr:"\u21D7",nearr:"\u2197",nearrow:"\u2197",nedot:"\u2250\u0338",NegativeMediumSpace:"\u200B",NegativeThickSpace:"\u200B",NegativeThinSpace:"\u200B",NegativeVeryThinSpace:"\u200B",nequiv:"\u2262",nesear:"\u2928",nesim:"\u2242\u0338",NestedGreaterGreater:"\u226B",NestedLessLess:"\u226A",NewLine:`
-`,nexist:"\u2204",nexists:"\u2204",Nfr:"\u{1D511}",nfr:"\u{1D52B}",ngE:"\u2267\u0338",nge:"\u2271",ngeq:"\u2271",ngeqq:"\u2267\u0338",ngeqslant:"\u2A7E\u0338",nges:"\u2A7E\u0338",nGg:"\u22D9\u0338",ngsim:"\u2275",nGt:"\u226B\u20D2",ngt:"\u226F",ngtr:"\u226F",nGtv:"\u226B\u0338",nhArr:"\u21CE",nharr:"\u21AE",nhpar:"\u2AF2",ni:"\u220B",nis:"\u22FC",nisd:"\u22FA",niv:"\u220B",NJcy:"\u040A",njcy:"\u045A",nlArr:"\u21CD",nlarr:"\u219A",nldr:"\u2025",nlE:"\u2266\u0338",nle:"\u2270",nLeftarrow:"\u21CD",nleftarrow:"\u219A",nLeftrightarrow:"\u21CE",nleftrightarrow:"\u21AE",nleq:"\u2270",nleqq:"\u2266\u0338",nleqslant:"\u2A7D\u0338",nles:"\u2A7D\u0338",nless:"\u226E",nLl:"\u22D8\u0338",nlsim:"\u2274",nLt:"\u226A\u20D2",nlt:"\u226E",nltri:"\u22EA",nltrie:"\u22EC",nLtv:"\u226A\u0338",nmid:"\u2224",NoBreak:"\u2060",NonBreakingSpace:"\xA0",Nopf:"\u2115",nopf:"\u{1D55F}",Not:"\u2AEC",not:"\xAC",NotCongruent:"\u2262",NotCupCap:"\u226D",NotDoubleVerticalBar:"\u2226",NotElement:"\u2209",NotEqual:"\u2260",NotEqualTilde:"\u2242\u0338",NotExists:"\u2204",NotGreater:"\u226F",NotGreaterEqual:"\u2271",NotGreaterFullEqual:"\u2267\u0338",NotGreaterGreater:"\u226B\u0338",NotGreaterLess:"\u2279",NotGreaterSlantEqual:"\u2A7E\u0338",NotGreaterTilde:"\u2275",NotHumpDownHump:"\u224E\u0338",NotHumpEqual:"\u224F\u0338",notin:"\u2209",notindot:"\u22F5\u0338",notinE:"\u22F9\u0338",notinva:"\u2209",notinvb:"\u22F7",notinvc:"\u22F6",NotLeftTriangle:"\u22EA",NotLeftTriangleBar:"\u29CF\u0338",NotLeftTriangleEqual:"\u22EC",NotLess:"\u226E",NotLessEqual:"\u2270",NotLessGreater:"\u2278",NotLessLess:"\u226A\u0338",NotLessSlantEqual:"\u2A7D\u0338",NotLessTilde:"\u2274",NotNestedGreaterGreater:"\u2AA2\u0338",NotNestedLessLess:"\u2AA1\u0338",notni:"\u220C",notniva:"\u220C",notnivb:"\u22FE",notnivc:"\u22FD",NotPrecedes:"\u2280",NotPrecedesEqual:"\u2AAF\u0338",NotPrecedesSlantEqual:"\u22E0",NotReverseElement:"\u220C",NotRightTriangle:"\u22EB",NotRightTriangleBar:"\u29D0\u0338",NotRightTriangleEqual:"\u22ED",NotSquareSubset:"\u228F\u0338",NotSquareSubsetEqual:"\u22E2",NotSquareSuperset:"\u2290\u0338",NotSquareSupersetEqual:"\u22E3",NotSubset:"\u2282\u20D2",NotSubsetEqual:"\u2288",NotSucceeds:"\u2281",NotSucceedsEqual:"\u2AB0\u0338",NotSucceedsSlantEqual:"\u22E1",NotSucceedsTilde:"\u227F\u0338",NotSuperset:"\u2283\u20D2",NotSupersetEqual:"\u2289",NotTilde:"\u2241",NotTildeEqual:"\u2244",NotTildeFullEqual:"\u2247",NotTildeTilde:"\u2249",NotVerticalBar:"\u2224",npar:"\u2226",nparallel:"\u2226",nparsl:"\u2AFD\u20E5",npart:"\u2202\u0338",npolint:"\u2A14",npr:"\u2280",nprcue:"\u22E0",npre:"\u2AAF\u0338",nprec:"\u2280",npreceq:"\u2AAF\u0338",nrArr:"\u21CF",nrarr:"\u219B",nrarrc:"\u2933\u0338",nrarrw:"\u219D\u0338",nRightarrow:"\u21CF",nrightarrow:"\u219B",nrtri:"\u22EB",nrtrie:"\u22ED",nsc:"\u2281",nsccue:"\u22E1",nsce:"\u2AB0\u0338",Nscr:"\u{1D4A9}",nscr:"\u{1D4C3}",nshortmid:"\u2224",nshortparallel:"\u2226",nsim:"\u2241",nsime:"\u2244",nsimeq:"\u2244",nsmid:"\u2224",nspar:"\u2226",nsqsube:"\u22E2",nsqsupe:"\u22E3",nsub:"\u2284",nsubE:"\u2AC5\u0338",nsube:"\u2288",nsubset:"\u2282\u20D2",nsubseteq:"\u2288",nsubseteqq:"\u2AC5\u0338",nsucc:"\u2281",nsucceq:"\u2AB0\u0338",nsup:"\u2285",nsupE:"\u2AC6\u0338",nsupe:"\u2289",nsupset:"\u2283\u20D2",nsupseteq:"\u2289",nsupseteqq:"\u2AC6\u0338",ntgl:"\u2279",Ntilde:"\xD1",ntilde:"\xF1",ntlg:"\u2278",ntriangleleft:"\u22EA",ntrianglelefteq:"\u22EC",ntriangleright:"\u22EB",ntrianglerighteq:"\u22ED",Nu:"\u039D",nu:"\u03BD",num:"#",numero:"\u2116",numsp:"\u2007",nvap:"\u224D\u20D2",nVDash:"\u22AF",nVdash:"\u22AE",nvDash:"\u22AD",nvdash:"\u22AC",nvge:"\u2265\u20D2",nvgt:">\u20D2",nvHarr:"\u2904",nvinfin:"\u29DE",nvlArr:"\u2902",nvle:"\u2264\u20D2",nvlt:"<\u20D2",nvltrie:"\u22B4\u20D2",nvrArr:"\u2903",nvrtrie:"\u22B5\u20D2",nvsim:"\u223C\u20D2",nwarhk:"\u2923",nwArr:"\u21D6",nwarr:"\u2196",nwarrow:"\u2196",nwnear:"\u2927",Oacute:"\xD3",oacute:"\xF3",oast:"\u229B",ocir:"\u229A",Ocirc:"\xD4",ocirc:"\xF4",Ocy:"\u041E",ocy:"\u043E",odash:"\u229D",Odblac:"\u0150",odblac:"\u0151",odiv:"\u2A38",odot:"\u2299",odsold:"\u29BC",OElig:"\u0152",oelig:"\u0153",ofcir:"\u29BF",Ofr:"\u{1D512}",ofr:"\u{1D52C}",ogon:"\u02DB",Ograve:"\xD2",ograve:"\xF2",ogt:"\u29C1",ohbar:"\u29B5",ohm:"\u03A9",oint:"\u222E",olarr:"\u21BA",olcir:"\u29BE",olcross:"\u29BB",oline:"\u203E",olt:"\u29C0",Omacr:"\u014C",omacr:"\u014D",Omega:"\u03A9",omega:"\u03C9",Omicron:"\u039F",omicron:"\u03BF",omid:"\u29B6",ominus:"\u2296",Oopf:"\u{1D546}",oopf:"\u{1D560}",opar:"\u29B7",OpenCurlyDoubleQuote:"\u201C",OpenCurlyQuote:"\u2018",operp:"\u29B9",oplus:"\u2295",Or:"\u2A54",or:"\u2228",orarr:"\u21BB",ord:"\u2A5D",order:"\u2134",orderof:"\u2134",ordf:"\xAA",ordm:"\xBA",origof:"\u22B6",oror:"\u2A56",orslope:"\u2A57",orv:"\u2A5B",oS:"\u24C8",Oscr:"\u{1D4AA}",oscr:"\u2134",Oslash:"\xD8",oslash:"\xF8",osol:"\u2298",Otilde:"\xD5",otilde:"\xF5",Otimes:"\u2A37",otimes:"\u2297",otimesas:"\u2A36",Ouml:"\xD6",ouml:"\xF6",ovbar:"\u233D",OverBar:"\u203E",OverBrace:"\u23DE",OverBracket:"\u23B4",OverParenthesis:"\u23DC",par:"\u2225",para:"\xB6",parallel:"\u2225",parsim:"\u2AF3",parsl:"\u2AFD",part:"\u2202",PartialD:"\u2202",Pcy:"\u041F",pcy:"\u043F",percnt:"%",period:".",permil:"\u2030",perp:"\u22A5",pertenk:"\u2031",Pfr:"\u{1D513}",pfr:"\u{1D52D}",Phi:"\u03A6",phi:"\u03C6",phiv:"\u03D5",phmmat:"\u2133",phone:"\u260E",Pi:"\u03A0",pi:"\u03C0",pitchfork:"\u22D4",piv:"\u03D6",planck:"\u210F",planckh:"\u210E",plankv:"\u210F",plus:"+",plusacir:"\u2A23",plusb:"\u229E",pluscir:"\u2A22",plusdo:"\u2214",plusdu:"\u2A25",pluse:"\u2A72",PlusMinus:"\xB1",plusmn:"\xB1",plussim:"\u2A26",plustwo:"\u2A27",pm:"\xB1",Poincareplane:"\u210C",pointint:"\u2A15",Popf:"\u2119",popf:"\u{1D561}",pound:"\xA3",Pr:"\u2ABB",pr:"\u227A",prap:"\u2AB7",prcue:"\u227C",prE:"\u2AB3",pre:"\u2AAF",prec:"\u227A",precapprox:"\u2AB7",preccurlyeq:"\u227C",Precedes:"\u227A",PrecedesEqual:"\u2AAF",PrecedesSlantEqual:"\u227C",PrecedesTilde:"\u227E",preceq:"\u2AAF",precnapprox:"\u2AB9",precneqq:"\u2AB5",precnsim:"\u22E8",precsim:"\u227E",Prime:"\u2033",prime:"\u2032",primes:"\u2119",prnap:"\u2AB9",prnE:"\u2AB5",prnsim:"\u22E8",prod:"\u220F",Product:"\u220F",profalar:"\u232E",profline:"\u2312",profsurf:"\u2313",prop:"\u221D",Proportion:"\u2237",Proportional:"\u221D",propto:"\u221D",prsim:"\u227E",prurel:"\u22B0",Pscr:"\u{1D4AB}",pscr:"\u{1D4C5}",Psi:"\u03A8",psi:"\u03C8",puncsp:"\u2008",Qfr:"\u{1D514}",qfr:"\u{1D52E}",qint:"\u2A0C",Qopf:"\u211A",qopf:"\u{1D562}",qprime:"\u2057",Qscr:"\u{1D4AC}",qscr:"\u{1D4C6}",quaternions:"\u210D",quatint:"\u2A16",quest:"?",questeq:"\u225F",QUOT:'"',quot:'"',rAarr:"\u21DB",race:"\u223D\u0331",Racute:"\u0154",racute:"\u0155",radic:"\u221A",raemptyv:"\u29B3",Rang:"\u27EB",rang:"\u27E9",rangd:"\u2992",range:"\u29A5",rangle:"\u27E9",raquo:"\xBB",Rarr:"\u21A0",rArr:"\u21D2",rarr:"\u2192",rarrap:"\u2975",rarrb:"\u21E5",rarrbfs:"\u2920",rarrc:"\u2933",rarrfs:"\u291E",rarrhk:"\u21AA",rarrlp:"\u21AC",rarrpl:"\u2945",rarrsim:"\u2974",Rarrtl:"\u2916",rarrtl:"\u21A3",rarrw:"\u219D",rAtail:"\u291C",ratail:"\u291A",ratio:"\u2236",rationals:"\u211A",RBarr:"\u2910",rBarr:"\u290F",rbarr:"\u290D",rbbrk:"\u2773",rbrace:"}",rbrack:"]",rbrke:"\u298C",rbrksld:"\u298E",rbrkslu:"\u2990",Rcaron:"\u0158",rcaron:"\u0159",Rcedil:"\u0156",rcedil:"\u0157",rceil:"\u2309",rcub:"}",Rcy:"\u0420",rcy:"\u0440",rdca:"\u2937",rdldhar:"\u2969",rdquo:"\u201D",rdquor:"\u201D",rdsh:"\u21B3",Re:"\u211C",real:"\u211C",realine:"\u211B",realpart:"\u211C",reals:"\u211D",rect:"\u25AD",REG:"\xAE",reg:"\xAE",ReverseElement:"\u220B",ReverseEquilibrium:"\u21CB",ReverseUpEquilibrium:"\u296F",rfisht:"\u297D",rfloor:"\u230B",Rfr:"\u211C",rfr:"\u{1D52F}",rHar:"\u2964",rhard:"\u21C1",rharu:"\u21C0",rharul:"\u296C",Rho:"\u03A1",rho:"\u03C1",rhov:"\u03F1",RightAngleBracket:"\u27E9",RightArrow:"\u2192",Rightarrow:"\u21D2",rightarrow:"\u2192",RightArrowBar:"\u21E5",RightArrowLeftArrow:"\u21C4",rightarrowtail:"\u21A3",RightCeiling:"\u2309",RightDoubleBracket:"\u27E7",RightDownTeeVector:"\u295D",RightDownVector:"\u21C2",RightDownVectorBar:"\u2955",RightFloor:"\u230B",rightharpoondown:"\u21C1",rightharpoonup:"\u21C0",rightleftarrows:"\u21C4",rightleftharpoons:"\u21CC",rightrightarrows:"\u21C9",rightsquigarrow:"\u219D",RightTee:"\u22A2",RightTeeArrow:"\u21A6",RightTeeVector:"\u295B",rightthreetimes:"\u22CC",RightTriangle:"\u22B3",RightTriangleBar:"\u29D0",RightTriangleEqual:"\u22B5",RightUpDownVector:"\u294F",RightUpTeeVector:"\u295C",RightUpVector:"\u21BE",RightUpVectorBar:"\u2954",RightVector:"\u21C0",RightVectorBar:"\u2953",ring:"\u02DA",risingdotseq:"\u2253",rlarr:"\u21C4",rlhar:"\u21CC",rlm:"\u200F",rmoust:"\u23B1",rmoustache:"\u23B1",rnmid:"\u2AEE",roang:"\u27ED",roarr:"\u21FE",robrk:"\u27E7",ropar:"\u2986",Ropf:"\u211D",ropf:"\u{1D563}",roplus:"\u2A2E",rotimes:"\u2A35",RoundImplies:"\u2970",rpar:")",rpargt:"\u2994",rppolint:"\u2A12",rrarr:"\u21C9",Rrightarrow:"\u21DB",rsaquo:"\u203A",Rscr:"\u211B",rscr:"\u{1D4C7}",Rsh:"\u21B1",rsh:"\u21B1",rsqb:"]",rsquo:"\u2019",rsquor:"\u2019",rthree:"\u22CC",rtimes:"\u22CA",rtri:"\u25B9",rtrie:"\u22B5",rtrif:"\u25B8",rtriltri:"\u29CE",RuleDelayed:"\u29F4",ruluhar:"\u2968",rx:"\u211E",Sacute:"\u015A",sacute:"\u015B",sbquo:"\u201A",Sc:"\u2ABC",sc:"\u227B",scap:"\u2AB8",Scaron:"\u0160",scaron:"\u0161",sccue:"\u227D",scE:"\u2AB4",sce:"\u2AB0",Scedil:"\u015E",scedil:"\u015F",Scirc:"\u015C",scirc:"\u015D",scnap:"\u2ABA",scnE:"\u2AB6",scnsim:"\u22E9",scpolint:"\u2A13",scsim:"\u227F",Scy:"\u0421",scy:"\u0441",sdot:"\u22C5",sdotb:"\u22A1",sdote:"\u2A66",searhk:"\u2925",seArr:"\u21D8",searr:"\u2198",searrow:"\u2198",sect:"\xA7",semi:";",seswar:"\u2929",setminus:"\u2216",setmn:"\u2216",sext:"\u2736",Sfr:"\u{1D516}",sfr:"\u{1D530}",sfrown:"\u2322",sharp:"\u266F",SHCHcy:"\u0429",shchcy:"\u0449",SHcy:"\u0428",shcy:"\u0448",ShortDownArrow:"\u2193",ShortLeftArrow:"\u2190",shortmid:"\u2223",shortparallel:"\u2225",ShortRightArrow:"\u2192",ShortUpArrow:"\u2191",shy:"\xAD",Sigma:"\u03A3",sigma:"\u03C3",sigmaf:"\u03C2",sigmav:"\u03C2",sim:"\u223C",simdot:"\u2A6A",sime:"\u2243",simeq:"\u2243",simg:"\u2A9E",simgE:"\u2AA0",siml:"\u2A9D",simlE:"\u2A9F",simne:"\u2246",simplus:"\u2A24",simrarr:"\u2972",slarr:"\u2190",SmallCircle:"\u2218",smallsetminus:"\u2216",smashp:"\u2A33",smeparsl:"\u29E4",smid:"\u2223",smile:"\u2323",smt:"\u2AAA",smte:"\u2AAC",smtes:"\u2AAC\uFE00",SOFTcy:"\u042C",softcy:"\u044C",sol:"/",solb:"\u29C4",solbar:"\u233F",Sopf:"\u{1D54A}",sopf:"\u{1D564}",spades:"\u2660",spadesuit:"\u2660",spar:"\u2225",sqcap:"\u2293",sqcaps:"\u2293\uFE00",sqcup:"\u2294",sqcups:"\u2294\uFE00",Sqrt:"\u221A",sqsub:"\u228F",sqsube:"\u2291",sqsubset:"\u228F",sqsubseteq:"\u2291",sqsup:"\u2290",sqsupe:"\u2292",sqsupset:"\u2290",sqsupseteq:"\u2292",squ:"\u25A1",Square:"\u25A1",square:"\u25A1",SquareIntersection:"\u2293",SquareSubset:"\u228F",SquareSubsetEqual:"\u2291",SquareSuperset:"\u2290",SquareSupersetEqual:"\u2292",SquareUnion:"\u2294",squarf:"\u25AA",squf:"\u25AA",srarr:"\u2192",Sscr:"\u{1D4AE}",sscr:"\u{1D4C8}",ssetmn:"\u2216",ssmile:"\u2323",sstarf:"\u22C6",Star:"\u22C6",star:"\u2606",starf:"\u2605",straightepsilon:"\u03F5",straightphi:"\u03D5",strns:"\xAF",Sub:"\u22D0",sub:"\u2282",subdot:"\u2ABD",subE:"\u2AC5",sube:"\u2286",subedot:"\u2AC3",submult:"\u2AC1",subnE:"\u2ACB",subne:"\u228A",subplus:"\u2ABF",subrarr:"\u2979",Subset:"\u22D0",subset:"\u2282",subseteq:"\u2286",subseteqq:"\u2AC5",SubsetEqual:"\u2286",subsetneq:"\u228A",subsetneqq:"\u2ACB",subsim:"\u2AC7",subsub:"\u2AD5",subsup:"\u2AD3",succ:"\u227B",succapprox:"\u2AB8",succcurlyeq:"\u227D",Succeeds:"\u227B",SucceedsEqual:"\u2AB0",SucceedsSlantEqual:"\u227D",SucceedsTilde:"\u227F",succeq:"\u2AB0",succnapprox:"\u2ABA",succneqq:"\u2AB6",succnsim:"\u22E9",succsim:"\u227F",SuchThat:"\u220B",Sum:"\u2211",sum:"\u2211",sung:"\u266A",Sup:"\u22D1",sup:"\u2283",sup1:"\xB9",sup2:"\xB2",sup3:"\xB3",supdot:"\u2ABE",supdsub:"\u2AD8",supE:"\u2AC6",supe:"\u2287",supedot:"\u2AC4",Superset:"\u2283",SupersetEqual:"\u2287",suphsol:"\u27C9",suphsub:"\u2AD7",suplarr:"\u297B",supmult:"\u2AC2",supnE:"\u2ACC",supne:"\u228B",supplus:"\u2AC0",Supset:"\u22D1",supset:"\u2283",supseteq:"\u2287",supseteqq:"\u2AC6",supsetneq:"\u228B",supsetneqq:"\u2ACC",supsim:"\u2AC8",supsub:"\u2AD4",supsup:"\u2AD6",swarhk:"\u2926",swArr:"\u21D9",swarr:"\u2199",swarrow:"\u2199",swnwar:"\u292A",szlig:"\xDF",Tab:" ",target:"\u2316",Tau:"\u03A4",tau:"\u03C4",tbrk:"\u23B4",Tcaron:"\u0164",tcaron:"\u0165",Tcedil:"\u0162",tcedil:"\u0163",Tcy:"\u0422",tcy:"\u0442",tdot:"\u20DB",telrec:"\u2315",Tfr:"\u{1D517}",tfr:"\u{1D531}",there4:"\u2234",Therefore:"\u2234",therefore:"\u2234",Theta:"\u0398",theta:"\u03B8",thetasym:"\u03D1",thetav:"\u03D1",thickapprox:"\u2248",thicksim:"\u223C",ThickSpace:"\u205F\u200A",thinsp:"\u2009",ThinSpace:"\u2009",thkap:"\u2248",thksim:"\u223C",THORN:"\xDE",thorn:"\xFE",Tilde:"\u223C",tilde:"\u02DC",TildeEqual:"\u2243",TildeFullEqual:"\u2245",TildeTilde:"\u2248",times:"\xD7",timesb:"\u22A0",timesbar:"\u2A31",timesd:"\u2A30",tint:"\u222D",toea:"\u2928",top:"\u22A4",topbot:"\u2336",topcir:"\u2AF1",Topf:"\u{1D54B}",topf:"\u{1D565}",topfork:"\u2ADA",tosa:"\u2929",tprime:"\u2034",TRADE:"\u2122",trade:"\u2122",triangle:"\u25B5",triangledown:"\u25BF",triangleleft:"\u25C3",trianglelefteq:"\u22B4",triangleq:"\u225C",triangleright:"\u25B9",trianglerighteq:"\u22B5",tridot:"\u25EC",trie:"\u225C",triminus:"\u2A3A",TripleDot:"\u20DB",triplus:"\u2A39",trisb:"\u29CD",tritime:"\u2A3B",trpezium:"\u23E2",Tscr:"\u{1D4AF}",tscr:"\u{1D4C9}",TScy:"\u0426",tscy:"\u0446",TSHcy:"\u040B",tshcy:"\u045B",Tstrok:"\u0166",tstrok:"\u0167",twixt:"\u226C",twoheadleftarrow:"\u219E",twoheadrightarrow:"\u21A0",Uacute:"\xDA",uacute:"\xFA",Uarr:"\u219F",uArr:"\u21D1",uarr:"\u2191",Uarrocir:"\u2949",Ubrcy:"\u040E",ubrcy:"\u045E",Ubreve:"\u016C",ubreve:"\u016D",Ucirc:"\xDB",ucirc:"\xFB",Ucy:"\u0423",ucy:"\u0443",udarr:"\u21C5",Udblac:"\u0170",udblac:"\u0171",udhar:"\u296E",ufisht:"\u297E",Ufr:"\u{1D518}",ufr:"\u{1D532}",Ugrave:"\xD9",ugrave:"\xF9",uHar:"\u2963",uharl:"\u21BF",uharr:"\u21BE",uhblk:"\u2580",ulcorn:"\u231C",ulcorner:"\u231C",ulcrop:"\u230F",ultri:"\u25F8",Umacr:"\u016A",umacr:"\u016B",uml:"\xA8",UnderBar:"_",UnderBrace:"\u23DF",UnderBracket:"\u23B5",UnderParenthesis:"\u23DD",Union:"\u22C3",UnionPlus:"\u228E",Uogon:"\u0172",uogon:"\u0173",Uopf:"\u{1D54C}",uopf:"\u{1D566}",UpArrow:"\u2191",Uparrow:"\u21D1",uparrow:"\u2191",UpArrowBar:"\u2912",UpArrowDownArrow:"\u21C5",UpDownArrow:"\u2195",Updownarrow:"\u21D5",updownarrow:"\u2195",UpEquilibrium:"\u296E",upharpoonleft:"\u21BF",upharpoonright:"\u21BE",uplus:"\u228E",UpperLeftArrow:"\u2196",UpperRightArrow:"\u2197",Upsi:"\u03D2",upsi:"\u03C5",upsih:"\u03D2",Upsilon:"\u03A5",upsilon:"\u03C5",UpTee:"\u22A5",UpTeeArrow:"\u21A5",upuparrows:"\u21C8",urcorn:"\u231D",urcorner:"\u231D",urcrop:"\u230E",Uring:"\u016E",uring:"\u016F",urtri:"\u25F9",Uscr:"\u{1D4B0}",uscr:"\u{1D4CA}",utdot:"\u22F0",Utilde:"\u0168",utilde:"\u0169",utri:"\u25B5",utrif:"\u25B4",uuarr:"\u21C8",Uuml:"\xDC",uuml:"\xFC",uwangle:"\u29A7",vangrt:"\u299C",varepsilon:"\u03F5",varkappa:"\u03F0",varnothing:"\u2205",varphi:"\u03D5",varpi:"\u03D6",varpropto:"\u221D",vArr:"\u21D5",varr:"\u2195",varrho:"\u03F1",varsigma:"\u03C2",varsubsetneq:"\u228A\uFE00",varsubsetneqq:"\u2ACB\uFE00",varsupsetneq:"\u228B\uFE00",varsupsetneqq:"\u2ACC\uFE00",vartheta:"\u03D1",vartriangleleft:"\u22B2",vartriangleright:"\u22B3",Vbar:"\u2AEB",vBar:"\u2AE8",vBarv:"\u2AE9",Vcy:"\u0412",vcy:"\u0432",VDash:"\u22AB",Vdash:"\u22A9",vDash:"\u22A8",vdash:"\u22A2",Vdashl:"\u2AE6",Vee:"\u22C1",vee:"\u2228",veebar:"\u22BB",veeeq:"\u225A",vellip:"\u22EE",Verbar:"\u2016",verbar:"|",Vert:"\u2016",vert:"|",VerticalBar:"\u2223",VerticalLine:"|",VerticalSeparator:"\u2758",VerticalTilde:"\u2240",VeryThinSpace:"\u200A",Vfr:"\u{1D519}",vfr:"\u{1D533}",vltri:"\u22B2",vnsub:"\u2282\u20D2",vnsup:"\u2283\u20D2",Vopf:"\u{1D54D}",vopf:"\u{1D567}",vprop:"\u221D",vrtri:"\u22B3",Vscr:"\u{1D4B1}",vscr:"\u{1D4CB}",vsubnE:"\u2ACB\uFE00",vsubne:"\u228A\uFE00",vsupnE:"\u2ACC\uFE00",vsupne:"\u228B\uFE00",Vvdash:"\u22AA",vzigzag:"\u299A",Wcirc:"\u0174",wcirc:"\u0175",wedbar:"\u2A5F",Wedge:"\u22C0",wedge:"\u2227",wedgeq:"\u2259",weierp:"\u2118",Wfr:"\u{1D51A}",wfr:"\u{1D534}",Wopf:"\u{1D54E}",wopf:"\u{1D568}",wp:"\u2118",wr:"\u2240",wreath:"\u2240",Wscr:"\u{1D4B2}",wscr:"\u{1D4CC}",xcap:"\u22C2",xcirc:"\u25EF",xcup:"\u22C3",xdtri:"\u25BD",Xfr:"\u{1D51B}",xfr:"\u{1D535}",xhArr:"\u27FA",xharr:"\u27F7",Xi:"\u039E",xi:"\u03BE",xlArr:"\u27F8",xlarr:"\u27F5",xmap:"\u27FC",xnis:"\u22FB",xodot:"\u2A00",Xopf:"\u{1D54F}",xopf:"\u{1D569}",xoplus:"\u2A01",xotime:"\u2A02",xrArr:"\u27F9",xrarr:"\u27F6",Xscr:"\u{1D4B3}",xscr:"\u{1D4CD}",xsqcup:"\u2A06",xuplus:"\u2A04",xutri:"\u25B3",xvee:"\u22C1",xwedge:"\u22C0",Yacute:"\xDD",yacute:"\xFD",YAcy:"\u042F",yacy:"\u044F",Ycirc:"\u0176",ycirc:"\u0177",Ycy:"\u042B",ycy:"\u044B",yen:"\xA5",Yfr:"\u{1D51C}",yfr:"\u{1D536}",YIcy:"\u0407",yicy:"\u0457",Yopf:"\u{1D550}",yopf:"\u{1D56A}",Yscr:"\u{1D4B4}",yscr:"\u{1D4CE}",YUcy:"\u042E",yucy:"\u044E",Yuml:"\u0178",yuml:"\xFF",Zacute:"\u0179",zacute:"\u017A",Zcaron:"\u017D",zcaron:"\u017E",Zcy:"\u0417",zcy:"\u0437",Zdot:"\u017B",zdot:"\u017C",zeetrf:"\u2128",ZeroWidthSpace:"\u200B",Zeta:"\u0396",zeta:"\u03B6",Zfr:"\u2128",zfr:"\u{1D537}",ZHcy:"\u0416",zhcy:"\u0436",zigrarr:"\u21DD",Zopf:"\u2124",zopf:"\u{1D56B}",Zscr:"\u{1D4B5}",zscr:"\u{1D4CF}",zwj:"\u200D",zwnj:"\u200C"}),c.entityMap=c.HTML_ENTITIES}),"./node_modules/@xmldom/xmldom/lib/index.js":(function(a,c,e){var t=e("./node_modules/@xmldom/xmldom/lib/dom.js");c.DOMImplementation=t.DOMImplementation,c.XMLSerializer=t.XMLSerializer,c.DOMParser=e("./node_modules/@xmldom/xmldom/lib/dom-parser.js").DOMParser}),"./node_modules/@xmldom/xmldom/lib/sax.js":(function(a,c,e){var t=e("./node_modules/@xmldom/xmldom/lib/conventions.js").NAMESPACE,i=/[A-Z_a-z\xC0-\xD6\xD8-\xF6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/,s=new RegExp("[\\-\\.0-9"+i.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]"),l=new RegExp("^"+i.source+s.source+"*(?::"+i.source+s.source+"*)?$"),d=0,w=1,v=2,S=3,x=4,k=5,N=6,R=7;function F(C,L){this.message=C,this.locator=L,Error.captureStackTrace&&Error.captureStackTrace(this,F)}F.prototype=new Error,F.prototype.name=F.name;function j(){}j.prototype={parse:function(C,L,D){var z=this.domBuilder;z.startDocument(),p(L,L={}),M(C,L,D,z,this.errorHandler),z.endDocument()}};function M(C,L,D,z,G){function Z(V){if(V>65535){V-=65536;var T=55296+(V>>10),U=56320+(V&1023);return String.fromCharCode(T,U)}else return String.fromCharCode(V)}function re(V){var T=V.slice(1,-1);return Object.hasOwnProperty.call(D,T)?D[T]:T.charAt(0)==="#"?Z(parseInt(T.substr(1).replace("x","0x"))):(G.error("entity not found:"+V),V)}function $(V){if(V>ee){var T=C.substring(ee,V).replace(/?\w+;/g,re);ne&&K(ee),z.characters(T,0,V-ee),ee=V}}function K(V,T){for(;V>=ie&&(T=ge.exec(C));)oe=T.index,ie=oe+T[0].length,ne.lineNumber++;ne.columnNumber=V-oe+1}for(var oe=0,ie=0,ge=/.*(?:\r\n?|\n)|.*$/g,ne=z.locator,Q=[{currentNSMap:L}],ue={},ee=0;;){try{var te=C.indexOf("<",ee);if(te<0){if(!C.substr(ee).match(/^\s*$/)){var de=z.doc,ae=de.createTextNode(C.substr(ee));de.appendChild(ae),z.currentElement=ae}return}switch(te>ee&&$(te),C.charAt(te+1)){case"/":var Re=C.indexOf(">",te+3),le=C.substring(te+2,Re).replace(/[ \t\n\r]+$/g,""),me=Q.pop();Re<0?(le=C.substring(te+2).replace(/[\s<].*/,""),G.error("end tag name: "+le+" is not complete:"+me.tagName),Re=te+1+le.length):le.match(/\s)&&(le=le.replace(/[\s<].*/,""),G.error("end tag name: "+le+" maybe not complete"),Re=te+1+le.length);var fe=me.localNSMap,De=me.tagName==le,Ce=De||me.tagName&&me.tagName.toLowerCase()==le.toLowerCase();if(Ce){if(z.endElement(me.uri,me.localName,le),fe)for(var ye in fe)Object.prototype.hasOwnProperty.call(fe,ye)&&z.endPrefixMapping(ye);De||G.fatalError("end tag name: "+le+" is not match the current start tagName:"+me.tagName)}else Q.push(me);Re++;break;case"?":ne&&K(te),Re=y(C,te,z);break;case"!":ne&&K(te),Re=f(C,te,z,G);break;default:ne&&K(te);var Fe=new g,Ue=Q[Q.length-1].currentNSMap,Re=_(C,te,Fe,Ue,re,G),it=Fe.length;if(!Fe.closed&&I(C,Re,Fe.tagName,ue)&&(Fe.closed=!0,D.nbsp||G.warning("unclosed xml attribute")),ne&&it){for(var Je=J(ne,{}),We=0;Weee?ee=Re:$(Math.max(te,ee)+1)}}function J(C,L){return L.lineNumber=C.lineNumber,L.columnNumber=C.columnNumber,L}function _(C,L,D,z,G,Z){function re(Q,ue,ee){D.attributeNames.hasOwnProperty(Q)&&Z.fatalError("Attribute "+Q+" redefined"),D.addValue(Q,ue.replace(/[\t\n\r]/g," ").replace(/?\w+;/g,G),ee)}for(var $,K,oe=++L,ie=d;;){var ge=C.charAt(oe);switch(ge){case"=":if(ie===w)$=C.slice(L,oe),ie=S;else if(ie===v)ie=S;else throw new Error("attribute equal must after attrName");break;case"'":case'"':if(ie===S||ie===w)if(ie===w&&(Z.warning('attribute value must after "="'),$=C.slice(L,oe)),L=oe+1,oe=C.indexOf(ge,L),oe>0)K=C.slice(L,oe),re($,K,L-1),ie=k;else throw new Error("attribute value no end '"+ge+"' match");else if(ie==x)K=C.slice(L,oe),re($,K,L),Z.warning('attribute "'+$+'" missed start quot('+ge+")!!"),L=oe+1,ie=k;else throw new Error('attribute value must after "="');break;case"/":switch(ie){case d:D.setTagName(C.slice(L,oe));case k:case N:case R:ie=R,D.closed=!0;case x:case w:break;case v:D.closed=!0;break;default:throw new Error("attribute invalid close char('/')")}break;case"":return Z.error("unexpected end of input"),ie==d&&D.setTagName(C.slice(L,oe)),oe;case">":switch(ie){case d:D.setTagName(C.slice(L,oe));case k:case N:case R:break;case x:case w:K=C.slice(L,oe),K.slice(-1)==="/"&&(D.closed=!0,K=K.slice(0,-1));case v:ie===v&&(K=$),ie==x?(Z.warning('attribute "'+K+'" missed quot(")!'),re($,K,L)):((!t.isHTML(z[""])||!K.match(/^(?:disabled|checked|selected)$/i))&&Z.warning('attribute "'+K+'" missed value!! "'+K+'" instead!!'),re(K,K,L));break;case S:throw new Error("attribute value missed!!")}return oe;case"\x80":ge=" ";default:if(ge<=" ")switch(ie){case d:D.setTagName(C.slice(L,oe)),ie=N;break;case w:$=C.slice(L,oe),ie=v;break;case x:var K=C.slice(L,oe);Z.warning('attribute "'+K+'" missed quot(")!!'),re($,K,L);case k:ie=N;break}else switch(ie){case v:var ne=D.tagName;(!t.isHTML(z[""])||!$.match(/^(?:disabled|checked|selected)$/i))&&Z.warning('attribute "'+$+'" missed value!! "'+$+'" instead2!!'),re($,$,L),L=oe,ie=w;break;case k:Z.warning('attribute space is required"'+$+'"!!');case N:ie=w,L=oe;break;case S:ie=x,L=oe;break;case R:throw new Error("elements closed character '/' and '>' must be connected to")}}oe++}}function P(C,L,D){for(var z=C.tagName,G=null,ge=C.length;ge--;){var Z=C[ge],re=Z.qName,$=Z.value,ne=re.indexOf(":");if(ne>0)var K=Z.prefix=re.slice(0,ne),oe=re.slice(ne+1),ie=K==="xmlns"&&oe;else oe=re,K=null,ie=re==="xmlns"&&"";Z.localName=oe,ie!==!1&&(G==null&&(G={},p(D,D={})),D[ie]=G[ie]=$,Z.uri=t.XMLNS,L.startPrefixMapping(ie,$))}for(var ge=C.length;ge--;){Z=C[ge];var K=Z.prefix;K&&(K==="xml"&&(Z.uri=t.XML),K!=="xmlns"&&(Z.uri=D[K||""]))}var ne=z.indexOf(":");ne>0?(K=C.prefix=z.slice(0,ne),oe=C.localName=z.slice(ne+1)):(K=null,oe=C.localName=z);var Q=C.uri=D[K||""];if(L.startElement(Q,oe,z,C),C.closed){if(L.endElement(Q,oe,z),G)for(K in G)Object.prototype.hasOwnProperty.call(G,K)&&L.endPrefixMapping(K)}else return C.currentNSMap=D,C.localNSMap=G,!0}function E(C,L,D,z,G){if(/^(?:script|textarea)$/i.test(D)){var Z=C.indexOf(""+D+">",L),re=C.substring(L+1,Z);if(/[&<]/.test(re))return/^script$/i.test(D)?(G.characters(re,0,re.length),Z):(re=re.replace(/?\w+;/g,z),G.characters(re,0,re.length),Z)}return L+1}function I(C,L,D,z){var G=z[D];return G==null&&(G=C.lastIndexOf(""+D+">"),G",L+4);return Z>L?(D.comment(C,L+4,Z-L-4),Z+3):(z.error("Unclosed comment"),-1)}else return-1;default:if(C.substr(L+3,6)=="CDATA["){var Z=C.indexOf("]]>",L+9);return D.startCDATA(),D.characters(C,L+9,Z-L-9),D.endCDATA(),Z+3}var re=b(C,L),$=re.length;if($>1&&/!doctype/i.test(re[0][0])){var K=re[1][0],oe=!1,ie=!1;$>3&&(/^public$/i.test(re[2][0])?(oe=re[3][0],ie=$>4&&re[4][0]):/^system$/i.test(re[2][0])&&(ie=re[3][0]));var ge=re[$-1];return D.startDTD(K,oe,ie),D.endDTD(),ge.index+ge[0].length}}return-1}function y(C,L,D){var z=C.indexOf("?>",L);if(z){var G=C.substring(L,z).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);if(G){var Z=G[0].length;return D.processingInstruction(G[1],G[2]),z+2}else return-1}return-1}function g(){this.attributeNames={}}g.prototype={setTagName:function(C){if(!l.test(C))throw new Error("invalid tagName:"+C);this.tagName=C},addValue:function(C,L,D){if(!l.test(C))throw new Error("invalid attribute:"+C);this.attributeNames[C]=this.length,this[this.length++]={qName:C,value:L,offset:D}},length:0,getLocalName:function(C){return this[C].localName},getLocator:function(C){return this[C].locator},getQName:function(C){return this[C].qName},getURI:function(C){return this[C].uri},getValue:function(C){return this[C].value}};function b(C,L){var D,z=[],G=/'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;for(G.lastIndex=L,G.exec(C);D=G.exec(C);)if(z.push(D),D[1])return z}c.XMLReader=j,c.ParseError=F}),"./node_modules/process/browser.js":(function(a,c){var e=a.exports={},t,i;function s(){throw new Error("setTimeout has not been defined")}function l(){throw new Error("clearTimeout has not been defined")}(function(){try{typeof setTimeout=="function"?t=setTimeout:t=s}catch(M){t=s}try{typeof clearTimeout=="function"?i=clearTimeout:i=l}catch(M){i=l}})();function d(M){if(t===setTimeout)return setTimeout(M,0);if((t===s||!t)&&setTimeout)return t=setTimeout,setTimeout(M,0);try{return t(M,0)}catch(J){try{return t.call(null,M,0)}catch(_){return t.call(this,M,0)}}}function w(M){if(i===clearTimeout)return clearTimeout(M);if((i===l||!i)&&clearTimeout)return i=clearTimeout,clearTimeout(M);try{return i(M)}catch(J){try{return i.call(null,M)}catch(_){return i.call(this,M)}}}var v=[],S=!1,x,k=-1;function N(){!S||!x||(S=!1,x.length?v=x.concat(v):k=-1,v.length&&R())}function R(){if(!S){var M=d(N);S=!0;for(var J=v.length;J;){for(x=v,v=[];++k1)for(var _=1;_re)return ee(null,!1);if(te>1){var de=Math.max(ue[0].Size,ue[1].Size);if(de!==Z)return ee(null,!1)}var ae=function le(me){if(me=ee.length){ne.emit("has_and_check_upload_id",Q);return}var le=ee[ae];if(!d.isInArray(Q,le)){i.removeUploadId.call(D,le),de(ae+1);return}if(i.using[le]){de(ae+1);return}k.call(D,{Bucket:g,Region:b,Key:C,UploadId:le,tracker:p.tracker},function(me,fe){D._isRunningTask(y)&&(me?(i.removeUploadId.call(D,le),de(ae+1)):ne.emit("upload_id_available",{UploadId:le,PartList:fe.PartList}))})};te(0)}),ne.on("get_remote_upload_id_list",function(){x.call(D,{Bucket:g,Region:b,Key:C,tracker:p.tracker},function(Q,ue){if(D._isRunningTask(y)){if(Q)return ne.emit("error",Q);var ee=d.filter(ue.UploadList,function(ae){return ae.Key===C&&(!L||ae.StorageClass.toUpperCase()===L.toUpperCase())}).reverse().map(function(ae){return ae.UploadId||ae.UploadID});if(ee.length)ne.emit("seek_local_avail_upload_id",ee);else{var te=i.getFileId(p.Body,p.ChunkSize,g,C),de;te&&(de=i.getUploadIdList.call(D,te))&&d.each(de,function(ae){i.removeUploadId.call(D,ae)}),ne.emit("no_available_upload_id")}}})}),ne.emit("get_remote_upload_id_list")}function x(p,f){var y=this,g=[],b={Bucket:p.Bucket,Region:p.Region,Prefix:p.Key,calledBySdk:p.calledBySdk||"sliceUploadFile",tracker:p.tracker},C=function L(){y.multipartList(b,function(D,z){if(D)return f(D);g.push.apply(g,z.Upload||[]),z.IsTruncated==="true"?(b.KeyMarker=z.NextKeyMarker,b.UploadIdMarker=z.NextUploadIdMarker,L()):f(null,{UploadList:g})})};C()}function k(p,f){var y=this,g=[],b={Bucket:p.Bucket,Region:p.Region,Key:p.Key,UploadId:p.UploadId,calledBySdk:"sliceUploadFile",tracker:p.tracker},C=function L(){y.multipartListPart(b,function(D,z){if(D)return f(D);g.push.apply(g,z.Part||[]),z.IsTruncated==="true"?(b.PartNumberMarker=z.NextPartNumberMarker,L()):f(null,{PartList:g})})};C()}function N(p,f){var y=this,g=p.TaskId,b=p.Bucket,C=p.Region,L=p.Key,D=p.UploadData,z=p.FileSize,G=p.SliceSize,Z=Math.min(p.AsyncLimit||y.options.ChunkParallelLimit||1,256),re=p.Body,$=Math.ceil(z/G),K=0,oe=p.ServerSideEncryption,ie=p.Headers,ge=d.filter(D.PartList,function(Q){return Q.Uploaded&&(K+=Q.PartNumber>=$&&z%G||G),!Q.Uploaded}),ne=p.onProgress;s.eachLimit(ge,Z,function(Q,ue){if(y._isRunningTask(g)){var ee=Q.PartNumber,te=Math.min(z,Q.PartNumber*G)-(Q.PartNumber-1)*G,de=0;R.call(y,{TaskId:g,Bucket:b,Region:C,Key:L,SliceSize:G,FileSize:z,PartNumber:ee,ServerSideEncryption:oe,Body:re,UploadData:D,Headers:ie,onProgress:function(le){K+=le.loaded-de,de=le.loaded,ne({loaded:K,total:z})},tracker:p.tracker},function(ae,le){y._isRunningTask(g)&&(!ae&&!le.ETag&&(ae='get ETag error, please add "ETag" to CORS ExposeHeader setting.( \u83B7\u53D6ETag\u5931\u8D25\uFF0C\u8BF7\u5728CORS ExposeHeader\u8BBE\u7F6E\u4E2D\u6DFB\u52A0ETag\uFF0C\u8BF7\u53C2\u8003\u6587\u6863\uFF1Ahttps://cloud.tencent.com/document/product/436/13318 )'),ae?K-=de:(K+=te-de,Q.ETag=le.ETag),ne({loaded:K,total:z}),ue(ae||null,le))})}},function(Q){if(y._isRunningTask(g)){if(Q)return f(Q);f(null,{UploadId:D.UploadId,SliceList:D.PartList})}})}function R(p,f){var y=this,g=p.TaskId,b=p.Bucket,C=p.Region,L=p.Key,D=p.FileSize,z=p.Body,G=p.PartNumber*1,Z=p.SliceSize,re=p.ServerSideEncryption,$=p.UploadData,K=p.Headers||{},oe=y.options.ChunkRetryTimes+1,ie=Z*(G-1),ge=Z,ne=ie+Z;ne>D&&(ne=D,ge=ne-ie);var Q=["x-cos-traffic-limit","x-cos-mime-limit"],ue={};d.each(K,function(te,de){Q.indexOf(de)>-1&&(ue[de]=te)});var ee=$.PartList[G-1];s.retry(oe,function(te){y._isRunningTask(g)&&d.fileSlice(z,ie,ne,!0,function(de){y.multipartUpload({TaskId:g,Bucket:b,Region:C,Key:L,ContentLength:ge,PartNumber:G,UploadId:$.UploadId,ServerSideEncryption:re,Body:de,Headers:ue,onProgress:p.onProgress,calledBySdk:"sliceUploadFile",tracker:p.tracker},function(ae,le){if(y._isRunningTask(g))return ae?te(ae):(ee.Uploaded=!0,te(null,le))})})},function(te,de){if(y._isRunningTask(g))return f(te,de)})}function F(p,f){var y=p.Bucket,g=p.Region,b=p.Key,C=p.UploadId,L=p.SliceList,D=this,z=this.options.ChunkRetryTimes+1,G=p.Headers,Z=L.map(function(re){return{PartNumber:re.PartNumber,ETag:re.ETag}});s.retry(z,function(re){D.multipartComplete({Bucket:y,Region:g,Key:b,UploadId:C,Parts:Z,Headers:G,calledBySdk:"sliceUploadFile",tracker:p.tracker},re)},function(re,$){f(re,$)})}function j(p,f){var y=p.Bucket,g=p.Region,b=p.Key,C=p.UploadId,L=p.Level||"task",D=p.AsyncLimit,z=this,G=new l;if(G.on("error",function(Z){return f(Z)}),G.on("get_abort_array",function(Z){M.call(z,{Bucket:y,Region:g,Key:b,Headers:p.Headers,AsyncLimit:D,AbortArray:Z},f)}),L==="bucket")x.call(z,{Bucket:y,Region:g,calledBySdk:"abortUploadTask"},function(Z,re){if(Z)return f(Z);G.emit("get_abort_array",re.UploadList||[])});else if(L==="file"){if(!b)return f(d.error(new Error("abort_upload_task_no_key")));x.call(z,{Bucket:y,Region:g,Key:b,calledBySdk:"abortUploadTask"},function(Z,re){if(Z)return f(Z);G.emit("get_abort_array",re.UploadList||[])})}else if(L==="task"){if(!C)return f(d.error(new Error("abort_upload_task_no_id")));if(!b)return f(d.error(new Error("abort_upload_task_no_key")));G.emit("get_abort_array",[{Key:b,UploadId:C}])}else return f(d.error(new Error("abort_unknown_level")))}function M(p,f){var y=p.Bucket,g=p.Region,b=p.Key,C=p.AbortArray,L=p.AsyncLimit||1,D=this,z=0,G=new Array(C.length);s.eachLimit(C,L,function(Z,re){var $=z;if(b&&b!==Z.Key){G[$]={error:{KeyNotMatch:!0}},re(null);return}var K=Z.UploadId||Z.UploadID;D.multipartAbort({Bucket:y,Region:g,Key:Z.Key,Headers:p.Headers,UploadId:K},function(oe){var ie={Bucket:y,Region:g,Key:Z.Key,UploadId:K};G[$]={error:oe,task:ie},re(null)}),z++},function(Z){if(Z)return f(Z);for(var re=[],$=[],K=0,oe=G.length;Kg?"sliceUploadFile":"putObject";p.tracker=new w({Beacon:y.options.BeaconReporter,clsReporter:y.options.ClsReporter,bucket:p.Bucket,region:p.Region,apiName:"uploadFile",realApi:G,fileKey:p.Key,fileSize:L,accelerate:z,deepTracker:y.options.DeepTracker,customId:y.options.CustomId,delay:y.options.TrackerDelay})}d.each(p,function(ie,ge){t(ie)!=="object"&&typeof ie!="function"&&(D[ge]=ie)});var Z=p.onTaskReady,re=function(ge){D.TaskId=ge,Z&&Z(ge)};p.onTaskReady=re;var $=L>g?"sliceUploadFile":"putObject",K=p.onFileFinish,oe=function(ge,ne){p.tracker&&p.tracker.report(ge,ne),K&&K(ge,ne,D),f&&f(ge,ne)};b.push({api:$,params:p,callback:oe}),y._addTasks(b)}function _(p,f){var y=this,g=p.SliceSize===void 0?y.options.SliceSize:p.SliceSize,b=0,C=0,L=d.throttleOnProgress.call(y,C,p.onProgress),D=p.files.length,z=p.onFileFinish,G=Array(D),Z=function(K,oe,ie){L(null,!0),z&&z(K,oe,ie),G[ie.Index]={options:ie,error:K,data:oe},--D<=0&&f&&f(null,{files:G})},re=[];d.each(p.files,function($,K){(function(){var oe=$.Body,ie=oe.size||oe.length||0,ge={Index:K,TaskId:""};if(!y.options.UseRawKey&&$.Key&&$.Key.substr(0,1)==="/"&&($.Key=$.Key.substr(1)),b+=ie,y.options.EnableReporter){var ne=y.options.UseAccelerate||typeof y.options.Domain=="string"&&y.options.Domain.includes("accelerate."),Q=ie>g?"sliceUploadFile":"putObject";$.tracker=new w({Beacon:y.options.BeaconReporter,clsReporter:y.options.ClsReporter,bucket:$.Bucket,region:$.Region,apiName:"uploadFiles",realApi:Q,fileKey:$.Key,fileSize:ie,accelerate:ne,deepTracker:y.options.DeepTracker,customId:y.options.CustomId,delay:y.options.TrackerDelay})}d.each($,function(De,Ce){t(De)!=="object"&&typeof De!="function"&&(ge[Ce]=De)});var ue=$.onTaskReady,ee=function(Ce){ge.TaskId=Ce,ue&&ue(Ce)};$.onTaskReady=ee;var te=0,de=$.onProgress,ae=function(Ce){C=C-te+Ce.loaded,te=Ce.loaded,de&&de(Ce),L({loaded:C,total:b})};$.onProgress=ae;var le=ie>g?"sliceUploadFile":"putObject",me=$.onFileFinish,fe=function(Ce,ye){$.tracker&&$.tracker.report(Ce,ye),me&&me(Ce,ye),Z&&Z(Ce,ye,ge)};re.push({api:le,params:$,callback:fe})})()}),y._addTasks(re)}function P(p,f){var y=new l,g=this,b=p.Bucket,C=p.Region,L=p.Key,D=p.CopySource,z=d.getSourceParams.call(this,D);if(!z){f(d.error(new Error("CopySource format error")));return}var G=z.Bucket,Z=z.Region,re=decodeURIComponent(z.Key),$=p.CopySliceSize===void 0?g.options.CopySliceSize:p.CopySliceSize;$=Math.max(0,$);var K=p.CopyChunkSize||this.options.CopyChunkSize,oe=this.options.CopyChunkParallelLimit,ie=this.options.ChunkRetryTimes+1,ge=0,ne=0,Q,ue,ee={},te={},de={};y.on("copy_slice_complete",function(ae){var le={};d.each(p.Headers,function(fe,De){De.toLowerCase().indexOf("x-cos-meta-")===0&&(le[De]=fe)});var me=d.map(ae.PartList,function(fe){return{PartNumber:fe.PartNumber,ETag:fe.ETag}});s.retry(ie,function(fe){g.multipartComplete({Bucket:b,Region:C,Key:L,UploadId:ae.UploadId,Parts:me,tracker:p.tracker,calledBySdk:"sliceCopyFile"},fe)},function(fe,De){if(i.removeUsing(ae.UploadId),fe)return ue(null,!0),f(fe);i.removeUploadId(ae.UploadId),ue({loaded:Q,total:Q},!0),f(null,De)})}),y.on("get_copy_data_finish",function(ae){var le=i.getCopyFileId(D,ee,K,b,L);le&&i.saveUploadId(le,ae.UploadId,g.options.UploadIdCacheLimit),i.setUsing(ae.UploadId);var me=d.filter(ae.PartList,function(fe){return fe.Uploaded&&(ne+=fe.PartNumber>=ge&&Q%K||K),!fe.Uploaded});s.eachLimit(me,oe,function(fe,De){var Ce=fe.PartNumber,ye=fe.CopySourceRange,Fe=fe.end-fe.start;s.retry(ie,function(Ue){E.call(g,{Bucket:b,Region:C,Key:L,CopySource:D,UploadId:ae.UploadId,PartNumber:Ce,CopySourceRange:ye,tracker:p.tracker,calledBySdk:"sliceCopyFile"},Ue)},function(Ue,Re){if(Ue)return De(Ue);ne+=Fe,ue({loaded:ne,total:Q}),fe.ETag=Re.ETag,De(Ue||null,Re)})},function(fe){if(fe)return i.removeUsing(ae.UploadId),ue(null,!0),f(fe);y.emit("copy_slice_complete",ae)})}),y.on("get_chunk_size_finish",function(){var ae=function(){g.multipartInit({Bucket:b,Region:C,Key:L,Headers:de,tracker:p.tracker,calledBySdk:"sliceCopyFile"},function(Ce,ye){if(Ce)return f(Ce);p.UploadId=ye.UploadId,y.emit("get_copy_data_finish",{UploadId:p.UploadId,PartList:p.PartList})})},le=i.getCopyFileId(D,ee,K,b,L),me=i.getUploadIdList(le);if(!le||!me)return ae();var fe=function De(Ce){if(Ce>=me.length)return ae();var ye=me[Ce];if(i.using[ye])return De(Ce+1);k.call(g,{Bucket:b,Region:C,Key:L,UploadId:ye,tracker:p.tracker,calledBySdk:"sliceCopyFile"},function(Fe,Ue){if(Fe)i.removeUploadId(ye),De(Ce+1);else{if(i.using[ye])return De(Ce+1);var Re={},it=0;d.each(Ue.PartList,function(Je){var We=parseInt(Je.Size),je=it+We-1;Re[Je.PartNumber+"|"+it+"|"+je]=Je.ETag,it+=We}),d.each(p.PartList,function(Je){var We=Re[Je.PartNumber+"|"+Je.start+"|"+Je.end];We&&(Je.ETag=We,Je.Uploaded=!0)}),y.emit("get_copy_data_finish",{UploadId:ye,PartList:p.PartList})}})};fe(0)}),y.on("get_file_size_finish",function(){if((function(){for(var le=[1,2,4,8,16,32,64,128,256,512,1024,2048,4096,5120],me=1024*1024,fe=0;feCe.length&&(te[De]=fe)}),y.emit("get_file_size_finish")}})}function E(p,f){var y=p.TaskId,g=p.Bucket,b=p.Region,C=p.Key,L=p.CopySource,D=p.UploadId,z=p.PartNumber*1,G=p.CopySourceRange,Z=this.options.ChunkRetryTimes+1,re=this;s.retry(Z,function($){re.uploadPartCopy({TaskId:y,Bucket:g,Region:b,Key:C,CopySource:L,UploadId:D,PartNumber:z,CopySourceRange:G,tracker:p.tracker,calledBySdk:p.calledBySdk},function(K,oe){$(K||null,oe)})},function($,K){return f($,K)})}var I={sliceUploadFile:v,abortUploadTask:j,uploadFile:J,uploadFiles:_,sliceCopyFile:P};a.exports.init=function(p,f){f.transferToTaskMethod(I,"sliceUploadFile"),d.each(I,function(y,g){p.prototype[g]=d.apiWrapper(g,y)})}}),"./src/async.js":(function(a,c){var e=function(l,d,w,v){if(v=v||function(){},!l.length||d<=0)return v();var S=0,x=0,k=0;(function N(){if(S>=l.length)return v();for(;k=l.length?v():N())})})()},t=function(l,d,w){var v=function S(x){d(function(k,N){k&&x/gi,"<$1Rule>"),u=u.replace(/<(\/?)Tags>/gi,"<$1Tag>");var h=n.Headers;h["Content-Type"]="application/xml",h["Content-MD5"]=s.b64(s.md5(u)),se.call(this,{Action:"name/cos:PutBucketReplication",method:"PUT",Bucket:n.Bucket,Region:n.Region,body:u,action:"replication",headers:h,tracker:n.tracker},function(m,A){if(m&&m.statusCode===204)return o(null,{statusCode:m.statusCode});if(m)return o(m);o(null,{statusCode:A.statusCode,headers:A.headers})})}function L(n,o){se.call(this,{Action:"name/cos:GetBucketReplication",method:"GET",Bucket:n.Bucket,Region:n.Region,headers:n.Headers,action:"replication",tracker:n.tracker},function(r,u){if(r){if(r.statusCode===404&&r.error&&(r.error==="Not Found"||r.error.Code==="ReplicationConfigurationnotFoundError")){var h={ReplicationConfiguration:{Rules:[]},statusCode:r.statusCode};r.headers&&(h.headers=r.headers),o(null,h)}else o(r);return}!u.ReplicationConfiguration&&(u.ReplicationConfiguration={}),u.ReplicationConfiguration.Rule&&(u.ReplicationConfiguration.Rules=s.makeArray(u.ReplicationConfiguration.Rule),delete u.ReplicationConfiguration.Rule),o(r,u)})}function D(n,o){se.call(this,{Action:"name/cos:DeleteBucketReplication",method:"DELETE",Bucket:n.Bucket,Region:n.Region,headers:n.Headers,action:"replication",tracker:n.tracker},function(r,u){if(r&&r.statusCode===204)return o(null,{statusCode:r.statusCode});if(r)return o(r);o(null,{statusCode:u.statusCode,headers:u.headers})})}function z(n,o){if(!n.WebsiteConfiguration){o(s.error(new Error("missing param WebsiteConfiguration")));return}var r=s.clone(n.WebsiteConfiguration||{}),u=r.RoutingRules||r.RoutingRule||[];u=s.isArray(u)?u:[u],delete r.RoutingRule,delete r.RoutingRules,u.length&&(r.RoutingRules={RoutingRule:u});var h=s.json2xml({WebsiteConfiguration:r}),m=n.Headers;m["Content-Type"]="application/xml",m["Content-MD5"]=s.b64(s.md5(h)),se.call(this,{Action:"name/cos:PutBucketWebsite",method:"PUT",Bucket:n.Bucket,Region:n.Region,body:h,action:"website",headers:m,tracker:n.tracker},function(A,B){if(A&&A.statusCode===204)return o(null,{statusCode:A.statusCode});if(A)return o(A);o(null,{statusCode:B.statusCode,headers:B.headers})})}function G(n,o){se.call(this,{Action:"name/cos:GetBucketWebsite",method:"GET",Bucket:n.Bucket,Region:n.Region,Key:n.Key,headers:n.Headers,action:"website",tracker:n.tracker},function(r,u){if(r){if(r.statusCode===404&&r.error.Code==="NoSuchWebsiteConfiguration"){var h={WebsiteConfiguration:{},statusCode:r.statusCode};r.headers&&(h.headers=r.headers),o(null,h)}else o(r);return}var m=u.WebsiteConfiguration||{};if(m.RoutingRules){var A=s.clone(m.RoutingRules.RoutingRule||[]);A=s.makeArray(A),m.RoutingRules=A}o(null,{WebsiteConfiguration:m,statusCode:u.statusCode,headers:u.headers})})}function Z(n,o){se.call(this,{Action:"name/cos:DeleteBucketWebsite",method:"DELETE",Bucket:n.Bucket,Region:n.Region,headers:n.Headers,action:"website",tracker:n.tracker},function(r,u){if(r&&r.statusCode===204)return o(null,{statusCode:r.statusCode});if(r)return o(r);o(null,{statusCode:u.statusCode,headers:u.headers})})}function re(n,o){if(!n.RefererConfiguration){o(s.error(new Error("missing param RefererConfiguration")));return}var r=s.clone(n.RefererConfiguration||{}),u=r.DomainList||{},h=u.Domains||u.Domain||[];h=s.isArray(h)?h:[h],h.length&&(r.DomainList={Domain:h});var m=s.json2xml({RefererConfiguration:r}),A=n.Headers;A["Content-Type"]="application/xml",A["Content-MD5"]=s.b64(s.md5(m)),se.call(this,{Action:"name/cos:PutBucketReferer",method:"PUT",Bucket:n.Bucket,Region:n.Region,body:m,action:"referer",headers:A,tracker:n.tracker},function(B,H){if(B&&B.statusCode===204)return o(null,{statusCode:B.statusCode});if(B)return o(B);o(null,{statusCode:H.statusCode,headers:H.headers})})}function $(n,o){se.call(this,{Action:"name/cos:GetBucketReferer",method:"GET",Bucket:n.Bucket,Region:n.Region,Key:n.Key,headers:n.Headers,action:"referer",tracker:n.tracker},function(r,u){if(r){if(r.statusCode===404&&r.error.Code==="NoSuchRefererConfiguration"){var h={WebsiteConfiguration:{},statusCode:r.statusCode};r.headers&&(h.headers=r.headers),o(null,h)}else o(r);return}var m=u.RefererConfiguration||{};if(m.DomainList){var A=s.makeArray(m.DomainList.Domain||[]);m.DomainList={Domains:A}}o(null,{RefererConfiguration:m,statusCode:u.statusCode,headers:u.headers})})}function K(n,o){var r=n.DomainConfiguration||{},u=r.DomainRule||n.DomainRule||[];u=s.clone(u);var h=s.json2xml({DomainConfiguration:{DomainRule:u}}),m=n.Headers;m["Content-Type"]="application/xml",m["Content-MD5"]=s.b64(s.md5(h)),se.call(this,{Action:"name/cos:PutBucketDomain",method:"PUT",Bucket:n.Bucket,Region:n.Region,body:h,action:"domain",headers:m,tracker:n.tracker},function(A,B){if(A&&A.statusCode===204)return o(null,{statusCode:A.statusCode});if(A)return o(A);o(null,{statusCode:B.statusCode,headers:B.headers})})}function oe(n,o){se.call(this,{Action:"name/cos:GetBucketDomain",method:"GET",Bucket:n.Bucket,Region:n.Region,headers:n.Headers,action:"domain",tracker:n.tracker},function(r,u){if(r)return o(r);var h=[];try{h=u.DomainConfiguration.DomainRule||[]}catch(m){}h=s.clone(s.isArray(h)?h:[h]),o(null,{DomainRule:h,statusCode:u.statusCode,headers:u.headers})})}function ie(n,o){se.call(this,{Action:"name/cos:DeleteBucketDomain",method:"DELETE",Bucket:n.Bucket,Region:n.Region,headers:n.Headers,action:"domain",tracker:n.tracker},function(r,u){if(r&&r.statusCode===204)return o(null,{statusCode:r.statusCode});if(r)return o(r);o(null,{statusCode:u.statusCode,headers:u.headers})})}function ge(n,o){var r=n.OriginConfiguration||{},u=r.OriginRule||n.OriginRule||[];u=s.clone(u);var h=s.json2xml({OriginConfiguration:{OriginRule:u}}),m=n.Headers;m["Content-Type"]="application/xml",m["Content-MD5"]=s.b64(s.md5(h)),se.call(this,{Action:"name/cos:PutBucketOrigin",method:"PUT",Bucket:n.Bucket,Region:n.Region,body:h,action:"origin",headers:m,tracker:n.tracker},function(A,B){if(A&&A.statusCode===204)return o(null,{statusCode:A.statusCode});if(A)return o(A);o(null,{statusCode:B.statusCode,headers:B.headers})})}function ne(n,o){se.call(this,{Action:"name/cos:GetBucketOrigin",method:"GET",Bucket:n.Bucket,Region:n.Region,headers:n.Headers,action:"origin",tracker:n.tracker},function(r,u){if(r)return o(r);var h=[];try{h=u.OriginConfiguration.OriginRule||[]}catch(m){}h=s.clone(s.isArray(h)?h:[h]),o(null,{OriginRule:h,statusCode:u.statusCode,headers:u.headers})})}function Q(n,o){se.call(this,{Action:"name/cos:DeleteBucketOrigin",method:"DELETE",Bucket:n.Bucket,Region:n.Region,headers:n.Headers,action:"origin",tracker:n.tracker},function(r,u){if(r&&r.statusCode===204)return o(null,{statusCode:r.statusCode});if(r)return o(r);o(null,{statusCode:u.statusCode,headers:u.headers})})}function ue(n,o){var r=s.json2xml({BucketLoggingStatus:n.BucketLoggingStatus||""}),u=n.Headers;u["Content-Type"]="application/xml",u["Content-MD5"]=s.b64(s.md5(r)),se.call(this,{Action:"name/cos:PutBucketLogging",method:"PUT",Bucket:n.Bucket,Region:n.Region,body:r,action:"logging",headers:u,tracker:n.tracker},function(h,m){if(h&&h.statusCode===204)return o(null,{statusCode:h.statusCode});if(h)return o(h);o(null,{statusCode:m.statusCode,headers:m.headers})})}function ee(n,o){se.call(this,{Action:"name/cos:GetBucketLogging",method:"GET",Bucket:n.Bucket,Region:n.Region,headers:n.Headers,action:"logging",tracker:n.tracker},function(r,u){if(r)return o(r);o(null,{BucketLoggingStatus:u.BucketLoggingStatus,statusCode:u.statusCode,headers:u.headers})})}function te(n,o,r){var u=s.clone(o.InventoryConfiguration);if(u.OptionalFields){var h=u.OptionalFields||[];u.OptionalFields={Field:h}}if(u.Destination&&u.Destination.COSBucketDestination&&u.Destination.COSBucketDestination.Encryption){var m=u.Destination.COSBucketDestination.Encryption;Object.keys(m).indexOf("SSECOS")>-1&&(m["SSE-COS"]=m.SSECOS,delete m.SSECOS)}var A=s.json2xml({InventoryConfiguration:u}),B=o.Headers;B["Content-Type"]="application/xml",B["Content-MD5"]=s.b64(s.md5(A));var H=n==="PUT"?"name/cos:PutBucketInventory":"name/cos:PostBucketInventory";se.call(this,{Action:H,method:n,Bucket:o.Bucket,Region:o.Region,body:A,action:"inventory",qs:{id:o.Id},headers:B,tracker:o.tracker},function(pe,ce){if(pe&&pe.statusCode===204)return r(null,{statusCode:pe.statusCode});if(pe)return r(pe);r(null,{statusCode:ce.statusCode,headers:ce.headers})})}function de(n,o){return te.call(this,"PUT",n,o)}function ae(n,o){return te.call(this,"POST",n,o)}function le(n,o){se.call(this,{Action:"name/cos:GetBucketInventory",method:"GET",Bucket:n.Bucket,Region:n.Region,headers:n.Headers,action:"inventory",qs:{id:n.Id},tracker:n.tracker},function(r,u){if(r)return o(r);var h=u.InventoryConfiguration;if(h&&h.OptionalFields&&h.OptionalFields.Field){var m=h.OptionalFields.Field;s.isArray(m)||(m=[m]),h.OptionalFields=m}if(h.Destination&&h.Destination.COSBucketDestination&&h.Destination.COSBucketDestination.Encryption){var A=h.Destination.COSBucketDestination.Encryption;Object.keys(A).indexOf("SSE-COS")>-1&&(A.SSECOS=A["SSE-COS"],delete A["SSE-COS"])}o(null,{InventoryConfiguration:h,statusCode:u.statusCode,headers:u.headers})})}function me(n,o){se.call(this,{Action:"name/cos:ListBucketInventory",method:"GET",Bucket:n.Bucket,Region:n.Region,headers:n.Headers,action:"inventory",qs:{"continuation-token":n.ContinuationToken},tracker:n.tracker},function(r,u){if(r)return o(r);var h=u.ListInventoryConfigurationResult,m=h.InventoryConfiguration||[];m=s.isArray(m)?m:[m],delete h.InventoryConfiguration,s.each(m,function(A){if(A&&A.OptionalFields&&A.OptionalFields.Field){var B=A.OptionalFields.Field;s.isArray(B)||(B=[B]),A.OptionalFields=B}if(A.Destination&&A.Destination.COSBucketDestination&&A.Destination.COSBucketDestination.Encryption){var H=A.Destination.COSBucketDestination.Encryption;Object.keys(H).indexOf("SSE-COS")>-1&&(H.SSECOS=H["SSE-COS"],delete H["SSE-COS"])}}),h.InventoryConfigurations=m,s.extend(h,{statusCode:u.statusCode,headers:u.headers}),o(null,h)})}function fe(n,o){se.call(this,{Action:"name/cos:DeleteBucketInventory",method:"DELETE",Bucket:n.Bucket,Region:n.Region,headers:n.Headers,action:"inventory",qs:{id:n.Id},tracker:n.tracker},function(r,u){if(r&&r.statusCode===204)return o(null,{statusCode:r.statusCode});if(r)return o(r);o(null,{statusCode:u.statusCode,headers:u.headers})})}function De(n,o){if(!n.AccelerateConfiguration){o(s.error(new Error("missing param AccelerateConfiguration")));return}var r={AccelerateConfiguration:n.AccelerateConfiguration||{}},u=s.json2xml(r),h={};h["Content-Type"]="application/xml",h["Content-MD5"]=s.b64(s.md5(u)),se.call(this,{Action:"name/cos:PutBucketAccelerate",method:"PUT",Bucket:n.Bucket,Region:n.Region,body:u,action:"accelerate",headers:h,tracker:n.tracker},function(m,A){if(m)return o(m);o(null,{statusCode:A.statusCode,headers:A.headers})})}function Ce(n,o){se.call(this,{Action:"name/cos:GetBucketAccelerate",method:"GET",Bucket:n.Bucket,Region:n.Region,action:"accelerate",tracker:n.tracker},function(r,u){r||!u.AccelerateConfiguration&&(u.AccelerateConfiguration={}),o(r,u)})}function ye(n,o){var r=n.ServerSideEncryptionConfiguration||{},u=r.Rule||r.Rules||[],h=s.json2xml({ServerSideEncryptionConfiguration:{Rule:u}}),m=n.Headers;m["Content-Type"]="application/xml",m["Content-MD5"]=s.b64(s.md5(h)),se.call(this,{Action:"name/cos:PutBucketEncryption",method:"PUT",Bucket:n.Bucket,Region:n.Region,body:h,action:"encryption",headers:m,tracker:n.tracker},function(A,B){if(A&&A.statusCode===204)return o(null,{statusCode:A.statusCode});if(A)return o(A);o(null,{statusCode:B.statusCode,headers:B.headers})})}function Fe(n,o){se.call(this,{Action:"name/cos:GetBucketEncryption",method:"GET",Bucket:n.Bucket,Region:n.Region,headers:n.Headers,action:"encryption",tracker:n.tracker},function(r,u){if(r){if(r.statusCode===404&&r.code==="NoSuchEncryptionConfiguration"){var h={EncryptionConfiguration:{Rules:[]},statusCode:r.statusCode};r.headers&&(h.headers=r.headers),o(null,h)}else o(r);return}var m=s.makeArray(u.EncryptionConfiguration&&u.EncryptionConfiguration.Rule||[]);u.EncryptionConfiguration={Rules:m},o(r,u)})}function Ue(n,o){se.call(this,{Action:"name/cos:DeleteBucketReplication",method:"DELETE",Bucket:n.Bucket,Region:n.Region,headers:n.Headers,action:"encryption",tracker:n.tracker},function(r,u){if(r&&r.statusCode===204)return o(null,{statusCode:r.statusCode});if(r)return o(r);o(null,{statusCode:u.statusCode,headers:u.headers})})}function Re(n,o){se.call(this,{Action:"name/cos:HeadObject",method:"HEAD",Bucket:n.Bucket,Region:n.Region,Key:n.Key,VersionId:n.VersionId,headers:n.Headers,tracker:n.tracker},function(r,u){if(r){var h=r.statusCode;return n.Headers["If-Modified-Since"]&&h&&h===304?o(null,{NotModified:!0,statusCode:h}):o(r)}u.ETag=s.attr(u.headers,"etag",""),o(null,u)})}function it(n,o){var r={};r.prefix=n.Prefix||"",r.delimiter=n.Delimiter,r["key-marker"]=n.KeyMarker,r["version-id-marker"]=n.VersionIdMarker,r["max-keys"]=n.MaxKeys,r["encoding-type"]=n.EncodingType,se.call(this,{Action:"name/cos:GetBucketObjectVersions",ResourceKey:r.prefix,method:"GET",Bucket:n.Bucket,Region:n.Region,headers:n.Headers,qs:r,action:"versions",tracker:n.tracker},function(u,h){if(u)return o(u);var m=h.ListVersionsResult||{},A=m.DeleteMarker||[];A=s.isArray(A)?A:[A];var B=m.Version||[];B=s.isArray(B)?B:[B];var H=s.clone(m);delete H.DeleteMarker,delete H.Version,s.extend(H,{DeleteMarkers:A,Versions:B,statusCode:h.statusCode,headers:h.headers}),o(null,H)})}function Je(n,o){if(this.options.ObjectKeySimplifyCheck){var r=s.simplifyPath(n.Key);if(r==="/"){o(s.error(new Error("The Getobject Key is illegal")));return}}var u=n.Query||{},h=n.QueryString||"",m=s.throttleOnProgress.call(this,0,n.onProgress),A=n.tracker;A&&A.setParams({signStartTime:new Date().getTime()}),u["response-content-type"]=n.ResponseContentType,u["response-content-language"]=n.ResponseContentLanguage,u["response-expires"]=n.ResponseExpires,u["response-cache-control"]=n.ResponseCacheControl,u["response-content-disposition"]=n.ResponseContentDisposition,u["response-content-encoding"]=n.ResponseContentEncoding,se.call(this,{Action:"name/cos:GetObject",method:"GET",Bucket:n.Bucket,Region:n.Region,Key:n.Key,VersionId:n.VersionId,DataType:n.DataType,headers:n.Headers,qs:u,qsStr:h,rawBody:!0,onDownloadProgress:m,tracker:A},function(B,H){if(m(null,!0),B){var pe=B.statusCode;return n.Headers["If-Modified-Since"]&&pe&&pe===304?o(null,{NotModified:!0}):o(B)}o(null,{Body:H.body,ETag:s.attr(H.headers,"etag",""),statusCode:H.statusCode,headers:H.headers})})}function We(n,o){var r=this,u=n.ContentLength,h=s.throttleOnProgress.call(r,u,n.onProgress),m=n.Headers;!m["Cache-Control"]&&!m["cache-control"]&&(m["Cache-Control"]=""),!m["Content-Type"]&&!m["content-type"]&&(m["Content-Type"]=n.Body&&n.Body.type||"");var A=n.UploadAddMetaMd5||r.options.UploadAddMetaMd5||r.options.UploadCheckContentMd5,B=n.tracker;A&&B&&B.setParams({md5StartTime:new Date().getTime()}),s.getBodyMd5(A,n.Body,function(H){H&&(B&&B.setParams({md5EndTime:new Date().getTime()}),r.options.UploadCheckContentMd5&&(m["Content-MD5"]=s.b64(H)),(n.UploadAddMetaMd5||r.options.UploadAddMetaMd5)&&(m["x-cos-meta-md5"]=H)),n.ContentLength!==void 0&&(m["Content-Length"]=n.ContentLength),h(null,!0),se.call(r,{Action:"name/cos:PutObject",TaskId:n.TaskId,method:"PUT",Bucket:n.Bucket,Region:n.Region,Key:n.Key,headers:n.Headers,qs:n.Query,body:n.Body,onProgress:h,tracker:B},function(pe,ce){if(pe)return h(null,!0),o(pe);h({loaded:u,total:u},!0);var ve=nt({ForcePathStyle:r.options.ForcePathStyle,protocol:r.options.Protocol,domain:r.options.Domain,bucket:n.Bucket,region:r.options.UseAccelerate?"accelerate":n.Region,object:n.Key});ve=ve.substr(ve.indexOf("://")+3),ce.Location=ve,ce.ETag=s.attr(ce.headers,"etag",""),o(null,ce)})},n.onHashProgress)}function je(n,o){se.call(this,{Action:"name/cos:DeleteObject",method:"DELETE",Bucket:n.Bucket,Region:n.Region,Key:n.Key,headers:n.Headers,VersionId:n.VersionId,action:n.Recursive?"recursive":"",tracker:n.tracker},function(r,u){if(r){var h=r.statusCode;return h&&h===404?o(null,{BucketNotFound:!0,statusCode:h}):o(r)}o(null,{statusCode:u.statusCode,headers:u.headers})})}function V(n,o){var r={};n.VersionId&&(r.versionId=n.VersionId),se.call(this,{Action:"name/cos:GetObjectACL",method:"GET",Bucket:n.Bucket,Region:n.Region,Key:n.Key,headers:n.Headers,qs:r,action:"acl",tracker:n.tracker},function(u,h){if(u)return o(u);var m=h.AccessControlPolicy||{},A=m.Owner||{},B=m.AccessControlList&&m.AccessControlList.Grant||[];B=s.isArray(B)?B:[B];var H=mt(m);delete H.GrantWrite,h.headers&&h.headers["x-cos-acl"]&&(H.ACL=h.headers["x-cos-acl"]),H=s.extend(H,{Owner:A,Grants:B,statusCode:h.statusCode,headers:h.headers}),o(null,H)})}function T(n,o){var r=n.Headers,u="";if(n.AccessControlPolicy){var h=s.clone(n.AccessControlPolicy||{}),m=h.Grants||h.Grant;m=s.isArray(m)?m:[m],delete h.Grant,delete h.Grants,h.AccessControlList={Grant:m},u=s.json2xml({AccessControlPolicy:h}),r["Content-Type"]="application/xml",r["Content-MD5"]=s.b64(s.md5(u))}s.each(r,function(A,B){B.indexOf("x-cos-grant-")===0&&(r[B]=ct(r[B]))}),se.call(this,{Action:"name/cos:PutObjectACL",method:"PUT",Bucket:n.Bucket,Region:n.Region,Key:n.Key,action:"acl",headers:r,body:u,tracker:n.tracker},function(A,B){if(A)return o(A);o(null,{statusCode:B.statusCode,headers:B.headers})})}function U(n,o){var r=n.Headers;r.Origin=n.Origin,r["Access-Control-Request-Method"]=n.AccessControlRequestMethod,r["Access-Control-Request-Headers"]=n.AccessControlRequestHeaders,se.call(this,{Action:"name/cos:OptionsObject",method:"OPTIONS",Bucket:n.Bucket,Region:n.Region,Key:n.Key,headers:r,tracker:n.tracker},function(u,h){if(u)return u.statusCode&&u.statusCode===403?o(null,{OptionsForbidden:!0,statusCode:u.statusCode}):o(u);var m=h.headers||{};o(null,{AccessControlAllowOrigin:m["access-control-allow-origin"],AccessControlAllowMethods:m["access-control-allow-methods"],AccessControlAllowHeaders:m["access-control-allow-headers"],AccessControlExposeHeaders:m["access-control-expose-headers"],AccessControlMaxAge:m["access-control-max-age"],statusCode:h.statusCode,headers:h.headers})})}function O(n,o){var r=this,u=n.Headers;!u["Cache-Control"]&&!u["cache-control"]&&(u["Cache-Control"]="");var h=n.CopySource||"",m=s.getSourceParams.call(this,h);if(!m){o(s.error(new Error("CopySource format error")));return}var A=m.Bucket,B=m.Region,H=decodeURIComponent(m.Key);se.call(this,{Scope:[{action:"name/cos:GetObject",bucket:A,region:B,prefix:H},{action:"name/cos:PutObject",bucket:n.Bucket,region:n.Region,prefix:n.Key}],method:"PUT",Bucket:n.Bucket,Region:n.Region,Key:n.Key,VersionId:n.VersionId,headers:n.Headers,tracker:n.tracker},function(pe,ce){if(pe)return o(pe);var ve=s.clone(ce.CopyObjectResult||{}),Y=nt({ForcePathStyle:r.options.ForcePathStyle,protocol:r.options.Protocol,domain:r.options.Domain,bucket:n.Bucket,region:n.Region,object:n.Key,isLocation:!0});s.extend(ve,{Location:Y,statusCode:ce.statusCode,headers:ce.headers}),o(null,ve)})}function W(n,o){var r=n.CopySource||"",u=s.getSourceParams.call(this,r);if(!u){o(s.error(new Error("CopySource format error")));return}var h=u.Bucket,m=u.Region,A=decodeURIComponent(u.Key);se.call(this,{Scope:[{action:"name/cos:GetObject",bucket:h,region:m,prefix:A},{action:"name/cos:PutObject",bucket:n.Bucket,region:n.Region,prefix:n.Key}],method:"PUT",Bucket:n.Bucket,Region:n.Region,Key:n.Key,VersionId:n.VersionId,qs:{partNumber:n.PartNumber,uploadId:n.UploadId},headers:n.Headers,tracker:n.tracker},function(B,H){if(B)return o(B);var pe=s.clone(H.CopyPartResult||{});s.extend(pe,{statusCode:H.statusCode,headers:H.headers}),o(null,pe)})}function X(n,o){var r=n.Objects||[],u=n.Quiet;r=s.isArray(r)?r:[r];var h=s.json2xml({Delete:{Object:r,Quiet:u||!1}}),m=n.Headers;m["Content-Type"]="application/xml",m["Content-MD5"]=s.b64(s.md5(h));var A=s.map(r,function(B){return{action:"name/cos:DeleteObject",bucket:n.Bucket,region:n.Region,prefix:B.Key}});se.call(this,{Scope:A,method:"POST",Bucket:n.Bucket,Region:n.Region,body:h,action:"delete",headers:m,tracker:n.tracker},function(B,H){if(B)return o(B);var pe=H.DeleteResult||{},ce=pe.Deleted||[],ve=pe.Error||[];ce=s.isArray(ce)?ce:[ce],ve=s.isArray(ve)?ve:[ve];var Y=s.clone(pe);s.extend(Y,{Error:ve,Deleted:ce,statusCode:H.statusCode,headers:H.headers}),o(null,Y)})}function he(n,o){var r=n.Headers;if(!n.RestoreRequest){o(s.error(new Error("missing param RestoreRequest")));return}var u=n.RestoreRequest||{},h=s.json2xml({RestoreRequest:u});r["Content-Type"]="application/xml",r["Content-MD5"]=s.b64(s.md5(h)),se.call(this,{Action:"name/cos:RestoreObject",method:"POST",Bucket:n.Bucket,Region:n.Region,Key:n.Key,VersionId:n.VersionId,body:h,action:"restore",headers:r,tracker:n.tracker},o)}function we(n,o){var r=n.Tagging||{},u=r.TagSet||r.Tags||n.Tags||[];u=s.clone(s.isArray(u)?u:[u]);var h=s.json2xml({Tagging:{TagSet:{Tag:u}}}),m=n.Headers;m["Content-Type"]="application/xml",m["Content-MD5"]=s.b64(s.md5(h)),se.call(this,{Action:"name/cos:PutObjectTagging",method:"PUT",Bucket:n.Bucket,Key:n.Key,Region:n.Region,body:h,action:"tagging",headers:m,VersionId:n.VersionId,tracker:n.tracker},function(A,B){if(A&&A.statusCode===204)return o(null,{statusCode:A.statusCode});if(A)return o(A);o(null,{statusCode:B.statusCode,headers:B.headers})})}function Ee(n,o){se.call(this,{Action:"name/cos:GetObjectTagging",method:"GET",Key:n.Key,Bucket:n.Bucket,Region:n.Region,headers:n.Headers,action:"tagging",VersionId:n.VersionId,tracker:n.tracker},function(r,u){if(r){if(r.statusCode===404&&r.error&&(r.error==="Not Found"||r.error.Code==="NoSuchTagSet")){var h={Tags:[],statusCode:r.statusCode};r.headers&&(h.headers=r.headers),o(null,h)}else o(r);return}var m=[];try{m=u.Tagging.TagSet.Tag||[]}catch(A){}m=s.clone(s.isArray(m)?m:[m]),o(null,{Tags:m,statusCode:u.statusCode,headers:u.headers})})}function ke(n,o){se.call(this,{Action:"name/cos:DeleteObjectTagging",method:"DELETE",Bucket:n.Bucket,Region:n.Region,Key:n.Key,headers:n.Headers,action:"tagging",VersionId:n.VersionId,tracker:n.tracker},function(r,u){if(r&&r.statusCode===204)return o(null,{statusCode:r.statusCode});if(r)return o(r);o(null,{statusCode:u.statusCode,headers:u.headers})})}function Be(n,o){var r=n.SelectType;if(!r)return o(s.error(new Error("missing param SelectType")));var u=n.SelectRequest||{},h=s.json2xml({SelectRequest:u}),m=n.Headers;m["Content-Type"]="application/xml",m["Content-MD5"]=s.b64(s.md5(h)),se.call(this,{Action:"name/cos:GetObject",method:"POST",Bucket:n.Bucket,Region:n.Region,Key:n.Key,headers:n.Headers,action:"select",qs:{"select-type":n.SelectType},VersionId:n.VersionId,body:h,DataType:"arraybuffer",rawBody:!0,tracker:n.tracker},function(A,B){if(A&&A.statusCode===204)return o(null,{statusCode:A.statusCode});if(A)return o(A);var H=s.parseSelectPayload(B.body);o(null,{statusCode:B.statusCode,headers:B.headers,Body:H.body,Payload:H.payload})})}function qe(n,o){var r=this,u=n.Headers,h=n.tracker;!u["Cache-Control"]&&!u["cache-control"]&&(u["Cache-Control"]=""),!u["Content-Type"]&&!u["content-type"]&&(u["Content-Type"]=n.Body&&n.Body.type||"");var m=n.Body&&(n.UploadAddMetaMd5||r.options.UploadAddMetaMd5);m&&h&&h.setParams({md5StartTime:new Date().getTime()}),s.getBodyMd5(m,n.Body,function(A){A&&(n.Headers["x-cos-meta-md5"]=A),m&&h&&h.setParams({md5EndTime:new Date().getTime()}),se.call(r,{Action:"name/cos:InitiateMultipartUpload",method:"POST",Bucket:n.Bucket,Region:n.Region,Key:n.Key,action:"uploads",headers:n.Headers,qs:n.Query,tracker:h},function(B,H){if(B)return h&&h.parent&&h.parent.setParams({errorNode:"multipartInit"}),o(B);if(H=s.clone(H||{}),H&&H.InitiateMultipartUploadResult)return o(null,s.extend(H.InitiateMultipartUploadResult,{statusCode:H.statusCode,headers:H.headers}));o(null,H)})},n.onHashProgress)}function Pe(n,o){var r=this;s.getFileSize("multipartUpload",n,function(){var u=n.tracker,h=r.options.UploadCheckContentMd5;h&&u&&u.setParams({md5StartTime:new Date().getTime()}),s.getBodyMd5(h,n.Body,function(m){m&&(n.Headers["Content-MD5"]=s.b64(m)),h&&u&&u.setParams({md5EndTime:new Date().getTime()}),u&&u.setParams({partNumber:n.PartNumber}),se.call(r,{Action:"name/cos:UploadPart",TaskId:n.TaskId,method:"PUT",Bucket:n.Bucket,Region:n.Region,Key:n.Key,qs:{partNumber:n.PartNumber,uploadId:n.UploadId},headers:n.Headers,onProgress:n.onProgress,body:n.Body||null,tracker:u},function(A,B){if(A)return u&&u.parent&&u.parent.setParams({errorNode:"multipartUpload"}),o(A);o(null,{ETag:s.attr(B.headers,"etag",""),statusCode:B.statusCode,headers:B.headers})})})})}function He(n,o){for(var r=this,u=n.UploadId,h=n.Parts,m=n.tracker,A=0,B=h.length;A-1?ve(ce.Authorization):"sign="+encodeURIComponent(ce.Authorization)),ce.SecurityToken&&(Y+="&x-cos-security-token="+ce.SecurityToken),ce.ClientIP&&(Y+="&clientIP="+ce.ClientIP),ce.ClientUA&&(Y+="&clientUA="+ce.ClientUA),ce.Token&&(Y+="&token="+ce.Token),m&&(Y+="&"+m),setTimeout(function(){o(null,{Url:Y})})}});return H?(A+="?"+H.Authorization+(H.SecurityToken?"&x-cos-security-token="+H.SecurityToken:""),m&&(A+="&"+m)):m&&(A+="?"+m),A}function mt(n){var o={GrantFullControl:[],GrantWrite:[],GrantRead:[],GrantReadAcp:[],GrantWriteAcp:[],ACL:""},r={FULL_CONTROL:"GrantFullControl",WRITE:"GrantWrite",READ:"GrantRead",READ_ACP:"GrantReadAcp",WRITE_ACP:"GrantWriteAcp"},u=n&&n.AccessControlList||{},h=u.Grant;h&&(h=s.isArray(h)?h:[h]);var m={READ:0,WRITE:0,FULL_CONTROL:0};return h&&h.length&&s.each(h,function(A){A.Grantee.ID==="qcs::cam::anyone:anyone"||A.Grantee.URI==="http://cam.qcloud.com/groups/global/AllUsers"?m[A.Permission]=1:A.Grantee.ID!==n.Owner.ID&&o[r[A.Permission]].push('id="'+A.Grantee.ID+'"')}),m.FULL_CONTROL||m.WRITE&&m.READ?o.ACL="public-read-write":m.READ?o.ACL="public-read":o.ACL="private",s.each(r,function(A){o[A]=ct(o[A].join(","))}),o}function ct(n){var o=n.split(","),r={},u,h;for(u=0;u-1?m="{Region}.myqcloud.com":m="cos.{Region}.myqcloud.com",n.ForcePathStyle||(m="{Bucket}."+m)),m=m.replace(/\{\{AppId\}\}/gi,h).replace(/\{\{Bucket\}\}/gi,u).replace(/\{\{Region\}\}/gi,o).replace(/\{\{.*?\}\}/gi,""),m=m.replace(/\{AppId\}/gi,h).replace(/\{BucketName\}/gi,u).replace(/\{Bucket\}/gi,r).replace(/\{Region\}/gi,o).replace(/\{.*?\}/gi,""),/^[a-zA-Z]+:\/\//.test(m)||(m=B+"//"+m),m.slice(-1)==="/"&&(m=m.slice(0,-1));var H=m;return n.ForcePathStyle&&(H+="/"+r),H+="/",A&&(H+=s.camSafeUrlEncode(A).replace(/%2F/g,"/")),n.isLocation&&(H=H.replace(/^https?:\/\//,"")),H}var wt=function(o){if(!o.Bucket||!o.Region)return"";var r=o.UseAccelerate===void 0?this.options.UseAccelerate:o.UseAccelerate,u=o.Url||nt({ForcePathStyle:this.options.ForcePathStyle,protocol:this.options.Protocol,domain:this.options.Domain,bucket:o.Bucket,region:r?"accelerate":o.Region}),h=u.replace(/^https?:\/\/([^/]+)(\/.*)?$/,"$1");return h};function jt(n,o){var r=s.clone(n.Headers),u="";s.each(r,function(Te,Se){(Te===""||["content-type","cache-control","expires"].indexOf(Se.toLowerCase())>-1)&&delete r[Se],Se.toLowerCase()==="host"&&(u=Te)});var h=n.ForceSignHost!==!1;!u&&n.SignHost&&h&&(r.Host=n.SignHost);var m=!1,A=function(Se,Ae){m||(m=!0,Ae&&Ae.XCosSecurityToken&&!Ae.SecurityToken&&(Ae=s.clone(Ae),Ae.SecurityToken=Ae.XCosSecurityToken,delete Ae.XCosSecurityToken),o&&o(Se,Ae))},B=this,H=n.Bucket||"",pe=n.Region||"",ce=n.Key||"";B.options.ForcePathStyle&&H&&(ce=H+"/"+ce);var ve="/"+ce,Y={},be=n.Scope;if(!be){var Ve=n.Action||"",Ie=n.ResourceKey||n.Key||"";be=n.Scope||[{action:Ve,bucket:H,region:pe,prefix:Ie}]}var ze=s.md5(JSON.stringify(be));B._StsCache=B._StsCache||[],(function(){var Te,Se;for(Te=B._StsCache.length-1;Te>=0;Te--){Se=B._StsCache[Te];var Ae=Math.round(s.getSkewTime(B.options.SystemClockOffset)/1e3)+30;if(Se.StartTime&&Ae=Se.ExpiredTime){B._StsCache.splice(Te,1);continue}if(!Se.ScopeLimit||Se.ScopeLimit&&Se.ScopeKey===ze){Y=Se;break}}})();var Qe=function(){var Se="";Y.StartTime&&n.Expires?Se=Y.StartTime+";"+(Y.StartTime+n.Expires*1):Y.StartTime&&Y.ExpiredTime&&(Se=Y.StartTime+";"+Y.ExpiredTime);var Ae=s.getAuth({SecretId:Y.TmpSecretId,SecretKey:Y.TmpSecretKey,Method:n.Method,Pathname:ve,Query:n.Query,Headers:r,Expires:n.Expires,UseRawKey:B.options.UseRawKey,SystemClockOffset:B.options.SystemClockOffset,KeyTime:Se,ForceSignHost:h}),Me={Authorization:Ae,SecurityToken:Y.SecurityToken||Y.XCosSecurityToken||"",Token:Y.Token||"",ClientIP:Y.ClientIP||"",ClientUA:Y.ClientUA||"",SignFrom:"client"};A(null,Me)},Le=function(Se){if(Se.Authorization){var Ae=!1,Me=Se.Authorization;if(Me)if(Me.indexOf(" ")>-1)Ae=!1;else if(Me.indexOf("q-sign-algorithm=")>-1&&Me.indexOf("q-ak=")>-1&&Me.indexOf("q-sign-time=")>-1&&Me.indexOf("q-key-time=")>-1&&Me.indexOf("q-url-param-list=")>-1)Ae=!0;else try{Me=atob(Me),Me.indexOf("a=")>-1&&Me.indexOf("k=")>-1&&Me.indexOf("t=")>-1&&Me.indexOf("r=")>-1&&Me.indexOf("b=")>-1&&(Ae=!0)}catch(Tr){}if(!Ae)return s.error(new Error("getAuthorization callback params format error"))}else{if(!Se.TmpSecretId)return s.error(new Error('getAuthorization callback params missing "TmpSecretId"'));if(!Se.TmpSecretKey)return s.error(new Error('getAuthorization callback params missing "TmpSecretKey"'));if(!Se.SecurityToken&&!Se.XCosSecurityToken)return s.error(new Error('getAuthorization callback params missing "SecurityToken"'));if(!Se.ExpiredTime)return s.error(new Error('getAuthorization callback params missing "ExpiredTime"'));if(Se.ExpiredTime&&Se.ExpiredTime.toString().length!==10)return s.error(new Error('getAuthorization callback params "ExpiredTime" should be 10 digits'));if(Se.StartTime&&Se.StartTime.toString().length!==10)return s.error(new Error('getAuthorization callback params "StartTime" should be 10 StartTime'))}return!1};if(Y.ExpiredTime&&Y.ExpiredTime-s.getSkewTime(B.options.SystemClockOffset)/1e3>60)Qe();else if(B.options.getAuthorization)B.options.getAuthorization.call(B,{Bucket:H,Region:pe,Method:n.Method,Key:ce,Pathname:ve,Query:n.Query,Headers:r,Scope:be,SystemClockOffset:B.options.SystemClockOffset,ForceSignHost:h},function(Te){typeof Te=="string"&&(Te={Authorization:Te});var Se=Le(Te);if(Se)return A(Se);Te.Authorization?A(null,Te):(Y=Te||{},Y.Scope=be,Y.ScopeKey=ze,B._StsCache.push(Y),Qe())});else if(B.options.getSTS)B.options.getSTS.call(B,{Bucket:H,Region:pe},function(Te){Y=Te||{},Y.Scope=be,Y.ScopeKey=ze,Y.TmpSecretId||(Y.TmpSecretId=Y.SecretId),Y.TmpSecretKey||(Y.TmpSecretKey=Y.SecretKey);var Se=Le(Y);if(Se)return A(Se);B._StsCache.push(Y),Qe()});else return(function(){var Te="";B.options.StartTime&&n.Expires?Te=B.options.StartTime+";"+(B.options.StartTime+n.Expires*1):B.options.StartTime&&B.options.ExpiredTime&&(Te=B.options.StartTime+";"+B.options.ExpiredTime);var Se=s.getAuth({SecretId:n.SecretId||B.options.SecretId,SecretKey:n.SecretKey||B.options.SecretKey,Method:n.Method,Pathname:ve,Query:n.Query,Headers:r,Expires:n.Expires,KeyTime:Te,UseRawKey:B.options.UseRawKey,SystemClockOffset:B.options.SystemClockOffset,ForceSignHost:h}),Ae={Authorization:Se,SecurityToken:B.options.SecurityToken||B.options.XCosSecurityToken,SignFrom:"client"};return A(null,Ae),Ae})();return""}function Zt(n){var o=this,r=!1,u=!1,h=!1,m=n.headers&&(n.headers.date||n.headers.Date)||n.error&&n.error.ServerTime;try{var A=n.error.Code,B=n.error.Message;(A==="RequestTimeTooSkewed"||A==="AccessDenied"&&B==="Request has expired")&&(u=!0)}catch(pe){}if(n)if(u&&m){var H=Date.parse(m);this.options.CorrectClockSkew&&Math.abs(s.getSkewTime(this.options.SystemClockOffset)-H)>=3e4&&(console.error("error: Local time is too skewed."),this.options.SystemClockOffset=H-Date.now(),r=!0)}else Math.floor(n.statusCode/100)===5?r=!0:n.message==="CORS blocked or network error"&&(h=!0,r=o.options.AutoSwitchHost);return{canRetry:r,networkError:h}}function qt(n){var o=n.requestUrl,r=n.clientCalcSign,u=n.networkError;if(!this.options.AutoSwitchHost||!o||!r||!u)return!1;var h=/^https?:\/\/[^\/]*\.cos\.[^\/]*\.myqcloud\.com(\/.*)?$/,m=/^https?:\/\/[^\/]*\.cos\.accelerate\.myqcloud\.com(\/.*)?$/,A=h.test(o)&&!m.test(o);return A}function se(n,o){var r=this;!n.headers&&(n.headers={}),!n.qs&&(n.qs={}),n.VersionId&&(n.qs.versionId=n.VersionId),n.qs=s.clearKey(n.qs),n.headers&&(n.headers=s.clearKey(n.headers)),n.qs&&(n.qs=s.clearKey(n.qs));var u=s.clone(n.qs);n.action&&(u[n.action]="");var h=n.url||n.Url,m=n.SignHost||wt.call(this,{Bucket:n.Bucket,Region:n.Region,Url:h}),A=n.tracker,B=function H(pe){var ce=r.options.SystemClockOffset;A&&A.setParams({signStartTime:new Date().getTime(),httpRetryTimes:pe-1}),n.SwitchHost&&(m=m.replace(/myqcloud.com/,"tencentcos.cn")),jt.call(r,{Bucket:n.Bucket||"",Region:n.Region||"",Method:n.method,Key:n.Key,Query:u,Headers:n.headers,SignHost:m,Action:n.Action,ResourceKey:n.ResourceKey,Scope:n.Scope,ForceSignHost:r.options.ForceSignHost,SwitchHost:n.SwitchHost},function(ve,Y){if(ve){o(ve);return}A&&A.setParams({signEndTime:new Date().getTime(),httpStartTime:new Date().getTime()}),n.AuthData=Y,$t.call(r,n,function(be,Ve){A&&A.setParams({httpEndTime:new Date().getTime()});var Ie=!1,ze=!1;if(be){var Qe=Zt.call(r,be);Ie=Qe.canRetry||ce!==r.options.SystemClockOffset,ze=Qe.networkError}if(be&&pe<2&&Ie){n.headers&&(delete n.headers.Authorization,delete n.headers.token,delete n.headers.clientIP,delete n.headers.clientUA,n.headers["x-cos-security-token"]&&delete n.headers["x-cos-security-token"],n.headers["x-ci-security-token"]&&delete n.headers["x-ci-security-token"]);var Le=qt.call(r,{requestUrl:(be==null?void 0:be.url)||"",clientCalcSign:Y.SignFrom==="client",networkError:ze});n.SwitchHost=Le,H(pe+1)}else o(be,Ve)})})};B(1)}function $t(n,o){var r=this,u=n.TaskId;if(!(u&&!r._isRunningTask(u))){var h=n.Bucket,m=n.Region,A=n.Key,B=n.method||"GET",H=n.Url||n.url,pe=n.body,ce=n.rawBody;r.options.UseAccelerate&&(m="accelerate"),H=H||nt({ForcePathStyle:r.options.ForcePathStyle,protocol:r.options.Protocol,domain:r.options.Domain,bucket:h,region:m,object:A}),n.SwitchHost&&(H=H.replace(/myqcloud.com/,"tencentcos.cn"));var ve=A?H:"";n.action&&(H=H+"?"+(s.isIOS_QQ?"".concat(n.action,"="):n.action)),n.qsStr&&(H.indexOf("?")>-1?H=H+"&"+n.qsStr:H=H+"?"+n.qsStr);var Y={method:B,url:H,headers:n.headers,qs:n.qs,body:pe},be="x-cos-security-token";if(s.isCIHost(H)&&(be="x-ci-security-token"),Y.headers.Authorization=n.AuthData.Authorization,n.AuthData.Token&&(Y.headers.token=n.AuthData.Token),n.AuthData.ClientIP&&(Y.headers.clientIP=n.AuthData.ClientIP),n.AuthData.ClientUA&&(Y.headers.clientUA=n.AuthData.ClientUA),n.AuthData.SecurityToken&&(Y.headers[be]=n.AuthData.SecurityToken),Y.headers&&(Y.headers=s.clearKey(Y.headers)),Y=s.clearKey(Y),n.onProgress&&typeof n.onProgress=="function"){var Ve=pe&&(pe.size||pe.length)||0;Y.onProgress=function(Ae){if(!(u&&!r._isRunningTask(u))){var Me=Ae?Ae.loaded:0;n.onProgress({loaded:Me,total:Ve})}}}n.onDownloadProgress&&(Y.onDownloadProgress=n.onDownloadProgress),n.DataType&&(Y.dataType=n.DataType),this.options.Timeout&&(Y.timeout=this.options.Timeout),r.options.ForcePathStyle&&(Y.pathStyle=r.options.ForcePathStyle),r.emit("before-send",Y);var Ie=Y.url.includes("accelerate."),ze=Y.qs?Object.keys(Y.qs).map(function(Ae){return"".concat(Ae,"=").concat(Y.qs[Ae])}).join("&"):"",Qe=ze?Y.url+"?"+ze:Y.url;if(n.tracker){var Le;n.tracker.setParams({url:Qe,httpMethod:Y.method,accelerate:Ie,httpSize:((Le=Y.body)===null||Le===void 0?void 0:Le.size)||0}),n.tracker.parent&&!n.tracker.parent.params.url&&n.tracker.parent.setParams({url:ve,accelerate:Ie})}var Te=(r.options.Request||i)(Y,function(Ae){if(!(Ae&&Ae.error==="abort")){var Me={options:Y,error:Ae&&Ae.error,statusCode:Ae&&Ae.statusCode||0,statusMessage:Ae&&Ae.statusMessage||"",headers:Ae&&Ae.headers||{},body:Ae&&Ae.body};r.emit("after-receive",Me);var Tr=Me.error,tr=Me.body,yt={statusCode:Me.statusCode,statusMessage:Me.statusMessage,headers:Me.headers},mn,Ct=function(At,Ge){if(u&&r.off("inner-kill-task",Se),!mn){mn=!0;var Pt={};if(yt&&yt.statusCode&&(Pt.statusCode=yt.statusCode),yt&&yt.headers&&(Pt.headers=yt.headers),At)Y.url&&(Pt.url=Y.url),Y.method&&(Pt.method=Y.method),At=s.extend(At||{},Pt),o(At,null);else{if(n.Action==="name/cos:PutObject"){var Br={};for(var bn in n.headers){var wi=bn.toLowerCase();Br[wi]=n.headers[bn]}Br["x-cos-callback"]?Ge.Error?(Ge.CallbackError=s.clone(Ge.Error),delete Ge.Error):Ge.CallbackBody=s.clone(Ge):Br["x-cos-return-body"]&&(Ge.Error?(Ge.ReturnError=s.clone(Ge.Error),delete Ge.Error):Ge.ReturnBody=s.clone(Ge))}Ge=s.extend(Ge||{},Pt),o(null,Ge)}Te=null}};if(Tr)return Ct(s.error(Tr));var rr=yt.statusCode,yn=Math.floor(rr/100)===2;if(ce){if(yn)return Ct(null,{body:tr});if(tr instanceof Blob){s.readAsBinaryString(tr,function(vn){var At=s.parseResBody(vn),Ge=At.Error||At;return Ct(s.error(new Error(Ge.Message||"response body error"),{code:Ge.Code,error:Ge}))});return}}var Rr=s.parseResBody(tr),nr=Rr.Error||Rr;yn?Ct(null,Rr):nr?Ct(s.error(new Error(nr.Message),{code:nr.Code,error:nr})):rr?Ct(s.error(new Error(yt.statusMessage),{code:""+rr})):rr&&Ct(s.error(new Error("statusCode error")))}}),Se=function Ae(Me){Me.TaskId===u&&(Te&&Te.abort&&Te.abort(),r.off("inner-kill-task",Ae))};u&&r.on("inner-kill-task",Se)}}var Bt={getService:l,putBucket:d,headBucket:w,getBucket:v,deleteBucket:S,putBucketAcl:x,getBucketAcl:k,putBucketCors:N,getBucketCors:R,deleteBucketCors:F,getBucketLocation:j,getBucketPolicy:J,putBucketPolicy:M,deleteBucketPolicy:_,putBucketTagging:P,getBucketTagging:E,deleteBucketTagging:I,putBucketLifecycle:p,getBucketLifecycle:f,deleteBucketLifecycle:y,putBucketVersioning:g,getBucketVersioning:b,putBucketReplication:C,getBucketReplication:L,deleteBucketReplication:D,putBucketWebsite:z,getBucketWebsite:G,deleteBucketWebsite:Z,putBucketReferer:re,getBucketReferer:$,putBucketDomain:K,getBucketDomain:oe,deleteBucketDomain:ie,putBucketOrigin:ge,getBucketOrigin:ne,deleteBucketOrigin:Q,putBucketLogging:ue,getBucketLogging:ee,putBucketInventory:de,postBucketInventory:ae,getBucketInventory:le,listBucketInventory:me,deleteBucketInventory:fe,putBucketAccelerate:De,getBucketAccelerate:Ce,putBucketEncryption:ye,getBucketEncryption:Fe,deleteBucketEncryption:Ue,getObject:Je,headObject:Re,listObjectVersions:it,putObject:We,deleteObject:je,getObjectAcl:V,putObjectAcl:T,optionsObject:U,putObjectCopy:O,deleteMultipleObject:X,restoreObject:he,putObjectTagging:we,getObjectTagging:Ee,deleteObjectTagging:ke,selectObjectContent:Be,appendObject:st,uploadPartCopy:W,multipartInit:qe,multipartUpload:Pe,multipartComplete:He,multipartList:rt,multipartListPart:Ze,multipartAbort:xe,request:ot,getObjectUrl:Rt,getAuth:gt};function er(n,o,r){s.each(["Cors","Acl"],function(u){if(n.slice(-u.length)===u){var h=n.slice(0,-u.length)+u.toUpperCase(),m=s.apiWrapper(n,o),A=!1;r[h]=function(){!A&&console.warn("warning: cos."+h+" has been deprecated. Please Use cos."+n+" instead."),A=!0,m.apply(this,arguments)}}})}a.exports.init=function(n,o){o.transferToTaskMethod(Bt,"putObject"),s.each(Bt,function(r,u){n.prototype[u]=s.apiWrapper(u,r),er(u,r,n.prototype)})}}),"./src/cos.js":(function(a,c,e){"use strict";var t=e("./src/util.js"),i=e("./src/event.js"),s=e("./src/task.js"),l=e("./src/base.js"),d=e("./src/advance.js"),w=e("./package.json"),v={AppId:"",SecretId:"",SecretKey:"",SecurityToken:"",StartTime:0,ExpiredTime:0,ChunkRetryTimes:2,FileParallelLimit:3,ChunkParallelLimit:3,ChunkSize:1024*1024,SliceSize:1024*1024,CopyChunkParallelLimit:20,CopyChunkSize:1024*1024*10,CopySliceSize:1024*1024*10,MaxPartNumber:1e4,ProgressInterval:1e3,Domain:"",ServiceDomain:"",Protocol:"",CompatibilityMode:!1,ForcePathStyle:!1,UseRawKey:!1,Timeout:0,CorrectClockSkew:!0,SystemClockOffset:0,UploadCheckContentMd5:!1,UploadQueueSize:1e4,UploadAddMetaMd5:!1,UploadIdCacheLimit:50,UseAccelerate:!1,ForceSignHost:!0,AutoSwitchHost:!0,CopySourceParser:null,ObjectKeySimplifyCheck:!0,DeepTracker:!1,TrackerDelay:5e3,CustomId:"",BeaconReporter:null,ClsReporter:null},S=function(k){if(this.options=t.extend(t.clone(v),k||{}),this.options.FileParallelLimit=Math.max(1,this.options.FileParallelLimit),this.options.ChunkParallelLimit=Math.max(1,this.options.ChunkParallelLimit),this.options.ChunkRetryTimes=Math.max(0,this.options.ChunkRetryTimes),this.options.ChunkSize=Math.max(1024*1024,this.options.ChunkSize),this.options.CopyChunkParallelLimit=Math.max(1,this.options.CopyChunkParallelLimit),this.options.CopyChunkSize=Math.max(1024*1024,this.options.CopyChunkSize),this.options.CopySliceSize=Math.max(0,this.options.CopySliceSize),this.options.MaxPartNumber=Math.max(1024,Math.min(1e4,this.options.MaxPartNumber)),this.options.Timeout=Math.max(0,this.options.Timeout),this.options.EnableReporter=this.options.BeaconReporter||this.options.ClsReporter,this.options.AppId&&console.warn('warning: AppId has been deprecated, Please put it at the end of parameter Bucket(E.g: "test-1250000000").'),this.options.SecretId&&this.options.SecretId.indexOf(" ")>-1&&(console.error("error: SecretId\u683C\u5F0F\u9519\u8BEF\uFF0C\u8BF7\u68C0\u67E5"),console.error("error: SecretId format is incorrect. Please check")),this.options.SecretKey&&this.options.SecretKey.indexOf(" ")>-1&&(console.error("error: SecretKey\u683C\u5F0F\u9519\u8BEF\uFF0C\u8BF7\u68C0\u67E5"),console.error("error: SecretKey format is incorrect. Please check")),t.isNode()&&(console.log("Tip: Next.js\u3001Nuxt.js \u7B49\u670D\u52A1\u7AEF\u6E32\u67D3\u6280\u672F\u53EF\u6B63\u5E38\u4F7F\u7528JavaScript SDK\uFF0C\u8BF7\u5FFD\u7565\u4E0B\u65B9 nodejs \u73AF\u5883\u8B66\u544A"),console.warn("warning: cos-js-sdk-v5 \u4E0D\u652F\u6301 nodejs \u73AF\u5883\u4F7F\u7528\uFF0C\u8BF7\u6539\u7528 cos-nodejs-sdk-v5\uFF0C\u53C2\u8003\u6587\u6863\uFF1A https://cloud.tencent.com/document/product/436/8629"),console.warn("warning: cos-js-sdk-v5 does not support nodejs environment. Please use cos-nodejs-sdk-v5 instead. See: https://cloud.tencent.com/document/product/436/8629")),this.options.ForcePathStyle)throw console.warn("cos-js-sdk-v5\u4E0D\u518D\u652F\u6301\u4F7F\u7528path-style\uFF0C\u4EC5\u652F\u6301\u4F7F\u7528virtual-hosted-style\uFF0C\u53C2\u8003\u6587\u6863\uFF1Ahttps://cloud.tencent.com/document/product/436/96243"),new Error("ForcePathStyle is not supported");i.init(this),s.init(this)};l.init(S,s),d.init(S,s),S.util={md5:t.md5,xml2json:t.xml2json,json2xml:t.json2xml,encodeBase64:t.encodeBase64},S.getAuthorization=t.getAuth,S.version=w.version,a.exports=S}),"./src/event.js":(function(a,c){var e=function(s){var l={},d=function(v){return!l[v]&&(l[v]=[]),l[v]};s.on=function(w,v){w==="task-list-update"&&console.warn('warning: Event "'+w+'" has been deprecated. Please use "list-update" instead.'),d(w).push(v)},s.off=function(w,v){for(var S=d(w),x=S.length-1;x>=0;x--)v===S[x]&&S.splice(x,1)},s.emit=function(w,v){for(var S=d(w).map(function(k){return k}),x=0;x=0;j--){var M=l[j][2];(!M||M+s=0;M--){var J=l[M];J[0]===R&&J[1]===F&&l.splice(M,1)}l.unshift([R,F,Math.round(Date.now()/1e3)]),l.length>j&&l.splice(j),x()}},removeUploadId:function(R){S.call(this),delete k.using[R];for(var F=l.length-1;F>=0;F--)l[F][1]===R&&l.splice(F,1);x()}};a.exports=k}),"./src/task.js":(function(a,c,e){var t=e("./src/session.js"),i=e("./src/util.js"),s={},l=function(v,S){s[S]=v[S],v[S]=function(x,k){x.SkipTask?s[S].call(this,x,k):this._addTask(S,x,k)}},d=function(v){var S=[],x={},k=0,N=0,R=function(E){var I={id:E.id,Bucket:E.Bucket,Region:E.Region,Key:E.Key,FilePath:E.FilePath,state:E.state,loaded:E.loaded,size:E.size,speed:E.speed,percent:E.percent,hashPercent:E.hashPercent,error:E.error};return E.FilePath&&(I.FilePath=E.FilePath),E._custom&&(I._custom=E._custom),I},F=(function(){var P,E=function(){P=0,v.emit("task-list-update",{list:i.map(S,R)}),v.emit("list-update",{list:i.map(S,R)})};return function(){P||(P=setTimeout(E))}})(),j=function(){if(!(S.length<=v.options.UploadQueueSize)){for(var E=0;Ev.options.UploadQueueSize;){var I=S[E].state==="waiting"||S[E].state==="checking"||S[E].state==="uploading";!S[E]||!I?(x[S[E].id]&&delete x[S[E].id],S.splice(E,1),N--):E++}F()}},M=function P(){if(!(k>=v.options.FileParallelLimit)){for(;S[N]&&S[N].state!=="waiting";)N++;if(!(N>=S.length)){var E=S[N];N++,k++,E.state="checking",E.params.onTaskStart&&E.params.onTaskStart(R(E)),!E.params.UploadData&&(E.params.UploadData={});var I=i.formatParams(E.api,E.params);s[E.api].call(v,I,function(p,f){v._isRunningTask(E.id)&&((E.state==="checking"||E.state==="uploading")&&(E.state=p?"error":"success",p&&(E.error=p),k--,F(),P(),E.callback&&E.callback(p,f),E.state==="success"&&(E.params&&(delete E.params.UploadData,delete E.params.Body,delete E.params),delete E.callback)),j())}),F(),setTimeout(P)}}},J=function(E,I){var p=x[E];if(p){var f=p&&p.state==="waiting",y=p&&(p.state==="checking"||p.state==="uploading");if(I==="canceled"&&p.state!=="canceled"||I==="paused"&&f||I==="paused"&&y){p.state=I,v.emit("inner-kill-task",{TaskId:E,toState:I});try{var g=p&&p.params&&p.params.UploadData.UploadId}catch(b){}I==="canceled"&&g&&t.removeUsing(g),F(),y&&(k--,M()),I==="canceled"&&(p.params&&(delete p.params.UploadData,delete p.params.Body,delete p.params),delete p.callback)}j()}};v._addTasks=function(P){i.each(P,function(E){v._addTask(E.api,E.params,E.callback,!0)}),F()};var _=!0;v._addTask=function(P,E,I,p){E=i.formatParams(P,E);var f=i.uuid();E.TaskId=f,E.onTaskReady&&E.onTaskReady(f),E.TaskReady&&(E.TaskReady(f),_&&console.warn('warning: Param "TaskReady" has been deprecated. Please use "onTaskReady" instead.'),_=!1);var y={params:E,callback:I,api:P,index:S.length,id:f,Bucket:E.Bucket,Region:E.Region,Key:E.Key,FilePath:E.FilePath||"",state:"waiting",loaded:0,size:0,speed:0,percent:0,hashPercent:0,error:null,_custom:E._custom},g=E.onHashProgress;E.onHashProgress=function(C){v._isRunningTask(y.id)&&(y.hashPercent=C.percent,g&&g(C),F())};var b=E.onProgress;return E.onProgress=function(C){v._isRunningTask(y.id)&&(y.state==="checking"&&(y.state="uploading"),y.loaded=C.loaded,y.speed=C.speed,y.percent=C.percent,b&&b(C),F())},i.getFileSize(P,E,function(C,L){if(C)return I(i.error(C));x[f]=y,S.push(y),y.size=L,!p&&F(),M(),j()}),f},v._isRunningTask=function(P){var E=x[P];return!!(E&&(E.state==="checking"||E.state==="uploading"))},v.getTaskList=function(){return i.map(S,R)},v.cancelTask=function(P){J(P,"canceled")},v.pauseTask=function(P){J(P,"paused")},v.restartTask=function(P){var E=x[P];E&&(E.state==="paused"||E.state==="error")&&(E.state="waiting",F(),N=Math.min(N,E.index),M())},v.isUploadRunning=function(){return k||N=0||I.indexOf("wow32")>=0?"win32":I.indexOf("win64")>=0||I.indexOf("wow64")>=0?"win64":p?"mac":"unknown os"},isMobile:function(){var I=/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i;return!!((typeof navigator=="undefined"?"undefined":s(navigator))==="object"&&navigator.userAgent.match(I))},isAndroid:function(){var I=/(Android|Adr|Linux)/i;return!!((typeof navigator=="undefined"?"undefined":s(navigator))==="object"&&navigator.userAgent.match(I))},isIOS:function(){var I=/(iPhone|iPod|iPad|iOS)/i;return!!((typeof navigator=="undefined"?"undefined":s(navigator))==="object"&&navigator.userAgent.match(I))},isOtherMobile:function(){return x&&!isAndroid&&!isIOS},getUA:function(){if((typeof navigator=="undefined"?"undefined":s(navigator))!=="object")return"unknown device";var I=navigator.userAgent;return I}},x=S.isMobile(),k=S.isAndroid()?"android":S.isIOS?"ios":"other_mobile",N=S.getOsType(),R=x?k:N,F=S.getUA(),j=S.getProtocol(),M=function(I){return["putObject","sliceUploadFile","uploadFile","uploadFiles"].includes(I)?"UploadTask":I==="getObject"?"DownloadTask":["putObjectCopy","sliceCopyFile"].includes(I)?"CopyTask":I};function J(E){return E.replace(/([A-Z])/g,"_$1").toLowerCase()}function _(E){var I={},p=["sdkVersionName","sdkVersionCode","osName","networkType","requestName","requestResult","bucket","region","appid","accelerate","url","host","requestPath","userAgent","networkProtocol","httpMethod","httpSize","httpSpeed","httpTookTime","httpMd5","httpSign","httpFullTime","httpDomain","partNumber","httpRetryTimes","customId","traceId","realApi"],f=[].concat(p,["errorNode","errorCode","errorName","errorMessage","errorRequestId","errorHttpCode","errorServiceName","errorType","fullError"]),y=E.requestResult==="Success"?p:f;for(var g in E)if(y.includes(g)){var b=J(g);I[b]=E[g]}return I.request_name=E.realApi?M(E.realApi):E.requestName,I}var P=(function(){"use strict";function E(I){t(this,E);var p=I.parent,f=I.traceId,y=I.bucket,g=I.region,b=I.apiName,C=I.realApi,L=I.httpMethod,D=I.fileKey,z=I.fileSize,G=I.accelerate,Z=I.customId,re=I.delay,$=I.deepTracker,K=I.Beacon,oe=I.clsReporter,ie=y&&y.substr(y.lastIndexOf("-")+1)||"";this.parent=p,this.deepTracker=$,this.delay=re,oe&&!this.clsReporter&&(this.clsReporter=oe),this.params={sdkVersionName:"cos-js-sdk-v5",sdkVersionCode:l.version,osName:R,networkType:"",requestName:b||"",requestResult:"",realApi:C,bucket:y,region:g,accelerate:G,httpMethod:L,url:"",host:"",httpDomain:"",requestPath:D||"",userAgent:F,networkProtocol:j,errorType:"",errorCode:"",errorName:"",errorMessage:"",errorRequestId:"",errorHttpCode:0,errorServiceName:"",errorNode:"",httpTookTime:0,httpSize:z||0,httpMd5:0,httpSign:0,httpFullTime:0,httpSpeed:0,md5StartTime:0,md5EndTime:0,signStartTime:0,signEndTime:0,httpStartTime:0,httpEndTime:0,startTime:new Date().getTime(),endTime:0,traceId:f||S.getUid(),appid:ie,partNumber:0,httpRetryTimes:0,customId:Z||"",partTime:0},K&&(this.beacon=w(K,re))}return i(E,[{key:"formatResult",value:function(p,f){var y,g,b,C,L,D,z=new Date().getTime(),G=S.getNetType(),Z=p?(p==null?void 0:p.code)||(p==null||(y=p.error)===null||y===void 0?void 0:y.code)||(p==null||(g=p.error)===null||g===void 0?void 0:g.Code):"",re=p?(p==null?void 0:p.message)||(p==null||(b=p.error)===null||b===void 0?void 0:b.message)||(p==null||(C=p.error)===null||C===void 0?void 0:C.Message):"",$=re,K=p?(p==null?void 0:p.resource)||(p==null||(L=p.error)===null||L===void 0?void 0:L.resource)||(p==null||(D=p.error)===null||D===void 0?void 0:D.Resource):"",oe=p?p==null?void 0:p.statusCode:f.statusCode,ie=p?(p==null?void 0:p.headers)&&(p==null?void 0:p.headers["x-cos-request-id"]):(f==null?void 0:f.headers)&&(f==null?void 0:f.headers["x-cos-request-id"]),ge=p?ie?"Server":"Client":"";this.params.requestName==="getObject"&&(this.params.httpSize=f?f.headers&&f.headers["content-length"]:0);var ne=this.params.realApi==="sliceUploadFile",Q=this.params.realApi==="sliceCopyFile";if(ne||Q){var ue=this.params.httpSize/1024/this.params.partTime;Object.assign(this.params,{httpSpeed:ue<0?0:ue.toFixed(3)})}else{var ee=z-this.params.startTime,te=this.params.httpEndTime-this.params.httpStartTime,de=this.params.httpSize/1024/(te/1e3),ae=this.params.md5EndTime-this.params.md5StartTime,le=this.params.signEndTime-this.params.signStartTime;this.parent&&(this.parent.addParamValue("httpTookTime",v(te)),this.parent.addParamValue("httpFullTime",v(ee)),this.parent.addParamValue("httpMd5",v(ae)),this.parent.addParamValue("httpSign",v(le)),["multipartUpload","uploadPartCopy","putObjectCopy"].includes(this.params.requestName)&&this.parent.addParamValue("partTime",v(te))),Object.assign(this.params,{httpFullTime:v(ee),httpMd5:v(ae),httpSign:v(le),httpTookTime:v(te),httpSpeed:de<0?0:de.toFixed(3)})}if(Object.assign(this.params,{networkType:G,requestResult:p?"Failure":"Success",errorType:ge,errorCode:Z,errorHttpCode:oe,errorName:$,errorMessage:re,errorServiceName:K,errorRequestId:ie}),p&&(!Z||!re)&&(this.params.fullError=p?JSON.stringify(p):""),this.params.url){try{var me=/^http(s)?:\/\/(.*?)\//.exec(this.params.url);this.params.host=me[2]}catch(fe){this.params.host=this.params.url}this.params.httpDomain=this.params.host}}},{key:"report",value:function(p,f){if(!(!this.beacon&&!this.clsReporter)){this.formatResult(p,f);var y=_(this.params);this.beacon&&this.sendEventsToBeacon(y),this.clsReporter&&this.sendEventsToCLS(y)}}},{key:"setParams",value:function(p){Object.assign(this.params,p)}},{key:"addParamValue",value:function(p,f){this.params[p]=(+this.params[p]+ +f).toFixed(3)}},{key:"sendEventsToBeacon",value:function(p){var f=this.params.requestName==="sliceUploadFile"||this.params.realApi==="sliceUploadFile";if(!(f&&!this.deepTracker)){var y="qcloud_track_cos_sdk";this.delay===0?this.beacon&&this.beacon.onDirectUserAction(y,p):this.beacon&&this.beacon.onUserAction(y,p)}}},{key:"sendEventsToCLS",value:function(p){var f=this.delay===0;this.clsReporter.log(p,f)}},{key:"generateSubTracker",value:function(p){return Object.assign(p,{parent:this,deepTracker:this.deepTracker,traceId:this.params.traceId,bucket:this.params.bucket,region:this.params.region,accelerate:this.params.accelerate,fileKey:this.params.requestPath,customId:this.params.customId,delay:this.delay,clsReporter:this.clsReporter}),new E(p)}}]),E})();a.exports=P}),"./src/util.js":(function(a,c,e){"use strict";(function(t){var i=e("./node_modules/@babel/runtime/helpers/typeof.js");function s(V,T){var U=typeof Symbol!="undefined"&&V[Symbol.iterator]||V["@@iterator"];if(!U){if(Array.isArray(V)||(U=l(V))||T&&V&&typeof V.length=="number"){U&&(V=U);var O=0,W=function(){};return{s:W,n:function(){return O>=V.length?{done:!0}:{done:!1,value:V[O++]}},e:function(ke){throw ke},f:W}}throw new TypeError(`Invalid attempt to iterate non-iterable instance.
-In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var X=!0,he=!1,we;return{s:function(){U=U.call(V)},n:function(){var ke=U.next();return X=ke.done,ke},e:function(ke){he=!0,we=ke},f:function(){try{!X&&U.return!=null&&U.return()}finally{if(he)throw we}}}}function l(V,T){if(V){if(typeof V=="string")return d(V,T);var U=Object.prototype.toString.call(V).slice(8,-1);if(U==="Object"&&V.constructor&&(U=V.constructor.name),U==="Map"||U==="Set")return Array.from(V);if(U==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(U))return d(V,T)}}function d(V,T){(T==null||T>V.length)&&(T=V.length);for(var U=0,O=new Array(T);UX?1:-1})}var j=function(T,U){var O,W,X,he=[],we=F(T);for(O=0;O-1||M.indexOf(W)>-1)&&(U[O]=T[O])}return U},_=function(T){T=T||{};var U=T.SecretId,O=T.SecretKey,W=T.KeyTime,X=(T.method||T.Method||"get").toLowerCase(),he=G(T.Query||T.params||{}),we=J(G(T.Headers||T.headers||{})),Ee=T.Key||"",ke;T.UseRawKey?ke=T.Pathname||T.pathname||"/"+Ee:(ke=T.Pathname||T.pathname||Ee,ke.indexOf("/")!==0&&(ke="/"+ke));var Be=T.ForceSignHost!==!1;if(!we.Host&&!we.host&&T.Bucket&&T.Region&&Be&&(we.Host=T.Bucket+".cos."+T.Region+".myqcloud.com"),!U)throw new Error("missing param SecretId");if(!O)throw new Error("missing param SecretKey");var qe=Math.round(me(T.SystemClockOffset)/1e3)-1,Pe=qe,He=T.Expires||T.expires;He===void 0?Pe+=900:Pe+=He*1||0;var rt="sha1",Ze=U,xe=W||qe+";"+Pe,ot=W||qe+";"+Pe,st=F(we,!0).join(";").toLowerCase(),gt=F(he,!0).join(";").toLowerCase(),Rt=v.HmacSHA1(ot,O).toString(),mt=[X,ke,je.obj2str(he,!0),je.obj2str(we,!0),""].join(`
-`),ct=["sha1",xe,v.SHA1(mt).toString(),""].join(`
-`),nt=v.HmacSHA1(ct,Rt).toString(),wt=["q-sign-algorithm="+rt,"q-ak="+Ze,"q-sign-time="+xe,"q-key-time="+ot,"q-header-list="+st,"q-url-param-list="+gt,"q-signature="+nt].join("&");return wt},P=function(T,U,O){var W=U/8,X=T.slice(O,O+W);return new Uint8Array(X).reverse(),new{8:Uint8Array,16:Uint16Array,32:Uint32Array}[U](X)[0]},E=function(T,U,O,W){var X=T.slice(U,O),he="";return new Uint8Array(X).forEach(function(we){he+=String.fromCharCode(we)}),W&&(he=decodeURIComponent(escape(he))),he},I=function(T){for(var U={},O=E(T),W={records:[]};T.byteLength;){var X=P(T,32,0),he=P(T,32,4),we=X-he-16,Ee=0,ke;for(T=T.slice(12);EeparseInt(W[X])?1:-1;return 0},T=function(O){if(!O)return!1;var W=(O.match(/Chrome\/([.\d]+)/)||[])[1],X=(O.match(/QBCore\/([.\d]+)/)||[])[1],he=(O.match(/QQBrowser\/([.\d]+)/)||[])[1],we=W&&V(W,"53.0.2785.116")<0&&X&&V(X,"3.53.991.400")<0&&he&&V(he,"9.0.2524.400")<=0||!1;return we};return T(typeof navigator!="undefined"&&navigator.userAgent)})(),C=function(T,U,O,W,X){var he;if(T.slice?he=T.slice(U,O):T.mozSlice?he=T.mozSlice(U,O):T.webkitSlice&&(he=T.webkitSlice(U,O)),W&&b){var we=new FileReader;we.onload=function(Ee){he=null,X(new Blob([we.result]))},we.readAsArrayBuffer(he)}else X(he)},L=function(T,U,O,W){O=O||f,T?typeof U=="string"?O(je.md5(U,!0)):Blob&&U instanceof Blob?je.getFileMd5(U,function(X,he){O(he)},W):O():O()},D=1024*1024,z=function(T,U,O){var W=T.size,X=0,he=w.getCtx(),we=function Ee(ke){if(ke>=W){var Be=he.digest("hex");U(null,Be);return}var qe=Math.min(W,ke+D);je.fileSlice(T,ke,qe,!1,function(Pe){g(Pe,function(He){Pe=null,he=he.update(He,!0),X+=He.length,He=null,O&&O({loaded:X,total:W,percent:Math.round(X/W*1e4)/1e4}),Ee(ke+D)})})};we(0)};function G(V){return ge(V,function(T){return i(T)==="object"&&T!==null?G(T):T})}function Z(V,T,U){return V&&T in V?V[T]:U}function re(V,T){return ie(T,function(U,O){V[O]=T[O]}),V}function $(V){return V instanceof Array}function K(V,T){for(var U=!1,O=0;O-1,Ee=!he||typeof he=="string"&&he.indexOf("{Region}")>-1;if(T.indexOf("Bucket")>-1||T==="deleteMultipleObject"||T==="multipartList"||T==="listObjectVersions"){if(we&&!O)return"Bucket";if(Ee&&!W)return"Region"}else if(T.indexOf("Object")>-1||T.indexOf("multipart")>-1||T==="sliceUploadFile"||T==="abortUploadTask"||T==="uploadFile"){if(we&&!O)return"Bucket";if(Ee&&!W)return"Region";if(!X)return"Key"}return!1},te=function(T,U){if(U=re({},U),T!=="getAuth"&&T!=="getV4Auth"&&T!=="getObjectUrl"){var O=U.Headers||{};if(U&&i(U)==="object"){(function(){for(var X in U)U.hasOwnProperty(X)&&X.indexOf("x-cos-")>-1&&(O[X]=U[X])})();var W={"x-cos-mfa":"MFA","Content-MD5":"ContentMD5","Content-Length":"ContentLength","Content-Type":"ContentType",Expect:"Expect",Expires:"Expires","Cache-Control":"CacheControl","Content-Disposition":"ContentDisposition","Content-Encoding":"ContentEncoding",Range:"Range","If-Modified-Since":"IfModifiedSince","If-Unmodified-Since":"IfUnmodifiedSince","If-Match":"IfMatch","If-None-Match":"IfNoneMatch","x-cos-copy-source":"CopySource","x-cos-copy-source-Range":"CopySourceRange","x-cos-metadata-directive":"MetadataDirective","x-cos-copy-source-If-Modified-Since":"CopySourceIfModifiedSince","x-cos-copy-source-If-Unmodified-Since":"CopySourceIfUnmodifiedSince","x-cos-copy-source-If-Match":"CopySourceIfMatch","x-cos-copy-source-If-None-Match":"CopySourceIfNoneMatch","x-cos-acl":"ACL","x-cos-grant-read":"GrantRead","x-cos-grant-write":"GrantWrite","x-cos-grant-full-control":"GrantFullControl","x-cos-grant-read-acp":"GrantReadAcp","x-cos-grant-write-acp":"GrantWriteAcp","x-cos-storage-class":"StorageClass","x-cos-traffic-limit":"TrafficLimit","x-cos-mime-limit":"MimeLimit","x-cos-server-side-encryption-customer-algorithm":"SSECustomerAlgorithm","x-cos-server-side-encryption-customer-key":"SSECustomerKey","x-cos-server-side-encryption-customer-key-MD5":"SSECustomerKeyMD5","x-cos-server-side-encryption":"ServerSideEncryption","x-cos-server-side-encryption-cos-kms-key-id":"SSEKMSKeyId","x-cos-server-side-encryption-context":"SSEContext","Pic-Operations":"PicOperations","x-cos-callback":"Callback","x-cos-callback-var":"CallbackVar","x-cos-return-body":"ReturnBody"};je.each(W,function(X,he){U[X]!==void 0&&(O[he]=U[X])}),U.Headers=y(O)}}return U},de=function(T,U){return function(O,W){var X=this;typeof O=="function"&&(W=O,O={}),O=te(T,O);var he;if(X.options.EnableReporter)if(O.calledBySdk==="sliceUploadFile"||O.calledBySdk==="sliceCopyFile")he=O.tracker&&O.tracker.generateSubTracker({apiName:T});else if(["uploadFile","uploadFiles"].includes(T))he=null;else{var we=0;O.Body&&(we=typeof O.Body=="string"?O.Body.length:O.Body.size||O.Body.byteLength||0);var Ee=X.options.UseAccelerate||typeof X.options.Domain=="string"&&X.options.Domain.includes("accelerate.");he=new N({Beacon:X.options.BeaconReporter,clsReporter:X.options.ClsReporter,bucket:O.Bucket,region:O.Region,apiName:T,realApi:T,accelerate:Ee,fileKey:O.Key,fileSize:we,deepTracker:X.options.DeepTracker,customId:X.options.CustomId,delay:X.options.TrackerDelay})}O.tracker=he;var ke=function(xe){return xe&&xe.headers&&(xe.headers["x-cos-request-id"]&&(xe.RequestId=xe.headers["x-cos-request-id"]),xe.headers["x-ci-request-id"]&&(xe.RequestId=xe.headers["x-ci-request-id"]),xe.headers["x-cos-version-id"]&&(xe.VersionId=xe.headers["x-cos-version-id"]),xe.headers["x-cos-delete-marker"]&&(xe.DeleteMarker=xe.headers["x-cos-delete-marker"])),xe},Be=function(xe,ot){he&&he.report(xe,ot),W&&W(ke(xe),ke(ot))},qe=function(){if(T!=="getService"&&T!=="abortUploadTask"){var xe=ee.call(X,T,O);if(xe)return"missing param "+xe;if(O.Region){if(X.options.CompatibilityMode){if(!/^([a-z\d-.]+)$/.test(O.Region))return"Region format error."}else{if(O.Region.indexOf("cos.")>-1)return'param Region should not be start with "cos."';if(!/^([a-z\d-]+)$/.test(O.Region))return"Region format error."}!X.options.CompatibilityMode&&O.Region.indexOf("-")===-1&&O.Region!=="yfb"&&O.Region!=="default"&&O.Region!=="accelerate"&&console.warn("warning: param Region format error, find help here: https://cloud.tencent.com/document/product/436/6224")}if(O.Bucket){if(!/^([a-z\d-]+)-(\d+)$/.test(O.Bucket))if(O.AppId)O.Bucket=O.Bucket+"-"+O.AppId;else if(X.options.AppId)O.Bucket=O.Bucket+"-"+X.options.AppId;else return'Bucket should format as "test-1250000000".';O.AppId&&(console.warn('warning: AppId has been deprecated, Please put it at the end of parameter Bucket(E.g Bucket:"test-1250000000" ).'),delete O.AppId)}!X.options.UseRawKey&&O.Key&&O.Key.substr(0,1)==="/"&&(O.Key=O.Key.substr(1))}},Pe=qe(),He=["getAuth","getObjectUrl"].includes(T);if(typeof Promise=="function"&&!He&&!W)return new Promise(function(Ze,xe){if(W=function(st,gt){st?xe(st):Ze(gt)},Pe)return Be(je.error(new Error(Pe)));U.call(X,O,Be)});if(Pe)return Be(je.error(new Error(Pe)));var rt=U.call(X,O,Be);if(He)return rt}},ae=function(T,U){var O=this,W=0,X=0,he=Date.now(),we,Ee;function ke(){if(Ee=0,U&&typeof U=="function"){we=Date.now();var Be=Math.max(0,Math.round((X-W)/((we-he)/1e3)*100)/100)||0,qe;X===0&&T===0?qe=1:qe=Math.floor(X/T*100)/100||0,he=we,W=X;try{U({loaded:X,total:T,speed:Be,percent:qe})}catch(Pe){}}}return function(Be,qe){if(Be&&(X=Be.loaded,T=Be.total),qe)clearTimeout(Ee),ke();else{if(Ee)return;Ee=setTimeout(ke,O.options.ProgressInterval)}}},le=function(T,U,O){var W;if(typeof U.Body=="string"?U.Body=new Blob([U.Body],{type:"text/plain"}):U.Body instanceof ArrayBuffer&&(U.Body=new Blob([U.Body])),U.Body&&(U.Body instanceof Blob||U.Body.toString()==="[object File]"||U.Body.toString()==="[object Blob]"))W=U.Body.size;else{O(je.error(new Error("params body format error, Only allow File|Blob|String.")));return}U.ContentLength=W,O(null,W)},me=function(T){return Date.now()+(T||0)},fe=function(T,U){var O=T;return T.message=T.message||null,typeof U=="string"?(T.error=U,T.message=U):i(U)==="object"&&U!==null&&(re(T,U),(U.code||U.name)&&(T.code=U.code||U.name),U.message&&(T.message=U.message),U.stack&&(T.stack=U.stack)),typeof Object.defineProperty=="function"&&(Object.defineProperty(T,"name",{writable:!0,enumerable:!1}),Object.defineProperty(T,"message",{enumerable:!0})),T.name=U&&U.name||T.name||T.code||"Error",T.code||(T.code=T.name),T.error||(T.error=G(O)),T},De=function(){return(typeof globalThis=="undefined"?"undefined":i(globalThis))==="object"&&(globalThis.constructor.name==="DedicatedWorkerGlobalScope"||globalThis.FileReaderSync)},Ce=function(){return(typeof window=="undefined"?"undefined":i(window))!=="object"&&(typeof t=="undefined"?"undefined":i(t))==="object"&&!0&&!De()},ye=function(T){return/^https?:\/\/([^/]+\.)?ci\.[^/]+/.test(T)},Fe=(function(){if((typeof navigator=="undefined"?"undefined":i(navigator))!=="object")return!1;var V=navigator.userAgent,T=!!V.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/);return T})(),Ue=(function(){return(typeof navigator=="undefined"?"undefined":i(navigator))!=="object"?!1:/\sQQ/i.test(navigator.userAgent)})(),Re=function(T,U){var O=k.encode(T);return U&&(O=O.replaceAll("+","-").replaceAll("/","_").replaceAll("=","")),O},it=function(T){return T?k.decode(T):""},Je=function(T){var U=T.split("/"),O=[],W=s(U),X;try{for(W.s();!(X=W.n()).done;){var he=X.value;he===".."?O.length&&O.pop():he.length&&he!=="."&&O.push(he)}}catch(we){W.e(we)}finally{W.f()}return"/"+O.join("/")},We=function(T){var U;if(T&&typeof T=="string"){var O=T.trim(),W=O.indexOf("<")===0,X=O.indexOf("{")===0;if(W)U=je.xml2json(T)||{};else if(X)try{var he=T.replace(/\n/g," "),we=JSON.parse(he);Object.prototype.toString.call(we)==="[object Object]"?U=we:U=T}catch(Ee){U=T}else U=T}else U=T||{};return U},je={noop:f,formatParams:te,apiWrapper:de,xml2json:S,json2xml:x,md5:w,clearKey:y,fileSlice:C,getBodyMd5:L,getFileMd5:z,b64:Q,extend:re,isArray:$,isInArray:K,makeArray:oe,each:ie,map:ge,filter:ne,clone:G,attr:Z,uuid:ue,camSafeUrlEncode:R,throttleOnProgress:ae,getFileSize:le,getSkewTime:me,error:fe,obj2str:j,getAuth:_,parseSelectPayload:I,getSourceParams:p,isBrowser:!0,isNode:Ce,isCIHost:ye,isIOS_QQ:Fe&&Ue,encodeBase64:Re,decodeBase64:it,simplifyPath:Je,readAsBinaryString:g,parseResBody:We};a.exports=je}).call(this,e("./node_modules/process/browser.js"))})})})});var xo={};Ti(xo,{default:()=>xr});module.exports=Bi(xo);var q=require("obsidian");var lt=require("obsidian"),En=Ri(wn());var Pi=new Set(["auth_code_consumed","auth_code_expired","invalid_auth_code","invalid_auth_redirect","invalid_auth_state","password_required","synapsehub_user_session_required"]);function Oe(a){if(!a||typeof a!="object")return!1;let c="status"in a?a.status:void 0,e="code"in a&&typeof a.code=="string"?a.code:void 0;return c===401&&!Pi.has(e!=null?e:"")}function Dt(a,c){let e=typeof a=="string"?a.trim():"",t=typeof c=="string"?c.trim():"";try{let i=new URL(e),s=new URL(t),l=i.pathname.split("/").filter(Boolean);return!["http:","https:"].includes(i.protocol)||i.origin!==s.origin||i.username||i.password||l.length!==2||l[0]!=="s"||!l[1]?null:{baseUrl:i.origin,slug:l[1]}}catch(i){return null}}function Cn(a,c){let e=typeof a=="string"?a.trim():"",t=typeof c=="string"?c.trim():"";try{let i=new URL(e),s=new URL(t);return["http:","https:"].includes(i.protocol)&&!i.username&&!i.password&&i.origin===s.origin}catch(i){return!1}}function Ir(a,c){return!!(a.id&&a.url&&Dt(a.url,c))}function An(a,c){return!a.id||!a.url||Ir(a,c)?null:{id:a.id,url:a.url}}function Dn(a,c){let e={};return(typeof a.df_legacy_id!="string"||a.df_legacy_id.length===0)&&(e.df_legacy_id=c.id),(typeof a.df_legacy_url!="string"||a.df_legacy_url.length===0)&&(e.df_legacy_url=c.url),e}var _e=class extends Error{constructor(e,t,i,s,l){super(e);this.status=t;this.code=i;this.requestId=s;this.details=l}},or=class{constructor(c,e,t){this.getSettings=c;this.pluginVersion=e;this.onInvalidSession=t}async health(){return this.getJson("/v0/health")}async createShare(c){return this.postJson("/v0/shares",c)}async updateShare(c,e){return this.putJson(`/v0/shares/${encodeURIComponent(c)}`,e)}async getShareStatus(c){return this.getJson(`/v0/shares/${encodeURIComponent(c)}`)}async listShares(){return this.getJson("/v0/shares?limit=100")}async getShareLinks(c){return this.getJson(`/v0/shares/${encodeURIComponent(c)}/links`)}async deleteShare(c){return this.deleteJson(`/v0/shares/${encodeURIComponent(c)}`)}async deleteShareRecord(c){return this.deleteJson(`/v0/shares/${encodeURIComponent(c)}/record`)}async createFolderShareDraft(c){return this.postJson("/v0/folder-shares/drafts",c)}async putFolderShareDocument(c,e,t){return this.putJson(`/v0/folder-shares/drafts/${encodeURIComponent(c)}/documents/${encodeURIComponent(e)}`,t)}async commitFolderShareDraft(c,e){return this.postJson(`/v0/folder-shares/drafts/${encodeURIComponent(c)}/commit`,e)}async listFolderShares(){return this.getJson("/v0/folder-shares")}async deleteFolderShare(c){return this.deleteJson(`/v0/folder-shares/${encodeURIComponent(c)}`)}async deleteFolderShareRecord(c){return this.deleteJson(`/v0/folder-shares/${encodeURIComponent(c)}/record`)}async uploadAsset(c,e,t,i){try{let s=await this.createAssetUploadIntent(c,e,t,i);if(s.mode==="already_uploaded"&&s.asset)return s.asset;if(s.mode==="tencent_cos"&&s.asset_id&&s.storage_key&&s.upload)return await this.uploadAssetToCos(c,t,i,s.upload),await this.completeAssetUpload(s.asset_id,{filename:e,content_type:t,byte_length:c.byteLength,hash:i,storage_key:s.storage_key})}catch(s){console.warn("DocFerry direct asset upload failed; retrying through the API proxy.")}return this.uploadAssetViaApi(c,e,t,i)}async createAssetUploadIntent(c,e,t,i){return this.postJson("/v0/assets/intents",{filename:e,content_type:t,byte_length:c.byteLength,hash:i})}async completeAssetUpload(c,e){return this.postJson(`/v0/assets/${encodeURIComponent(c)}/complete`,e)}async uploadAssetToCos(c,e,t,i){let s=i.credentials,l=new En.default({SecretId:s.tmp_secret_id,SecretKey:s.tmp_secret_key,SecurityToken:s.session_token,StartTime:s.start_time,ExpiredTime:s.expired_time}),d=new Blob([c],{type:e});await l.uploadFile({Bucket:i.bucket,Region:i.region,Key:i.key,Body:d,ContentType:e,SliceSize:i.slice_size,Headers:{...i.headers||{},"Content-Type":e,"x-cos-meta-docferry-sha256":t}})}async uploadAssetViaApi(c,e,t,i){let s=await(0,lt.requestUrl)({url:this.url("/v0/assets"),method:"POST",headers:{...this.headers(!1),"Content-Type":t,"X-Share-Asset-Hash":i,"X-Share-Asset-Filename":Ii(e)},body:c,throw:!1});return this.parse(s.status,s.text)}async getAuthConfig(){return this.getJson("/v0/auth/config")}async exchangePendingAuth(c,e){return this.postJson("/v0/auth/exchange/pending",{state:c,code_verifier:e})}async createDeviceAuthorization(c){return this.postJson("/v0/auth/device/code",c)}async exchangeDeviceAuthorization(c){return this.postJson("/v0/auth/device/token",{device_code:c})}async whoami(){return this.getJson("/v0/auth/whoami")}async createDashboardLink(c){return this.postJson("/v0/auth/dashboard-link",{target_path:c})}async getMembership(c=!1){return this.getJson(`/v0/membership${c?"?refresh=true":""}`)}async createAccessRequest(c){return this.postJson("/v0/access-requests",c)}async createMediaNoteJob(c,e){return this.postJson("/v0/media-note/jobs",{source_url:c,output_language:"source"},{"Idempotency-Key":e})}async getMediaNoteJob(c){return this.getJson(`/v0/media-note/jobs/${encodeURIComponent(c)}`)}async cancelMediaNoteJob(c){return this.postJson(`/v0/media-note/jobs/${encodeURIComponent(c)}/cancel`,{})}async logout(){return this.postJson("/v0/auth/logout",{})}async getShareImportPayload(c,e){let t=Dt(c,this.getSettings().serverUrl);if(!t)throw new _e("Use a share link from this DocFerry service.",0,"invalid_share_url");let{baseUrl:i,slug:s}=t,l=`${i}/s/${encodeURIComponent(s)}/import`,d=await(0,lt.requestUrl)({url:l,method:"GET",throw:!1}),w;if(d.status===401&&e){let v=await(0,lt.requestUrl)({url:`${i}/s/${encodeURIComponent(s)}/password`,method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({password:e}),throw:!1});this.parse(v.status,v.text),w=Fi(v.headers),d=await(0,lt.requestUrl)({url:l,method:"GET",headers:w?{Cookie:w}:{},throw:!1})}return{payload:this.parse(d.status,d.text),cookieHeader:w}}async downloadImportAsset(c,e){if(!Cn(c,this.getSettings().serverUrl))throw new _e("The share included an invalid asset URL.",0,"invalid_import_asset_url");let t=await(0,lt.requestUrl)({url:c,method:"GET",headers:e?{Cookie:e}:{},throw:!1});if(t.status>=200&&t.status<300)return t.arrayBuffer;throw this.parse(t.status,t.text),new _e("Asset download failed.",t.status)}async getJson(c){let e=await(0,lt.requestUrl)({url:this.url(c),method:"GET",headers:this.headers(!1),throw:!1});return this.parse(e.status,e.text)}async postJson(c,e,t={}){let i=await(0,lt.requestUrl)({url:this.url(c),method:"POST",headers:{...this.headers(!0),...t},body:JSON.stringify(e),throw:!1});return this.parse(i.status,i.text)}async putJson(c,e){let t=await(0,lt.requestUrl)({url:this.url(c),method:"PUT",headers:this.headers(!0),body:JSON.stringify(e),throw:!1});return this.parse(t.status,t.text)}async deleteJson(c){let e=await(0,lt.requestUrl)({url:this.url(c),method:"DELETE",headers:this.headers(!1),throw:!1});return this.parse(e.status,e.text)}url(c){return`${this.getSettings().serverUrl.replace(/\/+$/,"")}${c}`}headers(c){let e=this.getSettings(),t={"X-Share-Plugin-Version":this.pluginVersion};c&&(t["Content-Type"]="application/json");let i=e.sessionToken;return i&&(t.Authorization=`Bearer ${i}`),t}parse(c,e){var d,w,v,S,x;let t;if(e)try{t=JSON.parse(e)}catch(k){t=void 0}if(c>=200&&c<300)return t;let i=t,s=((d=i==null?void 0:i.error)==null?void 0:d.message)||e||`Request failed with ${c}`,l=new _e(s,c,(w=i==null?void 0:i.error)==null?void 0:w.code,(v=i==null?void 0:i.error)==null?void 0:v.request_id,(S=i==null?void 0:i.error)==null?void 0:S.details);throw Oe(l)&&((x=this.onInvalidSession)==null||x.call(this,l)),l}};function Ii(a){return encodeURIComponent(a).slice(0,255)}function Fi(a){var t,i;let c=a["set-cookie"]||a["Set-Cookie"];return c&&((i=(t=String(c).split(",",1)[0])==null?void 0:t.split(";",1)[0])==null?void 0:i.trim())||void 0}function dt(a){return a==="published"||a==="password_protected"}function kn(a){let c=a.filter(dt).length,e=a.length-c,t=[];return c&&t.push(`${c} live ${c===1?"share":"shares"}`),e&&t.push(`${e} past ${e===1?"share":"shares"}`),t.length?`${t.join(", ")}.`:"No shares yet."}function sr(a){return xn(a,404,"share_not_found")}function Fr(a){return xn(a,410,"share_stopped")}function xn(a,c,e){if(!a||typeof a!="object")return!1;let t=a;return t.status===c&&t.code===e}var et=require("obsidian");var Tn=require("electron"),Rn=require("obsidian");async function $e(a){let c=new URL(a);if(c.protocol!=="https:")throw new Error("Only secure web links can be opened externally.");try{return await Tn.shell.openExternal(c.toString()),!0}catch(e){return new Rn.Notice("DocFerry could not open your system browser."),!1}}var Et=class extends Error{constructor(e){super(e);this.userMessage=e;this.name="AuthCompletionError"}},Li=new Set(["pkce_required","code_verifier_required","invalid_code_verifier","invalid_client_state"]),Lr="DocFerry could not access secure credential storage. Update Obsidian, then sign in again.",ar=class{constructor(c,e,t,i,s){this.api=c;this.onAccessToken=e;this.getLoginContext=t;this.getPendingLogin=i;this.savePendingLogin=s;this.loginAttempt=0;this.disposed=!1}async startLogin(c={}){try{let e=await this.api.getAuthConfig(),t=c.signup?e.signup_url||Ni(e.login_url):e.login_url;if(e.provider!=="synapsehub"||!t)return new et.Notice("Bondie account login is not configured on this server yet."),!1;let i=Ui(),s=Oi(),l=await _i(s),d=++this.loginAttempt;try{await this.savePendingLogin(i,new Date().toISOString(),s)}catch(v){return new et.Notice(Lr,8e3),!1}return await $e(Mi(t,this.getLoginContext(),c,i,l))?(new et.Notice(c.signup?"Create your Bondie account in the browser, confirm the account, then return to Obsidian.":c.promptLogin?"Choose another Bondie account in the browser, confirm it, then return to Obsidian.":"Finish signing in in your browser, confirm the account, then return to Obsidian."),this.pollPendingLogin(i,s,d),!0):(await this.clearPendingLogin(i),!1)}catch(e){return new et.Notice("Bondie login is not available on this server."),!1}}dispose(){this.disposed=!0,this.loginAttempt++}async cancelPendingLogin(){this.loginAttempt++,this.getPendingLogin().state&&await this.savePendingLogin("","","")}async pollPendingLogin(c,e,t){var l,d;let i=Date.now()+6e5,s=0;for(;!this.disposed&&t===this.loginAttempt&&Date.now()=600*1e3||!e.verifier){await this.clearPendingLoginSafely(e.state),c&&new et.Notice("Bondie login expired. Start login again.",8e3);return}let i=++this.loginAttempt;c&&new et.Notice("Finishing Bondie login..."),this.pollPendingLogin(e.state,e.verifier,i)}async clearPendingLoginSafely(c){try{await this.clearPendingLogin(c)}catch(e){new et.Notice(Lr,8e3)}}async clearPendingLogin(c){this.getPendingLogin().state===c&&await this.savePendingLogin("","","")}};function Mi(a,c,e,t,i){let s=new URL(a);return s.searchParams.set("client_instance_id",c.clientInstanceId),s.searchParams.set("plugin_version",c.pluginVersion),s.searchParams.set("platform",c.platform),s.searchParams.set("instance_type","obsidian_plugin"),s.searchParams.set("client_state",t),s.searchParams.set("code_challenge",i),s.searchParams.set("code_challenge_method","S256"),e.promptLogin&&s.searchParams.set("prompt","login"),s.toString()}function Ni(a){let c=new URL(a);return c.pathname=c.pathname.replace(/\/login\/?$/,"/signup"),c.toString()}function Ui(){let a=new Uint8Array(32);return crypto.getRandomValues(a),Array.from(a,c=>c.toString(16).padStart(2,"0")).join("")}function Oi(){let a=new Uint8Array(48);return crypto.getRandomValues(a),Bn(a)}async function _i(a){let c=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(a));return Bn(new Uint8Array(c))}function Bn(a){let c="";for(let e of a)c+=String.fromCharCode(e);return window.btoa(c).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function ji(a){return new Promise(c=>window.setTimeout(c,a))}var Fn=require("obsidian");var Pn="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";var ur="DocFerry",In="Save links and share notes or folders.",Hi=`data:image/png;base64,${Pn.trim()}`;function It(a,c="docferry-plugin-logo"){let e=a.createDiv({cls:c});return e.createEl("img",{attr:{alt:"",src:Hi,decoding:"async",loading:"lazy"}}),e}function Ke(a,c,e){let t=a.createDiv({cls:"docferry-plugin-header"});It(t,"docferry-plugin-logo").setAttr("aria-hidden","true");let i=t.createDiv({cls:"docferry-plugin-header-copy"});i.createEl("h2",{text:c,cls:"docferry-heading docferry-heading-2"}),e&&i.createEl("p",{text:e})}function cr(a,c,e){return new Promise(t=>{new Ft(a,"Stop sharing?","The public DocFerry link will stop opening this content.","Keep share","Stop sharing",c,e||"",t).open()})}function Mr(a,c,e){return new Promise(t=>{new Ft(a,"Delete share history?","This removes the stopped record from DocFerry. The source file in your vault is not deleted.","Keep history","Delete history",c,e||"",t).open()})}function Ln(a,c,e,t){return new Promise(i=>{new Ft(a,"Publish a new link for this note?","The previous share link is not visible to the current Bondie account. It may belong to a different account or may have been deleted. Publishing creates a new link under the current account; the previous reference is preserved in the note's properties as df_legacy_url.","Cancel","Publish new link",c,e||"",i,t?[t]:[]).open()})}function Mn(a,c,e,t){return new Promise(i=>{new Ft(a,"Republish from the legacy free service?","This note was shared with the earlier DocFerry free service. That link may still be live, but it can no longer be managed from this vault. Publishing creates a new link on the current DocFerry service; the old link is preserved in the note's properties as df_legacy_url.","Cancel","Publish new link",c,e||"",i,[t]).open()})}var Ft=class extends Fn.Modal{constructor(e,t,i,s,l,d,w,v,S=[]){super(e);this.heading=t;this.description=i;this.cancelLabel=s;this.confirmLabel=l;this.title=d;this.sourcePath=w;this.resolve=v;this.extraLines=S;this.done=!1}onOpen(){let{contentEl:e}=this;e.empty(),Ke(e,this.heading,this.description),e.createEl("p",{text:this.title,cls:"setting-item-description"}),this.sourcePath&&e.createEl("p",{text:this.sourcePath,cls:"setting-item-description"});for(let i of this.extraLines)e.createEl("p",{text:i,cls:"setting-item-description"});let t=e.createDiv({cls:"modal-button-container"});t.createEl("button",{text:this.cancelLabel}).addEventListener("click",()=>{this.finish(!1)}),t.createEl("button",{text:this.confirmLabel,cls:"mod-warning"}).addEventListener("click",()=>{this.finish(!0)})}onClose(){this.done||this.finish(!1)}finish(e){this.done||(this.done=!0,this.resolve(e),this.close())}};var Ne=require("obsidian");var Vi={youtube:"YouTube",tiktok:"TikTok",bilibili:"Bilibili",douyin:"Douyin",wechat:"WeChat",vimeo:"Vimeo",audio:"Audio",video:"Video",web:"Web"};function Nr(a){let c;try{c=new URL(a.trim())}catch(e){throw new Error("Enter a valid web URL.")}if(c.protocol!=="http:"&&c.protocol!=="https:"||!c.hostname||c.username||c.password)throw new Error("Only public http or https links can be imported.");return c}function Ur(a){let c=a.hostname.toLowerCase().replace(/^www\./,"");return c==="youtu.be"||Vt(c,"youtube.com")?"youtube":Vt(c,"tiktok.com")?"tiktok":c==="b23.tv"||Vt(c,"bilibili.com")?"bilibili":Vt(c,"douyin.com")?"douyin":c==="mp.weixin.qq.com"?"wechat":Vt(c,"vimeo.com")?"vimeo":/\.(mp3|m4a|wav|ogg)$/i.test(a.pathname)?"audio":/\.(mp4|webm|mov)$/i.test(a.pathname)?"video":"web"}function lr(a){return Vi[a]}function zi(a,c){let e=a.pathname.split("/").filter(Boolean).pop(),t=c==="youtube"&&a.searchParams.get("v")||e,i=Ki(Ji(t||a.hostname.replace(/^www\./,"")));return`${lr(c)} - ${i}`}function Nn(a,c=new Date().toISOString()){let e=Nr(a),t=Ur(e),i=zi(e,t),s=["---","docferry_import:"," type: link",` source_url: ${JSON.stringify(e.href)}`,` provider: ${t}`,` imported_at: ${JSON.stringify(c)}`," parse_status: link_only","---","",`# ${i}`,"",`[Open original link](<${e.href}>)`,""].join(`
-`);return{url:e,provider:t,title:i,markdown:s}}function Vt(a,c){return a===c||a.endsWith(`.${c}`)}function Ki(a){return Gi(a,"-").replace(/[\\/:*?"<>|#[\]^]+/g,"-").replace(/\s+/g," ").replace(/^-+|-+$/g,"").trim().slice(0,120).trim()||"link"}function Gi(a,c){return Array.from(a,e=>{let t=e.charCodeAt(0);return t<=31||t===127?c:e}).join("")}function Ji(a){try{return decodeURIComponent(a)}catch(c){return a}}var Lt=require("obsidian");var dr=class extends Lt.Modal{constructor(e){super(e);this.done=!1;this.password=""}openAndGetPassword(){return new Promise(e=>{this.resolver=e,super.open()})}onOpen(){let{contentEl:e}=this;e.empty(),e.addClass("docferry-password-modal"),Ke(e,"Password required","Enter the password for this shared document."),new Lt.Setting(e).setName("Password").setDesc("The password is used once to import this DocFerry URL.").addText(i=>{i.inputEl.type="password",i.inputEl.addClass("docferry-password-input"),i.setPlaceholder("Share password").onChange(s=>{this.password=s}),window.setTimeout(()=>i.inputEl.focus(),50)});let t=e.createDiv({cls:"modal-button-container"});t.createEl("button",{text:"Cancel"}).addEventListener("click",()=>{this.finish(null)}),t.createEl("button",{text:"Continue",cls:"mod-cta"}).addEventListener("click",()=>{let i=this.password.trim();if(!i){new Lt.Notice("Password is required.");return}this.finish(i)})}onClose(){this.done||this.finish(null)}finish(e){this.done||(this.done=!0,this.resolver(e),this.close())}};var Or=new Set(["extracted","degraded"]),_r=new Set(["extracted","degraded","unsupported","failed","cancelled","expired"]),Un=1500,On=800;function _n(a){return a==="starting"?"Starting advanced import...":a==="reading"?"Reading the source. Longer audio and video can take a few minutes.":a==="writing"?"Creating your note. You can keep working while this finishes.":"Preparing your preview..."}function zt(a){var e;let c=(e=a.result_contract)==null?void 0:e.title;if(typeof c=="string"&&c.trim())return c.trim().slice(0,160);if(a.source_url)try{return new URL(a.source_url).hostname.replace(/^www\./,"")||"Imported note"}catch(t){}return"Imported note"}function jn(a){var t;let c=(t=a.result_contract)==null?void 0:t.summary,e=typeof c=="string"?c:c&&typeof c=="object"&&"text"in c?c.text:null;return typeof e!="string"?"":e.replace(/\s+/g," ").trim().slice(0,320)}function hr(a){return a.status==="cancelled"?"This import was cancelled.":a.status==="expired"?"This import expired before it was saved.":a.status==="unsupported"?"DocFerry cannot prepare a note from this link yet.":a.error_message||"DocFerry could not prepare a note from this link."}function qn(a){let c=a.replace(/\r\n/g,`
-`),e=c.match(/^# [^\n]+\n+/);return e?c.slice(e[0].length):a}var Qi=new Set(["bilibili","tiktok","douyin"]);function Hn(a,c){return a&&c.enabled&&c.supportedProviders.length>0}function Wi(a,c){return c.enabled&&c.supportedProviders.includes(a)}function pr(a,c,e){return a&&Wi(c,e)}function Vn(a){return Qi.has(a)}function zn(a,c){return c===null||a{this.activePage=i.id,this.render()})}}renderPageIntro(e,t,i){let s=e.createDiv({cls:"docferry-settings-page-intro"});s.createDiv({text:t,cls:"docferry-heading docferry-heading-2",attr:{role:"heading","aria-level":"2"}}),s.createEl("p",{text:i})}renderConnectionSection(e){var k,N,R;let t=this.host.docferrySettings.connectedAccount,i=!!this.host.docferrySettings.sessionToken,s=((k=t==null?void 0:t.displayUser)==null?void 0:k.name)||((N=t==null?void 0:t.displayUser)==null?void 0:N.email)||"Not connected";this.renderPageIntro(e,"Account","Your DocFerry membership and this connected device.");let l=e.createDiv({cls:"docferry-settings-panel docferry-connection-panel"}),d=l.createDiv({cls:"docferry-panel-header"}),w=d.createDiv();w.createDiv({text:"Bondie account",cls:"docferry-heading docferry-heading-3",attr:{role:"heading","aria-level":"3"}}),w.createEl("p",{text:i?"This Obsidian device is connected to DocFerry. Membership and personal details live on the web dashboard.":"Connect once to publish, save links, and use your DocFerry membership."});let v=d.createDiv({text:i?"Connected":"Not connected",cls:i?"docferry-status-badge is-ok":"docferry-status-badge"}),S=l.createDiv({cls:"docferry-settings-account-identity"});jr(S,t==null?void 0:t.displayUser,"docferry-account-avatar");let x=S.createDiv({cls:"docferry-account-details"});if(x.createDiv({text:s,cls:"docferry-heading docferry-heading-4",attr:{role:"heading","aria-level":"4"}}),(R=t==null?void 0:t.displayUser)!=null&&R.email&&t.displayUser.email!==s&&x.createEl("p",{text:t.displayUser.email}),x.createEl("p",{text:i?"Signed in with Bondie":"Use an existing account or create a new one."}),i){let F=this.host.docferrySettings.membership,j=l.createDiv({cls:"docferry-settings-account-grid"});fr(j,"Plan",(F==null?void 0:F.planDisplayName)||"Refresh required"),fr(j,"Shares",F?Mt(F.activeShareCount,F.activeShareLimit):"-"),fr(j,"Advanced imports",F?Mt(F.mediaNoteMonthlyJobsUsed,F.mediaNoteMonthlyJobLimit):"-"),fr(j,"Last refreshed",F?vt(F.refreshedAt):"Never")}this.renderAccountActions(l,i),v.setAttr("aria-label",i?"Connected":"Current account status")}renderAccountActions(e,t){let i=e.createDiv({cls:"docferry-account-quick-actions"});if(!t){let d=i.createEl("button",{cls:"mod-cta",attr:{type:"button"}});Kt(d,"log-in","Log in"),Gt(d,async()=>this.host.startLogin());let w=i.createEl("button",{attr:{type:"button"}});Kt(w,"user-plus","Create account"),Gt(w,async()=>this.host.startSignup());return}let s=i.createEl("button",{cls:"mod-cta",attr:{type:"button"}});Kt(s,"layout-dashboard","Open dashboard"),Gt(s,async()=>this.host.openDashboardHome());let l=i.createEl("button",{attr:{type:"button"}});Kt(l,"refresh-cw","Refresh access"),Gt(l,async()=>{await this.host.refreshMembership(!0),this.render()})}renderSharingSection(e){this.renderPageIntro(e,"Sharing","Defaults used when you publish a note or folder.");let i=e.createDiv({cls:"docferry-settings-panel docferry-settings-share-entry"}).createDiv({cls:"docferry-panel-header"}),s=i.createDiv();s.createDiv({text:"Published content",cls:"docferry-heading docferry-heading-3",attr:{role:"heading","aria-level":"3"}}),s.createEl("p",{text:"Review active and past note or folder shares."});let l=i.createEl("button",{cls:"mod-cta",attr:{type:"button"}});Kt(l,"files","Open shares"),Gt(l,async()=>this.host.openSharesPage());let d=e.createDiv({cls:"docferry-settings-panel"}),v=d.createDiv({cls:"docferry-panel-header"}).createDiv();v.createDiv({text:"Publish defaults",cls:"docferry-heading docferry-heading-3",attr:{role:"heading","aria-level":"3"}}),v.createEl("p",{text:"You can still change these options before each share."}),new tt.Setting(d).setName("Password by default").setDesc("Preselect password protection in the publish dialog.").addToggle(S=>S.setValue(this.host.docferrySettings.defaultPasswordEnabled).onChange(async x=>{this.host.docferrySettings.defaultPasswordEnabled=x,await this.host.saveSettings()})),new tt.Setting(d).setName("Default expiration").setDesc("Used as the initial value in the publish dialog.").addDropdown(S=>S.addOption("never","Never").addOption("30","30 days").setValue(this.host.docferrySettings.defaultExpiresInDays).onChange(async x=>{this.host.docferrySettings.defaultExpiresInDays=x,await this.host.saveSettings()}))}renderImportsSection(e){this.renderPageIntro(e,"Imports","Choose where saved links and generated notes are written.");let t=e.createDiv({cls:"docferry-settings-panel"}),s=t.createDiv({cls:"docferry-panel-header"}).createDiv();s.createDiv({text:"Save location",cls:"docferry-heading docferry-heading-3",attr:{role:"heading","aria-level":"3"}}),s.createEl("p",{text:"Applied to DocFerry shares, web pages, audio, and video."}),new tt.Setting(t).setName("Default import folder").setDesc("Vault folder used by the DocFerry home page and import dialogs.").addText(l=>l.setPlaceholder(Ye.defaultImportFolder).setValue(this.host.docferrySettings.defaultImportFolder||Ye.defaultImportFolder).onChange(async d=>{this.host.docferrySettings.defaultImportFolder=Nt(d)||Ye.defaultImportFolder,await this.host.saveSettings()}))}renderAdvancedSection(e){this.renderPageIntro(e,"Advanced","Connection diagnostics and local plugin controls.");let t=e.createDiv({cls:"docferry-settings-panel docferry-settings-advanced-body"});new tt.Setting(t).setName("Test connection").setDesc("Check whether DocFerry can reach the service.").addButton(i=>i.setButtonText("Test").onClick(()=>void this.host.testConnection())),new tt.Setting(t).setName("Debug logging").setDesc("Include extra details in the developer console for troubleshooting.").addToggle(i=>i.setValue(this.host.docferrySettings.debug).onChange(async s=>{this.host.docferrySettings.debug=s,await this.host.saveSettings(),new tt.Notice(s?"Debug logging enabled":"Debug logging disabled")})),new tt.Setting(t).setName("Plugin version").setDesc(this.host.manifest.version),new tt.Setting(t).setName("Disconnect account").setDesc("Remove this Bondie account from this Obsidian device.").addButton(i=>{i.setButtonText("Disconnect"),i.setWarning(),i.setDisabled(!this.host.docferrySettings.sessionToken&&!this.host.docferrySettings.connectedAccount),i.onClick(async()=>{await this.host.disconnectAccount(),this.render()})})}};function Nt(a){return(typeof a=="string"?a:"").replace(/\\/g,"/").split("/").filter(e=>e&&e!=="."&&e!=="..").map(e=>e.replace(/[\\/:*?"<>|]+/g,"-").trim().replace(/^\.+|\.+$/g,"")).filter(Boolean).join("/")}function Kn(a){return((a==null?void 0:a.name)||(a==null?void 0:a.email)||"DF").split(/[\s@._-]+/).filter(Boolean).slice(0,2).map(i=>{var s;return(s=i[0])==null?void 0:s.toUpperCase()}).join("")||"DF"}function jr(a,c,e="docferry-account-avatar"){let t=a.createDiv({cls:e,attr:{"aria-hidden":"true"}});if(c!=null&&c.picture){let i=t.createEl("img",{attr:{alt:"",src:c.picture,decoding:"async",loading:"lazy",referrerpolicy:"no-referrer"}});return i.addEventListener("error",()=>{i.remove(),t.setText(Kn(c))},{once:!0}),t}return t.setText(Kn(c)),t}function fr(a,c,e){let t=a.createDiv({cls:"docferry-settings-account-fact"});t.createSpan({text:c}),t.createEl("strong",{text:e})}function vt(a){if(!a)return"Never";let c=new Date(a);return Number.isNaN(c.getTime())?a:c.toLocaleString()}function Gn(a){return a.status==="stopped"&&a.stopped_at?`Stopped ${vt(a.stopped_at)}`:a.expires_at?a.status==="expired"?`Expired ${vt(a.expires_at)}`:`Expires ${vt(a.expires_at)}`:"No expiration"}function Jn(a){return typeof a=="object"&&a!==null&&a.vault_name||"Obsidian vault"}function qr(a){return a==="password_protected"?"Password":a==="expired"?"Expired":a==="stopped"?"Stopped":"Published"}function Hr(a){return a==="password_protected"?"is-locked":a==="expired"?"is-warning":a==="stopped"?"is-muted":"is-ok"}function Jt(a){return!Number.isFinite(a)||a<=0?"0 bytes":a%(1024*1024)===0?`${a/(1024*1024)} MiB`:a%1024===0?`${a/1024} KiB`:`${a} bytes`}function Qn(a){return a==="synapsehub_user_session_required"?"Refresh your account before changing plans.":a==="synapsehub_runtime_unreachable"?"Plan refresh is temporarily unavailable.":a==="synapsehub_runtime_failed"?"Plan refresh failed. Try again later.":a?"Plan refresh is temporarily unavailable.":""}function Wn(a,c=new Date().toISOString()){var e,t;return{productKey:a.product_key,accessRole:a.access_role,planKey:a.plan_key,planDisplayName:a.plan_display_name,entitlementKey:(e=a.entitlement_key)!=null?e:null,activeShareCount:a.active_share_count,activeShareLimit:a.active_share_limit,activeFolderShareCount:a.active_folder_share_count,activeFolderShareLimit:a.active_folder_share_limit,maxFolderDocumentCount:a.max_folder_document_count,maxFolderTotalBytes:a.max_folder_total_bytes,maxSingleFileSizeBytes:a.max_single_file_size_bytes,canCreateShare:a.can_create_share,canCreateFolderShare:a.can_create_folder_share,canUseFullTheme:a.can_use_full_theme,hasMediaNoteEntitlement:a.feature_gates["docferry.ai.assist"]===!0,canUseMediaNote:Hn(a.feature_gates["docferry.ai.assist"]===!0,{enabled:a.media_note.enabled,supportedProviders:a.media_note.supported_providers}),mediaNoteProviders:[...a.media_note.supported_providers],mediaNoteSourceKinds:[...a.media_note.supported_source_kinds],mediaNoteActiveJobs:a.media_note_usage.active_jobs,mediaNoteActiveJobLimit:a.media_note_usage.active_job_limit,mediaNoteMonthlyJobsUsed:a.media_note_usage.monthly_jobs_used,mediaNoteMonthlyJobLimit:a.media_note_usage.monthly_job_limit,mediaNoteResetsAt:a.media_note_usage.resets_at,source:a.limit_source,cacheStatus:a.cache.status,refreshedAt:c,unavailableReason:(t=a.unavailable_reason)!=null?t:null,billingEnabled:!!a.billing.enabled,billingPlans:a.billing.plans.map(i=>({planKey:i.plan_key,displayName:i.display_name,amountMinorUnits:i.amount_minor_units,currency:i.currency,billingInterval:i.billing_interval,testOnly:!!i.test_only}))}}function Mt(a,c){return`${a}/${mr(c)}`}function mr(a){return a===null?"Unlimited":String(a)}function Kt(a,c,e){let t=a.createSpan({cls:"docferry-button-icon",attr:{"aria-hidden":"true"}});(0,tt.setIcon)(t,c),a.createSpan({text:e,cls:"docferry-button-label"})}function Gt(a,c){a.addEventListener("click",()=>{c()})}var kt="docferry-dashboard",bt=class extends Ne.ItemView{constructor(e,t){super(e);this.host=t;this.activePage="home";this.shares=[];this.folderShares=[];this.sharesLoaded=!1;this.sharesLoading=!1;this.sharesError="";this.sharesKey="";this.importUrl="";this.importLoading=!1;this.importProgress="";this.importCancelRequested=!1;this.importError="";this.importSuccess="";this.dragDepth=0;this.activeDragPath=""}getViewType(){return kt}getDisplayText(){return ur}getIcon(){return"ship"}async onOpen(){this.render()}refreshForAuthChange(){this.resetShares(),this.render(),this.activePage==="shares"&&this.hasAuthForShares()&&this.refreshShares()}refreshForShareChange(){this.resetShares(),this.render(),this.activePage==="shares"&&this.hasAuthForShares()&&this.refreshShares()}showHomePage(){this.openHomePage()}showSharesPage(){this.openSharesPage()}showAccountPage(){this.activePage="account",this.render()}render(){let{contentEl:e}=this;e.empty(),e.addClass("docferry-dashboard-view");let t=this.activePage==="home",i=!!(this.importLoading||this.importProgress||this.importError||this.importSuccess||this.host.docferrySettings.pendingMediaNoteImport);e.toggleClass("is-home-page",t),e.toggleClass("has-expanded-home-state",t&&i);let s=e.createDiv({cls:["docferry-workspace-shell",t?"is-home-page":"",t&&i?"has-expanded-home-state":""].filter(Boolean).join(" ")});this.renderTopbar(s);let l=s.createDiv({cls:"docferry-workspace-content"});this.activePage==="home"&&this.renderHome(l),this.activePage==="shares"&&this.renderSharesPage(l),this.activePage==="account"&&this.renderAccountPage(l)}renderTopbar(e){let i=e.createDiv({cls:"docferry-workspace-topbar"}).createDiv({cls:"docferry-workspace-brand",attr:{role:"button",tabindex:"0","aria-label":"Open DocFerry dashboard",title:"Open DocFerry dashboard"}});It(i,"docferry-workspace-brand-mark");let s=i.createSpan({cls:"docferry-workspace-brand-copy"});s.createSpan({text:"DocFerry",cls:"docferry-workspace-brand-title"}),s.createSpan({text:"Save and share",cls:"docferry-workspace-brand-subtitle"}),i.addEventListener("click",()=>void this.host.openDashboardHome()),i.addEventListener("keydown",l=>{l.key!=="Enter"&&l.key!==" "||(l.preventDefault(),this.host.openDashboardHome())})}renderHome(e){var I;let t=((I=this.host.docferrySettings.membership)==null?void 0:I.canUseMediaNote)===!0,i=e.createDiv({cls:"docferry-import-home docferry-share-drop-surface"}),s=i.createDiv({cls:"docferry-import-panel"}),d=s.createDiv({cls:"docferry-share-drop-overlay",attr:{role:"status","aria-live":"polite","aria-atomic":"true"}}).createDiv({cls:"docferry-share-drop-cue"}),w=d.createSpan({cls:"docferry-share-drop-overlay-icon",attr:{"aria-hidden":"true"}});(0,Ne.setIcon)(w,"upload-cloud"),d.createEl("h3",{text:"Share from this vault",cls:"docferry-heading docferry-heading-3 docferry-share-drop-title"}),d.createEl("p",{text:"Release a note or folder to review sharing options.",cls:"docferry-share-drop-detail"});let v=d.createDiv({cls:"docferry-share-drop-guard"}),S=v.createSpan({attr:{"aria-hidden":"true"}});(0,Ne.setIcon)(S,"shield-check"),v.createSpan({text:"Nothing is published until you confirm."}),this.registerShareDropSurface(i);let x=s.createDiv({cls:"docferry-import-intro"});It(x,"docferry-import-mark docferry-import-logo").setAttr("aria-hidden","true");let k=x.createDiv({cls:"docferry-import-intro-copy"});k.createEl("h2",{text:"Save to Obsidian",cls:"docferry-heading docferry-heading-2"}),k.createEl("p",{text:"Paste one public link. DocFerry chooses the best way to save it."});let N=s.createDiv({cls:"docferry-import-scope",attr:{"aria-label":"Supported link types"}});this.renderImportScope(N,"files","DocFerry shares"),this.renderImportScope(N,"globe-2","Web pages"),this.renderImportScope(N,"video","Video"),this.renderImportScope(N,"audio-lines","Audio");let R="docferry-dashboard-import-url",F=s.createDiv({cls:"docferry-import-field"});F.createEl("label",{text:"Paste a link",attr:{for:R}});let j=F.createDiv({cls:"docferry-import-row"}),M=j.createEl("input",{type:"text",placeholder:"Paste any public link",cls:"docferry-import-url-input",attr:{id:R,autocomplete:"off"}});M.value=this.importUrl,M.disabled=this.importLoading,M.addEventListener("input",()=>{this.importUrl=M.value,this.importError="",this.importSuccess="",J.disabled=this.importLoading||!zr(this.importUrl)}),M.addEventListener("keydown",p=>{p.key==="Enter"&&this.handleImport()});let J=j.createEl("button",{cls:"mod-cta",attr:{type:"button"}});Xe(J,"download",this.importLoading?"Saving":"Save"),J.disabled=this.importLoading||!zr(this.importUrl),J.addEventListener("click",()=>{this.handleImport()});let _=F.createDiv({cls:"docferry-import-guidance"}),P=_.createSpan({attr:{"aria-hidden":"true"}});if((0,Ne.setIcon)(P,t?"sparkles":"link"),_.createSpan({text:t?"Saving creates a note in your vault. Shared notes save instantly; web and media links may take a few minutes.":"Saving creates a note in your vault. Shared notes import directly; other public links become simple notes."}),this.importLoading){let p=s.createDiv({cls:"docferry-import-progress",attr:{role:"status","aria-live":"polite"}}),f=p.createSpan({cls:"docferry-import-progress-icon",attr:{"aria-hidden":"true"}});(0,Ne.setIcon)(f,"loader-circle");let y=p.createSpan({cls:"docferry-import-progress-copy"});if(y.createSpan({text:this.importProgress?"Preparing your note":"Saving to Obsidian",cls:"docferry-import-progress-title"}),y.createSpan({text:this.importProgress?_n(this.importProgress):"This should only take a moment."}),this.importProgress){y.createSpan({text:"You can keep working. A preview will open when the note is ready."});let g=p.createEl("button",{cls:"docferry-import-cancel",attr:{type:"button"}});Xe(g,"x",this.importCancelRequested?"Cancelling":"Cancel"),g.disabled=this.importCancelRequested,g.addEventListener("click",()=>void this.cancelImport())}}else if(this.host.docferrySettings.pendingMediaNoteImport){let p=s.createDiv({cls:"docferry-import-progress docferry-import-recovery",attr:{role:"status","aria-live":"polite"}}),f=p.createSpan({attr:{"aria-hidden":"true"}});(0,Ne.setIcon)(f,"history");let y=p.createSpan({cls:"docferry-import-progress-copy"});y.createSpan({text:"Detailed note pending review",cls:"docferry-import-progress-title"}),y.createSpan({text:"Resume the review or cancel it. Starting another will not duplicate the work."});let g=p.createDiv({cls:"docferry-import-recovery-actions"}),b=g.createEl("button",{cls:"mod-cta",attr:{type:"button"}});Xe(b,"play","Resume"),b.addEventListener("click",()=>void this.resumeImport());let C=g.createEl("button",{attr:{type:"button"}});Xe(C,"x","Cancel"),C.addEventListener("click",()=>void this.cancelPendingImport())}this.importError&&s.createDiv({text:this.importError,cls:"docferry-dashboard-inline-error"}),this.importSuccess&&this.renderImportSuccess(s,M);let E=i.createDiv({cls:"docferry-import-shortcuts",attr:{"aria-label":"DocFerry pages"}});this.renderShortcut(E,"files","Shares","Published content",()=>this.openSharesPage()),this.host.docferrySettings.sessionToken?this.renderShortcut(E,"layout-dashboard","Dashboard","Membership and billing",()=>{this.host.openDashboardHome()}):this.renderShortcut(E,"log-in","Sign in","Connect your Bondie account",()=>{this.host.startLogin()}),this.renderShortcut(E,"settings","Preferences","Plugin defaults",()=>this.host.openSettingsTab()),this.importLoading||window.setTimeout(()=>M.focus(),50)}renderImportSuccess(e,t){let i=e.createDiv({cls:"docferry-dashboard-inline-success",attr:{role:"status","aria-live":"polite"}}),s=i.createSpan({cls:"docferry-dashboard-inline-message-icon",attr:{"aria-hidden":"true"}});(0,Ne.setIcon)(s,"circle-check"),i.createSpan({text:this.importSuccess,cls:"docferry-dashboard-inline-message-copy"});let l=i.createEl("button",{cls:"docferry-dashboard-inline-message-dismiss",attr:{type:"button","aria-label":"Dismiss saved message",title:"Dismiss"}});(0,Ne.setIcon)(l,"x"),l.addEventListener("click",()=>{this.importSuccess="",i.remove(),t.focus()})}renderImportScope(e,t,i){let s=e.createSpan({cls:"docferry-import-scope-item"}),l=s.createSpan({attr:{"aria-hidden":"true"}});(0,Ne.setIcon)(l,t),s.createSpan({text:i})}registerShareDropSurface(e){let t=d=>this.host.vaultPathFromDrag(d),i=d=>{let w=e.getBoundingClientRect();!w.width||!w.height||(e.style.setProperty("--df-drop-x",`${Math.max(0,Math.min(w.width,d.clientX-w.left))}px`),e.style.setProperty("--df-drop-y",`${Math.max(0,Math.min(w.height,d.clientY-w.top))}px`))},s=(d,w)=>{d!==this.activeDragPath&&(this.activeDragPath=d,this.updateShareDropCue(e,d)),i(w),e.addClass("is-drag-active")},l=()=>{this.dragDepth=0,this.activeDragPath="",e.style.removeProperty("--df-drop-x"),e.style.removeProperty("--df-drop-y"),e.removeClass("is-drag-active")};e.addEventListener("dragenter",d=>{let w=t(d);w&&(d.preventDefault(),this.dragDepth+=1,s(w,d))}),e.addEventListener("dragover",d=>{let w=t(d);w&&(d.preventDefault(),d.dataTransfer&&(d.dataTransfer.dropEffect="copy"),s(w,d))}),e.addEventListener("dragleave",()=>{this.dragDepth=Math.max(0,this.dragDepth-1),this.dragDepth||l()}),e.addEventListener("drop",d=>{let w=t(d);l(),w&&(d.preventDefault(),d.stopPropagation(),this.host.publishVaultPath(w))})}updateShareDropCue(e,t){let i=this.host.app.vault.getAbstractFileByPath(t),s=i instanceof Ne.TFolder,l=i instanceof Ne.TFile?i.basename:(i==null?void 0:i.name)||t.split("/").pop()||t,d=e.querySelector(".docferry-share-drop-overlay-icon"),w=e.querySelector(".docferry-share-drop-title"),v=e.querySelector(".docferry-share-drop-detail");d&&(0,Ne.setIcon)(d,s?"folder-up":"file-up"),w&&(w.textContent=s?"Share this folder":"Share this note"),v&&(v.textContent=`Release to review "${l}".`)}renderSharesPage(e){let t=e.createDiv({cls:"docferry-workspace-page"});this.renderPageHeader(t,"Shares",this.sharesLoaded?kn([...this.shares,...this.folderShares].map(s=>s.status)):"Shared notes and folders from this account.","Refresh","refresh-cw",()=>void this.refreshShares());let i=this.currentShareListKey();if(this.sharesKey&&this.sharesKey!==i&&this.resetShares(),!this.hasAuthForShares()){this.renderEmpty(t,"Log in to view shares","Connect your Bondie account to manage published notes and folders.",!1,{label:"Log in",icon:"log-in",action:()=>void this.host.startLogin()});return}if(this.sharesLoading){this.renderShareSkeleton(t);return}if(this.sharesError){this.renderEmpty(t,"Share list unavailable",this.sharesError,!0);return}if(!this.sharesLoaded){this.renderEmpty(t,"Shares not loaded","Refresh to load your shared notes.");return}if(!this.shares.length&&!this.folderShares.length){this.renderEmpty(t,"No shares yet","Publish a note when you are ready.");return}if(this.folderShares.length){t.createEl("h3",{text:"Folders",cls:"docferry-heading docferry-heading-4 docferry-share-group-title"});let s=t.createDiv({cls:"docferry-share-list docferry-workspace-share-list"});for(let l of this.folderShares)this.renderFolderShareRow(s,l)}if(this.shares.length&&t.createEl("h3",{text:"Notes",cls:"docferry-heading docferry-heading-4 docferry-share-group-title"}),this.shares.length){let s=t.createDiv({cls:"docferry-share-list docferry-workspace-share-list"});for(let l of this.shares){let d=s.createDiv({cls:"docferry-share-row docferry-workspace-share-row docferry-share-row--compact"}),w=d.createDiv({cls:"docferry-share-main"});w.createEl("h4",{text:l.title||l.source_path,cls:"docferry-heading docferry-heading-4"}),w.createEl("p",{text:l.source_path});let v=w.createDiv({cls:"docferry-share-meta"});v.createSpan({text:Jn(l)}),v.createSpan({text:`Updated ${vt(l.updated_at)}`}),l.expires_at&&l.status!=="stopped"&&v.createSpan({text:Gn(l)});let S=d.createDiv({cls:"docferry-share-badges"});S.createSpan({text:qr(l.status),cls:`docferry-pill ${Hr(l.status)}`}),l.password_enabled&&S.createSpan({text:"Password",cls:"docferry-pill is-locked"});let x=d.createDiv({cls:"docferry-share-actions"});if(dt(l.status)){let k=x.createEl("button",{attr:{type:"button","aria-label":"Copy share URL"}});Xe(k,"copy","Copy"),ht(k,async()=>{await navigator.clipboard.writeText(l.url),new Ne.Notice("Share link copied")});let N=x.createEl("button",{attr:{type:"button","aria-label":"Open share URL"}});Xe(N,"external-link","Open"),N.addEventListener("click",()=>{$e(l.url)});let R=x.createEl("button",{attr:{type:"button","aria-label":"Show linked note status"}});Xe(R,"list-checks","Links"),ht(R,async()=>{await this.host.openShareLinks(l)});let F=x.createEl("button",{attr:{type:"button","aria-label":"Update share"}});Xe(F,"upload-cloud","Update"),ht(F,async()=>{await this.host.updateShareFromList(l)})}if(dt(l.status)){let k=x.createEl("button",{cls:"docferry-icon-button",attr:{type:"button","aria-label":`More actions for ${l.title||l.source_path}`,title:"More actions"}});Qt(k,"more-horizontal"),k.addEventListener("click",()=>this.showShareMenu(k,l))}else{let k=x.createEl("button",{cls:"docferry-delete-history-button",attr:{type:"button","aria-label":`Delete history for ${l.title||l.source_path}`}});Xe(k,"trash-2","Delete"),ht(k,async()=>{await this.host.deleteShareHistory(l),await this.refreshShares()})}}}}renderFolderShareRow(e,t){let i=e.createDiv({cls:"docferry-share-row docferry-workspace-share-row docferry-share-row--compact"}),s=i.createDiv({cls:"docferry-share-main"});s.createEl("h4",{text:t.title,cls:"docferry-heading docferry-heading-4"}),s.createEl("p",{text:t.source_folder});let l=s.createDiv({cls:"docferry-share-meta"});l.createSpan({text:`${t.document_count} notes`}),l.createSpan({text:`Updated ${vt(t.updated_at)}`}),l.createSpan({text:t.theme_mode==="full"?"Theme styling":"Reader style"});let d=i.createDiv({cls:"docferry-share-badges"});d.createSpan({text:qr(t.status),cls:`docferry-pill ${Hr(t.status)}`}),t.password_enabled&&d.createSpan({text:"Password",cls:"docferry-pill is-locked"});let w=i.createDiv({cls:"docferry-share-actions"});if(dt(t.status)){let v=w.createEl("button",{attr:{type:"button","aria-label":"Copy folder share URL"}});Xe(v,"copy","Copy"),ht(v,async()=>{await navigator.clipboard.writeText(t.url),new Ne.Notice("Folder share link copied")});let S=w.createEl("button",{attr:{type:"button","aria-label":"Open folder share"}});Xe(S,"external-link","Open"),S.addEventListener("click",()=>$e(t.url));let x=w.createEl("button",{attr:{type:"button","aria-label":"Update folder share"}});Xe(x,"upload-cloud","Update"),ht(x,async()=>{await this.host.updateFolderShareFromList(t)})}if(dt(t.status)){let v=w.createEl("button",{cls:"docferry-icon-button",attr:{type:"button","aria-label":`More actions for ${t.title}`,title:"More actions"}});Qt(v,"more-horizontal"),v.addEventListener("click",()=>this.showFolderShareMenu(v,t))}else{let v=w.createEl("button",{cls:"docferry-delete-history-button",attr:{type:"button","aria-label":`Delete history for ${t.title}`}});Xe(v,"trash-2","Delete"),ht(v,async()=>{await this.host.deleteFolderShareHistory(t),await this.refreshShares()})}}renderAccountPage(e){var R,F,j;let t=e.createDiv({cls:"docferry-workspace-page docferry-account-page"});this.renderPageHeader(t,"Account","Your DocFerry plan and signed-in Bondie account.");let i=this.host.docferrySettings.connectedAccount,s=!!this.host.docferrySettings.sessionToken,l=((R=i==null?void 0:i.displayUser)==null?void 0:R.name)||((F=i==null?void 0:i.displayUser)==null?void 0:F.email)||"Not connected",d=t.createDiv({cls:"docferry-account-card docferry-workspace-account-card"});if(s)jr(d,i==null?void 0:i.displayUser,"docferry-account-avatar");else{let M=d.createDiv({cls:"docferry-account-avatar is-placeholder",attr:{"aria-hidden":"true"}});(0,Ne.setIcon)(M,"user")}let w=d.createDiv({cls:"docferry-account-details"});if(w.createEl("h3",{text:l,cls:"docferry-heading docferry-heading-4"}),w.createEl("p",{text:s?"Signed in with Bondie":"Connect once to publish, import shares, and use account features."}),(j=i==null?void 0:i.displayUser)!=null&&j.email&&i.displayUser.email!==l&&w.createEl("p",{text:i.displayUser.email}),!s){this.renderAccountQuickActions(t,!1);return}let v=this.host.docferrySettings.membership,S=t.createDiv({cls:"docferry-membership-card docferry-workspace-membership-card"}),x=S.createDiv({cls:"docferry-membership-header"}),k=x.createDiv();k.createEl("h3",{text:"Plan and usage",cls:"docferry-heading docferry-heading-4"}),k.createEl("p",{text:v?`Updated ${vt(v.refreshedAt)}.`:"Refresh to load your current plan."}),x.createSpan({text:(v==null?void 0:v.planDisplayName)||"Unknown",cls:`docferry-status-badge ${v&&v.planKey!=="free"?"is-ok":""}`});let N=S.createDiv({cls:"docferry-membership-stats"});yr(N,"Shares",v?Mt(v.activeShareCount,v.activeShareLimit):"-"),yr(N,"Folders",v?Mt(v.activeFolderShareCount,v.activeFolderShareLimit):"-"),yr(N,"File size",v?Jt(v.maxSingleFileSizeBytes):"-"),yr(N,"Advanced imports",v?v.mediaNoteMonthlyJobLimit===null?`${v.mediaNoteMonthlyJobsUsed} this month`:Mt(v.mediaNoteMonthlyJobsUsed,v.mediaNoteMonthlyJobLimit):"-"),v!=null&&v.hasMediaNoteEntitlement?S.createDiv({text:`Detailed web, audio, and video notes plus Obsidian-inspired theme styling. Usage resets ${Xi(v.mediaNoteResetsAt)}.`,cls:"docferry-membership-benefit-note"}):v&&S.createDiv({text:"Pro adds detailed web, audio, and video notes, folder sharing, and Obsidian-inspired theme styling.",cls:"docferry-membership-benefit-note"}),v!=null&&v.unavailableReason&&S.createDiv({text:Qn(v.unavailableReason),cls:"docferry-membership-note"}),this.renderAccountQuickActions(t,s)}renderAccountQuickActions(e,t){let i=e.createDiv({cls:"docferry-workspace-page-actions docferry-account-primary-actions docferry-account-quick-actions"}),s=i.createEl("button",{cls:t?"":"mod-cta",attr:{type:"button"}});if(Xe(s,t?"refresh-cw":"log-in",t?"Refresh":"Log in"),ht(s,async()=>{t?await this.host.refreshMembership(!0):await this.host.startLogin(),this.render()}),!t){let w=i.createEl("button",{attr:{type:"button"}});Xe(w,"user-plus","Create account"),ht(w,async()=>{await this.host.startSignup(),this.render()})}if(!t)return;let l=i.createEl("button",{cls:"mod-cta",attr:{type:"button"}});Xe(l,"layout-dashboard","Open dashboard"),ht(l,async()=>this.host.openDashboardHome());let d=i.createEl("button",{cls:"docferry-icon-button",attr:{type:"button","aria-label":"More account actions",title:"More account actions"}});Qt(d,"more-horizontal"),d.addEventListener("click",()=>this.showAccountMenu(d))}renderPageHeader(e,t,i,s,l,d){let w=e.createDiv({cls:"docferry-workspace-page-header"}),v=w.createEl("button",{cls:"docferry-workspace-back docferry-icon-button",attr:{type:"button","aria-label":"Back to DocFerry home",title:"Home"}});Qt(v,"arrow-left"),v.addEventListener("click",()=>{this.openHomePage()});let S=w.createDiv({cls:"docferry-workspace-page-copy"});if(S.createEl("h1",{text:t,cls:"docferry-heading docferry-heading-2"}),S.createEl("p",{text:i}),s&&l&&d){let x=w.createEl("button",{cls:"docferry-icon-button",attr:{type:"button","aria-label":s,title:s}});Qt(x,l),x.disabled=this.sharesLoading||!this.hasAuthForShares(),x.addEventListener("click",d)}}renderShortcut(e,t,i,s,l){let d=e.createEl("button",{cls:"docferry-import-shortcut",attr:{type:"button"}}),w=d.createSpan({cls:"docferry-import-shortcut-icon",attr:{"aria-hidden":"true"}});(0,Ne.setIcon)(w,t);let v=d.createSpan({cls:"docferry-import-shortcut-copy"});v.createSpan({text:i,cls:"docferry-import-shortcut-title"}),v.createSpan({text:s,cls:"docferry-import-shortcut-description"}),d.addEventListener("click",l)}openHomePage(){this.activePage="home",this.render()}openSharesPage(){this.activePage="shares",this.render(),this.hasAuthForShares()&&!this.sharesLoaded&&!this.sharesLoading&&this.refreshShares()}async handleImport(){let e=this.importUrl.trim();if(!zr(e)){this.importError="Enter a valid web URL.",this.importSuccess="",this.render();return}if(!Dt(e,this.host.docferrySettings.serverUrl)){this.importLoading=!0,this.importCancelRequested=!1,this.importProgress=this.shouldPrepareDetailedNote(e)?"starting":"",this.importError="",this.importSuccess="",this.render();try{let t=await this.host.importExternalLink(e,i=>{this.importProgress=i,this.render()});if(!t){this.importSuccess="Nothing was saved.";return}this.importUrl="",this.importSuccess=`Saved ${t.title} to ${t.notePath}.`}catch(t){this.importCancelRequested?this.importSuccess="Import cancelled. Nothing was saved.":this.importError=Kr(t,"Import failed")}finally{this.importLoading=!1,this.importProgress="",this.importCancelRequested=!1,this.render()}return}await this.runImport(e)}async cancelImport(){if(!(!this.importLoading||!this.importProgress||this.importCancelRequested)){this.importCancelRequested=!0,this.render();try{await this.host.cancelActiveMediaImport()}catch(e){this.importCancelRequested=!1,this.importError=Kr(e,"Could not cancel import"),this.render()}}}async resumeImport(){this.importLoading=!0,this.importProgress="reading",this.importError="",this.importSuccess="",this.render();try{await this.host.resumeActiveMediaImport()}finally{this.importLoading=!1,this.importProgress="",this.render()}}async cancelPendingImport(){try{await this.host.cancelActiveMediaImport(),this.importSuccess="Import cancelled. Nothing was saved.",this.importError=""}catch(e){this.importError=Kr(e,"Could not cancel import")}this.render()}async runImport(e,t){this.importLoading=!0,this.importError="",this.importSuccess="",this.render();try{let i=await this.host.importShareFromDashboard(e,t);this.importUrl="",this.importSuccess=`Imported ${i.title} to ${i.notePath}.`,i.importedAssets&&(this.importSuccess+=` Assets: ${i.importedAssets}.`)}catch(i){if(i instanceof _e&&i.status===401&&i.code==="password_required"){let s=await new dr(this.host.app).openAndGetPassword();if(this.importLoading=!1,!s){this.importError="Password is required for this share.",this.render();return}await this.runImport(e,s);return}this.importError=Zi(i)}finally{this.importLoading=!1,this.render()}}async refreshShares(){if(!this.hasAuthForShares()){this.resetShares(),this.render();return}this.sharesLoading=!0,this.sharesError="",this.sharesKey=this.currentShareListKey(),this.render();try{let[e,t]=await Promise.all([this.host.listShares(),this.host.listFolderShares()]);this.shares=e,this.folderShares=t,this.sharesLoaded=!0}catch(e){this.sharesError=$i(e),this.shares=[],this.folderShares=[]}finally{this.sharesLoading=!1,this.render()}}resetShares(){this.shares=[],this.folderShares=[],this.sharesLoaded=!1,this.sharesLoading=!1,this.sharesError="",this.sharesKey=""}hasAuthForShares(){return!!this.host.docferrySettings.sessionToken}currentShareListKey(){var s;let e=this.host.docferrySettings,t=e.sessionToken.slice(-8),i=((s=e.connectedAccount)==null?void 0:s.productSubjectId)||"pending";return`${e.serverUrl}|${i}|${t}`}showShareMenu(e,t){let i=new Ne.Menu;dt(t.status)?i.addItem(s=>s.setTitle("Stop sharing").setIcon("unlink").onClick(async()=>{await this.host.stopShareFromList(t),await this.refreshShares()})):i.addItem(s=>s.setTitle("Delete history").setIcon("trash-2").onClick(async()=>{await this.host.deleteShareHistory(t),await this.refreshShares()})),Vr(i,e)}showFolderShareMenu(e,t){let i=new Ne.Menu;t.status!=="stopped"&&t.status!=="expired"?i.addItem(s=>s.setTitle("Stop sharing").setIcon("unlink").onClick(async()=>{await this.host.stopFolderShareFromList(t),await this.refreshShares()})):i.addItem(s=>s.setTitle("Delete history").setIcon("trash-2").onClick(async()=>{await this.host.deleteFolderShareHistory(t),await this.refreshShares()})),Vr(i,e)}showAccountMenu(e){let t=new Ne.Menu;t.addItem(i=>i.setTitle("Manage plan").setIcon("credit-card").onClick(()=>void this.host.openMembershipCenter())),t.addItem(i=>i.setTitle("Switch account").setIcon("log-in").onClick(()=>void this.host.reconnectAccount())),t.addItem(i=>i.setTitle("Support").setIcon("life-buoy").onClick(()=>void this.host.requestAccessUpgrade("plugin_dashboard"))),t.addItem(i=>i.setTitle("Plugin preferences").setIcon("settings").onClick(()=>this.host.openSettingsTab())),t.addSeparator(),t.addItem(i=>i.setTitle("Disconnect").setIcon("log-out").onClick(async()=>{await this.host.disconnectAccount(),this.resetShares(),this.render()})),Vr(t,e)}shouldPrepareDetailedNote(e){let t=this.host.docferrySettings.membership;if(!(t!=null&&t.hasMediaNoteEntitlement)||!t.canUseMediaNote)return!1;try{let i=Ur(Nr(e));return pr(t.hasMediaNoteEntitlement,i,{enabled:t.canUseMediaNote,supportedProviders:t.mediaNoteProviders})}catch(i){return!1}}renderShareSkeleton(e){let t=e.createDiv({cls:"docferry-share-list docferry-workspace-share-list",attr:{"aria-busy":"true","aria-label":"Loading shares"}});for(let i=0;i<4;i+=1){let l=t.createDiv({cls:"docferry-share-row docferry-workspace-share-row docferry-share-row--compact is-loading"}).createDiv({cls:"docferry-share-main"});l.createDiv({cls:"docferry-skeleton-line is-title"}),l.createDiv({cls:"docferry-skeleton-line"})}}renderEmpty(e,t,i,s=!1,l){let d=e.createDiv({cls:`docferry-settings-empty ${s?"is-error":""}`});if(d.createEl("h3",{text:t,cls:"docferry-heading docferry-heading-4"}),d.createEl("p",{text:i}),l){let w=d.createEl("button",{cls:"mod-cta",attr:{type:"button"}});Xe(w,l.icon,l.label),w.addEventListener("click",l.action)}}};function Xe(a,c,e){let t=a.createSpan({cls:"docferry-button-icon",attr:{"aria-hidden":"true"}});(0,Ne.setIcon)(t,c),a.createSpan({text:e,cls:"docferry-button-label"})}function Qt(a,c){a.createSpan({cls:"docferry-icon-button-glyph",attr:{"aria-hidden":"true","data-docferry-icon":c}})}function Xi(a){let c=new Date(a);return Number.isNaN(c.getTime())?"next month":c.toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"})}function ht(a,c){a.addEventListener("click",()=>{c().catch(()=>{new Ne.Notice("That action could not be completed. Check your connection and try again.")})})}function Vr(a,c){let e=c.getBoundingClientRect();a.setUseNativeMenu(!1).showAtPosition({x:e.right,y:e.bottom,left:!0})}function yr(a,c,e){let t=a.createDiv({cls:"docferry-membership-stat"});t.createSpan({text:c}),t.createEl("strong",{text:e})}function zr(a){try{let c=new URL(a.trim());return["http:","https:"].includes(c.protocol)&&!!c.host&&!c.username&&!c.password}catch(c){return!1}}function Kr(a,c){return a instanceof _e?`${c}: ${a.message}`:a instanceof Error?`${c}: ${a.message}`:c}function Zi(a){if(a instanceof _e){if(a.status===404)return"This shared note could not be found.";if(a.status===410)return"This share is no longer available.";if(a.status===401)return"The password was not accepted. Try again."}return a instanceof TypeError||a instanceof Error&&/network|fetch|connect/i.test(a.message)?"DocFerry could not connect. Check your internet connection and try again.":"Import failed. Check the link and try again."}function $i(a){return a instanceof _e&&a.status===401?"Reconnect your Bondie account, then refresh.":a instanceof TypeError||a instanceof Error&&/network|fetch|connect/i.test(a.message)?"DocFerry could not connect. Check your internet connection and refresh.":"Refresh to try loading your shares again."}var Gr="df_id",Jr="df_url",Qr="df_updated",Wr="df_protected",Yr="df_expires";function Xr(a,c){var t,i;let e=(t=a.metadataCache.getFileCache(c))==null?void 0:t.frontmatter;return e?{id:vr(e[Gr]),url:vr(e[Jr]),updated:vr(e[Qr]),passwordEnabled:eo(e[Wr]),expires:(i=vr(e[Yr]))!=null?i:null}:{}}async function Yn(a,c,e,t){await a.fileManager.processFrontMatter(c,i=>{var s;i[Gr]=e.share_id,i[Jr]=e.url,i[Qr]=e.updated_at,i[Wr]=t.passwordEnabled,i[Yr]=(s=t.expiresAt)!=null?s:null})}async function Zr(a,c,e){await a.fileManager.processFrontMatter(c,t=>{let i=Dn(t,e);for(let[s,l]of Object.entries(i))t[s]=l})}async function br(a,c){await a.fileManager.processFrontMatter(c,e=>{delete e[Gr],delete e[Jr],delete e[Qr],delete e[Wr],delete e[Yr]})}function vr(a){return typeof a=="string"&&a.length>0?a:void 0}function eo(a){return typeof a=="boolean"?a:void 0}function $r(a,c){return!a||a.activeFolderShareLimit===0?"upgrade_required":!c&&!a.canCreateFolderShare?"limit_reached":"allowed"}var at=require("obsidian");function St(a){a.modalEl.setAttr("role","dialog"),a.modalEl.setAttr("aria-modal","true"),a.modalEl.addEventListener("keydown",c=>{if(c.key!=="Tab")return;let e=Array.from(a.modalEl.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])')).filter(l=>!l.hasAttribute("disabled")&&l.offsetParent!==null);if(!e.length)return;let t=e[0],i=e[e.length-1],s=activeDocument.activeElement;c.shiftKey&&(s===t||!a.modalEl.contains(s))?(c.preventDefault(),i.focus()):!c.shiftKey&&(s===i||!a.modalEl.contains(s))&&(c.preventDefault(),t.focus())})}function en(a,c){return a?"keep":c}function Sr(a,c,e=new Date){if(a==="keep")return c!=null?c:null;if(a==="never")return null;let t=Number(a);if(!Number.isFinite(t)||t<=0)return null;let i=new Date(e);return i.setDate(i.getDate()+t),i.toISOString()}function Xn(a,c,e){return a?e?c==="full":!0:!1}var wr=class extends at.Modal{constructor(e,t){super(e);this.defaults=t;this.done=!1;this.password="";this.title=t.title,this.passwordEnabled=t.passwordEnabled,this.expiresInDays=t.expiresInDays,this.useThemeStyling=t.canUseThemeStyling&&t.useThemeStyling,this.documentCount=t.documentCount}openAndGetResult(){return new Promise(e=>{this.resolver=e,super.open()})}onOpen(){let{contentEl:e}=this;e.empty(),e.addClass("docferry-folder-share-modal"),St(this),Ke(e,this.defaults.isUpdate?"Update this folder":"Share this folder",`${this.documentCount} ${this.documentCount===1?"note":"notes"} will be included in one share link.`),new at.Setting(e).setName("Title").addText(l=>{l.setValue(this.title).onChange(d=>{this.title=d})});let t=e.createDiv(),i=()=>{t.empty(),this.passwordEnabled&&new at.Setting(t).setName("Password").addText(l=>{l.inputEl.type="password",l.setPlaceholder("Folder password").onChange(d=>{this.password=d})})};new at.Setting(e).setName("Password protection").setDesc("One password protects every note in this folder link.").addToggle(l=>l.setValue(this.passwordEnabled).onChange(d=>{this.passwordEnabled=d,i()})),i(),new at.Setting(e).setName("Link expires").addDropdown(l=>(this.expiresInDays==="keep"?l.addOption("keep","Keep current expiration"):l).addOption("never","Never").addOption("30","30 days").setValue(this.expiresInDays).onChange(d=>{this.expiresInDays=d})),this.defaults.canUseThemeStyling&&new at.Setting(e).setName("Use my Obsidian theme").setDesc("Bring over colors, borders, callouts, and code styling while keeping DocFerry's clean reading layout.").addToggle(l=>l.setValue(this.useThemeStyling).onChange(d=>{this.useThemeStyling=d}));let s=e.createDiv({cls:"modal-button-container"});s.createEl("button",{text:"Cancel"}).addEventListener("click",()=>this.finish(null)),s.createEl("button",{text:this.defaults.isUpdate?"Update folder":"Publish folder",cls:"mod-cta"}).addEventListener("click",()=>{let l=this.title.trim();if(!l){new at.Notice("Title is required.");return}if(this.passwordEnabled&&!this.password.trim()&&!this.defaults.passwordAlreadySet){new at.Notice("Password is required when protection is enabled.");return}this.finish({title:l,passwordEnabled:this.passwordEnabled,password:this.passwordEnabled?this.password:void 0,expiresAt:this.resolveExpiresAt(),useThemeStyling:this.defaults.canUseThemeStyling&&this.useThemeStyling})})}onClose(){this.done||this.finish(null)}finish(e){this.done||(this.done=!0,this.resolver(e),this.close())}resolveExpiresAt(){return Sr(this.expiresInDays,this.defaults.existingExpiresAt)}};function Zn(a){return a.flow==="billing-return"?{kind:"billing-return",status:a.status}:a.flow==="import"&&a.url?{kind:"import",url:a.url}:{kind:"unsupported"}}var $n=require("obsidian");function ei(a,c,e){return new Promise(t=>{new tn(a,c,e,t).open()})}var tn=class extends $n.Modal{constructor(e,t,i,s){super(e);this.targetLabel=t;this.sourcePath=i;this.resolve=s;this.done=!1}onOpen(){let{contentEl:e}=this;e.empty(),Ke(e,"Sign in to publish","Publishing uses the hosted DocFerry service with your Bondie account. After signing in, DocFerry returns to this publish so you can confirm it."),e.createEl("p",{text:this.targetLabel,cls:"setting-item-description"}),this.sourcePath&&e.createEl("p",{text:this.sourcePath,cls:"setting-item-description"});let t=e.createDiv({cls:"modal-button-container"});t.createEl("button",{text:"Not now"}).addEventListener("click",()=>{this.finish(!1)}),t.createEl("button",{text:"Connect account",cls:"mod-cta"}).addEventListener("click",()=>{this.finish(!0)})}onClose(){this.done||this.finish(!1)}finish(e){this.done||(this.done=!0,this.resolve(e),this.close())}};var pt=require("obsidian");var Cr=class extends pt.Modal{constructor(e,t="",i=Ye.defaultImportFolder,s=Ye.serverUrl){super(e);this.serviceUrl=s;this.done=!1;this.password="";this.outputFolder=Ye.defaultImportFolder;this.overwrite=!1;this.url=typeof t=="string"?t:"",this.outputFolder=Nt(i)||Ye.defaultImportFolder}openAndGetResult(){return new Promise(e=>{this.resolver=e,super.open()})}onOpen(){let{contentEl:e}=this;e.empty(),Ke(e,"Import share URL","Import one DocFerry document into this vault."),new pt.Setting(e).setName("Share URL").setDesc("Import one DocFerry share into this vault.").addText(i=>{i.setPlaceholder("https://docferry.bondie.io/s/...").setValue(this.url).onChange(s=>{this.url=s.trim()}),i.inputEl.addClass("docferry-url-input")}),new pt.Setting(e).setName("Password").setDesc("Optional. Required only when the share is password protected.").addText(i=>{i.inputEl.type="password",i.setPlaceholder("Optional password").onChange(s=>{this.password=s})}),new pt.Setting(e).setName("Output folder").setDesc("The imported note and explicitly referenced assets are written under this vault folder.").addText(i=>i.setValue(this.outputFolder).onChange(s=>{this.outputFolder=s.trim()})),new pt.Setting(e).setName("Overwrite existing files").setDesc("When disabled, import stops if the note or an asset already exists.").addToggle(i=>i.setValue(this.overwrite).onChange(s=>{this.overwrite=s}));let t=e.createDiv({cls:"modal-button-container"});t.createEl("button",{text:"Cancel"}).addEventListener("click",()=>{this.finish(null)}),t.createEl("button",{text:"Import",cls:"mod-cta"}).addEventListener("click",()=>{if(!Dt(this.url,this.serviceUrl)){new pt.Notice("Enter a valid DocFerry share URL.");return}let i=Nt(this.outputFolder);if(!i){new pt.Notice("Output folder is required.");return}this.finish({url:this.url,password:this.password.trim()||void 0,outputFolder:i,overwrite:this.overwrite})})}onClose(){this.done||this.finish(null)}finish(e){this.done||(this.done=!0,this.resolver(e),this.close())}};async function ri(a,c){let e=new Set([c.notePath]);for(let d of c.assets){if(e.has(d.path))throw new Error(`Import contains more than one file for: ${d.path}`);e.add(d.path)}for(let d of e)if(await a.exists(d)&&!c.overwrite)throw new Error(`${d===c.notePath?"File":"Asset"} already exists: ${d}`);let t=[];for(let d of c.assets)t.push({path:d.path,body:await c.download(d.url)});let i=[];i.push(await ti(a,c.notePath,"text",c.overwrite));for(let d of t)i.push(await ti(a,d.path,"binary",c.overwrite));let s=[],l=[];try{for(let d of to(e))await a.directoryExists(d)||(await a.createDirectory(d),l.push(d));for(let d=0;de.split("/").length-t.split("/").length)}async function ti(a,c,e,t){let i=await a.exists(c);if(i&&!t)throw new Error(`${e==="text"?"File":"Asset"} already exists: ${c}`);return i?e==="text"?{path:c,kind:e,existed:!0,text:await a.readText(c)}:{path:c,kind:e,existed:!0,binary:await a.readBinary(c)}:{path:c,kind:e,existed:!1}}async function ro(a,c){var e,t;if(!c.existed){await a.exists(c.path)&&await a.remove(c.path);return}c.kind==="text"?await a.writeText(c.path,(e=c.text)!=null?e:""):await a.writeBinary(c.path,(t=c.binary)!=null?t:new ArrayBuffer(0))}var Ut=require("obsidian");var Wt=class extends Ut.Modal{constructor(e,t,i){super(e);this.title=t;this.response=i}onOpen(){let{contentEl:e}=this;e.empty(),Ke(e,"Linked note status","Check whether linked Obsidian notes have DocFerry URLs."),e.createEl("p",{text:this.title,cls:"setting-item-description"}),this.response.links.length||e.createEl("p",{text:"No Obsidian internal links were indexed for this share.",cls:"setting-item-description"});for(let i of this.response.links){let s=new Ut.Setting(e).setName(`${io(i.status)} ${i.label||i.raw_target}`).setDesc(oo(i)),l=i.target_url;l&&s.addButton(d=>{d.setButtonText("Copy").onClick(()=>{no(l)})}).addButton(d=>{d.setButtonText("Open").onClick(()=>{$e(l)})})}e.createDiv({cls:"modal-button-container"}).createEl("button",{text:"Done",cls:"mod-cta"}).addEventListener("click",()=>{this.close()})}};async function no(a){await navigator.clipboard.writeText(a),new Ut.Notice("Target link copied")}function io(a){switch(a){case"resolved":return"Resolved";case"ambiguous":return"Ambiguous";case"unsupported":return"Unsupported";case"unpublished":return"Unpublished"}}function oo(a){let c=a.target_path||a.raw_target;switch(a.status){case"resolved":return`${c} is published and will open as a DocFerry share.`;case"ambiguous":return`${c} matches more than one published document. Publish with clearer paths or update the source link.`;case"unsupported":return`${c} cannot be resolved by DocFerry yet.`;case"unpublished":return`${c} has not been published with DocFerry yet.`}}var Ot=require("obsidian");function ni(a,c){return new Promise(e=>{new rn(a,c,e).open()})}var rn=class extends Ot.Modal{constructor(e,t,i){super(e);this.job=t;this.resolve=i;this.done=!1;this.renderContext=new Ot.Component}onOpen(){let{contentEl:e}=this;e.empty(),this.modalEl.addClass("docferry-media-note-preview-modal"),e.addClass("docferry-media-note-preview"),Ke(e,"Review your note","Check the result before saving it to your vault."),this.renderContext.load();let t=e.createDiv({cls:"docferry-media-note-preview-document"}),i=typeof this.job.markdown=="string"?this.job.markdown.trim():"";if(i)Ot.MarkdownRenderer.render(this.app,i,t,"",this.renderContext);else{t.createDiv({text:zt(this.job),cls:"docferry-media-note-preview-title"});let l=jn(this.job);l&&t.createEl("p",{text:l,cls:"docferry-media-note-preview-summary"})}let s=e.createDiv({cls:"modal-button-container"});s.createEl("button",{text:"Review later"}).addEventListener("click",()=>this.finish(!1)),s.createEl("button",{text:"Save note",cls:"mod-cta"}).addEventListener("click",()=>{this.finish(!0)})}onClose(){this.renderContext.unload(),this.done||(this.done=!0,this.resolve(!1))}finish(e){this.done||(this.done=!0,this.resolve(e),this.close())}};var so="The connection was lost while starting your detailed note. Retrying the same link resumes safely without creating a duplicate.",ao="Your previous detailed note import resumed. Start this link again after it finishes or is cancelled.",uo="The connection was lost while confirming your previous import. Retrying is safe and will not create a duplicate.";function ii(a){let c=a==null?void 0:a.status;return typeof c=="number"&&c>=400&&c<500}async function Yt(a,c){let e;try{e=await a.createJob(c.sourceUrl,c.key)}catch(t){if(ii(t))return await a.store.save(null),null;throw new Error(uo)}return await a.trackImport(e,c),await a.store.save(null),e}async function oi(a,c,e){let t=a.store.read();if(t&&t.ownerProductSubjectId!==e)await a.store.save(null);else if(t&&t.sourceUrl!==c&&await Yt(a,t))throw new Error(ao);let i=a.store.read();i||(i={key:a.generateKey(),sourceUrl:c,ownerProductSubjectId:e,createdAt:a.now()},await a.store.save(i));let s;try{s=await a.createJob(i.sourceUrl,i.key)}catch(l){throw ii(l)?(await a.store.save(null),l):new Error(so)}return await a.trackImport(s,i),await a.store.save(null),s}function si(a,c){return a.serverUrl===c?!1:(a.serverUrl=c,a.sessionToken="",a.connectedAccount=null,a.membership=null,a.pendingMediaNoteImport=null,a.pendingMediaNoteSubmission=null,!0)}var Ar="session-token";function ai(a,c,e){let t=typeof c=="string"?c:"";if(e)return a.setSecret(Ar,""),{token:"",scrubLegacy:!!t};let i=a.getSecret(Ar)||"";return i?{token:i,scrubLegacy:!!t}:t?(a.setSecret(Ar,t),{token:t,scrubLegacy:!0}):{token:"",scrubLegacy:!1}}function nn(a,c){a.setSecret(Ar,c)}var on="pending-auth-state",sn="pending-auth-started-at",an="pending-auth-verifier";function ui(a){return{state:a.getSecret(on)||"",startedAt:a.getSecret(sn)||"",verifier:a.getSecret(an)||""}}function un(a,c){if(!c.state){cn(a);return}a.setSecret(on,c.state),a.setSecret(sn,c.startedAt),a.setSecret(an,c.verifier)}function cn(a){a.setSecret(on,""),a.setSecret(sn,""),a.setSecret(an,"")}function ci(a,c){let e=typeof c.state=="string"?c.state:"",t=typeof c.startedAt=="string"?c.startedAt:"",i=typeof c.verifier=="string"?c.verifier:"";return!e&&!t&&!i?!1:(e&&t&&i&&un(a,{state:e,startedAt:t,verifier:i}),!0)}var xt=require("obsidian");var Xt=class extends xt.Modal{constructor(e,t,i,s,l="document"){super(e);this.title=t;this.url=i;this.updatedAt=s;this.kind=l}onOpen(){let{contentEl:e}=this;e.empty(),e.addClass("docferry-result-modal"),St(this),Ke(e,"Share link ready",`Your published ${this.kind} is ready to open or copy.`);let t=e.createDiv({cls:"docferry-result-card"}),i=t.createDiv({cls:"docferry-result-title-block"});i.createSpan({text:this.kind==="folder"?"Published folder":"Published note",cls:"docferry-result-label"}),i.createEl("h3",{text:this.title,cls:"docferry-heading docferry-heading-3 docferry-result-title"});let s=t.createDiv({cls:"docferry-result-link"});s.createSpan({text:"Share URL",cls:"docferry-result-label"}),s.createEl("code",{text:this.url});let l=t.createDiv({cls:"docferry-result-meta"});l.createSpan({text:"Updated"}),l.createSpan({text:this.updatedAt});let d=e.createDiv({cls:"docferry-result-actions modal-button-container"}),w=d.createEl("button",{cls:"mod-cta",attr:{type:"button"}});ln(w,"copy","Copy link"),w.addEventListener("click",()=>{this.copyLink()});let v=d.createEl("button",{attr:{type:"button"}});ln(v,"external-link","Open"),v.addEventListener("click",()=>{$e(this.url)});let S=d.createEl("button",{attr:{type:"button"}});ln(S,"check","Done"),S.addEventListener("click",()=>{this.close()})}async copyLink(){try{await navigator.clipboard.writeText(this.url),new xt.Notice("Link copied")}catch(e){new xt.Notice("The link could not be copied. Select the Share URL and copy it manually.")}}};function ln(a,c,e){let t=a.createSpan({cls:"docferry-button-icon",attr:{"aria-hidden":"true"}});(0,xt.setIcon)(t,c),a.createSpan({text:e})}var ut=require("obsidian");var Dr=class extends ut.Modal{constructor(e,t){super(e);this.defaults=t;this.done=!1;this.password="";this.title=t.title,this.passwordEnabled=t.passwordEnabled,this.expiresInDays=t.expiresInDays,this.useThemeStyling=t.canUseThemeStyling&&t.useThemeStyling}openAndGetResult(){return new Promise(e=>{this.resolver=e,super.open()})}onOpen(){let{contentEl:e}=this;e.empty(),e.addClass("docferry-share-modal"),St(this),Ke(e,this.defaults.isUpdate?"Update this share":"Share this note",this.defaults.isUpdate?"Refresh the existing link with the latest version of this note.":"Create a share link. Add a password or expiry only when you need one."),new ut.Setting(e).setName("Title").addText(d=>{d.setValue(this.title).onChange(w=>{this.title=w}),d.inputEl.addClass("docferry-title-input")});let t=e.createDiv(),i=()=>{t.empty(),this.passwordEnabled&&new ut.Setting(t).setName("Password").addText(d=>{d.inputEl.type="password",d.setPlaceholder("Optional password").onChange(w=>{this.password=w})})};new ut.Setting(e).setName("Password protection").setDesc("Protect this share link with a document-level password.").addToggle(d=>d.setValue(this.passwordEnabled).onChange(w=>{this.passwordEnabled=w,i()})),i(),new ut.Setting(e).setName("Link expires").addDropdown(d=>(this.expiresInDays==="keep"?d.addOption("keep","Keep current expiration"):d).addOption("never","Never").addOption("30","30 days").setValue(this.expiresInDays).onChange(w=>{this.expiresInDays=w})),this.defaults.canUseThemeStyling&&new ut.Setting(e).setName("Use my Obsidian theme").setDesc("Bring over colors, borders, callouts, and code styling while keeping DocFerry's clean reading layout.").addToggle(d=>d.setValue(this.useThemeStyling).onChange(w=>{this.useThemeStyling=w}));let s=e.createDiv({cls:"modal-button-container"});s.createEl("button",{text:"Cancel"}).addEventListener("click",()=>{this.finish(null)}),s.createEl("button",{text:this.defaults.isUpdate?"Update":"Publish",cls:"mod-cta"}).addEventListener("click",()=>{let d=this.title.trim();if(!d){new ut.Notice("Title is required.");return}if(this.passwordEnabled&&!this.password.trim()&&!this.defaults.passwordAlreadySet){new ut.Notice("Password is required when password protection is enabled.");return}this.finish({title:d,passwordEnabled:this.passwordEnabled,password:this.passwordEnabled?this.password:void 0,expiresAt:this.resolveExpiresAt(),useThemeStyling:this.defaults.canUseThemeStyling&&this.useThemeStyling})})}onClose(){this.done||this.finish(null)}finish(e){this.done||(this.done=!0,this.resolver(e),this.close())}resolveExpiresAt(){return Sr(this.expiresInDays,this.defaults.existingExpiresAt)}};function _t(a){return/^(?:https?:)?\/\//i.test(a)||/^(?:data|blob):/i.test(a)}var Er=require("obsidian");function li(a,c="publish"){return new Promise(e=>{new hn(a,c,e).open()})}var hn=class extends Er.Modal{constructor(e,t,i){super(e);this.context=t;this.resolve=i;this.settled=!1}onOpen(){let{contentEl:e}=this;e.empty(),e.addClass("docferry-upload-consent-modal"),St(this);let t=e.createDiv({cls:"docferry-consent-header"});It(t,"docferry-consent-logo").setAttr("aria-hidden","true");let i=t.createDiv({cls:"docferry-consent-copy"}),s=this.context==="startup"?"Privacy and security":this.context==="detailed_note"?"Before DocFerry prepares this link":"Before you publish";i.createEl("h2",{text:s,cls:"docferry-heading docferry-heading-2"}),i.createEl("p",{text:"Your vault stays on this device. DocFerry uploads content only when you choose to share or save a public link."});let l=e.createDiv({cls:"docferry-consent-summary"});dn(l,"file-check-2","You choose what leaves Obsidian","Only the note, folder, files, or public link you select. Some supported links may use external AI to prepare a note."),dn(l,"shield-check","Protected during transfer and storage","Connections use HTTPS and stored content is encrypted. Attachments may upload straight to Tencent Cloud storage with a short-lived credential."),dn(l,"sliders-horizontal","You stay in control","Add a password or expiry, and stop a share whenever you need to."),e.createEl("p",{cls:"docferry-consent-boundary",text:"DocFerry must decrypt content to display a share or create an import. This is not end-to-end or zero-knowledge encryption."});let d=e.createEl("details",{cls:"docferry-consent-details"});d.createEl("summary",{text:"Privacy details"});let w=d.createDiv({cls:"docferry-consent-details-body"});w.createEl("h3",{text:"What DocFerry receives",cls:"docferry-heading docferry-heading-4"}),w.createEl("p",{text:"Sharing uploads the selected note or folder, its web snapshot, and referenced local files. Saving a supported public link sends its URL to DocFerry. For supported media, DocFerry may send a public YouTube URL or bounded audio or video content, including a reviewed public Bilibili stream, through OpenRouter to a server-selected AI model to create the note. OpenRouter and the selected model provider process that input. DocFerry does not send your Bondie identity, browser cookies, history, profile, or other vault files."}),w.createEl("p",{text:"To keep publishing fast, referenced images and attachments may upload directly from this device to Tencent Cloud Object Storage (COS), a third-party storage provider. DocFerry issues a temporary credential that lasts about 30 minutes, works only for that single upload, and is never saved by the plugin. Only files referenced by the note you publish, and the optional Pro theme style snapshot, use this path; your note text is sent to DocFerry, not to cloud storage. If direct upload is unavailable or fails, the file is uploaded through the DocFerry server instead."}),w.createEl("h3",{text:"Passwords, sessions, and retention",cls:"docferry-heading docferry-heading-4"}),w.createEl("p",{text:"Share passwords are stored as one-way hashes. Your account token is stored by your operating system's secure storage on this device, not in plugin data. Temporary import content is cleared after its retention period. Uploaded assets stay stored while a share is live, and unreferenced assets become eligible for deletion after 7 days. Stopping a share makes its content unavailable right away; stored content is cleared after its retention period. Anyone with the link, and its password when enabled, can view the shared content."});let v=w.createEl("a",{text:"Read the DocFerry Privacy Policy",href:"https://docferry.bondie.io/privacy"});v.setAttr("target","_blank"),v.setAttr("rel","noopener noreferrer");let S=e.createDiv({cls:"modal-button-container docferry-consent-actions"}),x=S.createEl("button",{text:this.context==="startup"?"Not now":"Cancel",attr:{type:"button"}}),k=S.createEl("button",{text:this.context==="startup"||this.context==="detailed_note"?"Continue":"Publish",cls:"mod-cta",attr:{type:"button"}});x.addEventListener("click",()=>this.closeWith(!1)),k.addEventListener("click",()=>this.closeWith(!0))}onClose(){this.settled||(this.settled=!0,this.resolve(!1)),this.contentEl.empty()}closeWith(e){this.settled=!0,this.resolve(e),this.close()}};function dn(a,c,e,t){let i=a.createDiv({cls:"docferry-consent-summary-item"}),s=i.createSpan({cls:"docferry-consent-summary-icon",attr:{"aria-hidden":"true"}});(0,Er.setIcon)(s,c);let l=i.createDiv();l.createEl("h3",{text:e,cls:"docferry-heading docferry-heading-4"}),l.createEl("p",{text:t})}function hi(a,c,e){let t=di(a||"");if(t&&e(t))return t;let i=di(c);return i&&e(i)?i:null}function di(a){let c=a.trim();if(!c||co(c))return null;if(/^obsidian:\/\//i.test(c)){let e=lo(c);return pn(e||c.replace(/^obsidian:\/\//i,""))}return/^[a-z][a-z0-9+.-]*:\/\//i.test(c)?null:pn(c)}function co(a){return Array.from(a).some(c=>{let e=c.charCodeAt(0);return e<=31||e===127})}function lo(a){try{return new URL(a).searchParams.get("file")||null}catch(c){return null}}function pn(a){let c=a.replace(/\\/g,"/").replace(/^\/+/,"").replace(/\/{2,}/g,"/").trim();return!c||c==="."||c.split("/").some(e=>e==="..")?null:c}function Tt(a,c=new Date){return ho(po(a)).replace(/[\\/:*?"<>|]+/g,"-").replace(/\s+/g," ").trim().replace(/^\.+|\.+$/g,"").slice(0,120).trim()||`docferry-import-${c.toISOString().replace(/[-:.TZ]/g,"").slice(0,14)}`}function ho(a){return Array.from(a,c=>{let e=c.charCodeAt(0);return e<=31||e===127?" ":c}).join("")}function po(a){return typeof a=="string"?a:typeof a=="number"||typeof a=="boolean"||typeof a=="bigint"?String(a):""}function fo(){var c,e;return`plugin-${((e=(c=window.crypto)==null?void 0:c.randomUUID)==null?void 0:e.call(c))||`${Date.now()}-${Math.random().toString(36).slice(2)}`}`}var pi="docferry-obsidian-theme-snapshot.css",go=3,fi="docferry-privacy-security-disclosure-v8",mo=["docferry"],yo=900*1e3,vo=[2e3,5e3,1e4,2e4,3e4,6e4,9e4,12e4],xr=class extends q.Plugin{constructor(){super(...arguments);this.settingTab=null;this.uploadNoticeOpen=!1;this.billingReturnRefreshGeneration=0;this.pendingBillingReturnRefreshUntil=0;this.billingReturnRefreshInFlight=!1;this.billingSessionRecoveryUntil=0;this.activeVaultDragPath="";this.lastActiveMarkdownPath="";this.mediaNoteRecoveryInFlight=!1;this.pendingPublishIntent=null;this.shareImportCommitQueue=Promise.resolve();this.unloaded=!1;this.pendingTimeouts=new Set;this.publishInFlight=new Set}onunload(){var e;this.unloaded=!0;for(let t of this.pendingTimeouts)window.clearTimeout(t);this.pendingTimeouts.clear(),(e=this.auth)==null||e.dispose()}scheduleTimeout(e,t){if(this.unloaded)return;let i=window.setTimeout(()=>{this.pendingTimeouts.delete(i),this.unloaded||e()},t);this.pendingTimeouts.add(i)}async onload(){await this.loadSettings(),this.api=new or(()=>this.docferrySettings,this.manifest.version,e=>this.handleInvalidProductSession(e)),this.auth=new ar(this.api,async(e,t)=>{var d,w,v,S;if(this.unloaded)return;this.billingSessionRecoveryUntil=0;let i=this.docferrySettings.pendingMediaNoteSubmission;if(i&&t.product_subject_id&&i.ownerProductSubjectId!==t.product_subject_id)try{await Yt(this.mediaNoteSubmissionDeps(),i)}catch(x){throw await this.rejectMismatchedLoginToken(e),new Et("Could not confirm the state of your previous detailed note. Check your connection, then sign in again.")}let s=this.docferrySettings.pendingMediaNoteImport;if(s&&t.product_subject_id&&s.ownerProductSubjectId!==t.product_subject_id)throw await this.rejectMismatchedLoginToken(e),new Et("This detailed note belongs to another Bondie account. Sign in with the account that started it, then resume or cancel it.");let l=this.docferrySettings.sessionToken;if(l&&l!==e)try{await this.api.logout()}catch(x){this.debug("previous session revoke during connect failed",x)}try{this.adoptSessionToken(e)}catch(x){throw this.debug("secure session token adoption failed",x),new Et("DocFerry could not store your sign-in securely. Update Obsidian, then start login again.")}this.docferrySettings.connectedAccount=t.product_subject_id?{productSubjectId:t.product_subject_id,productKey:(d=t.product_key)!=null?d:null,productInstanceId:(w=t.product_instance_id)!=null?w:null,displayUser:(v=t.display_user)!=null?v:null,connectedAt:new Date().toISOString()}:null,await this.saveSettings(),(S=this.settingTab)==null||S.refreshForAuthChange(),this.refreshDashboardAuth();try{await this.loadMembership(!0)}catch(x){this.debug("membership refresh after login failed",x)}await this.resumePendingPublishIntent()},()=>({clientInstanceId:this.docferrySettings.clientInstanceId,pluginVersion:this.manifest.version,platform:"obsidian",instanceType:"obsidian_plugin"}),()=>ui(this.app.secretStorage),async(e,t,i)=>{un(this.app.secretStorage,{state:e,startedAt:t,verifier:i})}),this.auth.resumePendingLogin().catch(e=>{this.debug("pending login resume failed",e)}),this.settingTab=new gr(this.app,this),this.addSettingTab(this.settingTab),this.registerView(kt,e=>new bt(e,this)),this.registerEvent(this.app.workspace.on("file-menu",(e,t)=>{t instanceof q.TFolder&&e.addItem(i=>i.setTitle("Publish folder with DocFerry").setIcon("folder-up").onClick(()=>void this.publishFolder(t)))})),this.registerEvent(this.app.workspace.on("active-leaf-change",e=>{let t=e==null?void 0:e.view;t instanceof q.MarkdownView&&t.file instanceof q.TFile&&t.file.extension==="md"&&(this.lastActiveMarkdownPath=t.file.path)})),this.addRibbonIcon("ship","Open dashboard",()=>{this.activateDashboardView().then(e=>e==null?void 0:e.showHomePage())});for(let e of mo)this.registerObsidianProtocolHandler(e,async t=>{let s=Zn(t);if(s.kind==="billing-return"){await this.handleBillingReturn(s.status);return}if(s.kind==="import"){await this.importShareUrl(s.url);return}new q.Notice("This DocFerry link is not supported.")});this.registerDomEvent(window,"focus",()=>{this.refreshAfterPendingBillingReturn()}),this.registerDomEvent(activeDocument,"visibilitychange",()=>{activeDocument.visibilityState==="visible"&&this.refreshAfterPendingBillingReturn()}),this.registerDomEvent(activeDocument,"dragstart",e=>{let t=e.target instanceof Element?e.target.closest("[data-path]"):null,i=(t==null?void 0:t.dataset.path)||"";this.activeVaultDragPath=this.app.vault.getAbstractFileByPath(i)?i:""},!0),this.registerDomEvent(activeDocument,"dragend",()=>{this.scheduleTimeout(()=>{this.activeVaultDragPath=""},0)},!0),this.addCommand({id:"open-dashboard",name:"Open dashboard",callback:()=>{this.activateDashboardView().then(e=>e==null?void 0:e.showHomePage())}}),this.addCommand({id:"open-shares",name:"Open shared links",callback:()=>{this.activateDashboardView().then(e=>e==null?void 0:e.showSharesPage())}}),this.addCommand({id:"open-account",name:"Open account",callback:()=>{this.activateDashboardView().then(e=>e==null?void 0:e.showAccountPage())}}),this.addCommand({id:"publish-current-note",name:"Publish current note",checkCallback:e=>{let t=this.getActiveMarkdownFile();return t?(e||this.publishFile(t),!0):!1}}),this.addCommand({id:"publish-current-folder",name:"Publish current note folder",checkCallback:e=>{var i;let t=(i=this.getActiveMarkdownFile())==null?void 0:i.parent;return t instanceof q.TFolder?(e||this.publishFolder(t),!0):!1}}),this.addCommand({id:"copy-share-link",name:"Copy share link",checkCallback:e=>{let t=this.getActiveMarkdownFile();return t?(e||this.copyShareLink(t),!0):!1}}),this.addCommand({id:"stop-sharing-current-note",name:"Stop sharing current note",checkCallback:e=>{let t=this.getActiveMarkdownFile();return!t||!this.currentShareMeta(t).id?!1:(e||this.stopSharing(t),!0)}}),this.addCommand({id:"show-linked-note-status",name:"Show linked note status",checkCallback:e=>{let t=this.getActiveMarkdownFile();return!t||!this.currentShareMeta(t).id?!1:(e||this.showLinkStatus(t),!0)}}),this.addCommand({id:"import-share-url",name:"Import share URL",callback:()=>{this.importShareUrl()}}),this.addCommand({id:"import-web-link",name:"Import web or media link",callback:()=>{this.activateDashboardView().then(e=>e==null?void 0:e.showHomePage())}}),this.addCommand({id:"connect-account",name:"Connect account",callback:()=>{this.startLogin()}}),this.addCommand({id:"create-account",name:"Create Bondie account",callback:()=>{this.startSignup()}}),this.addCommand({id:"reconnect-account",name:"Reconnect account",callback:()=>{this.reconnectAccount()}}),this.registerEvent(this.app.workspace.on("file-menu",(e,t)=>{if(!(t instanceof q.TFile)||t.extension!=="md")return;this.currentShareMeta(t).id?(e.addItem(s=>{s.setTitle("Update share link").setIcon("upload-cloud").onClick(()=>void this.publishFile(t))}),e.addItem(s=>{s.setTitle("Copy share link").setIcon("copy").onClick(()=>void this.copyShareLink(t))}),e.addItem(s=>{s.setTitle("Show linked note status").setIcon("list-checks").onClick(()=>void this.showLinkStatus(t))}),e.addItem(s=>{s.setTitle("Stop sharing").setIcon("unlink").onClick(()=>void this.stopSharing(t))})):e.addItem(s=>{s.setTitle("Publish share link").setIcon("share").onClick(()=>void this.publishFile(t))})})),this.app.workspace.onLayoutReady(()=>{this.docferrySettings.sessionToken&&this.refreshMembershipForDashboardOpen(),this.docferrySettings.sessionToken&&this.docferrySettings.pendingMediaNoteImport?this.scheduleTimeout(()=>void this.resumeActiveMediaImport(),900):this.docferrySettings.sessionToken&&this.docferrySettings.pendingMediaNoteSubmission&&this.scheduleTimeout(()=>void this.recoverPendingMediaNoteSubmission(),900),this.scheduleTimeout(()=>{this.showUploadNoticeIfNeeded(!1)},600)})}async loadSettings(){let e=await this.loadData(),t=new Set(Object.keys(Ye)),i={...Ye};for(let S of t)e&&Object.prototype.hasOwnProperty.call(e,S)&&(i[S]=e[S]);this.docferrySettings=i;let s=!!(e&&Object.keys(e).some(S=>!t.has(S))),l=si(this.docferrySettings,Ye.serverUrl);s=l||s;try{let S=ai(this.app.secretStorage,this.docferrySettings.sessionToken,l);this.docferrySettings.sessionToken=S.token,S.scrubLegacy&&(s=!0),l?cn(this.app.secretStorage):e&&ci(this.app.secretStorage,{state:e.pendingAuthState,startedAt:e.pendingAuthStartedAt,verifier:e.pendingAuthVerifier})&&(s=!0)}catch(S){this.docferrySettings.sessionToken="",s=!0,this.debug("secure session token storage unavailable",S),new q.Notice("DocFerry could not access secure credential storage. Update Obsidian, then sign in again.",8e3)}this.docferrySettings.clientInstanceId||(this.docferrySettings.clientInstanceId=`obs_${crypto.randomUUID()}`,s=!0);let d=Nt(this.docferrySettings.defaultImportFolder)||Ye.defaultImportFolder;this.docferrySettings.defaultImportFolder!==d&&(this.docferrySettings.defaultImportFolder=d,s=!0);let w=this.docferrySettings.pendingMediaNoteImport;w&&(!w.jobId||!w.ownerProductSubjectId||!w.sourceUrl)&&(this.docferrySettings.pendingMediaNoteImport=null,s=!0);let v=this.docferrySettings.pendingMediaNoteSubmission;v&&(!v.key||!v.ownerProductSubjectId||!v.sourceUrl)&&(this.docferrySettings.pendingMediaNoteSubmission=null,s=!0),s&&await this.saveSettings()}async saveSettings(){await this.saveData({...this.docferrySettings,sessionToken:""})}adoptSessionToken(e){nn(this.app.secretStorage,e),this.docferrySettings.sessionToken=e}clearSessionTokenCustody(){this.docferrySettings.sessionToken="";try{nn(this.app.secretStorage,"")}catch(e){this.debug("secure session token cleanup failed",e)}}async testConnection(){var e,t,i,s,l,d,w,v,S,x,k,N,R;try{if(await this.api.health(),!this.docferrySettings.sessionToken){new q.Notice("DocFerry server is reachable, but no Bondie account is connected.");return}let F=await this.api.whoami();if(F.product_subject_id){this.docferrySettings.connectedAccount={productSubjectId:F.product_subject_id,productKey:(e=F.product_key)!=null?e:null,productInstanceId:(t=F.product_instance_id)!=null?t:null,displayUser:(l=(s=F.display_user)!=null?s:(i=this.docferrySettings.connectedAccount)==null?void 0:i.displayUser)!=null?l:null,connectedAt:(w=(d=this.docferrySettings.connectedAccount)==null?void 0:d.connectedAt)!=null?w:new Date().toISOString()},await this.saveSettings(),(v=this.settingTab)==null||v.refreshForAuthChange(),this.refreshDashboardAuth();try{await this.loadMembership(!0)}catch(M){this.debug("membership refresh after connection test failed",M)}}let j=((x=(S=this.docferrySettings.connectedAccount)==null?void 0:S.displayUser)==null?void 0:x.name)||((N=(k=this.docferrySettings.connectedAccount)==null?void 0:k.displayUser)==null?void 0:N.email)||((R=this.docferrySettings.connectedAccount)==null?void 0:R.productSubjectId.slice(-8))||"Bondie account";if(F.billing_session_ready===!1){new q.Notice(`DocFerry server is reachable. Signed in as ${j}; reconnect before managing billing.`);return}new q.Notice(`DocFerry server is reachable. Signed in as ${j}.`)}catch(F){if(Oe(F))return;new q.Notice(this.formatError(F,"Connection failed"))}}async startLogin(){await this.auth.startLogin()}async startSignup(){var t;!await this.finishPendingImportBeforeAccountChange()||!await this.auth.startLogin({signup:!0})||await this.logoutBeforeAccountChange()&&(this.clearLocalBondieAccount(),await this.saveSettings(),(t=this.settingTab)==null||t.refreshForAuthChange(),this.refreshDashboardAuth())}async reconnectAccount(){var t;!await this.finishPendingImportBeforeAccountChange()||!await this.auth.startLogin({promptLogin:!0})||await this.logoutBeforeAccountChange()&&(this.clearLocalBondieAccount(),await this.saveSettings(),(t=this.settingTab)==null||t.refreshForAuthChange(),this.refreshDashboardAuth())}async logoutBeforeAccountChange(){if(!this.docferrySettings.sessionToken)return!0;try{return await this.api.logout(),!0}catch(e){return Oe(e)?!0:(new q.Notice(this.formatError(e,"Could not switch accounts")),!1)}}async disconnectAccount(){var e;if(await this.finishPendingImportBeforeAccountChange()){try{await this.auth.cancelPendingLogin()}catch(t){this.debug("pending login cleanup during disconnect failed",t)}if(this.docferrySettings.sessionToken)try{await this.api.logout()}catch(t){if(!Oe(t)){new q.Notice(this.formatError(t,"Could not disconnect"));return}}this.clearLocalBondieAccount(),await this.saveSettings(),(e=this.settingTab)==null||e.refreshForAuthChange(),this.refreshDashboardAuth(),new q.Notice("Bondie account disconnected.")}}async rejectMismatchedLoginToken(e){let t=this.docferrySettings.sessionToken,i=this.docferrySettings.connectedAccount,s=this.docferrySettings.membership;this.docferrySettings.sessionToken=e;try{await this.api.logout()}catch(l){this.debug("logout mismatched account session failed",l)}finally{this.docferrySettings.sessionToken=t,this.docferrySettings.connectedAccount=i,this.docferrySettings.membership=s,await this.saveSettings()}}async finishPendingImportBeforeAccountChange(){let e=this.docferrySettings.pendingMediaNoteSubmission;if(e)try{await Yt(this.mediaNoteSubmissionDeps(),e)}catch(t){return new q.Notice(this.formatError(t,"Could not confirm the state of your previous detailed note"),8e3),!1}if(!this.docferrySettings.pendingMediaNoteImport)return!0;try{await this.cancelActiveMediaImport()}catch(t){return new q.Notice(this.formatError(t,"Could not cancel the current detailed note"),8e3),!1}return this.docferrySettings.pendingMediaNoteImport?(new q.Notice("Finish or cancel the current detailed note before changing Bondie accounts.",8e3),!1):!0}clearLocalBondieAccount(e=!1){this.billingReturnRefreshGeneration++,this.clearPendingBillingReturnRefresh(),this.clearSessionTokenCustody(),this.docferrySettings.connectedAccount=null,this.docferrySettings.membership=null,e||(this.docferrySettings.pendingMediaNoteImport=null),e||(this.docferrySettings.pendingMediaNoteSubmission=null)}handleInvalidProductSession(e){var t;Oe(e)&&(!this.docferrySettings.sessionToken&&!this.docferrySettings.connectedAccount&&!this.docferrySettings.membership||(this.clearLocalBondieAccount(!0),(t=this.settingTab)==null||t.refreshForAuthChange(),this.refreshDashboardAuth(),this.saveSettings().catch(i=>this.debug("invalid session cleanup failed",i)),new q.Notice("Your Bondie session ended. Log in again.")))}async listShares(){try{return(await this.api.listShares()).shares}catch(e){if(Oe(e))return[];throw e}}async listFolderShares(){return this.docferrySettings.sessionToken?(await this.api.listFolderShares()).folder_shares:[]}async stopFolderShareFromList(e){await cr(this.app,e.title,e.source_folder)&&(await this.api.deleteFolderShare(e.folder_share_id),new q.Notice("Folder share stopped."),this.refreshDashboardShare())}async deleteShareHistory(e){await Mr(this.app,e.title||e.source_path,e.source_path)&&(await this.api.deleteShareRecord(e.share_id),await this.clearLocalShareMetaForId(e.share_id),new q.Notice("Share history deleted."),this.refreshDashboardShare())}async deleteFolderShareHistory(e){await Mr(this.app,e.title,e.source_folder)&&(await this.api.deleteFolderShareRecord(e.folder_share_id),new q.Notice("Folder share history deleted."),this.refreshDashboardShare())}async refreshMembership(e=!1){if(!this.docferrySettings.sessionToken){await this.auth.startLogin()&&new q.Notice("Finish signing in in your browser, then return to share this note.");return}try{await this.loadMembership(e),new q.Notice("Access refreshed.")}catch(t){if(this.isBillingSessionRequired(t)){await this.recoverBillingSession(!0);return}if(Oe(t))return;new q.Notice(this.formatError(t,"Access refresh failed"))}}async openMembershipCenter(){if(!this.docferrySettings.serverUrl){new q.Notice("Configure server URL first.");return}if(!this.docferrySettings.sessionToken){await this.auth.startLogin()&&new q.Notice("Finish signing in in your browser, then return to share this folder.");return}let e=`${this.docferrySettings.serverUrl.replace(/\/+$/,"")}/dashboard/plans?refresh_membership=1`;if(this.markPendingBillingReturnRefresh(),this.docferrySettings.sessionToken)try{let t=await this.api.createDashboardLink("/dashboard/plans?refresh_membership=1");$e(t.dashboard_url),new q.Notice("DocFerry access page opened in your browser.");return}catch(t){Oe(t)||new q.Notice(this.formatError(t,"Access page needs reconnect"))}$e(e)}async openDashboardHome(){if(!this.docferrySettings.serverUrl){new q.Notice("Configure server URL first.");return}let e=`${this.docferrySettings.serverUrl.replace(/\/+$/,"")}/dashboard`;if(this.docferrySettings.sessionToken)try{let t=await this.api.createDashboardLink("/dashboard");$e(t.dashboard_url);return}catch(t){this.debug("dashboard link failed",t)}$e(e)}async requestAccessUpgrade(e){if(!this.docferrySettings.sessionToken){new q.Notice("Connect your Bondie account before sending feedback.");return}try{let i=await this.api.createDashboardLink("/dashboard/support#feedback");$e(i.dashboard_url),new q.Notice("Feedback page opened in your browser.")}catch(t){if(Oe(t))return;new q.Notice(this.formatError(t,"Feedback page needs reconnect"))}}async activateDashboardView(e=!0){this.rememberActiveMarkdownFile();let t=this.app.workspace.getLeavesOfType(kt)[0];if(t){await this.app.workspace.revealLeaf(t);let l=t.view instanceof bt?t.view:null;return e&&this.refreshMembershipForDashboardOpen(),l}let i=this.app.workspace.getLeaf("tab");await i.setViewState({type:kt,active:!0}),await this.app.workspace.revealLeaf(i);let s=i.view instanceof bt?i.view:null;return e&&this.refreshMembershipForDashboardOpen(),s}openSettingsTab(){let e=this.app;if(!e.setting){new q.Notice("Open Settings, then Community plugins, then DocFerry.");return}e.setting.open(),e.setting.openTabById(this.manifest.id)}async openSharesPage(){var i,s;(s=(i=this.app.setting)==null?void 0:i.close)==null||s.call(i);let t=await this.activateDashboardView();t==null||t.showSharesPage()}getActiveNoteLabel(){var e,t;return(t=(e=this.getActiveMarkdownFile())==null?void 0:e.basename)!=null?t:null}async publishActiveNote(){let e=this.getActiveMarkdownFile();if(!e){new q.Notice("Open a Markdown note before sharing.");return}await this.publishFile(e)}async openShareLinks(e){try{let t=await this.api.getShareLinks(e.share_id);new Wt(this.app,e.title||e.source_path,t).open()}catch(t){if(Oe(t))return;new q.Notice(this.formatError(t,"Link status failed"))}}async updateShareFromList(e){let t=await this.resolveVaultId();if(!e.vault_id||e.vault_id!==t){new q.Notice("Open the source vault to update that share.");return}let i=this.findSharedFileByShareId(e.share_id);if(!i){let s=this.markdownFileByPath(e.source_path);if(s)if(!this.currentShareMeta(s).id)i=s;else{new q.Notice("The note at the remembered path is linked to a different share. Open the moved source note to update that share.",8e3);return}}if(!i){new q.Notice("Open the source note in this vault to update that share.");return}await this.publishFile(i,e)}async updateFolderShareFromList(e){let t=await this.resolveVaultId();if(e.vault_id!==t){new q.Notice("Open the source vault to update that folder share.");return}let i=this.app.vault.getAbstractFileByPath(e.source_folder);if(!(i instanceof q.TFolder)){new q.Notice("Open the source folder in this vault to update that share.");return}await this.publishFolder(i)}async stopShareFromList(e){if(!await cr(this.app,e.title||e.source_path,e.source_path))return;let i=new q.Notice("Stopping share...",0);try{await this.api.deleteShare(e.share_id),await this.clearLocalShareMetaForId(e.share_id),this.refreshDashboardShare(),i.hide(),new q.Notice("Share stopped. The link is no longer available.")}catch(s){if(i.hide(),Oe(s))return;new q.Notice(this.formatError(s,"Stop sharing failed"))}}async loadMembership(e){var i,s,l,d;let t=await this.api.getMembership(e);if(t.product_subject_id){let w=this.docferrySettings.connectedAccount;(!w||w.productSubjectId!==t.product_subject_id)&&(this.docferrySettings.connectedAccount={productSubjectId:t.product_subject_id,productKey:t.product_key,productInstanceId:(i=w==null?void 0:w.productInstanceId)!=null?i:null,displayUser:(w==null?void 0:w.productSubjectId)===t.product_subject_id&&(s=w.displayUser)!=null?s:null,connectedAt:(l=w==null?void 0:w.connectedAt)!=null?l:new Date().toISOString()})}if(this.docferrySettings.membership=Wn(t),await this.saveSettings(),(d=this.settingTab)==null||d.refreshForAuthChange(),this.refreshDashboardAuth(),t.unavailable_reason==="synapsehub_user_session_required")throw new _e("Reconnect your Bondie account before refreshing paid access.",401,t.unavailable_reason)}refreshMembershipForDashboardOpen(){this.docferrySettings.sessionToken&&this.loadMembership(!0).catch(async e=>{if(this.isBillingSessionRequired(e)){await this.recoverBillingSession();return}Oe(e)||this.debug("dashboard membership refresh failed",e)})}async handleBillingReturn(e){let t=await this.activateDashboardView(!1);if(t==null||t.showAccountPage(),e==="cancel"){this.clearPendingBillingReturnRefresh(),new q.Notice("Checkout cancelled. Access was not changed.");try{await this.loadMembership(!0)}catch(i){if(this.isBillingSessionRequired(i)){await this.recoverBillingSession();return}if(Oe(i))return;new q.Notice(this.formatError(i,"Access refresh failed"))}t==null||t.showAccountPage();return}this.clearPendingBillingReturnRefresh(),new q.Notice("Payment returned. Refreshing access...");try{await this.loadMembership(!0),t==null||t.showAccountPage();let i=this.docferrySettings.membership;i&&i.planKey!=="free"?new q.Notice(`Access active: ${i.planDisplayName}.`):(new q.Notice("Access still shows Free. DocFerry will keep refreshing while the account update completes.",8e3),this.scheduleMembershipRefreshes())}catch(i){if(this.isBillingSessionRequired(i)){await this.recoverBillingSession();return}if(Oe(i))return;new q.Notice(this.formatError(i,"Access refresh failed")),this.scheduleMembershipRefreshes()}}async refreshAfterPendingBillingReturn(){if(!this.pendingBillingReturnRefreshUntil||Date.now()>this.pendingBillingReturnRefreshUntil){this.clearPendingBillingReturnRefresh();return}if(!this.billingReturnRefreshInFlight&&this.docferrySettings.sessionToken){this.clearPendingBillingReturnRefresh(),this.billingReturnRefreshInFlight=!0;try{let e=await this.activateDashboardView(!1);e==null||e.showAccountPage(),await this.loadMembership(!0);let t=this.docferrySettings.membership;t&&t.planKey!=="free"?new q.Notice(`Access active: ${t.planDisplayName}.`):(new q.Notice("Refreshing access after billing. DocFerry will check again while the account update completes.",8e3),this.scheduleMembershipRefreshes())}catch(e){if(this.isBillingSessionRequired(e)){await this.recoverBillingSession();return}if(Oe(e))return;this.debug("billing return focus refresh failed",e),this.scheduleMembershipRefreshes()}finally{this.billingReturnRefreshInFlight=!1}}}markPendingBillingReturnRefresh(){this.docferrySettings.sessionToken&&(this.pendingBillingReturnRefreshUntil=Date.now()+yo)}clearPendingBillingReturnRefresh(){this.pendingBillingReturnRefreshUntil=0}scheduleMembershipRefreshes(){if(!this.docferrySettings.sessionToken)return;let e=++this.billingReturnRefreshGeneration;for(let t of vo)this.scheduleTimeout(()=>void this.runScheduledMembershipRefresh(e),t)}async runScheduledMembershipRefresh(e){if(!this.unloaded&&e===this.billingReturnRefreshGeneration)try{await this.loadMembership(!0);let t=this.docferrySettings.membership;t&&t.planKey!=="free"&&(this.billingReturnRefreshGeneration++,new q.Notice(`Access active: ${t.planDisplayName}.`))}catch(t){if(this.isBillingSessionRequired(t)){await this.recoverBillingSession();return}if(Oe(t))return;this.debug("scheduled membership refresh failed",t)}}isBillingSessionRequired(e){return e instanceof _e?e.code==="synapsehub_user_session_required":!e||typeof e!="object"?!1:"code"in e&&e.code==="synapsehub_user_session_required"}async recoverBillingSession(e=!1){if(this.unloaded)return;if(!e&&Date.now(){j.setMessage(C)});j.setMessage(S?"Updating share link...":"Publishing share link...");let b=S?await this.updateOrCreateShare(S,g,j):await this.api.createShare(g);i&&await Zr(this.app,e,i),v!=null&&v.url&&await Zr(this.app,e,v),await Yn(this.app,e,b,{passwordEnabled:F.passwordEnabled,expiresAt:F.expiresAt}),j.hide();try{await navigator.clipboard.writeText(b.url),new q.Notice("Share link copied")}catch(C){new q.Notice("Share updated, but the link could not be copied. Copy it from the result window.")}new Xt(this.app,F.title,b.url,b.updated_at).open(),this.refreshDashboardShare(),this.debug("publish response",b.status)}catch(g){if(j.hide(),Oe(g))return;new q.Notice(this.formatError(g,"Publish failed")),this.debug("publish error",g)}}async publishFolder(e){if(this.publishInFlight.has(e.path)){new q.Notice("This folder is already being published. Wait for the current publish to finish.");return}this.publishInFlight.add(e.path);try{await this.publishFolderCore(e)}finally{this.publishInFlight.delete(e.path)}}async publishFolderCore(e){var S,x,k,N;if(!e.path||e.path==="/"){new q.Notice("Choose a folder inside the vault instead of the entire vault.");return}if(!this.docferrySettings.serverUrl){new q.Notice("Configure server URL first.");return}if(!this.docferrySettings.sessionToken){await this.offerLoginToPublish("folder",e.name||this.app.vault.getName(),e.path);return}let t=this.markdownFilesInFolder(e);if(!t.length){new q.Notice("This folder has no Markdown notes to publish.");return}if(!await this.showUploadNoticeIfNeeded(!0))return;try{await this.loadMembership(!0)}catch(R){if(!this.isBillingSessionRequired(R)){new q.Notice(this.formatError(R,"Access check failed"));return}await this.recoverBillingSession(!0);return}let s=this.docferrySettings.membership;if($r(s,!1)==="upgrade_required"){new q.Notice("Folder sharing is available with DocFerry Pro.");return}if(!s)return;if(t.length>s.maxFolderDocumentCount){new q.Notice(`This folder has ${t.length} notes. Your plan allows ${s.maxFolderDocumentCount}.`);return}let l=await this.resolveVaultId(),d=(await this.api.listFolderShares()).folder_shares.find(R=>R.vault_id===l&&R.source_folder===e.path&&R.status!=="stopped"&&R.status!=="expired");if($r(s,!!d)==="limit_reached"){new q.Notice(`Your plan allows ${mr(s.activeFolderShareLimit)} active folder shares. Stop one before publishing another.`);return}let w=await new wr(this.app,{title:(d==null?void 0:d.title)||e.name||this.app.vault.getName(),passwordEnabled:(S=d==null?void 0:d.password_enabled)!=null?S:this.docferrySettings.defaultPasswordEnabled,passwordAlreadySet:!!(d!=null&&d.password_enabled),expiresInDays:en(d==null?void 0:d.expires_at,this.docferrySettings.defaultExpiresInDays),existingExpiresAt:(x=d==null?void 0:d.expires_at)!=null?x:null,documentCount:t.length,isUpdate:!!d,canUseThemeStyling:s.canUseFullTheme,useThemeStyling:s.canUseFullTheme&&((k=d==null?void 0:d.theme_mode)!=null?k:"full")==="full"}).openAndGetResult();if(!w)return;let v=new q.Notice("Preparing folder share...",0);try{let R=await this.api.createFolderShareDraft({folder_share_id:(N=d==null?void 0:d.folder_share_id)!=null?N:null,vault_id:l,source_folder:e.path,title:w.title,expected_document_count:t.length,theme_mode:w.useThemeStyling&&s.canUseFullTheme?"full":"reader",css_asset_id:null,client:{plugin_id:this.manifest.id,plugin_version:this.manifest.version,obsidian_version:gi(this.app),vault_name:this.app.vault.getName()}});for(let j=0;j!!this.app.vault.getAbstractFileByPath(w));if(!i)return null;let s=this.app.vault.getAbstractFileByPath(i);return s instanceof q.TFolder||s instanceof q.TFile&&s.extension==="md"?i:null}async publishVaultPath(e){let t=this.app.vault.getAbstractFileByPath((0,q.normalizePath)(e));if(t instanceof q.TFolder){await this.publishFolder(t);return}if(t instanceof q.TFile&&t.extension==="md"){await this.publishFile(t);return}new q.Notice("Choose a Markdown note or folder to share.")}async buildFolderDocumentPayload(e,t,i,s){var k,N;let l=await this.app.vault.read(t),d=await this.uploadLocalAssets(l,t),w=await this.renderHtmlSnapshot(t,l,d,s);if(s&&(w==null?void 0:w.themeMode)!=="full")throw new Error(`Theme styling for ${t.path} could not be prepared safely. The folder was not published.`);let v=null;w!=null&&w.css&&(v=await this.uploadCssSnapshot(w.css));let S=e.path?t.path.slice(e.path.length).replace(/^\/+/,""):t.path;return{route_key:(await kr(S.toLowerCase())).slice(0,20),relative_path:S,source_hash:`sha256:${await kr(l)}`,title:t.basename,markdown:l,html_snapshot:(k=w==null?void 0:w.html)!=null?k:null,css_asset_id:(N=v==null?void 0:v.assetId)!=null?N:null,assets:d.linkedAssets.map(R=>({asset_id:R.assetId,role:R.role,original_path:R.originalPath})),navigation_order:i}}markdownFilesInFolder(e){let t=[],i=s=>{for(let l of s.children)l.name.startsWith(".")||(l instanceof q.TFolder?i(l):l instanceof q.TFile&&l.extension==="md"&&t.push(l))};return i(e),t.sort((s,l)=>s.path.localeCompare(l.path))}async copyShareLink(e){let t=this.currentShareMeta(e);if(!t.url||!t.id){await this.publishFile(e);return}let i=await this.verifyShareLinkState(t.id);if(i==="missing"){new q.Notice("This share isn't visible to the current account. It may belong to a different account or may have been deleted. The local reference was kept.",8e3);return}if(i==="inactive"){await br(this.app,e),this.refreshDashboardShare(),new q.Notice("This share is no longer active. The dead link was not copied; publish again to create a new link.",8e3);return}i==="unknown"&&new q.Notice("Could not verify the share state. Copying the last known link.",8e3),await navigator.clipboard.writeText(t.url),new q.Notice("Share link copied")}async verifyShareLinkState(e){try{let t=await this.api.getShareStatus(e);return dt(t.status)?"live":"inactive"}catch(t){return Fr(t)?"inactive":sr(t)?"missing":"unknown"}}async updateOrCreateShare(e,t,i){try{return await this.api.updateShare(e,t)}catch(s){if(!(s instanceof _e)||!sr(s)&&!Fr(s))throw s;return i.setMessage("The existing share is no longer available. Publishing a new link..."),this.api.createShare({...t,password_mode:void 0})}}async stopSharing(e){let t=this.currentShareMeta(e);if(!t.id){new q.Notice("This note has not been shared.");return}if(!await cr(this.app,e.basename,e.path))return;let s=new q.Notice("Stopping share...",0);try{await this.api.deleteShare(t.id),await br(this.app,e),this.refreshDashboardShare(),s.hide(),new q.Notice("Share stopped. The link is no longer available.")}catch(l){if(s.hide(),Oe(l))return;new q.Notice(this.formatError(l,"Stop sharing failed"))}}async ensureCanPublishBeforeUpload(e,t){if(!this.docferrySettings.sessionToken)return;try{await this.loadMembership(!0)}catch(d){if(!this.isBillingSessionRequired(d))throw d;await this.recoverBillingSession(!0)}let i=this.docferrySettings.membership;if(!i)return;if(!t&&!i.canCreateShare)throw new _e(`Your current access allows ${mr(i.activeShareLimit)} active shares. Stop a share or request more access from Account before publishing.`,403,"membership_share_limit_exceeded",void 0,{active_share_count:i.activeShareCount,active_share_limit:i.activeShareLimit});let s=await this.app.vault.read(e),l=new TextEncoder().encode(s).byteLength;if(l>i.maxSingleFileSizeBytes)throw new _e(`This note is ${Jt(l)}. Your current access allows ${Jt(i.maxSingleFileSizeBytes)} per file. Open Plans to change membership or Support to send feedback.`,413,"membership_file_size_exceeded",void 0,{max_single_file_size_bytes:i.maxSingleFileSizeBytes,byte_length:l})}markdownFileByPath(e){let t=this.app.vault.getAbstractFileByPath(e);return t instanceof q.TFile&&t.extension==="md"?t:null}findSharedFileByShareId(e){for(let t of this.app.vault.getMarkdownFiles())if(this.currentShareMeta(t).id===e)return t;return null}async clearLocalShareMetaForId(e){let t=this.findSharedFileByShareId(e);t&&await br(this.app,t)}currentShareMeta(e){let t=Xr(this.app,e);return Ir(t,this.docferrySettings.serverUrl)?t:{}}async showLinkStatus(e){let t=this.currentShareMeta(e);if(!t.id){new q.Notice("This note has not been shared.");return}try{let i=await this.api.getShareLinks(t.id);new Wt(this.app,e.basename,i).open()}catch(i){if(Oe(i))return;new q.Notice(this.formatError(i,"Link status failed"))}}async importShareUrl(e=""){let t=await new Cr(this.app,ft(e),this.docferrySettings.defaultImportFolder||Ye.defaultImportFolder,this.docferrySettings.serverUrl).openAndGetResult();if(!t)return;let i=new q.Notice("Importing share...",0);try{let s=await this.importShareWithOptions(t);i.hide(),new q.Notice(`Imported ${s.title}${s.importedAssets?` with ${s.importedAssets} assets`:""}`)}catch(s){i.hide(),new q.Notice(this.formatError(s,"Import failed"))}}async importShareFromDashboard(e,t){return this.importShareWithOptions({url:e,password:t,outputFolder:this.docferrySettings.defaultImportFolder||Ye.defaultImportFolder,overwrite:!1})}async importExternalLink(e,t){var k;let i=Nn(e);await this.refreshMembershipForExternalImport();let s=this.docferrySettings.membership,l=!!(s&&pr(s.hasMediaNoteEntitlement,i.provider,{enabled:s.canUseMediaNote,supportedProviders:s.mediaNoteProviders})),d=!!(s&&zn(s.mediaNoteMonthlyJobsUsed,s.mediaNoteMonthlyJobLimit));if(!(l&&d)){if(s!=null&&s.hasMediaNoteEntitlement&&Vn(i.provider))throw new Error(d?`${lr(i.provider)} Advanced Import is temporarily unavailable. Nothing was saved.`:`${lr(i.provider)} Advanced Import has reached this month's limit. Nothing was saved.`);return this.writeExternalImport(i.title,i.markdown)}if(!await this.showUploadNoticeIfNeeded(!0,"detailed_note"))return null;if(this.docferrySettings.pendingMediaNoteImport)throw new Error("A detailed note is already being prepared. Resume or cancel it before starting another.");let v=(k=this.docferrySettings.connectedAccount)==null?void 0:k.productSubjectId;if(!v)throw new Error("Reconnect your Bondie account before starting a detailed note.");t==null||t("starting");let S=await oi(this.mediaNoteSubmissionDeps(),i.url.href,v);t==null||t("reading");let x=await this.waitForMediaNote(S,t);if(!Or.has(x.status)||!x.markdown)throw await this.clearPendingMediaNoteImport(x.job_id),new Error(hr(x));return this.finishMediaNoteImport(x,t)}async cancelActiveMediaImport(){let e=this.docferrySettings.pendingMediaNoteImport;if(!e)return;this.requirePendingImportOwner(e);let t;try{t=await this.api.cancelMediaNoteJob(e.jobId)}catch(i){if(i instanceof _e&&(i.code==="media_note_job_not_found"||i.code==="media_note_job_finished")){await this.clearPendingMediaNoteImport(e.jobId);return}throw i}if(_r.has(t.status)){await this.clearPendingMediaNoteImport(e.jobId);return}throw new Error("The detailed note is still processing. Try cancelling again before changing accounts.")}async refreshMembershipForExternalImport(){if(!this.docferrySettings.sessionToken)return;let e=this.docferrySettings.membership;try{await this.loadMembership(!0)}catch(t){if(Oe(t))return;if(e&&!e.hasMediaNoteEntitlement){this.debug("membership refresh before link import failed; using cached free access",t);return}throw t}}async writeExternalImport(e,t,i){let s=this.docferrySettings.defaultImportFolder||Ye.defaultImportFolder,l=i||await this.uniqueImportPath(s,Tt(e));await this.ensureParentFolder(l);let d=this.app.vault.getAbstractFileByPath(l),w;if(d instanceof q.TFile){if(await this.app.vault.read(d)!==t)throw new Error("The saved note path changed while this import was recovering. Nothing was overwritten.");w=d}else w=await this.app.vault.create(l,t);return await this.app.workspace.getLeaf(!0).openFile(w),{title:e,notePath:l,importedAssets:0}}async waitForMediaNote(e,t){var s;let i=e;for(let l=0;lthis.docferrySettings.pendingMediaNoteSubmission,save:async e=>{this.docferrySettings.pendingMediaNoteSubmission=e,await this.saveSettings()}},createJob:(e,t)=>this.api.createMediaNoteJob(e,t),trackImport:async(e,t)=>{await this.setPendingMediaNoteImport({jobId:e.job_id,ownerProductSubjectId:t.ownerProductSubjectId,sourceUrl:t.sourceUrl,createdAt:t.createdAt})},generateKey:()=>fo(),now:()=>new Date().toISOString()}}async recoverPendingMediaNoteSubmission(){var s;let e=this.docferrySettings.pendingMediaNoteSubmission;if(!e||this.mediaNoteRecoveryInFlight||this.docferrySettings.pendingMediaNoteImport)return;let t=(s=this.docferrySettings.connectedAccount)==null?void 0:s.productSubjectId;if(!t)return;if(e.ownerProductSubjectId!==t){this.docferrySettings.pendingMediaNoteSubmission=null,await this.saveSettings();return}this.mediaNoteRecoveryInFlight=!0;let i=null;try{i=await Yt(this.mediaNoteSubmissionDeps(),e)}catch(l){new q.Notice(this.formatError(l,"Could not resume detailed note"),8e3)}finally{this.mediaNoteRecoveryInFlight=!1}i&&await this.resumeActiveMediaImport()}async resumeActiveMediaImport(){let e=this.docferrySettings.pendingMediaNoteImport;if(!e||this.mediaNoteRecoveryInFlight)return;try{this.requirePendingImportOwner(e)}catch(i){new q.Notice(this.formatError(i,"Could not resume detailed note"),8e3);return}this.mediaNoteRecoveryInFlight=!0;let t=new q.Notice("Resuming your detailed note in the background...",0);try{let i=await this.api.getMediaNoteJob(e.jobId),s=await this.waitForMediaNote(i);if(!Or.has(s.status)||!s.markdown)throw await this.clearPendingMediaNoteImport(s.job_id),new Error(hr(s));let l=await this.finishMediaNoteImport(s);l&&new q.Notice(`Saved ${l.title} to ${l.notePath}.`)}catch(i){i instanceof _e&&i.code==="media_note_job_not_found"?(await this.clearPendingMediaNoteImport(e.jobId),new q.Notice("That detailed note expired on the server and was removed from the review queue.",8e3)):new q.Notice(this.formatError(i,"Could not resume detailed note"),8e3)}finally{t.hide(),this.mediaNoteRecoveryInFlight=!1}}requireConnectedProductSubject(){var t;let e=(t=this.docferrySettings.connectedAccount)==null?void 0:t.productSubjectId;if(!e)throw new Error("Reconnect your Bondie account to continue this detailed note.");return e}requirePendingImportOwner(e){if(this.requireConnectedProductSubject()!==e.ownerProductSubjectId)throw new Error("This detailed note belongs to another Bondie account. Sign in with the account that started it.")}async uniqueImportPath(e,t){for(let i=0;i<1e3;i+=1){let s=i?` ${i+1}`:"",l=(0,q.normalizePath)(`${e}/${t}${s}.md`);if(!await this.app.vault.adapter.exists(l))return l}throw new Error("Could not allocate a filename for this imported link.")}async importShareWithOptions(e){let t=await this.api.getShareImportPayload(e.url,e.password),i=ft(t.payload.title,"Untitled DocFerry share"),s=ft(t.payload.markdown,""),l=(0,q.normalizePath)(`${e.outputFolder}/${Tt(i)}.md`),d=(Array.isArray(t.payload.assets)?t.payload.assets:[]).map(S=>{let x=(0,q.normalizePath)(`${e.outputFolder}/${wo(S)}`);x===l&&(x=(0,q.normalizePath)(`${e.outputFolder}/attachments/${Tt(ft(S.filename)||ft(S.asset_id)||"attachment")}`));let k=ft(S.url);if(!k)throw new Error(`Imported asset is missing a download URL: ${x}`);return{path:x,url:k}}),w=await this.withShareImportCommitLock(()=>ri(this.importFileSystem(),{notePath:l,markdown:s,assets:d,overwrite:e.overwrite,download:S=>this.api.downloadImportAsset(S,t.cookieHeader)})),v=this.app.vault.getAbstractFileByPath(l);return v instanceof q.TFile&&await this.app.workspace.getLeaf(!0).openFile(v),{title:i,notePath:l,importedAssets:w}}importFileSystem(){let e=this.app.vault.adapter;return{exists:t=>e.exists(t),readText:t=>e.read(t),readBinary:t=>e.readBinary(t),writeText:async(t,i)=>{let s=this.app.vault.getAbstractFileByPath(t);s instanceof q.TFile?await this.app.vault.process(s,()=>i):await e.write(t,i)},writeBinary:async(t,i)=>{await e.writeBinary(t,i)},remove:t=>e.remove(t),directoryExists:t=>e.exists(t),createDirectory:t=>e.mkdir(t),removeDirectoryIfEmpty:async t=>{let i=await e.list(t);i.files.length||i.folders.length||await e.rmdir(t,!1)}}}async withShareImportCommitLock(e){let t=this.shareImportCommitQueue,i;this.shareImportCommitQueue=new Promise(s=>{i=s}),await t;try{return await e()}finally{i()}}async ensureParentFolder(e){let t=(0,q.normalizePath)(e).split("/");t.pop(),await this.ensureFolder(t.join("/"))}async ensureFolder(e){let t=(0,q.normalizePath)(e).replace(/^\/+|\/+$/g,"");if(!t)return;let i="";for(let s of t.split("/"))i=i?`${i}/${s}`:s,await this.app.vault.adapter.exists(i)||await this.app.vault.adapter.mkdir(i)}async buildPayload(e,t,i,s,l){var F,j,M,J,_,P,E,I;let d=performance.now();l==null||l("Reading note...");let w=await this.app.vault.read(e),v=this.extractOutboundLinks(w,e);l==null||l("Uploading local assets...");let S=await this.uploadLocalAssets(w,e);l==null||l("Rendering Obsidian preview...");let x=!!(i.useThemeStyling&&((F=this.docferrySettings.membership)!=null&&F.canUseFullTheme)),k=await this.renderHtmlSnapshot(e,w,S,x),N=null;if(k!=null&&k.css){l==null||l("Uploading reading style...");try{N=await this.uploadCssSnapshot(k.css)}catch(p){this.debug("css snapshot upload failed",p)}}let R=[...S.linkedAssets.map(p=>({asset_id:p.assetId,role:p.role,original_path:p.originalPath})),...N?[{asset_id:N.assetId,role:"css",original_path:pi}]:[]];return this.debug("payload built",{markdownChars:w.length,htmlSnapshotChars:(j=k==null?void 0:k.html.length)!=null?j:0,cssSnapshotChars:(J=(M=k==null?void 0:k.css)==null?void 0:M.length)!=null?J:0,localAssets:S.linkedAssets.length,imageAssets:S.imageAssets.filter(Boolean).length,cssAsset:!!N,elapsedMs:Math.round(performance.now()-d)}),{vault_id:await this.resolveVaultId(),source_path:e.path,source_path_normalized:So(e.path),doc_identity:null,source_hash:`sha256:${await kr(w)}`,title:t,markdown:w,html_snapshot:(_=k==null?void 0:k.html)!=null?_:null,theme_mode:(P=k==null?void 0:k.themeMode)!=null?P:"reader",css_asset_id:(E=N==null?void 0:N.assetId)!=null?E:null,assets:R,outbound_links:v,password:i.password,password_mode:s?this.resolvePasswordMode(i):void 0,expires_at:(I=i.expiresAt)!=null?I:null,client:{plugin_id:this.manifest.id,plugin_version:this.manifest.version,obsidian_version:gi(this.app),vault_name:this.app.vault.getName()}}}async showUploadNoticeIfNeeded(e,t="publish"){if(this.docferrySettings.uploadConsentAcceptedAt&&this.docferrySettings.uploadConsentNoticeId===fi)return!0;if(this.uploadNoticeOpen)return!e;this.uploadNoticeOpen=!0;try{return await li(this.app,e?t:"startup")?(this.docferrySettings.uploadConsentAcceptedAt=new Date().toISOString(),this.docferrySettings.uploadConsentNoticeId=fi,await this.saveSettings(),!0):!e}finally{this.uploadNoticeOpen=!1}}async renderHtmlSnapshot(e,t,i,s){let l=Eo(),d=l.createElement("div");d.className="markdown-preview-view markdown-rendered docferry-snapshot-source docferry-snapshot-hidden-host",l.body.appendChild(d);let w=new q.Component;w.load();try{await q.MarkdownRenderer.render(this.app,t,d,e.path,w),await mi(150),this.applyLocalImageAssetPlaceholders(d,i.imageAssets),this.applyLocalAttachmentPlaceholders(d,i.linkedAssets);for(let x of Array.from(d.querySelectorAll("script")))x.remove();let v="reader",S;if(s)try{S=Do(d),v="full"}catch(x){this.debug("theme styling could not be captured; using reader theme",x),S=null}else S=null;return{html:d.innerHTML,css:S,themeMode:v}}catch(v){return this.debug("html snapshot failed",v),null}finally{w.unload(),d.remove()}}async uploadLocalAssets(e,t){let i=this.extractLocalAssetRefs(e),s=new Map,l=[],d=[];for(let x of i){let k=this.resolveLinkedFile(x.path,t),N=k?Si(k.extension):null,R=k?yi(k.extension):null;if(!k||k.extension.toLowerCase()==="md"||!N||!R){x.isImage&&k&&yi(k.extension)==="image"&&d.push(null);continue}s.has(k.path)||s.set(k.path,{target:k,originalPath:x.path,role:R,contentType:N}),x.isImage&&R==="image"&&d.push({targetPath:k.path,originalPath:x.path})}let w=Array.from(s.values()),v=await ko(w,go,x=>this.uploadLocalAsset(x)),S=new Map;w.forEach((x,k)=>{S.set(x.target.path,v[k])});for(let x of d){if(!x){l.push(null);continue}let k=S.get(x.targetPath);l.push(k?{assetId:k.assetId,originalPath:x.originalPath}:null)}return{linkedAssets:v,imageAssets:l}}async uploadLocalAsset(e){let t=await this.app.vault.readBinary(e.target),i=this.prepareAssetUpload(e.target,t,e.contentType),s=`sha256:${await gn(i.data)}`,l=await this.api.uploadAsset(i.data,i.filename,i.contentType,s);return this.debug("asset uploaded",{assetType:e.contentType,role:e.role,originalBytes:t.byteLength,uploadedBytes:i.data.byteLength,qualityMode:i.qualityMode}),{assetId:l.asset_id,originalPath:e.originalPath,role:e.role}}prepareAssetUpload(e,t,i){return{data:t,filename:e.name,contentType:i,qualityMode:"original"}}async uploadCssSnapshot(e){let t=new TextEncoder().encode(e);return t.byteLength?{assetId:(await this.api.uploadAsset(t.buffer,pi,"text/css",`sha256:${await gn(t.buffer)}`)).asset_id}:null}applyLocalImageAssetPlaceholders(e,t){if(!t.length)return;let i=Array.from(e.querySelectorAll("img")),s=0;for(let l of i){let d=l.getAttribute("src")||"";if(d.startsWith("http://")||d.startsWith("https://")||d.startsWith("data:"))continue;let w=t[s];s+=1,w&&(l.setAttribute("src",`docferry-asset://${w.assetId}`),l.setAttribute("loading","lazy"),l.setAttribute("decoding","async"))}}applyLocalAttachmentPlaceholders(e,t){let i=t.filter(l=>l.role!=="image");if(!i.length)return;let s=Array.from(e.querySelectorAll("a"));for(let l of s){let d=l.getAttribute("href")||"";if(!d||_t(d)||d.startsWith("docferry-asset://"))continue;let w=vi(d),v=i.find(S=>{let x=S.originalPath;return w===x||w.endsWith(`/${x}`)||d===x});v&&(l.setAttribute("href",`docferry-asset://${v.assetId}`),l.removeAttribute("target"),l.removeAttribute("rel"))}}extractLocalAssetRefs(e){var d,w,v;let t=[],i=/!\[\[([^\]\n]+)\]\]/g;for(let S of e.matchAll(i)){let x=(d=S[1].split("|")[0])==null?void 0:d.trim();x&&!_t(x)&&t.push({path:x,isImage:!0})}let s=/!\[[^\]\n]*\]\(([^)\n]+)\)/g;for(let S of e.matchAll(s)){let x=(w=S[1].split(/\s+["']/)[0])==null?void 0:w.trim().replace(/^<|>$/g,"");x&&!_t(x)&&t.push({path:x,isImage:!0})}let l=/(?$/g,"");x&&!_t(x)&&t.push({path:x,isImage:!1})}return t}extractOutboundLinks(e,t){var v;let i=[],s=new Set,l=(S,x,k)=>{var j;let N=Ao(S);if(!N.path||_t(N.path)||N.path.toLowerCase().startsWith("obsidian://"))return;let R=this.resolveLinkedFile(N.path,t),F=`${k}|${N.path}|${N.subpath||""}|${(R==null?void 0:R.path)||""}`;s.has(F)||(s.add(F),i.push({raw_target:S.trim(),target_path:(j=R==null?void 0:R.path)!=null?j:null,target_doc_identity:null,target_subpath:N.subpath,label:x,link_kind:k}))},d=/(!?)\[\[([^\]\n]+)\]\]/g;for(let S of e.matchAll(d)){let x=S[1]==="!",[k,N]=Co(S[2]);l(k,N,x?"embed":"wiki")}let w=/\[([^\]\n]+)\]\(([^)\n]+)\)/g;for(let S of e.matchAll(w)){if(S.index&&e.charAt(S.index-1)==="!")continue;let x=(v=S[2].split(/\s+["']/)[0])==null?void 0:v.trim().replace(/^<|>$/g,"");x&&l(x,S[1].trim()||null,"markdown_relative")}return i}resolveLinkedFile(e,t){var S;let i=vi(e),s=this.app.metadataCache.getFirstLinkpathDest(i,t.path);if(s instanceof q.TFile)return s;let l=this.app.vault.getAbstractFileByPath((0,q.normalizePath)(i));if(l instanceof q.TFile)return l;let d=((S=t.parent)==null?void 0:S.path)||"",w=d?(0,q.normalizePath)(`${d}/${i}`):(0,q.normalizePath)(i),v=this.app.vault.getAbstractFileByPath(w);return v instanceof q.TFile?v:null}async resolveVaultId(){let e=this.app.vault.adapter,t=typeof e.basePath=="string"?e.basePath:"",i=`${this.app.vault.getName()}|${t}`;return`vlt_${(await kr(i)).slice(0,24)}`}resolvePasswordMode(e){return e.passwordEnabled&&e.password?"set":e.passwordEnabled?"keep":"clear"}resolveTitle(e){return e.basename}formatError(e,t){return e instanceof _e?`${t}: ${e.message}`:e instanceof Error?`${t}: ${e.message}`:t}refreshDashboardAuth(){for(let e of this.app.workspace.getLeavesOfType(kt))e.view instanceof bt&&e.view.refreshForAuthChange()}refreshDashboardShare(){for(let e of this.app.workspace.getLeavesOfType(kt))e.view instanceof bt&&e.view.refreshForShareChange()}debug(e,t){this.docferrySettings.debug&&console.debug(`[docferry] ${e}`)}};async function kr(a){let c=new TextEncoder().encode(a);return gn(c)}async function gn(a){let c=await crypto.subtle.digest("SHA-256",a);return bo(c)}function bo(a){return Array.from(new Uint8Array(a)).map(c=>c.toString(16).padStart(2,"0")).join("")}function gi(a){let c=a;return typeof c.version=="string"?c.version:"unknown"}function mi(a){return new Promise(c=>window.setTimeout(c,a))}function So(a){return a.replace(/\\/g,"/").replace(/^\/+/,"").replace(/\/{2,}/g,"/").trim().toLowerCase()}function wo(a){let c=ft(a.original_path).split("#",1)[0].split("?",1)[0].replace(/\\/g,"/").trim(),e=c?c.split("/").filter(t=>t&&t!=="."&&t!=="..").map(t=>Tt(t)):[];return e.length?e.join("/"):`attachments/${Tt(ft(a.filename)||ft(a.asset_id)||"attachment")}`}function ft(a,c=""){return typeof a=="string"?a:a==null?c:typeof a=="number"||typeof a=="boolean"||typeof a=="bigint"?String(a):c}function Co(a){let[c,e]=a.split("|",2);return[c.trim(),(e==null?void 0:e.trim())||null]}function Ao(a){let c=a.split("|",1)[0].trim(),e=c.search(/[#^]/);return e<0?{path:c,subpath:null}:{path:c.slice(0,e).trim(),subpath:c.slice(e+1).trim()||null}}function Do(a){var k,N;let c=a.ownerDocument,e=R=>{var j,M;let F=a.querySelector(R);return F?(M=(j=F.ownerDocument.defaultView)==null?void 0:j.getComputedStyle(F))!=null?M:getComputedStyle(F):null},t=(N=(k=c.defaultView)==null?void 0:k.getComputedStyle(a))!=null?N:getComputedStyle(a),i=e("a"),s=e(".callout, blockquote, table"),l=e("pre, code"),d=e("pre code, code"),w=e(".callout, pre, table"),v=new Map,S=(R,...F)=>{let j=F.map(bi).find(M=>!!M);j&&v.set(R,j)};return S("--docferry-theme-accent",fn(c,"--interactive-accent","--text-accent","--color-accent","--link-color"),i==null?void 0:i.color),S("--docferry-theme-border",fn(c,"--background-modifier-border","--divider-color","--table-border-color"),s==null?void 0:s.borderLeftColor,s==null?void 0:s.borderTopColor),S("--docferry-theme-radius",w==null?void 0:w.borderRadius),S("--docferry-theme-font",t.fontFamily),S("--docferry-theme-code-font",fn(c,"--font-monospace","--code-font-family"),d==null?void 0:d.fontFamily),S("--docferry-theme-code-bg",l==null?void 0:l.backgroundColor),S("--docferry-theme-code-ink",d==null?void 0:d.color),v.size?`/* DocFerry semantic theme tokens: visual identity without layout capture. */
+`)}function k(_){this.options=_||{locator:{}}}k.prototype.parseFromString=function(_,B){var E=this.options,I=new S,p=E.domBuilder||new P,f=E.errorHandler,v=E.locator,m=E.xmlns||{},w=/\/x?html?$/.test(B),C=w?o.HTML_ENTITIES:o.XML_ENTITIES;v&&p.setDocumentLocator(v),I.errorHandler=F(f,p,v),I.domBuilder=E.domBuilder||p,w&&(m[""]=b.HTML),m.xml=m.xml||b.XML;var M=E.normalizeLineEndings||x;return _&&typeof _=="string"?I.parse(M(_),m,C):I.errorHandler.error("invalid doc source"),p.doc};function F(_,B,E){if(!_){if(B instanceof P)return B;_=B}var I={},p=_ instanceof Function;E=E||{};function f(v){var m=_[v];!m&&p&&(m=_.length==2?function(w){_(v,w)}:_),I[v]=m&&function(w){m("[xmldom "+v+"] "+w+j(E))}||function(){}}return f("warning"),f("error"),f("fatalError"),I}function P(){this.cdata=!1}function L(_,B){B.lineNumber=_.lineNumber,B.columnNumber=_.columnNumber}P.prototype={startDocument:function(){this.doc=new d().createDocument(null,null,null),this.locator&&(this.doc.documentURI=this.locator.systemId)},startElement:function(_,B,E,I){var p=this.doc,f=p.createElementNS(_,E||B),v=I.length;W(this,f),this.currentElement=f,this.locator&&L(this.locator,f);for(var m=0;m=B+E||B?new java.lang.String(_,B,E)+"":_}"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(_){P.prototype[_]=function(){return null}});function W(_,B){_.currentElement?_.currentElement.appendChild(B):_.doc.appendChild(B)}u.__DOMHandler=P,u.normalizeLineEndings=x,u.DOMParser=k}),"./node_modules/@xmldom/xmldom/lib/dom.js":(function(a,u,e){var t=e("./node_modules/@xmldom/xmldom/lib/conventions.js"),r=t.find,o=t.NAMESPACE;function l(s){return s!==""}function d(s){return s?s.split(/[\t\n\f\r ]+/).filter(l):[]}function b(s,n){return s.hasOwnProperty(n)||(s[n]=!0),s}function y(s){if(!s)return[];var n=d(s);return Object.keys(n.reduce(b,{}))}function S(s){return function(n){return s&&s.indexOf(n)!==-1}}function x(s,n){for(var c in s)Object.prototype.hasOwnProperty.call(s,c)&&(n[c]=s[c])}function k(s,n){var c=s.prototype;if(!(c instanceof n)){let g=function(){};var h=g;g.prototype=n.prototype,g=new g,x(c,g),s.prototype=c=g}c.constructor!=s&&(typeof s!="function"&&console.error("unknown Class:"+s),c.constructor=s)}var F={},P=F.ELEMENT_NODE=1,L=F.ATTRIBUTE_NODE=2,j=F.TEXT_NODE=3,N=F.CDATA_SECTION_NODE=4,W=F.ENTITY_REFERENCE_NODE=5,_=F.ENTITY_NODE=6,B=F.PROCESSING_INSTRUCTION_NODE=7,E=F.COMMENT_NODE=8,I=F.DOCUMENT_NODE=9,p=F.DOCUMENT_TYPE_NODE=10,f=F.DOCUMENT_FRAGMENT_NODE=11,v=F.NOTATION_NODE=12,m={},w={},C=m.INDEX_SIZE_ERR=(w[1]="Index size error",1),M=m.DOMSTRING_SIZE_ERR=(w[2]="DOMString size error",2),D=m.HIERARCHY_REQUEST_ERR=(w[3]="Hierarchy request error",3),q=m.WRONG_DOCUMENT_ERR=(w[4]="Wrong document",4),z=m.INVALID_CHARACTER_ERR=(w[5]="Invalid character",5),G=m.NO_DATA_ALLOWED_ERR=(w[6]="No data allowed",6),Q=m.NO_MODIFICATION_ALLOWED_ERR=(w[7]="No modification allowed",7),$=m.NOT_FOUND_ERR=(w[8]="Not found",8),J=m.NOT_SUPPORTED_ERR=(w[9]="Not supported",9),oe=m.INUSE_ATTRIBUTE_ERR=(w[10]="Attribute in use",10),ie=m.INVALID_STATE_ERR=(w[11]="Invalid state",11),ge=m.SYNTAX_ERR=(w[12]="Syntax error",12),ne=m.INVALID_MODIFICATION_ERR=(w[13]="Invalid modification",13),Y=m.NAMESPACE_ERR=(w[14]="Invalid namespace",14),ue=m.INVALID_ACCESS_ERR=(w[15]="Invalid access",15);function te(s,n){if(n instanceof Error)var c=n;else c=this,Error.call(this,w[s]),this.message=w[s],Error.captureStackTrace&&Error.captureStackTrace(this,te);return c.code=s,n&&(this.message=this.message+": "+n),c}te.prototype=Error.prototype,x(m,te);function re(){}re.prototype={length:0,item:function(s){return s>=0&&s=0){for(var g=n.length-1;h0},lookupPrefix:function(s){for(var n=this;n;){var c=n._nsMap;if(c){for(var h in c)if(Object.prototype.hasOwnProperty.call(c,h)&&c[h]===s)return h}n=n.nodeType==L?n.ownerDocument:n.parentNode}return null},lookupNamespaceURI:function(s){for(var n=this;n;){var c=n._nsMap;if(c&&Object.prototype.hasOwnProperty.call(c,s))return c[s];n=n.nodeType==L?n.ownerDocument:n.parentNode}return null},isDefaultNamespace:function(s){var n=this.lookupPrefix(s);return n==null}};function Fe(s){return s=="<"&&"<"||s==">"&&">"||s=="&"&&"&"||s=='"'&&"""||""+s.charCodeAt()+";"}x(F,ye),x(F,ye.prototype);function _e(s,n){if(n(s))return!0;if(s=s.firstChild)do if(_e(s,n))return!0;while(s=s.nextSibling)}function Pe(){this.ownerDocument=this}function it(s,n,c){s&&s._inc++;var h=c.namespaceURI;h===o.XMLNS&&(n._nsMap[c.prefix?c.localName:""]=c.value)}function Je(s,n,c,h){s&&s._inc++;var g=c.namespaceURI;g===o.XMLNS&&delete n._nsMap[c.prefix?c.localName:""]}function We(s,n,c){if(s&&s._inc){s._inc++;var h=n.childNodes;if(c)h[h.length++]=c;else{for(var g=n.firstChild,A=0;g;)h[A++]=g,g=g.nextSibling;h.length=A,delete h[h.length]}}}function je(s,n){var c=n.previousSibling,h=n.nextSibling;return c?c.nextSibling=h:s.firstChild=h,h?h.previousSibling=c:s.lastChild=c,n.parentNode=null,n.previousSibling=null,n.nextSibling=null,We(s.ownerDocument,s),n}function K(s){return s&&(s.nodeType===ye.DOCUMENT_NODE||s.nodeType===ye.DOCUMENT_FRAGMENT_NODE||s.nodeType===ye.ELEMENT_NODE)}function T(s){return s&&(O(s)||X(s)||U(s)||s.nodeType===ye.DOCUMENT_FRAGMENT_NODE||s.nodeType===ye.COMMENT_NODE||s.nodeType===ye.PROCESSING_INSTRUCTION_NODE)}function U(s){return s&&s.nodeType===ye.DOCUMENT_TYPE_NODE}function O(s){return s&&s.nodeType===ye.ELEMENT_NODE}function X(s){return s&&s.nodeType===ye.TEXT_NODE}function ee(s,n){var c=s.childNodes||[];if(r(c,O)||U(n))return!1;var h=r(c,U);return!(n&&h&&c.indexOf(h)>c.indexOf(n))}function he(s,n){var c=s.childNodes||[];function h(A){return O(A)&&A!==n}if(r(c,h))return!1;var g=r(c,U);return!(n&&g&&c.indexOf(g)>c.indexOf(n))}function we(s,n,c){if(!K(s))throw new te(D,"Unexpected parent node type "+s.nodeType);if(c&&c.parentNode!==s)throw new te($,"child not in parent");if(!T(n)||U(n)&&s.nodeType!==ye.DOCUMENT_NODE)throw new te(D,"Unexpected node type "+n.nodeType+" for parent node type "+s.nodeType)}function De(s,n,c){var h=s.childNodes||[],g=n.childNodes||[];if(n.nodeType===ye.DOCUMENT_FRAGMENT_NODE){var A=g.filter(O);if(A.length>1||r(g,X))throw new te(D,"More than one element or text in fragment");if(A.length===1&&!ee(s,c))throw new te(D,"Element in fragment can not be inserted before doctype")}if(O(n)&&!ee(s,c))throw new te(D,"Only one element can be added and only after doctype");if(U(n)){if(r(h,U))throw new te(D,"Only one doctype is allowed");var R=r(h,O);if(c&&h.indexOf(R)1||r(g,X))throw new te(D,"More than one element or text in fragment");if(A.length===1&&!he(s,c))throw new te(D,"Element in fragment can not be inserted before doctype")}if(O(n)&&!he(s,c))throw new te(D,"Only one element can be added and only after doctype");if(U(n)){let pe=function(ce){return U(ce)&&ce!==c};var V=pe;if(r(h,pe))throw new te(D,"Only one doctype is allowed");var R=r(h,O);if(c&&h.indexOf(R)0&&_e(c.documentElement,function(g){if(g!==c&&g.nodeType===P){var A=g.getAttribute("class");if(A){var R=s===A;if(!R){var V=y(A);R=n.every(S(V))}R&&h.push(g)}}}),h})},createElement:function(s){var n=new Be;n.ownerDocument=this,n.nodeName=s,n.tagName=s,n.localName=s,n.childNodes=new re;var c=n.attributes=new le;return c._ownerElement=n,n},createDocumentFragment:function(){var s=new dt;return s.ownerDocument=this,s.childNodes=new re,s},createTextNode:function(s){var n=new Ze;return n.ownerDocument=this,n.appendData(s),n},createComment:function(s){var n=new xe;return n.ownerDocument=this,n.appendData(s),n},createCDATASection:function(s){var n=new ot;return n.ownerDocument=this,n.appendData(s),n},createProcessingInstruction:function(s,n){var c=new nt;return c.ownerDocument=this,c.tagName=c.nodeName=c.target=s,c.nodeValue=c.data=n,c},createAttribute:function(s){var n=new qe;return n.ownerDocument=this,n.name=s,n.nodeName=s,n.localName=s,n.specified=!0,n},createEntityReference:function(s){var n=new vt;return n.ownerDocument=this,n.nodeName=s,n},createElementNS:function(s,n){var c=new Be,h=n.split(":"),g=c.attributes=new le;return c.childNodes=new re,c.ownerDocument=this,c.nodeName=n,c.tagName=n,c.namespaceURI=s,h.length==2?(c.prefix=h[0],c.localName=h[1]):c.localName=n,g._ownerElement=c,c},createAttributeNS:function(s,n){var c=new qe,h=n.split(":");return c.ownerDocument=this,c.nodeName=n,c.name=n,c.namespaceURI=s,c.specified=!0,h.length==2?(c.prefix=h[0],c.localName=h[1]):c.localName=n,c}},k(Pe,ye);function Be(){this._nsMap={}}Be.prototype={nodeType:P,hasAttribute:function(s){return this.getAttributeNode(s)!=null},getAttribute:function(s){var n=this.getAttributeNode(s);return n&&n.value||""},getAttributeNode:function(s){return this.attributes.getNamedItem(s)},setAttribute:function(s,n){var c=this.ownerDocument.createAttribute(s);c.value=c.nodeValue=""+n,this.setAttributeNode(c)},removeAttribute:function(s){var n=this.getAttributeNode(s);n&&this.removeAttributeNode(n)},appendChild:function(s){return s.nodeType===f?this.insertBefore(s,null):He(this,s)},setAttributeNode:function(s){return this.attributes.setNamedItem(s)},setAttributeNodeNS:function(s){return this.attributes.setNamedItemNS(s)},removeAttributeNode:function(s){return this.attributes.removeNamedItem(s.nodeName)},removeAttributeNS:function(s,n){var c=this.getAttributeNodeNS(s,n);c&&this.removeAttributeNode(c)},hasAttributeNS:function(s,n){return this.getAttributeNodeNS(s,n)!=null},getAttributeNS:function(s,n){var c=this.getAttributeNodeNS(s,n);return c&&c.value||""},setAttributeNS:function(s,n,c){var h=this.ownerDocument.createAttributeNS(s,n);h.value=h.nodeValue=""+c,this.setAttributeNode(h)},getAttributeNodeNS:function(s,n){return this.attributes.getNamedItemNS(s,n)},getElementsByTagName:function(s){return new de(this,function(n){var c=[];return _e(n,function(h){h!==n&&h.nodeType==P&&(s==="*"||h.tagName==s)&&c.push(h)}),c})},getElementsByTagNameNS:function(s,n){return new de(this,function(c){var h=[];return _e(c,function(g){g!==c&&g.nodeType===P&&(s==="*"||g.namespaceURI===s)&&(n==="*"||g.localName==n)&&h.push(g)}),h})}},Pe.prototype.getElementsByTagName=Be.prototype.getElementsByTagName,Pe.prototype.getElementsByTagNameNS=Be.prototype.getElementsByTagNameNS,k(Be,ye);function qe(){}qe.prototype.nodeType=L,k(qe,ye);function rt(){}rt.prototype={data:"",substringData:function(s,n){return this.data.substring(s,s+n)},appendData:function(s){s=this.data+s,this.nodeValue=this.data=s,this.length=s.length},insertData:function(s,n){this.replaceData(s,0,n)},appendChild:function(s){throw new Error(w[D])},deleteData:function(s,n){this.replaceData(s,n,"")},replaceData:function(s,n,c){var h=this.data.substring(0,s),g=this.data.substring(s+n);c=h+c+g,this.nodeValue=this.data=c,this.length=c.length}},k(rt,ye);function Ze(){}Ze.prototype={nodeName:"#text",nodeType:j,splitText:function(s){var n=this.data,c=n.substring(s);n=n.substring(0,s),this.data=this.nodeValue=n,this.length=n.length;var h=this.ownerDocument.createTextNode(c);return this.parentNode&&this.parentNode.insertBefore(h,this.nextSibling),h}},k(Ze,rt);function xe(){}xe.prototype={nodeName:"#comment",nodeType:E},k(xe,rt);function ot(){}ot.prototype={nodeName:"#cdata-section",nodeType:N},k(ot,rt);function st(){}st.prototype.nodeType=p,k(st,ye);function yt(){}yt.prototype.nodeType=v,k(yt,ye);function It(){}It.prototype.nodeType=_,k(It,ye);function vt(){}vt.prototype.nodeType=W,k(vt,ye);function dt(){}dt.prototype.nodeName="#document-fragment",dt.prototype.nodeType=f,k(dt,ye);function nt(){}nt.prototype.nodeType=B,k(nt,ye);function At(){}At.prototype.serializeToString=function(s,n,c){return Vt.call(s,n,c)},ye.prototype.toString=Vt;function Vt(s,n){var c=[],h=this.nodeType==9&&this.documentElement||this,g=h.prefix,A=h.namespaceURI;if(A&&g==null){var g=h.lookupPrefix(A);if(g==null)var R=[{namespace:A,prefix:null}]}return se(this,c,s,n,R),c.join("")}function ir(s,n,c){var h=s.prefix||"",g=s.namespaceURI;if(!g||h==="xml"&&g===o.XML||g===o.XMLNS)return!1;for(var A=c.length;A--;){var R=c[A];if(R.prefix===h)return R.namespace!==g}return!0}function Kt(s,n,c){s.push(" ",n,'="',c.replace(/[<>&"\t\n\r]/g,Fe),'"')}function se(s,n,c,h,g){if(g||(g=[]),h)if(s=h(s),s){if(typeof s=="string"){n.push(s);return}}else return;switch(s.nodeType){case P:var A=s.attributes,R=A.length,Le=s.firstChild,V=s.tagName;c=o.isHTML(s.namespaceURI)||c;var pe=V;if(!c&&!s.prefix&&s.namespaceURI){for(var ce,ve=0;ve=0;Z--){var be=g[Z];if(be.prefix===""&&be.namespace===s.namespaceURI){ce=be.namespace;break}}if(ce!==s.namespaceURI)for(var Z=g.length-1;Z>=0;Z--){var be=g[Z];if(be.namespace===s.namespaceURI){be.prefix&&(pe=be.prefix+":"+V);break}}}n.push("<",pe);for(var Ve=0;Ve"),c&&/^script$/i.test(V))for(;Le;)Le.data?n.push(Le.data):se(Le,n,c,h,g.slice()),Le=Le.nextSibling;else for(;Le;)se(Le,n,c,h,g.slice()),Le=Le.nextSibling;n.push("",pe,">")}else n.push("/>");return;case I:case f:for(var Le=s.firstChild;Le;)se(Le,n,c,h,g.slice()),Le=Le.nextSibling;return;case L:return Kt(n,s.name,s.value);case j:return n.push(s.data.replace(/[<&>]/g,Fe));case N:return n.push("");case E:return n.push("");case p:var Te=s.publicId,Se=s.systemId;if(n.push("");else if(Se&&Se!=".")n.push(" SYSTEM ",Se,">");else{var Ae=s.internalSubset;Ae&&n.push(" [",Ae,"]"),n.push(">")}return;case B:return n.push("",s.target," ",s.data,"?>");case W:return n.push("&",s.nodeName,";");default:n.push("??",s.nodeName)}}function or(s,n,c){var h;switch(n.nodeType){case P:h=n.cloneNode(!1),h.ownerDocument=s;case f:break;case L:c=!0;break}if(h||(h=n.cloneNode(!1)),h.ownerDocument=s,h.parentNode=null,c)for(var g=n.firstChild;g;)h.appendChild(or(s,g,c)),g=g.nextSibling;return h}function Ft(s,n,c){var h=new n.constructor;for(var g in n)if(Object.prototype.hasOwnProperty.call(n,g)){var A=n[g];typeof A!="object"&&A!=h[g]&&(h[g]=A)}switch(n.childNodes&&(h.childNodes=new re),h.ownerDocument=s,h.nodeType){case P:var R=n.attributes,V=h.attributes=new le,pe=R.length;V._ownerElement=h;for(var ce=0;ce",lt:"<",quot:'"'}),u.HTML_ENTITIES=t({Aacute:"\xC1",aacute:"\xE1",Abreve:"\u0102",abreve:"\u0103",ac:"\u223E",acd:"\u223F",acE:"\u223E\u0333",Acirc:"\xC2",acirc:"\xE2",acute:"\xB4",Acy:"\u0410",acy:"\u0430",AElig:"\xC6",aelig:"\xE6",af:"\u2061",Afr:"\u{1D504}",afr:"\u{1D51E}",Agrave:"\xC0",agrave:"\xE0",alefsym:"\u2135",aleph:"\u2135",Alpha:"\u0391",alpha:"\u03B1",Amacr:"\u0100",amacr:"\u0101",amalg:"\u2A3F",AMP:"&",amp:"&",And:"\u2A53",and:"\u2227",andand:"\u2A55",andd:"\u2A5C",andslope:"\u2A58",andv:"\u2A5A",ang:"\u2220",ange:"\u29A4",angle:"\u2220",angmsd:"\u2221",angmsdaa:"\u29A8",angmsdab:"\u29A9",angmsdac:"\u29AA",angmsdad:"\u29AB",angmsdae:"\u29AC",angmsdaf:"\u29AD",angmsdag:"\u29AE",angmsdah:"\u29AF",angrt:"\u221F",angrtvb:"\u22BE",angrtvbd:"\u299D",angsph:"\u2222",angst:"\xC5",angzarr:"\u237C",Aogon:"\u0104",aogon:"\u0105",Aopf:"\u{1D538}",aopf:"\u{1D552}",ap:"\u2248",apacir:"\u2A6F",apE:"\u2A70",ape:"\u224A",apid:"\u224B",apos:"'",ApplyFunction:"\u2061",approx:"\u2248",approxeq:"\u224A",Aring:"\xC5",aring:"\xE5",Ascr:"\u{1D49C}",ascr:"\u{1D4B6}",Assign:"\u2254",ast:"*",asymp:"\u2248",asympeq:"\u224D",Atilde:"\xC3",atilde:"\xE3",Auml:"\xC4",auml:"\xE4",awconint:"\u2233",awint:"\u2A11",backcong:"\u224C",backepsilon:"\u03F6",backprime:"\u2035",backsim:"\u223D",backsimeq:"\u22CD",Backslash:"\u2216",Barv:"\u2AE7",barvee:"\u22BD",Barwed:"\u2306",barwed:"\u2305",barwedge:"\u2305",bbrk:"\u23B5",bbrktbrk:"\u23B6",bcong:"\u224C",Bcy:"\u0411",bcy:"\u0431",bdquo:"\u201E",becaus:"\u2235",Because:"\u2235",because:"\u2235",bemptyv:"\u29B0",bepsi:"\u03F6",bernou:"\u212C",Bernoullis:"\u212C",Beta:"\u0392",beta:"\u03B2",beth:"\u2136",between:"\u226C",Bfr:"\u{1D505}",bfr:"\u{1D51F}",bigcap:"\u22C2",bigcirc:"\u25EF",bigcup:"\u22C3",bigodot:"\u2A00",bigoplus:"\u2A01",bigotimes:"\u2A02",bigsqcup:"\u2A06",bigstar:"\u2605",bigtriangledown:"\u25BD",bigtriangleup:"\u25B3",biguplus:"\u2A04",bigvee:"\u22C1",bigwedge:"\u22C0",bkarow:"\u290D",blacklozenge:"\u29EB",blacksquare:"\u25AA",blacktriangle:"\u25B4",blacktriangledown:"\u25BE",blacktriangleleft:"\u25C2",blacktriangleright:"\u25B8",blank:"\u2423",blk12:"\u2592",blk14:"\u2591",blk34:"\u2593",block:"\u2588",bne:"=\u20E5",bnequiv:"\u2261\u20E5",bNot:"\u2AED",bnot:"\u2310",Bopf:"\u{1D539}",bopf:"\u{1D553}",bot:"\u22A5",bottom:"\u22A5",bowtie:"\u22C8",boxbox:"\u29C9",boxDL:"\u2557",boxDl:"\u2556",boxdL:"\u2555",boxdl:"\u2510",boxDR:"\u2554",boxDr:"\u2553",boxdR:"\u2552",boxdr:"\u250C",boxH:"\u2550",boxh:"\u2500",boxHD:"\u2566",boxHd:"\u2564",boxhD:"\u2565",boxhd:"\u252C",boxHU:"\u2569",boxHu:"\u2567",boxhU:"\u2568",boxhu:"\u2534",boxminus:"\u229F",boxplus:"\u229E",boxtimes:"\u22A0",boxUL:"\u255D",boxUl:"\u255C",boxuL:"\u255B",boxul:"\u2518",boxUR:"\u255A",boxUr:"\u2559",boxuR:"\u2558",boxur:"\u2514",boxV:"\u2551",boxv:"\u2502",boxVH:"\u256C",boxVh:"\u256B",boxvH:"\u256A",boxvh:"\u253C",boxVL:"\u2563",boxVl:"\u2562",boxvL:"\u2561",boxvl:"\u2524",boxVR:"\u2560",boxVr:"\u255F",boxvR:"\u255E",boxvr:"\u251C",bprime:"\u2035",Breve:"\u02D8",breve:"\u02D8",brvbar:"\xA6",Bscr:"\u212C",bscr:"\u{1D4B7}",bsemi:"\u204F",bsim:"\u223D",bsime:"\u22CD",bsol:"\\",bsolb:"\u29C5",bsolhsub:"\u27C8",bull:"\u2022",bullet:"\u2022",bump:"\u224E",bumpE:"\u2AAE",bumpe:"\u224F",Bumpeq:"\u224E",bumpeq:"\u224F",Cacute:"\u0106",cacute:"\u0107",Cap:"\u22D2",cap:"\u2229",capand:"\u2A44",capbrcup:"\u2A49",capcap:"\u2A4B",capcup:"\u2A47",capdot:"\u2A40",CapitalDifferentialD:"\u2145",caps:"\u2229\uFE00",caret:"\u2041",caron:"\u02C7",Cayleys:"\u212D",ccaps:"\u2A4D",Ccaron:"\u010C",ccaron:"\u010D",Ccedil:"\xC7",ccedil:"\xE7",Ccirc:"\u0108",ccirc:"\u0109",Cconint:"\u2230",ccups:"\u2A4C",ccupssm:"\u2A50",Cdot:"\u010A",cdot:"\u010B",cedil:"\xB8",Cedilla:"\xB8",cemptyv:"\u29B2",cent:"\xA2",CenterDot:"\xB7",centerdot:"\xB7",Cfr:"\u212D",cfr:"\u{1D520}",CHcy:"\u0427",chcy:"\u0447",check:"\u2713",checkmark:"\u2713",Chi:"\u03A7",chi:"\u03C7",cir:"\u25CB",circ:"\u02C6",circeq:"\u2257",circlearrowleft:"\u21BA",circlearrowright:"\u21BB",circledast:"\u229B",circledcirc:"\u229A",circleddash:"\u229D",CircleDot:"\u2299",circledR:"\xAE",circledS:"\u24C8",CircleMinus:"\u2296",CirclePlus:"\u2295",CircleTimes:"\u2297",cirE:"\u29C3",cire:"\u2257",cirfnint:"\u2A10",cirmid:"\u2AEF",cirscir:"\u29C2",ClockwiseContourIntegral:"\u2232",CloseCurlyDoubleQuote:"\u201D",CloseCurlyQuote:"\u2019",clubs:"\u2663",clubsuit:"\u2663",Colon:"\u2237",colon:":",Colone:"\u2A74",colone:"\u2254",coloneq:"\u2254",comma:",",commat:"@",comp:"\u2201",compfn:"\u2218",complement:"\u2201",complexes:"\u2102",cong:"\u2245",congdot:"\u2A6D",Congruent:"\u2261",Conint:"\u222F",conint:"\u222E",ContourIntegral:"\u222E",Copf:"\u2102",copf:"\u{1D554}",coprod:"\u2210",Coproduct:"\u2210",COPY:"\xA9",copy:"\xA9",copysr:"\u2117",CounterClockwiseContourIntegral:"\u2233",crarr:"\u21B5",Cross:"\u2A2F",cross:"\u2717",Cscr:"\u{1D49E}",cscr:"\u{1D4B8}",csub:"\u2ACF",csube:"\u2AD1",csup:"\u2AD0",csupe:"\u2AD2",ctdot:"\u22EF",cudarrl:"\u2938",cudarrr:"\u2935",cuepr:"\u22DE",cuesc:"\u22DF",cularr:"\u21B6",cularrp:"\u293D",Cup:"\u22D3",cup:"\u222A",cupbrcap:"\u2A48",CupCap:"\u224D",cupcap:"\u2A46",cupcup:"\u2A4A",cupdot:"\u228D",cupor:"\u2A45",cups:"\u222A\uFE00",curarr:"\u21B7",curarrm:"\u293C",curlyeqprec:"\u22DE",curlyeqsucc:"\u22DF",curlyvee:"\u22CE",curlywedge:"\u22CF",curren:"\xA4",curvearrowleft:"\u21B6",curvearrowright:"\u21B7",cuvee:"\u22CE",cuwed:"\u22CF",cwconint:"\u2232",cwint:"\u2231",cylcty:"\u232D",Dagger:"\u2021",dagger:"\u2020",daleth:"\u2138",Darr:"\u21A1",dArr:"\u21D3",darr:"\u2193",dash:"\u2010",Dashv:"\u2AE4",dashv:"\u22A3",dbkarow:"\u290F",dblac:"\u02DD",Dcaron:"\u010E",dcaron:"\u010F",Dcy:"\u0414",dcy:"\u0434",DD:"\u2145",dd:"\u2146",ddagger:"\u2021",ddarr:"\u21CA",DDotrahd:"\u2911",ddotseq:"\u2A77",deg:"\xB0",Del:"\u2207",Delta:"\u0394",delta:"\u03B4",demptyv:"\u29B1",dfisht:"\u297F",Dfr:"\u{1D507}",dfr:"\u{1D521}",dHar:"\u2965",dharl:"\u21C3",dharr:"\u21C2",DiacriticalAcute:"\xB4",DiacriticalDot:"\u02D9",DiacriticalDoubleAcute:"\u02DD",DiacriticalGrave:"`",DiacriticalTilde:"\u02DC",diam:"\u22C4",Diamond:"\u22C4",diamond:"\u22C4",diamondsuit:"\u2666",diams:"\u2666",die:"\xA8",DifferentialD:"\u2146",digamma:"\u03DD",disin:"\u22F2",div:"\xF7",divide:"\xF7",divideontimes:"\u22C7",divonx:"\u22C7",DJcy:"\u0402",djcy:"\u0452",dlcorn:"\u231E",dlcrop:"\u230D",dollar:"$",Dopf:"\u{1D53B}",dopf:"\u{1D555}",Dot:"\xA8",dot:"\u02D9",DotDot:"\u20DC",doteq:"\u2250",doteqdot:"\u2251",DotEqual:"\u2250",dotminus:"\u2238",dotplus:"\u2214",dotsquare:"\u22A1",doublebarwedge:"\u2306",DoubleContourIntegral:"\u222F",DoubleDot:"\xA8",DoubleDownArrow:"\u21D3",DoubleLeftArrow:"\u21D0",DoubleLeftRightArrow:"\u21D4",DoubleLeftTee:"\u2AE4",DoubleLongLeftArrow:"\u27F8",DoubleLongLeftRightArrow:"\u27FA",DoubleLongRightArrow:"\u27F9",DoubleRightArrow:"\u21D2",DoubleRightTee:"\u22A8",DoubleUpArrow:"\u21D1",DoubleUpDownArrow:"\u21D5",DoubleVerticalBar:"\u2225",DownArrow:"\u2193",Downarrow:"\u21D3",downarrow:"\u2193",DownArrowBar:"\u2913",DownArrowUpArrow:"\u21F5",DownBreve:"\u0311",downdownarrows:"\u21CA",downharpoonleft:"\u21C3",downharpoonright:"\u21C2",DownLeftRightVector:"\u2950",DownLeftTeeVector:"\u295E",DownLeftVector:"\u21BD",DownLeftVectorBar:"\u2956",DownRightTeeVector:"\u295F",DownRightVector:"\u21C1",DownRightVectorBar:"\u2957",DownTee:"\u22A4",DownTeeArrow:"\u21A7",drbkarow:"\u2910",drcorn:"\u231F",drcrop:"\u230C",Dscr:"\u{1D49F}",dscr:"\u{1D4B9}",DScy:"\u0405",dscy:"\u0455",dsol:"\u29F6",Dstrok:"\u0110",dstrok:"\u0111",dtdot:"\u22F1",dtri:"\u25BF",dtrif:"\u25BE",duarr:"\u21F5",duhar:"\u296F",dwangle:"\u29A6",DZcy:"\u040F",dzcy:"\u045F",dzigrarr:"\u27FF",Eacute:"\xC9",eacute:"\xE9",easter:"\u2A6E",Ecaron:"\u011A",ecaron:"\u011B",ecir:"\u2256",Ecirc:"\xCA",ecirc:"\xEA",ecolon:"\u2255",Ecy:"\u042D",ecy:"\u044D",eDDot:"\u2A77",Edot:"\u0116",eDot:"\u2251",edot:"\u0117",ee:"\u2147",efDot:"\u2252",Efr:"\u{1D508}",efr:"\u{1D522}",eg:"\u2A9A",Egrave:"\xC8",egrave:"\xE8",egs:"\u2A96",egsdot:"\u2A98",el:"\u2A99",Element:"\u2208",elinters:"\u23E7",ell:"\u2113",els:"\u2A95",elsdot:"\u2A97",Emacr:"\u0112",emacr:"\u0113",empty:"\u2205",emptyset:"\u2205",EmptySmallSquare:"\u25FB",emptyv:"\u2205",EmptyVerySmallSquare:"\u25AB",emsp:"\u2003",emsp13:"\u2004",emsp14:"\u2005",ENG:"\u014A",eng:"\u014B",ensp:"\u2002",Eogon:"\u0118",eogon:"\u0119",Eopf:"\u{1D53C}",eopf:"\u{1D556}",epar:"\u22D5",eparsl:"\u29E3",eplus:"\u2A71",epsi:"\u03B5",Epsilon:"\u0395",epsilon:"\u03B5",epsiv:"\u03F5",eqcirc:"\u2256",eqcolon:"\u2255",eqsim:"\u2242",eqslantgtr:"\u2A96",eqslantless:"\u2A95",Equal:"\u2A75",equals:"=",EqualTilde:"\u2242",equest:"\u225F",Equilibrium:"\u21CC",equiv:"\u2261",equivDD:"\u2A78",eqvparsl:"\u29E5",erarr:"\u2971",erDot:"\u2253",Escr:"\u2130",escr:"\u212F",esdot:"\u2250",Esim:"\u2A73",esim:"\u2242",Eta:"\u0397",eta:"\u03B7",ETH:"\xD0",eth:"\xF0",Euml:"\xCB",euml:"\xEB",euro:"\u20AC",excl:"!",exist:"\u2203",Exists:"\u2203",expectation:"\u2130",ExponentialE:"\u2147",exponentiale:"\u2147",fallingdotseq:"\u2252",Fcy:"\u0424",fcy:"\u0444",female:"\u2640",ffilig:"\uFB03",fflig:"\uFB00",ffllig:"\uFB04",Ffr:"\u{1D509}",ffr:"\u{1D523}",filig:"\uFB01",FilledSmallSquare:"\u25FC",FilledVerySmallSquare:"\u25AA",fjlig:"fj",flat:"\u266D",fllig:"\uFB02",fltns:"\u25B1",fnof:"\u0192",Fopf:"\u{1D53D}",fopf:"\u{1D557}",ForAll:"\u2200",forall:"\u2200",fork:"\u22D4",forkv:"\u2AD9",Fouriertrf:"\u2131",fpartint:"\u2A0D",frac12:"\xBD",frac13:"\u2153",frac14:"\xBC",frac15:"\u2155",frac16:"\u2159",frac18:"\u215B",frac23:"\u2154",frac25:"\u2156",frac34:"\xBE",frac35:"\u2157",frac38:"\u215C",frac45:"\u2158",frac56:"\u215A",frac58:"\u215D",frac78:"\u215E",frasl:"\u2044",frown:"\u2322",Fscr:"\u2131",fscr:"\u{1D4BB}",gacute:"\u01F5",Gamma:"\u0393",gamma:"\u03B3",Gammad:"\u03DC",gammad:"\u03DD",gap:"\u2A86",Gbreve:"\u011E",gbreve:"\u011F",Gcedil:"\u0122",Gcirc:"\u011C",gcirc:"\u011D",Gcy:"\u0413",gcy:"\u0433",Gdot:"\u0120",gdot:"\u0121",gE:"\u2267",ge:"\u2265",gEl:"\u2A8C",gel:"\u22DB",geq:"\u2265",geqq:"\u2267",geqslant:"\u2A7E",ges:"\u2A7E",gescc:"\u2AA9",gesdot:"\u2A80",gesdoto:"\u2A82",gesdotol:"\u2A84",gesl:"\u22DB\uFE00",gesles:"\u2A94",Gfr:"\u{1D50A}",gfr:"\u{1D524}",Gg:"\u22D9",gg:"\u226B",ggg:"\u22D9",gimel:"\u2137",GJcy:"\u0403",gjcy:"\u0453",gl:"\u2277",gla:"\u2AA5",glE:"\u2A92",glj:"\u2AA4",gnap:"\u2A8A",gnapprox:"\u2A8A",gnE:"\u2269",gne:"\u2A88",gneq:"\u2A88",gneqq:"\u2269",gnsim:"\u22E7",Gopf:"\u{1D53E}",gopf:"\u{1D558}",grave:"`",GreaterEqual:"\u2265",GreaterEqualLess:"\u22DB",GreaterFullEqual:"\u2267",GreaterGreater:"\u2AA2",GreaterLess:"\u2277",GreaterSlantEqual:"\u2A7E",GreaterTilde:"\u2273",Gscr:"\u{1D4A2}",gscr:"\u210A",gsim:"\u2273",gsime:"\u2A8E",gsiml:"\u2A90",Gt:"\u226B",GT:">",gt:">",gtcc:"\u2AA7",gtcir:"\u2A7A",gtdot:"\u22D7",gtlPar:"\u2995",gtquest:"\u2A7C",gtrapprox:"\u2A86",gtrarr:"\u2978",gtrdot:"\u22D7",gtreqless:"\u22DB",gtreqqless:"\u2A8C",gtrless:"\u2277",gtrsim:"\u2273",gvertneqq:"\u2269\uFE00",gvnE:"\u2269\uFE00",Hacek:"\u02C7",hairsp:"\u200A",half:"\xBD",hamilt:"\u210B",HARDcy:"\u042A",hardcy:"\u044A",hArr:"\u21D4",harr:"\u2194",harrcir:"\u2948",harrw:"\u21AD",Hat:"^",hbar:"\u210F",Hcirc:"\u0124",hcirc:"\u0125",hearts:"\u2665",heartsuit:"\u2665",hellip:"\u2026",hercon:"\u22B9",Hfr:"\u210C",hfr:"\u{1D525}",HilbertSpace:"\u210B",hksearow:"\u2925",hkswarow:"\u2926",hoarr:"\u21FF",homtht:"\u223B",hookleftarrow:"\u21A9",hookrightarrow:"\u21AA",Hopf:"\u210D",hopf:"\u{1D559}",horbar:"\u2015",HorizontalLine:"\u2500",Hscr:"\u210B",hscr:"\u{1D4BD}",hslash:"\u210F",Hstrok:"\u0126",hstrok:"\u0127",HumpDownHump:"\u224E",HumpEqual:"\u224F",hybull:"\u2043",hyphen:"\u2010",Iacute:"\xCD",iacute:"\xED",ic:"\u2063",Icirc:"\xCE",icirc:"\xEE",Icy:"\u0418",icy:"\u0438",Idot:"\u0130",IEcy:"\u0415",iecy:"\u0435",iexcl:"\xA1",iff:"\u21D4",Ifr:"\u2111",ifr:"\u{1D526}",Igrave:"\xCC",igrave:"\xEC",ii:"\u2148",iiiint:"\u2A0C",iiint:"\u222D",iinfin:"\u29DC",iiota:"\u2129",IJlig:"\u0132",ijlig:"\u0133",Im:"\u2111",Imacr:"\u012A",imacr:"\u012B",image:"\u2111",ImaginaryI:"\u2148",imagline:"\u2110",imagpart:"\u2111",imath:"\u0131",imof:"\u22B7",imped:"\u01B5",Implies:"\u21D2",in:"\u2208",incare:"\u2105",infin:"\u221E",infintie:"\u29DD",inodot:"\u0131",Int:"\u222C",int:"\u222B",intcal:"\u22BA",integers:"\u2124",Integral:"\u222B",intercal:"\u22BA",Intersection:"\u22C2",intlarhk:"\u2A17",intprod:"\u2A3C",InvisibleComma:"\u2063",InvisibleTimes:"\u2062",IOcy:"\u0401",iocy:"\u0451",Iogon:"\u012E",iogon:"\u012F",Iopf:"\u{1D540}",iopf:"\u{1D55A}",Iota:"\u0399",iota:"\u03B9",iprod:"\u2A3C",iquest:"\xBF",Iscr:"\u2110",iscr:"\u{1D4BE}",isin:"\u2208",isindot:"\u22F5",isinE:"\u22F9",isins:"\u22F4",isinsv:"\u22F3",isinv:"\u2208",it:"\u2062",Itilde:"\u0128",itilde:"\u0129",Iukcy:"\u0406",iukcy:"\u0456",Iuml:"\xCF",iuml:"\xEF",Jcirc:"\u0134",jcirc:"\u0135",Jcy:"\u0419",jcy:"\u0439",Jfr:"\u{1D50D}",jfr:"\u{1D527}",jmath:"\u0237",Jopf:"\u{1D541}",jopf:"\u{1D55B}",Jscr:"\u{1D4A5}",jscr:"\u{1D4BF}",Jsercy:"\u0408",jsercy:"\u0458",Jukcy:"\u0404",jukcy:"\u0454",Kappa:"\u039A",kappa:"\u03BA",kappav:"\u03F0",Kcedil:"\u0136",kcedil:"\u0137",Kcy:"\u041A",kcy:"\u043A",Kfr:"\u{1D50E}",kfr:"\u{1D528}",kgreen:"\u0138",KHcy:"\u0425",khcy:"\u0445",KJcy:"\u040C",kjcy:"\u045C",Kopf:"\u{1D542}",kopf:"\u{1D55C}",Kscr:"\u{1D4A6}",kscr:"\u{1D4C0}",lAarr:"\u21DA",Lacute:"\u0139",lacute:"\u013A",laemptyv:"\u29B4",lagran:"\u2112",Lambda:"\u039B",lambda:"\u03BB",Lang:"\u27EA",lang:"\u27E8",langd:"\u2991",langle:"\u27E8",lap:"\u2A85",Laplacetrf:"\u2112",laquo:"\xAB",Larr:"\u219E",lArr:"\u21D0",larr:"\u2190",larrb:"\u21E4",larrbfs:"\u291F",larrfs:"\u291D",larrhk:"\u21A9",larrlp:"\u21AB",larrpl:"\u2939",larrsim:"\u2973",larrtl:"\u21A2",lat:"\u2AAB",lAtail:"\u291B",latail:"\u2919",late:"\u2AAD",lates:"\u2AAD\uFE00",lBarr:"\u290E",lbarr:"\u290C",lbbrk:"\u2772",lbrace:"{",lbrack:"[",lbrke:"\u298B",lbrksld:"\u298F",lbrkslu:"\u298D",Lcaron:"\u013D",lcaron:"\u013E",Lcedil:"\u013B",lcedil:"\u013C",lceil:"\u2308",lcub:"{",Lcy:"\u041B",lcy:"\u043B",ldca:"\u2936",ldquo:"\u201C",ldquor:"\u201E",ldrdhar:"\u2967",ldrushar:"\u294B",ldsh:"\u21B2",lE:"\u2266",le:"\u2264",LeftAngleBracket:"\u27E8",LeftArrow:"\u2190",Leftarrow:"\u21D0",leftarrow:"\u2190",LeftArrowBar:"\u21E4",LeftArrowRightArrow:"\u21C6",leftarrowtail:"\u21A2",LeftCeiling:"\u2308",LeftDoubleBracket:"\u27E6",LeftDownTeeVector:"\u2961",LeftDownVector:"\u21C3",LeftDownVectorBar:"\u2959",LeftFloor:"\u230A",leftharpoondown:"\u21BD",leftharpoonup:"\u21BC",leftleftarrows:"\u21C7",LeftRightArrow:"\u2194",Leftrightarrow:"\u21D4",leftrightarrow:"\u2194",leftrightarrows:"\u21C6",leftrightharpoons:"\u21CB",leftrightsquigarrow:"\u21AD",LeftRightVector:"\u294E",LeftTee:"\u22A3",LeftTeeArrow:"\u21A4",LeftTeeVector:"\u295A",leftthreetimes:"\u22CB",LeftTriangle:"\u22B2",LeftTriangleBar:"\u29CF",LeftTriangleEqual:"\u22B4",LeftUpDownVector:"\u2951",LeftUpTeeVector:"\u2960",LeftUpVector:"\u21BF",LeftUpVectorBar:"\u2958",LeftVector:"\u21BC",LeftVectorBar:"\u2952",lEg:"\u2A8B",leg:"\u22DA",leq:"\u2264",leqq:"\u2266",leqslant:"\u2A7D",les:"\u2A7D",lescc:"\u2AA8",lesdot:"\u2A7F",lesdoto:"\u2A81",lesdotor:"\u2A83",lesg:"\u22DA\uFE00",lesges:"\u2A93",lessapprox:"\u2A85",lessdot:"\u22D6",lesseqgtr:"\u22DA",lesseqqgtr:"\u2A8B",LessEqualGreater:"\u22DA",LessFullEqual:"\u2266",LessGreater:"\u2276",lessgtr:"\u2276",LessLess:"\u2AA1",lesssim:"\u2272",LessSlantEqual:"\u2A7D",LessTilde:"\u2272",lfisht:"\u297C",lfloor:"\u230A",Lfr:"\u{1D50F}",lfr:"\u{1D529}",lg:"\u2276",lgE:"\u2A91",lHar:"\u2962",lhard:"\u21BD",lharu:"\u21BC",lharul:"\u296A",lhblk:"\u2584",LJcy:"\u0409",ljcy:"\u0459",Ll:"\u22D8",ll:"\u226A",llarr:"\u21C7",llcorner:"\u231E",Lleftarrow:"\u21DA",llhard:"\u296B",lltri:"\u25FA",Lmidot:"\u013F",lmidot:"\u0140",lmoust:"\u23B0",lmoustache:"\u23B0",lnap:"\u2A89",lnapprox:"\u2A89",lnE:"\u2268",lne:"\u2A87",lneq:"\u2A87",lneqq:"\u2268",lnsim:"\u22E6",loang:"\u27EC",loarr:"\u21FD",lobrk:"\u27E6",LongLeftArrow:"\u27F5",Longleftarrow:"\u27F8",longleftarrow:"\u27F5",LongLeftRightArrow:"\u27F7",Longleftrightarrow:"\u27FA",longleftrightarrow:"\u27F7",longmapsto:"\u27FC",LongRightArrow:"\u27F6",Longrightarrow:"\u27F9",longrightarrow:"\u27F6",looparrowleft:"\u21AB",looparrowright:"\u21AC",lopar:"\u2985",Lopf:"\u{1D543}",lopf:"\u{1D55D}",loplus:"\u2A2D",lotimes:"\u2A34",lowast:"\u2217",lowbar:"_",LowerLeftArrow:"\u2199",LowerRightArrow:"\u2198",loz:"\u25CA",lozenge:"\u25CA",lozf:"\u29EB",lpar:"(",lparlt:"\u2993",lrarr:"\u21C6",lrcorner:"\u231F",lrhar:"\u21CB",lrhard:"\u296D",lrm:"\u200E",lrtri:"\u22BF",lsaquo:"\u2039",Lscr:"\u2112",lscr:"\u{1D4C1}",Lsh:"\u21B0",lsh:"\u21B0",lsim:"\u2272",lsime:"\u2A8D",lsimg:"\u2A8F",lsqb:"[",lsquo:"\u2018",lsquor:"\u201A",Lstrok:"\u0141",lstrok:"\u0142",Lt:"\u226A",LT:"<",lt:"<",ltcc:"\u2AA6",ltcir:"\u2A79",ltdot:"\u22D6",lthree:"\u22CB",ltimes:"\u22C9",ltlarr:"\u2976",ltquest:"\u2A7B",ltri:"\u25C3",ltrie:"\u22B4",ltrif:"\u25C2",ltrPar:"\u2996",lurdshar:"\u294A",luruhar:"\u2966",lvertneqq:"\u2268\uFE00",lvnE:"\u2268\uFE00",macr:"\xAF",male:"\u2642",malt:"\u2720",maltese:"\u2720",Map:"\u2905",map:"\u21A6",mapsto:"\u21A6",mapstodown:"\u21A7",mapstoleft:"\u21A4",mapstoup:"\u21A5",marker:"\u25AE",mcomma:"\u2A29",Mcy:"\u041C",mcy:"\u043C",mdash:"\u2014",mDDot:"\u223A",measuredangle:"\u2221",MediumSpace:"\u205F",Mellintrf:"\u2133",Mfr:"\u{1D510}",mfr:"\u{1D52A}",mho:"\u2127",micro:"\xB5",mid:"\u2223",midast:"*",midcir:"\u2AF0",middot:"\xB7",minus:"\u2212",minusb:"\u229F",minusd:"\u2238",minusdu:"\u2A2A",MinusPlus:"\u2213",mlcp:"\u2ADB",mldr:"\u2026",mnplus:"\u2213",models:"\u22A7",Mopf:"\u{1D544}",mopf:"\u{1D55E}",mp:"\u2213",Mscr:"\u2133",mscr:"\u{1D4C2}",mstpos:"\u223E",Mu:"\u039C",mu:"\u03BC",multimap:"\u22B8",mumap:"\u22B8",nabla:"\u2207",Nacute:"\u0143",nacute:"\u0144",nang:"\u2220\u20D2",nap:"\u2249",napE:"\u2A70\u0338",napid:"\u224B\u0338",napos:"\u0149",napprox:"\u2249",natur:"\u266E",natural:"\u266E",naturals:"\u2115",nbsp:"\xA0",nbump:"\u224E\u0338",nbumpe:"\u224F\u0338",ncap:"\u2A43",Ncaron:"\u0147",ncaron:"\u0148",Ncedil:"\u0145",ncedil:"\u0146",ncong:"\u2247",ncongdot:"\u2A6D\u0338",ncup:"\u2A42",Ncy:"\u041D",ncy:"\u043D",ndash:"\u2013",ne:"\u2260",nearhk:"\u2924",neArr:"\u21D7",nearr:"\u2197",nearrow:"\u2197",nedot:"\u2250\u0338",NegativeMediumSpace:"\u200B",NegativeThickSpace:"\u200B",NegativeThinSpace:"\u200B",NegativeVeryThinSpace:"\u200B",nequiv:"\u2262",nesear:"\u2928",nesim:"\u2242\u0338",NestedGreaterGreater:"\u226B",NestedLessLess:"\u226A",NewLine:`
+`,nexist:"\u2204",nexists:"\u2204",Nfr:"\u{1D511}",nfr:"\u{1D52B}",ngE:"\u2267\u0338",nge:"\u2271",ngeq:"\u2271",ngeqq:"\u2267\u0338",ngeqslant:"\u2A7E\u0338",nges:"\u2A7E\u0338",nGg:"\u22D9\u0338",ngsim:"\u2275",nGt:"\u226B\u20D2",ngt:"\u226F",ngtr:"\u226F",nGtv:"\u226B\u0338",nhArr:"\u21CE",nharr:"\u21AE",nhpar:"\u2AF2",ni:"\u220B",nis:"\u22FC",nisd:"\u22FA",niv:"\u220B",NJcy:"\u040A",njcy:"\u045A",nlArr:"\u21CD",nlarr:"\u219A",nldr:"\u2025",nlE:"\u2266\u0338",nle:"\u2270",nLeftarrow:"\u21CD",nleftarrow:"\u219A",nLeftrightarrow:"\u21CE",nleftrightarrow:"\u21AE",nleq:"\u2270",nleqq:"\u2266\u0338",nleqslant:"\u2A7D\u0338",nles:"\u2A7D\u0338",nless:"\u226E",nLl:"\u22D8\u0338",nlsim:"\u2274",nLt:"\u226A\u20D2",nlt:"\u226E",nltri:"\u22EA",nltrie:"\u22EC",nLtv:"\u226A\u0338",nmid:"\u2224",NoBreak:"\u2060",NonBreakingSpace:"\xA0",Nopf:"\u2115",nopf:"\u{1D55F}",Not:"\u2AEC",not:"\xAC",NotCongruent:"\u2262",NotCupCap:"\u226D",NotDoubleVerticalBar:"\u2226",NotElement:"\u2209",NotEqual:"\u2260",NotEqualTilde:"\u2242\u0338",NotExists:"\u2204",NotGreater:"\u226F",NotGreaterEqual:"\u2271",NotGreaterFullEqual:"\u2267\u0338",NotGreaterGreater:"\u226B\u0338",NotGreaterLess:"\u2279",NotGreaterSlantEqual:"\u2A7E\u0338",NotGreaterTilde:"\u2275",NotHumpDownHump:"\u224E\u0338",NotHumpEqual:"\u224F\u0338",notin:"\u2209",notindot:"\u22F5\u0338",notinE:"\u22F9\u0338",notinva:"\u2209",notinvb:"\u22F7",notinvc:"\u22F6",NotLeftTriangle:"\u22EA",NotLeftTriangleBar:"\u29CF\u0338",NotLeftTriangleEqual:"\u22EC",NotLess:"\u226E",NotLessEqual:"\u2270",NotLessGreater:"\u2278",NotLessLess:"\u226A\u0338",NotLessSlantEqual:"\u2A7D\u0338",NotLessTilde:"\u2274",NotNestedGreaterGreater:"\u2AA2\u0338",NotNestedLessLess:"\u2AA1\u0338",notni:"\u220C",notniva:"\u220C",notnivb:"\u22FE",notnivc:"\u22FD",NotPrecedes:"\u2280",NotPrecedesEqual:"\u2AAF\u0338",NotPrecedesSlantEqual:"\u22E0",NotReverseElement:"\u220C",NotRightTriangle:"\u22EB",NotRightTriangleBar:"\u29D0\u0338",NotRightTriangleEqual:"\u22ED",NotSquareSubset:"\u228F\u0338",NotSquareSubsetEqual:"\u22E2",NotSquareSuperset:"\u2290\u0338",NotSquareSupersetEqual:"\u22E3",NotSubset:"\u2282\u20D2",NotSubsetEqual:"\u2288",NotSucceeds:"\u2281",NotSucceedsEqual:"\u2AB0\u0338",NotSucceedsSlantEqual:"\u22E1",NotSucceedsTilde:"\u227F\u0338",NotSuperset:"\u2283\u20D2",NotSupersetEqual:"\u2289",NotTilde:"\u2241",NotTildeEqual:"\u2244",NotTildeFullEqual:"\u2247",NotTildeTilde:"\u2249",NotVerticalBar:"\u2224",npar:"\u2226",nparallel:"\u2226",nparsl:"\u2AFD\u20E5",npart:"\u2202\u0338",npolint:"\u2A14",npr:"\u2280",nprcue:"\u22E0",npre:"\u2AAF\u0338",nprec:"\u2280",npreceq:"\u2AAF\u0338",nrArr:"\u21CF",nrarr:"\u219B",nrarrc:"\u2933\u0338",nrarrw:"\u219D\u0338",nRightarrow:"\u21CF",nrightarrow:"\u219B",nrtri:"\u22EB",nrtrie:"\u22ED",nsc:"\u2281",nsccue:"\u22E1",nsce:"\u2AB0\u0338",Nscr:"\u{1D4A9}",nscr:"\u{1D4C3}",nshortmid:"\u2224",nshortparallel:"\u2226",nsim:"\u2241",nsime:"\u2244",nsimeq:"\u2244",nsmid:"\u2224",nspar:"\u2226",nsqsube:"\u22E2",nsqsupe:"\u22E3",nsub:"\u2284",nsubE:"\u2AC5\u0338",nsube:"\u2288",nsubset:"\u2282\u20D2",nsubseteq:"\u2288",nsubseteqq:"\u2AC5\u0338",nsucc:"\u2281",nsucceq:"\u2AB0\u0338",nsup:"\u2285",nsupE:"\u2AC6\u0338",nsupe:"\u2289",nsupset:"\u2283\u20D2",nsupseteq:"\u2289",nsupseteqq:"\u2AC6\u0338",ntgl:"\u2279",Ntilde:"\xD1",ntilde:"\xF1",ntlg:"\u2278",ntriangleleft:"\u22EA",ntrianglelefteq:"\u22EC",ntriangleright:"\u22EB",ntrianglerighteq:"\u22ED",Nu:"\u039D",nu:"\u03BD",num:"#",numero:"\u2116",numsp:"\u2007",nvap:"\u224D\u20D2",nVDash:"\u22AF",nVdash:"\u22AE",nvDash:"\u22AD",nvdash:"\u22AC",nvge:"\u2265\u20D2",nvgt:">\u20D2",nvHarr:"\u2904",nvinfin:"\u29DE",nvlArr:"\u2902",nvle:"\u2264\u20D2",nvlt:"<\u20D2",nvltrie:"\u22B4\u20D2",nvrArr:"\u2903",nvrtrie:"\u22B5\u20D2",nvsim:"\u223C\u20D2",nwarhk:"\u2923",nwArr:"\u21D6",nwarr:"\u2196",nwarrow:"\u2196",nwnear:"\u2927",Oacute:"\xD3",oacute:"\xF3",oast:"\u229B",ocir:"\u229A",Ocirc:"\xD4",ocirc:"\xF4",Ocy:"\u041E",ocy:"\u043E",odash:"\u229D",Odblac:"\u0150",odblac:"\u0151",odiv:"\u2A38",odot:"\u2299",odsold:"\u29BC",OElig:"\u0152",oelig:"\u0153",ofcir:"\u29BF",Ofr:"\u{1D512}",ofr:"\u{1D52C}",ogon:"\u02DB",Ograve:"\xD2",ograve:"\xF2",ogt:"\u29C1",ohbar:"\u29B5",ohm:"\u03A9",oint:"\u222E",olarr:"\u21BA",olcir:"\u29BE",olcross:"\u29BB",oline:"\u203E",olt:"\u29C0",Omacr:"\u014C",omacr:"\u014D",Omega:"\u03A9",omega:"\u03C9",Omicron:"\u039F",omicron:"\u03BF",omid:"\u29B6",ominus:"\u2296",Oopf:"\u{1D546}",oopf:"\u{1D560}",opar:"\u29B7",OpenCurlyDoubleQuote:"\u201C",OpenCurlyQuote:"\u2018",operp:"\u29B9",oplus:"\u2295",Or:"\u2A54",or:"\u2228",orarr:"\u21BB",ord:"\u2A5D",order:"\u2134",orderof:"\u2134",ordf:"\xAA",ordm:"\xBA",origof:"\u22B6",oror:"\u2A56",orslope:"\u2A57",orv:"\u2A5B",oS:"\u24C8",Oscr:"\u{1D4AA}",oscr:"\u2134",Oslash:"\xD8",oslash:"\xF8",osol:"\u2298",Otilde:"\xD5",otilde:"\xF5",Otimes:"\u2A37",otimes:"\u2297",otimesas:"\u2A36",Ouml:"\xD6",ouml:"\xF6",ovbar:"\u233D",OverBar:"\u203E",OverBrace:"\u23DE",OverBracket:"\u23B4",OverParenthesis:"\u23DC",par:"\u2225",para:"\xB6",parallel:"\u2225",parsim:"\u2AF3",parsl:"\u2AFD",part:"\u2202",PartialD:"\u2202",Pcy:"\u041F",pcy:"\u043F",percnt:"%",period:".",permil:"\u2030",perp:"\u22A5",pertenk:"\u2031",Pfr:"\u{1D513}",pfr:"\u{1D52D}",Phi:"\u03A6",phi:"\u03C6",phiv:"\u03D5",phmmat:"\u2133",phone:"\u260E",Pi:"\u03A0",pi:"\u03C0",pitchfork:"\u22D4",piv:"\u03D6",planck:"\u210F",planckh:"\u210E",plankv:"\u210F",plus:"+",plusacir:"\u2A23",plusb:"\u229E",pluscir:"\u2A22",plusdo:"\u2214",plusdu:"\u2A25",pluse:"\u2A72",PlusMinus:"\xB1",plusmn:"\xB1",plussim:"\u2A26",plustwo:"\u2A27",pm:"\xB1",Poincareplane:"\u210C",pointint:"\u2A15",Popf:"\u2119",popf:"\u{1D561}",pound:"\xA3",Pr:"\u2ABB",pr:"\u227A",prap:"\u2AB7",prcue:"\u227C",prE:"\u2AB3",pre:"\u2AAF",prec:"\u227A",precapprox:"\u2AB7",preccurlyeq:"\u227C",Precedes:"\u227A",PrecedesEqual:"\u2AAF",PrecedesSlantEqual:"\u227C",PrecedesTilde:"\u227E",preceq:"\u2AAF",precnapprox:"\u2AB9",precneqq:"\u2AB5",precnsim:"\u22E8",precsim:"\u227E",Prime:"\u2033",prime:"\u2032",primes:"\u2119",prnap:"\u2AB9",prnE:"\u2AB5",prnsim:"\u22E8",prod:"\u220F",Product:"\u220F",profalar:"\u232E",profline:"\u2312",profsurf:"\u2313",prop:"\u221D",Proportion:"\u2237",Proportional:"\u221D",propto:"\u221D",prsim:"\u227E",prurel:"\u22B0",Pscr:"\u{1D4AB}",pscr:"\u{1D4C5}",Psi:"\u03A8",psi:"\u03C8",puncsp:"\u2008",Qfr:"\u{1D514}",qfr:"\u{1D52E}",qint:"\u2A0C",Qopf:"\u211A",qopf:"\u{1D562}",qprime:"\u2057",Qscr:"\u{1D4AC}",qscr:"\u{1D4C6}",quaternions:"\u210D",quatint:"\u2A16",quest:"?",questeq:"\u225F",QUOT:'"',quot:'"',rAarr:"\u21DB",race:"\u223D\u0331",Racute:"\u0154",racute:"\u0155",radic:"\u221A",raemptyv:"\u29B3",Rang:"\u27EB",rang:"\u27E9",rangd:"\u2992",range:"\u29A5",rangle:"\u27E9",raquo:"\xBB",Rarr:"\u21A0",rArr:"\u21D2",rarr:"\u2192",rarrap:"\u2975",rarrb:"\u21E5",rarrbfs:"\u2920",rarrc:"\u2933",rarrfs:"\u291E",rarrhk:"\u21AA",rarrlp:"\u21AC",rarrpl:"\u2945",rarrsim:"\u2974",Rarrtl:"\u2916",rarrtl:"\u21A3",rarrw:"\u219D",rAtail:"\u291C",ratail:"\u291A",ratio:"\u2236",rationals:"\u211A",RBarr:"\u2910",rBarr:"\u290F",rbarr:"\u290D",rbbrk:"\u2773",rbrace:"}",rbrack:"]",rbrke:"\u298C",rbrksld:"\u298E",rbrkslu:"\u2990",Rcaron:"\u0158",rcaron:"\u0159",Rcedil:"\u0156",rcedil:"\u0157",rceil:"\u2309",rcub:"}",Rcy:"\u0420",rcy:"\u0440",rdca:"\u2937",rdldhar:"\u2969",rdquo:"\u201D",rdquor:"\u201D",rdsh:"\u21B3",Re:"\u211C",real:"\u211C",realine:"\u211B",realpart:"\u211C",reals:"\u211D",rect:"\u25AD",REG:"\xAE",reg:"\xAE",ReverseElement:"\u220B",ReverseEquilibrium:"\u21CB",ReverseUpEquilibrium:"\u296F",rfisht:"\u297D",rfloor:"\u230B",Rfr:"\u211C",rfr:"\u{1D52F}",rHar:"\u2964",rhard:"\u21C1",rharu:"\u21C0",rharul:"\u296C",Rho:"\u03A1",rho:"\u03C1",rhov:"\u03F1",RightAngleBracket:"\u27E9",RightArrow:"\u2192",Rightarrow:"\u21D2",rightarrow:"\u2192",RightArrowBar:"\u21E5",RightArrowLeftArrow:"\u21C4",rightarrowtail:"\u21A3",RightCeiling:"\u2309",RightDoubleBracket:"\u27E7",RightDownTeeVector:"\u295D",RightDownVector:"\u21C2",RightDownVectorBar:"\u2955",RightFloor:"\u230B",rightharpoondown:"\u21C1",rightharpoonup:"\u21C0",rightleftarrows:"\u21C4",rightleftharpoons:"\u21CC",rightrightarrows:"\u21C9",rightsquigarrow:"\u219D",RightTee:"\u22A2",RightTeeArrow:"\u21A6",RightTeeVector:"\u295B",rightthreetimes:"\u22CC",RightTriangle:"\u22B3",RightTriangleBar:"\u29D0",RightTriangleEqual:"\u22B5",RightUpDownVector:"\u294F",RightUpTeeVector:"\u295C",RightUpVector:"\u21BE",RightUpVectorBar:"\u2954",RightVector:"\u21C0",RightVectorBar:"\u2953",ring:"\u02DA",risingdotseq:"\u2253",rlarr:"\u21C4",rlhar:"\u21CC",rlm:"\u200F",rmoust:"\u23B1",rmoustache:"\u23B1",rnmid:"\u2AEE",roang:"\u27ED",roarr:"\u21FE",robrk:"\u27E7",ropar:"\u2986",Ropf:"\u211D",ropf:"\u{1D563}",roplus:"\u2A2E",rotimes:"\u2A35",RoundImplies:"\u2970",rpar:")",rpargt:"\u2994",rppolint:"\u2A12",rrarr:"\u21C9",Rrightarrow:"\u21DB",rsaquo:"\u203A",Rscr:"\u211B",rscr:"\u{1D4C7}",Rsh:"\u21B1",rsh:"\u21B1",rsqb:"]",rsquo:"\u2019",rsquor:"\u2019",rthree:"\u22CC",rtimes:"\u22CA",rtri:"\u25B9",rtrie:"\u22B5",rtrif:"\u25B8",rtriltri:"\u29CE",RuleDelayed:"\u29F4",ruluhar:"\u2968",rx:"\u211E",Sacute:"\u015A",sacute:"\u015B",sbquo:"\u201A",Sc:"\u2ABC",sc:"\u227B",scap:"\u2AB8",Scaron:"\u0160",scaron:"\u0161",sccue:"\u227D",scE:"\u2AB4",sce:"\u2AB0",Scedil:"\u015E",scedil:"\u015F",Scirc:"\u015C",scirc:"\u015D",scnap:"\u2ABA",scnE:"\u2AB6",scnsim:"\u22E9",scpolint:"\u2A13",scsim:"\u227F",Scy:"\u0421",scy:"\u0441",sdot:"\u22C5",sdotb:"\u22A1",sdote:"\u2A66",searhk:"\u2925",seArr:"\u21D8",searr:"\u2198",searrow:"\u2198",sect:"\xA7",semi:";",seswar:"\u2929",setminus:"\u2216",setmn:"\u2216",sext:"\u2736",Sfr:"\u{1D516}",sfr:"\u{1D530}",sfrown:"\u2322",sharp:"\u266F",SHCHcy:"\u0429",shchcy:"\u0449",SHcy:"\u0428",shcy:"\u0448",ShortDownArrow:"\u2193",ShortLeftArrow:"\u2190",shortmid:"\u2223",shortparallel:"\u2225",ShortRightArrow:"\u2192",ShortUpArrow:"\u2191",shy:"\xAD",Sigma:"\u03A3",sigma:"\u03C3",sigmaf:"\u03C2",sigmav:"\u03C2",sim:"\u223C",simdot:"\u2A6A",sime:"\u2243",simeq:"\u2243",simg:"\u2A9E",simgE:"\u2AA0",siml:"\u2A9D",simlE:"\u2A9F",simne:"\u2246",simplus:"\u2A24",simrarr:"\u2972",slarr:"\u2190",SmallCircle:"\u2218",smallsetminus:"\u2216",smashp:"\u2A33",smeparsl:"\u29E4",smid:"\u2223",smile:"\u2323",smt:"\u2AAA",smte:"\u2AAC",smtes:"\u2AAC\uFE00",SOFTcy:"\u042C",softcy:"\u044C",sol:"/",solb:"\u29C4",solbar:"\u233F",Sopf:"\u{1D54A}",sopf:"\u{1D564}",spades:"\u2660",spadesuit:"\u2660",spar:"\u2225",sqcap:"\u2293",sqcaps:"\u2293\uFE00",sqcup:"\u2294",sqcups:"\u2294\uFE00",Sqrt:"\u221A",sqsub:"\u228F",sqsube:"\u2291",sqsubset:"\u228F",sqsubseteq:"\u2291",sqsup:"\u2290",sqsupe:"\u2292",sqsupset:"\u2290",sqsupseteq:"\u2292",squ:"\u25A1",Square:"\u25A1",square:"\u25A1",SquareIntersection:"\u2293",SquareSubset:"\u228F",SquareSubsetEqual:"\u2291",SquareSuperset:"\u2290",SquareSupersetEqual:"\u2292",SquareUnion:"\u2294",squarf:"\u25AA",squf:"\u25AA",srarr:"\u2192",Sscr:"\u{1D4AE}",sscr:"\u{1D4C8}",ssetmn:"\u2216",ssmile:"\u2323",sstarf:"\u22C6",Star:"\u22C6",star:"\u2606",starf:"\u2605",straightepsilon:"\u03F5",straightphi:"\u03D5",strns:"\xAF",Sub:"\u22D0",sub:"\u2282",subdot:"\u2ABD",subE:"\u2AC5",sube:"\u2286",subedot:"\u2AC3",submult:"\u2AC1",subnE:"\u2ACB",subne:"\u228A",subplus:"\u2ABF",subrarr:"\u2979",Subset:"\u22D0",subset:"\u2282",subseteq:"\u2286",subseteqq:"\u2AC5",SubsetEqual:"\u2286",subsetneq:"\u228A",subsetneqq:"\u2ACB",subsim:"\u2AC7",subsub:"\u2AD5",subsup:"\u2AD3",succ:"\u227B",succapprox:"\u2AB8",succcurlyeq:"\u227D",Succeeds:"\u227B",SucceedsEqual:"\u2AB0",SucceedsSlantEqual:"\u227D",SucceedsTilde:"\u227F",succeq:"\u2AB0",succnapprox:"\u2ABA",succneqq:"\u2AB6",succnsim:"\u22E9",succsim:"\u227F",SuchThat:"\u220B",Sum:"\u2211",sum:"\u2211",sung:"\u266A",Sup:"\u22D1",sup:"\u2283",sup1:"\xB9",sup2:"\xB2",sup3:"\xB3",supdot:"\u2ABE",supdsub:"\u2AD8",supE:"\u2AC6",supe:"\u2287",supedot:"\u2AC4",Superset:"\u2283",SupersetEqual:"\u2287",suphsol:"\u27C9",suphsub:"\u2AD7",suplarr:"\u297B",supmult:"\u2AC2",supnE:"\u2ACC",supne:"\u228B",supplus:"\u2AC0",Supset:"\u22D1",supset:"\u2283",supseteq:"\u2287",supseteqq:"\u2AC6",supsetneq:"\u228B",supsetneqq:"\u2ACC",supsim:"\u2AC8",supsub:"\u2AD4",supsup:"\u2AD6",swarhk:"\u2926",swArr:"\u21D9",swarr:"\u2199",swarrow:"\u2199",swnwar:"\u292A",szlig:"\xDF",Tab:" ",target:"\u2316",Tau:"\u03A4",tau:"\u03C4",tbrk:"\u23B4",Tcaron:"\u0164",tcaron:"\u0165",Tcedil:"\u0162",tcedil:"\u0163",Tcy:"\u0422",tcy:"\u0442",tdot:"\u20DB",telrec:"\u2315",Tfr:"\u{1D517}",tfr:"\u{1D531}",there4:"\u2234",Therefore:"\u2234",therefore:"\u2234",Theta:"\u0398",theta:"\u03B8",thetasym:"\u03D1",thetav:"\u03D1",thickapprox:"\u2248",thicksim:"\u223C",ThickSpace:"\u205F\u200A",thinsp:"\u2009",ThinSpace:"\u2009",thkap:"\u2248",thksim:"\u223C",THORN:"\xDE",thorn:"\xFE",Tilde:"\u223C",tilde:"\u02DC",TildeEqual:"\u2243",TildeFullEqual:"\u2245",TildeTilde:"\u2248",times:"\xD7",timesb:"\u22A0",timesbar:"\u2A31",timesd:"\u2A30",tint:"\u222D",toea:"\u2928",top:"\u22A4",topbot:"\u2336",topcir:"\u2AF1",Topf:"\u{1D54B}",topf:"\u{1D565}",topfork:"\u2ADA",tosa:"\u2929",tprime:"\u2034",TRADE:"\u2122",trade:"\u2122",triangle:"\u25B5",triangledown:"\u25BF",triangleleft:"\u25C3",trianglelefteq:"\u22B4",triangleq:"\u225C",triangleright:"\u25B9",trianglerighteq:"\u22B5",tridot:"\u25EC",trie:"\u225C",triminus:"\u2A3A",TripleDot:"\u20DB",triplus:"\u2A39",trisb:"\u29CD",tritime:"\u2A3B",trpezium:"\u23E2",Tscr:"\u{1D4AF}",tscr:"\u{1D4C9}",TScy:"\u0426",tscy:"\u0446",TSHcy:"\u040B",tshcy:"\u045B",Tstrok:"\u0166",tstrok:"\u0167",twixt:"\u226C",twoheadleftarrow:"\u219E",twoheadrightarrow:"\u21A0",Uacute:"\xDA",uacute:"\xFA",Uarr:"\u219F",uArr:"\u21D1",uarr:"\u2191",Uarrocir:"\u2949",Ubrcy:"\u040E",ubrcy:"\u045E",Ubreve:"\u016C",ubreve:"\u016D",Ucirc:"\xDB",ucirc:"\xFB",Ucy:"\u0423",ucy:"\u0443",udarr:"\u21C5",Udblac:"\u0170",udblac:"\u0171",udhar:"\u296E",ufisht:"\u297E",Ufr:"\u{1D518}",ufr:"\u{1D532}",Ugrave:"\xD9",ugrave:"\xF9",uHar:"\u2963",uharl:"\u21BF",uharr:"\u21BE",uhblk:"\u2580",ulcorn:"\u231C",ulcorner:"\u231C",ulcrop:"\u230F",ultri:"\u25F8",Umacr:"\u016A",umacr:"\u016B",uml:"\xA8",UnderBar:"_",UnderBrace:"\u23DF",UnderBracket:"\u23B5",UnderParenthesis:"\u23DD",Union:"\u22C3",UnionPlus:"\u228E",Uogon:"\u0172",uogon:"\u0173",Uopf:"\u{1D54C}",uopf:"\u{1D566}",UpArrow:"\u2191",Uparrow:"\u21D1",uparrow:"\u2191",UpArrowBar:"\u2912",UpArrowDownArrow:"\u21C5",UpDownArrow:"\u2195",Updownarrow:"\u21D5",updownarrow:"\u2195",UpEquilibrium:"\u296E",upharpoonleft:"\u21BF",upharpoonright:"\u21BE",uplus:"\u228E",UpperLeftArrow:"\u2196",UpperRightArrow:"\u2197",Upsi:"\u03D2",upsi:"\u03C5",upsih:"\u03D2",Upsilon:"\u03A5",upsilon:"\u03C5",UpTee:"\u22A5",UpTeeArrow:"\u21A5",upuparrows:"\u21C8",urcorn:"\u231D",urcorner:"\u231D",urcrop:"\u230E",Uring:"\u016E",uring:"\u016F",urtri:"\u25F9",Uscr:"\u{1D4B0}",uscr:"\u{1D4CA}",utdot:"\u22F0",Utilde:"\u0168",utilde:"\u0169",utri:"\u25B5",utrif:"\u25B4",uuarr:"\u21C8",Uuml:"\xDC",uuml:"\xFC",uwangle:"\u29A7",vangrt:"\u299C",varepsilon:"\u03F5",varkappa:"\u03F0",varnothing:"\u2205",varphi:"\u03D5",varpi:"\u03D6",varpropto:"\u221D",vArr:"\u21D5",varr:"\u2195",varrho:"\u03F1",varsigma:"\u03C2",varsubsetneq:"\u228A\uFE00",varsubsetneqq:"\u2ACB\uFE00",varsupsetneq:"\u228B\uFE00",varsupsetneqq:"\u2ACC\uFE00",vartheta:"\u03D1",vartriangleleft:"\u22B2",vartriangleright:"\u22B3",Vbar:"\u2AEB",vBar:"\u2AE8",vBarv:"\u2AE9",Vcy:"\u0412",vcy:"\u0432",VDash:"\u22AB",Vdash:"\u22A9",vDash:"\u22A8",vdash:"\u22A2",Vdashl:"\u2AE6",Vee:"\u22C1",vee:"\u2228",veebar:"\u22BB",veeeq:"\u225A",vellip:"\u22EE",Verbar:"\u2016",verbar:"|",Vert:"\u2016",vert:"|",VerticalBar:"\u2223",VerticalLine:"|",VerticalSeparator:"\u2758",VerticalTilde:"\u2240",VeryThinSpace:"\u200A",Vfr:"\u{1D519}",vfr:"\u{1D533}",vltri:"\u22B2",vnsub:"\u2282\u20D2",vnsup:"\u2283\u20D2",Vopf:"\u{1D54D}",vopf:"\u{1D567}",vprop:"\u221D",vrtri:"\u22B3",Vscr:"\u{1D4B1}",vscr:"\u{1D4CB}",vsubnE:"\u2ACB\uFE00",vsubne:"\u228A\uFE00",vsupnE:"\u2ACC\uFE00",vsupne:"\u228B\uFE00",Vvdash:"\u22AA",vzigzag:"\u299A",Wcirc:"\u0174",wcirc:"\u0175",wedbar:"\u2A5F",Wedge:"\u22C0",wedge:"\u2227",wedgeq:"\u2259",weierp:"\u2118",Wfr:"\u{1D51A}",wfr:"\u{1D534}",Wopf:"\u{1D54E}",wopf:"\u{1D568}",wp:"\u2118",wr:"\u2240",wreath:"\u2240",Wscr:"\u{1D4B2}",wscr:"\u{1D4CC}",xcap:"\u22C2",xcirc:"\u25EF",xcup:"\u22C3",xdtri:"\u25BD",Xfr:"\u{1D51B}",xfr:"\u{1D535}",xhArr:"\u27FA",xharr:"\u27F7",Xi:"\u039E",xi:"\u03BE",xlArr:"\u27F8",xlarr:"\u27F5",xmap:"\u27FC",xnis:"\u22FB",xodot:"\u2A00",Xopf:"\u{1D54F}",xopf:"\u{1D569}",xoplus:"\u2A01",xotime:"\u2A02",xrArr:"\u27F9",xrarr:"\u27F6",Xscr:"\u{1D4B3}",xscr:"\u{1D4CD}",xsqcup:"\u2A06",xuplus:"\u2A04",xutri:"\u25B3",xvee:"\u22C1",xwedge:"\u22C0",Yacute:"\xDD",yacute:"\xFD",YAcy:"\u042F",yacy:"\u044F",Ycirc:"\u0176",ycirc:"\u0177",Ycy:"\u042B",ycy:"\u044B",yen:"\xA5",Yfr:"\u{1D51C}",yfr:"\u{1D536}",YIcy:"\u0407",yicy:"\u0457",Yopf:"\u{1D550}",yopf:"\u{1D56A}",Yscr:"\u{1D4B4}",yscr:"\u{1D4CE}",YUcy:"\u042E",yucy:"\u044E",Yuml:"\u0178",yuml:"\xFF",Zacute:"\u0179",zacute:"\u017A",Zcaron:"\u017D",zcaron:"\u017E",Zcy:"\u0417",zcy:"\u0437",Zdot:"\u017B",zdot:"\u017C",zeetrf:"\u2128",ZeroWidthSpace:"\u200B",Zeta:"\u0396",zeta:"\u03B6",Zfr:"\u2128",zfr:"\u{1D537}",ZHcy:"\u0416",zhcy:"\u0436",zigrarr:"\u21DD",Zopf:"\u2124",zopf:"\u{1D56B}",Zscr:"\u{1D4B5}",zscr:"\u{1D4CF}",zwj:"\u200D",zwnj:"\u200C"}),u.entityMap=u.HTML_ENTITIES}),"./node_modules/@xmldom/xmldom/lib/index.js":(function(a,u,e){var t=e("./node_modules/@xmldom/xmldom/lib/dom.js");u.DOMImplementation=t.DOMImplementation,u.XMLSerializer=t.XMLSerializer,u.DOMParser=e("./node_modules/@xmldom/xmldom/lib/dom-parser.js").DOMParser}),"./node_modules/@xmldom/xmldom/lib/sax.js":(function(a,u,e){var t=e("./node_modules/@xmldom/xmldom/lib/conventions.js").NAMESPACE,r=/[A-Z_a-z\xC0-\xD6\xD8-\xF6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/,o=new RegExp("[\\-\\.0-9"+r.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]"),l=new RegExp("^"+r.source+o.source+"*(?::"+r.source+o.source+"*)?$"),d=0,b=1,y=2,S=3,x=4,k=5,F=6,P=7;function L(C,M){this.message=C,this.locator=M,Error.captureStackTrace&&Error.captureStackTrace(this,L)}L.prototype=new Error,L.prototype.name=L.name;function j(){}j.prototype={parse:function(C,M,D){var q=this.domBuilder;q.startDocument(),p(M,M={}),N(C,M,D,q,this.errorHandler),q.endDocument()}};function N(C,M,D,q,z){function G(K){if(K>65535){K-=65536;var T=55296+(K>>10),U=56320+(K&1023);return String.fromCharCode(T,U)}else return String.fromCharCode(K)}function Q(K){var T=K.slice(1,-1);return Object.hasOwnProperty.call(D,T)?D[T]:T.charAt(0)==="#"?G(parseInt(T.substr(1).replace("x","0x"))):(z.error("entity not found:"+K),K)}function $(K){if(K>te){var T=C.substring(te,K).replace(/?\w+;/g,Q);ne&&J(te),q.characters(T,0,K-te),te=K}}function J(K,T){for(;K>=ie&&(T=ge.exec(C));)oe=T.index,ie=oe+T[0].length,ne.lineNumber++;ne.columnNumber=K-oe+1}for(var oe=0,ie=0,ge=/.*(?:\r\n?|\n)|.*$/g,ne=q.locator,Y=[{currentNSMap:M}],ue={},te=0;;){try{var re=C.indexOf("<",te);if(re<0){if(!C.substr(te).match(/^\s*$/)){var de=q.doc,ae=de.createTextNode(C.substr(te));de.appendChild(ae),q.currentElement=ae}return}switch(re>te&&$(re),C.charAt(re+1)){case"/":var Pe=C.indexOf(">",re+3),le=C.substring(re+2,Pe).replace(/[ \t\n\r]+$/g,""),me=Y.pop();Pe<0?(le=C.substring(re+2).replace(/[\s<].*/,""),z.error("end tag name: "+le+" is not complete:"+me.tagName),Pe=re+1+le.length):le.match(/\s)&&(le=le.replace(/[\s<].*/,""),z.error("end tag name: "+le+" maybe not complete"),Pe=re+1+le.length);var fe=me.localNSMap,ke=me.tagName==le,Ce=ke||me.tagName&&me.tagName.toLowerCase()==le.toLowerCase();if(Ce){if(q.endElement(me.uri,me.localName,le),fe)for(var ye in fe)Object.prototype.hasOwnProperty.call(fe,ye)&&q.endPrefixMapping(ye);ke||z.fatalError("end tag name: "+le+" is not match the current start tagName:"+me.tagName)}else Y.push(me);Pe++;break;case"?":ne&&J(re),Pe=v(C,re,q);break;case"!":ne&&J(re),Pe=f(C,re,q,z);break;default:ne&&J(re);var Fe=new m,_e=Y[Y.length-1].currentNSMap,Pe=_(C,re,Fe,_e,Q,z),it=Fe.length;if(!Fe.closed&&I(C,Pe,Fe.tagName,ue)&&(Fe.closed=!0,D.nbsp||z.warning("unclosed xml attribute")),ne&&it){for(var Je=W(ne,{}),We=0;Wete?te=Pe:$(Math.max(re,te)+1)}}function W(C,M){return M.lineNumber=C.lineNumber,M.columnNumber=C.columnNumber,M}function _(C,M,D,q,z,G){function Q(Y,ue,te){D.attributeNames.hasOwnProperty(Y)&&G.fatalError("Attribute "+Y+" redefined"),D.addValue(Y,ue.replace(/[\t\n\r]/g," ").replace(/?\w+;/g,z),te)}for(var $,J,oe=++M,ie=d;;){var ge=C.charAt(oe);switch(ge){case"=":if(ie===b)$=C.slice(M,oe),ie=S;else if(ie===y)ie=S;else throw new Error("attribute equal must after attrName");break;case"'":case'"':if(ie===S||ie===b)if(ie===b&&(G.warning('attribute value must after "="'),$=C.slice(M,oe)),M=oe+1,oe=C.indexOf(ge,M),oe>0)J=C.slice(M,oe),Q($,J,M-1),ie=k;else throw new Error("attribute value no end '"+ge+"' match");else if(ie==x)J=C.slice(M,oe),Q($,J,M),G.warning('attribute "'+$+'" missed start quot('+ge+")!!"),M=oe+1,ie=k;else throw new Error('attribute value must after "="');break;case"/":switch(ie){case d:D.setTagName(C.slice(M,oe));case k:case F:case P:ie=P,D.closed=!0;case x:case b:break;case y:D.closed=!0;break;default:throw new Error("attribute invalid close char('/')")}break;case"":return G.error("unexpected end of input"),ie==d&&D.setTagName(C.slice(M,oe)),oe;case">":switch(ie){case d:D.setTagName(C.slice(M,oe));case k:case F:case P:break;case x:case b:J=C.slice(M,oe),J.slice(-1)==="/"&&(D.closed=!0,J=J.slice(0,-1));case y:ie===y&&(J=$),ie==x?(G.warning('attribute "'+J+'" missed quot(")!'),Q($,J,M)):((!t.isHTML(q[""])||!J.match(/^(?:disabled|checked|selected)$/i))&&G.warning('attribute "'+J+'" missed value!! "'+J+'" instead!!'),Q(J,J,M));break;case S:throw new Error("attribute value missed!!")}return oe;case"\x80":ge=" ";default:if(ge<=" ")switch(ie){case d:D.setTagName(C.slice(M,oe)),ie=F;break;case b:$=C.slice(M,oe),ie=y;break;case x:var J=C.slice(M,oe);G.warning('attribute "'+J+'" missed quot(")!!'),Q($,J,M);case k:ie=F;break}else switch(ie){case y:var ne=D.tagName;(!t.isHTML(q[""])||!$.match(/^(?:disabled|checked|selected)$/i))&&G.warning('attribute "'+$+'" missed value!! "'+$+'" instead2!!'),Q($,$,M),M=oe,ie=b;break;case k:G.warning('attribute space is required"'+$+'"!!');case F:ie=b,M=oe;break;case S:ie=x,M=oe;break;case P:throw new Error("elements closed character '/' and '>' must be connected to")}}oe++}}function B(C,M,D){for(var q=C.tagName,z=null,ge=C.length;ge--;){var G=C[ge],Q=G.qName,$=G.value,ne=Q.indexOf(":");if(ne>0)var J=G.prefix=Q.slice(0,ne),oe=Q.slice(ne+1),ie=J==="xmlns"&&oe;else oe=Q,J=null,ie=Q==="xmlns"&&"";G.localName=oe,ie!==!1&&(z==null&&(z={},p(D,D={})),D[ie]=z[ie]=$,G.uri=t.XMLNS,M.startPrefixMapping(ie,$))}for(var ge=C.length;ge--;){G=C[ge];var J=G.prefix;J&&(J==="xml"&&(G.uri=t.XML),J!=="xmlns"&&(G.uri=D[J||""]))}var ne=q.indexOf(":");ne>0?(J=C.prefix=q.slice(0,ne),oe=C.localName=q.slice(ne+1)):(J=null,oe=C.localName=q);var Y=C.uri=D[J||""];if(M.startElement(Y,oe,q,C),C.closed){if(M.endElement(Y,oe,q),z)for(J in z)Object.prototype.hasOwnProperty.call(z,J)&&M.endPrefixMapping(J)}else return C.currentNSMap=D,C.localNSMap=z,!0}function E(C,M,D,q,z){if(/^(?:script|textarea)$/i.test(D)){var G=C.indexOf(""+D+">",M),Q=C.substring(M+1,G);if(/[&<]/.test(Q))return/^script$/i.test(D)?(z.characters(Q,0,Q.length),G):(Q=Q.replace(/?\w+;/g,q),z.characters(Q,0,Q.length),G)}return M+1}function I(C,M,D,q){var z=q[D];return z==null&&(z=C.lastIndexOf(""+D+">"),z",M+4);return G>M?(D.comment(C,M+4,G-M-4),G+3):(q.error("Unclosed comment"),-1)}else return-1;default:if(C.substr(M+3,6)=="CDATA["){var G=C.indexOf("]]>",M+9);return D.startCDATA(),D.characters(C,M+9,G-M-9),D.endCDATA(),G+3}var Q=w(C,M),$=Q.length;if($>1&&/!doctype/i.test(Q[0][0])){var J=Q[1][0],oe=!1,ie=!1;$>3&&(/^public$/i.test(Q[2][0])?(oe=Q[3][0],ie=$>4&&Q[4][0]):/^system$/i.test(Q[2][0])&&(ie=Q[3][0]));var ge=Q[$-1];return D.startDTD(J,oe,ie),D.endDTD(),ge.index+ge[0].length}}return-1}function v(C,M,D){var q=C.indexOf("?>",M);if(q){var z=C.substring(M,q).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);if(z){var G=z[0].length;return D.processingInstruction(z[1],z[2]),q+2}else return-1}return-1}function m(){this.attributeNames={}}m.prototype={setTagName:function(C){if(!l.test(C))throw new Error("invalid tagName:"+C);this.tagName=C},addValue:function(C,M,D){if(!l.test(C))throw new Error("invalid attribute:"+C);this.attributeNames[C]=this.length,this[this.length++]={qName:C,value:M,offset:D}},length:0,getLocalName:function(C){return this[C].localName},getLocator:function(C){return this[C].locator},getQName:function(C){return this[C].qName},getURI:function(C){return this[C].uri},getValue:function(C){return this[C].value}};function w(C,M){var D,q=[],z=/'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;for(z.lastIndex=M,z.exec(C);D=z.exec(C);)if(q.push(D),D[1])return q}u.XMLReader=j,u.ParseError=L}),"./node_modules/process/browser.js":(function(a,u){var e=a.exports={},t,r;function o(){throw new Error("setTimeout has not been defined")}function l(){throw new Error("clearTimeout has not been defined")}(function(){try{typeof setTimeout=="function"?t=setTimeout:t=o}catch(N){t=o}try{typeof clearTimeout=="function"?r=clearTimeout:r=l}catch(N){r=l}})();function d(N){if(t===setTimeout)return setTimeout(N,0);if((t===o||!t)&&setTimeout)return t=setTimeout,setTimeout(N,0);try{return t(N,0)}catch(W){try{return t.call(null,N,0)}catch(_){return t.call(this,N,0)}}}function b(N){if(r===clearTimeout)return clearTimeout(N);if((r===l||!r)&&clearTimeout)return r=clearTimeout,clearTimeout(N);try{return r(N)}catch(W){try{return r.call(null,N)}catch(_){return r.call(this,N)}}}var y=[],S=!1,x,k=-1;function F(){!S||!x||(S=!1,x.length?y=x.concat(y):k=-1,y.length&&P())}function P(){if(!S){var N=d(F);S=!0;for(var W=y.length;W;){for(x=y,y=[];++k1)for(var _=1;_Q)return te(null,!1);if(re>1){var de=Math.max(ue[0].Size,ue[1].Size);if(de!==G)return te(null,!1)}var ae=function le(me){if(me=te.length){ne.emit("has_and_check_upload_id",Y);return}var le=te[ae];if(!d.isInArray(Y,le)){r.removeUploadId.call(D,le),de(ae+1);return}if(r.using[le]){de(ae+1);return}k.call(D,{Bucket:m,Region:w,Key:C,UploadId:le,tracker:p.tracker},function(me,fe){D._isRunningTask(v)&&(me?(r.removeUploadId.call(D,le),de(ae+1)):ne.emit("upload_id_available",{UploadId:le,PartList:fe.PartList}))})};re(0)}),ne.on("get_remote_upload_id_list",function(){x.call(D,{Bucket:m,Region:w,Key:C,tracker:p.tracker},function(Y,ue){if(D._isRunningTask(v)){if(Y)return ne.emit("error",Y);var te=d.filter(ue.UploadList,function(ae){return ae.Key===C&&(!M||ae.StorageClass.toUpperCase()===M.toUpperCase())}).reverse().map(function(ae){return ae.UploadId||ae.UploadID});if(te.length)ne.emit("seek_local_avail_upload_id",te);else{var re=r.getFileId(p.Body,p.ChunkSize,m,C),de;re&&(de=r.getUploadIdList.call(D,re))&&d.each(de,function(ae){r.removeUploadId.call(D,ae)}),ne.emit("no_available_upload_id")}}})}),ne.emit("get_remote_upload_id_list")}function x(p,f){var v=this,m=[],w={Bucket:p.Bucket,Region:p.Region,Prefix:p.Key,calledBySdk:p.calledBySdk||"sliceUploadFile",tracker:p.tracker},C=function M(){v.multipartList(w,function(D,q){if(D)return f(D);m.push.apply(m,q.Upload||[]),q.IsTruncated==="true"?(w.KeyMarker=q.NextKeyMarker,w.UploadIdMarker=q.NextUploadIdMarker,M()):f(null,{UploadList:m})})};C()}function k(p,f){var v=this,m=[],w={Bucket:p.Bucket,Region:p.Region,Key:p.Key,UploadId:p.UploadId,calledBySdk:"sliceUploadFile",tracker:p.tracker},C=function M(){v.multipartListPart(w,function(D,q){if(D)return f(D);m.push.apply(m,q.Part||[]),q.IsTruncated==="true"?(w.PartNumberMarker=q.NextPartNumberMarker,M()):f(null,{PartList:m})})};C()}function F(p,f){var v=this,m=p.TaskId,w=p.Bucket,C=p.Region,M=p.Key,D=p.UploadData,q=p.FileSize,z=p.SliceSize,G=Math.min(p.AsyncLimit||v.options.ChunkParallelLimit||1,256),Q=p.Body,$=Math.ceil(q/z),J=0,oe=p.ServerSideEncryption,ie=p.Headers,ge=d.filter(D.PartList,function(Y){return Y.Uploaded&&(J+=Y.PartNumber>=$&&q%z||z),!Y.Uploaded}),ne=p.onProgress;o.eachLimit(ge,G,function(Y,ue){if(v._isRunningTask(m)){var te=Y.PartNumber,re=Math.min(q,Y.PartNumber*z)-(Y.PartNumber-1)*z,de=0;P.call(v,{TaskId:m,Bucket:w,Region:C,Key:M,SliceSize:z,FileSize:q,PartNumber:te,ServerSideEncryption:oe,Body:Q,UploadData:D,Headers:ie,onProgress:function(le){J+=le.loaded-de,de=le.loaded,ne({loaded:J,total:q})},tracker:p.tracker},function(ae,le){v._isRunningTask(m)&&(!ae&&!le.ETag&&(ae='get ETag error, please add "ETag" to CORS ExposeHeader setting.( \u83B7\u53D6ETag\u5931\u8D25\uFF0C\u8BF7\u5728CORS ExposeHeader\u8BBE\u7F6E\u4E2D\u6DFB\u52A0ETag\uFF0C\u8BF7\u53C2\u8003\u6587\u6863\uFF1Ahttps://cloud.tencent.com/document/product/436/13318 )'),ae?J-=de:(J+=re-de,Y.ETag=le.ETag),ne({loaded:J,total:q}),ue(ae||null,le))})}},function(Y){if(v._isRunningTask(m)){if(Y)return f(Y);f(null,{UploadId:D.UploadId,SliceList:D.PartList})}})}function P(p,f){var v=this,m=p.TaskId,w=p.Bucket,C=p.Region,M=p.Key,D=p.FileSize,q=p.Body,z=p.PartNumber*1,G=p.SliceSize,Q=p.ServerSideEncryption,$=p.UploadData,J=p.Headers||{},oe=v.options.ChunkRetryTimes+1,ie=G*(z-1),ge=G,ne=ie+G;ne>D&&(ne=D,ge=ne-ie);var Y=["x-cos-traffic-limit","x-cos-mime-limit"],ue={};d.each(J,function(re,de){Y.indexOf(de)>-1&&(ue[de]=re)});var te=$.PartList[z-1];o.retry(oe,function(re){v._isRunningTask(m)&&d.fileSlice(q,ie,ne,!0,function(de){v.multipartUpload({TaskId:m,Bucket:w,Region:C,Key:M,ContentLength:ge,PartNumber:z,UploadId:$.UploadId,ServerSideEncryption:Q,Body:de,Headers:ue,onProgress:p.onProgress,calledBySdk:"sliceUploadFile",tracker:p.tracker},function(ae,le){if(v._isRunningTask(m))return ae?re(ae):(te.Uploaded=!0,re(null,le))})})},function(re,de){if(v._isRunningTask(m))return f(re,de)})}function L(p,f){var v=p.Bucket,m=p.Region,w=p.Key,C=p.UploadId,M=p.SliceList,D=this,q=this.options.ChunkRetryTimes+1,z=p.Headers,G=M.map(function(Q){return{PartNumber:Q.PartNumber,ETag:Q.ETag}});o.retry(q,function(Q){D.multipartComplete({Bucket:v,Region:m,Key:w,UploadId:C,Parts:G,Headers:z,calledBySdk:"sliceUploadFile",tracker:p.tracker},Q)},function(Q,$){f(Q,$)})}function j(p,f){var v=p.Bucket,m=p.Region,w=p.Key,C=p.UploadId,M=p.Level||"task",D=p.AsyncLimit,q=this,z=new l;if(z.on("error",function(G){return f(G)}),z.on("get_abort_array",function(G){N.call(q,{Bucket:v,Region:m,Key:w,Headers:p.Headers,AsyncLimit:D,AbortArray:G},f)}),M==="bucket")x.call(q,{Bucket:v,Region:m,calledBySdk:"abortUploadTask"},function(G,Q){if(G)return f(G);z.emit("get_abort_array",Q.UploadList||[])});else if(M==="file"){if(!w)return f(d.error(new Error("abort_upload_task_no_key")));x.call(q,{Bucket:v,Region:m,Key:w,calledBySdk:"abortUploadTask"},function(G,Q){if(G)return f(G);z.emit("get_abort_array",Q.UploadList||[])})}else if(M==="task"){if(!C)return f(d.error(new Error("abort_upload_task_no_id")));if(!w)return f(d.error(new Error("abort_upload_task_no_key")));z.emit("get_abort_array",[{Key:w,UploadId:C}])}else return f(d.error(new Error("abort_unknown_level")))}function N(p,f){var v=p.Bucket,m=p.Region,w=p.Key,C=p.AbortArray,M=p.AsyncLimit||1,D=this,q=0,z=new Array(C.length);o.eachLimit(C,M,function(G,Q){var $=q;if(w&&w!==G.Key){z[$]={error:{KeyNotMatch:!0}},Q(null);return}var J=G.UploadId||G.UploadID;D.multipartAbort({Bucket:v,Region:m,Key:G.Key,Headers:p.Headers,UploadId:J},function(oe){var ie={Bucket:v,Region:m,Key:G.Key,UploadId:J};z[$]={error:oe,task:ie},Q(null)}),q++},function(G){if(G)return f(G);for(var Q=[],$=[],J=0,oe=z.length;Jm?"sliceUploadFile":"putObject";p.tracker=new b({Beacon:v.options.BeaconReporter,clsReporter:v.options.ClsReporter,bucket:p.Bucket,region:p.Region,apiName:"uploadFile",realApi:z,fileKey:p.Key,fileSize:M,accelerate:q,deepTracker:v.options.DeepTracker,customId:v.options.CustomId,delay:v.options.TrackerDelay})}d.each(p,function(ie,ge){t(ie)!=="object"&&typeof ie!="function"&&(D[ge]=ie)});var G=p.onTaskReady,Q=function(ge){D.TaskId=ge,G&&G(ge)};p.onTaskReady=Q;var $=M>m?"sliceUploadFile":"putObject",J=p.onFileFinish,oe=function(ge,ne){p.tracker&&p.tracker.report(ge,ne),J&&J(ge,ne,D),f&&f(ge,ne)};w.push({api:$,params:p,callback:oe}),v._addTasks(w)}function _(p,f){var v=this,m=p.SliceSize===void 0?v.options.SliceSize:p.SliceSize,w=0,C=0,M=d.throttleOnProgress.call(v,C,p.onProgress),D=p.files.length,q=p.onFileFinish,z=Array(D),G=function(J,oe,ie){M(null,!0),q&&q(J,oe,ie),z[ie.Index]={options:ie,error:J,data:oe},--D<=0&&f&&f(null,{files:z})},Q=[];d.each(p.files,function($,J){(function(){var oe=$.Body,ie=oe.size||oe.length||0,ge={Index:J,TaskId:""};if(!v.options.UseRawKey&&$.Key&&$.Key.substr(0,1)==="/"&&($.Key=$.Key.substr(1)),w+=ie,v.options.EnableReporter){var ne=v.options.UseAccelerate||typeof v.options.Domain=="string"&&v.options.Domain.includes("accelerate."),Y=ie>m?"sliceUploadFile":"putObject";$.tracker=new b({Beacon:v.options.BeaconReporter,clsReporter:v.options.ClsReporter,bucket:$.Bucket,region:$.Region,apiName:"uploadFiles",realApi:Y,fileKey:$.Key,fileSize:ie,accelerate:ne,deepTracker:v.options.DeepTracker,customId:v.options.CustomId,delay:v.options.TrackerDelay})}d.each($,function(ke,Ce){t(ke)!=="object"&&typeof ke!="function"&&(ge[Ce]=ke)});var ue=$.onTaskReady,te=function(Ce){ge.TaskId=Ce,ue&&ue(Ce)};$.onTaskReady=te;var re=0,de=$.onProgress,ae=function(Ce){C=C-re+Ce.loaded,re=Ce.loaded,de&&de(Ce),M({loaded:C,total:w})};$.onProgress=ae;var le=ie>m?"sliceUploadFile":"putObject",me=$.onFileFinish,fe=function(Ce,ye){$.tracker&&$.tracker.report(Ce,ye),me&&me(Ce,ye),G&&G(Ce,ye,ge)};Q.push({api:le,params:$,callback:fe})})()}),v._addTasks(Q)}function B(p,f){var v=new l,m=this,w=p.Bucket,C=p.Region,M=p.Key,D=p.CopySource,q=d.getSourceParams.call(this,D);if(!q){f(d.error(new Error("CopySource format error")));return}var z=q.Bucket,G=q.Region,Q=decodeURIComponent(q.Key),$=p.CopySliceSize===void 0?m.options.CopySliceSize:p.CopySliceSize;$=Math.max(0,$);var J=p.CopyChunkSize||this.options.CopyChunkSize,oe=this.options.CopyChunkParallelLimit,ie=this.options.ChunkRetryTimes+1,ge=0,ne=0,Y,ue,te={},re={},de={};v.on("copy_slice_complete",function(ae){var le={};d.each(p.Headers,function(fe,ke){ke.toLowerCase().indexOf("x-cos-meta-")===0&&(le[ke]=fe)});var me=d.map(ae.PartList,function(fe){return{PartNumber:fe.PartNumber,ETag:fe.ETag}});o.retry(ie,function(fe){m.multipartComplete({Bucket:w,Region:C,Key:M,UploadId:ae.UploadId,Parts:me,tracker:p.tracker,calledBySdk:"sliceCopyFile"},fe)},function(fe,ke){if(r.removeUsing(ae.UploadId),fe)return ue(null,!0),f(fe);r.removeUploadId(ae.UploadId),ue({loaded:Y,total:Y},!0),f(null,ke)})}),v.on("get_copy_data_finish",function(ae){var le=r.getCopyFileId(D,te,J,w,M);le&&r.saveUploadId(le,ae.UploadId,m.options.UploadIdCacheLimit),r.setUsing(ae.UploadId);var me=d.filter(ae.PartList,function(fe){return fe.Uploaded&&(ne+=fe.PartNumber>=ge&&Y%J||J),!fe.Uploaded});o.eachLimit(me,oe,function(fe,ke){var Ce=fe.PartNumber,ye=fe.CopySourceRange,Fe=fe.end-fe.start;o.retry(ie,function(_e){E.call(m,{Bucket:w,Region:C,Key:M,CopySource:D,UploadId:ae.UploadId,PartNumber:Ce,CopySourceRange:ye,tracker:p.tracker,calledBySdk:"sliceCopyFile"},_e)},function(_e,Pe){if(_e)return ke(_e);ne+=Fe,ue({loaded:ne,total:Y}),fe.ETag=Pe.ETag,ke(_e||null,Pe)})},function(fe){if(fe)return r.removeUsing(ae.UploadId),ue(null,!0),f(fe);v.emit("copy_slice_complete",ae)})}),v.on("get_chunk_size_finish",function(){var ae=function(){m.multipartInit({Bucket:w,Region:C,Key:M,Headers:de,tracker:p.tracker,calledBySdk:"sliceCopyFile"},function(Ce,ye){if(Ce)return f(Ce);p.UploadId=ye.UploadId,v.emit("get_copy_data_finish",{UploadId:p.UploadId,PartList:p.PartList})})},le=r.getCopyFileId(D,te,J,w,M),me=r.getUploadIdList(le);if(!le||!me)return ae();var fe=function ke(Ce){if(Ce>=me.length)return ae();var ye=me[Ce];if(r.using[ye])return ke(Ce+1);k.call(m,{Bucket:w,Region:C,Key:M,UploadId:ye,tracker:p.tracker,calledBySdk:"sliceCopyFile"},function(Fe,_e){if(Fe)r.removeUploadId(ye),ke(Ce+1);else{if(r.using[ye])return ke(Ce+1);var Pe={},it=0;d.each(_e.PartList,function(Je){var We=parseInt(Je.Size),je=it+We-1;Pe[Je.PartNumber+"|"+it+"|"+je]=Je.ETag,it+=We}),d.each(p.PartList,function(Je){var We=Pe[Je.PartNumber+"|"+Je.start+"|"+Je.end];We&&(Je.ETag=We,Je.Uploaded=!0)}),v.emit("get_copy_data_finish",{UploadId:ye,PartList:p.PartList})}})};fe(0)}),v.on("get_file_size_finish",function(){if((function(){for(var le=[1,2,4,8,16,32,64,128,256,512,1024,2048,4096,5120],me=1024*1024,fe=0;feCe.length&&(re[ke]=fe)}),v.emit("get_file_size_finish")}})}function E(p,f){var v=p.TaskId,m=p.Bucket,w=p.Region,C=p.Key,M=p.CopySource,D=p.UploadId,q=p.PartNumber*1,z=p.CopySourceRange,G=this.options.ChunkRetryTimes+1,Q=this;o.retry(G,function($){Q.uploadPartCopy({TaskId:v,Bucket:m,Region:w,Key:C,CopySource:M,UploadId:D,PartNumber:q,CopySourceRange:z,tracker:p.tracker,calledBySdk:p.calledBySdk},function(J,oe){$(J||null,oe)})},function($,J){return f($,J)})}var I={sliceUploadFile:y,abortUploadTask:j,uploadFile:W,uploadFiles:_,sliceCopyFile:B};a.exports.init=function(p,f){f.transferToTaskMethod(I,"sliceUploadFile"),d.each(I,function(v,m){p.prototype[m]=d.apiWrapper(m,v)})}}),"./src/async.js":(function(a,u){var e=function(l,d,b,y){if(y=y||function(){},!l.length||d<=0)return y();var S=0,x=0,k=0;(function F(){if(S>=l.length)return y();for(;k=l.length?y():F())})})()},t=function(l,d,b){var y=function S(x){d(function(k,F){k&&x/gi,"<$1Rule>"),c=c.replace(/<(\/?)Tags>/gi,"<$1Tag>");var h=i.Headers;h["Content-Type"]="application/xml",h["Content-MD5"]=o.b64(o.md5(c)),se.call(this,{Action:"name/cos:PutBucketReplication",method:"PUT",Bucket:i.Bucket,Region:i.Region,body:c,action:"replication",headers:h,tracker:i.tracker},function(g,A){if(g&&g.statusCode===204)return s(null,{statusCode:g.statusCode});if(g)return s(g);s(null,{statusCode:A.statusCode,headers:A.headers})})}function M(i,s){se.call(this,{Action:"name/cos:GetBucketReplication",method:"GET",Bucket:i.Bucket,Region:i.Region,headers:i.Headers,action:"replication",tracker:i.tracker},function(n,c){if(n){if(n.statusCode===404&&n.error&&(n.error==="Not Found"||n.error.Code==="ReplicationConfigurationnotFoundError")){var h={ReplicationConfiguration:{Rules:[]},statusCode:n.statusCode};n.headers&&(h.headers=n.headers),s(null,h)}else s(n);return}!c.ReplicationConfiguration&&(c.ReplicationConfiguration={}),c.ReplicationConfiguration.Rule&&(c.ReplicationConfiguration.Rules=o.makeArray(c.ReplicationConfiguration.Rule),delete c.ReplicationConfiguration.Rule),s(n,c)})}function D(i,s){se.call(this,{Action:"name/cos:DeleteBucketReplication",method:"DELETE",Bucket:i.Bucket,Region:i.Region,headers:i.Headers,action:"replication",tracker:i.tracker},function(n,c){if(n&&n.statusCode===204)return s(null,{statusCode:n.statusCode});if(n)return s(n);s(null,{statusCode:c.statusCode,headers:c.headers})})}function q(i,s){if(!i.WebsiteConfiguration){s(o.error(new Error("missing param WebsiteConfiguration")));return}var n=o.clone(i.WebsiteConfiguration||{}),c=n.RoutingRules||n.RoutingRule||[];c=o.isArray(c)?c:[c],delete n.RoutingRule,delete n.RoutingRules,c.length&&(n.RoutingRules={RoutingRule:c});var h=o.json2xml({WebsiteConfiguration:n}),g=i.Headers;g["Content-Type"]="application/xml",g["Content-MD5"]=o.b64(o.md5(h)),se.call(this,{Action:"name/cos:PutBucketWebsite",method:"PUT",Bucket:i.Bucket,Region:i.Region,body:h,action:"website",headers:g,tracker:i.tracker},function(A,R){if(A&&A.statusCode===204)return s(null,{statusCode:A.statusCode});if(A)return s(A);s(null,{statusCode:R.statusCode,headers:R.headers})})}function z(i,s){se.call(this,{Action:"name/cos:GetBucketWebsite",method:"GET",Bucket:i.Bucket,Region:i.Region,Key:i.Key,headers:i.Headers,action:"website",tracker:i.tracker},function(n,c){if(n){if(n.statusCode===404&&n.error.Code==="NoSuchWebsiteConfiguration"){var h={WebsiteConfiguration:{},statusCode:n.statusCode};n.headers&&(h.headers=n.headers),s(null,h)}else s(n);return}var g=c.WebsiteConfiguration||{};if(g.RoutingRules){var A=o.clone(g.RoutingRules.RoutingRule||[]);A=o.makeArray(A),g.RoutingRules=A}s(null,{WebsiteConfiguration:g,statusCode:c.statusCode,headers:c.headers})})}function G(i,s){se.call(this,{Action:"name/cos:DeleteBucketWebsite",method:"DELETE",Bucket:i.Bucket,Region:i.Region,headers:i.Headers,action:"website",tracker:i.tracker},function(n,c){if(n&&n.statusCode===204)return s(null,{statusCode:n.statusCode});if(n)return s(n);s(null,{statusCode:c.statusCode,headers:c.headers})})}function Q(i,s){if(!i.RefererConfiguration){s(o.error(new Error("missing param RefererConfiguration")));return}var n=o.clone(i.RefererConfiguration||{}),c=n.DomainList||{},h=c.Domains||c.Domain||[];h=o.isArray(h)?h:[h],h.length&&(n.DomainList={Domain:h});var g=o.json2xml({RefererConfiguration:n}),A=i.Headers;A["Content-Type"]="application/xml",A["Content-MD5"]=o.b64(o.md5(g)),se.call(this,{Action:"name/cos:PutBucketReferer",method:"PUT",Bucket:i.Bucket,Region:i.Region,body:g,action:"referer",headers:A,tracker:i.tracker},function(R,V){if(R&&R.statusCode===204)return s(null,{statusCode:R.statusCode});if(R)return s(R);s(null,{statusCode:V.statusCode,headers:V.headers})})}function $(i,s){se.call(this,{Action:"name/cos:GetBucketReferer",method:"GET",Bucket:i.Bucket,Region:i.Region,Key:i.Key,headers:i.Headers,action:"referer",tracker:i.tracker},function(n,c){if(n){if(n.statusCode===404&&n.error.Code==="NoSuchRefererConfiguration"){var h={WebsiteConfiguration:{},statusCode:n.statusCode};n.headers&&(h.headers=n.headers),s(null,h)}else s(n);return}var g=c.RefererConfiguration||{};if(g.DomainList){var A=o.makeArray(g.DomainList.Domain||[]);g.DomainList={Domains:A}}s(null,{RefererConfiguration:g,statusCode:c.statusCode,headers:c.headers})})}function J(i,s){var n=i.DomainConfiguration||{},c=n.DomainRule||i.DomainRule||[];c=o.clone(c);var h=o.json2xml({DomainConfiguration:{DomainRule:c}}),g=i.Headers;g["Content-Type"]="application/xml",g["Content-MD5"]=o.b64(o.md5(h)),se.call(this,{Action:"name/cos:PutBucketDomain",method:"PUT",Bucket:i.Bucket,Region:i.Region,body:h,action:"domain",headers:g,tracker:i.tracker},function(A,R){if(A&&A.statusCode===204)return s(null,{statusCode:A.statusCode});if(A)return s(A);s(null,{statusCode:R.statusCode,headers:R.headers})})}function oe(i,s){se.call(this,{Action:"name/cos:GetBucketDomain",method:"GET",Bucket:i.Bucket,Region:i.Region,headers:i.Headers,action:"domain",tracker:i.tracker},function(n,c){if(n)return s(n);var h=[];try{h=c.DomainConfiguration.DomainRule||[]}catch(g){}h=o.clone(o.isArray(h)?h:[h]),s(null,{DomainRule:h,statusCode:c.statusCode,headers:c.headers})})}function ie(i,s){se.call(this,{Action:"name/cos:DeleteBucketDomain",method:"DELETE",Bucket:i.Bucket,Region:i.Region,headers:i.Headers,action:"domain",tracker:i.tracker},function(n,c){if(n&&n.statusCode===204)return s(null,{statusCode:n.statusCode});if(n)return s(n);s(null,{statusCode:c.statusCode,headers:c.headers})})}function ge(i,s){var n=i.OriginConfiguration||{},c=n.OriginRule||i.OriginRule||[];c=o.clone(c);var h=o.json2xml({OriginConfiguration:{OriginRule:c}}),g=i.Headers;g["Content-Type"]="application/xml",g["Content-MD5"]=o.b64(o.md5(h)),se.call(this,{Action:"name/cos:PutBucketOrigin",method:"PUT",Bucket:i.Bucket,Region:i.Region,body:h,action:"origin",headers:g,tracker:i.tracker},function(A,R){if(A&&A.statusCode===204)return s(null,{statusCode:A.statusCode});if(A)return s(A);s(null,{statusCode:R.statusCode,headers:R.headers})})}function ne(i,s){se.call(this,{Action:"name/cos:GetBucketOrigin",method:"GET",Bucket:i.Bucket,Region:i.Region,headers:i.Headers,action:"origin",tracker:i.tracker},function(n,c){if(n)return s(n);var h=[];try{h=c.OriginConfiguration.OriginRule||[]}catch(g){}h=o.clone(o.isArray(h)?h:[h]),s(null,{OriginRule:h,statusCode:c.statusCode,headers:c.headers})})}function Y(i,s){se.call(this,{Action:"name/cos:DeleteBucketOrigin",method:"DELETE",Bucket:i.Bucket,Region:i.Region,headers:i.Headers,action:"origin",tracker:i.tracker},function(n,c){if(n&&n.statusCode===204)return s(null,{statusCode:n.statusCode});if(n)return s(n);s(null,{statusCode:c.statusCode,headers:c.headers})})}function ue(i,s){var n=o.json2xml({BucketLoggingStatus:i.BucketLoggingStatus||""}),c=i.Headers;c["Content-Type"]="application/xml",c["Content-MD5"]=o.b64(o.md5(n)),se.call(this,{Action:"name/cos:PutBucketLogging",method:"PUT",Bucket:i.Bucket,Region:i.Region,body:n,action:"logging",headers:c,tracker:i.tracker},function(h,g){if(h&&h.statusCode===204)return s(null,{statusCode:h.statusCode});if(h)return s(h);s(null,{statusCode:g.statusCode,headers:g.headers})})}function te(i,s){se.call(this,{Action:"name/cos:GetBucketLogging",method:"GET",Bucket:i.Bucket,Region:i.Region,headers:i.Headers,action:"logging",tracker:i.tracker},function(n,c){if(n)return s(n);s(null,{BucketLoggingStatus:c.BucketLoggingStatus,statusCode:c.statusCode,headers:c.headers})})}function re(i,s,n){var c=o.clone(s.InventoryConfiguration);if(c.OptionalFields){var h=c.OptionalFields||[];c.OptionalFields={Field:h}}if(c.Destination&&c.Destination.COSBucketDestination&&c.Destination.COSBucketDestination.Encryption){var g=c.Destination.COSBucketDestination.Encryption;Object.keys(g).indexOf("SSECOS")>-1&&(g["SSE-COS"]=g.SSECOS,delete g.SSECOS)}var A=o.json2xml({InventoryConfiguration:c}),R=s.Headers;R["Content-Type"]="application/xml",R["Content-MD5"]=o.b64(o.md5(A));var V=i==="PUT"?"name/cos:PutBucketInventory":"name/cos:PostBucketInventory";se.call(this,{Action:V,method:i,Bucket:s.Bucket,Region:s.Region,body:A,action:"inventory",qs:{id:s.Id},headers:R,tracker:s.tracker},function(pe,ce){if(pe&&pe.statusCode===204)return n(null,{statusCode:pe.statusCode});if(pe)return n(pe);n(null,{statusCode:ce.statusCode,headers:ce.headers})})}function de(i,s){return re.call(this,"PUT",i,s)}function ae(i,s){return re.call(this,"POST",i,s)}function le(i,s){se.call(this,{Action:"name/cos:GetBucketInventory",method:"GET",Bucket:i.Bucket,Region:i.Region,headers:i.Headers,action:"inventory",qs:{id:i.Id},tracker:i.tracker},function(n,c){if(n)return s(n);var h=c.InventoryConfiguration;if(h&&h.OptionalFields&&h.OptionalFields.Field){var g=h.OptionalFields.Field;o.isArray(g)||(g=[g]),h.OptionalFields=g}if(h.Destination&&h.Destination.COSBucketDestination&&h.Destination.COSBucketDestination.Encryption){var A=h.Destination.COSBucketDestination.Encryption;Object.keys(A).indexOf("SSE-COS")>-1&&(A.SSECOS=A["SSE-COS"],delete A["SSE-COS"])}s(null,{InventoryConfiguration:h,statusCode:c.statusCode,headers:c.headers})})}function me(i,s){se.call(this,{Action:"name/cos:ListBucketInventory",method:"GET",Bucket:i.Bucket,Region:i.Region,headers:i.Headers,action:"inventory",qs:{"continuation-token":i.ContinuationToken},tracker:i.tracker},function(n,c){if(n)return s(n);var h=c.ListInventoryConfigurationResult,g=h.InventoryConfiguration||[];g=o.isArray(g)?g:[g],delete h.InventoryConfiguration,o.each(g,function(A){if(A&&A.OptionalFields&&A.OptionalFields.Field){var R=A.OptionalFields.Field;o.isArray(R)||(R=[R]),A.OptionalFields=R}if(A.Destination&&A.Destination.COSBucketDestination&&A.Destination.COSBucketDestination.Encryption){var V=A.Destination.COSBucketDestination.Encryption;Object.keys(V).indexOf("SSE-COS")>-1&&(V.SSECOS=V["SSE-COS"],delete V["SSE-COS"])}}),h.InventoryConfigurations=g,o.extend(h,{statusCode:c.statusCode,headers:c.headers}),s(null,h)})}function fe(i,s){se.call(this,{Action:"name/cos:DeleteBucketInventory",method:"DELETE",Bucket:i.Bucket,Region:i.Region,headers:i.Headers,action:"inventory",qs:{id:i.Id},tracker:i.tracker},function(n,c){if(n&&n.statusCode===204)return s(null,{statusCode:n.statusCode});if(n)return s(n);s(null,{statusCode:c.statusCode,headers:c.headers})})}function ke(i,s){if(!i.AccelerateConfiguration){s(o.error(new Error("missing param AccelerateConfiguration")));return}var n={AccelerateConfiguration:i.AccelerateConfiguration||{}},c=o.json2xml(n),h={};h["Content-Type"]="application/xml",h["Content-MD5"]=o.b64(o.md5(c)),se.call(this,{Action:"name/cos:PutBucketAccelerate",method:"PUT",Bucket:i.Bucket,Region:i.Region,body:c,action:"accelerate",headers:h,tracker:i.tracker},function(g,A){if(g)return s(g);s(null,{statusCode:A.statusCode,headers:A.headers})})}function Ce(i,s){se.call(this,{Action:"name/cos:GetBucketAccelerate",method:"GET",Bucket:i.Bucket,Region:i.Region,action:"accelerate",tracker:i.tracker},function(n,c){n||!c.AccelerateConfiguration&&(c.AccelerateConfiguration={}),s(n,c)})}function ye(i,s){var n=i.ServerSideEncryptionConfiguration||{},c=n.Rule||n.Rules||[],h=o.json2xml({ServerSideEncryptionConfiguration:{Rule:c}}),g=i.Headers;g["Content-Type"]="application/xml",g["Content-MD5"]=o.b64(o.md5(h)),se.call(this,{Action:"name/cos:PutBucketEncryption",method:"PUT",Bucket:i.Bucket,Region:i.Region,body:h,action:"encryption",headers:g,tracker:i.tracker},function(A,R){if(A&&A.statusCode===204)return s(null,{statusCode:A.statusCode});if(A)return s(A);s(null,{statusCode:R.statusCode,headers:R.headers})})}function Fe(i,s){se.call(this,{Action:"name/cos:GetBucketEncryption",method:"GET",Bucket:i.Bucket,Region:i.Region,headers:i.Headers,action:"encryption",tracker:i.tracker},function(n,c){if(n){if(n.statusCode===404&&n.code==="NoSuchEncryptionConfiguration"){var h={EncryptionConfiguration:{Rules:[]},statusCode:n.statusCode};n.headers&&(h.headers=n.headers),s(null,h)}else s(n);return}var g=o.makeArray(c.EncryptionConfiguration&&c.EncryptionConfiguration.Rule||[]);c.EncryptionConfiguration={Rules:g},s(n,c)})}function _e(i,s){se.call(this,{Action:"name/cos:DeleteBucketReplication",method:"DELETE",Bucket:i.Bucket,Region:i.Region,headers:i.Headers,action:"encryption",tracker:i.tracker},function(n,c){if(n&&n.statusCode===204)return s(null,{statusCode:n.statusCode});if(n)return s(n);s(null,{statusCode:c.statusCode,headers:c.headers})})}function Pe(i,s){se.call(this,{Action:"name/cos:HeadObject",method:"HEAD",Bucket:i.Bucket,Region:i.Region,Key:i.Key,VersionId:i.VersionId,headers:i.Headers,tracker:i.tracker},function(n,c){if(n){var h=n.statusCode;return i.Headers["If-Modified-Since"]&&h&&h===304?s(null,{NotModified:!0,statusCode:h}):s(n)}c.ETag=o.attr(c.headers,"etag",""),s(null,c)})}function it(i,s){var n={};n.prefix=i.Prefix||"",n.delimiter=i.Delimiter,n["key-marker"]=i.KeyMarker,n["version-id-marker"]=i.VersionIdMarker,n["max-keys"]=i.MaxKeys,n["encoding-type"]=i.EncodingType,se.call(this,{Action:"name/cos:GetBucketObjectVersions",ResourceKey:n.prefix,method:"GET",Bucket:i.Bucket,Region:i.Region,headers:i.Headers,qs:n,action:"versions",tracker:i.tracker},function(c,h){if(c)return s(c);var g=h.ListVersionsResult||{},A=g.DeleteMarker||[];A=o.isArray(A)?A:[A];var R=g.Version||[];R=o.isArray(R)?R:[R];var V=o.clone(g);delete V.DeleteMarker,delete V.Version,o.extend(V,{DeleteMarkers:A,Versions:R,statusCode:h.statusCode,headers:h.headers}),s(null,V)})}function Je(i,s){if(this.options.ObjectKeySimplifyCheck){var n=o.simplifyPath(i.Key);if(n==="/"){s(o.error(new Error("The Getobject Key is illegal")));return}}var c=i.Query||{},h=i.QueryString||"",g=o.throttleOnProgress.call(this,0,i.onProgress),A=i.tracker;A&&A.setParams({signStartTime:new Date().getTime()}),c["response-content-type"]=i.ResponseContentType,c["response-content-language"]=i.ResponseContentLanguage,c["response-expires"]=i.ResponseExpires,c["response-cache-control"]=i.ResponseCacheControl,c["response-content-disposition"]=i.ResponseContentDisposition,c["response-content-encoding"]=i.ResponseContentEncoding,se.call(this,{Action:"name/cos:GetObject",method:"GET",Bucket:i.Bucket,Region:i.Region,Key:i.Key,VersionId:i.VersionId,DataType:i.DataType,headers:i.Headers,qs:c,qsStr:h,rawBody:!0,onDownloadProgress:g,tracker:A},function(R,V){if(g(null,!0),R){var pe=R.statusCode;return i.Headers["If-Modified-Since"]&&pe&&pe===304?s(null,{NotModified:!0}):s(R)}s(null,{Body:V.body,ETag:o.attr(V.headers,"etag",""),statusCode:V.statusCode,headers:V.headers})})}function We(i,s){var n=this,c=i.ContentLength,h=o.throttleOnProgress.call(n,c,i.onProgress),g=i.Headers;!g["Cache-Control"]&&!g["cache-control"]&&(g["Cache-Control"]=""),!g["Content-Type"]&&!g["content-type"]&&(g["Content-Type"]=i.Body&&i.Body.type||"");var A=i.UploadAddMetaMd5||n.options.UploadAddMetaMd5||n.options.UploadCheckContentMd5,R=i.tracker;A&&R&&R.setParams({md5StartTime:new Date().getTime()}),o.getBodyMd5(A,i.Body,function(V){V&&(R&&R.setParams({md5EndTime:new Date().getTime()}),n.options.UploadCheckContentMd5&&(g["Content-MD5"]=o.b64(V)),(i.UploadAddMetaMd5||n.options.UploadAddMetaMd5)&&(g["x-cos-meta-md5"]=V)),i.ContentLength!==void 0&&(g["Content-Length"]=i.ContentLength),h(null,!0),se.call(n,{Action:"name/cos:PutObject",TaskId:i.TaskId,method:"PUT",Bucket:i.Bucket,Region:i.Region,Key:i.Key,headers:i.Headers,qs:i.Query,body:i.Body,onProgress:h,tracker:R},function(pe,ce){if(pe)return h(null,!0),s(pe);h({loaded:c,total:c},!0);var ve=nt({ForcePathStyle:n.options.ForcePathStyle,protocol:n.options.Protocol,domain:n.options.Domain,bucket:i.Bucket,region:n.options.UseAccelerate?"accelerate":i.Region,object:i.Key});ve=ve.substr(ve.indexOf("://")+3),ce.Location=ve,ce.ETag=o.attr(ce.headers,"etag",""),s(null,ce)})},i.onHashProgress)}function je(i,s){se.call(this,{Action:"name/cos:DeleteObject",method:"DELETE",Bucket:i.Bucket,Region:i.Region,Key:i.Key,headers:i.Headers,VersionId:i.VersionId,action:i.Recursive?"recursive":"",tracker:i.tracker},function(n,c){if(n){var h=n.statusCode;return h&&h===404?s(null,{BucketNotFound:!0,statusCode:h}):s(n)}s(null,{statusCode:c.statusCode,headers:c.headers})})}function K(i,s){var n={};i.VersionId&&(n.versionId=i.VersionId),se.call(this,{Action:"name/cos:GetObjectACL",method:"GET",Bucket:i.Bucket,Region:i.Region,Key:i.Key,headers:i.Headers,qs:n,action:"acl",tracker:i.tracker},function(c,h){if(c)return s(c);var g=h.AccessControlPolicy||{},A=g.Owner||{},R=g.AccessControlList&&g.AccessControlList.Grant||[];R=o.isArray(R)?R:[R];var V=vt(g);delete V.GrantWrite,h.headers&&h.headers["x-cos-acl"]&&(V.ACL=h.headers["x-cos-acl"]),V=o.extend(V,{Owner:A,Grants:R,statusCode:h.statusCode,headers:h.headers}),s(null,V)})}function T(i,s){var n=i.Headers,c="";if(i.AccessControlPolicy){var h=o.clone(i.AccessControlPolicy||{}),g=h.Grants||h.Grant;g=o.isArray(g)?g:[g],delete h.Grant,delete h.Grants,h.AccessControlList={Grant:g},c=o.json2xml({AccessControlPolicy:h}),n["Content-Type"]="application/xml",n["Content-MD5"]=o.b64(o.md5(c))}o.each(n,function(A,R){R.indexOf("x-cos-grant-")===0&&(n[R]=dt(n[R]))}),se.call(this,{Action:"name/cos:PutObjectACL",method:"PUT",Bucket:i.Bucket,Region:i.Region,Key:i.Key,action:"acl",headers:n,body:c,tracker:i.tracker},function(A,R){if(A)return s(A);s(null,{statusCode:R.statusCode,headers:R.headers})})}function U(i,s){var n=i.Headers;n.Origin=i.Origin,n["Access-Control-Request-Method"]=i.AccessControlRequestMethod,n["Access-Control-Request-Headers"]=i.AccessControlRequestHeaders,se.call(this,{Action:"name/cos:OptionsObject",method:"OPTIONS",Bucket:i.Bucket,Region:i.Region,Key:i.Key,headers:n,tracker:i.tracker},function(c,h){if(c)return c.statusCode&&c.statusCode===403?s(null,{OptionsForbidden:!0,statusCode:c.statusCode}):s(c);var g=h.headers||{};s(null,{AccessControlAllowOrigin:g["access-control-allow-origin"],AccessControlAllowMethods:g["access-control-allow-methods"],AccessControlAllowHeaders:g["access-control-allow-headers"],AccessControlExposeHeaders:g["access-control-expose-headers"],AccessControlMaxAge:g["access-control-max-age"],statusCode:h.statusCode,headers:h.headers})})}function O(i,s){var n=this,c=i.Headers;!c["Cache-Control"]&&!c["cache-control"]&&(c["Cache-Control"]="");var h=i.CopySource||"",g=o.getSourceParams.call(this,h);if(!g){s(o.error(new Error("CopySource format error")));return}var A=g.Bucket,R=g.Region,V=decodeURIComponent(g.Key);se.call(this,{Scope:[{action:"name/cos:GetObject",bucket:A,region:R,prefix:V},{action:"name/cos:PutObject",bucket:i.Bucket,region:i.Region,prefix:i.Key}],method:"PUT",Bucket:i.Bucket,Region:i.Region,Key:i.Key,VersionId:i.VersionId,headers:i.Headers,tracker:i.tracker},function(pe,ce){if(pe)return s(pe);var ve=o.clone(ce.CopyObjectResult||{}),Z=nt({ForcePathStyle:n.options.ForcePathStyle,protocol:n.options.Protocol,domain:n.options.Domain,bucket:i.Bucket,region:i.Region,object:i.Key,isLocation:!0});o.extend(ve,{Location:Z,statusCode:ce.statusCode,headers:ce.headers}),s(null,ve)})}function X(i,s){var n=i.CopySource||"",c=o.getSourceParams.call(this,n);if(!c){s(o.error(new Error("CopySource format error")));return}var h=c.Bucket,g=c.Region,A=decodeURIComponent(c.Key);se.call(this,{Scope:[{action:"name/cos:GetObject",bucket:h,region:g,prefix:A},{action:"name/cos:PutObject",bucket:i.Bucket,region:i.Region,prefix:i.Key}],method:"PUT",Bucket:i.Bucket,Region:i.Region,Key:i.Key,VersionId:i.VersionId,qs:{partNumber:i.PartNumber,uploadId:i.UploadId},headers:i.Headers,tracker:i.tracker},function(R,V){if(R)return s(R);var pe=o.clone(V.CopyPartResult||{});o.extend(pe,{statusCode:V.statusCode,headers:V.headers}),s(null,pe)})}function ee(i,s){var n=i.Objects||[],c=i.Quiet;n=o.isArray(n)?n:[n];var h=o.json2xml({Delete:{Object:n,Quiet:c||!1}}),g=i.Headers;g["Content-Type"]="application/xml",g["Content-MD5"]=o.b64(o.md5(h));var A=o.map(n,function(R){return{action:"name/cos:DeleteObject",bucket:i.Bucket,region:i.Region,prefix:R.Key}});se.call(this,{Scope:A,method:"POST",Bucket:i.Bucket,Region:i.Region,body:h,action:"delete",headers:g,tracker:i.tracker},function(R,V){if(R)return s(R);var pe=V.DeleteResult||{},ce=pe.Deleted||[],ve=pe.Error||[];ce=o.isArray(ce)?ce:[ce],ve=o.isArray(ve)?ve:[ve];var Z=o.clone(pe);o.extend(Z,{Error:ve,Deleted:ce,statusCode:V.statusCode,headers:V.headers}),s(null,Z)})}function he(i,s){var n=i.Headers;if(!i.RestoreRequest){s(o.error(new Error("missing param RestoreRequest")));return}var c=i.RestoreRequest||{},h=o.json2xml({RestoreRequest:c});n["Content-Type"]="application/xml",n["Content-MD5"]=o.b64(o.md5(h)),se.call(this,{Action:"name/cos:RestoreObject",method:"POST",Bucket:i.Bucket,Region:i.Region,Key:i.Key,VersionId:i.VersionId,body:h,action:"restore",headers:n,tracker:i.tracker},s)}function we(i,s){var n=i.Tagging||{},c=n.TagSet||n.Tags||i.Tags||[];c=o.clone(o.isArray(c)?c:[c]);var h=o.json2xml({Tagging:{TagSet:{Tag:c}}}),g=i.Headers;g["Content-Type"]="application/xml",g["Content-MD5"]=o.b64(o.md5(h)),se.call(this,{Action:"name/cos:PutObjectTagging",method:"PUT",Bucket:i.Bucket,Key:i.Key,Region:i.Region,body:h,action:"tagging",headers:g,VersionId:i.VersionId,tracker:i.tracker},function(A,R){if(A&&A.statusCode===204)return s(null,{statusCode:A.statusCode});if(A)return s(A);s(null,{statusCode:R.statusCode,headers:R.headers})})}function De(i,s){se.call(this,{Action:"name/cos:GetObjectTagging",method:"GET",Key:i.Key,Bucket:i.Bucket,Region:i.Region,headers:i.Headers,action:"tagging",VersionId:i.VersionId,tracker:i.tracker},function(n,c){if(n){if(n.statusCode===404&&n.error&&(n.error==="Not Found"||n.error.Code==="NoSuchTagSet")){var h={Tags:[],statusCode:n.statusCode};n.headers&&(h.headers=n.headers),s(null,h)}else s(n);return}var g=[];try{g=c.Tagging.TagSet.Tag||[]}catch(A){}g=o.clone(o.isArray(g)?g:[g]),s(null,{Tags:g,statusCode:c.statusCode,headers:c.headers})})}function Ee(i,s){se.call(this,{Action:"name/cos:DeleteObjectTagging",method:"DELETE",Bucket:i.Bucket,Region:i.Region,Key:i.Key,headers:i.Headers,action:"tagging",VersionId:i.VersionId,tracker:i.tracker},function(n,c){if(n&&n.statusCode===204)return s(null,{statusCode:n.statusCode});if(n)return s(n);s(null,{statusCode:c.statusCode,headers:c.headers})})}function Re(i,s){var n=i.SelectType;if(!n)return s(o.error(new Error("missing param SelectType")));var c=i.SelectRequest||{},h=o.json2xml({SelectRequest:c}),g=i.Headers;g["Content-Type"]="application/xml",g["Content-MD5"]=o.b64(o.md5(h)),se.call(this,{Action:"name/cos:GetObject",method:"POST",Bucket:i.Bucket,Region:i.Region,Key:i.Key,headers:i.Headers,action:"select",qs:{"select-type":i.SelectType},VersionId:i.VersionId,body:h,DataType:"arraybuffer",rawBody:!0,tracker:i.tracker},function(A,R){if(A&&A.statusCode===204)return s(null,{statusCode:A.statusCode});if(A)return s(A);var V=o.parseSelectPayload(R.body);s(null,{statusCode:R.statusCode,headers:R.headers,Body:V.body,Payload:V.payload})})}function He(i,s){var n=this,c=i.Headers,h=i.tracker;!c["Cache-Control"]&&!c["cache-control"]&&(c["Cache-Control"]=""),!c["Content-Type"]&&!c["content-type"]&&(c["Content-Type"]=i.Body&&i.Body.type||"");var g=i.Body&&(i.UploadAddMetaMd5||n.options.UploadAddMetaMd5);g&&h&&h.setParams({md5StartTime:new Date().getTime()}),o.getBodyMd5(g,i.Body,function(A){A&&(i.Headers["x-cos-meta-md5"]=A),g&&h&&h.setParams({md5EndTime:new Date().getTime()}),se.call(n,{Action:"name/cos:InitiateMultipartUpload",method:"POST",Bucket:i.Bucket,Region:i.Region,Key:i.Key,action:"uploads",headers:i.Headers,qs:i.Query,tracker:h},function(R,V){if(R)return h&&h.parent&&h.parent.setParams({errorNode:"multipartInit"}),s(R);if(V=o.clone(V||{}),V&&V.InitiateMultipartUploadResult)return s(null,o.extend(V.InitiateMultipartUploadResult,{statusCode:V.statusCode,headers:V.headers}));s(null,V)})},i.onHashProgress)}function Be(i,s){var n=this;o.getFileSize("multipartUpload",i,function(){var c=i.tracker,h=n.options.UploadCheckContentMd5;h&&c&&c.setParams({md5StartTime:new Date().getTime()}),o.getBodyMd5(h,i.Body,function(g){g&&(i.Headers["Content-MD5"]=o.b64(g)),h&&c&&c.setParams({md5EndTime:new Date().getTime()}),c&&c.setParams({partNumber:i.PartNumber}),se.call(n,{Action:"name/cos:UploadPart",TaskId:i.TaskId,method:"PUT",Bucket:i.Bucket,Region:i.Region,Key:i.Key,qs:{partNumber:i.PartNumber,uploadId:i.UploadId},headers:i.Headers,onProgress:i.onProgress,body:i.Body||null,tracker:c},function(A,R){if(A)return c&&c.parent&&c.parent.setParams({errorNode:"multipartUpload"}),s(A);s(null,{ETag:o.attr(R.headers,"etag",""),statusCode:R.statusCode,headers:R.headers})})})})}function qe(i,s){for(var n=this,c=i.UploadId,h=i.Parts,g=i.tracker,A=0,R=h.length;A-1?ve(ce.Authorization):"sign="+encodeURIComponent(ce.Authorization)),ce.SecurityToken&&(Z+="&x-cos-security-token="+ce.SecurityToken),ce.ClientIP&&(Z+="&clientIP="+ce.ClientIP),ce.ClientUA&&(Z+="&clientUA="+ce.ClientUA),ce.Token&&(Z+="&token="+ce.Token),g&&(Z+="&"+g),setTimeout(function(){s(null,{Url:Z})})}});return V?(A+="?"+V.Authorization+(V.SecurityToken?"&x-cos-security-token="+V.SecurityToken:""),g&&(A+="&"+g)):g&&(A+="?"+g),A}function vt(i){var s={GrantFullControl:[],GrantWrite:[],GrantRead:[],GrantReadAcp:[],GrantWriteAcp:[],ACL:""},n={FULL_CONTROL:"GrantFullControl",WRITE:"GrantWrite",READ:"GrantRead",READ_ACP:"GrantReadAcp",WRITE_ACP:"GrantWriteAcp"},c=i&&i.AccessControlList||{},h=c.Grant;h&&(h=o.isArray(h)?h:[h]);var g={READ:0,WRITE:0,FULL_CONTROL:0};return h&&h.length&&o.each(h,function(A){A.Grantee.ID==="qcs::cam::anyone:anyone"||A.Grantee.URI==="http://cam.qcloud.com/groups/global/AllUsers"?g[A.Permission]=1:A.Grantee.ID!==i.Owner.ID&&s[n[A.Permission]].push('id="'+A.Grantee.ID+'"')}),g.FULL_CONTROL||g.WRITE&&g.READ?s.ACL="public-read-write":g.READ?s.ACL="public-read":s.ACL="private",o.each(n,function(A){s[A]=dt(s[A].join(","))}),s}function dt(i){var s=i.split(","),n={},c,h;for(c=0;c-1?g="{Region}.myqcloud.com":g="cos.{Region}.myqcloud.com",i.ForcePathStyle||(g="{Bucket}."+g)),g=g.replace(/\{\{AppId\}\}/gi,h).replace(/\{\{Bucket\}\}/gi,c).replace(/\{\{Region\}\}/gi,s).replace(/\{\{.*?\}\}/gi,""),g=g.replace(/\{AppId\}/gi,h).replace(/\{BucketName\}/gi,c).replace(/\{Bucket\}/gi,n).replace(/\{Region\}/gi,s).replace(/\{.*?\}/gi,""),/^[a-zA-Z]+:\/\//.test(g)||(g=R+"//"+g),g.slice(-1)==="/"&&(g=g.slice(0,-1));var V=g;return i.ForcePathStyle&&(V+="/"+n),V+="/",A&&(V+=o.camSafeUrlEncode(A).replace(/%2F/g,"/")),i.isLocation&&(V=V.replace(/^https?:\/\//,"")),V}var At=function(s){if(!s.Bucket||!s.Region)return"";var n=s.UseAccelerate===void 0?this.options.UseAccelerate:s.UseAccelerate,c=s.Url||nt({ForcePathStyle:this.options.ForcePathStyle,protocol:this.options.Protocol,domain:this.options.Domain,bucket:s.Bucket,region:n?"accelerate":s.Region}),h=c.replace(/^https?:\/\/([^/]+)(\/.*)?$/,"$1");return h};function Vt(i,s){var n=o.clone(i.Headers),c="";o.each(n,function(Te,Se){(Te===""||["content-type","cache-control","expires"].indexOf(Se.toLowerCase())>-1)&&delete n[Se],Se.toLowerCase()==="host"&&(c=Te)});var h=i.ForceSignHost!==!1;!c&&i.SignHost&&h&&(n.Host=i.SignHost);var g=!1,A=function(Se,Ae){g||(g=!0,Ae&&Ae.XCosSecurityToken&&!Ae.SecurityToken&&(Ae=o.clone(Ae),Ae.SecurityToken=Ae.XCosSecurityToken,delete Ae.XCosSecurityToken),s&&s(Se,Ae))},R=this,V=i.Bucket||"",pe=i.Region||"",ce=i.Key||"";R.options.ForcePathStyle&&V&&(ce=V+"/"+ce);var ve="/"+ce,Z={},be=i.Scope;if(!be){var Ve=i.Action||"",Ie=i.ResourceKey||i.Key||"";be=i.Scope||[{action:Ve,bucket:V,region:pe,prefix:Ie}]}var Ke=o.md5(JSON.stringify(be));R._StsCache=R._StsCache||[],(function(){var Te,Se;for(Te=R._StsCache.length-1;Te>=0;Te--){Se=R._StsCache[Te];var Ae=Math.round(o.getSkewTime(R.options.SystemClockOffset)/1e3)+30;if(Se.StartTime&&Ae=Se.ExpiredTime){R._StsCache.splice(Te,1);continue}if(!Se.ScopeLimit||Se.ScopeLimit&&Se.ScopeKey===Ke){Z=Se;break}}})();var Qe=function(){var Se="";Z.StartTime&&i.Expires?Se=Z.StartTime+";"+(Z.StartTime+i.Expires*1):Z.StartTime&&Z.ExpiredTime&&(Se=Z.StartTime+";"+Z.ExpiredTime);var Ae=o.getAuth({SecretId:Z.TmpSecretId,SecretKey:Z.TmpSecretKey,Method:i.Method,Pathname:ve,Query:i.Query,Headers:n,Expires:i.Expires,UseRawKey:R.options.UseRawKey,SystemClockOffset:R.options.SystemClockOffset,KeyTime:Se,ForceSignHost:h}),Me={Authorization:Ae,SecurityToken:Z.SecurityToken||Z.XCosSecurityToken||"",Token:Z.Token||"",ClientIP:Z.ClientIP||"",ClientUA:Z.ClientUA||"",SignFrom:"client"};A(null,Me)},Le=function(Se){if(Se.Authorization){var Ae=!1,Me=Se.Authorization;if(Me)if(Me.indexOf(" ")>-1)Ae=!1;else if(Me.indexOf("q-sign-algorithm=")>-1&&Me.indexOf("q-ak=")>-1&&Me.indexOf("q-sign-time=")>-1&&Me.indexOf("q-key-time=")>-1&&Me.indexOf("q-url-param-list=")>-1)Ae=!0;else try{Me=atob(Me),Me.indexOf("a=")>-1&&Me.indexOf("k=")>-1&&Me.indexOf("t=")>-1&&Me.indexOf("r=")>-1&&Me.indexOf("b=")>-1&&(Ae=!0)}catch(Ur){}if(!Ae)return o.error(new Error("getAuthorization callback params format error"))}else{if(!Se.TmpSecretId)return o.error(new Error('getAuthorization callback params missing "TmpSecretId"'));if(!Se.TmpSecretKey)return o.error(new Error('getAuthorization callback params missing "TmpSecretKey"'));if(!Se.SecurityToken&&!Se.XCosSecurityToken)return o.error(new Error('getAuthorization callback params missing "SecurityToken"'));if(!Se.ExpiredTime)return o.error(new Error('getAuthorization callback params missing "ExpiredTime"'));if(Se.ExpiredTime&&Se.ExpiredTime.toString().length!==10)return o.error(new Error('getAuthorization callback params "ExpiredTime" should be 10 digits'));if(Se.StartTime&&Se.StartTime.toString().length!==10)return o.error(new Error('getAuthorization callback params "StartTime" should be 10 StartTime'))}return!1};if(Z.ExpiredTime&&Z.ExpiredTime-o.getSkewTime(R.options.SystemClockOffset)/1e3>60)Qe();else if(R.options.getAuthorization)R.options.getAuthorization.call(R,{Bucket:V,Region:pe,Method:i.Method,Key:ce,Pathname:ve,Query:i.Query,Headers:n,Scope:be,SystemClockOffset:R.options.SystemClockOffset,ForceSignHost:h},function(Te){typeof Te=="string"&&(Te={Authorization:Te});var Se=Le(Te);if(Se)return A(Se);Te.Authorization?A(null,Te):(Z=Te||{},Z.Scope=be,Z.ScopeKey=Ke,R._StsCache.push(Z),Qe())});else if(R.options.getSTS)R.options.getSTS.call(R,{Bucket:V,Region:pe},function(Te){Z=Te||{},Z.Scope=be,Z.ScopeKey=Ke,Z.TmpSecretId||(Z.TmpSecretId=Z.SecretId),Z.TmpSecretKey||(Z.TmpSecretKey=Z.SecretKey);var Se=Le(Z);if(Se)return A(Se);R._StsCache.push(Z),Qe()});else return(function(){var Te="";R.options.StartTime&&i.Expires?Te=R.options.StartTime+";"+(R.options.StartTime+i.Expires*1):R.options.StartTime&&R.options.ExpiredTime&&(Te=R.options.StartTime+";"+R.options.ExpiredTime);var Se=o.getAuth({SecretId:i.SecretId||R.options.SecretId,SecretKey:i.SecretKey||R.options.SecretKey,Method:i.Method,Pathname:ve,Query:i.Query,Headers:n,Expires:i.Expires,KeyTime:Te,UseRawKey:R.options.UseRawKey,SystemClockOffset:R.options.SystemClockOffset,ForceSignHost:h}),Ae={Authorization:Se,SecurityToken:R.options.SecurityToken||R.options.XCosSecurityToken,SignFrom:"client"};return A(null,Ae),Ae})();return""}function ir(i){var s=this,n=!1,c=!1,h=!1,g=i.headers&&(i.headers.date||i.headers.Date)||i.error&&i.error.ServerTime;try{var A=i.error.Code,R=i.error.Message;(A==="RequestTimeTooSkewed"||A==="AccessDenied"&&R==="Request has expired")&&(c=!0)}catch(pe){}if(i)if(c&&g){var V=Date.parse(g);this.options.CorrectClockSkew&&Math.abs(o.getSkewTime(this.options.SystemClockOffset)-V)>=3e4&&(console.error("error: Local time is too skewed."),this.options.SystemClockOffset=V-Date.now(),n=!0)}else Math.floor(i.statusCode/100)===5?n=!0:i.message==="CORS blocked or network error"&&(h=!0,n=s.options.AutoSwitchHost);return{canRetry:n,networkError:h}}function Kt(i){var s=i.requestUrl,n=i.clientCalcSign,c=i.networkError;if(!this.options.AutoSwitchHost||!s||!n||!c)return!1;var h=/^https?:\/\/[^\/]*\.cos\.[^\/]*\.myqcloud\.com(\/.*)?$/,g=/^https?:\/\/[^\/]*\.cos\.accelerate\.myqcloud\.com(\/.*)?$/,A=h.test(s)&&!g.test(s);return A}function se(i,s){var n=this;!i.headers&&(i.headers={}),!i.qs&&(i.qs={}),i.VersionId&&(i.qs.versionId=i.VersionId),i.qs=o.clearKey(i.qs),i.headers&&(i.headers=o.clearKey(i.headers)),i.qs&&(i.qs=o.clearKey(i.qs));var c=o.clone(i.qs);i.action&&(c[i.action]="");var h=i.url||i.Url,g=i.SignHost||At.call(this,{Bucket:i.Bucket,Region:i.Region,Url:h}),A=i.tracker,R=function V(pe){var ce=n.options.SystemClockOffset;A&&A.setParams({signStartTime:new Date().getTime(),httpRetryTimes:pe-1}),i.SwitchHost&&(g=g.replace(/myqcloud.com/,"tencentcos.cn")),Vt.call(n,{Bucket:i.Bucket||"",Region:i.Region||"",Method:i.method,Key:i.Key,Query:c,Headers:i.headers,SignHost:g,Action:i.Action,ResourceKey:i.ResourceKey,Scope:i.Scope,ForceSignHost:n.options.ForceSignHost,SwitchHost:i.SwitchHost},function(ve,Z){if(ve){s(ve);return}A&&A.setParams({signEndTime:new Date().getTime(),httpStartTime:new Date().getTime()}),i.AuthData=Z,or.call(n,i,function(be,Ve){A&&A.setParams({httpEndTime:new Date().getTime()});var Ie=!1,Ke=!1;if(be){var Qe=ir.call(n,be);Ie=Qe.canRetry||ce!==n.options.SystemClockOffset,Ke=Qe.networkError}if(be&&pe<2&&Ie){i.headers&&(delete i.headers.Authorization,delete i.headers.token,delete i.headers.clientIP,delete i.headers.clientUA,i.headers["x-cos-security-token"]&&delete i.headers["x-cos-security-token"],i.headers["x-ci-security-token"]&&delete i.headers["x-ci-security-token"]);var Le=Kt.call(n,{requestUrl:(be==null?void 0:be.url)||"",clientCalcSign:Z.SignFrom==="client",networkError:Ke});i.SwitchHost=Le,V(pe+1)}else s(be,Ve)})})};R(1)}function or(i,s){var n=this,c=i.TaskId;if(!(c&&!n._isRunningTask(c))){var h=i.Bucket,g=i.Region,A=i.Key,R=i.method||"GET",V=i.Url||i.url,pe=i.body,ce=i.rawBody;n.options.UseAccelerate&&(g="accelerate"),V=V||nt({ForcePathStyle:n.options.ForcePathStyle,protocol:n.options.Protocol,domain:n.options.Domain,bucket:h,region:g,object:A}),i.SwitchHost&&(V=V.replace(/myqcloud.com/,"tencentcos.cn"));var ve=A?V:"";i.action&&(V=V+"?"+(o.isIOS_QQ?"".concat(i.action,"="):i.action)),i.qsStr&&(V.indexOf("?")>-1?V=V+"&"+i.qsStr:V=V+"?"+i.qsStr);var Z={method:R,url:V,headers:i.headers,qs:i.qs,body:pe},be="x-cos-security-token";if(o.isCIHost(V)&&(be="x-ci-security-token"),Z.headers.Authorization=i.AuthData.Authorization,i.AuthData.Token&&(Z.headers.token=i.AuthData.Token),i.AuthData.ClientIP&&(Z.headers.clientIP=i.AuthData.ClientIP),i.AuthData.ClientUA&&(Z.headers.clientUA=i.AuthData.ClientUA),i.AuthData.SecurityToken&&(Z.headers[be]=i.AuthData.SecurityToken),Z.headers&&(Z.headers=o.clearKey(Z.headers)),Z=o.clearKey(Z),i.onProgress&&typeof i.onProgress=="function"){var Ve=pe&&(pe.size||pe.length)||0;Z.onProgress=function(Ae){if(!(c&&!n._isRunningTask(c))){var Me=Ae?Ae.loaded:0;i.onProgress({loaded:Me,total:Ve})}}}i.onDownloadProgress&&(Z.onDownloadProgress=i.onDownloadProgress),i.DataType&&(Z.dataType=i.DataType),this.options.Timeout&&(Z.timeout=this.options.Timeout),n.options.ForcePathStyle&&(Z.pathStyle=n.options.ForcePathStyle),n.emit("before-send",Z);var Ie=Z.url.includes("accelerate."),Ke=Z.qs?Object.keys(Z.qs).map(function(Ae){return"".concat(Ae,"=").concat(Z.qs[Ae])}).join("&"):"",Qe=Ke?Z.url+"?"+Ke:Z.url;if(i.tracker){var Le;i.tracker.setParams({url:Qe,httpMethod:Z.method,accelerate:Ie,httpSize:((Le=Z.body)===null||Le===void 0?void 0:Le.size)||0}),i.tracker.parent&&!i.tracker.parent.params.url&&i.tracker.parent.setParams({url:ve,accelerate:Ie})}var Te=(n.options.Request||r)(Z,function(Ae){if(!(Ae&&Ae.error==="abort")){var Me={options:Z,error:Ae&&Ae.error,statusCode:Ae&&Ae.statusCode||0,statusMessage:Ae&&Ae.statusMessage||"",headers:Ae&&Ae.headers||{},body:Ae&&Ae.body};n.emit("after-receive",Me);var Ur=Me.error,ar=Me.body,bt={statusCode:Me.statusCode,statusMessage:Me.statusMessage,headers:Me.headers},Rn,kt=function(Dt,Ge){if(c&&n.off("inner-kill-task",Se),!Rn){Rn=!0;var Lt={};if(bt&&bt.statusCode&&(Lt.statusCode=bt.statusCode),bt&&bt.headers&&(Lt.headers=bt.headers),Dt)Z.url&&(Lt.url=Z.url),Z.method&&(Lt.method=Z.method),Dt=o.extend(Dt||{},Lt),s(Dt,null);else{if(i.Action==="name/cos:PutObject"){var _r={};for(var Fn in i.headers){var Vi=Fn.toLowerCase();_r[Vi]=i.headers[Fn]}_r["x-cos-callback"]?Ge.Error?(Ge.CallbackError=o.clone(Ge.Error),delete Ge.Error):Ge.CallbackBody=o.clone(Ge):_r["x-cos-return-body"]&&(Ge.Error?(Ge.ReturnError=o.clone(Ge.Error),delete Ge.Error):Ge.ReturnBody=o.clone(Ge))}Ge=o.extend(Ge||{},Lt),s(null,Ge)}Te=null}};if(Ur)return kt(o.error(Ur));var ur=bt.statusCode,Bn=Math.floor(ur/100)===2;if(ce){if(Bn)return kt(null,{body:ar});if(ar instanceof Blob){o.readAsBinaryString(ar,function(In){var Dt=o.parseResBody(In),Ge=Dt.Error||Dt;return kt(o.error(new Error(Ge.Message||"response body error"),{code:Ge.Code,error:Ge}))});return}}var Or=o.parseResBody(ar),cr=Or.Error||Or;Bn?kt(null,Or):cr?kt(o.error(new Error(cr.Message),{code:cr.Code,error:cr})):ur?kt(o.error(new Error(bt.statusMessage),{code:""+ur})):ur&&kt(o.error(new Error("statusCode error")))}}),Se=function Ae(Me){Me.TaskId===c&&(Te&&Te.abort&&Te.abort(),n.off("inner-kill-task",Ae))};c&&n.on("inner-kill-task",Se)}}var Ft={getService:l,putBucket:d,headBucket:b,getBucket:y,deleteBucket:S,putBucketAcl:x,getBucketAcl:k,putBucketCors:F,getBucketCors:P,deleteBucketCors:L,getBucketLocation:j,getBucketPolicy:W,putBucketPolicy:N,deleteBucketPolicy:_,putBucketTagging:B,getBucketTagging:E,deleteBucketTagging:I,putBucketLifecycle:p,getBucketLifecycle:f,deleteBucketLifecycle:v,putBucketVersioning:m,getBucketVersioning:w,putBucketReplication:C,getBucketReplication:M,deleteBucketReplication:D,putBucketWebsite:q,getBucketWebsite:z,deleteBucketWebsite:G,putBucketReferer:Q,getBucketReferer:$,putBucketDomain:J,getBucketDomain:oe,deleteBucketDomain:ie,putBucketOrigin:ge,getBucketOrigin:ne,deleteBucketOrigin:Y,putBucketLogging:ue,getBucketLogging:te,putBucketInventory:de,postBucketInventory:ae,getBucketInventory:le,listBucketInventory:me,deleteBucketInventory:fe,putBucketAccelerate:ke,getBucketAccelerate:Ce,putBucketEncryption:ye,getBucketEncryption:Fe,deleteBucketEncryption:_e,getObject:Je,headObject:Pe,listObjectVersions:it,putObject:We,deleteObject:je,getObjectAcl:K,putObjectAcl:T,optionsObject:U,putObjectCopy:O,deleteMultipleObject:ee,restoreObject:he,putObjectTagging:we,getObjectTagging:De,deleteObjectTagging:Ee,selectObjectContent:Re,appendObject:st,uploadPartCopy:X,multipartInit:He,multipartUpload:Be,multipartComplete:qe,multipartList:rt,multipartListPart:Ze,multipartAbort:xe,request:ot,getObjectUrl:It,getAuth:yt};function sr(i,s,n){o.each(["Cors","Acl"],function(c){if(i.slice(-c.length)===c){var h=i.slice(0,-c.length)+c.toUpperCase(),g=o.apiWrapper(i,s),A=!1;n[h]=function(){!A&&console.warn("warning: cos."+h+" has been deprecated. Please Use cos."+i+" instead."),A=!0,g.apply(this,arguments)}}})}a.exports.init=function(i,s){s.transferToTaskMethod(Ft,"putObject"),o.each(Ft,function(n,c){i.prototype[c]=o.apiWrapper(c,n),sr(c,n,i.prototype)})}}),"./src/cos.js":(function(a,u,e){"use strict";var t=e("./src/util.js"),r=e("./src/event.js"),o=e("./src/task.js"),l=e("./src/base.js"),d=e("./src/advance.js"),b=e("./package.json"),y={AppId:"",SecretId:"",SecretKey:"",SecurityToken:"",StartTime:0,ExpiredTime:0,ChunkRetryTimes:2,FileParallelLimit:3,ChunkParallelLimit:3,ChunkSize:1024*1024,SliceSize:1024*1024,CopyChunkParallelLimit:20,CopyChunkSize:1024*1024*10,CopySliceSize:1024*1024*10,MaxPartNumber:1e4,ProgressInterval:1e3,Domain:"",ServiceDomain:"",Protocol:"",CompatibilityMode:!1,ForcePathStyle:!1,UseRawKey:!1,Timeout:0,CorrectClockSkew:!0,SystemClockOffset:0,UploadCheckContentMd5:!1,UploadQueueSize:1e4,UploadAddMetaMd5:!1,UploadIdCacheLimit:50,UseAccelerate:!1,ForceSignHost:!0,AutoSwitchHost:!0,CopySourceParser:null,ObjectKeySimplifyCheck:!0,DeepTracker:!1,TrackerDelay:5e3,CustomId:"",BeaconReporter:null,ClsReporter:null},S=function(k){if(this.options=t.extend(t.clone(y),k||{}),this.options.FileParallelLimit=Math.max(1,this.options.FileParallelLimit),this.options.ChunkParallelLimit=Math.max(1,this.options.ChunkParallelLimit),this.options.ChunkRetryTimes=Math.max(0,this.options.ChunkRetryTimes),this.options.ChunkSize=Math.max(1024*1024,this.options.ChunkSize),this.options.CopyChunkParallelLimit=Math.max(1,this.options.CopyChunkParallelLimit),this.options.CopyChunkSize=Math.max(1024*1024,this.options.CopyChunkSize),this.options.CopySliceSize=Math.max(0,this.options.CopySliceSize),this.options.MaxPartNumber=Math.max(1024,Math.min(1e4,this.options.MaxPartNumber)),this.options.Timeout=Math.max(0,this.options.Timeout),this.options.EnableReporter=this.options.BeaconReporter||this.options.ClsReporter,this.options.AppId&&console.warn('warning: AppId has been deprecated, Please put it at the end of parameter Bucket(E.g: "test-1250000000").'),this.options.SecretId&&this.options.SecretId.indexOf(" ")>-1&&(console.error("error: SecretId\u683C\u5F0F\u9519\u8BEF\uFF0C\u8BF7\u68C0\u67E5"),console.error("error: SecretId format is incorrect. Please check")),this.options.SecretKey&&this.options.SecretKey.indexOf(" ")>-1&&(console.error("error: SecretKey\u683C\u5F0F\u9519\u8BEF\uFF0C\u8BF7\u68C0\u67E5"),console.error("error: SecretKey format is incorrect. Please check")),t.isNode()&&(console.log("Tip: Next.js\u3001Nuxt.js \u7B49\u670D\u52A1\u7AEF\u6E32\u67D3\u6280\u672F\u53EF\u6B63\u5E38\u4F7F\u7528JavaScript SDK\uFF0C\u8BF7\u5FFD\u7565\u4E0B\u65B9 nodejs \u73AF\u5883\u8B66\u544A"),console.warn("warning: cos-js-sdk-v5 \u4E0D\u652F\u6301 nodejs \u73AF\u5883\u4F7F\u7528\uFF0C\u8BF7\u6539\u7528 cos-nodejs-sdk-v5\uFF0C\u53C2\u8003\u6587\u6863\uFF1A https://cloud.tencent.com/document/product/436/8629"),console.warn("warning: cos-js-sdk-v5 does not support nodejs environment. Please use cos-nodejs-sdk-v5 instead. See: https://cloud.tencent.com/document/product/436/8629")),this.options.ForcePathStyle)throw console.warn("cos-js-sdk-v5\u4E0D\u518D\u652F\u6301\u4F7F\u7528path-style\uFF0C\u4EC5\u652F\u6301\u4F7F\u7528virtual-hosted-style\uFF0C\u53C2\u8003\u6587\u6863\uFF1Ahttps://cloud.tencent.com/document/product/436/96243"),new Error("ForcePathStyle is not supported");r.init(this),o.init(this)};l.init(S,o),d.init(S,o),S.util={md5:t.md5,xml2json:t.xml2json,json2xml:t.json2xml,encodeBase64:t.encodeBase64},S.getAuthorization=t.getAuth,S.version=b.version,a.exports=S}),"./src/event.js":(function(a,u){var e=function(o){var l={},d=function(y){return!l[y]&&(l[y]=[]),l[y]};o.on=function(b,y){b==="task-list-update"&&console.warn('warning: Event "'+b+'" has been deprecated. Please use "list-update" instead.'),d(b).push(y)},o.off=function(b,y){for(var S=d(b),x=S.length-1;x>=0;x--)y===S[x]&&S.splice(x,1)},o.emit=function(b,y){for(var S=d(b).map(function(k){return k}),x=0;x=0;j--){var N=l[j][2];(!N||N+o=0;N--){var W=l[N];W[0]===P&&W[1]===L&&l.splice(N,1)}l.unshift([P,L,Math.round(Date.now()/1e3)]),l.length>j&&l.splice(j),x()}},removeUploadId:function(P){S.call(this),delete k.using[P];for(var L=l.length-1;L>=0;L--)l[L][1]===P&&l.splice(L,1);x()}};a.exports=k}),"./src/task.js":(function(a,u,e){var t=e("./src/session.js"),r=e("./src/util.js"),o={},l=function(y,S){o[S]=y[S],y[S]=function(x,k){x.SkipTask?o[S].call(this,x,k):this._addTask(S,x,k)}},d=function(y){var S=[],x={},k=0,F=0,P=function(E){var I={id:E.id,Bucket:E.Bucket,Region:E.Region,Key:E.Key,FilePath:E.FilePath,state:E.state,loaded:E.loaded,size:E.size,speed:E.speed,percent:E.percent,hashPercent:E.hashPercent,error:E.error};return E.FilePath&&(I.FilePath=E.FilePath),E._custom&&(I._custom=E._custom),I},L=(function(){var B,E=function(){B=0,y.emit("task-list-update",{list:r.map(S,P)}),y.emit("list-update",{list:r.map(S,P)})};return function(){B||(B=setTimeout(E))}})(),j=function(){if(!(S.length<=y.options.UploadQueueSize)){for(var E=0;Ey.options.UploadQueueSize;){var I=S[E].state==="waiting"||S[E].state==="checking"||S[E].state==="uploading";!S[E]||!I?(x[S[E].id]&&delete x[S[E].id],S.splice(E,1),F--):E++}L()}},N=function B(){if(!(k>=y.options.FileParallelLimit)){for(;S[F]&&S[F].state!=="waiting";)F++;if(!(F>=S.length)){var E=S[F];F++,k++,E.state="checking",E.params.onTaskStart&&E.params.onTaskStart(P(E)),!E.params.UploadData&&(E.params.UploadData={});var I=r.formatParams(E.api,E.params);o[E.api].call(y,I,function(p,f){y._isRunningTask(E.id)&&((E.state==="checking"||E.state==="uploading")&&(E.state=p?"error":"success",p&&(E.error=p),k--,L(),B(),E.callback&&E.callback(p,f),E.state==="success"&&(E.params&&(delete E.params.UploadData,delete E.params.Body,delete E.params),delete E.callback)),j())}),L(),setTimeout(B)}}},W=function(E,I){var p=x[E];if(p){var f=p&&p.state==="waiting",v=p&&(p.state==="checking"||p.state==="uploading");if(I==="canceled"&&p.state!=="canceled"||I==="paused"&&f||I==="paused"&&v){p.state=I,y.emit("inner-kill-task",{TaskId:E,toState:I});try{var m=p&&p.params&&p.params.UploadData.UploadId}catch(w){}I==="canceled"&&m&&t.removeUsing(m),L(),v&&(k--,N()),I==="canceled"&&(p.params&&(delete p.params.UploadData,delete p.params.Body,delete p.params),delete p.callback)}j()}};y._addTasks=function(B){r.each(B,function(E){y._addTask(E.api,E.params,E.callback,!0)}),L()};var _=!0;y._addTask=function(B,E,I,p){E=r.formatParams(B,E);var f=r.uuid();E.TaskId=f,E.onTaskReady&&E.onTaskReady(f),E.TaskReady&&(E.TaskReady(f),_&&console.warn('warning: Param "TaskReady" has been deprecated. Please use "onTaskReady" instead.'),_=!1);var v={params:E,callback:I,api:B,index:S.length,id:f,Bucket:E.Bucket,Region:E.Region,Key:E.Key,FilePath:E.FilePath||"",state:"waiting",loaded:0,size:0,speed:0,percent:0,hashPercent:0,error:null,_custom:E._custom},m=E.onHashProgress;E.onHashProgress=function(C){y._isRunningTask(v.id)&&(v.hashPercent=C.percent,m&&m(C),L())};var w=E.onProgress;return E.onProgress=function(C){y._isRunningTask(v.id)&&(v.state==="checking"&&(v.state="uploading"),v.loaded=C.loaded,v.speed=C.speed,v.percent=C.percent,w&&w(C),L())},r.getFileSize(B,E,function(C,M){if(C)return I(r.error(C));x[f]=v,S.push(v),v.size=M,!p&&L(),N(),j()}),f},y._isRunningTask=function(B){var E=x[B];return!!(E&&(E.state==="checking"||E.state==="uploading"))},y.getTaskList=function(){return r.map(S,P)},y.cancelTask=function(B){W(B,"canceled")},y.pauseTask=function(B){W(B,"paused")},y.restartTask=function(B){var E=x[B];E&&(E.state==="paused"||E.state==="error")&&(E.state="waiting",L(),F=Math.min(F,E.index),N())},y.isUploadRunning=function(){return k||F=0||I.indexOf("wow32")>=0?"win32":I.indexOf("win64")>=0||I.indexOf("wow64")>=0?"win64":p?"mac":"unknown os"},isMobile:function(){var I=/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i;return!!((typeof navigator=="undefined"?"undefined":o(navigator))==="object"&&navigator.userAgent.match(I))},isAndroid:function(){var I=/(Android|Adr|Linux)/i;return!!((typeof navigator=="undefined"?"undefined":o(navigator))==="object"&&navigator.userAgent.match(I))},isIOS:function(){var I=/(iPhone|iPod|iPad|iOS)/i;return!!((typeof navigator=="undefined"?"undefined":o(navigator))==="object"&&navigator.userAgent.match(I))},isOtherMobile:function(){return x&&!isAndroid&&!isIOS},getUA:function(){if((typeof navigator=="undefined"?"undefined":o(navigator))!=="object")return"unknown device";var I=navigator.userAgent;return I}},x=S.isMobile(),k=S.isAndroid()?"android":S.isIOS?"ios":"other_mobile",F=S.getOsType(),P=x?k:F,L=S.getUA(),j=S.getProtocol(),N=function(I){return["putObject","sliceUploadFile","uploadFile","uploadFiles"].includes(I)?"UploadTask":I==="getObject"?"DownloadTask":["putObjectCopy","sliceCopyFile"].includes(I)?"CopyTask":I};function W(E){return E.replace(/([A-Z])/g,"_$1").toLowerCase()}function _(E){var I={},p=["sdkVersionName","sdkVersionCode","osName","networkType","requestName","requestResult","bucket","region","appid","accelerate","url","host","requestPath","userAgent","networkProtocol","httpMethod","httpSize","httpSpeed","httpTookTime","httpMd5","httpSign","httpFullTime","httpDomain","partNumber","httpRetryTimes","customId","traceId","realApi"],f=[].concat(p,["errorNode","errorCode","errorName","errorMessage","errorRequestId","errorHttpCode","errorServiceName","errorType","fullError"]),v=E.requestResult==="Success"?p:f;for(var m in E)if(v.includes(m)){var w=W(m);I[w]=E[m]}return I.request_name=E.realApi?N(E.realApi):E.requestName,I}var B=(function(){"use strict";function E(I){t(this,E);var p=I.parent,f=I.traceId,v=I.bucket,m=I.region,w=I.apiName,C=I.realApi,M=I.httpMethod,D=I.fileKey,q=I.fileSize,z=I.accelerate,G=I.customId,Q=I.delay,$=I.deepTracker,J=I.Beacon,oe=I.clsReporter,ie=v&&v.substr(v.lastIndexOf("-")+1)||"";this.parent=p,this.deepTracker=$,this.delay=Q,oe&&!this.clsReporter&&(this.clsReporter=oe),this.params={sdkVersionName:"cos-js-sdk-v5",sdkVersionCode:l.version,osName:P,networkType:"",requestName:w||"",requestResult:"",realApi:C,bucket:v,region:m,accelerate:z,httpMethod:M,url:"",host:"",httpDomain:"",requestPath:D||"",userAgent:L,networkProtocol:j,errorType:"",errorCode:"",errorName:"",errorMessage:"",errorRequestId:"",errorHttpCode:0,errorServiceName:"",errorNode:"",httpTookTime:0,httpSize:q||0,httpMd5:0,httpSign:0,httpFullTime:0,httpSpeed:0,md5StartTime:0,md5EndTime:0,signStartTime:0,signEndTime:0,httpStartTime:0,httpEndTime:0,startTime:new Date().getTime(),endTime:0,traceId:f||S.getUid(),appid:ie,partNumber:0,httpRetryTimes:0,customId:G||"",partTime:0},J&&(this.beacon=b(J,Q))}return r(E,[{key:"formatResult",value:function(p,f){var v,m,w,C,M,D,q=new Date().getTime(),z=S.getNetType(),G=p?(p==null?void 0:p.code)||(p==null||(v=p.error)===null||v===void 0?void 0:v.code)||(p==null||(m=p.error)===null||m===void 0?void 0:m.Code):"",Q=p?(p==null?void 0:p.message)||(p==null||(w=p.error)===null||w===void 0?void 0:w.message)||(p==null||(C=p.error)===null||C===void 0?void 0:C.Message):"",$=Q,J=p?(p==null?void 0:p.resource)||(p==null||(M=p.error)===null||M===void 0?void 0:M.resource)||(p==null||(D=p.error)===null||D===void 0?void 0:D.Resource):"",oe=p?p==null?void 0:p.statusCode:f.statusCode,ie=p?(p==null?void 0:p.headers)&&(p==null?void 0:p.headers["x-cos-request-id"]):(f==null?void 0:f.headers)&&(f==null?void 0:f.headers["x-cos-request-id"]),ge=p?ie?"Server":"Client":"";this.params.requestName==="getObject"&&(this.params.httpSize=f?f.headers&&f.headers["content-length"]:0);var ne=this.params.realApi==="sliceUploadFile",Y=this.params.realApi==="sliceCopyFile";if(ne||Y){var ue=this.params.httpSize/1024/this.params.partTime;Object.assign(this.params,{httpSpeed:ue<0?0:ue.toFixed(3)})}else{var te=q-this.params.startTime,re=this.params.httpEndTime-this.params.httpStartTime,de=this.params.httpSize/1024/(re/1e3),ae=this.params.md5EndTime-this.params.md5StartTime,le=this.params.signEndTime-this.params.signStartTime;this.parent&&(this.parent.addParamValue("httpTookTime",y(re)),this.parent.addParamValue("httpFullTime",y(te)),this.parent.addParamValue("httpMd5",y(ae)),this.parent.addParamValue("httpSign",y(le)),["multipartUpload","uploadPartCopy","putObjectCopy"].includes(this.params.requestName)&&this.parent.addParamValue("partTime",y(re))),Object.assign(this.params,{httpFullTime:y(te),httpMd5:y(ae),httpSign:y(le),httpTookTime:y(re),httpSpeed:de<0?0:de.toFixed(3)})}if(Object.assign(this.params,{networkType:z,requestResult:p?"Failure":"Success",errorType:ge,errorCode:G,errorHttpCode:oe,errorName:$,errorMessage:Q,errorServiceName:J,errorRequestId:ie}),p&&(!G||!Q)&&(this.params.fullError=p?JSON.stringify(p):""),this.params.url){try{var me=/^http(s)?:\/\/(.*?)\//.exec(this.params.url);this.params.host=me[2]}catch(fe){this.params.host=this.params.url}this.params.httpDomain=this.params.host}}},{key:"report",value:function(p,f){if(!(!this.beacon&&!this.clsReporter)){this.formatResult(p,f);var v=_(this.params);this.beacon&&this.sendEventsToBeacon(v),this.clsReporter&&this.sendEventsToCLS(v)}}},{key:"setParams",value:function(p){Object.assign(this.params,p)}},{key:"addParamValue",value:function(p,f){this.params[p]=(+this.params[p]+ +f).toFixed(3)}},{key:"sendEventsToBeacon",value:function(p){var f=this.params.requestName==="sliceUploadFile"||this.params.realApi==="sliceUploadFile";if(!(f&&!this.deepTracker)){var v="qcloud_track_cos_sdk";this.delay===0?this.beacon&&this.beacon.onDirectUserAction(v,p):this.beacon&&this.beacon.onUserAction(v,p)}}},{key:"sendEventsToCLS",value:function(p){var f=this.delay===0;this.clsReporter.log(p,f)}},{key:"generateSubTracker",value:function(p){return Object.assign(p,{parent:this,deepTracker:this.deepTracker,traceId:this.params.traceId,bucket:this.params.bucket,region:this.params.region,accelerate:this.params.accelerate,fileKey:this.params.requestPath,customId:this.params.customId,delay:this.delay,clsReporter:this.clsReporter}),new E(p)}}]),E})();a.exports=B}),"./src/util.js":(function(a,u,e){"use strict";(function(t){var r=e("./node_modules/@babel/runtime/helpers/typeof.js");function o(K,T){var U=typeof Symbol!="undefined"&&K[Symbol.iterator]||K["@@iterator"];if(!U){if(Array.isArray(K)||(U=l(K))||T&&K&&typeof K.length=="number"){U&&(K=U);var O=0,X=function(){};return{s:X,n:function(){return O>=K.length?{done:!0}:{done:!1,value:K[O++]}},e:function(Ee){throw Ee},f:X}}throw new TypeError(`Invalid attempt to iterate non-iterable instance.
+In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var ee=!0,he=!1,we;return{s:function(){U=U.call(K)},n:function(){var Ee=U.next();return ee=Ee.done,Ee},e:function(Ee){he=!0,we=Ee},f:function(){try{!ee&&U.return!=null&&U.return()}finally{if(he)throw we}}}}function l(K,T){if(K){if(typeof K=="string")return d(K,T);var U=Object.prototype.toString.call(K).slice(8,-1);if(U==="Object"&&K.constructor&&(U=K.constructor.name),U==="Map"||U==="Set")return Array.from(K);if(U==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(U))return d(K,T)}}function d(K,T){(T==null||T>K.length)&&(T=K.length);for(var U=0,O=new Array(T);Uee?1:-1})}var j=function(T,U){var O,X,ee,he=[],we=L(T);for(O=0;O-1||N.indexOf(X)>-1)&&(U[O]=T[O])}return U},_=function(T){T=T||{};var U=T.SecretId,O=T.SecretKey,X=T.KeyTime,ee=(T.method||T.Method||"get").toLowerCase(),he=z(T.Query||T.params||{}),we=W(z(T.Headers||T.headers||{})),De=T.Key||"",Ee;T.UseRawKey?Ee=T.Pathname||T.pathname||"/"+De:(Ee=T.Pathname||T.pathname||De,Ee.indexOf("/")!==0&&(Ee="/"+Ee));var Re=T.ForceSignHost!==!1;if(!we.Host&&!we.host&&T.Bucket&&T.Region&&Re&&(we.Host=T.Bucket+".cos."+T.Region+".myqcloud.com"),!U)throw new Error("missing param SecretId");if(!O)throw new Error("missing param SecretKey");var He=Math.round(me(T.SystemClockOffset)/1e3)-1,Be=He,qe=T.Expires||T.expires;qe===void 0?Be+=900:Be+=qe*1||0;var rt="sha1",Ze=U,xe=X||He+";"+Be,ot=X||He+";"+Be,st=L(we,!0).join(";").toLowerCase(),yt=L(he,!0).join(";").toLowerCase(),It=y.HmacSHA1(ot,O).toString(),vt=[ee,Ee,je.obj2str(he,!0),je.obj2str(we,!0),""].join(`
+`),dt=["sha1",xe,y.SHA1(vt).toString(),""].join(`
+`),nt=y.HmacSHA1(dt,It).toString(),At=["q-sign-algorithm="+rt,"q-ak="+Ze,"q-sign-time="+xe,"q-key-time="+ot,"q-header-list="+st,"q-url-param-list="+yt,"q-signature="+nt].join("&");return At},B=function(T,U,O){var X=U/8,ee=T.slice(O,O+X);return new Uint8Array(ee).reverse(),new{8:Uint8Array,16:Uint16Array,32:Uint32Array}[U](ee)[0]},E=function(T,U,O,X){var ee=T.slice(U,O),he="";return new Uint8Array(ee).forEach(function(we){he+=String.fromCharCode(we)}),X&&(he=decodeURIComponent(escape(he))),he},I=function(T){for(var U={},O=E(T),X={records:[]};T.byteLength;){var ee=B(T,32,0),he=B(T,32,4),we=ee-he-16,De=0,Ee;for(T=T.slice(12);DeparseInt(X[ee])?1:-1;return 0},T=function(O){if(!O)return!1;var X=(O.match(/Chrome\/([.\d]+)/)||[])[1],ee=(O.match(/QBCore\/([.\d]+)/)||[])[1],he=(O.match(/QQBrowser\/([.\d]+)/)||[])[1],we=X&&K(X,"53.0.2785.116")<0&&ee&&K(ee,"3.53.991.400")<0&&he&&K(he,"9.0.2524.400")<=0||!1;return we};return T(typeof navigator!="undefined"&&navigator.userAgent)})(),C=function(T,U,O,X,ee){var he;if(T.slice?he=T.slice(U,O):T.mozSlice?he=T.mozSlice(U,O):T.webkitSlice&&(he=T.webkitSlice(U,O)),X&&w){var we=new FileReader;we.onload=function(De){he=null,ee(new Blob([we.result]))},we.readAsArrayBuffer(he)}else ee(he)},M=function(T,U,O,X){O=O||f,T?typeof U=="string"?O(je.md5(U,!0)):Blob&&U instanceof Blob?je.getFileMd5(U,function(ee,he){O(he)},X):O():O()},D=1024*1024,q=function(T,U,O){var X=T.size,ee=0,he=b.getCtx(),we=function De(Ee){if(Ee>=X){var Re=he.digest("hex");U(null,Re);return}var He=Math.min(X,Ee+D);je.fileSlice(T,Ee,He,!1,function(Be){m(Be,function(qe){Be=null,he=he.update(qe,!0),ee+=qe.length,qe=null,O&&O({loaded:ee,total:X,percent:Math.round(ee/X*1e4)/1e4}),De(Ee+D)})})};we(0)};function z(K){return ge(K,function(T){return r(T)==="object"&&T!==null?z(T):T})}function G(K,T,U){return K&&T in K?K[T]:U}function Q(K,T){return ie(T,function(U,O){K[O]=T[O]}),K}function $(K){return K instanceof Array}function J(K,T){for(var U=!1,O=0;O-1,De=!he||typeof he=="string"&&he.indexOf("{Region}")>-1;if(T.indexOf("Bucket")>-1||T==="deleteMultipleObject"||T==="multipartList"||T==="listObjectVersions"){if(we&&!O)return"Bucket";if(De&&!X)return"Region"}else if(T.indexOf("Object")>-1||T.indexOf("multipart")>-1||T==="sliceUploadFile"||T==="abortUploadTask"||T==="uploadFile"){if(we&&!O)return"Bucket";if(De&&!X)return"Region";if(!ee)return"Key"}return!1},re=function(T,U){if(U=Q({},U),T!=="getAuth"&&T!=="getV4Auth"&&T!=="getObjectUrl"){var O=U.Headers||{};if(U&&r(U)==="object"){(function(){for(var ee in U)U.hasOwnProperty(ee)&&ee.indexOf("x-cos-")>-1&&(O[ee]=U[ee])})();var X={"x-cos-mfa":"MFA","Content-MD5":"ContentMD5","Content-Length":"ContentLength","Content-Type":"ContentType",Expect:"Expect",Expires:"Expires","Cache-Control":"CacheControl","Content-Disposition":"ContentDisposition","Content-Encoding":"ContentEncoding",Range:"Range","If-Modified-Since":"IfModifiedSince","If-Unmodified-Since":"IfUnmodifiedSince","If-Match":"IfMatch","If-None-Match":"IfNoneMatch","x-cos-copy-source":"CopySource","x-cos-copy-source-Range":"CopySourceRange","x-cos-metadata-directive":"MetadataDirective","x-cos-copy-source-If-Modified-Since":"CopySourceIfModifiedSince","x-cos-copy-source-If-Unmodified-Since":"CopySourceIfUnmodifiedSince","x-cos-copy-source-If-Match":"CopySourceIfMatch","x-cos-copy-source-If-None-Match":"CopySourceIfNoneMatch","x-cos-acl":"ACL","x-cos-grant-read":"GrantRead","x-cos-grant-write":"GrantWrite","x-cos-grant-full-control":"GrantFullControl","x-cos-grant-read-acp":"GrantReadAcp","x-cos-grant-write-acp":"GrantWriteAcp","x-cos-storage-class":"StorageClass","x-cos-traffic-limit":"TrafficLimit","x-cos-mime-limit":"MimeLimit","x-cos-server-side-encryption-customer-algorithm":"SSECustomerAlgorithm","x-cos-server-side-encryption-customer-key":"SSECustomerKey","x-cos-server-side-encryption-customer-key-MD5":"SSECustomerKeyMD5","x-cos-server-side-encryption":"ServerSideEncryption","x-cos-server-side-encryption-cos-kms-key-id":"SSEKMSKeyId","x-cos-server-side-encryption-context":"SSEContext","Pic-Operations":"PicOperations","x-cos-callback":"Callback","x-cos-callback-var":"CallbackVar","x-cos-return-body":"ReturnBody"};je.each(X,function(ee,he){U[ee]!==void 0&&(O[he]=U[ee])}),U.Headers=v(O)}}return U},de=function(T,U){return function(O,X){var ee=this;typeof O=="function"&&(X=O,O={}),O=re(T,O);var he;if(ee.options.EnableReporter)if(O.calledBySdk==="sliceUploadFile"||O.calledBySdk==="sliceCopyFile")he=O.tracker&&O.tracker.generateSubTracker({apiName:T});else if(["uploadFile","uploadFiles"].includes(T))he=null;else{var we=0;O.Body&&(we=typeof O.Body=="string"?O.Body.length:O.Body.size||O.Body.byteLength||0);var De=ee.options.UseAccelerate||typeof ee.options.Domain=="string"&&ee.options.Domain.includes("accelerate.");he=new F({Beacon:ee.options.BeaconReporter,clsReporter:ee.options.ClsReporter,bucket:O.Bucket,region:O.Region,apiName:T,realApi:T,accelerate:De,fileKey:O.Key,fileSize:we,deepTracker:ee.options.DeepTracker,customId:ee.options.CustomId,delay:ee.options.TrackerDelay})}O.tracker=he;var Ee=function(xe){return xe&&xe.headers&&(xe.headers["x-cos-request-id"]&&(xe.RequestId=xe.headers["x-cos-request-id"]),xe.headers["x-ci-request-id"]&&(xe.RequestId=xe.headers["x-ci-request-id"]),xe.headers["x-cos-version-id"]&&(xe.VersionId=xe.headers["x-cos-version-id"]),xe.headers["x-cos-delete-marker"]&&(xe.DeleteMarker=xe.headers["x-cos-delete-marker"])),xe},Re=function(xe,ot){he&&he.report(xe,ot),X&&X(Ee(xe),Ee(ot))},He=function(){if(T!=="getService"&&T!=="abortUploadTask"){var xe=te.call(ee,T,O);if(xe)return"missing param "+xe;if(O.Region){if(ee.options.CompatibilityMode){if(!/^([a-z\d-.]+)$/.test(O.Region))return"Region format error."}else{if(O.Region.indexOf("cos.")>-1)return'param Region should not be start with "cos."';if(!/^([a-z\d-]+)$/.test(O.Region))return"Region format error."}!ee.options.CompatibilityMode&&O.Region.indexOf("-")===-1&&O.Region!=="yfb"&&O.Region!=="default"&&O.Region!=="accelerate"&&console.warn("warning: param Region format error, find help here: https://cloud.tencent.com/document/product/436/6224")}if(O.Bucket){if(!/^([a-z\d-]+)-(\d+)$/.test(O.Bucket))if(O.AppId)O.Bucket=O.Bucket+"-"+O.AppId;else if(ee.options.AppId)O.Bucket=O.Bucket+"-"+ee.options.AppId;else return'Bucket should format as "test-1250000000".';O.AppId&&(console.warn('warning: AppId has been deprecated, Please put it at the end of parameter Bucket(E.g Bucket:"test-1250000000" ).'),delete O.AppId)}!ee.options.UseRawKey&&O.Key&&O.Key.substr(0,1)==="/"&&(O.Key=O.Key.substr(1))}},Be=He(),qe=["getAuth","getObjectUrl"].includes(T);if(typeof Promise=="function"&&!qe&&!X)return new Promise(function(Ze,xe){if(X=function(st,yt){st?xe(st):Ze(yt)},Be)return Re(je.error(new Error(Be)));U.call(ee,O,Re)});if(Be)return Re(je.error(new Error(Be)));var rt=U.call(ee,O,Re);if(qe)return rt}},ae=function(T,U){var O=this,X=0,ee=0,he=Date.now(),we,De;function Ee(){if(De=0,U&&typeof U=="function"){we=Date.now();var Re=Math.max(0,Math.round((ee-X)/((we-he)/1e3)*100)/100)||0,He;ee===0&&T===0?He=1:He=Math.floor(ee/T*100)/100||0,he=we,X=ee;try{U({loaded:ee,total:T,speed:Re,percent:He})}catch(Be){}}}return function(Re,He){if(Re&&(ee=Re.loaded,T=Re.total),He)clearTimeout(De),Ee();else{if(De)return;De=setTimeout(Ee,O.options.ProgressInterval)}}},le=function(T,U,O){var X;if(typeof U.Body=="string"?U.Body=new Blob([U.Body],{type:"text/plain"}):U.Body instanceof ArrayBuffer&&(U.Body=new Blob([U.Body])),U.Body&&(U.Body instanceof Blob||U.Body.toString()==="[object File]"||U.Body.toString()==="[object Blob]"))X=U.Body.size;else{O(je.error(new Error("params body format error, Only allow File|Blob|String.")));return}U.ContentLength=X,O(null,X)},me=function(T){return Date.now()+(T||0)},fe=function(T,U){var O=T;return T.message=T.message||null,typeof U=="string"?(T.error=U,T.message=U):r(U)==="object"&&U!==null&&(Q(T,U),(U.code||U.name)&&(T.code=U.code||U.name),U.message&&(T.message=U.message),U.stack&&(T.stack=U.stack)),typeof Object.defineProperty=="function"&&(Object.defineProperty(T,"name",{writable:!0,enumerable:!1}),Object.defineProperty(T,"message",{enumerable:!0})),T.name=U&&U.name||T.name||T.code||"Error",T.code||(T.code=T.name),T.error||(T.error=z(O)),T},ke=function(){return(typeof globalThis=="undefined"?"undefined":r(globalThis))==="object"&&(globalThis.constructor.name==="DedicatedWorkerGlobalScope"||globalThis.FileReaderSync)},Ce=function(){return(typeof window=="undefined"?"undefined":r(window))!=="object"&&(typeof t=="undefined"?"undefined":r(t))==="object"&&!0&&!ke()},ye=function(T){return/^https?:\/\/([^/]+\.)?ci\.[^/]+/.test(T)},Fe=(function(){if((typeof navigator=="undefined"?"undefined":r(navigator))!=="object")return!1;var K=navigator.userAgent,T=!!K.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/);return T})(),_e=(function(){return(typeof navigator=="undefined"?"undefined":r(navigator))!=="object"?!1:/\sQQ/i.test(navigator.userAgent)})(),Pe=function(T,U){var O=k.encode(T);return U&&(O=O.replaceAll("+","-").replaceAll("/","_").replaceAll("=","")),O},it=function(T){return T?k.decode(T):""},Je=function(T){var U=T.split("/"),O=[],X=o(U),ee;try{for(X.s();!(ee=X.n()).done;){var he=ee.value;he===".."?O.length&&O.pop():he.length&&he!=="."&&O.push(he)}}catch(we){X.e(we)}finally{X.f()}return"/"+O.join("/")},We=function(T){var U;if(T&&typeof T=="string"){var O=T.trim(),X=O.indexOf("<")===0,ee=O.indexOf("{")===0;if(X)U=je.xml2json(T)||{};else if(ee)try{var he=T.replace(/\n/g," "),we=JSON.parse(he);Object.prototype.toString.call(we)==="[object Object]"?U=we:U=T}catch(De){U=T}else U=T}else U=T||{};return U},je={noop:f,formatParams:re,apiWrapper:de,xml2json:S,json2xml:x,md5:b,clearKey:v,fileSlice:C,getBodyMd5:M,getFileMd5:q,b64:Y,extend:Q,isArray:$,isInArray:J,makeArray:oe,each:ie,map:ge,filter:ne,clone:z,attr:G,uuid:ue,camSafeUrlEncode:P,throttleOnProgress:ae,getFileSize:le,getSkewTime:me,error:fe,obj2str:j,getAuth:_,parseSelectPayload:I,getSourceParams:p,isBrowser:!0,isNode:Ce,isCIHost:ye,isIOS_QQ:Fe&&_e,encodeBase64:Pe,decodeBase64:it,simplifyPath:Je,readAsBinaryString:m,parseResBody:We};a.exports=je}).call(this,e("./node_modules/process/browser.js"))})})})});var $o={};Yi($o,{default:()=>Nr});module.exports=Zi($o);var H=require("obsidian");var at=require("obsidian"),_n=Xi(Mn());var $i=new Set(["auth_code_consumed","auth_code_expired","invalid_auth_code","invalid_auth_redirect","invalid_auth_state","password_required","synapsehub_user_session_required"]);function Ue(a){if(!a||typeof a!="object")return!1;let u="status"in a?a.status:void 0,e="code"in a&&typeof a.code=="string"?a.code:void 0;return u===401&&!$i.has(e!=null?e:"")}function Et(a,u){let e=typeof a=="string"?a.trim():"",t=typeof u=="string"?u.trim():"";try{let r=new URL(e),o=new URL(t),l=r.pathname.split("/").filter(Boolean);return!["http:","https:"].includes(r.protocol)||r.origin!==o.origin||r.username||r.password||l.length!==2||l[0]!=="s"||!l[1]?null:{baseUrl:r.origin,slug:l[1]}}catch(r){return null}}function Nn(a,u){let e=typeof a=="string"?a.trim():"",t=typeof u=="string"?u.trim():"";try{let r=new URL(e),o=new URL(t);return["http:","https:"].includes(r.protocol)&&!r.username&&!r.password&&r.origin===o.origin}catch(r){return!1}}function Hr(a,u){return!!(a.id&&a.url&&Et(a.url,u))}function Un(a,u){return!a.id||!a.url||Hr(a,u)?null:{id:a.id,url:a.url}}function On(a,u){let e={};return(typeof a.df_legacy_id!="string"||a.df_legacy_id.length===0)&&(e.df_legacy_id=u.id),(typeof a.df_legacy_url!="string"||a.df_legacy_url.length===0)&&(e.df_legacy_url=u.url),e}var Oe=class extends Error{constructor(e,t,r,o,l){super(e);this.status=t;this.code=r;this.requestId=o;this.details=l}},dr=class{constructor(u,e,t){this.getSettings=u;this.pluginVersion=e;this.onInvalidSession=t}async health(){return this.getJson("/v0/health")}async createShare(u,e){return this.postJson("/v0/shares",u,e?{"Idempotency-Key":e}:{})}async resolveShareCreate(u){return this.getJson(`/v0/shares/idempotency/${encodeURIComponent(u)}`)}async updateShare(u,e){return this.putJson(`/v0/shares/${encodeURIComponent(u)}`,e)}async getShareStatus(u){return this.getJson(`/v0/shares/${encodeURIComponent(u)}`)}async listShares(){return this.getJson("/v0/shares?limit=100")}async getShareLinks(u){return this.getJson(`/v0/shares/${encodeURIComponent(u)}/links`)}async deleteShare(u){return this.deleteJson(`/v0/shares/${encodeURIComponent(u)}`)}async deleteShareRecord(u){return this.deleteJson(`/v0/shares/${encodeURIComponent(u)}/record`)}async createFolderShareDraft(u){return this.postJson("/v0/folder-shares/drafts",u)}async putFolderShareDocument(u,e,t){return this.putJson(`/v0/folder-shares/drafts/${encodeURIComponent(u)}/documents/${encodeURIComponent(e)}`,t)}async commitFolderShareDraft(u,e){return this.postJson(`/v0/folder-shares/drafts/${encodeURIComponent(u)}/commit`,e)}async listFolderShares(){return this.getJson("/v0/folder-shares")}async deleteFolderShare(u){return this.deleteJson(`/v0/folder-shares/${encodeURIComponent(u)}`)}async deleteFolderShareRecord(u){return this.deleteJson(`/v0/folder-shares/${encodeURIComponent(u)}/record`)}async uploadAsset(u,e,t,r){try{let o=await this.createAssetUploadIntent(u,e,t,r);if(o.mode==="already_uploaded"&&o.asset)return o.asset;if(o.mode==="tencent_cos"&&o.asset_id&&o.storage_key&&o.upload)return await this.uploadAssetToCos(u,t,r,o.upload),await this.completeAssetUpload(o.asset_id,{filename:e,content_type:t,byte_length:u.byteLength,hash:r,storage_key:o.storage_key})}catch(o){console.warn("DocFerry direct asset upload failed; retrying through the API proxy.")}return this.uploadAssetViaApi(u,e,t,r)}async createAssetUploadIntent(u,e,t,r){return this.postJson("/v0/assets/intents",{filename:e,content_type:t,byte_length:u.byteLength,hash:r})}async completeAssetUpload(u,e){return this.postJson(`/v0/assets/${encodeURIComponent(u)}/complete`,e)}async uploadAssetToCos(u,e,t,r){let o=r.credentials,l=new _n.default({SecretId:o.tmp_secret_id,SecretKey:o.tmp_secret_key,SecurityToken:o.session_token,StartTime:o.start_time,ExpiredTime:o.expired_time}),d=new Blob([u],{type:e});await l.uploadFile({Bucket:r.bucket,Region:r.region,Key:r.key,Body:d,ContentType:e,SliceSize:r.slice_size,Headers:{...r.headers||{},"Content-Type":e,"x-cos-meta-docferry-sha256":t}})}async uploadAssetViaApi(u,e,t,r){let o=await(0,at.requestUrl)({url:this.url("/v0/assets"),method:"POST",headers:{...this.headers(!1),"Content-Type":t,"X-Share-Asset-Hash":r,"X-Share-Asset-Filename":eo(e)},body:u,throw:!1});return this.parse(o.status,o.text)}async getAuthConfig(){return this.getJson("/v0/auth/config")}async exchangePendingAuth(u,e){return this.postJson("/v0/auth/exchange/pending",{state:u,code_verifier:e})}async createDeviceAuthorization(u){return this.postJson("/v0/auth/device/code",u)}async exchangeDeviceAuthorization(u){return this.postJson("/v0/auth/device/token",{device_code:u})}async whoami(){return this.getJson("/v0/auth/whoami")}async createDashboardLink(u){return this.postJson("/v0/auth/dashboard-link",{target_path:u})}async getMembership(u=!1){return this.getJson(`/v0/membership${u?"?refresh=true":""}`)}async createAccessRequest(u){return this.postJson("/v0/access-requests",u)}async createMediaNoteJob(u,e){return this.postJson("/v0/media-note/jobs",{source_url:u,output_language:"source"},{"Idempotency-Key":e})}async getMediaNoteJob(u){return this.getJson(`/v0/media-note/jobs/${encodeURIComponent(u)}`)}async cancelMediaNoteJob(u){return this.postJson(`/v0/media-note/jobs/${encodeURIComponent(u)}/cancel`,{})}async logout(){return this.postJson("/v0/auth/logout",{})}async logoutToken(u){let e=await(0,at.requestUrl)({url:this.url("/v0/auth/logout"),method:"POST",headers:{"Content-Type":"application/json","X-Share-Plugin-Version":this.pluginVersion,Authorization:`Bearer ${u}`},body:"{}",throw:!1});return this.parse(e.status,e.text,!1)}async getShareImportPayload(u,e){let t=Et(u,this.getSettings().serverUrl);if(!t)throw new Oe("Use a share link from this DocFerry service.",0,"invalid_share_url");let{baseUrl:r,slug:o}=t,l=`${r}/s/${encodeURIComponent(o)}/import`,d=await(0,at.requestUrl)({url:l,method:"GET",throw:!1}),b;if(d.status===401&&e){let y=await(0,at.requestUrl)({url:`${r}/s/${encodeURIComponent(o)}/password`,method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({password:e}),throw:!1});this.parse(y.status,y.text),b=to(y.headers),d=await(0,at.requestUrl)({url:l,method:"GET",headers:b?{Cookie:b}:{},throw:!1})}return{payload:this.parse(d.status,d.text),cookieHeader:b}}async downloadImportAsset(u,e){if(!Nn(u,this.getSettings().serverUrl))throw new Oe("The share included an invalid asset URL.",0,"invalid_import_asset_url");let t=await(0,at.requestUrl)({url:u,method:"GET",headers:e?{Cookie:e}:{},throw:!1});if(t.status>=200&&t.status<300)return t.arrayBuffer;throw this.parse(t.status,t.text),new Oe("Asset download failed.",t.status)}async getJson(u){let e=await(0,at.requestUrl)({url:this.url(u),method:"GET",headers:this.headers(!1),throw:!1});return this.parse(e.status,e.text)}async postJson(u,e,t={}){let r=await(0,at.requestUrl)({url:this.url(u),method:"POST",headers:{...this.headers(!0),...t},body:JSON.stringify(e),throw:!1});return this.parse(r.status,r.text)}async putJson(u,e){let t=await(0,at.requestUrl)({url:this.url(u),method:"PUT",headers:this.headers(!0),body:JSON.stringify(e),throw:!1});return this.parse(t.status,t.text)}async deleteJson(u){let e=await(0,at.requestUrl)({url:this.url(u),method:"DELETE",headers:this.headers(!1),throw:!1});return this.parse(e.status,e.text)}url(u){return`${this.getSettings().serverUrl.replace(/\/+$/,"")}${u}`}headers(u){let e=this.getSettings(),t={"X-Share-Plugin-Version":this.pluginVersion};u&&(t["Content-Type"]="application/json");let r=e.sessionToken;return r&&(t.Authorization=`Bearer ${r}`),t}parse(u,e,t=!0){var b,y,S,x,k;let r;if(e)try{r=JSON.parse(e)}catch(F){r=void 0}if(u>=200&&u<300)return r;let o=r,l=((b=o==null?void 0:o.error)==null?void 0:b.message)||e||`Request failed with ${u}`,d=new Oe(l,u,(y=o==null?void 0:o.error)==null?void 0:y.code,(S=o==null?void 0:o.error)==null?void 0:S.request_id,(x=o==null?void 0:o.error)==null?void 0:x.details);throw t&&Ue(d)&&((k=this.onInvalidSession)==null||k.call(this,d)),d}};function eo(a){return encodeURIComponent(a).slice(0,255)}function to(a){var t,r;let u=a["set-cookie"]||a["Set-Cookie"];return u&&((r=(t=String(u).split(",",1)[0])==null?void 0:t.split(";",1)[0])==null?void 0:r.trim())||void 0}function ht(a){return a==="published"||a==="password_protected"}function jn(a){let u=a.filter(ht).length,e=a.length-u,t=[];return u&&t.push(`${u} live ${u===1?"share":"shares"}`),e&&t.push(`${e} past ${e===1?"share":"shares"}`),t.length?`${t.join(", ")}.`:"No shares yet."}function qr(a,u){return a?a===u?"update":"wrong-vault":"claim"}function Hn(a,u){let e=`${u}/`;return a.startsWith(e)?a.slice(e.length):a}function Gt(a){return Kr(a,404,"share_not_found")}function ro(a){return Kr(a,410,"share_stopped")}function no(a){return Kr(a,410,"share_expired")}function Vr(a){return ro(a)||no(a)}function Kr(a,u,e){if(!a||typeof a!="object")return!1;let t=a;return t.status===u&&t.code===e}var et=require("obsidian");var qn=require("electron"),Vn=require("obsidian");async function $e(a){let u=new URL(a);if(u.protocol!=="https:")throw new Error("Only secure web links can be opened externally.");try{return await qn.shell.openExternal(u.toString()),!0}catch(e){return new Vn.Notice("DocFerry could not open your system browser."),!1}}var ut=class extends Error{constructor(e){super(e);this.userMessage=e;this.name="AuthCompletionError"}},io=new Set(["pkce_required","code_verifier_required","invalid_code_verifier","invalid_client_state","auth_login_cancelled","auth_login_failed"]),zr="DocFerry could not access secure credential storage. Update Obsidian, then sign in again.",hr=class{constructor(u,e,t,r,o){this.api=u;this.onAccessToken=e;this.getLoginContext=t;this.getPendingLogin=r;this.savePendingLogin=o;this.loginAttempt=0;this.disposed=!1}async startLogin(u={}){try{let e=await this.api.getAuthConfig(),t=u.signup?e.signup_url||so(e.login_url):e.login_url;if(e.provider!=="synapsehub"||!t)return new et.Notice("Bondie account login is not configured on this server yet."),!1;let r=ao(),o=uo(),l=await co(o),d=++this.loginAttempt;try{await this.savePendingLogin(r,new Date().toISOString(),o)}catch(y){return new et.Notice(zr,8e3),!1}return await $e(oo(t,this.getLoginContext(),u,r,l))?(new et.Notice(u.signup?"Create your Bondie account in the browser, confirm the account, then return to Obsidian.":u.promptLogin?"Choose another Bondie account in the browser, confirm it, then return to Obsidian.":"Finish signing in in your browser, confirm the account, then return to Obsidian."),this.pollPendingLogin(r,o,d),!0):(await this.clearPendingLogin(r),!1)}catch(e){return new et.Notice("Bondie login is not available on this server."),!1}}dispose(){this.disposed=!0,this.loginAttempt++}async cancelPendingLogin(){this.loginAttempt++,this.getPendingLogin().state&&await this.savePendingLogin("","","")}async pollPendingLogin(u,e,t){var l,d;let r=Date.now()+6e5,o=0;for(;!this.disposed&&t===this.loginAttempt&&Date.now()=600*1e3||!e.verifier){await this.clearPendingLoginSafely(e.state),u&&new et.Notice("Bondie login expired. Start login again.",8e3);return}let r=++this.loginAttempt;u&&new et.Notice("Finishing Bondie login..."),this.pollPendingLogin(e.state,e.verifier,r)}async clearPendingLoginSafely(u){try{await this.clearPendingLogin(u)}catch(e){new et.Notice(zr,8e3)}}async clearPendingLogin(u){this.getPendingLogin().state===u&&await this.savePendingLogin("","","")}};function oo(a,u,e,t,r){let o=new URL(a);return o.searchParams.set("client_instance_id",u.clientInstanceId),o.searchParams.set("plugin_version",u.pluginVersion),o.searchParams.set("platform",u.platform),o.searchParams.set("instance_type","obsidian_plugin"),o.searchParams.set("client_state",t),o.searchParams.set("code_challenge",r),o.searchParams.set("code_challenge_method","S256"),e.promptLogin&&o.searchParams.set("prompt","login"),o.toString()}function so(a){let u=new URL(a);return u.pathname=u.pathname.replace(/\/login\/?$/,"/signup"),u.toString()}function ao(){let a=new Uint8Array(32);return crypto.getRandomValues(a),Array.from(a,u=>u.toString(16).padStart(2,"0")).join("")}function uo(){let a=new Uint8Array(48);return crypto.getRandomValues(a),Kn(a)}async function co(a){let u=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(a));return Kn(new Uint8Array(u))}function Kn(a){let u="";for(let e of a)u+=String.fromCharCode(e);return window.btoa(u).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function lo(a){return new Promise(u=>window.setTimeout(u,a))}var Jn=require("obsidian");var zn="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";var pr="DocFerry",Gn="Save links and share notes or folders.",po=`data:image/png;base64,${zn.trim()}`;function Mt(a,u="docferry-plugin-logo"){let e=a.createDiv({cls:u});return e.createEl("img",{attr:{alt:"",src:po,decoding:"async",loading:"lazy"}}),e}function ze(a,u,e){let t=a.createDiv({cls:"docferry-plugin-header"});Mt(t,"docferry-plugin-logo").setAttr("aria-hidden","true");let r=t.createDiv({cls:"docferry-plugin-header-copy"});r.createEl("h2",{text:u,cls:"docferry-heading docferry-heading-2"}),e&&r.createEl("p",{text:e})}function fr(a,u,e){return new Promise(t=>{new gt(a,"Stop sharing?","The public DocFerry link will stop opening this content.","Keep share","Stop sharing",u,e||"",t).open()})}function Gr(a,u,e){return new Promise(t=>{new gt(a,"Delete share history?","This removes the stopped record from DocFerry. The source file in your vault is not deleted.","Keep history","Delete history",u,e||"",t).open()})}function Jr(a,u,e,t){return new Promise(r=>{new gt(a,"Publish a new link for this note?","The previous share link is not visible to the current Bondie account. It may belong to a different account or may have been deleted. Publishing creates a new link under the current account; the previous reference is preserved in the note's properties as df_legacy_url.","Cancel","Publish new link",u,e||"",r,t?[t]:[]).open()})}function Qn(a,u,e,t){return new Promise(r=>{new gt(a,"Republish from the legacy free service?","This note was shared with the earlier DocFerry free service. That link may still be live, but it can no longer be managed from this vault. Publishing creates a new link on the current DocFerry service; the old link is preserved in the note's properties as df_legacy_url.","Cancel","Publish new link",u,e||"",r,[t]).open()})}function Wn(a,u,e,t){return new Promise(r=>{new gt(a,"Use the recovered link for this note?","DocFerry recovered a publish that began for a note at a different path. Continuing updates that same public link with the note and sharing options shown now; it does not create a second link.","Cancel","Use recovered link",e,t,r,[`Previous path: ${u}`]).open()})}function Yn(a,u,e){return new Promise(t=>{new gt(a,"Stop the unfinished share and change accounts?","DocFerry recovered a public link but can no longer find its source note in this vault. To avoid leaving an unknown public link behind, changing accounts will stop that link first.","Keep account connected","Stop share and continue",u,e,t).open()})}function Xn(a,u,e){return new Promise(t=>{new gt(a,"Stop the recovered share?","DocFerry recovered a public link for a note that is no longer at its original path. Stop that link now, then publish the current note again to create a separate link.","Keep recovered link","Stop recovered link",u,e,t).open()})}var gt=class extends Jn.Modal{constructor(e,t,r,o,l,d,b,y,S=[]){super(e);this.heading=t;this.description=r;this.cancelLabel=o;this.confirmLabel=l;this.title=d;this.sourcePath=b;this.resolve=y;this.extraLines=S;this.done=!1}onOpen(){let{contentEl:e}=this;e.empty(),ze(e,this.heading,this.description),e.createEl("p",{text:this.title,cls:"setting-item-description"}),this.sourcePath&&e.createEl("p",{text:this.sourcePath,cls:"setting-item-description"});for(let r of this.extraLines)e.createEl("p",{text:r,cls:"setting-item-description"});let t=e.createDiv({cls:"modal-button-container"});t.createEl("button",{text:this.cancelLabel}).addEventListener("click",()=>{this.finish(!1)}),t.createEl("button",{text:this.confirmLabel,cls:"mod-warning"}).addEventListener("click",()=>{this.finish(!0)})}onClose(){this.done||this.finish(!1)}finish(e){this.done||(this.done=!0,this.resolve(e),this.close())}};var Ne=require("obsidian");var fo={youtube:"YouTube",tiktok:"TikTok",bilibili:"Bilibili",douyin:"Douyin",wechat:"WeChat",vimeo:"Vimeo",audio:"Audio",video:"Video",web:"Web"};function Qr(a){let u;try{u=new URL(a.trim())}catch(e){throw new Error("Enter a valid web URL.")}if(u.protocol!=="http:"&&u.protocol!=="https:"||!u.hostname||u.username||u.password)throw new Error("Only public http or https links can be imported.");return u}function Wr(a){let u=a.hostname.toLowerCase().replace(/^www\./,"");return u==="youtu.be"||Jt(u,"youtube.com")?"youtube":Jt(u,"tiktok.com")?"tiktok":u==="b23.tv"||Jt(u,"bilibili.com")?"bilibili":Jt(u,"douyin.com")?"douyin":u==="mp.weixin.qq.com"?"wechat":Jt(u,"vimeo.com")?"vimeo":/\.(mp3|m4a|wav|ogg)$/i.test(a.pathname)?"audio":/\.(mp4|webm|mov)$/i.test(a.pathname)?"video":"web"}function gr(a){return fo[a]}function go(a,u){let e=a.pathname.split("/").filter(Boolean).pop(),t=u==="youtube"&&a.searchParams.get("v")||e,r=mo(vo(t||a.hostname.replace(/^www\./,"")));return`${gr(u)} - ${r}`}function Zn(a,u=new Date().toISOString()){let e=Qr(a),t=Wr(e),r=go(e,t),o=["---","docferry_import:"," type: link",` source_url: ${JSON.stringify(e.href)}`,` provider: ${t}`,` imported_at: ${JSON.stringify(u)}`," parse_status: link_only","---","",`# ${r}`,"",`[Open original link](<${e.href}>)`,""].join(`
+`);return{url:e,provider:t,title:r,markdown:o}}function Jt(a,u){return a===u||a.endsWith(`.${u}`)}function mo(a){return yo(a,"-").replace(/[\\/:*?"<>|#[\]^]+/g,"-").replace(/\s+/g," ").replace(/^-+|-+$/g,"").trim().slice(0,120).trim()||"link"}function yo(a,u){return Array.from(a,e=>{let t=e.charCodeAt(0);return t<=31||t===127?u:e}).join("")}function vo(a){try{return decodeURIComponent(a)}catch(u){return a}}function mr(a,u){return!a||a.activeFolderShareLimit===0?"upgrade_required":!u&&!a.canCreateFolderShare?"limit_reached":"allowed"}function Nt(a){return a?mr(a,!1)!=="upgrade_required":!0}var Ut=require("obsidian");var yr=class extends Ut.Modal{constructor(e){super(e);this.done=!1;this.password=""}openAndGetPassword(){return new Promise(e=>{this.resolver=e,super.open()})}onOpen(){let{contentEl:e}=this;e.empty(),e.addClass("docferry-password-modal"),ze(e,"Password required","Enter the password for this shared document."),new Ut.Setting(e).setName("Password").setDesc("The password is used once to import this DocFerry URL.").addText(r=>{r.inputEl.type="password",r.inputEl.addClass("docferry-password-input"),r.setPlaceholder("Share password").onChange(o=>{this.password=o}),window.setTimeout(()=>r.inputEl.focus(),50)});let t=e.createDiv({cls:"modal-button-container"});t.createEl("button",{text:"Cancel"}).addEventListener("click",()=>{this.finish(null)}),t.createEl("button",{text:"Continue",cls:"mod-cta"}).addEventListener("click",()=>{let r=this.password.trim();if(!r){new Ut.Notice("Password is required.");return}this.finish(r)})}onClose(){this.done||this.finish(null)}finish(e){this.done||(this.done=!0,this.resolver(e),this.close())}};var Yr=new Set(["extracted","degraded"]),Xr=new Set(["extracted","degraded","unsupported","failed","cancelled","expired"]),$n=1500,ei=800;function ti(a){return a==="starting"?"Starting advanced import...":a==="reading"?"Reading the source. Longer audio and video can take a few minutes.":a==="writing"?"Creating your note. You can keep working while this finishes.":"Preparing your preview..."}function Qt(a){var e;let u=(e=a.result_contract)==null?void 0:e.title;if(typeof u=="string"&&u.trim())return u.trim().slice(0,160);if(a.source_url)try{return new URL(a.source_url).hostname.replace(/^www\./,"")||"Imported note"}catch(t){}return"Imported note"}function ri(a){var t;let u=(t=a.result_contract)==null?void 0:t.summary,e=typeof u=="string"?u:u&&typeof u=="object"&&"text"in u?u.text:null;return typeof e!="string"?"":e.replace(/\s+/g," ").trim().slice(0,320)}function vr(a){return a.status==="cancelled"?"This import was cancelled.":a.status==="expired"?"This import expired before it was saved.":a.status==="unsupported"?"DocFerry cannot prepare a note from this link yet.":a.error_message||"DocFerry could not prepare a note from this link."}function ni(a){let u=a.replace(/\r\n/g,`
+`),e=u.match(/^# [^\n]+\n+/);return e?u.slice(e[0].length):a}var bo=new Set(["bilibili","tiktok","douyin"]);function ii(a,u){return a&&u.enabled&&u.supportedProviders.length>0}function So(a,u){return u.enabled&&u.supportedProviders.includes(a)}function br(a,u,e){return a&&So(u,e)}function oi(a){return bo.has(a)}function si(a,u){return u===null||a{this.activePage=r.id,this.render()})}}renderPageIntro(e,t,r){let o=e.createDiv({cls:"docferry-settings-page-intro"});o.createDiv({text:t,cls:"docferry-heading docferry-heading-2",attr:{role:"heading","aria-level":"2"}}),o.createEl("p",{text:r})}renderConnectionSection(e){var k,F,P;let t=this.host.docferrySettings.connectedAccount,r=!!this.host.docferrySettings.sessionToken,o=((k=t==null?void 0:t.displayUser)==null?void 0:k.name)||((F=t==null?void 0:t.displayUser)==null?void 0:F.email)||"Not connected";this.renderPageIntro(e,"Account","Your DocFerry membership and this connected device.");let l=e.createDiv({cls:"docferry-settings-panel docferry-connection-panel"}),d=l.createDiv({cls:"docferry-panel-header"}),b=d.createDiv();b.createDiv({text:"Bondie account",cls:"docferry-heading docferry-heading-3",attr:{role:"heading","aria-level":"3"}}),b.createEl("p",{text:r?"This Obsidian device is connected to DocFerry. Membership and personal details live on the web dashboard.":"Connect once to publish, save links, and use your DocFerry membership."});let y=d.createDiv({text:r?"Connected":"Not connected",cls:r?"docferry-status-badge is-ok":"docferry-status-badge"}),S=l.createDiv({cls:"docferry-settings-account-identity"});Zr(S,t==null?void 0:t.displayUser,"docferry-account-avatar");let x=S.createDiv({cls:"docferry-account-details"});if(x.createDiv({text:o,cls:"docferry-heading docferry-heading-4",attr:{role:"heading","aria-level":"4"}}),(P=t==null?void 0:t.displayUser)!=null&&P.email&&t.displayUser.email!==o&&x.createEl("p",{text:t.displayUser.email}),x.createEl("p",{text:r?"Signed in with Bondie":"Use an existing account or create a new one."}),r){let L=this.host.docferrySettings.membership,j=l.createDiv({cls:"docferry-settings-account-grid"});Sr(j,"Plan",(L==null?void 0:L.planDisplayName)||"Refresh required"),Sr(j,"Shares",L?Ot(L.activeShareCount,L.activeShareLimit):"-"),Sr(j,"Advanced imports",L?Ot(L.mediaNoteMonthlyJobsUsed,L.mediaNoteMonthlyJobLimit):"-"),Sr(j,"Last refreshed",L?St(L.refreshedAt):"Never")}this.renderAccountActions(l,r),y.setAttr("aria-label",r?"Connected":"Current account status")}renderAccountActions(e,t){let r=e.createDiv({cls:"docferry-account-quick-actions"});if(!t){let d=r.createEl("button",{cls:"mod-cta",attr:{type:"button"}});Wt(d,"log-in","Log in"),Yt(d,async()=>this.host.startLogin());let b=r.createEl("button",{attr:{type:"button"}});Wt(b,"user-plus","Create account"),Yt(b,async()=>this.host.startSignup());return}let o=r.createEl("button",{cls:"mod-cta",attr:{type:"button"}});Wt(o,"layout-dashboard","Open dashboard"),Yt(o,async()=>this.host.openDashboardHome());let l=r.createEl("button",{attr:{type:"button"}});Wt(l,"refresh-cw","Refresh access"),Yt(l,async()=>{await this.host.refreshMembership(!0),this.render()})}renderSharingSection(e){this.renderPageIntro(e,"Sharing","Defaults used when you publish a note or folder.");let r=e.createDiv({cls:"docferry-settings-panel docferry-settings-share-entry"}).createDiv({cls:"docferry-panel-header"}),o=r.createDiv();o.createDiv({text:"Published content",cls:"docferry-heading docferry-heading-3",attr:{role:"heading","aria-level":"3"}}),o.createEl("p",{text:"Review active and past note or folder shares."});let l=r.createEl("button",{cls:"mod-cta",attr:{type:"button"}});Wt(l,"files","Open shares"),Yt(l,async()=>this.host.openSharesPage());let d=e.createDiv({cls:"docferry-settings-panel"}),y=d.createDiv({cls:"docferry-panel-header"}).createDiv();y.createDiv({text:"Publish defaults",cls:"docferry-heading docferry-heading-3",attr:{role:"heading","aria-level":"3"}}),y.createEl("p",{text:"You can still change these options before each share."}),new tt.Setting(d).setName("Password by default").setDesc("Preselect password protection in the publish dialog.").addToggle(S=>S.setValue(this.host.docferrySettings.defaultPasswordEnabled).onChange(async x=>{this.host.docferrySettings.defaultPasswordEnabled=x,await this.host.saveSettings()})),new tt.Setting(d).setName("Default expiration").setDesc("Used as the initial value in the publish dialog.").addDropdown(S=>S.addOption("never","Never").addOption("30","30 days").setValue(this.host.docferrySettings.defaultExpiresInDays).onChange(async x=>{this.host.docferrySettings.defaultExpiresInDays=x,await this.host.saveSettings()}))}renderImportsSection(e){this.renderPageIntro(e,"Imports","Choose where saved links and generated notes are written.");let t=e.createDiv({cls:"docferry-settings-panel"}),o=t.createDiv({cls:"docferry-panel-header"}).createDiv();o.createDiv({text:"Save location",cls:"docferry-heading docferry-heading-3",attr:{role:"heading","aria-level":"3"}}),o.createEl("p",{text:"Applied to DocFerry shares, web pages, audio, and video."}),new tt.Setting(t).setName("Default import folder").setDesc("Vault folder used by the DocFerry home page and import dialogs.").addText(l=>l.setPlaceholder(Ye.defaultImportFolder).setValue(this.host.docferrySettings.defaultImportFolder||Ye.defaultImportFolder).onChange(async d=>{this.host.docferrySettings.defaultImportFolder=_t(d)||Ye.defaultImportFolder,await this.host.saveSettings()}))}renderAdvancedSection(e){this.renderPageIntro(e,"Advanced","Connection diagnostics and local plugin controls.");let t=e.createDiv({cls:"docferry-settings-panel docferry-settings-advanced-body"});new tt.Setting(t).setName("Test connection").setDesc("Check whether DocFerry can reach the service.").addButton(r=>r.setButtonText("Test").onClick(()=>void this.host.testConnection())),new tt.Setting(t).setName("Debug logging").setDesc("Include extra details in the developer console for troubleshooting.").addToggle(r=>r.setValue(this.host.docferrySettings.debug).onChange(async o=>{this.host.docferrySettings.debug=o,await this.host.saveSettings(),new tt.Notice(o?"Debug logging enabled":"Debug logging disabled")})),new tt.Setting(t).setName("Plugin version").setDesc(this.host.manifest.version),new tt.Setting(t).setName("Disconnect account").setDesc("Remove this Bondie account from this Obsidian device.").addButton(r=>{r.setButtonText("Disconnect"),r.setWarning(),r.setDisabled(!this.host.docferrySettings.sessionToken&&!this.host.docferrySettings.connectedAccount),r.onClick(async()=>{await this.host.disconnectAccount(),this.render()})})}};function _t(a){return(typeof a=="string"?a:"").replace(/\\/g,"/").split("/").filter(e=>e&&e!=="."&&e!=="..").map(e=>e.replace(/[\\/:*?"<>|]+/g,"-").trim().replace(/^\.+|\.+$/g,"")).filter(Boolean).join("/")}function ci(a){return((a==null?void 0:a.name)||(a==null?void 0:a.email)||"DF").split(/[\s@._-]+/).filter(Boolean).slice(0,2).map(r=>{var o;return(o=r[0])==null?void 0:o.toUpperCase()}).join("")||"DF"}function Zr(a,u,e="docferry-account-avatar"){let t=a.createDiv({cls:e,attr:{"aria-hidden":"true"}});if(u!=null&&u.picture){let r=t.createEl("img",{attr:{alt:"",src:u.picture,decoding:"async",loading:"lazy",referrerpolicy:"no-referrer"}});return r.addEventListener("error",()=>{r.remove(),t.setText(ci(u))},{once:!0}),t}return t.setText(ci(u)),t}function Sr(a,u,e){let t=a.createDiv({cls:"docferry-settings-account-fact"});t.createSpan({text:u}),t.createEl("strong",{text:e})}function St(a){if(!a)return"Never";let u=new Date(a);return Number.isNaN(u.getTime())?a:u.toLocaleString()}function li(a){return a.status==="stopped"&&a.stopped_at?`Stopped ${St(a.stopped_at)}`:a.expires_at?a.status==="expired"?`Expired ${St(a.expires_at)}`:`Expires ${St(a.expires_at)}`:"No expiration"}function di(a){return typeof a=="object"&&a!==null&&a.vault_name||"Obsidian vault"}function $r(a){return a==="password_protected"?"Password":a==="expired"?"Expired":a==="stopped"?"Stopped":"Published"}function en(a){return a==="password_protected"?"is-locked":a==="expired"?"is-warning":a==="stopped"?"is-muted":"is-ok"}function Xt(a){return!Number.isFinite(a)||a<=0?"0 bytes":a%(1024*1024)===0?`${a/(1024*1024)} MiB`:a%1024===0?`${a/1024} KiB`:`${a} bytes`}function hi(a){return a==="synapsehub_user_session_required"?"Refresh your account before changing plans.":a==="synapsehub_runtime_unreachable"?"Plan refresh is temporarily unavailable.":a==="synapsehub_runtime_failed"?"Plan refresh failed. Try again later.":a?"Plan refresh is temporarily unavailable.":""}function pi(a,u=new Date().toISOString()){var e,t;return{productKey:a.product_key,accessRole:a.access_role,planKey:a.plan_key,planDisplayName:a.plan_display_name,entitlementKey:(e=a.entitlement_key)!=null?e:null,activeShareCount:a.active_share_count,activeShareLimit:a.active_share_limit,activeFolderShareCount:a.active_folder_share_count,activeFolderShareLimit:a.active_folder_share_limit,maxFolderDocumentCount:a.max_folder_document_count,maxFolderTotalBytes:a.max_folder_total_bytes,maxSingleFileSizeBytes:a.max_single_file_size_bytes,canCreateShare:a.can_create_share,canCreateFolderShare:a.can_create_folder_share,canUseFullTheme:a.can_use_full_theme,hasMediaNoteEntitlement:a.feature_gates["docferry.ai.assist"]===!0,canUseMediaNote:ii(a.feature_gates["docferry.ai.assist"]===!0,{enabled:a.media_note.enabled,supportedProviders:a.media_note.supported_providers}),mediaNoteProviders:[...a.media_note.supported_providers],mediaNoteSourceKinds:[...a.media_note.supported_source_kinds],mediaNoteActiveJobs:a.media_note_usage.active_jobs,mediaNoteActiveJobLimit:a.media_note_usage.active_job_limit,mediaNoteMonthlyJobsUsed:a.media_note_usage.monthly_jobs_used,mediaNoteMonthlyJobLimit:a.media_note_usage.monthly_job_limit,mediaNoteResetsAt:a.media_note_usage.resets_at,source:a.limit_source,cacheStatus:a.cache.status,refreshedAt:u,unavailableReason:(t=a.unavailable_reason)!=null?t:null,billingEnabled:!!a.billing.enabled,billingPlans:a.billing.plans.map(r=>({planKey:r.plan_key,displayName:r.display_name,amountMinorUnits:r.amount_minor_units,currency:r.currency,billingInterval:r.billing_interval,testOnly:!!r.test_only}))}}function Ot(a,u){return`${a}/${Cr(u)}`}function Cr(a){return a===null?"Unlimited":String(a)}function Wt(a,u,e){let t=a.createSpan({cls:"docferry-button-icon",attr:{"aria-hidden":"true"}});(0,tt.setIcon)(t,u),a.createSpan({text:e,cls:"docferry-button-label"})}function Yt(a,u){a.addEventListener("click",()=>{u()})}var xt="docferry-dashboard",wt=class extends Ne.ItemView{constructor(e,t){super(e);this.host=t;this.activePage="home";this.shares=[];this.folderShares=[];this.sharesLoaded=!1;this.sharesLoading=!1;this.sharesError="";this.sharesKey="";this.importUrl="";this.importLoading=!1;this.importProgress="";this.importCancelRequested=!1;this.importError="";this.importSuccess="";this.dragDepth=0;this.activeDragPath=""}getViewType(){return xt}getDisplayText(){return pr}getIcon(){return"ship"}async onOpen(){this.render()}refreshForAuthChange(){this.resetShares(),this.render(),this.activePage==="shares"&&this.hasAuthForShares()&&this.refreshShares()}refreshForShareChange(){this.resetShares(),this.render(),this.activePage==="shares"&&this.hasAuthForShares()&&this.refreshShares()}showHomePage(){this.openHomePage()}showSharesPage(){this.openSharesPage()}showAccountPage(){this.activePage="account",this.render()}render(){let{contentEl:e}=this;e.empty(),e.addClass("docferry-dashboard-view");let t=this.activePage==="home",r=!!(this.importLoading||this.importProgress||this.importError||this.importSuccess||this.host.docferrySettings.pendingMediaNoteImport);e.toggleClass("is-home-page",t),e.toggleClass("has-expanded-home-state",t&&r);let o=e.createDiv({cls:["docferry-workspace-shell",t?"is-home-page":"",t&&r?"has-expanded-home-state":""].filter(Boolean).join(" ")});this.renderTopbar(o);let l=o.createDiv({cls:"docferry-workspace-content"});this.activePage==="home"&&this.renderHome(l),this.activePage==="shares"&&this.renderSharesPage(l),this.activePage==="account"&&this.renderAccountPage(l)}renderTopbar(e){let r=e.createDiv({cls:"docferry-workspace-topbar"}).createDiv({cls:"docferry-workspace-brand",attr:{role:"button",tabindex:"0","aria-label":"Open DocFerry dashboard",title:"Open DocFerry dashboard"}});Mt(r,"docferry-workspace-brand-mark");let o=r.createSpan({cls:"docferry-workspace-brand-copy"});o.createSpan({text:"DocFerry",cls:"docferry-workspace-brand-title"}),o.createSpan({text:"Save and share",cls:"docferry-workspace-brand-subtitle"}),r.addEventListener("click",()=>void this.host.openDashboardHome()),r.addEventListener("keydown",l=>{l.key!=="Enter"&&l.key!==" "||(l.preventDefault(),this.host.openDashboardHome())})}renderHome(e){var I;let t=((I=this.host.docferrySettings.membership)==null?void 0:I.canUseMediaNote)===!0,r=e.createDiv({cls:"docferry-import-home docferry-share-drop-surface"}),o=r.createDiv({cls:"docferry-import-panel"}),d=o.createDiv({cls:"docferry-share-drop-overlay",attr:{role:"status","aria-live":"polite","aria-atomic":"true"}}).createDiv({cls:"docferry-share-drop-cue"}),b=d.createSpan({cls:"docferry-share-drop-overlay-icon",attr:{"aria-hidden":"true"}});(0,Ne.setIcon)(b,"upload-cloud"),d.createEl("h3",{text:"Share from this vault",cls:"docferry-heading docferry-heading-3 docferry-share-drop-title"}),d.createEl("p",{text:Nt(this.host.docferrySettings.membership)?"Release a note or folder to review sharing options.":"Release a note to review sharing options.",cls:"docferry-share-drop-detail"});let y=d.createDiv({cls:"docferry-share-drop-guard"}),S=y.createSpan({attr:{"aria-hidden":"true"}});(0,Ne.setIcon)(S,"shield-check"),y.createSpan({text:"Nothing is published until you confirm."}),this.registerShareDropSurface(r);let x=o.createDiv({cls:"docferry-import-intro"});Mt(x,"docferry-import-mark docferry-import-logo").setAttr("aria-hidden","true");let k=x.createDiv({cls:"docferry-import-intro-copy"});k.createEl("h2",{text:"Save to Obsidian",cls:"docferry-heading docferry-heading-2"}),k.createEl("p",{text:"Paste one public link. DocFerry chooses the best way to save it."});let F=o.createDiv({cls:"docferry-import-scope",attr:{"aria-label":"Supported link types"}});this.renderImportScope(F,"files","DocFerry shares"),this.renderImportScope(F,"globe-2","Web pages"),this.renderImportScope(F,"video","Video"),this.renderImportScope(F,"audio-lines","Audio");let P="docferry-dashboard-import-url",L=o.createDiv({cls:"docferry-import-field"});L.createEl("label",{text:"Paste a link",attr:{for:P}});let j=L.createDiv({cls:"docferry-import-row"}),N=j.createEl("input",{type:"text",placeholder:"Paste any public link",cls:"docferry-import-url-input",attr:{id:P,autocomplete:"off"}});N.value=this.importUrl,N.disabled=this.importLoading,N.addEventListener("input",()=>{this.importUrl=N.value,this.importError="",this.importSuccess="",W.disabled=this.importLoading||!rn(this.importUrl)}),N.addEventListener("keydown",p=>{p.key==="Enter"&&this.handleImport()});let W=j.createEl("button",{cls:"mod-cta",attr:{type:"button"}});Xe(W,"download",this.importLoading?"Saving":"Save"),W.disabled=this.importLoading||!rn(this.importUrl),W.addEventListener("click",()=>{this.handleImport()});let _=L.createDiv({cls:"docferry-import-guidance"}),B=_.createSpan({attr:{"aria-hidden":"true"}});if((0,Ne.setIcon)(B,t?"sparkles":"link"),_.createSpan({text:t?"Saving creates a note in your vault. Shared notes save instantly; web and media links may take a few minutes.":"Saving creates a note in your vault. Shared notes import directly; other public links become simple notes."}),this.importLoading){let p=o.createDiv({cls:"docferry-import-progress",attr:{role:"status","aria-live":"polite"}}),f=p.createSpan({cls:"docferry-import-progress-icon",attr:{"aria-hidden":"true"}});(0,Ne.setIcon)(f,"loader-circle");let v=p.createSpan({cls:"docferry-import-progress-copy"});if(v.createSpan({text:this.importProgress?"Preparing your note":"Saving to Obsidian",cls:"docferry-import-progress-title"}),v.createSpan({text:this.importProgress?ti(this.importProgress):"This should only take a moment."}),this.importProgress){v.createSpan({text:"You can keep working. A preview will open when the note is ready."});let m=p.createEl("button",{cls:"docferry-import-cancel",attr:{type:"button"}});Xe(m,"x",this.importCancelRequested?"Cancelling":"Cancel"),m.disabled=this.importCancelRequested,m.addEventListener("click",()=>void this.cancelImport())}}else if(this.host.docferrySettings.pendingMediaNoteImport){let p=o.createDiv({cls:"docferry-import-progress docferry-import-recovery",attr:{role:"status","aria-live":"polite"}}),f=p.createSpan({attr:{"aria-hidden":"true"}});(0,Ne.setIcon)(f,"history");let v=p.createSpan({cls:"docferry-import-progress-copy"});v.createSpan({text:"Detailed note pending review",cls:"docferry-import-progress-title"}),v.createSpan({text:"Resume the review or cancel it. Starting another will not duplicate the work."});let m=p.createDiv({cls:"docferry-import-recovery-actions"}),w=m.createEl("button",{cls:"mod-cta",attr:{type:"button"}});Xe(w,"play","Resume"),w.addEventListener("click",()=>void this.resumeImport());let C=m.createEl("button",{attr:{type:"button"}});Xe(C,"x","Cancel"),C.addEventListener("click",()=>void this.cancelPendingImport())}this.importError&&o.createDiv({text:this.importError,cls:"docferry-dashboard-inline-error"}),this.importSuccess&&this.renderImportSuccess(o,N);let E=r.createDiv({cls:"docferry-import-shortcuts",attr:{"aria-label":"DocFerry pages"}});this.renderShortcut(E,"files","Shares","Published content",()=>this.openSharesPage()),this.host.docferrySettings.sessionToken?this.renderShortcut(E,"layout-dashboard","Dashboard","Membership and billing",()=>{this.host.openDashboardHome()}):this.renderShortcut(E,"log-in","Sign in","Connect your Bondie account",()=>{this.host.startLogin()}),this.renderShortcut(E,"settings","Preferences","Plugin defaults",()=>this.host.openSettingsTab()),this.importLoading||window.setTimeout(()=>N.focus(),50)}renderImportSuccess(e,t){let r=e.createDiv({cls:"docferry-dashboard-inline-success",attr:{role:"status","aria-live":"polite"}}),o=r.createSpan({cls:"docferry-dashboard-inline-message-icon",attr:{"aria-hidden":"true"}});(0,Ne.setIcon)(o,"circle-check"),r.createSpan({text:this.importSuccess,cls:"docferry-dashboard-inline-message-copy"});let l=r.createEl("button",{cls:"docferry-dashboard-inline-message-dismiss",attr:{type:"button","aria-label":"Dismiss saved message",title:"Dismiss"}});(0,Ne.setIcon)(l,"x"),l.addEventListener("click",()=>{this.importSuccess="",r.remove(),t.focus()})}renderImportScope(e,t,r){let o=e.createSpan({cls:"docferry-import-scope-item"}),l=o.createSpan({attr:{"aria-hidden":"true"}});(0,Ne.setIcon)(l,t),o.createSpan({text:r})}registerShareDropSurface(e){let t=d=>this.host.vaultPathFromDrag(d),r=d=>{let b=e.getBoundingClientRect();!b.width||!b.height||(e.style.setProperty("--df-drop-x",`${Math.max(0,Math.min(b.width,d.clientX-b.left))}px`),e.style.setProperty("--df-drop-y",`${Math.max(0,Math.min(b.height,d.clientY-b.top))}px`))},o=(d,b)=>{d!==this.activeDragPath&&(this.activeDragPath=d,this.updateShareDropCue(e,d)),r(b),e.addClass("is-drag-active")},l=()=>{this.dragDepth=0,this.activeDragPath="",e.style.removeProperty("--df-drop-x"),e.style.removeProperty("--df-drop-y"),e.removeClass("is-drag-active")};e.addEventListener("dragenter",d=>{let b=t(d);b&&(d.preventDefault(),this.dragDepth+=1,o(b,d))}),e.addEventListener("dragover",d=>{let b=t(d);b&&(d.preventDefault(),d.dataTransfer&&(d.dataTransfer.dropEffect="copy"),o(b,d))}),e.addEventListener("dragleave",()=>{this.dragDepth=Math.max(0,this.dragDepth-1),this.dragDepth||l()}),e.addEventListener("drop",d=>{let b=t(d);l(),b&&(d.preventDefault(),d.stopPropagation(),this.host.publishVaultPath(b))})}updateShareDropCue(e,t){let r=this.host.app.vault.getAbstractFileByPath(t),o=r instanceof Ne.TFolder,l=o&&!Nt(this.host.docferrySettings.membership),d=r instanceof Ne.TFile?r.basename:(r==null?void 0:r.name)||t.split("/").pop()||t,b=e.querySelector(".docferry-share-drop-overlay-icon"),y=e.querySelector(".docferry-share-drop-title"),S=e.querySelector(".docferry-share-drop-detail");b&&(0,Ne.setIcon)(b,o?"folder-up":"file-up"),y&&(y.textContent=l?"Folder sharing is a Pro feature":o?"Share this folder":"Share this note"),S&&(S.textContent=l?`Upgrade to share "${d}".`:`Release to review "${d}".`)}renderSharesPage(e){let t=e.createDiv({cls:"docferry-workspace-page"});this.renderPageHeader(t,"Shares",this.sharesLoaded?jn([...this.shares,...this.folderShares].map(o=>o.status)):"Shared notes and folders from this account.","Refresh","refresh-cw",()=>void this.refreshShares());let r=this.currentShareListKey();if(this.sharesKey&&this.sharesKey!==r&&this.resetShares(),!this.hasAuthForShares()){this.renderEmpty(t,"Log in to view shares","Connect your Bondie account to manage published notes and folders.",!1,{label:"Log in",icon:"log-in",action:()=>void this.host.startLogin()});return}if(this.sharesLoading){this.renderShareSkeleton(t);return}if(this.sharesError){this.renderEmpty(t,"Share list unavailable",this.sharesError,!0);return}if(!this.sharesLoaded){this.renderEmpty(t,"Shares not loaded","Refresh to load your shared notes.");return}if(!this.shares.length&&!this.folderShares.length){this.renderEmpty(t,"No shares yet","Publish a note when you are ready.");return}if(this.folderShares.length){t.createEl("h3",{text:"Folders",cls:"docferry-heading docferry-heading-4 docferry-share-group-title"});let o=t.createDiv({cls:"docferry-share-list docferry-workspace-share-list"});for(let l of this.folderShares)this.renderFolderShareRow(o,l)}if(this.shares.length&&t.createEl("h3",{text:"Notes",cls:"docferry-heading docferry-heading-4 docferry-share-group-title"}),this.shares.length){let o=t.createDiv({cls:"docferry-share-list docferry-workspace-share-list"});for(let l of this.shares){let d=o.createDiv({cls:"docferry-share-row docferry-workspace-share-row docferry-share-row--compact"}),b=d.createDiv({cls:"docferry-share-main"});b.createEl("h4",{text:l.title||l.source_path,cls:"docferry-heading docferry-heading-4"}),b.createEl("p",{text:l.source_path});let y=b.createDiv({cls:"docferry-share-meta"});y.createSpan({text:di(l)}),y.createSpan({text:`Updated ${St(l.updated_at)}`}),l.expires_at&&l.status!=="stopped"&&y.createSpan({text:li(l)});let S=d.createDiv({cls:"docferry-share-badges"});S.createSpan({text:$r(l.status),cls:`docferry-pill ${en(l.status)}`}),l.password_enabled&&S.createSpan({text:"Password",cls:"docferry-pill is-locked"});let x=d.createDiv({cls:"docferry-share-actions"});if(ht(l.status)){let k=x.createEl("button",{attr:{type:"button","aria-label":"Copy share URL"}});Xe(k,"copy","Copy"),pt(k,async()=>{await navigator.clipboard.writeText(l.url),new Ne.Notice("Share link copied")});let F=x.createEl("button",{attr:{type:"button","aria-label":"Open share URL"}});Xe(F,"external-link","Open"),F.addEventListener("click",()=>{$e(l.url)});let P=x.createEl("button",{attr:{type:"button","aria-label":"Show linked note status"}});Xe(P,"list-checks","Links"),pt(P,async()=>{await this.host.openShareLinks(l)});let L=x.createEl("button",{attr:{type:"button","aria-label":"Update share"}});Xe(L,"upload-cloud","Update"),pt(L,async()=>{await this.host.updateShareFromList(l)})}if(ht(l.status)){let k=x.createEl("button",{cls:"docferry-icon-button",attr:{type:"button","aria-label":`More actions for ${l.title||l.source_path}`,title:"More actions"}});Zt(k,"more-horizontal"),k.addEventListener("click",()=>this.showShareMenu(k,l))}else{let k=x.createEl("button",{cls:"docferry-delete-history-button",attr:{type:"button","aria-label":`Delete history for ${l.title||l.source_path}`}});Xe(k,"trash-2","Delete"),pt(k,async()=>{await this.host.deleteShareHistory(l),await this.refreshShares()})}}}}renderFolderShareRow(e,t){let r=e.createDiv({cls:"docferry-share-row docferry-workspace-share-row docferry-share-row--compact"}),o=r.createDiv({cls:"docferry-share-main"});o.createEl("h4",{text:t.title,cls:"docferry-heading docferry-heading-4"}),o.createEl("p",{text:t.source_folder});let l=o.createDiv({cls:"docferry-share-meta"});l.createSpan({text:`${t.document_count} notes`}),l.createSpan({text:`Updated ${St(t.updated_at)}`}),l.createSpan({text:t.theme_mode==="full"?"Theme styling":"Reader style"});let d=r.createDiv({cls:"docferry-share-badges"});d.createSpan({text:$r(t.status),cls:`docferry-pill ${en(t.status)}`}),t.password_enabled&&d.createSpan({text:"Password",cls:"docferry-pill is-locked"});let b=r.createDiv({cls:"docferry-share-actions"});if(ht(t.status)){let y=b.createEl("button",{attr:{type:"button","aria-label":"Copy folder share URL"}});Xe(y,"copy","Copy"),pt(y,async()=>{await navigator.clipboard.writeText(t.url),new Ne.Notice("Folder share link copied")});let S=b.createEl("button",{attr:{type:"button","aria-label":"Open folder share"}});Xe(S,"external-link","Open"),S.addEventListener("click",()=>$e(t.url));let x=b.createEl("button",{attr:{type:"button","aria-label":"Update folder share"}});Xe(x,"upload-cloud","Update"),pt(x,async()=>{await this.host.updateFolderShareFromList(t)})}if(ht(t.status)){let y=b.createEl("button",{cls:"docferry-icon-button",attr:{type:"button","aria-label":`More actions for ${t.title}`,title:"More actions"}});Zt(y,"more-horizontal"),y.addEventListener("click",()=>this.showFolderShareMenu(y,t))}else{let y=b.createEl("button",{cls:"docferry-delete-history-button",attr:{type:"button","aria-label":`Delete history for ${t.title}`}});Xe(y,"trash-2","Delete"),pt(y,async()=>{await this.host.deleteFolderShareHistory(t),await this.refreshShares()})}}renderAccountPage(e){var P,L,j;let t=e.createDiv({cls:"docferry-workspace-page docferry-account-page"});this.renderPageHeader(t,"Account","Your DocFerry plan and signed-in Bondie account.");let r=this.host.docferrySettings.connectedAccount,o=!!this.host.docferrySettings.sessionToken,l=((P=r==null?void 0:r.displayUser)==null?void 0:P.name)||((L=r==null?void 0:r.displayUser)==null?void 0:L.email)||"Not connected",d=t.createDiv({cls:"docferry-account-card docferry-workspace-account-card"});if(o)Zr(d,r==null?void 0:r.displayUser,"docferry-account-avatar");else{let N=d.createDiv({cls:"docferry-account-avatar is-placeholder",attr:{"aria-hidden":"true"}});(0,Ne.setIcon)(N,"user")}let b=d.createDiv({cls:"docferry-account-details"});if(b.createEl("h3",{text:l,cls:"docferry-heading docferry-heading-4"}),b.createEl("p",{text:o?"Signed in with Bondie":"Connect once to publish, import shares, and use account features."}),(j=r==null?void 0:r.displayUser)!=null&&j.email&&r.displayUser.email!==l&&b.createEl("p",{text:r.displayUser.email}),!o){this.renderAccountQuickActions(t,!1);return}let y=this.host.docferrySettings.membership,S=t.createDiv({cls:"docferry-membership-card docferry-workspace-membership-card"}),x=S.createDiv({cls:"docferry-membership-header"}),k=x.createDiv();k.createEl("h3",{text:"Plan and usage",cls:"docferry-heading docferry-heading-4"}),k.createEl("p",{text:y?`Updated ${St(y.refreshedAt)}.`:"Refresh to load your current plan."}),x.createSpan({text:(y==null?void 0:y.planDisplayName)||"Unknown",cls:`docferry-status-badge ${y&&y.planKey!=="free"?"is-ok":""}`});let F=S.createDiv({cls:"docferry-membership-stats"});Ar(F,"Shares",y?Ot(y.activeShareCount,y.activeShareLimit):"-"),Ar(F,"Folders",y?Ot(y.activeFolderShareCount,y.activeFolderShareLimit):"-"),Ar(F,"File size",y?Xt(y.maxSingleFileSizeBytes):"-"),Ar(F,"Advanced imports",y?y.mediaNoteMonthlyJobLimit===null?`${y.mediaNoteMonthlyJobsUsed} this month`:Ot(y.mediaNoteMonthlyJobsUsed,y.mediaNoteMonthlyJobLimit):"-"),y!=null&&y.hasMediaNoteEntitlement?S.createDiv({text:`Detailed web, audio, and video notes plus Obsidian-inspired theme styling. Usage resets ${Co(y.mediaNoteResetsAt)}.`,cls:"docferry-membership-benefit-note"}):y&&S.createDiv({text:"Pro adds detailed web, audio, and video notes, folder sharing, and Obsidian-inspired theme styling.",cls:"docferry-membership-benefit-note"}),y!=null&&y.unavailableReason&&S.createDiv({text:hi(y.unavailableReason),cls:"docferry-membership-note"}),this.renderAccountQuickActions(t,o)}renderAccountQuickActions(e,t){let r=e.createDiv({cls:"docferry-workspace-page-actions docferry-account-primary-actions docferry-account-quick-actions"}),o=r.createEl("button",{cls:t?"":"mod-cta",attr:{type:"button"}});if(Xe(o,t?"refresh-cw":"log-in",t?"Refresh":"Log in"),pt(o,async()=>{t?await this.host.refreshMembership(!0):await this.host.startLogin(),this.render()}),!t){let b=r.createEl("button",{attr:{type:"button"}});Xe(b,"user-plus","Create account"),pt(b,async()=>{await this.host.startSignup(),this.render()})}if(!t)return;let l=r.createEl("button",{cls:"mod-cta",attr:{type:"button"}});Xe(l,"layout-dashboard","Open dashboard"),pt(l,async()=>this.host.openDashboardHome());let d=r.createEl("button",{cls:"docferry-icon-button",attr:{type:"button","aria-label":"More account actions",title:"More account actions"}});Zt(d,"more-horizontal"),d.addEventListener("click",()=>this.showAccountMenu(d))}renderPageHeader(e,t,r,o,l,d){let b=e.createDiv({cls:"docferry-workspace-page-header"}),y=b.createEl("button",{cls:"docferry-workspace-back docferry-icon-button",attr:{type:"button","aria-label":"Back to DocFerry home",title:"Home"}});Zt(y,"arrow-left"),y.addEventListener("click",()=>{this.openHomePage()});let S=b.createDiv({cls:"docferry-workspace-page-copy"});if(S.createEl("h1",{text:t,cls:"docferry-heading docferry-heading-2"}),S.createEl("p",{text:r}),o&&l&&d){let x=b.createEl("button",{cls:"docferry-icon-button",attr:{type:"button","aria-label":o,title:o}});Zt(x,l),x.disabled=this.sharesLoading||!this.hasAuthForShares(),x.addEventListener("click",d)}}renderShortcut(e,t,r,o,l){let d=e.createEl("button",{cls:"docferry-import-shortcut",attr:{type:"button"}}),b=d.createSpan({cls:"docferry-import-shortcut-icon",attr:{"aria-hidden":"true"}});(0,Ne.setIcon)(b,t);let y=d.createSpan({cls:"docferry-import-shortcut-copy"});y.createSpan({text:r,cls:"docferry-import-shortcut-title"}),y.createSpan({text:o,cls:"docferry-import-shortcut-description"}),d.addEventListener("click",l)}openHomePage(){this.activePage="home",this.render()}openSharesPage(){this.activePage="shares",this.render(),this.hasAuthForShares()&&!this.sharesLoaded&&!this.sharesLoading&&this.refreshShares()}async handleImport(){let e=this.importUrl.trim();if(!rn(e)){this.importError="Enter a valid web URL.",this.importSuccess="",this.render();return}if(!Et(e,this.host.docferrySettings.serverUrl)){this.importLoading=!0,this.importCancelRequested=!1,this.importProgress=this.shouldPrepareDetailedNote(e)?"starting":"",this.importError="",this.importSuccess="",this.render();try{let t=await this.host.importExternalLink(e,r=>{this.importProgress=r,this.render()});if(!t){this.importSuccess="Nothing was saved.";return}this.importUrl="",this.importSuccess=`Saved ${t.title} to ${t.notePath}.`}catch(t){this.importCancelRequested?this.importSuccess="Import cancelled. Nothing was saved.":this.importError=nn(t,"Import failed")}finally{this.importLoading=!1,this.importProgress="",this.importCancelRequested=!1,this.render()}return}await this.runImport(e)}async cancelImport(){if(!(!this.importLoading||!this.importProgress||this.importCancelRequested)){this.importCancelRequested=!0,this.render();try{await this.host.cancelActiveMediaImport()}catch(e){this.importCancelRequested=!1,this.importError=nn(e,"Could not cancel import"),this.render()}}}async resumeImport(){this.importLoading=!0,this.importProgress="reading",this.importError="",this.importSuccess="",this.render();try{await this.host.resumeActiveMediaImport()}finally{this.importLoading=!1,this.importProgress="",this.render()}}async cancelPendingImport(){try{await this.host.cancelActiveMediaImport(),this.importSuccess="Import cancelled. Nothing was saved.",this.importError=""}catch(e){this.importError=nn(e,"Could not cancel import")}this.render()}async runImport(e,t){this.importLoading=!0,this.importError="",this.importSuccess="",this.render();try{let r=await this.host.importShareFromDashboard(e,t);this.importUrl="",this.importSuccess=`Imported ${r.title} to ${r.notePath}.`,r.importedAssets&&(this.importSuccess+=` Assets: ${r.importedAssets}.`)}catch(r){if(r instanceof Oe&&r.status===401&&r.code==="password_required"){let o=await new yr(this.host.app).openAndGetPassword();if(this.importLoading=!1,!o){this.importError="Password is required for this share.",this.render();return}await this.runImport(e,o);return}this.importError=Ao(r)}finally{this.importLoading=!1,this.render()}}async refreshShares(){if(!this.hasAuthForShares()){this.resetShares(),this.render();return}this.sharesLoading=!0,this.sharesError="",this.sharesKey=this.currentShareListKey(),this.render();try{let[e,t]=await Promise.all([this.host.listShares(),this.host.listFolderShares()]);this.shares=e,this.folderShares=t,this.sharesLoaded=!0}catch(e){this.sharesError=ko(e),this.shares=[],this.folderShares=[]}finally{this.sharesLoading=!1,this.render()}}resetShares(){this.shares=[],this.folderShares=[],this.sharesLoaded=!1,this.sharesLoading=!1,this.sharesError="",this.sharesKey=""}hasAuthForShares(){return!!this.host.docferrySettings.sessionToken}currentShareListKey(){var o;let e=this.host.docferrySettings,t=e.sessionToken.slice(-8),r=((o=e.connectedAccount)==null?void 0:o.productSubjectId)||"pending";return`${e.serverUrl}|${r}|${t}`}showShareMenu(e,t){let r=new Ne.Menu;ht(t.status)?r.addItem(o=>o.setTitle("Stop sharing").setIcon("unlink").onClick(async()=>{await this.host.stopShareFromList(t),await this.refreshShares()})):r.addItem(o=>o.setTitle("Delete history").setIcon("trash-2").onClick(async()=>{await this.host.deleteShareHistory(t),await this.refreshShares()})),tn(r,e)}showFolderShareMenu(e,t){let r=new Ne.Menu;t.status!=="stopped"&&t.status!=="expired"?r.addItem(o=>o.setTitle("Stop sharing").setIcon("unlink").onClick(async()=>{await this.host.stopFolderShareFromList(t),await this.refreshShares()})):r.addItem(o=>o.setTitle("Delete history").setIcon("trash-2").onClick(async()=>{await this.host.deleteFolderShareHistory(t),await this.refreshShares()})),tn(r,e)}showAccountMenu(e){let t=new Ne.Menu;t.addItem(r=>r.setTitle("Manage plan").setIcon("credit-card").onClick(()=>void this.host.openMembershipCenter())),t.addItem(r=>r.setTitle("Switch account").setIcon("log-in").onClick(()=>void this.host.reconnectAccount())),t.addItem(r=>r.setTitle("Support").setIcon("life-buoy").onClick(()=>void this.host.requestAccessUpgrade("plugin_dashboard"))),t.addItem(r=>r.setTitle("Plugin preferences").setIcon("settings").onClick(()=>this.host.openSettingsTab())),t.addSeparator(),t.addItem(r=>r.setTitle("Disconnect").setIcon("log-out").onClick(async()=>{await this.host.disconnectAccount(),this.resetShares(),this.render()})),tn(t,e)}shouldPrepareDetailedNote(e){let t=this.host.docferrySettings.membership;if(!(t!=null&&t.hasMediaNoteEntitlement)||!t.canUseMediaNote)return!1;try{let r=Wr(Qr(e));return br(t.hasMediaNoteEntitlement,r,{enabled:t.canUseMediaNote,supportedProviders:t.mediaNoteProviders})}catch(r){return!1}}renderShareSkeleton(e){let t=e.createDiv({cls:"docferry-share-list docferry-workspace-share-list",attr:{"aria-busy":"true","aria-label":"Loading shares"}});for(let r=0;r<4;r+=1){let l=t.createDiv({cls:"docferry-share-row docferry-workspace-share-row docferry-share-row--compact is-loading"}).createDiv({cls:"docferry-share-main"});l.createDiv({cls:"docferry-skeleton-line is-title"}),l.createDiv({cls:"docferry-skeleton-line"})}}renderEmpty(e,t,r,o=!1,l){let d=e.createDiv({cls:`docferry-settings-empty ${o?"is-error":""}`});if(d.createEl("h3",{text:t,cls:"docferry-heading docferry-heading-4"}),d.createEl("p",{text:r}),l){let b=d.createEl("button",{cls:"mod-cta",attr:{type:"button"}});Xe(b,l.icon,l.label),b.addEventListener("click",l.action)}}};function Xe(a,u,e){let t=a.createSpan({cls:"docferry-button-icon",attr:{"aria-hidden":"true"}});(0,Ne.setIcon)(t,u),a.createSpan({text:e,cls:"docferry-button-label"})}function Zt(a,u){a.createSpan({cls:"docferry-icon-button-glyph",attr:{"aria-hidden":"true","data-docferry-icon":u}})}function Co(a){let u=new Date(a);return Number.isNaN(u.getTime())?"next month":u.toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"})}function pt(a,u){a.addEventListener("click",()=>{u().catch(()=>{new Ne.Notice("That action could not be completed. Check your connection and try again.")})})}function tn(a,u){let e=u.getBoundingClientRect();a.setUseNativeMenu(!1).showAtPosition({x:e.right,y:e.bottom,left:!0})}function Ar(a,u,e){let t=a.createDiv({cls:"docferry-membership-stat"});t.createSpan({text:u}),t.createEl("strong",{text:e})}function rn(a){try{let u=new URL(a.trim());return["http:","https:"].includes(u.protocol)&&!!u.host&&!u.username&&!u.password}catch(u){return!1}}function nn(a,u){return a instanceof Oe?`${u}: ${a.message}`:a instanceof Error?`${u}: ${a.message}`:u}function Ao(a){if(a instanceof Oe){if(a.status===404)return"This shared note could not be found.";if(a.status===410)return"This share is no longer available.";if(a.status===401)return"The password was not accepted. Try again."}return a instanceof TypeError||a instanceof Error&&/network|fetch|connect/i.test(a.message)?"DocFerry could not connect. Check your internet connection and try again.":"Import failed. Check the link and try again."}function ko(a){return a instanceof Oe&&a.status===401?"Reconnect your Bondie account, then refresh.":a instanceof TypeError||a instanceof Error&&/network|fetch|connect/i.test(a.message)?"DocFerry could not connect. Check your internet connection and refresh.":"Refresh to try loading your shares again."}var on="df_id",sn="df_url",an="df_updated",un="df_protected",cn="df_expires";function ln(a,u){var t,r;let e=(t=a.metadataCache.getFileCache(u))==null?void 0:t.frontmatter;return e?{id:kr(e[on]),url:kr(e[sn]),updated:kr(e[an]),passwordEnabled:Do(e[un]),expires:(r=kr(e[cn]))!=null?r:null}:{}}async function dn(a,u,e,t){await a.fileManager.processFrontMatter(u,r=>{var o;r[on]=e.share_id,r[sn]=e.url,r[an]=e.updated_at,r[un]=t.passwordEnabled,r[cn]=(o=t.expiresAt)!=null?o:null})}async function Dr(a,u,e){await a.fileManager.processFrontMatter(u,t=>{let r=On(t,e);for(let[o,l]of Object.entries(r))t[o]=l})}async function Er(a,u){await a.fileManager.processFrontMatter(u,e=>{delete e[on],delete e[sn],delete e[an],delete e[un],delete e[cn]})}function kr(a){return typeof a=="string"&&a.length>0?a:void 0}function Do(a){return typeof a=="boolean"?a:void 0}var ct=require("obsidian");function Ct(a){a.modalEl.setAttr("role","dialog"),a.modalEl.setAttr("aria-modal","true"),a.modalEl.addEventListener("keydown",u=>{if(u.key!=="Tab")return;let e=Array.from(a.modalEl.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])')).filter(l=>!l.hasAttribute("disabled")&&l.offsetParent!==null);if(!e.length)return;let t=e[0],r=e[e.length-1],o=activeDocument.activeElement;u.shiftKey&&(o===t||!a.modalEl.contains(o))?(u.preventDefault(),r.focus()):!u.shiftKey&&(o===r||!a.modalEl.contains(o))&&(u.preventDefault(),t.focus())})}function hn(a,u){return a?"keep":u}function $t(a,u,e=new Date){if(a==="keep")return u!=null?u:null;if(a==="never")return null;let t=Number(a);if(!Number.isFinite(t)||t<=0)return null;let r=new Date(e);return r.setDate(r.getDate()+t),r.toISOString()}function fi(a,u,e,t=new Date){return a==="keep"?$t(e,null,t):u!=null?u:null}function gi(a,u,e){return a?e?u==="full":!0:!1}var xr=class extends ct.Modal{constructor(e,t){super(e);this.defaults=t;this.done=!1;this.password="";this.title=t.title,this.passwordEnabled=t.passwordEnabled,this.expiresInDays=t.expiresInDays,this.useThemeStyling=t.canUseThemeStyling&&t.useThemeStyling,this.documentCount=t.documentCount}openAndGetResult(){return new Promise(e=>{this.resolver=e,super.open()})}onOpen(){let{contentEl:e}=this;e.empty(),e.addClass("docferry-folder-share-modal"),Ct(this),ze(e,this.defaults.isUpdate?"Update this folder":"Share this folder",`${this.documentCount} ${this.documentCount===1?"note":"notes"} will be included in one share link.`),new ct.Setting(e).setName("Title").addText(l=>{l.setValue(this.title).onChange(d=>{this.title=d})});let t=e.createDiv(),r=()=>{t.empty(),this.passwordEnabled&&new ct.Setting(t).setName("Password").addText(l=>{l.inputEl.type="password",l.setPlaceholder("Folder password").onChange(d=>{this.password=d})})};new ct.Setting(e).setName("Password protection").setDesc("One password protects every note in this folder link.").addToggle(l=>l.setValue(this.passwordEnabled).onChange(d=>{this.passwordEnabled=d,r()})),r(),new ct.Setting(e).setName("Link expires").addDropdown(l=>(this.expiresInDays==="keep"?l.addOption("keep","Keep current expiration"):l).addOption("never","Never").addOption("30","30 days").setValue(this.expiresInDays).onChange(d=>{this.expiresInDays=d})),this.defaults.canUseThemeStyling&&new ct.Setting(e).setName("Use my Obsidian theme").setDesc("Bring over colors, borders, callouts, and code styling while keeping DocFerry's clean reading layout.").addToggle(l=>l.setValue(this.useThemeStyling).onChange(d=>{this.useThemeStyling=d}));let o=e.createDiv({cls:"modal-button-container"});o.createEl("button",{text:"Cancel"}).addEventListener("click",()=>this.finish(null)),o.createEl("button",{text:this.defaults.isUpdate?"Update folder":"Publish folder",cls:"mod-cta"}).addEventListener("click",()=>{let l=this.title.trim();if(!l){new ct.Notice("Title is required.");return}if(this.passwordEnabled&&!this.password.trim()&&!this.defaults.passwordAlreadySet){new ct.Notice("Password is required when protection is enabled.");return}this.finish({title:l,passwordEnabled:this.passwordEnabled,password:this.passwordEnabled?this.password:void 0,expiresAt:this.resolveExpiresAt(),expirySelection:this.expiresInDays,useThemeStyling:this.defaults.canUseThemeStyling&&this.useThemeStyling})})}onClose(){this.done||this.finish(null)}finish(e){this.done||(this.done=!0,this.resolver(e),this.close())}resolveExpiresAt(){return $t(this.expiresInDays,this.defaults.existingExpiresAt)}};function mi(a){return a.flow==="billing-return"?{kind:"billing-return",status:a.status}:a.flow==="import"&&a.url?{kind:"import",url:a.url}:{kind:"unsupported"}}var yi=require("obsidian");function vi(a,u,e){return new Promise(t=>{new pn(a,u,e,t).open()})}var pn=class extends yi.Modal{constructor(e,t,r,o){super(e);this.targetLabel=t;this.sourcePath=r;this.resolve=o;this.done=!1}onOpen(){let{contentEl:e}=this;e.empty(),ze(e,"Sign in to publish","Publishing uses the hosted DocFerry service with your Bondie account. After signing in, DocFerry returns to this publish so you can confirm it."),e.createEl("p",{text:this.targetLabel,cls:"setting-item-description"}),this.sourcePath&&e.createEl("p",{text:this.sourcePath,cls:"setting-item-description"});let t=e.createDiv({cls:"modal-button-container"});t.createEl("button",{text:"Not now"}).addEventListener("click",()=>{this.finish(!1)}),t.createEl("button",{text:"Connect account",cls:"mod-cta"}).addEventListener("click",()=>{this.finish(!0)})}onClose(){this.done||this.finish(!1)}finish(e){this.done||(this.done=!0,this.resolve(e),this.close())}};var ft=require("obsidian");var Tr=class extends ft.Modal{constructor(e,t="",r=Ye.defaultImportFolder,o=Ye.serverUrl){super(e);this.serviceUrl=o;this.done=!1;this.password="";this.outputFolder=Ye.defaultImportFolder;this.overwrite=!1;this.url=typeof t=="string"?t:"",this.outputFolder=_t(r)||Ye.defaultImportFolder}openAndGetResult(){return new Promise(e=>{this.resolver=e,super.open()})}onOpen(){let{contentEl:e}=this;e.empty(),ze(e,"Import share URL","Import one DocFerry document into this vault."),new ft.Setting(e).setName("Share URL").setDesc("Import one DocFerry share into this vault.").addText(r=>{r.setPlaceholder("https://docferry.bondie.io/s/...").setValue(this.url).onChange(o=>{this.url=o.trim()}),r.inputEl.addClass("docferry-url-input")}),new ft.Setting(e).setName("Password").setDesc("Optional. Required only when the share is password protected.").addText(r=>{r.inputEl.type="password",r.setPlaceholder("Optional password").onChange(o=>{this.password=o})}),new ft.Setting(e).setName("Output folder").setDesc("The imported note and explicitly referenced assets are written under this vault folder.").addText(r=>r.setValue(this.outputFolder).onChange(o=>{this.outputFolder=o.trim()})),new ft.Setting(e).setName("Overwrite existing files").setDesc("When disabled, import stops if the note or an asset already exists.").addToggle(r=>r.setValue(this.overwrite).onChange(o=>{this.overwrite=o}));let t=e.createDiv({cls:"modal-button-container"});t.createEl("button",{text:"Cancel"}).addEventListener("click",()=>{this.finish(null)}),t.createEl("button",{text:"Import",cls:"mod-cta"}).addEventListener("click",()=>{if(!Et(this.url,this.serviceUrl)){new ft.Notice("Enter a valid DocFerry share URL.");return}let r=_t(this.outputFolder);if(!r){new ft.Notice("Output folder is required.");return}this.finish({url:this.url,password:this.password.trim()||void 0,outputFolder:r,overwrite:this.overwrite})})}onClose(){this.done||this.finish(null)}finish(e){this.done||(this.done=!0,this.resolver(e),this.close())}};async function Si(a,u){let e=new Set([u.notePath]);for(let d of u.assets){if(e.has(d.path))throw new Error(`Import contains more than one file for: ${d.path}`);e.add(d.path)}for(let d of e)if(await a.exists(d)&&!u.overwrite)throw new Error(`${d===u.notePath?"File":"Asset"} already exists: ${d}`);let t=[];for(let d of u.assets)t.push({path:d.path,body:await u.download(d.url)});let r=[];r.push(await bi(a,u.notePath,"text",u.overwrite));for(let d of t)r.push(await bi(a,d.path,"binary",u.overwrite));let o=[],l=[];try{for(let d of Eo(e))await a.directoryExists(d)||(await a.createDirectory(d),l.push(d));for(let d=0;de.split("/").length-t.split("/").length)}async function bi(a,u,e,t){let r=await a.exists(u);if(r&&!t)throw new Error(`${e==="text"?"File":"Asset"} already exists: ${u}`);return r?e==="text"?{path:u,kind:e,existed:!0,text:await a.readText(u)}:{path:u,kind:e,existed:!0,binary:await a.readBinary(u)}:{path:u,kind:e,existed:!1}}async function xo(a,u){var e,t;if(!u.existed){await a.exists(u.path)&&await a.remove(u.path);return}u.kind==="text"?await a.writeText(u.path,(e=u.text)!=null?e:""):await a.writeBinary(u.path,(t=u.binary)!=null?t:new ArrayBuffer(0))}var jt=require("obsidian");var er=class extends jt.Modal{constructor(e,t,r){super(e);this.title=t;this.response=r}onOpen(){let{contentEl:e}=this;e.empty(),ze(e,"Linked note status","Check whether linked Obsidian notes have DocFerry URLs."),e.createEl("p",{text:this.title,cls:"setting-item-description"}),this.response.links.length||e.createEl("p",{text:"No Obsidian internal links were indexed for this share.",cls:"setting-item-description"});for(let r of this.response.links){let o=new jt.Setting(e).setName(`${Po(r.status)} ${r.label||r.raw_target}`).setDesc(Ro(r)),l=r.target_url;l&&o.addButton(d=>{d.setButtonText("Copy").onClick(()=>{To(l)})}).addButton(d=>{d.setButtonText("Open").onClick(()=>{$e(l)})})}e.createDiv({cls:"modal-button-container"}).createEl("button",{text:"Done",cls:"mod-cta"}).addEventListener("click",()=>{this.close()})}};async function To(a){await navigator.clipboard.writeText(a),new jt.Notice("Target link copied")}function Po(a){switch(a){case"resolved":return"Resolved";case"ambiguous":return"Ambiguous";case"unsupported":return"Unsupported";case"unpublished":return"Unpublished"}}function Ro(a){let u=a.target_path||a.raw_target;switch(a.status){case"resolved":return`${u} is published and will open as a DocFerry share.`;case"ambiguous":return`${u} matches more than one published document. Publish with clearer paths or update the source link.`;case"unsupported":return`${u} cannot be resolved by DocFerry yet.`;case"unpublished":return`${u} has not been published with DocFerry yet.`}}var Ht=require("obsidian");function wi(a,u){return new Promise(e=>{new fn(a,u,e).open()})}var fn=class extends Ht.Modal{constructor(e,t,r){super(e);this.job=t;this.resolve=r;this.done=!1;this.renderContext=new Ht.Component}onOpen(){let{contentEl:e}=this;e.empty(),this.modalEl.addClass("docferry-media-note-preview-modal"),e.addClass("docferry-media-note-preview"),ze(e,"Review your note","Check the result before saving it to your vault."),this.renderContext.load();let t=e.createDiv({cls:"docferry-media-note-preview-document"}),r=typeof this.job.markdown=="string"?this.job.markdown.trim():"";if(r)Ht.MarkdownRenderer.render(this.app,r,t,"",this.renderContext);else{t.createDiv({text:Qt(this.job),cls:"docferry-media-note-preview-title"});let l=ri(this.job);l&&t.createEl("p",{text:l,cls:"docferry-media-note-preview-summary"})}let o=e.createDiv({cls:"modal-button-container"});o.createEl("button",{text:"Review later"}).addEventListener("click",()=>this.finish(!1)),o.createEl("button",{text:"Save note",cls:"mod-cta"}).addEventListener("click",()=>{this.finish(!0)})}onClose(){this.renderContext.unload(),this.done||(this.done=!0,this.resolve(!1))}finish(e){this.done||(this.done=!0,this.resolve(e),this.close())}};var Bo="The connection was lost while starting your detailed note. Retrying the same link resumes safely without creating a duplicate.",Io="Your previous detailed note import resumed. Start this link again after it finishes or is cancelled.",Fo="The connection was lost while confirming your previous import. Retrying is safe and will not create a duplicate.";function Ci(a){let u=a==null?void 0:a.status;return typeof u=="number"&&u>=400&&u<500}async function tr(a,u){let e;try{e=await a.createJob(u.sourceUrl,u.key)}catch(t){if(Ci(t))return await a.store.save(null),null;throw new Error(Fo)}return await a.trackImport(e,u),await a.store.save(null),e}async function Ai(a,u,e){let t=a.store.read();if(t&&t.ownerProductSubjectId!==e)await a.store.save(null);else if(t&&t.sourceUrl!==u&&await tr(a,t))throw new Error(Io);let r=a.store.read();r||(r={key:a.generateKey(),sourceUrl:u,ownerProductSubjectId:e,createdAt:a.now()},await a.store.save(r));let o;try{o=await a.createJob(r.sourceUrl,r.key)}catch(l){throw Ci(l)?(await a.store.save(null),l):new Error(Bo)}return await a.trackImport(o,r),await a.store.save(null),o}function ki(a,u){return a.serverUrl===u?!1:(a.serverUrl=u,a.sessionToken="",a.connectedAccount=null,a.membership=null,a.pendingMediaNoteImport=null,a.pendingMediaNoteSubmission=null,a.pendingSharePublish=null,!0)}var Di="The connection was lost while publishing. Publishing the same note again resumes safely without creating a duplicate link.",Lo="A share from another Bondie account is still being recovered. Reconnect that account before publishing a new link.";function Ei(a){let u=a==null?void 0:a.status;return typeof u=="number"&&u>=400&&u<500}function xi(a){return(a==null?void 0:a.code)==="share_idempotency_inactive"}function Mo(a){return(a==null?void 0:a.code)==="share_idempotency_not_found"}async function Pr(a,u){var e;((e=a.read())==null?void 0:e.key)===u&&await a.save(null)}function mn(a){return JSON.stringify(gn(a))}function gn(a){if(Array.isArray(a))return a.map(gn);if(a&&typeof a=="object"){let u=a,e={};for(let t of Object.keys(u).sort())e[t]=gn(u[t]);return e}return a}async function Rr(a,u,e=1){let t=a.store.read();if(t&&t.ownerProductSubjectId!==u.ownerProductSubjectId)throw new Error(Lo);if(t)try{let l=await a.resolveShare(t.key);return await a.store.save({...t,response:l}),{response:l,operationKey:t.key,payloadChanged:t.payloadHash!==u.payloadHash,filePathChanged:t.filePath!==u.filePath,originalFilePath:t.filePath}}catch(l){if(Mo(l)||xi(l))await Pr(a.store,t.key);else throw Ei(l)?l:new Error(Di)}let r=a.store.read();r||(r={key:a.generateKey(),filePath:u.filePath,payloadHash:u.payloadHash,sourceHash:u.sourceHash,ownerProductSubjectId:u.ownerProductSubjectId,createdAt:a.now()},await a.store.save(r));let o;try{o=await a.createShare(u.payload,r.key)}catch(l){if(xi(l)){if(await Pr(a.store,r.key),e>0)return Rr(a,u,e-1);throw l}throw Ei(l)?(await Pr(a.store,r.key),l):new Error(Di)}return await a.store.save({...r,response:o}),{response:o,operationKey:r.key,payloadChanged:!1,filePathChanged:!1,originalFilePath:r.filePath}}async function Tt(a,u){await Pr(a,u)}var Br="session-token",rr="staged-session-token";function Ti(a,u,e){let t=typeof u=="string"?u:"";if(e)return a.setSecret(Br,""),a.setSecret(rr,""),{token:"",scrubLegacy:!!t,stagedTokenToRevoke:""};let r=a.getSecret(Br)||"",o=a.getSecret(rr)||"";return o&&o===r&&(a.setSecret(rr,""),o=""),r?{token:r,scrubLegacy:!!t,stagedTokenToRevoke:o}:t?(a.setSecret(Br,t),{token:t,scrubLegacy:!0,stagedTokenToRevoke:o}):{token:"",scrubLegacy:!1,stagedTokenToRevoke:o}}function Ir(a,u){a.setSecret(Br,u)}function yn(a,u){a.setSecret(rr,u)}function Fr(a){a.setSecret(rr,"")}var vn="pending-auth-state",bn="pending-auth-started-at",Sn="pending-auth-verifier";function Pi(a){return{state:a.getSecret(vn)||"",startedAt:a.getSecret(bn)||"",verifier:a.getSecret(Sn)||""}}function wn(a,u){if(!u.state){Cn(a);return}a.setSecret(vn,u.state),a.setSecret(bn,u.startedAt),a.setSecret(Sn,u.verifier)}function Cn(a){a.setSecret(vn,""),a.setSecret(bn,""),a.setSecret(Sn,"")}function Ri(a,u){let e=typeof u.state=="string"?u.state:"",t=typeof u.startedAt=="string"?u.startedAt:"",r=typeof u.verifier=="string"?u.verifier:"";return!e&&!t&&!r?!1:(e&&t&&r&&wn(a,{state:e,startedAt:t,verifier:r}),!0)}var Pt=require("obsidian");var nr=class extends Pt.Modal{constructor(e,t,r,o,l="document"){super(e);this.title=t;this.url=r;this.updatedAt=o;this.kind=l}onOpen(){let{contentEl:e}=this;e.empty(),e.addClass("docferry-result-modal"),Ct(this),ze(e,"Share link ready",`Your published ${this.kind} is ready to open or copy.`);let t=e.createDiv({cls:"docferry-result-card"}),r=t.createDiv({cls:"docferry-result-title-block"});r.createSpan({text:this.kind==="folder"?"Published folder":"Published note",cls:"docferry-result-label"}),r.createEl("h3",{text:this.title,cls:"docferry-heading docferry-heading-3 docferry-result-title"});let o=t.createDiv({cls:"docferry-result-link"});o.createSpan({text:"Share URL",cls:"docferry-result-label"}),o.createEl("code",{text:this.url});let l=t.createDiv({cls:"docferry-result-meta"});l.createSpan({text:"Updated"}),l.createSpan({text:this.updatedAt});let d=e.createDiv({cls:"docferry-result-actions modal-button-container"}),b=d.createEl("button",{cls:"mod-cta",attr:{type:"button"}});An(b,"copy","Copy link"),b.addEventListener("click",()=>{this.copyLink()});let y=d.createEl("button",{attr:{type:"button"}});An(y,"external-link","Open"),y.addEventListener("click",()=>{$e(this.url)});let S=d.createEl("button",{attr:{type:"button"}});An(S,"check","Done"),S.addEventListener("click",()=>{this.close()})}async copyLink(){try{await navigator.clipboard.writeText(this.url),new Pt.Notice("Link copied")}catch(e){new Pt.Notice("The link could not be copied. Select the Share URL and copy it manually.")}}};function An(a,u,e){let t=a.createSpan({cls:"docferry-button-icon",attr:{"aria-hidden":"true"}});(0,Pt.setIcon)(t,u),a.createSpan({text:e})}var lt=require("obsidian");var Lr=class extends lt.Modal{constructor(e,t){super(e);this.defaults=t;this.done=!1;this.password="";this.title=t.title,this.passwordEnabled=t.passwordEnabled,this.expiresInDays=t.expiresInDays,this.useThemeStyling=t.canUseThemeStyling&&t.useThemeStyling}openAndGetResult(){return new Promise(e=>{this.resolver=e,super.open()})}onOpen(){let{contentEl:e}=this;e.empty(),e.addClass("docferry-share-modal"),Ct(this),ze(e,this.defaults.isUpdate?"Update this share":"Share this note",this.defaults.isUpdate?"Refresh the existing link with the latest version of this note.":"Create a share link. Add a password or expiry only when you need one."),new lt.Setting(e).setName("Title").addText(d=>{d.setValue(this.title).onChange(b=>{this.title=b}),d.inputEl.addClass("docferry-title-input")});let t=e.createDiv(),r=()=>{t.empty(),this.passwordEnabled&&new lt.Setting(t).setName("Password").addText(d=>{d.inputEl.type="password",d.setPlaceholder("Optional password").onChange(b=>{this.password=b})})};new lt.Setting(e).setName("Password protection").setDesc("Protect this share link with a document-level password.").addToggle(d=>d.setValue(this.passwordEnabled).onChange(b=>{this.passwordEnabled=b,r()})),r(),new lt.Setting(e).setName("Link expires").addDropdown(d=>(this.expiresInDays==="keep"?d.addOption("keep","Keep current expiration"):d).addOption("never","Never").addOption("30","30 days").setValue(this.expiresInDays).onChange(b=>{this.expiresInDays=b})),this.defaults.canUseThemeStyling&&new lt.Setting(e).setName("Use my Obsidian theme").setDesc("Bring over colors, borders, callouts, and code styling while keeping DocFerry's clean reading layout.").addToggle(d=>d.setValue(this.useThemeStyling).onChange(b=>{this.useThemeStyling=b}));let o=e.createDiv({cls:"modal-button-container"});o.createEl("button",{text:"Cancel"}).addEventListener("click",()=>{this.finish(null)}),o.createEl("button",{text:this.defaults.isUpdate?"Update":"Publish",cls:"mod-cta"}).addEventListener("click",()=>{let d=this.title.trim();if(!d){new lt.Notice("Title is required.");return}if(this.passwordEnabled&&!this.password.trim()&&!this.defaults.passwordAlreadySet){new lt.Notice("Password is required when password protection is enabled.");return}this.finish({title:d,passwordEnabled:this.passwordEnabled,password:this.passwordEnabled?this.password:void 0,expiresAt:this.resolveExpiresAt(),expirySelection:this.expiresInDays,useThemeStyling:this.defaults.canUseThemeStyling&&this.useThemeStyling})})}onClose(){this.done||this.finish(null)}finish(e){this.done||(this.done=!0,this.resolver(e),this.close())}resolveExpiresAt(){return $t(this.expiresInDays,this.defaults.existingExpiresAt)}};function qt(a){return/^(?:https?:)?\/\//i.test(a)||/^(?:data|blob):/i.test(a)}function No(a){try{return decodeURIComponent(a)}catch(u){return a}}function kn(a){let u=a.trim();for(let t=0;t<3;t+=1){let r=No(u);if(r===u)break;u=r}return u.replace(/\\/g,"/").split("/").some(t=>t===".."||t.length>1&&t.startsWith("."))}var Mr=require("obsidian");function Bi(a,u="publish"){return new Promise(e=>{new En(a,u,e).open()})}var En=class extends Mr.Modal{constructor(e,t,r){super(e);this.context=t;this.resolve=r;this.settled=!1}onOpen(){let{contentEl:e}=this;e.empty(),e.addClass("docferry-upload-consent-modal"),Ct(this);let t=e.createDiv({cls:"docferry-consent-header"});Mt(t,"docferry-consent-logo").setAttr("aria-hidden","true");let r=t.createDiv({cls:"docferry-consent-copy"}),o=this.context==="startup"?"Privacy and security":this.context==="detailed_note"?"Before DocFerry prepares this link":"Before you publish";r.createEl("h2",{text:o,cls:"docferry-heading docferry-heading-2"}),r.createEl("p",{text:"Your vault stays on this device. DocFerry uploads content only when you choose to share or save a public link."});let l=e.createDiv({cls:"docferry-consent-summary"});Dn(l,"file-check-2","You choose what leaves Obsidian","Only the note, folder, files, or public link you select. Some supported links may use external AI to prepare a note."),Dn(l,"shield-check","Protected during transfer and storage","Connections use HTTPS and stored content is encrypted. Attachments may upload straight to Tencent Cloud storage with a short-lived credential."),Dn(l,"sliders-horizontal","You stay in control","Add a password or expiry, and stop a share whenever you need to."),e.createEl("p",{cls:"docferry-consent-boundary",text:"DocFerry must decrypt content to display a share or create an import. This is not end-to-end or zero-knowledge encryption."});let d=e.createEl("details",{cls:"docferry-consent-details"});d.createEl("summary",{text:"Privacy details"});let b=d.createDiv({cls:"docferry-consent-details-body"});b.createEl("h3",{text:"What DocFerry receives",cls:"docferry-heading docferry-heading-4"}),b.createEl("p",{text:"Sharing uploads the selected note or folder, its web snapshot, and referenced local files. Saving a supported public link sends its URL to DocFerry. For supported media, DocFerry may send a public YouTube URL or bounded audio or video content, including a reviewed public Bilibili stream, through OpenRouter to a server-selected AI model to create the note. OpenRouter and the selected model provider process that input. DocFerry does not send your Bondie identity, browser cookies, history, profile, or other vault files."}),b.createEl("p",{text:"To keep publishing fast, referenced images and attachments may upload directly from this device to Tencent Cloud Object Storage (COS), a third-party storage provider. DocFerry issues a temporary credential that lasts about 30 minutes, works only for that single upload, and is never saved by the plugin. Only files referenced by the note you publish, and the optional Pro theme style snapshot, use this path; your note text is sent to DocFerry, not to cloud storage. If direct upload is unavailable or fails, the file is uploaded through the DocFerry server instead."}),b.createEl("h3",{text:"Passwords, sessions, and retention",cls:"docferry-heading docferry-heading-4"}),b.createEl("p",{text:"Share passwords are stored as one-way hashes. Your account token is stored by your operating system's secure storage on this device, not in plugin data. Temporary import content is cleared after its retention period. Uploaded assets stay stored while a share is live, and unreferenced assets become eligible for deletion after 7 days. Stopping a share makes its content unavailable right away; stored content is cleared after its retention period. Anyone with the link, and its password when enabled, can view the shared content."});let y=b.createEl("a",{text:"Read the DocFerry Privacy Policy",href:"https://docferry.bondie.io/privacy"});y.setAttr("target","_blank"),y.setAttr("rel","noopener noreferrer");let S=e.createDiv({cls:"modal-button-container docferry-consent-actions"}),x=S.createEl("button",{text:this.context==="startup"?"Not now":"Cancel",attr:{type:"button"}}),k=S.createEl("button",{text:this.context==="startup"||this.context==="detailed_note"?"Continue":"Publish",cls:"mod-cta",attr:{type:"button"}});x.addEventListener("click",()=>this.closeWith(!1)),k.addEventListener("click",()=>this.closeWith(!0))}onClose(){this.settled||(this.settled=!0,this.resolve(!1)),this.contentEl.empty()}closeWith(e){this.settled=!0,this.resolve(e),this.close()}};function Dn(a,u,e,t){let r=a.createDiv({cls:"docferry-consent-summary-item"}),o=r.createSpan({cls:"docferry-consent-summary-icon",attr:{"aria-hidden":"true"}});(0,Mr.setIcon)(o,u);let l=r.createDiv();l.createEl("h3",{text:e,cls:"docferry-heading docferry-heading-4"}),l.createEl("p",{text:t})}function Fi(a,u,e){let t=Ii(a||"");if(t&&e(t))return t;let r=Ii(u);return r&&e(r)?r:null}function Ii(a){let u=a.trim();if(!u||Uo(u))return null;if(/^obsidian:\/\//i.test(u)){let e=Oo(u);return xn(e||u.replace(/^obsidian:\/\//i,""))}return/^[a-z][a-z0-9+.-]*:\/\//i.test(u)?null:xn(u)}function Uo(a){return Array.from(a).some(u=>{let e=u.charCodeAt(0);return e<=31||e===127})}function Oo(a){try{return new URL(a).searchParams.get("file")||null}catch(u){return null}}function xn(a){let u=a.replace(/\\/g,"/").replace(/^\/+/,"").replace(/\/{2,}/g,"/").trim();return!u||u==="."||u.split("/").some(e=>e==="..")?null:u}function Rt(a,u=new Date){return _o(jo(a)).replace(/[\\/:*?"<>|]+/g,"-").replace(/\s+/g," ").trim().replace(/^\.+|\.+$/g,"").slice(0,120).trim()||`docferry-import-${u.toISOString().replace(/[-:.TZ]/g,"").slice(0,14)}`}function _o(a){return Array.from(a,u=>{let e=u.charCodeAt(0);return e<=31||e===127?" ":u}).join("")}function jo(a){return typeof a=="string"?a:typeof a=="number"||typeof a=="boolean"||typeof a=="bigint"?String(a):""}function Li(){var u,e;return`plugin-${((e=(u=window.crypto)==null?void 0:u.randomUUID)==null?void 0:e.call(u))||`${Date.now()}-${Math.random().toString(36).slice(2)}`}`}var Mi="docferry-obsidian-theme-snapshot.css",Ho=3,Ni="docferry-privacy-security-disclosure-v8",qo=["docferry"],Vo=900*1e3,Ko=[2e3,5e3,1e4,2e4,3e4,6e4,9e4,12e4],Nr=class extends H.Plugin{constructor(){super(...arguments);this.settingTab=null;this.uploadNoticeOpen=!1;this.billingReturnRefreshGeneration=0;this.pendingBillingReturnRefreshUntil=0;this.billingReturnRefreshInFlight=!1;this.billingSessionRecoveryUntil=0;this.activeVaultDragPath="";this.lastActiveMarkdownPath="";this.mediaNoteRecoveryInFlight=!1;this.pendingPublishIntent=null;this.shareImportCommitQueue=Promise.resolve();this.settingsSaveQueue=Promise.resolve();this.unloaded=!1;this.pendingTimeouts=new Set;this.stagedSessionTokenToRevoke="";this.publishInFlight=new Set;this.notePublishInFlight=!1}onunload(){var e;this.unloaded=!0;for(let t of this.pendingTimeouts)window.clearTimeout(t);this.pendingTimeouts.clear(),(e=this.auth)==null||e.dispose()}scheduleTimeout(e,t){if(this.unloaded)return;let r=window.setTimeout(()=>{this.pendingTimeouts.delete(r),this.unloaded||e()},t);this.pendingTimeouts.add(r)}async onload(){await this.loadSettings(),this.api=new dr(()=>this.docferrySettings,this.manifest.version,e=>this.handleInvalidProductSession(e)),await this.reconcileStagedSessionToken(),await this.reconcileCommittedSharePublish(),this.auth=new hr(this.api,async(e,t)=>{var b,y,S,x;if(this.unloaded)return;this.billingSessionRecoveryUntil=0;let r=this.docferrySettings.pendingSharePublish;if(r&&t.product_subject_id&&r.ownerProductSubjectId!==t.product_subject_id)throw await this.rejectMismatchedLoginToken(e),new ut("An unfinished share belongs to another Bondie account. Sign in with that account and finish or stop the share first.");let o=this.docferrySettings.pendingMediaNoteSubmission;if(o&&t.product_subject_id&&o.ownerProductSubjectId!==t.product_subject_id)try{await tr(this.mediaNoteSubmissionDeps(),o)}catch(k){throw await this.rejectMismatchedLoginToken(e),new ut("Could not confirm the state of your previous detailed note. Check your connection, then sign in again.")}let l=this.docferrySettings.pendingMediaNoteImport;if(l&&t.product_subject_id&&l.ownerProductSubjectId!==t.product_subject_id)throw await this.rejectMismatchedLoginToken(e),new ut("This detailed note belongs to another Bondie account. Sign in with the account that started it, then resume or cancel it.");let d=this.docferrySettings.sessionToken;if(d&&d!==e)await this.replaceSessionToken(d,e);else try{this.adoptSessionToken(e)}catch(k){throw this.debug("secure session token adoption failed",k),await this.revokeUnadoptedToken(e),new ut("DocFerry could not store your sign-in securely. Update Obsidian, then start login again.")}this.docferrySettings.connectedAccount=t.product_subject_id?{productSubjectId:t.product_subject_id,productKey:(b=t.product_key)!=null?b:null,productInstanceId:(y=t.product_instance_id)!=null?y:null,displayUser:(S=t.display_user)!=null?S:null,connectedAt:new Date().toISOString()}:null,await this.saveSettings(),(x=this.settingTab)==null||x.refreshForAuthChange(),this.refreshDashboardAuth();try{await this.loadMembership(!0)}catch(k){this.debug("membership refresh after login failed",k)}await this.resumePendingPublishIntent()},()=>({clientInstanceId:this.docferrySettings.clientInstanceId,pluginVersion:this.manifest.version,platform:"obsidian",instanceType:"obsidian_plugin"}),()=>Pi(this.app.secretStorage),async(e,t,r)=>{wn(this.app.secretStorage,{state:e,startedAt:t,verifier:r})}),this.auth.resumePendingLogin().catch(e=>{this.debug("pending login resume failed",e)}),this.settingTab=new wr(this.app,this),this.addSettingTab(this.settingTab),this.registerView(xt,e=>new wt(e,this)),this.registerEvent(this.app.workspace.on("file-menu",(e,t)=>{if(t instanceof H.TFolder){if(!Nt(this.docferrySettings.membership))return;e.addItem(r=>r.setTitle("Publish folder with DocFerry").setIcon("folder-up").onClick(()=>void this.publishFolder(t)))}})),this.registerEvent(this.app.workspace.on("active-leaf-change",e=>{let t=e==null?void 0:e.view;t instanceof H.MarkdownView&&t.file instanceof H.TFile&&t.file.extension==="md"&&(this.lastActiveMarkdownPath=t.file.path)})),this.addRibbonIcon("ship","Open dashboard",()=>{this.activateDashboardView().then(e=>e==null?void 0:e.showHomePage())});for(let e of qo)this.registerObsidianProtocolHandler(e,async t=>{let o=mi(t);if(o.kind==="billing-return"){await this.handleBillingReturn(o.status);return}if(o.kind==="import"){await this.importShareUrl(o.url);return}new H.Notice("This DocFerry link is not supported.")});this.registerDomEvent(window,"focus",()=>{this.refreshAfterPendingBillingReturn()}),this.registerDomEvent(activeDocument,"visibilitychange",()=>{activeDocument.visibilityState==="visible"&&this.refreshAfterPendingBillingReturn()}),this.registerDomEvent(activeDocument,"dragstart",e=>{let t=e.target instanceof Element?e.target.closest("[data-path]"):null,r=(t==null?void 0:t.dataset.path)||"";this.activeVaultDragPath=this.app.vault.getAbstractFileByPath(r)?r:""},!0),this.registerDomEvent(activeDocument,"dragend",()=>{this.scheduleTimeout(()=>{this.activeVaultDragPath=""},0)},!0),this.addCommand({id:"open-dashboard",name:"Open dashboard",callback:()=>{this.activateDashboardView().then(e=>e==null?void 0:e.showHomePage())}}),this.addCommand({id:"open-shares",name:"Open shared links",callback:()=>{this.activateDashboardView().then(e=>e==null?void 0:e.showSharesPage())}}),this.addCommand({id:"open-account",name:"Open account",callback:()=>{this.activateDashboardView().then(e=>e==null?void 0:e.showAccountPage())}}),this.addCommand({id:"publish-current-note",name:"Publish current note",checkCallback:e=>{let t=this.getActiveMarkdownFile();return t?(e||this.publishFile(t),!0):!1}}),this.addCommand({id:"publish-current-folder",name:"Publish current note folder",checkCallback:e=>{var r;let t=(r=this.getActiveMarkdownFile())==null?void 0:r.parent;return!(t instanceof H.TFolder)||!Nt(this.docferrySettings.membership)?!1:(e||this.publishFolder(t),!0)}}),this.addCommand({id:"copy-share-link",name:"Copy share link",checkCallback:e=>{let t=this.getActiveMarkdownFile();return t?(e||this.copyShareLink(t),!0):!1}}),this.addCommand({id:"stop-sharing-current-note",name:"Stop sharing current note",checkCallback:e=>{let t=this.getActiveMarkdownFile();return!t||!this.currentShareMeta(t).id?!1:(e||this.stopSharing(t),!0)}}),this.addCommand({id:"show-linked-note-status",name:"Show linked note status",checkCallback:e=>{let t=this.getActiveMarkdownFile();return!t||!this.currentShareMeta(t).id?!1:(e||this.showLinkStatus(t),!0)}}),this.addCommand({id:"import-share-url",name:"Import share URL",callback:()=>{this.importShareUrl()}}),this.addCommand({id:"import-web-link",name:"Import web or media link",callback:()=>{this.activateDashboardView().then(e=>e==null?void 0:e.showHomePage())}}),this.addCommand({id:"connect-account",name:"Connect account",callback:()=>{this.startLogin()}}),this.addCommand({id:"create-account",name:"Create Bondie account",callback:()=>{this.startSignup()}}),this.addCommand({id:"reconnect-account",name:"Reconnect account",callback:()=>{this.reconnectAccount()}}),this.registerEvent(this.app.workspace.on("file-menu",(e,t)=>{if(!(t instanceof H.TFile)||t.extension!=="md")return;this.currentShareMeta(t).id?(e.addItem(o=>{o.setTitle("Update share link").setIcon("upload-cloud").onClick(()=>void this.publishFile(t))}),e.addItem(o=>{o.setTitle("Copy share link").setIcon("copy").onClick(()=>void this.copyShareLink(t))}),e.addItem(o=>{o.setTitle("Show linked note status").setIcon("list-checks").onClick(()=>void this.showLinkStatus(t))}),e.addItem(o=>{o.setTitle("Stop sharing").setIcon("unlink").onClick(()=>void this.stopSharing(t))})):e.addItem(o=>{o.setTitle("Publish share link").setIcon("share").onClick(()=>void this.publishFile(t))})})),this.app.workspace.onLayoutReady(()=>{this.reconcileCommittedSharePublish().catch(e=>{this.debug("pending share journal reconciliation failed",e)}),this.docferrySettings.sessionToken&&this.refreshMembershipForDashboardOpen(),this.docferrySettings.sessionToken&&this.docferrySettings.pendingMediaNoteImport?this.scheduleTimeout(()=>void this.resumeActiveMediaImport(),900):this.docferrySettings.sessionToken&&this.docferrySettings.pendingMediaNoteSubmission&&this.scheduleTimeout(()=>void this.recoverPendingMediaNoteSubmission(),900),this.scheduleTimeout(()=>{this.showUploadNoticeIfNeeded(!1)},600)})}async loadSettings(){let e=await this.loadData(),t=new Set(Object.keys(Ye)),r={...Ye};for(let S of t)e&&Object.prototype.hasOwnProperty.call(e,S)&&(r[S]=e[S]);this.docferrySettings=r;let o=!!(e&&Object.keys(e).some(S=>!t.has(S))),l=ki(this.docferrySettings,Ye.serverUrl);o=l||o;try{let S=Ti(this.app.secretStorage,this.docferrySettings.sessionToken,l);this.docferrySettings.sessionToken=S.token,this.stagedSessionTokenToRevoke=S.stagedTokenToRevoke,S.scrubLegacy&&(o=!0),l?Cn(this.app.secretStorage):e&&Ri(this.app.secretStorage,{state:e.pendingAuthState,startedAt:e.pendingAuthStartedAt,verifier:e.pendingAuthVerifier})&&(o=!0)}catch(S){this.docferrySettings.sessionToken="",o=!0,this.debug("secure session token storage unavailable",S),new H.Notice("DocFerry could not access secure credential storage. Update Obsidian, then sign in again.",8e3)}this.docferrySettings.clientInstanceId||(this.docferrySettings.clientInstanceId=`obs_${crypto.randomUUID()}`,o=!0);let d=_t(this.docferrySettings.defaultImportFolder)||Ye.defaultImportFolder;this.docferrySettings.defaultImportFolder!==d&&(this.docferrySettings.defaultImportFolder=d,o=!0);let b=this.docferrySettings.pendingMediaNoteImport;b&&(!b.jobId||!b.ownerProductSubjectId||!b.sourceUrl)&&(this.docferrySettings.pendingMediaNoteImport=null,o=!0);let y=this.docferrySettings.pendingMediaNoteSubmission;y&&(!y.key||!y.ownerProductSubjectId||!y.sourceUrl)&&(this.docferrySettings.pendingMediaNoteSubmission=null,o=!0),o&&await this.saveSettings()}async saveSettings(){let e={...this.docferrySettings,sessionToken:""},t=this.settingsSaveQueue.then(()=>this.saveData(e));this.settingsSaveQueue=t.catch(()=>{}),await t}adoptSessionToken(e){Ir(this.app.secretStorage,e),this.docferrySettings.sessionToken=e}async replaceSessionToken(e,t){try{yn(this.app.secretStorage,e),this.stagedSessionTokenToRevoke=e}catch(r){this.debug("previous session cleanup staging failed",r);try{await this.revokeUnadoptedToken(t)}catch(o){this.debug("replacement session cleanup failed",o)}throw new ut("DocFerry could not store your sign-in securely. Your previous account remains connected.")}try{Ir(this.app.secretStorage,t)}catch(r){this.debug("replacement session commit failed",r),this.stagedSessionTokenToRevoke="";try{Fr(this.app.secretStorage)}catch(o){this.debug("uncommitted session staging cleanup deferred",o)}try{await this.revokeUnadoptedToken(t)}catch(o){this.debug("replacement session cleanup deferred",o)}throw new ut("DocFerry could not safely store the new sign-in. Your previous account remains connected.")}this.docferrySettings.sessionToken=t;try{await this.api.logoutToken(e)}catch(r){if(!Ue(r)){this.debug("previous session cleanup deferred",r),new H.Notice("Your new account is connected. DocFerry will finish closing the previous session when online.",8e3);return}}this.stagedSessionTokenToRevoke="";try{Fr(this.app.secretStorage)}catch(r){this.debug("previous session staging cleanup deferred",r)}}async revokeUnadoptedToken(e){this.stagedSessionTokenToRevoke=e;let t=!1;try{yn(this.app.secretStorage,e),t=!0}catch(r){this.debug("unadopted session staging failed",r)}try{await this.api.logoutToken(e)}catch(r){if(!Ue(r))throw this.debug("unadopted session token revoke failed",r),new ut(t?"DocFerry could not close the unused sign-in. It remains queued for secure cleanup; try again when connected.":"DocFerry could not close the unused sign-in or save a durable cleanup record. Keep Obsidian open and try again.")}try{Fr(this.app.secretStorage),this.stagedSessionTokenToRevoke=""}catch(r){this.debug("unadopted session staging cleanup deferred",r)}}async reconcileStagedSessionToken(){let e=this.stagedSessionTokenToRevoke;if(!e)return!0;try{return await this.revokeUnadoptedToken(e),!0}catch(t){return this.debug("staged session cleanup failed",t),new H.Notice("DocFerry is still closing an unfinished sign-in. Your current account remains unchanged.",8e3),!1}}clearSessionTokenCustody(){this.docferrySettings.sessionToken="";try{Ir(this.app.secretStorage,"")}catch(e){this.debug("secure session token cleanup failed",e)}}async testConnection(){var e,t,r,o,l,d,b,y,S,x,k,F,P;try{if(await this.api.health(),!this.docferrySettings.sessionToken){new H.Notice("DocFerry server is reachable, but no Bondie account is connected.");return}let L=await this.api.whoami();if(L.product_subject_id){this.docferrySettings.connectedAccount={productSubjectId:L.product_subject_id,productKey:(e=L.product_key)!=null?e:null,productInstanceId:(t=L.product_instance_id)!=null?t:null,displayUser:(l=(o=L.display_user)!=null?o:(r=this.docferrySettings.connectedAccount)==null?void 0:r.displayUser)!=null?l:null,connectedAt:(b=(d=this.docferrySettings.connectedAccount)==null?void 0:d.connectedAt)!=null?b:new Date().toISOString()},await this.saveSettings(),(y=this.settingTab)==null||y.refreshForAuthChange(),this.refreshDashboardAuth();try{await this.loadMembership(!0)}catch(N){this.debug("membership refresh after connection test failed",N)}}let j=((x=(S=this.docferrySettings.connectedAccount)==null?void 0:S.displayUser)==null?void 0:x.name)||((F=(k=this.docferrySettings.connectedAccount)==null?void 0:k.displayUser)==null?void 0:F.email)||((P=this.docferrySettings.connectedAccount)==null?void 0:P.productSubjectId.slice(-8))||"Bondie account";if(L.billing_session_ready===!1){new H.Notice(`DocFerry server is reachable. Signed in as ${j}; reconnect before managing billing.`);return}new H.Notice(`DocFerry server is reachable. Signed in as ${j}.`)}catch(L){if(Ue(L))return;new H.Notice(this.formatError(L,"Connection failed"))}}async startLogin(){await this.reconcileStagedSessionToken()&&await this.auth.startLogin()}async startSignup(){await this.reconcileStagedSessionToken()&&await this.finishPendingImportBeforeAccountChange()&&await this.auth.startLogin({signup:!0})}async reconnectAccount(){await this.reconcileStagedSessionToken()&&await this.finishPendingImportBeforeAccountChange()&&await this.auth.startLogin({promptLogin:!0})}async disconnectAccount(){var e;if(await this.finishPendingImportBeforeAccountChange()){try{await this.auth.cancelPendingLogin()}catch(t){this.debug("pending login cleanup during disconnect failed",t)}if(this.docferrySettings.sessionToken)try{await this.api.logout()}catch(t){if(!Ue(t)){new H.Notice(this.formatError(t,"Could not disconnect"));return}}this.clearLocalBondieAccount(),await this.saveSettings(),(e=this.settingTab)==null||e.refreshForAuthChange(),this.refreshDashboardAuth(),new H.Notice("Bondie account disconnected.")}}async rejectMismatchedLoginToken(e){await this.revokeUnadoptedToken(e)}async finishPendingImportBeforeAccountChange(){if(!await this.finishPendingShareBeforeAccountChange())return!1;let e=this.docferrySettings.pendingMediaNoteSubmission;if(e)try{await tr(this.mediaNoteSubmissionDeps(),e)}catch(t){return new H.Notice(this.formatError(t,"Could not confirm the state of your previous detailed note"),8e3),!1}if(!this.docferrySettings.pendingMediaNoteImport)return!0;try{await this.cancelActiveMediaImport()}catch(t){return new H.Notice(this.formatError(t,"Could not cancel the current detailed note"),8e3),!1}return this.docferrySettings.pendingMediaNoteImport?(new H.Notice("Finish or cancel the current detailed note before changing Bondie accounts.",8e3),!1):!0}async finishPendingShareBeforeAccountChange(){var b;let e=this.docferrySettings.pendingSharePublish;if(!e)return!0;let t=(b=this.docferrySettings.connectedAccount)==null?void 0:b.productSubjectId;if(!t||e.ownerProductSubjectId!==t)return new H.Notice("An unfinished share belongs to another Bondie account. Reconnect that account and finish the share before changing accounts.",8e3),!1;let r=this.sharePublishSubmissionDeps(),o;try{o=await this.api.resolveShareCreate(e.key),await r.store.save({...e,response:o})}catch(y){return y instanceof Oe&&(y.code==="share_idempotency_not_found"||y.code==="share_idempotency_inactive")?(await Tt(r.store,e.key),!0):(new H.Notice(this.formatError(y,"Could not confirm the unfinished share"),8e3),!1)}let l=this.markdownFileByPath(e.filePath);if(!l&&e.sourceHash&&(l=await this.findUniqueMarkdownFileBySourceHash(e.sourceHash)),l)return await dn(this.app,l,o,{passwordEnabled:o.password_enabled,expiresAt:o.expires_at}),await Tt(r.store,e.key),!0;if(!await Yn(this.app,o.title||"Recovered share",e.filePath))return!1;try{return await this.api.deleteShare(o.share_id),await Tt(r.store,e.key),!0}catch(y){return new H.Notice(this.formatError(y,"Could not stop the unfinished share"),8e3),!1}}clearLocalBondieAccount(e=!1){this.billingReturnRefreshGeneration++,this.clearPendingBillingReturnRefresh(),this.clearSessionTokenCustody(),this.docferrySettings.connectedAccount=null,this.docferrySettings.membership=null,e||(this.docferrySettings.pendingMediaNoteImport=null),e||(this.docferrySettings.pendingMediaNoteSubmission=null)}handleInvalidProductSession(e){var t;Ue(e)&&(!this.docferrySettings.sessionToken&&!this.docferrySettings.connectedAccount&&!this.docferrySettings.membership||(this.clearLocalBondieAccount(!0),(t=this.settingTab)==null||t.refreshForAuthChange(),this.refreshDashboardAuth(),this.saveSettings().catch(r=>this.debug("invalid session cleanup failed",r)),new H.Notice("Your Bondie session ended. Log in again.")))}async listShares(){try{return(await this.api.listShares()).shares}catch(e){if(Ue(e))return[];throw e}}async listFolderShares(){return this.docferrySettings.sessionToken?(await this.api.listFolderShares()).folder_shares:[]}async stopFolderShareFromList(e){await fr(this.app,e.title,e.source_folder)&&(await this.api.deleteFolderShare(e.folder_share_id),new H.Notice("Folder share stopped."),this.refreshDashboardShare())}async deleteShareHistory(e){await Gr(this.app,e.title||e.source_path,e.source_path)&&(await this.api.deleteShareRecord(e.share_id),await this.clearLocalShareMetaForId(e.share_id),new H.Notice("Share history deleted."),this.refreshDashboardShare())}async deleteFolderShareHistory(e){await Gr(this.app,e.title,e.source_folder)&&(await this.api.deleteFolderShareRecord(e.folder_share_id),new H.Notice("Folder share history deleted."),this.refreshDashboardShare())}async refreshMembership(e=!1){if(!this.docferrySettings.sessionToken){await this.auth.startLogin()&&new H.Notice("Finish signing in in your browser, then return to share this note.");return}try{await this.loadMembership(e),new H.Notice("Access refreshed.")}catch(t){if(this.isBillingSessionRequired(t)){await this.recoverBillingSession(!0);return}if(Ue(t))return;new H.Notice(this.formatError(t,"Access refresh failed"))}}async openMembershipCenter(){if(!this.docferrySettings.serverUrl){new H.Notice("Configure server URL first.");return}if(!this.docferrySettings.sessionToken){await this.auth.startLogin()&&new H.Notice("Finish signing in in your browser, then return to share this folder.");return}let e=`${this.docferrySettings.serverUrl.replace(/\/+$/,"")}/dashboard/plans?refresh_membership=1`;if(this.markPendingBillingReturnRefresh(),this.docferrySettings.sessionToken)try{let t=await this.api.createDashboardLink("/dashboard/plans?refresh_membership=1");$e(t.dashboard_url),new H.Notice("DocFerry access page opened in your browser.");return}catch(t){Ue(t)||new H.Notice(this.formatError(t,"Access page needs reconnect"))}$e(e)}async openDashboardHome(){if(!this.docferrySettings.serverUrl){new H.Notice("Configure server URL first.");return}let e=`${this.docferrySettings.serverUrl.replace(/\/+$/,"")}/dashboard`;if(this.docferrySettings.sessionToken)try{let t=await this.api.createDashboardLink("/dashboard");$e(t.dashboard_url);return}catch(t){this.debug("dashboard link failed",t)}$e(e)}async requestAccessUpgrade(e){if(!this.docferrySettings.sessionToken){new H.Notice("Connect your Bondie account before sending feedback.");return}try{let r=await this.api.createDashboardLink("/dashboard/support#feedback");$e(r.dashboard_url),new H.Notice("Feedback page opened in your browser.")}catch(t){if(Ue(t))return;new H.Notice(this.formatError(t,"Feedback page needs reconnect"))}}async activateDashboardView(e=!0){this.rememberActiveMarkdownFile();let t=this.app.workspace.getLeavesOfType(xt)[0];if(t){await this.app.workspace.revealLeaf(t);let l=t.view instanceof wt?t.view:null;return e&&this.refreshMembershipForDashboardOpen(),l}let r=this.app.workspace.getLeaf("tab");await r.setViewState({type:xt,active:!0}),await this.app.workspace.revealLeaf(r);let o=r.view instanceof wt?r.view:null;return e&&this.refreshMembershipForDashboardOpen(),o}openSettingsTab(){let e=this.app;if(!e.setting){new H.Notice("Open Settings, then Community plugins, then DocFerry.");return}e.setting.open(),e.setting.openTabById(this.manifest.id)}async openSharesPage(){var r,o;(o=(r=this.app.setting)==null?void 0:r.close)==null||o.call(r);let t=await this.activateDashboardView();t==null||t.showSharesPage()}getActiveNoteLabel(){var e,t;return(t=(e=this.getActiveMarkdownFile())==null?void 0:e.basename)!=null?t:null}async publishActiveNote(){let e=this.getActiveMarkdownFile();if(!e){new H.Notice("Open a Markdown note before sharing.");return}await this.publishFile(e)}async openShareLinks(e){try{let t=await this.api.getShareLinks(e.share_id);new er(this.app,e.title||e.source_path,t).open()}catch(t){if(Ue(t))return;new H.Notice(this.formatError(t,"Link status failed"))}}async updateShareFromList(e){let t=await this.resolveVaultId();if(qr(e.vault_id,t)==="wrong-vault"){new H.Notice("Open the source vault to update that share.");return}let r=this.findSharedFileByShareId(e.share_id);if(!r){let o=this.app.vault.adapter,l=typeof o.basePath=="string"?o.basePath:"",d=this.markdownFileByPath(e.source_path);if(d||(d=this.markdownFileByPath(Hn(e.source_path,l))),d)if(!this.currentShareMeta(d).id)r=d;else{new H.Notice("The note at the remembered path is linked to a different share. Open the moved source note to update that share.",8e3);return}}if(!r){new H.Notice("Open the source note in this vault to update that share.");return}await this.publishFile(r,e)}async updateFolderShareFromList(e){let t=await this.resolveVaultId();if(qr(e.vault_id,t)==="wrong-vault"){new H.Notice("Open the source vault to update that folder share.");return}let r=this.app.vault.getAbstractFileByPath(e.source_folder);if(!(r instanceof H.TFolder)){new H.Notice("Open the source folder in this vault to update that share.");return}await this.publishFolder(r)}async stopShareFromList(e){if(!await fr(this.app,e.title||e.source_path,e.source_path))return;let r=new H.Notice("Stopping share...",0);try{await this.api.deleteShare(e.share_id),await this.clearLocalShareMetaForId(e.share_id),this.refreshDashboardShare(),r.hide(),new H.Notice("Share stopped. The link is no longer available.")}catch(o){if(r.hide(),Ue(o))return;new H.Notice(this.formatError(o,"Stop sharing failed"))}}async loadMembership(e){var r,o,l,d;let t=await this.api.getMembership(e);if(t.product_subject_id){let b=this.docferrySettings.connectedAccount;(!b||b.productSubjectId!==t.product_subject_id)&&(this.docferrySettings.connectedAccount={productSubjectId:t.product_subject_id,productKey:t.product_key,productInstanceId:(r=b==null?void 0:b.productInstanceId)!=null?r:null,displayUser:(b==null?void 0:b.productSubjectId)===t.product_subject_id&&(o=b.displayUser)!=null?o:null,connectedAt:(l=b==null?void 0:b.connectedAt)!=null?l:new Date().toISOString()})}if(this.docferrySettings.membership=pi(t),await this.saveSettings(),(d=this.settingTab)==null||d.refreshForAuthChange(),this.refreshDashboardAuth(),t.unavailable_reason==="synapsehub_user_session_required")throw new Oe("Reconnect your Bondie account before refreshing paid access.",401,t.unavailable_reason)}refreshMembershipForDashboardOpen(){this.docferrySettings.sessionToken&&this.loadMembership(!0).catch(async e=>{if(this.isBillingSessionRequired(e)){await this.recoverBillingSession();return}Ue(e)||this.debug("dashboard membership refresh failed",e)})}async handleBillingReturn(e){let t=await this.activateDashboardView(!1);if(t==null||t.showAccountPage(),e==="cancel"){this.clearPendingBillingReturnRefresh(),new H.Notice("Checkout cancelled. Access was not changed.");try{await this.loadMembership(!0)}catch(r){if(this.isBillingSessionRequired(r)){await this.recoverBillingSession();return}if(Ue(r))return;new H.Notice(this.formatError(r,"Access refresh failed"))}t==null||t.showAccountPage();return}this.clearPendingBillingReturnRefresh(),new H.Notice("Payment returned. Refreshing access...");try{await this.loadMembership(!0),t==null||t.showAccountPage();let r=this.docferrySettings.membership;r&&r.planKey!=="free"?new H.Notice(`Access active: ${r.planDisplayName}.`):(new H.Notice("Access still shows Free. DocFerry will keep refreshing while the account update completes.",8e3),this.scheduleMembershipRefreshes())}catch(r){if(this.isBillingSessionRequired(r)){await this.recoverBillingSession();return}if(Ue(r))return;new H.Notice(this.formatError(r,"Access refresh failed")),this.scheduleMembershipRefreshes()}}async refreshAfterPendingBillingReturn(){if(!this.pendingBillingReturnRefreshUntil||Date.now()>this.pendingBillingReturnRefreshUntil){this.clearPendingBillingReturnRefresh();return}if(!this.billingReturnRefreshInFlight&&this.docferrySettings.sessionToken){this.clearPendingBillingReturnRefresh(),this.billingReturnRefreshInFlight=!0;try{let e=await this.activateDashboardView(!1);e==null||e.showAccountPage(),await this.loadMembership(!0);let t=this.docferrySettings.membership;t&&t.planKey!=="free"?new H.Notice(`Access active: ${t.planDisplayName}.`):(new H.Notice("Refreshing access after billing. DocFerry will check again while the account update completes.",8e3),this.scheduleMembershipRefreshes())}catch(e){if(this.isBillingSessionRequired(e)){await this.recoverBillingSession();return}if(Ue(e))return;this.debug("billing return focus refresh failed",e),this.scheduleMembershipRefreshes()}finally{this.billingReturnRefreshInFlight=!1}}}markPendingBillingReturnRefresh(){this.docferrySettings.sessionToken&&(this.pendingBillingReturnRefreshUntil=Date.now()+Vo)}clearPendingBillingReturnRefresh(){this.pendingBillingReturnRefreshUntil=0}scheduleMembershipRefreshes(){if(!this.docferrySettings.sessionToken)return;let e=++this.billingReturnRefreshGeneration;for(let t of Ko)this.scheduleTimeout(()=>void this.runScheduledMembershipRefresh(e),t)}async runScheduledMembershipRefresh(e){if(!this.unloaded&&e===this.billingReturnRefreshGeneration)try{await this.loadMembership(!0);let t=this.docferrySettings.membership;t&&t.planKey!=="free"&&(this.billingReturnRefreshGeneration++,new H.Notice(`Access active: ${t.planDisplayName}.`))}catch(t){if(this.isBillingSessionRequired(t)){await this.recoverBillingSession();return}if(Ue(t))return;this.debug("scheduled membership refresh failed",t)}}isBillingSessionRequired(e){return e instanceof Oe?e.code==="synapsehub_user_session_required":!e||typeof e!="object"?!1:"code"in e&&e.code==="synapsehub_user_session_required"}async recoverBillingSession(e=!1){if(this.unloaded)return;if(!e&&Date.now(){N.setMessage($)});N.setMessage(S?"Updating share link...":"Publishing share link...");let z=this.sharePublishSubmissionDeps(),G=S?await this.updateOrCreateShare(S,e.path,q,fi(j.expirySelection,j.expiresAt,this.docferrySettings.defaultExpiresInDays),N,z):await Rr(z,{filePath:e.path,payload:q,payloadHash:await Bt(mn(q)),sourceHash:q.source_hash,ownerProductSubjectId:(M=(C=this.docferrySettings.connectedAccount)==null?void 0:C.productSubjectId)!=null?M:""});if(!G){N.hide();return}let Q=G.response;if("filePathChanged"in G&&G.filePathChanged&&!await Wn(this.app,G.originalFilePath,j.title,e.path)){if(!await Xn(this.app,Q.title||j.title,G.originalFilePath)){N.hide();return}await this.api.deleteShare(Q.share_id),G.operationKey&&await Tt(z.store,G.operationKey),N.hide(),new H.Notice("The recovered public link was stopped. Publish this note again to create a new link.",8e3);return}"payloadChanged"in G&&G.payloadChanged&&(N.setMessage("Applying your current note and sharing options..."),Q=await this.api.updateShare(Q.share_id,{...q,password_mode:j.passwordEnabled?q.password_mode:"clear"})),r&&await Dr(this.app,e,r),y!=null&&y.url&&await Dr(this.app,e,y),"legacyMeta"in G&&((D=G.legacyMeta)!=null&&D.url)&&await Dr(this.app,e,G.legacyMeta),await dn(this.app,e,Q,{passwordEnabled:Q.password_enabled,expiresAt:Q.expires_at}),G.operationKey&&await Tt(z.store,G.operationKey),N.hide();try{await navigator.clipboard.writeText(Q.url),new H.Notice("Share link copied")}catch($){new H.Notice("Share updated, but the link could not be copied. Copy it from the result window.")}new nr(this.app,j.title,Q.url,Q.updated_at).open(),this.refreshDashboardShare(),this.debug("publish response",Q.status)}catch(q){if(N.hide(),Ue(q))return;new H.Notice(this.formatError(q,"Publish failed")),this.debug("publish error",q)}}async publishFolder(e){if(this.publishInFlight.has(e.path)){new H.Notice("This folder is already being published. Wait for the current publish to finish.");return}this.publishInFlight.add(e.path);try{await this.publishFolderCore(e)}finally{this.publishInFlight.delete(e.path)}}async publishFolderCore(e){var S,x,k,F;if(!e.path||e.path==="/"){new H.Notice("Choose a folder inside the vault instead of the entire vault.");return}if(!this.docferrySettings.serverUrl){new H.Notice("Configure server URL first.");return}if(!this.docferrySettings.sessionToken){await this.offerLoginToPublish("folder",e.name||this.app.vault.getName(),e.path);return}let t=this.markdownFilesInFolder(e);if(!t.length){new H.Notice("This folder has no Markdown notes to publish.");return}if(!await this.showUploadNoticeIfNeeded(!0))return;try{await this.loadMembership(!0)}catch(P){if(!this.isBillingSessionRequired(P)){new H.Notice(this.formatError(P,"Access check failed"));return}await this.recoverBillingSession(!0);return}let o=this.docferrySettings.membership;if(mr(o,!1)==="upgrade_required"){new H.Notice("Folder sharing is available with DocFerry Pro.");return}if(!o)return;if(t.length>o.maxFolderDocumentCount){new H.Notice(`This folder has ${t.length} notes. Your plan allows ${o.maxFolderDocumentCount}.`);return}let l=await this.resolveVaultId(),d=(await this.api.listFolderShares()).folder_shares.find(P=>P.vault_id===l&&P.source_folder===e.path&&P.status!=="stopped"&&P.status!=="expired");if(mr(o,!!d)==="limit_reached"){new H.Notice(`Your plan allows ${Cr(o.activeFolderShareLimit)} active folder shares. Stop one before publishing another.`);return}let b=await new xr(this.app,{title:(d==null?void 0:d.title)||e.name||this.app.vault.getName(),passwordEnabled:(S=d==null?void 0:d.password_enabled)!=null?S:this.docferrySettings.defaultPasswordEnabled,passwordAlreadySet:!!(d!=null&&d.password_enabled),expiresInDays:hn(d==null?void 0:d.expires_at,this.docferrySettings.defaultExpiresInDays),existingExpiresAt:(x=d==null?void 0:d.expires_at)!=null?x:null,documentCount:t.length,isUpdate:!!d,canUseThemeStyling:o.canUseFullTheme,useThemeStyling:o.canUseFullTheme&&((k=d==null?void 0:d.theme_mode)!=null?k:"full")==="full"}).openAndGetResult();if(!b)return;let y=new H.Notice("Preparing folder share...",0);try{let P=await this.api.createFolderShareDraft({folder_share_id:(F=d==null?void 0:d.folder_share_id)!=null?F:null,vault_id:l,source_folder:e.path,title:b.title,expected_document_count:t.length,theme_mode:b.useThemeStyling&&o.canUseFullTheme?"full":"reader",css_asset_id:null,client:{plugin_id:this.manifest.id,plugin_version:this.manifest.version,obsidian_version:Ui(this.app),vault_name:this.app.vault.getName()}});for(let j=0;j!!this.app.vault.getAbstractFileByPath(b));if(!r)return null;let o=this.app.vault.getAbstractFileByPath(r);return o instanceof H.TFolder||o instanceof H.TFile&&o.extension==="md"?r:null}async publishVaultPath(e){let t=this.app.vault.getAbstractFileByPath((0,H.normalizePath)(e));if(t instanceof H.TFolder){await this.publishFolder(t);return}if(t instanceof H.TFile&&t.extension==="md"){await this.publishFile(t);return}new H.Notice("Choose a Markdown note or folder to share.")}async buildFolderDocumentPayload(e,t,r,o){var k,F;let l=await this.app.vault.read(t),d=await this.uploadLocalAssets(l,t),b=await this.renderHtmlSnapshot(t,l,d,o);if(o&&(b==null?void 0:b.themeMode)!=="full")throw new Error(`Theme styling for ${t.path} could not be prepared safely. The folder was not published.`);let y=null;b!=null&&b.css&&(y=await this.uploadCssSnapshot(b.css));let S=e.path?t.path.slice(e.path.length).replace(/^\/+/,""):t.path;return{route_key:(await Bt(S.toLowerCase())).slice(0,20),relative_path:S,source_hash:`sha256:${await Bt(l)}`,title:t.basename,markdown:l,html_snapshot:(k=b==null?void 0:b.html)!=null?k:null,css_asset_id:(F=y==null?void 0:y.assetId)!=null?F:null,assets:d.linkedAssets.map(P=>({asset_id:P.assetId,role:P.role,original_path:P.originalPath})),navigation_order:r}}markdownFilesInFolder(e){let t=[],r=o=>{for(let l of o.children)l.name.startsWith(".")||(l instanceof H.TFolder?r(l):l instanceof H.TFile&&l.extension==="md"&&t.push(l))};return r(e),t.sort((o,l)=>o.path.localeCompare(l.path))}async copyShareLink(e){let t=this.currentShareMeta(e);if(!t.url||!t.id){await this.publishFile(e);return}let r=await this.verifyShareLinkState(t.id);if(r==="missing"){new H.Notice("This share isn't visible to the current account. It may belong to a different account or may have been deleted. The local reference was kept.",8e3);return}if(r==="inactive"){await Er(this.app,e),this.refreshDashboardShare(),new H.Notice("This share is no longer active. The dead link was not copied; publish again to create a new link.",8e3);return}r==="unknown"&&new H.Notice("Could not verify the share state. Copying the last known link.",8e3),await navigator.clipboard.writeText(t.url),new H.Notice("Share link copied")}async verifyShareLinkState(e){try{let t=await this.api.getShareStatus(e);return ht(t.status)?"live":"inactive"}catch(t){return Vr(t)?"inactive":Gt(t)?"missing":"unknown"}}async updateOrCreateShare(e,t,r,o,l,d){var b,y,S;try{return{response:await this.api.updateShare(e,r)}}catch(x){if(!(x instanceof Oe)||!Gt(x)&&!Vr(x))throw x;let k;if(Gt(x)){let L=this.markdownFileByPath(t),j=L&&(b=this.currentShareMeta(L).url)!=null?b:"";if(!await Jr(this.app,r.title,t,j))return null;k={id:e,url:j}}if(l.setMessage("The existing share is no longer available. Publishing a new link..."),r.password_mode==="keep"&&!r.password)throw new Error("The old password cannot be copied to a new link. Publish again and enter a new password to keep this note protected.");let F={...r,expires_at:o,password_mode:void 0};return{...await Rr(d,{filePath:t,payload:F,payloadHash:await Bt(mn(F)),sourceHash:F.source_hash,ownerProductSubjectId:(S=(y=this.docferrySettings.connectedAccount)==null?void 0:y.productSubjectId)!=null?S:""}),legacyMeta:k}}}async stopSharing(e){let t=this.currentShareMeta(e);if(!t.id){new H.Notice("This note has not been shared.");return}if(!await fr(this.app,e.basename,e.path))return;let o=new H.Notice("Stopping share...",0);try{await this.api.deleteShare(t.id),await Er(this.app,e),this.refreshDashboardShare(),o.hide(),new H.Notice("Share stopped. The link is no longer available.")}catch(l){if(o.hide(),Ue(l))return;new H.Notice(this.formatError(l,"Stop sharing failed"))}}async ensureCanPublishBeforeUpload(e,t){if(!this.docferrySettings.sessionToken)return;try{await this.loadMembership(!0)}catch(d){if(!this.isBillingSessionRequired(d))throw d;await this.recoverBillingSession(!0)}let r=this.docferrySettings.membership;if(!r)return;if(!t&&!r.canCreateShare)throw new Oe(`Your current access allows ${Cr(r.activeShareLimit)} active shares. Stop a share or request more access from Account before publishing.`,403,"membership_share_limit_exceeded",void 0,{active_share_count:r.activeShareCount,active_share_limit:r.activeShareLimit});let o=await this.app.vault.read(e),l=new TextEncoder().encode(o).byteLength;if(l>r.maxSingleFileSizeBytes)throw new Oe(`This note is ${Xt(l)}. Your current access allows ${Xt(r.maxSingleFileSizeBytes)} per file. Open Plans to change membership or Support to send feedback.`,413,"membership_file_size_exceeded",void 0,{max_single_file_size_bytes:r.maxSingleFileSizeBytes,byte_length:l})}markdownFileByPath(e){let t=this.app.vault.getAbstractFileByPath(e);return t instanceof H.TFile&&t.extension==="md"?t:null}async findUniqueMarkdownFileBySourceHash(e){var r;let t=[];for(let o of this.app.vault.getMarkdownFiles()){let l=await this.app.vault.cachedRead(o);if(`sha256:${await Bt(l)}`===e&&(t.push(o),t.length>1))return null}return(r=t[0])!=null?r:null}findSharedFileByShareId(e){for(let t of this.app.vault.getMarkdownFiles())if(this.currentShareMeta(t).id===e)return t;return null}async reconcileCommittedSharePublish(){var r;let e=this.docferrySettings.pendingSharePublish,t=(r=e==null?void 0:e.response)==null?void 0:r.share_id;!e||!t||!this.findSharedFileByShareId(t)||await Tt(this.sharePublishSubmissionDeps().store,e.key)}async clearLocalShareMetaForId(e){let t=this.findSharedFileByShareId(e);t&&await Er(this.app,t)}currentShareMeta(e){let t=ln(this.app,e);return Hr(t,this.docferrySettings.serverUrl)?t:{}}async showLinkStatus(e){let t=this.currentShareMeta(e);if(!t.id){new H.Notice("This note has not been shared.");return}try{let r=await this.api.getShareLinks(t.id);new er(this.app,e.basename,r).open()}catch(r){if(Ue(r))return;new H.Notice(this.formatError(r,"Link status failed"))}}async importShareUrl(e=""){let t=await new Tr(this.app,mt(e),this.docferrySettings.defaultImportFolder||Ye.defaultImportFolder,this.docferrySettings.serverUrl).openAndGetResult();if(!t)return;let r=new H.Notice("Importing share...",0);try{let o=await this.importShareWithOptions(t);r.hide(),new H.Notice(`Imported ${o.title}${o.importedAssets?` with ${o.importedAssets} assets`:""}`)}catch(o){r.hide(),new H.Notice(this.formatError(o,"Import failed"))}}async importShareFromDashboard(e,t){return this.importShareWithOptions({url:e,password:t,outputFolder:this.docferrySettings.defaultImportFolder||Ye.defaultImportFolder,overwrite:!1})}async importExternalLink(e,t){var F;let r=Zn(e);await this.refreshMembershipForExternalImport();let o=this.docferrySettings.membership,l=!!(o&&br(o.hasMediaNoteEntitlement,r.provider,{enabled:o.canUseMediaNote,supportedProviders:o.mediaNoteProviders})),d=!!(o&&si(o.mediaNoteMonthlyJobsUsed,o.mediaNoteMonthlyJobLimit)),b=o?ui(o.mediaNoteMonthlyJobsUsed,o.mediaNoteMonthlyJobLimit):null;if(!(l&&d)){if(o!=null&&o.hasMediaNoteEntitlement&&oi(r.provider))throw new Error(d?`${gr(r.provider)} Advanced Import is temporarily unavailable. Nothing was saved.`:`${gr(r.provider)} Advanced Import has reached this month's limit. Nothing was saved.`);return this.writeExternalImport(r.title,r.markdown)}if(!await this.showUploadNoticeIfNeeded(!0,"detailed_note"))return null;if(this.docferrySettings.pendingMediaNoteImport)throw new Error("A detailed note is already being prepared. Resume or cancel it before starting another.");let S=(F=this.docferrySettings.connectedAccount)==null?void 0:F.productSubjectId;if(!S)throw new Error("Reconnect your Bondie account before starting a detailed note.");b!==null&&b<=ai&&new H.Notice(b===1?"This will use your last Advanced Import this month.":`This will use 1 of your remaining ${b} Advanced Imports this month.`,8e3),t==null||t("starting");let x=await Ai(this.mediaNoteSubmissionDeps(),r.url.href,S);t==null||t("reading");let k=await this.waitForMediaNote(x,t);if(!Yr.has(k.status)||!k.markdown)throw await this.clearPendingMediaNoteImport(k.job_id),new Error(vr(k));return this.finishMediaNoteImport(k,t)}async cancelActiveMediaImport(){let e=this.docferrySettings.pendingMediaNoteImport;if(!e)return;this.requirePendingImportOwner(e);let t;try{t=await this.api.cancelMediaNoteJob(e.jobId)}catch(r){if(r instanceof Oe&&(r.code==="media_note_job_not_found"||r.code==="media_note_job_finished")){await this.clearPendingMediaNoteImport(e.jobId);return}throw r}if(Xr.has(t.status)){await this.clearPendingMediaNoteImport(e.jobId);return}throw new Error("The detailed note is still processing. Try cancelling again before changing accounts.")}async refreshMembershipForExternalImport(){if(!this.docferrySettings.sessionToken)return;let e=this.docferrySettings.membership;try{await this.loadMembership(!0)}catch(t){if(Ue(t))return;if(e&&!e.hasMediaNoteEntitlement){this.debug("membership refresh before link import failed; using cached free access",t);return}throw t}}async writeExternalImport(e,t,r){let o=this.docferrySettings.defaultImportFolder||Ye.defaultImportFolder,l=r||await this.uniqueImportPath(o,Rt(e));await this.ensureParentFolder(l);let d=this.app.vault.getAbstractFileByPath(l),b;if(d instanceof H.TFile){if(await this.app.vault.read(d)!==t)throw new Error("The saved note path changed while this import was recovering. Nothing was overwritten.");b=d}else b=await this.app.vault.create(l,t);return await this.app.workspace.getLeaf(!0).openFile(b),{title:e,notePath:l,importedAssets:0}}async waitForMediaNote(e,t){var o;let r=e;for(let l=0;lthis.docferrySettings.pendingSharePublish,save:async e=>{this.docferrySettings.pendingSharePublish=e,await this.saveSettings()}},createShare:(e,t)=>this.api.createShare(e,t),resolveShare:e=>this.api.resolveShareCreate(e),generateKey:()=>Li(),now:()=>new Date().toISOString()}}mediaNoteSubmissionDeps(){return{store:{read:()=>this.docferrySettings.pendingMediaNoteSubmission,save:async e=>{this.docferrySettings.pendingMediaNoteSubmission=e,await this.saveSettings()}},createJob:(e,t)=>this.api.createMediaNoteJob(e,t),trackImport:async(e,t)=>{await this.setPendingMediaNoteImport({jobId:e.job_id,ownerProductSubjectId:t.ownerProductSubjectId,sourceUrl:t.sourceUrl,createdAt:t.createdAt})},generateKey:()=>Li(),now:()=>new Date().toISOString()}}async recoverPendingMediaNoteSubmission(){var o;let e=this.docferrySettings.pendingMediaNoteSubmission;if(!e||this.mediaNoteRecoveryInFlight||this.docferrySettings.pendingMediaNoteImport)return;let t=(o=this.docferrySettings.connectedAccount)==null?void 0:o.productSubjectId;if(!t)return;if(e.ownerProductSubjectId!==t){this.docferrySettings.pendingMediaNoteSubmission=null,await this.saveSettings();return}this.mediaNoteRecoveryInFlight=!0;let r=null;try{r=await tr(this.mediaNoteSubmissionDeps(),e)}catch(l){new H.Notice(this.formatError(l,"Could not resume detailed note"),8e3)}finally{this.mediaNoteRecoveryInFlight=!1}r&&await this.resumeActiveMediaImport()}async resumeActiveMediaImport(){let e=this.docferrySettings.pendingMediaNoteImport;if(!e||this.mediaNoteRecoveryInFlight)return;try{this.requirePendingImportOwner(e)}catch(r){new H.Notice(this.formatError(r,"Could not resume detailed note"),8e3);return}this.mediaNoteRecoveryInFlight=!0;let t=new H.Notice("Resuming your detailed note in the background...",0);try{let r=await this.api.getMediaNoteJob(e.jobId),o=await this.waitForMediaNote(r);if(!Yr.has(o.status)||!o.markdown)throw await this.clearPendingMediaNoteImport(o.job_id),new Error(vr(o));let l=await this.finishMediaNoteImport(o);l&&new H.Notice(`Saved ${l.title} to ${l.notePath}.`)}catch(r){r instanceof Oe&&r.code==="media_note_job_not_found"?(await this.clearPendingMediaNoteImport(e.jobId),new H.Notice("That detailed note expired on the server and was removed from the review queue.",8e3)):new H.Notice(this.formatError(r,"Could not resume detailed note"),8e3)}finally{t.hide(),this.mediaNoteRecoveryInFlight=!1}}requireConnectedProductSubject(){var t;let e=(t=this.docferrySettings.connectedAccount)==null?void 0:t.productSubjectId;if(!e)throw new Error("Reconnect your Bondie account to continue this detailed note.");return e}requirePendingImportOwner(e){if(this.requireConnectedProductSubject()!==e.ownerProductSubjectId)throw new Error("This detailed note belongs to another Bondie account. Sign in with the account that started it.")}async uniqueImportPath(e,t){for(let r=0;r<1e3;r+=1){let o=r?` ${r+1}`:"",l=(0,H.normalizePath)(`${e}/${t}${o}.md`);if(!await this.app.vault.adapter.exists(l))return l}throw new Error("Could not allocate a filename for this imported link.")}async importShareWithOptions(e){let t=await this.api.getShareImportPayload(e.url,e.password),r=mt(t.payload.title,"Untitled DocFerry share"),o=mt(t.payload.markdown,""),l=(0,H.normalizePath)(`${e.outputFolder}/${Rt(r)}.md`),d=(Array.isArray(t.payload.assets)?t.payload.assets:[]).map(S=>{let x=(0,H.normalizePath)(`${e.outputFolder}/${Jo(S)}`);x===l&&(x=(0,H.normalizePath)(`${e.outputFolder}/attachments/${Rt(mt(S.filename)||mt(S.asset_id)||"attachment")}`));let k=mt(S.url);if(!k)throw new Error(`Imported asset is missing a download URL: ${x}`);return{path:x,url:k}}),b=await this.withShareImportCommitLock(()=>Si(this.importFileSystem(),{notePath:l,markdown:o,assets:d,overwrite:e.overwrite,download:S=>this.api.downloadImportAsset(S,t.cookieHeader)})),y=this.app.vault.getAbstractFileByPath(l);return y instanceof H.TFile&&await this.app.workspace.getLeaf(!0).openFile(y),{title:r,notePath:l,importedAssets:b}}importFileSystem(){let e=this.app.vault.adapter;return{exists:t=>e.exists(t),readText:t=>e.read(t),readBinary:t=>e.readBinary(t),writeText:async(t,r)=>{let o=this.app.vault.getAbstractFileByPath(t);o instanceof H.TFile?await this.app.vault.process(o,()=>r):await e.write(t,r)},writeBinary:async(t,r)=>{await e.writeBinary(t,r)},remove:t=>e.remove(t),directoryExists:t=>e.exists(t),createDirectory:t=>e.mkdir(t),removeDirectoryIfEmpty:async t=>{let r=await e.list(t);r.files.length||r.folders.length||await e.rmdir(t,!1)}}}async withShareImportCommitLock(e){let t=this.shareImportCommitQueue,r;this.shareImportCommitQueue=new Promise(o=>{r=o}),await t;try{return await e()}finally{r()}}async ensureParentFolder(e){let t=(0,H.normalizePath)(e).split("/");t.pop(),await this.ensureFolder(t.join("/"))}async ensureFolder(e){let t=(0,H.normalizePath)(e).replace(/^\/+|\/+$/g,"");if(!t)return;let r="";for(let o of t.split("/"))r=r?`${r}/${o}`:o,await this.app.vault.adapter.exists(r)||await this.app.vault.adapter.mkdir(r)}async buildPayload(e,t,r,o,l){var L,j,N,W,_,B,E,I;let d=performance.now();l==null||l("Reading note...");let b=await this.app.vault.read(e),y=this.extractOutboundLinks(b,e);l==null||l("Uploading local assets...");let S=await this.uploadLocalAssets(b,e);l==null||l("Rendering Obsidian preview...");let x=!!(r.useThemeStyling&&((L=this.docferrySettings.membership)!=null&&L.canUseFullTheme)),k=await this.renderHtmlSnapshot(e,b,S,x),F=null;if(k!=null&&k.css){l==null||l("Uploading reading style...");try{F=await this.uploadCssSnapshot(k.css)}catch(p){this.debug("css snapshot upload failed",p)}}let P=[...S.linkedAssets.map(p=>({asset_id:p.assetId,role:p.role,original_path:p.originalPath})),...F?[{asset_id:F.assetId,role:"css",original_path:Mi}]:[]];return this.debug("payload built",{markdownChars:b.length,htmlSnapshotChars:(j=k==null?void 0:k.html.length)!=null?j:0,cssSnapshotChars:(W=(N=k==null?void 0:k.css)==null?void 0:N.length)!=null?W:0,localAssets:S.linkedAssets.length,imageAssets:S.imageAssets.filter(Boolean).length,cssAsset:!!F,elapsedMs:Math.round(performance.now()-d)}),{vault_id:await this.resolveVaultId(),source_path:e.path,source_path_normalized:Go(e.path),doc_identity:null,source_hash:`sha256:${await Bt(b)}`,title:t,markdown:b,html_snapshot:(_=k==null?void 0:k.html)!=null?_:null,theme_mode:(B=k==null?void 0:k.themeMode)!=null?B:"reader",css_asset_id:(E=F==null?void 0:F.assetId)!=null?E:null,assets:P,outbound_links:y,password:r.password,password_mode:o?this.resolvePasswordMode(r):void 0,expires_at:(I=r.expiresAt)!=null?I:null,client:{plugin_id:this.manifest.id,plugin_version:this.manifest.version,obsidian_version:Ui(this.app),vault_name:this.app.vault.getName()}}}async showUploadNoticeIfNeeded(e,t="publish"){if(this.docferrySettings.uploadConsentAcceptedAt&&this.docferrySettings.uploadConsentNoticeId===Ni)return!0;if(this.uploadNoticeOpen)return!e;this.uploadNoticeOpen=!0;try{return await Bi(this.app,e?t:"startup")?(this.docferrySettings.uploadConsentAcceptedAt=new Date().toISOString(),this.docferrySettings.uploadConsentNoticeId=Ni,await this.saveSettings(),!0):!e}finally{this.uploadNoticeOpen=!1}}async renderHtmlSnapshot(e,t,r,o){let l=Xo(),d=l.createElement("div");d.className="markdown-preview-view markdown-rendered docferry-snapshot-source docferry-snapshot-hidden-host",l.body.appendChild(d);let b=new H.Component;b.load();try{await H.MarkdownRenderer.render(this.app,t,d,e.path,b),await Oi(150),this.applyLocalImageAssetPlaceholders(d,r.imageAssets),this.applyLocalAttachmentPlaceholders(d,r.linkedAssets);for(let x of Array.from(d.querySelectorAll("script")))x.remove();let y="reader",S;if(o)try{S=Yo(d),y="full"}catch(x){this.debug("theme styling could not be captured; using reader theme",x),S=null}else S=null;return{html:d.innerHTML,css:S,themeMode:y}}catch(y){return this.debug("html snapshot failed",y),null}finally{b.unload(),d.remove()}}async uploadLocalAssets(e,t){let r=this.extractLocalAssetRefs(e),o=new Map,l=[],d=[],b=[];for(let k of r){if(kn(k.path)){b.push(k.path);continue}let F=this.resolveLinkedFile(k.path,t);if(F&&kn(F.path)){b.push(k.path);continue}let P=F?qi(F.extension):null,L=F?_i(F.extension):null;if(!F||F.extension.toLowerCase()==="md"||!P||!L){k.isImage&&F&&_i(F.extension)==="image"&&d.push(null);continue}o.has(F.path)||o.set(F.path,{target:F,originalPath:k.path,role:L,contentType:P}),k.isImage&&L==="image"&&d.push({targetPath:F.path,originalPath:k.path})}if(b.length){let k=b.slice(0,3).join(", "),F=b.length>3?` and ${b.length-3} more`:"";new H.Notice(`DocFerry skipped ${b.length} hidden or unsafe asset reference${b.length===1?"":"s"} (never uploaded): ${k}${F}.`,8e3)}let y=Array.from(o.values()),S=await Zo(y,Ho,k=>this.uploadLocalAsset(k)),x=new Map;y.forEach((k,F)=>{x.set(k.target.path,S[F])});for(let k of d){if(!k){l.push(null);continue}let F=x.get(k.targetPath);l.push(F?{assetId:F.assetId,originalPath:k.originalPath}:null)}return{linkedAssets:S,imageAssets:l}}async uploadLocalAsset(e){let t=await this.app.vault.readBinary(e.target),r=this.prepareAssetUpload(e.target,t,e.contentType),o=`sha256:${await Pn(r.data)}`,l=await this.api.uploadAsset(r.data,r.filename,r.contentType,o);return this.debug("asset uploaded",{assetType:e.contentType,role:e.role,originalBytes:t.byteLength,uploadedBytes:r.data.byteLength,qualityMode:r.qualityMode}),{assetId:l.asset_id,originalPath:e.originalPath,role:e.role}}prepareAssetUpload(e,t,r){return{data:t,filename:e.name,contentType:r,qualityMode:"original"}}async uploadCssSnapshot(e){let t=new TextEncoder().encode(e);return t.byteLength?{assetId:(await this.api.uploadAsset(t.buffer,Mi,"text/css",`sha256:${await Pn(t.buffer)}`)).asset_id}:null}applyLocalImageAssetPlaceholders(e,t){if(!t.length)return;let r=Array.from(e.querySelectorAll("img")),o=0;for(let l of r){let d=l.getAttribute("src")||"";if(d.startsWith("http://")||d.startsWith("https://")||d.startsWith("data:"))continue;let b=t[o];o+=1,b&&(l.setAttribute("src",`docferry-asset://${b.assetId}`),l.setAttribute("loading","lazy"),l.setAttribute("decoding","async"))}}applyLocalAttachmentPlaceholders(e,t){let r=t.filter(l=>l.role!=="image");if(!r.length)return;let o=Array.from(e.querySelectorAll("a"));for(let l of o){let d=l.getAttribute("href")||"";if(!d||qt(d)||d.startsWith("docferry-asset://"))continue;let b=ji(d),y=r.find(S=>{let x=S.originalPath;return b===x||b.endsWith(`/${x}`)||d===x});y&&(l.setAttribute("href",`docferry-asset://${y.assetId}`),l.removeAttribute("target"),l.removeAttribute("rel"))}}extractLocalAssetRefs(e){var d,b,y;let t=[],r=/!\[\[([^\]\n]+)\]\]/g;for(let S of e.matchAll(r)){let x=(d=S[1].split("|")[0])==null?void 0:d.trim();x&&!qt(x)&&t.push({path:x,isImage:!0})}let o=/!\[[^\]\n]*\]\(([^)\n]+)\)/g;for(let S of e.matchAll(o)){let x=(b=S[1].split(/\s+["']/)[0])==null?void 0:b.trim().replace(/^<|>$/g,"");x&&!qt(x)&&t.push({path:x,isImage:!0})}let l=/(?$/g,"");x&&!qt(x)&&t.push({path:x,isImage:!1})}return t}extractOutboundLinks(e,t){var y;let r=[],o=new Set,l=(S,x,k)=>{var j;let F=Wo(S);if(!F.path||qt(F.path)||F.path.toLowerCase().startsWith("obsidian://"))return;let P=this.resolveLinkedFile(F.path,t),L=`${k}|${F.path}|${F.subpath||""}|${(P==null?void 0:P.path)||""}`;o.has(L)||(o.add(L),r.push({raw_target:S.trim(),target_path:(j=P==null?void 0:P.path)!=null?j:null,target_doc_identity:null,target_subpath:F.subpath,label:x,link_kind:k}))},d=/(!?)\[\[([^\]\n]+)\]\]/g;for(let S of e.matchAll(d)){let x=S[1]==="!",[k,F]=Qo(S[2]);l(k,F,x?"embed":"wiki")}let b=/\[([^\]\n]+)\]\(([^)\n]+)\)/g;for(let S of e.matchAll(b)){if(S.index&&e.charAt(S.index-1)==="!")continue;let x=(y=S[2].split(/\s+["']/)[0])==null?void 0:y.trim().replace(/^<|>$/g,"");x&&l(x,S[1].trim()||null,"markdown_relative")}return r}resolveLinkedFile(e,t){var S;let r=ji(e),o=this.app.metadataCache.getFirstLinkpathDest(r,t.path);if(o instanceof H.TFile)return o;let l=this.app.vault.getAbstractFileByPath((0,H.normalizePath)(r));if(l instanceof H.TFile)return l;let d=((S=t.parent)==null?void 0:S.path)||"",b=d?(0,H.normalizePath)(`${d}/${r}`):(0,H.normalizePath)(r),y=this.app.vault.getAbstractFileByPath(b);return y instanceof H.TFile?y:null}async resolveVaultId(){let e=this.app.vault.adapter,t=typeof e.basePath=="string"?e.basePath:"",r=`${this.app.vault.getName()}|${t}`;return`vlt_${(await Bt(r)).slice(0,24)}`}resolvePasswordMode(e){return e.passwordEnabled&&e.password?"set":e.passwordEnabled?"keep":"clear"}resolveTitle(e){return e.basename}formatError(e,t){return e instanceof Oe?`${t}: ${e.message}`:e instanceof Error?`${t}: ${e.message}`:t}refreshDashboardAuth(){for(let e of this.app.workspace.getLeavesOfType(xt))e.view instanceof wt&&e.view.refreshForAuthChange()}refreshDashboardShare(){for(let e of this.app.workspace.getLeavesOfType(xt))e.view instanceof wt&&e.view.refreshForShareChange()}debug(e,t){this.docferrySettings.debug&&console.debug(`[docferry] ${e}`)}};async function Bt(a){let u=new TextEncoder().encode(a);return Pn(u)}async function Pn(a){let u=await crypto.subtle.digest("SHA-256",a);return zo(u)}function zo(a){return Array.from(new Uint8Array(a)).map(u=>u.toString(16).padStart(2,"0")).join("")}function Ui(a){let u=a;return typeof u.version=="string"?u.version:"unknown"}function Oi(a){return new Promise(u=>window.setTimeout(u,a))}function Go(a){return a.replace(/\\/g,"/").replace(/^\/+/,"").replace(/\/{2,}/g,"/").trim().toLowerCase()}function Jo(a){let u=mt(a.original_path).split("#",1)[0].split("?",1)[0].replace(/\\/g,"/").trim(),e=u?u.split("/").filter(t=>t&&t!=="."&&t!=="..").map(t=>Rt(t)):[];return e.length?e.join("/"):`attachments/${Rt(mt(a.filename)||mt(a.asset_id)||"attachment")}`}function mt(a,u=""){return typeof a=="string"?a:a==null?u:typeof a=="number"||typeof a=="boolean"||typeof a=="bigint"?String(a):u}function Qo(a){let[u,e]=a.split("|",2);return[u.trim(),(e==null?void 0:e.trim())||null]}function Wo(a){let u=a.split("|",1)[0].trim(),e=u.search(/[#^]/);return e<0?{path:u,subpath:null}:{path:u.slice(0,e).trim(),subpath:u.slice(e+1).trim()||null}}function Yo(a){var k,F;let u=a.ownerDocument,e=P=>{var j,N;let L=a.querySelector(P);return L?(N=(j=L.ownerDocument.defaultView)==null?void 0:j.getComputedStyle(L))!=null?N:getComputedStyle(L):null},t=(F=(k=u.defaultView)==null?void 0:k.getComputedStyle(a))!=null?F:getComputedStyle(a),r=e("a"),o=e(".callout, blockquote, table"),l=e("pre, code"),d=e("pre code, code"),b=e(".callout, pre, table"),y=new Map,S=(P,...L)=>{let j=L.map(Hi).find(N=>!!N);j&&y.set(P,j)};return S("--docferry-theme-accent",Tn(u,"--interactive-accent","--text-accent","--color-accent","--link-color"),r==null?void 0:r.color),S("--docferry-theme-border",Tn(u,"--background-modifier-border","--divider-color","--table-border-color"),o==null?void 0:o.borderLeftColor,o==null?void 0:o.borderTopColor),S("--docferry-theme-radius",b==null?void 0:b.borderRadius),S("--docferry-theme-font",t.fontFamily),S("--docferry-theme-code-font",Tn(u,"--font-monospace","--code-font-family"),d==null?void 0:d.fontFamily),S("--docferry-theme-code-bg",l==null?void 0:l.backgroundColor),S("--docferry-theme-code-ink",d==null?void 0:d.color),y.size?`/* DocFerry semantic theme tokens: visual identity without layout capture. */
.reader-page.theme-fidelity-full {
-${Array.from(v,([R,F])=>` ${R}: ${F};`).join(`
+${Array.from(y,([P,L])=>` ${P}: ${L};`).join(`
`)}
-}`:null}function Eo(){return activeDocument}function fn(a,...c){let e=a.defaultView,t=[e==null?void 0:e.getComputedStyle(a.body),e==null?void 0:e.getComputedStyle(a.documentElement)].filter(i=>!!i);for(let i of c)for(let s of t){let l=bi(s.getPropertyValue(i));if(l)return l}return null}function bi(a){let c=a==null?void 0:a.trim();return!c||/^(?:none|normal|transparent)$/i.test(c)||/rgba?\(\s*0\s*,\s*0\s*,\s*0\s*,\s*0\s*\)/i.test(c)||/^rgba?\([^)]*\/\s*0(?:\.0+)?\s*\)$/i.test(c)||/url\s*\(|[;{}]/i.test(c)?null:c}function Si(a){switch(a.toLowerCase()){case"png":return"image/png";case"jpg":case"jpeg":return"image/jpeg";case"gif":return"image/gif";case"webp":return"image/webp";case"pdf":return"application/pdf";case"txt":return"text/plain";case"csv":return"text/csv";case"json":return"application/json";case"zip":return"application/zip";case"doc":return"application/msword";case"xls":return"application/vnd.ms-excel";case"ppt":return"application/vnd.ms-powerpoint";case"docx":return"application/vnd.openxmlformats-officedocument.wordprocessingml.document";case"xlsx":return"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";case"pptx":return"application/vnd.openxmlformats-officedocument.presentationml.presentation";case"mp3":return"audio/mpeg";case"m4a":return"audio/mp4";case"ogg":return"audio/ogg";case"wav":return"audio/wav";case"mp4":return"video/mp4";case"mov":return"video/quicktime";case"webm":return"video/webm";case"otf":return"font/otf";case"ttf":return"font/ttf";case"woff":return"font/woff";case"woff2":return"font/woff2";default:return null}}async function ko(a,c,e){let t=new Array(a.length).fill(void 0),i=0,s=Math.min(Math.max(c,1),a.length);return await Promise.all(Array.from({length:s},async()=>{for(;i{if(l===void 0)throw new Error("Concurrent task did not produce a result.");return l})}function yi(a){let c=a.toLowerCase();return["png","jpg","jpeg","gif","webp"].includes(c)?"image":["mp4","mov","webm"].includes(c)?"video":["otf","ttf","woff","woff2"].includes(c)?"font":Si(c)?"attachment":null}function vi(a){try{return decodeURIComponent(a)}catch(c){return a}}
+}`:null}function Xo(){return activeDocument}function Tn(a,...u){let e=a.defaultView,t=[e==null?void 0:e.getComputedStyle(a.body),e==null?void 0:e.getComputedStyle(a.documentElement)].filter(r=>!!r);for(let r of u)for(let o of t){let l=Hi(o.getPropertyValue(r));if(l)return l}return null}function Hi(a){let u=a==null?void 0:a.trim();return!u||/^(?:none|normal|transparent)$/i.test(u)||/rgba?\(\s*0\s*,\s*0\s*,\s*0\s*,\s*0\s*\)/i.test(u)||/^rgba?\([^)]*\/\s*0(?:\.0+)?\s*\)$/i.test(u)||/url\s*\(|[;{}]/i.test(u)?null:u}function qi(a){switch(a.toLowerCase()){case"png":return"image/png";case"jpg":case"jpeg":return"image/jpeg";case"gif":return"image/gif";case"webp":return"image/webp";case"pdf":return"application/pdf";case"txt":return"text/plain";case"csv":return"text/csv";case"json":return"application/json";case"zip":return"application/zip";case"doc":return"application/msword";case"xls":return"application/vnd.ms-excel";case"ppt":return"application/vnd.ms-powerpoint";case"docx":return"application/vnd.openxmlformats-officedocument.wordprocessingml.document";case"xlsx":return"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";case"pptx":return"application/vnd.openxmlformats-officedocument.presentationml.presentation";case"mp3":return"audio/mpeg";case"m4a":return"audio/mp4";case"ogg":return"audio/ogg";case"wav":return"audio/wav";case"mp4":return"video/mp4";case"mov":return"video/quicktime";case"webm":return"video/webm";case"otf":return"font/otf";case"ttf":return"font/ttf";case"woff":return"font/woff";case"woff2":return"font/woff2";default:return null}}async function Zo(a,u,e){let t=new Array(a.length).fill(void 0),r=0,o=Math.min(Math.max(u,1),a.length);return await Promise.all(Array.from({length:o},async()=>{for(;r{if(l===void 0)throw new Error("Concurrent task did not produce a result.");return l})}function _i(a){let u=a.toLowerCase();return["png","jpg","jpeg","gif","webp"].includes(u)?"image":["mp4","mov","webm"].includes(u)?"video":["otf","ttf","woff","woff2"].includes(u)?"font":qi(u)?"attachment":null}function ji(a){try{return decodeURIComponent(a)}catch(u){return a}}
diff --git a/plugin/manifest.json b/plugin/manifest.json
index e3d51e3..f246dc1 100644
--- a/plugin/manifest.json
+++ b/plugin/manifest.json
@@ -1,7 +1,7 @@
{
"id": "docferry",
"name": "DocFerry",
- "version": "0.0.67",
+ "version": "0.0.68",
"minAppVersion": "1.12.7",
"description": "Save links as notes, import DocFerry shares, and publish secure note shares with a free Bondie account; Pro adds folder sharing, theme styling, and Advanced Import.",
"author": "Bondie",
diff --git a/plugin/package-lock.json b/plugin/package-lock.json
index a71f365..3f3bdc7 100644
--- a/plugin/package-lock.json
+++ b/plugin/package-lock.json
@@ -1,12 +1,13 @@
{
"name": "docferry",
- "version": "0.0.67",
+ "version": "0.0.68",
"lockfileVersion": 3,
"requires": true,
+ "license": "MIT",
"packages": {
"": {
"name": "docferry",
- "version": "0.0.67",
+ "version": "0.0.68",
"license": "MIT",
"dependencies": {
"cos-js-sdk-v5": "1.8.3"
diff --git a/plugin/package.json b/plugin/package.json
index cfc7187..276a9c0 100644
--- a/plugin/package.json
+++ b/plugin/package.json
@@ -1,6 +1,6 @@
{
"name": "docferry",
- "version": "0.0.67",
+ "version": "0.0.68",
"description": "Save public links as notes, publish secure notes, and unlock Pro folder sharing and media summaries.",
"main": "main.js",
"scripts": {
diff --git a/plugin/src/api-client.ts b/plugin/src/api-client.ts
index 7ce796a..d4af65f 100644
--- a/plugin/src/api-client.ts
+++ b/plugin/src/api-client.ts
@@ -68,8 +68,16 @@ export class ShareApiClient {
return this.getJson("/v0/health");
}
- async createShare(payload: SharePayload): Promise {
- return this.postJson("/v0/shares", payload);
+ async createShare(payload: SharePayload, idempotencyKey?: string): Promise {
+ return this.postJson(
+ "/v0/shares",
+ payload,
+ idempotencyKey ? { "Idempotency-Key": idempotencyKey } : {}
+ );
+ }
+
+ async resolveShareCreate(idempotencyKey: string): Promise {
+ return this.getJson(`/v0/shares/idempotency/${encodeURIComponent(idempotencyKey)}`);
}
async updateShare(shareId: string, payload: SharePayload): Promise {
@@ -299,6 +307,22 @@ export class ShareApiClient {
return this.postJson("/v0/auth/logout", {});
}
+ /** Revokes a token that has not been adopted into the active plugin session. */
+ async logoutToken(token: string): Promise<{ ok: boolean }> {
+ const res = await requestUrl({
+ url: this.url("/v0/auth/logout"),
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ "X-Share-Plugin-Version": this.pluginVersion,
+ Authorization: `Bearer ${token}`
+ },
+ body: "{}",
+ throw: false
+ });
+ return this.parse<{ ok: boolean }>(res.status, res.text, false);
+ }
+
async getShareImportPayload(shareUrl: string, password?: string): Promise {
const target = parseDocferryShareUrl(shareUrl, this.getSettings().serverUrl);
if (!target) {
@@ -412,7 +436,7 @@ export class ShareApiClient {
return headers;
}
- private parse(status: number, text: string): T {
+ private parse(status: number, text: string, notifyInvalidSession = true): T {
let parsed: unknown = undefined;
if (text) {
try {
@@ -433,7 +457,7 @@ export class ShareApiClient {
envelope?.error?.request_id,
envelope?.error?.details
);
- if (isInvalidProductSessionError(error)) this.onInvalidSession?.(error);
+ if (notifyInvalidSession && isInvalidProductSessionError(error)) this.onInvalidSession?.(error);
throw error;
}
}
diff --git a/plugin/src/asset-path-safety.ts b/plugin/src/asset-path-safety.ts
new file mode 100644
index 0000000..74f0f79
--- /dev/null
+++ b/plugin/src/asset-path-safety.ts
@@ -0,0 +1,33 @@
+/**
+ * Publish-time path safety for local asset references.
+ *
+ * A note can reference hidden vault files (`.obsidian/plugins/...`) or escape
+ * the vault with `..` segments; publishing must never upload those. Obsidian
+ * resolves references after URL-decoding them, so the check runs on the
+ * decoded form (bounded repeated decoding catches `%2e`/`%252e` variants).
+ */
+
+function safeDecode(value: string): string {
+ try {
+ return decodeURIComponent(value);
+ } catch {
+ return value;
+ }
+}
+
+/**
+ * True when a vault-relative asset reference is hidden (any segment starting
+ * with `.`, other than a plain `.` current-directory marker) or traverses
+ * upward (a `..` segment). Backslashes are treated as separators because
+ * Windows notes may contain them.
+ */
+export function isUnsafeAssetPath(rawPath: string): boolean {
+ let decoded = rawPath.trim();
+ for (let pass = 0; pass < 3; pass += 1) {
+ const next = safeDecode(decoded);
+ if (next === decoded) break;
+ decoded = next;
+ }
+ const segments = decoded.replace(/\\/g, "/").split("/");
+ return segments.some((segment) => segment === ".." || (segment.length > 1 && segment.startsWith(".")));
+}
diff --git a/plugin/src/auth-service.ts b/plugin/src/auth-service.ts
index 9c9f9d8..3419a84 100644
--- a/plugin/src/auth-service.ts
+++ b/plugin/src/auth-service.ts
@@ -33,7 +33,9 @@ const TERMINAL_EXCHANGE_CODES = new Set([
"pkce_required",
"code_verifier_required",
"invalid_code_verifier",
- "invalid_client_state"
+ "invalid_client_state",
+ "auth_login_cancelled",
+ "auth_login_failed"
]);
/** Mirrors the loadSettings wording for a local SecretStorage failure. */
@@ -133,17 +135,23 @@ export class AuthService {
return;
} catch (error) {
if (error instanceof AuthCompletionError) {
+ await this.clearPendingLoginSafely(clientState);
new Notice(error.userMessage, 8000);
return;
}
if (error instanceof ShareApiError && error.code === "auth_code_expired") {
+ await this.clearPendingLoginSafely(clientState);
new Notice("Bondie login expired. Start login again.", 8000);
return;
}
if (error instanceof ShareApiError && error.code && TERMINAL_EXCHANGE_CODES.has(error.code)) {
await this.clearPendingLoginSafely(clientState);
new Notice(
- error.code === "pkce_required"
+ error.code === "auth_login_cancelled"
+ ? "Bondie sign-in was cancelled. Your current DocFerry account is still connected."
+ : error.code === "auth_login_failed"
+ ? "Bondie sign-in could not be completed. Your current DocFerry account is still connected."
+ : error.code === "pkce_required"
? "This server requires a newer DocFerry login. Update the plugin, then start login again."
: "Bondie login could not be completed. Start login again.",
8000
diff --git a/plugin/src/confirm-stop-modal.ts b/plugin/src/confirm-stop-modal.ts
index 57e3473..578a677 100644
--- a/plugin/src/confirm-stop-modal.ts
+++ b/plugin/src/confirm-stop-modal.ts
@@ -78,6 +78,61 @@ export function confirmLegacyShareMigration(
});
}
+export function confirmRecoveredShareReassignment(
+ app: App,
+ previousPath: string,
+ currentTitle: string,
+ currentPath: string
+): Promise {
+ return new Promise((resolve) => {
+ new ConfirmShareActionModal(
+ app,
+ "Use the recovered link for this note?",
+ "DocFerry recovered a publish that began for a note at a different path. Continuing updates that same public link with the note and sharing options shown now; it does not create a second link.",
+ "Cancel",
+ "Use recovered link",
+ currentTitle,
+ currentPath,
+ resolve,
+ [`Previous path: ${previousPath}`]
+ ).open();
+ });
+}
+
+export function confirmStopRecoveredShareBeforeAccountChange(
+ app: App,
+ title: string,
+ previousPath: string
+): Promise {
+ return new Promise((resolve) => {
+ new ConfirmShareActionModal(
+ app,
+ "Stop the unfinished share and change accounts?",
+ "DocFerry recovered a public link but can no longer find its source note in this vault. To avoid leaving an unknown public link behind, changing accounts will stop that link first.",
+ "Keep account connected",
+ "Stop share and continue",
+ title,
+ previousPath,
+ resolve
+ ).open();
+ });
+}
+
+export function confirmStopRecoveredShare(app: App, title: string, previousPath: string): Promise {
+ return new Promise((resolve) => {
+ new ConfirmShareActionModal(
+ app,
+ "Stop the recovered share?",
+ "DocFerry recovered a public link for a note that is no longer at its original path. Stop that link now, then publish the current note again to create a separate link.",
+ "Keep recovered link",
+ "Stop recovered link",
+ title,
+ previousPath,
+ resolve
+ ).open();
+ });
+}
+
class ConfirmShareActionModal extends Modal {
private done = false;
diff --git a/plugin/src/dashboard-view.ts b/plugin/src/dashboard-view.ts
index 9050ebc..1eeebf3 100644
--- a/plugin/src/dashboard-view.ts
+++ b/plugin/src/dashboard-view.ts
@@ -3,6 +3,7 @@ import { ShareApiError } from "./api-client";
import { appendDocferryLogo, DOCFERRY_PRODUCT_NAME } from "./brand";
import { externalLinkProvider, validatedExternalImportUrl } from "./external-import";
import { openExternalUrl } from "./external-links";
+import { canShowFolderShareEntry } from "./folder-share-access";
import { ImportPasswordModal } from "./import-password-modal";
import { mediaNoteProgressMessage, type MediaNoteProgress } from "./media-note";
import { shouldPrepareDetailedNote } from "./media-note-availability";
@@ -197,7 +198,9 @@ export class DocferryDashboardView extends ItemView {
cls: "docferry-heading docferry-heading-3 docferry-share-drop-title"
});
dropCue.createEl("p", {
- text: "Release a note or folder to review sharing options.",
+ text: canShowFolderShareEntry(this.host.docferrySettings.membership)
+ ? "Release a note or folder to review sharing options."
+ : "Release a note to review sharing options.",
cls: "docferry-share-drop-detail"
});
const dropGuard = dropCue.createDiv({ cls: "docferry-share-drop-guard" });
@@ -405,13 +408,24 @@ export class DocferryDashboardView extends ItemView {
private updateShareDropCue(surface: HTMLElement, path: string): void {
const item = this.host.app.vault.getAbstractFileByPath(path);
const isFolder = item instanceof TFolder;
+ const folderUpgradeRequired = isFolder && !canShowFolderShareEntry(this.host.docferrySettings.membership);
const displayName = item instanceof TFile ? item.basename : item?.name || path.split("/").pop() || path;
const icon = surface.querySelector(".docferry-share-drop-overlay-icon");
const title = surface.querySelector(".docferry-share-drop-title");
const detail = surface.querySelector(".docferry-share-drop-detail");
if (icon) setIcon(icon, isFolder ? "folder-up" : "file-up");
- if (title) title.textContent = isFolder ? "Share this folder" : "Share this note";
- if (detail) detail.textContent = `Release to review "${displayName}".`;
+ if (title) {
+ title.textContent = folderUpgradeRequired
+ ? "Folder sharing is a Pro feature"
+ : isFolder
+ ? "Share this folder"
+ : "Share this note";
+ }
+ if (detail) {
+ detail.textContent = folderUpgradeRequired
+ ? `Upgrade to share "${displayName}".`
+ : `Release to review "${displayName}".`;
+ }
}
private renderSharesPage(containerEl: HTMLElement): void {
diff --git a/plugin/src/folder-share-access.ts b/plugin/src/folder-share-access.ts
index 1664e94..6dfc6f5 100644
--- a/plugin/src/folder-share-access.ts
+++ b/plugin/src/folder-share-access.ts
@@ -10,3 +10,15 @@ export function folderShareAccess(
if (!hasExistingShare && !membership.canCreateFolderShare) return "limit_reached";
return "allowed";
}
+
+/**
+ * Whether folder-share entry points (file menu, command palette, dashboard
+ * drop cue) should be visible. An unknown membership keeps entries visible;
+ * the publish flow re-checks access with a fresh snapshot before publishing.
+ */
+export function canShowFolderShareEntry(
+ membership: MembershipSnapshot | null | undefined
+): boolean {
+ if (!membership) return true;
+ return folderShareAccess(membership, false) !== "upgrade_required";
+}
diff --git a/plugin/src/folder-share-modal.ts b/plugin/src/folder-share-modal.ts
index d416da5..4539855 100644
--- a/plugin/src/folder-share-modal.ts
+++ b/plugin/src/folder-share-modal.ts
@@ -121,6 +121,7 @@ export class FolderShareModal extends Modal {
passwordEnabled: this.passwordEnabled,
password: this.passwordEnabled ? this.password : undefined,
expiresAt: this.resolveExpiresAt(),
+ expirySelection: this.expiresInDays,
useThemeStyling: this.defaults.canUseThemeStyling && this.useThemeStyling
});
});
diff --git a/plugin/src/main.ts b/plugin/src/main.ts
index 61fc924..32ebc6d 100644
--- a/plugin/src/main.ts
+++ b/plugin/src/main.ts
@@ -1,10 +1,18 @@
import { App, Component, MarkdownRenderer, MarkdownView, Notice, Plugin, TFile, TFolder, normalizePath } from "obsidian";
import { ShareApiClient, ShareApiError } from "./api-client";
import { isInvalidProductSessionError } from "./session-errors";
-import { hasActiveShareLink } from "./share-actions";
-import { isMissingShareError, isStoppedShareError } from "./share-lifecycle";
+import { hasActiveShareLink, resolveShareUpdateVaultGate, vaultRelativeShareSourcePath } from "./share-actions";
+import { isInactiveShareError, isMissingShareError } from "./share-lifecycle";
import { AuthCompletionError, AuthService } from "./auth-service";
-import { confirmDeleteShareHistory, confirmLegacyShareMigration, confirmStopShare, confirmUnreachableShareRepublish } from "./confirm-stop-modal";
+import {
+ confirmDeleteShareHistory,
+ confirmLegacyShareMigration,
+ confirmRecoveredShareReassignment,
+ confirmStopRecoveredShare,
+ confirmStopRecoveredShareBeforeAccountChange,
+ confirmStopShare,
+ confirmUnreachableShareRepublish
+} from "./confirm-stop-modal";
import {
DOCFERRY_DASHBOARD_VIEW_TYPE,
DocferryDashboardView,
@@ -13,7 +21,7 @@ import {
import { clearShareMeta, preserveLegacyShareMeta, readShareMeta, writeShareMeta } from "./frontmatter";
import { buildExternalLinkNote, externalLinkProviderLabel } from "./external-import";
import { openExternalUrl } from "./external-links";
-import { folderShareAccess } from "./folder-share-access";
+import { canShowFolderShareEntry, folderShareAccess } from "./folder-share-access";
import { FolderShareModal } from "./folder-share-modal";
import { classifyProtocolCallback } from "./protocol-callback";
import { confirmLoginToPublish } from "./login-intent-modal";
@@ -32,7 +40,9 @@ import {
} from "./media-note";
import { confirmMediaNoteImport } from "./media-note-preview-modal";
import {
+ MEDIA_NOTE_LOW_QUOTA_NOTICE_THRESHOLD,
hasMediaNoteJobCapacity,
+ mediaNoteMonthlyJobsRemaining,
requiresDetailedNoteProvider,
shouldPrepareDetailedNote
} from "./media-note-availability";
@@ -54,18 +64,32 @@ import {
} from "./settings";
import { enforceProductionServiceBoundary } from "./service-boundary";
import {
+ finalizeShareCreate,
+ stableSharePayloadString,
+ submitShareCreate,
+ type PendingSharePublish,
+ type SharePublishSubmissionDeps
+} from "./share-publish-submission";
+import {
+ clearStagedSessionToken,
clearPendingLoginCustody,
migrateLegacyPendingLogin,
persistPendingLogin,
persistSessionToken,
readPendingLogin,
- resolveSessionTokenOnLoad
+ resolveSessionTokenOnLoad,
+ stageSessionToken
} from "./session-token-custody";
import { legacyShareMetaForService, shareMetaBelongsToService, type LegacyShareMeta } from "./share-url";
import { ResultModal } from "./result-modal";
import { ShareModal } from "./share-modal";
-import { initialExpirySelection, initialThemeStyling } from "./publish-state";
+import {
+ initialExpirySelection,
+ initialThemeStyling,
+ resolveFreshExpiryAfterUpdateFallback
+} from "./publish-state";
import { isRemoteUrl } from "./theme-safety";
+import { isUnsafeAssetPath } from "./asset-path-safety";
import type {
FolderShareDocumentPayload,
FolderShareResponse,
@@ -164,8 +188,10 @@ export default class DocferryPlugin extends Plugin {
private mediaNoteRecoveryInFlight = false;
private pendingPublishIntent: { kind: "note" | "folder"; path: string } | null = null;
private shareImportCommitQueue: Promise = Promise.resolve();
+ private settingsSaveQueue: Promise = Promise.resolve();
private unloaded = false;
private pendingTimeouts = new Set();
+ private stagedSessionTokenToRevoke = "";
onunload(): void {
this.unloaded = true;
@@ -191,12 +217,25 @@ export default class DocferryPlugin extends Plugin {
this.manifest.version,
(error) => this.handleInvalidProductSession(error)
);
+ await this.reconcileStagedSessionToken();
+ await this.reconcileCommittedSharePublish();
this.auth = new AuthService(
this.api,
async (token, response) => {
// The exchange may complete after plugin unload: adopt nothing then.
if (this.unloaded) return;
this.billingSessionRecoveryUntil = 0;
+ const pendingShare = this.docferrySettings.pendingSharePublish;
+ if (
+ pendingShare &&
+ response.product_subject_id &&
+ pendingShare.ownerProductSubjectId !== response.product_subject_id
+ ) {
+ await this.rejectMismatchedLoginToken(token);
+ throw new AuthCompletionError(
+ "An unfinished share belongs to another Bondie account. Sign in with that account and finish or stop the share first."
+ );
+ }
const pendingSubmission = this.docferrySettings.pendingMediaNoteSubmission;
if (
pendingSubmission &&
@@ -234,22 +273,18 @@ export default class DocferryPlugin extends Plugin {
}
const previousToken = this.docferrySettings.sessionToken;
if (previousToken && previousToken !== token) {
- // Connect-while-connected: revoke the prior server session before
- // adopting the new token so old sessions do not linger.
+ await this.replaceSessionToken(previousToken, token);
+ } else {
try {
- await this.api.logout();
+ this.adoptSessionToken(token);
} catch (error) {
- this.debug("previous session revoke during connect failed", error);
+ this.debug("secure session token adoption failed", error);
+ await this.revokeUnadoptedToken(token);
+ throw new AuthCompletionError(
+ "DocFerry could not store your sign-in securely. Update Obsidian, then start login again."
+ );
}
}
- try {
- this.adoptSessionToken(token);
- } catch (error) {
- this.debug("secure session token adoption failed", error);
- throw new AuthCompletionError(
- "DocFerry could not store your sign-in securely. Update Obsidian, then start login again."
- );
- }
this.docferrySettings.connectedAccount = response.product_subject_id
? {
productSubjectId: response.product_subject_id,
@@ -294,6 +329,9 @@ export default class DocferryPlugin extends Plugin {
this.registerView(DOCFERRY_DASHBOARD_VIEW_TYPE, (leaf) => new DocferryDashboardView(leaf, this));
this.registerEvent(this.app.workspace.on("file-menu", (menu, file) => {
if (file instanceof TFolder) {
+ // Free plans have no folder sharing: hide the entry instead of
+ // leading to a dead-end upgrade notice.
+ if (!canShowFolderShareEntry(this.docferrySettings.membership)) return;
menu.addItem((item) => item
.setTitle("Publish folder with DocFerry")
.setIcon("folder-up")
@@ -384,6 +422,7 @@ export default class DocferryPlugin extends Plugin {
checkCallback: (checking) => {
const folder = this.getActiveMarkdownFile()?.parent;
if (!(folder instanceof TFolder)) return false;
+ if (!canShowFolderShareEntry(this.docferrySettings.membership)) return false;
if (!checking) void this.publishFolder(folder);
return true;
}
@@ -501,6 +540,9 @@ export default class DocferryPlugin extends Plugin {
})
);
this.app.workspace.onLayoutReady(() => {
+ void this.reconcileCommittedSharePublish().catch((error) => {
+ this.debug("pending share journal reconciliation failed", error);
+ });
if (this.docferrySettings.sessionToken) this.refreshMembershipForDashboardOpen();
if (this.docferrySettings.sessionToken && this.docferrySettings.pendingMediaNoteImport) {
this.scheduleTimeout(() => void this.resumeActiveMediaImport(), 900);
@@ -533,6 +575,7 @@ export default class DocferryPlugin extends Plugin {
boundaryReset
);
this.docferrySettings.sessionToken = sessionToken.token;
+ this.stagedSessionTokenToRevoke = sessionToken.stagedTokenToRevoke;
if (sessionToken.scrubLegacy) changed = true;
if (boundaryReset) {
clearPendingLoginCustody(this.app.secretStorage);
@@ -586,7 +629,10 @@ export default class DocferryPlugin extends Plugin {
async saveSettings(): Promise {
// The session token lives only in Obsidian SecretStorage and in memory;
// it is never persisted to data.json.
- await this.saveData({ ...this.docferrySettings, sessionToken: "" });
+ const snapshot = { ...this.docferrySettings, sessionToken: "" };
+ const save = this.settingsSaveQueue.then(() => this.saveData(snapshot));
+ this.settingsSaveQueue = save.catch(() => undefined);
+ await save;
}
/**
@@ -599,6 +645,119 @@ export default class DocferryPlugin extends Plugin {
this.docferrySettings.sessionToken = token;
}
+ /**
+ * Switches product sessions with separate active and pending-revocation
+ * SecretStorage slots. The previous token is durably queued before the new
+ * token becomes authoritative. A crash before commit keeps the previous
+ * token; a crash after commit keeps the replacement and revokes the previous
+ * token during startup reconciliation.
+ */
+ private async replaceSessionToken(previousToken: string, replacementToken: string): Promise {
+ try {
+ stageSessionToken(this.app.secretStorage, previousToken);
+ this.stagedSessionTokenToRevoke = previousToken;
+ } catch (error) {
+ this.debug("previous session cleanup staging failed", error);
+ try {
+ await this.revokeUnadoptedToken(replacementToken);
+ } catch (revokeError) {
+ this.debug("replacement session cleanup failed", revokeError);
+ }
+ throw new AuthCompletionError(
+ "DocFerry could not store your sign-in securely. Your previous account remains connected."
+ );
+ }
+
+ try {
+ persistSessionToken(this.app.secretStorage, replacementToken);
+ } catch (error) {
+ this.debug("replacement session commit failed", error);
+ this.stagedSessionTokenToRevoke = "";
+ try {
+ clearStagedSessionToken(this.app.secretStorage);
+ } catch (cleanupError) {
+ // On restart, equal active/staged old tokens are recognized as an
+ // uncommitted switch and the duplicate staging slot is cleared.
+ this.debug("uncommitted session staging cleanup deferred", cleanupError);
+ }
+ try {
+ await this.revokeUnadoptedToken(replacementToken);
+ } catch (revokeError) {
+ this.debug("replacement session cleanup deferred", revokeError);
+ }
+ throw new AuthCompletionError(
+ "DocFerry could not safely store the new sign-in. Your previous account remains connected."
+ );
+ }
+ this.docferrySettings.sessionToken = replacementToken;
+
+ try {
+ await this.api.logoutToken(previousToken);
+ } catch (error) {
+ if (!isInvalidProductSessionError(error)) {
+ // The replacement is already authoritative. Keep the old token in the
+ // durable cleanup slot so an ambiguous response or crash cannot revoke
+ // the newly connected account on restart.
+ this.debug("previous session cleanup deferred", error);
+ new Notice("Your new account is connected. DocFerry will finish closing the previous session when online.", 8000);
+ return;
+ }
+ }
+
+ this.stagedSessionTokenToRevoke = "";
+ try {
+ clearStagedSessionToken(this.app.secretStorage);
+ } catch (error) {
+ // The old token was revoked; an idempotent retry on restart is safe.
+ this.debug("previous session staging cleanup deferred", error);
+ }
+ }
+
+ private async revokeUnadoptedToken(token: string): Promise {
+ // Retain the cleanup target in memory even when SecretStorage itself is
+ // temporarily unavailable. This process can still retry without falsely
+ // claiming that durable cleanup was queued.
+ this.stagedSessionTokenToRevoke = token;
+ let durablyStaged = false;
+ try {
+ stageSessionToken(this.app.secretStorage, token);
+ durablyStaged = true;
+ } catch (error) {
+ this.debug("unadopted session staging failed", error);
+ }
+ try {
+ await this.api.logoutToken(token);
+ } catch (error) {
+ if (!isInvalidProductSessionError(error)) {
+ this.debug("unadopted session token revoke failed", error);
+ throw new AuthCompletionError(
+ durablyStaged
+ ? "DocFerry could not close the unused sign-in. It remains queued for secure cleanup; try again when connected."
+ : "DocFerry could not close the unused sign-in or save a durable cleanup record. Keep Obsidian open and try again."
+ );
+ }
+ }
+ try {
+ clearStagedSessionToken(this.app.secretStorage);
+ this.stagedSessionTokenToRevoke = "";
+ } catch (error) {
+ this.debug("unadopted session staging cleanup deferred", error);
+ }
+ }
+
+ private async reconcileStagedSessionToken(): Promise {
+ const token = this.stagedSessionTokenToRevoke;
+ if (!token) return true;
+ try {
+ await this.revokeUnadoptedToken(token);
+ return true;
+ } catch (error) {
+ this.debug("staged session cleanup failed", error);
+ new Notice("DocFerry is still closing an unfinished sign-in. Your current account remains unchanged.", 8000);
+ return false;
+ }
+ }
+
private clearSessionTokenCustody(): void {
this.docferrySettings.sessionToken = "";
try {
@@ -650,45 +809,23 @@ export default class DocferryPlugin extends Plugin {
}
async startLogin(): Promise {
+ if (!(await this.reconcileStagedSessionToken())) return;
await this.auth.startLogin();
}
async startSignup(): Promise {
+ if (!(await this.reconcileStagedSessionToken())) return;
if (!(await this.finishPendingImportBeforeAccountChange())) return;
- // Transactional switch: prove the replacement handoff is underway before
- // revoking the current session, so a browser failure keeps it intact.
- const opened = await this.auth.startLogin({ signup: true });
- if (!opened) return;
- if (!(await this.logoutBeforeAccountChange())) return;
- this.clearLocalBondieAccount();
- await this.saveSettings();
- this.settingTab?.refreshForAuthChange();
- this.refreshDashboardAuth();
+ // Keep the current account usable until the browser flow succeeds. The
+ // token-adoption callback revokes the old session immediately before it
+ // stores the confirmed replacement.
+ await this.auth.startLogin({ signup: true });
}
async reconnectAccount(): Promise {
+ if (!(await this.reconcileStagedSessionToken())) return;
if (!(await this.finishPendingImportBeforeAccountChange())) return;
- // Transactional switch: prove the replacement handoff is underway before
- // revoking the current session, so a browser failure keeps it intact.
- const opened = await this.auth.startLogin({ promptLogin: true });
- if (!opened) return;
- if (!(await this.logoutBeforeAccountChange())) return;
- this.clearLocalBondieAccount();
- await this.saveSettings();
- this.settingTab?.refreshForAuthChange();
- this.refreshDashboardAuth();
- }
-
- private async logoutBeforeAccountChange(): Promise {
- if (!this.docferrySettings.sessionToken) return true;
- try {
- await this.api.logout();
- return true;
- } catch (error) {
- if (isInvalidProductSessionError(error)) return true;
- new Notice(this.formatError(error, "Could not switch accounts"));
- return false;
- }
+ await this.auth.startLogin({ promptLogin: true });
}
async disconnectAccount(): Promise {
@@ -723,23 +860,11 @@ export default class DocferryPlugin extends Plugin {
* previous local session state.
*/
private async rejectMismatchedLoginToken(token: string): Promise {
- const previousSessionToken = this.docferrySettings.sessionToken;
- const previousAccount = this.docferrySettings.connectedAccount;
- const previousMembership = this.docferrySettings.membership;
- this.docferrySettings.sessionToken = token;
- try {
- await this.api.logout();
- } catch (error) {
- this.debug("logout mismatched account session failed", error);
- } finally {
- this.docferrySettings.sessionToken = previousSessionToken;
- this.docferrySettings.connectedAccount = previousAccount;
- this.docferrySettings.membership = previousMembership;
- await this.saveSettings();
- }
+ await this.revokeUnadoptedToken(token);
}
private async finishPendingImportBeforeAccountChange(): Promise {
+ if (!(await this.finishPendingShareBeforeAccountChange())) return false;
const submission = this.docferrySettings.pendingMediaNoteSubmission;
if (submission) {
// A persisted submission may already be a committed (charged) job:
@@ -768,6 +893,62 @@ export default class DocferryPlugin extends Plugin {
return false;
}
+ private async finishPendingShareBeforeAccountChange(): Promise {
+ const pending = this.docferrySettings.pendingSharePublish;
+ if (!pending) return true;
+ const connectedOwner = this.docferrySettings.connectedAccount?.productSubjectId;
+ if (!connectedOwner || pending.ownerProductSubjectId !== connectedOwner) {
+ new Notice(
+ "An unfinished share belongs to another Bondie account. Reconnect that account and finish the share before changing accounts.",
+ 8000
+ );
+ return false;
+ }
+
+ const deps = this.sharePublishSubmissionDeps();
+ let response: ShareResponse;
+ try {
+ response = await this.api.resolveShareCreate(pending.key);
+ await deps.store.save({ ...pending, response });
+ } catch (error) {
+ if (
+ error instanceof ShareApiError &&
+ (error.code === "share_idempotency_not_found" || error.code === "share_idempotency_inactive")
+ ) {
+ await finalizeShareCreate(deps.store, pending.key);
+ return true;
+ }
+ new Notice(this.formatError(error, "Could not confirm the unfinished share"), 8000);
+ return false;
+ }
+
+ let file = this.markdownFileByPath(pending.filePath);
+ if (!file && pending.sourceHash) file = await this.findUniqueMarkdownFileBySourceHash(pending.sourceHash);
+ if (file) {
+ await writeShareMeta(this.app, file, response, {
+ passwordEnabled: response.password_enabled,
+ expiresAt: response.expires_at
+ });
+ await finalizeShareCreate(deps.store, pending.key);
+ return true;
+ }
+
+ const confirmed = await confirmStopRecoveredShareBeforeAccountChange(
+ this.app,
+ response.title || "Recovered share",
+ pending.filePath
+ );
+ if (!confirmed) return false;
+ try {
+ await this.api.deleteShare(response.share_id);
+ await finalizeShareCreate(deps.store, pending.key);
+ return true;
+ } catch (error) {
+ new Notice(this.formatError(error, "Could not stop the unfinished share"), 8000);
+ return false;
+ }
+ }
+
private clearLocalBondieAccount(preservePendingImport = false): void {
this.billingReturnRefreshGeneration++;
this.clearPendingBillingReturnRefresh();
@@ -971,7 +1152,10 @@ export default class DocferryPlugin extends Plugin {
async updateShareFromList(share: ShareListItemResponse): Promise {
const vaultId = await this.resolveVaultId();
- if (!share.vault_id || share.vault_id !== vaultId) {
+ // A share without a recorded vault (CLI/agent-kit created) may be claimed
+ // by this vault when the source note resolves here; only a recorded
+ // mismatching vault id stays rejected.
+ if (resolveShareUpdateVaultGate(share.vault_id, vaultId) === "wrong-vault") {
new Notice("Open the source vault to update that share.");
return;
}
@@ -979,7 +1163,14 @@ export default class DocferryPlugin extends Plugin {
// unrelated note after the source note was renamed or moved.
let file = this.findSharedFileByShareId(share.share_id);
if (!file) {
- const byPath = this.markdownFileByPath(share.source_path);
+ // Legacy CLI shares remember an absolute path inside the source vault;
+ // try the remembered path as-is, then with the vault prefix stripped.
+ const adapter = this.app.vault.adapter as { basePath?: unknown };
+ const basePath = typeof adapter.basePath === "string" ? adapter.basePath : "";
+ let byPath = this.markdownFileByPath(share.source_path);
+ if (!byPath) {
+ byPath = this.markdownFileByPath(vaultRelativeShareSourcePath(share.source_path, basePath));
+ }
if (byPath) {
if (!this.currentShareMeta(byPath).id) {
// No recorded share on the path match: accept it as the source note
@@ -1002,7 +1193,7 @@ export default class DocferryPlugin extends Plugin {
async updateFolderShareFromList(folderShare: FolderShareResponse): Promise {
const vaultId = await this.resolveVaultId();
- if (folderShare.vault_id !== vaultId) {
+ if (resolveShareUpdateVaultGate(folderShare.vault_id, vaultId) === "wrong-vault") {
new Notice("Open the source vault to update that folder share.");
return;
}
@@ -1267,21 +1458,25 @@ export default class DocferryPlugin extends Plugin {
}
private publishInFlight = new Set();
+ private notePublishInFlight = false;
private async publishFile(file: TFile, selectedShare?: ShareListItemResponse): Promise {
- if (this.publishInFlight.has(file.path)) {
- new Notice("This note is already being published. Wait for the current publish to finish.");
+ if (this.notePublishInFlight) {
+ new Notice("Another note is already being published. Wait for it to finish before publishing this note.");
return;
}
+ this.notePublishInFlight = true;
this.publishInFlight.add(file.path);
try {
await this.publishFileCore(file, selectedShare);
} finally {
this.publishInFlight.delete(file.path);
+ this.notePublishInFlight = false;
}
}
private async publishFileCore(file: TFile, selectedShare?: ShareListItemResponse): Promise {
+ await this.reconcileCommittedSharePublish();
if (!this.docferrySettings.serverUrl) {
new Notice("Configure server URL first.");
return;
@@ -1331,10 +1526,10 @@ export default class DocferryPlugin extends Plugin {
let existingShare: Pick<
ShareListItemResponse,
"share_id" | "status" | "password_enabled" | "expires_at" | "theme_mode"
- > | null = selectedShare ?? null;
- let existingMetaId = existing.id;
+ > | null = null;
+ let existingMetaId = selectedShare?.share_id ?? existing.id;
let unreachableShareMeta: LegacyShareMeta | null = null;
- if (!existingShare && existingMetaId) {
+ if (existingMetaId) {
// Captured for the catch branch, where the mutable binding can no
// longer be narrowed after the reassignment inside try.
const unreachableShareId = existingMetaId;
@@ -1369,14 +1564,21 @@ export default class DocferryPlugin extends Plugin {
}
}
const existingShareId = existingShare?.share_id ?? existingMetaId;
- const existingExpiresAt = existingShare?.expires_at ?? existing.expires ?? null;
+ // Once the server says the old link is stopped, expired, or missing, its
+ // past expiry must not be copied into a fresh link.
+ const existingExpiresAt = existingShareId
+ ? existingShare?.expires_at ?? existing.expires ?? null
+ : null;
+ const previousPasswordEnabled = Boolean(existingShare?.password_enabled ?? existing.passwordEnabled);
const title = this.resolveTitle(file);
const canUseThemeStyling = Boolean(this.docferrySettings.membership?.canUseFullTheme);
const modal = new ShareModal(this.app, {
title,
passwordEnabled:
existingShare?.password_enabled ?? existing.passwordEnabled ?? this.docferrySettings.defaultPasswordEnabled,
- passwordAlreadySet: Boolean(existingShare?.password_enabled ?? existing.passwordEnabled),
+ // A stopped, expired, or missing share has no reusable server-side
+ // password even when old frontmatter says it used to be protected.
+ passwordAlreadySet: Boolean(existingShareId && previousPasswordEnabled),
expiresInDays: initialExpirySelection(existingExpiresAt, this.docferrySettings.defaultExpiresInDays),
existingExpiresAt,
isUpdate: Boolean(existingShareId),
@@ -1398,9 +1600,65 @@ export default class DocferryPlugin extends Plugin {
notice.setMessage(message);
});
notice.setMessage(existingShareId ? "Updating share link..." : "Publishing share link...");
- const response = existingShareId
- ? await this.updateOrCreateShare(existingShareId, payload, notice)
- : await this.api.createShare(payload);
+ const shareSubmissionDeps = this.sharePublishSubmissionDeps();
+ const publishResult = existingShareId
+ ? await this.updateOrCreateShare(
+ existingShareId,
+ file.path,
+ payload,
+ resolveFreshExpiryAfterUpdateFallback(
+ options.expirySelection,
+ options.expiresAt,
+ this.docferrySettings.defaultExpiresInDays
+ ),
+ notice,
+ shareSubmissionDeps
+ )
+ : await submitShareCreate(shareSubmissionDeps, {
+ filePath: file.path,
+ payload,
+ payloadHash: await sha256(stableSharePayloadString(payload)),
+ sourceHash: payload.source_hash,
+ ownerProductSubjectId: this.docferrySettings.connectedAccount?.productSubjectId ?? ""
+ });
+ if (!publishResult) {
+ notice.hide();
+ return;
+ }
+ let response = publishResult.response;
+ if ("filePathChanged" in publishResult && publishResult.filePathChanged) {
+ const confirmed = await confirmRecoveredShareReassignment(
+ this.app,
+ publishResult.originalFilePath,
+ options.title,
+ file.path
+ );
+ if (!confirmed) {
+ const stopRecovered = await confirmStopRecoveredShare(
+ this.app,
+ response.title || options.title,
+ publishResult.originalFilePath
+ );
+ if (!stopRecovered) {
+ notice.hide();
+ return;
+ }
+ await this.api.deleteShare(response.share_id);
+ if (publishResult.operationKey) {
+ await finalizeShareCreate(shareSubmissionDeps.store, publishResult.operationKey);
+ }
+ notice.hide();
+ new Notice("The recovered public link was stopped. Publish this note again to create a new link.", 8000);
+ return;
+ }
+ }
+ if ("payloadChanged" in publishResult && publishResult.payloadChanged) {
+ notice.setMessage("Applying your current note and sharing options...");
+ response = await this.api.updateShare(response.share_id, {
+ ...payload,
+ password_mode: options.passwordEnabled ? payload.password_mode : "clear"
+ });
+ }
if (legacyMeta) {
await preserveLegacyShareMeta(this.app, file, legacyMeta);
@@ -1408,10 +1666,16 @@ export default class DocferryPlugin extends Plugin {
if (unreachableShareMeta?.url) {
await preserveLegacyShareMeta(this.app, file, unreachableShareMeta);
}
+ if ("legacyMeta" in publishResult && publishResult.legacyMeta?.url) {
+ await preserveLegacyShareMeta(this.app, file, publishResult.legacyMeta);
+ }
await writeShareMeta(this.app, file, response, {
- passwordEnabled: options.passwordEnabled,
- expiresAt: options.expiresAt
+ passwordEnabled: response.password_enabled,
+ expiresAt: response.expires_at
});
+ if (publishResult.operationKey) {
+ await finalizeShareCreate(shareSubmissionDeps.store, publishResult.operationKey);
+ }
notice.hide();
try {
await navigator.clipboard.writeText(response.url);
@@ -1676,7 +1940,7 @@ export default class DocferryPlugin extends Plugin {
const status = await this.api.getShareStatus(shareId);
return hasActiveShareLink(status.status) ? "live" : "inactive";
} catch (error) {
- if (isStoppedShareError(error)) return "inactive";
+ if (isInactiveShareError(error)) return "inactive";
if (isMissingShareError(error)) return "missing";
return "unknown";
}
@@ -1684,20 +1948,53 @@ export default class DocferryPlugin extends Plugin {
private async updateOrCreateShare(
shareId: string,
+ filePath: string,
payload: SharePayload,
- notice: Notice
- ): Promise {
+ freshExpiresAt: string | null,
+ notice: Notice,
+ submissionDeps: SharePublishSubmissionDeps
+ ): Promise<{ response: ShareResponse; operationKey?: string; legacyMeta?: LegacyShareMeta } | null> {
try {
- return await this.api.updateShare(shareId, payload);
+ return { response: await this.api.updateShare(shareId, payload) };
} catch (error) {
- if (!(error instanceof ShareApiError) || (!isMissingShareError(error) && !isStoppedShareError(error))) {
+ if (!(error instanceof ShareApiError) || (!isMissingShareError(error) && !isInactiveShareError(error))) {
throw error;
}
+ let legacyMeta: LegacyShareMeta | undefined;
+ if (isMissingShareError(error)) {
+ const file = this.markdownFileByPath(filePath);
+ const lastKnownUrl = file ? this.currentShareMeta(file).url ?? "" : "";
+ const confirmed = await confirmUnreachableShareRepublish(
+ this.app,
+ payload.title,
+ filePath,
+ lastKnownUrl
+ );
+ if (!confirmed) return null;
+ legacyMeta = { id: shareId, url: lastKnownUrl };
+ }
notice.setMessage("The existing share is no longer available. Publishing a new link...");
- return this.api.createShare({
+ if (payload.password_mode === "keep" && !payload.password) {
+ throw new Error(
+ "The old password cannot be copied to a new link. Publish again and enter a new password to keep this note protected."
+ );
+ }
+ // The fallback create is a create like any other: it must ride the
+ // idempotent submission channel so a lost response followed by a retry
+ // resolves to the same share instead of minting a second public link.
+ const createPayload = {
...payload,
+ expires_at: freshExpiresAt,
password_mode: undefined
+ };
+ const created = await submitShareCreate(submissionDeps, {
+ filePath,
+ payload: createPayload,
+ payloadHash: await sha256(stableSharePayloadString(createPayload)),
+ sourceHash: createPayload.source_hash,
+ ownerProductSubjectId: this.docferrySettings.connectedAccount?.productSubjectId ?? ""
});
+ return { ...created, legacyMeta };
}
}
@@ -1766,6 +2063,17 @@ export default class DocferryPlugin extends Plugin {
return file instanceof TFile && file.extension === "md" ? file : null;
}
+ private async findUniqueMarkdownFileBySourceHash(sourceHash: string): Promise {
+ const matches: TFile[] = [];
+ for (const file of this.app.vault.getMarkdownFiles()) {
+ const markdown = await this.app.vault.cachedRead(file);
+ if (`sha256:${await sha256(markdown)}` !== sourceHash) continue;
+ matches.push(file);
+ if (matches.length > 1) return null;
+ }
+ return matches[0] ?? null;
+ }
+
/** Locates the vault note whose current-service df_id matches the share, wherever it was moved to. */
private findSharedFileByShareId(shareId: string): TFile | null {
for (const file of this.app.vault.getMarkdownFiles()) {
@@ -1774,6 +2082,14 @@ export default class DocferryPlugin extends Plugin {
return null;
}
+ /** Clears a journal entry only after its response is already in frontmatter. */
+ private async reconcileCommittedSharePublish(): Promise {
+ const pending = this.docferrySettings.pendingSharePublish;
+ const shareId = pending?.response?.share_id;
+ if (!pending || !shareId || !this.findSharedFileByShareId(shareId)) return;
+ await finalizeShareCreate(this.sharePublishSubmissionDeps().store, pending.key);
+ }
+
private async clearLocalShareMetaForId(shareId: string): Promise {
const file = this.findSharedFileByShareId(shareId);
if (file) await clearShareMeta(this.app, file);
@@ -1845,6 +2161,9 @@ export default class DocferryPlugin extends Plugin {
const hasDetailedNoteCapacity = Boolean(
membership && hasMediaNoteJobCapacity(membership.mediaNoteMonthlyJobsUsed, membership.mediaNoteMonthlyJobLimit)
);
+ const remainingMonthlyJobs = membership
+ ? mediaNoteMonthlyJobsRemaining(membership.mediaNoteMonthlyJobsUsed, membership.mediaNoteMonthlyJobLimit)
+ : null;
const prepareDetailedNote = runtimeCanPrepareDetailedNote && hasDetailedNoteCapacity;
if (!prepareDetailedNote) {
if (membership?.hasMediaNoteEntitlement && requiresDetailedNoteProvider(linkNote.provider)) {
@@ -1866,6 +2185,17 @@ export default class DocferryPlugin extends Plugin {
throw new Error("Reconnect your Bondie account before starting a detailed note.");
}
+ if (remainingMonthlyJobs !== null && remainingMonthlyJobs <= MEDIA_NOTE_LOW_QUOTA_NOTICE_THRESHOLD) {
+ // Warn before the job consumes one of the last monthly Advanced Import
+ // credits so a low-balance spend is never a surprise.
+ new Notice(
+ remainingMonthlyJobs === 1
+ ? "This will use your last Advanced Import this month."
+ : `This will use 1 of your remaining ${remainingMonthlyJobs} Advanced Imports this month.`,
+ 8000
+ );
+ }
+
onProgress?.("starting");
const created = await submitMediaNoteJob(
this.mediaNoteSubmissionDeps(),
@@ -1976,6 +2306,11 @@ export default class DocferryPlugin extends Plugin {
completed: MediaNoteJobResponse,
onProgress?: (progress: MediaNoteProgress) => void
): Promise {
+ if (this.docferrySettings.pendingMediaNoteImport?.jobId !== completed.job_id) {
+ // The import was cancelled after the job completed: cancel already
+ // cleared the pending record, so the review step must not run.
+ return null;
+ }
if (!completed.markdown) {
await this.clearPendingMediaNoteImport(completed.job_id);
throw new Error(mediaNoteFailureMessage(completed));
@@ -1988,6 +2323,11 @@ export default class DocferryPlugin extends Plugin {
new Notice("The note is kept for later review. Resume it from the DocFerry dashboard.", 8000);
return null;
}
+ if (this.docferrySettings.pendingMediaNoteImport?.jobId !== completed.job_id) {
+ // Cancelled while the review dialog was open: the cancel wins over the
+ // confirmation and nothing is saved.
+ return null;
+ }
const pending = this.docferrySettings.pendingMediaNoteImport;
let targetPath = pending?.jobId === completed.job_id ? pending.targetPath : undefined;
if (!targetPath) {
@@ -2021,6 +2361,22 @@ export default class DocferryPlugin extends Plugin {
await this.saveSettings();
}
+ private sharePublishSubmissionDeps(): SharePublishSubmissionDeps {
+ return {
+ store: {
+ read: () => this.docferrySettings.pendingSharePublish,
+ save: async (record: PendingSharePublish | null) => {
+ this.docferrySettings.pendingSharePublish = record;
+ await this.saveSettings();
+ }
+ },
+ createShare: (payload, key) => this.api.createShare(payload, key),
+ resolveShare: (key) => this.api.resolveShareCreate(key),
+ generateKey: () => mediaNoteIdempotencyKey(),
+ now: () => new Date().toISOString()
+ };
+ }
+
private mediaNoteSubmissionDeps(): MediaNoteSubmissionDeps {
return {
store: {
@@ -2375,9 +2731,20 @@ export default class DocferryPlugin extends Plugin {
const pendingByPath = new Map();
const imageAssets: Array = [];
const imageAssetPaths: Array<{ targetPath: string; originalPath: string } | null> = [];
+ const skippedUnsafeRefs: string[] = [];
for (const ref of refs) {
+ // Never upload hidden dotfiles (`.obsidian/...`) or traversal paths, no
+ // matter whether the reference resolves inside or outside the vault.
+ if (isUnsafeAssetPath(ref.path)) {
+ skippedUnsafeRefs.push(ref.path);
+ continue;
+ }
const target = this.resolveLinkedFile(ref.path, sourceFile);
+ if (target && isUnsafeAssetPath(target.path)) {
+ skippedUnsafeRefs.push(ref.path);
+ continue;
+ }
const contentType = target ? contentTypeForExtension(target.extension) : null;
const role = target ? assetRoleForExtension(target.extension) : null;
if (!target || target.extension.toLowerCase() === "md" || !contentType || !role) {
@@ -2402,6 +2769,17 @@ export default class DocferryPlugin extends Plugin {
}
}
+ if (skippedUnsafeRefs.length) {
+ const listed = skippedUnsafeRefs.slice(0, 3).join(", ");
+ const extra = skippedUnsafeRefs.length > 3 ? ` and ${skippedUnsafeRefs.length - 3} more` : "";
+ new Notice(
+ `DocFerry skipped ${skippedUnsafeRefs.length} hidden or unsafe asset reference${
+ skippedUnsafeRefs.length === 1 ? "" : "s"
+ } (never uploaded): ${listed}${extra}.`,
+ 8000
+ );
+ }
+
const pendingAssets = Array.from(pendingByPath.values());
const linkedAssets = await mapWithConcurrency(pendingAssets, ASSET_UPLOAD_CONCURRENCY, (asset) =>
this.uploadLocalAsset(asset)
diff --git a/plugin/src/media-note-availability.ts b/plugin/src/media-note-availability.ts
index 6d21bf7..90487c9 100644
--- a/plugin/src/media-note-availability.ts
+++ b/plugin/src/media-note-availability.ts
@@ -40,3 +40,9 @@ export function requiresDetailedNoteProvider(provider: ExternalLinkProvider): bo
export function hasMediaNoteJobCapacity(used: number, limit: number | null): boolean {
return limit === null || used < limit;
}
+
+export const MEDIA_NOTE_LOW_QUOTA_NOTICE_THRESHOLD = 3;
+
+export function mediaNoteMonthlyJobsRemaining(used: number, limit: number | null): number | null {
+ return limit === null ? null : Math.max(0, limit - used);
+}
diff --git a/plugin/src/publish-state.ts b/plugin/src/publish-state.ts
index 45aea48..865d330 100644
--- a/plugin/src/publish-state.ts
+++ b/plugin/src/publish-state.ts
@@ -19,6 +19,18 @@ export function resolveExpirySelection(
return expires.toISOString();
}
+export function resolveFreshExpiryAfterUpdateFallback(
+ selection: string | undefined,
+ selectedExpiresAt: string | null | undefined,
+ configuredDefault: string,
+ now: Date = new Date()
+): string | null {
+ // "keep" refers to the old public link. A replacement is a new link and
+ // must start from the current default instead of inheriting that schedule.
+ if (selection === "keep") return resolveExpirySelection(configuredDefault, null, now);
+ return selectedExpiresAt ?? null;
+}
+
export function initialThemeStyling(
canUseThemeStyling: boolean,
existingThemeMode: "reader" | "full" | null | undefined,
diff --git a/plugin/src/service-boundary.ts b/plugin/src/service-boundary.ts
index a3751ad..dad7fbf 100644
--- a/plugin/src/service-boundary.ts
+++ b/plugin/src/service-boundary.ts
@@ -5,6 +5,7 @@ export interface ProductServiceSettings {
membership: unknown;
pendingMediaNoteImport: unknown;
pendingMediaNoteSubmission: unknown;
+ pendingSharePublish: unknown;
}
export function enforceProductionServiceBoundary(
@@ -19,6 +20,7 @@ export function enforceProductionServiceBoundary(
settings.membership = null;
settings.pendingMediaNoteImport = null;
settings.pendingMediaNoteSubmission = null;
+ settings.pendingSharePublish = null;
// The pending login handshake lives in SecretStorage; the caller clears
// that custody on a boundary reset (loadSettings).
return true;
diff --git a/plugin/src/session-token-custody.ts b/plugin/src/session-token-custody.ts
index 8814069..bf1a7cb 100644
--- a/plugin/src/session-token-custody.ts
+++ b/plugin/src/session-token-custody.ts
@@ -6,6 +6,7 @@
*/
export const SESSION_TOKEN_SECRET_ID = "session-token";
+export const STAGED_SESSION_TOKEN_SECRET_ID = "staged-session-token";
export interface SessionTokenSecretStore {
getSecret(id: string): string | null;
@@ -17,6 +18,8 @@ export interface SessionTokenResolution {
token: string;
/** True when persisted settings still carry a legacy token to scrub on save. */
scrubLegacy: boolean;
+ /** Session superseded by a committed switch, or an unused login, to revoke. */
+ stagedTokenToRevoke: string;
}
/**
@@ -36,15 +39,23 @@ export function resolveSessionTokenOnLoad(
const legacy = typeof legacyToken === "string" ? legacyToken : "";
if (boundaryReset) {
store.setSecret(SESSION_TOKEN_SECRET_ID, "");
- return { token: "", scrubLegacy: Boolean(legacy) };
+ store.setSecret(STAGED_SESSION_TOKEN_SECRET_ID, "");
+ return { token: "", scrubLegacy: Boolean(legacy), stagedTokenToRevoke: "" };
}
const stored = store.getSecret(SESSION_TOKEN_SECRET_ID) || "";
- if (stored) return { token: stored, scrubLegacy: Boolean(legacy) };
+ let staged = store.getSecret(STAGED_SESSION_TOKEN_SECRET_ID) || "";
+ if (staged && staged === stored) {
+ // A switch staged the old session but crashed before committing the new
+ // active token. The current session is still authoritative, so retain it.
+ store.setSecret(STAGED_SESSION_TOKEN_SECRET_ID, "");
+ staged = "";
+ }
+ if (stored) return { token: stored, scrubLegacy: Boolean(legacy), stagedTokenToRevoke: staged };
if (legacy) {
store.setSecret(SESSION_TOKEN_SECRET_ID, legacy);
- return { token: legacy, scrubLegacy: true };
+ return { token: legacy, scrubLegacy: true, stagedTokenToRevoke: staged };
}
- return { token: "", scrubLegacy: false };
+ return { token: "", scrubLegacy: false, stagedTokenToRevoke: staged };
}
/** Persists the session token; an empty token clears the stored secret. */
@@ -52,6 +63,15 @@ export function persistSessionToken(store: SessionTokenSecretStore, token: strin
store.setSecret(SESSION_TOKEN_SECRET_ID, token);
}
+/** Stores a token that must be revoked after the active-session commit. */
+export function stageSessionToken(store: SessionTokenSecretStore, token: string): void {
+ store.setSecret(STAGED_SESSION_TOKEN_SECRET_ID, token);
+}
+
+export function clearStagedSessionToken(store: SessionTokenSecretStore): void {
+ store.setSecret(STAGED_SESSION_TOKEN_SECRET_ID, "");
+}
+
export const PENDING_AUTH_STATE_SECRET_ID = "pending-auth-state";
export const PENDING_AUTH_STARTED_AT_SECRET_ID = "pending-auth-started-at";
export const PENDING_AUTH_VERIFIER_SECRET_ID = "pending-auth-verifier";
diff --git a/plugin/src/settings.ts b/plugin/src/settings.ts
index 078a5eb..cdf8013 100644
--- a/plugin/src/settings.ts
+++ b/plugin/src/settings.ts
@@ -2,6 +2,7 @@ import { App, Notice, Plugin, PluginSettingTab, Setting, setIcon } from "obsidia
import { DOCFERRY_PRODUCT_DESCRIPTION, DOCFERRY_PRODUCT_NAME, renderDocferryHeader } from "./brand";
import { canUseMediaNote } from "./media-note-availability";
import type { PendingMediaNoteSubmission } from "./media-note-submission";
+import type { PendingSharePublish } from "./share-publish-submission";
import type {
DisplayUser,
MembershipResponse,
@@ -71,6 +72,7 @@ export interface DocferrySettings {
membership: MembershipSnapshot | null;
pendingMediaNoteImport: PendingMediaNoteImport | null;
pendingMediaNoteSubmission: PendingMediaNoteSubmission | null;
+ pendingSharePublish: PendingSharePublish | null;
// The pending login handshake (state, startedAt, PKCE verifier) lives in
// SecretStorage, never in persisted settings; see session-token-custody.ts.
clientInstanceId: string;
@@ -89,6 +91,7 @@ export const DEFAULT_SETTINGS: DocferrySettings = {
membership: null,
pendingMediaNoteImport: null,
pendingMediaNoteSubmission: null,
+ pendingSharePublish: null,
clientInstanceId: "",
defaultPasswordEnabled: false,
defaultExpiresInDays: "never",
diff --git a/plugin/src/share-actions.ts b/plugin/src/share-actions.ts
index 518d1f5..1cb8bc0 100644
--- a/plugin/src/share-actions.ts
+++ b/plugin/src/share-actions.ts
@@ -14,3 +14,21 @@ export function shareListSummary(statuses: readonly ShareStatus[]): string {
return parts.length ? `${parts.join(", ")}.` : "No shares yet.";
}
+
+// Vault gate for updating an existing share from the share list. A share whose
+// vault_id was never reported (CLI/agent-kit created shares) may be claimed by
+// the vault that owns the source note; a reported mismatch stays rejected.
+export function resolveShareUpdateVaultGate(
+ shareVaultId: string | null | undefined,
+ localVaultId: string
+): "update" | "claim" | "wrong-vault" {
+ if (!shareVaultId) return "claim";
+ return shareVaultId === localVaultId ? "update" : "wrong-vault";
+}
+
+// Legacy CLI shares stored the source path as an absolute path inside the
+// originating vault; strip that prefix so the path resolves vault-relative.
+export function vaultRelativeShareSourcePath(sourcePath: string, vaultBasePath: string): string {
+ const prefix = `${vaultBasePath}/`;
+ return sourcePath.startsWith(prefix) ? sourcePath.slice(prefix.length) : sourcePath;
+}
diff --git a/plugin/src/share-lifecycle.ts b/plugin/src/share-lifecycle.ts
index 72521f8..ff8448b 100644
--- a/plugin/src/share-lifecycle.ts
+++ b/plugin/src/share-lifecycle.ts
@@ -12,6 +12,14 @@ export function isStoppedShareError(error: unknown): boolean {
return hasStatusAndCode(error, 410, "share_stopped");
}
+export function isExpiredShareError(error: unknown): boolean {
+ return hasStatusAndCode(error, 410, "share_expired");
+}
+
+export function isInactiveShareError(error: unknown): boolean {
+ return isStoppedShareError(error) || isExpiredShareError(error);
+}
+
function hasStatusAndCode(error: unknown, status: number, code: string): boolean {
if (!error || typeof error !== "object") return false;
const record = error as { status?: unknown; code?: unknown };
diff --git a/plugin/src/share-modal.ts b/plugin/src/share-modal.ts
index 902192f..09f8324 100644
--- a/plugin/src/share-modal.ts
+++ b/plugin/src/share-modal.ts
@@ -131,6 +131,7 @@ export class ShareModal extends Modal {
passwordEnabled: this.passwordEnabled,
password: this.passwordEnabled ? this.password : undefined,
expiresAt: this.resolveExpiresAt(),
+ expirySelection: this.expiresInDays,
useThemeStyling: this.defaults.canUseThemeStyling && this.useThemeStyling
});
});
diff --git a/plugin/src/share-publish-submission.ts b/plugin/src/share-publish-submission.ts
new file mode 100644
index 0000000..9960e4e
--- /dev/null
+++ b/plugin/src/share-publish-submission.ts
@@ -0,0 +1,165 @@
+import type { SharePayload, ShareResponse } from "./types";
+
+export interface PendingSharePublish {
+ key: string;
+ filePath: string;
+ payloadHash: string;
+ sourceHash?: string;
+ ownerProductSubjectId: string;
+ createdAt: string;
+ response?: ShareResponse | null;
+}
+
+export interface SubmittedShareCreate {
+ response: ShareResponse;
+ operationKey: string;
+ payloadChanged: boolean;
+ filePathChanged: boolean;
+ originalFilePath: string;
+}
+
+export interface SharePublishSubmissionStore {
+ read(): PendingSharePublish | null;
+ save(record: PendingSharePublish | null): Promise;
+}
+
+export interface SharePublishSubmissionDeps {
+ store: SharePublishSubmissionStore;
+ createShare(payload: SharePayload, key: string): Promise;
+ resolveShare(key: string): Promise;
+ generateKey(): string;
+ now(): string;
+}
+
+export const SHARE_PUBLISH_LOST_CONNECTION_MESSAGE =
+ "The connection was lost while publishing. Publishing the same note again resumes safely without creating a duplicate link.";
+export const SHARE_PUBLISH_PENDING_ACCOUNT_MESSAGE =
+ "A share from another Bondie account is still being recovered. Reconnect that account before publishing a new link.";
+
+export function isDefinitiveSharePublishRejection(error: unknown): boolean {
+ const status = (error as { status?: unknown } | null)?.status;
+ return typeof status === "number" && status >= 400 && status < 500;
+}
+
+function isInactiveShareReplay(error: unknown): boolean {
+ return (error as { code?: unknown } | null)?.code === "share_idempotency_inactive";
+}
+
+function isMissingShareOperation(error: unknown): boolean {
+ return (error as { code?: unknown } | null)?.code === "share_idempotency_not_found";
+}
+
+async function clearCurrentOperation(store: SharePublishSubmissionStore, key: string): Promise {
+ if (store.read()?.key === key) await store.save(null);
+}
+
+/**
+ * Stable serialization for the client-side payload hash. Hashes are only ever
+ * compared against other hashes from this function, so this does not need to
+ * match the server's request hash byte-for-byte.
+ */
+export function stableSharePayloadString(payload: SharePayload): string {
+ return JSON.stringify(sortKeysDeep(payload));
+}
+
+function sortKeysDeep(value: unknown): unknown {
+ if (Array.isArray(value)) return value.map(sortKeysDeep);
+ if (value && typeof value === "object") {
+ const source = value as Record;
+ const sorted: Record = {};
+ for (const key of Object.keys(source).sort()) sorted[key] = sortKeysDeep(source[key]);
+ return sorted;
+ }
+ return value;
+}
+
+/**
+ * Create a share with a durable, owner-scoped idempotency key. The key is
+ * persisted before the create request, resolved before the same note can be
+ * published again after an uncertain failure, and retained until
+ * the caller durably writes the returned share identity into frontmatter.
+ *
+ * A pending record for a different note blocks another create. It
+ * cannot be discarded safely because the previous request may already have
+ * committed remotely even when its response was lost.
+ */
+export async function submitShareCreate(
+ deps: SharePublishSubmissionDeps,
+ input: {
+ filePath: string;
+ payload: SharePayload;
+ payloadHash: string;
+ sourceHash: string;
+ ownerProductSubjectId: string;
+ },
+ inactiveRetryRemaining = 1
+): Promise {
+ const existing = deps.store.read();
+ if (existing && existing.ownerProductSubjectId !== input.ownerProductSubjectId) {
+ throw new Error(SHARE_PUBLISH_PENDING_ACCOUNT_MESSAGE);
+ } else if (existing) {
+ try {
+ const resolved = await deps.resolveShare(existing.key);
+ await deps.store.save({ ...existing, response: resolved });
+ return {
+ response: resolved,
+ operationKey: existing.key,
+ payloadChanged: existing.payloadHash !== input.payloadHash,
+ filePathChanged: existing.filePath !== input.filePath,
+ originalFilePath: existing.filePath
+ };
+ } catch (error) {
+ if (isMissingShareOperation(error) || isInactiveShareReplay(error)) {
+ await clearCurrentOperation(deps.store, existing.key);
+ } else if (isDefinitiveSharePublishRejection(error)) {
+ throw error;
+ } else {
+ throw new Error(SHARE_PUBLISH_LOST_CONNECTION_MESSAGE);
+ }
+ }
+ }
+ let record = deps.store.read();
+ if (!record) {
+ record = {
+ key: deps.generateKey(),
+ filePath: input.filePath,
+ payloadHash: input.payloadHash,
+ sourceHash: input.sourceHash,
+ ownerProductSubjectId: input.ownerProductSubjectId,
+ createdAt: deps.now()
+ };
+ await deps.store.save(record);
+ }
+ let created: ShareResponse;
+ try {
+ created = await deps.createShare(input.payload, record.key);
+ } catch (error) {
+ if (isInactiveShareReplay(error)) {
+ await clearCurrentOperation(deps.store, record.key);
+ if (inactiveRetryRemaining > 0) {
+ return submitShareCreate(deps, input, inactiveRetryRemaining - 1);
+ }
+ throw error;
+ }
+ if (isDefinitiveSharePublishRejection(error)) {
+ await clearCurrentOperation(deps.store, record.key);
+ throw error;
+ }
+ throw new Error(SHARE_PUBLISH_LOST_CONNECTION_MESSAGE);
+ }
+ await deps.store.save({ ...record, response: created });
+ return {
+ response: created,
+ operationKey: record.key,
+ payloadChanged: false,
+ filePathChanged: false,
+ originalFilePath: record.filePath
+ };
+}
+
+export async function finalizeShareCreate(
+ store: SharePublishSubmissionStore,
+ operationKey: string
+): Promise {
+ await clearCurrentOperation(store, operationKey);
+}
diff --git a/plugin/src/types.ts b/plugin/src/types.ts
index e1fdf2f..342016b 100644
--- a/plugin/src/types.ts
+++ b/plugin/src/types.ts
@@ -11,6 +11,7 @@ export interface PublishOptions {
passwordEnabled: boolean;
password?: string;
expiresAt?: string | null;
+ expirySelection?: string;
useThemeStyling: boolean;
}
diff --git a/plugin/tests/asset-path-safety.test.mts b/plugin/tests/asset-path-safety.test.mts
new file mode 100644
index 0000000..1e028ac
--- /dev/null
+++ b/plugin/tests/asset-path-safety.test.mts
@@ -0,0 +1,62 @@
+import assert from "node:assert/strict";
+import { readFileSync } from "node:fs";
+import test from "node:test";
+
+import { isUnsafeAssetPath } from "../src/asset-path-safety.ts";
+
+const mainSource = readFileSync(new URL("../src/main.ts", import.meta.url), "utf8");
+
+test("hidden dotfile segments are unsafe", () => {
+ assert.equal(isUnsafeAssetPath(".obsidian/workspace"), true);
+ assert.equal(isUnsafeAssetPath(".obsidian/plugins/docferry/data.json"), true);
+ assert.equal(isUnsafeAssetPath("a/.hidden/b.png"), true);
+ assert.equal(isUnsafeAssetPath(".trash/note.png"), true);
+});
+
+test("path traversal segments are unsafe", () => {
+ assert.equal(isUnsafeAssetPath("../outside.png"), true);
+ assert.equal(isUnsafeAssetPath("a/../../outside.png"), true);
+ assert.equal(isUnsafeAssetPath("..\\outside.png"), true);
+});
+
+test("URL-encoded hidden and traversal variants are decoded before the check", () => {
+ assert.equal(isUnsafeAssetPath("%2eobsidian/workspace"), true);
+ assert.equal(isUnsafeAssetPath("..%2foutside.png"), true);
+ assert.equal(isUnsafeAssetPath("%252e%252e%252foutside.png"), true);
+ assert.equal(isUnsafeAssetPath("a/%2Ehidden/b.png"), true);
+});
+
+test("legit vault-relative paths pass", () => {
+ assert.equal(isUnsafeAssetPath("assets/chart.png"), false);
+ assert.equal(isUnsafeAssetPath("./assets/chart.png"), false);
+ assert.equal(isUnsafeAssetPath("folder/My File 2026.png"), false);
+ assert.equal(isUnsafeAssetPath("folder/My%20File.png"), false);
+ assert.equal(isUnsafeAssetPath(""), false);
+});
+
+test("publish uploads filter hidden and traversal references on raw and resolved paths", () => {
+ const uploadBody = mainSource.slice(
+ mainSource.indexOf("private async uploadLocalAssets"),
+ mainSource.indexOf("private async uploadLocalAsset(")
+ );
+ const rawFilter = uploadBody.indexOf("isUnsafeAssetPath(ref.path)");
+ const resolve = uploadBody.indexOf("this.resolveLinkedFile(ref.path, sourceFile)");
+ const resolvedFilter = uploadBody.indexOf("isUnsafeAssetPath(target.path)");
+ assert.ok(rawFilter > -1 && rawFilter < resolve, "raw reference must be filtered before vault resolution");
+ assert.ok(resolvedFilter > resolve, "resolved target path must be filtered before upload");
+ assert.match(uploadBody, /skippedUnsafeRefs/);
+ assert.match(uploadBody, /new Notice\(/);
+ assert.match(uploadBody, /never uploaded/);
+});
+
+test("the HTML snapshot rewriting cannot resurrect a skipped asset", () => {
+ // Placeholder rewriting only matches refs against actually-uploaded assets,
+ // so a filtered reference can never receive a docferry-asset:// URL.
+ const placeholderBody = mainSource.slice(
+ mainSource.indexOf("private applyLocalAttachmentPlaceholders"),
+ mainSource.indexOf("private extractLocalAssetRefs")
+ );
+ assert.match(placeholderBody, /attachmentAssets\.find/);
+ assert.doesNotMatch(placeholderBody, /isUnsafeAssetPath/);
+ assert.match(mainSource, /import \{ isUnsafeAssetPath \} from "\.\/asset-path-safety";/);
+});
diff --git a/plugin/tests/folder-share-access.test.mts b/plugin/tests/folder-share-access.test.mts
index 08e010a..782ab6c 100644
--- a/plugin/tests/folder-share-access.test.mts
+++ b/plugin/tests/folder-share-access.test.mts
@@ -1,9 +1,13 @@
import assert from "node:assert/strict";
+import { readFileSync } from "node:fs";
import test from "node:test";
-import { folderShareAccess } from "../src/folder-share-access.ts";
+import { canShowFolderShareEntry, folderShareAccess } from "../src/folder-share-access.ts";
import type { MembershipSnapshot } from "../src/settings.ts";
+const dashboardSource = readFileSync(new URL("../src/dashboard-view.ts", import.meta.url), "utf8");
+const mainSource = readFileSync(new URL("../src/main.ts", import.meta.url), "utf8");
+
function membership(overrides: Partial = {}): MembershipSnapshot {
return {
@@ -74,3 +78,40 @@ test("a server-unlimited projection treats null limits as available", () => {
assert.equal(folderShareAccess(admin, false), "allowed");
});
+
+test("hides folder share entry points only for plans without folder sharing", () => {
+ const free = membership({
+ planKey: "free",
+ activeFolderShareLimit: 0,
+ canCreateFolderShare: false,
+ canUseFullTheme: false
+ });
+
+ assert.equal(canShowFolderShareEntry(free), false);
+ assert.equal(canShowFolderShareEntry(membership()), true);
+ // At the active-share limit the entry stays visible so existing shares can
+ // be updated; the publish flow explains the limit.
+ assert.equal(
+ canShowFolderShareEntry(membership({ activeFolderShareCount: 5, canCreateFolderShare: false })),
+ true
+ );
+ // Unknown membership keeps entries visible; the publish flow re-checks.
+ assert.equal(canShowFolderShareEntry(null), true);
+ assert.equal(canShowFolderShareEntry(undefined), true);
+});
+
+test("gates the file menu, command palette, and dashboard drop cue on folder share access", () => {
+ assert.match(
+ mainSource,
+ /if \(file instanceof TFolder\) \{[\s\S]{0,200}?if \(!canShowFolderShareEntry\(this\.docferrySettings\.membership\)\) return;/
+ );
+ assert.match(
+ mainSource,
+ /id: "publish-current-folder"[\s\S]*?if \(!canShowFolderShareEntry\(this\.docferrySettings\.membership\)\) return false;/
+ );
+ assert.match(
+ dashboardSource,
+ /canShowFolderShareEntry\(this\.host\.docferrySettings\.membership\)[\s\S]*?"Release a note or folder to review sharing options\."/
+ );
+ assert.match(dashboardSource, /folderUpgradeRequired[\s\S]*?"Folder sharing is a Pro feature"/);
+});
diff --git a/plugin/tests/import-media-ux.test.mts b/plugin/tests/import-media-ux.test.mts
index aff2ea3..0f3d53e 100644
--- a/plugin/tests/import-media-ux.test.mts
+++ b/plugin/tests/import-media-ux.test.mts
@@ -67,3 +67,21 @@ test("IMPORT-UX-01: cancelling an import whose job is gone clears the record ins
assert.ok(notFoundIndex > -1 && clearIndex > notFoundIndex, "a 404 during cancel must terminally clear the pending record");
assert.match(body, /MEDIA_NOTE_TERMINAL_STATUSES\.has\(job\.status\)/);
});
+
+test("IMPORT-UX-01: a cancel that lands before or during review keeps the review closed", () => {
+ // Race analysis: cancelActiveMediaImport always clears pendingMediaNoteImport
+ // (cancelled, finished, or gone jobs all end in clearPendingMediaNoteImport),
+ // and waitForMediaNote already aborts polling when the record disappears.
+ // The remaining window is after the final poll returns a completed job:
+ // finishMediaNoteImport must re-check the record both before opening the
+ // review dialog and after the user confirms it, so the cancel wins.
+ const body = methodBody(mainSource, "private async finishMediaNoteImport", "private async setPendingMediaNoteImport");
+ const guard = 'if (this.docferrySettings.pendingMediaNoteImport?.jobId !== completed.job_id)';
+ const firstGuard = body.indexOf(guard);
+ const confirmIndex = body.indexOf("await confirmMediaNoteImport(this.app, completed)");
+ const secondGuard = body.indexOf(guard, confirmIndex);
+ const writeIndex = body.indexOf("await this.writeExternalImport(");
+ assert.ok(firstGuard > -1 && firstGuard < confirmIndex, "the pending-record guard must precede the review dialog");
+ assert.ok(secondGuard > confirmIndex, "the pending-record guard must run again after the review dialog resolves");
+ assert.ok(writeIndex > secondGuard, "nothing is written once the cancel cleared the record");
+});
diff --git a/plugin/tests/legacy-share-migration.test.mts b/plugin/tests/legacy-share-migration.test.mts
index a6bb75d..e8c8c22 100644
--- a/plugin/tests/legacy-share-migration.test.mts
+++ b/plugin/tests/legacy-share-migration.test.mts
@@ -19,7 +19,7 @@ test("publishFile reads raw share meta and gates on legacy migration before any
const detectIndex = publishFileBody.indexOf("legacyShareMetaForService(");
const modalIndex = publishFileBody.indexOf("await confirmLegacyShareMigration(");
assert.ok(detectIndex > -1 && modalIndex > detectIndex, "detection must precede the migration modal");
- for (const laterStep of ["showUploadNoticeIfNeeded(true)", "await this.loadMembership(true)", "createShare(payload)"]) {
+ for (const laterStep of ["showUploadNoticeIfNeeded(true)", "await this.loadMembership(true)", "submitShareCreate(shareSubmissionDeps"]) {
const stepIndex = publishFileBody.indexOf(laterStep);
assert.ok(stepIndex > modalIndex, `${laterStep} must run only after the migration decision`);
}
diff --git a/plugin/tests/media-note-availability.test.mts b/plugin/tests/media-note-availability.test.mts
index 96883ac..842ce8a 100644
--- a/plugin/tests/media-note-availability.test.mts
+++ b/plugin/tests/media-note-availability.test.mts
@@ -1,14 +1,19 @@
import assert from "node:assert/strict";
+import { readFileSync } from "node:fs";
import test from "node:test";
import {
+ MEDIA_NOTE_LOW_QUOTA_NOTICE_THRESHOLD,
canUseMediaNote,
hasMediaNoteJobCapacity,
+ mediaNoteMonthlyJobsRemaining,
requiresDetailedNoteProvider,
shouldPrepareDetailedNote,
supportsDetailedNoteProvider
} from "../src/media-note-availability.ts";
+const mainSource = readFileSync(new URL("../src/main.ts", import.meta.url), "utf8");
+
test("treats a null job limit as unlimited and detects exhausted quotas", () => {
assert.equal(hasMediaNoteJobCapacity(200, null), true);
assert.equal(hasMediaNoteJobCapacity(29, 30), true);
@@ -16,6 +21,28 @@ test("treats a null job limit as unlimited and detects exhausted quotas", () =>
assert.equal(hasMediaNoteJobCapacity(31, 30), false);
});
+test("reports remaining monthly jobs only for bounded plans", () => {
+ assert.equal(mediaNoteMonthlyJobsRemaining(200, null), null);
+ assert.equal(mediaNoteMonthlyJobsRemaining(27, 30), 3);
+ assert.equal(mediaNoteMonthlyJobsRemaining(29, 30), 1);
+ assert.equal(mediaNoteMonthlyJobsRemaining(30, 30), 0);
+});
+
+test("warns before consuming one of the last monthly advanced imports", () => {
+ assert.equal(MEDIA_NOTE_LOW_QUOTA_NOTICE_THRESHOLD, 3);
+ // The notice fires after access checks pass but before the job is created.
+ const importBody = mainSource.slice(
+ mainSource.indexOf("async importExternalLink("),
+ mainSource.indexOf("async cancelActiveMediaImport(")
+ );
+ const noticeIndex = importBody.indexOf("remainingMonthlyJobs <= MEDIA_NOTE_LOW_QUOTA_NOTICE_THRESHOLD");
+ const startIndex = importBody.indexOf('onProgress?.("starting")');
+ assert.ok(noticeIndex > -1, "importExternalLink must check the remaining monthly quota");
+ assert.ok(startIndex > noticeIndex, "the low-quota notice must precede job creation");
+ assert.match(importBody, /This will use your last Advanced Import this month\./);
+ assert.match(importBody, /This will use 1 of your remaining \$\{remainingMonthlyJobs\} Advanced Imports this month\./);
+});
+
test("requires paid entitlement and an enabled DocFerry runtime", () => {
const ready = { enabled: true, supportedProviders: ["web", "wechat", "youtube"] };
diff --git a/plugin/tests/product-entrypoints.test.mts b/plugin/tests/product-entrypoints.test.mts
index 8e6feaa..6220175 100644
--- a/plugin/tests/product-entrypoints.test.mts
+++ b/plugin/tests/product-entrypoints.test.mts
@@ -30,10 +30,10 @@ test("gives disconnected users a visible path into browser login", () => {
});
test("binds dashboard updates to the selected share and source vault", () => {
- assert.match(mainSource, /if \(!share\.vault_id \|\| share\.vault_id !== vaultId\)/);
+ assert.match(mainSource, /resolveShareUpdateVaultGate\(share\.vault_id, vaultId\) === "wrong-vault"/);
assert.match(mainSource, /await this\.publishFile\(file, share\)/);
assert.match(mainSource, /const existingShareId = existingShare\?\.share_id \?\? existingMetaId/);
- assert.match(mainSource, /this\.updateOrCreateShare\(existingShareId, payload, notice\)/);
+ assert.match(mainSource, /this\.updateOrCreateShare\([\s\S]*?existingShareId,[\s\S]*?file\.path,[\s\S]*?payload,[\s\S]*?resolveFreshExpiryAfterUpdateFallback\(/);
});
test("preserves protected-share and publish presentation state during updates", () => {
@@ -52,14 +52,25 @@ test("forces the only supported production service URL and removes inert image c
assert.doesNotMatch(settingsSource, /imageUploadQuality/);
});
-test("keeps local account state when remote logout cannot complete", () => {
- assert.match(mainSource, /private async logoutBeforeAccountChange\(\): Promise/);
- assert.match(mainSource, /new Notice\(this\.formatError\(error, "Could not switch accounts"\)\);\s*return false/);
+test("keeps the current account until replacement login succeeds", () => {
+ // Opening the browser is not proof that another account authenticated. Keep
+ // the current product session usable until the token-adoption callback has
+ // a confirmed replacement, then revoke the old server session there.
+ for (const start of ["async startSignup", "async reconnectAccount"]) {
+ const startIndex = mainSource.indexOf(start);
+ assert.ok(startIndex > -1, `${start} must exist`);
+ const body = mainSource.slice(startIndex, startIndex + 600);
+ assert.match(body, /await this\.auth\.startLogin\(/);
+ assert.doesNotMatch(body, /clearLocalBondieAccount|logoutBeforeAccountChange|sessionRevoked/);
+ }
+ assert.match(mainSource, /const previousToken = this\.docferrySettings\.sessionToken/);
+ assert.match(mainSource, /if \(previousToken && previousToken !== token\)/);
+ assert.match(mainSource, /await this\.replaceSessionToken\(previousToken, token\)/);
+ assert.match(mainSource, /await this\.api\.logoutToken\(previousToken\)/);
assert.match(
mainSource,
/if \(!isInvalidProductSessionError\(error\)\) \{\s*new Notice\(this\.formatError\(error, "Could not disconnect"\)\);\s*return;\s*\}/
);
- assert.match(mainSource, /if \(!\(await this\.logoutBeforeAccountChange\(\)\)\) return/);
});
test("does not emit share identifiers, vault paths, or raw errors in debug logs", () => {
diff --git a/plugin/tests/publish-state.test.mts b/plugin/tests/publish-state.test.mts
index 8e923fc..b170ab9 100644
--- a/plugin/tests/publish-state.test.mts
+++ b/plugin/tests/publish-state.test.mts
@@ -4,7 +4,8 @@ import test from "node:test";
import {
initialExpirySelection,
initialThemeStyling,
- resolveExpirySelection
+ resolveExpirySelection,
+ resolveFreshExpiryAfterUpdateFallback
} from "../src/publish-state.ts";
test("preserves an existing expiration until the user changes it", () => {
@@ -23,6 +24,20 @@ test("uses configured expiration defaults only for new shares", () => {
assert.equal(initialExpirySelection(undefined, "never"), "never");
});
+test("a replacement link never inherits a future expiry from the dead link", () => {
+ const now = new Date("2026-08-19T10:00:00.000Z");
+ assert.equal(
+ resolveFreshExpiryAfterUpdateFallback("keep", "2026-08-31T10:00:00.000Z", "30", now),
+ "2026-09-18T10:00:00.000Z"
+ );
+ assert.equal(resolveFreshExpiryAfterUpdateFallback("keep", "2026-08-31T10:00:00.000Z", "never", now), null);
+ assert.equal(
+ resolveFreshExpiryAfterUpdateFallback("30", "2026-09-18T10:00:00.000Z", "never", now),
+ "2026-09-18T10:00:00.000Z"
+ );
+ assert.equal(resolveFreshExpiryAfterUpdateFallback("never", null, "30", now), null);
+});
+
test("preserves reader or full theme mode on update", () => {
assert.equal(initialThemeStyling(true, "reader", true), false);
assert.equal(initialThemeStyling(true, "full", true), true);
diff --git a/plugin/tests/session-lifecycle.test.mts b/plugin/tests/session-lifecycle.test.mts
index 7ba2c26..26a42e7 100644
--- a/plugin/tests/session-lifecycle.test.mts
+++ b/plugin/tests/session-lifecycle.test.mts
@@ -14,7 +14,8 @@ function methodBody(source: string, startMarker: string, endMarker: string): str
}
test("session token never persists to data.json and resolves through SecretStorage at load", () => {
- assert.match(mainSource, /saveData\(\{ \.\.\.this\.docferrySettings, sessionToken: "" \}\)/);
+ assert.match(mainSource, /const snapshot = \{ \.\.\.this\.docferrySettings, sessionToken: "" \}/);
+ assert.match(mainSource, /this\.settingsSaveQueue\.then\(\(\) => this\.saveData\(snapshot\)\)/);
assert.match(mainSource, /resolveSessionTokenOnLoad\(\s*this\.app\.secretStorage,/);
assert.match(mainSource, /could not access secure credential storage\. Update Obsidian/);
assert.match(mainSource, /import \{[^}]*persistSessionToken[^}]*resolveSessionTokenOnLoad[^}]*\} from "\.\/session-token-custody"/);
@@ -26,27 +27,38 @@ test("logout, disconnect, and invalid-session cleanup clear the SecretStorage to
assert.match(mainSource, /persistSessionToken\(this\.app\.secretStorage, ""\)/);
});
-test("connect-while-connected revokes the prior server session before adopting the new token", () => {
- const adoptCall = mainSource.indexOf("this.adoptSessionToken(token);");
+test("connect-while-connected durably queues the old token before committing the replacement", () => {
+ const replaceCall = mainSource.indexOf("await this.replaceSessionToken(previousToken, token);");
const revokeGuard = mainSource.indexOf("previousToken && previousToken !== token");
assert.ok(revokeGuard > -1, "previous-session revoke guard must exist");
- assert.ok(adoptCall > revokeGuard, "revocation must run before token adoption");
- const between = mainSource.slice(revokeGuard, adoptCall);
- assert.match(between, /await this\.api\.logout\(\)/);
+ assert.ok(replaceCall > revokeGuard, "replacement transaction must run after the account-change guard");
+ const helper = methodBody(mainSource, "private async replaceSessionToken", "private async revokeUnadoptedToken");
+ const stageIndex = helper.indexOf("stageSessionToken(this.app.secretStorage, previousToken)");
+ const commitIndex = helper.indexOf("persistSessionToken(this.app.secretStorage, replacementToken)");
+ const adoptIndex = helper.indexOf("this.docferrySettings.sessionToken = replacementToken");
+ const revokeIndex = helper.indexOf("await this.api.logoutToken(previousToken)");
+ assert.ok(stageIndex > -1 && commitIndex > stageIndex && adoptIndex > commitIndex && revokeIndex > adoptIndex);
+ assert.match(helper, /clearStagedSessionToken\(this\.app\.secretStorage\)/);
+ assert.match(helper, /this\.stagedSessionTokenToRevoke = ""/);
+ assert.match(helper, /await this\.revokeUnadoptedToken\(replacementToken\)/);
+ assert.match(mainSource, /await this\.reconcileStagedSessionToken\(\)/);
+ assert.match(mainSource, /if \(!\(await this\.reconcileStagedSessionToken\(\)\)\) return;/);
assert.match(mainSource, /could not store your sign-in securely\. Update Obsidian/);
});
-test("switch account proves the browser handoff before revoking the current session", () => {
+test("switch account keeps the current session until the replacement login completes", () => {
for (const [start, end] of [
- ["async reconnectAccount", "private async logoutBeforeAccountChange"],
+ ["async reconnectAccount", "async disconnectAccount"],
["async startSignup", "async reconnectAccount"]
] as const) {
const body = methodBody(mainSource, start, end);
- const loginIndex = body.indexOf("await this.auth.startLogin(");
- const revokeIndex = body.indexOf("await this.logoutBeforeAccountChange()");
- assert.ok(loginIndex > -1 && revokeIndex > loginIndex, `${start} must open the login before revoking`);
- assert.match(body, /if \(!opened\) return;/);
+ assert.match(body, /await this\.auth\.startLogin\(/);
+ assert.doesNotMatch(body, /logoutBeforeAccountChange|clearLocalBondieAccount/);
}
+ const adoption = methodBody(mainSource, "this.auth = new AuthService", "this.addSettingTab");
+ assert.match(adoption, /await this\.replaceSessionToken\(previousToken, token\)/);
+ const replacement = methodBody(mainSource, "private async replaceSessionToken", "private async revokeUnadoptedToken");
+ assert.match(replacement, /await this\.api\.logoutToken\(previousToken\)/);
});
test("auth service only starts polling after the browser accepts the handoff", () => {
@@ -60,6 +72,28 @@ test("auth service only starts polling after the browser accepts the handoff", (
assert.match(failureBranch, /await this\.clearPendingLogin\(clientState\)/);
});
+test("browser cancellation and rejection terminate private polling immediately", () => {
+ assert.match(authSource, /"auth_login_cancelled"/);
+ assert.match(authSource, /"auth_login_failed"/);
+ const pollBody = methodBody(authSource, "private async pollPendingLogin", "async resumePendingLogin");
+ assert.match(pollBody, /await this\.clearPendingLoginSafely\(clientState\)/);
+ assert.match(pollBody, /Bondie sign-in was cancelled/);
+});
+
+test("business rejection and expired exchange clear persisted PKCE state", () => {
+ const pollBody = methodBody(authSource, "private async pollPendingLogin", "async resumePendingLogin");
+ const completionBranch = pollBody.slice(
+ pollBody.indexOf("if (error instanceof AuthCompletionError)"),
+ pollBody.indexOf('if (error instanceof ShareApiError && error.code === "auth_code_expired")')
+ );
+ assert.match(completionBranch, /await this\.clearPendingLoginSafely\(clientState\)/);
+ const expiredBranch = pollBody.slice(
+ pollBody.indexOf('if (error instanceof ShareApiError && error.code === "auth_code_expired")'),
+ pollBody.indexOf("TERMINAL_EXCHANGE_CODES.has")
+ );
+ assert.match(expiredBranch, /await this\.clearPendingLoginSafely\(clientState\)/);
+});
+
test("browser handoff reports success or failure instead of fire-and-forget", () => {
assert.match(externalLinksSource, /Promise/);
assert.match(externalLinksSource, /await shell\.openExternal/);
@@ -179,13 +213,15 @@ test("login with a different account recovers or protects a bare media note subm
// An uncertain recovery refuses the account switch and keeps the record.
assert.match(adoptBody, /pendingSubmission\.ownerProductSubjectId !== response\.product_subject_id/);
assert.match(adoptBody, /Could not confirm the state of your previous detailed note\. Check your connection, then sign in again\./);
- // Both mismatch paths revoke the unadopted token through the same helper.
- assert.equal(adoptBody.match(/await this\.rejectMismatchedLoginToken\(token\)/g)?.length, 2);
+ // Share, bare-submission, and tracked-import mismatches all revoke the
+ // unadopted replacement token through the same helper.
+ assert.equal(adoptBody.match(/await this\.rejectMismatchedLoginToken\(token\)/g)?.length, 3);
+ assert.match(adoptBody, /An unfinished share belongs to another Bondie account/);
assert.match(adoptBody, /This detailed note belongs to another Bondie account/);
const helperBody = methodBody(mainSource, "private async rejectMismatchedLoginToken", "private async finishPendingImportBeforeAccountChange");
- assert.match(helperBody, /await this\.api\.logout\(\)/);
- assert.match(helperBody, /this\.docferrySettings\.sessionToken = previousSessionToken/);
- assert.match(helperBody, /this\.docferrySettings\.connectedAccount = previousAccount/);
- assert.match(helperBody, /this\.docferrySettings\.membership = previousMembership/);
+ assert.match(helperBody, /await this\.revokeUnadoptedToken\(token\)/);
+ const revokeBody = methodBody(mainSource, "private async revokeUnadoptedToken", "private clearSessionTokenCustody");
+ assert.match(revokeBody, /await this\.api\.logoutToken\(token\)/);
+ assert.doesNotMatch(revokeBody, /this\.docferrySettings\.sessionToken = token/);
});
diff --git a/plugin/tests/session-token-custody.test.mts b/plugin/tests/session-token-custody.test.mts
index 4d7d31f..5562ba0 100644
--- a/plugin/tests/session-token-custody.test.mts
+++ b/plugin/tests/session-token-custody.test.mts
@@ -6,12 +6,15 @@ import {
PENDING_AUTH_STATE_SECRET_ID,
PENDING_AUTH_VERIFIER_SECRET_ID,
SESSION_TOKEN_SECRET_ID,
+ STAGED_SESSION_TOKEN_SECRET_ID,
+ clearStagedSessionToken,
clearPendingLoginCustody,
migrateLegacyPendingLogin,
persistPendingLogin,
persistSessionToken,
readPendingLogin,
resolveSessionTokenOnLoad,
+ stageSessionToken,
type SessionTokenSecretStore
} from "../src/session-token-custody.ts";
@@ -54,10 +57,45 @@ test("a service-boundary reset clears the stored secret instead of migrating", (
test("no token anywhere resolves to signed-out without writes", () => {
const store = fakeStore();
const resolved = resolveSessionTokenOnLoad(store, "", false);
- assert.deepEqual(resolved, { token: "", scrubLegacy: false });
+ assert.deepEqual(resolved, { token: "", scrubLegacy: false, stagedTokenToRevoke: "" });
assert.equal(store.values.size, 0);
});
+test("a committed replacement keeps the new active token and returns the old token for revocation", () => {
+ const store = fakeStore({
+ [SESSION_TOKEN_SECRET_ID]: "replacement-token",
+ [STAGED_SESSION_TOKEN_SECRET_ID]: "previous-token"
+ });
+ const resolved = resolveSessionTokenOnLoad(store, "", false);
+ assert.deepEqual(resolved, {
+ token: "replacement-token",
+ scrubLegacy: false,
+ stagedTokenToRevoke: "previous-token"
+ });
+ assert.equal(store.getSecret(SESSION_TOKEN_SECRET_ID), "replacement-token");
+ assert.equal(store.getSecret(STAGED_SESSION_TOKEN_SECRET_ID), "previous-token");
+});
+
+test("a crash before replacement commit keeps the previous active token and clears duplicate staging", () => {
+ const store = fakeStore({
+ [SESSION_TOKEN_SECRET_ID]: "previous-token",
+ [STAGED_SESSION_TOKEN_SECRET_ID]: "previous-token"
+ });
+ const resolved = resolveSessionTokenOnLoad(store, "", false);
+ assert.deepEqual(resolved, { token: "previous-token", scrubLegacy: false, stagedTokenToRevoke: "" });
+ assert.equal(store.getSecret(STAGED_SESSION_TOKEN_SECRET_ID), null);
+});
+
+test("staging helpers never overwrite the active token", () => {
+ const store = fakeStore({ [SESSION_TOKEN_SECRET_ID]: "active-token" });
+ stageSessionToken(store, "previous-token");
+ assert.equal(store.getSecret(SESSION_TOKEN_SECRET_ID), "active-token");
+ assert.equal(store.getSecret(STAGED_SESSION_TOKEN_SECRET_ID), "previous-token");
+ clearStagedSessionToken(store);
+ assert.equal(store.getSecret(SESSION_TOKEN_SECRET_ID), "active-token");
+ assert.equal(store.getSecret(STAGED_SESSION_TOKEN_SECRET_ID), null);
+});
+
test("persistSessionToken stores and clears the secret with an empty token", () => {
const store = fakeStore();
persistSessionToken(store, "fresh-token");
@@ -79,8 +117,14 @@ test("store failures propagate so callers fail closed instead of persisting plai
assert.throws(() => persistSessionToken(failing, "token"), /unavailable/);
});
-test("pending login secrets use SecretStorage-safe lowercase dashed ids", () => {
- for (const id of [PENDING_AUTH_STATE_SECRET_ID, PENDING_AUTH_STARTED_AT_SECRET_ID, PENDING_AUTH_VERIFIER_SECRET_ID]) {
+test("session and pending login secrets use SecretStorage-safe lowercase dashed ids", () => {
+ for (const id of [
+ SESSION_TOKEN_SECRET_ID,
+ STAGED_SESSION_TOKEN_SECRET_ID,
+ PENDING_AUTH_STATE_SECRET_ID,
+ PENDING_AUTH_STARTED_AT_SECRET_ID,
+ PENDING_AUTH_VERIFIER_SECRET_ID
+ ]) {
assert.match(id, /^[a-z0-9-]+$/, `${id} must satisfy the SecretStorage id constraint`);
}
});
diff --git a/plugin/tests/share-actions.test.mts b/plugin/tests/share-actions.test.mts
index 0e6c03a..3c7e732 100644
--- a/plugin/tests/share-actions.test.mts
+++ b/plugin/tests/share-actions.test.mts
@@ -1,7 +1,12 @@
import assert from "node:assert/strict";
import test from "node:test";
-import { hasActiveShareLink, shareListSummary } from "../src/share-actions.ts";
+import {
+ hasActiveShareLink,
+ resolveShareUpdateVaultGate,
+ shareListSummary,
+ vaultRelativeShareSourcePath,
+} from "../src/share-actions.ts";
test("keeps actions only for share links that can still be opened", () => {
assert.equal(hasActiveShareLink("published"), true);
@@ -16,3 +21,41 @@ test("summarizes live and past shares without treating history as active", () =>
assert.equal(shareListSummary(["stopped", "expired"]), "2 past shares.");
assert.equal(shareListSummary(["published", "stopped"]), "1 live share, 1 past share.");
});
+
+test("allows claiming a share whose vault id is null, undefined, or empty", () => {
+ assert.equal(resolveShareUpdateVaultGate(null, "vlt_local"), "claim");
+ assert.equal(resolveShareUpdateVaultGate(undefined, "vlt_local"), "claim");
+ assert.equal(resolveShareUpdateVaultGate("", "vlt_local"), "claim");
+});
+
+test("updates a share whose vault id matches the local vault", () => {
+ assert.equal(resolveShareUpdateVaultGate("vlt_local", "vlt_local"), "update");
+});
+
+test("rejects a share whose vault id belongs to a different vault", () => {
+ assert.equal(resolveShareUpdateVaultGate("vlt_other", "vlt_local"), "wrong-vault");
+});
+
+test("strips the vault base path prefix from legacy absolute source paths", () => {
+ assert.equal(
+ vaultRelativeShareSourcePath("/Users/owner/Vault/meetings/notes.md", "/Users/owner/Vault"),
+ "meetings/notes.md"
+ );
+});
+
+test("keeps absolute source paths outside the vault untouched", () => {
+ assert.equal(
+ vaultRelativeShareSourcePath("/Users/owner/OtherVault/meetings/notes.md", "/Users/owner/Vault"),
+ "/Users/owner/OtherVault/meetings/notes.md"
+ );
+ // A sibling directory that merely shares the prefix must not be stripped either.
+ assert.equal(
+ vaultRelativeShareSourcePath("/Users/owner/VaultNotes/notes.md", "/Users/owner/Vault"),
+ "/Users/owner/VaultNotes/notes.md"
+ );
+});
+
+test("keeps vault-relative source paths and the base path itself untouched", () => {
+ assert.equal(vaultRelativeShareSourcePath("meetings/notes.md", "/Users/owner/Vault"), "meetings/notes.md");
+ assert.equal(vaultRelativeShareSourcePath("/Users/owner/Vault", "/Users/owner/Vault"), "/Users/owner/Vault");
+});
diff --git a/plugin/tests/share-lifecycle.test.mts b/plugin/tests/share-lifecycle.test.mts
index 336a353..0833e43 100644
--- a/plugin/tests/share-lifecycle.test.mts
+++ b/plugin/tests/share-lifecycle.test.mts
@@ -1,7 +1,12 @@
import assert from "node:assert/strict";
import test from "node:test";
-import { isMissingShareError, isStoppedShareError } from "../src/share-lifecycle.ts";
+import {
+ isExpiredShareError,
+ isInactiveShareError,
+ isMissingShareError,
+ isStoppedShareError
+} from "../src/share-lifecycle.ts";
test("classifies 404 share_not_found as a missing share", () => {
assert.equal(isMissingShareError({ status: 404, code: "share_not_found" }), true);
@@ -17,3 +22,11 @@ test("classifies 410 share_stopped as a stopped share", () => {
assert.equal(isStoppedShareError({ status: 404, code: "share_not_found" }), false);
assert.equal(isStoppedShareError(undefined), false);
});
+
+test("classifies both stopped and expired shares as inactive", () => {
+ assert.equal(isExpiredShareError({ status: 410, code: "share_expired" }), true);
+ assert.equal(isExpiredShareError({ status: 410, code: "share_stopped" }), false);
+ assert.equal(isInactiveShareError({ status: 410, code: "share_expired" }), true);
+ assert.equal(isInactiveShareError({ status: 410, code: "share_stopped" }), true);
+ assert.equal(isInactiveShareError({ status: 404, code: "share_not_found" }), false);
+});
diff --git a/plugin/tests/share-metadata-lifecycle.test.mts b/plugin/tests/share-metadata-lifecycle.test.mts
index b9e6209..50e92ad 100644
--- a/plugin/tests/share-metadata-lifecycle.test.mts
+++ b/plugin/tests/share-metadata-lifecycle.test.mts
@@ -66,7 +66,7 @@ test("copy verifies lifecycle state and never copies a known-dead link", () => {
const verifyBody = methodBody("private async verifyShareLinkState", "private async updateOrCreateShare");
assert.match(verifyBody, /await this\.api\.getShareStatus\(shareId\)/);
assert.match(verifyBody, /hasActiveShareLink\(status\.status\) \? "live" : "inactive"/);
- assert.match(verifyBody, /if \(isStoppedShareError\(error\)\) return "inactive"/);
+ assert.match(verifyBody, /if \(isInactiveShareError\(error\)\) return "inactive"/);
assert.match(verifyBody, /if \(isMissingShareError\(error\)\) return "missing"/);
});
@@ -90,11 +90,38 @@ test("publish confirms before republishing over an unreachable share and preserv
assert.match(body, /ownShareId && ownShareId !== selectedShare\.share_id/);
});
-test("update falls back to a fresh link on both 404 share_not_found and 410 share_stopped", () => {
+test("update falls back to a fresh link on missing, stopped, and expired shares", () => {
const body = methodBody("private async updateOrCreateShare", "private async stopSharing");
- assert.match(body, /!isMissingShareError\(error\) && !isStoppedShareError\(error\)/);
+ assert.match(body, /!isMissingShareError\(error\) && !isInactiveShareError\(error\)/);
assert.match(body, /no longer available\. Publishing a new link/);
- assert.match(body, /return this\.api\.createShare\(/);
+ // The fallback create must ride the idempotent submission channel, not a
+ // bare createShare call: a lost response plus a retry would otherwise mint
+ // a second public link for the same note.
+ assert.match(body, /const created = await submitShareCreate\(submissionDeps, \{/);
+ assert.match(body, /return \{ \.\.\.created, legacyMeta \}/);
+ assert.match(body, /payloadHash: await sha256\(stableSharePayloadString\(createPayload\)\)/);
+ assert.match(body, /payload\.password_mode === "keep" && !payload\.password/);
+ assert.match(body, /expires_at: freshExpiresAt/);
+ const publishBody = methodBody("private async publishFileCore", "private async publishFolder");
+ assert.match(publishBody, /resolveFreshExpiryAfterUpdateFallback\(/);
+ assert.match(publishBody, /options\.expirySelection/);
+ assert.match(body, /old password cannot be copied to a new link/);
+ assert.match(body, /await confirmUnreachableShareRepublish\(/);
+ assert.match(body, /legacyMeta = \{ id: shareId, url: lastKnownUrl \}/);
+ assert.ok(!body.includes("this.api.createShare("), "the fallback must not call createShare directly");
+});
+
+test("share create idempotency is finalized only after frontmatter persistence", () => {
+ const body = methodBody("private async publishFileCore", "private async publishFolder");
+ const writeIndex = body.indexOf("await writeShareMeta(");
+ const finalizeIndex = body.lastIndexOf("await finalizeShareCreate(");
+ assert.ok(writeIndex > -1 && finalizeIndex > writeIndex, "frontmatter must commit before the operation key is cleared");
+ assert.match(body, /passwordAlreadySet: Boolean\(existingShareId && previousPasswordEnabled\)/);
+ assert.match(body, /passwordEnabled: response\.password_enabled/);
+ assert.match(body, /expiresAt: response\.expires_at/);
+ assert.match(mainSource, /private async reconcileCommittedSharePublish\(\)/);
+ assert.match(mainSource, /this\.findSharedFileByShareId\(shareId\)/);
+ assert.match(mainSource, /await finalizeShareCreate\(this\.sharePublishSubmissionDeps\(\)\.store, pending\.key\)/);
});
test("legacy migration gating in publishFile is preserved", () => {
@@ -106,18 +133,18 @@ test("legacy migration gating in publishFile is preserved", () => {
assert.ok(preserveIndex > -1 && writeIndex > preserveIndex);
});
-test("concurrent publishes of the same path are serialized by an in-flight guard", () => {
+test("all note publishes are serialized around the single durable journal", () => {
assert.match(mainSource, /private publishInFlight = new Set\(\)/);
- for (const [wrapper, core] of [
- ["private async publishFile(file: TFile", "private async publishFileCore"],
- ["private async publishFolder(folder: TFolder", "private async publishFolderCore"]
- ] as const) {
- const body = methodBody(wrapper, core);
- assert.match(body, /this\.publishInFlight\.has\(/, `${wrapper} must bail out while a publish is in flight`);
- assert.match(body, /already being published/);
- const addIndex = body.indexOf("this.publishInFlight.add(");
- const finallyIndex = body.indexOf("} finally {");
- const deleteIndex = body.indexOf("this.publishInFlight.delete(");
- assert.ok(addIndex > -1 && finallyIndex > addIndex && deleteIndex > finallyIndex, `${wrapper} must release the guard in finally`);
- }
+ assert.match(mainSource, /private notePublishInFlight = false/);
+ const noteBody = methodBody("private async publishFile(file: TFile", "private async publishFileCore");
+ assert.match(noteBody, /if \(this\.notePublishInFlight\)/);
+ assert.match(noteBody, /Another note is already being published/);
+ const acquireIndex = noteBody.indexOf("this.notePublishInFlight = true");
+ const finallyIndex = noteBody.indexOf("} finally {");
+ const releaseIndex = noteBody.indexOf("this.notePublishInFlight = false");
+ assert.ok(acquireIndex > -1 && finallyIndex > acquireIndex && releaseIndex > finallyIndex);
+
+ const folderBody = methodBody("private async publishFolder(folder: TFolder", "private async publishFolderCore");
+ assert.match(folderBody, /this\.publishInFlight\.has\(/);
+ assert.match(folderBody, /already being published/);
});
diff --git a/plugin/tests/share-publish-submission.test.mts b/plugin/tests/share-publish-submission.test.mts
new file mode 100644
index 0000000..94cd6d7
--- /dev/null
+++ b/plugin/tests/share-publish-submission.test.mts
@@ -0,0 +1,376 @@
+import assert from "node:assert/strict";
+import test from "node:test";
+
+import {
+ SHARE_PUBLISH_LOST_CONNECTION_MESSAGE,
+ SHARE_PUBLISH_PENDING_ACCOUNT_MESSAGE,
+ finalizeShareCreate,
+ isDefinitiveSharePublishRejection,
+ stableSharePayloadString,
+ submitShareCreate,
+ type PendingSharePublish,
+ type SharePublishSubmissionDeps
+} from "../src/share-publish-submission.ts";
+import type { SharePayload, ShareResponse } from "../src/types.ts";
+
+
+const OWNER = "psub_owner_one";
+const OTHER_OWNER = "psub_owner_two";
+const FILE_PATH = "Notes/hello.md";
+
+
+function payload(title = "Hello"): SharePayload {
+ return {
+ vault_id: "vlt_test",
+ source_path: FILE_PATH,
+ source_path_normalized: "notes/hello.md",
+ doc_identity: null,
+ source_hash: "sha256:test",
+ title,
+ markdown: "# Hello",
+ html_snapshot: null,
+ theme_mode: "reader",
+ css_asset_id: null,
+ assets: [],
+ outbound_links: [],
+ expires_at: null,
+ client: {
+ plugin_id: "docferry",
+ plugin_version: "0.0.67",
+ obsidian_version: "1.5.0"
+ }
+ };
+}
+
+function share(shareId: string): ShareResponse {
+ return {
+ share_id: shareId,
+ slug: `slug-${shareId}`,
+ url: `https://docferry.example/s/slug-${shareId}`,
+ title: "Hello",
+ status: "active",
+ theme_mode: "reader",
+ password_enabled: false,
+ expires_at: null,
+ created_at: "2026-08-18T00:00:00Z",
+ updated_at: "2026-08-18T00:00:00Z"
+ };
+}
+
+interface FakeCreateCall {
+ payload: SharePayload;
+ key: string;
+}
+
+interface FakeResolveCall {
+ key: string;
+}
+
+function makeDeps(options: {
+ initial?: PendingSharePublish | null;
+ failCreate?: (call: FakeCreateCall, attempt: number) => unknown;
+ resolveShare?: (call: FakeResolveCall, attempt: number) => ShareResponse | unknown;
+}): {
+ deps: SharePublishSubmissionDeps;
+ state: { record: PendingSharePublish | null };
+ creates: FakeCreateCall[];
+ resolves: FakeResolveCall[];
+ saves: Array;
+ generatedKeys: string[];
+} {
+ const state = { record: options.initial ?? null };
+ const creates: FakeCreateCall[] = [];
+ const resolves: FakeResolveCall[] = [];
+ const saves: Array = [];
+ const generatedKeys: string[] = [];
+ const deps: SharePublishSubmissionDeps = {
+ store: {
+ read: () => state.record,
+ save: async (record) => {
+ saves.push(record);
+ state.record = record;
+ }
+ },
+ createShare: async (createPayload, key) => {
+ const call = { payload: createPayload, key };
+ creates.push(call);
+ const failure = options.failCreate?.(call, creates.length);
+ if (failure) throw failure;
+ return share(`sh_attempt_${creates.length}`);
+ },
+ resolveShare: async (key) => {
+ const call = { key };
+ resolves.push(call);
+ const result = options.resolveShare?.(call, resolves.length);
+ if (
+ result instanceof Error ||
+ (result && typeof result === "object" && typeof (result as { status?: unknown }).status === "number")
+ ) throw result;
+ if (result) return result as ShareResponse;
+ throw apiError(404, "share_idempotency_not_found");
+ },
+ generateKey: () => {
+ const key = `plugin-test-key-${generatedKeys.length + 1}`;
+ generatedKeys.push(key);
+ return key;
+ },
+ now: () => "2026-08-18T00:00:00.000Z"
+ };
+ return { deps, state, creates, resolves, saves, generatedKeys };
+}
+
+function apiError(status: number, code: string): Error & { status: number; code: string } {
+ return Object.assign(new Error(`status ${status}`), { status, code });
+}
+
+function input(overrides: { filePath?: string; payloadHash?: string; owner?: string } = {}) {
+ return {
+ filePath: overrides.filePath ?? FILE_PATH,
+ payload: payload(),
+ payloadHash: overrides.payloadHash ?? "payload-hash-1",
+ sourceHash: "sha256:test",
+ ownerProductSubjectId: overrides.owner ?? OWNER
+ };
+}
+
+
+test("classifies only 4xx responses as definitive publish rejections", () => {
+ assert.equal(isDefinitiveSharePublishRejection(apiError(400, "share_idempotency_key_invalid")), true);
+ assert.equal(isDefinitiveSharePublishRejection(apiError(409, "share_idempotency_conflict")), true);
+ assert.equal(isDefinitiveSharePublishRejection(apiError(403, "share_limit_reached")), true);
+ assert.equal(isDefinitiveSharePublishRejection(apiError(500, "internal_error")), false);
+ assert.equal(isDefinitiveSharePublishRejection(apiError(0, "offline")), false);
+ assert.equal(isDefinitiveSharePublishRejection(new Error("network down")), false);
+ assert.equal(isDefinitiveSharePublishRejection(null), false);
+});
+
+test("stable payload serialization is insensitive to key order", () => {
+ const left = payload();
+ const right = { ...payload(), client: { obsidian_version: "1.5.0", plugin_version: "0.0.67", plugin_id: "docferry" } };
+
+ assert.equal(stableSharePayloadString(left), stableSharePayloadString(right));
+ assert.notEqual(stableSharePayloadString(payload("Hello")), stableSharePayloadString(payload("Changed")));
+});
+
+test("persists the idempotency key and response until frontmatter commits", async () => {
+ const { deps, state, creates, saves, generatedKeys } = makeDeps({});
+
+ const created = await submitShareCreate(deps, input());
+
+ assert.equal(created.response.share_id, "sh_attempt_1");
+ assert.equal(created.operationKey, "plugin-test-key-1");
+ assert.deepEqual(generatedKeys, ["plugin-test-key-1"]);
+ // The record with the key is saved before the create request is made.
+ assert.deepEqual(saves[0], {
+ key: "plugin-test-key-1",
+ filePath: FILE_PATH,
+ payloadHash: "payload-hash-1",
+ sourceHash: "sha256:test",
+ ownerProductSubjectId: OWNER,
+ createdAt: "2026-08-18T00:00:00.000Z"
+ });
+ assert.deepEqual(creates.map((call) => call.key), ["plugin-test-key-1"]);
+ assert.equal(saves[1]?.response?.share_id, "sh_attempt_1");
+ assert.equal(state.record?.key, "plugin-test-key-1");
+
+ await finalizeShareCreate(deps.store, created.operationKey);
+ assert.equal(state.record, null);
+});
+
+test("a retry after a lost response resolves the committed operation without another create", async () => {
+ let failFirst = true;
+ const committed = share("sh_committed_before_disconnect");
+ const { deps, state, creates, resolves, generatedKeys } = makeDeps({
+ failCreate: () => {
+ if (failFirst) {
+ failFirst = false;
+ return new Error("network down");
+ }
+ return undefined;
+ },
+ resolveShare: () => committed
+ });
+
+ await assert.rejects(
+ () => submitShareCreate(deps, input()),
+ (error: unknown) => {
+ assert.equal((error as Error).message, SHARE_PUBLISH_LOST_CONNECTION_MESSAGE);
+ return true;
+ }
+ );
+ assert.equal(state.record?.key, "plugin-test-key-1");
+
+ const recovered = await submitShareCreate(deps, input());
+
+ assert.equal(recovered.response.share_id, "sh_committed_before_disconnect");
+ assert.deepEqual(generatedKeys, ["plugin-test-key-1"]);
+ assert.deepEqual(creates.map((call) => call.key), ["plugin-test-key-1"]);
+ assert.deepEqual(resolves.map((call) => call.key), ["plugin-test-key-1"]);
+ assert.equal(state.record?.response?.share_id, "sh_committed_before_disconnect");
+ await finalizeShareCreate(deps.store, recovered.operationKey);
+ assert.equal(state.record, null);
+});
+
+test("a definitive 4xx clears the record and rethrows the server error unchanged", async () => {
+ const rejection = apiError(403, "share_limit_reached");
+ const { deps, state, generatedKeys } = makeDeps({ failCreate: () => rejection });
+
+ await assert.rejects(
+ () => submitShareCreate(deps, input()),
+ (error: unknown) => {
+ assert.equal(error, rejection);
+ return true;
+ }
+ );
+ assert.equal(state.record, null);
+ assert.deepEqual(generatedKeys, ["plugin-test-key-1"]);
+});
+
+test("a changed payload resolves the original operation and reports that an update is required", async () => {
+ const pending: PendingSharePublish = {
+ key: "plugin-stored-key",
+ filePath: FILE_PATH,
+ payloadHash: "payload-hash-old",
+ ownerProductSubjectId: OWNER,
+ createdAt: "2026-08-18T00:00:00.000Z"
+ };
+ const recoveredResponse = share("sh_original_operation");
+ const { deps, state, creates, resolves, generatedKeys } = makeDeps({
+ initial: pending,
+ resolveShare: () => recoveredResponse
+ });
+
+ const recovered = await submitShareCreate(deps, input({ payloadHash: "payload-hash-new" }));
+
+ assert.equal(recovered.response.share_id, "sh_original_operation");
+ assert.equal(recovered.payloadChanged, true);
+ assert.equal(recovered.filePathChanged, false);
+ assert.deepEqual(creates, []);
+ assert.deepEqual(resolves.map((call) => call.key), ["plugin-stored-key"]);
+ assert.deepEqual(generatedKeys, []);
+ assert.equal(state.record?.key, "plugin-stored-key");
+});
+
+test("a pending operation for another note is resolved and marked for explicit reassignment", async () => {
+ const pending: PendingSharePublish = {
+ key: "plugin-other-note-key",
+ filePath: "Notes/other.md",
+ payloadHash: "payload-hash-old",
+ ownerProductSubjectId: OWNER,
+ createdAt: "2026-08-18T00:00:00.000Z"
+ };
+ const recoveredResponse = share("sh_other_note_operation");
+ const { deps, creates, resolves, generatedKeys, state } = makeDeps({
+ initial: pending,
+ resolveShare: () => recoveredResponse
+ });
+
+ const recovered = await submitShareCreate(deps, input());
+
+ assert.deepEqual(creates, []);
+ assert.deepEqual(resolves.map((call) => call.key), ["plugin-other-note-key"]);
+ assert.deepEqual(generatedKeys, []);
+ assert.equal(state.record?.key, "plugin-other-note-key");
+ assert.equal(recovered.filePathChanged, true);
+ assert.equal(recovered.originalFilePath, "Notes/other.md");
+ assert.equal(recovered.payloadChanged, true);
+});
+
+test("a publish record from another account is never discarded or replaced", async () => {
+ const pending: PendingSharePublish = {
+ key: "plugin-other-account-key",
+ filePath: FILE_PATH,
+ payloadHash: "payload-hash-1",
+ ownerProductSubjectId: OTHER_OWNER,
+ createdAt: "2026-08-18T00:00:00.000Z"
+ };
+ const { deps, state, creates, generatedKeys, resolves } = makeDeps({ initial: pending });
+
+ await assert.rejects(
+ () => submitShareCreate(deps, input()),
+ (error: unknown) => {
+ assert.equal((error as Error).message, SHARE_PUBLISH_PENDING_ACCOUNT_MESSAGE);
+ return true;
+ }
+ );
+
+ assert.deepEqual(creates, []);
+ assert.deepEqual(resolves, []);
+ assert.deepEqual(generatedKeys, []);
+ assert.equal(state.record?.key, "plugin-other-account-key");
+});
+
+test("a stored response is revalidated with the server before it is reused", async () => {
+ const recoveredResponse = share("sh_recovered");
+ const pending: PendingSharePublish = {
+ key: "plugin-stored-key",
+ filePath: FILE_PATH,
+ payloadHash: "payload-hash-1",
+ ownerProductSubjectId: OWNER,
+ createdAt: "2026-08-18T00:00:00.000Z",
+ response: recoveredResponse
+ };
+ const currentResponse = share("sh_recovered_current");
+ const { deps, creates, resolves } = makeDeps({
+ initial: pending,
+ resolveShare: () => currentResponse
+ });
+
+ const recovered = await submitShareCreate(deps, input());
+
+ assert.equal(recovered.response.share_id, "sh_recovered_current");
+ assert.equal(recovered.operationKey, "plugin-stored-key");
+ assert.deepEqual(creates, []);
+ assert.deepEqual(resolves.map((call) => call.key), ["plugin-stored-key"]);
+});
+
+test("an inactive resolved operation is cleared before a fresh share is created", async () => {
+ const pending: PendingSharePublish = {
+ key: "plugin-stopped-key",
+ filePath: FILE_PATH,
+ payloadHash: "payload-hash-old",
+ ownerProductSubjectId: OWNER,
+ createdAt: "2026-08-18T00:00:00.000Z"
+ };
+ const { deps, creates, generatedKeys, state } = makeDeps({
+ initial: pending,
+ resolveShare: () => apiError(409, "share_idempotency_inactive")
+ });
+
+ const created = await submitShareCreate(deps, input());
+
+ assert.equal(created.response.share_id, "sh_attempt_1");
+ assert.deepEqual(generatedKeys, ["plugin-test-key-1"]);
+ assert.deepEqual(creates.map((call) => call.key), ["plugin-test-key-1"]);
+ assert.equal(state.record?.key, "plugin-test-key-1");
+});
+
+test("an inactive idempotent replay clears the stale key and creates a fresh share", async () => {
+ const inactive = apiError(409, "share_idempotency_inactive");
+ const { deps, creates, generatedKeys, state } = makeDeps({
+ failCreate: (_call, attempt) => attempt === 1 ? inactive : undefined
+ });
+
+ const created = await submitShareCreate(deps, input());
+
+ assert.equal(created.response.share_id, "sh_attempt_2");
+ assert.deepEqual(generatedKeys, ["plugin-test-key-1", "plugin-test-key-2"]);
+ assert.deepEqual(creates.map((call) => call.key), ["plugin-test-key-1", "plugin-test-key-2"]);
+ assert.equal(state.record?.key, "plugin-test-key-2");
+});
+
+test("an inactive idempotent replay is retried only once", async () => {
+ const inactive = apiError(409, "share_idempotency_inactive");
+ const { deps, creates, generatedKeys, state } = makeDeps({
+ failCreate: () => inactive
+ });
+
+ await assert.rejects(
+ () => submitShareCreate(deps, input()),
+ (error: unknown) => error === inactive
+ );
+
+ assert.deepEqual(generatedKeys, ["plugin-test-key-1", "plugin-test-key-2"]);
+ assert.deepEqual(creates.map((call) => call.key), ["plugin-test-key-1", "plugin-test-key-2"]);
+ assert.equal(state.record, null);
+});
diff --git a/plugin/tests/share-update-claim.test.mts b/plugin/tests/share-update-claim.test.mts
new file mode 100644
index 0000000..1ccb88b
--- /dev/null
+++ b/plugin/tests/share-update-claim.test.mts
@@ -0,0 +1,38 @@
+import assert from "node:assert/strict";
+import { readFile } from "node:fs/promises";
+import test from "node:test";
+
+
+test("lets vault-less CLI shares be claimed for update while still rejecting other vaults", async () => {
+ const mainSource = await readFile(new URL("../src/main.ts", import.meta.url), "utf8");
+
+ // The tri-state gate treats a missing vault id as claimable and only a
+ // recorded mismatching id as a rejection.
+ assert.match(mainSource, /resolveShareUpdateVaultGate\(share\.vault_id, vaultId\) === "wrong-vault"/);
+ assert.match(mainSource, /resolveShareUpdateVaultGate\(folderShare\.vault_id, vaultId\) === "wrong-vault"/);
+ assert.doesNotMatch(mainSource, /!share\.vault_id \|\| share\.vault_id !==/);
+ assert.doesNotMatch(mainSource, /folderShare\.vault_id !== vaultId/);
+ // The wrong-vault rejection notices must survive unchanged for both variants.
+ assert.match(mainSource, /Open the source vault to update that share\./);
+ assert.match(mainSource, /Open the source vault to update that folder share\./);
+});
+
+test("claims legacy absolute source paths by stripping the vault base path prefix", async () => {
+ const mainSource = await readFile(new URL("../src/main.ts", import.meta.url), "utf8");
+
+ // Legacy CLI shares remember an absolute path inside the source vault; the
+ // remembered path is tried as-is first, then with the prefix stripped.
+ assert.match(mainSource, /vaultRelativeShareSourcePath\(share\.source_path, basePath\)/);
+});
+
+test("backfills the claiming vault id on every update payload", async () => {
+ const mainSource = await readFile(new URL("../src/main.ts", import.meta.url), "utf8");
+
+ assert.match(mainSource, /vault_id: await this\.resolveVaultId\(\)/);
+});
+
+test("still refuses to update a remembered path that belongs to a different share", async () => {
+ const mainSource = await readFile(new URL("../src/main.ts", import.meta.url), "utf8");
+
+ assert.match(mainSource, /The note at the remembered path is linked to a different share\./);
+});
diff --git a/plugin/versions.json b/plugin/versions.json
index 78039ca..91f8a23 100644
--- a/plugin/versions.json
+++ b/plugin/versions.json
@@ -65,5 +65,6 @@
"0.0.64": "1.12.7",
"0.0.65": "1.12.7",
"0.0.66": "1.12.7",
- "0.0.67": "1.12.7"
+ "0.0.67": "1.12.7",
+ "0.0.68": "1.12.7"
}
diff --git a/release-notes/0.0.68.md b/release-notes/0.0.68.md
new file mode 100644
index 0000000..850478a
--- /dev/null
+++ b/release-notes/0.0.68.md
@@ -0,0 +1,48 @@
+# DocFerry 0.0.68
+
+This corrective release ships the plugin security and reliability fixes that
+were closed on the paid mainline after the `0.0.67` public package was built.
+Users on `0.0.67` receive this update through the Obsidian Community
+directory.
+
+## Security
+
+- Filters hidden and traversal-encoded asset references before publishing, so
+ a malicious note cannot upload `.obsidian` configuration or files outside
+ the vault through crafted image paths, and lists what was skipped.
+- Cancels any pending login poll when an account switch's logout fails, so a
+ later poll can no longer silently complete the sign-in behind the user's
+ back.
+- Serves the browser confirmation pages that host sign-in and sign-out forms
+ with a same-origin referrer policy, so the enforced origin binding accepts
+ real browsers instead of rejecting every legitimate confirmation.
+- Requires explicit per-device account selection before approval during
+ browser-based login.
+
+## Share Reliability
+
+- Makes share creation idempotent: a lost connection followed by a retry now
+ resumes the same publish instead of creating a duplicate public link, and
+ the same guarantee covers the fallback re-publish used when an existing
+ share disappeared concurrently.
+- Preserves legacy share references behind an explicit migration decision and
+ keeps the stop-sharing confirmation from being bypassed.
+- Rechecks fresh membership before paid mutations and extracts the exact
+ publish/update state machine for stopped, moved, and dead-link shares.
+
+## Account And Quota Experience
+
+- Keeps session tokens and pending login verifiers in Obsidian SecretStorage
+ with lifecycle-safe timers.
+- Hides the Folder Share entry on Free plans and warns before an Advanced
+ Import consumes one of the remaining monthly allowances.
+- Preserves completed Advanced Imports for later review and resolves the
+ cancel-versus-review race on finished import jobs.
+
+## Verification
+
+Full gates on the reviewed paid mainline candidate: plugin 175/175, server
+629 passed / 1 skipped, media worker 11/11, Agent Kit 99/99, web E2E 32/32,
+production read-only contract green, plus a real-browser confirmation-flow
+acceptance. Release assets are reproducible from the public repository with
+matching SHA-256 checksums.
diff --git a/versions.json b/versions.json
index 78039ca..91f8a23 100644
--- a/versions.json
+++ b/versions.json
@@ -65,5 +65,6 @@
"0.0.64": "1.12.7",
"0.0.65": "1.12.7",
"0.0.66": "1.12.7",
- "0.0.67": "1.12.7"
+ "0.0.67": "1.12.7",
+ "0.0.68": "1.12.7"
}