carta1 1.1.10 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/bin/cli.js +8 -4
  2. package/codec/{coding/bitallocation.js → allocation/solve.js} +131 -97
  3. package/codec/allocation/source.js +69 -0
  4. package/codec/allocation/stage.js +38 -0
  5. package/codec/analysis/bands.js +49 -0
  6. package/codec/analysis/{transient.js → blocks.js} +90 -47
  7. package/codec/analysis/spectrum.js +160 -0
  8. package/codec/analysis/stage.js +32 -0
  9. package/codec/{browser/interface.js → boundary/browser.js} +1 -1
  10. package/codec/boundary/container.js +96 -0
  11. package/codec/boundary/pcm.js +193 -0
  12. package/codec/boundary/processor.js +208 -0
  13. package/codec/{io/readers.js → boundary/reader.js} +2 -1
  14. package/codec/boundary/stream.js +361 -0
  15. package/codec/{browser → boundary}/worker.js +45 -42
  16. package/codec/core/constants.js +9 -131
  17. package/codec/core/geometry.js +25 -0
  18. package/codec/core/tables.js +117 -0
  19. package/codec/dequantization.js +54 -0
  20. package/codec/index.js +10 -11
  21. package/codec/pipeline/decoder.js +10 -399
  22. package/codec/pipeline/encoder.js +12 -434
  23. package/codec/quantization/spectrum.js +67 -0
  24. package/codec/quantization/stage.js +45 -0
  25. package/codec/{transforms/qmf.js → signal/bands.js} +8 -5
  26. package/codec/{transforms → signal}/fft.js +1 -1
  27. package/codec/{transforms/mdct.js → signal/spectrum.js} +16 -1
  28. package/codec/{core/buffers.js → state.js} +46 -35
  29. package/codec/{io → syntax}/bitstream.js +27 -8
  30. package/codec/{io/serialization.js → syntax/frame.js} +5 -101
  31. package/codec/synthesis/bands.js +201 -0
  32. package/codec/synthesis/pcm.js +50 -0
  33. package/codec/synthesis/stage.js +17 -0
  34. package/codec/utils.js +9 -52
  35. package/dist/carta1-worker-interface.min.js.map +1 -1
  36. package/dist/carta1-worker.min.js +1 -1
  37. package/dist/carta1-worker.min.js.map +1 -1
  38. package/dist/carta1.min.js +1 -1
  39. package/dist/carta1.min.js.map +1 -1
  40. package/package.json +1 -1
  41. package/codec/coding/quantization.js +0 -149
  42. package/codec/io/processor.js +0 -671
@@ -1 +1 @@
1
- {"version":3,"file":"carta1-worker.min.js","mappings":"4BAKO,IAAMA,EAAc,MAKdC,EAAY,IAAIC,WAAW,CAAC,EAAM,EAAM,EAAM,IAC9CC,EAAkB,KAOlBC,EAAkB,IAUlBC,EAAgB,IAAIC,WAAW,CAC1C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC3E,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAC1E,GAAI,GAAI,GAAI,GAAI,KAILC,EAAc,IAAID,WAAW,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,KAC1DE,EAAsB,IAAIF,WAAW,CAAC,GAAI,GAAI,KAG9CG,EAAiB,IAAIH,WAAW,CAC3C,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IACxE,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACtE,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACtE,IAAK,IAAK,MAGCI,EAAkB,IAAIJ,WAAW,CAC5C,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,GAAI,GAAI,GACzE,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACtE,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACtE,IAAK,IAAK,MAKCK,EAAgB,IAChBC,EAAiB,IAGjBC,EAAgB,WAE3B,IADA,IAAMC,EAAQ,IAAIC,aAAa,IACtBC,EAAI,EAAGA,EAAI,GAAIA,IACtBF,EAAME,GAAKC,KAAKC,KAAMF,EAAI,IAAOC,KAAKE,GAAM,IAE9C,OAAOL,CACT,CAN6B,GAUhBM,EAAY,GAIZC,EAAa,IAAIC,aAAa,EACxC,aAAgB,aAAgB,aAAgB,aAAe,aAC/D,cAAgB,YAAc,YAAc,cAAgB,aAC5D,aAAe,aAAe,cAAiB,UAAY,YAC5D,YAAc,YAAc,WAAa,UAAY,YACpD,YAAc,WAAa,UAAY,YAI7BC,EAAc,WAEzB,IADA,IAAMC,EAAS,IAAIF,aAfG,IAgBbN,EAAI,EAAGA,EAAI,GAAIA,IACtBQ,EAAOR,GAAqB,EAAhBK,EAAWL,GACvBQ,EAAO,GAAKR,GAAqB,EAAhBK,EAAWL,GAE9B,OAAOQ,CACT,CAP2B,GAUdC,EAAY,WAEvB,IADA,IAAMC,EAAO,IAAIJ,aAAa,IACrBN,EAAI,EAAGA,EAAI,GAAIA,IACtBU,EAAKV,GAAKO,EAAe,EAAJP,GAEvB,OAAOU,CACT,CANyB,GAQZC,EAAW,WAEtB,IADA,IAAMC,EAAM,IAAIN,aAAa,IACpBN,EAAI,EAAGA,EAAI,GAAIA,IACtBY,EAAIZ,GAAKO,EAAe,EAAJP,EAAQ,GAE9B,OAAOY,CACT,CANwB,GAcXC,EAAoB,CAC/B,CAAEC,KAAM,IAAKC,YAAa,IAC1B,CAAED,KAAM,IAAKC,YAAa,IAC1B,CAAED,KAAM,IAAKC,YAAa,MAGfC,EAAwB,GACxBC,EAAoB,GACpBC,EAAwB,GAMxBC,EAAuB,MACvBC,EAAuB,MAUvBC,EAAwB,GACxBC,EAAmB,IAAIhC,WAAW,CAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,KAExCiC,EAAiB,WAE5B,IADA,IAAMzB,EAAQ,IAAIC,aAAa,IACtBC,EAAI,EAAGA,EAAI,GAAIA,IACtBF,EAAME,GAAKC,KAAKuB,IAAI,EAAKxB,EAAI,EAAM,IAErC,OAAOF,CACT,CAN8B,GASjB2B,EAAoB,WAG/B,IAFA,IAAMC,EAAUJ,EAAiBD,IAC3BvB,EAAQ,IAAIC,aAAa2B,EAAU,GAChCC,EAAI,EAAGA,GAAKD,EAASC,IAC5B7B,EAAM6B,GAAK1B,KAAKuB,IAAI,GAAIG,GAE1B,OAAO7B,CACT,CAPiC,GASpB8B,EAA0B,WAErC,IADA,IAAM9B,EAAQ,IAAIR,WAAW+B,GACpBrB,EAAI,EAAGA,EAAIqB,EAAuBrB,IACzCF,EAAME,GAAMsB,EAAiBtB,EAAI,GAAKsB,EAAiBtB,GAAM,EAE/D,OAAOF,CACT,CANuC,GAQ1B+B,EAA4B,WACvC,IAAM/B,EAAQ,IAAIC,aAAasB,GAC/BvB,EAAM,GAAK,EAAM2B,EAAiBH,EAAiB,IACnD,IAAK,IAAItB,EAAI,EAAGA,EAAIqB,EAAuBrB,IAAK,CAC9C,IAAM8B,EAA8B,EAAtBR,EAAiBtB,GACzB+B,EAAkC,EAA1BT,EAAiBtB,EAAI,GACnCF,EAAME,GAAKyB,EAAiBK,GAASL,EAAiBM,EACxD,CACA,OAAOjC,CACT,CATyC,GC3JlC,SAASkC,EAASC,EAAQC,EAAaC,EAAOC,GACnD,GAAiB,IAAbA,EAAJ,CAEA,IAAIC,EAAYpC,KAAKqC,MAAMJ,EAAc,GACrCK,EAAYL,EAAc,EAE9BC,IAAU,GAAKC,GAAY,EAG3B,IADA,IAAII,EAAc,EACXA,EAAcJ,GAAYC,EAAYJ,EAAOQ,QAAQ,CAC1D,IAAMC,EAAgB,EAAIH,EACpBI,EAAc1C,KAAK2C,IAAIR,EAAWI,EAAaE,GAG/CG,EAAaV,GADLC,EAAWI,EAAcG,GACA,GAAKA,GAAe,EAErDG,GAAS,GAAKH,GAAe,GAAOD,EAAgBC,EAC1DV,EAAOI,GACJJ,EAAOI,IAAcS,EAASD,GAAcH,EAAgBC,EAE/DH,GAAeG,EACfN,IACAE,EAAY,CACd,CAtBoB,CAuBtB,CASO,SAASQ,EAAWd,EAAQC,EAAaE,GAC9C,GAAiB,IAAbA,EAAgB,OAAO,EAM3B,IAJA,IAAIC,EAAYpC,KAAKqC,MAAMJ,EAAc,GACrCK,EAAYL,EAAc,EAC1BC,EAAQ,EAEHa,EAAW,EAAGA,EAAWZ,GAAYC,EAAYJ,EAAOQ,QAAS,CACxE,IAAMC,EAAgB,EAAIH,EACpBU,EAAahD,KAAK2C,IAAIR,EAAWY,EAAUN,GAE3CI,GAAQ,GAAKG,GAAc,EAGjCd,EAASA,GAASc,EAFJhB,EAAOI,IAAeK,EAAgBO,EAAeH,EAGnEE,GAAYC,EACZZ,IACAE,EAAY,CACd,CAEA,OAAOJ,CACT,CASO,SAASe,EAAiBjB,EAAQC,EAAaE,GACpD,IAAMD,EAAQY,EAAWd,EAAQC,EAAaE,GAE9C,OAAOD,GADS,GAAMC,EAAW,EACPD,GAAS,GAAKC,GAAYD,CACtD,4rDCzCO,SAASgB,EAAeC,GAC7B,IAAMnB,EAAS,IAAI/C,WAAWE,GACxBiE,EAAO,IAAIC,SAASrB,EAAOA,QAG3BsB,EAAWhE,EAAYiE,QAAQJ,EAAUK,MACzCC,EACF,EAAIN,EAAUO,WAAW,IAAO,GAChC,EAAIP,EAAUO,WAAW,IAAO,GAChC,EAAIP,EAAUO,WAAW,IAAO,GACjCJ,GAAY,EAEfF,EAAKO,UAAU,EAAGF,GAAQ,GAI1B,IAHA,IAAIxB,EFgF2B,GE7EtBlC,EAAI,EAAGA,EAAIoD,EAAUK,KAAMzD,IAClCgC,EACEC,EACAC,EACAkB,EAAUS,kBAAkB7D,GF0EI,GEvElCkC,GFuEkC,EEnEpC,IAAK,IAAIlC,EAAI,EAAGA,EAAIoD,EAAUK,KAAMzD,IAClCgC,EACEC,EACAC,EACAkB,EAAUU,mBAAmB9D,GFgEI,GE7DnCkC,GF6DmC,EEzDrC,IAAK,IAAIlC,EAAI,EAAGA,EAAIoD,EAAUK,KAAMzD,IAAK,CACvC,IAAM+D,EAAgBzC,EAAiB8B,EAAUS,kBAAkB7D,IACnE,GAAI+D,EAAgB,EAAG,CACrB,IACsCC,EADiBC,EAAAC,EAAlCd,EAAUe,sBAAsBnE,IACf,IAAtC,IAAAiE,EAAAG,MAAAJ,EAAAC,EAAAI,KAAAC,MAAwC,KAA7BC,EAAWP,EAAA7B,MAGpBH,EAASC,EAAQC,EADfqC,EAAc,EAAIA,GAAe,GAAKR,GAAiBQ,EACpBR,GACrC7B,GAAe6B,CACjB,CAAC,OAAAS,GAAAP,EAAAQ,EAAAD,EAAA,SAAAP,EAAAS,GAAA,CACH,CACF,CAOA,OAJAzC,EAAO7C,KAAuB,EAC9B6C,EAAO7C,KAAuB,EAC9B6C,EAAO7C,KAAuB,EAEvB6C,CACT,CAaO,SAAS0C,EAAiB1C,GAC/B,GAAIA,EAAOQ,SAAWrD,EACpB,MAAM,IAAIwF,MAAK,iBAAAC,OAAkBzF,EAAe,WAmBlD,IAhBA,IAGMsE,EAHO,IAAIJ,SAASrB,EAAOA,OAAQA,EAAO6C,WAAY7C,EAAO8C,YAG/CC,UAAU,GAAG,GAC3BrB,EAAa,CACjB,GAAMD,GAAU,GAAM,GACtB,GAAMA,GAAU,GAAM,GACtB,GAAMA,GAAU,GAAM,IAGlBD,EAAOlE,EADKmE,GAAU,EAAK,GAG7BxB,EFM2B,GEHzB2B,EAAoB,IAAIvE,WAAWmE,GAChCzD,EAAI,EAAGA,EAAIyD,EAAMzD,IACxB6D,EAAkB7D,GAAK+C,EACrBd,EACAC,EFAgC,GEGlCA,GFHkC,EEQpC,IADA,IAAM4B,EAAqB,IAAIxE,WAAWmE,GACjCzD,EAAI,EAAGA,EAAIyD,EAAMzD,IACxB8D,EAAmB9D,GAAK+C,EACtBd,EACAC,EFViC,GEanCA,GFbmC,EEkBrC,IADA,IAAMiC,EAAwB,GACrBnE,EAAI,EAAGA,EAAIyD,EAAMzD,IAAK,CAC7B,IAAM+D,EAAgBzC,EAAiBuC,EAAkB7D,IACnDiF,EAAU5F,EAAcW,GACxBkF,EAAe,IAAI5F,WAAW2F,GAEpC,GAAIlB,EAAgB,EAClB,IAAK,IAAIoB,EAAI,EAAGA,EAAIF,EAASE,IAC3BD,EAAaC,GAAKjC,EAAiBjB,EAAQC,EAAa6B,GACxD7B,GAAe6B,EAInBI,EAAsBiB,KAAKF,EAC7B,CAEA,MAAO,CACLzB,KAAAA,EACAK,mBAAAA,EACAD,kBAAAA,EACAM,sBAAAA,EACAR,WAAAA,EAEJ,CAMO,IAAM0B,EAAO,6BAAAA,iGAAAC,CAAAC,KAAAF,EAAA,MAAAG,IAAA,eAAArD,MAQlB,WAAkE,IAA9CsD,EAAKC,UAAAjD,OAAA,QAAAkD,IAAAD,UAAA,GAAAA,UAAA,GAAG,GAAIE,EAAUF,UAAAjD,OAAA,QAAAkD,IAAAD,UAAA,GAAAA,UAAA,GAAG,EAAGG,EAAYH,UAAAjD,OAAA,QAAAkD,IAAAD,UAAA,GAAAA,UAAA,GAAG,EACvDhC,EAAS,IAAIxE,WAAWC,GACxBkE,EAAO,IAAIC,SAASI,EAAOzB,QAGjCyB,EAAOoC,IAAI7G,EAAW,GAGtB,IAAM8G,GAAa,IAAIC,aAAcC,OAAOR,GAY5C,OAXA/B,EAAOoC,IACLC,EAAWG,SAAS,EAAGjG,KAAK2C,IAAImD,EAAWtD,OAAQ0D,MF3LzB,GEgM5B9C,EAAK+C,UF9L6B,IE8LKR,GAAY,GAGnDlC,EFhMoC,KEgMDmC,EAE5BnC,CACT,GAEA,CAAA8B,IAAA,cAAArD,MASA,SAAmBuB,GACjB,GAAIA,EAAOjB,SAAWtD,EACpB,MAAM,IAAIyF,MAAK,kBAAAC,OAAmB1F,EAAe,WAInD,IAAK,IAAIa,EAAI,EAAGA,EAAIf,EAAUwD,OAAQzC,IACpC,GAAI0D,EAAO1D,KAAOf,EAAUe,GAC1B,MAAM,IAAI4E,MAAM,oBAIpB,IAAMvB,EAAO,IAAIC,SACfI,EAAOzB,OACPyB,EAAOoB,WACPpB,EAAOqB,YAIHsB,EAAW3C,EAAOF,QAAQ,EFpOJ,GEqOtB8C,GACU,IAAdD,EFrOwB,IEqOWA,EFtOT,EE+O5B,MAAO,CAAEZ,OARK,IAAIc,aAAcC,OAC9B9C,EAAOwC,SFxOmB,IEwO2BI,IAOvCV,WAHGvC,EAAKoD,UF1OU,KE0OwB,GAG9BZ,aAFPnC,EF1Oe,KE6OtC,OAvEkB,gGAuEjB,CAvEiB,+3EC9KpB,IAGMgD,EAAc,WA8DlB,SAzDA,SAAAA,IAA0B,IAAdC,EAAOjB,UAAAjD,OAAA,QAAAkD,IAAAD,UAAA,GAAAA,UAAA,GAAG,CAAC,+FAACJ,CAAAC,KAAAmB,GACtBnB,KAAKqB,OAAS,CACZC,sBAAuB,EACvBC,sBAAuB,IACvBC,uBAAwB,EACxBC,eAAgB,EAChBC,gBAAiB,MAGnB1B,KAAK2B,SAAW,CACdL,sBAAuB,CACrBM,QAAS5B,KAAKqB,OAAOC,sBACrBO,KAAM,+BACNC,YACE,gNACFC,MAAO,CAAC,IAAM,GACdC,KAAM,KAERT,sBAAuB,CACrBK,QAAS5B,KAAKqB,OAAOE,sBACrBM,KAAM,+BACNC,YACE,iNACFC,MAAO,CAAC,IAAM,GACdC,KAAM,KAERR,uBAAwB,CACtBI,QAAS5B,KAAKqB,OAAOG,uBACrBK,KAAM,gCACNC,YACE,iNACFC,MAAO,CAAC,IAAM,GACdC,KAAM,KAERP,eAAgB,CACdG,QAAS5B,KAAKqB,OAAOI,eACrBI,KAAM,sBACNC,YACE,+MACFC,MAAO,CAAC,EAAK,GACbC,KAAM,KAERN,gBAAiB,CACfE,QAAS5B,KAAKqB,OAAOK,gBACrBG,KAAM,oBACNC,YACE,8KACFG,KAAM,UAKNb,GACFpB,KAAKkC,WAAWd,EAEpB,KAEA,EAAAnB,IAAA,aAAArD,MAIA,SAAWwE,GACT,QAAAe,EAAA,EAAAC,EAA2BC,OAAOC,QAAQlB,GAAQe,EAAAC,EAAAlF,OAAAiF,IAAE,CAA/C,IAAAI,EAAAC,EAAAJ,EAAAD,GAAA,GAAOlC,EAAGsC,EAAA,GAAE3F,EAAK2F,EAAA,GAChBtC,KAAOD,KAAKqB,QACdrB,KAAKyC,SAASxC,EAAKrD,EAEvB,CACF,GAEA,CAAAqD,IAAA,WAAArD,MAMA,SAASqD,EAAKrD,GACZ,KAAMqD,KAAOD,KAAK2B,UAChB,MAAM,IAAItC,MAAK,mBAAAC,OAAoBW,IAGrC,IAAMyC,EAAO1C,KAAK2B,SAAS1B,GAG3B,GAAkB,UAAdyC,EAAKT,KAAkB,CACzB,IAAAU,EAAAH,EAAmBE,EAAKX,MAAK,GAAtB1E,EAAGsF,EAAA,GAAEC,EAAGD,EAAA,GACf,GAAI/F,EAAQS,GAAOT,EAAQgG,EACzB,MAAM,IAAIvD,MAAK,aAAAC,OACAW,EAAG,qBAAAX,OAAoBjC,EAAG,SAAAiC,OAAQsD,EAAG,UAAAtD,OAAS1C,GAGjE,CAEAoD,KAAKqB,OAAOpB,GAAOrD,CACrB,GAEA,CAAAqD,IAAA,WAAArD,MAMA,SAASqD,GACP,KAAMA,KAAOD,KAAKqB,QAChB,MAAM,IAAIhC,MAAK,mBAAAC,OAAoBW,IAErC,OAAOD,KAAKqB,OAAOpB,EACrB,GAAC,CAAAA,IAAA,wBAAA4C,IAED,WACE,OAAO7C,KAAKqB,OAAOC,qBACrB,GAAC,CAAArB,IAAA,wBAAA4C,IAED,WACE,OAAO7C,KAAKqB,OAAOE,qBACrB,GAAC,CAAAtB,IAAA,yBAAA4C,IAED,WACE,OAAO7C,KAAKqB,OAAOG,sBACrB,GAAC,CAAAvB,IAAA,iBAAA4C,IAED,WACE,OAAO7C,KAAKqB,OAAOI,cACrB,GAAC,CAAAxB,IAAA,kBAAA4C,IAED,WACE,OAAO7C,KAAKqB,OAAOK,eACrB,GAAC,CAAAzB,IAAA,cAAArD,MAED,SAAYqD,GACV,OAAOD,KAAK2B,SAAS1B,EACvB,GAAC,CAAAA,IAAA,iBAAArD,MAED,WACE,OAAAkG,EAAA,GAAY9C,KAAK2B,SACnB,GAAC,CAAA1B,IAAA,QAAArD,MAED,WACE,QAAAmG,EAAA,EAAAC,EAA0BX,OAAOC,QAAQtC,KAAK2B,UAASoB,EAAAC,EAAA9F,OAAA6F,IAAE,CAApD,IAAAE,EAAAT,EAAAQ,EAAAD,GAAA,GAAO9C,EAAGgD,EAAA,GAAEP,EAAIO,EAAA,GACnBjD,KAAKqB,OAAOpB,GAAOyC,EAAI,OACzB,CACF,GAAC,CAAAzC,IAAA,WAAArD,MAED,WACE,MAAO,CACLyE,OAAMyB,EAAA,GAAO9C,KAAKqB,QAClBM,SAAQmB,EAAA,GAAO9C,KAAK2B,UAExB,+FAAC,CAxJiB,GCGb,SAASuB,EAAWC,GACzB,MAAM,IAAI9D,MAAM8D,EAClB,CAQO,SAASC,EAAKC,GAAoB,QAAAC,EAAAnD,UAAAjD,OAARqG,EAAM,IAAAC,MAAAF,EAAA,EAAAA,EAAA,KAAAG,EAAA,EAAAA,EAAAH,EAAAG,IAANF,EAAME,EAAA,GAAAtD,UAAAsD,GACrC,IAAMC,EAAYH,EAAOI,IAAI,SAACC,GAAK,OAAKA,EAAMP,EAAQ,GAEtD,OAAO,SAACQ,GACN,OAAOH,EAAUI,OAAO,SAAClH,EAAOmH,GAAE,OAAKA,EAAGnH,EAAM,EAAEiH,EACpD,CACF,CAYO,SAASG,EAAgBC,EAAUC,GAExC,IADA,IAAMC,EAAWD,EAAgBD,EAAS/G,QACjCzC,EAAI,EAAGA,EAAIwJ,EAAS/G,OAAQzC,IACnC0J,EAAS1J,GAAKwJ,EAASA,EAAS/G,OAAS,EAAIzC,GAE/C,OAAO0J,CACT,CC7BO,SAASC,EAAYP,EAAOQ,GAAkC,IAAAC,EAAAC,EAAvBC,EAAcrE,UAAAjD,OAAA,QAAAkD,IAAAD,UAAA,GAAAA,UAAA,GAAG,KACvDsE,EAAcZ,EAAM3G,OACpBwH,EAAeD,GAAe,EAE9BE,EACgC,QADtBL,EACdE,SAAqB,QAAPD,EAAdC,EAAgBI,aAAK,IAAAL,OAAA,EAArBA,EAAwBE,UAAY,IAAAH,EAAAA,EACpCpB,EAAU,qCAAA5D,OAAsCmF,EAAW,kBAC7DE,EAAWpE,IAAI8D,GACfM,EAAWpE,IAAIsD,EAAOQ,EAAUnH,QAKhC,IAHA,IAAM2H,EAAU,IAAI9J,aAAa2J,GAC3BI,EAAW,IAAI/J,aAAa2J,GAEzBjK,EAAI,EAAGA,EAAIiK,EAAcjK,IAAK,CAMrC,IALA,IAAIsK,EAAU,EACVC,EAAS,EACPC,EAAa,EAAJxK,EAGNmF,EAAI,EAAGA,EAAI,GAAIA,IACtBmF,GAAWJ,EAAWM,EAAS,GAAS,EAAJrF,GAAS1E,EAAS0E,GACtDoF,GAAUL,EAAWM,EAAS,GAAS,EAAJrF,GAASxE,EAAQwE,GAGtDiF,EAAQpK,GAAKsK,EAAUC,EACvBF,EAASrK,GAAKsK,EAAUC,CAC1B,CAIA,MAAO,CAAEH,QAAAA,EAASC,SAAAA,EAAUI,SADXP,EAAWQ,OAAM,IAEpC,CAUO,SAASC,GACdP,EACAC,EACAT,GAEA,IAAAgB,EAAAC,EADAd,EAAcrE,UAAAjD,OAAA,QAAAkD,IAAAD,UAAA,GAAAA,UAAA,GAAG,KAEXoF,EAAgBV,EAAQ3H,OACxBwH,EAA+B,EAAhBa,EAEfZ,EACiC,QADvBU,EACdb,SAAqB,QAAPc,EAAdd,EAAgBI,aAAK,IAAAU,OAAA,EAArBA,EAAwBZ,UAAa,IAAAW,EAAAA,EACrCnC,EAAU,sCAAA5D,OAC8BoF,EAAY,kBAEtDC,EAAWpE,IAAI8D,GAGf,IAAK,IAAI5J,EAAI,EAAGA,EAAI8K,EAAe9K,IAAK,CACtC,IAAM+K,EAAMX,EAAQpK,GACdgL,EAAOX,EAASrK,GAChBwK,EAASpK,EAAgB,EAAJJ,EAC3BkK,EAAWM,GAAU,IAAOO,EAAMC,GAClCd,EAAWM,EAAS,GAAK,IAAOO,EAAMC,EACxC,CAKA,IAHA,IAAMC,EAAS,IAAI3K,aAAa2J,GAGvBjK,EAAI,EAAGA,EAAI8K,EAAe9K,IAAK,CAKtC,IAJA,IAAMwK,EAAa,EAAJxK,EACXkL,EAAU,EACVC,EAAU,EAELhG,EAAI,EAAGA,EAAI,GAAIA,IAAK,CAC3B,IAAMiG,EAAMZ,EAAa,EAAJrF,EACrB+F,GAAWhB,EAAWkB,GAAO3K,EAAS0E,GACtCgG,GAAWjB,EAAWkB,EAAM,GAAKzK,EAAQwE,EAC3C,CAEA8F,EAAW,EAAJjL,GAASmL,EAChBF,EAAW,EAAJjL,EAAQ,GAAKkL,CACtB,CAGA,MAAO,CAAED,OAAAA,EAAQR,SADAP,EAAWQ,OAAM,IAEpC,gtBCjGO,IAAMW,GAAG,6BAAAA,iGAAA/F,CAAAC,KAAA8F,EAAA,MAAA7F,IAAA,MAAArD,MAMd,SAAWmJ,EAAMC,GACf,IAAMzK,EAAOwK,EAAK7I,OAClB,GAAa,IAAT3B,EAAJ,CAKA,IAHA,IAAM0K,EAAOvL,KAAKwL,KAAK3K,GAGdd,EAAI,EAAGA,EAAIc,EAAMd,IAAK,CAG7B,IAFA,IAAI0J,EAAW,EACXgC,EAAO1L,EACF2B,EAAI,EAAGA,EAAI6J,EAAM7J,IACxB+H,EAAYA,GAAY,EAAa,EAAPgC,EAC9BA,IAAS,EAEX,GAAIhC,EAAW1J,EAAG,CACf,IAAA2L,EAA4B,CAACL,EAAK5B,GAAW4B,EAAKtL,IAAjDsL,EAAKtL,GAAE2L,EAAA,GAAEL,EAAK5B,GAASiC,EAAA,OAAAC,EACI,CAACL,EAAK7B,GAAW6B,EAAKvL,IAAjDuL,EAAKvL,GAAE4L,EAAA,GAAEL,EAAK7B,GAASkC,EAAA,EAC3B,CACF,CAGA,IAAK,IAAIC,EAAS,EAAGA,GAAU/K,EAAM+K,IAAW,EAM9C,IALA,IAAMC,EAAaD,GAAU,EACvBE,GAAU,EAAI9L,KAAKE,GAAM0L,EACzBG,EAAQ/L,KAAKgM,IAAIF,GACjBG,EAAQjM,KAAKC,IAAI6L,GAEdI,EAAQ,EAAGA,EAAQrL,EAAMqL,GAASN,EAIzC,IAHA,IAAIO,EAAc,EACdC,EAAc,EAETC,EAAI,EAAGA,EAAIR,EAAYQ,IAAK,CACnC,IAAMC,EAAYJ,EAAQG,EACpBE,EAAWD,EAAYT,EAEvBW,EAAWnB,EAAKiB,GAChBG,EAAWnB,EAAKgB,GAChBI,EAAUrB,EAAKkB,GACfI,EAAUrB,EAAKiB,GAEfK,EAAQF,EAAUP,EAAcQ,EAAUP,EAC1CS,EAAQH,EAAUN,EAAcO,EAAUR,EAEhDd,EAAKiB,GAAaE,EAAWI,EAC7BtB,EAAKgB,GAAaG,EAAWI,EAC7BxB,EAAKkB,GAAYC,EAAWI,EAC5BtB,EAAKiB,GAAYE,EAAWI,EAE5B,IAAMC,EAAWX,EAAcJ,EAAQK,EAAcH,EACrDG,EAAcD,EAAcF,EAAQG,EAAcL,EAClDI,EAAcW,CAChB,CAjDY,CAoDlB,OA5Dc,kGA4Db,CA5Da,89DCShB,IAGMC,GAAQC,GACZ,SAAAD,EAAYlM,EAAMoM,GAAO5H,GAAAC,KAAAyH,GACvBzH,KAAKzE,KAAOA,EACZyE,KAAK4H,SAAWrM,GAAQ,EACxByE,KAAK6H,YAActM,GAAQ,EAC3ByE,KAAK8H,QAAU9H,KAAK4H,UAAY,EAEhC,IAAMG,EAAS,EAAMrN,KAAKE,IAAO,EAAMW,GACjCyM,EAAS,EAAMtN,KAAKE,GAAMW,EAC1B0M,EAAYvN,KAAKwN,KAAKP,EAAQpM,GAEpCyE,KAAKmI,YAAc,IAAI3N,aAAawF,KAAK4H,UACzC,IAAK,IAAInN,EAAI,EAAGA,EAAIuF,KAAK6H,YAAapN,IAAK,CACzC,IAAM+L,EAAQwB,EAAQvN,EAAIsN,EAC1B/H,KAAKmI,YAAgB,EAAJ1N,GAASwN,EAAYvN,KAAKgM,IAAIF,GAC/CxG,KAAKmI,YAAgB,EAAJ1N,EAAQ,GAAKwN,EAAYvN,KAAKC,IAAI6L,EACrD,CACF,GAMW4B,GAAI,SAAAC,GACf,SAAAD,EAAY7M,EAAMoM,GAAO,OAAA5H,GAAAC,KAAAoI,GAAAE,GAAAtI,KAAAoI,EAAA,CACjB7M,EAAMoM,GACd,CAEA,OAAAY,GAAAH,EAAAC,GAAAX,GAAAU,EAAA,EAAAnI,IAAA,YAAArD,MAMA,SAAUiH,GAA2B,IAAA2E,EAAAC,EAAAC,EAApBC,EAAWxI,UAAAjD,OAAA,QAAAkD,IAAAD,UAAA,GAAAA,UAAA,GAAG,KACvByI,EACuB,QADhBJ,EACXG,aAAW,EAAXA,EAAc3I,KAAK8H,gBAAQ,IAAAU,EAAAA,EAC3BtF,EAAU,+BAAA5D,OAAgCU,KAAK8H,QAAO,kBAClD/B,EACS,QADL0C,EACRG,aAAO,EAAPA,EAAS7C,YAAI,IAAA0C,EAAAA,EACbvF,EAAU,+BAAA5D,OACuBU,KAAK8H,QAAO,uBAEzC9B,EACS,QADL0C,EACRE,aAAO,EAAPA,EAAS5C,YAAI,IAAA0C,EAAAA,EACbxF,EAAU,+BAAA5D,OACuBU,KAAK8H,QAAO,uBAGzCe,EAAK7I,KAAK6H,YACViB,EAAM,EAAID,EAEhB9C,EAAKgD,KAAK,GACV/C,EAAK+C,KAAK,GAGV,IAAK,IAAItO,EAAI,EAAGA,EAAIoO,EAAIpO,GAAK,EAAG,CAC9B,IACMuO,EAAKF,EAAMrO,EACXwO,EAAKJ,EAAKpO,EACVyO,EAAKL,EAAK,EAAIpO,EAEd0O,EAAItF,EALCiF,EAAM,EAAIrO,GAKCoJ,EAAMmF,GACtBI,EAAKvF,EAAMoF,GAAMpF,EAAMqF,GACvBG,EAAIrJ,KAAKmI,YAAY1N,GACrBoE,EAAImB,KAAKmI,YAAY1N,EAAI,GAE/BsL,EAAKtL,GAAK,GAAK0O,EAAIE,EAAID,EAAKvK,EAC5BmH,EAAKvL,GAAK,GAAK2O,EAAKC,EAAIF,EAAItK,CAC9B,CAEA,IAAK,IAAIpE,EAAIoO,EAAIpO,EAAIuF,KAAK4H,SAAUnN,GAAK,EAAG,CAC1C,IAAMoL,EAAMpL,GAAK,EAEXuO,EAAKvO,EAAIoO,EACTI,EAAKJ,EAAKpO,EACVyO,EAAK,EAAIL,EAAK,EAAIpO,EAElB0O,EAAItF,EALCiF,EAAM,EAAIrO,GAKCoJ,EAAMmF,GACtBI,EAAKvF,EAAMoF,GAAMpF,EAAMqF,GACvBG,EAAIrJ,KAAKmI,YAAY1N,GACrBoE,EAAImB,KAAKmI,YAAY1N,EAAI,GAE/BsL,EAAKF,GAAOsD,EAAIE,EAAID,EAAKvK,EACzBmH,EAAKH,GAAOuD,EAAKC,EAAIF,EAAItK,CAC3B,CAEAiH,GAAIwD,IAAIvD,EAAMC,GAId,IADA,IAAMN,EAAS,IAAI3K,aAAaiF,KAAK4H,UAC5BnN,EAAI,EAAGA,EAAIuF,KAAK8H,QAASrN,IAAK,CACrC,IAAM4O,EAAIrJ,KAAKmI,YAAgB,EAAJ1N,GACrBoE,EAAImB,KAAKmI,YAAgB,EAAJ1N,EAAQ,GAC7B8O,EAAKxD,EAAKtL,GACV2O,EAAKpD,EAAKvL,GAEhBiL,EAAW,EAAJjL,IAAU8O,EAAKF,EAAID,EAAKvK,EAC/B6G,EAAO1F,KAAK4H,SAAW,EAAQ,EAAJnN,IAAU8O,EAAK1K,EAAIuK,EAAKC,CACrD,CAEA,OAAO3D,CACT,IAAC,CA/Ec,CAAS+B,IAqFb+B,GAAK,SAAAC,GAChB,SAAAD,EAAYjO,GAAoB,IAAdoM,EAAKxH,UAAAjD,OAAA,QAAAkD,IAAAD,UAAA,GAAAA,UAAA,GAAG,KAAI,OAAAJ,GAAAC,KAAAwJ,GAAAlB,GAAAtI,KAAAwJ,EAAA,CACtBjO,EAAMoM,GAASpM,GACvB,CAEA,OAAAgN,GAAAiB,EAAAC,GAAA/B,GAAA8B,EAAA,EAAAvJ,IAAA,YAAArD,MAMA,SAAUiH,GAA2B,IAAA6F,EAAAC,EAAAC,EAApBjB,EAAWxI,UAAAjD,OAAA,QAAAkD,IAAAD,UAAA,GAAAA,UAAA,GAAG,KACvByI,EACuB,QADhBc,EACXf,aAAW,EAAXA,EAAc3I,KAAK8H,gBAAQ,IAAA4B,EAAAA,EAC3BxG,EAAU,gCAAA5D,OAAiCU,KAAK8H,QAAO,kBACnD/B,EACS,QADL4D,EACRf,aAAO,EAAPA,EAAS7C,YAAI,IAAA4D,EAAAA,EACbzG,EAAU,gCAAA5D,OACwBU,KAAK8H,QAAO,uBAE1C9B,EACS,QADL4D,EACRhB,aAAO,EAAPA,EAAS5C,YAAI,IAAA4D,EAAAA,EACb1G,EAAU,gCAAA5D,OACwBU,KAAK8H,QAAO,uBAG1Ce,EAAK7I,KAAK6H,YACViB,EAAM,EAAID,EAEhB9C,EAAKgD,KAAK,GACV/C,EAAK+C,KAAK,GAGV,IAAK,IAAItO,EAAI,EAAGA,EAAIuF,KAAK8H,QAASrN,IAAK,CACrC,IAAMuO,EAAS,EAAJvO,EACL0O,GAAKtF,EAAMmF,GACXI,GAAMvF,EAAM7D,KAAK4H,SAAW,EAAIoB,GAChCK,EAAIrJ,KAAKmI,YAAYa,GACrBnK,EAAImB,KAAKmI,YAAYa,EAAK,GAEhCjD,EAAKtL,GAAK2O,EAAKvK,EAAIsK,EAAIE,EACvBrD,EAAKvL,GAAK2O,EAAKC,EAAIF,EAAItK,CACzB,CAEAiH,GAAIwD,IAAIvD,EAAMC,GAKd,IAFA,IAAMN,EAAS,IAAI3K,aAAaiF,KAAKzE,MAE5Bd,EAAI,EAAGA,EAAIuF,KAAK8H,QAAU,EAAGrN,IAAK,CACzC,IAAMuO,EAAS,EAAJvO,EACL4O,EAAIrJ,KAAKmI,YAAYa,GACrBnK,EAAImB,KAAKmI,YAAYa,EAAK,GAC1BO,EAAKxD,EAAKtL,GACV2O,EAAKpD,EAAKvL,GAEVoP,EAAKN,EAAKF,EAAID,EAAKvK,EACnBiL,EAAKP,EAAK1K,EAAIuK,EAAKC,EAEzB3D,EAAOoD,EAAM,EAAIE,GAAMa,EACvBnE,EAAOoD,EAAME,GAAMa,EACnBnE,EAAOmD,EAAKG,GAAMc,EAClBpE,EAAOmD,EAAK,EAAIG,IAAOc,CACzB,CAEA,IAAK,IAAIrP,EAAIuF,KAAK8H,QAAU,EAAGrN,EAAIuF,KAAK8H,QAASrN,IAAK,CACpD,IAAMoL,EAA+B,GAAxBpL,EAAIuF,KAAK8H,QAAU,GAASe,EACnCG,EAAS,EAAJvO,EACL4O,EAAIrJ,KAAKmI,YAAYa,GACrBnK,EAAImB,KAAKmI,YAAYa,EAAK,GAC1BO,EAAKxD,EAAKtL,GACV2O,EAAKpD,EAAKvL,GAEVoP,EAAKN,EAAKF,EAAID,EAAKvK,EACnBiL,EAAKP,EAAK1K,EAAIuK,EAAKC,EAEzB3D,EAAOoD,EAAM,EAAIjD,GAAOgE,EACxBnE,EAAOG,EAAMgD,IAAOgB,EACpBnE,EAAOmD,EAAKhD,GAAOiE,EACnBpE,EAAO,EAAImD,EAAK,EAAIhD,GAAOiE,CAC7B,CAEA,OAAOpE,CACT,IAAC,CAnFe,CAAS+B,IAuFdsC,GAAS,IAAI3B,GPhKK,GOgKiB,IACnC4B,GAAU,IAAI5B,GAAKhO,EAAe,IAClC6P,GAAU,IAAI7B,GAAK/N,EAAgB,GAEnC6P,GAAU,IAAIV,GPpKI,GOoKmBW,KACrCC,GAAW,IAAIZ,GAAMpP,EAAeA,MACpCiQ,GAAW,IAAIb,GAAMnP,EAAgBA,MAS3C,SAASiQ,GAAWC,EAAMC,EAAMvP,GAIrC,IAHA,IAAMM,EAAOgP,EAAKrN,OACZwI,EAAS,IAAI3K,aAAoB,EAAPQ,GAEvBd,EAAI,EAAGA,EAAIc,EAAMd,IAAK,CAC7B,IAAMgQ,EAAKxP,EAAOR,GACZiQ,EAAKzP,EAAO,EAAIM,EAAO,EAAId,GAC3BkQ,EAAIJ,EAAK9P,GACT4O,EAAImB,EAAKjP,EAAO,EAAId,GAE1BiL,EAAOjL,GAAKkQ,EAAID,EAAKrB,EAAIoB,EACzB/E,EAAO,EAAInK,EAAO,EAAId,GAAKkQ,EAAIF,EAAKpB,EAAIqB,CAC1C,CAEA,OAAOhF,CACT,CCnNO,SAASkF,GAASjL,EAAckL,EAAkBrM,GACvD,IAAMtB,EAASyC,EAAazC,OACtB4N,EAAM,IAAI/Q,WAAWmD,GAC3B,GAAsB,IAAlBsB,GAA4C,IAArBqM,EAEzB,OADAC,EAAI/B,KAAK,EAAG,EAAG7L,GACR4N,EAUT,IAPA,IACMC,GAAc,GAAMvM,ERgGe,GQhGiC,EACpEwM,EAAaD,EAFC/O,EAAc6O,GAI5BI,EAAKF,EACLG,GAAMH,EAEHtQ,EAAI,EAAGA,EAAIyC,EAAQzC,IAAK,CAC/B,IAAM0Q,EAAIxL,EAAalF,GAAKuQ,EACtBI,EAAKD,GAAKA,GAAK,EAAI,IAAO,IAAQ,EACxCL,EAAIrQ,GAAK2Q,EAAIH,EAAKA,EAAKG,EAAIF,EAAKA,EAAKE,CACvC,CAEA,OAAON,CACT,CASO,SAASO,GAAWC,EAAWT,EAAkBrM,GACtD,GAAsB,IAAlBA,GAA4C,IAArBqM,EACzB,OAAO,IAAI9P,aAAauQ,EAAUpO,QAOpC,IAJA,IAAMqO,EAAcvP,EAAc6O,GAC5BE,GAAc,GAAMvM,ERoEe,GQpEiC,EAEpEgN,EAAM,IAAIzQ,aAAauQ,EAAUpO,QAC9BzC,EAAI,EAAGA,EAAI6Q,EAAUpO,OAAQzC,IACpC+Q,EAAI/Q,GAAM6Q,EAAU7Q,GAAK8Q,EAAeR,EAE1C,OAAOS,CACT,0/BCxCA,IAAMC,GAAyB,IAAIC,IAoC5B,SAASC,GAAaC,EAASC,EAAUC,EAAarK,GAK3D,IAJA,IAAMsK,EAAwB,IAAIhS,WAAW+R,GACvCE,EAAqB,IAAIjR,aAAa+Q,GACtCG,EA/BR,SAAqCC,GACnC,GAAIT,GAAuBU,IAAID,GAC7B,OAAOT,GAAuB5I,IAAIqJ,GAGpC,IAAMpB,EAAM,IAAItQ,aAAa,IAC7B,GAAa,IAAT0R,EACFpB,EAAIvK,IAAIvE,QAER,IAAK,IAAIvB,EAAI,EAAGA,EAAI,GAAIA,IACtBqQ,EAAIrQ,GAAKC,KAAKuB,IAAID,EAAcvB,GAAIyR,GAIxC,OADAT,GAAuBlL,IAAI2L,EAAMpB,GAC1BA,CACT,CAgB6BsB,CAA4B3K,GAE9ChH,EAAI,EAAGA,EAAIqR,EAAarR,IAAK,CACpC,IAAM4R,EAAmB,EAAdR,EAASpR,GACpB,GAAW,IAAP4R,EAAJ,CAEA,IAAMC,EAAMC,GAAgBX,EAAQnR,GAAI4R,GAExC,GADAN,EAAsBtR,GAAK6R,EACvBA,EAAM,EAAG,CACX,IAAME,EAAuBP,EAAmBK,GAChDN,EAAmBvR,GAA4B,EAAvB+R,EAA6BH,CACvD,CAPc,CAQhB,CAEA,IAG2C5N,EAHvCgO,EAAa,KACbC,EAAqBC,IAAQjO,EAAAC,GAED3E,GAAW,IAA3C,IAAA0E,EAAAG,MAAAJ,EAAAC,EAAAI,KAAAC,MAA6C,KAAlC6N,EAAiBnO,EAAA7B,MAC1B,KAAIgQ,EAAoBd,GAAxB,CAEA,IAAMe,EACJC,KTvE+B,GSyE/BF,EAEF,KAAIC,EAAgB,GAApB,CAEA,IAAME,EAAYC,GAChBJ,EACAf,EACAgB,EACAZ,EACAF,GAGIkB,EAAkBC,GACtBN,EACAd,EACAD,EACAkB,EAAUI,YACVJ,EAAUxO,mBACV0N,EACAD,GAGEiB,EAAkBP,IACpBA,EAAqBO,EACrBR,EAAa,CACXW,SAAUR,EACVS,WAAYN,EAAUI,YACtB5O,mBAAoBwO,EAAUxO,oBAzBX,CAPc,CAmCvC,CAAC,OAAAU,GAAAP,EAAAQ,EAAAD,EAAA,SAAAP,EAAAS,GAAA,CAED,IAAKsN,EAAY,CACf,IAAMa,EAAmBtT,EAAY,GACrC,MAAO,CACLoT,SAAUE,EACVD,WAAY,IAAItT,WAAWuT,GAC3B/O,mBAAoB,IAAIxE,WThHN,ISkHtB,CAEA,OAAO0S,CACT,CAeA,SAASS,GACPK,EACAzB,EACAD,EACAsB,EACA5O,EACA0N,EACAD,GAIA,IAFA,IAAIiB,EAAkB,EAEbxS,EAAI,EAAGA,EAAI8S,EAAgB9S,IAAK,CACvC,IAAM+S,EAAsB,EAAjBL,EAAY1S,GACjBwL,EAA8B,EAAvBlK,EAAiByR,GAC9B,GAAa,IAATvH,EAAJ,CAKA,IAAMqG,EAAM/N,EAAmB9D,GAC/B,GAAY,IAAR6R,EAKJW,GAH6BhB,EAAmBK,GACvBpQ,EAAiB+J,GAEmB4F,EAASpR,EARtE,MAFEwS,GAAmBjB,EAAmBvR,EAW1C,CAEA,IAAK,IAAIA,EAAI8S,EAAgB9S,EAAIqR,EAAarR,IAC5CwS,GAAmBjB,EAAmBvR,GAGxC,OAAOwS,CACT,CAaA,SAASD,GACPO,EACA1B,EACA4B,EACAxB,EACAF,GAQA,IANA,IAAMoB,EAAc,IAAIpT,WAAWwT,GAE7BG,EAAc,IAAI3T,WAAWwT,GAC7BI,EAAiB,IAAI5S,aAAawS,GACpCK,EAAW,EAEN5P,EAAW,EAAGA,EAAWuP,EAAgBvP,IAAY,CAE5D,GAAW,KADqB,EAArB6N,EAAS7N,IACpB,CAEA,IAAMsO,EAAMP,EAAsB/N,GAClC,GAAY,IAARsO,EAAJ,CAEA,IAAMuB,EAAYxR,EAAuB,GACzC,KAAIwR,GAAa,GAAjB,CAEA,IAAMC,EACJ7B,EAAmBK,GAAOhQ,EAAyB,GAErDoR,EAAYE,GAAY5P,EACxB2P,EAAeC,GAAYE,EAAkBD,EAC7CD,GAPoB,CAHL,CAHD,CAchB,CAEA,GAAiB,IAAbA,EACF,MAAO,CAAET,YAAAA,EAAa5O,mBAAoBwN,GAI5C,IAAK,IAAItR,GAAKmT,GAAY,GAAK,EAAGnT,GAAK,EAAGA,IACxCsT,GAASL,EAAaC,EAAgBlT,EAAGmT,GAI3C,KAAOH,EAAgB,GAAKG,EAAW,GAAG,CACxC,IAAMI,EAAMN,EAAY,GAClBO,EAAyB,EAAnBd,EAAYa,GAClB3B,EAAqB,EAAhBR,EAASmC,GAEdE,EADY7R,EAAuB4R,GAChB5B,EAEzB,GAAI6B,EAAOT,GAAiBS,GAAQ,EAApC,CACE,IAAMC,EAAOP,EAAW,EACxBF,EAAY,GAAKA,EAAYS,GAC7BR,EAAe,GAAKA,EAAeQ,KACnCP,EACe,GAAGG,GAASL,EAAaC,EAAgB,EAAGC,EAE7D,KAPA,CASAH,GAAiBS,EACjB,IAAME,EAAMH,EAAM,EAClBd,EAAYa,GAAOI,EAEnB,IAAMC,EAAgBhS,EAAuB+R,GAC7C,GAAIA,EAAMtS,GAAyBuS,EAAgB,EAAG,CACpD,IACMP,EACJ7B,EAFUF,EAAsBiC,IAEN1R,EAAyB8R,GACrDT,EAAe,GAAKG,EAAkBO,EACtCN,GAASL,EAAaC,EAAgB,EAAGC,EAC3C,KAAO,CACL,IAAMO,EAAOP,EAAW,EACxBF,EAAY,GAAKA,EAAYS,GAC7BR,EAAe,GAAKA,EAAeQ,KACnCP,EACe,GAAGG,GAASL,EAAaC,EAAgB,EAAGC,EAC7D,CAnBA,CAoBF,CAEA,MAAO,CAAET,YAAAA,EAAa5O,mBAAoBwN,EAC5C,CASO,SAASQ,GAAgB5M,EAAczC,GAE5C,IADA,IAAIoR,EAAe,EACV7T,EAAI,EAAGA,EAAIyC,EAAQzC,IAAK,CAC/B,IAAM8T,EAAI7T,KAAK8T,IAAI7O,EAAalF,IAC5B8T,EAAID,IAAcA,EAAeC,EACvC,CACA,GAAqB,IAAjBD,EAAoB,OAAO,EAC/B,IAAMG,EAAQ/T,KAAKgU,KAAK,GAAKhU,KAAKwL,KAAKoI,GAAgB,KACvD,OAAO5T,KAAKkI,IAAI,EAAGlI,KAAK2C,IAAI,GAAIoR,GAClC,CAeA,SAASV,GAASL,EAAaC,EAAgBgB,EAAYf,GAKzD,IAJA,IAAInT,EAAIkU,EACFC,EAASlB,EAAYjT,GACrBoU,EAAQlB,EAAelT,KAEhB,CACX,IAAMqU,EAAe,GAAVrU,GAAK,GACV0O,EAAI2F,EAAI,EACVC,EAAOtU,EACPuU,EAAOH,EASX,GAPIC,EAAIlB,GAAYD,EAAemB,GAAKE,IACtCD,EAAOD,EACPE,EAAOrB,EAAemB,IAEpB3F,EAAIyE,GAAYD,EAAexE,GAAK6F,IACtCD,EAAO5F,GAEL4F,IAAStU,EAAG,MAEhBiT,EAAYjT,GAAKiT,EAAYqB,GAC7BpB,EAAelT,GAAKkT,EAAeoB,GACnCtU,EAAIsU,CACN,CAEArB,EAAYjT,GAAKmU,EACjBjB,EAAelT,GAAKoU,CACtB,+zBC9UO,IAAMI,GAAUvH,GACrB,SAAAuH,iGAAclP,CAAAC,KAAAiP,GAEZjP,KAAKkP,iBAAmB,CACtB,GAAI,IAAInU,aAAa,IACrB,IAAK,IAAIA,aAAa,KACtB,IAAK,IAAIA,aAAa,KACtB,IAAK,IAAIA,aAAa,MAIxBiF,KAAKwE,eAAiB,CACpBI,MAAO,CACL,IAAK,IAAI7J,aAAaF,KACtB,IAAK,IAAIE,aAAaF,KACtB,IAAK,IAAIE,aAAaF,MAExBsU,cAAe,CACb,IAAK,IAAIpU,aAAaqU,KACtB,IAAK,IAAIrU,aAAaqU,OAK1BpP,KAAKqP,UAAY,CACfxK,QAAS,IAAI9J,aAAaF,GAC1ByU,QAAS,IAAIvU,aAAaF,GAC1BiK,SAAU,IAAI/J,aVqCe,KUjC/BiF,KAAKuP,mBAAqB,CACxB,IAAIxU,aAAa,IACjB,IAAIA,aAAa,IACjB,IAAIA,aAAa,MAInBiF,KAAK2I,YAAc,CACjB,GAAI,CACF5C,KAAM,IAAIhL,aAAa,IACvBiL,KAAM,IAAIjL,aAAa,KAEzB,GAAI,CACFgL,KAAM,IAAIhL,aAAa,IACvBiL,KAAM,IAAIjL,aAAa,KAEzB,IAAK,CACHgL,KAAM,IAAIhL,aAAa,KACvBiL,KAAM,IAAIjL,aAAa,OAK3BiF,KAAKwP,YAAc,CACjB,IAAIzU,aAAa,IACjB,IAAIA,aAAa,IACjB,IAAIA,aAAa,KAInBiF,KAAKyP,aAAe,CAClB,IAAI1U,aAAa,KACjB,IAAIA,aAAa,KACjB,IAAIA,aAAa,MAInBiF,KAAKkE,gBAAkB,CACrB,GAAI,IAAInJ,aAAa,IACrB,IAAK,IAAIA,aAAa,KACtB,IAAK,IAAIA,aAAa,KAE1B,GCpCK,SAAS2U,GAAgBC,EAAeC,EAAYC,GAEzD,IAAKD,EAAY,OAAO,EAGxB,IAAME,EAcR,SAAmCH,EAAeC,GAEhD,IAAMG,EA2BR,SAA+BJ,EAAeC,GAI5C,IAHA,IAAII,EAAO,EACPC,EAAgB,EAEXxV,EAAI,EAAGA,EAAIkV,EAAczS,OAAQzC,IAAK,CAC7C,IAAMyV,EAAaxV,KAAK8T,IAAImB,EAAclV,IAIpC0V,EAAOD,EAHGxV,KAAK8T,IAAIoB,EAAWnV,IAIhC0V,EAAO,IACTH,GAAQG,GAGVF,GAAiBC,EAAaA,CAChC,CAGA,IAAME,EAAgB1V,KAAKwN,KAAK+H,IAAkB,KAClD,OAAOD,EAAOI,CAChB,CA/CuBC,CAAsBV,EAAeC,GAGpDU,EAAkBC,GAA0BZ,GAC5Ca,EAAeD,GAA0BX,GACzCa,EAAiB/V,KAAK8T,IAAI8B,EAAkBE,GAG5CE,EAAiBC,GAA4BhB,GAC7CiB,EAAcD,GAA4Bf,GAC1CiB,EAAWnW,KAAK8T,IAAIkC,EAAiBE,GAGrCE,EA8FR,SAA+BnB,EAAeC,GAI5C,IAHA,IAAIK,EAAgB,EAChBc,EAAa,EAERtW,EAAI,EAAGA,EAAIkV,EAAczS,OAAQzC,IACxCwV,GAAiBN,EAAclV,GAAKkV,EAAclV,GAClDsW,GAAcnB,EAAWnV,GAAKmV,EAAWnV,GAI3CwV,EAAgBvV,KAAKkI,IAAIqN,EAAe,OACxCc,EAAarW,KAAKkI,IAAImO,EAAY,OAElC,IAAMC,EAAW,GAAKtW,KAAKuW,MAAMhB,EAAgBc,GAGjD,OAAOrW,KAAKkI,IAAI,EAAGoO,EACrB,CA/GuBE,CAAsBvB,EAAeC,GAE1D,MAAO,CACLG,aAAAA,EACAU,eAAAA,EACAI,SAAAA,EACAC,aAAAA,EAEJ,CArCmBK,CAA0BxB,EAAeC,GAGpDwB,EAiJR,SAAiCtB,GAC/B,IAAQC,EAAyDD,EAAzDC,aAAcU,EAA2CX,EAA3CW,eAAgBI,EAA2Bf,EAA3Be,SAAUC,EAAiBhB,EAAjBgB,aAI1CO,EAAmBtB,EAKnBuB,EAAuB5W,KAAKwN,KAAKuI,GAIjCc,EAAiB7W,KAAK8W,MAAiB,GAAXX,GAAiBnW,KAAK8W,MAAM,IAIxDC,EAAqB/W,KAAK2C,IAAIyT,EAAe,GAAI,GAIvD,OACGO,EACCC,EACAC,EACAE,GACF,CAEJ,CA9KyBC,CAAwB5B,GAE/C,OAAOsB,EAAiBvB,CAC1B,CAiEA,SAASU,GAA0BoB,GAMjC,IALA,IACIC,EAAS,EACTC,EAAY,EACZC,EAAY,EAEPrX,EAAI,EAAGA,EAAIkX,EAAOzU,OAAQzC,IAAK,CACtC,IAAMsX,EAAYrX,KAAK8T,IAAImD,EAAOlX,IAC9BsX,EAPU,QAQZH,GAAUlX,KAAKsX,IAAID,GACnBF,GAAaE,EACbD,IAEJ,CAEA,GAAkB,IAAdA,EAAiB,OAAO,EAE5B,IAAMG,EAAgBvX,KAAKwX,IAAIN,EAASE,GAClCK,EAAiBN,EAAYC,EAEnC,OAAOK,EAnBS,MAmBkBF,EAAgBE,EAAiB,CACrE,CAQA,SAASxB,GAA4BgB,GAKnC,IAJA,IAAMS,EAAW1X,KAAKqC,MAAM4U,EAAOzU,OAAS,GACxCmV,EAAY,EACZC,EAAa,EAER7X,EAAI,EAAGA,EAAI2X,EAAU3X,IAC5B4X,GAAaV,EAAOlX,GAAKkX,EAAOlX,GAGlC,IAAK,IAAIA,EAAI2X,EAAU3X,EAAIkX,EAAOzU,OAAQzC,IACxC6X,GAAcX,EAAOlX,GAAKkX,EAAOlX,GAGnC,IAAM8X,EAAcF,EAAYC,EAChC,OAAOC,EAAc,EAAID,EAAaC,EAAc,CACtD,CC3GO,SAASC,GAAiBnP,GAAS,IAAAoP,EAClCC,EACe,QADLD,EACdpP,aAAO,EAAPA,EAASqP,kBAAU,IAAAD,EAAAA,EACnBvP,EAAW,4CACPyP,EAASD,EAAWrD,UAQ1B,OAAO,SAACuD,GACN,IAAMC,EAASzO,EACbwO,EACAD,EAAO9N,QACP6N,EAAWlO,gBAEbmO,EAAO9N,QAAUgO,EAAO3N,SAExB,IAAM4N,EAAS1O,EACbyO,EAAOhO,QACP8N,EAAOrD,QACPoD,EAAWlO,gBAEbmO,EAAOrD,QAAUwD,EAAO5N,SAExB,IAAM6N,EACJL,EAAWlO,eAAe2K,cAAc0D,EAAO/N,SAAS5H,QAC1D6V,EAAYxS,IAAIoS,EAAO7N,UACvBiO,EAAYxS,IAAIsS,EAAO/N,SAAU6N,EAAO7N,SAAS5H,QAEjD,IAAM4H,EAAWiO,EAAY5N,MAAM,EAAG0N,EAAO/N,SAAS5H,QAGtD,OAFAyV,EAAO7N,SAAWiO,EAAY5N,MAAM0N,EAAO/N,SAAS5H,QAE7C,CACL8V,MAAO,CAACF,EAAOjO,QAASiO,EAAOhO,SAAUA,GAE7C,CACF,CAeO,SAASmO,GAAmB5P,GAAS,IAAA6P,EAAAC,EACpCT,EACe,QADLQ,EACd7P,aAAO,EAAPA,EAASqP,kBAAU,IAAAQ,EAAAA,EACnBhQ,EAAW,8CACP9B,EACY,QADL+R,EACX9P,aAAO,EAAPA,EAASjC,eAAO,IAAA+R,EAAAA,EAAIjQ,EAAW,2CAUjC,OAAO,SAACW,GACN,IAGIzF,EAHI4U,EAAUnP,EAAVmP,MAIR,GAAI5R,EAAQM,gBACVtD,EAAagD,EAAQM,oBAChB,CACL,IAAM0R,EAAW,CZxBK,IACA,IACC,KYuBvBhV,EAAa4U,EAAMrP,IAAI,SAAC0P,EAAaC,GACnC,IAAM3B,EDvHP,SAAoB4B,EAASzL,GAClC,IAAM/B,EAAO,IAAIhL,aAAa+M,GACxB9B,EAAO,IAAIjL,aAAa+M,GAGxB0L,EAAU9Y,KAAK2C,IAAIkW,EAAQrW,OAAQ4K,GACzC/B,EAAKxF,IAAIgT,EAAQ5S,SAAS,EAAG6S,IAG7B1N,GAAIwD,IAAIvD,EAAMC,GAId,IADA,IAAM+L,EAAY,IAAIhX,aAAa+M,EAAU,GACpCrN,EAAI,EAAGA,EAAIqN,EAAU,EAAGrN,IAC/BsX,EAAUtX,GAAKC,KAAKwN,KAAKnC,EAAKtL,GAAKsL,EAAKtL,GAAKuL,EAAKvL,GAAKuL,EAAKvL,IAG9D,OAAOsX,CACT,CCqGuB0B,CAAWJ,EAAaD,EAASE,IAC1CI,EAAYhE,GAChBiC,EACAe,EAAWnD,mBAAmB+D,GAC9BlS,EAAQE,uBAGV,OADAoR,EAAWnD,mBAAmB+D,GAAa3B,EACpC+B,EAAYhZ,KAAKkI,IAAI0Q,EAAY,EAAG,EAC7C,EACF,CAEA,MAAO,CACLN,MAAAA,EACA5U,WAAAA,EAEJ,CACF,CAkBO,SAASuV,GAAUtQ,GAAS,IAAAuQ,EAC3BlB,EACe,QADLkB,EACdvQ,aAAO,EAAPA,EAASqP,kBAAU,IAAAkB,EAAAA,EAAI1Q,EAAW,qCAC9B2Q,EAAiBnB,EAAWlD,YAG5BsE,EAAkB,CAAC9J,GAASA,GAASC,IAW3C,SAAS8J,EACPR,EACAD,EACAU,EACAC,EACAvB,GAEA,IAAMwB,EAAS5Y,EAAkBgY,GAIjC,OAFkC,IAAdU,EAgCtB,SACET,EACAD,EACAY,EACAC,EACAF,EACAvB,GAEA,IAAM0B,EAAyB,IAAdd,EAAkBjZ,EAAiBD,EAC9Cia,EAAY3B,EAAWxD,iBAAiBkF,GAC9CC,EAAUtL,KAAK,GAGfsL,EAAU9T,IAAI0T,EAAeC,EAAO1Y,aAGpC8Y,EAAmBf,EAASU,EAAeC,EAAO3Y,MAGlD8Y,EAAU9T,IAAIgT,EAASW,EAAO1Y,YZ7HD,IYgI7B,IAAIyI,EAAWkQ,EAAcI,UAAUF,EAAW3B,EAAW/J,aAGzD2K,EAAY,IACdrP,EAAWD,EAAgBC,EAAUyO,EAAWxO,kBAGlD,OAAOD,CACT,CA3DWuQ,CACLjB,EACAD,EACAY,EAPkBJ,EAAgBR,GASlCW,EACAvB,GAgEN,SACEa,EACAD,EACAY,EACAD,EACAvB,GAKA,IAHA,IAAM+B,EAAY,IAAsB,MAAhBP,EAAO3Y,KAAe,EAAI,GAC5CmK,EAAS,IAAI3K,aAAamZ,EAAO3Y,MAE9BmZ,EAAQ,EAAGA,EAAQD,EAAWC,IAAS,CAC9C,IAAMC,EAAaD,EAAQjZ,EACrBmZ,EAAerB,EAAQ5S,SAC3BgU,EACAA,EAAalZ,GAIT4Y,EAAY3B,EAAWxD,iBZxOJ,IYyOzBmF,EAAUtL,KAAK,GACfsL,EAAU9T,IAAI0T,EAAe,GAG7BK,EAAmBM,EAAcX,EAAexY,GAChD4Y,EAAU9T,IAAIqU,EAAclZ,GAG5B,IAAIuI,EAAW8F,GAAOwK,UAAUF,EAAW3B,EAAW/J,aAGlD2K,EAAY,IACdrP,EAAWD,EAAgBC,EAAUyO,EAAWxO,kBAGlDwB,EAAOnF,IAAI0D,EAAU0Q,EACvB,CAEA,OAAOjP,CACT,CAnGWmP,CACLtB,EACAD,EACAY,EACAD,EACAvB,EAGN,CA6FA,SAAS4B,EAAmBf,EAASU,EAAea,GAElD,IADA,IAAMC,EAAYD,EAAYpZ,EACrBjB,EAAI,EAAGA,EAAIiB,EAAmBjB,IAAK,CAC1C,IAAMua,EAAYzB,EAAQwB,EAAYta,GACtCwZ,EAAcxZ,GAAKH,EAAaG,GAAKua,EACrCzB,EAAQwB,EAAYta,GAAKua,EAAY1a,EAAa,GAAKG,EACzD,CACF,CAcA,OAAO,SAACoJ,GACN,IAAQmP,EAAqCnP,EAArCmP,MAAO5U,EAA8ByF,EAA9BzF,WAAY6W,EAAkBpR,EAAlBoR,cACrBtV,EAAe,IAAI5E,aAAa,KAetC,OAbAiY,EAAMkC,QAAQ,SAAC7B,EAAaC,GAC1B,IAAM6B,EAAcpB,EAClBV,EACAC,EACAlV,EAAWkV,GACXO,EAAeP,GACfZ,GAGIzN,ER/RL,SAA6BqO,GAClC,OAAqB,IAAdA,EAAkB,EAAkB,IAAdA,EAAkB,IAAM,GACvD,CQ6RqB8B,CAAoB9B,GACnC3T,EAAaY,IAAI4U,EAAalQ,EAChC,GAEO,CAAE+N,MAAAA,EAAOrT,aAAAA,EAAcvB,WAAAA,EAAY6W,cAAAA,EAC5C,CACF,CAgBO,SAASI,GAAkBhS,GAAS,IAAAiS,EACnClU,EACY,QADLkU,EACXjS,aAAO,EAAPA,EAASjC,eAAO,IAAAkU,EAAAA,EAAIpS,EAAW,0CAcjC,OAAO,SAACW,GAqBN,IApBA,IAAQlE,EAA6BkE,EAA7BlE,aAAcvB,EAAeyF,EAAfzF,WAEtBmX,EJtRG,SAAuB5V,EAAcvB,GAO1C,IANA,IAAMwN,EAAU,GACVC,EAAW,GAEb2J,EAAa,EACbxX,EAAW,EAENyX,EAAO,EAAGA,EAAO,EAAGA,IAAQ,CAOnC,IANA,IAAMC,EAAYF,EACZG,EAAoB,IAATF,EAAa,IAAM,IAC9BG,EAAUH,EAAO,EAAIxb,EAAoBwb,GAAQ3b,EAAcoD,OAE/D2Y,EADmC,IAArBzX,EAAWqX,GACMvb,EAAiBC,EAE/C6D,EAAW4X,GAAS,CACzB,IAAMra,EAAOzB,EAAckE,GACrB8X,EAAWD,EAAe7X,GAAY0X,EACtCK,EAASD,EAAWva,EACpByS,EAAM,IAAIjT,aAAaQ,GAE7B,GAAIua,GAAY,GAAKC,GAAUJ,EAC7B3H,EAAIzN,IAAIZ,EAAagB,SAAS+U,EAAYI,EAAUJ,EAAYK,SAGhE,GADA/H,EAAIjF,KAAK,GACL+M,EAAWH,GAAYI,EAAS,EAAG,CACrC,IAAMC,EAAWtb,KAAKkI,IAAI,EAAGkT,GACvBG,EAASvb,KAAK2C,IAAIsY,EAAUI,GAClC/H,EAAIzN,IACFZ,EAAagB,SAAS+U,EAAYM,EAAUN,EAAYO,GACxDvb,KAAKkI,IAAI,GAAIkT,GAEjB,CAGFlK,EAAQ/L,KAAKmO,GACbnC,EAAShM,KAAKtE,GACdyC,GACF,CAEAwX,GAAcG,CAChB,CAEA,MAAO,CAAE/J,QAAAA,EAASC,SAAAA,EAAUuB,SAAUpP,EACxC,CI2O4CkY,CACtCvW,EACAvB,GAFMwN,EAAO2J,EAAP3J,QAASC,EAAQ0J,EAAR1J,SAKjBsK,EAIIxK,GAAaC,EAASC,EATS0J,EAARnI,SASmBhM,EAAQK,gBAH1C2U,EAAgBD,EAA1B/I,SACAC,EAAU8I,EAAV9I,WACA9O,EAAkB4X,EAAlB5X,mBAGI8X,EAA0BhJ,EAAWlI,MAAM,EAAGiR,GAC9CE,EAA2B/X,EAAmB4G,MAClD,EACAiR,GAEIxX,EAAwB,GAErBoP,EAAM,EAAGA,EAAMoI,EAAkBpI,IAAO,CAC/C,IAAMuI,EAAO3K,EAAQoC,GAAKrN,SAAS,EAAGkL,EAASmC,IACzCwI,EAAaH,EAAwBrI,GACrCxP,EAAgBzC,EAAiBya,GACjClL,EAAYV,GAAS2L,EAAMhY,EAAmByP,GAAMxP,GAC1DI,EAAsBiB,KAAKyL,EAC7B,CAEA,MAAO,CACLpN,KAAMkY,EACN7X,mBAAoB+X,EACpBhY,kBAAmB+X,EACnBzX,sBAAAA,EACAR,WAAAA,EAEJ,CACF,CAoBO,SAASsC,KAKd,OAAO0C,EADS,CAAEhC,QAHXjB,UAAAjD,OAAA,QAAAkD,IAAAD,UAAA,GAAAA,UAAA,GAAG,IAAIgB,EAGauR,WAFjBvS,UAAAjD,OAAA,QAAAkD,IAAAD,UAAA,GAAAA,UAAA,GAAG,IAAI8O,IAKfuD,GACAS,GACAU,GACA0B,GAEJ,CC9YO,SAASoB,KAad,OAAO,SAAC5Y,GAUN,IATA,IAAM8B,EAAe,IAAI5E,aAAa,KAEpCmD,EAKEL,EALFK,KACAK,EAIEV,EAJFU,mBACAD,EAGET,EAHFS,kBACAM,EAEEf,EAFFe,sBACAR,EACEP,EADFO,WAGO4P,EAAM,EAAGA,EAAM9P,EAAM8P,IAAO,CACnC,IAAMxP,EAAgBzC,EAAiBuC,EAAkB0P,IAErDyH,EAAO,EACPzH,GAAO/T,EAAoB,KAAIwb,EAAO,GACtCzH,GAAO/T,EAAoB,KAAIwb,EAAO,GAE1C,IACMiB,EADmC,IAArBtY,EAAWqX,GACAvb,EAAe8T,GAAO7T,EAAgB6T,GAErE,GAAIxP,EAAgB,EAAG,CACrB,IACMmY,EAActL,GADFzM,EAAsBoP,GAGtCzP,EAAmByP,GACnBxP,GAEFmB,EAAaY,IAAIoW,EAAaD,EAChC,CACF,CAEA,MAAO,CAAE/W,aAAAA,EAAcvB,WAAAA,EACzB,CACF,CAkBO,SAASwY,GAAWvT,GAAS,IAAAoP,EAC5BC,EACe,QADLD,EACdpP,aAAO,EAAPA,EAASqP,kBAAU,IAAAD,EAAAA,EAAIvP,EAAW,sCAC9B2Q,EAAiBnB,EAAWjD,aAG5BqE,EAAkB,CAAC1J,GAAUA,GAAUC,IAY7C,SAAS0J,EACPpC,EACA2B,EACAU,EACAC,EACAvB,EACAwB,GAKA,OAHkC,IAAdF,EAiCtB,SACErC,EACA2B,EACAW,EACAvB,EACAwB,EACAC,GAGA,IAAI0C,EAAalF,EACb2B,EAAY,IACduD,EAAa7S,EAAgB2N,EAAQe,EAAWxO,kBAIlD,IAAM4S,EAAM3C,EAAcI,UAAUsC,EAAYnE,EAAW/J,aACrDoO,EAAWD,EAAI5Z,OAAS,EAGxB8Z,EAAStE,EAAWxD,iBAAiB7U,KAC3C2c,EAAOjO,KAAK,GAGZ,IAAK,IAAItO,EAAI,EAAGA,EAAIyZ,EAAO3Y,KAAMd,IAC/Buc,EAAOvc,GAAKqc,EAAIC,EAAWtc,GAI7B,IAAMwc,EAAUhD,EAAc9O,MACd,EAAd+O,EAAO3Y,KAAWI,EACJ,EAAduY,EAAO3Y,MAEH2b,EAAU5M,GACd2M,EAAQ9R,MAAM,EAAGxJ,GACjBqb,EAAO7R,MAAM,EAAGxJ,GAChBrB,GAGF2Z,EAAc1T,IAAI2W,EAAS,GAG3B,IAAK,IAAIzc,EAAI,EAAGA,EAAIkB,EAAuBlB,IACzCwc,EAAQxc,GAAKuc,EAAOrb,EAAwBlB,GAK9C,IADA,IAAM+Y,EAAwB,IAAdF,EAAkB,IAAM,IAC/B7Y,EAAI,EAAGA,EAAI+Y,EAAS/Y,IAC3BwZ,EAAc,GAAKxZ,GAAKuc,EAAOrb,EAAwBlB,GAIzD,IAAK,IAAIA,EAAI,EAAGA,EAAIkB,EAAuBlB,IACzCwZ,EAA4B,EAAdC,EAAO3Y,KAAWI,EAAwBlB,GACtDuc,EAAO9C,EAAO3Y,KAAOI,EAAwBlB,GAGjD,OAAOwZ,EAAc9O,MAAM,EAAG+O,EAAO3Y,KACvC,CAvFW4b,CACLxF,EACA2B,EACAW,EACAvB,EACAwB,EARkBJ,EAAgBR,IAqGxC,SACE3B,EACA2B,EACAW,EACAvB,EACAwB,GAEA,IAAMO,EAAY,IAAsB,MAAhBP,EAAO3Y,KAAe,EAAI,GAC5Cyb,EAAStE,EAAWxD,iBAAiB7U,KAC3C2c,EAAOjO,KAAK,GAUZ,IARA,IAAMkO,EAAUhD,EAAc9O,MACd,EAAd+O,EAAO3Y,KAAWI,EACJ,EAAduY,EAAO3Y,MAGLqL,EAAQ,EACRwQ,EAAM,EAED1C,EAAQ,EAAGA,EAAQD,EAAWC,IAAS,CAE9C,IAAImC,EAAalF,EAAOxM,MAAMiS,EAAKA,EAAM3b,GAGrC6X,EAAY,IACduD,EAAa7S,EAAgB6S,EAAYnE,EAAWxO,kBAQtD,IAJA,IAAM4S,EAAM5M,GAAQqK,UAAUsC,EAAYnE,EAAW/J,aAC/CoO,EAAWD,EAAI5Z,OAAS,EAGrBzC,EAAI,EAAGA,EAAIgB,EAAuBhB,IACzCuc,EAAOpQ,EAAQnM,GAAKqc,EAAIC,EAAWtc,GAIrC,IAAMyc,EAAU5M,GACd2M,EAAQ9R,MAAM,EAAGxJ,GACjBqb,EAAO7R,MAAMyB,EAAOA,EAAQjL,GAC5BrB,GAGF2Z,EAAc1T,IAAI2W,EAAStQ,GAG3B,IAAK,IAAInM,EAAI,EAAGA,EAAIkB,EAAuBlB,IACzCwc,EAAQxc,GAAKuc,EAAOpQ,EAAQjL,EAAwBlB,GAGtDmM,GAASnL,EACT2b,GAAO3b,CACT,CAGA,IAAK,IAAIhB,EAAI,EAAGA,EAAIkB,EAAuBlB,IACzCwZ,EAA4B,EAAdC,EAAO3Y,KAAWI,EAAwBlB,GACtDuc,EAAO9C,EAAO3Y,KAAOI,EAAwBlB,GAGjD,OAAOwZ,EAAc9O,MAAM,EAAG+O,EAAO3Y,KACvC,CAvJW8b,CACL1F,EACA2B,EACAW,EACAvB,EACAwB,EAGN,CAwJA,OAAO,SAACrQ,GACN,IAAQlE,EAA6BkE,EAA7BlE,aAAcvB,EAAeyF,EAAfzF,WAEtB,OAAO9C,EAAkBqI,IAAI,SAACuQ,EAAQZ,GACpC,IAAMgE,ET5PL,SAAiC3X,EAAc2T,GACpD,IAAMiE,EAAU,CAAC,EAAG,IAAK,IAAK,KAC9B,OAAO5X,EAAagB,SAAS4W,EAAQjE,GAAYiE,EAAQjE,EAAY,GACvE,CSyPyBkE,CAAwB7X,EAAc2T,GACzD,OAAOS,EACLuD,EACAhE,EACAlV,EAAWkV,GACXO,EAAeP,GACfZ,EACAwB,EAEJ,EACF,CACF,CAmBO,SAASuD,GAAkBpU,GAAS,IAAA6P,EACnCR,EACe,QADLQ,EACd7P,aAAO,EAAPA,EAASqP,kBAAU,IAAAQ,EAAAA,EACnBhQ,EAAW,6CACPyP,EAASD,EAAWrD,UAO1B,OAAO,SAAC2D,GAEN,IAAMD,EAAcL,EAAWlO,eAAe2K,cAAc6D,EAAM,GAAG9V,QACrE6V,EAAYxS,IAAIoS,EAAO7N,UACvBiO,EAAYxS,IAAIyS,EAAM,GAAIL,EAAO7N,SAAS5H,QAE1C,IAAM4H,EAAWiO,EAAY5N,MAAM,EAAqB,EAAlB6N,EAAM,GAAG9V,QAC/CyV,EAAO7N,SAAWiO,EAAY5N,MAAwB,EAAlB6N,EAAM,GAAG9V,QAG7C,IAAM4V,EAAS1N,GACb4N,EAAM,GACNA,EAAM,GACNL,EAAOrD,QACPoD,EAAWlO,gBAEbmO,EAAOrD,QAAUwD,EAAO5N,SAGxB,IAAM2N,EAASzN,GACb0N,EAAOpN,OACPZ,EACA6N,EAAO9N,QACP6N,EAAWlO,gBAIb,OAFAmO,EAAO9N,QAAUgO,EAAO3N,SAEjB2N,EAAOnN,MAChB,CACF,CAmBO,SAASzE,KAEd,OAAOmC,EADS,CAAEsP,WADavS,UAAAjD,OAAA,QAAAkD,IAAAD,UAAA,GAAAA,UAAA,GAAG,IAAI8O,IAEjBwH,GAAqBG,GAAYa,GACxD,0hGCzZA,IAAAvY,EAAAwY,EAAAvO,EAAA,mBAAAwO,OAAAA,OAAA,GAAA7Y,EAAAqK,EAAAyO,UAAA,aAAAC,EAAA1O,EAAA2O,aAAA,yBAAArd,EAAA0O,EAAArK,EAAA+Y,EAAApd,GAAA,IAAA4O,EAAAvK,GAAAA,EAAAiZ,qBAAAC,EAAAlZ,EAAAkZ,EAAAC,EAAA5V,OAAA6V,OAAA7O,EAAA0O,WAAA,OAAAI,GAAAF,EAAA,mBAAA9O,EAAArK,EAAA+Y,GAAA,IAAApd,EAAA4O,EAAA4O,EAAA9Y,EAAA,EAAAwL,EAAAkN,GAAA,GAAAzM,GAAA,EAAAgN,EAAA,CAAAzN,EAAA,EAAA7L,EAAA,EAAAuZ,EAAAnZ,EAAAqP,EAAA+J,EAAAnZ,EAAAmZ,EAAAC,KAAArZ,EAAA,GAAAoZ,EAAA,SAAAZ,EAAAvO,GAAA,OAAA1O,EAAAid,EAAArO,EAAA,EAAA4O,EAAA/Y,EAAAkZ,EAAAtZ,EAAAqK,EAAAoF,CAAA,YAAA+J,EAAAnP,EAAArK,GAAA,IAAAuK,EAAAF,EAAA8O,EAAAnZ,EAAA4Y,EAAA,GAAAtM,GAAAjM,IAAA0Y,GAAAH,EAAA/M,EAAAzN,OAAAwa,IAAA,KAAAG,EAAApd,EAAAkQ,EAAA+M,GAAAY,EAAAF,EAAAzN,EAAAmE,EAAArU,EAAA,GAAA0O,EAAA,GAAA0O,EAAA/I,IAAAhQ,KAAAmZ,EAAAxd,GAAA4O,EAAA5O,EAAA,OAAA4O,EAAA,MAAA5O,EAAA,GAAAA,EAAA,GAAAyE,GAAAzE,EAAA,IAAA6d,KAAAT,EAAA1O,EAAA,GAAAmP,EAAA7d,EAAA,KAAA4O,EAAA,EAAA+O,EAAAC,EAAAvZ,EAAAsZ,EAAAtZ,EAAArE,EAAA,IAAA6d,EAAAxJ,IAAA+I,EAAA1O,EAAA,GAAA1O,EAAA,GAAAqE,GAAAA,EAAAgQ,KAAArU,EAAA,GAAA0O,EAAA1O,EAAA,GAAAqE,EAAAsZ,EAAAtZ,EAAAgQ,EAAAzF,EAAA,OAAAwO,GAAA1O,EAAA,SAAAoF,EAAA,MAAAnD,GAAA,EAAAtM,CAAA,iBAAA+Y,EAAAlN,EAAAmE,GAAA,GAAA3P,EAAA,QAAAqZ,UAAA,oCAAApN,GAAA,IAAAT,GAAA2N,EAAA3N,EAAAmE,GAAAzF,EAAAsB,EAAAsN,EAAAnJ,GAAA4I,EAAArO,EAAA,EAAAnK,EAAA+Y,KAAA7M,GAAA,CAAA3Q,IAAA4O,EAAAA,EAAA,GAAAA,EAAA,IAAA+O,EAAAtZ,GAAA,GAAAwZ,EAAAjP,EAAA4O,IAAAG,EAAAtZ,EAAAmZ,EAAAG,EAAAC,EAAAJ,GAAA,OAAA9Y,EAAA,EAAA1E,EAAA,IAAA4O,IAAAwO,EAAA,QAAAH,EAAAjd,EAAAod,GAAA,MAAAH,EAAAA,EAAAe,KAAAhe,EAAAwd,IAAA,MAAAO,UAAA,wCAAAd,EAAA3Y,KAAA,OAAA2Y,EAAAO,EAAAP,EAAA9a,MAAAyM,EAAA,IAAAA,EAAA,YAAAA,IAAAqO,EAAAjd,EAAA,SAAAid,EAAAe,KAAAhe,GAAA4O,EAAA,IAAA4O,EAAAO,UAAA,oCAAAX,EAAA,YAAAxO,EAAA,GAAA5O,EAAAyE,CAAA,UAAAwY,GAAAtM,EAAAgN,EAAAtZ,EAAA,GAAAmZ,EAAA9O,EAAAsP,KAAA3Z,EAAAsZ,MAAA7J,EAAA,YAAAmJ,GAAAjd,EAAAyE,EAAAmK,EAAA,EAAA4O,EAAAP,CAAA,SAAAvY,EAAA,UAAAvC,MAAA8a,EAAA3Y,KAAAqM,EAAA,GAAAjC,EAAA0O,EAAApd,IAAA,GAAAwd,CAAA,KAAA1J,EAAA,YAAAyJ,IAAA,UAAAU,IAAA,UAAAC,IAAA,CAAAjB,EAAArV,OAAAuW,eAAA,IAAAvP,EAAA,GAAAvK,GAAA4Y,EAAAA,EAAA,GAAA5Y,QAAAqZ,GAAAT,EAAA,GAAA5Y,EAAA,kBAAAkB,IAAA,GAAA0X,GAAAO,EAAAU,EAAAZ,UAAAC,EAAAD,UAAA1V,OAAA6V,OAAA7O,GAAA,SAAAlK,EAAAD,GAAA,OAAAmD,OAAAwW,eAAAxW,OAAAwW,eAAA3Z,EAAAyZ,IAAAzZ,EAAA4Z,UAAAH,EAAAR,GAAAjZ,EAAA2Y,EAAA,sBAAA3Y,EAAA6Y,UAAA1V,OAAA6V,OAAAD,GAAA/Y,CAAA,QAAAwZ,EAAAX,UAAAY,EAAAR,GAAAF,EAAA,cAAAU,GAAAR,GAAAQ,EAAA,cAAAD,GAAAA,EAAAK,YAAA,oBAAAZ,GAAAQ,EAAAd,EAAA,qBAAAM,GAAAF,GAAAE,GAAAF,EAAAJ,EAAA,aAAAM,GAAAF,EAAAnZ,EAAA,kBAAAkB,IAAA,GAAAmY,GAAAF,EAAA,oDAAAe,GAAA,kBAAAC,EAAAxe,EAAAye,EAAA/Z,EAAA,cAAAgZ,GAAAjZ,EAAAiK,EAAArK,EAAA4Y,GAAA,IAAAjd,EAAA4H,OAAA8W,eAAA,IAAA1e,EAAA,gBAAAyE,GAAAzE,EAAA,EAAA0d,GAAA,SAAAjZ,EAAAiK,EAAArK,EAAA4Y,GAAA,SAAAG,EAAA1O,EAAArK,GAAAqZ,GAAAjZ,EAAAiK,EAAA,SAAAjK,GAAA,OAAAc,KAAAoZ,QAAAjQ,EAAArK,EAAAI,EAAA,GAAAiK,EAAA1O,EAAAA,EAAAyE,EAAAiK,EAAA,CAAAvM,MAAAkC,EAAAua,YAAA3B,EAAA4B,cAAA5B,EAAA6B,UAAA7B,IAAAxY,EAAAiK,GAAArK,GAAA+Y,EAAA,UAAAA,EAAA,WAAAA,EAAA,cAAAM,GAAAjZ,EAAAiK,EAAArK,EAAA4Y,EAAA,UAAA8B,GAAAta,EAAAiK,GAAA,QAAAuO,EAAA,EAAAA,EAAAvO,EAAAjM,OAAAwa,IAAA,KAAAG,EAAA1O,EAAAuO,GAAAG,EAAAwB,WAAAxB,EAAAwB,aAAA,EAAAxB,EAAAyB,cAAA,YAAAzB,IAAAA,EAAA0B,UAAA,GAAAlX,OAAA8W,eAAAja,EAAAua,GAAA5B,EAAA5X,KAAA4X,EAAA,WAAA4B,GAAA/B,GAAA,IAAAjd,EAAA,SAAAid,EAAAvO,GAAA,aAAAuQ,GAAAhC,KAAAA,EAAA,OAAAA,EAAA,IAAAxY,EAAAwY,EAAAC,OAAAgC,aAAA,YAAAza,EAAA,KAAAzE,EAAAyE,EAAAuZ,KAAAf,EAAAvO,GAAA,wBAAAuQ,GAAAjf,GAAA,OAAAA,EAAA,UAAA+d,UAAA,kEAAArP,EAAAyQ,OAAAC,QAAAnC,EAAA,CAAAoC,CAAApC,EAAA,0BAAAgC,GAAAjf,GAAAA,EAAAA,EAAA,YAAAsf,GAAA7a,GAAA,6BAAA8a,GAAA9a,EAAA+a,MAAAja,KAAAG,WAAA,WAAA6Z,GAAA9a,GAAA,IAAAwY,EAAA5Y,EAAA,SAAAob,EAAAxC,EAAA5Y,GAAA,QAAAqK,EAAAjK,EAAAwY,GAAA5Y,GAAA+Y,EAAA1O,EAAAvM,MAAAqb,EAAAJ,aAAAsC,GAAAC,QAAAC,QAAApC,EAAAJ,EAAAQ,EAAAR,GAAAyC,KAAA,SAAAxb,GAAA,GAAAmZ,EAAA,KAAAxd,EAAA,WAAAid,GAAAG,EAAA9Q,EAAA2Q,EAAA,WAAAG,EAAA9Q,GAAAjI,EAAAC,KAAA,OAAAmb,EAAAzf,EAAAqE,GAAAA,EAAAI,EAAAzE,GAAAqE,GAAAlC,KAAA,CAAA2d,IAAApR,EAAApK,KAAAD,EAAA,WAAAI,GAAAgb,EAAA,QAAAhb,EAAA,SAAAA,GAAAqb,EAAA,EAAArb,EAAA,WAAAqb,EAAArb,EAAAiK,GAAA,IAAAjK,EAAAwY,EAAA8C,OAAArR,GAAAuO,EAAA2C,QAAA,CAAAzd,MAAAuM,EAAApK,KAAAG,KAAAwY,EAAAA,EAAA+C,MAAAP,EAAAxC,EAAAzX,IAAAyX,EAAAgD,KAAA5b,EAAA,KAAAkB,KAAAoZ,QAAA,SAAAla,EAAAiK,GAAA,WAAAiR,QAAA,SAAAvC,EAAAI,GAAA,IAAAxd,EAAA,CAAAwF,IAAAf,EAAAwb,IAAAvR,EAAAkR,QAAAxC,EAAA2C,OAAAvC,EAAAwC,KAAA,MAAA3b,EAAAA,EAAAA,EAAA2b,KAAAhgB,GAAAid,EAAA5Y,EAAArE,EAAAyf,EAAAhb,EAAAiK,GAAA,uBAAAjK,EAAA,SAAAc,KAAA,wBAAA2a,GAAAzb,GAAA,WAAAib,GAAAjb,EAAA,YAAA0b,GAAAlD,GAAA,IAAAxY,EAAA,GAAAJ,GAAA,WAAA+b,EAAA3b,EAAAiK,GAAA,OAAArK,GAAA,EAAAqK,EAAA,IAAAiR,QAAA,SAAAtb,GAAAA,EAAA4Y,EAAAxY,GAAAiK,GAAA,IAAApK,MAAA,EAAAnC,MAAA,IAAAud,GAAAhR,EAAA,WAAAjK,EAAA,oBAAAyY,QAAAA,OAAAC,UAAA,gCAAA5X,IAAA,EAAAd,EAAAub,KAAA,SAAA/C,GAAA,OAAA5Y,GAAAA,GAAA,EAAA4Y,GAAAmD,EAAA,OAAAnD,EAAA,qBAAAA,EAAA,QAAAxY,EAAA,eAAAwY,GAAA,GAAA5Y,EAAA,MAAAA,GAAA,EAAA4Y,EAAA,OAAAmD,EAAA,QAAAnD,EAAA,sBAAAA,EAAA,SAAAxY,EAAA,gBAAAwY,GAAA,OAAA5Y,GAAAA,GAAA,EAAA4Y,GAAAmD,EAAA,SAAAnD,EAAA,GAAAxY,CAAA,UAAAib,GAAAjb,EAAAoZ,GAAAtY,KAAAqY,EAAAnZ,EAAAc,KAAA+G,EAAAuR,CAAA,UAAAwC,GAAA3R,GAAA,IAAArK,EAAA4Y,EAAAG,EAAA3Y,EAAA,0BAAAyY,SAAAD,EAAAC,OAAAoD,cAAAlD,EAAAF,OAAAC,UAAA1Y,KAAA,IAAAwY,GAAA,OAAA5Y,EAAAqK,EAAAuO,IAAA,OAAA5Y,EAAA2Z,KAAAtP,GAAA,GAAA0O,GAAA,OAAA/Y,EAAAqK,EAAA0O,IAAA,WAAAmD,GAAAlc,EAAA2Z,KAAAtP,IAAAuO,EAAA,kBAAAG,EAAA,uBAAAW,UAAA,yCAAAwC,GAAA7R,GAAA,SAAA8R,EAAA9R,GAAA,GAAA9G,OAAA8G,KAAAA,EAAA,OAAAiR,QAAAI,OAAA,IAAAhC,UAAArP,EAAA,2BAAArK,EAAAqK,EAAApK,KAAA,OAAAqb,QAAAC,QAAAlR,EAAAvM,OAAA0d,KAAA,SAAAnR,GAAA,OAAAvM,MAAAuM,EAAApK,KAAAD,EAAA,UAAAkc,GAAA,SAAA7R,GAAAnJ,KAAAnB,EAAAsK,EAAAnJ,KAAAlB,EAAAqK,EAAAsR,IAAA,EAAAO,GAAAjD,UAAA,CAAAlZ,EAAA,KAAAC,EAAA,KAAA2b,KAAA,kBAAAQ,EAAAjb,KAAAlB,EAAAmb,MAAAja,KAAAnB,EAAAsB,WAAA,EAAA+a,OAAA,SAAA/R,GAAA,IAAArK,EAAAkB,KAAAnB,EAAA,uBAAAC,EAAAsb,QAAAC,QAAA,CAAAzd,MAAAuM,EAAApK,MAAA,IAAAkc,EAAAnc,EAAAmb,MAAAja,KAAAnB,EAAAsB,WAAA,EAAAgb,MAAA,SAAAhS,GAAA,IAAArK,EAAAkB,KAAAnB,EAAA,uBAAAC,EAAAsb,QAAAI,OAAArR,GAAA8R,EAAAnc,EAAAmb,MAAAja,KAAAnB,EAAAsB,WAAA,OAAA6a,GAAA7R,EAAA,CAAA6Q,GAAAjC,UAAA,mBAAAJ,QAAAA,OAAAoD,eAAA,qCAAA/a,IAAA,EAAAga,GAAAjC,UAAA0C,KAAA,SAAAvb,GAAA,OAAAc,KAAAoZ,QAAA,OAAAla,EAAA,EAAA8a,GAAAjC,UAAA,eAAA7Y,GAAA,OAAAc,KAAAoZ,QAAA,QAAAla,EAAA,EAAA8a,GAAAjC,UAAA,gBAAA7Y,GAAA,OAAAc,KAAAoZ,QAAA,SAAAla,EAAA,EAmCO,IAAMkc,GAAc,oBAAAA,KAnC3B,SAAA7M,EAAAzP,GAAA,KAAAyP,aAAAzP,GAAA,UAAA0Z,UAAA,qCAmC2BzY,CAAAC,KAAAob,EAAA,QAnC3Blc,EAmC2Bkc,EAnC3BjS,EAmC2B,KAnC3BuO,EAmC2B,EAAAzX,IAAA,eAAArD,MAQzB,SAAoBye,GAClB,OAuhBJ,SAgBkCC,GAAA,OAAAC,GAAAtB,MAAAja,KAAAG,UAAA,CAviBvBqb,CAAaH,EADelb,UAAAjD,OAAA,QAAAkD,IAAAD,UAAA,GAAAA,UAAA,GAAG,CAAC,EAEzC,GAEA,CAAAF,IAAA,eAAArD,MAMA,SAAoBiH,GAClB,OAijBH,SAWiC4X,GAAA,OAAAC,GAAAzB,MAAAja,KAAAG,UAAA,CA5jBvBwb,CAAa9X,EACtB,GAEA,CAAA5D,IAAA,eAAArD,MAUA,SAA0Bgf,GAA4B,OAAA7B,GAAA,SAA3B8B,GAAW,IAAEza,EAAOjB,UAAAjD,OAAA,QAAAkD,IAAAD,UAAA,GAAAA,UAAA,GAAG,CAAC,EAAC,OAAA6Y,KAAAE,EAAA,SAAA4C,IAAA,IAAAC,EAAAzb,EAAA0b,EAAAC,EAAA,OAAAjD,KAAAC,EAAA,SAAAiD,GAAA,cAAAA,EAAApd,GAAA,OACE,GADFid,EACO3a,EAAjDd,aAAAA,OAAY,IAAAyb,EAAG,EAACA,EAAEC,EAA+B5a,EAA/B4a,WAAYC,EAAmB7a,EAAnB6a,eAEjB,IAAjB3b,EAAkB,CAAA4b,EAAApd,EAAA,QACpB,OAAAod,EAAA5D,EAAA6D,GAAAvB,GAAAE,GAAOM,EAAegB,kBACpBP,EACAG,EACAC,MACD,UAMA,OAAAC,EAAApd,EAAA,QANA,UACyB,IAAjBwB,EAAkB,CAAA4b,EAAApd,EAAA,QAC3B,OAAAod,EAAA5D,EAAA6D,GAAAvB,GAAAE,GAAOM,EAAeiB,oBACpBR,EACAG,EACAC,MACD,gBAEK,IAAI5c,MAAK,8BAAAC,OAA+BgB,IAAe,cAAA4b,EAAA3N,EAAA,KAAAuN,EAAA,EAhBb9C,EAgBa,GAAAiB,MAAAja,KAAAG,UAEjE,GAEA,CAAAF,IAAA,oBAAArD,MAQA,SAAgCif,EAAaG,EAAYC,GAAgB,OAAAlC,GAAAf,KAAAE,EAAA,SAAAoD,IAAA,IAAAlb,EAAAmb,EAAAC,EAAAC,EAAAC,EAAAC,EAAAje,EAAAD,EAAAme,EAAAC,EAAAC,EAAA,OAAA9D,KAAAC,EAAA,SAAA8D,GAAA,cAAAA,EAAApS,EAAAoS,EAAAje,GAAA,OACjEsC,EAAU6a,GAAkB,IAAI9a,EAChCob,EAAU7b,GAAOU,GACnBob,EAAa,EAACC,GAAA,EAAAC,GAAA,EAAAK,EAAApS,EAAA,EAAAjM,EAAAoc,GACQe,GAAW,cAAAkB,EAAAje,EAAA,EAAA6b,GAAAjc,EAAA+b,QAAA,YAAAgC,IAAAhe,EAAAse,EAAA1E,GAAAtZ,MAAA,CAAAge,EAAAje,EAAA,QAEnC,OAFe8d,EAAKne,EAAA7B,MACdigB,EAASN,EAAQK,GAAMG,EAAAje,EAAA,EACvB+d,EAAM,OAERb,GACFA,EAAWQ,KACZ,OAAAC,GAAA,EAAAM,EAAAje,EAAA,eAAAie,EAAAje,EAAA,eAAAie,EAAApS,EAAA,EAAAmS,EAAAC,EAAA1E,EAAAqE,GAAA,EAAAC,EAAAG,EAAA,UAAAC,EAAApS,EAAA,EAAAoS,EAAApS,EAAA,GAAA8R,GAAA,MAAA/d,EAAA,QAAAqe,EAAAje,EAAA,gBAAAie,EAAAje,EAAA,GAAA6b,GAAAjc,EAAA,qBAAAqe,EAAApS,EAAA,IAAA+R,EAAA,CAAAK,EAAAje,EAAA,eAAA6d,EAAA,eAAAI,EAAA5d,EAAA,mBAAA4d,EAAA5d,EAAA,kBAAA4d,EAAAxO,EAAA,KAAA+N,EAAA,gCAVoEvC,EAYzE,GAEA,CAAA9Z,IAAA,sBAAArD,MAQA,SAAkCif,EAAaG,EAAYC,GAAgB,OAAAlC,GAAAf,KAAAE,EAAA,SAAA8D,IAAA,IAAA5b,EAAA6b,EAAAC,EAAAV,EAAAW,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,OAAA7E,KAAAC,EAAA,SAAA6E,GAAA,cAAAA,EAAAnT,EAAAmT,EAAAhf,GAAA,OACnEsC,EAAU6a,GAAkB,IAAI9a,EAChC8b,EAAcvc,GAAOU,GACrB8b,EAAexc,GAAOU,GACxBob,EAAa,EAACW,GAAA,EAAAC,GAAA,EAAAU,EAAAnT,EAAA,EAAA2S,EAAAxC,GAE0Be,GAAW,cAAAiC,EAAAhf,EAAA,EAAA6b,GAAA2C,EAAA7C,QAAA,YAAA0C,IAAAI,EAAAO,EAAAzF,GAAAtZ,MAAA,CAAA+e,EAAAhf,EAAA,QAIrD,OAJqD0e,EAAAhb,GAAA+a,EAAA3gB,MAAA,GAArC6gB,EAASD,EAAA,GAAEE,EAAUF,EAAA,GAC/BG,EAAaV,EAAYQ,GACzBG,EAAcV,EAAaQ,GAAWI,EAAAhf,EAAA,EAEtC6e,EAAU,OAChB,OADgBG,EAAAhf,EAAA,EACV8e,EAAW,OAEb5B,GACFA,EAAWQ,KACZ,OAAAW,GAAA,EAAAW,EAAAhf,EAAA,eAAAgf,EAAAhf,EAAA,eAAAgf,EAAAnT,EAAA,EAAAkT,EAAAC,EAAAzF,EAAA+E,GAAA,EAAAC,EAAAQ,EAAA,UAAAC,EAAAnT,EAAA,EAAAmT,EAAAnT,EAAA,IAAAwS,GAAA,MAAAG,EAAA,QAAAQ,EAAAhf,EAAA,gBAAAgf,EAAAhf,EAAA,GAAA6b,GAAA2C,EAAA,qBAAAQ,EAAAnT,EAAA,IAAAyS,EAAA,CAAAU,EAAAhf,EAAA,eAAAue,EAAA,eAAAS,EAAA3e,EAAA,mBAAA2e,EAAA3e,EAAA,kBAAA2e,EAAAvP,EAAA,KAAAyO,EAAA,iCAfsEjD,EAiB3E,GAEA,CAAA9Z,IAAA,eAAArD,MASA,SAA0BmhB,GAA8B,OAAAhE,GAAA,SAA7BiE,GAAa,IAAE5c,EAAOjB,UAAAjD,OAAA,QAAAkD,IAAAD,UAAA,GAAAA,UAAA,GAAG,CAAC,EAAC,OAAA6Y,KAAAE,EAAA,SAAA+E,IAAA,IAAAC,EAAA5d,EAAA0b,EAAA,OAAAhD,KAAAC,EAAA,SAAAkF,GAAA,cAAAA,EAAArf,GAAA,OAChB,GADgBof,EACX9c,EAAjCd,aAAAA,OAAY,IAAA4d,EAAG,EAACA,EAAElC,EAAe5a,EAAf4a,WAEL,IAAjB1b,EAAkB,CAAA6d,EAAArf,EAAA,QACpB,OAAAqf,EAAA7F,EAAA6D,GAAAvB,GAAAE,GAAOM,EAAegD,kBAAkBJ,EAAehC,MAAW,UAEE,OAAAmC,EAAArf,EAAA,QAFF,UACxC,IAAjBwB,EAAkB,CAAA6d,EAAArf,EAAA,QAC3B,OAAAqf,EAAA7F,EAAA6D,GAAAvB,GAAAE,GAAOM,EAAeiD,oBAAoBL,EAAehC,MAAW,gBAE9D,IAAI3c,MAAK,8BAAAC,OAA+BgB,IAAe,cAAA6d,EAAA5P,EAAA,KAAA0P,EAAA,EARXjF,EAQW,GAAAiB,MAAAja,KAAAG,UAEjE,GAEA,CAAAF,IAAA,oBAAArD,MAOA,SAAgCohB,EAAehC,GAAY,OAAAjC,GAAAf,KAAAE,EAAA,SAAAoF,IAAA,IAAAC,EAAA/B,EAAAgC,EAAA,OAAAxF,KAAAC,EAAA,SAAAwF,GAAA,cAAAA,EAAA3f,GAAA,OAiBzD,OAhBMyf,EAAUtd,KACZub,EAAa,EAGXgC,EAAY,eAAApY,EAAA2T,GAAAf,KAAAE,EAAG,SAAAwF,IAAA,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAnC,EAAAC,EAAAmC,EAAA,OAAAhG,KAAAC,EAAA,SAAAgG,GAAA,cAAAA,EAAAtU,EAAAsU,EAAAngB,GAAA,OAAA6f,GAAA,EAAAC,GAAA,EAAAK,EAAAtU,EAAA,EAAAmU,EAAAhE,GACOkD,GAAa,cAAAiB,EAAAngB,EAAA,EAAA6b,GAAAmE,EAAArE,QAAA,YAAAkE,IAAAI,EAAAE,EAAA5G,GAAAtZ,MAAA,CAAAkgB,EAAAngB,EAAA,QAErC,OAFe8d,EAAKmC,EAAAniB,MACdigB,EAAS0B,EAAQ3B,GAAMqC,EAAAngB,EAAA,EACvB+d,EAAM,OAERb,GACFA,EAAWQ,KACZ,OAAAmC,GAAA,EAAAM,EAAAngB,EAAA,eAAAmgB,EAAAngB,EAAA,eAAAmgB,EAAAtU,EAAA,EAAAqU,EAAAC,EAAA5G,EAAAuG,GAAA,EAAAC,EAAAG,EAAA,UAAAC,EAAAtU,EAAA,EAAAsU,EAAAtU,EAAA,GAAAgU,GAAA,MAAAG,EAAA,QAAAG,EAAAngB,EAAA,gBAAAmgB,EAAAngB,EAAA,GAAA6b,GAAAmE,EAAA,qBAAAG,EAAAtU,EAAA,IAAAiU,EAAA,CAAAK,EAAAngB,EAAA,eAAA+f,EAAA,eAAAI,EAAA9f,EAAA,mBAAA8f,EAAA9f,EAAA,kBAAA8f,EAAA1Q,EAAA,KAAAmQ,EAAA,iCAEJ,kBATiB,OAAAtY,EAAA6T,MAAAja,KAAAG,UAAA,KAYlBse,EAAAnG,EAAA6D,GAAAvB,GAAAE,GAAO0D,OAAc,iBAAAC,EAAAlQ,EAAA,KAAA+P,EAAA,GAjBoCvE,EAkB3D,GAEA,CAAA9Z,IAAA,sBAAArD,MAOA,SAAkCohB,EAAehC,GAAY,OAAAjC,GAAAf,KAAAE,EAAA,SAAAgG,IAAA,IAAAC,EAAAC,EAAA5C,EAAAgC,EAAA,OAAAxF,KAAAC,EAAA,SAAAoG,GAAA,cAAAA,EAAAvgB,GAAA,OA2C3D,OA1CMqgB,EAAcle,KACdme,EAAene,KACjBub,EAAa,EAEXgC,EAAY,eAAAnY,EAAA0T,GAAAf,KAAAE,EAAG,SAAAoG,IAAA,IAAA7B,EAAA8B,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAhD,EAAAc,EAAAC,EAAAC,EAAAiC,EAAAC,EAAAC,EAAAC,EAAA,OAAAhH,KAAAC,EAAA,SAAAgH,GAAA,cAAAA,EAAAtV,EAAAsV,EAAAnhB,GAAA,OACf2e,EAAY,KACZ8B,GAAgB,EAAIC,GAAA,EAAAC,GAAA,EAAAQ,EAAAtV,EAAA,EAAAgV,EAAA7E,GAEEkD,GAAa,cAAAiC,EAAAnhB,EAAA,EAAA6b,GAAAgF,EAAAlF,QAAA,YAAA+E,IAAAI,EAAAK,EAAA5H,GAAAtZ,MAAA,CAAAkhB,EAAAnhB,EAAA,QAAjB,GAAL8d,EAAKgD,EAAAhjB,OAChB2iB,EAAa,CAAAU,EAAAnhB,EAAA,QACf2e,EAAYb,EAAKqD,EAAAnhB,EAAA,eAQjB,OANM4e,EAAad,EAGbe,EAAawB,EAAY1B,GACzBG,EAAcwB,EAAa1B,GAAWuC,EAAAnhB,EAAA,EAEtC,CAAC6e,EAAYC,GAAY,OAE3B5B,GACFA,EAAWQ,KACZ,OAGH+C,GAAiBA,EAAa,OAAAC,GAAA,EAAAS,EAAAnhB,EAAA,eAAAmhB,EAAAnhB,EAAA,gBAAAmhB,EAAAtV,EAAA,EAAAqV,EAAAC,EAAA5H,EAAAoH,GAAA,EAAAC,EAAAM,EAAA,WAAAC,EAAAtV,EAAA,GAAAsV,EAAAtV,EAAA,IAAA6U,GAAA,MAAAG,EAAA,QAAAM,EAAAnhB,EAAA,gBAAAmhB,EAAAnhB,EAAA,GAAA6b,GAAAgF,EAAA,qBAAAM,EAAAtV,EAAA,IAAA8U,EAAA,CAAAQ,EAAAnhB,EAAA,eAAA4gB,EAAA,eAAAO,EAAA9gB,EAAA,mBAAA8gB,EAAA9gB,EAAA,eAG3BogB,IAAiB9B,EAAS,CAAAwC,EAAAnhB,EAAA,SAK7B,OAJM4e,EAAatC,EAAe8E,oBAC5BvC,EAAawB,EAAY1B,GACzBG,EAAcwB,EAAa1B,GAAWuC,EAAAnhB,EAAA,GAEtC,CAAC6e,EAAYC,GAAY,QAE3B5B,GACFA,EAAWQ,KACZ,eAAAyD,EAAA1R,EAAA,KAAA+Q,EAAA,mCAEJ,kBAnCiB,OAAAjZ,EAAA4T,MAAAja,KAAAG,UAAA,KAsClBkf,EAAA/G,EAAA6D,GAAAvB,GAAAE,GAAO0D,OAAc,iBAAAa,EAAA9Q,EAAA,KAAA2Q,EAAA,GA3CsCnF,EA4C7D,GAEA,CAAA9Z,IAAA,sBAAArD,MAOA,SAA4BgM,GAAO,IAAEuX,EAAShgB,UAAAjD,OAAA,QAAAkD,IAAAD,UAAA,GAAAA,UAAA,Gd/Of,Ic+OmC,OAAA6Y,KAAAE,EAAA,SAAAkH,IAAA,IAAA9f,EAAA+f,EAAAC,EAAA7lB,EAAAmiB,EAAA2D,EAAA3gB,EAAA4gB,EAAAC,EAAAC,EAAAC,EAAAxe,EAAAsb,EAAAC,EAAAkD,EAAAC,EAAA,OAAA7H,KAAAC,EAAA,SAAA6H,GAAA,cAAAA,EAAAhiB,GAAA,OAC7B,GAEd,KAFfwB,EAAesI,EAAQ1L,QAEP,CAAA4jB,EAAAhiB,EAAA,QAAAuhB,EAAA7d,GACLoG,EAAO,GAAf0X,EAAID,EAAA,GACF5lB,EAAI,EAAC,YAAEA,EAAI6lB,EAAKpjB,QAAM,CAAA4jB,EAAAhiB,EAAA,QAG7B,IAFM8d,EAAQ,IAAI7hB,aAAaolB,GACzBI,EAAM7lB,KAAK2C,IAAI5C,EAAI0lB,EAAWG,EAAKpjB,QAChC0C,EAAI,EAAGA,EAAI2gB,EAAM9lB,EAAGmF,IAC3Bgd,EAAMhd,GAAK0gB,EAAK7lB,EAAImF,GAEtB,OADCkhB,EAAAhiB,EAAA,EACK8d,EAAK,OANoBniB,GAAK0lB,EAASW,EAAAhiB,EAAA,eAAAgiB,EAAAhiB,EAAA,kBAQrB,IAAjBwB,EAAkB,CAAAwgB,EAAAhiB,EAAA,QAAA0hB,EAAAhe,GACLoG,EAAO,GAAtB0X,EAAIE,EAAA,GAAEE,EAAKF,EAAA,GACZG,EAAYjmB,KAAKkI,IAAI0d,EAAKpjB,OAAQwjB,EAAMxjB,QAErCzC,EAAI,EAAC,YAAEA,EAAIkmB,GAAS,CAAAG,EAAAhiB,EAAA,QAM3B,IALM2e,EAAY,IAAI1iB,aAAaolB,GAC7BzC,EAAa,IAAI3iB,aAAaolB,GAE9BI,EAAM7lB,KAAK2C,IAAI5C,EAAI0lB,EAAWQ,GAE3B/gB,EAAI,EAAGA,EAAI2gB,EAAM9lB,EAAGmF,IAC3B6d,EAAU7d,GAAKnF,EAAImF,EAAI0gB,EAAKpjB,OAASojB,EAAK7lB,EAAImF,GAAK,EACnD8d,EAAW9d,GAAKnF,EAAImF,EAAI8gB,EAAMxjB,OAASwjB,EAAMjmB,EAAImF,GAAK,EAGxD,OAFCkhB,EAAAhiB,EAAA,EAEK,CAAC2e,EAAWC,GAAW,OAXAjjB,GAAK0lB,EAASW,EAAAhiB,EAAA,eAAAgiB,EAAAhiB,EAAA,qBAcvC,IAAIO,MAAK,8BAAAC,OAA+BgB,IAAe,cAAAwgB,EAAAvS,EAAA,KAAA6R,EAAA,EA/BCpH,EA+BD,GAIjE,CAAA/Y,IAAA,gBAAArD,OAAAmkB,EAAAC,GAAAhI,KAAAE,EAKA,SAAA+H,EAA2BC,GAAW,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA5E,EAAA6E,EAAA,OAAAzI,KAAAC,EAAA,SAAAyI,GAAA,cAAAA,EAAA/W,EAAA+W,EAAA5iB,GAAA,OAC9BqiB,EAAS,GAAEC,GAAA,EAAAC,GAAA,EAAAK,EAAA/W,EAAA,EAAA4W,EAAAzG,GACSoG,GAAW,cAAAQ,EAAA5iB,EAAA,EAAAyiB,EAAA9G,OAAA,YAAA2G,IAAAI,EAAAE,EAAArJ,GAAAtZ,MAAA,CAAA2iB,EAAA5iB,EAAA,QAApB8d,EAAK4E,EAAA5kB,MACpBukB,EAAOthB,KAAK+c,GAAM,OAAAwE,GAAA,EAAAM,EAAA5iB,EAAA,eAAA4iB,EAAA5iB,EAAA,eAAA4iB,EAAA/W,EAAA,EAAA8W,EAAAC,EAAArJ,EAAAgJ,GAAA,EAAAC,EAAAG,EAAA,UAAAC,EAAA/W,EAAA,EAAA+W,EAAA/W,EAAA,GAAAyW,GAAA,MAAAG,EAAA,QAAAG,EAAA5iB,EAAA,eAAA4iB,EAAA5iB,EAAA,EAAAyiB,EAAA,mBAAAG,EAAA/W,EAAA,GAAA0W,EAAA,CAAAK,EAAA5iB,EAAA,eAAAwiB,EAAA,eAAAI,EAAAviB,EAAA,kBAAAuiB,EAAAviB,EAAA,kBAAAuiB,EAAAnT,EAAA,EAEb4S,GAAM,EAAAF,EAAA,gCACd,SANyBU,GAAA,OAAAZ,EAAA9G,MAAAja,KAAAG,UAAA,IAQ1B,CAAAF,IAAA,oBAAArD,MAKA,WACE,MAAO,CACLsB,KAAM,EACNE,WAAY,CAAC,EAAG,EAAG,GACnBG,mBAAoB,IAAIxE,WAAW,GACnCuE,kBAAmB,IAAIvE,WAAW,GAClC6E,sBAAuB,GAE3B,GAEA,CAAAqB,IAAA,gBAAArD,OAAAglB,EAAAZ,GAAAhI,KAAAE,EAQA,SAAA2I,EAA2B7D,GAAa,IAAA5c,EAAA0gB,EAAA5hB,EAAA6hB,EAAAzhB,EAAA6gB,EAAAa,EAAAC,EAAAC,EAAAC,EAAAC,EAAAxF,EAAAze,EAAAkkB,EAAA3lB,EAAAuI,EAAAlC,EAAAuf,EAAAC,EAAAC,EAAAC,EAAAtiB,UAAA,OAAA6Y,KAAAC,EAAA,SAAAyJ,GAAA,cAAAA,EAAA/X,EAAA+X,EAAA5jB,GAAA,OAAcgjB,GAAZ1gB,EAAOqhB,EAAAvlB,OAAA,QAAAkD,IAAAqiB,EAAA,GAAAA,EAAA,GAAG,CAAC,GAC3CviB,MAAAA,OAAK,IAAA4hB,EAAG,uBAAsBA,EAAAC,EAAuB3gB,EAArBd,aAAAA,OAAY,IAAAyhB,EAAG,EAACA,EAElDZ,EAAS,GAAEa,GAAA,EAAAC,GAAA,EAAAS,EAAA/X,EAAA,EAAAwX,EAAArH,GACSkD,GAAa,cAAA0E,EAAA5jB,EAAA,EAAAqjB,EAAA1H,OAAA,YAAAuH,IAAAI,EAAAM,EAAArK,GAAAtZ,MAAA,CAAA2jB,EAAA5jB,EAAA,QAAtB8d,EAAKwF,EAAAxlB,MACpBukB,EAAOthB,KAAKjC,EAAegf,IAAO,OAAAoF,GAAA,EAAAU,EAAA5jB,EAAA,eAAA4jB,EAAA5jB,EAAA,eAAA4jB,EAAA/X,EAAA,EAAA6X,EAAAE,EAAArK,EAAA4J,GAAA,EAAAC,EAAAM,EAAA,UAAAE,EAAA/X,EAAA,EAAA+X,EAAA/X,EAAA,GAAAqX,GAAA,MAAAG,EAAA,QAAAO,EAAA5jB,EAAA,eAAA4jB,EAAA5jB,EAAA,EAAAqjB,EAAA,mBAAAO,EAAA/X,EAAA,GAAAsX,EAAA,CAAAS,EAAA5jB,EAAA,eAAAojB,EAAA,eAAAQ,EAAAvjB,EAAA,kBAAAujB,EAAAvjB,EAAA,WAWpC,IARMhB,EAAS2B,EAAQ6iB,aAAaziB,EAAOihB,EAAOjkB,OAAQoD,GACpD+hB,EACJlkB,EAAOjB,OAASikB,EAAOrd,OAAO,SAAC8e,EAAKhG,GAAK,OAAKgG,EAAMhG,EAAM1f,MAAM,EAAE,IAE9DR,EAAS,IAAI/C,WAAW0oB,IACvB9hB,IAAIpC,EAAQ,GAEf8G,EAAS9G,EAAOjB,OACpB6F,EAAA,EAAAuf,EAAoBnB,EAAMpe,EAAAuf,EAAAplB,OAAA6F,IAAf6Z,EAAK0F,EAAAvf,GACdrG,EAAO6D,IAAIqc,EAAO3X,GAClBA,GAAU2X,EAAM1f,OACjB,OAAAwlB,EAAAnU,EAAA,EAEM,IAAIsU,KAAK,CAACnmB,GAAS,CAAEuF,KAAM,8BAA6B,EAAA4f,EAAA,gCAChE,SAtByBiB,GAAA,OAAAlB,EAAA3H,MAAAja,KAAAG,UAAA,IAwB1B,CAAAF,IAAA,gBAAArD,MAQA,SAAqBmmB,GAAuD,IAA5CziB,EAAYH,UAAAjD,OAAA,QAAAkD,IAAAD,UAAA,GAAAA,UAAA,GAAG,EAAG6iB,EAAU7iB,UAAAjD,OAAA,QAAAkD,IAAAD,UAAA,GAAAA,UAAA,GAAG1G,EACvD0nB,EAAS3d,MAAMyf,QAAQF,GAAaA,EAAY,CAACA,GAEvD,GAAqB,IAAjBziB,EACF,OAAO8a,EAAe8H,mBAAmB/B,EAAQ6B,GAC5C,GAAqB,IAAjB1iB,EACT,OAAO8a,EAAe+H,qBAAqBhC,EAAQ6B,GAEnD,MAAM,IAAI3jB,MAAK,8BAAAC,OAA+BgB,GAElD,GAEA,CAAAL,IAAA,qBAAArD,MAOA,SAA0BukB,EAAQ6B,GAChC,IAAMI,EAAejC,EAAOrd,OAAO,SAAC8e,EAAKhG,GAAK,OAAKgG,EAAMhG,EAAM1f,MAAM,EAAE,GACjER,EAAS,IAAI2mB,YdpPQ,GACK,EcoPZD,GAEdtlB,EAAO,IAAIC,SAASrB,GAG1B0e,EAAekI,gBAAgBxlB,EAAMslB,EAAc,EAAGJ,GAGtD,IAC0BO,EADtBte,Ed7PuB,Gc6PCue,EAAA7kB,GACRwiB,GAAM,IAA1B,IAAAqC,EAAA3kB,MAAA0kB,EAAAC,EAAA1kB,KAAAC,MACE,IAD0B,IAAjB6d,EAAK2G,EAAA3mB,MACLnC,EAAI,EAAGA,EAAImiB,EAAM1f,OAAQzC,IAAK,CACrC,IAAMgpB,EAAS/oB,KAAKkI,KAAK,EAAGlI,KAAK2C,IAAI,EAAGuf,EAAMniB,KAC9CqD,EAAK4lB,SACHze,EACAwe,EAAS,EACLA,EAAS5nB,EACT4nB,EAAS7nB,GACb,GAEFqJ,GdvQ4B,CcwQ9B,CACD,OAAAhG,GAAAukB,EAAAtkB,EAAAD,EAAA,SAAAukB,EAAArkB,GAAA,CAED,OAAO,IAAI0jB,KAAK,CAACnmB,GAAS,CAAEuF,KAAM,aACpC,GAEA,CAAAhC,IAAA,uBAAArD,MAOA,SAA4B+mB,EAAYX,GACtC,IAAMI,EAAeO,EAAW7f,OAC9B,SAAC8e,EAAGgB,GAAA,IAAAC,EAAArhB,GAAAohB,EAAA,GAAGtD,EAAIuD,EAAA,GAAEnD,EAAKmD,EAAA,UAAMjB,EAAMloB,KAAKkI,IAAI0d,EAAKpjB,OAAQwjB,EAAMxjB,OAAO,EACjE,GAGIR,EAAS,IAAI2mB,Yd5RQ,GACK,Ec4RZD,EAAsC,GAEpDtlB,EAAO,IAAIC,SAASrB,GAG1B0e,EAAekI,gBAAgBxlB,EAAMslB,EAAc,EAAGJ,GAGtD,IACgDc,EAD5C7e,EdrSuB,GcqSC8e,EAAAplB,GACUglB,GAAU,IAAhD,IAAAI,EAAAllB,MAAAilB,EAAAC,EAAAjlB,KAAAC,MAEE,IAFgD,IAAAilB,EAAAxhB,GAAAshB,EAAAlnB,MAAA,GAAtC6gB,EAASuG,EAAA,GAAEtG,EAAUsG,EAAA,GACzBC,EAAcvpB,KAAKkI,IAAI6a,EAAUvgB,OAAQwgB,EAAWxgB,QACjDzC,EAAI,EAAGA,EAAIwpB,EAAaxpB,IAAK,CACpC,IAAMypB,EAAazpB,EAAIgjB,EAAUvgB,OAASugB,EAAUhjB,GAAK,EACnD0pB,EAAc1pB,EAAIijB,EAAWxgB,OAASwgB,EAAWjjB,GAAK,EACtD2pB,EAAc1pB,KAAKkI,KAAK,EAAGlI,KAAK2C,IAAI,EAAG6mB,IACvCG,EAAe3pB,KAAKkI,KAAK,EAAGlI,KAAK2C,IAAI,EAAG8mB,IAC9CrmB,EAAK4lB,SACHze,EACAmf,EAAc,EACVA,EAAcvoB,EACduoB,EAAcxoB,GAClB,GAEFqJ,GdnT4B,EcoT5BnH,EAAK4lB,SACHze,EACAof,EAAe,EACXA,EAAexoB,EACfwoB,EAAezoB,GACnB,GAEFqJ,Gd3T4B,Cc4T9B,CACD,OAAAhG,GAAA8kB,EAAA7kB,EAAAD,EAAA,SAAA8kB,EAAA5kB,GAAA,CAED,OAAO,IAAI0jB,KAAK,CAACnmB,GAAS,CAAEuF,KAAM,aACpC,GAEA,CAAAhC,IAAA,kBAAArD,MAQA,SAAuBkB,EAAMslB,EAAc9iB,EAAc0iB,GACvD,IAAMsB,EAAWtB,EAAa1iB,Ed3UE,Ec4U1BikB,Ed5U0B,Ec4UbjkB,EACbkkB,EAAWpB,EAAemB,EAC1BE,Ed1UqB,Gc0UQD,EAE/BpN,EAAM,EAGJsN,EAAc,SAACzf,EAAQ0f,GAC3B,IAAK,IAAIlqB,EAAI,EAAGA,EAAIkqB,EAAOznB,OAAQzC,IACjCqD,EAAK8mB,SAAS3f,EAASxK,EAAGkqB,EAAOE,WAAWpqB,GAEhD,EAGAiqB,EAAYtN,EAAK,QACjBA,GAAO,EACPtZ,EAAK+C,UAAUuW,EAAKqN,GAAU,GAE9BC,EADAtN,GAAO,EACU,QAIjBsN,EAHAtN,GAAO,EAGU,QACjBA,GAAO,EACPtZ,EAAK+C,UAAUuW,EAAK,IAAI,GACxBA,GAAO,EACPtZ,EAAKO,UAAU+Y,EAAK,GAAG,GACvBA,GAAO,EACPtZ,EAAKO,UAAU+Y,EAAK9W,GAAc,GAClC8W,GAAO,EACPtZ,EAAK+C,UAAUuW,EAAK4L,GAAY,GAChC5L,GAAO,EACPtZ,EAAK+C,UAAUuW,EAAKkN,GAAU,GAC9BlN,GAAO,EACPtZ,EAAKO,UAAU+Y,EAAKmN,GAAY,GAChCnN,GAAO,EACPtZ,EAAKO,UAAU+Y,Ed/WgB,Ic+WU,GAIzCsN,EAHAtN,GAAO,EAGU,QACjBA,GAAO,EACPtZ,EAAK+C,UAAUuW,EAAKoN,GAAU,EAChC,GAEA,CAAAvkB,IAAA,eAAArD,OAAAkoB,EAAA9D,GAAAhI,KAAAE,EAOA,SAAA6L,EAA0BC,GAAI,IAAAtoB,EAAAyB,EAAA8mB,EAAApnB,EAAApD,EAAAmiB,EAAA,OAAA5D,KAAAC,EAAA,SAAAiM,GAAA,cAAAA,EAAApmB,GAAA,cAAAomB,EAAApmB,EAAA,EACPkmB,EAAKG,cAAa,OAKvC,IALMzoB,EAAMwoB,EAAA7M,EACNla,EAAS,IAAIxE,WAAW+C,EAAOyI,MAAM,EAAGvL,IACxCqrB,EAAOnlB,EAAQslB,YAAYjnB,GAE3BN,EAAY,GACTpD,EAAIb,EAAiBa,EAAIiC,EAAO8C,WAAY/E,GAAKZ,GAClD+iB,EAAQ,IAAIjjB,WAAW+C,EAAOyI,MAAM1K,EAAGA,EAAIZ,KACvCqD,SAAWrD,GACnBgE,EAAUgC,KAAK+c,GAElB,OAAAsI,EAAA3W,EAAA,EAEM,CAAE0W,KAAAA,EAAMpnB,UAAAA,IAAW,EAAAknB,EAAA,IAC3B,SAdwBM,GAAA,OAAAP,EAAA7K,MAAAja,KAAAG,UAAA,IAgBzB,CAAAF,IAAA,0BAAArD,MAAAoc,KAAAE,EAKA,SAAQoM,EAAwBznB,GAAS,IAAA0nB,EAAAC,EAAA5I,EAAA6I,EAAA,OAAAzM,KAAAC,EAAA,SAAAyM,GAAA,cAAAA,EAAA/a,EAAA+a,EAAA5mB,GAAA,OAAAymB,EAAA5mB,GACnBd,GAAS6nB,EAAA/a,EAAA,EAAA4a,EAAA1mB,IAAA,WAAA2mB,EAAAD,EAAAzmB,KAAAC,KAAA,CAAA2mB,EAAA5mB,EAAA,QAC3B,OADS8d,EAAK4I,EAAA5oB,MAAA8oB,EAAA5mB,EAAA,EACRM,EAAiBwd,GAAM,OAAA8I,EAAA5mB,EAAA,eAAA4mB,EAAA5mB,EAAA,eAAA4mB,EAAA/a,EAAA,EAAA8a,EAAAC,EAAArN,EAAAkN,EAAArmB,EAAAumB,GAAA,cAAAC,EAAA/a,EAAA,EAAA4a,EAAApmB,IAAAumB,EAAAvmB,EAAA,iBAAAumB,EAAAnX,EAAA,KAFzB+W,EAAuB,qBAM/B,CAAArlB,IAAA,oBAAArD,MAOA,SAAyBmmB,EAAWziB,GAClC,GAAqB,IAAjBA,EAAoB,CACtB,IAM6BqlB,EANvBvC,EAAeL,EAAUjf,OAC7B,SAAC8e,EAAKhG,GAAK,OAAKgG,EAAMhG,EAAM1f,MAAM,EAClC,GAEI0oB,EAAM,IAAI7qB,aAAaqoB,GACzBne,EAAS,EAAC4gB,EAAAlnB,GACMokB,GAAS,IAA7B,IAAA8C,EAAAhnB,MAAA8mB,EAAAE,EAAA/mB,KAAAC,MAA+B,KAApB6d,EAAK+I,EAAA/oB,MACdgpB,EAAIrlB,IAAIqc,EAAO3X,GACfA,GAAU2X,EAAM1f,MAClB,CAAC,OAAA+B,GAAA4mB,EAAA3mB,EAAAD,EAAA,SAAA4mB,EAAA1mB,GAAA,CACD,OAAOymB,CACT,CAAO,GAAqB,IAAjBtlB,EAAoB,CAC7B,IAO+CwlB,EAPzC1C,EAAeL,EAAUjf,OAC7B,SAAC8e,EAAGmD,GAAA,IAAAC,EAAAxjB,GAAAujB,EAAA,GAAGzF,EAAI0F,EAAA,GAAEtF,EAAKsF,EAAA,UAAMpD,EAAMloB,KAAKkI,IAAI0d,EAAKpjB,OAAQwjB,EAAMxjB,OAAO,EACjE,GAEI0oB,EAAM,IAAI7qB,aAA4B,EAAfqoB,GAEzB6C,EAAY,EAACC,EAAAvnB,GACqBokB,GAAS,IAA/C,IAAAmD,EAAArnB,MAAAinB,EAAAI,EAAApnB,KAAAC,MAEE,IAF+C,IAAAonB,EAAA3jB,GAAAsjB,EAAAlpB,MAAA,GAArC6gB,EAAS0I,EAAA,GAAEzI,EAAUyI,EAAA,GACzBlC,EAAcvpB,KAAKkI,IAAI6a,EAAUvgB,OAAQwgB,EAAWxgB,QACjD0C,EAAI,EAAGA,EAAIqkB,EAAarkB,IAC/BgmB,EAAgB,EAAZK,GAAiBrmB,EAAI6d,EAAUvgB,OAASugB,EAAU7d,GAAK,EAC3DgmB,EAAgB,EAAZK,EAAgB,GAAKrmB,EAAI8d,EAAWxgB,OAASwgB,EAAW9d,GAAK,EACjEqmB,GAEH,OAAAhnB,GAAAinB,EAAAhnB,EAAAD,EAAA,SAAAinB,EAAA/mB,GAAA,CACD,OAAOymB,CACT,CACE,MAAM,IAAIvmB,MAAK,8BAAAC,OAA+BgB,GAElD,IAhkBF6I,GAAAqQ,GAAAta,EAAA6Y,UAAA5O,GAAAuO,GAAA8B,GAAAta,EAAAwY,GAAArV,OAAA8W,eAAAja,EAAA,aAAAqa,UAAA,IAAAra,EAAA,IAAAA,EAAAiK,EAAAuO,EAsfEoN,EAnMAlD,EA5BAb,CAySC,CA7hBwB,GAskB3B,SAAAxF,KAFC,OAEDA,GAAAyF,GAAAhI,KAAAE,EAtBO,SAAAkN,EAA4B/K,GAAQ,IAAAja,EAAAilB,EAAAnmB,EAAAomB,EAAAnF,EAAAnD,EAAAgH,EAAAuB,EAAAC,EAAAC,EAAAtmB,UAAA,OAAA6Y,KAAAC,EAAA,SAAAyN,GAAA,cAAAA,EAAA5nB,GAAA,OAAc,GAAZsC,EAAOqlB,EAAAvpB,OAAA,QAAAkD,IAAAqmB,EAAA,GAAAA,EAAA,GAAG,CAAC,EAEnDjjB,MAAMyf,QAAQ5H,KACM,IAApBA,EAASne,QAAoC,IAApBme,EAASne,UACnCme,EAASsL,KAAK,SAACC,GAAO,QAAOA,aAAmB7rB,aAAa,GAAC,CAAA2rB,EAAA5nB,EAAA,cAExD,IAAI0Z,UAAU,wDAAuD,OAQ3E,OAR2E6N,EAGnBjlB,EAAlDlB,MAAAA,OAAK,IAAAmmB,EAAG,oBAAmBA,EAAKC,EAAaO,GAAKzlB,EAAO0lB,IAC3D3F,EAAS/F,GAAe2L,oBAAoB1L,GAC5C2C,EAAgB5C,GAAe4L,aAAa7F,EAAQ,CACxD7gB,aAAc+a,EAASne,OACvB+e,eAAgB,IAAI9a,EAAemlB,KACnCI,EAAA5nB,EAAA,EACiBsc,GAAe6L,cAAcjJ,EAAe,CAC7D9d,MAAAA,EACAI,aAAc+a,EAASne,SACvB,OACmB,OAJf8nB,EAAI0B,EAAArO,EAAAkO,EAIC5sB,WAAU+sB,EAAA5nB,EAAA,EAAOkmB,EAAKG,cAAa,cAAAqB,EAAAE,EAAArO,EAAAqO,EAAAnY,EAAA,MAAAgY,EAAAC,IAAA,EAAAJ,EAAA,IAC/C7K,GAAAtB,MAAAja,KAAAG,UAAA,CAuCD,SAAAub,KAFC,OAEDA,GAAAsF,GAAAhI,KAAAE,EA5BO,SAAAgO,EAA4BrjB,GAAK,IAAAmhB,EAAAmC,EAAAlC,EAAApnB,EAAAsjB,EAAAiG,EAAA,OAAApO,KAAAC,EAAA,SAAAoO,GAAA,cAAAA,EAAAvoB,GAAA,YAElC+E,aAAiBgf,MAAI,CAAAwE,EAAAvoB,EAAA,QACvBkmB,EAAOnhB,EAAKwjB,EAAAvoB,EAAA,oBACH+E,aAAiBlK,YAAckK,aAAiBwf,aAAW,CAAAgE,EAAAvoB,EAAA,QACpEkmB,EAAO,IAAInC,KAAK,CAAChf,IAAOwjB,EAAAvoB,EAAA,qBAElB,IAAI0Z,UAAU,gDAA+C,cAAA6O,EAAAvoB,EAAA,EAGnCsc,GAAekM,aAAatC,GAAK,OACH,OADGmC,EAAAE,EAAAhP,EAA3D4M,EAAIkC,EAAJlC,KAAMpnB,EAASspB,EAATtpB,UACRsjB,EAAS/F,GAAekK,wBAAwBznB,GAAUwpB,EAAAvoB,EAAA,EACpCsc,GAAemM,cACzCnM,GAAeoM,aAAarG,EAAQ,CAClC7gB,aAAc2kB,EAAK3kB,gBAEtB,OAJkB,GAAb8mB,EAAaC,EAAAhP,EAMO,IAAtB4M,EAAK3kB,aAAkB,CAAA+mB,EAAAvoB,EAAA,eAAAuoB,EAAA9Y,EAAA,EAClB,CAACkZ,GAAkBL,KAAe,cAAAC,EAAA9Y,EAAA,EAGpC,CACLkZ,GAAkBL,EAAczjB,IAAI,SAAA+jB,GAAM,OAANllB,GAAAklB,EAAA,GAAM,EAAU,IACpDD,GAAkBL,EAAczjB,IAAI,SAAAgkB,GAAS,OAATnlB,GAAAmlB,EAAA,GAAS,EAAW,MACzD,EAAAT,EAAA,KACFjN,MAAAja,KAAAG,UAAA,CAQD,SAASsnB,GAAkBtG,GACzB,IAG0ByG,EAHpBC,EAAc1G,EAAOrd,OAAO,SAACgkB,EAAOlL,GAAK,OAAKkL,EAAQlL,EAAM1f,MAAM,EAAE,GACpE0pB,EAAU,IAAI7rB,aAAa8sB,GAC7B5iB,EAAS,EAAC8iB,EAAAppB,GACMwiB,GAAM,IAA1B,IAAA4G,EAAAlpB,MAAA+oB,EAAAG,EAAAjpB,KAAAC,MAA4B,KAAjB6d,EAAKgL,EAAAhrB,MACdgqB,EAAQrmB,IAAIqc,EAAO3X,GACnBA,GAAU2X,EAAM1f,MAClB,CAAC,OAAA+B,GAAA8oB,EAAA7oB,EAAAD,EAAA,SAAA8oB,EAAA5oB,GAAA,CACD,OAAOynB,CACT,64CC7pBA,IAAA1nB,EAAAwY,EAAAvO,EAAA,mBAAAwO,OAAAA,OAAA,GAAA7Y,EAAAqK,EAAAyO,UAAA,aAAAC,EAAA1O,EAAA2O,aAAA,yBAAArd,EAAA0O,EAAArK,EAAA+Y,EAAApd,GAAA,IAAA4O,EAAAvK,GAAAA,EAAAiZ,qBAAAC,EAAAlZ,EAAAkZ,EAAAC,EAAA5V,OAAA6V,OAAA7O,EAAA0O,WAAA,OAAAI,GAAAF,EAAA,mBAAA9O,EAAArK,EAAA+Y,GAAA,IAAApd,EAAA4O,EAAA4O,EAAA9Y,EAAA,EAAAwL,EAAAkN,GAAA,GAAAzM,GAAA,EAAAgN,EAAA,CAAAzN,EAAA,EAAA7L,EAAA,EAAAuZ,EAAAnZ,EAAAqP,EAAA+J,EAAAnZ,EAAAmZ,EAAAC,KAAArZ,EAAA,GAAAoZ,EAAA,SAAAZ,EAAAvO,GAAA,OAAA1O,EAAAid,EAAArO,EAAA,EAAA4O,EAAA/Y,EAAAkZ,EAAAtZ,EAAAqK,EAAAoF,CAAA,YAAA+J,EAAAnP,EAAArK,GAAA,IAAAuK,EAAAF,EAAA8O,EAAAnZ,EAAA4Y,EAAA,GAAAtM,GAAAjM,IAAA0Y,GAAAH,EAAA/M,EAAAzN,OAAAwa,IAAA,KAAAG,EAAApd,EAAAkQ,EAAA+M,GAAAY,EAAAF,EAAAzN,EAAAmE,EAAArU,EAAA,GAAA0O,EAAA,GAAA0O,EAAA/I,IAAAhQ,KAAAmZ,EAAAxd,GAAA4O,EAAA5O,EAAA,OAAA4O,EAAA,MAAA5O,EAAA,GAAAA,EAAA,GAAAyE,GAAAzE,EAAA,IAAA6d,KAAAT,EAAA1O,EAAA,GAAAmP,EAAA7d,EAAA,KAAA4O,EAAA,EAAA+O,EAAAC,EAAAvZ,EAAAsZ,EAAAtZ,EAAArE,EAAA,IAAA6d,EAAAxJ,IAAA+I,EAAA1O,EAAA,GAAA1O,EAAA,GAAAqE,GAAAA,EAAAgQ,KAAArU,EAAA,GAAA0O,EAAA1O,EAAA,GAAAqE,EAAAsZ,EAAAtZ,EAAAgQ,EAAAzF,EAAA,OAAAwO,GAAA1O,EAAA,SAAAoF,EAAA,MAAAnD,GAAA,EAAAtM,CAAA,iBAAA+Y,EAAAlN,EAAAmE,GAAA,GAAA3P,EAAA,QAAAqZ,UAAA,oCAAApN,GAAA,IAAAT,GAAA2N,EAAA3N,EAAAmE,GAAAzF,EAAAsB,EAAAsN,EAAAnJ,GAAA4I,EAAArO,EAAA,EAAAnK,EAAA+Y,KAAA7M,GAAA,CAAA3Q,IAAA4O,EAAAA,EAAA,GAAAA,EAAA,IAAA+O,EAAAtZ,GAAA,GAAAwZ,EAAAjP,EAAA4O,IAAAG,EAAAtZ,EAAAmZ,EAAAG,EAAAC,EAAAJ,GAAA,OAAA9Y,EAAA,EAAA1E,EAAA,IAAA4O,IAAAwO,EAAA,QAAAH,EAAAjd,EAAAod,GAAA,MAAAH,EAAAA,EAAAe,KAAAhe,EAAAwd,IAAA,MAAAO,UAAA,wCAAAd,EAAA3Y,KAAA,OAAA2Y,EAAAO,EAAAP,EAAA9a,MAAAyM,EAAA,IAAAA,EAAA,YAAAA,IAAAqO,EAAAjd,EAAA,SAAAid,EAAAe,KAAAhe,GAAA4O,EAAA,IAAA4O,EAAAO,UAAA,oCAAAX,EAAA,YAAAxO,EAAA,GAAA5O,EAAAyE,CAAA,UAAAwY,GAAAtM,EAAAgN,EAAAtZ,EAAA,GAAAmZ,EAAA9O,EAAAsP,KAAA3Z,EAAAsZ,MAAA7J,EAAA,YAAAmJ,GAAAjd,EAAAyE,EAAAmK,EAAA,EAAA4O,EAAAP,CAAA,SAAAvY,EAAA,UAAAvC,MAAA8a,EAAA3Y,KAAAqM,EAAA,GAAAjC,EAAA0O,EAAApd,IAAA,GAAAwd,CAAA,KAAA1J,EAAA,YAAAyJ,IAAA,UAAAU,IAAA,UAAAC,IAAA,CAAAjB,EAAArV,OAAAuW,eAAA,IAAAvP,EAAA,GAAAvK,GAAA4Y,EAAAA,EAAA,GAAA5Y,QAAAqZ,GAAAT,EAAA,GAAA5Y,EAAA,kBAAAkB,IAAA,GAAA0X,GAAAO,EAAAU,EAAAZ,UAAAC,EAAAD,UAAA1V,OAAA6V,OAAA7O,GAAA,SAAAlK,EAAAD,GAAA,OAAAmD,OAAAwW,eAAAxW,OAAAwW,eAAA3Z,EAAAyZ,IAAAzZ,EAAA4Z,UAAAH,EAAAR,GAAAjZ,EAAA2Y,EAAA,sBAAA3Y,EAAA6Y,UAAA1V,OAAA6V,OAAAD,GAAA/Y,CAAA,QAAAwZ,EAAAX,UAAAY,EAAAR,GAAAF,EAAA,cAAAU,GAAAR,GAAAQ,EAAA,cAAAD,GAAAA,EAAAK,YAAA,oBAAAZ,GAAAQ,EAAAd,EAAA,qBAAAM,GAAAF,GAAAE,GAAAF,EAAAJ,EAAA,aAAAM,GAAAF,EAAAnZ,EAAA,kBAAAkB,IAAA,GAAAmY,GAAAF,EAAA,oDAAAe,GAAA,kBAAAC,EAAAxe,EAAAye,EAAA/Z,EAAA,cAAAgZ,GAAAjZ,EAAAiK,EAAArK,EAAA4Y,GAAA,IAAAjd,EAAA4H,OAAA8W,eAAA,IAAA1e,EAAA,gBAAAyE,GAAAzE,EAAA,EAAA0d,GAAA,SAAAjZ,EAAAiK,EAAArK,EAAA4Y,GAAA,SAAAG,EAAA1O,EAAArK,GAAAqZ,GAAAjZ,EAAAiK,EAAA,SAAAjK,GAAA,OAAAc,KAAAoZ,QAAAjQ,EAAArK,EAAAI,EAAA,GAAAiK,EAAA1O,EAAAA,EAAAyE,EAAAiK,EAAA,CAAAvM,MAAAkC,EAAAua,YAAA3B,EAAA4B,cAAA5B,EAAA6B,UAAA7B,IAAAxY,EAAAiK,GAAArK,GAAA+Y,EAAA,UAAAA,EAAA,WAAAA,EAAA,cAAAM,GAAAjZ,EAAAiK,EAAArK,EAAA4Y,EAAA,UAAAsQ,GAAAlpB,EAAA4Y,EAAAxY,EAAAiK,EAAA0O,EAAAtJ,EAAAlF,GAAA,QAAA5O,EAAAqE,EAAAyP,GAAAlF,GAAA4O,EAAAxd,EAAAmC,KAAA,OAAAkC,GAAA,YAAAI,EAAAJ,EAAA,CAAArE,EAAAsE,KAAA2Y,EAAAO,GAAAmC,QAAAC,QAAApC,GAAAqC,KAAAnR,EAAA0O,EAAA,UAAAmJ,GAAAliB,GAAA,sBAAA4Y,EAAA1X,KAAAd,EAAAiB,UAAA,WAAAia,QAAA,SAAAjR,EAAA0O,GAAA,IAAAtJ,EAAAzP,EAAAmb,MAAAvC,EAAAxY,GAAA,SAAA+oB,EAAAnpB,GAAAkpB,GAAAzZ,EAAApF,EAAA0O,EAAAoQ,EAAAC,EAAA,OAAAppB,EAAA,UAAAopB,EAAAppB,GAAAkpB,GAAAzZ,EAAApF,EAAA0O,EAAAoQ,EAAAC,EAAA,QAAAppB,EAAA,CAAAmpB,OAAA,MAsDA,SAOeE,GAAWpK,EAAA4D,EAAAmB,GAAA,OAAAsF,GAAAnO,MAAAja,KAAAG,UAAA,CA6B1B,SAAAioB,KAFC,OAEDA,GAAApH,GAAAhI,KAAAE,EA7BA,SAAAoD,EAA2B+L,EAASjnB,EAASlB,GAAK,IAAA2b,EAAAvb,EAAA2b,EAAA+B,EAAAsK,EAAAC,EAAAvJ,EAAA,OAAAhG,KAAAC,EAAA,SAAA8D,GAAA,cAAAA,EAAApS,EAAAoS,EAAAje,GAAA,OAY5C,OAXJoB,EAAQA,QAAAA,EAAS,oBAAmB6c,EAAApS,EAAA,EAE5BkR,EAAcT,GAAe2L,oBAAoBsB,GACjD/nB,EAAe+nB,EAAQnrB,OAGvB+e,EAAiB,IAAI9a,EAAeC,GAEpC4c,EAAgB5C,GAAe4L,aAAanL,EAAa,CAC7Dvb,aAAAA,EACA2b,eAAAA,IACAc,EAAAje,EAAA,EAEuBsc,GAAemM,cAAcvJ,GAAc,OAApD,OAAVsK,EAAUvL,EAAA1E,EAAA0E,EAAAje,EAAA,EAEMsc,GAAe6L,cAAcqB,EAAY,CAC7DpoB,MAAAA,EACAI,aAAAA,IACA,OAHW,OAAPioB,EAAOxL,EAAA1E,EAAA0E,EAAAxO,EAAA,EAMN,CAAEga,QAAAA,IAAS,OAE0B,MAF1BxL,EAAApS,EAAA,EAAAqU,EAAAjC,EAAA1E,EAElBmQ,QAAQC,MAAM,uBAAsBzJ,GAAQA,EAAA,cAAAjC,EAAAxO,EAAA,KAAA+N,EAAA,kBAG/CrC,MAAAja,KAAAG,UAAA,CAOD,SAASuoB,KAEP,OADuB,IAAIvnB,GACLwnB,UACxB,CAEA,SASeC,GAAWvD,GAAA,OAAAwD,GAAA5O,MAAAja,KAAAG,UAAA,UAAA0oB,KA6BzB,OA7ByBA,GAAA7H,GAAAhI,KAAAE,EAA1B,SAAA8D,EAA2B8L,GAAG,IAAA3qB,EAAA4qB,EAAA9D,EAAA+D,EAAAC,EAAAC,EAAA9B,EAAArE,EAAAoG,EAAA,OAAAnQ,KAAAC,EAAA,SAAA6E,GAAA,cAAAA,EAAAhf,GAAA,OAiB1B,OAhBMX,EAA0B2qB,EAA1B3qB,OAAQ4qB,EAAkBD,EAAlBC,SAAS9D,EAAS6D,EAAT7D,MAKvB+D,EAAYlmB,GAAA,CAAKkgB,WAAYvpB,GAAgBwrB,GACpC9mB,GACH8qB,EAAanpB,EAAQslB,YAAYjnB,GACvC6qB,EAAYlmB,GAAA,CAAKkgB,WAAYvpB,GAAgBwvB,IAE7CD,EAAe,CAAE1oB,aAAc,EAAG0iB,WAAYvpB,GAG1CyvB,EAAqB9N,GAAekK,wBAAwByD,GAC5D3B,EAAgBhM,GAAeoM,aAAa0B,EAAoB,CACpE5oB,aAAc0oB,EAAa1oB,eAC3Bwd,EAAAhf,EAAA,EAEsBsc,GAAemM,cAAcH,GAAc,OAOlE,OAPKrE,EAASjF,EAAAzF,EAGT8Q,EAAU/N,GAAegO,cAC7BrG,EACAiG,EAAa1oB,aACb0oB,EAAahG,YACdlF,EAAAvP,EAAA,EAEM,CAAE4a,QAAAA,EAASlE,KAAM+D,IAAc,EAAAhM,EAAA,KACvC/C,MAAAja,KAAAG,UAAA,CAlHDkpB,KAAKC,UAAS,eAAAljB,EAAA4a,GAAAhI,KAAAE,EAAG,SAAA4C,EAAO5c,GAAC,IAAAqqB,EAAAC,EAAAvnB,EAAAomB,EAAAS,EAAA1nB,EAAAlB,EAAA8kB,EAAAnI,EAAAC,EAAAe,EAAA,OAAA7E,KAAAC,EAAA,SAAAiD,GAAA,cAAAA,EAAAvR,EAAAuR,EAAApd,GAAA,OAAAyqB,EACqCrqB,EAAEqX,KAAtDiT,EAAKD,EAALC,MAAOvnB,EAAIsnB,EAAJtnB,KAAMomB,EAAOkB,EAAPlB,QAASS,EAAGS,EAAHT,IAAK1nB,EAAOmoB,EAAPnoB,QAASlB,EAAKqpB,EAALrpB,MAAO8kB,EAAIuE,EAAJvE,KAAI9I,EAAAvR,EAAA,EAAAmS,EAK7C7a,EAAIia,EAAApd,EACL,WADKge,EACG,EAGR,WAHQA,EAGA,EAGR,aAHQA,EAGE,EAGV,sBAHUA,EAGS,wBAAAZ,EAAApd,EAAA,EARPqpB,GAAYE,EAASjnB,EAASlB,GAAM,OAA7C,OAAN2c,EAAMX,EAAA7D,EAAA6D,EAAA3N,EAAA,oBAAA2N,EAAApd,EAAA,EAGS8pB,GAAYE,GAAI,OAAzB,OAANjM,EAAMX,EAAA7D,EAAA6D,EAAA3N,EAAA,oBAAA2N,EAAApd,EAAA,EAGSsc,GAAekM,aAAatC,GAAK,OAA1C,OAANnI,EAAMX,EAAA7D,EAAA6D,EAAA3N,EAAA,aAG8B,OAApCsO,EAAS6L,KAA2BxM,EAAA3N,EAAA,mBAG9B,IAAIlP,MAAK,gCAAAC,OAAiC2C,IAAO,QAG3DonB,KAAKI,YAAY,CAAED,MAAAA,EAAO3M,OAAAA,IAASX,EAAApd,EAAA,iBAAAod,EAAAvR,EAAA,GAAAkT,EAAA3B,EAAA7D,EAEnCmQ,QAAQC,MAAM,gBAAe5K,GAC7BwL,KAAKI,YAAY,CAAED,MAAAA,EAAOf,MAAO5K,EAAM6L,UAAU,eAAAxN,EAAA3N,EAAA,KAAAuN,EAAA,kBAEpD,gBAAAF,GAAA,OAAAxV,EAAA6T,MAAAja,KAAAG,UAAA,EA5Ba","sources":["webpack://carta1/./codec/core/constants.js","webpack://carta1/./codec/io/bitstream.js","webpack://carta1/./codec/io/serialization.js","webpack://carta1/./codec/core/options.js","webpack://carta1/./codec/utils.js","webpack://carta1/./codec/transforms/qmf.js","webpack://carta1/./codec/transforms/fft.js","webpack://carta1/./codec/transforms/mdct.js","webpack://carta1/./codec/coding/quantization.js","webpack://carta1/./codec/coding/bitallocation.js","webpack://carta1/./codec/core/buffers.js","webpack://carta1/./codec/analysis/transient.js","webpack://carta1/./codec/pipeline/encoder.js","webpack://carta1/./codec/pipeline/decoder.js","webpack://carta1/./codec/io/processor.js","webpack://carta1/./codec/browser/worker.js"],"sourcesContent":["/**\n * Carta1 Audio Codec - Core Constants\n */\n\n// Audio format\nexport const SAMPLE_RATE = 44100\nexport const SAMPLES_PER_FRAME = 512\nexport const FRAME_RATE = SAMPLE_RATE / SAMPLES_PER_FRAME\n\n// AEA file format\nexport const AEA_MAGIC = new Uint8Array([0x00, 0x08, 0x00, 0x00])\nexport const AEA_HEADER_SIZE = 2048\nexport const AEA_TITLE_OFFSET = 4\nexport const AEA_TITLE_SIZE = 256\nexport const AEA_FRAME_COUNT_OFFSET = 260\nexport const AEA_CHANNEL_COUNT_OFFSET = 264\n\n// Frame structure\nexport const SOUND_UNIT_SIZE = 212\nexport const FRAME_BITS = SOUND_UNIT_SIZE * 8\nexport const FRAME_OVERHEAD_BITS = 40\nexport const BITRATE_PER_CHANNEL = SOUND_UNIT_SIZE * FRAME_RATE * 8\n\n// BFU (Block Floating Unit) configuration\nexport const NUM_BFUS = 52\nexport const MAX_BFU_SIZE = 20\nexport const BITS_PER_BFU_METADATA = 10\n\nexport const SPECS_PER_BFU = new Int32Array([\n 8, 8, 8, 8, 4, 4, 4, 4, 8, 8, 8, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7,\n 7, 7, 9, 9, 9, 9, 10, 10, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 20, 20, 20,\n 20, 20, 20, 20, 20,\n])\n\nexport const BFU_AMOUNTS_COUNT = 8\nexport const BFU_AMOUNTS = new Int32Array([20, 28, 32, 36, 40, 44, 48, 52])\nexport const BFU_BAND_BOUNDARIES = new Int32Array([20, 36, 52])\n\n// BFU start positions\nexport const BFU_START_LONG = new Int32Array([\n 0, 8, 16, 24, 32, 36, 40, 44, 48, 56, 64, 72, 80, 86, 92, 98, 104, 110, 116,\n 122, 128, 134, 140, 146, 152, 159, 166, 173, 180, 189, 198, 207, 216, 226,\n 236, 246, 256, 268, 280, 292, 304, 316, 328, 340, 352, 372, 392, 412, 432,\n 452, 472, 492,\n])\n\nexport const BFU_START_SHORT = new Int32Array([\n 0, 32, 64, 96, 8, 40, 72, 104, 12, 44, 76, 108, 20, 52, 84, 116, 26, 58, 90,\n 122, 128, 160, 192, 224, 134, 166, 198, 230, 141, 173, 205, 237, 150, 182,\n 214, 246, 256, 288, 320, 352, 384, 416, 448, 480, 268, 300, 332, 364, 396,\n 428, 460, 492,\n])\n\n// Transform sizes\nexport const MDCT_SIZE_SHORT = 64\nexport const MDCT_SIZE_MID = 256\nexport const MDCT_SIZE_LONG = 512\n\n// Window functions\nexport const WINDOW_SHORT = (() => {\n const table = new Float64Array(32)\n for (let i = 0; i < 32; i++) {\n table[i] = Math.sin(((i + 0.5) * Math.PI) / 64)\n }\n return table\n})()\n\n// QMF configuration\nexport const QMF_TAPS = 48\nexport const QMF_DELAY = 46\nexport const QMF_HIGH_BAND_DELAY = 39\n\n// QMF prototype filter coefficients\nexport const QMF_COEFFS = new Float32Array([\n -0.00001461907, -0.00009205479, -0.000056157569, 0.00030117269, 0.0002422519,\n -0.00085293897, -0.0005205574, 0.0020340169, 0.00078333891, -0.0042153862,\n -0.00075614988, 0.0078402944, -0.000061169922, -0.01344162, 0.0024626821,\n 0.021736089, -0.007801671, -0.034090221, 0.01880949, 0.054326009,\n -0.043596379, -0.099384367, 0.13207909, 0.46424159,\n])\n\n// QMF window function\nexport const QMF_WINDOW = (() => {\n const window = new Float32Array(QMF_TAPS)\n for (let i = 0; i < 24; i++) {\n window[i] = QMF_COEFFS[i] * 2.0\n window[47 - i] = QMF_COEFFS[i] * 2.0\n }\n return window\n})()\n\n// QMF even/odd taps for optimization\nexport const QMF_EVEN = (() => {\n const even = new Float32Array(24)\n for (let i = 0; i < 24; i++) {\n even[i] = QMF_WINDOW[i * 2]\n }\n return even\n})()\n\nexport const QMF_ODD = (() => {\n const odd = new Float32Array(24)\n for (let i = 0; i < 24; i++) {\n odd[i] = QMF_WINDOW[i * 2 + 1]\n }\n return odd\n})()\n\n// FFT sizes for transient detection\nexport const FFT_SIZE_LOW = 128\nexport const FFT_SIZE_MID = 128\nexport const FFT_SIZE_HIGH = 256\n\n// MDCT/IMDCT transform configuration\nexport const MDCT_BAND_CONFIGS = [\n { size: 128, windowStart: 48 }, // Low band (0-5.5kHz)\n { size: 128, windowStart: 48 }, // Mid band (5.5-11kHz)\n { size: 256, windowStart: 112 }, // High band (11-22kHz)\n]\n\nexport const MDCT_SHORT_BLOCK_SIZE = 32\nexport const MDCT_OVERLAP_SIZE = 32\nexport const MDCT_TAIL_WINDOW_SIZE = 16\n\n// WAV format\nexport const WAV_HEADER_SIZE = 44\nexport const WAV_BYTES_PER_SAMPLE = 2\nexport const WAV_BITS_PER_SAMPLE = 16\nexport const WAV_PCM_MAX_POSITIVE = 0x7fff\nexport const WAV_PCM_MAX_NEGATIVE = 0x8000\nexport const WAV_DATA_OFFSET = 36\n\n// Frame serialization\nexport const FRAME_HEADER_BITS = 16\nexport const FRAME_WORD_LENGTH_BITS = 4\nexport const FRAME_SCALE_FACTOR_BITS = 6\n\n// Quantization\nexport const QUANTIZATION_SIGN_BIT_SHIFT = 1\nexport const MAX_WORD_LENGTH_INDEX = 15\nexport const WORD_LENGTH_BITS = new Int32Array([\n 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,\n])\nexport const SCALE_FACTORS = (() => {\n const table = new Float64Array(64)\n for (let i = 0; i < 64; i++) {\n table[i] = Math.pow(2.0, i / 3.0 - 21)\n }\n return table\n})()\n\n// Bit allocation\nexport const INV_POWER_OF_TWO = (() => {\n const maxBits = WORD_LENGTH_BITS[MAX_WORD_LENGTH_INDEX]\n const table = new Float64Array(maxBits + 1)\n for (let b = 0; b <= maxBits; b++) {\n table[b] = Math.pow(2, -b)\n }\n return table\n})()\n\nexport const WORD_LENGTH_DELTA_BITS = (() => {\n const table = new Int32Array(MAX_WORD_LENGTH_INDEX)\n for (let i = 0; i < MAX_WORD_LENGTH_INDEX; i++) {\n table[i] = (WORD_LENGTH_BITS[i + 1] - WORD_LENGTH_BITS[i]) | 0\n }\n return table\n})()\n\nexport const DISTORTION_DELTA_FACTORS = (() => {\n const table = new Float64Array(MAX_WORD_LENGTH_INDEX)\n table[0] = 2.0 - INV_POWER_OF_TWO[WORD_LENGTH_BITS[1]]\n for (let i = 1; i < MAX_WORD_LENGTH_INDEX; i++) {\n const bits1 = WORD_LENGTH_BITS[i] | 0\n const bits2 = WORD_LENGTH_BITS[i + 1] | 0\n table[i] = INV_POWER_OF_TWO[bits1] - INV_POWER_OF_TWO[bits2]\n }\n return table\n})()\n","/**\n * Carta1 Audio Codec - Bitstream Operations\n *\n * This module provides low-level bitstream packing and unpacking operations\n * for reading and writing ATRAC1 frame data with bit-level precision.\n */\n\n/**\n * Pack bits into a buffer at a specific bit position\n * @param {Uint8Array} buffer - Destination buffer\n * @param {number} bitPosition - Bit position to start writing at\n * @param {number} value - Value to pack\n * @param {number} bitCount - Number of bits to pack\n */\nexport function packBits(buffer, bitPosition, value, bitCount) {\n if (bitCount === 0) return\n\n let byteIndex = Math.floor(bitPosition / 8)\n let bitOffset = bitPosition % 8\n\n value &= (1 << bitCount) - 1\n\n let bitsWritten = 0\n while (bitsWritten < bitCount && byteIndex < buffer.length) {\n const bitsAvailable = 8 - bitOffset\n const bitsToWrite = Math.min(bitCount - bitsWritten, bitsAvailable)\n\n const shift = bitCount - bitsWritten - bitsToWrite\n const valueBits = (value >> shift) & ((1 << bitsToWrite) - 1)\n\n const mask = ((1 << bitsToWrite) - 1) << (bitsAvailable - bitsToWrite)\n buffer[byteIndex] =\n (buffer[byteIndex] & ~mask) | (valueBits << (bitsAvailable - bitsToWrite))\n\n bitsWritten += bitsToWrite\n byteIndex++\n bitOffset = 0\n }\n}\n\n/**\n * Unpack bits from a buffer at a specific bit position\n * @param {Uint8Array} buffer - Source buffer\n * @param {number} bitPosition - Bit position to start reading from\n * @param {number} bitCount - Number of bits to unpack\n * @returns {number} Unpacked unsigned value\n */\nexport function unpackBits(buffer, bitPosition, bitCount) {\n if (bitCount === 0) return 0\n\n let byteIndex = Math.floor(bitPosition / 8)\n let bitOffset = bitPosition % 8\n let value = 0\n\n for (let bitsRead = 0; bitsRead < bitCount && byteIndex < buffer.length;) {\n const bitsAvailable = 8 - bitOffset\n const bitsToRead = Math.min(bitCount - bitsRead, bitsAvailable)\n\n const mask = (1 << bitsToRead) - 1\n const bits = (buffer[byteIndex] >> (bitsAvailable - bitsToRead)) & mask\n\n value = (value << bitsToRead) | bits\n bitsRead += bitsToRead\n byteIndex++\n bitOffset = 0\n }\n\n return value\n}\n\n/**\n * Unpack signed bits from a buffer at a specific bit position\n * @param {Uint8Array} buffer - Source buffer\n * @param {number} bitPosition - Bit position to start reading from\n * @param {number} bitCount - Number of bits to unpack\n * @returns {number} Unpacked signed value (two's complement)\n */\nexport function unpackSignedBits(buffer, bitPosition, bitCount) {\n const value = unpackBits(buffer, bitPosition, bitCount)\n const signBit = 1 << (bitCount - 1)\n return value >= signBit ? value - (1 << bitCount) : value\n}\n","/**\n * Carta1 Audio Codec - Serialization Module\n *\n * Handles serialization and deserialization of ATRAC1 audio frames and AEA file format.\n * Provides functions for packing encoded frame data into binary format and unpacking\n * it back into structured data for processing.\n *\n * The module manages:\n * - Frame data serialization/deserialization with proper bit packing\n * - AEA file header creation and parsing\n * - Binary format compliance for ATRAC1 specification\n */\n\nimport {\n SOUND_UNIT_SIZE,\n BFU_AMOUNTS,\n SPECS_PER_BFU,\n AEA_HEADER_SIZE,\n AEA_MAGIC,\n AEA_TITLE_OFFSET,\n AEA_TITLE_SIZE,\n AEA_FRAME_COUNT_OFFSET,\n AEA_CHANNEL_COUNT_OFFSET,\n WORD_LENGTH_BITS,\n FRAME_HEADER_BITS,\n FRAME_WORD_LENGTH_BITS,\n FRAME_SCALE_FACTOR_BITS,\n} from '../core/constants.js'\nimport { packBits, unpackBits, unpackSignedBits } from './bitstream.js'\n\n/**\n * Serializes encoded frame data into binary format\n * @param {Object} frameData - The encoded frame data to serialize\n * @param {number} frameData.nBfu - Number of block floating units\n * @param {number[]} frameData.blockModes - Block modes for each band [0-2]\n * @param {Int32Array} frameData.scaleFactorIndices - Scale factor indices for each BFU\n * @param {Int32Array} frameData.wordLengthIndices - Word length indices for each BFU\n * @param {Int32Array[]} frameData.quantizedCoefficients - Quantized spectral coefficients\n * @returns {Uint8Array} Serialized frame data buffer\n */\nexport function serializeFrame(frameData) {\n const buffer = new Uint8Array(SOUND_UNIT_SIZE)\n const view = new DataView(buffer.buffer)\n\n // Pack header (16 bits)\n const bfuIndex = BFU_AMOUNTS.indexOf(frameData.nBfu)\n const header =\n ((2 - frameData.blockModes[0]) << 14) |\n ((2 - frameData.blockModes[1]) << 12) |\n ((3 - frameData.blockModes[2]) << 10) |\n (bfuIndex << 5)\n\n view.setUint16(0, header, false)\n let bitPosition = FRAME_HEADER_BITS\n\n // Pack word lengths (4 bits each)\n for (let i = 0; i < frameData.nBfu; i++) {\n packBits(\n buffer,\n bitPosition,\n frameData.wordLengthIndices[i],\n FRAME_WORD_LENGTH_BITS\n )\n bitPosition += FRAME_WORD_LENGTH_BITS\n }\n\n // Pack scale factors (6 bits each)\n for (let i = 0; i < frameData.nBfu; i++) {\n packBits(\n buffer,\n bitPosition,\n frameData.scaleFactorIndices[i],\n FRAME_SCALE_FACTOR_BITS\n )\n bitPosition += FRAME_SCALE_FACTOR_BITS\n }\n\n // Pack quantized coefficients\n for (let i = 0; i < frameData.nBfu; i++) {\n const bitsPerSample = WORD_LENGTH_BITS[frameData.wordLengthIndices[i]]\n if (bitsPerSample > 0) {\n const coefficients = frameData.quantizedCoefficients[i]\n for (const coefficient of coefficients) {\n const value =\n coefficient < 0 ? coefficient + (1 << bitsPerSample) : coefficient\n packBits(buffer, bitPosition, value, bitsPerSample)\n bitPosition += bitsPerSample\n }\n }\n }\n\n // Zero padding at end\n buffer[SOUND_UNIT_SIZE - 3] = 0\n buffer[SOUND_UNIT_SIZE - 2] = 0\n buffer[SOUND_UNIT_SIZE - 1] = 0\n\n return buffer\n}\n\n/**\n * Deserializes binary frame data back into structured format\n * @param {Uint8Array} buffer - Binary frame data buffer\n * @returns {Object} Deserialized frame data\n * @returns {number} returns.nBfu - Number of block floating units\n * @returns {number[]} returns.blockModes - Block modes for each band\n * @returns {Int32Array} returns.scaleFactorIndices - Scale factor indices for each BFU\n * @returns {Int32Array} returns.wordLengthIndices - Word length indices for each BFU\n * @returns {Int32Array[]} returns.quantizedCoefficients - Quantized spectral coefficients\n * @throws {Error} If buffer size is invalid\n */\nexport function deserializeFrame(buffer) {\n if (buffer.length !== SOUND_UNIT_SIZE) {\n throw new Error(`Frame must be ${SOUND_UNIT_SIZE} bytes`)\n }\n\n const view = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength)\n\n // Unpack header\n const header = view.getUint16(0, false)\n const blockModes = [\n 2 - ((header >> 14) & 3),\n 2 - ((header >> 12) & 3),\n 3 - ((header >> 10) & 3),\n ]\n const bfuIndex = (header >> 5) & 7\n const nBfu = BFU_AMOUNTS[bfuIndex]\n\n let bitPosition = FRAME_HEADER_BITS\n\n // Unpack word lengths\n const wordLengthIndices = new Int32Array(nBfu)\n for (let i = 0; i < nBfu; i++) {\n wordLengthIndices[i] = unpackBits(\n buffer,\n bitPosition,\n FRAME_WORD_LENGTH_BITS\n )\n bitPosition += FRAME_WORD_LENGTH_BITS\n }\n\n // Unpack scale factors\n const scaleFactorIndices = new Int32Array(nBfu)\n for (let i = 0; i < nBfu; i++) {\n scaleFactorIndices[i] = unpackBits(\n buffer,\n bitPosition,\n FRAME_SCALE_FACTOR_BITS\n )\n bitPosition += FRAME_SCALE_FACTOR_BITS\n }\n\n // Unpack coefficients\n const quantizedCoefficients = []\n for (let i = 0; i < nBfu; i++) {\n const bitsPerSample = WORD_LENGTH_BITS[wordLengthIndices[i]]\n const bfuSize = SPECS_PER_BFU[i]\n const coefficients = new Int32Array(bfuSize)\n\n if (bitsPerSample > 0) {\n for (let j = 0; j < bfuSize; j++) {\n coefficients[j] = unpackSignedBits(buffer, bitPosition, bitsPerSample)\n bitPosition += bitsPerSample\n }\n }\n\n quantizedCoefficients.push(coefficients)\n }\n\n return {\n nBfu,\n scaleFactorIndices,\n wordLengthIndices,\n quantizedCoefficients,\n blockModes,\n }\n}\n\n/**\n * AEA file format handler for ATRAC1 audio files\n * Manages creation and parsing of AEA file headers\n */\nexport class AeaFile {\n /**\n * Creates an AEA file header with the specified metadata\n * @param {string} [title=''] - Audio file title (max 255 characters)\n * @param {number} [frameCount=0] - Number of audio frames in the file\n * @param {number} [channelCount=1] - Number of audio channels (1 or 2)\n * @returns {Uint8Array} AEA file header buffer\n */\n static createHeader(title = '', frameCount = 0, channelCount = 1) {\n const header = new Uint8Array(AEA_HEADER_SIZE)\n const view = new DataView(header.buffer)\n\n // Magic number\n header.set(AEA_MAGIC, 0)\n\n // Title (null-terminated string)\n const titleBytes = new TextEncoder().encode(title)\n header.set(\n titleBytes.subarray(0, Math.min(titleBytes.length, AEA_TITLE_SIZE - 1)),\n AEA_TITLE_OFFSET\n )\n\n // Frame count\n view.setUint32(AEA_FRAME_COUNT_OFFSET, frameCount, true)\n\n // Channel count\n header[AEA_CHANNEL_COUNT_OFFSET] = channelCount\n\n return header\n }\n\n /**\n * Parses an AEA file header to extract metadata\n * @param {Uint8Array} header - AEA file header buffer\n * @returns {Object} Parsed header information\n * @returns {string} returns.title - Audio file title\n * @returns {number} returns.frameCount - Number of audio frames\n * @returns {number} returns.channelCount - Number of audio channels\n * @throws {Error} If header size is invalid or magic number doesn't match\n */\n static parseHeader(header) {\n if (header.length !== AEA_HEADER_SIZE) {\n throw new Error(`Header must be ${AEA_HEADER_SIZE} bytes`)\n }\n\n // Check magic number\n for (let i = 0; i < AEA_MAGIC.length; i++) {\n if (header[i] !== AEA_MAGIC[i]) {\n throw new Error('Invalid AEA file')\n }\n }\n\n const view = new DataView(\n header.buffer,\n header.byteOffset,\n header.byteLength\n )\n\n // Extract title\n const titleEnd = header.indexOf(0, AEA_TITLE_OFFSET)\n const titleLength =\n titleEnd === -1 ? AEA_TITLE_SIZE : titleEnd - AEA_TITLE_OFFSET\n const title = new TextDecoder().decode(\n header.subarray(AEA_TITLE_OFFSET, AEA_TITLE_OFFSET + titleLength)\n )\n\n // Extract metadata\n const frameCount = view.getUint32(AEA_FRAME_COUNT_OFFSET, true)\n const channelCount = header[AEA_CHANNEL_COUNT_OFFSET]\n\n return { title, frameCount, channelCount }\n }\n}\n","/**\n * Carta1 Audio Codec - Encoder Options\n *\n * This module provides configuration management for the ATRAC1 encoder,\n * including parameter validation and metadata for UI controls.\n */\n\n/**\n * Configuration options for the ATRAC1 encoder\n */\nclass EncoderOptions {\n /**\n * Create a new EncoderOptions instance\n * @param {Object} options - Initial option values\n */\n constructor(options = {}) {\n this.values = {\n transientThresholdLow: 1.0,\n transientThresholdMid: 1.5,\n transientThresholdHigh: 2.0,\n allocationBias: 1.0,\n fixedBlockModes: null,\n }\n\n this.metadata = {\n transientThresholdLow: {\n default: this.values.transientThresholdLow,\n name: 'Low Band Transient Threshold',\n description:\n 'Controls the transient detection threshold for the low frequency band (0-5.5kHz). Lower values make detection more sensitive, triggering short blocks more easily. Higher values require stronger transients.',\n range: [0.01, 2],\n step: 0.01,\n },\n transientThresholdMid: {\n default: this.values.transientThresholdMid,\n name: 'Mid Band Transient Threshold',\n description:\n 'Controls the transient detection threshold for the mid frequency band (5.5-11kHz). Lower values make detection more sensitive, triggering short blocks more easily. Higher values require stronger transients.',\n range: [0.01, 3],\n step: 0.01,\n },\n transientThresholdHigh: {\n default: this.values.transientThresholdHigh,\n name: 'High Band Transient Threshold',\n description:\n 'Controls the transient detection threshold for the high frequency band (11-22kHz). Lower values make detection more sensitive, triggering short blocks more easily. Higher values require stronger transients.',\n range: [0.01, 4],\n step: 0.01,\n },\n allocationBias: {\n default: this.values.allocationBias,\n name: 'Bit allocation bias',\n description:\n 'Controls how bits are distributed across the frequency spectrum during allocation. Higher values focus more bits on loud spectral components, while lower values spread bits more evenly across frequencies.',\n range: [0.0, 5.0],\n step: 0.01,\n },\n fixedBlockModes: {\n default: this.values.fixedBlockModes,\n name: 'Fixed block modes',\n description:\n 'Override transient detection and use fixed block modes. Format: [low, mid, high] where low/mid can be 0 or 2, high can be 0 or 3. When set, transient detection is skipped.',\n type: 'array',\n },\n }\n\n // Apply user-provided options\n if (options) {\n this.setOptions(options)\n }\n }\n\n /**\n * Set multiple options at once\n * @param {Object} options - Object containing option key-value pairs\n */\n setOptions(options) {\n for (const [key, value] of Object.entries(options)) {\n if (key in this.values) {\n this.setValue(key, value)\n }\n }\n }\n\n /**\n * Set a single option value with validation\n * @param {string} key - Option key\n * @param {*} value - Option value\n * @throws {Error} If key is unknown or value is out of range\n */\n setValue(key, value) {\n if (!(key in this.metadata)) {\n throw new Error(`Unknown option: ${key}`)\n }\n\n const meta = this.metadata[key]\n\n // Skip range validation for array types\n if (meta.type !== 'array') {\n const [min, max] = meta.range\n if (value < min || value > max) {\n throw new Error(\n `Value for ${key} must be between ${min} and ${max}, got ${value}`\n )\n }\n }\n\n this.values[key] = value\n }\n\n /**\n * Get the value of an option\n * @param {string} key - Option key\n * @returns {*} Option value\n * @throws {Error} If key is unknown\n */\n getValue(key) {\n if (!(key in this.values)) {\n throw new Error(`Unknown option: ${key}`)\n }\n return this.values[key]\n }\n\n get transientThresholdLow() {\n return this.values.transientThresholdLow\n }\n\n get transientThresholdMid() {\n return this.values.transientThresholdMid\n }\n\n get transientThresholdHigh() {\n return this.values.transientThresholdHigh\n }\n\n get allocationBias() {\n return this.values.allocationBias\n }\n\n get fixedBlockModes() {\n return this.values.fixedBlockModes\n }\n\n getMetadata(key) {\n return this.metadata[key]\n }\n\n getAllMetadata() {\n return { ...this.metadata }\n }\n\n reset() {\n for (const [key, meta] of Object.entries(this.metadata)) {\n this.values[key] = meta.default\n }\n }\n\n toObject() {\n return {\n values: { ...this.values },\n metadata: { ...this.metadata },\n }\n }\n}\n\nexport { EncoderOptions }\n","/**\n * Carta1 Audio Codec - Utilities\n *\n * This module provides common utility functions for the ATRAC1 codec including\n * pipeline composition, error handling, and audio stream processing utilities\n * for delay compensation and frame padding.\n */\n\n/**\n * Throws an error with the given message\n * @param {string} msg - Error message\n * @throws {Error} Always throws an error with the provided message\n */\nexport function throwError(msg) {\n throw new Error(msg)\n}\n\n/**\n * Creates a pipeline by composing multiple processing stages\n * @param {Object} context - Shared context passed to all stages\n * @param {...Function} stages - Stage functions to compose\n * @returns {Function} Composed pipeline function\n */\nexport function pipe(context, ...stages) {\n const functions = stages.map((stage) => stage(context))\n\n return (input) => {\n return functions.reduce((value, fn) => fn(value), input)\n }\n}\n\n/**\n * Reverses the spectral order of coefficients for mid/high band processing\n *\n * Used in both MDCT and IMDCT stages to handle spectral reversal required\n * by the ATRAC1 format for mid and high frequency bands.\n *\n * @param {Float32Array} spectrum - Input spectrum coefficients\n * @param {Object} reversalBuffers - Pre-allocated buffers for different spectrum sizes\n * @returns {Float32Array} Spectrum with reversed coefficient order\n */\nexport function reverseSpectrum(spectrum, reversalBuffers) {\n const reversed = reversalBuffers[spectrum.length]\n for (let i = 0; i < spectrum.length; i++) {\n reversed[i] = spectrum[spectrum.length - 1 - i]\n }\n return reversed\n}\n\n/**\n * Calculates the starting offset for a frequency band in the coefficient array\n *\n * @param {number} bandIndex - Band index (0=low, 1=mid, 2=high)\n * @returns {number} Starting offset in the 512-sample coefficient array\n */\nexport function calculateBandOffset(bandIndex) {\n return bandIndex === 0 ? 0 : bandIndex === 1 ? 128 : 256\n}\n\n/**\n * Extracts coefficients for a specific frequency band from the full coefficient array\n *\n * @param {Float32Array} coefficients - Full 512-sample coefficient array\n * @param {number} bandIndex - Band index (0=low, 1=mid, 2=high)\n * @returns {Float32Array} Subarray containing coefficients for the specified band\n */\nexport function extractBandCoefficients(coefficients, bandIndex) {\n const offsets = [0, 128, 256, 512]\n return coefficients.subarray(offsets[bandIndex], offsets[bandIndex + 1])\n}\n","/**\n * Carta1 Audio Codec - Quadrature Mirror Filter\n *\n * This module implements QMF analysis and synthesis for subband decomposition\n * in the ATRAC1 codec. The QMF splits the audio signal into multiple frequency\n * bands for independent processing and coding.\n */\n\nimport { QMF_DELAY, QMF_EVEN, QMF_ODD } from '../core/constants.js'\nimport { throwError } from '../utils.js'\n\n/**\n * Perform QMF analysis filtering to split input into low and high frequency bands\n * @param {Float32Array} input - Input audio samples\n * @param {Float32Array} delayLine - QMF delay line state\n * @param {Object} qmfWorkBuffers - Optional work buffers for processing\n * @returns {Object} Object containing lowBand, highBand, and newDelay\n */\nexport function qmfAnalysis(input, delayLine, qmfWorkBuffers = null) {\n const inputLength = input.length\n const outputLength = inputLength >> 1\n\n const workBuffer =\n qmfWorkBuffers?.delay?.[inputLength] ??\n throwError(`qmfAnalysis: qmfWorkBuffers.delay[${inputLength}] is required`)\n workBuffer.set(delayLine)\n workBuffer.set(input, delayLine.length)\n\n const lowBand = new Float32Array(outputLength)\n const highBand = new Float32Array(outputLength)\n\n for (let i = 0; i < outputLength; i++) {\n let evenSum = 0\n let oddSum = 0\n const offset = i * 2\n\n // Unrolled convolution\n for (let j = 0; j < 24; j++) {\n evenSum += workBuffer[offset + 47 - j * 2] * QMF_EVEN[j]\n oddSum += workBuffer[offset + 46 - j * 2] * QMF_ODD[j]\n }\n\n lowBand[i] = evenSum + oddSum\n highBand[i] = evenSum - oddSum\n }\n\n // Update delay line\n const newDelay = workBuffer.slice(-QMF_DELAY)\n return { lowBand, highBand, newDelay }\n}\n\n/**\n * Perform QMF synthesis filtering to reconstruct audio from low and high frequency bands\n * @param {Float32Array} lowBand - Low frequency band samples\n * @param {Float32Array} highBand - High frequency band samples\n * @param {Float32Array} delayLine - QMF delay line state\n * @param {Object} qmfWorkBuffers - Optional work buffers for processing\n * @returns {Object} Object containing output and newDelay\n */\nexport function qmfSynthesis(\n lowBand,\n highBand,\n delayLine,\n qmfWorkBuffers = null\n) {\n const subbandLength = lowBand.length\n const outputLength = subbandLength * 2\n\n const workBuffer =\n qmfWorkBuffers?.delay?.[outputLength] ??\n throwError(\n `qmfSynthesis: qmfWorkBuffers.delay[${outputLength}] is required`\n )\n workBuffer.set(delayLine)\n\n // Upsample and merge\n for (let i = 0; i < subbandLength; i++) {\n const low = lowBand[i]\n const high = highBand[i]\n const offset = QMF_DELAY + i * 2\n workBuffer[offset] = 0.5 * (low + high)\n workBuffer[offset + 1] = 0.5 * (low - high)\n }\n\n const output = new Float32Array(outputLength)\n\n // Convolution\n for (let i = 0; i < subbandLength; i++) {\n const offset = i * 2\n let sample0 = 0\n let sample1 = 0\n\n for (let j = 0; j < 24; j++) {\n const idx = offset + j * 2\n sample0 += workBuffer[idx] * QMF_EVEN[j]\n sample1 += workBuffer[idx + 1] * QMF_ODD[j]\n }\n\n output[i * 2] = sample1\n output[i * 2 + 1] = sample0\n }\n\n const newDelay = workBuffer.slice(-QMF_DELAY)\n return { output, newDelay }\n}\n","/**\n * Carta1 Audio Codec - Fast Fourier Transform\n *\n * This module implements a radix-2 Cooley-Tukey FFT algorithm for frequency domain\n * analysis used in psychoacoustic modeling and transient detection.\n */\n\nexport class FFT {\n /**\n * Perform in-place FFT on complex data\n * @param {Float32Array} real - Real part of input/output data\n * @param {Float32Array} imag - Imaginary part of input/output data\n */\n static fft(real, imag) {\n const size = real.length\n if (size === 1) return\n\n const bits = Math.log2(size)\n\n // Bit reversal\n for (let i = 0; i < size; i++) {\n let reversed = 0\n let temp = i\n for (let b = 0; b < bits; b++) {\n reversed = (reversed << 1) | (temp & 1)\n temp >>= 1\n }\n if (reversed > i) {\n ;[real[i], real[reversed]] = [real[reversed], real[i]]\n ;[imag[i], imag[reversed]] = [imag[reversed], imag[i]]\n }\n }\n\n // Cooley-Tukey decimation-in-time\n for (let stride = 2; stride <= size; stride <<= 1) {\n const halfStride = stride >> 1\n const angle = (-2 * Math.PI) / stride\n const wReal = Math.cos(angle)\n const wImag = Math.sin(angle)\n\n for (let start = 0; start < size; start += stride) {\n let twiddleReal = 1\n let twiddleImag = 0\n\n for (let k = 0; k < halfStride; k++) {\n const evenIndex = start + k\n const oddIndex = evenIndex + halfStride\n\n const evenReal = real[evenIndex]\n const evenImag = imag[evenIndex]\n const oddReal = real[oddIndex]\n const oddImag = imag[oddIndex]\n\n const tReal = oddReal * twiddleReal - oddImag * twiddleImag\n const tImag = oddReal * twiddleImag + oddImag * twiddleReal\n\n real[evenIndex] = evenReal + tReal\n imag[evenIndex] = evenImag + tImag\n real[oddIndex] = evenReal - tReal\n imag[oddIndex] = evenImag - tImag\n\n const nextReal = twiddleReal * wReal - twiddleImag * wImag\n twiddleImag = twiddleReal * wImag + twiddleImag * wReal\n twiddleReal = nextReal\n }\n }\n }\n }\n}\n","/**\n * Carta1 Audio Codec - Modified Discrete Cosine Transform\n *\n * This module implements forward and inverse MDCT transforms for the ATRAC1 codec.\n * The MDCT provides time-frequency analysis with perfect reconstruction and\n * 50% overlap between adjacent blocks to avoid blocking artifacts.\n */\n\nimport { FFT } from './fft.js'\nimport {\n MDCT_SIZE_SHORT,\n MDCT_SIZE_MID,\n MDCT_SIZE_LONG,\n} from '../core/constants.js'\nimport { throwError } from '../utils.js'\n\n/**\n * Base class for MDCT and IMDCT transforms\n */\nclass MDCTBase {\n constructor(size, scale) {\n this.size = size\n this.halfSize = size >> 1\n this.quarterSize = size >> 2\n this.fftSize = this.halfSize >> 1\n\n const alpha = (2.0 * Math.PI) / (8.0 * size)\n const omega = (2.0 * Math.PI) / size\n const scaleRoot = Math.sqrt(scale / size)\n\n this.sinCosTable = new Float64Array(this.halfSize)\n for (let i = 0; i < this.quarterSize; i++) {\n const angle = omega * i + alpha\n this.sinCosTable[i * 2] = scaleRoot * Math.cos(angle)\n this.sinCosTable[i * 2 + 1] = scaleRoot * Math.sin(angle)\n }\n }\n}\n\n/**\n * Forward MDCT transform\n */\nexport class MDCT extends MDCTBase {\n constructor(size, scale) {\n super(size, scale)\n }\n\n /**\n * Perform forward MDCT transform\n * @param {Float32Array} input - Time-domain input samples\n * @param {Object} mdctBuffers - Optional work buffers for FFT\n * @returns {Float32Array} Frequency-domain MDCT coefficients\n */\n transform(input, mdctBuffers = null) {\n const buffers =\n mdctBuffers?.[this.fftSize] ??\n throwError(`MDCT.transform: mdctBuffers[${this.fftSize}] is required`)\n const real =\n buffers?.real ??\n throwError(\n `MDCT.transform: mdctBuffers[${this.fftSize}].real is required`\n )\n const imag =\n buffers?.imag ??\n throwError(\n `MDCT.transform: mdctBuffers[${this.fftSize}].imag is required`\n )\n\n const n4 = this.quarterSize\n const n34 = 3 * n4\n\n real.fill(0)\n imag.fill(0)\n\n // Pre-FFT butterfly\n for (let i = 0; i < n4; i += 2) {\n const i1 = n34 - 1 - i\n const i2 = n34 + i\n const i3 = n4 + i\n const i4 = n4 - 1 - i\n\n const r = input[i1] + input[i2]\n const im = input[i3] - input[i4]\n const c = this.sinCosTable[i]\n const s = this.sinCosTable[i + 1]\n\n real[i >> 1] = r * c + im * s\n imag[i >> 1] = im * c - r * s\n }\n\n for (let i = n4; i < this.halfSize; i += 2) {\n const idx = i >> 1\n const i1 = n34 - 1 - i\n const i2 = i - n4\n const i3 = n4 + i\n const i4 = 5 * n4 - 1 - i\n\n const r = input[i1] - input[i2]\n const im = input[i3] + input[i4]\n const c = this.sinCosTable[i]\n const s = this.sinCosTable[i + 1]\n\n real[idx] = r * c + im * s\n imag[idx] = im * c - r * s\n }\n\n FFT.fft(real, imag)\n\n // Post-FFT processing\n const output = new Float32Array(this.halfSize)\n for (let i = 0; i < this.fftSize; i++) {\n const c = this.sinCosTable[i * 2]\n const s = this.sinCosTable[i * 2 + 1]\n const re = real[i]\n const im = imag[i]\n\n output[i * 2] = -re * c - im * s\n output[this.halfSize - 1 - i * 2] = -re * s + im * c\n }\n\n return output\n }\n}\n\n/**\n * Inverse MDCT transform\n */\nexport class IMDCT extends MDCTBase {\n constructor(size, scale = null) {\n super(size, scale || size)\n }\n\n /**\n * Perform inverse MDCT transform\n * @param {Float32Array} input - Frequency-domain MDCT coefficients\n * @param {Object} mdctBuffers - Optional work buffers for FFT\n * @returns {Float32Array} Time-domain output samples\n */\n transform(input, mdctBuffers = null) {\n const buffers =\n mdctBuffers?.[this.fftSize] ??\n throwError(`IMDCT.transform: mdctBuffers[${this.fftSize}] is required`)\n const real =\n buffers?.real ??\n throwError(\n `IMDCT.transform: mdctBuffers[${this.fftSize}].real is required`\n )\n const imag =\n buffers?.imag ??\n throwError(\n `IMDCT.transform: mdctBuffers[${this.fftSize}].imag is required`\n )\n\n const n4 = this.quarterSize\n const n34 = 3 * n4\n\n real.fill(0)\n imag.fill(0)\n\n // Pre-FFT processing\n for (let i = 0; i < this.fftSize; i++) {\n const i2 = i * 2\n const r = -input[i2]\n const im = -input[this.halfSize - 1 - i2]\n const c = this.sinCosTable[i2]\n const s = this.sinCosTable[i2 + 1]\n\n real[i] = im * s + r * c\n imag[i] = im * c - r * s\n }\n\n FFT.fft(real, imag)\n\n // Post-FFT butterfly\n const output = new Float32Array(this.size)\n\n for (let i = 0; i < this.fftSize / 2; i++) {\n const i2 = i * 2\n const c = this.sinCosTable[i2]\n const s = this.sinCosTable[i2 + 1]\n const re = real[i]\n const im = imag[i]\n\n const r1 = re * c + im * s\n const i1 = re * s - im * c\n\n output[n34 - 1 - i2] = r1\n output[n34 + i2] = r1\n output[n4 + i2] = i1\n output[n4 - 1 - i2] = -i1\n }\n\n for (let i = this.fftSize / 2; i < this.fftSize; i++) {\n const idx = (i - this.fftSize / 2) * 2 + n4\n const i2 = i * 2\n const c = this.sinCosTable[i2]\n const s = this.sinCosTable[i2 + 1]\n const re = real[i]\n const im = imag[i]\n\n const r1 = re * c + im * s\n const i1 = re * s - im * c\n\n output[n34 - 1 - idx] = r1\n output[idx - n4] = -r1\n output[n4 + idx] = i1\n output[5 * n4 - 1 - idx] = i1\n }\n\n return output\n }\n}\n\n// Pre-instantiated transforms\nexport const mdct64 = new MDCT(MDCT_SIZE_SHORT, 0.5)\nexport const mdct256 = new MDCT(MDCT_SIZE_MID, 0.5)\nexport const mdct512 = new MDCT(MDCT_SIZE_LONG, 1.0)\n\nexport const imdct64 = new IMDCT(MDCT_SIZE_SHORT, MDCT_SIZE_SHORT * 8)\nexport const imdct256 = new IMDCT(MDCT_SIZE_MID, MDCT_SIZE_MID * 8)\nexport const imdct512 = new IMDCT(MDCT_SIZE_LONG, MDCT_SIZE_LONG * 4)\n\n/**\n * Perform overlap-add operation for MDCT reconstruction\n * @param {Float32Array} prev - Previous block samples\n * @param {Float32Array} curr - Current block samples\n * @param {Float32Array} window - Window function coefficients\n * @returns {Float32Array} Overlap-added output samples\n */\nexport function overlapAdd(prev, curr, window) {\n const size = prev.length\n const output = new Float32Array(size * 2)\n\n for (let i = 0; i < size; i++) {\n const w1 = window[i]\n const w2 = window[2 * size - 1 - i]\n const p = prev[i]\n const c = curr[size - 1 - i]\n\n output[i] = p * w2 - c * w1\n output[2 * size - 1 - i] = p * w1 + c * w2\n }\n\n return output\n}\n","/**\n * Carta1 Audio Codec - Quantization Module\n *\n * This module handles the quantization and dequantization of MDCT frequency coefficients\n * for the Carta1 audio codec. It provides functions to convert floating-point frequency\n * domain data into integer representations suitable for bitstream encoding.\n *\n * Key functions:\n * - Quantization of coefficients using scale factors and bit depths\n * - Dequantization for reconstruction during decoding\n * - BFU (Band Frequency Unit) organization for psychoacoustic processing\n *\n * The quantization process uses configurable scale factors to maintain audio quality\n * while achieving the target compression ratio. The module supports both uniform\n * and non-uniform quantization schemes based on perceptual importance.\n */\n\nimport {\n SPECS_PER_BFU,\n BFU_START_LONG,\n BFU_START_SHORT,\n BFU_BAND_BOUNDARIES,\n SCALE_FACTORS,\n QUANTIZATION_SIGN_BIT_SHIFT,\n} from '../core/constants.js'\n\n/**\n * Quantize coefficients.\n * @param {Float32Array} coefficients\n * @param {number} scaleFactorIndex\n * @param {number} bitsPerSample\n * @returns {Int32Array} out\n */\nexport function quantize(coefficients, scaleFactorIndex, bitsPerSample) {\n const length = coefficients.length\n const out = new Int32Array(length)\n if (bitsPerSample === 0 || scaleFactorIndex === 0) {\n out.fill(0, 0, length)\n return out\n }\n\n const scaleFactor = SCALE_FACTORS[scaleFactorIndex]\n const quantRange = (1 << (bitsPerSample - QUANTIZATION_SIGN_BIT_SHIFT)) - 1\n const normFactor = quantRange / scaleFactor\n\n const hi = quantRange\n const lo = -quantRange\n\n for (let i = 0; i < length; i++) {\n const x = coefficients[i] * normFactor\n const y = (x + (x >= 0 ? 0.5 : -0.5)) | 0\n out[i] = y > hi ? hi : y < lo ? lo : y\n }\n\n return out\n}\n\n/**\n * Dequantize coefficients.\n * @param {Int32Array} quantized\n * @param {number} scaleFactorIndex\n * @param {number} bitsPerSample\n * @returns {Float32Array}\n */\nexport function dequantize(quantized, scaleFactorIndex, bitsPerSample) {\n if (bitsPerSample === 0 || scaleFactorIndex === 0) {\n return new Float32Array(quantized.length)\n }\n\n const scaleFactor = SCALE_FACTORS[scaleFactorIndex]\n const quantRange = (1 << (bitsPerSample - QUANTIZATION_SIGN_BIT_SHIFT)) - 1\n\n const deq = new Float32Array(quantized.length)\n for (let i = 0; i < quantized.length; i++) {\n deq[i] = (quantized[i] * scaleFactor) / quantRange\n }\n return deq\n}\n\n/**\n * Groups MDCT coefficients into Band Frequency Units (BFUs) for bit allocation.\n *\n * This function organizes frequency-domain coefficients into perceptually meaningful\n * frequency bands (BFUs) based on the block modes for each of the three frequency bands.\n * It handles both long and short blocks, with different frequency resolutions and\n * BFU start positions for each block type.\n *\n * The function implements copy-avoidance optimization: when a BFU slice is fully\n * contained within a frequency band, it directly copies the data without buffer\n * filling. For BFUs that span band boundaries or extend beyond the available\n * coefficients, it handles partial copying and zero-padding appropriately.\n *\n * Frequency Band Structure:\n * - Band 0: 0-128 coefficients (low frequencies)\n * - Band 1: 128-256 coefficients (mid frequencies)\n * - Band 2: 256-512 coefficients (high frequencies)\n *\n * Block Types:\n * - Long blocks (mode 0): Higher frequency resolution, fewer temporal segments\n * - Short blocks (mode 1): Lower frequency resolution, more temporal segments\n *\n * @param {Float32Array} coefficients\n * @param {Array<number>} blockModes\n * @returns {{bfuData: Array<Float32Array>, bfuSizes: Array<number>, bfuCount: number}}\n */\nexport function groupIntoBFUs(coefficients, blockModes) {\n const bfuData = []\n const bfuSizes = []\n\n let coeffIndex = 0\n let bfuIndex = 0\n\n for (let band = 0; band < 3; band++) {\n const bandStart = coeffIndex\n const bandSize = band === 2 ? 256 : 128\n const bandEnd = band < 2 ? BFU_BAND_BOUNDARIES[band] : SPECS_PER_BFU.length\n const isLongBlock = blockModes[band] === 0\n const startPositions = isLongBlock ? BFU_START_LONG : BFU_START_SHORT\n\n while (bfuIndex < bandEnd) {\n const size = SPECS_PER_BFU[bfuIndex]\n const startPos = startPositions[bfuIndex] - bandStart\n const endPos = startPos + size\n const bfu = new Float32Array(size)\n\n if (startPos >= 0 && endPos <= bandSize) {\n bfu.set(coefficients.subarray(bandStart + startPos, bandStart + endPos))\n } else {\n bfu.fill(0)\n if (startPos < bandSize && endPos > 0) {\n const srcStart = Math.max(0, startPos)\n const srcEnd = Math.min(bandSize, endPos)\n bfu.set(\n coefficients.subarray(bandStart + srcStart, bandStart + srcEnd),\n Math.max(0, -startPos)\n )\n }\n }\n\n bfuData.push(bfu)\n bfuSizes.push(size)\n bfuIndex++\n }\n\n coeffIndex += bandSize\n }\n\n return { bfuData, bfuSizes, bfuCount: bfuIndex }\n}\n","/**\n * Carta1 Audio Codec - Bit Allocation Module\n *\n * This module implements the bit allocation system for the Carta1 audio codec,\n * responsible for distributing available bits across frequency bands to minimize\n * perceptual distortion while maintaining the target bitrate.\n *\n * The module uses Rate-Distortion Optimization (RDO) by searching over a\n * predefined set of valid Band Frequency Unit (BFU) counts. For each count,\n * it performs a greedy bit distribution to find the best allocation. This\n * approach optimally trades off the cost of encoding more frequency bands\n * (metadata overhead) against the benefit of reducing truncation distortion.\n *\n * Key components:\n * - RDO search over valid BFU counts to select the optimal number of bands.\n * - Greedy bit allocation for a fixed BFU count using a max-heap.\n * - Exponential distortion modeling based on scale factors.\n * - Support for variable word lengths per BFU.\n *\n * The algorithm ensures that the codec dynamically adapts the encoded bandwidth\n * to best match the signal characteristics for the given bitrate.\n */\n\nimport {\n NUM_BFUS,\n FRAME_BITS,\n FRAME_OVERHEAD_BITS,\n BITS_PER_BFU_METADATA,\n MAX_WORD_LENGTH_INDEX,\n WORD_LENGTH_BITS,\n INV_POWER_OF_TWO,\n SCALE_FACTORS,\n BFU_AMOUNTS,\n WORD_LENGTH_DELTA_BITS,\n DISTORTION_DELTA_FACTORS,\n} from '../core/constants.js'\n\nconst biasedScaleFactorCache = new Map()\n\n/**\n * Builds and returns a cached table of biased scale factors.\n *\n * @param {number} bias\n * @returns {Float64Array}\n */\nfunction buildBiasedScaleFactorTable(bias) {\n if (biasedScaleFactorCache.has(bias)) {\n return biasedScaleFactorCache.get(bias)\n }\n\n const out = new Float64Array(64)\n if (bias === 1) {\n out.set(SCALE_FACTORS)\n } else {\n for (let i = 0; i < 64; i++) {\n out[i] = Math.pow(SCALE_FACTORS[i], bias)\n }\n }\n biasedScaleFactorCache.set(bias, out)\n return out\n}\n\n/**\n * Allocate bits by finding the optimal BFU count and distribution using RDO.\n * This function searches through the valid BFU counts to find the one that\n * minimizes the total perceptual distortion.\n *\n * @param {Array<Float32Array>} bfuData\n * @param {Int32Array} bfuSizes\n * @param {number} maxBfuCount\n * @param {number} allocationBias\n * @returns {{bfuCount:number, allocation:Int32Array, scaleFactorIndices:Int32Array}}\n */\nexport function allocateBits(bfuData, bfuSizes, maxBfuCount, allocationBias) {\n const allScaleFactorIndices = new Int32Array(maxBfuCount)\n const zeroBitDistortions = new Float32Array(maxBfuCount)\n const biasedScaleFactors = buildBiasedScaleFactorTable(allocationBias)\n\n for (let i = 0; i < maxBfuCount; i++) {\n const sz = bfuSizes[i] | 0\n if (sz === 0) continue\n\n const sfi = findScaleFactor(bfuData[i], sz)\n allScaleFactorIndices[i] = sfi\n if (sfi > 0) {\n const effectiveScaleFactor = biasedScaleFactors[sfi]\n zeroBitDistortions[i] = effectiveScaleFactor * 2.0 * sz\n }\n }\n\n let bestResult = null\n let minTotalDistortion = Infinity\n\n for (const candidateBfuCount of BFU_AMOUNTS) {\n if (candidateBfuCount > maxBfuCount) continue\n\n const availableBits =\n FRAME_BITS -\n FRAME_OVERHEAD_BITS -\n candidateBfuCount * BITS_PER_BFU_METADATA\n\n if (availableBits < 0) continue\n\n const rdoResult = distributeBitsRDO(\n candidateBfuCount,\n bfuSizes,\n availableBits,\n biasedScaleFactors,\n allScaleFactorIndices\n )\n\n const totalDistortion = calculateTotalDistortion(\n candidateBfuCount,\n maxBfuCount,\n bfuSizes,\n rdoResult.wordLengths,\n rdoResult.scaleFactorIndices,\n biasedScaleFactors,\n zeroBitDistortions\n )\n\n if (totalDistortion < minTotalDistortion) {\n minTotalDistortion = totalDistortion\n bestResult = {\n bfuCount: candidateBfuCount,\n allocation: rdoResult.wordLengths,\n scaleFactorIndices: rdoResult.scaleFactorIndices,\n }\n }\n }\n\n if (!bestResult) {\n const fallbackBfuCount = BFU_AMOUNTS[0]\n return {\n bfuCount: fallbackBfuCount,\n allocation: new Int32Array(fallbackBfuCount),\n scaleFactorIndices: new Int32Array(NUM_BFUS),\n }\n }\n\n return bestResult\n}\n\n/**\n * Calculates the total distortion for a given allocation.\n * This includes quantization distortion for coded bands and truncation\n * distortion for uncoded bands.\n * @param {number} activeBfuCount\n * @param {number} maxBfuCount\n * @param {Int32Array} bfuSizes\n * @param {Int32Array} wordLengths\n * @param {Int32Array} scaleFactorIndices\n * @param {number} biasedScaleFactors\n * @param {Float32Array} zeroBitDistortions\n * @returns {number}\n */\nfunction calculateTotalDistortion(\n activeBfuCount,\n maxBfuCount,\n bfuSizes,\n wordLengths,\n scaleFactorIndices,\n biasedScaleFactors,\n zeroBitDistortions\n) {\n let totalDistortion = 0.0\n\n for (let i = 0; i < activeBfuCount; i++) {\n const wl = wordLengths[i] | 0\n const bits = WORD_LENGTH_BITS[wl] | 0\n if (bits === 0) {\n totalDistortion += zeroBitDistortions[i]\n continue\n }\n\n const sfi = scaleFactorIndices[i]\n if (sfi === 0) continue\n\n const effectiveScaleFactor = biasedScaleFactors[sfi]\n const distortionFactor = INV_POWER_OF_TWO[bits]\n\n totalDistortion += effectiveScaleFactor * distortionFactor * bfuSizes[i]\n }\n\n for (let i = activeBfuCount; i < maxBfuCount; i++) {\n totalDistortion += zeroBitDistortions[i]\n }\n\n return totalDistortion\n}\n\n/**\n * Distributes available bits across Band Frequency Units (BFUs) using Rate-Distortion Optimization.\n * (Modified to accept pre-calculated scale factors)\n *\n * @param {number} activeBfuCount\n * @param {Int32Array} bfuSizes\n * @param {number} remainingBits\n * @param {Float64Array} biasedScaleFactors\n * @param {Int32Array} allScaleFactorIndices\n * @returns {{wordLengths: Int32Array, scaleFactorIndices: Int32Array}}\n */\nfunction distributeBitsRDO(\n activeBfuCount,\n bfuSizes,\n remainingBits,\n biasedScaleFactors,\n allScaleFactorIndices\n) {\n const wordLengths = new Int32Array(activeBfuCount)\n\n const heapIndices = new Int32Array(activeBfuCount)\n const heapPriorities = new Float32Array(activeBfuCount)\n let heapSize = 0\n\n for (let bfuIndex = 0; bfuIndex < activeBfuCount; bfuIndex++) {\n const sz = bfuSizes[bfuIndex] | 0\n if (sz === 0) continue\n\n const sfi = allScaleFactorIndices[bfuIndex]\n if (sfi === 0) continue\n\n const deltaBits = WORD_LENGTH_DELTA_BITS[0]\n if (deltaBits <= 0) continue\n\n const distortionDelta =\n biasedScaleFactors[sfi] * DISTORTION_DELTA_FACTORS[0]\n\n heapIndices[heapSize] = bfuIndex\n heapPriorities[heapSize] = distortionDelta / deltaBits\n heapSize++\n }\n\n if (heapSize === 0) {\n return { wordLengths, scaleFactorIndices: allScaleFactorIndices }\n }\n\n // Heapify\n for (let i = (heapSize >> 1) - 1; i >= 0; i--) {\n siftDown(heapIndices, heapPriorities, i, heapSize)\n }\n\n // Greedy spending loop\n while (remainingBits > 0 && heapSize > 0) {\n const bfu = heapIndices[0]\n const cur = wordLengths[bfu] | 0\n const sz = bfuSizes[bfu] | 0\n const deltaBits = WORD_LENGTH_DELTA_BITS[cur]\n const cost = deltaBits * sz\n\n if (cost > remainingBits || cost <= 0) {\n const last = heapSize - 1\n heapIndices[0] = heapIndices[last]\n heapPriorities[0] = heapPriorities[last]\n heapSize--\n if (heapSize > 0) siftDown(heapIndices, heapPriorities, 0, heapSize)\n continue\n }\n\n remainingBits -= cost\n const nxt = cur + 1\n wordLengths[bfu] = nxt\n\n const deltaBitsNext = WORD_LENGTH_DELTA_BITS[nxt]\n if (nxt < MAX_WORD_LENGTH_INDEX && deltaBitsNext > 0) {\n const sfi = allScaleFactorIndices[bfu]\n const distortionDelta =\n biasedScaleFactors[sfi] * DISTORTION_DELTA_FACTORS[nxt]\n heapPriorities[0] = distortionDelta / deltaBitsNext\n siftDown(heapIndices, heapPriorities, 0, heapSize)\n } else {\n const last = heapSize - 1\n heapIndices[0] = heapIndices[last]\n heapPriorities[0] = heapPriorities[last]\n heapSize--\n if (heapSize > 0) siftDown(heapIndices, heapPriorities, 0, heapSize)\n }\n }\n\n return { wordLengths, scaleFactorIndices: allScaleFactorIndices }\n}\n\n/**\n * Find the optimal scale factor index for a set of coefficients.\n * Same semantics as the original.\n * @param {Float32Array} coefficients\n * @param {number} length\n * @returns {number}\n */\nexport function findScaleFactor(coefficients, length) {\n let maxAmplitude = 0.0\n for (let i = 0; i < length; i++) {\n const a = Math.abs(coefficients[i])\n if (a > maxAmplitude) maxAmplitude = a\n }\n if (maxAmplitude === 0) return 0\n const index = Math.ceil(3 * (Math.log2(maxAmplitude) + 21))\n return Math.max(0, Math.min(63, index))\n}\n\n/**\n * Restores max-heap property by sifting an element down from a given position.\n *\n * This function maintains the heap invariant where parent nodes have higher\n * priority values than their children. It compares the element at startIndex\n * with its children and swaps with the larger child until the heap property\n * is satisfied, or it reaches a leaf position.\n *\n * @param {Int32Array} heapIndices\n * @param {Float32Array} heapPriorities\n * @param {number} startIndex\n * @param {number} heapSize\n */\nfunction siftDown(heapIndices, heapPriorities, startIndex, heapSize) {\n let i = startIndex\n const idxVal = heapIndices[i]\n const prVal = heapPriorities[i]\n\n while (true) {\n const l = (i << 1) + 1\n const r = l + 1\n let maxI = i\n let maxP = prVal\n\n if (l < heapSize && heapPriorities[l] > maxP) {\n maxI = l\n maxP = heapPriorities[l]\n }\n if (r < heapSize && heapPriorities[r] > maxP) {\n maxI = r\n }\n if (maxI === i) break\n\n heapIndices[i] = heapIndices[maxI]\n heapPriorities[i] = heapPriorities[maxI]\n i = maxI\n }\n\n heapIndices[i] = idxVal\n heapPriorities[i] = prVal\n}\n","/**\n * Carta1 Audio Codec - Buffer Management\n */\n\nimport { QMF_DELAY, QMF_HIGH_BAND_DELAY } from './constants.js'\n\nexport class BufferPool {\n constructor() {\n // Transform buffers\n this.transformBuffers = {\n 64: new Float32Array(64),\n 128: new Float32Array(128),\n 256: new Float32Array(256),\n 512: new Float32Array(512),\n }\n\n // QMF work buffers\n this.qmfWorkBuffers = {\n delay: {\n 128: new Float32Array(QMF_DELAY + 128),\n 256: new Float32Array(QMF_DELAY + 256),\n 512: new Float32Array(QMF_DELAY + 512),\n },\n highBandDelay: {\n 128: new Float32Array(QMF_HIGH_BAND_DELAY + 128),\n 256: new Float32Array(QMF_HIGH_BAND_DELAY + 256),\n },\n }\n\n // QMF delay lines\n this.qmfDelays = {\n lowBand: new Float32Array(QMF_DELAY),\n midBand: new Float32Array(QMF_DELAY),\n highBand: new Float32Array(QMF_HIGH_BAND_DELAY),\n }\n\n // Transient detector\n this.transientDetection = [\n new Float32Array(64),\n new Float32Array(64),\n new Float32Array(128),\n ]\n\n // MDCT/IMDCT work buffers\n this.mdctBuffers = {\n 16: {\n real: new Float32Array(16),\n imag: new Float32Array(16),\n },\n 64: {\n real: new Float32Array(64),\n imag: new Float32Array(64),\n },\n 128: {\n real: new Float32Array(128),\n imag: new Float32Array(128),\n },\n }\n\n // MDCT overlap buffers (encoder)\n this.mdctOverlap = [\n new Float32Array(32),\n new Float32Array(32),\n new Float32Array(32),\n ]\n\n // IMDCT overlap buffers (decoder)\n this.imdctOverlap = [\n new Float32Array(256),\n new Float32Array(256),\n new Float32Array(512),\n ]\n\n // Spectrum reversal buffers\n this.reversalBuffers = {\n 32: new Float32Array(32),\n 128: new Float32Array(128),\n 256: new Float32Array(256),\n }\n }\n}\n","/**\n * Carta1 Audio Codec - Transient Detection Module\n *\n * Detects transients using spectral flux analysis to prevent pre-echo artifacts.\n * Combines multiple spectral features to identify sudden changes in signal\n * characteristics that require special handling during encoding.\n */\n\nimport { FFT } from '../transforms/fft.js'\n\n/**\n * Perform FFT on time-domain samples and return magnitude spectrum\n * @param {Float32Array} samples - Time-domain samples\n * @param {number} fftSize - FFT size (must be power of 2)\n * @returns {Float32Array} Magnitude spectrum (positive frequencies only)\n */\nexport function performFFT(samples, fftSize) {\n const real = new Float32Array(fftSize)\n const imag = new Float32Array(fftSize)\n\n // Copy samples with zero-padding if necessary\n const copyLen = Math.min(samples.length, fftSize)\n real.set(samples.subarray(0, copyLen))\n\n // Perform FFT\n FFT.fft(real, imag)\n\n // Calculate magnitude spectrum for positive frequencies\n const magnitude = new Float32Array(fftSize / 2)\n for (let i = 0; i < fftSize / 2; i++) {\n magnitude[i] = Math.sqrt(real[i] * real[i] + imag[i] * imag[i])\n }\n\n return magnitude\n}\n\n/**\n * Detect transients by analyzing spectral changes between frames\n * @param {Float32Array} currentCoeffs - Current frame coefficients\n * @param {Float32Array} prevCoeffs - Previous frame coefficients\n * @param {number} threshold - Detection threshold\n * @returns {boolean} True if transient detected\n */\nexport function detectTransient(currentCoeffs, prevCoeffs, threshold) {\n // Can't detect transients without previous frame\n if (!prevCoeffs) return false\n\n // Calculate all spectral features\n const features = calculateSpectralFeatures(currentCoeffs, prevCoeffs)\n\n // Combine features using perceptually-motivated weighting\n const transientScore = calculateTransientScore(features)\n\n return transientScore > threshold\n}\n\n/**\n * Calculate all spectral features for transient detection\n * @param {Float32Array} currentCoeffs - Current frame coefficients\n * @param {Float32Array} prevCoeffs - Previous frame coefficients\n * @returns {Object} Computed spectral features\n */\nfunction calculateSpectralFeatures(currentCoeffs, prevCoeffs) {\n // Calculate spectral flux (positive differences only)\n const spectralFlux = calculateSpectralFlux(currentCoeffs, prevCoeffs)\n\n // Calculate spectral flatness for both frames\n const currentFlatness = calculateSpectralFlatness(currentCoeffs)\n const prevFlatness = calculateSpectralFlatness(prevCoeffs)\n const flatnessChange = Math.abs(currentFlatness - prevFlatness)\n\n // Calculate high-frequency content ratio\n const currentHfRatio = calculateHighFrequencyRatio(currentCoeffs)\n const prevHfRatio = calculateHighFrequencyRatio(prevCoeffs)\n const hfChange = Math.abs(currentHfRatio - prevHfRatio)\n\n // Calculate energy change in dB\n const energyChange = calculateEnergyChange(currentCoeffs, prevCoeffs)\n\n return {\n spectralFlux,\n flatnessChange,\n hfChange,\n energyChange,\n }\n}\n\n/**\n * Calculate normalized spectral flux (positive spectral differences)\n * High values indicate sudden onset of new spectral components\n */\nfunction calculateSpectralFlux(currentCoeffs, prevCoeffs) {\n let flux = 0\n let currentEnergy = 0\n\n for (let i = 0; i < currentCoeffs.length; i++) {\n const currentMag = Math.abs(currentCoeffs[i])\n const prevMag = Math.abs(prevCoeffs[i])\n\n // Only count positive differences (new energy)\n const diff = currentMag - prevMag\n if (diff > 0) {\n flux += diff\n }\n\n currentEnergy += currentMag * currentMag\n }\n\n // Normalize by current frame energy to make threshold independent of level\n const normalization = Math.sqrt(currentEnergy) || 1e-6\n return flux / normalization\n}\n\n/**\n * Calculate spectral flatness (geometric mean / arithmetic mean)\n * Measures how noise-like vs tonal the spectrum is\n * @param {Float32Array} coeffs - Spectral coefficients\n * @returns {number} Flatness measure (0 = tonal, 1 = noise-like)\n */\nfunction calculateSpectralFlatness(coeffs) {\n const EPSILON = 1e-10\n let sumLog = 0\n let sumLinear = 0\n let validBins = 0\n\n for (let i = 0; i < coeffs.length; i++) {\n const magnitude = Math.abs(coeffs[i])\n if (magnitude > EPSILON) {\n sumLog += Math.log(magnitude)\n sumLinear += magnitude\n validBins++\n }\n }\n\n if (validBins === 0) return 0\n\n const geometricMean = Math.exp(sumLog / validBins)\n const arithmeticMean = sumLinear / validBins\n\n return arithmeticMean > EPSILON ? geometricMean / arithmeticMean : 0\n}\n\n/**\n * Calculate ratio of high-frequency to total energy\n * High values indicate bright/harsh sounds that are perceptually important\n * @param {Float32Array} coeffs - Spectral coefficients\n * @returns {number} High-frequency energy ratio (0-1)\n */\nfunction calculateHighFrequencyRatio(coeffs) {\n const midPoint = Math.floor(coeffs.length / 2)\n let lowEnergy = 0\n let highEnergy = 0\n\n for (let i = 0; i < midPoint; i++) {\n lowEnergy += coeffs[i] * coeffs[i]\n }\n\n for (let i = midPoint; i < coeffs.length; i++) {\n highEnergy += coeffs[i] * coeffs[i]\n }\n\n const totalEnergy = lowEnergy + highEnergy\n return totalEnergy > 0 ? highEnergy / totalEnergy : 0\n}\n\n/**\n * Calculate energy change between frames in dB\n * @param {Float32Array} currentCoeffs - Current frame coefficients\n * @param {Float32Array} prevCoeffs - Previous frame coefficients\n * @returns {number} Energy change in dB (positive values only)\n */\nfunction calculateEnergyChange(currentCoeffs, prevCoeffs) {\n let currentEnergy = 0\n let prevEnergy = 0\n\n for (let i = 0; i < currentCoeffs.length; i++) {\n currentEnergy += currentCoeffs[i] * currentCoeffs[i]\n prevEnergy += prevCoeffs[i] * prevCoeffs[i]\n }\n\n // Avoid log of zero and ensure minimum energy\n currentEnergy = Math.max(currentEnergy, 1e-10)\n prevEnergy = Math.max(prevEnergy, 1e-10)\n\n const changeDb = 10 * Math.log10(currentEnergy / prevEnergy)\n\n // Only interested in energy increases (potential transients)\n return Math.max(0, changeDb)\n}\n\n/**\n * Calculate unified transient score from spectral features\n * Uses perceptually-motivated combination instead of magic numbers\n * @param {Object} features - Spectral features\n * @returns {number} Transient score\n */\nfunction calculateTransientScore(features) {\n const { spectralFlux, flatnessChange, hfChange, energyChange } = features\n\n // Spectral flux is the primary indicator - it directly measures\n // sudden onset of new frequency components\n const fluxContribution = spectralFlux\n\n // Flatness change indicates transition between tonal and noise-like\n // signals (e.g., pitched to unpitched percussion)\n // Scale by sqrt to reduce dominance\n const flatnessContribution = Math.sqrt(flatnessChange)\n\n // High-frequency changes are perceptually important but shouldn't\n // dominate the decision. Use log scaling for perceptual relevance\n const hfContribution = Math.log1p(hfChange * 10) / Math.log1p(10)\n\n // Energy changes in dB are already perceptually scaled\n // Normalize to 0-1 range assuming 30dB is a strong transient\n const energyContribution = Math.min(energyChange / 30, 1)\n\n // Combine features with equal perceptual importance\n // Each contribution is normalized to roughly 0-1 range\n return (\n (fluxContribution +\n flatnessContribution +\n hfContribution +\n energyContribution) /\n 4\n )\n}\n","/**\n * Carta1 Audio Codec - Encoding Pipeline\n *\n * The encoding pipeline transforms PCM audio samples into ATRAC1 compressed format\n * through a series of processing stages:\n *\n * 1. QMF Analysis: Splits audio into frequency bands using quadrature mirror filters\n * 2. Block Selection: Detects transients to choose appropriate transform block sizes\n * 3. MDCT Transform: Applies Modified Discrete Cosine Transform to frequency bands\n * 4. Quantization: Performs psychoacoustic analysis, bit allocation, and quantization\n *\n * Each stage is implemented as a functional pipeline component that can be composed\n * using the pipe utility. The pipeline maintains state through a shared context\n * containing buffer pools and encoding options.\n */\n\nimport {\n pipe,\n throwError,\n reverseSpectrum,\n calculateBandOffset,\n} from '../utils.js'\nimport { qmfAnalysis } from '../transforms/qmf.js'\nimport { mdct64, mdct256, mdct512 } from '../transforms/mdct.js'\nimport { groupIntoBFUs, quantize } from '../coding/quantization.js'\nimport { allocateBits } from '../coding/bitallocation.js'\nimport { BufferPool } from '../core/buffers.js'\nimport { EncoderOptions } from '../core/options.js'\nimport {\n WORD_LENGTH_BITS,\n WINDOW_SHORT,\n FFT_SIZE_LOW,\n FFT_SIZE_MID,\n FFT_SIZE_HIGH,\n MDCT_SIZE_SHORT,\n MDCT_SIZE_MID,\n MDCT_SIZE_LONG,\n MDCT_BAND_CONFIGS,\n MDCT_SHORT_BLOCK_SIZE,\n MDCT_OVERLAP_SIZE,\n} from '../core/constants.js'\nimport { performFFT, detectTransient } from '../analysis/transient.js'\n\n/**\n * QMF Analysis Stage - Splits audio into frequency bands\n *\n * Performs two-stage QMF analysis to decompose the input signal into three bands:\n * - Low band (0-5.5kHz): processed at full resolution\n * - Mid band (5.5-11kHz): processed at half resolution\n * - High band (11-22kHz): processed at quarter resolution with delay compensation\n *\n * @param {Object} context - Pipeline context containing bufferPool\n * @param {BufferPool} context.bufferPool - Shared buffer pool for efficient memory management\n * @returns {Function} Stage function that processes PCM samples\n * @throws {Error} If bufferPool is not provided in context\n */\nexport function qmfAnalysisStage(context) {\n const bufferPool =\n context?.bufferPool ??\n throwError('qmfAnalysisStage: bufferPool is required')\n const delays = bufferPool.qmfDelays\n\n /**\n * Process PCM samples through QMF analysis\n * @param {Float32Array} pcmSamples - Input PCM samples\n * @returns {Object} Analysis result containing frequency bands\n * @returns {Array<Float32Array>} returns.bands - Three frequency bands [low, mid, high]\n */\n return (pcmSamples) => {\n const stage1 = qmfAnalysis(\n pcmSamples,\n delays.lowBand,\n bufferPool.qmfWorkBuffers\n )\n delays.lowBand = stage1.newDelay\n\n const stage2 = qmfAnalysis(\n stage1.lowBand,\n delays.midBand,\n bufferPool.qmfWorkBuffers\n )\n delays.midBand = stage2.newDelay\n\n const delayedHigh =\n bufferPool.qmfWorkBuffers.highBandDelay[stage1.highBand.length]\n delayedHigh.set(delays.highBand)\n delayedHigh.set(stage1.highBand, delays.highBand.length)\n\n const highBand = delayedHigh.slice(0, stage1.highBand.length)\n delays.highBand = delayedHigh.slice(stage1.highBand.length)\n\n return {\n bands: [stage2.lowBand, stage2.highBand, highBand],\n }\n }\n}\n\n/**\n * Block Selection Stage - Detects transients to choose transform block sizes\n *\n * Analyzes frequency bands using FFT and transient detection to determine\n * appropriate MDCT block sizes. Short blocks are used for transient signals\n * to prevent pre-echo artifacts, while long blocks provide better frequency\n * resolution for steady-state signals.\n *\n * @param {Object} context - Pipeline context containing bufferPool\n * @param {BufferPool} context.bufferPool - Shared buffer pool for efficient memory management\n * @returns {Function} Stage function that processes QMF analysis results\n * @throws {Error} If bufferPool is not provided in context\n */\nexport function blockSelectorStage(context) {\n const bufferPool =\n context?.bufferPool ??\n throwError('blockSelectorStage: bufferPool is required')\n const options =\n context?.options ?? throwError('blockSelectorStage: options is required')\n\n /**\n * Analyze frequency bands and determine block modes\n * @param {Object} input - QMF analysis results\n * @param {Array<Float32Array>} input.bands - Three frequency bands [low, mid, high]\n * @returns {Object} Block selection results\n * @returns {Array<Float32Array>} returns.bands - Original frequency bands\n * @returns {Array<number>} returns.blockModes - Block modes for each band\n */\n return (input) => {\n const { bands } = input\n\n // Use fixed block modes if provided, otherwise do transient detection\n let blockModes\n if (options.fixedBlockModes) {\n blockModes = options.fixedBlockModes\n } else {\n const fftSizes = [FFT_SIZE_LOW, FFT_SIZE_MID, FFT_SIZE_HIGH]\n blockModes = bands.map((bandSamples, bandIndex) => {\n const coeffs = performFFT(bandSamples, fftSizes[bandIndex])\n const transient = detectTransient(\n coeffs,\n bufferPool.transientDetection[bandIndex],\n options.transientThresholdLow\n )\n bufferPool.transientDetection[bandIndex] = coeffs\n return transient * Math.max(bandIndex + 1, 2)\n })\n }\n\n return {\n bands,\n blockModes,\n }\n }\n}\n\n/**\n * MDCT Transform Stage - Applies Modified Discrete Cosine Transform\n *\n * Transforms time-domain samples to frequency-domain coefficients using MDCT.\n * The transform size depends on the block mode determined by transient detection:\n * - Long blocks: 512/256 samples for better frequency resolution\n * - Short blocks: 64 samples for better time resolution\n *\n * Applies windowing and overlap-add processing to prevent blocking artifacts.\n * Mid and high bands are spectrally reversed to match ATRAC1 format.\n *\n * @param {Object} context - Pipeline context containing bufferPool\n * @param {BufferPool} context.bufferPool - Shared buffer pool for efficient memory management\n * @returns {Function} Stage function that processes block selection results\n * @throws {Error} If bufferPool is not provided in context\n */\nexport function mdctStage(context) {\n const bufferPool =\n context?.bufferPool ?? throwError('mdctStage: bufferPool is required')\n const overlapBuffers = bufferPool.mdctOverlap\n\n // Transform function mapping for each band\n const TRANSFORM_FUNCS = [mdct256, mdct256, mdct512]\n\n /**\n * Transform a single frequency band using MDCT.\n * @param {Float32Array} samples\n * @param {number} bandIndex\n * @param {number} blockMode\n * @param {Float32Array} overlapBuffer\n * @param {Object} bufferPool\n * @returns {Float32Array}\n */\n function transformBand(\n samples,\n bandIndex,\n blockMode,\n overlapBuffer,\n bufferPool\n ) {\n const config = MDCT_BAND_CONFIGS[bandIndex]\n const transformFunc = TRANSFORM_FUNCS[bandIndex]\n const isLongBlock = blockMode === 0\n\n if (isLongBlock) {\n return transformLongBlock(\n samples,\n bandIndex,\n config,\n transformFunc,\n overlapBuffer,\n bufferPool\n )\n } else {\n return transformShortBlocks(\n samples,\n bandIndex,\n config,\n overlapBuffer,\n bufferPool\n )\n }\n }\n\n /**\n * Transform using long block (better frequency resolution).\n * @param {Float32Array} samples\n * @param {number} bandIndex\n * @param {Object} config\n * @param {Object} transformFunc\n * @param {Float32Array} overlapBuffer\n * @param {Object} bufferPool\n * @returns {Float32Array}\n */\n function transformLongBlock(\n samples,\n bandIndex,\n config,\n transformFunc,\n overlapBuffer,\n bufferPool\n ) {\n const mdctSize = bandIndex === 2 ? MDCT_SIZE_LONG : MDCT_SIZE_MID\n const mdctInput = bufferPool.transformBuffers[mdctSize]\n mdctInput.fill(0)\n\n // Apply overlap from previous frame\n mdctInput.set(overlapBuffer, config.windowStart)\n\n // Window and save tail for next frame\n applyTailWindowing(samples, overlapBuffer, config.size)\n\n // Add current frame samples\n mdctInput.set(samples, config.windowStart + MDCT_OVERLAP_SIZE)\n\n // Transform\n let spectrum = transformFunc.transform(mdctInput, bufferPool.mdctBuffers)\n\n // Apply spectral reversal for mid/high bands\n if (bandIndex > 0) {\n spectrum = reverseSpectrum(spectrum, bufferPool.reversalBuffers)\n }\n\n return spectrum\n }\n\n /**\n * Transform using short blocks (better time resolution for transients).\n * @param {Float32Array} samples\n * @param {number} bandIndex\n * @param {Object} config\n * @param {Float32Array} overlapBuffer\n * @param {Object} bufferPool\n * @returns {Float32Array}\n */\n function transformShortBlocks(\n samples,\n bandIndex,\n config,\n overlapBuffer,\n bufferPool\n ) {\n const numBlocks = 1 << (config.size === 256 ? 3 : 2) // 8 for band 2, 4 for bands 0-1\n const output = new Float32Array(config.size)\n\n for (let block = 0; block < numBlocks; block++) {\n const blockStart = block * MDCT_SHORT_BLOCK_SIZE\n const blockSamples = samples.subarray(\n blockStart,\n blockStart + MDCT_SHORT_BLOCK_SIZE\n )\n\n // Prepare MDCT input\n const mdctInput = bufferPool.transformBuffers[MDCT_SIZE_SHORT]\n mdctInput.fill(0)\n mdctInput.set(overlapBuffer, 0)\n\n // Window and save tail\n applyTailWindowing(blockSamples, overlapBuffer, MDCT_SHORT_BLOCK_SIZE)\n mdctInput.set(blockSamples, MDCT_OVERLAP_SIZE)\n\n // Transform\n let spectrum = mdct64.transform(mdctInput, bufferPool.mdctBuffers)\n\n // Apply spectral reversal for mid/high bands\n if (bandIndex > 0) {\n spectrum = reverseSpectrum(spectrum, bufferPool.reversalBuffers)\n }\n\n output.set(spectrum, blockStart)\n }\n\n return output\n }\n\n function applyTailWindowing(samples, overlapBuffer, blockSize) {\n const tailStart = blockSize - MDCT_OVERLAP_SIZE\n for (let i = 0; i < MDCT_OVERLAP_SIZE; i++) {\n const tailValue = samples[tailStart + i]\n overlapBuffer[i] = WINDOW_SHORT[i] * tailValue\n samples[tailStart + i] = tailValue * WINDOW_SHORT[31 - i]\n }\n }\n\n /**\n * Transform frequency bands using MDCT\n * @param {Object} input - Block selection results\n * @param {Array<Float32Array>} input.bands - Three frequency bands\n * @param {Array<number>} input.blockModes - Block modes for each band\n * @param {any} input.originalFrame - Original frame data (passed through)\n * @returns {Object} MDCT transform results\n * @returns {Array<Float32Array>} returns.bands - Original frequency bands\n * @returns {Float32Array} returns.coefficients - MDCT coefficients (512 samples)\n * @returns {Array<number>} returns.blockModes - Block modes\n * @returns {any} returns.originalFrame - Original frame data\n */\n return (input) => {\n const { bands, blockModes, originalFrame } = input\n const coefficients = new Float32Array(512)\n\n bands.forEach((bandSamples, bandIndex) => {\n const transformed = transformBand(\n bandSamples,\n bandIndex,\n blockModes[bandIndex],\n overlapBuffers[bandIndex],\n bufferPool\n )\n\n const offset = calculateBandOffset(bandIndex)\n coefficients.set(transformed, offset)\n })\n\n return { bands, coefficients, blockModes, originalFrame }\n }\n}\n\n/**\n * Quantization Stage - Performs RDO bit allocation and quantization\n *\n * The final encoding stage that:\n * 1. Groups coefficients into Block Floating Units (BFUs)\n * 2. Allocates bits using Rate-Distortion Optimization (RDO)\n * 3. Quantizes coefficients using scale factors and word lengths\n *\n * Uses RDO to optimize the allocation of bits for maximum quality\n * within the available bit budget.\n *\n * @returns {Function} Stage function that processes MDCT results\n * @throws {Error} If bufferPool is not provided in context\n */\nexport function quantizationStage(context) {\n const options =\n context?.options ?? throwError('quantizationStage: options is required')\n\n /**\n * Perform RDO bit allocation and quantization\n * @param {Object} input - MDCT transform results\n * @param {Float32Array} input.coefficients - MDCT coefficients\n * @param {Array<number>} input.blockModes - Block modes\n * @returns {Object} Quantization results ready for bitstream encoding\n * @returns {number} returns.nBfu - Number of active BFUs\n * @returns {Int32Array} returns.scaleFactorIndices - Scale factor indices for each BFU\n * @returns {Int32Array} returns.wordLengthIndices - Word length indices for each BFU\n * @returns {Array<Int32Array>} returns.quantizedCoefficients - Quantized coefficient data\n * @returns {Array<number>} returns.blockModes - Block modes for each band\n */\n return (input) => {\n const { coefficients, blockModes } = input\n\n const { bfuData, bfuSizes, bfuCount } = groupIntoBFUs(\n coefficients,\n blockModes\n )\n\n const {\n bfuCount: selectedBfuCount,\n allocation,\n scaleFactorIndices,\n } = allocateBits(bfuData, bfuSizes, bfuCount, options.allocationBias)\n\n const slicedWordLengthIndices = allocation.slice(0, selectedBfuCount)\n const slicedScaleFactorIndices = scaleFactorIndices.slice(\n 0,\n selectedBfuCount\n )\n const quantizedCoefficients = []\n\n for (let bfu = 0; bfu < selectedBfuCount; bfu++) {\n const data = bfuData[bfu].subarray(0, bfuSizes[bfu])\n const wordLength = slicedWordLengthIndices[bfu]\n const bitsPerSample = WORD_LENGTH_BITS[wordLength]\n const quantized = quantize(data, scaleFactorIndices[bfu], bitsPerSample)\n quantizedCoefficients.push(quantized)\n }\n\n return {\n nBfu: selectedBfuCount,\n scaleFactorIndices: slicedScaleFactorIndices,\n wordLengthIndices: slicedWordLengthIndices,\n quantizedCoefficients,\n blockModes,\n }\n }\n}\n\n/**\n * Create ATRAC1 encoding pipeline\n *\n * Constructs a complete encoding pipeline that transforms PCM audio samples\n * into ATRAC1 compressed format. The pipeline processes audio through QMF\n * analysis, transient detection, MDCT transform, and psychoacoustic quantization.\n *\n * The returned function can be called repeatedly to encode audio frames,\n * maintaining state through the shared buffer pool for efficient processing.\n *\n * @param {EncoderOptions} [options=new EncoderOptions()] - Encoding configuration\n * @param {BufferPool} [bufferPool=new BufferPool()] - Shared buffer pool for state\n * @returns {Function} Encoding pipeline function that processes PCM samples\n *\n * @example\n * const encoder = encode(new EncoderOptions(), new BufferPool())\n * const result = encoder(pcmSamples) // Returns quantized ATRAC1 frame data\n */\nexport function encode(\n options = new EncoderOptions(),\n bufferPool = new BufferPool()\n) {\n const context = { options, bufferPool }\n return pipe(\n context,\n qmfAnalysisStage,\n blockSelectorStage,\n mdctStage,\n quantizationStage\n )\n}\n","/**\n * Carta1 Audio Codec - Decoding Pipeline\n *\n * The decoding pipeline transforms ATRAC1 compressed format back into PCM audio samples\n * through a series of processing stages:\n *\n * 1. Dequantization: Reconstructs MDCT coefficients from quantized data using scale factors\n * 2. Inverse MDCT: Applies Inverse Modified Discrete Cosine Transform to frequency bands\n * 3. QMF Synthesis: Reconstructs full-spectrum audio using quadrature mirror filters\n *\n * Each stage is implemented as a functional pipeline component that can be composed\n * using the pipe utility. The pipeline maintains state through a shared context\n * containing buffer pools and decoding options.\n */\n\nimport {\n pipe,\n throwError,\n reverseSpectrum,\n extractBandCoefficients,\n} from '../utils.js'\nimport { qmfSynthesis } from '../transforms/qmf.js'\nimport { imdct64, imdct256, imdct512, overlapAdd } from '../transforms/mdct.js'\nimport { dequantize } from '../coding/quantization.js'\nimport { BufferPool } from '../core/buffers.js'\nimport {\n BFU_BAND_BOUNDARIES,\n BFU_START_LONG,\n BFU_START_SHORT,\n WORD_LENGTH_BITS,\n WINDOW_SHORT,\n MDCT_SIZE_LONG,\n MDCT_BAND_CONFIGS,\n MDCT_SHORT_BLOCK_SIZE,\n MDCT_TAIL_WINDOW_SIZE,\n} from '../core/constants.js'\n\n/**\n * Dequantization Stage - Reconstructs MDCT coefficients from quantized data\n *\n * Reverses the quantization process by:\n * - Reconstructing coefficient values using scale factors and word lengths\n * - Organizing coefficients back into Block Floating Units (BFUs)\n * - Preparing coefficient array for inverse MDCT transform\n *\n * Uses the same BFU organization as the encoder but reconstructs the original\n * coefficient values from the quantized representation.\n *\n * @returns {Function} Stage function that processes quantized frame data\n * @throws {Error} If bufferPool is not provided in context\n */\nexport function dequantizationStage() {\n /**\n * Reconstruct MDCT coefficients from quantized data\n * @param {Object} frameData - Quantized frame data\n * @param {number} frameData.nBfu - Number of active BFUs\n * @param {Int32Array} frameData.scaleFactorIndices - Scale factor indices for each BFU\n * @param {Int32Array} frameData.wordLengthIndices - Word length indices for each BFU\n * @param {Array<Int32Array>} frameData.quantizedCoefficients - Quantized coefficient data\n * @param {Array<number>} frameData.blockModes - Block modes for each band\n * @returns {Object} Dequantization results\n * @returns {Float32Array} returns.coefficients - Reconstructed MDCT coefficients (512 samples)\n * @returns {Array<number>} returns.blockModes - Block modes for each band\n */\n return (frameData) => {\n const coefficients = new Float32Array(512)\n const {\n nBfu,\n scaleFactorIndices,\n wordLengthIndices,\n quantizedCoefficients,\n blockModes,\n } = frameData\n\n for (let bfu = 0; bfu < nBfu; bfu++) {\n const bitsPerSample = WORD_LENGTH_BITS[wordLengthIndices[bfu]]\n\n let band = 0\n if (bfu >= BFU_BAND_BOUNDARIES[0]) band = 1\n if (bfu >= BFU_BAND_BOUNDARIES[1]) band = 2\n\n const isLongBlock = blockModes[band] === 0\n const position = isLongBlock ? BFU_START_LONG[bfu] : BFU_START_SHORT[bfu]\n\n if (bitsPerSample > 0) {\n const quantized = quantizedCoefficients[bfu]\n const dequantized = dequantize(\n quantized,\n scaleFactorIndices[bfu],\n bitsPerSample\n )\n coefficients.set(dequantized, position)\n }\n }\n\n return { coefficients, blockModes }\n }\n}\n\n/**\n * Inverse MDCT Stage - Transforms frequency coefficients back to time domain\n *\n * Applies Inverse Modified Discrete Cosine Transform to reconstruct time-domain\n * samples from frequency coefficients. The transform size depends on block modes:\n * - Long blocks: 512/256 samples for steady-state signals\n * - Short blocks: 64 samples for transient signals\n *\n * Applies windowing and overlap-add processing to prevent blocking artifacts.\n * Mid and high bands are spectrally unreversed from ATRAC1 format.\n *\n * @param {Object} context - Pipeline context containing bufferPool\n * @param {BufferPool} context.bufferPool - Shared buffer pool for efficient memory management\n * @returns {Function} Stage function that processes dequantization results\n * @throws {Error} If bufferPool is not provided in context\n */\nexport function imdctStage(context) {\n const bufferPool =\n context?.bufferPool ?? throwError('imdctStage: bufferPool is required')\n const overlapBuffers = bufferPool.imdctOverlap\n\n // Transform function mapping for each band\n const TRANSFORM_FUNCS = [imdct256, imdct256, imdct512]\n\n /**\n * Inverse transform a single frequency band.\n * @param {Float32Array} coeffs\n * @param {number} bandIndex\n * @param {number} blockMode\n * @param {Float32Array} overlapBuffer\n * @param {Object} bufferPool\n * @param {Object} config\n * @returns {Float32Array}\n */\n function transformBand(\n coeffs,\n bandIndex,\n blockMode,\n overlapBuffer,\n bufferPool,\n config\n ) {\n const isLongBlock = blockMode === 0\n const transformFunc = TRANSFORM_FUNCS[bandIndex]\n\n if (isLongBlock) {\n return inverseLongBlock(\n coeffs,\n bandIndex,\n overlapBuffer,\n bufferPool,\n config,\n transformFunc\n )\n } else {\n return inverseShortBlocks(\n coeffs,\n bandIndex,\n overlapBuffer,\n bufferPool,\n config\n )\n }\n }\n\n /**\n * Inverse transform using long block.\n * @param {Float32Array} coeffs\n * @param {number} bandIndex\n * @param {Float32Array} overlapBuffer\n * @param {Object} bufferPool\n * @param {Object} config\n * @param {Object} transformFunc\n * @returns {Float32Array}\n */\n function inverseLongBlock(\n coeffs,\n bandIndex,\n overlapBuffer,\n bufferPool,\n config,\n transformFunc\n ) {\n // Unreverse spectral reversal for mid/high bands\n let blockSpecs = coeffs\n if (bandIndex > 0) {\n blockSpecs = reverseSpectrum(coeffs, bufferPool.reversalBuffers)\n }\n\n // Apply inverse transform\n const inv = transformFunc.transform(blockSpecs, bufferPool.mdctBuffers)\n const invStart = inv.length / 4\n\n // Prepare output buffer\n const invBuf = bufferPool.transformBuffers[MDCT_SIZE_LONG]\n invBuf.fill(0)\n\n // Copy transformed samples\n for (let i = 0; i < config.size; i++) {\n invBuf[i] = inv[invStart + i]\n }\n\n // Handle overlap-add with previous frame\n const prevBuf = overlapBuffer.slice(\n config.size * 2 - MDCT_TAIL_WINDOW_SIZE,\n config.size * 2\n )\n const dstPart = overlapAdd(\n prevBuf.slice(0, MDCT_TAIL_WINDOW_SIZE),\n invBuf.slice(0, MDCT_TAIL_WINDOW_SIZE),\n WINDOW_SHORT\n )\n\n overlapBuffer.set(dstPart, 0)\n\n // Save tail for next frame\n for (let i = 0; i < MDCT_TAIL_WINDOW_SIZE; i++) {\n prevBuf[i] = invBuf[MDCT_TAIL_WINDOW_SIZE + i]\n }\n\n // Copy main samples\n const copyLen = bandIndex === 2 ? 240 : 112\n for (let i = 0; i < copyLen; i++) {\n overlapBuffer[32 + i] = invBuf[MDCT_TAIL_WINDOW_SIZE + i]\n }\n\n // Copy final samples\n for (let i = 0; i < MDCT_TAIL_WINDOW_SIZE; i++) {\n overlapBuffer[config.size * 2 - MDCT_TAIL_WINDOW_SIZE + i] =\n invBuf[config.size - MDCT_TAIL_WINDOW_SIZE + i]\n }\n\n return overlapBuffer.slice(0, config.size)\n }\n\n /**\n * Inverse transform using short blocks.\n * @param {Float32Array} coeffs\n * @param {number} bandIndex\n * @param {Float32Array} overlapBuffer\n * @param {Object} bufferPool\n * @param {Object} config\n * @returns {Float32Array}\n */\n function inverseShortBlocks(\n coeffs,\n bandIndex,\n overlapBuffer,\n bufferPool,\n config\n ) {\n const numBlocks = 1 << (config.size === 256 ? 3 : 2)\n const invBuf = bufferPool.transformBuffers[MDCT_SIZE_LONG]\n invBuf.fill(0)\n\n const prevBuf = overlapBuffer.slice(\n config.size * 2 - MDCT_TAIL_WINDOW_SIZE,\n config.size * 2\n )\n\n let start = 0\n let pos = 0\n\n for (let block = 0; block < numBlocks; block++) {\n // Extract block coefficients\n let blockSpecs = coeffs.slice(pos, pos + MDCT_SHORT_BLOCK_SIZE)\n\n // Unreverse spectral reversal for mid/high bands\n if (bandIndex > 0) {\n blockSpecs = reverseSpectrum(blockSpecs, bufferPool.reversalBuffers)\n }\n\n // Apply inverse transform\n const inv = imdct64.transform(blockSpecs, bufferPool.mdctBuffers)\n const invStart = inv.length / 4\n\n // Copy to intermediate buffer\n for (let i = 0; i < MDCT_SHORT_BLOCK_SIZE; i++) {\n invBuf[start + i] = inv[invStart + i]\n }\n\n // Overlap-add with previous block\n const dstPart = overlapAdd(\n prevBuf.slice(0, MDCT_TAIL_WINDOW_SIZE),\n invBuf.slice(start, start + MDCT_TAIL_WINDOW_SIZE),\n WINDOW_SHORT\n )\n\n overlapBuffer.set(dstPart, start)\n\n // Save tail for next block\n for (let i = 0; i < MDCT_TAIL_WINDOW_SIZE; i++) {\n prevBuf[i] = invBuf[start + MDCT_TAIL_WINDOW_SIZE + i]\n }\n\n start += MDCT_SHORT_BLOCK_SIZE\n pos += MDCT_SHORT_BLOCK_SIZE\n }\n\n // Copy final tail samples\n for (let i = 0; i < MDCT_TAIL_WINDOW_SIZE; i++) {\n overlapBuffer[config.size * 2 - MDCT_TAIL_WINDOW_SIZE + i] =\n invBuf[config.size - MDCT_TAIL_WINDOW_SIZE + i]\n }\n\n return overlapBuffer.slice(0, config.size)\n }\n\n /**\n * Transform coefficients back to time domain using inverse MDCT\n * @param {Object} input - Dequantization results\n * @param {Float32Array} input.coefficients - MDCT coefficients (512 samples)\n * @param {Array<number>} input.blockModes - Block modes for each band\n * @returns {Array<Float32Array>} Three reconstructed frequency bands [low, mid, high]\n */\n return (input) => {\n const { coefficients, blockModes } = input\n\n return MDCT_BAND_CONFIGS.map((config, bandIndex) => {\n const bandCoeffs = extractBandCoefficients(coefficients, bandIndex)\n return transformBand(\n bandCoeffs,\n bandIndex,\n blockModes[bandIndex],\n overlapBuffers[bandIndex],\n bufferPool,\n config\n )\n })\n }\n}\n\n/**\n * QMF Synthesis Stage - Reconstructs full-spectrum audio from frequency bands\n *\n * Performs two-stage QMF synthesis to reconstruct the full-spectrum signal\n * from three frequency bands:\n * - Low band (0-5.5kHz): processed at full resolution\n * - Mid band (5.5-11kHz): processed at half resolution\n * - High band (11-22kHz): processed at quarter resolution with delay compensation\n *\n * This is the inverse operation of the QMF analysis performed during encoding,\n * combining the separate frequency bands back into a single wideband signal.\n *\n * @param {Object} context - Pipeline context containing bufferPool\n * @param {BufferPool} context.bufferPool - Shared buffer pool for efficient memory management\n * @returns {Function} Stage function that processes inverse MDCT results\n * @throws {Error} If bufferPool is not provided in context\n */\nexport function qmfSynthesisStage(context) {\n const bufferPool =\n context?.bufferPool ??\n throwError('qmfSynthesisStage: bufferPool is required')\n const delays = bufferPool.qmfDelays\n\n /**\n * Reconstruct full-spectrum PCM samples from frequency bands\n * @param {Array<Float32Array>} bands - Three frequency bands [low, mid, high]\n * @returns {Float32Array} Reconstructed PCM samples\n */\n return (bands) => {\n // Apply high band delay compensation\n const delayedHigh = bufferPool.qmfWorkBuffers.highBandDelay[bands[2].length]\n delayedHigh.set(delays.highBand)\n delayedHigh.set(bands[2], delays.highBand.length)\n\n const highBand = delayedHigh.slice(0, bands[0].length * 2)\n delays.highBand = delayedHigh.slice(bands[0].length * 2)\n\n // Second stage synthesis: combine low and mid bands\n const stage2 = qmfSynthesis(\n bands[0],\n bands[1],\n delays.midBand,\n bufferPool.qmfWorkBuffers\n )\n delays.midBand = stage2.newDelay\n\n // First stage synthesis: combine result with high band\n const stage1 = qmfSynthesis(\n stage2.output,\n highBand,\n delays.lowBand,\n bufferPool.qmfWorkBuffers\n )\n delays.lowBand = stage1.newDelay\n\n return stage1.output\n }\n}\n\n/**\n * Create ATRAC1 decoding pipeline\n *\n * Constructs a complete decoding pipeline that transforms ATRAC1 compressed format\n * back into PCM audio samples. The pipeline processes quantized data through\n * dequantization, inverse MDCT transform, and QMF synthesis.\n *\n * The returned function can be called repeatedly to decode audio frames,\n * maintaining state through the shared buffer pool for efficient processing.\n *\n * @param {BufferPool} [bufferPool=new BufferPool()] - Shared buffer pool for state\n * @returns {Function} Decoding pipeline function that processes quantized frame data\n *\n * @example\n * const decoder = decode(new BufferPool())\n * const result = decoder(quantizedFrame) // Returns reconstructed PCM samples\n */\nexport function decode(bufferPool = new BufferPool()) {\n const context = { bufferPool }\n return pipe(context, dequantizationStage, imdctStage, qmfSynthesisStage)\n}\n","/**\n * Carta1 Audio Codec - Audio Processing Module\n *\n * High-level audio processing interface that provides stream-based encoding and decoding\n * for ATRAC1 audio format. Handles both mono and stereo audio processing with proper\n * delay compensation and frame management.\n *\n * Key features:\n * - Stream-based processing for large audio files\n * - Automatic delay compensation for codec processing\n * - Support for mono and stereo audio\n * - Progress tracking callbacks\n * - AEA file format creation and parsing\n * - WAV file generation from decoded audio\n */\n\nimport { encode } from '../pipeline/encoder.js'\nimport { decode } from '../pipeline/decoder.js'\nimport { EncoderOptions } from '../core/options.js'\nimport {\n SAMPLES_PER_FRAME,\n SAMPLE_RATE,\n AEA_HEADER_SIZE,\n SOUND_UNIT_SIZE,\n WAV_HEADER_SIZE,\n WAV_BYTES_PER_SAMPLE,\n WAV_BITS_PER_SAMPLE,\n WAV_PCM_MAX_POSITIVE,\n WAV_PCM_MAX_NEGATIVE,\n WAV_DATA_OFFSET,\n} from '../core/constants.js'\nimport { serializeFrame, deserializeFrame, AeaFile } from './serialization.js'\n\n/**\n * Audio processing utility class providing high-level encoding and decoding operations\n */\nexport class AudioProcessor {\n /**\n * Encode complete planar PCM buffers into an AEA byte image.\n *\n * @param {Float32Array[]} channels One or two normalized PCM channels.\n * @param {Object} [options] Encoder and AEA metadata options.\n * @returns {Promise<Uint8Array>} Complete AEA byte image.\n */\n static encodeAeaPcm(channels, options = {}) {\n return encodeAeaPcm(channels, options)\n }\n\n /**\n * Decode a complete AEA byte image into planar PCM buffers.\n *\n * @param {Uint8Array|ArrayBuffer|Blob} input Complete AEA image.\n * @returns {Promise<Float32Array[]>} Decoded normalized PCM channels.\n */\n static decodeAeaPcm(input) {\n return decodeAeaPcm(input)\n }\n\n /**\n * Encodes a stream of audio frames to ATRAC1 format\n * @param {AsyncIterable<Float32Array>|AsyncIterable<[Float32Array, Float32Array]>} audioFrames - Audio frame stream\n * @param {Object} [options={}] - Encoding options\n * @param {number} [options.channelCount=1] - Number of audio channels (1 or 2)\n * @param {Function} [options.onProgress] - Progress callback function\n * @param {EncoderOptions} [options.encoderOptions] - Encoder configuration options\n * @returns {AsyncGenerator<Object>} Stream of encoded frame data\n * @throws {Error} If unsupported channel count is provided\n */\n static async *encodeStream(audioFrames, options = {}) {\n const { channelCount = 1, onProgress, encoderOptions } = options\n\n if (channelCount === 1) {\n yield* AudioProcessor._encodeMonoStream(\n audioFrames,\n onProgress,\n encoderOptions\n )\n } else if (channelCount === 2) {\n yield* AudioProcessor._encodeStereoStream(\n audioFrames,\n onProgress,\n encoderOptions\n )\n } else {\n throw new Error(`Unsupported channel count: ${channelCount}`)\n }\n }\n\n /**\n * Internal method for encoding mono audio streams\n * @param {AsyncIterable<Float32Array>} audioFrames - Mono audio frame stream\n * @param {Function} onProgress - Progress callback function\n * @param {EncoderOptions} encoderOptions - Encoder configuration\n * @returns {AsyncGenerator<Object>} Stream of encoded frame data\n * @private\n */\n static async *_encodeMonoStream(audioFrames, onProgress, encoderOptions) {\n const options = encoderOptions || new EncoderOptions()\n const encoder = encode(options)\n let frameIndex = 0\n for await (const frame of audioFrames) {\n const result = encoder(frame)\n yield result\n\n if (onProgress) {\n onProgress(frameIndex++)\n }\n }\n }\n\n /**\n * Internal method for encoding stereo audio streams\n * @param {AsyncIterable<[Float32Array, Float32Array]>} audioFrames - Stereo audio frame stream\n * @param {Function} onProgress - Progress callback function\n * @param {EncoderOptions} encoderOptions - Encoder configuration\n * @returns {AsyncGenerator<Object>} Stream of encoded frame data (left then right)\n * @private\n */\n static async *_encodeStereoStream(audioFrames, onProgress, encoderOptions) {\n const options = encoderOptions || new EncoderOptions()\n const leftEncoder = encode(options)\n const rightEncoder = encode(options)\n let frameIndex = 0\n\n for await (const [leftFrame, rightFrame] of audioFrames) {\n const leftResult = leftEncoder(leftFrame)\n const rightResult = rightEncoder(rightFrame)\n\n yield leftResult\n yield rightResult\n\n if (onProgress) {\n onProgress(frameIndex++)\n }\n }\n }\n\n /**\n * Decodes a stream of ATRAC1 encoded frames back to PCM audio\n * @param {AsyncIterable<Object>} encodedFrames - Stream of encoded frame data\n * @param {Object} [options={}] - Decoding options\n * @param {number} [options.channelCount=1] - Number of audio channels (1 or 2)\n * @param {Function} [options.onProgress] - Progress callback function\n * @returns {AsyncGenerator<Float32Array>|AsyncGenerator<[Float32Array, Float32Array]>} Stream of decoded PCM frames\n * @throws {Error} If unsupported channel count is provided\n */\n static async *decodeStream(encodedFrames, options = {}) {\n const { channelCount = 1, onProgress } = options\n\n if (channelCount === 1) {\n yield* AudioProcessor._decodeMonoStream(encodedFrames, onProgress)\n } else if (channelCount === 2) {\n yield* AudioProcessor._decodeStereoStream(encodedFrames, onProgress)\n } else {\n throw new Error(`Unsupported channel count: ${channelCount}`)\n }\n }\n\n /**\n * Internal method for decoding mono audio streams\n * @param {AsyncIterable<Object>} encodedFrames - Mono encoded frame stream\n * @param {Function} onProgress - Progress callback function\n * @returns {AsyncGenerator<Float32Array>} Stream of decoded mono PCM frames\n * @private\n */\n static async *_decodeMonoStream(encodedFrames, onProgress) {\n const decoder = decode()\n let frameIndex = 0\n\n // Create raw PCM frame stream\n const rawPcmFrames = async function* () {\n for await (const frame of encodedFrames) {\n const result = decoder(frame)\n yield result\n\n if (onProgress) {\n onProgress(frameIndex++)\n }\n }\n }\n\n // Always apply delay compensation\n yield* rawPcmFrames()\n }\n\n /**\n * Internal method for decoding stereo audio streams\n * @param {AsyncIterable<Object>} encodedFrames - Stereo encoded frame stream (interleaved left/right)\n * @param {Function} onProgress - Progress callback function\n * @returns {AsyncGenerator<[Float32Array, Float32Array]>} Stream of decoded stereo PCM frame pairs\n * @private\n */\n static async *_decodeStereoStream(encodedFrames, onProgress) {\n const leftDecoder = decode()\n const rightDecoder = decode()\n let frameIndex = 0\n\n const rawPcmFrames = async function* () {\n let leftFrame = null\n let isLeftChannel = true\n\n for await (const frame of encodedFrames) {\n if (isLeftChannel) {\n leftFrame = frame\n } else {\n const rightFrame = frame\n\n // Decode and yield the pair\n const leftResult = leftDecoder(leftFrame)\n const rightResult = rightDecoder(rightFrame)\n\n yield [leftResult, rightResult]\n\n if (onProgress) {\n onProgress(frameIndex++)\n }\n }\n\n isLeftChannel = !isLeftChannel\n }\n\n if (!isLeftChannel && leftFrame) {\n const rightFrame = AudioProcessor._createDummyFrame()\n const leftResult = leftDecoder(leftFrame)\n const rightResult = rightDecoder(rightFrame)\n\n yield [leftResult, rightResult]\n\n if (onProgress) {\n onProgress(frameIndex++)\n }\n }\n }\n\n // Always apply stereo delay compensation\n yield* rawPcmFrames()\n }\n\n /**\n * Converts channel buffer arrays to frame-based stream format\n * @param {Float32Array[]} buffers - Array of channel buffers (1 for mono, 2 for stereo)\n * @param {number} [frameSize=SAMPLES_PER_FRAME] - Frame size in samples\n * @returns {Generator<Float32Array>|Generator<[Float32Array, Float32Array]>} Stream of audio frames\n * @throws {Error} If unsupported channel count is provided\n */\n static *frameBufferToFrames(buffers, frameSize = SAMPLES_PER_FRAME) {\n const channelCount = buffers.length\n\n if (channelCount === 1) {\n const [left] = buffers\n for (let i = 0; i < left.length; i += frameSize) {\n const frame = new Float32Array(frameSize)\n const end = Math.min(i + frameSize, left.length)\n for (let j = 0; j < end - i; j++) {\n frame[j] = left[i + j]\n }\n yield frame\n }\n } else if (channelCount === 2) {\n const [left, right] = buffers\n const maxLength = Math.max(left.length, right.length)\n\n for (let i = 0; i < maxLength; i += frameSize) {\n const leftFrame = new Float32Array(frameSize)\n const rightFrame = new Float32Array(frameSize)\n\n const end = Math.min(i + frameSize, maxLength)\n\n for (let j = 0; j < end - i; j++) {\n leftFrame[j] = i + j < left.length ? left[i + j] : 0\n rightFrame[j] = i + j < right.length ? right[i + j] : 0\n }\n\n yield [leftFrame, rightFrame]\n }\n } else {\n throw new Error(`Unsupported channel count: ${channelCount}`)\n }\n }\n\n /**\n * Collects all frames from a stream into an array\n * @param {AsyncIterable} frameStream - Stream of frames to collect\n * @returns {Promise<Array>} Array of all frames from the stream\n */\n static async collectFrames(frameStream) {\n const frames = []\n for await (const frame of frameStream) {\n frames.push(frame)\n }\n return frames\n }\n\n /**\n * Creates a dummy frame for padding purposes\n * @returns {Object} Empty frame structure\n * @private\n */\n static _createDummyFrame() {\n return {\n nBfu: 0,\n blockModes: [0, 0, 0],\n scaleFactorIndices: new Int32Array(0),\n wordLengthIndices: new Int32Array(0),\n quantizedCoefficients: [],\n }\n }\n\n /**\n * Creates an AEA file blob from encoded frames\n * @param {AsyncIterable<Object>} encodedFrames - Stream of encoded frame data\n * @param {Object} [options={}] - AEA file options\n * @param {string} [options.title='encoded by atrac1.js'] - File title\n * @param {number} [options.channelCount=1] - Number of audio channels\n * @returns {Promise<Blob>} AEA file blob\n */\n static async createAeaBlob(encodedFrames, options = {}) {\n const { title = 'encoded by atrac1.js', channelCount = 1 } = options\n\n const frames = []\n for await (const frame of encodedFrames) {\n frames.push(serializeFrame(frame))\n }\n\n const header = AeaFile.createHeader(title, frames.length, channelCount)\n const totalSize =\n header.length + frames.reduce((sum, frame) => sum + frame.length, 0)\n\n const buffer = new Uint8Array(totalSize)\n buffer.set(header, 0)\n\n let offset = header.length\n for (const frame of frames) {\n buffer.set(frame, offset)\n offset += frame.length\n }\n\n return new Blob([buffer], { type: 'application/octet-stream' })\n }\n\n /**\n * Creates a WAV file blob from PCM audio frames\n * @param {Float32Array[]|Float32Array|[Float32Array, Float32Array][]} pcmFrames - PCM audio frames\n * @param {number} [channelCount=1] - Number of audio channels\n * @param {number} [sampleRate=SAMPLE_RATE] - Audio sample rate\n * @returns {Blob} WAV file blob\n * @throws {Error} If unsupported channel count is provided\n */\n static createWavBlob(pcmFrames, channelCount = 1, sampleRate = SAMPLE_RATE) {\n const frames = Array.isArray(pcmFrames) ? pcmFrames : [pcmFrames]\n\n if (channelCount === 1) {\n return AudioProcessor._createMonoWavBlob(frames, sampleRate)\n } else if (channelCount === 2) {\n return AudioProcessor._createStereoWavBlob(frames, sampleRate)\n } else {\n throw new Error(`Unsupported channel count: ${channelCount}`)\n }\n }\n\n /**\n * Creates a mono WAV file blob from PCM frames\n * @param {Float32Array[]} frames - Array of mono PCM frames\n * @param {number} sampleRate - Audio sample rate\n * @returns {Blob} Mono WAV file blob\n * @private\n */\n static _createMonoWavBlob(frames, sampleRate) {\n const totalSamples = frames.reduce((sum, frame) => sum + frame.length, 0)\n const buffer = new ArrayBuffer(\n WAV_HEADER_SIZE + totalSamples * WAV_BYTES_PER_SAMPLE\n )\n const view = new DataView(buffer)\n\n // WAV header\n AudioProcessor._writeWavHeader(view, totalSamples, 1, sampleRate)\n\n // PCM data using DataView for consistency\n let offset = WAV_HEADER_SIZE\n for (const frame of frames) {\n for (let i = 0; i < frame.length; i++) {\n const sample = Math.max(-1, Math.min(1, frame[i]))\n view.setInt16(\n offset,\n sample < 0\n ? sample * WAV_PCM_MAX_NEGATIVE\n : sample * WAV_PCM_MAX_POSITIVE,\n true\n )\n offset += WAV_BYTES_PER_SAMPLE\n }\n }\n\n return new Blob([buffer], { type: 'audio/wav' })\n }\n\n /**\n * Creates a stereo WAV file blob from PCM frame pairs\n * @param {[Float32Array, Float32Array][]} framePairs - Array of stereo PCM frame pairs\n * @param {number} sampleRate - Audio sample rate\n * @returns {Blob} Stereo WAV file blob\n * @private\n */\n static _createStereoWavBlob(framePairs, sampleRate) {\n const totalSamples = framePairs.reduce(\n (sum, [left, right]) => sum + Math.max(left.length, right.length),\n 0\n )\n\n const buffer = new ArrayBuffer(\n WAV_HEADER_SIZE + totalSamples * WAV_BYTES_PER_SAMPLE * 2\n )\n const view = new DataView(buffer)\n\n // WAV header\n AudioProcessor._writeWavHeader(view, totalSamples, 2, sampleRate)\n\n // Interleaved PCM data using DataView for consistency\n let offset = WAV_HEADER_SIZE\n for (const [leftFrame, rightFrame] of framePairs) {\n const frameLength = Math.max(leftFrame.length, rightFrame.length)\n for (let i = 0; i < frameLength; i++) {\n const leftSample = i < leftFrame.length ? leftFrame[i] : 0\n const rightSample = i < rightFrame.length ? rightFrame[i] : 0\n const leftClipped = Math.max(-1, Math.min(1, leftSample))\n const rightClipped = Math.max(-1, Math.min(1, rightSample))\n view.setInt16(\n offset,\n leftClipped < 0\n ? leftClipped * WAV_PCM_MAX_NEGATIVE\n : leftClipped * WAV_PCM_MAX_POSITIVE,\n true\n )\n offset += WAV_BYTES_PER_SAMPLE\n view.setInt16(\n offset,\n rightClipped < 0\n ? rightClipped * WAV_PCM_MAX_NEGATIVE\n : rightClipped * WAV_PCM_MAX_POSITIVE,\n true\n )\n offset += WAV_BYTES_PER_SAMPLE\n }\n }\n\n return new Blob([buffer], { type: 'audio/wav' })\n }\n\n /**\n * Writes WAV file header to DataView\n * @param {DataView} view - DataView to write to\n * @param {number} totalSamples - Total number of samples\n * @param {number} channelCount - Number of audio channels\n * @param {number} sampleRate - Audio sample rate\n * @private\n */\n static _writeWavHeader(view, totalSamples, channelCount, sampleRate) {\n const byteRate = sampleRate * channelCount * WAV_BYTES_PER_SAMPLE\n const blockAlign = channelCount * WAV_BYTES_PER_SAMPLE\n const dataSize = totalSamples * blockAlign\n const fileSize = WAV_DATA_OFFSET + dataSize\n\n let pos = 0\n\n // Helper function to write ASCII strings\n const writeString = (offset, string) => {\n for (let i = 0; i < string.length; i++) {\n view.setUint8(offset + i, string.charCodeAt(i))\n }\n }\n\n // RIFF header\n writeString(pos, 'RIFF')\n pos += 4\n view.setUint32(pos, fileSize, true)\n pos += 4\n writeString(pos, 'WAVE')\n pos += 4\n\n // fmt chunk\n writeString(pos, 'fmt ')\n pos += 4\n view.setUint32(pos, 16, true) // chunk size\n pos += 4\n view.setUint16(pos, 1, true) // PCM format\n pos += 2\n view.setUint16(pos, channelCount, true)\n pos += 2\n view.setUint32(pos, sampleRate, true)\n pos += 4\n view.setUint32(pos, byteRate, true)\n pos += 4\n view.setUint16(pos, blockAlign, true)\n pos += 2\n view.setUint16(pos, WAV_BITS_PER_SAMPLE, true) // bits per sample\n pos += 2\n\n // data chunk\n writeString(pos, 'data')\n pos += 4\n view.setUint32(pos, dataSize, true)\n }\n\n /**\n * Parses an AEA file blob to extract header info and frame data\n * @param {Blob} blob - AEA file blob to parse\n * @returns {Promise<Object>} Parsed AEA file data\n * @returns {Object} returns.info - AEA file header information\n * @returns {Uint8Array[]} returns.frameData - Array of frame data buffers\n */\n static async parseAeaBlob(blob) {\n const buffer = await blob.arrayBuffer()\n const header = new Uint8Array(buffer.slice(0, AEA_HEADER_SIZE))\n const info = AeaFile.parseHeader(header)\n\n const frameData = []\n for (let i = AEA_HEADER_SIZE; i < buffer.byteLength; i += SOUND_UNIT_SIZE) {\n const frame = new Uint8Array(buffer.slice(i, i + SOUND_UNIT_SIZE))\n if (frame.length === SOUND_UNIT_SIZE) {\n frameData.push(frame)\n }\n }\n\n return { info, frameData }\n }\n\n /**\n * Creates a stream of deserialized frames from binary frame data\n * @param {Uint8Array[]} frameData - Array of binary frame data\n * @returns {Generator<Object>} Stream of deserialized frame objects\n */\n static *deserializedFrameStream(frameData) {\n for (const frame of frameData) {\n yield deserializeFrame(frame)\n }\n }\n\n /**\n * Assembles PCM frames into a continuous buffer\n * @param {Float32Array[]|[Float32Array, Float32Array][]} pcmFrames - Array of PCM frames\n * @param {number} channelCount - Number of audio channels\n * @returns {Float32Array} Continuous PCM buffer (interleaved for stereo)\n * @throws {Error} If unsupported channel count is provided\n */\n static assemblePcmFrames(pcmFrames, channelCount) {\n if (channelCount === 1) {\n const totalSamples = pcmFrames.reduce(\n (sum, frame) => sum + frame.length,\n 0\n )\n const pcm = new Float32Array(totalSamples)\n let offset = 0\n for (const frame of pcmFrames) {\n pcm.set(frame, offset)\n offset += frame.length\n }\n return pcm\n } else if (channelCount === 2) {\n const totalSamples = pcmFrames.reduce(\n (sum, [left, right]) => sum + Math.max(left.length, right.length),\n 0\n )\n const pcm = new Float32Array(totalSamples * 2)\n\n let pcmOffset = 0\n for (const [leftFrame, rightFrame] of pcmFrames) {\n const frameLength = Math.max(leftFrame.length, rightFrame.length)\n for (let j = 0; j < frameLength; j++) {\n pcm[pcmOffset * 2] = j < leftFrame.length ? leftFrame[j] : 0\n pcm[pcmOffset * 2 + 1] = j < rightFrame.length ? rightFrame[j] : 0\n pcmOffset++\n }\n }\n return pcm\n } else {\n throw new Error(`Unsupported channel count: ${channelCount}`)\n }\n }\n}\n\n/**\n * Encode complete planar PCM buffers into an AEA byte image.\n *\n * Encoding options are accepted directly alongside the optional AEA `title`.\n * The final partial PCM frame is zero-padded.\n *\n * @param {Float32Array[]} channels One or two normalized PCM channels.\n * @param {Object} [options] Encoder and AEA metadata options.\n * @param {string} [options.title] AEA title.\n * @param {number} [options.transientThresholdLow] Low-band threshold.\n * @param {number} [options.transientThresholdMid] Mid-band threshold.\n * @param {number} [options.transientThresholdHigh] High-band threshold.\n * @param {number} [options.allocationBias] Bit-allocation bias.\n * @param {number[]} [options.fixedBlockModes] Fixed low, mid, and high modes.\n * @returns {Promise<Uint8Array>} Complete AEA byte image.\n */\nexport async function encodeAeaPcm(channels, options = {}) {\n if (\n !Array.isArray(channels) ||\n (channels.length !== 1 && channels.length !== 2) ||\n channels.some((channel) => !(channel instanceof Float32Array))\n ) {\n throw new TypeError('ATRAC1 encoding requires one or two Float32 channels')\n }\n\n const { title = 'encoded by carta1', ...encoderValues } = options\n const frames = AudioProcessor.frameBufferToFrames(channels)\n const encodedFrames = AudioProcessor.encodeStream(frames, {\n channelCount: channels.length,\n encoderOptions: new EncoderOptions(encoderValues),\n })\n const blob = await AudioProcessor.createAeaBlob(encodedFrames, {\n title,\n channelCount: channels.length,\n })\n return new Uint8Array(await blob.arrayBuffer())\n}\n\n/**\n * Decode a complete AEA byte image into planar normalized PCM buffers.\n *\n * AEA does not retain the exact source sample count, so returned channels\n * include any zero padding from the final encoded frame.\n *\n * @param {Uint8Array|ArrayBuffer|Blob} input Complete AEA image.\n * @returns {Promise<Float32Array[]>} Decoded normalized PCM channels.\n */\nexport async function decodeAeaPcm(input) {\n let blob\n if (input instanceof Blob) {\n blob = input\n } else if (input instanceof Uint8Array || input instanceof ArrayBuffer) {\n blob = new Blob([input])\n } else {\n throw new TypeError('ATRAC1 decoding requires AEA bytes or a Blob')\n }\n\n const { info, frameData } = await AudioProcessor.parseAeaBlob(blob)\n const frames = AudioProcessor.deserializedFrameStream(frameData)\n const decodedFrames = await AudioProcessor.collectFrames(\n AudioProcessor.decodeStream(frames, {\n channelCount: info.channelCount,\n })\n )\n\n if (info.channelCount === 1) {\n return [joinChannelFrames(decodedFrames)]\n }\n\n return [\n joinChannelFrames(decodedFrames.map(([left]) => left)),\n joinChannelFrames(decodedFrames.map(([, right]) => right)),\n ]\n}\n\n/**\n * Join complete PCM frames into one channel buffer.\n *\n * @param {Float32Array[]} frames PCM frames for one channel.\n * @returns {Float32Array} Contiguous PCM channel.\n */\nfunction joinChannelFrames(frames) {\n const sampleCount = frames.reduce((total, frame) => total + frame.length, 0)\n const channel = new Float32Array(sampleCount)\n let offset = 0\n for (const frame of frames) {\n channel.set(frame, offset)\n offset += frame.length\n }\n return channel\n}\n","/**\n * Carta1 Web Worker - Self-contained audio codec worker\n *\n * Provides asynchronous encoding and decoding of ATRAC1 audio format\n * in a separate thread to prevent blocking the main UI thread.\n *\n * Usage:\n * Include this file as a web worker:\n * new Worker('carta1-worker.min.js')\n */\n\nimport { AeaFile } from '../io/serialization.js'\nimport { EncoderOptions } from '../core/options.js'\nimport { AudioProcessor } from '../io/processor.js'\nimport { SAMPLE_RATE } from '../core/constants.js'\n\n/**\n * Handle messages from the main thread\n *\n * Supported message types:\n * - 'encode': Encode PCM to ATRAC1\n * - 'decode': Decode ATRAC1 to PCM\n * - 'parseAea': Parse AEA blob metadata\n * - 'getEncoderOptions': Get default encoder options\n */\nself.onmessage = async (e) => {\n const { jobId, type, pcmData, aea, options, title, blob } = e.data\n\n try {\n let result\n\n switch (type) {\n case 'encode':\n result = await encodeAtrac(pcmData, options, title)\n break\n case 'decode':\n result = await decodeAtrac(aea)\n break\n case 'parseAea':\n result = await AudioProcessor.parseAeaBlob(blob)\n break\n case 'getEncoderOptions':\n result = getEncoderOptionsMetadata()\n break\n default:\n throw new Error(`Unknown worker message type: ${type}`)\n }\n\n self.postMessage({ jobId, result })\n } catch (error) {\n console.error('Worker error:', error)\n self.postMessage({ jobId, error: error.message })\n }\n}\n\n/**\n * Encode PCM audio data to ATRAC1 format\n *\n * @param {Array<Float32Array>} pcmData - PCM audio data [mono] or [left, right]\n * @param {Object} options - Encoder options\n * @returns {Promise<Object>} Encoded AEA blob\n */\nasync function encodeAtrac(pcmData, options, title) {\n title = title ?? 'encoded by carta1'\n try {\n const audioFrames = AudioProcessor.frameBufferToFrames(pcmData)\n const channelCount = pcmData.length\n\n // Create encoder options from provided settings\n const encoderOptions = new EncoderOptions(options)\n\n const encodedFrames = AudioProcessor.encodeStream(audioFrames, {\n channelCount,\n encoderOptions,\n })\n\n const frameArray = await AudioProcessor.collectFrames(encodedFrames)\n\n const aeaBlob = await AudioProcessor.createAeaBlob(frameArray, {\n title,\n channelCount,\n })\n\n // Return the blob\n return { aeaBlob }\n } catch (error) {\n console.error('Worker encode error:', error)\n throw error\n }\n}\n\n/**\n * Get default encoder options metadata\n *\n * @returns {Object} Default encoder options as plain object\n */\nfunction getEncoderOptionsMetadata() {\n const defaultOptions = new EncoderOptions()\n return defaultOptions.toObject()\n}\n\n/**\n * Decode ATRAC1 data to PCM WAV format\n *\n * @param {Object} aea - AEA data object\n * @param {Uint8Array} aea.header - AEA file header\n * @param {Array} aea.aeaData - Serialized frame data\n * @param {Object} [aea.info] - Optional metadata\n * @returns {Promise<Object>} WAV blob and decoding info\n */\nasync function decodeAtrac(aea) {\n const { header, aeaData, info } = aea\n\n // Use provided info, or fall back to header parsing, or defaults\n let decodingInfo\n if (info) {\n decodingInfo = { sampleRate: SAMPLE_RATE, ...info }\n } else if (header) {\n const headerInfo = AeaFile.parseHeader(header)\n decodingInfo = { sampleRate: SAMPLE_RATE, ...headerInfo }\n } else {\n decodingInfo = { channelCount: 2, sampleRate: SAMPLE_RATE }\n }\n\n const encodedFrameStream = AudioProcessor.deserializedFrameStream(aeaData)\n const decodedFrames = AudioProcessor.decodeStream(encodedFrameStream, {\n channelCount: decodingInfo.channelCount,\n })\n\n const pcmFrames = await AudioProcessor.collectFrames(decodedFrames)\n\n // Create WAV blob directly\n const wavBlob = AudioProcessor.createWavBlob(\n pcmFrames,\n decodingInfo.channelCount,\n decodingInfo.sampleRate\n )\n\n return { wavBlob, info: decodingInfo }\n}\n"],"names":["SAMPLE_RATE","AEA_MAGIC","Uint8Array","AEA_HEADER_SIZE","SOUND_UNIT_SIZE","SPECS_PER_BFU","Int32Array","BFU_AMOUNTS","BFU_BAND_BOUNDARIES","BFU_START_LONG","BFU_START_SHORT","MDCT_SIZE_MID","MDCT_SIZE_LONG","WINDOW_SHORT","table","Float64Array","i","Math","sin","PI","QMF_DELAY","QMF_COEFFS","Float32Array","QMF_WINDOW","window","QMF_EVEN","even","QMF_ODD","odd","MDCT_BAND_CONFIGS","size","windowStart","MDCT_SHORT_BLOCK_SIZE","MDCT_OVERLAP_SIZE","MDCT_TAIL_WINDOW_SIZE","WAV_PCM_MAX_POSITIVE","WAV_PCM_MAX_NEGATIVE","MAX_WORD_LENGTH_INDEX","WORD_LENGTH_BITS","SCALE_FACTORS","pow","INV_POWER_OF_TWO","maxBits","b","WORD_LENGTH_DELTA_BITS","DISTORTION_DELTA_FACTORS","bits1","bits2","packBits","buffer","bitPosition","value","bitCount","byteIndex","floor","bitOffset","bitsWritten","length","bitsAvailable","bitsToWrite","min","valueBits","mask","unpackBits","bitsRead","bitsToRead","unpackSignedBits","serializeFrame","frameData","view","DataView","bfuIndex","indexOf","nBfu","header","blockModes","setUint16","wordLengthIndices","scaleFactorIndices","bitsPerSample","_step","_iterator","_createForOfIteratorHelper","quantizedCoefficients","s","n","done","coefficient","err","e","f","deserializeFrame","Error","concat","byteOffset","byteLength","getUint16","bfuSize","coefficients","j","push","AeaFile","_classCallCheck","this","key","title","arguments","undefined","frameCount","channelCount","set","titleBytes","TextEncoder","encode","subarray","AEA_TITLE_SIZE","setUint32","titleEnd","titleLength","TextDecoder","decode","getUint32","EncoderOptions","options","values","transientThresholdLow","transientThresholdMid","transientThresholdHigh","allocationBias","fixedBlockModes","metadata","default","name","description","range","step","type","setOptions","_i","_Object$entries","Object","entries","_Object$entries$_i","_slicedToArray","setValue","meta","_meta$range","max","get","_objectSpread","_i2","_Object$entries2","_Object$entries2$_i","throwError","msg","pipe","context","_len","stages","Array","_key","functions","map","stage","input","reduce","fn","reverseSpectrum","spectrum","reversalBuffers","reversed","qmfAnalysis","delayLine","_qmfWorkBuffers$delay","_qmfWorkBuffers$delay2","qmfWorkBuffers","inputLength","outputLength","workBuffer","delay","lowBand","highBand","evenSum","oddSum","offset","newDelay","slice","qmfSynthesis","_qmfWorkBuffers$delay3","_qmfWorkBuffers$delay4","subbandLength","low","high","output","sample0","sample1","idx","FFT","real","imag","bits","log2","temp","_ref","_ref2","stride","halfStride","angle","wReal","cos","wImag","start","twiddleReal","twiddleImag","k","evenIndex","oddIndex","evenReal","evenImag","oddReal","oddImag","tReal","tImag","nextReal","MDCTBase","_createClass","scale","halfSize","quarterSize","fftSize","alpha","omega","scaleRoot","sqrt","sinCosTable","MDCT","_MDCTBase","_callSuper","_inherits","_mdctBuffers$this$fft","_buffers$real","_buffers$imag","mdctBuffers","buffers","n4","n34","fill","i2","i3","i4","r","im","c","fft","re","IMDCT","_MDCTBase2","_mdctBuffers$this$fft2","_buffers$real2","_buffers$imag2","r1","i1","mdct64","mdct256","mdct512","imdct64","MDCT_SIZE_SHORT","imdct256","imdct512","overlapAdd","prev","curr","w1","w2","p","quantize","scaleFactorIndex","out","quantRange","normFactor","hi","lo","x","y","dequantize","quantized","scaleFactor","deq","biasedScaleFactorCache","Map","allocateBits","bfuData","bfuSizes","maxBfuCount","allScaleFactorIndices","zeroBitDistortions","biasedScaleFactors","bias","has","buildBiasedScaleFactorTable","sz","sfi","findScaleFactor","effectiveScaleFactor","bestResult","minTotalDistortion","Infinity","candidateBfuCount","availableBits","FRAME_BITS","rdoResult","distributeBitsRDO","totalDistortion","calculateTotalDistortion","wordLengths","bfuCount","allocation","fallbackBfuCount","activeBfuCount","wl","remainingBits","heapIndices","heapPriorities","heapSize","deltaBits","distortionDelta","siftDown","bfu","cur","cost","last","nxt","deltaBitsNext","maxAmplitude","a","abs","index","ceil","startIndex","idxVal","prVal","l","maxI","maxP","BufferPool","transformBuffers","highBandDelay","QMF_HIGH_BAND_DELAY","qmfDelays","midBand","transientDetection","mdctOverlap","imdctOverlap","detectTransient","currentCoeffs","prevCoeffs","threshold","features","spectralFlux","flux","currentEnergy","currentMag","diff","normalization","calculateSpectralFlux","currentFlatness","calculateSpectralFlatness","prevFlatness","flatnessChange","currentHfRatio","calculateHighFrequencyRatio","prevHfRatio","hfChange","energyChange","prevEnergy","changeDb","log10","calculateEnergyChange","calculateSpectralFeatures","transientScore","fluxContribution","flatnessContribution","hfContribution","log1p","energyContribution","calculateTransientScore","coeffs","sumLog","sumLinear","validBins","magnitude","log","geometricMean","exp","arithmeticMean","midPoint","lowEnergy","highEnergy","totalEnergy","qmfAnalysisStage","_context$bufferPool","bufferPool","delays","pcmSamples","stage1","stage2","delayedHigh","bands","blockSelectorStage","_context$bufferPool2","_context$options","fftSizes","bandSamples","bandIndex","samples","copyLen","performFFT","transient","mdctStage","_context$bufferPool3","overlapBuffers","TRANSFORM_FUNCS","transformBand","blockMode","overlapBuffer","config","transformFunc","mdctSize","mdctInput","applyTailWindowing","transform","transformLongBlock","numBlocks","block","blockStart","blockSamples","transformShortBlocks","blockSize","tailStart","tailValue","originalFrame","forEach","transformed","calculateBandOffset","quantizationStage","_context$options2","_groupIntoBFUs","coeffIndex","band","bandStart","bandSize","bandEnd","startPositions","startPos","endPos","srcStart","srcEnd","groupIntoBFUs","_allocateBits","selectedBfuCount","slicedWordLengthIndices","slicedScaleFactorIndices","data","wordLength","dequantizationStage","position","dequantized","imdctStage","blockSpecs","inv","invStart","invBuf","prevBuf","dstPart","inverseLongBlock","pos","inverseShortBlocks","bandCoeffs","offsets","extractBandCoefficients","qmfSynthesisStage","t","Symbol","iterator","o","toStringTag","prototype","Generator","u","create","_regeneratorDefine2","G","v","d","bind","TypeError","call","GeneratorFunction","GeneratorFunctionPrototype","getPrototypeOf","setPrototypeOf","__proto__","displayName","_regenerator","w","m","defineProperty","_invoke","enumerable","configurable","writable","_defineProperties","_toPropertyKey","_typeof","toPrimitive","String","Number","_toPrimitive","_wrapAsyncGenerator","AsyncGenerator","apply","resume","_OverloadYield","Promise","resolve","then","settle","reject","next","arg","_awaitAsyncGenerator","_asyncGeneratorDelegate","pump","_asyncIterator","asyncIterator","AsyncFromSyncIterator","AsyncFromSyncIteratorContinuation","return","throw","AudioProcessor","channels","_x6","_encodeAeaPcm2","encodeAeaPcm","_x7","_decodeAeaPcm2","decodeAeaPcm","_x","audioFrames","_callee","_options$channelCount","onProgress","encoderOptions","_context","_regeneratorValues","_encodeMonoStream","_encodeStereoStream","_callee2","encoder","frameIndex","_iteratorAbruptCompletion","_didIteratorError","_iteratorError","frame","result","_t","_context2","_callee3","leftEncoder","rightEncoder","_iteratorAbruptCompletion2","_didIteratorError2","_iteratorError2","_iterator2","_step2","_step2$value","leftFrame","rightFrame","leftResult","rightResult","_t2","_context3","_x2","encodedFrames","_callee4","_options$channelCount2","_context4","_decodeMonoStream","_decodeStereoStream","_callee6","decoder","rawPcmFrames","_context6","_callee5","_iteratorAbruptCompletion3","_didIteratorError3","_iteratorError3","_iterator3","_step3","_t3","_context5","_callee8","leftDecoder","rightDecoder","_context8","_callee7","isLeftChannel","_iteratorAbruptCompletion4","_didIteratorError4","_iteratorError4","_iterator4","_step4","_rightFrame","_leftResult","_rightResult","_t4","_context7","_createDummyFrame","frameSize","_callee9","_buffers","left","end","_buffers2","_left","right","maxLength","_end","_j","_context9","_collectFrames","_asyncToGenerator","_callee0","frameStream","frames","_iteratorAbruptCompletion5","_didIteratorError5","_iteratorError5","_iterator5","_step5","_t5","_context0","_x3","_createAeaBlob","_callee1","_options$title","_options$channelCount3","_iteratorAbruptCompletion6","_didIteratorError6","_iteratorError6","_iterator6","_step6","totalSize","_frames","_frame","_t6","_args1","_context1","createHeader","sum","Blob","_x4","pcmFrames","sampleRate","isArray","_createMonoWavBlob","_createStereoWavBlob","totalSamples","ArrayBuffer","_writeWavHeader","_step7","_iterator7","sample","setInt16","framePairs","_ref3","_ref4","_step8","_iterator8","_step8$value","frameLength","leftSample","rightSample","leftClipped","rightClipped","byteRate","blockAlign","dataSize","fileSize","writeString","string","setUint8","charCodeAt","_parseAeaBlob","_callee10","blob","info","_context10","arrayBuffer","parseHeader","_x5","deserializedFrameStream","_iterator9","_step9","_t7","_context11","_step0","pcm","_iterator0","_step1","_ref5","_ref6","pcmOffset","_iterator1","_step1$value","_callee11","_options$title2","encoderValues","_t8","_t9","_args12","_context12","some","channel","_objectWithoutProperties","_excluded","frameBufferToFrames","encodeStream","createAeaBlob","_callee12","_yield$AudioProcessor","decodedFrames","_context13","parseAeaBlob","collectFrames","decodeStream","joinChannelFrames","_ref7","_ref9","_step10","sampleCount","total","_iterator10","asyncGeneratorStep","_next","_throw","encodeAtrac","_encodeAtrac","pcmData","frameArray","aeaBlob","console","error","getEncoderOptionsMetadata","toObject","decodeAtrac","_decodeAtrac","aea","aeaData","decodingInfo","headerInfo","encodedFrameStream","wavBlob","createWavBlob","self","onmessage","_e$data","jobId","postMessage","message"],"sourceRoot":""}
1
+ {"version":3,"file":"carta1-worker.min.js","mappings":"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","sources":["webpack://carta1/./codec/core/constants.js","webpack://carta1/./codec/core/tables.js","webpack://carta1/./codec/boundary/container.js","webpack://carta1/./codec/core/options.js","webpack://carta1/./codec/syntax/bitstream.js","webpack://carta1/./codec/syntax/frame.js","webpack://carta1/./codec/boundary/pcm.js","webpack://carta1/./codec/quantization/spectrum.js","webpack://carta1/./codec/dequantization.js","webpack://carta1/./codec/state.js","webpack://carta1/./codec/utils.js","webpack://carta1/./codec/signal/fft.js","webpack://carta1/./codec/signal/spectrum.js","webpack://carta1/./codec/synthesis/bands.js","webpack://carta1/./codec/core/geometry.js","webpack://carta1/./codec/signal/bands.js","webpack://carta1/./codec/synthesis/pcm.js","webpack://carta1/./codec/synthesis/stage.js","webpack://carta1/./codec/pipeline/decoder.js","webpack://carta1/./codec/allocation/source.js","webpack://carta1/./codec/allocation/solve.js","webpack://carta1/./codec/allocation/stage.js","webpack://carta1/./codec/analysis/bands.js","webpack://carta1/./codec/analysis/blocks.js","webpack://carta1/./codec/analysis/spectrum.js","webpack://carta1/./codec/analysis/stage.js","webpack://carta1/./codec/quantization/stage.js","webpack://carta1/./codec/pipeline/encoder.js","webpack://carta1/./codec/boundary/stream.js","webpack://carta1/./codec/boundary/processor.js","webpack://carta1/./codec/boundary/worker.js"],"sourcesContent":["/**\n * Carta1 scalar format constants.\n */\n\nexport const SAMPLE_RATE = 44100\nexport const SAMPLES_PER_FRAME = 512\nexport const FRAME_RATE = SAMPLE_RATE / SAMPLES_PER_FRAME\n\nexport const AEA_HEADER_SIZE = 2048\nexport const AEA_TITLE_OFFSET = 4\nexport const AEA_TITLE_SIZE = 256\nexport const AEA_FRAME_COUNT_OFFSET = 260\nexport const AEA_CHANNEL_COUNT_OFFSET = 264\nexport const AEA_PRIMING_SAMPLE_COUNT_OFFSET = 268\nexport const AEA_SOURCE_SAMPLE_COUNT_OFFSET = 272\n\nexport const STREAM_PRIMING_SAMPLES = 266\nexport const STREAM_FLUSH_TAIL_FRAMES = 1\n\nexport const SOUND_UNIT_SIZE = 212\nexport const FRAME_BITS = SOUND_UNIT_SIZE * 8\nexport const FRAME_OVERHEAD_BITS = 40\nexport const BITRATE_PER_CHANNEL = SOUND_UNIT_SIZE * FRAME_RATE * 8\n\nexport const NUM_BFUS = 52\nexport const MAX_BFU_SIZE = 20\nexport const BITS_PER_BFU_METADATA = 10\nexport const BFU_AMOUNTS_COUNT = 8\n\nexport const MDCT_SIZE_SHORT = 64\nexport const MDCT_SIZE_MID = 256\nexport const MDCT_SIZE_LONG = 512\nexport const MDCT_SHORT_BLOCK_SIZE = 32\nexport const MDCT_OVERLAP_SIZE = 32\nexport const MDCT_TAIL_WINDOW_SIZE = 16\n\nexport const QMF_TAPS = 48\nexport const QMF_DELAY = 46\nexport const QMF_HIGH_BAND_DELAY = 39\n\nexport const FFT_SIZE_LOW = 128\nexport const FFT_SIZE_MID = 128\nexport const FFT_SIZE_HIGH = 256\n\nexport const WAV_HEADER_SIZE = 44\nexport const WAV_BYTES_PER_SAMPLE = 2\nexport const WAV_BITS_PER_SAMPLE = 16\nexport const WAV_PCM_MAX_POSITIVE = 0x7fff\nexport const WAV_PCM_MAX_NEGATIVE = 0x8000\nexport const WAV_DATA_OFFSET = 36\n\nexport const FRAME_HEADER_BITS = 16\nexport const FRAME_WORD_LENGTH_BITS = 4\nexport const FRAME_SCALE_FACTOR_BITS = 6\n\nexport const QUANTIZATION_SIGN_BIT_SHIFT = 1\nexport const MAX_WORD_LENGTH_INDEX = 15\n","/**\n * Stable ATRAC1 geometry, signal, allocation, and quantization tables.\n */\n\nimport { MAX_WORD_LENGTH_INDEX, QMF_TAPS } from './constants.js'\n\nexport const AEA_MAGIC = new Uint8Array([0x00, 0x08, 0x00, 0x00])\n\nexport const SPECS_PER_BFU = new Int32Array([\n 8, 8, 8, 8, 4, 4, 4, 4, 8, 8, 8, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7,\n 7, 7, 9, 9, 9, 9, 10, 10, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 20, 20, 20,\n 20, 20, 20, 20, 20,\n])\n\nexport const BFU_AMOUNTS = new Int32Array([20, 28, 32, 36, 40, 44, 48, 52])\nexport const BFU_BAND_BOUNDARIES = new Int32Array([20, 36, 52])\n\nexport const BFU_START_LONG = new Int32Array([\n 0, 8, 16, 24, 32, 36, 40, 44, 48, 56, 64, 72, 80, 86, 92, 98, 104, 110, 116,\n 122, 128, 134, 140, 146, 152, 159, 166, 173, 180, 189, 198, 207, 216, 226,\n 236, 246, 256, 268, 280, 292, 304, 316, 328, 340, 352, 372, 392, 412, 432,\n 452, 472, 492,\n])\n\nexport const BFU_START_SHORT = new Int32Array([\n 0, 32, 64, 96, 8, 40, 72, 104, 12, 44, 76, 108, 20, 52, 84, 116, 26, 58, 90,\n 122, 128, 160, 192, 224, 134, 166, 198, 230, 141, 173, 205, 237, 150, 182,\n 214, 246, 256, 288, 320, 352, 384, 416, 448, 480, 268, 300, 332, 364, 396,\n 428, 460, 492,\n])\n\nexport const WINDOW_SHORT = (() => {\n const table = new Float64Array(32)\n for (let i = 0; i < 32; i++) {\n table[i] = Math.sin(((i + 0.5) * Math.PI) / 64)\n }\n return table\n})()\n\nexport const QMF_COEFFS = new Float32Array([\n -0.00001461907, -0.00009205479, -0.000056157569, 0.00030117269, 0.0002422519,\n -0.00085293897, -0.0005205574, 0.0020340169, 0.00078333891, -0.0042153862,\n -0.00075614988, 0.0078402944, -0.000061169922, -0.01344162, 0.0024626821,\n 0.021736089, -0.007801671, -0.034090221, 0.01880949, 0.054326009,\n -0.043596379, -0.099384367, 0.13207909, 0.46424159,\n])\n\nexport const QMF_WINDOW = (() => {\n const window = new Float32Array(QMF_TAPS)\n for (let i = 0; i < 24; i++) {\n window[i] = QMF_COEFFS[i] * 2.0\n window[47 - i] = QMF_COEFFS[i] * 2.0\n }\n return window\n})()\n\nexport const QMF_EVEN = (() => {\n const even = new Float32Array(24)\n for (let i = 0; i < 24; i++) {\n even[i] = QMF_WINDOW[i * 2]\n }\n return even\n})()\n\nexport const QMF_ODD = (() => {\n const odd = new Float32Array(24)\n for (let i = 0; i < 24; i++) {\n odd[i] = QMF_WINDOW[i * 2 + 1]\n }\n return odd\n})()\n\nexport const MDCT_BAND_CONFIGS = [\n { size: 128, windowStart: 48 },\n { size: 128, windowStart: 48 },\n { size: 256, windowStart: 112 },\n]\n\nexport const WORD_LENGTH_BITS = new Int32Array([\n 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,\n])\n\nexport const SCALE_FACTORS = (() => {\n const table = new Float64Array(64)\n for (let i = 0; i < 64; i++) {\n table[i] = Math.pow(2.0, i / 3.0 - 21)\n }\n return table\n})()\n\nexport const INV_POWER_OF_TWO = (() => {\n const maxBits = WORD_LENGTH_BITS[MAX_WORD_LENGTH_INDEX]\n const table = new Float64Array(maxBits + 1)\n for (let bits = 0; bits <= maxBits; bits++) {\n table[bits] = Math.pow(2, -bits)\n }\n return table\n})()\n\nexport const WORD_LENGTH_DELTA_BITS = (() => {\n const table = new Int32Array(MAX_WORD_LENGTH_INDEX)\n for (let i = 0; i < MAX_WORD_LENGTH_INDEX; i++) {\n table[i] = (WORD_LENGTH_BITS[i + 1] - WORD_LENGTH_BITS[i]) | 0\n }\n return table\n})()\n\nexport const DISTORTION_DELTA_FACTORS = (() => {\n const table = new Float64Array(MAX_WORD_LENGTH_INDEX)\n table[0] = 2.0 - INV_POWER_OF_TWO[WORD_LENGTH_BITS[1]]\n for (let i = 1; i < MAX_WORD_LENGTH_INDEX; i++) {\n const bits1 = WORD_LENGTH_BITS[i] | 0\n const bits2 = WORD_LENGTH_BITS[i + 1] | 0\n table[i] = INV_POWER_OF_TWO[bits1] - INV_POWER_OF_TWO[bits2]\n }\n return table\n})()\n","/**\n * Carta1 AEA container boundary.\n */\n\nimport {\n AEA_CHANNEL_COUNT_OFFSET,\n AEA_FRAME_COUNT_OFFSET,\n AEA_HEADER_SIZE,\n AEA_PRIMING_SAMPLE_COUNT_OFFSET,\n AEA_SOURCE_SAMPLE_COUNT_OFFSET,\n AEA_TITLE_OFFSET,\n AEA_TITLE_SIZE,\n STREAM_PRIMING_SAMPLES,\n} from '../core/constants.js'\nimport { AEA_MAGIC } from '../core/tables.js'\n\n/**\n * AEA file-format handler.\n */\nexport class AeaFile {\n /**\n * Create an AEA header.\n *\n * @param {string} [title='']\n * @param {number} [frameCount=0]\n * @param {number} [channelCount=1]\n * @param {number} [sampleCount=0]\n * @param {number} [primingSampleCount=STREAM_PRIMING_SAMPLES]\n * @returns {Uint8Array}\n */\n static createHeader(\n title = '',\n frameCount = 0,\n channelCount = 1,\n sampleCount = 0,\n primingSampleCount = STREAM_PRIMING_SAMPLES\n ) {\n const header = new Uint8Array(AEA_HEADER_SIZE)\n const view = new DataView(header.buffer)\n header.set(AEA_MAGIC, 0)\n\n const titleBytes = new TextEncoder().encode(title)\n header.set(\n titleBytes.subarray(0, Math.min(titleBytes.length, AEA_TITLE_SIZE - 1)),\n AEA_TITLE_OFFSET\n )\n view.setUint32(AEA_FRAME_COUNT_OFFSET, frameCount, true)\n header[AEA_CHANNEL_COUNT_OFFSET] = channelCount\n view.setUint32(\n AEA_PRIMING_SAMPLE_COUNT_OFFSET,\n primingSampleCount >>> 0,\n true\n )\n view.setUint32(AEA_SOURCE_SAMPLE_COUNT_OFFSET, sampleCount >>> 0, true)\n return header\n }\n\n /**\n * Parse an AEA header.\n *\n * @param {Uint8Array} header\n * @returns {object} Container metadata.\n * @throws {Error} If the header is invalid\n */\n static parseHeader(header) {\n if (header.length !== AEA_HEADER_SIZE) {\n throw new Error(`Header must be ${AEA_HEADER_SIZE} bytes`)\n }\n\n for (let i = 0; i < AEA_MAGIC.length; i++) {\n if (header[i] !== AEA_MAGIC[i]) {\n throw new Error('Invalid AEA file')\n }\n }\n\n const view = new DataView(\n header.buffer,\n header.byteOffset,\n header.byteLength\n )\n const titleEnd = header.indexOf(0, AEA_TITLE_OFFSET)\n const titleLength =\n titleEnd === -1 ? AEA_TITLE_SIZE : titleEnd - AEA_TITLE_OFFSET\n const title = new TextDecoder().decode(\n header.subarray(AEA_TITLE_OFFSET, AEA_TITLE_OFFSET + titleLength)\n )\n\n return {\n title,\n frameCount: view.getUint32(AEA_FRAME_COUNT_OFFSET, true),\n channelCount: header[AEA_CHANNEL_COUNT_OFFSET],\n primingSampleCount: view.getUint32(AEA_PRIMING_SAMPLE_COUNT_OFFSET, true),\n sampleCount: view.getUint32(AEA_SOURCE_SAMPLE_COUNT_OFFSET, true),\n }\n }\n}\n","/**\n * Carta1 Audio Codec - Encoder Options\n *\n * This module provides configuration management for the ATRAC1 encoder,\n * including parameter validation and metadata for UI controls.\n */\n\n/**\n * Configuration options for the ATRAC1 encoder\n */\nclass EncoderOptions {\n /**\n * Create a new EncoderOptions instance\n * @param {Object} options - Initial option values\n */\n constructor(options = {}) {\n this.values = {\n transientThresholdLow: 1.0,\n transientThresholdMid: 1.5,\n transientThresholdHigh: 2.0,\n allocationBias: 1.0,\n fixedBlockModes: null,\n }\n\n this.metadata = {\n transientThresholdLow: {\n default: this.values.transientThresholdLow,\n name: 'Low Band Transient Threshold',\n description:\n 'Controls the transient detection threshold for the low frequency band (0-5.5kHz). Lower values make detection more sensitive, triggering short blocks more easily. Higher values require stronger transients.',\n range: [0.01, 2],\n step: 0.01,\n },\n transientThresholdMid: {\n default: this.values.transientThresholdMid,\n name: 'Mid Band Transient Threshold',\n description:\n 'Controls the transient detection threshold for the mid frequency band (5.5-11kHz). Lower values make detection more sensitive, triggering short blocks more easily. Higher values require stronger transients.',\n range: [0.01, 3],\n step: 0.01,\n },\n transientThresholdHigh: {\n default: this.values.transientThresholdHigh,\n name: 'High Band Transient Threshold',\n description:\n 'Controls the transient detection threshold for the high frequency band (11-22kHz). Lower values make detection more sensitive, triggering short blocks more easily. Higher values require stronger transients.',\n range: [0.01, 4],\n step: 0.01,\n },\n allocationBias: {\n default: this.values.allocationBias,\n name: 'Bit allocation bias',\n description:\n 'Controls how bits are distributed across the frequency spectrum during allocation. Higher values focus more bits on loud spectral components, while lower values spread bits more evenly across frequencies.',\n range: [0.0, 5.0],\n step: 0.01,\n },\n fixedBlockModes: {\n default: this.values.fixedBlockModes,\n name: 'Fixed block modes',\n description:\n 'Override transient detection and use fixed block modes. Format: [low, mid, high] where low/mid can be 0 or 2, high can be 0 or 3. When set, transient detection is skipped.',\n type: 'array',\n },\n }\n\n // Apply user-provided options\n if (options) {\n this.setOptions(options)\n }\n }\n\n /**\n * Set multiple options at once\n * @param {Object} options - Object containing option key-value pairs\n */\n setOptions(options) {\n for (const [key, value] of Object.entries(options)) {\n if (key in this.values) {\n this.setValue(key, value)\n }\n }\n }\n\n /**\n * Set a single option value with validation\n * @param {string} key - Option key\n * @param {*} value - Option value\n * @throws {Error} If key is unknown or value is out of range\n */\n setValue(key, value) {\n if (!(key in this.metadata)) {\n throw new Error(`Unknown option: ${key}`)\n }\n\n const meta = this.metadata[key]\n\n // Skip range validation for array types\n if (meta.type !== 'array') {\n const [min, max] = meta.range\n if (value < min || value > max) {\n throw new Error(\n `Value for ${key} must be between ${min} and ${max}, got ${value}`\n )\n }\n }\n\n this.values[key] = value\n }\n\n /**\n * Get the value of an option\n * @param {string} key - Option key\n * @returns {*} Option value\n * @throws {Error} If key is unknown\n */\n getValue(key) {\n if (!(key in this.values)) {\n throw new Error(`Unknown option: ${key}`)\n }\n return this.values[key]\n }\n\n get transientThresholdLow() {\n return this.values.transientThresholdLow\n }\n\n get transientThresholdMid() {\n return this.values.transientThresholdMid\n }\n\n get transientThresholdHigh() {\n return this.values.transientThresholdHigh\n }\n\n get allocationBias() {\n return this.values.allocationBias\n }\n\n get fixedBlockModes() {\n return this.values.fixedBlockModes\n }\n\n getMetadata(key) {\n return this.metadata[key]\n }\n\n getAllMetadata() {\n return { ...this.metadata }\n }\n\n reset() {\n for (const [key, meta] of Object.entries(this.metadata)) {\n this.values[key] = meta.default\n }\n }\n\n toObject() {\n return {\n values: { ...this.values },\n metadata: { ...this.metadata },\n }\n }\n}\n\nexport { EncoderOptions }\n","/**\n * Carta1 bitstream syntax operators.\n *\n * This module provides low-level bitstream packing and unpacking operations\n * for reading and writing ATRAC1 frame data with bit-level precision.\n */\n\n/**\n * Reject field widths outside the shared bitstream primitive's safe range.\n *\n * @param {number} bitCount\n * @returns {void}\n */\nfunction assertBitCount(bitCount) {\n if (!Number.isInteger(bitCount) || bitCount < 0 || bitCount > 32) {\n throw new RangeError(\n `Bit count must be an integer in 0..32, got ${bitCount}`\n )\n }\n}\n\n/**\n * Pack bits into a buffer at a specific bit position\n * @param {Uint8Array} buffer - Destination buffer\n * @param {number} bitPosition - Bit position to start writing at\n * @param {number} value - Value to pack\n * @param {number} bitCount - Number of bits to pack\n * @returns {void}\n */\nexport function packBits(buffer, bitPosition, value, bitCount) {\n assertBitCount(bitCount)\n if (bitCount === 0) return\n\n let byteIndex = Math.floor(bitPosition / 8)\n let bitOffset = bitPosition % 8\n\n const unsignedValue = Number(value) >>> 0\n\n let bitsWritten = 0\n while (bitsWritten < bitCount && byteIndex < buffer.length) {\n const bitsAvailable = 8 - bitOffset\n const bitsToWrite = Math.min(bitCount - bitsWritten, bitsAvailable)\n\n const shift = bitCount - bitsWritten - bitsToWrite\n const valueBits = (unsignedValue >>> shift) & (2 ** bitsToWrite - 1)\n\n const mask = (2 ** bitsToWrite - 1) << (bitsAvailable - bitsToWrite)\n buffer[byteIndex] =\n (buffer[byteIndex] & ~mask) | (valueBits << (bitsAvailable - bitsToWrite))\n\n bitsWritten += bitsToWrite\n byteIndex++\n bitOffset = 0\n }\n}\n\n/**\n * Unpack bits from a buffer at a specific bit position\n * @param {Uint8Array} buffer - Source buffer\n * @param {number} bitPosition - Bit position to start reading from\n * @param {number} bitCount - Number of bits to unpack\n * @returns {number} Unpacked unsigned value\n */\nexport function unpackBits(buffer, bitPosition, bitCount) {\n assertBitCount(bitCount)\n if (bitCount === 0) return 0\n\n let byteIndex = Math.floor(bitPosition / 8)\n let bitOffset = bitPosition % 8\n let value = 0\n\n for (let bitsRead = 0; bitsRead < bitCount && byteIndex < buffer.length;) {\n const bitsAvailable = 8 - bitOffset\n const bitsToRead = Math.min(bitCount - bitsRead, bitsAvailable)\n\n const mask = 2 ** bitsToRead - 1\n const bits = (buffer[byteIndex] >> (bitsAvailable - bitsToRead)) & mask\n\n value = (value * 2 ** bitsToRead + bits) >>> 0\n bitsRead += bitsToRead\n byteIndex++\n bitOffset = 0\n }\n\n return value\n}\n\n/**\n * Unpack signed bits from a buffer at a specific bit position\n * @param {Uint8Array} buffer - Source buffer\n * @param {number} bitPosition - Bit position to start reading from\n * @param {number} bitCount - Number of bits to unpack\n * @returns {number} Unpacked signed value (two's complement)\n */\nexport function unpackSignedBits(buffer, bitPosition, bitCount) {\n assertBitCount(bitCount)\n if (bitCount === 0) return 0\n const value = unpackBits(buffer, bitPosition, bitCount)\n const signBit = 2 ** (bitCount - 1)\n return value >= signBit ? value - 2 ** bitCount : value\n}\n","/**\n * Carta1 structured-frame syntax.\n *\n * Handles serialization and deserialization of ATRAC1 audio frames.\n * Provides functions for packing encoded frame data into binary format and unpacking\n * it back into structured data for processing.\n *\n * The module manages:\n * - Frame data serialization/deserialization with proper bit packing\n * - AEA file header creation and parsing\n * - Binary format compliance for ATRAC1 specification\n */\n\nimport {\n SOUND_UNIT_SIZE,\n FRAME_HEADER_BITS,\n FRAME_WORD_LENGTH_BITS,\n FRAME_SCALE_FACTOR_BITS,\n} from '../core/constants.js'\nimport { BFU_AMOUNTS, SPECS_PER_BFU, WORD_LENGTH_BITS } from '../core/tables.js'\nimport { packBits, unpackBits, unpackSignedBits } from './bitstream.js'\n\n/**\n * Serializes encoded frame data into binary format\n * @param {object} frameData - The encoded frame data to serialize\n * @returns {Uint8Array} Serialized frame data buffer\n */\nexport function serializeFrame(frameData) {\n const buffer = new Uint8Array(SOUND_UNIT_SIZE)\n const view = new DataView(buffer.buffer)\n\n // Pack header (16 bits)\n const bfuIndex = BFU_AMOUNTS.indexOf(frameData.nBfu)\n const header =\n ((2 - frameData.blockModes[0]) << 14) |\n ((2 - frameData.blockModes[1]) << 12) |\n ((3 - frameData.blockModes[2]) << 10) |\n (bfuIndex << 5)\n\n view.setUint16(0, header, false)\n let bitPosition = FRAME_HEADER_BITS\n\n // Pack word lengths (4 bits each)\n for (let i = 0; i < frameData.nBfu; i++) {\n packBits(\n buffer,\n bitPosition,\n frameData.wordLengthIndices[i],\n FRAME_WORD_LENGTH_BITS\n )\n bitPosition += FRAME_WORD_LENGTH_BITS\n }\n\n // Pack scale factors (6 bits each)\n for (let i = 0; i < frameData.nBfu; i++) {\n packBits(\n buffer,\n bitPosition,\n frameData.scaleFactorIndices[i],\n FRAME_SCALE_FACTOR_BITS\n )\n bitPosition += FRAME_SCALE_FACTOR_BITS\n }\n\n // Pack quantized coefficients\n for (let i = 0; i < frameData.nBfu; i++) {\n const bitsPerSample = WORD_LENGTH_BITS[frameData.wordLengthIndices[i]]\n if (bitsPerSample > 0) {\n const coefficients = frameData.quantizedCoefficients[i]\n for (const coefficient of coefficients) {\n const value =\n coefficient < 0 ? coefficient + (1 << bitsPerSample) : coefficient\n packBits(buffer, bitPosition, value, bitsPerSample)\n bitPosition += bitsPerSample\n }\n }\n }\n\n // Zero padding at end\n buffer[SOUND_UNIT_SIZE - 3] = 0\n buffer[SOUND_UNIT_SIZE - 2] = 0\n buffer[SOUND_UNIT_SIZE - 1] = 0\n\n return buffer\n}\n\n/**\n * Deserializes binary frame data back into structured format\n * @param {Uint8Array} buffer - Binary frame data buffer\n * @returns {object} Deserialized frame data\n * @throws {Error} If buffer size is invalid\n */\nexport function deserializeFrame(buffer) {\n if (buffer.length !== SOUND_UNIT_SIZE) {\n throw new Error(`Frame must be ${SOUND_UNIT_SIZE} bytes`)\n }\n\n const view = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength)\n\n // Unpack header\n const header = view.getUint16(0, false)\n const blockModes = [\n 2 - ((header >> 14) & 3),\n 2 - ((header >> 12) & 3),\n 3 - ((header >> 10) & 3),\n ]\n const bfuIndex = (header >> 5) & 7\n const nBfu = BFU_AMOUNTS[bfuIndex]\n\n let bitPosition = FRAME_HEADER_BITS\n\n // Unpack word lengths\n const wordLengthIndices = new Int32Array(nBfu)\n for (let i = 0; i < nBfu; i++) {\n wordLengthIndices[i] = unpackBits(\n buffer,\n bitPosition,\n FRAME_WORD_LENGTH_BITS\n )\n bitPosition += FRAME_WORD_LENGTH_BITS\n }\n\n // Unpack scale factors\n const scaleFactorIndices = new Int32Array(nBfu)\n for (let i = 0; i < nBfu; i++) {\n scaleFactorIndices[i] = unpackBits(\n buffer,\n bitPosition,\n FRAME_SCALE_FACTOR_BITS\n )\n bitPosition += FRAME_SCALE_FACTOR_BITS\n }\n\n // Unpack coefficients\n const quantizedCoefficients = []\n for (let i = 0; i < nBfu; i++) {\n const bitsPerSample = WORD_LENGTH_BITS[wordLengthIndices[i]]\n const bfuSize = SPECS_PER_BFU[i]\n const coefficients = new Int32Array(bfuSize)\n\n if (bitsPerSample > 0) {\n for (let j = 0; j < bfuSize; j++) {\n coefficients[j] = unpackSignedBits(buffer, bitPosition, bitsPerSample)\n bitPosition += bitsPerSample\n }\n }\n\n quantizedCoefficients.push(coefficients)\n }\n\n return {\n nBfu,\n scaleFactorIndices,\n wordLengthIndices,\n quantizedCoefficients,\n blockModes,\n }\n}\n","/**\n * Carta1 PCM boundary conversions.\n */\n\nimport {\n SAMPLE_RATE,\n SAMPLES_PER_FRAME,\n WAV_BITS_PER_SAMPLE,\n WAV_BYTES_PER_SAMPLE,\n WAV_DATA_OFFSET,\n WAV_HEADER_SIZE,\n WAV_PCM_MAX_NEGATIVE,\n WAV_PCM_MAX_POSITIVE,\n} from '../core/constants.js'\n\n/**\n * Write a four-character code.\n *\n * @param {DataView} output\n * @param {number} offset\n * @param {string} value\n */\nfunction writeFourCc(output, offset, value) {\n for (let i = 0; i < value.length; i++) {\n output.setUint8(offset + i, value.charCodeAt(i))\n }\n}\n\n/**\n * Join complete PCM frames into one channel.\n *\n * @param {Float32Array[]} frames\n * @returns {Float32Array}\n */\nexport function joinChannelFrames(frames) {\n const sampleCount = frames.reduce((total, frame) => total + frame.length, 0)\n const channel = new Float32Array(sampleCount)\n let offset = 0\n\n for (const frame of frames) {\n channel.set(frame, offset)\n offset += frame.length\n }\n return channel\n}\n\n/**\n * Split planar PCM buffers into complete zero-padded codec frames.\n *\n * @param {Float32Array[]} buffers\n * @param {number} [frameSize=SAMPLES_PER_FRAME]\n * @returns {Generator<Float32Array>|Generator<[Float32Array, Float32Array]>}\n * @throws {Error} If the channel count is unsupported\n */\nexport function* frameBufferToFrames(buffers, frameSize = SAMPLES_PER_FRAME) {\n if (\n !Array.isArray(buffers) ||\n (buffers.length !== 1 && buffers.length !== 2) ||\n !buffers.every(\n (buffer) =>\n buffer instanceof Float32Array && buffer.length === buffers[0].length\n ) ||\n !Number.isInteger(frameSize) ||\n frameSize < 1\n ) {\n throw new RangeError(\n 'ATRAC1 framing requires one or two equally sized Float32 channels and a positive integer frame size'\n )\n }\n if (buffers.length === 1) {\n const [left] = buffers\n for (let offset = 0; offset < left.length; offset += frameSize) {\n const frame = new Float32Array(frameSize)\n frame.set(left.subarray(offset, offset + frameSize))\n yield frame\n }\n return\n }\n\n if (buffers.length === 2) {\n const [left, right] = buffers\n const sampleCount = left.length\n for (let offset = 0; offset < sampleCount; offset += frameSize) {\n const leftFrame = new Float32Array(frameSize)\n const rightFrame = new Float32Array(frameSize)\n leftFrame.set(left.subarray(offset, offset + frameSize))\n rightFrame.set(right.subarray(offset, offset + frameSize))\n yield [leftFrame, rightFrame]\n }\n return\n }\n}\n\n/**\n * Convert one normalized sample to signed PCM16.\n *\n * @param {number} sample\n * @returns {number}\n */\nexport function floatToPcm16(sample) {\n const clipped = Math.max(-1, Math.min(1, sample))\n return clipped < 0\n ? clipped * WAV_PCM_MAX_NEGATIVE\n : clipped * WAV_PCM_MAX_POSITIVE\n}\n\n/**\n * Create a PCM WAVE header.\n *\n * @param {Object} options\n * @param {number} options.sampleCount\n * @param {number} options.sampleRate\n * @param {number} options.channels\n * @returns {Uint8Array}\n */\nexport function createPcmWaveHeader({ sampleCount, sampleRate, channels }) {\n const byteRate = sampleRate * channels * WAV_BYTES_PER_SAMPLE\n const blockAlign = channels * WAV_BYTES_PER_SAMPLE\n const dataSize = sampleCount * blockAlign\n const output = new Uint8Array(WAV_HEADER_SIZE)\n const view = new DataView(output.buffer)\n\n writeFourCc(view, 0, 'RIFF')\n view.setUint32(4, WAV_DATA_OFFSET + dataSize, true)\n writeFourCc(view, 8, 'WAVE')\n writeFourCc(view, 12, 'fmt ')\n view.setUint32(16, 16, true)\n view.setUint16(20, 1, true)\n view.setUint16(22, channels, true)\n view.setUint32(24, sampleRate, true)\n view.setUint32(28, byteRate, true)\n view.setUint16(32, blockAlign, true)\n view.setUint16(34, WAV_BITS_PER_SAMPLE, true)\n writeFourCc(view, 36, 'data')\n view.setUint32(40, dataSize, true)\n return output\n}\n\n/**\n * Interleave planar normalized channels as PCM16.\n *\n * @param {Float32Array[]} channels\n * @returns {Uint8Array}\n */\nexport function interleavePcm16(channels) {\n if (\n !Array.isArray(channels) ||\n channels.length < 1 ||\n !channels.every(\n (channel) =>\n channel instanceof Float32Array && channel.length === channels[0].length\n )\n ) {\n throw new RangeError('PCM must contain equally sized Float32 channels')\n }\n const sampleCount = channels[0].length\n const output = new Uint8Array(\n sampleCount * channels.length * WAV_BYTES_PER_SAMPLE\n )\n const view = new DataView(output.buffer)\n let offset = 0\n\n for (let sample = 0; sample < sampleCount; sample++) {\n for (const channel of channels) {\n view.setInt16(offset, floatToPcm16(channel[sample]), true)\n offset += WAV_BYTES_PER_SAMPLE\n }\n }\n return output\n}\n\n/**\n * Create a complete PCM WAVE byte image from planar channels.\n *\n * @param {Float32Array[]} channels\n * @param {Object} [options]\n * @param {number} [options.sampleRate=SAMPLE_RATE]\n * @returns {Uint8Array}\n */\nexport function createPcmWave(channels, options = {}) {\n const { sampleRate = SAMPLE_RATE } = options\n const pcm = interleavePcm16(channels)\n const sampleCount = channels[0].length\n const header = createPcmWaveHeader({\n sampleCount,\n sampleRate,\n channels: channels.length,\n })\n const output = new Uint8Array(header.length + pcm.length)\n output.set(header)\n output.set(pcm, header.length)\n return output\n}\n","/**\n * Carta1 Audio Codec - Spectrum Quantization\n *\n * This module handles the quantization and dequantization of MDCT frequency coefficients\n * for the Carta1 audio codec. It provides functions to convert floating-point frequency\n * domain data into integer representations suitable for bitstream encoding.\n *\n * The quantization process uses configurable scale factors to maintain audio quality\n * while achieving the target compression ratio. The module supports both uniform\n * and non-uniform quantization schemes based on perceptual importance.\n */\n\nimport { QUANTIZATION_SIGN_BIT_SHIFT } from '../core/constants.js'\nimport { SCALE_FACTORS } from '../core/tables.js'\n\n/**\n * Quantize coefficients.\n * @param {Float32Array} coefficients\n * @param {number} scaleFactorIndex\n * @param {number} bitsPerSample\n * @returns {Int32Array} out\n */\nexport function quantize(coefficients, scaleFactorIndex, bitsPerSample) {\n const length = coefficients.length\n const out = new Int32Array(length)\n if (bitsPerSample === 0 || scaleFactorIndex === 0) {\n out.fill(0, 0, length)\n return out\n }\n\n const scaleFactor = SCALE_FACTORS[scaleFactorIndex]\n const quantRange = (1 << (bitsPerSample - QUANTIZATION_SIGN_BIT_SHIFT)) - 1\n const normFactor = quantRange / scaleFactor\n\n const hi = quantRange\n const lo = -quantRange\n\n for (let i = 0; i < length; i++) {\n const x = coefficients[i] * normFactor\n const y = (x + (x >= 0 ? 0.5 : -0.5)) | 0\n out[i] = y > hi ? hi : y < lo ? lo : y\n }\n\n return out\n}\n\n/**\n * Dequantize coefficients.\n * @param {Int32Array} quantized\n * @param {number} scaleFactorIndex\n * @param {number} bitsPerSample\n * @returns {Float32Array}\n */\nexport function dequantize(quantized, scaleFactorIndex, bitsPerSample) {\n if (bitsPerSample === 0 || scaleFactorIndex === 0) {\n return new Float32Array(quantized.length)\n }\n\n const scaleFactor = SCALE_FACTORS[scaleFactorIndex]\n const quantRange = (1 << (bitsPerSample - QUANTIZATION_SIGN_BIT_SHIFT)) - 1\n\n const deq = new Float32Array(quantized.length)\n for (let i = 0; i < quantized.length; i++) {\n deq[i] = (quantized[i] * scaleFactor) / quantRange\n }\n return deq\n}\n","/**\n * Carta1 dequantization stage.\n */\n\nimport {\n BFU_BAND_BOUNDARIES,\n BFU_START_LONG,\n BFU_START_SHORT,\n WORD_LENGTH_BITS,\n} from './core/tables.js'\nimport { dequantize as dequantizeCoefficient } from './quantization/spectrum.js'\n\n/**\n * Reconstruct the continuous ATRAC1 spectrum.\n *\n * @returns {Function}\n */\nexport function dequantize() {\n /**\n * @param {object} frameData\n * @returns {object}\n */\n return (frameData) => {\n const coefficients = new Float32Array(512)\n const {\n nBfu,\n scaleFactorIndices,\n wordLengthIndices,\n quantizedCoefficients,\n blockModes,\n } = frameData\n\n for (let bfu = 0; bfu < nBfu; bfu++) {\n const bitsPerSample = WORD_LENGTH_BITS[wordLengthIndices[bfu]]\n let band = 0\n if (bfu >= BFU_BAND_BOUNDARIES[0]) band = 1\n if (bfu >= BFU_BAND_BOUNDARIES[1]) band = 2\n\n const position =\n blockModes[band] === 0 ? BFU_START_LONG[bfu] : BFU_START_SHORT[bfu]\n\n if (bitsPerSample > 0) {\n const dequantized = dequantizeCoefficient(\n quantizedCoefficients[bfu],\n scaleFactorIndices[bfu],\n bitsPerSample\n )\n coefficients.set(dequantized, position)\n }\n }\n\n return { coefficients, blockModes }\n }\n}\n","/**\n * Carta1 stream state and reusable scratch.\n */\n\nimport { QMF_DELAY, QMF_HIGH_BAND_DELAY } from './core/constants.js'\n\n/**\n * Values with meaning across chronological frames.\n */\nclass History {\n constructor() {\n this.qmfDelays = {\n lowBand: new Float32Array(QMF_DELAY),\n midBand: new Float32Array(QMF_DELAY),\n highBand: new Float32Array(QMF_HIGH_BAND_DELAY),\n }\n\n this.transientDetection = [\n new Float32Array(64),\n new Float32Array(64),\n new Float32Array(128),\n ]\n\n this.mdctOverlap = [\n new Float32Array(32),\n new Float32Array(32),\n new Float32Array(32),\n ]\n\n this.imdctOverlap = [\n new Float32Array(256),\n new Float32Array(256),\n new Float32Array(512),\n ]\n }\n}\n\n/**\n * Reusable storage with no meaning between operations.\n */\nclass Scratch {\n constructor() {\n this.transformBuffers = {\n 64: new Float32Array(64),\n 128: new Float32Array(128),\n 256: new Float32Array(256),\n 512: new Float32Array(512),\n }\n\n this.qmfWorkBuffers = {\n delay: {\n 128: new Float32Array(QMF_DELAY + 128),\n 256: new Float32Array(QMF_DELAY + 256),\n 512: new Float32Array(QMF_DELAY + 512),\n },\n highBandDelay: {\n 128: new Float32Array(QMF_HIGH_BAND_DELAY + 128),\n 256: new Float32Array(QMF_HIGH_BAND_DELAY + 256),\n },\n }\n\n this.mdctBuffers = {\n 16: {\n real: new Float32Array(16),\n imag: new Float32Array(16),\n },\n 64: {\n real: new Float32Array(64),\n imag: new Float32Array(64),\n },\n 128: {\n real: new Float32Array(128),\n imag: new Float32Array(128),\n },\n }\n\n this.reversalBuffers = {\n 32: new Float32Array(32),\n 128: new Float32Array(128),\n 256: new Float32Array(256),\n }\n }\n}\n\n/**\n * Own one chronological stream's history and reusable storage.\n */\nexport class BufferPool {\n constructor() {\n Object.assign(this, new History(), new Scratch())\n }\n}\n","/**\n * Carta1 Audio Codec - Utilities\n *\n * This module provides common utility functions for the ATRAC1 codec.\n */\n\n/**\n * Throws an error with the given message\n * @param {string} msg - Error message\n * @throws {Error} Always throws an error with the provided message\n */\nexport function throwError(msg) {\n throw new Error(msg)\n}\n\n/**\n * Compose stateful stage factories once and return the reusable frame path.\n *\n * @param {*} context Shared stage ownership and persistent state.\n * @param {...Function} stages Ordered stage factories.\n * @returns {Function} Reusable composed frame operation.\n */\nexport function pipe(context, ...stages) {\n const operations = stages.map((stage) => stage(context))\n return (input) =>\n operations.reduce((value, operation) => operation(value), input)\n}\n","/**\n * Carta1 Fast Fourier Transform operator.\n *\n * This module implements a radix-2 Cooley-Tukey FFT algorithm for frequency domain\n * analysis used in psychoacoustic modeling and transient detection.\n */\n\nexport class FFT {\n /**\n * Perform in-place FFT on complex data\n * @param {Float32Array} real - Real part of input/output data\n * @param {Float32Array} imag - Imaginary part of input/output data\n */\n static fft(real, imag) {\n const size = real.length\n if (size === 1) return\n\n const bits = Math.log2(size)\n\n // Bit reversal\n for (let i = 0; i < size; i++) {\n let reversed = 0\n let temp = i\n for (let b = 0; b < bits; b++) {\n reversed = (reversed << 1) | (temp & 1)\n temp >>= 1\n }\n if (reversed > i) {\n ;[real[i], real[reversed]] = [real[reversed], real[i]]\n ;[imag[i], imag[reversed]] = [imag[reversed], imag[i]]\n }\n }\n\n // Cooley-Tukey decimation-in-time\n for (let stride = 2; stride <= size; stride <<= 1) {\n const halfStride = stride >> 1\n const angle = (-2 * Math.PI) / stride\n const wReal = Math.cos(angle)\n const wImag = Math.sin(angle)\n\n for (let start = 0; start < size; start += stride) {\n let twiddleReal = 1\n let twiddleImag = 0\n\n for (let k = 0; k < halfStride; k++) {\n const evenIndex = start + k\n const oddIndex = evenIndex + halfStride\n\n const evenReal = real[evenIndex]\n const evenImag = imag[evenIndex]\n const oddReal = real[oddIndex]\n const oddImag = imag[oddIndex]\n\n const tReal = oddReal * twiddleReal - oddImag * twiddleImag\n const tImag = oddReal * twiddleImag + oddImag * twiddleReal\n\n real[evenIndex] = evenReal + tReal\n imag[evenIndex] = evenImag + tImag\n real[oddIndex] = evenReal - tReal\n imag[oddIndex] = evenImag - tImag\n\n const nextReal = twiddleReal * wReal - twiddleImag * wImag\n twiddleImag = twiddleReal * wImag + twiddleImag * wReal\n twiddleReal = nextReal\n }\n }\n }\n }\n}\n","/**\n * Carta1 spectrum signal operators.\n *\n * This module implements forward and inverse MDCT transforms for the ATRAC1 codec.\n * The MDCT provides time-frequency analysis with perfect reconstruction and\n * 50% overlap between adjacent blocks to avoid blocking artifacts.\n */\n\nimport { FFT } from './fft.js'\nimport {\n MDCT_SIZE_SHORT,\n MDCT_SIZE_MID,\n MDCT_SIZE_LONG,\n} from '../core/constants.js'\nimport { throwError } from '../utils.js'\n\n/**\n * Base class for MDCT and IMDCT transforms\n */\nclass MDCTBase {\n constructor(size, scale) {\n this.size = size\n this.halfSize = size >> 1\n this.quarterSize = size >> 2\n this.fftSize = this.halfSize >> 1\n\n const alpha = (2.0 * Math.PI) / (8.0 * size)\n const omega = (2.0 * Math.PI) / size\n const scaleRoot = Math.sqrt(scale / size)\n\n this.sinCosTable = new Float64Array(this.halfSize)\n for (let i = 0; i < this.quarterSize; i++) {\n const angle = omega * i + alpha\n this.sinCosTable[i * 2] = scaleRoot * Math.cos(angle)\n this.sinCosTable[i * 2 + 1] = scaleRoot * Math.sin(angle)\n }\n }\n}\n\n/**\n * Forward MDCT transform\n */\nexport class MDCT extends MDCTBase {\n constructor(size, scale) {\n super(size, scale)\n }\n\n /**\n * Perform forward MDCT transform\n * @param {Float32Array} input - Time-domain input samples\n * @param {Object} mdctBuffers - Optional work buffers for FFT\n * @returns {Float32Array} Frequency-domain MDCT coefficients\n */\n transform(input, mdctBuffers = null) {\n const buffers =\n mdctBuffers?.[this.fftSize] ??\n throwError(`MDCT.transform: mdctBuffers[${this.fftSize}] is required`)\n const real =\n buffers?.real ??\n throwError(\n `MDCT.transform: mdctBuffers[${this.fftSize}].real is required`\n )\n const imag =\n buffers?.imag ??\n throwError(\n `MDCT.transform: mdctBuffers[${this.fftSize}].imag is required`\n )\n\n const n4 = this.quarterSize\n const n34 = 3 * n4\n\n real.fill(0)\n imag.fill(0)\n\n // Pre-FFT butterfly\n for (let i = 0; i < n4; i += 2) {\n const i1 = n34 - 1 - i\n const i2 = n34 + i\n const i3 = n4 + i\n const i4 = n4 - 1 - i\n\n const r = input[i1] + input[i2]\n const im = input[i3] - input[i4]\n const c = this.sinCosTable[i]\n const s = this.sinCosTable[i + 1]\n\n real[i >> 1] = r * c + im * s\n imag[i >> 1] = im * c - r * s\n }\n\n for (let i = n4; i < this.halfSize; i += 2) {\n const idx = i >> 1\n const i1 = n34 - 1 - i\n const i2 = i - n4\n const i3 = n4 + i\n const i4 = 5 * n4 - 1 - i\n\n const r = input[i1] - input[i2]\n const im = input[i3] + input[i4]\n const c = this.sinCosTable[i]\n const s = this.sinCosTable[i + 1]\n\n real[idx] = r * c + im * s\n imag[idx] = im * c - r * s\n }\n\n FFT.fft(real, imag)\n\n // Post-FFT processing\n const output = new Float32Array(this.halfSize)\n for (let i = 0; i < this.fftSize; i++) {\n const c = this.sinCosTable[i * 2]\n const s = this.sinCosTable[i * 2 + 1]\n const re = real[i]\n const im = imag[i]\n\n output[i * 2] = -re * c - im * s\n output[this.halfSize - 1 - i * 2] = -re * s + im * c\n }\n\n return output\n }\n}\n\n/**\n * Inverse MDCT transform\n */\nexport class IMDCT extends MDCTBase {\n constructor(size, scale = null) {\n super(size, scale || size)\n }\n\n /**\n * Perform inverse MDCT transform\n * @param {Float32Array} input - Frequency-domain MDCT coefficients\n * @param {Object} mdctBuffers - Optional work buffers for FFT\n * @returns {Float32Array} Time-domain output samples\n */\n transform(input, mdctBuffers = null) {\n const buffers =\n mdctBuffers?.[this.fftSize] ??\n throwError(`IMDCT.transform: mdctBuffers[${this.fftSize}] is required`)\n const real =\n buffers?.real ??\n throwError(\n `IMDCT.transform: mdctBuffers[${this.fftSize}].real is required`\n )\n const imag =\n buffers?.imag ??\n throwError(\n `IMDCT.transform: mdctBuffers[${this.fftSize}].imag is required`\n )\n\n const n4 = this.quarterSize\n const n34 = 3 * n4\n\n real.fill(0)\n imag.fill(0)\n\n // Pre-FFT processing\n for (let i = 0; i < this.fftSize; i++) {\n const i2 = i * 2\n const r = -input[i2]\n const im = -input[this.halfSize - 1 - i2]\n const c = this.sinCosTable[i2]\n const s = this.sinCosTable[i2 + 1]\n\n real[i] = im * s + r * c\n imag[i] = im * c - r * s\n }\n\n FFT.fft(real, imag)\n\n // Post-FFT butterfly\n const output = new Float32Array(this.size)\n\n for (let i = 0; i < this.fftSize / 2; i++) {\n const i2 = i * 2\n const c = this.sinCosTable[i2]\n const s = this.sinCosTable[i2 + 1]\n const re = real[i]\n const im = imag[i]\n\n const r1 = re * c + im * s\n const i1 = re * s - im * c\n\n output[n34 - 1 - i2] = r1\n output[n34 + i2] = r1\n output[n4 + i2] = i1\n output[n4 - 1 - i2] = -i1\n }\n\n for (let i = this.fftSize / 2; i < this.fftSize; i++) {\n const idx = (i - this.fftSize / 2) * 2 + n4\n const i2 = i * 2\n const c = this.sinCosTable[i2]\n const s = this.sinCosTable[i2 + 1]\n const re = real[i]\n const im = imag[i]\n\n const r1 = re * c + im * s\n const i1 = re * s - im * c\n\n output[n34 - 1 - idx] = r1\n output[idx - n4] = -r1\n output[n4 + idx] = i1\n output[5 * n4 - 1 - idx] = i1\n }\n\n return output\n }\n}\n\n// Pre-instantiated transforms\nexport const mdct64 = new MDCT(MDCT_SIZE_SHORT, 0.5)\nexport const mdct256 = new MDCT(MDCT_SIZE_MID, 0.5)\nexport const mdct512 = new MDCT(MDCT_SIZE_LONG, 1.0)\n\nexport const imdct64 = new IMDCT(MDCT_SIZE_SHORT, MDCT_SIZE_SHORT * 8)\nexport const imdct256 = new IMDCT(MDCT_SIZE_MID, MDCT_SIZE_MID * 8)\nexport const imdct512 = new IMDCT(MDCT_SIZE_LONG, MDCT_SIZE_LONG * 4)\n\n/**\n * Perform overlap-add operation for MDCT reconstruction\n * @param {Float32Array} prev - Previous block samples\n * @param {Float32Array} curr - Current block samples\n * @param {Float32Array} window - Window function coefficients\n * @returns {Float32Array} Overlap-added output samples\n */\nexport function overlapAdd(prev, curr, window) {\n const size = prev.length\n const output = new Float32Array(size * 2)\n\n for (let i = 0; i < size; i++) {\n const w1 = window[i]\n const w2 = window[2 * size - 1 - i]\n const p = prev[i]\n const c = curr[size - 1 - i]\n\n output[i] = p * w2 - c * w1\n output[2 * size - 1 - i] = p * w1 + c * w2\n }\n\n return output\n}\n\n/**\n * Reverse spectral order for ATRAC1 mid and high bands.\n *\n * @param {Float32Array} spectrum\n * @param {Object} reversalBuffers\n * @returns {Float32Array}\n */\nexport function reverseSpectrum(spectrum, reversalBuffers) {\n const reversed = reversalBuffers[spectrum.length]\n for (let i = 0; i < spectrum.length; i++) {\n reversed[i] = spectrum[spectrum.length - 1 - i]\n }\n return reversed\n}\n","/**\n * Carta1 spectral synthesis application.\n */\n\nimport {\n MDCT_SHORT_BLOCK_SIZE,\n MDCT_SIZE_LONG,\n MDCT_TAIL_WINDOW_SIZE,\n} from '../core/constants.js'\nimport { extractBandCoefficients } from '../core/geometry.js'\nimport { MDCT_BAND_CONFIGS, WINDOW_SHORT } from '../core/tables.js'\nimport {\n imdct64,\n imdct256,\n imdct512,\n overlapAdd,\n reverseSpectrum,\n} from '../signal/spectrum.js'\nimport { throwError } from '../utils.js'\n\n/**\n * Synthesize time-domain bands from the ATRAC1 spectrum.\n *\n * @param {object} context\n * @returns {Function}\n * @throws {Error} If the buffer pool is missing\n */\nexport function synthesizeSpectrum(context) {\n const bufferPool =\n context?.bufferPool ??\n throwError('synthesizeSpectrum: bufferPool is required')\n const overlapBuffers = bufferPool.imdctOverlap\n const transformFunctions = [imdct256, imdct256, imdct512]\n\n /**\n * @param {Float32Array} coefficients\n * @param {number} bandIndex\n * @param {number} blockMode\n * @param {Float32Array} overlapBuffer\n * @param {Object} config\n * @returns {Float32Array}\n */\n function transformBand(\n coefficients,\n bandIndex,\n blockMode,\n overlapBuffer,\n config\n ) {\n if (blockMode === 0) {\n return inverseLongBlock(\n coefficients,\n bandIndex,\n overlapBuffer,\n config,\n transformFunctions[bandIndex]\n )\n }\n\n return inverseShortBlocks(coefficients, bandIndex, overlapBuffer, config)\n }\n\n /**\n * @param {Float32Array} coefficients\n * @param {number} bandIndex\n * @param {Float32Array} overlapBuffer\n * @param {Object} config\n * @param {Object} transformFunction\n * @returns {Float32Array}\n */\n function inverseLongBlock(\n coefficients,\n bandIndex,\n overlapBuffer,\n config,\n transformFunction\n ) {\n let blockSpectrum = coefficients\n if (bandIndex > 0) {\n blockSpectrum = reverseSpectrum(coefficients, bufferPool.reversalBuffers)\n }\n\n const inverse = transformFunction.transform(\n blockSpectrum,\n bufferPool.mdctBuffers\n )\n const inverseStart = inverse.length / 4\n const inverseBuffer = bufferPool.transformBuffers[MDCT_SIZE_LONG]\n inverseBuffer.fill(0)\n\n for (let i = 0; i < config.size; i++) {\n inverseBuffer[i] = inverse[inverseStart + i]\n }\n\n const previous = overlapBuffer.slice(\n config.size * 2 - MDCT_TAIL_WINDOW_SIZE,\n config.size * 2\n )\n const overlap = overlapAdd(\n previous.slice(0, MDCT_TAIL_WINDOW_SIZE),\n inverseBuffer.slice(0, MDCT_TAIL_WINDOW_SIZE),\n WINDOW_SHORT\n )\n overlapBuffer.set(overlap, 0)\n\n for (let i = 0; i < MDCT_TAIL_WINDOW_SIZE; i++) {\n previous[i] = inverseBuffer[MDCT_TAIL_WINDOW_SIZE + i]\n }\n\n const copyLength = bandIndex === 2 ? 240 : 112\n for (let i = 0; i < copyLength; i++) {\n overlapBuffer[32 + i] = inverseBuffer[MDCT_TAIL_WINDOW_SIZE + i]\n }\n\n for (let i = 0; i < MDCT_TAIL_WINDOW_SIZE; i++) {\n overlapBuffer[config.size * 2 - MDCT_TAIL_WINDOW_SIZE + i] =\n inverseBuffer[config.size - MDCT_TAIL_WINDOW_SIZE + i]\n }\n\n return overlapBuffer.slice(0, config.size)\n }\n\n /**\n * @param {Float32Array} coefficients\n * @param {number} bandIndex\n * @param {Float32Array} overlapBuffer\n * @param {Object} config\n * @returns {Float32Array}\n */\n function inverseShortBlocks(coefficients, bandIndex, overlapBuffer, config) {\n const numBlocks = 1 << (config.size === 256 ? 3 : 2)\n const inverseBuffer = bufferPool.transformBuffers[MDCT_SIZE_LONG]\n inverseBuffer.fill(0)\n\n const previous = overlapBuffer.slice(\n config.size * 2 - MDCT_TAIL_WINDOW_SIZE,\n config.size * 2\n )\n let start = 0\n let position = 0\n\n for (let block = 0; block < numBlocks; block++) {\n let blockSpectrum = coefficients.slice(\n position,\n position + MDCT_SHORT_BLOCK_SIZE\n )\n if (bandIndex > 0) {\n blockSpectrum = reverseSpectrum(\n blockSpectrum,\n bufferPool.reversalBuffers\n )\n }\n\n const inverse = imdct64.transform(blockSpectrum, bufferPool.mdctBuffers)\n const inverseStart = inverse.length / 4\n for (let i = 0; i < MDCT_SHORT_BLOCK_SIZE; i++) {\n inverseBuffer[start + i] = inverse[inverseStart + i]\n }\n\n const overlap = overlapAdd(\n previous.slice(0, MDCT_TAIL_WINDOW_SIZE),\n inverseBuffer.slice(start, start + MDCT_TAIL_WINDOW_SIZE),\n WINDOW_SHORT\n )\n overlapBuffer.set(overlap, start)\n\n for (let i = 0; i < MDCT_TAIL_WINDOW_SIZE; i++) {\n previous[i] = inverseBuffer[start + MDCT_TAIL_WINDOW_SIZE + i]\n }\n\n start += MDCT_SHORT_BLOCK_SIZE\n position += MDCT_SHORT_BLOCK_SIZE\n }\n\n for (let i = 0; i < MDCT_TAIL_WINDOW_SIZE; i++) {\n overlapBuffer[config.size * 2 - MDCT_TAIL_WINDOW_SIZE + i] =\n inverseBuffer[config.size - MDCT_TAIL_WINDOW_SIZE + i]\n }\n\n return overlapBuffer.slice(0, config.size)\n }\n\n /**\n * @param {object} input\n * @returns {Array<Float32Array>}\n */\n return (input) => {\n const { coefficients, blockModes } = input\n\n return MDCT_BAND_CONFIGS.map((config, bandIndex) => {\n const bandCoefficients = extractBandCoefficients(coefficients, bandIndex)\n return transformBand(\n bandCoefficients,\n bandIndex,\n blockModes[bandIndex],\n overlapBuffers[bandIndex],\n config\n )\n })\n }\n}\n","/**\n * Stable ATRAC1 spectral geometry.\n */\n\n/**\n * Calculate a band's offset in the 512-coefficient spectrum.\n *\n * @param {number} bandIndex\n * @returns {number}\n */\nexport function calculateBandOffset(bandIndex) {\n return bandIndex === 0 ? 0 : bandIndex === 1 ? 128 : 256\n}\n\n/**\n * Extract one band from the full coefficient spectrum.\n *\n * @param {Float32Array} coefficients\n * @param {number} bandIndex\n * @returns {Float32Array}\n */\nexport function extractBandCoefficients(coefficients, bandIndex) {\n const offsets = [0, 128, 256, 512]\n return coefficients.subarray(offsets[bandIndex], offsets[bandIndex + 1])\n}\n","/**\n * Carta1 Audio Codec - Quadrature Mirror Filter\n *\n * This module implements QMF analysis and synthesis for subband decomposition\n * in the ATRAC1 codec. The QMF splits the audio signal into multiple frequency\n * bands for independent processing and coding.\n */\n\nimport { QMF_DELAY } from '../core/constants.js'\nimport { QMF_EVEN, QMF_ODD } from '../core/tables.js'\nimport { throwError } from '../utils.js'\n\n/**\n * Perform QMF analysis filtering to split input into low and high frequency bands\n * @param {Float32Array} input - Input audio samples\n * @param {Float32Array} delayLine - QMF delay line state\n * @param {Object} qmfWorkBuffers - Optional work buffers for processing\n * @returns {Object} Object containing lowBand, highBand, and newDelay\n */\nexport function analyzeQmfPair(input, delayLine, qmfWorkBuffers = null) {\n const inputLength = input.length\n const outputLength = inputLength >> 1\n\n const workBuffer =\n qmfWorkBuffers?.delay?.[inputLength] ??\n throwError(\n `analyzeQmfPair: qmfWorkBuffers.delay[${inputLength}] is required`\n )\n workBuffer.set(delayLine)\n workBuffer.set(input, delayLine.length)\n\n const lowBand = new Float32Array(outputLength)\n const highBand = new Float32Array(outputLength)\n\n for (let i = 0; i < outputLength; i++) {\n let evenSum = 0\n let oddSum = 0\n const offset = i * 2\n\n // Unrolled convolution\n for (let j = 0; j < 24; j++) {\n evenSum += workBuffer[offset + 47 - j * 2] * QMF_EVEN[j]\n oddSum += workBuffer[offset + 46 - j * 2] * QMF_ODD[j]\n }\n\n lowBand[i] = evenSum + oddSum\n highBand[i] = evenSum - oddSum\n }\n\n // Update delay line\n const newDelay = workBuffer.slice(-QMF_DELAY)\n return { lowBand, highBand, newDelay }\n}\n\n/**\n * Perform QMF synthesis filtering to reconstruct audio from low and high frequency bands\n * @param {Float32Array} lowBand - Low frequency band samples\n * @param {Float32Array} highBand - High frequency band samples\n * @param {Float32Array} delayLine - QMF delay line state\n * @param {Object} qmfWorkBuffers - Optional work buffers for processing\n * @returns {Object} Object containing output and newDelay\n */\nexport function synthesizeQmfPair(\n lowBand,\n highBand,\n delayLine,\n qmfWorkBuffers = null\n) {\n const subbandLength = lowBand.length\n const outputLength = subbandLength * 2\n\n const workBuffer =\n qmfWorkBuffers?.delay?.[outputLength] ??\n throwError(\n `synthesizeQmfPair: qmfWorkBuffers.delay[${outputLength}] is required`\n )\n workBuffer.set(delayLine)\n\n // Upsample and merge\n for (let i = 0; i < subbandLength; i++) {\n const low = lowBand[i]\n const high = highBand[i]\n const offset = QMF_DELAY + i * 2\n workBuffer[offset] = 0.5 * (low + high)\n workBuffer[offset + 1] = 0.5 * (low - high)\n }\n\n const output = new Float32Array(outputLength)\n\n // Convolution\n for (let i = 0; i < subbandLength; i++) {\n const offset = i * 2\n let sample0 = 0\n let sample1 = 0\n\n for (let j = 0; j < 24; j++) {\n const idx = offset + j * 2\n sample0 += workBuffer[idx] * QMF_EVEN[j]\n sample1 += workBuffer[idx + 1] * QMF_ODD[j]\n }\n\n output[i * 2] = sample1\n output[i * 2 + 1] = sample0\n }\n\n const newDelay = workBuffer.slice(-QMF_DELAY)\n return { output, newDelay }\n}\n","/**\n * Carta1 PCM synthesis application.\n */\n\nimport { synthesizeQmfPair } from '../signal/bands.js'\nimport { throwError } from '../utils.js'\n\n/**\n * Synthesize full-spectrum PCM from frequency bands.\n *\n * @param {object} context\n * @returns {Function}\n * @throws {Error} If the buffer pool is missing\n */\nexport function synthesizePcm(context) {\n const bufferPool =\n context?.bufferPool ?? throwError('synthesizePcm: bufferPool is required')\n const delays = bufferPool.qmfDelays\n\n /**\n * @param {Array<Float32Array>} bands\n * @returns {Float32Array}\n */\n return (bands) => {\n const delayedHigh = bufferPool.qmfWorkBuffers.highBandDelay[bands[2].length]\n delayedHigh.set(delays.highBand)\n delayedHigh.set(bands[2], delays.highBand.length)\n\n const highBand = delayedHigh.slice(0, bands[0].length * 2)\n delays.highBand = delayedHigh.slice(bands[0].length * 2)\n\n const stage2 = synthesizeQmfPair(\n bands[0],\n bands[1],\n delays.midBand,\n bufferPool.qmfWorkBuffers\n )\n delays.midBand = stage2.newDelay\n\n const stage1 = synthesizeQmfPair(\n stage2.output,\n highBand,\n delays.lowBand,\n bufferPool.qmfWorkBuffers\n )\n delays.lowBand = stage1.newDelay\n\n return stage1.output\n }\n}\n","/**\n * Carta1 synthesis stage.\n */\n\nimport { pipe } from '../utils.js'\nimport { synthesizeSpectrum } from './bands.js'\nimport { synthesizePcm } from './pcm.js'\n\n/**\n * Synthesize PCM from the dequantized ATRAC1 spectrum.\n *\n * @param {object} context\n * @returns {Function}\n */\nexport function synthesize(context) {\n return pipe(context, synthesizeSpectrum, synthesizePcm)\n}\n","/**\n * Carta1 Audio Codec - Decoding Pipeline\n *\n * The frame pipeline reads as dequantization, then synthesis. Byte unpacking\n * remains the responsibility of deserializeFrame().\n */\n\nimport { dequantize } from '../dequantization.js'\nimport { BufferPool } from '../state.js'\nimport { synthesize } from '../synthesis/stage.js'\nimport { pipe } from '../utils.js'\n\n/**\n * Create an ATRAC1 decoder.\n *\n * @param {BufferPool} [bufferPool=new BufferPool()]\n * @returns {Function}\n */\nexport function decode(bufferPool = new BufferPool()) {\n const context = { bufferPool }\n return pipe(context, dequantize, synthesize)\n}\n","/**\n * Carta1 allocation-source preparation.\n */\n\nimport {\n BFU_BAND_BOUNDARIES,\n BFU_START_LONG,\n BFU_START_SHORT,\n SPECS_PER_BFU,\n} from '../core/tables.js'\n\n/**\n * Group spectral coefficients into block floating units.\n *\n * @param {Float32Array} coefficients\n * @param {Array<number>} blockModes\n * @returns {object} Grouped bit-frequency units.\n */\nexport function groupIntoBFUs(coefficients, blockModes) {\n const bfuData = []\n const bfuSizes = []\n let coeffIndex = 0\n let bfuIndex = 0\n\n for (let band = 0; band < 3; band++) {\n const bandStart = coeffIndex\n const bandSize = band === 2 ? 256 : 128\n const bandEnd = band < 2 ? BFU_BAND_BOUNDARIES[band] : SPECS_PER_BFU.length\n const startPositions =\n blockModes[band] === 0 ? BFU_START_LONG : BFU_START_SHORT\n\n while (bfuIndex < bandEnd) {\n const size = SPECS_PER_BFU[bfuIndex]\n const startPos = startPositions[bfuIndex] - bandStart\n const endPos = startPos + size\n const bfu = new Float32Array(size)\n\n if (startPos >= 0 && endPos <= bandSize) {\n bfu.set(coefficients.subarray(bandStart + startPos, bandStart + endPos))\n } else if (startPos < bandSize && endPos > 0) {\n const srcStart = Math.max(0, startPos)\n const srcEnd = Math.min(bandSize, endPos)\n bfu.set(\n coefficients.subarray(bandStart + srcStart, bandStart + srcEnd),\n Math.max(0, -startPos)\n )\n }\n\n bfuData.push(bfu)\n bfuSizes.push(size)\n bfuIndex++\n }\n\n coeffIndex += bandSize\n }\n\n return { bfuData, bfuSizes, bfuCount: bfuIndex }\n}\n\n/**\n * Prepare the spectrum as an allocation source.\n *\n * @param {Float32Array} coefficients\n * @param {Array<number>} blockModes\n * @returns {object} Allocation source.\n */\nexport function prepare(coefficients, blockModes) {\n return groupIntoBFUs(coefficients, blockModes)\n}\n","/**\n * Carta1 Audio Codec - Bit Allocation Module\n *\n * This module implements the bit allocation system for the Carta1 audio codec,\n * responsible for distributing available bits across frequency bands to minimize\n * perceptual distortion while maintaining the target bitrate.\n *\n * The module uses Rate-Distortion Optimization (RDO) by searching over a\n * predefined set of valid Band Frequency Unit (BFU) counts. For each count,\n * it performs a greedy bit distribution to find the best allocation. This\n * approach optimally trades off the cost of encoding more frequency bands\n * (metadata overhead) against the benefit of reducing truncation distortion.\n *\n * Key components:\n * - RDO search over valid BFU counts to select the optimal number of bands.\n * - Greedy bit allocation for a fixed BFU count using a max-heap.\n * - Exponential distortion modeling based on scale factors.\n * - Support for variable word lengths per BFU.\n *\n * The algorithm ensures that the codec dynamically adapts the encoded bandwidth\n * to best match the signal characteristics for the given bitrate.\n */\n\nimport {\n NUM_BFUS,\n FRAME_BITS,\n FRAME_OVERHEAD_BITS,\n BITS_PER_BFU_METADATA,\n MAX_WORD_LENGTH_INDEX,\n} from '../core/constants.js'\nimport {\n WORD_LENGTH_BITS,\n INV_POWER_OF_TWO,\n SCALE_FACTORS,\n BFU_AMOUNTS,\n WORD_LENGTH_DELTA_BITS,\n DISTORTION_DELTA_FACTORS,\n} from '../core/tables.js'\n\nconst biasedScaleFactorCache = new Map()\n\n/**\n * Builds and returns a cached table of biased scale factors.\n *\n * @param {number} bias\n * @returns {Float64Array}\n */\nfunction buildBiasedScaleFactorTable(bias) {\n if (biasedScaleFactorCache.has(bias)) {\n return biasedScaleFactorCache.get(bias)\n }\n\n const out = new Float64Array(64)\n if (bias === 1) {\n out.set(SCALE_FACTORS)\n } else {\n for (let i = 0; i < 64; i++) {\n out[i] = Math.pow(SCALE_FACTORS[i], bias)\n }\n }\n biasedScaleFactorCache.set(bias, out)\n return out\n}\n\n/**\n * Evaluate one legal active-BFU count.\n *\n * @param {number} activeBfuCount\n * @param {number} maxBfuCount\n * @param {Int32Array} bfuSizes\n * @param {number} remainingBits\n * @param {Float64Array} biasedScaleFactors\n * @param {Int32Array} allScaleFactorIndices\n * @param {Float32Array} zeroBitDistortions\n * @returns {object} Allocation result.\n */\nfunction search(\n activeBfuCount,\n maxBfuCount,\n bfuSizes,\n remainingBits,\n biasedScaleFactors,\n allScaleFactorIndices,\n zeroBitDistortions\n) {\n const allocation = distributeBits(\n activeBfuCount,\n bfuSizes,\n remainingBits,\n biasedScaleFactors,\n allScaleFactorIndices\n )\n const distortion = measureDistortion(\n activeBfuCount,\n maxBfuCount,\n bfuSizes,\n allocation.wordLengths,\n allocation.scaleFactorIndices,\n biasedScaleFactors,\n zeroBitDistortions\n )\n return { distortion, ...allocation }\n}\n\n/**\n * Calculates the total distortion for a given allocation.\n * This includes quantization distortion for coded bands and truncation\n * distortion for uncoded bands.\n * @param {number} activeBfuCount\n * @param {number} maxBfuCount\n * @param {Int32Array} bfuSizes\n * @param {Int32Array} wordLengths\n * @param {Int32Array} scaleFactorIndices\n * @param {number} biasedScaleFactors\n * @param {Float32Array} zeroBitDistortions\n * @returns {number}\n */\nfunction measureDistortion(\n activeBfuCount,\n maxBfuCount,\n bfuSizes,\n wordLengths,\n scaleFactorIndices,\n biasedScaleFactors,\n zeroBitDistortions\n) {\n let totalDistortion = 0.0\n\n for (let i = 0; i < activeBfuCount; i++) {\n const wl = wordLengths[i] | 0\n const bits = WORD_LENGTH_BITS[wl] | 0\n if (bits === 0) {\n totalDistortion += zeroBitDistortions[i]\n continue\n }\n\n const sfi = scaleFactorIndices[i]\n if (sfi === 0) continue\n\n const effectiveScaleFactor = biasedScaleFactors[sfi]\n const distortionFactor = INV_POWER_OF_TWO[bits]\n\n totalDistortion += effectiveScaleFactor * distortionFactor * bfuSizes[i]\n }\n\n for (let i = activeBfuCount; i < maxBfuCount; i++) {\n totalDistortion += zeroBitDistortions[i]\n }\n\n return totalDistortion\n}\n\n/**\n * Distributes available bits across Band Frequency Units (BFUs) using Rate-Distortion Optimization.\n * (Modified to accept pre-calculated scale factors)\n *\n * @param {number} activeBfuCount\n * @param {Int32Array} bfuSizes\n * @param {number} remainingBits\n * @param {Float64Array} biasedScaleFactors\n * @param {Int32Array} allScaleFactorIndices\n * @returns {object} Retained allocation decisions.\n */\nfunction distributeBits(\n activeBfuCount,\n bfuSizes,\n remainingBits,\n biasedScaleFactors,\n allScaleFactorIndices\n) {\n const wordLengths = new Int32Array(activeBfuCount)\n\n const heapIndices = new Int32Array(activeBfuCount)\n const heapPriorities = new Float32Array(activeBfuCount)\n let heapSize = 0\n\n for (let bfuIndex = 0; bfuIndex < activeBfuCount; bfuIndex++) {\n const sz = bfuSizes[bfuIndex] | 0\n if (sz === 0) continue\n\n const sfi = allScaleFactorIndices[bfuIndex]\n if (sfi === 0) continue\n\n const deltaBits = WORD_LENGTH_DELTA_BITS[0]\n if (deltaBits <= 0) continue\n\n const distortionDelta =\n biasedScaleFactors[sfi] * DISTORTION_DELTA_FACTORS[0]\n\n heapIndices[heapSize] = bfuIndex\n heapPriorities[heapSize] = distortionDelta / deltaBits\n heapSize++\n }\n\n if (heapSize === 0) {\n return { wordLengths, scaleFactorIndices: allScaleFactorIndices }\n }\n\n // Heapify\n for (let i = (heapSize >> 1) - 1; i >= 0; i--) {\n siftDown(heapIndices, heapPriorities, i, heapSize)\n }\n\n // Greedy spending loop\n while (remainingBits > 0 && heapSize > 0) {\n const bfu = heapIndices[0]\n const cur = wordLengths[bfu] | 0\n const sz = bfuSizes[bfu] | 0\n const deltaBits = WORD_LENGTH_DELTA_BITS[cur]\n const cost = deltaBits * sz\n\n if (cost > remainingBits || cost <= 0) {\n const last = heapSize - 1\n heapIndices[0] = heapIndices[last]\n heapPriorities[0] = heapPriorities[last]\n heapSize--\n if (heapSize > 0) siftDown(heapIndices, heapPriorities, 0, heapSize)\n continue\n }\n\n remainingBits -= cost\n const nxt = cur + 1\n wordLengths[bfu] = nxt\n\n const deltaBitsNext = WORD_LENGTH_DELTA_BITS[nxt]\n if (nxt < MAX_WORD_LENGTH_INDEX && deltaBitsNext > 0) {\n const sfi = allScaleFactorIndices[bfu]\n const distortionDelta =\n biasedScaleFactors[sfi] * DISTORTION_DELTA_FACTORS[nxt]\n heapPriorities[0] = distortionDelta / deltaBitsNext\n siftDown(heapIndices, heapPriorities, 0, heapSize)\n } else {\n const last = heapSize - 1\n heapIndices[0] = heapIndices[last]\n heapPriorities[0] = heapPriorities[last]\n heapSize--\n if (heapSize > 0) siftDown(heapIndices, heapPriorities, 0, heapSize)\n }\n }\n\n return { wordLengths, scaleFactorIndices: allScaleFactorIndices }\n}\n\n/**\n * Restores max-heap property by sifting an element down from a given position.\n *\n * This function maintains the heap invariant where parent nodes have higher\n * priority values than their children. It compares the element at startIndex\n * with its children and swaps with the larger child until the heap property\n * is satisfied, or it reaches a leaf position.\n *\n * @param {Int32Array} heapIndices\n * @param {Float32Array} heapPriorities\n * @param {number} startIndex\n * @param {number} heapSize\n */\nfunction siftDown(heapIndices, heapPriorities, startIndex, heapSize) {\n let i = startIndex\n const idxVal = heapIndices[i]\n const prVal = heapPriorities[i]\n\n while (true) {\n const l = (i << 1) + 1\n const r = l + 1\n let maxI = i\n let maxP = prVal\n\n if (l < heapSize && heapPriorities[l] > maxP) {\n maxI = l\n maxP = heapPriorities[l]\n }\n if (r < heapSize && heapPriorities[r] > maxP) {\n maxI = r\n }\n if (maxI === i) break\n\n heapIndices[i] = heapIndices[maxI]\n heapPriorities[i] = heapPriorities[maxI]\n i = maxI\n }\n\n heapIndices[i] = idxVal\n heapPriorities[i] = prVal\n}\n\n/**\n * Allocate bits by finding the optimal BFU count and distribution using RDO.\n * This function searches through the valid BFU counts to find the one that\n * minimizes the total perceptual distortion.\n *\n * @param {Array<Float32Array>} bfuData\n * @param {Int32Array} bfuSizes\n * @param {number} maxBfuCount\n * @param {number} allocationBias\n * @returns {{bfuCount:number, allocation:Int32Array, scaleFactorIndices:Int32Array}}\n */\nexport function solve(bfuData, bfuSizes, maxBfuCount, allocationBias) {\n const allScaleFactorIndices = new Int32Array(maxBfuCount)\n const zeroBitDistortions = new Float32Array(maxBfuCount)\n const biasedScaleFactors = buildBiasedScaleFactorTable(allocationBias)\n\n for (let i = 0; i < maxBfuCount; i++) {\n const sz = bfuSizes[i] | 0\n if (sz === 0) continue\n\n const sfi = findScaleFactor(bfuData[i], sz)\n allScaleFactorIndices[i] = sfi\n if (sfi > 0) {\n const effectiveScaleFactor = biasedScaleFactors[sfi]\n zeroBitDistortions[i] = effectiveScaleFactor * 2.0 * sz\n }\n }\n\n let bestResult = null\n let minTotalDistortion = Infinity\n\n for (const candidateBfuCount of BFU_AMOUNTS) {\n if (candidateBfuCount > maxBfuCount) continue\n\n const availableBits =\n FRAME_BITS -\n FRAME_OVERHEAD_BITS -\n candidateBfuCount * BITS_PER_BFU_METADATA\n\n if (availableBits < 0) continue\n\n const result = search(\n candidateBfuCount,\n maxBfuCount,\n bfuSizes,\n availableBits,\n biasedScaleFactors,\n allScaleFactorIndices,\n zeroBitDistortions\n )\n\n if (result.distortion < minTotalDistortion) {\n minTotalDistortion = result.distortion\n bestResult = {\n bfuCount: candidateBfuCount,\n allocation: result.wordLengths,\n scaleFactorIndices: result.scaleFactorIndices,\n }\n }\n }\n\n if (!bestResult) {\n const fallbackBfuCount = BFU_AMOUNTS[0]\n return {\n bfuCount: fallbackBfuCount,\n allocation: new Int32Array(fallbackBfuCount),\n scaleFactorIndices: new Int32Array(NUM_BFUS),\n }\n }\n\n return bestResult\n}\n\n/**\n * Find the optimal scale factor index for a set of coefficients.\n * Same semantics as the original.\n * @param {Float32Array} coefficients\n * @param {number} length\n * @returns {number}\n */\nexport function findScaleFactor(coefficients, length) {\n let maxAmplitude = 0.0\n for (let i = 0; i < length; i++) {\n const a = Math.abs(coefficients[i])\n if (a > maxAmplitude) maxAmplitude = a\n }\n if (maxAmplitude === 0) return 0\n const index = Math.ceil(3 * (Math.log2(maxAmplitude) + 21))\n return Math.max(0, Math.min(63, index))\n}\n","/**\n * Carta1 allocation stage.\n */\n\nimport { throwError } from '../utils.js'\nimport { prepare } from './source.js'\nimport { solve } from './solve.js'\n\n/**\n * Allocate the frame budget across block floating units.\n *\n * @param {object} context\n * @returns {Function}\n */\nexport function allocate(context) {\n const options =\n context?.options ?? throwError('allocate: options is required')\n\n /**\n * @param {object} input\n * @returns {object}\n */\n return (input) => {\n const { coefficients, blockModes } = input\n const { bfuData, bfuSizes, bfuCount } = prepare(coefficients, blockModes)\n const result = solve(bfuData, bfuSizes, bfuCount, options.allocationBias)\n const nBfu = result.bfuCount\n\n return {\n bfuData,\n bfuSizes,\n nBfu,\n scaleFactorIndices: result.scaleFactorIndices.slice(0, nBfu),\n wordLengthIndices: result.allocation.slice(0, nBfu),\n blockModes,\n }\n }\n}\n","/**\n * Carta1 QMF analysis application.\n */\n\nimport { analyzeQmfPair } from '../signal/bands.js'\nimport { throwError } from '../utils.js'\n\n/**\n * Split PCM into the three ATRAC1 frequency bands.\n *\n * @param {object} context\n * @returns {Function}\n * @throws {Error} If the buffer pool is missing\n */\nexport function analyzeBands(context) {\n const bufferPool =\n context?.bufferPool ?? throwError('analyzeBands: bufferPool is required')\n const delays = bufferPool.qmfDelays\n\n /**\n * @param {Float32Array} pcmSamples\n * @returns {object}\n */\n return (pcmSamples) => {\n const stage1 = analyzeQmfPair(\n pcmSamples,\n delays.lowBand,\n bufferPool.qmfWorkBuffers\n )\n delays.lowBand = stage1.newDelay\n\n const stage2 = analyzeQmfPair(\n stage1.lowBand,\n delays.midBand,\n bufferPool.qmfWorkBuffers\n )\n delays.midBand = stage2.newDelay\n\n const delayedHigh =\n bufferPool.qmfWorkBuffers.highBandDelay[stage1.highBand.length]\n delayedHigh.set(delays.highBand)\n delayedHigh.set(stage1.highBand, delays.highBand.length)\n\n const highBand = delayedHigh.slice(0, stage1.highBand.length)\n delays.highBand = delayedHigh.slice(stage1.highBand.length)\n\n return { bands: [stage2.lowBand, stage2.highBand, highBand] }\n }\n}\n","/**\n * Carta1 Audio Codec - Transient Detection Module\n *\n * Detects transients using spectral flux analysis to prevent pre-echo artifacts.\n * Combines multiple spectral features to identify sudden changes in signal\n * characteristics that require special handling during encoding.\n */\n\nimport { FFT_SIZE_HIGH, FFT_SIZE_LOW, FFT_SIZE_MID } from '../core/constants.js'\nimport { FFT } from '../signal/fft.js'\nimport { throwError } from '../utils.js'\n\n/**\n * Calculate all spectral features for transient detection\n * @param {Float32Array} currentCoeffs - Current frame coefficients\n * @param {Float32Array} prevCoeffs - Previous frame coefficients\n * @returns {Object} Computed spectral features\n */\nfunction calculateSpectralFeatures(currentCoeffs, prevCoeffs) {\n // Calculate spectral flux (positive differences only)\n const spectralFlux = calculateSpectralFlux(currentCoeffs, prevCoeffs)\n\n // Calculate spectral flatness for both frames\n const currentFlatness = calculateSpectralFlatness(currentCoeffs)\n const prevFlatness = calculateSpectralFlatness(prevCoeffs)\n const flatnessChange = Math.abs(currentFlatness - prevFlatness)\n\n // Calculate high-frequency content ratio\n const currentHfRatio = calculateHighFrequencyRatio(currentCoeffs)\n const prevHfRatio = calculateHighFrequencyRatio(prevCoeffs)\n const hfChange = Math.abs(currentHfRatio - prevHfRatio)\n\n // Calculate energy change in dB\n const energyChange = calculateEnergyChange(currentCoeffs, prevCoeffs)\n\n return {\n spectralFlux,\n flatnessChange,\n hfChange,\n energyChange,\n }\n}\n\n/**\n * Calculate normalized spectral flux (positive spectral differences)\n * High values indicate sudden onset of new spectral components\n */\nfunction calculateSpectralFlux(currentCoeffs, prevCoeffs) {\n let flux = 0\n let currentEnergy = 0\n\n for (let i = 0; i < currentCoeffs.length; i++) {\n const currentMag = Math.abs(currentCoeffs[i])\n const prevMag = Math.abs(prevCoeffs[i])\n\n // Only count positive differences (new energy)\n const diff = currentMag - prevMag\n if (diff > 0) {\n flux += diff\n }\n\n currentEnergy += currentMag * currentMag\n }\n\n // Normalize by current frame energy to make threshold independent of level\n const normalization = Math.sqrt(currentEnergy) || 1e-6\n return flux / normalization\n}\n\n/**\n * Calculate spectral flatness (geometric mean / arithmetic mean)\n * Measures how noise-like vs tonal the spectrum is\n * @param {Float32Array} coeffs - Spectral coefficients\n * @returns {number} Flatness measure (0 = tonal, 1 = noise-like)\n */\nfunction calculateSpectralFlatness(coeffs) {\n const EPSILON = 1e-10\n let sumLog = 0\n let sumLinear = 0\n let validBins = 0\n\n for (let i = 0; i < coeffs.length; i++) {\n const magnitude = Math.abs(coeffs[i])\n if (magnitude > EPSILON) {\n sumLog += Math.log(magnitude)\n sumLinear += magnitude\n validBins++\n }\n }\n\n if (validBins === 0) return 0\n\n const geometricMean = Math.exp(sumLog / validBins)\n const arithmeticMean = sumLinear / validBins\n\n return arithmeticMean > EPSILON ? geometricMean / arithmeticMean : 0\n}\n\n/**\n * Calculate ratio of high-frequency to total energy\n * High values indicate bright/harsh sounds that are perceptually important\n * @param {Float32Array} coeffs - Spectral coefficients\n * @returns {number} High-frequency energy ratio (0-1)\n */\nfunction calculateHighFrequencyRatio(coeffs) {\n const midPoint = Math.floor(coeffs.length / 2)\n let lowEnergy = 0\n let highEnergy = 0\n\n for (let i = 0; i < midPoint; i++) {\n lowEnergy += coeffs[i] * coeffs[i]\n }\n\n for (let i = midPoint; i < coeffs.length; i++) {\n highEnergy += coeffs[i] * coeffs[i]\n }\n\n const totalEnergy = lowEnergy + highEnergy\n return totalEnergy > 0 ? highEnergy / totalEnergy : 0\n}\n\n/**\n * Calculate energy change between frames in dB\n * @param {Float32Array} currentCoeffs - Current frame coefficients\n * @param {Float32Array} prevCoeffs - Previous frame coefficients\n * @returns {number} Energy change in dB (positive values only)\n */\nfunction calculateEnergyChange(currentCoeffs, prevCoeffs) {\n let currentEnergy = 0\n let prevEnergy = 0\n\n for (let i = 0; i < currentCoeffs.length; i++) {\n currentEnergy += currentCoeffs[i] * currentCoeffs[i]\n prevEnergy += prevCoeffs[i] * prevCoeffs[i]\n }\n\n // Avoid log of zero and ensure minimum energy\n currentEnergy = Math.max(currentEnergy, 1e-10)\n prevEnergy = Math.max(prevEnergy, 1e-10)\n\n const changeDb = 10 * Math.log10(currentEnergy / prevEnergy)\n\n // Only interested in energy increases (potential transients)\n return Math.max(0, changeDb)\n}\n\n/**\n * Calculate unified transient score from spectral features\n * Uses perceptually-motivated combination instead of magic numbers\n * @param {Object} features - Spectral features\n * @returns {number} Transient score\n */\nfunction calculateTransientScore(features) {\n const { spectralFlux, flatnessChange, hfChange, energyChange } = features\n\n // Spectral flux is the primary indicator - it directly measures\n // sudden onset of new frequency components\n const fluxContribution = spectralFlux\n\n // Flatness change indicates transition between tonal and noise-like\n // signals (e.g., pitched to unpitched percussion)\n // Scale by sqrt to reduce dominance\n const flatnessContribution = Math.sqrt(flatnessChange)\n\n // High-frequency changes are perceptually important but shouldn't\n // dominate the decision. Use log scaling for perceptual relevance\n const hfContribution = Math.log1p(hfChange * 10) / Math.log1p(10)\n\n // Energy changes in dB are already perceptually scaled\n // Normalize to 0-1 range assuming 30dB is a strong transient\n const energyContribution = Math.min(energyChange / 30, 1)\n\n // Combine features with equal perceptual importance\n // Each contribution is normalized to roughly 0-1 range\n return (\n (fluxContribution +\n flatnessContribution +\n hfContribution +\n energyContribution) /\n 4\n )\n}\n\n/**\n * Perform FFT on time-domain samples and return magnitude spectrum\n * @param {Float32Array} samples - Time-domain samples\n * @param {number} fftSize - FFT size (must be power of 2)\n * @returns {Float32Array} Magnitude spectrum (positive frequencies only)\n */\nexport function performFFT(samples, fftSize) {\n const real = new Float32Array(fftSize)\n const imag = new Float32Array(fftSize)\n\n // Copy samples with zero-padding if necessary\n const copyLen = Math.min(samples.length, fftSize)\n real.set(samples.subarray(0, copyLen))\n\n // Perform FFT\n FFT.fft(real, imag)\n\n // Calculate magnitude spectrum for positive frequencies\n const magnitude = new Float32Array(fftSize / 2)\n for (let i = 0; i < fftSize / 2; i++) {\n magnitude[i] = Math.sqrt(real[i] * real[i] + imag[i] * imag[i])\n }\n\n return magnitude\n}\n\n/**\n * Detect transients by analyzing spectral changes between frames\n * @param {Float32Array} currentCoeffs - Current frame coefficients\n * @param {Float32Array} prevCoeffs - Previous frame coefficients\n * @param {number} threshold - Detection threshold\n * @returns {boolean} True if transient detected\n */\nexport function detectTransient(currentCoeffs, prevCoeffs, threshold) {\n // Can't detect transients without previous frame\n if (!prevCoeffs) return false\n\n // Calculate all spectral features\n const features = calculateSpectralFeatures(currentCoeffs, prevCoeffs)\n\n // Combine features using perceptually-motivated weighting\n const transientScore = calculateTransientScore(features)\n\n return transientScore > threshold\n}\n\n/**\n * Select transform block sizes from transient analysis.\n *\n * @param {object} context\n * @returns {Function}\n * @throws {Error} If the required context is missing\n */\nexport function selectBlocks(context) {\n const bufferPool =\n context?.bufferPool ?? throwError('selectBlocks: bufferPool is required')\n const options =\n context?.options ?? throwError('selectBlocks: options is required')\n const fftSizes = [FFT_SIZE_LOW, FFT_SIZE_MID, FFT_SIZE_HIGH]\n\n /**\n * @param {object} input\n * @returns {object}\n */\n return (input) => {\n const { bands } = input\n let blockModes\n\n if (options.fixedBlockModes) {\n blockModes = options.fixedBlockModes\n } else {\n blockModes = bands.map((bandSamples, bandIndex) => {\n const coeffs = performFFT(bandSamples, fftSizes[bandIndex])\n const transient = detectTransient(\n coeffs,\n bufferPool.transientDetection[bandIndex],\n options.transientThresholdLow\n )\n bufferPool.transientDetection[bandIndex] = coeffs\n return transient * Math.max(bandIndex + 1, 2)\n })\n }\n\n return { bands, blockModes }\n }\n}\n","/**\n * Carta1 spectral analysis application.\n */\n\nimport {\n MDCT_OVERLAP_SIZE,\n MDCT_SHORT_BLOCK_SIZE,\n MDCT_SIZE_LONG,\n MDCT_SIZE_MID,\n MDCT_SIZE_SHORT,\n} from '../core/constants.js'\nimport { calculateBandOffset } from '../core/geometry.js'\nimport { MDCT_BAND_CONFIGS, WINDOW_SHORT } from '../core/tables.js'\nimport {\n mdct64,\n mdct256,\n mdct512,\n reverseSpectrum,\n} from '../signal/spectrum.js'\nimport { throwError } from '../utils.js'\n\n/**\n * Build the ATRAC1 spectrum from analyzed bands.\n *\n * @param {object} context\n * @returns {Function}\n * @throws {Error} If the buffer pool is missing\n */\nexport function transformSpectrum(context) {\n const bufferPool =\n context?.bufferPool ??\n throwError('transformSpectrum: bufferPool is required')\n const overlapBuffers = bufferPool.mdctOverlap\n const transformFunctions = [mdct256, mdct256, mdct512]\n\n /**\n * @param {Float32Array} samples\n * @param {number} bandIndex\n * @param {number} blockMode\n * @param {Float32Array} overlapBuffer\n * @returns {Float32Array}\n */\n function transformBand(samples, bandIndex, blockMode, overlapBuffer) {\n const config = MDCT_BAND_CONFIGS[bandIndex]\n\n if (blockMode === 0) {\n return transformLongBlock(\n samples,\n bandIndex,\n config,\n transformFunctions[bandIndex],\n overlapBuffer\n )\n }\n\n return transformShortBlocks(samples, bandIndex, config, overlapBuffer)\n }\n\n /**\n * @param {Float32Array} samples\n * @param {number} bandIndex\n * @param {Object} config\n * @param {Object} transformFunction\n * @param {Float32Array} overlapBuffer\n * @returns {Float32Array}\n */\n function transformLongBlock(\n samples,\n bandIndex,\n config,\n transformFunction,\n overlapBuffer\n ) {\n const mdctSize = bandIndex === 2 ? MDCT_SIZE_LONG : MDCT_SIZE_MID\n const mdctInput = bufferPool.transformBuffers[mdctSize]\n mdctInput.fill(0)\n mdctInput.set(overlapBuffer, config.windowStart)\n\n applyTailWindowing(samples, overlapBuffer, config.size)\n mdctInput.set(samples, config.windowStart + MDCT_OVERLAP_SIZE)\n\n let spectrum = transformFunction.transform(\n mdctInput,\n bufferPool.mdctBuffers\n )\n if (bandIndex > 0) {\n spectrum = reverseSpectrum(spectrum, bufferPool.reversalBuffers)\n }\n return spectrum\n }\n\n /**\n * @param {Float32Array} samples\n * @param {number} bandIndex\n * @param {Object} config\n * @param {Float32Array} overlapBuffer\n * @returns {Float32Array}\n */\n function transformShortBlocks(samples, bandIndex, config, overlapBuffer) {\n const numBlocks = 1 << (config.size === 256 ? 3 : 2)\n const output = new Float32Array(config.size)\n\n for (let block = 0; block < numBlocks; block++) {\n const blockStart = block * MDCT_SHORT_BLOCK_SIZE\n const blockSamples = samples.subarray(\n blockStart,\n blockStart + MDCT_SHORT_BLOCK_SIZE\n )\n const mdctInput = bufferPool.transformBuffers[MDCT_SIZE_SHORT]\n mdctInput.fill(0)\n mdctInput.set(overlapBuffer, 0)\n\n applyTailWindowing(blockSamples, overlapBuffer, MDCT_SHORT_BLOCK_SIZE)\n mdctInput.set(blockSamples, MDCT_OVERLAP_SIZE)\n\n let spectrum = mdct64.transform(mdctInput, bufferPool.mdctBuffers)\n if (bandIndex > 0) {\n spectrum = reverseSpectrum(spectrum, bufferPool.reversalBuffers)\n }\n output.set(spectrum, blockStart)\n }\n\n return output\n }\n\n /**\n * @param {Float32Array} samples\n * @param {Float32Array} overlapBuffer\n * @param {number} blockSize\n */\n function applyTailWindowing(samples, overlapBuffer, blockSize) {\n const tailStart = blockSize - MDCT_OVERLAP_SIZE\n for (let i = 0; i < MDCT_OVERLAP_SIZE; i++) {\n const tailValue = samples[tailStart + i]\n overlapBuffer[i] = WINDOW_SHORT[i] * tailValue\n samples[tailStart + i] = tailValue * WINDOW_SHORT[31 - i]\n }\n }\n\n /**\n * @param {object} input\n * @returns {object}\n */\n return (input) => {\n const { bands, blockModes, originalFrame } = input\n const coefficients = new Float32Array(512)\n\n bands.forEach((bandSamples, bandIndex) => {\n const transformed = transformBand(\n bandSamples,\n bandIndex,\n blockModes[bandIndex],\n overlapBuffers[bandIndex]\n )\n coefficients.set(transformed, calculateBandOffset(bandIndex))\n })\n\n return { bands, coefficients, blockModes, originalFrame }\n }\n}\n","/**\n * Carta1 analysis stage.\n */\n\nimport { pipe } from '../utils.js'\nimport { analyzeBands } from './bands.js'\nimport { selectBlocks } from './blocks.js'\nimport { transformSpectrum } from './spectrum.js'\n\n/**\n * Analyze a PCM frame in the ATRAC1 signal domain.\n *\n * @param {object} context\n * @returns {Function}\n */\nexport function analyze(context) {\n const analyzeFrame = pipe(\n context,\n analyzeBands,\n selectBlocks,\n transformSpectrum\n )\n\n /**\n * @param {Float32Array} pcmSamples\n * @returns {object}\n */\n return (pcmSamples) => {\n const { coefficients, blockModes } = analyzeFrame(pcmSamples)\n return { coefficients, blockModes }\n }\n}\n","/**\n * Carta1 quantization stage.\n */\n\nimport { WORD_LENGTH_BITS } from '../core/tables.js'\nimport { quantize as quantizeCoefficient } from './spectrum.js'\n\n/**\n * Materialize retained allocation as quantized ATRAC1 symbols.\n *\n * @returns {QuantizeFrame}\n */\nexport function quantize() {\n /**\n * @param {object} input\n * @returns {object}\n */\n return (input) => {\n const {\n bfuData,\n bfuSizes,\n nBfu,\n scaleFactorIndices,\n wordLengthIndices,\n blockModes,\n } = input\n const quantizedCoefficients = []\n\n for (let bfu = 0; bfu < nBfu; bfu++) {\n const data = bfuData[bfu].subarray(0, bfuSizes[bfu])\n const bitsPerSample = WORD_LENGTH_BITS[wordLengthIndices[bfu]]\n quantizedCoefficients.push(\n quantizeCoefficient(data, scaleFactorIndices[bfu], bitsPerSample)\n )\n }\n\n return {\n nBfu,\n scaleFactorIndices,\n wordLengthIndices,\n quantizedCoefficients,\n blockModes,\n }\n }\n}\n","/**\n * Carta1 Audio Codec - Encoding Pipeline\n *\n * The frame pipeline reads as analysis, allocation, then quantization. Byte\n * packing remains the responsibility of serializeFrame().\n */\n\nimport { allocate } from '../allocation/stage.js'\nimport { analyze } from '../analysis/stage.js'\nimport { EncoderOptions } from '../core/options.js'\nimport { quantize } from '../quantization/stage.js'\nimport { BufferPool } from '../state.js'\nimport { pipe } from '../utils.js'\n\n/**\n * Create an ATRAC1 encoder.\n *\n * @param {EncoderOptions} [options=new EncoderOptions()]\n * @param {BufferPool} [bufferPool=new BufferPool()]\n * @returns {Function}\n */\nexport function encode(\n options = new EncoderOptions(),\n bufferPool = new BufferPool()\n) {\n const context = { options, bufferPool }\n return pipe(context, analyze, allocate, quantize)\n}\n","/**\n * Carta1 chronological stream adapters.\n */\n\nimport {\n AEA_HEADER_SIZE,\n SAMPLES_PER_FRAME,\n SOUND_UNIT_SIZE,\n STREAM_FLUSH_TAIL_FRAMES,\n STREAM_PRIMING_SAMPLES,\n} from '../core/constants.js'\nimport { EncoderOptions } from '../core/options.js'\nimport { decode } from '../pipeline/decoder.js'\nimport { encode } from '../pipeline/encoder.js'\nimport { deserializeFrame, serializeFrame } from '../syntax/frame.js'\nimport { AeaFile } from './container.js'\nimport { frameBufferToFrames, joinChannelFrames } from './pcm.js'\n\n/**\n * Validate a supported channel mode.\n *\n * @param {number} channelCount\n * @throws {Error} If the channel count is unsupported\n */\nfunction validateChannels(channelCount) {\n if (channelCount !== 1 && channelCount !== 2) {\n throw new Error(`Unsupported channel count: ${channelCount}`)\n }\n}\n\n/**\n * Validate one PCM frame in the selected channel mode.\n *\n * @param {object} frame\n * @param {number} channelCount\n * @throws {TypeError} If the frame does not match the selected mode\n * @throws {RangeError} If a selected channel is not one complete frame\n */\nfunction validateChunk(frame, channelCount) {\n const channels = channelCount === 1 ? [frame] : frame\n if (\n !Array.isArray(channels) ||\n channels.length !== channelCount ||\n channels.some((channel) => !(channel instanceof Float32Array))\n ) {\n throw new TypeError(\n `ATRAC1 streaming requires ${channelCount} Float32 channel${\n channelCount === 1 ? '' : 's'\n } per frame`\n )\n }\n\n if (channels.some((channel) => channel.length !== SAMPLES_PER_FRAME)) {\n throw new RangeError(\n `ATRAC1 streaming requires exactly ${SAMPLES_PER_FRAME} samples per channel`\n )\n }\n}\n\n/**\n * Create an empty structured frame for an unmatched stereo channel.\n *\n * @returns {object}\n */\nfunction createDummyFrame() {\n return {\n nBfu: 0,\n blockModes: [0, 0, 0],\n scaleFactorIndices: new Int32Array(0),\n wordLengthIndices: new Int32Array(0),\n quantizedCoefficients: [],\n }\n}\n\n/**\n * Collect an async iterable.\n *\n * @param {AsyncIterable} frames\n * @returns {Promise<Array>}\n */\nasync function collect(frames) {\n const output = []\n for await (const frame of frames) {\n output.push(frame)\n }\n return output\n}\n\n/**\n * Encode chronological PCM frames.\n */\nexport class AeaStreamingEncoder {\n /**\n * @param {object} [options]\n */\n constructor(options = {}) {\n const { channelCount = 1, onProgress, encoderOptions } = options\n validateChannels(channelCount)\n\n const codecOptions = encoderOptions || new EncoderOptions()\n this.channelCount = channelCount\n this.onProgress = onProgress\n this.frameIndex = 0\n this.sampleCount = 0\n this.finalized = false\n this.leftEncoder = encode(codecOptions)\n this.rightEncoder = channelCount === 2 ? encode(codecOptions) : null\n }\n\n /**\n * @param {AsyncIterable<object>} frames\n * @returns {AsyncGenerator<object>}\n */\n async *frames(frames) {\n if (this.finalized) {\n throw new Error('ATRAC1 encoder has already been finalized')\n }\n for await (const frame of frames) {\n validateChunk(frame, this.channelCount)\n if (this.channelCount === 1) {\n yield this.leftEncoder(frame)\n } else {\n const [left, right] = frame\n yield this.leftEncoder(left)\n yield this.rightEncoder(right)\n }\n\n this.sampleCount += SAMPLES_PER_FRAME\n\n if (this.onProgress) {\n this.onProgress(this.frameIndex++)\n }\n }\n }\n\n /**\n * Flush the synthesis tail after a nonempty stream.\n *\n * @returns {Generator<object>}\n */\n *finish() {\n if (this.finalized) return\n this.finalized = true\n if (this.sampleCount === 0) return\n const silence = new Float32Array(SAMPLES_PER_FRAME)\n for (let frame = 0; frame < STREAM_FLUSH_TAIL_FRAMES; frame++) {\n yield this.leftEncoder(silence)\n if (this.channelCount === 2) yield this.rightEncoder(silence)\n }\n }\n}\n\n/**\n * Decode chronological structured frames.\n */\nexport class AeaStreamingDecoder {\n /**\n * @param {object} [options]\n */\n constructor(options = {}) {\n const {\n channelCount = 1,\n onProgress,\n primingSampleCount = 0,\n sampleCount = Number.POSITIVE_INFINITY,\n } = options\n validateChannels(channelCount)\n\n this.channelCount = channelCount\n this.onProgress = onProgress\n this.frameIndex = 0\n this.primingSampleCount = primingSampleCount\n this.sampleCount = sampleCount\n this.timelinePosition = 0\n this.emittedSamples = 0\n this.leftFrame = null\n this.leftDecoder = decode()\n this.rightDecoder = channelCount === 2 ? decode() : null\n }\n\n /**\n * @param {AsyncIterable<object>} frames\n * @returns {AsyncGenerator<object>}\n */\n async *frames(frames) {\n for await (const frame of frames) {\n if (this.channelCount === 1) {\n yield this.trim(this.leftDecoder(frame))\n this.reportProgress()\n } else if (this.leftFrame === null) {\n this.leftFrame = frame\n } else {\n yield this.trim([\n this.leftDecoder(this.leftFrame),\n this.rightDecoder(frame),\n ])\n this.leftFrame = null\n this.reportProgress()\n }\n }\n }\n\n /**\n * Complete an unmatched stereo pair.\n *\n * @returns {Generator<[Float32Array, Float32Array]>}\n */\n *finish() {\n if (this.channelCount === 2 && this.leftFrame !== null) {\n yield this.trim([\n this.leftDecoder(this.leftFrame),\n this.rightDecoder(createDummyFrame()),\n ])\n this.leftFrame = null\n this.reportProgress()\n }\n if (\n Number.isFinite(this.sampleCount) &&\n this.emittedSamples !== this.sampleCount\n ) {\n throw new RangeError(\n `Truncated ATRAC1 timeline: decoded ${this.emittedSamples} of ${this.sampleCount} samples`\n )\n }\n }\n\n /**\n * Apply stream priming and visible-length trimming once per PCM frame.\n *\n * @param {object} frame\n * @returns {object}\n * @private\n */\n trim(frame) {\n const start = Math.max(0, this.primingSampleCount - this.timelinePosition)\n const remaining = this.sampleCount - this.emittedSamples\n const count = Math.max(0, Math.min(SAMPLES_PER_FRAME - start, remaining))\n this.timelinePosition += SAMPLES_PER_FRAME\n this.emittedSamples += count\n if (this.channelCount === 1) return frame.slice(start, start + count)\n return frame.map((channel) => channel.slice(start, start + count))\n }\n\n /**\n * Publish one frame's progress.\n *\n * @private\n */\n reportProgress() {\n if (this.onProgress) {\n this.onProgress(this.frameIndex++)\n }\n }\n}\n\n/**\n * Create a chronological encoder.\n *\n * @param {object} [options]\n * @returns {AeaStreamingEncoder}\n */\nexport function createAeaStreamingEncoder(options) {\n return new AeaStreamingEncoder(options)\n}\n\n/**\n * Create a chronological decoder.\n *\n * @param {object} [options]\n * @returns {AeaStreamingDecoder}\n */\nexport function createAeaStreamingDecoder(options) {\n return new AeaStreamingDecoder(options)\n}\n\n/**\n * Encode complete planar PCM buffers into an AEA byte image.\n *\n * @param {Float32Array[]} channels\n * @param {object} [options]\n * @returns {Promise<Uint8Array>}\n */\nexport async function encodeAeaPcm(channels, options = {}) {\n if (\n !Array.isArray(channels) ||\n (channels.length !== 1 && channels.length !== 2) ||\n channels.some((channel) => !(channel instanceof Float32Array))\n ) {\n throw new TypeError('ATRAC1 encoding requires one or two Float32 channels')\n }\n\n const { title = 'encoded by carta1', ...encoderValues } = options\n const encoder = createAeaStreamingEncoder({\n channelCount: channels.length,\n encoderOptions: new EncoderOptions(encoderValues),\n })\n const frames = encoder.frames(frameBufferToFrames(channels))\n const encoded = await collect(frames)\n encoded.push(...encoder.finish())\n\n const header = AeaFile.createHeader(\n title,\n encoded.length,\n channels.length,\n channels[0].length,\n STREAM_PRIMING_SAMPLES\n )\n const output = new Uint8Array(\n header.length + encoded.length * SOUND_UNIT_SIZE\n )\n output.set(header)\n encoded.forEach((frame, index) => {\n output.set(serializeFrame(frame), header.length + index * SOUND_UNIT_SIZE)\n })\n return output\n}\n\n/**\n * Decode a complete AEA byte image into planar normalized PCM buffers.\n *\n * @param {Uint8Array|ArrayBuffer|Blob} input\n * @returns {Promise<Float32Array[]>}\n */\nexport async function decodeAeaPcm(input) {\n let bytes\n if (input instanceof Blob) {\n bytes = new Uint8Array(await input.arrayBuffer())\n } else if (input instanceof Uint8Array) {\n bytes = input\n } else if (input instanceof ArrayBuffer) {\n bytes = new Uint8Array(input)\n } else {\n throw new TypeError('ATRAC1 decoding requires AEA bytes or a Blob')\n }\n\n const info = AeaFile.parseHeader(bytes.subarray(0, AEA_HEADER_SIZE))\n const decoder = createAeaStreamingDecoder({\n channelCount: info.channelCount,\n primingSampleCount: info.primingSampleCount,\n sampleCount: info.sampleCount,\n })\n const frames = (async function* () {\n for (\n let offset = AEA_HEADER_SIZE;\n offset + SOUND_UNIT_SIZE <= bytes.length;\n offset += SOUND_UNIT_SIZE\n ) {\n yield deserializeFrame(bytes.subarray(offset, offset + SOUND_UNIT_SIZE))\n }\n })()\n const decoded = await collect(decoder.frames(frames))\n decoded.push(...decoder.finish())\n\n if (info.channelCount === 1) {\n return [joinChannelFrames(decoded)]\n }\n return [\n joinChannelFrames(decoded.map(([left]) => left)),\n joinChannelFrames(decoded.map(([, right]) => right)),\n ]\n}\n","/**\n * Carta1 public processing facade.\n */\n\nimport {\n AEA_HEADER_SIZE,\n SAMPLE_RATE,\n SAMPLES_PER_FRAME,\n SOUND_UNIT_SIZE,\n STREAM_FLUSH_TAIL_FRAMES,\n STREAM_PRIMING_SAMPLES,\n} from '../core/constants.js'\nimport { deserializeFrame, serializeFrame } from '../syntax/frame.js'\nimport { AeaFile } from './container.js'\nimport { createPcmWave, frameBufferToFrames, joinChannelFrames } from './pcm.js'\nimport {\n createAeaStreamingDecoder,\n createAeaStreamingEncoder,\n decodeAeaPcm,\n encodeAeaPcm,\n} from './stream.js'\n\n/**\n * High-level audio processing facade.\n */\nexport class AudioProcessor {\n /**\n * @param {Float32Array[]} channels\n * @param {object} [options]\n * @returns {Promise<Uint8Array>}\n */\n static encodeAeaPcm(channels, options = {}) {\n return encodeAeaPcm(channels, options)\n }\n\n /**\n * @param {Uint8Array|ArrayBuffer|Blob} input\n * @returns {Promise<Float32Array[]>}\n */\n static decodeAeaPcm(input) {\n return decodeAeaPcm(input)\n }\n\n /**\n * @param {AsyncIterable<object>} audioFrames\n * @param {object} [options]\n * @returns {AsyncGenerator<object>}\n */\n static async *encodeStream(audioFrames, options = {}) {\n const encoder = createAeaStreamingEncoder(options)\n yield* encoder.frames(audioFrames)\n yield* encoder.finish()\n }\n\n /**\n * @param {AsyncIterable<object>} encodedFrames\n * @param {object} [options]\n * @returns {AsyncGenerator<object>}\n */\n static async *decodeStream(encodedFrames, options = {}) {\n const decoder = createAeaStreamingDecoder(options)\n yield* decoder.frames(encodedFrames)\n yield* decoder.finish()\n }\n\n /**\n * @param {Float32Array[]} buffers\n * @param {number} [frameSize]\n * @returns {Generator<Float32Array>|Generator<[Float32Array, Float32Array]>}\n */\n static *frameBufferToFrames(buffers, frameSize) {\n yield* frameBufferToFrames(buffers, frameSize)\n }\n\n /**\n * @param {AsyncIterable|Iterable} frameStream\n * @returns {Promise<Array>}\n */\n static async collectFrames(frameStream) {\n const frames = []\n for await (const frame of frameStream) {\n frames.push(frame)\n }\n return frames\n }\n\n /**\n * @param {AsyncIterable<object>} encodedFrames\n * @param {object} [options]\n * @returns {Promise<Blob>}\n */\n static async createAeaBlob(encodedFrames, options = {}) {\n const { title = 'encoded by atrac1.js', channelCount = 1 } = options\n const frames = []\n for await (const frame of encodedFrames) {\n frames.push(serializeFrame(frame))\n }\n\n const timelineFrames = frames.length / channelCount\n const sampleCount =\n options.sampleCount ??\n Math.max(0, timelineFrames - STREAM_FLUSH_TAIL_FRAMES) * SAMPLES_PER_FRAME\n const header = AeaFile.createHeader(\n title,\n frames.length,\n channelCount,\n sampleCount,\n STREAM_PRIMING_SAMPLES\n )\n return new Blob([header, ...frames], { type: 'application/octet-stream' })\n }\n\n /**\n * @param {Blob} blob\n * @returns {Promise<object>} Parsed AEA data.\n */\n static async parseAeaBlob(blob) {\n const buffer = await blob.arrayBuffer()\n const header = new Uint8Array(buffer.slice(0, AEA_HEADER_SIZE))\n const info = AeaFile.parseHeader(header)\n const frameData = []\n\n for (let offset = AEA_HEADER_SIZE; offset < buffer.byteLength;) {\n const frame = new Uint8Array(\n buffer.slice(offset, offset + SOUND_UNIT_SIZE)\n )\n if (frame.length === SOUND_UNIT_SIZE) {\n frameData.push(frame)\n }\n offset += SOUND_UNIT_SIZE\n }\n return { info, frameData }\n }\n\n /**\n * @param {Uint8Array[]} frameData\n * @returns {Generator<object>}\n */\n static *deserializedFrameStream(frameData) {\n for (const frame of frameData) {\n yield deserializeFrame(frame)\n }\n }\n\n /**\n * @param {Float32Array[]|[Float32Array, Float32Array][]} pcmFrames\n * @param {number} [channelCount=1]\n * @param {number} [sampleRate=SAMPLE_RATE]\n * @returns {Blob}\n */\n static createPcmWaveBlob(\n pcmFrames,\n channelCount = 1,\n sampleRate = SAMPLE_RATE\n ) {\n let channels\n if (channelCount === 1) {\n channels = [joinChannelFrames(pcmFrames)]\n } else if (channelCount === 2) {\n channels = [\n joinChannelFrames(pcmFrames.map(([left]) => left)),\n joinChannelFrames(pcmFrames.map(([, right]) => right)),\n ]\n } else {\n throw new Error(`Unsupported channel count: ${channelCount}`)\n }\n return new Blob([createPcmWave(channels, { sampleRate })], {\n type: 'audio/wav',\n })\n }\n\n /**\n * Preserve the supported WAVE facade name.\n *\n * @param {Float32Array[]|[Float32Array, Float32Array][]} pcmFrames\n * @param {number} [channelCount=1]\n * @param {number} [sampleRate=SAMPLE_RATE]\n * @returns {Blob}\n */\n static createWavBlob(pcmFrames, channelCount = 1, sampleRate = SAMPLE_RATE) {\n return AudioProcessor.createPcmWaveBlob(pcmFrames, channelCount, sampleRate)\n }\n\n /**\n * Assemble PCM frames using the supported interleaved result shape.\n *\n * @param {Float32Array[]|[Float32Array, Float32Array][]} pcmFrames\n * @param {number} channelCount\n * @returns {Float32Array}\n */\n static assemblePcmFrames(pcmFrames, channelCount) {\n if (channelCount === 1) {\n return joinChannelFrames(pcmFrames)\n }\n if (channelCount !== 2) {\n throw new Error(`Unsupported channel count: ${channelCount}`)\n }\n\n const left = joinChannelFrames(pcmFrames.map(([channel]) => channel))\n const right = joinChannelFrames(pcmFrames.map(([, channel]) => channel))\n const pcm = new Float32Array(Math.max(left.length, right.length) * 2)\n for (let i = 0; i < pcm.length / 2; i++) {\n pcm[i * 2] = left[i] ?? 0\n pcm[i * 2 + 1] = right[i] ?? 0\n }\n return pcm\n }\n}\n","/**\n * Carta1 Web Worker - Self-contained audio codec worker\n *\n * Provides asynchronous encoding and decoding of ATRAC1 audio format\n * in a separate thread to prevent blocking the main UI thread.\n *\n * Usage:\n * Include this file as a web worker:\n * new Worker('carta1-worker.min.js')\n */\n\nimport { AeaFile } from './container.js'\nimport { EncoderOptions } from '../core/options.js'\nimport { AudioProcessor } from './processor.js'\nimport { SAMPLE_RATE } from '../core/constants.js'\n\n/**\n * Encode PCM audio data to ATRAC1 format\n *\n * @param {Array<Float32Array>} pcmData - PCM audio data [mono] or [left, right]\n * @param {Object} options - Encoder options\n * @returns {Promise<Object>} Encoded AEA blob\n */\nasync function encodeAtrac(pcmData, options, title) {\n title = title ?? 'encoded by carta1'\n try {\n const audioFrames = AudioProcessor.frameBufferToFrames(pcmData)\n const channelCount = pcmData.length\n\n // Create encoder options from provided settings\n const encoderOptions = new EncoderOptions(options)\n\n const encodedFrames = AudioProcessor.encodeStream(audioFrames, {\n channelCount,\n encoderOptions,\n })\n\n const frameArray = await AudioProcessor.collectFrames(encodedFrames)\n\n const aeaBlob = await AudioProcessor.createAeaBlob(frameArray, {\n title,\n channelCount,\n sampleCount: pcmData[0].length,\n })\n\n // Return the blob\n return { aeaBlob }\n } catch (error) {\n console.error('Worker encode error:', error)\n throw error\n }\n}\n\n/**\n * Get default encoder options metadata\n *\n * @returns {Object} Default encoder options as plain object\n */\nfunction getEncoderOptionsMetadata() {\n const defaultOptions = new EncoderOptions()\n return defaultOptions.toObject()\n}\n\n/**\n * Decode ATRAC1 data to PCM WAV format\n *\n * @param {Object} aea - AEA data object\n * @param {Uint8Array} aea.header - AEA file header\n * @param {Array} aea.aeaData - Serialized frame data\n * @param {Object} [aea.info] - Optional metadata\n * @returns {Promise<Object>} WAV blob and decoding info\n */\nasync function decodeAtrac(aea) {\n const { header, aeaData, info } = aea\n\n // Use provided info, or fall back to header parsing, or defaults\n let decodingInfo\n if (info) {\n decodingInfo = { sampleRate: SAMPLE_RATE, ...info }\n } else if (header) {\n const headerInfo = AeaFile.parseHeader(header)\n decodingInfo = { sampleRate: SAMPLE_RATE, ...headerInfo }\n } else {\n decodingInfo = { channelCount: 2, sampleRate: SAMPLE_RATE }\n }\n\n const encodedFrameStream = AudioProcessor.deserializedFrameStream(aeaData)\n const decodedFrames = AudioProcessor.decodeStream(encodedFrameStream, {\n channelCount: decodingInfo.channelCount,\n primingSampleCount: decodingInfo.primingSampleCount,\n sampleCount: decodingInfo.sampleCount,\n })\n\n const pcmFrames = await AudioProcessor.collectFrames(decodedFrames)\n\n // Create WAV blob directly\n const wavBlob = AudioProcessor.createPcmWaveBlob(\n pcmFrames,\n decodingInfo.channelCount,\n decodingInfo.sampleRate\n )\n\n return { wavBlob, info: decodingInfo }\n}\n\n/**\n * Handle messages from the main thread\n *\n * Supported message types:\n * - 'encode': Encode PCM to ATRAC1\n * - 'decode': Decode ATRAC1 to PCM\n * - 'parseAea': Parse AEA blob metadata\n * - 'getEncoderOptions': Get default encoder options\n */\nself.onmessage = async (e) => {\n const { jobId, type, pcmData, aea, options, title, blob } = e.data\n\n try {\n let result\n\n switch (type) {\n case 'encode':\n result = await encodeAtrac(pcmData, options, title)\n break\n case 'decode':\n result = await decodeAtrac(aea)\n break\n case 'parseAea':\n result = await AudioProcessor.parseAeaBlob(blob)\n break\n case 'getEncoderOptions':\n result = getEncoderOptionsMetadata()\n break\n default:\n throw new Error(`Unknown worker message type: ${type}`)\n }\n\n self.postMessage({ jobId, result })\n } catch (error) {\n console.error('Worker error:', error)\n self.postMessage({ jobId, error: error.message })\n }\n}\n"],"names":["SAMPLE_RATE","SAMPLES_PER_FRAME","AEA_HEADER_SIZE","SOUND_UNIT_SIZE","MDCT_SIZE_MID","MDCT_SIZE_LONG","MDCT_SHORT_BLOCK_SIZE","MDCT_OVERLAP_SIZE","MDCT_TAIL_WINDOW_SIZE","QMF_DELAY","MAX_WORD_LENGTH_INDEX","AEA_MAGIC","Uint8Array","SPECS_PER_BFU","Int32Array","BFU_AMOUNTS","BFU_BAND_BOUNDARIES","BFU_START_LONG","BFU_START_SHORT","WINDOW_SHORT","table","Float64Array","i","Math","sin","PI","QMF_COEFFS","Float32Array","QMF_WINDOW","window","QMF_EVEN","even","QMF_ODD","odd","MDCT_BAND_CONFIGS","size","windowStart","WORD_LENGTH_BITS","SCALE_FACTORS","pow","INV_POWER_OF_TWO","maxBits","bits","WORD_LENGTH_DELTA_BITS","DISTORTION_DELTA_FACTORS","bits1","bits2","AeaFile","_classCallCheck","this","key","value","title","arguments","length","undefined","frameCount","channelCount","sampleCount","primingSampleCount","header","view","DataView","buffer","set","titleBytes","TextEncoder","encode","subarray","min","AEA_TITLE_SIZE","setUint32","Error","concat","byteOffset","byteLength","titleEnd","indexOf","titleLength","TextDecoder","decode","getUint32","EncoderOptions","options","values","transientThresholdLow","transientThresholdMid","transientThresholdHigh","allocationBias","fixedBlockModes","metadata","default","name","description","range","step","type","setOptions","_i","_Object$entries","Object","entries","_Object$entries$_i","_slicedToArray","setValue","meta","_meta$range","max","get","_objectSpread","_i2","_Object$entries2","_Object$entries2$_i","assertBitCount","bitCount","Number","isInteger","RangeError","packBits","bitPosition","byteIndex","floor","bitOffset","unsignedValue","bitsWritten","bitsAvailable","bitsToWrite","valueBits","mask","unpackBits","bitsRead","bitsToRead","unpackSignedBits","serializeFrame","frameData","bfuIndex","nBfu","blockModes","setUint16","wordLengthIndices","scaleFactorIndices","bitsPerSample","_step","_iterator","_createForOfIteratorHelper","quantizedCoefficients","s","n","done","coefficient","err","e","f","deserializeFrame","getUint16","bfuSize","coefficients","j","push","t","r","Symbol","iterator","o","toStringTag","c","prototype","Generator","u","create","_regeneratorDefine2","p","y","G","v","a","d","bind","l","TypeError","call","GeneratorFunction","GeneratorFunctionPrototype","getPrototypeOf","setPrototypeOf","__proto__","displayName","_regenerator","w","m","defineProperty","_invoke","enumerable","configurable","writable","Array","isArray","_arrayWithHoles","next","_iterableToArrayLimit","_unsupportedIterableToArray","_nonIterableRest","_n","F","_arrayLikeToArray","toString","slice","constructor","from","test","writeFourCc","output","offset","setUint8","charCodeAt","joinChannelFrames","frames","reduce","total","frame","channel","frameBufferToFrames","buffers","frameSize","_callee","_buffers","left","_buffers2","_left","right","_offset","leftFrame","rightFrame","_context","every","floatToPcm16","sample","clipped","createPcmWave","channels","_options$sampleRate","sampleRate","pcm","_step2","_iterator2","setInt16","interleavePcm16","_ref","byteRate","blockAlign","dataSize","createPcmWaveHeader","quantize","scaleFactorIndex","out","fill","quantRange","normFactor","hi","lo","x","dequantize","quantized","scaleFactor","deq","bfu","band","position","dequantized","dequantizeCoefficient","History","_createClass","qmfDelays","lowBand","midBand","highBand","transientDetection","mdctOverlap","imdctOverlap","Scratch","transformBuffers","qmfWorkBuffers","delay","highBandDelay","QMF_HIGH_BAND_DELAY","mdctBuffers","real","imag","reversalBuffers","BufferPool","assign","throwError","msg","pipe","context","_len","stages","_key","operations","map","stage","input","operation","FFT","log2","reversed","temp","b","_ref2","stride","halfStride","angle","wReal","cos","wImag","start","twiddleReal","twiddleImag","k","evenIndex","oddIndex","evenReal","evenImag","oddReal","oddImag","tReal","tImag","nextReal","MDCTBase","scale","halfSize","quarterSize","fftSize","alpha","omega","scaleRoot","sqrt","sinCosTable","MDCT","_MDCTBase","_callSuper","_inherits","_mdctBuffers$this$fft","_buffers$real","_buffers$imag","n4","n34","i2","i3","i4","im","idx","fft","re","IMDCT","_MDCTBase2","_mdctBuffers$this$fft2","_buffers$real2","_buffers$imag2","r1","i1","mdct64","mdct256","mdct512","imdct64","MDCT_SIZE_SHORT","imdct256","imdct512","overlapAdd","prev","curr","w1","w2","reverseSpectrum","spectrum","synthesizeSpectrum","_context$bufferPool","bufferPool","overlapBuffers","transformFunctions","transformBand","bandIndex","blockMode","overlapBuffer","config","transformFunction","blockSpectrum","inverse","transform","inverseStart","inverseBuffer","previous","overlap","copyLength","inverseLongBlock","numBlocks","block","inverseShortBlocks","bandCoefficients","offsets","extractBandCoefficients","analyzeQmfPair","delayLine","_qmfWorkBuffers$delay","_qmfWorkBuffers$delay2","inputLength","outputLength","workBuffer","evenSum","oddSum","newDelay","synthesizeQmfPair","_qmfWorkBuffers$delay3","_qmfWorkBuffers$delay4","subbandLength","low","high","sample0","sample1","synthesizePcm","delays","bands","delayedHigh","stage2","stage1","synthesize","prepare","bfuData","bfuSizes","coeffIndex","bandStart","bandSize","bandEnd","startPositions","startPos","endPos","srcStart","srcEnd","bfuCount","groupIntoBFUs","biasedScaleFactorCache","Map","search","activeBfuCount","maxBfuCount","remainingBits","biasedScaleFactors","allScaleFactorIndices","zeroBitDistortions","allocation","wordLengths","heapIndices","heapPriorities","heapSize","sfi","deltaBits","distortionDelta","siftDown","cur","sz","cost","last","nxt","deltaBitsNext","distributeBits","distortion","totalDistortion","wl","measureDistortion","startIndex","idxVal","prVal","maxI","maxP","solve","bias","has","buildBiasedScaleFactorTable","findScaleFactor","effectiveScaleFactor","bestResult","minTotalDistortion","Infinity","candidateBfuCount","availableBits","FRAME_BITS","result","fallbackBfuCount","maxAmplitude","abs","index","ceil","allocate","_context$options","_prepare","analyzeBands","pcmSamples","calculateSpectralFeatures","currentCoeffs","prevCoeffs","spectralFlux","flux","currentEnergy","currentMag","diff","normalization","calculateSpectralFlux","currentFlatness","calculateSpectralFlatness","prevFlatness","flatnessChange","currentHfRatio","calculateHighFrequencyRatio","prevHfRatio","hfChange","energyChange","prevEnergy","changeDb","log10","calculateEnergyChange","coeffs","sumLog","sumLinear","validBins","magnitude","log","geometricMean","exp","arithmeticMean","midPoint","lowEnergy","highEnergy","totalEnergy","detectTransient","threshold","transientScore","features","log1p","calculateTransientScore","selectBlocks","fftSizes","bandSamples","samples","copyLen","performFFT","transient","transformSpectrum","mdctSize","mdctInput","applyTailWindowing","transformLongBlock","blockStart","blockSamples","transformShortBlocks","blockSize","tailStart","tailValue","originalFrame","forEach","transformed","calculateBandOffset","analyze","analyzeFrame","_analyzeFrame","data","quantizeCoefficient","_defineProperties","_toPropertyKey","_typeof","toPrimitive","String","_toPrimitive","asyncGeneratorStep","Promise","resolve","then","_asyncToGenerator","apply","_next","_throw","_awaitAsyncGenerator","_OverloadYield","_wrapAsyncGenerator","AsyncGenerator","resume","settle","reject","arg","_asyncIterator","asyncIterator","AsyncFromSyncIterator","AsyncFromSyncIteratorContinuation","return","throw","validateChannels","validateChunk","some","createDummyFrame","collect","_x","_collect","_callee3","_iteratorAbruptCompletion","_didIteratorError","_iteratorError","_t3","_context5","AeaStreamingEncoder","_options$channelCount","onProgress","encoderOptions","codecOptions","frameIndex","finalized","leftEncoder","rightEncoder","_this","_iteratorAbruptCompletion2","_didIteratorError2","_iteratorError2","_frame","_t","finish","silence","_context2","AeaStreamingDecoder","_options$channelCount2","_options$primingSampl","_options$sampleCount","POSITIVE_INFINITY","timelinePosition","emittedSamples","leftDecoder","rightDecoder","_this2","_callee2","_iteratorAbruptCompletion3","_didIteratorError3","_iteratorError3","_iterator3","_step3","_t2","_context3","trim","reportProgress","_context4","isFinite","remaining","count","createAeaStreamingEncoder","createAeaStreamingDecoder","_encodeAeaPcm","_callee4","_options$title","encoderValues","encoder","encoded","_args6","_context6","_objectWithoutProperties","_excluded","_toConsumableArray","createHeader","_decodeAeaPcm","_callee6","bytes","info","decoder","decoded","_t4","_t5","_context8","Blob","arrayBuffer","ArrayBuffer","parseHeader","_callee5","_context7","_ref4","_asyncGeneratorDelegate","pump","AudioProcessor","_x2","encodeAeaPcm","_x3","decodeAeaPcm","audioFrames","_regeneratorValues","encodedFrames","_collectFrames","frameStream","_createAeaBlob","timelineFrames","_args5","_x4","_parseAeaBlob","blob","_x5","deserializedFrameStream","pcmFrames","_ref3","createPcmWaveBlob","_ref5","_ref7","_left$i","_right$i","encodeAtrac","_encodeAtrac","pcmData","frameArray","aeaBlob","encodeStream","collectFrames","createAeaBlob","console","error","getEncoderOptionsMetadata","toObject","decodeAtrac","_decodeAtrac","aea","aeaData","decodingInfo","headerInfo","encodedFrameStream","decodedFrames","wavBlob","decodeStream","self","onmessage","_e$data","jobId","parseAeaBlob","postMessage","message"],"sourceRoot":""}