@leeguoo/pwtk-network-debugger 1.2.49-beta.1 → 1.2.49-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs.js +3 -3
- package/dist/index.esm.js +17 -17
- package/dist/index.js +1 -1
- package/package.json +1 -1
package/dist/index.esm.js
CHANGED
|
@@ -7687,12 +7687,12 @@ const styles = `
|
|
|
7687
7687
|
}
|
|
7688
7688
|
|
|
7689
7689
|
.debugger-btn.active {
|
|
7690
|
-
background: linear-gradient(135deg, #
|
|
7690
|
+
background: linear-gradient(135deg, #007AFF, #5856D6);
|
|
7691
7691
|
color: #ffffff;
|
|
7692
7692
|
box-shadow:
|
|
7693
|
-
0
|
|
7693
|
+
0 4px 16px rgba(0, 122, 255, 0.25),
|
|
7694
7694
|
inset 0 1px 0 rgba(255, 255, 255, 0.3);
|
|
7695
|
-
backdrop-filter: blur(
|
|
7695
|
+
backdrop-filter: blur(12px);
|
|
7696
7696
|
}
|
|
7697
7697
|
|
|
7698
7698
|
.debugger-icon {
|
|
@@ -7848,12 +7848,12 @@ const styles = `
|
|
|
7848
7848
|
-webkit-backdrop-filter: blur(18px) brightness(1.2);
|
|
7849
7849
|
background: linear-gradient(
|
|
7850
7850
|
135deg,
|
|
7851
|
-
rgba(
|
|
7852
|
-
rgba(
|
|
7851
|
+
rgba(0, 122, 255, 0.08),
|
|
7852
|
+
rgba(255, 255, 255, 0.05)
|
|
7853
7853
|
);
|
|
7854
|
-
border-color: rgba(
|
|
7854
|
+
border-color: rgba(0, 122, 255, 0.2);
|
|
7855
7855
|
box-shadow:
|
|
7856
|
-
0
|
|
7856
|
+
0 8px 32px rgba(0, 0, 0, 0.15),
|
|
7857
7857
|
inset 0 2px 4px rgba(255, 255, 255, 0.15);
|
|
7858
7858
|
}
|
|
7859
7859
|
|
|
@@ -7938,27 +7938,27 @@ const styles = `
|
|
|
7938
7938
|
.status-2xx {
|
|
7939
7939
|
background: linear-gradient(135deg, #4CAF50, #45a049);
|
|
7940
7940
|
color: #ffffff;
|
|
7941
|
-
box-shadow: 0
|
|
7941
|
+
box-shadow: 0 3px 12px rgba(0, 0, 0, 0.2);
|
|
7942
7942
|
}
|
|
7943
7943
|
.status-3xx {
|
|
7944
7944
|
background: linear-gradient(135deg, #FF9800, #F57C00);
|
|
7945
7945
|
color: #ffffff;
|
|
7946
|
-
box-shadow: 0
|
|
7946
|
+
box-shadow: 0 3px 12px rgba(0, 0, 0, 0.2);
|
|
7947
7947
|
}
|
|
7948
7948
|
.status-4xx {
|
|
7949
7949
|
background: linear-gradient(135deg, #F44336, #D32F2F);
|
|
7950
7950
|
color: #ffffff;
|
|
7951
|
-
box-shadow: 0
|
|
7951
|
+
box-shadow: 0 3px 12px rgba(0, 0, 0, 0.2);
|
|
7952
7952
|
}
|
|
7953
7953
|
.status-5xx {
|
|
7954
7954
|
background: linear-gradient(135deg, #9C27B0, #7B1FA2);
|
|
7955
7955
|
color: #ffffff;
|
|
7956
|
-
box-shadow: 0
|
|
7956
|
+
box-shadow: 0 3px 12px rgba(0, 0, 0, 0.2);
|
|
7957
7957
|
}
|
|
7958
7958
|
.status-error {
|
|
7959
7959
|
background: linear-gradient(135deg, #F44336, #D32F2F);
|
|
7960
7960
|
color: #ffffff;
|
|
7961
|
-
box-shadow: 0
|
|
7961
|
+
box-shadow: 0 3px 12px rgba(0, 0, 0, 0.2);
|
|
7962
7962
|
}
|
|
7963
7963
|
|
|
7964
7964
|
.request-info {
|
|
@@ -8311,10 +8311,10 @@ const styles = `
|
|
|
8311
8311
|
|
|
8312
8312
|
@keyframes liquid-glow {
|
|
8313
8313
|
0%, 100% {
|
|
8314
|
-
box-shadow: 0
|
|
8314
|
+
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
|
|
8315
8315
|
}
|
|
8316
8316
|
50% {
|
|
8317
|
-
box-shadow: 0
|
|
8317
|
+
box-shadow: 0 6px 30px rgba(0, 0, 0, 0.2);
|
|
8318
8318
|
}
|
|
8319
8319
|
}
|
|
8320
8320
|
|
|
@@ -9471,7 +9471,7 @@ class NetworkDebugger {
|
|
|
9471
9471
|
this.initialized = true;
|
|
9472
9472
|
logger.consoleDirect(`
|
|
9473
9473
|
╔════════════════════════════════════════╗
|
|
9474
|
-
║ 🔓 PWTK 解密小工具 v${"1.2.49-beta.
|
|
9474
|
+
║ 🔓 PWTK 解密小工具 v${"1.2.49-beta.2"} ║
|
|
9475
9475
|
║ Created by Leo (@leeguoo) ║
|
|
9476
9476
|
║ 技术支持: 请联系 Leo ║
|
|
9477
9477
|
║ 分享服务: curl.bwg.leeguoo.com ║
|
|
@@ -9532,7 +9532,7 @@ class NetworkDebugger {
|
|
|
9532
9532
|
}
|
|
9533
9533
|
async checkForUpdates() {
|
|
9534
9534
|
try {
|
|
9535
|
-
const currentVersion = "1.2.49-beta.
|
|
9535
|
+
const currentVersion = "1.2.49-beta.2";
|
|
9536
9536
|
logger.info(`[PWTK Update] Checking for updates... Current version: ${currentVersion}`);
|
|
9537
9537
|
const response = await fetch("https://registry.npmjs.org/@leeguoo/pwtk-network-debugger/latest");
|
|
9538
9538
|
const data = await response.json();
|
|
@@ -9552,7 +9552,7 @@ class NetworkDebugger {
|
|
|
9552
9552
|
logger.error("[PWTK Update] Failed to check for updates:", error);
|
|
9553
9553
|
return {
|
|
9554
9554
|
hasUpdate: false,
|
|
9555
|
-
currentVersion: "1.2.49-beta.
|
|
9555
|
+
currentVersion: "1.2.49-beta.2"
|
|
9556
9556
|
};
|
|
9557
9557
|
}
|
|
9558
9558
|
}
|
package/dist/index.js
CHANGED
|
@@ -15,4 +15,4 @@ e.mode.CTRGladman=function(){var t=e.lib.BlockCipherMode.extend();function n(e){
|
|
|
15
15
|
|
|
16
16
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
17
17
|
*/
|
|
18
|
-
!function(){var t=e,n=t.lib,r=n.WordArray,i=n.Hasher,o=t.algo,s=r.create([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,7,4,13,1,10,6,15,3,12,0,9,5,2,14,11,8,3,10,14,4,9,15,8,1,2,7,0,6,13,11,5,12,1,9,11,10,0,8,12,4,13,3,7,15,14,5,6,2,4,0,5,9,7,12,2,10,14,1,3,8,11,6,15,13]),a=r.create([5,14,7,0,9,2,11,4,13,6,15,8,1,10,3,12,6,11,3,7,0,13,5,10,14,15,8,12,4,9,1,2,15,5,1,3,7,14,6,9,11,8,12,2,10,0,4,13,8,6,4,1,3,11,15,0,5,12,2,13,9,7,10,14,12,15,10,4,1,5,8,7,6,2,13,14,0,3,9,11]),c=r.create([11,14,15,12,5,8,7,9,11,13,14,15,6,7,9,8,7,6,8,13,11,9,7,15,7,12,15,9,11,7,13,12,11,13,6,7,14,9,13,15,14,8,13,6,5,12,7,5,11,12,14,15,14,15,9,8,9,14,5,6,8,6,5,12,9,15,5,11,6,8,13,12,5,12,13,14,11,8,5,6]),l=r.create([8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6,9,13,15,7,12,8,9,11,7,7,12,7,6,15,13,11,9,7,15,11,8,6,6,14,12,13,5,14,13,13,7,5,15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8,8,5,12,9,12,5,14,6,8,13,6,5,15,13,11,11]),d=r.create([0,1518500249,1859775393,2400959708,2840853838]),p=r.create([1352829926,1548603684,1836072691,2053994217,0]),u=o.RIPEMD160=i.extend({_doReset:function(){this._hash=r.create([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(e,t){for(var n=0;n<16;n++){var r=t+n,i=e[r];e[r]=16711935&(i<<8|i>>>24)|4278255360&(i<<24|i>>>8)}var o,u,w,v,m,k,_,S,B,D,z,C=this._hash.words,A=d.words,R=p.words,P=s.words,E=a.words,W=c.words,T=l.words;k=o=C[0];_=u=C[1];S=w=C[2];B=v=C[3];D=m=C[4];for(n=0;n<80;n+=1){z=o+e[t+P[n]]|0;if(n<16)z+=h(u,w,v)+A[0];else if(n<32)z+=f(u,w,v)+A[1];else if(n<48)z+=g(u,w,v)+A[2];else if(n<64)z+=b(u,w,v)+A[3];else z+=y(u,w,v)+A[4];z=(z=x(z|=0,W[n]))+m|0;o=m;m=v;v=x(w,10);w=u;u=z;z=k+e[t+E[n]]|0;if(n<16)z+=y(_,S,B)+R[0];else if(n<32)z+=b(_,S,B)+R[1];else if(n<48)z+=g(_,S,B)+R[2];else if(n<64)z+=f(_,S,B)+R[3];else z+=h(_,S,B)+R[4];z=(z=x(z|=0,T[n]))+D|0;k=D;D=B;B=x(S,10);S=_;_=z}z=C[1]+w+B|0;C[1]=C[2]+v+D|0;C[2]=C[3]+m+k|0;C[3]=C[4]+o+_|0;C[4]=C[0]+u+S|0;C[0]=z},_doFinalize:function(){var e=this._data,t=e.words,n=8*this._nDataBytes,r=8*e.sigBytes;t[r>>>5]|=128<<24-r%32;t[14+(r+64>>>9<<4)]=16711935&(n<<8|n>>>24)|4278255360&(n<<24|n>>>8);e.sigBytes=4*(t.length+1);this._process();for(var i=this._hash,o=i.words,s=0;s<5;s++){var a=o[s];o[s]=16711935&(a<<8|a>>>24)|4278255360&(a<<24|a>>>8)}return i},clone:function(){var e=i.clone.call(this);e._hash=this._hash.clone();return e}});function h(e,t,n){return e^t^n}function f(e,t,n){return e&t|~e&n}function g(e,t,n){return(e|~t)^n}function b(e,t,n){return e&n|t&~n}function y(e,t,n){return e^(t|~n)}function x(e,t){return e<<t|e>>>32-t}t.RIPEMD160=i._createHelper(u);t.HmacRIPEMD160=i._createHmacHelper(u)}();return e.RIPEMD160}(c())}(),X(),function(){if(J)return G.exports;J=1;G.exports=function(e){r=(n=(t=e).lib).Base,i=n.WordArray,s=(o=t.algo).SHA256,a=o.HMAC,c=o.PBKDF2=r.extend({cfg:r.extend({keySize:4,hasher:s,iterations:25e4}),init:function(e){this.cfg=this.cfg.extend(e)},compute:function(e,t){for(var n=this.cfg,r=a.create(n.hasher,e),o=i.create(),s=i.create([1]),c=o.words,l=s.words,d=n.keySize,p=n.iterations;c.length<d;){var u=r.update(t).finalize(s);r.reset();for(var h=u.words,f=h.length,g=u,b=1;b<p;b++){g=r.finalize(g);r.reset();for(var y=g.words,x=0;x<f;x++)h[x]^=y[x]}o.concat(u);l[0]++}o.sigBytes=4*d;return o}}),t.PBKDF2=function(e,t,n){return c.create(n).compute(e,t)};var t,n,r,i,o,s,a,c;return e.PBKDF2}(c(),E(),X())}(),Z(),te(),function(){if(ne)return re.exports;ne=1;re.exports=function(e){e.mode.CFB=function(){var t=e.lib.BlockCipherMode.extend();t.Encryptor=t.extend({processBlock:function(e,t){var r=this._cipher,i=r.blockSize;n.call(this,e,t,i,r);this._prevBlock=e.slice(t,t+i)}});t.Decryptor=t.extend({processBlock:function(e,t){var r=this._cipher,i=r.blockSize,o=e.slice(t,t+i);n.call(this,e,t,i,r);this._prevBlock=o}});function n(e,t,n,r){var i,o=this._iv;if(o){i=o.slice(0);this._iv=void 0}else i=this._prevBlock;r.encryptBlock(i,0);for(var s=0;s<n;s++)e[t+s]^=i[s]}return t}();return e.mode.CFB}(c(),te())}(),function(){if(ie)return oe.exports;ie=1;oe.exports=function(e){e.mode.CTR=function(){var t=e.lib.BlockCipherMode.extend(),n=t.Encryptor=t.extend({processBlock:function(e,t){var n=this._cipher,r=n.blockSize,i=this._iv,o=this._counter;if(i){o=this._counter=i.slice(0);this._iv=void 0}var s=o.slice(0);n.encryptBlock(s,0);o[r-1]=o[r-1]+1|0;for(var a=0;a<r;a++)e[t+a]^=s[a]}});t.Decryptor=n;return t}();return e.mode.CTR}(c(),te())}(),ce(),function(){if(le)return de.exports;le=1;de.exports=function(e){e.mode.OFB=function(){var t=e.lib.BlockCipherMode.extend(),n=t.Encryptor=t.extend({processBlock:function(e,t){var n=this._cipher,r=n.blockSize,i=this._iv,o=this._keystream;if(i){o=this._keystream=i.slice(0);this._iv=void 0}n.encryptBlock(o,0);for(var s=0;s<r;s++)e[t+s]^=o[s]}});t.Decryptor=n;return t}();return e.mode.OFB}(c(),te())}(),function(){if(pe)return ue.exports;pe=1;ue.exports=function(e){e.mode.ECB=function(){var t=e.lib.BlockCipherMode.extend();t.Encryptor=t.extend({processBlock:function(e,t){this._cipher.encryptBlock(e,t)}});t.Decryptor=t.extend({processBlock:function(e,t){this._cipher.decryptBlock(e,t)}});return t}();return e.mode.ECB}(c(),te())}(),function(){if(he)return fe.exports;he=1;fe.exports=function(e){e.pad.AnsiX923={pad:function(e,t){var n=e.sigBytes,r=4*t,i=r-n%r,o=n+i-1;e.clamp();e.words[o>>>2]|=i<<24-o%4*8;e.sigBytes+=i},unpad:function(e){var t=255&e.words[e.sigBytes-1>>>2];e.sigBytes-=t}};return e.pad.Ansix923}(c(),te())}(),function(){if(ge)return be.exports;ge=1;be.exports=function(e){e.pad.Iso10126={pad:function(t,n){var r=4*n,i=r-t.sigBytes%r;t.concat(e.lib.WordArray.random(i-1)).concat(e.lib.WordArray.create([i<<24],1))},unpad:function(e){var t=255&e.words[e.sigBytes-1>>>2];e.sigBytes-=t}};return e.pad.Iso10126}(c(),te())}(),function(){if(ye)return xe.exports;ye=1;xe.exports=function(e){e.pad.Iso97971={pad:function(t,n){t.concat(e.lib.WordArray.create([2147483648],1));e.pad.ZeroPadding.pad(t,n)},unpad:function(t){e.pad.ZeroPadding.unpad(t);t.sigBytes--}};return e.pad.Iso97971}(c(),te())}(),function(){if(we)return ve.exports;we=1;ve.exports=function(e){e.pad.ZeroPadding={pad:function(e,t){var n=4*t;e.clamp();e.sigBytes+=n-(e.sigBytes%n||n)},unpad:function(e){var t=e.words,n=e.sigBytes-1;for(n=e.sigBytes-1;n>=0;n--)if(t[n>>>2]>>>24-n%4*8&255){e.sigBytes=n+1;break}}};return e.pad.ZeroPadding}(c(),te())}(),function(){if(me)return ke.exports;me=1;ke.exports=function(e){e.pad.NoPadding={pad:function(){},unpad:function(){}};return e.pad.NoPadding}(c(),te())}(),function(){if(_e)return Se.exports;_e=1;Se.exports=function(e){n=(t=e).lib.CipherParams,r=t.enc.Hex,t.format.Hex={stringify:function(e){return e.ciphertext.toString(r)},parse:function(e){var t=r.parse(e);return n.create({ciphertext:t})}};var t,n,r;return e.format.Hex}(c(),te())}(),function(){if(Be)return De.exports;Be=1;De.exports=function(e){!function(){var t=e,n=t.lib.BlockCipher,r=t.algo,i=[],o=[],s=[],a=[],c=[],l=[],d=[],p=[],u=[],h=[];!function(){for(var e=[],t=0;t<256;t++)if(t<128)e[t]=t<<1;else e[t]=t<<1^283;var n=0,r=0;for(t=0;t<256;t++){var f=r^r<<1^r<<2^r<<3^r<<4;f=f>>>8^255&f^99;i[n]=f;o[f]=n;var g=e[n],b=e[g],y=e[b],x=257*e[f]^16843008*f;s[n]=x<<24|x>>>8;a[n]=x<<16|x>>>16;c[n]=x<<8|x>>>24;l[n]=x;x=16843009*y^65537*b^257*g^16843008*n;d[f]=x<<24|x>>>8;p[f]=x<<16|x>>>16;u[f]=x<<8|x>>>24;h[f]=x;if(!n)n=r=1;else{n=g^e[e[e[y^g]]];r^=e[e[r]]}}}();var f=[0,1,2,4,8,16,32,64,128,27,54],g=r.AES=n.extend({_doReset:function(){if(!this._nRounds||this._keyPriorReset!==this._key){for(var e=this._keyPriorReset=this._key,t=e.words,n=e.sigBytes/4,r=4*((this._nRounds=n+6)+1),o=this._keySchedule=[],s=0;s<r;s++)if(s<n)o[s]=t[s];else{l=o[s-1];if(!(s%n)){l=i[(l=l<<8|l>>>24)>>>24]<<24|i[l>>>16&255]<<16|i[l>>>8&255]<<8|i[255&l];l^=f[s/n|0]<<24}else if(n>6&&s%n==4)l=i[l>>>24]<<24|i[l>>>16&255]<<16|i[l>>>8&255]<<8|i[255&l];o[s]=o[s-n]^l}for(var a=this._invKeySchedule=[],c=0;c<r;c++){s=r-c;if(c%4)var l=o[s];else l=o[s-4];if(c<4||s<=4)a[c]=l;else a[c]=d[i[l>>>24]]^p[i[l>>>16&255]]^u[i[l>>>8&255]]^h[i[255&l]]}}},encryptBlock:function(e,t){this._doCryptBlock(e,t,this._keySchedule,s,a,c,l,i)},decryptBlock:function(e,t){var n=e[t+1];e[t+1]=e[t+3];e[t+3]=n;this._doCryptBlock(e,t,this._invKeySchedule,d,p,u,h,o);n=e[t+1];e[t+1]=e[t+3];e[t+3]=n},_doCryptBlock:function(e,t,n,r,i,o,s,a){for(var c=this._nRounds,l=e[t]^n[0],d=e[t+1]^n[1],p=e[t+2]^n[2],u=e[t+3]^n[3],h=4,f=1;f<c;f++){var g=r[l>>>24]^i[d>>>16&255]^o[p>>>8&255]^s[255&u]^n[h++],b=r[d>>>24]^i[p>>>16&255]^o[u>>>8&255]^s[255&l]^n[h++],y=r[p>>>24]^i[u>>>16&255]^o[l>>>8&255]^s[255&d]^n[h++],x=r[u>>>24]^i[l>>>16&255]^o[d>>>8&255]^s[255&p]^n[h++];l=g;d=b;p=y;u=x}g=(a[l>>>24]<<24|a[d>>>16&255]<<16|a[p>>>8&255]<<8|a[255&u])^n[h++],b=(a[d>>>24]<<24|a[p>>>16&255]<<16|a[u>>>8&255]<<8|a[255&l])^n[h++],y=(a[p>>>24]<<24|a[u>>>16&255]<<16|a[l>>>8&255]<<8|a[255&d])^n[h++],x=(a[u>>>24]<<24|a[l>>>16&255]<<16|a[d>>>8&255]<<8|a[255&p])^n[h++];e[t]=g;e[t+1]=b;e[t+2]=y;e[t+3]=x},keySize:8});t.AES=n._createHelper(g)}();return e.AES}(c(),v(),D(),Z(),te())}(),Ae(),function(){if(Re)return Pe.exports;Re=1;Pe.exports=function(e){!function(){var t=e,n=t.lib.StreamCipher,r=t.algo,i=r.RC4=n.extend({_doReset:function(){for(var e=this._key,t=e.words,n=e.sigBytes,r=this._S=[],i=0;i<256;i++)r[i]=i;i=0;for(var o=0;i<256;i++){var s=i%n,a=t[s>>>2]>>>24-s%4*8&255;o=(o+r[i]+a)%256;var c=r[i];r[i]=r[o];r[o]=c}this._i=this._j=0},_doProcessBlock:function(e,t){e[t]^=o.call(this)},keySize:8,ivSize:0});function o(){for(var e=this._S,t=this._i,n=this._j,r=0,i=0;i<4;i++){n=(n+e[t=(t+1)%256])%256;var o=e[t];e[t]=e[n];e[n]=o;r|=e[(e[t]+e[n])%256]<<24-8*i}this._i=t;this._j=n;return r}t.RC4=n._createHelper(i);var s=r.RC4Drop=i.extend({cfg:i.cfg.extend({drop:192}),_doReset:function(){i._doReset.call(this);for(var e=this.cfg.drop;e>0;e--)o.call(this)}});t.RC4Drop=n._createHelper(s)}();return e.RC4}(c(),v(),D(),Z(),te())}(),function(){if(Ee)return We.exports;Ee=1;We.exports=function(e){!function(){var t=e,n=t.lib.StreamCipher,r=t.algo,i=[],o=[],s=[],a=r.Rabbit=n.extend({_doReset:function(){for(var e=this._key.words,t=this.cfg.iv,n=0;n<4;n++)e[n]=16711935&(e[n]<<8|e[n]>>>24)|4278255360&(e[n]<<24|e[n]>>>8);var r=this._X=[e[0],e[3]<<16|e[2]>>>16,e[1],e[0]<<16|e[3]>>>16,e[2],e[1]<<16|e[0]>>>16,e[3],e[2]<<16|e[1]>>>16],i=this._C=[e[2]<<16|e[2]>>>16,4294901760&e[0]|65535&e[1],e[3]<<16|e[3]>>>16,4294901760&e[1]|65535&e[2],e[0]<<16|e[0]>>>16,4294901760&e[2]|65535&e[3],e[1]<<16|e[1]>>>16,4294901760&e[3]|65535&e[0]];this._b=0;for(n=0;n<4;n++)c.call(this);for(n=0;n<8;n++)i[n]^=r[n+4&7];if(t){var o=t.words,s=o[0],a=o[1],l=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),d=16711935&(a<<8|a>>>24)|4278255360&(a<<24|a>>>8),p=l>>>16|4294901760&d,u=d<<16|65535&l;i[0]^=l;i[1]^=p;i[2]^=d;i[3]^=u;i[4]^=l;i[5]^=p;i[6]^=d;i[7]^=u;for(n=0;n<4;n++)c.call(this)}},_doProcessBlock:function(e,t){var n=this._X;c.call(this);i[0]=n[0]^n[5]>>>16^n[3]<<16;i[1]=n[2]^n[7]>>>16^n[5]<<16;i[2]=n[4]^n[1]>>>16^n[7]<<16;i[3]=n[6]^n[3]>>>16^n[1]<<16;for(var r=0;r<4;r++){i[r]=16711935&(i[r]<<8|i[r]>>>24)|4278255360&(i[r]<<24|i[r]>>>8);e[t+r]^=i[r]}},blockSize:4,ivSize:2});function c(){for(var e=this._X,t=this._C,n=0;n<8;n++)o[n]=t[n];t[0]=t[0]+1295307597+this._b|0;t[1]=t[1]+3545052371+(t[0]>>>0<o[0]>>>0?1:0)|0;t[2]=t[2]+886263092+(t[1]>>>0<o[1]>>>0?1:0)|0;t[3]=t[3]+1295307597+(t[2]>>>0<o[2]>>>0?1:0)|0;t[4]=t[4]+3545052371+(t[3]>>>0<o[3]>>>0?1:0)|0;t[5]=t[5]+886263092+(t[4]>>>0<o[4]>>>0?1:0)|0;t[6]=t[6]+1295307597+(t[5]>>>0<o[5]>>>0?1:0)|0;t[7]=t[7]+3545052371+(t[6]>>>0<o[6]>>>0?1:0)|0;this._b=t[7]>>>0<o[7]>>>0?1:0;for(n=0;n<8;n++){var r=e[n]+t[n],i=65535&r,a=r>>>16,c=((i*i>>>17)+i*a>>>15)+a*a,l=((4294901760&r)*r|0)+((65535&r)*r|0);s[n]=c^l}e[0]=s[0]+(s[7]<<16|s[7]>>>16)+(s[6]<<16|s[6]>>>16)|0;e[1]=s[1]+(s[0]<<8|s[0]>>>24)+s[7]|0;e[2]=s[2]+(s[1]<<16|s[1]>>>16)+(s[0]<<16|s[0]>>>16)|0;e[3]=s[3]+(s[2]<<8|s[2]>>>24)+s[1]|0;e[4]=s[4]+(s[3]<<16|s[3]>>>16)+(s[2]<<16|s[2]>>>16)|0;e[5]=s[5]+(s[4]<<8|s[4]>>>24)+s[3]|0;e[6]=s[6]+(s[5]<<16|s[5]>>>16)+(s[4]<<16|s[4]>>>16)|0;e[7]=s[7]+(s[6]<<8|s[6]>>>24)+s[5]|0}t.Rabbit=n._createHelper(a)}();return e.Rabbit}(c(),v(),D(),Z(),te())}(),function(){if(Te)return qe.exports;Te=1;qe.exports=function(e){!function(){var t=e,n=t.lib.StreamCipher,r=t.algo,i=[],o=[],s=[],a=r.RabbitLegacy=n.extend({_doReset:function(){var e=this._key.words,t=this.cfg.iv,n=this._X=[e[0],e[3]<<16|e[2]>>>16,e[1],e[0]<<16|e[3]>>>16,e[2],e[1]<<16|e[0]>>>16,e[3],e[2]<<16|e[1]>>>16],r=this._C=[e[2]<<16|e[2]>>>16,4294901760&e[0]|65535&e[1],e[3]<<16|e[3]>>>16,4294901760&e[1]|65535&e[2],e[0]<<16|e[0]>>>16,4294901760&e[2]|65535&e[3],e[1]<<16|e[1]>>>16,4294901760&e[3]|65535&e[0]];this._b=0;for(var i=0;i<4;i++)c.call(this);for(i=0;i<8;i++)r[i]^=n[i+4&7];if(t){var o=t.words,s=o[0],a=o[1],l=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),d=16711935&(a<<8|a>>>24)|4278255360&(a<<24|a>>>8),p=l>>>16|4294901760&d,u=d<<16|65535&l;r[0]^=l;r[1]^=p;r[2]^=d;r[3]^=u;r[4]^=l;r[5]^=p;r[6]^=d;r[7]^=u;for(i=0;i<4;i++)c.call(this)}},_doProcessBlock:function(e,t){var n=this._X;c.call(this);i[0]=n[0]^n[5]>>>16^n[3]<<16;i[1]=n[2]^n[7]>>>16^n[5]<<16;i[2]=n[4]^n[1]>>>16^n[7]<<16;i[3]=n[6]^n[3]>>>16^n[1]<<16;for(var r=0;r<4;r++){i[r]=16711935&(i[r]<<8|i[r]>>>24)|4278255360&(i[r]<<24|i[r]>>>8);e[t+r]^=i[r]}},blockSize:4,ivSize:2});function c(){for(var e=this._X,t=this._C,n=0;n<8;n++)o[n]=t[n];t[0]=t[0]+1295307597+this._b|0;t[1]=t[1]+3545052371+(t[0]>>>0<o[0]>>>0?1:0)|0;t[2]=t[2]+886263092+(t[1]>>>0<o[1]>>>0?1:0)|0;t[3]=t[3]+1295307597+(t[2]>>>0<o[2]>>>0?1:0)|0;t[4]=t[4]+3545052371+(t[3]>>>0<o[3]>>>0?1:0)|0;t[5]=t[5]+886263092+(t[4]>>>0<o[4]>>>0?1:0)|0;t[6]=t[6]+1295307597+(t[5]>>>0<o[5]>>>0?1:0)|0;t[7]=t[7]+3545052371+(t[6]>>>0<o[6]>>>0?1:0)|0;this._b=t[7]>>>0<o[7]>>>0?1:0;for(n=0;n<8;n++){var r=e[n]+t[n],i=65535&r,a=r>>>16,c=((i*i>>>17)+i*a>>>15)+a*a,l=((4294901760&r)*r|0)+((65535&r)*r|0);s[n]=c^l}e[0]=s[0]+(s[7]<<16|s[7]>>>16)+(s[6]<<16|s[6]>>>16)|0;e[1]=s[1]+(s[0]<<8|s[0]>>>24)+s[7]|0;e[2]=s[2]+(s[1]<<16|s[1]>>>16)+(s[0]<<16|s[0]>>>16)|0;e[3]=s[3]+(s[2]<<8|s[2]>>>24)+s[1]|0;e[4]=s[4]+(s[3]<<16|s[3]>>>16)+(s[2]<<16|s[2]>>>16)|0;e[5]=s[5]+(s[4]<<8|s[4]>>>24)+s[3]|0;e[6]=s[6]+(s[5]<<16|s[5]>>>16)+(s[4]<<16|s[4]>>>16)|0;e[7]=s[7]+(s[6]<<8|s[6]>>>24)+s[5]|0}t.RabbitLegacy=n._createHelper(a)}();return e.RabbitLegacy}(c(),v(),D(),Z(),te())}(),He(),e)}());const Fe=new class{constructor(){this.panel=null;this.enableBrowserConsole=!1;this.logLevel="debug";this.buffer=[];this.maxBufferSize=100;this.enableBrowserConsole=!1;this.logLevel="debug"}configure(e){if(void 0!==e.enableBrowserConsole)this.enableBrowserConsole=e.enableBrowserConsole;if(void 0!==e.logLevel)this.logLevel=e.logLevel}setPanel(e){this.panel=e;this.flushBuffer()}flushBuffer(){if(this.panel){this.buffer.forEach(({message:e,type:t})=>{this.panel.logToConsole(e,t)});this.buffer=[]}}shouldLog(e){const t=["debug","info","warn","error"],n=t.indexOf(this.logLevel);return t.indexOf(e)>=n}formatMessage(e,t,n){const r=n.map(e=>{if("object"==typeof e)try{return JSON.stringify(e,null,2)}catch{return String(e)}return String(e)}).join(" ");return r?`${t} ${r}`:t}output(e,t,n){if(this.panel)this.panel.logToConsole(e,t);else{this.buffer.push({message:e,type:t,timestamp:new Date});if(this.buffer.length>this.maxBufferSize)this.buffer.shift()}if(this.enableBrowserConsole)console[n](e)}debug(e,...t){if(!this.shouldLog("debug"))return;const n=this.formatMessage("[DEBUG]",e,t);this.output(n,"log","log")}log(e,...t){if(!this.shouldLog("info"))return;const n=this.formatMessage("",e,t);this.output(n,"log","log")}info(e,...t){if(!this.shouldLog("info"))return;const n=this.formatMessage("[INFO]",e,t);this.output(n,"log","log")}warn(e,...t){if(!this.shouldLog("warn"))return;const n=this.formatMessage("[WARN]",e,t);this.output(n,"warn","warn")}error(e,...t){if(!this.shouldLog("error"))return;const n=this.formatMessage("[ERROR]",e,t);this.output(n,"error","error")}consoleDirect(e,...t){console.log(e,...t)}};class Ue{constructor(){this.requests=new Map;this.listeners=[];this.decryptConfig={enabled:!1};window.__originalFetch=window.fetch;this.interceptXHR();this.interceptFetch()}enableDecryption(e){this.decryptConfig.enabled=!0;if(e?.keyExtractor)this.decryptConfig.keyExtractor=e.keyExtractor;if(e?.slkExtractor)this.decryptConfig.slkExtractor=e.slkExtractor;if(void 0!==e?.autoFetchKeys)this.decryptConfig.autoFetchKeys=e.autoFetchKeys;if(e?.keyApiUrl)this.decryptConfig.keyApiUrl=e.keyApiUrl}addListener(e){this.listeners.push(e)}removeListener(e){const t=this.listeners.indexOf(e);if(t>-1)this.listeners.splice(t,1)}getRequests(){return Array.from(this.requests.values()).sort((e,t)=>t.timestamp-e.timestamp)}clearRequests(){this.requests.clear()}generateRequestId(){return Math.random().toString(36).substr(2,9)}isInternalUrl(e){return e.includes("/api/dokv/storage")||e.includes("/api/share")}notifyListeners(e){this.listeners.forEach(t=>{try{t(e)}catch(n){Fe.warn("NetworkDebugger: Listener error:",n)}})}extractUrlParams(e){try{const t=new URL(e),n={};t.searchParams.forEach((e,t)=>{n[t]=e});if(Object.keys(n).length>0)if(1===Object.keys(n).length&&n.data)return n.data;else return n;return null}catch(t){return null}}async tryDecrypt(e,t){Fe.debug("[PWTK Debug] tryDecrypt called:",{dataType:typeof e,dataLength:"string"==typeof e?e.length:JSON.stringify(e).length,dataPreview:"string"==typeof e?e.substring(0,100):JSON.stringify(e).substring(0,100),headers:Object.keys(t),decryptEnabled:this.decryptConfig.enabled,hasWindowDecrypt:"function"==typeof window.decrypt});if(!this.decryptConfig.enabled||!e){Fe.debug("[PWTK Debug] Decrypt disabled or no data");return null}try{let r="",i="";if(t.cid&&!1!==this.decryptConfig.autoFetchKeys){Fe.debug("[PWTK Debug] Trying to fetch key with cid:",t.cid);try{const e=this.decryptConfig.keyApiUrl||"https://gw-card-pay.buyacard.cc/ip/getSK",n={cid:t.cid,client:t.client||"S_WEB",device:t.device||"Web",language:t.language||"CN"};Fe.debug("[PWTK Debug] Fetching key from:",e,"with headers:",n);const i=window.__originalFetch||window.fetch,o=await i(e,{headers:n}),s=await o.json();Fe.debug("[PWTK Debug] getSK API response:",s);if(s.success&&s.data){const e=String(s.data);Fe.debug("[PWTK Debug] getSK returned num:",e,"length:",e.length);if(e.length>=9){r=e.charAt(2)+e.charAt(5)+e.charAt(8);Fe.debug("[PWTK Debug] Extracted key from getSK:",r)}else Fe.debug("[PWTK Debug] getSK num too short:",e)}else Fe.debug("[PWTK Debug] getSK failed:",s)}catch(n){Fe.warn("[PWTK Debug] getSK API error:",n)}}else Fe.debug("[PWTK Debug] No cid or autoFetchKeys disabled");if(!r&&this.decryptConfig.keyExtractor){r=this.decryptConfig.keyExtractor(t);Fe.debug("[PWTK Debug] Key from custom extractor:",r)}else if(!r){r=t.decryptKey||t.keys||t.cid||"";Fe.debug("[PWTK Debug] Key from headers:",r,"from:",t.decryptKey?"decryptKey":t.keys?"keys":t.cid?"cid":"none")}if(this.decryptConfig.slkExtractor){i=this.decryptConfig.slkExtractor(t);Fe.debug("[PWTK Debug] SLK from custom extractor:",i)}else{i=t.decryptSlk||t.slk||"";Fe.debug("[PWTK Debug] SLK from headers:",i,"from:",t.decryptSlk?"decryptSlk":t.slk?"slk":"none")}const o=r+i;Fe.debug("[PWTK Debug] Full decrypt key:",o?`"${o}" (length: ${o.length})`:"empty");if(o){let t=e,r=!1;if("object"==typeof e&&null!==e&&e.data&&"string"==typeof e.data){Fe.debug('[PWTK Debug] Data is wrapped in {"data": "..."} format, extracting inner data');t=e.data;r=!0}else if("string"==typeof e)try{const n=JSON.parse(e);if(n.data&&"string"==typeof n.data){Fe.debug("[PWTK Debug] Data is JSON string with data field, extracting");t=n.data;r=!0}}catch{}const i="string"==typeof t?t:JSON.stringify(t);Fe.debug("[PWTK Debug] Calling decrypt with:",{dataLength:i.length,dataPreview:i.substring(0,50),key:o,isWrapped:r});const s=function(e,t){Fe.debug("[PWTK Decrypt] decrypt function called:",{dataLength:e?.length,dataPreview:e?.substring(0,50),keyStr:t,hasWindowDecrypt:"function"==typeof window.decrypt,hasWindowEncrypt:"function"==typeof window.encrypt});if(!e||e.startsWith("{")||e.startsWith("[")){Fe.debug("[PWTK Decrypt] Data looks like JSON, parsing directly");try{const t=JSON.parse(e);Fe.debug("[PWTK Decrypt] Successfully parsed as JSON");return t}catch{Fe.debug("[PWTK Decrypt] Failed to parse as JSON, returning as string");return e}}if(window.decrypt&&t){Fe.debug("[PWTK Decrypt] Trying WebAssembly decrypt");Fe.debug("[PWTK Decrypt] Input to window.decrypt:",{data:e.substring(0,100)+"...",key:t});try{const n=window.decrypt(e,t);Fe.debug("[PWTK Decrypt] window.decrypt returned:",{type:typeof n,length:n?.length,preview:n?n.substring(0,200)+(n.length>200?"...":""):null,sameAsInput:n===e,hasInvalidChars:n?.includes("�")});if(n&&n!==e&&!n.includes("�"))try{const e=JSON.parse(n);Fe.debug("[PWTK Decrypt] ✅ WebAssembly decryption successful, parsed as JSON:",e);return e}catch{if(n.length>0){Fe.debug("[PWTK Decrypt] ✅ WebAssembly decryption successful, returning as string");return n}}else Fe.debug("[PWTK Decrypt] window.decrypt did not change the data or returned invalid result")}catch(n){Fe.debug("[PWTK Decrypt] WebAssembly decrypt error:",n)}}else Fe.debug("[PWTK Decrypt] WebAssembly not available:",{hasWindowDecrypt:!!window.decrypt,hasKey:!!t,windowDecryptType:typeof window.decrypt});const r=[t,"thisisakey123456","VITE_CRYPTO_KEY"].filter(Boolean);for(const i of r)if(i)try{const t=Me.enc.Utf8.parse(i.padEnd(16,"0").slice(0,16)),n=Me.enc.Utf8.parse(i.padEnd(16,"0").slice(0,16)),r=Me.AES.decrypt(e,t,{iv:n,mode:Me.mode.CBC,padding:Me.pad.Pkcs7}).toString(Me.enc.Utf8);if(r)try{return JSON.parse(r)}catch{return r}}catch(n){}try{const t=atob(e);try{return JSON.parse(t)}catch{return t}}catch{}Fe.debug("[PWTK Decrypt] ❌ All decryption methods failed, returning original data");return e}(i,o);Fe.debug("[PWTK Debug] Decrypt result:",{success:s&&s!==i,decryptedType:typeof s,decryptedLength:s?"string"==typeof s?s.length:JSON.stringify(s).length:0,preview:s?"string"==typeof s?s.substring(0,100):JSON.stringify(s).substring(0,100):null});if(s&&s!==i){Fe.debug("[PWTK Debug] ✅ Decryption successful! Result:",s);return s}else Fe.debug("[PWTK Debug] ❌ Decryption failed or returned same data")}else Fe.debug("[PWTK Debug] No key available, skipping decryption")}catch(r){Fe.error("[PWTK Debug] tryDecrypt error:",r)}Fe.debug("[PWTK Debug] tryDecrypt returning null");return null}interceptXHR(){const e=window.XMLHttpRequest,t=this;window.XMLHttpRequest=function(...n){const r=new e(...n),i=t.generateRequestId();let o="",s="",a={};const c=Date.now();let l=!1;const d=r.open;r.open=function(e,n,...r){o=e.toUpperCase();s=n;l=t.isInternalUrl(s);return d.apply(this,[e,n,...r])};const p=r.setRequestHeader;r.setRequestHeader=function(e,t){a[e]=t;return p.call(this,e,t)};const u=r.send;r.send=function(e){if(l)return u.call(this,e);const n={id:i,url:s,method:o,headers:{...a},requestBody:e,timestamp:c};let r=e;if("GET"===o&&!e){r=t.extractUrlParams(s);if(r)n.requestBody=r}if(r)t.tryDecrypt(r,a).then(e=>{if(null!==e){n.decryptedRequest=e;t.requests.set(i,n);Fe.debug("[PWTK Debug] Request decrypted, notifying UI");t.notifyListeners(n)}}).catch(e=>Fe.warn("解密请求失败:",e));t.requests.set(i,n);t.notifyListeners(n);return u.call(this,e)};r.addEventListener("readystatechange",function(){Fe.debug("[PWTK Debug] XHR state changed:",{readyState:r.readyState,readyStateName:["UNSENT","OPENED","HEADERS_RECEIVED","LOADING","DONE"][r.readyState],status:r.status,isInternal:l,requestId:i,url:s});Fe.debug("[PWTK Debug] Checking response condition:",{readyState:r.readyState,isDone:4===r.readyState,XMLHttpRequestDONE:"undefined"!=typeof XMLHttpRequest?XMLHttpRequest.DONE:"undefined",isInternal:l,shouldProcess:4===r.readyState&&!l});if(4===r.readyState&&!l){Fe.debug("[PWTK Debug] XHR completed, processing response");const e=Date.now(),n=t.requests.get(i);if(n){Fe.debug("[PWTK Debug] Found request data, updating with response");n.status=r.status;n.statusText=r.statusText;n.duration=e-c;const o={},s=r.getAllResponseHeaders();if(s)s.split("\r\n").forEach(e=>{const t=e.split(": ");if(2===t.length)o[t[0]]=t[1]});n.responseHeaders=o;const l=null!==r.responseText&&void 0!==r.responseText&&""!==r.responseText;Fe.debug("[PWTK Debug] XHR Response received:",{status:n.status,hasResponseText:l,responseTextLength:r.responseText?.length,responseTextPreview:r.responseText?.substring(0,100)});if(l)try{n.responseBody=JSON.parse(r.responseText);Fe.debug("[PWTK Debug] Response parsed as JSON:",n.responseBody)}catch{n.responseBody=r.responseText;Fe.debug("[PWTK Debug] Response kept as text")}else{n.responseBody=null;Fe.debug("[PWTK Debug] No response body")}Fe.debug("[PWTK Debug] Updating request with response data");t.requests.set(i,n);t.notifyListeners(n);if(n.responseBody)t.tryDecrypt(n.responseBody,{...a,...o}).then(e=>{if(null!==e){n.decryptedResponse=e;t.requests.set(i,n);Fe.debug("[PWTK Debug] Response decrypted, notifying UI:",e);t.notifyListeners(n)}}).catch(e=>Fe.warn("解密响应失败:",e))}else Fe.debug("[PWTK Debug] WARNING: Request data not found for ID:",i)}});return r};window.XMLHttpRequest.prototype=e.prototype}interceptFetch(){const e=window.__originalFetch||window.fetch,t=this;window.fetch=async function(n,r){const i=t.generateRequestId(),o=Date.now(),s="string"==typeof n?n:n instanceof URL?n.toString():n.url,a=(r?.method||"GET").toUpperCase();if(t.isInternalUrl(s))return e.call(this,n,r);const c={};if(r?.headers)if(r.headers instanceof Headers)r.headers.forEach((e,t)=>{c[t]=e});else if(Array.isArray(r.headers))r.headers.forEach(([e,t])=>{c[e]=t});else Object.entries(r.headers).forEach(([e,t])=>{c[e]=t});let l=null;if(r?.body)if("string"==typeof r.body)try{l=JSON.parse(r.body)}catch{l=r.body}else l=r.body;const d={id:i,url:s,method:a,headers:{...c},requestBody:l,timestamp:o};let p=l;if("GET"===a&&!l){p=t.extractUrlParams(s);if(p)d.requestBody=p}if(p)t.tryDecrypt(p,c).then(e=>{if(null!==e){d.decryptedRequest=e;t.requests.set(i,d);Fe.debug("[PWTK Debug] Fetch request decrypted, notifying UI");t.notifyListeners(d)}}).catch(e=>Fe.warn("解密请求失败:",e));t.requests.set(i,d);t.notifyListeners(d);try{const s=await e.call(this,n,r),a=Date.now(),l=s.clone(),d=t.requests.get(i);if(d){d.status=s.status;d.statusText=s.statusText;d.duration=a-o;const e={};s.headers.forEach((t,n)=>{e[n]=t});d.responseHeaders=e;try{const n=await l.text();Fe.debug("[PWTK Debug] Fetch Response received:",{status:d.status,textLength:n.length,textPreview:n.substring(0,100)});try{d.responseBody=JSON.parse(n)}catch{d.responseBody=n}t.requests.set(i,d);t.notifyListeners(d);if(d.responseBody)t.tryDecrypt(d.responseBody,{...c,...e}).then(e=>{if(null!==e){d.decryptedResponse=e;t.requests.set(i,d);Fe.debug("[PWTK Debug] Fetch response decrypted, notifying UI:",e);t.notifyListeners(d)}}).catch(e=>Fe.warn("解密响应失败:",e))}catch(u){d.error=`Failed to read response: ${u}`;t.requests.set(i,d);t.notifyListeners(d)}}return s}catch(u){const e=Date.now(),n=t.requests.get(i);if(n){n.error=u instanceof Error?u.message:String(u);n.duration=e-o;t.requests.set(i,n);t.notifyListeners(n)}throw u}}}}class Ne{constructor(){this.loaded=!1;this.loading=!1}async loadWasm(e,t){Fe.debug("[PWTK WASM] loadWasm called");Fe.debug("[PWTK WASM] Current state:",{hasWindowDecrypt:"function"==typeof window.decrypt,hasWindowEncrypt:"function"==typeof window.encrypt,hasWindowGo:void 0!==window.Go});if("function"==typeof window.decrypt){Fe.debug("[PWTK WASM] window.decrypt already exists, skipping WASM load");this.loaded=!0;return!0}if(this.loaded)return!0;if(this.loading)return new Promise(e=>{const t=()=>{if(this.loaded||!this.loading)e(this.loaded);else setTimeout(t,100)};t()});this.loading=!0;try{const o=[e,"/mimlib.wasm","/dist/mimlib.wasm","/assets/mimlib.wasm","https://gw-card-pay.buyacard.cc/mimlib.wasm"].filter(Boolean),s=[t,"/wasm_exec.js","/dist/wasm_exec.js","/assets/wasm_exec.js","https://gw-card-pay.buyacard.cc/wasm_exec.js"].filter(Boolean);let a=!1;for(const e of s)try{await this.loadScript(e);if(void 0!==window.Go){a=!0;Fe.debug("[PWTK WASM] wasm_exec.js loaded successfully from:",e);break}}catch(n){Fe.warn("NetworkDebugger: 尝试加载",e,"失败:",n);continue}if(!a)throw new Error("Unable to load wasm_exec.js from any path");if(void 0===window.Go)throw new Error("Go WebAssembly runtime not available");const c=new window.Go;let l=null;for(const e of o)try{if(WebAssembly.instantiateStreaming)try{l=await WebAssembly.instantiateStreaming(fetch(e),c.importObject);Fe.info("NetworkDebugger: WebAssembly 加载成功:",e);break}catch(r){Fe.warn("instantiateStreaming 失败,尝试传统方式:",r);const t=await fetch(e).then(e=>e.arrayBuffer());l=await WebAssembly.instantiate(t,c.importObject);Fe.info("NetworkDebugger: WebAssembly 加载成功(传统方式):",e);break}else{const t=await fetch(e).then(e=>e.arrayBuffer());l=await WebAssembly.instantiate(t,c.importObject);Fe.info("NetworkDebugger: WebAssembly 加载成功(传统方式):",e);break}}catch(i){Fe.warn("NetworkDebugger: 尝试加载",e,"失败:",i);continue}if(!l)throw new Error("Unable to load WebAssembly from any path");c.run(l.instance);await new Promise(e=>setTimeout(e,100));Fe.debug("[PWTK WASM] After WASM load, checking functions:",{hasDecrypt:"function"==typeof window.decrypt,hasEncrypt:"function"==typeof window.encrypt,windowKeys:Object.keys(window).filter(e=>e.includes("crypt"))});if("function"==typeof window.decrypt){this.loaded=!0;Fe.debug("[PWTK WASM] ✅ WebAssembly loaded successfully, decrypt function available");return!0}else{Fe.warn("[PWTK WASM] ❌ WebAssembly loaded but decrypt function not available");return!1}}catch(i){Fe.error("[PWTK WASM] WebAssembly loading failed:",i);return!1}finally{this.loading=!1;Fe.debug("[PWTK WASM] Load complete, final state:",{loaded:this.loaded,hasDecrypt:"function"==typeof window.decrypt})}}loadScript(e){return new Promise((t,n)=>{if(document.querySelector(`script[src="${e}"]`)){t();return}const r=document.createElement("script");r.src=e;r.type="text/javascript";r.onload=()=>t();r.onerror=t=>n(new Error(`Failed to load script: ${e}`));document.head.appendChild(r)})}isLoaded(){return this.loaded}isLoading(){return this.loading}isDecryptAvailable(){return this.loaded&&"function"==typeof window.decrypt}isEncryptAvailable(){return this.loaded&&"function"==typeof window.encrypt}}function Ie(e){return JSON.stringify(e,null,2)}async function $e(e){try{const n=function(e){let t=`curl '${e.url}'`;if("GET"!==e.method)t+=` -X ${e.method}`;if(e.headers)Object.entries(e.headers).forEach(([e,n])=>{t+=` -H '${e}: ${n}'`});if(e.requestBody){const n="string"==typeof e.requestBody?e.requestBody:JSON.stringify(e.requestBody);t+=` --data '${n}'`}return t}(e),r={curl:n,response:e.responseBody||null,timestamp:Date.now(),slk:e.headers?.slk||"",debuggerData:{url:e.url,method:e.method,headers:e.headers,status:e.status,statusText:e.statusText,duration:e.duration,responseHeaders:e.responseHeaders,decryptedRequest:e.decryptedRequest,decryptedResponse:e.decryptedResponse,error:e.error,creator:"PWTK Network Debugger by Leo (@leeguoo)",version:"1.2.26"}},i=window.__originalFetch||window.fetch,o="https://curl.bwg.leeguoo.com/api/share";Fe.debug("使用分享API:",o);let s;try{s=await i(o,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({data:r})})}catch(t){if("TypeError"===t.name&&t.message.includes("fetch"))throw new Error(`网络连接失败: 无法连接到分享服务器 (${o}). 可能原因: CORS策略限制或网络问题`);throw t}if(!s.ok)throw new Error(`HTTP ${s.status}: ${s.statusText}`);const a=await s.json();if(a.shareId){const e=`https://curl.bwg.leeguoo.com/share/${a.shareId}`;Fe.info(`🔗 分享链接创建成功 (by Leo): ${e}`);return e}else throw new Error(a.error||"创建分享失败")}catch(n){const e=n.message||n.toString()||"未知错误";Fe.error("NetworkDebugger: 创建分享链接失败:",{message:e,name:n.name,stack:n.stack?.split("\n")[0]});throw new Error(e)}}async function je(e){try{if(navigator.clipboard&&navigator.clipboard.writeText){await navigator.clipboard.writeText(e);return!0}else{const t=document.createElement("textarea");t.value=e;t.style.position="fixed";t.style.opacity="0";document.body.appendChild(t);t.select();const n=document.execCommand("copy");document.body.removeChild(t);return n}}catch(t){Fe.error("复制到剪贴板失败:",t);return!1}}const Xe=class e{constructor(e,t={}){this.isDragging=!1;this.isResizing=!1;this.dragStart={x:0,y:0};this.resizeTimeout=null;this.resizeDirection="";this.requestsCache=[];this.interceptor=e;const n=this.loadConfig();this.config={position:"bottom-right",theme:"dark",minimized:!1,isClosed:!1,...n,...t};this.createPanel();this.bindEvents();this.startListening();Fe.setPanel(this);this.loadPosition();if(this.config.isClosed)this.hide()}createPanel(){this.hostElement=document.createElement("div");this.hostElement.id="network-debugger-host";this.hostElement.style.cssText="all: initial; position: absolute; top: 0; left: 0; pointer-events: none;";this.shadowRoot=this.hostElement.attachShadow({mode:"closed"});const e=document.createElement("style");e.textContent="\n/* iOS 26 Liquid Glass NetworkDebugger 样式 */\n:root {\n --liquid-glass-primary: rgba(255, 255, 255, 0.15);\n --liquid-glass-secondary: rgba(255, 255, 255, 0.08);\n --liquid-glass-border: rgba(255, 255, 255, 0.18);\n --liquid-glass-shadow: rgba(31, 38, 135, 0.37);\n --liquid-glass-highlight: rgba(255, 255, 255, 0.25);\n --liquid-glass-dark: rgba(13, 17, 23, 0.75);\n}\n\n#network-debugger-panel {\n position: fixed;\n z-index: 999999;\n \n /* 强制 GPU 加速和 3D 变换 */\n transform: translate3d(0, 0, 0);\n will-change: transform, backdrop-filter;\n \n /* iOS 26 Liquid Glass 核心效果 - 增强版 */\n backdrop-filter: blur(25px) saturate(200%) brightness(1.05) !important;\n -webkit-backdrop-filter: blur(25px) saturate(200%) brightness(1.05) !important;\n \n /* iOS 浅色毛玻璃背景 */\n background: rgba(245, 245, 247, 0.8);\n background-image: linear-gradient(\n 135deg,\n rgba(255, 255, 255, 0.5) 0%,\n rgba(255, 255, 255, 0.25) 100%\n );\n \n /* 玻璃边框 */\n border: 1px solid rgba(255, 255, 255, 0.25);\n \n /* 多层阴影创建深度 */\n box-shadow: \n 0 10px 40px rgba(31, 38, 135, 0.4),\n inset 0 2px 4px rgba(255, 255, 255, 0.3),\n inset 0 -2px 4px rgba(0, 0, 0, 0.12);\n \n border-radius: 20px;\n color: #ffffff;\n font-family: 'SF Pro Display', -apple-system, BlinkMacSystemFont, 'Monaco', 'Menlo', monospace;\n font-size: 12px;\n overflow: hidden;\n max-width: 90vw;\n max-height: 80vh;\n \n /* 性能优化 */\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n/* 主面板的镜面反射效果 */\n#network-debugger-panel::before {\n content: '';\n position: absolute;\n inset: 0;\n border-radius: inherit;\n background: linear-gradient(\n 135deg,\n rgba(255, 255, 255, 0.3) 0%,\n rgba(255, 255, 255, 0.05) 50%,\n transparent 100%\n );\n pointer-events: none;\n z-index: 1;\n}\n\n/* 镜面高光效果 */\n#network-debugger-panel::after {\n content: '';\n position: absolute;\n inset: 0;\n border-radius: inherit;\n background: radial-gradient(\n circle at 30% 30%,\n rgba(255, 255, 255, 0.2),\n transparent 70%\n );\n pointer-events: none;\n z-index: 1;\n}\n\n#network-debugger-panel.minimized {\n /* iOS 控制中心风格的圆角矩形 */\n height: 48px !important;\n width: 220px !important;\n max-width: 220px !important;\n border-radius: 24px !important;\n overflow: hidden;\n \n /* 强制 GPU 加速和 3D 变换 */\n transform: translate3d(0, 0, 0) !important;\n will-change: transform, backdrop-filter !important;\n \n /* 真正的 iOS Liquid Glass 效果 - 加强版 */\n background: \n /* 顶部高光 */\n linear-gradient(180deg, \n rgba(255, 255, 255, 0.5) 0%, \n rgba(255, 255, 255, 0.1) 35%),\n /* 主玻璃层 */\n radial-gradient(ellipse at top, \n rgba(255, 255, 255, 0.35), \n rgba(255, 255, 255, 0.12)),\n /* iOS 浅色基底 */\n rgba(245, 245, 247, 0.85) !important;\n \n /* 增强毛玻璃效果 */\n backdrop-filter: blur(40px) saturate(220%) brightness(1.1) !important;\n -webkit-backdrop-filter: blur(40px) saturate(220%) brightness(1.1) !important;\n \n /* iOS 风格边缘光效 - 增强版 */\n box-shadow: \n /* 外发光 */\n 0 0 0 0.5px rgba(255, 255, 255, 0.7) !important,\n /* 内阴影创建玻璃厚度 */\n inset 0 1px 0 0 rgba(255, 255, 255, 0.7) !important,\n inset 0 -1px 0 0 rgba(0, 0, 0, 0.2) !important,\n /* 深度阴影 */\n 0 15px 40px rgba(0, 0, 0, 0.3) !important,\n 0 4px 10px rgba(0, 0, 0, 0.2) !important;\n \n /* 平滑过渡 */\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1) !important;\n}\n\n#network-debugger-panel.minimized .debugger-content {\n display: none;\n}\n\n#network-debugger-panel.minimized .resize-handle {\n display: none;\n}\n\n#network-debugger-panel.fullscreen .resize-handle {\n display: none;\n}\n\n#network-debugger-panel.fullscreen {\n backdrop-filter: blur(25px) saturate(200%);\n -webkit-backdrop-filter: blur(25px) saturate(200%);\n}\n\n#network-debugger-panel.bottom-right {\n bottom: 20px;\n right: 20px;\n width: 600px;\n height: 500px;\n}\n\n#network-debugger-panel.bottom-left {\n bottom: 20px;\n left: 20px;\n width: 600px;\n height: 500px;\n}\n\n#network-debugger-panel.top-right {\n top: 20px;\n right: 20px;\n width: 600px;\n height: 500px;\n}\n\n#network-debugger-panel.top-left {\n top: 20px;\n left: 20px;\n width: 600px;\n height: 500px;\n}\n\n#network-debugger-panel.fullscreen {\n top: 0;\n left: 0;\n width: 100vw !important;\n height: 100vh !important;\n border-radius: 0;\n}\n\n.debugger-header {\n /* 头部 Liquid Glass 效果 */\n backdrop-filter: blur(15px) brightness(1.1);\n -webkit-backdrop-filter: blur(15px) brightness(1.1);\n \n /* 多层背景效果 */\n background: \n /* 顶部高光 */\n linear-gradient(180deg, \n rgba(255, 255, 255, 0.8) 0%, \n rgba(255, 255, 255, 0.4) 60%),\n /* 基础玻璃层 */\n linear-gradient(\n 135deg,\n rgba(255, 255, 255, 0.6),\n rgba(255, 255, 255, 0.4)\n );\n \n border: 1px solid rgba(255, 255, 255, 0.2);\n border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n \n padding: 12px 16px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n user-select: none;\n position: relative;\n z-index: 2;\n \n /* iOS 风格圆角 */\n border-radius: 20px 20px 0 0;\n \n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.debugger-header:hover {\n backdrop-filter: blur(18px) brightness(1.15);\n -webkit-backdrop-filter: blur(18px) brightness(1.15);\n background: linear-gradient(\n 135deg,\n rgba(255, 255, 255, 0.15),\n rgba(255, 255, 255, 0.08)\n );\n}\n\n.debugger-title {\n font-weight: 600;\n color: rgba(60, 60, 67, 0.9);\n font-size: 15px;\n text-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\n}\n\n.debugger-controls {\n display: flex;\n gap: 10px;\n position: relative;\n z-index: 3;\n}\n\n.debugger-btn {\n /* 按钮毛玻璃效果但保证可见性 */\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n background: linear-gradient(\n 135deg,\n rgba(255, 255, 255, 0.7),\n rgba(255, 255, 255, 0.5)\n );\n border: 1px solid rgba(0, 0, 0, 0.08);\n color: rgba(60, 60, 67, 0.9);\n text-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\n padding: 6px 12px;\n border-radius: 12px;\n cursor: pointer;\n font-size: 11px;\n font-weight: 600;\n \n /* 按钮阴影 */\n box-shadow: \n 0 2px 8px rgba(0, 0, 0, 0.1),\n inset 0 1px 0 rgba(255, 255, 255, 0.25);\n \n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n transform: translateZ(0);\n}\n\n.debugger-btn:hover {\n backdrop-filter: blur(12px);\n -webkit-backdrop-filter: blur(12px);\n background: linear-gradient(\n 135deg,\n rgba(255, 255, 255, 0.2),\n rgba(255, 255, 255, 0.12)\n );\n transform: scale(1.05) translateZ(5px);\n box-shadow: \n 0 4px 16px rgba(0, 0, 0, 0.15),\n inset 0 1px 0 rgba(255, 255, 255, 0.3);\n}\n\n.debugger-btn:active {\n transform: scale(0.98);\n transition: transform 0.1s;\n}\n\n.debugger-btn.active {\n background: linear-gradient(135deg, #42b883, #35495e);\n color: #ffffff;\n box-shadow: \n 0 0 20px rgba(66, 184, 131, 0.4),\n inset 0 1px 0 rgba(255, 255, 255, 0.3);\n backdrop-filter: blur(10px);\n}\n\n.debugger-icon {\n width: 16px;\n height: 16px;\n vertical-align: middle;\n filter: \n brightness(0.8) \n drop-shadow(0 1px 2px rgba(255, 255, 255, 0.8));\n color: rgba(60, 60, 67, 0.8);\n}\n\n.debugger-content {\n height: calc(100% - 60px);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n/* 移除标签页相关样式 - 只保留网络面板 */\n\n.debugger-panel-content {\n flex: 1;\n overflow: auto;\n padding: 12px;\n}\n\n.request-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 16px;\n position: relative;\n z-index: 2;\n}\n\n.request-item {\n /* 请求项毛玻璃效果加动态光效 */\n position: relative;\n backdrop-filter: blur(10px) brightness(1.1);\n -webkit-backdrop-filter: blur(10px) brightness(1.1);\n \n /* 多层背景 - 模拟 Liquid Glass */\n background: \n /* 动态光效层 */\n linear-gradient(\n 105deg,\n transparent 35%,\n rgba(255, 255, 255, 0.25) 45%,\n rgba(255, 255, 255, 0.35) 50%,\n rgba(255, 255, 255, 0.25) 55%,\n transparent 65%\n ),\n /* 基础玻璃层 */\n linear-gradient(\n 135deg,\n rgba(255, 255, 255, 0.8),\n rgba(255, 255, 255, 0.6)\n );\n \n background-size: 300% 100%, 100% 100%;\n border: 1px solid rgba(255, 255, 255, 0.2);\n border-radius: 16px;\n padding: 16px;\n cursor: pointer;\n \n /* 深度阴影和玻璃效果 */\n box-shadow: \n 0 4px 16px rgba(31, 38, 135, 0.2),\n inset 0 1px 2px rgba(255, 255, 255, 0.15),\n inset 0 -1px 1px rgba(0, 0, 0, 0.05);\n \n /* 流体动画和光效 */\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n transform: translateZ(0);\n animation: liquid-shimmer 4s ease-in-out infinite;\n}\n\n/* 模拟折射效果的伪元素 */\n.request-item::before {\n content: '';\n position: absolute;\n inset: -1px;\n border-radius: inherit;\n background: radial-gradient(\n circle at var(--mouse-x, 30%) var(--mouse-y, 30%),\n rgba(255, 255, 255, 0.4) 0%,\n rgba(255, 255, 255, 0.1) 30%,\n transparent 70%\n );\n opacity: 0;\n transition: opacity 0.4s ease;\n pointer-events: none;\n mix-blend-mode: overlay;\n z-index: 1;\n}\n\n/* 高光效果伪元素 */\n.request-item::after {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n height: 40%;\n border-radius: 16px 16px 0 0;\n background: linear-gradient(\n 180deg,\n rgba(255, 255, 255, 0.2) 0%,\n transparent 100%\n );\n pointer-events: none;\n z-index: 1;\n}\n\n.request-item:hover {\n backdrop-filter: blur(15px) brightness(1.2);\n -webkit-backdrop-filter: blur(15px) brightness(1.2);\n \n /* 增强 hover 时的光效 */\n background: \n linear-gradient(\n 105deg,\n transparent 20%,\n rgba(255, 255, 255, 0.35) 40%,\n rgba(255, 255, 255, 0.5) 50%,\n rgba(255, 255, 255, 0.35) 60%,\n transparent 80%\n ),\n linear-gradient(\n 135deg,\n rgba(255, 255, 255, 0.2),\n rgba(255, 255, 255, 0.12)\n );\n \n background-size: 200% 100%, 100% 100%;\n transform: scale(1.02) translateZ(15px);\n animation: liquid-refraction 0.6s ease-out;\n \n box-shadow: \n 0 12px 40px rgba(31, 38, 135, 0.35),\n inset 0 2px 4px rgba(255, 255, 255, 0.25),\n inset 0 -2px 2px rgba(0, 0, 0, 0.08);\n}\n\n/* 激活折射效果 */\n.request-item:hover::before {\n opacity: 1;\n}\n\n.request-item.expanded {\n backdrop-filter: blur(18px) brightness(1.2);\n -webkit-backdrop-filter: blur(18px) brightness(1.2);\n background: linear-gradient(\n 135deg,\n rgba(66, 184, 131, 0.1),\n rgba(53, 73, 94, 0.05)\n );\n border-color: rgba(66, 184, 131, 0.3);\n box-shadow: \n 0 12px 40px rgba(66, 184, 131, 0.2),\n inset 0 2px 4px rgba(255, 255, 255, 0.15);\n}\n\n.request-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 4px;\n}\n\n.request-method {\n /* 方法标签毛玻璃效果 */\n backdrop-filter: blur(6px);\n -webkit-backdrop-filter: blur(6px);\n padding: 4px 10px;\n border-radius: 10px;\n font-weight: 600;\n font-size: 10px;\n text-transform: uppercase;\n min-width: 45px;\n text-align: center;\n border: 1px solid rgba(255, 255, 255, 0.2);\n box-shadow: \n 0 2px 8px rgba(0, 0, 0, 0.1),\n inset 0 1px 0 rgba(255, 255, 255, 0.25);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.method-get { \n background: linear-gradient(135deg, #4CAF50, #45a049);\n color: #ffffff;\n box-shadow: 0 0 15px rgba(76, 175, 80, 0.4);\n}\n.method-post { \n background: linear-gradient(135deg, #2196F3, #1976D2);\n color: #ffffff;\n box-shadow: 0 0 15px rgba(33, 150, 243, 0.4);\n}\n.method-put { \n background: linear-gradient(135deg, #FF9800, #F57C00);\n color: #ffffff;\n box-shadow: 0 0 15px rgba(255, 152, 0, 0.4);\n}\n.method-delete { \n background: linear-gradient(135deg, #F44336, #D32F2F);\n color: #ffffff;\n box-shadow: 0 0 15px rgba(244, 67, 54, 0.4);\n}\n.method-patch { \n background: linear-gradient(135deg, #9C27B0, #7B1FA2);\n color: #ffffff;\n box-shadow: 0 0 15px rgba(156, 39, 176, 0.4);\n}\n\n.request-url {\n flex: 1;\n margin: 0 8px;\n word-break: break-all;\n white-space: normal;\n color: #fff;\n font-size: 11px;\n line-height: 1.3;\n}\n\n.request-status {\n /* 状态码标签毛玻璃效果 */\n backdrop-filter: blur(6px);\n -webkit-backdrop-filter: blur(6px);\n padding: 4px 10px;\n border-radius: 10px;\n font-size: 10px;\n font-weight: 600;\n min-width: 40px;\n text-align: center;\n border: 1px solid rgba(255, 255, 255, 0.2);\n box-shadow: \n 0 2px 8px rgba(0, 0, 0, 0.1),\n inset 0 1px 0 rgba(255, 255, 255, 0.25);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.status-2xx { \n background: linear-gradient(135deg, #4CAF50, #45a049);\n color: #ffffff;\n box-shadow: 0 0 20px rgba(76, 175, 80, 0.5);\n}\n.status-3xx { \n background: linear-gradient(135deg, #FF9800, #F57C00);\n color: #ffffff;\n box-shadow: 0 0 20px rgba(255, 152, 0, 0.5);\n}\n.status-4xx { \n background: linear-gradient(135deg, #F44336, #D32F2F);\n color: #ffffff;\n box-shadow: 0 0 20px rgba(244, 67, 54, 0.5);\n}\n.status-5xx { \n background: linear-gradient(135deg, #9C27B0, #7B1FA2);\n color: #ffffff;\n box-shadow: 0 0 20px rgba(156, 39, 176, 0.5);\n}\n.status-error { \n background: linear-gradient(135deg, #F44336, #D32F2F);\n color: #ffffff;\n box-shadow: 0 0 20px rgba(244, 67, 54, 0.5);\n}\n\n.request-info {\n display: flex;\n justify-content: space-between;\n font-size: 10px;\n color: #999;\n}\n\n.request-details {\n margin-top: 12px;\n border-top: 1px solid #444;\n padding-top: 12px;\n display: none;\n}\n\n/* 默认折叠headers */\n.request-details .detail-section.collapsible {\n /* 默认折叠状态 */\n}\n\n.request-details .detail-section.collapsible:not(.expanded) .detail-content {\n display: none;\n}\n\n.request-details .detail-section.collapsible:not(.expanded) .collapse-icon {\n transform: rotate(-90deg);\n}\n\n.request-item.expanded .request-details {\n display: block;\n}\n\n.detail-section {\n margin-bottom: 16px;\n}\n\n.detail-title {\n font-weight: bold;\n color: #4CAF50;\n margin-bottom: 8px;\n font-size: 11px;\n text-transform: uppercase;\n border-bottom: 1px solid #444;\n padding-bottom: 4px;\n}\n\n.detail-title.highlight {\n color: #FFD700;\n font-size: 12px;\n background: rgba(255, 215, 0, 0.1);\n padding: 6px 8px;\n border-radius: 4px;\n border-bottom: 2px solid #FFD700;\n}\n\n.detail-title.clickable {\n cursor: pointer;\n user-select: none;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.detail-title.clickable:hover {\n background: rgba(76, 175, 80, 0.1);\n}\n\n.collapse-icon {\n display: inline-block;\n transition: transform 0.2s;\n font-size: 10px;\n}\n\n.detail-section.collapsible {\n position: relative;\n}\n\n.detail-section.collapsible.collapsed .detail-content {\n display: none;\n}\n\n.detail-section.collapsible.collapsed .collapse-icon {\n transform: rotate(-90deg);\n}\n\n.detail-content {\n /* 详情内容毛玻璃效果 */\n backdrop-filter: blur(8px) brightness(0.9);\n -webkit-backdrop-filter: blur(8px) brightness(0.9);\n background: linear-gradient(\n 135deg,\n rgba(0, 0, 0, 0.3),\n rgba(0, 0, 0, 0.15)\n );\n border: 1px solid rgba(255, 255, 255, 0.08);\n padding: 16px;\n border-radius: 12px;\n max-height: 400px;\n min-height: 300px;\n overflow: auto;\n \n /* 内部阴影 */\n box-shadow: \n inset 0 2px 4px rgba(0, 0, 0, 0.2),\n inset 0 -1px 2px rgba(255, 255, 255, 0.05);\n \n /* 平滑滚动 */\n scroll-behavior: smooth;\n}\n\n.json-content {\n white-space: pre-wrap;\n font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;\n font-size: 11px;\n line-height: 1.4;\n}\n\n.headers-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 10px;\n}\n\n.headers-table th,\n.headers-table td {\n padding: 4px 8px;\n text-align: left;\n border-bottom: 1px solid #444;\n}\n\n.headers-table th {\n background: #333;\n color: #4CAF50;\n font-weight: bold;\n}\n\n.headers-table td {\n color: #ccc;\n}\n\n.decrypted-badge {\n background: #4CAF50;\n color: #000;\n padding: 2px 6px;\n border-radius: 3px;\n font-size: 9px;\n margin-left: 8px;\n font-weight: bold;\n}\n\n.error-badge {\n background: #F44336;\n color: #fff;\n padding: 2px 6px;\n border-radius: 3px;\n font-size: 9px;\n margin-left: 8px;\n font-weight: bold;\n}\n\n.share-btn {\n /* 分享按钮毛玻璃效果 */\n backdrop-filter: blur(6px);\n -webkit-backdrop-filter: blur(6px);\n background: linear-gradient(135deg, #2196F3, #1976D2);\n color: #ffffff;\n border: 1px solid rgba(33, 150, 243, 0.3);\n padding: 6px 12px;\n border-radius: 10px;\n font-size: 10px;\n font-weight: 500;\n margin-left: 8px;\n cursor: pointer;\n white-space: nowrap;\n \n box-shadow: \n 0 2px 8px rgba(33, 150, 243, 0.3),\n inset 0 1px 0 rgba(255, 255, 255, 0.2);\n \n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n transform: translateZ(0);\n}\n\n.share-btn:hover {\n background: linear-gradient(135deg, #1976D2, #1565C0);\n transform: scale(1.05) translateZ(5px);\n box-shadow: \n 0 4px 16px rgba(33, 150, 243, 0.4),\n inset 0 1px 0 rgba(255, 255, 255, 0.3);\n}\n\n.share-btn:active {\n transform: scale(0.98);\n transition: transform 0.1s;\n}\n\n.api-curl-btn {\n /* API Curl 按钮毛玻璃效果 */\n backdrop-filter: blur(6px);\n -webkit-backdrop-filter: blur(6px);\n background: linear-gradient(135deg, #4CAF50, #45a049);\n color: #ffffff;\n border: 1px solid rgba(76, 175, 80, 0.3);\n padding: 6px 12px;\n border-radius: 10px;\n font-size: 10px;\n font-weight: 500;\n margin-left: 8px;\n cursor: pointer;\n white-space: nowrap;\n \n box-shadow: \n 0 2px 8px rgba(76, 175, 80, 0.3),\n inset 0 1px 0 rgba(255, 255, 255, 0.2);\n \n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n transform: translateZ(0);\n}\n\n.api-curl-btn:hover {\n background: linear-gradient(135deg, #45a049, #388E3C);\n transform: scale(1.05) translateZ(5px);\n box-shadow: \n 0 4px 16px rgba(76, 175, 80, 0.4),\n inset 0 1px 0 rgba(255, 255, 255, 0.3);\n}\n\n.api-curl-btn:active {\n transform: scale(0.98);\n transition: transform 0.1s;\n}\n\n.console-content {\n background: #000;\n color: #0f0;\n font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;\n font-size: 11px;\n line-height: 1.4;\n height: 100%;\n overflow: auto;\n padding: 8px;\n}\n\n.console-input {\n display: flex;\n align-items: center;\n background: #333;\n padding: 8px;\n border-top: 1px solid #444;\n}\n\n.console-prompt {\n color: #4CAF50;\n margin-right: 8px;\n font-weight: bold;\n}\n\n.console-cmd {\n flex: 1;\n background: none;\n border: none;\n color: #fff;\n font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;\n font-size: 12px;\n outline: none;\n}\n\n.tools-section {\n padding: 12px;\n background: #2a2a2a;\n border-bottom: 1px solid #444;\n}\n\n.tool-buttons {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.tool-btn {\n padding: 6px 12px;\n background: #4CAF50;\n color: #000;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n font-size: 11px;\n font-weight: bold;\n transition: background-color 0.2s;\n}\n\n.tool-btn:hover {\n background: #45a049;\n}\n\n.tool-btn:disabled {\n background: #666;\n color: #999;\n cursor: not-allowed;\n}\n\n/* 动态光效动画 - 模拟 Shader 效果 */\n@keyframes liquid-shimmer {\n 0% {\n background-position: -300% center;\n transform: translateX(-10px);\n }\n 50% {\n transform: translateX(0);\n }\n 100% {\n background-position: 300% center;\n transform: translateX(10px);\n }\n}\n\n@keyframes liquid-refraction {\n 0%, 100% {\n transform: scale(1) perspective(1000px) rotateY(0deg);\n filter: blur(0px);\n }\n 25% {\n transform: scale(1.01) perspective(1000px) rotateY(0.5deg);\n filter: blur(0.5px);\n }\n 75% {\n transform: scale(0.99) perspective(1000px) rotateY(-0.5deg);\n filter: blur(0.3px);\n }\n}\n\n@keyframes liquid-expand {\n 0% { \n opacity: 0;\n transform: scale(0.95) translateY(-10px);\n backdrop-filter: blur(5px);\n }\n 50% { \n opacity: 0.7;\n transform: scale(1.02) translateY(-2px);\n backdrop-filter: blur(12px);\n }\n 100% { \n opacity: 1;\n transform: scale(1) translateY(0);\n backdrop-filter: blur(8px);\n }\n}\n\n@keyframes liquid-glow {\n 0%, 100% { \n box-shadow: 0 0 20px rgba(66, 184, 131, 0.3);\n }\n 50% { \n box-shadow: 0 0 30px rgba(66, 184, 131, 0.5);\n }\n}\n\n.expanding {\n animation: liquid-expand 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.request-item.expanded {\n animation: liquid-glow 2s ease-in-out infinite;\n}\n\n/* 移动端响应式 */\n@media (max-width: 768px) {\n #network-debugger-panel.bottom-right,\n #network-debugger-panel.bottom-left,\n #network-debugger-panel.top-right,\n #network-debugger-panel.top-left {\n width: calc(100vw - 20px) !important;\n left: 10px !important;\n right: auto !important;\n /* 移动端清晰毛玻璃 */\n backdrop-filter: blur(15px) saturate(150%);\n -webkit-backdrop-filter: blur(15px) saturate(150%);\n }\n \n .request-item {\n padding: 12px;\n border-radius: 12px;\n }\n \n .debugger-header {\n padding: 10px 12px;\n }\n \n .debugger-controls {\n gap: 6px;\n }\n \n .debugger-btn {\n padding: 4px 8px;\n font-size: 10px;\n }\n \n /* 最小化时不应用全宽,保持小尺寸 */\n #network-debugger-panel.minimized {\n width: 180px !important;\n max-width: 180px !important;\n height: 40px !important;\n }\n}\n\n@media (max-width: 480px) {\n .request-header {\n flex-direction: column;\n gap: 8px;\n align-items: stretch;\n }\n \n .request-method,\n .request-status {\n align-self: flex-start;\n }\n \n .share-btn,\n .api-curl-btn {\n margin-left: 0;\n margin-top: 4px;\n }\n}\n\n/* iOS 26 风格滚动条 */\n#network-debugger-panel ::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n\n#network-debugger-panel ::-webkit-scrollbar-track {\n background: rgba(255, 255, 255, 0.05);\n border-radius: 4px;\n backdrop-filter: blur(5px);\n}\n\n#network-debugger-panel ::-webkit-scrollbar-thumb {\n background: linear-gradient(\n 135deg,\n rgba(255, 255, 255, 0.2),\n rgba(255, 255, 255, 0.1)\n );\n border-radius: 4px;\n border: 1px solid rgba(255, 255, 255, 0.1);\n backdrop-filter: blur(10px);\n transition: all 0.3s ease;\n}\n\n#network-debugger-panel ::-webkit-scrollbar-thumb:hover {\n background: linear-gradient(\n 135deg,\n rgba(255, 255, 255, 0.3),\n rgba(255, 255, 255, 0.15)\n );\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);\n}\n\n.resize-handle {\n position: absolute;\n background: transparent;\n}\n\n.resize-handle.n {\n top: -3px;\n left: 0;\n right: 0;\n height: 6px;\n cursor: ns-resize;\n}\n\n.resize-handle.s {\n bottom: -3px;\n left: 0;\n right: 0;\n height: 6px;\n cursor: ns-resize;\n}\n\n.resize-handle.e {\n top: 0;\n right: -3px;\n bottom: 0;\n width: 6px;\n cursor: ew-resize;\n}\n\n.resize-handle.w {\n top: 0;\n left: -3px;\n bottom: 0;\n width: 6px;\n cursor: ew-resize;\n}\n\n.resize-handle.ne {\n top: -3px;\n right: -3px;\n width: 12px;\n height: 12px;\n cursor: ne-resize;\n}\n\n.resize-handle.nw {\n top: -3px;\n left: -3px;\n width: 12px;\n height: 12px;\n cursor: nw-resize;\n}\n\n.resize-handle.se {\n bottom: -3px;\n right: -3px;\n width: 12px;\n height: 12px;\n cursor: se-resize;\n}\n\n.resize-handle.sw {\n bottom: -3px;\n left: -3px;\n width: 12px;\n height: 12px;\n cursor: sw-resize;\n}\n\n.debugger-reopen-btn {\n position: fixed;\n z-index: 999999;\n background: #4CAF50;\n color: #000;\n border: none;\n padding: 8px 10px;\n border-radius: 16px;\n font-weight: bold;\n font-size: 12px;\n box-shadow: 0 4px 12px rgba(0,0,0,0.25);\n cursor: pointer;\n}\n\n.debugger-reopen-btn:hover {\n filter: brightness(0.95);\n}\n";this.shadowRoot.appendChild(e);this.container=document.createElement("div");this.container.id="network-debugger-panel";this.container.className=`${this.config.position} ${this.config.minimized?"minimized":""}`;this.container.style.pointerEvents="auto";this.container.innerHTML='\n <div class="debugger-header">\n <div class="debugger-title">🔓 PWTK 解密小工具 <span style="font-size: 10px; opacity: 0.7;">by Leo</span></div>\n <div class="debugger-controls">\n <button class="debugger-btn" data-action="clear" title="清空"><svg class="debugger-icon" viewBox="0 0 24 24"><path fill="currentColor" d="M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"/></svg></button>\n <button class="debugger-btn" data-action="export" title="导出"><svg class="debugger-icon" viewBox="0 0 24 24"><path fill="currentColor" d="M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"/></svg></button>\n <button class="debugger-btn" data-action="fullscreen" title="全屏"><svg class="debugger-icon" viewBox="0 0 24 24"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"/></svg></button>\n <button class="debugger-btn" data-action="close" title="关闭"><svg class="debugger-icon" viewBox="0 0 24 24"><path fill="currentColor" d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg></button>\n </div>\n </div>\n <div class="debugger-content">\n <div class="debugger-panel-content">\n <div class="network-panel">\n <div class="request-list"></div>\n </div>\n </div>\n </div>\n ';this.addResizeHandles();this.shadowRoot.appendChild(this.container);document.body.appendChild(this.hostElement);this.networkTab=this.shadowRoot.querySelector(".network-panel")}addResizeHandles(){["n","s","e","w","ne","nw","se","sw"].forEach(e=>{const t=document.createElement("div");t.className=`resize-handle ${e}`;t.dataset.direction=e;this.container.appendChild(t)})}bindEvents(){const e=this.shadowRoot.querySelector(".debugger-header"),t=this.shadowRoot.querySelector(".debugger-controls");e.addEventListener("mousedown",e=>{if(e.target!==t&&!t.contains(e.target))this.startDrag(e)});t.addEventListener("click",e=>{e.stopPropagation();let n=e.target;for(;n&&n!==t&&!n.dataset?.action;)n=n.parentElement;const r=n?.dataset?.action;if(r)switch(r){case"clear":this.clearRequests();break;case"export":this.exportData();break;case"fullscreen":this.toggleFullscreen();break;case"close":this.hide()}});this.shadowRoot.querySelectorAll(".resize-handle").forEach(e=>{e.addEventListener("mousedown",t=>{t.stopPropagation();const n=e.dataset.direction||e.classList[1]||"se";this.startResize(t,n)})});document.addEventListener("mousemove",this.handleMouseMove.bind(this));document.addEventListener("mouseup",this.handleMouseUp.bind(this));window.addEventListener("resize",this.handleWindowResize.bind(this))}startListening(){this.interceptor.addListener(e=>{this.addRequestToUI(e)});this.requestsCache=this.interceptor.getRequests();this.renderRequests()}addRequestToUI(e){Fe.debug("[PWTK UI] Adding/updating request:",{id:e.id,url:e.url,hasResponse:!!e.responseBody,hasDecryptedRequest:!!e.decryptedRequest,hasDecryptedResponse:!!e.decryptedResponse,status:e.status});const t=this.requestsCache.findIndex(t=>t.id===e.id);if(t>=0)this.requestsCache[t]=e;else this.requestsCache.unshift(e);if(this.requestsCache.length>100)this.requestsCache=this.requestsCache.slice(0,100);this.renderRequests()}renderRequests(){const e=this.shadowRoot.querySelector(".request-list");if(e){e.innerHTML="";this.requestsCache.forEach(t=>{const n=this.createRequestItem(t);e.appendChild(n)})}}createRequestItem(e){const t=document.createElement("div");t.className="request-item";t.dataset.requestId=e.id;const n=this.getStatusClass(e.status),r=`method-${e.method.toLowerCase()}`;e.decryptedRequest||e.decryptedResponse;const i=e.error;t.innerHTML=`\n <div class="request-header">\n <span class="request-method ${r}">${e.method}</span>\n <span class="request-url" title="${e.url}">${this.truncateUrl(e.url)}</span>\n <span class="request-status ${n}">${e.status?e.status:void 0!==e.duration?"ERR":"Pending"}</span>\n ${i?'<span class="error-badge">⚠️</span>':""}\n <button class="share-btn" title="分享此请求 (by Leo)" onclick="event.stopPropagation()">分享链接</button>\n <button class="api-curl-btn" title="生成API请求 (by Leo)" onclick="event.stopPropagation()">API Curl</button>\n </div>\n <div class="request-info">\n <span>${new Date(e.timestamp).toLocaleTimeString()}</span>\n <span>${e.duration?`${e.duration}ms`:"Pending"}</span>\n </div>\n <div class="request-details">\n ${this.renderRequestDetails(e)}\n </div>\n `;t.addEventListener("click",e=>{const n=e.target;if(!(n.closest(".share-btn")||n.closest(".api-curl-btn")||n.closest('.detail-title[data-toggle="collapse"]')))t.classList.toggle("expanded")});const o=t.querySelector(".share-btn");if(o)o.addEventListener("click",async t=>{t.stopPropagation();await this.shareRequest(e)});const s=t.querySelector(".api-curl-btn");if(s)s.addEventListener("click",async t=>{t.stopPropagation();await this.generateApiCurl(e)});t.addEventListener("click",e=>{const t=e.target;if(t.closest('.detail-title[data-toggle="collapse"]')){e.stopPropagation();const n=t.closest(".detail-title").parentElement;if(n&&n.classList.contains("collapsible"))n.classList.toggle("collapsed")}},{capture:!0});return t}renderRequestDetails(e){let t="";e.id.replace(/[^a-zA-Z0-9]/g,"");if(e.decryptedRequest)t+=`\n <div class="detail-section">\n <div class="detail-title highlight">解密请求数据</div>\n <div class="detail-content">\n <div class="json-content">${this.formatData(e.decryptedRequest)}</div>\n </div>\n </div>\n `;if(e.decryptedResponse)t+=`\n <div class="detail-section">\n <div class="detail-title highlight">解密响应数据</div>\n <div class="detail-content">\n <div class="json-content">${this.formatData(e.decryptedResponse)}</div>\n </div>\n </div>\n `;if(Object.keys(e.headers).length>0)t+=`\n <div class="detail-section collapsible collapsed">\n <div class="detail-title clickable" data-toggle="collapse">\n <span class="collapse-icon">▼</span> 请求头 (${Object.keys(e.headers).length})\n </div>\n <div class="detail-content">\n <table class="headers-table">\n ${Object.entries(e.headers).map(([e,t])=>`<tr><td>${e}</td><td>${t}</td></tr>`).join("")}\n </table>\n </div>\n </div>\n `;if(e.responseHeaders&&Object.keys(e.responseHeaders).length>0)t+=`\n <div class="detail-section collapsible collapsed">\n <div class="detail-title clickable" data-toggle="collapse">\n <span class="collapse-icon">▼</span> 响应头 (${Object.keys(e.responseHeaders).length})\n </div>\n <div class="detail-content">\n <table class="headers-table">\n ${Object.entries(e.responseHeaders).map(([e,t])=>`<tr><td>${e}</td><td>${t}</td></tr>`).join("")}\n </table>\n </div>\n </div>\n `;if(e.requestBody)t+=`\n <div class="detail-section">\n <div class="detail-title">${e.decryptedRequest?"原始请求数据":"请求数据"}</div>\n <div class="detail-content">\n <div class="json-content">${this.formatData(e.requestBody)}</div>\n </div>\n </div>\n `;if(e.responseBody)t+=`\n <div class="detail-section">\n <div class="detail-title">${e.decryptedResponse?"原始响应数据":"响应数据"}</div>\n <div class="detail-content">\n <div class="json-content">${this.formatData(e.responseBody)}</div>\n </div>\n </div>\n `;if(e.error)t+=`\n <div class="detail-section">\n <div class="detail-title">错误信息</div>\n <div class="detail-content">\n <div class="json-content" style="color: #f44336;">${e.error}</div>\n </div>\n </div>\n `;return t}formatData(e){if("string"==typeof e)try{return Ie(JSON.parse(e))}catch{return e}return Ie(e)}getStatusClass(e){if(!e)return"status-error";if(e>=200&&e<300)return"status-2xx";if(e>=300&&e<400)return"status-3xx";if(e>=400&&e<500)return"status-4xx";if(e>=500)return"status-5xx";else return"status-error"}truncateUrl(e){const t=e.indexOf("?");if(t>-1)return e.substring(0,t);else return e}clearRequests(){this.requestsCache=[];this.interceptor.clearRequests();this.renderRequests()}exportData(){const e={timestamp:(new Date).toISOString(),requests:this.requestsCache,userAgent:navigator.userAgent,url:window.location.href,creator:"PWTK Network Debugger by Leo (@leeguoo)"},t=new Blob([JSON.stringify(e,null,2)],{type:"application/json"}),n=URL.createObjectURL(t),r=document.createElement("a");r.href=n;r.download=`network-debug-${Date.now()}.json`;r.click();URL.revokeObjectURL(n)}async shareRequest(e){try{const t=await $e(e);if(t){if(await je(t))alert(`分享链接已复制到剪贴板!\n${t}\n\nCreated by Leo (@leeguoo)`);else prompt("分享链接已创建,请手动复制:\n\nCreated by Leo (@leeguoo)",t)}else throw new Error("无法创建分享链接")}catch(t){Fe.error("分享失败:",t);alert("分享失败,请稍后重试")}}async generateApiCurl(e){try{const t=function(e){let t="https://api.httpmisonote.com";try{const n=new URL(e.url);if(n.pathname&&"/"!==n.pathname){let e=n.pathname;const r=e.indexOf("/api/");if(-1!==r)e=e.substring(r);else if(e.includes("/api")){const t=e.indexOf("/api");e=e.substring(t)}t+=e}}catch(i){console.warn("Unable to parse original URL:",e.url)}const n=e.decryptedRequest||e.requestBody;if("GET"===e.method&&n)try{let e={};if("string"==typeof n)e=JSON.parse(n);else e=n;const r=new URLSearchParams;Object.entries(e).forEach(([e,t])=>{r.append(e,String(t))});if(r.toString())t+="?"+r.toString()}catch(i){if("string"==typeof n&&n.trim())t+="?"+n}let r=`curl --location '${t}'`;if("GET"!==e.method)r+=` --request ${e.method}`;if(e.headers){const t=["cookie","set-cookie","session","sessionid","x-session"];Object.entries(e.headers).forEach(([e,n])=>{if(!t.some(t=>e.toLowerCase().includes(t.toLowerCase())))r+=` --header '${e}: ${n}'`})}if(!e.headers||!Object.keys(e.headers).some(e=>e.toLowerCase().includes("authorization")||e.toLowerCase().includes("auth")))r+=" --header 'X-API-Key: test-api-key-123'";if("GET"!==e.method&&n){const e="string"==typeof n?n:JSON.stringify(n);r+=` --data '${e}'`}return r}(e);if(await je(t))alert("API cURL命令已复制到剪贴板!\n适用于 httpmisonote.com API\n\nCreated by Leo (@leeguoo)");else prompt("API cURL命令已生成,请手动复制:\n\nCreated by Leo (@leeguoo)",t)}catch(t){Fe.error("生成API cURL失败:",t);alert("生成API cURL失败,请稍后重试")}}toggleFullscreen(){if(this.container.classList.contains("fullscreen")){this.container.classList.remove("fullscreen");this.container.style.top="";this.container.style.left="";this.container.style.width="";this.container.style.height="";this.loadPosition()}else{this.container.classList.add("fullscreen");this.container.style.top="0";this.container.style.left="0";this.container.style.width="100vw";this.container.style.height="100vh";this.container.style.right="auto";this.container.style.bottom="auto"}}startDrag(e){this.isDragging=!0;this.dragStart={x:e.clientX,y:e.clientY};this.container.style.transition="none"}startResize(e,t){this.isResizing=!0;this.resizeDirection=t;this.dragStart={x:e.clientX,y:e.clientY};this.container.style.transition="none"}handleMouseMove(e){if(this.isDragging){const t=e.clientX-this.dragStart.x,n=e.clientY-this.dragStart.y,r=this.container.getBoundingClientRect();this.container.style.left=`${r.left+t}px`;this.container.style.top=`${r.top+n}px`;this.dragStart={x:e.clientX,y:e.clientY}}if(this.isResizing){const t=this.resizeDirection;if(!t)return;const n=e.clientX-this.dragStart.x,r=e.clientY-this.dragStart.y,i=this.container.getBoundingClientRect(),o=300,s=200;let a=i.width,c=i.height,l=i.left,d=i.top;if(t.includes("e")){a=Math.max(o,i.width+n);this.container.style.width=`${a}px`}if(t.includes("s")){c=Math.max(s,i.height+r);this.container.style.height=`${c}px`}if(t.includes("w")){a=Math.max(o,i.width-n);if(a>o){l=i.left+n;this.container.style.width=`${a}px`;this.container.style.left=`${l}px`}}if(t.includes("n")){c=Math.max(s,i.height-r);if(c>s){d=i.top+r;this.container.style.height=`${c}px`;this.container.style.top=`${d}px`}}this.dragStart={x:e.clientX,y:e.clientY}}}handleMouseUp(){if(this.isDragging||this.isResizing){this.container.style.transition="all 0.3s ease";if(this.isDragging)this.savePosition()}this.isDragging=!1;this.isResizing=!1;this.resizeDirection=""}handleWindowResize(){if(this.resizeTimeout)clearTimeout(this.resizeTimeout);this.resizeTimeout=window.setTimeout(()=>{this.adjustPositionForWindowResize()},100)}adjustPositionForWindowResize(){const e=this.container.getBoundingClientRect(),t=window.innerWidth,n=window.innerHeight;let r=!1,i=e.left,o=e.top,s=e.width,a=e.height;if(e.right>t){i=t-e.width;r=!0}if(e.bottom>n){o=n-e.height;r=!0}if(i<0){i=0;r=!0}if(o<0){o=0;r=!0}if(e.width>t){s=t-20;i=10;r=!0}if(e.height>n){a=n-20;o=10;r=!0}if(r){this.container.style.left=`${i}px`;this.container.style.top=`${o}px`;this.container.style.right="auto";this.container.style.bottom="auto";if(e.width>t||e.height>n){this.container.style.width=`${s}px`;this.container.style.height=`${a}px`}this.savePosition()}}show(){this.hostElement.style.display="block";this.config.isClosed=!1;this.saveConfig();this.removeReopenButton()}hide(){this.hostElement.style.display="none";this.config.isClosed=!0;this.saveConfig();this.createReopenButton()}createReopenButton(){if(document.getElementById("network-debugger-reopen-btn"))return;const e=document.createElement("button");e.id="network-debugger-reopen-btn";e.title="打开调试面板 (可拖动)";e.textContent="PWTK";e.style.cssText="\n position: fixed;\n z-index: 999999;\n background: #4CAF50;\n color: #000;\n border: none;\n padding: 8px 10px;\n border-radius: 16px;\n font-weight: bold;\n font-size: 12px;\n box-shadow: 0 4px 12px rgba(0,0,0,0.25);\n cursor: pointer;\n transition: filter 0.2s;\n ";const t=this.config.position||"bottom-right";if(t.includes("bottom"))e.style.bottom="20px";else e.style.top="20px";if(t.includes("right"))e.style.right="20px";else e.style.left="20px";let n=!1,r={x:0,y:0},i=null;e.addEventListener("mousedown",t=>{if(0===t.button){n=!1;r={x:t.clientX,y:t.clientY};e.style.transition="none";i=window.setTimeout(()=>{n=!0;e.style.cursor="grabbing"},150);document.addEventListener("mousemove",o);document.addEventListener("mouseup",s);t.preventDefault()}});const o=t=>{if(!n)return;const i=t.clientX-r.x,o=t.clientY-r.y,s=e.getBoundingClientRect(),a=s.left+i,c=s.top+o,l=window.innerWidth-s.width,d=window.innerHeight-s.height,p=Math.max(0,Math.min(l,a)),u=Math.max(0,Math.min(d,c));e.style.position="fixed";e.style.left=`${p}px`;e.style.top=`${u}px`;e.style.right="auto";e.style.bottom="auto";r={x:t.clientX,y:t.clientY}},s=()=>{if(i){clearTimeout(i);i=null}if(n){n=!1;e.style.cursor="pointer";e.style.transition="filter 0.2s"}else this.show();document.removeEventListener("mousemove",o);document.removeEventListener("mouseup",s)};e.addEventListener("mouseenter",()=>{e.style.filter="brightness(0.95)"});e.addEventListener("mouseleave",()=>{e.style.filter="brightness(1)"});document.body.appendChild(e)}removeReopenButton(){const e=document.getElementById("network-debugger-reopen-btn");if(e)e.remove()}destroy(){this.hostElement.remove();this.removeReopenButton()}loadConfig(){try{const t=localStorage.getItem(e.STORAGE_KEY);if(t){const e=JSON.parse(t);Fe.debug("加载保存的配置:",e);return e}}catch(t){Fe.error("加载配置失败:",t)}return{}}saveConfig(){try{const t={position:this.config.position,theme:this.config.theme,minimized:this.config.minimized,isClosed:this.config.isClosed};localStorage.setItem(e.STORAGE_KEY,JSON.stringify(t));Fe.debug("配置已保存:",t)}catch(t){Fe.error("保存配置失败:",t)}}loadPosition(){try{const t=`${e.STORAGE_KEY}-position`,n=localStorage.getItem(t);if(n){const e=JSON.parse(n);if(void 0!==e.left)this.container.style.left=e.left+"px";if(void 0!==e.top)this.container.style.top=e.top+"px";if(void 0!==e.right)this.container.style.right=e.right+"px";if(void 0!==e.bottom)this.container.style.bottom=e.bottom+"px";Fe.debug("加载保存的位置:",e)}}catch(t){Fe.error("加载位置失败:",t)}}savePosition(){try{const t=`${e.STORAGE_KEY}-position`,n=this.container.getBoundingClientRect(),r={left:n.left,top:n.top,right:window.innerWidth-n.right,bottom:window.innerHeight-n.bottom};localStorage.setItem(t,JSON.stringify(r));Fe.debug("位置已保存:",r)}catch(t){Fe.error("保存位置失败:",t)}}};Xe.STORAGE_KEY="pwtk-debugger-config";let Je=Xe;class Ge{constructor(){this.interceptor=null;this.panel=null;this.wasmLoader=null;this.config={};this.initialized=!1}async init(e={}){if(!this.initialized){this.config={autoStart:!0,position:"bottom-right",theme:"dark",minimized:!1,showConsole:!0,wasm:{enabled:!0,...e.wasm},decrypt:{enabled:!0,autoFetchKeys:!0,keyApiUrl:"https://gw-card-pay.buyacard.cc/ip/getSK",...e.decrypt},log:{toBrowserConsole:!1,level:"info",...e.log},...e};Fe.configure({enableBrowserConsole:this.config.log?.toBrowserConsole||!1,logLevel:this.config.log?.level||"info"});try{if(!1!==this.config.wasm?.enabled){Fe.info("[PWTK Init] Starting WASM initialization");this.wasmLoader=new Ne;if(await this.wasmLoader.loadWasm(this.config.wasm?.wasmUrl,this.config.wasm?.jsUrl))Fe.info("[PWTK Init] ✅ WASM decrypt function ready");else Fe.warn("[PWTK Init] ⚠️ WASM load failed or decrypt function unavailable, will rely on page-provided decryption")}else Fe.info("[PWTK Init] WASM disabled in config");this.interceptor=new Ue;if(this.config.decrypt?.enabled)this.interceptor.enableDecryption({keyExtractor:this.config.decrypt.keyExtractor||this.defaultKeyExtractor,slkExtractor:this.config.decrypt.slkExtractor||this.defaultSlkExtractor,autoFetchKeys:this.config.decrypt.autoFetchKeys,keyApiUrl:this.config.decrypt.keyApiUrl});if(!1!==this.config.autoStart)this.createPanel();this.initialized=!0;Fe.consoleDirect("\n╔════════════════════════════════════════╗\n║ 🔓 PWTK 解密小工具 v1.2.49-beta.1 ║\n║ Created by Leo (@leeguoo) ║\n║ 技术支持: 请联系 Leo ║ \n║ 分享服务: curl.bwg.leeguoo.com ║\n╚════════════════════════════════════════╝\n ");Fe.info("🔍 NetworkDebugger initialized successfully")}catch(t){Fe.error("NetworkDebugger initialization failed:",t);throw t}}else Fe.warn("NetworkDebugger already initialized")}show(){if(this.initialized)if(!this.panel)this.createPanel();else this.panel.show();else Fe.error("NetworkDebugger not initialized. Call init() first.")}hide(){if(this.panel)this.panel.hide()}destroy(){if(this.panel){this.panel.destroy();this.panel=null}this.initialized=!1;Fe.info("NetworkDebugger destroyed")}getRequests(){return this.interceptor?.getRequests()||[]}clearRequests(){this.interceptor?.clearRequests()}exportData(){return{timestamp:(new Date).toISOString(),requests:this.getRequests(),config:this.config,userAgent:navigator.userAgent,url:window.location.href,author:"Leo (@leeguoo)",tool:"@leeguoo/network-debugger"}}isWasmLoaded(){return this.wasmLoader?.isLoaded()||!1}isInitialized(){return this.initialized}async checkForUpdates(){try{const e="1.2.49-beta.1";Fe.info(`[PWTK Update] Checking for updates... Current version: ${e}`);const t=await fetch("https://registry.npmjs.org/@leeguoo/pwtk-network-debugger/latest"),n=(await t.json()).version,r=this.compareVersions(e,n)<0;if(r)Fe.info(`[PWTK Update] ✅ New version available: ${n} (current: ${e})`);else Fe.info(`[PWTK Update] ✅ Already using latest version: ${e}`);return{hasUpdate:r,latestVersion:r?n:void 0,currentVersion:e}}catch(e){Fe.error("[PWTK Update] Failed to check for updates:",e);return{hasUpdate:!1,currentVersion:"1.2.49-beta.1"}}}async autoUpdate(e=!1){try{const t=await this.checkForUpdates();if(!t.hasUpdate){Fe.info("[PWTK Update] Already using latest version");return!1}Fe.info(`[PWTK Update] Auto-updating to version ${t.latestVersion}...`);const n={...this.config};this.destroy();if(Ye===this){Ye=null;if("undefined"!=typeof window)delete window.NetworkDebugger}if(e){Fe.info("[PWTK Update] Reloading page to apply update...");window.location.reload();return!0}const r=document.createElement("script");r.src=`https://unpkg.com/@leeguoo/pwtk-network-debugger@${t.latestVersion}/dist/index.js`;return new Promise((e,i)=>{r.onload=async()=>{try{Fe.info("[PWTK Update] ✅ Script loaded, reinitializing with previous config...");setTimeout(async()=>{try{if(window.NetworkDebugger&&window.NetworkDebugger.init){await window.NetworkDebugger.init(n);Fe.info(`[PWTK Update] ✅ Successfully updated to version ${t.latestVersion}`);e(!0)}else throw new Error("New version not properly loaded")}catch(r){Fe.error("[PWTK Update] ❌ Failed to initialize new version:",r);i(r)}},100)}catch(r){i(r)}};r.onerror=()=>{Fe.error("[PWTK Update] ❌ Failed to load updated version");i(new Error("Failed to load updated version"))};document.head.appendChild(r)})}catch(t){Fe.error("[PWTK Update] Auto-update failed:",t);return!1}}compareVersions(e,t){const n=e.split(".").map(Number),r=t.split(".").map(Number),i=Math.max(n.length,r.length);for(let o=0;o<i;o++){const e=n[o]||0,t=r[o]||0;if(e<t)return-1;if(e>t)return 1}return 0}static create(e){const t=new Ge;return t.init(e).then(()=>t)}createPanel(){if(this.interceptor)this.panel=new Je(this.interceptor,{position:this.config.position,theme:this.config.theme,minimized:this.config.minimized,showConsole:this.config.showConsole});else Fe.error("Cannot create panel: interceptor not initialized")}defaultKeyExtractor(e){return e.keys||e.cid||e["x-api-key"]||""}defaultSlkExtractor(e){return e.slk||e["x-slk"]||""}}let Ye=null;const Ve={async init(e){if(Ye){Fe.warn("NetworkDebugger already has a global instance");return Ye}Ye=await Ge.create(e);if("undefined"!=typeof window)window.NetworkDebugger=Ye;return Ye},show(){Ye?.show()},hide(){Ye?.hide()},destroy(){Ye?.destroy();Ye=null;if("undefined"!=typeof window)delete window.NetworkDebugger},getInstance:()=>Ye,checkForUpdates:async()=>Ye?.checkForUpdates()||{hasUpdate:!1,currentVersion:"unknown"},autoUpdate:async(e=!1)=>Ye?.autoUpdate(e)||!1};if("undefined"!=typeof window){window.NetworkDebugger=Ve;if(!window.NetworkDebugger.default)window.NetworkDebugger.default=Ve}e.DebugPanel=Je;e.NetworkDebugger=Ge;e.NetworkInterceptor=Ue;e.WasmLoader=Ne;e.default=Ve;Object.defineProperties(e,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
|
|
18
|
+
!function(){var t=e,n=t.lib,r=n.WordArray,i=n.Hasher,o=t.algo,s=r.create([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,7,4,13,1,10,6,15,3,12,0,9,5,2,14,11,8,3,10,14,4,9,15,8,1,2,7,0,6,13,11,5,12,1,9,11,10,0,8,12,4,13,3,7,15,14,5,6,2,4,0,5,9,7,12,2,10,14,1,3,8,11,6,15,13]),a=r.create([5,14,7,0,9,2,11,4,13,6,15,8,1,10,3,12,6,11,3,7,0,13,5,10,14,15,8,12,4,9,1,2,15,5,1,3,7,14,6,9,11,8,12,2,10,0,4,13,8,6,4,1,3,11,15,0,5,12,2,13,9,7,10,14,12,15,10,4,1,5,8,7,6,2,13,14,0,3,9,11]),c=r.create([11,14,15,12,5,8,7,9,11,13,14,15,6,7,9,8,7,6,8,13,11,9,7,15,7,12,15,9,11,7,13,12,11,13,6,7,14,9,13,15,14,8,13,6,5,12,7,5,11,12,14,15,14,15,9,8,9,14,5,6,8,6,5,12,9,15,5,11,6,8,13,12,5,12,13,14,11,8,5,6]),l=r.create([8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6,9,13,15,7,12,8,9,11,7,7,12,7,6,15,13,11,9,7,15,11,8,6,6,14,12,13,5,14,13,13,7,5,15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8,8,5,12,9,12,5,14,6,8,13,6,5,15,13,11,11]),d=r.create([0,1518500249,1859775393,2400959708,2840853838]),p=r.create([1352829926,1548603684,1836072691,2053994217,0]),u=o.RIPEMD160=i.extend({_doReset:function(){this._hash=r.create([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(e,t){for(var n=0;n<16;n++){var r=t+n,i=e[r];e[r]=16711935&(i<<8|i>>>24)|4278255360&(i<<24|i>>>8)}var o,u,w,v,m,k,_,S,B,D,z,C=this._hash.words,A=d.words,R=p.words,P=s.words,E=a.words,W=c.words,T=l.words;k=o=C[0];_=u=C[1];S=w=C[2];B=v=C[3];D=m=C[4];for(n=0;n<80;n+=1){z=o+e[t+P[n]]|0;if(n<16)z+=h(u,w,v)+A[0];else if(n<32)z+=f(u,w,v)+A[1];else if(n<48)z+=g(u,w,v)+A[2];else if(n<64)z+=b(u,w,v)+A[3];else z+=y(u,w,v)+A[4];z=(z=x(z|=0,W[n]))+m|0;o=m;m=v;v=x(w,10);w=u;u=z;z=k+e[t+E[n]]|0;if(n<16)z+=y(_,S,B)+R[0];else if(n<32)z+=b(_,S,B)+R[1];else if(n<48)z+=g(_,S,B)+R[2];else if(n<64)z+=f(_,S,B)+R[3];else z+=h(_,S,B)+R[4];z=(z=x(z|=0,T[n]))+D|0;k=D;D=B;B=x(S,10);S=_;_=z}z=C[1]+w+B|0;C[1]=C[2]+v+D|0;C[2]=C[3]+m+k|0;C[3]=C[4]+o+_|0;C[4]=C[0]+u+S|0;C[0]=z},_doFinalize:function(){var e=this._data,t=e.words,n=8*this._nDataBytes,r=8*e.sigBytes;t[r>>>5]|=128<<24-r%32;t[14+(r+64>>>9<<4)]=16711935&(n<<8|n>>>24)|4278255360&(n<<24|n>>>8);e.sigBytes=4*(t.length+1);this._process();for(var i=this._hash,o=i.words,s=0;s<5;s++){var a=o[s];o[s]=16711935&(a<<8|a>>>24)|4278255360&(a<<24|a>>>8)}return i},clone:function(){var e=i.clone.call(this);e._hash=this._hash.clone();return e}});function h(e,t,n){return e^t^n}function f(e,t,n){return e&t|~e&n}function g(e,t,n){return(e|~t)^n}function b(e,t,n){return e&n|t&~n}function y(e,t,n){return e^(t|~n)}function x(e,t){return e<<t|e>>>32-t}t.RIPEMD160=i._createHelper(u);t.HmacRIPEMD160=i._createHmacHelper(u)}();return e.RIPEMD160}(c())}(),X(),function(){if(J)return G.exports;J=1;G.exports=function(e){r=(n=(t=e).lib).Base,i=n.WordArray,s=(o=t.algo).SHA256,a=o.HMAC,c=o.PBKDF2=r.extend({cfg:r.extend({keySize:4,hasher:s,iterations:25e4}),init:function(e){this.cfg=this.cfg.extend(e)},compute:function(e,t){for(var n=this.cfg,r=a.create(n.hasher,e),o=i.create(),s=i.create([1]),c=o.words,l=s.words,d=n.keySize,p=n.iterations;c.length<d;){var u=r.update(t).finalize(s);r.reset();for(var h=u.words,f=h.length,g=u,b=1;b<p;b++){g=r.finalize(g);r.reset();for(var y=g.words,x=0;x<f;x++)h[x]^=y[x]}o.concat(u);l[0]++}o.sigBytes=4*d;return o}}),t.PBKDF2=function(e,t,n){return c.create(n).compute(e,t)};var t,n,r,i,o,s,a,c;return e.PBKDF2}(c(),E(),X())}(),Z(),te(),function(){if(ne)return re.exports;ne=1;re.exports=function(e){e.mode.CFB=function(){var t=e.lib.BlockCipherMode.extend();t.Encryptor=t.extend({processBlock:function(e,t){var r=this._cipher,i=r.blockSize;n.call(this,e,t,i,r);this._prevBlock=e.slice(t,t+i)}});t.Decryptor=t.extend({processBlock:function(e,t){var r=this._cipher,i=r.blockSize,o=e.slice(t,t+i);n.call(this,e,t,i,r);this._prevBlock=o}});function n(e,t,n,r){var i,o=this._iv;if(o){i=o.slice(0);this._iv=void 0}else i=this._prevBlock;r.encryptBlock(i,0);for(var s=0;s<n;s++)e[t+s]^=i[s]}return t}();return e.mode.CFB}(c(),te())}(),function(){if(ie)return oe.exports;ie=1;oe.exports=function(e){e.mode.CTR=function(){var t=e.lib.BlockCipherMode.extend(),n=t.Encryptor=t.extend({processBlock:function(e,t){var n=this._cipher,r=n.blockSize,i=this._iv,o=this._counter;if(i){o=this._counter=i.slice(0);this._iv=void 0}var s=o.slice(0);n.encryptBlock(s,0);o[r-1]=o[r-1]+1|0;for(var a=0;a<r;a++)e[t+a]^=s[a]}});t.Decryptor=n;return t}();return e.mode.CTR}(c(),te())}(),ce(),function(){if(le)return de.exports;le=1;de.exports=function(e){e.mode.OFB=function(){var t=e.lib.BlockCipherMode.extend(),n=t.Encryptor=t.extend({processBlock:function(e,t){var n=this._cipher,r=n.blockSize,i=this._iv,o=this._keystream;if(i){o=this._keystream=i.slice(0);this._iv=void 0}n.encryptBlock(o,0);for(var s=0;s<r;s++)e[t+s]^=o[s]}});t.Decryptor=n;return t}();return e.mode.OFB}(c(),te())}(),function(){if(pe)return ue.exports;pe=1;ue.exports=function(e){e.mode.ECB=function(){var t=e.lib.BlockCipherMode.extend();t.Encryptor=t.extend({processBlock:function(e,t){this._cipher.encryptBlock(e,t)}});t.Decryptor=t.extend({processBlock:function(e,t){this._cipher.decryptBlock(e,t)}});return t}();return e.mode.ECB}(c(),te())}(),function(){if(he)return fe.exports;he=1;fe.exports=function(e){e.pad.AnsiX923={pad:function(e,t){var n=e.sigBytes,r=4*t,i=r-n%r,o=n+i-1;e.clamp();e.words[o>>>2]|=i<<24-o%4*8;e.sigBytes+=i},unpad:function(e){var t=255&e.words[e.sigBytes-1>>>2];e.sigBytes-=t}};return e.pad.Ansix923}(c(),te())}(),function(){if(ge)return be.exports;ge=1;be.exports=function(e){e.pad.Iso10126={pad:function(t,n){var r=4*n,i=r-t.sigBytes%r;t.concat(e.lib.WordArray.random(i-1)).concat(e.lib.WordArray.create([i<<24],1))},unpad:function(e){var t=255&e.words[e.sigBytes-1>>>2];e.sigBytes-=t}};return e.pad.Iso10126}(c(),te())}(),function(){if(ye)return xe.exports;ye=1;xe.exports=function(e){e.pad.Iso97971={pad:function(t,n){t.concat(e.lib.WordArray.create([2147483648],1));e.pad.ZeroPadding.pad(t,n)},unpad:function(t){e.pad.ZeroPadding.unpad(t);t.sigBytes--}};return e.pad.Iso97971}(c(),te())}(),function(){if(we)return ve.exports;we=1;ve.exports=function(e){e.pad.ZeroPadding={pad:function(e,t){var n=4*t;e.clamp();e.sigBytes+=n-(e.sigBytes%n||n)},unpad:function(e){var t=e.words,n=e.sigBytes-1;for(n=e.sigBytes-1;n>=0;n--)if(t[n>>>2]>>>24-n%4*8&255){e.sigBytes=n+1;break}}};return e.pad.ZeroPadding}(c(),te())}(),function(){if(me)return ke.exports;me=1;ke.exports=function(e){e.pad.NoPadding={pad:function(){},unpad:function(){}};return e.pad.NoPadding}(c(),te())}(),function(){if(_e)return Se.exports;_e=1;Se.exports=function(e){n=(t=e).lib.CipherParams,r=t.enc.Hex,t.format.Hex={stringify:function(e){return e.ciphertext.toString(r)},parse:function(e){var t=r.parse(e);return n.create({ciphertext:t})}};var t,n,r;return e.format.Hex}(c(),te())}(),function(){if(Be)return De.exports;Be=1;De.exports=function(e){!function(){var t=e,n=t.lib.BlockCipher,r=t.algo,i=[],o=[],s=[],a=[],c=[],l=[],d=[],p=[],u=[],h=[];!function(){for(var e=[],t=0;t<256;t++)if(t<128)e[t]=t<<1;else e[t]=t<<1^283;var n=0,r=0;for(t=0;t<256;t++){var f=r^r<<1^r<<2^r<<3^r<<4;f=f>>>8^255&f^99;i[n]=f;o[f]=n;var g=e[n],b=e[g],y=e[b],x=257*e[f]^16843008*f;s[n]=x<<24|x>>>8;a[n]=x<<16|x>>>16;c[n]=x<<8|x>>>24;l[n]=x;x=16843009*y^65537*b^257*g^16843008*n;d[f]=x<<24|x>>>8;p[f]=x<<16|x>>>16;u[f]=x<<8|x>>>24;h[f]=x;if(!n)n=r=1;else{n=g^e[e[e[y^g]]];r^=e[e[r]]}}}();var f=[0,1,2,4,8,16,32,64,128,27,54],g=r.AES=n.extend({_doReset:function(){if(!this._nRounds||this._keyPriorReset!==this._key){for(var e=this._keyPriorReset=this._key,t=e.words,n=e.sigBytes/4,r=4*((this._nRounds=n+6)+1),o=this._keySchedule=[],s=0;s<r;s++)if(s<n)o[s]=t[s];else{l=o[s-1];if(!(s%n)){l=i[(l=l<<8|l>>>24)>>>24]<<24|i[l>>>16&255]<<16|i[l>>>8&255]<<8|i[255&l];l^=f[s/n|0]<<24}else if(n>6&&s%n==4)l=i[l>>>24]<<24|i[l>>>16&255]<<16|i[l>>>8&255]<<8|i[255&l];o[s]=o[s-n]^l}for(var a=this._invKeySchedule=[],c=0;c<r;c++){s=r-c;if(c%4)var l=o[s];else l=o[s-4];if(c<4||s<=4)a[c]=l;else a[c]=d[i[l>>>24]]^p[i[l>>>16&255]]^u[i[l>>>8&255]]^h[i[255&l]]}}},encryptBlock:function(e,t){this._doCryptBlock(e,t,this._keySchedule,s,a,c,l,i)},decryptBlock:function(e,t){var n=e[t+1];e[t+1]=e[t+3];e[t+3]=n;this._doCryptBlock(e,t,this._invKeySchedule,d,p,u,h,o);n=e[t+1];e[t+1]=e[t+3];e[t+3]=n},_doCryptBlock:function(e,t,n,r,i,o,s,a){for(var c=this._nRounds,l=e[t]^n[0],d=e[t+1]^n[1],p=e[t+2]^n[2],u=e[t+3]^n[3],h=4,f=1;f<c;f++){var g=r[l>>>24]^i[d>>>16&255]^o[p>>>8&255]^s[255&u]^n[h++],b=r[d>>>24]^i[p>>>16&255]^o[u>>>8&255]^s[255&l]^n[h++],y=r[p>>>24]^i[u>>>16&255]^o[l>>>8&255]^s[255&d]^n[h++],x=r[u>>>24]^i[l>>>16&255]^o[d>>>8&255]^s[255&p]^n[h++];l=g;d=b;p=y;u=x}g=(a[l>>>24]<<24|a[d>>>16&255]<<16|a[p>>>8&255]<<8|a[255&u])^n[h++],b=(a[d>>>24]<<24|a[p>>>16&255]<<16|a[u>>>8&255]<<8|a[255&l])^n[h++],y=(a[p>>>24]<<24|a[u>>>16&255]<<16|a[l>>>8&255]<<8|a[255&d])^n[h++],x=(a[u>>>24]<<24|a[l>>>16&255]<<16|a[d>>>8&255]<<8|a[255&p])^n[h++];e[t]=g;e[t+1]=b;e[t+2]=y;e[t+3]=x},keySize:8});t.AES=n._createHelper(g)}();return e.AES}(c(),v(),D(),Z(),te())}(),Ae(),function(){if(Re)return Pe.exports;Re=1;Pe.exports=function(e){!function(){var t=e,n=t.lib.StreamCipher,r=t.algo,i=r.RC4=n.extend({_doReset:function(){for(var e=this._key,t=e.words,n=e.sigBytes,r=this._S=[],i=0;i<256;i++)r[i]=i;i=0;for(var o=0;i<256;i++){var s=i%n,a=t[s>>>2]>>>24-s%4*8&255;o=(o+r[i]+a)%256;var c=r[i];r[i]=r[o];r[o]=c}this._i=this._j=0},_doProcessBlock:function(e,t){e[t]^=o.call(this)},keySize:8,ivSize:0});function o(){for(var e=this._S,t=this._i,n=this._j,r=0,i=0;i<4;i++){n=(n+e[t=(t+1)%256])%256;var o=e[t];e[t]=e[n];e[n]=o;r|=e[(e[t]+e[n])%256]<<24-8*i}this._i=t;this._j=n;return r}t.RC4=n._createHelper(i);var s=r.RC4Drop=i.extend({cfg:i.cfg.extend({drop:192}),_doReset:function(){i._doReset.call(this);for(var e=this.cfg.drop;e>0;e--)o.call(this)}});t.RC4Drop=n._createHelper(s)}();return e.RC4}(c(),v(),D(),Z(),te())}(),function(){if(Ee)return We.exports;Ee=1;We.exports=function(e){!function(){var t=e,n=t.lib.StreamCipher,r=t.algo,i=[],o=[],s=[],a=r.Rabbit=n.extend({_doReset:function(){for(var e=this._key.words,t=this.cfg.iv,n=0;n<4;n++)e[n]=16711935&(e[n]<<8|e[n]>>>24)|4278255360&(e[n]<<24|e[n]>>>8);var r=this._X=[e[0],e[3]<<16|e[2]>>>16,e[1],e[0]<<16|e[3]>>>16,e[2],e[1]<<16|e[0]>>>16,e[3],e[2]<<16|e[1]>>>16],i=this._C=[e[2]<<16|e[2]>>>16,4294901760&e[0]|65535&e[1],e[3]<<16|e[3]>>>16,4294901760&e[1]|65535&e[2],e[0]<<16|e[0]>>>16,4294901760&e[2]|65535&e[3],e[1]<<16|e[1]>>>16,4294901760&e[3]|65535&e[0]];this._b=0;for(n=0;n<4;n++)c.call(this);for(n=0;n<8;n++)i[n]^=r[n+4&7];if(t){var o=t.words,s=o[0],a=o[1],l=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),d=16711935&(a<<8|a>>>24)|4278255360&(a<<24|a>>>8),p=l>>>16|4294901760&d,u=d<<16|65535&l;i[0]^=l;i[1]^=p;i[2]^=d;i[3]^=u;i[4]^=l;i[5]^=p;i[6]^=d;i[7]^=u;for(n=0;n<4;n++)c.call(this)}},_doProcessBlock:function(e,t){var n=this._X;c.call(this);i[0]=n[0]^n[5]>>>16^n[3]<<16;i[1]=n[2]^n[7]>>>16^n[5]<<16;i[2]=n[4]^n[1]>>>16^n[7]<<16;i[3]=n[6]^n[3]>>>16^n[1]<<16;for(var r=0;r<4;r++){i[r]=16711935&(i[r]<<8|i[r]>>>24)|4278255360&(i[r]<<24|i[r]>>>8);e[t+r]^=i[r]}},blockSize:4,ivSize:2});function c(){for(var e=this._X,t=this._C,n=0;n<8;n++)o[n]=t[n];t[0]=t[0]+1295307597+this._b|0;t[1]=t[1]+3545052371+(t[0]>>>0<o[0]>>>0?1:0)|0;t[2]=t[2]+886263092+(t[1]>>>0<o[1]>>>0?1:0)|0;t[3]=t[3]+1295307597+(t[2]>>>0<o[2]>>>0?1:0)|0;t[4]=t[4]+3545052371+(t[3]>>>0<o[3]>>>0?1:0)|0;t[5]=t[5]+886263092+(t[4]>>>0<o[4]>>>0?1:0)|0;t[6]=t[6]+1295307597+(t[5]>>>0<o[5]>>>0?1:0)|0;t[7]=t[7]+3545052371+(t[6]>>>0<o[6]>>>0?1:0)|0;this._b=t[7]>>>0<o[7]>>>0?1:0;for(n=0;n<8;n++){var r=e[n]+t[n],i=65535&r,a=r>>>16,c=((i*i>>>17)+i*a>>>15)+a*a,l=((4294901760&r)*r|0)+((65535&r)*r|0);s[n]=c^l}e[0]=s[0]+(s[7]<<16|s[7]>>>16)+(s[6]<<16|s[6]>>>16)|0;e[1]=s[1]+(s[0]<<8|s[0]>>>24)+s[7]|0;e[2]=s[2]+(s[1]<<16|s[1]>>>16)+(s[0]<<16|s[0]>>>16)|0;e[3]=s[3]+(s[2]<<8|s[2]>>>24)+s[1]|0;e[4]=s[4]+(s[3]<<16|s[3]>>>16)+(s[2]<<16|s[2]>>>16)|0;e[5]=s[5]+(s[4]<<8|s[4]>>>24)+s[3]|0;e[6]=s[6]+(s[5]<<16|s[5]>>>16)+(s[4]<<16|s[4]>>>16)|0;e[7]=s[7]+(s[6]<<8|s[6]>>>24)+s[5]|0}t.Rabbit=n._createHelper(a)}();return e.Rabbit}(c(),v(),D(),Z(),te())}(),function(){if(Te)return qe.exports;Te=1;qe.exports=function(e){!function(){var t=e,n=t.lib.StreamCipher,r=t.algo,i=[],o=[],s=[],a=r.RabbitLegacy=n.extend({_doReset:function(){var e=this._key.words,t=this.cfg.iv,n=this._X=[e[0],e[3]<<16|e[2]>>>16,e[1],e[0]<<16|e[3]>>>16,e[2],e[1]<<16|e[0]>>>16,e[3],e[2]<<16|e[1]>>>16],r=this._C=[e[2]<<16|e[2]>>>16,4294901760&e[0]|65535&e[1],e[3]<<16|e[3]>>>16,4294901760&e[1]|65535&e[2],e[0]<<16|e[0]>>>16,4294901760&e[2]|65535&e[3],e[1]<<16|e[1]>>>16,4294901760&e[3]|65535&e[0]];this._b=0;for(var i=0;i<4;i++)c.call(this);for(i=0;i<8;i++)r[i]^=n[i+4&7];if(t){var o=t.words,s=o[0],a=o[1],l=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),d=16711935&(a<<8|a>>>24)|4278255360&(a<<24|a>>>8),p=l>>>16|4294901760&d,u=d<<16|65535&l;r[0]^=l;r[1]^=p;r[2]^=d;r[3]^=u;r[4]^=l;r[5]^=p;r[6]^=d;r[7]^=u;for(i=0;i<4;i++)c.call(this)}},_doProcessBlock:function(e,t){var n=this._X;c.call(this);i[0]=n[0]^n[5]>>>16^n[3]<<16;i[1]=n[2]^n[7]>>>16^n[5]<<16;i[2]=n[4]^n[1]>>>16^n[7]<<16;i[3]=n[6]^n[3]>>>16^n[1]<<16;for(var r=0;r<4;r++){i[r]=16711935&(i[r]<<8|i[r]>>>24)|4278255360&(i[r]<<24|i[r]>>>8);e[t+r]^=i[r]}},blockSize:4,ivSize:2});function c(){for(var e=this._X,t=this._C,n=0;n<8;n++)o[n]=t[n];t[0]=t[0]+1295307597+this._b|0;t[1]=t[1]+3545052371+(t[0]>>>0<o[0]>>>0?1:0)|0;t[2]=t[2]+886263092+(t[1]>>>0<o[1]>>>0?1:0)|0;t[3]=t[3]+1295307597+(t[2]>>>0<o[2]>>>0?1:0)|0;t[4]=t[4]+3545052371+(t[3]>>>0<o[3]>>>0?1:0)|0;t[5]=t[5]+886263092+(t[4]>>>0<o[4]>>>0?1:0)|0;t[6]=t[6]+1295307597+(t[5]>>>0<o[5]>>>0?1:0)|0;t[7]=t[7]+3545052371+(t[6]>>>0<o[6]>>>0?1:0)|0;this._b=t[7]>>>0<o[7]>>>0?1:0;for(n=0;n<8;n++){var r=e[n]+t[n],i=65535&r,a=r>>>16,c=((i*i>>>17)+i*a>>>15)+a*a,l=((4294901760&r)*r|0)+((65535&r)*r|0);s[n]=c^l}e[0]=s[0]+(s[7]<<16|s[7]>>>16)+(s[6]<<16|s[6]>>>16)|0;e[1]=s[1]+(s[0]<<8|s[0]>>>24)+s[7]|0;e[2]=s[2]+(s[1]<<16|s[1]>>>16)+(s[0]<<16|s[0]>>>16)|0;e[3]=s[3]+(s[2]<<8|s[2]>>>24)+s[1]|0;e[4]=s[4]+(s[3]<<16|s[3]>>>16)+(s[2]<<16|s[2]>>>16)|0;e[5]=s[5]+(s[4]<<8|s[4]>>>24)+s[3]|0;e[6]=s[6]+(s[5]<<16|s[5]>>>16)+(s[4]<<16|s[4]>>>16)|0;e[7]=s[7]+(s[6]<<8|s[6]>>>24)+s[5]|0}t.RabbitLegacy=n._createHelper(a)}();return e.RabbitLegacy}(c(),v(),D(),Z(),te())}(),He(),e)}());const Fe=new class{constructor(){this.panel=null;this.enableBrowserConsole=!1;this.logLevel="debug";this.buffer=[];this.maxBufferSize=100;this.enableBrowserConsole=!1;this.logLevel="debug"}configure(e){if(void 0!==e.enableBrowserConsole)this.enableBrowserConsole=e.enableBrowserConsole;if(void 0!==e.logLevel)this.logLevel=e.logLevel}setPanel(e){this.panel=e;this.flushBuffer()}flushBuffer(){if(this.panel){this.buffer.forEach(({message:e,type:t})=>{this.panel.logToConsole(e,t)});this.buffer=[]}}shouldLog(e){const t=["debug","info","warn","error"],n=t.indexOf(this.logLevel);return t.indexOf(e)>=n}formatMessage(e,t,n){const r=n.map(e=>{if("object"==typeof e)try{return JSON.stringify(e,null,2)}catch{return String(e)}return String(e)}).join(" ");return r?`${t} ${r}`:t}output(e,t,n){if(this.panel)this.panel.logToConsole(e,t);else{this.buffer.push({message:e,type:t,timestamp:new Date});if(this.buffer.length>this.maxBufferSize)this.buffer.shift()}if(this.enableBrowserConsole)console[n](e)}debug(e,...t){if(!this.shouldLog("debug"))return;const n=this.formatMessage("[DEBUG]",e,t);this.output(n,"log","log")}log(e,...t){if(!this.shouldLog("info"))return;const n=this.formatMessage("",e,t);this.output(n,"log","log")}info(e,...t){if(!this.shouldLog("info"))return;const n=this.formatMessage("[INFO]",e,t);this.output(n,"log","log")}warn(e,...t){if(!this.shouldLog("warn"))return;const n=this.formatMessage("[WARN]",e,t);this.output(n,"warn","warn")}error(e,...t){if(!this.shouldLog("error"))return;const n=this.formatMessage("[ERROR]",e,t);this.output(n,"error","error")}consoleDirect(e,...t){console.log(e,...t)}};class Ue{constructor(){this.requests=new Map;this.listeners=[];this.decryptConfig={enabled:!1};window.__originalFetch=window.fetch;this.interceptXHR();this.interceptFetch()}enableDecryption(e){this.decryptConfig.enabled=!0;if(e?.keyExtractor)this.decryptConfig.keyExtractor=e.keyExtractor;if(e?.slkExtractor)this.decryptConfig.slkExtractor=e.slkExtractor;if(void 0!==e?.autoFetchKeys)this.decryptConfig.autoFetchKeys=e.autoFetchKeys;if(e?.keyApiUrl)this.decryptConfig.keyApiUrl=e.keyApiUrl}addListener(e){this.listeners.push(e)}removeListener(e){const t=this.listeners.indexOf(e);if(t>-1)this.listeners.splice(t,1)}getRequests(){return Array.from(this.requests.values()).sort((e,t)=>t.timestamp-e.timestamp)}clearRequests(){this.requests.clear()}generateRequestId(){return Math.random().toString(36).substr(2,9)}isInternalUrl(e){return e.includes("/api/dokv/storage")||e.includes("/api/share")}notifyListeners(e){this.listeners.forEach(t=>{try{t(e)}catch(n){Fe.warn("NetworkDebugger: Listener error:",n)}})}extractUrlParams(e){try{const t=new URL(e),n={};t.searchParams.forEach((e,t)=>{n[t]=e});if(Object.keys(n).length>0)if(1===Object.keys(n).length&&n.data)return n.data;else return n;return null}catch(t){return null}}async tryDecrypt(e,t){Fe.debug("[PWTK Debug] tryDecrypt called:",{dataType:typeof e,dataLength:"string"==typeof e?e.length:JSON.stringify(e).length,dataPreview:"string"==typeof e?e.substring(0,100):JSON.stringify(e).substring(0,100),headers:Object.keys(t),decryptEnabled:this.decryptConfig.enabled,hasWindowDecrypt:"function"==typeof window.decrypt});if(!this.decryptConfig.enabled||!e){Fe.debug("[PWTK Debug] Decrypt disabled or no data");return null}try{let r="",i="";if(t.cid&&!1!==this.decryptConfig.autoFetchKeys){Fe.debug("[PWTK Debug] Trying to fetch key with cid:",t.cid);try{const e=this.decryptConfig.keyApiUrl||"https://gw-card-pay.buyacard.cc/ip/getSK",n={cid:t.cid,client:t.client||"S_WEB",device:t.device||"Web",language:t.language||"CN"};Fe.debug("[PWTK Debug] Fetching key from:",e,"with headers:",n);const i=window.__originalFetch||window.fetch,o=await i(e,{headers:n}),s=await o.json();Fe.debug("[PWTK Debug] getSK API response:",s);if(s.success&&s.data){const e=String(s.data);Fe.debug("[PWTK Debug] getSK returned num:",e,"length:",e.length);if(e.length>=9){r=e.charAt(2)+e.charAt(5)+e.charAt(8);Fe.debug("[PWTK Debug] Extracted key from getSK:",r)}else Fe.debug("[PWTK Debug] getSK num too short:",e)}else Fe.debug("[PWTK Debug] getSK failed:",s)}catch(n){Fe.warn("[PWTK Debug] getSK API error:",n)}}else Fe.debug("[PWTK Debug] No cid or autoFetchKeys disabled");if(!r&&this.decryptConfig.keyExtractor){r=this.decryptConfig.keyExtractor(t);Fe.debug("[PWTK Debug] Key from custom extractor:",r)}else if(!r){r=t.decryptKey||t.keys||t.cid||"";Fe.debug("[PWTK Debug] Key from headers:",r,"from:",t.decryptKey?"decryptKey":t.keys?"keys":t.cid?"cid":"none")}if(this.decryptConfig.slkExtractor){i=this.decryptConfig.slkExtractor(t);Fe.debug("[PWTK Debug] SLK from custom extractor:",i)}else{i=t.decryptSlk||t.slk||"";Fe.debug("[PWTK Debug] SLK from headers:",i,"from:",t.decryptSlk?"decryptSlk":t.slk?"slk":"none")}const o=r+i;Fe.debug("[PWTK Debug] Full decrypt key:",o?`"${o}" (length: ${o.length})`:"empty");if(o){let t=e,r=!1;if("object"==typeof e&&null!==e&&e.data&&"string"==typeof e.data){Fe.debug('[PWTK Debug] Data is wrapped in {"data": "..."} format, extracting inner data');t=e.data;r=!0}else if("string"==typeof e)try{const n=JSON.parse(e);if(n.data&&"string"==typeof n.data){Fe.debug("[PWTK Debug] Data is JSON string with data field, extracting");t=n.data;r=!0}}catch{}const i="string"==typeof t?t:JSON.stringify(t);Fe.debug("[PWTK Debug] Calling decrypt with:",{dataLength:i.length,dataPreview:i.substring(0,50),key:o,isWrapped:r});const s=function(e,t){Fe.debug("[PWTK Decrypt] decrypt function called:",{dataLength:e?.length,dataPreview:e?.substring(0,50),keyStr:t,hasWindowDecrypt:"function"==typeof window.decrypt,hasWindowEncrypt:"function"==typeof window.encrypt});if(!e||e.startsWith("{")||e.startsWith("[")){Fe.debug("[PWTK Decrypt] Data looks like JSON, parsing directly");try{const t=JSON.parse(e);Fe.debug("[PWTK Decrypt] Successfully parsed as JSON");return t}catch{Fe.debug("[PWTK Decrypt] Failed to parse as JSON, returning as string");return e}}if(window.decrypt&&t){Fe.debug("[PWTK Decrypt] Trying WebAssembly decrypt");Fe.debug("[PWTK Decrypt] Input to window.decrypt:",{data:e.substring(0,100)+"...",key:t});try{const n=window.decrypt(e,t);Fe.debug("[PWTK Decrypt] window.decrypt returned:",{type:typeof n,length:n?.length,preview:n?n.substring(0,200)+(n.length>200?"...":""):null,sameAsInput:n===e,hasInvalidChars:n?.includes("�")});if(n&&n!==e&&!n.includes("�"))try{const e=JSON.parse(n);Fe.debug("[PWTK Decrypt] ✅ WebAssembly decryption successful, parsed as JSON:",e);return e}catch{if(n.length>0){Fe.debug("[PWTK Decrypt] ✅ WebAssembly decryption successful, returning as string");return n}}else Fe.debug("[PWTK Decrypt] window.decrypt did not change the data or returned invalid result")}catch(n){Fe.debug("[PWTK Decrypt] WebAssembly decrypt error:",n)}}else Fe.debug("[PWTK Decrypt] WebAssembly not available:",{hasWindowDecrypt:!!window.decrypt,hasKey:!!t,windowDecryptType:typeof window.decrypt});const r=[t,"thisisakey123456","VITE_CRYPTO_KEY"].filter(Boolean);for(const i of r)if(i)try{const t=Me.enc.Utf8.parse(i.padEnd(16,"0").slice(0,16)),n=Me.enc.Utf8.parse(i.padEnd(16,"0").slice(0,16)),r=Me.AES.decrypt(e,t,{iv:n,mode:Me.mode.CBC,padding:Me.pad.Pkcs7}).toString(Me.enc.Utf8);if(r)try{return JSON.parse(r)}catch{return r}}catch(n){}try{const t=atob(e);try{return JSON.parse(t)}catch{return t}}catch{}Fe.debug("[PWTK Decrypt] ❌ All decryption methods failed, returning original data");return e}(i,o);Fe.debug("[PWTK Debug] Decrypt result:",{success:s&&s!==i,decryptedType:typeof s,decryptedLength:s?"string"==typeof s?s.length:JSON.stringify(s).length:0,preview:s?"string"==typeof s?s.substring(0,100):JSON.stringify(s).substring(0,100):null});if(s&&s!==i){Fe.debug("[PWTK Debug] ✅ Decryption successful! Result:",s);return s}else Fe.debug("[PWTK Debug] ❌ Decryption failed or returned same data")}else Fe.debug("[PWTK Debug] No key available, skipping decryption")}catch(r){Fe.error("[PWTK Debug] tryDecrypt error:",r)}Fe.debug("[PWTK Debug] tryDecrypt returning null");return null}interceptXHR(){const e=window.XMLHttpRequest,t=this;window.XMLHttpRequest=function(...n){const r=new e(...n),i=t.generateRequestId();let o="",s="",a={};const c=Date.now();let l=!1;const d=r.open;r.open=function(e,n,...r){o=e.toUpperCase();s=n;l=t.isInternalUrl(s);return d.apply(this,[e,n,...r])};const p=r.setRequestHeader;r.setRequestHeader=function(e,t){a[e]=t;return p.call(this,e,t)};const u=r.send;r.send=function(e){if(l)return u.call(this,e);const n={id:i,url:s,method:o,headers:{...a},requestBody:e,timestamp:c};let r=e;if("GET"===o&&!e){r=t.extractUrlParams(s);if(r)n.requestBody=r}if(r)t.tryDecrypt(r,a).then(e=>{if(null!==e){n.decryptedRequest=e;t.requests.set(i,n);Fe.debug("[PWTK Debug] Request decrypted, notifying UI");t.notifyListeners(n)}}).catch(e=>Fe.warn("解密请求失败:",e));t.requests.set(i,n);t.notifyListeners(n);return u.call(this,e)};r.addEventListener("readystatechange",function(){Fe.debug("[PWTK Debug] XHR state changed:",{readyState:r.readyState,readyStateName:["UNSENT","OPENED","HEADERS_RECEIVED","LOADING","DONE"][r.readyState],status:r.status,isInternal:l,requestId:i,url:s});Fe.debug("[PWTK Debug] Checking response condition:",{readyState:r.readyState,isDone:4===r.readyState,XMLHttpRequestDONE:"undefined"!=typeof XMLHttpRequest?XMLHttpRequest.DONE:"undefined",isInternal:l,shouldProcess:4===r.readyState&&!l});if(4===r.readyState&&!l){Fe.debug("[PWTK Debug] XHR completed, processing response");const e=Date.now(),n=t.requests.get(i);if(n){Fe.debug("[PWTK Debug] Found request data, updating with response");n.status=r.status;n.statusText=r.statusText;n.duration=e-c;const o={},s=r.getAllResponseHeaders();if(s)s.split("\r\n").forEach(e=>{const t=e.split(": ");if(2===t.length)o[t[0]]=t[1]});n.responseHeaders=o;const l=null!==r.responseText&&void 0!==r.responseText&&""!==r.responseText;Fe.debug("[PWTK Debug] XHR Response received:",{status:n.status,hasResponseText:l,responseTextLength:r.responseText?.length,responseTextPreview:r.responseText?.substring(0,100)});if(l)try{n.responseBody=JSON.parse(r.responseText);Fe.debug("[PWTK Debug] Response parsed as JSON:",n.responseBody)}catch{n.responseBody=r.responseText;Fe.debug("[PWTK Debug] Response kept as text")}else{n.responseBody=null;Fe.debug("[PWTK Debug] No response body")}Fe.debug("[PWTK Debug] Updating request with response data");t.requests.set(i,n);t.notifyListeners(n);if(n.responseBody)t.tryDecrypt(n.responseBody,{...a,...o}).then(e=>{if(null!==e){n.decryptedResponse=e;t.requests.set(i,n);Fe.debug("[PWTK Debug] Response decrypted, notifying UI:",e);t.notifyListeners(n)}}).catch(e=>Fe.warn("解密响应失败:",e))}else Fe.debug("[PWTK Debug] WARNING: Request data not found for ID:",i)}});return r};window.XMLHttpRequest.prototype=e.prototype}interceptFetch(){const e=window.__originalFetch||window.fetch,t=this;window.fetch=async function(n,r){const i=t.generateRequestId(),o=Date.now(),s="string"==typeof n?n:n instanceof URL?n.toString():n.url,a=(r?.method||"GET").toUpperCase();if(t.isInternalUrl(s))return e.call(this,n,r);const c={};if(r?.headers)if(r.headers instanceof Headers)r.headers.forEach((e,t)=>{c[t]=e});else if(Array.isArray(r.headers))r.headers.forEach(([e,t])=>{c[e]=t});else Object.entries(r.headers).forEach(([e,t])=>{c[e]=t});let l=null;if(r?.body)if("string"==typeof r.body)try{l=JSON.parse(r.body)}catch{l=r.body}else l=r.body;const d={id:i,url:s,method:a,headers:{...c},requestBody:l,timestamp:o};let p=l;if("GET"===a&&!l){p=t.extractUrlParams(s);if(p)d.requestBody=p}if(p)t.tryDecrypt(p,c).then(e=>{if(null!==e){d.decryptedRequest=e;t.requests.set(i,d);Fe.debug("[PWTK Debug] Fetch request decrypted, notifying UI");t.notifyListeners(d)}}).catch(e=>Fe.warn("解密请求失败:",e));t.requests.set(i,d);t.notifyListeners(d);try{const s=await e.call(this,n,r),a=Date.now(),l=s.clone(),d=t.requests.get(i);if(d){d.status=s.status;d.statusText=s.statusText;d.duration=a-o;const e={};s.headers.forEach((t,n)=>{e[n]=t});d.responseHeaders=e;try{const n=await l.text();Fe.debug("[PWTK Debug] Fetch Response received:",{status:d.status,textLength:n.length,textPreview:n.substring(0,100)});try{d.responseBody=JSON.parse(n)}catch{d.responseBody=n}t.requests.set(i,d);t.notifyListeners(d);if(d.responseBody)t.tryDecrypt(d.responseBody,{...c,...e}).then(e=>{if(null!==e){d.decryptedResponse=e;t.requests.set(i,d);Fe.debug("[PWTK Debug] Fetch response decrypted, notifying UI:",e);t.notifyListeners(d)}}).catch(e=>Fe.warn("解密响应失败:",e))}catch(u){d.error=`Failed to read response: ${u}`;t.requests.set(i,d);t.notifyListeners(d)}}return s}catch(u){const e=Date.now(),n=t.requests.get(i);if(n){n.error=u instanceof Error?u.message:String(u);n.duration=e-o;t.requests.set(i,n);t.notifyListeners(n)}throw u}}}}class Ne{constructor(){this.loaded=!1;this.loading=!1}async loadWasm(e,t){Fe.debug("[PWTK WASM] loadWasm called");Fe.debug("[PWTK WASM] Current state:",{hasWindowDecrypt:"function"==typeof window.decrypt,hasWindowEncrypt:"function"==typeof window.encrypt,hasWindowGo:void 0!==window.Go});if("function"==typeof window.decrypt){Fe.debug("[PWTK WASM] window.decrypt already exists, skipping WASM load");this.loaded=!0;return!0}if(this.loaded)return!0;if(this.loading)return new Promise(e=>{const t=()=>{if(this.loaded||!this.loading)e(this.loaded);else setTimeout(t,100)};t()});this.loading=!0;try{const o=[e,"/mimlib.wasm","/dist/mimlib.wasm","/assets/mimlib.wasm","https://gw-card-pay.buyacard.cc/mimlib.wasm"].filter(Boolean),s=[t,"/wasm_exec.js","/dist/wasm_exec.js","/assets/wasm_exec.js","https://gw-card-pay.buyacard.cc/wasm_exec.js"].filter(Boolean);let a=!1;for(const e of s)try{await this.loadScript(e);if(void 0!==window.Go){a=!0;Fe.debug("[PWTK WASM] wasm_exec.js loaded successfully from:",e);break}}catch(n){Fe.warn("NetworkDebugger: 尝试加载",e,"失败:",n);continue}if(!a)throw new Error("Unable to load wasm_exec.js from any path");if(void 0===window.Go)throw new Error("Go WebAssembly runtime not available");const c=new window.Go;let l=null;for(const e of o)try{if(WebAssembly.instantiateStreaming)try{l=await WebAssembly.instantiateStreaming(fetch(e),c.importObject);Fe.info("NetworkDebugger: WebAssembly 加载成功:",e);break}catch(r){Fe.warn("instantiateStreaming 失败,尝试传统方式:",r);const t=await fetch(e).then(e=>e.arrayBuffer());l=await WebAssembly.instantiate(t,c.importObject);Fe.info("NetworkDebugger: WebAssembly 加载成功(传统方式):",e);break}else{const t=await fetch(e).then(e=>e.arrayBuffer());l=await WebAssembly.instantiate(t,c.importObject);Fe.info("NetworkDebugger: WebAssembly 加载成功(传统方式):",e);break}}catch(i){Fe.warn("NetworkDebugger: 尝试加载",e,"失败:",i);continue}if(!l)throw new Error("Unable to load WebAssembly from any path");c.run(l.instance);await new Promise(e=>setTimeout(e,100));Fe.debug("[PWTK WASM] After WASM load, checking functions:",{hasDecrypt:"function"==typeof window.decrypt,hasEncrypt:"function"==typeof window.encrypt,windowKeys:Object.keys(window).filter(e=>e.includes("crypt"))});if("function"==typeof window.decrypt){this.loaded=!0;Fe.debug("[PWTK WASM] ✅ WebAssembly loaded successfully, decrypt function available");return!0}else{Fe.warn("[PWTK WASM] ❌ WebAssembly loaded but decrypt function not available");return!1}}catch(i){Fe.error("[PWTK WASM] WebAssembly loading failed:",i);return!1}finally{this.loading=!1;Fe.debug("[PWTK WASM] Load complete, final state:",{loaded:this.loaded,hasDecrypt:"function"==typeof window.decrypt})}}loadScript(e){return new Promise((t,n)=>{if(document.querySelector(`script[src="${e}"]`)){t();return}const r=document.createElement("script");r.src=e;r.type="text/javascript";r.onload=()=>t();r.onerror=t=>n(new Error(`Failed to load script: ${e}`));document.head.appendChild(r)})}isLoaded(){return this.loaded}isLoading(){return this.loading}isDecryptAvailable(){return this.loaded&&"function"==typeof window.decrypt}isEncryptAvailable(){return this.loaded&&"function"==typeof window.encrypt}}function Ie(e){return JSON.stringify(e,null,2)}async function $e(e){try{const n=function(e){let t=`curl '${e.url}'`;if("GET"!==e.method)t+=` -X ${e.method}`;if(e.headers)Object.entries(e.headers).forEach(([e,n])=>{t+=` -H '${e}: ${n}'`});if(e.requestBody){const n="string"==typeof e.requestBody?e.requestBody:JSON.stringify(e.requestBody);t+=` --data '${n}'`}return t}(e),r={curl:n,response:e.responseBody||null,timestamp:Date.now(),slk:e.headers?.slk||"",debuggerData:{url:e.url,method:e.method,headers:e.headers,status:e.status,statusText:e.statusText,duration:e.duration,responseHeaders:e.responseHeaders,decryptedRequest:e.decryptedRequest,decryptedResponse:e.decryptedResponse,error:e.error,creator:"PWTK Network Debugger by Leo (@leeguoo)",version:"1.2.26"}},i=window.__originalFetch||window.fetch,o="https://curl.bwg.leeguoo.com/api/share";Fe.debug("使用分享API:",o);let s;try{s=await i(o,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({data:r})})}catch(t){if("TypeError"===t.name&&t.message.includes("fetch"))throw new Error(`网络连接失败: 无法连接到分享服务器 (${o}). 可能原因: CORS策略限制或网络问题`);throw t}if(!s.ok)throw new Error(`HTTP ${s.status}: ${s.statusText}`);const a=await s.json();if(a.shareId){const e=`https://curl.bwg.leeguoo.com/share/${a.shareId}`;Fe.info(`🔗 分享链接创建成功 (by Leo): ${e}`);return e}else throw new Error(a.error||"创建分享失败")}catch(n){const e=n.message||n.toString()||"未知错误";Fe.error("NetworkDebugger: 创建分享链接失败:",{message:e,name:n.name,stack:n.stack?.split("\n")[0]});throw new Error(e)}}async function je(e){try{if(navigator.clipboard&&navigator.clipboard.writeText){await navigator.clipboard.writeText(e);return!0}else{const t=document.createElement("textarea");t.value=e;t.style.position="fixed";t.style.opacity="0";document.body.appendChild(t);t.select();const n=document.execCommand("copy");document.body.removeChild(t);return n}}catch(t){Fe.error("复制到剪贴板失败:",t);return!1}}const Xe=class e{constructor(e,t={}){this.isDragging=!1;this.isResizing=!1;this.dragStart={x:0,y:0};this.resizeTimeout=null;this.resizeDirection="";this.requestsCache=[];this.interceptor=e;const n=this.loadConfig();this.config={position:"bottom-right",theme:"dark",minimized:!1,isClosed:!1,...n,...t};this.createPanel();this.bindEvents();this.startListening();Fe.setPanel(this);this.loadPosition();if(this.config.isClosed)this.hide()}createPanel(){this.hostElement=document.createElement("div");this.hostElement.id="network-debugger-host";this.hostElement.style.cssText="all: initial; position: absolute; top: 0; left: 0; pointer-events: none;";this.shadowRoot=this.hostElement.attachShadow({mode:"closed"});const e=document.createElement("style");e.textContent="\n/* iOS 26 Liquid Glass NetworkDebugger 样式 */\n:root {\n --liquid-glass-primary: rgba(255, 255, 255, 0.15);\n --liquid-glass-secondary: rgba(255, 255, 255, 0.08);\n --liquid-glass-border: rgba(255, 255, 255, 0.18);\n --liquid-glass-shadow: rgba(31, 38, 135, 0.37);\n --liquid-glass-highlight: rgba(255, 255, 255, 0.25);\n --liquid-glass-dark: rgba(13, 17, 23, 0.75);\n}\n\n#network-debugger-panel {\n position: fixed;\n z-index: 999999;\n \n /* 强制 GPU 加速和 3D 变换 */\n transform: translate3d(0, 0, 0);\n will-change: transform, backdrop-filter;\n \n /* iOS 26 Liquid Glass 核心效果 - 增强版 */\n backdrop-filter: blur(25px) saturate(200%) brightness(1.05) !important;\n -webkit-backdrop-filter: blur(25px) saturate(200%) brightness(1.05) !important;\n \n /* iOS 浅色毛玻璃背景 */\n background: rgba(245, 245, 247, 0.8);\n background-image: linear-gradient(\n 135deg,\n rgba(255, 255, 255, 0.5) 0%,\n rgba(255, 255, 255, 0.25) 100%\n );\n \n /* 玻璃边框 */\n border: 1px solid rgba(255, 255, 255, 0.25);\n \n /* 多层阴影创建深度 */\n box-shadow: \n 0 10px 40px rgba(31, 38, 135, 0.4),\n inset 0 2px 4px rgba(255, 255, 255, 0.3),\n inset 0 -2px 4px rgba(0, 0, 0, 0.12);\n \n border-radius: 20px;\n color: #ffffff;\n font-family: 'SF Pro Display', -apple-system, BlinkMacSystemFont, 'Monaco', 'Menlo', monospace;\n font-size: 12px;\n overflow: hidden;\n max-width: 90vw;\n max-height: 80vh;\n \n /* 性能优化 */\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n/* 主面板的镜面反射效果 */\n#network-debugger-panel::before {\n content: '';\n position: absolute;\n inset: 0;\n border-radius: inherit;\n background: linear-gradient(\n 135deg,\n rgba(255, 255, 255, 0.3) 0%,\n rgba(255, 255, 255, 0.05) 50%,\n transparent 100%\n );\n pointer-events: none;\n z-index: 1;\n}\n\n/* 镜面高光效果 */\n#network-debugger-panel::after {\n content: '';\n position: absolute;\n inset: 0;\n border-radius: inherit;\n background: radial-gradient(\n circle at 30% 30%,\n rgba(255, 255, 255, 0.2),\n transparent 70%\n );\n pointer-events: none;\n z-index: 1;\n}\n\n#network-debugger-panel.minimized {\n /* iOS 控制中心风格的圆角矩形 */\n height: 48px !important;\n width: 220px !important;\n max-width: 220px !important;\n border-radius: 24px !important;\n overflow: hidden;\n \n /* 强制 GPU 加速和 3D 变换 */\n transform: translate3d(0, 0, 0) !important;\n will-change: transform, backdrop-filter !important;\n \n /* 真正的 iOS Liquid Glass 效果 - 加强版 */\n background: \n /* 顶部高光 */\n linear-gradient(180deg, \n rgba(255, 255, 255, 0.5) 0%, \n rgba(255, 255, 255, 0.1) 35%),\n /* 主玻璃层 */\n radial-gradient(ellipse at top, \n rgba(255, 255, 255, 0.35), \n rgba(255, 255, 255, 0.12)),\n /* iOS 浅色基底 */\n rgba(245, 245, 247, 0.85) !important;\n \n /* 增强毛玻璃效果 */\n backdrop-filter: blur(40px) saturate(220%) brightness(1.1) !important;\n -webkit-backdrop-filter: blur(40px) saturate(220%) brightness(1.1) !important;\n \n /* iOS 风格边缘光效 - 增强版 */\n box-shadow: \n /* 外发光 */\n 0 0 0 0.5px rgba(255, 255, 255, 0.7) !important,\n /* 内阴影创建玻璃厚度 */\n inset 0 1px 0 0 rgba(255, 255, 255, 0.7) !important,\n inset 0 -1px 0 0 rgba(0, 0, 0, 0.2) !important,\n /* 深度阴影 */\n 0 15px 40px rgba(0, 0, 0, 0.3) !important,\n 0 4px 10px rgba(0, 0, 0, 0.2) !important;\n \n /* 平滑过渡 */\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1) !important;\n}\n\n#network-debugger-panel.minimized .debugger-content {\n display: none;\n}\n\n#network-debugger-panel.minimized .resize-handle {\n display: none;\n}\n\n#network-debugger-panel.fullscreen .resize-handle {\n display: none;\n}\n\n#network-debugger-panel.fullscreen {\n backdrop-filter: blur(25px) saturate(200%);\n -webkit-backdrop-filter: blur(25px) saturate(200%);\n}\n\n#network-debugger-panel.bottom-right {\n bottom: 20px;\n right: 20px;\n width: 600px;\n height: 500px;\n}\n\n#network-debugger-panel.bottom-left {\n bottom: 20px;\n left: 20px;\n width: 600px;\n height: 500px;\n}\n\n#network-debugger-panel.top-right {\n top: 20px;\n right: 20px;\n width: 600px;\n height: 500px;\n}\n\n#network-debugger-panel.top-left {\n top: 20px;\n left: 20px;\n width: 600px;\n height: 500px;\n}\n\n#network-debugger-panel.fullscreen {\n top: 0;\n left: 0;\n width: 100vw !important;\n height: 100vh !important;\n border-radius: 0;\n}\n\n.debugger-header {\n /* 头部 Liquid Glass 效果 */\n backdrop-filter: blur(15px) brightness(1.1);\n -webkit-backdrop-filter: blur(15px) brightness(1.1);\n \n /* 多层背景效果 */\n background: \n /* 顶部高光 */\n linear-gradient(180deg, \n rgba(255, 255, 255, 0.8) 0%, \n rgba(255, 255, 255, 0.4) 60%),\n /* 基础玻璃层 */\n linear-gradient(\n 135deg,\n rgba(255, 255, 255, 0.6),\n rgba(255, 255, 255, 0.4)\n );\n \n border: 1px solid rgba(255, 255, 255, 0.2);\n border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n \n padding: 12px 16px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n user-select: none;\n position: relative;\n z-index: 2;\n \n /* iOS 风格圆角 */\n border-radius: 20px 20px 0 0;\n \n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.debugger-header:hover {\n backdrop-filter: blur(18px) brightness(1.15);\n -webkit-backdrop-filter: blur(18px) brightness(1.15);\n background: linear-gradient(\n 135deg,\n rgba(255, 255, 255, 0.15),\n rgba(255, 255, 255, 0.08)\n );\n}\n\n.debugger-title {\n font-weight: 600;\n color: rgba(60, 60, 67, 0.9);\n font-size: 15px;\n text-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\n}\n\n.debugger-controls {\n display: flex;\n gap: 10px;\n position: relative;\n z-index: 3;\n}\n\n.debugger-btn {\n /* 按钮毛玻璃效果但保证可见性 */\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n background: linear-gradient(\n 135deg,\n rgba(255, 255, 255, 0.7),\n rgba(255, 255, 255, 0.5)\n );\n border: 1px solid rgba(0, 0, 0, 0.08);\n color: rgba(60, 60, 67, 0.9);\n text-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\n padding: 6px 12px;\n border-radius: 12px;\n cursor: pointer;\n font-size: 11px;\n font-weight: 600;\n \n /* 按钮阴影 */\n box-shadow: \n 0 2px 8px rgba(0, 0, 0, 0.1),\n inset 0 1px 0 rgba(255, 255, 255, 0.25);\n \n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n transform: translateZ(0);\n}\n\n.debugger-btn:hover {\n backdrop-filter: blur(12px);\n -webkit-backdrop-filter: blur(12px);\n background: linear-gradient(\n 135deg,\n rgba(255, 255, 255, 0.2),\n rgba(255, 255, 255, 0.12)\n );\n transform: scale(1.05) translateZ(5px);\n box-shadow: \n 0 4px 16px rgba(0, 0, 0, 0.15),\n inset 0 1px 0 rgba(255, 255, 255, 0.3);\n}\n\n.debugger-btn:active {\n transform: scale(0.98);\n transition: transform 0.1s;\n}\n\n.debugger-btn.active {\n background: linear-gradient(135deg, #007AFF, #5856D6);\n color: #ffffff;\n box-shadow: \n 0 4px 16px rgba(0, 122, 255, 0.25),\n inset 0 1px 0 rgba(255, 255, 255, 0.3);\n backdrop-filter: blur(12px);\n}\n\n.debugger-icon {\n width: 16px;\n height: 16px;\n vertical-align: middle;\n filter: \n brightness(0.8) \n drop-shadow(0 1px 2px rgba(255, 255, 255, 0.8));\n color: rgba(60, 60, 67, 0.8);\n}\n\n.debugger-content {\n height: calc(100% - 60px);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n/* 移除标签页相关样式 - 只保留网络面板 */\n\n.debugger-panel-content {\n flex: 1;\n overflow: auto;\n padding: 12px;\n}\n\n.request-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 16px;\n position: relative;\n z-index: 2;\n}\n\n.request-item {\n /* 请求项毛玻璃效果加动态光效 */\n position: relative;\n backdrop-filter: blur(10px) brightness(1.1);\n -webkit-backdrop-filter: blur(10px) brightness(1.1);\n \n /* 多层背景 - 模拟 Liquid Glass */\n background: \n /* 动态光效层 */\n linear-gradient(\n 105deg,\n transparent 35%,\n rgba(255, 255, 255, 0.25) 45%,\n rgba(255, 255, 255, 0.35) 50%,\n rgba(255, 255, 255, 0.25) 55%,\n transparent 65%\n ),\n /* 基础玻璃层 */\n linear-gradient(\n 135deg,\n rgba(255, 255, 255, 0.8),\n rgba(255, 255, 255, 0.6)\n );\n \n background-size: 300% 100%, 100% 100%;\n border: 1px solid rgba(255, 255, 255, 0.2);\n border-radius: 16px;\n padding: 16px;\n cursor: pointer;\n \n /* 深度阴影和玻璃效果 */\n box-shadow: \n 0 4px 16px rgba(31, 38, 135, 0.2),\n inset 0 1px 2px rgba(255, 255, 255, 0.15),\n inset 0 -1px 1px rgba(0, 0, 0, 0.05);\n \n /* 流体动画和光效 */\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n transform: translateZ(0);\n animation: liquid-shimmer 4s ease-in-out infinite;\n}\n\n/* 模拟折射效果的伪元素 */\n.request-item::before {\n content: '';\n position: absolute;\n inset: -1px;\n border-radius: inherit;\n background: radial-gradient(\n circle at var(--mouse-x, 30%) var(--mouse-y, 30%),\n rgba(255, 255, 255, 0.4) 0%,\n rgba(255, 255, 255, 0.1) 30%,\n transparent 70%\n );\n opacity: 0;\n transition: opacity 0.4s ease;\n pointer-events: none;\n mix-blend-mode: overlay;\n z-index: 1;\n}\n\n/* 高光效果伪元素 */\n.request-item::after {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n height: 40%;\n border-radius: 16px 16px 0 0;\n background: linear-gradient(\n 180deg,\n rgba(255, 255, 255, 0.2) 0%,\n transparent 100%\n );\n pointer-events: none;\n z-index: 1;\n}\n\n.request-item:hover {\n backdrop-filter: blur(15px) brightness(1.2);\n -webkit-backdrop-filter: blur(15px) brightness(1.2);\n \n /* 增强 hover 时的光效 */\n background: \n linear-gradient(\n 105deg,\n transparent 20%,\n rgba(255, 255, 255, 0.35) 40%,\n rgba(255, 255, 255, 0.5) 50%,\n rgba(255, 255, 255, 0.35) 60%,\n transparent 80%\n ),\n linear-gradient(\n 135deg,\n rgba(255, 255, 255, 0.2),\n rgba(255, 255, 255, 0.12)\n );\n \n background-size: 200% 100%, 100% 100%;\n transform: scale(1.02) translateZ(15px);\n animation: liquid-refraction 0.6s ease-out;\n \n box-shadow: \n 0 12px 40px rgba(31, 38, 135, 0.35),\n inset 0 2px 4px rgba(255, 255, 255, 0.25),\n inset 0 -2px 2px rgba(0, 0, 0, 0.08);\n}\n\n/* 激活折射效果 */\n.request-item:hover::before {\n opacity: 1;\n}\n\n.request-item.expanded {\n backdrop-filter: blur(18px) brightness(1.2);\n -webkit-backdrop-filter: blur(18px) brightness(1.2);\n background: linear-gradient(\n 135deg,\n rgba(0, 122, 255, 0.08),\n rgba(255, 255, 255, 0.05)\n );\n border-color: rgba(0, 122, 255, 0.2);\n box-shadow: \n 0 8px 32px rgba(0, 0, 0, 0.15),\n inset 0 2px 4px rgba(255, 255, 255, 0.15);\n}\n\n.request-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 4px;\n}\n\n.request-method {\n /* 方法标签毛玻璃效果 */\n backdrop-filter: blur(6px);\n -webkit-backdrop-filter: blur(6px);\n padding: 4px 10px;\n border-radius: 10px;\n font-weight: 600;\n font-size: 10px;\n text-transform: uppercase;\n min-width: 45px;\n text-align: center;\n border: 1px solid rgba(255, 255, 255, 0.2);\n box-shadow: \n 0 2px 8px rgba(0, 0, 0, 0.1),\n inset 0 1px 0 rgba(255, 255, 255, 0.25);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.method-get { \n background: linear-gradient(135deg, #4CAF50, #45a049);\n color: #ffffff;\n box-shadow: 0 0 15px rgba(76, 175, 80, 0.4);\n}\n.method-post { \n background: linear-gradient(135deg, #2196F3, #1976D2);\n color: #ffffff;\n box-shadow: 0 0 15px rgba(33, 150, 243, 0.4);\n}\n.method-put { \n background: linear-gradient(135deg, #FF9800, #F57C00);\n color: #ffffff;\n box-shadow: 0 0 15px rgba(255, 152, 0, 0.4);\n}\n.method-delete { \n background: linear-gradient(135deg, #F44336, #D32F2F);\n color: #ffffff;\n box-shadow: 0 0 15px rgba(244, 67, 54, 0.4);\n}\n.method-patch { \n background: linear-gradient(135deg, #9C27B0, #7B1FA2);\n color: #ffffff;\n box-shadow: 0 0 15px rgba(156, 39, 176, 0.4);\n}\n\n.request-url {\n flex: 1;\n margin: 0 8px;\n word-break: break-all;\n white-space: normal;\n color: #fff;\n font-size: 11px;\n line-height: 1.3;\n}\n\n.request-status {\n /* 状态码标签毛玻璃效果 */\n backdrop-filter: blur(6px);\n -webkit-backdrop-filter: blur(6px);\n padding: 4px 10px;\n border-radius: 10px;\n font-size: 10px;\n font-weight: 600;\n min-width: 40px;\n text-align: center;\n border: 1px solid rgba(255, 255, 255, 0.2);\n box-shadow: \n 0 2px 8px rgba(0, 0, 0, 0.1),\n inset 0 1px 0 rgba(255, 255, 255, 0.25);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.status-2xx { \n background: linear-gradient(135deg, #4CAF50, #45a049);\n color: #ffffff;\n box-shadow: 0 3px 12px rgba(0, 0, 0, 0.2);\n}\n.status-3xx { \n background: linear-gradient(135deg, #FF9800, #F57C00);\n color: #ffffff;\n box-shadow: 0 3px 12px rgba(0, 0, 0, 0.2);\n}\n.status-4xx { \n background: linear-gradient(135deg, #F44336, #D32F2F);\n color: #ffffff;\n box-shadow: 0 3px 12px rgba(0, 0, 0, 0.2);\n}\n.status-5xx { \n background: linear-gradient(135deg, #9C27B0, #7B1FA2);\n color: #ffffff;\n box-shadow: 0 3px 12px rgba(0, 0, 0, 0.2);\n}\n.status-error { \n background: linear-gradient(135deg, #F44336, #D32F2F);\n color: #ffffff;\n box-shadow: 0 3px 12px rgba(0, 0, 0, 0.2);\n}\n\n.request-info {\n display: flex;\n justify-content: space-between;\n font-size: 10px;\n color: #999;\n}\n\n.request-details {\n margin-top: 12px;\n border-top: 1px solid #444;\n padding-top: 12px;\n display: none;\n}\n\n/* 默认折叠headers */\n.request-details .detail-section.collapsible {\n /* 默认折叠状态 */\n}\n\n.request-details .detail-section.collapsible:not(.expanded) .detail-content {\n display: none;\n}\n\n.request-details .detail-section.collapsible:not(.expanded) .collapse-icon {\n transform: rotate(-90deg);\n}\n\n.request-item.expanded .request-details {\n display: block;\n}\n\n.detail-section {\n margin-bottom: 16px;\n}\n\n.detail-title {\n font-weight: bold;\n color: #4CAF50;\n margin-bottom: 8px;\n font-size: 11px;\n text-transform: uppercase;\n border-bottom: 1px solid #444;\n padding-bottom: 4px;\n}\n\n.detail-title.highlight {\n color: #FFD700;\n font-size: 12px;\n background: rgba(255, 215, 0, 0.1);\n padding: 6px 8px;\n border-radius: 4px;\n border-bottom: 2px solid #FFD700;\n}\n\n.detail-title.clickable {\n cursor: pointer;\n user-select: none;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.detail-title.clickable:hover {\n background: rgba(76, 175, 80, 0.1);\n}\n\n.collapse-icon {\n display: inline-block;\n transition: transform 0.2s;\n font-size: 10px;\n}\n\n.detail-section.collapsible {\n position: relative;\n}\n\n.detail-section.collapsible.collapsed .detail-content {\n display: none;\n}\n\n.detail-section.collapsible.collapsed .collapse-icon {\n transform: rotate(-90deg);\n}\n\n.detail-content {\n /* 详情内容毛玻璃效果 */\n backdrop-filter: blur(8px) brightness(0.9);\n -webkit-backdrop-filter: blur(8px) brightness(0.9);\n background: linear-gradient(\n 135deg,\n rgba(0, 0, 0, 0.3),\n rgba(0, 0, 0, 0.15)\n );\n border: 1px solid rgba(255, 255, 255, 0.08);\n padding: 16px;\n border-radius: 12px;\n max-height: 400px;\n min-height: 300px;\n overflow: auto;\n \n /* 内部阴影 */\n box-shadow: \n inset 0 2px 4px rgba(0, 0, 0, 0.2),\n inset 0 -1px 2px rgba(255, 255, 255, 0.05);\n \n /* 平滑滚动 */\n scroll-behavior: smooth;\n}\n\n.json-content {\n white-space: pre-wrap;\n font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;\n font-size: 11px;\n line-height: 1.4;\n}\n\n.headers-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 10px;\n}\n\n.headers-table th,\n.headers-table td {\n padding: 4px 8px;\n text-align: left;\n border-bottom: 1px solid #444;\n}\n\n.headers-table th {\n background: #333;\n color: #4CAF50;\n font-weight: bold;\n}\n\n.headers-table td {\n color: #ccc;\n}\n\n.decrypted-badge {\n background: #4CAF50;\n color: #000;\n padding: 2px 6px;\n border-radius: 3px;\n font-size: 9px;\n margin-left: 8px;\n font-weight: bold;\n}\n\n.error-badge {\n background: #F44336;\n color: #fff;\n padding: 2px 6px;\n border-radius: 3px;\n font-size: 9px;\n margin-left: 8px;\n font-weight: bold;\n}\n\n.share-btn {\n /* 分享按钮毛玻璃效果 */\n backdrop-filter: blur(6px);\n -webkit-backdrop-filter: blur(6px);\n background: linear-gradient(135deg, #2196F3, #1976D2);\n color: #ffffff;\n border: 1px solid rgba(33, 150, 243, 0.3);\n padding: 6px 12px;\n border-radius: 10px;\n font-size: 10px;\n font-weight: 500;\n margin-left: 8px;\n cursor: pointer;\n white-space: nowrap;\n \n box-shadow: \n 0 2px 8px rgba(33, 150, 243, 0.3),\n inset 0 1px 0 rgba(255, 255, 255, 0.2);\n \n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n transform: translateZ(0);\n}\n\n.share-btn:hover {\n background: linear-gradient(135deg, #1976D2, #1565C0);\n transform: scale(1.05) translateZ(5px);\n box-shadow: \n 0 4px 16px rgba(33, 150, 243, 0.4),\n inset 0 1px 0 rgba(255, 255, 255, 0.3);\n}\n\n.share-btn:active {\n transform: scale(0.98);\n transition: transform 0.1s;\n}\n\n.api-curl-btn {\n /* API Curl 按钮毛玻璃效果 */\n backdrop-filter: blur(6px);\n -webkit-backdrop-filter: blur(6px);\n background: linear-gradient(135deg, #4CAF50, #45a049);\n color: #ffffff;\n border: 1px solid rgba(76, 175, 80, 0.3);\n padding: 6px 12px;\n border-radius: 10px;\n font-size: 10px;\n font-weight: 500;\n margin-left: 8px;\n cursor: pointer;\n white-space: nowrap;\n \n box-shadow: \n 0 2px 8px rgba(76, 175, 80, 0.3),\n inset 0 1px 0 rgba(255, 255, 255, 0.2);\n \n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n transform: translateZ(0);\n}\n\n.api-curl-btn:hover {\n background: linear-gradient(135deg, #45a049, #388E3C);\n transform: scale(1.05) translateZ(5px);\n box-shadow: \n 0 4px 16px rgba(76, 175, 80, 0.4),\n inset 0 1px 0 rgba(255, 255, 255, 0.3);\n}\n\n.api-curl-btn:active {\n transform: scale(0.98);\n transition: transform 0.1s;\n}\n\n.console-content {\n background: #000;\n color: #0f0;\n font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;\n font-size: 11px;\n line-height: 1.4;\n height: 100%;\n overflow: auto;\n padding: 8px;\n}\n\n.console-input {\n display: flex;\n align-items: center;\n background: #333;\n padding: 8px;\n border-top: 1px solid #444;\n}\n\n.console-prompt {\n color: #4CAF50;\n margin-right: 8px;\n font-weight: bold;\n}\n\n.console-cmd {\n flex: 1;\n background: none;\n border: none;\n color: #fff;\n font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;\n font-size: 12px;\n outline: none;\n}\n\n.tools-section {\n padding: 12px;\n background: #2a2a2a;\n border-bottom: 1px solid #444;\n}\n\n.tool-buttons {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.tool-btn {\n padding: 6px 12px;\n background: #4CAF50;\n color: #000;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n font-size: 11px;\n font-weight: bold;\n transition: background-color 0.2s;\n}\n\n.tool-btn:hover {\n background: #45a049;\n}\n\n.tool-btn:disabled {\n background: #666;\n color: #999;\n cursor: not-allowed;\n}\n\n/* 动态光效动画 - 模拟 Shader 效果 */\n@keyframes liquid-shimmer {\n 0% {\n background-position: -300% center;\n transform: translateX(-10px);\n }\n 50% {\n transform: translateX(0);\n }\n 100% {\n background-position: 300% center;\n transform: translateX(10px);\n }\n}\n\n@keyframes liquid-refraction {\n 0%, 100% {\n transform: scale(1) perspective(1000px) rotateY(0deg);\n filter: blur(0px);\n }\n 25% {\n transform: scale(1.01) perspective(1000px) rotateY(0.5deg);\n filter: blur(0.5px);\n }\n 75% {\n transform: scale(0.99) perspective(1000px) rotateY(-0.5deg);\n filter: blur(0.3px);\n }\n}\n\n@keyframes liquid-expand {\n 0% { \n opacity: 0;\n transform: scale(0.95) translateY(-10px);\n backdrop-filter: blur(5px);\n }\n 50% { \n opacity: 0.7;\n transform: scale(1.02) translateY(-2px);\n backdrop-filter: blur(12px);\n }\n 100% { \n opacity: 1;\n transform: scale(1) translateY(0);\n backdrop-filter: blur(8px);\n }\n}\n\n@keyframes liquid-glow {\n 0%, 100% { \n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);\n }\n 50% { \n box-shadow: 0 6px 30px rgba(0, 0, 0, 0.2);\n }\n}\n\n.expanding {\n animation: liquid-expand 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.request-item.expanded {\n animation: liquid-glow 2s ease-in-out infinite;\n}\n\n/* 移动端响应式 */\n@media (max-width: 768px) {\n #network-debugger-panel.bottom-right,\n #network-debugger-panel.bottom-left,\n #network-debugger-panel.top-right,\n #network-debugger-panel.top-left {\n width: calc(100vw - 20px) !important;\n left: 10px !important;\n right: auto !important;\n /* 移动端清晰毛玻璃 */\n backdrop-filter: blur(15px) saturate(150%);\n -webkit-backdrop-filter: blur(15px) saturate(150%);\n }\n \n .request-item {\n padding: 12px;\n border-radius: 12px;\n }\n \n .debugger-header {\n padding: 10px 12px;\n }\n \n .debugger-controls {\n gap: 6px;\n }\n \n .debugger-btn {\n padding: 4px 8px;\n font-size: 10px;\n }\n \n /* 最小化时不应用全宽,保持小尺寸 */\n #network-debugger-panel.minimized {\n width: 180px !important;\n max-width: 180px !important;\n height: 40px !important;\n }\n}\n\n@media (max-width: 480px) {\n .request-header {\n flex-direction: column;\n gap: 8px;\n align-items: stretch;\n }\n \n .request-method,\n .request-status {\n align-self: flex-start;\n }\n \n .share-btn,\n .api-curl-btn {\n margin-left: 0;\n margin-top: 4px;\n }\n}\n\n/* iOS 26 风格滚动条 */\n#network-debugger-panel ::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n\n#network-debugger-panel ::-webkit-scrollbar-track {\n background: rgba(255, 255, 255, 0.05);\n border-radius: 4px;\n backdrop-filter: blur(5px);\n}\n\n#network-debugger-panel ::-webkit-scrollbar-thumb {\n background: linear-gradient(\n 135deg,\n rgba(255, 255, 255, 0.2),\n rgba(255, 255, 255, 0.1)\n );\n border-radius: 4px;\n border: 1px solid rgba(255, 255, 255, 0.1);\n backdrop-filter: blur(10px);\n transition: all 0.3s ease;\n}\n\n#network-debugger-panel ::-webkit-scrollbar-thumb:hover {\n background: linear-gradient(\n 135deg,\n rgba(255, 255, 255, 0.3),\n rgba(255, 255, 255, 0.15)\n );\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);\n}\n\n.resize-handle {\n position: absolute;\n background: transparent;\n}\n\n.resize-handle.n {\n top: -3px;\n left: 0;\n right: 0;\n height: 6px;\n cursor: ns-resize;\n}\n\n.resize-handle.s {\n bottom: -3px;\n left: 0;\n right: 0;\n height: 6px;\n cursor: ns-resize;\n}\n\n.resize-handle.e {\n top: 0;\n right: -3px;\n bottom: 0;\n width: 6px;\n cursor: ew-resize;\n}\n\n.resize-handle.w {\n top: 0;\n left: -3px;\n bottom: 0;\n width: 6px;\n cursor: ew-resize;\n}\n\n.resize-handle.ne {\n top: -3px;\n right: -3px;\n width: 12px;\n height: 12px;\n cursor: ne-resize;\n}\n\n.resize-handle.nw {\n top: -3px;\n left: -3px;\n width: 12px;\n height: 12px;\n cursor: nw-resize;\n}\n\n.resize-handle.se {\n bottom: -3px;\n right: -3px;\n width: 12px;\n height: 12px;\n cursor: se-resize;\n}\n\n.resize-handle.sw {\n bottom: -3px;\n left: -3px;\n width: 12px;\n height: 12px;\n cursor: sw-resize;\n}\n\n.debugger-reopen-btn {\n position: fixed;\n z-index: 999999;\n background: #4CAF50;\n color: #000;\n border: none;\n padding: 8px 10px;\n border-radius: 16px;\n font-weight: bold;\n font-size: 12px;\n box-shadow: 0 4px 12px rgba(0,0,0,0.25);\n cursor: pointer;\n}\n\n.debugger-reopen-btn:hover {\n filter: brightness(0.95);\n}\n";this.shadowRoot.appendChild(e);this.container=document.createElement("div");this.container.id="network-debugger-panel";this.container.className=`${this.config.position} ${this.config.minimized?"minimized":""}`;this.container.style.pointerEvents="auto";this.container.innerHTML='\n <div class="debugger-header">\n <div class="debugger-title">🔓 PWTK 解密小工具 <span style="font-size: 10px; opacity: 0.7;">by Leo</span></div>\n <div class="debugger-controls">\n <button class="debugger-btn" data-action="clear" title="清空"><svg class="debugger-icon" viewBox="0 0 24 24"><path fill="currentColor" d="M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"/></svg></button>\n <button class="debugger-btn" data-action="export" title="导出"><svg class="debugger-icon" viewBox="0 0 24 24"><path fill="currentColor" d="M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"/></svg></button>\n <button class="debugger-btn" data-action="fullscreen" title="全屏"><svg class="debugger-icon" viewBox="0 0 24 24"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"/></svg></button>\n <button class="debugger-btn" data-action="close" title="关闭"><svg class="debugger-icon" viewBox="0 0 24 24"><path fill="currentColor" d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg></button>\n </div>\n </div>\n <div class="debugger-content">\n <div class="debugger-panel-content">\n <div class="network-panel">\n <div class="request-list"></div>\n </div>\n </div>\n </div>\n ';this.addResizeHandles();this.shadowRoot.appendChild(this.container);document.body.appendChild(this.hostElement);this.networkTab=this.shadowRoot.querySelector(".network-panel")}addResizeHandles(){["n","s","e","w","ne","nw","se","sw"].forEach(e=>{const t=document.createElement("div");t.className=`resize-handle ${e}`;t.dataset.direction=e;this.container.appendChild(t)})}bindEvents(){const e=this.shadowRoot.querySelector(".debugger-header"),t=this.shadowRoot.querySelector(".debugger-controls");e.addEventListener("mousedown",e=>{if(e.target!==t&&!t.contains(e.target))this.startDrag(e)});t.addEventListener("click",e=>{e.stopPropagation();let n=e.target;for(;n&&n!==t&&!n.dataset?.action;)n=n.parentElement;const r=n?.dataset?.action;if(r)switch(r){case"clear":this.clearRequests();break;case"export":this.exportData();break;case"fullscreen":this.toggleFullscreen();break;case"close":this.hide()}});this.shadowRoot.querySelectorAll(".resize-handle").forEach(e=>{e.addEventListener("mousedown",t=>{t.stopPropagation();const n=e.dataset.direction||e.classList[1]||"se";this.startResize(t,n)})});document.addEventListener("mousemove",this.handleMouseMove.bind(this));document.addEventListener("mouseup",this.handleMouseUp.bind(this));window.addEventListener("resize",this.handleWindowResize.bind(this))}startListening(){this.interceptor.addListener(e=>{this.addRequestToUI(e)});this.requestsCache=this.interceptor.getRequests();this.renderRequests()}addRequestToUI(e){Fe.debug("[PWTK UI] Adding/updating request:",{id:e.id,url:e.url,hasResponse:!!e.responseBody,hasDecryptedRequest:!!e.decryptedRequest,hasDecryptedResponse:!!e.decryptedResponse,status:e.status});const t=this.requestsCache.findIndex(t=>t.id===e.id);if(t>=0)this.requestsCache[t]=e;else this.requestsCache.unshift(e);if(this.requestsCache.length>100)this.requestsCache=this.requestsCache.slice(0,100);this.renderRequests()}renderRequests(){const e=this.shadowRoot.querySelector(".request-list");if(e){e.innerHTML="";this.requestsCache.forEach(t=>{const n=this.createRequestItem(t);e.appendChild(n)})}}createRequestItem(e){const t=document.createElement("div");t.className="request-item";t.dataset.requestId=e.id;const n=this.getStatusClass(e.status),r=`method-${e.method.toLowerCase()}`;e.decryptedRequest||e.decryptedResponse;const i=e.error;t.innerHTML=`\n <div class="request-header">\n <span class="request-method ${r}">${e.method}</span>\n <span class="request-url" title="${e.url}">${this.truncateUrl(e.url)}</span>\n <span class="request-status ${n}">${e.status?e.status:void 0!==e.duration?"ERR":"Pending"}</span>\n ${i?'<span class="error-badge">⚠️</span>':""}\n <button class="share-btn" title="分享此请求 (by Leo)" onclick="event.stopPropagation()">分享链接</button>\n <button class="api-curl-btn" title="生成API请求 (by Leo)" onclick="event.stopPropagation()">API Curl</button>\n </div>\n <div class="request-info">\n <span>${new Date(e.timestamp).toLocaleTimeString()}</span>\n <span>${e.duration?`${e.duration}ms`:"Pending"}</span>\n </div>\n <div class="request-details">\n ${this.renderRequestDetails(e)}\n </div>\n `;t.addEventListener("click",e=>{const n=e.target;if(!(n.closest(".share-btn")||n.closest(".api-curl-btn")||n.closest('.detail-title[data-toggle="collapse"]')))t.classList.toggle("expanded")});const o=t.querySelector(".share-btn");if(o)o.addEventListener("click",async t=>{t.stopPropagation();await this.shareRequest(e)});const s=t.querySelector(".api-curl-btn");if(s)s.addEventListener("click",async t=>{t.stopPropagation();await this.generateApiCurl(e)});t.addEventListener("click",e=>{const t=e.target;if(t.closest('.detail-title[data-toggle="collapse"]')){e.stopPropagation();const n=t.closest(".detail-title").parentElement;if(n&&n.classList.contains("collapsible"))n.classList.toggle("collapsed")}},{capture:!0});return t}renderRequestDetails(e){let t="";e.id.replace(/[^a-zA-Z0-9]/g,"");if(e.decryptedRequest)t+=`\n <div class="detail-section">\n <div class="detail-title highlight">解密请求数据</div>\n <div class="detail-content">\n <div class="json-content">${this.formatData(e.decryptedRequest)}</div>\n </div>\n </div>\n `;if(e.decryptedResponse)t+=`\n <div class="detail-section">\n <div class="detail-title highlight">解密响应数据</div>\n <div class="detail-content">\n <div class="json-content">${this.formatData(e.decryptedResponse)}</div>\n </div>\n </div>\n `;if(Object.keys(e.headers).length>0)t+=`\n <div class="detail-section collapsible collapsed">\n <div class="detail-title clickable" data-toggle="collapse">\n <span class="collapse-icon">▼</span> 请求头 (${Object.keys(e.headers).length})\n </div>\n <div class="detail-content">\n <table class="headers-table">\n ${Object.entries(e.headers).map(([e,t])=>`<tr><td>${e}</td><td>${t}</td></tr>`).join("")}\n </table>\n </div>\n </div>\n `;if(e.responseHeaders&&Object.keys(e.responseHeaders).length>0)t+=`\n <div class="detail-section collapsible collapsed">\n <div class="detail-title clickable" data-toggle="collapse">\n <span class="collapse-icon">▼</span> 响应头 (${Object.keys(e.responseHeaders).length})\n </div>\n <div class="detail-content">\n <table class="headers-table">\n ${Object.entries(e.responseHeaders).map(([e,t])=>`<tr><td>${e}</td><td>${t}</td></tr>`).join("")}\n </table>\n </div>\n </div>\n `;if(e.requestBody)t+=`\n <div class="detail-section">\n <div class="detail-title">${e.decryptedRequest?"原始请求数据":"请求数据"}</div>\n <div class="detail-content">\n <div class="json-content">${this.formatData(e.requestBody)}</div>\n </div>\n </div>\n `;if(e.responseBody)t+=`\n <div class="detail-section">\n <div class="detail-title">${e.decryptedResponse?"原始响应数据":"响应数据"}</div>\n <div class="detail-content">\n <div class="json-content">${this.formatData(e.responseBody)}</div>\n </div>\n </div>\n `;if(e.error)t+=`\n <div class="detail-section">\n <div class="detail-title">错误信息</div>\n <div class="detail-content">\n <div class="json-content" style="color: #f44336;">${e.error}</div>\n </div>\n </div>\n `;return t}formatData(e){if("string"==typeof e)try{return Ie(JSON.parse(e))}catch{return e}return Ie(e)}getStatusClass(e){if(!e)return"status-error";if(e>=200&&e<300)return"status-2xx";if(e>=300&&e<400)return"status-3xx";if(e>=400&&e<500)return"status-4xx";if(e>=500)return"status-5xx";else return"status-error"}truncateUrl(e){const t=e.indexOf("?");if(t>-1)return e.substring(0,t);else return e}clearRequests(){this.requestsCache=[];this.interceptor.clearRequests();this.renderRequests()}exportData(){const e={timestamp:(new Date).toISOString(),requests:this.requestsCache,userAgent:navigator.userAgent,url:window.location.href,creator:"PWTK Network Debugger by Leo (@leeguoo)"},t=new Blob([JSON.stringify(e,null,2)],{type:"application/json"}),n=URL.createObjectURL(t),r=document.createElement("a");r.href=n;r.download=`network-debug-${Date.now()}.json`;r.click();URL.revokeObjectURL(n)}async shareRequest(e){try{const t=await $e(e);if(t){if(await je(t))alert(`分享链接已复制到剪贴板!\n${t}\n\nCreated by Leo (@leeguoo)`);else prompt("分享链接已创建,请手动复制:\n\nCreated by Leo (@leeguoo)",t)}else throw new Error("无法创建分享链接")}catch(t){Fe.error("分享失败:",t);alert("分享失败,请稍后重试")}}async generateApiCurl(e){try{const t=function(e){let t="https://api.httpmisonote.com";try{const n=new URL(e.url);if(n.pathname&&"/"!==n.pathname){let e=n.pathname;const r=e.indexOf("/api/");if(-1!==r)e=e.substring(r);else if(e.includes("/api")){const t=e.indexOf("/api");e=e.substring(t)}t+=e}}catch(i){console.warn("Unable to parse original URL:",e.url)}const n=e.decryptedRequest||e.requestBody;if("GET"===e.method&&n)try{let e={};if("string"==typeof n)e=JSON.parse(n);else e=n;const r=new URLSearchParams;Object.entries(e).forEach(([e,t])=>{r.append(e,String(t))});if(r.toString())t+="?"+r.toString()}catch(i){if("string"==typeof n&&n.trim())t+="?"+n}let r=`curl --location '${t}'`;if("GET"!==e.method)r+=` --request ${e.method}`;if(e.headers){const t=["cookie","set-cookie","session","sessionid","x-session"];Object.entries(e.headers).forEach(([e,n])=>{if(!t.some(t=>e.toLowerCase().includes(t.toLowerCase())))r+=` --header '${e}: ${n}'`})}if(!e.headers||!Object.keys(e.headers).some(e=>e.toLowerCase().includes("authorization")||e.toLowerCase().includes("auth")))r+=" --header 'X-API-Key: test-api-key-123'";if("GET"!==e.method&&n){const e="string"==typeof n?n:JSON.stringify(n);r+=` --data '${e}'`}return r}(e);if(await je(t))alert("API cURL命令已复制到剪贴板!\n适用于 httpmisonote.com API\n\nCreated by Leo (@leeguoo)");else prompt("API cURL命令已生成,请手动复制:\n\nCreated by Leo (@leeguoo)",t)}catch(t){Fe.error("生成API cURL失败:",t);alert("生成API cURL失败,请稍后重试")}}toggleFullscreen(){if(this.container.classList.contains("fullscreen")){this.container.classList.remove("fullscreen");this.container.style.top="";this.container.style.left="";this.container.style.width="";this.container.style.height="";this.loadPosition()}else{this.container.classList.add("fullscreen");this.container.style.top="0";this.container.style.left="0";this.container.style.width="100vw";this.container.style.height="100vh";this.container.style.right="auto";this.container.style.bottom="auto"}}startDrag(e){this.isDragging=!0;this.dragStart={x:e.clientX,y:e.clientY};this.container.style.transition="none"}startResize(e,t){this.isResizing=!0;this.resizeDirection=t;this.dragStart={x:e.clientX,y:e.clientY};this.container.style.transition="none"}handleMouseMove(e){if(this.isDragging){const t=e.clientX-this.dragStart.x,n=e.clientY-this.dragStart.y,r=this.container.getBoundingClientRect();this.container.style.left=`${r.left+t}px`;this.container.style.top=`${r.top+n}px`;this.dragStart={x:e.clientX,y:e.clientY}}if(this.isResizing){const t=this.resizeDirection;if(!t)return;const n=e.clientX-this.dragStart.x,r=e.clientY-this.dragStart.y,i=this.container.getBoundingClientRect(),o=300,s=200;let a=i.width,c=i.height,l=i.left,d=i.top;if(t.includes("e")){a=Math.max(o,i.width+n);this.container.style.width=`${a}px`}if(t.includes("s")){c=Math.max(s,i.height+r);this.container.style.height=`${c}px`}if(t.includes("w")){a=Math.max(o,i.width-n);if(a>o){l=i.left+n;this.container.style.width=`${a}px`;this.container.style.left=`${l}px`}}if(t.includes("n")){c=Math.max(s,i.height-r);if(c>s){d=i.top+r;this.container.style.height=`${c}px`;this.container.style.top=`${d}px`}}this.dragStart={x:e.clientX,y:e.clientY}}}handleMouseUp(){if(this.isDragging||this.isResizing){this.container.style.transition="all 0.3s ease";if(this.isDragging)this.savePosition()}this.isDragging=!1;this.isResizing=!1;this.resizeDirection=""}handleWindowResize(){if(this.resizeTimeout)clearTimeout(this.resizeTimeout);this.resizeTimeout=window.setTimeout(()=>{this.adjustPositionForWindowResize()},100)}adjustPositionForWindowResize(){const e=this.container.getBoundingClientRect(),t=window.innerWidth,n=window.innerHeight;let r=!1,i=e.left,o=e.top,s=e.width,a=e.height;if(e.right>t){i=t-e.width;r=!0}if(e.bottom>n){o=n-e.height;r=!0}if(i<0){i=0;r=!0}if(o<0){o=0;r=!0}if(e.width>t){s=t-20;i=10;r=!0}if(e.height>n){a=n-20;o=10;r=!0}if(r){this.container.style.left=`${i}px`;this.container.style.top=`${o}px`;this.container.style.right="auto";this.container.style.bottom="auto";if(e.width>t||e.height>n){this.container.style.width=`${s}px`;this.container.style.height=`${a}px`}this.savePosition()}}show(){this.hostElement.style.display="block";this.config.isClosed=!1;this.saveConfig();this.removeReopenButton()}hide(){this.hostElement.style.display="none";this.config.isClosed=!0;this.saveConfig();this.createReopenButton()}createReopenButton(){if(document.getElementById("network-debugger-reopen-btn"))return;const e=document.createElement("button");e.id="network-debugger-reopen-btn";e.title="打开调试面板 (可拖动)";e.textContent="PWTK";e.style.cssText="\n position: fixed;\n z-index: 999999;\n background: #4CAF50;\n color: #000;\n border: none;\n padding: 8px 10px;\n border-radius: 16px;\n font-weight: bold;\n font-size: 12px;\n box-shadow: 0 4px 12px rgba(0,0,0,0.25);\n cursor: pointer;\n transition: filter 0.2s;\n ";const t=this.config.position||"bottom-right";if(t.includes("bottom"))e.style.bottom="20px";else e.style.top="20px";if(t.includes("right"))e.style.right="20px";else e.style.left="20px";let n=!1,r={x:0,y:0},i=null;e.addEventListener("mousedown",t=>{if(0===t.button){n=!1;r={x:t.clientX,y:t.clientY};e.style.transition="none";i=window.setTimeout(()=>{n=!0;e.style.cursor="grabbing"},150);document.addEventListener("mousemove",o);document.addEventListener("mouseup",s);t.preventDefault()}});const o=t=>{if(!n)return;const i=t.clientX-r.x,o=t.clientY-r.y,s=e.getBoundingClientRect(),a=s.left+i,c=s.top+o,l=window.innerWidth-s.width,d=window.innerHeight-s.height,p=Math.max(0,Math.min(l,a)),u=Math.max(0,Math.min(d,c));e.style.position="fixed";e.style.left=`${p}px`;e.style.top=`${u}px`;e.style.right="auto";e.style.bottom="auto";r={x:t.clientX,y:t.clientY}},s=()=>{if(i){clearTimeout(i);i=null}if(n){n=!1;e.style.cursor="pointer";e.style.transition="filter 0.2s"}else this.show();document.removeEventListener("mousemove",o);document.removeEventListener("mouseup",s)};e.addEventListener("mouseenter",()=>{e.style.filter="brightness(0.95)"});e.addEventListener("mouseleave",()=>{e.style.filter="brightness(1)"});document.body.appendChild(e)}removeReopenButton(){const e=document.getElementById("network-debugger-reopen-btn");if(e)e.remove()}destroy(){this.hostElement.remove();this.removeReopenButton()}loadConfig(){try{const t=localStorage.getItem(e.STORAGE_KEY);if(t){const e=JSON.parse(t);Fe.debug("加载保存的配置:",e);return e}}catch(t){Fe.error("加载配置失败:",t)}return{}}saveConfig(){try{const t={position:this.config.position,theme:this.config.theme,minimized:this.config.minimized,isClosed:this.config.isClosed};localStorage.setItem(e.STORAGE_KEY,JSON.stringify(t));Fe.debug("配置已保存:",t)}catch(t){Fe.error("保存配置失败:",t)}}loadPosition(){try{const t=`${e.STORAGE_KEY}-position`,n=localStorage.getItem(t);if(n){const e=JSON.parse(n);if(void 0!==e.left)this.container.style.left=e.left+"px";if(void 0!==e.top)this.container.style.top=e.top+"px";if(void 0!==e.right)this.container.style.right=e.right+"px";if(void 0!==e.bottom)this.container.style.bottom=e.bottom+"px";Fe.debug("加载保存的位置:",e)}}catch(t){Fe.error("加载位置失败:",t)}}savePosition(){try{const t=`${e.STORAGE_KEY}-position`,n=this.container.getBoundingClientRect(),r={left:n.left,top:n.top,right:window.innerWidth-n.right,bottom:window.innerHeight-n.bottom};localStorage.setItem(t,JSON.stringify(r));Fe.debug("位置已保存:",r)}catch(t){Fe.error("保存位置失败:",t)}}};Xe.STORAGE_KEY="pwtk-debugger-config";let Je=Xe;class Ge{constructor(){this.interceptor=null;this.panel=null;this.wasmLoader=null;this.config={};this.initialized=!1}async init(e={}){if(!this.initialized){this.config={autoStart:!0,position:"bottom-right",theme:"dark",minimized:!1,showConsole:!0,wasm:{enabled:!0,...e.wasm},decrypt:{enabled:!0,autoFetchKeys:!0,keyApiUrl:"https://gw-card-pay.buyacard.cc/ip/getSK",...e.decrypt},log:{toBrowserConsole:!1,level:"info",...e.log},...e};Fe.configure({enableBrowserConsole:this.config.log?.toBrowserConsole||!1,logLevel:this.config.log?.level||"info"});try{if(!1!==this.config.wasm?.enabled){Fe.info("[PWTK Init] Starting WASM initialization");this.wasmLoader=new Ne;if(await this.wasmLoader.loadWasm(this.config.wasm?.wasmUrl,this.config.wasm?.jsUrl))Fe.info("[PWTK Init] ✅ WASM decrypt function ready");else Fe.warn("[PWTK Init] ⚠️ WASM load failed or decrypt function unavailable, will rely on page-provided decryption")}else Fe.info("[PWTK Init] WASM disabled in config");this.interceptor=new Ue;if(this.config.decrypt?.enabled)this.interceptor.enableDecryption({keyExtractor:this.config.decrypt.keyExtractor||this.defaultKeyExtractor,slkExtractor:this.config.decrypt.slkExtractor||this.defaultSlkExtractor,autoFetchKeys:this.config.decrypt.autoFetchKeys,keyApiUrl:this.config.decrypt.keyApiUrl});if(!1!==this.config.autoStart)this.createPanel();this.initialized=!0;Fe.consoleDirect("\n╔════════════════════════════════════════╗\n║ 🔓 PWTK 解密小工具 v1.2.49-beta.2 ║\n║ Created by Leo (@leeguoo) ║\n║ 技术支持: 请联系 Leo ║ \n║ 分享服务: curl.bwg.leeguoo.com ║\n╚════════════════════════════════════════╝\n ");Fe.info("🔍 NetworkDebugger initialized successfully")}catch(t){Fe.error("NetworkDebugger initialization failed:",t);throw t}}else Fe.warn("NetworkDebugger already initialized")}show(){if(this.initialized)if(!this.panel)this.createPanel();else this.panel.show();else Fe.error("NetworkDebugger not initialized. Call init() first.")}hide(){if(this.panel)this.panel.hide()}destroy(){if(this.panel){this.panel.destroy();this.panel=null}this.initialized=!1;Fe.info("NetworkDebugger destroyed")}getRequests(){return this.interceptor?.getRequests()||[]}clearRequests(){this.interceptor?.clearRequests()}exportData(){return{timestamp:(new Date).toISOString(),requests:this.getRequests(),config:this.config,userAgent:navigator.userAgent,url:window.location.href,author:"Leo (@leeguoo)",tool:"@leeguoo/network-debugger"}}isWasmLoaded(){return this.wasmLoader?.isLoaded()||!1}isInitialized(){return this.initialized}async checkForUpdates(){try{const e="1.2.49-beta.2";Fe.info(`[PWTK Update] Checking for updates... Current version: ${e}`);const t=await fetch("https://registry.npmjs.org/@leeguoo/pwtk-network-debugger/latest"),n=(await t.json()).version,r=this.compareVersions(e,n)<0;if(r)Fe.info(`[PWTK Update] ✅ New version available: ${n} (current: ${e})`);else Fe.info(`[PWTK Update] ✅ Already using latest version: ${e}`);return{hasUpdate:r,latestVersion:r?n:void 0,currentVersion:e}}catch(e){Fe.error("[PWTK Update] Failed to check for updates:",e);return{hasUpdate:!1,currentVersion:"1.2.49-beta.2"}}}async autoUpdate(e=!1){try{const t=await this.checkForUpdates();if(!t.hasUpdate){Fe.info("[PWTK Update] Already using latest version");return!1}Fe.info(`[PWTK Update] Auto-updating to version ${t.latestVersion}...`);const n={...this.config};this.destroy();if(Ye===this){Ye=null;if("undefined"!=typeof window)delete window.NetworkDebugger}if(e){Fe.info("[PWTK Update] Reloading page to apply update...");window.location.reload();return!0}const r=document.createElement("script");r.src=`https://unpkg.com/@leeguoo/pwtk-network-debugger@${t.latestVersion}/dist/index.js`;return new Promise((e,i)=>{r.onload=async()=>{try{Fe.info("[PWTK Update] ✅ Script loaded, reinitializing with previous config...");setTimeout(async()=>{try{if(window.NetworkDebugger&&window.NetworkDebugger.init){await window.NetworkDebugger.init(n);Fe.info(`[PWTK Update] ✅ Successfully updated to version ${t.latestVersion}`);e(!0)}else throw new Error("New version not properly loaded")}catch(r){Fe.error("[PWTK Update] ❌ Failed to initialize new version:",r);i(r)}},100)}catch(r){i(r)}};r.onerror=()=>{Fe.error("[PWTK Update] ❌ Failed to load updated version");i(new Error("Failed to load updated version"))};document.head.appendChild(r)})}catch(t){Fe.error("[PWTK Update] Auto-update failed:",t);return!1}}compareVersions(e,t){const n=e.split(".").map(Number),r=t.split(".").map(Number),i=Math.max(n.length,r.length);for(let o=0;o<i;o++){const e=n[o]||0,t=r[o]||0;if(e<t)return-1;if(e>t)return 1}return 0}static create(e){const t=new Ge;return t.init(e).then(()=>t)}createPanel(){if(this.interceptor)this.panel=new Je(this.interceptor,{position:this.config.position,theme:this.config.theme,minimized:this.config.minimized,showConsole:this.config.showConsole});else Fe.error("Cannot create panel: interceptor not initialized")}defaultKeyExtractor(e){return e.keys||e.cid||e["x-api-key"]||""}defaultSlkExtractor(e){return e.slk||e["x-slk"]||""}}let Ye=null;const Ve={async init(e){if(Ye){Fe.warn("NetworkDebugger already has a global instance");return Ye}Ye=await Ge.create(e);if("undefined"!=typeof window)window.NetworkDebugger=Ye;return Ye},show(){Ye?.show()},hide(){Ye?.hide()},destroy(){Ye?.destroy();Ye=null;if("undefined"!=typeof window)delete window.NetworkDebugger},getInstance:()=>Ye,checkForUpdates:async()=>Ye?.checkForUpdates()||{hasUpdate:!1,currentVersion:"unknown"},autoUpdate:async(e=!1)=>Ye?.autoUpdate(e)||!1};if("undefined"!=typeof window){window.NetworkDebugger=Ve;if(!window.NetworkDebugger.default)window.NetworkDebugger.default=Ve}e.DebugPanel=Je;e.NetworkDebugger=Ge;e.NetworkInterceptor=Ue;e.WasmLoader=Ne;e.default=Ve;Object.defineProperties(e,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
|