{"version":3,"file":"wcslight.cjs","mappings":";;;;;;AAAA,kBAAkB,mBAAO,CAAC,GAAY;AACtC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,aAAa;AACb,eAAe;AACf,eAAe;AACf,gBAAgB;;AAEhB;AACA,kBAAe;;;;;;;;;;ACrBF;;AAEb,eAAe,mBAAO,CAAC,GAAU;AACjC,mBAAmB,mBAAO,CAAC,GAAyB;;AAEpD;AACA;AACA;AACA;;AAEA,0BAA0B;AAC1B,gDAAgD,4BAA4B;AAC5E;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,kBAAkB,SAAS;AAC3B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,kBAAkB,SAAS;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,kBAAkB,mBAAmB;AACrC;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA,kBAAkB,mBAAmB;AACrC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,yBAAwB;AACxB;;AAEA;AACA;AACA;AACA;AACA;;AAEA,iCAAiC;;;;;;;;;AChMpB;;AAEb;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,4CAA4C,oBAAoB;AAChE;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA,cAAc,qBAAqB;AACnC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,kDAAkD,iBAAiB;AACnE,mDAAmD,gBAAgB;;AAEnE,oDAAoD,iBAAiB;AACrE,6DAA6D,gBAAgB;;AAE7E,mDAAmD,iBAAiB;AACpE,4DAA4D,gBAAgB;;AAE5E,wDAAwD,sCAAsC;AAC9F,iEAAiE,qCAAqC;;AAEtG;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB,sCAAsC;AAC1D;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAoB,OAAO;AAC3B;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;;;;;;;;AC5La;AACb,YAAY,mBAAO,CAAC,GAAqB;;AAEzC,sBAAsB;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,+CAA+C,qBAAqB;AACpE;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,iCAAiC,+CAA+C;AAChF;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,2BAA2B,uCAAuC;AAClE;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,2BAA2B,2CAA2C;AACtE;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN,6BAA6B,uCAAuC;AACpE;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,2BAA2B,6CAA6C;AACxE;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,+BAA+B,6BAA6B;AAC5D;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,+BAA+B,2CAA2C;AAC1E;;AAEA;AACA;AACA;AACA;;;;;;;;;ACvMa;;AAEb,oBAAoB,mBAAO,CAAC,GAAoB;AAChD,cAAc,mBAAO,CAAC,GAAY;AAClC,aAAa,mBAAO,CAAC,EAAgB;;AAErC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,+BAA+B;AACjD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kBAAkB,+BAA+B;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,CAAC;;;AAGD;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA,cAAc,UAAU;AACxB,cAAc;AACd;AACA;;;;;;;;;;AClMa;;AAEb,mDAAwC;AACxC,2DAAkE;AAClE,iEAA8E;AAC9E,4DAAoE;AACpE,6DAAsE;AACtE,6DAAsE;AACtE,4DAAoE;AACpE,+DAA0E;AAC1E,uDAA0D;;;;;;;;;ACV7C;AACb,iBAAiB,mBAAO,CAAC,GAAU;AACnC,aAAa,mBAAO,CAAC,GAAM;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,gBAAgB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,kBAAkB;AACpC;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,wBAAwB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,QAAQ;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,iBAAiB;AAC5C;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,oBAAoB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,kBAAkB,gBAAgB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,mCAAmC;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,eAAe;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C,oBAAoB,mBAAmB;AACvC;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA,kBAAkB,oBAAoB;AACtC;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA,kBAAkB,oBAAoB;AACtC;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA,8CAA8C;AAC9C;AACA,+BAA+B;AAC/B;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA,+CAA+C,sEAAsE;AACrH;;;;;;;;;;AChxCa;;AAEb,yBAAoB;AACpB;AACA,kBAAkB,iBAAiB;AACnC;AACA;AACA;;AAEA,4BAA4B;AAC5B,yBAAyB;;AAEzB,yBAA6B;AAC7B;AACA;;AAEA,yBAA6B;AAC7B;AACA;;;;;;;;;;AClBA,6C;;;;;;;;ACAA,qC;;;;;;;;;;;;ACAgC;AACzB;AACP;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,+BAA+B,wCAAK;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mC;;;;;;;;;;;;AC1B4C;AACrC;AACP;AACA;AACA,+BAA+B,0DAAQ;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wC;;;;;;;;;;;;;;;;;;;;;;AClBA,MAAM,+BAA4B,qB;;ACAlC,MAAM,6BAA4B,mB;;ACAlC,MAAM,4BAA4B,kB;;;;ACAlC,MAAM,8BAA4B,oB;;ACAlC,MAAM,6BAA4B,mB;;ACAN;AACJ;AACF;AACa;AACT;AACF;;AAExB;;AAEA;AACA,iBAAiB,wCAAe;;AAEhC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,mBAAmB,YAAY;AAC/B;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA,8BAA8B,oBAAoB;AAClD;AACA;AACA;AACA;;AAEA;AACA,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB;AAC3B,UAAU;AACV,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,EAAE;;AAEF;;AAEA;AACA,oBAAoB,2CAAkB;;AAEtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,kFAAkF;AAClF;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG,yBAAyB,kCAAkC;AAC9D;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG,yBAAyB,+BAAM,IAAI;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,qBAAqB,+BAAM;AAC3B;AACA,iHAAiH,UAAU,IAAI,YAAY;AAC3I;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ,GAAG;AACH,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL,+EAA+E,YAAY,UAAU,YAAY;AACjH;AACA,GAAG;AACH,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA,SAAS,kBAAkB;AAC3B,aAAa,kBAAkB;AAC/B,gBAAgB,kBAAkB;AAClC,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB;AAC3B,SAAS;AACT,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,qEAAqE,SAAS;AAC9E;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,uBAAuB,+BAAM;AAC7B;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,oEAAoE,YAAY,QAAQ,eAAe;AACvG,IAAI;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,yEAAyE,WAAW,IAAI,YAAY;AACpG;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA,6CAA6C,YAAY,cAAc,YAAY;AACnF;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,KAAK;AACL;AACA,4EAA4E,WAAW,IAAI,YAAY;AACvG;AACA,GAAG;AACH,EAAE;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,qBAAqB;AACrB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,YAAY,GAAG;AACf,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,qBAAqB,+BAAM;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,qBAAqB;AACrB,GAAG;AACH;AACA,4CAA4C;AAC5C,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA,8BAA8B,WAAW,mBAAmB;AAC5D,GAAG,yBAAyB,+BAAM;AAClC;AACA;AACA;AACA,GAAG;AACH;AACA,qBAAqB;AACrB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,WAAW,KAAK;AAChB;AACA,yBAAyB,MAAM;AAC/B;AACA;;AAEA;AACA,YAAY,MAAM;AAClB;AACA,yBAAyB,OAAO;AAChC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,KAAK;AACjB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,KAAK;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,KAAK;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,KAAK;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,KAAK;AACjB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA,QAAQ,kBAAkB;AAC1B,YAAY,kBAAkB;AAC9B,QAAQ,kBAAkB;AAC1B,WAAW,kBAAkB;AAC7B,QAAQ,kBAAkB;AAC1B,WAAW,kBAAkB;AAC7B,SAAS,kBAAkB;AAC3B,WAAW,kBAAkB;AAC7B,YAAY;AACZ,CAAC;;AAED;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA,EAAE;AACF;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,iBAAiB;;AAE9C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,qBAAqB,0CAAiB;;AAEtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;;AAEA;AACA,QAAQ,kBAAkB;AAC1B,WAAW,kBAAkB;AAC7B,OAAO,kBAAkB;AACzB,eAAe,kBAAkB;AACjC,eAAe,kBAAkB;AACjC,YAAY,kBAAkB;AAC9B,UAAU;AACV,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA,YAAY,gCAAO,IAAI,cAAa;;AAEpC;AACA,kBAAkB,kCAAS;AAC3B,mBAAmB,mCAAU;;AAE7B;AACA;AACA;AACA,YAAY,QAAQ;AACpB,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,mCAAmC,+DAAsC;;AAEzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,iDAAiD;AACjD;AACA;AACA;AACA,KAAK;AACL;AACA,4BAA4B,MAAM;AAClC;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH,iEAAiE;;AAEjE;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA,WAAW,kBAAkB;AAC7B,QAAQ,kBAAkB;AAC1B,YAAY,kBAAkB;AAC9B,aAAa,kBAAkB;AAC/B,UAAU,kBAAkB;AAC5B,WAAW;AACX,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,+CAA+C,wCAAe;AAC9D;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,wBAAwB;AACxB;AACA;AACA;AACA,EAAE;AACF;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,cAAc,gCAAO,IAAI,cAAa;;AAEtC;AACA,sBAAsB,2CAAkB;;AAExC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,YAAY;AACvB,WAAW,YAAY;AACvB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,gDAAgD,8BAAK,GAAG,6BAAI;AAC5D;;AAEA;;AAEA;AACA;AACA;AACA,+CAA+C,wCAAe;AAC9D;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,kDAAkD,YAAY;AAC9D;AACA,KAAK;AACL,IAAI;AACJ;;AAEA;AACA,uCAAuC,aAAa,kBAAkB,YAAY;;AAElF;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,IAAI;AACJ;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,oFAAoF,SAAS;AAC7F;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,sGAAsG,YAAY;AAClH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,6DAA6D,YAAY;AACzE;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,0CAAiB;AAC5B,iBAAiB,0CAAiB;AAClC;;AAEA;AACA;AACA,qBAAqB,0CAAiB;AACtC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,2CAAkB;AACzC,OAAO;AACP,uBAAuB,8CAAqB;AAC5C;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA,iCAAiC,oDAA2B;AAC5D,qBAAqB,oDAA2B;AAChD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA,EAAE;AACF;AACA;AACA;;AAEA;AACA;AACA,EAAE;;AAEF;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,EAAE;AACF;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,0CAAe,KAAK,EAAC;AACyC;;;;;;;;;;;;;;;UC9uD9D;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;;WCtBA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,2CAA2C,0CAA0C;WACrF,MAAM;WACN,2CAA2C,gCAAgC;WAC3E;WACA,KAAK,yBAAyB;WAC9B;WACA,GAAG;WACH;WACA;WACA,0CAA0C,wCAAwC;WAClF;WACA;WACA;WACA,E;;;;;WCtBA,wF;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D,E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACNA,MAAM,2BAA4B,iB;;ACA3B;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,YAAY;AAChE;AACA;AACA,2BAA2B,eAAe;AAC1C,gCAAgC,KAAK;AACrC;AACA;AACA,qDAAqD,KAAK;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,QAAQ;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,uBAAuB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA,gDAAgD,KAAK,0BAA0B,MAAM;AACrF;AACA,wBAAwB,iCAAiC;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA,wBAAwB,wCAAwC;AAChE;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,QAAQ;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4C;;ACzLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACyB;AACgC;AAClD;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,gBAAgB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,gBAAgB;AAC5C;AACA;AACA;AACA,oCAAoC,oBAAoB;AACxD,sCAAsC,mBAAmB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,YAAY;AACpC,oDAAoD,EAAE;AACtD;AACA;AACA;AACA;AACA,2CAA2C,aAAa,oCAAoC,kBAAkB,UAAU,OAAO,UAAU,MAAM;AAC/I;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,yCAAgB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,yCAAgB;AACxB;AACA;AACA,sC;;AC/HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0C;;AC3BqD;AAC9C;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,cAAc;AAC1C,4BAA4B,cAAc;AAC1C,4BAA4B,cAAc;AAC1C,4BAA4B,cAAc;AAC1C,4BAA4B,cAAc;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kFAAkF,MAAM;AACxF;AACA,kBAAkB,OAAO,EAAE,MAAM;AACjC;AACA;AACA;AACA,mFAAmF,KAAK;AACxF;AACA,uBAAuB,KAAK;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6C;;AC1GA,YAAY,aAAa;AACkC;AACM;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,sDAAsD;AAC7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,iBAAiB;AAC5C,uCAAuC,qCAAqC;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,cAAc;AAC5C;AACA;AACA;AACA;AACA,uC;;AC1EiE;AAClB;AACxC;AACP;AACA,sBAAsB,WAAW,0BAA0B,iBAAiB;AAC5E;AACA;AACA;AACA;AACA,yDAAyD,MAAM;AAC/D;AACA;AACA,2BAA2B,eAAe;AAC1C,yBAAyB,WAAW,0BAA0B,iBAAiB;AAC/E;AACA,wCAAwC,MAAM;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0C;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC2D;AACM;AAClB;AACM;AAC9C;AACP;AACA;AACA;AACA,8DAA8D,OAAO;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,OAAO;AACnE;AACA;AACA;AACA;AACA;AACA,kEAAkE,OAAO;AACzE;AACA;AACA;AACA,uBAAuB,WAAW,0BAA0B,iBAAiB;AAC7E;AACA;AACA;AACA;AACA,sBAAsB,cAAc;AACpC;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,iBAAiB;AAC7D,4CAA4C,iBAAiB;AAC7D;AACA;AACA;AACA;AACA,sCAAsC,cAAc,CAAC,iBAAiB;AACtE;AACA;AACA,sCAAsC,cAAc,CAAC,iBAAiB;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,oBAAoB;AACvE,8CAA8C,OAAO;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,WAAW;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,WAAW;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,WAAW;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,WAAW;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,WAAW;AAC3C;AACA;AACA;AACA;AACA;AACA,kEAAkE,OAAO;AACzE;AACA;AACA;AACA,uBAAuB,WAAW,0BAA0B,iBAAiB;AAC7E;AACA;AACA;AACA;AACA,sBAAsB,cAAc;AACpC,2BAA2B,cAAc;AACzC;AACA;AACA;AACA,sBAAsB,WAAW,0BAA0B,iBAAiB;AAC5E,sBAAsB,WAAW,0BAA0B,iBAAiB;AAC5E,uBAAuB,WAAW,0BAA0B,iBAAiB;AAC7E;AACA;AACA;AACA,mEAAmE,eAAe;AAClF,4BAA4B,mBAAmB;AAC/C;AACA;AACA;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wC;;AChMO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mC;;ACZuC;AAChC,uBAAuB,OAAO;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oC;;ACtByC;AAClC,yBAAyB,QAAQ;AACxC;AACA;AACA;AACA;AACA;AACA,sC;;ACP6C;AACtC;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,UAAU;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oC;;AC1BuC;AAChC,6BAA6B,OAAO;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,SAAS;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,YAAY;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,YAAY;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,YAAY;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,YAAY;AAC5C;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA,gCAAgC,YAAY;AAC5C;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE,sBAAsB;AAC3F;AACA;AACA;AACA;AACA,wBAAwB,YAAY;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,OAAO;AACpE;AACA;AACA;AACA;AACA;AACA,gDAAgD,OAAO;AACvD;AACA;AACA;AACA;AACA,0C;;AChJO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,OAAO;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uEAAuE,KAAK;AAC5E;AACA;AACA;AACA,gD;;AC9CuC;AAChC,4BAA4B,OAAO;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,SAAS;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,OAAO;AACpE;AACA;AACA;AACA;AACA;AACA,mDAAmD,OAAO;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wEAAwE,gBAAgB;AACxF;AACA;AACA;AACA;AACA;AACA;AACA,yC;;ACtFO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yEAAyE,OAAO;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE,MAAM;AAC3E;AACA;AACA;AACA;AACA,yCAAyC,QAAQ;AACjD;AACA;AACA;AACA,qCAAqC,QAAQ;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+C;;AC9C6C;AACI;AACF;AACkB;AAClB;AACI;AACE;AACN;AACY;AACM;AACR;AACM;AACxD;AACP;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,cAAc;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,QAAQ;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,WAAW;AACtC,qCAAqC,WAAW;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,SAAS;AACrE,wCAAwC,gBAAgB;AACxD,yCAAyC,WAAW;AACpD,+BAA+B,iCAAiC;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE,SAAS;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE,SAAS;AAC5E,wCAAwC,gBAAgB;AACxD,yCAAyC,WAAW;AACpD,+BAA+B,iCAAiC;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E,SAAS;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,WAAW,eAAe,WAAW;AAC5E;AACA;AACA,6BAA6B,wBAAwB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,WAAW,gCAAgC,iBAAiB;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAY;AAC3B;AACA,uBAAuB,WAAW,+BAA+B,iBAAiB;AAClF;AACA;AACA;AACA,sBAAsB,cAAc;AACpC,0BAA0B,YAAY;AACtC;AACA,uBAAuB,UAAU;AACjC;AACA,mBAAmB,QAAQ;AAC3B;AACA;AACA,uBAAuB,WAAW,0BAA0B,iBAAiB;AAC7E;AACA;AACA;AACA,QAAQ,YAAY;AACpB,sBAAsB,cAAc;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,WAAW,0BAA0B,iBAAiB;AACpF,yBAAyB,WAAW,0BAA0B,iBAAiB;AAC/E,uBAAuB,WAAW,0BAA0B,iBAAiB;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,WAAW,0BAA0B,iBAAiB;AACjF;AACA;AACA;AACA;AACA;AACA,4BAA4B,qBAAqB;AACjD,0BAA0B,WAAW,gCAAgC,iBAAiB;AACtF;AACA,gDAAgD,MAAM;AACtD;AACA,2BAA2B,oBAAoB;AAC/C,yBAAyB,WAAW,gCAAgC,iBAAiB;AACrF,yBAAyB,WAAW,gCAAgC,iBAAiB;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,WAAW,0BAA0B,iBAAiB;AAC7E,sBAAsB,WAAW,0BAA0B,iBAAiB;AAC5E,2BAA2B,WAAW,0BAA0B,iBAAiB;AACjF,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,WAAW,0BAA0B,iBAAiB;AACpF,yBAAyB,WAAW,0BAA0B,iBAAiB;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,kBAAkB;AACzE,8BAA8B,cAAc;AAC5C;AACA,mBAAmB,cAAc;AACjC;AACA;AACA,8BAA8B,WAAW,0BAA0B,iBAAiB;AACpF,yBAAyB,WAAW,0BAA0B,iBAAiB;AAC/E;AACA;AACA;AACA;AACA,0DAA0D,cAAc;AACxE;AACA;AACA,0DAA0D,SAAS;AACnE;AACA,uBAAuB,WAAW,0BAA0B,iBAAiB;AAC7E;AACA,uEAAuE,OAAO;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,WAAW,0BAA0B,iBAAiB;AACjF;AACA;AACA;AACA;AACA,2DAA2D,WAAW;AACtE;AACA;AACA,4BAA4B,qBAAqB;AACjD,0BAA0B,WAAW,gCAAgC,iBAAiB;AACtF;AACA,gDAAgD,MAAM;AACtD;AACA,0BAA0B,WAAW,0BAA0B,iBAAiB;AAChF;AACA,gDAAgD,MAAM;AACtD;AACA;AACA,gDAAgD,MAAM,GAAG,MAAM;AAC/D;AACA,2BAA2B,mBAAmB;AAC9C,yBAAyB,WAAW,gCAAgC,iBAAiB;AACrF,yBAA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AAC,CAAC;QAChD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF;;;AClZM;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACpCiC;AAC1B;AACP;AACA;AACA;AACA;AACA,6BAA6B,IAAI;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,IAAI;AACvB;AACA;AACA;AACA;AACA;AACA;;;ACzBO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,sBAAsB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;;;AClByC;AACA;AACR;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,qBAAqB;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,oBAAY;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,SAAS;AACzB;AACA,mBAAmB,QAAQ;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,eAAe;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,eAAe;AAC/B;AACA;AACA;AACA;AACA;AACA,4BAA4B,cAAc;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uEAAuE;AACvE;AACA;AACA;AACA,gBAAgB,eAAe;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,uBAAuB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,QAAQ;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,mBAAmB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,WAAW;AACvC,yBAAyB,uBAAuB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,QAAQ;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,mBAAmB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,4BAA4B,WAAW;AACvC,yBAAyB,uBAAuB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,0CAA0C;AAChF;AACA,wCAAwC,kBAAkB;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,eAAe;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ,oBAAY;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,IAAI;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,kCAAkC;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,4BAA4B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,4BAA4B;AAClD;AACA;AACA;AACA;AACA,SAAS,oBAAY;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,IAAI;AACpC;AACA;AACA,2BAA2B,IAAI;AAC/B;AACA;AACA;AACA,wBAAwB,YAAY;AACpC,qBAAqB,4CAA4C;AACjE;AACA;AACA;AACA,eAAe,IAAI;AACnB;AACA;AACA,eAAe,IAAI;AACnB;AACA;AACA,eAAe,IAAI;AACnB;AACA;AACA,eAAe,IAAI;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA,eAAe,oBAAoB;AACnC;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,wBAAwB,WAAW;AACnC;AACA,eAAe,oBAAoB;AACnC;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,wBAAwB,YAAY;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;;AC5qByC;AACR;AAC1B;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,QAAQ;AAC3B;AACA;AACA;AACA,mBAAmB,IAAI;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC1CuC;AACJ;AACM;AACA;AACR;;;ACJ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","sources":["webpack://wcslight/./node_modules/cross-fetch/dist/node-ponyfill.js","webpack://wcslight/./node_modules/tr46/index.js","webpack://wcslight/./node_modules/webidl-conversions/lib/index.js","webpack://wcslight/./node_modules/whatwg-url/lib/URL-impl.js","webpack://wcslight/./node_modules/whatwg-url/lib/URL.js","webpack://wcslight/./node_modules/whatwg-url/lib/public-api.js","webpack://wcslight/./node_modules/whatwg-url/lib/url-state-machine.js","webpack://wcslight/./node_modules/whatwg-url/lib/utils.js","webpack://wcslight/external node-commonjs \"node:fs/promises\"","webpack://wcslight/external node-commonjs \"punycode\"","webpack://wcslight/./node_modules/jsfitsio/lib-esm/getFile.js","webpack://wcslight/./node_modules/jsfitsio/lib-esm/getLocalFile.js","webpack://wcslight/external node-commonjs \"stream\"","webpack://wcslight/external node-commonjs \"http\"","webpack://wcslight/external node-commonjs \"url\"","webpack://wcslight/external node-commonjs \"https\"","webpack://wcslight/external node-commonjs \"zlib\"","webpack://wcslight/./node_modules/node-fetch/lib/index.mjs","webpack://wcslight/webpack/bootstrap","webpack://wcslight/webpack/runtime/define property getters","webpack://wcslight/webpack/runtime/hasOwnProperty shorthand","webpack://wcslight/webpack/runtime/make namespace object","webpack://wcslight/external node-commonjs \"fs\"","webpack://wcslight/./node_modules/jsfitsio/lib-esm/FITSHeaderWriter.js","webpack://wcslight/./node_modules/jsfitsio/lib-esm/FITSWriter.js","webpack://wcslight/./node_modules/jsfitsio/lib-esm/model/FITSHeaderItem.js","webpack://wcslight/./node_modules/jsfitsio/lib-esm/model/FITSHeaderManager.js","webpack://wcslight/./node_modules/jsfitsio/lib-esm/ParseHeader.js","webpack://wcslight/./node_modules/jsfitsio/lib-esm/FITSImageUtils.js","webpack://wcslight/./node_modules/jsfitsio/lib-esm/ParsePayload.js","webpack://wcslight/./node_modules/jsfitsio/lib-esm/model/FITSHDU.js","webpack://wcslight/./node_modules/jsfitsio/lib-esm/model/ImageHDU.js","webpack://wcslight/./node_modules/jsfitsio/lib-esm/model/PrimaryHDU.js","webpack://wcslight/./node_modules/jsfitsio/lib-esm/model/FITSFile.js","webpack://wcslight/./node_modules/jsfitsio/lib-esm/model/BinaryTableHDU.js","webpack://wcslight/./node_modules/jsfitsio/lib-esm/FITSBinaryTableUtils.js","webpack://wcslight/./node_modules/jsfitsio/lib-esm/model/AsciiTableHDU.js","webpack://wcslight/./node_modules/jsfitsio/lib-esm/FITSAsciiTableUtils.js","webpack://wcslight/./node_modules/jsfitsio/lib-esm/FITSParser.js","webpack://wcslight/./src/utils/FITSWriterAdapter.ts","webpack://wcslight/./src/projections/AbstractProjection.ts","webpack://wcslight/./src/model/NumberType.ts","webpack://wcslight/./src/model/Utils.ts","webpack://wcslight/./src/model/CoordsType.ts","webpack://wcslight/./src/Config.ts","webpack://wcslight/./src/model/Point.ts","webpack://wcslight/./src/projections/MinMaxValue.ts","webpack://wcslight/./src/projections/RADecMinMaxCentral.ts","webpack://wcslight/./src/projections/hips/TilesRaDecList2.ts","webpack://wcslight/./src/projections/hips/ImagePixel.ts","webpack://wcslight/./src/model/FITS.ts","webpack://wcslight/./src/utils/FITSUtils.ts","webpack://wcslight/./src/projections/cartesian/CartesianProjection.ts","webpack://wcslight/./node_modules/astrospatial-core/lib-esm/healpix/vec3.js","webpack://wcslight/./node_modules/astrospatial-core/lib-esm/healpix/pointing.js","webpack://wcslight/./node_modules/astrospatial-core/lib-esm/healpix/rangeset.js","webpack://wcslight/./node_modules/astrospatial-core/lib-esm/healpix/healpix.js","webpack://wcslight/./node_modules/astrospatial-core/lib-esm/healpix/hploc.js","webpack://wcslight/./node_modules/astrospatial-core/lib-esm/healpix/index.js","webpack://wcslight/./src/projections/hips/HiPSIntermediateProj.ts","webpack://wcslight/./src/projections/HiPSHelper.ts","webpack://wcslight/./src/projections/hips/HiPSProperties.ts","webpack://wcslight/./src/projections/hips/HiPSFITS.ts","webpack://wcslight/./src/projections/hips/FITSList.ts","webpack://wcslight/./src/projections/hips/HiPSPropManager.ts","webpack://wcslight/./src/projections/hips/HiPSProjection.ts","webpack://wcslight/./src/projections/hips/CutoutResult.ts","webpack://wcslight/./src/projections/mercator/MercatorProjection.ts","webpack://wcslight/./src/projections/sin/SinProjection.ts","webpack://wcslight/./src/projections/aitoff/AitoffProjection.ts","webpack://wcslight/./src/WCSLight.ts","webpack://wcslight/./src/model/ImagePixel.ts","webpack://wcslight/./src/index.ts"],"sourcesContent":["const nodeFetch = require('node-fetch')\nconst realFetch = nodeFetch.default || nodeFetch\n\nconst fetch = function (url, options) {\n  // Support schemaless URIs on the server for parity with the browser.\n  // Ex: //github.com/ -> https://github.com/\n  if (/^\\/\\//.test(url)) {\n    url = 'https:' + url\n  }\n  return realFetch.call(this, url, options)\n}\n\nfetch.ponyfill = true\n\nmodule.exports = exports = fetch\nexports.fetch = fetch\nexports.Headers = nodeFetch.Headers\nexports.Request = nodeFetch.Request\nexports.Response = nodeFetch.Response\n\n// Needed for TypeScript consumers without esModuleInterop.\nexports.default = fetch\n","\"use strict\";\n\nvar punycode = require(\"punycode\");\nvar mappingTable = require(\"./lib/mappingTable.json\");\n\nvar PROCESSING_OPTIONS = {\n  TRANSITIONAL: 0,\n  NONTRANSITIONAL: 1\n};\n\nfunction normalize(str) { // fix bug in v8\n  return str.split('\\u0000').map(function (s) { return s.normalize('NFC'); }).join('\\u0000');\n}\n\nfunction findStatus(val) {\n  var start = 0;\n  var end = mappingTable.length - 1;\n\n  while (start <= end) {\n    var mid = Math.floor((start + end) / 2);\n\n    var target = mappingTable[mid];\n    if (target[0][0] <= val && target[0][1] >= val) {\n      return target;\n    } else if (target[0][0] > val) {\n      end = mid - 1;\n    } else {\n      start = mid + 1;\n    }\n  }\n\n  return null;\n}\n\nvar regexAstralSymbols = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g;\n\nfunction countSymbols(string) {\n  return string\n    // replace every surrogate pair with a BMP symbol\n    .replace(regexAstralSymbols, '_')\n    // then get the length\n    .length;\n}\n\nfunction mapChars(domain_name, useSTD3, processing_option) {\n  var hasError = false;\n  var processed = \"\";\n\n  var len = countSymbols(domain_name);\n  for (var i = 0; i < len; ++i) {\n    var codePoint = domain_name.codePointAt(i);\n    var status = findStatus(codePoint);\n\n    switch (status[1]) {\n      case \"disallowed\":\n        hasError = true;\n        processed += String.fromCodePoint(codePoint);\n        break;\n      case \"ignored\":\n        break;\n      case \"mapped\":\n        processed += String.fromCodePoint.apply(String, status[2]);\n        break;\n      case \"deviation\":\n        if (processing_option === PROCESSING_OPTIONS.TRANSITIONAL) {\n          processed += String.fromCodePoint.apply(String, status[2]);\n        } else {\n          processed += String.fromCodePoint(codePoint);\n        }\n        break;\n      case \"valid\":\n        processed += String.fromCodePoint(codePoint);\n        break;\n      case \"disallowed_STD3_mapped\":\n        if (useSTD3) {\n          hasError = true;\n          processed += String.fromCodePoint(codePoint);\n        } else {\n          processed += String.fromCodePoint.apply(String, status[2]);\n        }\n        break;\n      case \"disallowed_STD3_valid\":\n        if (useSTD3) {\n          hasError = true;\n        }\n\n        processed += String.fromCodePoint(codePoint);\n        break;\n    }\n  }\n\n  return {\n    string: processed,\n    error: hasError\n  };\n}\n\nvar combiningMarksRegex = /[\\u0300-\\u036F\\u0483-\\u0489\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u08E4-\\u0903\\u093A-\\u093C\\u093E-\\u094F\\u0951-\\u0957\\u0962\\u0963\\u0981-\\u0983\\u09BC\\u09BE-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CD\\u09D7\\u09E2\\u09E3\\u0A01-\\u0A03\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81-\\u0A83\\u0ABC\\u0ABE-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AE2\\u0AE3\\u0B01-\\u0B03\\u0B3C\\u0B3E-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B62\\u0B63\\u0B82\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD7\\u0C00-\\u0C03\\u0C3E-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0C81-\\u0C83\\u0CBC\\u0CBE-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CE2\\u0CE3\\u0D01-\\u0D03\\u0D3E-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4D\\u0D57\\u0D62\\u0D63\\u0D82\\u0D83\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F3E\\u0F3F\\u0F71-\\u0F84\\u0F86\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102B-\\u103E\\u1056-\\u1059\\u105E-\\u1060\\u1062-\\u1064\\u1067-\\u106D\\u1071-\\u1074\\u1082-\\u108D\\u108F\\u109A-\\u109D\\u135D-\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B4-\\u17D3\\u17DD\\u180B-\\u180D\\u18A9\\u1920-\\u192B\\u1930-\\u193B\\u19B0-\\u19C0\\u19C8\\u19C9\\u1A17-\\u1A1B\\u1A55-\\u1A5E\\u1A60-\\u1A7C\\u1A7F\\u1AB0-\\u1ABE\\u1B00-\\u1B04\\u1B34-\\u1B44\\u1B6B-\\u1B73\\u1B80-\\u1B82\\u1BA1-\\u1BAD\\u1BE6-\\u1BF3\\u1C24-\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE8\\u1CED\\u1CF2-\\u1CF4\\u1CF8\\u1CF9\\u1DC0-\\u1DF5\\u1DFC-\\u1DFF\\u20D0-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F-\\uA672\\uA674-\\uA67D\\uA69F\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA823-\\uA827\\uA880\\uA881\\uA8B4-\\uA8C4\\uA8E0-\\uA8F1\\uA926-\\uA92D\\uA947-\\uA953\\uA980-\\uA983\\uA9B3-\\uA9C0\\uA9E5\\uAA29-\\uAA36\\uAA43\\uAA4C\\uAA4D\\uAA7B-\\uAA7D\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uAAEB-\\uAAEF\\uAAF5\\uAAF6\\uABE3-\\uABEA\\uABEC\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE2D]|\\uD800[\\uDDFD\\uDEE0\\uDF76-\\uDF7A]|\\uD802[\\uDE01-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE0F\\uDE38-\\uDE3A\\uDE3F\\uDEE5\\uDEE6]|\\uD804[\\uDC00-\\uDC02\\uDC38-\\uDC46\\uDC7F-\\uDC82\\uDCB0-\\uDCBA\\uDD00-\\uDD02\\uDD27-\\uDD34\\uDD73\\uDD80-\\uDD82\\uDDB3-\\uDDC0\\uDE2C-\\uDE37\\uDEDF-\\uDEEA\\uDF01-\\uDF03\\uDF3C\\uDF3E-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF57\\uDF62\\uDF63\\uDF66-\\uDF6C\\uDF70-\\uDF74]|\\uD805[\\uDCB0-\\uDCC3\\uDDAF-\\uDDB5\\uDDB8-\\uDDC0\\uDE30-\\uDE40\\uDEAB-\\uDEB7]|\\uD81A[\\uDEF0-\\uDEF4\\uDF30-\\uDF36]|\\uD81B[\\uDF51-\\uDF7E\\uDF8F-\\uDF92]|\\uD82F[\\uDC9D\\uDC9E]|\\uD834[\\uDD65-\\uDD69\\uDD6D-\\uDD72\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD\\uDE42-\\uDE44]|\\uD83A[\\uDCD0-\\uDCD6]|\\uDB40[\\uDD00-\\uDDEF]/;\n\nfunction validateLabel(label, processing_option) {\n  if (label.substr(0, 4) === \"xn--\") {\n    label = punycode.toUnicode(label);\n    processing_option = PROCESSING_OPTIONS.NONTRANSITIONAL;\n  }\n\n  var error = false;\n\n  if (normalize(label) !== label ||\n      (label[3] === \"-\" && label[4] === \"-\") ||\n      label[0] === \"-\" || label[label.length - 1] === \"-\" ||\n      label.indexOf(\".\") !== -1 ||\n      label.search(combiningMarksRegex) === 0) {\n    error = true;\n  }\n\n  var len = countSymbols(label);\n  for (var i = 0; i < len; ++i) {\n    var status = findStatus(label.codePointAt(i));\n    if ((processing === PROCESSING_OPTIONS.TRANSITIONAL && status[1] !== \"valid\") ||\n        (processing === PROCESSING_OPTIONS.NONTRANSITIONAL &&\n         status[1] !== \"valid\" && status[1] !== \"deviation\")) {\n      error = true;\n      break;\n    }\n  }\n\n  return {\n    label: label,\n    error: error\n  };\n}\n\nfunction processing(domain_name, useSTD3, processing_option) {\n  var result = mapChars(domain_name, useSTD3, processing_option);\n  result.string = normalize(result.string);\n\n  var labels = result.string.split(\".\");\n  for (var i = 0; i < labels.length; ++i) {\n    try {\n      var validation = validateLabel(labels[i]);\n      labels[i] = validation.label;\n      result.error = result.error || validation.error;\n    } catch(e) {\n      result.error = true;\n    }\n  }\n\n  return {\n    string: labels.join(\".\"),\n    error: result.error\n  };\n}\n\nmodule.exports.toASCII = function(domain_name, useSTD3, processing_option, verifyDnsLength) {\n  var result = processing(domain_name, useSTD3, processing_option);\n  var labels = result.string.split(\".\");\n  labels = labels.map(function(l) {\n    try {\n      return punycode.toASCII(l);\n    } catch(e) {\n      result.error = true;\n      return l;\n    }\n  });\n\n  if (verifyDnsLength) {\n    var total = labels.slice(0, labels.length - 1).join(\".\").length;\n    if (total.length > 253 || total.length === 0) {\n      result.error = true;\n    }\n\n    for (var i=0; i < labels.length; ++i) {\n      if (labels.length > 63 || labels.length === 0) {\n        result.error = true;\n        break;\n      }\n    }\n  }\n\n  if (result.error) return null;\n  return labels.join(\".\");\n};\n\nmodule.exports.toUnicode = function(domain_name, useSTD3) {\n  var result = processing(domain_name, useSTD3, PROCESSING_OPTIONS.NONTRANSITIONAL);\n\n  return {\n    domain: result.string,\n    error: result.error\n  };\n};\n\nmodule.exports.PROCESSING_OPTIONS = PROCESSING_OPTIONS;\n","\"use strict\";\n\nvar conversions = {};\nmodule.exports = conversions;\n\nfunction sign(x) {\n    return x < 0 ? -1 : 1;\n}\n\nfunction evenRound(x) {\n    // Round x to the nearest integer, choosing the even integer if it lies halfway between two.\n    if ((x % 1) === 0.5 && (x & 1) === 0) { // [even number].5; round down (i.e. floor)\n        return Math.floor(x);\n    } else {\n        return Math.round(x);\n    }\n}\n\nfunction createNumberConversion(bitLength, typeOpts) {\n    if (!typeOpts.unsigned) {\n        --bitLength;\n    }\n    const lowerBound = typeOpts.unsigned ? 0 : -Math.pow(2, bitLength);\n    const upperBound = Math.pow(2, bitLength) - 1;\n\n    const moduloVal = typeOpts.moduloBitLength ? Math.pow(2, typeOpts.moduloBitLength) : Math.pow(2, bitLength);\n    const moduloBound = typeOpts.moduloBitLength ? Math.pow(2, typeOpts.moduloBitLength - 1) : Math.pow(2, bitLength - 1);\n\n    return function(V, opts) {\n        if (!opts) opts = {};\n\n        let x = +V;\n\n        if (opts.enforceRange) {\n            if (!Number.isFinite(x)) {\n                throw new TypeError(\"Argument is not a finite number\");\n            }\n\n            x = sign(x) * Math.floor(Math.abs(x));\n            if (x < lowerBound || x > upperBound) {\n                throw new TypeError(\"Argument is not in byte range\");\n            }\n\n            return x;\n        }\n\n        if (!isNaN(x) && opts.clamp) {\n            x = evenRound(x);\n\n            if (x < lowerBound) x = lowerBound;\n            if (x > upperBound) x = upperBound;\n            return x;\n        }\n\n        if (!Number.isFinite(x) || x === 0) {\n            return 0;\n        }\n\n        x = sign(x) * Math.floor(Math.abs(x));\n        x = x % moduloVal;\n\n        if (!typeOpts.unsigned && x >= moduloBound) {\n            return x - moduloVal;\n        } else if (typeOpts.unsigned) {\n            if (x < 0) {\n              x += moduloVal;\n            } else if (x === -0) { // don't return negative zero\n              return 0;\n            }\n        }\n\n        return x;\n    }\n}\n\nconversions[\"void\"] = function () {\n    return undefined;\n};\n\nconversions[\"boolean\"] = function (val) {\n    return !!val;\n};\n\nconversions[\"byte\"] = createNumberConversion(8, { unsigned: false });\nconversions[\"octet\"] = createNumberConversion(8, { unsigned: true });\n\nconversions[\"short\"] = createNumberConversion(16, { unsigned: false });\nconversions[\"unsigned short\"] = createNumberConversion(16, { unsigned: true });\n\nconversions[\"long\"] = createNumberConversion(32, { unsigned: false });\nconversions[\"unsigned long\"] = createNumberConversion(32, { unsigned: true });\n\nconversions[\"long long\"] = createNumberConversion(32, { unsigned: false, moduloBitLength: 64 });\nconversions[\"unsigned long long\"] = createNumberConversion(32, { unsigned: true, moduloBitLength: 64 });\n\nconversions[\"double\"] = function (V) {\n    const x = +V;\n\n    if (!Number.isFinite(x)) {\n        throw new TypeError(\"Argument is not a finite floating-point value\");\n    }\n\n    return x;\n};\n\nconversions[\"unrestricted double\"] = function (V) {\n    const x = +V;\n\n    if (isNaN(x)) {\n        throw new TypeError(\"Argument is NaN\");\n    }\n\n    return x;\n};\n\n// not quite valid, but good enough for JS\nconversions[\"float\"] = conversions[\"double\"];\nconversions[\"unrestricted float\"] = conversions[\"unrestricted double\"];\n\nconversions[\"DOMString\"] = function (V, opts) {\n    if (!opts) opts = {};\n\n    if (opts.treatNullAsEmptyString && V === null) {\n        return \"\";\n    }\n\n    return String(V);\n};\n\nconversions[\"ByteString\"] = function (V, opts) {\n    const x = String(V);\n    let c = undefined;\n    for (let i = 0; (c = x.codePointAt(i)) !== undefined; ++i) {\n        if (c > 255) {\n            throw new TypeError(\"Argument is not a valid bytestring\");\n        }\n    }\n\n    return x;\n};\n\nconversions[\"USVString\"] = function (V) {\n    const S = String(V);\n    const n = S.length;\n    const U = [];\n    for (let i = 0; i < n; ++i) {\n        const c = S.charCodeAt(i);\n        if (c < 0xD800 || c > 0xDFFF) {\n            U.push(String.fromCodePoint(c));\n        } else if (0xDC00 <= c && c <= 0xDFFF) {\n            U.push(String.fromCodePoint(0xFFFD));\n        } else {\n            if (i === n - 1) {\n                U.push(String.fromCodePoint(0xFFFD));\n            } else {\n                const d = S.charCodeAt(i + 1);\n                if (0xDC00 <= d && d <= 0xDFFF) {\n                    const a = c & 0x3FF;\n                    const b = d & 0x3FF;\n                    U.push(String.fromCodePoint((2 << 15) + (2 << 9) * a + b));\n                    ++i;\n                } else {\n                    U.push(String.fromCodePoint(0xFFFD));\n                }\n            }\n        }\n    }\n\n    return U.join('');\n};\n\nconversions[\"Date\"] = function (V, opts) {\n    if (!(V instanceof Date)) {\n        throw new TypeError(\"Argument is not a Date object\");\n    }\n    if (isNaN(V)) {\n        return undefined;\n    }\n\n    return V;\n};\n\nconversions[\"RegExp\"] = function (V, opts) {\n    if (!(V instanceof RegExp)) {\n        V = new RegExp(V);\n    }\n\n    return V;\n};\n","\"use strict\";\nconst usm = require(\"./url-state-machine\");\n\nexports.implementation = class URLImpl {\n  constructor(constructorArgs) {\n    const url = constructorArgs[0];\n    const base = constructorArgs[1];\n\n    let parsedBase = null;\n    if (base !== undefined) {\n      parsedBase = usm.basicURLParse(base);\n      if (parsedBase === \"failure\") {\n        throw new TypeError(\"Invalid base URL\");\n      }\n    }\n\n    const parsedURL = usm.basicURLParse(url, { baseURL: parsedBase });\n    if (parsedURL === \"failure\") {\n      throw new TypeError(\"Invalid URL\");\n    }\n\n    this._url = parsedURL;\n\n    // TODO: query stuff\n  }\n\n  get href() {\n    return usm.serializeURL(this._url);\n  }\n\n  set href(v) {\n    const parsedURL = usm.basicURLParse(v);\n    if (parsedURL === \"failure\") {\n      throw new TypeError(\"Invalid URL\");\n    }\n\n    this._url = parsedURL;\n  }\n\n  get origin() {\n    return usm.serializeURLOrigin(this._url);\n  }\n\n  get protocol() {\n    return this._url.scheme + \":\";\n  }\n\n  set protocol(v) {\n    usm.basicURLParse(v + \":\", { url: this._url, stateOverride: \"scheme start\" });\n  }\n\n  get username() {\n    return this._url.username;\n  }\n\n  set username(v) {\n    if (usm.cannotHaveAUsernamePasswordPort(this._url)) {\n      return;\n    }\n\n    usm.setTheUsername(this._url, v);\n  }\n\n  get password() {\n    return this._url.password;\n  }\n\n  set password(v) {\n    if (usm.cannotHaveAUsernamePasswordPort(this._url)) {\n      return;\n    }\n\n    usm.setThePassword(this._url, v);\n  }\n\n  get host() {\n    const url = this._url;\n\n    if (url.host === null) {\n      return \"\";\n    }\n\n    if (url.port === null) {\n      return usm.serializeHost(url.host);\n    }\n\n    return usm.serializeHost(url.host) + \":\" + usm.serializeInteger(url.port);\n  }\n\n  set host(v) {\n    if (this._url.cannotBeABaseURL) {\n      return;\n    }\n\n    usm.basicURLParse(v, { url: this._url, stateOverride: \"host\" });\n  }\n\n  get hostname() {\n    if (this._url.host === null) {\n      return \"\";\n    }\n\n    return usm.serializeHost(this._url.host);\n  }\n\n  set hostname(v) {\n    if (this._url.cannotBeABaseURL) {\n      return;\n    }\n\n    usm.basicURLParse(v, { url: this._url, stateOverride: \"hostname\" });\n  }\n\n  get port() {\n    if (this._url.port === null) {\n      return \"\";\n    }\n\n    return usm.serializeInteger(this._url.port);\n  }\n\n  set port(v) {\n    if (usm.cannotHaveAUsernamePasswordPort(this._url)) {\n      return;\n    }\n\n    if (v === \"\") {\n      this._url.port = null;\n    } else {\n      usm.basicURLParse(v, { url: this._url, stateOverride: \"port\" });\n    }\n  }\n\n  get pathname() {\n    if (this._url.cannotBeABaseURL) {\n      return this._url.path[0];\n    }\n\n    if (this._url.path.length === 0) {\n      return \"\";\n    }\n\n    return \"/\" + this._url.path.join(\"/\");\n  }\n\n  set pathname(v) {\n    if (this._url.cannotBeABaseURL) {\n      return;\n    }\n\n    this._url.path = [];\n    usm.basicURLParse(v, { url: this._url, stateOverride: \"path start\" });\n  }\n\n  get search() {\n    if (this._url.query === null || this._url.query === \"\") {\n      return \"\";\n    }\n\n    return \"?\" + this._url.query;\n  }\n\n  set search(v) {\n    // TODO: query stuff\n\n    const url = this._url;\n\n    if (v === \"\") {\n      url.query = null;\n      return;\n    }\n\n    const input = v[0] === \"?\" ? v.substring(1) : v;\n    url.query = \"\";\n    usm.basicURLParse(input, { url, stateOverride: \"query\" });\n  }\n\n  get hash() {\n    if (this._url.fragment === null || this._url.fragment === \"\") {\n      return \"\";\n    }\n\n    return \"#\" + this._url.fragment;\n  }\n\n  set hash(v) {\n    if (v === \"\") {\n      this._url.fragment = null;\n      return;\n    }\n\n    const input = v[0] === \"#\" ? v.substring(1) : v;\n    this._url.fragment = \"\";\n    usm.basicURLParse(input, { url: this._url, stateOverride: \"fragment\" });\n  }\n\n  toJSON() {\n    return this.href;\n  }\n};\n","\"use strict\";\n\nconst conversions = require(\"webidl-conversions\");\nconst utils = require(\"./utils.js\");\nconst Impl = require(\".//URL-impl.js\");\n\nconst impl = utils.implSymbol;\n\nfunction URL(url) {\n  if (!this || this[impl] || !(this instanceof URL)) {\n    throw new TypeError(\"Failed to construct 'URL': Please use the 'new' operator, this DOM object constructor cannot be called as a function.\");\n  }\n  if (arguments.length < 1) {\n    throw new TypeError(\"Failed to construct 'URL': 1 argument required, but only \" + arguments.length + \" present.\");\n  }\n  const args = [];\n  for (let i = 0; i < arguments.length && i < 2; ++i) {\n    args[i] = arguments[i];\n  }\n  args[0] = conversions[\"USVString\"](args[0]);\n  if (args[1] !== undefined) {\n  args[1] = conversions[\"USVString\"](args[1]);\n  }\n\n  module.exports.setup(this, args);\n}\n\nURL.prototype.toJSON = function toJSON() {\n  if (!this || !module.exports.is(this)) {\n    throw new TypeError(\"Illegal invocation\");\n  }\n  const args = [];\n  for (let i = 0; i < arguments.length && i < 0; ++i) {\n    args[i] = arguments[i];\n  }\n  return this[impl].toJSON.apply(this[impl], args);\n};\nObject.defineProperty(URL.prototype, \"href\", {\n  get() {\n    return this[impl].href;\n  },\n  set(V) {\n    V = conversions[\"USVString\"](V);\n    this[impl].href = V;\n  },\n  enumerable: true,\n  configurable: true\n});\n\nURL.prototype.toString = function () {\n  if (!this || !module.exports.is(this)) {\n    throw new TypeError(\"Illegal invocation\");\n  }\n  return this.href;\n};\n\nObject.defineProperty(URL.prototype, \"origin\", {\n  get() {\n    return this[impl].origin;\n  },\n  enumerable: true,\n  configurable: true\n});\n\nObject.defineProperty(URL.prototype, \"protocol\", {\n  get() {\n    return this[impl].protocol;\n  },\n  set(V) {\n    V = conversions[\"USVString\"](V);\n    this[impl].protocol = V;\n  },\n  enumerable: true,\n  configurable: true\n});\n\nObject.defineProperty(URL.prototype, \"username\", {\n  get() {\n    return this[impl].username;\n  },\n  set(V) {\n    V = conversions[\"USVString\"](V);\n    this[impl].username = V;\n  },\n  enumerable: true,\n  configurable: true\n});\n\nObject.defineProperty(URL.prototype, \"password\", {\n  get() {\n    return this[impl].password;\n  },\n  set(V) {\n    V = conversions[\"USVString\"](V);\n    this[impl].password = V;\n  },\n  enumerable: true,\n  configurable: true\n});\n\nObject.defineProperty(URL.prototype, \"host\", {\n  get() {\n    return this[impl].host;\n  },\n  set(V) {\n    V = conversions[\"USVString\"](V);\n    this[impl].host = V;\n  },\n  enumerable: true,\n  configurable: true\n});\n\nObject.defineProperty(URL.prototype, \"hostname\", {\n  get() {\n    return this[impl].hostname;\n  },\n  set(V) {\n    V = conversions[\"USVString\"](V);\n    this[impl].hostname = V;\n  },\n  enumerable: true,\n  configurable: true\n});\n\nObject.defineProperty(URL.prototype, \"port\", {\n  get() {\n    return this[impl].port;\n  },\n  set(V) {\n    V = conversions[\"USVString\"](V);\n    this[impl].port = V;\n  },\n  enumerable: true,\n  configurable: true\n});\n\nObject.defineProperty(URL.prototype, \"pathname\", {\n  get() {\n    return this[impl].pathname;\n  },\n  set(V) {\n    V = conversions[\"USVString\"](V);\n    this[impl].pathname = V;\n  },\n  enumerable: true,\n  configurable: true\n});\n\nObject.defineProperty(URL.prototype, \"search\", {\n  get() {\n    return this[impl].search;\n  },\n  set(V) {\n    V = conversions[\"USVString\"](V);\n    this[impl].search = V;\n  },\n  enumerable: true,\n  configurable: true\n});\n\nObject.defineProperty(URL.prototype, \"hash\", {\n  get() {\n    return this[impl].hash;\n  },\n  set(V) {\n    V = conversions[\"USVString\"](V);\n    this[impl].hash = V;\n  },\n  enumerable: true,\n  configurable: true\n});\n\n\nmodule.exports = {\n  is(obj) {\n    return !!obj && obj[impl] instanceof Impl.implementation;\n  },\n  create(constructorArgs, privateData) {\n    let obj = Object.create(URL.prototype);\n    this.setup(obj, constructorArgs, privateData);\n    return obj;\n  },\n  setup(obj, constructorArgs, privateData) {\n    if (!privateData) privateData = {};\n    privateData.wrapper = obj;\n\n    obj[impl] = new Impl.implementation(constructorArgs, privateData);\n    obj[impl][utils.wrapperSymbol] = obj;\n  },\n  interface: URL,\n  expose: {\n    Window: { URL: URL },\n    Worker: { URL: URL }\n  }\n};\n\n","\"use strict\";\n\nexports.URL = require(\"./URL\").interface;\nexports.serializeURL = require(\"./url-state-machine\").serializeURL;\nexports.serializeURLOrigin = require(\"./url-state-machine\").serializeURLOrigin;\nexports.basicURLParse = require(\"./url-state-machine\").basicURLParse;\nexports.setTheUsername = require(\"./url-state-machine\").setTheUsername;\nexports.setThePassword = require(\"./url-state-machine\").setThePassword;\nexports.serializeHost = require(\"./url-state-machine\").serializeHost;\nexports.serializeInteger = require(\"./url-state-machine\").serializeInteger;\nexports.parseURL = require(\"./url-state-machine\").parseURL;\n","\"use strict\";\r\nconst punycode = require(\"punycode\");\r\nconst tr46 = require(\"tr46\");\r\n\r\nconst specialSchemes = {\r\n  ftp: 21,\r\n  file: null,\r\n  gopher: 70,\r\n  http: 80,\r\n  https: 443,\r\n  ws: 80,\r\n  wss: 443\r\n};\r\n\r\nconst failure = Symbol(\"failure\");\r\n\r\nfunction countSymbols(str) {\r\n  return punycode.ucs2.decode(str).length;\r\n}\r\n\r\nfunction at(input, idx) {\r\n  const c = input[idx];\r\n  return isNaN(c) ? undefined : String.fromCodePoint(c);\r\n}\r\n\r\nfunction isASCIIDigit(c) {\r\n  return c >= 0x30 && c <= 0x39;\r\n}\r\n\r\nfunction isASCIIAlpha(c) {\r\n  return (c >= 0x41 && c <= 0x5A) || (c >= 0x61 && c <= 0x7A);\r\n}\r\n\r\nfunction isASCIIAlphanumeric(c) {\r\n  return isASCIIAlpha(c) || isASCIIDigit(c);\r\n}\r\n\r\nfunction isASCIIHex(c) {\r\n  return isASCIIDigit(c) || (c >= 0x41 && c <= 0x46) || (c >= 0x61 && c <= 0x66);\r\n}\r\n\r\nfunction isSingleDot(buffer) {\r\n  return buffer === \".\" || buffer.toLowerCase() === \"%2e\";\r\n}\r\n\r\nfunction isDoubleDot(buffer) {\r\n  buffer = buffer.toLowerCase();\r\n  return buffer === \"..\" || buffer === \"%2e.\" || buffer === \".%2e\" || buffer === \"%2e%2e\";\r\n}\r\n\r\nfunction isWindowsDriveLetterCodePoints(cp1, cp2) {\r\n  return isASCIIAlpha(cp1) && (cp2 === 58 || cp2 === 124);\r\n}\r\n\r\nfunction isWindowsDriveLetterString(string) {\r\n  return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && (string[1] === \":\" || string[1] === \"|\");\r\n}\r\n\r\nfunction isNormalizedWindowsDriveLetterString(string) {\r\n  return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && string[1] === \":\";\r\n}\r\n\r\nfunction containsForbiddenHostCodePoint(string) {\r\n  return string.search(/\\u0000|\\u0009|\\u000A|\\u000D|\\u0020|#|%|\\/|:|\\?|@|\\[|\\\\|\\]/) !== -1;\r\n}\r\n\r\nfunction containsForbiddenHostCodePointExcludingPercent(string) {\r\n  return string.search(/\\u0000|\\u0009|\\u000A|\\u000D|\\u0020|#|\\/|:|\\?|@|\\[|\\\\|\\]/) !== -1;\r\n}\r\n\r\nfunction isSpecialScheme(scheme) {\r\n  return specialSchemes[scheme] !== undefined;\r\n}\r\n\r\nfunction isSpecial(url) {\r\n  return isSpecialScheme(url.scheme);\r\n}\r\n\r\nfunction defaultPort(scheme) {\r\n  return specialSchemes[scheme];\r\n}\r\n\r\nfunction percentEncode(c) {\r\n  let hex = c.toString(16).toUpperCase();\r\n  if (hex.length === 1) {\r\n    hex = \"0\" + hex;\r\n  }\r\n\r\n  return \"%\" + hex;\r\n}\r\n\r\nfunction utf8PercentEncode(c) {\r\n  const buf = new Buffer(c);\r\n\r\n  let str = \"\";\r\n\r\n  for (let i = 0; i < buf.length; ++i) {\r\n    str += percentEncode(buf[i]);\r\n  }\r\n\r\n  return str;\r\n}\r\n\r\nfunction utf8PercentDecode(str) {\r\n  const input = new Buffer(str);\r\n  const output = [];\r\n  for (let i = 0; i < input.length; ++i) {\r\n    if (input[i] !== 37) {\r\n      output.push(input[i]);\r\n    } else if (input[i] === 37 && isASCIIHex(input[i + 1]) && isASCIIHex(input[i + 2])) {\r\n      output.push(parseInt(input.slice(i + 1, i + 3).toString(), 16));\r\n      i += 2;\r\n    } else {\r\n      output.push(input[i]);\r\n    }\r\n  }\r\n  return new Buffer(output).toString();\r\n}\r\n\r\nfunction isC0ControlPercentEncode(c) {\r\n  return c <= 0x1F || c > 0x7E;\r\n}\r\n\r\nconst extraPathPercentEncodeSet = new Set([32, 34, 35, 60, 62, 63, 96, 123, 125]);\r\nfunction isPathPercentEncode(c) {\r\n  return isC0ControlPercentEncode(c) || extraPathPercentEncodeSet.has(c);\r\n}\r\n\r\nconst extraUserinfoPercentEncodeSet =\r\n  new Set([47, 58, 59, 61, 64, 91, 92, 93, 94, 124]);\r\nfunction isUserinfoPercentEncode(c) {\r\n  return isPathPercentEncode(c) || extraUserinfoPercentEncodeSet.has(c);\r\n}\r\n\r\nfunction percentEncodeChar(c, encodeSetPredicate) {\r\n  const cStr = String.fromCodePoint(c);\r\n\r\n  if (encodeSetPredicate(c)) {\r\n    return utf8PercentEncode(cStr);\r\n  }\r\n\r\n  return cStr;\r\n}\r\n\r\nfunction parseIPv4Number(input) {\r\n  let R = 10;\r\n\r\n  if (input.length >= 2 && input.charAt(0) === \"0\" && input.charAt(1).toLowerCase() === \"x\") {\r\n    input = input.substring(2);\r\n    R = 16;\r\n  } else if (input.length >= 2 && input.charAt(0) === \"0\") {\r\n    input = input.substring(1);\r\n    R = 8;\r\n  }\r\n\r\n  if (input === \"\") {\r\n    return 0;\r\n  }\r\n\r\n  const regex = R === 10 ? /[^0-9]/ : (R === 16 ? /[^0-9A-Fa-f]/ : /[^0-7]/);\r\n  if (regex.test(input)) {\r\n    return failure;\r\n  }\r\n\r\n  return parseInt(input, R);\r\n}\r\n\r\nfunction parseIPv4(input) {\r\n  const parts = input.split(\".\");\r\n  if (parts[parts.length - 1] === \"\") {\r\n    if (parts.length > 1) {\r\n      parts.pop();\r\n    }\r\n  }\r\n\r\n  if (parts.length > 4) {\r\n    return input;\r\n  }\r\n\r\n  const numbers = [];\r\n  for (const part of parts) {\r\n    if (part === \"\") {\r\n      return input;\r\n    }\r\n    const n = parseIPv4Number(part);\r\n    if (n === failure) {\r\n      return input;\r\n    }\r\n\r\n    numbers.push(n);\r\n  }\r\n\r\n  for (let i = 0; i < numbers.length - 1; ++i) {\r\n    if (numbers[i] > 255) {\r\n      return failure;\r\n    }\r\n  }\r\n  if (numbers[numbers.length - 1] >= Math.pow(256, 5 - numbers.length)) {\r\n    return failure;\r\n  }\r\n\r\n  let ipv4 = numbers.pop();\r\n  let counter = 0;\r\n\r\n  for (const n of numbers) {\r\n    ipv4 += n * Math.pow(256, 3 - counter);\r\n    ++counter;\r\n  }\r\n\r\n  return ipv4;\r\n}\r\n\r\nfunction serializeIPv4(address) {\r\n  let output = \"\";\r\n  let n = address;\r\n\r\n  for (let i = 1; i <= 4; ++i) {\r\n    output = String(n % 256) + output;\r\n    if (i !== 4) {\r\n      output = \".\" + output;\r\n    }\r\n    n = Math.floor(n / 256);\r\n  }\r\n\r\n  return output;\r\n}\r\n\r\nfunction parseIPv6(input) {\r\n  const address = [0, 0, 0, 0, 0, 0, 0, 0];\r\n  let pieceIndex = 0;\r\n  let compress = null;\r\n  let pointer = 0;\r\n\r\n  input = punycode.ucs2.decode(input);\r\n\r\n  if (input[pointer] === 58) {\r\n    if (input[pointer + 1] !== 58) {\r\n      return failure;\r\n    }\r\n\r\n    pointer += 2;\r\n    ++pieceIndex;\r\n    compress = pieceIndex;\r\n  }\r\n\r\n  while (pointer < input.length) {\r\n    if (pieceIndex === 8) {\r\n      return failure;\r\n    }\r\n\r\n    if (input[pointer] === 58) {\r\n      if (compress !== null) {\r\n        return failure;\r\n      }\r\n      ++pointer;\r\n      ++pieceIndex;\r\n      compress = pieceIndex;\r\n      continue;\r\n    }\r\n\r\n    let value = 0;\r\n    let length = 0;\r\n\r\n    while (length < 4 && isASCIIHex(input[pointer])) {\r\n      value = value * 0x10 + parseInt(at(input, pointer), 16);\r\n      ++pointer;\r\n      ++length;\r\n    }\r\n\r\n    if (input[pointer] === 46) {\r\n      if (length === 0) {\r\n        return failure;\r\n      }\r\n\r\n      pointer -= length;\r\n\r\n      if (pieceIndex > 6) {\r\n        return failure;\r\n      }\r\n\r\n      let numbersSeen = 0;\r\n\r\n      while (input[pointer] !== undefined) {\r\n        let ipv4Piece = null;\r\n\r\n        if (numbersSeen > 0) {\r\n          if (input[pointer] === 46 && numbersSeen < 4) {\r\n            ++pointer;\r\n          } else {\r\n            return failure;\r\n          }\r\n        }\r\n\r\n        if (!isASCIIDigit(input[pointer])) {\r\n          return failure;\r\n        }\r\n\r\n        while (isASCIIDigit(input[pointer])) {\r\n          const number = parseInt(at(input, pointer));\r\n          if (ipv4Piece === null) {\r\n            ipv4Piece = number;\r\n          } else if (ipv4Piece === 0) {\r\n            return failure;\r\n          } else {\r\n            ipv4Piece = ipv4Piece * 10 + number;\r\n          }\r\n          if (ipv4Piece > 255) {\r\n            return failure;\r\n          }\r\n          ++pointer;\r\n        }\r\n\r\n        address[pieceIndex] = address[pieceIndex] * 0x100 + ipv4Piece;\r\n\r\n        ++numbersSeen;\r\n\r\n        if (numbersSeen === 2 || numbersSeen === 4) {\r\n          ++pieceIndex;\r\n        }\r\n      }\r\n\r\n      if (numbersSeen !== 4) {\r\n        return failure;\r\n      }\r\n\r\n      break;\r\n    } else if (input[pointer] === 58) {\r\n      ++pointer;\r\n      if (input[pointer] === undefined) {\r\n        return failure;\r\n      }\r\n    } else if (input[pointer] !== undefined) {\r\n      return failure;\r\n    }\r\n\r\n    address[pieceIndex] = value;\r\n    ++pieceIndex;\r\n  }\r\n\r\n  if (compress !== null) {\r\n    let swaps = pieceIndex - compress;\r\n    pieceIndex = 7;\r\n    while (pieceIndex !== 0 && swaps > 0) {\r\n      const temp = address[compress + swaps - 1];\r\n      address[compress + swaps - 1] = address[pieceIndex];\r\n      address[pieceIndex] = temp;\r\n      --pieceIndex;\r\n      --swaps;\r\n    }\r\n  } else if (compress === null && pieceIndex !== 8) {\r\n    return failure;\r\n  }\r\n\r\n  return address;\r\n}\r\n\r\nfunction serializeIPv6(address) {\r\n  let output = \"\";\r\n  const seqResult = findLongestZeroSequence(address);\r\n  const compress = seqResult.idx;\r\n  let ignore0 = false;\r\n\r\n  for (let pieceIndex = 0; pieceIndex <= 7; ++pieceIndex) {\r\n    if (ignore0 && address[pieceIndex] === 0) {\r\n      continue;\r\n    } else if (ignore0) {\r\n      ignore0 = false;\r\n    }\r\n\r\n    if (compress === pieceIndex) {\r\n      const separator = pieceIndex === 0 ? \"::\" : \":\";\r\n      output += separator;\r\n      ignore0 = true;\r\n      continue;\r\n    }\r\n\r\n    output += address[pieceIndex].toString(16);\r\n\r\n    if (pieceIndex !== 7) {\r\n      output += \":\";\r\n    }\r\n  }\r\n\r\n  return output;\r\n}\r\n\r\nfunction parseHost(input, isSpecialArg) {\r\n  if (input[0] === \"[\") {\r\n    if (input[input.length - 1] !== \"]\") {\r\n      return failure;\r\n    }\r\n\r\n    return parseIPv6(input.substring(1, input.length - 1));\r\n  }\r\n\r\n  if (!isSpecialArg) {\r\n    return parseOpaqueHost(input);\r\n  }\r\n\r\n  const domain = utf8PercentDecode(input);\r\n  const asciiDomain = tr46.toASCII(domain, false, tr46.PROCESSING_OPTIONS.NONTRANSITIONAL, false);\r\n  if (asciiDomain === null) {\r\n    return failure;\r\n  }\r\n\r\n  if (containsForbiddenHostCodePoint(asciiDomain)) {\r\n    return failure;\r\n  }\r\n\r\n  const ipv4Host = parseIPv4(asciiDomain);\r\n  if (typeof ipv4Host === \"number\" || ipv4Host === failure) {\r\n    return ipv4Host;\r\n  }\r\n\r\n  return asciiDomain;\r\n}\r\n\r\nfunction parseOpaqueHost(input) {\r\n  if (containsForbiddenHostCodePointExcludingPercent(input)) {\r\n    return failure;\r\n  }\r\n\r\n  let output = \"\";\r\n  const decoded = punycode.ucs2.decode(input);\r\n  for (let i = 0; i < decoded.length; ++i) {\r\n    output += percentEncodeChar(decoded[i], isC0ControlPercentEncode);\r\n  }\r\n  return output;\r\n}\r\n\r\nfunction findLongestZeroSequence(arr) {\r\n  let maxIdx = null;\r\n  let maxLen = 1; // only find elements > 1\r\n  let currStart = null;\r\n  let currLen = 0;\r\n\r\n  for (let i = 0; i < arr.length; ++i) {\r\n    if (arr[i] !== 0) {\r\n      if (currLen > maxLen) {\r\n        maxIdx = currStart;\r\n        maxLen = currLen;\r\n      }\r\n\r\n      currStart = null;\r\n      currLen = 0;\r\n    } else {\r\n      if (currStart === null) {\r\n        currStart = i;\r\n      }\r\n      ++currLen;\r\n    }\r\n  }\r\n\r\n  // if trailing zeros\r\n  if (currLen > maxLen) {\r\n    maxIdx = currStart;\r\n    maxLen = currLen;\r\n  }\r\n\r\n  return {\r\n    idx: maxIdx,\r\n    len: maxLen\r\n  };\r\n}\r\n\r\nfunction serializeHost(host) {\r\n  if (typeof host === \"number\") {\r\n    return serializeIPv4(host);\r\n  }\r\n\r\n  // IPv6 serializer\r\n  if (host instanceof Array) {\r\n    return \"[\" + serializeIPv6(host) + \"]\";\r\n  }\r\n\r\n  return host;\r\n}\r\n\r\nfunction trimControlChars(url) {\r\n  return url.replace(/^[\\u0000-\\u001F\\u0020]+|[\\u0000-\\u001F\\u0020]+$/g, \"\");\r\n}\r\n\r\nfunction trimTabAndNewline(url) {\r\n  return url.replace(/\\u0009|\\u000A|\\u000D/g, \"\");\r\n}\r\n\r\nfunction shortenPath(url) {\r\n  const path = url.path;\r\n  if (path.length === 0) {\r\n    return;\r\n  }\r\n  if (url.scheme === \"file\" && path.length === 1 && isNormalizedWindowsDriveLetter(path[0])) {\r\n    return;\r\n  }\r\n\r\n  path.pop();\r\n}\r\n\r\nfunction includesCredentials(url) {\r\n  return url.username !== \"\" || url.password !== \"\";\r\n}\r\n\r\nfunction cannotHaveAUsernamePasswordPort(url) {\r\n  return url.host === null || url.host === \"\" || url.cannotBeABaseURL || url.scheme === \"file\";\r\n}\r\n\r\nfunction isNormalizedWindowsDriveLetter(string) {\r\n  return /^[A-Za-z]:$/.test(string);\r\n}\r\n\r\nfunction URLStateMachine(input, base, encodingOverride, url, stateOverride) {\r\n  this.pointer = 0;\r\n  this.input = input;\r\n  this.base = base || null;\r\n  this.encodingOverride = encodingOverride || \"utf-8\";\r\n  this.stateOverride = stateOverride;\r\n  this.url = url;\r\n  this.failure = false;\r\n  this.parseError = false;\r\n\r\n  if (!this.url) {\r\n    this.url = {\r\n      scheme: \"\",\r\n      username: \"\",\r\n      password: \"\",\r\n      host: null,\r\n      port: null,\r\n      path: [],\r\n      query: null,\r\n      fragment: null,\r\n\r\n      cannotBeABaseURL: false\r\n    };\r\n\r\n    const res = trimControlChars(this.input);\r\n    if (res !== this.input) {\r\n      this.parseError = true;\r\n    }\r\n    this.input = res;\r\n  }\r\n\r\n  const res = trimTabAndNewline(this.input);\r\n  if (res !== this.input) {\r\n    this.parseError = true;\r\n  }\r\n  this.input = res;\r\n\r\n  this.state = stateOverride || \"scheme start\";\r\n\r\n  this.buffer = \"\";\r\n  this.atFlag = false;\r\n  this.arrFlag = false;\r\n  this.passwordTokenSeenFlag = false;\r\n\r\n  this.input = punycode.ucs2.decode(this.input);\r\n\r\n  for (; this.pointer <= this.input.length; ++this.pointer) {\r\n    const c = this.input[this.pointer];\r\n    const cStr = isNaN(c) ? undefined : String.fromCodePoint(c);\r\n\r\n    // exec state machine\r\n    const ret = this[\"parse \" + this.state](c, cStr);\r\n    if (!ret) {\r\n      break; // terminate algorithm\r\n    } else if (ret === failure) {\r\n      this.failure = true;\r\n      break;\r\n    }\r\n  }\r\n}\r\n\r\nURLStateMachine.prototype[\"parse scheme start\"] = function parseSchemeStart(c, cStr) {\r\n  if (isASCIIAlpha(c)) {\r\n    this.buffer += cStr.toLowerCase();\r\n    this.state = \"scheme\";\r\n  } else if (!this.stateOverride) {\r\n    this.state = \"no scheme\";\r\n    --this.pointer;\r\n  } else {\r\n    this.parseError = true;\r\n    return failure;\r\n  }\r\n\r\n  return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse scheme\"] = function parseScheme(c, cStr) {\r\n  if (isASCIIAlphanumeric(c) || c === 43 || c === 45 || c === 46) {\r\n    this.buffer += cStr.toLowerCase();\r\n  } else if (c === 58) {\r\n    if (this.stateOverride) {\r\n      if (isSpecial(this.url) && !isSpecialScheme(this.buffer)) {\r\n        return false;\r\n      }\r\n\r\n      if (!isSpecial(this.url) && isSpecialScheme(this.buffer)) {\r\n        return false;\r\n      }\r\n\r\n      if ((includesCredentials(this.url) || this.url.port !== null) && this.buffer === \"file\") {\r\n        return false;\r\n      }\r\n\r\n      if (this.url.scheme === \"file\" && (this.url.host === \"\" || this.url.host === null)) {\r\n        return false;\r\n      }\r\n    }\r\n    this.url.scheme = this.buffer;\r\n    this.buffer = \"\";\r\n    if (this.stateOverride) {\r\n      return false;\r\n    }\r\n    if (this.url.scheme === \"file\") {\r\n      if (this.input[this.pointer + 1] !== 47 || this.input[this.pointer + 2] !== 47) {\r\n        this.parseError = true;\r\n      }\r\n      this.state = \"file\";\r\n    } else if (isSpecial(this.url) && this.base !== null && this.base.scheme === this.url.scheme) {\r\n      this.state = \"special relative or authority\";\r\n    } else if (isSpecial(this.url)) {\r\n      this.state = \"special authority slashes\";\r\n    } else if (this.input[this.pointer + 1] === 47) {\r\n      this.state = \"path or authority\";\r\n      ++this.pointer;\r\n    } else {\r\n      this.url.cannotBeABaseURL = true;\r\n      this.url.path.push(\"\");\r\n      this.state = \"cannot-be-a-base-URL path\";\r\n    }\r\n  } else if (!this.stateOverride) {\r\n    this.buffer = \"\";\r\n    this.state = \"no scheme\";\r\n    this.pointer = -1;\r\n  } else {\r\n    this.parseError = true;\r\n    return failure;\r\n  }\r\n\r\n  return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse no scheme\"] = function parseNoScheme(c) {\r\n  if (this.base === null || (this.base.cannotBeABaseURL && c !== 35)) {\r\n    return failure;\r\n  } else if (this.base.cannotBeABaseURL && c === 35) {\r\n    this.url.scheme = this.base.scheme;\r\n    this.url.path = this.base.path.slice();\r\n    this.url.query = this.base.query;\r\n    this.url.fragment = \"\";\r\n    this.url.cannotBeABaseURL = true;\r\n    this.state = \"fragment\";\r\n  } else if (this.base.scheme === \"file\") {\r\n    this.state = \"file\";\r\n    --this.pointer;\r\n  } else {\r\n    this.state = \"relative\";\r\n    --this.pointer;\r\n  }\r\n\r\n  return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse special relative or authority\"] = function parseSpecialRelativeOrAuthority(c) {\r\n  if (c === 47 && this.input[this.pointer + 1] === 47) {\r\n    this.state = \"special authority ignore slashes\";\r\n    ++this.pointer;\r\n  } else {\r\n    this.parseError = true;\r\n    this.state = \"relative\";\r\n    --this.pointer;\r\n  }\r\n\r\n  return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse path or authority\"] = function parsePathOrAuthority(c) {\r\n  if (c === 47) {\r\n    this.state = \"authority\";\r\n  } else {\r\n    this.state = \"path\";\r\n    --this.pointer;\r\n  }\r\n\r\n  return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse relative\"] = function parseRelative(c) {\r\n  this.url.scheme = this.base.scheme;\r\n  if (isNaN(c)) {\r\n    this.url.username = this.base.username;\r\n    this.url.password = this.base.password;\r\n    this.url.host = this.base.host;\r\n    this.url.port = this.base.port;\r\n    this.url.path = this.base.path.slice();\r\n    this.url.query = this.base.query;\r\n  } else if (c === 47) {\r\n    this.state = \"relative slash\";\r\n  } else if (c === 63) {\r\n    this.url.username = this.base.username;\r\n    this.url.password = this.base.password;\r\n    this.url.host = this.base.host;\r\n    this.url.port = this.base.port;\r\n    this.url.path = this.base.path.slice();\r\n    this.url.query = \"\";\r\n    this.state = \"query\";\r\n  } else if (c === 35) {\r\n    this.url.username = this.base.username;\r\n    this.url.password = this.base.password;\r\n    this.url.host = this.base.host;\r\n    this.url.port = this.base.port;\r\n    this.url.path = this.base.path.slice();\r\n    this.url.query = this.base.query;\r\n    this.url.fragment = \"\";\r\n    this.state = \"fragment\";\r\n  } else if (isSpecial(this.url) && c === 92) {\r\n    this.parseError = true;\r\n    this.state = \"relative slash\";\r\n  } else {\r\n    this.url.username = this.base.username;\r\n    this.url.password = this.base.password;\r\n    this.url.host = this.base.host;\r\n    this.url.port = this.base.port;\r\n    this.url.path = this.base.path.slice(0, this.base.path.length - 1);\r\n\r\n    this.state = \"path\";\r\n    --this.pointer;\r\n  }\r\n\r\n  return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse relative slash\"] = function parseRelativeSlash(c) {\r\n  if (isSpecial(this.url) && (c === 47 || c === 92)) {\r\n    if (c === 92) {\r\n      this.parseError = true;\r\n    }\r\n    this.state = \"special authority ignore slashes\";\r\n  } else if (c === 47) {\r\n    this.state = \"authority\";\r\n  } else {\r\n    this.url.username = this.base.username;\r\n    this.url.password = this.base.password;\r\n    this.url.host = this.base.host;\r\n    this.url.port = this.base.port;\r\n    this.state = \"path\";\r\n    --this.pointer;\r\n  }\r\n\r\n  return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse special authority slashes\"] = function parseSpecialAuthoritySlashes(c) {\r\n  if (c === 47 && this.input[this.pointer + 1] === 47) {\r\n    this.state = \"special authority ignore slashes\";\r\n    ++this.pointer;\r\n  } else {\r\n    this.parseError = true;\r\n    this.state = \"special authority ignore slashes\";\r\n    --this.pointer;\r\n  }\r\n\r\n  return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse special authority ignore slashes\"] = function parseSpecialAuthorityIgnoreSlashes(c) {\r\n  if (c !== 47 && c !== 92) {\r\n    this.state = \"authority\";\r\n    --this.pointer;\r\n  } else {\r\n    this.parseError = true;\r\n  }\r\n\r\n  return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse authority\"] = function parseAuthority(c, cStr) {\r\n  if (c === 64) {\r\n    this.parseError = true;\r\n    if (this.atFlag) {\r\n      this.buffer = \"%40\" + this.buffer;\r\n    }\r\n    this.atFlag = true;\r\n\r\n    // careful, this is based on buffer and has its own pointer (this.pointer != pointer) and inner chars\r\n    const len = countSymbols(this.buffer);\r\n    for (let pointer = 0; pointer < len; ++pointer) {\r\n      const codePoint = this.buffer.codePointAt(pointer);\r\n\r\n      if (codePoint === 58 && !this.passwordTokenSeenFlag) {\r\n        this.passwordTokenSeenFlag = true;\r\n        continue;\r\n      }\r\n      const encodedCodePoints = percentEncodeChar(codePoint, isUserinfoPercentEncode);\r\n      if (this.passwordTokenSeenFlag) {\r\n        this.url.password += encodedCodePoints;\r\n      } else {\r\n        this.url.username += encodedCodePoints;\r\n      }\r\n    }\r\n    this.buffer = \"\";\r\n  } else if (isNaN(c) || c === 47 || c === 63 || c === 35 ||\r\n             (isSpecial(this.url) && c === 92)) {\r\n    if (this.atFlag && this.buffer === \"\") {\r\n      this.parseError = true;\r\n      return failure;\r\n    }\r\n    this.pointer -= countSymbols(this.buffer) + 1;\r\n    this.buffer = \"\";\r\n    this.state = \"host\";\r\n  } else {\r\n    this.buffer += cStr;\r\n  }\r\n\r\n  return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse hostname\"] =\r\nURLStateMachine.prototype[\"parse host\"] = function parseHostName(c, cStr) {\r\n  if (this.stateOverride && this.url.scheme === \"file\") {\r\n    --this.pointer;\r\n    this.state = \"file host\";\r\n  } else if (c === 58 && !this.arrFlag) {\r\n    if (this.buffer === \"\") {\r\n      this.parseError = true;\r\n      return failure;\r\n    }\r\n\r\n    const host = parseHost(this.buffer, isSpecial(this.url));\r\n    if (host === failure) {\r\n      return failure;\r\n    }\r\n\r\n    this.url.host = host;\r\n    this.buffer = \"\";\r\n    this.state = \"port\";\r\n    if (this.stateOverride === \"hostname\") {\r\n      return false;\r\n    }\r\n  } else if (isNaN(c) || c === 47 || c === 63 || c === 35 ||\r\n             (isSpecial(this.url) && c === 92)) {\r\n    --this.pointer;\r\n    if (isSpecial(this.url) && this.buffer === \"\") {\r\n      this.parseError = true;\r\n      return failure;\r\n    } else if (this.stateOverride && this.buffer === \"\" &&\r\n               (includesCredentials(this.url) || this.url.port !== null)) {\r\n      this.parseError = true;\r\n      return false;\r\n    }\r\n\r\n    const host = parseHost(this.buffer, isSpecial(this.url));\r\n    if (host === failure) {\r\n      return failure;\r\n    }\r\n\r\n    this.url.host = host;\r\n    this.buffer = \"\";\r\n    this.state = \"path start\";\r\n    if (this.stateOverride) {\r\n      return false;\r\n    }\r\n  } else {\r\n    if (c === 91) {\r\n      this.arrFlag = true;\r\n    } else if (c === 93) {\r\n      this.arrFlag = false;\r\n    }\r\n    this.buffer += cStr;\r\n  }\r\n\r\n  return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse port\"] = function parsePort(c, cStr) {\r\n  if (isASCIIDigit(c)) {\r\n    this.buffer += cStr;\r\n  } else if (isNaN(c) || c === 47 || c === 63 || c === 35 ||\r\n             (isSpecial(this.url) && c === 92) ||\r\n             this.stateOverride) {\r\n    if (this.buffer !== \"\") {\r\n      const port = parseInt(this.buffer);\r\n      if (port > Math.pow(2, 16) - 1) {\r\n        this.parseError = true;\r\n        return failure;\r\n      }\r\n      this.url.port = port === defaultPort(this.url.scheme) ? null : port;\r\n      this.buffer = \"\";\r\n    }\r\n    if (this.stateOverride) {\r\n      return false;\r\n    }\r\n    this.state = \"path start\";\r\n    --this.pointer;\r\n  } else {\r\n    this.parseError = true;\r\n    return failure;\r\n  }\r\n\r\n  return true;\r\n};\r\n\r\nconst fileOtherwiseCodePoints = new Set([47, 92, 63, 35]);\r\n\r\nURLStateMachine.prototype[\"parse file\"] = function parseFile(c) {\r\n  this.url.scheme = \"file\";\r\n\r\n  if (c === 47 || c === 92) {\r\n    if (c === 92) {\r\n      this.parseError = true;\r\n    }\r\n    this.state = \"file slash\";\r\n  } else if (this.base !== null && this.base.scheme === \"file\") {\r\n    if (isNaN(c)) {\r\n      this.url.host = this.base.host;\r\n      this.url.path = this.base.path.slice();\r\n      this.url.query = this.base.query;\r\n    } else if (c === 63) {\r\n      this.url.host = this.base.host;\r\n      this.url.path = this.base.path.slice();\r\n      this.url.query = \"\";\r\n      this.state = \"query\";\r\n    } else if (c === 35) {\r\n      this.url.host = this.base.host;\r\n      this.url.path = this.base.path.slice();\r\n      this.url.query = this.base.query;\r\n      this.url.fragment = \"\";\r\n      this.state = \"fragment\";\r\n    } else {\r\n      if (this.input.length - this.pointer - 1 === 0 || // remaining consists of 0 code points\r\n          !isWindowsDriveLetterCodePoints(c, this.input[this.pointer + 1]) ||\r\n          (this.input.length - this.pointer - 1 >= 2 && // remaining has at least 2 code points\r\n           !fileOtherwiseCodePoints.has(this.input[this.pointer + 2]))) {\r\n        this.url.host = this.base.host;\r\n        this.url.path = this.base.path.slice();\r\n        shortenPath(this.url);\r\n      } else {\r\n        this.parseError = true;\r\n      }\r\n\r\n      this.state = \"path\";\r\n      --this.pointer;\r\n    }\r\n  } else {\r\n    this.state = \"path\";\r\n    --this.pointer;\r\n  }\r\n\r\n  return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse file slash\"] = function parseFileSlash(c) {\r\n  if (c === 47 || c === 92) {\r\n    if (c === 92) {\r\n      this.parseError = true;\r\n    }\r\n    this.state = \"file host\";\r\n  } else {\r\n    if (this.base !== null && this.base.scheme === \"file\") {\r\n      if (isNormalizedWindowsDriveLetterString(this.base.path[0])) {\r\n        this.url.path.push(this.base.path[0]);\r\n      } else {\r\n        this.url.host = this.base.host;\r\n      }\r\n    }\r\n    this.state = \"path\";\r\n    --this.pointer;\r\n  }\r\n\r\n  return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse file host\"] = function parseFileHost(c, cStr) {\r\n  if (isNaN(c) || c === 47 || c === 92 || c === 63 || c === 35) {\r\n    --this.pointer;\r\n    if (!this.stateOverride && isWindowsDriveLetterString(this.buffer)) {\r\n      this.parseError = true;\r\n      this.state = \"path\";\r\n    } else if (this.buffer === \"\") {\r\n      this.url.host = \"\";\r\n      if (this.stateOverride) {\r\n        return false;\r\n      }\r\n      this.state = \"path start\";\r\n    } else {\r\n      let host = parseHost(this.buffer, isSpecial(this.url));\r\n      if (host === failure) {\r\n        return failure;\r\n      }\r\n      if (host === \"localhost\") {\r\n        host = \"\";\r\n      }\r\n      this.url.host = host;\r\n\r\n      if (this.stateOverride) {\r\n        return false;\r\n      }\r\n\r\n      this.buffer = \"\";\r\n      this.state = \"path start\";\r\n    }\r\n  } else {\r\n    this.buffer += cStr;\r\n  }\r\n\r\n  return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse path start\"] = function parsePathStart(c) {\r\n  if (isSpecial(this.url)) {\r\n    if (c === 92) {\r\n      this.parseError = true;\r\n    }\r\n    this.state = \"path\";\r\n\r\n    if (c !== 47 && c !== 92) {\r\n      --this.pointer;\r\n    }\r\n  } else if (!this.stateOverride && c === 63) {\r\n    this.url.query = \"\";\r\n    this.state = \"query\";\r\n  } else if (!this.stateOverride && c === 35) {\r\n    this.url.fragment = \"\";\r\n    this.state = \"fragment\";\r\n  } else if (c !== undefined) {\r\n    this.state = \"path\";\r\n    if (c !== 47) {\r\n      --this.pointer;\r\n    }\r\n  }\r\n\r\n  return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse path\"] = function parsePath(c) {\r\n  if (isNaN(c) || c === 47 || (isSpecial(this.url) && c === 92) ||\r\n      (!this.stateOverride && (c === 63 || c === 35))) {\r\n    if (isSpecial(this.url) && c === 92) {\r\n      this.parseError = true;\r\n    }\r\n\r\n    if (isDoubleDot(this.buffer)) {\r\n      shortenPath(this.url);\r\n      if (c !== 47 && !(isSpecial(this.url) && c === 92)) {\r\n        this.url.path.push(\"\");\r\n      }\r\n    } else if (isSingleDot(this.buffer) && c !== 47 &&\r\n               !(isSpecial(this.url) && c === 92)) {\r\n      this.url.path.push(\"\");\r\n    } else if (!isSingleDot(this.buffer)) {\r\n      if (this.url.scheme === \"file\" && this.url.path.length === 0 && isWindowsDriveLetterString(this.buffer)) {\r\n        if (this.url.host !== \"\" && this.url.host !== null) {\r\n          this.parseError = true;\r\n          this.url.host = \"\";\r\n        }\r\n        this.buffer = this.buffer[0] + \":\";\r\n      }\r\n      this.url.path.push(this.buffer);\r\n    }\r\n    this.buffer = \"\";\r\n    if (this.url.scheme === \"file\" && (c === undefined || c === 63 || c === 35)) {\r\n      while (this.url.path.length > 1 && this.url.path[0] === \"\") {\r\n        this.parseError = true;\r\n        this.url.path.shift();\r\n      }\r\n    }\r\n    if (c === 63) {\r\n      this.url.query = \"\";\r\n      this.state = \"query\";\r\n    }\r\n    if (c === 35) {\r\n      this.url.fragment = \"\";\r\n      this.state = \"fragment\";\r\n    }\r\n  } else {\r\n    // TODO: If c is not a URL code point and not \"%\", parse error.\r\n\r\n    if (c === 37 &&\r\n      (!isASCIIHex(this.input[this.pointer + 1]) ||\r\n        !isASCIIHex(this.input[this.pointer + 2]))) {\r\n      this.parseError = true;\r\n    }\r\n\r\n    this.buffer += percentEncodeChar(c, isPathPercentEncode);\r\n  }\r\n\r\n  return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse cannot-be-a-base-URL path\"] = function parseCannotBeABaseURLPath(c) {\r\n  if (c === 63) {\r\n    this.url.query = \"\";\r\n    this.state = \"query\";\r\n  } else if (c === 35) {\r\n    this.url.fragment = \"\";\r\n    this.state = \"fragment\";\r\n  } else {\r\n    // TODO: Add: not a URL code point\r\n    if (!isNaN(c) && c !== 37) {\r\n      this.parseError = true;\r\n    }\r\n\r\n    if (c === 37 &&\r\n        (!isASCIIHex(this.input[this.pointer + 1]) ||\r\n         !isASCIIHex(this.input[this.pointer + 2]))) {\r\n      this.parseError = true;\r\n    }\r\n\r\n    if (!isNaN(c)) {\r\n      this.url.path[0] = this.url.path[0] + percentEncodeChar(c, isC0ControlPercentEncode);\r\n    }\r\n  }\r\n\r\n  return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse query\"] = function parseQuery(c, cStr) {\r\n  if (isNaN(c) || (!this.stateOverride && c === 35)) {\r\n    if (!isSpecial(this.url) || this.url.scheme === \"ws\" || this.url.scheme === \"wss\") {\r\n      this.encodingOverride = \"utf-8\";\r\n    }\r\n\r\n    const buffer = new Buffer(this.buffer); // TODO: Use encoding override instead\r\n    for (let i = 0; i < buffer.length; ++i) {\r\n      if (buffer[i] < 0x21 || buffer[i] > 0x7E || buffer[i] === 0x22 || buffer[i] === 0x23 ||\r\n          buffer[i] === 0x3C || buffer[i] === 0x3E) {\r\n        this.url.query += percentEncode(buffer[i]);\r\n      } else {\r\n        this.url.query += String.fromCodePoint(buffer[i]);\r\n      }\r\n    }\r\n\r\n    this.buffer = \"\";\r\n    if (c === 35) {\r\n      this.url.fragment = \"\";\r\n      this.state = \"fragment\";\r\n    }\r\n  } else {\r\n    // TODO: If c is not a URL code point and not \"%\", parse error.\r\n    if (c === 37 &&\r\n      (!isASCIIHex(this.input[this.pointer + 1]) ||\r\n        !isASCIIHex(this.input[this.pointer + 2]))) {\r\n      this.parseError = true;\r\n    }\r\n\r\n    this.buffer += cStr;\r\n  }\r\n\r\n  return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse fragment\"] = function parseFragment(c) {\r\n  if (isNaN(c)) { // do nothing\r\n  } else if (c === 0x0) {\r\n    this.parseError = true;\r\n  } else {\r\n    // TODO: If c is not a URL code point and not \"%\", parse error.\r\n    if (c === 37 &&\r\n      (!isASCIIHex(this.input[this.pointer + 1]) ||\r\n        !isASCIIHex(this.input[this.pointer + 2]))) {\r\n      this.parseError = true;\r\n    }\r\n\r\n    this.url.fragment += percentEncodeChar(c, isC0ControlPercentEncode);\r\n  }\r\n\r\n  return true;\r\n};\r\n\r\nfunction serializeURL(url, excludeFragment) {\r\n  let output = url.scheme + \":\";\r\n  if (url.host !== null) {\r\n    output += \"//\";\r\n\r\n    if (url.username !== \"\" || url.password !== \"\") {\r\n      output += url.username;\r\n      if (url.password !== \"\") {\r\n        output += \":\" + url.password;\r\n      }\r\n      output += \"@\";\r\n    }\r\n\r\n    output += serializeHost(url.host);\r\n\r\n    if (url.port !== null) {\r\n      output += \":\" + url.port;\r\n    }\r\n  } else if (url.host === null && url.scheme === \"file\") {\r\n    output += \"//\";\r\n  }\r\n\r\n  if (url.cannotBeABaseURL) {\r\n    output += url.path[0];\r\n  } else {\r\n    for (const string of url.path) {\r\n      output += \"/\" + string;\r\n    }\r\n  }\r\n\r\n  if (url.query !== null) {\r\n    output += \"?\" + url.query;\r\n  }\r\n\r\n  if (!excludeFragment && url.fragment !== null) {\r\n    output += \"#\" + url.fragment;\r\n  }\r\n\r\n  return output;\r\n}\r\n\r\nfunction serializeOrigin(tuple) {\r\n  let result = tuple.scheme + \"://\";\r\n  result += serializeHost(tuple.host);\r\n\r\n  if (tuple.port !== null) {\r\n    result += \":\" + tuple.port;\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\nmodule.exports.serializeURL = serializeURL;\r\n\r\nmodule.exports.serializeURLOrigin = function (url) {\r\n  // https://url.spec.whatwg.org/#concept-url-origin\r\n  switch (url.scheme) {\r\n    case \"blob\":\r\n      try {\r\n        return module.exports.serializeURLOrigin(module.exports.parseURL(url.path[0]));\r\n      } catch (e) {\r\n        // serializing an opaque origin returns \"null\"\r\n        return \"null\";\r\n      }\r\n    case \"ftp\":\r\n    case \"gopher\":\r\n    case \"http\":\r\n    case \"https\":\r\n    case \"ws\":\r\n    case \"wss\":\r\n      return serializeOrigin({\r\n        scheme: url.scheme,\r\n        host: url.host,\r\n        port: url.port\r\n      });\r\n    case \"file\":\r\n      // spec says \"exercise to the reader\", chrome says \"file://\"\r\n      return \"file://\";\r\n    default:\r\n      // serializing an opaque origin returns \"null\"\r\n      return \"null\";\r\n  }\r\n};\r\n\r\nmodule.exports.basicURLParse = function (input, options) {\r\n  if (options === undefined) {\r\n    options = {};\r\n  }\r\n\r\n  const usm = new URLStateMachine(input, options.baseURL, options.encodingOverride, options.url, options.stateOverride);\r\n  if (usm.failure) {\r\n    return \"failure\";\r\n  }\r\n\r\n  return usm.url;\r\n};\r\n\r\nmodule.exports.setTheUsername = function (url, username) {\r\n  url.username = \"\";\r\n  const decoded = punycode.ucs2.decode(username);\r\n  for (let i = 0; i < decoded.length; ++i) {\r\n    url.username += percentEncodeChar(decoded[i], isUserinfoPercentEncode);\r\n  }\r\n};\r\n\r\nmodule.exports.setThePassword = function (url, password) {\r\n  url.password = \"\";\r\n  const decoded = punycode.ucs2.decode(password);\r\n  for (let i = 0; i < decoded.length; ++i) {\r\n    url.password += percentEncodeChar(decoded[i], isUserinfoPercentEncode);\r\n  }\r\n};\r\n\r\nmodule.exports.serializeHost = serializeHost;\r\n\r\nmodule.exports.cannotHaveAUsernamePasswordPort = cannotHaveAUsernamePasswordPort;\r\n\r\nmodule.exports.serializeInteger = function (integer) {\r\n  return String(integer);\r\n};\r\n\r\nmodule.exports.parseURL = function (input, options) {\r\n  if (options === undefined) {\r\n    options = {};\r\n  }\r\n\r\n  // We don't handle blobs, so this just delegates:\r\n  return module.exports.basicURLParse(input, { baseURL: options.baseURL, encodingOverride: options.encodingOverride });\r\n};\r\n","\"use strict\";\n\nmodule.exports.mixin = function mixin(target, source) {\n  const keys = Object.getOwnPropertyNames(source);\n  for (let i = 0; i < keys.length; ++i) {\n    Object.defineProperty(target, keys[i], Object.getOwnPropertyDescriptor(source, keys[i]));\n  }\n};\n\nmodule.exports.wrapperSymbol = Symbol(\"wrapper\");\nmodule.exports.implSymbol = Symbol(\"impl\");\n\nmodule.exports.wrapperForImpl = function (impl) {\n  return impl[module.exports.wrapperSymbol];\n};\n\nmodule.exports.implForWrapper = function (wrapper) {\n  return wrapper[module.exports.implSymbol];\n};\n\n","module.exports = require(\"node:fs/promises\");","module.exports = require(\"punycode\");","import fetch from 'cross-fetch';\nexport async function getFile(uri) {\n    let buffer;\n    // let response = await fetch(uri)\n    // if (response?.ok){\n    //   buffer = await response.arrayBuffer();\n    // } else {\n    //   console.log(\"No file found \"+ uri)\n    //   return null\n    // }\n    try {\n        const response = await fetch(uri);\n        if (response?.ok) {\n            buffer = await response.arrayBuffer();\n        }\n        else {\n            console.log(\"No file found \" + uri);\n            return null;\n        }\n    }\n    catch (error) {\n        console.error(\"Failed to fetch URI:\", uri, \"\\nError:\", error);\n        return null;\n    }\n    return buffer;\n}\n//# sourceMappingURL=getFile.js.map","import { readFile } from \"node:fs/promises\";\nexport async function getLocalFile(path) {\n    // let buffer: Buffer;\n    try {\n        const response = await readFile(path);\n        if (response) {\n            return response;\n        }\n        else {\n            return null;\n        }\n        // buffer = await readFile(path);\n    }\n    catch (error) {\n        console.error(\"Failed to read path:\", path, \"\\nError:\", error);\n        return null;\n    }\n}\n//# sourceMappingURL=getLocalFile.js.map","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"stream\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"http\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"url\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"https\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"zlib\");","import Stream from 'stream';\nimport http from 'http';\nimport Url from 'url';\nimport whatwgUrl from 'whatwg-url';\nimport https from 'https';\nimport zlib from 'zlib';\n\n// Based on https://github.com/tmpvar/jsdom/blob/aa85b2abf07766ff7bf5c1f6daafb3726f2f2db5/lib/jsdom/living/blob.js\n\n// fix for \"Readable\" isn't a named export issue\nconst Readable = Stream.Readable;\n\nconst BUFFER = Symbol('buffer');\nconst TYPE = Symbol('type');\n\nclass Blob {\n\tconstructor() {\n\t\tthis[TYPE] = '';\n\n\t\tconst blobParts = arguments[0];\n\t\tconst options = arguments[1];\n\n\t\tconst buffers = [];\n\t\tlet size = 0;\n\n\t\tif (blobParts) {\n\t\t\tconst a = blobParts;\n\t\t\tconst length = Number(a.length);\n\t\t\tfor (let i = 0; i < length; i++) {\n\t\t\t\tconst element = a[i];\n\t\t\t\tlet buffer;\n\t\t\t\tif (element instanceof Buffer) {\n\t\t\t\t\tbuffer = element;\n\t\t\t\t} else if (ArrayBuffer.isView(element)) {\n\t\t\t\t\tbuffer = Buffer.from(element.buffer, element.byteOffset, element.byteLength);\n\t\t\t\t} else if (element instanceof ArrayBuffer) {\n\t\t\t\t\tbuffer = Buffer.from(element);\n\t\t\t\t} else if (element instanceof Blob) {\n\t\t\t\t\tbuffer = element[BUFFER];\n\t\t\t\t} else {\n\t\t\t\t\tbuffer = Buffer.from(typeof element === 'string' ? element : String(element));\n\t\t\t\t}\n\t\t\t\tsize += buffer.length;\n\t\t\t\tbuffers.push(buffer);\n\t\t\t}\n\t\t}\n\n\t\tthis[BUFFER] = Buffer.concat(buffers);\n\n\t\tlet type = options && options.type !== undefined && String(options.type).toLowerCase();\n\t\tif (type && !/[^\\u0020-\\u007E]/.test(type)) {\n\t\t\tthis[TYPE] = type;\n\t\t}\n\t}\n\tget size() {\n\t\treturn this[BUFFER].length;\n\t}\n\tget type() {\n\t\treturn this[TYPE];\n\t}\n\ttext() {\n\t\treturn Promise.resolve(this[BUFFER].toString());\n\t}\n\tarrayBuffer() {\n\t\tconst buf = this[BUFFER];\n\t\tconst ab = buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);\n\t\treturn Promise.resolve(ab);\n\t}\n\tstream() {\n\t\tconst readable = new Readable();\n\t\treadable._read = function () {};\n\t\treadable.push(this[BUFFER]);\n\t\treadable.push(null);\n\t\treturn readable;\n\t}\n\ttoString() {\n\t\treturn '[object Blob]';\n\t}\n\tslice() {\n\t\tconst size = this.size;\n\n\t\tconst start = arguments[0];\n\t\tconst end = arguments[1];\n\t\tlet relativeStart, relativeEnd;\n\t\tif (start === undefined) {\n\t\t\trelativeStart = 0;\n\t\t} else if (start < 0) {\n\t\t\trelativeStart = Math.max(size + start, 0);\n\t\t} else {\n\t\t\trelativeStart = Math.min(start, size);\n\t\t}\n\t\tif (end === undefined) {\n\t\t\trelativeEnd = size;\n\t\t} else if (end < 0) {\n\t\t\trelativeEnd = Math.max(size + end, 0);\n\t\t} else {\n\t\t\trelativeEnd = Math.min(end, size);\n\t\t}\n\t\tconst span = Math.max(relativeEnd - relativeStart, 0);\n\n\t\tconst buffer = this[BUFFER];\n\t\tconst slicedBuffer = buffer.slice(relativeStart, relativeStart + span);\n\t\tconst blob = new Blob([], { type: arguments[2] });\n\t\tblob[BUFFER] = slicedBuffer;\n\t\treturn blob;\n\t}\n}\n\nObject.defineProperties(Blob.prototype, {\n\tsize: { enumerable: true },\n\ttype: { enumerable: true },\n\tslice: { enumerable: true }\n});\n\nObject.defineProperty(Blob.prototype, Symbol.toStringTag, {\n\tvalue: 'Blob',\n\twritable: false,\n\tenumerable: false,\n\tconfigurable: true\n});\n\n/**\n * fetch-error.js\n *\n * FetchError interface for operational errors\n */\n\n/**\n * Create FetchError instance\n *\n * @param   String      message      Error message for human\n * @param   String      type         Error type for machine\n * @param   String      systemError  For Node.js system error\n * @return  FetchError\n */\nfunction FetchError(message, type, systemError) {\n  Error.call(this, message);\n\n  this.message = message;\n  this.type = type;\n\n  // when err.type is `system`, err.code contains system error code\n  if (systemError) {\n    this.code = this.errno = systemError.code;\n  }\n\n  // hide custom error implementation details from end-users\n  Error.captureStackTrace(this, this.constructor);\n}\n\nFetchError.prototype = Object.create(Error.prototype);\nFetchError.prototype.constructor = FetchError;\nFetchError.prototype.name = 'FetchError';\n\nlet convert;\ntry {\n\tconvert = require('encoding').convert;\n} catch (e) {}\n\nconst INTERNALS = Symbol('Body internals');\n\n// fix an issue where \"PassThrough\" isn't a named export for node <10\nconst PassThrough = Stream.PassThrough;\n\n/**\n * Body mixin\n *\n * Ref: https://fetch.spec.whatwg.org/#body\n *\n * @param   Stream  body  Readable stream\n * @param   Object  opts  Response options\n * @return  Void\n */\nfunction Body(body) {\n\tvar _this = this;\n\n\tvar _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n\t    _ref$size = _ref.size;\n\n\tlet size = _ref$size === undefined ? 0 : _ref$size;\n\tvar _ref$timeout = _ref.timeout;\n\tlet timeout = _ref$timeout === undefined ? 0 : _ref$timeout;\n\n\tif (body == null) {\n\t\t// body is undefined or null\n\t\tbody = null;\n\t} else if (isURLSearchParams(body)) {\n\t\t// body is a URLSearchParams\n\t\tbody = Buffer.from(body.toString());\n\t} else if (isBlob(body)) ; else if (Buffer.isBuffer(body)) ; else if (Object.prototype.toString.call(body) === '[object ArrayBuffer]') {\n\t\t// body is ArrayBuffer\n\t\tbody = Buffer.from(body);\n\t} else if (ArrayBuffer.isView(body)) {\n\t\t// body is ArrayBufferView\n\t\tbody = Buffer.from(body.buffer, body.byteOffset, body.byteLength);\n\t} else if (body instanceof Stream) ; else {\n\t\t// none of the above\n\t\t// coerce to string then buffer\n\t\tbody = Buffer.from(String(body));\n\t}\n\tthis[INTERNALS] = {\n\t\tbody,\n\t\tdisturbed: false,\n\t\terror: null\n\t};\n\tthis.size = size;\n\tthis.timeout = timeout;\n\n\tif (body instanceof Stream) {\n\t\tbody.on('error', function (err) {\n\t\t\tconst error = err.name === 'AbortError' ? err : new FetchError(`Invalid response body while trying to fetch ${_this.url}: ${err.message}`, 'system', err);\n\t\t\t_this[INTERNALS].error = error;\n\t\t});\n\t}\n}\n\nBody.prototype = {\n\tget body() {\n\t\treturn this[INTERNALS].body;\n\t},\n\n\tget bodyUsed() {\n\t\treturn this[INTERNALS].disturbed;\n\t},\n\n\t/**\n  * Decode response as ArrayBuffer\n  *\n  * @return  Promise\n  */\n\tarrayBuffer() {\n\t\treturn consumeBody.call(this).then(function (buf) {\n\t\t\treturn buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);\n\t\t});\n\t},\n\n\t/**\n  * Return raw response as Blob\n  *\n  * @return Promise\n  */\n\tblob() {\n\t\tlet ct = this.headers && this.headers.get('content-type') || '';\n\t\treturn consumeBody.call(this).then(function (buf) {\n\t\t\treturn Object.assign(\n\t\t\t// Prevent copying\n\t\t\tnew Blob([], {\n\t\t\t\ttype: ct.toLowerCase()\n\t\t\t}), {\n\t\t\t\t[BUFFER]: buf\n\t\t\t});\n\t\t});\n\t},\n\n\t/**\n  * Decode response as json\n  *\n  * @return  Promise\n  */\n\tjson() {\n\t\tvar _this2 = this;\n\n\t\treturn consumeBody.call(this).then(function (buffer) {\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(buffer.toString());\n\t\t\t} catch (err) {\n\t\t\t\treturn Body.Promise.reject(new FetchError(`invalid json response body at ${_this2.url} reason: ${err.message}`, 'invalid-json'));\n\t\t\t}\n\t\t});\n\t},\n\n\t/**\n  * Decode response as text\n  *\n  * @return  Promise\n  */\n\ttext() {\n\t\treturn consumeBody.call(this).then(function (buffer) {\n\t\t\treturn buffer.toString();\n\t\t});\n\t},\n\n\t/**\n  * Decode response as buffer (non-spec api)\n  *\n  * @return  Promise\n  */\n\tbuffer() {\n\t\treturn consumeBody.call(this);\n\t},\n\n\t/**\n  * Decode response as text, while automatically detecting the encoding and\n  * trying to decode to UTF-8 (non-spec api)\n  *\n  * @return  Promise\n  */\n\ttextConverted() {\n\t\tvar _this3 = this;\n\n\t\treturn consumeBody.call(this).then(function (buffer) {\n\t\t\treturn convertBody(buffer, _this3.headers);\n\t\t});\n\t}\n};\n\n// In browsers, all properties are enumerable.\nObject.defineProperties(Body.prototype, {\n\tbody: { enumerable: true },\n\tbodyUsed: { enumerable: true },\n\tarrayBuffer: { enumerable: true },\n\tblob: { enumerable: true },\n\tjson: { enumerable: true },\n\ttext: { enumerable: true }\n});\n\nBody.mixIn = function (proto) {\n\tfor (const name of Object.getOwnPropertyNames(Body.prototype)) {\n\t\t// istanbul ignore else: future proof\n\t\tif (!(name in proto)) {\n\t\t\tconst desc = Object.getOwnPropertyDescriptor(Body.prototype, name);\n\t\t\tObject.defineProperty(proto, name, desc);\n\t\t}\n\t}\n};\n\n/**\n * Consume and convert an entire Body to a Buffer.\n *\n * Ref: https://fetch.spec.whatwg.org/#concept-body-consume-body\n *\n * @return  Promise\n */\nfunction consumeBody() {\n\tvar _this4 = this;\n\n\tif (this[INTERNALS].disturbed) {\n\t\treturn Body.Promise.reject(new TypeError(`body used already for: ${this.url}`));\n\t}\n\n\tthis[INTERNALS].disturbed = true;\n\n\tif (this[INTERNALS].error) {\n\t\treturn Body.Promise.reject(this[INTERNALS].error);\n\t}\n\n\tlet body = this.body;\n\n\t// body is null\n\tif (body === null) {\n\t\treturn Body.Promise.resolve(Buffer.alloc(0));\n\t}\n\n\t// body is blob\n\tif (isBlob(body)) {\n\t\tbody = body.stream();\n\t}\n\n\t// body is buffer\n\tif (Buffer.isBuffer(body)) {\n\t\treturn Body.Promise.resolve(body);\n\t}\n\n\t// istanbul ignore if: should never happen\n\tif (!(body instanceof Stream)) {\n\t\treturn Body.Promise.resolve(Buffer.alloc(0));\n\t}\n\n\t// body is stream\n\t// get ready to actually consume the body\n\tlet accum = [];\n\tlet accumBytes = 0;\n\tlet abort = false;\n\n\treturn new Body.Promise(function (resolve, reject) {\n\t\tlet resTimeout;\n\n\t\t// allow timeout on slow response body\n\t\tif (_this4.timeout) {\n\t\t\tresTimeout = setTimeout(function () {\n\t\t\t\tabort = true;\n\t\t\t\treject(new FetchError(`Response timeout while trying to fetch ${_this4.url} (over ${_this4.timeout}ms)`, 'body-timeout'));\n\t\t\t}, _this4.timeout);\n\t\t}\n\n\t\t// handle stream errors\n\t\tbody.on('error', function (err) {\n\t\t\tif (err.name === 'AbortError') {\n\t\t\t\t// if the request was aborted, reject with this Error\n\t\t\t\tabort = true;\n\t\t\t\treject(err);\n\t\t\t} else {\n\t\t\t\t// other errors, such as incorrect content-encoding\n\t\t\t\treject(new FetchError(`Invalid response body while trying to fetch ${_this4.url}: ${err.message}`, 'system', err));\n\t\t\t}\n\t\t});\n\n\t\tbody.on('data', function (chunk) {\n\t\t\tif (abort || chunk === null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (_this4.size && accumBytes + chunk.length > _this4.size) {\n\t\t\t\tabort = true;\n\t\t\t\treject(new FetchError(`content size at ${_this4.url} over limit: ${_this4.size}`, 'max-size'));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\taccumBytes += chunk.length;\n\t\t\taccum.push(chunk);\n\t\t});\n\n\t\tbody.on('end', function () {\n\t\t\tif (abort) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tclearTimeout(resTimeout);\n\n\t\t\ttry {\n\t\t\t\tresolve(Buffer.concat(accum, accumBytes));\n\t\t\t} catch (err) {\n\t\t\t\t// handle streams that have accumulated too much data (issue #414)\n\t\t\t\treject(new FetchError(`Could not create Buffer from response body for ${_this4.url}: ${err.message}`, 'system', err));\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Detect buffer encoding and convert to target encoding\n * ref: http://www.w3.org/TR/2011/WD-html5-20110113/parsing.html#determining-the-character-encoding\n *\n * @param   Buffer  buffer    Incoming buffer\n * @param   String  encoding  Target encoding\n * @return  String\n */\nfunction convertBody(buffer, headers) {\n\tif (typeof convert !== 'function') {\n\t\tthrow new Error('The package `encoding` must be installed to use the textConverted() function');\n\t}\n\n\tconst ct = headers.get('content-type');\n\tlet charset = 'utf-8';\n\tlet res, str;\n\n\t// header\n\tif (ct) {\n\t\tres = /charset=([^;]*)/i.exec(ct);\n\t}\n\n\t// no charset in content type, peek at response body for at most 1024 bytes\n\tstr = buffer.slice(0, 1024).toString();\n\n\t// html5\n\tif (!res && str) {\n\t\tres = /<meta.+?charset=(['\"])(.+?)\\1/i.exec(str);\n\t}\n\n\t// html4\n\tif (!res && str) {\n\t\tres = /<meta[\\s]+?http-equiv=(['\"])content-type\\1[\\s]+?content=(['\"])(.+?)\\2/i.exec(str);\n\t\tif (!res) {\n\t\t\tres = /<meta[\\s]+?content=(['\"])(.+?)\\1[\\s]+?http-equiv=(['\"])content-type\\3/i.exec(str);\n\t\t\tif (res) {\n\t\t\t\tres.pop(); // drop last quote\n\t\t\t}\n\t\t}\n\n\t\tif (res) {\n\t\t\tres = /charset=(.*)/i.exec(res.pop());\n\t\t}\n\t}\n\n\t// xml\n\tif (!res && str) {\n\t\tres = /<\\?xml.+?encoding=(['\"])(.+?)\\1/i.exec(str);\n\t}\n\n\t// found charset\n\tif (res) {\n\t\tcharset = res.pop();\n\n\t\t// prevent decode issues when sites use incorrect encoding\n\t\t// ref: https://hsivonen.fi/encoding-menu/\n\t\tif (charset === 'gb2312' || charset === 'gbk') {\n\t\t\tcharset = 'gb18030';\n\t\t}\n\t}\n\n\t// turn raw buffers into a single utf-8 buffer\n\treturn convert(buffer, 'UTF-8', charset).toString();\n}\n\n/**\n * Detect a URLSearchParams object\n * ref: https://github.com/bitinn/node-fetch/issues/296#issuecomment-307598143\n *\n * @param   Object  obj     Object to detect by type or brand\n * @return  String\n */\nfunction isURLSearchParams(obj) {\n\t// Duck-typing as a necessary condition.\n\tif (typeof obj !== 'object' || typeof obj.append !== 'function' || typeof obj.delete !== 'function' || typeof obj.get !== 'function' || typeof obj.getAll !== 'function' || typeof obj.has !== 'function' || typeof obj.set !== 'function') {\n\t\treturn false;\n\t}\n\n\t// Brand-checking and more duck-typing as optional condition.\n\treturn obj.constructor.name === 'URLSearchParams' || Object.prototype.toString.call(obj) === '[object URLSearchParams]' || typeof obj.sort === 'function';\n}\n\n/**\n * Check if `obj` is a W3C `Blob` object (which `File` inherits from)\n * @param  {*} obj\n * @return {boolean}\n */\nfunction isBlob(obj) {\n\treturn typeof obj === 'object' && typeof obj.arrayBuffer === 'function' && typeof obj.type === 'string' && typeof obj.stream === 'function' && typeof obj.constructor === 'function' && typeof obj.constructor.name === 'string' && /^(Blob|File)$/.test(obj.constructor.name) && /^(Blob|File)$/.test(obj[Symbol.toStringTag]);\n}\n\n/**\n * Clone body given Res/Req instance\n *\n * @param   Mixed  instance  Response or Request instance\n * @return  Mixed\n */\nfunction clone(instance) {\n\tlet p1, p2;\n\tlet body = instance.body;\n\n\t// don't allow cloning a used body\n\tif (instance.bodyUsed) {\n\t\tthrow new Error('cannot clone body after it is used');\n\t}\n\n\t// check that body is a stream and not form-data object\n\t// note: we can't clone the form-data object without having it as a dependency\n\tif (body instanceof Stream && typeof body.getBoundary !== 'function') {\n\t\t// tee instance body\n\t\tp1 = new PassThrough();\n\t\tp2 = new PassThrough();\n\t\tbody.pipe(p1);\n\t\tbody.pipe(p2);\n\t\t// set instance body to teed body and return the other teed body\n\t\tinstance[INTERNALS].body = p1;\n\t\tbody = p2;\n\t}\n\n\treturn body;\n}\n\n/**\n * Performs the operation \"extract a `Content-Type` value from |object|\" as\n * specified in the specification:\n * https://fetch.spec.whatwg.org/#concept-bodyinit-extract\n *\n * This function assumes that instance.body is present.\n *\n * @param   Mixed  instance  Any options.body input\n */\nfunction extractContentType(body) {\n\tif (body === null) {\n\t\t// body is null\n\t\treturn null;\n\t} else if (typeof body === 'string') {\n\t\t// body is string\n\t\treturn 'text/plain;charset=UTF-8';\n\t} else if (isURLSearchParams(body)) {\n\t\t// body is a URLSearchParams\n\t\treturn 'application/x-www-form-urlencoded;charset=UTF-8';\n\t} else if (isBlob(body)) {\n\t\t// body is blob\n\t\treturn body.type || null;\n\t} else if (Buffer.isBuffer(body)) {\n\t\t// body is buffer\n\t\treturn null;\n\t} else if (Object.prototype.toString.call(body) === '[object ArrayBuffer]') {\n\t\t// body is ArrayBuffer\n\t\treturn null;\n\t} else if (ArrayBuffer.isView(body)) {\n\t\t// body is ArrayBufferView\n\t\treturn null;\n\t} else if (typeof body.getBoundary === 'function') {\n\t\t// detect form data input from form-data module\n\t\treturn `multipart/form-data;boundary=${body.getBoundary()}`;\n\t} else if (body instanceof Stream) {\n\t\t// body is stream\n\t\t// can't really do much about this\n\t\treturn null;\n\t} else {\n\t\t// Body constructor defaults other things to string\n\t\treturn 'text/plain;charset=UTF-8';\n\t}\n}\n\n/**\n * The Fetch Standard treats this as if \"total bytes\" is a property on the body.\n * For us, we have to explicitly get it with a function.\n *\n * ref: https://fetch.spec.whatwg.org/#concept-body-total-bytes\n *\n * @param   Body    instance   Instance of Body\n * @return  Number?            Number of bytes, or null if not possible\n */\nfunction getTotalBytes(instance) {\n\tconst body = instance.body;\n\n\n\tif (body === null) {\n\t\t// body is null\n\t\treturn 0;\n\t} else if (isBlob(body)) {\n\t\treturn body.size;\n\t} else if (Buffer.isBuffer(body)) {\n\t\t// body is buffer\n\t\treturn body.length;\n\t} else if (body && typeof body.getLengthSync === 'function') {\n\t\t// detect form data input from form-data module\n\t\tif (body._lengthRetrievers && body._lengthRetrievers.length == 0 || // 1.x\n\t\tbody.hasKnownLength && body.hasKnownLength()) {\n\t\t\t// 2.x\n\t\t\treturn body.getLengthSync();\n\t\t}\n\t\treturn null;\n\t} else {\n\t\t// body is stream\n\t\treturn null;\n\t}\n}\n\n/**\n * Write a Body to a Node.js WritableStream (e.g. http.Request) object.\n *\n * @param   Body    instance   Instance of Body\n * @return  Void\n */\nfunction writeToStream(dest, instance) {\n\tconst body = instance.body;\n\n\n\tif (body === null) {\n\t\t// body is null\n\t\tdest.end();\n\t} else if (isBlob(body)) {\n\t\tbody.stream().pipe(dest);\n\t} else if (Buffer.isBuffer(body)) {\n\t\t// body is buffer\n\t\tdest.write(body);\n\t\tdest.end();\n\t} else {\n\t\t// body is stream\n\t\tbody.pipe(dest);\n\t}\n}\n\n// expose Promise\nBody.Promise = global.Promise;\n\n/**\n * headers.js\n *\n * Headers class offers convenient helpers\n */\n\nconst invalidTokenRegex = /[^\\^_`a-zA-Z\\-0-9!#$%&'*+.|~]/;\nconst invalidHeaderCharRegex = /[^\\t\\x20-\\x7e\\x80-\\xff]/;\n\nfunction validateName(name) {\n\tname = `${name}`;\n\tif (invalidTokenRegex.test(name) || name === '') {\n\t\tthrow new TypeError(`${name} is not a legal HTTP header name`);\n\t}\n}\n\nfunction validateValue(value) {\n\tvalue = `${value}`;\n\tif (invalidHeaderCharRegex.test(value)) {\n\t\tthrow new TypeError(`${value} is not a legal HTTP header value`);\n\t}\n}\n\n/**\n * Find the key in the map object given a header name.\n *\n * Returns undefined if not found.\n *\n * @param   String  name  Header name\n * @return  String|Undefined\n */\nfunction find(map, name) {\n\tname = name.toLowerCase();\n\tfor (const key in map) {\n\t\tif (key.toLowerCase() === name) {\n\t\t\treturn key;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nconst MAP = Symbol('map');\nclass Headers {\n\t/**\n  * Headers class\n  *\n  * @param   Object  headers  Response headers\n  * @return  Void\n  */\n\tconstructor() {\n\t\tlet init = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : undefined;\n\n\t\tthis[MAP] = Object.create(null);\n\n\t\tif (init instanceof Headers) {\n\t\t\tconst rawHeaders = init.raw();\n\t\t\tconst headerNames = Object.keys(rawHeaders);\n\n\t\t\tfor (const headerName of headerNames) {\n\t\t\t\tfor (const value of rawHeaders[headerName]) {\n\t\t\t\t\tthis.append(headerName, value);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\t// We don't worry about converting prop to ByteString here as append()\n\t\t// will handle it.\n\t\tif (init == null) ; else if (typeof init === 'object') {\n\t\t\tconst method = init[Symbol.iterator];\n\t\t\tif (method != null) {\n\t\t\t\tif (typeof method !== 'function') {\n\t\t\t\t\tthrow new TypeError('Header pairs must be iterable');\n\t\t\t\t}\n\n\t\t\t\t// sequence<sequence<ByteString>>\n\t\t\t\t// Note: per spec we have to first exhaust the lists then process them\n\t\t\t\tconst pairs = [];\n\t\t\t\tfor (const pair of init) {\n\t\t\t\t\tif (typeof pair !== 'object' || typeof pair[Symbol.iterator] !== 'function') {\n\t\t\t\t\t\tthrow new TypeError('Each header pair must be iterable');\n\t\t\t\t\t}\n\t\t\t\t\tpairs.push(Array.from(pair));\n\t\t\t\t}\n\n\t\t\t\tfor (const pair of pairs) {\n\t\t\t\t\tif (pair.length !== 2) {\n\t\t\t\t\t\tthrow new TypeError('Each header pair must be a name/value tuple');\n\t\t\t\t\t}\n\t\t\t\t\tthis.append(pair[0], pair[1]);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// record<ByteString, ByteString>\n\t\t\t\tfor (const key of Object.keys(init)) {\n\t\t\t\t\tconst value = init[key];\n\t\t\t\t\tthis.append(key, value);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthrow new TypeError('Provided initializer must be an object');\n\t\t}\n\t}\n\n\t/**\n  * Return combined header value given name\n  *\n  * @param   String  name  Header name\n  * @return  Mixed\n  */\n\tget(name) {\n\t\tname = `${name}`;\n\t\tvalidateName(name);\n\t\tconst key = find(this[MAP], name);\n\t\tif (key === undefined) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn this[MAP][key].join(', ');\n\t}\n\n\t/**\n  * Iterate over all headers\n  *\n  * @param   Function  callback  Executed for each item with parameters (value, name, thisArg)\n  * @param   Boolean   thisArg   `this` context for callback function\n  * @return  Void\n  */\n\tforEach(callback) {\n\t\tlet thisArg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;\n\n\t\tlet pairs = getHeaders(this);\n\t\tlet i = 0;\n\t\twhile (i < pairs.length) {\n\t\t\tvar _pairs$i = pairs[i];\n\t\t\tconst name = _pairs$i[0],\n\t\t\t      value = _pairs$i[1];\n\n\t\t\tcallback.call(thisArg, value, name, this);\n\t\t\tpairs = getHeaders(this);\n\t\t\ti++;\n\t\t}\n\t}\n\n\t/**\n  * Overwrite header values given name\n  *\n  * @param   String  name   Header name\n  * @param   String  value  Header value\n  * @return  Void\n  */\n\tset(name, value) {\n\t\tname = `${name}`;\n\t\tvalue = `${value}`;\n\t\tvalidateName(name);\n\t\tvalidateValue(value);\n\t\tconst key = find(this[MAP], name);\n\t\tthis[MAP][key !== undefined ? key : name] = [value];\n\t}\n\n\t/**\n  * Append a value onto existing header\n  *\n  * @param   String  name   Header name\n  * @param   String  value  Header value\n  * @return  Void\n  */\n\tappend(name, value) {\n\t\tname = `${name}`;\n\t\tvalue = `${value}`;\n\t\tvalidateName(name);\n\t\tvalidateValue(value);\n\t\tconst key = find(this[MAP], name);\n\t\tif (key !== undefined) {\n\t\t\tthis[MAP][key].push(value);\n\t\t} else {\n\t\t\tthis[MAP][name] = [value];\n\t\t}\n\t}\n\n\t/**\n  * Check for header name existence\n  *\n  * @param   String   name  Header name\n  * @return  Boolean\n  */\n\thas(name) {\n\t\tname = `${name}`;\n\t\tvalidateName(name);\n\t\treturn find(this[MAP], name) !== undefined;\n\t}\n\n\t/**\n  * Delete all header values given name\n  *\n  * @param   String  name  Header name\n  * @return  Void\n  */\n\tdelete(name) {\n\t\tname = `${name}`;\n\t\tvalidateName(name);\n\t\tconst key = find(this[MAP], name);\n\t\tif (key !== undefined) {\n\t\t\tdelete this[MAP][key];\n\t\t}\n\t}\n\n\t/**\n  * Return raw headers (non-spec api)\n  *\n  * @return  Object\n  */\n\traw() {\n\t\treturn this[MAP];\n\t}\n\n\t/**\n  * Get an iterator on keys.\n  *\n  * @return  Iterator\n  */\n\tkeys() {\n\t\treturn createHeadersIterator(this, 'key');\n\t}\n\n\t/**\n  * Get an iterator on values.\n  *\n  * @return  Iterator\n  */\n\tvalues() {\n\t\treturn createHeadersIterator(this, 'value');\n\t}\n\n\t/**\n  * Get an iterator on entries.\n  *\n  * This is the default iterator of the Headers object.\n  *\n  * @return  Iterator\n  */\n\t[Symbol.iterator]() {\n\t\treturn createHeadersIterator(this, 'key+value');\n\t}\n}\nHeaders.prototype.entries = Headers.prototype[Symbol.iterator];\n\nObject.defineProperty(Headers.prototype, Symbol.toStringTag, {\n\tvalue: 'Headers',\n\twritable: false,\n\tenumerable: false,\n\tconfigurable: true\n});\n\nObject.defineProperties(Headers.prototype, {\n\tget: { enumerable: true },\n\tforEach: { enumerable: true },\n\tset: { enumerable: true },\n\tappend: { enumerable: true },\n\thas: { enumerable: true },\n\tdelete: { enumerable: true },\n\tkeys: { enumerable: true },\n\tvalues: { enumerable: true },\n\tentries: { enumerable: true }\n});\n\nfunction getHeaders(headers) {\n\tlet kind = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'key+value';\n\n\tconst keys = Object.keys(headers[MAP]).sort();\n\treturn keys.map(kind === 'key' ? function (k) {\n\t\treturn k.toLowerCase();\n\t} : kind === 'value' ? function (k) {\n\t\treturn headers[MAP][k].join(', ');\n\t} : function (k) {\n\t\treturn [k.toLowerCase(), headers[MAP][k].join(', ')];\n\t});\n}\n\nconst INTERNAL = Symbol('internal');\n\nfunction createHeadersIterator(target, kind) {\n\tconst iterator = Object.create(HeadersIteratorPrototype);\n\titerator[INTERNAL] = {\n\t\ttarget,\n\t\tkind,\n\t\tindex: 0\n\t};\n\treturn iterator;\n}\n\nconst HeadersIteratorPrototype = Object.setPrototypeOf({\n\tnext() {\n\t\t// istanbul ignore if\n\t\tif (!this || Object.getPrototypeOf(this) !== HeadersIteratorPrototype) {\n\t\t\tthrow new TypeError('Value of `this` is not a HeadersIterator');\n\t\t}\n\n\t\tvar _INTERNAL = this[INTERNAL];\n\t\tconst target = _INTERNAL.target,\n\t\t      kind = _INTERNAL.kind,\n\t\t      index = _INTERNAL.index;\n\n\t\tconst values = getHeaders(target, kind);\n\t\tconst len = values.length;\n\t\tif (index >= len) {\n\t\t\treturn {\n\t\t\t\tvalue: undefined,\n\t\t\t\tdone: true\n\t\t\t};\n\t\t}\n\n\t\tthis[INTERNAL].index = index + 1;\n\n\t\treturn {\n\t\t\tvalue: values[index],\n\t\t\tdone: false\n\t\t};\n\t}\n}, Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())));\n\nObject.defineProperty(HeadersIteratorPrototype, Symbol.toStringTag, {\n\tvalue: 'HeadersIterator',\n\twritable: false,\n\tenumerable: false,\n\tconfigurable: true\n});\n\n/**\n * Export the Headers object in a form that Node.js can consume.\n *\n * @param   Headers  headers\n * @return  Object\n */\nfunction exportNodeCompatibleHeaders(headers) {\n\tconst obj = Object.assign({ __proto__: null }, headers[MAP]);\n\n\t// http.request() only supports string as Host header. This hack makes\n\t// specifying custom Host header possible.\n\tconst hostHeaderKey = find(headers[MAP], 'Host');\n\tif (hostHeaderKey !== undefined) {\n\t\tobj[hostHeaderKey] = obj[hostHeaderKey][0];\n\t}\n\n\treturn obj;\n}\n\n/**\n * Create a Headers object from an object of headers, ignoring those that do\n * not conform to HTTP grammar productions.\n *\n * @param   Object  obj  Object of headers\n * @return  Headers\n */\nfunction createHeadersLenient(obj) {\n\tconst headers = new Headers();\n\tfor (const name of Object.keys(obj)) {\n\t\tif (invalidTokenRegex.test(name)) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (Array.isArray(obj[name])) {\n\t\t\tfor (const val of obj[name]) {\n\t\t\t\tif (invalidHeaderCharRegex.test(val)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (headers[MAP][name] === undefined) {\n\t\t\t\t\theaders[MAP][name] = [val];\n\t\t\t\t} else {\n\t\t\t\t\theaders[MAP][name].push(val);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (!invalidHeaderCharRegex.test(obj[name])) {\n\t\t\theaders[MAP][name] = [obj[name]];\n\t\t}\n\t}\n\treturn headers;\n}\n\nconst INTERNALS$1 = Symbol('Response internals');\n\n// fix an issue where \"STATUS_CODES\" aren't a named export for node <10\nconst STATUS_CODES = http.STATUS_CODES;\n\n/**\n * Response class\n *\n * @param   Stream  body  Readable stream\n * @param   Object  opts  Response options\n * @return  Void\n */\nclass Response {\n\tconstructor() {\n\t\tlet body = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\t\tlet opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t\tBody.call(this, body, opts);\n\n\t\tconst status = opts.status || 200;\n\t\tconst headers = new Headers(opts.headers);\n\n\t\tif (body != null && !headers.has('Content-Type')) {\n\t\t\tconst contentType = extractContentType(body);\n\t\t\tif (contentType) {\n\t\t\t\theaders.append('Content-Type', contentType);\n\t\t\t}\n\t\t}\n\n\t\tthis[INTERNALS$1] = {\n\t\t\turl: opts.url,\n\t\t\tstatus,\n\t\t\tstatusText: opts.statusText || STATUS_CODES[status],\n\t\t\theaders,\n\t\t\tcounter: opts.counter\n\t\t};\n\t}\n\n\tget url() {\n\t\treturn this[INTERNALS$1].url || '';\n\t}\n\n\tget status() {\n\t\treturn this[INTERNALS$1].status;\n\t}\n\n\t/**\n  * Convenience property representing if the request ended normally\n  */\n\tget ok() {\n\t\treturn this[INTERNALS$1].status >= 200 && this[INTERNALS$1].status < 300;\n\t}\n\n\tget redirected() {\n\t\treturn this[INTERNALS$1].counter > 0;\n\t}\n\n\tget statusText() {\n\t\treturn this[INTERNALS$1].statusText;\n\t}\n\n\tget headers() {\n\t\treturn this[INTERNALS$1].headers;\n\t}\n\n\t/**\n  * Clone this response\n  *\n  * @return  Response\n  */\n\tclone() {\n\t\treturn new Response(clone(this), {\n\t\t\turl: this.url,\n\t\t\tstatus: this.status,\n\t\t\tstatusText: this.statusText,\n\t\t\theaders: this.headers,\n\t\t\tok: this.ok,\n\t\t\tredirected: this.redirected\n\t\t});\n\t}\n}\n\nBody.mixIn(Response.prototype);\n\nObject.defineProperties(Response.prototype, {\n\turl: { enumerable: true },\n\tstatus: { enumerable: true },\n\tok: { enumerable: true },\n\tredirected: { enumerable: true },\n\tstatusText: { enumerable: true },\n\theaders: { enumerable: true },\n\tclone: { enumerable: true }\n});\n\nObject.defineProperty(Response.prototype, Symbol.toStringTag, {\n\tvalue: 'Response',\n\twritable: false,\n\tenumerable: false,\n\tconfigurable: true\n});\n\nconst INTERNALS$2 = Symbol('Request internals');\nconst URL = Url.URL || whatwgUrl.URL;\n\n// fix an issue where \"format\", \"parse\" aren't a named export for node <10\nconst parse_url = Url.parse;\nconst format_url = Url.format;\n\n/**\n * Wrapper around `new URL` to handle arbitrary URLs\n *\n * @param  {string} urlStr\n * @return {void}\n */\nfunction parseURL(urlStr) {\n\t/*\n \tCheck whether the URL is absolute or not\n \t\tScheme: https://tools.ietf.org/html/rfc3986#section-3.1\n \tAbsolute URL: https://tools.ietf.org/html/rfc3986#section-4.3\n */\n\tif (/^[a-zA-Z][a-zA-Z\\d+\\-.]*:/.exec(urlStr)) {\n\t\turlStr = new URL(urlStr).toString();\n\t}\n\n\t// Fallback to old implementation for arbitrary URLs\n\treturn parse_url(urlStr);\n}\n\nconst streamDestructionSupported = 'destroy' in Stream.Readable.prototype;\n\n/**\n * Check if a value is an instance of Request.\n *\n * @param   Mixed   input\n * @return  Boolean\n */\nfunction isRequest(input) {\n\treturn typeof input === 'object' && typeof input[INTERNALS$2] === 'object';\n}\n\nfunction isAbortSignal(signal) {\n\tconst proto = signal && typeof signal === 'object' && Object.getPrototypeOf(signal);\n\treturn !!(proto && proto.constructor.name === 'AbortSignal');\n}\n\n/**\n * Request class\n *\n * @param   Mixed   input  Url or Request instance\n * @param   Object  init   Custom options\n * @return  Void\n */\nclass Request {\n\tconstructor(input) {\n\t\tlet init = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t\tlet parsedURL;\n\n\t\t// normalize input\n\t\tif (!isRequest(input)) {\n\t\t\tif (input && input.href) {\n\t\t\t\t// in order to support Node.js' Url objects; though WHATWG's URL objects\n\t\t\t\t// will fall into this branch also (since their `toString()` will return\n\t\t\t\t// `href` property anyway)\n\t\t\t\tparsedURL = parseURL(input.href);\n\t\t\t} else {\n\t\t\t\t// coerce input to a string before attempting to parse\n\t\t\t\tparsedURL = parseURL(`${input}`);\n\t\t\t}\n\t\t\tinput = {};\n\t\t} else {\n\t\t\tparsedURL = parseURL(input.url);\n\t\t}\n\n\t\tlet method = init.method || input.method || 'GET';\n\t\tmethod = method.toUpperCase();\n\n\t\tif ((init.body != null || isRequest(input) && input.body !== null) && (method === 'GET' || method === 'HEAD')) {\n\t\t\tthrow new TypeError('Request with GET/HEAD method cannot have body');\n\t\t}\n\n\t\tlet inputBody = init.body != null ? init.body : isRequest(input) && input.body !== null ? clone(input) : null;\n\n\t\tBody.call(this, inputBody, {\n\t\t\ttimeout: init.timeout || input.timeout || 0,\n\t\t\tsize: init.size || input.size || 0\n\t\t});\n\n\t\tconst headers = new Headers(init.headers || input.headers || {});\n\n\t\tif (inputBody != null && !headers.has('Content-Type')) {\n\t\t\tconst contentType = extractContentType(inputBody);\n\t\t\tif (contentType) {\n\t\t\t\theaders.append('Content-Type', contentType);\n\t\t\t}\n\t\t}\n\n\t\tlet signal = isRequest(input) ? input.signal : null;\n\t\tif ('signal' in init) signal = init.signal;\n\n\t\tif (signal != null && !isAbortSignal(signal)) {\n\t\t\tthrow new TypeError('Expected signal to be an instanceof AbortSignal');\n\t\t}\n\n\t\tthis[INTERNALS$2] = {\n\t\t\tmethod,\n\t\t\tredirect: init.redirect || input.redirect || 'follow',\n\t\t\theaders,\n\t\t\tparsedURL,\n\t\t\tsignal\n\t\t};\n\n\t\t// node-fetch-only options\n\t\tthis.follow = init.follow !== undefined ? init.follow : input.follow !== undefined ? input.follow : 20;\n\t\tthis.compress = init.compress !== undefined ? init.compress : input.compress !== undefined ? input.compress : true;\n\t\tthis.counter = init.counter || input.counter || 0;\n\t\tthis.agent = init.agent || input.agent;\n\t}\n\n\tget method() {\n\t\treturn this[INTERNALS$2].method;\n\t}\n\n\tget url() {\n\t\treturn format_url(this[INTERNALS$2].parsedURL);\n\t}\n\n\tget headers() {\n\t\treturn this[INTERNALS$2].headers;\n\t}\n\n\tget redirect() {\n\t\treturn this[INTERNALS$2].redirect;\n\t}\n\n\tget signal() {\n\t\treturn this[INTERNALS$2].signal;\n\t}\n\n\t/**\n  * Clone this request\n  *\n  * @return  Request\n  */\n\tclone() {\n\t\treturn new Request(this);\n\t}\n}\n\nBody.mixIn(Request.prototype);\n\nObject.defineProperty(Request.prototype, Symbol.toStringTag, {\n\tvalue: 'Request',\n\twritable: false,\n\tenumerable: false,\n\tconfigurable: true\n});\n\nObject.defineProperties(Request.prototype, {\n\tmethod: { enumerable: true },\n\turl: { enumerable: true },\n\theaders: { enumerable: true },\n\tredirect: { enumerable: true },\n\tclone: { enumerable: true },\n\tsignal: { enumerable: true }\n});\n\n/**\n * Convert a Request to Node.js http request options.\n *\n * @param   Request  A Request instance\n * @return  Object   The options object to be passed to http.request\n */\nfunction getNodeRequestOptions(request) {\n\tconst parsedURL = request[INTERNALS$2].parsedURL;\n\tconst headers = new Headers(request[INTERNALS$2].headers);\n\n\t// fetch step 1.3\n\tif (!headers.has('Accept')) {\n\t\theaders.set('Accept', '*/*');\n\t}\n\n\t// Basic fetch\n\tif (!parsedURL.protocol || !parsedURL.hostname) {\n\t\tthrow new TypeError('Only absolute URLs are supported');\n\t}\n\n\tif (!/^https?:$/.test(parsedURL.protocol)) {\n\t\tthrow new TypeError('Only HTTP(S) protocols are supported');\n\t}\n\n\tif (request.signal && request.body instanceof Stream.Readable && !streamDestructionSupported) {\n\t\tthrow new Error('Cancellation of streamed requests with AbortSignal is not supported in node < 8');\n\t}\n\n\t// HTTP-network-or-cache fetch steps 2.4-2.7\n\tlet contentLengthValue = null;\n\tif (request.body == null && /^(POST|PUT)$/i.test(request.method)) {\n\t\tcontentLengthValue = '0';\n\t}\n\tif (request.body != null) {\n\t\tconst totalBytes = getTotalBytes(request);\n\t\tif (typeof totalBytes === 'number') {\n\t\t\tcontentLengthValue = String(totalBytes);\n\t\t}\n\t}\n\tif (contentLengthValue) {\n\t\theaders.set('Content-Length', contentLengthValue);\n\t}\n\n\t// HTTP-network-or-cache fetch step 2.11\n\tif (!headers.has('User-Agent')) {\n\t\theaders.set('User-Agent', 'node-fetch/1.0 (+https://github.com/bitinn/node-fetch)');\n\t}\n\n\t// HTTP-network-or-cache fetch step 2.15\n\tif (request.compress && !headers.has('Accept-Encoding')) {\n\t\theaders.set('Accept-Encoding', 'gzip,deflate');\n\t}\n\n\tlet agent = request.agent;\n\tif (typeof agent === 'function') {\n\t\tagent = agent(parsedURL);\n\t}\n\n\t// HTTP-network fetch step 4.2\n\t// chunked encoding is handled by Node.js\n\n\treturn Object.assign({}, parsedURL, {\n\t\tmethod: request.method,\n\t\theaders: exportNodeCompatibleHeaders(headers),\n\t\tagent\n\t});\n}\n\n/**\n * abort-error.js\n *\n * AbortError interface for cancelled requests\n */\n\n/**\n * Create AbortError instance\n *\n * @param   String      message      Error message for human\n * @return  AbortError\n */\nfunction AbortError(message) {\n  Error.call(this, message);\n\n  this.type = 'aborted';\n  this.message = message;\n\n  // hide custom error implementation details from end-users\n  Error.captureStackTrace(this, this.constructor);\n}\n\nAbortError.prototype = Object.create(Error.prototype);\nAbortError.prototype.constructor = AbortError;\nAbortError.prototype.name = 'AbortError';\n\nconst URL$1 = Url.URL || whatwgUrl.URL;\n\n// fix an issue where \"PassThrough\", \"resolve\" aren't a named export for node <10\nconst PassThrough$1 = Stream.PassThrough;\n\nconst isDomainOrSubdomain = function isDomainOrSubdomain(destination, original) {\n\tconst orig = new URL$1(original).hostname;\n\tconst dest = new URL$1(destination).hostname;\n\n\treturn orig === dest || orig[orig.length - dest.length - 1] === '.' && orig.endsWith(dest);\n};\n\n/**\n * isSameProtocol reports whether the two provided URLs use the same protocol.\n *\n * Both domains must already be in canonical form.\n * @param {string|URL} original\n * @param {string|URL} destination\n */\nconst isSameProtocol = function isSameProtocol(destination, original) {\n\tconst orig = new URL$1(original).protocol;\n\tconst dest = new URL$1(destination).protocol;\n\n\treturn orig === dest;\n};\n\n/**\n * Fetch function\n *\n * @param   Mixed    url   Absolute url or Request instance\n * @param   Object   opts  Fetch options\n * @return  Promise\n */\nfunction fetch(url, opts) {\n\n\t// allow custom promise\n\tif (!fetch.Promise) {\n\t\tthrow new Error('native promise missing, set fetch.Promise to your favorite alternative');\n\t}\n\n\tBody.Promise = fetch.Promise;\n\n\t// wrap http.request into fetch\n\treturn new fetch.Promise(function (resolve, reject) {\n\t\t// build request object\n\t\tconst request = new Request(url, opts);\n\t\tconst options = getNodeRequestOptions(request);\n\n\t\tconst send = (options.protocol === 'https:' ? https : http).request;\n\t\tconst signal = request.signal;\n\n\t\tlet response = null;\n\n\t\tconst abort = function abort() {\n\t\t\tlet error = new AbortError('The user aborted a request.');\n\t\t\treject(error);\n\t\t\tif (request.body && request.body instanceof Stream.Readable) {\n\t\t\t\tdestroyStream(request.body, error);\n\t\t\t}\n\t\t\tif (!response || !response.body) return;\n\t\t\tresponse.body.emit('error', error);\n\t\t};\n\n\t\tif (signal && signal.aborted) {\n\t\t\tabort();\n\t\t\treturn;\n\t\t}\n\n\t\tconst abortAndFinalize = function abortAndFinalize() {\n\t\t\tabort();\n\t\t\tfinalize();\n\t\t};\n\n\t\t// send request\n\t\tconst req = send(options);\n\t\tlet reqTimeout;\n\n\t\tif (signal) {\n\t\t\tsignal.addEventListener('abort', abortAndFinalize);\n\t\t}\n\n\t\tfunction finalize() {\n\t\t\treq.abort();\n\t\t\tif (signal) signal.removeEventListener('abort', abortAndFinalize);\n\t\t\tclearTimeout(reqTimeout);\n\t\t}\n\n\t\tif (request.timeout) {\n\t\t\treq.once('socket', function (socket) {\n\t\t\t\treqTimeout = setTimeout(function () {\n\t\t\t\t\treject(new FetchError(`network timeout at: ${request.url}`, 'request-timeout'));\n\t\t\t\t\tfinalize();\n\t\t\t\t}, request.timeout);\n\t\t\t});\n\t\t}\n\n\t\treq.on('error', function (err) {\n\t\t\treject(new FetchError(`request to ${request.url} failed, reason: ${err.message}`, 'system', err));\n\n\t\t\tif (response && response.body) {\n\t\t\t\tdestroyStream(response.body, err);\n\t\t\t}\n\n\t\t\tfinalize();\n\t\t});\n\n\t\tfixResponseChunkedTransferBadEnding(req, function (err) {\n\t\t\tif (signal && signal.aborted) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (response && response.body) {\n\t\t\t\tdestroyStream(response.body, err);\n\t\t\t}\n\t\t});\n\n\t\t/* c8 ignore next 18 */\n\t\tif (parseInt(process.version.substring(1)) < 14) {\n\t\t\t// Before Node.js 14, pipeline() does not fully support async iterators and does not always\n\t\t\t// properly handle when the socket close/end events are out of order.\n\t\t\treq.on('socket', function (s) {\n\t\t\t\ts.addListener('close', function (hadError) {\n\t\t\t\t\t// if a data listener is still present we didn't end cleanly\n\t\t\t\t\tconst hasDataListener = s.listenerCount('data') > 0;\n\n\t\t\t\t\t// if end happened before close but the socket didn't emit an error, do it now\n\t\t\t\t\tif (response && hasDataListener && !hadError && !(signal && signal.aborted)) {\n\t\t\t\t\t\tconst err = new Error('Premature close');\n\t\t\t\t\t\terr.code = 'ERR_STREAM_PREMATURE_CLOSE';\n\t\t\t\t\t\tresponse.body.emit('error', err);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\treq.on('response', function (res) {\n\t\t\tclearTimeout(reqTimeout);\n\n\t\t\tconst headers = createHeadersLenient(res.headers);\n\n\t\t\t// HTTP fetch step 5\n\t\t\tif (fetch.isRedirect(res.statusCode)) {\n\t\t\t\t// HTTP fetch step 5.2\n\t\t\t\tconst location = headers.get('Location');\n\n\t\t\t\t// HTTP fetch step 5.3\n\t\t\t\tlet locationURL = null;\n\t\t\t\ttry {\n\t\t\t\t\tlocationURL = location === null ? null : new URL$1(location, request.url).toString();\n\t\t\t\t} catch (err) {\n\t\t\t\t\t// error here can only be invalid URL in Location: header\n\t\t\t\t\t// do not throw when options.redirect == manual\n\t\t\t\t\t// let the user extract the errorneous redirect URL\n\t\t\t\t\tif (request.redirect !== 'manual') {\n\t\t\t\t\t\treject(new FetchError(`uri requested responds with an invalid redirect URL: ${location}`, 'invalid-redirect'));\n\t\t\t\t\t\tfinalize();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// HTTP fetch step 5.5\n\t\t\t\tswitch (request.redirect) {\n\t\t\t\t\tcase 'error':\n\t\t\t\t\t\treject(new FetchError(`uri requested responds with a redirect, redirect mode is set to error: ${request.url}`, 'no-redirect'));\n\t\t\t\t\t\tfinalize();\n\t\t\t\t\t\treturn;\n\t\t\t\t\tcase 'manual':\n\t\t\t\t\t\t// node-fetch-specific step: make manual redirect a bit easier to use by setting the Location header value to the resolved URL.\n\t\t\t\t\t\tif (locationURL !== null) {\n\t\t\t\t\t\t\t// handle corrupted header\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\theaders.set('Location', locationURL);\n\t\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\t\t// istanbul ignore next: nodejs server prevent invalid response headers, we can't test this through normal request\n\t\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'follow':\n\t\t\t\t\t\t// HTTP-redirect fetch step 2\n\t\t\t\t\t\tif (locationURL === null) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// HTTP-redirect fetch step 5\n\t\t\t\t\t\tif (request.counter >= request.follow) {\n\t\t\t\t\t\t\treject(new FetchError(`maximum redirect reached at: ${request.url}`, 'max-redirect'));\n\t\t\t\t\t\t\tfinalize();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// HTTP-redirect fetch step 6 (counter increment)\n\t\t\t\t\t\t// Create a new Request object.\n\t\t\t\t\t\tconst requestOpts = {\n\t\t\t\t\t\t\theaders: new Headers(request.headers),\n\t\t\t\t\t\t\tfollow: request.follow,\n\t\t\t\t\t\t\tcounter: request.counter + 1,\n\t\t\t\t\t\t\tagent: request.agent,\n\t\t\t\t\t\t\tcompress: request.compress,\n\t\t\t\t\t\t\tmethod: request.method,\n\t\t\t\t\t\t\tbody: request.body,\n\t\t\t\t\t\t\tsignal: request.signal,\n\t\t\t\t\t\t\ttimeout: request.timeout,\n\t\t\t\t\t\t\tsize: request.size\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tif (!isDomainOrSubdomain(request.url, locationURL) || !isSameProtocol(request.url, locationURL)) {\n\t\t\t\t\t\t\tfor (const name of ['authorization', 'www-authenticate', 'cookie', 'cookie2']) {\n\t\t\t\t\t\t\t\trequestOpts.headers.delete(name);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// HTTP-redirect fetch step 9\n\t\t\t\t\t\tif (res.statusCode !== 303 && request.body && getTotalBytes(request) === null) {\n\t\t\t\t\t\t\treject(new FetchError('Cannot follow redirect with body being a readable stream', 'unsupported-redirect'));\n\t\t\t\t\t\t\tfinalize();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// HTTP-redirect fetch step 11\n\t\t\t\t\t\tif (res.statusCode === 303 || (res.statusCode === 301 || res.statusCode === 302) && request.method === 'POST') {\n\t\t\t\t\t\t\trequestOpts.method = 'GET';\n\t\t\t\t\t\t\trequestOpts.body = undefined;\n\t\t\t\t\t\t\trequestOpts.headers.delete('content-length');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// HTTP-redirect fetch step 15\n\t\t\t\t\t\tresolve(fetch(new Request(locationURL, requestOpts)));\n\t\t\t\t\t\tfinalize();\n\t\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// prepare response\n\t\t\tres.once('end', function () {\n\t\t\t\tif (signal) signal.removeEventListener('abort', abortAndFinalize);\n\t\t\t});\n\t\t\tlet body = res.pipe(new PassThrough$1());\n\n\t\t\tconst response_options = {\n\t\t\t\turl: request.url,\n\t\t\t\tstatus: res.statusCode,\n\t\t\t\tstatusText: res.statusMessage,\n\t\t\t\theaders: headers,\n\t\t\t\tsize: request.size,\n\t\t\t\ttimeout: request.timeout,\n\t\t\t\tcounter: request.counter\n\t\t\t};\n\n\t\t\t// HTTP-network fetch step 12.1.1.3\n\t\t\tconst codings = headers.get('Content-Encoding');\n\n\t\t\t// HTTP-network fetch step 12.1.1.4: handle content codings\n\n\t\t\t// in following scenarios we ignore compression support\n\t\t\t// 1. compression support is disabled\n\t\t\t// 2. HEAD request\n\t\t\t// 3. no Content-Encoding header\n\t\t\t// 4. no content response (204)\n\t\t\t// 5. content not modified response (304)\n\t\t\tif (!request.compress || request.method === 'HEAD' || codings === null || res.statusCode === 204 || res.statusCode === 304) {\n\t\t\t\tresponse = new Response(body, response_options);\n\t\t\t\tresolve(response);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// For Node v6+\n\t\t\t// Be less strict when decoding compressed responses, since sometimes\n\t\t\t// servers send slightly invalid responses that are still accepted\n\t\t\t// by common browsers.\n\t\t\t// Always using Z_SYNC_FLUSH is what cURL does.\n\t\t\tconst zlibOptions = {\n\t\t\t\tflush: zlib.Z_SYNC_FLUSH,\n\t\t\t\tfinishFlush: zlib.Z_SYNC_FLUSH\n\t\t\t};\n\n\t\t\t// for gzip\n\t\t\tif (codings == 'gzip' || codings == 'x-gzip') {\n\t\t\t\tbody = body.pipe(zlib.createGunzip(zlibOptions));\n\t\t\t\tresponse = new Response(body, response_options);\n\t\t\t\tresolve(response);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// for deflate\n\t\t\tif (codings == 'deflate' || codings == 'x-deflate') {\n\t\t\t\t// handle the infamous raw deflate response from old servers\n\t\t\t\t// a hack for old IIS and Apache servers\n\t\t\t\tconst raw = res.pipe(new PassThrough$1());\n\t\t\t\traw.once('data', function (chunk) {\n\t\t\t\t\t// see http://stackoverflow.com/questions/37519828\n\t\t\t\t\tif ((chunk[0] & 0x0F) === 0x08) {\n\t\t\t\t\t\tbody = body.pipe(zlib.createInflate());\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbody = body.pipe(zlib.createInflateRaw());\n\t\t\t\t\t}\n\t\t\t\t\tresponse = new Response(body, response_options);\n\t\t\t\t\tresolve(response);\n\t\t\t\t});\n\t\t\t\traw.on('end', function () {\n\t\t\t\t\t// some old IIS servers return zero-length OK deflate responses, so 'data' is never emitted.\n\t\t\t\t\tif (!response) {\n\t\t\t\t\t\tresponse = new Response(body, response_options);\n\t\t\t\t\t\tresolve(response);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// for br\n\t\t\tif (codings == 'br' && typeof zlib.createBrotliDecompress === 'function') {\n\t\t\t\tbody = body.pipe(zlib.createBrotliDecompress());\n\t\t\t\tresponse = new Response(body, response_options);\n\t\t\t\tresolve(response);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// otherwise, use response as-is\n\t\t\tresponse = new Response(body, response_options);\n\t\t\tresolve(response);\n\t\t});\n\n\t\twriteToStream(req, request);\n\t});\n}\nfunction fixResponseChunkedTransferBadEnding(request, errorCallback) {\n\tlet socket;\n\n\trequest.on('socket', function (s) {\n\t\tsocket = s;\n\t});\n\n\trequest.on('response', function (response) {\n\t\tconst headers = response.headers;\n\n\t\tif (headers['transfer-encoding'] === 'chunked' && !headers['content-length']) {\n\t\t\tresponse.once('close', function (hadError) {\n\t\t\t\t// tests for socket presence, as in some situations the\n\t\t\t\t// the 'socket' event is not triggered for the request\n\t\t\t\t// (happens in deno), avoids `TypeError`\n\t\t\t\t// if a data listener is still present we didn't end cleanly\n\t\t\t\tconst hasDataListener = socket && socket.listenerCount('data') > 0;\n\n\t\t\t\tif (hasDataListener && !hadError) {\n\t\t\t\t\tconst err = new Error('Premature close');\n\t\t\t\t\terr.code = 'ERR_STREAM_PREMATURE_CLOSE';\n\t\t\t\t\terrorCallback(err);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n}\n\nfunction destroyStream(stream, err) {\n\tif (stream.destroy) {\n\t\tstream.destroy(err);\n\t} else {\n\t\t// node < 8\n\t\tstream.emit('error', err);\n\t\tstream.end();\n\t}\n}\n\n/**\n * Redirect code matching\n *\n * @param   Number   code  Status code\n * @return  Boolean\n */\nfetch.isRedirect = function (code) {\n\treturn code === 301 || code === 302 || code === 303 || code === 307 || code === 308;\n};\n\n// expose Promise\nfetch.Promise = global.Promise;\n\nexport default fetch;\nexport { Headers, Request, Response, FetchError, AbortError };\n","// The module cache\nconst __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tconst cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tconst module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter/value functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tif(Array.isArray(definition)) {\n\t\tvar i = 0;\n\t\twhile(i < definition.length) {\n\t\t\tvar key = definition[i++];\n\t\t\tvar binding = definition[i++];\n\t\t\tif(!__webpack_require__.o(exports, key)) {\n\t\t\t\tif(binding === 0) {\n\t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, value: definition[i++] });\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: binding });\n\t\t\t\t}\n\t\t\t} else if(binding === 0) { i++; }\n\t\t}\n\t} else {\n\t\tfor(var key in definition) {\n\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t\t}\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"fs\");","export class FITSHeaderWriter {\n    static BLOCK_SIZE = 2880;\n    static CARD_SIZE = 80;\n    static INTEGER_KEYWORDS = new Set([\n        \"BITPIX\",\n        \"NAXIS\",\n        \"PCOUNT\",\n        \"GCOUNT\",\n    ]);\n    static LOGICAL_KEYWORDS = new Set([\"SIMPLE\", \"EXTEND\"]);\n    static serialize(header, primary) {\n        const items = header.getItems();\n        const map = new Map(items.map((item) => [item.key.toUpperCase(), item]));\n        const cards = [];\n        FITSHeaderWriter.appendMandatoryCards(cards, map, primary);\n        FITSHeaderWriter.appendRemainingCards(cards, items);\n        cards.push(FITSHeaderWriter.card80(\"END\"));\n        return FITSHeaderWriter.encodeAndPad(cards);\n    }\n    static appendMandatoryCards(cards, map, primary) {\n        if (primary) {\n            const simple = map.get(\"SIMPLE\");\n            if (!simple) {\n                throw new Error(\"Missing mandatory SIMPLE card in Primary HDU\");\n            }\n            cards.push(...FITSHeaderWriter.makeKeywordWithComment(\"SIMPLE\", simple.value, simple.comment));\n        }\n        else {\n            const xtension = map.get(\"XTENSION\");\n            if (!xtension) {\n                throw new Error(\"Missing mandatory XTENSION card in extension HDU\");\n            }\n            cards.push(...FITSHeaderWriter.makeKeywordWithComment(\"XTENSION\", xtension.value, xtension.comment));\n        }\n        const bitpix = map.get(\"BITPIX\");\n        if (!bitpix) {\n            throw new Error(\"Missing mandatory BITPIX card\");\n        }\n        cards.push(...FITSHeaderWriter.makeKeywordWithComment(\"BITPIX\", bitpix.value, bitpix.comment));\n        const naxis = map.get(\"NAXIS\");\n        if (!naxis) {\n            throw new Error(\"Missing mandatory NAXIS card\");\n        }\n        const nAxes = Number(naxis.value);\n        if (!Number.isInteger(nAxes) || nAxes < 0) {\n            throw new Error(`Invalid NAXIS value: ${naxis.value}`);\n        }\n        cards.push(...FITSHeaderWriter.makeKeywordWithComment(\"NAXIS\", nAxes, naxis.comment));\n        for (let axis = 1; axis <= nAxes; axis++) {\n            const key = `NAXIS${axis}`;\n            const item = map.get(key);\n            if (!item) {\n                throw new Error(`Missing mandatory ${key} card`);\n            }\n            cards.push(...FITSHeaderWriter.makeKeywordWithComment(key, item.value, item.comment));\n        }\n        if (!primary) {\n            const pcount = map.get(\"PCOUNT\");\n            const gcount = map.get(\"GCOUNT\");\n            if (!pcount) {\n                throw new Error(\"Missing mandatory PCOUNT card in extension HDU\");\n            }\n            if (!gcount) {\n                throw new Error(\"Missing mandatory GCOUNT card in extension HDU\");\n            }\n            cards.push(...FITSHeaderWriter.makeKeywordWithComment(\"PCOUNT\", pcount.value, pcount.comment));\n            cards.push(...FITSHeaderWriter.makeKeywordWithComment(\"GCOUNT\", gcount.value, gcount.comment));\n        }\n        if (primary) {\n            const extend = map.get(\"EXTEND\");\n            if (extend) {\n                cards.push(...FITSHeaderWriter.makeKeywordWithComment(\"EXTEND\", extend.value, extend.comment));\n            }\n        }\n    }\n    static appendRemainingCards(cards, items) {\n        for (const item of items) {\n            const key = item.key.toUpperCase();\n            if (key === \"SIMPLE\" ||\n                key === \"XTENSION\" ||\n                key === \"BITPIX\" ||\n                key === \"NAXIS\" ||\n                /^NAXIS\\d+$/.test(key) ||\n                key === \"PCOUNT\" ||\n                key === \"GCOUNT\" ||\n                key === \"EXTEND\" ||\n                key === \"END\") {\n                continue;\n            }\n            cards.push(...FITSHeaderWriter.makeKeywordWithComment(item.key, item.value, item.comment));\n        }\n    }\n    static makeKeywordWithComment(key, value, comment) {\n        const normalized = key.toUpperCase();\n        if (normalized === \"END\") {\n            return [FITSHeaderWriter.card80(\"END\")];\n        }\n        if (normalized === \"COMMENT\" || normalized === \"HISTORY\") {\n            return FITSHeaderWriter.makeCommentCards(normalized, String(value ?? comment ?? \"\"));\n        }\n        let base = FITSHeaderWriter.keyword(normalized) +\n            FITSHeaderWriter.valueField20(normalized, value);\n        if (!comment || comment.length === 0) {\n            return [FITSHeaderWriter.card80(base)];\n        }\n        const addition = ` / ${comment}`;\n        const spaceLeft = FITSHeaderWriter.CARD_SIZE - base.length;\n        if (spaceLeft <= 0) {\n            return [\n                FITSHeaderWriter.card80(base),\n                ...FITSHeaderWriter.makeCommentCards(\"COMMENT\", comment),\n            ];\n        }\n        base += addition.slice(0, spaceLeft);\n        const overflow = addition.slice(spaceLeft).replace(/^\\s*\\/\\s*/, \"\");\n        if (overflow.length === 0) {\n            return [FITSHeaderWriter.card80(base)];\n        }\n        return [\n            FITSHeaderWriter.card80(base),\n            ...FITSHeaderWriter.makeCommentCards(\"COMMENT\", overflow),\n        ];\n    }\n    static makeCommentCards(kind, text) {\n        const prefix = FITSHeaderWriter.keyword(kind);\n        const width = FITSHeaderWriter.CARD_SIZE - prefix.length;\n        const value = String(text ?? \"\");\n        if (value.length === 0) {\n            return [FITSHeaderWriter.card80(prefix)];\n        }\n        const cards = [];\n        for (let offset = 0; offset < value.length; offset += width) {\n            cards.push(FITSHeaderWriter.card80(prefix + value.slice(offset, offset + width)));\n        }\n        return cards;\n    }\n    static valueField20(key, value) {\n        if (FITSHeaderWriter.LOGICAL_KEYWORDS.has(key)) {\n            const logical = value === true || value === \"T\" || value === \"t\" ? \"T\" : \"F\";\n            return `= ${logical.padStart(20, \" \")}`;\n        }\n        if (FITSHeaderWriter.INTEGER_KEYWORDS.has(key) || /^NAXIS\\d+$/.test(key)) {\n            const number = Number(value);\n            if (!Number.isFinite(number) || !Number.isInteger(number)) {\n                throw new Error(`FITS header: ${key} must be an integer, got ${value}`);\n            }\n            return `= ${String(number).padStart(20, \" \")}`;\n        }\n        if (typeof value === \"number\") {\n            let encoded = Number.isInteger(value)\n                ? String(value)\n                : value.toExponential(10).replace(\"e\", \"E\");\n            if (encoded.length > 20) {\n                encoded = value.toExponential(8).replace(\"e\", \"E\");\n            }\n            return `= ${encoded.padStart(20, \" \")}`;\n        }\n        if (typeof value === \"string\") {\n            return `= ${FITSHeaderWriter.quoteFitsString(value)}`;\n        }\n        return \"\";\n    }\n    static quoteFitsString(value) {\n        const unquoted = value.replace(/^'+|'+$/g, \"\");\n        const escaped = unquoted.replace(/'/g, \"''\");\n        return `'${escaped}'`;\n    }\n    static keyword(value) {\n        return (value ?? \"\").toUpperCase().padEnd(8, \" \").slice(0, 8);\n    }\n    static card80(value) {\n        if (value.length >= FITSHeaderWriter.CARD_SIZE) {\n            return value.slice(0, FITSHeaderWriter.CARD_SIZE);\n        }\n        return value.padEnd(FITSHeaderWriter.CARD_SIZE, \" \");\n    }\n    static encodeAndPad(cards) {\n        let header = cards.join(\"\");\n        const remainder = header.length % FITSHeaderWriter.BLOCK_SIZE;\n        if (remainder !== 0) {\n            header += \" \".repeat(FITSHeaderWriter.BLOCK_SIZE - remainder);\n        }\n        return new TextEncoder().encode(header);\n    }\n}\n//# sourceMappingURL=FITSHeaderWriter.js.map","/**\n * FITS serialization and file writing support.\n *\n * FITSWriter provides two serialization APIs:\n *\n * - The jsfitsio 3.x API serializes the FITSFile/HDU data model,\n *   including PrimaryHDU, ImageHDU, BinaryTableHDU and AsciiTableHDU.\n *\n * - The legacy API serializes the former FITSParsed representation\n *   and is retained for backward compatibility with jsfitsio 2.x\n *   consumers.\n *\n * FITS headers are serialized according to the FITS 80-character\n * card format and padded to 2880-byte FITS logical blocks.\n * HDU payloads are likewise padded to 2880-byte boundaries.\n *\n * New code should use FITSFile together with createFITSFile() and\n * writeFITSFileModel().\n *\n * @see https://fits.gsfc.nasa.gov/\n */\nimport * as fs from \"fs\";\nimport { FITSHeaderWriter } from \"./FITSHeaderWriter.js\";\nexport class FITSWriter {\n    /**\n     * Serializes the legacy FITSParsed representation.\n     *\n     * @deprecated Use createFITSFile() with the FITSFile/HDU model.\n     * This method is retained for backward compatibility with jsfitsio 2.x.\n     */\n    static createFITS(fitsParsed) {\n        const headerBytes = FITSHeaderWriter.serialize(fitsParsed.header, true);\n        const dataBytes = this.createData(fitsParsed.data, fitsParsed.header);\n        const fitsFile = new Uint8Array(headerBytes.length + dataBytes.length);\n        fitsFile.set(headerBytes, 0);\n        fitsFile.set(dataBytes, headerBytes.length);\n        return fitsFile;\n    }\n    static createHDU(hdu, primary) {\n        const headerBytes = FITSHeaderWriter.serialize(hdu.header, primary);\n        const rawData = hdu.rawData ?? new Uint8Array(0);\n        if (rawData.byteLength !== hdu.dataByteLength) {\n            throw new Error(`HDU payload length mismatch: ` +\n                `rawData contains ${rawData.byteLength} bytes, ` +\n                `but dataByteLength=${hdu.dataByteLength}.`);\n        }\n        const dataBytes = FITSWriter.padData(rawData);\n        const result = new Uint8Array(headerBytes.byteLength + dataBytes.byteLength);\n        result.set(headerBytes, 0);\n        result.set(dataBytes, headerBytes.byteLength);\n        return result;\n    }\n    static padData(data) {\n        const BLOCK = 2880;\n        if (data.byteLength === 0) {\n            return new Uint8Array(0);\n        }\n        const remainder = data.byteLength % BLOCK;\n        if (remainder === 0) {\n            return data.slice();\n        }\n        const padded = new Uint8Array(data.byteLength + (BLOCK - remainder));\n        padded.set(data);\n        return padded;\n    }\n    static createData(data, header) {\n        // concat\n        const totalLength = data.reduce((s, c) => s + c.length, 0);\n        // OPTIONAL: verify size from BITPIX/NAXIS\n        const bitpix = Math.abs(Number(header.findById(\"BITPIX\")?.value ?? 0));\n        const naxis = Number(header.findById(\"NAXIS\")?.value ?? 0);\n        let elems = 1;\n        for (let k = 1; k <= naxis; k++) {\n            elems *= Number(header.findById(`NAXIS${k}`)?.value ?? 0);\n        }\n        const bytesPerElem = bitpix / 8;\n        const expectedUnpadded = naxis > 0 ? elems * bytesPerElem : 0;\n        if (expectedUnpadded && expectedUnpadded !== totalLength) {\n            throw new Error(`Data length ${totalLength} does not match header expectation ${expectedUnpadded} (BITPIX=${bitpix}, NAXIS=${naxis})`);\n        }\n        // build and pad\n        let dataBytes = new Uint8Array(totalLength);\n        let off = 0;\n        for (const chunk of data) {\n            dataBytes.set(chunk, off);\n            off += chunk.length;\n        }\n        return FITSWriter.padData(dataBytes);\n    }\n    /**\n     * Serializes a jsfitsio 3.x FITSFile, including all contained HDUs.\n     */\n    static createFITSFile(fitsFile) {\n        if (fitsFile.length === 0) {\n            throw new Error(\"Cannot write an empty FITSFile.\");\n        }\n        if (fitsFile.primaryHDU === null) {\n            throw new Error(\"FITSFile must start with a PrimaryHDU.\");\n        }\n        const serializedHDUs = fitsFile.hdus.map((hdu, index) => FITSWriter.createHDU(hdu, index === 0));\n        const totalLength = serializedHDUs.reduce((sum, hdu) => sum + hdu.byteLength, 0);\n        const result = new Uint8Array(totalLength);\n        let offset = 0;\n        for (const hdu of serializedHDUs) {\n            result.set(hdu, offset);\n            offset += hdu.byteLength;\n        }\n        return result;\n    }\n    /**\n     * Serializes a jsfitsio 3.x FITSFile and writes it to the local filesystem.\n     */\n    static writeFITSFileModel(fitsFile, filePath) {\n        const data = FITSWriter.createFITSFile(fitsFile);\n        fs.writeFileSync(filePath, data);\n    }\n    /**\n     * Writes the legacy FITSParsed representation to a local file.\n     *\n     * @deprecated Use writeFITSFileModel() with FITSFile instead.\n     * This method is retained for backward compatibility with jsfitsio 2.x.\n     */\n    static writeFITSFile(fitsParsed, filePath) {\n        const fitsFile = FITSWriter.createFITS(fitsParsed);\n        fs.writeFileSync(filePath, fitsFile);\n    }\n}\n//# sourceMappingURL=FITSWriter.js.map","/**\n * Summary. (bla bla bla)\n *\n * Description. (bla bla bla)\n *\n * @link   github https://github.com/fab77/FITSParser\n * @author Fabrizio Giordano <fabriziogiordano77@gmail.com>\n */\nexport class FITSHeaderItem {\n    _key = \"\";\n    _value = \"\";\n    _comment = \"\";\n    constructor(key, value, comment) {\n        this._key = key;\n        this._value = value;\n        this._comment = comment;\n    }\n    get key() {\n        return this._key;\n    }\n    get comment() {\n        return this._comment;\n    }\n    get value() {\n        return this._value;\n    }\n}\n//# sourceMappingURL=FITSHeaderItem.js.map","import { FITSHeaderItem } from \"./FITSHeaderItem.js\";\nexport class FITSHeaderManager {\n    static SIMPLE = \"SIMPLE\";\n    static BITPIX = \"BITPIX\";\n    static BZERO = \"BZERO\";\n    static BSCALE = \"BSCALE\";\n    static BLANK = \"BLANK\";\n    static NAXIS = \"NAXIS\";\n    static NAXIS1 = \"NAXIS1\";\n    static NAXIS2 = \"NAXIS2\";\n    static DATAMIN = \"DATAMIN\";\n    static DATAMAX = \"DATAMAX\";\n    static CRVAL1 = \"CRVAL1\";\n    static CRVAL2 = \"CRVAL2\";\n    static CTYPE1 = \"CTYPE1\";\n    static CTYPE2 = \"CTYPE2\";\n    static CRPIX1 = \"CRPIX1\";\n    static CRPIX2 = \"CRPIX2\";\n    static ORIGIN = \"ORIGIN\";\n    static COMMENT = \"COMMENT\";\n    static XTENSION = \"XTENSION\";\n    static PCOUNT = \"PCOUNT\";\n    static GCOUNT = \"GCOUNT\";\n    static TFIELDS = \"TFIELDS\";\n    static TFORM = \"TFORM\";\n    static TTYPE = \"TTYPE\";\n    static TUNIT = \"TUNIT\";\n    static TSCAL = \"TSCAL\";\n    static TZERO = \"TZERO\";\n    static TNULL = \"TNULL\";\n    static TBCOL = \"TBCOL\";\n    items = [];\n    constructor(initializeDefaults = true) {\n        if (!initializeDefaults) {\n            return;\n        }\n        this.items[0] = new FITSHeaderItem(FITSHeaderManager.SIMPLE, \"T\", \"\");\n        this.items[1] = new FITSHeaderItem(FITSHeaderManager.BITPIX, \"\", \"\");\n        this.items[2] = new FITSHeaderItem(FITSHeaderManager.NAXIS, 2, \"\");\n        this.items[3] = new FITSHeaderItem(FITSHeaderManager.NAXIS1, \"\", \"\");\n        this.items[4] = new FITSHeaderItem(FITSHeaderManager.NAXIS2, \"\", \"\");\n    }\n    // insert(item: FITSHeaderItem, position?: number): void {\n    insert(item) {\n        if (item.key === FITSHeaderManager.SIMPLE) {\n            // this.items.splice(0, 0, item);\n            this.items[0] = item;\n        }\n        else if (item.key === FITSHeaderManager.BITPIX) {\n            // this.items.splice(1, 0, item);\n            this.items[1] = item;\n        }\n        else if (item.key === FITSHeaderManager.NAXIS) {\n            // this.items.splice(2, 0, item);\n            this.items[2] = item;\n        }\n        else if (item.key === FITSHeaderManager.NAXIS1) {\n            // this.items.splice(3, 0, item);\n            this.items[3] = item;\n        }\n        else if (item.key === FITSHeaderManager.NAXIS2) {\n            // this.items.splice(4, 0, item);\n            this.items[4] = item;\n        }\n        else {\n            this.items.push(item);\n        }\n        // if (position !== undefined && position >= 0 && position <= this.items.length) {\n        //     this.items.splice(position, 0, item);\n        // } else {\n        //     this.items.push(item);\n        // }\n    }\n    getItems() {\n        return this.items;\n    }\n    remove(key) {\n        this.items = this.items.filter((item) => item.key !== key);\n    }\n    findById(key) {\n        const item = this.items.find((item) => item.key === key);\n        if (!item) {\n            return null;\n        }\n        return item;\n    }\n    static tableFieldKey(prefix, index) {\n        if (!Number.isInteger(index) || index < 1) {\n            throw new RangeError(`FITS table field index must be >= 1, received ${index}.`);\n        }\n        return `${prefix}${index}`;\n    }\n    static naxisKey(axis) {\n        if (!Number.isInteger(axis) || axis < 1) {\n            throw new RangeError(`FITS axis must be a positive integer, received ${axis}.`);\n        }\n        return `NAXIS${axis}`;\n    }\n    static getFITSItemStringValue(header, key) {\n        const item = header.findById(key);\n        if (!item) {\n            return null;\n        }\n        return String(item.value).trim().replace(/^'/, \"\").replace(/'$/, \"\").trim();\n    }\n}\n//# sourceMappingURL=FITSHeaderManager.js.map","// import { FITSHeader } from \"./model/FITSHeader.js\";\nimport { FITSHeaderItem } from \"./model/FITSHeaderItem.js\";\nimport { FITSHeaderManager } from \"./model/FITSHeaderManager.js\";\n/**\n * Summary. (bla bla bla)\n *\n * Description. (bla bla bla)\n *\n * @link   github https://github.com/fab77/FITSParser\n * @author Fabrizio Giordano <fabriziogiordano77@gmail.com>\n */\nexport class ParseHeader {\n    static CARD_SIZE = 80;\n    static BLOCK_SIZE = 2880;\n    static getFITSItemStringValue(header, key) {\n        const item = header.findById(key);\n        if (!item) {\n            return null;\n        }\n        return String(item.value).trim().replace(/^'/, \"\").replace(/'$/, \"\").trim();\n    }\n    static getFITSItemValue(header, key) {\n        const item = header.findById(key);\n        if (!item) {\n            return null;\n        }\n        const value = Number(item.value);\n        return Number.isNaN(value) ? null : value;\n    }\n    /**\n     * Returns the complete FITS header size, including padding\n     * up to the next 2880-byte boundary.\n     */\n    static getHeaderByteLength(rawData, startOffset = 0) {\n        const decoder = new TextDecoder(\"ascii\");\n        for (let offset = startOffset; offset + ParseHeader.CARD_SIZE <= rawData.byteLength; offset += ParseHeader.CARD_SIZE) {\n            const key = decoder.decode(rawData.subarray(offset, offset + 8)).trim();\n            if (key === \"END\") {\n                const consumed = offset + ParseHeader.CARD_SIZE - startOffset;\n                return (Math.ceil(consumed / ParseHeader.BLOCK_SIZE) * ParseHeader.BLOCK_SIZE);\n            }\n        }\n        throw new Error(\"Invalid FITS header: END card not found.\");\n    }\n    static parse(rawData, startOffset = 0) {\n        const decoder = new TextDecoder(\"ascii\");\n        const headerLength = ParseHeader.getHeaderByteLength(rawData, startOffset);\n        const header = new FITSHeaderManager(false);\n        for (let offset = startOffset; offset < startOffset + headerLength; offset += ParseHeader.CARD_SIZE) {\n            const line = decoder.decode(rawData.subarray(offset, offset + ParseHeader.CARD_SIZE));\n            const key = line.slice(0, 8).trim();\n            if (key === \"END\") {\n                break;\n            }\n            if (!key) {\n                continue;\n            }\n            let value;\n            let comment = \"\";\n            const rawValue = line.slice(10).trim().split(\"/\")[0].trim();\n            if (Number.isNaN(Number(rawValue))) {\n                value = rawValue;\n            }\n            else {\n                value = Number(rawValue);\n            }\n            if (line.includes(\"/\")) {\n                comment = line.slice(10).trim().split(\"/\")[1]?.trim() ?? \"\";\n            }\n            header.insert(new FITSHeaderItem(key, value, comment));\n        }\n        return header;\n    }\n}\n//# sourceMappingURL=ParseHeader.js.map","import { FITSHeaderManager } from \"./model/FITSHeaderManager.js\";\nimport { ParseHeader } from \"./ParseHeader.js\";\nexport class FITSImageUtils {\n    static getShape(header) {\n        const naxis = ParseHeader.getFITSItemValue(header, FITSHeaderManager.NAXIS);\n        if (naxis === null) {\n            throw new Error(\"NAXIS not defined.\");\n        }\n        if (!Number.isInteger(naxis) || naxis < 0) {\n            throw new Error(`Invalid FITS NAXIS value: ${naxis}`);\n        }\n        const shape = [];\n        for (let axis = 1; axis <= naxis; axis++) {\n            const size = ParseHeader.getFITSItemValue(header, FITSHeaderManager.naxisKey(axis));\n            if (size === null) {\n                throw new Error(`NAXIS${axis} not defined.`);\n            }\n            shape.push(size);\n        }\n        return shape;\n    }\n    static getElementCount(shape) {\n        if (shape.length === 0) {\n            return 0;\n        }\n        return shape.reduce((total, dimension) => total * dimension, 1);\n    }\n}\n//# sourceMappingURL=FITSImageUtils.js.map","// \"use strict\";\n/**\n * Summary. (bla bla bla)\n *\n * Description. (bla bla bla)\n *\n * @link   github https://github.com/fab77/FITSParser\n * @author Fabrizio Giordano <fabriziogiordano77@gmail.com>\n */\nimport { FITSHeaderItem } from \"./model/FITSHeaderItem.js\";\nimport { FITSHeaderManager } from \"./model/FITSHeaderManager.js\";\nimport { ParseHeader } from \"./ParseHeader.js\";\nimport { FITSImageUtils } from \"./FITSImageUtils.js\";\nexport class ParsePayload {\n    static SUPPORTED_BITPIX = new Set([8, 16, 32, 64, -32, -64]);\n    static assertSupportedBITPIX(bitpix) {\n        if (!ParsePayload.SUPPORTED_BITPIX.has(bitpix)) {\n            throw new Error(`Unsupported FITS BITPIX value: ${bitpix}`);\n        }\n    }\n    static extractPixelFromView(view, offset, bitpix) {\n        switch (bitpix) {\n            case 8:\n                return view.getUint8(offset);\n            case 16:\n                return view.getInt16(offset, false);\n            case 32:\n                return view.getInt32(offset, false);\n            case -32:\n                return view.getFloat32(offset, false);\n            case -64:\n                return view.getFloat64(offset, false);\n            case 64: {\n                const value = view.getBigInt64(offset, false);\n                const numeric = Number(value);\n                if (!Number.isSafeInteger(numeric)) {\n                    throw new RangeError(`BITPIX=64 value ${value} cannot be represented ` +\n                        `exactly as a JavaScript number.`);\n                }\n                return numeric;\n            }\n            default:\n                throw new Error(`Unsupported FITS BITPIX value: ${bitpix}`);\n        }\n    }\n    static computePhysicalMinAndMax(header, payload) {\n        const bitpix = ParseHeader.getFITSItemValue(header, FITSHeaderManager.BITPIX);\n        if (bitpix === null) {\n            return null;\n        }\n        ParsePayload.assertSupportedBITPIX(bitpix);\n        const shape = FITSImageUtils.getShape(header);\n        /*\n         * NAXIS=0 is a valid FITS HDU.\n         */\n        if (shape.length === 0 || payload.byteLength === 0) {\n            return header;\n        }\n        const dataMinItem = header.findById(FITSHeaderManager.DATAMIN);\n        const dataMaxItem = header.findById(FITSHeaderManager.DATAMAX);\n        if (dataMinItem === null || dataMaxItem === null) {\n            try {\n                const [min, max] = ParsePayload.computePhysicalValues(payload, header);\n                if (dataMinItem === null && min !== null) {\n                    header.insert(new FITSHeaderItem(FITSHeaderManager.DATAMIN, min, \"computed by jsfitsio\"));\n                }\n                if (dataMaxItem === null && max !== null) {\n                    header.insert(new FITSHeaderItem(FITSHeaderManager.DATAMAX, max, \"computed by jsfitsio\"));\n                }\n            }\n            catch (error) {\n                if (bitpix === 64 && error instanceof RangeError) {\n                    return header;\n                }\n                throw error;\n            }\n        }\n        return header;\n    }\n    static createTypedArray(rawData, bitpix) {\n        ParsePayload.assertSupportedBITPIX(bitpix);\n        const bytesPerElement = Math.abs(bitpix) / 8;\n        if (rawData.byteLength % bytesPerElement !== 0) {\n            throw new Error(`Payload byte length ${rawData.byteLength} ` +\n                `is not aligned with BITPIX=${bitpix}.`);\n        }\n        const count = rawData.byteLength / bytesPerElement;\n        const view = new DataView(rawData.buffer, rawData.byteOffset, rawData.byteLength);\n        switch (bitpix) {\n            case 8: {\n                /*\n                 * For 8-bit FITS, byte order is irrelevant.\n                 *\n                 * Use slice() so typedData has its own correctly\n                 * sized backing store.\n                 */\n                return rawData.slice();\n            }\n            case 16: {\n                const result = new Int16Array(count);\n                for (let i = 0; i < count; i++) {\n                    result[i] = view.getInt16(i * 2, false);\n                }\n                return result;\n            }\n            case 32: {\n                const result = new Int32Array(count);\n                for (let i = 0; i < count; i++) {\n                    result[i] = view.getInt32(i * 4, false);\n                }\n                return result;\n            }\n            case 64: {\n                const result = new BigInt64Array(count);\n                for (let i = 0; i < count; i++) {\n                    result[i] = view.getBigInt64(i * 8, false);\n                }\n                return result;\n            }\n            case -32: {\n                const result = new Float32Array(count);\n                for (let i = 0; i < count; i++) {\n                    result[i] = view.getFloat32(i * 4, false);\n                }\n                return result;\n            }\n            case -64: {\n                const result = new Float64Array(count);\n                for (let i = 0; i < count; i++) {\n                    result[i] = view.getFloat64(i * 8, false);\n                }\n                return result;\n            }\n            default:\n                throw new Error(`Unsupported FITS BITPIX value: ${bitpix}`);\n        }\n    }\n    static computePhysicalValues(rawData, header) {\n        const bitpix = ParseHeader.getFITSItemValue(header, FITSHeaderManager.BITPIX);\n        if (bitpix === null) {\n            return [null, null];\n        }\n        ParsePayload.assertSupportedBITPIX(bitpix);\n        const shape = FITSImageUtils.getShape(header);\n        const pixelCount = FITSImageUtils.getElementCount(shape);\n        if (pixelCount === 0) {\n            return [null, null];\n        }\n        const blank = ParseHeader.getFITSItemValue(header, FITSHeaderManager.BLANK);\n        const bzero = ParseHeader.getFITSItemValue(header, FITSHeaderManager.BZERO) ?? 0;\n        const bscale = ParseHeader.getFITSItemValue(header, FITSHeaderManager.BSCALE) ?? 1;\n        const bytesPerElement = Math.abs(bitpix) / 8;\n        const requiredBytes = pixelCount * bytesPerElement;\n        if (rawData.byteLength < requiredBytes) {\n            throw new Error(`FITS payload is too short: expected ${requiredBytes} bytes, ` +\n                `received ${rawData.byteLength}.`);\n        }\n        const view = new DataView(rawData.buffer, rawData.byteOffset, rawData.byteLength);\n        let min = null;\n        let max = null;\n        for (let i = 0; i < pixelCount; i++) {\n            const rawValue = ParsePayload.extractPixelFromView(view, i * bytesPerElement, bitpix);\n            // BLANK applies to integer FITS image data.\n            if (bitpix > 0 && blank !== null && rawValue === blank) {\n                continue;\n            }\n            const physicalValue = ParsePayload.pixel2physicalValue(rawValue, bscale, bzero);\n            // Floating-point FITS images may contain NaN.\n            if (Number.isNaN(physicalValue)) {\n                continue;\n            }\n            if (min === null || physicalValue < min) {\n                min = physicalValue;\n            }\n            if (max === null || physicalValue > max) {\n                max = physicalValue;\n            }\n        }\n        return [min, max];\n    }\n    static pixel2physicalValue(pxval, BSCALE, BZERO) {\n        if (BZERO === null || BSCALE === null) {\n            throw new Error(\"Either BZERO or BSCALE is null\");\n        }\n        return BZERO + BSCALE * pxval;\n    }\n    static extractPixelValue(rawData, offset, bitpix) {\n        ParsePayload.assertSupportedBITPIX(bitpix);\n        const view = new DataView(rawData.buffer, rawData.byteOffset, rawData.byteLength);\n        return ParsePayload.extractPixelFromView(view, offset, bitpix);\n    }\n}\n//# sourceMappingURL=ParsePayload.js.map","export class FITSHDU {\n    header;\n    rawData;\n    dataOffset;\n    dataByteLength;\n    constructor(header, rawData, dataOffset, dataByteLength) {\n        this.header = header;\n        this.rawData = rawData;\n        this.dataOffset = dataOffset;\n        this.dataByteLength = dataByteLength;\n    }\n}\n//# sourceMappingURL=FITSHDU.js.map","import { FITSHDU } from \"./FITSHDU.js\";\nexport class ImageHDU extends FITSHDU {\n    bitpix;\n    shape;\n    typedData;\n    type = \"IMAGE\";\n    constructor(header, rawData, dataOffset, dataByteLength, bitpix, shape, typedData) {\n        super(header, rawData, dataOffset, dataByteLength);\n        this.bitpix = bitpix;\n        this.shape = shape;\n        this.typedData = typedData;\n    }\n    get naxis() {\n        return this.shape.length;\n    }\n    get elementCount() {\n        if (this.shape.length === 0) {\n            return 0;\n        }\n        return this.shape.reduce((accumulator, dimension) => accumulator * dimension, 1);\n    }\n}\n//# sourceMappingURL=ImageHDU.js.map","import { ImageHDU } from \"./ImageHDU.js\";\nexport class PrimaryHDU extends ImageHDU {\n    type = \"PRIMARY\";\n    constructor(header, rawData, dataOffset, dataByteLength, bitpix, shape, typedData) {\n        super(header, rawData, dataOffset, dataByteLength, bitpix, shape, typedData);\n    }\n}\n//# sourceMappingURL=PrimaryHDU.js.map","import { PrimaryHDU } from \"./PrimaryHDU.js\";\nexport class FITSFile {\n    _hdus;\n    constructor(hdus = []) {\n        this._hdus = [...hdus];\n    }\n    get hdus() {\n        return this._hdus;\n    }\n    get length() {\n        return this._hdus.length;\n    }\n    get primaryHDU() {\n        const hdu = this._hdus[0];\n        if (hdu instanceof PrimaryHDU) {\n            return hdu;\n        }\n        return null;\n    }\n    getHDU(index) {\n        return this._hdus[index] ?? null;\n    }\n    addHDU(hdu) {\n        this._hdus.push(hdu);\n    }\n}\n//# sourceMappingURL=FITSFile.js.map","import { FITSHDU } from \"./FITSHDU.js\";\nexport class BinaryTableHDU extends FITSHDU {\n    rowByteLength;\n    rowCount;\n    columns;\n    type = \"BINTABLE\";\n    constructor(header, rawData, dataOffset, dataByteLength, rowByteLength, rowCount, columns) {\n        super(header, rawData, dataOffset, dataByteLength);\n        this.rowByteLength = rowByteLength;\n        this.rowCount = rowCount;\n        this.columns = columns;\n    }\n    get columnCount() {\n        return this.columns.length;\n    }\n    getRowView(rowIndex) {\n        if (rowIndex < 0 || rowIndex >= this.rowCount) {\n            throw new RangeError(`Invalid row index ${rowIndex}.`);\n        }\n        const offset = rowIndex * this.rowByteLength;\n        return new DataView(this.rawData.buffer, this.rawData.byteOffset + offset, this.rowByteLength);\n    }\n    getRow(rowIndex) {\n        return this.columns.map((_, columnIndex) => this.getCell(rowIndex, columnIndex));\n    }\n    getCell(rowIndex, column) {\n        const columnDefinition = this.resolveColumn(column);\n        const row = this.getRowView(rowIndex);\n        const offset = columnDefinition.byteOffset;\n        const repeat = columnDefinition.repeat;\n        switch (columnDefinition.type) {\n            case \"CHAR\": {\n                const bytes = new Uint8Array(row.buffer, row.byteOffset + offset, columnDefinition.byteWidth);\n                return new TextDecoder(\"ascii\").decode(bytes).replace(/\\s+$/, \"\");\n            }\n            case \"LOGICAL\": {\n                const values = [];\n                for (let i = 0; i < repeat; i++) {\n                    const value = String.fromCharCode(row.getUint8(offset + i));\n                    values.push(value === \"T\");\n                }\n                return repeat === 1 ? values[0] : values;\n            }\n            case \"UINT8\": {\n                const values = [];\n                for (let i = 0; i < repeat; i++) {\n                    const raw = row.getUint8(offset + i);\n                    values.push(this.applyNumericScaling(raw, columnDefinition.scale, columnDefinition.zero));\n                }\n                return repeat === 1 ? values[0] : values;\n            }\n            case \"INT16\":\n                return this.readNumericColumn(row, offset, repeat, 2, (view, position) => view.getInt16(position, false), columnDefinition.scale, columnDefinition.zero, columnDefinition.nullValue);\n            case \"INT32\":\n                return this.readNumericColumn(row, offset, repeat, 4, (view, position) => view.getInt32(position, false), columnDefinition.scale, columnDefinition.zero, columnDefinition.nullValue);\n            case \"INT64\": {\n                const values = [];\n                for (let i = 0; i < repeat; i++) {\n                    const raw = row.getBigInt64(offset + i * 8, false);\n                    /*\n                     * Preserve exact 64-bit integers.\n                     *\n                     * Do not silently convert bigint to number.\n                     */\n                    values.push(raw);\n                }\n                return repeat === 1 ? values[0] : values;\n            }\n            case \"FLOAT32\":\n                return this.readNumericColumn(row, offset, repeat, 4, (view, position) => view.getFloat32(position, false), columnDefinition.scale, columnDefinition.zero, null);\n            case \"FLOAT64\":\n                return this.readNumericColumn(row, offset, repeat, 8, (view, position) => view.getFloat64(position, false), columnDefinition.scale, columnDefinition.zero, null);\n            case \"COMPLEX64\": {\n                const values = [];\n                for (let i = 0; i < repeat; i++) {\n                    const position = offset + i * 8;\n                    values.push({\n                        real: row.getFloat32(position, false),\n                        imaginary: row.getFloat32(position + 4, false),\n                    });\n                }\n                return repeat === 1 ? values[0] : values;\n            }\n            case \"COMPLEX128\": {\n                const values = [];\n                for (let i = 0; i < repeat; i++) {\n                    const position = offset + i * 16;\n                    values.push({\n                        real: row.getFloat64(position, false),\n                        imaginary: row.getFloat64(position + 8, false),\n                    });\n                }\n                return repeat === 1 ? values[0] : values;\n            }\n            case \"BIT\":\n                /*\n                 * I'd defer bit-array decoding for the moment.\n                 * The raw bytes remain available.\n                 */\n                return new Uint8Array(row.buffer, row.byteOffset + offset, columnDefinition.byteWidth).slice();\n            default:\n                throw new Error(`Unsupported BINTABLE column type: ${columnDefinition.type}`);\n        }\n    }\n    readNumericColumn(view, offset, repeat, bytesPerElement, reader, scale, zero, nullValue) {\n        const values = [];\n        for (let i = 0; i < repeat; i++) {\n            const raw = reader(view, offset + i * bytesPerElement);\n            if (nullValue !== null && raw === nullValue) {\n                values.push(null);\n                continue;\n            }\n            values.push(this.applyNumericScaling(raw, scale, zero));\n        }\n        if (repeat === 1) {\n            return values[0];\n        }\n        /*\n         * Because repeated integer fields may contain NULL,\n         * we cannot represent every case as number[].\n         *\n         * For now return a generic value array.\n         */\n        return values;\n    }\n    applyNumericScaling(raw, scale, zero) {\n        return zero + scale * raw;\n    }\n    resolveColumn(column) {\n        if (typeof column === \"number\") {\n            if (!Number.isInteger(column) ||\n                column < 0 ||\n                column >= this.columns.length) {\n                throw new RangeError(`Invalid column index ${column}.`);\n            }\n            return this.columns[column];\n        }\n        const found = this.columns.find((candidate) => candidate.name === column);\n        if (!found) {\n            throw new Error(`BINTABLE column '${column}' not found.`);\n        }\n        return found;\n    }\n}\n//# sourceMappingURL=BinaryTableHDU.js.map","export class FITSBinaryTableUtils {\n    static parseTFORM(format) {\n        const normalized = format\n            .trim()\n            .replace(/^'/, \"\")\n            .replace(/'$/, \"\")\n            .trim()\n            .toUpperCase();\n        const match = normalized.match(/^(\\d*)([LXBIJKAEDCM])$/);\n        if (!match) {\n            throw new Error(`Unsupported FITS TFORM value: ${format}`);\n        }\n        const repeat = match[1] ? Number(match[1]) : 1;\n        const code = match[2];\n        const bytesPerElement = FITSBinaryTableUtils.bytesPerType(code);\n        return {\n            repeat,\n            code,\n            byteWidth: code === \"X\" ? Math.ceil(repeat / 8) : repeat * bytesPerElement,\n        };\n    }\n    static bytesPerType(code) {\n        switch (code) {\n            case \"L\":\n            case \"B\":\n            case \"A\":\n                return 1;\n            case \"I\":\n                return 2;\n            case \"J\":\n            case \"E\":\n                return 4;\n            case \"K\":\n            case \"D\":\n                return 8;\n            case \"C\":\n                return 8;\n            case \"M\":\n                return 16;\n            case \"X\":\n                return 0;\n            default:\n                throw new Error(`Unsupported FITS binary table type: ${code}`);\n        }\n    }\n}\n//# sourceMappingURL=FITSBinaryTableUtils.js.map","import { FITSHDU } from \"./FITSHDU.js\";\nexport class AsciiTableHDU extends FITSHDU {\n    rowByteLength;\n    rowCount;\n    columns;\n    type = \"TABLE\";\n    constructor(header, rawData, dataOffset, dataByteLength, rowByteLength, rowCount, columns) {\n        super(header, rawData, dataOffset, dataByteLength);\n        this.rowByteLength = rowByteLength;\n        this.rowCount = rowCount;\n        this.columns = columns;\n    }\n    get columnCount() {\n        return this.columns.length;\n    }\n    getRowView(rowIndex) {\n        if (!Number.isInteger(rowIndex) ||\n            rowIndex < 0 ||\n            rowIndex >= this.rowCount) {\n            throw new RangeError(`Invalid row index ${rowIndex}.`);\n        }\n        const start = rowIndex * this.rowByteLength;\n        return this.rawData.subarray(start, start + this.rowByteLength);\n    }\n    getRowText(rowIndex) {\n        return new TextDecoder(\"ascii\").decode(this.getRowView(rowIndex));\n    }\n    resolveColumn(column) {\n        if (typeof column === \"number\") {\n            if (!Number.isInteger(column) ||\n                column < 0 ||\n                column >= this.columns.length) {\n                throw new RangeError(`Invalid column index ${column}.`);\n            }\n            return this.columns[column];\n        }\n        const found = this.columns.find((candidate) => candidate.name === column);\n        if (!found) {\n            throw new Error(`ASCII TABLE column '${column}' not found.`);\n        }\n        return found;\n    }\n    getCell(rowIndex, column) {\n        const definition = this.resolveColumn(column);\n        const row = this.getRowView(rowIndex);\n        const bytes = row.subarray(definition.byteOffset, definition.byteOffset + definition.width);\n        const raw = new TextDecoder(\"ascii\").decode(bytes);\n        const trimmed = raw.trim();\n        /*\n         * Blank numeric fields are treated as null.\n         */\n        if (trimmed.length === 0) {\n            return definition.type === \"CHAR\" ? \"\" : null;\n        }\n        switch (definition.type) {\n            case \"CHAR\":\n                return raw.replace(/\\s+$/, \"\");\n            case \"INTEGER\": {\n                const value = Number.parseInt(trimmed, 10);\n                if (Number.isNaN(value)) {\n                    return null;\n                }\n                return value;\n            }\n            case \"FLOAT\":\n            case \"EXPONENTIAL\":\n            case \"DOUBLE\": {\n                /*\n                 * FITS ASCII tables may use D exponent notation.\n                 * JavaScript expects E.\n                 */\n                const normalized = trimmed.replace(/[dD]/, \"E\");\n                const value = Number.parseFloat(normalized);\n                if (Number.isNaN(value)) {\n                    return null;\n                }\n                return value;\n            }\n            default:\n                throw new Error(`Unsupported ASCII TABLE column type: ${definition.type}`);\n        }\n    }\n    getRow(rowIndex) {\n        return this.columns.map((_, columnIndex) => this.getCell(rowIndex, columnIndex));\n    }\n}\n//# sourceMappingURL=AsciiTableHDU.js.map","export class FITSAsciiTableUtils {\n    static parseTFORM(format) {\n        const normalized = format\n            .trim()\n            .replace(/^'/, \"\")\n            .replace(/'$/, \"\")\n            .trim()\n            .toUpperCase();\n        /*\n         * FITS ASCII table formats:\n         *\n         *   Aw\n         *   Iw\n         *   Fw.d\n         *   Ew.d\n         *   Dw.d\n         */\n        const match = normalized.match(/^([AIFED])(\\d+)(?:\\.(\\d+))?$/);\n        if (!match) {\n            throw new Error(`Unsupported FITS ASCII table TFORM value: ${format}`);\n        }\n        const code = match[1];\n        const width = Number(match[2]);\n        const decimals = match[3] !== undefined\n            ? Number(match[3])\n            : null;\n        if (!Number.isInteger(width) ||\n            width <= 0) {\n            throw new Error(`Invalid FITS ASCII table field width: ${width}`);\n        }\n        if (code === \"A\" ||\n            code === \"I\") {\n            if (decimals !== null) {\n                throw new Error(`TFORM ${format} must not specify decimal places.`);\n            }\n        }\n        else if (decimals === null) {\n            throw new Error(`TFORM ${format} requires decimal places.`);\n        }\n        return {\n            code,\n            width,\n            decimals,\n        };\n    }\n}\n//# sourceMappingURL=FITSAsciiTableUtils.js.map","import { FITSWriter } from \"./FITSWriter.js\";\nimport { ParsePayload } from \"./ParsePayload.js\";\nimport { ParseHeader } from \"./ParseHeader.js\";\nimport { FITSHeaderManager } from \"./model/FITSHeaderManager.js\";\nimport { FITSFile } from \"./model/FITSFile.js\";\nimport { PrimaryHDU } from \"./model/PrimaryHDU.js\";\nimport { FITSImageUtils } from \"./FITSImageUtils.js\";\nimport { ImageHDU } from \"./model/ImageHDU.js\";\nimport { BinaryTableHDU } from \"./model/BinaryTableHDU.js\";\nimport { FITSBinaryTableUtils } from \"./FITSBinaryTableUtils.js\";\nimport { AsciiTableHDU } from \"./model/AsciiTableHDU.js\";\nimport { FITSAsciiTableUtils } from \"./FITSAsciiTableUtils.js\";\nexport class FITSParser {\n    /**\n     * @deprecated Use loadFITSFile() instead.\n     *\n     * This legacy API supports only 2-dimensional image FITS files\n     * and returns the former FITSParsed structure.\n     */\n    static async loadFITS(path, options = {}) {\n        const fitsFile = await FITSParser.loadFITSFile(path, options);\n        if (fitsFile === null) {\n            return null;\n        }\n        const primary = fitsFile.primaryHDU;\n        if (primary === null || primary.rawData === null) {\n            return null;\n        }\n        const shape = FITSImageUtils.getShape(primary.header);\n        if (shape.length !== 2) {\n            throw new Error(\"Legacy loadFITS() supports only 2D FITS images. \" +\n                \"Use loadFITSFile() for N-dimensional images.\");\n        }\n        return {\n            header: primary.header,\n            data: FITSParser.createMatrix(primary.rawData, primary.header),\n        };\n    }\n    static async loadFITSFile(path, options = {}) {\n        const rawData = await FITSParser.getFile(path);\n        if (rawData.byteLength === 0) {\n            return null;\n        }\n        return FITSParser.processFITSFile(rawData, options);\n    }\n    static processFITSFile(rawData, options) {\n        const fitsFile = new FITSFile();\n        let offset = 0;\n        let hduIndex = 0;\n        while (offset < rawData.byteLength) {\n            /*\n             * Ignore trailing zero/space padding.\n             */\n            if (FITSParser.isPaddingOnly(rawData, offset)) {\n                break;\n            }\n            const header = ParseHeader.parse(rawData, offset);\n            const headerByteLength = ParseHeader.getHeaderByteLength(rawData, offset);\n            const dataOffset = offset + headerByteLength;\n            const hduType = FITSParser.getHDUType(header, hduIndex);\n            switch (hduType) {\n                case \"PRIMARY\":\n                case \"IMAGE\": {\n                    const dataByteLength = FITSParser.getImagePayloadByteLength(header);\n                    if (dataOffset + dataByteLength > rawData.byteLength) {\n                        throw new Error(`Invalid FITS HDU ${hduIndex}: ` +\n                            `expected ${dataByteLength} payload bytes ` +\n                            `at offset ${dataOffset}, but only ` +\n                            `${rawData.byteLength - dataOffset} remain.`);\n                    }\n                    const rawPayload = rawData.subarray(dataOffset, dataOffset + dataByteLength);\n                    const hdu = FITSParser.createImageHDU(header, rawPayload, dataOffset, dataByteLength, hduIndex === 0, options);\n                    fitsFile.addHDU(hdu);\n                    const paddedPayloadLength = FITSParser.getPaddedByteLength(dataByteLength);\n                    offset = dataOffset + paddedPayloadLength;\n                    break;\n                }\n                case \"BINTABLE\": {\n                    const dataByteLength = FITSParser.getBinaryTablePayloadByteLength(header);\n                    if (dataOffset + dataByteLength > rawData.byteLength) {\n                        throw new Error(`Invalid BINTABLE HDU ${hduIndex}.`);\n                    }\n                    const rawPayload = rawData.subarray(dataOffset, dataOffset + dataByteLength);\n                    const hdu = FITSParser.createBinaryTableHDU(header, rawPayload, dataOffset, dataByteLength);\n                    fitsFile.addHDU(hdu);\n                    offset = dataOffset + FITSParser.getPaddedByteLength(dataByteLength);\n                    break;\n                }\n                case \"TABLE\": {\n                    const dataByteLength = FITSParser.getAsciiTablePayloadByteLength(header);\n                    if (dataOffset + dataByteLength > rawData.byteLength) {\n                        throw new Error(`Invalid ASCII TABLE HDU ${hduIndex}: ` +\n                            `expected ${dataByteLength} payload bytes ` +\n                            `at offset ${dataOffset}, but only ` +\n                            `${rawData.byteLength - dataOffset} remain.`);\n                    }\n                    const rawPayload = rawData.subarray(dataOffset, dataOffset + dataByteLength);\n                    const hdu = FITSParser.createAsciiTableHDU(header, rawPayload, dataOffset, dataByteLength);\n                    fitsFile.addHDU(hdu);\n                    offset = dataOffset + FITSParser.getPaddedByteLength(dataByteLength);\n                    break;\n                }\n                default:\n                    throw new Error(`Unsupported FITS HDU type at index ${hduIndex}.`);\n            }\n            hduIndex++;\n        }\n        return fitsFile;\n    }\n    static getPaddedByteLength(byteLength) {\n        if (byteLength === 0) {\n            return 0;\n        }\n        return (Math.ceil(byteLength / ParseHeader.BLOCK_SIZE) * ParseHeader.BLOCK_SIZE);\n    }\n    static isPaddingOnly(rawData, offset) {\n        for (let i = offset; i < rawData.byteLength; i++) {\n            const value = rawData[i];\n            if (value !== 0x00 && value !== 0x20) {\n                return false;\n            }\n        }\n        return true;\n    }\n    static getHDUType(header, index) {\n        if (index === 0) {\n            return \"PRIMARY\";\n        }\n        const xtension = ParseHeader.getFITSItemStringValue(header, FITSHeaderManager.XTENSION);\n        if (xtension === null) {\n            return \"UNKNOWN\";\n        }\n        switch (xtension.toUpperCase()) {\n            case \"IMAGE\":\n                return \"IMAGE\";\n            case \"BINTABLE\":\n                return \"BINTABLE\";\n            case \"TABLE\":\n                return \"TABLE\";\n            default:\n                return \"UNKNOWN\";\n        }\n    }\n    static createImageHDU(header, rawPayload, dataOffset, dataByteLength, primary, options) {\n        const finalHeader = options.computeDataMinMax\n            ? (ParsePayload.computePhysicalMinAndMax(header, rawPayload) ?? header)\n            : header;\n        const bitpix = ParseHeader.getFITSItemValue(finalHeader, FITSHeaderManager.BITPIX);\n        if (bitpix === null) {\n            throw new Error(\"BITPIX not defined.\");\n        }\n        const shape = FITSImageUtils.getShape(finalHeader);\n        const typedData = ParsePayload.createTypedArray(rawPayload, bitpix);\n        if (primary) {\n            return new PrimaryHDU(finalHeader, rawPayload, dataOffset, dataByteLength, bitpix, shape, typedData);\n        }\n        return new ImageHDU(finalHeader, rawPayload, dataOffset, dataByteLength, bitpix, shape, typedData);\n    }\n    static getImagePayloadByteLength(header) {\n        const bitpix = ParseHeader.getFITSItemValue(header, FITSHeaderManager.BITPIX);\n        if (bitpix === null) {\n            throw new Error(\"BITPIX not defined.\");\n        }\n        ParsePayload.assertSupportedBITPIX(bitpix);\n        const shape = FITSImageUtils.getShape(header);\n        if (shape.length === 0) {\n            return 0;\n        }\n        const elementCount = shape.reduce((total, dimension) => total * dimension, 1);\n        const bytesPerElement = Math.abs(bitpix) / 8;\n        return elementCount * bytesPerElement;\n    }\n    static getBinaryTablePayloadByteLength(header) {\n        const rowByteLength = ParseHeader.getFITSItemValue(header, FITSHeaderManager.NAXIS1);\n        const rowCount = ParseHeader.getFITSItemValue(header, FITSHeaderManager.NAXIS2);\n        const pcount = ParseHeader.getFITSItemValue(header, FITSHeaderManager.PCOUNT) ?? 0;\n        if (rowByteLength === null || rowCount === null) {\n            throw new Error(\"BINTABLE requires NAXIS1 and NAXIS2.\");\n        }\n        return rowByteLength * rowCount + pcount;\n    }\n    static getBinaryTableColumns(header) {\n        const fieldCount = ParseHeader.getFITSItemValue(header, FITSHeaderManager.TFIELDS);\n        if (fieldCount === null) {\n            throw new Error(\"BINTABLE requires TFIELDS.\");\n        }\n        const columns = [];\n        let byteOffset = 0;\n        for (let index = 1; index <= fieldCount; index++) {\n            const tform = ParseHeader.getFITSItemStringValue(header, FITSHeaderManager.tableFieldKey(\"TFORM\", index));\n            if (tform === null) {\n                throw new Error(`Missing TFORM${index}.`);\n            }\n            const parsed = FITSBinaryTableUtils.parseTFORM(tform);\n            const name = ParseHeader.getFITSItemStringValue(header, FITSHeaderManager.tableFieldKey(\"TTYPE\", index));\n            const unit = ParseHeader.getFITSItemStringValue(header, FITSHeaderManager.tableFieldKey(\"TUNIT\", index));\n            columns.push({\n                index,\n                name,\n                format: tform,\n                type: FITSParser.mapBinaryType(parsed.code),\n                repeat: parsed.repeat,\n                byteOffset,\n                byteWidth: parsed.byteWidth,\n                unit,\n                scale: ParseHeader.getFITSItemValue(header, FITSHeaderManager.tableFieldKey(\"TSCAL\", index)) ?? 1,\n                zero: ParseHeader.getFITSItemValue(header, FITSHeaderManager.tableFieldKey(\"TZERO\", index)) ?? 0,\n                nullValue: ParseHeader.getFITSItemValue(header, FITSHeaderManager.tableFieldKey(\"TNULL\", index)),\n            });\n            byteOffset += parsed.byteWidth;\n        }\n        return columns;\n    }\n    static mapBinaryType(code) {\n        switch (code.toUpperCase()) {\n            case \"L\":\n                return \"LOGICAL\";\n            case \"X\":\n                return \"BIT\";\n            case \"B\":\n                return \"UINT8\";\n            case \"I\":\n                return \"INT16\";\n            case \"J\":\n                return \"INT32\";\n            case \"K\":\n                return \"INT64\";\n            case \"A\":\n                return \"CHAR\";\n            case \"E\":\n                return \"FLOAT32\";\n            case \"D\":\n                return \"FLOAT64\";\n            case \"C\":\n                return \"COMPLEX64\";\n            case \"M\":\n                return \"COMPLEX128\";\n            default:\n                return \"UNKNOWN\";\n        }\n    }\n    static createBinaryTableHDU(header, rawPayload, dataOffset, dataByteLength) {\n        const rowByteLength = ParseHeader.getFITSItemValue(header, FITSHeaderManager.NAXIS1);\n        const rowCount = ParseHeader.getFITSItemValue(header, FITSHeaderManager.NAXIS2);\n        if (rowByteLength === null || rowCount === null) {\n            throw new Error(\"Invalid BINTABLE header.\");\n        }\n        const columns = FITSParser.getBinaryTableColumns(header);\n        const columnsByteWidth = columns.reduce((sum, column) => sum + column.byteWidth, 0);\n        if (columnsByteWidth !== rowByteLength) {\n            throw new Error(`BINTABLE columns occupy ${columnsByteWidth} bytes per row, ` +\n                `but NAXIS1=${rowByteLength}.`);\n        }\n        return new BinaryTableHDU(header, rawPayload, dataOffset, dataByteLength, rowByteLength, rowCount, columns);\n    }\n    static getAsciiTablePayloadByteLength(header) {\n        const rowByteLength = ParseHeader.getFITSItemValue(header, FITSHeaderManager.NAXIS1);\n        const rowCount = ParseHeader.getFITSItemValue(header, FITSHeaderManager.NAXIS2);\n        if (rowByteLength === null || rowCount === null) {\n            throw new Error(\"ASCII TABLE requires NAXIS1 and NAXIS2.\");\n        }\n        if (!Number.isInteger(rowByteLength) || rowByteLength < 0) {\n            throw new Error(`Invalid ASCII TABLE NAXIS1=${rowByteLength}.`);\n        }\n        if (!Number.isInteger(rowCount) || rowCount < 0) {\n            throw new Error(`Invalid ASCII TABLE NAXIS2=${rowCount}.`);\n        }\n        const pcount = ParseHeader.getFITSItemValue(header, FITSHeaderManager.PCOUNT) ?? 0;\n        if (pcount !== 0) {\n            throw new Error(`ASCII TABLE requires PCOUNT=0, received ${pcount}.`);\n        }\n        return rowByteLength * rowCount;\n    }\n    static mapAsciiType(code) {\n        switch (code.toUpperCase()) {\n            case \"A\":\n                return \"CHAR\";\n            case \"I\":\n                return \"INTEGER\";\n            case \"F\":\n                return \"FLOAT\";\n            case \"E\":\n                return \"EXPONENTIAL\";\n            case \"D\":\n                return \"DOUBLE\";\n            default:\n                return \"UNKNOWN\";\n        }\n    }\n    static getAsciiTableColumns(header) {\n        const fieldCount = ParseHeader.getFITSItemValue(header, FITSHeaderManager.TFIELDS);\n        if (fieldCount === null) {\n            throw new Error(\"ASCII TABLE requires TFIELDS.\");\n        }\n        if (!Number.isInteger(fieldCount) || fieldCount < 0) {\n            throw new Error(`Invalid ASCII TABLE TFIELDS=${fieldCount}.`);\n        }\n        const columns = [];\n        for (let index = 1; index <= fieldCount; index++) {\n            const tform = ParseHeader.getFITSItemStringValue(header, FITSHeaderManager.tableFieldKey(\"TFORM\", index));\n            if (tform === null) {\n                throw new Error(`Missing TFORM${index}.`);\n            }\n            const tbcol = ParseHeader.getFITSItemValue(header, FITSHeaderManager.tableFieldKey(\"TBCOL\", index));\n            if (tbcol === null) {\n                throw new Error(`Missing TBCOL${index}.`);\n            }\n            if (!Number.isInteger(tbcol) || tbcol < 1) {\n                throw new Error(`Invalid TBCOL${index}=${tbcol}.`);\n            }\n            const parsed = FITSAsciiTableUtils.parseTFORM(tform);\n            const name = ParseHeader.getFITSItemStringValue(header, FITSHeaderManager.tableFieldKey(\"TTYPE\", index));\n            const unit = ParseHeader.getFITSItemStringValue(header, FITSHeaderManager.tableFieldKey(\"TUNIT\", index));\n            columns.push({\n                index,\n                name,\n                format: tform,\n                type: FITSParser.mapAsciiType(parsed.code),\n                startColumn: tbcol,\n                /*\n                 * FITS TBCOL is 1-based.\n                 * JavaScript offsets are 0-based.\n                 */\n                byteOffset: tbcol - 1,\n                width: parsed.width,\n                decimals: parsed.decimals,\n                unit,\n            });\n        }\n        return columns;\n    }\n    static validateAsciiTableColumns(columns, rowByteLength) {\n        for (const column of columns) {\n            const endOffset = column.byteOffset + column.width;\n            if (endOffset > rowByteLength) {\n                throw new Error(`ASCII TABLE column ${column.index} ` +\n                    `extends to byte ${endOffset}, ` +\n                    `but NAXIS1=${rowByteLength}.`);\n            }\n        }\n    }\n    static createAsciiTableHDU(header, rawPayload, dataOffset, dataByteLength) {\n        const rowByteLength = ParseHeader.getFITSItemValue(header, FITSHeaderManager.NAXIS1);\n        const rowCount = ParseHeader.getFITSItemValue(header, FITSHeaderManager.NAXIS2);\n        if (rowByteLength === null || rowCount === null) {\n            throw new Error(\"Invalid ASCII TABLE header.\");\n        }\n        const columns = FITSParser.getAsciiTableColumns(header);\n        FITSParser.validateAsciiTableColumns(columns, rowByteLength);\n        return new AsciiTableHDU(header, rawPayload, dataOffset, dataByteLength, rowByteLength, rowCount, columns);\n    }\n    static createMatrix(payload, header) {\n        const NAXIS1 = ParseHeader.getFITSItemValue(header, FITSHeaderManager.NAXIS1);\n        if (NAXIS1 === null) {\n            throw new Error(\"NAXIS1 not defined.\");\n        }\n        const NAXIS2 = ParseHeader.getFITSItemValue(header, FITSHeaderManager.NAXIS2);\n        if (NAXIS2 === null) {\n            throw new Error(\"NAXIS2 not defined.\");\n        }\n        const BITPIX = ParseHeader.getFITSItemValue(header, FITSHeaderManager.BITPIX);\n        if (BITPIX === null) {\n            throw new Error(\"BITPIX not defined.\");\n        }\n        const bytesXelem = Math.abs(BITPIX / 8);\n        // if (payload.length !== NAXIS1 * NAXIS2 * bytesXelem) {\n        //   throw new Error(\"Payload size does not match the expected matrix dimensions.\");\n        // }\n        // const matrix: Array<Uint8Array> = [];\n        const matrix = [];\n        for (let i = 0; i < NAXIS2; i++) {\n            matrix.push(payload.slice(i * NAXIS1 * bytesXelem, (i + 1) * NAXIS1 * bytesXelem));\n        }\n        return matrix;\n    }\n    /**\n     * @deprecated Legacy FITSParsed writer API.\n     */\n    static saveFITSLocally(fitsParsed, path) {\n        return FITSWriter.writeFITSFile(fitsParsed, path);\n    }\n    static async getFile(uri) {\n        if (!uri.substring(0, 5).toLowerCase().includes(\"http\")) {\n            const p = await import(\"./getLocalFile.js\");\n            const rawData = await p.getLocalFile(uri);\n            if (rawData?.length) {\n                const uint8 = new Uint8Array(rawData);\n                return uint8;\n            }\n            return new Uint8Array(0);\n        }\n        else {\n            const p = await import(\"./getFile.js\");\n            const rawData = await p.getFile(uri);\n            if (rawData?.byteLength) {\n                const uint8 = new Uint8Array(rawData);\n                return uint8;\n            }\n            return new Uint8Array(0);\n        }\n    }\n}\n// const url = \"http://skies.esac.esa.int/Herschel/normalized/PACS_hips160//Norder8/Dir40000/Npix47180.fits\"\n// FITSParser.loadFITS(url).then((fits) => {\n//   if (fits == null) {\n//     return null\n//   }\n//   const path = \"./fitsTest1.fits\"\n//   console.log(fits.header)\n//   FITSParser.saveFITSLocally(fits, path)\n//   console.log(\"finished\")\n// })\n// // const file = \"/Users/fabriziogiordano/Desktop/PhD/code/new/FITSParser/tests/inputs/empty.fits\"\n// const file = \"/Users/fabriziogiordano/Desktop/PhD/code/new/FITSParser/tests/inputs/Npix43348.fits\"\n// FITSParser.loadFITS(file).then((fits) => {\n//   if (fits == null) {\n//     return null\n//   }\n//   const path = \"./fitsTest2.fits\"\n//   console.log(fits.header)\n//   FITSParser.saveFITSLocally(fits, path)\n//   console.log(\"finished\")\n// })\n//# sourceMappingURL=FITSParser.js.map","import {\n  FITSFile,\n  FITSHeaderManager,\n  FITSWriter,\n  ParsePayload,\n  PrimaryHDU,\n} from \"jsfitsio\";\n\nexport class FITSWriterAdapter {\n  static writeImage(\n    header: FITSHeaderManager,\n    data: Array<Uint8Array>,\n    filePath: string,\n  ): void {\n    const bitpix = Number(header.findById(FITSHeaderManager.BITPIX)?.value);\n\n    if (!Number.isFinite(bitpix)) {\n      throw new Error(\"BITPIX not defined or invalid\");\n    }\n\n    const naxis = Number(header.findById(FITSHeaderManager.NAXIS)?.value);\n\n    if (!Number.isInteger(naxis) || naxis < 0) {\n      throw new Error(\"NAXIS not defined or invalid\");\n    }\n\n    const shape: number[] = [];\n\n    for (let axis = 1; axis <= naxis; axis++) {\n      const dimension = Number(\n        header.findById(FITSHeaderManager.naxisKey(axis))?.value,\n      );\n\n      if (!Number.isInteger(dimension) || dimension < 0) {\n        throw new Error(`NAXIS${axis} not defined or invalid`);\n      }\n\n      shape.push(dimension);\n    }\n\n    /*\n     * wcslight internally stores FITS image data as\n     * multiple Uint8Array chunks/rows.\n     *\n     * jsfitsio 3 uses one contiguous raw payload.\n     */\n    const dataByteLength = data.reduce(\n      (total, chunk) => total + chunk.byteLength,\n      0,\n    );\n\n    const rawData = new Uint8Array(dataByteLength);\n\n    let offset = 0;\n\n    for (const chunk of data) {\n      rawData.set(chunk, offset);\n      offset += chunk.byteLength;\n    }\n\n    const typedData = ParsePayload.createTypedArray(rawData, bitpix);\n\n    const primaryHDU = new PrimaryHDU(\n      header,\n      rawData,\n\n      /*\n       * dataOffset describes the original source-file\n       * position when parsing.\n       *\n       * For a newly created in-memory HDU there is no\n       * source-file offset yet. FITSWriter computes the\n       * actual serialized layout.\n       */\n      0,\n\n      dataByteLength,\n      bitpix,\n      shape,\n      typedData,\n    );\n\n    const fitsFile = new FITSFile([primaryHDU]);\n\n    FITSWriter.writeFITSFileModel(fitsFile, filePath);\n  }\n}\n","import { FITSHeaderManager } from \"jsfitsio\";\n\nimport { Point } from \"../model/Point.js\";\n\nimport { TilesRaDecList2 } from \"./hips/TilesRaDecList2.js\";\nimport { FITS } from \"../model/FITS.js\";\n\n/**\n * Summary. (bla bla bla)\n *\n * Description. (bla bla bla)\n *\n * @link   github https://github.com/fab77/wcslight\n * @author Fabrizio Giordano <fabriziogiordano77@gmail.com>\n */\n\nexport abstract class AbstractProjection {\n\n  public abstract getFITSHeader(): FITSHeaderManager;\n\n  public abstract getCommonFitsHeaderParams(): FITSHeaderManager;\n\n  public abstract setPixelValues(\n    values: TilesRaDecList2,\n    header: FITSHeaderManager,\n  ): FITS;\n\n  public abstract getImageRADecList(\n    center: Point, radius: number,\n    pxsize: number, naxisWidth: number\n  ): TilesRaDecList2;\n\n  public abstract pix2world(i: number, j: number, pxsize: number, minra: number, mindec: number): Point;\n\n  public abstract world2pix(radeclist: TilesRaDecList2): TilesRaDecList2;\n\n  public abstract computeNaxisWidth(radius: number, pxsize: number): number;\n\n  public abstract generateFITSFile(pixelAngSize: number,\n    BITPIX: number,\n    TILE_WIDTH: number,\n    BLANK: number, BZERO: number, BSCALE: number,\n    cRA: number, cDec: number,\n    minValue: number, maxValue: number,\n    raDecWithValues: TilesRaDecList2): FITS\n}\n","export enum NumberType {\n    DEGREES,\n    RADIANS,\n    DECIMAL,\n    HMS,\n    DMS\n}","/**\n * @author Fabrizio Giordano (Fab)\n */\n// import vec3 from 'gl-matrix';\n\nimport { AstroCoords } from \"./AstroCoords.js\";\nimport { CartesianCoords } from \"./CartesianCoords.js\";\nimport { HMSCoords } from \"./HMSCoords.js\";\nimport { NumberType } from \"./NumberType.js\";\nimport { SexagesimalCoords } from \"./SexagesimalCoords.js\";\nimport { SphericalCoords } from \"./SphericalCoords.js\";\n\nfunction Utils(){\n\t\n}\n\nexport function cartesianToSpherical(xyz: CartesianCoords): SphericalCoords{\n\tlet dotXYZ = dot(xyz, xyz);\n\tlet r = Math.sqrt(dotXYZ);\t\n\tlet thetaRad = Math.acos(xyz.z/r);\n\tlet thetaDeg = radToDeg(thetaRad);\n\t// NB: in atan(y/x) is written with params switched atan2(x, y)\n\tlet phiRad = Math.atan2(xyz.y,xyz.x);\n\tlet phiDeg = radToDeg(phiRad);\n\n\tif (phiDeg < 0){\n\t\tphiDeg += 360;\n\t}\n\treturn {\n\t\tphiDeg: phiDeg, \n\t\tthetaDeg: thetaDeg,\n\t\tphiRad:phiRad,\n\t\tthetaRad: thetaRad\n\t};\n};\n\nexport function sphericalToAstro(phiTheta: SphericalCoords): AstroCoords{\n\tlet raDeg: number;\n\tlet decDeg: number;\n\n\traDeg = phiTheta.phiDeg;\n\tif (raDeg < 0){\n\t\traDeg += 360;\n\t}\n\tdecDeg = 90 - phiTheta.thetaDeg;\n\t\n\treturn {\n\t\t\"raDeg\": raDeg,\n\t\t\"decDeg\": decDeg,\n\t\t\"raRad\": degToRad(raDeg),\n\t\t\"decRad\": degToRad(decDeg)\n\n\t};\n}\n\nexport function astroToSpherical(raDec: AstroCoords): SphericalCoords{\n\t\n\tlet phiDeg: number;\n\tlet thetaDeg: number;\n\n\tphiDeg = raDec.raDeg;\n\tif (phiDeg < 0){\n\t\tphiDeg += 360;\n\t}\n\t\n\tthetaDeg = 90 - raDec.decDeg;\n\t\n\treturn {\n\t\t\"phiDeg\": phiDeg,\n\t\t\"thetaDeg\": thetaDeg,\n\t\t\"phiRad\": degToRad(phiDeg),\n\t\t\"thetaRad\": degToRad(thetaDeg),\n\t};\n}\n\nexport function sphericalToCartesian(phiTheta: SphericalCoords, r: number): CartesianCoords{\n\tr = (r == undefined) ? 1 : r;\n\tvar x = r * Math.sin(phiTheta.thetaRad) * Math.cos(phiTheta.phiRad);\n\tvar y = r * Math.sin(phiTheta.thetaRad) * Math.sin(phiTheta.phiRad);\n\tvar z = r * Math.cos(phiTheta.thetaRad);\n\n\treturn {\n\t\t\"x\": x, \n\t\t\"y\": y, \n\t\t\"z\": z\n\t};\n};\n\nexport function fillAstro(ra: number, dec: number, unit: NumberType): AstroCoords | null{\n\tif (unit == NumberType.DEGREES) {\n\t\treturn {\n\t\t\t\"raDeg\": ra,\n\t\t\t\"decDeg\": dec,\n\t\t\t\"raRad\": degToRad(ra),\n\t\t\t\"decRad\": degToRad(dec)\n\t\t}\n\t} else if (unit == NumberType.RADIANS) {\n\t\treturn {\n\t\t\t\"raRad\": ra,\n\t\t\t\"decRad\": dec,\n\t\t\t\"raDeg\": radToDeg(ra),\n\t\t\t\"decDeg\": radToDeg(dec)\n\t\t}\n\t} else {\n\t\tconsole.error(\"Wrong operation. NumberType \" + unit + \" not supported\");\n\t\treturn null\n\t}\n\t\n}\n\n\nexport function fillSpherical(phi: number, theta: number, unit: NumberType):  SphericalCoords | null{\n\tif (unit == NumberType.DEGREES) {\n\t\treturn {\n\t\t\t\"phiDeg\": phi,\n\t\t\t\"thetaDeg\": theta,\n\t\t\t\"phiRad\": degToRad(phi),\n\t\t\t\"thetaRad\": degToRad(theta)\n\t\t}\n\t} else if (unit == NumberType.RADIANS) {\n\t\treturn {\n\t\t\t\"phiDeg\": radToDeg(phi),\n\t\t\t\"thetaDeg\": radToDeg(theta),\n\t\t\t\"phiRad\": phi,\n\t\t\t\"thetaRad\": theta\n\t\t}\n\t} else {\n\t\tconsole.error(\"Wrong operation. NumberType \" + unit + \" not supported\");\n\t\treturn null\n\t}\n}\n\nfunction dot(a: CartesianCoords, b: CartesianCoords) : number{\n\treturn a.x * b.x + a.y * b.y + a.z * b.z;\n  }\n\nexport function colorHex2RGB(hexColor: string): [number, number, number] {\n\n//\tconsole.log(hexColor);\n\tvar hex1 = hexColor.substring(1,3);\n\tvar hex2 = hexColor.substring(3,5);\n\tvar hex3 = hexColor.substring(5,7);\n\t\n\tvar dec1 = parseInt(hex1, 16);\n\tvar dec2 = parseInt(hex2, 16);\n\tvar dec3 = parseInt(hex3, 16);\n\t\n\tvar rgb1 = (dec1 / 255).toFixed(2);\n\tvar rgb2 = (dec2 / 255).toFixed(2);\n\tvar rgb3 = (dec3 / 255).toFixed(2);\n\t\n\treturn [parseFloat(rgb1), parseFloat(rgb2), parseFloat(rgb3)];\n\n}\n\nexport function degToRad(degrees: number) : number{\n\treturn (degrees / 180 ) * Math.PI ;\n}\n\nexport function radToDeg(radians: number) : number{\n\treturn radians * 180 / Math.PI;\n}\n\nexport function raDegToHMS(raDeg: number): HMSCoords{\n\t\n\tvar h = Math.floor(raDeg/15);\n\tvar m = Math.floor((raDeg/15 - h) * 60);\n\tvar s = (raDeg/15 - h - m/60) * 3600;\n\t\n\treturn {\n\t\th: h, \n\t\tm: m, \n\t\ts: s\n\t};\n}\n\nexport function decDegToDMS(decDeg: number): SexagesimalCoords{\n\tvar sign = 1;\n\tif (decDeg < 0){\n\t\tsign = -1;\n\t}\n\t\n\tvar decDeg_abs = Math.abs(decDeg);\n\tvar d = Math.trunc(decDeg_abs);\n\t\n\tvar m = Math.trunc( (decDeg_abs - d) * 60);\n\t\n\tvar s = (decDeg_abs - d - m/60) * 3600;\n\td = d * sign;\n\t\n\treturn {\n\t\td: d, \n\t\tm: m, \n\t\ts: s\n\t};\n}\n\nfunction dms2DecDeg(decDMS: SexagesimalCoords){\n\tvar sign = Math.sign(decDMS.d);\n\tvar deg = (decDMS.d) + sign * (decDMS.m / 60) + sign * (decDMS.s/3600);\n\treturn deg;\n}\n\nfunction hms2RaDeg(raHMS: HMSCoords){\n\tvar sign = Math.sign(raHMS.h);\n\tvar deg = (raHMS.h + sign * (raHMS.m / 60) + sign * (raHMS.s/3600)) * 15;\n\treturn deg;\n}\n\nfunction worldToModel(xy: [number, number], radius: number): [number, number, number]{\n\tvar x = xy[0];\n\tvar y = xy[1];\n\tvar z = Math.sqrt(radius*radius - xy[0]*xy[0] - xy[1]*xy[1]);\n\treturn [x, y, z];\n}\n\n","/**\n * @author Fabrizio Giordano (Fab77)\n * Enum for coordinate types.\n * @readonly\n * @enum {{name: string, hex: string}}\n */\n\nexport enum CoordsType {\n  CARTESIAN = \"cartesian\",\n  SPHERICAL = \"spherical\",\n  ASTRO = \"astro\"\n}\n","export class Config {\n    static MAX_DECIMALS:number = 12\n}","/**\n * @author Fabrizio Giordano (Fab77)\n */\n\nimport {\n  sphericalToCartesian,\n  cartesianToSpherical,\n  sphericalToAstro,\n  astroToSpherical,\n  fillSpherical,\n  fillAstro\n} from './Utils.js';\nimport { CartesianCoords } from './CartesianCoords.js';\nimport { AstroCoords } from './AstroCoords.js';\nimport { CoordsType } from './CoordsType.js';\nimport { SphericalCoords } from './SphericalCoords.js';\nimport { NumberType } from './NumberType.js';\nimport { Config } from '../Config.js';\n\nconst wrap360 = (deg: number) => ((deg % 360) + 360) % 360;\nconst clampDec = (deg: number) => Math.max(-90, Math.min(90, deg));\n\nexport class Point {\n  private astro!: AstroCoords;\n  private spherical!: SphericalCoords;\n  private cartesian!: CartesianCoords;\n\n  constructor(in_type: CoordsType, unit: NumberType, ...coords: number[]) {\n    if (in_type === CoordsType.CARTESIAN) {\n      // Initialise cartesian first (avoid writing into undefined)\n      this.cartesian = {\n        x: parseFloat(coords[0].toFixed(Config.MAX_DECIMALS)),\n        y: parseFloat(coords[1].toFixed(Config.MAX_DECIMALS)),\n        z: parseFloat(coords[2].toFixed(Config.MAX_DECIMALS))\n      } as CartesianCoords;\n\n      this.spherical = cartesianToSpherical(this.cartesian);\n      this.astro = sphericalToAstro(this.spherical);\n\n    } else if (in_type === CoordsType.ASTRO) {\n      const c = fillAstro(coords[0], coords[1], unit);\n      if (!c) throw new Error('Invalid Astro coordinates');\n\n      this.astro = c;\n      this.spherical = astroToSpherical(this.astro);\n      this.cartesian = sphericalToCartesian(this.spherical, 1.0);\n\n    } else if (in_type === CoordsType.SPHERICAL) {\n      const s = fillSpherical(coords[0], coords[1], unit);\n      if (!s) throw new Error('Invalid Spherical coordinates');\n\n      this.spherical = s;\n      this.cartesian = sphericalToCartesian(this.spherical, 1.0);\n      this.astro = sphericalToAstro(this.spherical);\n\n    } else {\n      throw new Error(`CoordsType ${in_type} not recognised.`);\n    }\n\n    // --- Normalise & keep systems consistent ---\n    // Robust wrap for RA/phi\n    const raWrapped = wrap360(this.astro.raDeg);\n    const phiWrapped = wrap360(this.spherical.phiDeg);\n\n    // Only reassign if changed (avoids unnecessary recompute)\n    if (raWrapped !== this.astro.raDeg) {\n      this.astro.raDeg = raWrapped;\n      // keep spherical/cartesian aligned with astro\n      this.spherical = astroToSpherical(this.astro);\n      this.cartesian = sphericalToCartesian(this.spherical, 1.0);\n    }\n    if (phiWrapped !== this.spherical.phiDeg) {\n      this.spherical.phiDeg = phiWrapped;\n      // keep astro/cartesian aligned with spherical\n      this.cartesian = sphericalToCartesian(this.spherical, 1.0);\n      this.astro = sphericalToAstro(this.spherical);\n    }\n\n    // Clamp Dec defensively and re-sync if it changed\n    const decClamped = clampDec(this.astro.decDeg);\n    if (decClamped !== this.astro.decDeg) {\n      this.astro.decDeg = decClamped;\n      this.spherical = astroToSpherical(this.astro);\n      this.cartesian = sphericalToCartesian(this.spherical, 1.0);\n    }\n  }\n\n  getSpherical() {\n    return this.spherical;\n  }\n\n  getAstro() {\n    return this.astro;\n  }\n\n  getCartesian() {\n    return this.cartesian;\n  }\n}\n","export class MinMaxValue {\n    min: number\n    max: number\n    \n    constructor(min: number, max: number) {\n        this.min = min\n        this.max = max\n    }\n\n    getMinValue() {\n        return this.min\n    }\n    \n    getMaxValue() {\n        return this.max\n    }\n\n}","export class RADecMinMaxCentral {\n    centralRA: number\n    centralDec: number\n    minRA: number\n    minDec: number\n    maxRA: number\n    maxDec: number\n    \n    constructor(centralRA: number, centralDec: number, minRA: number,\n    minDec: number, maxRA: number, maxDec: number) {\n        this.centralDec = centralDec\n        this.centralRA = centralRA\n\n        this.maxDec = maxDec\n        this.maxRA = maxRA\n\n        this.minRA = minRA\n        this.minDec = minDec\n    }\n\n    getMinRA() {\n        return this.minRA\n    }\n    \n    getMinDec() {\n        return this.minDec\n    }\n    \n    getMaxRA() {\n        return this.maxRA\n    }\n    \n    getMaxDec() {\n        return this.maxDec\n    }\n\n    getCentralRA() {\n        return this.centralRA\n    }\n    \n    getCentralDec() {\n        return this.centralDec\n    }\n\n\n    setMinRA(minRA: number) {\n        this.minRA = minRA\n    }\n    \n    setMinDec(minDec: number) {\n        this.minDec = minDec\n    }\n    \n    setMaxRA(maxRA: number) {\n        this.maxRA = maxRA\n    }\n    \n    setMaxDec(maxDec: number) {\n        this.maxDec = maxDec\n    }\n\n    setCentralRA(cRA: number) {\n        this.centralRA = cRA\n    }\n    \n    setCentralDec(cDec: number) {\n        this.centralDec = cDec\n    }\n\n}","import { MinMaxValue } from \"../MinMaxValue.js\"\nimport { RADecMinMaxCentral } from \"../RADecMinMaxCentral.js\"\nimport { ImagePixel } from \"./ImagePixel.js\"\n\nexport class TilesRaDecList2 {\n\n    // hipsOrder: number\n    tileList: Array<number>\n    imagePixelList: ImagePixel[]\n    minPixelValue: number | null = null\n    maxPixelValue: number | null = null\n    BZERO: number | null = null\n    BSCALE: number | null = null\n    BLANK: number | null = null\n\n\n    // constructor(hipsOrder: number) {\n    //     this.hipsOrder = hipsOrder\n    constructor() {\n        this.tileList = []\n        this.imagePixelList = new Array<ImagePixel>()\n    }\n\n    setBZERO(BZERO: number) {\n        this.BZERO = BZERO\n    }\n\n    setBSCALE(BSCALE: number) {\n        this.BSCALE = BSCALE\n    }\n\n    setBLANK(BLANK: number) {\n        this.BLANK = BLANK\n    }\n\n    getBZERO() {\n        return this.BZERO\n    }\n\n    getBSCALE() {\n        return this.BSCALE\n    }\n\n    getBLANK() {\n        return this.BLANK\n    }\n\n    findImagePixel(i: number, j: number) {\n        return this.imagePixelList.find(p => p.i === i && p.j === j) || null;\n    }\n\n    getImagePixelsByTile(tileno: number): ImagePixel[] {\n        return this.imagePixelList.filter(p => p.tileno === tileno);\n    }\n\n    getImagePixelList() {\n        return this.imagePixelList\n    }\n\n    getTilesList() {\n        return this.tileList\n    }\n\n    addImagePixel(imgpx: ImagePixel) {\n        this.imagePixelList.push(imgpx)\n    }\n\n    addTileNumber(tileno: number) {\n        if (!this.tileList.includes(tileno)) {\n            this.tileList.push(tileno)\n        }\n    }\n\n\n    computeRADecMinMaxCentral(): RADecMinMaxCentral | null {\n        if (this.imagePixelList.length === 0) return null;\n\n        // Single pass, skip non-finite values\n        let minRA = Infinity, maxRA = -Infinity;\n        let minDec = Infinity, maxDec = -Infinity;\n\n        for (const p of this.imagePixelList) {\n            if (Number.isFinite(p.ra)) {\n                if (p.ra < minRA) minRA = p.ra;\n                if (p.ra > maxRA) maxRA = p.ra;\n            }\n            if (Number.isFinite(p.dec)) {\n                if (p.dec < minDec) minDec = p.dec;\n                if (p.dec > maxDec) maxDec = p.dec;\n            }\n        }\n\n        // If all values were non-finite, bail out\n        if (!Number.isFinite(minRA) || !Number.isFinite(maxRA) ||\n            !Number.isFinite(minDec) || !Number.isFinite(maxDec)) {\n            return null;\n        }\n\n        const cRA = minRA + (maxRA - minRA) / 2;\n        const cDec = minDec + (maxDec - minDec) / 2;\n\n        return new RADecMinMaxCentral(cRA, cDec, minRA, minDec, maxRA, maxDec);\n    }\n\n    setMinMaxValue(value: number | null) {\n        if (!value) return\n\n        if (!this.minPixelValue) {\n            this.minPixelValue = value\n        } else if (value < this.minPixelValue) {\n            this.minPixelValue = value\n        }\n\n        if (!this.maxPixelValue) {\n            this.maxPixelValue = value\n        } else if (value > this.minPixelValue) {\n            this.maxPixelValue = value\n        }\n    }\n\n    getMinMaxValues() {\n        if (this.minPixelValue && this.maxPixelValue) {\n            return new MinMaxValue(this.minPixelValue, this.maxPixelValue)\n        }\n        return null\n\n    }\n\n}\n","import { ParsePayload } from \"jsfitsio\";\n\nexport class ImagePixel {\n  i: number;\n  j: number;\n  ra: number;\n  dec: number;\n  tileno: number | undefined;\n  uint8value: Uint8Array | null = null;\n  value: number | null = null;\n\n  constructor(i: number, j: number, tileno: number | undefined);\n\n  constructor(ra: number, dec: number, tileno: number | undefined);\n\n  constructor(a: number, b: number, tileno: number | undefined) {\n    this.tileno = tileno;\n\n    // Heuristic: if `a` and `b` are integers, treat them as `i` and `j`\n    if (Number.isInteger(a) && Number.isInteger(b)) {\n      this.i = a;\n      this.j = b;\n      this.ra = NaN;\n      this.dec = NaN;\n    } else {\n      this.ra = a;\n      this.dec = b;\n      this.i = -1;\n      this.j = -1;\n    }\n  }\n\n  geti() {\n    return this.i;\n  }\n\n  getj() {\n    return this.j;\n  }\n  getRADeg() {\n    return this.ra;\n  }\n\n  getDecDeg() {\n    return this.dec;\n  }\n\n  getUint8Value() {\n    return this.uint8value;\n  }\n\n  getValue() {\n    return this.value;\n  }\n\n  setValue(value: Uint8Array, bitpix: number) {\n    if (this.uint8value == undefined) {\n      const bytesXelem = Math.abs(bitpix / 8);\n      this.uint8value = new Uint8Array(bytesXelem);\n    }\n    this.uint8value = value;\n    this.value = ParsePayload.extractPixelValue(value, 0, bitpix);\n  }\n\n  setTileNumber(tileno: number) {\n    this.tileno = tileno;\n  }\n\n  setij(i: number, j: number) {\n    this.i = i;\n    this.j = j;\n  }\n\n  setRADecDeg(ra: number, dec: number) {\n    this.ra = ra;\n    this.dec = dec;\n  }\n}\n","\nimport { FITSHeaderManager } from 'jsfitsio';\n\nexport class FITS {\n\n    private header!: FITSHeaderManager\n    private payload: Uint8Array<ArrayBufferLike>[] = []\n\n    constructor(header: FITSHeaderManager, data: Map<number, Array<Uint8Array>>) {\n        this.header = header\n        this.setData(data)\n    }\n\n    setData(data: Map<number, Array<Uint8Array>>){\n        this.payload = Array.from(data.values()).flatMap(row => row);\n    }\n\n    getHeader() {\n        return this.header\n    }\n    \n    getData() {\n        return this.payload\n    }\n\n\n\n}","export class FITSUtils {\n  static convertBlankToBytes(blank: number, nbytes: number): Uint8Array {\n    const buffer = new ArrayBuffer(nbytes);\n\n    const view = new DataView(buffer);\n\n    switch (nbytes) {\n      case 1:\n        view.setUint8(0, blank);\n        break;\n\n      case 2:\n        view.setInt16(0, blank, false);\n        break;\n\n      case 4:\n        view.setInt32(0, blank, false);\n        break;\n\n      case 8:\n        view.setBigInt64(0, BigInt(blank), false);\n        break;\n\n      default:\n        throw new Error(`Unsupported FITS integer byte width: ${nbytes}`);\n    }\n\n    return new Uint8Array(buffer);\n  }\n}\n","/**\n * Summary. (bla bla bla)\n *\n * Description. (bla bla bla)\n *\n * @link   github https://github.com/fab77/wcslight\n * @author Fabrizio Giordano <fabriziogiordano77@gmail.com>\n */\n\nimport {\n  FITSParser,\n  FITSHeaderManager,\n  FITSHeaderItem,\n  ParsePayload,\n  PrimaryHDU,\n} from \"jsfitsio\";\n\nimport { AbstractProjection } from \"../AbstractProjection.js\";\nimport { Point } from \"../../model/Point.js\";\nimport { CoordsType } from \"../../model/CoordsType.js\";\nimport { NumberType } from \"../../model/NumberType.js\";\nimport { TilesRaDecList2 } from \"../hips/TilesRaDecList2.js\";\nimport { ImagePixel } from \"../hips/ImagePixel.js\";\nimport { FITS } from \"../../model/FITS.js\";\n\nimport { APP_VERSION } from \"../../Version.js\"; // adjust path as needed\nimport { FITSUtils } from \"../../utils/FITSUtils.js\";\n\n// import { HiPSProp } from '../hips/HiPSProp.js';\n\nexport class CartesianProjection extends AbstractProjection {\n  minra!: number;\n  mindec!: number;\n  naxis1!: number;\n  naxis2!: number;\n  bitpix!: number;\n\n  fitsheader: FITSHeaderManager;\n  pxvalues: Array<Uint8Array>;\n\n  CTYPE1: string = \"'RA---CAR'\";\n  CTYPE2: string = \"'DEC--CAR'\";\n  craDeg!: number;\n  cdecDeg!: number;\n\n  pxsize!: number;\n  pxsize1!: number;\n  pxsize2!: number;\n\n  _wcsname: string;\n\n  constructor() {\n    super();\n    this._wcsname = \"CAR\"; // TODO check WCS standard and create ENUM\n    this.pxvalues = new Array<Uint8Array>();\n    this.fitsheader = new FITSHeaderManager();\n  }\n\n  async initFromFile(infile: string): Promise<PrimaryHDU> {\n    const fitsFile = await FITSParser.loadFITSFile(infile);\n    const fits = fitsFile?.primaryHDU;\n\n    if (!fits) {\n      throw new Error(`Unable to load FITS file: ${infile}`);\n    }\n\n    if (fits.naxis !== 2) {\n      throw new Error(\n        `CartesianProjection requires a 2D FITS image, got NAXIS=${fits.naxis}`,\n      );\n    }\n\n    this.pxvalues = this.createRawRows(fits);\n    this.fitsheader = fits.header;\n    this.naxis1 = fits.shape[0] ?? 0;\n    this.naxis2 = fits.shape[1] ?? 0;\n    this.bitpix = fits.bitpix;\n    this.craDeg = fits.header.findById(\"CRVAL1\")?.value as number;\n    this.cdecDeg = fits.header.findById(\"CRVAL2\")?.value as number;\n    const pxsize1 = this.fitsheader.findById(\"CDELT1\")?.value as number;\n    const pxsize2 = this.fitsheader.findById(\"CDELT2\")?.value as number;\n\n    if (pxsize1 !== pxsize2 || pxsize1 === undefined || pxsize2 === undefined) {\n      throw new Error(\"pxsize1 is not equal to pxsize2\");\n    }\n    this.pxsize = pxsize1;\n    this.minra = this.craDeg - (this.pxsize * this.naxis1) / 2;\n    if (this.minra < 0) {\n      this.minra += 360;\n    }\n    this.mindec = this.cdecDeg - (this.pxsize * this.naxis2) / 2;\n\n    return fits;\n  }\n\n  getBytePerValue(): number {\n    return Math.abs(this.bitpix / 8);\n  }\n\n  extractPhysicalValues(fits: PrimaryHDU): number[][] {\n    if (fits.rawData === null) {\n      throw new Error(\"FITS image does not contain a payload\");\n    }\n\n    const bzero = Number(fits.header.findById(\"BZERO\")?.value ?? 0);\n    const bscale = Number(fits.header.findById(\"BSCALE\")?.value ?? 1);\n    const naxis1 = fits.shape[0] ?? 0;\n    const naxis2 = fits.shape[1] ?? 0;\n    const bitpix = fits.bitpix;\n    const bytesPerElement = Math.abs(bitpix) / 8;\n    const physicalValues = new Array<number[]>(naxis2);\n\n    for (let row = 0; row < naxis2; row++) {\n      physicalValues[row] = new Array<number>(naxis1);\n\n      for (let column = 0; column < naxis1; column++) {\n        const elementIndex = row * naxis1 + column;\n\n        const byteOffset = elementIndex * bytesPerElement;\n\n        const pixelValue = ParsePayload.extractPixelValue(\n          fits.rawData,\n          byteOffset,\n          bitpix,\n        );\n\n        physicalValues[row][column] = bzero + bscale * pixelValue;\n      }\n    }\n    return physicalValues;\n  }\n\n  prepareHeader(\n    pixelAngSize: number,\n    BITPIX: number,\n    TILE_WIDTH: number,\n    BLANK: number,\n    BZERO: number,\n    BSCALE: number,\n    cRA: number,\n    cDec: number,\n    minValue: number,\n    maxValue: number,\n  ): FITSHeaderManager {\n    const fitsheader = new FITSHeaderManager();\n\n    fitsheader.insert(new FITSHeaderItem(\"SIMPLE\", \"T\", \"\"));\n    fitsheader.insert(new FITSHeaderItem(\"NAXIS1\", TILE_WIDTH, \"\"));\n    fitsheader.insert(new FITSHeaderItem(\"NAXIS2\", TILE_WIDTH, \"\"));\n    fitsheader.insert(new FITSHeaderItem(\"NAXIS\", 2, \"\"));\n    fitsheader.insert(new FITSHeaderItem(\"BITPIX\", BITPIX, \"\"));\n    fitsheader.insert(new FITSHeaderItem(\"BLANK\", BLANK, \"\"));\n    fitsheader.insert(new FITSHeaderItem(\"BSCALE\", BSCALE, \"\"));\n    fitsheader.insert(new FITSHeaderItem(\"BZERO\", BZERO, \"\"));\n\n    fitsheader.insert(new FITSHeaderItem(\"CTYPE1\", this.CTYPE1, \"\"));\n    fitsheader.insert(new FITSHeaderItem(\"CTYPE2\", this.CTYPE2, \"\"));\n\n    fitsheader.insert(new FITSHeaderItem(\"CDELT1\", pixelAngSize, \"\")); // ??? Pixel spacing along axis 1 ???\n    fitsheader.insert(new FITSHeaderItem(\"CDELT2\", pixelAngSize, \"\")); // ??? Pixel spacing along axis 2 ???\n    fitsheader.insert(new FITSHeaderItem(\"CRPIX1\", TILE_WIDTH / 2, \"\")); // central/reference pixel i along naxis1\n    fitsheader.insert(new FITSHeaderItem(\"CRPIX2\", TILE_WIDTH / 2, \"\")); // central/reference pixel j along naxis2\n\n    fitsheader.insert(new FITSHeaderItem(\"CRVAL1\", cRA, \"\")); // central/reference pixel RA\n    fitsheader.insert(new FITSHeaderItem(\"CRVAL2\", cDec, \"\")); // central/reference pixel Dec\n\n    const min = BZERO + BSCALE * minValue;\n    const max = BZERO + BSCALE * maxValue;\n    fitsheader.insert(new FITSHeaderItem(\"DATAMIN\", min, \"\")); // min data value\n    fitsheader.insert(new FITSHeaderItem(\"DATAMAX\", max, \"\")); // max data value\n\n    fitsheader.insert(\n      new FITSHeaderItem(\"ORIGIN\", `WCSLight v.${APP_VERSION}`, \"\"),\n    );\n    fitsheader.insert(\n      new FITSHeaderItem(\n        \"COMMENT\",\n        \"WCSLight developed by F.Giordano and Y.Ascasibar\",\n        \"\",\n      ),\n    );\n    fitsheader.insert(new FITSHeaderItem(\"END\", \"\", \"\"));\n\n    return fitsheader;\n  }\n\n  // TODO CHECK: there are 4 header related methods!!! prepareHeader, prepareFITSHeader, getCommonFitsHeaderParams and getFITSHeader\n  getFITSHeader(): FITSHeaderManager {\n    return this.fitsheader;\n  }\n  // TODO CHECK: there are 4 header related methods!!! prepareHeader, prepareFITSHeader, getCommonFitsHeaderParams and getFITSHeader\n  getCommonFitsHeaderParams(): FITSHeaderManager {\n    let header = new FITSHeaderManager();\n    for (const item of this.fitsheader.getItems()) {\n      const key = item.key;\n      if (\n        [\"SIMPLE\", \"BITPIX\", \"BSCALE\", \"BZERO\", \"BLANK\", \"ORDER\"].includes(key)\n      ) {\n        const value = item.value;\n        header.insert(new FITSHeaderItem(key, value, \"\"));\n      }\n    }\n    return header;\n  }\n\n  computeNaxisWidth(radius: number, pxsize: number): number {\n    return Math.ceil((2 * radius) / pxsize);\n  }\n\n  getImageRADecList(\n    center: Point,\n    radius: number,\n    pxsize: number,\n    naxisWidth: number,\n  ): TilesRaDecList2 {\n    const naxis1 = naxisWidth;\n    const naxis2 = naxis1;\n\n    let minra = center.getAstro().raDeg - radius;\n    if (minra < 0) {\n      minra += 360;\n    }\n    const mindec = center.getAstro().decDeg - radius;\n\n    const tilesRaDecList = new TilesRaDecList2();\n\n    // let radeclist: Array<[number, number]> = new Array<[number, number]>();\n\n    // let centralRa, centralDec\n    for (let d = 0; d < naxis2; d++) {\n      for (let r = 0; r < naxis1; r++) {\n        tilesRaDecList.addImagePixel(\n          new ImagePixel(minra + r * pxsize, mindec + d * pxsize, undefined),\n        );\n        // radeclist.push([minra + (r * pxsize), mindec + (d * pxsize)]);\n      }\n    }\n\n    const centralImgpx = tilesRaDecList.getImagePixelList().length / 2 - 1;\n    // let cidx = (naxis2 / 2) * naxis1 + naxis1 / 2;\n    // if (naxis1 % 2 != 0) {\n    //     cidx = Math.floor(radeclist.length / 2);\n    // }\n    // this._craDeg = radeclist[cidx][0];\n    // this._cdecDeg = radeclist[cidx][1];\n\n    // return radeclist\n    return tilesRaDecList;\n  }\n\n  /** TODO !!! check and handle RA passing through 360-0 */\n  pix2world(\n    i: number,\n    j: number,\n    pxsize: number,\n    minra: number,\n    mindec: number,\n  ): Point {\n    let ra: number;\n    let dec: number;\n    // ra = i * this._stepra + this._minra;\n    // dec = j * this._stepdec + this._mindec;\n    ra = i * pxsize + minra;\n    dec = j * pxsize + mindec;\n    let p = new Point(CoordsType.ASTRO, NumberType.DEGREES, ra, dec);\n    return p;\n    // return [ra, dec];\n  }\n\n  setPixelValues(raDecList: TilesRaDecList2, header: FITSHeaderManager): FITS {\n    const BITPIX = header.findById(\"BITPIX\")?.value as number;\n    if (!Number.isFinite(BITPIX)) {\n      throw new Error(\"BITPIX not found or invalid in header\");\n    }\n    const bytesPerElem = Math.abs(BITPIX) / 8;\n\n    const width = header.findById(\"NAXIS1\")?.value as number;\n    const height = (header.findById(\"NAXIS2\")?.value as number) ?? width; // fallback if square\n    if (!Number.isFinite(width) || width <= 0)\n      throw new Error(\"NAXIS1 not found or invalid\");\n    if (!Number.isFinite(height) || height <= 0)\n      throw new Error(\"NAXIS2 not found or invalid\");\n    const BLANK = Number(header.findById(\"BLANK\")?.value ?? 0);\n    const blankBytes = FITSUtils.convertBlankToBytes(BLANK, bytesPerElem);\n\n    const pixels = raDecList.getImagePixelList();\n    if (pixels.length !== width * height) {\n      throw new Error(\n        `Pixel count mismatch: got ${pixels.length}, expected ${width * height}`,\n      );\n    }\n\n    // Map<rowIndex, Uint8Array[]>, each row has length = width\n    const pxvalues = new Map<number, Uint8Array[]>();\n    for (let r = 0; r < height; r++) {\n      pxvalues.set(r, new Array<Uint8Array>(width));\n    }\n\n    // Fill in row-major order: for each linear index, compute (row, col)\n    for (let idx = 0; idx < pixels.length; idx++) {\n      const row = Math.floor(idx / width);\n      const col = idx % width;\n\n      const rowArr = pxvalues.get(row)!;\n\n      let u8 = pixels[idx].getUint8Value();\n      if (u8 == null) {\n        u8 = blankBytes.slice(0);\n        pixels[idx].setValue(u8, BITPIX);\n      }\n      if (u8.byteLength !== bytesPerElem) {\n        throw new Error(\n          `Pixel (${row},${col}) byteLength=${u8.byteLength} != expected ${bytesPerElem} (BITPIX=${BITPIX})`,\n        );\n      }\n\n      rowArr[col] = u8;\n      // no need to pxvalues.set(row, rowArr); reference already updated\n    }\n\n    return new FITS(header, pxvalues);\n  }\n\n  generateFITSFile(\n    pixelAngSize: number,\n    BITPIX: number,\n    TILE_WIDTH: number,\n    BLANK: number,\n    BZERO: number,\n    BSCALE: number,\n    cRA: number,\n    cDec: number,\n    minValue: number,\n    maxValue: number,\n    raDecWithValues: TilesRaDecList2,\n  ): FITS {\n    const header: FITSHeaderManager = this.prepareHeader(\n      pixelAngSize,\n      BITPIX,\n      TILE_WIDTH,\n      BLANK,\n      BZERO,\n      BSCALE,\n      cRA,\n      cDec,\n      minValue,\n      maxValue,\n    );\n    const fits: FITS = this.setPixelValues(raDecWithValues, header);\n    return fits;\n  }\n\n  world2pix(raDecList: TilesRaDecList2): TilesRaDecList2 {\n    const bytesXvalue = this.getBytePerValue();\n\n    // TODO if I have the this.fitsheader available here, check if I can retrieve this.bitpix, this.pxsize, ... with this.fitsheader\n    // and remove the attributes at object level (with this)\n    const blank = Number(this.fitsheader.findById(\"BLANK\")?.value);\n    const blankBytes = FITSUtils.convertBlankToBytes(blank, bytesXvalue);\n\n    for (let imgPx of raDecList.getImagePixelList()) {\n      // console.log(\"raDeclist.getImagePixelList().indexOf(imgPx) \" + raDeclist.getImagePixelList().indexOf(imgPx))\n      const ra = imgPx.getRADeg();\n      const dec = imgPx.getDecDeg();\n\n      const i = Math.floor((ra - this.minra) / this.pxsize);\n      const j = Math.floor((dec - this.mindec) / this.pxsize);\n\n      imgPx.setij(i, j);\n\n      if (j < 0 || j >= this.naxis2 || i < 0 || i >= this.naxis1) {\n        imgPx.setValue(blankBytes, this.bitpix);\n      } else {\n        const currentValue = this.pxvalues[j].slice(\n          i * bytesXvalue,\n          (i + 1) * bytesXvalue,\n        );\n        imgPx.setValue(currentValue, this.bitpix);\n      }\n      raDecList.setMinMaxValue(imgPx.getValue());\n    }\n    return raDecList;\n  }\n\n  private createRawRows(fits: PrimaryHDU): Array<Uint8Array> {\n    if (fits.rawData === null) {\n      return [];\n    }\n\n    const naxis1 = fits.shape[0] ?? 0;\n    const naxis2 = fits.shape[1] ?? 0;\n    const bytesPerElement = Math.abs(fits.bitpix) / 8;\n    const rowByteLength = naxis1 * bytesPerElement;\n    const rows: Array<Uint8Array> = new Array<Uint8Array>(naxis2);\n\n    for (let row = 0; row < naxis2; row++) {\n      const start = row * rowByteLength;\n      const end = start + rowByteLength;\n      rows[row] = fits.rawData.subarray(start, end);\n    }\n    return rows;\n  }\n}\n","export class Vec3 {\n    x;\n    y;\n    z;\n    constructor(x, y, z) {\n        if (![x, y, z].every(Number.isFinite)) {\n            throw new RangeError(\"Vec3 coordinates must be finite numbers.\");\n        }\n        this.x = x;\n        this.y = y;\n        this.z = z;\n    }\n    getX() {\n        return this.x;\n    }\n    getY() {\n        return this.y;\n    }\n    getZ() {\n        return this.z;\n    }\n    lengthSquared() {\n        return this.x * this.x + this.y * this.y + this.z * this.z;\n    }\n    length() {\n        return Math.sqrt(this.lengthSquared());\n    }\n    normalize() {\n        const length = this.length();\n        if (length === 0)\n            throw new RangeError(\"Cannot normalize a zero-length vector.\");\n        return new Vec3(this.x / length, this.y / length, this.z / length);\n    }\n    dot(other) {\n        return this.x * other.x + this.y * other.y + this.z * other.z;\n    }\n}\n","import { Vec3 } from \"./vec3.js\";\nexport class Pointing {\n    theta;\n    phi;\n    constructor(vec3, mirror = false, theta, phi) {\n        if (vec3) {\n            const unit = new Vec3(vec3.x, vec3.y, vec3.z).normalize();\n            this.theta = Math.atan2(Math.sqrt(unit.x * unit.x + unit.y * unit.y), unit.z);\n            this.phi = normalizePhi(mirror ? -Math.atan2(unit.y, unit.x) : Math.atan2(unit.y, unit.x));\n            return;\n        }\n        if (!Number.isFinite(theta) || !Number.isFinite(phi)) {\n            throw new RangeError(\"Pointing requires either a Vec3-like object or finite theta/phi radians.\");\n        }\n        this.theta = theta;\n        this.phi = normalizePhi(phi);\n    }\n    toVec3() {\n        const sinTheta = Math.sin(this.theta);\n        return new Vec3(sinTheta * Math.cos(this.phi), sinTheta * Math.sin(this.phi), Math.cos(this.theta));\n    }\n}\nfunction normalizePhi(phi) {\n    const twoPi = 2 * Math.PI;\n    return ((phi % twoPi) + twoPi) % twoPi;\n}\n","export class RangeSet {\n    r = [];\n    append(value) {\n        this.appendRange(value, value + 1);\n    }\n    appendRange(startInclusive, endExclusive) {\n        if (!Number.isInteger(startInclusive) || !Number.isInteger(endExclusive)) {\n            throw new RangeError(\"RangeSet bounds must be integers.\");\n        }\n        if (startInclusive >= endExclusive)\n            return;\n        for (let value = startInclusive; value < endExclusive; value += 1) {\n            this.r.push(value);\n        }\n    }\n    toArray() {\n        return [...this.r];\n    }\n}\n","import { Pointing } from \"./pointing.js\";\nimport { RangeSet } from \"./rangeset.js\";\nimport { Vec3 } from \"./vec3.js\";\nconst TWO_THIRDS = 2 / 3;\nconst HALF_PI = Math.PI / 2;\nconst TWO_PI = 2 * Math.PI;\nconst MAX_SUPPORTED_ORDER = 26;\nconst DISC_EPSILON = 2e-7;\nconst JRLL = [2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4];\nconst JPLL = [1, 3, 5, 7, 0, 2, 4, 6, 1, 3, 5, 7];\nconst X_OFFSET = [-1, -1, 0, 1, 1, 1, 0, -1];\nconst Y_OFFSET = [0, 1, 1, 1, 0, -1, -1, -1];\nconst FACE_ARRAY = [\n    [8, 9, 10, 11, -1, -1, -1, -1, 10, 11, 8, 9],\n    [5, 6, 7, 4, 8, 9, 10, 11, 9, 10, 11, 8],\n    [-1, -1, -1, -1, 5, 6, 7, 4, -1, -1, -1, -1],\n    [4, 5, 6, 7, 11, 8, 9, 10, 11, 8, 9, 10],\n    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],\n    [1, 2, 3, 0, 0, 1, 2, 3, 5, 6, 7, 4],\n    [-1, -1, -1, -1, 7, 4, 5, 6, -1, -1, -1, -1],\n    [3, 0, 1, 2, 3, 0, 1, 2, 4, 5, 6, 7],\n    [2, 3, 0, 1, -1, -1, -1, -1, 0, 1, 2, 3]\n];\nconst SWAP_ARRAY = [\n    [0, 0, 3],\n    [0, 0, 6],\n    [0, 0, 0],\n    [0, 0, 5],\n    [0, 0, 0],\n    [5, 0, 0],\n    [0, 0, 0],\n    [6, 0, 0],\n    [3, 0, 0]\n];\nexport class Healpix {\n    nside;\n    order;\n    npix;\n    constructor(nside) {\n        if (!Number.isInteger(nside) || nside <= 0) {\n            throw new RangeError(\"nside must be a positive integer.\");\n        }\n        const order = Math.log2(nside);\n        if (!Number.isInteger(order)) {\n            throw new RangeError(\"nside must be a power of two.\");\n        }\n        if (order > MAX_SUPPORTED_ORDER) {\n            throw new RangeError(`nside order must be <= ${MAX_SUPPORTED_ORDER} for safe JavaScript integer arithmetic.`);\n        }\n        this.nside = nside;\n        this.order = order;\n        this.npix = 12 * nside * nside;\n    }\n    getNPix() {\n        return this.npix;\n    }\n    nside2order(nside) {\n        if (!Number.isInteger(nside) || nside <= 0)\n            return -1;\n        const order = Math.log2(nside);\n        return Number.isInteger(order) ? order : -1;\n    }\n    nest2xyf(pixel) {\n        this.assertPixel(pixel);\n        const facePixelCount = this.nside * this.nside;\n        const face = Math.floor(pixel / facePixelCount);\n        const localPixel = pixel % facePixelCount;\n        return {\n            ix: compactBits(localPixel),\n            iy: compactBits(localPixel >> 1),\n            face\n        };\n    }\n    xyf2nest(ix, iy, face) {\n        if (!Number.isInteger(face) || face < 0 || face >= 12) {\n            throw new RangeError(\"face must be an integer in [0, 11].\");\n        }\n        if (!Number.isInteger(ix) || ix < 0 || ix >= this.nside) {\n            throw new RangeError(\"ix must be an integer in [0, nside).\");\n        }\n        if (!Number.isInteger(iy) || iy < 0 || iy >= this.nside) {\n            throw new RangeError(\"iy must be an integer in [0, nside).\");\n        }\n        return face * this.nside * this.nside + spreadBits(ix) + 2 * spreadBits(iy);\n    }\n    /**\n     * Converts spherical coordinates to a HEALPix NESTED pixel index.\n     *\n     * Coordinates follow the HEALPix convention used by common implementations:\n     * theta is colatitude in radians, with 0 at the north pole and pi at the\n     * south pole; phi is longitude in radians and is normalized into [0, 2pi).\n     *\n     * Formula sources:\n     * - K. M. Gorski et al., \"HEALPix: A Framework for High-Resolution\n     *   Discretization and Fast Analysis of Data Distributed on the Sphere\",\n     *   Astrophysical Journal 622, 2005.\n     * - HEALPix Primer / documentation: equal-area iso-latitude sphere\n     *   subdivision, NESTED ordering, polar caps and equatorial belt.\n     * - Public HEALPix algorithm descriptions for NESTED indexing using\n     *   z = cos(theta), tt = phi / (pi/2), and the |z| = 2/3 belt boundary.\n     *\n     * Reference URLs:\n     * - https://healpix.sourceforge.io/\n     * - https://healpix.jpl.nasa.gov/\n     * - https://healpix-geo.readthedocs.io/en/stable/healpix/index.html\n     *\n     * Points exactly on HEALPix cell boundaries can be assigned differently by\n     * different implementations due to floating-point and boundary conventions.\n     * This implementation normalizes phi before indexing.\n     */\n    ang2pix(pointing, _mirror = false) {\n        if (!Number.isFinite(pointing.theta) || !Number.isFinite(pointing.phi)) {\n            throw new RangeError(\"pointing theta and phi must be finite radians.\");\n        }\n        if (pointing.theta < 0 || pointing.theta > Math.PI) {\n            throw new RangeError(\"pointing theta must be in [0, pi].\");\n        }\n        const z = Math.cos(pointing.theta);\n        const za = Math.abs(z);\n        const tt = normalizePhi(pointing.phi) / HALF_PI;\n        if (za <= TWO_THIRDS) {\n            const temp1 = this.nside * (0.5 + tt);\n            const temp2 = this.nside * z * 0.75;\n            const jp = Math.floor(temp1 - temp2);\n            const jm = Math.floor(temp1 + temp2);\n            const ifp = Math.floor(jp / this.nside);\n            const ifm = Math.floor(jm / this.nside);\n            const face = ifp === ifm ? (ifp | 4) : ifp < ifm ? ifp : ifm + 8;\n            const ix = modulo(jm, this.nside);\n            const iy = this.nside - modulo(jp, this.nside) - 1;\n            return this.xyf2nest(ix, iy, face);\n        }\n        const ntt = Math.min(3, Math.floor(tt));\n        const tp = tt - ntt;\n        const sinTheta = Math.sin(pointing.theta);\n        const edgeDistance = za < 0.99\n            ? this.nside * Math.sqrt(3 * (1 - za))\n            : (this.nside * sinTheta) / Math.sqrt((1 + za) / 3);\n        const jp = Math.min(this.nside - 1, Math.floor(tp * edgeDistance));\n        const jm = Math.min(this.nside - 1, Math.floor((1 - tp) * edgeDistance));\n        return z >= 0\n            ? this.xyf2nest(this.nside - jm - 1, this.nside - jp - 1, ntt)\n            : this.xyf2nest(jp, jm, ntt + 8);\n    }\n    /**\n     * Returns the unit vector pointing to the center of a NESTED pixel.\n     *\n     * Formula sources are the same public HEALPix references used by ang2pix.\n     * The inverse mapping starts from the NESTED face-local coordinates\n     * `(ix, iy, face)`, reconstructs the iso-latitude ring via `jr`, and then\n     * derives `z = cos(theta)` and `phi` for the pixel center.\n     */\n    pix2vec(pixel) {\n        return this.pix2ang(pixel).toVec3();\n    }\n    /**\n     * Converts a NESTED pixel index to spherical coordinates at the pixel center.\n     *\n     * Returned coordinates follow the HEALPix convention: theta is colatitude in\n     * radians and phi is longitude in radians normalized into [0, 2pi).\n     */\n    pix2ang(pixel, mirror = false) {\n        const { z, phi } = this.pix2zphi(pixel);\n        const theta = Math.acos(clamp(z, -1, 1));\n        return new Pointing(null, mirror, theta, phi);\n    }\n    /**\n     * Returns the four corner unit vectors for a NESTED pixel.\n     *\n     * The corners are evaluated in HEALPix face-local coordinates and returned\n     * in the same order used by common HEALPix implementations: north, west,\n     * south, east around the diamond-shaped projected pixel.\n     *\n     * Formula sources:\n     * - HEALPix public projection model: each base-resolution face is mapped\n     *   from local `(x, y, face)` coordinates to `(z, phi)` on the sphere.\n     * - HEALPix Primer / documentation for the north polar cap, equatorial\n     *   belt and south polar cap equations.\n     *\n     * Reference URLs:\n     * - https://healpix.sourceforge.io/\n     * - https://healpix.jpl.nasa.gov/\n     * - https://healpix-geo.readthedocs.io/en/stable/healpix/index.html\n     */\n    getBoundaries(pixel) {\n        const { ix, iy, face } = this.nest2xyf(pixel);\n        const delta = 0.5 / this.nside;\n        const centerX = (ix + 0.5) / this.nside;\n        const centerY = (iy + 0.5) / this.nside;\n        return [\n            this.faceLocalToVec3(centerX + delta, centerY + delta, face),\n            this.faceLocalToVec3(centerX - delta, centerY + delta, face),\n            this.faceLocalToVec3(centerX - delta, centerY - delta, face),\n            this.faceLocalToVec3(centerX + delta, centerY - delta, face)\n        ];\n    }\n    /**\n     * Returns `4 * step` unit vectors sampled along a NESTED pixel boundary.\n     *\n     * `step = 1` is equivalent to `getBoundaries(pixel)`. Higher values sample\n     * each projected edge before moving to the next one, preserving the same\n     * north, west, south, east traversal order.\n     */\n    getBoundariesWithStep(pixel, step) {\n        if (!Number.isInteger(step) || step <= 0) {\n            throw new RangeError(\"step must be a positive integer.\");\n        }\n        const { ix, iy, face } = this.nest2xyf(pixel);\n        const delta = 0.5 / this.nside;\n        const centerX = (ix + 0.5) / this.nside;\n        const centerY = (iy + 0.5) / this.nside;\n        const increment = 1 / (this.nside * step);\n        const points = new Array(4 * step);\n        for (let index = 0; index < step; index += 1) {\n            points[index] = this.faceLocalToVec3(centerX + delta - index * increment, centerY + delta, face);\n            points[index + step] = this.faceLocalToVec3(centerX - delta, centerY + delta - index * increment, face);\n            points[index + 2 * step] = this.faceLocalToVec3(centerX - delta + index * increment, centerY - delta, face);\n            points[index + 3 * step] = this.faceLocalToVec3(centerX + delta, centerY - delta + index * increment, face);\n        }\n        return points;\n    }\n    /**\n     * Returns the four corner unit vectors for explicit face-local coordinates.\n     *\n     * This is the same geometry as `getBoundaries`, but it avoids first packing\n     * `(x, y, face)` into a NESTED pixel. It is kept as a compatibility method\n     * for tile renderers that already operate in face-local coordinates.\n     */\n    getPointsForXyfNoStep(x, y, face) {\n        this.assertXyf(x, y, face);\n        const delta = 0.5 / this.nside;\n        const centerX = (x + 0.5) / this.nside;\n        const centerY = (y + 0.5) / this.nside;\n        return [\n            this.faceLocalToVec3(centerX + delta, centerY + delta, face),\n            this.faceLocalToVec3(centerX - delta, centerY + delta, face),\n            this.faceLocalToVec3(centerX - delta, centerY - delta, face),\n            this.faceLocalToVec3(centerX + delta, centerY - delta, face)\n        ];\n    }\n    /**\n     * Returns the eight neighboring NESTED pixels using the legacy HEALPix order.\n     *\n     * Missing cardinal neighbors at the poles are returned as `-1`. The face\n     * transition tables encode the public HEALPix base-face topology; interior\n     * pixels avoid table lookup and stay on the current face.\n     */\n    neighbours(pixel) {\n        const { ix, iy, face } = this.nest2xyf(pixel);\n        const result = new Int32Array(8);\n        const maxIndex = this.nside - 1;\n        if (ix > 0 && ix < maxIndex && iy > 0 && iy < maxIndex) {\n            result[0] = this.xyf2nest(ix - 1, iy, face);\n            result[1] = this.xyf2nest(ix - 1, iy + 1, face);\n            result[2] = this.xyf2nest(ix, iy + 1, face);\n            result[3] = this.xyf2nest(ix + 1, iy + 1, face);\n            result[4] = this.xyf2nest(ix + 1, iy, face);\n            result[5] = this.xyf2nest(ix + 1, iy - 1, face);\n            result[6] = this.xyf2nest(ix, iy - 1, face);\n            result[7] = this.xyf2nest(ix - 1, iy - 1, face);\n            return result;\n        }\n        for (let index = 0; index < result.length; index += 1) {\n            let x = ix + X_OFFSET[index];\n            let y = iy + Y_OFFSET[index];\n            let neighborCase = 4;\n            if (x < 0) {\n                x += this.nside;\n                neighborCase -= 1;\n            }\n            else if (x >= this.nside) {\n                x -= this.nside;\n                neighborCase += 1;\n            }\n            if (y < 0) {\n                y += this.nside;\n                neighborCase -= 3;\n            }\n            else if (y >= this.nside) {\n                y -= this.nside;\n                neighborCase += 3;\n            }\n            const neighborFace = FACE_ARRAY[neighborCase][face];\n            if (neighborFace < 0) {\n                result[index] = -1;\n                continue;\n            }\n            const swapBits = SWAP_ARRAY[neighborCase][Math.floor(face / 4)];\n            if ((swapBits & 1) > 0) {\n                x = this.nside - x - 1;\n            }\n            if ((swapBits & 2) > 0) {\n                y = this.nside - y - 1;\n            }\n            if ((swapBits & 4) > 0) {\n                const previousX = x;\n                x = y;\n                y = previousX;\n            }\n            result[index] = this.xyf2nest(x, y, neighborFace);\n        }\n        return result;\n    }\n    /**\n     * Returns pixels that overlap a spherical disk.\n     *\n     * The inclusive mode follows the public HEALPix strategy of testing at\n     * `fact * nside` resolution and mapping matching subpixels back to this\n     * instance's order. For NESTED ordering, `fact` must be zero or a power of\n     * two. `fact = 0` disables inclusive oversampling.\n     */\n    queryDiscInclusive(pointing, radiusRad, fact) {\n        if (!Number.isFinite(pointing.theta) || !Number.isFinite(pointing.phi)) {\n            throw new RangeError(\"pointing theta and phi must be finite radians.\");\n        }\n        if (!Number.isFinite(radiusRad) || radiusRad < 0) {\n            throw new RangeError(\"radiusRad must be a non-negative finite number.\");\n        }\n        if (!Number.isInteger(fact) || fact < 0 || (fact > 0 && !isPowerOfTwo(fact))) {\n            throw new RangeError(\"fact must be zero or a positive power of two.\");\n        }\n        const result = new RangeSet();\n        if (radiusRad >= Math.PI) {\n            result.appendRange(0, this.npix);\n            return result;\n        }\n        const inclusive = fact !== 0;\n        const oversamplingOrder = inclusive ? Math.log2(fact) : 0;\n        const maxOrder = Math.min(MAX_SUPPORTED_ORDER, this.order + oversamplingOrder);\n        const center = pointing.toVec3();\n        const cosRadius = Math.cos(radiusRad);\n        const sinRadius = Math.sin(radiusRad);\n        const cosRadiusPlusPixelRadius = [];\n        const cosRadiusMinusPixelRadius = [];\n        const healpixByOrder = new Map();\n        const pixels = new Set();\n        const stack = [];\n        for (let order = 0; order <= maxOrder; order += 1) {\n            const pixelRadius = maxPixelRadius(2 ** order);\n            const cosPixelRadius = Math.cos(pixelRadius);\n            const sinPixelRadius = Math.sin(pixelRadius);\n            cosRadiusPlusPixelRadius[order] =\n                radiusRad + pixelRadius > Math.PI ? -1 : cosRadius * cosPixelRadius - sinRadius * sinPixelRadius;\n            cosRadiusMinusPixelRadius[order] =\n                radiusRad - pixelRadius < 0 ? 1 : cosRadius * cosPixelRadius + sinRadius * sinPixelRadius;\n        }\n        for (let face = 11; face >= 0; face -= 1) {\n            stack.push({ pixel: face, order: 0 });\n        }\n        while (stack.length > 0) {\n            const current = stack.pop();\n            if (!current)\n                break;\n            let orderHealpix = healpixByOrder.get(current.order);\n            if (!orderHealpix) {\n                orderHealpix = current.order === this.order ? this : new Healpix(2 ** current.order);\n                healpixByOrder.set(current.order, orderHealpix);\n            }\n            const pixelCenter = orderHealpix.pix2vec(current.pixel);\n            const centerDistanceCosine = center.dot(pixelCenter);\n            if (centerDistanceCosine + DISC_EPSILON <= cosRadiusPlusPixelRadius[current.order]) {\n                continue;\n            }\n            const zone = centerDistanceCosine < cosRadius\n                ? 1\n                : centerDistanceCosine <= cosRadiusMinusPixelRadius[current.order]\n                    ? 2\n                    : 3;\n            this.collectDiscPixel(current.order, maxOrder, zone, current.pixel, inclusive, stack, pixels);\n        }\n        for (const pixel of [...pixels].sort((a, b) => a - b)) {\n            result.append(pixel);\n        }\n        return result;\n    }\n    /**\n     * Returns pixels that overlap a convex spherical polygon.\n     *\n     * The vertices are interpreted as ordered polygon corners on the unit\n     * sphere. The implementation converts polygon edges to half-space normals\n     * and delegates to the same hierarchical multi-disc test used by public\n     * HEALPix polygon queries.\n     */\n    queryPolygonInclusive(vertices, fact) {\n        if (vertices.length < 3) {\n            throw new RangeError(\"vertices must contain at least three points.\");\n        }\n        const vertexVectors = vertices.map((vertex) => {\n            if (!Number.isFinite(vertex.theta) || !Number.isFinite(vertex.phi)) {\n                throw new RangeError(\"polygon vertex theta and phi must be finite radians.\");\n            }\n            return vertex.toVec3();\n        });\n        const normals = [];\n        let flip = 0;\n        let index = 0;\n        while (index < vertexVectors.length) {\n            const first = vertexVectors[index];\n            const medium = vertexVectors[(index + 1) % vertexVectors.length];\n            const last = vertexVectors[(index + 2) % vertexVectors.length];\n            const normal = normalizeVec(crossVec(first, medium));\n            const handedness = normal.dot(last);\n            if (index === 0) {\n                flip = handedness < 0 ? -1 : 1;\n            }\n            else if (flip * handedness < 0) {\n                vertexVectors.splice((index + 1) % vertexVectors.length, 1);\n                normals.splice(index, 1);\n                index = Math.max(0, index - 1);\n                continue;\n            }\n            normals[index] = scaleVec(normal, flip);\n            index += 1;\n        }\n        const radii = new Array(normals.length).fill(HALF_PI);\n        if (fact !== 0) {\n            const containingCircle = findContainingCircle(vertexVectors);\n            normals.push(containingCircle.center);\n            radii.push(Math.acos(clamp(containingCircle.cosRadius, -1, 1)));\n        }\n        return this.queryMultiDisc(normals, radii, fact);\n    }\n    /**\n     * Returns pixels that overlap the intersection of spherical discs.\n     *\n     * Each `normal[i]` is the center vector of a disc and `radiusRad[i]` its\n     * angular radius. This is primarily the engine behind polygon queries, but\n     * is exposed for compatibility with HEALPix-style APIs.\n     */\n    queryMultiDisc(normals, radiusRad, fact) {\n        if (normals.length !== radiusRad.length) {\n            throw new RangeError(\"normals and radiusRad must have the same length.\");\n        }\n        if (!Number.isInteger(fact) || fact < 0 || (fact > 0 && !isPowerOfTwo(fact))) {\n            throw new RangeError(\"fact must be zero or a positive power of two.\");\n        }\n        const inclusive = fact !== 0;\n        const oversamplingOrder = inclusive ? Math.log2(fact) : 0;\n        const maxOrder = Math.min(MAX_SUPPORTED_ORDER, this.order + oversamplingOrder);\n        const result = new RangeSet();\n        const pixels = new Set();\n        const stack = [];\n        const healpixByOrder = new Map();\n        const cosineLimits = [];\n        for (const radius of radiusRad) {\n            if (!Number.isFinite(radius) || radius < 0) {\n                throw new RangeError(\"radiusRad values must be non-negative finite numbers.\");\n            }\n        }\n        for (let order = 0; order <= maxOrder; order += 1) {\n            const pixelRadius = maxPixelRadius(2 ** order);\n            cosineLimits[order] = normals.map((_, normalIndex) => {\n                const radius = radiusRad[normalIndex];\n                return [\n                    radius + pixelRadius > Math.PI ? -1 : Math.cos(radius + pixelRadius),\n                    order === 0 ? Math.cos(radius) : cosineLimits[0][normalIndex][1],\n                    radius - pixelRadius < 0 ? 1 : Math.cos(radius - pixelRadius)\n                ];\n            });\n        }\n        for (let face = 11; face >= 0; face -= 1) {\n            stack.push({ pixel: face, order: 0 });\n        }\n        while (stack.length > 0) {\n            const current = stack.pop();\n            if (!current)\n                break;\n            let orderHealpix = healpixByOrder.get(current.order);\n            if (!orderHealpix) {\n                orderHealpix = current.order === this.order ? this : new Healpix(2 ** current.order);\n                healpixByOrder.set(current.order, orderHealpix);\n            }\n            const pixelCenter = orderHealpix.pix2vec(current.pixel);\n            let zone = 3;\n            for (let normalIndex = 0; normalIndex < normals.length && zone > 0; normalIndex += 1) {\n                const centerDistanceCosine = pixelCenter.dot(normals[normalIndex]);\n                for (let zoneIndex = 0; zoneIndex < zone; zoneIndex += 1) {\n                    if (centerDistanceCosine < cosineLimits[current.order][normalIndex][zoneIndex]) {\n                        zone = zoneIndex;\n                    }\n                }\n            }\n            if (zone > 0) {\n                this.collectDiscPixel(current.order, maxOrder, zone, current.pixel, inclusive, stack, pixels);\n            }\n        }\n        for (const pixel of [...pixels].sort((a, b) => a - b)) {\n            result.append(pixel);\n        }\n        return result;\n    }\n    assertPixel(pixel) {\n        if (!Number.isInteger(pixel) || pixel < 0 || pixel >= this.npix) {\n            throw new RangeError(\"pixel must be an integer in [0, npix).\");\n        }\n    }\n    assertXyf(x, y, face) {\n        if (!Number.isInteger(face) || face < 0 || face >= 12) {\n            throw new RangeError(\"face must be an integer in [0, 11].\");\n        }\n        if (!Number.isInteger(x) || x < 0 || x >= this.nside) {\n            throw new RangeError(\"x must be an integer in [0, nside).\");\n        }\n        if (!Number.isInteger(y) || y < 0 || y >= this.nside) {\n            throw new RangeError(\"y must be an integer in [0, nside).\");\n        }\n    }\n    pix2zphi(pixel) {\n        const { ix, iy, face } = this.nest2xyf(pixel);\n        const fact2 = 1 / (3 * this.nside * this.nside);\n        const fact1 = 2 / (3 * this.nside);\n        const jr = JRLL[face] * this.nside - ix - iy - 1;\n        let ringPixelCount;\n        let z;\n        if (jr < this.nside) {\n            ringPixelCount = jr;\n            z = 1 - ringPixelCount * ringPixelCount * fact2;\n        }\n        else if (jr > 3 * this.nside) {\n            ringPixelCount = 4 * this.nside - jr;\n            z = ringPixelCount * ringPixelCount * fact2 - 1;\n        }\n        else {\n            ringPixelCount = this.nside;\n            z = (2 * this.nside - jr) * fact1;\n        }\n        const phiIndex = modulo(JPLL[face] * ringPixelCount + ix - iy, 8 * ringPixelCount);\n        const phi = ringPixelCount === this.nside\n            ? 0.75 * HALF_PI * phiIndex * fact1\n            : (0.5 * HALF_PI * phiIndex) / ringPixelCount;\n        return { z, phi: normalizePhi(phi) };\n    }\n    faceLocalToVec3(x, y, face) {\n        const jr = JRLL[face] - x - y;\n        let ringScale;\n        let z;\n        if (jr < 1) {\n            ringScale = jr;\n            z = 1 - (ringScale * ringScale) / 3;\n        }\n        else if (jr > 3) {\n            ringScale = 4 - jr;\n            z = (ringScale * ringScale) / 3 - 1;\n        }\n        else {\n            ringScale = 1;\n            z = (2 - jr) * TWO_THIRDS;\n        }\n        const phiIndex = modulo(JPLL[face] * ringScale + x - y, 8 * ringScale);\n        const phi = ringScale <= Number.EPSILON ? 0 : (0.5 * HALF_PI * phiIndex) / ringScale;\n        const sinTheta = Math.sqrt(Math.max(0, (1 - z) * (1 + z)));\n        return new Vec3(sinTheta * Math.cos(phi), sinTheta * Math.sin(phi), z);\n    }\n    collectDiscPixel(order, maxOrder, zone, pixel, inclusive, stack, pixels) {\n        if (zone === 0)\n            return;\n        if (order < this.order) {\n            if (zone >= 3) {\n                const childCount = 4 ** (this.order - order);\n                for (let child = pixel * childCount; child < (pixel + 1) * childCount; child += 1) {\n                    pixels.add(child);\n                }\n            }\n            else {\n                pushChildren(stack, pixel, order);\n            }\n            return;\n        }\n        if (order > this.order) {\n            const parentPixel = Math.floor(pixel / 4 ** (order - this.order));\n            if (zone >= 2 || order >= maxOrder) {\n                pixels.add(parentPixel);\n            }\n            else {\n                pushChildren(stack, pixel, order);\n            }\n            return;\n        }\n        if (zone >= 2) {\n            pixels.add(pixel);\n        }\n        else if (inclusive) {\n            if (order < maxOrder) {\n                pushChildren(stack, pixel, order);\n            }\n            else {\n                pixels.add(pixel);\n            }\n        }\n    }\n}\nfunction spreadBits(value) {\n    let result = 0;\n    for (let bit = 0; bit <= MAX_SUPPORTED_ORDER; bit += 1) {\n        result += (Math.floor(value / 2 ** bit) % 2) * 2 ** (2 * bit);\n    }\n    return result;\n}\nfunction compactBits(value) {\n    let result = 0;\n    for (let bit = 0; bit <= MAX_SUPPORTED_ORDER; bit += 1) {\n        result += (Math.floor(value / 2 ** (2 * bit)) % 2) * 2 ** bit;\n    }\n    return result;\n}\nfunction normalizePhi(phi) {\n    return ((phi % TWO_PI) + TWO_PI) % TWO_PI;\n}\nfunction modulo(value, divisor) {\n    return ((value % divisor) + divisor) % divisor;\n}\nfunction clamp(value, min, max) {\n    return Math.min(max, Math.max(min, value));\n}\nfunction isPowerOfTwo(value) {\n    return value > 0 && 2 ** Math.floor(Math.log2(value)) === value;\n}\nfunction maxPixelRadius(nside) {\n    const equatorialZ = TWO_THIRDS;\n    const equatorialPhi = Math.PI / (4 * nside);\n    const equatorialSinTheta = Math.sqrt((1 - equatorialZ) * (1 + equatorialZ));\n    const equatorialPoint = new Vec3(equatorialSinTheta * Math.cos(equatorialPhi), equatorialSinTheta * Math.sin(equatorialPhi), equatorialZ);\n    const polarOffset = (1 - 1 / nside) ** 2;\n    const polarZ = 1 - polarOffset / 3;\n    const polarPoint = new Vec3(Math.sqrt((1 - polarZ) * (1 + polarZ)), 0, polarZ);\n    return Math.acos(clamp(equatorialPoint.dot(polarPoint), -1, 1));\n}\nfunction pushChildren(stack, pixel, order) {\n    for (let index = 3; index >= 0; index -= 1) {\n        stack.push({ pixel: 4 * pixel + index, order: order + 1 });\n    }\n}\nfunction addVec(a, b) {\n    return new Vec3(a.x + b.x, a.y + b.y, a.z + b.z);\n}\nfunction subVec(a, b) {\n    return new Vec3(a.x - b.x, a.y - b.y, a.z - b.z);\n}\nfunction scaleVec(vec, factor) {\n    return new Vec3(vec.x * factor, vec.y * factor, vec.z * factor);\n}\nfunction crossVec(a, b) {\n    return new Vec3(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x);\n}\nfunction normalizeVec(vec) {\n    return vec.normalize();\n}\nfunction findContainingCircle(points) {\n    if (points.length < 2) {\n        throw new RangeError(\"at least two points are required to find a containing circle.\");\n    }\n    let center = normalizeVec(addVec(points[0], points[1]));\n    let cosRadius = points[0].dot(center);\n    for (let index = 2; index < points.length; index += 1) {\n        if (points[index].dot(center) < cosRadius) {\n            ({ center, cosRadius } = findCircleThroughOnePoint(points, index));\n        }\n    }\n    return { center, cosRadius };\n}\nfunction findCircleThroughOnePoint(points, q) {\n    let center = normalizeVec(addVec(points[0], points[q]));\n    let cosRadius = points[0].dot(center);\n    for (let index = 1; index < q; index += 1) {\n        if (points[index].dot(center) < cosRadius) {\n            ({ center, cosRadius } = findCircleThroughTwoPoints(points, index, q));\n        }\n    }\n    return { center, cosRadius };\n}\nfunction findCircleThroughTwoPoints(points, q1, q2) {\n    let center = normalizeVec(addVec(points[q1], points[q2]));\n    let cosRadius = points[q1].dot(center);\n    for (let index = 0; index < q1; index += 1) {\n        if (points[index].dot(center) < cosRadius) {\n            center = normalizeVec(crossVec(subVec(points[q1], points[index]), subVec(points[q2], points[index])));\n            cosRadius = points[index].dot(center);\n            if (cosRadius < 0) {\n                center = scaleVec(center, -1);\n                cosRadius = -cosRadius;\n            }\n        }\n    }\n    return { center, cosRadius };\n}\n","import { Pointing } from \"./pointing.js\";\nimport { Vec3 } from \"./vec3.js\";\nexport class Hploc {\n    z;\n    _phi;\n    sth;\n    have_sth;\n    constructor(pointing) {\n        this.z = pointing ? Math.cos(pointing.theta) : 0;\n        this._phi = pointing ? pointing.phi : 0;\n        this.sth = pointing ? Math.sin(pointing.theta) : 0;\n        this.have_sth = Boolean(pointing && Math.abs(this.z) > 0.99);\n    }\n    get phi() {\n        return this._phi;\n    }\n    set phi(phi) {\n        this._phi = phi;\n    }\n    toPointing(mirror = false) {\n        const sinTheta = this.have_sth ? this.sth : Math.sqrt((1 - this.z) * (1 + this.z));\n        return new Pointing(null, mirror, Math.atan2(sinTheta, this.z), this._phi);\n    }\n    toVec3() {\n        const sinTheta = this.have_sth ? this.sth : Math.sqrt((1 - this.z) * (1 + this.z));\n        return new Vec3(sinTheta * Math.cos(this._phi), sinTheta * Math.sin(this._phi), this.z);\n    }\n    static sin(value) {\n        return Math.sin(value);\n    }\n    static cos(value) {\n        return Math.cos(value);\n    }\n    static asin(value) {\n        return Math.asin(value);\n    }\n    static acos(value) {\n        return Math.acos(value);\n    }\n    static atan2(y, x) {\n        return Math.atan2(y, x);\n    }\n}\n","export { Healpix } from \"./healpix.js\";\nexport { Hploc } from \"./hploc.js\";\nexport { Pointing } from \"./pointing.js\";\nexport { RangeSet } from \"./rangeset.js\";\nexport { Vec3 } from \"./vec3.js\";\n","import { Healpix, Hploc, Pointing } from \"astrospatial-core/healpix\";\nimport { AstroCoords } from \"../../model/AstroCoords.js\";\nimport { HEALPixXYSpace } from \"../../model/HEALPixXYSpace.js\";\nimport { CoordsType } from \"../../model/CoordsType.js\";\nimport { NumberType } from \"../../model/NumberType.js\";\nimport { Point } from \"../../model/Point.js\";\nimport { radToDeg } from \"../../model/Utils.js\";\n\n/*\n * Internal HPX projection helper used by HiPS tile rasterization.\n *\n * This implements the HEALPix intermediate-plane equations used by\n * HiPS. It is not a replacement for a FITS-WCS implementation:\n * WCSLib remains the external authority for validating serialized\n * FITS WCS headers, especially near HPX branch cuts.\n */\nexport class HiPSIntermediateProj {\n  static RES_ORDER_0: number = 58.6;\n  static H: number = 4;\n  static K: number = 3;\n  static THETAX: number = Hploc.asin(\n    (HiPSIntermediateProj.K - 1) / HiPSIntermediateProj.K,\n  );\n\n  static setupByTile(tileno: number, hp: Healpix): HEALPixXYSpace {\n    const xy: HEALPixXYSpace = {\n      min_y: NaN,\n      max_y: NaN,\n      min_x: NaN,\n      max_x: NaN,\n      gridPointsDeg: [],\n    };\n\n    const corners = hp.getBoundariesWithStep(tileno, 1);\n    const pts: Pointing[] = [];\n    const phis: number[] = [];\n\n    for (let i = 0; i < corners.length; i++) {\n      pts[i] = new Pointing(corners[i]);\n      phis[i] = pts[i].phi;\n\n      if (i >= 1) {\n        const a = phis[i - 1];\n        const b = phis[i];\n\n        if (Math.abs(a - b) > Math.PI) {\n          if (a < b) phis[i - 1] = a + 2 * Math.PI;\n          else phis[i] = b + 2 * Math.PI;\n        }\n      }\n    }\n\n    /*\n     * Project all boundary samples without going through Point,\n     * because Point normalizes RA and would hide wrap information\n     * needed by tiles crossing the 0/360 meridian.\n     */\n    const xs: number[] = [];\n    const ys: number[] = [];\n    for (let j = 0; j < pts.length; j++) {\n      const coTheta = pts[j].theta;\n      const decRad = Math.PI / 2 - coTheta;\n      const raRad = phis[j];\n      const ac: AstroCoords = {\n        raDeg: radToDeg(raRad),\n        raRad,\n        decDeg: radToDeg(decRad),\n        decRad,\n      } as AstroCoords;\n\n      const [xDeg, yDeg] = HiPSIntermediateProj.world2intermediate(ac);\n      xs.push(xDeg);\n      ys.push(yDeg);\n    }\n\n    /*\n     * Y-extrema are stable across HPX sectors.\n     */\n    let minY = +Infinity,\n      maxY = -Infinity;\n    for (const y of ys) {\n      if (y < minY) minY = y;\n      if (y > maxY) maxY = y;\n    }\n    const yMid = 0.5 * (minY + maxY);\n\n    /*\n     * Use boundary samples near the middle of the tile to derive\n     * the local left/right X range. This avoids sector-hop outliers\n     * in polar or wrapped tiles.\n     */\n    const tol = Math.max(1e-6, 0.02 * (maxY - minY));\n    let minX = +Infinity,\n      maxX = -Infinity;\n    for (let k = 0; k < xs.length; k++) {\n      if (Math.abs(ys[k] - yMid) <= tol) {\n        if (xs[k] < minX) minX = xs[k];\n        if (xs[k] > maxX) maxX = xs[k];\n      }\n    }\n\n    /*\n     * Fallback for very small or awkward samples: use the boundary\n     * points closest to the middle Y line.\n     */\n    if (!Number.isFinite(minX) || !Number.isFinite(maxX)) {\n      const pairs = xs\n        .map((x, i) => ({ x, y: ys[i] }))\n        .sort((a, b) => Math.abs(a.y - yMid) - Math.abs(b.y - yMid));\n      const take = Math.max(4, Math.floor(pairs.length * 0.1));\n      minX = +Infinity;\n      maxX = -Infinity;\n      for (let i = 0; i < take; i++) {\n        const x = pairs[i].x;\n        if (x < minX) minX = x;\n        if (x > maxX) maxX = x;\n      }\n    }\n\n    xy.min_y = minY;\n    xy.max_y = maxY;\n    xy.min_x = minX;\n    xy.max_x = maxX;\n\n    for (let i = 0; i < xs.length; i++) {\n      xy.gridPointsDeg[2 * i] = xs[i];\n      xy.gridPointsDeg[2 * i + 1] = ys[i];\n    }\n\n    return xy;\n  }\n\n  static world2intermediate(ac: AstroCoords): [number, number] {\n    let x_grid: number = NaN;\n    let y_grid: number = NaN;\n\n    if (Math.abs(ac.decRad) <= HiPSIntermediateProj.THETAX) {\n      x_grid = ac.raDeg;\n\n      y_grid =\n        (Hploc.sin(ac.decRad) * HiPSIntermediateProj.K * 90) /\n        HiPSIntermediateProj.H;\n    } else if (Math.abs(ac.decRad) > HiPSIntermediateProj.THETAX) {\n      const raDeg = ac.raDeg;\n\n      let w = 0;\n      if (HiPSIntermediateProj.K % 2 !== 0 || ac.decRad > 0) {\n        w = 1;\n      }\n\n      const sigma = Math.sqrt(\n        HiPSIntermediateProj.K * (1 - Math.abs(Hploc.sin(ac.decRad))),\n      );\n      const phi_c =\n        -180 +\n        (2 *\n          Math.floor(\n            ((ac.raDeg + 180) * HiPSIntermediateProj.H) / 360 + (1 - w) / 2,\n          ) +\n          w) *\n          (180 / HiPSIntermediateProj.H);\n\n      x_grid = phi_c + (raDeg - phi_c) * sigma;\n      y_grid =\n        (180 / HiPSIntermediateProj.H) *\n        ((HiPSIntermediateProj.K + 1) / 2 - sigma);\n\n      if (ac.decRad < 0) {\n        y_grid *= -1;\n      }\n    }\n\n    return [x_grid, y_grid];\n  }\n\n  static intermediate2pix(\n    x: number,\n    y: number,\n    xyGridProj: HEALPixXYSpace,\n    pxXtile: number,\n  ): [number, number] {\n    const xInterval = Math.abs(xyGridProj.max_x - xyGridProj.min_x);\n    const yInterval = Math.abs(xyGridProj.max_y - xyGridProj.min_y);\n\n    /*\n     * Bring x into the local tile interval when the tile does\n     * not span a full 360 degrees.\n     */\n    let xAdj = x;\n    if (xInterval < 360) {\n      if (xyGridProj.min_x < 0 && xAdj > xyGridProj.max_x) xAdj -= 360;\n      if (xyGridProj.max_x > 360 && xAdj < xyGridProj.min_x) xAdj += 360;\n      if (xAdj < xyGridProj.min_x) xAdj += 360;\n      if (xAdj >= xyGridProj.max_x) xAdj -= 360;\n    }\n\n    const i_norm = (xAdj - xyGridProj.min_x) / xInterval;\n    const j_norm = (y - xyGridProj.min_y) / yInterval;\n\n    let i = 0.5 - (i_norm - j_norm);\n    let j = i_norm + j_norm - 0.5;\n\n    i = Math.floor(i * pxXtile);\n    j = Math.floor(j * pxXtile);\n    return [i, pxXtile - j - 1];\n  }\n\n  static pix2intermediate(\n    i: number,\n    j: number,\n    xyGridProj: HEALPixXYSpace,\n    naxis1: number,\n    naxis2: number,\n  ): [number, number] {\n    /*\n     * Diamond coordinates in the HEALPix intermediate plane:\n     *\n     *   (0, 0) -> left corner\n     *   (1, 0) -> upper corner\n     *   (0, 1) -> lower corner\n     *   (1, 1) -> right corner\n     *\n     * Image rows are top-down, so the final Y interpolation\n     * uses j_norm with the opposite sign.\n     */\n    const cnaxis1 = naxis1;\n    const cnaxis2 = naxis2;\n    const i_norm = (i + 0.5) / cnaxis1;\n    const j_norm = (j + 0.5) / cnaxis2;\n\n    const xInterval = Math.abs(xyGridProj.max_x - xyGridProj.min_x) / 2.0;\n    const yInterval = Math.abs(xyGridProj.max_y - xyGridProj.min_y) / 2.0;\n    const yMean = (xyGridProj.max_y + xyGridProj.min_y) / 2.0;\n\n    const x = xyGridProj.min_x + xInterval * (i_norm + j_norm);\n    const y = yMean - yInterval * (j_norm - i_norm);\n\n    return [x, y];\n  }\n\n  static intermediate2world(x: number, y: number): Point {\n    let raDeg: number = NaN;\n    let decDeg: number = NaN;\n    const Yx = (90 * (HiPSIntermediateProj.K - 1)) / HiPSIntermediateProj.H;\n\n    if (Math.abs(y) <= Yx) {\n      raDeg = x;\n      const s = (y * HiPSIntermediateProj.H) / (90 * HiPSIntermediateProj.K);\n      const sClamped = Math.max(-1, Math.min(1, s));\n      decDeg = radToDeg(Math.asin(sClamped));\n    } else {\n      const sigma =\n        (HiPSIntermediateProj.K + 1) / 2 -\n        (Math.abs(y) * HiPSIntermediateProj.H) / 180;\n\n      const zAbs = 1 - (sigma * sigma) / HiPSIntermediateProj.K;\n      const z = (y >= 0 ? 1 : -1) * zAbs;\n      const zClamped = Math.max(-1, Math.min(1, z));\n      decDeg = radToDeg(Math.asin(zClamped));\n\n      const w = HiPSIntermediateProj.K % 2 !== 0 || y > 0 ? 1 : 0;\n      const x_c =\n        -180 +\n        (2 *\n          Math.floor(((x + 180) * HiPSIntermediateProj.H) / 360 + (1 - w) / 2) +\n          w) *\n          (180 / HiPSIntermediateProj.H);\n      raDeg = x_c + (x - x_c) / (sigma || 1);\n      raDeg = ((raDeg % 360) + 360) % 360;\n    }\n\n    return new Point(CoordsType.ASTRO, NumberType.DEGREES, raDeg, decDeg);\n  }\n}\n","\n/**\n * Summary. (bla bla bla)\n *\n * Description. (bla bla bla)\n * \n * @link   github https://github.com/fab77/wcslight\n * @author Fabrizio Giordano <fabriziogiordano77@gmail.com>\n */\n\n\nimport { Healpix, Pointing, Hploc } from \"astrospatial-core/healpix\";\n\nimport { Point } from \"../model/Point.js\";\n\nexport class HiPSHelper {\n\n\n\t// static pxXtile: number = 512; // TODO in some cases it is different\n\tstatic DEFAULT_Naxis1_2: number = 512;\n\t// static RES_ORDER_0: number = 58.6 / HiPSHelper.pxXtile;\n\tstatic RES_ORDER_0: number = 58.6;\n\tstatic H: number = 4;\n\tstatic K: number = 3;\n\tstatic THETAX: number = Hploc.asin((HiPSHelper.K - 1) / HiPSHelper.K);\n\t/**\n\t * Table 1 - ref paper HEALPix — a Framework for High Resolution Discretization,\n\t * and Fast Analysis of Data Distributed on the Sphere\n\t * K. M. G´orski1,2, E. Hivon3,4, A. J. Banday5, B. D. Wandelt6,7, F. K. Hansen8, M.\n\t * Reinecke5, M. Bartelman9\n\t */\n\t/**\n\t * \n\t * @param {decimal degrees} pxsize \n\t * @returns {int} nside\n\t */\n\t// static computeHiPSOrder(pxsize: number, pxXtile: number): number {\n\t// \t/**\n\t// \t * with same order k (table 1), HIPS angular resolution is higher of order of 512 (2^9) pixels than \n\t// \t * the HEALPix. This is because each tile in a HiPS is represented by default by 512x512 pixels.\\\n\t// \t * Angular resolution of different HEALPix orders in respect to the order 0, can be calculated this\n\t// \t * way:\n\t// \t * \n\t// \t * \tL(k) = L(0) / 2^k = 58.6 / 2^k\n\t// \t * \n\t// \t * Therefore, in the case of HiPS we need to take into account the extra resolution given by the \n\t// \t * 512x512 (2^9) tiles. In this case the above becomes:\n\t// \t * \t\n\t// \t * \tL(k) = L(0) / (2^k * 2^9) \n\t// \t * \n\t// \t * Though, in order to compute the required order starting from the pxsize desired (in input) we\n\t// \t * need to perform these steps:\n\t// \t * \n\t// \t * \tpxsize = L(k) = L(0) / (2^k * 2^9)\n\t// \t * \t2^k = L(0) / (pxsize * 2^9)\n\t// \t *  k * Log2 2 = Log2 L(0) - Log2 (pxsize * 2^9)\n\t// \t * \tk = Log2 L(0) - Log2 (pxsize * 2^9)\n\t// \t * \n\t// \t */\n\n\n\t// \tlet k = Math.log2( (HiPSHelper.RES_ORDER_0 / pxXtile) / pxsize);\n\t// \t// let k = Math.log2(HiPSHelper.RES_ORDER_0 / (pxXtile * pxsize));\n\t// \tk = Math.round(k);\n\t// \t// let theta0px = HiPSHelper.RES_ORDER_0;\n\t// \t// let k = Math.log2(theta0px) - Math.log2(pxsize * 2**9);\n\t// \t// k = Match.round(k);\n\t// \t// let nside = 2**k;\n\t// \t// return {\n\t// \t//     \"nside\" : nside,\n\t// \t//     \"norder\" : k\n\t// \t// };\n\t// \treturn k;\n\n\t// }\n\n\t// static computeHiPSOrder2(pxsize: number, pxXtile: number): number {\n\t\t\n\t// \tconst k = Math.log2( Math.sqrt(Math.PI/ 3) / ( pxsize * pxXtile) )\n\t// \tconst order = Math.round(k);\n\t// \tconsole.warn(k)\n \n\t// \treturn order;\n\n\t// }\n\n\n\t// based on \"HiPS – Hierarchical Progressive Survey\" IVOA recomandation (formula on table 5)\n\tstatic computeOrder(pxAngSizeDeg: number, pxTileWidth: number): number {\n\t\tconsole.log(`Computing HiPS order having pixel angular size of ${pxAngSizeDeg} in degrees`)\n\t\tconst deg2rad = Math.PI / 180\n\t\tconst pxAngSizeRad = pxAngSizeDeg * deg2rad\n\t\tconsole.log(`pixel angular res in radians ${pxAngSizeRad}`)\n\t\tconst computedOrder = 0.5 * Math.log2 ( Math.PI / (3 * pxAngSizeRad * pxAngSizeRad * pxTileWidth * pxTileWidth) )\n\t\tconsole.log(`Order ${computedOrder}`)\n\t\tif (computedOrder < 0) {\n\t\t\treturn 0\n\t\t}\n\t\treturn Math.floor(computedOrder)\n\t}\n\n\tstatic getHelpixByOrder(order: number): Healpix {\n\t\tconst nside = 2 ** order\n        const healpix = new Healpix(nside)\n\t\treturn healpix\n\t}\n\n\tstatic getHelpixBypxAngSize(pixelAngulaSize: number, TILE_WIDTH: number, hipsMaxOrder: number | null = null): Healpix {\n\t\tlet healpixOrder = HiPSHelper.computeOrder(pixelAngulaSize, TILE_WIDTH)\n\t\tif (hipsMaxOrder && hipsMaxOrder > 0) {\n\t\t\tif (healpixOrder > hipsMaxOrder) {\n\t\t\t\thealpixOrder = hipsMaxOrder\n\t\t\t}\n\t\t}\n        const nside = 2 ** healpixOrder\n        const healpix = new Healpix(nside)\n\t\treturn healpix\n\t}\n\n\t// based on \"HiPS – Hierarchical Progressive Survey\" IVOA recomandation (formula on table 5)\n\tstatic computePxAngularSize(pxTileWidth: number, order: number) {\n\t\tconst computedPxAngSizeRadiant = Math.sqrt( 4 * Math.PI / (12 * (pxTileWidth * (2**order) )**2 ) )\n\t\tconsole.log(`Computing Pixel size with tile of ${pxTileWidth} pixels and order ${order}`)\n\t\tconst rad2deg = 180 / Math.PI\n\t\tconst deg = computedPxAngSizeRadiant * rad2deg\n\t\tconst arcmin = computedPxAngSizeRadiant * rad2deg * 60\n\t\tconst arcsec = computedPxAngSizeRadiant * rad2deg * 3600\n\t\tconsole.log (\"Pixel size in radiant:\" + computedPxAngSizeRadiant)\n\t\tconsole.log (\"Pixel size in degrees:\" + deg)\n\t\tconsole.log (\"Pixel size in arcmin:\" + arcmin)\n\t\tconsole.log (\"Pixel size in arcsec:\" + arcsec)\n\t\treturn {\n\t\t\t\"rad\": computedPxAngSizeRadiant,\n\t\t\t\"deg\": deg,\n\t\t\t\"arcmin\": arcmin,\n\t\t\t\"arcsec\": arcsec\n\t\t}\n\t}\n\n\n\t/**\n\t * Reference: HiPS – Hierarchical Progressive Survey page 11\n\t * pxsize =~ sqrt[4 * PI / (12 * (512 * 2^order)^2)]\n\t * @param {*} order \n\t */\n\tstatic computePxSize(order: number, pxXtile: number): number {\n\t\t// TODO CHECK IT\n\t\t// let pxsize = 1 / (512 * 2 ** order) * Math.sqrt(Math.PI / 3);\n\t\tlet pxsize = 1 / (pxXtile * 2 ** order) * Math.sqrt(Math.PI / 3);\n\t\treturn pxsize;\n\t}\n\n\t// /**\n\t//  * \n\t//  * @param {Object {ra, dec}} point  decimal degrees\n\t//  * @returns {Object {phi_rad, theta_rad}} in radians\n\t//  */\n\t// static convert2PhiTheta (point: Point) {\n\t// \tlet phitheta_rad = {};\n\t// \tlet phiTheta_deg = HiPSHelper.astroDegToSpherical(point.ra, point.dec);\n\t// \tphitheta_rad.phi_rad = HiPSHelper.degToRad(phiTheta_deg.phi);\n\t//     phitheta_rad.theta_rad = HiPSHelper.degToRad(phiTheta_deg.theta);\n\t// \treturn phitheta_rad;\n\t// }\n\n\t// static astroDegToSphericalRad(raDeg: number, decDeg: number) {\n\t// \tlet phiThetaDeg = HiPSHelper.astroDegToSpherical(raDeg, decDeg);\n\t// \tlet phiThetaRad = {\n\t// \t\tphi_rad: HiPSHelper.degToRad(phiThetaDeg.phi),\n\t// \t\ttheta_rad: HiPSHelper.degToRad(phiThetaDeg.theta)\n\t// \t}\n\t// \treturn phiThetaRad;\n\t// }\n\n\t// static degToRad(degrees: number): number {\n\t// \treturn (degrees / 180 ) * Math.PI ;\n\t// }\n\n\t// static radToDeg(rad: number): number {\n\t// \treturn (rad / Math.PI ) * 180 ;\n\t// }\n\n\t// static astroDegToSpherical(raDeg: number, decDeg: number): Point{\n\n\t// \tlet phiDeg: number;\n\t// \tlet thetaDeg: number;\n\t// \tphiDeg = raDeg;\n\t// \tif (phiDeg < 0){\n\t// \t\tphiDeg += 360;\n\t// \t}\n\n\t// \tthetaDeg = 90 - decDeg;\n\n\t// \treturn {\n\t// \t\tphi: phiDeg,\n\t// \t\ttheta: thetaDeg\n\t// \t};\n\t// }\n\n\t/**\n\t * \n\t * @param {Object {phi_rad, theta_rad}} phiTheta_rad Center of the circle in radians\n\t * @param {decimal} r Radius of the circle in radians\n\t * @returns \n\t */\n\tstatic computeBbox(point: Point, r: number): Pointing[] {\n\n\t\tlet bbox = [];\n\t\tbbox.push(new Pointing(null, false, point.getSpherical().thetaRad - r, point.getSpherical().phiRad - r));\n\t\tbbox.push(new Pointing(null, false, point.getSpherical().thetaRad - r, point.getSpherical().phiRad + r));\n\t\tbbox.push(new Pointing(null, false, point.getSpherical().thetaRad + r, point.getSpherical().phiRad + r));\n\t\tbbox.push(new Pointing(null, false, point.getSpherical().thetaRad - r, point.getSpherical().phiRad - r));\n\n\t\treturn bbox;\n\t}\n\n\t// static setupByTile(tileno: number, hp: Healpix): HEALPixXYSpace {\n\n\t// \tlet xyGridProj: HEALPixXYSpace = {\n\t// \t\t\"min_y\": NaN,\n\t// \t\t\"max_y\": NaN,\n\t// \t\t\"min_x\": NaN,\n\t// \t\t\"max_x\": NaN,\n\t// \t\t\"gridPointsDeg\": []\n\t// \t}\n\n\n\t// \tlet cornersVec3 = hp.getBoundariesWithStep(tileno, 1);\n\t// \tlet pointings = [];\n\n\t// \tfor (let i = 0; i < cornersVec3.length; i++) {\n\t// \t\tpointings[i] = new Pointing(cornersVec3[i]);\n\t// \t\tif (i >= 1) {\n\t// \t\t\tlet a = pointings[i - 1].phi;\n\t// \t\t\tlet b = pointings[i].phi;\n\t// \t\t\t// case when RA is just crossing the origin (e.g. 357deg - 3deg)\n\t// \t\t\tif (Math.abs(a - b) > Math.PI) {\n\t// \t\t\t\tif (pointings[i - 1].phi < pointings[i].phi) {\n\t// \t\t\t\t\tpointings[i - 1].phi += 2 * Math.PI;\n\t// \t\t\t\t} else {\n\t// \t\t\t\t\tpointings[i].phi += 2 * Math.PI;\n\t// \t\t\t\t}\n\t// \t\t\t}\n\t// \t\t}\n\t// \t}\n\n\t// \tfor (let j = 0; j < pointings.length; j++) {\n\t// \t\tlet coThetaRad = pointings[j].theta;\n\t// \t\t// HEALPix works with colatitude (0 North Pole, 180 South Pole)\n\t// \t\t// converting the colatitude in latitude (dec)\n\t// \t\tlet decRad = Math.PI / 2 - coThetaRad;\n\n\t// \t\tlet raRad = pointings[j].phi;\n\n\t// \t\t// projection on healpix grid\n\t// \t\tlet p = new Point(CoordsType.ASTRO, NumberType.RADIANS, raRad, decRad);\n\t// \t\tlet xyDeg = HiPSHelper.world2intermediate(p.getAstro());\n\t// \t\txyGridProj.gridPointsDeg[j * 2] = xyDeg[0];\n\t// \t\txyGridProj.gridPointsDeg[j * 2 + 1] = xyDeg[1];\n\n\t// \t\tif (isNaN(xyGridProj.max_y) || xyDeg[1] > xyGridProj.max_y) {\n\t// \t\t\txyGridProj.max_y = xyDeg[1];\n\t// \t\t}\n\t// \t\tif (isNaN(xyGridProj.min_y) || xyDeg[1] < xyGridProj.min_y) {\n\t// \t\t\txyGridProj.min_y = xyDeg[1];\n\t// \t\t}\n\t// \t\tif (isNaN(xyGridProj.max_x) || xyDeg[0] > xyGridProj.max_x) {\n\t// \t\t\txyGridProj.max_x = xyDeg[0];\n\t// \t\t}\n\t// \t\tif (isNaN(xyGridProj.min_x) || xyDeg[0] < xyGridProj.min_x) {\n\t// \t\t\txyGridProj.min_x = xyDeg[0];\n\t// \t\t}\n\n\t// \t}\n\t// \treturn xyGridProj;\n\t// }\n\n\t// static world2intermediate(ac: AstroCoords): [number, number] {\n\n\t// \tlet x_grid: number;\n\t// \tlet y_grid: number;\n\n\t// \tif (Math.abs(ac.decRad) <= HiPSHelper.THETAX) { // equatorial belts\n\t\t\t\n\t// \t\tx_grid = ac.raDeg;\n\t// \t\ty_grid = Hploc.sin(ac.decRad) * HiPSHelper.K * 90 / HiPSHelper.H;\n\t// \t\treturn [x_grid, y_grid];\n\n\t// \t} else if (Math.abs(ac.decRad) > HiPSHelper.THETAX) { // polar zones\n\n\t// \t\tconst raDeg = ac.raDeg;\n\n\t// \t\tlet w = 0; // omega\n\t// \t\tif (HiPSHelper.K % 2 !== 0 || ac.decRad > 0) { // K odd or thetax > 0\n\t// \t\t\tw = 1;\n\t// \t\t}\n\n\t// \t\tconst sigma = Math.sqrt(HiPSHelper.K * (1 - Math.abs(Hploc.sin(ac.decRad))));\n\t// \t\tconst phi_c = - 180 + (2 * Math.floor(((ac.raDeg + 180) * HiPSHelper.H / 360) + ((1 - w) / 2)) + w) * (180 / HiPSHelper.H);\n\n\t// \t\tx_grid = phi_c + (raDeg - phi_c) * sigma;\n\t// \t\ty_grid = (180 / HiPSHelper.H) * (((HiPSHelper.K + 1) / 2) - sigma);\n\n\t// \t\tif (ac.decRad < 0) {\n\t// \t\t\ty_grid *= -1;\n\t// \t\t}\n\t// \t\treturn [x_grid, y_grid]\n\t// \t}\n\n\t// \treturn [NaN, NaN];\n\n\t// }\n\n\t// static world2intermediate(sc: SphericalCoords): [number, number] {\n\t//     let x_grid: number;\n\t// \tlet y_grid: number;\n\n\t// \tif ( Math.abs(sc.thetaRad) <= HiPSHelper.THETAX) { // equatorial belts\n\t// \t\tx_grid = sc.phiDeg;\n\n\t// \t\ty_grid = Hploc.sin(sc.thetaRad) * HiPSHelper.K * 90 / HiPSHelper.H;\n\n\n\t// \t} else if ( Math.abs(sc.thetaRad) > HiPSHelper.THETAX) { // polar zones\n\n\t// \t\tlet phiDeg = sc.phiDeg;\n\n\t// \t\tlet w = 0; // omega\n\t// \t\tif (HiPSHelper.K % 2 !== 0 || sc.thetaRad > 0) { // K odd or thetax > 0\n\t// \t\t\tw = 1;\n\t// \t\t}\n\n\t// \t\tlet sigma = Math.sqrt( HiPSHelper.K * (1 - Math.abs(Hploc.sin(sc.thetaRad)) ) );\n\t// \t\tlet phi_c = - 180 + ( 2 * Math.floor( ((sc.phiRad + 180) * HiPSHelper.H/360) + ((1 - w)/2) ) + w ) * ( 180 / HiPSHelper.H );\n\n\t// \t\tx_grid = phi_c + (phiDeg - phi_c) * sigma;\n\t// \t\ty_grid = (180  / HiPSHelper.H) * ( ((HiPSHelper.K + 1)/2) - sigma);\n\n\t// \t\tif (sc.thetaRad < 0) {\n\t// \t\t\ty_grid *= -1;\n\t// \t\t}\n\t// \t}\n\n\t// \treturn [x_grid, y_grid];\n\n\t// }\n\n\t// static intermediate2pix(x: number, y: number, xyGridProj: HEALPixXYSpace, pxXtile: number): [number, number] {\n\t// \tlet xInterval = Math.abs(xyGridProj.max_x - xyGridProj.min_x);\n\t// \tlet yInterval = Math.abs(xyGridProj.max_y - xyGridProj.min_y);\n\n\t// \tlet i_norm: number;\n\t// \tlet j_norm: number;\n\t// \tif ((xyGridProj.min_x > 360 || xyGridProj.max_x > 360) && x < xyGridProj.min_x) {\n\t// \t\ti_norm = (x + 360 - xyGridProj.min_x) / xInterval;\n\t// \t} else {\n\t// \t\ti_norm = (x - xyGridProj.min_x) / xInterval;\n\t// \t}\n\t// \tj_norm = (y - xyGridProj.min_y) / yInterval;\n\n\n\t// \tlet i = 0.5 - (i_norm - j_norm);\n\t// \tlet j = (i_norm + j_norm) - 0.5;\n\n\t// \t// TODO CHECK THE FOLLOWING. BEFORE IT WAS i = Math.floor(i * HiPSHelper.pxXtile);\n\t// \tpxXtile\n\t// \t// i = Math.floor(i * HiPSHelper.DEFAULT_Naxis1_2);\n\t// \t// j = Math.floor(j * HiPSHelper.DEFAULT_Naxis1_2);\n\t// \t// return [i, HiPSHelper.DEFAULT_Naxis1_2 - j - 1];\n\t\t\n\t// \ti = Math.floor(i * pxXtile);\n\t// \tj = Math.floor(j * pxXtile);\n\t// \treturn [i, pxXtile - j - 1];\n\n\n\n\t// }\n\n\n\t// static pix2intermediate(i: number, j: number, xyGridProj: HEALPixXYSpace, naxis1: number, naxis2: number): [number, number] {\n\t// \t/**\n\t// \t   * (i_norm,w_pixel) = (0,0) correspond to the lower-left corner of the facet in the image\n\t// \t * (i_norm,w_pixel) = (1,1) is the upper right corner\n\t// \t * dimamond in figure 1 from \"Mapping on the HEalpix grid\" paper\n\t// \t * (0,0) leftmost corner\n\t// \t * (1,0) upper corner\n\t// \t * (0,1) lowest corner\n\t// \t * (1,1) rightmost corner\n\t// \t * Thanks YAGO! :p\n\t// \t */\n\t// \t// let cnaxis1 = HiPSHelper.pxXtile;\n\t// \t// let cnaxis2 = HiPSHelper.pxXtile;\n\n\t// \tlet cnaxis1 = naxis1;\n\t// \tlet cnaxis2 = naxis2;\n\t// \tif (naxis1) {\n\t// \t\tcnaxis1 = naxis1;\n\t// \t}\n\t// \tif (naxis2) {\n\t// \t\tcnaxis2 = naxis2;\n\t// \t}\n\t// \tlet i_norm = (i + 0.5) / cnaxis1;\n\t// \tlet j_norm = (j + 0.5) / cnaxis2;\n\n\t// \tlet xInterval = Math.abs(xyGridProj.max_x - xyGridProj.min_x) / 2.0;\n\t// \tlet yInterval = Math.abs(xyGridProj.max_y - xyGridProj.min_y) / 2.0;\n\t// \tlet yMean = (xyGridProj.max_y + xyGridProj.min_y) / 2.0;\n\n\t// \t// bi-linear interpolation\n\t// \tlet x = xyGridProj.max_x - xInterval * (i_norm + j_norm);\n\t// \tlet y = yMean - yInterval * (j_norm - i_norm);\n\n\t// \treturn [x, y];\n\t// }\n\n\n\t// static intermediate2world(x: number, y: number): Point {\n\n\t// \tlet phiDeg: number;\n\t// \tlet thetaDeg: number;\n\t// \tlet Yx = 90 * (HiPSHelper.K - 1) / HiPSHelper.H;\n\n\n\n\t// \tif (Math.abs(y) <= Yx) { // equatorial belts\n\n\t// \t\tphiDeg = x;\n\t// \t\tthetaDeg = radToDeg(Math.asin((y * HiPSHelper.H) / (90 * HiPSHelper.K)));\n\n\t// \t} else if (Math.abs(y) > Yx) { // polar regions\n\n\t// \t\tlet sigma = (HiPSHelper.K + 1) / 2 - Math.abs(y * HiPSHelper.H) / 180;\n\t// \t\tlet thetaRad = Hploc.asin(1 - (sigma * sigma) / HiPSHelper.K);\n\t// \t\tlet w = 0; // omega\n\t// \t\tif (HiPSHelper.K % 2 !== 0 || thetaRad > 0) { // K odd or thetax > 0\n\t// \t\t\tw = 1;\n\t// \t\t}\n\t// \t\tlet x_c = -180 + (2 * Math.floor((x + 180) * HiPSHelper.H / 360 + (1 - w) / 2) + w) * (180 / HiPSHelper.H);\n\t// \t\tphiDeg = x_c + (x - x_c) / sigma;\n\t// \t\tthetaDeg = radToDeg(thetaRad);\n\t// \t\tif (y <= 0) {\n\t// \t\t\tthetaDeg *= -1;\n\t// \t\t}\n\t// \t}\n\t// \t// return [phiDeg, thetaDeg];\n\t// \t// TODO CHECK THIS!\n\t// \t// let p = new Point(CoordsType.SPHERICAL, NumberType.DEGREES, phiDeg, thetaDeg);\n\t// \tlet p = new Point(CoordsType.ASTRO, NumberType.DEGREES, phiDeg, thetaDeg);\n\n\t// \treturn p;\n\n\t// }\n\n}\n","export class HiPSProperties {\n\n    static TILE_WIDTH:string = \"hips_tile_width\"\n    static FRAME:string = \"hips_frame\"\n    static ORDER:string = \"hips_order\"\n    static GALACTIC:string = \"galactic\"\n    static SCALE:string = \"hips_pixel_scale\"\n    static BITPIX:string = \"hips_pixel_bitpix\"\n\n\n    private itemMap: Map<string, any> = new Map<string, any>()\n\n    constructor(){}\n\n    addItem(key:string, value:any) {\n        this.itemMap.set(key, value)\n    }\n\n    getItem(key: string){\n        return this.itemMap.get(key)\n    }\n\n    isGalactic(){\n        return this.itemMap.get(HiPSProperties.FRAME) == HiPSProperties.GALACTIC\n    }\n\n}","import {\n  FITSHeaderItem,\n  FITSHeaderManager,\n  FITSParser,\n  ParsePayload,\n  PrimaryHDU,\n} from \"jsfitsio\";\n\nimport { Healpix } from \"astrospatial-core/healpix\";\n\nimport { HiPSIntermediateProj } from \"./HiPSIntermediateProj.js\";\nimport { HEALPixXYSpace } from \"../../model/HEALPixXYSpace.js\";\nimport { fillAstro, radToDeg } from \"../../model/Utils.js\";\nimport { NumberType } from \"../../model/NumberType.js\";\nimport { HiPSHelper } from \"../HiPSHelper.js\";\nimport { HiPSProperties } from \"./HiPSProperties.js\";\nimport { ImagePixel } from \"./ImagePixel.js\";\nimport { APP_VERSION } from \"../../Version.js\";\n\nexport class HiPSFITS {\n  private payload: Array<Uint8Array> = [];\n\n  private header!: FITSHeaderManager;\n\n  private tileno!: number;\n\n  private order!: number;\n\n  private tileWidth!: number;\n\n  private healpix!: Healpix;\n\n  private intermediateXYGrid!: HEALPixXYSpace;\n\n  private min: number = NaN;\n\n  private max: number = NaN;\n\n  private static CTYPE1 = \"RA---HPX\";\n\n  private static CTYPE2 = \"DEC--HPX\";\n\n  private static NPIX = \"NPIX\";\n\n  constructor(\n    fits: PrimaryHDU | null,\n    tileno: number | null,\n    hipsProp: HiPSProperties | null,\n  ) {\n    if (fits) {\n      this.initFromPrimaryHDU(fits);\n      return;\n    }\n\n    if (tileno === null || hipsProp === null) {\n      throw new Error(\"tileno or hipsProp are not defined\");\n    }\n\n    this.order = Number(hipsProp.getItem(HiPSProperties.ORDER));\n\n    const naxis1 = Number(hipsProp.getItem(HiPSProperties.TILE_WIDTH));\n\n    const naxis2 = Number(hipsProp.getItem(HiPSProperties.TILE_WIDTH));\n\n    this.tileno = tileno;\n\n    if (!Number.isFinite(this.order)) {\n      throw new Error(\"HiPS ORDER is not defined\");\n    }\n\n    if (!Number.isFinite(naxis1) || !Number.isFinite(naxis2)) {\n      throw new Error(\"HiPS TILE_WIDTH is not defined\");\n    }\n\n    if (naxis1 !== naxis2) {\n      throw new Error(\"NAXIS1 and NAXIS2 do not match.\");\n    }\n\n    this.tileWidth = naxis1;\n\n    this.healpix = HiPSHelper.getHelpixByOrder(this.order);\n\n    this.intermediateXYGrid = HiPSIntermediateProj.setupByTile(\n      this.tileno,\n      this.healpix,\n    );\n  }\n\n  initFromUint8Array(\n    imagePixelList: ImagePixel[],\n    fitsHeaderParams: FITSHeaderManager,\n    tileWidth: number,\n  ): void {\n    this.setPayload(imagePixelList, fitsHeaderParams, tileWidth);\n\n    this.setHeader(fitsHeaderParams);\n  }\n\n  getPayload(): Array<Uint8Array> {\n    return this.payload;\n  }\n\n  private createRawRows(fits: PrimaryHDU): Array<Uint8Array> {\n    if (fits.rawData === null) {\n      return [];\n    }\n\n    const naxis1 = fits.shape[0] ?? 0;\n\n    const naxis2 = fits.shape[1] ?? 0;\n\n    const bytesPerElement = Math.abs(fits.bitpix) / 8;\n\n    const rowByteLength = naxis1 * bytesPerElement;\n\n    const rows = new Array<Uint8Array>(naxis2);\n\n    for (let row = 0; row < naxis2; row++) {\n      const start = row * rowByteLength;\n\n      rows[row] = fits.rawData.subarray(start, start + rowByteLength);\n    }\n\n    return rows;\n  }\n\n  initFromPrimaryHDU(fits: PrimaryHDU): void {\n    if (fits.naxis !== 2) {\n      throw new Error(\n        `HiPSFITS requires a 2D FITS image, got NAXIS=${fits.naxis}`,\n      );\n    }\n\n    this.payload = this.createRawRows(fits);\n\n    this.order = Number(fits.header.findById(HiPSProperties.ORDER)?.value);\n\n    const naxis1 = fits.shape[0] ?? 0;\n\n    const naxis2 = fits.shape[1] ?? 0;\n\n    this.tileno = Number(fits.header.findById(HiPSFITS.NPIX)?.value);\n\n    if (\n      !Number.isFinite(this.order) ||\n      !Number.isFinite(naxis1) ||\n      !Number.isFinite(naxis2) ||\n      !Number.isFinite(this.tileno)\n    ) {\n      throw new Error(\"ORDER, NAXIS1, NAXIS2 or NPIX not defined\");\n    }\n\n    if (naxis1 !== naxis2) {\n      throw new Error(\"NAXIS1 and NAXIS2 do not match.\");\n    }\n\n    this.tileWidth = naxis1;\n\n    this.healpix = HiPSHelper.getHelpixByOrder(this.order);\n\n    this.intermediateXYGrid = HiPSIntermediateProj.setupByTile(\n      this.tileno,\n      this.healpix,\n    );\n\n    this.computeMinMax(fits);\n\n    /*\n     * Rebuild the header using the loaded FITS metadata\n     * plus the HPX WCS derived from this tile geometry.\n     */\n    this.setHeader(fits.header);\n  }\n\n  getTileno(): number {\n    return this.tileno;\n  }\n\n  private computeMinMax(fits: PrimaryHDU): void {\n    if (fits.rawData === null) {\n      return;\n    }\n\n    this.min = NaN;\n\n    this.max = NaN;\n\n    const bitpix = fits.bitpix;\n\n    const bzero = Number(\n      fits.header.findById(FITSHeaderManager.BZERO)?.value ?? 0,\n    );\n\n    const bscale = Number(\n      fits.header.findById(FITSHeaderManager.BSCALE)?.value ?? 1,\n    );\n\n    const naxis1 = fits.shape[0] ?? 0;\n\n    const naxis2 = fits.shape[1] ?? 0;\n\n    const bytesPerElement = Math.abs(bitpix) / 8;\n\n    const pixelCount = naxis1 * naxis2;\n\n    for (let index = 0; index < pixelCount; index++) {\n      const byteOffset = index * bytesPerElement;\n\n      const rawValue = ParsePayload.extractPixelValue(\n        fits.rawData,\n        byteOffset,\n        bitpix,\n      );\n\n      const physicalValue = bzero + bscale * rawValue;\n\n      if (Number.isNaN(this.min) || physicalValue < this.min) {\n        this.min = physicalValue;\n      }\n\n      if (Number.isNaN(this.max) || physicalValue > this.max) {\n        this.max = physicalValue;\n      }\n    }\n  }\n\n  static async downloadFITSFile(path: string): Promise<PrimaryHDU | null> {\n    const fitsFile = await FITSParser.loadFITSFile(path);\n\n    const primary = fitsFile?.primaryHDU ?? null;\n\n    if (!primary) {\n      console.warn(`fits ${path} doesn't exist`);\n\n      return null;\n    }\n\n    return primary;\n  }\n\n  getHeader(): FITSHeaderManager {\n    return this.header;\n  }\n\n  private setPayload(\n    imagePixelList: ImagePixel[],\n    fitsHeaderParams: FITSHeaderManager,\n    tileWidth: number,\n  ): void {\n    const bitpix = Number(\n      fitsHeaderParams.findById(FITSHeaderManager.BITPIX)?.value,\n    );\n\n    const bzero = Number(\n      fitsHeaderParams.findById(FITSHeaderManager.BZERO)?.value ?? 0,\n    );\n\n    const bscale = Number(\n      fitsHeaderParams.findById(FITSHeaderManager.BSCALE)?.value ?? 1,\n    );\n\n    const bytesXelem = Math.abs(bitpix) / 8;\n\n    if (\n      !Number.isFinite(bitpix) ||\n      !Number.isInteger(bytesXelem) ||\n      bytesXelem <= 0\n    ) {\n      throw new Error(\"BITPIX not defined or invalid\");\n    }\n\n    this.min = NaN;\n\n    this.max = NaN;\n\n    this.payload = new Array<Uint8Array>(tileWidth);\n\n    for (let row = 0; row < tileWidth; row++) {\n      this.payload[row] = new Uint8Array(tileWidth * bytesXelem);\n    }\n\n    imagePixelList.forEach((imgpx) => {\n      const ra = imgpx.getRADeg();\n\n      const dec = imgpx.getDecDeg();\n\n      if (!Number.isFinite(ra) || !Number.isFinite(dec)) {\n        return;\n      }\n\n      const ac = fillAstro(ra, dec, NumberType.DEGREES);\n\n      if (ac === null) {\n        return;\n      }\n\n      const [x, y] = HiPSIntermediateProj.world2intermediate(ac);\n\n      if (!Number.isFinite(x) || !Number.isFinite(y)) {\n        return;\n      }\n\n      const [col, row] = HiPSIntermediateProj.intermediate2pix(\n        x,\n        y,\n        this.intermediateXYGrid,\n        tileWidth,\n      );\n\n      if (row < 0 || row >= tileWidth || col < 0 || col >= tileWidth) {\n        return;\n      }\n\n      const valueBytes = imgpx.getUint8Value();\n\n      if (!valueBytes) {\n        return;\n      }\n\n      for (let b = 0; b < bytesXelem; b++) {\n        this.payload[row][col * bytesXelem + b] = valueBytes[b];\n      }\n\n      const rawValue = ParsePayload.extractPixelValue(valueBytes, 0, bitpix);\n\n      const physicalValue = bzero + bscale * rawValue;\n\n      if (Number.isNaN(this.min) || physicalValue < this.min) {\n        this.min = physicalValue;\n      }\n\n      if (Number.isNaN(this.max) || physicalValue > this.max) {\n        this.max = physicalValue;\n      }\n    });\n  }\n\n  private addMandatoryItemToHeader(\n    key: string,\n    fitsHeaderParams: FITSHeaderManager,\n  ): void {\n    const value = fitsHeaderParams.findById(key)?.value;\n\n    if (value === undefined || value === null) {\n      throw new Error(`${key} is not defined`);\n    }\n\n    this.header.insert(new FITSHeaderItem(key, value, \"\"));\n  }\n\n  private addItemToHeader(\n    key: string,\n    fitsHeaderParams: FITSHeaderManager,\n  ): void {\n    const value = fitsHeaderParams.findById(key)?.value;\n\n    if (value !== undefined && value !== null) {\n      this.header.insert(new FITSHeaderItem(key, value, \"\"));\n    }\n  }\n\n  private setHeader(fitsHeaderParams: FITSHeaderManager): void {\n    this.header = new FITSHeaderManager();\n\n    this.addMandatoryItemToHeader(FITSHeaderManager.SIMPLE, fitsHeaderParams);\n\n    this.addMandatoryItemToHeader(FITSHeaderManager.BITPIX, fitsHeaderParams);\n\n    this.addItemToHeader(FITSHeaderManager.BLANK, fitsHeaderParams);\n\n    this.addItemToHeader(FITSHeaderManager.BSCALE, fitsHeaderParams);\n\n    this.addItemToHeader(FITSHeaderManager.BZERO, fitsHeaderParams);\n\n    this.header.insert(new FITSHeaderItem(FITSHeaderManager.NAXIS, 2, \"\"));\n\n    this.header.insert(\n      new FITSHeaderItem(FITSHeaderManager.NAXIS1, this.tileWidth, \"\"),\n    );\n\n    this.header.insert(\n      new FITSHeaderItem(FITSHeaderManager.NAXIS2, this.tileWidth, \"\"),\n    );\n\n    if (Number.isFinite(this.min)) {\n      this.header.insert(\n        new FITSHeaderItem(FITSHeaderManager.DATAMIN, this.min, \"\"),\n      );\n    }\n\n    if (Number.isFinite(this.max)) {\n      this.header.insert(\n        new FITSHeaderItem(FITSHeaderManager.DATAMAX, this.max, \"\"),\n      );\n    }\n\n    this.header.insert(\n      new FITSHeaderItem(HiPSProperties.ORDER, this.order, \"\"),\n    );\n\n    this.header.insert(new FITSHeaderItem(HiPSFITS.NPIX, this.tileno, \"\"));\n\n    /*\n     * Build a standards-compatible HPX WCS\n     * describing this tile in the global\n     * HEALPix projection plane.\n     */\n    this.addHPXWCS();\n\n    this.header.insert(\n      new FITSHeaderItem(\n        FITSHeaderManager.ORIGIN,\n        `WCSLight v.${APP_VERSION}`,\n        \"\",\n      ),\n    );\n\n    /*\n     * COMMENT/HISTORY serialization belongs\n     * to jsfitsio.\n     *\n     * Do not add COMMENT here until jsfitsio\n     * correctly supports FITS commentary cards.\n     */\n\n    this.header.insert(new FITSHeaderItem(\"END\", \"\", \"\"));\n  }\n\n  private addHPXWCS(): void {\n    /*\n     * A HiPS FITS tile is a square sampling of one\n     * HEALPix NESTED cell in the global HPX projection.\n     *\n     * The WCS celestial reference remains the standard\n     * HPX reference:\n     *\n     *   CRVAL1 = 0\n     *   CRVAL2 = 0\n     *\n     * The location of the tile in the global HPX plane\n     * is therefore encoded in CRPIX.\n     *\n     * Rather than reconstructing the HPX facet position\n     * manually from face-local NESTED coordinates, use\n     * the public HEALPix API to obtain the actual\n     * spherical centre of the tile and project that\n     * centre onto the standard HPX intermediate plane.\n     */\n\n    const scale = 45 / (this.tileWidth * Math.pow(2, this.order));\n\n    /*\n     * HEALPix centre of this NESTED pixel.\n     *\n     * pix2ang() returns:\n     *\n     *   theta = colatitude [0, pi]\n     *   phi   = longitude  [0, 2pi)\n     */\n    const pointing = this.healpix.pix2ang(this.tileno);\n\n    const raDeg = radToDeg(pointing.phi);\n\n    const decDeg = 90 - radToDeg(pointing.theta);\n\n    const astro = fillAstro(raDeg, decDeg, NumberType.DEGREES);\n\n    if (!astro) {\n      throw new Error(\n        `Unable to compute HEALPix centre for ` +\n          `order=${this.order}, NPIX=${this.tileno}`,\n      );\n    }\n\n    /*\n     * Convert the spherical HEALPix centre to the\n     * standard HPX intermediate projection plane.\n     */\n    let [xCenter, yCenter] = HiPSIntermediateProj.world2intermediate(astro);\n\n    /*\n     * HPX longitude is periodic.\n     *\n     * Select a local branch in (-180, 180], while\n     * deliberately preserving +180 rather than mapping\n     * it to -180.\n     *\n     * Although +180 and -180 represent the same celestial\n     * longitude, they are not interchangeable when choosing\n     * the local branch of the HPX intermediate projection\n     * plane for a tile crossing that meridian.\n     *\n     * Examples:\n     *\n     *   180 deg -> +180 deg\n     *   270 deg ->  -90 deg\n     */\n    xCenter = ((xCenter % 360) + 360) % 360;\n\n    if (xCenter > 180) {\n      xCenter -= 360;\n    }\n\n    if (!Number.isFinite(xCenter) || !Number.isFinite(yCenter)) {\n      throw new Error(\n        `Invalid HPX centre for ` +\n          `order=${this.order}, NPIX=${this.tileno}: ` +\n          `x=${xCenter}, y=${yCenter}`,\n      );\n    }\n\n    /*\n     * FITS uses one-based pixel coordinates.\n     *\n     * For a 512x512 image the geometric centre is\n     * therefore:\n     *\n     *   (256.5, 256.5)\n     */\n    const p = (this.tileWidth + 1) / 2;\n\n    /*\n     * Pixel -> HPX intermediate-plane transform:\n     *\n     *   x =\n     *     -scale * (p1 - CRPIX1)\n     *     -scale * (p2 - CRPIX2)\n     *\n     *   y =\n     *      scale * (p1 - CRPIX1)\n     *     -scale * (p2 - CRPIX2)\n     *\n     * At the geometric tile centre p1=p2=p:\n     *\n     *   CRPIX1 + CRPIX2 =\n     *     2*p + xCenter/scale\n     *\n     *   CRPIX2 - CRPIX1 =\n     *     yCenter/scale\n     */\n    const crpixSum = 2 * p + xCenter / scale;\n\n    const crpixDifference = yCenter / scale;\n\n    const crpix1 = 0.5 * (crpixSum - crpixDifference);\n\n    const crpix2 = 0.5 * (crpixSum + crpixDifference);\n\n    this.header.insert(\n      new FITSHeaderItem(FITSHeaderManager.CTYPE1, HiPSFITS.CTYPE1, \"\"),\n    );\n\n    this.header.insert(\n      new FITSHeaderItem(FITSHeaderManager.CTYPE2, HiPSFITS.CTYPE2, \"\"),\n    );\n\n    /*\n     * Standard HPX celestial reference.\n     */\n    this.header.insert(new FITSHeaderItem(FITSHeaderManager.CRVAL1, 0, \"\"));\n\n    this.header.insert(new FITSHeaderItem(FITSHeaderManager.CRVAL2, 0, \"\"));\n\n    /*\n     * HiPS tile orientation in the global HPX plane.\n     */\n    this.header.insert(new FITSHeaderItem(\"CD1_1\", -scale, \"\"));\n\n    this.header.insert(new FITSHeaderItem(\"CD1_2\", -scale, \"\"));\n\n    this.header.insert(new FITSHeaderItem(\"CD2_1\", scale, \"\"));\n\n    this.header.insert(new FITSHeaderItem(\"CD2_2\", -scale, \"\"));\n\n    this.header.insert(\n      new FITSHeaderItem(FITSHeaderManager.CRPIX1, crpix1, \"\"),\n    );\n\n    this.header.insert(\n      new FITSHeaderItem(FITSHeaderManager.CRPIX2, crpix2, \"\"),\n    );\n\n    /*\n     * HEALPix HPX projection parameters.\n     *\n     * H = 4\n     * K = 3\n     */\n    this.header.insert(new FITSHeaderItem(\"PV2_1\", HiPSIntermediateProj.H, \"\"));\n\n    this.header.insert(new FITSHeaderItem(\"PV2_2\", HiPSIntermediateProj.K, \"\"));\n  }\n}\n","import { FITSParser } from \"jsfitsio\";\nimport { HiPSFITS } from \"./HiPSFITS.js\";\n\nexport class FITSList {\n    private fitslist: Map<number, HiPSFITS> = new Map();\n\n    constructor() {}\n\n    getFITSList(): Map<number, HiPSFITS> {\n        return this.fitslist;\n    }\n\n    getFITS(tileno: number): HiPSFITS | null {\n        const fits = this.fitslist.get(tileno);\n        return fits === undefined ? null : fits;\n    }\n\n    async addFITSByURL(url: string) {\n        const fitsFile = await FITSParser.loadFITSFile(url);\n        const primaryHDU = fitsFile?.primaryHDU;\n\n        if (!primaryHDU) {\n            throw new Error(`Unable to load FITS file: ${url}`);\n        }\n\n        const hipsFits = new HiPSFITS(primaryHDU, null, null);\n\n        this.fitslist.set(hipsFits.getTileno(), hipsFits);\n    }\n\n    addFITS(fits: HiPSFITS) {\n        const tileno = fits.getTileno();\n        this.fitslist.set(tileno, fits);\n    }\n}","import { readFile } from \"node:fs/promises\";\nimport { HiPSProperties } from \"./HiPSProperties.js\";\n\n\nexport class HiPSPropManager {\n\n    static async parsePropertyFile(baseURL:string): Promise<HiPSProperties> {\n        let hipsPropText = \"\"\n        if (baseURL.includes(\"http\")) { // HiPS from web\n            hipsPropText = await HiPSPropManager.getPorpertyFromWeb(baseURL)\n        } else { // local HiPS\n            hipsPropText = await HiPSPropManager.getPorpertyFromFS(baseURL)\n        }\n        const hipsProp:HiPSProperties = HiPSPropManager.parseHiPSPropertiesBody(hipsPropText)\n        return hipsProp\n    }\n\n    private static async getPorpertyFromWeb(baseHiPSPath: string): Promise<string> {\n        const response = await fetch(baseHiPSPath + \"/properties\")\n        if (!response.ok) {\n            throw new Error(`HTTP error! Status: ${response.status}`)\n        } else {\n            const propFile = await response.text()\n            return propFile\n        }\n        \n    }\n\n    private static async getPorpertyFromFS(baseHiPSPath: string): Promise<string> {\n\n        const propPath = baseHiPSPath + \"/properties\"\n        const rawData: Buffer = await readFile(propPath)\n        const uint8 = new Uint8Array(rawData)\n        const textDecoder = new TextDecoder('ascii')\n        const propFile = textDecoder.decode(uint8);\n\n        return propFile\n    }\n\n    private static parseHiPSPropertiesBody(hipsPropText: string): HiPSProperties {\n        let hipsProp = new HiPSProperties()\n        const txtArr = hipsPropText.split('\\n');\n\n        for (let line of txtArr) {\n            if (!line.includes(\"=\")) {\n                continue;\n            }\n\n            const tokens = line.split(\"=\");\n            if (tokens[1] === undefined) {\n                continue;\n            }\n            const key = tokens[0].trim()\n            const val = tokens[1].trim()\n            let value: string|number = val\n            if (key == HiPSProperties.ORDER || key == HiPSProperties.TILE_WIDTH || key == HiPSProperties.SCALE || key == HiPSProperties.BITPIX) {\n                value = parseInt(val)\n            }\n            hipsProp.addItem(key, value)\n        }\n        return hipsProp\n    }\n}","import { FITSList } from \"./FITSList.js\";\nimport { HiPSProperties } from \"./HiPSProperties.js\";\nimport { HiPSPropManager } from \"./HiPSPropManager.js\";\nimport { Point } from \"../../model/Point.js\";\nimport { Healpix, Pointing, RangeSet } from \"astrospatial-core/healpix\";\nimport { degToRad } from \"../../model/Utils.js\";\nimport { HiPSIntermediateProj } from \"./HiPSIntermediateProj.js\";\nimport { FITSHeaderManager, FITSParser } from \"jsfitsio\";\nimport { HiPSFITS } from \"./HiPSFITS.js\";\nimport { ImagePixel } from \"./ImagePixel.js\";\nimport { HiPSHelper } from \"../HiPSHelper.js\";\nimport { CoordsType } from \"../../model/CoordsType.js\";\nimport { NumberType } from \"../../model/NumberType.js\";\nimport { HEALPixXYSpace } from \"../../model/HEALPixXYSpace.js\";\nimport { TilesRaDecList2 } from \"./TilesRaDecList2.js\";\nimport { FITSUtils } from \"../../utils/FITSUtils.js\";\n\nexport class HiPSProjection {\n  private baseURL: string;\n  private healpix: Healpix | null = null;\n  private hipsProp: HiPSProperties | null = null;\n\n  constructor(baseHiPSPath: string) {\n    this.baseURL = baseHiPSPath;\n    this.init();\n    if (this.healpix == null) {\n      console.warn(\"healpix is null\");\n      throw new Error(\"healpix is null\");\n    }\n    if (this.hipsProp == null) {\n      console.warn(\"HiPSProp is null\");\n      throw new Error(\"HiPSProp is null\");\n    }\n  }\n\n  async init() {\n    const hipsProp = await this.parsePropertyFile();\n    const order = hipsProp.getItem(HiPSProperties.ORDER);\n    this.healpix = HiPSHelper.getHelpixByOrder(order);\n  }\n\n  private async parsePropertyFile() {\n    const hipsProp = HiPSPropManager.parsePropertyFile(this.baseURL);\n    return hipsProp;\n  }\n\n  static getImageRADecList(\n    center: Point,\n    radiusDeg: number,\n    pixelAngSize: number,\n    TILE_WIDTH: number,\n  ): TilesRaDecList2 | null {\n    const healpix = HiPSHelper.getHelpixBypxAngSize(pixelAngSize, TILE_WIDTH);\n\n    // let tilesRaDecList2 = new TilesRaDecList2(healpix.order)\n    let tilesRaDecList2 = new TilesRaDecList2();\n\n    const ptg = new Pointing(\n      null,\n      false,\n      center.getSpherical().thetaRad,\n      center.getSpherical().phiRad,\n    );\n    const radius_rad = degToRad(radiusDeg);\n\n    // ??? with fact 8 the original Java code starts returning the the ptg pixel. with my JS porting only from fact 16\n    const rangeset: RangeSet = healpix.queryDiscInclusive(ptg, radius_rad, 4); // <= check it\n\n    // TODO try to replace tileslist with FITSList!!!\n    // const tileslist: Array<number> = [];\n    for (let p = 0; p < rangeset.r.length; p++) {\n      // if (!tileslist.includes(rangeset.r[p]) && rangeset.r[p] != 0) {\n      //     tileslist.push(rangeset.r[p]);\n      // }\n      if (\n        !tilesRaDecList2.getTilesList().includes(rangeset.r[p]) &&\n        rangeset.r[p] != 0\n      ) {\n        tilesRaDecList2.addTileNumber(rangeset.r[p]);\n        // tileslist.push(rangeset.r[p]);\n      }\n    }\n\n    const cpix = healpix.ang2pix(ptg);\n    // if (!tileslist.includes(cpix)) {\n    //     tileslist.push(cpix);\n    // }\n    if (!tilesRaDecList2.getTilesList().includes(cpix)) {\n      tilesRaDecList2.getTilesList().push(cpix);\n    }\n\n    // let raDecList: Array<[number, number]> = []\n    let minra = center.getAstro().raDeg - radiusDeg;\n    let maxra = center.getAstro().raDeg + radiusDeg;\n    let mindec = center.getAstro().decDeg - radiusDeg;\n    let maxdec = center.getAstro().decDeg + radiusDeg;\n\n    tilesRaDecList2.getTilesList().forEach((tileno: number) => {\n      // tileslist.forEach((tileno: number) => {\n\n      for (let j = 0; j < TILE_WIDTH; j++) {\n        for (let i = 0; i < TILE_WIDTH; i++) {\n          const point: Point | null = HiPSProjection.pix2world(\n            i,\n            j,\n            tileno,\n            healpix,\n            TILE_WIDTH,\n          );\n\n          if (point == null) continue;\n          if (\n            point.getAstro().raDeg < minra ||\n            point.getAstro().raDeg > maxra ||\n            point.getAstro().decDeg < mindec ||\n            point.getAstro().decDeg > maxdec\n          ) {\n            continue;\n          }\n          tilesRaDecList2.addImagePixel(\n            new ImagePixel(\n              point.getAstro().raDeg,\n              point.getAstro().decDeg,\n              tileno,\n            ),\n          );\n          // raDecList.push([point.getAstro().raDeg, point.getAstro().decDeg]);\n        }\n      }\n    });\n\n    // const tilesRaDecList = new TilesRaDecList(raDecList, tileslist)\n    // return tilesRaDecList\n    return tilesRaDecList2;\n  }\n\n  private static _xyGridCache: Map<string, HEALPixXYSpace> = new Map();\n\n  static pix2world(\n    i: number,\n    j: number,\n    tileno: number,\n    healpix: Healpix,\n    TILE_WIDTH: number,\n  ): Point | null {\n    const order = (healpix as any).order ?? Math.log2((healpix as any).nside); // keep compatibility with Healpix implementations exposing order or nside\n    const cacheKey = `${order}:${tileno}`;\n\n    let xyGridProj = HiPSProjection._xyGridCache.get(cacheKey);\n    if (!xyGridProj) {\n      xyGridProj = HiPSIntermediateProj.setupByTile(tileno, healpix);\n      const Dx = xyGridProj.max_x - xyGridProj.min_x;\n      const Dy = xyGridProj.max_y - xyGridProj.min_y;\n      console.log(\n        `deltaX: ${Dx}, deltaY ${Dy} order ${order} tileno ${tileno}`,\n      );\n      HiPSProjection._xyGridCache.set(cacheKey, xyGridProj);\n    }\n\n    if (!healpix) return null;\n    // const xyGridProj = HiPSIntermediateProj.setupByTile(tileno, healpix);\n    const [x, y] = HiPSIntermediateProj.pix2intermediate(\n      i,\n      j,\n      xyGridProj,\n      TILE_WIDTH,\n      TILE_WIDTH,\n    );\n    if (!Number.isFinite(x) || !Number.isFinite(y)) return null;\n    const p = HiPSIntermediateProj.intermediate2world(x, y);\n    const ra = p.getAstro().raDeg;\n    const dec = p.getAstro().decDeg;\n\n    if (!Number.isFinite(ra) || !Number.isFinite(dec)) return null;\n    return p;\n  }\n\n  // static getFITSFiles(inputValues: Uint8Array, tilesRaDecList: TilesRaDecList, fitsHeaderParams: FITSHeaderManager, pixelAngSize: number, TILE_WIDTH?: number): FITSList {\n  static getFITSFiles(\n    tilesRaDecList: TilesRaDecList2,\n    fitsHeaderParams: FITSHeaderManager,\n    pixelAngSize: number,\n    TILE_WIDTH: number,\n  ): FITSList {\n    const healpix = HiPSHelper.getHelpixBypxAngSize(pixelAngSize, TILE_WIDTH);\n\n    let fitsList = new FITSList();\n\n    tilesRaDecList.getTilesList().forEach((tileno: number) => {\n      let hipsProp = new HiPSProperties();\n      hipsProp.addItem(HiPSProperties.ORDER, healpix.order);\n      hipsProp.addItem(HiPSProperties.TILE_WIDTH, TILE_WIDTH);\n      const hipsFits = new HiPSFITS(null, tileno, hipsProp);\n\n      const imagePixelsByTilesNo = tilesRaDecList.getImagePixelsByTile(tileno);\n\n      hipsFits.initFromUint8Array(\n        imagePixelsByTilesNo,\n        fitsHeaderParams,\n        TILE_WIDTH,\n      );\n      fitsList.addFITS(hipsFits);\n    });\n    return fitsList;\n  }\n\n  static async world2pix(\n    radeclist: TilesRaDecList2,\n    hipsOrder: number,\n    isGalactic: boolean,\n    TILE_WIDTH: number,\n    baseHiPSURL: string,\n  ): Promise<TilesRaDecList2 | null> {\n    const healpix = HiPSHelper.getHelpixByOrder(hipsOrder);\n\n    let tileno: number;\n    let prevTileno: number | null = null;\n    /* if HiPS in galactic => convert the full list of (RA, Dec) to Galactic  (l, b) */\n    if (isGalactic) {\n      HiPSProjection.convertToGalactic(radeclist);\n    }\n    let xyGridProj: HEALPixXYSpace | null = null;\n\n    radeclist.getImagePixelList().forEach((imgpx) => {\n      const ra = imgpx.getRADeg();\n      const dec = imgpx.getDecDeg();\n\n      const p = new Point(CoordsType.ASTRO, NumberType.DEGREES, ra, dec);\n      const ptg = new Pointing(\n        null,\n        false,\n        p.getSpherical().thetaRad,\n        p.getSpherical().phiRad,\n      );\n\n      tileno = healpix.ang2pix(ptg);\n\n      if (prevTileno !== tileno || prevTileno == null) {\n        xyGridProj = HiPSIntermediateProj.setupByTile(tileno, healpix);\n        prevTileno = tileno;\n      }\n      if (xyGridProj) {\n        const xy = HiPSIntermediateProj.world2intermediate(p.getAstro());\n        const ij = HiPSIntermediateProj.intermediate2pix(\n          xy[0],\n          xy[1],\n          xyGridProj,\n          TILE_WIDTH,\n        );\n        imgpx.setij(ij[0], ij[1]);\n        imgpx.setTileNumber(tileno);\n      }\n      radeclist.addTileNumber(tileno);\n    });\n    let result = await HiPSProjection.getPixelValues(\n      radeclist,\n      baseHiPSURL,\n      hipsOrder,\n    );\n    return result;\n  }\n\n  // TODO move this to Utils.js\n  static convertToGalactic(radeclist: TilesRaDecList2) {\n    // let finalradeclist: number[][] = [];\n    const deg2rad = Math.PI / 180;\n    const rad2deg = 180 / Math.PI;\n    const l_NCP = deg2rad * 122.93;\n    const d_NGP = deg2rad * 27.1284;\n    const a_NGP = deg2rad * 192.8595;\n    radeclist.getImagePixelList().forEach((imgpx) => {\n      const ra = imgpx.getRADeg();\n      const dec = imgpx.getDecDeg();\n      const ra_rad = deg2rad * ra;\n      const dec_rad = deg2rad * dec;\n      // sin(b)\n      const sin_b =\n        Math.sin(d_NGP) * Math.sin(dec_rad) +\n        Math.cos(d_NGP) * Math.cos(dec_rad) * Math.cos(ra_rad - a_NGP);\n      const b = Math.asin(sin_b);\n      const b_deg = b * rad2deg;\n\n      // l_NCP - l\n      const lNCP_minus_l = Math.atan(\n        (Math.cos(dec_rad) * Math.sin(ra_rad - a_NGP)) /\n          (Math.sin(dec_rad) * Math.cos(d_NGP) -\n            Math.cos(dec_rad) * Math.sin(d_NGP) * Math.cos(ra_rad - a_NGP)),\n      );\n      const l = l_NCP - lNCP_minus_l;\n      const l_deg = l * rad2deg;\n      imgpx.setRADecDeg(l_deg, b_deg);\n      // finalradeclist.push([l_deg, b_deg])\n    });\n    // return finalradeclist;\n  }\n\n  static async getPixelValues(\n    raDecList: TilesRaDecList2,\n    baseHiPSURL: string,\n    hipsOrder: number,\n  ): Promise<TilesRaDecList2 | null> {\n    const tilesset = raDecList.getTilesList();\n\n    let resolvedBitpix: number | null = null;\n\n    for (const hipstileno of tilesset) {\n      const dir = Math.floor(hipstileno / 10000) * 10000;\n\n      const fitsurl =\n        baseHiPSURL +\n        \"/Norder\" +\n        hipsOrder +\n        \"/Dir\" +\n        dir +\n        \"/Npix\" +\n        hipstileno +\n        \".fits\";\n\n      console.log(`Identified source file ${fitsurl}`);\n\n      const fitsFile = await FITSParser.loadFITSFile(fitsurl);\n\n      const image = fitsFile?.primaryHDU;\n\n      if (!image) {\n        continue;\n      }\n\n      if (image.naxis !== 2) {\n        console.warn(\n          `Expected a 2D HiPS FITS tile, got NAXIS=${image.naxis} for ${fitsurl}`,\n        );\n\n        continue;\n      }\n\n      if (image.rawData === null) {\n        console.warn(`FITS tile ${fitsurl} does not contain image data`);\n\n        continue;\n      }\n\n      const bitpix = image.bitpix;\n\n      const naxis1 = image.shape[0] ?? 0;\n\n      const naxis2 = image.shape[1] ?? 0;\n\n      if (!Number.isFinite(bitpix) || naxis1 <= 0 || naxis2 <= 0) {\n        console.error(\n          `bitpix: ${bitpix}, naxis1: ${naxis1}, naxis2: ${naxis2} for fits file ${fitsurl}`,\n        );\n\n        continue;\n      }\n\n      if (resolvedBitpix === null) {\n        resolvedBitpix = bitpix;\n      }\n\n      /*\n       * Read FITS scaling information once.\n       */\n\n      if (raDecList.getBLANK() === null) {\n        const blankValue = image.header.findById(\"BLANK\")?.value;\n\n        if (blankValue !== undefined && blankValue !== null) {\n          const blank = Number(blankValue);\n\n          if (!Number.isNaN(blank)) {\n            raDecList.setBLANK(blank);\n          }\n        }\n      }\n\n      if (raDecList.getBSCALE() === null) {\n        const bscaleValue = image.header.findById(\"BSCALE\")?.value;\n\n        if (bscaleValue !== undefined && bscaleValue !== null) {\n          const bscale = Number(bscaleValue);\n\n          if (!Number.isNaN(bscale)) {\n            raDecList.setBSCALE(bscale);\n          }\n        }\n      }\n\n      if (raDecList.getBZERO() === null) {\n        const bzeroValue = image.header.findById(\"BZERO\")?.value;\n\n        if (bzeroValue !== undefined && bzeroValue !== null) {\n          const bzero = Number(bzeroValue);\n\n          if (!Number.isNaN(bzero)) {\n            raDecList.setBZERO(bzero);\n          }\n        }\n      }\n\n      const bytesPerElement = Math.abs(bitpix) / 8;\n\n      const tilePixels = raDecList.getImagePixelsByTile(hipstileno);\n\n      for (const imgpx of tilePixels) {\n        const row = imgpx.getj();\n\n        const column = imgpx.geti();\n\n        if (row < 0 || row >= naxis2) {\n          console.warn(\n            `j index ${row} is outside the image range 0-${naxis2 - 1} for fits file ${fitsurl}`,\n          );\n\n          continue;\n        }\n\n        if (column < 0 || column >= naxis1) {\n          console.warn(\n            `i index ${column} is outside the image range 0-${naxis1 - 1} for fits file ${fitsurl}`,\n          );\n\n          continue;\n        }\n\n        /*\n         * FITS image data is stored linearly.\n         *\n         * NAXIS1 is the fastest-changing axis.\n         */\n        const elementIndex = row * naxis1 + column;\n\n        const byteOffset = elementIndex * bytesPerElement;\n\n        const valueBytes = image.rawData.slice(\n          byteOffset,\n          byteOffset + bytesPerElement,\n        );\n\n        imgpx.setValue(valueBytes, bitpix);\n\n        raDecList.setMinMaxValue(imgpx.getValue());\n      }\n    }\n\n    /*\n     * FITS defaults.\n     */\n    if (raDecList.getBSCALE() === null) {\n      raDecList.setBSCALE(1);\n    }\n\n    if (raDecList.getBZERO() === null) {\n      raDecList.setBZERO(0);\n    }\n\n    if (raDecList.getBLANK() === null) {\n      raDecList.setBLANK(0);\n    }\n\n    /*\n     * Fill pixels that were not resolved\n     * from any HiPS tile with BLANK.\n     */\n    if (resolvedBitpix !== null) {\n      const bytesPerElement = Math.abs(resolvedBitpix) / 8;\n\n      const blankValue = raDecList.getBLANK() ?? 0;\n\n      const blankBytes = FITSUtils.convertBlankToBytes(\n        blankValue,\n        bytesPerElement,\n      );\n\n      for (const imgpx of raDecList.getImagePixelList()) {\n        if (imgpx.getUint8Value() === null) {\n          imgpx.setValue(blankBytes.slice(), resolvedBitpix);\n        }\n      }\n    }\n\n    return raDecList;\n  }\n}\n","import { FITS } from \"../../model/FITS.js\"\nimport { AbstractProjection } from \"../AbstractProjection.js\"\nimport { RADecMinMaxCentral } from \"../RADecMinMaxCentral.js\"\n\nexport class CutoutResult {\n    fits: FITS\n    fitsused: string[]\n    projection: AbstractProjection\n    raDecMinMaxCentral: RADecMinMaxCentral\n    pxsize: number\n\n\n    constructor(fits: FITS, fitsused: string[], projection: AbstractProjection, raDecMinMaxCentral: RADecMinMaxCentral, pxsize: number) {\n        this.fits = fits\n        this.fitsused = fitsused\n        this.projection = projection\n        this.raDecMinMaxCentral = raDecMinMaxCentral\n        this.pxsize = pxsize\n    }\n\n}","/**\n * Mercator projection (RA---MER / DEC--MER)\n *\n * Implements AbstractProjection with Mercator forward/inverse transforms.\n * Vertical coordinate is Mercator-projected Y in degrees.\n *\n * @author Fabrizio\n */\n\nimport {\n  FITSParser,\n  FITSHeaderManager,\n  FITSHeaderItem,\n  PrimaryHDU,\n} from \"jsfitsio\";\nimport { AbstractProjection } from \"../AbstractProjection.js\";\nimport { Point } from \"../../model/Point.js\";\nimport { CoordsType } from \"../../model/CoordsType.js\";\nimport { NumberType } from \"../../model/NumberType.js\";\nimport { TilesRaDecList2 } from \"../hips/TilesRaDecList2.js\";\nimport { ImagePixel } from \"../hips/ImagePixel.js\";\nimport { FITS } from \"../../model/FITS.js\";\nimport { APP_VERSION } from \"../../Version.js\";\nimport { FITSUtils } from \"../../utils/FITSUtils.js\";\n\nconst DEG2RAD = Math.PI / 180;\nconst RAD2DEG = 180 / Math.PI;\nconst MAX_MERC_LAT = 85.0;\n\n/** Forward Mercator: y(deg) from latitude φ(deg) */\nfunction mercatorYdegFromLatDeg(phiDeg: number): number {\n  const clamped = Math.max(-MAX_MERC_LAT, Math.min(MAX_MERC_LAT, phiDeg));\n  const phi = clamped * DEG2RAD;\n  const y = Math.log(Math.tan(Math.PI / 4 + phi / 2));\n  return y * RAD2DEG;\n}\n\n/** Inverse Mercator: latitude φ(deg) from y(deg) */\nfunction latDegFromMercatorYdeg(yDeg: number): number {\n  const y = yDeg * DEG2RAD;\n  const phi = 2 * Math.atan(Math.exp(y)) - Math.PI / 2;\n  const phiDeg = phi * RAD2DEG;\n  return Math.max(-MAX_MERC_LAT, Math.min(MAX_MERC_LAT, phiDeg));\n}\n\nexport class MercatorProjection extends AbstractProjection {\n  minra!: number;\n  mindec!: number; // actually stores minYdeg\n  naxis1!: number;\n  naxis2!: number;\n  bitpix!: number;\n\n  fitsheader: FITSHeaderManager;\n  pxvalues: Array<Uint8Array>;\n\n  CTYPE1 = \"'RA---MER'\";\n  CTYPE2 = \"'DEC--MER'\";\n  craDeg!: number;\n  cdecDeg!: number;\n  pxsize!: number;\n  _wcsname: string;\n\n  constructor() {\n    super();\n    this._wcsname = \"MER\";\n    this.pxvalues = [];\n    this.fitsheader = new FITSHeaderManager();\n  }\n\n  /** ----------------------------------------------------------------------\n   * Required implementations of AbstractProjection\n   * ---------------------------------------------------------------------- */\n\n  async initFromFile(infile: string): Promise<PrimaryHDU> {\n    const fitsFile = await FITSParser.loadFITSFile(infile);\n    const fits = fitsFile?.primaryHDU;\n\n    if (!fits) {\n      throw new Error(`Unable to load FITS file: ${infile}`);\n    }\n\n    if (fits.naxis !== 2) {\n      throw new Error(\n        `MercatorProjection requires a 2D FITS image, got NAXIS=${fits.naxis}`,\n      );\n    }\n\n    this.pxvalues = this.createRawRows(fits);\n    this.fitsheader = fits.header;\n    this.naxis1 = fits.shape[0] ?? 0;\n    this.naxis2 = fits.shape[1] ?? 0;\n    this.bitpix = fits.bitpix;\n    this.craDeg = Number(fits.header.findById(\"CRVAL1\")?.value);\n    this.cdecDeg = Number(fits.header.findById(\"CRVAL2\")?.value);\n    const pxsize1 = Number(fits.header.findById(\"CDELT1\")?.value);\n    const pxsize2 = Number(fits.header.findById(\"CDELT2\")?.value);\n\n    if (pxsize1 !== pxsize2 || Number.isNaN(pxsize1) || Number.isNaN(pxsize2)) {\n      throw new Error(\"Invalid or inconsistent CDELT1/CDELT2\");\n    }\n\n    this.pxsize = pxsize1;\n    this.minra = this.craDeg - (this.pxsize * this.naxis1) / 2;\n    if (this.minra < 0) {\n      this.minra += 360;\n    }\n\n    const centerY = mercatorYdegFromLatDeg(this.cdecDeg);\n\n    this.mindec = centerY - (this.pxsize * this.naxis2) / 2;\n\n    return fits;\n  }\n\n  getBytePerValue(): number {\n    return Math.abs(this.bitpix / 8);\n  }\n\n  getFITSHeader(): FITSHeaderManager {\n    return this.fitsheader;\n  }\n\n  getCommonFitsHeaderParams(): FITSHeaderManager {\n    const header = new FITSHeaderManager();\n    for (const item of this.fitsheader.getItems()) {\n      const key = item.key;\n      if ([\"SIMPLE\", \"BITPIX\", \"BSCALE\", \"BZERO\", \"BLANK\"].includes(key)) {\n        header.insert(new FITSHeaderItem(key, item.value, \"\"));\n      }\n    }\n    return header;\n  }\n\n  getImageRADecList(\n    center: Point,\n    radius: number,\n    pxsize: number,\n    naxisWidth: number,\n  ): TilesRaDecList2 {\n    const naxis1 = naxisWidth;\n    const naxis2 = naxisWidth;\n\n    let minra = center.getAstro().raDeg - radius;\n    if (minra < 0) minra += 360;\n\n    const cYdeg = mercatorYdegFromLatDeg(center.getAstro().decDeg);\n    const minYdeg = cYdeg - radius;\n\n    const tilesRaDecList = new TilesRaDecList2();\n\n    for (let j = 0; j < naxis2; j++) {\n      const yDeg = minYdeg + j * pxsize;\n      const dec = latDegFromMercatorYdeg(yDeg);\n      for (let i = 0; i < naxis1; i++) {\n        let ra = minra + i * pxsize;\n        if (ra >= 360) ra -= 360;\n        tilesRaDecList.addImagePixel(new ImagePixel(ra, dec, undefined));\n      }\n    }\n    return tilesRaDecList;\n  }\n\n  computeNaxisWidth(radius: number, pxsize: number): number {\n    return Math.ceil((2 * radius) / pxsize);\n  }\n\n  pix2world(\n    i: number,\n    j: number,\n    pxsize: number,\n    minra: number,\n    mindec: number,\n  ): Point {\n    const ra = i * pxsize + minra;\n    const yDeg = j * pxsize + mindec;\n    const dec = latDegFromMercatorYdeg(yDeg);\n    return new Point(CoordsType.ASTRO, NumberType.DEGREES, ra, dec);\n  }\n\n  world2pix(raDecList: TilesRaDecList2): TilesRaDecList2 {\n    const bytesXvalue = this.getBytePerValue();\n    const blank = Number(this.fitsheader.findById(\"BLANK\")?.value);\n    const blankBytes = FITSUtils.convertBlankToBytes(blank, bytesXvalue);\n\n    for (const imgPx of raDecList.getImagePixelList()) {\n      const ra = imgPx.getRADeg();\n      const dec = imgPx.getDecDeg();\n      const yDeg = mercatorYdegFromLatDeg(dec);\n\n      const i = Math.floor((ra - this.minra) / this.pxsize);\n      const j = Math.floor((yDeg - this.mindec) / this.pxsize);\n      imgPx.setij(i, j);\n\n      if (j < 0 || j >= this.naxis2 || i < 0 || i >= this.naxis1) {\n        imgPx.setValue(blankBytes, this.bitpix);\n      } else {\n        const currentValue = this.pxvalues[j].slice(\n          i * bytesXvalue,\n          (i + 1) * bytesXvalue,\n        );\n        imgPx.setValue(currentValue, this.bitpix);\n      }\n\n      raDecList.setMinMaxValue(imgPx.getValue());\n    }\n\n    return raDecList;\n  }\n\n  // And keep generateFITSFile(...) returning a FITS instance (not an object literal)\n  generateFITSFile(\n    pixelAngSize: number,\n    BITPIX: number,\n    TILE_WIDTH: number,\n    BLANK: number,\n    BZERO: number,\n    BSCALE: number,\n    cRA: number,\n    cDec: number,\n    minValue: number,\n    maxValue: number,\n    raDecWithValues: TilesRaDecList2,\n  ): FITS {\n    const header: FITSHeaderManager = this.prepareHeader(\n      pixelAngSize,\n      BITPIX,\n      TILE_WIDTH,\n      BLANK,\n      BZERO,\n      BSCALE,\n      cRA,\n      cDec,\n      minValue,\n      maxValue,\n    );\n    return this.setPixelValues(raDecWithValues, header);\n  }\n\n  /** ----------------------------------------------------------------------\n   * FITS header & data handling\n   * ---------------------------------------------------------------------- */\n\n  prepareHeader(\n    pixelAngSize: number,\n    BITPIX: number,\n    TILE_WIDTH: number,\n    BLANK: number,\n    BZERO: number,\n    BSCALE: number,\n    cRA: number,\n    cDec: number,\n    minValue: number,\n    maxValue: number,\n  ): FITSHeaderManager {\n    const fitsheader = new FITSHeaderManager();\n\n    fitsheader.insert(new FITSHeaderItem(\"SIMPLE\", \"T\", \"\"));\n    fitsheader.insert(new FITSHeaderItem(\"NAXIS\", 2, \"\"));\n    fitsheader.insert(new FITSHeaderItem(\"NAXIS1\", TILE_WIDTH, \"\"));\n    fitsheader.insert(new FITSHeaderItem(\"NAXIS2\", TILE_WIDTH, \"\"));\n    fitsheader.insert(new FITSHeaderItem(\"BITPIX\", BITPIX, \"\"));\n    fitsheader.insert(new FITSHeaderItem(\"BLANK\", BLANK, \"\"));\n    fitsheader.insert(new FITSHeaderItem(\"BSCALE\", BSCALE, \"\"));\n    fitsheader.insert(new FITSHeaderItem(\"BZERO\", BZERO, \"\"));\n    fitsheader.insert(new FITSHeaderItem(\"CTYPE1\", this.CTYPE1, \"\"));\n    fitsheader.insert(new FITSHeaderItem(\"CTYPE2\", this.CTYPE2, \"\"));\n    fitsheader.insert(new FITSHeaderItem(\"CDELT1\", pixelAngSize, \"\"));\n    fitsheader.insert(new FITSHeaderItem(\"CDELT2\", pixelAngSize, \"\"));\n    fitsheader.insert(new FITSHeaderItem(\"CRPIX1\", TILE_WIDTH / 2, \"\"));\n    fitsheader.insert(new FITSHeaderItem(\"CRPIX2\", TILE_WIDTH / 2, \"\"));\n    fitsheader.insert(new FITSHeaderItem(\"CRVAL1\", cRA, \"\"));\n    fitsheader.insert(new FITSHeaderItem(\"CRVAL2\", cDec, \"\"));\n    fitsheader.insert(\n      new FITSHeaderItem(\"DATAMIN\", BZERO + BSCALE * minValue, \"\"),\n    );\n    fitsheader.insert(\n      new FITSHeaderItem(\"DATAMAX\", BZERO + BSCALE * maxValue, \"\"),\n    );\n    fitsheader.insert(\n      new FITSHeaderItem(\"ORIGIN\", `WCSLight v.${APP_VERSION}`, \"\"),\n    );\n    fitsheader.insert(\n      new FITSHeaderItem(\n        \"COMMENT\",\n        \"WCSLight developed by F.Giordano and Y.Ascasibar\",\n        \"\",\n      ),\n    );\n    fitsheader.insert(new FITSHeaderItem(\"END\", \"\", \"\"));\n    return fitsheader;\n  }\n\n  setPixelValues(raDecList: TilesRaDecList2, header: FITSHeaderManager): FITS {\n    const BITPIX = Number(header.findById(\"BITPIX\")?.value);\n    if (!Number.isFinite(BITPIX))\n      throw new Error(\"BITPIX not found or invalid in header\");\n    const bytesPerElem = Math.abs(BITPIX) / 8;\n\n    const width = Number(header.findById(\"NAXIS1\")?.value);\n    const height = Number(header.findById(\"NAXIS2\")?.value);\n    if (!Number.isFinite(width) || width <= 0)\n      throw new Error(\"NAXIS1 not found or invalid\");\n    if (!Number.isFinite(height) || height <= 0)\n      throw new Error(\"NAXIS2 not found or invalid\");\n\n    const BLANK = Number(header.findById(\"BLANK\")?.value);\n    const blankBytes = FITSUtils.convertBlankToBytes(BLANK, bytesPerElem);\n\n    const pixels = raDecList.getImagePixelList();\n    if (pixels.length !== width * height) {\n      throw new Error(\n        `Pixel count mismatch: got ${pixels.length}, expected ${width * height}`,\n      );\n    }\n\n    // Build Map<rowIndex, Array<Uint8Array>> where each inner array contains per-pixel byte arrays\n    const rowsMap = new Map<number, Array<Uint8Array>>();\n    for (let j = 0; j < height; j++) {\n      rowsMap.set(j, new Array<Uint8Array>(width));\n    }\n\n    for (let k = 0; k < pixels.length; k++) {\n      const row = Math.floor(k / width);\n      const col = k % width;\n      const u8 = pixels[k].getUint8Value();\n\n      // Ensure each cell gets its own buffer (avoid sharing the same BLANK buffer)\n      rowsMap.get(row)![col] = u8 ? u8 : new Uint8Array(blankBytes);\n    }\n\n    // Return your FITS class instance\n    return new FITS(header, rowsMap);\n  }\n\n  private createRawRows(fits: PrimaryHDU): Array<Uint8Array> {\n    if (fits.rawData === null) {\n      return [];\n    }\n\n    const naxis1 = fits.shape[0] ?? 0;\n    const naxis2 = fits.shape[1] ?? 0;\n    const bytesPerElement = Math.abs(fits.bitpix) / 8;\n    const rowByteLength = naxis1 * bytesPerElement;\n    const rows = new Array<Uint8Array>(naxis2);\n\n    for (let row = 0; row < naxis2; row++) {\n      const start = row * rowByteLength;\n\n      rows[row] = fits.rawData.subarray(start, start + rowByteLength);\n    }\n\n    return rows;\n  }\n}\n","/**\n * SIN (Slant/Orthographic) projection for FITS WCS ('SIN')\n * CTYPE1='RA---SIN', CTYPE2='DEC--SIN'\n *\n * Piano in \"gradi proiettivi\": convertiamo (x_rad,y_rad) -> (x_deg,y_deg) con RAD2DEG\n * così che CDELT resti in deg/pixel come nelle altre proiezioni.\n */\n\nimport {\n  FITSParser,\n  FITSHeaderManager,\n  FITSHeaderItem,\n  PrimaryHDU,\n} from \"jsfitsio\";\nimport { AbstractProjection } from \"../AbstractProjection.js\";\nimport { Point } from \"../../model/Point.js\";\nimport { CoordsType } from \"../../model/CoordsType.js\";\nimport { NumberType } from \"../../model/NumberType.js\";\nimport { TilesRaDecList2 } from \"../hips/TilesRaDecList2.js\";\nimport { ImagePixel } from \"../hips/ImagePixel.js\";\nimport { FITS } from \"../../model/FITS.js\";\nimport { APP_VERSION } from \"../../Version.js\";\nimport { FITSUtils } from \"../../utils/FITSUtils.js\";\n\nconst DEG2RAD = Math.PI / 180;\nconst RAD2DEG = 180 / Math.PI;\nconst EPS = 1e-12;\n\nfunction clamp(x: number, a: number, b: number): number {\n  return Math.max(a, Math.min(b, x));\n}\nfunction normalize2pi(a: number): number {\n  a %= 2 * Math.PI;\n  return a < 0 ? a + 2 * Math.PI : a;\n}\nfunction normalizePi(a: number): number {\n  a = (a + Math.PI) % (2 * Math.PI);\n  return a < 0 ? a + 2 * Math.PI - Math.PI : a - Math.PI;\n}\n\n// —————————————————————————————————————————————————————————————\n// SIN (orthographic) forward/inverse su sfera unitaria (in radianti)\n// Forward: x = cosφ * sinΔλ;  y = cosφ0 * sinφ - sinφ0 * cosφ * cosΔλ\nfunction sinForward(\n  lam: number,\n  phi: number,\n  phi0: number,\n): { x: number; y: number; visible: boolean } {\n  const cφ = Math.cos(phi),\n    sφ = Math.sin(phi);\n  const sφ0 = Math.sin(phi0),\n    cφ0 = Math.cos(phi0);\n  const sΔ = Math.sin(lam),\n    cΔ = Math.cos(lam);\n  const x = cφ * sΔ;\n  const y = cφ0 * sφ - sφ0 * cφ * cΔ;\n  // visibile se fronte emisfero: sinφ0 sinφ + cosφ0 cosφ cosΔλ >= 0\n  const cos_c = sφ0 * sφ + cφ0 * cφ * cΔ;\n  return { x, y, visible: cos_c >= -1e-14 }; // tolleranza numerica\n}\n\n// Inverse (azimuthal family con ρ = sin c -> c = asin ρ)\nfunction sinInverse(\n  x: number,\n  y: number,\n  phi0: number,\n): { lam: number; phi: number } | null {\n  const ρ = Math.sqrt(x * x + y * y);\n  if (ρ > 1 + 1e-12) return null; // fuori dal disco\n  const c = Math.asin(Math.min(1, ρ));\n  if (ρ < EPS) {\n    // centro proiezione\n    return { lam: 0, phi: phi0 };\n  }\n  const sc = Math.sin(c),\n    cc = Math.cos(c);\n  const sφ0 = Math.sin(phi0),\n    cφ0 = Math.cos(phi0);\n\n  const phi = Math.asin(clamp(cc * sφ0 + (y * sc * cφ0) / ρ, -1, 1));\n  const lam = Math.atan2(x * sc, ρ * cφ0 * cc - y * sφ0 * sc);\n  if (!Number.isFinite(lam) || !Number.isFinite(phi)) return null;\n  return { lam, phi };\n}\n\n// Conversioni piano <-> radianti (unità piano in gradi)\nfunction planeDegToRad(xdeg: number, ydeg: number): { xr: number; yr: number } {\n  return { xr: xdeg * DEG2RAD, yr: ydeg * DEG2RAD };\n}\nfunction planeRadToDeg(xr: number, yr: number): { xd: number; yd: number } {\n  return { xd: xr * RAD2DEG, yd: yr * RAD2DEG };\n}\n\n// —————————————————————————————————————————————————————————————\n\nexport class SinProjection extends AbstractProjection {\n  // minra/mindec = minXdeg/minYdeg del piano\n  minra!: number;\n  mindec!: number;\n  naxis1!: number;\n  naxis2!: number;\n  bitpix!: number;\n\n  fitsheader: FITSHeaderManager;\n  pxvalues: Array<Uint8Array>;\n\n  CTYPE1 = \"'RA---SIN'\";\n  CTYPE2 = \"'DEC--SIN'\";\n  craDeg!: number; // CRVAL1\n  cdecDeg!: number; // CRVAL2\n  pxsize!: number; // CDELT (deg/pixel)\n  _wcsname: string;\n\n  constructor() {\n    super();\n    this._wcsname = \"SIN\";\n    this.pxvalues = [];\n    this.fitsheader = new FITSHeaderManager();\n  }\n\n  async initFromFile(infile: string): Promise<PrimaryHDU> {\n    const fitsFile = await FITSParser.loadFITSFile(infile);\n\n    const fits = fitsFile?.primaryHDU;\n\n    if (!fits) {\n      throw new Error(`Unable to load FITS file: ${infile}`);\n    }\n\n    if (fits.naxis !== 2) {\n      throw new Error(\n        `SinProjection requires a 2D FITS image, got NAXIS=${fits.naxis}`,\n      );\n    }\n\n    this.pxvalues = this.createRawRows(fits);\n    this.fitsheader = fits.header;\n    this.naxis1 = fits.shape[0] ?? 0;\n    this.naxis2 = fits.shape[1] ?? 0;\n    this.bitpix = fits.bitpix;\n    this.craDeg = Number(fits.header.findById(\"CRVAL1\")?.value);\n    this.cdecDeg = Number(fits.header.findById(\"CRVAL2\")?.value);\n    const pxsize1 = Number(fits.header.findById(\"CDELT1\")?.value);\n    const pxsize2 = Number(fits.header.findById(\"CDELT2\")?.value);\n\n    if (pxsize1 !== pxsize2 || Number.isNaN(pxsize1) || Number.isNaN(pxsize2)) {\n      throw new Error(\"Invalid or inconsistent CDELT1/CDELT2\");\n    }\n\n    this.pxsize = pxsize1;\n\n    this.minra = -(this.pxsize * this.naxis1) / 2;\n\n    this.mindec = -(this.pxsize * this.naxis2) / 2;\n\n    return fits;\n  }\n\n  getBytePerValue(): number {\n    return Math.abs(this.bitpix / 8);\n  }\n\n  // ——— AbstractProjection: header accessors ———\n  getFITSHeader(): FITSHeaderManager {\n    return this.fitsheader;\n  }\n\n  getCommonFitsHeaderParams(): FITSHeaderManager {\n    const header = new FITSHeaderManager();\n    for (const item of this.fitsheader.getItems()) {\n      const key = item.key;\n      if (\n        [\"SIMPLE\", \"BITPIX\", \"BSCALE\", \"BZERO\", \"BLANK\", \"ORDER\"].includes(key)\n      ) {\n        header.insert(new FITSHeaderItem(key, item.value, \"\"));\n      }\n    }\n    return header;\n  }\n\n  // ——— AbstractProjection: grid builder ———\n  getImageRADecList(\n    center: Point,\n    radius: number,\n    pxsize: number,\n    naxisWidth: number,\n  ): TilesRaDecList2 {\n    const naxis1 = naxisWidth;\n    const naxis2 = naxisWidth;\n\n    const ra0 = center.getAstro().raDeg * DEG2RAD;\n    const dec0 = center.getAstro().decDeg * DEG2RAD;\n\n    const minXdeg = -radius;\n    const minYdeg = -radius;\n\n    const list = new TilesRaDecList2();\n\n    for (let j = 0; j < naxis2; j++) {\n      const yDeg = minYdeg + j * pxsize;\n      const { yr } = planeDegToRad(0, yDeg);\n      for (let i = 0; i < naxis1; i++) {\n        const xDeg = minXdeg + i * pxsize;\n        const { xr } = planeDegToRad(xDeg, 0);\n\n        const inv = sinInverse(xr, yr, dec0);\n\n        if (!inv) {\n          list.addImagePixel(new ImagePixel(Number.NaN, Number.NaN, undefined));\n          continue;\n        }\n\n        /*\n         * sinInverse() already applies the projection\n         * center declination dec0.\n         *\n         * inv.lam is the longitude offset from ra0,\n         * while inv.phi is the absolute declination.\n         */\n        const ra = normalize2pi(ra0 + inv.lam);\n        const dec = inv.phi;\n        list.addImagePixel(\n          new ImagePixel(ra * RAD2DEG, dec * RAD2DEG, undefined),\n        );\n      }\n    }\n    return list;\n  }\n\n  computeNaxisWidth(radius: number, pxsize: number): number {\n    return Math.ceil((2 * radius) / pxsize);\n  }\n\n  // ——— AbstractProjection: pixel <-> world ———\n  pix2world(\n    i: number,\n    j: number,\n    pxsize: number,\n    minPlaneXdeg: number,\n    minPlaneYdeg: number,\n  ): Point {\n    const xDeg = i * pxsize + minPlaneXdeg;\n    const yDeg = j * pxsize + minPlaneYdeg;\n    const { xr, yr } = planeDegToRad(xDeg, yDeg);\n\n    const ra0 = this.craDeg * DEG2RAD;\n    const dec0 = this.cdecDeg * DEG2RAD;\n\n    const inv = sinInverse(xr, yr, dec0);\n\n    if (!inv) {\n      return new Point(\n        CoordsType.ASTRO,\n        NumberType.DEGREES,\n        Number.NaN,\n        Number.NaN,\n      );\n    }\n\n    const ra = normalize2pi(ra0 + inv.lam);\n\n    const dec = inv.phi;\n\n    return new Point(\n      CoordsType.ASTRO,\n      NumberType.DEGREES,\n      ra * RAD2DEG,\n      dec * RAD2DEG,\n    );\n  }\n\n  world2pix(raDecList: TilesRaDecList2): TilesRaDecList2 {\n    const bytesXvalue = this.getBytePerValue();\n    const blank = Number(this.fitsheader.findById(\"BLANK\")?.value);\n    const blankBytes = FITSUtils.convertBlankToBytes(blank, bytesXvalue);\n\n    const ra0 = this.craDeg * DEG2RAD;\n    const dec0 = this.cdecDeg * DEG2RAD;\n\n    for (const px of raDecList.getImagePixelList()) {\n      const raDeg = px.getRADeg();\n      const decDeg = px.getDecDeg();\n      if (!Number.isFinite(raDeg) || !Number.isFinite(decDeg)) {\n        px.setij(-1, -1);\n        px.setValue(blankBytes, this.bitpix);\n        continue;\n      }\n\n      const ra = raDeg * DEG2RAD;\n      const dec = decDeg * DEG2RAD;\n      const deltaRa = normalizePi(ra - ra0);\n      const fwd = sinForward(deltaRa, dec, dec0);\n      const { xd, yd } = planeRadToDeg(fwd.x, fwd.y);\n      const i = Math.floor((xd - this.minra) / this.pxsize);\n      const j = Math.floor((yd - this.mindec) / this.pxsize);\n\n      px.setij(i, j);\n\n      if (j < 0 || j >= this.naxis2 || i < 0 || i >= this.naxis1) {\n        px.setValue(blankBytes, this.bitpix);\n      } else {\n        const row = this.pxvalues[j];\n        const slice = row.slice(i * bytesXvalue, (i + 1) * bytesXvalue);\n        px.setValue(slice, this.bitpix);\n      }\n      raDecList.setMinMaxValue(px.getValue());\n    }\n    return raDecList;\n  }\n\n  // ——— FITS writer ———\n  generateFITSFile(\n    pixelAngSize: number,\n    BITPIX: number,\n    TILE_WIDTH: number,\n    BLANK: number,\n    BZERO: number,\n    BSCALE: number,\n    cRA: number,\n    cDec: number,\n    minValue: number,\n    maxValue: number,\n    raDecWithValues: TilesRaDecList2,\n  ): FITS {\n    const header = this.prepareHeader(\n      pixelAngSize,\n      BITPIX,\n      TILE_WIDTH,\n      BLANK,\n      BZERO,\n      BSCALE,\n      cRA,\n      cDec,\n      minValue,\n      maxValue,\n    );\n    return this.setPixelValues(raDecWithValues, header);\n  }\n\n  prepareHeader(\n    pixelAngSize: number,\n    BITPIX: number,\n    TILE_WIDTH: number,\n    BLANK: number,\n    BZERO: number,\n    BSCALE: number,\n    cRA: number,\n    cDec: number,\n    minValue: number,\n    maxValue: number,\n  ): FITSHeaderManager {\n    const h = new FITSHeaderManager();\n    h.insert(new FITSHeaderItem(\"SIMPLE\", \"T\", \"\"));\n    h.insert(new FITSHeaderItem(\"NAXIS\", 2, \"\"));\n    h.insert(new FITSHeaderItem(\"NAXIS1\", TILE_WIDTH, \"\"));\n    h.insert(new FITSHeaderItem(\"NAXIS2\", TILE_WIDTH, \"\"));\n    h.insert(new FITSHeaderItem(\"BITPIX\", BITPIX, \"\"));\n    h.insert(new FITSHeaderItem(\"BLANK\", BLANK, \"\"));\n    h.insert(new FITSHeaderItem(\"BSCALE\", BSCALE, \"\"));\n    h.insert(new FITSHeaderItem(\"BZERO\", BZERO, \"\"));\n    h.insert(new FITSHeaderItem(\"CTYPE1\", this.CTYPE1, \"\"));\n    h.insert(new FITSHeaderItem(\"CTYPE2\", this.CTYPE2, \"\"));\n    h.insert(new FITSHeaderItem(\"CDELT1\", pixelAngSize, \"\"));\n    h.insert(new FITSHeaderItem(\"CDELT2\", pixelAngSize, \"\"));\n    h.insert(new FITSHeaderItem(\"CRPIX1\", TILE_WIDTH / 2, \"\"));\n    h.insert(new FITSHeaderItem(\"CRPIX2\", TILE_WIDTH / 2, \"\"));\n    h.insert(new FITSHeaderItem(\"CRVAL1\", cRA, \"\"));\n    h.insert(new FITSHeaderItem(\"CRVAL2\", cDec, \"\"));\n    h.insert(new FITSHeaderItem(\"DATAMIN\", BZERO + BSCALE * minValue, \"\"));\n    h.insert(new FITSHeaderItem(\"DATAMAX\", BZERO + BSCALE * maxValue, \"\"));\n    h.insert(new FITSHeaderItem(\"ORIGIN\", `WCSLight v.${APP_VERSION}`, \"\"));\n    h.insert(\n      new FITSHeaderItem(\n        \"COMMENT\",\n        \"WCSLight developed by F.Giordano and Y.Ascasibar\",\n        \"\",\n      ),\n    );\n    h.insert(new FITSHeaderItem(\"END\", \"\", \"\"));\n    return h;\n  }\n\n  setPixelValues(raDecList: TilesRaDecList2, header: FITSHeaderManager): FITS {\n    const BITPIX = Number(header.findById(\"BITPIX\")?.value);\n    if (!Number.isFinite(BITPIX))\n      throw new Error(\"BITPIX not found or invalid\");\n    const bytesPerElem = Math.abs(BITPIX) / 8;\n\n    const width = Number(header.findById(\"NAXIS1\")?.value);\n    const height = Number(header.findById(\"NAXIS2\")?.value);\n    if (!Number.isFinite(width) || width <= 0)\n      throw new Error(\"NAXIS1 not found or invalid\");\n    if (!Number.isFinite(height) || height <= 0)\n      throw new Error(\"NAXIS2 not found or invalid\");\n\n    const BLANK = Number(header.findById(\"BLANK\")?.value);\n    const blankBytes = FITSUtils.convertBlankToBytes(BLANK, bytesPerElem);\n\n    const pixels = raDecList.getImagePixelList();\n    if (pixels.length !== width * height) {\n      throw new Error(\n        `Pixel count mismatch: got ${pixels.length}, expected ${width * height}`,\n      );\n    }\n\n    const rows = new Map<number, Array<Uint8Array>>();\n    for (let j = 0; j < height; j++) rows.set(j, new Array<Uint8Array>(width));\n\n    for (let k = 0; k < pixels.length; k++) {\n      const row = Math.floor(k / width);\n      const col = k % width;\n      const u8 = pixels[k].getUint8Value();\n      rows.get(row)![col] = u8 ? u8 : new Uint8Array(blankBytes);\n    }\n\n    return new FITS(header, rows);\n  }\n\n  private createRawRows(fits: PrimaryHDU): Array<Uint8Array> {\n    if (fits.rawData === null) {\n      return [];\n    }\n\n    const naxis1 = fits.shape[0] ?? 0;\n    const naxis2 = fits.shape[1] ?? 0;\n    const bytesPerElement = Math.abs(fits.bitpix) / 8;\n    const rowByteLength = naxis1 * bytesPerElement;\n    const rows = new Array<Uint8Array>(naxis2);\n\n    for (let row = 0; row < naxis2; row++) {\n      const start = row * rowByteLength;\n\n      rows[row] = fits.rawData.subarray(start, start + rowByteLength);\n    }\n\n    return rows;\n  }\n}\n","/**\n * Aitoff (Hammer–Aitoff) projection for FITS WCS ('AIT')\n * CTYPE1='RA---AIT', CTYPE2='DEC--AIT'\n *\n * The pixel plane is in \"projected degrees\": we convert between\n * (RA,Dec) <-> (x_deg,y_deg) where x_deg,y_deg are the Hammer–Aitoff\n * projected coordinates scaled to degrees so that CDELT remains deg/pixel.\n */\n\nimport {\n  FITSParser,\n  FITSHeaderManager,\n  FITSHeaderItem,\n  PrimaryHDU,\n} from \"jsfitsio\";\nimport { AbstractProjection } from \"../AbstractProjection.js\";\nimport { Point } from \"../../model/Point.js\";\nimport { CoordsType } from \"../../model/CoordsType.js\";\nimport { NumberType } from \"../../model/NumberType.js\";\nimport { TilesRaDecList2 } from \"../hips/TilesRaDecList2.js\";\nimport { ImagePixel } from \"../hips/ImagePixel.js\";\nimport { FITS } from \"../../model/FITS.js\";\nimport { APP_VERSION } from \"../../Version.js\";\nimport { FITSUtils } from \"../../utils/FITSUtils.js\";\n\nconst DEG2RAD = Math.PI / 180;\nconst RAD2DEG = 180 / Math.PI;\n\n// ───────────────────────────────────────────────────────────────────────────────\n// Spherical helpers (all angles in *radians* here)\n// Center-relative long/lat (λ', φ') from absolute (α, δ) and center (α0, δ0)\nfunction toCenteredLonLat(\n  ra: number,\n  dec: number,\n  ra0: number,\n  dec0: number,\n): { lam: number; phi: number } {\n  const cosDec = Math.cos(dec);\n\n  const x = cosDec * Math.cos(ra);\n  const y = cosDec * Math.sin(ra);\n  const z = Math.sin(dec);\n\n  /*\n   * Local orthonormal basis at (ra0, dec0):\n   *\n   * center = local +X\n   * east   = local +Y\n   * north  = local +Z\n   */\n  const cx = Math.cos(dec0) * Math.cos(ra0);\n  const cy = Math.cos(dec0) * Math.sin(ra0);\n  const cz = Math.sin(dec0);\n\n  const ex = -Math.sin(ra0);\n  const ey = Math.cos(ra0);\n  const ez = 0;\n\n  const nx = -Math.sin(dec0) * Math.cos(ra0);\n  const ny = -Math.sin(dec0) * Math.sin(ra0);\n  const nz = Math.cos(dec0);\n\n  const localX = x * cx + y * cy + z * cz;\n\n  const localY = x * ex + y * ey + z * ez;\n\n  const localZ = x * nx + y * ny + z * nz;\n\n  const lam = Math.atan2(localY, localX);\n\n  const phi = Math.asin(clamp(localZ, -1, 1));\n\n  return {\n    lam,\n    phi,\n  };\n}\n\nfunction fromCenteredLonLat(\n  lam: number,\n  phi: number,\n  ra0: number,\n  dec0: number,\n): { ra: number; dec: number } {\n  const cosPhi = Math.cos(phi);\n\n  const localX = cosPhi * Math.cos(lam);\n\n  const localY = cosPhi * Math.sin(lam);\n\n  const localZ = Math.sin(phi);\n\n  const cx = Math.cos(dec0) * Math.cos(ra0);\n  const cy = Math.cos(dec0) * Math.sin(ra0);\n  const cz = Math.sin(dec0);\n\n  const ex = -Math.sin(ra0);\n  const ey = Math.cos(ra0);\n  const ez = 0;\n\n  const nx = -Math.sin(dec0) * Math.cos(ra0);\n  const ny = -Math.sin(dec0) * Math.sin(ra0);\n  const nz = Math.cos(dec0);\n\n  const x = localX * cx + localY * ex + localZ * nx;\n\n  const y = localX * cy + localY * ey + localZ * ny;\n\n  const z = localX * cz + localY * ez + localZ * nz;\n\n  const ra = normalize2pi(Math.atan2(y, x));\n\n  const dec = Math.asin(clamp(z, -1, 1));\n\n  return {\n    ra,\n    dec,\n  };\n}\n\nfunction clamp(x: number, a: number, b: number): number {\n  return Math.max(a, Math.min(b, x));\n}\nfunction normalize2pi(a: number): number {\n  a %= 2 * Math.PI;\n  return a < 0 ? a + 2 * Math.PI : a;\n}\nfunction normalizePi(a: number): number {\n  a = (a + Math.PI) % (2 * Math.PI);\n  return a < 0 ? a + 2 * Math.PI - Math.PI : a - Math.PI;\n}\n\n// ───────────────────────────────────────────────────────────────────────────────\n// Hammer–Aitoff forward/inverse (λ', φ') <-> (x, y)\n// Uses the canonical √2 scaling. x,y returned in *radians-of-radius*.\nfunction aitForward(lam: number, phi: number): { x: number; y: number } {\n  // D = sqrt(1 + cosφ cos(λ/2))\n  const cφ = Math.cos(phi),\n    sφ = Math.sin(phi);\n  const half = lam / 2;\n  const D = Math.sqrt(1 + cφ * Math.cos(half));\n  if (D === 0) return { x: 0, y: 0 };\n  const x = (2 * Math.SQRT2 * cφ * Math.sin(half)) / D;\n  const y = (Math.SQRT2 * sφ) / D;\n  return { x, y };\n}\n\nfunction aitInverse(x: number, y: number): { lam: number; phi: number } | null {\n  /*\n   * FITS WCS Hammer-Aitoff inverse.\n   *\n   * x and y are the projected plane coordinates\n   * expressed in radians.\n   */\n  const zSquared = 1 - (x * x) / 16 - (y * y) / 4;\n\n  /*\n   * Outside the Hammer-Aitoff ellipse.\n   */\n  if (zSquared < -1e-14) {\n    return null;\n  }\n\n  const z = Math.sqrt(Math.max(0, zSquared));\n\n  const lam = 2 * Math.atan2((z * x) / 2, 2 * z * z - 1);\n\n  const phi = Math.asin(clamp(y * z, -1, 1));\n\n  if (!Number.isFinite(lam) || !Number.isFinite(phi)) {\n    return null;\n  }\n\n  return {\n    lam,\n    phi,\n  };\n}\n\n// Convert AIT plane (x_deg,y_deg) <-> radians for the math above\nfunction planeDegToRad(xdeg: number, ydeg: number): { xr: number; yr: number } {\n  return { xr: xdeg * DEG2RAD, yr: ydeg * DEG2RAD };\n}\nfunction planeRadToDeg(xr: number, yr: number): { xd: number; yd: number } {\n  return { xd: xr * RAD2DEG, yd: yr * RAD2DEG };\n}\n\n// ───────────────────────────────────────────────────────────────────────────────\n\nexport class AitoffProjection extends AbstractProjection {\n  // Note: minra/mindec store minXdeg/minYdeg of the projected plane\n  minra!: number;\n  mindec!: number;\n  naxis1!: number;\n  naxis2!: number;\n  bitpix!: number;\n\n  fitsheader: FITSHeaderManager;\n  pxvalues: Array<Uint8Array>;\n\n  CTYPE1 = \"'RA---AIT'\";\n  CTYPE2 = \"'DEC--AIT'\";\n  craDeg!: number; // CRVAL1 center RA (deg)\n  cdecDeg!: number; // CRVAL2 center Dec (deg)\n  pxsize!: number; // CDELT (deg/pixel)\n  _wcsname: string;\n\n  constructor() {\n    super();\n    this._wcsname = \"AIT\";\n    this.pxvalues = [];\n    this.fitsheader = new FITSHeaderManager();\n  }\n\n  async initFromFile(infile: string): Promise<PrimaryHDU> {\n    const fitsFile = await FITSParser.loadFITSFile(infile);\n    const fits = fitsFile?.primaryHDU;\n\n    if (!fits) {\n      throw new Error(`Unable to load FITS file: ${infile}`);\n    }\n\n    if (fits.naxis !== 2) {\n      throw new Error(\n        `AitoffProjection requires a 2D FITS image, got NAXIS=${fits.naxis}`,\n      );\n    }\n\n    this.pxvalues = this.createRawRows(fits);\n    this.fitsheader = fits.header;\n    this.naxis1 = fits.shape[0] ?? 0;\n    this.naxis2 = fits.shape[1] ?? 0;\n    this.bitpix = fits.bitpix;\n    this.craDeg = Number(fits.header.findById(\"CRVAL1\")?.value);\n    this.cdecDeg = Number(fits.header.findById(\"CRVAL2\")?.value);\n\n    const pxsize1 = Number(fits.header.findById(\"CDELT1\")?.value);\n    const pxsize2 = Number(fits.header.findById(\"CDELT2\")?.value);\n\n    if (pxsize1 !== pxsize2 || Number.isNaN(pxsize1) || Number.isNaN(pxsize2)) {\n      throw new Error(\"Invalid or inconsistent CDELT1/CDELT2\");\n    }\n    this.pxsize = pxsize1;\n\n    /*\n     * In AIT the projection center maps to\n     * plane coordinates (0, 0).\n     *\n     * Therefore the minimum projected plane\n     * coordinates are half the image extent\n     * around the center.\n     */\n    this.minra = -(this.pxsize * this.naxis1) / 2;\n\n    this.mindec = -(this.pxsize * this.naxis2) / 2;\n    return fits;\n  }\n\n  getBytePerValue(): number {\n    return Math.abs(this.bitpix / 8);\n  }\n\n  private createRawRows(fits: PrimaryHDU): Array<Uint8Array> {\n    if (fits.rawData === null) {\n      return [];\n    }\n\n    const naxis1 = fits.shape[0] ?? 0;\n    const naxis2 = fits.shape[1] ?? 0;\n    const bytesPerElement = Math.abs(fits.bitpix) / 8;\n    const rowByteLength = naxis1 * bytesPerElement;\n    const rows = new Array<Uint8Array>(naxis2);\n\n    for (let row = 0; row < naxis2; row++) {\n      const start = row * rowByteLength;\n\n      rows[row] = fits.rawData.subarray(start, start + rowByteLength);\n    }\n\n    return rows;\n  }\n\n  // ── AbstractProjection: WCS header accessors ───────────────────────────────\n  getFITSHeader(): FITSHeaderManager {\n    return this.fitsheader;\n  }\n\n  getCommonFitsHeaderParams(): FITSHeaderManager {\n    const header = new FITSHeaderManager();\n    for (const item of this.fitsheader.getItems()) {\n      const key = item.key;\n      if (\n        [\"SIMPLE\", \"BITPIX\", \"BSCALE\", \"BZERO\", \"BLANK\", \"ORDER\"].includes(key)\n      ) {\n        header.insert(new FITSHeaderItem(key, item.value, \"\"));\n      }\n    }\n    return header;\n  }\n\n  // ── AbstractProjection: grid builder ───────────────────────────────────────\n  getImageRADecList(\n    center: Point,\n    radius: number,\n    pxsize: number,\n    naxisWidth: number,\n  ): TilesRaDecList2 {\n    const naxis1 = naxisWidth;\n    const naxis2 = naxisWidth;\n\n    const ra0 = center.getAstro().raDeg * DEG2RAD;\n    const dec0 = center.getAstro().decDeg * DEG2RAD;\n\n    const minXdeg = -radius;\n    const minYdeg = -radius;\n\n    const list = new TilesRaDecList2();\n\n    for (let j = 0; j < naxis2; j++) {\n      const yDeg = minYdeg + j * pxsize;\n      const { yr } = planeDegToRad(0, yDeg);\n      for (let i = 0; i < naxis1; i++) {\n        const xDeg = minXdeg + i * pxsize;\n        const { xr } = planeDegToRad(xDeg, 0);\n\n        const inv = aitInverse(xr, yr);\n        if (!inv) {\n          // Outside valid ellipse; set BLANK later during sampling\n          list.addImagePixel(new ImagePixel(Number.NaN, Number.NaN, undefined));\n          continue;\n        }\n        const { lam, phi } = inv; // centered lon/lat\n        const { ra, dec } = fromCenteredLonLat(lam, phi, ra0, dec0);\n        const raDeg = ra * RAD2DEG;\n        const decDeg = dec * RAD2DEG;\n        list.addImagePixel(new ImagePixel(raDeg, decDeg, undefined));\n      }\n    }\n    return list;\n  }\n\n  computeNaxisWidth(radius: number, pxsize: number): number {\n    return Math.ceil((2 * radius) / pxsize);\n  }\n\n  // ── AbstractProjection: pixel<->world ──────────────────────────────────────\n  pix2world(\n    i: number,\n    j: number,\n    pxsize: number,\n    minPlaneXdeg: number,\n    minPlaneYdeg: number,\n  ): Point {\n    // plane coords (degrees) relative to the projection center\n    const xDeg = i * pxsize + minPlaneXdeg;\n    const yDeg = j * pxsize + minPlaneYdeg;\n\n    const { xr, yr } = planeDegToRad(xDeg, yDeg);\n    const inv = aitInverse(xr, yr);\n    // Use the class center (CRVAL1/2)\n    const ra0 = this.craDeg * DEG2RAD;\n    const dec0 = this.cdecDeg * DEG2RAD;\n\n    if (!inv) {\n      return new Point(\n        CoordsType.ASTRO,\n        NumberType.DEGREES,\n        Number.NaN,\n        Number.NaN,\n      );\n    }\n    const { lam, phi } = inv;\n    const { ra, dec } = fromCenteredLonLat(lam, phi, ra0, dec0);\n    return new Point(\n      CoordsType.ASTRO,\n      NumberType.DEGREES,\n      ra * RAD2DEG,\n      dec * RAD2DEG,\n    );\n  }\n\n  world2pix(raDecList: TilesRaDecList2): TilesRaDecList2 {\n    const bytesXvalue = this.getBytePerValue();\n    const blank = Number(this.fitsheader.findById(\"BLANK\")?.value);\n    const blankBytes = FITSUtils.convertBlankToBytes(blank, bytesXvalue);\n\n    const ra0 = this.craDeg * DEG2RAD;\n    const dec0 = this.cdecDeg * DEG2RAD;\n\n    for (const px of raDecList.getImagePixelList()) {\n      const raDeg = px.getRADeg();\n      const decDeg = px.getDecDeg();\n      if (!Number.isFinite(raDeg) || !Number.isFinite(decDeg)) {\n        px.setij(-1, -1);\n        px.setValue(blankBytes, this.bitpix);\n        continue;\n      }\n\n      // Center-relative spherical coords\n      const { lam, phi } = toCenteredLonLat(\n        raDeg * DEG2RAD,\n        decDeg * DEG2RAD,\n        ra0,\n        dec0,\n      );\n      const { x, y } = aitForward(lam, phi);\n\n      // plane x/y in degrees\n      const { xd, yd } = planeRadToDeg(x, y);\n      const i = Math.floor((xd - this.minra) / this.pxsize);\n      const j = Math.floor((yd - this.mindec) / this.pxsize);\n      px.setij(i, j);\n\n      if (j < 0 || j >= this.naxis2 || i < 0 || i >= this.naxis1) {\n        px.setValue(blankBytes, this.bitpix);\n      } else {\n        const row = this.pxvalues[j];\n        const slice = row.slice(i * bytesXvalue, (i + 1) * bytesXvalue);\n        px.setValue(slice, this.bitpix);\n      }\n      raDecList.setMinMaxValue(px.getValue());\n    }\n    return raDecList;\n  }\n\n  // ── FITS write path ────────────────────────────────────────────────────────\n  generateFITSFile(\n    pixelAngSize: number,\n    BITPIX: number,\n    TILE_WIDTH: number,\n    BLANK: number,\n    BZERO: number,\n    BSCALE: number,\n    cRA: number,\n    cDec: number,\n    minValue: number,\n    maxValue: number,\n    raDecWithValues: TilesRaDecList2,\n  ): FITS {\n    const header = this.prepareHeader(\n      pixelAngSize,\n      BITPIX,\n      TILE_WIDTH,\n      BLANK,\n      BZERO,\n      BSCALE,\n      cRA,\n      cDec,\n      minValue,\n      maxValue,\n    );\n    return this.setPixelValues(raDecWithValues, header);\n  }\n\n  prepareHeader(\n    pixelAngSize: number,\n    BITPIX: number,\n    TILE_WIDTH: number,\n    BLANK: number,\n    BZERO: number,\n    BSCALE: number,\n    cRA: number,\n    cDec: number,\n    minValue: number,\n    maxValue: number,\n  ): FITSHeaderManager {\n    const h = new FITSHeaderManager();\n    h.insert(new FITSHeaderItem(\"SIMPLE\", \"T\", \"\"));\n    h.insert(new FITSHeaderItem(\"NAXIS\", 2, \"\"));\n    h.insert(new FITSHeaderItem(\"NAXIS1\", TILE_WIDTH, \"\"));\n    h.insert(new FITSHeaderItem(\"NAXIS2\", TILE_WIDTH, \"\"));\n    h.insert(new FITSHeaderItem(\"BITPIX\", BITPIX, \"\"));\n    h.insert(new FITSHeaderItem(\"BLANK\", BLANK, \"\"));\n    h.insert(new FITSHeaderItem(\"BSCALE\", BSCALE, \"\"));\n    h.insert(new FITSHeaderItem(\"BZERO\", BZERO, \"\"));\n    h.insert(new FITSHeaderItem(\"CTYPE1\", this.CTYPE1, \"\"));\n    h.insert(new FITSHeaderItem(\"CTYPE2\", this.CTYPE2, \"\"));\n    h.insert(new FITSHeaderItem(\"CDELT1\", pixelAngSize, \"\"));\n    h.insert(new FITSHeaderItem(\"CDELT2\", pixelAngSize, \"\"));\n    h.insert(new FITSHeaderItem(\"CRPIX1\", TILE_WIDTH / 2, \"\"));\n    h.insert(new FITSHeaderItem(\"CRPIX2\", TILE_WIDTH / 2, \"\"));\n    h.insert(new FITSHeaderItem(\"CRVAL1\", cRA, \"\"));\n    h.insert(new FITSHeaderItem(\"CRVAL2\", cDec, \"\"));\n    h.insert(new FITSHeaderItem(\"DATAMIN\", BZERO + BSCALE * minValue, \"\"));\n    h.insert(new FITSHeaderItem(\"DATAMAX\", BZERO + BSCALE * maxValue, \"\"));\n    h.insert(new FITSHeaderItem(\"ORIGIN\", `WCSLight v.${APP_VERSION}`, \"\"));\n    h.insert(\n      new FITSHeaderItem(\n        \"COMMENT\",\n        \"WCSLight developed by F.Giordano and Y.Ascasibar\",\n        \"\",\n      ),\n    );\n    h.insert(new FITSHeaderItem(\"END\", \"\", \"\"));\n    return h;\n  }\n\n  setPixelValues(raDecList: TilesRaDecList2, header: FITSHeaderManager): FITS {\n    const BITPIX = Number(header.findById(\"BITPIX\")?.value);\n    if (!Number.isFinite(BITPIX))\n      throw new Error(\"BITPIX not found or invalid\");\n    const bytesPerElem = Math.abs(BITPIX) / 8;\n\n    const width = Number(header.findById(\"NAXIS1\")?.value);\n    const height = Number(header.findById(\"NAXIS2\")?.value);\n    if (!Number.isFinite(width) || width <= 0)\n      throw new Error(\"NAXIS1 not found or invalid\");\n    if (!Number.isFinite(height) || height <= 0)\n      throw new Error(\"NAXIS2 not found or invalid\");\n\n    const BLANK = Number(header.findById(\"BLANK\")?.value);\n    const blankBytes = FITSUtils.convertBlankToBytes(BLANK, bytesPerElem);\n\n    const pixels = raDecList.getImagePixelList();\n    if (pixels.length !== width * height) {\n      throw new Error(\n        `Pixel count mismatch: got ${pixels.length}, expected ${width * height}`,\n      );\n    }\n\n    // Build Map<row, Array<Uint8Array>> per your FITS class constructor\n    const rows = new Map<number, Array<Uint8Array>>();\n    for (let j = 0; j < height; j++) rows.set(j, new Array<Uint8Array>(width));\n\n    for (let k = 0; k < pixels.length; k++) {\n      const row = Math.floor(k / width);\n      const col = k % width;\n      const u8 = pixels[k].getUint8Value();\n      rows.get(row)![col] = u8 ? u8 : new Uint8Array(blankBytes);\n    }\n\n    return new FITS(header, rows);\n  }\n}\n","/**\n * Summary. (bla bla bla)\n *\n * Description. (bla bla bla)\n *\n * @link   github https://github.com/fab77/wcslight\n * @author Fabrizio Giordano <fabriziogiordano77@gmail.com>\n */\n\nimport { FITSParser } from \"jsfitsio\";\nimport { FITSWriterAdapter } from \"./utils/FITSWriterAdapter.js\";\nimport { CartesianProjection } from \"./projections/cartesian/CartesianProjection.js\";\nimport { HiPSProjection } from \"./projections/hips/HiPSProjection.js\";\nimport { Point } from \"./model/Point.js\";\nimport { AbstractProjection } from \"./projections/AbstractProjection.js\";\nimport { FITS } from \"./model/FITS.js\";\nimport { FITSList } from \"./projections/hips/FITSList.js\";\nimport { HiPSFITS } from \"./projections/hips/HiPSFITS.js\";\nimport { HiPSPropManager } from \"./projections/hips/HiPSPropManager.js\";\nimport { HiPSProperties } from \"./projections/hips/HiPSProperties.js\";\nimport { HiPSHelper } from \"./projections/HiPSHelper.js\";\nimport { TilesRaDecList2 } from \"./projections/hips/TilesRaDecList2.js\";\nimport { CutoutResult } from \"./projections/hips/CutoutResult.js\";\nimport { MercatorProjection } from \"./projections/mercator/MercatorProjection.js\";\nimport { SinProjection } from \"./projections/sin/SinProjection.js\";\nimport { AitoffProjection } from \"./projections/aitoff/AitoffProjection.js\";\n\nexport class WCSLight {\n  /**\n   * This function receives a FITS and generate a cutout on HiPS FITS.\n   * @param center of the cutout in degrees\n   * @param radius of the cutout in degrees\n   * @param pxsize of the cutout in degrees\n   * @param filePath of the input FITS file\n   * @returns fitsList of FITS in HiPS format\n   */\n  static async fitsCutoutToHiPS(\n    center: Point,\n    radius: number,\n    pxsize: number,\n    filePath: string,\n  ): Promise<FITSList | null> {\n    const HiPS_TILE_WIDTH = 512;\n\n    // 0. here is missing the validation/check that the input file used to get the value, contains the center ...\n\n    // 1. open input fits file and understand the projection and set up in inprojection details like NAXIS1-2, CDELT1-2, CRVAL1-2, minRa and minDec\n    const inProjection = await WCSLight.extractProjectionType(filePath);\n    if (!inProjection) return null;\n    // const bitpix = inProjection.getBitpix()\n\n    // 2. from HiPS output projection, compute the list of RA,Dec and related tileno based on center, radius, pxsize, and tilewidth forced to 512\n    const outTilesRaDecList: TilesRaDecList2 | null =\n      HiPSProjection.getImageRADecList(center, radius, pxsize, HiPS_TILE_WIDTH);\n    if (!outTilesRaDecList) {\n      return null;\n    }\n\n    // 3. by using the list of RA and Dec on point 2., convert RA,Dec into i,j used in the input projection to get pixel values (try to merge the 2 calls below in one single method)\n    inProjection.world2pix(outTilesRaDecList);\n    // const invalues = await inProjection.getPixValues(tilesRaDecList)\n\n    // 4. collect the details required to construct the output HiPS projection header\n    // const fitsHeaderParams = inProjection.getCommonFitsHeaderParams();\n\n    // here pass inProjection.getFITSHeader()\n    // 5. generate output HiPS FITS file(s)\n    const fitsFileList = HiPSProjection.getFITSFiles(\n      outTilesRaDecList,\n      inProjection.getFITSHeader(),\n      pxsize,\n      HiPS_TILE_WIDTH,\n    );\n    for (let hipsFitsEntry of fitsFileList.getFITSList()) {\n      const tileno = hipsFitsEntry[0];\n      const hipsFits = hipsFitsEntry[1];\n      const data = hipsFits.getPayload();\n      const header = hipsFits.getHeader();\n      const FITS_FILE_PATH = `./hips_${tileno}.fits`;\n\n      FITSWriterAdapter.writeImage(header, data, FITS_FILE_PATH);\n    }\n    return fitsFileList;\n  }\n\n  // only MERCATOR supported at the moment\n  static async extractProjectionType(\n    filePath: string,\n  ): Promise<AbstractProjection | null> {\n    const fitsFile = await FITSParser.loadFITSFile(filePath);\n\n    const primary = fitsFile?.primaryHDU;\n    if (!primary) {\n      return null;\n    }\n\n    const ctype = String(primary.header.findById(\"CTYPE1\")?.value);\n\n    if (ctype.includes(\"MER\")) {\n      let projection = new MercatorProjection();\n      await projection.initFromFile(filePath);\n      return projection;\n    }\n    if (ctype.includes(\"CAR\")) {\n      let projection = new CartesianProjection();\n      await projection.initFromFile(filePath);\n      return projection;\n    }\n    if (ctype.includes(\"SIN\")) {\n      let projection = new SinProjection();\n      await projection.initFromFile(filePath);\n      return projection;\n    }\n    if (ctype.includes(\"AIT\")) {\n      let projection = new AitoffProjection();\n      await projection.initFromFile(filePath);\n      return projection;\n    }\n    return null;\n  }\n\n  // TODO: instead of using AbstractProjection, use a constant file with supported projection names\n  static async hipsCutoutToFITS(\n    center: Point,\n    radius: number,\n    pixelAngSize: number,\n    baseHiPSURL: string,\n    outproj: AbstractProjection,\n    hipsOrder: number | null = null,\n    outputFilePath: string | null = null,\n  ): Promise<CutoutResult | null> {\n    const hipsProp = await HiPSPropManager.parsePropertyFile(baseHiPSURL);\n    const hipsMaxOrder: number = hipsProp.getItem(HiPSProperties.ORDER);\n    const hipsFrame = hipsProp.getItem(HiPSProperties.FRAME);\n    const TILE_WIDTH = hipsProp.getItem(HiPSProperties.TILE_WIDTH);\n\n    let isGalactic: boolean = false;\n    if (hipsFrame.toLowerCase() == \"galactic\") {\n      isGalactic = true;\n    }\n\n    if (!hipsOrder) {\n      const healpix = HiPSHelper.getHelpixBypxAngSize(\n        pixelAngSize,\n        TILE_WIDTH,\n        hipsMaxOrder,\n      );\n      hipsOrder = Number(healpix.order);\n    }\n\n    /*\n        below how naxis are computed\n        outproj.getImageRADecList -> computeSquaredNaxes -> set naxis1 and naxis2\n        */\n    const naxisWidth: number = outproj.computeNaxisWidth(radius, pixelAngSize);\n    const outRADecList: TilesRaDecList2 = outproj.getImageRADecList(\n      center,\n      radius,\n      pixelAngSize,\n      naxisWidth,\n    );\n    if (!outRADecList) return null;\n\n    const raDecMinMaxCentral = outRADecList.computeRADecMinMaxCentral();\n    if (raDecMinMaxCentral == null) return null;\n    const cRA = raDecMinMaxCentral?.getCentralRA();\n    const cDec = raDecMinMaxCentral?.getCentralDec();\n    if (cRA === undefined || cDec === undefined) return null;\n\n    // TODO check if possible to compute in the word2pix, when iterating onver ImagePixels, the min and max value.\n    const raDecWithValues = await HiPSProjection.world2pix(\n      outRADecList,\n      hipsOrder,\n      isGalactic,\n      TILE_WIDTH,\n      baseHiPSURL,\n    );\n    if (!raDecWithValues) return null;\n    const minValue = raDecWithValues.getMinMaxValues()?.getMinValue();\n    const maxValue = raDecWithValues.getMinMaxValues()?.getMaxValue();\n    if (minValue === undefined || maxValue === undefined) return null;\n\n    /** info required:\n         * SIMPLE  = T                                                                     \n            BITPIX  = -64                                                                   \n            NAXIS   = 2                                                                     \n            NAXIS1  = 512                                                                   \n            NAXIS2  = 512                                                                   \n            BSCALE  = 1                                                                     \n            BZERO   = 0                                                                     \n            CTYPE1  = RA---HPX                                                              \n            CTYPE2  = DEC--HPX                                                              \n            DATAMIN = 0                                                                     \n            DATAMAX = 0                                                                     \n            hips_order= 7                                                                   \n            NPIX    = 113056                                                                \n            CRPIX1  = 56528                                                                 \n            CRPIX2  = 56528                                                                 \n            ORIGIN  = WCSLight v.0.x                                                        \n            COMMENT =  / WCSLight v0.x developed by F.Giordano and Y.Ascasibar              \n            CRVAL1  = 170.15625                                                             \n            CRVAL2  = 18.5243910738658                                                      \n            END                                                                             \n         */\n    // TODO BLANK, BZERO, BSCALE must be taken from the FITS tiles and not from the HiPS metadata.\n    const BLANK = raDecWithValues.getBLANK();\n    const BZERO = raDecWithValues.getBZERO();\n    const BSCALE = raDecWithValues.getBSCALE();\n    if (BLANK === null || BZERO === null || BSCALE === null) return null;\n    console.log(`BLANK: ${BLANK}, BZERO: ${BZERO}, BSCALE: ${BSCALE}`);\n\n    // validate BITPIX\n    const BITPIX: number = parseInt(hipsProp.getItem(HiPSProperties.BITPIX));\n    if (\n      BITPIX != 8 &&\n      BITPIX != 16 &&\n      BITPIX != 32 &&\n      BITPIX != -32 &&\n      BITPIX != -64\n    ) {\n      throw new Error(\"unsupported BITPIX value\");\n    }\n\n    const fits: FITS = outproj.generateFITSFile(\n      pixelAngSize,\n      hipsProp.getItem(HiPSProperties.BITPIX),\n      naxisWidth,\n      BLANK,\n      BZERO,\n      BSCALE,\n      cRA,\n      cDec,\n      minValue,\n      maxValue,\n      raDecWithValues,\n    );\n\n    console.log(fits);\n\n    if (outputFilePath) {\n      FITSWriterAdapter.writeImage(\n        fits.getHeader(),\n        fits.getData(),\n        outputFilePath,\n      );\n    }\n\n    let hipsUsed = Array<string>();\n    raDecWithValues.getTilesList().forEach((hipstileno) => {\n      const dir = Math.floor(hipstileno / 10000) * 10000; // as per HiPS recomendation REC-HIPS-1.0-20170519\n      const fitsurl =\n        baseHiPSURL +\n        \"/Norder\" +\n        hipsOrder +\n        \"/Dir\" +\n        dir +\n        \"/Npix\" +\n        hipstileno +\n        \".fits\";\n      hipsUsed.push(fitsurl);\n    });\n\n    const result = new CutoutResult(\n      fits,\n      hipsUsed,\n      outproj,\n      raDecMinMaxCentral,\n      pixelAngSize,\n    );\n\n    return result;\n  }\n\n  static hipsFITSChangeProjection(): HiPSFITS | null {\n    return null;\n  }\n\n  /**\n   *\n   * @param {*} fitsheader\n   * @param {*} fitsdata\n   * @returns {URL}\n   */\n  // static generateFITS(fitsheader: any, fitsdata: any): string {\n  //     const fitsParsed = {\n  //         header: fitsheader,\n  //         data: fitsdata\n  //     }\n  //     // const blobUrl = FITSParser.generateFITSForWeb(fitsheader, fitsdata);\n  //     const blobUrl = FITSParser.generateFITSForWeb(fitsParsed);\n  //     return blobUrl;\n  // }\n\n  static getAvaillableProjections() {\n    return [\"Mercator\", \"HiPS\", \"HEALPix\"];\n  }\n}\n","/**\n * Summary. (bla bla bla)\n *\n * Description. (bla bla bla)\n * \n * @link   github https://github.com/fab77/wcslight\n * @author Fabrizio Giordano <fabriziogiordano77@gmail.com>\n */\n\n\n\nexport class ImagePixel {\n    _i: number;     // int i of input projection\n    _j: number;     // int j of input projection\n    _tileno: number;// int\n    \n    constructor (i: number, j: number, tileno: number = NaN) {\n        this._i = i;\n        this._j = j;\n        this._tileno = tileno;\n    }\n\n    geti() {\n        return this._i;\n    }\n\n    getj() {\n        return this._j;\n    }\n\n    get tileno() {\n        return this._tileno\n    }\n}\n","export { WCSLight } from \"./WCSLight.js\";\n\nexport { AstroCoords } from \"./model/AstroCoords.js\";\nexport { CartesianCoords } from \"./model/CartesianCoords.js\";\nexport { CoordsType } from \"./model/CoordsType.js\";\nexport { CutoutResult } from \"./model/CutoutResult.js\";\nexport { EquatorialCoords } from \"./model/EquatorialCoords.js\";\nexport { GalacticCoords } from \"./model/GalacticCoords.js\";\nexport { HEALPixXYSpace } from \"./model/HEALPixXYSpace.js\";\nexport { HMSCoords } from \"./model/HMSCoords.js\";\nexport { ICoordsFormat } from \"./model/ICoordsFormat.js\";\nexport { ImagePixel } from \"./model/ImagePixel.js\";\nexport { NumberType } from \"./model/NumberType.js\";\nexport { Point } from \"./model/Point.js\";\nexport { SexagesimalCoords } from \"./model/SexagesimalCoords.js\";\nexport { SphericalCoords } from \"./model/SphericalCoords.js\";\nexport {\n  sphericalToCartesian,\n  cartesianToSpherical,\n  sphericalToAstro,\n  fillSpherical,\n  astroToSpherical,\n  degToRad,\n  fillAstro,\n  radToDeg,\n} from \"./model/Utils.js\";\nexport { AbstractProjection } from \"./projections/AbstractProjection.js\";\nexport { HiPSHelper } from \"./projections/HiPSHelper.js\";\nexport { HiPSProjection } from \"./projections/hips/HiPSProjection.js\";\nexport { CartesianProjection } from \"./projections/cartesian/CartesianProjection.js\";\nexport { MercatorProjection } from \"./projections/mercator/MercatorProjection.js\";\nexport { SinProjection } from \"./projections/sin/SinProjection.js\";\nexport { AitoffProjection } from \"./projections/aitoff/AitoffProjection.js\";\nexport { HiPSFITS } from \"./projections/hips/HiPSFITS.js\";\n"],"names":[],"sourceRoot":""}