@dtour/scatter 0.4.3 → 0.5.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.
package/dist/scatter.js CHANGED
@@ -1,5 +1,5 @@
1
1
  //#region src/data/colormaps2d.ts
2
- var e = new Float32Array(16), t = [
2
+ var e = /* @__PURE__ */ new Float32Array(16), t = [
3
3
  "schumann",
4
4
  "bremm",
5
5
  "steiger",
@@ -714,7 +714,7 @@ var e = new Float32Array(16), t = [
714
714
  }
715
715
  ], i = (t) => {
716
716
  if (t >= r.length) return null;
717
- let n = r[t], i = new Float32Array(128);
717
+ let n = r[t], i = /* @__PURE__ */ new Float32Array(128);
718
718
  return i.set(n.r_x, 0), i.set(n.r_y, 16), i.set(n.g_x, 32), i.set(n.g_y, 48), i.set(n.b_x, 64), i.set(n.b_y, 80), i.set(n.b_x2 ?? e, 96), i.set(n.b_y2 ?? e, 112), i;
719
719
  }, a = [
720
720
  [
@@ -2614,7 +2614,7 @@ var e = new Float32Array(16), t = [
2614
2614
  } catch {
2615
2615
  return "webgl";
2616
2616
  }
2617
- }, d = "const e=new Float32Array(16),t={schumann:0,bremm:1,steiger:2,ziegler:3,teulingfig2:4,cubediagonal:5,oklab_polar:6},n=[{r_x:[-0,-1.5085,-3.017,-4.5255,-6.034,-7.5425,-9.051,-10.5595,-12.068,-13.4877,-14.9075,-16.3272,-17.747,-19.1668,-20.5865,-22.0063],r_y:[-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442],g_x:[-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953],g_y:[-.076,-.0709,-.0661,-.061,-.0561,-.051,-.0462,-.041,-.0359,-.0308,-.0257,-.0205,-.0154,-.0103,-.0051,0],b_x:[-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581],b_y:[-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442]},{r_x:[-15.2067,-15.095,-14.9554,-14.7857,-14.5812,-14.3334,-14.0291,-13.6663,-13.2288,-12.7355,-12.1699,-11.5268,-10.802,-9.9949,-9.1075,-8.1425],r_y:[-.0066,-.0112,-.0161,-.021,-.026,-.031,-.036,-.0408,-.0449,-.0486,-.0521,-.0554,-.0586,-.0617,-.0647,-.0676],g_x:[-10.7187,-10.7357,-10.755,-10.7798,-10.8079,-10.8405,-10.8775,-10.92,-10.9701,-11.0227,-11.0828,-11.147,-11.2183,-11.2958,-11.3803,-11.4703],g_y:[-.054,-.0531,-.0521,-.0511,-.0499,-.0487,-.0473,-.0459,-.0442,-.0425,-.0405,-.0383,-.0359,-.0331,-.0298,-.0259],b_x:[-2.3509,-4.0466,-5.3978,-6.6213,-7.7862,-8.9196,-10.0363,-11.1469,-12.2854,-13.3981,-14.5092,-15.6231,-16.7524,-17.8862,-19.025,-20.1748],b_y:[-.0437,-.0438,-.0438,-.0439,-.0439,-.044,-.0441,-.0441,-.0442,-.0443,-.0444,-.0444,-.0445,-.0446,-.0447,-.0448]},{r_x:[-21.9278,-21.3484,-20.7628,-20.1344,-19.4757,-18.7856,-18.0477,-17.2595,-16.3843,-15.4484,-14.4257,-13.2751,-11.9456,-10.3735,-8.3553,-5.2147],r_y:[-.0407,-.0417,-.0426,-.0433,-.0439,-.0443,-.0447,-.045,-.0451,-.0452,-.0452,-.0451,-.045,-.0447,-.0444,-.044],g_x:[-13.0812,-13.0665,-13.0508,-13.0388,-13.0293,-13.0203,-13.0133,-13.0087,-13.0068,-13.0092,-13.0125,-13.0162,-13.0269,-13.0372,-13.0532,-13.0708],g_y:[-.0665,-.0634,-.0603,-.0572,-.054,-.0508,-.0476,-.0443,-.0408,-.0373,-.0337,-.0299,-.0258,-.0211,-.0155,-.006],b_x:[-7.2789,-8.4407,-9.4718,-10.4471,-11.3919,-12.3169,-13.2284,-14.1319,-15.0565,-15.9516,-16.8449,-17.7392,-18.6339,-19.5305,-20.4287,-21.3308],b_y:[-.0372,-.0384,-.0395,-.0405,-.0415,-.0424,-.0432,-.044,-.0448,-.0455,-.0462,-.0469,-.0476,-.0482,-.0488,-.0494]},{r_x:[-22.5873,-21.9563,-21.3711,-20.7867,-19.9754,-18.4599,-16.9442,-15.4282,-13.4591,-11.1479,-8.8297,-6.5275,-5.1161,-3.9946,-2.8733,-1.7523],r_y:[-.0419,-.0427,-.0435,-.0443,-.0452,-.0461,-.0471,-.0481,-.0478,-.0462,-.0446,-.0431,-.0419,-.0408,-.0397,-.0387],g_x:[-13.1499,-13.6389,-14.1283,-14.6177,-15.0304,-15.2028,-15.3755,-15.5483,-15.5483,-15.3755,-15.2028,-15.0304,-14.6177,-14.1283,-13.6389,-13.1499],g_y:[-.0679,-.0663,-.0649,-.0634,-.061,-.0553,-.0497,-.0441,-.0373,-.0299,-.0224,-.015,-.0104,-.0069,-.0035,0],b_x:[0,-1.1629,-2.4025,-3.6427,-5.0938,-7.0911,-9.0872,-11.0838,-12.4271,-13.0415,-13.651,-14.263,-13.9595,-13.3667,-12.7641,-12.1687],b_y:[0,-.0049,-.0102,-.0154,-.0216,-.0301,-.0385,-.047,-.0527,-.0553,-.0579,-.0605,-.0592,-.0567,-.0541,-.0516],b_x2:[0,.1737,.3579,.5429,.7486,1.01,1.2709,1.5314,1.3563,.758,.152,-.4504,-.9129,-1.327,-1.7466,-2.1664],b_y2:[0,.0073,.015,.0227,.0314,.0423,.0533,.0642,.0568,.0318,.0064,-.0189,-.0383,-.0556,-.0732,-.0908]},{r_x:[-9.3217,-9.7119,-10.1026,-10.4928,-10.8832,-11.2736,-11.6641,-12.0545,-12.4564,-12.8467,-13.2372,-13.6275,-14.0181,-14.4083,-14.7989,-15.1894],r_y:[-.0121,-.0159,-.0198,-.0236,-.0274,-.0313,-.0351,-.039,-.0429,-.0467,-.0506,-.0544,-.0582,-.0621,-.0659,-.0698],g_x:[-17.2405,-16.5128,-15.7853,-15.0578,-14.3304,-13.6031,-12.8759,-12.1487,-11.4004,-10.6733,-9.9465,-9.2196,-8.4931,-7.7664,-7.04,-6.3134],g_y:[-.0229,-.0255,-.0282,-.0308,-.0334,-.0361,-.0387,-.0413,-.044,-.0467,-.0493,-.0519,-.0546,-.0572,-.0599,-.0625],b_x:[-19.5271,-18.4535,-17.3793,-16.3057,-15.2322,-14.1586,-13.0846,-12.0108,-10.9055,-9.8317,-8.7578,-7.6841,-6.6107,-5.537,-4.4628,-3.3892],b_y:[-.0543,-.0529,-.0515,-.0501,-.0487,-.0473,-.0459,-.0445,-.0431,-.0417,-.0403,-.0389,-.0375,-.0361,-.0347,-.0333]},{r_x:[-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767],r_y:[-.0765,-.0714,-.0663,-.0612,-.0561,-.051,-.0459,-.0408,-.0357,-.0306,-.0255,-.0204,-.0153,-.0102,-.0051,0],g_x:[0,-1.5085,-3.017,-4.5255,-6.034,-7.5425,-9.051,-10.5595,-12.068,-13.5765,-15.0849,-16.5934,-18.1019,-19.6104,-21.1189,-22.6274],g_y:[-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442],b_x:[13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767],b_y:[0,.0051,.0102,.0153,.0204,.0255,.0306,.0357,.0408,.0459,.051,.0561,.0612,.0663,.0714,.0765]}],r=t=>{if(t>=n.length)return null;let r=n[t],i=new Float32Array(128);return i.set(r.r_x,0),i.set(r.r_y,16),i.set(r.g_x,32),i.set(r.g_y,48),i.set(r.b_x,64),i.set(r.b_y,80),i.set(r.b_x2??e,96),i.set(r.b_y2??e,112),i},i=[[0,114,178],[230,159,0],[0,158,115],[204,121,167],[86,180,233],[213,94,0],[240,228,66]],a=[[215,0,0],[0,151,0],[0,0,255],[255,186,0],[0,208,255],[255,0,186],[143,90,0],[0,255,151],[169,0,255],[129,129,129],[255,129,97],[0,107,79],[109,109,255],[255,0,57],[137,171,0],[176,106,255],[0,168,168],[255,131,222],[104,70,43],[175,185,143],[163,0,96],[93,136,200],[230,215,127],[0,64,36],[62,53,91],[199,186,255],[127,0,18],[85,233,188],[70,80,0],[255,195,182],[106,50,89],[0,107,140],[238,114,0],[168,161,195],[148,85,115],[0,172,95],[199,0,171],[135,141,113],[27,36,65],[185,111,84],[113,109,60],[0,232,87],[162,55,0],[0,157,218],[231,164,255],[96,131,120],[96,76,255],[192,155,103],[207,0,116],[36,65,103],[157,205,255],[182,97,176],[89,186,138],[255,78,147],[81,113,0],[255,168,105],[75,0,48],[117,217,0],[0,90,179],[214,194,0],[0,74,56],[237,237,220],[90,12,0],[147,161,236]],o=[[214,0,0],[1,135,0],[181,0,255],[5,172,198],[151,255,0],[255,165,47],[255,142,200],[121,82,94],[0,253,207],[175,165,255],[147,172,131],[154,105,0],[54,105,98],[211,0,140],[253,244,144],[200,110,102],[158,226,255],[0,200,70],[168,119,172],[184,186,1],[244,191,177],[255,40,253],[242,205,255],[0,158,124],[255,98,0],[86,100,42],[149,63,31],[144,49,142],[255,52,100],[160,228,145],[140,154,177],[130,144,38],[174,8,63],[119,198,186],[188,145,87],[228,142,255],[114,184,255],[198,165,193],[255,144,112],[211,195,124],[188,237,219],[107,133,103],[145,110,86],[249,255,0],[186,193,223],[172,86,124],[255,205,3],[255,73,177],[193,86,3],[93,140,144],[193,68,188],[0,117,63],[186,110,253],[0,212,147],[0,255,117],[73,161,80],[204,151,144],[0,235,237],[219,126,1],[247,117,137],[184,149,0],[200,66,72],[0,207,249],[117,87,38],[133,212,1],[235,255,212],[167,123,135],[219,114,200],[202,226,86],[138,191,93],[161,33,107],[133,91,137],[137,186,207],[255,186,214],[182,207,170],[151,65,77],[103,170,0],[253,225,177],[255,54,40],[128,121,61],[214,232,255],[167,149,198],[126,165,154],[209,130,163],[84,130,59],[230,168,114],[156,255,255],[218,84,128],[5,179,170],[255,170,246],[209,175,239],[218,1,93],[172,26,19],[96,179,133],[212,66,253],[172,170,89],[251,156,167],[179,114,59],[242,105,82],[174,209,212],[154,255,195],[219,179,51],[235,1,195],[153,0,196],[207,255,158],[165,89,73],[59,109,1],[0,133,121],[149,145,103],[137,219,179],[109,116,0],[170,93,202],[7,239,0],[128,79,61],[216,128,82],[255,200,98],[184,0,158],[153,172,221],[144,79,0],[140,68,112],[79,110,82],[255,135,52],[198,142,205],[212,226,158],[177,130,109],[156,251,117],[86,221,119],[249,0,135],[161,205,255],[19,202,209],[17,142,84],[209,84,165],[0,223,195],[163,131,47],[119,151,91],[186,170,128],[112,163,175],[214,251,255],[232,1,58],[216,70,33],[255,130,237],[182,56,98],[182,205,114],[151,98,107],[137,116,144],[0,163,22],[0,244,161],[191,144,242],[137,228,216],[163,77,149],[110,93,0],[140,198,142],[149,170,42],[198,114,221],[179,59,1],[214,154,54],[223,172,182],[0,154,160],[89,144,0],[151,188,168],[172,140,168],[218,212,255],[84,124,114],[0,186,105],[255,195,142],[184,0,212],[223,207,91],[98,154,123],[191,237,188],[193,189,253],[128,211,221],[226,133,126],[249,235,77],[191,109,130],[202,255,79],[239,114,170],[237,103,255],[153,70,174],[109,105,66],[226,86,96],[221,102,45],[156,219,93],[226,156,207],[184,117,0],[198,0,45],[223,188,218],[89,181,223],[255,89,218],[56,193,161],[158,105,140],[172,170,200],[149,98,47],[181,86,98],[43,126,96],[177,228,0],[237,165,144],[149,253,226],[255,84,142],[189,110,161],[170,59,54],[216,207,0],[170,128,205],[160,128,82],[225,0,232],[195,91,61],[181,58,133],[140,119,0],[219,188,149],[82,158,147],[175,188,130],[145,181,182],[167,84,35],[255,212,239],[121,174,107],[93,181,75],[128,251,154],[72,255,239],[151,149,72],[147,135,167],[49,212,0],[110,233,86],[182,212,235],[112,84,112],[242,219,138],[170,212,193],[126,205,242],[137,186,0],[100,182,186],[255,181,0],[195,130,133],[202,170,94],[100,119,72],[89,226,255],[223,77,205],[233,255,121],[188,102,184],[195,149,165],[100,198,116],[209,149,112],[112,207,79],[170,110,102],[156,96,165],[0,184,0],[226,153,179],[188,0,107],[179,232,239],[205,191,228],[119,163,66],[133,98,119],[86,142,91],[158,175,196],[232,47,160],[36,124,42],[130,103,35],[191,188,77],[221,211,165]],s=[[68,1,84],[71,16,99],[72,31,112],[71,45,123],[68,57,131],[64,70,136],[59,82,139],[54,93,141],[49,104,142],[44,114,142],[40,124,142],[36,134,142],[33,145,140],[31,154,138],[32,164,134],[40,174,128],[53,183,121],[72,193,110],[94,201,98],[117,208,84],[144,215,67],[173,220,48],[200,224,32],[229,228,25],[253,231,37]],c=[[34,17,80],[49,17,101],[64,15,116],[81,18,124],[95,24,127],[109,29,129],[123,35,130],[137,40,129],[152,45,128],[166,49,125],[183,55,121],[197,60,116],[211,67,110],[224,76,103],[235,87,96],[243,101,92],[248,118,92],[252,137,97],[253,154,106],[254,170,116],[254,187,129],[254,204,143],[253,220,158],[252,236,174],[252,253,191]],l=e=>{let t=1/0,n=-1/0,r=0;for(let i=0;i<e.length;i++){let a=e[i];a<t&&(t=a),a>n&&(n=a),r+=a}let i=n-t||1e-6,a=e.length>0?r/e.length:0;return{min:t,max:n,range:i,mean:a}},u=Uint8Array.of(65,82,82,79,87,49),d={V1:0,V2:1,V3:2,V4:3,V5:4},f={NONE:0,Schema:1,DictionaryBatch:2,RecordBatch:3,Tensor:4,SparseTensor:5},p={Dictionary:-1,NONE:0,Null:1,Int:2,Float:3,Binary:4,Utf8:5,Bool:6,Decimal:7,Date:8,Time:9,Timestamp:10,Interval:11,List:12,Struct:13,Union:14,FixedSizeBinary:15,FixedSizeList:16,Map:17,Duration:18,LargeBinary:19,LargeUtf8:20,LargeList:21,RunEndEncoded:22,BinaryView:23,Utf8View:24,ListView:25,LargeListView:26},m={HALF:0,SINGLE:1,DOUBLE:2},h={DAY:0,MILLISECOND:1},g={SECOND:0,MILLISECOND:1,MICROSECOND:2,NANOSECOND:3},_={YEAR_MONTH:0,DAY_TIME:1,MONTH_DAY_NANO:2},v={Sparse:0,Dense:1},y={LZ4_FRAME:0,ZSTD:1},b={BUFFER:0},x=Uint8Array,S=Uint16Array,C=Uint32Array,w=BigUint64Array,T=Int8Array,E=Int16Array,D=Int32Array,O=BigInt64Array,k=Float32Array,A=Float64Array;function j(e){return e instanceof ArrayBuffer||typeof SharedArrayBuffer<`u`&&e instanceof SharedArrayBuffer}function M(e,t){let n=Math.log2(e)-3;return(t?[T,E,D,O]:[x,S,C,w])[n]}Object.getPrototypeOf(Int8Array);function ee(e,t){let n=0,r=e.length;if(r<=2147483648)do{let i=n+r>>>1;e[i]<=t?n=i+1:r=i}while(n<r);else do{let i=Math.trunc((n+r)/2);e[i]<=t?n=i+1:r=i}while(n<r);return n}function N(e,t,n){if(t(e))return e;throw Error(n(e))}function P(e,t,n){return t=Array.isArray(t)?t:Object.values(t),N(e,e=>t.includes(e),n??(()=>`${e} must be one of ${t}`))}function F(e,t){for(let[n,r]of Object.entries(e))if(r===t)return n;return`<Unknown>`}const te=e=>`Unsupported data type: \"${F(p,e)}\" (id ${e})`,ne=(e,t,n=!0,r=null)=>({name:e,type:t,nullable:n,metadata:r});function re(e){return Object.hasOwn(e,`name`)&&ie(e.type)}function ie(e){return typeof e?.typeId==`number`}function I(e,t=``,n=!0){return re(e)?e:ne(t,N(e,ie,()=>`Data type expected.`),n)}const ae=(e,t,n=!1,r=-1)=>({typeId:p.Dictionary,id:r,dictionary:e,indices:t||oe(),ordered:n}),L=(e=32,t=!0)=>({typeId:p.Int,bitWidth:P(e,[8,16,32,64]),signed:t,values:M(e,t)}),oe=()=>L(32),se=(e=2)=>({typeId:p.Float,precision:P(e,m),values:[S,k,A][e]}),ce=()=>({typeId:p.Binary,offsets:D}),le=()=>({typeId:p.Utf8,offsets:D}),ue=(e,t,n=128)=>({typeId:p.Decimal,precision:e,scale:t,bitWidth:P(n,[32,64,128,256]),values:n===32?D:w}),de=e=>({typeId:p.Date,unit:P(e,h),values:e===h.DAY?D:O}),fe=(e=g.MILLISECOND)=>{e=P(e,g);let t=e===g.SECOND||e===g.MILLISECOND?32:64;return{typeId:p.Time,unit:e,bitWidth:t,values:t===32?D:O}},pe=(e=g.MILLISECOND,t=null)=>({typeId:p.Timestamp,unit:P(e,g),timezone:t,values:O}),me=(e=_.MONTH_DAY_NANO)=>({typeId:p.Interval,unit:P(e,_),values:e===_.MONTH_DAY_NANO?void 0:D}),he=e=>({typeId:p.List,children:[I(e)],offsets:D}),ge=e=>({typeId:p.Struct,children:Array.isArray(e)&&e.length>0&&re(e[0])?e:Object.entries(e).map(([e,t])=>ne(e,t))}),_e=(e,t,n,r)=>(n??=t.map((e,t)=>t),{typeId:p.Union,mode:P(e,v),typeIds:n,typeMap:n.reduce((e,t,n)=>(e[t]=n,e),{}),children:t.map((e,t)=>I(e,`_${t}`)),typeIdForValue:r,offsets:D}),ve=e=>({typeId:p.FixedSizeBinary,stride:e}),ye=(e,t)=>({typeId:p.FixedSizeList,stride:t,children:[I(e)]}),be=(e,t)=>({typeId:p.Map,keysSorted:e,children:[t],offsets:D}),xe=(e=g.MILLISECOND)=>({typeId:p.Duration,unit:P(e,g),values:O}),Se=()=>({typeId:p.LargeBinary,offsets:O}),Ce=()=>({typeId:p.LargeUtf8,offsets:O}),we=e=>({typeId:p.LargeList,children:[I(e)],offsets:O}),Te=(e,t)=>({typeId:p.RunEndEncoded,children:[N(I(e,`run_ends`),e=>e.type.typeId===p.Int,()=>`Run-ends must have an integer type.`),I(t,`values`)]}),Ee=e=>({typeId:p.ListView,children:[I(e,`value`)],offsets:D}),De=e=>({typeId:p.LargeListView,children:[I(e,`value`)],offsets:O}),Oe=new A(2).buffer;new O(Oe),new C(Oe),new D(Oe),new x(Oe);function ke(e){if(e>2**53-1||e<-(2**53-1))throw Error(`BigInt exceeds integer number representation: ${e}`);return Number(e)}function Ae(e,t){return Number(e/t)+Number(e%t)/Number(t)}const je=e=>BigInt.asUintN(64,e);function Me(e,t){return BigInt.asIntN(64,e[t])}function Ne(e,t){let n=t<<1,r;return BigInt.asIntN(64,e[n+1])<0?(r=je(~e[n])|je(~e[n+1])<<64n,r=-(r+1n)):r=e[n]|e[n+1]<<64n,r}function Pe(e,t){let n=t<<2,r;return BigInt.asIntN(64,e[n+3])<0?(r=je(~e[n])|je(~e[n+1])<<64n|je(~e[n+2])<<128n|je(~e[n+3])<<192n,r=-(r+1n)):r=e[n]|e[n+1]<<64n|e[n+2]<<128n|e[n+3]<<192n,r}const Fe=new TextDecoder(`utf-8`);new TextEncoder;function Ie(e){return Fe.decode(e)}function Le(e,t){return(e[t>>3]&1<<t%8)!=0}function R(e,t){let n=t+B(e,t),r=n-B(e,n),i=z(e,r);return(t,a,o=null)=>{if(t<i){let i=z(e,r+t);if(i)return a(e,n+i)}return o}}function Re(e,t){return t}function ze(e,t){return!!Be(e,t)}function Be(e,t){return Ve(e,t)<<24>>24}function Ve(e,t){return e[t]}function z(e,t){return He(e,t)<<16>>16}function He(e,t){return e[t]|e[t+1]<<8}function B(e,t){return e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24}function Ue(e,t){return B(e,t)>>>0}function V(e,t){return ke(BigInt.asIntN(64,BigInt(Ue(e,t))+(BigInt(Ue(e,t+4))<<32n)))}function We(e,t){let n=t+B(e,t),r=B(e,n);return n+=4,Ie(e.subarray(n,n+r))}function Ge(e,t,n,r){if(!t)return[];let i=t+B(e,t);return Array.from({length:B(e,i)},(t,a)=>r(e,i+4+a*n))}const Ke=Symbol(`rowIndex`);function qe(e,t){class n{constructor(e){this[Ke]=e}toJSON(){return Ye(e,t,this[Ke])}}let r=n.prototype;for(let n=0;n<e.length;++n){if(Object.hasOwn(r,e[n]))continue;let i=t[n];Object.defineProperty(r,e[n],{get(){return i.at(this[Ke])},enumerable:!0})}return e=>new n(e)}function Je(e,t){return n=>Ye(e,t,n)}function Ye(e,t,n){let r={};for(let i=0;i<e.length;++i)r[e[i]]=t[i].at(n);return r}function Xe(e){return e instanceof Qe}var Ze=class{static ArrayType=null;constructor({length:e,nullCount:t,type:n,validity:r,values:i,offsets:a,sizes:o,children:s}){this.length=e,this.nullCount=t,this.type=n,this.validity=r,this.values=i,this.offsets=a,this.sizes=o,this.children=s,(!t||!this.validity)&&(this.at=e=>this.value(e))}get[Symbol.toStringTag](){return`Batch`}at(e){return this.isValid(e)?this.value(e):null}isValid(e){return Le(this.validity,e)}value(e){return this.values[e]}slice(e,t){let n=t-e,r=Array(n);for(let t=0;t<n;++t)r[t]=this.at(e+t);return r}*[Symbol.iterator](){for(let e=0;e<this.length;++e)yield this.at(e)}},Qe=class extends Ze{constructor(e){super(e);let{length:t,values:n}=this;this.values=n.subarray(0,t)}slice(e,t){return this.nullCount?super.slice(e,t):this.values.subarray(e,t)}[Symbol.iterator](){return this.nullCount?super[Symbol.iterator]():this.values[Symbol.iterator]()}},$e=class extends Ze{static ArrayType=A},H=class extends Ze{static ArrayType=Array},et=class extends H{value(e){return null}},tt=class extends $e{value(e){return ke(this.values[e])}},nt=class extends $e{value(e){let t=this.values[e],n=(t&31744)>>10,r=(t&1023)/1024,i=(-1)**((t&32768)>>15);switch(n){case 31:return i*(r?NaN:1/0);case 0:return i*(r?6103515625e-14*r:0)}return i*2**(n-15)*(1+r)}},rt=class extends H{value(e){return Le(this.values,e)}},it=class extends $e{constructor(e){super(e);let{scale:t}=this.type;this.scale=10**t}value(e){return this.values[e]/this.scale}},at=class extends Ze{constructor(e){super(e);let{bitWidth:t,scale:n}=this.type;this.decimal=t===64?Me:t===128?Ne:Pe,this.scale=10n**BigInt(n)}},ot=class extends at{static ArrayType=A;value(e){return Ae(this.decimal(this.values,e),this.scale)}},st=class extends at{static ArrayType=Array;value(e){return this.decimal(this.values,e)}},ct=class extends H{constructor(e){super(e),this.source=e}value(e){return new Date(this.source.value(e))}},lt=class extends $e{value(e){return 864e5*this.values[e]}};const ut=tt;var dt=class extends tt{value(e){return super.value(e)*1e3}};const ft=tt;var pt=class extends tt{value(e){return Ae(this.values[e],1000n)}},mt=class extends tt{value(e){return Ae(this.values[e],1000000n)}},ht=class extends H{value(e){return this.values.subarray(e<<1,e+1<<1)}},gt=class extends H{value(e){let t=this.values,n=e<<4;return Float64Array.of(B(t,n),B(t,n+4),V(t,n+8))}};const _t=({values:e,offsets:t},n)=>e.subarray(t[n],t[n+1]),vt=({values:e,offsets:t},n)=>e.subarray(ke(t[n]),ke(t[n+1]));var yt=class extends H{value(e){return _t(this,e)}},bt=class extends H{value(e){return vt(this,e)}},xt=class extends H{value(e){return Ie(_t(this,e))}},St=class extends H{value(e){return Ie(vt(this,e))}},Ct=class extends H{value(e){let t=this.offsets;return this.children[0].slice(t[e],t[e+1])}},wt=class extends H{value(e){let t=this.offsets;return this.children[0].slice(ke(t[e]),ke(t[e+1]))}},Tt=class extends H{value(e){let t=this.offsets[e],n=t+this.sizes[e];return this.children[0].slice(t,n)}},Et=class extends H{value(e){let t=this.offsets[e],n=t+this.sizes[e];return this.children[0].slice(ke(t),ke(n))}},Dt=class extends H{constructor(e){super(e),this.stride=this.type.stride}},Ot=class extends Dt{value(e){let{stride:t,values:n}=this;return n.subarray(e*t,(e+1)*t)}},kt=class extends Dt{value(e){let{children:t,stride:n}=this;return t[0].slice(e*n,(e+1)*n)}};function At({children:e,offsets:t},n){let[r,i]=e[0].children,a=t[n],o=t[n+1],s=[];for(let e=a;e<o;++e)s.push([r.at(e),i.at(e)]);return s}var jt=class extends H{value(e){return At(this,e)}},Mt=class extends H{value(e){return new Map(At(this,e))}},Nt=class extends H{constructor({typeIds:e,...t}){super(t),this.typeIds=e,this.typeMap=this.type.typeMap}value(e,t=e){let{typeIds:n,children:r,typeMap:i}=this;return r[i[n[e]]].at(t)}},Pt=class extends Nt{value(e){return super.value(e,this.offsets[e])}},Ft=class extends H{constructor(e,t=Je){super(e),this.names=this.type.children.map(e=>e.name),this.factory=t(this.names,this.children)}value(e){return this.factory(e)}},It=class extends Ft{constructor(e){super(e,qe)}},Lt=class extends H{value(e){let[{values:t},n]=this.children;return n.at(ee(t,e))}},Rt=class extends H{setDictionary(e){return this.dictionary=e,this.cache=e.cache(),this}value(e){return this.cache[this.key(e)]}key(e){return this.values[e]}},zt=class extends H{constructor({data:e,...t}){super(t),this.data=e}view(e){let{values:t,data:n}=this,r=e<<4,i=r+4,a=t,o=B(a,r);return o>12&&(i=B(a,r+12),a=n[B(a,r+8)]),a.subarray(i,i+o)}},Bt=class extends zt{value(e){return this.view(e)}},Vt=class extends zt{value(e){return Ie(this.view(e))}};function Ht(e){let t=[];return{add(e){return t.push(e),this},clear:()=>t=[],done:()=>new Ut(t,e)}}var Ut=class{constructor(e,t=e[0]?.type){this.type=t,this.length=e.reduce((e,t)=>e+t.length,0),this.nullCount=e.reduce((e,t)=>e+t.nullCount,0),this.data=e;let n=e.length,r=new Int32Array(n+1);if(n===1){let[t]=e;r[1]=t.length,this.at=e=>t.at(e)}else for(let t=0,i=0;t<n;++t)r[t+1]=i+=e[t].length;this.offsets=r}get[Symbol.toStringTag](){return`Column`}[Symbol.iterator](){let e=this.data;return e.length===1?e[0][Symbol.iterator]():Wt(e)}at(e){let{data:t,offsets:n}=this,r=ee(n,e)-1;return t[r]?.at(e-n[r])}get(e){return this.at(e)}toArray(){let{length:e,nullCount:t,data:n}=this,r=!t&&Xe(n[0]),i=n.length;if(r&&i===1)return n[0].values;let a=new(!i||t>0?Array:n[0].constructor.ArrayType??n[0].values.constructor)(e);return r?Gt(a,n):Kt(a,n)}cache(){return this._cache??=this.toArray()}};function*Wt(e){for(let t=0;t<e.length;++t){let n=e[t][Symbol.iterator]();for(let e=n.next();!e.done;e=n.next())yield e.value}}function Gt(e,t){for(let n=0,r=0;n<t.length;++n){let{values:i}=t[n];e.set(i,r),r+=i.length}return e}function Kt(e,t){let n=-1;for(let r=0;r<t.length;++r){let i=t[r];for(let t=0;t<i.length;++t)e[++n]=i.at(t)}return e}var qt=class e{constructor(e,t,n=!1){let r=e.fields.map(e=>e.name);this.schema=e,this.names=r,this.children=t,this.factory=n?qe:Je;let i=[];this.getFactory=e=>i[e]??(i[e]=this.factory(r,t.map(t=>t.data[e])))}get[Symbol.toStringTag](){return`Table`}get numCols(){return this.names.length}get numRows(){return this.children[0]?.length??0}getChildAt(e){return this.children[e]}getChild(e){let t=this.names.findIndex(t=>t===e);return t>-1?this.children[t]:void 0}selectAt(t,n=[]){let{children:r,factory:i,schema:a}=this,{fields:o}=a;return new e({...a,fields:t.map((e,t)=>Jt(o[e],n[t]))},t.map(e=>r[e]),i===qe)}select(e,t){let n=this.names,r=e.map(e=>n.indexOf(e));return this.selectAt(r,t)}toColumns(){let{children:e,names:t}=this,n={};return t.forEach((t,r)=>n[t]=e[r]?.toArray()??[]),n}toArray(){let{children:e,getFactory:t,numRows:n}=this,r=e[0]?.data??[],i=Array(n);for(let e=0,n=-1;e<r.length;++e){let a=t(e);for(let t=0;t<r[e].length;++t)i[++n]=a(t)}return i}*[Symbol.iterator](){let{children:e,getFactory:t}=this,n=e[0]?.data??[];for(let e=0;e<n.length;++e){let r=t(e);for(let t=0;t<n[e].length;++t)yield r(t)}}at(e){let{children:t,getFactory:n,numRows:r}=this;if(e<0||e>=r)return null;let[{offsets:i}]=t,a=ee(i,e)-1;return n(a)(e-i[a])}get(e){return this.at(e)}};function Jt(e,t){return t!=null&&t!==e.name?{...e,name:t}:e}function Yt(e,t={}){let{typeId:n,bitWidth:r,mode:i,precision:a,unit:o}=e,{useBigInt:s,useDate:c,useDecimalInt:l,useMap:u,useProxy:d}=t;switch(n){case p.Null:return et;case p.Bool:return rt;case p.Int:case p.Time:case p.Duration:return s||r<64?Qe:tt;case p.Float:return a?Qe:nt;case p.Date:return Xt(o===h.DAY?lt:ut,c&&ct);case p.Timestamp:return Xt(o===g.SECOND?dt:o===g.MILLISECOND?ft:o===g.MICROSECOND?pt:mt,c&&ct);case p.Decimal:return r===32?l?Qe:it:l?st:ot;case p.Interval:return o===_.DAY_TIME?ht:o===_.YEAR_MONTH?Qe:gt;case p.FixedSizeBinary:return Ot;case p.Utf8:return xt;case p.LargeUtf8:return St;case p.Binary:return yt;case p.LargeBinary:return bt;case p.BinaryView:return Bt;case p.Utf8View:return Vt;case p.List:return Ct;case p.LargeList:return wt;case p.Map:return u?Mt:jt;case p.ListView:return Tt;case p.LargeListView:return Et;case p.FixedSizeList:return kt;case p.Struct:return d?It:Ft;case p.RunEndEncoded:return Lt;case p.Dictionary:return Rt;case p.Union:return i?Pt:Nt}throw Error(te(n))}function Xt(e,t){return t?class extends t{constructor(t){super(new e(t))}}:e}function Zt(e){return`Missing compression codec \"${F(y,e)}\" (id ${e})`}const Qt=new Map;function $t(e){return e!=null&&Qt.get(e)||null}function en(e,{offset:t,length:n},r){if(n===0)return{bytes:new Uint8Array,offset:0,length:0};let i=V(e,t),a=e.subarray(t+8,t+n),o=i===-1?a:r.decode(a);return{bytes:o,offset:0,length:o.length}}function tn(e,t){return{offset:V(e,t),metadataLength:B(e,t+8),bodyLength:V(e,t+16)}}function nn(e,t){return Ge(e,t,24,tn)}function rn(e,t){let n=R(e,t);return{codec:n(4,Be,y.LZ4_FRAME),method:n(6,Be,b.BUFFER)}}function an(e,t,n){let r=R(e,t),i=n<d.V4?8:0;return{length:r(4,V,0),nodes:Ge(e,r(6,Re),16,(e,t)=>({length:V(e,t),nullCount:V(e,t+8)})),regions:Ge(e,r(8,Re),16+i,(e,t)=>({offset:V(e,t+i),length:V(e,t+i+8)})),compression:r(10,rn),variadic:Ge(e,r(12,Re),8,V)}}function on(e,t,n){let r=R(e,t);return{id:r(4,V,0),data:r(6,(e,t)=>an(e,t,n)),isDelta:r(8,ze,!1)}}function sn(e,t,n,r){P(n,p,te);let i=R(e,t);switch(n){case p.Binary:return ce();case p.Utf8:return le();case p.LargeBinary:return Se();case p.LargeUtf8:return Ce();case p.List:return he(r[0]);case p.ListView:return Ee(r[0]);case p.LargeList:return we(r[0]);case p.LargeListView:return De(r[0]);case p.Struct:return ge(r);case p.RunEndEncoded:return Te(r[0],r[1]);case p.Int:return L(i(4,B,0),i(6,ze,!1));case p.Float:return se(i(4,z,m.HALF));case p.Decimal:return ue(i(4,B,0),i(6,B,0),i(8,B,128));case p.Date:return de(i(4,z,h.MILLISECOND));case p.Time:return fe(i(4,z,g.MILLISECOND));case p.Timestamp:return pe(i(4,z,g.SECOND),i(6,We));case p.Interval:return me(i(4,z,_.YEAR_MONTH));case p.Duration:return xe(i(4,z,g.MILLISECOND));case p.FixedSizeBinary:return ve(i(4,B,0));case p.FixedSizeList:return ye(r[0],i(4,B,0));case p.Map:return be(i(4,ze,!1),r[0]);case p.Union:return _e(i(4,z,v.Sparse),r,Ge(e,i(6,Re),4,B))}return{typeId:n}}function cn(e,t){let n=Ge(e,t,4,(e,t)=>{let n=R(e,t);return[n(4,We),n(6,We)]});return n.length?new Map(n):null}function ln(e,t,n){let r=R(e,t);return{version:n,endianness:r(4,z,0),fields:r(6,un,[]),metadata:r(8,cn)}}function un(e,t){return Ge(e,t,4,dn)}function dn(e,t){let n=R(e,t),r=n(8,Ve,p.NONE),i=n(10,Re,0),a=n(12,pn),o=sn(e,i,r,n(14,fn,[]));return a&&(a.dictionary=o,o=a),{name:n(4,We),type:o,nullable:n(6,ze,!1),metadata:n(16,cn)}}function fn(e,t){return Ge(e,t,4,dn)}function pn(e,t){if(!t)return null;let n=R(e,t);return ae(null,n(6,mn,oe()),n(8,ze,!1),n(4,V,0))}function mn(e,t){return sn(e,t,p.Int)}const hn=(e,t)=>`Expected to read ${e} metadata bytes, but only read ${t}.`,gn=(e,t)=>`Expected to read ${e} bytes for message body, but only read ${t}.`,_n=e=>`Unsupported message type: ${e} (${F(f,e)})`;function vn(e,t){let n=B(e,t)||0;if(t+=4,n===-1&&(n=B(e,t)||0,t+=4),n===0)return null;let r=e.subarray(t,t+=n);if(r.byteLength<n)throw Error(hn(n,r.byteLength));let i=R(r,0),a=i(4,z,d.V1),o=i(6,Ve,f.NONE),s=i(8,Re,0),c=i(10,V,0),l;if(s){let n=o===f.Schema?ln:o===f.DictionaryBatch?on:o===f.RecordBatch?an:null;if(!n)throw Error(_n(o));if(l=n(r,s,a),c>0){let n=e.subarray(t,t+=c);if(n.byteLength<c)throw Error(gn(c,n.byteLength));l.body=n}else o!==f.Schema&&(l.body=new Uint8Array)}return{version:a,type:o,index:t,content:l}}function yn(e){let t=j(e)?new Uint8Array(e):e;return t instanceof Uint8Array&&bn(t)?Sn(t):xn(t)}function bn(e){if(!e||e.length<4)return!1;for(let t=0;t<6;++t)if(u[t]!==e[t])return!1;return!0}function xn(e){let t=[e].flat(),n,r=[],i=[];for(let e of t){if(!(e instanceof Uint8Array))throw Error(`IPC data batch was not a Uint8Array.`);let t=0;for(;;){let a=vn(e,t);if(a===null)break;if(t=a.index,a.content)switch(a.type){case f.Schema:n||=a.content;break;case f.RecordBatch:r.push(a.content);break;case f.DictionaryBatch:i.push(a.content);break}}}return{schema:n,dictionaries:i,records:r,metadata:null}}function Sn(e){let t=e.byteLength-(u.length+4),n=R(e,t-B(e,t)),r=n(4,z,d.V1),i=n(8,nn,[]),a=n(10,nn,[]);return{schema:n(6,(e,t)=>ln(e,t,r)),dictionaries:i.map(({offset:t})=>vn(e,t).content),records:a.map(({offset:t})=>vn(e,t).content),metadata:n(12,cn)}}function Cn(e,t){return wn(yn(e),t)}function wn(e,t={}){let{schema:n={fields:[]},dictionaries:r,records:i}=e,{version:a,fields:o}=n,s=new Map,c=En(t,a,s),l=new Map;Tn(n,e=>{let t=e.type;t.typeId===p.Dictionary&&l.set(t.id,t.dictionary)});let u=new Map;for(let e of r){let{id:t,data:n,isDelta:r,body:i}=e,a=l.get(t),o=On(a,c({...n,body:i}));if(u.has(t)){let e=u.get(t);r||e.clear(),e.add(o)}else{if(r)throw Error(`Delta update can not be first dictionary batch.`);u.set(t,Ht(a).add(o))}}u.forEach((e,t)=>s.set(t,e.done()));let d=o.map(e=>Ht(e.type));for(let e of i){let t=c(e);o.forEach((e,n)=>d[n].add(On(e.type,t)))}return new qt(n,d.map(e=>e.done()),t.useProxy)}function Tn(e,t){e.fields.forEach(function e(n){t(n),n.type.dictionary?.children?.forEach(e),n.type.children?.forEach(e)})}function En(e,t,n){let r={version:t,options:e,dictionary:e=>n.get(e)};return e=>{let{length:t,nodes:n,regions:i,compression:a,variadic:o,body:s}=e,c=-1,l=-1,u=-1;return{...r,length:t,node:()=>n[++c],buffer:e=>{let{bytes:t,length:n,offset:r}=Dn(s,i[++l],a);return e?new e(t.buffer,t.byteOffset+r,n/e.BYTES_PER_ELEMENT):t.subarray(r,r+n)},variadic:()=>o[++u],visit(e){return e.map(e=>On(e.type,this))}}}}function Dn(e,t,n){if(!n)return{bytes:e,...t};if(n.method!==b.BUFFER)throw Error(`Unknown compression method (${n.method})`);{let r=n.codec,i=$t(r);if(!i)throw Error(Zt(r));return en(e,t,i)}}function On(e,t){let{typeId:n}=e,{options:r,node:i,buffer:a,variadic:o,version:s}=t,c=Yt(e,r),l={...i(),type:e};if(n===p.Null)return new c({...l,nullCount:l.length});switch(n){case p.Bool:case p.Int:case p.Time:case p.Duration:case p.Float:case p.Decimal:case p.Date:case p.Timestamp:case p.Interval:case p.FixedSizeBinary:return new c({...l,validity:a(),values:a(e.values)});case p.Utf8:case p.LargeUtf8:case p.Binary:case p.LargeBinary:return new c({...l,validity:a(),offsets:a(e.offsets),values:a()});case p.BinaryView:case p.Utf8View:return new c({...l,validity:a(),values:a(),data:Array.from({length:o()},()=>a())});case p.List:case p.LargeList:case p.Map:return new c({...l,validity:a(),offsets:a(e.offsets),children:t.visit(e.children)});case p.ListView:case p.LargeListView:return new c({...l,validity:a(),offsets:a(e.offsets),sizes:a(e.offsets),children:t.visit(e.children)});case p.FixedSizeList:case p.Struct:return new c({...l,validity:a(),children:t.visit(e.children)});case p.RunEndEncoded:return new c({...l,children:t.visit(e.children)});case p.Dictionary:{let{id:n,indices:r}=e;return new c({...l,validity:a(),values:a(r.values)}).setDictionary(t.dictionary(n))}case p.Union:return s<d.V5&&a(),new c({...l,typeIds:a(T),offsets:e.mode===v.Sparse?null:a(e.offsets),children:t.visit(e.children)});default:throw Error(te(n))}}new Uint16Array(new Uint8Array([1,0]).buffer)[0];const kn=new Set([`Float32Array`,`Float64Array`,`Int8Array`,`Int16Array`,`Int32Array`,`Uint8Array`,`Uint16Array`,`Uint32Array`]),An=e=>{let t=Cn(new Uint8Array(e)).toColumns(),n={},r=[];for(let[e,i]of Object.entries(t)){if(ArrayBuffer.isView(i)){let t=Object.prototype.toString.call(i).slice(8,-1);kn.has(t)&&(n[e]=i instanceof Float32Array?i:new Float32Array(i));continue}if(Array.isArray(i)&&i.length>0&&typeof i[0]==`string`){let t=new Map,n=new Uint32Array(i.length);for(let e=0;e<i.length;e++){let r=String(i[e]??``),a=t.get(r);a===void 0&&(a=t.size,t.set(r,a)),n[e]=a}let a=[...t.keys()],o=[...a].sort((e,t)=>e.localeCompare(t,void 0,{numeric:!0,sensitivity:`base`})),s=new Map;for(let e=0;e<o.length;e++)s.set(o[e],e);let c=a.map(e=>s.get(e));for(let e=0;e<n.length;e++)n[e]=c[n[e]];r.push({name:e,indices:n,labels:o})}}return{numeric:n,categorical:r}},jn=[65,82,82,79,87,49],Mn=[80,65,82,49],Nn=(e,t)=>e.length>=t.length&&t.every((t,n)=>e[n]===t),Pn=e=>{let t=new Uint8Array(e,0,Math.min(8,e.byteLength));return Nn(t,jn)?`arrow`:Nn(t,Mn)?`parquet`:`arrow`},Fn=[`BOOLEAN`,`INT32`,`INT64`,`INT96`,`FLOAT`,`DOUBLE`,`BYTE_ARRAY`,`FIXED_LEN_BYTE_ARRAY`],In=[`PLAIN`,`GROUP_VAR_INT`,`PLAIN_DICTIONARY`,`RLE`,`BIT_PACKED`,`DELTA_BINARY_PACKED`,`DELTA_LENGTH_BYTE_ARRAY`,`DELTA_BYTE_ARRAY`,`RLE_DICTIONARY`,`BYTE_STREAM_SPLIT`],Ln=[`REQUIRED`,`OPTIONAL`,`REPEATED`],Rn=[`UTF8`,`MAP`,`MAP_KEY_VALUE`,`LIST`,`ENUM`,`DECIMAL`,`DATE`,`TIME_MILLIS`,`TIME_MICROS`,`TIMESTAMP_MILLIS`,`TIMESTAMP_MICROS`,`UINT_8`,`UINT_16`,`UINT_32`,`UINT_64`,`INT_8`,`INT_16`,`INT_32`,`INT_64`,`JSON`,`BSON`,`INTERVAL`],zn=[`UNCOMPRESSED`,`SNAPPY`,`GZIP`,`LZO`,`BROTLI`,`LZ4`,`ZSTD`,`LZ4_RAW`],Bn=[`DATA_PAGE`,`INDEX_PAGE`,`DICTIONARY_PAGE`,`DATA_PAGE_V2`],Vn=[`SPHERICAL`,`VINCENTY`,`THOMAS`,`ANDOYER`,`KARNEY`];function Hn(e){let t=Un(e);if(t.type===1)return{type:`Point`,coordinates:Wn(e,t)};if(t.type===2)return{type:`LineString`,coordinates:Gn(e,t)};if(t.type===3)return{type:`Polygon`,coordinates:Kn(e,t)};if(t.type===4){let n=[];for(let r=0;r<t.count;r++)n.push(Wn(e,Un(e)));return{type:`MultiPoint`,coordinates:n}}else if(t.type===5){let n=[];for(let r=0;r<t.count;r++)n.push(Gn(e,Un(e)));return{type:`MultiLineString`,coordinates:n}}else if(t.type===6){let n=[];for(let r=0;r<t.count;r++)n.push(Kn(e,Un(e)));return{type:`MultiPolygon`,coordinates:n}}else if(t.type===7){let n=[];for(let r=0;r<t.count;r++)n.push(Hn(e));return{type:`GeometryCollection`,geometries:n}}else throw Error(`Unsupported geometry type: ${t.type}`)}function Un(e){let{view:t}=e,n=t.getUint8(e.offset++)===1,r=t.getUint32(e.offset,n);e.offset+=4;let i=r%1e3,a=Math.floor(r/1e3),o=0;i>1&&i<=7&&(o=t.getUint32(e.offset,n),e.offset+=4);let s=2;return a&&s++,a===3&&s++,{littleEndian:n,type:i,dim:s,count:o}}function Wn(e,t){let n=[];for(let r=0;r<t.dim;r++){let r=e.view.getFloat64(e.offset,t.littleEndian);e.offset+=8,n.push(r)}return n}function Gn(e,t){let n=[];for(let r=0;r<t.count;r++)n.push(Wn(e,t));return n}function Kn(e,t){let{view:n}=e,r=[];for(let i=0;i<t.count;i++){let i=n.getUint32(e.offset,t.littleEndian);e.offset+=4,r.push(Gn(e,{...t,count:i}))}return r}const qn=new TextDecoder,Jn={timestampFromMilliseconds(e){return new Date(Number(e))},timestampFromMicroseconds(e){return new Date(Number(e/1000n))},timestampFromNanoseconds(e){return new Date(Number(e/1000000n))},dateFromDays(e){return new Date(e*864e5)},stringFromBytes(e){return e&&qn.decode(e)},geometryFromBytes(e){return e&&Hn({view:new DataView(e.buffer,e.byteOffset,e.byteLength),offset:0})},geographyFromBytes(e){return e&&Hn({view:new DataView(e.buffer,e.byteOffset,e.byteLength),offset:0})}};function Yn(e,t,n,r){if(t&&n.endsWith(`_DICTIONARY`)){let n=e;e instanceof Uint8Array&&!(t instanceof Uint8Array)&&(n=new t.constructor(e.length));for(let r=0;r<e.length;r++)n[r]=t[e[r]];return n}else return Xn(e,r)}function Xn(e,t){let{element:n,parsers:r,utf8:i=!0,schemaPath:a}=t,{type:o,converted_type:s,logical_type:c}=n;if(a?.some(e=>e.element.logical_type?.type===`VARIANT`)&&o===`BYTE_ARRAY`&&s!==`UTF8`&&c?.type!==`STRING`)return e;if(s===`DECIMAL`){let t=10**-(n.scale||0),r=Array(e.length);for(let n=0;n<r.length;n++)e[n]instanceof Uint8Array?r[n]=Zn(e[n])*t:r[n]=Number(e[n])*t;return r}if(!s&&o===`INT96`)return Array.from(e).map(e=>r.timestampFromNanoseconds(Qn(e)));if(s===`DATE`)return Array.from(e).map(e=>r.dateFromDays(e));if(s===`TIMESTAMP_MILLIS`)return Array.from(e).map(e=>r.timestampFromMilliseconds(e));if(s===`TIMESTAMP_MICROS`)return Array.from(e).map(e=>r.timestampFromMicroseconds(e));if(s===`JSON`)return e.map(e=>JSON.parse(qn.decode(e)));if(s===`BSON`)throw Error(`parquet bson not supported`);if(s===`INTERVAL`)throw Error(`parquet interval not supported`);if(c?.type===`GEOMETRY`)return e.map(e=>r.geometryFromBytes(e));if(c?.type===`GEOGRAPHY`)return e.map(e=>r.geographyFromBytes(e));if(s===`UTF8`||c?.type===`STRING`||i&&o===`BYTE_ARRAY`)return e.map(e=>r.stringFromBytes(e));if(s===`UINT_64`||c?.type===`INTEGER`&&c.bitWidth===64&&!c.isSigned){if(e instanceof BigInt64Array)return new BigUint64Array(e.buffer,e.byteOffset,e.length);let t=new BigUint64Array(e.length);for(let n=0;n<t.length;n++)t[n]=BigInt(e[n]);return t}if(s===`UINT_32`||c?.type===`INTEGER`&&c.bitWidth===32&&!c.isSigned){if(e instanceof Int32Array)return new Uint32Array(e.buffer,e.byteOffset,e.length);let t=new Uint32Array(e.length);for(let n=0;n<t.length;n++)t[n]=e[n];return t}if(c?.type===`FLOAT16`)return Array.from(e).map($n);if(c?.type===`TIMESTAMP`){let{unit:t}=c,n=r.timestampFromMilliseconds;t===`MICROS`&&(n=r.timestampFromMicroseconds),t===`NANOS`&&(n=r.timestampFromNanoseconds);let i=Array(e.length);for(let t=0;t<i.length;t++)i[t]=n(e[t]);return i}return e}function Zn(e){if(!e.length)return 0;let t=0n;for(let n of e)t=t*256n+BigInt(n);let n=e.length*8;return t>=2n**BigInt(n-1)&&(t-=2n**BigInt(n)),Number(t)}function Qn(e){let t=(e>>64n)-2440588n,n=e&18446744073709551615n;return t*86400000000000n+n}function $n(e){if(!e)return;let t=e[1]<<8|e[0],n=t>>15?-1:1,r=t>>10&31,i=t&1023;return r===0?n*2**-14*(i/1024):r===31?i?NaN:n*(1/0):n*2**(r-15)*(1+i/1024)}function er(e,t,n){let r=e[t],i=[],a=1;if(r.num_children)for(;i.length<r.num_children;){let r=e[t+a],o=er(e,t+a,[...n,r.name]);a+=o.count,i.push(o)}return{count:a,element:r,children:i,path:n}}function tr(e,t){let n=er(e,0,[]),r=[n];for(let e of t){let i=n.children.find(t=>t.element.name===e);if(!i)throw Error(`parquet schema element not found: ${t}`);r.push(i),n=i}return r}function nr(e){let t=[];function n(e){if(e.children.length)for(let t of e.children)n(t);else t.push(e.path.join(`.`))}return n(e),t}function rr(e){let t=0;for(let{element:n}of e)n.repetition_type===`REPEATED`&&t++;return t}function ir(e){let t=0;for(let{element:n}of e.slice(1))n.repetition_type!==`REQUIRED`&&t++;return t}function ar(e){if(!e||e.element.converted_type!==`LIST`||e.children.length>1)return!1;let t=e.children[0];return!(t.children.length>1||t.element.repetition_type!==`REPEATED`)}function or(e){if(!e||e.element.converted_type!==`MAP`||e.children.length>1)return!1;let t=e.children[0];return!(t.children.length!==2||t.element.repetition_type!==`REPEATED`||t.children.find(e=>e.element.name===`key`)?.element.repetition_type===`REPEATED`||t.children.find(e=>e.element.name===`value`)?.element.repetition_type===`REPEATED`)}function sr(e){if(e.length!==2)return!1;let[,t]=e;return!(t.element.repetition_type===`REPEATED`||t.children.length)}const U={STOP:0,TRUE:1,FALSE:2,BYTE:3,I16:4,I32:5,I64:6,DOUBLE:7,BINARY:8,LIST:9,SET:10,MAP:11,STRUCT:12,UUID:13};function cr(e){let t=0,n={};for(;e.offset<e.view.byteLength;){let[r,i,a]=mr(e,t);if(t=a,r===U.STOP)break;n[`field_${i}`]=lr(e,r)}return n}function lr(e,t){switch(t){case U.TRUE:return!0;case U.FALSE:return!1;case U.BYTE:return e.view.getInt8(e.offset++);case U.I16:case U.I32:return fr(e);case U.I64:return pr(e);case U.DOUBLE:{let t=e.view.getFloat64(e.offset,!0);return e.offset+=8,t}case U.BINARY:{let t=ur(e),n=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,t);return e.offset+=t,n}case U.LIST:{let t=e.view.getUint8(e.offset++),n=t&15,r=t>>4;r===15&&(r=ur(e));let i=n===U.TRUE||n===U.FALSE,a=Array(r);for(let t=0;t<r;t++)a[t]=i?lr(e,U.BYTE)===1:lr(e,n);return a}case U.STRUCT:{let t={},n=0;for(;;){let[r,i,a]=mr(e,n);if(n=a,r===U.STOP)break;t[`field_${i}`]=lr(e,r)}return t}default:throw Error(`thrift unhandled type: ${t}`)}}function ur(e){let t=0,n=0;for(;;){let r=e.view.getUint8(e.offset++);if(t|=(r&127)<<n,!(r&128))return t;n+=7}}function dr(e){let t=0n,n=0n;for(;;){let r=e.view.getUint8(e.offset++);if(t|=BigInt(r&127)<<n,!(r&128))return t;n+=7n}}function fr(e){let t=ur(e);return t>>>1^-(t&1)}function pr(e){let t=dr(e);return t>>1n^-(t&1n)}function mr(e,t){let n=e.view.getUint8(e.offset++),r=n&15;if(r===U.STOP)return[0,0,t];let i=n>>4,a=i?t+i:fr(e);return[r,a,a]}function hr(e,t){let n=new Map,r=t?.find(({key:e})=>e===`geo`)?.value,i=(r&&JSON.parse(r)?.columns)??{};for(let[e,t]of Object.entries(i)){if(t.encoding!==`WKB`)continue;let r=t.edges===`spherical`?`GEOGRAPHY`:`GEOMETRY`,i=t.crs?.id??t.crs?.ids?.[0],a=i?`${i.authority}:${i.code.toString()}`:void 0;n.set(e,{type:r,crs:a})}for(let t=1;t<e.length;t++){let r=e[t],{logical_type:i,name:a,num_children:o,repetition_type:s,type:c}=r;if(o){t+=o;continue}c===`BYTE_ARRAY`&&i===void 0&&s!==`REPEATED`&&(r.logical_type=n.get(a))}}const gr=new TextDecoder;function W(e){return e&&gr.decode(e)}async function _r(e,{parsers:t,initialFetchSize:n=524288,geoparquet:r=!0}={}){if(!e||!(e.byteLength>=0))throw Error(`parquet expected AsyncBuffer`);let i=Math.max(0,e.byteLength-n),a=await e.slice(i,e.byteLength),o=new DataView(a);if(o.getUint32(a.byteLength-4,!0)!==827474256)throw Error(`parquet file invalid (footer != PAR1)`);let s=o.getUint32(a.byteLength-8,!0);if(s>e.byteLength-8)throw Error(`parquet metadata length ${s} exceeds available buffer ${e.byteLength-8}`);if(s+8>n){let n=e.byteLength-s-8,o=await e.slice(n,i),c=new ArrayBuffer(s+8),l=new Uint8Array(c);return l.set(new Uint8Array(o)),l.set(new Uint8Array(a),i-n),vr(c,{parsers:t,geoparquet:r})}else return vr(a,{parsers:t,geoparquet:r})}function vr(e,{parsers:t,geoparquet:n=!0}={}){if(!(e instanceof ArrayBuffer))throw Error(`parquet expected ArrayBuffer`);let r=new DataView(e);if(t={...Jn,...t},r.byteLength<8)throw Error(`parquet file is too short`);if(r.getUint32(r.byteLength-4,!0)!==827474256)throw Error(`parquet file invalid (footer != PAR1)`);let i=r.byteLength-8,a=r.getUint32(i,!0);if(a>r.byteLength-8)throw Error(`parquet metadata length ${a} exceeds available buffer ${r.byteLength-8}`);let o=cr({view:r,offset:i-a}),s=o.field_1,c=o.field_2.map(e=>({type:Fn[e.field_1],type_length:e.field_2,repetition_type:Ln[e.field_3],name:W(e.field_4),num_children:e.field_5,converted_type:Rn[e.field_6],scale:e.field_7,precision:e.field_8,field_id:e.field_9,logical_type:br(e.field_10)})),l=c.filter(e=>e.type),u=o.field_3,d=o.field_4.map(e=>({columns:e.field_1.map((e,n)=>({file_path:W(e.field_1),file_offset:e.field_2,meta_data:e.field_3&&{type:Fn[e.field_3.field_1],encodings:e.field_3.field_2?.map(e=>In[e]),path_in_schema:e.field_3.field_3.map(W),codec:zn[e.field_3.field_4],num_values:e.field_3.field_5,total_uncompressed_size:e.field_3.field_6,total_compressed_size:e.field_3.field_7,key_value_metadata:e.field_3.field_8?.map(e=>({key:W(e.field_1),value:W(e.field_2)})),data_page_offset:e.field_3.field_9,index_page_offset:e.field_3.field_10,dictionary_page_offset:e.field_3.field_11,statistics:Sr(e.field_3.field_12,l[n],t),encoding_stats:e.field_3.field_13?.map(e=>({page_type:Bn[e.field_1],encoding:In[e.field_2],count:e.field_3})),bloom_filter_offset:e.field_3.field_14,bloom_filter_length:e.field_3.field_15,size_statistics:e.field_3.field_16&&{unencoded_byte_array_data_bytes:e.field_3.field_16.field_1,repetition_level_histogram:e.field_3.field_16.field_2,definition_level_histogram:e.field_3.field_16.field_3},geospatial_statistics:e.field_3.field_17&&{bbox:e.field_3.field_17.field_1&&{xmin:e.field_3.field_17.field_1.field_1,xmax:e.field_3.field_17.field_1.field_2,ymin:e.field_3.field_17.field_1.field_3,ymax:e.field_3.field_17.field_1.field_4,zmin:e.field_3.field_17.field_1.field_5,zmax:e.field_3.field_17.field_1.field_6,mmin:e.field_3.field_17.field_1.field_7,mmax:e.field_3.field_17.field_1.field_8},geospatial_types:e.field_3.field_17.field_2}},offset_index_offset:e.field_4,offset_index_length:e.field_5,column_index_offset:e.field_6,column_index_length:e.field_7,crypto_metadata:e.field_8,encrypted_column_metadata:e.field_9})),total_byte_size:e.field_2,num_rows:e.field_3,sorting_columns:e.field_4?.map(e=>({column_idx:e.field_1,descending:e.field_2,nulls_first:e.field_3})),file_offset:e.field_5,total_compressed_size:e.field_6,ordinal:e.field_7})),f=o.field_5?.map(e=>({key:W(e.field_1),value:W(e.field_2)})),p=W(o.field_6);return n&&hr(c,f),{version:s,schema:c,num_rows:u,row_groups:d,key_value_metadata:f,created_by:p,metadata_length:a}}function yr({schema:e}){return tr(e,[])[0]}function br(e){return e?.field_1?{type:`STRING`}:e?.field_2?{type:`MAP`}:e?.field_3?{type:`LIST`}:e?.field_4?{type:`ENUM`}:e?.field_5?{type:`DECIMAL`,scale:e.field_5.field_1,precision:e.field_5.field_2}:e?.field_6?{type:`DATE`}:e?.field_7?{type:`TIME`,isAdjustedToUTC:e.field_7.field_1,unit:xr(e.field_7.field_2)}:e?.field_8?{type:`TIMESTAMP`,isAdjustedToUTC:e.field_8.field_1,unit:xr(e.field_8.field_2)}:e?.field_10?{type:`INTEGER`,bitWidth:e.field_10.field_1,isSigned:e.field_10.field_2}:e?.field_11?{type:`NULL`}:e?.field_12?{type:`JSON`}:e?.field_13?{type:`BSON`}:e?.field_14?{type:`UUID`}:e?.field_15?{type:`FLOAT16`}:e?.field_16?{type:`VARIANT`,specification_version:e.field_16.field_1}:e?.field_17?{type:`GEOMETRY`,crs:W(e.field_17.field_1)}:e?.field_18?{type:`GEOGRAPHY`,crs:W(e.field_18.field_1),algorithm:Vn[e.field_18.field_2]}:e}function xr(e){if(e.field_1)return`MILLIS`;if(e.field_2)return`MICROS`;if(e.field_3)return`NANOS`;throw Error(`parquet time unit required`)}function Sr(e,t,n){return e&&{max:Cr(e.field_1,t,n),min:Cr(e.field_2,t,n),null_count:e.field_3,distinct_count:e.field_4,max_value:Cr(e.field_5,t,n),min_value:Cr(e.field_6,t,n),is_max_value_exact:e.field_7,is_min_value_exact:e.field_8}}function Cr(e,t,n){let{type:r,converted_type:i,logical_type:a}=t;if(e===void 0)return e;if(r===`BOOLEAN`)return e[0]===1;if(r===`BYTE_ARRAY`)return n.stringFromBytes(e);let o=new DataView(e.buffer,e.byteOffset,e.byteLength);return r===`FLOAT`&&o.byteLength===4?o.getFloat32(0,!0):r===`DOUBLE`&&o.byteLength===8?o.getFloat64(0,!0):r===`INT32`&&i===`DATE`?n.dateFromDays(o.getInt32(0,!0)):r===`INT64`&&i===`TIMESTAMP_MILLIS`?n.timestampFromMilliseconds(o.getBigInt64(0,!0)):r===`INT64`&&i===`TIMESTAMP_MICROS`?n.timestampFromMicroseconds(o.getBigInt64(0,!0)):r===`INT64`&&a?.type===`TIMESTAMP`&&a?.unit===`NANOS`?n.timestampFromNanoseconds(o.getBigInt64(0,!0)):r===`INT64`&&a?.type===`TIMESTAMP`&&a?.unit===`MICROS`?n.timestampFromMicroseconds(o.getBigInt64(0,!0)):r===`INT64`&&a?.type===`TIMESTAMP`?n.timestampFromMilliseconds(o.getBigInt64(0,!0)):r===`INT32`&&o.byteLength===4?o.getInt32(0,!0):r===`INT64`&&o.byteLength===8?o.getBigInt64(0,!0):i===`DECIMAL`?Zn(e)*10**-(t.scale||0):a?.type===`FLOAT16`?$n(e):e}function wr(e){let t=cr(e);return{page_locations:t.field_1.map(Tr),unencoded_byte_array_data_bytes:t.field_2}}function Tr(e){return{offset:e.field_1,compressed_page_size:e.field_2,first_row_index:e.field_3}}function Er(e,t){let n=1e4;for(let r=0;r<t.length;r+=n)e.push(...t.slice(r,r+n))}function G(e,t,n=!0){if(n?e===t:e==t)return!0;if(e instanceof Uint8Array&&t instanceof Uint8Array)return G(Array.from(e),Array.from(t),n);if(!e||!t||typeof e!=typeof t)return!1;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let r=0;r<e.length;r++)if(!G(e[r],t[r],n))return!1;return!0}if(typeof e!=`object`)return!1;let r=Object.keys(e);if(r.length!==Object.keys(t).length)return!1;for(let i of r)if(!G(e[i],t[i],n))return!1;return!0}function Dr(e){if(!e)return[];if(e.length===1)return e[0];let t=[];for(let n of e)Er(t,n);return t}function Or(e){if(!e)return[];let t=[];return`$and`in e&&Array.isArray(e.$and)?t.push(...e.$and.flatMap(Or)):`$or`in e&&Array.isArray(e.$or)?t.push(...e.$or.flatMap(Or)):`$nor`in e&&Array.isArray(e.$nor)?t.push(...e.$nor.flatMap(Or)):t.push(...Object.keys(e).map(e=>e.split(`.`)[0])),[...new Set(t)]}function kr(e,t,n=!0){return`$and`in t&&Array.isArray(t.$and)?t.$and.every(t=>kr(e,t,n)):`$or`in t&&Array.isArray(t.$or)?t.$or.some(t=>kr(e,t,n)):`$nor`in t&&Array.isArray(t.$nor)?!t.$nor.some(t=>kr(e,t,n)):Object.entries(t).every(([t,r])=>{let i=jr(e,t);return typeof r!=`object`||!r||Array.isArray(r)?G(i,r,n):Object.entries(r||{}).every(([e,r])=>e===`$gt`?i>r:e===`$gte`?i>=r:e===`$lt`?i<r:e===`$lte`?i<=r:e===`$eq`?G(i,r,n):e===`$ne`?!G(i,r,n):e===`$in`?Array.isArray(r)&&r.includes(i):e===`$nin`?Array.isArray(r)&&!r.includes(i):e===`$not`?!kr({[t]:i},{[t]:r},n):!0)})}function Ar({rowGroup:e,physicalColumns:t,filter:n,strict:r=!0}){if(!n)return!1;if(`$and`in n&&Array.isArray(n.$and))return n.$and.some(n=>Ar({rowGroup:e,physicalColumns:t,filter:n,strict:r}));if(`$or`in n&&Array.isArray(n.$or))return n.$or.every(n=>Ar({rowGroup:e,physicalColumns:t,filter:n,strict:r}));if(`$nor`in n&&Array.isArray(n.$nor))return!1;for(let[i,a]of Object.entries(n)){let n=t.indexOf(i);if(n===-1)continue;let o=e.columns[n].meta_data?.statistics;if(!o)continue;let{min:s,max:c,min_value:l,max_value:u}=o,d=l===void 0?s:l,f=u===void 0?c:u;if(!(d===void 0||f===void 0)){for(let[e,t]of Object.entries(a||{}))if(e===`$gt`&&f<=t||e===`$gte`&&f<t||e===`$lt`&&d>=t||e===`$lte`&&d>t||e===`$eq`&&(t<d||t>f)||e===`$ne`&&G(d,f,r)&&G(d,t,r)||e===`$in`&&Array.isArray(t)&&t.every(e=>e<d||e>f)||e===`$nin`&&Array.isArray(t)&&G(d,f,r)&&t.includes(d))return!0}}return!1}function jr(e,t){let n=e;for(let e of t.split(`.`))n=n?.[e];return n}function Mr({metadata:e,rowStart:t=0,rowEnd:n=1/0,columns:r,filter:i,filterStrict:a=!0,useOffsetIndex:o=!1}){if(!e)throw Error(`parquetPlan requires metadata`);let s=[],c=[],l=[],u=nr(yr(e)),d=0;for(let f of e.row_groups){let e=Number(f.num_rows),p=d+e;if(e>0&&p>t&&d<n&&!Ar({rowGroup:f,physicalColumns:u,filter:i,strict:a})){let i=[],a=1/0,u=-1/0;for(let e of f.columns){let t=e.meta_data;if(e.file_path)throw Error(`parquet file_path not supported`);if(!t)throw Error(`parquet column metadata is undefined`);if(!r||r.includes(t.path_in_schema[0])){let n=t.dictionary_page_offset||t.data_page_offset,r=Number(n),s=Number(n+t.total_compressed_size);if(r<a&&(a=r),s>u&&(u=s),o&&e.offset_index_offset&&e.offset_index_length){let n=Number(e.offset_index_offset);i.push({columnMetadata:t,offsetIndex:{startByte:n,endByte:n+e.offset_index_length},bounds:{startByte:r,endByte:s}})}else i.push({columnMetadata:t,range:{startByte:r,endByte:s}})}}let p=Math.max(t-d,0),m=Math.min(n-d,e);s.push({chunks:i,rowGroup:f,groupStart:d,groupRows:e,selectStart:p,selectEnd:m});let h;for(let e of i)if(`offsetIndex`in e)l.push(e.offsetIndex);else{let{range:t}=e;r?c.push(t):h&&t.endByte-h.startByte<=2097152?h.endByte=t.endByte:(h&&c.push(h),h={...t})}h&&c.push(h)}d=p}return isFinite(n)||(n=d),c.push(...l),{metadata:e,rowStart:t,rowEnd:n,columns:r,fetches:c,groups:s}}function Nr(e,{fetches:t}){let n=t.map(({startByte:t,endByte:n})=>e.slice(t,n));return{byteLength:e.byteLength,slice(r,i=e.byteLength){let a=t.findIndex(({startByte:e,endByte:t})=>e<=r&&i<=t);if(a<0)return e.slice(r,i);if(t[a].startByte!==r||t[a].endByte!==i){let e=r-t[a].startByte,o=i-t[a].startByte;return n[a]instanceof Promise?n[a].then(t=>t.slice(e,o)):n[a].slice(e,o)}else return n[a]}}}const Pr=new TextDecoder,Fr=new WeakMap;function Ir(e,t=Jn){if(Array.isArray(e))return e.map(e=>Ir(e,t));if(typeof e!=`object`)return e;if(`metadata`in e){let n=zr(e.metadata),r=e.typed_value&&Lr(e.typed_value,n,t),i=e.value&&Vr(Rr(e.value),n,t);return r&&i?{...i,...r}:r??i}return e}function Lr(e,t,n){if(e&&typeof e==`object`&&!Array.isArray(e)&&!(e instanceof Uint8Array)){if(`typed_value`in e)return Lr(e.typed_value,t,n);if(`value`in e&&e.value instanceof Uint8Array)return Vr(Rr(e.value),t,n);let r={};for(let[i,a]of Object.entries(e))r[i]=Lr(a,t,n);return r}return e instanceof Uint8Array?Vr(Rr(e),t,n):Array.isArray(e)?e.map(e=>Lr(e,t,n)):e}function Rr(e){return{view:new DataView(e.buffer,e.byteOffset,e.byteLength),offset:0}}function zr(e){let t=Fr.get(e.buffer);t||(t=new Map,Fr.set(e.buffer,t));let n=`${e.byteOffset}:${e.byteLength}`,r=t.get(n);if(r)return r;let i=Rr(e),a=i.view.getUint8(i.offset++),o=a&15;if(o!==1)throw Error(`parquet unsupported variant metadata version: ${o}`);let s=(a>>4&1)==1,c=(a>>6&3)+1,l=Br(i,c),u=Array(l+1);for(let e=0;e<u.length;e++)u[e]=Br(i,c);let d=i.offset,f=Array(l);for(let t=0;t<l;t++){let n=u[t],r=u[t+1],i=new Uint8Array(e.buffer,e.byteOffset+d+n,r-n);f[t]=Pr.decode(i)}let p={dictionary:f,sorted:s};return t.set(n,p),p}function Br(e,t){let n=0;for(let r=0;r<t;r++)n|=e.view.getUint8(e.offset+r)<<r*8;return e.offset+=t,n}function Vr(e,t,n){let r=e.view.getUint8(e.offset++),i=r&3,a=r>>2;if(i===0)return Hr(e,a,n);if(i===2)return Ur(e,a,t,n);if(i===3)return Wr(e,a,t,n);let o=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,a);return e.offset+=a,Pr.decode(o)}function Hr(e,t,n){switch(t){case 0:return null;case 1:return!0;case 2:return!1;case 3:{let t=e.view.getInt8(e.offset);return e.offset+=1,t}case 4:{let t=e.view.getInt16(e.offset,!0);return e.offset+=2,t}case 5:{let t=e.view.getInt32(e.offset,!0);return e.offset+=4,t}case 6:{let t=e.view.getBigInt64(e.offset,!0);return e.offset+=8,t}case 7:{let t=e.view.getFloat64(e.offset,!0);return e.offset+=8,t}case 8:return Gr(e,4);case 9:return Gr(e,8);case 10:return Gr(e,16);case 11:{let t=e.view.getInt32(e.offset,!0);return e.offset+=4,n.dateFromDays(t)}case 12:case 13:{let t=e.view.getBigInt64(e.offset,!0);return e.offset+=8,n.timestampFromMicroseconds(t)}case 14:{let t=e.view.getFloat32(e.offset,!0);return e.offset+=4,t}case 15:return Kr(e);case 16:{let t=Kr(e);return Pr.decode(t)}case 17:{let t=e.view.getBigInt64(e.offset,!0);return e.offset+=8,t}case 18:case 19:{let t=e.view.getBigInt64(e.offset,!0);return e.offset+=8,n.timestampFromNanoseconds(t)}case 20:{let t=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,16);e.offset+=16;let n=Array.from(t,e=>e.toString(16).padStart(2,`0`)).join(``);return`${n.slice(0,8)}-${n.slice(8,12)}-${n.slice(12,16)}-${n.slice(16,20)}-${n.slice(20)}`}default:throw Error(`parquet unsupported variant primitive type: ${t}`)}}function Ur(e,t,n,r){let i=(t&3)+1,a=(t>>2&3)+1,o=t>>4&1?Br(e,4):e.view.getUint8(e.offset++),s=Array(o);for(let t=0;t<o;t++)s[t]=Br(e,a);let c=Array(o+1);for(let t=0;t<c.length;t++)c[t]=Br(e,i);let l={};for(let t=0;t<o;t++){let i=n.dictionary[s[t]];l[i]=Vr({view:e.view,offset:e.offset+c[t]},n,r)}return e.offset+=c[c.length-1],l}function Wr(e,t,n,r){let i=t&3,a=t>>2&1,o=i+1,s=Br(e,a?4:1),c=Array(s+1);for(let t=0;t<c.length;t++)c[t]=Br(e,o);let l=e.offset,u=Array(s);for(let t=0;t<s;t++)u[t]=Vr({view:e.view,offset:l+c[t]},n,r);return e.offset=l+c[c.length-1],u}function Gr(e,t){let n=e.view.getUint8(e.offset);e.offset+=1;let r;if(t===4)r=BigInt(e.view.getInt32(e.offset,!0)),e.offset+=4;else if(t===8)r=e.view.getBigInt64(e.offset,!0),e.offset+=8;else{let t=e.view.getBigUint64(e.offset,!0);r=e.view.getBigInt64(e.offset+8,!0)<<64n|t,e.offset+=16}return Number(r)*10**-n}function Kr(e){let t=e.view.getUint32(e.offset,!0);e.offset+=4;let n=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,t);return e.offset+=t,n}function qr(e,t,n,r,i){let a=ir(i);if(!t?.length&&!n.length){if(!a||!r.length)return r;t=Array(r.length).fill(a)}let o=t?.length||n.length,s=i.map(({element:e})=>e.repetition_type),c=0,l=[e],u=e,d=0,f=0,p=0;if(n[0])for(;d<s.length-2&&p<n[0];)d++,s[d]!==`REQUIRED`&&(u=u.at(-1),l.push(u),f++),s[d]===`REPEATED`&&p++;for(let e=0;e<o;e++){let i=t?.length?t[e]:a,o=n[e];for(;d&&(o<p||s[d]!==`REPEATED`);)s[d]!==`REQUIRED`&&(l.pop(),f--),s[d]===`REPEATED`&&p--,d--;for(u=l.at(-1);(d<s.length-2||s[d+1]===`REPEATED`)&&(f<i||s[d+1]===`REQUIRED`);){if(d++,s[d]!==`REQUIRED`){let e=[];u.push(e),u=e,l.push(e),f++}s[d]===`REPEATED`&&p++}i===a?u.push(r[c++]):d===s.length-2?u.push(null):u.push([])}if(!e.length)for(let e=0;e<a;e++){let e=[];u.push(e),u=e}return e}function Jr(e,t,n,r=0){let i=t.path.join(`.`),a=t.element.repetition_type===`OPTIONAL`,o=a?r+1:r;if(ar(t)){let s=t.children[0],c=o;s.children.length===1&&(s=s.children[0],c++),Jr(e,s,n,c);let l=s.path.join(`.`),u=e.get(l);if(!u)throw Error(`parquet list column missing values`);a&&Yr(u,r),e.set(i,u),e.delete(l);return}if(or(t)){let s=t.children[0].element.name;Jr(e,t.children[0].children[0],n,o+1),Jr(e,t.children[0].children[1],n,o+1);let c=e.get(`${i}.${s}.key`),l=e.get(`${i}.${s}.value`);if(!c)throw Error(`parquet map column missing keys`);if(!l)throw Error(`parquet map column missing values`);if(c.length!==l.length)throw Error(`parquet map column key/value length mismatch`);let u=Xr(c,l,o);a&&Yr(u,r),e.delete(`${i}.${s}.key`),e.delete(`${i}.${s}.value`),e.set(i,u);return}if(t.children.length){let o=t.element.repetition_type===`REQUIRED`?r:r+1,s={};for(let r of t.children){Jr(e,r,n,o);let t=e.get(r.path.join(`.`));if(!t)throw Error(`parquet struct missing child data`);s[r.element.name]=t}for(let n of t.children)e.delete(n.path.join(`.`));let c=Zr(s,o);t.element.logical_type?.type===`VARIANT`&&(c=Ir(c,n)),a&&Yr(c,r),e.set(i,c)}}function Yr(e,t){for(let n=0;n<e.length;n++)t?Yr(e[n],t-1):e[n]=e[n][0]}function Xr(e,t,n){let r=[];for(let i=0;i<e.length;i++)if(n)r.push(Xr(e[i],t[i],n-1));else if(e[i]){let n={};for(let r=0;r<e[i].length;r++){let a=t[i][r];n[e[i][r]]=a===void 0?null:a}r.push(n)}else r.push(void 0);return r}function Zr(e,t){let n=Object.keys(e),r=e[n[0]]?.length,i=[];for(let a=0;a<r;a++){let o={};for(let t of n){if(e[t].length!==r)throw Error(`parquet struct parsing error`);o[t]=e[t][a]}t?i.push(Zr(o,t-1)):i.push(o)}return i}function Qr(e,t,n){let r=n instanceof Int32Array,i=ur(e),a=ur(e);ur(e);let o=pr(e),s=0;n[s++]=r?Number(o):o;let c=i/a;for(;s<t;){let i=pr(e),l=new Uint8Array(a);for(let t=0;t<a;t++)l[t]=e.view.getUint8(e.offset++);for(let u=0;u<a&&s<t;u++){let a=BigInt(l[u]);if(a){let l=0n,u=c,d=(1n<<a)-1n;for(;u&&s<t;){let t=BigInt(e.view.getUint8(e.offset))>>l&d;for(l+=a;l>=8;)l-=8n,e.offset++,l&&(t|=BigInt(e.view.getUint8(e.offset))<<a-l&d);let c=i+t;o+=c,n[s++]=r?Number(o):o,u--}u&&(e.offset+=Math.ceil((u*Number(a)+Number(l))/8))}else for(let e=0;e<c&&s<t;e++)o+=i,n[s++]=r?Number(o):o}}}function $r(e,t,n){let r=new Int32Array(t);Qr(e,t,r);for(let i=0;i<t;i++)n[i]=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,r[i]),e.offset+=r[i]}function ei(e,t,n){let r=new Int32Array(t);Qr(e,t,r);let i=new Int32Array(t);Qr(e,t,i);for(let a=0;a<t;a++){let t=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,i[a]);r[a]?(n[a]=new Uint8Array(r[a]+i[a]),n[a].set(n[a-1].subarray(0,r[a])),n[a].set(t,r[a])):n[a]=t,e.offset+=i[a]}}function ti(e){return 32-Math.clz32(e)}function ni(e,t,n,r){r===void 0&&(r=e.view.getUint32(e.offset,!0),e.offset+=4);let i=e.offset,a=0;for(;a<n.length;){let r=ur(e);if(r&1)a=ii(e,r,t,n,a);else{let i=r>>>1;ri(e,i,t,n,a),a+=i}}e.offset=i+r}function ri(e,t,n,r,i){let a=n+7>>3,o=0;for(let t=0;t<a;t++)o|=e.view.getUint8(e.offset++)<<(t<<3);for(let e=0;e<t;e++)r[i+e]=o}function ii(e,t,n,r,i){let a=t>>1<<3,o=(1<<n)-1,s=0;if(e.offset<e.view.byteLength)s=e.view.getUint8(e.offset++);else if(o)throw Error(`parquet bitpack offset ${e.offset} out of range`);let c=8,l=0;for(;a;)l>8?(l-=8,c-=8,s>>>=8):c-l<n?(s|=e.view.getUint8(e.offset)<<c,e.offset++,c+=8):(i<r.length&&(r[i++]=s>>l&o),a--,l+=n);return i}function ai(e,t,n,r){let i=oi(n,r),a=new Uint8Array(t*i);for(let n=0;n<i;n++)for(let r=0;r<t;r++)a[r*i+n]=e.view.getUint8(e.offset++);if(n===`FLOAT`)return new Float32Array(a.buffer);if(n===`DOUBLE`)return new Float64Array(a.buffer);if(n===`INT32`)return new Int32Array(a.buffer);if(n===`INT64`)return new BigInt64Array(a.buffer);if(n===`FIXED_LEN_BYTE_ARRAY`){let e=Array(t);for(let n=0;n<t;n++)e[n]=a.subarray(n*i,(n+1)*i);return e}throw Error(`parquet byte_stream_split unsupported type: ${n}`)}function oi(e,t){switch(e){case`INT32`:case`FLOAT`:return 4;case`INT64`:case`DOUBLE`:return 8;case`FIXED_LEN_BYTE_ARRAY`:if(!t)throw Error(`parquet byteWidth missing type_length`);return t;default:throw Error(`parquet unsupported type: ${e}`)}}function si(e,t,n,r){if(n===0)return[];if(t===`BOOLEAN`)return ci(e,n);if(t===`INT32`)return li(e,n);if(t===`INT64`)return ui(e,n);if(t===`INT96`)return di(e,n);if(t===`FLOAT`)return fi(e,n);if(t===`DOUBLE`)return pi(e,n);if(t===`BYTE_ARRAY`)return mi(e,n);if(t===`FIXED_LEN_BYTE_ARRAY`){if(!r)throw Error(`parquet missing fixed length`);return hi(e,n,r)}else throw Error(`parquet unhandled type: ${t}`)}function ci(e,t){let n=Array(t);for(let r=0;r<t;r++){let t=e.offset+(r/8|0),i=r%8;n[r]=(e.view.getUint8(t)&1<<i)!=0}return e.offset+=Math.ceil(t/8),n}function li(e,t){let n=(e.view.byteOffset+e.offset)%4?new Int32Array(gi(e.view.buffer,e.view.byteOffset+e.offset,t*4)):new Int32Array(e.view.buffer,e.view.byteOffset+e.offset,t);return e.offset+=t*4,n}function ui(e,t){let n=(e.view.byteOffset+e.offset)%8?new BigInt64Array(gi(e.view.buffer,e.view.byteOffset+e.offset,t*8)):new BigInt64Array(e.view.buffer,e.view.byteOffset+e.offset,t);return e.offset+=t*8,n}function di(e,t){let n=Array(t);for(let r=0;r<t;r++){let t=e.view.getBigInt64(e.offset+r*12,!0),i=e.view.getInt32(e.offset+r*12+8,!0);n[r]=BigInt(i)<<64n|t}return e.offset+=t*12,n}function fi(e,t){let n=(e.view.byteOffset+e.offset)%4?new Float32Array(gi(e.view.buffer,e.view.byteOffset+e.offset,t*4)):new Float32Array(e.view.buffer,e.view.byteOffset+e.offset,t);return e.offset+=t*4,n}function pi(e,t){let n=(e.view.byteOffset+e.offset)%8?new Float64Array(gi(e.view.buffer,e.view.byteOffset+e.offset,t*8)):new Float64Array(e.view.buffer,e.view.byteOffset+e.offset,t);return e.offset+=t*8,n}function mi(e,t){let n=Array(t);for(let r=0;r<t;r++){let t=e.view.getUint32(e.offset,!0);e.offset+=4,n[r]=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,t),e.offset+=t}return n}function hi(e,t,n){let r=Array(t);for(let i=0;i<t;i++)r[i]=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,n),e.offset+=n;return r}function gi(e,t,n){let r=new ArrayBuffer(n);return new Uint8Array(r).set(new Uint8Array(e,t,n)),r}const _i=[0,255,65535,16777215,4294967295];function vi(e,t,n,r,i){for(let a=0;a<i;a++)n[r+a]=e[t+a]}function yi(e,t){let n=e.byteLength,r=t.byteLength,i=0,a=0;for(;i<n;){let t=e[i];if(i++,t<128)break}if(r&&i>=n)throw Error(`invalid snappy length header`);for(;i<n;){let r=e[i],o=0;if(i++,i>=n)throw Error(`missing eof marker`);if(r&3){let s=0;switch(r&3){case 1:o=(r>>>2&7)+4,s=e[i]+(r>>>5<<8),i++;break;case 2:if(n<=i+1)throw Error(`snappy error end of input`);o=(r>>>2)+1,s=e[i]+(e[i+1]<<8),i+=2;break;case 3:if(n<=i+3)throw Error(`snappy error end of input`);o=(r>>>2)+1,s=e[i]+(e[i+1]<<8)+(e[i+2]<<16)+(e[i+3]<<24),i+=4;break;default:break}if(s===0||isNaN(s))throw Error(`invalid offset ${s} pos ${i} inputLength ${n}`);if(s>a)throw Error(`cannot copy from before start of buffer`);vi(t,a-s,t,a,o),a+=o}else{let o=(r>>>2)+1;if(o>60){if(i+3>=n)throw Error(`snappy error literal pos + 3 >= inputLength`);let t=o-60;o=e[i]+(e[i+1]<<8)+(e[i+2]<<16)+(e[i+3]<<24),o=(o&_i[t])+1,i+=t}if(i+o>n)throw Error(`snappy error literal exceeds input length`);vi(e,i,t,a,o),i+=o,a+=o}}if(a!==r)throw Error(`premature end of input`)}function bi(e,t,{type:n,element:r,schemaPath:i}){let a=new DataView(e.buffer,e.byteOffset,e.byteLength),o={view:a,offset:0},s,c=xi(o,t,i),{definitionLevels:l,numNulls:u}=Si(o,t,i),d=t.num_values-u;if(t.encoding===`PLAIN`)s=si(o,n,d,r.type_length);else if(t.encoding===`PLAIN_DICTIONARY`||t.encoding===`RLE_DICTIONARY`||t.encoding===`RLE`){let e=n===`BOOLEAN`?1:a.getUint8(o.offset++);e?(s=Array(d),n===`BOOLEAN`?(ni(o,e,s),s=s.map(e=>!!e)):ni(o,e,s,a.byteLength-o.offset)):s=new Uint8Array(d)}else if(t.encoding===`BYTE_STREAM_SPLIT`)s=ai(o,d,n,r.type_length);else if(t.encoding===`DELTA_BINARY_PACKED`)s=n===`INT32`?new Int32Array(d):new BigInt64Array(d),Qr(o,d,s);else if(t.encoding===`DELTA_LENGTH_BYTE_ARRAY`)s=Array(d),$r(o,d,s);else throw Error(`parquet unsupported encoding: ${t.encoding}`);return{definitionLevels:l,repetitionLevels:c,dataPage:s}}function xi(e,t,n){if(n.length>1){let r=rr(n);if(r){let n=Array(t.num_values);return ni(e,ti(r),n),n}}return[]}function Si(e,t,n){let r=ir(n);if(!r)return{definitionLevels:[],numNulls:0};let i=Array(t.num_values);ni(e,ti(r),i);let a=t.num_values;for(let e of i)e===r&&a--;return a===0&&(i.length=0),{definitionLevels:i,numNulls:a}}function Ci(e,t,n,r){let i,a=r?.[n];if(n===`UNCOMPRESSED`)i=e;else if(a)i=a(e,t);else if(n===`SNAPPY`)i=new Uint8Array(t),yi(e,i);else throw Error(`parquet unsupported compression codec: ${n}`);if(i?.length!==t)throw Error(`parquet decompressed page length ${i?.length} does not match header ${t}`);return i}function wi(e,t,n){let r={view:new DataView(e.buffer,e.byteOffset,e.byteLength),offset:0},{type:i,element:a,schemaPath:o,codec:s,compressors:c}=n,l=t.data_page_header_v2;if(!l)throw Error(`parquet data page header v2 is undefined`);let u=Ti(r,l,o);r.offset=l.repetition_levels_byte_length;let d=Ei(r,l,o),f=t.uncompressed_page_size-l.definition_levels_byte_length-l.repetition_levels_byte_length,p=e.subarray(r.offset);l.is_compressed!==!1&&(p=Ci(p,f,s,c));let m=new DataView(p.buffer,p.byteOffset,p.byteLength),h={view:m,offset:0},g,_=l.num_values-l.num_nulls;if(l.encoding===`PLAIN`)g=si(h,i,_,a.type_length);else if(l.encoding===`RLE`)g=Array(_),ni(h,1,g),g=g.map(e=>!!e);else if(l.encoding===`PLAIN_DICTIONARY`||l.encoding===`RLE_DICTIONARY`){let e=m.getUint8(h.offset++);g=Array(_),ni(h,e,g,f-1)}else if(l.encoding===`DELTA_BINARY_PACKED`)g=i===`INT32`?new Int32Array(_):new BigInt64Array(_),Qr(h,_,g);else if(l.encoding===`DELTA_LENGTH_BYTE_ARRAY`)g=Array(_),$r(h,_,g);else if(l.encoding===`DELTA_BYTE_ARRAY`)g=Array(_),ei(h,_,g);else if(l.encoding===`BYTE_STREAM_SPLIT`)g=ai(h,_,i,a.type_length);else throw Error(`parquet unsupported encoding: ${l.encoding}`);return{definitionLevels:d,repetitionLevels:u,dataPage:g}}function Ti(e,t,n){let r=rr(n);if(!r)return[];let i=Array(t.num_values);return ni(e,ti(r),i,t.repetition_levels_byte_length),i}function Ei(e,t,n){let r=ir(n);if(r){let n=Array(t.num_values);return ni(e,ti(r),n,t.definition_levels_byte_length),n}}function Di(e,{groupStart:t,selectStart:n,selectEnd:r},i,a){let{pathInSchema:o,schemaPath:s}=i,c=sr(s),l=[],u,d,f=0,p=0,m=a&&(()=>{d&&a({pathInSchema:o,columnData:d,rowStart:t+f-d.length,rowEnd:t+f})});for(;(c?f<r:e.offset<e.view.byteLength-1)&&!(e.offset>=e.view.byteLength-1);){let t=ki(e);if(t.type===`DICTIONARY_PAGE`){let{data:n}=Oi(e,t,i,u,void 0,0);n&&(u=Xn(n,i))}else{let r=d?.length||0,a=Oi(e,t,i,u,d,n-f);a.skipped?(l.length||(p+=a.skipped),f+=a.skipped):a.data&&d===a.data?f+=a.data.length-r:a.data&&a.data.length&&(m?.(),l.push(a.data),f+=a.data.length,d=a.data)}}return m?.(),{data:l,skipped:p}}function Oi(e,t,n,r,i,a){let{type:o,element:s,schemaPath:c,codec:l,compressors:u}=n,d=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,t.compressed_page_size);if(e.offset+=t.compressed_page_size,t.type===`DATA_PAGE`){let e=t.data_page_header;if(!e)throw Error(`parquet data page header is undefined`);if(a>e.num_values&&sr(c))return{skipped:e.num_values};let{definitionLevels:o,repetitionLevels:s,dataPage:f}=bi(Ci(d,Number(t.uncompressed_page_size),l,u),e,n),p=Yn(f,r,e.encoding,n);return{skipped:0,data:qr(Array.isArray(i)?i:[],o,s,p,c)}}else if(t.type===`DATA_PAGE_V2`){let e=t.data_page_header_v2;if(!e)throw Error(`parquet data page header v2 is undefined`);if(a>e.num_rows)return{skipped:e.num_values};let{definitionLevels:o,repetitionLevels:s,dataPage:l}=wi(d,t,n),u=Yn(l,r,e.encoding,n);return{skipped:0,data:qr(Array.isArray(i)?i:[],o,s,u,c)}}else if(t.type===`DICTIONARY_PAGE`){let e=t.dictionary_page_header;if(!e)throw Error(`parquet dictionary page header is undefined`);let n=Ci(d,Number(t.uncompressed_page_size),l,u);return{skipped:0,data:si({view:new DataView(n.buffer,n.byteOffset,n.byteLength),offset:0},o,e.num_values,s.type_length)}}else throw Error(`parquet unsupported page type: ${t.type}`)}function ki(e){let t=cr(e);return{type:Bn[t.field_1],uncompressed_page_size:t.field_2,compressed_page_size:t.field_3,crc:t.field_4,data_page_header:t.field_5&&{num_values:t.field_5.field_1,encoding:In[t.field_5.field_2],definition_level_encoding:In[t.field_5.field_3],repetition_level_encoding:In[t.field_5.field_4],statistics:t.field_5.field_5&&{max:t.field_5.field_5.field_1,min:t.field_5.field_5.field_2,null_count:t.field_5.field_5.field_3,distinct_count:t.field_5.field_5.field_4,max_value:t.field_5.field_5.field_5,min_value:t.field_5.field_5.field_6}},index_page_header:t.field_6,dictionary_page_header:t.field_7&&{num_values:t.field_7.field_1,encoding:In[t.field_7.field_2],is_sorted:t.field_7.field_3},data_page_header_v2:t.field_8&&{num_values:t.field_8.field_1,num_nulls:t.field_8.field_2,num_rows:t.field_8.field_3,encoding:In[t.field_8.field_4],definition_levels_byte_length:t.field_8.field_5,repetition_levels_byte_length:t.field_8.field_6,is_compressed:t.field_8.field_7===void 0?!0:t.field_8.field_7,statistics:t.field_8.field_8}}}function Ai(e,{metadata:t},n){let{file:r,compressors:i,utf8:a}=e,o=[],s={...Jn,...e.parsers};for(let c of n.chunks){let{columnMetadata:l}=c,u=tr(t.schema,l.path_in_schema),d={pathInSchema:l.path_in_schema,type:l.type,element:u[u.length-1].element,schemaPath:u,codec:l.codec,parsers:s,compressors:i,utf8:a};if(!(`offsetIndex`in c)){o.push({pathInSchema:l.path_in_schema,data:Promise.resolve(r.slice(c.range.startByte,c.range.endByte)).then(t=>Di({view:new DataView(t),offset:0},n,d,e.onPage))});continue}o.push({pathInSchema:l.path_in_schema,data:Promise.resolve(r.slice(c.offsetIndex.startByte,c.offsetIndex.endByte)).then(async t=>{let i=wr({view:new DataView(t),offset:0}),{selectStart:a,selectEnd:o}=n,s=i.page_locations,c=NaN,l=NaN,u=0;for(let e=0;e<s.length;e++){let t=s[e],r=Number(t.first_row_index),i=e+1<s.length?Number(s[e+1].first_row_index):n.groupRows;r<o&&i>a&&(Number.isNaN(c)&&(c=Number(t.offset),u=r),l=Number(t.offset)+t.compressed_page_size)}let f=await r.slice(c,l),{data:p,skipped:m}=Di({view:new DataView(f),offset:0},u?{...n,groupStart:n.groupStart+u,selectStart:n.selectStart-u,selectEnd:n.selectEnd-u}:n,d,e.onPage);return{data:p,skipped:u+m}})})}return{groupStart:n.groupStart,groupRows:n.groupRows,asyncColumns:o}}async function ji({asyncColumns:e},t,n,r,i){let a=await Promise.all(e.map(async({data:e})=>{let t=await e;return{...t,data:Dr(t.data)}})),o=e.map(e=>e.pathInSchema[0]).filter(e=>!r||r.includes(e)),s=r??o,c=s.map(t=>e.findIndex(e=>e.pathInSchema[0]===t)),l=n-t;if(i===`object`){let n=Array(l);for(let r=0;r<l;r++){let i=t+r,o={};for(let t=0;t<e.length;t++){let{data:n,skipped:r}=a[t];o[e[t].pathInSchema[0]]=n[i-r]}n[r]=o}return n}let u=Array(l);for(let n=0;n<l;n++){let r=t+n,i=Array(e.length);for(let e=0;e<s.length;e++){let t=c[e];if(t>=0){let{data:n,skipped:o}=a[t];i[e]=n[r-o]}}u[n]=i}return u}function Mi(e,t,n){let{asyncColumns:r}=e;n={...Jn,...n};let i=[];for(let e of t.children)if(e.children.length){let t=r.filter(t=>t.pathInSchema[0]===e.element.name);if(!t.length)continue;let a=new Map,o=Promise.all(t.map(e=>e.data.then(({data:t})=>{a.set(e.pathInSchema.join(`.`),Dr(t))}))).then(()=>{Jr(a,e,n);let t=a.get(e.path.join(`.`));if(!t)throw Error(`parquet column data not assembled`);return{data:[t],skipped:0}});i.push({pathInSchema:e.path,data:o})}else{let t=r.find(t=>t.pathInSchema[0]===e.element.name);t&&i.push(t)}return{...e,asyncColumns:i}}async function Ni(e){e.metadata??=await _r(e.file,e);let{rowStart:t=0,rowEnd:n,columns:r,onChunk:i,onComplete:a,rowFormat:o,filter:s,filterStrict:c=!0}=e;if(s&&o!==`object`)throw Error(`parquet filter requires rowFormat: \"object\"`);let l=Or(s);if(l.length){let t=yr(e.metadata).children.map(e=>e.element.name),n=l.filter(e=>!t.includes(e));if(n.length)throw Error(`parquet filter columns not found: ${n.join(`, `)}`)}let u=r,d=!1;if(r&&s){let e=l.filter(e=>!r.includes(e));e.length&&(u=[...r,...e],d=!0)}let f=Pi(u===r?e:{...e,columns:u});if(!a&&!i){for(let{asyncColumns:e}of f)for(let{data:t}of e)await t;return}let p=yr(e.metadata),m=f.map(t=>Mi(t,p,e.parsers));if(i)for(let e of m)for(let t of e.asyncColumns)t.data.then(({data:n,skipped:r})=>{let a=e.groupStart+r;for(let e of n)i({columnName:t.pathInSchema[0],columnData:e,rowStart:a,rowEnd:a+e.length}),a+=e.length});if(a){let e=[];for(let i of m){let a=Math.max(t-i.groupStart,0),f=Math.min((n??1/0)-i.groupStart,i.groupRows),p=o===`object`?await ji(i,a,f,u,`object`):await ji(i,a,f,r,`array`);if(s){for(let t of p)if(kr(t,s,c)){if(d&&r)for(let e of l)r.includes(e)||delete t[e];e.push(t)}}else Er(e,p)}a(e)}else for(let{asyncColumns:e}of m)for(let{data:t}of e)await t}function Pi(e){if(!e.metadata)throw Error(`parquet requires metadata`);let t=Mr(e);return e.file=Nr(e.file,t),t.groups.map(n=>Ai(e,t,n))}var Fi=ArrayBuffer,K=Uint8Array,Ii=Uint16Array,Li=Int16Array,Ri=Int32Array,zi=function(e,t,n){if(K.prototype.slice)return K.prototype.slice.call(e,t,n);(t==null||t<0)&&(t=0),(n==null||n>e.length)&&(n=e.length);var r=new K(n-t);return r.set(e.subarray(t,n)),r},Bi=function(e,t,n,r){if(K.prototype.fill)return K.prototype.fill.call(e,t,n,r);for((n==null||n<0)&&(n=0),(r==null||r>e.length)&&(r=e.length);n<r;++n)e[n]=t;return e},Vi=function(e,t,n,r){if(K.prototype.copyWithin)return K.prototype.copyWithin.call(e,t,n,r);for((n==null||n<0)&&(n=0),(r==null||r>e.length)&&(r=e.length);n<r;)e[t++]=e[n++]},Hi=[`invalid zstd data`,`window size too large (>2046MB)`,`invalid block type`,`FSE accuracy too high`,`match distance too far back`,`unexpected EOF`],q=function(e,t,n){var r=Error(t||Hi[e]);if(r.code=e,Error.captureStackTrace&&Error.captureStackTrace(r,q),!n)throw r;return r},Ui=function(e,t,n){for(var r=0,i=0;r<n;++r)i|=e[t++]<<(r<<3);return i},Wi=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},Gi=function(e,t){var n=e[0]|e[1]<<8|e[2]<<16;if(n==3126568&&e[3]==253){var r=e[4],i=r>>5&1,a=r>>2&1,o=r&3,s=r>>6;r&8&&q(0);var c=6-i,l=o==3?4:o,u=Ui(e,c,l);c+=l;var d=s?1<<s:i,f=Ui(e,c,d)+(s==1&&256),p=f;if(!i){var m=1<<10+(e[5]>>3);p=m+(m>>3)*(e[5]&7)}p>2145386496&&q(1);var h=new K((t==1?f||p:t?0:p)+12);return h[0]=1,h[4]=4,h[8]=8,{b:c+d,y:0,l:0,d:u,w:t&&t!=1?t:h.subarray(12),e:p,o:new Ri(h.buffer,0,3),u:f,c:a,m:Math.min(131072,p)}}else if((n>>4|e[3]<<20)==25481893)return Wi(e,4)+8;q(0)},Ki=function(e){for(var t=0;1<<t<=e;++t);return t-1},qi=function(e,t,n){var r=(t<<3)+4,i=(e[t]&15)+5;i>n&&q(3);for(var a=1<<i,o=a,s=-1,c=-1,l=-1,u=a,d=new Fi(512+(a<<2)),f=new Li(d,0,256),p=new Ii(d,0,256),m=new Ii(d,512,a),h=512+(a<<1),g=new K(d,h,a),_=new K(d,h+a);s<255&&o>0;){var v=Ki(o+1),y=r>>3,b=(1<<v+1)-1,x=(e[y]|e[y+1]<<8|e[y+2]<<16)>>(r&7)&b,S=(1<<v)-1,C=b-o-1,w=x&S;if(w<C?(r+=v,x=w):(r+=v+1,x>S&&(x-=C)),f[++s]=--x,x==-1?(o+=x,g[--u]=s):o-=x,!x)do{var T=r>>3;c=(e[T]|e[T+1]<<8)>>(r&7)&3,r+=2,s+=c}while(c==3)}(s>255||o)&&q(0);for(var E=0,D=(a>>1)+(a>>3)+3,O=a-1,k=0;k<=s;++k){var A=f[k];if(A<1){p[k]=-A;continue}for(l=0;l<A;++l){g[E]=k;do E=E+D&O;while(E>=u)}}for(E&&q(0),l=0;l<a;++l){var j=p[g[l]]++;m[l]=(j<<(_[l]=i-Ki(j)))-a}return[r+7>>3,{b:i,s:g,n:_,t:m}]},Ji=function(e,t){var n=0,r=-1,i=new K(292),a=e[t],o=i.subarray(0,256),s=i.subarray(256,268),c=new Ii(i.buffer,268);if(a<128){var l=qi(e,t+1,6),u=l[0],d=l[1];t+=a;var f=u<<3,p=e[t];p||q(0);for(var m=0,h=0,g=d.b,_=g,v=(++t<<3)-8+Ki(p);v-=g,!(v<f);){var y=v>>3;if(m+=(e[y]|e[y+1]<<8)>>(v&7)&(1<<g)-1,o[++r]=d.s[m],v-=_,v<f)break;y=v>>3,h+=(e[y]|e[y+1]<<8)>>(v&7)&(1<<_)-1,o[++r]=d.s[h],g=d.n[m],m=d.t[m],_=d.n[h],h=d.t[h]}++r>255&&q(0)}else{for(r=a-127;n<r;n+=2){var b=e[++t];o[n]=b>>4,o[n+1]=b&15}++t}var x=0;for(n=0;n<r;++n){var S=o[n];S>11&&q(0),x+=S&&1<<S-1}var C=Ki(x)+1,w=1<<C,T=w-x;for(T&T-1&&q(0),o[r++]=Ki(T)+1,n=0;n<r;++n){var S=o[n];++s[o[n]=S&&C+1-S]}var E=new K(w<<1),D=E.subarray(0,w),O=E.subarray(w);for(c[C]=0,n=C;n>0;--n){var k=c[n];Bi(O,n,k,c[n-1]=k+s[n]*(1<<C-n))}for(c[0]!=w&&q(0),n=0;n<r;++n){var A=o[n];if(A){var j=c[A];Bi(D,n,j,c[A]=j+(1<<C-A))}}return[t,{n:O,b:C,s:D}]},Yi=qi(new K([81,16,99,140,49,198,24,99,12,33,196,24,99,102,102,134,70,146,4]),0,6)[1],Xi=qi(new K([33,20,196,24,99,140,33,132,16,66,8,33,132,16,66,8,33,68,68,68,68,68,68,68,68,36,9]),0,6)[1],Zi=qi(new K([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],Qi=function(e,t){for(var n=e.length,r=new Ri(n),i=0;i<n;++i)r[i]=t,t+=1<<e[i];return r},$i=new K(new Ri([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),ea=Qi($i,0),ta=new K(new Ri([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),na=Qi(ta,3),ra=function(e,t,n){var r=e.length,i=t.length,a=e[r-1],o=(1<<n.b)-1,s=-n.b;a||q(0);for(var c=0,l=n.b,u=(r<<3)-8+Ki(a)-l,d=-1;u>s&&d<i;){var f=u>>3,p=(e[f]|e[f+1]<<8|e[f+2]<<16)>>(u&7);c=(c<<l|p)&o,t[++d]=n.s[c],u-=l=n.n[c]}(u!=s||d+1!=i)&&q(0)},ia=function(e,t,n){var r=6,i=t.length+3>>2,a=i<<1,o=i+a;ra(e.subarray(r,r+=e[0]|e[1]<<8),t.subarray(0,i),n),ra(e.subarray(r,r+=e[2]|e[3]<<8),t.subarray(i,a),n),ra(e.subarray(r,r+=e[4]|e[5]<<8),t.subarray(a,o),n),ra(e.subarray(r),t.subarray(o),n)},aa=function(e,t,n){var r,i=t.b,a=e[i],o=a>>1&3;t.l=a&1;var s=a>>3|e[i+1]<<5|e[i+2]<<13,c=(i+=3)+s;if(o==1)return i>=e.length?void 0:(t.b=i+1,n?(Bi(n,e[i],t.y,t.y+=s),n):Bi(new K(s),e[i]));if(!(c>e.length)){if(o==0)return t.b=c,n?(n.set(e.subarray(i,c),t.y),t.y+=s,n):zi(e,i,c);if(o==2){var l=e[i],u=l&3,d=l>>2&3,f=l>>4,p=0,m=0;u<2?d&1?f|=e[++i]<<4|(d&2&&e[++i]<<12):f=l>>3:(m=d,d<2?(f|=(e[++i]&63)<<4,p=e[i]>>6|e[++i]<<2):d==2?(f|=e[++i]<<4|(e[++i]&3)<<12,p=e[i]>>2|e[++i]<<6):(f|=e[++i]<<4|(e[++i]&63)<<12,p=e[i]>>6|e[++i]<<2|e[++i]<<10)),++i;var h=n?n.subarray(t.y,t.y+t.m):new K(t.m),g=h.length-f;if(u==0)h.set(e.subarray(i,i+=f),g);else if(u==1)Bi(h,e[i++],g);else{var _=t.h;if(u==2){var v=Ji(e,i);p+=i-(i=v[0]),t.h=_=v[1]}else _||q(0);(m?ia:ra)(e.subarray(i,i+=p),h.subarray(g),_)}var y=e[i++];if(y){y==255?y=(e[i++]|e[i++]<<8)+32512:y>127&&(y=y-128<<8|e[i++]);var b=e[i++];b&3&&q(0);for(var x=[Xi,Zi,Yi],S=2;S>-1;--S){var C=b>>(S<<1)+2&3;if(C==1){var w=new K([0,0,e[i++]]);x[S]={s:w.subarray(2,3),n:w.subarray(0,1),t:new Ii(w.buffer,0,1),b:0}}else C==2?(r=qi(e,i,9-(S&1)),i=r[0],x[S]=r[1]):C==3&&(t.t||q(0),x[S]=t.t[S])}var T=t.t=x,E=T[0],D=T[1],O=T[2],k=e[c-1];k||q(0);var A=(c<<3)-8+Ki(k)-O.b,j=A>>3,M=0,ee=(e[j]|e[j+1]<<8)>>(A&7)&(1<<O.b)-1;j=(A-=D.b)>>3;var N=(e[j]|e[j+1]<<8)>>(A&7)&(1<<D.b)-1;j=(A-=E.b)>>3;var P=(e[j]|e[j+1]<<8)>>(A&7)&(1<<E.b)-1;for(++y;--y;){var F=O.s[ee],te=O.n[ee],ne=E.s[P],re=E.n[P],ie=D.s[N],I=D.n[N];j=(A-=ie)>>3;var ae=1<<ie,L=ae+((e[j]|e[j+1]<<8|e[j+2]<<16|e[j+3]<<24)>>>(A&7)&ae-1);j=(A-=ta[ne])>>3;var oe=na[ne]+((e[j]|e[j+1]<<8|e[j+2]<<16)>>(A&7)&(1<<ta[ne])-1);j=(A-=$i[F])>>3;var se=ea[F]+((e[j]|e[j+1]<<8|e[j+2]<<16)>>(A&7)&(1<<$i[F])-1);if(j=(A-=te)>>3,ee=O.t[ee]+((e[j]|e[j+1]<<8)>>(A&7)&(1<<te)-1),j=(A-=re)>>3,P=E.t[P]+((e[j]|e[j+1]<<8)>>(A&7)&(1<<re)-1),j=(A-=I)>>3,N=D.t[N]+((e[j]|e[j+1]<<8)>>(A&7)&(1<<I)-1),L>3)t.o[2]=t.o[1],t.o[1]=t.o[0],t.o[0]=L-=3;else{var ce=L-(se!=0);ce?(L=ce==3?t.o[0]-1:t.o[ce],ce>1&&(t.o[2]=t.o[1]),t.o[1]=t.o[0],t.o[0]=L):L=t.o[0]}for(var S=0;S<se;++S)h[M+S]=h[g+S];M+=se,g+=se;var le=M-L;if(le<0){var ue=-le,de=t.e+le;ue>oe&&(ue=oe);for(var S=0;S<ue;++S)h[M+S]=t.w[de+S];M+=ue,oe-=ue,le=0}for(var S=0;S<oe;++S)h[M+S]=h[le+S];M+=oe}if(M!=g)for(;g<h.length;)h[M++]=h[g++];else M=h.length;n?t.y+=M:h=zi(h,0,M)}else if(n){if(t.y+=f,g)for(var S=0;S<f;++S)h[S]=h[g+S]}else g&&(h=zi(h,g));return t.b=c,h}q(2)}},oa=function(e,t){if(e.length==1)return e[0];for(var n=new K(t),r=0,i=0;r<e.length;++r){var a=e[r];n.set(a,i),i+=a.length}return n};function sa(e,t){for(var n=[],r=+!t,i=0,a=0;e.length;){var o=Gi(e,r||t);if(typeof o==`object`){for(r?(t=null,o.w.length==o.u&&(n.push(t=o.w),a+=o.u)):(n.push(t),o.e=0);!o.l;){var s=aa(e,o,t);s||q(5),t?o.e=o.y:(n.push(s),a+=s.length,Vi(o.w,0,s.length),o.w.set(s,o.w.length-s.length))}i=o.b+o.c*4}else i=o;e=e.subarray(i)}return oa(n,a)}function ca(){let e=la();return(t,n)=>{let{memory:r,uncompress:i}=e.exports,a=68e3,o=a+t.byteLength,s=a+t.byteLength+n;if(r.buffer.byteLength<s){let e=64*1024,t=r.buffer.byteLength/e,n=Math.ceil(s/e)-t;r.grow(n)}let c=new Uint8Array(r.buffer);c.set(t,a);let l=i(a,t.byteLength,o);if(l===-1)throw Error(`invalid snappy length header`);if(l===-2)throw Error(`missing eof marker`);if(l===-3)throw Error(`premature end of input`);if(l)throw Error(`failed to uncompress data ${l}`);return c.slice(o,o+n)}}function la(){let e=atob(ua),t=new Uint8Array(e.length);for(let n=0;n<e.length;n+=1)t[n]=e.charCodeAt(n);let n=new WebAssembly.Module(t);return new WebAssembly.Instance(n)}const ua=`AGFzbQEAAAABEANgAABgA39/fwF/YAF/AX8DBgUAAQEBAgUDAQACBj8KfwFBoIwEC38AQYAIC38AQaAMC38AQaAMC38AQaCMBAt/AEGACAt/AEGgjAQLfwBBgIAIC38AQQALfwBBAQsHwQEOBm1lbW9yeQIAEV9fd2FzbV9jYWxsX2N0b3JzAAAGbWVtY3B5AAEHbWVtbW92ZQACCnVuY29tcHJlc3MAAwxfX2Rzb19oYW5kbGUDAQpfX2RhdGFfZW5kAwILX19zdGFja19sb3cDAwxfX3N0YWNrX2hpZ2gDBA1fX2dsb2JhbF9iYXNlAwULX19oZWFwX2Jhc2UDBgpfX2hlYXBfZW5kAwcNX19tZW1vcnlfYmFzZQMIDF9fdGFibGVfYmFzZQMJCuASBQIAC8sBAQN/AkAgAkUNAAJAAkAgAkEHcSIDDQAgACEEIAIhBQwBCyAAIQQgAiEFA0AgBCABLQAAOgAAIARBAWohBCABQQFqIQEgBUF/aiEFIANBf2oiAw0ACwsgAkEISQ0AA0AgBCABLQAAOgAAIAQgAS0AAToAASAEIAEtAAI6AAIgBCABLQADOgADIAQgAS0ABDoABCAEIAEtAAU6AAUgBCABLQAGOgAGIAQgAS0ABzoAByAEQQhqIQQgAUEIaiEBIAVBeGoiBQ0ACwsgAAugAwEEfwJAIAAgAUYNAAJAAkAgACABSQ0AIAEgAmoiAyAASw0BCyACRQ0BAkACQCACQQdxIgMNACAAIQQgAiEFDAELIAAhBCACIQUDQCAEIAEtAAA6AAAgBEEBaiEEIAFBAWohASAFQX9qIQUgA0F/aiIDDQALCyACQQhJDQEDQCAEIAEtAAA6AAAgBCABLQABOgABIAQgAS0AAjoAAiAEIAEtAAM6AAMgBCABLQAEOgAEIAQgAS0ABToABSAEIAEtAAY6AAYgBCABLQAHOgAHIARBCGohBCABQQhqIQEgBUF4aiIFDQAMAgsLIAJFDQACQAJAIAJBA3EiBA0AIAAgAmohBiACIQUMAQsgAiEFA0AgBUF/aiIFIABqIgYgBSABaiIDLQAAOgAAIARBf2oiBA0ACwsgAkEESQ0AIAZBfGohASADQXxqIQQDQCABQQNqIARBA2otAAA6AAAgAUECaiAEQQJqLQAAOgAAIAFBAWogBEEBai0AADoAACABIAQtAAA6AAAgAUF8aiEBIARBfGohBCAFQXxqIgUNAAsLIAALswoBCX8jgICAgABBIGsiAySAgICAACADQQlqQgA3AAAgA0IANwIEIAMgA0EYajYCAEF/IQQCQCABRQ0AIAMgAUF/aiIFNgIcIAMgAEEBajYCGCAALAAAIgZB/wBxIQcCQCAGQX9KDQAgBUUNASADIAFBfmoiBTYCHCADIABBAmo2AhggACwAASIGQf8AcUEHdCAHciEHQX8hBCAGQX9KDQAgBUUNASADIAFBfWoiBTYCHCADIABBA2o2AhggACwAAiIGQf8AcUEOdCAHciEHQX8hBCAGQX9KDQAgBUUNASADIAFBfGoiBTYCHCADIABBBGo2AhggACwAAyIGQf8AcUEVdCAHciEHQX8hBCAGQX9KDQAgBUUNASADIAFBe2o2AhwgAyAAQQVqNgIYIAAsAAQiAUEASA0BIAFBHHQgB3IhBwsgAiAHaiEIAkACQCADEISAgIAADQAgAiEADAELIAMoAgQhASACIQADQAJAIAMoAgggAWtBBEoNACADIAE2AgQgAxCEgICAAEUNAiADKAIEIQELIAFBAWohBQJAAkAgAS0AACIGQQNxDQAgCCAAayEJIAMoAggiCiAFayEEIAZBAnYiC0EBaiEHAkAgBkE/Sw0AIARBEEkNACAJQRBIDQAgACABKAIBNgIAIAAgASgCBTYCBCAAIAEoAgk2AgggACABKAINNgIMIAAgB2ohACADKAIIIAUgB2oiAWtBBEoNAyADIAE2AgQgAxCEgICAAEUNBAwCCwJAAkAgBkHwAU8NACAFIQYMAQsgCiAFIAtBRWoiAWoiBmshBCABQQJ0QYCIgIAAaigCACAFKAIAcUEBaiEHCwJAIAcgBE0NAANAIAggAGsgBEkNBSAAIAYgBBCBgICAACEAIAMoAgAiASABKAIAIgkgAygCDCIFaiIGNgIAIAFBBGoiASABKAIAIgogBWsiATYCACADIAE2AgwgACAEaiEAIAFFDQUgAyAJIApqNgIIIAcgBGshByABIQQgByABSw0ACyAIIABrIQkLIAkgB0kNAyAAIAYgBxCBgICAACAHaiEAIAMoAgggBiAHaiIBa0EESg0CIAMgATYCBCADEISAgIAADQEMAwsgACACayAGQQF0QaCIgIAAai8BACIBQQt2IgpBAnRBgIiAgABq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`,da=4096;2*da+32;const fa=2*da-1,pa=new Uint32Array([0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535,131071,262143,524287,1048575,2097151,4194303,8388607,16777215]);function J(e){this.buf_=new Uint8Array(8224),this.input_=e,this.buf_ptr_=0,this.val_=0,this.pos_=0,this.reset()}J.READ_SIZE=da,J.IBUF_MASK=fa,J.prototype.reset=function(){this.buf_ptr_=0,this.val_=0,this.pos_=0,this.bit_pos_=0,this.bit_end_pos_=0,this.eos_=0,this.readMoreInput();for(let e=0;e<4;e++)this.val_|=this.buf_[this.pos_]<<8*e,this.pos_++;return this.bit_end_pos_>0},J.prototype.readMoreInput=function(){if(!(this.bit_end_pos_>256))if(this.eos_){if(this.bit_pos_>this.bit_end_pos_)throw Error(`Unexpected end of input `+this.bit_pos_+` `+this.bit_end_pos_)}else{let e=this.buf_ptr_,t=this.input_.read(this.buf_,e,da);if(t<0)throw Error(`Unexpected end of input`);if(t<da){this.eos_=1;for(let n=0;n<32;n++)this.buf_[e+t+n]=0}if(e===0){for(let e=0;e<32;e++)this.buf_[(da<<1)+e]=this.buf_[e];this.buf_ptr_=da}else this.buf_ptr_=0;this.bit_end_pos_+=t<<3}},J.prototype.fillBitWindow=function(){for(;this.bit_pos_>=8;)this.val_>>>=8,this.val_|=this.buf_[this.pos_&fa]<<24,this.pos_++,this.bit_pos_=this.bit_pos_-8>>>0,this.bit_end_pos_=this.bit_end_pos_-8>>>0},J.prototype.readBits=function(e){32-this.bit_pos_<e&&this.fillBitWindow();let t=this.val_>>>this.bit_pos_&pa[e];return this.bit_pos_+=e,t};const ma=new Uint8Array([1,2,3,4,0,5,17,6,16,7,8,9,10,11,12,13,14,15]),ha=new Uint16Array([256,402,436,468,500,534,566,598,630,662,694,726,758,790,822,854,886,920,952,984,1016,1048,1080]);function Y(e,t){this.bits=e,this.value=t}function ga(e,t){let n=1<<t-1;for(;e&n;)n>>=1;return(e&n-1)+n}function _a(e,t,n,r,i){do r-=n,e[t+r]=new Y(i.bits,i.value);while(r>0)}function va(e,t,n){let r=1<<t-n;for(;t<15&&(r-=e[t],!(r<=0));)++t,r<<=1;return t-n}function ya(e,t,n,r,i){let a=t,o=new Int32Array(16),s=new Int32Array(16),c=new Int32Array(i);for(let e=0;e<i;e++)o[r[e]]++;s[1]=0;for(let e=1;e<15;e++)s[e+1]=s[e]+o[e];for(let e=0;e<i;e++)r[e]!==0&&(c[s[r[e]]++]=e);let l=n,u=1<<l,d=u;if(s[15]===1){for(let n=0;n<d;++n)e[t+n]=new Y(0,c[0]&65535);return d}let f=0,p=0;for(let r=1,i=2;r<=n;++r,i<<=1)for(;o[r]>0;--o[r]){let n=new Y(r&255,c[p++]&65535);_a(e,t+f,i,u,n),f=ga(f,r)}let m=d-1,h=-1;for(let r=n+1,i=2;r<=15;++r,i<<=1)for(;o[r]>0;--o[r]){(f&m)!==h&&(t+=u,l=va(o,r,n),u=1<<l,d+=u,h=f&m,e[a+h]=new Y(l+n&255,t-a-h&65535));let s=new Y(r-n&255,c[p++]&65535);_a(e,t+(f>>n),i,u,s),f=ga(f,r)}return d}function ba(e,t,n,r){let i=new Uint8Array(e);r.readMoreInput();let a=r.readBits(2);if(a===1){let t=e-1,n=0,a=new Int32Array(4),o=r.readBits(2)+1;for(;t;)t>>=1,n++;for(let t=0;t<o;t++)a[t]=r.readBits(n)%e,i[a[t]]=2;switch(i[a[0]]=1,o){case 1:break;case 3:if(a[0]===a[1]||a[0]===a[2]||a[1]===a[2])throw Error(`[ReadHuffmanCode] invalid symbols`);break;case 2:if(a[0]===a[1])throw Error(`[ReadHuffmanCode] invalid symbols`);i[a[1]]=1;break;case 4:if(a[0]===a[1]||a[0]===a[2]||a[0]===a[3]||a[1]===a[2]||a[1]===a[3]||a[2]===a[3])throw Error(`[ReadHuffmanCode] invalid symbols`);r.readBits(1)?(i[a[2]]=3,i[a[3]]=3):i[a[0]]=2;break}}else{let t=new Uint8Array(18),n=32,o=0,s=[new Y(2,0),new Y(2,4),new Y(2,3),new Y(3,2),new Y(2,0),new Y(2,4),new Y(2,3),new Y(4,1),new Y(2,0),new Y(2,4),new Y(2,3),new Y(3,2),new Y(2,0),new Y(2,4),new Y(2,3),new Y(4,5)];for(let e=a;e<18&&n>0;e++){let i=ma[e],a=0;r.fillBitWindow(),a+=r.val_>>>r.bit_pos_&15,r.bit_pos_+=s[a].bits;let c=s[a].value;t[i]=c,c!==0&&(n-=32>>c,o++)}if(!(o===1||n===0))throw Error(`[ReadHuffmanCode] invalid num_codes or space`);Sa(t,e,i,r)}let o=ya(t,n,8,i,e);if(!o)throw Error(`brotli BuildHuffmanTable failed`);return o}function xa(e,t,n){n.fillBitWindow(),t+=n.val_>>>n.bit_pos_&255;let r=e[t].bits-8;return r>0&&(n.bit_pos_+=8,t+=e[t].value,t+=n.val_>>>n.bit_pos_&(1<<r)-1),n.bit_pos_+=e[t].bits,e[t].value}function Sa(e,t,n,r){let i=0,a=8,o=0,s=0,c=32768,l=[];for(let e=0;e<32;e++)l.push(new Y(0,0));for(ya(l,0,5,e,18);i<t&&c>0;){let e=0;r.readMoreInput(),r.fillBitWindow(),e+=r.val_>>>r.bit_pos_&31,r.bit_pos_+=l[e].bits;let u=l[e].value&255;if(u<16)o=0,n[i++]=u,u!==0&&(a=u,c-=32768>>u);else{let e=u-14,l=0;u===16&&(l=a),s!==l&&(o=0,s=l);let d=o;o>0&&(o-=2,o<<=e),o+=r.readBits(e)+3;let f=o-d;if(i+f>t)throw Error(`[ReadHuffmanCodeLengths] symbol + repeat_delta > num_symbols`);for(let e=0;e<f;e++)n[i+e]=s;i+=f,s!==0&&(c-=f<<15-s)}}if(c!==0)throw Error(`[ReadHuffmanCodeLengths] space = `+c);for(;i<t;i++)n[i]=0}function Ca(e,t){this.alphabet_size=e,this.num_htrees=t,this.codes=Array(t+t*ha[e+31>>>5]),this.htrees=new Uint32Array(t)}Ca.prototype.decode=function(e){let t=0;for(let n=0;n<this.num_htrees;n++)this.htrees[n]=t,t+=ba(this.alphabet_size,this.codes,t,e)};function wa([e,t]){return{offset:e,nbits:t}}const Ta=[[1,2],[5,2],[9,2],[13,2],[17,3],[25,3],[33,3],[41,3],[49,4],[65,4],[81,4],[97,4],[113,5],[145,5],[177,5],[209,5],[241,6],[305,6],[369,7],[497,8],[753,9],[1265,10],[2289,11],[4337,12],[8433,13],[16625,24]].map(wa),Ea=[[0,0],[1,0],[2,0],[3,0],[4,0],[5,0],[6,1],[8,1],[10,2],[14,2],[18,3],[26,3],[34,4],[50,4],[66,5],[98,5],[130,6],[194,7],[322,8],[578,9],[1090,10],[2114,12],[6210,14],[22594,24]].map(wa),Da=[[2,0],[3,0],[4,0],[5,0],[6,0],[7,0],[8,0],[9,0],[10,1],[12,1],[14,2],[18,2],[22,3],[30,3],[38,4],[54,4],[70,5],[102,5],[134,6],[198,7],[326,8],[582,9],[1094,10],[2118,24]].map(wa),Oa=[0,0,8,8,0,16,8,16,16],ka=[0,8,0,8,16,0,16,8,16],X=1080,Aa=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,0,0,0]),ja=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,0,0]);function Ma(e,t){let n=new Uint16Array(31);for(let r=0;r<31;r++)n[r]=t+=1<<e[r-1];let r=new Int32Array(n[30]);for(let e=1;e<30;e++)for(let t=n[e];t<n[e+1];++t)r[t]=t-n[e]<<5|e;return{base:n,rev:r}}const{base:Na,rev:Pa}=Ma(Aa,2);Na[28]=258,Pa[258]=28;const{base:Fa}=Ma(ja,0),Ia=new Uint16Array(32768);for(let e=0;e<32768;e++){let t=(e&43690)>>1|(e&21845)<<1;t=(t&52428)>>2|(t&13107)<<2,t=(t&61680)>>4|(t&3855)<<4,Ia[e]=((t&65280)>>8|(t&255)<<8)>>1}function La(e,t,n){let r=new Uint16Array(t);for(let t=0;t<e.length;t++)e[t]&&++r[e[t]-1];let i=new Uint16Array(t);for(let e=1;e<t;e++)i[e]=i[e-1]+r[e-1]<<1;let a;if(n){a=new Uint16Array(1<<t);let n=15-t;for(let r=0;r<e.length;r++)if(e[r]){let o=r<<4|e[r],s=t-e[r],c=i[e[r]-1]++<<s;for(let e=c|(1<<s)-1;c<=e;c++)a[Ia[c]>>n]=o}}else{a=new Uint16Array(e.length);for(let t=0;t<e.length;t++)e[t]&&(a[t]=Ia[i[e[t]-1]++]>>15-e[t])}return a}const Ra=new Uint8Array(288);for(let e=0;e<144;e++)Ra[e]=8;for(let e=144;e<256;e++)Ra[e]=9;for(let e=256;e<280;e++)Ra[e]=7;for(let e=280;e<288;e++)Ra[e]=8;const za=new Uint8Array(32);for(let e=0;e<32;e++)za[e]=5;const Ba=La(Ra,9,1),Va=La(za,5,1);function Ha(e,t,n,r,i,a,o){let s=n*2,c=n,l=xa(t,n*X,o),u;u=l===0?i[s+(a[c]&1)]:l===1?i[s+(a[c]-1&1)]+1:l-2,u>=e&&(u-=e),r[n]=u,i[s+(a[c]&1)]=u,a[c]++}function Ua(e){let t={meta_block_length:0,input_end:0,is_uncompressed:0,is_metadata:!1};if(t.input_end=e.readBits(1),t.input_end&&e.readBits(1))return t;let n=e.readBits(2)+4;if(n===7){if(t.is_metadata=!0,e.readBits(1)!==0)throw Error(`Invalid reserved bit`);let n=e.readBits(2);if(n===0)return t;for(let r=0;r<n;r++){let i=e.readBits(8);if(r+1===n&&n>1&&i===0)throw Error(`Invalid size byte`);t.meta_block_length|=i<<r*8}}else for(let r=0;r<n;r++){let i=e.readBits(4);if(r+1===n&&n>4&&i===0)throw Error(`Invalid size nibble`);t.meta_block_length|=i<<r*4}return t.meta_block_length++,!t.input_end&&!t.is_metadata&&(t.is_uncompressed=e.readBits(1)),t}function Wa(e,t,n,r,i,a){let o=i+1,s=n&i,c=a.pos_&J.IBUF_MASK;if(t<8||a.bit_pos_+(t<<3)<a.bit_end_pos_){for(;t-- >0;)a.readMoreInput(),r[s++]=a.readBits(8),s===o&&(e.write(r,o),s=0);return}if(a.bit_end_pos_<32)throw Error(`copyUncompressedBlockToOutput: br.bit_end_pos_ < 32`);for(;a.bit_pos_<32;)r[s]=a.val_>>>a.bit_pos_,a.bit_pos_+=8,s++,t--;let l=a.bit_end_pos_-a.bit_pos_>>3;if(c+l>J.IBUF_MASK){let e=J.IBUF_MASK+1-c;for(let t=0;t<e;t++)r[s+t]=a.buf_[c+t];l-=e,s+=e,t-=e,c=0}for(let e=0;e<l;e++)r[s+e]=a.buf_[c+e];if(s+=l,t-=l,s>=o){e.write(r,o),s-=o;for(let e=0;e<s;e++)r[e]=r[o+e]}for(;s+t>=o;){if(l=o-s,a.input_.read(r,s,l)<l)throw Error(`copyUncompressedBlockToOutput: not enough bytes`);e.write(r,o),t-=l,s=0}if(a.input_.read(r,s,t)<t)throw Error(`copyUncompressedBlockToOutput: not enough bytes`);a.reset()}function Ga(e){if(e.readBits(1)){let t=e.readBits(3);return t===0?1:e.readBits(t)+(1<<t)}return 0}function Ka(e){if(e.readBits(1)===0)return 16;let t=e.readBits(3);return t>0?17+t:(t=e.readBits(3),t>0?8+t:17)}function qa(e){let t=e.bit_pos_+7&-8;return!e.readBits(t-e.bit_pos_)}function Ja(e,t,n){let{offset:r,nbits:i}=Ta[xa(e,t,n)];return r+n.readBits(i)}const Ya=new Uint8Array([0,0,0,0,0,0,0,0,0,4,4,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,12,16,12,12,20,12,16,24,28,12,12,32,12,36,12,44,44,44,44,44,44,44,44,44,44,32,32,24,40,28,12,12,48,52,52,52,48,52,52,52,48,52,52,52,52,52,48,52,52,52,52,52,48,52,52,52,52,52,24,12,28,12,12,12,56,60,60,60,56,60,60,60,56,60,60,60,60,60,56,60,60,60,60,60,56,60,60,60,60,60,24,12,28,12,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,56,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,8,8,8,8,9,9,9,9,10,10,10,10,11,11,11,11,12,12,12,12,13,13,13,13,14,14,14,14,15,15,15,15,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,22,22,22,22,23,23,23,23,24,24,24,24,25,25,25,25,26,26,26,26,27,27,27,27,28,28,28,28,29,29,29,29,30,30,30,30,31,31,31,31,32,32,32,32,33,33,33,33,34,34,34,34,35,35,35,35,36,36,36,36,37,37,37,37,38,38,38,38,39,39,39,39,40,40,40,40,41,41,41,41,42,42,42,42,43,43,43,43,44,44,44,44,45,45,45,45,46,46,46,46,47,47,47,47,48,48,48,48,49,49,49,49,50,50,50,50,51,51,51,51,52,52,52,52,53,53,53,53,54,54,54,54,55,55,55,55,56,56,56,56,57,57,57,57,58,58,58,58,59,59,59,59,60,60,60,60,61,61,61,61,62,62,62,62,63,63,63,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),Xa=new Uint16Array([1024,1536,1280,1536,0,256,768,512]);function Za(e,t){let n=0;t.readMoreInput();let r=Ga(t)+1,i=new Uint8Array(e);if(r<=1)return[r,i];t.readBits(1)&&(n=t.readBits(4)+1);let a=[];for(let e=0;e<X;e++)a[e]=new Y(0,0);ba(r+n,a,0,t);for(let r=0;r<e;){t.readMoreInput();let o=xa(a,0,t);if(o===0)i[r]=0,r++;else if(o<=n){let n=1+(1<<o)+t.readBits(o);for(;--n;){if(r>=e)throw Error(`[DecodeContextMap] i >= context_map_size`);i[r]=0,r++}}else i[r]=o-n,r++}return t.readBits(1)&&$a(i,e),[r,i]}function Qa(e,t){let n=e[t];for(let n=t;n;n--)e[n]=e[n-1];e[0]=n}function $a(e,t){let n=new Uint8Array(256);for(let e=0;e<256;e++)n[e]=e;for(let r=0;r<t;r++){let t=e[r];e[r]=n[t],t&&Qa(n,t)}}function eo(e){this.buffer=e,this.pos=0}eo.prototype.read=function(e,t,n){this.pos+n>this.buffer.length&&(n=this.buffer.length-this.pos);for(let r=0;r<n;r++)e[t+r]=this.buffer[this.pos+r];return this.pos+=n,n};function to(e){this.buffer=e,this.pos=0}to.prototype.write=function(e,t){if(this.pos+t>this.buffer.length)throw Error(`brotli output buffer is not large enough`);return this.buffer.set(e.subarray(0,t),this.pos),this.pos+=t,t};const no=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);function Z(e,t,n){let r=t/8|0;return(e[r]|e[r+1]<<8)>>(t&7)&n}function ro(e,t){let n=t/8|0;return(e[n]|e[n+1]<<8|e[n+2]<<16)>>(t&7)}function io(e){return(e+7)/8|0}function ao(e,t){if(e[t++]!==31||e[t++]!==139||e[t++]!==8)return 0;let n=e[t++];t+=6,n&4&&(t+=(e[t+10]|e[t+11]<<8)+2);for(let r=(n>>3&1)+(n>>4&1);r>0;r-=Number(!e[t++]));return t+(n&2)}function oo(e,t,n=0,r=0){let i=t??new Uint8Array(1024);if(!(e.length-n))return i;let a=ao(e,n);if(a===e.length-8)return i;if(a>e.length-8)throw Error(`unexpected EOF`);let o=a*8,s=0,c=0,l=0,u,d,f=e.length*8;function p(e){if(!t&&e>i.length){let t=i;i=new Uint8Array(Math.max(t.length*2,e)),i.set(t)}}do{if(!u){s=Z(e,o,1);let t=Z(e,o+1,3);if(o+=3,!t){let t=io(o)+4,n=e[t-4]|e[t-3]<<8,a=t+n;if(a>e.length)throw Error(`unexpected EOF`);p(r+n),i.set(e.subarray(t,a),r),r+=n,o=a*8;continue}else if(t===1)u=Ba,d=Va,c=9,l=5;else if(t===2){let t=Z(e,o,31)+257,n=Z(e,o+10,15)+4,r=t+Z(e,o+5,31)+1;o+=14;let i=new Uint8Array(r),a=new Uint8Array(19);for(let t=0;t<n;++t)a[no[t]]=Z(e,o+t*3,7);o+=n*3;let s=Math.max(...a),f=(1<<s)-1,p=La(a,s,1);for(let t=0;t<r;){let n=p[Z(e,o,f)];o+=n&15;let r=n>>4;if(r<16)i[t++]=r;else{let n=0,a=0;for(r===16?(a=3+Z(e,o,3),o+=2,n=i[t-1]):r===17?(a=3+Z(e,o,7),o+=3):r===18&&(a=11+Z(e,o,127),o+=7);a--;)i[t++]=n}}let m=i.subarray(0,t),h=i.subarray(t);c=Math.max(...m),l=Math.max(...h),u=La(m,c,1),d=La(h,l,1)}else throw Error(`invalid block type`);if(o>f)throw Error(`unexpected EOF`)}p(r+131072);let t=(1<<c)-1,n=(1<<l)-1,a=o;for(;;a=o){let s=u[ro(e,o)&t],c=s>>4;if(o+=s&15,o>f)throw Error(`unexpected EOF`);if(!s)throw Error(`invalid length/literal`);if(c<256)i[r++]=c;else if(c===256){a=o,u=void 0;break}else{let t=c-254;if(c>264){let n=c-257,r=Aa[n];t=Z(e,o,(1<<r)-1)+Na[n],o+=r}if(!d)throw Error(`invalid distance map`);let a=d[ro(e,o)&n],s=a>>4;if(!a)throw Error(`invalid distance`);o+=a&15;let l=Fa[s];if(s>3){let t=ja[s];l+=ro(e,o)&(1<<t)-1,o+=t}if(o>f)throw Error(`unexpected EOF`);let u=r+t;if(r<l)throw Error(`unexpected dictionary case`);for(p(u);r<u;r++)i[r]=i[r-l]}}o=a,u&&(s=1)}while(!s);if(r<i.length){let t=Math.ceil(o/8)+8;oo(e,i,t,r)}return t?i:i.subarray(0,r)}let so;function co(){if(!so){so=new Uint8Array(122784);let e=atob(`\n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\nXH/9kw/e+uTa937x6JlPn7j+86ee/PnpG7e/+yefvfzM7ddetBc/+977t3/83mcf/PknV4/fPvfq7e+/\n+cm7P/z0/F/84uwzn7154uc/PvHp69//9I9/+Ml7P7r9/IXbz57/9Pqf3r7y5GdvX/vs+KlPn/7LT0+9\n8en505+dP/PZ+eufPnP99jtvffripU+vnrz9J+duf/+GtefTZ37wyfU37JVPT7/+6bnXfv79lz678vTt\nv3jV/v25Pc73HsfFP3j59ok3rc0BJ2xs7t08Zz7DAKYbJnK5UgK2jQzJmCC4augYsG4CCZp91RPMCbYW\n8rY2w92psSU9JsJr5eZ15HTJPhdaiJXaqRIg7wbBWKEHHX5adwdhvA2PhJOVkIQAXgHUR5kUgqH6MGbJ\nTde53MIZEy6yqT3ANRAzmtC71THhd+I63zxX1ps3X4Z9ESjZchjwqiFzLkBagm7Pm5oZd/Ona2Dpo0SW\nY7IEIhOZVrcgTg4z9eUeatU7/9w2XQdQNR4xq0vb/pGqKBvnbA8aB2VF1VrreWvMzZdXR+KVEBjpfVg7\nksxeQS+zV7Fw2NR4Ckd5E65GGF/Zc94LlRfsBWghULUSXnoJFac+6hn2H7HmV49EANm8/B5nSxkwvsbN\nMkyBIZCVfSDxXmYmA5BcYsTQZk6SrdK/FWjBJmCS0fODJopqn2RJ7A+85DaKjp9kYWwVBb/Kf1/lu5f5\n1gV+7ImoRK4i5Sf+9vSf+1v4/Bv89zVW7L4W11FV8mv88HNxneNshm76GptxJr5+ultDqWKw2ngJcDTp\nwt++epL1y8/wM+f5+2n+/jN+/QKLo1/li6ejSRejbLnu/njc4kJUDb8Sb1lLXuArF3k7Nen5uJeKlL/B\neurHvan45Ud8imd4R/XYxahQ/gILnD8Vdcpf4/9Oq846r6BOuBL1zk/xuz/gTc/FXX4Q5d7Vkxeyeu0a\nuKeiSDwHzvvZOuqElznHWy95b+MBv8NC7M9HJ5yKe/0gCrefZm+kausvRUed5IfVnu/FTc9Hj6nlN2LQ\n7c+no0r9j+Je34su0gVVEv4Dvqjevsi+0nx4IwZaj6O5eiN69Tg74Q027wxbq68/EQ17HK97XXnNZ81V\njc5TbO25KGN/IZ7iRZ8q3s/n/bnw7ln++2I84Ktxr+Ns/7Woaq9G/jj+1IdP8JG1gk7zxTRbTkfzXmOb\n9ftZbzDa/Awf4Uq057WYWm/GTdXUNzm4vJG3+bjrd6DAF8rHkOwS2fXtM/sDx1I8XB4pRVlMABZWZpOa\nxdJWYHOYWGPJNdhAqt2wVMa7UpTEFuZ1ab60azeufFBXDhBQA7WI7upwvLkCa9I2ZLOugfR5BLtTT44q\nrrIfJV1QIbN0vY2aSGgP/TygkFbNI6AvW9mj2fZbP72r+GiZPfnSZvAsOkVKYkfFRH2jFKjEq0yYmTiG\n0Hxxx9f27RwmtnxCITUIOiiSzbbQUf56SQ3i0aANvs0XyUisySDANxBUWBkio6H8LnU05W3XSXl3b+eL\ngbmnzpsbcm4q4Hmro43KIrtmCPoKidta2BpVp6q3DqURfAjFrEtHgG2VjFiPezGW83SMH1yb7cBV7hFL\n4ulr9rMnYRtV4INf+NWUVfxGwoQx/W8u06DbHzgldokRbF4F5Di5pBSF2qI3C9lNu8vezlIW4KRzgc40\nQ3meprenxOwq+wd99+noXsH/HWHQdtLCT4lx1LQYi84ZKRM9kZ0z1lQoZoh1PRvn8Bx1M0tfPcOoIA7g\nCN6+M60ArzCJFE6fA1A31SwLtUC+OmWgOqGy0ikcxWDndzLpFxJaZSZqj7NlZucB2751bNFdzS1zGcHw\n2JhEYnc18u6SswOYhhx5Twh2txL0A0JhUnqNcGLFOMEKjI3JxmQLo9GgJBez0bM7FqnSxRA2USNePRga\nnXjee9hD7NPAoHUoaLnlKjCujwG+wVjcvIjuok+RLRkpFyoxxW696flEmwf7BaQKDiPSPXDiaCKtro63\nNKwDOGxrpHOBI8nS9sOBo8ycD15LIQEkB2iLxC617sCcerWTmEysIseyVinHvtCtYvRX01zbGkMZBVep\netR+EIvYx4PVbAUY2Ao/nhsJ5yRZqWxBchW7G7tj5UFRXKgShx+sSq2T06BB3HaFueAvp31yZuYueqnF\nKOUJ4XHU8v+QjiE/aeSxnBF4u5u+BhmJ4HMspYyAwkqIGT2AAj6siLZSTQYa89BKqrrOCrS/HEkkxRJf\nC1IEqPqdhA7YPhO6KIuFY3TI6WTZYrBOqe0KIf0Efoq4FrSWmMFnSx2Ltn2mSJCPwGMUhSJofLYV192l\nKp3CRRT9ZP+FZkHVf4js+TFoTciYMlEPrIT5MeCDboZ6FHEhzICWPQZ2wOQ8VjQg4xZfZDiE8QxXbYD6\nZb9wWJGjEh/BTATgEYEJsI9Z2LKJKBsUHZB1w+Mx5klA6caXYm7YbuE41dkU1KaqKOYRTjCWj4cOUce1\n07ueZh5OiHTbEkYoduq1dv0eS9ocgkOsjXuBoxo24KNBaWy8SXgJc6ton+IT/YEdinbIjhZd/wOBXSl+\n1STGCTfkVcAxPcb9iE4EoG91kkJzEBFHMgWDZPszqykPsX5lmPgcpzpHb1VBaWozcp33bHZ6IhtjSbn7\nXQlbHIAn23N6vbGyh2tQPGZ4l7OPW/9D2s3sy7vTd7caxKNxchKZxRyK6KJ4IpvZeAGZ5wFrAdgGBhnX\nimsmAY6byDP0JssJRDigWjKUjRF8G7J3601iZlHce61QIYK5UsUj7B73JUvha/3AYSIOqmTjTII+1wo+\n2rv7B5EYJRiApR4eUuFTYu4oC4QsZ6ARioMRhZ+TygP5sILl2FW2p5vA7hGAcyQpVmsf5hfQKbYPKXvv\nQDJdWfq70OP5n1I2PKDLq5CcdHdXQV/YNLG6lxaSXXJHbcbUrsWiLpYCjrtKZJPALwn82ygajPUWake9\nyWggnV6issEBGyHcvNPFf789EzuW889hq4hR/Qg1hCrtBwCx89GWfc0QzzHwkOT9Vdkn63Yu1kIlDAI5\n6Ag4q3CGMBkIJR5KViSgjMK5rpTN4YpabgQ8UtbbY6GMSxYeg11KqUxBDjDXWCOO9hUCDRuVFI485d0o\neovN1VX3bI9QYquhKChLAEMdNuWS0hnffEU7P09sx6+F5UF1I2w0xPygFylCs62dkwgosU+XkwOSMP8N\nw7ZMkkSGp2ruSntYAtM3ylOOWTdG9FH0SeHZBUoxUmo6YYm3MaBAFIybp9g7q6hT2iKZXOubo0OWIpZ3\ngnUrjY9MTkI7F46GsY6+b3zMbDfrnPVQGikRxSk0sZRZQsatI2O4s2PRgRRHS6HRWMmdFAozv/Z2BJu4\nG1FjV+ix+eU7Z2/iEDR4HYMtP3XHaT9IzIr+g9npEnvsjMNUkRCmnUitXyJ7bZLDpNE6csi8beQqV43O\n35dm2BpAF9w7Z1Jy1BEhDPmDD0pQ4u/GLqqTriGqqOcemmBO9N+Y0sY+PhvzZTahghsVgsCukPIwzRI1\naWFC6whCnoTqKcRyy7OhlCOzIHhflZp4+vktcFoRWEbr5oiDzr3+H3Zvyh/jvk5JeQS23pqLDFB8mZYi\ndla7uu3unH8IXFZbARIqqCZDMVhA1nXlhHP9UihPDNaaow64mnfvybq/z6QB7I2jQ2Rz+8XKJIFpmgQL\n3Y19pzssj5a9td6gHO2BmG+NkjbEvST8eQvrb1RJGyfSXcm6XkENMVqqW8lHhC0gkAHtqz4J5a4iCZil\nEyIKgcawyrDDCdQHj7REDqV0XbUe5poTUxqqUdq0J2hYp333oeSL9+qYOQflOUC9Sy+Y2YFdngZTk7CJ\nrN+nIgz3gcWsCAGS8YIKqBAj0+VEyAuiIbxWd19atSnDu3mfwJyD4STBXb+USCuoPux2DjzNiiOovkdZ\nvrDLcTdobKAnCUtcMVcRiJqeKg0dTPa9K/lZx0DazE9dV8foIOFbKE8AAWZPSgvNVAlCS/jQnNdJ40x0\ncMfMFqtVAs0hGw6Z55QPt7kWGnLJsCxaclVZIJg+JEnD4eAdwIVQAEsroE/L13ZgV+RI2ctCSHvgQhKB\noVClVB4HUrUwC57oprJYq45CP18YJ80f9J9QyECzJGTE8j5UpWdptiJNCe0RFIR3TcyKCsc19TpSFGJG\nMX/k6YX+xz3uZsXkolpfT8BvKBsgHWs7yEMpJrM/WUEBIe4spytvX2ghBarEZDNi58NN0z18x44di151\nhb5Bq26L9Qmf3V/BPQKY0iQMclESog89nYStNMsc8TvMqYdSLMjOEy/S+VCKFUhJkDGFiiW8rQVeYoFg\nlaOsk7hRJWBxwrMTjA3Rn127dkEUbVCsg2WVPEjHDMAep9iKz3YBrLqNPcFOABLXBv3D1YR7yGLUXd1z\nbxX2qYgiLAEcZJRCNWHpBw1Xvah5WFpHqgTqKBJmq3B9SlhGUnpE/ERVQeGRMrOKTQLoPoGWQmFn2zb2\nPaIiYV/ZRHX9O6CPaQMhr4MCE5LB644rr3Snks0YVVhk0vIzWwoSTw4TUzkuLy9nrx0KktIc0lmyn7/q\nap1lX4gBkD/uTlbBYRtK+XlpXQbzj5GxSt8YwnNdB56/aRmZ8IVq81uHVKbcqkGgkQYqK4b1u47qK9Hm\nLi23wA77CsDFV5MPAe4O4khmbbpHD2tki1qU8mHp+ZRh/R+pVNiZmjSusdubyFNCqMdzctY+9uQqWkDf\nlGNEK9Lszmpkq2esdcZjUQdzcj9nE51qf+aHFo5y4AzjVoUiDSO6bTZaLtkUsAtMQV++v59grzNel9hG\nFWejIouhDVSUnSJoBvfVlfUFFHtmEvJOgHGiETTMhGJ0UTxXQMhKT8ldXuXEhuvjyrEktgRowQdQ5I7G\nNXfpaQ435f+KSTHegiITELjr9CEUhRisJRQ6dbDlp8wnFNmdQkRw9K1XWFg8sSpZkJS8zKppz99gpM2v\nqogzoJv9QnXBZNDvPOpzUvbAQYL48eRuD9UwRXx27mHdUBRwGHg1FKzXB6qjxf8KWFwZZklTJ9ZnN52r\n4+CNBjbHtg4AEXnAlhEBP1IR/QcRb/Fwqfq2XwAoe/xgtcIWKbuTg4SfOLaYZZRifTSBIyHcUJQOmCw6\nrZKlQLtzBB8RzAbhuOaKUGMS1wLnfoLKYh9x0UnX8Mb4AhvC430hRSHWq4i3M0EjH6zqydKpEgG4AINM\nOxzkHJNYmdnAe80gI3CVw4WKcTVL2kH7RSBx2AcAHUBvkWsVKx5I4VQrT/6M9pzxEP58KIZysnKPdXAj\nIp/BNikSqXouMjXcqcfaDwivI/Yb91DZr8TQbhJIrbhL+y4QxgIV7t61i9Bp3txLmAUmhgrFXjEbG/Kg\n8FsnVgOhN/fA5tpwzDBqFbqSemcZVbdkwkQUp+y5H9Udb3ohOSz6InY2wN21+osEb04c23kkJHaS90Jr\nrlfaoeX4InvsbqLI91RKryhHUofGZUqWryIIC5vwQMUGRHYUPl4oZj8Ei4HAmTyZEjI1eeBHKmHnYGM2\n2G0pB69RRpFNL4VcwKZC1RTMAWhx8soofk60J9AHgy1HQQqJrLXPiVr2BaTGOcNcDAOAybpR4USWsFNc\niqrEE+JjmRiCQYF1wOLjLFMqwhTeXRkGdN3jrHAxyP/gLrrqcTgW7ml0FZ+TUnwV2AyzHdVtoIaPmdaF\ndoAKPWudrwo3u6vYXW3i/4t3ppjMQgpw4CSBs0QH0jMSC0lVAMVmZBeOUqzAds6RbS3D9Y1ko28P3djZ\nNelroqCj15tlhI+2yvaZwryEUtGmFSHxYYRAI90pQapuwBgjMZKFw7wwRvtjb59rCSegYKN1VP6mqTNu\nkgRB4bhV+2U5nWqJn77kQTOUvkMchdC1eZX+6ywsQOncc6QUugPMMdTe7ayFD7ZaOutRCPpuEUDDfso+\nSN8Wyod/85O/+eO/OfM3f/Y3Zz8+QZW3S//nMxBQGsKthL9fqcImdxrCcxp4ao5ooqqZTVeePXx3vFL7\n52R71a6GRiRNiwxq0s5aqfYFXkuoLrA46f5i7jswC/lGVyljdIv3CAhvPWDVFd4tuGb1gHoHastgxcFX\niXZdJfBWwwgkvtAoH48dOuyXVLODalrKGDNrbrYBziMp7+spFQuqUcurZ89jr65ApxCudyn0l+BWqr1h\nbQ48WhM6dKD9OGipceZf9UgZogpV9AvgV9b8m5dQdCGJS6DeizXTbJ1HFIusmXZ32Jhnm1k8JW28a0hX\nSIENHAlprIWsQsUiqXRZqFd0hUpEb0ld6qOT/hp+uwgNpg/f++g5qihd56tPUBMJulNv2c937f3LH96g\nHlPSpaIq0nX+hI7VB9SZejepSV1q9aik5MS7vBPaSR+dTO9CA+sqtZWuUrXpCjWw2FJ87sOXXLvqun3m\nbVdKcoUoaVt99Jy9Az2sR/WUSUfqmitO4Te07zj74D3+K00vaU9dSwpZp5IG1AXvDehlvSfFL3yCLcS3\nvM3WllB5wt0etZ6DwtQH/rxv25Nf4Hevxm+u7yS9LHwPqlTtfdH6G+x1tVmKYlQQ452fYF+8y7/5XXvt\nUbxCJSqNyLvU/pKG1NvpOS77qMVoPUH9q5di3PxzV7MrX4unpuYW34Wal/Sp7H4vU6PquiuOQQvrvQ9/\nlO5xnSN6ydt7A33qilYYj/d99EOV7Kr0xzCW1qcYN/ZB6r8bvO9l6of9iPpZ6JPTcV/omaEtPlLSJPsg\nZo61ECphz9nVNJbPffS4q4edtG+e5DXepsLaBSqLnUrXu/DhX6TeYFv4JDEjLtiTQ9fsGY7RBVzLR/k4\nnzY+p3l2nb+7qpeN+XuatVI3Y79f1W8ffdfnxnucR5c4d6FBxvZRrezZpFqGsX0fT5Pm/Xtst+bu96xN\np+yqF6GidevsrTc/furWqzgpXBVMP6Uhdg2qUFKXku4XVbhO3XqDylpPf/wklLbsc9LDCpWx+O4Ve/VV\n6lWd0Gsfn7x1yb9xzfW4zkG5jApSj/HEOovf7N+T1iqodb1J/TB8421qT0FZi2pW9u47dv+n7TdXCbMr\n23PgKnafd6CqRY0yapndum4tOItv2TfO8DXoWulZoRl2PvXG096+t/xzJ29dtv/aM7Adp5KmGvXP+Pmf\nhR5bPBufxvuN6mJSLXtUuma4EpTU+GzooTf5PD+l5tdbaIv6FIpo9hoUwrwP7HlPUnvrcfvuKbZGCl34\n3GX25CnrobfwROwHqsDZ+3waKYlRse0MtM3SKOBzl6gldgpKZlAdY9/jjk9JzwzqaP453O0N9YSPtLXU\n78bWuLKZ971r0r2exvgVzAyoxoXKmV/lPMeS8+/Wa/68JzWKVFR709p+yp7/9VvvoIcxE601j3Hc3rHX\nNcPU55rJb1Dp7G2Mu/rePvWmK+W9gxnT3Dk5VK5DFWlWpUaYIdzdghbm1+s1f1XnMoFvUeVaWLieO92d\nNguWGGMw/iXyZaab8FO8WNU/Ug8HRKd4jo2wGIRktwDIqogr2uyWzcZiYpWDFuGpxqUFpcHpSSJm5ulu\nT/4Haq0aMcjMyP4Gi2S32eg9Saars7yrBfhUEiGA5+AAHwFxwF316K7EeWqVw3G/e59HNAlrCmgIdYS3\n3IusRl4veXY87M06/GITT8F0SCNMz05ILdMJYUoGZDWa/HbdHW0kq82zN/NfeejL36LG1reSlTSqlLxb\ngph2m+lZXGqzJRtmKVl3we2ambk3aJOqFyOoJMJNe5BUXlwdJCSj6i8Xyrybiwqzfm9HohpsOsIy/1tV\nwipPQiVVd2tjMHKRo1CQQdihN1psxluANirxA1zO5AGyo2jWhy6Tdd9meUz8vb2dxhrxiD5xVzvcSWWq\nB/V+F5UplhaiZNPyaIMRvpV62B1WSe1K+DXOM4xU5Bk9glVXDQAjjWf8Uqy1mdmWPJ0WKdINxhv8W1ci\nQ2jYderq0OkFnKD7v7RTro2BLzLYS1YyCM9RvoR9pjhpeP1ruKLChuZ/71tbZz5ipNCwO3P32+RCZeTB\ncLYxpw4ePFExfXlsK5XKZLkgBgUVShasVu1au/FSCy1iZEWUx5olQxlCq/tH6Ghag3fMr2uKz+6gGU5P\nq3dXhYpkjCt0Wu+wVpCZnXqsjHyrqiv5qwh8aJG1wQWFI+jkRkUQ0ncDltOspFhlgcryvsjuatdQ6FbZ\nyppvAUACmgqhmXCAjacgmfJ2VBg7qj8pFAfqpjhTocJLij0OCA9AyuV+lokokDdaagGu7b5j12GZbFwi\nGDLcQIoQcwOdoy80IiNJClSFM4eKcR5XAxMPSXn50klvsDdhbUGbaP3RZGeb7IP4ug+syrRydqD3bWPp\ngRs7AJygj5lIMGXN2IDQiAQ5fdUmS424hm3bRcI5OSQM01O1JDyBTwiBj3G3EnmTkJRmuLq3s7DUwhs9\nxREiLT5T3VNFZn1pISX4onwi9oeaalTiLZMcSDk4HFSrnjvwfEFVqEg1g4HzOtAeABd4fVir/l21r913\nUgVLwJQZ+yb7UVE9BtoSb7aYbSHY6F9PurvIzu5du34bMRTXvFhqIQ+keWKU93Z2zCchobTmB/0H+5Gh\nKqJgH3ITrkqEAPRQ+B3RDbPEgiJn1HrqlTEWAaZoDrTHeMDSOX/lsbMsZ8GdnSiflPFuN67dbfS/UKkc\nXmHHoi1STfYkCIIah1B+Q2n3vgNIETEC0rmv7TOhwjvLLU6fwVcv34QvOL7ht1K8ZXHr2GLhZ2eUwUOk\n0XMpjOduuj5Et80LFA6gUza/GXjIemnjf45h6VKuYlV95jICK5OWfdDyQbEFFZH8PyqBQcXjtgBJQ4St\nXP1v49oPVsXDGNxlxaKxUIvCn9iv32RpDWDJ9sQBUACNhEg0EDFVy9XoclMAogeoli62NereJCB+cM44\ngRJyfT5p4vUmB7LNfFSE5qMT5yaMnZKRD6ihlyXj0wPrWBKErmJ2juhWKIbQ0WHkzrDe7C+cIBgsT+5y\n21SsEaFxV7QpKblD2yeKeSAWmlCRBQq9KDjdRLVQKWR4l6gmHKT5qMaRsmeVAM/U6yxT3DMS9GYQ2ZSG\not8A1aFUbVQAoTWvLcQotoabPFyhK7T5s2qFNTXwOs2AN2XTlTIA5TiqdEIxh6hcUuij5g8hOyyWzn6Q\nAim6+sDBB6NOEsVvBkOA5Np0ViF1EaqJeMEuipTaR0NAjYxlTss9SepwFhOOXWK2sqPGYyeQhNDCw00U\n2rCLBSEakXtgvXDnNi4MaUc3RtqjbsZj05hc22eiCM2Sw4IP6dzcqrXvALblibkomwn5mEAosFicK3jQ\nIOoLfiixQuVAieYS6GpQNOWEg3B3a5SVRQIihUYqjroED21ci4O6PslkbaJqnF3hXhX6wmqKbDxTY5IE\nrXsTKaII7hpyO71J1AVDmhT+QElc5Zrv75i/Dt+zr22I6iCwWUDCmqjcaustivfYwHL5yyhrNrB0RHEv\nJVUKESAmyfhy1BTDkiZIkVmpTgszJqYAG2izhxJ6+prNdUn/bVQtertweVzkHwY88ZnvpcZBNJ0VX6WG\nK9AqsrsuqWbN25A1CY0NO8oPeEG6Tth31qp+yvG2YElOGCdbzMxk9mSSTG3PniVxF+4+QsiaSnXZXTsF\nEuiVHV/fQJnHWk/BsmwO51PRJywaZl5rvrO/PZ2CG2NPoUQVp+f942RE4pBCqsL+bA/LL2FH9w+49Yq/\nNutjIeSxUo2OVhLPiEJvmBpJaLqXXNojMGICBBoJAqJt/cw6Ui3cdeiu4r9AFcDFWgnp4bLpr06EuqNW\noH3NIWJYv93WXm8T+kU4QdbQ+aQ2UFB4QqbEvtZ4wh7l9X8CYsVThKrUwJJx35Q+xVzr+gTVxdr50FRE\nwMl5TaiB1i6WoRuXKys4G5SWXo+IQJNyREXrjRdRDTXsVOEzmZ+XuRhgbx5fcQbvjiLe9rV7200X2Sov\nu6qNnhMFZYKpWzR0S4GbGAdAULUWY54BnRstSOpywEwi1G2lavl5dtcv339INeD2tdY2DGi3Vu5OIYM5\neoA0KFPdX9wL03CFGWHNEhDHNijWskFbLNhY7rxWQi3eT/NWgEjATryjEmqmL2E/msMtspJwQ8/Q22ok\n1sKOoAOtPRloQsrwoD5iF7sctjBP+CW/+0jG5WuKllfKvU+nq2YUc6qjkLyhfU+hiyrnH1FRppCPxgdy\nCNGGsuAUdENqt2ZZrY2EpliZpDEOwhlWuDn2o50QQk0l5My4cEsXi0Dp6xqcwEFrxeOcA0ig7CocYreU\nGjHFA8A5EboAU641OOeWFtLJWsk/p1uddpjfPdD6Fy1DtKEPsJN5uvkiRUaiRNdog9qObrWJysTjK2pq\nQ0EKgGQZcBnT0faf4OHwFlp6XgoT452E0UEldpE9a4Tz4ezSVLgTlj5EnmVM2+olDoBF24I6CcMmUE+K\ncBQlMYb2v62tOinz91BTNSo4r5DzypZRUIgz46j4BOyAzcrMT1UtPhScEHMIEnS+OdS6RgGio0KPM1KR\nEk6zpOV3NkE+Qs67TN6inYiYWBTyUQ1llExtIaG/n7BxdT/p7lddx0HCUdFPzp3E+iOMjdoWdt37mUOm\njRJywhkWDEZ64xqMNmlbOmOoDpIOl0inQa97BDaXamdjX3ddTOIZu4UjjQha0zqBzF0jaIicE47bQ1So\nYN1takc5L3OU7D4uaSwDILILmmjQHSRJj62jCqSEN0Mo1WyuA4kRNNdCEJsR5YzouNlMDSMkxeXKXgpq\nlr2UIzY3itpJNp05jUBFP6w5SYfNRjJVmyjK4thmr9/sGazvNbsl0dwTF/7YaH/iGrqIOLsNKEXINALw\nSToVQcktinsminBgT7XmuI/C7qQEbRmoDurfbla+DSqqxhOnJelBmAsWDHZ6xvDUvzSbGx5cOHAchtSG\nKhZbKv+cHHVieKwNh6tqS2McTOcGG2DBGuiNZjJqgnT2uxNv4xV1Mm00GXAlCHPRMbhYUkKeMSrm4TSU\ny7QGQTwQUyMqytKU4EQkx9r7ARBlwkeocRtVyP9bh3UORLIblIXQGgQaSZ2rWAB6S5CH3uTuNiexvaW/\n+BDadJhbbg3OXS2nArd1GUSH7mOMgsngjq7L50T98SmgIxC0UJJ3AKFTOZo9fTsxFikRuEQHtICMOWVd\nBRKV3Ye1NYAngJllHppgXDQoeLgLNuaUcUyYKJqALiFUc8CK84mXVhyI+P6IHFMnqCbtWrAMtFXYzq1n\nYyy9XtPZimC7bQprYhSVNvFHClhtn9kmt3v7DPrXT7I1gerzarnYXrkuaPA5R4drflAk21uhCPbZUXm/\nOCSGCQhJn0aJiSFr43puRohw+N3ALzXyg6hiSJXAlpFRrLZnVsjmYaGE+7wji9MUFGgc9B2F5d7vEmsr\niMHRKmjsCWgodAhC+c3OYFQ6rFeG9XiTDHkddbUrpNqShqqo76ktAZbxB+DmUJ97WAX6lAaknjVKYmMT\ngxCgb69w4hVxCcWMutU9RQC+u578IXOWWVUZk1YxLLu2j/rObjlJqv4gTuqABPpurDrw0PJoU2byybSO\nG28MEOHAkAuunbTxvVYE1d25Ban6h7wAjB+Bt461H/Tvxwp4ECcRYGRiYEZdV+s+6EQhb2J+gSYtKxyH\nZ6kTMk4ynbyMD5RF0s1G/3obks5oPXJyAfXPqZtHUwhT3adBoB8ZxqL0Rrt42bJUcUeHj6MWA9Btn32o\n9ZpVs8NXS8K6H4Va6DrZ8SsTdY3D9h1+6spcjiLeAhHJHj74/l69YyTyDW9FMfBeG1Wb59ITcdAlp2GM\nhC9WiKwC35QwP66fr80fDI2EKTQmxIF7kWlbawUB8B0/x1MZDsDtiw0ImBJRyqrtXWpvelSGmUYdgoM1\nYVrd0PLYymiw27rgbttUgdaUiwrjNKmfIavsHNBCO5jmHdVTld7xy8PniwrCFImtQvTdjULuRt3uPVIZ\nq2K336i3uC49lukBQWVSw+4V7pgShkp92292QrJ+NmcJu5RbVJEwuxvaaUU+jI0Jo9mLCFDSosGkdTfB\nzi50KvxXFLNIxLjSoz8cIYeDKvaqCHLdD63qUXe575ZTLelpihdDRjGp+NADZPYlZZpWRn0UJfeOCgQ1\nNokNGVRMgyk9zIi3rDds0JDlbWeJh8jus13QX000ShzCDZYlRGnvbkMnUYkci6EN9bQKM3Ne+2DoC8ct\nLApoKlWUYvHKZ/HIqfvAYR7WlgULzwsXj6LMzh2ob1ogeEz2whrOYJA2vPA1xqJ18KD90/d+kK0iF63F\nx7eaQVQPdQoHooY+uZbjhN22zXlX7DNPgpjR7IEwirmatyM9Prvbw7EbJbXM/qTVcpiLQixj1J3ZiogA\nyE1eMwQKsz4EbtaFartYEBC2OewhRfD1EYLv1ctaVAVqjdMYYf21rsrjfh0GliOycbf72ohACuPixJGc\nKpWDm9jBsSZ83GCHx5TTUcuRl63DuevxKkxWhU1IHFESgpOLs5CGFf8RI225dZNo/evXUVKsmovKNgUm\nbRmlj0atk8kERyKbhn1Kjku1H9t/CtnasFTJhzzYWvytvtOcszSEiw6tp8ZF2OnlU4Cf+5kI+HyHpruT\nV0Q+wwQN1gf6zItAmXmQYCI4/b02BhQcML+5YrnIjjG+lR6+ppHjdgmWk1srkqfhesMguEyBG/kQrW77\ndAEfkEzkxD1UnGvSzmXWSziIJHnraXX44f7ELnQPi1g6E25ahpjZPFcsFRBkG03C/IpcBA0SGadaklAF\nhqPb9+7jBwhN7iXpWTC5FD+zWQ7D2EfInwKmz+bnU8lpl/u6mnOojWipOgONp4Ot7x8aN18qvsV4VMEA\nTJhATIZsRYBCMjPcBoMXQtcoES6iKpDsM5Qc6SlWDPeFIhRi//Qpgc8FYwYkNdn9SfqDIhJzrsjSKMGh\nIKqdItwtUdm+Iu1hE9z9BTfr4LS7wwQHVuEQ9larfjZHQ1YuDT+rIAWnUV/V36K9qD6SdntxpzjtAYyK\npVck/e7NNoTvOzh8/1Zmbo7y9MizmbmVtu1514Fo8ohL3d+WQYRGLWvHxbqxGJrkMKWEF2I3KXXolfjY\ndNvUPWfpq5BdonMFv27LhMJQVoEk3a7bGioWROuC9S24TyIm22C1eHQaT+w7EmzEgXYOj1iC1tgelvP7\nnaFh7pHfQlVxyp7LgzB8o4gL7mZbNQI+ZVteS6F5VYorx326BNxWjvi+48AarMnETJJn6TZXypYcHbji\nBhMn8lZh4bWre4496jIafRp7Xp7B9+p5J/JiTiSY4+okXEVkPQcF5HqUBmO6V/mhFDTjuuj5cko6JMqj\nI84ygDz5AYnTRE5tA5q0RezyjC9X0LRrtO8wWeyyg9zX19O5eahNnrORipM6KZflSZPpPufm+NdVCGni\ndOimZ1O1/1fPQog+sWKaEIrrluo+UTxa0d5WJxIpl1UGiG6eKzV/nSbTDzZLSdiFCqarH1A7vOWfNEG4\nAY+QRRR4LAIMUm7WFCSr7OpCh0QFKd7NTfcQZeQtWgZOIuNYI+GxIp7dLbtuWuITq1DO1S2ScK/tNmMv\nL9/AHYVOL+V7EzemkdzPqnNOxt26FJGHcAG4htJ+5AdslXfNFnq4hPZ68IqagedK2b+eTIVMClPNa/Zs\nYLkN1RxEjs0awhOHfiR7En4WB4DerUZIgFto8pCK5JgbRbb4a9+2gPU0FhS1sZtAXCzkvxnNkOzDnk6x\nJymEZQjfBuHiqI8VpRawoywsJKGmmQdVE1ZYosA72u/QrfNUxZ5UuNNco24FdfWdDKdxxwwtswxgGj1I\nPGCbBZlZyMKNLpwJAuJskeGDsvYvtACs1Wph4ejRo/Prg8F6zyvsqM0YgbCWsyy2Ys9D50XS4VOUUZnN\nSl0tHBLAtnt2/57ZlyquOIFwXjQoA/q12UviHNtsnlf8ERYV4hTett3/Obtm1CixEzHLf3e/tKv9zM4M\nU8XjGVmvFRuv5RYEg1I7a95BdyT5jjt23DNmMg2ewhxxEUc8JJXyv3sRRRkM/QTqQujbfTChK2qvlyre\nMIfbDixn1zcsa1Wg6Am4923A+qGq328mvSPWAeW+1iyeW8IouyYfkMMLDh2GSkrI/AMtYkunZz/LFiDT\nm2SItBmHHwlondCeZc/ciH0h9pXhmJoUCK+liRVJvL1ZJNBLWqtO8Xx31EUlHWtwqyBZ9vYP2oG/Yy6D\n4UQ1UqDWUhodZl3biAwU2WRRx91l0arKLLWU1c7ddnitstx1XQrdIaBlhrbryt8SSD/pg9oz3mWf8UY3\nWb8tpWJqNqapzDcOHRiia4q2tJphiKq0RkucyrNfO7gDfnS/S/9m1sFGyifOF5mDEWiB1aqToYyEZWea\nYHE/Y4dH6WkAJBvRvWSd06Vx3wTF1jJvqcr6ZzFL9T88NjM4JBFHbojZ/MjTOwegGyDDYi5D5/+O60o6\nfpw66gryNEUqpT3stNq8CYTuSHhQATCf/VWx5ROP1/oT+4MnHVr1YmAlN1EPW/fdKDe3fF8laWJvx75q\nxmewbGn3O9qJEQkVPBqOq8WDZGsvLNz9gPU4xsWLrUhHSkk1hIljr8jQo0VSebP5sz9rQ9Iugbbdb/0R\nSsut/dedO5e/3cb/Z5LrwUruCTQ45yWl5Ck7l1xpZ6ZmOTiyLRUVnA35BBqK9KEJpB33W2VQrNtU1CQ0\nF61PsnOkSKXMC2Zn+zHumZO/EFgJNEg6R64nJnkqto3nhVfbWcqyzF8e08KVW3qEgNEeQrsewI3Ug1xJ\nW25zM/N95EPpm7SAfWoFOrp0Jsd2KrRkm8PWsSJLUexO1cnteTO+y+5NAODSmLbnI2Ez7ouvMxyouLN5\nATgLVFo3eD7W/q8kJe9O0ccypoPSNC3McLW6M6qo2+eXs2hidkzNZMNYJBWwIkq0aHfBZhbo/mwtmKPT\nW4v9OTOGi7gVobihF5flPiZK7ARpwXzLEVygHmGvcNSl0mt70bHN3h6dQa2qBlRtkb5UyZYknkpHqkoD\nloNnU9Fte8Kv2PHWuAP+ULbPg/8R4haIYe3kTfYMs6Njh7tCXF9waW27xRxGVjNJtKDcH4qSEybQFEkD\nR/o89L4XsshDwSrKG3XXJsGiDaldf4U4XO11UsJK9bsxLgjgu0OK70dl320ZO8qr2fLBAojESp0ANyhK\n3LCQfZ2qjqqaj62TBwaoDs6pNJcxvZqZba3Pa3t5CvVULXSOUowh8jtrLm/BGoY75jtFq1eyle0z+Hw8\nMsfd8+Lb2nTOzEzm2COQ1gsNuRYoWdzrWY174PW2Z0STwey1r6atGINxB4Z5QXDOUJwtUiiZ09RDHd9s\nYVB7soBikYW2Q8aE5zW5GE4OifrIVR6ftdf3FS24NYMGFxlaoSvUltq/nFNalKljfHWlzckTWS58TxXj\nzvxqBJkZsul2qzaK0TLUWlpP2TuIEjOj4msolmJPHtZH18PSvHufZVuVC6GGTyS527BmkdEDmwN91sqc\nY862vW1Zb7b+DiRFOP0Jn0nBIchKD8Jf2MpyUdzkeneOV/Cd7IDMgnyFPH4upe6wjepKusaa36NASpFk\n3Q5kthCNON/3MneqnbQFCvmm8RpujO0vlT6m7xbnl3+eOC8Ge4aaQFnctwhFMyom8TqEqTTsZ29zOaxS\nAhC/B+C82WS5TZ0XhehKgMCzkKUjX4G+C5iyDWjClzv8gDAIrhFnfxL4X0n94yClKrHzl/3Wk9k+E9A8\nh7Wk6tW44AOeCUqLdwvbK1wL7cOtYh2KGJYQ/B83nuYLvBQ0F+PMZa7WnzcyRggV6azRv23cr1NIF2mL\n66g/KFLebVgFRbQ3iX0Pc3U5Q8wzmeY5OX4x6jBmNljkMJRFS0BAduYBbJu1AMSsy6AQHd5ibUhPW/GF\n/ZnfkSUVnGuo1YzbcE+nHrMbhwx/CmBk+++x4KjiubLtqsjOMuXpXH0WdkbhuSOBeRQCpgab01VS3l1n\nDWOnKizo+SumLomraZCQdb4Pt4lUq3TkYCFPOcxmftyBUSsWiIxonL/WLC5x2OHKPQlhvC/zwR1pyGmc\n0faazIbpS1tM7UylhKEcRV/YU5klGVU8TMzaSBpBR7XWVwa97mLSlmNomMXoCRdKRCXsaS29rlatCUU8\nWFq2+Ho5LA4cGHGFUFy1iXUs+1nznblKV9ljDr9FqHM+R+iS665h5LeINYi+bm3pFQZTI/q9P8VSVJgV\n1kQ3fBM/C7L8ewGF6MIdmofagHO27w36niknQCaDb5IzE3uLvGXhXgKY6Kg6ojYTNHw48vPLq8wr7LsV\nXAo/W9k3bm8TrZVx2YOLyk2TmSnfITLwg6tUixGWimNiHdnsi71xOTucEuPJ+ZVOkW0yOn3TyWI7Oh+J\nF7B9tfVZog4EYw7MoRWcsANs8m5EuxpcZzTY6iRVcCJf2TXUkc1icdtDxxXJBrdbCFdQ9pp5g8YriIxU\nhDoxexrVNIx+9sIjyAeoP50c1XL6uB86FZA+msc9RBWWn4UGBJAy8YXsatortF/xrK9CB0+1dsOOJYK4\nHLKYZuwdPEN9EaSyv8wIJrJmwxyyr03zpyBi9uBq1fqRyAOE/hrmUvgxWJsCsmvmMKFwNPzZ4Pk6xtiv\nn9G9fJ9UqQweOgm+1QatMrd7Bp+nBKm0ZlmlPUu8cEtqUCsOzs6uznKrOS8lOdWbJwFAFWnp/9oDuMyB\nA7Mi+dQEAj+0svvY1UNVHRnCVVkbWFQpe4xzfFilJCzWW+Tt60wFPzBy/ryjWDuwV5EEgr+QAfRndHXF\nEAZRLNl2ISAsPT64l55RQhN5lVL2VTpz50LRj+uoAX5OZSmaLM4T9P8Jc6N22HqaOcrTwhzpJAuG9Uko\nKqa90ZU0PWOWUDfZOZVUH7B1+JpFABqfl9+OYjq9NOdtfyO5GTHG1kogLHxTBznLpidEzlHWdNfaCIwG\n0EWOtyURvd2HocY6TrlV71su/lTI2967l/bkV2mXBuNRMIgEQGyCeY35wOhwJepkyuKOHP7kTB8vTEub\nAP1WMs/vdHC/vtYXynGs+xpXWzNXtRHaQzuYMo867LJteI3P48aH9ljt7SG/jSPPmRIeQWljkpmdOWR4\nxg/2QKajPW21gc7yV2HRF3dvAtod+XjtLUVkF+eSXcRsfJEkktE/3EbqtWo2ozkvZw+cwQ+LKkH8zSYx\n0yf288S80t7o5O3+gHsOFo1so9hxquTg2HgdaEFucytZ/Ed16rWeU11pWJUCNXE/2WTFCM+1al8S83A1\nPJPeBMIqJPQhhoZRcTj3kXpVvWkdM5sFslv1ZuQp3M7Bhhtxm5L5mtQtXLP+ZMFBI27XOSqc50PN8aNg\nfgw2E0sExIbwf53F5GdZ2kPmWe9sNArNb9jhjdAKyVedC7oPxmUkyDX50GE7Mc4TFcbF0S2oksB9QzMC\na0D7pHpSh/io53GAUeAswq6XtEbrI7RqFzXLSbe2XwL3qsy924ot36mp6BdECfK0lut+kotQ3D7BukTA\nGvl6dxCUdZk9nTiwjiVykMskzmpVXhB7+5AtIu1dOvuDber7zDjitCUBXW57ExVcEzydDoW2H8zOaqoE\nb4MUNuLSA6/dHLkGO91lG0NzAf3T+k0HPYlNiDvxhLI/M+2f3Qv/x//e/M637P//YWG92vFNeAJHi+rb\ni26T8CwHISvpZAeiBIW/NwaJTJPoLfCDbMfcSGeZbSGiEDbbMgJQYqcn+0d7UaajBJVoz+P8wY4qy+l8\n+CL19S5Rae/lj45/+AHVCa9Soe5//P1G6ItBkev2uVd+8bPvf3L13O0XnlBVaP/92on0++0Xn/rFn30P\nxZefu/rJ9eu3L/zx7e9/8On1F3/xww9+8cQzn77ztv3v56dvfPLejz65+u4n1566/afPfvL+iz+/9O7P\n333JPvnzcy/cvvT8Z68/5uuOaXDriaFgBlFbBSCC1YHH65Qqty2ScbAua+MOAjTg+Th+JpQwyy44lLj+\nzZdVlDleHzSqTMfoMioPrZQPlyyyLBR4qWT9BDWYdX0gA+wT99UrQ9rDrDpspraUGFx3cwzjNXASQRR3\nLc+mjlR/Qx1MKGy2z1gGMgPXUcEgNKM7UJw2ngt6K/rd9sX0Oy4WubMK5e42K4crRLxukKNEovSzwCEp\ngg+0xUqUHy2p3AfNQCj0/ZjKhieg/NfqQobu5kfPSE0S6n+uxdjqdkJd8jhVH6nKKPVJu8Jl6m+GWmGo\ncUKRMd3ro+cwhzk7L+bXcd1Oag1KjTLuzb/f//B9alW+zZl/BX8l5UKoFaZr2qdwxbeoU3ktu1emjUh9\nxavUFNU9QxPzcrr+ZaojhrblVb5HZU3ru7+k6qZUDpNOpn267cNHoXNJzch37XnxLFA0fQqqoa7YeSnT\nCr3kPXwBCp1QF/U+gQZlq2552Z6e/WPjEn0D9caL6Fd7onddefECVUy/Y89+0V5zBdAPL/EqH9j3vpNp\nSF7Onv0C+0nKne+6iii1J6li+q637m3psHLE9JmrfKa3XEcVMwBPRh1P6kFKLfN9u8N1tuCqX8fHEcqV\nVJa0e9sT4u8n2ALMz9S2D3/SzlvpYHJuvWc/T/qsuZZ9F8/yAfU3b0D5kqN4BZqynIF8cvvuB9Q0vcD+\nUXulzfqB5rqN19WkFIt3P3Ad2vf4HP6ZqWe5kY3FVd2Pc+5GO4d5Z82Aq7G+qM958sOXs7XznjRioSWa\nVFQvcR69j+fj07br5TL62kaY6yvTAL3caoRaWx7lpy9aK56TjqqvKSncanzf5xrAvP2uzdz3uW6O22/v\nuf7uk3n7uR4v+Aq8xvG/QJXYk7wO7vuO3audwxjHdh0lPVTNOvY39p8/dy1b65+sNvdJVmG+ELWkT3n9\ncdVAR8npKC3tJaRVI9s+8Czfej5+uRHVse0zL7clyNvrqJD0a9k1z0b5cpaZxusn+cq5qKZ9OmvPcZZo\nv9F+Hv9ebtuGot6pWrfue43Vvc/E9Z+Pz7wR9dBTiWoWEPfP6yle9ArmuqaXbn+pvVd7X5Xwfoq/PM/P\nv5kVxb7K26m1eq53+O/jfK7noyr3B1Ga/AobpkLw0Wy8/kN2zkvTz3i8fS7Vzvaa46mXno8C6K9HqfdT\nWX151Z3Xw57nff8ivqX+fyX6JD2vjex7vG96xpPxmZf4IFdYNf7ZKNKdxvrFGMEz0bdxzVefzAqan427\np7E+HgXBz0SN8pPx7GdjjI57jXjvqxhHvP4Gr/9jXjb1uVpyge18J0b8JF9Mn/lOlG6/ODUfvN+usetO\n+y++LtIcOB5PrcLur8W9XuSTnkS9eG//1agFf7V95DRv/Qrsf3z+xayvLscKusrLnon+POMF7ts2q69+\nGCXUL7bP5b16nO15Ij7P5uHKp9nmC+zJk+yli+3Y+Tq6EaXkH8/2jcvx+pl2DqvfMMfeiK9ci8/rM1dj\nnV5j807zk5pvmv8vRZ+cjkG5EnNAbb7iDda4t3M19eETsd6f5NWuRJ+8lu0Px7NnzPYcf6LoUtw3tecC\nq9WnfYb3xdXOZ/Mnzc/jMUsv8y0WsvfxeiGbY6dizrzKm6a1prXwwvT+eZzf0lo7z2f/IK6j+a9N/vnp\nPf9afOa1bM5oYl/M9oGfRZ+8ETv5ad+j8JXz0bAf8InS9S/ECnqv7Qe89Xi8dTZG/EyMAluibmnX+wtT\ne0U7uLHWfJ5f9odN+4P/qbHQ3HuG1+e08V36QnvG+fOmfj7FP6/yM29EI5/zZ/TPXI0Bupg94xPx7wu8\nwmW+/k52Vl7w72Lf0Hn3ahp3qkVDF/tpKiS/TT3pR5Pq86Vb74Ri88cnoC798Sm+foWKyK1Ws5SUT926\nSDXvpAOeFJZfzzSW37QrvAldcOhphzI4Xp3SEH9Myti438cn/V7hAVNVmrrXev0NtMnVpi+46jh+P4fP\n+jXPfXySV1J73qLudVzzdXvvFBSp7TpX/fNQ6H6cn4K+9ROhUU4V6VeSNvlbt37Cp4DW+Jnsvk9Sn5tt\nc4VzKVJfomq3FL+hzX0Kz88+DWXst6hv/rj0xqVdTR3xS9Sf1uuPUsX8rPfb43zKM1KsvnUWz4/r8NUr\n1Et/mq9Dxfws+iB9lxrdrtd9ht94068v3XK1B9d+x5/xvM2Dp29d4hXfSnrdP8v+vUwFbe/zVuvcZkbb\nJ+ehh+7j/oara7fa8U/E62lMoe99DXMvxiKe8dZraI36wa7qiuPWX49TuTzUvWNcMPPe8vnzpv32JK+M\n+X/d/oJO+mW2IObGGSq+n/W2XcXrjCsi8ge3vS0nisj/3gxmJm1wx55SUmN9PPToZb99h3LTEVam+DDY\neIPN2R1MhkivZQIUDyJ7KqK1Wg9Xx5secZzPscE5Jr9Z+hwSs81tZ2JWwHlAB8Fztq2eUu1y1p1U5D20\nNMlAP4KSuvP2TyeERIdKtYd8IsJh9yO/s7oxhuyJyBae+d3L5F9kZhhkjzDs1hBlrT2hkWEgvrgWIHQy\n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`),t=new Uint8Array(e.length);for(let n=0;n<e.length;n++)t[n]=e.charCodeAt(n);oo(t,so)}return so}function Q(e,t,n){this.prefix=new Uint8Array(e.length),this.transform=t,this.suffix=new Uint8Array(n.length);for(let t=0;t<e.length;t++)this.prefix[t]=e.charCodeAt(t);for(let e=0;e<n.length;e++)this.suffix[e]=n.charCodeAt(e)}const lo=[new Q(``,0,``),new Q(``,0,` `),new Q(` `,0,` `),new Q(``,12,``),new Q(``,10,` `),new Q(``,0,` the `),new Q(` `,0,``),new Q(`s `,0,` `),new Q(``,0,` of `),new Q(``,10,``),new Q(``,0,` and `),new Q(``,13,``),new Q(``,1,``),new Q(`, `,0,` `),new Q(``,0,`, `),new Q(` `,10,` `),new Q(``,0,` in `),new Q(``,0,` to `),new Q(`e `,0,` `),new Q(``,0,`\"`),new Q(``,0,`.`),new Q(``,0,`\">`),new Q(``,0,`\n`),new Q(``,3,``),new Q(``,0,`]`),new Q(``,0,` for `),new Q(``,14,``),new Q(``,2,``),new Q(``,0,` a `),new Q(``,0,` that `),new Q(` `,10,``),new Q(``,0,`. `),new Q(`.`,0,``),new Q(` `,0,`, `),new Q(``,15,``),new Q(``,0,` with `),new Q(``,0,`'`),new Q(``,0,` from `),new Q(``,0,` by `),new Q(``,16,``),new Q(``,17,``),new Q(` the `,0,``),new Q(``,4,``),new Q(``,0,`. The `),new Q(``,11,``),new Q(``,0,` on `),new Q(``,0,` as `),new Q(``,0,` is `),new Q(``,7,``),new Q(``,1,`ing `),new Q(``,0,`\n `),new Q(``,0,`:`),new Q(` `,0,`. `),new Q(``,0,`ed `),new Q(``,20,``),new Q(``,18,``),new Q(``,6,``),new Q(``,0,`(`),new Q(``,10,`, `),new Q(``,8,``),new Q(``,0,` at `),new Q(``,0,`ly `),new Q(` the `,0,` of `),new Q(``,5,``),new Q(``,9,``),new Q(` `,10,`, `),new Q(``,10,`\"`),new Q(`.`,0,`(`),new Q(``,11,` `),new Q(``,10,`\">`),new Q(``,0,`=\"`),new Q(` `,0,`.`),new Q(`.com/`,0,``),new Q(` the `,0,` of the `),new Q(``,10,`'`),new Q(``,0,`. This `),new Q(``,0,`,`),new Q(`.`,0,` `),new Q(``,10,`(`),new Q(``,10,`.`),new Q(``,0,` not `),new Q(` `,0,`=\"`),new Q(``,0,`er `),new Q(` `,11,` `),new Q(``,0,`al `),new Q(` `,11,``),new Q(``,0,`='`),new Q(``,11,`\"`),new Q(``,10,`. `),new Q(` `,0,`(`),new Q(``,0,`ful `),new Q(` `,10,`. `),new Q(``,0,`ive `),new Q(``,0,`less `),new Q(``,11,`'`),new Q(``,0,`est `),new Q(` `,10,`.`),new Q(``,11,`\">`),new Q(` `,0,`='`),new Q(``,10,`,`),new Q(``,0,`ize `),new Q(``,11,`.`),new Q(`Â\\xA0`,0,``),new Q(` `,0,`,`),new Q(``,10,`=\"`),new Q(``,11,`=\"`),new Q(``,0,`ous `),new Q(``,11,`, `),new Q(``,10,`='`),new Q(` `,10,`,`),new Q(` `,11,`=\"`),new Q(` `,11,`, `),new Q(``,11,`,`),new Q(``,11,`(`),new Q(``,11,`. `),new Q(` `,11,`.`),new Q(``,11,`='`),new Q(` `,11,`. `),new Q(` `,10,`=\"`),new Q(` `,11,`='`),new Q(` `,10,`='`)],uo=lo.length;function fo(e,t){return e[t]<192?(e[t]>=97&&e[t]<=122&&(e[t]^=32),1):e[t]<224?(e[t+1]^=32,2):(e[t+2]^=5,3)}function po(e,t,n,r,i){let a=co(),{prefix:o}=lo[i],{suffix:s}=lo[i],c=lo[i].transform,l=c<12?0:c-11,u=t;l>r&&(l=r);let d=0;for(;d<o.length;)e[t++]=o[d++];n+=l,r-=l,c<=9&&(r-=c);for(let i=0;i<r;i++)e[t++]=a[n+i];let f=t-r;if(c===10)fo(e,f);else if(c===11)for(;r>0;){let t=fo(e,f);f+=t,r-=t}let p=0;for(;p<s.length;)e[t++]=s[p++];return t-u}const mo=new Uint8Array([3,2,1,0,3,3,3,3,3,3,2,2,2,2,2,2]),ho=new Int8Array([0,0,0,0,-1,1,-2,2,-3,3,-1,1,-2,2,-3,3]),go=new Uint32Array([0,0,0,0,0,4096,9216,21504,35840,44032,53248,63488,74752,87040,93696,100864,104704,106752,108928,113536,115968,118528,119872,121280,122016]),_o=new Uint8Array([0,0,0,0,10,10,11,11,10,10,10,10,10,9,9,8,7,7,8,7,7,6,6,5,5]);function vo(e,t){let n=new Uint8Array(t);return yo(new eo(e),new to(n)),n}function yo(e,t){let n=0,r=0,i=0,a=0,o=[16,15,11,4],s=0,c=0,l=0,u=[new Ca(0,0),new Ca(0,0),new Ca(0,0)],d=128+J.READ_SIZE,f=new J(e);i=Ka(f);let p=(1<<i)-16,m=1<<i,h=m-1,g=new Uint8Array(m+d+24),_=m,v=[],y=[];for(let e=0;e<3*X;e++)v[e]=new Y(0,0),y[e]=new Y(0,0);for(;!r;){let e=0,i=[1<<28,1<<28,1<<28],d=[0],b=[1,1,1],x=[0,1,0,1,0,1],S=[0],C=0;for(let e=0;e<3;e++)u[e].codes=[],u[e].htrees=new Uint32Array;f.readMoreInput();let w=Ua(f);if(e=w.meta_block_length,n+e>t.buffer.length){let r=new Uint8Array(n+e);r.set(t.buffer),t.buffer=r}if(r=w.input_end,w.is_metadata){for(qa(f);e>0;--e)f.readMoreInput(),f.readBits(8);continue}if(e===0)continue;if(w.is_uncompressed){f.bit_pos_=f.bit_pos_+7&-8,Wa(t,e,n,g,h,f),n+=e;continue}for(let e=0;e<3;e++)b[e]=Ga(f)+1,b[e]>=2&&(ba(b[e]+2,v,e*X,f),ba(26,y,e*X,f),i[e]=Ja(y,e*X,f),S[e]=1);f.readMoreInput();let T=f.readBits(2),E=16+(f.readBits(4)<<T),D=(1<<T)-1,O=E+(48<<T),k=new Uint8Array(b[0]);for(let e=0;e<b[0];e++)f.readMoreInput(),k[e]=f.readBits(2)<<1;let[A,j]=Za(b[0]<<6,f),[M,ee]=Za(b[2]<<2,f);u[0]=new Ca(256,A),u[1]=new Ca(704,b[1]),u[2]=new Ca(O,M);for(let e=0;e<3;++e)u[e].decode(f);let N=0,P=0,F=k[d[0]],te=Xa[F],ne=Xa[F+1],re=u[1].htrees[0];for(;e>0;){let r;f.readMoreInput(),i[1]===0&&(Ha(b[1],v,1,d,x,S,f),i[1]=Ja(y,X,f),re=u[1].htrees[d[1]]),i[1]--;let w=xa(u[1].codes,re,f),O=w>>6;O>=2?(O-=2,r=-1):r=0;let A=Ea[Oa[O]+(w>>3&7)],M=A.offset+f.readBits(A.nbits),ie=Da[ka[O]+(w&7)],I=ie.offset+f.readBits(ie.nbits);c=g[n-1&h],l=g[n-2&h];for(let e=0;e<M;e++){f.readMoreInput(),i[0]===0&&(Ha(b[0],v,0,d,x,S,f),i[0]=Ja(y,0,f),C=d[0]<<6,N=C,F=k[d[0]],te=Xa[F],ne=Xa[F+1]);let e=Ya[te+c]|Ya[ne+l],r=j[N+e];i[0]--,l=c,c=xa(u[0].codes,u[0].htrees[r],f),g[n&h]=c,(n&h)===h&&t.write(g,m),n++}if(e-=M,e<=0)break;if(r<0){f.readMoreInput(),i[2]===0&&(Ha(b[2],v,2,d,x,S,f),i[2]=Ja(y,2*X,f),P=d[2]<<2),i[2]--;let e=(I>4?3:I-2)&255,t=ee[P+e];if(r=xa(u[2].codes,u[2].htrees[t],f),r>=E){r-=E;let e=r&D;r>>=T;let t=(r>>1)+1;r=E+((2+(r&1)<<t)-4+f.readBits(t)<<T)+e}}let ae=bo(r,o,s);if(ae<0)throw Error(`[BrotliDecompress] invalid distance`);a=n<p&&a!==p?n:p;let L=n&h;if(ae>a)if(I>=4&&I<=24){let r=go[I],i=ae-a-1,o=_o[I],s=i&(1<<o)-1,c=i>>o;if(r+=s*I,c<uo){let i=po(g,L,r,I,c);if(L+=i,n+=i,e-=i,L>=_){t.write(g,m);for(let e=0;e<L-_;e++)g[e]=g[_+e]}}else throw Error(`Invalid backward reference`)}else throw Error(`Invalid backward reference`);else{if(r>0&&(o[s&3]=ae,s++),I>e)throw Error(`Invalid backward reference`);for(let r=0;r<I;r++)g[n&h]=g[n-ae&h],(n&h)===h&&t.write(g,m),n++,e--}c=g[n-1&h],l=g[n-2&h]}n&=1073741823}t.write(g,n&h)}function bo(e,t,n){return e<16?(n+=mo[e],n&=3,t[n]+ho[e]):e-16+1}function xo(e,t){let n=new Uint8Array(t);try{let t=0,r=0;for(;t<e.length-8;){let i=e[t++]<<24|e[t++]<<16|e[t++]<<8|e[t++],a=e[t++]<<24|e[t++]<<16|e[t++]<<8|e[t++];if(e.length-t<a||n.length<i||Co(e.subarray(t,t+a),n,r)!==i)throw Error(`lz4 not hadoop`);if(t+=a,r+=i,t===e.length)return n}if(t<e.length)throw Error(`lz4 not hadoop`)}catch(t){if(t instanceof Error&&t.message!==`lz4 not hadoop`)throw t;Co(e,n,0)}return n}function So(e,t){let n=new Uint8Array(t);return Co(e,n,0),n}function Co(e,t,n){let r=n;for(let i=0;i<e.length;){let a=e[i++],o=a>>4;if(o){let a=o+240;for(;a===255;)o+=a=e[i++];if(t.set(e.subarray(i,i+o),r),r+=o,i+=o,i>=e.length)return r-n}let s=e[i++]|e[i++]<<8;if(!s||s>r)throw Error(`lz4 offset out of range ${s}`);let c=(a&15)+4,l=c+240;for(;l===255;)c+=l=e[i++];let u=r-s,d=r+c;for(;r<d;)t[r++]=t[u++]}return r-n}const wo={SNAPPY:ca(),GZIP:(e,t)=>oo(e,new Uint8Array(t)),BROTLI:vo,ZSTD:e=>sa(e),LZ4:xo,LZ4_RAW:So},To=e=>({byteLength:e.byteLength,slice:(t,n)=>Promise.resolve(e.slice(t,n))}),Eo=e=>{let t=e?.find(e=>e.key===`ARROW:schema`);if(t?.value)try{let e=atob(t.value),n=new Uint8Array(e.length);for(let t=0;t<e.length;t++)n[t]=e.charCodeAt(t);return Do(n)}catch{return}},Do=e=>{let t=new DataView(e.buffer,e.byteOffset,e.byteLength);if(e.length<16||t.getInt32(0,!0)!==-1)return;let n=e=>t.getInt32(8+e,!0),r=e=>t.getUint16(8+e,!0),i=t=>{let r=n(t);return new TextDecoder().decode(e.subarray(8+t+4,8+t+4+r))},a=n(0),o=a-n(a);if(r(o)-4>>1<3)return;let s=r(o+4+4);if(s===0)return;let c=n(a+s),l=a+s+c,u=l-n(l);if(r(u)-4>>1<3)return;let d=r(u+4+4);if(d===0)return;let f=n(l+d),p=l+d+f,m=n(p);for(let e=0;e<m;e++){let t=n(p+4+e*4),a=p+4+e*4+t,o=a-n(a);if(r(o)-4>>1<2)continue;let s=r(o+4),c=r(o+6);if(!(s===0||c===0)&&i(a+s+n(a+s))===`dtour`)return i(a+c+n(a+c))}},Oo=async e=>{let t=To(e),n=vr(e),r=n.key_value_metadata?.find(e=>e.key===`dtour`)?.value??Eo(n.key_value_metadata),i=new Set([`list`,`element`,`key`,`value`,`bag`,`array`,`item`,`entries`,`entry`]),a=[],o=[];for(let e of n.schema){if(!(`type`in e)||e.type==null||/^__index_level_\\d+__$/.test(e.name)||i.has(e.name))continue;let t=e.type;t===`FLOAT`||t===`DOUBLE`||t===`INT32`||t===`INT64`||t===`INT96`||t===`BOOLEAN`?a.push(e.name):t===`BYTE_ARRAY`&&o.push(e.name)}let s=Number(n.num_rows),c={};for(let e of a)c[e]=new Float32Array(s);let l=new Map,u=new Map;for(let e of o)l.set(e,new Map),u.set(e,new Uint32Array(s));let d=new Set(a),f=new Set(o);return await Ni({file:t,compressors:wo,columns:[...a,...o],onChunk({columnName:e,columnData:t,rowStart:n}){let r=t.length;if(d.has(e)){let i=c[e];if(t instanceof Float32Array)i.set(t,n);else for(let e=0;e<r;e++){let r=t[e];i[n+e]=typeof r==`bigint`?Number.isFinite(Number(r))?Number(r):0:typeof r==`number`&&Number.isFinite(r)?r:0}return}if(f.has(e)){let i=u.get(e),a=l.get(e);for(let e=0;e<r;e++){let r=String(t[e]??``),o=a.get(r);o===void 0&&(o=a.size,a.set(r,o)),i[n+e]=o}}}}),{numeric:c,categorical:o.map(e=>{let t=[...l.get(e).keys()],n=[...t].sort((e,t)=>e.localeCompare(t,void 0,{numeric:!0,sensitivity:`base`})),r=new Map;for(let e=0;e<n.length;e++)r.set(n[e],e);let i=t.map(e=>r.get(e)),a=u.get(e);for(let e=0;e<a.length;e++)a[e]=i[a[e]];return{name:e,indices:a,labels:n}}),embeddedConfig:r}},ko=async e=>{let t=Pn(e)===`parquet`?await Oo(e):null,n=t??An(e),r=Object.keys(n.numeric);if(r.length===0)throw Error(`No numeric columns found in dataset`);let i=n.numeric[r[0]].length;if(i===0)throw Error(`Dataset contains no rows`);for(let e of r){let t=n.numeric[e];if(t.length!==i)throw Error(`Column \"${e}\" has ${t.length} rows, expected ${i}. All columns must have equal length.`)}return{columns:r.map(e=>{let t=n.numeric[e],{min:r,max:i,range:a,mean:o}=l(t);return{name:e,values:t,min:r,max:i,range:a,mean:o}}),categoricalColumns:n.categorical,rowCount:i,embeddedConfig:t?.embeddedConfig}},Ao=e=>{let t=new Uint32Array(e.length);for(let n=0;n<e.length;n++){let[r,i,a]=e[n];t[n]=255<<24|a<<16|i<<8|r}return t};let $=null,jo=0,Mo=[],No=new Map,Po=new Map,Fo=new Map,Io=0;self.onmessage=async e=>{let n=e.data;if(n.type===`init`){$=n.gpuPort;return}if(n.type===`load`){if(!$){self.postMessage({type:`error`,message:`GPU port not initialized before load`});return}try{let e=await ko(n.buffer);jo++,Io=e.rowCount,Mo=e.columns.map(e=>e.name),No=new Map,Po=new Map;for(let t of e.columns)No.set(t.name,t.min),Po.set(t.name,t.range);Fo=new Map;for(let t of e.categoricalColumns)Fo.set(t.name,t.labels);let t={};for(let n of e.categoricalColumns)t[n.name]=n.labels;let r={type:`metadata`,metadata:{columnNames:e.columns.map(e=>e.name),categoricalColumnNames:e.categoricalColumns.map(e=>e.name),categoricalLabels:t,rowCount:e.rowCount,dimCount:e.columns.length,mins:e.columns.map(e=>e.min),maxes:e.columns.map(e=>e.max),ranges:e.columns.map(e=>e.range),means:e.columns.map(e=>e.mean),embeddedConfig:e.embeddedConfig}};self.postMessage(r);let i=e.columns.map(e=>e.values),a=e.categoricalColumns.map(e=>({name:e.name,indices:e.indices})),o=[...new Set(i.map(e=>e.buffer)),...a.map(e=>e.indices.buffer)],s={type:`data`,dataVersion:jo,dims:e.columns.length,rows:e.rowCount,buffers:i,mins:e.columns.map(e=>e.min),ranges:e.columns.map(e=>e.range),means:e.columns.map(e=>e.mean),categoricalColumns:a};$.postMessage(s,o)}catch(e){let t={type:`error`,message:e instanceof Error?e.message:String(e)};self.postMessage(t)}}if(n.type===`encodeColor`){if(!$)return;let{column:e,palette:t,theme:r,colorMap:l}=n,u=r===`light`,d=Fo.get(e);if(d){let t;if(l)t=d.map(e=>l[e]??[128,128,128]);else{let e=u?o:a;t=d.length<=i.length?i:[...i,...Array(Math.ceil((d.length-i.length)/e.length)).fill(void 0).flatMap(()=>e)]}let n=Ao(t),r={type:`setColorCategorical`,dataVersion:jo,catColumnName:e,palette:n};$.postMessage(r,[n.buffer]);return}let f=Mo.indexOf(e);if(f>=0){let n=No.get(e)??0,r=Po.get(e)??1,i=t===`magma`?c:s,a=Ao(u?[...i].reverse():i),o={type:`setColorContinuous`,dataVersion:jo,columnIndex:f,min:n,range:r,colormap:a};$.postMessage(o,[a.buffer])}}if(n.type===`encodeColor2D`){if(!$)return;let{columnX:e,columnY:i,colormap:a}=n,o=Mo.indexOf(e),s=Mo.indexOf(i);if(o<0||s<0)return;let c=t[a]??0,l=r(c),u=[];l&&u.push(l.buffer);let d={type:`setColor2D`,dataVersion:jo,columnIndexX:o,columnIndexY:s,minX:No.get(e)??0,rangeX:Po.get(e)??1,minY:No.get(i)??0,rangeY:Po.get(i)??1,lut:l,mapIndex:c};$.postMessage(d,u)}if(n.type===`selectByColumn`){if(!$||Io===0)return;let{column:e,labelIndices:t,valueRanges:r}=n,i=Fo.get(e);if(i&&t&&t.length>0){let n=new Uint32Array(i.length);for(let e of t)e<n.length&&(n[e]=1);let r={type:`selectCategorical`,dataVersion:jo,catColumnName:e,selectedLabels:n};$.postMessage(r,[n.buffer]);return}let a=Mo.indexOf(e);if(a>=0&&r&&r.length>=2){let e={type:`selectContinuous`,dataVersion:jo,columnIndex:a,ranges:r};$.postMessage(e,[r.buffer]);return}}};", f = typeof self < "u" && self.Blob && new Blob(["URL.revokeObjectURL(import.meta.url);", d], { type: "text/javascript;charset=utf-8" });
2617
+ }, d = "const e=/* @__PURE__ */ new Float32Array(16),t={schumann:0,bremm:1,steiger:2,ziegler:3,teulingfig2:4,cubediagonal:5,oklab_polar:6},n=[{r_x:[-0,-1.5085,-3.017,-4.5255,-6.034,-7.5425,-9.051,-10.5595,-12.068,-13.4877,-14.9075,-16.3272,-17.747,-19.1668,-20.5865,-22.0063],r_y:[-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442],g_x:[-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953],g_y:[-.076,-.0709,-.0661,-.061,-.0561,-.051,-.0462,-.041,-.0359,-.0308,-.0257,-.0205,-.0154,-.0103,-.0051,0],b_x:[-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581],b_y:[-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442]},{r_x:[-15.2067,-15.095,-14.9554,-14.7857,-14.5812,-14.3334,-14.0291,-13.6663,-13.2288,-12.7355,-12.1699,-11.5268,-10.802,-9.9949,-9.1075,-8.1425],r_y:[-.0066,-.0112,-.0161,-.021,-.026,-.031,-.036,-.0408,-.0449,-.0486,-.0521,-.0554,-.0586,-.0617,-.0647,-.0676],g_x:[-10.7187,-10.7357,-10.755,-10.7798,-10.8079,-10.8405,-10.8775,-10.92,-10.9701,-11.0227,-11.0828,-11.147,-11.2183,-11.2958,-11.3803,-11.4703],g_y:[-.054,-.0531,-.0521,-.0511,-.0499,-.0487,-.0473,-.0459,-.0442,-.0425,-.0405,-.0383,-.0359,-.0331,-.0298,-.0259],b_x:[-2.3509,-4.0466,-5.3978,-6.6213,-7.7862,-8.9196,-10.0363,-11.1469,-12.2854,-13.3981,-14.5092,-15.6231,-16.7524,-17.8862,-19.025,-20.1748],b_y:[-.0437,-.0438,-.0438,-.0439,-.0439,-.044,-.0441,-.0441,-.0442,-.0443,-.0444,-.0444,-.0445,-.0446,-.0447,-.0448]},{r_x:[-21.9278,-21.3484,-20.7628,-20.1344,-19.4757,-18.7856,-18.0477,-17.2595,-16.3843,-15.4484,-14.4257,-13.2751,-11.9456,-10.3735,-8.3553,-5.2147],r_y:[-.0407,-.0417,-.0426,-.0433,-.0439,-.0443,-.0447,-.045,-.0451,-.0452,-.0452,-.0451,-.045,-.0447,-.0444,-.044],g_x:[-13.0812,-13.0665,-13.0508,-13.0388,-13.0293,-13.0203,-13.0133,-13.0087,-13.0068,-13.0092,-13.0125,-13.0162,-13.0269,-13.0372,-13.0532,-13.0708],g_y:[-.0665,-.0634,-.0603,-.0572,-.054,-.0508,-.0476,-.0443,-.0408,-.0373,-.0337,-.0299,-.0258,-.0211,-.0155,-.006],b_x:[-7.2789,-8.4407,-9.4718,-10.4471,-11.3919,-12.3169,-13.2284,-14.1319,-15.0565,-15.9516,-16.8449,-17.7392,-18.6339,-19.5305,-20.4287,-21.3308],b_y:[-.0372,-.0384,-.0395,-.0405,-.0415,-.0424,-.0432,-.044,-.0448,-.0455,-.0462,-.0469,-.0476,-.0482,-.0488,-.0494]},{r_x:[-22.5873,-21.9563,-21.3711,-20.7867,-19.9754,-18.4599,-16.9442,-15.4282,-13.4591,-11.1479,-8.8297,-6.5275,-5.1161,-3.9946,-2.8733,-1.7523],r_y:[-.0419,-.0427,-.0435,-.0443,-.0452,-.0461,-.0471,-.0481,-.0478,-.0462,-.0446,-.0431,-.0419,-.0408,-.0397,-.0387],g_x:[-13.1499,-13.6389,-14.1283,-14.6177,-15.0304,-15.2028,-15.3755,-15.5483,-15.5483,-15.3755,-15.2028,-15.0304,-14.6177,-14.1283,-13.6389,-13.1499],g_y:[-.0679,-.0663,-.0649,-.0634,-.061,-.0553,-.0497,-.0441,-.0373,-.0299,-.0224,-.015,-.0104,-.0069,-.0035,0],b_x:[0,-1.1629,-2.4025,-3.6427,-5.0938,-7.0911,-9.0872,-11.0838,-12.4271,-13.0415,-13.651,-14.263,-13.9595,-13.3667,-12.7641,-12.1687],b_y:[0,-.0049,-.0102,-.0154,-.0216,-.0301,-.0385,-.047,-.0527,-.0553,-.0579,-.0605,-.0592,-.0567,-.0541,-.0516],b_x2:[0,.1737,.3579,.5429,.7486,1.01,1.2709,1.5314,1.3563,.758,.152,-.4504,-.9129,-1.327,-1.7466,-2.1664],b_y2:[0,.0073,.015,.0227,.0314,.0423,.0533,.0642,.0568,.0318,.0064,-.0189,-.0383,-.0556,-.0732,-.0908]},{r_x:[-9.3217,-9.7119,-10.1026,-10.4928,-10.8832,-11.2736,-11.6641,-12.0545,-12.4564,-12.8467,-13.2372,-13.6275,-14.0181,-14.4083,-14.7989,-15.1894],r_y:[-.0121,-.0159,-.0198,-.0236,-.0274,-.0313,-.0351,-.039,-.0429,-.0467,-.0506,-.0544,-.0582,-.0621,-.0659,-.0698],g_x:[-17.2405,-16.5128,-15.7853,-15.0578,-14.3304,-13.6031,-12.8759,-12.1487,-11.4004,-10.6733,-9.9465,-9.2196,-8.4931,-7.7664,-7.04,-6.3134],g_y:[-.0229,-.0255,-.0282,-.0308,-.0334,-.0361,-.0387,-.0413,-.044,-.0467,-.0493,-.0519,-.0546,-.0572,-.0599,-.0625],b_x:[-19.5271,-18.4535,-17.3793,-16.3057,-15.2322,-14.1586,-13.0846,-12.0108,-10.9055,-9.8317,-8.7578,-7.6841,-6.6107,-5.537,-4.4628,-3.3892],b_y:[-.0543,-.0529,-.0515,-.0501,-.0487,-.0473,-.0459,-.0445,-.0431,-.0417,-.0403,-.0389,-.0375,-.0361,-.0347,-.0333]},{r_x:[-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767],r_y:[-.0765,-.0714,-.0663,-.0612,-.0561,-.051,-.0459,-.0408,-.0357,-.0306,-.0255,-.0204,-.0153,-.0102,-.0051,0],g_x:[0,-1.5085,-3.017,-4.5255,-6.034,-7.5425,-9.051,-10.5595,-12.068,-13.5765,-15.0849,-16.5934,-18.1019,-19.6104,-21.1189,-22.6274],g_y:[-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442],b_x:[13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767],b_y:[0,.0051,.0102,.0153,.0204,.0255,.0306,.0357,.0408,.0459,.051,.0561,.0612,.0663,.0714,.0765]}],r=t=>{if(t>=n.length)return null;let r=n[t],i=/* @__PURE__ */ new Float32Array(128);return i.set(r.r_x,0),i.set(r.r_y,16),i.set(r.g_x,32),i.set(r.g_y,48),i.set(r.b_x,64),i.set(r.b_y,80),i.set(r.b_x2??e,96),i.set(r.b_y2??e,112),i},i=[[0,114,178],[230,159,0],[0,158,115],[204,121,167],[86,180,233],[213,94,0],[240,228,66]],a=[[215,0,0],[0,151,0],[0,0,255],[255,186,0],[0,208,255],[255,0,186],[143,90,0],[0,255,151],[169,0,255],[129,129,129],[255,129,97],[0,107,79],[109,109,255],[255,0,57],[137,171,0],[176,106,255],[0,168,168],[255,131,222],[104,70,43],[175,185,143],[163,0,96],[93,136,200],[230,215,127],[0,64,36],[62,53,91],[199,186,255],[127,0,18],[85,233,188],[70,80,0],[255,195,182],[106,50,89],[0,107,140],[238,114,0],[168,161,195],[148,85,115],[0,172,95],[199,0,171],[135,141,113],[27,36,65],[185,111,84],[113,109,60],[0,232,87],[162,55,0],[0,157,218],[231,164,255],[96,131,120],[96,76,255],[192,155,103],[207,0,116],[36,65,103],[157,205,255],[182,97,176],[89,186,138],[255,78,147],[81,113,0],[255,168,105],[75,0,48],[117,217,0],[0,90,179],[214,194,0],[0,74,56],[237,237,220],[90,12,0],[147,161,236]],o=[[214,0,0],[1,135,0],[181,0,255],[5,172,198],[151,255,0],[255,165,47],[255,142,200],[121,82,94],[0,253,207],[175,165,255],[147,172,131],[154,105,0],[54,105,98],[211,0,140],[253,244,144],[200,110,102],[158,226,255],[0,200,70],[168,119,172],[184,186,1],[244,191,177],[255,40,253],[242,205,255],[0,158,124],[255,98,0],[86,100,42],[149,63,31],[144,49,142],[255,52,100],[160,228,145],[140,154,177],[130,144,38],[174,8,63],[119,198,186],[188,145,87],[228,142,255],[114,184,255],[198,165,193],[255,144,112],[211,195,124],[188,237,219],[107,133,103],[145,110,86],[249,255,0],[186,193,223],[172,86,124],[255,205,3],[255,73,177],[193,86,3],[93,140,144],[193,68,188],[0,117,63],[186,110,253],[0,212,147],[0,255,117],[73,161,80],[204,151,144],[0,235,237],[219,126,1],[247,117,137],[184,149,0],[200,66,72],[0,207,249],[117,87,38],[133,212,1],[235,255,212],[167,123,135],[219,114,200],[202,226,86],[138,191,93],[161,33,107],[133,91,137],[137,186,207],[255,186,214],[182,207,170],[151,65,77],[103,170,0],[253,225,177],[255,54,40],[128,121,61],[214,232,255],[167,149,198],[126,165,154],[209,130,163],[84,130,59],[230,168,114],[156,255,255],[218,84,128],[5,179,170],[255,170,246],[209,175,239],[218,1,93],[172,26,19],[96,179,133],[212,66,253],[172,170,89],[251,156,167],[179,114,59],[242,105,82],[174,209,212],[154,255,195],[219,179,51],[235,1,195],[153,0,196],[207,255,158],[165,89,73],[59,109,1],[0,133,121],[149,145,103],[137,219,179],[109,116,0],[170,93,202],[7,239,0],[128,79,61],[216,128,82],[255,200,98],[184,0,158],[153,172,221],[144,79,0],[140,68,112],[79,110,82],[255,135,52],[198,142,205],[212,226,158],[177,130,109],[156,251,117],[86,221,119],[249,0,135],[161,205,255],[19,202,209],[17,142,84],[209,84,165],[0,223,195],[163,131,47],[119,151,91],[186,170,128],[112,163,175],[214,251,255],[232,1,58],[216,70,33],[255,130,237],[182,56,98],[182,205,114],[151,98,107],[137,116,144],[0,163,22],[0,244,161],[191,144,242],[137,228,216],[163,77,149],[110,93,0],[140,198,142],[149,170,42],[198,114,221],[179,59,1],[214,154,54],[223,172,182],[0,154,160],[89,144,0],[151,188,168],[172,140,168],[218,212,255],[84,124,114],[0,186,105],[255,195,142],[184,0,212],[223,207,91],[98,154,123],[191,237,188],[193,189,253],[128,211,221],[226,133,126],[249,235,77],[191,109,130],[202,255,79],[239,114,170],[237,103,255],[153,70,174],[109,105,66],[226,86,96],[221,102,45],[156,219,93],[226,156,207],[184,117,0],[198,0,45],[223,188,218],[89,181,223],[255,89,218],[56,193,161],[158,105,140],[172,170,200],[149,98,47],[181,86,98],[43,126,96],[177,228,0],[237,165,144],[149,253,226],[255,84,142],[189,110,161],[170,59,54],[216,207,0],[170,128,205],[160,128,82],[225,0,232],[195,91,61],[181,58,133],[140,119,0],[219,188,149],[82,158,147],[175,188,130],[145,181,182],[167,84,35],[255,212,239],[121,174,107],[93,181,75],[128,251,154],[72,255,239],[151,149,72],[147,135,167],[49,212,0],[110,233,86],[182,212,235],[112,84,112],[242,219,138],[170,212,193],[126,205,242],[137,186,0],[100,182,186],[255,181,0],[195,130,133],[202,170,94],[100,119,72],[89,226,255],[223,77,205],[233,255,121],[188,102,184],[195,149,165],[100,198,116],[209,149,112],[112,207,79],[170,110,102],[156,96,165],[0,184,0],[226,153,179],[188,0,107],[179,232,239],[205,191,228],[119,163,66],[133,98,119],[86,142,91],[158,175,196],[232,47,160],[36,124,42],[130,103,35],[191,188,77],[221,211,165]],s=[[68,1,84],[71,16,99],[72,31,112],[71,45,123],[68,57,131],[64,70,136],[59,82,139],[54,93,141],[49,104,142],[44,114,142],[40,124,142],[36,134,142],[33,145,140],[31,154,138],[32,164,134],[40,174,128],[53,183,121],[72,193,110],[94,201,98],[117,208,84],[144,215,67],[173,220,48],[200,224,32],[229,228,25],[253,231,37]],c=[[34,17,80],[49,17,101],[64,15,116],[81,18,124],[95,24,127],[109,29,129],[123,35,130],[137,40,129],[152,45,128],[166,49,125],[183,55,121],[197,60,116],[211,67,110],[224,76,103],[235,87,96],[243,101,92],[248,118,92],[252,137,97],[253,154,106],[254,170,116],[254,187,129],[254,204,143],[253,220,158],[252,236,174],[252,253,191]],l=e=>{let t=1/0,n=-1/0,r=0;for(let i=0;i<e.length;i++){let a=e[i];a<t&&(t=a),a>n&&(n=a),r+=a}let i=n-t||1e-6,a=e.length>0?r/e.length:0;return{min:t,max:n,range:i,mean:a}},u=Uint8Array.of(65,82,82,79,87,49),d={V1:0,V2:1,V3:2,V4:3,V5:4},f={NONE:0,Schema:1,DictionaryBatch:2,RecordBatch:3,Tensor:4,SparseTensor:5},p={Dictionary:-1,NONE:0,Null:1,Int:2,Float:3,Binary:4,Utf8:5,Bool:6,Decimal:7,Date:8,Time:9,Timestamp:10,Interval:11,List:12,Struct:13,Union:14,FixedSizeBinary:15,FixedSizeList:16,Map:17,Duration:18,LargeBinary:19,LargeUtf8:20,LargeList:21,RunEndEncoded:22,BinaryView:23,Utf8View:24,ListView:25,LargeListView:26},m={HALF:0,SINGLE:1,DOUBLE:2},h={DAY:0,MILLISECOND:1},g={SECOND:0,MILLISECOND:1,MICROSECOND:2,NANOSECOND:3},_={YEAR_MONTH:0,DAY_TIME:1,MONTH_DAY_NANO:2},v={Sparse:0,Dense:1},y={LZ4_FRAME:0,ZSTD:1},b={BUFFER:0},x=Uint8Array,S=Uint16Array,C=Uint32Array,w=BigUint64Array,T=Int8Array,E=Int16Array,D=Int32Array,O=BigInt64Array,k=Float32Array,A=Float64Array;function j(e){return Object.prototype.toString.call(e)}function M(e){return j(e)===`[object ArrayBuffer]`||j(e)===`[object SharedArrayBuffer]`}function N(e){return j(e)===`[object Uint8Array]`}function ee(e,t){let n=Math.log2(e)-3;return(t?[T,E,D,O]:[x,S,C,w])[n]}function P(e,t){let n=0,r=e.length;if(r<=2147483648)do{let i=n+r>>>1;e[i]<=t?n=i+1:r=i}while(n<r);else do{let i=Math.trunc((n+r)/2);e[i]<=t?n=i+1:r=i}while(n<r);return n}function te(e,t,n){if(t(e))return e;throw Error(n(e))}function F(e,t,n){return t=Array.isArray(t)?t:Object.values(t),te(e,e=>t.includes(e),n??(()=>`${e} must be one of ${t}`))}function ne(e,t){for(let[n,r]of Object.entries(e))if(r===t)return n;return`<Unknown>`}const re=e=>`Unsupported data type: \"${ne(p,e)}\" (id ${e})`,I=(e,t,n=!0,r=null)=>({name:e,type:t,nullable:n,metadata:r});function ie(e){return Object.hasOwn(e,`name`)&&ae(e.type)}function ae(e){return typeof e?.typeId==`number`}function L(e,t=``,n=!0){return ie(e)?e:I(t,te(e,ae,()=>`Data type expected.`),n)}const R=(e,t,n=!1,r=-1)=>({typeId:p.Dictionary,id:r,dictionary:e,indices:t||se(),ordered:n}),oe=(e=32,t=!0)=>({typeId:p.Int,bitWidth:F(e,[8,16,32,64]),signed:t,values:ee(e,t)}),se=()=>oe(32),ce=(e=2)=>({typeId:p.Float,precision:F(e,m),values:[S,k,A][e]}),le=()=>({typeId:p.Binary,offsets:D}),ue=()=>({typeId:p.Utf8,offsets:D}),de=(e,t,n=128)=>({typeId:p.Decimal,precision:e,scale:t,bitWidth:F(n,[32,64,128,256]),values:n===32?D:w}),fe=e=>({typeId:p.Date,unit:F(e,h),values:e===h.DAY?D:O}),pe=(e=g.MILLISECOND)=>{e=F(e,g);let t=e===g.SECOND||e===g.MILLISECOND?32:64;return{typeId:p.Time,unit:e,bitWidth:t,values:t===32?D:O}},me=(e=g.MILLISECOND,t=null)=>({typeId:p.Timestamp,unit:F(e,g),timezone:t,values:O}),he=(e=_.MONTH_DAY_NANO)=>({typeId:p.Interval,unit:F(e,_),values:e===_.MONTH_DAY_NANO?void 0:D}),ge=e=>({typeId:p.List,children:[L(e)],offsets:D}),_e=e=>({typeId:p.Struct,children:Array.isArray(e)&&e.length>0&&ie(e[0])?e:Object.entries(e).map(([e,t])=>I(e,t))}),ve=(e,t,n,r)=>(n??=t.map((e,t)=>t),{typeId:p.Union,mode:F(e,v),typeIds:n,typeMap:n.reduce((e,t,n)=>(e[t]=n,e),{}),children:t.map((e,t)=>L(e,`_${t}`)),typeIdForValue:r,offsets:D}),ye=e=>({typeId:p.FixedSizeBinary,stride:e}),be=(e,t)=>({typeId:p.FixedSizeList,stride:t,children:[L(e)]}),xe=(e,t)=>({typeId:p.Map,keysSorted:e,children:[t],offsets:D}),Se=(e=g.MILLISECOND)=>({typeId:p.Duration,unit:F(e,g),values:O}),Ce=()=>({typeId:p.LargeBinary,offsets:O}),we=()=>({typeId:p.LargeUtf8,offsets:O}),Te=e=>({typeId:p.LargeList,children:[L(e)],offsets:O}),Ee=(e,t)=>({typeId:p.RunEndEncoded,children:[te(L(e,`run_ends`),e=>e.type.typeId===p.Int,()=>`Run-ends must have an integer type.`),L(t,`values`)]}),De=e=>({typeId:p.ListView,children:[L(e,`value`)],offsets:D}),Oe=e=>({typeId:p.LargeListView,children:[L(e,`value`)],offsets:O}),ke=new A(2).buffer;new O(ke),new C(ke),new D(ke),new x(ke);function Ae(e){if(e>2**53-1||e<-(2**53-1))throw Error(`BigInt exceeds integer number representation: ${e}`);return Number(e)}function je(e,t){return Number(e/t)+Number(e%t)/Number(t)}const Me=e=>BigInt.asUintN(64,e);function Ne(e,t){return BigInt.asIntN(64,e[t])}function Pe(e,t){let n=t<<1,r;return BigInt.asIntN(64,e[n+1])<0?(r=Me(~e[n])|Me(~e[n+1])<<64n,r=-(r+1n)):r=e[n]|e[n+1]<<64n,r}function Fe(e,t){let n=t<<2,r;return BigInt.asIntN(64,e[n+3])<0?(r=Me(~e[n])|Me(~e[n+1])<<64n|Me(~e[n+2])<<128n|Me(~e[n+3])<<192n,r=-(r+1n)):r=e[n]|e[n+1]<<64n|e[n+2]<<128n|e[n+3]<<192n,r}const Ie=new TextDecoder(`utf-8`);new TextEncoder;function Le(e){return Ie.decode(e)}function Re(e,t){return!!(e[t>>3]&1<<t%8)}function z(e,t){let n=t+V(e,t),r=n-V(e,n),i=B(e,r);return(t,a,o=null)=>{if(t<i){let i=B(e,r+t);if(i)return a(e,n+i)}return o}}function ze(e,t){return t}function Be(e,t){return!!Ve(e,t)}function Ve(e,t){return He(e,t)<<24>>24}function He(e,t){return e[t]}function B(e,t){return Ue(e,t)<<16>>16}function Ue(e,t){return e[t]|e[t+1]<<8}function V(e,t){return e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24}function We(e,t){return V(e,t)>>>0}function H(e,t){return Ae(BigInt.asIntN(64,BigInt(We(e,t))+(BigInt(We(e,t+4))<<32n)))}function Ge(e,t){let n=t+V(e,t),r=V(e,n);return n+=4,Le(e.subarray(n,n+r))}function Ke(e,t,n,r){if(!t)return[];let i=t+V(e,t);return Array.from({length:V(e,i)},(t,a)=>r(e,i+4+a*n))}const qe=Symbol(`rowIndex`);function Je(e,t){class n{constructor(e){this[qe]=e}toJSON(){return Xe(e,t,this[qe])}}let r=n.prototype;for(let n=0;n<e.length;++n){if(Object.hasOwn(r,e[n]))continue;let i=t[n];Object.defineProperty(r,e[n],{get(){return i.at(this[qe])},enumerable:!0})}return e=>new n(e)}function Ye(e,t){return n=>Xe(e,t,n)}function Xe(e,t,n){let r={};for(let i=0;i<e.length;++i)r[e[i]]=t[i].at(n);return r}function Ze(e){return e instanceof $e}var Qe=class{static ArrayType=null;constructor({length:e,nullCount:t,type:n,validity:r,values:i,offsets:a,sizes:o,children:s}){this.length=e,this.nullCount=t,this.type=n,this.validity=r,this.values=i,this.offsets=a,this.sizes=o,this.children=s,(!t||!this.validity)&&(this.at=e=>this.value(e))}get[Symbol.toStringTag](){return`Batch`}at(e){return this.isValid(e)?this.value(e):null}isValid(e){return Re(this.validity,e)}value(e){return this.values[e]}slice(e,t){let n=t-e,r=Array(n);for(let t=0;t<n;++t)r[t]=this.at(e+t);return r}*[Symbol.iterator](){for(let e=0;e<this.length;++e)yield this.at(e)}},$e=class extends Qe{constructor(e){super(e);let{length:t,values:n}=this;this.values=n.subarray(0,t)}slice(e,t){return this.nullCount?super.slice(e,t):this.values.subarray(e,t)}[Symbol.iterator](){return this.nullCount?super[Symbol.iterator]():this.values[Symbol.iterator]()}},et=class extends Qe{static ArrayType=A},U=class extends Qe{static ArrayType=Array},tt=class extends U{value(e){return null}},nt=class extends et{value(e){return Ae(this.values[e])}},rt=class extends et{value(e){let t=this.values[e],n=(t&31744)>>10,r=(t&1023)/1024,i=(-1)**((t&32768)>>15);switch(n){case 31:return i*(r?NaN:1/0);case 0:return i*(r?6103515625e-14*r:0)}return i*2**(n-15)*(1+r)}},it=class extends U{value(e){return Re(this.values,e)}},at=class extends et{constructor(e){super(e);let{scale:t}=this.type;this.scale=10**t}value(e){return this.values[e]/this.scale}},ot=class extends Qe{constructor(e){super(e);let{bitWidth:t,scale:n}=this.type;this.decimal=t===64?Ne:t===128?Pe:Fe,this.scale=10n**BigInt(n)}},st=class extends ot{static ArrayType=A;value(e){return je(this.decimal(this.values,e),this.scale)}},ct=class extends ot{static ArrayType=Array;value(e){return this.decimal(this.values,e)}},lt=class extends U{constructor(e){super(e),this.source=e}value(e){return new Date(this.source.value(e))}},ut=class extends et{value(e){return 864e5*this.values[e]}};const dt=nt;var ft=class extends nt{value(e){return super.value(e)*1e3}};const pt=nt;var mt=class extends nt{value(e){return je(this.values[e],1000n)}},ht=class extends nt{value(e){return je(this.values[e],1000000n)}},gt=class extends U{value(e){return this.values.subarray(e<<1,e+1<<1)}},_t=class extends U{value(e){let t=this.values,n=e<<4;return Float64Array.of(V(t,n),V(t,n+4),H(t,n+8))}};const vt=({values:e,offsets:t},n)=>e.subarray(t[n],t[n+1]),yt=({values:e,offsets:t},n)=>e.subarray(Ae(t[n]),Ae(t[n+1]));var bt=class extends U{value(e){return vt(this,e)}},xt=class extends U{value(e){return yt(this,e)}},St=class extends U{value(e){return Le(vt(this,e))}},Ct=class extends U{value(e){return Le(yt(this,e))}},wt=class extends U{value(e){let t=this.offsets;return this.children[0].slice(t[e],t[e+1])}},Tt=class extends U{value(e){let t=this.offsets;return this.children[0].slice(Ae(t[e]),Ae(t[e+1]))}},Et=class extends U{value(e){let t=this.offsets[e],n=t+this.sizes[e];return this.children[0].slice(t,n)}},Dt=class extends U{value(e){let t=this.offsets[e],n=t+this.sizes[e];return this.children[0].slice(Ae(t),Ae(n))}},Ot=class extends U{constructor(e){super(e),this.stride=this.type.stride}},kt=class extends Ot{value(e){let{stride:t,values:n}=this;return n.subarray(e*t,(e+1)*t)}},At=class extends Ot{value(e){let{children:t,stride:n}=this;return t[0].slice(e*n,(e+1)*n)}};function jt({children:e,offsets:t},n){let[r,i]=e[0].children,a=t[n],o=t[n+1],s=[];for(let e=a;e<o;++e)s.push([r.at(e),i.at(e)]);return s}var Mt=class extends U{value(e){return jt(this,e)}},Nt=class extends U{value(e){return new Map(jt(this,e))}},Pt=class extends U{constructor({typeIds:e,...t}){super(t),this.typeIds=e,this.typeMap=this.type.typeMap}value(e,t=e){let{typeIds:n,children:r,typeMap:i}=this;return r[i[n[e]]].at(t)}},Ft=class extends Pt{value(e){return super.value(e,this.offsets[e])}},It=class extends U{constructor(e,t=Ye){super(e),this.names=this.type.children.map(e=>e.name),this.factory=t(this.names,this.children)}value(e){return this.factory(e)}},Lt=class extends It{constructor(e){super(e,Je)}},Rt=class extends U{value(e){let[{values:t},n]=this.children;return n.at(P(t,e))}},zt=class extends U{setDictionary(e){return this.dictionary=e,this.cache=e.cache(),this}value(e){return this.cache[this.key(e)]}key(e){return this.values[e]}},Bt=class extends U{constructor({data:e,...t}){super(t),this.data=e}view(e){let{values:t,data:n}=this,r=e<<4,i=r+4,a=t,o=V(a,r);return o>12&&(i=V(a,r+12),a=n[V(a,r+8)]),a.subarray(i,i+o)}},Vt=class extends Bt{value(e){return this.view(e)}},Ht=class extends Bt{value(e){return Le(this.view(e))}};function Ut(e){let t=[];return{add(e){return t.push(e),this},clear:()=>t=[],done:()=>new Wt(t,e)}}var Wt=class{constructor(e,t=e[0]?.type){this.type=t,this.length=e.reduce((e,t)=>e+t.length,0),this.nullCount=e.reduce((e,t)=>e+t.nullCount,0),this.data=e;let n=e.length,r=new Int32Array(n+1);if(n===1){let[t]=e;r[1]=t.length,this.at=e=>t.at(e)}else for(let t=0,i=0;t<n;++t)r[t+1]=i+=e[t].length;this.offsets=r}get[Symbol.toStringTag](){return`Column`}[Symbol.iterator](){let e=this.data;return e.length===1?e[0][Symbol.iterator]():Gt(e)}at(e){let{data:t,offsets:n}=this,r=P(n,e)-1;return t[r]?.at(e-n[r])}get(e){return this.at(e)}toArray(){let{length:e,nullCount:t,data:n}=this,r=!t&&Ze(n[0]),i=n.length;if(r&&i===1)return n[0].values;let a=new(!i||t>0?Array:n[0].constructor.ArrayType??n[0].values.constructor)(e);return r?Kt(a,n):qt(a,n)}cache(){return this._cache??=this.toArray()}};function*Gt(e){for(let t=0;t<e.length;++t){let n=e[t][Symbol.iterator]();for(let e=n.next();!e.done;e=n.next())yield e.value}}function Kt(e,t){for(let n=0,r=0;n<t.length;++n){let{values:i}=t[n];e.set(i,r),r+=i.length}return e}function qt(e,t){let n=-1;for(let r=0;r<t.length;++r){let i=t[r];for(let t=0;t<i.length;++t)e[++n]=i.at(t)}return e}var Jt=class e{constructor(e,t,n=!1){let r=e.fields.map(e=>e.name);this.schema=e,this.names=r,this.children=t,this.factory=n?Je:Ye;let i=[];this.getFactory=e=>i[e]??(i[e]=this.factory(r,t.map(t=>t.data[e])))}get[Symbol.toStringTag](){return`Table`}get numCols(){return this.names.length}get numRows(){return this.children[0]?.length??0}getChildAt(e){return this.children[e]}getChild(e){let t=this.names.findIndex(t=>t===e);return t>-1?this.children[t]:void 0}selectAt(t,n=[]){let{children:r,factory:i,schema:a}=this,{fields:o}=a;return new e({...a,fields:t.map((e,t)=>Yt(o[e],n[t]))},t.map(e=>r[e]),i===Je)}select(e,t){let n=this.names,r=e.map(e=>n.indexOf(e));return this.selectAt(r,t)}toColumns(){let{children:e,names:t}=this,n={};return t.forEach((t,r)=>n[t]=e[r]?.toArray()??[]),n}toArray(){let{children:e,getFactory:t,numRows:n}=this,r=e[0]?.data??[],i=Array(n);for(let e=0,n=-1;e<r.length;++e){let a=t(e);for(let t=0;t<r[e].length;++t)i[++n]=a(t)}return i}*[Symbol.iterator](){let{children:e,getFactory:t}=this,n=e[0]?.data??[];for(let e=0;e<n.length;++e){let r=t(e);for(let t=0;t<n[e].length;++t)yield r(t)}}at(e){let{children:t,getFactory:n,numRows:r}=this;if(e<0||e>=r)return null;let[{offsets:i}]=t,a=P(i,e)-1;return n(a)(e-i[a])}get(e){return this.at(e)}};function Yt(e,t){return t!=null&&t!==e.name?{...e,name:t}:e}function Xt(e,t={}){let{typeId:n,bitWidth:r,mode:i,precision:a,unit:o}=e,{useBigInt:s,useBigIntTimestamp:c,useDate:l,useDecimalInt:u,useMap:d,useProxy:f}=t;switch(n){case p.Null:return tt;case p.Bool:return it;case p.Int:case p.Time:case p.Duration:return s||r<64?$e:nt;case p.Float:return a?$e:rt;case p.Date:return Zt(o===h.DAY?ut:dt,l&&lt);case p.Timestamp:return c?$e:Zt(o===g.SECOND?ft:o===g.MILLISECOND?pt:o===g.MICROSECOND?mt:ht,l&&lt);case p.Decimal:return r===32?u?$e:at:u?ct:st;case p.Interval:return o===_.DAY_TIME?gt:o===_.YEAR_MONTH?$e:_t;case p.FixedSizeBinary:return kt;case p.Utf8:return St;case p.LargeUtf8:return Ct;case p.Binary:return bt;case p.LargeBinary:return xt;case p.BinaryView:return Vt;case p.Utf8View:return Ht;case p.List:return wt;case p.LargeList:return Tt;case p.Map:return d?Nt:Mt;case p.ListView:return Et;case p.LargeListView:return Dt;case p.FixedSizeList:return At;case p.Struct:return f?Lt:It;case p.RunEndEncoded:return Rt;case p.Dictionary:return zt;case p.Union:return i?Ft:Pt}throw Error(re(n))}function Zt(e,t){return t?class extends t{constructor(t){super(new e(t))}}:e}function Qt(e){return`Missing compression codec \"${ne(y,e)}\" (id ${e})`}const $t=/* @__PURE__ */ new Map;function en(e){return e!=null&&$t.get(e)||null}function tn(e,{offset:t,length:n},r){if(n===0)return{bytes:/* @__PURE__ */ new Uint8Array,offset:0,length:0};let i=H(e,t),a=e.subarray(t+8,t+n),o=i===-1?a:r.decode(a,i);return{bytes:o,offset:0,length:o.length}}function nn(e,t){return{offset:H(e,t),metadataLength:V(e,t+8),bodyLength:H(e,t+16)}}function rn(e,t){return Ke(e,t,24,nn)}function an(e,t){let n=z(e,t);return{codec:n(4,Ve,y.LZ4_FRAME),method:n(6,Ve,b.BUFFER)}}function on(e,t,n){let r=z(e,t),i=n<d.V4?8:0;return{length:r(4,H,0),nodes:Ke(e,r(6,ze),16,(e,t)=>({length:H(e,t),nullCount:H(e,t+8)})),regions:Ke(e,r(8,ze),16+i,(e,t)=>({offset:H(e,t+i),length:H(e,t+i+8)})),compression:r(10,an),variadic:Ke(e,r(12,ze),8,H)}}function sn(e,t,n){let r=z(e,t);return{id:r(4,H,0),data:r(6,(e,t)=>on(e,t,n)),isDelta:r(8,Be,!1)}}function cn(e,t,n,r){F(n,p,re);let i=z(e,t);switch(n){case p.Binary:return le();case p.Utf8:return ue();case p.LargeBinary:return Ce();case p.LargeUtf8:return we();case p.List:return ge(r[0]);case p.ListView:return De(r[0]);case p.LargeList:return Te(r[0]);case p.LargeListView:return Oe(r[0]);case p.Struct:return _e(r);case p.RunEndEncoded:return Ee(r[0],r[1]);case p.Int:return oe(i(4,V,0),i(6,Be,!1));case p.Float:return ce(i(4,B,m.HALF));case p.Decimal:return de(i(4,V,0),i(6,V,0),i(8,V,128));case p.Date:return fe(i(4,B,h.MILLISECOND));case p.Time:return pe(i(4,B,g.MILLISECOND));case p.Timestamp:return me(i(4,B,g.SECOND),i(6,Ge));case p.Interval:return he(i(4,B,_.YEAR_MONTH));case p.Duration:return Se(i(4,B,g.MILLISECOND));case p.FixedSizeBinary:return ye(i(4,V,0));case p.FixedSizeList:return be(r[0],i(4,V,0));case p.Map:return xe(i(4,Be,!1),r[0]);case p.Union:return ve(i(4,B,v.Sparse),r,Ke(e,i(6,ze),4,V))}return{typeId:n}}function ln(e,t){let n=Ke(e,t,4,(e,t)=>{let n=z(e,t);return[n(4,Ge),n(6,Ge)]});return n.length?new Map(n):null}function un(e,t,n){let r=z(e,t);return{version:n,endianness:r(4,B,0),fields:r(6,dn,[]),metadata:r(8,ln)}}function dn(e,t){return Ke(e,t,4,fn)}function fn(e,t){let n=z(e,t),r=n(8,He,p.NONE),i=n(10,ze,0),a=n(12,mn),o=cn(e,i,r,n(14,pn,[]));return a&&(a.dictionary=o,o=a),{name:n(4,Ge),type:o,nullable:n(6,Be,!1),metadata:n(16,ln)}}function pn(e,t){return Ke(e,t,4,fn)}function mn(e,t){if(!t)return null;let n=z(e,t);return R(null,n(6,hn,se()),n(8,Be,!1),n(4,H,0))}function hn(e,t){return cn(e,t,p.Int)}const gn=(e,t)=>`Expected to read ${e} metadata bytes, but only read ${t}.`,_n=(e,t)=>`Expected to read ${e} bytes for message body, but only read ${t}.`,vn=e=>`Unsupported message type: ${e} (${ne(f,e)})`;function yn(e,t){let n=V(e,t)||0;if(t+=4,n===-1&&(n=V(e,t)||0,t+=4),n===0)return null;let r=e.subarray(t,t+=n);if(r.byteLength<n)throw Error(gn(n,r.byteLength));let i=z(r,0),a=i(4,B,d.V1),o=i(6,He,f.NONE),s=i(8,ze,0),c=i(10,H,0),l;if(s){let n=o===f.Schema?un:o===f.DictionaryBatch?sn:o===f.RecordBatch?on:null;if(!n)throw Error(vn(o));if(l=n(r,s,a),c>0){let n=e.subarray(t,t+=c);if(n.byteLength<c)throw Error(_n(c,n.byteLength));l.body=n}else o!==f.Schema&&(l.body=/* @__PURE__ */ new Uint8Array)}return{version:a,type:o,index:t,content:l}}function bn(e){let t=M(e)?new Uint8Array(e):e;return N(t)&&xn(t)?Cn(t):Sn(t)}function xn(e){if(!e||e.length<4)return!1;for(let t=0;t<6;++t)if(u[t]!==e[t])return!1;return!0}function Sn(e){let t=[e].flat(),n,r=[],i=[],a=[];for(let e of t){if(!N(e))throw Error(`IPC data batch was not a Uint8Array.`);let t=0;for(;;){let o=yn(e,t);if(o===null)break;if(t=o.index,o.content)switch(o.type){case f.Schema:n||=o.content;break;case f.RecordBatch:r.push(o.content),a.push(i.length);break;case f.DictionaryBatch:i.push(o.content)}}}return{schema:n,dictionaries:i,records:r,dictsBeforeRecord:a,metadata:null}}function Cn(e){let t=e.byteLength-(u.length+4),n=z(e,t-V(e,t)),r=n(4,B,d.V1),i=n(8,rn,[]),a=n(10,rn,[]),o=a.map(e=>i.filter(t=>t.offset<e.offset).length);return{schema:n(6,(e,t)=>un(e,t,r)),dictionaries:i.map(({offset:t})=>yn(e,t).content),records:a.map(({offset:t})=>yn(e,t).content),dictsBeforeRecord:o,metadata:n(12,ln)}}function wn(e,t){return Tn(bn(e),t)}function Tn(e,t={}){let{schema:n={fields:[]},dictionaries:r,records:i,dictsBeforeRecord:a}=e,{version:o,fields:s}=n,c=/* @__PURE__ */ new Map,l=Dn(t,o,c),u=/* @__PURE__ */ new Map;En(n,e=>{let t=e.type;t.typeId===p.Dictionary&&u.set(t.id,t.dictionary)});let d=e=>{let{id:t,data:n,isDelta:r,body:i}=e,a=u.get(t),o=kn(a,l({...n,body:i})),s=c.get(t);if(s)r?c.set(t,new Wt([...s.data,o],a)):c.set(t,new Wt([o],a));else{if(r)throw Error(`Delta update can not be first dictionary batch.`);c.set(t,new Wt([o],a))}},f=s.map(e=>Ut(e.type)),m=0;for(let e=0;e<i.length;e++){let t=a?a[e]:r.length;for(;m<t;)d(r[m++]);let n=l(i[e]);s.forEach((e,t)=>f[t].add(kn(e.type,n)))}for(;m<r.length;)d(r[m++]);return new Jt(n,f.map(e=>e.done()),t.useProxy)}function En(e,t){e.fields.forEach(function e(n){t(n),n.type.dictionary?.children?.forEach(e),n.type.children?.forEach(e)})}function Dn(e,t,n){let r={version:t,options:e,dictionary:e=>n.get(e)};return e=>{let{length:t,nodes:n,regions:i,compression:a,variadic:o,body:s}=e,c=-1,l=-1,u=-1;return{...r,length:t,node:()=>n[++c],buffer:e=>{let{bytes:t,length:n,offset:r}=On(s,i[++l],a);return e?new e(t.buffer,t.byteOffset+r,n/e.BYTES_PER_ELEMENT):t.subarray(r,r+n)},variadic:()=>o[++u],visit(e){return e.map(e=>kn(e.type,this))}}}}function On(e,t,n){if(!n)return{bytes:e,...t};if(n.method!==b.BUFFER)throw Error(`Unknown compression method (${n.method})`);{let r=n.codec,i=en(r);if(!i)throw Error(Qt(r));return tn(e,t,i)}}function kn(e,t){let{typeId:n}=e,{options:r,node:i,buffer:a,variadic:o,version:s}=t,c=Xt(e,r),l={...i(),type:e};if(n===p.Null)return new c({...l,nullCount:l.length});switch(n){case p.Bool:case p.Int:case p.Time:case p.Duration:case p.Float:case p.Decimal:case p.Date:case p.Timestamp:case p.Interval:case p.FixedSizeBinary:return new c({...l,validity:a(),values:a(e.values)});case p.Utf8:case p.LargeUtf8:case p.Binary:case p.LargeBinary:return new c({...l,validity:a(),offsets:a(e.offsets),values:a()});case p.BinaryView:case p.Utf8View:return new c({...l,validity:a(),values:a(),data:Array.from({length:o()},()=>a())});case p.List:case p.LargeList:case p.Map:return new c({...l,validity:a(),offsets:a(e.offsets),children:t.visit(e.children)});case p.ListView:case p.LargeListView:return new c({...l,validity:a(),offsets:a(e.offsets),sizes:a(e.offsets),children:t.visit(e.children)});case p.FixedSizeList:case p.Struct:return new c({...l,validity:a(),children:t.visit(e.children)});case p.RunEndEncoded:return new c({...l,children:t.visit(e.children)});case p.Dictionary:{let{id:n,indices:r}=e;return new c({...l,validity:a(),values:a(r.values)}).setDictionary(t.dictionary(n))}case p.Union:return s<d.V5&&a(),new c({...l,typeIds:a(T),offsets:e.mode===v.Sparse?null:a(e.offsets),children:t.visit(e.children)});default:throw Error(re(n))}}new Uint16Array(new Uint8Array([1,0]).buffer)[0];const An=/* @__PURE__ */ new Set([`Float32Array`,`Float64Array`,`Int8Array`,`Int16Array`,`Int32Array`,`Uint8Array`,`Uint16Array`,`Uint32Array`]),jn=e=>{let t=wn(new Uint8Array(e)).toColumns(),n={},r=[];for(let[e,i]of Object.entries(t))if(ArrayBuffer.isView(i)){let t=Object.prototype.toString.call(i).slice(8,-1);An.has(t)&&(n[e]=i instanceof Float32Array?i:new Float32Array(i))}else if(Array.isArray(i)&&typeof i.find(e=>e!=null)==`string`){let t=/* @__PURE__ */ new Map,n=new Uint32Array(i.length);for(let e=0;e<i.length;e++){let r=String(i[e]??``),a=t.get(r);a===void 0&&(a=t.size,t.set(r,a)),n[e]=a}let a=[...t.keys()],o=[...a].sort((e,t)=>e.localeCompare(t,void 0,{numeric:!0,sensitivity:`base`})),s=/* @__PURE__ */ new Map;for(let e=0;e<o.length;e++)s.set(o[e],e);let c=a.map(e=>s.get(e));for(let e=0;e<n.length;e++)n[e]=c[n[e]];r.push({name:e,indices:n,labels:o})}return{numeric:n,categorical:r}},Mn=[65,82,82,79,87,49],Nn=[80,65,82,49],Pn=(e,t)=>e.length>=t.length&&t.every((t,n)=>e[n]===t),Fn=e=>{let t=new Uint8Array(e,0,Math.min(8,e.byteLength));return Pn(t,Mn)?`arrow`:Pn(t,Nn)?`parquet`:`arrow`},In=[`BOOLEAN`,`INT32`,`INT64`,`INT96`,`FLOAT`,`DOUBLE`,`BYTE_ARRAY`,`FIXED_LEN_BYTE_ARRAY`],Ln=[`PLAIN`,`GROUP_VAR_INT`,`PLAIN_DICTIONARY`,`RLE`,`BIT_PACKED`,`DELTA_BINARY_PACKED`,`DELTA_LENGTH_BYTE_ARRAY`,`DELTA_BYTE_ARRAY`,`RLE_DICTIONARY`,`BYTE_STREAM_SPLIT`],Rn=[`REQUIRED`,`OPTIONAL`,`REPEATED`],zn=[`UTF8`,`MAP`,`MAP_KEY_VALUE`,`LIST`,`ENUM`,`DECIMAL`,`DATE`,`TIME_MILLIS`,`TIME_MICROS`,`TIMESTAMP_MILLIS`,`TIMESTAMP_MICROS`,`UINT_8`,`UINT_16`,`UINT_32`,`UINT_64`,`INT_8`,`INT_16`,`INT_32`,`INT_64`,`JSON`,`BSON`,`INTERVAL`],Bn=[`UNCOMPRESSED`,`SNAPPY`,`GZIP`,`LZO`,`BROTLI`,`LZ4`,`ZSTD`,`LZ4_RAW`],Vn=[`DATA_PAGE`,`INDEX_PAGE`,`DICTIONARY_PAGE`,`DATA_PAGE_V2`],Hn=[`UNORDERED`,`ASCENDING`,`DESCENDING`],Un=[`SPHERICAL`,`VINCENTY`,`THOMAS`,`ANDOYER`,`KARNEY`];function Wn(e){let t=Gn(e);if(t.type===1)return{type:`Point`,coordinates:Kn(e,t)};if(t.type===2)return{type:`LineString`,coordinates:qn(e,t)};if(t.type===3)return{type:`Polygon`,coordinates:Jn(e,t)};if(t.type===4){let n=[];for(let r=0;r<t.count;r++)n.push(Kn(e,Gn(e)));return{type:`MultiPoint`,coordinates:n}}if(t.type===5){let n=[];for(let r=0;r<t.count;r++)n.push(qn(e,Gn(e)));return{type:`MultiLineString`,coordinates:n}}if(t.type===6){let n=[];for(let r=0;r<t.count;r++)n.push(Jn(e,Gn(e)));return{type:`MultiPolygon`,coordinates:n}}if(t.type===7){let n=[];for(let r=0;r<t.count;r++)n.push(Wn(e));return{type:`GeometryCollection`,geometries:n}}throw Error(`Unsupported geometry type: ${t.type}`)}function Gn(e){let{view:t}=e,n=t.getUint8(e.offset++)===1,r=t.getUint32(e.offset,n);e.offset+=4;let i=r%1e3,a=Math.floor(r/1e3),o=0;i>1&&i<=7&&(o=t.getUint32(e.offset,n),e.offset+=4);let s=2;return a&&s++,a===3&&s++,{littleEndian:n,type:i,dim:s,count:o}}function Kn(e,t){let n=[];for(let r=0;r<t.dim;r++){let r=e.view.getFloat64(e.offset,t.littleEndian);e.offset+=8,n.push(r)}return n}function qn(e,t){let n=[];for(let r=0;r<t.count;r++)n.push(Kn(e,t));return n}function Jn(e,t){let{view:n}=e,r=[];for(let i=0;i<t.count;i++){let i=n.getUint32(e.offset,t.littleEndian);e.offset+=4,r.push(qn(e,{...t,count:i}))}return r}const Yn=new TextDecoder,Xn={timestampFromMilliseconds(e){return new Date(Number(e))},timestampFromMicroseconds(e){return new Date(Number(e/1000n))},timestampFromNanoseconds(e){return new Date(Number(e/1000000n))},dateFromDays(e){return/* @__PURE__ */ new Date(e*864e5)},stringFromBytes(e){return e&&Yn.decode(e)},jsonFromBytes(e){return e&&JSON.parse(Yn.decode(e))},geometryFromBytes(e){return e&&Wn({view:new DataView(e.buffer,e.byteOffset,e.byteLength),offset:0})},geographyFromBytes(e){return e&&Wn({view:new DataView(e.buffer,e.byteOffset,e.byteLength),offset:0})},uuidFromBytes(e){if(!e)return;let t=Array.from(e,e=>e.toString(16).padStart(2,`0`)).join(``);return t.slice(0,8)+`-`+t.slice(8,12)+`-`+t.slice(12,16)+`-`+t.slice(16,20)+`-`+t.slice(20,32)}};function Zn(e,t,n,r){if(t&&n.endsWith(`_DICTIONARY`)){let n=e;e instanceof Uint8Array&&!(t instanceof Uint8Array)&&(n=new t.constructor(e.length));for(let r=0;r<e.length;r++)n[r]=t[e[r]];return n}return Qn(e,r)}function Qn(e,t){let{element:n,parsers:r,utf8:i=!0,schemaPath:a}=t,{type:o,converted_type:s,logical_type:c}=n,l=n.repetition_type!==`REQUIRED`;if(a?.some(e=>e.element.logical_type?.type===`VARIANT`)&&o===`BYTE_ARRAY`&&s!==`UTF8`&&c?.type!==`STRING`)return e;if(s===`DECIMAL`){let t=10**-(n.scale||0),r=Array(e.length);for(let n=0;n<r.length;n++)e[n]instanceof Uint8Array?r[n]=$n(e[n])*t:r[n]=Number(e[n])*t;return r}if(!s&&o===`INT96`)return Array.from(e).map(e=>r.timestampFromNanoseconds(er(e)));if(s===`DATE`)return Array.from(e).map(e=>r.dateFromDays(e));if(s===`TIMESTAMP_MILLIS`)return Array.from(e).map(e=>r.timestampFromMilliseconds(e));if(s===`TIMESTAMP_MICROS`)return Array.from(e).map(e=>r.timestampFromMicroseconds(e));if(s===`JSON`)return e.map(e=>r.jsonFromBytes(e));if(s===`BSON`)throw Error(`parquet bson not supported`);if(s===`INTERVAL`)throw Error(`parquet interval not supported`);if(c?.type===`GEOMETRY`)return e.map(e=>r.geometryFromBytes(e));if(c?.type===`GEOGRAPHY`)return e.map(e=>r.geographyFromBytes(e));if(c?.type===`UUID`)return e.map(e=>r.uuidFromBytes(e));if(s===`UTF8`||c?.type===`STRING`||i&&o===`BYTE_ARRAY`)return e.map(e=>r.stringFromBytes(e));if(s===`UINT_64`||c?.type===`INTEGER`&&c.bitWidth===64&&!c.isSigned){if(e instanceof BigInt64Array)return new BigUint64Array(e.buffer,e.byteOffset,e.length);let t=l?Array(e.length):new BigUint64Array(e.length);for(let n=0;n<t.length;n++)t[n]=e[n];return t}if(s===`UINT_32`||c?.type===`INTEGER`&&c.bitWidth===32&&!c.isSigned){if(e instanceof Int32Array)return new Uint32Array(e.buffer,e.byteOffset,e.length);let t=l?Array(e.length):new Uint32Array(e.length);for(let n=0;n<t.length;n++)t[n]=e[n]<0?4294967296+e[n]:e[n];return t}if(c?.type===`FLOAT16`)return Array.from(e).map(tr);if(c?.type===`TIMESTAMP`){let{unit:t}=c,n=r.timestampFromMilliseconds;t===`MICROS`&&(n=r.timestampFromMicroseconds),t===`NANOS`&&(n=r.timestampFromNanoseconds);let i=Array(e.length);for(let t=0;t<i.length;t++)i[t]=n(e[t]);return i}return e}function $n(e){if(!e.length)return 0;let t=0n;for(let n of e)t=t*256n+BigInt(n);let n=e.length*8;return t>=2n**BigInt(n-1)&&(t-=2n**BigInt(n)),Number(t)}function er(e){let t=(e>>64n)-2440588n,n=e&18446744073709551615n;return t*86400000000000n+n}function tr(e){if(!e)return;let t=e[1]<<8|e[0],n=t>>15?-1:1,r=t>>10&31,i=t&1023;return r===0?n*2**-14*(i/1024):r===31?i?NaN:n*(1/0):n*2**(r-15)*(1+i/1024)}function nr(e,t,n){let r=e[t],i=[],a=1;if(r.num_children)for(;i.length<r.num_children;){let r=e[t+a],o=nr(e,t+a,[...n,r.name]);a+=o.count,i.push(o)}return{count:a,element:r,children:i,path:n}}function rr(e,t){let n=nr(e,0,[]),r=[n];for(let e of t){let i=n.children.find(t=>t.element.name===e);if(!i)throw Error(`parquet schema element not found: ${t}`);r.push(i),n=i}return r}function ir(e){let t=[];function n(e){if(e.children.length)for(let t of e.children)n(t);else t.push(e.path.join(`.`))}return n(e),t}function ar(e){let t=0;for(let{element:n}of e)n.repetition_type===`REPEATED`&&t++;return t}function or(e){let t=0;for(let{element:n}of e.slice(1))n.repetition_type!==`REQUIRED`&&t++;return t}function sr(e){if(!e||e.element.converted_type!==`LIST`||e.children.length>1)return!1;let t=e.children[0];return!(t.children.length>1||t.element.repetition_type!==`REPEATED`)}function cr(e){if(!e||e.element.converted_type!==`MAP`||e.children.length>1)return!1;let t=e.children[0];return t.children.length===2&&t.element.repetition_type===`REPEATED`&&t.children.find(e=>e.element.name===`key`)?.element.repetition_type!==`REPEATED`&&t.children.find(e=>e.element.name===`value`)?.element.repetition_type!==`REPEATED`}function lr(e){if(e.length!==2)return!1;let[,t]=e;return!(t.element.repetition_type===`REPEATED`||t.children.length)}function ur(e){let t={},n=0;for(;e.offset<e.view.byteLength;){let r=e.view.getUint8(e.offset++),i=r&15;if(i===0)break;let a=r>>4;n=a?n+a:pr(e),t[`field_${n}`]=dr(e,i)}return t}function dr(e,t){switch(t){case 1:return!0;case 2:return!1;case 3:return e.view.getInt8(e.offset++);case 4:case 5:return pr(e);case 6:return mr(e);case 7:{let t=e.view.getFloat64(e.offset,!0);return e.offset+=8,t}case 8:{let t=W(e),n=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,t);return e.offset+=t,n}case 9:{let t=e.view.getUint8(e.offset++),n=t&15,r=t>>4;r===15&&(r=W(e));let i=n===1||n===2,a=Array(r);for(let t=0;t<r;t++)a[t]=i?dr(e,3)===1:dr(e,n);return a}case 12:return ur(e);default:throw Error(`thrift unhandled type: ${t}`)}}function W(e){let t=0,n=0;for(;;){let r=e.view.getUint8(e.offset++);if(t|=(r&127)<<n,!(r&128))return t;n+=7}}function fr(e){let t=0n,n=0n;for(;;){let r=e.view.getUint8(e.offset++);if(t|=BigInt(r&127)<<n,!(r&128))return t;n+=7n}}function pr(e){let t=W(e);return t>>>1^-(t&1)}function mr(e){let t=fr(e);return t>>1n^-(t&1n)}function hr(e,t){let n=/* @__PURE__ */ new Map,r=t?.find(({key:e})=>e===`geo`)?.value,i=(r&&JSON.parse(r)?.columns)??{};for(let[e,t]of Object.entries(i)){if(t.encoding!==`WKB`)continue;let r=t.edges===`spherical`?`GEOGRAPHY`:`GEOMETRY`,i=t.crs?.id??t.crs?.ids?.[0],a=i?`${i.authority}:${i.code.toString()}`:void 0;n.set(e,{type:r,crs:a})}for(let t=1;t<e.length;t++){let{logical_type:r,name:i,num_children:a,type:o}=e[t];a?t+=a:o===`BYTE_ARRAY`&&!r&&(e[t].logical_type=n.get(i))}}const gr=new TextDecoder;function G(e){return e&&gr.decode(e)}async function _r(e,{parsers:t,initialFetchSize:n=524288,geoparquet:r=!0}={}){if(!e||!(e.byteLength>=0))throw Error(`parquet expected AsyncBuffer`);let i=Math.max(0,e.byteLength-n),a=await e.slice(i,e.byteLength),o=new DataView(a);if(o.getUint32(a.byteLength-4,!0)!==827474256)throw Error(`parquet file invalid (footer != PAR1)`);let s=o.getUint32(a.byteLength-8,!0);if(s>e.byteLength-8)throw Error(`parquet metadata length ${s} exceeds available buffer ${e.byteLength-8}`);if(s+8>n){let n=e.byteLength-s-8,o=await e.slice(n,i),c=new ArrayBuffer(s+8),l=new Uint8Array(c);return l.set(new Uint8Array(o)),l.set(new Uint8Array(a),i-n),vr(c,{parsers:t,geoparquet:r})}return vr(a,{parsers:t,geoparquet:r})}function vr(e,{parsers:t,geoparquet:n=!0}={}){if(!(e instanceof ArrayBuffer))throw Error(`parquet expected ArrayBuffer`);let r=new DataView(e),i={...Xn,...t};if(r.byteLength<8)throw Error(`parquet file is too short`);if(r.getUint32(r.byteLength-4,!0)!==827474256)throw Error(`parquet file invalid (footer != PAR1)`);let a=r.byteLength-8,o=r.getUint32(a,!0);if(o>r.byteLength-8)throw Error(`parquet metadata length ${o} exceeds available buffer ${r.byteLength-8}`);let s=ur({view:r,offset:a-o}),c=s.field_1,l=s.field_2.map(e=>({type:In[e.field_1],type_length:e.field_2,repetition_type:Rn[e.field_3],name:G(e.field_4),num_children:e.field_5,converted_type:zn[e.field_6],scale:e.field_7,precision:e.field_8,field_id:e.field_9,logical_type:br(e.field_10)})),u=l.filter(e=>e.type),d=s.field_3,f=s.field_4.map(e=>({columns:e.field_1.map((e,t)=>({file_path:G(e.field_1),file_offset:e.field_2,meta_data:e.field_3&&{type:In[e.field_3.field_1],encodings:e.field_3.field_2?.map(e=>Ln[e]),path_in_schema:e.field_3.field_3.map(G),codec:Bn[e.field_3.field_4],num_values:e.field_3.field_5,total_uncompressed_size:e.field_3.field_6,total_compressed_size:e.field_3.field_7,key_value_metadata:e.field_3.field_8?.map(e=>({key:G(e.field_1),value:G(e.field_2)})),data_page_offset:e.field_3.field_9,index_page_offset:e.field_3.field_10,dictionary_page_offset:e.field_3.field_11,statistics:Sr(e.field_3.field_12,u[t],i),encoding_stats:e.field_3.field_13?.map(e=>({page_type:Vn[e.field_1],encoding:Ln[e.field_2],count:e.field_3})),bloom_filter_offset:e.field_3.field_14,bloom_filter_length:e.field_3.field_15,size_statistics:e.field_3.field_16&&{unencoded_byte_array_data_bytes:e.field_3.field_16.field_1,repetition_level_histogram:e.field_3.field_16.field_2,definition_level_histogram:e.field_3.field_16.field_3},geospatial_statistics:e.field_3.field_17&&{bbox:e.field_3.field_17.field_1&&{xmin:e.field_3.field_17.field_1.field_1,xmax:e.field_3.field_17.field_1.field_2,ymin:e.field_3.field_17.field_1.field_3,ymax:e.field_3.field_17.field_1.field_4,zmin:e.field_3.field_17.field_1.field_5,zmax:e.field_3.field_17.field_1.field_6,mmin:e.field_3.field_17.field_1.field_7,mmax:e.field_3.field_17.field_1.field_8},geospatial_types:e.field_3.field_17.field_2}},offset_index_offset:e.field_4,offset_index_length:e.field_5,column_index_offset:e.field_6,column_index_length:e.field_7,crypto_metadata:e.field_8,encrypted_column_metadata:e.field_9})),total_byte_size:e.field_2,num_rows:e.field_3,sorting_columns:e.field_4?.map(e=>({column_idx:e.field_1,descending:e.field_2,nulls_first:e.field_3})),file_offset:e.field_5,total_compressed_size:e.field_6,ordinal:e.field_7})),p=s.field_5?.map(e=>({key:G(e.field_1),value:G(e.field_2)})),m=G(s.field_6);return n&&hr(l,p),{version:c,schema:l,num_rows:d,row_groups:f,key_value_metadata:p,created_by:m,metadata_length:o}}function yr({schema:e}){return rr(e,[])[0]}function br(e){return e?.field_1?{type:`STRING`}:e?.field_2?{type:`MAP`}:e?.field_3?{type:`LIST`}:e?.field_4?{type:`ENUM`}:e?.field_5?{type:`DECIMAL`,scale:e.field_5.field_1,precision:e.field_5.field_2}:e?.field_6?{type:`DATE`}:e?.field_7?{type:`TIME`,isAdjustedToUTC:e.field_7.field_1,unit:xr(e.field_7.field_2)}:e?.field_8?{type:`TIMESTAMP`,isAdjustedToUTC:e.field_8.field_1,unit:xr(e.field_8.field_2)}:e?.field_10?{type:`INTEGER`,bitWidth:e.field_10.field_1,isSigned:e.field_10.field_2}:e?.field_11?{type:`NULL`}:e?.field_12?{type:`JSON`}:e?.field_13?{type:`BSON`}:e?.field_14?{type:`UUID`}:e?.field_15?{type:`FLOAT16`}:e?.field_16?{type:`VARIANT`,specification_version:e.field_16.field_1}:e?.field_17?{type:`GEOMETRY`,crs:G(e.field_17.field_1)}:e?.field_18?{type:`GEOGRAPHY`,crs:G(e.field_18.field_1),algorithm:Un[e.field_18.field_2]}:e}function xr(e){if(e.field_1)return`MILLIS`;if(e.field_2)return`MICROS`;if(e.field_3)return`NANOS`;throw Error(`parquet time unit required`)}function Sr(e,t,n){return e&&{max:Cr(e.field_1,t,n),min:Cr(e.field_2,t,n),null_count:e.field_3,distinct_count:e.field_4,max_value:Cr(e.field_5,t,n),min_value:Cr(e.field_6,t,n),is_max_value_exact:e.field_7,is_min_value_exact:e.field_8}}function Cr(e,t,n){let{type:r,converted_type:i,logical_type:a}=t;if(e===void 0)return e;if(r===`BOOLEAN`)return e[0]===1;if(r===`BYTE_ARRAY`)return n.stringFromBytes(e);let o=new DataView(e.buffer,e.byteOffset,e.byteLength);if(r===`FLOAT`&&o.byteLength===4)return o.getFloat32(0,!0);if(r===`DOUBLE`&&o.byteLength===8)return o.getFloat64(0,!0);if(r===`INT32`&&i===`DECIMAL`&&o.byteLength===4)return o.getInt32(0,!0)*10**-(t.scale||0);if(r===`INT64`&&i===`DECIMAL`&&o.byteLength===8)return Number(o.getBigInt64(0,!0))*10**-(t.scale||0);if(r===`INT32`&&i===`DATE`)return n.dateFromDays(o.getInt32(0,!0));if(r===`INT64`&&i===`TIMESTAMP_MILLIS`)return n.timestampFromMilliseconds(o.getBigInt64(0,!0));if(r===`INT64`&&i===`TIMESTAMP_MICROS`)return n.timestampFromMicroseconds(o.getBigInt64(0,!0));if(r===`INT64`&&a?.type===`TIMESTAMP`&&a?.unit===`NANOS`)return n.timestampFromNanoseconds(o.getBigInt64(0,!0));if(r===`INT64`&&a?.type===`TIMESTAMP`&&a?.unit===`MICROS`)return n.timestampFromMicroseconds(o.getBigInt64(0,!0));if(r===`INT64`&&a?.type===`TIMESTAMP`)return n.timestampFromMilliseconds(o.getBigInt64(0,!0));let s=i?.startsWith(`UINT_`)||a?.type===`INTEGER`&&!a.isSigned;return r===`INT32`&&s&&o.byteLength===4?o.getUint32(0,!0):r===`INT64`&&s&&o.byteLength===8?o.getBigUint64(0,!0):r===`INT32`&&o.byteLength===4?o.getInt32(0,!0):r===`INT64`&&o.byteLength===8?o.getBigInt64(0,!0):i===`DECIMAL`?$n(e)*10**-(t.scale||0):a?.type===`FLOAT16`?tr(e):a?.type===`UUID`?n.uuidFromBytes(e):e}function wr(e,t,n=void 0){let r={...Xn,...n},i=ur(e);return{null_pages:i.field_1,min_values:i.field_2.map(e=>Cr(e,t,r)),max_values:i.field_3.map(e=>Cr(e,t,r)),boundary_order:Hn[i.field_4],null_counts:i.field_5,repetition_level_histograms:i.field_6,definition_level_histograms:i.field_7}}function Tr(e){let t=ur(e);return{page_locations:t.field_1.map(e=>({offset:e.field_1,compressed_page_size:e.field_2,first_row_index:e.field_3})),unencoded_byte_array_data_bytes:t.field_2}}const K=18446744073709551615n,Er=11400714785074694791n,Dr=14029467366897019727n,Or=1609587929392839161n,kr=9650029242287828579n,Ar=2870177450012600261n;function jr(e,t){return(e<<t|e>>64n-t)&K}function Mr(e,t){return e=e+t*Dr&K,e=jr(e,31n),e*Er&K}function Nr(e,t){return e^=Mr(0n,t),e*Er+kr&K}function Pr(e,t=0n){let n=new DataView(e.buffer,e.byteOffset,e.byteLength),r=e.byteLength,i=0,a;if(r>=32){let e=t+Er+Dr&K,o=t+Dr&K,s=t,c=t-Er&K;for(;i+32<=r;)e=Mr(e,n.getBigUint64(i,!0)),i+=8,o=Mr(o,n.getBigUint64(i,!0)),i+=8,s=Mr(s,n.getBigUint64(i,!0)),i+=8,c=Mr(c,n.getBigUint64(i,!0)),i+=8;a=jr(e,1n)+jr(o,7n)+jr(s,12n)+jr(c,18n)&K,a=Nr(a,e),a=Nr(a,o),a=Nr(a,s),a=Nr(a,c)}else a=t+Ar&K;for(a=a+BigInt(r)&K;i+8<=r;)a^=Mr(0n,n.getBigUint64(i,!0)),a=jr(a,27n)*Er+kr&K,i+=8;for(i+4<=r&&(a^=BigInt(n.getUint32(i,!0))*Er&K,a=jr(a,23n)*Dr+Or&K,i+=4);i<r;)a^=BigInt(n.getUint8(i))*Ar&K,a=jr(a,11n)*Er&K,i+=1;return a^=a>>33n,a=a*Dr&K,a^=a>>29n,a=a*Or&K,a^=a>>32n,a}const Fr=new TextEncoder,Ir=new Uint32Array([1203114875,1150766481,2284105051,2729912477,1884591559,770785867,2667333959,1550580529]);function Lr(e,t){return Number((e>>32n)*BigInt(t)>>32n)}function Rr(e){let t=/* @__PURE__ */ new Uint32Array(8),n=Number(e&4294967295n)|0;for(let e=0;e<8;e++)t[e]=1<<(Math.imul(n,Ir[e])>>>27);return t}function zr(e,t){let n=Lr(t,e.length>>3)<<3,r=Rr(t);for(let t=0;t<8;t++)if((e[n+t]&r[t])===0)return!1;return!0}function Br(e){let t=ur(e),n=t.field_1;if(typeof n!=`number`||n<=0||n%32!=0||!t.field_2?.field_1||!t.field_3?.field_1||!t.field_4?.field_1)return;let{view:r,offset:i}=e;if(i+n>r.byteLength)throw Error(`parquet bloom filter truncated: need ${n} bytes, have ${r.byteLength-i}`);let a=new Uint32Array(n>>2);for(let e=0;e<a.length;e++)a[e]=r.getUint32(i+e*4,!0);return e.offset=i+n,{numBytes:n,blocks:a}}function Vr(e,t){if(e==null)return;let{type:n,converted_type:r,logical_type:i}=t;if(n===`BOOLEAN`)return typeof e==`boolean`?Pr(new Uint8Array([+!!e])):void 0;if(n===`FLOAT`){if(typeof e!=`number`)return;let t=/* @__PURE__ */ new ArrayBuffer(4);return new DataView(t).setFloat32(0,e,!0),Pr(new Uint8Array(t))}if(n===`DOUBLE`){if(typeof e!=`number`)return;let t=/* @__PURE__ */ new ArrayBuffer(8);return new DataView(t).setFloat64(0,e,!0),Pr(new Uint8Array(t))}if(n===`INT32`){if(r===`DATE`||r===`DECIMAL`||r===`TIME_MILLIS`||i?.type===`DATE`||i?.type===`TIME`||i?.type===`DECIMAL`||typeof e!=`number`||!Number.isInteger(e))return;let t=/* @__PURE__ */ new ArrayBuffer(4);return new DataView(t).setInt32(0,e|0,!0),Pr(new Uint8Array(t))}if(n===`INT64`){if(r===`TIMESTAMP_MILLIS`||r===`TIMESTAMP_MICROS`||r===`TIME_MICROS`||r===`DECIMAL`||i?.type===`TIMESTAMP`||i?.type===`TIME`||i?.type===`DECIMAL`)return;let t;if(typeof e==`bigint`)t=e;else if(typeof e==`number`&&Number.isSafeInteger(e))t=BigInt(e);else return;let n=/* @__PURE__ */ new ArrayBuffer(8);return new DataView(n).setBigUint64(0,BigInt.asUintN(64,t),!0),Pr(new Uint8Array(n))}if(n===`BYTE_ARRAY`)return r===`JSON`||r===`BSON`||r===`DECIMAL`||i?.type===`JSON`||i?.type===`BSON`||i?.type===`VARIANT`||i?.type===`GEOMETRY`||i?.type===`GEOGRAPHY`?void 0:typeof e==`string`?Pr(Fr.encode(e)):e instanceof Uint8Array?Pr(e):void 0;if(n===`FIXED_LEN_BYTE_ARRAY`)return r===`DECIMAL`||r===`INTERVAL`||i?.type===`DECIMAL`||i?.type===`UUID`||i?.type===`FLOAT16`||i?.type===`GEOMETRY`||i?.type===`GEOGRAPHY`?void 0:e instanceof Uint8Array?Pr(e):void 0}function Hr(e){let t=/* @__PURE__ */ new Set;return Ur(e,t),t}function Ur(e,t){if(e){if(`$and`in e&&Array.isArray(e.$and))for(let n of e.$and)Ur(n,t);else if(`$or`in e&&Array.isArray(e.$or))for(let n of e.$or)Ur(n,t);else if(!(`$nor`in e))for(let[n,r]of Object.entries(e))n.startsWith(`$`)||(typeof r==`object`&&r&&!Array.isArray(r)?(`$eq`in r||`$in`in r)&&t.add(n):t.add(n))}}function Wr(e,t){let n=1e4;for(let r=0;r<t.length;r+=n)e.push(...t.slice(r,r+n))}function q(e,t,n=!0){if(n?e===t:e==t)return!0;if(!e||!t||typeof e!=`object`||typeof t!=`object`)return!1;if(e instanceof Uint8Array&&t instanceof Uint8Array){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0}if(e instanceof Date||t instanceof Date)return e instanceof Date&&t instanceof Date&&e.getTime()===t.getTime();if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let r=0;r<e.length;r++)if(!q(e[r],t[r],n))return!1;return!0}let r=Object.keys(e);if(r.length!==Object.keys(t).length)return!1;for(let i of r)if(!q(e[i],t[i],n))return!1;return!0}function Gr(e){if(!e)return[];if(e.length===1)return e[0];let t=[];for(let n of e)Wr(t,n);return t}const Kr=new TextEncoder;function qr(e){if(!e)return[];let t=[];return`$and`in e&&Array.isArray(e.$and)?t.push(...e.$and.flatMap(qr)):`$or`in e&&Array.isArray(e.$or)?t.push(...e.$or.flatMap(qr)):`$nor`in e&&Array.isArray(e.$nor)?t.push(...e.$nor.flatMap(qr)):t.push(...Object.keys(e)),[...new Set(t)]}function Jr(e){return[...new Set(qr(e).map(e=>e.split(`.`)[0]))]}function Yr(e,t,n=!0){return`$and`in t&&Array.isArray(t.$and)?t.$and.every(t=>Yr(e,t,n)):`$or`in t&&Array.isArray(t.$or)?t.$or.some(t=>Yr(e,t,n)):`$nor`in t&&Array.isArray(t.$nor)?!t.$nor.some(t=>Yr(e,t,n)):Object.entries(t).every(([t,r])=>{let i=ai(e,t);return typeof r!=`object`||!r||Array.isArray(r)?q(i,r,n):Object.entries(r||{}).every(([e,t])=>e===`$gt`?i!=null&&i>t:e===`$gte`?i!=null&&i>=t:e===`$lt`?i!=null&&i<t:e===`$lte`?i!=null&&i<=t:e===`$eq`?q(i,t,n):e===`$ne`?!q(i,t,n):e===`$in`?Array.isArray(t)&&Xr(i,t,n):e===`$nin`?Array.isArray(t)&&!Xr(i,t,n):e!==`$not`||!Yr({value:i},{value:t},n))})}function Xr(e,t,n){return t.some(t=>q(e,t,n)||Array.isArray(e)&&e.some(e=>q(e,t,n)))}function Zr({rowGroup:e,physicalColumns:t,filter:n,strict:r=!0,bloomFilters:i,schemaElements:a}){if(!n)return!1;if(`$and`in n&&Array.isArray(n.$and))return n.$and.some(n=>Zr({rowGroup:e,physicalColumns:t,filter:n,strict:r,bloomFilters:i,schemaElements:a}));if(`$or`in n&&Array.isArray(n.$or))return n.$or.every(n=>Zr({rowGroup:e,physicalColumns:t,filter:n,strict:r,bloomFilters:i,schemaElements:a}));if(`$nor`in n&&Array.isArray(n.$nor))return!1;for(let[o,s]of Object.entries(n)){let n=t.indexOf(o);if(n===-1)continue;let{min:c,max:l,min_value:u,max_value:d,null_count:f}=e.columns[n].meta_data?.statistics||{},p=u===void 0?c:u,m=d===void 0?l:d,h=p!==void 0&&m!==void 0,g=i?.[o],_=a?.[o],v=Yr({value:null},{value:s},r)&&(f===void 0||f>0);if(h&&!v&&Qr(s,p,m,r,_))return!0;for(let[e,t]of Object.entries(s||{}))if(g&&_){if(e===`$eq`){let e=Vr(t,_);if(e!==void 0&&!zr(g.blocks,e))return!0}if(e===`$in`&&Array.isArray(t)&&t.length>0){let e=!0;for(let n of t){let t=Vr(n,_);if(t===void 0||zr(g.blocks,t)){e=!1;break}}if(e)return!0}}}return!1}function Qr(e,t,n,r,i){if(t===void 0||n===void 0)return!1;let a=i?.type===`FLOAT`||i?.type===`DOUBLE`||i?.logical_type?.type===`FLOAT16`;for(let[o,s]of Object.entries(e||{})){let e=$r(t,s,r,i),c=$r(n,s,r,i),l=!(t instanceof Uint8Array||n instanceof Uint8Array)&&(i?.type!==`BYTE_ARRAY`||typeof s==`string`&&[...s].every(e=>e.charCodeAt(0)<=127));if(o===`$gt`&&l&&c!==void 0&&c<=0||o===`$gte`&&l&&c!==void 0&&c<0||o===`$lt`&&l&&e!==void 0&&e>=0||o===`$lte`&&l&&e!==void 0&&e>0)return!0;if(o===`$eq`){let e=$r(s,t,r,i),a=$r(s,n,r,i);if(e!==void 0&&e<0||a!==void 0&&a>0)return!0}if(o===`$ne`&&!a&&q(t,n,r)&&q(t,s,r)||o===`$in`&&Array.isArray(s)&&s.every(e=>{let a=$r(e,t,r,i),o=$r(e,n,r,i);return a!==void 0&&a<0||o!==void 0&&o>0})||o===`$nin`&&!a&&Array.isArray(s)&&q(t,n,r)&&s.some(e=>q(t,e,r)))return!0}return!1}function $r(e,t,n,r){if(r?.type===`BYTE_ARRAY`)return typeof e!=`string`||typeof t!=`string`?void 0:ei(Kr.encode(e),Kr.encode(t));if(e instanceof Uint8Array||t instanceof Uint8Array)return!(e instanceof Uint8Array)||!(t instanceof Uint8Array)?void 0:ei(e,t);if(e<t)return-1;if(e>t)return 1;if(q(e,t,n))return 0}function ei(e,t){let n=Math.min(e.length,t.length);for(let r=0;r<n;r++){if(e[r]<t[r])return-1;if(e[r]>t[r])return 1}return e.length<t.length?-1:+(e.length>t.length)}function ti(e,t){return Yr({value:null},{value:e},t)}function ni(e,t,n,r=!0){if(!e)return;if(`$and`in e&&Array.isArray(e.$and)){let i;for(let a of e.$and)i=ri(i,ni(a,t,n,r));return i}if(`$or`in e&&Array.isArray(e.$or)){let i=[];for(let a of e.$or){let e=ni(a,t,n,r);if(!e)return;i=ii(i,e)}return i}if(`$nor`in e&&Array.isArray(e.$nor))return;let i;for(let[a,o]of Object.entries(e)){let e=t[a];if(!e)continue;let s=ti(o,r),c=[];for(let t=0;t<e.pageStarts.length;t++){let i=e.pageStarts[t],a=t+1<e.pageStarts.length?e.pageStarts[t+1]:n,l=e.nullCounts?.[t],u=s&&(l===void 0||l>0);if(e.nullPages[t]||u||!Qr(o,e.minValues[t],e.maxValues[t],r,e.element)){let e=c[c.length-1];e&&e[1]===i?e[1]=a:c.push([i,a])}}i=ri(i,c)}return i}function ri(e,t){if(!e)return t;if(!t)return e;let n=[],r=0,i=0;for(;r<e.length&&i<t.length;){let a=Math.max(e[r][0],t[i][0]),o=Math.min(e[r][1],t[i][1]);a<o&&n.push([a,o]),e[r][1]<t[i][1]?r++:i++}return n}function ii(e,t){let n=[],r=0,i=0;for(;r<e.length||i<t.length;){let a=i>=t.length||r<e.length&&e[r][0]<=t[i][0]?e[r++]:t[i++],o=n[n.length-1];o&&a[0]<=o[1]?o[1]=Math.max(o[1],a[1]):n.push([a[0],a[1]])}return n}function ai(e,t){let n=e;for(let e of t.split(`.`))n=n?.[e];return n}const oi=1<<21;function si(e){let{metadata:t,rowStart:n=0,columns:r,useOffsetIndex:i=!1}=e;if(!t)throw Error(`parquetPlan requires metadata`);let a=[],o=[],s=[],c=ci(e);for(let e of c.groups){let t=li({...e,columns:r,useOffsetIndex:i});a.push(...t.groups),o.push(...t.fetches),s.push(...t.indexes)}return o.push(...s),{metadata:t,rowStart:n,rowEnd:c.rowEnd,columns:r,fetches:o,groups:a}}function ci({metadata:e,rowStart:t=0,rowEnd:n=1/0,columns:r,filter:i,filterStrict:a=!0,bloomFiltersByGroup:o,schemaElements:s,pageRangesByGroup:c,pageLocationsByGroup:l}){if(!e)throw Error(`parquetPlan requires metadata`);let u=yr(e),d=ir(u),f=i?{...hi(u),...s}:s,p=[],m=0;for(let s=0;s<e.row_groups.length;s++){let u=e.row_groups[s],h=Number(u.num_rows),g=m+h;if(h>0&&g>t&&m<n&&!Zr({rowGroup:u,physicalColumns:d,filter:i,strict:a,bloomFilters:o?.[s],schemaElements:f})){let e=Math.max(t-m,0),i=Math.min(n-m,h),a=c?.[s],o=l?.[s],d=a?a.map(([t,n])=>[Math.max(t,e),Math.min(n,i)]).filter(([e,t])=>e<t):[[e,i]];d.length>1&&(d=u.columns.every(e=>{let t=e.meta_data?.path_in_schema[0],n=e.meta_data?.path_in_schema.join(`.`);return r&&t&&!r.includes(t)?!0:!!(e.offset_index_offset&&e.offset_index_length)||!!(n&&o?.[n])})?ui(d,u,r,o):[[d[0][0],d[d.length-1][1]]]),d.length&&p.push({rowGroup:u,groupIndex:s,groupStart:m,groupRows:h,ranges:d,pageRanges:a,pageLocations:o})}m=g}return{groups:p,rowEnd:isFinite(n)?n:m}}function li({rowGroup:e,groupStart:t,groupRows:n,ranges:r,columns:i,useOffsetIndex:a=!1,pageRanges:o,pageLocations:s}){let c=[],l=[],u=[],d=r.length>1||r[0][0]>0||r[0][1]<n;for(let t of e.columns){let e=t.meta_data;if(t.file_path)throw Error(`parquet file_path not supported`);if(!e)throw Error(`parquet column metadata is undefined`);if(i&&!i.includes(e.path_in_schema[0]))continue;let n=e.dictionary_page_offset||e.data_page_offset,r=Number(n),l=Number(n+e.total_compressed_size),u=s?.[e.path_in_schema.join(`.`)];if(u&&d)c.push({columnMetadata:e,pageLocations:u,range:{startByte:r,endByte:l}});else if((a||o)&&t.offset_index_offset&&t.offset_index_length&&d){let r=Number(t.offset_index_offset);c.push({columnMetadata:e,offsetIndex:{startByte:r,endByte:r+t.offset_index_length},range:{startByte:Number(n),endByte:l}})}else c.push({columnMetadata:e,range:{startByte:r,endByte:l}})}let f=[],p;for(let e of c)`pageLocations`in e||(`offsetIndex`in e?u.push(e.offsetIndex):i?f.push(e.range):p&&e.range.endByte-p.startByte<=oi?p.endByte=e.range.endByte:(p&&l.push(p),p={...e.range}));return p&&l.push(p),l.push(...mi(f,8192,oi)),{groups:r.map(([r,i])=>({chunks:c,rowGroup:e,groupStart:t,groupRows:n,selectStart:r,selectEnd:i})),fetches:l,indexes:u}}function ui(e,t,n,r){let i=t.columns.filter(e=>!n||n.includes(e.meta_data?.path_in_schema[0]||``)).map(e=>r?.[e.meta_data?.path_in_schema.join(`.`)||``]),a=[];for(let n of e){let e=a[a.length-1],r=e&&i.some(r=>{if(!r)return!0;let i=di(e,r,Number(t.num_rows)),a=di(n,r,Number(t.num_rows));return i[0]<=a[1]&&a[0]<=i[1]});e&&r?e[1]=n[1]:a.push([...n])}return a}function di([e,t],n,r){let i=1/0,a=-1/0;for(let o=0;o<n.length;o++){let s=Number(n[o].first_row_index);(o+1<n.length?Number(n[o+1].first_row_index):r)>e&&s<t&&(i=Math.min(i,o),a=o)}return[i,a]}async function fi({file:e,metadata:t,filter:n,filterStrict:r=!0}){let i=t.row_groups.map(()=>({})),a=Hr(n);if(a.size===0)return i;let o=ir(yr(t)),s=[];return t.row_groups.forEach((t,c)=>{if(!Zr({rowGroup:t,physicalColumns:o,filter:n,strict:r}))for(let n of a){let r=o.indexOf(n);if(r===-1)continue;let a=t.columns[r]?.meta_data;if(!a?.bloom_filter_offset||!a.bloom_filter_length)continue;let l=Number(a.bloom_filter_offset),u=l+a.bloom_filter_length;s.push((async()=>{let t=await e.slice(l,u),r=Br({view:new DataView(t),offset:0});r&&(i[c][n]=r)})())}}),s.length&&await Promise.all(s),i}async function pi({file:e,metadata:t,filter:n,filterStrict:r=!0,rowStart:i=0,rowEnd:a=1/0,columns:o,bloomFiltersByGroup:s,schemaElements:c,parsers:l}){let u=t.row_groups.map(()=>void 0),d=t.row_groups.map(()=>({}));if(n&&`$nor`in n&&Array.isArray(n.$nor))return{pageRangesByGroup:u,pageLocationsByGroup:d};let f=qr(n);if(!f.length)return{pageRangesByGroup:u,pageLocationsByGroup:d};let p=yr(t),m=ir(p),h={...hi(p),...c},g=[],_=[],v=[],y=0;if(t.row_groups.forEach((e,t)=>{let c=Number(e.num_rows),u=y+c,p=c>0&&u>i&&y<a;if(y=u,!p||Zr({rowGroup:e,physicalColumns:m,filter:n,strict:r,bloomFilters:s?.[t],schemaElements:h}))return;let b={},x=0,S=/* @__PURE__ */ new Set,C=!1;for(let n of f){let r=m.indexOf(n);if(r===-1)continue;let i=e.columns[r];if(!i?.meta_data||!i.column_index_offset||!i.column_index_length||!i.offset_index_offset||!i.offset_index_length)continue;let a=h[n];if(!a)continue;C=!0,S.add(n);let o=Number(i.column_index_offset),s=Number(i.offset_index_offset),c=o+i.column_index_length,u=s+i.offset_index_length;g.push({startByte:o,endByte:c},{startByte:s,endByte:u}),x++,_.push(async e=>{let[r,i]=await Promise.all([e.slice(o,c),e.slice(s,u)]),f=wr({view:new DataView(r),offset:0},a,l),p=Tr({view:new DataView(i),offset:0});d[t][n]=p.page_locations,b[n]={minValues:f.min_values,maxValues:f.max_values,nullPages:f.null_pages,nullCounts:f.null_counts,pageStarts:p.page_locations.map(e=>Number(e.first_row_index)),element:a}})}if(C)for(let n of e.columns){let e=n.meta_data;if(!e)continue;let r=e.path_in_schema[0],i=e.path_in_schema.join(`.`);if(o&&!o.includes(r)||S.has(i)||!n.offset_index_offset||!n.offset_index_length)continue;S.add(i);let a=Number(n.offset_index_offset),s=a+n.offset_index_length;g.push({startByte:a,endByte:s}),x++,_.push(async e=>{let n=await e.slice(a,s),r=Tr({view:new DataView(n),offset:0});d[t][i]=r.page_locations})}x&&v.push({rgIdx:t,groupRows:c,columnPages:b})}),_.length){let t=gi(e,{fetches:mi(g)});await Promise.all(_.map(e=>e(t)));for(let{rgIdx:e,groupRows:t,columnPages:i}of v)u[e]=ni(n,i,t,r)}return{pageRangesByGroup:u,pageLocationsByGroup:d}}function mi(e,t=0,n=1/0){let r=e.map(e=>({...e})).sort((e,t)=>e.startByte-t.startByte||e.endByte-t.endByte),i=[];for(let e of r){let r=i[i.length-1];r&&e.startByte<=r.endByte+t&&Math.max(r.endByte,e.endByte)-r.startByte<=n?r.endByte=Math.max(r.endByte,e.endByte):i.push(e)}return i}function hi(e){let t={};function n(e){if(e.children.length)for(let t of e.children)n(t);else t[e.path.join(`.`)]=e.element}return n(e),t}function gi(e,{fetches:t}){let n=t.map(({startByte:t,endByte:n})=>e.slice(t,n));return{byteLength:e.byteLength,slice(r,i=e.byteLength){let a=t.findIndex(({startByte:e,endByte:t})=>e<=r&&i<=t);if(a<0)return e.slice(r,i);if(t[a].startByte!==r||t[a].endByte!==i){let e=r-t[a].startByte,o=i-t[a].startByte;return n[a]instanceof Promise?n[a].then(t=>t.slice(e,o)):n[a].slice(e,o)}return n[a]}}}const _i=new TextDecoder,vi=/* @__PURE__ */ new WeakMap;function yi(e,t=Xn){if(Array.isArray(e))return e.map(e=>yi(e,t));if(typeof e!=`object`)return e;if(`metadata`in e){let n=Si(e.metadata),r=e.typed_value&&bi(e.typed_value,n,t),i=e.value&&wi(xi(e.value),n,t);return r&&i?{...i,...r}:r??i}return e}function bi(e,t,n){if(e instanceof Date)return e;if(e&&typeof e==`object`&&!Array.isArray(e)&&!(e instanceof Uint8Array)){if(`typed_value`in e&&e.typed_value!==null&&e.typed_value!==void 0)return bi(e.typed_value,t,n);if(`value`in e&&e.value instanceof Uint8Array)return wi(xi(e.value),t,n);if(`typed_value`in e||`value`in e)return null;let r={};for(let[i,a]of Object.entries(e))t.dictionary.includes(i)&&(r[i]=bi(a,t,n));return r}return e instanceof Uint8Array?wi(xi(e),t,n):Array.isArray(e)?e.map(e=>bi(e,t,n)):e}function xi(e){return{view:new DataView(e.buffer,e.byteOffset,e.byteLength),offset:0}}function Si(e){let t=vi.get(e.buffer);t||(t=/* @__PURE__ */ new Map,vi.set(e.buffer,t));let n=`${e.byteOffset}:${e.byteLength}`,r=t.get(n);if(r)return r;let i=xi(e),a=i.view.getUint8(i.offset++),o=a&15;if(o!==1)throw Error(`parquet unsupported variant metadata version: ${o}`);let s=(a>>4&1)==1,c=(a>>6&3)+1,l=Ci(i,c),u=Array(l+1);for(let e=0;e<u.length;e++)u[e]=Ci(i,c);let d=i.offset,f=Array(l);for(let t=0;t<l;t++){let n=u[t],r=u[t+1],i=new Uint8Array(e.buffer,e.byteOffset+d+n,r-n);f[t]=_i.decode(i)}let p={dictionary:f,sorted:s};return t.set(n,p),p}function Ci(e,t){let n=0;for(let r=0;r<t;r++)n|=e.view.getUint8(e.offset+r)<<r*8;return e.offset+=t,n}function wi(e,t,n){let r=e.view.getUint8(e.offset++),i=r&3,a=r>>2;if(i===0)return Ti(e,a,n);if(i===2)return Ei(e,a,t,n);if(i===3)return Di(e,a,t,n);let o=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,a);return e.offset+=a,_i.decode(o)}function Ti(e,t,n){switch(t){case 0:return null;case 1:return!0;case 2:return!1;case 3:{let t=e.view.getInt8(e.offset);return e.offset+=1,t}case 4:{let t=e.view.getInt16(e.offset,!0);return e.offset+=2,t}case 5:{let t=e.view.getInt32(e.offset,!0);return e.offset+=4,t}case 6:{let t=e.view.getBigInt64(e.offset,!0);return e.offset+=8,t}case 7:{let t=e.view.getFloat64(e.offset,!0);return e.offset+=8,t}case 8:return Oi(e,4);case 9:return Oi(e,8);case 10:return Oi(e,16);case 11:{let t=e.view.getInt32(e.offset,!0);return e.offset+=4,n.dateFromDays(t)}case 12:case 13:{let t=e.view.getBigInt64(e.offset,!0);return e.offset+=8,n.timestampFromMicroseconds(t)}case 14:{let t=e.view.getFloat32(e.offset,!0);return e.offset+=4,t}case 15:return ki(e);case 16:{let t=ki(e);return _i.decode(t)}case 17:{let t=e.view.getBigInt64(e.offset,!0);return e.offset+=8,t}case 18:case 19:{let t=e.view.getBigInt64(e.offset,!0);return e.offset+=8,n.timestampFromNanoseconds(t)}case 20:{let t=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,16);e.offset+=16;let n=Array.from(t,e=>e.toString(16).padStart(2,`0`)).join(``);return`${n.slice(0,8)}-${n.slice(8,12)}-${n.slice(12,16)}-${n.slice(16,20)}-${n.slice(20)}`}default:throw Error(`parquet unsupported variant primitive type: ${t}`)}}function Ei(e,t,n,r){let i=(t&3)+1,a=(t>>2&3)+1,o=t>>4&1?Ci(e,4):e.view.getUint8(e.offset++),s=Array(o);for(let t=0;t<o;t++)s[t]=Ci(e,a);let c=Array(o+1);for(let t=0;t<c.length;t++)c[t]=Ci(e,i);let l={};for(let t=0;t<o;t++){let i=n.dictionary[s[t]];l[i]=wi({view:e.view,offset:e.offset+c[t]},n,r)}return e.offset+=c[c.length-1],l}function Di(e,t,n,r){let i=t&3,a=t>>2&1,o=i+1,s=Ci(e,a?4:1),c=Array(s+1);for(let t=0;t<c.length;t++)c[t]=Ci(e,o);let l=e.offset,u=Array(s);for(let t=0;t<s;t++){let i={view:e.view,offset:l+c[t]};u[t]=wi(i,n,r)}return e.offset=l+c[c.length-1],u}function Oi(e,t){let n=e.view.getUint8(e.offset);e.offset+=1;let r;if(t===4)r=BigInt(e.view.getInt32(e.offset,!0)),e.offset+=4;else if(t===8)r=e.view.getBigInt64(e.offset,!0),e.offset+=8;else{let t=e.view.getBigUint64(e.offset,!0);r=e.view.getBigInt64(e.offset+8,!0)<<64n|t,e.offset+=16}return Number(r)*10**-n}function ki(e){let t=e.view.getUint32(e.offset,!0);e.offset+=4;let n=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,t);return e.offset+=t,n}function Ai(e,t,n,r,i){let a=or(i);if(!t?.length&&!n.length){if(!a||!r.length)return r;t=Array(r.length).fill(a)}let o=t?.length||n.length,s=i.map(({element:e})=>e.repetition_type),c=0,l=[e],u=e,d=0,f=0,p=0;if(n[0])for(;d<s.length-2&&p<n[0];)d++,s[d]!==`REQUIRED`&&(u=u.at(-1),l.push(u),f++),s[d]===`REPEATED`&&p++;for(let e=0;e<o;e++){let i=t?.length?t[e]:a,o=n[e];for(;d&&(o<p||s[d]!==`REPEATED`);)s[d]!==`REQUIRED`&&(l.pop(),f--),s[d]===`REPEATED`&&p--,d--;for(u=l.at(-1);(d<s.length-2||s[d+1]===`REPEATED`)&&(f<i||s[d+1]===`REQUIRED`);){if(d++,s[d]!==`REQUIRED`){let e=[];u.push(e),u=e,l.push(e),f++}s[d]===`REPEATED`&&p++}i===a?u.push(r[c++]):d===s.length-2?u.push(null):u.push([])}if(!e.length)for(let e=0;e<a;e++){let e=[];u.push(e),u=e}return e}function ji(e,t,n,r=0){let i=t.path.join(`.`),a=t.element.repetition_type===`OPTIONAL`,o=a?r+1:r;if(sr(t)){let s=t.children[0],c=o;s.children.length===1&&(s=s.children[0],c++),ji(e,s,n,c);let l=s.path.join(`.`),u=e.get(l);if(!u)throw Error(`parquet list column missing values`);a&&Mi(u,r),e.set(i,u),e.delete(l)}else if(cr(t)){let s=t.children[0].element.name;ji(e,t.children[0].children[0],n,o+1),ji(e,t.children[0].children[1],n,o+1);let c=e.get(`${i}.${s}.key`),l=e.get(`${i}.${s}.value`);if(!c)throw Error(`parquet map column missing keys`);if(!l)throw Error(`parquet map column missing values`);if(c.length!==l.length)throw Error(`parquet map column key/value length mismatch`);let u=Ni(c,l,o);a&&Mi(u,r),e.delete(`${i}.${s}.key`),e.delete(`${i}.${s}.value`),e.set(i,u)}else if(t.children.length){let o=t.element.repetition_type===`REQUIRED`?r:r+1,s={};for(let r of t.children){ji(e,r,n,o);let t=e.get(r.path.join(`.`));if(!t)throw Error(`parquet struct missing child data`);s[r.element.name]=t}for(let n of t.children)e.delete(n.path.join(`.`));let c=Pi(s,o);t.element.logical_type?.type===`VARIANT`&&(c=yi(c,n)),a&&Mi(c,r),e.set(i,c)}}function Mi(e,t){for(let n=0;n<e.length;n++)t?Mi(e[n],t-1):e[n]=e[n][0]}function Ni(e,t,n){let r=[];for(let i=0;i<e.length;i++)if(n)r.push(Ni(e[i],t[i],n-1));else if(e[i]){let n={};for(let r=0;r<e[i].length;r++){let a=t[i][r];n[e[i][r]]=a===void 0?null:a}r.push(n)}else r.push(void 0);return r}function Pi(e,t){let n=Object.keys(e),r=e[n[0]]?.length,i=[];for(let a=0;a<r;a++){let o={};for(let t of n){if(e[t].length!==r)throw Error(`parquet struct parsing error`);o[t]=e[t][a]}t?i.push(Pi(o,t-1)):i.push(o)}return i}function Fi(e,t,n){if(n instanceof Int32Array){Ii(e,t,n);return}let r=W(e),i=W(e);W(e);let a=mr(e),o=0;n[o++]=a;let s=r/i;for(;o<t;){let r=mr(e),c=new Uint8Array(i);for(let t=0;t<i;t++)c[t]=e.view.getUint8(e.offset++);for(let l=0;l<i&&o<t;l++){let i=c[l];if(i){let c=0,l=s,u=(1n<<BigInt(i))-1n;for(;l&&o<t;){let t=BigInt(e.view.getUint32(e.offset,!0)>>>c)&u;for(c+=i;c>=32;)c-=32,e.offset+=4,c&&(t|=BigInt(e.view.getUint32(e.offset,!0))<<BigInt(i-c)&u);let s=r+t;a+=s,n[o++]=a,l--}l&&(e.offset+=Math.ceil((l*i+c)/8))}else for(let e=0;e<s&&o<t;e++)a+=r,n[o++]=a}}}function Ii(e,t,n){let r=W(e),i=W(e);W(e);let a=pr(e),o=0;n[o++]=a;let s=r/i,{view:c}=e;for(;o<t;){let r=Li(e),l=e.offset,u=l+i;for(let e=0;e<i&&o<t;e++){let i=c.getUint8(l+e),d=u+s*i/8,f=0;for(let e=0;e<s&&o<t;e++){let e=0,t=0;for(;t<i;){let n=Math.min(8-f,i-t);t<32&&(e|=(c.getUint8(u)>>>f&(1<<n)-1)<<t),t+=n,f+=n,f===8&&(f=0,u++)}a=a+r+e|0,n[o++]=a}u=d}e.offset=u}}function Li(e){let t=e.offset,n=W(e),r=e.offset-t===5?e.view.getUint8(t+4)>>>4&1:0;return(n>>>1|r<<31)^-(n&1)}function Ri(e,t,n){let r=new Int32Array(t);Fi(e,t,r);for(let i=0;i<t;i++)n[i]=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,r[i]),e.offset+=r[i]}function zi(e,t,n){let r=new Int32Array(t);Fi(e,t,r);let i=new Int32Array(t);Fi(e,t,i);for(let a=0;a<t;a++){let t=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,i[a]);r[a]?(n[a]=new Uint8Array(r[a]+i[a]),n[a].set(n[a-1].subarray(0,r[a])),n[a].set(t,r[a])):n[a]=t,e.offset+=i[a]}}function Bi(e,t,n,r){r===void 0&&(r=e.view.getUint32(e.offset,!0),e.offset+=4);let i=e.offset,a=0;for(;a<n.length;){let r=W(e);if(r&1)a=Hi(e,r,t,n,a);else{let i=r>>>1;Vi(e,i,t,n,a),a+=i}}e.offset=i+r}function Vi(e,t,n,r,i){let a=n+7>>3,o=0;for(let t=0;t<a;t++)o|=e.view.getUint8(e.offset++)<<(t<<3);for(let e=0;e<t;e++)r[i+e]=o}function Hi(e,t,n,r,i){let a=t>>1<<3,o=(1<<n)-1,s=0;if(e.offset<e.view.byteLength)s=e.view.getUint8(e.offset++);else if(o)throw Error(`parquet bitpack offset ${e.offset} out of range`);let c=8,l=0;for(;a;)l>8?(l-=8,c-=8,s>>>=8):c-l<n?(s|=e.view.getUint8(e.offset)<<c,e.offset++,c+=8):(i<r.length&&(r[i++]=s>>l&o),a--,l+=n);return i}function Ui(e,t,n,r){let i=Wi(n,r),a=new Uint8Array(t*i);for(let n=0;n<i;n++)for(let r=0;r<t;r++)a[r*i+n]=e.view.getUint8(e.offset++);if(n===`FLOAT`)return new Float32Array(a.buffer);if(n===`DOUBLE`)return new Float64Array(a.buffer);if(n===`INT32`)return new Int32Array(a.buffer);if(n===`INT64`)return new BigInt64Array(a.buffer);if(n===`FIXED_LEN_BYTE_ARRAY`){let e=Array(t);for(let n=0;n<t;n++)e[n]=a.subarray(n*i,(n+1)*i);return e}throw Error(`parquet byte_stream_split unsupported type: ${n}`)}function Wi(e,t){switch(e){case`INT32`:case`FLOAT`:return 4;case`INT64`:case`DOUBLE`:return 8;case`FIXED_LEN_BYTE_ARRAY`:if(!t)throw Error(`parquet byteWidth missing type_length`);return t;default:throw Error(`parquet unsupported type: ${e}`)}}function Gi(e,t,n,r){if(n===0)return[];if(t===`BOOLEAN`)return Ki(e,n);if(t===`INT32`)return qi(e,n);if(t===`INT64`)return Ji(e,n);if(t===`INT96`)return Yi(e,n);if(t===`FLOAT`)return Xi(e,n);if(t===`DOUBLE`)return Zi(e,n);if(t===`BYTE_ARRAY`)return Qi(e,n);if(t===`FIXED_LEN_BYTE_ARRAY`){if(!r)throw Error(`parquet missing fixed length`);return $i(e,n,r)}throw Error(`parquet unhandled type: ${t}`)}function Ki(e,t){let n=Array(t);for(let r=0;r<t;r++){let t=e.offset+(r/8|0),i=r%8,a=e.view.getUint8(t);n[r]=!!(a&1<<i)}return e.offset+=Math.ceil(t/8),n}function qi(e,t){let n=(e.view.byteOffset+e.offset)%4?new Int32Array(ea(e.view.buffer,e.view.byteOffset+e.offset,t*4)):new Int32Array(e.view.buffer,e.view.byteOffset+e.offset,t);return e.offset+=t*4,n}function Ji(e,t){let n=(e.view.byteOffset+e.offset)%8?new BigInt64Array(ea(e.view.buffer,e.view.byteOffset+e.offset,t*8)):new BigInt64Array(e.view.buffer,e.view.byteOffset+e.offset,t);return e.offset+=t*8,n}function Yi(e,t){let n=Array(t);for(let r=0;r<t;r++){let t=e.view.getBigInt64(e.offset+r*12,!0),i=e.view.getInt32(e.offset+r*12+8,!0);n[r]=BigInt(i)<<64n|t}return e.offset+=t*12,n}function Xi(e,t){let n=(e.view.byteOffset+e.offset)%4?new Float32Array(ea(e.view.buffer,e.view.byteOffset+e.offset,t*4)):new Float32Array(e.view.buffer,e.view.byteOffset+e.offset,t);return e.offset+=t*4,n}function Zi(e,t){let n=(e.view.byteOffset+e.offset)%8?new Float64Array(ea(e.view.buffer,e.view.byteOffset+e.offset,t*8)):new Float64Array(e.view.buffer,e.view.byteOffset+e.offset,t);return e.offset+=t*8,n}function Qi(e,t){let n=Array(t);for(let r=0;r<t;r++){let t=e.view.getUint32(e.offset,!0);e.offset+=4,n[r]=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,t),e.offset+=t}return n}function $i(e,t,n){let r=Array(t);for(let i=0;i<t;i++)r[i]=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,n),e.offset+=n;return r}function ea(e,t,n){let r=new ArrayBuffer(n);return new Uint8Array(r).set(new Uint8Array(e,t,n)),r}const ta=[0,255,65535,16777215,4294967295];function na(e,t,n,r,i){for(let a=0;a<i;a++)n[r+a]=e[t+a]}function ra(e,t){let n=e.byteLength,r=t.byteLength,i=0,a=0;for(;i<n;){let t=e[i];if(i++,t<128)break}if(r&&i>=n)throw Error(`invalid snappy length header`);for(;i<n;){let r=e[i],o=0;if(i++,i>=n)throw Error(`missing eof marker`);if(r&3){let s=0;switch(r&3){case 1:o=(r>>>2&7)+4,s=e[i]+(r>>>5<<8),i++;break;case 2:if(n<=i+1)throw Error(`snappy error end of input`);o=(r>>>2)+1,s=e[i]+(e[i+1]<<8),i+=2;break;case 3:if(n<=i+3)throw Error(`snappy error end of input`);o=(r>>>2)+1,s=e[i]+(e[i+1]<<8)+(e[i+2]<<16)+(e[i+3]<<24),i+=4}if(s===0||isNaN(s))throw Error(`invalid offset ${s} pos ${i} inputLength ${n}`);if(s>a)throw Error(`cannot copy from before start of buffer`);na(t,a-s,t,a,o),a+=o}else{let o=(r>>>2)+1;if(o>60){if(i+3>=n)throw Error(`snappy error literal pos + 3 >= inputLength`);let t=o-60;o=e[i]+(e[i+1]<<8)+(e[i+2]<<16)+(e[i+3]<<24),o=(o&ta[t])+1,i+=t}if(i+o>n)throw Error(`snappy error literal exceeds input length`);na(e,i,t,a,o),i+=o,a+=o}}if(a!==r)throw Error(`premature end of input`)}function ia(e,t,{type:n,element:r,schemaPath:i}){let a=new DataView(e.buffer,e.byteOffset,e.byteLength),o={view:a,offset:0},s,c=aa(o,t,i),{definitionLevels:l,numNulls:u}=oa(o,t,i),d=t.num_values-u;if(t.encoding===`PLAIN`)s=Gi(o,n,d,r.type_length);else if(t.encoding===`PLAIN_DICTIONARY`||t.encoding===`RLE_DICTIONARY`||t.encoding===`RLE`){let e=n===`BOOLEAN`?1:a.getUint8(o.offset++);e?(s=Array(d),n===`BOOLEAN`?(Bi(o,e,s),s=s.map(e=>!!e)):Bi(o,e,s,a.byteLength-o.offset)):s=new Uint8Array(d)}else if(t.encoding===`BYTE_STREAM_SPLIT`)s=Ui(o,d,n,r.type_length);else if(t.encoding===`DELTA_BINARY_PACKED`)s=n===`INT32`?new Int32Array(d):new BigInt64Array(d),Fi(o,d,s);else if(t.encoding===`DELTA_LENGTH_BYTE_ARRAY`)s=Array(d),Ri(o,d,s);else throw Error(`parquet unsupported encoding: ${t.encoding}`);return{definitionLevels:l,repetitionLevels:c,dataPage:s}}function aa(e,t,n){if(n.length>1){let r=ar(n);if(r){let n=Array(t.num_values);return Bi(e,da(r),n),n}}return[]}function oa(e,t,n){let r=or(n);if(!r)return{definitionLevels:[],numNulls:0};let i=Array(t.num_values);Bi(e,da(r),i);let a=t.num_values;for(let e of i)e===r&&a--;return a===0&&(i.length=0),{definitionLevels:i,numNulls:a}}function sa(e,t,n,r){let i,a=r?.[n];if(n===`UNCOMPRESSED`)i=e;else if(a)i=a(e,t);else if(n===`SNAPPY`)i=new Uint8Array(t),ra(e,i);else throw Error(`parquet unsupported compression codec: ${n}`);if(i?.length!==t)throw Error(`parquet decompressed page length ${i?.length} does not match header ${t}`);return i}function ca(e,t,n){let r={view:new DataView(e.buffer,e.byteOffset,e.byteLength),offset:0},{type:i,element:a,schemaPath:o,codec:s,compressors:c}=n,l=t.data_page_header_v2;if(!l)throw Error(`parquet data page header v2 is undefined`);let u=la(r,l,o);r.offset=l.repetition_levels_byte_length;let d=ua(r,l,o),f=t.uncompressed_page_size-l.definition_levels_byte_length-l.repetition_levels_byte_length,p=e.subarray(r.offset);l.is_compressed!==!1&&(p=sa(p,f,s,c));let m=new DataView(p.buffer,p.byteOffset,p.byteLength),h={view:m,offset:0},g,_=l.num_values-l.num_nulls;if(l.encoding===`PLAIN`)g=Gi(h,i,_,a.type_length);else if(l.encoding===`RLE`)g=Array(_),Bi(h,1,g),g=g.map(e=>!!e);else if(l.encoding===`PLAIN_DICTIONARY`||l.encoding===`RLE_DICTIONARY`){let e=m.getUint8(h.offset++);g=Array(_),Bi(h,e,g,f-1)}else if(l.encoding===`DELTA_BINARY_PACKED`)g=i===`INT32`?new Int32Array(_):new BigInt64Array(_),Fi(h,_,g);else if(l.encoding===`DELTA_LENGTH_BYTE_ARRAY`)g=Array(_),Ri(h,_,g);else if(l.encoding===`DELTA_BYTE_ARRAY`)g=Array(_),zi(h,_,g);else if(l.encoding===`BYTE_STREAM_SPLIT`)g=Ui(h,_,i,a.type_length);else throw Error(`parquet unsupported encoding: ${l.encoding}`);return{definitionLevels:d,repetitionLevels:u,dataPage:g}}function la(e,t,n){let r=ar(n);if(!r)return[];let i=Array(t.num_values);return Bi(e,da(r),i,t.repetition_levels_byte_length),i}function ua(e,t,n){let r=or(n);if(r){let n=Array(t.num_values);return Bi(e,da(r),n,t.definition_levels_byte_length),n}}function da(e){return 32-Math.clz32(e)}function fa(e,{groupStart:t,selectStart:n,selectEnd:r},i,a){let{pathInSchema:o,schemaPath:s}=i,c=lr(s),l=[],u,d,f=0,p=0,m=a&&(()=>{d&&a({pathInSchema:o,columnData:d,rowStart:t+f-d.length,rowEnd:t+f})});for(;(c?f<r:e.offset<e.view.byteLength-1)&&!(e.offset>=e.view.byteLength-1);){let t=ma(e);if(t.type===`DICTIONARY_PAGE`){let{data:n}=pa(e,t,i,u,void 0,0);n&&(u=Qn(n,i))}else{let r=d?.length||0,a=pa(e,t,i,u,d,n-f);a.skipped?(l.length||(p+=a.skipped),f+=a.skipped):a.data&&d===a.data?f+=a.data.length-r:a.data&&a.data.length&&(m?.(),l.push(a.data),f+=a.data.length,d=a.data)}}return m?.(),{data:l,skipped:p}}function pa(e,t,n,r,i,a){let{type:o,element:s,schemaPath:c,codec:l,compressors:u}=n,d=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,t.compressed_page_size);if(e.offset+=t.compressed_page_size,t.type===`DATA_PAGE`){let e=t.data_page_header;if(!e)throw Error(`parquet data page header is undefined`);if(a>e.num_values&&lr(c))return{skipped:e.num_values};let{definitionLevels:o,repetitionLevels:s,dataPage:f}=ia(sa(d,Number(t.uncompressed_page_size),l,u),e,n),p=Zn(f,r,e.encoding,n);return{skipped:0,data:Ai(Array.isArray(i)?i:[],o,s,p,c)}}if(t.type===`DATA_PAGE_V2`){let e=t.data_page_header_v2;if(!e)throw Error(`parquet data page header v2 is undefined`);if(a>e.num_rows)return{skipped:e.num_values};let{definitionLevels:o,repetitionLevels:s,dataPage:l}=ca(d,t,n),u=Zn(l,r,e.encoding,n);return{skipped:0,data:Ai(Array.isArray(i)?i:[],o,s,u,c)}}if(t.type===`DICTIONARY_PAGE`){let e=t.dictionary_page_header;if(!e)throw Error(`parquet dictionary page header is undefined`);let n=sa(d,Number(t.uncompressed_page_size),l,u);return{skipped:0,data:Gi({view:new DataView(n.buffer,n.byteOffset,n.byteLength),offset:0},o,e.num_values,s.type_length)}}throw Error(`parquet unsupported page type: ${t.type}`)}function ma(e){let t=ur(e);return{type:Vn[t.field_1],uncompressed_page_size:t.field_2,compressed_page_size:t.field_3,crc:t.field_4,data_page_header:t.field_5&&{num_values:t.field_5.field_1,encoding:Ln[t.field_5.field_2],definition_level_encoding:Ln[t.field_5.field_3],repetition_level_encoding:Ln[t.field_5.field_4],statistics:t.field_5.field_5&&{max:t.field_5.field_5.field_1,min:t.field_5.field_5.field_2,null_count:t.field_5.field_5.field_3,distinct_count:t.field_5.field_5.field_4,max_value:t.field_5.field_5.field_5,min_value:t.field_5.field_5.field_6}},index_page_header:t.field_6,dictionary_page_header:t.field_7&&{num_values:t.field_7.field_1,encoding:Ln[t.field_7.field_2],is_sorted:t.field_7.field_3},data_page_header_v2:t.field_8&&{num_values:t.field_8.field_1,num_nulls:t.field_8.field_2,num_rows:t.field_8.field_3,encoding:Ln[t.field_8.field_4],definition_levels_byte_length:t.field_8.field_5,repetition_levels_byte_length:t.field_8.field_6,is_compressed:t.field_8.field_7===void 0||t.field_8.field_7,statistics:t.field_8.field_8}}}function ha(e,{metadata:t},n){let r=[];for(let i of n.chunks){let{path_in_schema:a}=i.columnMetadata,o=rr(t.schema,a),s={pathInSchema:a,element:o[o.length-1].element,schemaPath:o,...e,...i.columnMetadata,parsers:{...Xn,...e.parsers}},{startByte:c,endByte:l}=i.range;`pageLocations`in i?r.push({pathInSchema:a,data:ga(e,n,i,i.pageLocations,s)}):`offsetIndex`in i?r.push({pathInSchema:a,data:Promise.resolve(e.file.slice(i.offsetIndex.startByte,i.offsetIndex.endByte)).then(t=>{let r=Tr({view:new DataView(t),offset:0}).page_locations;return ga(e,n,i,r,s)})}):r.push({pathInSchema:a,data:Promise.resolve(e.file.slice(c,l)).then(t=>fa({view:new DataView(t),offset:0},n,s,e.onPage))})}return{groupStart:n.groupStart,groupRows:n.groupRows,selectStart:n.selectStart,selectEnd:n.selectEnd,asyncColumns:r}}async function ga(e,t,n,r,i){let{data_page_offset:a,dictionary_page_offset:o}=n.columnMetadata,{selectStart:s,selectEnd:c}=t,{startByte:l,endByte:u}=n.range,d=-1,f=o||a<r[0].offset;for(let e=0;e<r.length;e++){let n=r[e],i=Number(n.first_row_index),a=e+1<r.length?Number(r[e+1].first_row_index):t.groupRows;d<0&&a>s&&(l=Number(n.offset),d=i),i<c&&(u=Number(n.offset)+n.compressed_page_size)}d<0&&(d=0);let p;if(f&&d){let t=Number(r[0].offset)-n.range.startByte,[i,a]=await Promise.all([e.file.slice(n.range.startByte,Number(r[0].offset)),e.file.slice(l,u)]),o=new Uint8Array(t+a.byteLength);o.set(new Uint8Array(i,0,t)),o.set(new Uint8Array(a),t),p=new DataView(o.buffer)}else p=f?new DataView(await e.file.slice(n.range.startByte,u)):new DataView(await e.file.slice(l,u));let{data:m,skipped:h}=fa({view:p,offset:0},d?{...t,groupStart:t.groupStart+d,selectStart:t.selectStart-d,selectEnd:t.selectEnd-d}:t,i,e.onPage);return{data:m,skipped:d+h}}async function _a({asyncColumns:e},t,n,r,i){let a=await Promise.all(e.map(e=>e.data.then(({skipped:e,data:t})=>({skipped:e,data:Gr(t)})))),o=n-t;if(i===`object`){let n=Array(o);for(let r=0;r<o;r++){let i={};for(let n=0;n<e.length;n++){let{data:o,skipped:s}=a[n];i[e[n].pathInSchema[0]]=o[t+r-s]}n[r]=i}return n}let s=e.map(e=>e.pathInSchema[0]).filter(e=>!r||r.includes(e)),c=r??s,l=c.map(t=>e.findIndex(e=>e.pathInSchema[0]===t)),u=Array(o);for(let n=0;n<o;n++){let r=Array(e.length);for(let e=0;e<c.length;e++){let i=l[e];if(i<0)throw Error(`parquet column not found: ${c[e]}`);let{data:o,skipped:s}=a[i];r[e]=o[t+n-s]}u[n]=r}return u}function va(e,t,n){let{asyncColumns:r}=e,i={...Xn,...n},a=[];for(let n of t.children)if(n.children.length){let t=r.filter(e=>e.pathInSchema[0]===n.element.name);if(!t.length)continue;a.push({pathInSchema:n.path,data:(async()=>{let r=await Promise.all(t.map(e=>e.data)),a=/* @__PURE__ */ new Map,o=r.map(({data:e})=>Gr(e)),s=Math.max(e.selectStart??0,...r.map(e=>e.skipped)),c=Math.min(e.selectEnd??1/0,...r.map((e,t)=>e.skipped+o[t].length));for(let e=0;e<t.length;e++){let n=s-r[e].skipped,i=Math.max(0,c-s);a.set(t[e].pathInSchema.join(`.`),o[e].slice(n,n+i))}ji(a,n,i);let l=a.get(n.element.name);if(!l)throw Error(`parquet column data not assembled`);return{data:[l],skipped:s}})()})}else{let e=r.find(e=>e.pathInSchema[0]===n.element.name);e&&a.push(e)}return{...e,asyncColumns:a}}async function ya(e){let t=await ba(e);return{options:t,plan:si(t)}}async function ba(e){let t=e.metadata??await _r(e.file,e),n=yr(t).children.map(e=>e.element.name),r=Jr(e.filter).filter(e=>!n.includes(e));if(r.length)throw Error(`parquet filter columns not found: ${r.join(`, `)}`);if(e.columns){let t=e.columns.filter(e=>!n.includes(e));if(t.length)throw Error(`parquet column not found: ${t[0]}`)}let i={...e,metadata:t};return i=await Sa(i),i=await Ca(i),i}function xa(e,t){let n={...e,file:gi(e.file,t)};return t.groups.map(e=>ha(n,t,e))}async function Sa(e){if(!e.useBloomFilters||!e.filter||!e.metadata)return e;let t=yr(e.metadata),n={};for(let e of t.children)n[e.element.name]=e.element;let r=await fi({file:e.file,metadata:e.metadata,filter:e.filter,filterStrict:e.filterStrict});return{...e,bloomFiltersByGroup:r,schemaElements:n}}async function Ca(e){if(!e.usePageIndex||!e.filter||!e.metadata)return e;let{pageRangesByGroup:t,pageLocationsByGroup:n}=await pi({file:e.file,metadata:e.metadata,filter:e.filter,filterStrict:e.filterStrict,rowStart:e.rowStart,rowEnd:e.rowEnd,columns:e.columns,bloomFiltersByGroup:e.bloomFiltersByGroup,schemaElements:e.schemaElements,parsers:e.parsers});return{...e,pageRangesByGroup:t,pageLocationsByGroup:n}}const wa=Symbol(`rowIndex`);async function Ta(e){e.metadata??=await _r(e.file,e);let{rowStart:t=0,rowEnd:n,columns:r,onChunk:i,onComplete:a,rowFormat:o,filter:s,filterStrict:c=!0}=e;if(s&&o!==`object`)throw Error(`parquet filter requires rowFormat: \"object\"`);if(e.includeRowIndex&&o!==`object`)throw Error(`parquet includeRowIndex requires rowFormat: \"object\"`);let l=Jr(s),u=r;if(r&&l.length){let e=new Set(r),t=l.filter(t=>!e.has(t));t.length&&(u=[...r,...t])}let d=await ya(u===r?e:{...e,columns:u}),f=d.options,p=u!==r,m=xa(f,d.plan);if(!a&&!i){await Ea(m);return}if(!f.metadata)throw Error(`parquet requires metadata`);let h=yr(f.metadata),g=m.map(t=>va(t,h,e.parsers));if(i)for(let e of g)for(let t of e.asyncColumns)t.data.then(({data:n,skipped:r})=>{let a=e.groupStart+r;for(let e of n)i({columnName:t.pathInSchema[0],columnData:e,rowStart:a,rowEnd:a+e.length}),a+=e.length},()=>{});if(a){await Ea(g);let i=[];for(let a of g){let d=a.selectStart??Math.max(t-a.groupStart,0),f=a.selectEnd??Math.min((n??1/0)-a.groupStart,a.groupRows),m=o===`object`?await _a(a,d,f,u,`object`):await _a(a,d,f,r,`array`);if(e.includeRowIndex)for(let e=0;e<m.length;e++)Object.defineProperty(m[e],wa,{value:a.groupStart+d+e});if(s){for(let e of m)if(Yr(e,s,c)){if(p&&r)for(let t of l)r.includes(t)||delete e[t];i.push(e)}}else Wr(i,m)}a(i)}else await Ea(g)}async function Ea(e){let t=e.flatMap(e=>e.asyncColumns.map(e=>e.data)),n=(await Promise.allSettled(t)).find(e=>e.status===`rejected`);if(n)throw n.reason}var Da=ArrayBuffer,J=Uint8Array,Oa=Uint16Array,ka=Int16Array,Aa=Int32Array,ja=function(e,t,n){if(J.prototype.slice)return J.prototype.slice.call(e,t,n);(t==null||t<0)&&(t=0),(n==null||n>e.length)&&(n=e.length);var r=new J(n-t);return r.set(e.subarray(t,n)),r},Ma=function(e,t,n,r){if(J.prototype.fill)return J.prototype.fill.call(e,t,n,r);for((n==null||n<0)&&(n=0),(r==null||r>e.length)&&(r=e.length);n<r;++n)e[n]=t;return e},Na=function(e,t,n,r){if(J.prototype.copyWithin)return J.prototype.copyWithin.call(e,t,n,r);for((n==null||n<0)&&(n=0),(r==null||r>e.length)&&(r=e.length);n<r;)e[t++]=e[n++]},Pa=[`invalid zstd data`,`window size too large (>2046MB)`,`invalid block type`,`FSE accuracy too high`,`match distance too far back`,`unexpected EOF`],Y=function(e,t,n){var r=Error(t||Pa[e]);if(r.code=e,Error.captureStackTrace&&Error.captureStackTrace(r,Y),!n)throw r;return r},Fa=function(e,t,n){for(var r=0,i=0;r<n;++r)i|=e[t++]<<(r<<3);return i},Ia=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},La=function(e,t){var n=e[0]|e[1]<<8|e[2]<<16;if(n==3126568&&e[3]==253){var r=e[4],i=r>>5&1,a=r>>2&1,o=r&3,s=r>>6;r&8&&Y(0);var c=6-i,l=o==3?4:o,u=Fa(e,c,l);c+=l;var d=s?1<<s:i,f=Fa(e,c,d)+(s==1&&256),p=f;if(!i){var m=1<<10+(e[5]>>3);p=m+(m>>3)*(e[5]&7)}p>2145386496&&Y(1);var h=new J((t==1?f||p:t?0:p)+12);return h[0]=1,h[4]=4,h[8]=8,{b:c+d,y:0,l:0,d:u,w:t&&t!=1?t:h.subarray(12),e:p,o:new Aa(h.buffer,0,3),u:f,c:a,m:Math.min(131072,p)}}if((n>>4|e[3]<<20)==25481893)return Ia(e,4)+8;Y(0)},Ra=function(e){for(var t=0;1<<t<=e;++t);return t-1},za=function(e,t,n){var r=(t<<3)+4,i=(e[t]&15)+5;i>n&&Y(3);for(var a=1<<i,o=a,s=-1,c=-1,l=-1,u=a,d=new Da(512+(a<<2)),f=new ka(d,0,256),p=new Oa(d,0,256),m=new Oa(d,512,a),h=512+(a<<1),g=new J(d,h,a),_=new J(d,h+a);s<255&&o>0;){var v=Ra(o+1),y=r>>3,b=(1<<v+1)-1,x=(e[y]|e[y+1]<<8|e[y+2]<<16)>>(r&7)&b,S=(1<<v)-1,C=b-o-1,w=x&S;if(w<C?(r+=v,x=w):(r+=v+1,x>S&&(x-=C)),f[++s]=--x,x==-1?(o+=x,g[--u]=s):o-=x,!x)do{var T=r>>3;c=(e[T]|e[T+1]<<8)>>(r&7)&3,r+=2,s+=c}while(c==3)}(s>255||o)&&Y(0);for(var E=0,D=(a>>1)+(a>>3)+3,O=a-1,k=0;k<=s;++k){var A=f[k];if(A<1)p[k]=-A;else for(l=0;l<A;++l){g[E]=k;do E=E+D&O;while(E>=u)}}for(E&&Y(0),l=0;l<a;++l){var j=p[g[l]]++,M=_[l]=i-Ra(j);m[l]=(j<<M)-a}return[r+7>>3,{b:i,s:g,n:_,t:m}]},Ba=function(e,t){var n=0,r=-1,i=new J(292),a=e[t],o=i.subarray(0,256),s=i.subarray(256,268),c=new Oa(i.buffer,268);if(a<128){var l=za(e,t+1,6),u=l[0],d=l[1];t+=a;var f=u<<3,p=e[t];p||Y(0);for(var m=0,h=0,g=d.b,_=g,v=(++t<<3)-8+Ra(p);v-=g,!(v<f);){var y=v>>3;if(m+=(e[y]|e[y+1]<<8)>>(v&7)&(1<<g)-1,o[++r]=d.s[m],v-=_,v<f)break;y=v>>3,h+=(e[y]|e[y+1]<<8)>>(v&7)&(1<<_)-1,o[++r]=d.s[h],g=d.n[m],m=d.t[m],_=d.n[h],h=d.t[h]}++r>255&&Y(0)}else{for(r=a-127;n<r;n+=2){var b=e[++t];o[n]=b>>4,o[n+1]=b&15}++t}var x=0;for(n=0;n<r;++n){var S=o[n];S>11&&Y(0),x+=S&&1<<S-1}var C=Ra(x)+1,w=1<<C,T=w-x;for(T&T-1&&Y(0),o[r++]=Ra(T)+1,n=0;n<r;++n){var S=o[n];++s[o[n]=S&&C+1-S]}var E=new J(w<<1),D=E.subarray(0,w),O=E.subarray(w);for(c[C]=0,n=C;n>0;--n){var k=c[n];Ma(O,n,k,c[n-1]=k+s[n]*(1<<C-n))}for(c[0]!=w&&Y(0),n=0;n<r;++n){var A=o[n];if(A){var j=c[A];Ma(D,n,j,c[A]=j+(1<<C-A))}}return[t,{n:O,b:C,s:D}]},Va=(/*#__PURE__*/ za(/*#__PURE__*/ new J([81,16,99,140,49,198,24,99,12,33,196,24,99,102,102,134,70,146,4]),0,6))[1],Ha=(/*#__PURE__*/ za(/*#__PURE__*/ new J([33,20,196,24,99,140,33,132,16,66,8,33,132,16,66,8,33,68,68,68,68,68,68,68,68,36,9]),0,6))[1],Ua=(/*#__PURE__ */ za(/*#__PURE__*/ new J([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5))[1],Wa=function(e,t){for(var n=e.length,r=new Aa(n),i=0;i<n;++i)r[i]=t,t+=1<<e[i];return r},Ga=/*#__PURE__ */ new J((/*#__PURE__ */ new Aa([0,0,0,0,16843009,50528770,134678020,202050057,269422093])).buffer,0,36),Ka=/*#__PURE__ */ Wa(Ga,0),qa=/*#__PURE__ */ new J((/*#__PURE__ */ new Aa([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16])).buffer,0,53),Ja=/*#__PURE__ */ Wa(qa,3),Ya=function(e,t,n){var r=e.length,i=t.length,a=e[r-1],o=(1<<n.b)-1,s=-n.b;a||Y(0);for(var c=0,l=n.b,u=(r<<3)-8+Ra(a)-l,d=-1;u>s&&d<i;){var f=u>>3,p=(e[f]|e[f+1]<<8|e[f+2]<<16)>>(u&7);c=(c<<l|p)&o,t[++d]=n.s[c],u-=l=n.n[c]}(u!=s||d+1!=i)&&Y(0)},Xa=function(e,t,n){var r=6,i=t.length+3>>2,a=i<<1,o=i+a;Ya(e.subarray(r,r+=e[0]|e[1]<<8),t.subarray(0,i),n),Ya(e.subarray(r,r+=e[2]|e[3]<<8),t.subarray(i,a),n),Ya(e.subarray(r,r+=e[4]|e[5]<<8),t.subarray(a,o),n),Ya(e.subarray(r),t.subarray(o),n)},Za=function(e,t,n){var r,i=t.b,a=e[i],o=a>>1&3;t.l=a&1;var s=a>>3|e[i+1]<<5|e[i+2]<<13,c=(i+=3)+s;if(o==1)return i>=e.length?void 0:(t.b=i+1,n?(Ma(n,e[i],t.y,t.y+=s),n):Ma(new J(s),e[i]));if(!(c>e.length)){if(o==0)return t.b=c,n?(n.set(e.subarray(i,c),t.y),t.y+=s,n):ja(e,i,c);if(o==2){var l=e[i],u=l&3,d=l>>2&3,f=l>>4,p=0,m=0;u<2?d&1?f|=e[++i]<<4|(d&2&&e[++i]<<12):f=l>>3:(m=d,d<2?(f|=(e[++i]&63)<<4,p=e[i]>>6|e[++i]<<2):d==2?(f|=e[++i]<<4|(e[++i]&3)<<12,p=e[i]>>2|e[++i]<<6):(f|=e[++i]<<4|(e[++i]&63)<<12,p=e[i]>>6|e[++i]<<2|e[++i]<<10)),++i;var h=n?n.subarray(t.y,t.y+t.m):new J(t.m),g=h.length-f;if(u==0)h.set(e.subarray(i,i+=f),g);else if(u==1)Ma(h,e[i++],g);else{var _=t.h;if(u==2){var v=Ba(e,i);p+=i-(i=v[0]),t.h=_=v[1]}else _||Y(0);(m?Xa:Ya)(e.subarray(i,i+=p),h.subarray(g),_)}var y=e[i++];if(y){y==255?y=(e[i++]|e[i++]<<8)+32512:y>127&&(y=y-128<<8|e[i++]);var b=e[i++];b&3&&Y(0);for(var x=[Ha,Ua,Va],S=2;S>-1;--S){var C=b>>(S<<1)+2&3;if(C==1){var w=new J([0,0,e[i++]]);x[S]={s:w.subarray(2,3),n:w.subarray(0,1),t:new Oa(w.buffer,0,1),b:0}}else C==2?(r=za(e,i,9-(S&1)),i=r[0],x[S]=r[1]):C==3&&(t.t||Y(0),x[S]=t.t[S])}var T=t.t=x,E=T[0],D=T[1],O=T[2],k=e[c-1];k||Y(0);var A=(c<<3)-8+Ra(k)-O.b,j=A>>3,M=0,N=(e[j]|e[j+1]<<8)>>(A&7)&(1<<O.b)-1;j=(A-=D.b)>>3;var ee=(e[j]|e[j+1]<<8)>>(A&7)&(1<<D.b)-1;j=(A-=E.b)>>3;var P=(e[j]|e[j+1]<<8)>>(A&7)&(1<<E.b)-1;for(++y;--y;){var te=O.s[N],F=O.n[N],ne=E.s[P],re=E.n[P],I=D.s[ee],ie=D.n[ee];j=(A-=I)>>3;var ae=1<<I,L=ae+((e[j]|e[j+1]<<8|e[j+2]<<16|e[j+3]<<24)>>>(A&7)&ae-1);j=(A-=qa[ne])>>3;var R=Ja[ne]+((e[j]|e[j+1]<<8|e[j+2]<<16)>>(A&7)&(1<<qa[ne])-1);j=(A-=Ga[te])>>3;var oe=Ka[te]+((e[j]|e[j+1]<<8|e[j+2]<<16)>>(A&7)&(1<<Ga[te])-1);if(j=(A-=F)>>3,N=O.t[N]+((e[j]|e[j+1]<<8)>>(A&7)&(1<<F)-1),j=(A-=re)>>3,P=E.t[P]+((e[j]|e[j+1]<<8)>>(A&7)&(1<<re)-1),j=(A-=ie)>>3,ee=D.t[ee]+((e[j]|e[j+1]<<8)>>(A&7)&(1<<ie)-1),L>3)t.o[2]=t.o[1],t.o[1]=t.o[0],t.o[0]=L-=3;else{var se=L-(oe!=0);se?(L=se==3?t.o[0]-1:t.o[se],se>1&&(t.o[2]=t.o[1]),t.o[1]=t.o[0],t.o[0]=L):L=t.o[0]}for(var S=0;S<oe;++S)h[M+S]=h[g+S];M+=oe,g+=oe;var ce=M-L;if(ce<0){var le=-ce,ue=t.e+ce;le>R&&(le=R);for(var S=0;S<le;++S)h[M+S]=t.w[ue+S];M+=le,R-=le,ce=0}for(var S=0;S<R;++S)h[M+S]=h[ce+S];M+=R}if(M!=g)for(;g<h.length;)h[M++]=h[g++];else M=h.length;n?t.y+=M:h=ja(h,0,M)}else if(n){if(t.y+=f,g)for(var S=0;S<f;++S)h[S]=h[g+S]}else g&&(h=ja(h,g));return t.b=c,h}Y(2)}},Qa=function(e,t){if(e.length==1)return e[0];for(var n=new J(t),r=0,i=0;r<e.length;++r){var a=e[r];n.set(a,i),i+=a.length}return n};function $a(e,t){for(var n=[],r=+!t,i=0,a=0;e.length;){var o=La(e,r||t);if(typeof o==`object`){for(r?(t=null,o.w.length==o.u&&(n.push(t=o.w),a+=o.u)):(n.push(t),o.e=0);!o.l;){var s=Za(e,o,t);s||Y(5),t?o.e=o.y:(n.push(s),a+=s.length,Na(o.w,0,s.length),o.w.set(s,o.w.length-s.length))}i=o.b+o.c*4}else i=o;e=e.subarray(i)}return Qa(n,a)}function eo(){let e=to();return(t,n)=>{let{memory:r,uncompress:i}=e.exports,a=68e3,o=a+t.byteLength,s=a+t.byteLength+n;if(r.buffer.byteLength<s){let e=65536,t=r.buffer.byteLength/e,n=Math.ceil(s/e)-t;r.grow(n)}let c=new Uint8Array(r.buffer);c.set(t,a);let l=i(a,t.byteLength,o);if(l===-1)throw Error(`invalid snappy length header`);if(l===-2)throw Error(`missing eof marker`);if(l===-3)throw Error(`premature end of input`);if(l)throw Error(`failed to uncompress data ${l}`);return c.slice(o,o+n)}}function to(){let e=atob(no),t=new Uint8Array(e.length);for(let n=0;n<e.length;n+=1)t[n]=e.charCodeAt(n);let n=new WebAssembly.Module(t);return new WebAssembly.Instance(n)}const no=`AGFzbQEAAAABEANgAABgA39/fwF/YAF/AX8DBgUAAQEBAgUDAQACBj8KfwFBoIwEC38AQYAIC38AQaAMC38AQaAMC38AQaCMBAt/AEGACAt/AEGgjAQLfwBBgIAIC38AQQALfwBBAQsHwQEOBm1lbW9yeQIAEV9fd2FzbV9jYWxsX2N0b3JzAAAGbWVtY3B5AAEHbWVtbW92ZQACCnVuY29tcHJlc3MAAwxfX2Rzb19oYW5kbGUDAQpfX2RhdGFfZW5kAwILX19zdGFja19sb3cDAwxfX3N0YWNrX2hpZ2gDBA1fX2dsb2JhbF9iYXNlAwULX19oZWFwX2Jhc2UDBgpfX2hlYXBfZW5kAwcNX19tZW1vcnlfYmFzZQMIDF9fdGFibGVfYmFzZQMJCuASBQIAC8sBAQN/AkAgAkUNAAJAAkAgAkEHcSIDDQAgACEEIAIhBQwBCyAAIQQgAiEFA0AgBCABLQAAOgAAIARBAWohBCABQQFqIQEgBUF/aiEFIANBf2oiAw0ACwsgAkEISQ0AA0AgBCABLQAAOgAAIAQgAS0AAToAASAEIAEtAAI6AAIgBCABLQADOgADIAQgAS0ABDoABCAEIAEtAAU6AAUgBCABLQAGOgAGIAQgAS0ABzoAByAEQQhqIQQgAUEIaiEBIAVBeGoiBQ0ACwsgAAugAwEEfwJAIAAgAUYNAAJAAkAgACABSQ0AIAEgAmoiAyAASw0BCyACRQ0BAkACQCACQQdxIgMNACAAIQQgAiEFDAELIAAhBCACIQUDQCAEIAEtAAA6AAAgBEEBaiEEIAFBAWohASAFQX9qIQUgA0F/aiIDDQALCyACQQhJDQEDQCAEIAEtAAA6AAAgBCABLQABOgABIAQgAS0AAjoAAiAEIAEtAAM6AAMgBCABLQAEOgAEIAQgAS0ABToABSAEIAEtAAY6AAYgBCABLQAHOgAHIARBCGohBCABQQhqIQEgBUF4aiIFDQAMAgsLIAJFDQACQAJAIAJBA3EiBA0AIAAgAmohBiACIQUMAQsgAiEFA0AgBUF/aiIFIABqIgYgBSABaiIDLQAAOgAAIARBf2oiBA0ACwsgAkEESQ0AIAZBfGohASADQXxqIQQDQCABQQNqIARBA2otAAA6AAAgAUECaiAEQQJqLQAAOgAAIAFBAWogBEEBai0AADoAACABIAQtAAA6AAAgAUF8aiEBIARBfGohBCAFQXxqIgUNAAsLIAALswoBCX8jgICAgABBIGsiAySAgICAACADQQlqQgA3AAAgA0IANwIEIAMgA0EYajYCAEF/IQQCQCABRQ0AIAMgAUF/aiIFNgIcIAMgAEEBajYCGCAALAAAIgZB/wBxIQcCQCAGQX9KDQAgBUUNASADIAFBfmoiBTYCHCADIABBAmo2AhggACwAASIGQf8AcUEHdCAHciEHQX8hBCAGQX9KDQAgBUUNASADIAFBfWoiBTYCHCADIABBA2o2AhggACwAAiIGQf8AcUEOdCAHciEHQX8hBCAGQX9KDQAgBUUNASADIAFBfGoiBTYCHCADIABBBGo2AhggACwAAyIGQf8AcUEVdCAHciEHQX8hBCAGQX9KDQAgBUUNASADIAFBe2o2AhwgAyAAQQVqNgIYIAAsAAQiAUEASA0BIAFBHHQgB3IhBwsgAiAHaiEIAkACQCADEISAgIAADQAgAiEADAELIAMoAgQhASACIQADQAJAIAMoAgggAWtBBEoNACADIAE2AgQgAxCEgICAAEUNAiADKAIEIQELIAFBAWohBQJAAkAgAS0AACIGQQNxDQAgCCAAayEJIAMoAggiCiAFayEEIAZBAnYiC0EBaiEHAkAgBkE/Sw0AIARBEEkNACAJQRBIDQAgACABKAIBNgIAIAAgASgCBTYCBCAAIAEoAgk2AgggACABKAINNgIMIAAgB2ohACADKAIIIAUgB2oiAWtBBEoNAyADIAE2AgQgAxCEgICAAEUNBAwCCwJAAkAgBkHwAU8NACAFIQYMAQsgCiAFIAtBRWoiAWoiBmshBCABQQJ0QYCIgIAAaigCACAFKAIAcUEBaiEHCwJAIAcgBE0NAANAIAggAGsgBEkNBSAAIAYgBBCBgICAACEAIAMoAgAiASABKAIAIgkgAygCDCIFaiIGNgIAIAFBBGoiASABKAIAIgogBWsiATYCACADIAE2AgwgACAEaiEAIAFFDQUgAyAJIApqNgIIIAcgBGshByABIQQgByABSw0ACyAIIABrIQkLIAkgB0kNAyAAIAYgBxCBgICAACAHaiEAIAMoAgggBiAHaiIBa0EESg0CIAMgATYCBCADEISAgIAADQEMAwsgACACayAGQQF0QaCIgIAAai8BACIBQQt2IgpBAnRBgIiAgABq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`,ro=4096,io=2*ro-1,ao=new Uint32Array([0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535,131071,262143,524287,1048575,2097151,4194303,8388607,16777215]);var oo=class{constructor(e){this.buf_=/* @__PURE__ */ new Uint8Array(8224),this.input_=e,this.buf_ptr_=0,this.val_=0,this.pos_=0,this.bit_pos_=0,this.bit_end_pos_=0,this.eos_=0,this.reset()}static READ_SIZE=ro;static IBUF_MASK=io;reset(){this.buf_ptr_=0,this.val_=0,this.pos_=0,this.bit_pos_=0,this.bit_end_pos_=0,this.eos_=0,this.readMoreInput();for(let e=0;e<4;e++)this.val_|=this.buf_[this.pos_]<<8*e,this.pos_++;return this.bit_end_pos_>0}readMoreInput(){if(!(this.bit_end_pos_>256)){if(this.eos_){if(this.bit_pos_>this.bit_end_pos_)throw Error(`Unexpected end of input `+this.bit_pos_+` `+this.bit_end_pos_)}else{let e=this.buf_ptr_,t=this.input_.read(this.buf_,e,ro);if(t<0)throw Error(`Unexpected end of input`);if(t<ro){this.eos_=1;for(let n=0;n<32;n++)this.buf_[e+t+n]=0}if(e===0){for(let e=0;e<32;e++)this.buf_[8192+e]=this.buf_[e];this.buf_ptr_=ro}else this.buf_ptr_=0;this.bit_end_pos_+=t<<3}}}fillBitWindow(){for(;this.bit_pos_>=8;)this.val_>>>=8,this.val_|=this.buf_[this.pos_&io]<<24,this.pos_++,this.bit_pos_=this.bit_pos_-8>>>0,this.bit_end_pos_=this.bit_end_pos_-8>>>0}readBits(e){32-this.bit_pos_<e&&this.fillBitWindow();let t=this.val_>>>this.bit_pos_&ao[e];return this.bit_pos_+=e,t}};const so=new Uint8Array([1,2,3,4,0,5,17,6,16,7,8,9,10,11,12,13,14,15]),co=new Uint16Array([256,402,436,468,500,534,566,598,630,662,694,726,758,790,822,854,886,920,952,984,1016,1048,1080]);var X=class{constructor(e,t){this.bits=e,this.value=t}};function lo(e,t){let n=1<<t-1;for(;e&n;)n>>=1;return(e&n-1)+n}function uo(e,t,n,r,i){do r-=n,e[t+r]=new X(i.bits,i.value);while(r>0)}function fo(e,t,n){let r=1<<t-n;for(;t<15&&(r-=e[t],!(r<=0));)++t,r<<=1;return t-n}function po(e,t,n,r,i){let a=t,o=/* @__PURE__ */ new Int32Array(16),s=/* @__PURE__ */ new Int32Array(16),c=new Int32Array(i);for(let e=0;e<i;e++)o[r[e]]++;s[1]=0;for(let e=1;e<15;e++)s[e+1]=s[e]+o[e];for(let e=0;e<i;e++)r[e]!==0&&(c[s[r[e]]++]=e);let l=n,u=1<<l,d=u;if(s[15]===1){for(let n=0;n<d;++n)e[t+n]=new X(0,c[0]&65535);return d}let f=0,p=0;for(let r=1,i=2;r<=n;++r,i<<=1)for(;o[r]>0;--o[r]){let n=new X(r&255,c[p++]&65535);uo(e,t+f,i,u,n),f=lo(f,r)}let m=d-1,h=-1;for(let r=n+1,i=2;r<=15;++r,i<<=1)for(;o[r]>0;--o[r]){(f&m)!==h&&(t+=u,l=fo(o,r,n),u=1<<l,d+=u,h=f&m,e[a+h]=new X(l+n&255,t-a-h&65535));let s=new X(r-n&255,c[p++]&65535);uo(e,t+(f>>n),i,u,s),f=lo(f,r)}return d}function mo(e,t,n,r){let i=new Uint8Array(e);r.readMoreInput();let a=r.readBits(2);if(a===1){let t=e-1,n=0,a=/* @__PURE__ */ new Int32Array(4),o=r.readBits(2)+1;for(;t;)t>>=1,n++;for(let t=0;t<o;t++)a[t]=r.readBits(n)%e,i[a[t]]=2;switch(i[a[0]]=1,o){case 1:break;case 3:if(a[0]===a[1]||a[0]===a[2]||a[1]===a[2])throw Error(`[ReadHuffmanCode] invalid symbols`);break;case 2:if(a[0]===a[1])throw Error(`[ReadHuffmanCode] invalid symbols`);i[a[1]]=1;break;case 4:if(a[0]===a[1]||a[0]===a[2]||a[0]===a[3]||a[1]===a[2]||a[1]===a[3]||a[2]===a[3])throw Error(`[ReadHuffmanCode] invalid symbols`);r.readBits(1)?(i[a[2]]=3,i[a[3]]=3):i[a[0]]=2}}else{let t=/* @__PURE__ */ new Uint8Array(18),n=32,o=0,s=[new X(2,0),new X(2,4),new X(2,3),new X(3,2),new X(2,0),new X(2,4),new X(2,3),new X(4,1),new X(2,0),new X(2,4),new X(2,3),new X(3,2),new X(2,0),new X(2,4),new X(2,3),new X(4,5)];for(let e=a;e<18&&n>0;e++){let i=so[e],a=0;r.fillBitWindow(),a+=r.val_>>>r.bit_pos_&15,r.bit_pos_+=s[a].bits;let c=s[a].value;t[i]=c,c!==0&&(n-=32>>c,o++)}if(o!==1&&n!==0)throw Error(`[ReadHuffmanCode] invalid num_codes or space`);go(t,e,i,r)}let o=po(t,n,8,i,e);if(!o)throw Error(`brotli BuildHuffmanTable failed`);return o}function ho(e,t,n){n.fillBitWindow(),t+=n.val_>>>n.bit_pos_&255;let r=e[t].bits-8;return r>0&&(n.bit_pos_+=8,t+=e[t].value,t+=n.val_>>>n.bit_pos_&(1<<r)-1),n.bit_pos_+=e[t].bits,e[t].value}function go(e,t,n,r){let i=0,a=8,o=0,s=0,c=32768,l=[];for(let e=0;e<32;e++)l.push(new X(0,0));for(po(l,0,5,e,18);i<t&&c>0;){let e=0;r.readMoreInput(),r.fillBitWindow(),e+=r.val_>>>r.bit_pos_&31,r.bit_pos_+=l[e].bits;let u=l[e].value&255;if(u<16)o=0,n[i++]=u,u!==0&&(a=u,c-=32768>>u);else{let e=u-14,l=0;u===16&&(l=a),s!==l&&(o=0,s=l);let d=o;o>0&&(o-=2,o<<=e),o+=r.readBits(e)+3;let f=o-d;if(i+f>t)throw Error(`[ReadHuffmanCodeLengths] symbol + repeat_delta > num_symbols`);for(let e=0;e<f;e++)n[i+e]=s;i+=f,s!==0&&(c-=f<<15-s)}}if(c!==0)throw Error(`[ReadHuffmanCodeLengths] space = `+c);for(;i<t;i++)n[i]=0}var _o=class{constructor(e,t){this.alphabet_size=e,this.num_htrees=t,this.codes=Array(t+t*co[e+31>>>5]),this.htrees=new Uint32Array(t)}decode(e){let t=0;for(let n=0;n<this.num_htrees;n++)this.htrees[n]=t,t+=mo(this.alphabet_size,this.codes,t,e)}};function vo([e,t]){return{offset:e,nbits:t}}const yo=[[1,2],[5,2],[9,2],[13,2],[17,3],[25,3],[33,3],[41,3],[49,4],[65,4],[81,4],[97,4],[113,5],[145,5],[177,5],[209,5],[241,6],[305,6],[369,7],[497,8],[753,9],[1265,10],[2289,11],[4337,12],[8433,13],[16625,24]].map(vo),bo=[[0,0],[1,0],[2,0],[3,0],[4,0],[5,0],[6,1],[8,1],[10,2],[14,2],[18,3],[26,3],[34,4],[50,4],[66,5],[98,5],[130,6],[194,7],[322,8],[578,9],[1090,10],[2114,12],[6210,14],[22594,24]].map(vo),xo=[[2,0],[3,0],[4,0],[5,0],[6,0],[7,0],[8,0],[9,0],[10,1],[12,1],[14,2],[18,2],[22,3],[30,3],[38,4],[54,4],[70,5],[102,5],[134,6],[198,7],[326,8],[582,9],[1094,10],[2118,24]].map(vo),So=[0,0,8,8,0,16,8,16,16],Co=[0,8,0,8,16,0,16,8,16],wo=1080,To=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,0,0,0]),Eo=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,0,0]);function Do(e,t){let n=/* @__PURE__ */ new Uint16Array(31);for(let r=0;r<31;r++)n[r]=t+=1<<e[r-1];let r=new Int32Array(n[30]);for(let e=1;e<30;e++)for(let t=n[e];t<n[e+1];++t)r[t]=t-n[e]<<5|e;return{base:n,rev:r}}const{base:Oo,rev:ko}=Do(To,2);Oo[28]=258,ko[258]=28;const{base:Ao}=Do(Eo,0),jo=/* @__PURE__ */ new Uint16Array(32768);for(let e=0;e<32768;e++){let t=(e&43690)>>1|(e&21845)<<1;t=(t&52428)>>2|(t&13107)<<2,t=(t&61680)>>4|(t&3855)<<4,jo[e]=((t&65280)>>8|(t&255)<<8)>>1}function Mo(e,t,n){let r=new Uint16Array(t);for(let t=0;t<e.length;t++)e[t]&&++r[e[t]-1];let i=new Uint16Array(t);for(let e=1;e<t;e++)i[e]=i[e-1]+r[e-1]<<1;let a;if(n){a=new Uint16Array(1<<t);let n=15-t;for(let r=0;r<e.length;r++)if(e[r]){let o=r<<4|e[r],s=t-e[r],c=i[e[r]-1]++<<s;for(let e=c|(1<<s)-1;c<=e;c++)a[jo[c]>>n]=o}}else{a=new Uint16Array(e.length);for(let t=0;t<e.length;t++)e[t]&&(a[t]=jo[i[e[t]-1]++]>>15-e[t])}return a}const No=/* @__PURE__ */ new Uint8Array(288);for(let e=0;e<144;e++)No[e]=8;for(let e=144;e<256;e++)No[e]=9;for(let e=256;e<280;e++)No[e]=7;for(let e=280;e<288;e++)No[e]=8;const Po=/* @__PURE__ */ new Uint8Array(32);for(let e=0;e<32;e++)Po[e]=5;const Fo=/*#__PURE__*/ Mo(No,9,1),Io=/*#__PURE__*/ Mo(Po,5,1);function Lo(e,t,n,r,i,a,o){let s=n*2,c=n,l=ho(t,n*wo,o),u;u=l===0?i[s+(a[c]&1)]:l===1?i[s+(a[c]-1&1)]+1:l-2,u>=e&&(u-=e),r[n]=u,i[s+(a[c]&1)]=u,a[c]++}function Ro(e){let t={meta_block_length:0,input_end:0,is_uncompressed:0,is_metadata:!1};if(t.input_end=e.readBits(1),t.input_end&&e.readBits(1))return t;let n=e.readBits(2)+4;if(n===7){if(t.is_metadata=!0,e.readBits(1)!==0)throw Error(`Invalid reserved bit`);let n=e.readBits(2);if(n===0)return t;for(let r=0;r<n;r++){let i=e.readBits(8);if(r+1===n&&n>1&&i===0)throw Error(`Invalid size byte`);t.meta_block_length|=i<<r*8}}else for(let r=0;r<n;r++){let i=e.readBits(4);if(r+1===n&&n>4&&i===0)throw Error(`Invalid size nibble`);t.meta_block_length|=i<<r*4}return t.meta_block_length++,!t.input_end&&!t.is_metadata&&(t.is_uncompressed=e.readBits(1)),t}function zo(e,t,n,r,i,a){let o=i+1,s=n&i,c=a.pos_&oo.IBUF_MASK;if(t<8||a.bit_pos_+(t<<3)<a.bit_end_pos_){for(;t-->0;)a.readMoreInput(),r[s++]=a.readBits(8),s===o&&(e.write(r,o),s=0);return}if(a.bit_end_pos_<32)throw Error(`copyUncompressedBlockToOutput: br.bit_end_pos_ < 32`);for(;a.bit_pos_<32;)r[s]=a.val_>>>a.bit_pos_,a.bit_pos_+=8,s++,t--;let l=a.bit_end_pos_-a.bit_pos_>>3;if(c+l>oo.IBUF_MASK){let e=oo.IBUF_MASK+1-c;for(let t=0;t<e;t++)r[s+t]=a.buf_[c+t];l-=e,s+=e,t-=e,c=0}for(let e=0;e<l;e++)r[s+e]=a.buf_[c+e];if(s+=l,t-=l,s>=o){e.write(r,o),s-=o;for(let e=0;e<s;e++)r[e]=r[o+e]}for(;s+t>=o;){if(l=o-s,a.input_.read(r,s,l)<l)throw Error(`copyUncompressedBlockToOutput: not enough bytes`);e.write(r,o),t-=l,s=0}if(a.input_.read(r,s,t)<t)throw Error(`copyUncompressedBlockToOutput: not enough bytes`);a.reset()}function Bo(e){if(e.readBits(1)){let t=e.readBits(3);return t===0?1:e.readBits(t)+(1<<t)}return 0}function Vo(e){if(e.readBits(1)===0)return 16;let t=e.readBits(3);return t>0?17+t:(t=e.readBits(3),t>0?8+t:17)}function Ho(e){let t=e.bit_pos_+7&-8;return!e.readBits(t-e.bit_pos_)}function Uo(e,t,n){let r=ho(e,t,n),{offset:i,nbits:a}=yo[r];return i+n.readBits(a)}const Wo=new Uint8Array([0,0,0,0,0,0,0,0,0,4,4,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,12,16,12,12,20,12,16,24,28,12,12,32,12,36,12,44,44,44,44,44,44,44,44,44,44,32,32,24,40,28,12,12,48,52,52,52,48,52,52,52,48,52,52,52,52,52,48,52,52,52,52,52,48,52,52,52,52,52,24,12,28,12,12,12,56,60,60,60,56,60,60,60,56,60,60,60,60,60,56,60,60,60,60,60,56,60,60,60,60,60,24,12,28,12,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,56,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,8,8,8,8,9,9,9,9,10,10,10,10,11,11,11,11,12,12,12,12,13,13,13,13,14,14,14,14,15,15,15,15,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,22,22,22,22,23,23,23,23,24,24,24,24,25,25,25,25,26,26,26,26,27,27,27,27,28,28,28,28,29,29,29,29,30,30,30,30,31,31,31,31,32,32,32,32,33,33,33,33,34,34,34,34,35,35,35,35,36,36,36,36,37,37,37,37,38,38,38,38,39,39,39,39,40,40,40,40,41,41,41,41,42,42,42,42,43,43,43,43,44,44,44,44,45,45,45,45,46,46,46,46,47,47,47,47,48,48,48,48,49,49,49,49,50,50,50,50,51,51,51,51,52,52,52,52,53,53,53,53,54,54,54,54,55,55,55,55,56,56,56,56,57,57,57,57,58,58,58,58,59,59,59,59,60,60,60,60,61,61,61,61,62,62,62,62,63,63,63,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),Go=new Uint16Array([1024,1536,1280,1536,0,256,768,512]);function Ko(e,t){let n=0;t.readMoreInput();let r=Bo(t)+1,i=new Uint8Array(e);if(r<=1)return[r,i];t.readBits(1)&&(n=t.readBits(4)+1);let a=[];for(let e=0;e<wo;e++)a[e]=new X(0,0);mo(r+n,a,0,t);for(let r=0;r<e;){t.readMoreInput();let o=ho(a,0,t);if(o===0)i[r]=0,r++;else if(o<=n){let n=1+(1<<o)+t.readBits(o);for(;--n;){if(r>=e)throw Error(`[DecodeContextMap] i >= context_map_size`);i[r]=0,r++}}else i[r]=o-n,r++}return t.readBits(1)&&Jo(i,e),[r,i]}function qo(e,t){let n=e[t];for(let n=t;n;n--)e[n]=e[n-1];e[0]=n}function Jo(e,t){let n=/* @__PURE__ */ new Uint8Array(256);for(let e=0;e<256;e++)n[e]=e;for(let r=0;r<t;r++){let t=e[r];e[r]=n[t],t&&qo(n,t)}}var Yo=class{constructor(e){this.buffer=e,this.pos=0}read(e,t,n){this.pos+n>this.buffer.length&&(n=this.buffer.length-this.pos);for(let r=0;r<n;r++)e[t+r]=this.buffer[this.pos+r];return this.pos+=n,n}},Xo=class{constructor(e){this.buffer=e,this.pos=0}write(e,t){if(this.pos+t>this.buffer.length)throw Error(`brotli output buffer is not large enough`);return this.buffer.set(e.subarray(0,t),this.pos),this.pos+=t,t}};const Zo=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);function Z(e,t,n){let r=t/8|0;return(e[r]|e[r+1]<<8)>>(t&7)&n}function Qo(e,t){let n=t/8|0;return(e[n]|e[n+1]<<8|e[n+2]<<16)>>(t&7)}function $o(e){return(e+7)/8|0}function es(e,t){if(e[t++]!==31||e[t++]!==139||e[t++]!==8)return 0;let n=e[t++];t+=6,n&4&&(t+=(e[t+10]|e[t+11]<<8)+2);for(let r=(n>>3&1)+(n>>4&1);r>0;r-=Number(!e[t++]));return t+(n&2)}function ts(e,t,n=0,r=0){let i=t??/* @__PURE__ */ new Uint8Array(1024);if(!(e.length-n))return i;let a=es(e,n);if(a===e.length-8)return i;if(a>e.length-8)throw Error(`unexpected EOF`);let o=a*8,s=0,c=0,l=0,u,d,f=e.length*8;function p(e){if(!t&&e>i.length){let t=i;i=new Uint8Array(Math.max(t.length*2,e)),i.set(t)}}do{if(!u){s=Z(e,o,1);let t=Z(e,o+1,3);if(o+=3,!t){let t=$o(o)+4,n=e[t-4]|e[t-3]<<8,a=t+n;if(a>e.length)throw Error(`unexpected EOF`);p(r+n),i.set(e.subarray(t,a),r),r+=n,o=a*8;continue}if(t===1)u=Fo,d=Io,c=9,l=5;else if(t===2){let t=Z(e,o,31)+257,n=Z(e,o+10,15)+4,r=t+Z(e,o+5,31)+1;o+=14;let i=new Uint8Array(r),a=/* @__PURE__ */ new Uint8Array(19);for(let t=0;t<n;++t)a[Zo[t]]=Z(e,o+t*3,7);o+=n*3;let s=Math.max(...a),f=(1<<s)-1,p=Mo(a,s,1);for(let t=0;t<r;){let n=p[Z(e,o,f)];o+=n&15;let r=n>>4;if(r<16)i[t++]=r;else{let n=0,a=0;for(r===16?(a=3+Z(e,o,3),o+=2,n=i[t-1]):r===17?(a=3+Z(e,o,7),o+=3):r===18&&(a=11+Z(e,o,127),o+=7);a--;)i[t++]=n}}let m=i.subarray(0,t),h=i.subarray(t);c=Math.max(...m),l=Math.max(...h),u=Mo(m,c,1),d=Mo(h,l,1)}else throw Error(`invalid block type`);if(o>f)throw Error(`unexpected EOF`)}p(r+131072);let t=(1<<c)-1,n=(1<<l)-1;for(;;){let a=u[Qo(e,o)&t],s=a>>4;if(o+=a&15,o>f)throw Error(`unexpected EOF`);if(!a)throw Error(`invalid length/literal`);if(s<256)i[r++]=s;else if(s===256){u=void 0;break}else{let t=s-254;if(s>264){let n=s-257,r=To[n];t=Z(e,o,(1<<r)-1)+Oo[n],o+=r}if(!d)throw Error(`invalid distance map`);let a=d[Qo(e,o)&n],c=a>>4;if(!a)throw Error(`invalid distance`);o+=a&15;let l=Ao[c];if(c>3){let t=Eo[c];l+=Qo(e,o)&(1<<t)-1,o+=t}if(o>f)throw Error(`unexpected EOF`);let u=r+t;if(r<l)throw Error(`unexpected dictionary case`);for(p(u);r<u;r++)i[r]=i[r-l]}}u&&(s=1)}while(!s);if(r<i.length){let t=Math.ceil(o/8)+8;ts(e,i,t,r)}return t?i:i.subarray(0,r)}let ns;function rs(){if(!ns){ns=/* @__PURE__ */ new Uint8Array(122784);let e=atob(`\n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\nXH/9kw/e+uTa937x6JlPn7j+86ee/PnpG7e/+yefvfzM7ddetBc/+977t3/83mcf/PknV4/fPvfq7e+/\n+cm7P/z0/F/84uwzn7154uc/PvHp69//9I9/+Ml7P7r9/IXbz57/9Pqf3r7y5GdvX/vs+KlPn/7LT0+9\n8en505+dP/PZ+eufPnP99jtvffripU+vnrz9J+duf/+GtefTZ37wyfU37JVPT7/+6bnXfv79lz678vTt\nv3jV/v25Pc73HsfFP3j59ok3rc0BJ2xs7t08Zz7DAKYbJnK5UgK2jQzJmCC4augYsG4CCZp91RPMCbYW\n8rY2w92psSU9JsJr5eZ15HTJPhdaiJXaqRIg7wbBWKEHHX5adwdhvA2PhJOVkIQAXgHUR5kUgqH6MGbJ\nTde53MIZEy6yqT3ANRAzmtC71THhd+I63zxX1ps3X4Z9ESjZchjwqiFzLkBagm7Pm5oZd/Ona2Dpo0SW\nY7IEIhOZVrcgTg4z9eUeatU7/9w2XQdQNR4xq0vb/pGqKBvnbA8aB2VF1VrreWvMzZdXR+KVEBjpfVg7\nksxeQS+zV7Fw2NR4Ckd5E65GGF/Zc94LlRfsBWghULUSXnoJFac+6hn2H7HmV49EANm8/B5nSxkwvsbN\nMkyBIZCVfSDxXmYmA5BcYsTQZk6SrdK/FWjBJmCS0fODJopqn2RJ7A+85DaKjp9kYWwVBb/Kf1/lu5f5\n1gV+7ImoRK4i5Sf+9vSf+1v4/Bv89zVW7L4W11FV8mv88HNxneNshm76GptxJr5+ultDqWKw2ngJcDTp\nwt++epL1y8/wM+f5+2n+/jN+/QKLo1/li6ejSRejbLnu/njc4kJUDb8Sb1lLXuArF3k7Nen5uJeKlL/B\neurHvan45Ud8imd4R/XYxahQ/gILnD8Vdcpf4/9Oq846r6BOuBL1zk/xuz/gTc/FXX4Q5d7Vkxeyeu0a\nuKeiSDwHzvvZOuqElznHWy95b+MBv8NC7M9HJ5yKe/0gCrefZm+kausvRUed5IfVnu/FTc9Hj6nlN2LQ\n7c+no0r9j+Je34su0gVVEv4Dvqjevsi+0nx4IwZaj6O5eiN69Tg74Q027wxbq68/EQ17HK97XXnNZ81V\njc5TbO25KGN/IZ7iRZ8q3s/n/bnw7ln++2I84Ktxr+Ns/7Woaq9G/jj+1IdP8JG1gk7zxTRbTkfzXmOb\n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\n+y++LtIcOB5PrcLur8W9XuSTnkS9eG//1agFf7V95DRv/Qrsf3z+xayvLscKusrLnon+POMF7ts2q69+\nGCXUL7bP5b16nO15Ij7P5uHKp9nmC+zJk+yli+3Y+Tq6EaXkH8/2jcvx+pl2DqvfMMfeiK9ci8/rM1dj\nnV5j807zk5pvmv8vRZ+cjkG5EnNAbb7iDda4t3M19eETsd6f5NWuRJ+8lu0Px7NnzPYcf6LoUtw3tecC\nq9WnfYb3xdXOZ/Mnzc/jMUsv8y0WsvfxeiGbY6dizrzKm6a1prXwwvT+eZzf0lo7z2f/IK6j+a9N/vnp\nPf9afOa1bM5oYl/M9oGfRZ+8ETv5ad+j8JXz0bAf8InS9S/ECnqv7Qe89Xi8dTZG/EyMAluibmnX+wtT\ne0U7uLHWfJ5f9odN+4P/qbHQ3HuG1+e08V36QnvG+fOmfj7FP6/yM29EI5/zZ/TPXI0Bupg94xPx7wu8\nwmW+/k52Vl7w72Lf0Hn3ahp3qkVDF/tpKiS/TT3pR5Pq86Vb74Ri88cnoC798Sm+foWKyK1Ws5SUT926\nSDXvpAOeFJZfzzSW37QrvAldcOhphzI4Xp3SEH9Myti438cn/V7hAVNVmrrXev0NtMnVpi+46jh+P4fP\n+jXPfXySV1J73qLudVzzdXvvFBSp7TpX/fNQ6H6cn4K+9ROhUU4V6VeSNvlbt37Cp4DW+Jnsvk9Sn5tt\nc4VzKVJfomq3FL+hzX0Kz88+DWXst6hv/rj0xqVdTR3xS9Sf1uuPUsX8rPfb43zKM1KsvnUWz4/r8NUr\n1Et/mq9Dxfws+iB9lxrdrtd9ht94068v3XK1B9d+x5/xvM2Dp29d4hXfSnrdP8v+vUwFbe/zVuvcZkbb\nJ+ehh+7j/oara7fa8U/E62lMoe99DXMvxiKe8dZraI36wa7qiuPWX49TuTzUvWNcMPPe8vnzpv32JK+M\n+X/d/oJO+mW2IObGGSq+n/W2XcXrjCsi8ge3vS0nisj/3gxmJm1wx55SUmN9PPToZb99h3LTEVam+DDY\neIPN2R1MhkivZQIUDyJ7KqK1Wg9Xx5secZzPscE5Jr9Z+hwSs81tZ2JWwHlAB8Fztq2eUu1y1p1U5D20\nNMlAP4KSuvP2TyeERIdKtYd8IsJh9yO/s7oxhuyJyBae+d3L5F9kZhhkjzDs1hBlrT2hkWEgvrgWIHQy\n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`),t=new Uint8Array(e.length);for(let n=0;n<e.length;n++)t[n]=e.charCodeAt(n);ts(t,ns)}return ns}var Q=class{constructor(e,t,n){this.prefix=new Uint8Array(e.length),this.transform=t,this.suffix=new Uint8Array(n.length);for(let t=0;t<e.length;t++)this.prefix[t]=e.charCodeAt(t);for(let e=0;e<n.length;e++)this.suffix[e]=n.charCodeAt(e)}};const is=[new Q(``,0,``),new Q(``,0,` `),new Q(` `,0,` `),new Q(``,12,``),new Q(``,10,` `),new Q(``,0,` the `),new Q(` `,0,``),new Q(`s `,0,` `),new Q(``,0,` of `),new Q(``,10,``),new Q(``,0,` and `),new Q(``,13,``),new Q(``,1,``),new Q(`, `,0,` `),new Q(``,0,`, `),new Q(` `,10,` `),new Q(``,0,` in `),new Q(``,0,` to `),new Q(`e `,0,` `),new Q(``,0,`\"`),new Q(``,0,`.`),new Q(``,0,`\">`),new Q(``,0,`\n`),new Q(``,3,``),new Q(``,0,`]`),new Q(``,0,` for `),new Q(``,14,``),new Q(``,2,``),new Q(``,0,` a `),new Q(``,0,` that `),new Q(` `,10,``),new Q(``,0,`. `),new Q(`.`,0,``),new Q(` `,0,`, `),new Q(``,15,``),new Q(``,0,` with `),new Q(``,0,`'`),new Q(``,0,` from `),new Q(``,0,` by `),new Q(``,16,``),new Q(``,17,``),new Q(` the `,0,``),new Q(``,4,``),new Q(``,0,`. The `),new Q(``,11,``),new Q(``,0,` on `),new Q(``,0,` as `),new Q(``,0,` is `),new Q(``,7,``),new Q(``,1,`ing `),new Q(``,0,`\n `),new Q(``,0,`:`),new Q(` `,0,`. `),new Q(``,0,`ed `),new Q(``,20,``),new Q(``,18,``),new Q(``,6,``),new Q(``,0,`(`),new Q(``,10,`, `),new Q(``,8,``),new Q(``,0,` at `),new Q(``,0,`ly `),new Q(` the `,0,` of `),new Q(``,5,``),new Q(``,9,``),new Q(` `,10,`, `),new Q(``,10,`\"`),new Q(`.`,0,`(`),new Q(``,11,` `),new Q(``,10,`\">`),new Q(``,0,`=\"`),new Q(` `,0,`.`),new Q(`.com/`,0,``),new Q(` the `,0,` of the `),new Q(``,10,`'`),new Q(``,0,`. This `),new Q(``,0,`,`),new Q(`.`,0,` `),new Q(``,10,`(`),new Q(``,10,`.`),new Q(``,0,` not `),new Q(` `,0,`=\"`),new Q(``,0,`er `),new Q(` `,11,` `),new Q(``,0,`al `),new Q(` `,11,``),new Q(``,0,`='`),new Q(``,11,`\"`),new Q(``,10,`. `),new Q(` `,0,`(`),new Q(``,0,`ful `),new Q(` `,10,`. `),new Q(``,0,`ive `),new Q(``,0,`less `),new Q(``,11,`'`),new Q(``,0,`est `),new Q(` `,10,`.`),new Q(``,11,`\">`),new Q(` `,0,`='`),new Q(``,10,`,`),new Q(``,0,`ize `),new Q(``,11,`.`),new Q(`Â\\xA0`,0,``),new Q(` `,0,`,`),new Q(``,10,`=\"`),new Q(``,11,`=\"`),new Q(``,0,`ous `),new Q(``,11,`, `),new Q(``,10,`='`),new Q(` `,10,`,`),new Q(` `,11,`=\"`),new Q(` `,11,`, `),new Q(``,11,`,`),new Q(``,11,`(`),new Q(``,11,`. `),new Q(` `,11,`.`),new Q(``,11,`='`),new Q(` `,11,`. `),new Q(` `,10,`=\"`),new Q(` `,11,`='`),new Q(` `,10,`='`)],as=is.length;function os(e,t){return e[t]<192?(e[t]>=97&&e[t]<=122&&(e[t]^=32),1):e[t]<224?(e[t+1]^=32,2):(e[t+2]^=5,3)}function ss(e,t,n,r,i){let a=rs(),{prefix:o}=is[i],{suffix:s}=is[i],c=is[i].transform,l=c<12?0:c-11,u=t;l>r&&(l=r);let d=0;for(;d<o.length;)e[t++]=o[d++];n+=l,r-=l,c<=9&&(r-=c);for(let i=0;i<r;i++)e[t++]=a[n+i];let f=t-r;if(c===10)os(e,f);else if(c===11)for(;r>0;){let t=os(e,f);f+=t,r-=t}let p=0;for(;p<s.length;)e[t++]=s[p++];return t-u}const cs=new Uint8Array([3,2,1,0,3,3,3,3,3,3,2,2,2,2,2,2]),ls=new Int8Array([0,0,0,0,-1,1,-2,2,-3,3,-1,1,-2,2,-3,3]),us=new Uint32Array([0,0,0,0,0,4096,9216,21504,35840,44032,53248,63488,74752,87040,93696,100864,104704,106752,108928,113536,115968,118528,119872,121280,122016]),ds=new Uint8Array([0,0,0,0,10,10,11,11,10,10,10,10,10,9,9,8,7,7,8,7,7,6,6,5,5]);function fs(e,t){let n=new Uint8Array(t);return ps(new Yo(e),new Xo(n)),n}function ps(e,t){let n=0,r=0,i=0,a=[16,15,11,4],o=0,s=[new _o(0,0),new _o(0,0),new _o(0,0)],c=128+oo.READ_SIZE,l=new oo(e),u=Vo(l),d=(1<<u)-16,f=1<<u,p=f-1,m=new Uint8Array(f+c+24),h=f,g=[],_=[];for(let e=0;e<3*wo;e++)g[e]=new X(0,0),_[e]=new X(0,0);for(;!r;){let e=[1<<28,1<<28,1<<28],c=[0],u=[1,1,1],v=[0,1,0,1,0,1],y=[0];for(let e=0;e<3;e++)s[e].codes=[],s[e].htrees=/* @__PURE__ */ new Uint32Array;l.readMoreInput();let b=Ro(l),x=b.meta_block_length;if(n+x>t.buffer.length){let e=new Uint8Array(n+x);e.set(t.buffer),t.buffer=e}if(r=b.input_end,b.is_metadata){for(Ho(l);x>0;--x)l.readMoreInput(),l.readBits(8);continue}if(x===0)continue;if(b.is_uncompressed){l.bit_pos_=l.bit_pos_+7&-8,zo(t,x,n,m,p,l),n+=x;continue}for(let t=0;t<3;t++)u[t]=Bo(l)+1,u[t]>=2&&(mo(u[t]+2,g,t*wo,l),mo(26,_,t*wo,l),e[t]=Uo(_,t*wo,l),y[t]=1);l.readMoreInput();let S=l.readBits(2),C=16+(l.readBits(4)<<S),w=(1<<S)-1,T=C+(48<<S),E=new Uint8Array(u[0]);for(let e=0;e<u[0];e++)l.readMoreInput(),E[e]=l.readBits(2)<<1;let[D,O]=Ko(u[0]<<6,l),[k,A]=Ko(u[2]<<2,l);s[0]=new _o(256,D),s[1]=new _o(704,u[1]),s[2]=new _o(T,k);for(let e=0;e<3;++e)s[e].decode(l);let j=0,M=0,N=E[c[0]],ee=Go[N],P=Go[N+1],te=s[1].htrees[0];for(;x>0;){let r;l.readMoreInput(),e[1]===0&&(Lo(u[1],g,1,c,v,y,l),e[1]=Uo(_,wo,l),te=s[1].htrees[c[1]]),e[1]--;let b=ho(s[1].codes,te,l),T=b>>6;T>=2?(T-=2,r=-1):r=0;let D=So[T]+(b>>3&7),k=bo[D],F=k.offset+l.readBits(k.nbits),ne=Co[T]+(b&7),re=xo[ne],I=re.offset+l.readBits(re.nbits),ie=m[n-1&p],ae=m[n-2&p];for(let r=0;r<F;r++){l.readMoreInput(),e[0]===0&&(Lo(u[0],g,0,c,v,y,l),e[0]=Uo(_,0,l),j=c[0]<<6,N=E[c[0]],ee=Go[N],P=Go[N+1]);let r=Wo[ee+ie]|Wo[P+ae],i=O[j+r];e[0]--,ae=ie,ie=ho(s[0].codes,s[0].htrees[i],l),m[n&p]=ie,(n&p)===p&&t.write(m,f),n++}if(x-=F,x<=0)break;if(r<0){l.readMoreInput(),e[2]===0&&(Lo(u[2],g,2,c,v,y,l),e[2]=Uo(_,2*wo,l),M=c[2]<<2),e[2]--;let t=(I>4?3:I-2)&255,n=A[M+t];if(r=ho(s[2].codes,s[2].htrees[n],l),r>=C){r-=C;let e=r&w;r>>=S;let t=(r>>1)+1;r=C+((2+(r&1)<<t)-4+l.readBits(t)<<S)+e}}let L=ms(r,a,o);if(L<0)throw Error(`[BrotliDecompress] invalid distance`);i=n<d&&i!==d?n:d;let R=n&p;if(L>i){if(I>=4&&I<=24){let e=us[I],r=L-i-1,a=ds[I],o=r&(1<<a)-1,s=r>>a;if(e+=o*I,s<as){let r=ss(m,R,e,I,s);if(R+=r,n+=r,x-=r,R>=h){t.write(m,f);for(let e=0;e<R-h;e++)m[e]=m[h+e]}}else throw Error(`Invalid backward reference`)}else throw Error(`Invalid backward reference`)}else{if(r>0&&(a[o&3]=L,o++),I>x)throw Error(`Invalid backward reference`);for(let e=0;e<I;e++)m[n&p]=m[n-L&p],(n&p)===p&&t.write(m,f),n++,x--}}n&=1073741823}t.write(m,n&p)}function ms(e,t,n){return e<16?(n+=cs[e],n&=3,t[n]+ls[e]):e-16+1}function hs(e,t){let n=new Uint8Array(t);try{let t=0,r=0;for(;t<e.length-8;){let i=e[t++]<<24|e[t++]<<16|e[t++]<<8|e[t++],a=e[t++]<<24|e[t++]<<16|e[t++]<<8|e[t++];if(e.length-t<a||n.length<i||_s(e.subarray(t,t+a),n,r)!==i)throw Error(`lz4 not hadoop`);if(t+=a,r+=i,t===e.length)return n}if(t<e.length)throw Error(`lz4 not hadoop`)}catch(t){if(t instanceof Error&&t.message!==`lz4 not hadoop`)throw t;_s(e,n,0)}return n}function gs(e,t){let n=new Uint8Array(t);return _s(e,n,0),n}function _s(e,t,n){let r=n;for(let i=0;i<e.length;){let a=e[i++],o=a>>4;if(o){let a=o+240;for(;a===255;)o+=a=e[i++];if(t.set(e.subarray(i,i+o),r),r+=o,i+=o,i>=e.length)return r-n}let s=e[i++]|e[i++]<<8;if(!s||s>r)throw Error(`lz4 offset out of range ${s}`);let c=a&15,l=c+240;for(;l===255;)c+=l=e[i++];c+=4;let u=r-s,d=r+c;for(;r<d;)t[r++]=t[u++]}return r-n}const vs={SNAPPY:eo(),GZIP:(e,t)=>ts(e,new Uint8Array(t)),BROTLI:fs,ZSTD:e=>$a(e),LZ4:hs,LZ4_RAW:gs},ys=e=>({byteLength:e.byteLength,slice:(t,n)=>Promise.resolve(e.slice(t,n))}),bs=e=>{let t=e?.find(e=>e.key===`ARROW:schema`);if(t?.value)try{let e=atob(t.value),n=new Uint8Array(e.length);for(let t=0;t<e.length;t++)n[t]=e.charCodeAt(t);return xs(n)}catch{return}},xs=e=>{let t=new DataView(e.buffer,e.byteOffset,e.byteLength);if(e.length<16||t.getInt32(0,!0)!==-1)return;let n=e=>t.getInt32(8+e,!0),r=e=>t.getUint16(8+e,!0),i=t=>{let r=n(t);return new TextDecoder().decode(e.subarray(8+t+4,8+t+4+r))},a=n(0),o=a-n(a);if(r(o)-4>>1<3)return;let s=r(o+4+4);if(s===0)return;let c=n(a+s),l=a+s+c,u=l-n(l);if(r(u)-4>>1<3)return;let d=r(u+4+4);if(d===0)return;let f=n(l+d),p=l+d+f,m=n(p);for(let e=0;e<m;e++){let t=n(p+4+e*4),a=p+4+e*4+t,o=a-n(a);if(r(o)-4>>1<2)continue;let s=r(o+4),c=r(o+6);if(s!==0&&c!==0&&i(a+s+n(a+s))===`dtour`)return i(a+c+n(a+c))}},Ss=async e=>{let t=ys(e),n=vr(e),r=n.key_value_metadata?.find(e=>e.key===`dtour`)?.value??bs(n.key_value_metadata),i=/* @__PURE__ */ new Set([`list`,`element`,`key`,`value`,`bag`,`array`,`item`,`entries`,`entry`]),a=[],o=[];for(let e of n.schema){if(!(`type`in e)||e.type==null||/^__index_level_\\d+__$/.test(e.name)||i.has(e.name))continue;let t=e.type;t===`FLOAT`||t===`DOUBLE`||t===`INT32`||t===`INT64`||t===`INT96`||t===`BOOLEAN`?a.push(e.name):t===`BYTE_ARRAY`&&o.push(e.name)}let s=Number(n.num_rows),c={};for(let e of a)c[e]=new Float32Array(s);let l=/* @__PURE__ */ new Map,u=/* @__PURE__ */ new Map;for(let e of o)l.set(e,/* @__PURE__ */ new Map),u.set(e,new Uint32Array(s));let d=new Set(a),f=new Set(o);return await Ta({file:t,compressors:vs,columns:[...a,...o],onChunk({columnName:e,columnData:t,rowStart:n}){let r=t.length;if(d.has(e)){let i=c[e];if(t instanceof Float32Array)i.set(t,n);else for(let e=0;e<r;e++){let r=t[e];i[n+e]=typeof r==`bigint`?Number.isFinite(Number(r))?Number(r):0:typeof r==`number`&&Number.isFinite(r)?r:0}}else if(f.has(e)){let i=u.get(e),a=l.get(e);for(let e=0;e<r;e++){let r=String(t[e]??``),o=a.get(r);o===void 0&&(o=a.size,a.set(r,o)),i[n+e]=o}}}}),{numeric:c,categorical:o.map(e=>{let t=[...l.get(e).keys()],n=[...t].sort((e,t)=>e.localeCompare(t,void 0,{numeric:!0,sensitivity:`base`})),r=/* @__PURE__ */ new Map;for(let e=0;e<n.length;e++)r.set(n[e],e);let i=t.map(e=>r.get(e)),a=u.get(e);for(let e=0;e<a.length;e++)a[e]=i[a[e]];return{name:e,indices:a,labels:n}}),embeddedConfig:r}},Cs=async e=>{let t=Fn(e)===`parquet`?await Ss(e):null,n=t??jn(e),r=Object.keys(n.numeric);if(r.length===0)throw Error(`No numeric columns found in dataset`);let i=n.numeric[r[0]].length;if(i===0)throw Error(`Dataset contains no rows`);for(let e of r){let t=n.numeric[e];if(t.length!==i)throw Error(`Column \"${e}\" has ${t.length} rows, expected ${i}. All columns must have equal length.`)}return{columns:r.map(e=>{let t=n.numeric[e],{min:r,max:i,range:a,mean:o}=l(t);return{name:e,values:t,min:r,max:i,range:a,mean:o}}),categoricalColumns:n.categorical,rowCount:i,embeddedConfig:t?.embeddedConfig}},ws=(e,t)=>{let n=Math.min(t,1024),r=new Float32Array(n*e.length);for(let i=0;i<n;i++){let a=Math.floor(i*t/n);for(let t=0;t<e.length;t++)r[i*e.length+t]=e[t].values[a]}return r},Ts=/^(?:https?:\\/\\/\\S+\\.(?:png|jpe?g|webp)(?:[?#]\\S*)?|data:image\\/(?:png|jpeg|webp)[;,]\\S*)$/i,Es=e=>e.some(Boolean)&&e.every(e=>!e||Ts.test(e)),Ds=e=>{let t=new Uint32Array(e.length);for(let n=0;n<e.length;n++){let[r,i,a]=e[n];t[n]=255<<24|a<<16|i<<8|r}return t};let $=null,Os=0,ks=[],As=/* @__PURE__ */ new Map,js=/* @__PURE__ */ new Map,Ms=/* @__PURE__ */ new Map,Ns=0;self.onmessage=async e=>{let n=e.data;if(n.type===`init`)$=n.gpuPort;else{if(n.type===`load`){if(!$){self.postMessage({type:`error`,message:`GPU port not initialized before load`});return}try{let e=await Cs(n.buffer);Os++,Ns=e.rowCount,ks=e.columns.map(e=>e.name),As=/* @__PURE__ */ new Map,js=/* @__PURE__ */ new Map;for(let t of e.columns)As.set(t.name,t.min),js.set(t.name,t.range);Ms=/* @__PURE__ */ new Map;for(let t of e.categoricalColumns)Ms.set(t.name,t.labels);let t={};for(let n of e.categoricalColumns)t[n.name]=n.labels;let r=e.categoricalColumns.filter(e=>Es(e.labels)).map(e=>e.name),i={type:`metadata`,metadata:{columnNames:e.columns.map(e=>e.name),categoricalColumnNames:e.categoricalColumns.filter(e=>!r.includes(e.name)).map(e=>e.name),categoricalLabels:t,imageColumnNames:r,rowCount:e.rowCount,dimCount:e.columns.length,mins:e.columns.map(e=>e.min),maxes:e.columns.map(e=>e.max),ranges:e.columns.map(e=>e.range),means:e.columns.map(e=>e.mean),sample:ws(e.columns,e.rowCount),embeddedConfig:e.embeddedConfig}};self.postMessage(i);let a=e.columns.map(e=>e.values),o=e.categoricalColumns.map(e=>({name:e.name,indices:e.indices})),s=[...new Set(a.map(e=>e.buffer)),...o.map(e=>e.indices.buffer)],c={type:`data`,dataVersion:Os,dims:e.columns.length,rows:e.rowCount,buffers:a,mins:e.columns.map(e=>e.min),ranges:e.columns.map(e=>e.range),means:e.columns.map(e=>e.mean),categoricalColumns:o};$.postMessage(c,s)}catch(e){let t={type:`error`,message:e instanceof Error?e.message:String(e)};self.postMessage(t)}}if(n.type===`encodeColor`){if(!$)return;let{column:e,palette:t,theme:r,colorMap:l}=n,u=r===`light`,d=Ms.get(e);if(d){let t;if(l)t=d.map(e=>l[e]??[128,128,128]);else{let e=u?o:a;t=d.length<=i.length?i:[...i,...Array(Math.ceil((d.length-i.length)/e.length)).fill(void 0).flatMap(()=>e)]}let n=Ds(t),r={type:`setColorCategorical`,dataVersion:Os,catColumnName:e,palette:n};$.postMessage(r,[n.buffer]);return}let f=ks.indexOf(e);if(f>=0){let n=As.get(e)??0,r=js.get(e)??1,i=t===`magma`?c:s,a=u?[...i].reverse():i,o=Ds(a),l={type:`setColorContinuous`,dataVersion:Os,columnIndex:f,min:n,range:r,colormap:o};$.postMessage(l,[o.buffer])}}if(n.type===`encodeColor2D`){if(!$)return;let{columnX:e,columnY:i,colormap:a}=n,o=ks.indexOf(e),s=ks.indexOf(i);if(o<0||s<0)return;let c=t[a]??0,l=r(c),u=[];l&&u.push(l.buffer);let d={type:`setColor2D`,dataVersion:Os,columnIndexX:o,columnIndexY:s,minX:As.get(e)??0,rangeX:js.get(e)??1,minY:As.get(i)??0,rangeY:js.get(i)??1,lut:l,mapIndex:c};$.postMessage(d,u)}if(n.type===`selectByColumn`){if(!$||Ns===0)return;let{id:e,column:t,labelIndices:r,valueRanges:i}=n,a=Ms.get(t);if(a&&r&&r.length>0){let n=new Uint32Array(a.length);for(let e of r)e<n.length&&(n[e]=1);let i={type:`selectCategorical`,dataVersion:Os,id:e,catColumnName:t,labelIndices:r,selectedLabels:n};$.postMessage(i,[n.buffer]);return}let o=ks.indexOf(t);if(o>=0&&i&&i.length>=2){let n={type:`selectContinuous`,dataVersion:Os,id:e,column:t,columnIndex:o,ranges:i};$.postMessage(n,[i.buffer]);return}}}};", f = typeof self < "u" && self.Blob && new Blob(["URL.revokeObjectURL(import.meta.url);", d], { type: "text/javascript;charset=utf-8" });
2618
2618
  function p(e) {
2619
2619
  let t;
2620
2620
  try {
@@ -2634,12 +2634,59 @@ function p(e) {
2634
2634
  }
2635
2635
  }
2636
2636
  //#endregion
2637
- //#region src/gpu/worker.ts?worker&inline
2638
- var m = "var e=`// PCA compute shader — two-pass reduction to compute covariance matrix.\n//\n// Pass 1 (reduce_partial): Each workgroup reduces its chunk of points into\n// per-workgroup partial sums for d means + d*(d+1)/2 cross-product terms.\n//\n// Pass 2 (final_reduce): A single workgroup reduces all partial sums into\n// the final means and covariance matrix.\n//\n// Data is normalized identically to the projection shader:\n// v = (raw - center) / range\n\nstruct PcaParams {\n num_points: u32,\n num_dims: u32,\n num_workgroups: u32,\n _pad: u32,\n}\n\n@group(0) @binding(0) var<uniform> params: PcaParams;\n@group(0) @binding(1) var<storage, read> data: array<f32>;\n@group(0) @binding(2) var<storage, read> norm_params: array<vec2f>;\n@group(0) @binding(3) var<storage, read_write> partials: array<f32>;\n// result layout: [mean_0 .. mean_{d-1}, cov_00, cov_01, ..., cov_{d-1,d-1}]\n// upper-triangle covariance packed as: d1*d - d1*(d1-1)/2 + (d2-d1)\n@group(0) @binding(4) var<storage, read_write> result: array<f32>;\n\nconst WG: u32 = 256u;\nconst MAX_DIMS: u32 = 32u;\n\nvar<workgroup> wg_reduce: array<f32, 256>;\n\nfn normalize(dim: u32, point_idx: u32, N: u32) -> f32 {\n let raw = data[dim * N + point_idx];\n let np = norm_params[dim];\n let range = max(np.y, 1e-6);\n return (raw - np.x) / range;\n}\n\nfn cov_idx(d: u32, d1: u32, d2: u32) -> u32 {\n return d1 * d - d1 * (d1 - 1u) / 2u + (d2 - d1);\n}\n\n// ─── Pass 1: per-workgroup partial sums ─────────────────────────────────────\n\n@compute @workgroup_size(256)\nfn reduce_partial(\n @builtin(global_invocation_id) gid: vec3u,\n @builtin(local_invocation_id) lid: vec3u,\n @builtin(workgroup_id) wid: vec3u,\n) {\n let N = params.num_points;\n let d = min(params.num_dims, MAX_DIMS);\n let num_cov = d * (d + 1u) / 2u;\n let num_terms = d + num_cov;\n let i = gid.x;\n let valid = i < N;\n\n // Load normalized values for this point into registers\n var vals: array<f32, 32>; // MAX_DIMS\n if (valid) {\n for (var dim = 0u; dim < d; dim++) {\n vals[dim] = normalize(dim, i, N);\n }\n }\n\n // Reduce mean terms\n for (var dim = 0u; dim < d; dim++) {\n wg_reduce[lid.x] = select(0.0, vals[dim], valid);\n workgroupBarrier();\n for (var s = WG / 2u; s > 0u; s >>= 1u) {\n if (lid.x < s) {\n wg_reduce[lid.x] += wg_reduce[lid.x + s];\n }\n workgroupBarrier();\n }\n if (lid.x == 0u) {\n partials[wid.x * num_terms + dim] = wg_reduce[0];\n }\n }\n\n // Reduce upper-triangle covariance terms (including diagonal)\n for (var d1 = 0u; d1 < d; d1++) {\n for (var d2 = d1; d2 < d; d2++) {\n wg_reduce[lid.x] = select(0.0, vals[d1] * vals[d2], valid);\n workgroupBarrier();\n for (var s = WG / 2u; s > 0u; s >>= 1u) {\n if (lid.x < s) {\n wg_reduce[lid.x] += wg_reduce[lid.x + s];\n }\n workgroupBarrier();\n }\n if (lid.x == 0u) {\n let ci = cov_idx(d, d1, d2);\n partials[wid.x * num_terms + d + ci] = wg_reduce[0];\n }\n }\n }\n}\n\n// ─── Pass 2: reduce across workgroups → final means + covariance ────────────\n\n@compute @workgroup_size(256)\nfn final_reduce(\n @builtin(local_invocation_id) lid: vec3u,\n) {\n let d = min(params.num_dims, MAX_DIMS);\n let num_cov = d * (d + 1u) / 2u;\n let num_terms = d + num_cov;\n let nwg = params.num_workgroups;\n let N_f32 = f32(params.num_points);\n\n // For each term, reduce across all workgroups\n for (var t = 0u; t < num_terms; t++) {\n // Each thread accumulates a stride of workgroups\n var sum = 0.0;\n var w = lid.x;\n while (w < nwg) {\n sum += partials[w * num_terms + t];\n w += WG;\n }\n wg_reduce[lid.x] = sum;\n workgroupBarrier();\n for (var s = WG / 2u; s > 0u; s >>= 1u) {\n if (lid.x < s) {\n wg_reduce[lid.x] += wg_reduce[lid.x + s];\n }\n workgroupBarrier();\n }\n if (lid.x == 0u) {\n // Store as E[X] or E[XY]\n result[t] = wg_reduce[0] / N_f32;\n }\n workgroupBarrier();\n }\n\n // Correct covariance: cov(X,Y) = E[XY] - E[X]*E[Y]\n if (lid.x == 0u) {\n for (var d1 = 0u; d1 < d; d1++) {\n for (var d2 = d1; d2 < d; d2++) {\n let ci = cov_idx(d, d1, d2);\n result[d + ci] -= result[d1] * result[d2];\n }\n }\n }\n}\n`;const t=(e,t)=>{let n=e,r=new Float32Array(t*t);for(let e=0;e<t;e++)r[e*t+e]=1;let i=1e-10;for(let e=0;e<50;e++){let e=0;for(let r=0;r<t;r++)for(let i=r+1;i<t;i++)e+=n[r*t+i]*n[r*t+i];if(e<i)break;for(let e=0;e<t;e++)for(let a=e+1;a<t;a++){let o=n[e*t+a];if(Math.abs(o)<i*.01)continue;let s=n[e*t+e],c=n[a*t+a],l=(c-s)/(2*o),u=Math.sign(l)/(Math.abs(l)+Math.sqrt(1+l*l)),d=1/Math.sqrt(1+u*u),f=u*d;n[e*t+e]=s-u*o,n[a*t+a]=c+u*o,n[e*t+a]=0,n[a*t+e]=0;for(let r=0;r<t;r++){if(r===e||r===a)continue;let i=n[r*t+e],o=n[r*t+a];n[r*t+e]=d*i-f*o,n[e*t+r]=d*i-f*o,n[r*t+a]=f*i+d*o,n[a*t+r]=f*i+d*o}for(let n=0;n<t;n++){let i=r[n*t+e],o=r[n*t+a];r[n*t+e]=d*i-f*o,r[n*t+a]=f*i+d*o}}}let a=new Float32Array(t),o=Array.from({length:t},(e,t)=>t);for(let e=0;e<t;e++)a[e]=n[e*t+e];o.sort((e,t)=>a[t]-a[e]);let s=new Float32Array(t),c=[];for(let e=0;e<t;e++){let n=o[e];s[e]=a[n];let i=new Float32Array(t);for(let e=0;e<t;e++)i[e]=r[e*t+n];c.push(i)}return{eigenvalues:s,eigenvectors:c}},n=t=>{let n=t.createShaderModule({label:`compute-pca`,code:e}),r=t.createBindGroupLayout({label:`pca-bgl`,entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:`uniform`}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}}]}),i=t.createPipelineLayout({bindGroupLayouts:[r]});return{partialPipeline:t.createComputePipeline({label:`pca-partial-pipeline`,layout:i,compute:{module:n,entryPoint:`reduce_partial`}}),finalPipeline:t.createComputePipeline({label:`pca-final-pipeline`,layout:i,compute:{module:n,entryPoint:`final_reduce`}}),bindGroupLayout:r,paramsBuffer:t.createBuffer({label:`pca-params`,size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST})}},r=async(e,n,r,i,a,o)=>{let s=Math.min(o,32),c=s+s*(s+1)/2,l=Math.ceil(a/256),u=new ArrayBuffer(16),d=new Uint32Array(u);d[0]=a,d[1]=s,d[2]=l,d[3]=0,e.queue.writeBuffer(n.paramsBuffer,0,u);let f=e.createBuffer({label:`pca-partials`,size:l*c*4,usage:GPUBufferUsage.STORAGE}),p=c*4,m=e.createBuffer({label:`pca-result`,size:p,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC}),h=e.createBuffer({label:`pca-readback`,size:p,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),g=e.createBindGroup({label:`pca-bg`,layout:n.bindGroupLayout,entries:[{binding:0,resource:{buffer:n.paramsBuffer}},{binding:1,resource:{buffer:r}},{binding:2,resource:{buffer:i}},{binding:3,resource:{buffer:f}},{binding:4,resource:{buffer:m}}]}),_=e.createCommandEncoder({label:`pca-compute`}),v=_.beginComputePass({label:`pca-partial`});v.setPipeline(n.partialPipeline),v.setBindGroup(0,g),v.dispatchWorkgroups(l),v.end();let y=_.beginComputePass({label:`pca-final`});y.setPipeline(n.finalPipeline),y.setBindGroup(0,g),y.dispatchWorkgroups(1),y.end(),_.copyBufferToBuffer(m,0,h,0,p),e.queue.submit([_.finish()]),await h.mapAsync(GPUMapMode.READ);let b=new Float32Array(h.getMappedRange()).slice();h.unmap(),f.destroy(),m.destroy(),h.destroy();let x=new Float32Array(s*s);for(let e=0;e<s;e++)for(let t=e;t<s;t++){let n=e*s-e*(e-1)/2+(t-e);x[e*s+t]=b[s+n],x[t*s+e]=b[s+n]}return t(x,s)},i=(e,t)=>{let n=e.getContext(`webgpu`);if(!n)throw Error(`Failed to get WebGPU context from canvas. Ensure WebGPU is supported and the canvas is valid.`);let r=navigator.gpu.getPreferredCanvasFormat();return n.configure({device:t,format:r,alphaMode:`premultiplied`}),{canvas:e,context:n,format:r}},a=2e6,o=(e,t,n,r,i,o=[0,0,0])=>{let s=e.beginRenderPass({colorAttachments:[{view:t,clearValue:{r:o[0],g:o[1],b:o[2],a:1},loadOp:`clear`,storeOp:`store`}]});if(i>0){s.setPipeline(n),s.setBindGroup(0,r);for(let e=0;e<i;e+=a){let t=Math.min(a,i-e);s.draw(4,t,0,e)}}s.end()},s=(e,t,n,r)=>{let i=e.beginRenderPass({colorAttachments:[{view:t.context.getCurrentTexture().createView(),loadOp:`clear`,storeOp:`store`,clearValue:{r:0,g:0,b:0,a:1}}]});i.setPipeline(n),i.setBindGroup(0,r),i.draw(3),i.end()},c=1e-10,l=e=>{let t=e[0],n=e[1],r=e[2],i=e[3],a=t*t+r*r,o=t*n+r*i,s=n*n+i*i,l=a+s,u=a*s-o*o,d=Math.sqrt(Math.max(0,l*l*.25-u)),f=l*.5+d,p=l*.5-d,m=Math.sqrt(Math.max(0,f)),h=Math.sqrt(Math.max(0,p)),g=new Float32Array([m,h]),_=new Float32Array(4);if(Math.abs(o)>c){let e=f-s,t=Math.sqrt(e*e+o*o);_[0]=e/t,_[1]=o/t;let n=p-s,r=Math.sqrt(n*n+o*o);_[2]=n/r,_[3]=o/r}else _[0]=1,_[1]=0,_[2]=0,_[3]=1;let v=new Float32Array(4);return m>c&&(v[0]=(t*_[0]+n*_[1])/m,v[2]=(r*_[0]+i*_[1])/m),h>c&&(v[1]=(t*_[2]+n*_[3])/h,v[3]=(r*_[2]+i*_[3])/h),m<=c&&h>c?(v[0]=-v[3],v[2]=v[1]):h<=c&&m>c?(v[1]=-v[2],v[3]=v[0]):m<=c&&h<=c&&(v[0]=1,v[1]=0,v[2]=0,v[3]=1),{U:v,S:g,V:_}},u=(e,t)=>{let n=0;for(let r=0;r<t;r++)n+=e[r]*e[r];if(n=Math.sqrt(n),n>1e-10)for(let r=0;r<t;r++)e[r]=e[r]/n;let r=0;for(let n=0;n<t;n++)r+=e[n]*e[t+n];for(let n=0;n<t;n++)e[t+n]=e[t+n]-r*e[n];let i=0;for(let n=0;n<t;n++)i+=e[t+n]*e[t+n];if(i=Math.sqrt(i),i>1e-10)for(let n=0;n<t;n++)e[t+n]=e[t+n]/i},d=(e,t,n,r,i,a,o,s=!0)=>{let c=o*o,l=c*o,d=.5*(-o+2*c-l),f=.5*(2-5*c+3*l),p=.5*(o+4*c-3*l),m=.5*(-c+l);for(let o=0;o<a*2;o++)e[o]=d*t[o]+f*n[o]+p*r[o]+m*i[o];return s&&u(e,a),e},f=(e,t,n)=>{let r=new Float32Array(4);for(let i=0;i<2;i++)for(let a=0;a<2;a++){let o=0;for(let r=0;r<n;r++)o+=e[i*n+r]*t[a*n+r];r[i*2+a]=o}let{S:i}=l(r),a=Math.acos(Math.max(-1,Math.min(1,i[0]))),o=Math.acos(Math.max(-1,Math.min(1,i[1])));return Math.sqrt(a*a+o*o)},p=(e,t,n=!0)=>{let r=e.length,i=new Float32Array(r+1);if(i[0]=0,!n){for(let e=1;e<=r;e++)i[e]=e/r;return i}let a=new Float32Array(t*2),o=new Float32Array(t*2);for(let n=0;n<r;n++){let s=(n-1+r)%r,c=n,l=(n+1)%r,u=(n+2)%r,p=0;d(a,e[s],e[c],e[l],e[u],t,0);for(let n=1;n<=8;n++){let r=n/8;d(o,e[s],e[c],e[l],e[u],t,r),p+=f(a,o,t),a.set(o)}i[n+1]=i[n]+p}let s=i[r];if(s>1e-10)for(let e=1;e<=r;e++)i[e]=i[e]/s;return i},m=(e,t)=>{let n=e.length-1,r=Math.max(0,Math.min(1,t)),i=0,a=n-1;for(;i<a;){let t=i+a>>>1;e[t+1]<=r?i=t+1:a=t}let o=e[i],s=e[i+1]-o,c=s>1e-10?(r-o)/s:0;return{segment:i,localT:c}},h=(e,t,n,r,i,a=!0)=>{let o=t.length,{segment:s,localT:c}=m(n,i),l=(s-1+o)%o,u=s,f=(s+1)%o,p=(s+2)%o;return d(e,t[l],t[u],t[f],t[p],r,c,a)};var g=`// GPU categorical selection (bit-packed output)\n//\n// For each point, checks if its category index is in the selected set.\n// Output mask must be pre-cleared; bits are set via atomicOr.\n\nstruct Params {\n num_points: u32,\n num_labels: u32,\n}\n\n@group(0) @binding(0) var<storage, read> indices: array<u32>;\n@group(0) @binding(1) var<storage, read> selected: array<u32>; // 1 per label: selected or not\n@group(0) @binding(2) var<storage, read_write> mask: array<atomic<u32>>;\n@group(0) @binding(3) var<uniform> params: Params;\n\n@compute @workgroup_size(256)\nfn main(@builtin(global_invocation_id) gid: vec3u) {\n let i = gid.x;\n if (i >= params.num_points) { return; }\n let idx = indices[i];\n if (idx < params.num_labels && selected[idx] > 0u) {\n atomicOr(&mask[i / 32u], 1u << (i % 32u));\n }\n}\n`,_=`// GPU continuous selection (bit-packed output)\n//\n// For each point, checks if the column value falls within any [lo, hi] range.\n// Output mask must be pre-cleared; bits are set via atomicOr.\n\nstruct Params {\n num_points: u32,\n column_offset: u32, // columnIndex * numPoints\n num_ranges: u32,\n}\n\n@group(0) @binding(0) var<storage, read> data: array<f32>;\n@group(0) @binding(1) var<storage, read> ranges: array<f32>; // [lo0, hi0, lo1, hi1, ...]\n@group(0) @binding(2) var<storage, read_write> mask: array<atomic<u32>>;\n@group(0) @binding(3) var<uniform> params: Params;\n\n@compute @workgroup_size(256)\nfn main(@builtin(global_invocation_id) gid: vec3u) {\n let i = gid.x;\n if (i >= params.num_points) { return; }\n\n let v = data[params.column_offset + i];\n for (var r = 0u; r < params.num_ranges; r++) {\n if (v >= ranges[r * 2u] && v <= ranges[r * 2u + 1u]) {\n atomicOr(&mask[i / 32u], 1u << (i % 32u));\n break;\n }\n }\n}\n`;const v=e=>{let t=e.createBindGroupLayout({label:`color-bgl`,entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:`uniform`}}]}),n=e.createPipelineLayout({bindGroupLayouts:[t]}),r=(t,r)=>e.createComputePipeline({label:t,layout:n,compute:{module:e.createShaderModule({label:t,code:r}),entryPoint:`main`}}),i=e.createBuffer({label:`color-params`,size:32,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});return{selectContinuous:r(`select-continuous`,_),selectCategorical:r(`select-categorical`,g),bindGroupLayout:t,paramsBuffer:i}},y=(e,t,n,r,i,a)=>e.createBindGroup({label:`color-bg`,layout:t,entries:[{binding:0,resource:{buffer:n}},{binding:1,resource:{buffer:r}},{binding:2,resource:{buffer:i}},{binding:3,resource:{buffer:a}}]}),b=(e,t,n,r,i)=>{let a=new ArrayBuffer(32),o=new Uint32Array(a);o[0]=n,o[1]=r,o[2]=i,e.queue.writeBuffer(t,0,a)},x=(e,t,n,r)=>{let i=new ArrayBuffer(32),a=new Uint32Array(i);a[0]=n,a[1]=r,e.queue.writeBuffer(t,0,i)},ee=async()=>{if(!navigator.gpu)throw Error(`WebGPU is not supported in this environment. Please use Chrome 113+, Edge 113+, or Firefox Nightly with WebGPU enabled.`);let e=await navigator.gpu.requestAdapter({powerPreference:`high-performance`});if(!e)throw Error(`No WebGPU adapter found. Your GPU may not support WebGPU, or the browser may have blocked access.`);if(!e.features.has(`float32-blendable`))throw Error(`Your GPU does not support float32-blendable, which is required for HDR rendering. Please try a different browser or device with a GPU that supports this WebGPU feature.`);let t=await e.requestDevice({label:`dtour-scatter`,requiredFeatures:[`float32-blendable`],requiredLimits:{maxStorageBufferBindingSize:e.limits.maxStorageBufferBindingSize,maxBufferSize:e.limits.maxBufferSize}});return t.lost.then(e=>{console.error(`WebGPU device lost: ${e.message} (reason: ${e.reason})`)}),{adapter:e,device:t}};var S=`// Point renderer — instanced quads with SDF circle anti-aliasing\n//\n// Projects raw ND data to 2D inline using pre-adjusted basis weights and\n// biases (normalization folded into the basis on CPU). This eliminates the\n// separate compute-projection pass and its GPU barrier.\n//\n// Trade-off: the projection loop runs once per vertex (4x per point) since\n// vertex shaders can't share results across a strip. This is a net win\n// because eliminating the compute dispatch + barrier + projected-buffer\n// read costs more than the redundant ALU, and GPUs are throughput-oriented.\n// For very high dim counts (>200) this balance may shift — profile first.\n//\n// Applies 2D camera transform (pan/zoom/aspect). Each point is rendered as\n// a unit quad (triangle strip, 4 vertices) scaled by point_size (NDC units).\n//\n// Color mapping: instead of a pre-computed N-element color buffer, the shader\n// reads raw data values and looks up colors from a tiny LUT at render time.\n// This eliminates the 20MB color buffer for 5M points and makes color changes\n// instant (just swap the ~100-byte LUT + update uniforms).\n\nstruct Uniforms {\n point_size: f32,\n opacity: f32,\n // Color mode: 0 = uniform color, 1 = continuous, 2 = categorical\n color_mode: u32,\n useSelectionMask: f32,\n color: vec4f,\n useSubtractive: f32,\n num_points: u32,\n num_dims: u32,\n max_points: u32,\n bias: vec2f,\n // Color mapping params (used when color_mode > 0)\n color_column_offset: u32, // columnIndex * num_points (continuous only)\n color_min: f32,\n color_range: f32,\n color_num_stops: u32, // LUT size\n bias_z: f32, // z-axis bias (3D mode only)\n // 2D colormap params (used when color_mode == 3)\n color_column_offset_v: u32, // second column index * num_points\n color_min_v: f32,\n color_range_v: f32,\n color2d_map_index: u32, // 0-5 = LUT-based, 6 = oklab_polar\n scale_opacity_by_zoom: f32, // 1.0 = auto (zoom² density scaling), 0.0 = manual (fixed)\n}\n\nstruct Camera {\n pan_x: f32,\n pan_y: f32,\n zoom: f32,\n aspect: f32,\n viewport_height: f32,\n // NDC-space Y offset applied after zoom — used to shift the viewport\n // down when a toolbar covers the top of the canvas.\n inset_offset_y: f32,\n // Zoom multiplier for the inset — scales content to fit in the visible\n // area below the toolbar (typically (H - toolbar) / H).\n inset_zoom: f32,\n // 3D camera rotation: 0.0 = 2D mode (skip z projection), 1.0 = 3D mode\n use_3d: f32,\n // 3×3 rotation matrix (column-major, each column padded to vec4f for alignment)\n rot_col0: vec3f,\n _pad0: f32,\n rot_col1: vec3f,\n _pad1: f32,\n rot_col2: vec3f,\n _pad2: f32,\n}\n\n@group(0) @binding(0) var<uniform> uni: Uniforms;\n// Raw ND data (column-major): dim0[0..N], dim1[0..N], ..., dimP[0..N]\n@group(0) @binding(1) var<storage, read> data: array<f32>;\n@group(0) @binding(2) var<uniform> camera: Camera;\n// Colormap/palette LUT — packed RGBA8 u32 entries (25 for continuous, up to 256 for categorical)\n@group(0) @binding(3) var<storage, read> colorLut: array<u32>;\n// Bit-packed selection mask (1 bit per point, 32 per u32)\n@group(0) @binding(4) var<storage, read> selectionMask: array<u32>;\n// Adjusted basis weights (normalization folded in):\n// first num_dims = x-weights, next num_dims = y-weights\n// adj_basis[d] = basis[d] / range[d] * viewport_scale\n@group(0) @binding(5) var<storage, read> adj_basis: array<f32>;\n// Categorical index buffer (per-point category index, used when color_mode == 2)\n@group(0) @binding(6) var<storage, read> catIndices: array<u32>;\n\nstruct VertOut {\n @builtin(position) clip_pos: vec4f,\n @location(0) uv: vec2f,\n @location(1) point_color: vec4f,\n @location(2) @interpolate(flat) selected: u32,\n @location(3) @interpolate(flat) effective_opacity: f32,\n}\n\n// Triangle strip: 4 vertices forming a unit quad [-1, 1]²\nfn quad_vertex(vi: u32) -> vec2f {\n switch vi {\n case 0u: { return vec2f(-1.0, -1.0); }\n case 1u: { return vec2f( 1.0, -1.0); }\n case 2u: { return vec2f(-1.0, 1.0); }\n default: { return vec2f( 1.0, 1.0); }\n }\n}\n\n// Unpack RGBA8 from u32 (0xAABBGGRR little-endian)\nfn unpackColor(packed: u32) -> vec4f {\n let r = f32(packed & 0xFFu) / 255.0;\n let g = f32((packed >> 8u) & 0xFFu) / 255.0;\n let b = f32((packed >> 16u) & 0xFFu) / 255.0;\n let a = f32((packed >> 24u) & 0xFFu) / 255.0;\n return vec4f(r, g, b, a);\n}\n\n// PCG hash — fast, high-quality deterministic random from instance index.\n// Used for vertex-shader decimation when num_points > max_points.\nfn pcg_hash(input: u32) -> u32 {\n var state = input * 747796405u + 2891336453u;\n let word = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u;\n return (word >> 22u) ^ word;\n}\n\nfn random_float(seed: u32) -> f32 {\n return f32(pcg_hash(seed)) / 4294967295.0;\n}\n\n// ─── 2D Colormap helpers ──────────────────────────────────────────────────\n\n// Read f32 from the colorLut buffer (which stores u32). Used for 2D colormap LUT curves.\nfn lut_f32(index: u32) -> f32 {\n return bitcast<f32>(colorLut[index]);\n}\n\n// Linearly interpolate a 16-entry LUT curve stored in colorLut at the given base offset.\nfn lut_interp(base: u32, t: f32) -> f32 {\n let pos = t * 15.0;\n let lo = min(u32(floor(pos)), 14u);\n let hi = lo + 1u;\n return mix(lut_f32(base + lo), lut_f32(base + hi), fract(pos));\n}\n\n// Reconstruct a 2D colormap color from SVD rank-1 LUT curves stored in colorLut.\n// Layout: R_X[16] R_Y[16] G_X[16] G_Y[16] B_X[16] B_Y[16] B_X2[16] B_Y2[16]\nfn colormap2d_lut(u: f32, v: f32) -> vec3f {\n let r = lut_interp(0u, u) * lut_interp(16u, v);\n let g = lut_interp(32u, u) * lut_interp(48u, v);\n let b = lut_interp(64u, u) * lut_interp(80u, v)\n + lut_interp(96u, u) * lut_interp(112u, v); // rank-2 correction\n return clamp(vec3f(r, g, b), vec3f(0.0), vec3f(1.0));\n}\n\n// Oklab → linear sRGB conversion\nfn oklab_to_linear(L: f32, a: f32, b: f32) -> vec3f {\n let l_ = L + 0.3963377774 * a + 0.2158037573 * b;\n let m_ = L - 0.1055613458 * a - 0.0638541728 * b;\n let s_ = L - 0.0894841775 * a - 1.2914855480 * b;\n let l = l_ * l_ * l_;\n let m = m_ * m_ * m_;\n let s = s_ * s_ * s_;\n return vec3f(\n 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,\n -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,\n -0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s\n );\n}\n\n// Oklab polar 2D colormap: hue = angle, chroma = radius, lightness varies\nfn colormap2d_oklab_polar(u: f32, v: f32) -> vec3f {\n let cx = u - 0.5;\n let cy = v - 0.5;\n let radius = min(length(vec2f(cx, cy)) * 2.0, 1.0);\n let angle = atan2(cy, cx);\n let chroma = radius * 0.25;\n let lightness = 0.80 - radius * 0.30;\n let a_val = chroma * cos(angle);\n let b_val = chroma * sin(angle);\n let linear = oklab_to_linear(lightness, a_val, b_val);\n // Linear to sRGB gamma (approximate)\n return pow(clamp(linear, vec3f(0.0), vec3f(1.0)), vec3f(1.0 / 2.2));\n}\n\n// Dispatch 2D colormap by index\nfn colormap2d(map_index: u32, u: f32, v: f32) -> vec3f {\n if map_index == 6u {\n return colormap2d_oklab_polar(u, v);\n }\n return colormap2d_lut(u, v);\n}\n\n@vertex\nfn vs_main(\n @builtin(vertex_index) vi: u32,\n @builtin(instance_index) ii: u32,\n) -> VertOut {\n // Vertex-shader decimation: skip expensive projection for excess points.\n // Early exit before the ND projection loop saves ~50 cycles per rejected point.\n if (uni.max_points > 0u && uni.num_points > uni.max_points) {\n let threshold = f32(uni.max_points) / f32(uni.num_points);\n if (random_float(ii) > threshold) {\n var out: VertOut;\n out.clip_pos = vec4f(0.0, 0.0, 0.0, 0.0);\n out.uv = vec2f(0.0);\n out.point_color = vec4f(0.0);\n out.selected = 0u;\n out.effective_opacity = 0.0;\n return out;\n }\n }\n\n // Inline ND → 2D projection with pre-adjusted basis.\n // CPU folds normalization into the basis weights and biases so the\n // hot loop is just: x += raw * adjBasisX[d], y += raw * adjBasisY[d]\n // Must produce the same result as compute-projection.wgsl (used for lasso).\n let N = uni.num_points;\n let p = uni.num_dims;\n var x = uni.bias.x;\n var y = uni.bias.y;\n for (var d = 0u; d < p; d++) {\n let raw = data[d * N + ii];\n x += raw * adj_basis[d];\n y += raw * adj_basis[p + d];\n }\n\n // 3D camera rotation: project z-axis, rotate, then discard z (orthographic).\n if (camera.use_3d > 0.5) {\n var z = uni.bias_z;\n for (var d = 0u; d < p; d++) {\n z += data[d * N + ii] * adj_basis[2u * p + d];\n }\n let pos3 = vec3f(x, y, z);\n let rot = mat3x3f(camera.rot_col0, camera.rot_col1, camera.rot_col2);\n let rotated = rot * pos3;\n x = rotated.x;\n y = rotated.y;\n // z discarded — orthographic projection\n }\n\n // Apply camera: translate then scale, with aspect correction on x.\n // inset_zoom shrinks the scene to fit below the toolbar;\n // inset_offset_y shifts it down so it's centered in the visible area.\n let iz = camera.inset_zoom;\n let center = vec2f(\n (x + camera.pan_x) * camera.zoom * iz / camera.aspect,\n (y + camera.pan_y) * camera.zoom * iz + camera.inset_offset_y,\n );\n\n let q = quad_vertex(vi);\n // Clamp point size to [2, 32] pixels (physical).\n // min_ndc ensures points are always at least 2px — 1px quads can miss pixel\n // centers entirely depending on sub-pixel alignment, producing no fragments.\n let min_ndc = 4.0 / camera.viewport_height;\n let max_ndc = 64.0 / camera.viewport_height;\n let point_size = clamp(uni.point_size, min_ndc, max_ndc);\n // Aspect-correct the offset so circles stay circular on non-square canvases\n let offset = vec2f(q.x / camera.aspect, q.y) * (point_size * 0.5);\n\n // Scale opacity by zoom² to keep constant visual fill density (Reusser).\n // Only applied for auto-computed opacity; manual values are used as-is.\n let z = camera.zoom * camera.inset_zoom;\n let zoom_scale = select(1.0, z * z, uni.scale_opacity_by_zoom > 0.5);\n let eff_opacity = uni.opacity * zoom_scale;\n\n // Resolve per-point color from LUT\n var col: vec4f;\n if uni.color_mode == 1u {\n // Continuous: read raw value from color column, normalize, interpolate LUT\n let raw = data[uni.color_column_offset + ii];\n let inv_range = select(0.0, 1.0 / uni.color_range, uni.color_range > 0.0);\n let t = clamp((raw - uni.color_min) * inv_range, 0.0, 1.0);\n let stops = f32(uni.color_num_stops - 1u);\n let pos = t * stops;\n let idx = min(u32(floor(pos)), uni.color_num_stops - 2u);\n let frac = pos - f32(idx);\n let c0 = unpackColor(colorLut[idx]);\n let c1 = unpackColor(colorLut[idx + 1u]);\n col = mix(c0, c1, frac);\n } else if uni.color_mode == 2u {\n // Categorical: read category index, direct palette lookup\n let catIdx = catIndices[ii];\n col = unpackColor(colorLut[catIdx % uni.color_num_stops]);\n } else if uni.color_mode == 3u {\n // 2D colormap: read two columns, normalize to UV, look up from 2D colormap\n let raw_u = data[uni.color_column_offset + ii];\n let raw_v = data[uni.color_column_offset_v + ii];\n let inv_range_u = select(0.0, 1.0 / uni.color_range, uni.color_range > 0.0);\n let inv_range_v = select(0.0, 1.0 / uni.color_range_v, uni.color_range_v > 0.0);\n let u_val = clamp((raw_u - uni.color_min) * inv_range_u, 0.0, 1.0);\n let v_val = clamp((raw_v - uni.color_min_v) * inv_range_v, 0.0, 1.0);\n let rgb = colormap2d(uni.color2d_map_index, u_val, v_val);\n col = vec4f(rgb, 1.0);\n } else {\n col = uni.color;\n }\n\n // Read selection\n var sel: u32 = 1u;\n if uni.useSelectionMask > 0.5 {\n sel = (selectionMask[ii / 32u] >> (ii % 32u)) & 1u;\n }\n\n var out: VertOut;\n out.clip_pos = vec4f(center + offset, 0.0, 1.0);\n out.uv = q;\n out.point_color = col;\n out.selected = sel;\n out.effective_opacity = eff_opacity;\n return out;\n}\n\n// Shared fragment helper — computes edge, selection factor, and intensity.\nfn fragment_intensity(\n uv: vec2f,\n point_alpha: f32,\n selected: u32,\n effective_opacity: f32,\n) -> f32 {\n let dist = length(uv);\n // Smooth anti-aliased edge — naturally 0 for dist >= 1.0, so no discard needed.\n // Avoiding discard preserves early-Z and SIMD wavefront occupancy.\n let edge = 1.0 - smoothstep(0.75, 1.0, dist);\n\n // Selection: boost selected, dim unselected\n var sel_factor = 1.0;\n if uni.useSelectionMask > 0.5 {\n if selected == 0u {\n sel_factor = 0.1;\n } else {\n sel_factor = 1.0 / max(effective_opacity, 0.01);\n }\n }\n\n return edge * effective_opacity * point_alpha * sel_factor;\n}\n\n// ─── Fragment: single-target (additive / subtractive) ──────────────────────\n\n@fragment\nfn fs_main(\n @location(0) uv: vec2f,\n @location(1) point_color: vec4f,\n @location(2) @interpolate(flat) selected: u32,\n @location(3) @interpolate(flat) effective_opacity: f32,\n) -> @location(0) vec4f {\n let intensity = fragment_intensity(uv, point_color.a, selected, effective_opacity);\n // Subtractive mode (Reusser): output complement color so that\n // reverse-subtract blend (dst - src) on a white bg yields the correct hue.\n let rgb = select(point_color.rgb, vec3f(1.0) - point_color.rgb, uni.useSubtractive > 0.5);\n return vec4f(rgb * intensity, intensity);\n}\n`,C=`// Fullscreen tone-map pass — reads an HDR float texture and maps to [0,1]\n// for the canvas. Uses a single oversized triangle (3 vertices, no vertex\n// buffer) to cover the viewport.\n//\n// Mode 0 (additive): per-channel exponential compression 1-exp(-x).\n// Preserves hue ratios, dense regions desaturate toward white.\n// Mode 1 (normal / subtractive): simple clamp to [0,1].\n// Values are already bounded; tone mapping is identity.\n\nstruct Params {\n mode: f32,\n}\n\n@group(0) @binding(0) var hdrTexture: texture_2d<f32>;\n@group(0) @binding(1) var<uniform> params: Params;\n\n@vertex\nfn vs(@builtin(vertex_index) vi: u32) -> @builtin(position) vec4f {\n // Oversized triangle covering the full clip space:\n // vi=0 → (-1, -1) vi=1 → (3, -1) vi=2 → (-1, 3)\n let x = f32(i32(vi) / 2) * 4.0 - 1.0;\n let y = f32(i32(vi) % 2) * 4.0 - 1.0;\n return vec4f(x, y, 0.0, 1.0);\n}\n\n@fragment\nfn fs(@builtin(position) pos: vec4f) -> @location(0) vec4f {\n let hdr = textureLoad(hdrTexture, vec2u(pos.xy), 0);\n\n var mapped: vec3f;\n if params.mode < 0.5 {\n // Additive: exponential compression preserving density structure\n mapped = 1.0 - exp(-hdr.rgb);\n } else {\n // Normal / Subtractive: values already in [0,1], just clamp\n mapped = clamp(hdr.rgb, vec3f(0.0), vec3f(1.0));\n }\n return vec4f(mapped, 1.0);\n}\n`;const w={pointSize:.012,opacity:.7,color:[.25,.5,.9],scaleOpacityByZoom:!0},T={useSelectionMask:!1},E={mode:0,columnOffset:0,min:0,range:1,numStops:0,columnOffsetV:0,minV:0,rangeV:1,mapIndex:0},te={panX:0,panY:0,zoom:1,aspect:1,viewportHeight:1,insetOffsetY:0,insetZoom:1,use3d:!1,rotation:null},D=new ArrayBuffer(96),O=new Float32Array(D),k=new Uint32Array(D),A=new Float32Array(80/4),j=new Float32Array(4),ne=(e,t=`rgba32float`)=>{let n=e.createShaderModule({label:`point-shader`,code:S}),r=e.createBindGroupLayout({label:`point-bgl`,entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:`uniform`}},{binding:1,visibility:GPUShaderStage.VERTEX,buffer:{type:`read-only-storage`}},{binding:2,visibility:GPUShaderStage.VERTEX,buffer:{type:`uniform`}},{binding:3,visibility:GPUShaderStage.VERTEX,buffer:{type:`read-only-storage`}},{binding:4,visibility:GPUShaderStage.VERTEX,buffer:{type:`read-only-storage`}},{binding:5,visibility:GPUShaderStage.VERTEX,buffer:{type:`read-only-storage`}},{binding:6,visibility:GPUShaderStage.VERTEX,buffer:{type:`read-only-storage`}}]}),i=e.createPipelineLayout({bindGroupLayouts:[r]}),a=e.createRenderPipeline({label:`point-pipeline-additive`,layout:i,vertex:{module:n,entryPoint:`vs_main`},fragment:{module:n,entryPoint:`fs_main`,targets:[{format:t,blend:{color:{srcFactor:`one`,dstFactor:`one`},alpha:{srcFactor:`zero`,dstFactor:`one`}}}]},primitive:{topology:`triangle-strip`}}),o=e.createRenderPipeline({label:`point-pipeline-normal`,layout:i,vertex:{module:n,entryPoint:`vs_main`},fragment:{module:n,entryPoint:`fs_main`,targets:[{format:t,blend:{color:{srcFactor:`one`,dstFactor:`one-minus-src-alpha`},alpha:{srcFactor:`one`,dstFactor:`one-minus-src-alpha`}}}]},primitive:{topology:`triangle-strip`}}),s=e.createRenderPipeline({label:`point-pipeline-subtractive`,layout:i,vertex:{module:n,entryPoint:`vs_main`},fragment:{module:n,entryPoint:`fs_main`,targets:[{format:t,blend:{color:{operation:`reverse-subtract`,srcFactor:`one`,dstFactor:`one`},alpha:{srcFactor:`zero`,dstFactor:`one`}}}]},primitive:{topology:`triangle-strip`}}),c=e.createBuffer({label:`point-uniforms`,size:96,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),l=e.createBuffer({label:`camera-uniforms`,size:80,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),u=e.createBuffer({label:`default-color-lut-buf`,size:4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),d=e.createBuffer({label:`default-selection-buf`,size:4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),f=e.createBuffer({label:`default-cat-indices-buf`,size:4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});return M(e,c,w,T,E),re(e,l,te),{additivePipeline:a,normalPipeline:o,subtractivePipeline:s,bindGroupLayout:r,uniformBuffer:c,cameraBuffer:l,defaultColorLutBuffer:u,defaultSelectionBuffer:d,defaultCatIndicesBuffer:f}},M=(e,t,n,r=T,i=E,a=!1,o=0,s=0,c=0,l=0,u=0,d=0)=>{O[0]=n.pointSize,O[1]=n.opacity,k[2]=i.mode,O[3]=r.useSelectionMask?1:0,O[4]=n.color[0],O[5]=n.color[1],O[6]=n.color[2],O[7]=1,O[8]=a?1:0,k[9]=o,k[10]=s,k[11]=u,O[12]=c,O[13]=l,k[14]=i.columnOffset,O[15]=i.min,O[16]=i.range,k[17]=i.numStops,O[18]=d,k[19]=i.columnOffsetV,O[20]=i.minV,O[21]=i.rangeV,k[22]=i.mapIndex,O[23]=n.scaleOpacityByZoom?1:0,e.queue.writeBuffer(t,0,D)},re=(e,t,n)=>{A[0]=n.panX,A[1]=n.panY,A[2]=n.zoom,A[3]=n.aspect,A[4]=n.viewportHeight,A[5]=n.insetOffsetY,A[6]=n.insetZoom,A[7]=n.use3d?1:0;let r=n.rotation;A[8]=r?r[0]:1,A[9]=r?r[1]:0,A[10]=r?r[2]:0,A[11]=0,A[12]=r?r[3]:0,A[13]=r?r[4]:1,A[14]=r?r[5]:0,A[15]=0,A[16]=r?r[6]:0,A[17]=r?r[7]:0,A[18]=r?r[8]:1,A[19]=0,e.queue.writeBuffer(t,0,A)},ie=(e,t,n,r,i,a,o,s,c)=>e.createBindGroup({label:`point-bg`,layout:t,entries:[{binding:0,resource:{buffer:n}},{binding:1,resource:{buffer:r}},{binding:2,resource:{buffer:i}},{binding:3,resource:{buffer:a}},{binding:4,resource:{buffer:o}},{binding:5,resource:{buffer:s}},{binding:6,resource:{buffer:c}}]}),ae=(e,t,n)=>{j[0]=n,e.queue.writeBuffer(t,0,j,0,1)},oe=(e,t)=>{let n=e.createShaderModule({label:`tonemap-shader`,code:C}),r=e.createBindGroupLayout({label:`tonemap-bgl`,entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:`unfilterable-float`}},{binding:1,visibility:GPUShaderStage.FRAGMENT,buffer:{type:`uniform`}}]});return{pipeline:e.createRenderPipeline({label:`tonemap-pipeline`,layout:e.createPipelineLayout({bindGroupLayouts:[r]}),vertex:{module:n,entryPoint:`vs`},fragment:{module:n,entryPoint:`fs`,targets:[{format:t}]},primitive:{topology:`triangle-list`}}),bindGroupLayout:r,paramsBuffer:e.createBuffer({label:`tonemap-params`,size:4,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST})}},se=(e,t,n,r)=>e.createBindGroup({label:`tonemap-bg`,layout:t,entries:[{binding:0,resource:n},{binding:1,resource:{buffer:r}}]});var ce=`// ND → 2D projection compute shader (used only for lasso selection readback)\n//\n// Reads p-dimensional point data from a single concatenated storage buffer\n// (column-major: dim0[0..N], dim1[0..N], ..., dimP[0..N]),\n// normalizes each dimension using per-dim [center, range] params,\n// and projects to 2D using the supplied p×2 basis matrix.\n//\n// Output: N interleaved [x, y] pairs in the projected buffer.\n//\n// IMPORTANT: This must stay mathematically equivalent to the render-path\n// projection in point.wgsl + computeAdjustedBasis() in worker.ts.\n// The render path folds normalization into the basis on CPU (adj_basis, bias)\n// while this shader normalizes per-point on GPU. Both produce identical\n// projected coordinates: ((raw - center) / range) * basis * viewport_scale.\n\nstruct Params {\n num_points: u32,\n num_dims: u32,\n viewport_scale: f32,\n _pad: f32,\n}\n\n@group(0) @binding(0) var<uniform> params: Params;\n@group(0) @binding(1) var<storage, read> data: array<f32>;\n// norm_params[d] = vec2f(center, range) for dimension d\n@group(0) @binding(2) var<storage, read> norm_params: array<vec2f>;\n// basis: column-major p×2 — first p floats = x-weights, next p = y-weights\n@group(0) @binding(3) var<storage, read> basis: array<f32>;\n@group(0) @binding(4) var<storage, read_write> projected: array<f32>;\n\n@compute @workgroup_size(256)\nfn project(@builtin(global_invocation_id) gid: vec3u) {\n let i = gid.x;\n if (i >= params.num_points) { return; }\n\n let N = params.num_points;\n let p = params.num_dims;\n\n var x = 0.0;\n var y = 0.0;\n\n for (var d = 0u; d < p; d++) {\n let raw = data[d * N + i];\n let np = norm_params[d];\n let range = max(np.y, 1e-6);\n let v = (raw - np.x) / range;\n\n x += v * basis[d];\n y += v * basis[p + d];\n }\n\n projected[i * 2u] = x * params.viewport_scale;\n projected[i * 2u + 1u] = y * params.viewport_scale;\n}\n`;const le=e=>{let t=e.createShaderModule({label:`compute-projection`,code:ce}),n=e.createBindGroupLayout({label:`projection-bgl`,entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:`uniform`}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}}]});return{pipeline:e.createComputePipeline({label:`projection-pipeline`,layout:e.createPipelineLayout({bindGroupLayouts:[n]}),compute:{module:t,entryPoint:`project`}}),bindGroupLayout:n,paramsBuffer:e.createBuffer({label:`projection-params`,size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST})}},ue=(e,t,n,r,i)=>{let a=new ArrayBuffer(16),o=new Uint32Array(a),s=new Float32Array(a);o[0]=n,o[1]=r,s[2]=i,s[3]=0,e.queue.writeBuffer(t,0,a)},de=(e,t,n)=>({dataBuffer:e.createBuffer({label:`nd-data`,size:t*n*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC}),normParamsBuffer:e.createBuffer({label:`norm-params`,size:n*8,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),basisBuffer:e.createBuffer({label:`basis`,size:n*2*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),projectedBuffer:e.createBuffer({label:`projected`,size:t*2*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC}),bindGroup:null}),fe=(e,t,n,r)=>e.createBindGroup({label:`projection-bg`,layout:t,entries:[{binding:0,resource:{buffer:n}},{binding:1,resource:{buffer:r.dataBuffer}},{binding:2,resource:{buffer:r.normParamsBuffer}},{binding:3,resource:{buffer:r.basisBuffer}},{binding:4,resource:{buffer:r.projectedBuffer}}]}),pe=(e,t,n,r)=>{let i=e.createCommandEncoder({label:`projection-dispatch`}),a=i.beginComputePass({label:`project-points`});return a.setPipeline(t.pipeline),a.setBindGroup(0,n),a.dispatchWorkgroups(Math.ceil(r/256)),a.end(),i.finish()};var me=`// Residual-PC compute shader — two-pass reduction.\n//\n// Computes the covariance matrix of the residual after projecting out\n// the current p×2 tour basis. The top eigenvector of this covariance\n// is the \"most informative direction not currently visible.\"\n//\n// Pass 1 (reduce_partial): each workgroup reduces its chunk of N points\n// into partial sums for p means + p*(p+1)/2 upper-triangle cross-products\n// of the per-point residuals.\n//\n// Pass 2 (final_reduce): one workgroup sums all partial sums → final\n// mean-corrected covariance. Result layout:\n// [mean_0 .. mean_{p-1}, cov_00, cov_01, ..., cov_{p-1,p-1}]\n// where the covariance entries are the upper triangle packed as:\n// index(d1,d2) = d1*p - d1*(d1-1)/2 + (d2-d1) (d2 >= d1)\n//\n// Power iteration (15 steps) is performed on the CPU after readback;\n// p is always small (≤64) so this is negligible.\n\nstruct Params {\n num_points: u32,\n num_dims: u32,\n num_workgroups: u32,\n _pad: u32,\n}\n\n@group(0) @binding(0) var<uniform> params: Params;\n@group(0) @binding(1) var<storage, read> data: array<f32>;\n@group(0) @binding(2) var<storage, read> norm_params: array<vec2f>;\n// basis: column-major p×2 — first p floats = x-weights, next p = y-weights\n@group(0) @binding(3) var<storage, read> basis: array<f32>;\n@group(0) @binding(4) var<storage, read_write> partials: array<f32>;\n@group(0) @binding(5) var<storage, read_write> result: array<f32>;\n\nconst WG: u32 = 256u;\nconst MAX_DIMS: u32 = 64u;\n\nvar<workgroup> wg_reduce: array<f32, 256>;\n\nfn cov_idx(d: u32, d1: u32, d2: u32) -> u32 {\n return d1 * d - d1 * (d1 - 1u) / 2u + (d2 - d1);\n}\n\n// ─── Pass 1: per-workgroup partial sums ─────────────────────────────────────\n\n@compute @workgroup_size(256)\nfn reduce_partial(\n @builtin(global_invocation_id) gid: vec3u,\n @builtin(local_invocation_id) lid: vec3u,\n @builtin(workgroup_id) wid: vec3u,\n) {\n let N = params.num_points;\n let d = min(params.num_dims, MAX_DIMS);\n let num_cov = d * (d + 1u) / 2u;\n let num_terms = d + num_cov;\n let i = gid.x;\n let valid = i < N;\n\n // Load normalized values into registers, then project out the 2D basis.\n var vals: array<f32, 64>;\n if (valid) {\n var dot_x = 0.0;\n var dot_y = 0.0;\n for (var dim = 0u; dim < d; dim++) {\n let raw = data[dim * N + i];\n let np = norm_params[dim];\n let range = max(np.y, 1e-6);\n let norm = (raw - np.x) / range;\n vals[dim] = norm;\n dot_x += norm * basis[dim];\n dot_y += norm * basis[d + dim];\n }\n // Subtract projection onto span{bx, by} → residual is orthogonal to basis\n for (var dim = 0u; dim < d; dim++) {\n vals[dim] -= dot_x * basis[dim] + dot_y * basis[d + dim];\n }\n }\n\n // Reduce mean terms (used for mean-correction in pass 2)\n for (var dim = 0u; dim < d; dim++) {\n wg_reduce[lid.x] = select(0.0, vals[dim], valid);\n workgroupBarrier();\n for (var s = WG / 2u; s > 0u; s >>= 1u) {\n if (lid.x < s) { wg_reduce[lid.x] += wg_reduce[lid.x + s]; }\n workgroupBarrier();\n }\n if (lid.x == 0u) {\n partials[wid.x * num_terms + dim] = wg_reduce[0];\n }\n }\n\n // Reduce upper-triangle cross-products\n for (var d1 = 0u; d1 < d; d1++) {\n for (var d2 = d1; d2 < d; d2++) {\n wg_reduce[lid.x] = select(0.0, vals[d1] * vals[d2], valid);\n workgroupBarrier();\n for (var s = WG / 2u; s > 0u; s >>= 1u) {\n if (lid.x < s) { wg_reduce[lid.x] += wg_reduce[lid.x + s]; }\n workgroupBarrier();\n }\n if (lid.x == 0u) {\n partials[wid.x * num_terms + d + cov_idx(d, d1, d2)] = wg_reduce[0];\n }\n }\n }\n}\n\n// ─── Pass 2: reduce across workgroups → final mean-corrected covariance ─────\n\n@compute @workgroup_size(256)\nfn final_reduce(@builtin(local_invocation_id) lid: vec3u) {\n let d = min(params.num_dims, MAX_DIMS);\n let num_cov = d * (d + 1u) / 2u;\n let num_terms = d + num_cov;\n let nwg = params.num_workgroups;\n let N_f32 = f32(params.num_points);\n\n for (var t = 0u; t < num_terms; t++) {\n var sum = 0.0;\n var w = lid.x;\n while (w < nwg) {\n sum += partials[w * num_terms + t];\n w += WG;\n }\n wg_reduce[lid.x] = sum;\n workgroupBarrier();\n for (var s = WG / 2u; s > 0u; s >>= 1u) {\n if (lid.x < s) { wg_reduce[lid.x] += wg_reduce[lid.x + s]; }\n workgroupBarrier();\n }\n if (lid.x == 0u) { result[t] = wg_reduce[0] / N_f32; }\n workgroupBarrier();\n }\n\n // Mean-corrected covariance: cov(X,Y) = E[XY] - E[X]*E[Y]\n if (lid.x == 0u) {\n for (var d1 = 0u; d1 < d; d1++) {\n for (var d2 = d1; d2 < d; d2++) {\n let ci = cov_idx(d, d1, d2);\n result[d + ci] -= result[d1] * result[d2];\n }\n }\n }\n}\n`;const he=e=>{let t=e.createShaderModule({label:`compute-residual-pc`,code:me}),n=e.createBindGroupLayout({label:`residual-pc-bgl`,entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:`uniform`}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}},{binding:5,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}}]}),r=e.createPipelineLayout({bindGroupLayouts:[n]});return{partialPipeline:e.createComputePipeline({label:`residual-pc-partial`,layout:r,compute:{module:t,entryPoint:`reduce_partial`}}),finalPipeline:e.createComputePipeline({label:`residual-pc-final`,layout:r,compute:{module:t,entryPoint:`final_reduce`}}),bindGroupLayout:n,paramsBuffer:e.createBuffer({label:`residual-pc-params`,size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST})}},ge=async(e,t,n,r,i,a,o,s)=>{let c=Math.min(s,64),l=c+c*(c+1)/2,u=Math.ceil(o/256),d=new ArrayBuffer(16),f=new Uint32Array(d);f[0]=o,f[1]=c,f[2]=u,f[3]=0,e.queue.writeBuffer(t.paramsBuffer,0,d);let p=e.createBuffer({label:`residual-pc-partials`,size:u*l*4,usage:GPUBufferUsage.STORAGE}),m=e.createBuffer({label:`residual-pc-result`,size:l*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC}),h=e.createBuffer({label:`residual-pc-readback`,size:l*4,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),g=e.createBindGroup({label:`residual-pc-bg`,layout:t.bindGroupLayout,entries:[{binding:0,resource:{buffer:t.paramsBuffer}},{binding:1,resource:{buffer:n}},{binding:2,resource:{buffer:r}},{binding:3,resource:{buffer:i}},{binding:4,resource:{buffer:p}},{binding:5,resource:{buffer:m}}]}),_=e.createCommandEncoder({label:`residual-pc`}),v=_.beginComputePass({label:`residual-pc-partial`});v.setPipeline(t.partialPipeline),v.setBindGroup(0,g),v.dispatchWorkgroups(u),v.end();let y=_.beginComputePass({label:`residual-pc-final`});y.setPipeline(t.finalPipeline),y.setBindGroup(0,g),y.dispatchWorkgroups(1),y.end(),_.copyBufferToBuffer(m,0,h,0,l*4),e.queue.submit([_.finish()]),await h.mapAsync(GPUMapMode.READ);let b=new Float32Array(h.getMappedRange()).slice();return h.unmap(),p.destroy(),m.destroy(),h.destroy(),_e(b,c,s,a)},_e=(e,t,n,r)=>{let i=new Float64Array(t*t);for(let n=0;n<t;n++)for(let r=n;r<t;r++){let a=e[t+(n*t-n*(n-1)/2+(r-n))];i[n*t+r]=a,i[r*t+n]=a}let a=new Float64Array(t),o=new Float64Array(t);for(let e=0;e<t;e++)a[e]=r[e],o[e]=r[n+e];let s=new Float64Array(t);for(let e=0;e<t;e++)s[e]=1;N(s,a,o,t),P(s,t);let c=new Float64Array(t);for(let e=0;e<15;e++){for(let e=0;e<t;e++){let n=0;for(let r=0;r<t;r++)n+=i[e*t+r]*s[r];c[e]=n}N(c,a,o,t),P(c,t);let e=s;s=c,c=e}let l=new Float32Array(n);for(let e=0;e<t;e++)l[e]=s[e];return l},N=(e,t,n,r)=>{let i=0,a=0;for(let o=0;o<r;o++)i+=e[o]*t[o],a+=e[o]*n[o];for(let o=0;o<r;o++)e[o]=e[o]-(i*t[o]+a*n[o])},P=(e,t)=>{let n=0;for(let r=0;r<t;r++)n+=e[r]*e[r];if(n=Math.sqrt(n),n>1e-12)for(let r=0;r<t;r++)e[r]=e[r]/n};let F=null,I=[],L=null;const R=(e,t)=>{self.postMessage(e,t??[])},ve=(e,t,n,r,i,a)=>{if(e===0||t===0||n===0)return{pointSize:.012,opacity:.7};let o=n*r,s=o*o*i/e,c=Math.sqrt(s/Math.PI),l=a*r*.5,u,d;return c>=l?(u=c,d=1):(u=l,d=Math.max(.01,s/(Math.PI*l*l))),{pointSize:2*u/o,opacity:d}},ye=(e,t)=>e*F.dpr/t,be=e=>{let{style:t,numPoints:n,dpr:r}=F;if(t.pointSize!==`auto`&&t.opacity!==`auto`)return{pointSize:ye(t.pointSize,e.height),opacity:t.opacity,color:t.color,scaleOpacityByZoom:!1};let i=ve(n,e.width/r,e.height/r,r,t.fillTarget,t.minPointSize),a=t.opacity===`auto`;return{pointSize:t.pointSize===`auto`?i.pointSize:ye(t.pointSize,e.height),opacity:a?i.opacity:t.opacity,color:t.color,scaleOpacityByZoom:a}},xe=()=>{let{device:e,mainView:t,tonemapPipeline:n}=F,{width:r,height:i}=t.canvas,a=F.mainHdrTexture;if(a&&a.width===r&&a.height===i)return;a?.destroy();let o=e.createTexture({label:`hdr-main`,size:[r,i],format:F.hdrFormat,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),s=o.createView();F.mainHdrTexture=o,F.mainHdrTextureView=s,F.mainTonemapBindGroup=se(e,n.bindGroupLayout,s,n.paramsBuffer)},Se=()=>{if(!F.previewGpuCanvas)return;let{device:e,tonemapPipeline:t}=F,{width:n,height:r}=F.previewGpuCanvas,i=F.previewHdrTexture;if(i&&i.width===n&&i.height===r)return;i?.destroy();let a=e.createTexture({label:`hdr-preview`,size:[n,r],format:F.hdrFormat,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),o=a.createView();F.previewHdrTexture=a,F.previewHdrTextureView=o,F.previewTonemapBindGroup=se(e,t.bindGroupLayout,o,t.paramsBuffer)},Ce=e=>Math.ceil(e/32)*4,we=()=>{if(!F)throw Error(`state not initialized`);let e=Ce(F.numPoints);return(!F.selectionBuffer||F.selectionBuffer.size!==e)&&(F.selectionBuffer?.destroy(),F.selectionBuffer=F.device.createBuffer({label:`selection-mask`,size:e,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST})),F.selectionBuffer};let z=null;const Te=(e,t,n,r,i=2)=>{let a=r*i;(!z||z.length!==a)&&(z=new Float32Array(a));let o=0,s=0,c=0;for(let a=0;a<r;a++){let l=Math.max(n[a],1e-6),u=e[a],d=e[r+a],f=2/l;z[a]=u*f,z[r+a]=d*f;let p=-t[a]/l;if(o+=p*u*2,s+=p*d*2,i===3){let t=e[2*r+a];z[2*r+a]=t*f,c+=p*t*2}}return{weights:z,biasX:o,biasY:s,biasZ:c}},Ee=()=>{if(!F?.normMins||!F?.normRanges)return null;let e=F.numDims,t=new Float32Array(e);if(F.centering===`mean`&&F.normMeans)t.set(F.normMeans);else for(let n=0;n<e;n++)t[n]=F.normMins[n]+F.normRanges[n]*.5;return t},B=()=>{if(!F?.projectionResources||!F.normRanges)return;let e=F.numDims,t=Ee();if(!t)return;let n=new Float32Array(e*2);for(let r=0;r<e;r++)n[r*2]=t[r],n[r*2+1]=F.normRanges[r];F.device.queue.writeBuffer(F.projectionResources.normParamsBuffer,0,n)};let V=null,De=0,H=!0,U=!1;const W=()=>H?(H=!1,U=!1,J(),F.device.queue.onSubmittedWorkDone().then(()=>{H=!0,U&&F&&!V&&(U=!1,W())},()=>{H=!0,R({type:`error`,message:`WebGPU device lost during rendering`})}),!0):(U=!0,!1),Oe=e=>{if(!V||!F?.tour)return;let t=V.prevTime===null?void 0:e-V.prevTime;if(t!==void 0){let e=t/1e3*V.speed*V.direction/20,n=F.tour.position+e;n-=Math.floor(n),F.tour.position=n}V.prevTime=e,F.directBasis=null,W()&&(V.lastRenderedRafTime!==null&&V.frameTimes.push(e-V.lastRenderedRafTime),V.lastRenderedRafTime=e),e-De>=33&&(R({type:`playbackTick`,position:F.tour.position,frameMs:t}),De=e),V.rafId=requestAnimationFrame(Oe)},ke=(e,t)=>{V?(V.speed=e,V.direction=t):(H=!0,V={speed:e,direction:t,prevTime:null,rafId:0,frameTimes:[],lastRenderedRafTime:null},V.rafId=requestAnimationFrame(Oe))},Ae=()=>{if(V){cancelAnimationFrame(V.rafId),F?.tour&&R({type:`playbackTick`,position:F.tour.position});let e=Float64Array.from(V.frameTimes);R({type:`playbackStopped`,frameTimes:e},[e.buffer]),V=null}},G=(e,t,n,r,i,a)=>{if(!F?.projectionResources||!F.adjBasisBuffer||!F.normRanges)return;let{device:c,numPoints:l,numDims:u}=F,d=F.is3dActive&&F.residualPC,f=d?3:2,p;d?(p=new Float32Array(u*3),p.set(e.subarray(0,u*2)),p.set(F.residualPC,u*2)):p=e;let m=Ee();if(!m)return;let{weights:h,biasX:g,biasY:_,biasZ:v}=Te(p,m,F.normRanges,u,f),y=u*f*4;F.adjBasisBuffer.size<y&&(F.adjBasisBuffer.destroy(),F.adjBasisBuffer=c.createBuffer({label:`adj-basis`,size:y,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),Y()),c.queue.writeBuffer(F.adjBasisBuffer,0,h);let b=be(t.canvas),x=F.backgroundColor,ee=.2126*x[0]+.7152*x[1]+.0722*x[2],S=F.colorState.mode>0,C=!S&&ee>.5,w,T;S?(w=F.pointPipeline.normalPipeline,T=1):C?(w=F.pointPipeline.subtractivePipeline,T=1):(w=F.pointPipeline.additivePipeline,T=0),M(c,F.pointPipeline.uniformBuffer,b,F.styleFlags,F.colorState,C,l,u,g,_,F.maxPoints,v),ae(c,F.tonemapPipeline.paramsBuffer,T);let E=t.canvas,te=E.width/E.height||1;re(c,F.pointPipeline.cameraBuffer,{...i,aspect:te,viewportHeight:E.height});let D=c.createCommandEncoder({label:`render-frame`});o(D,n,w,a,l,x),s(D,t,F.tonemapPipeline.pipeline,r),c.queue.submit([D.finish()])},je={panX:0,panY:0,zoom:1,aspect:1,viewportHeight:1,insetOffsetY:0,insetZoom:1,use3d:!1,rotation:null},Me=()=>{!F||F.previewGpuCanvas||(F.previewGpuCanvas=new OffscreenCanvas(300,300),F.previewGpuView=i(F.previewGpuCanvas,F.device))};let K=!1;const Ne=(e,t)=>{if(!F?.projectionResources||!F.renderBindGroup)return;let n=F.previewCanvases.get(e);n&&(Me(),Se(),!(!F.previewGpuView||!F.previewHdrTextureView||!F.previewTonemapBindGroup)&&((F.previewGpuCanvas.width!==n.canvas.width||F.previewGpuCanvas.height!==n.canvas.height)&&(F.previewGpuCanvas.width=n.canvas.width,F.previewGpuCanvas.height=n.canvas.height,Se(),!F.previewHdrTextureView||!F.previewTonemapBindGroup)||(G(t,F.previewGpuView,F.previewHdrTextureView,F.previewTonemapBindGroup,je,F.renderBindGroup),n.ctx2d.drawImage(F.previewGpuCanvas,0,0),R({type:`rendered`,viewIndex:e}))))},Pe=()=>{if(!F?.projectionResources||!F.tour)return;let{tour:e,previewCanvases:t}=F;for(let[n]of t)n<e.bases.length&&Ne(n,e.bases[n])},Fe=()=>{K||(K=!0,setTimeout(()=>{K=!1,Pe()},0))},q=()=>{F?.projectionResources&&(J(),Fe())},J=()=>{if(!F?.projectionResources||!F.renderBindGroup||(xe(),!F.mainHdrTextureView||!F.mainTonemapBindGroup))return;if(F.directBasis){G(F.directBasis,F.mainView,F.mainHdrTextureView,F.mainTonemapBindGroup,F.camera,F.renderBindGroup),R({type:`rendered`,viewIndex:0});return}if(!F.tour)return;let{tour:e}=F;h(e.interpolatedBasis,e.bases,e.arcLengths,e.dims,e.position,e.orthonormalize),G(e.interpolatedBasis,F.mainView,F.mainHdrTextureView,F.mainTonemapBindGroup,F.camera,F.renderBindGroup),R({type:`rendered`,viewIndex:0})},Y=()=>{if(!F?.projectionResources||!F.adjBasisBuffer)return;let{device:e,projectionPipeline:t,pointPipeline:n,projectionResources:r}=F,i=F.colorLutBuffer??n.defaultColorLutBuffer,a=F.selectionBuffer??n.defaultSelectionBuffer,o=n.defaultCatIndicesBuffer;F.colorState.mode===2&&F.activeCatColumnName&&(o=F.categoricalBuffers.get(F.activeCatColumnName)??o),F.projectionBindGroup=fe(e,t.bindGroupLayout,t.paramsBuffer,r),F.renderBindGroup=ie(e,n.bindGroupLayout,n.uniformBuffer,r.dataBuffer,n.cameraBuffer,i,a,F.adjBasisBuffer,o)},X=()=>{F&&(Y(),(F.tour||F.directBasis)&&F.projectionResources&&q())},Ie=()=>{F&&(F.styleFlags.useSelectionMask=!0,Y(),(F.tour||F.directBasis)&&F.projectionResources&&q())};let Z=0;const Le=e=>{if(!F)return;let{device:t}=F;if(e.data.type===`setColorContinuous`){if(e.data.dataVersion!==Z)return;let{columnIndex:n,min:r,range:i,colormap:a}=e.data;F.colorLutBuffer?.destroy(),F.colorLutBuffer=t.createBuffer({label:`color-lut`,size:a.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),t.queue.writeBuffer(F.colorLutBuffer,0,a),F.colorState={mode:1,columnOffset:n*F.numPoints,min:r,range:i,numStops:a.length,columnOffsetV:0,minV:0,rangeV:1,mapIndex:0},F.activeCatColumnName=null,X();return}if(e.data.type===`setColorCategorical`){if(e.data.dataVersion!==Z)return;let{catColumnName:n,palette:r}=e.data;if(!F.categoricalBuffers.has(n))return;F.colorLutBuffer?.destroy(),F.colorLutBuffer=t.createBuffer({label:`color-lut`,size:r.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),t.queue.writeBuffer(F.colorLutBuffer,0,r),F.colorState={mode:2,columnOffset:0,min:0,range:1,numStops:r.length,columnOffsetV:0,minV:0,rangeV:1,mapIndex:0},F.activeCatColumnName=n,X();return}if(e.data.type===`setColor2D`){if(e.data.dataVersion!==Z)return;let{columnIndexX:n,columnIndexY:r,minX:i,rangeX:a,minY:o,rangeY:s,lut:c,mapIndex:l}=e.data;c&&(F.colorLutBuffer?.destroy(),F.colorLutBuffer=t.createBuffer({label:`color-lut-2d`,size:c.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),t.queue.writeBuffer(F.colorLutBuffer,0,c)),F.colorState={mode:3,columnOffset:n*F.numPoints,min:i,range:a,numStops:0,columnOffsetV:r*F.numPoints,minV:o,rangeV:s,mapIndex:l},F.activeCatColumnName=null,X();return}if(e.data.type===`selectContinuous`){if(e.data.dataVersion!==Z||!F.projectionResources)return;let{columnIndex:n,ranges:r}=e.data,{numPoints:i,colorPipelines:a}=F,o=we(),s=t.createBuffer({label:`select-ranges`,size:Math.max(r.byteLength,4),usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});t.queue.writeBuffer(s,0,r),b(t,a.paramsBuffer,i,n*i,r.length/2);let c=y(t,a.bindGroupLayout,F.projectionResources.dataBuffer,s,o,a.paramsBuffer),l=t.createCommandEncoder({label:`select-continuous`});l.clearBuffer(o,0,o.size);let u=l.beginComputePass({label:`select-continuous`});u.setPipeline(a.selectContinuous),u.setBindGroup(0,c),u.dispatchWorkgroups(Math.ceil(i/256)),u.end(),t.queue.submit([l.finish()]),s.destroy(),Ie();return}if(e.data.type===`selectCategorical`){if(e.data.dataVersion!==Z)return;let{catColumnName:n,selectedLabels:r}=e.data,i=F.categoricalBuffers.get(n);if(!i)return;let{numPoints:a,colorPipelines:o}=F,s=we(),c=t.createBuffer({label:`selected-labels`,size:Math.max(r.byteLength,4),usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});t.queue.writeBuffer(c,0,r),x(t,o.paramsBuffer,a,r.length);let l=y(t,o.bindGroupLayout,i,c,s,o.paramsBuffer),u=t.createCommandEncoder({label:`select-categorical`});u.clearBuffer(s,0,s.size);let d=u.beginComputePass({label:`select-categorical`});d.setPipeline(o.selectCategorical),d.setBindGroup(0,l),d.dispatchWorkgroups(Math.ceil(a/256)),d.end(),t.queue.submit([u.finish()]),c.destroy(),Ie();return}if(e.data.type!==`data`)return;let{dataVersion:n,dims:r,rows:i,buffers:a,mins:o,ranges:s,means:c,categoricalColumns:l}=e.data;if(Z=n,r<2||i===0||a.length<2){R({type:`error`,message:`Need at least 2 dimensions to render`});return}F.projectionResources&&(F.projectionResources.dataBuffer.destroy(),F.projectionResources.normParamsBuffer.destroy(),F.projectionResources.basisBuffer.destroy(),F.projectionResources.projectedBuffer.destroy()),F.adjBasisBuffer&&(F.adjBasisBuffer.destroy(),F.adjBasisBuffer=null),F.colorLutBuffer&&(F.colorLutBuffer.destroy(),F.colorLutBuffer=null),F.selectionBuffer&&(F.selectionBuffer.destroy(),F.selectionBuffer=null);for(let e of F.categoricalBuffers.values())e.destroy();F.categoricalBuffers.clear(),F.styleFlags={useSelectionMask:!1},F.colorState={mode:0,columnOffset:0,min:0,range:1,numStops:0,columnOffsetV:0,minV:0,rangeV:1,mapIndex:0},F.activeCatColumnName=null,F.is3dActive=!1,F.rotation3d=null,F.residualPC=null,F.camera.use3d=!1,F.camera.rotation=null;let{projectionPipeline:u}=F,d=de(t,i,r);for(let e=0;e<r;e++)t.queue.writeBuffer(d.dataBuffer,e*i*4,a[e]);for(let e of l){let n=t.createBuffer({label:`cat-indices-${e.name}`,size:e.indices.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC});t.queue.writeBuffer(n,0,e.indices),F.categoricalBuffers.set(e.name,n)}if(ue(t,u.paramsBuffer,i,r,2),F.adjBasisBuffer=t.createBuffer({label:`adj-basis`,size:r*2*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),F.normMins=new Float32Array(o),F.normRanges=new Float32Array(s),F.normMeans=new Float32Array(c),F.projectionResources={...d,bindGroup:null},F.numPoints=i,F.numDims=r,B(),Y(),F.tour&&F.tour.dims===r)q();else{let e=Math.max(1,F.previewCanvases.size),t=[];for(let n=0;n<e;n++){let i=new Float32Array(r*2),a=Math.floor(n/e*r);i[a]=1,i[r+(a+1)%r]=1,t.push(i)}F.tour={bases:t,arcLengths:p(t,r),dims:r,orthonormalize:!0,position:0,interpolatedBasis:new Float32Array(r*2)},q()}},Q=(e,t)=>{e.projectionResources&&(e.residualPcPipeline||=he(e.device),e.device.queue.writeBuffer(e.projectionResources.basisBuffer,0,t),ge(e.device,e.residualPcPipeline,e.projectionResources.dataBuffer,e.projectionResources.normParamsBuffer,e.projectionResources.basisBuffer,t,e.numPoints,e.numDims).then(e=>{F?.is3dActive&&(F.residualPC=e,R({type:`residualPC`,residualPC:new Float32Array(e)}),J())}))},$=e=>{if(F){if(e.type===`setBases`){let{bases:t}=e;if(t.length===0)return;let n=t[0].length/2,r=e.tourFamily!==`sequential`,i=p(t,n,r);F.tour={bases:t,arcLengths:i,dims:n,orthonormalize:r,position:F.tour?.position??0,interpolatedBasis:new Float32Array(n*2)},F.projectionResources&&q();return}if(e.type===`setTourPosition`){if(!F.tour)return;F.tour.position=e.position,F.directBasis=null,W();return}if(e.type===`setStyle`){F.style={pointSize:e.pointSize,opacity:e.opacity,color:e.color,minPointSize:e.minPointSize??F.style.minPointSize,fillTarget:e.fillTarget??F.style.fillTarget},(F.tour||F.directBasis)&&F.projectionResources&&q();return}if(e.type===`setCamera`){F.camera={panX:e.pan[0],panY:e.pan[1],zoom:e.zoom,aspect:F.camera.aspect,viewportHeight:F.camera.viewportHeight,insetOffsetY:e.insetOffsetY,insetZoom:e.insetZoom,use3d:F.camera.use3d,rotation:F.camera.rotation},W();return}if(e.type===`setCentering`){if(F.centering=e.centering,B(),(F.tour||F.directBasis)&&F.projectionResources){if(F.is3dActive){let e=F.directBasis??F.tour?.interpolatedBasis;e&&Q(F,e)}q()}return}if(e.type===`resize`){e.dpr!==void 0&&(F.dpr=e.dpr),e.viewIndex===0&&(F.mainView.canvas.width=e.width,F.mainView.canvas.height=e.height,(F.tour||F.directBasis)&&F.projectionResources&&J());return}if(e.type===`addPreviewCanvas`){let t=e.canvas.getContext(`2d`);if(!t)return;F.previewCanvases.set(e.id,{canvas:e.canvas,ctx2d:t}),F.tour&&F.projectionResources&&e.id<F.tour.bases.length&&Ne(e.id,F.tour.bases[e.id]);return}if(e.type===`removePreviewCanvas`){F.previewCanvases.delete(e.id);return}if(e.type===`resizePreview`){let t=F.previewCanvases.get(e.id);if(!t)return;t.canvas.width=e.width,t.canvas.height=e.height,F.tour&&F.projectionResources&&Fe();return}if(e.type===`render`){(F.tour||F.directBasis)&&F.projectionResources&&q();return}if(e.type===`setDirectBasis`){if(!F.projectionResources||!F.renderBindGroup)return;F.directBasis=e.basis,W(),F.is3dActive&&F.projectionResources&&Q(F,e.basis);return}if(e.type===`clearColors`){F.colorLutBuffer&&(F.colorLutBuffer.destroy(),F.colorLutBuffer=null),F.colorState={mode:0,columnOffset:0,min:0,range:1,numStops:0,columnOffsetV:0,minV:0,rangeV:1,mapIndex:0},F.activeCatColumnName=null,Y(),(F.tour||F.directBasis)&&F.projectionResources&&q();return}if(e.type===`setBackgroundColor`){F.backgroundColor=e.color,(F.tour||F.directBasis)&&F.projectionResources&&q();return}if(e.type===`setMaxPoints`){F.maxPoints=e.maxPoints,(F.tour||F.directBasis)&&F.projectionResources&&q();return}if(e.type===`setSelectionMask`){let{mask:t}=e;F.selectionBuffer&&F.selectionBuffer.destroy(),F.selectionBuffer=F.device.createBuffer({label:`selection-mask`,size:t.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),F.device.queue.writeBuffer(F.selectionBuffer,0,t),F.styleFlags.useSelectionMask=!0,Y(),(F.tour||F.directBasis)&&F.projectionResources&&q();let n=new Uint32Array(t);R({type:`selectionResult`,mask:n},[n.buffer]);return}if(e.type===`clearSelectionMask`){F.selectionBuffer&&(F.selectionBuffer.destroy(),F.selectionBuffer=null),F.styleFlags.useSelectionMask=!1,Y(),(F.tour||F.directBasis)&&F.projectionResources&&q(),R({type:`selectionResult`,mask:new Uint32Array});return}if(e.type===`enable3d`){if(!F.projectionResources)return;let e=F.directBasis??F.tour?.interpolatedBasis;if(!e)return;if(F.is3dActive=!0,F.camera.use3d=!0,F.adjBasisBuffer){let e=F.numDims*3*4;F.adjBasisBuffer.size<e&&(F.adjBasisBuffer.destroy(),F.adjBasisBuffer=F.device.createBuffer({label:`adj-basis`,size:e,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),Y())}J(),Q(F,e);return}if(e.type===`disable3d`){F.is3dActive=!1,F.residualPC=null,F.rotation3d=null,F.camera.use3d=!1,F.camera.rotation=null,J();return}if(e.type===`set3dRotation`){F.rotation3d=e.matrix,F.camera.rotation=e.matrix,W();return}if(e.type===`startPlayback`){if(!F.tour)return;ke(e.speed,e.direction);return}if(e.type===`stopPlayback`){Ae();return}if(e.type===`computePCA`){if(!F.projectionResources||F.numDims<2){R({type:`error`,message:`No data loaded for PCA`});return}let{device:e,projectionResources:t,numPoints:i,numDims:a}=F;L||=n(e),r(e,L,t.dataBuffer,t.normParamsBuffer,i,a).then(({eigenvalues:e,eigenvectors:t})=>{R({type:`pcaResult`,eigenvectors:t,eigenvalues:e,numDims:t.length})}).catch(e=>{R({type:`error`,message:`PCA failed: ${e instanceof Error?e.message:String(e)}`})});return}if(e.type===`lassoSelect`){if(!F.projectionResources||!F.projectionBindGroup||F.numPoints===0)return;let{device:t,numPoints:n,projectionPipeline:r,projectionResources:i,camera:a}=F,{polygon:o}=e,s=o.length/2;if(s<3)return;let c=null;if(F.directBasis)c=F.directBasis;else if(F.tour){let{tour:e}=F;h(e.interpolatedBasis,e.bases,e.arcLengths,e.dims,e.position,e.orthonormalize),c=e.interpolatedBasis}if(!c)return;t.queue.writeBuffer(i.basisBuffer,0,c);let l=pe(t,r,F.projectionBindGroup,n);t.queue.submit([l]);let u=F.mainView.canvas,d=u.width/u.height||1,f=a.insetZoom,p=a.zoom*f,m=new Float32Array(o.length);for(let e=0;e<s;e++)m[e*2]=o[e*2]*d/p-a.panX,m[e*2+1]=(o[e*2+1]-a.insetOffsetY)/p-a.panY;let g=n*2*4,_=t.createBuffer({label:`proj-readback`,size:g,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),v=t.createCommandEncoder();v.copyBufferToBuffer(i.projectedBuffer,0,_,0,g),t.queue.submit([v.finish()]),_.mapAsync(GPUMapMode.READ).then(()=>{let e=new Float32Array(_.getMappedRange()),r=new Uint32Array(Math.ceil(n/32));for(let t=0;t<n;t++){let n=e[t*2],i=e[t*2+1];if(Ve(n,i,m,s)){let e=t>>5;r[e]=(r[e]??0)|1<<(t&31)}}_.unmap(),_.destroy(),F.selectionBuffer&&F.selectionBuffer.destroy(),F.selectionBuffer=t.createBuffer({label:`selection-mask`,size:r.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),t.queue.writeBuffer(F.selectionBuffer,0,r),F.styleFlags.useSelectionMask=!0,Y(),(F.tour||F.directBasis)&&F.projectionResources&&q();let i=new Uint32Array(r);R({type:`selectionResult`,mask:i},[i.buffer])});return}if(e.type===`getProjectedPositions`){if(!F.projectionResources||!F.projectionBindGroup||F.numPoints===0){R({type:`projectedPositions`,positions:new Float32Array},[]);return}let{device:e,numPoints:t,projectionPipeline:n,projectionResources:r}=F,i=null;if(F.directBasis)i=F.directBasis;else if(F.tour){let{tour:e}=F;h(e.interpolatedBasis,e.bases,e.arcLengths,e.dims,e.position,e.orthonormalize),i=e.interpolatedBasis}if(!i){R({type:`projectedPositions`,positions:new Float32Array},[]);return}e.queue.writeBuffer(r.basisBuffer,0,i);let a=pe(e,n,F.projectionBindGroup,t);e.queue.submit([a]);let o=t*2*4,s=e.createBuffer({label:`proj-positions-readback`,size:o,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),c=e.createCommandEncoder();c.copyBufferToBuffer(r.projectedBuffer,0,s,0,o),e.queue.submit([c.finish()]),s.mapAsync(GPUMapMode.READ).then(()=>{let e=new Float32Array(s.getMappedRange()).slice();s.unmap(),s.destroy(),R({type:`projectedPositions`,positions:e},[e.buffer])});return}if(e.type===`getPointData`){if(!F.projectionResources||F.numPoints===0){R({type:`pointData`,pointIndex:e.pointIndex,numericValues:{},categoricalValues:{}});return}let{device:t,numPoints:n,numDims:r,projectionResources:i}=F,a=e.pointIndex;if(a<0||a>=n){R({type:`pointData`,pointIndex:a,numericValues:{},categoricalValues:{}});return}let o=r*4,s=t.createBuffer({label:`point-data-readback`,size:o,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),c=t.createCommandEncoder();for(let e=0;e<r;e++)c.copyBufferToBuffer(i.dataBuffer,(e*n+a)*4,s,e*4,4);let l=Array.from(F.categoricalBuffers.keys()),u=l.length*4,d=null;if(u>0){d=t.createBuffer({label:`point-cat-readback`,size:u,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});let e=0;for(let t of l){let n=F.categoricalBuffers.get(t);c.copyBufferToBuffer(n,a*4,d,e,4),e+=4}}t.queue.submit([c.finish()]);let f=s.mapAsync(GPUMapMode.READ).then(()=>{let e=new Float32Array(s.getMappedRange()).slice();return s.unmap(),s.destroy(),e}),p=d?d.mapAsync(GPUMapMode.READ).then(()=>{let e=new Uint32Array(d.getMappedRange()).slice();return d.unmap(),d.destroy(),e}):Promise.resolve(new Uint32Array);Promise.all([f,p]).then(([e,t])=>{let n={};for(let t=0;t<r;t++)n[String(t)]=e[t];let i={};for(let e=0;e<l.length;e++)i[l[e]]=t[e];R({type:`pointData`,pointIndex:a,numericValues:n,categoricalValues:i})});return}if(e.type===`benchmark`){Be(e.numFrames);return}if(e.type===`getMetrics`){ze();return}}},Re=()=>{if(!F)return 0;let e=0;if(F.projectionResources){let t=F.projectionResources;e+=t.dataBuffer.size+t.normParamsBuffer.size+t.basisBuffer.size+t.projectedBuffer.size}F.adjBasisBuffer&&(e+=F.adjBasisBuffer.size),F.selectionBuffer&&(e+=F.selectionBuffer.size),F.colorLutBuffer&&(e+=F.colorLutBuffer.size);for(let t of F.categoricalBuffers.values())e+=t.size;F.mainHdrTexture&&(e+=F.mainHdrTexture.width*F.mainHdrTexture.height*16),F.previewHdrTexture&&(e+=F.previewHdrTexture.width*F.previewHdrTexture.height*16);let t=F.pointPipeline;return e+=t.uniformBuffer.size+t.cameraBuffer.size,e+=t.defaultColorLutBuffer.size+t.defaultSelectionBuffer.size+t.defaultCatIndicesBuffer.size,e+=F.projectionPipeline.paramsBuffer.size,e+=F.tonemapPipeline.paramsBuffer.size,e},ze=()=>{if(!F)return;let e=0;if(F.tour){for(let t of F.tour.bases)e+=t.byteLength;e+=F.tour.interpolatedBasis.byteLength}R({type:`metricsResult`,gpuMemoryBytes:Re(),numPoints:F.numPoints,numDims:F.numDims,workerJsHeapBytes:e})},Be=async e=>{if(!F?.tour||!F.renderBindGroup||F.numPoints===0){R({type:`error`,message:`No data/tour loaded for benchmark`});return}let{device:t,numPoints:n,numDims:r,tour:i}=F,a=i.position;F.directBasis=null;for(let e=0;e<5;e++)i.position=e/5,h(i.interpolatedBasis,i.bases,i.arcLengths,i.dims,i.position,i.orthonormalize),xe(),G(i.interpolatedBasis,F.mainView,F.mainHdrTextureView,F.mainTonemapBindGroup,F.camera,F.renderBindGroup),await t.queue.onSubmittedWorkDone();let o=new Float64Array(e);for(let n=0;n<e;n++){i.position=n/e,h(i.interpolatedBasis,i.bases,i.arcLengths,i.dims,i.position,i.orthonormalize);let r=performance.now();G(i.interpolatedBasis,F.mainView,F.mainHdrTextureView,F.mainTonemapBindGroup,F.camera,F.renderBindGroup),await t.queue.onSubmittedWorkDone(),o[n]=performance.now()-r}i.position=a,R({type:`benchmarkResult`,frameTimes:o,numPoints:n,numDims:r},[o.buffer])},Ve=(e,t,n,r)=>{let i=!1;for(let a=0,o=r-1;a<r;o=a++){let r=n[a*2],s=n[a*2+1],c=n[o*2],l=n[o*2+1];s>t!=l>t&&e<(c-r)*(t-s)/(l-s)+r&&(i=!i)}return i};self.onmessage=async e=>{let t=e.data;if(t.type===`init`){try{let{device:e}=await ee(),n=i(t.canvas,e),r=navigator.gpu.getPreferredCanvasFormat(),a=`rgba32float`,o=ne(e,a),s=le(e),c=v(e),l=oe(e,r);F={device:e,mainView:n,previewGpuCanvas:null,previewGpuView:null,previewCanvases:new Map,pointPipeline:o,renderBindGroup:null,projectionPipeline:s,projectionResources:null,projectionBindGroup:null,colorPipelines:c,numPoints:0,numDims:0,categoricalBuffers:new Map,tour:null,style:{pointSize:`auto`,opacity:`auto`,color:[.25,.5,.9],minPointSize:2,fillTarget:.5},styleFlags:{useSelectionMask:!1},camera:{panX:0,panY:0,zoom:t.zoom,aspect:1,viewportHeight:1,insetOffsetY:0,insetZoom:1,use3d:!1,rotation:null},colorLutBuffer:null,colorState:{mode:0,columnOffset:0,min:0,range:1,numStops:0,columnOffsetV:0,minV:0,rangeV:1,mapIndex:0},activeCatColumnName:null,selectionBuffer:null,directBasis:null,backgroundColor:[0,0,0],dpr:t.dpr,hdrFormat:a,tonemapPipeline:l,mainHdrTexture:null,mainHdrTextureView:null,mainTonemapBindGroup:null,previewHdrTexture:null,previewHdrTextureView:null,previewTonemapBindGroup:null,maxPoints:0,adjBasisBuffer:null,normMins:null,normRanges:null,normMeans:null,centering:`midrange`,is3dActive:!1,rotation3d:null,residualPC:null,residualPcPipeline:null},t.dataPort.onmessage=Le;let u=I;if(I=null,u)for(let e of u)$(e);R({type:`ready`})}catch(e){R({type:`error`,message:e instanceof Error?e.message:String(e)})}return}if(I){I.push(t);return}$(t)};", h = typeof self < "u" && self.Blob && new Blob(["URL.revokeObjectURL(import.meta.url);", m], { type: "text/javascript;charset=utf-8" });
2639
- function g(e) {
2637
+ //#region src/selection-requests.ts
2638
+ var m = (e, t) => {
2639
+ let n = 0, r = null, i = (e = null) => (r = e, n += 1, n);
2640
+ return {
2641
+ selectByColumn: (t, a) => {
2642
+ let o = a.valueRanges ? new Float32Array(a.valueRanges) : void 0, s = JSON.stringify([
2643
+ t,
2644
+ a.labelIndices ?? null,
2645
+ o ? [...o] : null
2646
+ ]);
2647
+ if (s === r) return n;
2648
+ let c = i(s);
2649
+ return e({
2650
+ type: "selectByColumn",
2651
+ id: c,
2652
+ column: t,
2653
+ labelIndices: a.labelIndices,
2654
+ valueRanges: o
2655
+ }, o ? [o.buffer] : []), c;
2656
+ },
2657
+ setSelectionMask: (e) => {
2658
+ let n = i();
2659
+ return t({
2660
+ type: "setSelectionMask",
2661
+ mask: e,
2662
+ id: n
2663
+ }, [e.buffer]), n;
2664
+ },
2665
+ lassoSelect: (e) => {
2666
+ let n = i();
2667
+ return t({
2668
+ type: "lassoSelect",
2669
+ polygon: e,
2670
+ id: n
2671
+ }, [e.buffer]), n;
2672
+ },
2673
+ clearSelection: () => {
2674
+ let e = i();
2675
+ return t({
2676
+ type: "clearSelectionMask",
2677
+ id: e
2678
+ }), e;
2679
+ },
2680
+ latestSelectionId: () => n,
2681
+ reset: () => {
2682
+ i();
2683
+ }
2684
+ };
2685
+ }, h = "const e=(e,t)=>{let n=e,r=new Float32Array(t*t);for(let e=0;e<t;e++)r[e*t+e]=1;let i=1e-10;for(let e=0;e<50;e++){let e=0;for(let r=0;r<t;r++)for(let i=r+1;i<t;i++)e+=n[r*t+i]*n[r*t+i];if(e<i)break;for(let e=0;e<t;e++)for(let a=e+1;a<t;a++){let o=n[e*t+a];if(Math.abs(o)<i*.01)continue;let s=n[e*t+e],c=n[a*t+a],l=(c-s)/(2*o),u=Math.sign(l)/(Math.abs(l)+Math.sqrt(1+l*l)),d=1/Math.sqrt(1+u*u),f=u*d;n[e*t+e]=s-u*o,n[a*t+a]=c+u*o,n[e*t+a]=0,n[a*t+e]=0;for(let r=0;r<t;r++){if(r===e||r===a)continue;let i=n[r*t+e],o=n[r*t+a];n[r*t+e]=d*i-f*o,n[e*t+r]=d*i-f*o,n[r*t+a]=f*i+d*o,n[a*t+r]=f*i+d*o}for(let n=0;n<t;n++){let i=r[n*t+e],o=r[n*t+a];r[n*t+e]=d*i-f*o,r[n*t+a]=f*i+d*o}}}let a=new Float32Array(t),o=Array.from({length:t},(e,t)=>t);for(let e=0;e<t;e++)a[e]=n[e*t+e];o.sort((e,t)=>a[t]-a[e]);let s=new Float32Array(t),c=[];for(let e=0;e<t;e++){let n=o[e];s[e]=a[n];let i=new Float32Array(t);for(let e=0;e<t;e++)i[e]=r[e*t+n];c.push(i)}return{eigenvalues:s,eigenvectors:c}},t=e=>{let t=e.createShaderModule({label:`compute-pca`,code:`// PCA compute shader — two-pass reduction to compute covariance matrix.\n//\n// Pass 1 (reduce_partial): Each workgroup reduces its chunk of points into\n// per-workgroup partial sums for d means + d*(d+1)/2 cross-product terms.\n//\n// Pass 2 (final_reduce): A single workgroup reduces all partial sums into\n// the final means and covariance matrix.\n//\n// Data is normalized identically to the projection shader:\n// v = (raw - center) / range\n\nstruct PcaParams {\n num_points: u32,\n num_dims: u32,\n num_workgroups: u32,\n _pad: u32,\n}\n\n@group(0) @binding(0) var<uniform> params: PcaParams;\n@group(0) @binding(1) var<storage, read> data: array<f32>;\n@group(0) @binding(2) var<storage, read> norm_params: array<vec2f>;\n@group(0) @binding(3) var<storage, read_write> partials: array<f32>;\n// result layout: [mean_0 .. mean_{d-1}, cov_00, cov_01, ..., cov_{d-1,d-1}]\n// upper-triangle covariance packed as: d1*d - d1*(d1-1)/2 + (d2-d1)\n@group(0) @binding(4) var<storage, read_write> result: array<f32>;\n\nconst WG: u32 = 256u;\nconst MAX_DIMS: u32 = 32u;\n\nvar<workgroup> wg_reduce: array<f32, 256>;\n\nfn normalize(dim: u32, point_idx: u32, N: u32) -> f32 {\n let raw = data[dim * N + point_idx];\n let np = norm_params[dim];\n let range = max(np.y, 1e-6);\n return (raw - np.x) / range;\n}\n\nfn cov_idx(d: u32, d1: u32, d2: u32) -> u32 {\n return d1 * d - d1 * (d1 - 1u) / 2u + (d2 - d1);\n}\n\n// ─── Pass 1: per-workgroup partial sums ─────────────────────────────────────\n\n@compute @workgroup_size(256)\nfn reduce_partial(\n @builtin(global_invocation_id) gid: vec3u,\n @builtin(local_invocation_id) lid: vec3u,\n @builtin(workgroup_id) wid: vec3u,\n) {\n let N = params.num_points;\n let d = min(params.num_dims, MAX_DIMS);\n let num_cov = d * (d + 1u) / 2u;\n let num_terms = d + num_cov;\n let i = gid.x;\n let valid = i < N;\n\n // Load normalized values for this point into registers\n var vals: array<f32, 32>; // MAX_DIMS\n if (valid) {\n for (var dim = 0u; dim < d; dim++) {\n vals[dim] = normalize(dim, i, N);\n }\n }\n\n // Reduce mean terms\n for (var dim = 0u; dim < d; dim++) {\n wg_reduce[lid.x] = select(0.0, vals[dim], valid);\n workgroupBarrier();\n for (var s = WG / 2u; s > 0u; s >>= 1u) {\n if (lid.x < s) {\n wg_reduce[lid.x] += wg_reduce[lid.x + s];\n }\n workgroupBarrier();\n }\n if (lid.x == 0u) {\n partials[wid.x * num_terms + dim] = wg_reduce[0];\n }\n }\n\n // Reduce upper-triangle covariance terms (including diagonal)\n for (var d1 = 0u; d1 < d; d1++) {\n for (var d2 = d1; d2 < d; d2++) {\n wg_reduce[lid.x] = select(0.0, vals[d1] * vals[d2], valid);\n workgroupBarrier();\n for (var s = WG / 2u; s > 0u; s >>= 1u) {\n if (lid.x < s) {\n wg_reduce[lid.x] += wg_reduce[lid.x + s];\n }\n workgroupBarrier();\n }\n if (lid.x == 0u) {\n let ci = cov_idx(d, d1, d2);\n partials[wid.x * num_terms + d + ci] = wg_reduce[0];\n }\n }\n }\n}\n\n// ─── Pass 2: reduce across workgroups → final means + covariance ────────────\n\n@compute @workgroup_size(256)\nfn final_reduce(\n @builtin(local_invocation_id) lid: vec3u,\n) {\n let d = min(params.num_dims, MAX_DIMS);\n let num_cov = d * (d + 1u) / 2u;\n let num_terms = d + num_cov;\n let nwg = params.num_workgroups;\n let N_f32 = f32(params.num_points);\n\n // For each term, reduce across all workgroups\n for (var t = 0u; t < num_terms; t++) {\n // Each thread accumulates a stride of workgroups\n var sum = 0.0;\n var w = lid.x;\n while (w < nwg) {\n sum += partials[w * num_terms + t];\n w += WG;\n }\n wg_reduce[lid.x] = sum;\n workgroupBarrier();\n for (var s = WG / 2u; s > 0u; s >>= 1u) {\n if (lid.x < s) {\n wg_reduce[lid.x] += wg_reduce[lid.x + s];\n }\n workgroupBarrier();\n }\n if (lid.x == 0u) {\n // Store as E[X] or E[XY]\n result[t] = wg_reduce[0] / N_f32;\n }\n workgroupBarrier();\n }\n\n // Correct covariance: cov(X,Y) = E[XY] - E[X]*E[Y]\n if (lid.x == 0u) {\n for (var d1 = 0u; d1 < d; d1++) {\n for (var d2 = d1; d2 < d; d2++) {\n let ci = cov_idx(d, d1, d2);\n result[d + ci] -= result[d1] * result[d2];\n }\n }\n }\n}\n`}),n=e.createBindGroupLayout({label:`pca-bgl`,entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:`uniform`}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}}]}),r=e.createPipelineLayout({bindGroupLayouts:[n]});return{partialPipeline:e.createComputePipeline({label:`pca-partial-pipeline`,layout:r,compute:{module:t,entryPoint:`reduce_partial`}}),finalPipeline:e.createComputePipeline({label:`pca-final-pipeline`,layout:r,compute:{module:t,entryPoint:`final_reduce`}}),bindGroupLayout:n,paramsBuffer:e.createBuffer({label:`pca-params`,size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST})}},n=async(t,n,r,i,a,o)=>{let s=Math.min(o,32),c=s+s*(s+1)/2,l=Math.ceil(a/256),u=/* @__PURE__ */ new ArrayBuffer(16),d=new Uint32Array(u);d[0]=a,d[1]=s,d[2]=l,d[3]=0,t.queue.writeBuffer(n.paramsBuffer,0,u);let f=t.createBuffer({label:`pca-partials`,size:l*c*4,usage:GPUBufferUsage.STORAGE}),p=c*4,m=t.createBuffer({label:`pca-result`,size:p,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC}),h=t.createBuffer({label:`pca-readback`,size:p,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),g=t.createBindGroup({label:`pca-bg`,layout:n.bindGroupLayout,entries:[{binding:0,resource:{buffer:n.paramsBuffer}},{binding:1,resource:{buffer:r}},{binding:2,resource:{buffer:i}},{binding:3,resource:{buffer:f}},{binding:4,resource:{buffer:m}}]}),_=t.createCommandEncoder({label:`pca-compute`}),v=_.beginComputePass({label:`pca-partial`});v.setPipeline(n.partialPipeline),v.setBindGroup(0,g),v.dispatchWorkgroups(l),v.end();let y=_.beginComputePass({label:`pca-final`});y.setPipeline(n.finalPipeline),y.setBindGroup(0,g),y.dispatchWorkgroups(1),y.end(),_.copyBufferToBuffer(m,0,h,0,p),t.queue.submit([_.finish()]),await h.mapAsync(GPUMapMode.READ);let b=new Float32Array(h.getMappedRange()).slice();h.unmap(),f.destroy(),m.destroy(),h.destroy();let x=new Float32Array(s*s);for(let e=0;e<s;e++)for(let t=e;t<s;t++){let n=e*s-e*(e-1)/2+(t-e);x[e*s+t]=b[s+n],x[t*s+e]=b[s+n]}return e(x,s)},r=(e,t)=>{let n=e.getContext(`webgpu`);if(!n)throw Error(`Failed to get WebGPU context from canvas. Ensure WebGPU is supported and the canvas is valid.`);let r=navigator.gpu.getPreferredCanvasFormat();return n.configure({device:t,format:r,alphaMode:`premultiplied`}),{canvas:e,context:n,format:r}},i=2e6,a=(e,t,n,r,a,o=[0,0,0])=>{let s=e.beginRenderPass({colorAttachments:[{view:t,clearValue:{r:o[0],g:o[1],b:o[2],a:1},loadOp:`clear`,storeOp:`store`}]});if(a>0){s.setPipeline(n),s.setBindGroup(0,r);for(let e=0;e<a;e+=i){let t=Math.min(i,a-e);s.draw(4,t,0,e)}}s.end()},o=(e,t,n,r)=>{let i=e.beginRenderPass({colorAttachments:[{view:t.context.getCurrentTexture().createView(),loadOp:`clear`,storeOp:`store`,clearValue:{r:0,g:0,b:0,a:1}}]});i.setPipeline(n),i.setBindGroup(0,r),i.draw(3),i.end()},s=1e-10,c=e=>{let t=e[0],n=e[1],r=e[2],i=e[3],a=t*t+r*r,o=t*n+r*i,c=n*n+i*i,l=a+c,u=a*c-o*o,d=Math.sqrt(Math.max(0,l*l*.25-u)),f=l*.5+d,p=l*.5-d,m=Math.sqrt(Math.max(0,f)),h=Math.sqrt(Math.max(0,p)),g=new Float32Array([m,h]),_=/* @__PURE__ */ new Float32Array(4);if(Math.abs(o)>s){let e=f-c,t=Math.sqrt(e*e+o*o);_[0]=e/t,_[1]=o/t;let n=p-c,r=Math.sqrt(n*n+o*o);_[2]=n/r,_[3]=o/r}else _[0]=1,_[1]=0,_[2]=0,_[3]=1;let v=/* @__PURE__ */ new Float32Array(4);return m>s&&(v[0]=(t*_[0]+n*_[1])/m,v[2]=(r*_[0]+i*_[1])/m),h>s&&(v[1]=(t*_[2]+n*_[3])/h,v[3]=(r*_[2]+i*_[3])/h),m<=s&&h>s?(v[0]=-v[3],v[2]=v[1]):h<=s&&m>s?(v[1]=-v[2],v[3]=v[0]):m<=s&&h<=s&&(v[0]=1,v[1]=0,v[2]=0,v[3]=1),{U:v,S:g,V:_}},l=(e,t)=>{let n=0;for(let r=0;r<t;r++)n+=e[r]*e[r];if(n=Math.sqrt(n),n>1e-10)for(let r=0;r<t;r++)e[r]=e[r]/n;let r=0;for(let n=0;n<t;n++)r+=e[n]*e[t+n];for(let n=0;n<t;n++)e[t+n]=e[t+n]-r*e[n];let i=0;for(let n=0;n<t;n++)i+=e[t+n]*e[t+n];if(i=Math.sqrt(i),i>1e-10)for(let n=0;n<t;n++)e[t+n]=e[t+n]/i},u=(e,t,n,r,i,a,o,s=!0)=>{let c=o*o,u=c*o,d=.5*(-o+2*c-u),f=.5*(2-5*c+3*u),p=.5*(o+4*c-3*u),m=.5*(-c+u);for(let o=0;o<a*2;o++)e[o]=d*t[o]+f*n[o]+p*r[o]+m*i[o];return s&&l(e,a),e},d=(e,t,n)=>{let r=/* @__PURE__ */ new Float32Array(4);for(let i=0;i<2;i++)for(let a=0;a<2;a++){let o=0;for(let r=0;r<n;r++)o+=e[i*n+r]*t[a*n+r];r[i*2+a]=o}let{S:i}=c(r),a=Math.acos(Math.max(-1,Math.min(1,i[0]))),o=Math.acos(Math.max(-1,Math.min(1,i[1])));return Math.sqrt(a*a+o*o)},f=(e,t,n=!0)=>{let r=e.length,i=new Float32Array(r+1);if(i[0]=0,!n){for(let e=1;e<=r;e++)i[e]=e/r;return i}let a=new Float32Array(t*2),o=new Float32Array(t*2);for(let n=0;n<r;n++){let s=(n-1+r)%r,c=n,l=(n+1)%r,f=(n+2)%r,p=0;u(a,e[s],e[c],e[l],e[f],t,0);for(let n=1;n<=8;n++){let r=n/8;u(o,e[s],e[c],e[l],e[f],t,r),p+=d(a,o,t),a.set(o)}i[n+1]=i[n]+p}let s=i[r];if(s>1e-10)for(let e=1;e<=r;e++)i[e]=i[e]/s;return i},p=(e,t)=>{let n=e.length-1,r=Math.max(0,Math.min(1,t)),i=0,a=n-1;for(;i<a;){let t=i+a>>>1;e[t+1]<=r?i=t+1:a=t}let o=e[i],s=e[i+1]-o,c=s>1e-10?(r-o)/s:0;return{segment:i,localT:c}},m=(e,t,n,r,i,a=!0)=>{let o=t.length,{segment:s,localT:c}=p(n,i),l=(s-1+o)%o,d=s,f=(s+1)%o,m=(s+2)%o;return u(e,t[l],t[d],t[f],t[m],r,c,a)};var h=`// GPU categorical selection (bit-packed output)\n//\n// For each point, checks if its category index is in the selected set.\n// Output mask must be pre-cleared; bits are set via atomicOr.\n\nstruct Params {\n num_points: u32,\n num_labels: u32,\n}\n\n@group(0) @binding(0) var<storage, read> indices: array<u32>;\n@group(0) @binding(1) var<storage, read> selected: array<u32>; // 1 per label: selected or not\n@group(0) @binding(2) var<storage, read_write> mask: array<atomic<u32>>;\n@group(0) @binding(3) var<uniform> params: Params;\n\n@compute @workgroup_size(256)\nfn main(@builtin(global_invocation_id) gid: vec3u) {\n let i = gid.x;\n if (i >= params.num_points) { return; }\n let idx = indices[i];\n if (idx < params.num_labels && selected[idx] > 0u) {\n atomicOr(&mask[i / 32u], 1u << (i % 32u));\n }\n}\n`,g=`// GPU continuous selection (bit-packed output)\n//\n// For each point, checks if the column value falls within any [lo, hi] range.\n// Output mask must be pre-cleared; bits are set via atomicOr.\n\nstruct Params {\n num_points: u32,\n column_offset: u32, // columnIndex * numPoints\n num_ranges: u32,\n}\n\n@group(0) @binding(0) var<storage, read> data: array<f32>;\n@group(0) @binding(1) var<storage, read> ranges: array<f32>; // [lo0, hi0, lo1, hi1, ...]\n@group(0) @binding(2) var<storage, read_write> mask: array<atomic<u32>>;\n@group(0) @binding(3) var<uniform> params: Params;\n\n@compute @workgroup_size(256)\nfn main(@builtin(global_invocation_id) gid: vec3u) {\n let i = gid.x;\n if (i >= params.num_points) { return; }\n\n let v = data[params.column_offset + i];\n for (var r = 0u; r < params.num_ranges; r++) {\n if (v >= ranges[r * 2u] && v <= ranges[r * 2u + 1u]) {\n atomicOr(&mask[i / 32u], 1u << (i % 32u));\n break;\n }\n }\n}\n`;const _=e=>{let t=e.createBindGroupLayout({label:`color-bgl`,entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:`uniform`}}]}),n=e.createPipelineLayout({bindGroupLayouts:[t]}),r=(t,r)=>e.createComputePipeline({label:t,layout:n,compute:{module:e.createShaderModule({label:t,code:r}),entryPoint:`main`}}),i=e.createBuffer({label:`color-params`,size:32,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});return{selectContinuous:r(`select-continuous`,g),selectCategorical:r(`select-categorical`,h),bindGroupLayout:t,paramsBuffer:i}},v=(e,t,n,r,i,a)=>e.createBindGroup({label:`color-bg`,layout:t,entries:[{binding:0,resource:{buffer:n}},{binding:1,resource:{buffer:r}},{binding:2,resource:{buffer:i}},{binding:3,resource:{buffer:a}}]}),y=(e,t,n,r,i)=>{let a=/* @__PURE__ */ new ArrayBuffer(32),o=new Uint32Array(a);o[0]=n,o[1]=r,o[2]=i,e.queue.writeBuffer(t,0,a)},b=(e,t,n,r)=>{let i=/* @__PURE__ */ new ArrayBuffer(32),a=new Uint32Array(i);a[0]=n,a[1]=r,e.queue.writeBuffer(t,0,i)},x=async()=>{if(!navigator.gpu)throw Error(`WebGPU is not supported in this environment. Please use Chrome 113+, Edge 113+, or Firefox Nightly with WebGPU enabled.`);let e=await navigator.gpu.requestAdapter({powerPreference:`high-performance`});if(!e)throw Error(`No WebGPU adapter found. Your GPU may not support WebGPU, or the browser may have blocked access.`);if(!e.features.has(`float32-blendable`))throw Error(`Your GPU does not support float32-blendable, which is required for HDR rendering. Please try a different browser or device with a GPU that supports this WebGPU feature.`);let t=await e.requestDevice({label:`dtour-scatter`,requiredFeatures:[`float32-blendable`],requiredLimits:{maxStorageBufferBindingSize:e.limits.maxStorageBufferBindingSize,maxBufferSize:e.limits.maxBufferSize}});return t.lost.then(e=>{console.error(`WebGPU device lost: ${e.message} (reason: ${e.reason})`)}),{adapter:e,device:t}};var ee=`// Point renderer — instanced quads with SDF circle anti-aliasing\n//\n// Projects raw ND data to 2D inline using pre-adjusted basis weights and\n// biases (normalization folded into the basis on CPU). This eliminates the\n// separate compute-projection pass and its GPU barrier.\n//\n// Trade-off: the projection loop runs once per vertex (4x per point) since\n// vertex shaders can't share results across a strip. This is a net win\n// because eliminating the compute dispatch + barrier + projected-buffer\n// read costs more than the redundant ALU, and GPUs are throughput-oriented.\n// For very high dim counts (>200) this balance may shift — profile first.\n//\n// Applies 2D camera transform (pan/zoom/aspect). Each point is rendered as\n// a unit quad (triangle strip, 4 vertices) scaled by point_size (NDC units).\n//\n// Color mapping: instead of a pre-computed N-element color buffer, the shader\n// reads raw data values and looks up colors from a tiny LUT at render time.\n// This eliminates the 20MB color buffer for 5M points and makes color changes\n// instant (just swap the ~100-byte LUT + update uniforms).\n\nstruct Uniforms {\n point_size: f32,\n opacity: f32,\n // Color mode: 0 = uniform color, 1 = continuous, 2 = categorical\n color_mode: u32,\n useSelectionMask: f32,\n color: vec4f,\n useSubtractive: f32,\n num_points: u32,\n num_dims: u32,\n max_points: u32,\n bias: vec2f,\n // Color mapping params (used when color_mode > 0)\n color_column_offset: u32, // columnIndex * num_points (continuous only)\n color_min: f32,\n color_range: f32,\n color_num_stops: u32, // LUT size\n bias_z: f32, // z-axis bias (3D mode only)\n // 2D colormap params (used when color_mode == 3)\n color_column_offset_v: u32, // second column index * num_points\n color_min_v: f32,\n color_range_v: f32,\n color2d_map_index: u32, // 0-5 = LUT-based, 6 = oklab_polar\n scale_opacity_by_zoom: f32, // 1.0 = auto (zoom² density scaling), 0.0 = manual (fixed)\n}\n\nstruct Camera {\n pan_x: f32,\n pan_y: f32,\n zoom: f32,\n aspect: f32,\n viewport_height: f32,\n // NDC-space Y offset applied after zoom — used to shift the viewport\n // down when a toolbar covers the top of the canvas.\n inset_offset_y: f32,\n // Zoom multiplier for the inset — scales content to fit in the visible\n // area below the toolbar (typically (H - toolbar) / H).\n inset_zoom: f32,\n // 3D camera rotation: 0.0 = 2D mode (skip z projection), 1.0 = 3D mode\n use_3d: f32,\n // 3×3 rotation matrix (column-major, each column padded to vec4f for alignment)\n rot_col0: vec3f,\n _pad0: f32,\n rot_col1: vec3f,\n _pad1: f32,\n rot_col2: vec3f,\n _pad2: f32,\n}\n\n@group(0) @binding(0) var<uniform> uni: Uniforms;\n// Raw ND data (column-major): dim0[0..N], dim1[0..N], ..., dimP[0..N]\n@group(0) @binding(1) var<storage, read> data: array<f32>;\n@group(0) @binding(2) var<uniform> camera: Camera;\n// Colormap/palette LUT — packed RGBA8 u32 entries (25 for continuous, up to 256 for categorical)\n@group(0) @binding(3) var<storage, read> colorLut: array<u32>;\n// Bit-packed selection mask (1 bit per point, 32 per u32)\n@group(0) @binding(4) var<storage, read> selectionMask: array<u32>;\n// Adjusted basis weights (normalization folded in):\n// first num_dims = x-weights, next num_dims = y-weights\n// adj_basis[d] = basis[d] / range[d] * viewport_scale\n@group(0) @binding(5) var<storage, read> adj_basis: array<f32>;\n// Categorical index buffer (per-point category index, used when color_mode == 2)\n@group(0) @binding(6) var<storage, read> catIndices: array<u32>;\n\nstruct VertOut {\n @builtin(position) clip_pos: vec4f,\n @location(0) uv: vec2f,\n @location(1) point_color: vec4f,\n @location(2) @interpolate(flat) selected: u32,\n @location(3) @interpolate(flat) effective_opacity: f32,\n}\n\n// Triangle strip: 4 vertices forming a unit quad [-1, 1]²\nfn quad_vertex(vi: u32) -> vec2f {\n switch vi {\n case 0u: { return vec2f(-1.0, -1.0); }\n case 1u: { return vec2f( 1.0, -1.0); }\n case 2u: { return vec2f(-1.0, 1.0); }\n default: { return vec2f( 1.0, 1.0); }\n }\n}\n\n// Unpack RGBA8 from u32 (0xAABBGGRR little-endian)\nfn unpackColor(packed: u32) -> vec4f {\n let r = f32(packed & 0xFFu) / 255.0;\n let g = f32((packed >> 8u) & 0xFFu) / 255.0;\n let b = f32((packed >> 16u) & 0xFFu) / 255.0;\n let a = f32((packed >> 24u) & 0xFFu) / 255.0;\n return vec4f(r, g, b, a);\n}\n\n// PCG hash — fast, high-quality deterministic random from instance index.\n// Used for vertex-shader decimation when num_points > max_points.\nfn pcg_hash(input: u32) -> u32 {\n var state = input * 747796405u + 2891336453u;\n let word = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u;\n return (word >> 22u) ^ word;\n}\n\nfn random_float(seed: u32) -> f32 {\n return f32(pcg_hash(seed)) / 4294967295.0;\n}\n\n// ─── 2D Colormap helpers ──────────────────────────────────────────────────\n\n// Read f32 from the colorLut buffer (which stores u32). Used for 2D colormap LUT curves.\nfn lut_f32(index: u32) -> f32 {\n return bitcast<f32>(colorLut[index]);\n}\n\n// Linearly interpolate a 16-entry LUT curve stored in colorLut at the given base offset.\nfn lut_interp(base: u32, t: f32) -> f32 {\n let pos = t * 15.0;\n let lo = min(u32(floor(pos)), 14u);\n let hi = lo + 1u;\n return mix(lut_f32(base + lo), lut_f32(base + hi), fract(pos));\n}\n\n// Reconstruct a 2D colormap color from SVD rank-1 LUT curves stored in colorLut.\n// Layout: R_X[16] R_Y[16] G_X[16] G_Y[16] B_X[16] B_Y[16] B_X2[16] B_Y2[16]\nfn colormap2d_lut(u: f32, v: f32) -> vec3f {\n let r = lut_interp(0u, u) * lut_interp(16u, v);\n let g = lut_interp(32u, u) * lut_interp(48u, v);\n let b = lut_interp(64u, u) * lut_interp(80u, v)\n + lut_interp(96u, u) * lut_interp(112u, v); // rank-2 correction\n return clamp(vec3f(r, g, b), vec3f(0.0), vec3f(1.0));\n}\n\n// Oklab → linear sRGB conversion\nfn oklab_to_linear(L: f32, a: f32, b: f32) -> vec3f {\n let l_ = L + 0.3963377774 * a + 0.2158037573 * b;\n let m_ = L - 0.1055613458 * a - 0.0638541728 * b;\n let s_ = L - 0.0894841775 * a - 1.2914855480 * b;\n let l = l_ * l_ * l_;\n let m = m_ * m_ * m_;\n let s = s_ * s_ * s_;\n return vec3f(\n 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,\n -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,\n -0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s\n );\n}\n\n// Oklab polar 2D colormap: hue = angle, chroma = radius, lightness varies\nfn colormap2d_oklab_polar(u: f32, v: f32) -> vec3f {\n let cx = u - 0.5;\n let cy = v - 0.5;\n let radius = min(length(vec2f(cx, cy)) * 2.0, 1.0);\n let angle = atan2(cy, cx);\n let chroma = radius * 0.25;\n let lightness = 0.80 - radius * 0.30;\n let a_val = chroma * cos(angle);\n let b_val = chroma * sin(angle);\n let linear = oklab_to_linear(lightness, a_val, b_val);\n // Linear to sRGB gamma (approximate)\n return pow(clamp(linear, vec3f(0.0), vec3f(1.0)), vec3f(1.0 / 2.2));\n}\n\n// Dispatch 2D colormap by index\nfn colormap2d(map_index: u32, u: f32, v: f32) -> vec3f {\n if map_index == 6u {\n return colormap2d_oklab_polar(u, v);\n }\n return colormap2d_lut(u, v);\n}\n\n@vertex\nfn vs_main(\n @builtin(vertex_index) vi: u32,\n @builtin(instance_index) ii: u32,\n) -> VertOut {\n // Vertex-shader decimation: skip expensive projection for excess points.\n // Early exit before the ND projection loop saves ~50 cycles per rejected point.\n if (uni.max_points > 0u && uni.num_points > uni.max_points) {\n let threshold = f32(uni.max_points) / f32(uni.num_points);\n if (random_float(ii) > threshold) {\n var out: VertOut;\n out.clip_pos = vec4f(0.0, 0.0, 0.0, 0.0);\n out.uv = vec2f(0.0);\n out.point_color = vec4f(0.0);\n out.selected = 0u;\n out.effective_opacity = 0.0;\n return out;\n }\n }\n\n // Inline ND → 2D projection with pre-adjusted basis.\n // CPU folds normalization into the basis weights and biases so the\n // hot loop is just: x += raw * adjBasisX[d], y += raw * adjBasisY[d]\n // Must produce the same result as compute-projection.wgsl (used for lasso).\n let N = uni.num_points;\n let p = uni.num_dims;\n var x = uni.bias.x;\n var y = uni.bias.y;\n for (var d = 0u; d < p; d++) {\n let raw = data[d * N + ii];\n x += raw * adj_basis[d];\n y += raw * adj_basis[p + d];\n }\n\n // 3D camera rotation: project z-axis, rotate, then discard z (orthographic).\n if (camera.use_3d > 0.5) {\n var z = uni.bias_z;\n for (var d = 0u; d < p; d++) {\n z += data[d * N + ii] * adj_basis[2u * p + d];\n }\n let pos3 = vec3f(x, y, z);\n let rot = mat3x3f(camera.rot_col0, camera.rot_col1, camera.rot_col2);\n let rotated = rot * pos3;\n x = rotated.x;\n y = rotated.y;\n // z discarded — orthographic projection\n }\n\n // Apply camera: translate then scale, with aspect correction on x.\n // inset_zoom shrinks the scene to fit below the toolbar;\n // inset_offset_y shifts it down so it's centered in the visible area.\n let iz = camera.inset_zoom;\n let center = vec2f(\n (x + camera.pan_x) * camera.zoom * iz / camera.aspect,\n (y + camera.pan_y) * camera.zoom * iz + camera.inset_offset_y,\n );\n\n let q = quad_vertex(vi);\n // Clamp point size to [2, 32] pixels (physical).\n // min_ndc ensures points are always at least 2px — 1px quads can miss pixel\n // centers entirely depending on sub-pixel alignment, producing no fragments.\n let min_ndc = 4.0 / camera.viewport_height;\n let max_ndc = 64.0 / camera.viewport_height;\n let point_size = clamp(uni.point_size, min_ndc, max_ndc);\n // Aspect-correct the offset so circles stay circular on non-square canvases\n let offset = vec2f(q.x / camera.aspect, q.y) * (point_size * 0.5);\n\n // Scale opacity by zoom² to keep constant visual fill density (Reusser).\n // Only applied for auto-computed opacity; manual values are used as-is.\n // Capped at 1 so a lone point never exceeds its own color; above 1, channels\n // clip unevenly and shift the hue (e.g., orange turns yellow).\n let z = camera.zoom * camera.inset_zoom;\n let zoom_scale = select(1.0, z * z, uni.scale_opacity_by_zoom > 0.5);\n let eff_opacity = min(uni.opacity * zoom_scale, 1.0);\n\n // Resolve per-point color from LUT\n var col: vec4f;\n if uni.color_mode == 1u {\n // Continuous: read raw value from color column, normalize, interpolate LUT\n let raw = data[uni.color_column_offset + ii];\n let inv_range = select(0.0, 1.0 / uni.color_range, uni.color_range > 0.0);\n let t = clamp((raw - uni.color_min) * inv_range, 0.0, 1.0);\n let stops = f32(uni.color_num_stops - 1u);\n let pos = t * stops;\n let idx = min(u32(floor(pos)), uni.color_num_stops - 2u);\n let frac = pos - f32(idx);\n let c0 = unpackColor(colorLut[idx]);\n let c1 = unpackColor(colorLut[idx + 1u]);\n col = mix(c0, c1, frac);\n } else if uni.color_mode == 2u {\n // Categorical: read category index, direct palette lookup\n let catIdx = catIndices[ii];\n col = unpackColor(colorLut[catIdx % uni.color_num_stops]);\n } else if uni.color_mode == 3u {\n // 2D colormap: read two columns, normalize to UV, look up from 2D colormap\n let raw_u = data[uni.color_column_offset + ii];\n let raw_v = data[uni.color_column_offset_v + ii];\n let inv_range_u = select(0.0, 1.0 / uni.color_range, uni.color_range > 0.0);\n let inv_range_v = select(0.0, 1.0 / uni.color_range_v, uni.color_range_v > 0.0);\n let u_val = clamp((raw_u - uni.color_min) * inv_range_u, 0.0, 1.0);\n let v_val = clamp((raw_v - uni.color_min_v) * inv_range_v, 0.0, 1.0);\n let rgb = colormap2d(uni.color2d_map_index, u_val, v_val);\n col = vec4f(rgb, 1.0);\n } else {\n col = uni.color;\n }\n\n // Read selection\n var sel: u32 = 1u;\n if uni.useSelectionMask > 0.5 {\n sel = (selectionMask[ii / 32u] >> (ii % 32u)) & 1u;\n }\n\n var out: VertOut;\n out.clip_pos = vec4f(center + offset, 0.0, 1.0);\n out.uv = q;\n out.point_color = col;\n out.selected = sel;\n out.effective_opacity = eff_opacity;\n return out;\n}\n\n// Shared fragment helper — computes edge, selection factor, and intensity.\nfn fragment_intensity(\n uv: vec2f,\n point_alpha: f32,\n selected: u32,\n effective_opacity: f32,\n) -> f32 {\n let dist = length(uv);\n // Smooth anti-aliased edge — naturally 0 for dist >= 1.0, so no discard needed.\n // Avoiding discard preserves early-Z and SIMD wavefront occupancy.\n let edge = 1.0 - smoothstep(0.75, 1.0, dist);\n\n // Selection: boost selected, dim unselected\n var sel_factor = 1.0;\n if uni.useSelectionMask > 0.5 {\n if selected == 0u {\n sel_factor = 0.1;\n } else {\n sel_factor = 1.0 / max(effective_opacity, 0.01);\n }\n }\n\n return edge * effective_opacity * point_alpha * sel_factor;\n}\n\n// ─── Fragment: single-target (additive / subtractive) ──────────────────────\n\n@fragment\nfn fs_main(\n @location(0) uv: vec2f,\n @location(1) point_color: vec4f,\n @location(2) @interpolate(flat) selected: u32,\n @location(3) @interpolate(flat) effective_opacity: f32,\n) -> @location(0) vec4f {\n let intensity = fragment_intensity(uv, point_color.a, selected, effective_opacity);\n // Subtractive mode (Reusser): output complement color so that\n // reverse-subtract blend (dst - src) on a white bg yields the correct hue.\n let rgb = select(point_color.rgb, vec3f(1.0) - point_color.rgb, uni.useSubtractive > 0.5);\n return vec4f(rgb * intensity, intensity);\n}\n`,S=`// Fullscreen tone-map pass — reads an HDR float texture and maps to [0,1]\n// for the canvas. Uses a single oversized triangle (3 vertices, no vertex\n// buffer) to cover the viewport.\n//\n// Mode 0 (additive): per-channel exponential compression 1-exp(-x).\n// Dense regions desaturate toward white, which also shifts the hue\n// (weaker channels catch up with the strongest).\n// Mode 1 (normal / subtractive): simple clamp to [0,1].\n// Values are already bounded; tone mapping is identity.\n\nstruct Params {\n mode: f32,\n}\n\n@group(0) @binding(0) var hdrTexture: texture_2d<f32>;\n@group(0) @binding(1) var<uniform> params: Params;\n\n@vertex\nfn vs(@builtin(vertex_index) vi: u32) -> @builtin(position) vec4f {\n // Oversized triangle covering the full clip space:\n // vi=0 → (-1, -1) vi=1 → (3, -1) vi=2 → (-1, 3)\n let x = f32(i32(vi) / 2) * 4.0 - 1.0;\n let y = f32(i32(vi) % 2) * 4.0 - 1.0;\n return vec4f(x, y, 0.0, 1.0);\n}\n\n@fragment\nfn fs(@builtin(position) pos: vec4f) -> @location(0) vec4f {\n let hdr = textureLoad(hdrTexture, vec2u(pos.xy), 0);\n\n var mapped: vec3f;\n if params.mode < 0.5 {\n // Additive: exponential compression preserving density structure\n mapped = 1.0 - exp(-hdr.rgb);\n } else {\n // Normal / Subtractive: values already in [0,1], just clamp\n mapped = clamp(hdr.rgb, vec3f(0.0), vec3f(1.0));\n }\n return vec4f(mapped, 1.0);\n}\n`;const C={pointSize:.012,opacity:.7,color:[.25,.5,.9],scaleOpacityByZoom:!0},w={useSelectionMask:!1},T={mode:0,columnOffset:0,min:0,range:1,numStops:0,columnOffsetV:0,minV:0,rangeV:1,mapIndex:0},E={panX:0,panY:0,zoom:1,aspect:1,viewportHeight:1,insetOffsetY:0,insetZoom:1,use3d:!1,rotation:null},D=/* @__PURE__ */ new ArrayBuffer(96),O=new Float32Array(D),k=new Uint32Array(D),A=/* @__PURE__ */ new Float32Array(20),te=/* @__PURE__ */ new Float32Array(4),ne=(e,t=`rgba32float`)=>{let n=e.createShaderModule({label:`point-shader`,code:ee}),r=e.createBindGroupLayout({label:`point-bgl`,entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:`uniform`}},{binding:1,visibility:GPUShaderStage.VERTEX,buffer:{type:`read-only-storage`}},{binding:2,visibility:GPUShaderStage.VERTEX,buffer:{type:`uniform`}},{binding:3,visibility:GPUShaderStage.VERTEX,buffer:{type:`read-only-storage`}},{binding:4,visibility:GPUShaderStage.VERTEX,buffer:{type:`read-only-storage`}},{binding:5,visibility:GPUShaderStage.VERTEX,buffer:{type:`read-only-storage`}},{binding:6,visibility:GPUShaderStage.VERTEX,buffer:{type:`read-only-storage`}}]}),i=e.createPipelineLayout({bindGroupLayouts:[r]}),a=e.createRenderPipeline({label:`point-pipeline-additive`,layout:i,vertex:{module:n,entryPoint:`vs_main`},fragment:{module:n,entryPoint:`fs_main`,targets:[{format:t,blend:{color:{srcFactor:`one`,dstFactor:`one`},alpha:{srcFactor:`zero`,dstFactor:`one`}}}]},primitive:{topology:`triangle-strip`}}),o=e.createRenderPipeline({label:`point-pipeline-normal`,layout:i,vertex:{module:n,entryPoint:`vs_main`},fragment:{module:n,entryPoint:`fs_main`,targets:[{format:t,blend:{color:{srcFactor:`one`,dstFactor:`one-minus-src-alpha`},alpha:{srcFactor:`one`,dstFactor:`one-minus-src-alpha`}}}]},primitive:{topology:`triangle-strip`}}),s=e.createRenderPipeline({label:`point-pipeline-subtractive`,layout:i,vertex:{module:n,entryPoint:`vs_main`},fragment:{module:n,entryPoint:`fs_main`,targets:[{format:t,blend:{color:{operation:`reverse-subtract`,srcFactor:`one`,dstFactor:`one`},alpha:{srcFactor:`zero`,dstFactor:`one`}}}]},primitive:{topology:`triangle-strip`}}),c=e.createBuffer({label:`point-uniforms`,size:96,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),l=e.createBuffer({label:`camera-uniforms`,size:80,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),u=e.createBuffer({label:`default-color-lut-buf`,size:4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),d=e.createBuffer({label:`default-selection-buf`,size:4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),f=e.createBuffer({label:`default-cat-indices-buf`,size:4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});return re(e,c,C,w,T),ie(e,l,E),{additivePipeline:a,normalPipeline:o,subtractivePipeline:s,bindGroupLayout:r,uniformBuffer:c,cameraBuffer:l,defaultColorLutBuffer:u,defaultSelectionBuffer:d,defaultCatIndicesBuffer:f}},re=(e,t,n,r=w,i=T,a=!1,o=0,s=0,c=0,l=0,u=0,d=0)=>{O[0]=n.pointSize,O[1]=n.opacity,k[2]=i.mode,O[3]=+!!r.useSelectionMask,O[4]=n.color[0],O[5]=n.color[1],O[6]=n.color[2],O[7]=1,O[8]=+!!a,k[9]=o,k[10]=s,k[11]=u,O[12]=c,O[13]=l,k[14]=i.columnOffset,O[15]=i.min,O[16]=i.range,k[17]=i.numStops,O[18]=d,k[19]=i.columnOffsetV,O[20]=i.minV,O[21]=i.rangeV,k[22]=i.mapIndex,O[23]=+!!n.scaleOpacityByZoom,e.queue.writeBuffer(t,0,D)},ie=(e,t,n)=>{A[0]=n.panX,A[1]=n.panY,A[2]=n.zoom,A[3]=n.aspect,A[4]=n.viewportHeight,A[5]=n.insetOffsetY,A[6]=n.insetZoom,A[7]=+!!n.use3d;let r=n.rotation;A[8]=r?r[0]:1,A[9]=r?r[1]:0,A[10]=r?r[2]:0,A[11]=0,A[12]=r?r[3]:0,A[13]=r?r[4]:1,A[14]=r?r[5]:0,A[15]=0,A[16]=r?r[6]:0,A[17]=r?r[7]:0,A[18]=r?r[8]:1,A[19]=0,e.queue.writeBuffer(t,0,A)},ae=(e,t,n,r,i,a,o,s,c)=>e.createBindGroup({label:`point-bg`,layout:t,entries:[{binding:0,resource:{buffer:n}},{binding:1,resource:{buffer:r}},{binding:2,resource:{buffer:i}},{binding:3,resource:{buffer:a}},{binding:4,resource:{buffer:o}},{binding:5,resource:{buffer:s}},{binding:6,resource:{buffer:c}}]}),oe=(e,t,n)=>{te[0]=n,e.queue.writeBuffer(t,0,te,0,1)},se=(e,t)=>{let n=e.createShaderModule({label:`tonemap-shader`,code:S}),r=e.createBindGroupLayout({label:`tonemap-bgl`,entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:`unfilterable-float`}},{binding:1,visibility:GPUShaderStage.FRAGMENT,buffer:{type:`uniform`}}]});return{pipeline:e.createRenderPipeline({label:`tonemap-pipeline`,layout:e.createPipelineLayout({bindGroupLayouts:[r]}),vertex:{module:n,entryPoint:`vs`},fragment:{module:n,entryPoint:`fs`,targets:[{format:t}]},primitive:{topology:`triangle-list`}}),bindGroupLayout:r,paramsBuffer:e.createBuffer({label:`tonemap-params`,size:4,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST})}},ce=(e,t,n,r)=>e.createBindGroup({label:`tonemap-bg`,layout:t,entries:[{binding:0,resource:n},{binding:1,resource:{buffer:r}}]});var le=`// ND → 2D projection compute shader (used only for lasso selection readback)\n//\n// Reads p-dimensional point data from a single concatenated storage buffer\n// (column-major: dim0[0..N], dim1[0..N], ..., dimP[0..N]),\n// normalizes each dimension using per-dim [center, range] params,\n// and projects to 2D using the supplied p×2 basis matrix.\n//\n// Output: N interleaved [x, y] pairs in the projected buffer.\n//\n// IMPORTANT: This must stay mathematically equivalent to the render-path\n// projection in point.wgsl + computeAdjustedBasis() in worker.ts.\n// The render path folds normalization into the basis on CPU (adj_basis, bias)\n// while this shader normalizes per-point on GPU. Both produce identical\n// projected coordinates: ((raw - center) / range) * basis * viewport_scale.\n\nstruct Params {\n num_points: u32,\n num_dims: u32,\n viewport_scale: f32,\n _pad: f32,\n}\n\n@group(0) @binding(0) var<uniform> params: Params;\n@group(0) @binding(1) var<storage, read> data: array<f32>;\n// norm_params[d] = vec2f(center, range) for dimension d\n@group(0) @binding(2) var<storage, read> norm_params: array<vec2f>;\n// basis: column-major p×2 — first p floats = x-weights, next p = y-weights\n@group(0) @binding(3) var<storage, read> basis: array<f32>;\n@group(0) @binding(4) var<storage, read_write> projected: array<f32>;\n\n@compute @workgroup_size(256)\nfn project(@builtin(global_invocation_id) gid: vec3u) {\n let i = gid.x;\n if (i >= params.num_points) { return; }\n\n let N = params.num_points;\n let p = params.num_dims;\n\n var x = 0.0;\n var y = 0.0;\n\n for (var d = 0u; d < p; d++) {\n let raw = data[d * N + i];\n let np = norm_params[d];\n let range = max(np.y, 1e-6);\n let v = (raw - np.x) / range;\n\n x += v * basis[d];\n y += v * basis[p + d];\n }\n\n projected[i * 2u] = x * params.viewport_scale;\n projected[i * 2u + 1u] = y * params.viewport_scale;\n}\n`;const ue=e=>{let t=e.createShaderModule({label:`compute-projection`,code:le}),n=e.createBindGroupLayout({label:`projection-bgl`,entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:`uniform`}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}}]});return{pipeline:e.createComputePipeline({label:`projection-pipeline`,layout:e.createPipelineLayout({bindGroupLayouts:[n]}),compute:{module:t,entryPoint:`project`}}),bindGroupLayout:n,paramsBuffer:e.createBuffer({label:`projection-params`,size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST})}},de=(e,t,n,r,i)=>{let a=/* @__PURE__ */ new ArrayBuffer(16),o=new Uint32Array(a),s=new Float32Array(a);o[0]=n,o[1]=r,s[2]=i,s[3]=0,e.queue.writeBuffer(t,0,a)},fe=(e,t,n)=>({dataBuffer:e.createBuffer({label:`nd-data`,size:t*n*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC}),normParamsBuffer:e.createBuffer({label:`norm-params`,size:n*8,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),basisBuffer:e.createBuffer({label:`basis`,size:n*2*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),projectedBuffer:e.createBuffer({label:`projected`,size:t*2*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC}),bindGroup:null}),pe=(e,t,n,r)=>e.createBindGroup({label:`projection-bg`,layout:t,entries:[{binding:0,resource:{buffer:n}},{binding:1,resource:{buffer:r.dataBuffer}},{binding:2,resource:{buffer:r.normParamsBuffer}},{binding:3,resource:{buffer:r.basisBuffer}},{binding:4,resource:{buffer:r.projectedBuffer}}]}),me=(e,t,n,r)=>{let i=e.createCommandEncoder({label:`projection-dispatch`}),a=i.beginComputePass({label:`project-points`});return a.setPipeline(t.pipeline),a.setBindGroup(0,n),a.dispatchWorkgroups(Math.ceil(r/256)),a.end(),i.finish()};var he=`// Residual-PC compute shader — two-pass reduction.\n//\n// Computes the covariance matrix of the residual after projecting out\n// the current p×2 tour basis. The top eigenvector of this covariance\n// is the \"most informative direction not currently visible.\"\n//\n// Pass 1 (reduce_partial): each workgroup reduces its chunk of N points\n// into partial sums for p means + p*(p+1)/2 upper-triangle cross-products\n// of the per-point residuals.\n//\n// Pass 2 (final_reduce): one workgroup sums all partial sums → final\n// mean-corrected covariance. Result layout:\n// [mean_0 .. mean_{p-1}, cov_00, cov_01, ..., cov_{p-1,p-1}]\n// where the covariance entries are the upper triangle packed as:\n// index(d1,d2) = d1*p - d1*(d1-1)/2 + (d2-d1) (d2 >= d1)\n//\n// Power iteration (15 steps) is performed on the CPU after readback;\n// p is always small (≤64) so this is negligible.\n\nstruct Params {\n num_points: u32,\n num_dims: u32,\n num_workgroups: u32,\n _pad: u32,\n}\n\n@group(0) @binding(0) var<uniform> params: Params;\n@group(0) @binding(1) var<storage, read> data: array<f32>;\n@group(0) @binding(2) var<storage, read> norm_params: array<vec2f>;\n// basis: column-major p×2 — first p floats = x-weights, next p = y-weights\n@group(0) @binding(3) var<storage, read> basis: array<f32>;\n@group(0) @binding(4) var<storage, read_write> partials: array<f32>;\n@group(0) @binding(5) var<storage, read_write> result: array<f32>;\n\nconst WG: u32 = 256u;\nconst MAX_DIMS: u32 = 64u;\n\nvar<workgroup> wg_reduce: array<f32, 256>;\n\nfn cov_idx(d: u32, d1: u32, d2: u32) -> u32 {\n return d1 * d - d1 * (d1 - 1u) / 2u + (d2 - d1);\n}\n\n// ─── Pass 1: per-workgroup partial sums ─────────────────────────────────────\n\n@compute @workgroup_size(256)\nfn reduce_partial(\n @builtin(global_invocation_id) gid: vec3u,\n @builtin(local_invocation_id) lid: vec3u,\n @builtin(workgroup_id) wid: vec3u,\n) {\n let N = params.num_points;\n let d = min(params.num_dims, MAX_DIMS);\n let num_cov = d * (d + 1u) / 2u;\n let num_terms = d + num_cov;\n let i = gid.x;\n let valid = i < N;\n\n // Load normalized values into registers, then project out the 2D basis.\n var vals: array<f32, 64>;\n if (valid) {\n var dot_x = 0.0;\n var dot_y = 0.0;\n for (var dim = 0u; dim < d; dim++) {\n let raw = data[dim * N + i];\n let np = norm_params[dim];\n let range = max(np.y, 1e-6);\n let norm = (raw - np.x) / range;\n vals[dim] = norm;\n dot_x += norm * basis[dim];\n dot_y += norm * basis[d + dim];\n }\n // Subtract projection onto span{bx, by} → residual is orthogonal to basis\n for (var dim = 0u; dim < d; dim++) {\n vals[dim] -= dot_x * basis[dim] + dot_y * basis[d + dim];\n }\n }\n\n // Reduce mean terms (used for mean-correction in pass 2)\n for (var dim = 0u; dim < d; dim++) {\n wg_reduce[lid.x] = select(0.0, vals[dim], valid);\n workgroupBarrier();\n for (var s = WG / 2u; s > 0u; s >>= 1u) {\n if (lid.x < s) { wg_reduce[lid.x] += wg_reduce[lid.x + s]; }\n workgroupBarrier();\n }\n if (lid.x == 0u) {\n partials[wid.x * num_terms + dim] = wg_reduce[0];\n }\n }\n\n // Reduce upper-triangle cross-products\n for (var d1 = 0u; d1 < d; d1++) {\n for (var d2 = d1; d2 < d; d2++) {\n wg_reduce[lid.x] = select(0.0, vals[d1] * vals[d2], valid);\n workgroupBarrier();\n for (var s = WG / 2u; s > 0u; s >>= 1u) {\n if (lid.x < s) { wg_reduce[lid.x] += wg_reduce[lid.x + s]; }\n workgroupBarrier();\n }\n if (lid.x == 0u) {\n partials[wid.x * num_terms + d + cov_idx(d, d1, d2)] = wg_reduce[0];\n }\n }\n }\n}\n\n// ─── Pass 2: reduce across workgroups → final mean-corrected covariance ─────\n\n@compute @workgroup_size(256)\nfn final_reduce(@builtin(local_invocation_id) lid: vec3u) {\n let d = min(params.num_dims, MAX_DIMS);\n let num_cov = d * (d + 1u) / 2u;\n let num_terms = d + num_cov;\n let nwg = params.num_workgroups;\n let N_f32 = f32(params.num_points);\n\n for (var t = 0u; t < num_terms; t++) {\n var sum = 0.0;\n var w = lid.x;\n while (w < nwg) {\n sum += partials[w * num_terms + t];\n w += WG;\n }\n wg_reduce[lid.x] = sum;\n workgroupBarrier();\n for (var s = WG / 2u; s > 0u; s >>= 1u) {\n if (lid.x < s) { wg_reduce[lid.x] += wg_reduce[lid.x + s]; }\n workgroupBarrier();\n }\n if (lid.x == 0u) { result[t] = wg_reduce[0] / N_f32; }\n workgroupBarrier();\n }\n\n // Mean-corrected covariance: cov(X,Y) = E[XY] - E[X]*E[Y]\n if (lid.x == 0u) {\n for (var d1 = 0u; d1 < d; d1++) {\n for (var d2 = d1; d2 < d; d2++) {\n let ci = cov_idx(d, d1, d2);\n result[d + ci] -= result[d1] * result[d2];\n }\n }\n }\n}\n`;const ge=e=>{let t=e.createShaderModule({label:`compute-residual-pc`,code:he}),n=e.createBindGroupLayout({label:`residual-pc-bgl`,entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:`uniform`}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}},{binding:5,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}}]}),r=e.createPipelineLayout({bindGroupLayouts:[n]});return{partialPipeline:e.createComputePipeline({label:`residual-pc-partial`,layout:r,compute:{module:t,entryPoint:`reduce_partial`}}),finalPipeline:e.createComputePipeline({label:`residual-pc-final`,layout:r,compute:{module:t,entryPoint:`final_reduce`}}),bindGroupLayout:n,paramsBuffer:e.createBuffer({label:`residual-pc-params`,size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST})}},_e=async(e,t,n,r,i,a,o,s)=>{let c=Math.min(s,64),l=c+c*(c+1)/2,u=Math.ceil(o/256),d=/* @__PURE__ */ new ArrayBuffer(16),f=new Uint32Array(d);f[0]=o,f[1]=c,f[2]=u,f[3]=0,e.queue.writeBuffer(t.paramsBuffer,0,d);let p=e.createBuffer({label:`residual-pc-partials`,size:u*l*4,usage:GPUBufferUsage.STORAGE}),m=e.createBuffer({label:`residual-pc-result`,size:l*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC}),h=e.createBuffer({label:`residual-pc-readback`,size:l*4,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),g=e.createBindGroup({label:`residual-pc-bg`,layout:t.bindGroupLayout,entries:[{binding:0,resource:{buffer:t.paramsBuffer}},{binding:1,resource:{buffer:n}},{binding:2,resource:{buffer:r}},{binding:3,resource:{buffer:i}},{binding:4,resource:{buffer:p}},{binding:5,resource:{buffer:m}}]}),_=e.createCommandEncoder({label:`residual-pc`}),v=_.beginComputePass({label:`residual-pc-partial`});v.setPipeline(t.partialPipeline),v.setBindGroup(0,g),v.dispatchWorkgroups(u),v.end();let y=_.beginComputePass({label:`residual-pc-final`});y.setPipeline(t.finalPipeline),y.setBindGroup(0,g),y.dispatchWorkgroups(1),y.end(),_.copyBufferToBuffer(m,0,h,0,l*4),e.queue.submit([_.finish()]),await h.mapAsync(GPUMapMode.READ);let b=new Float32Array(h.getMappedRange()).slice();return h.unmap(),p.destroy(),m.destroy(),h.destroy(),ve(b,c,s,a)},ve=(e,t,n,r)=>{let i=new Float64Array(t*t);for(let n=0;n<t;n++)for(let r=n;r<t;r++){let a=e[t+(n*t-n*(n-1)/2+(r-n))];i[n*t+r]=a,i[r*t+n]=a}let a=new Float64Array(t),o=new Float64Array(t);for(let e=0;e<t;e++)a[e]=r[e],o[e]=r[n+e];let s=new Float64Array(t);for(let e=0;e<t;e++)s[e]=1;ye(s,a,o,t),be(s,t);let c=new Float64Array(t);for(let e=0;e<15;e++){for(let e=0;e<t;e++){let n=0;for(let r=0;r<t;r++)n+=i[e*t+r]*s[r];c[e]=n}ye(c,a,o,t),be(c,t);let e=s;s=c,c=e}let l=new Float32Array(n);for(let e=0;e<t;e++)l[e]=s[e];return l},ye=(e,t,n,r)=>{let i=0,a=0;for(let o=0;o<r;o++)i+=e[o]*t[o],a+=e[o]*n[o];for(let o=0;o<r;o++)e[o]=e[o]-(i*t[o]+a*n[o])},be=(e,t)=>{let n=0;for(let r=0;r<t;r++)n+=e[r]*e[r];if(n=Math.sqrt(n),n>1e-12)for(let r=0;r<t;r++)e[r]=e[r]/n};let j=null,M=[],N=null;const P=(e,t)=>{self.postMessage(e,t??[])},xe=(e,t,n,r,i,a)=>{if(e===0||t===0||n===0)return{pointSize:.012,opacity:.7};let o=n*r,s=o*o*i/e,c=Math.sqrt(s/Math.PI),l=a*r*.5,u,d;return c>=l?(u=c,d=1):(u=l,d=Math.max(.01,s/(Math.PI*l*l))),{pointSize:2*u/o,opacity:d}},Se=(e,t)=>e*j.dpr/t,Ce=e=>{let{style:t,numPoints:n,dpr:r}=j;if(t.pointSize!==`auto`&&t.opacity!==`auto`)return{pointSize:Se(t.pointSize,e.height),opacity:t.opacity,color:t.color,scaleOpacityByZoom:!1};let i=xe(n,e.width/r,e.height/r,r,t.fillTarget,t.minPointSize),a=t.opacity===`auto`;return{pointSize:t.pointSize===`auto`?i.pointSize:Se(t.pointSize,e.height),opacity:a?i.opacity:t.opacity,color:t.color,scaleOpacityByZoom:a}},we=()=>{let{device:e,mainView:t,tonemapPipeline:n}=j,{width:r,height:i}=t.canvas,a=j.mainHdrTexture;if(a&&a.width===r&&a.height===i)return;a?.destroy();let o=e.createTexture({label:`hdr-main`,size:[r,i],format:j.hdrFormat,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),s=o.createView();j.mainHdrTexture=o,j.mainHdrTextureView=s,j.mainTonemapBindGroup=ce(e,n.bindGroupLayout,s,n.paramsBuffer)},Te=()=>{if(!j.previewGpuCanvas)return;let{device:e,tonemapPipeline:t}=j,{width:n,height:r}=j.previewGpuCanvas,i=j.previewHdrTexture;if(i&&i.width===n&&i.height===r)return;i?.destroy();let a=e.createTexture({label:`hdr-preview`,size:[n,r],format:j.hdrFormat,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),o=a.createView();j.previewHdrTexture=a,j.previewHdrTextureView=o,j.previewTonemapBindGroup=ce(e,t.bindGroupLayout,o,t.paramsBuffer)},Ee=e=>Math.ceil(e/32)*4,F=GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC,De=()=>{if(!j)throw Error(`state not initialized`);let e=Ee(j.numPoints);return(!j.selectionBuffer||j.selectionBuffer.size!==e)&&(j.selectionBuffer?.destroy(),j.selectionBuffer=j.device.createBuffer({label:`selection-mask`,size:e,usage:F})),j.selectionBuffer},Oe=(e,t)=>{let{device:n}=j,r=n.createBuffer({label:`column-selection-readback`,size:e.size,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),i=n.createCommandEncoder({label:`column-selection-readback`});i.copyBufferToBuffer(e,0,r,0,e.size),n.queue.submit([i.finish()]);let a=X;r.mapAsync(GPUMapMode.READ).then(()=>{let e=new Uint32Array(r.getMappedRange().slice(0));r.unmap(),t.id===Z&&a===X&&P({type:`columnSelectionResult`,mask:e,...t},[e.buffer])}).catch(()=>{}).finally(()=>r.destroy())};let I=1,L=null;const ke=(e,t,n,r,i=2)=>{let a=r*i;(!L||L.length!==a)&&(L=new Float32Array(a));let o=0,s=0,c=0;for(let a=0;a<r;a++){let l=Math.max(n[a],1e-6),u=e[a],d=e[r+a],f=2*I,p=f/l;L[a]=u*p,L[r+a]=d*p;let m=-t[a]/l;if(o+=m*u*f,s+=m*d*f,i===3){let t=e[2*r+a];L[2*r+a]=t*p,c+=m*t*f}}return{weights:L,biasX:o,biasY:s,biasZ:c}},R=()=>{if(!j?.normMins||!j?.normRanges)return null;let e=j.numDims,t=new Float32Array(e);if(j.centering===`mean`&&j.normMeans)t.set(j.normMeans);else for(let n=0;n<e;n++)t[n]=j.normMins[n]+j.normRanges[n]*.5;return t},Ae=()=>{if(!j?.projectionResources||!j.normRanges)return;let e=j.numDims,t=R();if(!t)return;let n=new Float32Array(e*2);for(let r=0;r<e;r++)n[r*2]=t[r],n[r*2+1]=j.normRanges[r];j.device.queue.writeBuffer(j.projectionResources.normParamsBuffer,0,n)};let z=null,je=0,B=!0,V=!1;const H=()=>B?(B=!1,V=!1,q(),j.device.queue.onSubmittedWorkDone().then(()=>{B=!0,V&&j&&!z&&(V=!1,H())},()=>{B=!0,P({type:`lost`,message:`WebGPU device lost during rendering`})}),!0):(V=!0,!1),Me=e=>{if(!z||!j?.tour)return;let t=z.prevTime===null?void 0:e-z.prevTime;if(t!==void 0){let e=t/1e3*z.speed*z.direction/20,n=j.tour.position+e;n-=Math.floor(n),j.tour.position=n}z.prevTime=e,j.directBasis=null,H()&&(z.lastRenderedRafTime!==null&&z.frameTimes.push(e-z.lastRenderedRafTime),z.lastRenderedRafTime=e),e-je>=33&&(P({type:`playbackTick`,position:j.tour.position,frameMs:t}),je=e),z.rafId=requestAnimationFrame(Me)},Ne=(e,t)=>{z?(z.speed=e,z.direction=t):(B=!0,z={speed:e,direction:t,prevTime:null,rafId:0,frameTimes:[],lastRenderedRafTime:null},z.rafId=requestAnimationFrame(Me))},Pe=()=>{if(z){cancelAnimationFrame(z.rafId),j?.tour&&P({type:`playbackTick`,position:j.tour.position});let e=Float64Array.from(z.frameTimes);P({type:`playbackStopped`,frameTimes:e},[e.buffer]),z=null}},U=(e,t,n,r,i,s)=>{if(!j?.projectionResources||!j.adjBasisBuffer||!j.normRanges)return;let{device:c,numPoints:l,numDims:u}=j,d=j.is3dActive&&j.residualPC,f=d?3:2,p;d?(p=new Float32Array(u*3),p.set(e.subarray(0,u*2)),p.set(j.residualPC,u*2)):p=e;let m=R();if(!m)return;let{weights:h,biasX:g,biasY:_,biasZ:v}=ke(p,m,j.normRanges,u,f),y=u*f*4;j.adjBasisBuffer.size<y&&(j.adjBasisBuffer.destroy(),j.adjBasisBuffer=c.createBuffer({label:`adj-basis`,size:y,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),J()),c.queue.writeBuffer(j.adjBasisBuffer,0,h);let b=Ce(t.canvas),x=j.backgroundColor,ee=.2126*x[0]+.7152*x[1]+.0722*x[2],S=j.colorState.mode>0,C=!S&&ee>.5,w,T;S?(w=j.pointPipeline.normalPipeline,T=1):C?(w=j.pointPipeline.subtractivePipeline,T=1):(w=j.pointPipeline.additivePipeline,T=0),re(c,j.pointPipeline.uniformBuffer,b,j.styleFlags,j.colorState,C,l,u,g,_,j.maxPoints,v),oe(c,j.tonemapPipeline.paramsBuffer,T);let E=t.canvas,D=E.width/E.height||1;ie(c,j.pointPipeline.cameraBuffer,{...i,aspect:D,viewportHeight:E.height});let O=c.createCommandEncoder({label:`render-frame`});a(O,n,w,s,l,x),o(O,t,j.tonemapPipeline.pipeline,r),c.queue.submit([O.finish()])},Fe={panX:0,panY:0,zoom:1,aspect:1,viewportHeight:1,insetOffsetY:0,insetZoom:1,use3d:!1,rotation:null},Ie=()=>{j&&!j.previewGpuCanvas&&(j.previewGpuCanvas=new OffscreenCanvas(300,300),j.previewGpuView=r(j.previewGpuCanvas,j.device))};let W=!1;const Le=(e,t)=>{if(!j?.projectionResources||!j.renderBindGroup)return;let n=j.previewCanvases.get(e);n&&(Ie(),Te(),j.previewGpuView&&j.previewHdrTextureView&&j.previewTonemapBindGroup&&((j.previewGpuCanvas.width!==n.canvas.width||j.previewGpuCanvas.height!==n.canvas.height)&&(j.previewGpuCanvas.width=n.canvas.width,j.previewGpuCanvas.height=n.canvas.height,Te(),!j.previewHdrTextureView||!j.previewTonemapBindGroup)||(U(t,j.previewGpuView,j.previewHdrTextureView,j.previewTonemapBindGroup,Fe,j.renderBindGroup),n.ctx2d.drawImage(j.previewGpuCanvas,0,0),P({type:`rendered`,viewIndex:e}))))},Re=()=>{if(!j?.projectionResources||!j.tour)return;let{tour:e,previewCanvases:t}=j;for(let[n]of t)n<e.bases.length&&Le(n,e.bases[n])},G=()=>{W||(W=!0,setTimeout(()=>{W=!1,Re()},0))},K=()=>{j?.projectionResources&&(q(),G())},q=()=>{if(!j?.projectionResources||!j.renderBindGroup||(we(),!j.mainHdrTextureView||!j.mainTonemapBindGroup))return;if(j.directBasis){U(j.directBasis,j.mainView,j.mainHdrTextureView,j.mainTonemapBindGroup,j.camera,j.renderBindGroup),P({type:`rendered`,viewIndex:0});return}if(!j.tour)return;let{tour:e}=j;m(e.interpolatedBasis,e.bases,e.arcLengths,e.dims,e.position,e.orthonormalize),U(e.interpolatedBasis,j.mainView,j.mainHdrTextureView,j.mainTonemapBindGroup,j.camera,j.renderBindGroup),P({type:`rendered`,viewIndex:0})},J=()=>{if(!j?.projectionResources||!j.adjBasisBuffer)return;let{device:e,projectionPipeline:t,pointPipeline:n,projectionResources:r}=j,i=j.colorLutBuffer??n.defaultColorLutBuffer,a=j.selectionBuffer??n.defaultSelectionBuffer,o=n.defaultCatIndicesBuffer;j.colorState.mode===2&&j.activeCatColumnName&&(o=j.categoricalBuffers.get(j.activeCatColumnName)??o),j.projectionBindGroup=pe(e,t.bindGroupLayout,t.paramsBuffer,r),j.renderBindGroup=ae(e,n.bindGroupLayout,n.uniformBuffer,r.dataBuffer,n.cameraBuffer,i,a,j.adjBasisBuffer,o)},Y=()=>{j&&(J(),(j.tour||j.directBasis)&&j.projectionResources&&K())},ze=()=>{j&&(j.styleFlags.useSelectionMask=!0,J(),(j.tour||j.directBasis)&&j.projectionResources&&K())};let X=0,Z=0;const Q=e=>e<Z?!1:(Z=e,!0),Be=e=>{if(!j)return;let{device:t}=j;if(e.data.type===`setColorContinuous`){if(e.data.dataVersion!==X)return;let{columnIndex:n,min:r,range:i,colormap:a}=e.data;j.colorLutBuffer?.destroy(),j.colorLutBuffer=t.createBuffer({label:`color-lut`,size:a.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),t.queue.writeBuffer(j.colorLutBuffer,0,a),j.colorState={mode:1,columnOffset:n*j.numPoints,min:r,range:i,numStops:a.length,columnOffsetV:0,minV:0,rangeV:1,mapIndex:0},j.activeCatColumnName=null,Y();return}if(e.data.type===`setColorCategorical`){if(e.data.dataVersion!==X)return;let{catColumnName:n,palette:r}=e.data;if(!j.categoricalBuffers.has(n))return;j.colorLutBuffer?.destroy(),j.colorLutBuffer=t.createBuffer({label:`color-lut`,size:r.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),t.queue.writeBuffer(j.colorLutBuffer,0,r),j.colorState={mode:2,columnOffset:0,min:0,range:1,numStops:r.length,columnOffsetV:0,minV:0,rangeV:1,mapIndex:0},j.activeCatColumnName=n,Y();return}if(e.data.type===`setColor2D`){if(e.data.dataVersion!==X)return;let{columnIndexX:n,columnIndexY:r,minX:i,rangeX:a,minY:o,rangeY:s,lut:c,mapIndex:l}=e.data;c&&(j.colorLutBuffer?.destroy(),j.colorLutBuffer=t.createBuffer({label:`color-lut-2d`,size:c.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),t.queue.writeBuffer(j.colorLutBuffer,0,c)),j.colorState={mode:3,columnOffset:n*j.numPoints,min:i,range:a,numStops:0,columnOffsetV:r*j.numPoints,minV:o,rangeV:s,mapIndex:l},j.activeCatColumnName=null,Y();return}if(e.data.type===`selectContinuous`){if(e.data.dataVersion!==X||!j.projectionResources||!Q(e.data.id))return;let{columnIndex:n,ranges:r}=e.data,{numPoints:i,colorPipelines:a}=j,o=De(),s=t.createBuffer({label:`select-ranges`,size:Math.max(r.byteLength,4),usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});t.queue.writeBuffer(s,0,r),y(t,a.paramsBuffer,i,n*i,r.length/2);let c=v(t,a.bindGroupLayout,j.projectionResources.dataBuffer,s,o,a.paramsBuffer),l=t.createCommandEncoder({label:`select-continuous`});l.clearBuffer(o,0,o.size);let u=l.beginComputePass({label:`select-continuous`});u.setPipeline(a.selectContinuous),u.setBindGroup(0,c),u.dispatchWorkgroups(Math.ceil(i/256)),u.end(),t.queue.submit([l.finish()]),s.destroy(),ze(),Oe(o,{id:e.data.id,column:e.data.column});return}if(e.data.type===`selectCategorical`){if(e.data.dataVersion!==X)return;let{catColumnName:n,selectedLabels:r}=e.data,i=j.categoricalBuffers.get(n);if(!i||!Q(e.data.id))return;let{numPoints:a,colorPipelines:o}=j,s=De(),c=t.createBuffer({label:`selected-labels`,size:Math.max(r.byteLength,4),usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});t.queue.writeBuffer(c,0,r),b(t,o.paramsBuffer,a,r.length);let l=v(t,o.bindGroupLayout,i,c,s,o.paramsBuffer),u=t.createCommandEncoder({label:`select-categorical`});u.clearBuffer(s,0,s.size);let d=u.beginComputePass({label:`select-categorical`});d.setPipeline(o.selectCategorical),d.setBindGroup(0,l),d.dispatchWorkgroups(Math.ceil(a/256)),d.end(),t.queue.submit([u.finish()]),c.destroy(),ze(),Oe(s,{id:e.data.id,column:n,labelIndices:e.data.labelIndices});return}if(e.data.type!==`data`)return;let{dataVersion:n,dims:r,rows:i,buffers:a,mins:o,ranges:s,means:c,categoricalColumns:l}=e.data;if(X=n,r<2||i===0||a.length<2){P({type:`error`,message:`Need at least 2 dimensions to render`});return}j.projectionResources&&(j.projectionResources.dataBuffer.destroy(),j.projectionResources.normParamsBuffer.destroy(),j.projectionResources.basisBuffer.destroy(),j.projectionResources.projectedBuffer.destroy()),j.adjBasisBuffer&&(j.adjBasisBuffer.destroy(),j.adjBasisBuffer=null),j.colorLutBuffer&&(j.colorLutBuffer.destroy(),j.colorLutBuffer=null),j.selectionBuffer&&(j.selectionBuffer.destroy(),j.selectionBuffer=null);for(let e of j.categoricalBuffers.values())e.destroy();j.categoricalBuffers.clear(),j.styleFlags={useSelectionMask:!1},j.colorState={mode:0,columnOffset:0,min:0,range:1,numStops:0,columnOffsetV:0,minV:0,rangeV:1,mapIndex:0},j.activeCatColumnName=null,j.is3dActive=!1,j.rotation3d=null,j.residualPC=null,j.camera.use3d=!1,j.camera.rotation=null;let{projectionPipeline:u}=j,d=fe(t,i,r);for(let e=0;e<r;e++)t.queue.writeBuffer(d.dataBuffer,e*i*4,a[e]);for(let e of l){let n=t.createBuffer({label:`cat-indices-${e.name}`,size:e.indices.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC});t.queue.writeBuffer(n,0,e.indices),j.categoricalBuffers.set(e.name,n)}if(de(t,u.paramsBuffer,i,r,2*I),j.adjBasisBuffer=t.createBuffer({label:`adj-basis`,size:r*2*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),j.normMins=new Float32Array(o),j.normRanges=new Float32Array(s),j.normMeans=new Float32Array(c),j.projectionResources={...d,bindGroup:null},j.numPoints=i,j.numDims=r,Ae(),J(),j.tour&&j.tour.dims===r)K();else{let e=Math.max(1,j.previewCanvases.size),t=[];for(let n=0;n<e;n++){let i=new Float32Array(r*2),a=Math.floor(n/e*r);i[a]=1,i[r+(a+1)%r]=1,t.push(i)}j.tour={bases:t,arcLengths:f(t,r),dims:r,orthonormalize:!0,position:0,interpolatedBasis:new Float32Array(r*2)},K()}},$=(e,t)=>{e.projectionResources&&(e.residualPcPipeline||=ge(e.device),e.device.queue.writeBuffer(e.projectionResources.basisBuffer,0,t),_e(e.device,e.residualPcPipeline,e.projectionResources.dataBuffer,e.projectionResources.normParamsBuffer,e.projectionResources.basisBuffer,t,e.numPoints,e.numDims).then(e=>{j?.is3dActive&&(j.residualPC=e,P({type:`residualPC`,residualPC:new Float32Array(e)}),q())}))},Ve=e=>{if(j){if(e.type===`setBases`){let{bases:t}=e;if(t.length===0)return;let n=t[0].length/2,r=e.tourFamily!==`sequential`,i=f(t,n,r);j.tour={bases:t,arcLengths:i,dims:n,orthonormalize:r,position:j.tour?.position??0,interpolatedBasis:new Float32Array(n*2)},j.projectionResources&&K()}else if(e.type===`setTourPosition`){if(!j.tour)return;j.tour.position=e.position,j.directBasis=null,H()}else if(e.type===`setStyle`)j.style={pointSize:e.pointSize,opacity:e.opacity,color:e.color,minPointSize:e.minPointSize??j.style.minPointSize,fillTarget:e.fillTarget??j.style.fillTarget},(j.tour||j.directBasis)&&j.projectionResources&&K();else if(e.type===`setCamera`)j.camera={panX:e.pan[0],panY:e.pan[1],zoom:e.zoom,aspect:j.camera.aspect,viewportHeight:j.camera.viewportHeight,insetOffsetY:e.insetOffsetY,insetZoom:e.insetZoom,use3d:j.camera.use3d,rotation:j.camera.rotation},H();else if(e.type===`setProjectionScale`)I=e.scale,j.projectionResources&&de(j.device,j.projectionPipeline.paramsBuffer,j.numPoints,j.numDims,2*I),H(),G();else if(e.type===`setCentering`){if(j.centering=e.centering,Ae(),(j.tour||j.directBasis)&&j.projectionResources){if(j.is3dActive){let e=j.directBasis??j.tour?.interpolatedBasis;e&&$(j,e)}K()}}else if(e.type===`resize`)e.dpr!==void 0&&(j.dpr=e.dpr),e.viewIndex===0&&(j.mainView.canvas.width=e.width,j.mainView.canvas.height=e.height,(j.tour||j.directBasis)&&j.projectionResources&&q());else if(e.type===`addPreviewCanvas`){let t=e.canvas.getContext(`2d`);if(!t)return;j.previewCanvases.set(e.id,{canvas:e.canvas,ctx2d:t}),j.tour&&j.projectionResources&&e.id<j.tour.bases.length&&Le(e.id,j.tour.bases[e.id])}else if(e.type===`removePreviewCanvas`)j.previewCanvases.delete(e.id);else if(e.type===`resizePreview`){let t=j.previewCanvases.get(e.id);if(!t)return;t.canvas.width=e.width,t.canvas.height=e.height,j.tour&&j.projectionResources&&G()}else if(e.type===`render`)(j.tour||j.directBasis)&&j.projectionResources&&K();else if(e.type===`setDirectBasis`){if(!j.projectionResources||!j.renderBindGroup)return;j.directBasis=e.basis,H(),j.is3dActive&&j.projectionResources&&$(j,e.basis)}else if(e.type===`clearColors`)j.colorLutBuffer&&(j.colorLutBuffer.destroy(),j.colorLutBuffer=null),j.colorState={mode:0,columnOffset:0,min:0,range:1,numStops:0,columnOffsetV:0,minV:0,rangeV:1,mapIndex:0},j.activeCatColumnName=null,J(),(j.tour||j.directBasis)&&j.projectionResources&&K();else if(e.type===`setBackgroundColor`)j.backgroundColor=e.color,(j.tour||j.directBasis)&&j.projectionResources&&K();else if(e.type===`setMaxPoints`)j.maxPoints=e.maxPoints,(j.tour||j.directBasis)&&j.projectionResources&&K();else if(e.type===`setSelectionMask`){if(!Q(e.id))return;let{mask:t}=e;j.selectionBuffer&&j.selectionBuffer.destroy(),j.selectionBuffer=j.device.createBuffer({label:`selection-mask`,size:t.byteLength,usage:F}),j.device.queue.writeBuffer(j.selectionBuffer,0,t),j.styleFlags.useSelectionMask=!0,J(),(j.tour||j.directBasis)&&j.projectionResources&&K();let n=new Uint32Array(t);P({type:`selectionResult`,mask:n,id:e.id},[n.buffer])}else if(e.type===`clearSelectionMask`){if(!Q(e.id))return;j.selectionBuffer&&(j.selectionBuffer.destroy(),j.selectionBuffer=null),j.styleFlags.useSelectionMask=!1,J(),(j.tour||j.directBasis)&&j.projectionResources&&K(),P({type:`selectionResult`,mask:/* @__PURE__ */ new Uint32Array,id:e.id})}else if(e.type===`enable3d`){if(!j.projectionResources)return;let e=j.directBasis??j.tour?.interpolatedBasis;if(!e)return;if(j.is3dActive=!0,j.camera.use3d=!0,j.adjBasisBuffer){let e=j.numDims*3*4;j.adjBasisBuffer.size<e&&(j.adjBasisBuffer.destroy(),j.adjBasisBuffer=j.device.createBuffer({label:`adj-basis`,size:e,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),J())}q(),$(j,e)}else if(e.type===`disable3d`)j.is3dActive=!1,j.residualPC=null,j.rotation3d=null,j.camera.use3d=!1,j.camera.rotation=null,q();else if(e.type===`set3dRotation`)j.rotation3d=e.matrix,j.camera.rotation=e.matrix,H();else if(e.type===`startPlayback`){if(!j.tour)return;Ne(e.speed,e.direction)}else if(e.type===`stopPlayback`)Pe();else if(e.type===`computePCA`){if(!j.projectionResources||j.numDims<2){P({type:`error`,message:`No data loaded for PCA`});return}let{device:e,projectionResources:r,numPoints:i,numDims:a}=j;N||=t(e),n(e,N,r.dataBuffer,r.normParamsBuffer,i,a).then(({eigenvalues:e,eigenvectors:t})=>{P({type:`pcaResult`,eigenvectors:t,eigenvalues:e,numDims:t.length})}).catch(e=>{P({type:`error`,message:`PCA failed: ${e instanceof Error?e.message:String(e)}`})})}else if(e.type===`lassoSelect`){if(!j.projectionResources||!j.projectionBindGroup||j.numPoints===0||!Q(e.id))return;let t=X,{device:n,numPoints:r,projectionPipeline:i,projectionResources:a,camera:o}=j,{polygon:s}=e,c=s.length/2;if(c<3)return;let l=null;if(j.directBasis)l=j.directBasis;else if(j.tour){let{tour:e}=j;m(e.interpolatedBasis,e.bases,e.arcLengths,e.dims,e.position,e.orthonormalize),l=e.interpolatedBasis}if(!l)return;n.queue.writeBuffer(a.basisBuffer,0,l);let u=me(n,i,j.projectionBindGroup,r);n.queue.submit([u]);let d=j.mainView.canvas,f=d.width/d.height||1,p=o.insetZoom,h=o.zoom*p,g=new Float32Array(s.length);for(let e=0;e<c;e++)g[e*2]=s[e*2]*f/h-o.panX,g[e*2+1]=(s[e*2+1]-o.insetOffsetY)/h-o.panY;let _=r*2*4,v=n.createBuffer({label:`proj-readback`,size:_,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),y=n.createCommandEncoder();y.copyBufferToBuffer(a.projectedBuffer,0,v,0,_),n.queue.submit([y.finish()]),v.mapAsync(GPUMapMode.READ).then(()=>{if(e.id!==Z||t!==X){v.unmap(),v.destroy();return}let i=new Float32Array(v.getMappedRange()),a=new Uint32Array(Math.ceil(r/32));for(let e=0;e<r;e++){let t=i[e*2],n=i[e*2+1];if(Ge(t,n,g,c)){let t=e>>5;a[t]=(a[t]??0)|1<<(e&31)}}v.unmap(),v.destroy(),j.selectionBuffer&&j.selectionBuffer.destroy(),j.selectionBuffer=n.createBuffer({label:`selection-mask`,size:a.byteLength,usage:F}),n.queue.writeBuffer(j.selectionBuffer,0,a),j.styleFlags.useSelectionMask=!0,J(),(j.tour||j.directBasis)&&j.projectionResources&&K();let o=new Uint32Array(a);P({type:`selectionResult`,mask:o,id:e.id},[o.buffer])})}else if(e.type===`getProjectedPositions`){if(!j.projectionResources||!j.projectionBindGroup||j.numPoints===0){P({type:`projectedPositions`,positions:/* @__PURE__ */ new Float32Array},[]);return}let{device:e,numPoints:t,projectionPipeline:n,projectionResources:r}=j,i=null;if(j.directBasis)i=j.directBasis;else if(j.tour){let{tour:e}=j;m(e.interpolatedBasis,e.bases,e.arcLengths,e.dims,e.position,e.orthonormalize),i=e.interpolatedBasis}if(!i){P({type:`projectedPositions`,positions:/* @__PURE__ */ new Float32Array},[]);return}e.queue.writeBuffer(r.basisBuffer,0,i);let a=me(e,n,j.projectionBindGroup,t);e.queue.submit([a]);let o=t*2*4,s=e.createBuffer({label:`proj-positions-readback`,size:o,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),c=e.createCommandEncoder();c.copyBufferToBuffer(r.projectedBuffer,0,s,0,o),e.queue.submit([c.finish()]),s.mapAsync(GPUMapMode.READ).then(()=>{let e=new Float32Array(s.getMappedRange()).slice();s.unmap(),s.destroy(),P({type:`projectedPositions`,positions:e},[e.buffer])})}else if(e.type===`getPointData`){if(!j.projectionResources||j.numPoints===0){P({type:`pointData`,pointIndex:e.pointIndex,numericValues:{},categoricalValues:{}});return}let{device:t,numPoints:n,numDims:r,projectionResources:i}=j,a=e.pointIndex;if(a<0||a>=n){P({type:`pointData`,pointIndex:a,numericValues:{},categoricalValues:{}});return}let o=r*4,s=t.createBuffer({label:`point-data-readback`,size:o,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),c=t.createCommandEncoder();for(let e=0;e<r;e++)c.copyBufferToBuffer(i.dataBuffer,(e*n+a)*4,s,e*4,4);let l=Array.from(j.categoricalBuffers.keys()),u=l.length*4,d=null;if(u>0){d=t.createBuffer({label:`point-cat-readback`,size:u,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});let e=0;for(let t of l){let n=j.categoricalBuffers.get(t);c.copyBufferToBuffer(n,a*4,d,e,4),e+=4}}t.queue.submit([c.finish()]);let f=s.mapAsync(GPUMapMode.READ).then(()=>{let e=new Float32Array(s.getMappedRange()).slice();return s.unmap(),s.destroy(),e}),p=d?d.mapAsync(GPUMapMode.READ).then(()=>{let e=new Uint32Array(d.getMappedRange()).slice();return d.unmap(),d.destroy(),e}):Promise.resolve(/* @__PURE__ */ new Uint32Array);Promise.all([f,p]).then(([e,t])=>{let n={};for(let t=0;t<r;t++)n[String(t)]=e[t];let i={};for(let e=0;e<l.length;e++)i[l[e]]=t[e];P({type:`pointData`,pointIndex:a,numericValues:n,categoricalValues:i})})}else e.type===`benchmark`?We(e.numFrames):e.type===`getMetrics`&&Ue()}},He=()=>{if(!j)return 0;let e=0;if(j.projectionResources){let t=j.projectionResources;e+=t.dataBuffer.size+t.normParamsBuffer.size+t.basisBuffer.size+t.projectedBuffer.size}j.adjBasisBuffer&&(e+=j.adjBasisBuffer.size),j.selectionBuffer&&(e+=j.selectionBuffer.size),j.colorLutBuffer&&(e+=j.colorLutBuffer.size);for(let t of j.categoricalBuffers.values())e+=t.size;j.mainHdrTexture&&(e+=j.mainHdrTexture.width*j.mainHdrTexture.height*16),j.previewHdrTexture&&(e+=j.previewHdrTexture.width*j.previewHdrTexture.height*16);let t=j.pointPipeline;return e+=t.uniformBuffer.size+t.cameraBuffer.size,e+=t.defaultColorLutBuffer.size+t.defaultSelectionBuffer.size+t.defaultCatIndicesBuffer.size,e+=j.projectionPipeline.paramsBuffer.size,e+=j.tonemapPipeline.paramsBuffer.size,e},Ue=()=>{if(!j)return;let e=0;if(j.tour){for(let t of j.tour.bases)e+=t.byteLength;e+=j.tour.interpolatedBasis.byteLength}P({type:`metricsResult`,gpuMemoryBytes:He(),numPoints:j.numPoints,numDims:j.numDims,workerJsHeapBytes:e})},We=async e=>{if(!j?.tour||!j.renderBindGroup||j.numPoints===0){P({type:`error`,message:`No data/tour loaded for benchmark`});return}let{device:t,numPoints:n,numDims:r,tour:i}=j,a=i.position;j.directBasis=null;for(let e=0;e<5;e++)i.position=e/5,m(i.interpolatedBasis,i.bases,i.arcLengths,i.dims,i.position,i.orthonormalize),we(),U(i.interpolatedBasis,j.mainView,j.mainHdrTextureView,j.mainTonemapBindGroup,j.camera,j.renderBindGroup),await t.queue.onSubmittedWorkDone();let o=new Float64Array(e);for(let n=0;n<e;n++){i.position=n/e,m(i.interpolatedBasis,i.bases,i.arcLengths,i.dims,i.position,i.orthonormalize);let r=performance.now();U(i.interpolatedBasis,j.mainView,j.mainHdrTextureView,j.mainTonemapBindGroup,j.camera,j.renderBindGroup),await t.queue.onSubmittedWorkDone(),o[n]=performance.now()-r}i.position=a,P({type:`benchmarkResult`,frameTimes:o,numPoints:n,numDims:r},[o.buffer])},Ge=(e,t,n,r)=>{let i=!1;for(let a=0,o=r-1;a<r;o=a++){let r=n[a*2],s=n[a*2+1],c=n[o*2],l=n[o*2+1];s>t!=l>t&&e<(c-r)*(t-s)/(l-s)+r&&(i=!i)}return i};self.onmessage=async e=>{let t=e.data;if(t.type===`init`)try{let{device:e}=await x();e.lost.then(e=>{e.reason!==`destroyed`&&P({type:`lost`,message:e.message})});let n=r(t.canvas,e),i=navigator.gpu.getPreferredCanvasFormat(),a=`rgba32float`,o=ne(e,a),s=ue(e),c=_(e),l=se(e,i);j={device:e,mainView:n,previewGpuCanvas:null,previewGpuView:null,previewCanvases:/* @__PURE__ */ new Map,pointPipeline:o,renderBindGroup:null,projectionPipeline:s,projectionResources:null,projectionBindGroup:null,colorPipelines:c,numPoints:0,numDims:0,categoricalBuffers:/* @__PURE__ */ new Map,tour:null,style:{pointSize:`auto`,opacity:`auto`,color:[.25,.5,.9],minPointSize:2,fillTarget:.5},styleFlags:{useSelectionMask:!1},camera:{panX:0,panY:0,zoom:t.zoom,aspect:1,viewportHeight:1,insetOffsetY:0,insetZoom:1,use3d:!1,rotation:null},colorLutBuffer:null,colorState:{mode:0,columnOffset:0,min:0,range:1,numStops:0,columnOffsetV:0,minV:0,rangeV:1,mapIndex:0},activeCatColumnName:null,selectionBuffer:null,directBasis:null,backgroundColor:[0,0,0],dpr:t.dpr,hdrFormat:a,tonemapPipeline:l,mainHdrTexture:null,mainHdrTextureView:null,mainTonemapBindGroup:null,previewHdrTexture:null,previewHdrTextureView:null,previewTonemapBindGroup:null,maxPoints:0,adjBasisBuffer:null,normMins:null,normRanges:null,normMeans:null,centering:`midrange`,is3dActive:!1,rotation3d:null,residualPC:null,residualPcPipeline:null},t.dataPort.onmessage=Be;let u=M;if(M=null,u)for(let e of u)Ve(e);P({type:`ready`})}catch(e){P({type:`error`,message:e instanceof Error?e.message:String(e)})}else M?M.push(t):Ve(t)};", g = typeof self < "u" && self.Blob && new Blob(["URL.revokeObjectURL(import.meta.url);", h], { type: "text/javascript;charset=utf-8" });
2686
+ function _(e) {
2640
2687
  let t;
2641
2688
  try {
2642
- if (t = h && (self.URL || self.webkitURL).createObjectURL(h), !t) throw "";
2689
+ if (t = g && (self.URL || self.webkitURL).createObjectURL(g), !t) throw "";
2643
2690
  let n = new Worker(t, {
2644
2691
  type: "module",
2645
2692
  name: e?.name
@@ -2648,7 +2695,7 @@ function g(e) {
2648
2695
  (self.URL || self.webkitURL).revokeObjectURL(t);
2649
2696
  }), n;
2650
2697
  } catch {
2651
- return new Worker("data:text/javascript;charset=utf-8," + encodeURIComponent(m), {
2698
+ return new Worker("data:text/javascript;charset=utf-8," + encodeURIComponent(h), {
2652
2699
  type: "module",
2653
2700
  name: e?.name
2654
2701
  });
@@ -2656,7 +2703,7 @@ function g(e) {
2656
2703
  }
2657
2704
  //#endregion
2658
2705
  //#region src/gpu/client.ts
2659
- var _ = (e) => {
2706
+ var v = (e) => {
2660
2707
  let t = e.reduce((e, t) => e + t, 0) / e.length, n = Float64Array.from(e).sort();
2661
2708
  return {
2662
2709
  avgMs: t,
@@ -2666,12 +2713,12 @@ var _ = (e) => {
2666
2713
  minMs: n[0],
2667
2714
  maxMs: n[e.length - 1]
2668
2715
  };
2669
- }, v = (e, t, n) => {
2670
- e.postMessage(t, n ?? []);
2671
2716
  }, y = (e, t, n) => {
2672
2717
  e.postMessage(t, n ?? []);
2673
- }, b = (e) => {
2674
- let { canvas: t, zoom: n = 1, dpr: r = typeof self < "u" && "devicePixelRatio" in self ? self.devicePixelRatio : 1 } = e, i = new g(), a = new p(), o = new MessageChannel(), s = /* @__PURE__ */ new Set(), c = (e) => {
2718
+ }, b = (e, t, n) => {
2719
+ e.postMessage(t, n ?? []);
2720
+ }, x = (e) => {
2721
+ let { canvas: t, zoom: n = 1, dpr: r = typeof self < "u" && "devicePixelRatio" in self ? self.devicePixelRatio : 1 } = e, i = new _(), a = new p(), o = new MessageChannel(), s = /* @__PURE__ */ new Set(), c = (e) => {
2675
2722
  for (let t of s) t(e);
2676
2723
  };
2677
2724
  i.onmessage = (e) => {
@@ -2680,11 +2727,9 @@ var _ = (e) => {
2680
2727
  let e = t.frameTimes;
2681
2728
  c({
2682
2729
  ...t,
2683
- stats: _(e)
2730
+ stats: v(e)
2684
2731
  });
2685
- return;
2686
- }
2687
- c(t);
2732
+ } else c(t);
2688
2733
  }, i.onerror = (e) => {
2689
2734
  c({
2690
2735
  type: "error",
@@ -2702,10 +2747,10 @@ var _ = (e) => {
2702
2747
  });
2703
2748
  };
2704
2749
  let l = t.transferControlToOffscreen();
2705
- y(a, {
2750
+ b(a, {
2706
2751
  type: "init",
2707
2752
  gpuPort: o.port1
2708
- }, [o.port1]), v(i, {
2753
+ }, [o.port1]), y(i, {
2709
2754
  type: "init",
2710
2755
  canvas: l,
2711
2756
  dataPort: o.port2,
@@ -2728,27 +2773,27 @@ var _ = (e) => {
2728
2773
  insetOffsetY: 0,
2729
2774
  insetZoom: 1
2730
2775
  }, f = (e) => {
2731
- y(a, {
2776
+ M.reset(), b(a, {
2732
2777
  type: "load",
2733
2778
  buffer: e
2734
2779
  }, [e]);
2735
- }, m = (e, t) => {
2780
+ }, h = (e, t) => {
2736
2781
  let n = e.map((e) => e.buffer);
2737
- v(i, {
2782
+ y(i, {
2738
2783
  type: "setBases",
2739
2784
  bases: e,
2740
2785
  tourFamily: t
2741
2786
  }, n);
2742
- }, h = (e) => {
2743
- v(i, {
2787
+ }, g = (e) => {
2788
+ y(i, {
2744
2789
  type: "setTourPosition",
2745
2790
  position: e
2746
2791
  });
2747
- }, b = (e) => {
2792
+ }, x = (e) => {
2748
2793
  u = {
2749
2794
  ...u,
2750
2795
  ...e
2751
- }, v(i, {
2796
+ }, y(i, {
2752
2797
  type: "setStyle",
2753
2798
  pointSize: u.pointSize,
2754
2799
  opacity: u.opacity,
@@ -2756,113 +2801,99 @@ var _ = (e) => {
2756
2801
  minPointSize: u.minPointSize,
2757
2802
  fillTarget: u.fillTarget
2758
2803
  });
2759
- }, x = (e) => {
2804
+ }, S = (e) => {
2760
2805
  d = {
2761
2806
  ...d,
2762
2807
  ...e
2763
- }, v(i, {
2808
+ }, y(i, {
2764
2809
  type: "setCamera",
2765
2810
  pan: d.pan,
2766
2811
  zoom: d.zoom,
2767
2812
  insetOffsetY: d.insetOffsetY,
2768
2813
  insetZoom: d.insetZoom
2769
2814
  });
2770
- }, S = (e) => {
2771
- v(i, {
2815
+ }, C = (e) => {
2816
+ y(i, {
2772
2817
  type: "setCentering",
2773
2818
  centering: e
2774
2819
  });
2775
- }, C = (e, t, n, r) => {
2776
- v(i, {
2820
+ }, w = (e) => {
2821
+ y(i, {
2822
+ type: "setProjectionScale",
2823
+ scale: e
2824
+ });
2825
+ }, T = (e, t, n, r) => {
2826
+ y(i, {
2777
2827
  type: "resize",
2778
2828
  viewIndex: e,
2779
2829
  width: t,
2780
2830
  height: n,
2781
2831
  dpr: r
2782
2832
  });
2783
- }, w = () => {
2784
- v(i, { type: "render" });
2785
- }, T = (e) => {
2786
- v(i, {
2833
+ }, E = () => {
2834
+ y(i, { type: "render" });
2835
+ }, D = (e) => {
2836
+ y(i, {
2787
2837
  type: "setDirectBasis",
2788
2838
  basis: e
2789
2839
  }, [e.buffer]);
2790
- }, E = (e, t, n, r) => {
2791
- y(a, {
2840
+ }, O = (e, t, n, r) => {
2841
+ let i = {
2792
2842
  type: "encodeColor",
2793
2843
  column: e,
2794
2844
  ...t ? { palette: t } : {},
2795
2845
  ...n ? { theme: n } : {},
2796
2846
  ...r ? { colorMap: r } : {}
2797
- });
2798
- }, D = (e, t, n = "schumann") => {
2799
- y(a, {
2847
+ };
2848
+ b(a, i);
2849
+ }, k = (e, t, n = "schumann") => {
2850
+ b(a, {
2800
2851
  type: "encodeColor2D",
2801
2852
  columnX: e,
2802
2853
  columnY: t,
2803
2854
  colormap: n
2804
2855
  });
2805
- }, O = (e) => {
2806
- v(i, {
2856
+ }, A = (e) => {
2857
+ y(i, {
2807
2858
  type: "setBackgroundColor",
2808
2859
  color: e
2809
2860
  });
2810
- }, k = () => {
2811
- v(i, { type: "clearColors" });
2812
- }, A = (e, t) => {
2813
- let n = t.valueRanges ? new Float32Array(t.valueRanges) : void 0, r = [];
2814
- n && r.push(n.buffer), y(a, {
2815
- type: "selectByColumn",
2816
- column: e,
2817
- labelIndices: t.labelIndices,
2818
- valueRanges: n
2819
- }, r);
2820
- }, j = (e) => {
2821
- v(i, {
2822
- type: "setSelectionMask",
2823
- mask: e
2824
- }, [e.buffer]);
2825
- }, M = (e) => {
2826
- v(i, {
2827
- type: "lassoSelect",
2828
- polygon: e
2829
- }, [e.buffer]);
2830
- }, N = () => {
2831
- v(i, { type: "clearSelectionMask" });
2832
- }, P = () => {
2833
- v(i, { type: "computePCA" });
2834
- }, F = (e, t) => {
2835
- v(i, {
2861
+ }, j = () => {
2862
+ y(i, { type: "clearColors" });
2863
+ }, M = m((e, t) => b(a, e, t), (e, t) => y(i, e, t)), N = () => {
2864
+ y(i, { type: "computePCA" });
2865
+ }, P = (e, t) => {
2866
+ y(i, {
2836
2867
  type: "startPlayback",
2837
2868
  speed: e,
2838
2869
  direction: t
2839
2870
  });
2840
- }, I = () => {
2841
- v(i, { type: "stopPlayback" });
2842
- }, L = (e) => {
2843
- v(i, {
2871
+ }, F = () => {
2872
+ y(i, { type: "stopPlayback" });
2873
+ }, I = (e) => {
2874
+ y(i, {
2844
2875
  type: "setMaxPoints",
2845
2876
  maxPoints: e
2846
2877
  });
2878
+ }, L = () => {
2879
+ y(i, { type: "enable3d" });
2847
2880
  }, R = () => {
2848
- v(i, { type: "enable3d" });
2849
- }, z = () => {
2850
- v(i, { type: "disable3d" });
2851
- }, B = (e) => {
2852
- v(i, {
2881
+ y(i, { type: "disable3d" });
2882
+ }, z = (e) => {
2883
+ y(i, {
2853
2884
  type: "set3dRotation",
2854
2885
  matrix: e
2855
2886
  });
2856
- }, V = (e = 120) => new Promise((t) => {
2857
- let n = U((e) => {
2887
+ }, B = (e = 120) => new Promise((t) => {
2888
+ let n = H((e) => {
2858
2889
  e.type === "benchmarkResult" && (n(), t(e));
2859
2890
  });
2860
- v(i, {
2891
+ y(i, {
2861
2892
  type: "benchmark",
2862
2893
  numFrames: e
2863
2894
  });
2864
- }), H = () => new Promise((e) => {
2865
- let t = U((n) => {
2895
+ }), V = () => new Promise((e) => {
2896
+ let t = H((n) => {
2866
2897
  if (n.type !== "metricsResult") return;
2867
2898
  t();
2868
2899
  let r = typeof performance < "u" && "memory" in performance ? performance.memory.usedJSHeapSize : void 0, i = Number.isFinite(r) ? r : null, a = Number.isFinite(n.workerJsHeapBytes) ? n.workerJsHeapBytes : null;
@@ -2872,78 +2903,80 @@ var _ = (e) => {
2872
2903
  workerJsHeapUsedBytes: a
2873
2904
  });
2874
2905
  });
2875
- v(i, { type: "getMetrics" });
2876
- }), U = (e) => (s.add(e), () => s.delete(e)), W;
2906
+ y(i, { type: "getMetrics" });
2907
+ }), H = (e) => (s.add(e), () => s.delete(e)), U;
2877
2908
  return {
2878
2909
  loadData: f,
2879
- setBases: m,
2880
- setTourPosition: h,
2881
- setStyle: b,
2882
- setCamera: x,
2883
- setCentering: S,
2884
- resize: C,
2885
- render: w,
2886
- setDirectBasis: T,
2887
- encodeColor: E,
2888
- encodeColor2D: D,
2889
- setBackgroundColor: O,
2890
- clearColor: k,
2891
- selectByColumn: A,
2892
- setSelectionMask: j,
2893
- lassoSelect: M,
2894
- clearSelection: N,
2895
- getProjectedPositions: () => (W && W.unsub(), new Promise((e) => {
2896
- let t = U((n) => {
2897
- n.type === "projectedPositions" && (t(), W = void 0, e(n.positions));
2910
+ setBases: h,
2911
+ setTourPosition: g,
2912
+ setStyle: x,
2913
+ setCamera: S,
2914
+ setCentering: C,
2915
+ setProjectionScale: w,
2916
+ resize: T,
2917
+ render: E,
2918
+ setDirectBasis: D,
2919
+ encodeColor: O,
2920
+ encodeColor2D: k,
2921
+ setBackgroundColor: A,
2922
+ clearColor: j,
2923
+ selectByColumn: M.selectByColumn,
2924
+ setSelectionMask: M.setSelectionMask,
2925
+ lassoSelect: M.lassoSelect,
2926
+ clearSelection: M.clearSelection,
2927
+ latestSelectionId: M.latestSelectionId,
2928
+ getProjectedPositions: () => (U && U.unsub(), new Promise((e) => {
2929
+ let t = H((n) => {
2930
+ n.type === "projectedPositions" && (t(), U = void 0, e(n.positions));
2898
2931
  });
2899
- W = { unsub: t }, v(i, { type: "getProjectedPositions" });
2932
+ U = { unsub: t }, y(i, { type: "getProjectedPositions" });
2900
2933
  })),
2901
2934
  getPointData: (e) => new Promise((t) => {
2902
- let n = U((r) => {
2903
- r.type !== "pointData" || r.pointIndex !== e || (n(), t(r));
2935
+ let n = H((r) => {
2936
+ r.type === "pointData" && r.pointIndex === e && (n(), t(r));
2904
2937
  });
2905
- v(i, {
2938
+ y(i, {
2906
2939
  type: "getPointData",
2907
2940
  pointIndex: e
2908
2941
  });
2909
2942
  }),
2910
- computePCA: P,
2911
- startPlayback: F,
2912
- stopPlayback: I,
2913
- setMaxPoints: L,
2914
- enable3d: R,
2915
- disable3d: z,
2916
- set3dRotation: B,
2917
- benchmark: V,
2918
- getMetrics: H,
2943
+ computePCA: N,
2944
+ startPlayback: P,
2945
+ stopPlayback: F,
2946
+ setMaxPoints: I,
2947
+ enable3d: L,
2948
+ disable3d: R,
2949
+ set3dRotation: z,
2950
+ benchmark: B,
2951
+ getMetrics: V,
2919
2952
  addPreviewCanvas: (e, t) => {
2920
2953
  let n = t.transferControlToOffscreen();
2921
- v(i, {
2954
+ y(i, {
2922
2955
  type: "addPreviewCanvas",
2923
2956
  id: e,
2924
2957
  canvas: n
2925
2958
  }, [n]);
2926
2959
  },
2927
2960
  removePreviewCanvas: (e) => {
2928
- v(i, {
2961
+ y(i, {
2929
2962
  type: "removePreviewCanvas",
2930
2963
  id: e
2931
2964
  });
2932
2965
  },
2933
2966
  resizePreview: (e, t, n) => {
2934
- v(i, {
2967
+ y(i, {
2935
2968
  type: "resizePreview",
2936
2969
  id: e,
2937
2970
  width: t,
2938
2971
  height: n
2939
2972
  });
2940
2973
  },
2941
- subscribe: U,
2974
+ subscribe: H,
2942
2975
  destroy: () => {
2943
2976
  i.terminate(), a.terminate(), s.clear();
2944
2977
  }
2945
2978
  };
2946
- }, x = (e, t) => {
2979
+ }, S = (e, t) => {
2947
2980
  let n = new Uint32Array(Math.ceil(t / 32));
2948
2981
  for (let r = 0; r < e.length; r++) {
2949
2982
  let i = e[r];
@@ -2953,21 +2986,21 @@ var _ = (e) => {
2953
2986
  }
2954
2987
  }
2955
2988
  return n;
2956
- }, S = 1e-10, C = (e) => {
2957
- let t = e[0], n = e[1], r = e[2], i = e[3], a = t * t + r * r, o = t * n + r * i, s = n * n + i * i, c = a + s, l = a * s - o * o, u = Math.sqrt(Math.max(0, c * c * .25 - l)), d = c * .5 + u, f = c * .5 - u, p = Math.sqrt(Math.max(0, d)), m = Math.sqrt(Math.max(0, f)), h = new Float32Array([p, m]), g = new Float32Array(4);
2958
- if (Math.abs(o) > S) {
2989
+ }, C = 1e-10, w = (e) => {
2990
+ let t = e[0], n = e[1], r = e[2], i = e[3], a = t * t + r * r, o = t * n + r * i, s = n * n + i * i, c = a + s, l = a * s - o * o, u = Math.sqrt(Math.max(0, c * c * .25 - l)), d = c * .5 + u, f = c * .5 - u, p = Math.sqrt(Math.max(0, d)), m = Math.sqrt(Math.max(0, f)), h = new Float32Array([p, m]), g = /* @__PURE__ */ new Float32Array(4);
2991
+ if (Math.abs(o) > C) {
2959
2992
  let e = d - s, t = Math.sqrt(e * e + o * o);
2960
2993
  g[0] = e / t, g[1] = o / t;
2961
2994
  let n = f - s, r = Math.sqrt(n * n + o * o);
2962
2995
  g[2] = n / r, g[3] = o / r;
2963
2996
  } else g[0] = 1, g[1] = 0, g[2] = 0, g[3] = 1;
2964
- let _ = new Float32Array(4);
2965
- return p > S && (_[0] = (t * g[0] + n * g[1]) / p, _[2] = (r * g[0] + i * g[1]) / p), m > S && (_[1] = (t * g[2] + n * g[3]) / m, _[3] = (r * g[2] + i * g[3]) / m), p <= S && m > S ? (_[0] = -_[3], _[2] = _[1]) : m <= S && p > S ? (_[1] = -_[2], _[3] = _[0]) : p <= S && m <= S && (_[0] = 1, _[1] = 0, _[2] = 0, _[3] = 1), {
2997
+ let _ = /* @__PURE__ */ new Float32Array(4);
2998
+ return p > C && (_[0] = (t * g[0] + n * g[1]) / p, _[2] = (r * g[0] + i * g[1]) / p), m > C && (_[1] = (t * g[2] + n * g[3]) / m, _[3] = (r * g[2] + i * g[3]) / m), p <= C && m > C ? (_[0] = -_[3], _[2] = _[1]) : m <= C && p > C ? (_[1] = -_[2], _[3] = _[0]) : p <= C && m <= C && (_[0] = 1, _[1] = 0, _[2] = 0, _[3] = 1), {
2966
2999
  U: _,
2967
3000
  S: h,
2968
3001
  V: g
2969
3002
  };
2970
- }, w = (e, t) => {
3003
+ }, T = (e, t) => {
2971
3004
  let n = 0;
2972
3005
  for (let r = 0; r < t; r++) n += e[r] * e[r];
2973
3006
  if (n = Math.sqrt(n), n > 1e-10) for (let r = 0; r < t; r++) e[r] = e[r] / n;
@@ -2977,20 +3010,20 @@ var _ = (e) => {
2977
3010
  let i = 0;
2978
3011
  for (let n = 0; n < t; n++) i += e[t + n] * e[t + n];
2979
3012
  if (i = Math.sqrt(i), i > 1e-10) for (let n = 0; n < t; n++) e[t + n] = e[t + n] / i;
2980
- }, T = (e, t, n, r, i, a, o, s = !0) => {
3013
+ }, E = (e, t, n, r, i, a, o, s = !0) => {
2981
3014
  let c = o * o, l = c * o, u = .5 * (-o + 2 * c - l), d = .5 * (2 - 5 * c + 3 * l), f = .5 * (o + 4 * c - 3 * l), p = .5 * (-c + l);
2982
3015
  for (let o = 0; o < a * 2; o++) e[o] = u * t[o] + d * n[o] + f * r[o] + p * i[o];
2983
- return s && w(e, a), e;
2984
- }, E = (e, t, n) => {
2985
- let r = new Float32Array(4);
3016
+ return s && T(e, a), e;
3017
+ }, D = (e, t, n) => {
3018
+ let r = /* @__PURE__ */ new Float32Array(4);
2986
3019
  for (let i = 0; i < 2; i++) for (let a = 0; a < 2; a++) {
2987
3020
  let o = 0;
2988
3021
  for (let r = 0; r < n; r++) o += e[i * n + r] * t[a * n + r];
2989
3022
  r[i * 2 + a] = o;
2990
3023
  }
2991
- let { S: i } = C(r), a = Math.acos(Math.max(-1, Math.min(1, i[0]))), o = Math.acos(Math.max(-1, Math.min(1, i[1])));
3024
+ let { S: i } = w(r), a = Math.acos(Math.max(-1, Math.min(1, i[0]))), o = Math.acos(Math.max(-1, Math.min(1, i[1])));
2992
3025
  return Math.sqrt(a * a + o * o);
2993
- }, D = 8, O = (e, t, n = !0) => {
3026
+ }, O = 8, k = (e, t, n = !0) => {
2994
3027
  let r = e.length, i = new Float32Array(r + 1);
2995
3028
  if (i[0] = 0, !n) {
2996
3029
  for (let e = 1; e <= r; e++) i[e] = e / r;
@@ -2999,17 +3032,17 @@ var _ = (e) => {
2999
3032
  let a = new Float32Array(t * 2), o = new Float32Array(t * 2);
3000
3033
  for (let n = 0; n < r; n++) {
3001
3034
  let s = (n - 1 + r) % r, c = n, l = (n + 1) % r, u = (n + 2) % r, d = 0;
3002
- T(a, e[s], e[c], e[l], e[u], t, 0);
3003
- for (let n = 1; n <= D; n++) {
3004
- let r = n / D;
3005
- T(o, e[s], e[c], e[l], e[u], t, r), d += E(a, o, t), a.set(o);
3035
+ E(a, e[s], e[c], e[l], e[u], t, 0);
3036
+ for (let n = 1; n <= O; n++) {
3037
+ let r = n / O;
3038
+ E(o, e[s], e[c], e[l], e[u], t, r), d += D(a, o, t), a.set(o);
3006
3039
  }
3007
3040
  i[n + 1] = i[n] + d;
3008
3041
  }
3009
3042
  let s = i[r];
3010
3043
  if (s > 1e-10) for (let e = 1; e <= r; e++) i[e] = i[e] / s;
3011
3044
  return i;
3012
- }, k = (e, t) => {
3045
+ }, A = (e, t) => {
3013
3046
  let n = e.length - 1, r = Math.max(0, Math.min(1, t)), i = 0, a = n - 1;
3014
3047
  for (; i < a;) {
3015
3048
  let t = i + a >>> 1;
@@ -3020,14 +3053,14 @@ var _ = (e) => {
3020
3053
  segment: i,
3021
3054
  localT: c
3022
3055
  };
3023
- }, A = (e, t, n, r, i, a = !0) => {
3024
- let o = t.length, { segment: s, localT: c } = k(n, i), l = (s - 1 + o) % o, u = s, d = (s + 1) % o, f = (s + 2) % o;
3025
- return T(e, t[l], t[u], t[d], t[f], r, c, a);
3026
- }, j = "var e=`#version 300 es\n// Point fragment shader — SDF circle anti-aliasing\n//\n// WebGL2 equivalent of point.wgsl fs_main. Uses gl_PointCoord for the\n// SDF distance (maps [0,1] in gl.POINTS, remap to [-1,1]).\n\nprecision highp float;\nprecision highp int;\n\nflat in float v_effOpacity;\nflat in vec4 v_color;\nflat in uint v_selected;\nflat in float v_useSubtractive;\nflat in float v_useSelectionMask;\n\nlayout(location = 0) out vec4 fragColor;\n\nvoid main() {\n // gl_PointCoord is [0,1], remap to [-1,1] for SDF\n vec2 uv = gl_PointCoord * 2.0 - 1.0;\n float dist = length(uv);\n\n // Smooth anti-aliased edge — naturally 0 for dist >= 1.0, so no discard needed.\n // Avoiding discard preserves early-Z and SIMD wavefront occupancy.\n float edge = 1.0 - smoothstep(0.75, 1.0, dist);\n\n // Selection: boost selected, dim unselected\n float sel_factor = 1.0;\n if (v_useSelectionMask > 0.5) {\n if (v_selected == 0u) {\n sel_factor = 0.1;\n } else {\n sel_factor = 1.0 / max(v_effOpacity, 0.01);\n }\n }\n\n float intensity = edge * v_effOpacity * v_color.a * sel_factor;\n\n // Subtractive mode (Reusser): output complement color so that\n // reverse-subtract blend (dst - src) on a white bg yields the correct hue.\n vec3 rgb = v_color.rgb;\n if (v_useSubtractive > 0.5) {\n rgb = vec3(1.0) - rgb;\n }\n\n fragColor = vec4(rgb * intensity, intensity);\n}\n`,t=`#version 300 es\n// Point renderer — gl.POINTS with SDF circle anti-aliasing\n//\n// WebGL2 equivalent of point.wgsl. Projects raw ND data to 2D inline using\n// pre-adjusted basis weights and biases (normalization folded into the basis\n// on CPU). Uses gl.POINTS with gl_PointSize for native point expansion —\n// 1 vertex per point instead of 4 (instanced quads in WebGPU).\n//\n// Data is stored in a tiled R32F texture to handle point counts exceeding\n// MAX_TEXTURE_SIZE. Layout: width=texWidth, height=numDims*tileRows.\n// For point idx: col = idx % texWidth, row = d * tileRows + idx / texWidth.\n//\n// Color mapping: instead of a pre-computed N-element color texture, the shader\n// reads raw data values and looks up colors from a tiny LUT at render time.\n\nprecision highp float;\nprecision highp int;\nprecision highp sampler2D;\nprecision highp usampler2D;\n\n// Raw ND data (column-major, tiled).\n// R32F texture: width = texWidth, height = numDims * tileRows.\nuniform sampler2D u_data;\n\n// Adjusted basis weights (normalization folded in).\n// Max 128 dims — for higher, fall back to a basis texture.\nuniform float u_adjBasisX[128];\nuniform float u_adjBasisY[128];\nuniform vec2 u_bias;\n\n// Style\nuniform float u_pointSize; // NDC units\nuniform float u_opacity;\nuniform vec4 u_color; // uniform point color (RGBA 0-1)\nuniform float u_useSubtractive;\nuniform float u_scaleOpacityByZoom; // 1.0 = auto (zoom² density scaling), 0.0 = manual\n\n// Camera\nuniform vec2 u_pan;\nuniform float u_zoom;\nuniform float u_aspect;\nuniform float u_viewportHeight;\nuniform float u_insetOffsetY;\nuniform float u_insetZoom;\n\n// Data dimensions\nuniform int u_numPoints;\nuniform int u_numDims;\n\n// Decimation: 0 = disabled\nuniform int u_maxPoints;\n\n// Tiling: texture width (min(numPoints, MAX_TEXTURE_SIZE))\nuniform int u_texWidth;\n\n// Color mapping — tiny LUT replaces N-element packed color texture\n// 0 = uniform color, 1 = continuous, 2 = categorical, 3 = 2D colormap\nuniform int u_colorMode;\nuniform int u_colorColumnIndex; // which data column to read (continuous only)\nuniform float u_colorMin;\nuniform float u_colorRange;\nuniform int u_colorNumStops; // LUT size\nuniform usampler2D u_colorLutTex; // packed RGBA u32 LUT (width=numStops, height=1)\nuniform usampler2D u_catIndexTex; // categorical indices (R32UI, tiled like data tex)\n\n// 2D colormap params (used when u_colorMode == 3)\nuniform int u_colorColumnIndexV; // second data column\nuniform float u_colorMinV;\nuniform float u_colorRangeV;\nuniform int u_color2dMapIndex; // 0-5 = LUT-based, 6 = oklab_polar\nuniform float u_color2dLut[128]; // SVD rank-1 LUT curves (8 × 16 entries)\n\n// Selection mask (bit-packed u32 in R32UI texture, width = ceil(N/32), height = 1)\nuniform float u_useSelectionMask;\nuniform usampler2D u_selectionTex;\n\nflat out float v_effOpacity;\nflat out vec4 v_color;\nflat out uint v_selected;\nflat out float v_useSubtractive;\nflat out float v_useSelectionMask;\n\n// Unpack RGBA8 from u32 (0xAABBGGRR little-endian)\nvec4 unpackColor(uint packed) {\n float r = float(packed & 0xFFu) / 255.0;\n float g = float((packed >> 8u) & 0xFFu) / 255.0;\n float b = float((packed >> 16u) & 0xFFu) / 255.0;\n float a = float((packed >> 24u) & 0xFFu) / 255.0;\n return vec4(r, g, b, a);\n}\n\n// PCG hash — fast, high-quality deterministic random from vertex index.\n// Used for vertex-shader decimation when numPoints > maxPoints.\nuint pcg_hash(uint v) {\n uint state = v * 747796405u + 2891336453u;\n uint word = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u;\n return (word >> 22u) ^ word;\n}\n\nfloat random_float(uint seed) {\n return float(pcg_hash(seed)) / 4294967295.0;\n}\n\n// ── 2D colormap helpers ──\n\n// Linearly interpolate within a 16-entry LUT curve starting at base offset.\nfloat lut2d_interp(int base, float t) {\n float pos = t * 15.0;\n int lo = min(int(floor(pos)), 14);\n int hi = lo + 1;\n return mix(u_color2dLut[base + lo], u_color2dLut[base + hi], fract(pos));\n}\n\n// Reconstruct 2D color from SVD rank-1 LUT curves.\n// Layout: R_X[16] R_Y[16] G_X[16] G_Y[16] B_X[16] B_Y[16] B_X2[16] B_Y2[16]\nvec3 colormap2d_lut(float u, float v) {\n float r = lut2d_interp(0, u) * lut2d_interp(16, v);\n float g = lut2d_interp(32, u) * lut2d_interp(48, v);\n float b = lut2d_interp(64, u) * lut2d_interp(80, v)\n + lut2d_interp(96, u) * lut2d_interp(112, v);\n return clamp(vec3(r, g, b), vec3(0.0), vec3(1.0));\n}\n\n// Oklab → linear sRGB conversion\nvec3 oklabToLinear(vec3 lab) {\n float l_ = lab.x + 0.3963377774 * lab.y + 0.2158037573 * lab.z;\n float m_ = lab.x - 0.1055613458 * lab.y - 0.0638541728 * lab.z;\n float s_ = lab.x - 0.0894841775 * lab.y - 1.2914855480 * lab.z;\n float l = l_ * l_ * l_;\n float m = m_ * m_ * m_;\n float s = s_ * s_ * s_;\n return vec3(\n 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,\n -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,\n -0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s\n );\n}\n\n// Oklab polar 2D colormap: hue = angle, chroma = radius, lightness varies\nvec3 colormap2d_oklab_polar(float u, float v) {\n float cx = u - 0.5;\n float cy = v - 0.5;\n float radius = min(length(vec2(cx, cy)) * 2.0, 1.0);\n float angle = atan(cy, cx);\n float chroma = radius * 0.25;\n float L = mix(0.3, 0.85, 1.0 - radius);\n float a = chroma * cos(angle);\n float b = chroma * sin(angle);\n vec3 linear = oklabToLinear(vec3(L, a, b));\n return pow(clamp(linear, vec3(0.0), vec3(1.0)), vec3(1.0 / 2.2));\n}\n\nvec3 colormap2d(int mapIndex, float u, float v) {\n if (mapIndex == 6) {\n return colormap2d_oklab_polar(u, v);\n }\n return colormap2d_lut(u, v);\n}\n\nvoid main() {\n int idx = gl_VertexID;\n\n // Vertex-shader decimation: skip expensive projection for excess points.\n if (u_maxPoints > 0 && u_numPoints > u_maxPoints) {\n float threshold = float(u_maxPoints) / float(u_numPoints);\n if (random_float(uint(idx)) > threshold) {\n gl_Position = vec4(0.0, 0.0, 0.0, 0.0);\n gl_PointSize = 0.0;\n v_effOpacity = 0.0;\n v_color = vec4(0.0);\n v_selected = 0u;\n v_useSubtractive = 0.0;\n v_useSelectionMask = 0.0;\n return;\n }\n }\n\n // Tiled texture coordinates: col = idx % texWidth, tileRow = idx / texWidth\n int tileRows = (u_numPoints + u_texWidth - 1) / u_texWidth;\n int tx = idx % u_texWidth;\n int tileRow = idx / u_texWidth;\n\n // Inline ND -> 2D projection with pre-adjusted basis.\n // CPU folds normalization into the basis weights and biases so the\n // hot loop is just: x += raw * adjBasisX[d], y += raw * adjBasisY[d]\n float x = u_bias.x;\n float y = u_bias.y;\n for (int d = 0; d < u_numDims; d++) {\n float raw = texelFetch(u_data, ivec2(tx, d * tileRows + tileRow), 0).r;\n x += raw * u_adjBasisX[d];\n y += raw * u_adjBasisY[d];\n }\n\n // Apply camera: translate then scale, with aspect correction on x.\n float iz = u_insetZoom;\n vec2 center = vec2(\n (x + u_pan.x) * u_zoom * iz / u_aspect,\n (y + u_pan.y) * u_zoom * iz + u_insetOffsetY\n );\n\n gl_Position = vec4(center, 0.0, 1.0);\n\n // Point size: clamp to [2, 32] physical pixels (same as WGSL)\n float min_ndc = 4.0 / u_viewportHeight;\n float max_ndc = 64.0 / u_viewportHeight;\n float ps = clamp(u_pointSize, min_ndc, max_ndc);\n // gl_PointSize is in physical pixels, convert from NDC\n gl_PointSize = ps * u_viewportHeight * 0.5;\n\n // Scale opacity by zoom^2 for constant visual fill density (Reusser).\n // Only applied for auto-computed opacity; manual values are used as-is.\n float z = u_zoom * u_insetZoom;\n float zoomScale = u_scaleOpacityByZoom > 0.5 ? z * z : 1.0;\n v_effOpacity = u_opacity * zoomScale;\n\n // Resolve per-point color from LUT\n if (u_colorMode == 1) {\n // Continuous: read raw value from color column, normalize, interpolate LUT\n float raw = texelFetch(u_data, ivec2(tx, u_colorColumnIndex * tileRows + tileRow), 0).r;\n float invRange = u_colorRange > 0.0 ? 1.0 / u_colorRange : 0.0;\n float t = clamp((raw - u_colorMin) * invRange, 0.0, 1.0);\n float stops = float(u_colorNumStops - 1);\n float pos = t * stops;\n int idx0 = min(int(floor(pos)), u_colorNumStops - 2);\n float frac = pos - float(idx0);\n vec4 c0 = unpackColor(texelFetch(u_colorLutTex, ivec2(idx0, 0), 0).r);\n vec4 c1 = unpackColor(texelFetch(u_colorLutTex, ivec2(idx0 + 1, 0), 0).r);\n v_color = mix(c0, c1, frac);\n } else if (u_colorMode == 2) {\n // Categorical: read category index from tiled texture, direct palette lookup\n uint catIdx = texelFetch(u_catIndexTex, ivec2(tx, tileRow), 0).r;\n int lutIdx = int(catIdx) % u_colorNumStops;\n v_color = unpackColor(texelFetch(u_colorLutTex, ivec2(lutIdx, 0), 0).r);\n } else if (u_colorMode == 3) {\n // 2D colormap: read two columns, normalize to UV, look up from 2D colormap\n float rawU = texelFetch(u_data, ivec2(tx, u_colorColumnIndex * tileRows + tileRow), 0).r;\n float rawV = texelFetch(u_data, ivec2(tx, u_colorColumnIndexV * tileRows + tileRow), 0).r;\n float invRangeU = u_colorRange > 0.0 ? 1.0 / u_colorRange : 0.0;\n float invRangeV = u_colorRangeV > 0.0 ? 1.0 / u_colorRangeV : 0.0;\n float uVal = clamp((rawU - u_colorMin) * invRangeU, 0.0, 1.0);\n float vVal = clamp((rawV - u_colorMinV) * invRangeV, 0.0, 1.0);\n vec3 rgb2d = colormap2d(u_color2dMapIndex, uVal, vVal);\n v_color = vec4(rgb2d, 1.0);\n } else {\n v_color = u_color;\n }\n\n // Read selection bit (not tiled — bit-packed width is small)\n v_selected = 1u;\n if (u_useSelectionMask > 0.5) {\n int word_idx = idx / 32;\n uint word = texelFetch(u_selectionTex, ivec2(word_idx, 0), 0).r;\n v_selected = (word >> uint(idx % 32)) & 1u;\n }\n\n v_useSubtractive = u_useSubtractive;\n v_useSelectionMask = u_useSelectionMask;\n}\n`,n=`#version 300 es\n// Fullscreen tone-map pass — reads HDR float texture and maps to [0,1].\n// Same logic as tonemap.wgsl.\n//\n// Mode 0 (additive): per-channel exponential compression 1-exp(-x).\n// Preserves hue ratios, dense regions desaturate toward white.\n// Mode 1 (normal / subtractive): simple clamp to [0,1].\n\nprecision highp float;\n\nuniform sampler2D u_hdrTexture;\nuniform float u_mode;\n\nlayout(location = 0) out vec4 fragColor;\n\nvoid main() {\n vec4 hdr = texelFetch(u_hdrTexture, ivec2(gl_FragCoord.xy), 0);\n\n vec3 mapped;\n if (u_mode < 0.5) {\n // Additive: exponential compression preserving density structure\n mapped = 1.0 - exp(-hdr.rgb);\n } else {\n // Normal / Subtractive: values already in [0,1], just clamp\n mapped = clamp(hdr.rgb, vec3(0.0), vec3(1.0));\n }\n fragColor = vec4(mapped, 1.0);\n}\n`,r=`#version 300 es\n// Fullscreen tone-map pass — oversized triangle (3 vertices, no vertex buffer).\n// Same geometry as tonemap.wgsl.\n\nvoid main() {\n // Oversized triangle covering the full clip space:\n // vi=0 -> (-1, -1) vi=1 -> (3, -1) vi=2 -> (-1, 3)\n float x = float(gl_VertexID / 2) * 4.0 - 1.0;\n float y = float(gl_VertexID % 2) * 4.0 - 1.0;\n gl_Position = vec4(x, y, 0.0, 1.0);\n}\n`;const i=1e-10,a=e=>{let t=e[0],n=e[1],r=e[2],a=e[3],o=t*t+r*r,s=t*n+r*a,c=n*n+a*a,l=o+c,u=o*c-s*s,d=Math.sqrt(Math.max(0,l*l*.25-u)),f=l*.5+d,p=l*.5-d,m=Math.sqrt(Math.max(0,f)),h=Math.sqrt(Math.max(0,p)),g=new Float32Array([m,h]),_=new Float32Array(4);if(Math.abs(s)>i){let e=f-c,t=Math.sqrt(e*e+s*s);_[0]=e/t,_[1]=s/t;let n=p-c,r=Math.sqrt(n*n+s*s);_[2]=n/r,_[3]=s/r}else _[0]=1,_[1]=0,_[2]=0,_[3]=1;let v=new Float32Array(4);return m>i&&(v[0]=(t*_[0]+n*_[1])/m,v[2]=(r*_[0]+a*_[1])/m),h>i&&(v[1]=(t*_[2]+n*_[3])/h,v[3]=(r*_[2]+a*_[3])/h),m<=i&&h>i?(v[0]=-v[3],v[2]=v[1]):h<=i&&m>i?(v[1]=-v[2],v[3]=v[0]):m<=i&&h<=i&&(v[0]=1,v[1]=0,v[2]=0,v[3]=1),{U:v,S:g,V:_}},o=(e,t)=>{let n=0;for(let r=0;r<t;r++)n+=e[r]*e[r];if(n=Math.sqrt(n),n>1e-10)for(let r=0;r<t;r++)e[r]=e[r]/n;let r=0;for(let n=0;n<t;n++)r+=e[n]*e[t+n];for(let n=0;n<t;n++)e[t+n]=e[t+n]-r*e[n];let i=0;for(let n=0;n<t;n++)i+=e[t+n]*e[t+n];if(i=Math.sqrt(i),i>1e-10)for(let n=0;n<t;n++)e[t+n]=e[t+n]/i},s=(e,t,n,r,i,a,s,c=!0)=>{let l=s*s,u=l*s,d=.5*(-s+2*l-u),f=.5*(2-5*l+3*u),p=.5*(s+4*l-3*u),m=.5*(-l+u);for(let o=0;o<a*2;o++)e[o]=d*t[o]+f*n[o]+p*r[o]+m*i[o];return c&&o(e,a),e},c=(e,t,n)=>{let r=new Float32Array(4);for(let i=0;i<2;i++)for(let a=0;a<2;a++){let o=0;for(let r=0;r<n;r++)o+=e[i*n+r]*t[a*n+r];r[i*2+a]=o}let{S:i}=a(r),o=Math.acos(Math.max(-1,Math.min(1,i[0]))),s=Math.acos(Math.max(-1,Math.min(1,i[1])));return Math.sqrt(o*o+s*s)},l=(e,t,n=!0)=>{let r=e.length,i=new Float32Array(r+1);if(i[0]=0,!n){for(let e=1;e<=r;e++)i[e]=e/r;return i}let a=new Float32Array(t*2),o=new Float32Array(t*2);for(let n=0;n<r;n++){let l=(n-1+r)%r,u=n,d=(n+1)%r,f=(n+2)%r,p=0;s(a,e[l],e[u],e[d],e[f],t,0);for(let n=1;n<=8;n++){let r=n/8;s(o,e[l],e[u],e[d],e[f],t,r),p+=c(a,o,t),a.set(o)}i[n+1]=i[n]+p}let l=i[r];if(l>1e-10)for(let e=1;e<=r;e++)i[e]=i[e]/l;return i},u=(e,t)=>{let n=e.length-1,r=Math.max(0,Math.min(1,t)),i=0,a=n-1;for(;i<a;){let t=i+a>>>1;e[t+1]<=r?i=t+1:a=t}let o=e[i],s=e[i+1]-o,c=s>1e-10?(r-o)/s:0;return{segment:i,localT:c}},d=(e,t,n,r,i,a=!0)=>{let o=t.length,{segment:c,localT:l}=u(n,i),d=(c-1+o)%o,f=c,p=(c+1)%o,m=(c+2)%o;return s(e,t[d],t[f],t[p],t[m],r,l,a)};let f=null,p=[];const m=(e,t)=>{self.postMessage(e,t??[])},h=(e,t,n)=>{let r=e.createShader(t);if(e.shaderSource(r,n),e.compileShader(r),!e.getShaderParameter(r,e.COMPILE_STATUS)){let t=e.getShaderInfoLog(r);throw e.deleteShader(r),Error(`Shader compile error: ${t}`)}return r},g=(e,t,n)=>{let r=h(e,e.VERTEX_SHADER,t),i=h(e,e.FRAGMENT_SHADER,n),a=e.createProgram();if(e.attachShader(a,r),e.attachShader(a,i),e.linkProgram(a),!e.getProgramParameter(a,e.LINK_STATUS)){let t=e.getProgramInfoLog(a);throw e.deleteProgram(a),Error(`Program link error: ${t}`)}return e.deleteShader(r),e.deleteShader(i),a},_=(e,t,n)=>e.getUniformLocation(t,n),v=(e,t,n,r,i,a)=>{if(e===0||t===0||n===0)return{pointSize:.012,opacity:.7};let o=n*r,s=o*o*i/e,c=Math.sqrt(s/Math.PI),l=a*r*.5,u,d;return c>=l?(u=c,d=1):(u=l,d=Math.max(.01,s/(Math.PI*l*l))),{pointSize:2*u/o,opacity:d}},y=(e,t)=>e*f.dpr/t,b=(e,t)=>{let{style:n,numPoints:r,dpr:i}=f;if(n.pointSize!==`auto`&&n.opacity!==`auto`)return{pointSize:y(n.pointSize,t),opacity:n.opacity,color:n.color,scaleOpacityByZoom:!1};let a=v(r,e/i,t/i,i,n.fillTarget,n.minPointSize),o=n.opacity===`auto`;return{pointSize:n.pointSize===`auto`?a.pointSize:y(n.pointSize,t),opacity:o?a.opacity:n.opacity,color:n.color,scaleOpacityByZoom:o}};let x=null;const S=(e,t,n,r)=>{(!x||x.length!==r*2)&&(x=new Float32Array(r*2));let i=0,a=0;for(let o=0;o<r;o++){let s=Math.max(n[o],1e-6),c=e[o],l=e[r+o],u=2/s;x[o]=c*u,x[r+o]=l*u;let d=-t[o]/s;i+=d*c*2,a+=d*l*2}return{weights:x,biasX:i,biasY:a}},C=()=>{if(!f?.normMins||!f.normRanges)return null;let e=f.numDims,t=new Float32Array(e);if(f.centering===`mean`&&f.normMeans)t.set(f.normMeans);else for(let n=0;n<e;n++)t[n]=f.normMins[n]+f.normRanges[n]*.5;return t},w=(e,t,n)=>{if(!f)return;let{hdrFbos:r,hdrTextures:i,hdrSizes:a}=f,o=f.mainView.gl,s=a[e];if(s&&s[0]===t&&s[1]===n)return;r[e]&&o.deleteFramebuffer(r[e]),i[e]&&o.deleteTexture(i[e]);let c=o.createTexture();o.bindTexture(o.TEXTURE_2D,c),o.texImage2D(o.TEXTURE_2D,0,o.RGBA32F,t,n,0,o.RGBA,o.FLOAT,null),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_MIN_FILTER,o.NEAREST),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_MAG_FILTER,o.NEAREST),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_WRAP_S,o.CLAMP_TO_EDGE),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_WRAP_T,o.CLAMP_TO_EDGE);let l=o.createFramebuffer();o.bindFramebuffer(o.FRAMEBUFFER,l),o.framebufferTexture2D(o.FRAMEBUFFER,o.COLOR_ATTACHMENT0,o.TEXTURE_2D,c,0),o.bindFramebuffer(o.FRAMEBUFFER,null),o.bindTexture(o.TEXTURE_2D,null),f.hdrFbos[e]=l,f.hdrTextures[e]=c,f.hdrSizes[e]=[t,n]},T=(e,t)=>{if(!f)return;let n=f.blitSize;if(n&&n[0]===e&&n[1]===t)return;let r=f.mainView.gl;f.blitFbo&&r.deleteFramebuffer(f.blitFbo),f.blitTexture&&r.deleteTexture(f.blitTexture);let i=r.createTexture();r.bindTexture(r.TEXTURE_2D,i),r.texImage2D(r.TEXTURE_2D,0,r.RGBA8,e,t,0,r.RGBA,r.UNSIGNED_BYTE,null),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MIN_FILTER,r.NEAREST),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MAG_FILTER,r.NEAREST);let a=r.createFramebuffer();r.bindFramebuffer(r.FRAMEBUFFER,a),r.framebufferTexture2D(r.FRAMEBUFFER,r.COLOR_ATTACHMENT0,r.TEXTURE_2D,i,0),r.bindFramebuffer(r.FRAMEBUFFER,null),r.bindTexture(r.TEXTURE_2D,null),f.blitFbo=a,f.blitTexture=i,f.blitSize=[e,t]};let E=null,D=0,O=null,k=!1,A=null;const j=()=>{if(!O||!f)return!0;let e=f.mainView.gl;return e.clientWaitSync(O,0,0)===e.TIMEOUT_EXPIRED?!1:(e.deleteSync(O),O=null,!0)},M=()=>{if(!j())return k=!0,A||=setTimeout(function(){A=null,k&&f&&!E&&M()},2),!1;if(k=!1,U(),f){let e=f.mainView.gl;O=e.fenceSync(e.SYNC_GPU_COMMANDS_COMPLETE,0),e.flush()}return!0},N=e=>{if(!E||!f?.tour)return;let t=E.prevTime===null?void 0:e-E.prevTime;if(t!==void 0){let e=t/1e3*E.speed*E.direction/20,n=f.tour.position+e;n-=Math.floor(n),f.tour.position=n}E.prevTime=e,f.directBasis=null,M()&&(E.lastRenderedRafTime!==null&&E.frameTimes.push(e-E.lastRenderedRafTime),E.lastRenderedRafTime=e),e-D>=33&&(m({type:`playbackTick`,position:f.tour.position,frameMs:t}),D=e),E.rafId=requestAnimationFrame(N)},P=(e,t)=>{E?(E.speed=e,E.direction=t):(O=null,k=!1,E={speed:e,direction:t,prevTime:null,rafId:0,frameTimes:[],lastRenderedRafTime:null},E.rafId=requestAnimationFrame(N))},ee=()=>{if(E){cancelAnimationFrame(E.rafId),f?.tour&&m({type:`playbackTick`,position:f.tour.position});let e=Float64Array.from(E.frameTimes);m({type:`playbackStopped`,frameTimes:e},[e.buffer]),E=null}},F=(e,t,n,r,i,a)=>{if(!f?.dataTexture||!f.normRanges)return;let{numPoints:o,numDims:s,pointProgram:c,pointLocs:l,tonemapProgram:u,tonemapLocs:d}=f,p=f.mainView.gl,m=C();if(!m)return;let{weights:h,biasX:g,biasY:_}=S(e,m,f.normRanges,s),v=b(t,n),y=f.backgroundColor,x=.2126*y[0]+.7152*y[1]+.0722*y[2],T=f.colorMode>0,E=!T&&x>.5,D;D=T||E?1:0;let O=t/n||1;if(w(r,t,n),p.bindFramebuffer(p.FRAMEBUFFER,f.hdrFbos[r]),p.viewport(0,0,t,n),p.clearColor(y[0],y[1],y[2],1),p.clear(p.COLOR_BUFFER_BIT),o>0){if(p.useProgram(c),p.enable(p.BLEND),T?(p.blendEquation(p.FUNC_ADD),p.blendFunc(p.ONE,p.ONE_MINUS_SRC_ALPHA)):E?(p.blendEquationSeparate(p.FUNC_REVERSE_SUBTRACT,p.FUNC_ADD),p.blendFunc(p.ONE,p.ONE)):(p.blendEquation(p.FUNC_ADD),p.blendFunc(p.ONE,p.ONE)),p.activeTexture(p.TEXTURE0),p.bindTexture(p.TEXTURE_2D,f.dataTexture),p.uniform1i(l.u_data,0),p.activeTexture(p.TEXTURE1),f.colorLutTexture&&p.bindTexture(p.TEXTURE_2D,f.colorLutTexture),p.uniform1i(l.u_colorLutTex,1),p.activeTexture(p.TEXTURE2),f.selectionTexture&&p.bindTexture(p.TEXTURE_2D,f.selectionTexture),p.uniform1i(l.u_selectionTex,2),p.activeTexture(p.TEXTURE3),f.colorMode===2&&f.activeCatColumnName){let e=f.catIndexTextures.get(f.activeCatColumnName);e&&p.bindTexture(p.TEXTURE_2D,e)}p.uniform1i(l.u_catIndexTex,3);let e=new Float32Array(128),t=new Float32Array(128);for(let n=0;n<s&&n<128;n++)e[n]=h[n],t[n]=h[s+n];p.uniform1fv(l.u_adjBasisX,e),p.uniform1fv(l.u_adjBasisY,t),p.uniform2f(l.u_bias,g,_),p.uniform1f(l.u_pointSize,v.pointSize),p.uniform1f(l.u_opacity,v.opacity),p.uniform4f(l.u_color,v.color[0],v.color[1],v.color[2],1),p.uniform1f(l.u_useSubtractive,E?1:0),p.uniform1f(l.u_scaleOpacityByZoom,v.scaleOpacityByZoom?1:0),p.uniform2f(l.u_pan,i.panX,i.panY),p.uniform1f(l.u_zoom,i.zoom),p.uniform1f(l.u_aspect,O),p.uniform1f(l.u_viewportHeight,n),p.uniform1f(l.u_insetOffsetY,i.insetOffsetY),p.uniform1f(l.u_insetZoom,i.insetZoom),p.uniform1i(l.u_numPoints,o),p.uniform1i(l.u_numDims,s),p.uniform1i(l.u_maxPoints,f.maxPoints),p.uniform1i(l.u_texWidth,f.texWidth),p.uniform1i(l.u_colorMode,f.colorMode),p.uniform1i(l.u_colorColumnIndex,f.colorColumnIndex),p.uniform1f(l.u_colorMin,f.colorMin),p.uniform1f(l.u_colorRange,f.colorRange),p.uniform1i(l.u_colorNumStops,f.colorNumStops),p.uniform1i(l.u_colorColumnIndexV,f.colorColumnIndexV),p.uniform1f(l.u_colorMinV,f.colorMinV),p.uniform1f(l.u_colorRangeV,f.colorRangeV),p.uniform1i(l.u_color2dMapIndex,f.color2dMapIndex),p.uniform1fv(l.u_color2dLut,f.color2dLut),p.uniform1f(l.u_useSelectionMask,f.styleFlags.useSelectionMask?1:0),p.drawArrays(p.POINTS,0,o),p.disable(p.BLEND)}p.bindFramebuffer(p.FRAMEBUFFER,a??null),p.viewport(0,0,t,n),p.clearColor(0,0,0,1),p.clear(p.COLOR_BUFFER_BIT),p.useProgram(u),p.activeTexture(p.TEXTURE0),p.bindTexture(p.TEXTURE_2D,f.hdrTextures[r]),p.uniform1i(d.u_hdrTexture,0),p.uniform1f(d.u_mode,D),p.drawArrays(p.TRIANGLES,0,3),p.finish()};let I=!1,L=null,R=null;const z=(e,t)=>{if(!f?.dataTexture)return;let n=f.previewCanvases.get(e);if(!n){m({type:`rendered`,viewIndex:e});return}let r=n.canvas.width,i=n.canvas.height;if(r===0||i===0){m({type:`rendered`,viewIndex:e});return}let a=f.mainView.gl;T(r,i),F(t,r,i,1,{panX:0,panY:0,zoom:1,aspect:1,viewportHeight:i,insetOffsetY:0,insetZoom:1},f.blitFbo);let o=r*i*4,s=r*4;(!L||L.length<o)&&(L=new Uint8Array(o)),(!R||R.length<s)&&(R=new Uint8Array(s)),a.bindFramebuffer(a.FRAMEBUFFER,f.blitFbo),a.readPixels(0,0,r,i,a.RGBA,a.UNSIGNED_BYTE,L),a.bindFramebuffer(a.FRAMEBUFFER,null);for(let e=0;e<i>>1;e++){let t=e*s,n=(i-1-e)*s;R.set(L.subarray(t,t+s)),L.copyWithin(t,n,n+s),L.set(R,n)}let c=new ImageData(new Uint8ClampedArray(L.buffer,0,o),r,i);n.ctx2d.putImageData(c,0,0),m({type:`rendered`,viewIndex:e})},B=()=>{if(!f?.dataTexture||!f.tour)return;let{tour:e}=f;for(let[t]of f.previewCanvases)t>=e.bases.length||z(t,e.bases[t])},V=()=>{I||(I=!0,setTimeout(()=>{I=!1,B()},0))},H=()=>{f?.dataTexture&&(U(),V())},U=()=>{if(!f?.dataTexture)return;let{canvas:e}=f.mainView;if(f.directBasis){F(f.directBasis,e.width,e.height,0,f.camera),m({type:`rendered`,viewIndex:0});return}if(!f.tour)return;let{tour:t}=f;d(t.interpolatedBasis,t.bases,t.arcLengths,t.dims,t.position,t.orthonormalize),F(t.interpolatedBasis,e.width,e.height,0,f.camera),m({type:`rendered`,viewIndex:0})},W=()=>{f&&(f.tour||f.directBasis)&&f.dataTexture&&H()},G=()=>{f&&(f.styleFlags.useSelectionMask=!0,(f.tour||f.directBasis)&&f.dataTexture&&H())};let K=0;const q=e=>{if(!f)return;let t=f.mainView.gl;if(e.data.type===`setColorContinuous`){if(e.data.dataVersion!==K)return;let{columnIndex:n,min:r,range:i,colormap:a}=e.data;f.colorLutTexture&&t.deleteTexture(f.colorLutTexture),f.colorLutTexture=J(t,a),f.colorMode=1,f.colorColumnIndex=n,f.colorMin=r,f.colorRange=i,f.colorNumStops=a.length,f.activeCatColumnName=null,W();return}if(e.data.type===`setColorCategorical`){if(e.data.dataVersion!==K)return;let{catColumnName:n,palette:r}=e.data;if(!f.catIndexTextures.has(n))return;f.colorLutTexture&&t.deleteTexture(f.colorLutTexture),f.colorLutTexture=J(t,r),f.colorMode=2,f.colorNumStops=r.length,f.activeCatColumnName=n,W();return}if(e.data.type===`setColor2D`){if(e.data.dataVersion!==K)return;let{columnIndexX:t,columnIndexY:n,minX:r,rangeX:i,minY:a,rangeY:o,lut:s,mapIndex:c}=e.data;f.colorMode=3,f.colorColumnIndex=t,f.colorMin=r,f.colorRange=i,f.colorColumnIndexV=n,f.colorMinV=a,f.colorRangeV=o,f.color2dMapIndex=c,f.activeCatColumnName=null,s&&f.color2dLut.set(s.subarray(0,128)),W();return}if(e.data.type===`selectContinuous`){if(e.data.dataVersion!==K)return;let{columnIndex:n,ranges:r}=e.data,{numPoints:i,dataBuffers:a}=f,o=a[n];if(!o)return;let s=new Uint32Array(Math.ceil(i/32)),c=r.length/2;for(let e=0;e<i;e++){let t=o[e],n=!1;for(let e=0;e<c;e++)if(t>=r[e*2]&&t<=r[e*2+1]){n=!0;break}n&&(s[e>>5]=s[e>>5]|0|1<<(e&31))}X(t,s),G();return}if(e.data.type===`selectCategorical`){if(e.data.dataVersion!==K)return;let{catColumnName:n,selectedLabels:r}=e.data,i=f.categoricalBuffers.get(n);if(!i)return;let{numPoints:a}=f,o=new Uint32Array(Math.ceil(a/32));for(let e=0;e<a;e++){let t=i[e];t<r.length&&r[t]>0&&(o[e>>5]=o[e>>5]|0|1<<(e&31))}X(t,o),G();return}if(e.data.type!==`data`)return;let{dataVersion:n,dims:r,rows:i,buffers:a,mins:o,ranges:s,means:c,categoricalColumns:u}=e.data;if(K=n,r<2||i===0||a.length<2){m({type:`error`,message:`Need at least 2 dimensions to render`});return}f.dataTexture&&(t.deleteTexture(f.dataTexture),f.dataTexture=null),f.colorLutTexture&&(t.deleteTexture(f.colorLutTexture),f.colorLutTexture=null);for(let e of f.catIndexTextures.values())t.deleteTexture(e);f.catIndexTextures.clear(),f.selectionTexture&&(t.deleteTexture(f.selectionTexture),f.selectionTexture=null),f.styleFlags={useSelectionMask:!1},f.colorMode=0,f.colorColumnIndex=0,f.colorMin=0,f.colorRange=1,f.colorNumStops=0,f.activeCatColumnName=null,f.categoricalBuffers.clear(),f.dataBuffers=a,f.normMins=new Float32Array(o),f.normRanges=new Float32Array(s),f.normMeans=new Float32Array(c),f.numPoints=i,f.numDims=r;let d=t.getParameter(t.MAX_TEXTURE_SIZE),p=Math.min(i,d),h=Math.ceil(i/p);f.texWidth=p;let g=t.createTexture();t.bindTexture(t.TEXTURE_2D,g);let _=r*h,v=new Float32Array(p*_);for(let e=0;e<r;e++){let t=a[e],n=e*h;for(let e=0;e<i;e++){let r=e%p,i=n+Math.floor(e/p);v[i*p+r]=t[e]}}t.texImage2D(t.TEXTURE_2D,0,t.R32F,p,_,0,t.RED,t.FLOAT,v),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),t.bindTexture(t.TEXTURE_2D,null),f.dataTexture=g;for(let e of u)f.categoricalBuffers.set(e.name,e.indices),f.catIndexTextures.set(e.name,Y(t,e.indices,i,p));if(f.tour&&f.tour.dims===r)H();else{let e=Math.max(1,f.previewCanvases.size),t=[];for(let n=0;n<e;n++){let i=new Float32Array(r*2),a=Math.floor(n/e*r);i[a]=1,i[r+(a+1)%r]=1,t.push(i)}f.tour={bases:t,arcLengths:l(t,r),dims:r,orthonormalize:!0,position:0,interpolatedBasis:new Float32Array(r*2)},H()}},J=(e,t)=>{let n=e.createTexture();return e.bindTexture(e.TEXTURE_2D,n),e.texImage2D(e.TEXTURE_2D,0,e.R32UI,t.length,1,0,e.RED_INTEGER,e.UNSIGNED_INT,t),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.bindTexture(e.TEXTURE_2D,null),n},Y=(e,t,n,r)=>{let i=Math.ceil(n/r),a;if(i===1)a=t;else{a=new Uint32Array(r*i);for(let e=0;e<n;e++){let n=e%r,i=Math.floor(e/r);a[i*r+n]=t[e]}}let o=e.createTexture();return e.bindTexture(e.TEXTURE_2D,o),e.texImage2D(e.TEXTURE_2D,0,e.R32UI,r,i,0,e.RED_INTEGER,e.UNSIGNED_INT,a),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.bindTexture(e.TEXTURE_2D,null),o},X=(e,t)=>{if(!f)return;f.selectionTexture&&e.deleteTexture(f.selectionTexture);let n=e.createTexture();e.bindTexture(e.TEXTURE_2D,n),e.texImage2D(e.TEXTURE_2D,0,e.R32UI,t.length,1,0,e.RED_INTEGER,e.UNSIGNED_INT,t),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.bindTexture(e.TEXTURE_2D,null),f.selectionTexture=n},Z=(e,t,n,r)=>{let i=!1;for(let a=0,o=r-1;a<r;o=a++){let r=n[a*2],s=n[a*2+1],c=n[o*2],l=n[o*2+1];s>t!=l>t&&e<(c-r)*(t-s)/(l-s)+r&&(i=!i)}return i},Q=e=>{if(!f?.normRanges||f.numPoints===0)return;let{numPoints:t,numDims:n,dataBuffers:r,camera:i}=f,a=e.length/2;if(a<3)return;let o=null;if(f.directBasis)o=f.directBasis;else if(f.tour){let{tour:e}=f;d(e.interpolatedBasis,e.bases,e.arcLengths,e.dims,e.position,e.orthonormalize),o=e.interpolatedBasis}if(!o)return;let s=C();if(!s)return;let{weights:c,biasX:l,biasY:u}=S(o,s,f.normRanges,n),p=f.mainView.canvas,h=p.width/p.height||1,g=i.insetZoom,_=i.zoom*g,v=new Float32Array(e.length);for(let t=0;t<a;t++)v[t*2]=e[t*2]*h/_-i.panX,v[t*2+1]=(e[t*2+1]-i.insetOffsetY)/_-i.panY;let y=new Uint32Array(Math.ceil(t/32));for(let e=0;e<t;e++){let t=l,i=u;for(let a=0;a<n;a++){let o=r[a][e];t+=o*c[a],i+=o*c[n+a]}Z(t,i,v,a)&&(y[e>>5]=y[e>>5]|0|1<<(e&31))}let b=f.mainView.gl;X(b,y),G();let x=new Uint32Array(y);m({type:`selectionResult`,mask:x},[x.buffer])},te=()=>{if(!f)return 0;let e=0;if(f.dataTexture){let t=Math.ceil(f.numPoints/f.texWidth);e+=f.texWidth*f.numDims*t*4}for(let t=0;t<f.hdrSizes.length;t++){let n=f.hdrSizes[t];n&&(e+=n[0]*n[1]*16)}f.blitSize&&(e+=f.blitSize[0]*f.blitSize[1]*4),f.colorLutTexture&&(e+=f.colorNumStops*4);for(let t of f.categoricalBuffers.values())e+=t.byteLength;return f.selectionTexture&&(e+=Math.ceil(f.numPoints/32)*4),e},ne=()=>{if(!f)return;let e=0;for(let t of f.dataBuffers)e+=t.byteLength;for(let t of f.categoricalBuffers.values())e+=t.byteLength;if(f.normMins&&(e+=f.normMins.byteLength),f.normRanges&&(e+=f.normRanges.byteLength),f.tour){for(let t of f.tour.bases)e+=t.byteLength;e+=f.tour.interpolatedBasis.byteLength}m({type:`metricsResult`,gpuMemoryBytes:te(),numPoints:f.numPoints,numDims:f.numDims,workerJsHeapBytes:e})},re=e=>{if(!f?.tour||!f.dataTexture||f.numPoints===0){m({type:`error`,message:`No data/tour loaded for benchmark`});return}let t=f.mainView.gl,{numPoints:n,numDims:r,tour:i}=f,a=i.position;f.directBasis=null;let o=new Uint8Array(4),s=()=>{t.readPixels(0,0,1,1,t.RGBA,t.UNSIGNED_BYTE,o)};for(let e=0;e<5;e++)i.position=e/5,d(i.interpolatedBasis,i.bases,i.arcLengths,i.dims,i.position,i.orthonormalize),F(i.interpolatedBasis,f.mainView.canvas.width,f.mainView.canvas.height,0,f.camera),s();let c=new Float64Array(e);for(let t=0;t<e;t++){i.position=t/e,d(i.interpolatedBasis,i.bases,i.arcLengths,i.dims,i.position,i.orthonormalize);let n=performance.now();F(i.interpolatedBasis,f.mainView.canvas.width,f.mainView.canvas.height,0,f.camera),s(),c[t]=performance.now()-n}i.position=a,m({type:`benchmarkResult`,frameTimes:c,numPoints:n,numDims:r},[c.buffer])},$=e=>{if(f){if(e.type===`setBases`){let{bases:t}=e;if(t.length===0)return;let n=t[0].length/2,r=e.tourFamily!==`sequential`;f.tour={bases:t,arcLengths:l(t,n,r),dims:n,orthonormalize:r,position:f.tour?.position??0,interpolatedBasis:new Float32Array(n*2)},f.dataTexture&&H();return}if(e.type===`addPreviewCanvas`){let t=e.canvas.getContext(`2d`);if(!t)return;f.previewCanvases.set(e.id,{canvas:e.canvas,ctx2d:t}),f.dataTexture&&f.tour&&e.id<f.tour.bases.length&&z(e.id,f.tour.bases[e.id]);return}if(e.type===`removePreviewCanvas`){f.previewCanvases.delete(e.id);return}if(e.type===`resizePreview`){let t=f.previewCanvases.get(e.id);if(!t)return;t.canvas.width=e.width,t.canvas.height=e.height,f.dataTexture&&f.tour&&e.id<f.tour.bases.length&&V();return}if(e.type===`setTourPosition`){if(!f.tour)return;f.tour.position=e.position,f.directBasis=null,M();return}if(e.type===`setStyle`){f.style={pointSize:e.pointSize,opacity:e.opacity,color:e.color,minPointSize:e.minPointSize??f.style.minPointSize,fillTarget:e.fillTarget??f.style.fillTarget},(f.tour||f.directBasis)&&f.dataTexture&&H();return}if(e.type===`setCamera`){f.camera={panX:e.pan[0],panY:e.pan[1],zoom:e.zoom,aspect:f.camera.aspect,viewportHeight:f.camera.viewportHeight,insetOffsetY:e.insetOffsetY,insetZoom:e.insetZoom},U();return}if(e.type===`setCentering`){f.centering=e.centering,(f.tour||f.directBasis)&&f.dataTexture&&H();return}if(e.type===`resize`){e.dpr!==void 0&&(f.dpr=e.dpr),e.viewIndex===0&&(f.mainView.canvas.width=e.width,f.mainView.canvas.height=e.height,(f.tour||f.directBasis)&&f.dataTexture&&U());return}if(e.type===`render`){(f.tour||f.directBasis)&&f.dataTexture&&H();return}if(e.type===`setDirectBasis`){if(!f.dataTexture)return;f.directBasis=e.basis,F(e.basis,f.mainView.canvas.width,f.mainView.canvas.height,0,f.camera),m({type:`rendered`,viewIndex:0});return}if(e.type===`clearColors`){f.colorLutTexture&&(f.mainView.gl.deleteTexture(f.colorLutTexture),f.colorLutTexture=null),f.colorMode=0,f.colorColumnIndex=0,f.colorMin=0,f.colorRange=1,f.colorNumStops=0,f.activeCatColumnName=null,(f.tour||f.directBasis)&&f.dataTexture&&H();return}if(e.type===`setBackgroundColor`){f.backgroundColor=e.color,(f.tour||f.directBasis)&&f.dataTexture&&H();return}if(e.type===`setMaxPoints`){f.maxPoints=e.maxPoints,(f.tour||f.directBasis)&&f.dataTexture&&H();return}if(e.type===`setSelectionMask`){let t=f.mainView.gl;X(t,e.mask),f.styleFlags.useSelectionMask=!0,(f.tour||f.directBasis)&&f.dataTexture&&H();let n=new Uint32Array(e.mask);m({type:`selectionResult`,mask:n},[n.buffer]);return}if(e.type===`clearSelectionMask`){f.selectionTexture&&(f.mainView.gl.deleteTexture(f.selectionTexture),f.selectionTexture=null),f.styleFlags.useSelectionMask=!1,(f.tour||f.directBasis)&&f.dataTexture&&H(),m({type:`selectionResult`,mask:new Uint32Array});return}if(e.type===`startPlayback`){if(!f.tour)return;P(e.speed,e.direction);return}if(e.type===`stopPlayback`){ee();return}if(e.type===`computePCA`){m({type:`error`,message:`PCA not yet implemented in WebGL backend`});return}if(e.type===`lassoSelect`){Q(e.polygon);return}if(e.type===`getProjectedPositions`){if(!f?.normRanges||f.numPoints===0){m({type:`projectedPositions`,positions:new Float32Array},[]);return}let{numPoints:e,numDims:t,dataBuffers:n}=f,r=null;if(f.directBasis)r=f.directBasis;else if(f.tour){let{tour:e}=f;d(e.interpolatedBasis,e.bases,e.arcLengths,e.dims,e.position,e.orthonormalize),r=e.interpolatedBasis}if(!r){m({type:`projectedPositions`,positions:new Float32Array},[]);return}let i=C();if(!i){m({type:`projectedPositions`,positions:new Float32Array},[]);return}let{weights:a,biasX:o,biasY:s}=S(r,i,f.normRanges,t),c=new Float32Array(e*2);for(let r=0;r<e;r++){let e=o,i=s;for(let o=0;o<t;o++){let s=n[o][r];e+=s*a[o],i+=s*a[t+o]}c[r*2]=e,c[r*2+1]=i}m({type:`projectedPositions`,positions:c},[c.buffer]);return}if(e.type===`getPointData`){if(!f||f.numPoints===0){m({type:`pointData`,pointIndex:e.pointIndex,numericValues:{},categoricalValues:{}});return}let{numDims:t,dataBuffers:n}=f,r=e.pointIndex;if(r<0||r>=f.numPoints){m({type:`pointData`,pointIndex:r,numericValues:{},categoricalValues:{}});return}let i={};for(let e=0;e<t;e++)i[String(e)]=n[e][r];let a={};for(let[e,t]of f.categoricalBuffers)a[e]=t[r];m({type:`pointData`,pointIndex:r,numericValues:i,categoricalValues:a});return}if(e.type===`benchmark`){re(e.numFrames);return}if(e.type===`getMetrics`){ne();return}}};self.onmessage=i=>{let a=i.data;if(a.type===`init`){try{let i=a.canvas,o=i.getContext(`webgl2`,{alpha:!0,premultipliedAlpha:!0,antialias:!1,preserveDrawingBuffer:!1});if(!o)throw Error(`WebGL2 not supported`);o.getExtension(`EXT_color_buffer_float`)||console.warn(`EXT_color_buffer_float not available — HDR rendering may fail`),o.getExtension(`OES_texture_float_linear`),o.getExtension(`EXT_float_blend`);let s=o,c=g(s,t,e),l={u_data:_(s,c,`u_data`),u_adjBasisX:_(s,c,`u_adjBasisX`),u_adjBasisY:_(s,c,`u_adjBasisY`),u_bias:_(s,c,`u_bias`),u_pointSize:_(s,c,`u_pointSize`),u_opacity:_(s,c,`u_opacity`),u_color:_(s,c,`u_color`),u_useSubtractive:_(s,c,`u_useSubtractive`),u_pan:_(s,c,`u_pan`),u_zoom:_(s,c,`u_zoom`),u_aspect:_(s,c,`u_aspect`),u_viewportHeight:_(s,c,`u_viewportHeight`),u_insetOffsetY:_(s,c,`u_insetOffsetY`),u_insetZoom:_(s,c,`u_insetZoom`),u_numPoints:_(s,c,`u_numPoints`),u_numDims:_(s,c,`u_numDims`),u_maxPoints:_(s,c,`u_maxPoints`),u_texWidth:_(s,c,`u_texWidth`),u_colorMode:_(s,c,`u_colorMode`),u_colorColumnIndex:_(s,c,`u_colorColumnIndex`),u_colorMin:_(s,c,`u_colorMin`),u_colorRange:_(s,c,`u_colorRange`),u_colorNumStops:_(s,c,`u_colorNumStops`),u_colorLutTex:_(s,c,`u_colorLutTex`),u_catIndexTex:_(s,c,`u_catIndexTex`),u_useSelectionMask:_(s,c,`u_useSelectionMask`),u_selectionTex:_(s,c,`u_selectionTex`),u_colorColumnIndexV:_(s,c,`u_colorColumnIndexV`),u_colorMinV:_(s,c,`u_colorMinV`),u_colorRangeV:_(s,c,`u_colorRangeV`),u_color2dMapIndex:_(s,c,`u_color2dMapIndex`),u_color2dLut:_(s,c,`u_color2dLut`),u_scaleOpacityByZoom:_(s,c,`u_scaleOpacityByZoom`)},u=g(s,r,n),d={u_hdrTexture:_(s,u,`u_hdrTexture`),u_mode:_(s,u,`u_mode`)};f={mainView:{canvas:i,gl:o},previewCanvases:new Map,pointProgram:c,pointLocs:l,tonemapProgram:u,tonemapLocs:d,hdrFbos:[],hdrTextures:[],hdrSizes:[],blitFbo:null,blitTexture:null,blitSize:null,dataTexture:null,colorLutTexture:null,catIndexTextures:new Map,selectionTexture:null,numPoints:0,numDims:0,dataBuffers:[],normMins:null,normRanges:null,normMeans:null,centering:`midrange`,categoricalBuffers:new Map,tour:null,style:{pointSize:`auto`,opacity:`auto`,color:[.25,.5,.9],minPointSize:2,fillTarget:.5},styleFlags:{useSelectionMask:!1},colorMode:0,colorColumnIndex:0,colorMin:0,colorRange:1,colorNumStops:0,activeCatColumnName:null,colorColumnIndexV:0,colorMinV:0,colorRangeV:1,color2dMapIndex:0,color2dLut:new Float32Array(128),camera:{panX:0,panY:0,zoom:a.zoom,aspect:1,viewportHeight:1,insetOffsetY:0,insetZoom:1},directBasis:null,backgroundColor:[0,0,0],dpr:a.dpr,maxPoints:0,texWidth:0},a.dataPort.onmessage=q;let h=p;if(p=null,h)for(let e of h)$(e);m({type:`ready`})}catch(e){m({type:`error`,message:e instanceof Error?e.message:String(e)})}return}if(p){p.push(a);return}$(a)};", M = typeof self < "u" && self.Blob && new Blob(["URL.revokeObjectURL(import.meta.url);", j], { type: "text/javascript;charset=utf-8" });
3027
- function N(e) {
3056
+ }, j = (e, t, n, r, i, a = !0) => {
3057
+ let o = t.length, { segment: s, localT: c } = A(n, i), l = (s - 1 + o) % o, u = s, d = (s + 1) % o, f = (s + 2) % o;
3058
+ return E(e, t[l], t[u], t[d], t[f], r, c, a);
3059
+ }, M = "const e=1e-10,t=t=>{let n=t[0],r=t[1],i=t[2],a=t[3],o=n*n+i*i,s=n*r+i*a,c=r*r+a*a,l=o+c,u=o*c-s*s,d=Math.sqrt(Math.max(0,l*l*.25-u)),f=l*.5+d,p=l*.5-d,m=Math.sqrt(Math.max(0,f)),h=Math.sqrt(Math.max(0,p)),g=new Float32Array([m,h]),_=/* @__PURE__ */ new Float32Array(4);if(Math.abs(s)>e){let e=f-c,t=Math.sqrt(e*e+s*s);_[0]=e/t,_[1]=s/t;let n=p-c,r=Math.sqrt(n*n+s*s);_[2]=n/r,_[3]=s/r}else _[0]=1,_[1]=0,_[2]=0,_[3]=1;let v=/* @__PURE__ */ new Float32Array(4);return m>e&&(v[0]=(n*_[0]+r*_[1])/m,v[2]=(i*_[0]+a*_[1])/m),h>e&&(v[1]=(n*_[2]+r*_[3])/h,v[3]=(i*_[2]+a*_[3])/h),m<=e&&h>e?(v[0]=-v[3],v[2]=v[1]):h<=e&&m>e?(v[1]=-v[2],v[3]=v[0]):m<=e&&h<=e&&(v[0]=1,v[1]=0,v[2]=0,v[3]=1),{U:v,S:g,V:_}},n=(e,t)=>{let n=0;for(let r=0;r<t;r++)n+=e[r]*e[r];if(n=Math.sqrt(n),n>1e-10)for(let r=0;r<t;r++)e[r]=e[r]/n;let r=0;for(let n=0;n<t;n++)r+=e[n]*e[t+n];for(let n=0;n<t;n++)e[t+n]=e[t+n]-r*e[n];let i=0;for(let n=0;n<t;n++)i+=e[t+n]*e[t+n];if(i=Math.sqrt(i),i>1e-10)for(let n=0;n<t;n++)e[t+n]=e[t+n]/i},r=(e,t,r,i,a,o,s,c=!0)=>{let l=s*s,u=l*s,d=.5*(-s+2*l-u),f=.5*(2-5*l+3*u),p=.5*(s+4*l-3*u),m=.5*(-l+u);for(let n=0;n<o*2;n++)e[n]=d*t[n]+f*r[n]+p*i[n]+m*a[n];return c&&n(e,o),e},i=(e,n,r)=>{let i=/* @__PURE__ */ new Float32Array(4);for(let t=0;t<2;t++)for(let a=0;a<2;a++){let o=0;for(let i=0;i<r;i++)o+=e[t*r+i]*n[a*r+i];i[t*2+a]=o}let{S:a}=t(i),o=Math.acos(Math.max(-1,Math.min(1,a[0]))),s=Math.acos(Math.max(-1,Math.min(1,a[1])));return Math.sqrt(o*o+s*s)},a=(e,t,n=!0)=>{let a=e.length,o=new Float32Array(a+1);if(o[0]=0,!n){for(let e=1;e<=a;e++)o[e]=e/a;return o}let s=new Float32Array(t*2),c=new Float32Array(t*2);for(let n=0;n<a;n++){let l=(n-1+a)%a,u=n,d=(n+1)%a,f=(n+2)%a,p=0;r(s,e[l],e[u],e[d],e[f],t,0);for(let n=1;n<=8;n++){let a=n/8;r(c,e[l],e[u],e[d],e[f],t,a),p+=i(s,c,t),s.set(c)}o[n+1]=o[n]+p}let l=o[a];if(l>1e-10)for(let e=1;e<=a;e++)o[e]=o[e]/l;return o},o=(e,t)=>{let n=e.length-1,r=Math.max(0,Math.min(1,t)),i=0,a=n-1;for(;i<a;){let t=i+a>>>1;e[t+1]<=r?i=t+1:a=t}let o=e[i],s=e[i+1]-o,c=s>1e-10?(r-o)/s:0;return{segment:i,localT:c}},s=(e,t,n,i,a,s=!0)=>{let c=t.length,{segment:l,localT:u}=o(n,a),d=(l-1+c)%c,f=l,p=(l+1)%c,m=(l+2)%c;return r(e,t[d],t[f],t[p],t[m],i,u,s)};let c=null,l=[];const u=(e,t)=>{self.postMessage(e,t??[])},d=(e,t,n)=>{let r=e.createShader(t);if(e.shaderSource(r,n),e.compileShader(r),!e.getShaderParameter(r,e.COMPILE_STATUS)){let t=e.getShaderInfoLog(r);throw e.deleteShader(r),Error(`Shader compile error: ${t}`)}return r},f=(e,t,n)=>{let r=d(e,e.VERTEX_SHADER,t),i=d(e,e.FRAGMENT_SHADER,n),a=e.createProgram();if(e.attachShader(a,r),e.attachShader(a,i),e.linkProgram(a),!e.getProgramParameter(a,e.LINK_STATUS)){let t=e.getProgramInfoLog(a);throw e.deleteProgram(a),Error(`Program link error: ${t}`)}return e.deleteShader(r),e.deleteShader(i),a},p=(e,t,n)=>e.getUniformLocation(t,n),m=(e,t,n,r,i,a)=>{if(e===0||t===0||n===0)return{pointSize:.012,opacity:.7};let o=n*r,s=o*o*i/e,c=Math.sqrt(s/Math.PI),l=a*r*.5,u,d;return c>=l?(u=c,d=1):(u=l,d=Math.max(.01,s/(Math.PI*l*l))),{pointSize:2*u/o,opacity:d}},h=(e,t)=>e*c.dpr/t,g=(e,t)=>{let{style:n,numPoints:r,dpr:i}=c;if(n.pointSize!==`auto`&&n.opacity!==`auto`)return{pointSize:h(n.pointSize,t),opacity:n.opacity,color:n.color,scaleOpacityByZoom:!1};let a=m(r,e/i,t/i,i,n.fillTarget,n.minPointSize),o=n.opacity===`auto`;return{pointSize:n.pointSize===`auto`?a.pointSize:h(n.pointSize,t),opacity:o?a.opacity:n.opacity,color:n.color,scaleOpacityByZoom:o}};let _=1,v=null;const y=(e,t,n,r)=>{(!v||v.length!==r*2)&&(v=new Float32Array(r*2));let i=0,a=0;for(let o=0;o<r;o++){let s=Math.max(n[o],1e-6),c=e[o],l=e[r+o],u=2*_,d=u/s;v[o]=c*d,v[r+o]=l*d;let f=-t[o]/s;i+=f*c*u,a+=f*l*u}return{weights:v,biasX:i,biasY:a}},b=()=>{if(!c?.normMins||!c.normRanges)return null;let e=c.numDims,t=new Float32Array(e);if(c.centering===`mean`&&c.normMeans)t.set(c.normMeans);else for(let n=0;n<e;n++)t[n]=c.normMins[n]+c.normRanges[n]*.5;return t},x=(e,t,n)=>{if(!c)return;let{hdrFbos:r,hdrTextures:i,hdrSizes:a}=c,o=c.mainView.gl,s=a[e];if(s&&s[0]===t&&s[1]===n)return;r[e]&&o.deleteFramebuffer(r[e]),i[e]&&o.deleteTexture(i[e]);let l=o.createTexture();o.bindTexture(o.TEXTURE_2D,l),o.texImage2D(o.TEXTURE_2D,0,o.RGBA32F,t,n,0,o.RGBA,o.FLOAT,null),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_MIN_FILTER,o.NEAREST),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_MAG_FILTER,o.NEAREST),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_WRAP_S,o.CLAMP_TO_EDGE),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_WRAP_T,o.CLAMP_TO_EDGE);let u=o.createFramebuffer();o.bindFramebuffer(o.FRAMEBUFFER,u),o.framebufferTexture2D(o.FRAMEBUFFER,o.COLOR_ATTACHMENT0,o.TEXTURE_2D,l,0),o.bindFramebuffer(o.FRAMEBUFFER,null),o.bindTexture(o.TEXTURE_2D,null),c.hdrFbos[e]=u,c.hdrTextures[e]=l,c.hdrSizes[e]=[t,n]},S=(e,t)=>{if(!c)return;let n=c.blitSize;if(n&&n[0]===e&&n[1]===t)return;let r=c.mainView.gl;c.blitFbo&&r.deleteFramebuffer(c.blitFbo),c.blitTexture&&r.deleteTexture(c.blitTexture);let i=r.createTexture();r.bindTexture(r.TEXTURE_2D,i),r.texImage2D(r.TEXTURE_2D,0,r.RGBA8,e,t,0,r.RGBA,r.UNSIGNED_BYTE,null),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MIN_FILTER,r.NEAREST),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MAG_FILTER,r.NEAREST);let a=r.createFramebuffer();r.bindFramebuffer(r.FRAMEBUFFER,a),r.framebufferTexture2D(r.FRAMEBUFFER,r.COLOR_ATTACHMENT0,r.TEXTURE_2D,i,0),r.bindFramebuffer(r.FRAMEBUFFER,null),r.bindTexture(r.TEXTURE_2D,null),c.blitFbo=a,c.blitTexture=i,c.blitSize=[e,t]};let C=null,w=0,T=null,E=!1,D=null;const O=()=>{if(!T||!c)return!0;let e=c.mainView.gl;return e.clientWaitSync(T,0,0)!==e.TIMEOUT_EXPIRED&&(e.deleteSync(T),T=null,!0)},k=()=>{if(!O())return E=!0,D||=setTimeout(function(){D=null,E&&c&&!C&&k()},2),!1;if(E=!1,V(),c){let e=c.mainView.gl;T=e.fenceSync(e.SYNC_GPU_COMMANDS_COMPLETE,0),e.flush()}return!0},A=e=>{if(!C||!c?.tour)return;let t=C.prevTime===null?void 0:e-C.prevTime;if(t!==void 0){let e=t/1e3*C.speed*C.direction/20,n=c.tour.position+e;n-=Math.floor(n),c.tour.position=n}C.prevTime=e,c.directBasis=null,k()&&(C.lastRenderedRafTime!==null&&C.frameTimes.push(e-C.lastRenderedRafTime),C.lastRenderedRafTime=e),e-w>=33&&(u({type:`playbackTick`,position:c.tour.position,frameMs:t}),w=e),C.rafId=requestAnimationFrame(A)},j=(e,t)=>{C?(C.speed=e,C.direction=t):(T=null,E=!1,C={speed:e,direction:t,prevTime:null,rafId:0,frameTimes:[],lastRenderedRafTime:null},C.rafId=requestAnimationFrame(A))},M=()=>{if(C){cancelAnimationFrame(C.rafId),c?.tour&&u({type:`playbackTick`,position:c.tour.position});let e=Float64Array.from(C.frameTimes);u({type:`playbackStopped`,frameTimes:e},[e.buffer]),C=null}},N=(e,t,n,r,i,a)=>{if(!c?.dataTexture||!c.normRanges)return;let{numPoints:o,numDims:s,pointProgram:l,pointLocs:u,tonemapProgram:d,tonemapLocs:f}=c,p=c.mainView.gl,m=b();if(!m)return;let{weights:h,biasX:_,biasY:v}=y(e,m,c.normRanges,s),S=g(t,n),C=c.backgroundColor,w=.2126*C[0]+.7152*C[1]+.0722*C[2],T=c.colorMode>0,E=!T&&w>.5,D;D=T?1:+!!E;let O=t/n||1;if(x(r,t,n),p.bindFramebuffer(p.FRAMEBUFFER,c.hdrFbos[r]),p.viewport(0,0,t,n),p.clearColor(C[0],C[1],C[2],1),p.clear(p.COLOR_BUFFER_BIT),o>0){if(p.useProgram(l),p.enable(p.BLEND),T?(p.blendEquation(p.FUNC_ADD),p.blendFunc(p.ONE,p.ONE_MINUS_SRC_ALPHA)):E?(p.blendEquationSeparate(p.FUNC_REVERSE_SUBTRACT,p.FUNC_ADD),p.blendFunc(p.ONE,p.ONE)):(p.blendEquation(p.FUNC_ADD),p.blendFunc(p.ONE,p.ONE)),p.activeTexture(p.TEXTURE0),p.bindTexture(p.TEXTURE_2D,c.dataTexture),p.uniform1i(u.u_data,0),p.activeTexture(p.TEXTURE1),c.colorLutTexture&&p.bindTexture(p.TEXTURE_2D,c.colorLutTexture),p.uniform1i(u.u_colorLutTex,1),p.activeTexture(p.TEXTURE2),c.selectionTexture&&p.bindTexture(p.TEXTURE_2D,c.selectionTexture),p.uniform1i(u.u_selectionTex,2),p.activeTexture(p.TEXTURE3),c.colorMode===2&&c.activeCatColumnName){let e=c.catIndexTextures.get(c.activeCatColumnName);e&&p.bindTexture(p.TEXTURE_2D,e)}p.uniform1i(u.u_catIndexTex,3);let e=/* @__PURE__ */ new Float32Array(128),t=/* @__PURE__ */ new Float32Array(128);for(let n=0;n<s&&n<128;n++)e[n]=h[n],t[n]=h[s+n];p.uniform1fv(u.u_adjBasisX,e),p.uniform1fv(u.u_adjBasisY,t),p.uniform2f(u.u_bias,_,v),p.uniform1f(u.u_pointSize,S.pointSize),p.uniform1f(u.u_opacity,S.opacity),p.uniform4f(u.u_color,S.color[0],S.color[1],S.color[2],1),p.uniform1f(u.u_useSubtractive,+!!E),p.uniform1f(u.u_scaleOpacityByZoom,+!!S.scaleOpacityByZoom),p.uniform2f(u.u_pan,i.panX,i.panY),p.uniform1f(u.u_zoom,i.zoom),p.uniform1f(u.u_aspect,O),p.uniform1f(u.u_viewportHeight,n),p.uniform1f(u.u_insetOffsetY,i.insetOffsetY),p.uniform1f(u.u_insetZoom,i.insetZoom),p.uniform1i(u.u_numPoints,o),p.uniform1i(u.u_numDims,s),p.uniform1i(u.u_maxPoints,c.maxPoints),p.uniform1i(u.u_texWidth,c.texWidth),p.uniform1i(u.u_colorMode,c.colorMode),p.uniform1i(u.u_colorColumnIndex,c.colorColumnIndex),p.uniform1f(u.u_colorMin,c.colorMin),p.uniform1f(u.u_colorRange,c.colorRange),p.uniform1i(u.u_colorNumStops,c.colorNumStops),p.uniform1i(u.u_colorColumnIndexV,c.colorColumnIndexV),p.uniform1f(u.u_colorMinV,c.colorMinV),p.uniform1f(u.u_colorRangeV,c.colorRangeV),p.uniform1i(u.u_color2dMapIndex,c.color2dMapIndex),p.uniform1fv(u.u_color2dLut,c.color2dLut),p.uniform1f(u.u_useSelectionMask,+!!c.styleFlags.useSelectionMask),p.drawArrays(p.POINTS,0,o),p.disable(p.BLEND)}p.bindFramebuffer(p.FRAMEBUFFER,a??null),p.viewport(0,0,t,n),p.clearColor(0,0,0,1),p.clear(p.COLOR_BUFFER_BIT),p.useProgram(d),p.activeTexture(p.TEXTURE0),p.bindTexture(p.TEXTURE_2D,c.hdrTextures[r]),p.uniform1i(f.u_hdrTexture,0),p.uniform1f(f.u_mode,D),p.drawArrays(p.TRIANGLES,0,3),p.finish()};let P=!1,F=null,I=null;const L=(e,t)=>{if(!c?.dataTexture)return;let n=c.previewCanvases.get(e);if(!n){u({type:`rendered`,viewIndex:e});return}let r=n.canvas.width,i=n.canvas.height;if(r===0||i===0){u({type:`rendered`,viewIndex:e});return}let a=c.mainView.gl;S(r,i),N(t,r,i,1,{panX:0,panY:0,zoom:1,aspect:1,viewportHeight:i,insetOffsetY:0,insetZoom:1},c.blitFbo);let o=r*i*4,s=r*4;(!F||F.length<o)&&(F=new Uint8Array(o)),(!I||I.length<s)&&(I=new Uint8Array(s)),a.bindFramebuffer(a.FRAMEBUFFER,c.blitFbo),a.readPixels(0,0,r,i,a.RGBA,a.UNSIGNED_BYTE,F),a.bindFramebuffer(a.FRAMEBUFFER,null);for(let e=0;e<i>>1;e++){let t=e*s,n=(i-1-e)*s;I.set(F.subarray(t,t+s)),F.copyWithin(t,n,n+s),F.set(I,n)}let l=new ImageData(new Uint8ClampedArray(F.buffer,0,o),r,i);n.ctx2d.putImageData(l,0,0),u({type:`rendered`,viewIndex:e})},R=()=>{if(!c?.dataTexture||!c.tour)return;let{tour:e}=c;for(let[t]of c.previewCanvases)t>=e.bases.length||L(t,e.bases[t])},z=()=>{P||(P=!0,setTimeout(()=>{P=!1,R()},0))},B=()=>{c?.dataTexture&&(V(),z())},V=()=>{if(!c?.dataTexture)return;let{canvas:e}=c.mainView;if(c.directBasis){N(c.directBasis,e.width,e.height,0,c.camera),u({type:`rendered`,viewIndex:0});return}if(!c.tour)return;let{tour:t}=c;s(t.interpolatedBasis,t.bases,t.arcLengths,t.dims,t.position,t.orthonormalize),N(t.interpolatedBasis,e.width,e.height,0,c.camera),u({type:`rendered`,viewIndex:0})},H=()=>{c&&(c.tour||c.directBasis)&&c.dataTexture&&B()},U=()=>{c&&(c.styleFlags.useSelectionMask=!0,(c.tour||c.directBasis)&&c.dataTexture&&B())};let W=0,G=0;const K=e=>e<G?!1:(G=e,!0),q=e=>{if(!c)return;let t=c.mainView.gl;if(e.data.type===`setColorContinuous`){if(e.data.dataVersion!==W)return;let{columnIndex:n,min:r,range:i,colormap:a}=e.data;c.colorLutTexture&&t.deleteTexture(c.colorLutTexture),c.colorLutTexture=J(t,a),c.colorMode=1,c.colorColumnIndex=n,c.colorMin=r,c.colorRange=i,c.colorNumStops=a.length,c.activeCatColumnName=null,H();return}if(e.data.type===`setColorCategorical`){if(e.data.dataVersion!==W)return;let{catColumnName:n,palette:r}=e.data;if(!c.catIndexTextures.has(n))return;c.colorLutTexture&&t.deleteTexture(c.colorLutTexture),c.colorLutTexture=J(t,r),c.colorMode=2,c.colorNumStops=r.length,c.activeCatColumnName=n,H();return}if(e.data.type===`setColor2D`){if(e.data.dataVersion!==W)return;let{columnIndexX:t,columnIndexY:n,minX:r,rangeX:i,minY:a,rangeY:o,lut:s,mapIndex:l}=e.data;c.colorMode=3,c.colorColumnIndex=t,c.colorMin=r,c.colorRange=i,c.colorColumnIndexV=n,c.colorMinV=a,c.colorRangeV=o,c.color2dMapIndex=l,c.activeCatColumnName=null,s&&c.color2dLut.set(s.subarray(0,128)),H();return}if(e.data.type===`selectContinuous`){if(e.data.dataVersion!==W||!K(e.data.id))return;let{columnIndex:n,ranges:r}=e.data,{numPoints:i,dataBuffers:a}=c,o=a[n];if(!o)return;let s=new Uint32Array(Math.ceil(i/32)),l=r.length/2;for(let e=0;e<i;e++){let t=o[e],n=!1;for(let e=0;e<l;e++)if(t>=r[e*2]&&t<=r[e*2+1]){n=!0;break}n&&(s[e>>5]=s[e>>5]|0|1<<(e&31))}X(t,s),U(),u({type:`columnSelectionResult`,mask:s,id:e.data.id,column:e.data.column},[s.buffer]);return}if(e.data.type===`selectCategorical`){if(e.data.dataVersion!==W||!K(e.data.id))return;let{catColumnName:n,selectedLabels:r}=e.data,i=c.categoricalBuffers.get(n);if(!i)return;let{numPoints:a}=c,o=new Uint32Array(Math.ceil(a/32));for(let e=0;e<a;e++){let t=i[e];t<r.length&&r[t]>0&&(o[e>>5]=o[e>>5]|0|1<<(e&31))}X(t,o),U(),u({type:`columnSelectionResult`,mask:o,id:e.data.id,column:n,labelIndices:e.data.labelIndices},[o.buffer]);return}if(e.data.type!==`data`)return;let{dataVersion:n,dims:r,rows:i,buffers:o,mins:s,ranges:l,means:d,categoricalColumns:f}=e.data;if(W=n,r<2||i===0||o.length<2){u({type:`error`,message:`Need at least 2 dimensions to render`});return}c.dataTexture&&(t.deleteTexture(c.dataTexture),c.dataTexture=null),c.colorLutTexture&&(t.deleteTexture(c.colorLutTexture),c.colorLutTexture=null);for(let e of c.catIndexTextures.values())t.deleteTexture(e);c.catIndexTextures.clear(),c.selectionTexture&&(t.deleteTexture(c.selectionTexture),c.selectionTexture=null),c.styleFlags={useSelectionMask:!1},c.colorMode=0,c.colorColumnIndex=0,c.colorMin=0,c.colorRange=1,c.colorNumStops=0,c.activeCatColumnName=null,c.categoricalBuffers.clear(),c.dataBuffers=o,c.normMins=new Float32Array(s),c.normRanges=new Float32Array(l),c.normMeans=new Float32Array(d),c.numPoints=i,c.numDims=r;let p=t.getParameter(t.MAX_TEXTURE_SIZE),m=Math.min(i,p),h=Math.ceil(i/m);c.texWidth=m;let g=t.createTexture();t.bindTexture(t.TEXTURE_2D,g);let _=r*h,v=new Float32Array(m*_);for(let e=0;e<r;e++){let t=o[e],n=e*h;for(let e=0;e<i;e++){let r=e%m,i=n+Math.floor(e/m);v[i*m+r]=t[e]}}t.texImage2D(t.TEXTURE_2D,0,t.R32F,m,_,0,t.RED,t.FLOAT,v),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),t.bindTexture(t.TEXTURE_2D,null),c.dataTexture=g;for(let e of f)c.categoricalBuffers.set(e.name,e.indices),c.catIndexTextures.set(e.name,Y(t,e.indices,i,m));if(c.tour&&c.tour.dims===r)B();else{let e=Math.max(1,c.previewCanvases.size),t=[];for(let n=0;n<e;n++){let i=new Float32Array(r*2),a=Math.floor(n/e*r);i[a]=1,i[r+(a+1)%r]=1,t.push(i)}c.tour={bases:t,arcLengths:a(t,r),dims:r,orthonormalize:!0,position:0,interpolatedBasis:new Float32Array(r*2)},B()}},J=(e,t)=>{let n=e.createTexture();return e.bindTexture(e.TEXTURE_2D,n),e.texImage2D(e.TEXTURE_2D,0,e.R32UI,t.length,1,0,e.RED_INTEGER,e.UNSIGNED_INT,t),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.bindTexture(e.TEXTURE_2D,null),n},Y=(e,t,n,r)=>{let i=Math.ceil(n/r),a;if(i===1)a=t;else{a=new Uint32Array(r*i);for(let e=0;e<n;e++){let n=e%r,i=Math.floor(e/r);a[i*r+n]=t[e]}}let o=e.createTexture();return e.bindTexture(e.TEXTURE_2D,o),e.texImage2D(e.TEXTURE_2D,0,e.R32UI,r,i,0,e.RED_INTEGER,e.UNSIGNED_INT,a),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.bindTexture(e.TEXTURE_2D,null),o},X=(e,t)=>{if(!c)return;c.selectionTexture&&e.deleteTexture(c.selectionTexture);let n=e.createTexture();e.bindTexture(e.TEXTURE_2D,n),e.texImage2D(e.TEXTURE_2D,0,e.R32UI,t.length,1,0,e.RED_INTEGER,e.UNSIGNED_INT,t),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.bindTexture(e.TEXTURE_2D,null),c.selectionTexture=n},Z=(e,t,n,r)=>{let i=!1;for(let a=0,o=r-1;a<r;o=a++){let r=n[a*2],s=n[a*2+1],c=n[o*2],l=n[o*2+1];s>t!=l>t&&e<(c-r)*(t-s)/(l-s)+r&&(i=!i)}return i},Q=(e,t)=>{if(!c?.normRanges||c.numPoints===0||!K(t))return;let{numPoints:n,numDims:r,dataBuffers:i,camera:a}=c,o=e.length/2;if(o<3)return;let l=null;if(c.directBasis)l=c.directBasis;else if(c.tour){let{tour:e}=c;s(e.interpolatedBasis,e.bases,e.arcLengths,e.dims,e.position,e.orthonormalize),l=e.interpolatedBasis}if(!l)return;let d=b();if(!d)return;let{weights:f,biasX:p,biasY:m}=y(l,d,c.normRanges,r),h=c.mainView.canvas,g=h.width/h.height||1,_=a.insetZoom,v=a.zoom*_,x=new Float32Array(e.length);for(let t=0;t<o;t++)x[t*2]=e[t*2]*g/v-a.panX,x[t*2+1]=(e[t*2+1]-a.insetOffsetY)/v-a.panY;let S=new Uint32Array(Math.ceil(n/32));for(let e=0;e<n;e++){let t=p,n=m;for(let a=0;a<r;a++){let o=i[a][e];t+=o*f[a],n+=o*f[r+a]}Z(t,n,x,o)&&(S[e>>5]=S[e>>5]|0|1<<(e&31))}let C=c.mainView.gl;X(C,S),U();let w=new Uint32Array(S);u({type:`selectionResult`,mask:w,id:t},[w.buffer])},ee=()=>{if(!c)return 0;let e=0;if(c.dataTexture){let t=Math.ceil(c.numPoints/c.texWidth);e+=c.texWidth*c.numDims*t*4}for(let t=0;t<c.hdrSizes.length;t++){let n=c.hdrSizes[t];n&&(e+=n[0]*n[1]*16)}c.blitSize&&(e+=c.blitSize[0]*c.blitSize[1]*4),c.colorLutTexture&&(e+=c.colorNumStops*4);for(let t of c.categoricalBuffers.values())e+=t.byteLength;return c.selectionTexture&&(e+=Math.ceil(c.numPoints/32)*4),e},te=()=>{if(!c)return;let e=0;for(let t of c.dataBuffers)e+=t.byteLength;for(let t of c.categoricalBuffers.values())e+=t.byteLength;if(c.normMins&&(e+=c.normMins.byteLength),c.normRanges&&(e+=c.normRanges.byteLength),c.tour){for(let t of c.tour.bases)e+=t.byteLength;e+=c.tour.interpolatedBasis.byteLength}u({type:`metricsResult`,gpuMemoryBytes:ee(),numPoints:c.numPoints,numDims:c.numDims,workerJsHeapBytes:e})},ne=e=>{if(!c?.tour||!c.dataTexture||c.numPoints===0){u({type:`error`,message:`No data/tour loaded for benchmark`});return}let t=c.mainView.gl,{numPoints:n,numDims:r,tour:i}=c,a=i.position;c.directBasis=null;let o=/* @__PURE__ */ new Uint8Array(4),l=()=>{t.readPixels(0,0,1,1,t.RGBA,t.UNSIGNED_BYTE,o)};for(let e=0;e<5;e++)i.position=e/5,s(i.interpolatedBasis,i.bases,i.arcLengths,i.dims,i.position,i.orthonormalize),N(i.interpolatedBasis,c.mainView.canvas.width,c.mainView.canvas.height,0,c.camera),l();let d=new Float64Array(e);for(let t=0;t<e;t++){i.position=t/e,s(i.interpolatedBasis,i.bases,i.arcLengths,i.dims,i.position,i.orthonormalize);let n=performance.now();N(i.interpolatedBasis,c.mainView.canvas.width,c.mainView.canvas.height,0,c.camera),l(),d[t]=performance.now()-n}i.position=a,u({type:`benchmarkResult`,frameTimes:d,numPoints:n,numDims:r},[d.buffer])},$=e=>{if(c){if(e.type===`setBases`){let{bases:t}=e;if(t.length===0)return;let n=t[0].length/2,r=e.tourFamily!==`sequential`;c.tour={bases:t,arcLengths:a(t,n,r),dims:n,orthonormalize:r,position:c.tour?.position??0,interpolatedBasis:new Float32Array(n*2)},c.dataTexture&&B()}else if(e.type===`addPreviewCanvas`){let t=e.canvas.getContext(`2d`);if(!t)return;c.previewCanvases.set(e.id,{canvas:e.canvas,ctx2d:t}),c.dataTexture&&c.tour&&e.id<c.tour.bases.length&&L(e.id,c.tour.bases[e.id])}else if(e.type===`removePreviewCanvas`)c.previewCanvases.delete(e.id);else if(e.type===`resizePreview`){let t=c.previewCanvases.get(e.id);if(!t)return;t.canvas.width=e.width,t.canvas.height=e.height,c.dataTexture&&c.tour&&e.id<c.tour.bases.length&&z()}else if(e.type===`setTourPosition`){if(!c.tour)return;c.tour.position=e.position,c.directBasis=null,k()}else if(e.type===`setStyle`)c.style={pointSize:e.pointSize,opacity:e.opacity,color:e.color,minPointSize:e.minPointSize??c.style.minPointSize,fillTarget:e.fillTarget??c.style.fillTarget},(c.tour||c.directBasis)&&c.dataTexture&&B();else if(e.type===`setCamera`)c.camera={panX:e.pan[0],panY:e.pan[1],zoom:e.zoom,aspect:c.camera.aspect,viewportHeight:c.camera.viewportHeight,insetOffsetY:e.insetOffsetY,insetZoom:e.insetZoom},V();else if(e.type===`setProjectionScale`)_=e.scale,V(),z();else if(e.type===`setCentering`)c.centering=e.centering,(c.tour||c.directBasis)&&c.dataTexture&&B();else if(e.type===`resize`)e.dpr!==void 0&&(c.dpr=e.dpr),e.viewIndex===0&&(c.mainView.canvas.width=e.width,c.mainView.canvas.height=e.height,(c.tour||c.directBasis)&&c.dataTexture&&V());else if(e.type===`render`)(c.tour||c.directBasis)&&c.dataTexture&&B();else if(e.type===`setDirectBasis`){if(!c.dataTexture)return;c.directBasis=e.basis,N(e.basis,c.mainView.canvas.width,c.mainView.canvas.height,0,c.camera),u({type:`rendered`,viewIndex:0})}else if(e.type===`clearColors`)c.colorLutTexture&&(c.mainView.gl.deleteTexture(c.colorLutTexture),c.colorLutTexture=null),c.colorMode=0,c.colorColumnIndex=0,c.colorMin=0,c.colorRange=1,c.colorNumStops=0,c.activeCatColumnName=null,(c.tour||c.directBasis)&&c.dataTexture&&B();else if(e.type===`setBackgroundColor`)c.backgroundColor=e.color,(c.tour||c.directBasis)&&c.dataTexture&&B();else if(e.type===`setMaxPoints`)c.maxPoints=e.maxPoints,(c.tour||c.directBasis)&&c.dataTexture&&B();else if(e.type===`setSelectionMask`){if(!K(e.id))return;let t=c.mainView.gl;X(t,e.mask),c.styleFlags.useSelectionMask=!0,(c.tour||c.directBasis)&&c.dataTexture&&B();let n=new Uint32Array(e.mask);u({type:`selectionResult`,mask:n,id:e.id},[n.buffer])}else if(e.type===`clearSelectionMask`){if(!K(e.id))return;c.selectionTexture&&(c.mainView.gl.deleteTexture(c.selectionTexture),c.selectionTexture=null),c.styleFlags.useSelectionMask=!1,(c.tour||c.directBasis)&&c.dataTexture&&B(),u({type:`selectionResult`,mask:/* @__PURE__ */ new Uint32Array,id:e.id})}else if(e.type===`startPlayback`){if(!c.tour)return;j(e.speed,e.direction)}else if(e.type===`stopPlayback`)M();else if(e.type===`computePCA`)u({type:`error`,message:`PCA not yet implemented in WebGL backend`});else if(e.type===`lassoSelect`)Q(e.polygon,e.id);else if(e.type===`getProjectedPositions`){if(!c?.normRanges||c.numPoints===0){u({type:`projectedPositions`,positions:/* @__PURE__ */ new Float32Array},[]);return}let{numPoints:e,numDims:t,dataBuffers:n}=c,r=null;if(c.directBasis)r=c.directBasis;else if(c.tour){let{tour:e}=c;s(e.interpolatedBasis,e.bases,e.arcLengths,e.dims,e.position,e.orthonormalize),r=e.interpolatedBasis}if(!r){u({type:`projectedPositions`,positions:/* @__PURE__ */ new Float32Array},[]);return}let i=b();if(!i){u({type:`projectedPositions`,positions:/* @__PURE__ */ new Float32Array},[]);return}let{weights:a,biasX:o,biasY:l}=y(r,i,c.normRanges,t),d=new Float32Array(e*2);for(let r=0;r<e;r++){let e=o,i=l;for(let o=0;o<t;o++){let s=n[o][r];e+=s*a[o],i+=s*a[t+o]}d[r*2]=e,d[r*2+1]=i}u({type:`projectedPositions`,positions:d},[d.buffer])}else if(e.type===`getPointData`){if(!c||c.numPoints===0){u({type:`pointData`,pointIndex:e.pointIndex,numericValues:{},categoricalValues:{}});return}let{numDims:t,dataBuffers:n}=c,r=e.pointIndex;if(r<0||r>=c.numPoints){u({type:`pointData`,pointIndex:r,numericValues:{},categoricalValues:{}});return}let i={};for(let e=0;e<t;e++)i[String(e)]=n[e][r];let a={};for(let[e,t]of c.categoricalBuffers)a[e]=t[r];u({type:`pointData`,pointIndex:r,numericValues:i,categoricalValues:a})}else e.type===`benchmark`?ne(e.numFrames):e.type===`getMetrics`&&te()}};self.onmessage=e=>{let t=e.data;if(t.type===`init`)try{let e=t.canvas,n=e.getContext(`webgl2`,{alpha:!0,premultipliedAlpha:!0,antialias:!1,preserveDrawingBuffer:!1});if(!n)throw Error(`WebGL2 not supported`);e.addEventListener(`webglcontextlost`,()=>{u({type:`lost`,message:`WebGL context lost`})}),n.getExtension(`EXT_color_buffer_float`)||console.warn(`EXT_color_buffer_float not available — HDR rendering may fail`),n.getExtension(`OES_texture_float_linear`),n.getExtension(`EXT_float_blend`);let r=n,i=f(r,`#version 300 es\n// Point renderer — gl.POINTS with SDF circle anti-aliasing\n//\n// WebGL2 equivalent of point.wgsl. Projects raw ND data to 2D inline using\n// pre-adjusted basis weights and biases (normalization folded into the basis\n// on CPU). Uses gl.POINTS with gl_PointSize for native point expansion —\n// 1 vertex per point instead of 4 (instanced quads in WebGPU).\n//\n// Data is stored in a tiled R32F texture to handle point counts exceeding\n// MAX_TEXTURE_SIZE. Layout: width=texWidth, height=numDims*tileRows.\n// For point idx: col = idx % texWidth, row = d * tileRows + idx / texWidth.\n//\n// Color mapping: instead of a pre-computed N-element color texture, the shader\n// reads raw data values and looks up colors from a tiny LUT at render time.\n\nprecision highp float;\nprecision highp int;\nprecision highp sampler2D;\nprecision highp usampler2D;\n\n// Raw ND data (column-major, tiled).\n// R32F texture: width = texWidth, height = numDims * tileRows.\nuniform sampler2D u_data;\n\n// Adjusted basis weights (normalization folded in).\n// Max 128 dims — for higher, fall back to a basis texture.\nuniform float u_adjBasisX[128];\nuniform float u_adjBasisY[128];\nuniform vec2 u_bias;\n\n// Style\nuniform float u_pointSize; // NDC units\nuniform float u_opacity;\nuniform vec4 u_color; // uniform point color (RGBA 0-1)\nuniform float u_useSubtractive;\nuniform float u_scaleOpacityByZoom; // 1.0 = auto (zoom² density scaling), 0.0 = manual\n\n// Camera\nuniform vec2 u_pan;\nuniform float u_zoom;\nuniform float u_aspect;\nuniform float u_viewportHeight;\nuniform float u_insetOffsetY;\nuniform float u_insetZoom;\n\n// Data dimensions\nuniform int u_numPoints;\nuniform int u_numDims;\n\n// Decimation: 0 = disabled\nuniform int u_maxPoints;\n\n// Tiling: texture width (min(numPoints, MAX_TEXTURE_SIZE))\nuniform int u_texWidth;\n\n// Color mapping — tiny LUT replaces N-element packed color texture\n// 0 = uniform color, 1 = continuous, 2 = categorical, 3 = 2D colormap\nuniform int u_colorMode;\nuniform int u_colorColumnIndex; // which data column to read (continuous only)\nuniform float u_colorMin;\nuniform float u_colorRange;\nuniform int u_colorNumStops; // LUT size\nuniform usampler2D u_colorLutTex; // packed RGBA u32 LUT (width=numStops, height=1)\nuniform usampler2D u_catIndexTex; // categorical indices (R32UI, tiled like data tex)\n\n// 2D colormap params (used when u_colorMode == 3)\nuniform int u_colorColumnIndexV; // second data column\nuniform float u_colorMinV;\nuniform float u_colorRangeV;\nuniform int u_color2dMapIndex; // 0-5 = LUT-based, 6 = oklab_polar\nuniform float u_color2dLut[128]; // SVD rank-1 LUT curves (8 × 16 entries)\n\n// Selection mask (bit-packed u32 in R32UI texture, width = ceil(N/32), height = 1)\nuniform float u_useSelectionMask;\nuniform usampler2D u_selectionTex;\n\nflat out float v_effOpacity;\nflat out vec4 v_color;\nflat out uint v_selected;\nflat out float v_useSubtractive;\nflat out float v_useSelectionMask;\n\n// Unpack RGBA8 from u32 (0xAABBGGRR little-endian)\nvec4 unpackColor(uint packed) {\n float r = float(packed & 0xFFu) / 255.0;\n float g = float((packed >> 8u) & 0xFFu) / 255.0;\n float b = float((packed >> 16u) & 0xFFu) / 255.0;\n float a = float((packed >> 24u) & 0xFFu) / 255.0;\n return vec4(r, g, b, a);\n}\n\n// PCG hash — fast, high-quality deterministic random from vertex index.\n// Used for vertex-shader decimation when numPoints > maxPoints.\nuint pcg_hash(uint v) {\n uint state = v * 747796405u + 2891336453u;\n uint word = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u;\n return (word >> 22u) ^ word;\n}\n\nfloat random_float(uint seed) {\n return float(pcg_hash(seed)) / 4294967295.0;\n}\n\n// ── 2D colormap helpers ──\n\n// Linearly interpolate within a 16-entry LUT curve starting at base offset.\nfloat lut2d_interp(int base, float t) {\n float pos = t * 15.0;\n int lo = min(int(floor(pos)), 14);\n int hi = lo + 1;\n return mix(u_color2dLut[base + lo], u_color2dLut[base + hi], fract(pos));\n}\n\n// Reconstruct 2D color from SVD rank-1 LUT curves.\n// Layout: R_X[16] R_Y[16] G_X[16] G_Y[16] B_X[16] B_Y[16] B_X2[16] B_Y2[16]\nvec3 colormap2d_lut(float u, float v) {\n float r = lut2d_interp(0, u) * lut2d_interp(16, v);\n float g = lut2d_interp(32, u) * lut2d_interp(48, v);\n float b = lut2d_interp(64, u) * lut2d_interp(80, v)\n + lut2d_interp(96, u) * lut2d_interp(112, v);\n return clamp(vec3(r, g, b), vec3(0.0), vec3(1.0));\n}\n\n// Oklab → linear sRGB conversion\nvec3 oklabToLinear(vec3 lab) {\n float l_ = lab.x + 0.3963377774 * lab.y + 0.2158037573 * lab.z;\n float m_ = lab.x - 0.1055613458 * lab.y - 0.0638541728 * lab.z;\n float s_ = lab.x - 0.0894841775 * lab.y - 1.2914855480 * lab.z;\n float l = l_ * l_ * l_;\n float m = m_ * m_ * m_;\n float s = s_ * s_ * s_;\n return vec3(\n 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,\n -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,\n -0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s\n );\n}\n\n// Oklab polar 2D colormap: hue = angle, chroma = radius, lightness varies\nvec3 colormap2d_oklab_polar(float u, float v) {\n float cx = u - 0.5;\n float cy = v - 0.5;\n float radius = min(length(vec2(cx, cy)) * 2.0, 1.0);\n float angle = atan(cy, cx);\n float chroma = radius * 0.25;\n float L = mix(0.3, 0.85, 1.0 - radius);\n float a = chroma * cos(angle);\n float b = chroma * sin(angle);\n vec3 linear = oklabToLinear(vec3(L, a, b));\n return pow(clamp(linear, vec3(0.0), vec3(1.0)), vec3(1.0 / 2.2));\n}\n\nvec3 colormap2d(int mapIndex, float u, float v) {\n if (mapIndex == 6) {\n return colormap2d_oklab_polar(u, v);\n }\n return colormap2d_lut(u, v);\n}\n\nvoid main() {\n int idx = gl_VertexID;\n\n // Vertex-shader decimation: skip expensive projection for excess points.\n if (u_maxPoints > 0 && u_numPoints > u_maxPoints) {\n float threshold = float(u_maxPoints) / float(u_numPoints);\n if (random_float(uint(idx)) > threshold) {\n gl_Position = vec4(0.0, 0.0, 0.0, 0.0);\n gl_PointSize = 0.0;\n v_effOpacity = 0.0;\n v_color = vec4(0.0);\n v_selected = 0u;\n v_useSubtractive = 0.0;\n v_useSelectionMask = 0.0;\n return;\n }\n }\n\n // Tiled texture coordinates: col = idx % texWidth, tileRow = idx / texWidth\n int tileRows = (u_numPoints + u_texWidth - 1) / u_texWidth;\n int tx = idx % u_texWidth;\n int tileRow = idx / u_texWidth;\n\n // Inline ND -> 2D projection with pre-adjusted basis.\n // CPU folds normalization into the basis weights and biases so the\n // hot loop is just: x += raw * adjBasisX[d], y += raw * adjBasisY[d]\n float x = u_bias.x;\n float y = u_bias.y;\n for (int d = 0; d < u_numDims; d++) {\n float raw = texelFetch(u_data, ivec2(tx, d * tileRows + tileRow), 0).r;\n x += raw * u_adjBasisX[d];\n y += raw * u_adjBasisY[d];\n }\n\n // Apply camera: translate then scale, with aspect correction on x.\n float iz = u_insetZoom;\n vec2 center = vec2(\n (x + u_pan.x) * u_zoom * iz / u_aspect,\n (y + u_pan.y) * u_zoom * iz + u_insetOffsetY\n );\n\n gl_Position = vec4(center, 0.0, 1.0);\n\n // Point size: clamp to [2, 32] physical pixels (same as WGSL)\n float min_ndc = 4.0 / u_viewportHeight;\n float max_ndc = 64.0 / u_viewportHeight;\n float ps = clamp(u_pointSize, min_ndc, max_ndc);\n // gl_PointSize is in physical pixels, convert from NDC\n gl_PointSize = ps * u_viewportHeight * 0.5;\n\n // Scale opacity by zoom^2 for constant visual fill density (Reusser).\n // Only applied for auto-computed opacity; manual values are used as-is.\n // Capped at 1 so a lone point never exceeds its own color; above 1, channels\n // clip unevenly and shift the hue (e.g., orange turns yellow).\n float z = u_zoom * u_insetZoom;\n float zoomScale = u_scaleOpacityByZoom > 0.5 ? z * z : 1.0;\n v_effOpacity = min(u_opacity * zoomScale, 1.0);\n\n // Resolve per-point color from LUT\n if (u_colorMode == 1) {\n // Continuous: read raw value from color column, normalize, interpolate LUT\n float raw = texelFetch(u_data, ivec2(tx, u_colorColumnIndex * tileRows + tileRow), 0).r;\n float invRange = u_colorRange > 0.0 ? 1.0 / u_colorRange : 0.0;\n float t = clamp((raw - u_colorMin) * invRange, 0.0, 1.0);\n float stops = float(u_colorNumStops - 1);\n float pos = t * stops;\n int idx0 = min(int(floor(pos)), u_colorNumStops - 2);\n float frac = pos - float(idx0);\n vec4 c0 = unpackColor(texelFetch(u_colorLutTex, ivec2(idx0, 0), 0).r);\n vec4 c1 = unpackColor(texelFetch(u_colorLutTex, ivec2(idx0 + 1, 0), 0).r);\n v_color = mix(c0, c1, frac);\n } else if (u_colorMode == 2) {\n // Categorical: read category index from tiled texture, direct palette lookup\n uint catIdx = texelFetch(u_catIndexTex, ivec2(tx, tileRow), 0).r;\n int lutIdx = int(catIdx) % u_colorNumStops;\n v_color = unpackColor(texelFetch(u_colorLutTex, ivec2(lutIdx, 0), 0).r);\n } else if (u_colorMode == 3) {\n // 2D colormap: read two columns, normalize to UV, look up from 2D colormap\n float rawU = texelFetch(u_data, ivec2(tx, u_colorColumnIndex * tileRows + tileRow), 0).r;\n float rawV = texelFetch(u_data, ivec2(tx, u_colorColumnIndexV * tileRows + tileRow), 0).r;\n float invRangeU = u_colorRange > 0.0 ? 1.0 / u_colorRange : 0.0;\n float invRangeV = u_colorRangeV > 0.0 ? 1.0 / u_colorRangeV : 0.0;\n float uVal = clamp((rawU - u_colorMin) * invRangeU, 0.0, 1.0);\n float vVal = clamp((rawV - u_colorMinV) * invRangeV, 0.0, 1.0);\n vec3 rgb2d = colormap2d(u_color2dMapIndex, uVal, vVal);\n v_color = vec4(rgb2d, 1.0);\n } else {\n v_color = u_color;\n }\n\n // Read selection bit (not tiled — bit-packed width is small)\n v_selected = 1u;\n if (u_useSelectionMask > 0.5) {\n int word_idx = idx / 32;\n uint word = texelFetch(u_selectionTex, ivec2(word_idx, 0), 0).r;\n v_selected = (word >> uint(idx % 32)) & 1u;\n }\n\n v_useSubtractive = u_useSubtractive;\n v_useSelectionMask = u_useSelectionMask;\n}\n`,`#version 300 es\n// Point fragment shader — SDF circle anti-aliasing\n//\n// WebGL2 equivalent of point.wgsl fs_main. Uses gl_PointCoord for the\n// SDF distance (maps [0,1] in gl.POINTS, remap to [-1,1]).\n\nprecision highp float;\nprecision highp int;\n\nflat in float v_effOpacity;\nflat in vec4 v_color;\nflat in uint v_selected;\nflat in float v_useSubtractive;\nflat in float v_useSelectionMask;\n\nlayout(location = 0) out vec4 fragColor;\n\nvoid main() {\n // gl_PointCoord is [0,1], remap to [-1,1] for SDF\n vec2 uv = gl_PointCoord * 2.0 - 1.0;\n float dist = length(uv);\n\n // Smooth anti-aliased edge — naturally 0 for dist >= 1.0, so no discard needed.\n // Avoiding discard preserves early-Z and SIMD wavefront occupancy.\n float edge = 1.0 - smoothstep(0.75, 1.0, dist);\n\n // Selection: boost selected, dim unselected\n float sel_factor = 1.0;\n if (v_useSelectionMask > 0.5) {\n if (v_selected == 0u) {\n sel_factor = 0.1;\n } else {\n sel_factor = 1.0 / max(v_effOpacity, 0.01);\n }\n }\n\n float intensity = edge * v_effOpacity * v_color.a * sel_factor;\n\n // Subtractive mode (Reusser): output complement color so that\n // reverse-subtract blend (dst - src) on a white bg yields the correct hue.\n vec3 rgb = v_color.rgb;\n if (v_useSubtractive > 0.5) {\n rgb = vec3(1.0) - rgb;\n }\n\n fragColor = vec4(rgb * intensity, intensity);\n}\n`),a={u_data:p(r,i,`u_data`),u_adjBasisX:p(r,i,`u_adjBasisX`),u_adjBasisY:p(r,i,`u_adjBasisY`),u_bias:p(r,i,`u_bias`),u_pointSize:p(r,i,`u_pointSize`),u_opacity:p(r,i,`u_opacity`),u_color:p(r,i,`u_color`),u_useSubtractive:p(r,i,`u_useSubtractive`),u_pan:p(r,i,`u_pan`),u_zoom:p(r,i,`u_zoom`),u_aspect:p(r,i,`u_aspect`),u_viewportHeight:p(r,i,`u_viewportHeight`),u_insetOffsetY:p(r,i,`u_insetOffsetY`),u_insetZoom:p(r,i,`u_insetZoom`),u_numPoints:p(r,i,`u_numPoints`),u_numDims:p(r,i,`u_numDims`),u_maxPoints:p(r,i,`u_maxPoints`),u_texWidth:p(r,i,`u_texWidth`),u_colorMode:p(r,i,`u_colorMode`),u_colorColumnIndex:p(r,i,`u_colorColumnIndex`),u_colorMin:p(r,i,`u_colorMin`),u_colorRange:p(r,i,`u_colorRange`),u_colorNumStops:p(r,i,`u_colorNumStops`),u_colorLutTex:p(r,i,`u_colorLutTex`),u_catIndexTex:p(r,i,`u_catIndexTex`),u_useSelectionMask:p(r,i,`u_useSelectionMask`),u_selectionTex:p(r,i,`u_selectionTex`),u_colorColumnIndexV:p(r,i,`u_colorColumnIndexV`),u_colorMinV:p(r,i,`u_colorMinV`),u_colorRangeV:p(r,i,`u_colorRangeV`),u_color2dMapIndex:p(r,i,`u_color2dMapIndex`),u_color2dLut:p(r,i,`u_color2dLut`),u_scaleOpacityByZoom:p(r,i,`u_scaleOpacityByZoom`)},o=f(r,`#version 300 es\n// Fullscreen tone-map pass — oversized triangle (3 vertices, no vertex buffer).\n// Same geometry as tonemap.wgsl.\n\nvoid main() {\n // Oversized triangle covering the full clip space:\n // vi=0 -> (-1, -1) vi=1 -> (3, -1) vi=2 -> (-1, 3)\n float x = float(gl_VertexID / 2) * 4.0 - 1.0;\n float y = float(gl_VertexID % 2) * 4.0 - 1.0;\n gl_Position = vec4(x, y, 0.0, 1.0);\n}\n`,`#version 300 es\n// Fullscreen tone-map pass — reads HDR float texture and maps to [0,1].\n// Same logic as tonemap.wgsl.\n//\n// Mode 0 (additive): per-channel exponential compression 1-exp(-x).\n// Dense regions desaturate toward white, which also shifts the hue\n// (weaker channels catch up with the strongest).\n// Mode 1 (normal / subtractive): simple clamp to [0,1].\n\nprecision highp float;\n\nuniform sampler2D u_hdrTexture;\nuniform float u_mode;\n\nlayout(location = 0) out vec4 fragColor;\n\nvoid main() {\n vec4 hdr = texelFetch(u_hdrTexture, ivec2(gl_FragCoord.xy), 0);\n\n vec3 mapped;\n if (u_mode < 0.5) {\n // Additive: exponential compression preserving density structure\n mapped = 1.0 - exp(-hdr.rgb);\n } else {\n // Normal / Subtractive: values already in [0,1], just clamp\n mapped = clamp(hdr.rgb, vec3(0.0), vec3(1.0));\n }\n fragColor = vec4(mapped, 1.0);\n}\n`),s={u_hdrTexture:p(r,o,`u_hdrTexture`),u_mode:p(r,o,`u_mode`)};c={mainView:{canvas:e,gl:n},previewCanvases:/* @__PURE__ */ new Map,pointProgram:i,pointLocs:a,tonemapProgram:o,tonemapLocs:s,hdrFbos:[],hdrTextures:[],hdrSizes:[],blitFbo:null,blitTexture:null,blitSize:null,dataTexture:null,colorLutTexture:null,catIndexTextures:/* @__PURE__ */ new Map,selectionTexture:null,numPoints:0,numDims:0,dataBuffers:[],normMins:null,normRanges:null,normMeans:null,centering:`midrange`,categoricalBuffers:/* @__PURE__ */ new Map,tour:null,style:{pointSize:`auto`,opacity:`auto`,color:[.25,.5,.9],minPointSize:2,fillTarget:.5},styleFlags:{useSelectionMask:!1},colorMode:0,colorColumnIndex:0,colorMin:0,colorRange:1,colorNumStops:0,activeCatColumnName:null,colorColumnIndexV:0,colorMinV:0,colorRangeV:1,color2dMapIndex:0,color2dLut:/* @__PURE__ */ new Float32Array(128),camera:{panX:0,panY:0,zoom:t.zoom,aspect:1,viewportHeight:1,insetOffsetY:0,insetZoom:1},directBasis:null,backgroundColor:[0,0,0],dpr:t.dpr,maxPoints:0,texWidth:0},t.dataPort.onmessage=q;let d=l;if(l=null,d)for(let e of d)$(e);u({type:`ready`})}catch(e){u({type:`error`,message:e instanceof Error?e.message:String(e)})}else l?l.push(t):$(t)};", N = typeof self < "u" && self.Blob && new Blob(["URL.revokeObjectURL(import.meta.url);", M], { type: "text/javascript;charset=utf-8" });
3060
+ function P(e) {
3028
3061
  let t;
3029
3062
  try {
3030
- if (t = M && (self.URL || self.webkitURL).createObjectURL(M), !t) throw "";
3063
+ if (t = N && (self.URL || self.webkitURL).createObjectURL(N), !t) throw "";
3031
3064
  let n = new Worker(t, {
3032
3065
  type: "module",
3033
3066
  name: e?.name
@@ -3036,7 +3069,7 @@ function N(e) {
3036
3069
  (self.URL || self.webkitURL).revokeObjectURL(t);
3037
3070
  }), n;
3038
3071
  } catch {
3039
- return new Worker("data:text/javascript;charset=utf-8," + encodeURIComponent(j), {
3072
+ return new Worker("data:text/javascript;charset=utf-8," + encodeURIComponent(M), {
3040
3073
  type: "module",
3041
3074
  name: e?.name
3042
3075
  });
@@ -3044,12 +3077,12 @@ function N(e) {
3044
3077
  }
3045
3078
  //#endregion
3046
3079
  //#region src/webgl/client.ts
3047
- var P = (e, t, n) => {
3080
+ var F = (e, t, n) => {
3048
3081
  e.postMessage(t, n ?? []);
3049
- }, F = (e, t, n) => {
3082
+ }, I = (e, t, n) => {
3050
3083
  e.postMessage(t, n ?? []);
3051
- }, I = (e) => {
3052
- let { canvas: t, zoom: n = 1, dpr: r = typeof self < "u" && "devicePixelRatio" in self ? self.devicePixelRatio : 1 } = e, i = new N(), a = new p(), o = new MessageChannel(), s = /* @__PURE__ */ new Set(), c = (e) => {
3084
+ }, L = (e) => {
3085
+ let { canvas: t, zoom: n = 1, dpr: r = typeof self < "u" && "devicePixelRatio" in self ? self.devicePixelRatio : 1 } = e, i = new P(), a = new p(), o = new MessageChannel(), s = /* @__PURE__ */ new Set(), c = (e) => {
3053
3086
  for (let t of s) t(e);
3054
3087
  };
3055
3088
  i.onmessage = (e) => {
@@ -3067,9 +3100,7 @@ var P = (e, t, n) => {
3067
3100
  maxMs: r[e.length - 1]
3068
3101
  }
3069
3102
  });
3070
- return;
3071
- }
3072
- c(t);
3103
+ } else c(t);
3073
3104
  }, i.onerror = (e) => {
3074
3105
  c({
3075
3106
  type: "error",
@@ -3087,10 +3118,10 @@ var P = (e, t, n) => {
3087
3118
  });
3088
3119
  };
3089
3120
  let l = t.transferControlToOffscreen();
3090
- F(a, {
3121
+ I(a, {
3091
3122
  type: "init",
3092
3123
  gpuPort: o.port1
3093
- }, [o.port1]), P(i, {
3124
+ }, [o.port1]), F(i, {
3094
3125
  type: "init",
3095
3126
  canvas: l,
3096
3127
  dataPort: o.port2,
@@ -3113,27 +3144,27 @@ var P = (e, t, n) => {
3113
3144
  insetOffsetY: 0,
3114
3145
  insetZoom: 1
3115
3146
  }, f = (e) => {
3116
- F(a, {
3147
+ O.reset(), I(a, {
3117
3148
  type: "load",
3118
3149
  buffer: e
3119
3150
  }, [e]);
3120
- }, m = (e, t) => {
3151
+ }, h = (e, t) => {
3121
3152
  let n = e.map((e) => e.buffer);
3122
- P(i, {
3153
+ F(i, {
3123
3154
  type: "setBases",
3124
3155
  bases: e,
3125
3156
  tourFamily: t
3126
3157
  }, n);
3127
- }, h = (e) => {
3128
- P(i, {
3158
+ }, g = (e) => {
3159
+ F(i, {
3129
3160
  type: "setTourPosition",
3130
3161
  position: e
3131
3162
  });
3132
- }, g = (e) => {
3163
+ }, _ = (e) => {
3133
3164
  u = {
3134
3165
  ...u,
3135
3166
  ...e
3136
- }, P(i, {
3167
+ }, F(i, {
3137
3168
  type: "setStyle",
3138
3169
  pointSize: u.pointSize,
3139
3170
  opacity: u.opacity,
@@ -3141,116 +3172,102 @@ var P = (e, t, n) => {
3141
3172
  minPointSize: u.minPointSize,
3142
3173
  fillTarget: u.fillTarget
3143
3174
  });
3144
- }, _ = (e) => {
3175
+ }, v = (e) => {
3145
3176
  d = {
3146
3177
  ...d,
3147
3178
  ...e
3148
- }, P(i, {
3179
+ }, F(i, {
3149
3180
  type: "setCamera",
3150
3181
  pan: d.pan,
3151
3182
  zoom: d.zoom,
3152
3183
  insetOffsetY: d.insetOffsetY,
3153
3184
  insetZoom: d.insetZoom
3154
3185
  });
3155
- }, v = (e) => {
3156
- P(i, {
3186
+ }, y = (e) => {
3187
+ F(i, {
3157
3188
  type: "setCentering",
3158
3189
  centering: e
3159
3190
  });
3160
- }, y = (e, t, n, r) => {
3161
- P(i, {
3191
+ }, b = (e) => {
3192
+ F(i, {
3193
+ type: "setProjectionScale",
3194
+ scale: e
3195
+ });
3196
+ }, x = (e, t, n, r) => {
3197
+ F(i, {
3162
3198
  type: "resize",
3163
3199
  viewIndex: e,
3164
3200
  width: t,
3165
3201
  height: n,
3166
3202
  dpr: r
3167
3203
  });
3168
- }, b = () => {
3169
- P(i, { type: "render" });
3170
- }, x = (e) => {
3171
- P(i, {
3204
+ }, S = () => {
3205
+ F(i, { type: "render" });
3206
+ }, C = (e) => {
3207
+ F(i, {
3172
3208
  type: "setDirectBasis",
3173
3209
  basis: e
3174
3210
  }, [e.buffer]);
3175
- }, S = (e, t, n, r) => {
3176
- F(a, {
3211
+ }, w = (e, t, n, r) => {
3212
+ let i = {
3177
3213
  type: "encodeColor",
3178
3214
  column: e,
3179
3215
  ...t ? { palette: t } : {},
3180
3216
  ...n ? { theme: n } : {},
3181
3217
  ...r ? { colorMap: r } : {}
3182
- });
3183
- }, C = (e, t, n = "schumann") => {
3184
- F(a, {
3218
+ };
3219
+ I(a, i);
3220
+ }, T = (e, t, n = "schumann") => {
3221
+ I(a, {
3185
3222
  type: "encodeColor2D",
3186
3223
  columnX: e,
3187
3224
  columnY: t,
3188
3225
  colormap: n
3189
3226
  });
3190
- }, w = (e) => {
3191
- P(i, {
3227
+ }, E = (e) => {
3228
+ F(i, {
3192
3229
  type: "setBackgroundColor",
3193
3230
  color: e
3194
3231
  });
3195
- }, T = () => {
3196
- P(i, { type: "clearColors" });
3197
- }, E = (e, t) => {
3198
- let n = t.valueRanges ? new Float32Array(t.valueRanges) : void 0, r = [];
3199
- n && r.push(n.buffer), F(a, {
3200
- type: "selectByColumn",
3201
- column: e,
3202
- labelIndices: t.labelIndices,
3203
- valueRanges: n
3204
- }, r);
3205
- }, D = (e) => {
3206
- P(i, {
3207
- type: "setSelectionMask",
3208
- mask: e
3209
- }, [e.buffer]);
3210
- }, O = (e) => {
3211
- P(i, {
3212
- type: "lassoSelect",
3213
- polygon: e
3214
- }, [e.buffer]);
3215
- }, k = () => {
3216
- P(i, { type: "clearSelectionMask" });
3217
- }, A = () => {
3218
- P(i, { type: "computePCA" });
3219
- }, j = (e, t) => {
3220
- P(i, {
3232
+ }, D = () => {
3233
+ F(i, { type: "clearColors" });
3234
+ }, O = m((e, t) => I(a, e, t), (e, t) => F(i, e, t)), k = () => {
3235
+ F(i, { type: "computePCA" });
3236
+ }, A = (e, t) => {
3237
+ F(i, {
3221
3238
  type: "startPlayback",
3222
3239
  speed: e,
3223
3240
  direction: t
3224
3241
  });
3225
- }, M = () => {
3226
- P(i, { type: "stopPlayback" });
3227
- }, I = (e) => {
3228
- P(i, {
3242
+ }, j = () => {
3243
+ F(i, { type: "stopPlayback" });
3244
+ }, M = (e) => {
3245
+ F(i, {
3229
3246
  type: "setMaxPoints",
3230
3247
  maxPoints: e
3231
3248
  });
3232
- }, L = (e, t) => {
3249
+ }, N = (e, t) => {
3233
3250
  let n = t.transferControlToOffscreen();
3234
- P(i, {
3251
+ F(i, {
3235
3252
  type: "addPreviewCanvas",
3236
3253
  id: e,
3237
3254
  canvas: n
3238
3255
  }, [n]);
3239
- }, R = (e) => {
3240
- P(i, {
3256
+ }, L = (e) => {
3257
+ F(i, {
3241
3258
  type: "removePreviewCanvas",
3242
3259
  id: e
3243
3260
  });
3244
- }, z = () => {}, B = () => {}, V = (e) => {}, H = (e = 120) => new Promise((t) => {
3245
- let n = W((e) => {
3261
+ }, R = () => {}, z = () => {}, B = (e) => {}, V = (e = 120) => new Promise((t) => {
3262
+ let n = U((e) => {
3246
3263
  e.type === "benchmarkResult" && (n(), t(e));
3247
3264
  });
3248
- P(i, {
3265
+ F(i, {
3249
3266
  type: "benchmark",
3250
3267
  numFrames: e
3251
3268
  });
3252
- }), U = () => new Promise((e) => {
3253
- let t = W((n) => {
3269
+ }), H = () => new Promise((e) => {
3270
+ let t = U((n) => {
3254
3271
  if (n.type !== "metricsResult") return;
3255
3272
  t();
3256
3273
  let r = typeof performance < "u" && "memory" in performance ? performance.memory.usedJSHeapSize : void 0, i = Number.isFinite(r) ? r : null, a = Number.isFinite(n.workerJsHeapBytes) ? n.workerJsHeapBytes : null;
@@ -3260,65 +3277,67 @@ var P = (e, t, n) => {
3260
3277
  workerJsHeapUsedBytes: a
3261
3278
  });
3262
3279
  });
3263
- P(i, { type: "getMetrics" });
3264
- }), W = (e) => (s.add(e), () => s.delete(e)), G;
3280
+ F(i, { type: "getMetrics" });
3281
+ }), U = (e) => (s.add(e), () => s.delete(e)), W;
3265
3282
  return {
3266
3283
  loadData: f,
3267
- setBases: m,
3268
- setTourPosition: h,
3269
- setStyle: g,
3270
- setCamera: _,
3271
- setCentering: v,
3272
- resize: y,
3273
- render: b,
3274
- setDirectBasis: x,
3275
- encodeColor: S,
3276
- encodeColor2D: C,
3277
- setBackgroundColor: w,
3278
- clearColor: T,
3279
- selectByColumn: E,
3280
- setSelectionMask: D,
3281
- lassoSelect: O,
3282
- clearSelection: k,
3283
- getProjectedPositions: () => (G && G.unsub(), new Promise((e) => {
3284
- let t = W((n) => {
3285
- n.type === "projectedPositions" && (t(), G = void 0, e(n.positions));
3284
+ setBases: h,
3285
+ setTourPosition: g,
3286
+ setStyle: _,
3287
+ setCamera: v,
3288
+ setCentering: y,
3289
+ setProjectionScale: b,
3290
+ resize: x,
3291
+ render: S,
3292
+ setDirectBasis: C,
3293
+ encodeColor: w,
3294
+ encodeColor2D: T,
3295
+ setBackgroundColor: E,
3296
+ clearColor: D,
3297
+ selectByColumn: O.selectByColumn,
3298
+ setSelectionMask: O.setSelectionMask,
3299
+ lassoSelect: O.lassoSelect,
3300
+ clearSelection: O.clearSelection,
3301
+ latestSelectionId: O.latestSelectionId,
3302
+ getProjectedPositions: () => (W && W.unsub(), new Promise((e) => {
3303
+ let t = U((n) => {
3304
+ n.type === "projectedPositions" && (t(), W = void 0, e(n.positions));
3286
3305
  });
3287
- G = { unsub: t }, P(i, { type: "getProjectedPositions" });
3306
+ W = { unsub: t }, F(i, { type: "getProjectedPositions" });
3288
3307
  })),
3289
3308
  getPointData: (e) => new Promise((t) => {
3290
- let n = W((r) => {
3291
- r.type !== "pointData" || r.pointIndex !== e || (n(), t(r));
3309
+ let n = U((r) => {
3310
+ r.type === "pointData" && r.pointIndex === e && (n(), t(r));
3292
3311
  });
3293
- P(i, {
3312
+ F(i, {
3294
3313
  type: "getPointData",
3295
3314
  pointIndex: e
3296
3315
  });
3297
3316
  }),
3298
- computePCA: A,
3299
- startPlayback: j,
3300
- stopPlayback: M,
3301
- setMaxPoints: I,
3302
- addPreviewCanvas: L,
3303
- removePreviewCanvas: R,
3317
+ computePCA: k,
3318
+ startPlayback: A,
3319
+ stopPlayback: j,
3320
+ setMaxPoints: M,
3321
+ addPreviewCanvas: N,
3322
+ removePreviewCanvas: L,
3304
3323
  resizePreview: (e, t, n) => {
3305
- P(i, {
3324
+ F(i, {
3306
3325
  type: "resizePreview",
3307
3326
  id: e,
3308
3327
  width: t,
3309
3328
  height: n
3310
3329
  });
3311
3330
  },
3312
- enable3d: z,
3313
- disable3d: B,
3314
- set3dRotation: V,
3315
- benchmark: H,
3316
- getMetrics: U,
3317
- subscribe: W,
3331
+ enable3d: R,
3332
+ disable3d: z,
3333
+ set3dRotation: B,
3334
+ benchmark: V,
3335
+ getMetrics: H,
3336
+ subscribe: U,
3318
3337
  destroy: () => {
3319
3338
  i.terminate(), a.terminate(), s.clear();
3320
3339
  }
3321
3340
  };
3322
3341
  };
3323
3342
  //#endregion
3324
- export { n as COLORMAP_2D_INDEX, t as COLORMAP_2D_NAMES, o as GLASBEY_DARK, s as GLASBEY_LIGHT, l as MAGMA_25, a as OKABE_ITO, c as VIRIDIS_25, x as bitPackIndices, O as computeArcLengths, b as createScatter, I as createScatterWebGL, u as detectBackend, A as interpolateAtPosition, i as packColormap2DLut };
3343
+ export { n as COLORMAP_2D_INDEX, t as COLORMAP_2D_NAMES, o as GLASBEY_DARK, s as GLASBEY_LIGHT, l as MAGMA_25, a as OKABE_ITO, c as VIRIDIS_25, S as bitPackIndices, k as computeArcLengths, x as createScatter, L as createScatterWebGL, u as detectBackend, j as interpolateAtPosition, i as packColormap2DLut };