tasmota-webserial-esptool 9.1.9 → 9.2.0

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.
@@ -97,6 +97,7 @@ export declare class ESPLoader extends EventTarget {
97
97
  state_RTS: boolean;
98
98
  setRTS(state: boolean): Promise<void>;
99
99
  setDTR(state: boolean): Promise<void>;
100
+ setDTRandRTS(dtr: boolean, rts: boolean): Promise<void>;
100
101
  /**
101
102
  * @name hardResetUSBJTAGSerial
102
103
  * USB-JTAG/Serial reset for Web Serial (Desktop)
@@ -104,9 +105,14 @@ export declare class ESPLoader extends EventTarget {
104
105
  hardResetUSBJTAGSerial(): Promise<void>;
105
106
  /**
106
107
  * @name hardResetClassic
107
- * Classic reset for Web Serial (Desktop)
108
+ * Classic reset for Web Serial (Desktop) DTR = IO0, RTS = EN
108
109
  */
109
110
  hardResetClassic(): Promise<void>;
111
+ /**
112
+ * @name hardResetUnixTight
113
+ * Unix Tight reset for Web Serial (Desktop) - sets DTR and RTS simultaneously
114
+ */
115
+ hardResetUnixTight(): Promise<void>;
110
116
  setRTSWebUSB(state: boolean): Promise<void>;
111
117
  setDTRWebUSB(state: boolean): Promise<void>;
112
118
  setDTRandRTSWebUSB(dtr: boolean, rts: boolean): Promise<void>;
@@ -523,6 +523,14 @@ export class ESPLoader extends EventTarget {
523
523
  this.state_DTR = state;
524
524
  await this.port.setSignals({ dataTerminalReady: state });
525
525
  }
526
+ async setDTRandRTS(dtr, rts) {
527
+ this.state_DTR = dtr;
528
+ this.state_RTS = rts;
529
+ await this.port.setSignals({
530
+ dataTerminalReady: dtr,
531
+ requestToSend: rts,
532
+ });
533
+ }
526
534
  /**
527
535
  * @name hardResetUSBJTAGSerial
528
536
  * USB-JTAG/Serial reset for Web Serial (Desktop)
@@ -544,7 +552,7 @@ export class ESPLoader extends EventTarget {
544
552
  }
545
553
  /**
546
554
  * @name hardResetClassic
547
- * Classic reset for Web Serial (Desktop)
555
+ * Classic reset for Web Serial (Desktop) DTR = IO0, RTS = EN
548
556
  */
549
557
  async hardResetClassic() {
550
558
  await this.setDTR(false); // IO0=HIGH
@@ -556,6 +564,21 @@ export class ESPLoader extends EventTarget {
556
564
  await this.setDTR(false); // IO0=HIGH, done
557
565
  await this.sleep(200);
558
566
  }
567
+ /**
568
+ * @name hardResetUnixTight
569
+ * Unix Tight reset for Web Serial (Desktop) - sets DTR and RTS simultaneously
570
+ */
571
+ async hardResetUnixTight() {
572
+ await this.setDTRandRTS(true, true);
573
+ await this.setDTRandRTS(false, false);
574
+ await this.setDTRandRTS(false, true); // IO0=HIGH & EN=LOW, chip in reset
575
+ await this.sleep(100);
576
+ await this.setDTRandRTS(true, false); // IO0=LOW & EN=HIGH, chip out of reset
577
+ await this.sleep(50);
578
+ await this.setDTRandRTS(false, false); // IO0=HIGH, done
579
+ await this.setDTR(false); // Needed in some environments to ensure IO0=HIGH
580
+ await this.sleep(200);
581
+ }
559
582
  // ============================================================================
560
583
  // WebUSB (Android) - DTR/RTS Signal Handling & Reset Strategies
561
584
  // ============================================================================
@@ -745,10 +768,11 @@ export class ESPLoader extends EventTarget {
745
768
  const resetStrategies = [];
746
769
  // eslint-disable-next-line @typescript-eslint/no-this-alias
747
770
  const self = this;
771
+ // Detect if this is a USB-Serial chip (needs different sync approach)
772
+ const isUSBSerialChip = !isUSBJTAGSerial && !isEspressifUSB;
748
773
  // WebUSB (Android) uses different reset methods than Web Serial (Desktop)
749
774
  if (this.isWebUSB()) {
750
775
  // For USB-Serial chips (CP2102, CH340, etc.), try inverted strategies first
751
- const isUSBSerialChip = !isUSBJTAGSerial && !isEspressifUSB;
752
776
  // Detect specific chip types once
753
777
  const isCP2102 = portInfo.usbVendorId === 0x10c4;
754
778
  const isCH34x = portInfo.usbVendorId === 0x1a86;
@@ -966,11 +990,11 @@ export class ESPLoader extends EventTarget {
966
990
  },
967
991
  });
968
992
  }
969
- // Strategy: Classic reset
993
+ // Strategy: UnixTight reset
970
994
  resetStrategies.push({
971
- name: "Classic",
995
+ name: "UnixTight",
972
996
  fn: async function () {
973
- return await self.hardResetClassic();
997
+ return await self.hardResetUnixTight();
974
998
  },
975
999
  });
976
1000
  // Strategy: USB-JTAG/Serial fallback
@@ -995,15 +1019,38 @@ export class ESPLoader extends EventTarget {
995
1019
  // Clear abandon flag before starting new strategy
996
1020
  this._abandonCurrentOperation = false;
997
1021
  await strategy.fn();
998
- // Try to sync after reset with internally time-bounded sync (3 seconds per strategy)
999
- const syncSuccess = await this.syncWithTimeout(3000);
1000
- if (syncSuccess) {
1001
- // Sync succeeded
1002
- this.logger.log(`Connected successfully with ${strategy.name} reset.`);
1003
- return;
1022
+ // Try to sync after reset
1023
+ // USB-Serial / native USB chips needs different sync approaches
1024
+ if (isUSBSerialChip) {
1025
+ // USB-Serial chips: Use timeout strategy (2 seconds)
1026
+ // this.logger.log(`USB-Serial chip detected, using sync with timeout.`);
1027
+ const syncSuccess = await this.syncWithTimeout(2000);
1028
+ if (syncSuccess) {
1029
+ // Sync succeeded
1030
+ this.logger.log(`Connected USB Serial successfully with ${strategy.name} reset.`);
1031
+ return;
1032
+ }
1033
+ else {
1034
+ throw new Error("Sync timeout or abandoned");
1035
+ }
1004
1036
  }
1005
1037
  else {
1006
- throw new Error("Sync timeout or abandoned");
1038
+ // Native USB chips
1039
+ // Note: We use Promise.race with sync() directly instead of syncWithTimeout()
1040
+ // because syncWithTimeout causes CDC/JTAG devices to hang for unknown reasons.
1041
+ // The abandon flag in readPacket() prevents overlapping I/O.
1042
+ // this.logger.log(`Native USB chip detected, using CDC/JTAG sync.`);
1043
+ const syncPromise = this.sync();
1044
+ const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error("Sync timeout")), 1000));
1045
+ try {
1046
+ await Promise.race([syncPromise, timeoutPromise]);
1047
+ // Sync succeeded
1048
+ this.logger.log(`Connected CDC/JTAG successfully with ${strategy.name} reset.`);
1049
+ return;
1050
+ }
1051
+ catch (error) {
1052
+ throw new Error("Sync timeout or abandoned");
1053
+ }
1007
1054
  }
1008
1055
  }
1009
1056
  catch (error) {
package/dist/web/index.js CHANGED
@@ -1 +1 @@
1
- const t=t=>{let e=[192];for(const i of t)219==i?e=e.concat([219,221]):192==i?e=e.concat([219,220]):e.push(i);return e.push(192),e},e=t=>{const e=[];for(let i=0;i<t.length;i++){const a=t.charCodeAt(i);a<=255&&e.push(a)}return e},i=t=>"["+t.map(t=>a(t)).join(", ")+"]",a=(t,e=2)=>{const i=t.toString(16).toUpperCase();return i.startsWith("-")?"-0x"+i.substring(1).padStart(e,"0"):"0x"+i.padStart(e,"0")},s=t=>new Promise(e=>setTimeout(e,t)),r={18:"256KB",19:"512KB",20:"1MB",21:"2MB",22:"4MB",23:"8MB",24:"16MB",25:"32MB",26:"64MB",27:"128MB",28:"256MB",32:"64MB",33:"128MB",34:"256MB",50:"256KB",51:"512KB",52:"1MB",53:"2MB",54:"4MB",55:"8MB",56:"16MB",57:"32MB",58:"64MB"},n=4096,h=115200,o=1343410176,l=e(" UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU"),d=33382,u=50,c=12882,_=12883,f=12994,g=12995,p=12997,w=12998,m=207969,b=12914,S=12916,y=12917,B=12928,v=12849,R={5:{name:"ESP32-C3",family:g},9:{name:"ESP32-S3",family:_},12:{name:"ESP32-C2",family:f},13:{name:"ESP32-C6",family:w},16:{name:"ESP32-H2",family:b},18:{name:"ESP32-P4",family:B},20:{name:"ESP32-C61",family:m},23:{name:"ESP32-C5",family:p},25:{name:"ESP32-H21",family:y},28:{name:"ESP32-H4",family:S},32:{name:"ESP32-S31",family:v}},U={4293968129:{name:"ESP8266",family:d},15736195:{name:"ESP32",family:u},1990:{name:"ESP32-S2",family:c}},I=2,T=3,x=4,D=5,k=6,C=7,F=8,z=9,W=10,O=208,A=209,E=210,$=11,M=13,P=15,L=19,N=20,Z=239,V=16,H=17,j=18,G=5,J=2048,q=6144,K=3e3,Y=15e4,X=3e5,Q=100,tt=3e4,et=500,it=100,at=(t,e)=>{const i=Math.floor(t*(e/486));return i<K?K:i},st=t=>{switch(t){case u:return{regBase:1072963584,baseFuse:1073061888,macFuse:1073061888,usrOffs:28,usr1Offs:32,usr2Offs:36,mosiDlenOffs:40,misoDlenOffs:44,w0Offs:128,uartDateReg:1610612856,flashOffs:4096};case c:return{regBase:1061167104,baseFuse:1061265408,macFuse:1061265476,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612856,flashOffs:4096};case _:return{regBase:1610620928,usrOffs:24,baseFuse:1610641408,macFuse:1610641476,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612864,flashOffs:0};case d:return{regBase:1610613248,usrOffs:28,baseFuse:1072693328,macFuse:1072693328,usr1Offs:32,usr2Offs:36,mosiDlenOffs:-1,misoDlenOffs:-1,w0Offs:64,uartDateReg:1610612856,flashOffs:0};case f:case g:return{regBase:1610620928,baseFuse:1610647552,macFuse:1610647620,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612860,flashOffs:0};case p:return{regBase:1610625024,baseFuse:1611352064,macFuse:1611352132,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612860,flashOffs:8192};case w:return{regBase:1610625024,baseFuse:1611335680,macFuse:1611335748,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612860,flashOffs:0};case m:return{regBase:1610625024,baseFuse:1611352064,macFuse:1611352132,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612860,flashOffs:0};case b:return{regBase:1610625024,baseFuse:1611335680,macFuse:1611335748,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612860,flashOffs:0};case S:return{regBase:1611239424,baseFuse:1611339776,macFuse:1611339844,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610686588,flashOffs:8192};case y:return{regBase:1610625024,baseFuse:1611350016,macFuse:1611350084,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612860,flashOffs:0};case B:return{regBase:1342754816,baseFuse:o,macFuse:1343410244,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1343004812,flashOffs:8192};case v:return{regBase:542113792,baseFuse:544296960,macFuse:544297028,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:540582028,flashOffs:8192};default:return{regBase:-1,baseFuse:-1,macFuse:-1,usrOffs:-1,usr1Offs:-1,usr2Offs:-1,mosiDlenOffs:-1,misoDlenOffs:-1,w0Offs:-1,uartDateReg:-1,flashOffs:-1}}};class rt extends Error{constructor(t){super(t),this.name="SlipReadError"}}const nt=async(t,i)=>{let a;if(t==S||t==y||t==v)return null;if(t==u)a=await import("./esp32-BRKoi17y.js");else if(t==c)a=await import("./esp32s2-iX3WoDbg.js");else if(t==_)a=await import("./esp32s3-DGwDVIgz.js");else if(t==d)a=await import("./esp8266-CUwxJpGa.js");else if(t==f)a=await import("./esp32c2-Btgr_lwh.js");else if(t==g)a=await import("./esp32c3-CHKfoI8W.js");else if(t==p)a=await import("./esp32c5-BDW4KtLo.js");else if(t==w)a=await import("./esp32c6-il8tTxAG.js");else if(t==m)a=await import("./esp32c61-thKzxBGf.js");else if(t==b)a=await import("./esp32h2-CxoUHv_P.js");else{if(t!=B)return null;a=null!=i&&i>=300?await import("./esp32p4r3-CqI71ojR.js"):await import("./esp32p4-D3jLP-jY.js")}return{...a,text:e(atob(a.text)),data:e(atob(a.data))}};function ht(t){let e=t.length;for(;--e>=0;)t[e]=0}const ot=256,lt=286,dt=30,ut=15,ct=new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]),_t=new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]),ft=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]),gt=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),pt=new Array(576);ht(pt);const wt=new Array(60);ht(wt);const mt=new Array(512);ht(mt);const bt=new Array(256);ht(bt);const St=new Array(29);ht(St);const yt=new Array(dt);function Bt(t,e,i,a,s){this.static_tree=t,this.extra_bits=e,this.extra_base=i,this.elems=a,this.max_length=s,this.has_stree=t&&t.length}let vt,Rt,Ut;function It(t,e){this.dyn_tree=t,this.max_code=0,this.stat_desc=e}ht(yt);const Tt=t=>t<256?mt[t]:mt[256+(t>>>7)],xt=(t,e)=>{t.pending_buf[t.pending++]=255&e,t.pending_buf[t.pending++]=e>>>8&255},Dt=(t,e,i)=>{t.bi_valid>16-i?(t.bi_buf|=e<<t.bi_valid&65535,xt(t,t.bi_buf),t.bi_buf=e>>16-t.bi_valid,t.bi_valid+=i-16):(t.bi_buf|=e<<t.bi_valid&65535,t.bi_valid+=i)},kt=(t,e,i)=>{Dt(t,i[2*e],i[2*e+1])},Ct=(t,e)=>{let i=0;do{i|=1&t,t>>>=1,i<<=1}while(--e>0);return i>>>1},Ft=(t,e,i)=>{const a=new Array(16);let s,r,n=0;for(s=1;s<=ut;s++)n=n+i[s-1]<<1,a[s]=n;for(r=0;r<=e;r++){let e=t[2*r+1];0!==e&&(t[2*r]=Ct(a[e]++,e))}},zt=t=>{let e;for(e=0;e<lt;e++)t.dyn_ltree[2*e]=0;for(e=0;e<dt;e++)t.dyn_dtree[2*e]=0;for(e=0;e<19;e++)t.bl_tree[2*e]=0;t.dyn_ltree[512]=1,t.opt_len=t.static_len=0,t.sym_next=t.matches=0},Wt=t=>{t.bi_valid>8?xt(t,t.bi_buf):t.bi_valid>0&&(t.pending_buf[t.pending++]=t.bi_buf),t.bi_buf=0,t.bi_valid=0},Ot=(t,e,i,a)=>{const s=2*e,r=2*i;return t[s]<t[r]||t[s]===t[r]&&a[e]<=a[i]},At=(t,e,i)=>{const a=t.heap[i];let s=i<<1;for(;s<=t.heap_len&&(s<t.heap_len&&Ot(e,t.heap[s+1],t.heap[s],t.depth)&&s++,!Ot(e,a,t.heap[s],t.depth));)t.heap[i]=t.heap[s],i=s,s<<=1;t.heap[i]=a},Et=(t,e,i)=>{let a,s,r,n,h=0;if(0!==t.sym_next)do{a=255&t.pending_buf[t.sym_buf+h++],a+=(255&t.pending_buf[t.sym_buf+h++])<<8,s=t.pending_buf[t.sym_buf+h++],0===a?kt(t,s,e):(r=bt[s],kt(t,r+ot+1,e),n=ct[r],0!==n&&(s-=St[r],Dt(t,s,n)),a--,r=Tt(a),kt(t,r,i),n=_t[r],0!==n&&(a-=yt[r],Dt(t,a,n)))}while(h<t.sym_next);kt(t,256,e)},$t=(t,e)=>{const i=e.dyn_tree,a=e.stat_desc.static_tree,s=e.stat_desc.has_stree,r=e.stat_desc.elems;let n,h,o,l=-1;for(t.heap_len=0,t.heap_max=573,n=0;n<r;n++)0!==i[2*n]?(t.heap[++t.heap_len]=l=n,t.depth[n]=0):i[2*n+1]=0;for(;t.heap_len<2;)o=t.heap[++t.heap_len]=l<2?++l:0,i[2*o]=1,t.depth[o]=0,t.opt_len--,s&&(t.static_len-=a[2*o+1]);for(e.max_code=l,n=t.heap_len>>1;n>=1;n--)At(t,i,n);o=r;do{n=t.heap[1],t.heap[1]=t.heap[t.heap_len--],At(t,i,1),h=t.heap[1],t.heap[--t.heap_max]=n,t.heap[--t.heap_max]=h,i[2*o]=i[2*n]+i[2*h],t.depth[o]=(t.depth[n]>=t.depth[h]?t.depth[n]:t.depth[h])+1,i[2*n+1]=i[2*h+1]=o,t.heap[1]=o++,At(t,i,1)}while(t.heap_len>=2);t.heap[--t.heap_max]=t.heap[1],((t,e)=>{const i=e.dyn_tree,a=e.max_code,s=e.stat_desc.static_tree,r=e.stat_desc.has_stree,n=e.stat_desc.extra_bits,h=e.stat_desc.extra_base,o=e.stat_desc.max_length;let l,d,u,c,_,f,g=0;for(c=0;c<=ut;c++)t.bl_count[c]=0;for(i[2*t.heap[t.heap_max]+1]=0,l=t.heap_max+1;l<573;l++)d=t.heap[l],c=i[2*i[2*d+1]+1]+1,c>o&&(c=o,g++),i[2*d+1]=c,d>a||(t.bl_count[c]++,_=0,d>=h&&(_=n[d-h]),f=i[2*d],t.opt_len+=f*(c+_),r&&(t.static_len+=f*(s[2*d+1]+_)));if(0!==g){do{for(c=o-1;0===t.bl_count[c];)c--;t.bl_count[c]--,t.bl_count[c+1]+=2,t.bl_count[o]--,g-=2}while(g>0);for(c=o;0!==c;c--)for(d=t.bl_count[c];0!==d;)u=t.heap[--l],u>a||(i[2*u+1]!==c&&(t.opt_len+=(c-i[2*u+1])*i[2*u],i[2*u+1]=c),d--)}})(t,e),Ft(i,l,t.bl_count)},Mt=(t,e,i)=>{let a,s,r=-1,n=e[1],h=0,o=7,l=4;for(0===n&&(o=138,l=3),e[2*(i+1)+1]=65535,a=0;a<=i;a++)s=n,n=e[2*(a+1)+1],++h<o&&s===n||(h<l?t.bl_tree[2*s]+=h:0!==s?(s!==r&&t.bl_tree[2*s]++,t.bl_tree[32]++):h<=10?t.bl_tree[34]++:t.bl_tree[36]++,h=0,r=s,0===n?(o=138,l=3):s===n?(o=6,l=3):(o=7,l=4))},Pt=(t,e,i)=>{let a,s,r=-1,n=e[1],h=0,o=7,l=4;for(0===n&&(o=138,l=3),a=0;a<=i;a++)if(s=n,n=e[2*(a+1)+1],!(++h<o&&s===n)){if(h<l)do{kt(t,s,t.bl_tree)}while(0!==--h);else 0!==s?(s!==r&&(kt(t,s,t.bl_tree),h--),kt(t,16,t.bl_tree),Dt(t,h-3,2)):h<=10?(kt(t,17,t.bl_tree),Dt(t,h-3,3)):(kt(t,18,t.bl_tree),Dt(t,h-11,7));h=0,r=s,0===n?(o=138,l=3):s===n?(o=6,l=3):(o=7,l=4)}};let Lt=!1;const Nt=(t,e,i,a)=>{Dt(t,0+(a?1:0),3),Wt(t),xt(t,i),xt(t,~i),i&&t.pending_buf.set(t.window.subarray(e,e+i),t.pending),t.pending+=i};var Zt=(t,e,i,a)=>{let s,r,n=0;t.level>0?(2===t.strm.data_type&&(t.strm.data_type=(t=>{let e,i=4093624447;for(e=0;e<=31;e++,i>>>=1)if(1&i&&0!==t.dyn_ltree[2*e])return 0;if(0!==t.dyn_ltree[18]||0!==t.dyn_ltree[20]||0!==t.dyn_ltree[26])return 1;for(e=32;e<ot;e++)if(0!==t.dyn_ltree[2*e])return 1;return 0})(t)),$t(t,t.l_desc),$t(t,t.d_desc),n=(t=>{let e;for(Mt(t,t.dyn_ltree,t.l_desc.max_code),Mt(t,t.dyn_dtree,t.d_desc.max_code),$t(t,t.bl_desc),e=18;e>=3&&0===t.bl_tree[2*gt[e]+1];e--);return t.opt_len+=3*(e+1)+5+5+4,e})(t),s=t.opt_len+3+7>>>3,r=t.static_len+3+7>>>3,r<=s&&(s=r)):s=r=i+5,i+4<=s&&-1!==e?Nt(t,e,i,a):4===t.strategy||r===s?(Dt(t,2+(a?1:0),3),Et(t,pt,wt)):(Dt(t,4+(a?1:0),3),((t,e,i,a)=>{let s;for(Dt(t,e-257,5),Dt(t,i-1,5),Dt(t,a-4,4),s=0;s<a;s++)Dt(t,t.bl_tree[2*gt[s]+1],3);Pt(t,t.dyn_ltree,e-1),Pt(t,t.dyn_dtree,i-1)})(t,t.l_desc.max_code+1,t.d_desc.max_code+1,n+1),Et(t,t.dyn_ltree,t.dyn_dtree)),zt(t),a&&Wt(t)},Vt={_tr_init:t=>{Lt||((()=>{let t,e,i,a,s;const r=new Array(16);for(i=0,a=0;a<28;a++)for(St[a]=i,t=0;t<1<<ct[a];t++)bt[i++]=a;for(bt[i-1]=a,s=0,a=0;a<16;a++)for(yt[a]=s,t=0;t<1<<_t[a];t++)mt[s++]=a;for(s>>=7;a<dt;a++)for(yt[a]=s<<7,t=0;t<1<<_t[a]-7;t++)mt[256+s++]=a;for(e=0;e<=ut;e++)r[e]=0;for(t=0;t<=143;)pt[2*t+1]=8,t++,r[8]++;for(;t<=255;)pt[2*t+1]=9,t++,r[9]++;for(;t<=279;)pt[2*t+1]=7,t++,r[7]++;for(;t<=287;)pt[2*t+1]=8,t++,r[8]++;for(Ft(pt,287,r),t=0;t<dt;t++)wt[2*t+1]=5,wt[2*t]=Ct(t,5);vt=new Bt(pt,ct,257,lt,ut),Rt=new Bt(wt,_t,0,dt,ut),Ut=new Bt(new Array(0),ft,0,19,7)})(),Lt=!0),t.l_desc=new It(t.dyn_ltree,vt),t.d_desc=new It(t.dyn_dtree,Rt),t.bl_desc=new It(t.bl_tree,Ut),t.bi_buf=0,t.bi_valid=0,zt(t)},_tr_stored_block:Nt,_tr_flush_block:Zt,_tr_tally:(t,e,i)=>(t.pending_buf[t.sym_buf+t.sym_next++]=e,t.pending_buf[t.sym_buf+t.sym_next++]=e>>8,t.pending_buf[t.sym_buf+t.sym_next++]=i,0===e?t.dyn_ltree[2*i]++:(t.matches++,e--,t.dyn_ltree[2*(bt[i]+ot+1)]++,t.dyn_dtree[2*Tt(e)]++),t.sym_next===t.sym_end),_tr_align:t=>{Dt(t,2,3),kt(t,256,pt),(t=>{16===t.bi_valid?(xt(t,t.bi_buf),t.bi_buf=0,t.bi_valid=0):t.bi_valid>=8&&(t.pending_buf[t.pending++]=255&t.bi_buf,t.bi_buf>>=8,t.bi_valid-=8)})(t)}};var Ht=(t,e,i,a)=>{let s=65535&t,r=t>>>16&65535,n=0;for(;0!==i;){n=i>2e3?2e3:i,i-=n;do{s=s+e[a++]|0,r=r+s|0}while(--n);s%=65521,r%=65521}return s|r<<16};const jt=new Uint32Array((()=>{let t,e=[];for(var i=0;i<256;i++){t=i;for(var a=0;a<8;a++)t=1&t?3988292384^t>>>1:t>>>1;e[i]=t}return e})());var Gt=(t,e,i,a)=>{const s=jt,r=a+i;t^=-1;for(let i=a;i<r;i++)t=t>>>8^s[255&(t^e[i])];return-1^t},Jt={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"},qt={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_OK:0,Z_STREAM_END:1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_UNKNOWN:2,Z_DEFLATED:8};const{_tr_init:Kt,_tr_stored_block:Yt,_tr_flush_block:Xt,_tr_tally:Qt,_tr_align:te}=Vt,{Z_NO_FLUSH:ee,Z_PARTIAL_FLUSH:ie,Z_FULL_FLUSH:ae,Z_FINISH:se,Z_BLOCK:re,Z_OK:ne,Z_STREAM_END:he,Z_STREAM_ERROR:oe,Z_DATA_ERROR:le,Z_BUF_ERROR:de,Z_DEFAULT_COMPRESSION:ue,Z_FILTERED:ce,Z_HUFFMAN_ONLY:_e,Z_RLE:fe,Z_FIXED:ge,Z_DEFAULT_STRATEGY:pe,Z_UNKNOWN:we,Z_DEFLATED:me}=qt,be=258,Se=262,ye=42,Be=113,ve=666,Re=(t,e)=>(t.msg=Jt[e],e),Ue=t=>2*t-(t>4?9:0),Ie=t=>{let e=t.length;for(;--e>=0;)t[e]=0},Te=t=>{let e,i,a,s=t.w_size;e=t.hash_size,a=e;do{i=t.head[--a],t.head[a]=i>=s?i-s:0}while(--e);e=s,a=e;do{i=t.prev[--a],t.prev[a]=i>=s?i-s:0}while(--e)};let xe=(t,e,i)=>(e<<t.hash_shift^i)&t.hash_mask;const De=t=>{const e=t.state;let i=e.pending;i>t.avail_out&&(i=t.avail_out),0!==i&&(t.output.set(e.pending_buf.subarray(e.pending_out,e.pending_out+i),t.next_out),t.next_out+=i,e.pending_out+=i,t.total_out+=i,t.avail_out-=i,e.pending-=i,0===e.pending&&(e.pending_out=0))},ke=(t,e)=>{Xt(t,t.block_start>=0?t.block_start:-1,t.strstart-t.block_start,e),t.block_start=t.strstart,De(t.strm)},Ce=(t,e)=>{t.pending_buf[t.pending++]=e},Fe=(t,e)=>{t.pending_buf[t.pending++]=e>>>8&255,t.pending_buf[t.pending++]=255&e},ze=(t,e,i,a)=>{let s=t.avail_in;return s>a&&(s=a),0===s?0:(t.avail_in-=s,e.set(t.input.subarray(t.next_in,t.next_in+s),i),1===t.state.wrap?t.adler=Ht(t.adler,e,s,i):2===t.state.wrap&&(t.adler=Gt(t.adler,e,s,i)),t.next_in+=s,t.total_in+=s,s)},We=(t,e)=>{let i,a,s=t.max_chain_length,r=t.strstart,n=t.prev_length,h=t.nice_match;const o=t.strstart>t.w_size-Se?t.strstart-(t.w_size-Se):0,l=t.window,d=t.w_mask,u=t.prev,c=t.strstart+be;let _=l[r+n-1],f=l[r+n];t.prev_length>=t.good_match&&(s>>=2),h>t.lookahead&&(h=t.lookahead);do{if(i=e,l[i+n]===f&&l[i+n-1]===_&&l[i]===l[r]&&l[++i]===l[r+1]){r+=2,i++;do{}while(l[++r]===l[++i]&&l[++r]===l[++i]&&l[++r]===l[++i]&&l[++r]===l[++i]&&l[++r]===l[++i]&&l[++r]===l[++i]&&l[++r]===l[++i]&&l[++r]===l[++i]&&r<c);if(a=be-(c-r),r=c-be,a>n){if(t.match_start=e,n=a,a>=h)break;_=l[r+n-1],f=l[r+n]}}}while((e=u[e&d])>o&&0!==--s);return n<=t.lookahead?n:t.lookahead},Oe=t=>{const e=t.w_size;let i,a,s;do{if(a=t.window_size-t.lookahead-t.strstart,t.strstart>=e+(e-Se)&&(t.window.set(t.window.subarray(e,e+e-a),0),t.match_start-=e,t.strstart-=e,t.block_start-=e,t.insert>t.strstart&&(t.insert=t.strstart),Te(t),a+=e),0===t.strm.avail_in)break;if(i=ze(t.strm,t.window,t.strstart+t.lookahead,a),t.lookahead+=i,t.lookahead+t.insert>=3)for(s=t.strstart-t.insert,t.ins_h=t.window[s],t.ins_h=xe(t,t.ins_h,t.window[s+1]);t.insert&&(t.ins_h=xe(t,t.ins_h,t.window[s+3-1]),t.prev[s&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=s,s++,t.insert--,!(t.lookahead+t.insert<3)););}while(t.lookahead<Se&&0!==t.strm.avail_in)},Ae=(t,e)=>{let i,a,s,r=t.pending_buf_size-5>t.w_size?t.w_size:t.pending_buf_size-5,n=0,h=t.strm.avail_in;do{if(i=65535,s=t.bi_valid+42>>3,t.strm.avail_out<s)break;if(s=t.strm.avail_out-s,a=t.strstart-t.block_start,i>a+t.strm.avail_in&&(i=a+t.strm.avail_in),i>s&&(i=s),i<r&&(0===i&&e!==se||e===ee||i!==a+t.strm.avail_in))break;n=e===se&&i===a+t.strm.avail_in?1:0,Yt(t,0,0,n),t.pending_buf[t.pending-4]=i,t.pending_buf[t.pending-3]=i>>8,t.pending_buf[t.pending-2]=~i,t.pending_buf[t.pending-1]=~i>>8,De(t.strm),a&&(a>i&&(a=i),t.strm.output.set(t.window.subarray(t.block_start,t.block_start+a),t.strm.next_out),t.strm.next_out+=a,t.strm.avail_out-=a,t.strm.total_out+=a,t.block_start+=a,i-=a),i&&(ze(t.strm,t.strm.output,t.strm.next_out,i),t.strm.next_out+=i,t.strm.avail_out-=i,t.strm.total_out+=i)}while(0===n);return h-=t.strm.avail_in,h&&(h>=t.w_size?(t.matches=2,t.window.set(t.strm.input.subarray(t.strm.next_in-t.w_size,t.strm.next_in),0),t.strstart=t.w_size,t.insert=t.strstart):(t.window_size-t.strstart<=h&&(t.strstart-=t.w_size,t.window.set(t.window.subarray(t.w_size,t.w_size+t.strstart),0),t.matches<2&&t.matches++,t.insert>t.strstart&&(t.insert=t.strstart)),t.window.set(t.strm.input.subarray(t.strm.next_in-h,t.strm.next_in),t.strstart),t.strstart+=h,t.insert+=h>t.w_size-t.insert?t.w_size-t.insert:h),t.block_start=t.strstart),t.high_water<t.strstart&&(t.high_water=t.strstart),n?4:e!==ee&&e!==se&&0===t.strm.avail_in&&t.strstart===t.block_start?2:(s=t.window_size-t.strstart,t.strm.avail_in>s&&t.block_start>=t.w_size&&(t.block_start-=t.w_size,t.strstart-=t.w_size,t.window.set(t.window.subarray(t.w_size,t.w_size+t.strstart),0),t.matches<2&&t.matches++,s+=t.w_size,t.insert>t.strstart&&(t.insert=t.strstart)),s>t.strm.avail_in&&(s=t.strm.avail_in),s&&(ze(t.strm,t.window,t.strstart,s),t.strstart+=s,t.insert+=s>t.w_size-t.insert?t.w_size-t.insert:s),t.high_water<t.strstart&&(t.high_water=t.strstart),s=t.bi_valid+42>>3,s=t.pending_buf_size-s>65535?65535:t.pending_buf_size-s,r=s>t.w_size?t.w_size:s,a=t.strstart-t.block_start,(a>=r||(a||e===se)&&e!==ee&&0===t.strm.avail_in&&a<=s)&&(i=a>s?s:a,n=e===se&&0===t.strm.avail_in&&i===a?1:0,Yt(t,t.block_start,i,n),t.block_start+=i,De(t.strm)),n?3:1)},Ee=(t,e)=>{let i,a;for(;;){if(t.lookahead<Se){if(Oe(t),t.lookahead<Se&&e===ee)return 1;if(0===t.lookahead)break}if(i=0,t.lookahead>=3&&(t.ins_h=xe(t,t.ins_h,t.window[t.strstart+3-1]),i=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),0!==i&&t.strstart-i<=t.w_size-Se&&(t.match_length=We(t,i)),t.match_length>=3)if(a=Qt(t,t.strstart-t.match_start,t.match_length-3),t.lookahead-=t.match_length,t.match_length<=t.max_lazy_match&&t.lookahead>=3){t.match_length--;do{t.strstart++,t.ins_h=xe(t,t.ins_h,t.window[t.strstart+3-1]),i=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart}while(0!==--t.match_length);t.strstart++}else t.strstart+=t.match_length,t.match_length=0,t.ins_h=t.window[t.strstart],t.ins_h=xe(t,t.ins_h,t.window[t.strstart+1]);else a=Qt(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++;if(a&&(ke(t,!1),0===t.strm.avail_out))return 1}return t.insert=t.strstart<2?t.strstart:2,e===se?(ke(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(ke(t,!1),0===t.strm.avail_out)?1:2},$e=(t,e)=>{let i,a,s;for(;;){if(t.lookahead<Se){if(Oe(t),t.lookahead<Se&&e===ee)return 1;if(0===t.lookahead)break}if(i=0,t.lookahead>=3&&(t.ins_h=xe(t,t.ins_h,t.window[t.strstart+3-1]),i=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),t.prev_length=t.match_length,t.prev_match=t.match_start,t.match_length=2,0!==i&&t.prev_length<t.max_lazy_match&&t.strstart-i<=t.w_size-Se&&(t.match_length=We(t,i),t.match_length<=5&&(t.strategy===ce||3===t.match_length&&t.strstart-t.match_start>4096)&&(t.match_length=2)),t.prev_length>=3&&t.match_length<=t.prev_length){s=t.strstart+t.lookahead-3,a=Qt(t,t.strstart-1-t.prev_match,t.prev_length-3),t.lookahead-=t.prev_length-1,t.prev_length-=2;do{++t.strstart<=s&&(t.ins_h=xe(t,t.ins_h,t.window[t.strstart+3-1]),i=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart)}while(0!==--t.prev_length);if(t.match_available=0,t.match_length=2,t.strstart++,a&&(ke(t,!1),0===t.strm.avail_out))return 1}else if(t.match_available){if(a=Qt(t,0,t.window[t.strstart-1]),a&&ke(t,!1),t.strstart++,t.lookahead--,0===t.strm.avail_out)return 1}else t.match_available=1,t.strstart++,t.lookahead--}return t.match_available&&(a=Qt(t,0,t.window[t.strstart-1]),t.match_available=0),t.insert=t.strstart<2?t.strstart:2,e===se?(ke(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(ke(t,!1),0===t.strm.avail_out)?1:2};function Me(t,e,i,a,s){this.good_length=t,this.max_lazy=e,this.nice_length=i,this.max_chain=a,this.func=s}const Pe=[new Me(0,0,0,0,Ae),new Me(4,4,8,4,Ee),new Me(4,5,16,8,Ee),new Me(4,6,32,32,Ee),new Me(4,4,16,16,$e),new Me(8,16,32,32,$e),new Me(8,16,128,128,$e),new Me(8,32,128,256,$e),new Me(32,128,258,1024,$e),new Me(32,258,258,4096,$e)];function Le(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=me,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new Uint16Array(1146),this.dyn_dtree=new Uint16Array(122),this.bl_tree=new Uint16Array(78),Ie(this.dyn_ltree),Ie(this.dyn_dtree),Ie(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new Uint16Array(16),this.heap=new Uint16Array(573),Ie(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new Uint16Array(573),Ie(this.depth),this.sym_buf=0,this.lit_bufsize=0,this.sym_next=0,this.sym_end=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}const Ne=t=>{if(!t)return 1;const e=t.state;return!e||e.strm!==t||e.status!==ye&&57!==e.status&&69!==e.status&&73!==e.status&&91!==e.status&&103!==e.status&&e.status!==Be&&e.status!==ve?1:0},Ze=t=>{if(Ne(t))return Re(t,oe);t.total_in=t.total_out=0,t.data_type=we;const e=t.state;return e.pending=0,e.pending_out=0,e.wrap<0&&(e.wrap=-e.wrap),e.status=2===e.wrap?57:e.wrap?ye:Be,t.adler=2===e.wrap?0:1,e.last_flush=-2,Kt(e),ne},Ve=t=>{const e=Ze(t);var i;return e===ne&&((i=t.state).window_size=2*i.w_size,Ie(i.head),i.max_lazy_match=Pe[i.level].max_lazy,i.good_match=Pe[i.level].good_length,i.nice_match=Pe[i.level].nice_length,i.max_chain_length=Pe[i.level].max_chain,i.strstart=0,i.block_start=0,i.lookahead=0,i.insert=0,i.match_length=i.prev_length=2,i.match_available=0,i.ins_h=0),e},He=(t,e,i,a,s,r)=>{if(!t)return oe;let n=1;if(e===ue&&(e=6),a<0?(n=0,a=-a):a>15&&(n=2,a-=16),s<1||s>9||i!==me||a<8||a>15||e<0||e>9||r<0||r>ge||8===a&&1!==n)return Re(t,oe);8===a&&(a=9);const h=new Le;return t.state=h,h.strm=t,h.status=ye,h.wrap=n,h.gzhead=null,h.w_bits=a,h.w_size=1<<h.w_bits,h.w_mask=h.w_size-1,h.hash_bits=s+7,h.hash_size=1<<h.hash_bits,h.hash_mask=h.hash_size-1,h.hash_shift=~~((h.hash_bits+3-1)/3),h.window=new Uint8Array(2*h.w_size),h.head=new Uint16Array(h.hash_size),h.prev=new Uint16Array(h.w_size),h.lit_bufsize=1<<s+6,h.pending_buf_size=4*h.lit_bufsize,h.pending_buf=new Uint8Array(h.pending_buf_size),h.sym_buf=h.lit_bufsize,h.sym_end=3*(h.lit_bufsize-1),h.level=e,h.strategy=r,h.method=i,Ve(t)};var je={deflateInit:(t,e)=>He(t,e,me,15,8,pe),deflateInit2:He,deflateReset:Ve,deflateResetKeep:Ze,deflateSetHeader:(t,e)=>Ne(t)||2!==t.state.wrap?oe:(t.state.gzhead=e,ne),deflate:(t,e)=>{if(Ne(t)||e>re||e<0)return t?Re(t,oe):oe;const i=t.state;if(!t.output||0!==t.avail_in&&!t.input||i.status===ve&&e!==se)return Re(t,0===t.avail_out?de:oe);const a=i.last_flush;if(i.last_flush=e,0!==i.pending){if(De(t),0===t.avail_out)return i.last_flush=-1,ne}else if(0===t.avail_in&&Ue(e)<=Ue(a)&&e!==se)return Re(t,de);if(i.status===ve&&0!==t.avail_in)return Re(t,de);if(i.status===ye&&0===i.wrap&&(i.status=Be),i.status===ye){let e=me+(i.w_bits-8<<4)<<8,a=-1;if(a=i.strategy>=_e||i.level<2?0:i.level<6?1:6===i.level?2:3,e|=a<<6,0!==i.strstart&&(e|=32),e+=31-e%31,Fe(i,e),0!==i.strstart&&(Fe(i,t.adler>>>16),Fe(i,65535&t.adler)),t.adler=1,i.status=Be,De(t),0!==i.pending)return i.last_flush=-1,ne}if(57===i.status)if(t.adler=0,Ce(i,31),Ce(i,139),Ce(i,8),i.gzhead)Ce(i,(i.gzhead.text?1:0)+(i.gzhead.hcrc?2:0)+(i.gzhead.extra?4:0)+(i.gzhead.name?8:0)+(i.gzhead.comment?16:0)),Ce(i,255&i.gzhead.time),Ce(i,i.gzhead.time>>8&255),Ce(i,i.gzhead.time>>16&255),Ce(i,i.gzhead.time>>24&255),Ce(i,9===i.level?2:i.strategy>=_e||i.level<2?4:0),Ce(i,255&i.gzhead.os),i.gzhead.extra&&i.gzhead.extra.length&&(Ce(i,255&i.gzhead.extra.length),Ce(i,i.gzhead.extra.length>>8&255)),i.gzhead.hcrc&&(t.adler=Gt(t.adler,i.pending_buf,i.pending,0)),i.gzindex=0,i.status=69;else if(Ce(i,0),Ce(i,0),Ce(i,0),Ce(i,0),Ce(i,0),Ce(i,9===i.level?2:i.strategy>=_e||i.level<2?4:0),Ce(i,3),i.status=Be,De(t),0!==i.pending)return i.last_flush=-1,ne;if(69===i.status){if(i.gzhead.extra){let e=i.pending,a=(65535&i.gzhead.extra.length)-i.gzindex;for(;i.pending+a>i.pending_buf_size;){let s=i.pending_buf_size-i.pending;if(i.pending_buf.set(i.gzhead.extra.subarray(i.gzindex,i.gzindex+s),i.pending),i.pending=i.pending_buf_size,i.gzhead.hcrc&&i.pending>e&&(t.adler=Gt(t.adler,i.pending_buf,i.pending-e,e)),i.gzindex+=s,De(t),0!==i.pending)return i.last_flush=-1,ne;e=0,a-=s}let s=new Uint8Array(i.gzhead.extra);i.pending_buf.set(s.subarray(i.gzindex,i.gzindex+a),i.pending),i.pending+=a,i.gzhead.hcrc&&i.pending>e&&(t.adler=Gt(t.adler,i.pending_buf,i.pending-e,e)),i.gzindex=0}i.status=73}if(73===i.status){if(i.gzhead.name){let e,a=i.pending;do{if(i.pending===i.pending_buf_size){if(i.gzhead.hcrc&&i.pending>a&&(t.adler=Gt(t.adler,i.pending_buf,i.pending-a,a)),De(t),0!==i.pending)return i.last_flush=-1,ne;a=0}e=i.gzindex<i.gzhead.name.length?255&i.gzhead.name.charCodeAt(i.gzindex++):0,Ce(i,e)}while(0!==e);i.gzhead.hcrc&&i.pending>a&&(t.adler=Gt(t.adler,i.pending_buf,i.pending-a,a)),i.gzindex=0}i.status=91}if(91===i.status){if(i.gzhead.comment){let e,a=i.pending;do{if(i.pending===i.pending_buf_size){if(i.gzhead.hcrc&&i.pending>a&&(t.adler=Gt(t.adler,i.pending_buf,i.pending-a,a)),De(t),0!==i.pending)return i.last_flush=-1,ne;a=0}e=i.gzindex<i.gzhead.comment.length?255&i.gzhead.comment.charCodeAt(i.gzindex++):0,Ce(i,e)}while(0!==e);i.gzhead.hcrc&&i.pending>a&&(t.adler=Gt(t.adler,i.pending_buf,i.pending-a,a))}i.status=103}if(103===i.status){if(i.gzhead.hcrc){if(i.pending+2>i.pending_buf_size&&(De(t),0!==i.pending))return i.last_flush=-1,ne;Ce(i,255&t.adler),Ce(i,t.adler>>8&255),t.adler=0}if(i.status=Be,De(t),0!==i.pending)return i.last_flush=-1,ne}if(0!==t.avail_in||0!==i.lookahead||e!==ee&&i.status!==ve){let a=0===i.level?Ae(i,e):i.strategy===_e?((t,e)=>{let i;for(;;){if(0===t.lookahead&&(Oe(t),0===t.lookahead)){if(e===ee)return 1;break}if(t.match_length=0,i=Qt(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++,i&&(ke(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===se?(ke(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(ke(t,!1),0===t.strm.avail_out)?1:2})(i,e):i.strategy===fe?((t,e)=>{let i,a,s,r;const n=t.window;for(;;){if(t.lookahead<=be){if(Oe(t),t.lookahead<=be&&e===ee)return 1;if(0===t.lookahead)break}if(t.match_length=0,t.lookahead>=3&&t.strstart>0&&(s=t.strstart-1,a=n[s],a===n[++s]&&a===n[++s]&&a===n[++s])){r=t.strstart+be;do{}while(a===n[++s]&&a===n[++s]&&a===n[++s]&&a===n[++s]&&a===n[++s]&&a===n[++s]&&a===n[++s]&&a===n[++s]&&s<r);t.match_length=be-(r-s),t.match_length>t.lookahead&&(t.match_length=t.lookahead)}if(t.match_length>=3?(i=Qt(t,1,t.match_length-3),t.lookahead-=t.match_length,t.strstart+=t.match_length,t.match_length=0):(i=Qt(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++),i&&(ke(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===se?(ke(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(ke(t,!1),0===t.strm.avail_out)?1:2})(i,e):Pe[i.level].func(i,e);if(3!==a&&4!==a||(i.status=ve),1===a||3===a)return 0===t.avail_out&&(i.last_flush=-1),ne;if(2===a&&(e===ie?te(i):e!==re&&(Yt(i,0,0,!1),e===ae&&(Ie(i.head),0===i.lookahead&&(i.strstart=0,i.block_start=0,i.insert=0))),De(t),0===t.avail_out))return i.last_flush=-1,ne}return e!==se?ne:i.wrap<=0?he:(2===i.wrap?(Ce(i,255&t.adler),Ce(i,t.adler>>8&255),Ce(i,t.adler>>16&255),Ce(i,t.adler>>24&255),Ce(i,255&t.total_in),Ce(i,t.total_in>>8&255),Ce(i,t.total_in>>16&255),Ce(i,t.total_in>>24&255)):(Fe(i,t.adler>>>16),Fe(i,65535&t.adler)),De(t),i.wrap>0&&(i.wrap=-i.wrap),0!==i.pending?ne:he)},deflateEnd:t=>{if(Ne(t))return oe;const e=t.state.status;return t.state=null,e===Be?Re(t,le):ne},deflateSetDictionary:(t,e)=>{let i=e.length;if(Ne(t))return oe;const a=t.state,s=a.wrap;if(2===s||1===s&&a.status!==ye||a.lookahead)return oe;if(1===s&&(t.adler=Ht(t.adler,e,i,0)),a.wrap=0,i>=a.w_size){0===s&&(Ie(a.head),a.strstart=0,a.block_start=0,a.insert=0);let t=new Uint8Array(a.w_size);t.set(e.subarray(i-a.w_size,i),0),e=t,i=a.w_size}const r=t.avail_in,n=t.next_in,h=t.input;for(t.avail_in=i,t.next_in=0,t.input=e,Oe(a);a.lookahead>=3;){let t=a.strstart,e=a.lookahead-2;do{a.ins_h=xe(a,a.ins_h,a.window[t+3-1]),a.prev[t&a.w_mask]=a.head[a.ins_h],a.head[a.ins_h]=t,t++}while(--e);a.strstart=t,a.lookahead=2,Oe(a)}return a.strstart+=a.lookahead,a.block_start=a.strstart,a.insert=a.lookahead,a.lookahead=0,a.match_length=a.prev_length=2,a.match_available=0,t.next_in=n,t.input=h,t.avail_in=r,a.wrap=s,ne},deflateInfo:"pako deflate (from Nodeca project)"};const Ge=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);var Je=function(t){const e=Array.prototype.slice.call(arguments,1);for(;e.length;){const i=e.shift();if(i){if("object"!=typeof i)throw new TypeError(i+"must be non-object");for(const e in i)Ge(i,e)&&(t[e]=i[e])}}return t},qe=t=>{let e=0;for(let i=0,a=t.length;i<a;i++)e+=t[i].length;const i=new Uint8Array(e);for(let e=0,a=0,s=t.length;e<s;e++){let s=t[e];i.set(s,a),a+=s.length}return i};let Ke=!0;try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(t){Ke=!1}const Ye=new Uint8Array(256);for(let t=0;t<256;t++)Ye[t]=t>=252?6:t>=248?5:t>=240?4:t>=224?3:t>=192?2:1;Ye[254]=Ye[254]=1;var Xe=t=>{if("function"==typeof TextEncoder&&TextEncoder.prototype.encode)return(new TextEncoder).encode(t);let e,i,a,s,r,n=t.length,h=0;for(s=0;s<n;s++)i=t.charCodeAt(s),55296==(64512&i)&&s+1<n&&(a=t.charCodeAt(s+1),56320==(64512&a)&&(i=65536+(i-55296<<10)+(a-56320),s++)),h+=i<128?1:i<2048?2:i<65536?3:4;for(e=new Uint8Array(h),r=0,s=0;r<h;s++)i=t.charCodeAt(s),55296==(64512&i)&&s+1<n&&(a=t.charCodeAt(s+1),56320==(64512&a)&&(i=65536+(i-55296<<10)+(a-56320),s++)),i<128?e[r++]=i:i<2048?(e[r++]=192|i>>>6,e[r++]=128|63&i):i<65536?(e[r++]=224|i>>>12,e[r++]=128|i>>>6&63,e[r++]=128|63&i):(e[r++]=240|i>>>18,e[r++]=128|i>>>12&63,e[r++]=128|i>>>6&63,e[r++]=128|63&i);return e};var Qe=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0};const ti=Object.prototype.toString,{Z_NO_FLUSH:ei,Z_SYNC_FLUSH:ii,Z_FULL_FLUSH:ai,Z_FINISH:si,Z_OK:ri,Z_STREAM_END:ni,Z_DEFAULT_COMPRESSION:hi,Z_DEFAULT_STRATEGY:oi,Z_DEFLATED:li}=qt;function di(t){this.options=Je({level:hi,method:li,chunkSize:16384,windowBits:15,memLevel:8,strategy:oi},t||{});let e=this.options;e.raw&&e.windowBits>0?e.windowBits=-e.windowBits:e.gzip&&e.windowBits>0&&e.windowBits<16&&(e.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new Qe,this.strm.avail_out=0;let i=je.deflateInit2(this.strm,e.level,e.method,e.windowBits,e.memLevel,e.strategy);if(i!==ri)throw new Error(Jt[i]);if(e.header&&je.deflateSetHeader(this.strm,e.header),e.dictionary){let t;if(t="string"==typeof e.dictionary?Xe(e.dictionary):"[object ArrayBuffer]"===ti.call(e.dictionary)?new Uint8Array(e.dictionary):e.dictionary,i=je.deflateSetDictionary(this.strm,t),i!==ri)throw new Error(Jt[i]);this._dict_set=!0}}di.prototype.push=function(t,e){const i=this.strm,a=this.options.chunkSize;let s,r;if(this.ended)return!1;for(r=e===~~e?e:!0===e?si:ei,"string"==typeof t?i.input=Xe(t):"[object ArrayBuffer]"===ti.call(t)?i.input=new Uint8Array(t):i.input=t,i.next_in=0,i.avail_in=i.input.length;;)if(0===i.avail_out&&(i.output=new Uint8Array(a),i.next_out=0,i.avail_out=a),(r===ii||r===ai)&&i.avail_out<=6)this.onData(i.output.subarray(0,i.next_out)),i.avail_out=0;else{if(s=je.deflate(i,r),s===ni)return i.next_out>0&&this.onData(i.output.subarray(0,i.next_out)),s=je.deflateEnd(this.strm),this.onEnd(s),this.ended=!0,s===ri;if(0!==i.avail_out){if(r>0&&i.next_out>0)this.onData(i.output.subarray(0,i.next_out)),i.avail_out=0;else if(0===i.avail_in)break}else this.onData(i.output)}return!0},di.prototype.onData=function(t){this.chunks.push(t)},di.prototype.onEnd=function(t){t===ri&&(this.result=qe(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg};var ui={deflate:function(t,e){const i=new di(e);if(i.push(t,!0),i.err)throw i.msg||Jt[i.err];return i.result}};const{deflate:ci}=ui;var _i=ci;const fi={b:{u:DataView.prototype.getInt8,p:DataView.prototype.setInt8,bytes:1},B:{u:DataView.prototype.getUint8,p:DataView.prototype.setUint8,bytes:1},h:{u:DataView.prototype.getInt16,p:DataView.prototype.setInt16,bytes:2},H:{u:DataView.prototype.getUint16,p:DataView.prototype.setUint16,bytes:2},i:{u:DataView.prototype.getInt32,p:DataView.prototype.setInt32,bytes:4},I:{u:DataView.prototype.getUint32,p:DataView.prototype.setUint32,bytes:4}},gi=(t,...e)=>{let i=0;if(t.replace(/[<>]/,"").length!=e.length)throw"Pack format to Argument count mismatch";const a=[];let s=!0;for(let a=0;a<t.length;a++)"<"==t[a]?s=!0:">"==t[a]?s=!1:(r(t[a],e[i]),i++);function r(t,e){if(!(t in fi))throw"Unhandled character '"+t+"' in pack format";const i=fi[t].bytes,r=new DataView(new ArrayBuffer(i));fi[t].p.bind(r)(0,e,s);for(let t=0;t<i;t++)a.push(r.getUint8(t))}return a},pi=(t,e)=>{let i=0;const a=[];let s=!0;for(const e of t)"<"==e?s=!0:">"==e?s=!1:r(e);function r(t){if(!(t in fi))throw"Unhandled character '"+t+"' in unpack format";const r=fi[t].bytes,n=new DataView(new ArrayBuffer(r));for(let t=0;t<r;t++)n.setUint8(t,255&e[i+t]);const h=fi[t].u.bind(n);a.push(h(0,s)),i+=r}return a};class wi extends EventTarget{constructor(t,e,i){super(),this.port=t,this.logger=e,this._parent=i,this.__chipName=null,this.__chipRevision=null,this.__chipVariant=null,this._efuses=new Array(4).fill(0),this._flashsize=4194304,this.debug=!1,this.IS_STUB=!1,this.connected=!0,this.flashSize=null,this._currentBaudRate=h,this._isESP32S2NativeUSB=!1,this._initializationSucceeded=!1,this.__commandLock=Promise.resolve([0,[]]),this.__isReconfiguring=!1,this.__abandonCurrentOperation=!1,this.__adaptiveBlockMultiplier=1,this.__adaptiveMaxInFlightMultiplier=1,this.__consecutiveSuccessfulChunks=0,this.__lastAdaptiveAdjustment=0,this.__isCDCDevice=!1,this.state_DTR=!1,this.state_RTS=!1,this.__writeChain=Promise.resolve()}get chipFamily(){return this._parent?this._parent.chipFamily:this.__chipFamily}set chipFamily(t){this._parent?this._parent.chipFamily=t:this.__chipFamily=t}get chipName(){return this._parent?this._parent.chipName:this.__chipName}set chipName(t){this._parent?this._parent.chipName=t:this.__chipName=t}get chipRevision(){return this._parent?this._parent.chipRevision:this.__chipRevision}set chipRevision(t){this._parent?this._parent.chipRevision=t:this.__chipRevision=t}get chipVariant(){return this._parent?this._parent.chipVariant:this.__chipVariant}set chipVariant(t){this._parent?this._parent.chipVariant=t:this.__chipVariant=t}get _inputBuffer(){if(this._parent)return this._parent._inputBuffer;if(void 0===this.__inputBuffer)throw new Error("_inputBuffer accessed before initialization");return this.__inputBuffer}get _inputBufferReadIndex(){return this._parent?this._parent._inputBufferReadIndex:this.__inputBufferReadIndex||0}set _inputBufferReadIndex(t){this._parent?this._parent._inputBufferReadIndex=t:this.__inputBufferReadIndex=t}get _inputBufferAvailable(){return this._inputBuffer.length-this._inputBufferReadIndex}_readByte(){if(!(this._inputBufferReadIndex>=this._inputBuffer.length))return this._inputBuffer[this._inputBufferReadIndex++]}_clearInputBuffer(){this._inputBuffer.length=0,this._inputBufferReadIndex=0}_compactInputBuffer(){this._inputBufferReadIndex>1e3&&this._inputBufferReadIndex>this._inputBuffer.length/2&&(this._inputBuffer.splice(0,this._inputBufferReadIndex),this._inputBufferReadIndex=0)}get _totalBytesRead(){return this._parent?this._parent._totalBytesRead:this.__totalBytesRead||0}set _totalBytesRead(t){this._parent?this._parent._totalBytesRead=t:this.__totalBytesRead=t}get _commandLock(){return this._parent?this._parent._commandLock:this.__commandLock}set _commandLock(t){this._parent?this._parent._commandLock=t:this.__commandLock=t}get _isReconfiguring(){return this._parent?this._parent._isReconfiguring:this.__isReconfiguring}set _isReconfiguring(t){this._parent?this._parent._isReconfiguring=t:this.__isReconfiguring=t}get _abandonCurrentOperation(){return this._parent?this._parent._abandonCurrentOperation:this.__abandonCurrentOperation}set _abandonCurrentOperation(t){this._parent?this._parent._abandonCurrentOperation=t:this.__abandonCurrentOperation=t}get _adaptiveBlockMultiplier(){return this._parent?this._parent._adaptiveBlockMultiplier:this.__adaptiveBlockMultiplier}set _adaptiveBlockMultiplier(t){this._parent?this._parent._adaptiveBlockMultiplier=t:this.__adaptiveBlockMultiplier=t}get _adaptiveMaxInFlightMultiplier(){return this._parent?this._parent._adaptiveMaxInFlightMultiplier:this.__adaptiveMaxInFlightMultiplier}set _adaptiveMaxInFlightMultiplier(t){this._parent?this._parent._adaptiveMaxInFlightMultiplier=t:this.__adaptiveMaxInFlightMultiplier=t}get _consecutiveSuccessfulChunks(){return this._parent?this._parent._consecutiveSuccessfulChunks:this.__consecutiveSuccessfulChunks}set _consecutiveSuccessfulChunks(t){this._parent?this._parent._consecutiveSuccessfulChunks=t:this.__consecutiveSuccessfulChunks=t}get _lastAdaptiveAdjustment(){return this._parent?this._parent._lastAdaptiveAdjustment:this.__lastAdaptiveAdjustment}set _lastAdaptiveAdjustment(t){this._parent?this._parent._lastAdaptiveAdjustment=t:this.__lastAdaptiveAdjustment=t}get _isCDCDevice(){return this._parent?this._parent._isCDCDevice:this.__isCDCDevice}set _isCDCDevice(t){this._parent?this._parent._isCDCDevice=t:this.__isCDCDevice=t}detectUSBSerialChip(t,e){const i={6790:{29986:{name:"CH340",maxBaudrate:460800},29987:{name:"CH340",maxBaudrate:460800},30084:{name:"CH340",maxBaudrate:460800},21795:{name:"CH341",maxBaudrate:2e6},21971:{name:"CH343",maxBaudrate:6e6},21972:{name:"CH9102",maxBaudrate:6e6},21976:{name:"CH9101",maxBaudrate:3e6}},4292:{6e4:{name:"CP2102(n)",maxBaudrate:3e6},60016:{name:"CP2105",maxBaudrate:2e6},60017:{name:"CP2108",maxBaudrate:2e6}},1027:{24577:{name:"FT232R",maxBaudrate:3e6},24592:{name:"FT2232",maxBaudrate:3e6},24593:{name:"FT4232",maxBaudrate:3e6},24596:{name:"FT232H",maxBaudrate:12e6},24597:{name:"FT230X",maxBaudrate:3e6}},12346:{2:{name:"ESP32-S2 Native USB",maxBaudrate:2e6},4097:{name:"ESP32 Native USB",maxBaudrate:2e6},4098:{name:"ESP32 Native USB",maxBaudrate:2e6},16386:{name:"ESP32 Native USB",maxBaudrate:2e6},4096:{name:"ESP32 Native USB",maxBaudrate:2e6}}}[t];return i&&i[e]?i[e]:{name:`Unknown (VID: 0x${t.toString(16)}, PID: 0x${e.toString(16)})`}}async initialize(){if(!this._parent){this.__inputBuffer=[],this.__inputBufferReadIndex=0,this.__totalBytesRead=0;const t=this.port.getInfo();if(t.usbVendorId&&t.usbProductId){const e=this.detectUSBSerialChip(t.usbVendorId,t.usbProductId);this.logger.log(`USB-Serial: ${e.name} (VID: 0x${t.usbVendorId.toString(16)}, PID: 0x${t.usbProductId.toString(16)})`),e.maxBaudrate&&(this._maxUSBSerialBaudrate=e.maxBaudrate,this.logger.log(`Max baudrate: ${e.maxBaudrate}`)),12346===t.usbVendorId&&2===t.usbProductId&&(this._isESP32S2NativeUSB=!0),(12346===t.usbVendorId||6790===t.usbVendorId&&21971===t.usbProductId)&&(this._isCDCDevice=!0)}this.readLoop()}await this.connectWithResetStrategies(),await this.detectChip();const t=st(this.getChipFamily()),e=t.macFuse;for(let t=0;t<4;t++)this._efuses[t]=await this.readRegister(e+4*t);this.logger.log(`Chip type ${this.chipName}`),this.logger.debug(`Bootloader flash offset: 0x${t.flashOffs.toString(16)}`),this._initializationSucceeded=!0}async detectChip(){try{const t=(await this.getSecurityInfo()).chipId,e=R[t];if(e)return this.chipName=e.name,this.chipFamily=e.family,this.chipFamily===B&&(this.chipRevision=await this.getChipRevision(),this.logger.debug(`ESP32-P4 revision: ${this.chipRevision}`),this.chipRevision>=300?this.chipVariant="rev300":this.chipVariant="rev0",this.logger.debug(`ESP32-P4 variant: ${this.chipVariant}`)),void this.logger.debug(`Detected chip via IMAGE_CHIP_ID: ${t} (${this.chipName})`);this.logger.debug(`Unknown IMAGE_CHIP_ID: ${t}, falling back to magic value detection`)}catch(t){this.logger.debug(`GET_SECURITY_INFO failed, using magic value detection: ${t}`),await this.drainInputBuffer(200),this._clearInputBuffer(),await s(Q);try{await this.sync()}catch(t){this.logger.debug(`Re-sync after GET_SECURITY_INFO failure: ${t}`)}}const t=await this.readRegister(1073745920),e=U[t>>>0];if(void 0===e)throw new Error(`Unknown Chip: Hex: ${a(t>>>0,8).toLowerCase()} Number: ${t}`);this.chipName=e.name,this.chipFamily=e.family,this.chipFamily===B&&(this.chipRevision=await this.getChipRevision(),this.logger.debug(`ESP32-P4 revision: ${this.chipRevision}`),this.chipRevision>=300?this.chipVariant="rev300":this.chipVariant="rev0",this.logger.debug(`ESP32-P4 variant: ${this.chipVariant}`)),this.logger.debug(`Detected chip via magic value: ${a(t>>>0,8)} (${this.chipName})`)}async getChipRevision(){if(this.chipFamily!==B)return 0;const t=await this.readRegister(1343410252);return 100*((t>>23&1)<<2|t>>4&3)+(15&t)}async getSecurityInfo(){const[,t]=await this.checkCommand(20,[],0);if(0===t.length)throw new Error("GET_SECURITY_INFO not supported or returned empty response");if(t.length<12)throw new Error(`Invalid security info response length: ${t.length} (expected at least 12 bytes)`);return{flags:pi("<I",t.slice(0,4))[0],flashCryptCnt:t[4],keyPurposes:Array.from(t.slice(5,12)),chipId:t.length>=16?pi("<I",t.slice(12,16))[0]:0,apiVersion:t.length>=20?pi("<I",t.slice(16,20))[0]:0}}async getMacAddress(){if(!this._initializationSucceeded)throw new Error("getMacAddress() requires initialize() to have completed successfully");return this.macAddr().map(t=>t.toString(16).padStart(2,"0").toUpperCase()).join(":")}async readLoop(){this.debug&&this.logger.debug("Starting read loop"),this._reader=this.port.readable.getReader();try{let t=!0;for(;t;){const{value:e,done:i}=await this._reader.read();if(i){this._reader.releaseLock(),t=!1;break}if(!e||0===e.length)continue;const a=Array.from(e);Array.prototype.push.apply(this._inputBuffer,a),this._totalBytesRead+=e.length}}catch{this.logger.error("Read loop got disconnected")}finally{this._isReconfiguring=!1}this.connected=!1,this._isESP32S2NativeUSB&&!this._initializationSucceeded&&(this.logger.log("ESP32-S2 Native USB detected - requesting port reselection"),this.dispatchEvent(new CustomEvent("esp32s2-usb-reconnect",{detail:{message:"ESP32-S2 Native USB requires port reselection"}}))),this.dispatchEvent(new Event("disconnect")),this.logger.debug("Finished read loop")}sleep(t=100){return new Promise(e=>setTimeout(e,t))}async setRTS(t){await this.port.setSignals({requestToSend:t}),await this.setDTR(this.state_DTR)}async setDTR(t){this.state_DTR=t,await this.port.setSignals({dataTerminalReady:t})}async hardResetUSBJTAGSerial(){await this.setRTS(!1),await this.setDTR(!1),await this.sleep(100),await this.setDTR(!0),await this.setRTS(!1),await this.sleep(100),await this.setRTS(!0),await this.setDTR(!1),await this.setRTS(!0),await this.sleep(100),await this.setDTR(!1),await this.setRTS(!1),await this.sleep(200)}async hardResetClassic(){await this.setDTR(!1),await this.setRTS(!0),await this.sleep(100),await this.setDTR(!0),await this.setRTS(!1),await this.sleep(50),await this.setDTR(!1),await this.sleep(200)}async setRTSWebUSB(t){this.state_RTS=t,await this.port.setSignals({requestToSend:t,dataTerminalReady:this.state_DTR})}async setDTRWebUSB(t){this.state_DTR=t,await this.port.setSignals({dataTerminalReady:t,requestToSend:this.state_RTS})}async setDTRandRTSWebUSB(t,e){this.state_DTR=t,this.state_RTS=e,await this.port.setSignals({dataTerminalReady:t,requestToSend:e})}async hardResetUSBJTAGSerialWebUSB(){await this.setRTSWebUSB(!1),await this.setDTRWebUSB(!1),await this.sleep(100),await this.setDTRWebUSB(!0),await this.setRTSWebUSB(!1),await this.sleep(100),await this.setRTSWebUSB(!0),await this.setDTRWebUSB(!1),await this.setRTSWebUSB(!0),await this.sleep(100),await this.setDTRWebUSB(!1),await this.setRTSWebUSB(!1),await this.sleep(200)}async hardResetUSBJTAGSerialInvertedDTRWebUSB(){await this.setRTSWebUSB(!1),await this.setDTRWebUSB(!0),await this.sleep(100),await this.setDTRWebUSB(!1),await this.setRTSWebUSB(!1),await this.sleep(100),await this.setRTSWebUSB(!0),await this.setDTRWebUSB(!0),await this.setRTSWebUSB(!0),await this.sleep(100),await this.setDTRWebUSB(!0),await this.setRTSWebUSB(!1),await this.sleep(200)}async hardResetClassicWebUSB(){await this.setDTRWebUSB(!1),await this.setRTSWebUSB(!0),await this.sleep(100),await this.setDTRWebUSB(!0),await this.setRTSWebUSB(!1),await this.sleep(50),await this.setDTRWebUSB(!1),await this.sleep(200)}async hardResetUnixTightWebUSB(){await this.setDTRandRTSWebUSB(!1,!1),await this.setDTRandRTSWebUSB(!0,!0),await this.setDTRandRTSWebUSB(!1,!0),await this.sleep(100),await this.setDTRandRTSWebUSB(!0,!1),await this.sleep(50),await this.setDTRandRTSWebUSB(!1,!1),await this.setDTRWebUSB(!1),await this.sleep(200)}async hardResetClassicLongDelayWebUSB(){await this.setDTRWebUSB(!1),await this.setRTSWebUSB(!0),await this.sleep(500),await this.setDTRWebUSB(!0),await this.setRTSWebUSB(!1),await this.sleep(200),await this.setDTRWebUSB(!1),await this.sleep(500)}async hardResetClassicShortDelayWebUSB(){await this.setDTRWebUSB(!1),await this.setRTSWebUSB(!0),await this.sleep(50),await this.setDTRWebUSB(!0),await this.setRTSWebUSB(!1),await this.sleep(25),await this.setDTRWebUSB(!1),await this.sleep(100)}async hardResetInvertedWebUSB(){await this.setDTRWebUSB(!0),await this.setRTSWebUSB(!1),await this.sleep(100),await this.setDTRWebUSB(!1),await this.setRTSWebUSB(!0),await this.sleep(50),await this.setDTRWebUSB(!0),await this.sleep(200)}async hardResetInvertedDTRWebUSB(){await this.setDTRWebUSB(!0),await this.setRTSWebUSB(!0),await this.sleep(100),await this.setDTRWebUSB(!1),await this.setRTSWebUSB(!1),await this.sleep(50),await this.setDTRWebUSB(!0),await this.sleep(200)}async hardResetInvertedRTSWebUSB(){await this.setDTRWebUSB(!1),await this.setRTSWebUSB(!1),await this.sleep(100),await this.setDTRWebUSB(!0),await this.setRTSWebUSB(!0),await this.sleep(50),await this.setDTRWebUSB(!1),await this.sleep(200)}isWebUSB(){return!0===this.port.isWebUSB}async connectWithResetStrategies(){const t=this.port.getInfo(),e=4097===t.usbProductId,i=12346===t.usbVendorId,a=[],r=this;if(this.isWebUSB()){const s=!e&&!i,n=4292===t.usbVendorId,h=6790===t.usbVendorId,o=12346===t.usbVendorId&&2===t.usbProductId;(e||i)&&(o?(a.push({name:"USB-JTAG/Serial (WebUSB) - ESP32-S2",fn:async()=>await r.hardResetUSBJTAGSerialWebUSB()}),a.push({name:"USB-JTAG/Serial Inverted DTR (WebUSB) - ESP32-S2",fn:async()=>await r.hardResetUSBJTAGSerialInvertedDTRWebUSB()}),a.push({name:"UnixTight (WebUSB) - ESP32-S2 CDC",fn:async()=>await r.hardResetUnixTightWebUSB()}),a.push({name:"Classic (WebUSB) - ESP32-S2 CDC",fn:async()=>await r.hardResetClassicWebUSB()})):(a.push({name:"USB-JTAG/Serial Inverted DTR (WebUSB)",fn:async()=>await r.hardResetUSBJTAGSerialInvertedDTRWebUSB()}),a.push({name:"USB-JTAG/Serial (WebUSB)",fn:async()=>await r.hardResetUSBJTAGSerialWebUSB()}),a.push({name:"Inverted DTR Classic (WebUSB)",fn:async()=>await r.hardResetInvertedDTRWebUSB()}))),s&&(h?(a.push({name:"UnixTight (WebUSB) - CH34x",fn:async()=>await r.hardResetUnixTightWebUSB()}),a.push({name:"Classic (WebUSB) - CH34x",fn:async()=>await r.hardResetClassicWebUSB()}),a.push({name:"Inverted Both (WebUSB) - CH34x",fn:async()=>await r.hardResetInvertedWebUSB()}),a.push({name:"Inverted RTS (WebUSB) - CH34x",fn:async()=>await r.hardResetInvertedRTSWebUSB()}),a.push({name:"Inverted DTR (WebUSB) - CH34x",fn:async()=>await r.hardResetInvertedDTRWebUSB()})):n?(a.push({name:"UnixTight (WebUSB) - CP2102",fn:async()=>await r.hardResetUnixTightWebUSB()}),a.push({name:"Classic (WebUSB) - CP2102",fn:async()=>await r.hardResetClassicWebUSB()}),a.push({name:"Inverted Both (WebUSB) - CP2102",fn:async()=>await r.hardResetInvertedWebUSB()}),a.push({name:"Inverted RTS (WebUSB) - CP2102",fn:async()=>await r.hardResetInvertedRTSWebUSB()}),a.push({name:"Inverted DTR (WebUSB) - CP2102",fn:async()=>await r.hardResetInvertedDTRWebUSB()})):(a.push({name:"UnixTight (WebUSB)",fn:async()=>await r.hardResetUnixTightWebUSB()}),a.push({name:"Classic (WebUSB)",fn:async function(){return await r.hardResetClassicWebUSB()}}),a.push({name:"Inverted Both (WebUSB)",fn:async function(){return await r.hardResetInvertedWebUSB()}}),a.push({name:"Inverted RTS (WebUSB)",fn:async function(){return await r.hardResetInvertedRTSWebUSB()}}),a.push({name:"Inverted DTR (WebUSB)",fn:async function(){return await r.hardResetInvertedDTRWebUSB()}}))),n||o||(6790!==t.usbVendorId&&a.push({name:"Classic (WebUSB)",fn:async function(){return await r.hardResetClassicWebUSB()}}),a.push({name:"UnixTight (WebUSB)",fn:async function(){return await r.hardResetUnixTightWebUSB()}}),a.push({name:"Classic Long Delay (WebUSB)",fn:async function(){return await r.hardResetClassicLongDelayWebUSB()}}),a.push({name:"Classic Short Delay (WebUSB)",fn:async function(){return await r.hardResetClassicShortDelayWebUSB()}}),e||i||a.push({name:"USB-JTAG/Serial fallback (WebUSB)",fn:async function(){return await r.hardResetUSBJTAGSerialWebUSB()}}))}else(e||i)&&a.push({name:"USB-JTAG/Serial",fn:async function(){return await r.hardResetUSBJTAGSerial()}}),a.push({name:"Classic",fn:async function(){return await r.hardResetClassic()}}),e||i||a.push({name:"USB-JTAG/Serial (fallback)",fn:async function(){return await r.hardResetUSBJTAGSerial()}});let n=null;for(const t of a)try{if(!this.connected||!this.port.writable){this.logger.log(`Port disconnected, skipping ${t.name} reset`);continue}this._abandonCurrentOperation=!1,await t.fn();if(await this.syncWithTimeout(3e3))return void this.logger.log(`Connected successfully with ${t.name} reset.`);throw new Error("Sync timeout or abandoned")}catch(e){if(n=e,this.logger.log(`${t.name} reset failed: ${e.message}`),this._abandonCurrentOperation=!0,await s(100),!this.connected||!this.port.writable){this.logger.log("Port disconnected during reset attempt");break}this._clearInputBuffer(),await this.drainInputBuffer(200),await this.flushSerialBuffers()}throw this._abandonCurrentOperation=!1,new Error(`Couldn't sync to ESP. Try resetting manually. Last error: ${null==n?void 0:n.message}`)}async hardReset(t=!1){t?4097===this.port.getInfo().usbProductId?(await this.hardResetUSBJTAGSerial(),this.logger.log("USB-JTAG/Serial reset.")):this.isWebUSB()?(await this.hardResetClassicWebUSB(),this.logger.log("Classic reset (WebUSB/Android).")):(await this.hardResetClassic(),this.logger.log("Classic reset.")):this.isWebUSB()?(await this.setRTSWebUSB(!0),await this.sleep(200),await this.setRTSWebUSB(!1),await this.sleep(200),this.logger.log("Hard reset (WebUSB).")):(await this.setRTS(!0),await this.sleep(100),await this.setRTS(!1),this.logger.log("Hard reset.")),await new Promise(t=>setTimeout(t,1e3))}macAddr(){const t=new Array(6).fill(0),e=this._efuses[0],i=this._efuses[1],a=this._efuses[2],s=this._efuses[3];let r;if(this.chipFamily==d){if(0!=s)r=[s>>16&255,s>>8&255,255&s];else if(i>>16&255){if(1!=(i>>16&255))throw new Error("Couldnt determine OUI");r=[172,208,116]}else r=[24,254,52];t[0]=r[0],t[1]=r[1],t[2]=r[2],t[3]=i>>8&255,t[4]=255&i,t[5]=e>>24&255}else if(this.chipFamily==u)t[0]=a>>8&255,t[1]=255&a,t[2]=i>>24&255,t[3]=i>>16&255,t[4]=i>>8&255,t[5]=255&i;else{if(this.chipFamily!=c&&this.chipFamily!=_&&this.chipFamily!=f&&this.chipFamily!=g&&this.chipFamily!=p&&this.chipFamily!=w&&this.chipFamily!=m&&this.chipFamily!=b&&this.chipFamily!=S&&this.chipFamily!=y&&this.chipFamily!=B&&this.chipFamily!=v)throw new Error("Unknown chip family");t[0]=i>>8&255,t[1]=255&i,t[2]=e>>24&255,t[3]=e>>16&255,t[4]=e>>8&255,t[5]=255&e}return t}async readRegister(t){this.debug&&this.logger.debug("Reading from Register "+a(t,8));const e=gi("<I",t);await this.sendCommand(10,e);const[i]=await this.getResponse(10);return i}async checkCommand(t,e,i=0,s=3e3){const r=async()=>{s=Math.min(s,X),await this.sendCommand(t,e,i);const[r,n]=await this.getResponse(t,s);if(null===n)throw new Error("Didn't get enough status bytes");let h=n,o=0;if(this.IS_STUB||this.chipFamily==d?o=2:[u,c,_,f,g,p,w,m,b,S,y,B,v].includes(this.chipFamily)||20===t?o=4:[2,4].includes(h.length)?o=h.length:(o=2,this.logger.debug(`Unknown chip family, defaulting to 2-byte status (opcode: ${a(t)}, data.length: ${h.length})`)),h.length<o)throw new Error("Didn't get enough status bytes");const l=h.slice(-o,h.length);if(h=h.slice(0,-o),this.debug&&(this.logger.debug("status",l),this.logger.debug("value",r),this.logger.debug("data",h)),1==l[0])throw 5==l[1]?(await this.drainInputBuffer(200),new Error("Invalid (unsupported) command "+a(t))):new Error("Command failure error code "+a(l[1]));return[r,h]};return this._commandLock=this._commandLock.then(r,r),this._commandLock}async sendCommand(e,i,a=0){const s=t([...gi("<BBHI",0,e,i.length,a),...i]);this.debug&&this.logger.debug(`Writing ${s.length} byte${1==s.length?"":"s"}:`,s),await this.writeToStream(s)}async readPacket(t){let e=null,r=!1;if(this._isCDCDevice){const n=Date.now();for(;;){if(this._abandonCurrentOperation)throw new rt("Operation abandoned (reset strategy timeout)");if(Date.now()-n>t){throw new rt("Timed out waiting for packet "+(null===e?"header":"content"))}if(0!==this._inputBufferAvailable)for(;this._inputBufferAvailable>0;){if(Date.now()-n>t){throw new rt("Timed out waiting for packet "+(null===e?"header":"content"))}const s=this._readByte();if(null===e){if(192!=s)throw this.debug&&(this.logger.debug("Read invalid data: "+a(s)),this.logger.debug("Remaining data in serial buffer: "+i(this._inputBuffer))),new rt("Invalid head of packet ("+a(s)+")");e=[]}else if(r)if(r=!1,220==s)e.push(192);else{if(221!=s)throw this.debug&&(this.logger.debug("Read invalid data: "+a(s)),this.logger.debug("Remaining data in serial buffer: "+i(this._inputBuffer))),new rt("Invalid SLIP escape (0xdb, "+a(s)+")");e.push(219)}else if(219==s)r=!0;else{if(192==s)return this.debug&&this.logger.debug("Received full packet: "+i(e)),this._compactInputBuffer(),e;e.push(s)}}else await s(1)}}else{let n=[];for(;;){if(this._abandonCurrentOperation)throw new rt("Operation abandoned (reset strategy timeout)");const h=Date.now();for(n=[];Date.now()-h<t;){if(this._inputBufferAvailable>0){n.push(this._readByte());break}await s(1)}if(0==n.length){throw new rt("Timed out waiting for packet "+(null===e?"header":"content"))}this.debug&&this.logger.debug("Read "+n.length+" bytes: "+i(n));for(const t of n)if(null===e){if(192!=t)throw this.debug&&(this.logger.debug("Read invalid data: "+a(t)),this.logger.debug("Remaining data in serial buffer: "+i(this._inputBuffer))),new rt("Invalid head of packet ("+a(t)+")");e=[]}else if(r)if(r=!1,220==t)e.push(192);else{if(221!=t)throw this.debug&&(this.logger.debug("Read invalid data: "+a(t)),this.logger.debug("Remaining data in serial buffer: "+i(this._inputBuffer))),new rt("Invalid SLIP escape (0xdb, "+a(t)+")");e.push(219)}else if(219==t)r=!0;else{if(192==t)return this.debug&&this.logger.debug("Received full packet: "+i(e)),this._compactInputBuffer(),e;e.push(t)}}}}async getResponse(t,e=3e3){for(let i=0;i<100;i++){const i=await this.readPacket(e);if(i.length<8)continue;const[s,r,,n]=pi("<BBHI",i.slice(0,8));if(1!=s)continue;const h=i.slice(8);if(null==t||r==t)return[n,h];if(0!=h[0]&&5==h[1])throw await this.drainInputBuffer(200),new Error(`Invalid (unsupported) command ${a(t)}`)}throw new Error("Response doesn't match request")}checksum(t,e=239){for(const i of t)e^=i;return e}async setBaudrate(t){if(this.chipFamily==d)throw new Error("Changing baud rate is not supported on the ESP8266");try{const e=gi("<II",t,this.IS_STUB?h:0);await this.checkCommand(15,e)}catch(e){throw this.logger.error(`Baudrate change error: ${e}`),new Error(`Unable to change the baud rate to ${t}: No response from set baud rate command.`)}this._parent?await this._parent.reconfigurePort(t):await this.reconfigurePort(t),await s(Q),this._parent?this._parent._currentBaudRate=t:this._currentBaudRate=t;const e=this._parent?this._parent._maxUSBSerialBaudrate:this._maxUSBSerialBaudrate;e&&t>e&&(this.logger.log(`⚠️ WARNING: Baudrate ${t} exceeds USB-Serial chip limit (${e})!`),this.logger.log("⚠️ This may cause data corruption or connection failures!")),this.logger.log(`Changed baud rate to ${t}`)}async reconfigurePort(t){var e;this._isReconfiguring=!0;try{try{await this._writeChain}catch(t){this.logger.debug(`Pending write error during reconfigure: ${t}`)}if(this.isWebUSB()){const e=this.port.getInfo(),i=6790===e.usbVendorId&&21971===e.usbProductId;if(!i&&"function"==typeof this.port.setBaudRate)return await this.port.setBaudRate(t),void await s(100)}if(this._writer){try{this._writer.releaseLock()}catch(t){this.logger.debug(`Writer release error during reconfigure: ${t}`)}this._writer=void 0}await(null===(e=this._reader)||void 0===e?void 0:e.cancel()),await this.port.close(),await this.port.open({baudRate:t}),await this.flushSerialBuffers(),this.readLoop()}catch(e){throw this.logger.error(`Reconfigure port error: ${e}`),new Error(`Unable to change the baud rate to ${t}: ${e}`)}finally{this._isReconfiguring=!1}}async syncWithTimeout(t){const e=Date.now();for(let i=0;i<5;i++){if(Date.now()-e>t)return!1;if(this._abandonCurrentOperation)return!1;this._clearInputBuffer();try{if(await this._sync())return await s(Q),!0}catch(t){if(this._abandonCurrentOperation)return!1}await s(Q)}return!1}async sync(){for(let t=0;t<5;t++){this._clearInputBuffer();if(await this._sync())return await s(Q),!0;await s(Q)}throw new Error("Couldn't sync to ESP. Try resetting.")}async _sync(){await this.sendCommand(8,l);for(let t=0;t<8;t++)try{const[,t]=await this.getResponse(8,Q);if(t.length>1&&0==t[0]&&0==t[1])return!0}catch(e){this.debug&&this.logger.debug(`Sync attempt ${t+1} failed: ${e}`)}return!1}getFlashWriteSize(){return this.IS_STUB?16384:1024}async flashData(t,e,i=0,s=!1){if(t.byteLength>=8){const e=Array.from(new Uint8Array(t,0,4)),i=e[0],s=e[2],r=e[3];this.logger.log(`Image header, Magic=${a(i)}, FlashMode=${a(s)}, FlashSizeFreq=${a(r)}`)}const r=t.byteLength;let n,h=0,o=K;s?(n=_i(new Uint8Array(t),{level:9}).buffer,h=n.byteLength,this.logger.log(`Writing data with filesize: ${r}. Compressed Size: ${h}`),o=await this.flashDeflBegin(r,h,i)):(this.logger.log(`Writing data with filesize: ${r}`),n=t,await this.flashBegin(r,i));let l=[],d=0,u=0,c=0;const _=Date.now(),f=this.getFlashWriteSize(),g=s?h:r;for(;g-c>0;)this.debug&&this.logger.log(`Writing at ${a(i+d*f,8)} `),g-c>=f?l=Array.from(new Uint8Array(n,c,f)):(l=Array.from(new Uint8Array(n,c,g-c)),s||(l=l.concat(new Array(f-l.length).fill(255)))),s?await this.flashDeflBlock(l,d,o):await this.flashBlock(l,d),d+=1,u+=s?Math.round(l.length*r/h):l.length,c+=f,e(Math.min(u,r),r);this.logger.log("Took "+(Date.now()-_)+"ms to write "+g+" bytes"),this.IS_STUB&&(await this.flashBegin(0,0),s?await this.flashDeflFinish():await this.flashFinish())}async flashBlock(t,e,i=3e3){await this.checkCommand(3,gi("<IIII",t.length,e,0,0).concat(t),this.checksum(t),i)}async flashDeflBlock(t,e,i=3e3){await this.checkCommand(17,gi("<IIII",t.length,e,0,0).concat(t),this.checksum(t),i)}async flashBegin(t=0,e=0,i=!1){let s;await this.flushSerialBuffers();const r=this.getFlashWriteSize();!this.IS_STUB&&[u,c,_,f,g,p,w,m,b,S,y,B,v].includes(this.chipFamily)&&await this.checkCommand(13,new Array(8).fill(0));const n=Math.floor((t+r-1)/r);s=this.chipFamily==d?this.getEraseSize(e,t):t;const h=this.IS_STUB?K:at(tt,t),o=Date.now();let l=gi("<IIII",s,n,r,e);return this.chipFamily!=u&&this.chipFamily!=c&&this.chipFamily!=_&&this.chipFamily!=f&&this.chipFamily!=g&&this.chipFamily!=p&&this.chipFamily!=w&&this.chipFamily!=m&&this.chipFamily!=b&&this.chipFamily!=S&&this.chipFamily!=y&&this.chipFamily!=B&&this.chipFamily!=v||(l=l.concat(gi("<I",i?1:0))),this.logger.log("Erase size "+s+", blocks "+n+", block size "+a(r,4)+", offset "+a(e,4)+", encrypted "+(i?"yes":"no")),await this.checkCommand(2,l,0,h),0==t||this.IS_STUB||this.logger.log("Took "+(Date.now()-o)+"ms to erase "+n+" bytes"),n}async flashDeflBegin(t=0,e=0,i=0){const a=this.getFlashWriteSize(),s=Math.floor((e+a-1)/a),r=Math.floor((t+a-1)/a);let n=0,h=0;this.IS_STUB?(n=t,h=at(tt,n)):(n=r*a,h=K);const o=gi("<IIII",n,s,a,i);return await this.checkCommand(16,o,0,h),h}async flashFinish(){const t=gi("<I",1);await this.checkCommand(4,t)}async flashDeflFinish(){const t=gi("<I",1);await this.checkCommand(18,t)}getBootloaderOffset(){return st(this.getChipFamily()).flashOffs}async flashId(){return await this.runSpiFlashCommand(159,[],24)}getChipFamily(){return this._parent?this._parent.chipFamily:this.chipFamily}async writeRegister(t,e,i=4294967295,a=0,s=0){let r=gi("<IIII",t,e,i,a);s>0&&(r=r.concat(gi("<IIII",st(this.getChipFamily()).uartDateReg,0,0,s))),await this.checkCommand(9,r)}async setDataLengths(t,e,i){if(-1!=t.mosiDlenOffs){const a=t.regBase+t.mosiDlenOffs,s=t.regBase+t.misoDlenOffs;e>0&&await this.writeRegister(a,e-1),i>0&&await this.writeRegister(s,i-1)}else{const a=t.regBase+t.usr1Offs,s=(0==i?0:i-1)<<8|(0==e?0:e-1)<<17;await this.writeRegister(a,s)}}async waitDone(t,e){for(let i=0;i<10;i++){if(0==(await this.readRegister(t)&e))return}throw Error("SPI command did not complete in time")}async runSpiFlashCommand(t,e,i=0){const s=st(this.getChipFamily()),r=s.regBase,n=r,h=r+s.usrOffs,o=r+s.usr2Offs,l=r+s.w0Offs,d=1<<18;if(i>32)throw new Error("Reading more than 32 bits back from a SPI flash operation is unsupported");if(e.length>64)throw new Error("Writing more than 64 bytes of data with one SPI command is unsupported");const u=8*e.length,c=await this.readRegister(h),_=await this.readRegister(o);let f=1<<31;if(i>0&&(f|=268435456),u>0&&(f|=134217728),await this.setDataLengths(s,u,i),await this.writeRegister(h,f),await this.writeRegister(o,7<<28|t),0==u)await this.writeRegister(l,0);else{const t=(4-e.length%4)%4;e=e.concat(new Array(t).fill(0));const i=pi("I".repeat(Math.floor(e.length/4)),e);let s=l;this.logger.debug(`Words Length: ${i.length}`);for(const t of i)this.logger.debug(`Writing word ${a(t)} to register offset ${a(s)}`),await this.writeRegister(s,t),s+=4}await this.writeRegister(n,d),await this.waitDone(n,d);const g=await this.readRegister(l);return await this.writeRegister(h,c),await this.writeRegister(o,_),g}async detectFlashSize(){this.logger.log("Detecting Flash Size");const t=await this.flashId(),e=255&t,i=t>>16&255;this.logger.log(`FlashId: ${a(t)}`),this.logger.log(`Flash Manufacturer: ${e.toString(16)}`),this.logger.log(`Flash Device: ${(t>>8&255).toString(16)}${i.toString(16)}`),this.flashSize=r[i],this.logger.log(`Auto-detected Flash size: ${this.flashSize}`)}getEraseSize(t,e){const i=n,a=Math.floor((e+i-1)/i);let s=16-Math.floor(t/i)%16;return a<s&&(s=a),a<2*s?Math.floor((a+1)/2*i):(a-s)*i}async memBegin(t,e,i,a){return await this.checkCommand(5,gi("<IIII",t,e,i,a))}async memBlock(t,e){return await this.checkCommand(7,gi("<IIII",t.length,e,0,0).concat(t),this.checksum(t))}async memFinish(t=0){const e=this.IS_STUB?K:500,i=gi("<II",0==t?1:0,t);return await this.checkCommand(6,i,0,e)}async runStub(t=!1){const e=await nt(this.chipFamily,this.chipRevision);if(null===e)return this.logger.log(`Stub flasher is not yet supported on ${this.chipName}, using ROM loader`),this;const i=2048;this.logger.log("Uploading stub...");for(const t of["text","data"]){const a=e[t],s=e[`${t}_start`],r=a.length,n=Math.floor((r+i-1)/i);await this.memBegin(r,n,i,s);for(const t of Array(n).keys()){const e=t*i;let s=e+i;s>r&&(s=r),await this.memBlock(a.slice(e,s),t)}}await this.memFinish(e.entry);const a=await this.readPacket(500),s=String.fromCharCode(...a);if("OHAI"!=s)throw new Error("Failed to start stub. Unexpected response: "+s);this.logger.log("Stub is now running...");const r=new mi(this.port,this.logger,this);return t||await r.detectFlashSize(),r}get _writer(){return this._parent?this._parent._writer:this.__writer}set _writer(t){this._parent?this._parent._writer=t:this.__writer=t}get _writeChain(){return this._parent?this._parent._writeChain:this.__writeChain}set _writeChain(t){this._parent?this._parent._writeChain=t:this.__writeChain=t}async writeToStream(t){if(this.port.writable){if(this._isReconfiguring)throw new Error("Cannot write during port reconfiguration");this._writeChain=this._writeChain.then(async()=>{if(!this.port.writable)throw new Error("Port became unavailable during write");if(!this._writer)try{this._writer=this.port.writable.getWriter()}catch(t){throw this.logger.error(`Failed to get writer: ${t}`),t}await this._writer.write(new Uint8Array(t))},async()=>{if(this.logger.debug("Previous write failed, attempting recovery for current write"),!this.port.writable)throw new Error("Port became unavailable during write");if(!this._writer)try{this._writer=this.port.writable.getWriter()}catch(t){throw this.logger.debug(`Failed to get writer in recovery: ${t}`),new Error("Cannot acquire writer lock")}await this._writer.write(new Uint8Array(t))}).catch(t=>{if(this.logger.error(`Write error: ${t}`),this._writer){try{this._writer.releaseLock()}catch{}this._writer=void 0}throw t}),await this._writeChain}else this.logger.debug("Port writable stream not available, skipping write")}async disconnect(){if(this._parent)await this._parent.disconnect();else if(this.port.writable){try{await this._writeChain}catch(t){this.logger.debug(`Pending write error during disconnect: ${t}`)}if(this._writer){try{await this._writer.close(),this._writer.releaseLock()}catch(t){this.logger.debug(`Writer close/release error: ${t}`)}this._writer=void 0}else try{const t=this.port.writable.getWriter();await t.close(),t.releaseLock()}catch(t){this.logger.debug(`Direct writer close error: ${t}`)}await new Promise(t=>{if(!this._reader)return void t(void 0);const e=setTimeout(()=>{this.logger.debug("Disconnect timeout - forcing resolution"),t(void 0)},1e3);this.addEventListener("disconnect",()=>{clearTimeout(e),t(void 0)},{once:!0});try{this._reader.cancel()}catch(i){this.logger.debug(`Reader cancel error: ${i}`),clearTimeout(e),t(void 0)}}),this.connected=!1;try{await this.port.close(),this.logger.debug("Port closed successfully")}catch(t){this.logger.debug(`Port close error: ${t}`)}}else this.logger.debug("Port already closed, skipping disconnect")}async reconnect(){if(this._parent)await this._parent.reconnect();else try{this.logger.log("Reconnecting serial port..."),this.connected=!1,this.__inputBuffer=[],this.__inputBufferReadIndex=0;try{await this._writeChain}catch(t){this.logger.debug(`Pending write error during reconnect: ${t}`)}if(this._isReconfiguring=!0,this._writer){try{this._writer.releaseLock()}catch(t){this.logger.debug(`Writer release error during reconnect: ${t}`)}this._writer=void 0}if(this._reader){try{await this._reader.cancel()}catch(t){this.logger.debug(`Reader cancel error: ${t}`)}this._reader=void 0}try{await this.port.close(),this.logger.log("Port closed")}catch(t){this.logger.debug(`Port close error: ${t}`)}this.logger.debug("Opening port...");try{await this.port.open({baudRate:h}),this.connected=!0}catch(t){throw new Error(`Failed to open port: ${t}`)}if(!this.port.readable||!this.port.writable)throw new Error(`Port streams not available after open (readable: ${!!this.port.readable}, writable: ${!!this.port.writable})`);this._isReconfiguring=!1;const t=this.chipFamily,e=this.chipName,i=this.chipRevision,a=this.chipVariant,s=this.flashSize;if(await this.hardReset(!0),this._parent||(this.__inputBuffer=[],this.__inputBufferReadIndex=0,this.__totalBytesRead=0,this.readLoop()),await this.flushSerialBuffers(),await this.sync(),this.chipFamily=t,this.chipName=e,this.chipRevision=i,this.chipVariant=a,this.flashSize=s,this.logger.debug(`Reconnect complete (chip: ${this.chipName})`),!this.port.writable||!this.port.readable)throw new Error("Port not ready after reconnect");const r=await this.runStub(!0);if(this.logger.debug("Stub loaded"),this._currentBaudRate!==h&&(await r.setBaudrate(this._currentBaudRate),!this.port.writable||!this.port.readable))throw new Error(`Port not ready after baudrate change (readable: ${!!this.port.readable}, writable: ${!!this.port.writable})`);this.IS_STUB=!0,this.logger.debug("Reconnection successful")}catch(t){throw this._isReconfiguring=!1,t}}async drainInputBuffer(t=200){await s(t);let e=0;const i=Date.now();for(;e<112&&Date.now()-i<100;)if(this._inputBufferAvailable>0){void 0!==this._readByte()&&e++}else await s(1);e>0&&this.logger.debug(`Drained ${e} bytes from input buffer`),this._parent||(this.__inputBuffer=[],this.__inputBufferReadIndex=0)}async flushSerialBuffers(){this._parent||(this.__inputBuffer=[],this.__inputBufferReadIndex=0),await s(Q),this._parent||(this.__inputBuffer=[],this.__inputBufferReadIndex=0),this.logger.debug("Serial buffers flushed")}async readFlash(e,i,a){if(!this.IS_STUB)throw new Error("Reading flash is only supported in stub mode. Please run runStub() first.");let r;await this.flushSerialBuffers(),this.logger.log(`Reading ${i} bytes from flash at address 0x${e.toString(16)}...`),this.isWebUSB()&&(this._isCDCDevice?(this._adaptiveBlockMultiplier=8,this._adaptiveMaxInFlightMultiplier=8,this._consecutiveSuccessfulChunks=0,this.logger.debug(`CDC device - Initialized: blockMultiplier=${this._adaptiveBlockMultiplier}, maxInFlightMultiplier=${this._adaptiveMaxInFlightMultiplier}`)):(this._adaptiveBlockMultiplier=1,this._adaptiveMaxInFlightMultiplier=1,this._consecutiveSuccessfulChunks=0,this.logger.debug("Non-CDC device - Fixed values: blockSize=31, maxInFlight=31"))),r=this.isWebUSB()?16384:262144;let n=new Uint8Array(0),h=e,o=i;for(;o>0;){const e=Math.min(r,o);let l=!1,d=0;const u=5;let c=!1;for(;!l&&d<=u;){let i=new Uint8Array(0),a=0;try{let r,o;if(0===d&&this.logger.debug(`Reading chunk at 0x${h.toString(16)}, size: 0x${e.toString(16)}`),this.isWebUSB()){const t=this.port.maxTransferSize||64,e=Math.floor((t-2)/2);r=e*this._adaptiveBlockMultiplier,o=e*this._adaptiveMaxInFlightMultiplier}else{const t=63;r=65*t,o=130*t}const u=gi("<IIII",h,e,r,o),[c]=await this.checkCommand(210,u);if(0!=c)throw new Error("Failed to read memory: "+c);for(;i.length<e;){let r;try{r=await this.readPacket(100)}catch(t){if(t instanceof rt){this.logger.debug(`SLIP read error at ${i.length} bytes: ${t.message}`);try{const t=[192,192];await this.writeToStream(t),this.logger.debug("Sent abort frame to stub"),await s(50)}catch(t){this.logger.debug(`Abort frame error: ${t}`)}if(await this.drainInputBuffer(200),i.length>=e)break}throw t}if(r&&r.length>0){const s=new Uint8Array(r),n=new Uint8Array(i.length+s.length);n.set(i),n.set(s,i.length),i=n;if(i.length>=e||i.length>=a+o){const e=gi("<I",i.length),s=t(e);await this.writeToStream(s),a=i.length}}}const _=new Uint8Array(n.length+i.length);if(_.set(n),_.set(i,n.length),n=_,l=!0,this.isWebUSB()&&this._isCDCDevice&&0===d&&(this._consecutiveSuccessfulChunks++,this._consecutiveSuccessfulChunks>=2)){const t=this.port.maxTransferSize||64,e=Math.floor((t-2)/2),i=8,a=8;let s=!1;if(this._adaptiveBlockMultiplier<i?(this._adaptiveBlockMultiplier=Math.min(2*this._adaptiveBlockMultiplier,i),s=!0):this._adaptiveMaxInFlightMultiplier<a&&(this._adaptiveMaxInFlightMultiplier=Math.min(2*this._adaptiveMaxInFlightMultiplier,a),s=!0),s){const t=e*this._adaptiveBlockMultiplier,i=e*this._adaptiveMaxInFlightMultiplier;this.logger.debug(`Speed increased: blockSize=${t}, maxInFlight=${i}`),this._lastAdaptiveAdjustment=Date.now()}this._consecutiveSuccessfulChunks=0}}catch(t){if(d++,this.isWebUSB()&&this._isCDCDevice&&1===d)if(this._adaptiveBlockMultiplier>1||this._adaptiveMaxInFlightMultiplier>1){this._adaptiveBlockMultiplier=1,this._adaptiveMaxInFlightMultiplier=1,this._consecutiveSuccessfulChunks=0;const t=this.port.maxTransferSize||64,e=Math.floor((t-2)/2),i=e*this._adaptiveBlockMultiplier,a=e*this._adaptiveMaxInFlightMultiplier;this.logger.debug(`Error at higher speed - reduced to minimum: blockSize=${i}, maxInFlight=${a}`)}else this.logger.debug("Error at minimum speed (blockSize=31, maxInFlight=31) - not a speed issue");if(!(t instanceof rt))throw t;if(d<=u){this.logger.log(`${t.message} at 0x${h.toString(16)}. Draining buffer and retrying (attempt ${d}/${u})...`);try{await this.drainInputBuffer(200),await this.flushSerialBuffers(),await s(Q)}catch(t){this.logger.debug(`Buffer drain error: ${t}`)}}else{if(c)throw new Error(`Failed to read chunk at 0x${h.toString(16)} after ${u} retries and recovery attempt`);c=!0,this.logger.log(`All retries exhausted at 0x${h.toString(16)}. Attempting recovery (close and reopen port)...`);try{await this.reconnect(),this.logger.log("Deep recovery successful. Resuming read from current position..."),d=0;continue}catch(t){throw new Error(`Failed to read chunk at 0x${h.toString(16)} after ${u} retries and recovery failed: ${t}`)}}}}a&&a(new Uint8Array(e),n.length,i),h+=e,o-=e,this.logger.debug(`Total progress: 0x${n.length.toString(16)} from 0x${i.toString(16)} bytes`)}return n}}class mi extends wi{constructor(){super(...arguments),this.IS_STUB=!0}async memBegin(t,e,i,s){const r=await nt(this.chipFamily,this.chipRevision);if(null===r)return[0,[]];const n=s,h=s+t;this.logger.debug(`Load range: ${a(n,8)}-${a(h,8)}`),this.logger.debug(`Stub data: ${a(r.data_start,8)}, len: ${r.data.length}, text: ${a(r.text_start,8)}, len: ${r.text.length}`);for(const[t,e]of[[r.data_start,r.data_start+r.data.length],[r.text_start,r.text_start+r.text.length]])if(n<e&&h>t)throw new Error("Software loader is resident at "+a(t,8)+"-"+a(e,8)+". Can't load binary at overlapping address range "+a(n,8)+"-"+a(h,8)+". Try changing the binary loading address.");return[0,[]]}async eraseFlash(){await this.checkCommand(208,[],0,Y)}async eraseRegion(t,e){if(t<0)throw new Error(`Invalid offset: ${t} (must be non-negative)`);if(e<0)throw new Error(`Invalid size: ${e} (must be non-negative)`);if(0===e)return void this.logger.log("eraseRegion: size is 0, skipping erase");if(t%n!==0)throw new Error(`Offset ${t} (0x${t.toString(16)}) is not aligned to flash sector size 4096 (0x${n.toString(16)})`);if(e%n!==0)throw new Error(`Size ${e} (0x${e.toString(16)}) is not aligned to flash sector size 4096 (0x${n.toString(16)})`);const i=4294967295;if(t>i)throw new Error(`Offset ${t} exceeds maximum value 4294967295`);if(e>i)throw new Error(`Size ${e} exceeds maximum value 4294967295`);if(t+e>i)throw new Error(`Region end (offset + size = ${t+e}) exceeds maximum addressable range 4294967295`);const a=at(tt,e),s=gi("<II",t,e);await this.checkCommand(209,s,0,a)}}const bi=async t=>{let e;const i=globalThis.requestSerialPort;if("function"==typeof i)e=await i();else{if(!navigator.serial)throw new Error("Web Serial API is not supported in this browser. Please use Chrome, Edge, or Opera on desktop, or Chrome on Android. Note: The page must be served over HTTPS or localhost.");e=await navigator.serial.requestPort()}return e.readable&&e.writable||await e.open({baudRate:h}),new wi(e,t)},Si=async(t,e)=>{if(!t)throw new Error("Port is required");return t.readable&&t.writable||await t.open({baudRate:h}),new wi(t,e)};export{Y as CHIP_ERASE_TIMEOUT,u as CHIP_FAMILY_ESP32,f as CHIP_FAMILY_ESP32C2,g as CHIP_FAMILY_ESP32C3,p as CHIP_FAMILY_ESP32C5,w as CHIP_FAMILY_ESP32C6,m as CHIP_FAMILY_ESP32C61,b as CHIP_FAMILY_ESP32H2,y as CHIP_FAMILY_ESP32H21,S as CHIP_FAMILY_ESP32H4,B as CHIP_FAMILY_ESP32P4,c as CHIP_FAMILY_ESP32S2,_ as CHIP_FAMILY_ESP32S3,v as CHIP_FAMILY_ESP32S31,d as CHIP_FAMILY_ESP8266,K as DEFAULT_TIMEOUT,tt as ERASE_REGION_TIMEOUT_PER_MB,wi as ESPLoader,P as ESP_CHANGE_BAUDRATE,Z as ESP_CHECKSUM_MAGIC,O as ESP_ERASE_FLASH,A as ESP_ERASE_REGION,I as ESP_FLASH_BEGIN,T as ESP_FLASH_DATA,V as ESP_FLASH_DEFL_BEGIN,H as ESP_FLASH_DEFL_DATA,j as ESP_FLASH_DEFL_END,x as ESP_FLASH_END,N as ESP_GET_SECURITY_INFO,D as ESP_MEM_BEGIN,C as ESP_MEM_DATA,k as ESP_MEM_END,q as ESP_RAM_BLOCK,E as ESP_READ_FLASH,W as ESP_READ_REG,M as ESP_SPI_ATTACH,L as ESP_SPI_FLASH_MD5,$ as ESP_SPI_SET_PARAMS,F as ESP_SYNC,z as ESP_WRITE_REG,it as FLASH_READ_TIMEOUT,X as MAX_TIMEOUT,et as MEM_END_ROM_TIMEOUT,G as ROM_INVALID_RECV_MSG,Q as SYNC_TIMEOUT,J as USB_RAM_BLOCK,bi as connect,Si as connectWithPort};
1
+ const t=t=>{let e=[192];for(const i of t)219==i?e=e.concat([219,221]):192==i?e=e.concat([219,220]):e.push(i);return e.push(192),e},e=t=>{const e=[];for(let i=0;i<t.length;i++){const a=t.charCodeAt(i);a<=255&&e.push(a)}return e},i=t=>"["+t.map(t=>a(t)).join(", ")+"]",a=(t,e=2)=>{const i=t.toString(16).toUpperCase();return i.startsWith("-")?"-0x"+i.substring(1).padStart(e,"0"):"0x"+i.padStart(e,"0")},s=t=>new Promise(e=>setTimeout(e,t)),r={18:"256KB",19:"512KB",20:"1MB",21:"2MB",22:"4MB",23:"8MB",24:"16MB",25:"32MB",26:"64MB",27:"128MB",28:"256MB",32:"64MB",33:"128MB",34:"256MB",50:"256KB",51:"512KB",52:"1MB",53:"2MB",54:"4MB",55:"8MB",56:"16MB",57:"32MB",58:"64MB"},n=4096,h=115200,o=1343410176,l=e(" UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU"),d=33382,u=50,c=12882,_=12883,f=12994,g=12995,p=12997,w=12998,m=207969,b=12914,S=12916,y=12917,B=12928,R=12849,v={5:{name:"ESP32-C3",family:g},9:{name:"ESP32-S3",family:_},12:{name:"ESP32-C2",family:f},13:{name:"ESP32-C6",family:w},16:{name:"ESP32-H2",family:b},18:{name:"ESP32-P4",family:B},20:{name:"ESP32-C61",family:m},23:{name:"ESP32-C5",family:p},25:{name:"ESP32-H21",family:y},28:{name:"ESP32-H4",family:S},32:{name:"ESP32-S31",family:R}},U={4293968129:{name:"ESP8266",family:d},15736195:{name:"ESP32",family:u},1990:{name:"ESP32-S2",family:c}},T=2,I=3,D=4,x=5,k=6,C=7,F=8,z=9,W=10,O=208,E=209,A=210,$=11,P=13,M=15,L=19,N=20,Z=239,V=16,H=17,j=18,G=5,J=2048,q=6144,K=3e3,Y=15e4,X=3e5,Q=100,tt=3e4,et=500,it=100,at=(t,e)=>{const i=Math.floor(t*(e/486));return i<K?K:i},st=t=>{switch(t){case u:return{regBase:1072963584,baseFuse:1073061888,macFuse:1073061888,usrOffs:28,usr1Offs:32,usr2Offs:36,mosiDlenOffs:40,misoDlenOffs:44,w0Offs:128,uartDateReg:1610612856,flashOffs:4096};case c:return{regBase:1061167104,baseFuse:1061265408,macFuse:1061265476,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612856,flashOffs:4096};case _:return{regBase:1610620928,usrOffs:24,baseFuse:1610641408,macFuse:1610641476,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612864,flashOffs:0};case d:return{regBase:1610613248,usrOffs:28,baseFuse:1072693328,macFuse:1072693328,usr1Offs:32,usr2Offs:36,mosiDlenOffs:-1,misoDlenOffs:-1,w0Offs:64,uartDateReg:1610612856,flashOffs:0};case f:case g:return{regBase:1610620928,baseFuse:1610647552,macFuse:1610647620,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612860,flashOffs:0};case p:return{regBase:1610625024,baseFuse:1611352064,macFuse:1611352132,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612860,flashOffs:8192};case w:return{regBase:1610625024,baseFuse:1611335680,macFuse:1611335748,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612860,flashOffs:0};case m:return{regBase:1610625024,baseFuse:1611352064,macFuse:1611352132,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612860,flashOffs:0};case b:return{regBase:1610625024,baseFuse:1611335680,macFuse:1611335748,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612860,flashOffs:0};case S:return{regBase:1611239424,baseFuse:1611339776,macFuse:1611339844,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610686588,flashOffs:8192};case y:return{regBase:1610625024,baseFuse:1611350016,macFuse:1611350084,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612860,flashOffs:0};case B:return{regBase:1342754816,baseFuse:o,macFuse:1343410244,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1343004812,flashOffs:8192};case R:return{regBase:542113792,baseFuse:544296960,macFuse:544297028,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:540582028,flashOffs:8192};default:return{regBase:-1,baseFuse:-1,macFuse:-1,usrOffs:-1,usr1Offs:-1,usr2Offs:-1,mosiDlenOffs:-1,misoDlenOffs:-1,w0Offs:-1,uartDateReg:-1,flashOffs:-1}}};class rt extends Error{constructor(t){super(t),this.name="SlipReadError"}}const nt=async(t,i)=>{let a;if(t==S||t==y||t==R)return null;if(t==u)a=await import("./esp32-BRKoi17y.js");else if(t==c)a=await import("./esp32s2-iX3WoDbg.js");else if(t==_)a=await import("./esp32s3-DGwDVIgz.js");else if(t==d)a=await import("./esp8266-CUwxJpGa.js");else if(t==f)a=await import("./esp32c2-Btgr_lwh.js");else if(t==g)a=await import("./esp32c3-CHKfoI8W.js");else if(t==p)a=await import("./esp32c5-BDW4KtLo.js");else if(t==w)a=await import("./esp32c6-il8tTxAG.js");else if(t==m)a=await import("./esp32c61-thKzxBGf.js");else if(t==b)a=await import("./esp32h2-CxoUHv_P.js");else{if(t!=B)return null;a=null!=i&&i>=300?await import("./esp32p4r3-CqI71ojR.js"):await import("./esp32p4-D3jLP-jY.js")}return{...a,text:e(atob(a.text)),data:e(atob(a.data))}};function ht(t){let e=t.length;for(;--e>=0;)t[e]=0}const ot=256,lt=286,dt=30,ut=15,ct=new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]),_t=new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]),ft=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]),gt=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),pt=new Array(576);ht(pt);const wt=new Array(60);ht(wt);const mt=new Array(512);ht(mt);const bt=new Array(256);ht(bt);const St=new Array(29);ht(St);const yt=new Array(dt);function Bt(t,e,i,a,s){this.static_tree=t,this.extra_bits=e,this.extra_base=i,this.elems=a,this.max_length=s,this.has_stree=t&&t.length}let Rt,vt,Ut;function Tt(t,e){this.dyn_tree=t,this.max_code=0,this.stat_desc=e}ht(yt);const It=t=>t<256?mt[t]:mt[256+(t>>>7)],Dt=(t,e)=>{t.pending_buf[t.pending++]=255&e,t.pending_buf[t.pending++]=e>>>8&255},xt=(t,e,i)=>{t.bi_valid>16-i?(t.bi_buf|=e<<t.bi_valid&65535,Dt(t,t.bi_buf),t.bi_buf=e>>16-t.bi_valid,t.bi_valid+=i-16):(t.bi_buf|=e<<t.bi_valid&65535,t.bi_valid+=i)},kt=(t,e,i)=>{xt(t,i[2*e],i[2*e+1])},Ct=(t,e)=>{let i=0;do{i|=1&t,t>>>=1,i<<=1}while(--e>0);return i>>>1},Ft=(t,e,i)=>{const a=new Array(16);let s,r,n=0;for(s=1;s<=ut;s++)n=n+i[s-1]<<1,a[s]=n;for(r=0;r<=e;r++){let e=t[2*r+1];0!==e&&(t[2*r]=Ct(a[e]++,e))}},zt=t=>{let e;for(e=0;e<lt;e++)t.dyn_ltree[2*e]=0;for(e=0;e<dt;e++)t.dyn_dtree[2*e]=0;for(e=0;e<19;e++)t.bl_tree[2*e]=0;t.dyn_ltree[512]=1,t.opt_len=t.static_len=0,t.sym_next=t.matches=0},Wt=t=>{t.bi_valid>8?Dt(t,t.bi_buf):t.bi_valid>0&&(t.pending_buf[t.pending++]=t.bi_buf),t.bi_buf=0,t.bi_valid=0},Ot=(t,e,i,a)=>{const s=2*e,r=2*i;return t[s]<t[r]||t[s]===t[r]&&a[e]<=a[i]},Et=(t,e,i)=>{const a=t.heap[i];let s=i<<1;for(;s<=t.heap_len&&(s<t.heap_len&&Ot(e,t.heap[s+1],t.heap[s],t.depth)&&s++,!Ot(e,a,t.heap[s],t.depth));)t.heap[i]=t.heap[s],i=s,s<<=1;t.heap[i]=a},At=(t,e,i)=>{let a,s,r,n,h=0;if(0!==t.sym_next)do{a=255&t.pending_buf[t.sym_buf+h++],a+=(255&t.pending_buf[t.sym_buf+h++])<<8,s=t.pending_buf[t.sym_buf+h++],0===a?kt(t,s,e):(r=bt[s],kt(t,r+ot+1,e),n=ct[r],0!==n&&(s-=St[r],xt(t,s,n)),a--,r=It(a),kt(t,r,i),n=_t[r],0!==n&&(a-=yt[r],xt(t,a,n)))}while(h<t.sym_next);kt(t,256,e)},$t=(t,e)=>{const i=e.dyn_tree,a=e.stat_desc.static_tree,s=e.stat_desc.has_stree,r=e.stat_desc.elems;let n,h,o,l=-1;for(t.heap_len=0,t.heap_max=573,n=0;n<r;n++)0!==i[2*n]?(t.heap[++t.heap_len]=l=n,t.depth[n]=0):i[2*n+1]=0;for(;t.heap_len<2;)o=t.heap[++t.heap_len]=l<2?++l:0,i[2*o]=1,t.depth[o]=0,t.opt_len--,s&&(t.static_len-=a[2*o+1]);for(e.max_code=l,n=t.heap_len>>1;n>=1;n--)Et(t,i,n);o=r;do{n=t.heap[1],t.heap[1]=t.heap[t.heap_len--],Et(t,i,1),h=t.heap[1],t.heap[--t.heap_max]=n,t.heap[--t.heap_max]=h,i[2*o]=i[2*n]+i[2*h],t.depth[o]=(t.depth[n]>=t.depth[h]?t.depth[n]:t.depth[h])+1,i[2*n+1]=i[2*h+1]=o,t.heap[1]=o++,Et(t,i,1)}while(t.heap_len>=2);t.heap[--t.heap_max]=t.heap[1],((t,e)=>{const i=e.dyn_tree,a=e.max_code,s=e.stat_desc.static_tree,r=e.stat_desc.has_stree,n=e.stat_desc.extra_bits,h=e.stat_desc.extra_base,o=e.stat_desc.max_length;let l,d,u,c,_,f,g=0;for(c=0;c<=ut;c++)t.bl_count[c]=0;for(i[2*t.heap[t.heap_max]+1]=0,l=t.heap_max+1;l<573;l++)d=t.heap[l],c=i[2*i[2*d+1]+1]+1,c>o&&(c=o,g++),i[2*d+1]=c,d>a||(t.bl_count[c]++,_=0,d>=h&&(_=n[d-h]),f=i[2*d],t.opt_len+=f*(c+_),r&&(t.static_len+=f*(s[2*d+1]+_)));if(0!==g){do{for(c=o-1;0===t.bl_count[c];)c--;t.bl_count[c]--,t.bl_count[c+1]+=2,t.bl_count[o]--,g-=2}while(g>0);for(c=o;0!==c;c--)for(d=t.bl_count[c];0!==d;)u=t.heap[--l],u>a||(i[2*u+1]!==c&&(t.opt_len+=(c-i[2*u+1])*i[2*u],i[2*u+1]=c),d--)}})(t,e),Ft(i,l,t.bl_count)},Pt=(t,e,i)=>{let a,s,r=-1,n=e[1],h=0,o=7,l=4;for(0===n&&(o=138,l=3),e[2*(i+1)+1]=65535,a=0;a<=i;a++)s=n,n=e[2*(a+1)+1],++h<o&&s===n||(h<l?t.bl_tree[2*s]+=h:0!==s?(s!==r&&t.bl_tree[2*s]++,t.bl_tree[32]++):h<=10?t.bl_tree[34]++:t.bl_tree[36]++,h=0,r=s,0===n?(o=138,l=3):s===n?(o=6,l=3):(o=7,l=4))},Mt=(t,e,i)=>{let a,s,r=-1,n=e[1],h=0,o=7,l=4;for(0===n&&(o=138,l=3),a=0;a<=i;a++)if(s=n,n=e[2*(a+1)+1],!(++h<o&&s===n)){if(h<l)do{kt(t,s,t.bl_tree)}while(0!==--h);else 0!==s?(s!==r&&(kt(t,s,t.bl_tree),h--),kt(t,16,t.bl_tree),xt(t,h-3,2)):h<=10?(kt(t,17,t.bl_tree),xt(t,h-3,3)):(kt(t,18,t.bl_tree),xt(t,h-11,7));h=0,r=s,0===n?(o=138,l=3):s===n?(o=6,l=3):(o=7,l=4)}};let Lt=!1;const Nt=(t,e,i,a)=>{xt(t,0+(a?1:0),3),Wt(t),Dt(t,i),Dt(t,~i),i&&t.pending_buf.set(t.window.subarray(e,e+i),t.pending),t.pending+=i};var Zt=(t,e,i,a)=>{let s,r,n=0;t.level>0?(2===t.strm.data_type&&(t.strm.data_type=(t=>{let e,i=4093624447;for(e=0;e<=31;e++,i>>>=1)if(1&i&&0!==t.dyn_ltree[2*e])return 0;if(0!==t.dyn_ltree[18]||0!==t.dyn_ltree[20]||0!==t.dyn_ltree[26])return 1;for(e=32;e<ot;e++)if(0!==t.dyn_ltree[2*e])return 1;return 0})(t)),$t(t,t.l_desc),$t(t,t.d_desc),n=(t=>{let e;for(Pt(t,t.dyn_ltree,t.l_desc.max_code),Pt(t,t.dyn_dtree,t.d_desc.max_code),$t(t,t.bl_desc),e=18;e>=3&&0===t.bl_tree[2*gt[e]+1];e--);return t.opt_len+=3*(e+1)+5+5+4,e})(t),s=t.opt_len+3+7>>>3,r=t.static_len+3+7>>>3,r<=s&&(s=r)):s=r=i+5,i+4<=s&&-1!==e?Nt(t,e,i,a):4===t.strategy||r===s?(xt(t,2+(a?1:0),3),At(t,pt,wt)):(xt(t,4+(a?1:0),3),((t,e,i,a)=>{let s;for(xt(t,e-257,5),xt(t,i-1,5),xt(t,a-4,4),s=0;s<a;s++)xt(t,t.bl_tree[2*gt[s]+1],3);Mt(t,t.dyn_ltree,e-1),Mt(t,t.dyn_dtree,i-1)})(t,t.l_desc.max_code+1,t.d_desc.max_code+1,n+1),At(t,t.dyn_ltree,t.dyn_dtree)),zt(t),a&&Wt(t)},Vt={_tr_init:t=>{Lt||((()=>{let t,e,i,a,s;const r=new Array(16);for(i=0,a=0;a<28;a++)for(St[a]=i,t=0;t<1<<ct[a];t++)bt[i++]=a;for(bt[i-1]=a,s=0,a=0;a<16;a++)for(yt[a]=s,t=0;t<1<<_t[a];t++)mt[s++]=a;for(s>>=7;a<dt;a++)for(yt[a]=s<<7,t=0;t<1<<_t[a]-7;t++)mt[256+s++]=a;for(e=0;e<=ut;e++)r[e]=0;for(t=0;t<=143;)pt[2*t+1]=8,t++,r[8]++;for(;t<=255;)pt[2*t+1]=9,t++,r[9]++;for(;t<=279;)pt[2*t+1]=7,t++,r[7]++;for(;t<=287;)pt[2*t+1]=8,t++,r[8]++;for(Ft(pt,287,r),t=0;t<dt;t++)wt[2*t+1]=5,wt[2*t]=Ct(t,5);Rt=new Bt(pt,ct,257,lt,ut),vt=new Bt(wt,_t,0,dt,ut),Ut=new Bt(new Array(0),ft,0,19,7)})(),Lt=!0),t.l_desc=new Tt(t.dyn_ltree,Rt),t.d_desc=new Tt(t.dyn_dtree,vt),t.bl_desc=new Tt(t.bl_tree,Ut),t.bi_buf=0,t.bi_valid=0,zt(t)},_tr_stored_block:Nt,_tr_flush_block:Zt,_tr_tally:(t,e,i)=>(t.pending_buf[t.sym_buf+t.sym_next++]=e,t.pending_buf[t.sym_buf+t.sym_next++]=e>>8,t.pending_buf[t.sym_buf+t.sym_next++]=i,0===e?t.dyn_ltree[2*i]++:(t.matches++,e--,t.dyn_ltree[2*(bt[i]+ot+1)]++,t.dyn_dtree[2*It(e)]++),t.sym_next===t.sym_end),_tr_align:t=>{xt(t,2,3),kt(t,256,pt),(t=>{16===t.bi_valid?(Dt(t,t.bi_buf),t.bi_buf=0,t.bi_valid=0):t.bi_valid>=8&&(t.pending_buf[t.pending++]=255&t.bi_buf,t.bi_buf>>=8,t.bi_valid-=8)})(t)}};var Ht=(t,e,i,a)=>{let s=65535&t,r=t>>>16&65535,n=0;for(;0!==i;){n=i>2e3?2e3:i,i-=n;do{s=s+e[a++]|0,r=r+s|0}while(--n);s%=65521,r%=65521}return s|r<<16};const jt=new Uint32Array((()=>{let t,e=[];for(var i=0;i<256;i++){t=i;for(var a=0;a<8;a++)t=1&t?3988292384^t>>>1:t>>>1;e[i]=t}return e})());var Gt=(t,e,i,a)=>{const s=jt,r=a+i;t^=-1;for(let i=a;i<r;i++)t=t>>>8^s[255&(t^e[i])];return-1^t},Jt={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"},qt={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_OK:0,Z_STREAM_END:1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_UNKNOWN:2,Z_DEFLATED:8};const{_tr_init:Kt,_tr_stored_block:Yt,_tr_flush_block:Xt,_tr_tally:Qt,_tr_align:te}=Vt,{Z_NO_FLUSH:ee,Z_PARTIAL_FLUSH:ie,Z_FULL_FLUSH:ae,Z_FINISH:se,Z_BLOCK:re,Z_OK:ne,Z_STREAM_END:he,Z_STREAM_ERROR:oe,Z_DATA_ERROR:le,Z_BUF_ERROR:de,Z_DEFAULT_COMPRESSION:ue,Z_FILTERED:ce,Z_HUFFMAN_ONLY:_e,Z_RLE:fe,Z_FIXED:ge,Z_DEFAULT_STRATEGY:pe,Z_UNKNOWN:we,Z_DEFLATED:me}=qt,be=258,Se=262,ye=42,Be=113,Re=666,ve=(t,e)=>(t.msg=Jt[e],e),Ue=t=>2*t-(t>4?9:0),Te=t=>{let e=t.length;for(;--e>=0;)t[e]=0},Ie=t=>{let e,i,a,s=t.w_size;e=t.hash_size,a=e;do{i=t.head[--a],t.head[a]=i>=s?i-s:0}while(--e);e=s,a=e;do{i=t.prev[--a],t.prev[a]=i>=s?i-s:0}while(--e)};let De=(t,e,i)=>(e<<t.hash_shift^i)&t.hash_mask;const xe=t=>{const e=t.state;let i=e.pending;i>t.avail_out&&(i=t.avail_out),0!==i&&(t.output.set(e.pending_buf.subarray(e.pending_out,e.pending_out+i),t.next_out),t.next_out+=i,e.pending_out+=i,t.total_out+=i,t.avail_out-=i,e.pending-=i,0===e.pending&&(e.pending_out=0))},ke=(t,e)=>{Xt(t,t.block_start>=0?t.block_start:-1,t.strstart-t.block_start,e),t.block_start=t.strstart,xe(t.strm)},Ce=(t,e)=>{t.pending_buf[t.pending++]=e},Fe=(t,e)=>{t.pending_buf[t.pending++]=e>>>8&255,t.pending_buf[t.pending++]=255&e},ze=(t,e,i,a)=>{let s=t.avail_in;return s>a&&(s=a),0===s?0:(t.avail_in-=s,e.set(t.input.subarray(t.next_in,t.next_in+s),i),1===t.state.wrap?t.adler=Ht(t.adler,e,s,i):2===t.state.wrap&&(t.adler=Gt(t.adler,e,s,i)),t.next_in+=s,t.total_in+=s,s)},We=(t,e)=>{let i,a,s=t.max_chain_length,r=t.strstart,n=t.prev_length,h=t.nice_match;const o=t.strstart>t.w_size-Se?t.strstart-(t.w_size-Se):0,l=t.window,d=t.w_mask,u=t.prev,c=t.strstart+be;let _=l[r+n-1],f=l[r+n];t.prev_length>=t.good_match&&(s>>=2),h>t.lookahead&&(h=t.lookahead);do{if(i=e,l[i+n]===f&&l[i+n-1]===_&&l[i]===l[r]&&l[++i]===l[r+1]){r+=2,i++;do{}while(l[++r]===l[++i]&&l[++r]===l[++i]&&l[++r]===l[++i]&&l[++r]===l[++i]&&l[++r]===l[++i]&&l[++r]===l[++i]&&l[++r]===l[++i]&&l[++r]===l[++i]&&r<c);if(a=be-(c-r),r=c-be,a>n){if(t.match_start=e,n=a,a>=h)break;_=l[r+n-1],f=l[r+n]}}}while((e=u[e&d])>o&&0!==--s);return n<=t.lookahead?n:t.lookahead},Oe=t=>{const e=t.w_size;let i,a,s;do{if(a=t.window_size-t.lookahead-t.strstart,t.strstart>=e+(e-Se)&&(t.window.set(t.window.subarray(e,e+e-a),0),t.match_start-=e,t.strstart-=e,t.block_start-=e,t.insert>t.strstart&&(t.insert=t.strstart),Ie(t),a+=e),0===t.strm.avail_in)break;if(i=ze(t.strm,t.window,t.strstart+t.lookahead,a),t.lookahead+=i,t.lookahead+t.insert>=3)for(s=t.strstart-t.insert,t.ins_h=t.window[s],t.ins_h=De(t,t.ins_h,t.window[s+1]);t.insert&&(t.ins_h=De(t,t.ins_h,t.window[s+3-1]),t.prev[s&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=s,s++,t.insert--,!(t.lookahead+t.insert<3)););}while(t.lookahead<Se&&0!==t.strm.avail_in)},Ee=(t,e)=>{let i,a,s,r=t.pending_buf_size-5>t.w_size?t.w_size:t.pending_buf_size-5,n=0,h=t.strm.avail_in;do{if(i=65535,s=t.bi_valid+42>>3,t.strm.avail_out<s)break;if(s=t.strm.avail_out-s,a=t.strstart-t.block_start,i>a+t.strm.avail_in&&(i=a+t.strm.avail_in),i>s&&(i=s),i<r&&(0===i&&e!==se||e===ee||i!==a+t.strm.avail_in))break;n=e===se&&i===a+t.strm.avail_in?1:0,Yt(t,0,0,n),t.pending_buf[t.pending-4]=i,t.pending_buf[t.pending-3]=i>>8,t.pending_buf[t.pending-2]=~i,t.pending_buf[t.pending-1]=~i>>8,xe(t.strm),a&&(a>i&&(a=i),t.strm.output.set(t.window.subarray(t.block_start,t.block_start+a),t.strm.next_out),t.strm.next_out+=a,t.strm.avail_out-=a,t.strm.total_out+=a,t.block_start+=a,i-=a),i&&(ze(t.strm,t.strm.output,t.strm.next_out,i),t.strm.next_out+=i,t.strm.avail_out-=i,t.strm.total_out+=i)}while(0===n);return h-=t.strm.avail_in,h&&(h>=t.w_size?(t.matches=2,t.window.set(t.strm.input.subarray(t.strm.next_in-t.w_size,t.strm.next_in),0),t.strstart=t.w_size,t.insert=t.strstart):(t.window_size-t.strstart<=h&&(t.strstart-=t.w_size,t.window.set(t.window.subarray(t.w_size,t.w_size+t.strstart),0),t.matches<2&&t.matches++,t.insert>t.strstart&&(t.insert=t.strstart)),t.window.set(t.strm.input.subarray(t.strm.next_in-h,t.strm.next_in),t.strstart),t.strstart+=h,t.insert+=h>t.w_size-t.insert?t.w_size-t.insert:h),t.block_start=t.strstart),t.high_water<t.strstart&&(t.high_water=t.strstart),n?4:e!==ee&&e!==se&&0===t.strm.avail_in&&t.strstart===t.block_start?2:(s=t.window_size-t.strstart,t.strm.avail_in>s&&t.block_start>=t.w_size&&(t.block_start-=t.w_size,t.strstart-=t.w_size,t.window.set(t.window.subarray(t.w_size,t.w_size+t.strstart),0),t.matches<2&&t.matches++,s+=t.w_size,t.insert>t.strstart&&(t.insert=t.strstart)),s>t.strm.avail_in&&(s=t.strm.avail_in),s&&(ze(t.strm,t.window,t.strstart,s),t.strstart+=s,t.insert+=s>t.w_size-t.insert?t.w_size-t.insert:s),t.high_water<t.strstart&&(t.high_water=t.strstart),s=t.bi_valid+42>>3,s=t.pending_buf_size-s>65535?65535:t.pending_buf_size-s,r=s>t.w_size?t.w_size:s,a=t.strstart-t.block_start,(a>=r||(a||e===se)&&e!==ee&&0===t.strm.avail_in&&a<=s)&&(i=a>s?s:a,n=e===se&&0===t.strm.avail_in&&i===a?1:0,Yt(t,t.block_start,i,n),t.block_start+=i,xe(t.strm)),n?3:1)},Ae=(t,e)=>{let i,a;for(;;){if(t.lookahead<Se){if(Oe(t),t.lookahead<Se&&e===ee)return 1;if(0===t.lookahead)break}if(i=0,t.lookahead>=3&&(t.ins_h=De(t,t.ins_h,t.window[t.strstart+3-1]),i=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),0!==i&&t.strstart-i<=t.w_size-Se&&(t.match_length=We(t,i)),t.match_length>=3)if(a=Qt(t,t.strstart-t.match_start,t.match_length-3),t.lookahead-=t.match_length,t.match_length<=t.max_lazy_match&&t.lookahead>=3){t.match_length--;do{t.strstart++,t.ins_h=De(t,t.ins_h,t.window[t.strstart+3-1]),i=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart}while(0!==--t.match_length);t.strstart++}else t.strstart+=t.match_length,t.match_length=0,t.ins_h=t.window[t.strstart],t.ins_h=De(t,t.ins_h,t.window[t.strstart+1]);else a=Qt(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++;if(a&&(ke(t,!1),0===t.strm.avail_out))return 1}return t.insert=t.strstart<2?t.strstart:2,e===se?(ke(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(ke(t,!1),0===t.strm.avail_out)?1:2},$e=(t,e)=>{let i,a,s;for(;;){if(t.lookahead<Se){if(Oe(t),t.lookahead<Se&&e===ee)return 1;if(0===t.lookahead)break}if(i=0,t.lookahead>=3&&(t.ins_h=De(t,t.ins_h,t.window[t.strstart+3-1]),i=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),t.prev_length=t.match_length,t.prev_match=t.match_start,t.match_length=2,0!==i&&t.prev_length<t.max_lazy_match&&t.strstart-i<=t.w_size-Se&&(t.match_length=We(t,i),t.match_length<=5&&(t.strategy===ce||3===t.match_length&&t.strstart-t.match_start>4096)&&(t.match_length=2)),t.prev_length>=3&&t.match_length<=t.prev_length){s=t.strstart+t.lookahead-3,a=Qt(t,t.strstart-1-t.prev_match,t.prev_length-3),t.lookahead-=t.prev_length-1,t.prev_length-=2;do{++t.strstart<=s&&(t.ins_h=De(t,t.ins_h,t.window[t.strstart+3-1]),i=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart)}while(0!==--t.prev_length);if(t.match_available=0,t.match_length=2,t.strstart++,a&&(ke(t,!1),0===t.strm.avail_out))return 1}else if(t.match_available){if(a=Qt(t,0,t.window[t.strstart-1]),a&&ke(t,!1),t.strstart++,t.lookahead--,0===t.strm.avail_out)return 1}else t.match_available=1,t.strstart++,t.lookahead--}return t.match_available&&(a=Qt(t,0,t.window[t.strstart-1]),t.match_available=0),t.insert=t.strstart<2?t.strstart:2,e===se?(ke(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(ke(t,!1),0===t.strm.avail_out)?1:2};function Pe(t,e,i,a,s){this.good_length=t,this.max_lazy=e,this.nice_length=i,this.max_chain=a,this.func=s}const Me=[new Pe(0,0,0,0,Ee),new Pe(4,4,8,4,Ae),new Pe(4,5,16,8,Ae),new Pe(4,6,32,32,Ae),new Pe(4,4,16,16,$e),new Pe(8,16,32,32,$e),new Pe(8,16,128,128,$e),new Pe(8,32,128,256,$e),new Pe(32,128,258,1024,$e),new Pe(32,258,258,4096,$e)];function Le(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=me,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new Uint16Array(1146),this.dyn_dtree=new Uint16Array(122),this.bl_tree=new Uint16Array(78),Te(this.dyn_ltree),Te(this.dyn_dtree),Te(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new Uint16Array(16),this.heap=new Uint16Array(573),Te(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new Uint16Array(573),Te(this.depth),this.sym_buf=0,this.lit_bufsize=0,this.sym_next=0,this.sym_end=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}const Ne=t=>{if(!t)return 1;const e=t.state;return!e||e.strm!==t||e.status!==ye&&57!==e.status&&69!==e.status&&73!==e.status&&91!==e.status&&103!==e.status&&e.status!==Be&&e.status!==Re?1:0},Ze=t=>{if(Ne(t))return ve(t,oe);t.total_in=t.total_out=0,t.data_type=we;const e=t.state;return e.pending=0,e.pending_out=0,e.wrap<0&&(e.wrap=-e.wrap),e.status=2===e.wrap?57:e.wrap?ye:Be,t.adler=2===e.wrap?0:1,e.last_flush=-2,Kt(e),ne},Ve=t=>{const e=Ze(t);var i;return e===ne&&((i=t.state).window_size=2*i.w_size,Te(i.head),i.max_lazy_match=Me[i.level].max_lazy,i.good_match=Me[i.level].good_length,i.nice_match=Me[i.level].nice_length,i.max_chain_length=Me[i.level].max_chain,i.strstart=0,i.block_start=0,i.lookahead=0,i.insert=0,i.match_length=i.prev_length=2,i.match_available=0,i.ins_h=0),e},He=(t,e,i,a,s,r)=>{if(!t)return oe;let n=1;if(e===ue&&(e=6),a<0?(n=0,a=-a):a>15&&(n=2,a-=16),s<1||s>9||i!==me||a<8||a>15||e<0||e>9||r<0||r>ge||8===a&&1!==n)return ve(t,oe);8===a&&(a=9);const h=new Le;return t.state=h,h.strm=t,h.status=ye,h.wrap=n,h.gzhead=null,h.w_bits=a,h.w_size=1<<h.w_bits,h.w_mask=h.w_size-1,h.hash_bits=s+7,h.hash_size=1<<h.hash_bits,h.hash_mask=h.hash_size-1,h.hash_shift=~~((h.hash_bits+3-1)/3),h.window=new Uint8Array(2*h.w_size),h.head=new Uint16Array(h.hash_size),h.prev=new Uint16Array(h.w_size),h.lit_bufsize=1<<s+6,h.pending_buf_size=4*h.lit_bufsize,h.pending_buf=new Uint8Array(h.pending_buf_size),h.sym_buf=h.lit_bufsize,h.sym_end=3*(h.lit_bufsize-1),h.level=e,h.strategy=r,h.method=i,Ve(t)};var je={deflateInit:(t,e)=>He(t,e,me,15,8,pe),deflateInit2:He,deflateReset:Ve,deflateResetKeep:Ze,deflateSetHeader:(t,e)=>Ne(t)||2!==t.state.wrap?oe:(t.state.gzhead=e,ne),deflate:(t,e)=>{if(Ne(t)||e>re||e<0)return t?ve(t,oe):oe;const i=t.state;if(!t.output||0!==t.avail_in&&!t.input||i.status===Re&&e!==se)return ve(t,0===t.avail_out?de:oe);const a=i.last_flush;if(i.last_flush=e,0!==i.pending){if(xe(t),0===t.avail_out)return i.last_flush=-1,ne}else if(0===t.avail_in&&Ue(e)<=Ue(a)&&e!==se)return ve(t,de);if(i.status===Re&&0!==t.avail_in)return ve(t,de);if(i.status===ye&&0===i.wrap&&(i.status=Be),i.status===ye){let e=me+(i.w_bits-8<<4)<<8,a=-1;if(a=i.strategy>=_e||i.level<2?0:i.level<6?1:6===i.level?2:3,e|=a<<6,0!==i.strstart&&(e|=32),e+=31-e%31,Fe(i,e),0!==i.strstart&&(Fe(i,t.adler>>>16),Fe(i,65535&t.adler)),t.adler=1,i.status=Be,xe(t),0!==i.pending)return i.last_flush=-1,ne}if(57===i.status)if(t.adler=0,Ce(i,31),Ce(i,139),Ce(i,8),i.gzhead)Ce(i,(i.gzhead.text?1:0)+(i.gzhead.hcrc?2:0)+(i.gzhead.extra?4:0)+(i.gzhead.name?8:0)+(i.gzhead.comment?16:0)),Ce(i,255&i.gzhead.time),Ce(i,i.gzhead.time>>8&255),Ce(i,i.gzhead.time>>16&255),Ce(i,i.gzhead.time>>24&255),Ce(i,9===i.level?2:i.strategy>=_e||i.level<2?4:0),Ce(i,255&i.gzhead.os),i.gzhead.extra&&i.gzhead.extra.length&&(Ce(i,255&i.gzhead.extra.length),Ce(i,i.gzhead.extra.length>>8&255)),i.gzhead.hcrc&&(t.adler=Gt(t.adler,i.pending_buf,i.pending,0)),i.gzindex=0,i.status=69;else if(Ce(i,0),Ce(i,0),Ce(i,0),Ce(i,0),Ce(i,0),Ce(i,9===i.level?2:i.strategy>=_e||i.level<2?4:0),Ce(i,3),i.status=Be,xe(t),0!==i.pending)return i.last_flush=-1,ne;if(69===i.status){if(i.gzhead.extra){let e=i.pending,a=(65535&i.gzhead.extra.length)-i.gzindex;for(;i.pending+a>i.pending_buf_size;){let s=i.pending_buf_size-i.pending;if(i.pending_buf.set(i.gzhead.extra.subarray(i.gzindex,i.gzindex+s),i.pending),i.pending=i.pending_buf_size,i.gzhead.hcrc&&i.pending>e&&(t.adler=Gt(t.adler,i.pending_buf,i.pending-e,e)),i.gzindex+=s,xe(t),0!==i.pending)return i.last_flush=-1,ne;e=0,a-=s}let s=new Uint8Array(i.gzhead.extra);i.pending_buf.set(s.subarray(i.gzindex,i.gzindex+a),i.pending),i.pending+=a,i.gzhead.hcrc&&i.pending>e&&(t.adler=Gt(t.adler,i.pending_buf,i.pending-e,e)),i.gzindex=0}i.status=73}if(73===i.status){if(i.gzhead.name){let e,a=i.pending;do{if(i.pending===i.pending_buf_size){if(i.gzhead.hcrc&&i.pending>a&&(t.adler=Gt(t.adler,i.pending_buf,i.pending-a,a)),xe(t),0!==i.pending)return i.last_flush=-1,ne;a=0}e=i.gzindex<i.gzhead.name.length?255&i.gzhead.name.charCodeAt(i.gzindex++):0,Ce(i,e)}while(0!==e);i.gzhead.hcrc&&i.pending>a&&(t.adler=Gt(t.adler,i.pending_buf,i.pending-a,a)),i.gzindex=0}i.status=91}if(91===i.status){if(i.gzhead.comment){let e,a=i.pending;do{if(i.pending===i.pending_buf_size){if(i.gzhead.hcrc&&i.pending>a&&(t.adler=Gt(t.adler,i.pending_buf,i.pending-a,a)),xe(t),0!==i.pending)return i.last_flush=-1,ne;a=0}e=i.gzindex<i.gzhead.comment.length?255&i.gzhead.comment.charCodeAt(i.gzindex++):0,Ce(i,e)}while(0!==e);i.gzhead.hcrc&&i.pending>a&&(t.adler=Gt(t.adler,i.pending_buf,i.pending-a,a))}i.status=103}if(103===i.status){if(i.gzhead.hcrc){if(i.pending+2>i.pending_buf_size&&(xe(t),0!==i.pending))return i.last_flush=-1,ne;Ce(i,255&t.adler),Ce(i,t.adler>>8&255),t.adler=0}if(i.status=Be,xe(t),0!==i.pending)return i.last_flush=-1,ne}if(0!==t.avail_in||0!==i.lookahead||e!==ee&&i.status!==Re){let a=0===i.level?Ee(i,e):i.strategy===_e?((t,e)=>{let i;for(;;){if(0===t.lookahead&&(Oe(t),0===t.lookahead)){if(e===ee)return 1;break}if(t.match_length=0,i=Qt(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++,i&&(ke(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===se?(ke(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(ke(t,!1),0===t.strm.avail_out)?1:2})(i,e):i.strategy===fe?((t,e)=>{let i,a,s,r;const n=t.window;for(;;){if(t.lookahead<=be){if(Oe(t),t.lookahead<=be&&e===ee)return 1;if(0===t.lookahead)break}if(t.match_length=0,t.lookahead>=3&&t.strstart>0&&(s=t.strstart-1,a=n[s],a===n[++s]&&a===n[++s]&&a===n[++s])){r=t.strstart+be;do{}while(a===n[++s]&&a===n[++s]&&a===n[++s]&&a===n[++s]&&a===n[++s]&&a===n[++s]&&a===n[++s]&&a===n[++s]&&s<r);t.match_length=be-(r-s),t.match_length>t.lookahead&&(t.match_length=t.lookahead)}if(t.match_length>=3?(i=Qt(t,1,t.match_length-3),t.lookahead-=t.match_length,t.strstart+=t.match_length,t.match_length=0):(i=Qt(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++),i&&(ke(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===se?(ke(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(ke(t,!1),0===t.strm.avail_out)?1:2})(i,e):Me[i.level].func(i,e);if(3!==a&&4!==a||(i.status=Re),1===a||3===a)return 0===t.avail_out&&(i.last_flush=-1),ne;if(2===a&&(e===ie?te(i):e!==re&&(Yt(i,0,0,!1),e===ae&&(Te(i.head),0===i.lookahead&&(i.strstart=0,i.block_start=0,i.insert=0))),xe(t),0===t.avail_out))return i.last_flush=-1,ne}return e!==se?ne:i.wrap<=0?he:(2===i.wrap?(Ce(i,255&t.adler),Ce(i,t.adler>>8&255),Ce(i,t.adler>>16&255),Ce(i,t.adler>>24&255),Ce(i,255&t.total_in),Ce(i,t.total_in>>8&255),Ce(i,t.total_in>>16&255),Ce(i,t.total_in>>24&255)):(Fe(i,t.adler>>>16),Fe(i,65535&t.adler)),xe(t),i.wrap>0&&(i.wrap=-i.wrap),0!==i.pending?ne:he)},deflateEnd:t=>{if(Ne(t))return oe;const e=t.state.status;return t.state=null,e===Be?ve(t,le):ne},deflateSetDictionary:(t,e)=>{let i=e.length;if(Ne(t))return oe;const a=t.state,s=a.wrap;if(2===s||1===s&&a.status!==ye||a.lookahead)return oe;if(1===s&&(t.adler=Ht(t.adler,e,i,0)),a.wrap=0,i>=a.w_size){0===s&&(Te(a.head),a.strstart=0,a.block_start=0,a.insert=0);let t=new Uint8Array(a.w_size);t.set(e.subarray(i-a.w_size,i),0),e=t,i=a.w_size}const r=t.avail_in,n=t.next_in,h=t.input;for(t.avail_in=i,t.next_in=0,t.input=e,Oe(a);a.lookahead>=3;){let t=a.strstart,e=a.lookahead-2;do{a.ins_h=De(a,a.ins_h,a.window[t+3-1]),a.prev[t&a.w_mask]=a.head[a.ins_h],a.head[a.ins_h]=t,t++}while(--e);a.strstart=t,a.lookahead=2,Oe(a)}return a.strstart+=a.lookahead,a.block_start=a.strstart,a.insert=a.lookahead,a.lookahead=0,a.match_length=a.prev_length=2,a.match_available=0,t.next_in=n,t.input=h,t.avail_in=r,a.wrap=s,ne},deflateInfo:"pako deflate (from Nodeca project)"};const Ge=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);var Je=function(t){const e=Array.prototype.slice.call(arguments,1);for(;e.length;){const i=e.shift();if(i){if("object"!=typeof i)throw new TypeError(i+"must be non-object");for(const e in i)Ge(i,e)&&(t[e]=i[e])}}return t},qe=t=>{let e=0;for(let i=0,a=t.length;i<a;i++)e+=t[i].length;const i=new Uint8Array(e);for(let e=0,a=0,s=t.length;e<s;e++){let s=t[e];i.set(s,a),a+=s.length}return i};let Ke=!0;try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(t){Ke=!1}const Ye=new Uint8Array(256);for(let t=0;t<256;t++)Ye[t]=t>=252?6:t>=248?5:t>=240?4:t>=224?3:t>=192?2:1;Ye[254]=Ye[254]=1;var Xe=t=>{if("function"==typeof TextEncoder&&TextEncoder.prototype.encode)return(new TextEncoder).encode(t);let e,i,a,s,r,n=t.length,h=0;for(s=0;s<n;s++)i=t.charCodeAt(s),55296==(64512&i)&&s+1<n&&(a=t.charCodeAt(s+1),56320==(64512&a)&&(i=65536+(i-55296<<10)+(a-56320),s++)),h+=i<128?1:i<2048?2:i<65536?3:4;for(e=new Uint8Array(h),r=0,s=0;r<h;s++)i=t.charCodeAt(s),55296==(64512&i)&&s+1<n&&(a=t.charCodeAt(s+1),56320==(64512&a)&&(i=65536+(i-55296<<10)+(a-56320),s++)),i<128?e[r++]=i:i<2048?(e[r++]=192|i>>>6,e[r++]=128|63&i):i<65536?(e[r++]=224|i>>>12,e[r++]=128|i>>>6&63,e[r++]=128|63&i):(e[r++]=240|i>>>18,e[r++]=128|i>>>12&63,e[r++]=128|i>>>6&63,e[r++]=128|63&i);return e};var Qe=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0};const ti=Object.prototype.toString,{Z_NO_FLUSH:ei,Z_SYNC_FLUSH:ii,Z_FULL_FLUSH:ai,Z_FINISH:si,Z_OK:ri,Z_STREAM_END:ni,Z_DEFAULT_COMPRESSION:hi,Z_DEFAULT_STRATEGY:oi,Z_DEFLATED:li}=qt;function di(t){this.options=Je({level:hi,method:li,chunkSize:16384,windowBits:15,memLevel:8,strategy:oi},t||{});let e=this.options;e.raw&&e.windowBits>0?e.windowBits=-e.windowBits:e.gzip&&e.windowBits>0&&e.windowBits<16&&(e.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new Qe,this.strm.avail_out=0;let i=je.deflateInit2(this.strm,e.level,e.method,e.windowBits,e.memLevel,e.strategy);if(i!==ri)throw new Error(Jt[i]);if(e.header&&je.deflateSetHeader(this.strm,e.header),e.dictionary){let t;if(t="string"==typeof e.dictionary?Xe(e.dictionary):"[object ArrayBuffer]"===ti.call(e.dictionary)?new Uint8Array(e.dictionary):e.dictionary,i=je.deflateSetDictionary(this.strm,t),i!==ri)throw new Error(Jt[i]);this._dict_set=!0}}di.prototype.push=function(t,e){const i=this.strm,a=this.options.chunkSize;let s,r;if(this.ended)return!1;for(r=e===~~e?e:!0===e?si:ei,"string"==typeof t?i.input=Xe(t):"[object ArrayBuffer]"===ti.call(t)?i.input=new Uint8Array(t):i.input=t,i.next_in=0,i.avail_in=i.input.length;;)if(0===i.avail_out&&(i.output=new Uint8Array(a),i.next_out=0,i.avail_out=a),(r===ii||r===ai)&&i.avail_out<=6)this.onData(i.output.subarray(0,i.next_out)),i.avail_out=0;else{if(s=je.deflate(i,r),s===ni)return i.next_out>0&&this.onData(i.output.subarray(0,i.next_out)),s=je.deflateEnd(this.strm),this.onEnd(s),this.ended=!0,s===ri;if(0!==i.avail_out){if(r>0&&i.next_out>0)this.onData(i.output.subarray(0,i.next_out)),i.avail_out=0;else if(0===i.avail_in)break}else this.onData(i.output)}return!0},di.prototype.onData=function(t){this.chunks.push(t)},di.prototype.onEnd=function(t){t===ri&&(this.result=qe(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg};var ui={deflate:function(t,e){const i=new di(e);if(i.push(t,!0),i.err)throw i.msg||Jt[i.err];return i.result}};const{deflate:ci}=ui;var _i=ci;const fi={b:{u:DataView.prototype.getInt8,p:DataView.prototype.setInt8,bytes:1},B:{u:DataView.prototype.getUint8,p:DataView.prototype.setUint8,bytes:1},h:{u:DataView.prototype.getInt16,p:DataView.prototype.setInt16,bytes:2},H:{u:DataView.prototype.getUint16,p:DataView.prototype.setUint16,bytes:2},i:{u:DataView.prototype.getInt32,p:DataView.prototype.setInt32,bytes:4},I:{u:DataView.prototype.getUint32,p:DataView.prototype.setUint32,bytes:4}},gi=(t,...e)=>{let i=0;if(t.replace(/[<>]/,"").length!=e.length)throw"Pack format to Argument count mismatch";const a=[];let s=!0;for(let a=0;a<t.length;a++)"<"==t[a]?s=!0:">"==t[a]?s=!1:(r(t[a],e[i]),i++);function r(t,e){if(!(t in fi))throw"Unhandled character '"+t+"' in pack format";const i=fi[t].bytes,r=new DataView(new ArrayBuffer(i));fi[t].p.bind(r)(0,e,s);for(let t=0;t<i;t++)a.push(r.getUint8(t))}return a},pi=(t,e)=>{let i=0;const a=[];let s=!0;for(const e of t)"<"==e?s=!0:">"==e?s=!1:r(e);function r(t){if(!(t in fi))throw"Unhandled character '"+t+"' in unpack format";const r=fi[t].bytes,n=new DataView(new ArrayBuffer(r));for(let t=0;t<r;t++)n.setUint8(t,255&e[i+t]);const h=fi[t].u.bind(n);a.push(h(0,s)),i+=r}return a};class wi extends EventTarget{constructor(t,e,i){super(),this.port=t,this.logger=e,this._parent=i,this.__chipName=null,this.__chipRevision=null,this.__chipVariant=null,this._efuses=new Array(4).fill(0),this._flashsize=4194304,this.debug=!1,this.IS_STUB=!1,this.connected=!0,this.flashSize=null,this._currentBaudRate=h,this._isESP32S2NativeUSB=!1,this._initializationSucceeded=!1,this.__commandLock=Promise.resolve([0,[]]),this.__isReconfiguring=!1,this.__abandonCurrentOperation=!1,this.__adaptiveBlockMultiplier=1,this.__adaptiveMaxInFlightMultiplier=1,this.__consecutiveSuccessfulChunks=0,this.__lastAdaptiveAdjustment=0,this.__isCDCDevice=!1,this.state_DTR=!1,this.state_RTS=!1,this.__writeChain=Promise.resolve()}get chipFamily(){return this._parent?this._parent.chipFamily:this.__chipFamily}set chipFamily(t){this._parent?this._parent.chipFamily=t:this.__chipFamily=t}get chipName(){return this._parent?this._parent.chipName:this.__chipName}set chipName(t){this._parent?this._parent.chipName=t:this.__chipName=t}get chipRevision(){return this._parent?this._parent.chipRevision:this.__chipRevision}set chipRevision(t){this._parent?this._parent.chipRevision=t:this.__chipRevision=t}get chipVariant(){return this._parent?this._parent.chipVariant:this.__chipVariant}set chipVariant(t){this._parent?this._parent.chipVariant=t:this.__chipVariant=t}get _inputBuffer(){if(this._parent)return this._parent._inputBuffer;if(void 0===this.__inputBuffer)throw new Error("_inputBuffer accessed before initialization");return this.__inputBuffer}get _inputBufferReadIndex(){return this._parent?this._parent._inputBufferReadIndex:this.__inputBufferReadIndex||0}set _inputBufferReadIndex(t){this._parent?this._parent._inputBufferReadIndex=t:this.__inputBufferReadIndex=t}get _inputBufferAvailable(){return this._inputBuffer.length-this._inputBufferReadIndex}_readByte(){if(!(this._inputBufferReadIndex>=this._inputBuffer.length))return this._inputBuffer[this._inputBufferReadIndex++]}_clearInputBuffer(){this._inputBuffer.length=0,this._inputBufferReadIndex=0}_compactInputBuffer(){this._inputBufferReadIndex>1e3&&this._inputBufferReadIndex>this._inputBuffer.length/2&&(this._inputBuffer.splice(0,this._inputBufferReadIndex),this._inputBufferReadIndex=0)}get _totalBytesRead(){return this._parent?this._parent._totalBytesRead:this.__totalBytesRead||0}set _totalBytesRead(t){this._parent?this._parent._totalBytesRead=t:this.__totalBytesRead=t}get _commandLock(){return this._parent?this._parent._commandLock:this.__commandLock}set _commandLock(t){this._parent?this._parent._commandLock=t:this.__commandLock=t}get _isReconfiguring(){return this._parent?this._parent._isReconfiguring:this.__isReconfiguring}set _isReconfiguring(t){this._parent?this._parent._isReconfiguring=t:this.__isReconfiguring=t}get _abandonCurrentOperation(){return this._parent?this._parent._abandonCurrentOperation:this.__abandonCurrentOperation}set _abandonCurrentOperation(t){this._parent?this._parent._abandonCurrentOperation=t:this.__abandonCurrentOperation=t}get _adaptiveBlockMultiplier(){return this._parent?this._parent._adaptiveBlockMultiplier:this.__adaptiveBlockMultiplier}set _adaptiveBlockMultiplier(t){this._parent?this._parent._adaptiveBlockMultiplier=t:this.__adaptiveBlockMultiplier=t}get _adaptiveMaxInFlightMultiplier(){return this._parent?this._parent._adaptiveMaxInFlightMultiplier:this.__adaptiveMaxInFlightMultiplier}set _adaptiveMaxInFlightMultiplier(t){this._parent?this._parent._adaptiveMaxInFlightMultiplier=t:this.__adaptiveMaxInFlightMultiplier=t}get _consecutiveSuccessfulChunks(){return this._parent?this._parent._consecutiveSuccessfulChunks:this.__consecutiveSuccessfulChunks}set _consecutiveSuccessfulChunks(t){this._parent?this._parent._consecutiveSuccessfulChunks=t:this.__consecutiveSuccessfulChunks=t}get _lastAdaptiveAdjustment(){return this._parent?this._parent._lastAdaptiveAdjustment:this.__lastAdaptiveAdjustment}set _lastAdaptiveAdjustment(t){this._parent?this._parent._lastAdaptiveAdjustment=t:this.__lastAdaptiveAdjustment=t}get _isCDCDevice(){return this._parent?this._parent._isCDCDevice:this.__isCDCDevice}set _isCDCDevice(t){this._parent?this._parent._isCDCDevice=t:this.__isCDCDevice=t}detectUSBSerialChip(t,e){const i={6790:{29986:{name:"CH340",maxBaudrate:460800},29987:{name:"CH340",maxBaudrate:460800},30084:{name:"CH340",maxBaudrate:460800},21795:{name:"CH341",maxBaudrate:2e6},21971:{name:"CH343",maxBaudrate:6e6},21972:{name:"CH9102",maxBaudrate:6e6},21976:{name:"CH9101",maxBaudrate:3e6}},4292:{6e4:{name:"CP2102(n)",maxBaudrate:3e6},60016:{name:"CP2105",maxBaudrate:2e6},60017:{name:"CP2108",maxBaudrate:2e6}},1027:{24577:{name:"FT232R",maxBaudrate:3e6},24592:{name:"FT2232",maxBaudrate:3e6},24593:{name:"FT4232",maxBaudrate:3e6},24596:{name:"FT232H",maxBaudrate:12e6},24597:{name:"FT230X",maxBaudrate:3e6}},12346:{2:{name:"ESP32-S2 Native USB",maxBaudrate:2e6},4097:{name:"ESP32 Native USB",maxBaudrate:2e6},4098:{name:"ESP32 Native USB",maxBaudrate:2e6},16386:{name:"ESP32 Native USB",maxBaudrate:2e6},4096:{name:"ESP32 Native USB",maxBaudrate:2e6}}}[t];return i&&i[e]?i[e]:{name:`Unknown (VID: 0x${t.toString(16)}, PID: 0x${e.toString(16)})`}}async initialize(){if(!this._parent){this.__inputBuffer=[],this.__inputBufferReadIndex=0,this.__totalBytesRead=0;const t=this.port.getInfo();if(t.usbVendorId&&t.usbProductId){const e=this.detectUSBSerialChip(t.usbVendorId,t.usbProductId);this.logger.log(`USB-Serial: ${e.name} (VID: 0x${t.usbVendorId.toString(16)}, PID: 0x${t.usbProductId.toString(16)})`),e.maxBaudrate&&(this._maxUSBSerialBaudrate=e.maxBaudrate,this.logger.log(`Max baudrate: ${e.maxBaudrate}`)),12346===t.usbVendorId&&2===t.usbProductId&&(this._isESP32S2NativeUSB=!0),(12346===t.usbVendorId||6790===t.usbVendorId&&21971===t.usbProductId)&&(this._isCDCDevice=!0)}this.readLoop()}await this.connectWithResetStrategies(),await this.detectChip();const t=st(this.getChipFamily()),e=t.macFuse;for(let t=0;t<4;t++)this._efuses[t]=await this.readRegister(e+4*t);this.logger.log(`Chip type ${this.chipName}`),this.logger.debug(`Bootloader flash offset: 0x${t.flashOffs.toString(16)}`),this._initializationSucceeded=!0}async detectChip(){try{const t=(await this.getSecurityInfo()).chipId,e=v[t];if(e)return this.chipName=e.name,this.chipFamily=e.family,this.chipFamily===B&&(this.chipRevision=await this.getChipRevision(),this.logger.debug(`ESP32-P4 revision: ${this.chipRevision}`),this.chipRevision>=300?this.chipVariant="rev300":this.chipVariant="rev0",this.logger.debug(`ESP32-P4 variant: ${this.chipVariant}`)),void this.logger.debug(`Detected chip via IMAGE_CHIP_ID: ${t} (${this.chipName})`);this.logger.debug(`Unknown IMAGE_CHIP_ID: ${t}, falling back to magic value detection`)}catch(t){this.logger.debug(`GET_SECURITY_INFO failed, using magic value detection: ${t}`),await this.drainInputBuffer(200),this._clearInputBuffer(),await s(Q);try{await this.sync()}catch(t){this.logger.debug(`Re-sync after GET_SECURITY_INFO failure: ${t}`)}}const t=await this.readRegister(1073745920),e=U[t>>>0];if(void 0===e)throw new Error(`Unknown Chip: Hex: ${a(t>>>0,8).toLowerCase()} Number: ${t}`);this.chipName=e.name,this.chipFamily=e.family,this.chipFamily===B&&(this.chipRevision=await this.getChipRevision(),this.logger.debug(`ESP32-P4 revision: ${this.chipRevision}`),this.chipRevision>=300?this.chipVariant="rev300":this.chipVariant="rev0",this.logger.debug(`ESP32-P4 variant: ${this.chipVariant}`)),this.logger.debug(`Detected chip via magic value: ${a(t>>>0,8)} (${this.chipName})`)}async getChipRevision(){if(this.chipFamily!==B)return 0;const t=await this.readRegister(1343410252);return 100*((t>>23&1)<<2|t>>4&3)+(15&t)}async getSecurityInfo(){const[,t]=await this.checkCommand(20,[],0);if(0===t.length)throw new Error("GET_SECURITY_INFO not supported or returned empty response");if(t.length<12)throw new Error(`Invalid security info response length: ${t.length} (expected at least 12 bytes)`);return{flags:pi("<I",t.slice(0,4))[0],flashCryptCnt:t[4],keyPurposes:Array.from(t.slice(5,12)),chipId:t.length>=16?pi("<I",t.slice(12,16))[0]:0,apiVersion:t.length>=20?pi("<I",t.slice(16,20))[0]:0}}async getMacAddress(){if(!this._initializationSucceeded)throw new Error("getMacAddress() requires initialize() to have completed successfully");return this.macAddr().map(t=>t.toString(16).padStart(2,"0").toUpperCase()).join(":")}async readLoop(){this.debug&&this.logger.debug("Starting read loop"),this._reader=this.port.readable.getReader();try{let t=!0;for(;t;){const{value:e,done:i}=await this._reader.read();if(i){this._reader.releaseLock(),t=!1;break}if(!e||0===e.length)continue;const a=Array.from(e);Array.prototype.push.apply(this._inputBuffer,a),this._totalBytesRead+=e.length}}catch{this.logger.error("Read loop got disconnected")}finally{this._isReconfiguring=!1}this.connected=!1,this._isESP32S2NativeUSB&&!this._initializationSucceeded&&(this.logger.log("ESP32-S2 Native USB detected - requesting port reselection"),this.dispatchEvent(new CustomEvent("esp32s2-usb-reconnect",{detail:{message:"ESP32-S2 Native USB requires port reselection"}}))),this.dispatchEvent(new Event("disconnect")),this.logger.debug("Finished read loop")}sleep(t=100){return new Promise(e=>setTimeout(e,t))}async setRTS(t){await this.port.setSignals({requestToSend:t}),await this.setDTR(this.state_DTR)}async setDTR(t){this.state_DTR=t,await this.port.setSignals({dataTerminalReady:t})}async setDTRandRTS(t,e){this.state_DTR=t,this.state_RTS=e,await this.port.setSignals({dataTerminalReady:t,requestToSend:e})}async hardResetUSBJTAGSerial(){await this.setRTS(!1),await this.setDTR(!1),await this.sleep(100),await this.setDTR(!0),await this.setRTS(!1),await this.sleep(100),await this.setRTS(!0),await this.setDTR(!1),await this.setRTS(!0),await this.sleep(100),await this.setDTR(!1),await this.setRTS(!1),await this.sleep(200)}async hardResetClassic(){await this.setDTR(!1),await this.setRTS(!0),await this.sleep(100),await this.setDTR(!0),await this.setRTS(!1),await this.sleep(50),await this.setDTR(!1),await this.sleep(200)}async hardResetUnixTight(){await this.setDTRandRTS(!0,!0),await this.setDTRandRTS(!1,!1),await this.setDTRandRTS(!1,!0),await this.sleep(100),await this.setDTRandRTS(!0,!1),await this.sleep(50),await this.setDTRandRTS(!1,!1),await this.setDTR(!1),await this.sleep(200)}async setRTSWebUSB(t){this.state_RTS=t,await this.port.setSignals({requestToSend:t,dataTerminalReady:this.state_DTR})}async setDTRWebUSB(t){this.state_DTR=t,await this.port.setSignals({dataTerminalReady:t,requestToSend:this.state_RTS})}async setDTRandRTSWebUSB(t,e){this.state_DTR=t,this.state_RTS=e,await this.port.setSignals({dataTerminalReady:t,requestToSend:e})}async hardResetUSBJTAGSerialWebUSB(){await this.setRTSWebUSB(!1),await this.setDTRWebUSB(!1),await this.sleep(100),await this.setDTRWebUSB(!0),await this.setRTSWebUSB(!1),await this.sleep(100),await this.setRTSWebUSB(!0),await this.setDTRWebUSB(!1),await this.setRTSWebUSB(!0),await this.sleep(100),await this.setDTRWebUSB(!1),await this.setRTSWebUSB(!1),await this.sleep(200)}async hardResetUSBJTAGSerialInvertedDTRWebUSB(){await this.setRTSWebUSB(!1),await this.setDTRWebUSB(!0),await this.sleep(100),await this.setDTRWebUSB(!1),await this.setRTSWebUSB(!1),await this.sleep(100),await this.setRTSWebUSB(!0),await this.setDTRWebUSB(!0),await this.setRTSWebUSB(!0),await this.sleep(100),await this.setDTRWebUSB(!0),await this.setRTSWebUSB(!1),await this.sleep(200)}async hardResetClassicWebUSB(){await this.setDTRWebUSB(!1),await this.setRTSWebUSB(!0),await this.sleep(100),await this.setDTRWebUSB(!0),await this.setRTSWebUSB(!1),await this.sleep(50),await this.setDTRWebUSB(!1),await this.sleep(200)}async hardResetUnixTightWebUSB(){await this.setDTRandRTSWebUSB(!1,!1),await this.setDTRandRTSWebUSB(!0,!0),await this.setDTRandRTSWebUSB(!1,!0),await this.sleep(100),await this.setDTRandRTSWebUSB(!0,!1),await this.sleep(50),await this.setDTRandRTSWebUSB(!1,!1),await this.setDTRWebUSB(!1),await this.sleep(200)}async hardResetClassicLongDelayWebUSB(){await this.setDTRWebUSB(!1),await this.setRTSWebUSB(!0),await this.sleep(500),await this.setDTRWebUSB(!0),await this.setRTSWebUSB(!1),await this.sleep(200),await this.setDTRWebUSB(!1),await this.sleep(500)}async hardResetClassicShortDelayWebUSB(){await this.setDTRWebUSB(!1),await this.setRTSWebUSB(!0),await this.sleep(50),await this.setDTRWebUSB(!0),await this.setRTSWebUSB(!1),await this.sleep(25),await this.setDTRWebUSB(!1),await this.sleep(100)}async hardResetInvertedWebUSB(){await this.setDTRWebUSB(!0),await this.setRTSWebUSB(!1),await this.sleep(100),await this.setDTRWebUSB(!1),await this.setRTSWebUSB(!0),await this.sleep(50),await this.setDTRWebUSB(!0),await this.sleep(200)}async hardResetInvertedDTRWebUSB(){await this.setDTRWebUSB(!0),await this.setRTSWebUSB(!0),await this.sleep(100),await this.setDTRWebUSB(!1),await this.setRTSWebUSB(!1),await this.sleep(50),await this.setDTRWebUSB(!0),await this.sleep(200)}async hardResetInvertedRTSWebUSB(){await this.setDTRWebUSB(!1),await this.setRTSWebUSB(!1),await this.sleep(100),await this.setDTRWebUSB(!0),await this.setRTSWebUSB(!0),await this.sleep(50),await this.setDTRWebUSB(!1),await this.sleep(200)}isWebUSB(){return!0===this.port.isWebUSB}async connectWithResetStrategies(){const t=this.port.getInfo(),e=4097===t.usbProductId,i=12346===t.usbVendorId,a=[],r=this,n=!e&&!i;if(this.isWebUSB()){const s=4292===t.usbVendorId,h=6790===t.usbVendorId,o=12346===t.usbVendorId&&2===t.usbProductId;(e||i)&&(o?(a.push({name:"USB-JTAG/Serial (WebUSB) - ESP32-S2",fn:async()=>await r.hardResetUSBJTAGSerialWebUSB()}),a.push({name:"USB-JTAG/Serial Inverted DTR (WebUSB) - ESP32-S2",fn:async()=>await r.hardResetUSBJTAGSerialInvertedDTRWebUSB()}),a.push({name:"UnixTight (WebUSB) - ESP32-S2 CDC",fn:async()=>await r.hardResetUnixTightWebUSB()}),a.push({name:"Classic (WebUSB) - ESP32-S2 CDC",fn:async()=>await r.hardResetClassicWebUSB()})):(a.push({name:"USB-JTAG/Serial Inverted DTR (WebUSB)",fn:async()=>await r.hardResetUSBJTAGSerialInvertedDTRWebUSB()}),a.push({name:"USB-JTAG/Serial (WebUSB)",fn:async()=>await r.hardResetUSBJTAGSerialWebUSB()}),a.push({name:"Inverted DTR Classic (WebUSB)",fn:async()=>await r.hardResetInvertedDTRWebUSB()}))),n&&(h?(a.push({name:"UnixTight (WebUSB) - CH34x",fn:async()=>await r.hardResetUnixTightWebUSB()}),a.push({name:"Classic (WebUSB) - CH34x",fn:async()=>await r.hardResetClassicWebUSB()}),a.push({name:"Inverted Both (WebUSB) - CH34x",fn:async()=>await r.hardResetInvertedWebUSB()}),a.push({name:"Inverted RTS (WebUSB) - CH34x",fn:async()=>await r.hardResetInvertedRTSWebUSB()}),a.push({name:"Inverted DTR (WebUSB) - CH34x",fn:async()=>await r.hardResetInvertedDTRWebUSB()})):s?(a.push({name:"UnixTight (WebUSB) - CP2102",fn:async()=>await r.hardResetUnixTightWebUSB()}),a.push({name:"Classic (WebUSB) - CP2102",fn:async()=>await r.hardResetClassicWebUSB()}),a.push({name:"Inverted Both (WebUSB) - CP2102",fn:async()=>await r.hardResetInvertedWebUSB()}),a.push({name:"Inverted RTS (WebUSB) - CP2102",fn:async()=>await r.hardResetInvertedRTSWebUSB()}),a.push({name:"Inverted DTR (WebUSB) - CP2102",fn:async()=>await r.hardResetInvertedDTRWebUSB()})):(a.push({name:"UnixTight (WebUSB)",fn:async()=>await r.hardResetUnixTightWebUSB()}),a.push({name:"Classic (WebUSB)",fn:async function(){return await r.hardResetClassicWebUSB()}}),a.push({name:"Inverted Both (WebUSB)",fn:async function(){return await r.hardResetInvertedWebUSB()}}),a.push({name:"Inverted RTS (WebUSB)",fn:async function(){return await r.hardResetInvertedRTSWebUSB()}}),a.push({name:"Inverted DTR (WebUSB)",fn:async function(){return await r.hardResetInvertedDTRWebUSB()}}))),s||o||(6790!==t.usbVendorId&&a.push({name:"Classic (WebUSB)",fn:async function(){return await r.hardResetClassicWebUSB()}}),a.push({name:"UnixTight (WebUSB)",fn:async function(){return await r.hardResetUnixTightWebUSB()}}),a.push({name:"Classic Long Delay (WebUSB)",fn:async function(){return await r.hardResetClassicLongDelayWebUSB()}}),a.push({name:"Classic Short Delay (WebUSB)",fn:async function(){return await r.hardResetClassicShortDelayWebUSB()}}),e||i||a.push({name:"USB-JTAG/Serial fallback (WebUSB)",fn:async function(){return await r.hardResetUSBJTAGSerialWebUSB()}}))}else(e||i)&&a.push({name:"USB-JTAG/Serial",fn:async function(){return await r.hardResetUSBJTAGSerial()}}),a.push({name:"UnixTight",fn:async function(){return await r.hardResetUnixTight()}}),e||i||a.push({name:"USB-JTAG/Serial (fallback)",fn:async function(){return await r.hardResetUSBJTAGSerial()}});let h=null;for(const t of a)try{if(!this.connected||!this.port.writable){this.logger.log(`Port disconnected, skipping ${t.name} reset`);continue}if(this._abandonCurrentOperation=!1,await t.fn(),n){if(await this.syncWithTimeout(2e3))return void this.logger.log(`Connected USB Serial successfully with ${t.name} reset.`);throw new Error("Sync timeout or abandoned")}{const e=this.sync(),i=new Promise((t,e)=>setTimeout(()=>e(new Error("Sync timeout")),1e3));try{return await Promise.race([e,i]),void this.logger.log(`Connected CDC/JTAG successfully with ${t.name} reset.`)}catch(t){throw new Error("Sync timeout or abandoned")}}}catch(e){if(h=e,this.logger.log(`${t.name} reset failed: ${e.message}`),this._abandonCurrentOperation=!0,await s(100),!this.connected||!this.port.writable){this.logger.log("Port disconnected during reset attempt");break}this._clearInputBuffer(),await this.drainInputBuffer(200),await this.flushSerialBuffers()}throw this._abandonCurrentOperation=!1,new Error(`Couldn't sync to ESP. Try resetting manually. Last error: ${null==h?void 0:h.message}`)}async hardReset(t=!1){t?4097===this.port.getInfo().usbProductId?(await this.hardResetUSBJTAGSerial(),this.logger.log("USB-JTAG/Serial reset.")):this.isWebUSB()?(await this.hardResetClassicWebUSB(),this.logger.log("Classic reset (WebUSB/Android).")):(await this.hardResetClassic(),this.logger.log("Classic reset.")):this.isWebUSB()?(await this.setRTSWebUSB(!0),await this.sleep(200),await this.setRTSWebUSB(!1),await this.sleep(200),this.logger.log("Hard reset (WebUSB).")):(await this.setRTS(!0),await this.sleep(100),await this.setRTS(!1),this.logger.log("Hard reset.")),await new Promise(t=>setTimeout(t,1e3))}macAddr(){const t=new Array(6).fill(0),e=this._efuses[0],i=this._efuses[1],a=this._efuses[2],s=this._efuses[3];let r;if(this.chipFamily==d){if(0!=s)r=[s>>16&255,s>>8&255,255&s];else if(i>>16&255){if(1!=(i>>16&255))throw new Error("Couldnt determine OUI");r=[172,208,116]}else r=[24,254,52];t[0]=r[0],t[1]=r[1],t[2]=r[2],t[3]=i>>8&255,t[4]=255&i,t[5]=e>>24&255}else if(this.chipFamily==u)t[0]=a>>8&255,t[1]=255&a,t[2]=i>>24&255,t[3]=i>>16&255,t[4]=i>>8&255,t[5]=255&i;else{if(this.chipFamily!=c&&this.chipFamily!=_&&this.chipFamily!=f&&this.chipFamily!=g&&this.chipFamily!=p&&this.chipFamily!=w&&this.chipFamily!=m&&this.chipFamily!=b&&this.chipFamily!=S&&this.chipFamily!=y&&this.chipFamily!=B&&this.chipFamily!=R)throw new Error("Unknown chip family");t[0]=i>>8&255,t[1]=255&i,t[2]=e>>24&255,t[3]=e>>16&255,t[4]=e>>8&255,t[5]=255&e}return t}async readRegister(t){this.debug&&this.logger.debug("Reading from Register "+a(t,8));const e=gi("<I",t);await this.sendCommand(10,e);const[i]=await this.getResponse(10);return i}async checkCommand(t,e,i=0,s=3e3){const r=async()=>{s=Math.min(s,X),await this.sendCommand(t,e,i);const[r,n]=await this.getResponse(t,s);if(null===n)throw new Error("Didn't get enough status bytes");let h=n,o=0;if(this.IS_STUB||this.chipFamily==d?o=2:[u,c,_,f,g,p,w,m,b,S,y,B,R].includes(this.chipFamily)||20===t?o=4:[2,4].includes(h.length)?o=h.length:(o=2,this.logger.debug(`Unknown chip family, defaulting to 2-byte status (opcode: ${a(t)}, data.length: ${h.length})`)),h.length<o)throw new Error("Didn't get enough status bytes");const l=h.slice(-o,h.length);if(h=h.slice(0,-o),this.debug&&(this.logger.debug("status",l),this.logger.debug("value",r),this.logger.debug("data",h)),1==l[0])throw 5==l[1]?(await this.drainInputBuffer(200),new Error("Invalid (unsupported) command "+a(t))):new Error("Command failure error code "+a(l[1]));return[r,h]};return this._commandLock=this._commandLock.then(r,r),this._commandLock}async sendCommand(e,i,a=0){const s=t([...gi("<BBHI",0,e,i.length,a),...i]);this.debug&&this.logger.debug(`Writing ${s.length} byte${1==s.length?"":"s"}:`,s),await this.writeToStream(s)}async readPacket(t){let e=null,r=!1;if(this._isCDCDevice){const n=Date.now();for(;;){if(this._abandonCurrentOperation)throw new rt("Operation abandoned (reset strategy timeout)");if(Date.now()-n>t){throw new rt("Timed out waiting for packet "+(null===e?"header":"content"))}if(0!==this._inputBufferAvailable)for(;this._inputBufferAvailable>0;){if(Date.now()-n>t){throw new rt("Timed out waiting for packet "+(null===e?"header":"content"))}const s=this._readByte();if(null===e){if(192!=s)throw this.debug&&(this.logger.debug("Read invalid data: "+a(s)),this.logger.debug("Remaining data in serial buffer: "+i(this._inputBuffer))),new rt("Invalid head of packet ("+a(s)+")");e=[]}else if(r)if(r=!1,220==s)e.push(192);else{if(221!=s)throw this.debug&&(this.logger.debug("Read invalid data: "+a(s)),this.logger.debug("Remaining data in serial buffer: "+i(this._inputBuffer))),new rt("Invalid SLIP escape (0xdb, "+a(s)+")");e.push(219)}else if(219==s)r=!0;else{if(192==s)return this.debug&&this.logger.debug("Received full packet: "+i(e)),this._compactInputBuffer(),e;e.push(s)}}else await s(1)}}else{let n=[];for(;;){if(this._abandonCurrentOperation)throw new rt("Operation abandoned (reset strategy timeout)");const h=Date.now();for(n=[];Date.now()-h<t;){if(this._inputBufferAvailable>0){n.push(this._readByte());break}await s(1)}if(0==n.length){throw new rt("Timed out waiting for packet "+(null===e?"header":"content"))}this.debug&&this.logger.debug("Read "+n.length+" bytes: "+i(n));for(const t of n)if(null===e){if(192!=t)throw this.debug&&(this.logger.debug("Read invalid data: "+a(t)),this.logger.debug("Remaining data in serial buffer: "+i(this._inputBuffer))),new rt("Invalid head of packet ("+a(t)+")");e=[]}else if(r)if(r=!1,220==t)e.push(192);else{if(221!=t)throw this.debug&&(this.logger.debug("Read invalid data: "+a(t)),this.logger.debug("Remaining data in serial buffer: "+i(this._inputBuffer))),new rt("Invalid SLIP escape (0xdb, "+a(t)+")");e.push(219)}else if(219==t)r=!0;else{if(192==t)return this.debug&&this.logger.debug("Received full packet: "+i(e)),this._compactInputBuffer(),e;e.push(t)}}}}async getResponse(t,e=3e3){for(let i=0;i<100;i++){const i=await this.readPacket(e);if(i.length<8)continue;const[s,r,,n]=pi("<BBHI",i.slice(0,8));if(1!=s)continue;const h=i.slice(8);if(null==t||r==t)return[n,h];if(0!=h[0]&&5==h[1])throw await this.drainInputBuffer(200),new Error(`Invalid (unsupported) command ${a(t)}`)}throw new Error("Response doesn't match request")}checksum(t,e=239){for(const i of t)e^=i;return e}async setBaudrate(t){if(this.chipFamily==d)throw new Error("Changing baud rate is not supported on the ESP8266");try{const e=gi("<II",t,this.IS_STUB?h:0);await this.checkCommand(15,e)}catch(e){throw this.logger.error(`Baudrate change error: ${e}`),new Error(`Unable to change the baud rate to ${t}: No response from set baud rate command.`)}this._parent?await this._parent.reconfigurePort(t):await this.reconfigurePort(t),await s(Q),this._parent?this._parent._currentBaudRate=t:this._currentBaudRate=t;const e=this._parent?this._parent._maxUSBSerialBaudrate:this._maxUSBSerialBaudrate;e&&t>e&&(this.logger.log(`⚠️ WARNING: Baudrate ${t} exceeds USB-Serial chip limit (${e})!`),this.logger.log("⚠️ This may cause data corruption or connection failures!")),this.logger.log(`Changed baud rate to ${t}`)}async reconfigurePort(t){var e;this._isReconfiguring=!0;try{try{await this._writeChain}catch(t){this.logger.debug(`Pending write error during reconfigure: ${t}`)}if(this.isWebUSB()){const e=this.port.getInfo(),i=6790===e.usbVendorId&&21971===e.usbProductId;if(!i&&"function"==typeof this.port.setBaudRate)return await this.port.setBaudRate(t),void await s(100)}if(this._writer){try{this._writer.releaseLock()}catch(t){this.logger.debug(`Writer release error during reconfigure: ${t}`)}this._writer=void 0}await(null===(e=this._reader)||void 0===e?void 0:e.cancel()),await this.port.close(),await this.port.open({baudRate:t}),await this.flushSerialBuffers(),this.readLoop()}catch(e){throw this.logger.error(`Reconfigure port error: ${e}`),new Error(`Unable to change the baud rate to ${t}: ${e}`)}finally{this._isReconfiguring=!1}}async syncWithTimeout(t){const e=Date.now();for(let i=0;i<5;i++){if(Date.now()-e>t)return!1;if(this._abandonCurrentOperation)return!1;this._clearInputBuffer();try{if(await this._sync())return await s(Q),!0}catch(t){if(this._abandonCurrentOperation)return!1}await s(Q)}return!1}async sync(){for(let t=0;t<5;t++){this._clearInputBuffer();if(await this._sync())return await s(Q),!0;await s(Q)}throw new Error("Couldn't sync to ESP. Try resetting.")}async _sync(){await this.sendCommand(8,l);for(let t=0;t<8;t++)try{const[,t]=await this.getResponse(8,Q);if(t.length>1&&0==t[0]&&0==t[1])return!0}catch(e){this.debug&&this.logger.debug(`Sync attempt ${t+1} failed: ${e}`)}return!1}getFlashWriteSize(){return this.IS_STUB?16384:1024}async flashData(t,e,i=0,s=!1){if(t.byteLength>=8){const e=Array.from(new Uint8Array(t,0,4)),i=e[0],s=e[2],r=e[3];this.logger.log(`Image header, Magic=${a(i)}, FlashMode=${a(s)}, FlashSizeFreq=${a(r)}`)}const r=t.byteLength;let n,h=0,o=K;s?(n=_i(new Uint8Array(t),{level:9}).buffer,h=n.byteLength,this.logger.log(`Writing data with filesize: ${r}. Compressed Size: ${h}`),o=await this.flashDeflBegin(r,h,i)):(this.logger.log(`Writing data with filesize: ${r}`),n=t,await this.flashBegin(r,i));let l=[],d=0,u=0,c=0;const _=Date.now(),f=this.getFlashWriteSize(),g=s?h:r;for(;g-c>0;)this.debug&&this.logger.log(`Writing at ${a(i+d*f,8)} `),g-c>=f?l=Array.from(new Uint8Array(n,c,f)):(l=Array.from(new Uint8Array(n,c,g-c)),s||(l=l.concat(new Array(f-l.length).fill(255)))),s?await this.flashDeflBlock(l,d,o):await this.flashBlock(l,d),d+=1,u+=s?Math.round(l.length*r/h):l.length,c+=f,e(Math.min(u,r),r);this.logger.log("Took "+(Date.now()-_)+"ms to write "+g+" bytes"),this.IS_STUB&&(await this.flashBegin(0,0),s?await this.flashDeflFinish():await this.flashFinish())}async flashBlock(t,e,i=3e3){await this.checkCommand(3,gi("<IIII",t.length,e,0,0).concat(t),this.checksum(t),i)}async flashDeflBlock(t,e,i=3e3){await this.checkCommand(17,gi("<IIII",t.length,e,0,0).concat(t),this.checksum(t),i)}async flashBegin(t=0,e=0,i=!1){let s;await this.flushSerialBuffers();const r=this.getFlashWriteSize();!this.IS_STUB&&[u,c,_,f,g,p,w,m,b,S,y,B,R].includes(this.chipFamily)&&await this.checkCommand(13,new Array(8).fill(0));const n=Math.floor((t+r-1)/r);s=this.chipFamily==d?this.getEraseSize(e,t):t;const h=this.IS_STUB?K:at(tt,t),o=Date.now();let l=gi("<IIII",s,n,r,e);return this.chipFamily!=u&&this.chipFamily!=c&&this.chipFamily!=_&&this.chipFamily!=f&&this.chipFamily!=g&&this.chipFamily!=p&&this.chipFamily!=w&&this.chipFamily!=m&&this.chipFamily!=b&&this.chipFamily!=S&&this.chipFamily!=y&&this.chipFamily!=B&&this.chipFamily!=R||(l=l.concat(gi("<I",i?1:0))),this.logger.log("Erase size "+s+", blocks "+n+", block size "+a(r,4)+", offset "+a(e,4)+", encrypted "+(i?"yes":"no")),await this.checkCommand(2,l,0,h),0==t||this.IS_STUB||this.logger.log("Took "+(Date.now()-o)+"ms to erase "+n+" bytes"),n}async flashDeflBegin(t=0,e=0,i=0){const a=this.getFlashWriteSize(),s=Math.floor((e+a-1)/a),r=Math.floor((t+a-1)/a);let n=0,h=0;this.IS_STUB?(n=t,h=at(tt,n)):(n=r*a,h=K);const o=gi("<IIII",n,s,a,i);return await this.checkCommand(16,o,0,h),h}async flashFinish(){const t=gi("<I",1);await this.checkCommand(4,t)}async flashDeflFinish(){const t=gi("<I",1);await this.checkCommand(18,t)}getBootloaderOffset(){return st(this.getChipFamily()).flashOffs}async flashId(){return await this.runSpiFlashCommand(159,[],24)}getChipFamily(){return this._parent?this._parent.chipFamily:this.chipFamily}async writeRegister(t,e,i=4294967295,a=0,s=0){let r=gi("<IIII",t,e,i,a);s>0&&(r=r.concat(gi("<IIII",st(this.getChipFamily()).uartDateReg,0,0,s))),await this.checkCommand(9,r)}async setDataLengths(t,e,i){if(-1!=t.mosiDlenOffs){const a=t.regBase+t.mosiDlenOffs,s=t.regBase+t.misoDlenOffs;e>0&&await this.writeRegister(a,e-1),i>0&&await this.writeRegister(s,i-1)}else{const a=t.regBase+t.usr1Offs,s=(0==i?0:i-1)<<8|(0==e?0:e-1)<<17;await this.writeRegister(a,s)}}async waitDone(t,e){for(let i=0;i<10;i++){if(0==(await this.readRegister(t)&e))return}throw Error("SPI command did not complete in time")}async runSpiFlashCommand(t,e,i=0){const s=st(this.getChipFamily()),r=s.regBase,n=r,h=r+s.usrOffs,o=r+s.usr2Offs,l=r+s.w0Offs,d=1<<18;if(i>32)throw new Error("Reading more than 32 bits back from a SPI flash operation is unsupported");if(e.length>64)throw new Error("Writing more than 64 bytes of data with one SPI command is unsupported");const u=8*e.length,c=await this.readRegister(h),_=await this.readRegister(o);let f=1<<31;if(i>0&&(f|=268435456),u>0&&(f|=134217728),await this.setDataLengths(s,u,i),await this.writeRegister(h,f),await this.writeRegister(o,7<<28|t),0==u)await this.writeRegister(l,0);else{const t=(4-e.length%4)%4;e=e.concat(new Array(t).fill(0));const i=pi("I".repeat(Math.floor(e.length/4)),e);let s=l;this.logger.debug(`Words Length: ${i.length}`);for(const t of i)this.logger.debug(`Writing word ${a(t)} to register offset ${a(s)}`),await this.writeRegister(s,t),s+=4}await this.writeRegister(n,d),await this.waitDone(n,d);const g=await this.readRegister(l);return await this.writeRegister(h,c),await this.writeRegister(o,_),g}async detectFlashSize(){this.logger.log("Detecting Flash Size");const t=await this.flashId(),e=255&t,i=t>>16&255;this.logger.log(`FlashId: ${a(t)}`),this.logger.log(`Flash Manufacturer: ${e.toString(16)}`),this.logger.log(`Flash Device: ${(t>>8&255).toString(16)}${i.toString(16)}`),this.flashSize=r[i],this.logger.log(`Auto-detected Flash size: ${this.flashSize}`)}getEraseSize(t,e){const i=n,a=Math.floor((e+i-1)/i);let s=16-Math.floor(t/i)%16;return a<s&&(s=a),a<2*s?Math.floor((a+1)/2*i):(a-s)*i}async memBegin(t,e,i,a){return await this.checkCommand(5,gi("<IIII",t,e,i,a))}async memBlock(t,e){return await this.checkCommand(7,gi("<IIII",t.length,e,0,0).concat(t),this.checksum(t))}async memFinish(t=0){const e=this.IS_STUB?K:500,i=gi("<II",0==t?1:0,t);return await this.checkCommand(6,i,0,e)}async runStub(t=!1){const e=await nt(this.chipFamily,this.chipRevision);if(null===e)return this.logger.log(`Stub flasher is not yet supported on ${this.chipName}, using ROM loader`),this;const i=2048;this.logger.log("Uploading stub...");for(const t of["text","data"]){const a=e[t],s=e[`${t}_start`],r=a.length,n=Math.floor((r+i-1)/i);await this.memBegin(r,n,i,s);for(const t of Array(n).keys()){const e=t*i;let s=e+i;s>r&&(s=r),await this.memBlock(a.slice(e,s),t)}}await this.memFinish(e.entry);const a=await this.readPacket(500),s=String.fromCharCode(...a);if("OHAI"!=s)throw new Error("Failed to start stub. Unexpected response: "+s);this.logger.log("Stub is now running...");const r=new mi(this.port,this.logger,this);return t||await r.detectFlashSize(),r}get _writer(){return this._parent?this._parent._writer:this.__writer}set _writer(t){this._parent?this._parent._writer=t:this.__writer=t}get _writeChain(){return this._parent?this._parent._writeChain:this.__writeChain}set _writeChain(t){this._parent?this._parent._writeChain=t:this.__writeChain=t}async writeToStream(t){if(this.port.writable){if(this._isReconfiguring)throw new Error("Cannot write during port reconfiguration");this._writeChain=this._writeChain.then(async()=>{if(!this.port.writable)throw new Error("Port became unavailable during write");if(!this._writer)try{this._writer=this.port.writable.getWriter()}catch(t){throw this.logger.error(`Failed to get writer: ${t}`),t}await this._writer.write(new Uint8Array(t))},async()=>{if(this.logger.debug("Previous write failed, attempting recovery for current write"),!this.port.writable)throw new Error("Port became unavailable during write");if(!this._writer)try{this._writer=this.port.writable.getWriter()}catch(t){throw this.logger.debug(`Failed to get writer in recovery: ${t}`),new Error("Cannot acquire writer lock")}await this._writer.write(new Uint8Array(t))}).catch(t=>{if(this.logger.error(`Write error: ${t}`),this._writer){try{this._writer.releaseLock()}catch{}this._writer=void 0}throw t}),await this._writeChain}else this.logger.debug("Port writable stream not available, skipping write")}async disconnect(){if(this._parent)await this._parent.disconnect();else if(this.port.writable){try{await this._writeChain}catch(t){this.logger.debug(`Pending write error during disconnect: ${t}`)}if(this._writer){try{await this._writer.close(),this._writer.releaseLock()}catch(t){this.logger.debug(`Writer close/release error: ${t}`)}this._writer=void 0}else try{const t=this.port.writable.getWriter();await t.close(),t.releaseLock()}catch(t){this.logger.debug(`Direct writer close error: ${t}`)}await new Promise(t=>{if(!this._reader)return void t(void 0);const e=setTimeout(()=>{this.logger.debug("Disconnect timeout - forcing resolution"),t(void 0)},1e3);this.addEventListener("disconnect",()=>{clearTimeout(e),t(void 0)},{once:!0});try{this._reader.cancel()}catch(i){this.logger.debug(`Reader cancel error: ${i}`),clearTimeout(e),t(void 0)}}),this.connected=!1;try{await this.port.close(),this.logger.debug("Port closed successfully")}catch(t){this.logger.debug(`Port close error: ${t}`)}}else this.logger.debug("Port already closed, skipping disconnect")}async reconnect(){if(this._parent)await this._parent.reconnect();else try{this.logger.log("Reconnecting serial port..."),this.connected=!1,this.__inputBuffer=[],this.__inputBufferReadIndex=0;try{await this._writeChain}catch(t){this.logger.debug(`Pending write error during reconnect: ${t}`)}if(this._isReconfiguring=!0,this._writer){try{this._writer.releaseLock()}catch(t){this.logger.debug(`Writer release error during reconnect: ${t}`)}this._writer=void 0}if(this._reader){try{await this._reader.cancel()}catch(t){this.logger.debug(`Reader cancel error: ${t}`)}this._reader=void 0}try{await this.port.close(),this.logger.log("Port closed")}catch(t){this.logger.debug(`Port close error: ${t}`)}this.logger.debug("Opening port...");try{await this.port.open({baudRate:h}),this.connected=!0}catch(t){throw new Error(`Failed to open port: ${t}`)}if(!this.port.readable||!this.port.writable)throw new Error(`Port streams not available after open (readable: ${!!this.port.readable}, writable: ${!!this.port.writable})`);this._isReconfiguring=!1;const t=this.chipFamily,e=this.chipName,i=this.chipRevision,a=this.chipVariant,s=this.flashSize;if(await this.hardReset(!0),this._parent||(this.__inputBuffer=[],this.__inputBufferReadIndex=0,this.__totalBytesRead=0,this.readLoop()),await this.flushSerialBuffers(),await this.sync(),this.chipFamily=t,this.chipName=e,this.chipRevision=i,this.chipVariant=a,this.flashSize=s,this.logger.debug(`Reconnect complete (chip: ${this.chipName})`),!this.port.writable||!this.port.readable)throw new Error("Port not ready after reconnect");const r=await this.runStub(!0);if(this.logger.debug("Stub loaded"),this._currentBaudRate!==h&&(await r.setBaudrate(this._currentBaudRate),!this.port.writable||!this.port.readable))throw new Error(`Port not ready after baudrate change (readable: ${!!this.port.readable}, writable: ${!!this.port.writable})`);this.IS_STUB=!0,this.logger.debug("Reconnection successful")}catch(t){throw this._isReconfiguring=!1,t}}async drainInputBuffer(t=200){await s(t);let e=0;const i=Date.now();for(;e<112&&Date.now()-i<100;)if(this._inputBufferAvailable>0){void 0!==this._readByte()&&e++}else await s(1);e>0&&this.logger.debug(`Drained ${e} bytes from input buffer`),this._parent||(this.__inputBuffer=[],this.__inputBufferReadIndex=0)}async flushSerialBuffers(){this._parent||(this.__inputBuffer=[],this.__inputBufferReadIndex=0),await s(Q),this._parent||(this.__inputBuffer=[],this.__inputBufferReadIndex=0),this.logger.debug("Serial buffers flushed")}async readFlash(e,i,a){if(!this.IS_STUB)throw new Error("Reading flash is only supported in stub mode. Please run runStub() first.");let r;await this.flushSerialBuffers(),this.logger.log(`Reading ${i} bytes from flash at address 0x${e.toString(16)}...`),this.isWebUSB()&&(this._isCDCDevice?(this._adaptiveBlockMultiplier=8,this._adaptiveMaxInFlightMultiplier=8,this._consecutiveSuccessfulChunks=0,this.logger.debug(`CDC device - Initialized: blockMultiplier=${this._adaptiveBlockMultiplier}, maxInFlightMultiplier=${this._adaptiveMaxInFlightMultiplier}`)):(this._adaptiveBlockMultiplier=1,this._adaptiveMaxInFlightMultiplier=1,this._consecutiveSuccessfulChunks=0,this.logger.debug("Non-CDC device - Fixed values: blockSize=31, maxInFlight=31"))),r=this.isWebUSB()?16384:262144;let n=new Uint8Array(0),h=e,o=i;for(;o>0;){const e=Math.min(r,o);let l=!1,d=0;const u=5;let c=!1;for(;!l&&d<=u;){let i=new Uint8Array(0),a=0;try{let r,o;if(0===d&&this.logger.debug(`Reading chunk at 0x${h.toString(16)}, size: 0x${e.toString(16)}`),this.isWebUSB()){const t=this.port.maxTransferSize||64,e=Math.floor((t-2)/2);r=e*this._adaptiveBlockMultiplier,o=e*this._adaptiveMaxInFlightMultiplier}else{const t=63;r=65*t,o=130*t}const u=gi("<IIII",h,e,r,o),[c]=await this.checkCommand(210,u);if(0!=c)throw new Error("Failed to read memory: "+c);for(;i.length<e;){let r;try{r=await this.readPacket(100)}catch(t){if(t instanceof rt){this.logger.debug(`SLIP read error at ${i.length} bytes: ${t.message}`);try{const t=[192,192];await this.writeToStream(t),this.logger.debug("Sent abort frame to stub"),await s(50)}catch(t){this.logger.debug(`Abort frame error: ${t}`)}if(await this.drainInputBuffer(200),i.length>=e)break}throw t}if(r&&r.length>0){const s=new Uint8Array(r),n=new Uint8Array(i.length+s.length);n.set(i),n.set(s,i.length),i=n;if(i.length>=e||i.length>=a+o){const e=gi("<I",i.length),s=t(e);await this.writeToStream(s),a=i.length}}}const _=new Uint8Array(n.length+i.length);if(_.set(n),_.set(i,n.length),n=_,l=!0,this.isWebUSB()&&this._isCDCDevice&&0===d&&(this._consecutiveSuccessfulChunks++,this._consecutiveSuccessfulChunks>=2)){const t=this.port.maxTransferSize||64,e=Math.floor((t-2)/2),i=8,a=8;let s=!1;if(this._adaptiveBlockMultiplier<i?(this._adaptiveBlockMultiplier=Math.min(2*this._adaptiveBlockMultiplier,i),s=!0):this._adaptiveMaxInFlightMultiplier<a&&(this._adaptiveMaxInFlightMultiplier=Math.min(2*this._adaptiveMaxInFlightMultiplier,a),s=!0),s){const t=e*this._adaptiveBlockMultiplier,i=e*this._adaptiveMaxInFlightMultiplier;this.logger.debug(`Speed increased: blockSize=${t}, maxInFlight=${i}`),this._lastAdaptiveAdjustment=Date.now()}this._consecutiveSuccessfulChunks=0}}catch(t){if(d++,this.isWebUSB()&&this._isCDCDevice&&1===d)if(this._adaptiveBlockMultiplier>1||this._adaptiveMaxInFlightMultiplier>1){this._adaptiveBlockMultiplier=1,this._adaptiveMaxInFlightMultiplier=1,this._consecutiveSuccessfulChunks=0;const t=this.port.maxTransferSize||64,e=Math.floor((t-2)/2),i=e*this._adaptiveBlockMultiplier,a=e*this._adaptiveMaxInFlightMultiplier;this.logger.debug(`Error at higher speed - reduced to minimum: blockSize=${i}, maxInFlight=${a}`)}else this.logger.debug("Error at minimum speed (blockSize=31, maxInFlight=31) - not a speed issue");if(!(t instanceof rt))throw t;if(d<=u){this.logger.log(`${t.message} at 0x${h.toString(16)}. Draining buffer and retrying (attempt ${d}/${u})...`);try{await this.drainInputBuffer(200),await this.flushSerialBuffers(),await s(Q)}catch(t){this.logger.debug(`Buffer drain error: ${t}`)}}else{if(c)throw new Error(`Failed to read chunk at 0x${h.toString(16)} after ${u} retries and recovery attempt`);c=!0,this.logger.log(`All retries exhausted at 0x${h.toString(16)}. Attempting recovery (close and reopen port)...`);try{await this.reconnect(),this.logger.log("Deep recovery successful. Resuming read from current position..."),d=0;continue}catch(t){throw new Error(`Failed to read chunk at 0x${h.toString(16)} after ${u} retries and recovery failed: ${t}`)}}}}a&&a(new Uint8Array(e),n.length,i),h+=e,o-=e,this.logger.debug(`Total progress: 0x${n.length.toString(16)} from 0x${i.toString(16)} bytes`)}return n}}class mi extends wi{constructor(){super(...arguments),this.IS_STUB=!0}async memBegin(t,e,i,s){const r=await nt(this.chipFamily,this.chipRevision);if(null===r)return[0,[]];const n=s,h=s+t;this.logger.debug(`Load range: ${a(n,8)}-${a(h,8)}`),this.logger.debug(`Stub data: ${a(r.data_start,8)}, len: ${r.data.length}, text: ${a(r.text_start,8)}, len: ${r.text.length}`);for(const[t,e]of[[r.data_start,r.data_start+r.data.length],[r.text_start,r.text_start+r.text.length]])if(n<e&&h>t)throw new Error("Software loader is resident at "+a(t,8)+"-"+a(e,8)+". Can't load binary at overlapping address range "+a(n,8)+"-"+a(h,8)+". Try changing the binary loading address.");return[0,[]]}async eraseFlash(){await this.checkCommand(208,[],0,Y)}async eraseRegion(t,e){if(t<0)throw new Error(`Invalid offset: ${t} (must be non-negative)`);if(e<0)throw new Error(`Invalid size: ${e} (must be non-negative)`);if(0===e)return void this.logger.log("eraseRegion: size is 0, skipping erase");if(t%n!==0)throw new Error(`Offset ${t} (0x${t.toString(16)}) is not aligned to flash sector size 4096 (0x${n.toString(16)})`);if(e%n!==0)throw new Error(`Size ${e} (0x${e.toString(16)}) is not aligned to flash sector size 4096 (0x${n.toString(16)})`);const i=4294967295;if(t>i)throw new Error(`Offset ${t} exceeds maximum value 4294967295`);if(e>i)throw new Error(`Size ${e} exceeds maximum value 4294967295`);if(t+e>i)throw new Error(`Region end (offset + size = ${t+e}) exceeds maximum addressable range 4294967295`);const a=at(tt,e),s=gi("<II",t,e);await this.checkCommand(209,s,0,a)}}const bi=async t=>{let e;const i=globalThis.requestSerialPort;if("function"==typeof i)e=await i();else{if(!navigator.serial)throw new Error("Web Serial API is not supported in this browser. Please use Chrome, Edge, or Opera on desktop, or Chrome on Android. Note: The page must be served over HTTPS or localhost.");e=await navigator.serial.requestPort()}return e.readable&&e.writable||await e.open({baudRate:h}),new wi(e,t)},Si=async(t,e)=>{if(!t)throw new Error("Port is required");return t.readable&&t.writable||await t.open({baudRate:h}),new wi(t,e)};export{Y as CHIP_ERASE_TIMEOUT,u as CHIP_FAMILY_ESP32,f as CHIP_FAMILY_ESP32C2,g as CHIP_FAMILY_ESP32C3,p as CHIP_FAMILY_ESP32C5,w as CHIP_FAMILY_ESP32C6,m as CHIP_FAMILY_ESP32C61,b as CHIP_FAMILY_ESP32H2,y as CHIP_FAMILY_ESP32H21,S as CHIP_FAMILY_ESP32H4,B as CHIP_FAMILY_ESP32P4,c as CHIP_FAMILY_ESP32S2,_ as CHIP_FAMILY_ESP32S3,R as CHIP_FAMILY_ESP32S31,d as CHIP_FAMILY_ESP8266,K as DEFAULT_TIMEOUT,tt as ERASE_REGION_TIMEOUT_PER_MB,wi as ESPLoader,M as ESP_CHANGE_BAUDRATE,Z as ESP_CHECKSUM_MAGIC,O as ESP_ERASE_FLASH,E as ESP_ERASE_REGION,T as ESP_FLASH_BEGIN,I as ESP_FLASH_DATA,V as ESP_FLASH_DEFL_BEGIN,H as ESP_FLASH_DEFL_DATA,j as ESP_FLASH_DEFL_END,D as ESP_FLASH_END,N as ESP_GET_SECURITY_INFO,x as ESP_MEM_BEGIN,C as ESP_MEM_DATA,k as ESP_MEM_END,q as ESP_RAM_BLOCK,A as ESP_READ_FLASH,W as ESP_READ_REG,P as ESP_SPI_ATTACH,L as ESP_SPI_FLASH_MD5,$ as ESP_SPI_SET_PARAMS,F as ESP_SYNC,z as ESP_WRITE_REG,it as FLASH_READ_TIMEOUT,X as MAX_TIMEOUT,et as MEM_END_ROM_TIMEOUT,G as ROM_INVALID_RECV_MSG,Q as SYNC_TIMEOUT,J as USB_RAM_BLOCK,bi as connect,Si as connectWithPort};
@@ -1 +1 @@
1
- const t=t=>{let e=[192];for(const i of t)219==i?e=e.concat([219,221]):192==i?e=e.concat([219,220]):e.push(i);return e.push(192),e},e=t=>{const e=[];for(let i=0;i<t.length;i++){const a=t.charCodeAt(i);a<=255&&e.push(a)}return e},i=t=>"["+t.map(t=>a(t)).join(", ")+"]",a=(t,e=2)=>{const i=t.toString(16).toUpperCase();return i.startsWith("-")?"-0x"+i.substring(1).padStart(e,"0"):"0x"+i.padStart(e,"0")},s=t=>new Promise(e=>setTimeout(e,t)),r={18:"256KB",19:"512KB",20:"1MB",21:"2MB",22:"4MB",23:"8MB",24:"16MB",25:"32MB",26:"64MB",27:"128MB",28:"256MB",32:"64MB",33:"128MB",34:"256MB",50:"256KB",51:"512KB",52:"1MB",53:"2MB",54:"4MB",55:"8MB",56:"16MB",57:"32MB",58:"64MB"},n=4096,h=115200,o=1343410176,l=e(" UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU"),d=33382,u=50,c=12882,_=12883,f=12994,g=12995,p=12997,w=12998,m=207969,b=12914,S=12916,y=12917,B=12928,v=12849,R={5:{name:"ESP32-C3",family:g},9:{name:"ESP32-S3",family:_},12:{name:"ESP32-C2",family:f},13:{name:"ESP32-C6",family:w},16:{name:"ESP32-H2",family:b},18:{name:"ESP32-P4",family:B},20:{name:"ESP32-C61",family:m},23:{name:"ESP32-C5",family:p},25:{name:"ESP32-H21",family:y},28:{name:"ESP32-H4",family:S},32:{name:"ESP32-S31",family:v}},U={4293968129:{name:"ESP8266",family:d},15736195:{name:"ESP32",family:u},1990:{name:"ESP32-S2",family:c}},I=2,T=3,x=4,D=5,k=6,C=7,F=8,z=9,W=10,O=208,A=209,E=210,$=11,M=13,P=15,L=19,N=20,Z=239,V=16,H=17,j=18,G=5,J=2048,q=6144,K=3e3,Y=15e4,X=3e5,Q=100,tt=3e4,et=500,it=100,at=(t,e)=>{const i=Math.floor(t*(e/486));return i<K?K:i},st=t=>{switch(t){case u:return{regBase:1072963584,baseFuse:1073061888,macFuse:1073061888,usrOffs:28,usr1Offs:32,usr2Offs:36,mosiDlenOffs:40,misoDlenOffs:44,w0Offs:128,uartDateReg:1610612856,flashOffs:4096};case c:return{regBase:1061167104,baseFuse:1061265408,macFuse:1061265476,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612856,flashOffs:4096};case _:return{regBase:1610620928,usrOffs:24,baseFuse:1610641408,macFuse:1610641476,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612864,flashOffs:0};case d:return{regBase:1610613248,usrOffs:28,baseFuse:1072693328,macFuse:1072693328,usr1Offs:32,usr2Offs:36,mosiDlenOffs:-1,misoDlenOffs:-1,w0Offs:64,uartDateReg:1610612856,flashOffs:0};case f:case g:return{regBase:1610620928,baseFuse:1610647552,macFuse:1610647620,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612860,flashOffs:0};case p:return{regBase:1610625024,baseFuse:1611352064,macFuse:1611352132,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612860,flashOffs:8192};case w:return{regBase:1610625024,baseFuse:1611335680,macFuse:1611335748,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612860,flashOffs:0};case m:return{regBase:1610625024,baseFuse:1611352064,macFuse:1611352132,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612860,flashOffs:0};case b:return{regBase:1610625024,baseFuse:1611335680,macFuse:1611335748,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612860,flashOffs:0};case S:return{regBase:1611239424,baseFuse:1611339776,macFuse:1611339844,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610686588,flashOffs:8192};case y:return{regBase:1610625024,baseFuse:1611350016,macFuse:1611350084,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612860,flashOffs:0};case B:return{regBase:1342754816,baseFuse:o,macFuse:1343410244,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1343004812,flashOffs:8192};case v:return{regBase:542113792,baseFuse:544296960,macFuse:544297028,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:540582028,flashOffs:8192};default:return{regBase:-1,baseFuse:-1,macFuse:-1,usrOffs:-1,usr1Offs:-1,usr2Offs:-1,mosiDlenOffs:-1,misoDlenOffs:-1,w0Offs:-1,uartDateReg:-1,flashOffs:-1}}};class rt extends Error{constructor(t){super(t),this.name="SlipReadError"}}const nt=async(t,i)=>{let a;if(t==S||t==y||t==v)return null;if(t==u)a=await import("./esp32-BRKoi17y.js");else if(t==c)a=await import("./esp32s2-iX3WoDbg.js");else if(t==_)a=await import("./esp32s3-DGwDVIgz.js");else if(t==d)a=await import("./esp8266-CUwxJpGa.js");else if(t==f)a=await import("./esp32c2-Btgr_lwh.js");else if(t==g)a=await import("./esp32c3-CHKfoI8W.js");else if(t==p)a=await import("./esp32c5-BDW4KtLo.js");else if(t==w)a=await import("./esp32c6-il8tTxAG.js");else if(t==m)a=await import("./esp32c61-thKzxBGf.js");else if(t==b)a=await import("./esp32h2-CxoUHv_P.js");else{if(t!=B)return null;a=null!=i&&i>=300?await import("./esp32p4r3-CqI71ojR.js"):await import("./esp32p4-D3jLP-jY.js")}return{...a,text:e(atob(a.text)),data:e(atob(a.data))}};function ht(t){let e=t.length;for(;--e>=0;)t[e]=0}const ot=256,lt=286,dt=30,ut=15,ct=new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]),_t=new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]),ft=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]),gt=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),pt=new Array(576);ht(pt);const wt=new Array(60);ht(wt);const mt=new Array(512);ht(mt);const bt=new Array(256);ht(bt);const St=new Array(29);ht(St);const yt=new Array(dt);function Bt(t,e,i,a,s){this.static_tree=t,this.extra_bits=e,this.extra_base=i,this.elems=a,this.max_length=s,this.has_stree=t&&t.length}let vt,Rt,Ut;function It(t,e){this.dyn_tree=t,this.max_code=0,this.stat_desc=e}ht(yt);const Tt=t=>t<256?mt[t]:mt[256+(t>>>7)],xt=(t,e)=>{t.pending_buf[t.pending++]=255&e,t.pending_buf[t.pending++]=e>>>8&255},Dt=(t,e,i)=>{t.bi_valid>16-i?(t.bi_buf|=e<<t.bi_valid&65535,xt(t,t.bi_buf),t.bi_buf=e>>16-t.bi_valid,t.bi_valid+=i-16):(t.bi_buf|=e<<t.bi_valid&65535,t.bi_valid+=i)},kt=(t,e,i)=>{Dt(t,i[2*e],i[2*e+1])},Ct=(t,e)=>{let i=0;do{i|=1&t,t>>>=1,i<<=1}while(--e>0);return i>>>1},Ft=(t,e,i)=>{const a=new Array(16);let s,r,n=0;for(s=1;s<=ut;s++)n=n+i[s-1]<<1,a[s]=n;for(r=0;r<=e;r++){let e=t[2*r+1];0!==e&&(t[2*r]=Ct(a[e]++,e))}},zt=t=>{let e;for(e=0;e<lt;e++)t.dyn_ltree[2*e]=0;for(e=0;e<dt;e++)t.dyn_dtree[2*e]=0;for(e=0;e<19;e++)t.bl_tree[2*e]=0;t.dyn_ltree[512]=1,t.opt_len=t.static_len=0,t.sym_next=t.matches=0},Wt=t=>{t.bi_valid>8?xt(t,t.bi_buf):t.bi_valid>0&&(t.pending_buf[t.pending++]=t.bi_buf),t.bi_buf=0,t.bi_valid=0},Ot=(t,e,i,a)=>{const s=2*e,r=2*i;return t[s]<t[r]||t[s]===t[r]&&a[e]<=a[i]},At=(t,e,i)=>{const a=t.heap[i];let s=i<<1;for(;s<=t.heap_len&&(s<t.heap_len&&Ot(e,t.heap[s+1],t.heap[s],t.depth)&&s++,!Ot(e,a,t.heap[s],t.depth));)t.heap[i]=t.heap[s],i=s,s<<=1;t.heap[i]=a},Et=(t,e,i)=>{let a,s,r,n,h=0;if(0!==t.sym_next)do{a=255&t.pending_buf[t.sym_buf+h++],a+=(255&t.pending_buf[t.sym_buf+h++])<<8,s=t.pending_buf[t.sym_buf+h++],0===a?kt(t,s,e):(r=bt[s],kt(t,r+ot+1,e),n=ct[r],0!==n&&(s-=St[r],Dt(t,s,n)),a--,r=Tt(a),kt(t,r,i),n=_t[r],0!==n&&(a-=yt[r],Dt(t,a,n)))}while(h<t.sym_next);kt(t,256,e)},$t=(t,e)=>{const i=e.dyn_tree,a=e.stat_desc.static_tree,s=e.stat_desc.has_stree,r=e.stat_desc.elems;let n,h,o,l=-1;for(t.heap_len=0,t.heap_max=573,n=0;n<r;n++)0!==i[2*n]?(t.heap[++t.heap_len]=l=n,t.depth[n]=0):i[2*n+1]=0;for(;t.heap_len<2;)o=t.heap[++t.heap_len]=l<2?++l:0,i[2*o]=1,t.depth[o]=0,t.opt_len--,s&&(t.static_len-=a[2*o+1]);for(e.max_code=l,n=t.heap_len>>1;n>=1;n--)At(t,i,n);o=r;do{n=t.heap[1],t.heap[1]=t.heap[t.heap_len--],At(t,i,1),h=t.heap[1],t.heap[--t.heap_max]=n,t.heap[--t.heap_max]=h,i[2*o]=i[2*n]+i[2*h],t.depth[o]=(t.depth[n]>=t.depth[h]?t.depth[n]:t.depth[h])+1,i[2*n+1]=i[2*h+1]=o,t.heap[1]=o++,At(t,i,1)}while(t.heap_len>=2);t.heap[--t.heap_max]=t.heap[1],((t,e)=>{const i=e.dyn_tree,a=e.max_code,s=e.stat_desc.static_tree,r=e.stat_desc.has_stree,n=e.stat_desc.extra_bits,h=e.stat_desc.extra_base,o=e.stat_desc.max_length;let l,d,u,c,_,f,g=0;for(c=0;c<=ut;c++)t.bl_count[c]=0;for(i[2*t.heap[t.heap_max]+1]=0,l=t.heap_max+1;l<573;l++)d=t.heap[l],c=i[2*i[2*d+1]+1]+1,c>o&&(c=o,g++),i[2*d+1]=c,d>a||(t.bl_count[c]++,_=0,d>=h&&(_=n[d-h]),f=i[2*d],t.opt_len+=f*(c+_),r&&(t.static_len+=f*(s[2*d+1]+_)));if(0!==g){do{for(c=o-1;0===t.bl_count[c];)c--;t.bl_count[c]--,t.bl_count[c+1]+=2,t.bl_count[o]--,g-=2}while(g>0);for(c=o;0!==c;c--)for(d=t.bl_count[c];0!==d;)u=t.heap[--l],u>a||(i[2*u+1]!==c&&(t.opt_len+=(c-i[2*u+1])*i[2*u],i[2*u+1]=c),d--)}})(t,e),Ft(i,l,t.bl_count)},Mt=(t,e,i)=>{let a,s,r=-1,n=e[1],h=0,o=7,l=4;for(0===n&&(o=138,l=3),e[2*(i+1)+1]=65535,a=0;a<=i;a++)s=n,n=e[2*(a+1)+1],++h<o&&s===n||(h<l?t.bl_tree[2*s]+=h:0!==s?(s!==r&&t.bl_tree[2*s]++,t.bl_tree[32]++):h<=10?t.bl_tree[34]++:t.bl_tree[36]++,h=0,r=s,0===n?(o=138,l=3):s===n?(o=6,l=3):(o=7,l=4))},Pt=(t,e,i)=>{let a,s,r=-1,n=e[1],h=0,o=7,l=4;for(0===n&&(o=138,l=3),a=0;a<=i;a++)if(s=n,n=e[2*(a+1)+1],!(++h<o&&s===n)){if(h<l)do{kt(t,s,t.bl_tree)}while(0!==--h);else 0!==s?(s!==r&&(kt(t,s,t.bl_tree),h--),kt(t,16,t.bl_tree),Dt(t,h-3,2)):h<=10?(kt(t,17,t.bl_tree),Dt(t,h-3,3)):(kt(t,18,t.bl_tree),Dt(t,h-11,7));h=0,r=s,0===n?(o=138,l=3):s===n?(o=6,l=3):(o=7,l=4)}};let Lt=!1;const Nt=(t,e,i,a)=>{Dt(t,0+(a?1:0),3),Wt(t),xt(t,i),xt(t,~i),i&&t.pending_buf.set(t.window.subarray(e,e+i),t.pending),t.pending+=i};var Zt=(t,e,i,a)=>{let s,r,n=0;t.level>0?(2===t.strm.data_type&&(t.strm.data_type=(t=>{let e,i=4093624447;for(e=0;e<=31;e++,i>>>=1)if(1&i&&0!==t.dyn_ltree[2*e])return 0;if(0!==t.dyn_ltree[18]||0!==t.dyn_ltree[20]||0!==t.dyn_ltree[26])return 1;for(e=32;e<ot;e++)if(0!==t.dyn_ltree[2*e])return 1;return 0})(t)),$t(t,t.l_desc),$t(t,t.d_desc),n=(t=>{let e;for(Mt(t,t.dyn_ltree,t.l_desc.max_code),Mt(t,t.dyn_dtree,t.d_desc.max_code),$t(t,t.bl_desc),e=18;e>=3&&0===t.bl_tree[2*gt[e]+1];e--);return t.opt_len+=3*(e+1)+5+5+4,e})(t),s=t.opt_len+3+7>>>3,r=t.static_len+3+7>>>3,r<=s&&(s=r)):s=r=i+5,i+4<=s&&-1!==e?Nt(t,e,i,a):4===t.strategy||r===s?(Dt(t,2+(a?1:0),3),Et(t,pt,wt)):(Dt(t,4+(a?1:0),3),((t,e,i,a)=>{let s;for(Dt(t,e-257,5),Dt(t,i-1,5),Dt(t,a-4,4),s=0;s<a;s++)Dt(t,t.bl_tree[2*gt[s]+1],3);Pt(t,t.dyn_ltree,e-1),Pt(t,t.dyn_dtree,i-1)})(t,t.l_desc.max_code+1,t.d_desc.max_code+1,n+1),Et(t,t.dyn_ltree,t.dyn_dtree)),zt(t),a&&Wt(t)},Vt={_tr_init:t=>{Lt||((()=>{let t,e,i,a,s;const r=new Array(16);for(i=0,a=0;a<28;a++)for(St[a]=i,t=0;t<1<<ct[a];t++)bt[i++]=a;for(bt[i-1]=a,s=0,a=0;a<16;a++)for(yt[a]=s,t=0;t<1<<_t[a];t++)mt[s++]=a;for(s>>=7;a<dt;a++)for(yt[a]=s<<7,t=0;t<1<<_t[a]-7;t++)mt[256+s++]=a;for(e=0;e<=ut;e++)r[e]=0;for(t=0;t<=143;)pt[2*t+1]=8,t++,r[8]++;for(;t<=255;)pt[2*t+1]=9,t++,r[9]++;for(;t<=279;)pt[2*t+1]=7,t++,r[7]++;for(;t<=287;)pt[2*t+1]=8,t++,r[8]++;for(Ft(pt,287,r),t=0;t<dt;t++)wt[2*t+1]=5,wt[2*t]=Ct(t,5);vt=new Bt(pt,ct,257,lt,ut),Rt=new Bt(wt,_t,0,dt,ut),Ut=new Bt(new Array(0),ft,0,19,7)})(),Lt=!0),t.l_desc=new It(t.dyn_ltree,vt),t.d_desc=new It(t.dyn_dtree,Rt),t.bl_desc=new It(t.bl_tree,Ut),t.bi_buf=0,t.bi_valid=0,zt(t)},_tr_stored_block:Nt,_tr_flush_block:Zt,_tr_tally:(t,e,i)=>(t.pending_buf[t.sym_buf+t.sym_next++]=e,t.pending_buf[t.sym_buf+t.sym_next++]=e>>8,t.pending_buf[t.sym_buf+t.sym_next++]=i,0===e?t.dyn_ltree[2*i]++:(t.matches++,e--,t.dyn_ltree[2*(bt[i]+ot+1)]++,t.dyn_dtree[2*Tt(e)]++),t.sym_next===t.sym_end),_tr_align:t=>{Dt(t,2,3),kt(t,256,pt),(t=>{16===t.bi_valid?(xt(t,t.bi_buf),t.bi_buf=0,t.bi_valid=0):t.bi_valid>=8&&(t.pending_buf[t.pending++]=255&t.bi_buf,t.bi_buf>>=8,t.bi_valid-=8)})(t)}};var Ht=(t,e,i,a)=>{let s=65535&t,r=t>>>16&65535,n=0;for(;0!==i;){n=i>2e3?2e3:i,i-=n;do{s=s+e[a++]|0,r=r+s|0}while(--n);s%=65521,r%=65521}return s|r<<16};const jt=new Uint32Array((()=>{let t,e=[];for(var i=0;i<256;i++){t=i;for(var a=0;a<8;a++)t=1&t?3988292384^t>>>1:t>>>1;e[i]=t}return e})());var Gt=(t,e,i,a)=>{const s=jt,r=a+i;t^=-1;for(let i=a;i<r;i++)t=t>>>8^s[255&(t^e[i])];return-1^t},Jt={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"},qt={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_OK:0,Z_STREAM_END:1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_UNKNOWN:2,Z_DEFLATED:8};const{_tr_init:Kt,_tr_stored_block:Yt,_tr_flush_block:Xt,_tr_tally:Qt,_tr_align:te}=Vt,{Z_NO_FLUSH:ee,Z_PARTIAL_FLUSH:ie,Z_FULL_FLUSH:ae,Z_FINISH:se,Z_BLOCK:re,Z_OK:ne,Z_STREAM_END:he,Z_STREAM_ERROR:oe,Z_DATA_ERROR:le,Z_BUF_ERROR:de,Z_DEFAULT_COMPRESSION:ue,Z_FILTERED:ce,Z_HUFFMAN_ONLY:_e,Z_RLE:fe,Z_FIXED:ge,Z_DEFAULT_STRATEGY:pe,Z_UNKNOWN:we,Z_DEFLATED:me}=qt,be=258,Se=262,ye=42,Be=113,ve=666,Re=(t,e)=>(t.msg=Jt[e],e),Ue=t=>2*t-(t>4?9:0),Ie=t=>{let e=t.length;for(;--e>=0;)t[e]=0},Te=t=>{let e,i,a,s=t.w_size;e=t.hash_size,a=e;do{i=t.head[--a],t.head[a]=i>=s?i-s:0}while(--e);e=s,a=e;do{i=t.prev[--a],t.prev[a]=i>=s?i-s:0}while(--e)};let xe=(t,e,i)=>(e<<t.hash_shift^i)&t.hash_mask;const De=t=>{const e=t.state;let i=e.pending;i>t.avail_out&&(i=t.avail_out),0!==i&&(t.output.set(e.pending_buf.subarray(e.pending_out,e.pending_out+i),t.next_out),t.next_out+=i,e.pending_out+=i,t.total_out+=i,t.avail_out-=i,e.pending-=i,0===e.pending&&(e.pending_out=0))},ke=(t,e)=>{Xt(t,t.block_start>=0?t.block_start:-1,t.strstart-t.block_start,e),t.block_start=t.strstart,De(t.strm)},Ce=(t,e)=>{t.pending_buf[t.pending++]=e},Fe=(t,e)=>{t.pending_buf[t.pending++]=e>>>8&255,t.pending_buf[t.pending++]=255&e},ze=(t,e,i,a)=>{let s=t.avail_in;return s>a&&(s=a),0===s?0:(t.avail_in-=s,e.set(t.input.subarray(t.next_in,t.next_in+s),i),1===t.state.wrap?t.adler=Ht(t.adler,e,s,i):2===t.state.wrap&&(t.adler=Gt(t.adler,e,s,i)),t.next_in+=s,t.total_in+=s,s)},We=(t,e)=>{let i,a,s=t.max_chain_length,r=t.strstart,n=t.prev_length,h=t.nice_match;const o=t.strstart>t.w_size-Se?t.strstart-(t.w_size-Se):0,l=t.window,d=t.w_mask,u=t.prev,c=t.strstart+be;let _=l[r+n-1],f=l[r+n];t.prev_length>=t.good_match&&(s>>=2),h>t.lookahead&&(h=t.lookahead);do{if(i=e,l[i+n]===f&&l[i+n-1]===_&&l[i]===l[r]&&l[++i]===l[r+1]){r+=2,i++;do{}while(l[++r]===l[++i]&&l[++r]===l[++i]&&l[++r]===l[++i]&&l[++r]===l[++i]&&l[++r]===l[++i]&&l[++r]===l[++i]&&l[++r]===l[++i]&&l[++r]===l[++i]&&r<c);if(a=be-(c-r),r=c-be,a>n){if(t.match_start=e,n=a,a>=h)break;_=l[r+n-1],f=l[r+n]}}}while((e=u[e&d])>o&&0!==--s);return n<=t.lookahead?n:t.lookahead},Oe=t=>{const e=t.w_size;let i,a,s;do{if(a=t.window_size-t.lookahead-t.strstart,t.strstart>=e+(e-Se)&&(t.window.set(t.window.subarray(e,e+e-a),0),t.match_start-=e,t.strstart-=e,t.block_start-=e,t.insert>t.strstart&&(t.insert=t.strstart),Te(t),a+=e),0===t.strm.avail_in)break;if(i=ze(t.strm,t.window,t.strstart+t.lookahead,a),t.lookahead+=i,t.lookahead+t.insert>=3)for(s=t.strstart-t.insert,t.ins_h=t.window[s],t.ins_h=xe(t,t.ins_h,t.window[s+1]);t.insert&&(t.ins_h=xe(t,t.ins_h,t.window[s+3-1]),t.prev[s&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=s,s++,t.insert--,!(t.lookahead+t.insert<3)););}while(t.lookahead<Se&&0!==t.strm.avail_in)},Ae=(t,e)=>{let i,a,s,r=t.pending_buf_size-5>t.w_size?t.w_size:t.pending_buf_size-5,n=0,h=t.strm.avail_in;do{if(i=65535,s=t.bi_valid+42>>3,t.strm.avail_out<s)break;if(s=t.strm.avail_out-s,a=t.strstart-t.block_start,i>a+t.strm.avail_in&&(i=a+t.strm.avail_in),i>s&&(i=s),i<r&&(0===i&&e!==se||e===ee||i!==a+t.strm.avail_in))break;n=e===se&&i===a+t.strm.avail_in?1:0,Yt(t,0,0,n),t.pending_buf[t.pending-4]=i,t.pending_buf[t.pending-3]=i>>8,t.pending_buf[t.pending-2]=~i,t.pending_buf[t.pending-1]=~i>>8,De(t.strm),a&&(a>i&&(a=i),t.strm.output.set(t.window.subarray(t.block_start,t.block_start+a),t.strm.next_out),t.strm.next_out+=a,t.strm.avail_out-=a,t.strm.total_out+=a,t.block_start+=a,i-=a),i&&(ze(t.strm,t.strm.output,t.strm.next_out,i),t.strm.next_out+=i,t.strm.avail_out-=i,t.strm.total_out+=i)}while(0===n);return h-=t.strm.avail_in,h&&(h>=t.w_size?(t.matches=2,t.window.set(t.strm.input.subarray(t.strm.next_in-t.w_size,t.strm.next_in),0),t.strstart=t.w_size,t.insert=t.strstart):(t.window_size-t.strstart<=h&&(t.strstart-=t.w_size,t.window.set(t.window.subarray(t.w_size,t.w_size+t.strstart),0),t.matches<2&&t.matches++,t.insert>t.strstart&&(t.insert=t.strstart)),t.window.set(t.strm.input.subarray(t.strm.next_in-h,t.strm.next_in),t.strstart),t.strstart+=h,t.insert+=h>t.w_size-t.insert?t.w_size-t.insert:h),t.block_start=t.strstart),t.high_water<t.strstart&&(t.high_water=t.strstart),n?4:e!==ee&&e!==se&&0===t.strm.avail_in&&t.strstart===t.block_start?2:(s=t.window_size-t.strstart,t.strm.avail_in>s&&t.block_start>=t.w_size&&(t.block_start-=t.w_size,t.strstart-=t.w_size,t.window.set(t.window.subarray(t.w_size,t.w_size+t.strstart),0),t.matches<2&&t.matches++,s+=t.w_size,t.insert>t.strstart&&(t.insert=t.strstart)),s>t.strm.avail_in&&(s=t.strm.avail_in),s&&(ze(t.strm,t.window,t.strstart,s),t.strstart+=s,t.insert+=s>t.w_size-t.insert?t.w_size-t.insert:s),t.high_water<t.strstart&&(t.high_water=t.strstart),s=t.bi_valid+42>>3,s=t.pending_buf_size-s>65535?65535:t.pending_buf_size-s,r=s>t.w_size?t.w_size:s,a=t.strstart-t.block_start,(a>=r||(a||e===se)&&e!==ee&&0===t.strm.avail_in&&a<=s)&&(i=a>s?s:a,n=e===se&&0===t.strm.avail_in&&i===a?1:0,Yt(t,t.block_start,i,n),t.block_start+=i,De(t.strm)),n?3:1)},Ee=(t,e)=>{let i,a;for(;;){if(t.lookahead<Se){if(Oe(t),t.lookahead<Se&&e===ee)return 1;if(0===t.lookahead)break}if(i=0,t.lookahead>=3&&(t.ins_h=xe(t,t.ins_h,t.window[t.strstart+3-1]),i=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),0!==i&&t.strstart-i<=t.w_size-Se&&(t.match_length=We(t,i)),t.match_length>=3)if(a=Qt(t,t.strstart-t.match_start,t.match_length-3),t.lookahead-=t.match_length,t.match_length<=t.max_lazy_match&&t.lookahead>=3){t.match_length--;do{t.strstart++,t.ins_h=xe(t,t.ins_h,t.window[t.strstart+3-1]),i=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart}while(0!==--t.match_length);t.strstart++}else t.strstart+=t.match_length,t.match_length=0,t.ins_h=t.window[t.strstart],t.ins_h=xe(t,t.ins_h,t.window[t.strstart+1]);else a=Qt(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++;if(a&&(ke(t,!1),0===t.strm.avail_out))return 1}return t.insert=t.strstart<2?t.strstart:2,e===se?(ke(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(ke(t,!1),0===t.strm.avail_out)?1:2},$e=(t,e)=>{let i,a,s;for(;;){if(t.lookahead<Se){if(Oe(t),t.lookahead<Se&&e===ee)return 1;if(0===t.lookahead)break}if(i=0,t.lookahead>=3&&(t.ins_h=xe(t,t.ins_h,t.window[t.strstart+3-1]),i=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),t.prev_length=t.match_length,t.prev_match=t.match_start,t.match_length=2,0!==i&&t.prev_length<t.max_lazy_match&&t.strstart-i<=t.w_size-Se&&(t.match_length=We(t,i),t.match_length<=5&&(t.strategy===ce||3===t.match_length&&t.strstart-t.match_start>4096)&&(t.match_length=2)),t.prev_length>=3&&t.match_length<=t.prev_length){s=t.strstart+t.lookahead-3,a=Qt(t,t.strstart-1-t.prev_match,t.prev_length-3),t.lookahead-=t.prev_length-1,t.prev_length-=2;do{++t.strstart<=s&&(t.ins_h=xe(t,t.ins_h,t.window[t.strstart+3-1]),i=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart)}while(0!==--t.prev_length);if(t.match_available=0,t.match_length=2,t.strstart++,a&&(ke(t,!1),0===t.strm.avail_out))return 1}else if(t.match_available){if(a=Qt(t,0,t.window[t.strstart-1]),a&&ke(t,!1),t.strstart++,t.lookahead--,0===t.strm.avail_out)return 1}else t.match_available=1,t.strstart++,t.lookahead--}return t.match_available&&(a=Qt(t,0,t.window[t.strstart-1]),t.match_available=0),t.insert=t.strstart<2?t.strstart:2,e===se?(ke(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(ke(t,!1),0===t.strm.avail_out)?1:2};function Me(t,e,i,a,s){this.good_length=t,this.max_lazy=e,this.nice_length=i,this.max_chain=a,this.func=s}const Pe=[new Me(0,0,0,0,Ae),new Me(4,4,8,4,Ee),new Me(4,5,16,8,Ee),new Me(4,6,32,32,Ee),new Me(4,4,16,16,$e),new Me(8,16,32,32,$e),new Me(8,16,128,128,$e),new Me(8,32,128,256,$e),new Me(32,128,258,1024,$e),new Me(32,258,258,4096,$e)];function Le(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=me,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new Uint16Array(1146),this.dyn_dtree=new Uint16Array(122),this.bl_tree=new Uint16Array(78),Ie(this.dyn_ltree),Ie(this.dyn_dtree),Ie(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new Uint16Array(16),this.heap=new Uint16Array(573),Ie(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new Uint16Array(573),Ie(this.depth),this.sym_buf=0,this.lit_bufsize=0,this.sym_next=0,this.sym_end=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}const Ne=t=>{if(!t)return 1;const e=t.state;return!e||e.strm!==t||e.status!==ye&&57!==e.status&&69!==e.status&&73!==e.status&&91!==e.status&&103!==e.status&&e.status!==Be&&e.status!==ve?1:0},Ze=t=>{if(Ne(t))return Re(t,oe);t.total_in=t.total_out=0,t.data_type=we;const e=t.state;return e.pending=0,e.pending_out=0,e.wrap<0&&(e.wrap=-e.wrap),e.status=2===e.wrap?57:e.wrap?ye:Be,t.adler=2===e.wrap?0:1,e.last_flush=-2,Kt(e),ne},Ve=t=>{const e=Ze(t);var i;return e===ne&&((i=t.state).window_size=2*i.w_size,Ie(i.head),i.max_lazy_match=Pe[i.level].max_lazy,i.good_match=Pe[i.level].good_length,i.nice_match=Pe[i.level].nice_length,i.max_chain_length=Pe[i.level].max_chain,i.strstart=0,i.block_start=0,i.lookahead=0,i.insert=0,i.match_length=i.prev_length=2,i.match_available=0,i.ins_h=0),e},He=(t,e,i,a,s,r)=>{if(!t)return oe;let n=1;if(e===ue&&(e=6),a<0?(n=0,a=-a):a>15&&(n=2,a-=16),s<1||s>9||i!==me||a<8||a>15||e<0||e>9||r<0||r>ge||8===a&&1!==n)return Re(t,oe);8===a&&(a=9);const h=new Le;return t.state=h,h.strm=t,h.status=ye,h.wrap=n,h.gzhead=null,h.w_bits=a,h.w_size=1<<h.w_bits,h.w_mask=h.w_size-1,h.hash_bits=s+7,h.hash_size=1<<h.hash_bits,h.hash_mask=h.hash_size-1,h.hash_shift=~~((h.hash_bits+3-1)/3),h.window=new Uint8Array(2*h.w_size),h.head=new Uint16Array(h.hash_size),h.prev=new Uint16Array(h.w_size),h.lit_bufsize=1<<s+6,h.pending_buf_size=4*h.lit_bufsize,h.pending_buf=new Uint8Array(h.pending_buf_size),h.sym_buf=h.lit_bufsize,h.sym_end=3*(h.lit_bufsize-1),h.level=e,h.strategy=r,h.method=i,Ve(t)};var je={deflateInit:(t,e)=>He(t,e,me,15,8,pe),deflateInit2:He,deflateReset:Ve,deflateResetKeep:Ze,deflateSetHeader:(t,e)=>Ne(t)||2!==t.state.wrap?oe:(t.state.gzhead=e,ne),deflate:(t,e)=>{if(Ne(t)||e>re||e<0)return t?Re(t,oe):oe;const i=t.state;if(!t.output||0!==t.avail_in&&!t.input||i.status===ve&&e!==se)return Re(t,0===t.avail_out?de:oe);const a=i.last_flush;if(i.last_flush=e,0!==i.pending){if(De(t),0===t.avail_out)return i.last_flush=-1,ne}else if(0===t.avail_in&&Ue(e)<=Ue(a)&&e!==se)return Re(t,de);if(i.status===ve&&0!==t.avail_in)return Re(t,de);if(i.status===ye&&0===i.wrap&&(i.status=Be),i.status===ye){let e=me+(i.w_bits-8<<4)<<8,a=-1;if(a=i.strategy>=_e||i.level<2?0:i.level<6?1:6===i.level?2:3,e|=a<<6,0!==i.strstart&&(e|=32),e+=31-e%31,Fe(i,e),0!==i.strstart&&(Fe(i,t.adler>>>16),Fe(i,65535&t.adler)),t.adler=1,i.status=Be,De(t),0!==i.pending)return i.last_flush=-1,ne}if(57===i.status)if(t.adler=0,Ce(i,31),Ce(i,139),Ce(i,8),i.gzhead)Ce(i,(i.gzhead.text?1:0)+(i.gzhead.hcrc?2:0)+(i.gzhead.extra?4:0)+(i.gzhead.name?8:0)+(i.gzhead.comment?16:0)),Ce(i,255&i.gzhead.time),Ce(i,i.gzhead.time>>8&255),Ce(i,i.gzhead.time>>16&255),Ce(i,i.gzhead.time>>24&255),Ce(i,9===i.level?2:i.strategy>=_e||i.level<2?4:0),Ce(i,255&i.gzhead.os),i.gzhead.extra&&i.gzhead.extra.length&&(Ce(i,255&i.gzhead.extra.length),Ce(i,i.gzhead.extra.length>>8&255)),i.gzhead.hcrc&&(t.adler=Gt(t.adler,i.pending_buf,i.pending,0)),i.gzindex=0,i.status=69;else if(Ce(i,0),Ce(i,0),Ce(i,0),Ce(i,0),Ce(i,0),Ce(i,9===i.level?2:i.strategy>=_e||i.level<2?4:0),Ce(i,3),i.status=Be,De(t),0!==i.pending)return i.last_flush=-1,ne;if(69===i.status){if(i.gzhead.extra){let e=i.pending,a=(65535&i.gzhead.extra.length)-i.gzindex;for(;i.pending+a>i.pending_buf_size;){let s=i.pending_buf_size-i.pending;if(i.pending_buf.set(i.gzhead.extra.subarray(i.gzindex,i.gzindex+s),i.pending),i.pending=i.pending_buf_size,i.gzhead.hcrc&&i.pending>e&&(t.adler=Gt(t.adler,i.pending_buf,i.pending-e,e)),i.gzindex+=s,De(t),0!==i.pending)return i.last_flush=-1,ne;e=0,a-=s}let s=new Uint8Array(i.gzhead.extra);i.pending_buf.set(s.subarray(i.gzindex,i.gzindex+a),i.pending),i.pending+=a,i.gzhead.hcrc&&i.pending>e&&(t.adler=Gt(t.adler,i.pending_buf,i.pending-e,e)),i.gzindex=0}i.status=73}if(73===i.status){if(i.gzhead.name){let e,a=i.pending;do{if(i.pending===i.pending_buf_size){if(i.gzhead.hcrc&&i.pending>a&&(t.adler=Gt(t.adler,i.pending_buf,i.pending-a,a)),De(t),0!==i.pending)return i.last_flush=-1,ne;a=0}e=i.gzindex<i.gzhead.name.length?255&i.gzhead.name.charCodeAt(i.gzindex++):0,Ce(i,e)}while(0!==e);i.gzhead.hcrc&&i.pending>a&&(t.adler=Gt(t.adler,i.pending_buf,i.pending-a,a)),i.gzindex=0}i.status=91}if(91===i.status){if(i.gzhead.comment){let e,a=i.pending;do{if(i.pending===i.pending_buf_size){if(i.gzhead.hcrc&&i.pending>a&&(t.adler=Gt(t.adler,i.pending_buf,i.pending-a,a)),De(t),0!==i.pending)return i.last_flush=-1,ne;a=0}e=i.gzindex<i.gzhead.comment.length?255&i.gzhead.comment.charCodeAt(i.gzindex++):0,Ce(i,e)}while(0!==e);i.gzhead.hcrc&&i.pending>a&&(t.adler=Gt(t.adler,i.pending_buf,i.pending-a,a))}i.status=103}if(103===i.status){if(i.gzhead.hcrc){if(i.pending+2>i.pending_buf_size&&(De(t),0!==i.pending))return i.last_flush=-1,ne;Ce(i,255&t.adler),Ce(i,t.adler>>8&255),t.adler=0}if(i.status=Be,De(t),0!==i.pending)return i.last_flush=-1,ne}if(0!==t.avail_in||0!==i.lookahead||e!==ee&&i.status!==ve){let a=0===i.level?Ae(i,e):i.strategy===_e?((t,e)=>{let i;for(;;){if(0===t.lookahead&&(Oe(t),0===t.lookahead)){if(e===ee)return 1;break}if(t.match_length=0,i=Qt(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++,i&&(ke(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===se?(ke(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(ke(t,!1),0===t.strm.avail_out)?1:2})(i,e):i.strategy===fe?((t,e)=>{let i,a,s,r;const n=t.window;for(;;){if(t.lookahead<=be){if(Oe(t),t.lookahead<=be&&e===ee)return 1;if(0===t.lookahead)break}if(t.match_length=0,t.lookahead>=3&&t.strstart>0&&(s=t.strstart-1,a=n[s],a===n[++s]&&a===n[++s]&&a===n[++s])){r=t.strstart+be;do{}while(a===n[++s]&&a===n[++s]&&a===n[++s]&&a===n[++s]&&a===n[++s]&&a===n[++s]&&a===n[++s]&&a===n[++s]&&s<r);t.match_length=be-(r-s),t.match_length>t.lookahead&&(t.match_length=t.lookahead)}if(t.match_length>=3?(i=Qt(t,1,t.match_length-3),t.lookahead-=t.match_length,t.strstart+=t.match_length,t.match_length=0):(i=Qt(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++),i&&(ke(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===se?(ke(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(ke(t,!1),0===t.strm.avail_out)?1:2})(i,e):Pe[i.level].func(i,e);if(3!==a&&4!==a||(i.status=ve),1===a||3===a)return 0===t.avail_out&&(i.last_flush=-1),ne;if(2===a&&(e===ie?te(i):e!==re&&(Yt(i,0,0,!1),e===ae&&(Ie(i.head),0===i.lookahead&&(i.strstart=0,i.block_start=0,i.insert=0))),De(t),0===t.avail_out))return i.last_flush=-1,ne}return e!==se?ne:i.wrap<=0?he:(2===i.wrap?(Ce(i,255&t.adler),Ce(i,t.adler>>8&255),Ce(i,t.adler>>16&255),Ce(i,t.adler>>24&255),Ce(i,255&t.total_in),Ce(i,t.total_in>>8&255),Ce(i,t.total_in>>16&255),Ce(i,t.total_in>>24&255)):(Fe(i,t.adler>>>16),Fe(i,65535&t.adler)),De(t),i.wrap>0&&(i.wrap=-i.wrap),0!==i.pending?ne:he)},deflateEnd:t=>{if(Ne(t))return oe;const e=t.state.status;return t.state=null,e===Be?Re(t,le):ne},deflateSetDictionary:(t,e)=>{let i=e.length;if(Ne(t))return oe;const a=t.state,s=a.wrap;if(2===s||1===s&&a.status!==ye||a.lookahead)return oe;if(1===s&&(t.adler=Ht(t.adler,e,i,0)),a.wrap=0,i>=a.w_size){0===s&&(Ie(a.head),a.strstart=0,a.block_start=0,a.insert=0);let t=new Uint8Array(a.w_size);t.set(e.subarray(i-a.w_size,i),0),e=t,i=a.w_size}const r=t.avail_in,n=t.next_in,h=t.input;for(t.avail_in=i,t.next_in=0,t.input=e,Oe(a);a.lookahead>=3;){let t=a.strstart,e=a.lookahead-2;do{a.ins_h=xe(a,a.ins_h,a.window[t+3-1]),a.prev[t&a.w_mask]=a.head[a.ins_h],a.head[a.ins_h]=t,t++}while(--e);a.strstart=t,a.lookahead=2,Oe(a)}return a.strstart+=a.lookahead,a.block_start=a.strstart,a.insert=a.lookahead,a.lookahead=0,a.match_length=a.prev_length=2,a.match_available=0,t.next_in=n,t.input=h,t.avail_in=r,a.wrap=s,ne},deflateInfo:"pako deflate (from Nodeca project)"};const Ge=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);var Je=function(t){const e=Array.prototype.slice.call(arguments,1);for(;e.length;){const i=e.shift();if(i){if("object"!=typeof i)throw new TypeError(i+"must be non-object");for(const e in i)Ge(i,e)&&(t[e]=i[e])}}return t},qe=t=>{let e=0;for(let i=0,a=t.length;i<a;i++)e+=t[i].length;const i=new Uint8Array(e);for(let e=0,a=0,s=t.length;e<s;e++){let s=t[e];i.set(s,a),a+=s.length}return i};let Ke=!0;try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(t){Ke=!1}const Ye=new Uint8Array(256);for(let t=0;t<256;t++)Ye[t]=t>=252?6:t>=248?5:t>=240?4:t>=224?3:t>=192?2:1;Ye[254]=Ye[254]=1;var Xe=t=>{if("function"==typeof TextEncoder&&TextEncoder.prototype.encode)return(new TextEncoder).encode(t);let e,i,a,s,r,n=t.length,h=0;for(s=0;s<n;s++)i=t.charCodeAt(s),55296==(64512&i)&&s+1<n&&(a=t.charCodeAt(s+1),56320==(64512&a)&&(i=65536+(i-55296<<10)+(a-56320),s++)),h+=i<128?1:i<2048?2:i<65536?3:4;for(e=new Uint8Array(h),r=0,s=0;r<h;s++)i=t.charCodeAt(s),55296==(64512&i)&&s+1<n&&(a=t.charCodeAt(s+1),56320==(64512&a)&&(i=65536+(i-55296<<10)+(a-56320),s++)),i<128?e[r++]=i:i<2048?(e[r++]=192|i>>>6,e[r++]=128|63&i):i<65536?(e[r++]=224|i>>>12,e[r++]=128|i>>>6&63,e[r++]=128|63&i):(e[r++]=240|i>>>18,e[r++]=128|i>>>12&63,e[r++]=128|i>>>6&63,e[r++]=128|63&i);return e};var Qe=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0};const ti=Object.prototype.toString,{Z_NO_FLUSH:ei,Z_SYNC_FLUSH:ii,Z_FULL_FLUSH:ai,Z_FINISH:si,Z_OK:ri,Z_STREAM_END:ni,Z_DEFAULT_COMPRESSION:hi,Z_DEFAULT_STRATEGY:oi,Z_DEFLATED:li}=qt;function di(t){this.options=Je({level:hi,method:li,chunkSize:16384,windowBits:15,memLevel:8,strategy:oi},t||{});let e=this.options;e.raw&&e.windowBits>0?e.windowBits=-e.windowBits:e.gzip&&e.windowBits>0&&e.windowBits<16&&(e.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new Qe,this.strm.avail_out=0;let i=je.deflateInit2(this.strm,e.level,e.method,e.windowBits,e.memLevel,e.strategy);if(i!==ri)throw new Error(Jt[i]);if(e.header&&je.deflateSetHeader(this.strm,e.header),e.dictionary){let t;if(t="string"==typeof e.dictionary?Xe(e.dictionary):"[object ArrayBuffer]"===ti.call(e.dictionary)?new Uint8Array(e.dictionary):e.dictionary,i=je.deflateSetDictionary(this.strm,t),i!==ri)throw new Error(Jt[i]);this._dict_set=!0}}di.prototype.push=function(t,e){const i=this.strm,a=this.options.chunkSize;let s,r;if(this.ended)return!1;for(r=e===~~e?e:!0===e?si:ei,"string"==typeof t?i.input=Xe(t):"[object ArrayBuffer]"===ti.call(t)?i.input=new Uint8Array(t):i.input=t,i.next_in=0,i.avail_in=i.input.length;;)if(0===i.avail_out&&(i.output=new Uint8Array(a),i.next_out=0,i.avail_out=a),(r===ii||r===ai)&&i.avail_out<=6)this.onData(i.output.subarray(0,i.next_out)),i.avail_out=0;else{if(s=je.deflate(i,r),s===ni)return i.next_out>0&&this.onData(i.output.subarray(0,i.next_out)),s=je.deflateEnd(this.strm),this.onEnd(s),this.ended=!0,s===ri;if(0!==i.avail_out){if(r>0&&i.next_out>0)this.onData(i.output.subarray(0,i.next_out)),i.avail_out=0;else if(0===i.avail_in)break}else this.onData(i.output)}return!0},di.prototype.onData=function(t){this.chunks.push(t)},di.prototype.onEnd=function(t){t===ri&&(this.result=qe(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg};var ui={deflate:function(t,e){const i=new di(e);if(i.push(t,!0),i.err)throw i.msg||Jt[i.err];return i.result}};const{deflate:ci}=ui;var _i=ci;const fi={b:{u:DataView.prototype.getInt8,p:DataView.prototype.setInt8,bytes:1},B:{u:DataView.prototype.getUint8,p:DataView.prototype.setUint8,bytes:1},h:{u:DataView.prototype.getInt16,p:DataView.prototype.setInt16,bytes:2},H:{u:DataView.prototype.getUint16,p:DataView.prototype.setUint16,bytes:2},i:{u:DataView.prototype.getInt32,p:DataView.prototype.setInt32,bytes:4},I:{u:DataView.prototype.getUint32,p:DataView.prototype.setUint32,bytes:4}},gi=(t,...e)=>{let i=0;if(t.replace(/[<>]/,"").length!=e.length)throw"Pack format to Argument count mismatch";const a=[];let s=!0;for(let a=0;a<t.length;a++)"<"==t[a]?s=!0:">"==t[a]?s=!1:(r(t[a],e[i]),i++);function r(t,e){if(!(t in fi))throw"Unhandled character '"+t+"' in pack format";const i=fi[t].bytes,r=new DataView(new ArrayBuffer(i));fi[t].p.bind(r)(0,e,s);for(let t=0;t<i;t++)a.push(r.getUint8(t))}return a},pi=(t,e)=>{let i=0;const a=[];let s=!0;for(const e of t)"<"==e?s=!0:">"==e?s=!1:r(e);function r(t){if(!(t in fi))throw"Unhandled character '"+t+"' in unpack format";const r=fi[t].bytes,n=new DataView(new ArrayBuffer(r));for(let t=0;t<r;t++)n.setUint8(t,255&e[i+t]);const h=fi[t].u.bind(n);a.push(h(0,s)),i+=r}return a};class wi extends EventTarget{constructor(t,e,i){super(),this.port=t,this.logger=e,this._parent=i,this.__chipName=null,this.__chipRevision=null,this.__chipVariant=null,this._efuses=new Array(4).fill(0),this._flashsize=4194304,this.debug=!1,this.IS_STUB=!1,this.connected=!0,this.flashSize=null,this._currentBaudRate=h,this._isESP32S2NativeUSB=!1,this._initializationSucceeded=!1,this.__commandLock=Promise.resolve([0,[]]),this.__isReconfiguring=!1,this.__abandonCurrentOperation=!1,this.__adaptiveBlockMultiplier=1,this.__adaptiveMaxInFlightMultiplier=1,this.__consecutiveSuccessfulChunks=0,this.__lastAdaptiveAdjustment=0,this.__isCDCDevice=!1,this.state_DTR=!1,this.state_RTS=!1,this.__writeChain=Promise.resolve()}get chipFamily(){return this._parent?this._parent.chipFamily:this.__chipFamily}set chipFamily(t){this._parent?this._parent.chipFamily=t:this.__chipFamily=t}get chipName(){return this._parent?this._parent.chipName:this.__chipName}set chipName(t){this._parent?this._parent.chipName=t:this.__chipName=t}get chipRevision(){return this._parent?this._parent.chipRevision:this.__chipRevision}set chipRevision(t){this._parent?this._parent.chipRevision=t:this.__chipRevision=t}get chipVariant(){return this._parent?this._parent.chipVariant:this.__chipVariant}set chipVariant(t){this._parent?this._parent.chipVariant=t:this.__chipVariant=t}get _inputBuffer(){if(this._parent)return this._parent._inputBuffer;if(void 0===this.__inputBuffer)throw new Error("_inputBuffer accessed before initialization");return this.__inputBuffer}get _inputBufferReadIndex(){return this._parent?this._parent._inputBufferReadIndex:this.__inputBufferReadIndex||0}set _inputBufferReadIndex(t){this._parent?this._parent._inputBufferReadIndex=t:this.__inputBufferReadIndex=t}get _inputBufferAvailable(){return this._inputBuffer.length-this._inputBufferReadIndex}_readByte(){if(!(this._inputBufferReadIndex>=this._inputBuffer.length))return this._inputBuffer[this._inputBufferReadIndex++]}_clearInputBuffer(){this._inputBuffer.length=0,this._inputBufferReadIndex=0}_compactInputBuffer(){this._inputBufferReadIndex>1e3&&this._inputBufferReadIndex>this._inputBuffer.length/2&&(this._inputBuffer.splice(0,this._inputBufferReadIndex),this._inputBufferReadIndex=0)}get _totalBytesRead(){return this._parent?this._parent._totalBytesRead:this.__totalBytesRead||0}set _totalBytesRead(t){this._parent?this._parent._totalBytesRead=t:this.__totalBytesRead=t}get _commandLock(){return this._parent?this._parent._commandLock:this.__commandLock}set _commandLock(t){this._parent?this._parent._commandLock=t:this.__commandLock=t}get _isReconfiguring(){return this._parent?this._parent._isReconfiguring:this.__isReconfiguring}set _isReconfiguring(t){this._parent?this._parent._isReconfiguring=t:this.__isReconfiguring=t}get _abandonCurrentOperation(){return this._parent?this._parent._abandonCurrentOperation:this.__abandonCurrentOperation}set _abandonCurrentOperation(t){this._parent?this._parent._abandonCurrentOperation=t:this.__abandonCurrentOperation=t}get _adaptiveBlockMultiplier(){return this._parent?this._parent._adaptiveBlockMultiplier:this.__adaptiveBlockMultiplier}set _adaptiveBlockMultiplier(t){this._parent?this._parent._adaptiveBlockMultiplier=t:this.__adaptiveBlockMultiplier=t}get _adaptiveMaxInFlightMultiplier(){return this._parent?this._parent._adaptiveMaxInFlightMultiplier:this.__adaptiveMaxInFlightMultiplier}set _adaptiveMaxInFlightMultiplier(t){this._parent?this._parent._adaptiveMaxInFlightMultiplier=t:this.__adaptiveMaxInFlightMultiplier=t}get _consecutiveSuccessfulChunks(){return this._parent?this._parent._consecutiveSuccessfulChunks:this.__consecutiveSuccessfulChunks}set _consecutiveSuccessfulChunks(t){this._parent?this._parent._consecutiveSuccessfulChunks=t:this.__consecutiveSuccessfulChunks=t}get _lastAdaptiveAdjustment(){return this._parent?this._parent._lastAdaptiveAdjustment:this.__lastAdaptiveAdjustment}set _lastAdaptiveAdjustment(t){this._parent?this._parent._lastAdaptiveAdjustment=t:this.__lastAdaptiveAdjustment=t}get _isCDCDevice(){return this._parent?this._parent._isCDCDevice:this.__isCDCDevice}set _isCDCDevice(t){this._parent?this._parent._isCDCDevice=t:this.__isCDCDevice=t}detectUSBSerialChip(t,e){const i={6790:{29986:{name:"CH340",maxBaudrate:460800},29987:{name:"CH340",maxBaudrate:460800},30084:{name:"CH340",maxBaudrate:460800},21795:{name:"CH341",maxBaudrate:2e6},21971:{name:"CH343",maxBaudrate:6e6},21972:{name:"CH9102",maxBaudrate:6e6},21976:{name:"CH9101",maxBaudrate:3e6}},4292:{6e4:{name:"CP2102(n)",maxBaudrate:3e6},60016:{name:"CP2105",maxBaudrate:2e6},60017:{name:"CP2108",maxBaudrate:2e6}},1027:{24577:{name:"FT232R",maxBaudrate:3e6},24592:{name:"FT2232",maxBaudrate:3e6},24593:{name:"FT4232",maxBaudrate:3e6},24596:{name:"FT232H",maxBaudrate:12e6},24597:{name:"FT230X",maxBaudrate:3e6}},12346:{2:{name:"ESP32-S2 Native USB",maxBaudrate:2e6},4097:{name:"ESP32 Native USB",maxBaudrate:2e6},4098:{name:"ESP32 Native USB",maxBaudrate:2e6},16386:{name:"ESP32 Native USB",maxBaudrate:2e6},4096:{name:"ESP32 Native USB",maxBaudrate:2e6}}}[t];return i&&i[e]?i[e]:{name:`Unknown (VID: 0x${t.toString(16)}, PID: 0x${e.toString(16)})`}}async initialize(){if(!this._parent){this.__inputBuffer=[],this.__inputBufferReadIndex=0,this.__totalBytesRead=0;const t=this.port.getInfo();if(t.usbVendorId&&t.usbProductId){const e=this.detectUSBSerialChip(t.usbVendorId,t.usbProductId);this.logger.log(`USB-Serial: ${e.name} (VID: 0x${t.usbVendorId.toString(16)}, PID: 0x${t.usbProductId.toString(16)})`),e.maxBaudrate&&(this._maxUSBSerialBaudrate=e.maxBaudrate,this.logger.log(`Max baudrate: ${e.maxBaudrate}`)),12346===t.usbVendorId&&2===t.usbProductId&&(this._isESP32S2NativeUSB=!0),(12346===t.usbVendorId||6790===t.usbVendorId&&21971===t.usbProductId)&&(this._isCDCDevice=!0)}this.readLoop()}await this.connectWithResetStrategies(),await this.detectChip();const t=st(this.getChipFamily()),e=t.macFuse;for(let t=0;t<4;t++)this._efuses[t]=await this.readRegister(e+4*t);this.logger.log(`Chip type ${this.chipName}`),this.logger.debug(`Bootloader flash offset: 0x${t.flashOffs.toString(16)}`),this._initializationSucceeded=!0}async detectChip(){try{const t=(await this.getSecurityInfo()).chipId,e=R[t];if(e)return this.chipName=e.name,this.chipFamily=e.family,this.chipFamily===B&&(this.chipRevision=await this.getChipRevision(),this.logger.debug(`ESP32-P4 revision: ${this.chipRevision}`),this.chipRevision>=300?this.chipVariant="rev300":this.chipVariant="rev0",this.logger.debug(`ESP32-P4 variant: ${this.chipVariant}`)),void this.logger.debug(`Detected chip via IMAGE_CHIP_ID: ${t} (${this.chipName})`);this.logger.debug(`Unknown IMAGE_CHIP_ID: ${t}, falling back to magic value detection`)}catch(t){this.logger.debug(`GET_SECURITY_INFO failed, using magic value detection: ${t}`),await this.drainInputBuffer(200),this._clearInputBuffer(),await s(Q);try{await this.sync()}catch(t){this.logger.debug(`Re-sync after GET_SECURITY_INFO failure: ${t}`)}}const t=await this.readRegister(1073745920),e=U[t>>>0];if(void 0===e)throw new Error(`Unknown Chip: Hex: ${a(t>>>0,8).toLowerCase()} Number: ${t}`);this.chipName=e.name,this.chipFamily=e.family,this.chipFamily===B&&(this.chipRevision=await this.getChipRevision(),this.logger.debug(`ESP32-P4 revision: ${this.chipRevision}`),this.chipRevision>=300?this.chipVariant="rev300":this.chipVariant="rev0",this.logger.debug(`ESP32-P4 variant: ${this.chipVariant}`)),this.logger.debug(`Detected chip via magic value: ${a(t>>>0,8)} (${this.chipName})`)}async getChipRevision(){if(this.chipFamily!==B)return 0;const t=await this.readRegister(1343410252);return 100*((t>>23&1)<<2|t>>4&3)+(15&t)}async getSecurityInfo(){const[,t]=await this.checkCommand(20,[],0);if(0===t.length)throw new Error("GET_SECURITY_INFO not supported or returned empty response");if(t.length<12)throw new Error(`Invalid security info response length: ${t.length} (expected at least 12 bytes)`);return{flags:pi("<I",t.slice(0,4))[0],flashCryptCnt:t[4],keyPurposes:Array.from(t.slice(5,12)),chipId:t.length>=16?pi("<I",t.slice(12,16))[0]:0,apiVersion:t.length>=20?pi("<I",t.slice(16,20))[0]:0}}async getMacAddress(){if(!this._initializationSucceeded)throw new Error("getMacAddress() requires initialize() to have completed successfully");return this.macAddr().map(t=>t.toString(16).padStart(2,"0").toUpperCase()).join(":")}async readLoop(){this.debug&&this.logger.debug("Starting read loop"),this._reader=this.port.readable.getReader();try{let t=!0;for(;t;){const{value:e,done:i}=await this._reader.read();if(i){this._reader.releaseLock(),t=!1;break}if(!e||0===e.length)continue;const a=Array.from(e);Array.prototype.push.apply(this._inputBuffer,a),this._totalBytesRead+=e.length}}catch{this.logger.error("Read loop got disconnected")}finally{this._isReconfiguring=!1}this.connected=!1,this._isESP32S2NativeUSB&&!this._initializationSucceeded&&(this.logger.log("ESP32-S2 Native USB detected - requesting port reselection"),this.dispatchEvent(new CustomEvent("esp32s2-usb-reconnect",{detail:{message:"ESP32-S2 Native USB requires port reselection"}}))),this.dispatchEvent(new Event("disconnect")),this.logger.debug("Finished read loop")}sleep(t=100){return new Promise(e=>setTimeout(e,t))}async setRTS(t){await this.port.setSignals({requestToSend:t}),await this.setDTR(this.state_DTR)}async setDTR(t){this.state_DTR=t,await this.port.setSignals({dataTerminalReady:t})}async hardResetUSBJTAGSerial(){await this.setRTS(!1),await this.setDTR(!1),await this.sleep(100),await this.setDTR(!0),await this.setRTS(!1),await this.sleep(100),await this.setRTS(!0),await this.setDTR(!1),await this.setRTS(!0),await this.sleep(100),await this.setDTR(!1),await this.setRTS(!1),await this.sleep(200)}async hardResetClassic(){await this.setDTR(!1),await this.setRTS(!0),await this.sleep(100),await this.setDTR(!0),await this.setRTS(!1),await this.sleep(50),await this.setDTR(!1),await this.sleep(200)}async setRTSWebUSB(t){this.state_RTS=t,await this.port.setSignals({requestToSend:t,dataTerminalReady:this.state_DTR})}async setDTRWebUSB(t){this.state_DTR=t,await this.port.setSignals({dataTerminalReady:t,requestToSend:this.state_RTS})}async setDTRandRTSWebUSB(t,e){this.state_DTR=t,this.state_RTS=e,await this.port.setSignals({dataTerminalReady:t,requestToSend:e})}async hardResetUSBJTAGSerialWebUSB(){await this.setRTSWebUSB(!1),await this.setDTRWebUSB(!1),await this.sleep(100),await this.setDTRWebUSB(!0),await this.setRTSWebUSB(!1),await this.sleep(100),await this.setRTSWebUSB(!0),await this.setDTRWebUSB(!1),await this.setRTSWebUSB(!0),await this.sleep(100),await this.setDTRWebUSB(!1),await this.setRTSWebUSB(!1),await this.sleep(200)}async hardResetUSBJTAGSerialInvertedDTRWebUSB(){await this.setRTSWebUSB(!1),await this.setDTRWebUSB(!0),await this.sleep(100),await this.setDTRWebUSB(!1),await this.setRTSWebUSB(!1),await this.sleep(100),await this.setRTSWebUSB(!0),await this.setDTRWebUSB(!0),await this.setRTSWebUSB(!0),await this.sleep(100),await this.setDTRWebUSB(!0),await this.setRTSWebUSB(!1),await this.sleep(200)}async hardResetClassicWebUSB(){await this.setDTRWebUSB(!1),await this.setRTSWebUSB(!0),await this.sleep(100),await this.setDTRWebUSB(!0),await this.setRTSWebUSB(!1),await this.sleep(50),await this.setDTRWebUSB(!1),await this.sleep(200)}async hardResetUnixTightWebUSB(){await this.setDTRandRTSWebUSB(!1,!1),await this.setDTRandRTSWebUSB(!0,!0),await this.setDTRandRTSWebUSB(!1,!0),await this.sleep(100),await this.setDTRandRTSWebUSB(!0,!1),await this.sleep(50),await this.setDTRandRTSWebUSB(!1,!1),await this.setDTRWebUSB(!1),await this.sleep(200)}async hardResetClassicLongDelayWebUSB(){await this.setDTRWebUSB(!1),await this.setRTSWebUSB(!0),await this.sleep(500),await this.setDTRWebUSB(!0),await this.setRTSWebUSB(!1),await this.sleep(200),await this.setDTRWebUSB(!1),await this.sleep(500)}async hardResetClassicShortDelayWebUSB(){await this.setDTRWebUSB(!1),await this.setRTSWebUSB(!0),await this.sleep(50),await this.setDTRWebUSB(!0),await this.setRTSWebUSB(!1),await this.sleep(25),await this.setDTRWebUSB(!1),await this.sleep(100)}async hardResetInvertedWebUSB(){await this.setDTRWebUSB(!0),await this.setRTSWebUSB(!1),await this.sleep(100),await this.setDTRWebUSB(!1),await this.setRTSWebUSB(!0),await this.sleep(50),await this.setDTRWebUSB(!0),await this.sleep(200)}async hardResetInvertedDTRWebUSB(){await this.setDTRWebUSB(!0),await this.setRTSWebUSB(!0),await this.sleep(100),await this.setDTRWebUSB(!1),await this.setRTSWebUSB(!1),await this.sleep(50),await this.setDTRWebUSB(!0),await this.sleep(200)}async hardResetInvertedRTSWebUSB(){await this.setDTRWebUSB(!1),await this.setRTSWebUSB(!1),await this.sleep(100),await this.setDTRWebUSB(!0),await this.setRTSWebUSB(!0),await this.sleep(50),await this.setDTRWebUSB(!1),await this.sleep(200)}isWebUSB(){return!0===this.port.isWebUSB}async connectWithResetStrategies(){const t=this.port.getInfo(),e=4097===t.usbProductId,i=12346===t.usbVendorId,a=[],r=this;if(this.isWebUSB()){const s=!e&&!i,n=4292===t.usbVendorId,h=6790===t.usbVendorId,o=12346===t.usbVendorId&&2===t.usbProductId;(e||i)&&(o?(a.push({name:"USB-JTAG/Serial (WebUSB) - ESP32-S2",fn:async()=>await r.hardResetUSBJTAGSerialWebUSB()}),a.push({name:"USB-JTAG/Serial Inverted DTR (WebUSB) - ESP32-S2",fn:async()=>await r.hardResetUSBJTAGSerialInvertedDTRWebUSB()}),a.push({name:"UnixTight (WebUSB) - ESP32-S2 CDC",fn:async()=>await r.hardResetUnixTightWebUSB()}),a.push({name:"Classic (WebUSB) - ESP32-S2 CDC",fn:async()=>await r.hardResetClassicWebUSB()})):(a.push({name:"USB-JTAG/Serial Inverted DTR (WebUSB)",fn:async()=>await r.hardResetUSBJTAGSerialInvertedDTRWebUSB()}),a.push({name:"USB-JTAG/Serial (WebUSB)",fn:async()=>await r.hardResetUSBJTAGSerialWebUSB()}),a.push({name:"Inverted DTR Classic (WebUSB)",fn:async()=>await r.hardResetInvertedDTRWebUSB()}))),s&&(h?(a.push({name:"UnixTight (WebUSB) - CH34x",fn:async()=>await r.hardResetUnixTightWebUSB()}),a.push({name:"Classic (WebUSB) - CH34x",fn:async()=>await r.hardResetClassicWebUSB()}),a.push({name:"Inverted Both (WebUSB) - CH34x",fn:async()=>await r.hardResetInvertedWebUSB()}),a.push({name:"Inverted RTS (WebUSB) - CH34x",fn:async()=>await r.hardResetInvertedRTSWebUSB()}),a.push({name:"Inverted DTR (WebUSB) - CH34x",fn:async()=>await r.hardResetInvertedDTRWebUSB()})):n?(a.push({name:"UnixTight (WebUSB) - CP2102",fn:async()=>await r.hardResetUnixTightWebUSB()}),a.push({name:"Classic (WebUSB) - CP2102",fn:async()=>await r.hardResetClassicWebUSB()}),a.push({name:"Inverted Both (WebUSB) - CP2102",fn:async()=>await r.hardResetInvertedWebUSB()}),a.push({name:"Inverted RTS (WebUSB) - CP2102",fn:async()=>await r.hardResetInvertedRTSWebUSB()}),a.push({name:"Inverted DTR (WebUSB) - CP2102",fn:async()=>await r.hardResetInvertedDTRWebUSB()})):(a.push({name:"UnixTight (WebUSB)",fn:async()=>await r.hardResetUnixTightWebUSB()}),a.push({name:"Classic (WebUSB)",fn:async function(){return await r.hardResetClassicWebUSB()}}),a.push({name:"Inverted Both (WebUSB)",fn:async function(){return await r.hardResetInvertedWebUSB()}}),a.push({name:"Inverted RTS (WebUSB)",fn:async function(){return await r.hardResetInvertedRTSWebUSB()}}),a.push({name:"Inverted DTR (WebUSB)",fn:async function(){return await r.hardResetInvertedDTRWebUSB()}}))),n||o||(6790!==t.usbVendorId&&a.push({name:"Classic (WebUSB)",fn:async function(){return await r.hardResetClassicWebUSB()}}),a.push({name:"UnixTight (WebUSB)",fn:async function(){return await r.hardResetUnixTightWebUSB()}}),a.push({name:"Classic Long Delay (WebUSB)",fn:async function(){return await r.hardResetClassicLongDelayWebUSB()}}),a.push({name:"Classic Short Delay (WebUSB)",fn:async function(){return await r.hardResetClassicShortDelayWebUSB()}}),e||i||a.push({name:"USB-JTAG/Serial fallback (WebUSB)",fn:async function(){return await r.hardResetUSBJTAGSerialWebUSB()}}))}else(e||i)&&a.push({name:"USB-JTAG/Serial",fn:async function(){return await r.hardResetUSBJTAGSerial()}}),a.push({name:"Classic",fn:async function(){return await r.hardResetClassic()}}),e||i||a.push({name:"USB-JTAG/Serial (fallback)",fn:async function(){return await r.hardResetUSBJTAGSerial()}});let n=null;for(const t of a)try{if(!this.connected||!this.port.writable){this.logger.log(`Port disconnected, skipping ${t.name} reset`);continue}this._abandonCurrentOperation=!1,await t.fn();if(await this.syncWithTimeout(3e3))return void this.logger.log(`Connected successfully with ${t.name} reset.`);throw new Error("Sync timeout or abandoned")}catch(e){if(n=e,this.logger.log(`${t.name} reset failed: ${e.message}`),this._abandonCurrentOperation=!0,await s(100),!this.connected||!this.port.writable){this.logger.log("Port disconnected during reset attempt");break}this._clearInputBuffer(),await this.drainInputBuffer(200),await this.flushSerialBuffers()}throw this._abandonCurrentOperation=!1,new Error(`Couldn't sync to ESP. Try resetting manually. Last error: ${null==n?void 0:n.message}`)}async hardReset(t=!1){t?4097===this.port.getInfo().usbProductId?(await this.hardResetUSBJTAGSerial(),this.logger.log("USB-JTAG/Serial reset.")):this.isWebUSB()?(await this.hardResetClassicWebUSB(),this.logger.log("Classic reset (WebUSB/Android).")):(await this.hardResetClassic(),this.logger.log("Classic reset.")):this.isWebUSB()?(await this.setRTSWebUSB(!0),await this.sleep(200),await this.setRTSWebUSB(!1),await this.sleep(200),this.logger.log("Hard reset (WebUSB).")):(await this.setRTS(!0),await this.sleep(100),await this.setRTS(!1),this.logger.log("Hard reset.")),await new Promise(t=>setTimeout(t,1e3))}macAddr(){const t=new Array(6).fill(0),e=this._efuses[0],i=this._efuses[1],a=this._efuses[2],s=this._efuses[3];let r;if(this.chipFamily==d){if(0!=s)r=[s>>16&255,s>>8&255,255&s];else if(i>>16&255){if(1!=(i>>16&255))throw new Error("Couldnt determine OUI");r=[172,208,116]}else r=[24,254,52];t[0]=r[0],t[1]=r[1],t[2]=r[2],t[3]=i>>8&255,t[4]=255&i,t[5]=e>>24&255}else if(this.chipFamily==u)t[0]=a>>8&255,t[1]=255&a,t[2]=i>>24&255,t[3]=i>>16&255,t[4]=i>>8&255,t[5]=255&i;else{if(this.chipFamily!=c&&this.chipFamily!=_&&this.chipFamily!=f&&this.chipFamily!=g&&this.chipFamily!=p&&this.chipFamily!=w&&this.chipFamily!=m&&this.chipFamily!=b&&this.chipFamily!=S&&this.chipFamily!=y&&this.chipFamily!=B&&this.chipFamily!=v)throw new Error("Unknown chip family");t[0]=i>>8&255,t[1]=255&i,t[2]=e>>24&255,t[3]=e>>16&255,t[4]=e>>8&255,t[5]=255&e}return t}async readRegister(t){this.debug&&this.logger.debug("Reading from Register "+a(t,8));const e=gi("<I",t);await this.sendCommand(10,e);const[i]=await this.getResponse(10);return i}async checkCommand(t,e,i=0,s=3e3){const r=async()=>{s=Math.min(s,X),await this.sendCommand(t,e,i);const[r,n]=await this.getResponse(t,s);if(null===n)throw new Error("Didn't get enough status bytes");let h=n,o=0;if(this.IS_STUB||this.chipFamily==d?o=2:[u,c,_,f,g,p,w,m,b,S,y,B,v].includes(this.chipFamily)||20===t?o=4:[2,4].includes(h.length)?o=h.length:(o=2,this.logger.debug(`Unknown chip family, defaulting to 2-byte status (opcode: ${a(t)}, data.length: ${h.length})`)),h.length<o)throw new Error("Didn't get enough status bytes");const l=h.slice(-o,h.length);if(h=h.slice(0,-o),this.debug&&(this.logger.debug("status",l),this.logger.debug("value",r),this.logger.debug("data",h)),1==l[0])throw 5==l[1]?(await this.drainInputBuffer(200),new Error("Invalid (unsupported) command "+a(t))):new Error("Command failure error code "+a(l[1]));return[r,h]};return this._commandLock=this._commandLock.then(r,r),this._commandLock}async sendCommand(e,i,a=0){const s=t([...gi("<BBHI",0,e,i.length,a),...i]);this.debug&&this.logger.debug(`Writing ${s.length} byte${1==s.length?"":"s"}:`,s),await this.writeToStream(s)}async readPacket(t){let e=null,r=!1;if(this._isCDCDevice){const n=Date.now();for(;;){if(this._abandonCurrentOperation)throw new rt("Operation abandoned (reset strategy timeout)");if(Date.now()-n>t){throw new rt("Timed out waiting for packet "+(null===e?"header":"content"))}if(0!==this._inputBufferAvailable)for(;this._inputBufferAvailable>0;){if(Date.now()-n>t){throw new rt("Timed out waiting for packet "+(null===e?"header":"content"))}const s=this._readByte();if(null===e){if(192!=s)throw this.debug&&(this.logger.debug("Read invalid data: "+a(s)),this.logger.debug("Remaining data in serial buffer: "+i(this._inputBuffer))),new rt("Invalid head of packet ("+a(s)+")");e=[]}else if(r)if(r=!1,220==s)e.push(192);else{if(221!=s)throw this.debug&&(this.logger.debug("Read invalid data: "+a(s)),this.logger.debug("Remaining data in serial buffer: "+i(this._inputBuffer))),new rt("Invalid SLIP escape (0xdb, "+a(s)+")");e.push(219)}else if(219==s)r=!0;else{if(192==s)return this.debug&&this.logger.debug("Received full packet: "+i(e)),this._compactInputBuffer(),e;e.push(s)}}else await s(1)}}else{let n=[];for(;;){if(this._abandonCurrentOperation)throw new rt("Operation abandoned (reset strategy timeout)");const h=Date.now();for(n=[];Date.now()-h<t;){if(this._inputBufferAvailable>0){n.push(this._readByte());break}await s(1)}if(0==n.length){throw new rt("Timed out waiting for packet "+(null===e?"header":"content"))}this.debug&&this.logger.debug("Read "+n.length+" bytes: "+i(n));for(const t of n)if(null===e){if(192!=t)throw this.debug&&(this.logger.debug("Read invalid data: "+a(t)),this.logger.debug("Remaining data in serial buffer: "+i(this._inputBuffer))),new rt("Invalid head of packet ("+a(t)+")");e=[]}else if(r)if(r=!1,220==t)e.push(192);else{if(221!=t)throw this.debug&&(this.logger.debug("Read invalid data: "+a(t)),this.logger.debug("Remaining data in serial buffer: "+i(this._inputBuffer))),new rt("Invalid SLIP escape (0xdb, "+a(t)+")");e.push(219)}else if(219==t)r=!0;else{if(192==t)return this.debug&&this.logger.debug("Received full packet: "+i(e)),this._compactInputBuffer(),e;e.push(t)}}}}async getResponse(t,e=3e3){for(let i=0;i<100;i++){const i=await this.readPacket(e);if(i.length<8)continue;const[s,r,,n]=pi("<BBHI",i.slice(0,8));if(1!=s)continue;const h=i.slice(8);if(null==t||r==t)return[n,h];if(0!=h[0]&&5==h[1])throw await this.drainInputBuffer(200),new Error(`Invalid (unsupported) command ${a(t)}`)}throw new Error("Response doesn't match request")}checksum(t,e=239){for(const i of t)e^=i;return e}async setBaudrate(t){if(this.chipFamily==d)throw new Error("Changing baud rate is not supported on the ESP8266");try{const e=gi("<II",t,this.IS_STUB?h:0);await this.checkCommand(15,e)}catch(e){throw this.logger.error(`Baudrate change error: ${e}`),new Error(`Unable to change the baud rate to ${t}: No response from set baud rate command.`)}this._parent?await this._parent.reconfigurePort(t):await this.reconfigurePort(t),await s(Q),this._parent?this._parent._currentBaudRate=t:this._currentBaudRate=t;const e=this._parent?this._parent._maxUSBSerialBaudrate:this._maxUSBSerialBaudrate;e&&t>e&&(this.logger.log(`⚠️ WARNING: Baudrate ${t} exceeds USB-Serial chip limit (${e})!`),this.logger.log("⚠️ This may cause data corruption or connection failures!")),this.logger.log(`Changed baud rate to ${t}`)}async reconfigurePort(t){var e;this._isReconfiguring=!0;try{try{await this._writeChain}catch(t){this.logger.debug(`Pending write error during reconfigure: ${t}`)}if(this.isWebUSB()){const e=this.port.getInfo(),i=6790===e.usbVendorId&&21971===e.usbProductId;if(!i&&"function"==typeof this.port.setBaudRate)return await this.port.setBaudRate(t),void await s(100)}if(this._writer){try{this._writer.releaseLock()}catch(t){this.logger.debug(`Writer release error during reconfigure: ${t}`)}this._writer=void 0}await(null===(e=this._reader)||void 0===e?void 0:e.cancel()),await this.port.close(),await this.port.open({baudRate:t}),await this.flushSerialBuffers(),this.readLoop()}catch(e){throw this.logger.error(`Reconfigure port error: ${e}`),new Error(`Unable to change the baud rate to ${t}: ${e}`)}finally{this._isReconfiguring=!1}}async syncWithTimeout(t){const e=Date.now();for(let i=0;i<5;i++){if(Date.now()-e>t)return!1;if(this._abandonCurrentOperation)return!1;this._clearInputBuffer();try{if(await this._sync())return await s(Q),!0}catch(t){if(this._abandonCurrentOperation)return!1}await s(Q)}return!1}async sync(){for(let t=0;t<5;t++){this._clearInputBuffer();if(await this._sync())return await s(Q),!0;await s(Q)}throw new Error("Couldn't sync to ESP. Try resetting.")}async _sync(){await this.sendCommand(8,l);for(let t=0;t<8;t++)try{const[,t]=await this.getResponse(8,Q);if(t.length>1&&0==t[0]&&0==t[1])return!0}catch(e){this.debug&&this.logger.debug(`Sync attempt ${t+1} failed: ${e}`)}return!1}getFlashWriteSize(){return this.IS_STUB?16384:1024}async flashData(t,e,i=0,s=!1){if(t.byteLength>=8){const e=Array.from(new Uint8Array(t,0,4)),i=e[0],s=e[2],r=e[3];this.logger.log(`Image header, Magic=${a(i)}, FlashMode=${a(s)}, FlashSizeFreq=${a(r)}`)}const r=t.byteLength;let n,h=0,o=K;s?(n=_i(new Uint8Array(t),{level:9}).buffer,h=n.byteLength,this.logger.log(`Writing data with filesize: ${r}. Compressed Size: ${h}`),o=await this.flashDeflBegin(r,h,i)):(this.logger.log(`Writing data with filesize: ${r}`),n=t,await this.flashBegin(r,i));let l=[],d=0,u=0,c=0;const _=Date.now(),f=this.getFlashWriteSize(),g=s?h:r;for(;g-c>0;)this.debug&&this.logger.log(`Writing at ${a(i+d*f,8)} `),g-c>=f?l=Array.from(new Uint8Array(n,c,f)):(l=Array.from(new Uint8Array(n,c,g-c)),s||(l=l.concat(new Array(f-l.length).fill(255)))),s?await this.flashDeflBlock(l,d,o):await this.flashBlock(l,d),d+=1,u+=s?Math.round(l.length*r/h):l.length,c+=f,e(Math.min(u,r),r);this.logger.log("Took "+(Date.now()-_)+"ms to write "+g+" bytes"),this.IS_STUB&&(await this.flashBegin(0,0),s?await this.flashDeflFinish():await this.flashFinish())}async flashBlock(t,e,i=3e3){await this.checkCommand(3,gi("<IIII",t.length,e,0,0).concat(t),this.checksum(t),i)}async flashDeflBlock(t,e,i=3e3){await this.checkCommand(17,gi("<IIII",t.length,e,0,0).concat(t),this.checksum(t),i)}async flashBegin(t=0,e=0,i=!1){let s;await this.flushSerialBuffers();const r=this.getFlashWriteSize();!this.IS_STUB&&[u,c,_,f,g,p,w,m,b,S,y,B,v].includes(this.chipFamily)&&await this.checkCommand(13,new Array(8).fill(0));const n=Math.floor((t+r-1)/r);s=this.chipFamily==d?this.getEraseSize(e,t):t;const h=this.IS_STUB?K:at(tt,t),o=Date.now();let l=gi("<IIII",s,n,r,e);return this.chipFamily!=u&&this.chipFamily!=c&&this.chipFamily!=_&&this.chipFamily!=f&&this.chipFamily!=g&&this.chipFamily!=p&&this.chipFamily!=w&&this.chipFamily!=m&&this.chipFamily!=b&&this.chipFamily!=S&&this.chipFamily!=y&&this.chipFamily!=B&&this.chipFamily!=v||(l=l.concat(gi("<I",i?1:0))),this.logger.log("Erase size "+s+", blocks "+n+", block size "+a(r,4)+", offset "+a(e,4)+", encrypted "+(i?"yes":"no")),await this.checkCommand(2,l,0,h),0==t||this.IS_STUB||this.logger.log("Took "+(Date.now()-o)+"ms to erase "+n+" bytes"),n}async flashDeflBegin(t=0,e=0,i=0){const a=this.getFlashWriteSize(),s=Math.floor((e+a-1)/a),r=Math.floor((t+a-1)/a);let n=0,h=0;this.IS_STUB?(n=t,h=at(tt,n)):(n=r*a,h=K);const o=gi("<IIII",n,s,a,i);return await this.checkCommand(16,o,0,h),h}async flashFinish(){const t=gi("<I",1);await this.checkCommand(4,t)}async flashDeflFinish(){const t=gi("<I",1);await this.checkCommand(18,t)}getBootloaderOffset(){return st(this.getChipFamily()).flashOffs}async flashId(){return await this.runSpiFlashCommand(159,[],24)}getChipFamily(){return this._parent?this._parent.chipFamily:this.chipFamily}async writeRegister(t,e,i=4294967295,a=0,s=0){let r=gi("<IIII",t,e,i,a);s>0&&(r=r.concat(gi("<IIII",st(this.getChipFamily()).uartDateReg,0,0,s))),await this.checkCommand(9,r)}async setDataLengths(t,e,i){if(-1!=t.mosiDlenOffs){const a=t.regBase+t.mosiDlenOffs,s=t.regBase+t.misoDlenOffs;e>0&&await this.writeRegister(a,e-1),i>0&&await this.writeRegister(s,i-1)}else{const a=t.regBase+t.usr1Offs,s=(0==i?0:i-1)<<8|(0==e?0:e-1)<<17;await this.writeRegister(a,s)}}async waitDone(t,e){for(let i=0;i<10;i++){if(0==(await this.readRegister(t)&e))return}throw Error("SPI command did not complete in time")}async runSpiFlashCommand(t,e,i=0){const s=st(this.getChipFamily()),r=s.regBase,n=r,h=r+s.usrOffs,o=r+s.usr2Offs,l=r+s.w0Offs,d=1<<18;if(i>32)throw new Error("Reading more than 32 bits back from a SPI flash operation is unsupported");if(e.length>64)throw new Error("Writing more than 64 bytes of data with one SPI command is unsupported");const u=8*e.length,c=await this.readRegister(h),_=await this.readRegister(o);let f=1<<31;if(i>0&&(f|=268435456),u>0&&(f|=134217728),await this.setDataLengths(s,u,i),await this.writeRegister(h,f),await this.writeRegister(o,7<<28|t),0==u)await this.writeRegister(l,0);else{const t=(4-e.length%4)%4;e=e.concat(new Array(t).fill(0));const i=pi("I".repeat(Math.floor(e.length/4)),e);let s=l;this.logger.debug(`Words Length: ${i.length}`);for(const t of i)this.logger.debug(`Writing word ${a(t)} to register offset ${a(s)}`),await this.writeRegister(s,t),s+=4}await this.writeRegister(n,d),await this.waitDone(n,d);const g=await this.readRegister(l);return await this.writeRegister(h,c),await this.writeRegister(o,_),g}async detectFlashSize(){this.logger.log("Detecting Flash Size");const t=await this.flashId(),e=255&t,i=t>>16&255;this.logger.log(`FlashId: ${a(t)}`),this.logger.log(`Flash Manufacturer: ${e.toString(16)}`),this.logger.log(`Flash Device: ${(t>>8&255).toString(16)}${i.toString(16)}`),this.flashSize=r[i],this.logger.log(`Auto-detected Flash size: ${this.flashSize}`)}getEraseSize(t,e){const i=n,a=Math.floor((e+i-1)/i);let s=16-Math.floor(t/i)%16;return a<s&&(s=a),a<2*s?Math.floor((a+1)/2*i):(a-s)*i}async memBegin(t,e,i,a){return await this.checkCommand(5,gi("<IIII",t,e,i,a))}async memBlock(t,e){return await this.checkCommand(7,gi("<IIII",t.length,e,0,0).concat(t),this.checksum(t))}async memFinish(t=0){const e=this.IS_STUB?K:500,i=gi("<II",0==t?1:0,t);return await this.checkCommand(6,i,0,e)}async runStub(t=!1){const e=await nt(this.chipFamily,this.chipRevision);if(null===e)return this.logger.log(`Stub flasher is not yet supported on ${this.chipName}, using ROM loader`),this;const i=2048;this.logger.log("Uploading stub...");for(const t of["text","data"]){const a=e[t],s=e[`${t}_start`],r=a.length,n=Math.floor((r+i-1)/i);await this.memBegin(r,n,i,s);for(const t of Array(n).keys()){const e=t*i;let s=e+i;s>r&&(s=r),await this.memBlock(a.slice(e,s),t)}}await this.memFinish(e.entry);const a=await this.readPacket(500),s=String.fromCharCode(...a);if("OHAI"!=s)throw new Error("Failed to start stub. Unexpected response: "+s);this.logger.log("Stub is now running...");const r=new mi(this.port,this.logger,this);return t||await r.detectFlashSize(),r}get _writer(){return this._parent?this._parent._writer:this.__writer}set _writer(t){this._parent?this._parent._writer=t:this.__writer=t}get _writeChain(){return this._parent?this._parent._writeChain:this.__writeChain}set _writeChain(t){this._parent?this._parent._writeChain=t:this.__writeChain=t}async writeToStream(t){if(this.port.writable){if(this._isReconfiguring)throw new Error("Cannot write during port reconfiguration");this._writeChain=this._writeChain.then(async()=>{if(!this.port.writable)throw new Error("Port became unavailable during write");if(!this._writer)try{this._writer=this.port.writable.getWriter()}catch(t){throw this.logger.error(`Failed to get writer: ${t}`),t}await this._writer.write(new Uint8Array(t))},async()=>{if(this.logger.debug("Previous write failed, attempting recovery for current write"),!this.port.writable)throw new Error("Port became unavailable during write");if(!this._writer)try{this._writer=this.port.writable.getWriter()}catch(t){throw this.logger.debug(`Failed to get writer in recovery: ${t}`),new Error("Cannot acquire writer lock")}await this._writer.write(new Uint8Array(t))}).catch(t=>{if(this.logger.error(`Write error: ${t}`),this._writer){try{this._writer.releaseLock()}catch{}this._writer=void 0}throw t}),await this._writeChain}else this.logger.debug("Port writable stream not available, skipping write")}async disconnect(){if(this._parent)await this._parent.disconnect();else if(this.port.writable){try{await this._writeChain}catch(t){this.logger.debug(`Pending write error during disconnect: ${t}`)}if(this._writer){try{await this._writer.close(),this._writer.releaseLock()}catch(t){this.logger.debug(`Writer close/release error: ${t}`)}this._writer=void 0}else try{const t=this.port.writable.getWriter();await t.close(),t.releaseLock()}catch(t){this.logger.debug(`Direct writer close error: ${t}`)}await new Promise(t=>{if(!this._reader)return void t(void 0);const e=setTimeout(()=>{this.logger.debug("Disconnect timeout - forcing resolution"),t(void 0)},1e3);this.addEventListener("disconnect",()=>{clearTimeout(e),t(void 0)},{once:!0});try{this._reader.cancel()}catch(i){this.logger.debug(`Reader cancel error: ${i}`),clearTimeout(e),t(void 0)}}),this.connected=!1;try{await this.port.close(),this.logger.debug("Port closed successfully")}catch(t){this.logger.debug(`Port close error: ${t}`)}}else this.logger.debug("Port already closed, skipping disconnect")}async reconnect(){if(this._parent)await this._parent.reconnect();else try{this.logger.log("Reconnecting serial port..."),this.connected=!1,this.__inputBuffer=[],this.__inputBufferReadIndex=0;try{await this._writeChain}catch(t){this.logger.debug(`Pending write error during reconnect: ${t}`)}if(this._isReconfiguring=!0,this._writer){try{this._writer.releaseLock()}catch(t){this.logger.debug(`Writer release error during reconnect: ${t}`)}this._writer=void 0}if(this._reader){try{await this._reader.cancel()}catch(t){this.logger.debug(`Reader cancel error: ${t}`)}this._reader=void 0}try{await this.port.close(),this.logger.log("Port closed")}catch(t){this.logger.debug(`Port close error: ${t}`)}this.logger.debug("Opening port...");try{await this.port.open({baudRate:h}),this.connected=!0}catch(t){throw new Error(`Failed to open port: ${t}`)}if(!this.port.readable||!this.port.writable)throw new Error(`Port streams not available after open (readable: ${!!this.port.readable}, writable: ${!!this.port.writable})`);this._isReconfiguring=!1;const t=this.chipFamily,e=this.chipName,i=this.chipRevision,a=this.chipVariant,s=this.flashSize;if(await this.hardReset(!0),this._parent||(this.__inputBuffer=[],this.__inputBufferReadIndex=0,this.__totalBytesRead=0,this.readLoop()),await this.flushSerialBuffers(),await this.sync(),this.chipFamily=t,this.chipName=e,this.chipRevision=i,this.chipVariant=a,this.flashSize=s,this.logger.debug(`Reconnect complete (chip: ${this.chipName})`),!this.port.writable||!this.port.readable)throw new Error("Port not ready after reconnect");const r=await this.runStub(!0);if(this.logger.debug("Stub loaded"),this._currentBaudRate!==h&&(await r.setBaudrate(this._currentBaudRate),!this.port.writable||!this.port.readable))throw new Error(`Port not ready after baudrate change (readable: ${!!this.port.readable}, writable: ${!!this.port.writable})`);this.IS_STUB=!0,this.logger.debug("Reconnection successful")}catch(t){throw this._isReconfiguring=!1,t}}async drainInputBuffer(t=200){await s(t);let e=0;const i=Date.now();for(;e<112&&Date.now()-i<100;)if(this._inputBufferAvailable>0){void 0!==this._readByte()&&e++}else await s(1);e>0&&this.logger.debug(`Drained ${e} bytes from input buffer`),this._parent||(this.__inputBuffer=[],this.__inputBufferReadIndex=0)}async flushSerialBuffers(){this._parent||(this.__inputBuffer=[],this.__inputBufferReadIndex=0),await s(Q),this._parent||(this.__inputBuffer=[],this.__inputBufferReadIndex=0),this.logger.debug("Serial buffers flushed")}async readFlash(e,i,a){if(!this.IS_STUB)throw new Error("Reading flash is only supported in stub mode. Please run runStub() first.");let r;await this.flushSerialBuffers(),this.logger.log(`Reading ${i} bytes from flash at address 0x${e.toString(16)}...`),this.isWebUSB()&&(this._isCDCDevice?(this._adaptiveBlockMultiplier=8,this._adaptiveMaxInFlightMultiplier=8,this._consecutiveSuccessfulChunks=0,this.logger.debug(`CDC device - Initialized: blockMultiplier=${this._adaptiveBlockMultiplier}, maxInFlightMultiplier=${this._adaptiveMaxInFlightMultiplier}`)):(this._adaptiveBlockMultiplier=1,this._adaptiveMaxInFlightMultiplier=1,this._consecutiveSuccessfulChunks=0,this.logger.debug("Non-CDC device - Fixed values: blockSize=31, maxInFlight=31"))),r=this.isWebUSB()?16384:262144;let n=new Uint8Array(0),h=e,o=i;for(;o>0;){const e=Math.min(r,o);let l=!1,d=0;const u=5;let c=!1;for(;!l&&d<=u;){let i=new Uint8Array(0),a=0;try{let r,o;if(0===d&&this.logger.debug(`Reading chunk at 0x${h.toString(16)}, size: 0x${e.toString(16)}`),this.isWebUSB()){const t=this.port.maxTransferSize||64,e=Math.floor((t-2)/2);r=e*this._adaptiveBlockMultiplier,o=e*this._adaptiveMaxInFlightMultiplier}else{const t=63;r=65*t,o=130*t}const u=gi("<IIII",h,e,r,o),[c]=await this.checkCommand(210,u);if(0!=c)throw new Error("Failed to read memory: "+c);for(;i.length<e;){let r;try{r=await this.readPacket(100)}catch(t){if(t instanceof rt){this.logger.debug(`SLIP read error at ${i.length} bytes: ${t.message}`);try{const t=[192,192];await this.writeToStream(t),this.logger.debug("Sent abort frame to stub"),await s(50)}catch(t){this.logger.debug(`Abort frame error: ${t}`)}if(await this.drainInputBuffer(200),i.length>=e)break}throw t}if(r&&r.length>0){const s=new Uint8Array(r),n=new Uint8Array(i.length+s.length);n.set(i),n.set(s,i.length),i=n;if(i.length>=e||i.length>=a+o){const e=gi("<I",i.length),s=t(e);await this.writeToStream(s),a=i.length}}}const _=new Uint8Array(n.length+i.length);if(_.set(n),_.set(i,n.length),n=_,l=!0,this.isWebUSB()&&this._isCDCDevice&&0===d&&(this._consecutiveSuccessfulChunks++,this._consecutiveSuccessfulChunks>=2)){const t=this.port.maxTransferSize||64,e=Math.floor((t-2)/2),i=8,a=8;let s=!1;if(this._adaptiveBlockMultiplier<i?(this._adaptiveBlockMultiplier=Math.min(2*this._adaptiveBlockMultiplier,i),s=!0):this._adaptiveMaxInFlightMultiplier<a&&(this._adaptiveMaxInFlightMultiplier=Math.min(2*this._adaptiveMaxInFlightMultiplier,a),s=!0),s){const t=e*this._adaptiveBlockMultiplier,i=e*this._adaptiveMaxInFlightMultiplier;this.logger.debug(`Speed increased: blockSize=${t}, maxInFlight=${i}`),this._lastAdaptiveAdjustment=Date.now()}this._consecutiveSuccessfulChunks=0}}catch(t){if(d++,this.isWebUSB()&&this._isCDCDevice&&1===d)if(this._adaptiveBlockMultiplier>1||this._adaptiveMaxInFlightMultiplier>1){this._adaptiveBlockMultiplier=1,this._adaptiveMaxInFlightMultiplier=1,this._consecutiveSuccessfulChunks=0;const t=this.port.maxTransferSize||64,e=Math.floor((t-2)/2),i=e*this._adaptiveBlockMultiplier,a=e*this._adaptiveMaxInFlightMultiplier;this.logger.debug(`Error at higher speed - reduced to minimum: blockSize=${i}, maxInFlight=${a}`)}else this.logger.debug("Error at minimum speed (blockSize=31, maxInFlight=31) - not a speed issue");if(!(t instanceof rt))throw t;if(d<=u){this.logger.log(`${t.message} at 0x${h.toString(16)}. Draining buffer and retrying (attempt ${d}/${u})...`);try{await this.drainInputBuffer(200),await this.flushSerialBuffers(),await s(Q)}catch(t){this.logger.debug(`Buffer drain error: ${t}`)}}else{if(c)throw new Error(`Failed to read chunk at 0x${h.toString(16)} after ${u} retries and recovery attempt`);c=!0,this.logger.log(`All retries exhausted at 0x${h.toString(16)}. Attempting recovery (close and reopen port)...`);try{await this.reconnect(),this.logger.log("Deep recovery successful. Resuming read from current position..."),d=0;continue}catch(t){throw new Error(`Failed to read chunk at 0x${h.toString(16)} after ${u} retries and recovery failed: ${t}`)}}}}a&&a(new Uint8Array(e),n.length,i),h+=e,o-=e,this.logger.debug(`Total progress: 0x${n.length.toString(16)} from 0x${i.toString(16)} bytes`)}return n}}class mi extends wi{constructor(){super(...arguments),this.IS_STUB=!0}async memBegin(t,e,i,s){const r=await nt(this.chipFamily,this.chipRevision);if(null===r)return[0,[]];const n=s,h=s+t;this.logger.debug(`Load range: ${a(n,8)}-${a(h,8)}`),this.logger.debug(`Stub data: ${a(r.data_start,8)}, len: ${r.data.length}, text: ${a(r.text_start,8)}, len: ${r.text.length}`);for(const[t,e]of[[r.data_start,r.data_start+r.data.length],[r.text_start,r.text_start+r.text.length]])if(n<e&&h>t)throw new Error("Software loader is resident at "+a(t,8)+"-"+a(e,8)+". Can't load binary at overlapping address range "+a(n,8)+"-"+a(h,8)+". Try changing the binary loading address.");return[0,[]]}async eraseFlash(){await this.checkCommand(208,[],0,Y)}async eraseRegion(t,e){if(t<0)throw new Error(`Invalid offset: ${t} (must be non-negative)`);if(e<0)throw new Error(`Invalid size: ${e} (must be non-negative)`);if(0===e)return void this.logger.log("eraseRegion: size is 0, skipping erase");if(t%n!==0)throw new Error(`Offset ${t} (0x${t.toString(16)}) is not aligned to flash sector size 4096 (0x${n.toString(16)})`);if(e%n!==0)throw new Error(`Size ${e} (0x${e.toString(16)}) is not aligned to flash sector size 4096 (0x${n.toString(16)})`);const i=4294967295;if(t>i)throw new Error(`Offset ${t} exceeds maximum value 4294967295`);if(e>i)throw new Error(`Size ${e} exceeds maximum value 4294967295`);if(t+e>i)throw new Error(`Region end (offset + size = ${t+e}) exceeds maximum addressable range 4294967295`);const a=at(tt,e),s=gi("<II",t,e);await this.checkCommand(209,s,0,a)}}const bi=async t=>{let e;const i=globalThis.requestSerialPort;if("function"==typeof i)e=await i();else{if(!navigator.serial)throw new Error("Web Serial API is not supported in this browser. Please use Chrome, Edge, or Opera on desktop, or Chrome on Android. Note: The page must be served over HTTPS or localhost.");e=await navigator.serial.requestPort()}return e.readable&&e.writable||await e.open({baudRate:h}),new wi(e,t)},Si=async(t,e)=>{if(!t)throw new Error("Port is required");return t.readable&&t.writable||await t.open({baudRate:h}),new wi(t,e)};export{Y as CHIP_ERASE_TIMEOUT,u as CHIP_FAMILY_ESP32,f as CHIP_FAMILY_ESP32C2,g as CHIP_FAMILY_ESP32C3,p as CHIP_FAMILY_ESP32C5,w as CHIP_FAMILY_ESP32C6,m as CHIP_FAMILY_ESP32C61,b as CHIP_FAMILY_ESP32H2,y as CHIP_FAMILY_ESP32H21,S as CHIP_FAMILY_ESP32H4,B as CHIP_FAMILY_ESP32P4,c as CHIP_FAMILY_ESP32S2,_ as CHIP_FAMILY_ESP32S3,v as CHIP_FAMILY_ESP32S31,d as CHIP_FAMILY_ESP8266,K as DEFAULT_TIMEOUT,tt as ERASE_REGION_TIMEOUT_PER_MB,wi as ESPLoader,P as ESP_CHANGE_BAUDRATE,Z as ESP_CHECKSUM_MAGIC,O as ESP_ERASE_FLASH,A as ESP_ERASE_REGION,I as ESP_FLASH_BEGIN,T as ESP_FLASH_DATA,V as ESP_FLASH_DEFL_BEGIN,H as ESP_FLASH_DEFL_DATA,j as ESP_FLASH_DEFL_END,x as ESP_FLASH_END,N as ESP_GET_SECURITY_INFO,D as ESP_MEM_BEGIN,C as ESP_MEM_DATA,k as ESP_MEM_END,q as ESP_RAM_BLOCK,E as ESP_READ_FLASH,W as ESP_READ_REG,M as ESP_SPI_ATTACH,L as ESP_SPI_FLASH_MD5,$ as ESP_SPI_SET_PARAMS,F as ESP_SYNC,z as ESP_WRITE_REG,it as FLASH_READ_TIMEOUT,X as MAX_TIMEOUT,et as MEM_END_ROM_TIMEOUT,G as ROM_INVALID_RECV_MSG,Q as SYNC_TIMEOUT,J as USB_RAM_BLOCK,bi as connect,Si as connectWithPort};
1
+ const t=t=>{let e=[192];for(const i of t)219==i?e=e.concat([219,221]):192==i?e=e.concat([219,220]):e.push(i);return e.push(192),e},e=t=>{const e=[];for(let i=0;i<t.length;i++){const a=t.charCodeAt(i);a<=255&&e.push(a)}return e},i=t=>"["+t.map(t=>a(t)).join(", ")+"]",a=(t,e=2)=>{const i=t.toString(16).toUpperCase();return i.startsWith("-")?"-0x"+i.substring(1).padStart(e,"0"):"0x"+i.padStart(e,"0")},s=t=>new Promise(e=>setTimeout(e,t)),r={18:"256KB",19:"512KB",20:"1MB",21:"2MB",22:"4MB",23:"8MB",24:"16MB",25:"32MB",26:"64MB",27:"128MB",28:"256MB",32:"64MB",33:"128MB",34:"256MB",50:"256KB",51:"512KB",52:"1MB",53:"2MB",54:"4MB",55:"8MB",56:"16MB",57:"32MB",58:"64MB"},n=4096,h=115200,o=1343410176,l=e(" UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU"),d=33382,u=50,c=12882,_=12883,f=12994,g=12995,p=12997,w=12998,m=207969,b=12914,S=12916,y=12917,B=12928,R=12849,v={5:{name:"ESP32-C3",family:g},9:{name:"ESP32-S3",family:_},12:{name:"ESP32-C2",family:f},13:{name:"ESP32-C6",family:w},16:{name:"ESP32-H2",family:b},18:{name:"ESP32-P4",family:B},20:{name:"ESP32-C61",family:m},23:{name:"ESP32-C5",family:p},25:{name:"ESP32-H21",family:y},28:{name:"ESP32-H4",family:S},32:{name:"ESP32-S31",family:R}},U={4293968129:{name:"ESP8266",family:d},15736195:{name:"ESP32",family:u},1990:{name:"ESP32-S2",family:c}},T=2,I=3,D=4,x=5,k=6,C=7,F=8,z=9,W=10,O=208,E=209,A=210,$=11,P=13,M=15,L=19,N=20,Z=239,V=16,H=17,j=18,G=5,J=2048,q=6144,K=3e3,Y=15e4,X=3e5,Q=100,tt=3e4,et=500,it=100,at=(t,e)=>{const i=Math.floor(t*(e/486));return i<K?K:i},st=t=>{switch(t){case u:return{regBase:1072963584,baseFuse:1073061888,macFuse:1073061888,usrOffs:28,usr1Offs:32,usr2Offs:36,mosiDlenOffs:40,misoDlenOffs:44,w0Offs:128,uartDateReg:1610612856,flashOffs:4096};case c:return{regBase:1061167104,baseFuse:1061265408,macFuse:1061265476,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612856,flashOffs:4096};case _:return{regBase:1610620928,usrOffs:24,baseFuse:1610641408,macFuse:1610641476,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612864,flashOffs:0};case d:return{regBase:1610613248,usrOffs:28,baseFuse:1072693328,macFuse:1072693328,usr1Offs:32,usr2Offs:36,mosiDlenOffs:-1,misoDlenOffs:-1,w0Offs:64,uartDateReg:1610612856,flashOffs:0};case f:case g:return{regBase:1610620928,baseFuse:1610647552,macFuse:1610647620,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612860,flashOffs:0};case p:return{regBase:1610625024,baseFuse:1611352064,macFuse:1611352132,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612860,flashOffs:8192};case w:return{regBase:1610625024,baseFuse:1611335680,macFuse:1611335748,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612860,flashOffs:0};case m:return{regBase:1610625024,baseFuse:1611352064,macFuse:1611352132,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612860,flashOffs:0};case b:return{regBase:1610625024,baseFuse:1611335680,macFuse:1611335748,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612860,flashOffs:0};case S:return{regBase:1611239424,baseFuse:1611339776,macFuse:1611339844,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610686588,flashOffs:8192};case y:return{regBase:1610625024,baseFuse:1611350016,macFuse:1611350084,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612860,flashOffs:0};case B:return{regBase:1342754816,baseFuse:o,macFuse:1343410244,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1343004812,flashOffs:8192};case R:return{regBase:542113792,baseFuse:544296960,macFuse:544297028,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:540582028,flashOffs:8192};default:return{regBase:-1,baseFuse:-1,macFuse:-1,usrOffs:-1,usr1Offs:-1,usr2Offs:-1,mosiDlenOffs:-1,misoDlenOffs:-1,w0Offs:-1,uartDateReg:-1,flashOffs:-1}}};class rt extends Error{constructor(t){super(t),this.name="SlipReadError"}}const nt=async(t,i)=>{let a;if(t==S||t==y||t==R)return null;if(t==u)a=await import("./esp32-BRKoi17y.js");else if(t==c)a=await import("./esp32s2-iX3WoDbg.js");else if(t==_)a=await import("./esp32s3-DGwDVIgz.js");else if(t==d)a=await import("./esp8266-CUwxJpGa.js");else if(t==f)a=await import("./esp32c2-Btgr_lwh.js");else if(t==g)a=await import("./esp32c3-CHKfoI8W.js");else if(t==p)a=await import("./esp32c5-BDW4KtLo.js");else if(t==w)a=await import("./esp32c6-il8tTxAG.js");else if(t==m)a=await import("./esp32c61-thKzxBGf.js");else if(t==b)a=await import("./esp32h2-CxoUHv_P.js");else{if(t!=B)return null;a=null!=i&&i>=300?await import("./esp32p4r3-CqI71ojR.js"):await import("./esp32p4-D3jLP-jY.js")}return{...a,text:e(atob(a.text)),data:e(atob(a.data))}};function ht(t){let e=t.length;for(;--e>=0;)t[e]=0}const ot=256,lt=286,dt=30,ut=15,ct=new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]),_t=new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]),ft=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]),gt=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),pt=new Array(576);ht(pt);const wt=new Array(60);ht(wt);const mt=new Array(512);ht(mt);const bt=new Array(256);ht(bt);const St=new Array(29);ht(St);const yt=new Array(dt);function Bt(t,e,i,a,s){this.static_tree=t,this.extra_bits=e,this.extra_base=i,this.elems=a,this.max_length=s,this.has_stree=t&&t.length}let Rt,vt,Ut;function Tt(t,e){this.dyn_tree=t,this.max_code=0,this.stat_desc=e}ht(yt);const It=t=>t<256?mt[t]:mt[256+(t>>>7)],Dt=(t,e)=>{t.pending_buf[t.pending++]=255&e,t.pending_buf[t.pending++]=e>>>8&255},xt=(t,e,i)=>{t.bi_valid>16-i?(t.bi_buf|=e<<t.bi_valid&65535,Dt(t,t.bi_buf),t.bi_buf=e>>16-t.bi_valid,t.bi_valid+=i-16):(t.bi_buf|=e<<t.bi_valid&65535,t.bi_valid+=i)},kt=(t,e,i)=>{xt(t,i[2*e],i[2*e+1])},Ct=(t,e)=>{let i=0;do{i|=1&t,t>>>=1,i<<=1}while(--e>0);return i>>>1},Ft=(t,e,i)=>{const a=new Array(16);let s,r,n=0;for(s=1;s<=ut;s++)n=n+i[s-1]<<1,a[s]=n;for(r=0;r<=e;r++){let e=t[2*r+1];0!==e&&(t[2*r]=Ct(a[e]++,e))}},zt=t=>{let e;for(e=0;e<lt;e++)t.dyn_ltree[2*e]=0;for(e=0;e<dt;e++)t.dyn_dtree[2*e]=0;for(e=0;e<19;e++)t.bl_tree[2*e]=0;t.dyn_ltree[512]=1,t.opt_len=t.static_len=0,t.sym_next=t.matches=0},Wt=t=>{t.bi_valid>8?Dt(t,t.bi_buf):t.bi_valid>0&&(t.pending_buf[t.pending++]=t.bi_buf),t.bi_buf=0,t.bi_valid=0},Ot=(t,e,i,a)=>{const s=2*e,r=2*i;return t[s]<t[r]||t[s]===t[r]&&a[e]<=a[i]},Et=(t,e,i)=>{const a=t.heap[i];let s=i<<1;for(;s<=t.heap_len&&(s<t.heap_len&&Ot(e,t.heap[s+1],t.heap[s],t.depth)&&s++,!Ot(e,a,t.heap[s],t.depth));)t.heap[i]=t.heap[s],i=s,s<<=1;t.heap[i]=a},At=(t,e,i)=>{let a,s,r,n,h=0;if(0!==t.sym_next)do{a=255&t.pending_buf[t.sym_buf+h++],a+=(255&t.pending_buf[t.sym_buf+h++])<<8,s=t.pending_buf[t.sym_buf+h++],0===a?kt(t,s,e):(r=bt[s],kt(t,r+ot+1,e),n=ct[r],0!==n&&(s-=St[r],xt(t,s,n)),a--,r=It(a),kt(t,r,i),n=_t[r],0!==n&&(a-=yt[r],xt(t,a,n)))}while(h<t.sym_next);kt(t,256,e)},$t=(t,e)=>{const i=e.dyn_tree,a=e.stat_desc.static_tree,s=e.stat_desc.has_stree,r=e.stat_desc.elems;let n,h,o,l=-1;for(t.heap_len=0,t.heap_max=573,n=0;n<r;n++)0!==i[2*n]?(t.heap[++t.heap_len]=l=n,t.depth[n]=0):i[2*n+1]=0;for(;t.heap_len<2;)o=t.heap[++t.heap_len]=l<2?++l:0,i[2*o]=1,t.depth[o]=0,t.opt_len--,s&&(t.static_len-=a[2*o+1]);for(e.max_code=l,n=t.heap_len>>1;n>=1;n--)Et(t,i,n);o=r;do{n=t.heap[1],t.heap[1]=t.heap[t.heap_len--],Et(t,i,1),h=t.heap[1],t.heap[--t.heap_max]=n,t.heap[--t.heap_max]=h,i[2*o]=i[2*n]+i[2*h],t.depth[o]=(t.depth[n]>=t.depth[h]?t.depth[n]:t.depth[h])+1,i[2*n+1]=i[2*h+1]=o,t.heap[1]=o++,Et(t,i,1)}while(t.heap_len>=2);t.heap[--t.heap_max]=t.heap[1],((t,e)=>{const i=e.dyn_tree,a=e.max_code,s=e.stat_desc.static_tree,r=e.stat_desc.has_stree,n=e.stat_desc.extra_bits,h=e.stat_desc.extra_base,o=e.stat_desc.max_length;let l,d,u,c,_,f,g=0;for(c=0;c<=ut;c++)t.bl_count[c]=0;for(i[2*t.heap[t.heap_max]+1]=0,l=t.heap_max+1;l<573;l++)d=t.heap[l],c=i[2*i[2*d+1]+1]+1,c>o&&(c=o,g++),i[2*d+1]=c,d>a||(t.bl_count[c]++,_=0,d>=h&&(_=n[d-h]),f=i[2*d],t.opt_len+=f*(c+_),r&&(t.static_len+=f*(s[2*d+1]+_)));if(0!==g){do{for(c=o-1;0===t.bl_count[c];)c--;t.bl_count[c]--,t.bl_count[c+1]+=2,t.bl_count[o]--,g-=2}while(g>0);for(c=o;0!==c;c--)for(d=t.bl_count[c];0!==d;)u=t.heap[--l],u>a||(i[2*u+1]!==c&&(t.opt_len+=(c-i[2*u+1])*i[2*u],i[2*u+1]=c),d--)}})(t,e),Ft(i,l,t.bl_count)},Pt=(t,e,i)=>{let a,s,r=-1,n=e[1],h=0,o=7,l=4;for(0===n&&(o=138,l=3),e[2*(i+1)+1]=65535,a=0;a<=i;a++)s=n,n=e[2*(a+1)+1],++h<o&&s===n||(h<l?t.bl_tree[2*s]+=h:0!==s?(s!==r&&t.bl_tree[2*s]++,t.bl_tree[32]++):h<=10?t.bl_tree[34]++:t.bl_tree[36]++,h=0,r=s,0===n?(o=138,l=3):s===n?(o=6,l=3):(o=7,l=4))},Mt=(t,e,i)=>{let a,s,r=-1,n=e[1],h=0,o=7,l=4;for(0===n&&(o=138,l=3),a=0;a<=i;a++)if(s=n,n=e[2*(a+1)+1],!(++h<o&&s===n)){if(h<l)do{kt(t,s,t.bl_tree)}while(0!==--h);else 0!==s?(s!==r&&(kt(t,s,t.bl_tree),h--),kt(t,16,t.bl_tree),xt(t,h-3,2)):h<=10?(kt(t,17,t.bl_tree),xt(t,h-3,3)):(kt(t,18,t.bl_tree),xt(t,h-11,7));h=0,r=s,0===n?(o=138,l=3):s===n?(o=6,l=3):(o=7,l=4)}};let Lt=!1;const Nt=(t,e,i,a)=>{xt(t,0+(a?1:0),3),Wt(t),Dt(t,i),Dt(t,~i),i&&t.pending_buf.set(t.window.subarray(e,e+i),t.pending),t.pending+=i};var Zt=(t,e,i,a)=>{let s,r,n=0;t.level>0?(2===t.strm.data_type&&(t.strm.data_type=(t=>{let e,i=4093624447;for(e=0;e<=31;e++,i>>>=1)if(1&i&&0!==t.dyn_ltree[2*e])return 0;if(0!==t.dyn_ltree[18]||0!==t.dyn_ltree[20]||0!==t.dyn_ltree[26])return 1;for(e=32;e<ot;e++)if(0!==t.dyn_ltree[2*e])return 1;return 0})(t)),$t(t,t.l_desc),$t(t,t.d_desc),n=(t=>{let e;for(Pt(t,t.dyn_ltree,t.l_desc.max_code),Pt(t,t.dyn_dtree,t.d_desc.max_code),$t(t,t.bl_desc),e=18;e>=3&&0===t.bl_tree[2*gt[e]+1];e--);return t.opt_len+=3*(e+1)+5+5+4,e})(t),s=t.opt_len+3+7>>>3,r=t.static_len+3+7>>>3,r<=s&&(s=r)):s=r=i+5,i+4<=s&&-1!==e?Nt(t,e,i,a):4===t.strategy||r===s?(xt(t,2+(a?1:0),3),At(t,pt,wt)):(xt(t,4+(a?1:0),3),((t,e,i,a)=>{let s;for(xt(t,e-257,5),xt(t,i-1,5),xt(t,a-4,4),s=0;s<a;s++)xt(t,t.bl_tree[2*gt[s]+1],3);Mt(t,t.dyn_ltree,e-1),Mt(t,t.dyn_dtree,i-1)})(t,t.l_desc.max_code+1,t.d_desc.max_code+1,n+1),At(t,t.dyn_ltree,t.dyn_dtree)),zt(t),a&&Wt(t)},Vt={_tr_init:t=>{Lt||((()=>{let t,e,i,a,s;const r=new Array(16);for(i=0,a=0;a<28;a++)for(St[a]=i,t=0;t<1<<ct[a];t++)bt[i++]=a;for(bt[i-1]=a,s=0,a=0;a<16;a++)for(yt[a]=s,t=0;t<1<<_t[a];t++)mt[s++]=a;for(s>>=7;a<dt;a++)for(yt[a]=s<<7,t=0;t<1<<_t[a]-7;t++)mt[256+s++]=a;for(e=0;e<=ut;e++)r[e]=0;for(t=0;t<=143;)pt[2*t+1]=8,t++,r[8]++;for(;t<=255;)pt[2*t+1]=9,t++,r[9]++;for(;t<=279;)pt[2*t+1]=7,t++,r[7]++;for(;t<=287;)pt[2*t+1]=8,t++,r[8]++;for(Ft(pt,287,r),t=0;t<dt;t++)wt[2*t+1]=5,wt[2*t]=Ct(t,5);Rt=new Bt(pt,ct,257,lt,ut),vt=new Bt(wt,_t,0,dt,ut),Ut=new Bt(new Array(0),ft,0,19,7)})(),Lt=!0),t.l_desc=new Tt(t.dyn_ltree,Rt),t.d_desc=new Tt(t.dyn_dtree,vt),t.bl_desc=new Tt(t.bl_tree,Ut),t.bi_buf=0,t.bi_valid=0,zt(t)},_tr_stored_block:Nt,_tr_flush_block:Zt,_tr_tally:(t,e,i)=>(t.pending_buf[t.sym_buf+t.sym_next++]=e,t.pending_buf[t.sym_buf+t.sym_next++]=e>>8,t.pending_buf[t.sym_buf+t.sym_next++]=i,0===e?t.dyn_ltree[2*i]++:(t.matches++,e--,t.dyn_ltree[2*(bt[i]+ot+1)]++,t.dyn_dtree[2*It(e)]++),t.sym_next===t.sym_end),_tr_align:t=>{xt(t,2,3),kt(t,256,pt),(t=>{16===t.bi_valid?(Dt(t,t.bi_buf),t.bi_buf=0,t.bi_valid=0):t.bi_valid>=8&&(t.pending_buf[t.pending++]=255&t.bi_buf,t.bi_buf>>=8,t.bi_valid-=8)})(t)}};var Ht=(t,e,i,a)=>{let s=65535&t,r=t>>>16&65535,n=0;for(;0!==i;){n=i>2e3?2e3:i,i-=n;do{s=s+e[a++]|0,r=r+s|0}while(--n);s%=65521,r%=65521}return s|r<<16};const jt=new Uint32Array((()=>{let t,e=[];for(var i=0;i<256;i++){t=i;for(var a=0;a<8;a++)t=1&t?3988292384^t>>>1:t>>>1;e[i]=t}return e})());var Gt=(t,e,i,a)=>{const s=jt,r=a+i;t^=-1;for(let i=a;i<r;i++)t=t>>>8^s[255&(t^e[i])];return-1^t},Jt={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"},qt={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_OK:0,Z_STREAM_END:1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_UNKNOWN:2,Z_DEFLATED:8};const{_tr_init:Kt,_tr_stored_block:Yt,_tr_flush_block:Xt,_tr_tally:Qt,_tr_align:te}=Vt,{Z_NO_FLUSH:ee,Z_PARTIAL_FLUSH:ie,Z_FULL_FLUSH:ae,Z_FINISH:se,Z_BLOCK:re,Z_OK:ne,Z_STREAM_END:he,Z_STREAM_ERROR:oe,Z_DATA_ERROR:le,Z_BUF_ERROR:de,Z_DEFAULT_COMPRESSION:ue,Z_FILTERED:ce,Z_HUFFMAN_ONLY:_e,Z_RLE:fe,Z_FIXED:ge,Z_DEFAULT_STRATEGY:pe,Z_UNKNOWN:we,Z_DEFLATED:me}=qt,be=258,Se=262,ye=42,Be=113,Re=666,ve=(t,e)=>(t.msg=Jt[e],e),Ue=t=>2*t-(t>4?9:0),Te=t=>{let e=t.length;for(;--e>=0;)t[e]=0},Ie=t=>{let e,i,a,s=t.w_size;e=t.hash_size,a=e;do{i=t.head[--a],t.head[a]=i>=s?i-s:0}while(--e);e=s,a=e;do{i=t.prev[--a],t.prev[a]=i>=s?i-s:0}while(--e)};let De=(t,e,i)=>(e<<t.hash_shift^i)&t.hash_mask;const xe=t=>{const e=t.state;let i=e.pending;i>t.avail_out&&(i=t.avail_out),0!==i&&(t.output.set(e.pending_buf.subarray(e.pending_out,e.pending_out+i),t.next_out),t.next_out+=i,e.pending_out+=i,t.total_out+=i,t.avail_out-=i,e.pending-=i,0===e.pending&&(e.pending_out=0))},ke=(t,e)=>{Xt(t,t.block_start>=0?t.block_start:-1,t.strstart-t.block_start,e),t.block_start=t.strstart,xe(t.strm)},Ce=(t,e)=>{t.pending_buf[t.pending++]=e},Fe=(t,e)=>{t.pending_buf[t.pending++]=e>>>8&255,t.pending_buf[t.pending++]=255&e},ze=(t,e,i,a)=>{let s=t.avail_in;return s>a&&(s=a),0===s?0:(t.avail_in-=s,e.set(t.input.subarray(t.next_in,t.next_in+s),i),1===t.state.wrap?t.adler=Ht(t.adler,e,s,i):2===t.state.wrap&&(t.adler=Gt(t.adler,e,s,i)),t.next_in+=s,t.total_in+=s,s)},We=(t,e)=>{let i,a,s=t.max_chain_length,r=t.strstart,n=t.prev_length,h=t.nice_match;const o=t.strstart>t.w_size-Se?t.strstart-(t.w_size-Se):0,l=t.window,d=t.w_mask,u=t.prev,c=t.strstart+be;let _=l[r+n-1],f=l[r+n];t.prev_length>=t.good_match&&(s>>=2),h>t.lookahead&&(h=t.lookahead);do{if(i=e,l[i+n]===f&&l[i+n-1]===_&&l[i]===l[r]&&l[++i]===l[r+1]){r+=2,i++;do{}while(l[++r]===l[++i]&&l[++r]===l[++i]&&l[++r]===l[++i]&&l[++r]===l[++i]&&l[++r]===l[++i]&&l[++r]===l[++i]&&l[++r]===l[++i]&&l[++r]===l[++i]&&r<c);if(a=be-(c-r),r=c-be,a>n){if(t.match_start=e,n=a,a>=h)break;_=l[r+n-1],f=l[r+n]}}}while((e=u[e&d])>o&&0!==--s);return n<=t.lookahead?n:t.lookahead},Oe=t=>{const e=t.w_size;let i,a,s;do{if(a=t.window_size-t.lookahead-t.strstart,t.strstart>=e+(e-Se)&&(t.window.set(t.window.subarray(e,e+e-a),0),t.match_start-=e,t.strstart-=e,t.block_start-=e,t.insert>t.strstart&&(t.insert=t.strstart),Ie(t),a+=e),0===t.strm.avail_in)break;if(i=ze(t.strm,t.window,t.strstart+t.lookahead,a),t.lookahead+=i,t.lookahead+t.insert>=3)for(s=t.strstart-t.insert,t.ins_h=t.window[s],t.ins_h=De(t,t.ins_h,t.window[s+1]);t.insert&&(t.ins_h=De(t,t.ins_h,t.window[s+3-1]),t.prev[s&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=s,s++,t.insert--,!(t.lookahead+t.insert<3)););}while(t.lookahead<Se&&0!==t.strm.avail_in)},Ee=(t,e)=>{let i,a,s,r=t.pending_buf_size-5>t.w_size?t.w_size:t.pending_buf_size-5,n=0,h=t.strm.avail_in;do{if(i=65535,s=t.bi_valid+42>>3,t.strm.avail_out<s)break;if(s=t.strm.avail_out-s,a=t.strstart-t.block_start,i>a+t.strm.avail_in&&(i=a+t.strm.avail_in),i>s&&(i=s),i<r&&(0===i&&e!==se||e===ee||i!==a+t.strm.avail_in))break;n=e===se&&i===a+t.strm.avail_in?1:0,Yt(t,0,0,n),t.pending_buf[t.pending-4]=i,t.pending_buf[t.pending-3]=i>>8,t.pending_buf[t.pending-2]=~i,t.pending_buf[t.pending-1]=~i>>8,xe(t.strm),a&&(a>i&&(a=i),t.strm.output.set(t.window.subarray(t.block_start,t.block_start+a),t.strm.next_out),t.strm.next_out+=a,t.strm.avail_out-=a,t.strm.total_out+=a,t.block_start+=a,i-=a),i&&(ze(t.strm,t.strm.output,t.strm.next_out,i),t.strm.next_out+=i,t.strm.avail_out-=i,t.strm.total_out+=i)}while(0===n);return h-=t.strm.avail_in,h&&(h>=t.w_size?(t.matches=2,t.window.set(t.strm.input.subarray(t.strm.next_in-t.w_size,t.strm.next_in),0),t.strstart=t.w_size,t.insert=t.strstart):(t.window_size-t.strstart<=h&&(t.strstart-=t.w_size,t.window.set(t.window.subarray(t.w_size,t.w_size+t.strstart),0),t.matches<2&&t.matches++,t.insert>t.strstart&&(t.insert=t.strstart)),t.window.set(t.strm.input.subarray(t.strm.next_in-h,t.strm.next_in),t.strstart),t.strstart+=h,t.insert+=h>t.w_size-t.insert?t.w_size-t.insert:h),t.block_start=t.strstart),t.high_water<t.strstart&&(t.high_water=t.strstart),n?4:e!==ee&&e!==se&&0===t.strm.avail_in&&t.strstart===t.block_start?2:(s=t.window_size-t.strstart,t.strm.avail_in>s&&t.block_start>=t.w_size&&(t.block_start-=t.w_size,t.strstart-=t.w_size,t.window.set(t.window.subarray(t.w_size,t.w_size+t.strstart),0),t.matches<2&&t.matches++,s+=t.w_size,t.insert>t.strstart&&(t.insert=t.strstart)),s>t.strm.avail_in&&(s=t.strm.avail_in),s&&(ze(t.strm,t.window,t.strstart,s),t.strstart+=s,t.insert+=s>t.w_size-t.insert?t.w_size-t.insert:s),t.high_water<t.strstart&&(t.high_water=t.strstart),s=t.bi_valid+42>>3,s=t.pending_buf_size-s>65535?65535:t.pending_buf_size-s,r=s>t.w_size?t.w_size:s,a=t.strstart-t.block_start,(a>=r||(a||e===se)&&e!==ee&&0===t.strm.avail_in&&a<=s)&&(i=a>s?s:a,n=e===se&&0===t.strm.avail_in&&i===a?1:0,Yt(t,t.block_start,i,n),t.block_start+=i,xe(t.strm)),n?3:1)},Ae=(t,e)=>{let i,a;for(;;){if(t.lookahead<Se){if(Oe(t),t.lookahead<Se&&e===ee)return 1;if(0===t.lookahead)break}if(i=0,t.lookahead>=3&&(t.ins_h=De(t,t.ins_h,t.window[t.strstart+3-1]),i=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),0!==i&&t.strstart-i<=t.w_size-Se&&(t.match_length=We(t,i)),t.match_length>=3)if(a=Qt(t,t.strstart-t.match_start,t.match_length-3),t.lookahead-=t.match_length,t.match_length<=t.max_lazy_match&&t.lookahead>=3){t.match_length--;do{t.strstart++,t.ins_h=De(t,t.ins_h,t.window[t.strstart+3-1]),i=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart}while(0!==--t.match_length);t.strstart++}else t.strstart+=t.match_length,t.match_length=0,t.ins_h=t.window[t.strstart],t.ins_h=De(t,t.ins_h,t.window[t.strstart+1]);else a=Qt(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++;if(a&&(ke(t,!1),0===t.strm.avail_out))return 1}return t.insert=t.strstart<2?t.strstart:2,e===se?(ke(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(ke(t,!1),0===t.strm.avail_out)?1:2},$e=(t,e)=>{let i,a,s;for(;;){if(t.lookahead<Se){if(Oe(t),t.lookahead<Se&&e===ee)return 1;if(0===t.lookahead)break}if(i=0,t.lookahead>=3&&(t.ins_h=De(t,t.ins_h,t.window[t.strstart+3-1]),i=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),t.prev_length=t.match_length,t.prev_match=t.match_start,t.match_length=2,0!==i&&t.prev_length<t.max_lazy_match&&t.strstart-i<=t.w_size-Se&&(t.match_length=We(t,i),t.match_length<=5&&(t.strategy===ce||3===t.match_length&&t.strstart-t.match_start>4096)&&(t.match_length=2)),t.prev_length>=3&&t.match_length<=t.prev_length){s=t.strstart+t.lookahead-3,a=Qt(t,t.strstart-1-t.prev_match,t.prev_length-3),t.lookahead-=t.prev_length-1,t.prev_length-=2;do{++t.strstart<=s&&(t.ins_h=De(t,t.ins_h,t.window[t.strstart+3-1]),i=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart)}while(0!==--t.prev_length);if(t.match_available=0,t.match_length=2,t.strstart++,a&&(ke(t,!1),0===t.strm.avail_out))return 1}else if(t.match_available){if(a=Qt(t,0,t.window[t.strstart-1]),a&&ke(t,!1),t.strstart++,t.lookahead--,0===t.strm.avail_out)return 1}else t.match_available=1,t.strstart++,t.lookahead--}return t.match_available&&(a=Qt(t,0,t.window[t.strstart-1]),t.match_available=0),t.insert=t.strstart<2?t.strstart:2,e===se?(ke(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(ke(t,!1),0===t.strm.avail_out)?1:2};function Pe(t,e,i,a,s){this.good_length=t,this.max_lazy=e,this.nice_length=i,this.max_chain=a,this.func=s}const Me=[new Pe(0,0,0,0,Ee),new Pe(4,4,8,4,Ae),new Pe(4,5,16,8,Ae),new Pe(4,6,32,32,Ae),new Pe(4,4,16,16,$e),new Pe(8,16,32,32,$e),new Pe(8,16,128,128,$e),new Pe(8,32,128,256,$e),new Pe(32,128,258,1024,$e),new Pe(32,258,258,4096,$e)];function Le(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=me,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new Uint16Array(1146),this.dyn_dtree=new Uint16Array(122),this.bl_tree=new Uint16Array(78),Te(this.dyn_ltree),Te(this.dyn_dtree),Te(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new Uint16Array(16),this.heap=new Uint16Array(573),Te(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new Uint16Array(573),Te(this.depth),this.sym_buf=0,this.lit_bufsize=0,this.sym_next=0,this.sym_end=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}const Ne=t=>{if(!t)return 1;const e=t.state;return!e||e.strm!==t||e.status!==ye&&57!==e.status&&69!==e.status&&73!==e.status&&91!==e.status&&103!==e.status&&e.status!==Be&&e.status!==Re?1:0},Ze=t=>{if(Ne(t))return ve(t,oe);t.total_in=t.total_out=0,t.data_type=we;const e=t.state;return e.pending=0,e.pending_out=0,e.wrap<0&&(e.wrap=-e.wrap),e.status=2===e.wrap?57:e.wrap?ye:Be,t.adler=2===e.wrap?0:1,e.last_flush=-2,Kt(e),ne},Ve=t=>{const e=Ze(t);var i;return e===ne&&((i=t.state).window_size=2*i.w_size,Te(i.head),i.max_lazy_match=Me[i.level].max_lazy,i.good_match=Me[i.level].good_length,i.nice_match=Me[i.level].nice_length,i.max_chain_length=Me[i.level].max_chain,i.strstart=0,i.block_start=0,i.lookahead=0,i.insert=0,i.match_length=i.prev_length=2,i.match_available=0,i.ins_h=0),e},He=(t,e,i,a,s,r)=>{if(!t)return oe;let n=1;if(e===ue&&(e=6),a<0?(n=0,a=-a):a>15&&(n=2,a-=16),s<1||s>9||i!==me||a<8||a>15||e<0||e>9||r<0||r>ge||8===a&&1!==n)return ve(t,oe);8===a&&(a=9);const h=new Le;return t.state=h,h.strm=t,h.status=ye,h.wrap=n,h.gzhead=null,h.w_bits=a,h.w_size=1<<h.w_bits,h.w_mask=h.w_size-1,h.hash_bits=s+7,h.hash_size=1<<h.hash_bits,h.hash_mask=h.hash_size-1,h.hash_shift=~~((h.hash_bits+3-1)/3),h.window=new Uint8Array(2*h.w_size),h.head=new Uint16Array(h.hash_size),h.prev=new Uint16Array(h.w_size),h.lit_bufsize=1<<s+6,h.pending_buf_size=4*h.lit_bufsize,h.pending_buf=new Uint8Array(h.pending_buf_size),h.sym_buf=h.lit_bufsize,h.sym_end=3*(h.lit_bufsize-1),h.level=e,h.strategy=r,h.method=i,Ve(t)};var je={deflateInit:(t,e)=>He(t,e,me,15,8,pe),deflateInit2:He,deflateReset:Ve,deflateResetKeep:Ze,deflateSetHeader:(t,e)=>Ne(t)||2!==t.state.wrap?oe:(t.state.gzhead=e,ne),deflate:(t,e)=>{if(Ne(t)||e>re||e<0)return t?ve(t,oe):oe;const i=t.state;if(!t.output||0!==t.avail_in&&!t.input||i.status===Re&&e!==se)return ve(t,0===t.avail_out?de:oe);const a=i.last_flush;if(i.last_flush=e,0!==i.pending){if(xe(t),0===t.avail_out)return i.last_flush=-1,ne}else if(0===t.avail_in&&Ue(e)<=Ue(a)&&e!==se)return ve(t,de);if(i.status===Re&&0!==t.avail_in)return ve(t,de);if(i.status===ye&&0===i.wrap&&(i.status=Be),i.status===ye){let e=me+(i.w_bits-8<<4)<<8,a=-1;if(a=i.strategy>=_e||i.level<2?0:i.level<6?1:6===i.level?2:3,e|=a<<6,0!==i.strstart&&(e|=32),e+=31-e%31,Fe(i,e),0!==i.strstart&&(Fe(i,t.adler>>>16),Fe(i,65535&t.adler)),t.adler=1,i.status=Be,xe(t),0!==i.pending)return i.last_flush=-1,ne}if(57===i.status)if(t.adler=0,Ce(i,31),Ce(i,139),Ce(i,8),i.gzhead)Ce(i,(i.gzhead.text?1:0)+(i.gzhead.hcrc?2:0)+(i.gzhead.extra?4:0)+(i.gzhead.name?8:0)+(i.gzhead.comment?16:0)),Ce(i,255&i.gzhead.time),Ce(i,i.gzhead.time>>8&255),Ce(i,i.gzhead.time>>16&255),Ce(i,i.gzhead.time>>24&255),Ce(i,9===i.level?2:i.strategy>=_e||i.level<2?4:0),Ce(i,255&i.gzhead.os),i.gzhead.extra&&i.gzhead.extra.length&&(Ce(i,255&i.gzhead.extra.length),Ce(i,i.gzhead.extra.length>>8&255)),i.gzhead.hcrc&&(t.adler=Gt(t.adler,i.pending_buf,i.pending,0)),i.gzindex=0,i.status=69;else if(Ce(i,0),Ce(i,0),Ce(i,0),Ce(i,0),Ce(i,0),Ce(i,9===i.level?2:i.strategy>=_e||i.level<2?4:0),Ce(i,3),i.status=Be,xe(t),0!==i.pending)return i.last_flush=-1,ne;if(69===i.status){if(i.gzhead.extra){let e=i.pending,a=(65535&i.gzhead.extra.length)-i.gzindex;for(;i.pending+a>i.pending_buf_size;){let s=i.pending_buf_size-i.pending;if(i.pending_buf.set(i.gzhead.extra.subarray(i.gzindex,i.gzindex+s),i.pending),i.pending=i.pending_buf_size,i.gzhead.hcrc&&i.pending>e&&(t.adler=Gt(t.adler,i.pending_buf,i.pending-e,e)),i.gzindex+=s,xe(t),0!==i.pending)return i.last_flush=-1,ne;e=0,a-=s}let s=new Uint8Array(i.gzhead.extra);i.pending_buf.set(s.subarray(i.gzindex,i.gzindex+a),i.pending),i.pending+=a,i.gzhead.hcrc&&i.pending>e&&(t.adler=Gt(t.adler,i.pending_buf,i.pending-e,e)),i.gzindex=0}i.status=73}if(73===i.status){if(i.gzhead.name){let e,a=i.pending;do{if(i.pending===i.pending_buf_size){if(i.gzhead.hcrc&&i.pending>a&&(t.adler=Gt(t.adler,i.pending_buf,i.pending-a,a)),xe(t),0!==i.pending)return i.last_flush=-1,ne;a=0}e=i.gzindex<i.gzhead.name.length?255&i.gzhead.name.charCodeAt(i.gzindex++):0,Ce(i,e)}while(0!==e);i.gzhead.hcrc&&i.pending>a&&(t.adler=Gt(t.adler,i.pending_buf,i.pending-a,a)),i.gzindex=0}i.status=91}if(91===i.status){if(i.gzhead.comment){let e,a=i.pending;do{if(i.pending===i.pending_buf_size){if(i.gzhead.hcrc&&i.pending>a&&(t.adler=Gt(t.adler,i.pending_buf,i.pending-a,a)),xe(t),0!==i.pending)return i.last_flush=-1,ne;a=0}e=i.gzindex<i.gzhead.comment.length?255&i.gzhead.comment.charCodeAt(i.gzindex++):0,Ce(i,e)}while(0!==e);i.gzhead.hcrc&&i.pending>a&&(t.adler=Gt(t.adler,i.pending_buf,i.pending-a,a))}i.status=103}if(103===i.status){if(i.gzhead.hcrc){if(i.pending+2>i.pending_buf_size&&(xe(t),0!==i.pending))return i.last_flush=-1,ne;Ce(i,255&t.adler),Ce(i,t.adler>>8&255),t.adler=0}if(i.status=Be,xe(t),0!==i.pending)return i.last_flush=-1,ne}if(0!==t.avail_in||0!==i.lookahead||e!==ee&&i.status!==Re){let a=0===i.level?Ee(i,e):i.strategy===_e?((t,e)=>{let i;for(;;){if(0===t.lookahead&&(Oe(t),0===t.lookahead)){if(e===ee)return 1;break}if(t.match_length=0,i=Qt(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++,i&&(ke(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===se?(ke(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(ke(t,!1),0===t.strm.avail_out)?1:2})(i,e):i.strategy===fe?((t,e)=>{let i,a,s,r;const n=t.window;for(;;){if(t.lookahead<=be){if(Oe(t),t.lookahead<=be&&e===ee)return 1;if(0===t.lookahead)break}if(t.match_length=0,t.lookahead>=3&&t.strstart>0&&(s=t.strstart-1,a=n[s],a===n[++s]&&a===n[++s]&&a===n[++s])){r=t.strstart+be;do{}while(a===n[++s]&&a===n[++s]&&a===n[++s]&&a===n[++s]&&a===n[++s]&&a===n[++s]&&a===n[++s]&&a===n[++s]&&s<r);t.match_length=be-(r-s),t.match_length>t.lookahead&&(t.match_length=t.lookahead)}if(t.match_length>=3?(i=Qt(t,1,t.match_length-3),t.lookahead-=t.match_length,t.strstart+=t.match_length,t.match_length=0):(i=Qt(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++),i&&(ke(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===se?(ke(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(ke(t,!1),0===t.strm.avail_out)?1:2})(i,e):Me[i.level].func(i,e);if(3!==a&&4!==a||(i.status=Re),1===a||3===a)return 0===t.avail_out&&(i.last_flush=-1),ne;if(2===a&&(e===ie?te(i):e!==re&&(Yt(i,0,0,!1),e===ae&&(Te(i.head),0===i.lookahead&&(i.strstart=0,i.block_start=0,i.insert=0))),xe(t),0===t.avail_out))return i.last_flush=-1,ne}return e!==se?ne:i.wrap<=0?he:(2===i.wrap?(Ce(i,255&t.adler),Ce(i,t.adler>>8&255),Ce(i,t.adler>>16&255),Ce(i,t.adler>>24&255),Ce(i,255&t.total_in),Ce(i,t.total_in>>8&255),Ce(i,t.total_in>>16&255),Ce(i,t.total_in>>24&255)):(Fe(i,t.adler>>>16),Fe(i,65535&t.adler)),xe(t),i.wrap>0&&(i.wrap=-i.wrap),0!==i.pending?ne:he)},deflateEnd:t=>{if(Ne(t))return oe;const e=t.state.status;return t.state=null,e===Be?ve(t,le):ne},deflateSetDictionary:(t,e)=>{let i=e.length;if(Ne(t))return oe;const a=t.state,s=a.wrap;if(2===s||1===s&&a.status!==ye||a.lookahead)return oe;if(1===s&&(t.adler=Ht(t.adler,e,i,0)),a.wrap=0,i>=a.w_size){0===s&&(Te(a.head),a.strstart=0,a.block_start=0,a.insert=0);let t=new Uint8Array(a.w_size);t.set(e.subarray(i-a.w_size,i),0),e=t,i=a.w_size}const r=t.avail_in,n=t.next_in,h=t.input;for(t.avail_in=i,t.next_in=0,t.input=e,Oe(a);a.lookahead>=3;){let t=a.strstart,e=a.lookahead-2;do{a.ins_h=De(a,a.ins_h,a.window[t+3-1]),a.prev[t&a.w_mask]=a.head[a.ins_h],a.head[a.ins_h]=t,t++}while(--e);a.strstart=t,a.lookahead=2,Oe(a)}return a.strstart+=a.lookahead,a.block_start=a.strstart,a.insert=a.lookahead,a.lookahead=0,a.match_length=a.prev_length=2,a.match_available=0,t.next_in=n,t.input=h,t.avail_in=r,a.wrap=s,ne},deflateInfo:"pako deflate (from Nodeca project)"};const Ge=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);var Je=function(t){const e=Array.prototype.slice.call(arguments,1);for(;e.length;){const i=e.shift();if(i){if("object"!=typeof i)throw new TypeError(i+"must be non-object");for(const e in i)Ge(i,e)&&(t[e]=i[e])}}return t},qe=t=>{let e=0;for(let i=0,a=t.length;i<a;i++)e+=t[i].length;const i=new Uint8Array(e);for(let e=0,a=0,s=t.length;e<s;e++){let s=t[e];i.set(s,a),a+=s.length}return i};let Ke=!0;try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(t){Ke=!1}const Ye=new Uint8Array(256);for(let t=0;t<256;t++)Ye[t]=t>=252?6:t>=248?5:t>=240?4:t>=224?3:t>=192?2:1;Ye[254]=Ye[254]=1;var Xe=t=>{if("function"==typeof TextEncoder&&TextEncoder.prototype.encode)return(new TextEncoder).encode(t);let e,i,a,s,r,n=t.length,h=0;for(s=0;s<n;s++)i=t.charCodeAt(s),55296==(64512&i)&&s+1<n&&(a=t.charCodeAt(s+1),56320==(64512&a)&&(i=65536+(i-55296<<10)+(a-56320),s++)),h+=i<128?1:i<2048?2:i<65536?3:4;for(e=new Uint8Array(h),r=0,s=0;r<h;s++)i=t.charCodeAt(s),55296==(64512&i)&&s+1<n&&(a=t.charCodeAt(s+1),56320==(64512&a)&&(i=65536+(i-55296<<10)+(a-56320),s++)),i<128?e[r++]=i:i<2048?(e[r++]=192|i>>>6,e[r++]=128|63&i):i<65536?(e[r++]=224|i>>>12,e[r++]=128|i>>>6&63,e[r++]=128|63&i):(e[r++]=240|i>>>18,e[r++]=128|i>>>12&63,e[r++]=128|i>>>6&63,e[r++]=128|63&i);return e};var Qe=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0};const ti=Object.prototype.toString,{Z_NO_FLUSH:ei,Z_SYNC_FLUSH:ii,Z_FULL_FLUSH:ai,Z_FINISH:si,Z_OK:ri,Z_STREAM_END:ni,Z_DEFAULT_COMPRESSION:hi,Z_DEFAULT_STRATEGY:oi,Z_DEFLATED:li}=qt;function di(t){this.options=Je({level:hi,method:li,chunkSize:16384,windowBits:15,memLevel:8,strategy:oi},t||{});let e=this.options;e.raw&&e.windowBits>0?e.windowBits=-e.windowBits:e.gzip&&e.windowBits>0&&e.windowBits<16&&(e.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new Qe,this.strm.avail_out=0;let i=je.deflateInit2(this.strm,e.level,e.method,e.windowBits,e.memLevel,e.strategy);if(i!==ri)throw new Error(Jt[i]);if(e.header&&je.deflateSetHeader(this.strm,e.header),e.dictionary){let t;if(t="string"==typeof e.dictionary?Xe(e.dictionary):"[object ArrayBuffer]"===ti.call(e.dictionary)?new Uint8Array(e.dictionary):e.dictionary,i=je.deflateSetDictionary(this.strm,t),i!==ri)throw new Error(Jt[i]);this._dict_set=!0}}di.prototype.push=function(t,e){const i=this.strm,a=this.options.chunkSize;let s,r;if(this.ended)return!1;for(r=e===~~e?e:!0===e?si:ei,"string"==typeof t?i.input=Xe(t):"[object ArrayBuffer]"===ti.call(t)?i.input=new Uint8Array(t):i.input=t,i.next_in=0,i.avail_in=i.input.length;;)if(0===i.avail_out&&(i.output=new Uint8Array(a),i.next_out=0,i.avail_out=a),(r===ii||r===ai)&&i.avail_out<=6)this.onData(i.output.subarray(0,i.next_out)),i.avail_out=0;else{if(s=je.deflate(i,r),s===ni)return i.next_out>0&&this.onData(i.output.subarray(0,i.next_out)),s=je.deflateEnd(this.strm),this.onEnd(s),this.ended=!0,s===ri;if(0!==i.avail_out){if(r>0&&i.next_out>0)this.onData(i.output.subarray(0,i.next_out)),i.avail_out=0;else if(0===i.avail_in)break}else this.onData(i.output)}return!0},di.prototype.onData=function(t){this.chunks.push(t)},di.prototype.onEnd=function(t){t===ri&&(this.result=qe(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg};var ui={deflate:function(t,e){const i=new di(e);if(i.push(t,!0),i.err)throw i.msg||Jt[i.err];return i.result}};const{deflate:ci}=ui;var _i=ci;const fi={b:{u:DataView.prototype.getInt8,p:DataView.prototype.setInt8,bytes:1},B:{u:DataView.prototype.getUint8,p:DataView.prototype.setUint8,bytes:1},h:{u:DataView.prototype.getInt16,p:DataView.prototype.setInt16,bytes:2},H:{u:DataView.prototype.getUint16,p:DataView.prototype.setUint16,bytes:2},i:{u:DataView.prototype.getInt32,p:DataView.prototype.setInt32,bytes:4},I:{u:DataView.prototype.getUint32,p:DataView.prototype.setUint32,bytes:4}},gi=(t,...e)=>{let i=0;if(t.replace(/[<>]/,"").length!=e.length)throw"Pack format to Argument count mismatch";const a=[];let s=!0;for(let a=0;a<t.length;a++)"<"==t[a]?s=!0:">"==t[a]?s=!1:(r(t[a],e[i]),i++);function r(t,e){if(!(t in fi))throw"Unhandled character '"+t+"' in pack format";const i=fi[t].bytes,r=new DataView(new ArrayBuffer(i));fi[t].p.bind(r)(0,e,s);for(let t=0;t<i;t++)a.push(r.getUint8(t))}return a},pi=(t,e)=>{let i=0;const a=[];let s=!0;for(const e of t)"<"==e?s=!0:">"==e?s=!1:r(e);function r(t){if(!(t in fi))throw"Unhandled character '"+t+"' in unpack format";const r=fi[t].bytes,n=new DataView(new ArrayBuffer(r));for(let t=0;t<r;t++)n.setUint8(t,255&e[i+t]);const h=fi[t].u.bind(n);a.push(h(0,s)),i+=r}return a};class wi extends EventTarget{constructor(t,e,i){super(),this.port=t,this.logger=e,this._parent=i,this.__chipName=null,this.__chipRevision=null,this.__chipVariant=null,this._efuses=new Array(4).fill(0),this._flashsize=4194304,this.debug=!1,this.IS_STUB=!1,this.connected=!0,this.flashSize=null,this._currentBaudRate=h,this._isESP32S2NativeUSB=!1,this._initializationSucceeded=!1,this.__commandLock=Promise.resolve([0,[]]),this.__isReconfiguring=!1,this.__abandonCurrentOperation=!1,this.__adaptiveBlockMultiplier=1,this.__adaptiveMaxInFlightMultiplier=1,this.__consecutiveSuccessfulChunks=0,this.__lastAdaptiveAdjustment=0,this.__isCDCDevice=!1,this.state_DTR=!1,this.state_RTS=!1,this.__writeChain=Promise.resolve()}get chipFamily(){return this._parent?this._parent.chipFamily:this.__chipFamily}set chipFamily(t){this._parent?this._parent.chipFamily=t:this.__chipFamily=t}get chipName(){return this._parent?this._parent.chipName:this.__chipName}set chipName(t){this._parent?this._parent.chipName=t:this.__chipName=t}get chipRevision(){return this._parent?this._parent.chipRevision:this.__chipRevision}set chipRevision(t){this._parent?this._parent.chipRevision=t:this.__chipRevision=t}get chipVariant(){return this._parent?this._parent.chipVariant:this.__chipVariant}set chipVariant(t){this._parent?this._parent.chipVariant=t:this.__chipVariant=t}get _inputBuffer(){if(this._parent)return this._parent._inputBuffer;if(void 0===this.__inputBuffer)throw new Error("_inputBuffer accessed before initialization");return this.__inputBuffer}get _inputBufferReadIndex(){return this._parent?this._parent._inputBufferReadIndex:this.__inputBufferReadIndex||0}set _inputBufferReadIndex(t){this._parent?this._parent._inputBufferReadIndex=t:this.__inputBufferReadIndex=t}get _inputBufferAvailable(){return this._inputBuffer.length-this._inputBufferReadIndex}_readByte(){if(!(this._inputBufferReadIndex>=this._inputBuffer.length))return this._inputBuffer[this._inputBufferReadIndex++]}_clearInputBuffer(){this._inputBuffer.length=0,this._inputBufferReadIndex=0}_compactInputBuffer(){this._inputBufferReadIndex>1e3&&this._inputBufferReadIndex>this._inputBuffer.length/2&&(this._inputBuffer.splice(0,this._inputBufferReadIndex),this._inputBufferReadIndex=0)}get _totalBytesRead(){return this._parent?this._parent._totalBytesRead:this.__totalBytesRead||0}set _totalBytesRead(t){this._parent?this._parent._totalBytesRead=t:this.__totalBytesRead=t}get _commandLock(){return this._parent?this._parent._commandLock:this.__commandLock}set _commandLock(t){this._parent?this._parent._commandLock=t:this.__commandLock=t}get _isReconfiguring(){return this._parent?this._parent._isReconfiguring:this.__isReconfiguring}set _isReconfiguring(t){this._parent?this._parent._isReconfiguring=t:this.__isReconfiguring=t}get _abandonCurrentOperation(){return this._parent?this._parent._abandonCurrentOperation:this.__abandonCurrentOperation}set _abandonCurrentOperation(t){this._parent?this._parent._abandonCurrentOperation=t:this.__abandonCurrentOperation=t}get _adaptiveBlockMultiplier(){return this._parent?this._parent._adaptiveBlockMultiplier:this.__adaptiveBlockMultiplier}set _adaptiveBlockMultiplier(t){this._parent?this._parent._adaptiveBlockMultiplier=t:this.__adaptiveBlockMultiplier=t}get _adaptiveMaxInFlightMultiplier(){return this._parent?this._parent._adaptiveMaxInFlightMultiplier:this.__adaptiveMaxInFlightMultiplier}set _adaptiveMaxInFlightMultiplier(t){this._parent?this._parent._adaptiveMaxInFlightMultiplier=t:this.__adaptiveMaxInFlightMultiplier=t}get _consecutiveSuccessfulChunks(){return this._parent?this._parent._consecutiveSuccessfulChunks:this.__consecutiveSuccessfulChunks}set _consecutiveSuccessfulChunks(t){this._parent?this._parent._consecutiveSuccessfulChunks=t:this.__consecutiveSuccessfulChunks=t}get _lastAdaptiveAdjustment(){return this._parent?this._parent._lastAdaptiveAdjustment:this.__lastAdaptiveAdjustment}set _lastAdaptiveAdjustment(t){this._parent?this._parent._lastAdaptiveAdjustment=t:this.__lastAdaptiveAdjustment=t}get _isCDCDevice(){return this._parent?this._parent._isCDCDevice:this.__isCDCDevice}set _isCDCDevice(t){this._parent?this._parent._isCDCDevice=t:this.__isCDCDevice=t}detectUSBSerialChip(t,e){const i={6790:{29986:{name:"CH340",maxBaudrate:460800},29987:{name:"CH340",maxBaudrate:460800},30084:{name:"CH340",maxBaudrate:460800},21795:{name:"CH341",maxBaudrate:2e6},21971:{name:"CH343",maxBaudrate:6e6},21972:{name:"CH9102",maxBaudrate:6e6},21976:{name:"CH9101",maxBaudrate:3e6}},4292:{6e4:{name:"CP2102(n)",maxBaudrate:3e6},60016:{name:"CP2105",maxBaudrate:2e6},60017:{name:"CP2108",maxBaudrate:2e6}},1027:{24577:{name:"FT232R",maxBaudrate:3e6},24592:{name:"FT2232",maxBaudrate:3e6},24593:{name:"FT4232",maxBaudrate:3e6},24596:{name:"FT232H",maxBaudrate:12e6},24597:{name:"FT230X",maxBaudrate:3e6}},12346:{2:{name:"ESP32-S2 Native USB",maxBaudrate:2e6},4097:{name:"ESP32 Native USB",maxBaudrate:2e6},4098:{name:"ESP32 Native USB",maxBaudrate:2e6},16386:{name:"ESP32 Native USB",maxBaudrate:2e6},4096:{name:"ESP32 Native USB",maxBaudrate:2e6}}}[t];return i&&i[e]?i[e]:{name:`Unknown (VID: 0x${t.toString(16)}, PID: 0x${e.toString(16)})`}}async initialize(){if(!this._parent){this.__inputBuffer=[],this.__inputBufferReadIndex=0,this.__totalBytesRead=0;const t=this.port.getInfo();if(t.usbVendorId&&t.usbProductId){const e=this.detectUSBSerialChip(t.usbVendorId,t.usbProductId);this.logger.log(`USB-Serial: ${e.name} (VID: 0x${t.usbVendorId.toString(16)}, PID: 0x${t.usbProductId.toString(16)})`),e.maxBaudrate&&(this._maxUSBSerialBaudrate=e.maxBaudrate,this.logger.log(`Max baudrate: ${e.maxBaudrate}`)),12346===t.usbVendorId&&2===t.usbProductId&&(this._isESP32S2NativeUSB=!0),(12346===t.usbVendorId||6790===t.usbVendorId&&21971===t.usbProductId)&&(this._isCDCDevice=!0)}this.readLoop()}await this.connectWithResetStrategies(),await this.detectChip();const t=st(this.getChipFamily()),e=t.macFuse;for(let t=0;t<4;t++)this._efuses[t]=await this.readRegister(e+4*t);this.logger.log(`Chip type ${this.chipName}`),this.logger.debug(`Bootloader flash offset: 0x${t.flashOffs.toString(16)}`),this._initializationSucceeded=!0}async detectChip(){try{const t=(await this.getSecurityInfo()).chipId,e=v[t];if(e)return this.chipName=e.name,this.chipFamily=e.family,this.chipFamily===B&&(this.chipRevision=await this.getChipRevision(),this.logger.debug(`ESP32-P4 revision: ${this.chipRevision}`),this.chipRevision>=300?this.chipVariant="rev300":this.chipVariant="rev0",this.logger.debug(`ESP32-P4 variant: ${this.chipVariant}`)),void this.logger.debug(`Detected chip via IMAGE_CHIP_ID: ${t} (${this.chipName})`);this.logger.debug(`Unknown IMAGE_CHIP_ID: ${t}, falling back to magic value detection`)}catch(t){this.logger.debug(`GET_SECURITY_INFO failed, using magic value detection: ${t}`),await this.drainInputBuffer(200),this._clearInputBuffer(),await s(Q);try{await this.sync()}catch(t){this.logger.debug(`Re-sync after GET_SECURITY_INFO failure: ${t}`)}}const t=await this.readRegister(1073745920),e=U[t>>>0];if(void 0===e)throw new Error(`Unknown Chip: Hex: ${a(t>>>0,8).toLowerCase()} Number: ${t}`);this.chipName=e.name,this.chipFamily=e.family,this.chipFamily===B&&(this.chipRevision=await this.getChipRevision(),this.logger.debug(`ESP32-P4 revision: ${this.chipRevision}`),this.chipRevision>=300?this.chipVariant="rev300":this.chipVariant="rev0",this.logger.debug(`ESP32-P4 variant: ${this.chipVariant}`)),this.logger.debug(`Detected chip via magic value: ${a(t>>>0,8)} (${this.chipName})`)}async getChipRevision(){if(this.chipFamily!==B)return 0;const t=await this.readRegister(1343410252);return 100*((t>>23&1)<<2|t>>4&3)+(15&t)}async getSecurityInfo(){const[,t]=await this.checkCommand(20,[],0);if(0===t.length)throw new Error("GET_SECURITY_INFO not supported or returned empty response");if(t.length<12)throw new Error(`Invalid security info response length: ${t.length} (expected at least 12 bytes)`);return{flags:pi("<I",t.slice(0,4))[0],flashCryptCnt:t[4],keyPurposes:Array.from(t.slice(5,12)),chipId:t.length>=16?pi("<I",t.slice(12,16))[0]:0,apiVersion:t.length>=20?pi("<I",t.slice(16,20))[0]:0}}async getMacAddress(){if(!this._initializationSucceeded)throw new Error("getMacAddress() requires initialize() to have completed successfully");return this.macAddr().map(t=>t.toString(16).padStart(2,"0").toUpperCase()).join(":")}async readLoop(){this.debug&&this.logger.debug("Starting read loop"),this._reader=this.port.readable.getReader();try{let t=!0;for(;t;){const{value:e,done:i}=await this._reader.read();if(i){this._reader.releaseLock(),t=!1;break}if(!e||0===e.length)continue;const a=Array.from(e);Array.prototype.push.apply(this._inputBuffer,a),this._totalBytesRead+=e.length}}catch{this.logger.error("Read loop got disconnected")}finally{this._isReconfiguring=!1}this.connected=!1,this._isESP32S2NativeUSB&&!this._initializationSucceeded&&(this.logger.log("ESP32-S2 Native USB detected - requesting port reselection"),this.dispatchEvent(new CustomEvent("esp32s2-usb-reconnect",{detail:{message:"ESP32-S2 Native USB requires port reselection"}}))),this.dispatchEvent(new Event("disconnect")),this.logger.debug("Finished read loop")}sleep(t=100){return new Promise(e=>setTimeout(e,t))}async setRTS(t){await this.port.setSignals({requestToSend:t}),await this.setDTR(this.state_DTR)}async setDTR(t){this.state_DTR=t,await this.port.setSignals({dataTerminalReady:t})}async setDTRandRTS(t,e){this.state_DTR=t,this.state_RTS=e,await this.port.setSignals({dataTerminalReady:t,requestToSend:e})}async hardResetUSBJTAGSerial(){await this.setRTS(!1),await this.setDTR(!1),await this.sleep(100),await this.setDTR(!0),await this.setRTS(!1),await this.sleep(100),await this.setRTS(!0),await this.setDTR(!1),await this.setRTS(!0),await this.sleep(100),await this.setDTR(!1),await this.setRTS(!1),await this.sleep(200)}async hardResetClassic(){await this.setDTR(!1),await this.setRTS(!0),await this.sleep(100),await this.setDTR(!0),await this.setRTS(!1),await this.sleep(50),await this.setDTR(!1),await this.sleep(200)}async hardResetUnixTight(){await this.setDTRandRTS(!0,!0),await this.setDTRandRTS(!1,!1),await this.setDTRandRTS(!1,!0),await this.sleep(100),await this.setDTRandRTS(!0,!1),await this.sleep(50),await this.setDTRandRTS(!1,!1),await this.setDTR(!1),await this.sleep(200)}async setRTSWebUSB(t){this.state_RTS=t,await this.port.setSignals({requestToSend:t,dataTerminalReady:this.state_DTR})}async setDTRWebUSB(t){this.state_DTR=t,await this.port.setSignals({dataTerminalReady:t,requestToSend:this.state_RTS})}async setDTRandRTSWebUSB(t,e){this.state_DTR=t,this.state_RTS=e,await this.port.setSignals({dataTerminalReady:t,requestToSend:e})}async hardResetUSBJTAGSerialWebUSB(){await this.setRTSWebUSB(!1),await this.setDTRWebUSB(!1),await this.sleep(100),await this.setDTRWebUSB(!0),await this.setRTSWebUSB(!1),await this.sleep(100),await this.setRTSWebUSB(!0),await this.setDTRWebUSB(!1),await this.setRTSWebUSB(!0),await this.sleep(100),await this.setDTRWebUSB(!1),await this.setRTSWebUSB(!1),await this.sleep(200)}async hardResetUSBJTAGSerialInvertedDTRWebUSB(){await this.setRTSWebUSB(!1),await this.setDTRWebUSB(!0),await this.sleep(100),await this.setDTRWebUSB(!1),await this.setRTSWebUSB(!1),await this.sleep(100),await this.setRTSWebUSB(!0),await this.setDTRWebUSB(!0),await this.setRTSWebUSB(!0),await this.sleep(100),await this.setDTRWebUSB(!0),await this.setRTSWebUSB(!1),await this.sleep(200)}async hardResetClassicWebUSB(){await this.setDTRWebUSB(!1),await this.setRTSWebUSB(!0),await this.sleep(100),await this.setDTRWebUSB(!0),await this.setRTSWebUSB(!1),await this.sleep(50),await this.setDTRWebUSB(!1),await this.sleep(200)}async hardResetUnixTightWebUSB(){await this.setDTRandRTSWebUSB(!1,!1),await this.setDTRandRTSWebUSB(!0,!0),await this.setDTRandRTSWebUSB(!1,!0),await this.sleep(100),await this.setDTRandRTSWebUSB(!0,!1),await this.sleep(50),await this.setDTRandRTSWebUSB(!1,!1),await this.setDTRWebUSB(!1),await this.sleep(200)}async hardResetClassicLongDelayWebUSB(){await this.setDTRWebUSB(!1),await this.setRTSWebUSB(!0),await this.sleep(500),await this.setDTRWebUSB(!0),await this.setRTSWebUSB(!1),await this.sleep(200),await this.setDTRWebUSB(!1),await this.sleep(500)}async hardResetClassicShortDelayWebUSB(){await this.setDTRWebUSB(!1),await this.setRTSWebUSB(!0),await this.sleep(50),await this.setDTRWebUSB(!0),await this.setRTSWebUSB(!1),await this.sleep(25),await this.setDTRWebUSB(!1),await this.sleep(100)}async hardResetInvertedWebUSB(){await this.setDTRWebUSB(!0),await this.setRTSWebUSB(!1),await this.sleep(100),await this.setDTRWebUSB(!1),await this.setRTSWebUSB(!0),await this.sleep(50),await this.setDTRWebUSB(!0),await this.sleep(200)}async hardResetInvertedDTRWebUSB(){await this.setDTRWebUSB(!0),await this.setRTSWebUSB(!0),await this.sleep(100),await this.setDTRWebUSB(!1),await this.setRTSWebUSB(!1),await this.sleep(50),await this.setDTRWebUSB(!0),await this.sleep(200)}async hardResetInvertedRTSWebUSB(){await this.setDTRWebUSB(!1),await this.setRTSWebUSB(!1),await this.sleep(100),await this.setDTRWebUSB(!0),await this.setRTSWebUSB(!0),await this.sleep(50),await this.setDTRWebUSB(!1),await this.sleep(200)}isWebUSB(){return!0===this.port.isWebUSB}async connectWithResetStrategies(){const t=this.port.getInfo(),e=4097===t.usbProductId,i=12346===t.usbVendorId,a=[],r=this,n=!e&&!i;if(this.isWebUSB()){const s=4292===t.usbVendorId,h=6790===t.usbVendorId,o=12346===t.usbVendorId&&2===t.usbProductId;(e||i)&&(o?(a.push({name:"USB-JTAG/Serial (WebUSB) - ESP32-S2",fn:async()=>await r.hardResetUSBJTAGSerialWebUSB()}),a.push({name:"USB-JTAG/Serial Inverted DTR (WebUSB) - ESP32-S2",fn:async()=>await r.hardResetUSBJTAGSerialInvertedDTRWebUSB()}),a.push({name:"UnixTight (WebUSB) - ESP32-S2 CDC",fn:async()=>await r.hardResetUnixTightWebUSB()}),a.push({name:"Classic (WebUSB) - ESP32-S2 CDC",fn:async()=>await r.hardResetClassicWebUSB()})):(a.push({name:"USB-JTAG/Serial Inverted DTR (WebUSB)",fn:async()=>await r.hardResetUSBJTAGSerialInvertedDTRWebUSB()}),a.push({name:"USB-JTAG/Serial (WebUSB)",fn:async()=>await r.hardResetUSBJTAGSerialWebUSB()}),a.push({name:"Inverted DTR Classic (WebUSB)",fn:async()=>await r.hardResetInvertedDTRWebUSB()}))),n&&(h?(a.push({name:"UnixTight (WebUSB) - CH34x",fn:async()=>await r.hardResetUnixTightWebUSB()}),a.push({name:"Classic (WebUSB) - CH34x",fn:async()=>await r.hardResetClassicWebUSB()}),a.push({name:"Inverted Both (WebUSB) - CH34x",fn:async()=>await r.hardResetInvertedWebUSB()}),a.push({name:"Inverted RTS (WebUSB) - CH34x",fn:async()=>await r.hardResetInvertedRTSWebUSB()}),a.push({name:"Inverted DTR (WebUSB) - CH34x",fn:async()=>await r.hardResetInvertedDTRWebUSB()})):s?(a.push({name:"UnixTight (WebUSB) - CP2102",fn:async()=>await r.hardResetUnixTightWebUSB()}),a.push({name:"Classic (WebUSB) - CP2102",fn:async()=>await r.hardResetClassicWebUSB()}),a.push({name:"Inverted Both (WebUSB) - CP2102",fn:async()=>await r.hardResetInvertedWebUSB()}),a.push({name:"Inverted RTS (WebUSB) - CP2102",fn:async()=>await r.hardResetInvertedRTSWebUSB()}),a.push({name:"Inverted DTR (WebUSB) - CP2102",fn:async()=>await r.hardResetInvertedDTRWebUSB()})):(a.push({name:"UnixTight (WebUSB)",fn:async()=>await r.hardResetUnixTightWebUSB()}),a.push({name:"Classic (WebUSB)",fn:async function(){return await r.hardResetClassicWebUSB()}}),a.push({name:"Inverted Both (WebUSB)",fn:async function(){return await r.hardResetInvertedWebUSB()}}),a.push({name:"Inverted RTS (WebUSB)",fn:async function(){return await r.hardResetInvertedRTSWebUSB()}}),a.push({name:"Inverted DTR (WebUSB)",fn:async function(){return await r.hardResetInvertedDTRWebUSB()}}))),s||o||(6790!==t.usbVendorId&&a.push({name:"Classic (WebUSB)",fn:async function(){return await r.hardResetClassicWebUSB()}}),a.push({name:"UnixTight (WebUSB)",fn:async function(){return await r.hardResetUnixTightWebUSB()}}),a.push({name:"Classic Long Delay (WebUSB)",fn:async function(){return await r.hardResetClassicLongDelayWebUSB()}}),a.push({name:"Classic Short Delay (WebUSB)",fn:async function(){return await r.hardResetClassicShortDelayWebUSB()}}),e||i||a.push({name:"USB-JTAG/Serial fallback (WebUSB)",fn:async function(){return await r.hardResetUSBJTAGSerialWebUSB()}}))}else(e||i)&&a.push({name:"USB-JTAG/Serial",fn:async function(){return await r.hardResetUSBJTAGSerial()}}),a.push({name:"UnixTight",fn:async function(){return await r.hardResetUnixTight()}}),e||i||a.push({name:"USB-JTAG/Serial (fallback)",fn:async function(){return await r.hardResetUSBJTAGSerial()}});let h=null;for(const t of a)try{if(!this.connected||!this.port.writable){this.logger.log(`Port disconnected, skipping ${t.name} reset`);continue}if(this._abandonCurrentOperation=!1,await t.fn(),n){if(await this.syncWithTimeout(2e3))return void this.logger.log(`Connected USB Serial successfully with ${t.name} reset.`);throw new Error("Sync timeout or abandoned")}{const e=this.sync(),i=new Promise((t,e)=>setTimeout(()=>e(new Error("Sync timeout")),1e3));try{return await Promise.race([e,i]),void this.logger.log(`Connected CDC/JTAG successfully with ${t.name} reset.`)}catch(t){throw new Error("Sync timeout or abandoned")}}}catch(e){if(h=e,this.logger.log(`${t.name} reset failed: ${e.message}`),this._abandonCurrentOperation=!0,await s(100),!this.connected||!this.port.writable){this.logger.log("Port disconnected during reset attempt");break}this._clearInputBuffer(),await this.drainInputBuffer(200),await this.flushSerialBuffers()}throw this._abandonCurrentOperation=!1,new Error(`Couldn't sync to ESP. Try resetting manually. Last error: ${null==h?void 0:h.message}`)}async hardReset(t=!1){t?4097===this.port.getInfo().usbProductId?(await this.hardResetUSBJTAGSerial(),this.logger.log("USB-JTAG/Serial reset.")):this.isWebUSB()?(await this.hardResetClassicWebUSB(),this.logger.log("Classic reset (WebUSB/Android).")):(await this.hardResetClassic(),this.logger.log("Classic reset.")):this.isWebUSB()?(await this.setRTSWebUSB(!0),await this.sleep(200),await this.setRTSWebUSB(!1),await this.sleep(200),this.logger.log("Hard reset (WebUSB).")):(await this.setRTS(!0),await this.sleep(100),await this.setRTS(!1),this.logger.log("Hard reset.")),await new Promise(t=>setTimeout(t,1e3))}macAddr(){const t=new Array(6).fill(0),e=this._efuses[0],i=this._efuses[1],a=this._efuses[2],s=this._efuses[3];let r;if(this.chipFamily==d){if(0!=s)r=[s>>16&255,s>>8&255,255&s];else if(i>>16&255){if(1!=(i>>16&255))throw new Error("Couldnt determine OUI");r=[172,208,116]}else r=[24,254,52];t[0]=r[0],t[1]=r[1],t[2]=r[2],t[3]=i>>8&255,t[4]=255&i,t[5]=e>>24&255}else if(this.chipFamily==u)t[0]=a>>8&255,t[1]=255&a,t[2]=i>>24&255,t[3]=i>>16&255,t[4]=i>>8&255,t[5]=255&i;else{if(this.chipFamily!=c&&this.chipFamily!=_&&this.chipFamily!=f&&this.chipFamily!=g&&this.chipFamily!=p&&this.chipFamily!=w&&this.chipFamily!=m&&this.chipFamily!=b&&this.chipFamily!=S&&this.chipFamily!=y&&this.chipFamily!=B&&this.chipFamily!=R)throw new Error("Unknown chip family");t[0]=i>>8&255,t[1]=255&i,t[2]=e>>24&255,t[3]=e>>16&255,t[4]=e>>8&255,t[5]=255&e}return t}async readRegister(t){this.debug&&this.logger.debug("Reading from Register "+a(t,8));const e=gi("<I",t);await this.sendCommand(10,e);const[i]=await this.getResponse(10);return i}async checkCommand(t,e,i=0,s=3e3){const r=async()=>{s=Math.min(s,X),await this.sendCommand(t,e,i);const[r,n]=await this.getResponse(t,s);if(null===n)throw new Error("Didn't get enough status bytes");let h=n,o=0;if(this.IS_STUB||this.chipFamily==d?o=2:[u,c,_,f,g,p,w,m,b,S,y,B,R].includes(this.chipFamily)||20===t?o=4:[2,4].includes(h.length)?o=h.length:(o=2,this.logger.debug(`Unknown chip family, defaulting to 2-byte status (opcode: ${a(t)}, data.length: ${h.length})`)),h.length<o)throw new Error("Didn't get enough status bytes");const l=h.slice(-o,h.length);if(h=h.slice(0,-o),this.debug&&(this.logger.debug("status",l),this.logger.debug("value",r),this.logger.debug("data",h)),1==l[0])throw 5==l[1]?(await this.drainInputBuffer(200),new Error("Invalid (unsupported) command "+a(t))):new Error("Command failure error code "+a(l[1]));return[r,h]};return this._commandLock=this._commandLock.then(r,r),this._commandLock}async sendCommand(e,i,a=0){const s=t([...gi("<BBHI",0,e,i.length,a),...i]);this.debug&&this.logger.debug(`Writing ${s.length} byte${1==s.length?"":"s"}:`,s),await this.writeToStream(s)}async readPacket(t){let e=null,r=!1;if(this._isCDCDevice){const n=Date.now();for(;;){if(this._abandonCurrentOperation)throw new rt("Operation abandoned (reset strategy timeout)");if(Date.now()-n>t){throw new rt("Timed out waiting for packet "+(null===e?"header":"content"))}if(0!==this._inputBufferAvailable)for(;this._inputBufferAvailable>0;){if(Date.now()-n>t){throw new rt("Timed out waiting for packet "+(null===e?"header":"content"))}const s=this._readByte();if(null===e){if(192!=s)throw this.debug&&(this.logger.debug("Read invalid data: "+a(s)),this.logger.debug("Remaining data in serial buffer: "+i(this._inputBuffer))),new rt("Invalid head of packet ("+a(s)+")");e=[]}else if(r)if(r=!1,220==s)e.push(192);else{if(221!=s)throw this.debug&&(this.logger.debug("Read invalid data: "+a(s)),this.logger.debug("Remaining data in serial buffer: "+i(this._inputBuffer))),new rt("Invalid SLIP escape (0xdb, "+a(s)+")");e.push(219)}else if(219==s)r=!0;else{if(192==s)return this.debug&&this.logger.debug("Received full packet: "+i(e)),this._compactInputBuffer(),e;e.push(s)}}else await s(1)}}else{let n=[];for(;;){if(this._abandonCurrentOperation)throw new rt("Operation abandoned (reset strategy timeout)");const h=Date.now();for(n=[];Date.now()-h<t;){if(this._inputBufferAvailable>0){n.push(this._readByte());break}await s(1)}if(0==n.length){throw new rt("Timed out waiting for packet "+(null===e?"header":"content"))}this.debug&&this.logger.debug("Read "+n.length+" bytes: "+i(n));for(const t of n)if(null===e){if(192!=t)throw this.debug&&(this.logger.debug("Read invalid data: "+a(t)),this.logger.debug("Remaining data in serial buffer: "+i(this._inputBuffer))),new rt("Invalid head of packet ("+a(t)+")");e=[]}else if(r)if(r=!1,220==t)e.push(192);else{if(221!=t)throw this.debug&&(this.logger.debug("Read invalid data: "+a(t)),this.logger.debug("Remaining data in serial buffer: "+i(this._inputBuffer))),new rt("Invalid SLIP escape (0xdb, "+a(t)+")");e.push(219)}else if(219==t)r=!0;else{if(192==t)return this.debug&&this.logger.debug("Received full packet: "+i(e)),this._compactInputBuffer(),e;e.push(t)}}}}async getResponse(t,e=3e3){for(let i=0;i<100;i++){const i=await this.readPacket(e);if(i.length<8)continue;const[s,r,,n]=pi("<BBHI",i.slice(0,8));if(1!=s)continue;const h=i.slice(8);if(null==t||r==t)return[n,h];if(0!=h[0]&&5==h[1])throw await this.drainInputBuffer(200),new Error(`Invalid (unsupported) command ${a(t)}`)}throw new Error("Response doesn't match request")}checksum(t,e=239){for(const i of t)e^=i;return e}async setBaudrate(t){if(this.chipFamily==d)throw new Error("Changing baud rate is not supported on the ESP8266");try{const e=gi("<II",t,this.IS_STUB?h:0);await this.checkCommand(15,e)}catch(e){throw this.logger.error(`Baudrate change error: ${e}`),new Error(`Unable to change the baud rate to ${t}: No response from set baud rate command.`)}this._parent?await this._parent.reconfigurePort(t):await this.reconfigurePort(t),await s(Q),this._parent?this._parent._currentBaudRate=t:this._currentBaudRate=t;const e=this._parent?this._parent._maxUSBSerialBaudrate:this._maxUSBSerialBaudrate;e&&t>e&&(this.logger.log(`⚠️ WARNING: Baudrate ${t} exceeds USB-Serial chip limit (${e})!`),this.logger.log("⚠️ This may cause data corruption or connection failures!")),this.logger.log(`Changed baud rate to ${t}`)}async reconfigurePort(t){var e;this._isReconfiguring=!0;try{try{await this._writeChain}catch(t){this.logger.debug(`Pending write error during reconfigure: ${t}`)}if(this.isWebUSB()){const e=this.port.getInfo(),i=6790===e.usbVendorId&&21971===e.usbProductId;if(!i&&"function"==typeof this.port.setBaudRate)return await this.port.setBaudRate(t),void await s(100)}if(this._writer){try{this._writer.releaseLock()}catch(t){this.logger.debug(`Writer release error during reconfigure: ${t}`)}this._writer=void 0}await(null===(e=this._reader)||void 0===e?void 0:e.cancel()),await this.port.close(),await this.port.open({baudRate:t}),await this.flushSerialBuffers(),this.readLoop()}catch(e){throw this.logger.error(`Reconfigure port error: ${e}`),new Error(`Unable to change the baud rate to ${t}: ${e}`)}finally{this._isReconfiguring=!1}}async syncWithTimeout(t){const e=Date.now();for(let i=0;i<5;i++){if(Date.now()-e>t)return!1;if(this._abandonCurrentOperation)return!1;this._clearInputBuffer();try{if(await this._sync())return await s(Q),!0}catch(t){if(this._abandonCurrentOperation)return!1}await s(Q)}return!1}async sync(){for(let t=0;t<5;t++){this._clearInputBuffer();if(await this._sync())return await s(Q),!0;await s(Q)}throw new Error("Couldn't sync to ESP. Try resetting.")}async _sync(){await this.sendCommand(8,l);for(let t=0;t<8;t++)try{const[,t]=await this.getResponse(8,Q);if(t.length>1&&0==t[0]&&0==t[1])return!0}catch(e){this.debug&&this.logger.debug(`Sync attempt ${t+1} failed: ${e}`)}return!1}getFlashWriteSize(){return this.IS_STUB?16384:1024}async flashData(t,e,i=0,s=!1){if(t.byteLength>=8){const e=Array.from(new Uint8Array(t,0,4)),i=e[0],s=e[2],r=e[3];this.logger.log(`Image header, Magic=${a(i)}, FlashMode=${a(s)}, FlashSizeFreq=${a(r)}`)}const r=t.byteLength;let n,h=0,o=K;s?(n=_i(new Uint8Array(t),{level:9}).buffer,h=n.byteLength,this.logger.log(`Writing data with filesize: ${r}. Compressed Size: ${h}`),o=await this.flashDeflBegin(r,h,i)):(this.logger.log(`Writing data with filesize: ${r}`),n=t,await this.flashBegin(r,i));let l=[],d=0,u=0,c=0;const _=Date.now(),f=this.getFlashWriteSize(),g=s?h:r;for(;g-c>0;)this.debug&&this.logger.log(`Writing at ${a(i+d*f,8)} `),g-c>=f?l=Array.from(new Uint8Array(n,c,f)):(l=Array.from(new Uint8Array(n,c,g-c)),s||(l=l.concat(new Array(f-l.length).fill(255)))),s?await this.flashDeflBlock(l,d,o):await this.flashBlock(l,d),d+=1,u+=s?Math.round(l.length*r/h):l.length,c+=f,e(Math.min(u,r),r);this.logger.log("Took "+(Date.now()-_)+"ms to write "+g+" bytes"),this.IS_STUB&&(await this.flashBegin(0,0),s?await this.flashDeflFinish():await this.flashFinish())}async flashBlock(t,e,i=3e3){await this.checkCommand(3,gi("<IIII",t.length,e,0,0).concat(t),this.checksum(t),i)}async flashDeflBlock(t,e,i=3e3){await this.checkCommand(17,gi("<IIII",t.length,e,0,0).concat(t),this.checksum(t),i)}async flashBegin(t=0,e=0,i=!1){let s;await this.flushSerialBuffers();const r=this.getFlashWriteSize();!this.IS_STUB&&[u,c,_,f,g,p,w,m,b,S,y,B,R].includes(this.chipFamily)&&await this.checkCommand(13,new Array(8).fill(0));const n=Math.floor((t+r-1)/r);s=this.chipFamily==d?this.getEraseSize(e,t):t;const h=this.IS_STUB?K:at(tt,t),o=Date.now();let l=gi("<IIII",s,n,r,e);return this.chipFamily!=u&&this.chipFamily!=c&&this.chipFamily!=_&&this.chipFamily!=f&&this.chipFamily!=g&&this.chipFamily!=p&&this.chipFamily!=w&&this.chipFamily!=m&&this.chipFamily!=b&&this.chipFamily!=S&&this.chipFamily!=y&&this.chipFamily!=B&&this.chipFamily!=R||(l=l.concat(gi("<I",i?1:0))),this.logger.log("Erase size "+s+", blocks "+n+", block size "+a(r,4)+", offset "+a(e,4)+", encrypted "+(i?"yes":"no")),await this.checkCommand(2,l,0,h),0==t||this.IS_STUB||this.logger.log("Took "+(Date.now()-o)+"ms to erase "+n+" bytes"),n}async flashDeflBegin(t=0,e=0,i=0){const a=this.getFlashWriteSize(),s=Math.floor((e+a-1)/a),r=Math.floor((t+a-1)/a);let n=0,h=0;this.IS_STUB?(n=t,h=at(tt,n)):(n=r*a,h=K);const o=gi("<IIII",n,s,a,i);return await this.checkCommand(16,o,0,h),h}async flashFinish(){const t=gi("<I",1);await this.checkCommand(4,t)}async flashDeflFinish(){const t=gi("<I",1);await this.checkCommand(18,t)}getBootloaderOffset(){return st(this.getChipFamily()).flashOffs}async flashId(){return await this.runSpiFlashCommand(159,[],24)}getChipFamily(){return this._parent?this._parent.chipFamily:this.chipFamily}async writeRegister(t,e,i=4294967295,a=0,s=0){let r=gi("<IIII",t,e,i,a);s>0&&(r=r.concat(gi("<IIII",st(this.getChipFamily()).uartDateReg,0,0,s))),await this.checkCommand(9,r)}async setDataLengths(t,e,i){if(-1!=t.mosiDlenOffs){const a=t.regBase+t.mosiDlenOffs,s=t.regBase+t.misoDlenOffs;e>0&&await this.writeRegister(a,e-1),i>0&&await this.writeRegister(s,i-1)}else{const a=t.regBase+t.usr1Offs,s=(0==i?0:i-1)<<8|(0==e?0:e-1)<<17;await this.writeRegister(a,s)}}async waitDone(t,e){for(let i=0;i<10;i++){if(0==(await this.readRegister(t)&e))return}throw Error("SPI command did not complete in time")}async runSpiFlashCommand(t,e,i=0){const s=st(this.getChipFamily()),r=s.regBase,n=r,h=r+s.usrOffs,o=r+s.usr2Offs,l=r+s.w0Offs,d=1<<18;if(i>32)throw new Error("Reading more than 32 bits back from a SPI flash operation is unsupported");if(e.length>64)throw new Error("Writing more than 64 bytes of data with one SPI command is unsupported");const u=8*e.length,c=await this.readRegister(h),_=await this.readRegister(o);let f=1<<31;if(i>0&&(f|=268435456),u>0&&(f|=134217728),await this.setDataLengths(s,u,i),await this.writeRegister(h,f),await this.writeRegister(o,7<<28|t),0==u)await this.writeRegister(l,0);else{const t=(4-e.length%4)%4;e=e.concat(new Array(t).fill(0));const i=pi("I".repeat(Math.floor(e.length/4)),e);let s=l;this.logger.debug(`Words Length: ${i.length}`);for(const t of i)this.logger.debug(`Writing word ${a(t)} to register offset ${a(s)}`),await this.writeRegister(s,t),s+=4}await this.writeRegister(n,d),await this.waitDone(n,d);const g=await this.readRegister(l);return await this.writeRegister(h,c),await this.writeRegister(o,_),g}async detectFlashSize(){this.logger.log("Detecting Flash Size");const t=await this.flashId(),e=255&t,i=t>>16&255;this.logger.log(`FlashId: ${a(t)}`),this.logger.log(`Flash Manufacturer: ${e.toString(16)}`),this.logger.log(`Flash Device: ${(t>>8&255).toString(16)}${i.toString(16)}`),this.flashSize=r[i],this.logger.log(`Auto-detected Flash size: ${this.flashSize}`)}getEraseSize(t,e){const i=n,a=Math.floor((e+i-1)/i);let s=16-Math.floor(t/i)%16;return a<s&&(s=a),a<2*s?Math.floor((a+1)/2*i):(a-s)*i}async memBegin(t,e,i,a){return await this.checkCommand(5,gi("<IIII",t,e,i,a))}async memBlock(t,e){return await this.checkCommand(7,gi("<IIII",t.length,e,0,0).concat(t),this.checksum(t))}async memFinish(t=0){const e=this.IS_STUB?K:500,i=gi("<II",0==t?1:0,t);return await this.checkCommand(6,i,0,e)}async runStub(t=!1){const e=await nt(this.chipFamily,this.chipRevision);if(null===e)return this.logger.log(`Stub flasher is not yet supported on ${this.chipName}, using ROM loader`),this;const i=2048;this.logger.log("Uploading stub...");for(const t of["text","data"]){const a=e[t],s=e[`${t}_start`],r=a.length,n=Math.floor((r+i-1)/i);await this.memBegin(r,n,i,s);for(const t of Array(n).keys()){const e=t*i;let s=e+i;s>r&&(s=r),await this.memBlock(a.slice(e,s),t)}}await this.memFinish(e.entry);const a=await this.readPacket(500),s=String.fromCharCode(...a);if("OHAI"!=s)throw new Error("Failed to start stub. Unexpected response: "+s);this.logger.log("Stub is now running...");const r=new mi(this.port,this.logger,this);return t||await r.detectFlashSize(),r}get _writer(){return this._parent?this._parent._writer:this.__writer}set _writer(t){this._parent?this._parent._writer=t:this.__writer=t}get _writeChain(){return this._parent?this._parent._writeChain:this.__writeChain}set _writeChain(t){this._parent?this._parent._writeChain=t:this.__writeChain=t}async writeToStream(t){if(this.port.writable){if(this._isReconfiguring)throw new Error("Cannot write during port reconfiguration");this._writeChain=this._writeChain.then(async()=>{if(!this.port.writable)throw new Error("Port became unavailable during write");if(!this._writer)try{this._writer=this.port.writable.getWriter()}catch(t){throw this.logger.error(`Failed to get writer: ${t}`),t}await this._writer.write(new Uint8Array(t))},async()=>{if(this.logger.debug("Previous write failed, attempting recovery for current write"),!this.port.writable)throw new Error("Port became unavailable during write");if(!this._writer)try{this._writer=this.port.writable.getWriter()}catch(t){throw this.logger.debug(`Failed to get writer in recovery: ${t}`),new Error("Cannot acquire writer lock")}await this._writer.write(new Uint8Array(t))}).catch(t=>{if(this.logger.error(`Write error: ${t}`),this._writer){try{this._writer.releaseLock()}catch{}this._writer=void 0}throw t}),await this._writeChain}else this.logger.debug("Port writable stream not available, skipping write")}async disconnect(){if(this._parent)await this._parent.disconnect();else if(this.port.writable){try{await this._writeChain}catch(t){this.logger.debug(`Pending write error during disconnect: ${t}`)}if(this._writer){try{await this._writer.close(),this._writer.releaseLock()}catch(t){this.logger.debug(`Writer close/release error: ${t}`)}this._writer=void 0}else try{const t=this.port.writable.getWriter();await t.close(),t.releaseLock()}catch(t){this.logger.debug(`Direct writer close error: ${t}`)}await new Promise(t=>{if(!this._reader)return void t(void 0);const e=setTimeout(()=>{this.logger.debug("Disconnect timeout - forcing resolution"),t(void 0)},1e3);this.addEventListener("disconnect",()=>{clearTimeout(e),t(void 0)},{once:!0});try{this._reader.cancel()}catch(i){this.logger.debug(`Reader cancel error: ${i}`),clearTimeout(e),t(void 0)}}),this.connected=!1;try{await this.port.close(),this.logger.debug("Port closed successfully")}catch(t){this.logger.debug(`Port close error: ${t}`)}}else this.logger.debug("Port already closed, skipping disconnect")}async reconnect(){if(this._parent)await this._parent.reconnect();else try{this.logger.log("Reconnecting serial port..."),this.connected=!1,this.__inputBuffer=[],this.__inputBufferReadIndex=0;try{await this._writeChain}catch(t){this.logger.debug(`Pending write error during reconnect: ${t}`)}if(this._isReconfiguring=!0,this._writer){try{this._writer.releaseLock()}catch(t){this.logger.debug(`Writer release error during reconnect: ${t}`)}this._writer=void 0}if(this._reader){try{await this._reader.cancel()}catch(t){this.logger.debug(`Reader cancel error: ${t}`)}this._reader=void 0}try{await this.port.close(),this.logger.log("Port closed")}catch(t){this.logger.debug(`Port close error: ${t}`)}this.logger.debug("Opening port...");try{await this.port.open({baudRate:h}),this.connected=!0}catch(t){throw new Error(`Failed to open port: ${t}`)}if(!this.port.readable||!this.port.writable)throw new Error(`Port streams not available after open (readable: ${!!this.port.readable}, writable: ${!!this.port.writable})`);this._isReconfiguring=!1;const t=this.chipFamily,e=this.chipName,i=this.chipRevision,a=this.chipVariant,s=this.flashSize;if(await this.hardReset(!0),this._parent||(this.__inputBuffer=[],this.__inputBufferReadIndex=0,this.__totalBytesRead=0,this.readLoop()),await this.flushSerialBuffers(),await this.sync(),this.chipFamily=t,this.chipName=e,this.chipRevision=i,this.chipVariant=a,this.flashSize=s,this.logger.debug(`Reconnect complete (chip: ${this.chipName})`),!this.port.writable||!this.port.readable)throw new Error("Port not ready after reconnect");const r=await this.runStub(!0);if(this.logger.debug("Stub loaded"),this._currentBaudRate!==h&&(await r.setBaudrate(this._currentBaudRate),!this.port.writable||!this.port.readable))throw new Error(`Port not ready after baudrate change (readable: ${!!this.port.readable}, writable: ${!!this.port.writable})`);this.IS_STUB=!0,this.logger.debug("Reconnection successful")}catch(t){throw this._isReconfiguring=!1,t}}async drainInputBuffer(t=200){await s(t);let e=0;const i=Date.now();for(;e<112&&Date.now()-i<100;)if(this._inputBufferAvailable>0){void 0!==this._readByte()&&e++}else await s(1);e>0&&this.logger.debug(`Drained ${e} bytes from input buffer`),this._parent||(this.__inputBuffer=[],this.__inputBufferReadIndex=0)}async flushSerialBuffers(){this._parent||(this.__inputBuffer=[],this.__inputBufferReadIndex=0),await s(Q),this._parent||(this.__inputBuffer=[],this.__inputBufferReadIndex=0),this.logger.debug("Serial buffers flushed")}async readFlash(e,i,a){if(!this.IS_STUB)throw new Error("Reading flash is only supported in stub mode. Please run runStub() first.");let r;await this.flushSerialBuffers(),this.logger.log(`Reading ${i} bytes from flash at address 0x${e.toString(16)}...`),this.isWebUSB()&&(this._isCDCDevice?(this._adaptiveBlockMultiplier=8,this._adaptiveMaxInFlightMultiplier=8,this._consecutiveSuccessfulChunks=0,this.logger.debug(`CDC device - Initialized: blockMultiplier=${this._adaptiveBlockMultiplier}, maxInFlightMultiplier=${this._adaptiveMaxInFlightMultiplier}`)):(this._adaptiveBlockMultiplier=1,this._adaptiveMaxInFlightMultiplier=1,this._consecutiveSuccessfulChunks=0,this.logger.debug("Non-CDC device - Fixed values: blockSize=31, maxInFlight=31"))),r=this.isWebUSB()?16384:262144;let n=new Uint8Array(0),h=e,o=i;for(;o>0;){const e=Math.min(r,o);let l=!1,d=0;const u=5;let c=!1;for(;!l&&d<=u;){let i=new Uint8Array(0),a=0;try{let r,o;if(0===d&&this.logger.debug(`Reading chunk at 0x${h.toString(16)}, size: 0x${e.toString(16)}`),this.isWebUSB()){const t=this.port.maxTransferSize||64,e=Math.floor((t-2)/2);r=e*this._adaptiveBlockMultiplier,o=e*this._adaptiveMaxInFlightMultiplier}else{const t=63;r=65*t,o=130*t}const u=gi("<IIII",h,e,r,o),[c]=await this.checkCommand(210,u);if(0!=c)throw new Error("Failed to read memory: "+c);for(;i.length<e;){let r;try{r=await this.readPacket(100)}catch(t){if(t instanceof rt){this.logger.debug(`SLIP read error at ${i.length} bytes: ${t.message}`);try{const t=[192,192];await this.writeToStream(t),this.logger.debug("Sent abort frame to stub"),await s(50)}catch(t){this.logger.debug(`Abort frame error: ${t}`)}if(await this.drainInputBuffer(200),i.length>=e)break}throw t}if(r&&r.length>0){const s=new Uint8Array(r),n=new Uint8Array(i.length+s.length);n.set(i),n.set(s,i.length),i=n;if(i.length>=e||i.length>=a+o){const e=gi("<I",i.length),s=t(e);await this.writeToStream(s),a=i.length}}}const _=new Uint8Array(n.length+i.length);if(_.set(n),_.set(i,n.length),n=_,l=!0,this.isWebUSB()&&this._isCDCDevice&&0===d&&(this._consecutiveSuccessfulChunks++,this._consecutiveSuccessfulChunks>=2)){const t=this.port.maxTransferSize||64,e=Math.floor((t-2)/2),i=8,a=8;let s=!1;if(this._adaptiveBlockMultiplier<i?(this._adaptiveBlockMultiplier=Math.min(2*this._adaptiveBlockMultiplier,i),s=!0):this._adaptiveMaxInFlightMultiplier<a&&(this._adaptiveMaxInFlightMultiplier=Math.min(2*this._adaptiveMaxInFlightMultiplier,a),s=!0),s){const t=e*this._adaptiveBlockMultiplier,i=e*this._adaptiveMaxInFlightMultiplier;this.logger.debug(`Speed increased: blockSize=${t}, maxInFlight=${i}`),this._lastAdaptiveAdjustment=Date.now()}this._consecutiveSuccessfulChunks=0}}catch(t){if(d++,this.isWebUSB()&&this._isCDCDevice&&1===d)if(this._adaptiveBlockMultiplier>1||this._adaptiveMaxInFlightMultiplier>1){this._adaptiveBlockMultiplier=1,this._adaptiveMaxInFlightMultiplier=1,this._consecutiveSuccessfulChunks=0;const t=this.port.maxTransferSize||64,e=Math.floor((t-2)/2),i=e*this._adaptiveBlockMultiplier,a=e*this._adaptiveMaxInFlightMultiplier;this.logger.debug(`Error at higher speed - reduced to minimum: blockSize=${i}, maxInFlight=${a}`)}else this.logger.debug("Error at minimum speed (blockSize=31, maxInFlight=31) - not a speed issue");if(!(t instanceof rt))throw t;if(d<=u){this.logger.log(`${t.message} at 0x${h.toString(16)}. Draining buffer and retrying (attempt ${d}/${u})...`);try{await this.drainInputBuffer(200),await this.flushSerialBuffers(),await s(Q)}catch(t){this.logger.debug(`Buffer drain error: ${t}`)}}else{if(c)throw new Error(`Failed to read chunk at 0x${h.toString(16)} after ${u} retries and recovery attempt`);c=!0,this.logger.log(`All retries exhausted at 0x${h.toString(16)}. Attempting recovery (close and reopen port)...`);try{await this.reconnect(),this.logger.log("Deep recovery successful. Resuming read from current position..."),d=0;continue}catch(t){throw new Error(`Failed to read chunk at 0x${h.toString(16)} after ${u} retries and recovery failed: ${t}`)}}}}a&&a(new Uint8Array(e),n.length,i),h+=e,o-=e,this.logger.debug(`Total progress: 0x${n.length.toString(16)} from 0x${i.toString(16)} bytes`)}return n}}class mi extends wi{constructor(){super(...arguments),this.IS_STUB=!0}async memBegin(t,e,i,s){const r=await nt(this.chipFamily,this.chipRevision);if(null===r)return[0,[]];const n=s,h=s+t;this.logger.debug(`Load range: ${a(n,8)}-${a(h,8)}`),this.logger.debug(`Stub data: ${a(r.data_start,8)}, len: ${r.data.length}, text: ${a(r.text_start,8)}, len: ${r.text.length}`);for(const[t,e]of[[r.data_start,r.data_start+r.data.length],[r.text_start,r.text_start+r.text.length]])if(n<e&&h>t)throw new Error("Software loader is resident at "+a(t,8)+"-"+a(e,8)+". Can't load binary at overlapping address range "+a(n,8)+"-"+a(h,8)+". Try changing the binary loading address.");return[0,[]]}async eraseFlash(){await this.checkCommand(208,[],0,Y)}async eraseRegion(t,e){if(t<0)throw new Error(`Invalid offset: ${t} (must be non-negative)`);if(e<0)throw new Error(`Invalid size: ${e} (must be non-negative)`);if(0===e)return void this.logger.log("eraseRegion: size is 0, skipping erase");if(t%n!==0)throw new Error(`Offset ${t} (0x${t.toString(16)}) is not aligned to flash sector size 4096 (0x${n.toString(16)})`);if(e%n!==0)throw new Error(`Size ${e} (0x${e.toString(16)}) is not aligned to flash sector size 4096 (0x${n.toString(16)})`);const i=4294967295;if(t>i)throw new Error(`Offset ${t} exceeds maximum value 4294967295`);if(e>i)throw new Error(`Size ${e} exceeds maximum value 4294967295`);if(t+e>i)throw new Error(`Region end (offset + size = ${t+e}) exceeds maximum addressable range 4294967295`);const a=at(tt,e),s=gi("<II",t,e);await this.checkCommand(209,s,0,a)}}const bi=async t=>{let e;const i=globalThis.requestSerialPort;if("function"==typeof i)e=await i();else{if(!navigator.serial)throw new Error("Web Serial API is not supported in this browser. Please use Chrome, Edge, or Opera on desktop, or Chrome on Android. Note: The page must be served over HTTPS or localhost.");e=await navigator.serial.requestPort()}return e.readable&&e.writable||await e.open({baudRate:h}),new wi(e,t)},Si=async(t,e)=>{if(!t)throw new Error("Port is required");return t.readable&&t.writable||await t.open({baudRate:h}),new wi(t,e)};export{Y as CHIP_ERASE_TIMEOUT,u as CHIP_FAMILY_ESP32,f as CHIP_FAMILY_ESP32C2,g as CHIP_FAMILY_ESP32C3,p as CHIP_FAMILY_ESP32C5,w as CHIP_FAMILY_ESP32C6,m as CHIP_FAMILY_ESP32C61,b as CHIP_FAMILY_ESP32H2,y as CHIP_FAMILY_ESP32H21,S as CHIP_FAMILY_ESP32H4,B as CHIP_FAMILY_ESP32P4,c as CHIP_FAMILY_ESP32S2,_ as CHIP_FAMILY_ESP32S3,R as CHIP_FAMILY_ESP32S31,d as CHIP_FAMILY_ESP8266,K as DEFAULT_TIMEOUT,tt as ERASE_REGION_TIMEOUT_PER_MB,wi as ESPLoader,M as ESP_CHANGE_BAUDRATE,Z as ESP_CHECKSUM_MAGIC,O as ESP_ERASE_FLASH,E as ESP_ERASE_REGION,T as ESP_FLASH_BEGIN,I as ESP_FLASH_DATA,V as ESP_FLASH_DEFL_BEGIN,H as ESP_FLASH_DEFL_DATA,j as ESP_FLASH_DEFL_END,D as ESP_FLASH_END,N as ESP_GET_SECURITY_INFO,x as ESP_MEM_BEGIN,C as ESP_MEM_DATA,k as ESP_MEM_END,q as ESP_RAM_BLOCK,A as ESP_READ_FLASH,W as ESP_READ_REG,P as ESP_SPI_ATTACH,L as ESP_SPI_FLASH_MD5,$ as ESP_SPI_SET_PARAMS,F as ESP_SYNC,z as ESP_WRITE_REG,it as FLASH_READ_TIMEOUT,X as MAX_TIMEOUT,et as MEM_END_ROM_TIMEOUT,G as ROM_INVALID_RECV_MSG,Q as SYNC_TIMEOUT,J as USB_RAM_BLOCK,bi as connect,Si as connectWithPort};
package/js/script.js CHANGED
@@ -12,6 +12,25 @@ let esp32s2ReconnectInProgress = false;
12
12
  let isConnected = false; // Track connection state
13
13
  let isAndroidPlatform = false; // Track if running on Android
14
14
 
15
+ /**
16
+ * Clear all cached data and state on disconnect
17
+ */
18
+ function clearAllCachedData() {
19
+
20
+ // Clear partition list
21
+ partitionList.innerHTML = '';
22
+ partitionList.classList.add('hidden');
23
+
24
+ // Show the Read Partition Table button again
25
+ butReadPartitions.classList.remove('hidden');
26
+
27
+ // Hide ESP8266 info (if it exists)
28
+ const esp8266Info = document.getElementById('esp8266Info');
29
+ if (esp8266Info) {
30
+ esp8266Info.classList.add('hidden');
31
+ }
32
+ }
33
+
15
34
  const baudRates = [2000000, 1500000, 921600, 500000, 460800, 230400, 153600, 128000, 115200];
16
35
  const bufferSize = 512;
17
36
  const colors = ["#00a7e9", "#f89521", "#be1e2d"];
@@ -315,7 +334,10 @@ async function clickConnect() {
315
334
  }
316
335
  toggleUIConnected(false);
317
336
  espStub = undefined;
318
-
337
+
338
+ // Clear all cached data and state
339
+ clearAllCachedData();
340
+
319
341
  return;
320
342
  }
321
343
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tasmota-webserial-esptool",
3
- "version": "9.1.9",
3
+ "version": "9.2.0",
4
4
  "description": "World's first tool for flashing and reading ESP devices on Android mobile devices using WebUSB. Flash & Read ESP devices using WebSerial/WebUSB - up to 10x faster flash read than esptool.py",
5
5
  "main": "dist/index.js",
6
6
  "repository": {
package/src/esp_loader.ts CHANGED
@@ -721,6 +721,15 @@ export class ESPLoader extends EventTarget {
721
721
  await this.port.setSignals({ dataTerminalReady: state });
722
722
  }
723
723
 
724
+ async setDTRandRTS(dtr: boolean, rts: boolean) {
725
+ this.state_DTR = dtr;
726
+ this.state_RTS = rts;
727
+ await this.port.setSignals({
728
+ dataTerminalReady: dtr,
729
+ requestToSend: rts,
730
+ });
731
+ }
732
+
724
733
  /**
725
734
  * @name hardResetUSBJTAGSerial
726
735
  * USB-JTAG/Serial reset for Web Serial (Desktop)
@@ -747,7 +756,7 @@ export class ESPLoader extends EventTarget {
747
756
 
748
757
  /**
749
758
  * @name hardResetClassic
750
- * Classic reset for Web Serial (Desktop)
759
+ * Classic reset for Web Serial (Desktop) DTR = IO0, RTS = EN
751
760
  */
752
761
  async hardResetClassic() {
753
762
  await this.setDTR(false); // IO0=HIGH
@@ -761,6 +770,23 @@ export class ESPLoader extends EventTarget {
761
770
  await this.sleep(200);
762
771
  }
763
772
 
773
+ /**
774
+ * @name hardResetUnixTight
775
+ * Unix Tight reset for Web Serial (Desktop) - sets DTR and RTS simultaneously
776
+ */
777
+ async hardResetUnixTight() {
778
+ await this.setDTRandRTS(true, true);
779
+ await this.setDTRandRTS(false, false);
780
+ await this.setDTRandRTS(false, true); // IO0=HIGH & EN=LOW, chip in reset
781
+ await this.sleep(100);
782
+ await this.setDTRandRTS(true, false); // IO0=LOW & EN=HIGH, chip out of reset
783
+ await this.sleep(50);
784
+ await this.setDTRandRTS(false, false); // IO0=HIGH, done
785
+ await this.setDTR(false); // Needed in some environments to ensure IO0=HIGH
786
+
787
+ await this.sleep(200);
788
+ }
789
+
764
790
  // ============================================================================
765
791
  // WebUSB (Android) - DTR/RTS Signal Handling & Reset Strategies
766
792
  // ============================================================================
@@ -977,10 +1003,12 @@ export class ESPLoader extends EventTarget {
977
1003
  // eslint-disable-next-line @typescript-eslint/no-this-alias
978
1004
  const self = this;
979
1005
 
1006
+ // Detect if this is a USB-Serial chip (needs different sync approach)
1007
+ const isUSBSerialChip = !isUSBJTAGSerial && !isEspressifUSB;
1008
+
980
1009
  // WebUSB (Android) uses different reset methods than Web Serial (Desktop)
981
1010
  if (this.isWebUSB()) {
982
1011
  // For USB-Serial chips (CP2102, CH340, etc.), try inverted strategies first
983
- const isUSBSerialChip = !isUSBJTAGSerial && !isEspressifUSB;
984
1012
 
985
1013
  // Detect specific chip types once
986
1014
  const isCP2102 = portInfo.usbVendorId === 0x10c4;
@@ -1214,11 +1242,11 @@ export class ESPLoader extends EventTarget {
1214
1242
  });
1215
1243
  }
1216
1244
 
1217
- // Strategy: Classic reset
1245
+ // Strategy: UnixTight reset
1218
1246
  resetStrategies.push({
1219
- name: "Classic",
1247
+ name: "UnixTight",
1220
1248
  fn: async function () {
1221
- return await self.hardResetClassic();
1249
+ return await self.hardResetUnixTight();
1222
1250
  },
1223
1251
  });
1224
1252
 
@@ -1249,17 +1277,44 @@ export class ESPLoader extends EventTarget {
1249
1277
 
1250
1278
  await strategy.fn();
1251
1279
 
1252
- // Try to sync after reset with internally time-bounded sync (3 seconds per strategy)
1253
- const syncSuccess = await this.syncWithTimeout(3000);
1280
+ // Try to sync after reset
1281
+ // USB-Serial / native USB chips needs different sync approaches
1254
1282
 
1255
- if (syncSuccess) {
1256
- // Sync succeeded
1257
- this.logger.log(
1258
- `Connected successfully with ${strategy.name} reset.`,
1259
- );
1260
- return;
1283
+ if (isUSBSerialChip) {
1284
+ // USB-Serial chips: Use timeout strategy (2 seconds)
1285
+ // this.logger.log(`USB-Serial chip detected, using sync with timeout.`);
1286
+ const syncSuccess = await this.syncWithTimeout(2000);
1287
+
1288
+ if (syncSuccess) {
1289
+ // Sync succeeded
1290
+ this.logger.log(
1291
+ `Connected USB Serial successfully with ${strategy.name} reset.`,
1292
+ );
1293
+ return;
1294
+ } else {
1295
+ throw new Error("Sync timeout or abandoned");
1296
+ }
1261
1297
  } else {
1262
- throw new Error("Sync timeout or abandoned");
1298
+ // Native USB chips
1299
+ // Note: We use Promise.race with sync() directly instead of syncWithTimeout()
1300
+ // because syncWithTimeout causes CDC/JTAG devices to hang for unknown reasons.
1301
+ // The abandon flag in readPacket() prevents overlapping I/O.
1302
+ // this.logger.log(`Native USB chip detected, using CDC/JTAG sync.`);
1303
+ const syncPromise = this.sync();
1304
+ const timeoutPromise = new Promise<void>((_, reject) =>
1305
+ setTimeout(() => reject(new Error("Sync timeout")), 1000),
1306
+ );
1307
+
1308
+ try {
1309
+ await Promise.race([syncPromise, timeoutPromise]);
1310
+ // Sync succeeded
1311
+ this.logger.log(
1312
+ `Connected CDC/JTAG successfully with ${strategy.name} reset.`,
1313
+ );
1314
+ return;
1315
+ } catch (error) {
1316
+ throw new Error("Sync timeout or abandoned");
1317
+ }
1263
1318
  }
1264
1319
  } catch (error) {
1265
1320
  lastError = error as Error;