phanpy-cz/assets/fuse-zg_VFt4r.js.map
2024-11-16 11:51:00 +01:00

1 line
742 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{"version":3,"mappings":"idAGA,SAASA,IAAW,CAClB,OAAOA,GAAW,OAAO,OAAS,OAAO,OAAO,KAAI,EAAK,SAAUC,EAAG,CACpE,QAASC,EAAI,EAAGA,EAAI,UAAU,OAAQA,IAAK,CACzC,IAAIC,EAAI,UAAUD,CAAC,EACnB,QAASE,KAAKD,GAAI,IAAI,eAAe,KAAKA,EAAGC,CAAC,IAAMH,EAAEG,CAAC,EAAID,EAAEC,CAAC,EAC/D,CACD,OAAOH,CACR,EAAED,GAAS,MAAM,KAAM,SAAS,CACnC,CAEA,IAAIK,GAA2B,CAAC,QAAS,MAAO,OAAQ,MAAO,MAAM,EACjEC,GAAa,CACf,IAAK,SACL,OAAU,QACV,IAAK,SACL,IAAK,QACL,IAAK,QACL,IAAK,QACL,IAAK,YACL,IAAK,YACL,IAAK,eACL,UAAW,QACX,WAAY,QACZ,QAAS,MACT,SAAU,MACV,SAAU,OACV,UAAW,OACX,OAAQ,OACR,QAAS,OACT,YAAa,OACb,aAAc,MAChB,EACA,SAASC,GAAOC,EAAK,CACnB,OAAQA,GAAOF,GAAWE,CAAG,GAAKA,GAAO,IAAI,KAAI,EAAG,YAAa,EAAC,QAAQ,yBAA0B,EAAE,CACxG,CACA,SAASC,GAAiBD,EAAK,CAC7B,OAAOH,GAAyB,SAASG,CAAG,CAC9C,CACA,SAASE,GAAmBC,EAAMC,EAAU,CAC1C,OAAIA,IAAa,SACfA,EAAW,KAEND,EAAK,MAAMC,CAAQ,CAC5B,CACA,SAASC,GAAYC,EAAQC,EAAgBC,EAAa,CACpDD,IAAmB,SACrBA,EAAiB,KAEnB,IAAIJ,EAAOG,EAAO,kBAAmB,EAAC,MAAMC,CAAc,EAAE,IAAI,SAAUE,EAAG,CAC3E,OAAOV,GAAOU,CAAC,CACnB,CAAG,EACGC,EAAY,CACd,IAAKP,EAAK,SAAS,KAAK,EACxB,KAAMA,EAAK,SAAS,MAAM,GAAKA,EAAK,SAAS,SAAS,EACtD,MAAOA,EAAK,SAAS,OAAO,EAC5B,KAAMA,EAAK,SAAS,MAAM,EAC1B,IAAKA,EAAK,SAAS,KAAK,CAC5B,EACMQ,EAAiBR,EAAK,OAAO,SAAUM,EAAG,CAC5C,MAAO,CAACZ,GAAyB,SAASY,CAAC,CAC/C,CAAG,EACD,OAAOjB,GAAS,CAAE,EAAEkB,EAAW,CAC7B,KAAMC,EACN,YAAaH,EACb,OAAQF,CACZ,CAAG,CACH,EAEC,UAAY,CACP,OAAO,SAAa,MACtB,SAAS,iBAAiB,UAAW,SAAU,EAAG,CAC5C,EAAE,MAAQ,QAIdM,GAA2B,CAACb,GAAO,EAAE,GAAG,EAAGA,GAAO,EAAE,IAAI,CAAC,CAAC,CAChE,CAAK,EACD,SAAS,iBAAiB,QAAS,SAAU,EAAG,CAC1C,EAAE,MAAQ,QAIdc,GAA+B,CAACd,GAAO,EAAE,GAAG,EAAGA,GAAO,EAAE,IAAI,CAAC,CAAC,CACpE,CAAK,GAEC,OAAO,OAAW,KACpB,OAAO,iBAAiB,OAAQ,UAAY,CAC1Ce,GAAqB,MAAK,CAChC,CAAK,CAEL,KACA,IAAIA,GAAoC,IAAI,IAE5C,SAASC,GAAgBC,EAAO,CAC9B,OAAO,MAAM,QAAQA,CAAK,CAC5B,CACA,SAASC,GAAgBjB,EAAKI,EAAU,CAClCA,IAAa,SACfA,EAAW,KAEb,IAAIc,EAAcH,GAAgBf,CAAG,EAAIA,EAAMA,EAAI,MAAMI,CAAQ,EACjE,OAAOc,EAAY,MAAM,SAAUZ,EAAQ,CACzC,OAAOQ,GAAqB,IAAIR,EAAO,KAAM,EAAC,YAAW,CAAE,CAC/D,CAAG,CACH,CACA,SAASM,GAA2BZ,EAAK,CACvC,IAAIkB,EAAc,MAAM,QAAQlB,CAAG,EAAIA,EAAM,CAACA,CAAG,EAM7Cc,GAAqB,IAAI,MAAM,GACjCA,GAAqB,QAAQ,SAAUd,EAAK,CAC1C,MAAO,CAACC,GAAiBD,CAAG,GAAKc,GAAqB,OAAUd,EAAI,YAAW,CAAE,CACvF,CAAK,EAEHkB,EAAY,QAAQ,SAAUZ,EAAQ,CACpC,OAAOQ,GAAqB,IAAIR,EAAO,YAAa,EACxD,CAAG,CACH,CACA,SAASO,GAA+Bb,EAAK,CAC3C,IAAIkB,EAAc,MAAM,QAAQlB,CAAG,EAAIA,EAAM,CAACA,CAAG,EAM7CA,IAAQ,OACVc,GAAqB,MAAK,EAE1BI,EAAY,QAAQ,SAAUZ,EAAQ,CACpC,OAAOQ,GAAqB,OAAUR,EAAO,YAAa,EAChE,CAAK,CAEL,CAEA,SAASa,GAAoB,EAAGb,EAAQc,EAAgB,EAClD,OAAOA,GAAmB,YAAcA,EAAe,EAAGd,CAAM,GAAKc,IAAmB,KAC1F,EAAE,eAAc,CAEpB,CACA,SAASC,GAAgB,EAAGf,EAAQgB,EAAS,CAC3C,OAAI,OAAOA,GAAY,WACdA,EAAQ,EAAGhB,CAAM,EAEnBgB,IAAY,IAAQA,IAAY,MACzC,CACA,SAASC,GAAgCC,EAAI,CAC3C,OAAOC,GAAqBD,EAAI,CAAC,QAAS,WAAY,QAAQ,CAAC,CACjE,CACA,SAASC,GAAqBC,EAAOC,EAAe,CAC9CA,IAAkB,SACpBA,EAAgB,IAElB,IAAIC,EAASF,EAAM,OACjBG,EAAWH,EAAM,SACfI,EAAgB,KAMpB,OALIC,GAAgBH,CAAM,GAAKC,EAC7BC,EAAgBJ,EAAM,aAAY,EAAG,CAAC,GAAKA,EAAM,aAAc,EAAC,CAAC,EAAE,QAEnEI,EAAgBF,GAAUA,EAAO,QAE/Bb,GAAgBY,CAAa,EACxB,GAAQG,GAAiBH,GAAiBA,EAAc,KAAK,SAAUK,EAAK,CACjF,IAAIC,EACJ,OAAOD,EAAI,kBAAoBC,EAAiBH,IAAkB,KAAO,OAASG,EAAe,YAAa,EAC/G,IAEI,GAAQH,GAAiBH,GAAiBA,EACnD,CACA,SAASI,GAAgBG,EAAS,CAIhC,MAAO,CAAC,CAACA,EAAQ,SAAW,CAACA,EAAQ,QAAQ,WAAW,GAAG,GAAKA,EAAQ,QAAQ,SAAS,GAAG,CAC9F,CACA,SAASC,GAAcC,EAAcC,EAAQ,CAC3C,OAAID,EAAa,SAAW,GAAKC,GAC/B,QAAQ,KAAK,2KAA2K,EACjL,IAEJA,EAGED,EAAa,KAAK,SAAUE,EAAO,CACxC,OAAOD,EAAO,SAASC,CAAK,CAC7B,IAAKF,EAAa,SAAS,GAAG,EAJtB,EAKX,CACA,IAAIG,GAAgC,SAAuC7C,EAAGY,EAAQkC,EAAiB,CACjGA,IAAoB,SACtBA,EAAkB,IAEpB,IAAIC,EAAMnC,EAAO,IACfoC,EAAOpC,EAAO,KACdqC,EAAMrC,EAAO,IACbsC,EAAQtC,EAAO,MACfuC,EAAOvC,EAAO,KACdH,EAAOG,EAAO,KACZwC,EAAsBpD,EAAE,IAC1BqD,EAAOrD,EAAE,KACTsD,EAAUtD,EAAE,QACZuD,EAAUvD,EAAE,QACZwD,EAAWxD,EAAE,SACbyD,EAASzD,EAAE,OACT0D,EAAUrD,GAAOgD,CAAI,EACrBM,EAAaP,EAAoB,cACrC,GAAI,EAAE3C,GAAQ,MAAQA,EAAK,SAASiD,CAAO,IAAM,EAAEjD,GAAQ,MAAQA,EAAK,SAASkD,CAAU,IAAM,CAAC,CAAC,OAAQ,UAAW,UAAW,OAAQ,MAAO,QAAS,IAAI,EAAE,SAASD,CAAO,EAC7K,MAAO,GAET,GAAI,CAACZ,EAAiB,CAKpB,GAHIC,IAAQ,CAACU,GAAUE,IAAe,OAGlCT,IAAU,CAACM,GAAYG,IAAe,QACxC,MAAO,GAGT,GAAIV,GACF,GAAI,CAACM,GAAW,CAACD,EACf,MAAO,WAGLN,IAAS,CAACO,GAAWI,IAAe,QAAUA,IAAe,MAG7DR,IAAS,CAACG,GAAWK,IAAe,QAAUA,IAAe,UAC/D,MAAO,EAGZ,CAGD,OAAIlD,GAAQA,EAAK,SAAW,IAAMA,EAAK,SAASkD,CAAU,GAAKlD,EAAK,SAASiD,CAAO,GAC3E,GACEjD,EAEFc,GAAgBd,CAAI,EACjB,CAAAA,CAMd,EAEImD,GAAyCC,GAAc,MAAS,EAChEC,GAAuB,UAAgC,CACzD,OAAOC,GAAWH,EAAyB,CAC7C,EAcA,SAASI,GAAUC,EAAGC,EAAG,CAEvB,OAAOD,GAAKC,GAAK,OAAOD,GAAM,UAAY,OAAOC,GAAM,SAAW,OAAO,KAAKD,CAAC,EAAE,SAAW,OAAO,KAAKC,CAAC,EAAE,QAE3G,OAAO,KAAKD,CAAC,EAAE,OAAO,SAAUE,EAAS7D,EAAK,CAC5C,OAAO6D,GAAWH,GAAUC,EAAE3D,CAAG,EAAG4D,EAAE5D,CAAG,CAAC,CAC9C,EAAK,EAAI,EAAI2D,IAAMC,CACnB,CAEA,IAAIE,GAA8BP,GAAc,CAC9C,QAAS,CAAE,EACX,cAAe,CAAE,EACjB,YAAa,UAAuB,CAAE,EACtC,YAAa,UAAuB,CAAE,EACtC,aAAc,UAAwB,CAAE,CAC1C,CAAC,EACGQ,GAAoB,UAA6B,CACnD,OAAON,GAAWK,EAAc,CAClC,EAgFA,SAASE,GAAiBhD,EAAO,CAC/B,IAAIiD,EAAMC,EAAO,MAAS,EAC1B,OAAKR,GAAUO,EAAI,QAASjD,CAAK,IAC/BiD,EAAI,QAAUjD,GAETiD,EAAI,OACb,CAEA,IAAIE,GAAkB,SAAyBzE,EAAG,CAChDA,EAAE,gBAAe,EACjBA,EAAE,eAAc,EAChBA,EAAE,yBAAwB,CAC5B,EACI0E,GAAsB,OAAO,OAAW,IAAcC,GAAkBC,GAC5E,SAASC,GAAWpE,EAAMqE,EAAUC,EAASC,EAAc,CACzD,IAAIC,EAAYC,EAAS,IAAI,EAC3BX,EAAMU,EAAU,CAAC,EACjBE,EAASF,EAAU,CAAC,EAClBG,EAAkBZ,EAAO,EAAK,EAC9Ba,EAAaN,aAAmB,MAAqBC,aAAwB,MAAwB,OAAfA,EAA7CD,EACzCO,EAAQjE,GAAgBZ,CAAI,EAAIA,EAAK,KAAK4E,GAAY,KAAO,OAASA,EAAS,QAAQ,EAAI5E,EAC3F8E,EAAQR,aAAmB,MAAQA,EAAUC,aAAwB,MAAQA,EAAe,OAC5FQ,EAAaC,GAAYX,EAAUS,GAAwB,EAAE,EAC7DG,EAAQlB,EAAOgB,CAAU,EACzBD,EACFG,EAAM,QAAUF,EAEhBE,EAAM,QAAUZ,EAElB,IAAIa,EAAkBrB,GAAiBe,CAAQ,EAC3CO,EAAqBvB,GAAmB,EAC1CwB,EAAgBD,EAAmB,cACjCE,EAAQhC,KACZ,OAAAY,GAAoB,UAAY,CAC9B,GAAK,GAAAiB,GAAmB,KAAO,OAASA,EAAgB,WAAa,IAAS,CAAClD,GAAcoD,EAAeF,GAAmB,KAAO,OAASA,EAAgB,MAAM,GAGrK,KAAII,EAAW,SAAkB/F,EAAGgG,EAAS,CAC3C,IAAIC,EAIJ,GAHID,IAAY,SACdA,EAAU,IAER,EAAAnE,GAAgC7B,CAAC,GAAK,CAAC+B,GAAqB/B,EAAG2F,GAAmB,KAAO,OAASA,EAAgB,gBAAgB,GAKtI,IAAIpB,IAAQ,KAAM,CAChB,IAAI2B,EAAW3B,EAAI,cACnB,IAAK2B,aAAoB,UAAYA,aAAoB,aAAeA,EAAS,gBAAkB3B,GAAO,CAACA,EAAI,SAAS2B,EAAS,aAAa,EAAG,CAC/IzB,GAAgBzE,CAAC,EACjB,MACD,CACF,EACIiG,EAAYjG,EAAE,SAAW,MAAQiG,EAAU,mBAAqB,EAAEN,GAAmB,MAAQA,EAAgB,0BAGlHnF,GAAmB8E,EAAOK,GAAmB,KAAO,OAASA,EAAgB,QAAQ,EAAE,QAAQ,SAAUrF,EAAK,CAC5G,IAAI6F,EACAvF,EAASD,GAAYL,EAAKqF,GAAmB,KAAO,OAASA,EAAgB,cAAc,EAC/F,GAAI9C,GAA8B7C,EAAGY,EAAQ+E,GAAmB,KAAO,OAASA,EAAgB,eAAe,IAAMQ,EAAevF,EAAO,OAAS,MAAQuF,EAAa,SAAS,GAAG,EAAG,CAItL,GAHIR,GAAmB,MAAQA,EAAgB,iBAAmB,MAAQA,EAAgB,gBAAgB3F,CAAC,GAGvGgG,GAAWZ,EAAgB,QAC7B,OAGF,GADA3D,GAAoBzB,EAAGY,EAAQ+E,GAAmB,KAAO,OAASA,EAAgB,cAAc,EAC5F,CAAChE,GAAgB3B,EAAGY,EAAQ+E,GAAmB,KAAO,OAASA,EAAgB,OAAO,EAAG,CAC3FlB,GAAgBzE,CAAC,EACjB,MACD,CAED0F,EAAM,QAAQ1F,EAAGY,CAAM,EAClBoF,IACHZ,EAAgB,QAAU,GAE7B,CACT,CAAO,EACP,EACQgB,EAAgB,SAAuBpE,EAAO,CAC5CA,EAAM,MAAQ,SAIlBd,GAA2Bb,GAAO2B,EAAM,IAAI,CAAC,IACxC2D,GAAmB,KAAO,OAASA,EAAgB,WAAa,SAAcA,GAAmB,KAAO,OAASA,EAAgB,SAAW,IAAQA,GAAmB,MAAQA,EAAgB,UAClMI,EAAS/D,CAAK,EAEtB,EACQqE,EAAc,SAAqBrE,EAAO,CACxCA,EAAM,MAAQ,SAIlBb,GAA+Bd,GAAO2B,EAAM,IAAI,CAAC,EACjDoD,EAAgB,QAAU,GACtBO,GAAmB,MAAQA,EAAgB,OAC7CI,EAAS/D,EAAO,EAAI,EAE5B,EACQsE,EAAU/B,IAAQc,GAAY,KAAO,OAASA,EAAS,WAAa,SAExE,OAAAiB,EAAQ,iBAAiB,QAASD,CAAW,EAE7CC,EAAQ,iBAAiB,UAAWF,CAAa,EAC7CN,GACFtF,GAAmB8E,EAAOK,GAAmB,KAAO,OAASA,EAAgB,QAAQ,EAAE,QAAQ,SAAUrF,EAAK,CAC5G,OAAOwF,EAAM,UAAUnF,GAAYL,EAAKqF,GAAmB,KAAO,OAASA,EAAgB,eAAgBA,GAAmB,KAAO,OAASA,EAAgB,WAAW,CAAC,CAClL,CAAO,EAEI,UAAY,CAEjBW,EAAQ,oBAAoB,QAASD,CAAW,EAEhDC,EAAQ,oBAAoB,UAAWF,CAAa,EAChDN,GACFtF,GAAmB8E,EAAOK,GAAmB,KAAO,OAASA,EAAgB,QAAQ,EAAE,QAAQ,SAAUrF,EAAK,CAC5G,OAAOwF,EAAM,aAAanF,GAAYL,EAAKqF,GAAmB,KAAO,OAASA,EAAgB,eAAgBA,GAAmB,KAAO,OAASA,EAAgB,WAAW,CAAC,CACvL,CAAS,CAET,EACG,EAAE,CAACpB,EAAKe,EAAOK,EAAiBE,CAAa,CAAC,EACxCV,CACT;;;;;;mCCleC,SAASoB,EAAMC,EAAS,CACWC,EAAO,QACvCA,EAAA,QAAiBD,IAEjBD,EAAK,SAAWC,GAEpB,GAAGE,GAAM,SAASC,EAAQ,CAExB,IAAIC,EAAW,SAAS7B,EAAS,CAE7B,OAAO,IAAI6B,EAAS,IAAI,KAAK7B,CAAO,CACrC,EAED8B,EAAU,SAGZD,EAAS,SAAW,CAClB,YAAa,GACb,KAAM,uBACN,KAAM,OACN,SAAU,IACV,SAAU,OACV,SAAU,UAAY,CACrB,EACD,YAAa,OACb,UAAW,GACX,MAAO,GACP,QAAS,eACT,aAAc,GACd,SAAU,GACV,gBAAiB,GACjB,OAAQ,GACR,UAAW,GACX,YAAa,GACb,QAAS,UAAY,CACpB,EACD,OAAQ,CAAC,EAAG,EAAG,EAAG,CAAC,EACnB,aAAc,GACd,SAAU,SACV,MAAO,CAAC,WAAY,EAAE,CAC1B,EAGEA,EAAS,IAAMA,EAAS,UAAY,CAClC,SAAUC,EAEV,YAAaD,EAGb,KAAM,SAAS7B,EAAS,CAEtB,OAAKA,IACHA,EAAU,IAIZ,KAAK,QAAU,GAEf,KAAK,aAAe,KAGpB,KAAK,QAAQ,KAAOA,EAAQ,MAAQ6B,EAAS,SAAS,KACtD,KAAK,QAAQ,KAAO7B,EAAQ,MAAQ6B,EAAS,SAAS,KACtD,KAAK,QAAQ,SAAW7B,EAAQ,WAAa,EAAI,EAAIA,EAAQ,UAAY6B,EAAS,SAAS,SAC3F,KAAK,QAAQ,SAAW7B,EAAQ,UAAY6B,EAAS,SAAS,SAC9D,KAAK,QAAQ,SAAW7B,EAAQ,UAAY6B,EAAS,SAAS,SAC9D,KAAK,QAAQ,YAAc7B,EAAQ,aAAe6B,EAAS,SAAS,YACpE,KAAK,QAAQ,UAAY7B,EAAQ,WAAa6B,EAAS,SAAS,UAChE,KAAK,QAAQ,MAAQ7B,EAAQ,OAAS6B,EAAS,SAAS,MACxD,KAAK,QAAQ,QAAU7B,EAAQ,UAAY,SAAW,kBAAoB6B,EAAS,SAAS,QAC5F,KAAK,QAAQ,aAAe7B,EAAQ,cAAgB6B,EAAS,SAAS,aACtE,KAAK,QAAQ,SAAW7B,EAAQ,UAAY6B,EAAS,SAAS,SAC9D,KAAK,QAAQ,gBAAkB7B,EAAQ,iBAAmB6B,EAAS,SAAS,gBAC5E,KAAK,QAAQ,OAAS7B,EAAQ,QAAU6B,EAAS,SAAS,OAC1D,KAAK,QAAQ,UAAY7B,EAAQ,WAAa6B,EAAS,SAAS,UAChE,KAAK,QAAQ,YAAc7B,EAAQ,cAAgB,OAAY6B,EAAS,SAAS,YAAc7B,EAAQ,YACvG,KAAK,QAAQ,QAAUA,EAAQ,SAAW6B,EAAS,SAAS,QAC5D,KAAK,QAAQ,OAAS7B,EAAQ,QAAU6B,EAAS,SAAS,OAC1D,KAAK,QAAQ,aAAe7B,EAAQ,eAAiB,OAAYA,EAAQ,aAAe6B,EAAS,SAAS,aAC1G,KAAK,QAAQ,SAAW7B,EAAQ,UAAY6B,EAAS,SAAS,SAC9D,KAAK,QAAQ,MAAQ7B,EAAQ,OAAS6B,EAAS,SAAS,MACrD7B,EAAQ,kBACT,KAAK,QAAQ,MAAM,WAAaA,EAAQ,iBAInC,IACR,EAGD,WAAY,UAAW,CAErB,GAAI,CAAC,KAAK,QACR,KAAM,8BAIR,IAAI+B,EAAa,SAAS,cAAc,KAAK,EAC7CA,EAAW,UAAY,eAAiB,KAAK,QAAQ,UAG/C,KAAK,QAAQ,SACjBA,EAAW,WAAa,aAAe,KAAK,QAAQ,SAGhD,KAAK,QAAQ,eAAiB,IAChCA,EAAW,WAAa,iBACxB,QAAQ,KAAK,iGAAiG,GAG9GA,EAAW,WAAa,kBAK5BA,EAAW,WAAa,IAAM,KAAK,QAAQ,QAEvC,KAAK,QAAQ,iBAEf,QAAQ,KAAK,wGAAwG,EAIvH,QAASC,KAAY,KAAK,QAAQ,MAChCD,EAAW,MAAMC,CAAQ,EAAI,KAAK,QAAQ,MAAMA,CAAQ,EAS1D,GALI,KAAK,QAAQ,UACfD,EAAW,aAAa,YAAa,KAAK,QAAQ,QAAQ,EAIxD,KAAK,QAAQ,MAAQ,KAAK,QAAQ,KAAK,WAAa,KAAK,aAE3DA,EAAW,YAAY,KAAK,QAAQ,IAAI,UAEpC,KAAK,QAAQ,aACfA,EAAW,UAAY,KAAK,QAAQ,KAEpCA,EAAW,UAAY,KAAK,QAAQ,KAGlC,KAAK,QAAQ,SAAW,GAAI,CAC9B,IAAIE,EAAgB,SAAS,cAAc,KAAK,EAChDA,EAAc,IAAM,KAAK,QAAQ,OAEjCA,EAAc,UAAY,kBAEtB,KAAK,QAAQ,UAAY,QAAU,KAAK,QAAQ,eAAiB,GAEnEF,EAAW,YAAYE,CAAa,EAGpCF,EAAW,sBAAsB,aAAcE,CAAa,CAE/D,CAIH,GAAI,KAAK,QAAQ,QAAU,GAAM,CAE/B,IAAIC,EAAe,SAAS,cAAc,QAAQ,EAClDA,EAAa,KAAO,SACpBA,EAAa,aAAa,aAAc,OAAO,EAC/CA,EAAa,UAAY,cACzBA,EAAa,UAAY,WAGzBA,EAAa,iBACX,SACA,SAASjF,EAAO,CACdA,EAAM,gBAAe,EACrB,KAAK,cAAc,KAAK,YAAY,EACpC,OAAO,aAAa,KAAK,aAAa,YAAY,CAC9D,GAAY,KAAK,IAAI,CACrB,EAGQ,IAAIkF,EAAQ,OAAO,WAAa,EAAI,OAAO,WAAa,OAAO,OAI1D,KAAK,QAAQ,UAAY,QAAU,KAAK,QAAQ,eAAiB,KAASA,EAAQ,IAErFJ,EAAW,sBAAsB,aAAcG,CAAY,EAG3DH,EAAW,YAAYG,CAAY,CAEtC,CAGD,GAAI,KAAK,QAAQ,aAAe,KAAK,QAAQ,SAAW,EAAG,CACzD,IAAIE,EAAO,KAEXL,EAAW,iBACT,YACA,SAAS9E,EAAO,CACd,OAAO,aAAa8E,EAAW,YAAY,CAC5C,CACF,EAEDA,EAAW,iBACT,aACA,UAAW,CACTA,EAAW,aAAe,OAAO,WAC/B,UAAW,CAETK,EAAK,cAAcL,CAAU,CAC9B,EACDK,EAAK,QAAQ,QACd,CACF,CACF,CACF,CA4BD,GAzBI,OAAO,KAAK,QAAQ,YAAgB,KACtCL,EAAW,iBACT,SACA,SAAS9E,EAAO,CACdA,EAAM,gBAAe,EACjB,KAAK,QAAQ,YAAc,GAC7B,OAAO,KAAK,KAAK,QAAQ,YAAa,QAAQ,EAE9C,OAAO,SAAW,KAAK,QAAQ,WAE7C,GAAY,KAAK,IAAI,CACrB,EAGU,OAAO,KAAK,QAAQ,SAAY,YAAc,OAAO,KAAK,QAAQ,YAAgB,KACpF8E,EAAW,iBACT,SACA,SAAS9E,EAAO,CACdA,EAAM,gBAAe,EACrB,KAAK,QAAQ,SACzB,GAAY,KAAK,IAAI,CACrB,EAIS,OAAO,KAAK,QAAQ,QAAW,SAAU,CAE1C,IAAIiC,EAAImD,EAAoB,IAAK,KAAK,OAAO,EACzClD,EAAIkD,EAAoB,IAAK,KAAK,OAAO,EAEzCC,EAAU,KAAK,QAAQ,UAAY,OAASpD,EAAI,IAAMA,EACtDqD,EAAU,KAAK,QAAQ,SAAW,eAAiBpD,EAAI,IAAMA,EAEjE4C,EAAW,MAAM,UAAY,aAAeO,EAAU,IAAMC,EAAU,GAEvE,CAGD,OAAOR,CACR,EAGD,UAAW,UAAW,CAEpB,KAAK,aAAe,KAAK,aAGzB,IAAIS,EAUJ,GATI,OAAO,KAAK,QAAQ,UAAa,SACnCA,EAAc,SAAS,eAAe,KAAK,QAAQ,QAAQ,EAClD,KAAK,QAAQ,oBAAoB,aAAgB,OAAO,WAAe,KAAe,KAAK,QAAQ,oBAAoB,WAChIA,EAAc,KAAK,QAAQ,SAE3BA,EAAc,SAAS,KAIrB,CAACA,EACH,KAAM,8BAIR,IAAIC,EAAkBZ,EAAS,SAAS,YAAcW,EAAY,WAAaA,EAAY,UAC3F,OAAAA,EAAY,aAAa,KAAK,aAAcC,CAAe,EAG3DZ,EAAS,WAAU,EAEf,KAAK,QAAQ,SAAW,IAC1B,KAAK,aAAa,aAAe,OAAO,YACtC,UAAW,CAET,KAAK,cAAc,KAAK,YAAY,CAChD,GAAY,KAAK,IAAI,EACX,KAAK,QAAQ,QACvB,GAIa,IACR,EAED,UAAW,UAAW,CAChB,KAAK,aAAa,cACpB,aAAa,KAAK,aAAa,YAAY,EAE7C,KAAK,cAAc,KAAK,YAAY,CACrC,EAGD,cAAe,SAASa,EAAc,CAGpCA,EAAa,UAAYA,EAAa,UAAU,QAAQ,MAAO,EAAE,EAGjE,OAAO,YACL,UAAW,CAEL,KAAK,QAAQ,MAAQ,KAAK,QAAQ,KAAK,YACzC,KAAK,QAAQ,KAAK,WAAW,YAAY,KAAK,QAAQ,IAAI,EAIxDA,EAAa,YACfA,EAAa,WAAW,YAAYA,CAAY,EAIlD,KAAK,QAAQ,SAAS,KAAKA,CAAY,EAGvCb,EAAS,WAAU,CAC7B,GAAU,KAAK,IAAI,EACX,GACR,CACK,CACL,EAGEA,EAAS,WAAa,UAAW,CAsB/B,QAnBIc,EAAoB,CACtB,IAAK,GACL,OAAQ,EACd,EACQC,EAAqB,CACvB,IAAK,GACL,OAAQ,EACd,EACQC,EAAa,CACf,IAAK,GACL,OAAQ,EACd,EAGQC,EAAY,SAAS,uBAAuB,UAAU,EAEtDC,EAGKC,EAAI,EAAGA,EAAIF,EAAU,OAAQE,IAAK,CAErCC,EAAcH,EAAUE,CAAC,EAAG,cAAc,IAAM,GAClDD,EAAY,eAEZA,EAAY,kBAGd,IAAIG,EAASJ,EAAUE,CAAC,EAAE,aAC1BD,EAAYA,EAAU,OAAO,EAAGA,EAAU,OAAO,CAAC,EAElD,IAAII,EAAS,GAEThB,EAAQ,OAAO,WAAa,EAAI,OAAO,WAAa,OAAO,MAG3DA,GAAS,KAEXW,EAAUE,CAAC,EAAE,MAAMD,CAAS,EAAIF,EAAWE,CAAS,EAAI,KAExDF,EAAWE,CAAS,GAAKG,EAASC,GAE9BF,EAAcH,EAAUE,CAAC,EAAG,eAAe,IAAM,IAEnDF,EAAUE,CAAC,EAAE,MAAMD,CAAS,EAAIJ,EAAkBI,CAAS,EAAI,KAE/DJ,EAAkBI,CAAS,GAAKG,EAASC,IAGzCL,EAAUE,CAAC,EAAE,MAAMD,CAAS,EAAIH,EAAmBG,CAAS,EAAI,KAEhEH,EAAmBG,CAAS,GAAKG,EAASC,EAG/C,CAGD,OAAO,IACX,EAGE,SAASd,EAAoBe,EAAMpD,EAAS,CAE1C,OAAGA,EAAQ,OAAOoD,CAAI,EACjB,MAAMpD,EAAQ,OAAOoD,CAAI,CAAC,EACpBpD,EAAQ,OAAOoD,CAAI,EAGnBpD,EAAQ,OAAOoD,CAAI,EAAI,KAI3B,KAER,CAED,SAASH,EAAcI,EAAMC,EAAW,CACtC,MAAI,CAACD,GAAQ,OAAOC,GAAc,SACzB,GAEP,GAAAD,EAAK,WACLA,EAAK,UACF,KAAM,EACN,MAAM,OAAO,EACb,QAAQC,CAAS,EAAI,GAM3B,CAGD,OAAAzB,EAAS,IAAI,KAAK,UAAYA,EAAS,IAGhCA,CACT,CAAC,0CC1bD0B,OAAOC,WAAaC,GAEpB,SAASA,GAAUC,EAAO,CACpB,OAAOA,GAAU,WACnBA,EAAQ,CAAEC,KAAMD,IAElB,KAAM,CAAEE,UAASC,QAAO,GAAGC,CAAM,EAAGJ,EAC9BK,EAAQlC,GAAS,CACrBmC,UAAW,GAAGJ,GAAWF,EAAMO,YAAc,aAAe,EAAE,GAC9DC,QAAS,SACTC,SAAU,SACV,GAAGL,EACHF,QAASA,IAAM,CACbA,WAAUG,EACZ,CACF,CAAC,EACD,OAAIF,EACFO,WAAW,IAAM,CACfL,EAAMN,UAAS,CAChB,EAAEI,CAAK,EAERE,EAAMN,UAAS,EAEVM,CACT,CCxBA,SAASM,GAAYC,EAAIT,EAAOU,EAAMC,EAAW,CAC/C,MAAMC,EAAgBhF,EAAO6E,CAAE,EAC/BzE,GAAU,IAAM,CACd4E,EAAcC,QAAUJ,CAC1B,EAAG,CAACA,EAAIC,CAAI,CAAC,EAEb1E,GAAU,IAAM,CACV,CAAC2E,GAAaX,IAAU,MAAQA,IAAU,IAC9CY,EAAcC,QAAO,CACvB,EAAG,CAACF,CAAS,CAAC,EAEd3E,GAAU,IAAM,CACd,GAAIgE,IAAU,MAAQA,IAAU,GAAO,OAEvC,MAAMc,EAAKC,YADEC,IAAMJ,EAAcC,UACJb,CAAK,EAClC,MAAO,IAAMiB,cAAcH,CAAE,CAC/B,EAAG,CAACd,CAAK,CAAC,CACZ,CCjBe,SAASkB,GAAYC,EAAM,CACxC,MAAMC,EAAMC,IAAIC,MAAM,YAAa5B,OAAO6B,QAAQ,EAC5C,CAAEjD,MAAOkD,EAAanC,OAAQoC,GAAiB/B,OAAOgC,OACtDC,EAAOC,KAAKC,IAAI,GAAIL,EAAc,KAAO,CAAC,EAC1CM,EAAMF,KAAKC,IAAI,GAAIJ,EAAe,KAAO,CAAC,EAC1CnD,EAAQsD,KAAKG,IAAIP,EAAa,GAAG,EACjCnC,EAASuC,KAAKG,IAAIN,EAAc,GAAG,EACnCO,GAASb,iBAAMc,MAAOL,KAAKM,OAAM,EACjCC,EAASzC,OAAO0C,KACpBhB,EACA,UAAYY,EACZ,SAAS1D,CAAK,WAAWe,CAAM,SAASsC,CAAI,QAAQG,CAAG,EACzD,EAEA,OAAIK,EAKFA,EAAOE,YAAclB,EAErBmB,MAAKC,EAAAC,EAAC,CAAA1B,GAAA,QAA8C,EAAC,EAGhDqB,CACT,CC3BA,MAAMM,GAAW,iCAAiCC,KAAKC,UAAUC,SAAS,EAE3D,SAASC,IAAU,CAChC,GAAIJ,GAAU,CACZ,MAAMK,EAASC,SAASC,cAAc,OAAO,EAC7CF,EAAOG,MAAM3C,SAAW,WACxBwC,EAAOG,MAAMnB,IAAM,IACnBgB,EAAOG,MAAMtB,KAAO,IACpBmB,EAAOG,MAAMC,QAAU,IACvBH,SAASI,KAAKC,YAAYN,CAAM,EAChCA,EAAOO,MAAK,EACZ9C,WAAW,IAAM,CACfwC,SAASI,KAAKG,YAAYR,CAAM,CACjC,EAAE,GAAG,CACR,CACF,CCfO,MAAMS,GAAQ,CACnBlI,EAAGA,IAAMmI,EAAA,WAAO,gCAAoC,sBACpDC,MAAOA,IAAMD,EAAA,WAAO,gCAAoC,sBACxDE,SAAUA,IAAMF,EAAA,WAAO,mCAAuC,sBAC9D,eAAgBG,IAAMH,EAAA,WAAO,uCAA2C,sBACxE,WAAYI,IAAMJ,EAAA,WAAO,uCAA2C,sBACpEK,SAAUA,IAAML,EAAA,WAAO,qCAAyC,sBAChEM,OAAQA,IAAMN,EAAA,WAAO,iCAAqC,sBAC1D,aAAc,CACZ3F,OAAQA,IAAM2F,EAAA,WAAO,qCAAyC,sBAC9DO,IAAK,EACP,EACA,cAAe,CACblG,OAAQA,IAAM2F,EAAA,WAAO,sCAA0C,sBAC/DO,IAAK,EACP,EACA,WAAYC,IAAMR,EAAA,WAAO,mCAAuC,sBAChE,aAAcS,IAAMT,EAAA,WAAO,qCAAyC,sBACpEU,MAAOA,IAAMV,EAAA,WAAO,gCAAoC,sBACxDW,KAAMA,IAAMX,EAAA,WAAO,+BAAmC,sBACtDY,OAAQA,IAAMZ,EAAA,WAAO,iCAAqC,sBAC1D,YAAaa,IAAMb,EAAA,WAAO,oCAAwC,sBAClE,WAAYc,IAAMd,EAAA,WAAO,gCAAoC,sBAC7De,QAASA,IAAMf,EAAA,WAAO,+BAAmC,sBACzDgB,QAAS,CACP3G,OAAQA,IAAM2F,EAAA,WAAO,iCAAqC,sBAC1DO,IAAK,EACP,EACAU,SAAU,CACR5G,OAAQA,IAAM2F,EAAA,WAAO,oCAAwC,sBAC7DO,IAAK,EACP,EACAW,KAAMA,IAAMlB,EAAA,WAAO,iCAAqC,sBACxDmB,aAAcA,IAAMnB,EAAA,WAAO,uCAA2C,sBACtEoB,OAAQA,IAAMpB,EAAA,WAAO,sCAA0C,sBAC/D,aAAcqB,IAAMrB,EAAA,WAAO,mCAAuC,sBAClEsB,KAAM,CAAC,IAAMtB,EAAA,WAAO,oCAAwC,sBAAG,OAAO,EACtEuB,OAAQA,IAAMvB,EAAA,WAAO,iCAAqC,sBAC1DwB,MAAOA,IAAMxB,EAAA,WAAO,oCAAwC,sBAC5DyB,GAAIA,IAAMzB,EAAA,WAAO,6BAAiC,sBAClD0B,WAAYA,IAAM1B,EAAA,WAAO,qCAAyC,sBAClE2B,OAAQA,IAAM3B,EAAA,WAAO,mCAAuC,sBAC5D4B,KAAMA,IAAM5B,EAAA,WAAO,qCAAyC,sBAC5D6B,KAAMA,IAAM7B,EAAA,WAAO,iCAAqC,sBACxD8B,MAAOA,IAAM9B,EAAA,WAAO,iCAAqC,sBACzD+B,SAAU,CACR1H,OAAQA,IAAM2F,EAAA,WAAO,wCAA4C,sBACjEO,IAAK,EACP,EACAyB,OAAQ,CACN3H,OAAQA,IAAM2F,EAAA,WAAO,wCAA4C,sBACjEO,IAAK,EACP,EACA0B,MAAO,CACL5H,OAAQA,IAAM2F,EAAA,WAAO,wCAA4C,sBACjEkC,OAAQ,SACR3B,IAAK,EACP,EACA4B,KAAMA,IAAMnC,EAAA,WAAO,qCAAyC,sBAC5D,eAAgB,CACd3F,OAAQA,IAAM2F,EAAA,WAAO,+BAAmC,sBACxDO,IAAK,EACP,EACA,gBAAiB,CACflG,OAAQA,IAAM2F,EAAA,WAAO,gCAAoC,sBACzDO,IAAK,EACP,EACA,eAAgB6B,IAAMpC,EAAA,WAAO,+BAAmC,sBAChEqC,MAAO,CACLhI,OAAQA,IAAM2F,EAAA,WAAO,wCAA4C,sBACjEkC,OAAQ,SACRI,KAAM,aACN/B,IAAK,EACP,EACAgC,OAAQA,IAAMvC,EAAA,WAAO,gCAAoC,sBACzDwC,MAAO,CACLnI,OAAQA,IAAM2F,EAAA,WAAO,gCAAoC,sBACzDO,IAAK,EACP,EACAkC,IAAKA,IAAMzC,EAAA,WAAO,oCAAwC,sBAC1D0C,KAAMA,IAAM1C,EAAA,WAAO,iCAAqC,sBACxD2C,KAAM,CACJtI,OAAQA,IAAM2F,EAAA,WAAO,qCAAyC,sBAC9DO,IAAK,EACP,EACAqC,OAAQA,IAAM5C,EAAA,WAAO,mCAAuC,sBAC5D6C,QAASA,IAAM7C,EAAA,WAAO,kCAAsC,sBAC5D8C,KAAMA,IAAM9C,EAAA,WAAO,sCAA0C,sBAC7D+C,SAAUA,IAAM/C,EAAA,WAAO,oCAAwC,sBAC/DgD,KAAMA,IAAMhD,EAAA,WAAO,iCAAqC,sBACxDiD,UAAWA,IAAMjD,EAAA,WAAO,+BAAmC,sBAC3DkD,IAAKA,IAAMlD,EAAA,WAAO,8BAAkC,sBACpDmD,MAAO,CAAC,IAAAnD,EAAA,IAAM,OAAO,8BAAkC,sBAAG,QAAQ,EAClEoD,IAAKA,IAAMpD,EAAA,WAAO,gCAAoC,sBACtDqD,KAAMA,IAAMrD,EAAA,WAAO,iCAAqC,sBACxDsD,QAASA,IAAMtD,EAAA,WAAO,kCAAsC,sBAC5DuD,MAAOA,IAAMvD,EAAA,WAAO,kCAAsC,sBAC1DwD,SAAUA,IAAMxD,EAAA,WAAO,mCAAuC,sBAC9DyD,UAAWA,IAAMzD,EAAA,WAAO,qCAAyC,sBACjE0D,KAAM,CACJrJ,OAAQA,IAAM2F,EAAA,WAAO,+BAAmC,sBACxDO,IAAK,EACP,EACAoD,UAAWA,IAAM3D,EAAA,WAAO,oCAAwC,sBAChE4D,KAAMA,IAAM5D,EAAA,WAAO,+BAAmC,sBACtD6D,MAAOA,IAAM7D,EAAA,WAAO,mCAAuC,sBAC3D8D,KAAM,CACJzJ,OAAQA,IAAM2F,EAAA,WAAO,sCAA0C,sBAC/DO,IAAK,EACP,EACAwD,OAAQ,CACN1J,OAAQA,IAAM2F,EAAA,WAAO,iCAAqC,sBAC1DO,IAAK,EACP,EACAyD,MAAOA,IAAMhE,EAAA,WAAO,wCAA4C,sBAChEiE,QAAS,CACP,IAAMjE,EAAA,WAAO,wCAA4C,sBACzD,QAAQ,EAEVkE,KAAMA,IAAMlE,EAAA,WAAO,iCAAqC,sBACxDmE,KAAMA,IAAMnE,EAAA,WAAO,+BAAmC,sBACtDoE,QAASA,IAAMpE,EAAA,WAAO,oCAAwC,sBAC9DqE,OAAQA,IAAMrE,EAAA,WAAO,kCAAsC,sBAC3DsE,OAAQA,IAAMtE,EAAA,WAAO,mCAAuC,sBAC5DuE,QAASA,IAAMvE,EAAA,WAAO,iCAAqC,sBAC3DwE,MAAOA,IAAMxE,EAAA,WAAO,qCAAyC,sBAC7DyE,MAAOA,IAAMzE,EAAA,WAAO,gCAAoC,sBACxD0E,QAAS,CACPrK,OAAQA,IAAM2F,EAAA,WAAO,mCAAuC,sBAC5DO,IAAK,EACP,EACAoE,QAASA,IAAM3E,EAAA,WAAO,mCAAuC,sBAC7D4E,SAAU,CACRvK,OAAQA,IAAM2F,EAAA,WAAO,uCAA2C,sBAChEO,IAAK,EACP,EACAzB,MAAOA,IAAMkB,EAAA,WAAO,gCAAoC,sBACxD6E,MAAOA,IAAM7E,EAAA,WAAO,gCAAoC,sBACxD,kBAAmB8E,IACjB9E,EAAA,WAAO,0CAA8C,sBACvD,oBAAqB+E,IACnB/E,EAAA,WAAO,4CAAgD,sBACzDgF,UAAW,CACT3K,OAAQA,IAAM2F,EAAA,WAAO,oCAAwC,sBAC7DO,IAAK,EACP,EACA,eAAgB0E,IAAMjF,EAAA,WAAO,oCAAwC,sBACrE,kBAAmBkF,IAAMlF,EAAA,WAAO,uCAA2C,sBAC3EmF,SAAUA,IAAMnF,EAAA,WAAO,mCAAuC,sBAC9DoF,MAAOA,IAAMpF,EAAA,WAAO,gCAAoC,sBACxDqF,MAAO,CACLhL,OAAQA,IAAM2F,EAAA,WAAO,yCAA6C,sBAClEO,IAAK,EACP,EACA+E,MAAOA,IAAMtF,EAAA,WAAO,sCAA0C,sBAC9DuF,MAAOA,IAAMvF,EAAA,WAAO,gCAAoC,sBACxDwF,SAAUA,IAAMxF,EAAA,WAAO,qCAAyC,sBAChEyF,SAAU,CACRpL,OAAQA,IAAM2F,EAAA,WAAO,oCAAwC,sBAC7DO,IAAK,EACP,EACAhB,SAAUA,IAAMS,EAAA,WAAO,mCAAuC,sBAC9D,eAAgB,CACd3F,OAAQA,IAAM2F,EAAA,WAAO,uCAA2C,sBAChEO,IAAK,EACP,EACAtJ,KAAMA,IAAM+I,EAAA,WAAO,+BAAmC,sBACtD0F,KAAMA,IAAM1F,EAAA,WAAO,iCAAqC,sBACxD2F,MAAO,CACLtL,OAAQA,IAAM2F,EAAA,WAAO,qCAAyC,sBAC9DO,IAAK,EACP,EACAqF,SAAUA,IAAM5F,EAAA,WAAO,qCAAyC,sBAChE,cAAe6F,IAAM7F,EAAA,WAAO,sCAA0C,sBACtE,SAAU8F,IAAM9F,EAAA,WAAO,iCAAqC,sBAC5D+F,SAAUA,IAAM/F,EAAA,WAAO,sCAA0C,qBACnE,EC3KMgG,GAAQ,CACZC,EAAG,GACHC,EAAG,GACHC,EAAG,GACHC,GAAI,GACJC,IAAK,EACP,EAEMC,GAAW,GAGXC,GAAUC,GACd,SAAU,CAAE1L,QAAOe,SAAQ8D,OAAMuC,SAAQI,MAAK,EAAG,CAC/C,OACEmE,EAAA,OACEC,QAAS,OAAO5L,CAAK,IAAIe,CAAM,GAC/B8K,wBAAyB,CAAEC,OAAQjH,CAAK,EACxCF,MAAO,CACLoH,UAAW,GAAG3E,EAAS,UAAUA,CAAM,IAAM,EAAE,IAC7CI,EAAO,aAAe,EAAE,EAE5B,EACD,CAEL,EACA,CACEwE,eAAgB,GAChBC,QAASC,OAAO3S,KAAK0L,EAAK,EAAEkH,OAC5BC,WAAYA,CAACC,EAAaC,IACxBD,EAAYE,OAASD,EAAOC,MAAQF,EAAYxH,OAASyH,EAAOzH,IACpE,CACF,EAEA,SAAS2H,EAAK,CACZD,OACAE,OAAO,IACP5Q,MACA6Q,QACAC,MAAO9K,EAAY,GACnB8C,QAAQ,CAAC,CACX,EAAG,CACG,IAAC4H,EAAa,YAEZK,QAAW1B,GAAMuB,CAAI,EACvBI,MAAY5H,GAAMsH,CAAI,EAC1B,GAAI,CAACM,EACKC,YAEV,IAAA1F,EAAAI,EAAA/B,EAAA,GAEI2B,cAEF3B,CAAM,EACJsH,GAAcF,KAAYA,EAC3BA,OAAmBrF,GAAQqF,WAC9B,CACG,OAAAzF,EAAEA,OAAQI,KAAM/B,IAAIoH,EAAIA,UAE3B,MAAAG,EAAAC,CAAA,EAAAjP,EAAAwN,GAAAe,CAAA,GAEMW,EAAWD,KACXC,eACNxP,GAAgBwP,EAAA,UAAAX,KACVS,UACS,MAAAG,EAAA,MAAAN,IACLM,WAAwB,EAC9BF,QAAyB,OACzBzB,KACF0B,EAAG,QAAAX,EACHW,OACEX,EAAK,QAET,cACE1K,CAAA,IAAA4D,EAAA,gBACEkH,MAAOD,GAAQ7K,EACf6K,MAAOA,CACA,SAAAE,CAAA,KACL5M,UAAkB4M,CAAA,KAClB7L,IAAmB,EAErB,YAAAwL,EACA,SAAWA,GAEVS,aAaGT,cACAvM,OAAgBA,SAChBe,OAAiBA,KACjB8D,SACAuC,OACAI,GACD,CCzGT,SAAS4F,GAAgBjL,EAAIC,EAAO,GAAI,CAClC,CAACD,GAAM,OAAOA,GAAO,YACzBzE,GAAU,IAAM,CACd,MAAM2P,EAAU,IAAIC,aACpBD,SAAQE,iBAAiB,QAASpL,CAAE,EAC7B,IAAM,CACXkL,EAAQG,QAAO,EAElB,EAAEpL,CAAI,CACT,CAEA,MAAAqL,GAAerM,OAAOkM,aAAeF,GAAkB,IAAM,CAAE,ECLzDM,GAAkBjJ,SAASkJ,eAAe,iBAAiB,EAEjE,SAASC,GAAM,CAAEC,WAAUC,UAASrM,UAASkL,MAAO9K,EAAWkM,WAAU,EAAG,CACtE,IAACF,EAAiB,YAEtB,MAAMG,EAAW1Q,IACjBI,GAAU,IAAM,CACVuQ,MAAQhM,WAAW,IAAM,OAC3B,MAAMiM,GAAeF,IAASzL,UAATyL,cAAkBG,cAAc,mBACjDD,GACFA,EAAanJ,MAAM,GAEpB,GAAG,EACC,UAAMqJ,aAAaH,CAAK,CACjC,EAAG,CAAE,GAEL,MAAMI,EAAuBjN,OAAOkM,aAC9BgB,EAAS3Q,GACb,MACA,IAAM,CACJsE,WAAW,IAAM,CACL6L,GAAA,MAAAA,KACT,CAAC,GAEN,CACEpT,QAAS,CAAC2T,GAAwB,CAAC,CAACP,EAGpCS,QAAS,GACTC,MAAO,IAET,CAACV,CAAO,CACV,EACgBA,KAAS,CAACA,CAAO,CAAC,EAElCpQ,GAAU,IAAM,CACR+Q,QAAkBhK,SAASiK,iBAAiB,iBAAiB,EACnE,GAAIX,EAAW,CAGb,MAAMY,EAAOF,EAAgBA,EAAgBtC,OAAS,CAAC,EACnDwC,GAAQA,EAAKC,WAAa,IAC5BD,EAAK5J,MAAM,CACb,MAEI8I,EACFY,EAAgBI,QAA4BC,GAAA,CAC3BC,eAAa,QAAS,EAAE,EACxC,EAEDN,EAAgBI,QAA4BC,GAAA,CAC1CA,EAAeE,gBAAgB,OAAO,EACvC,EAGL,MAAO,IAAM,CACXP,EAAgBI,QAA4BC,GAAA,CAC1CA,EAAeE,gBAAgB,OAAO,EACvC,EACH,EACC,CAACnB,EAAUE,CAAS,CAAC,EAElBH,QACJjC,EAAA,OACEtO,IAAe4R,GAAA,OACbjB,EAASzL,QAAU0M,EACnBX,IAAOW,mBAAMd,gBAANc,qBAAsB,qBAAsBA,CAAI,CACzD,EACApN,YACAJ,QAAgB3I,GAAA,CACd2I,WAAU3I,GACNA,EAAEkC,SAAWlC,EAAEoW,gBACjBpB,WAAUhV,GAEd,EACA8V,SAAUb,EAAY,EAAI,KAC1BoB,MAAOpB,EACPqB,QAAgBtW,GAAA,SACV,IACEA,KAAEkC,SAAWlC,EAAEoW,cAAe,CAChC,MAAMhB,GACJF,IAASzL,UAATyL,cAAkBG,cAAc,mBAC5BkB,EACJ,CAAC,CAACnB,KACFoB,mBAAiBpB,CAAY,IAA7BoB,cAAgCC,iBAAkB,OAChDrB,GAAgBmB,GAClBnB,EAAanJ,MAAM,CAEvB,OACY,EACZyK,EACF,SAAA3B,CAAA,CACF,EAAEA,oCC3FJ4B,GAAuB,+CAE3BC,GAAiBD,GCFjB,IAAIA,GAAuBE,GAE3B,SAASC,IAAgB,CAAE,CAC3B,SAASC,IAAyB,CAAE,CACpCA,GAAuB,kBAAoBD,GAE3C,IAAAE,GAAiB,UAAW,CAC1B,SAASC,EAAKxO,EAAOyO,EAAUC,EAAehN,EAAUiN,EAAcC,EAAQ,CAC5E,GAAIA,IAAWV,GAIf,KAAIW,EAAM,IAAI,MACZ,iLAGN,EACI,MAAAA,EAAI,KAAO,sBACLA,EACV,CACEL,EAAK,WAAaA,EAClB,SAASM,GAAU,CACjB,OAAON,CACX,CAGE,IAAIO,EAAiB,CACnB,MAAOP,EACP,OAAQA,EACR,KAAMA,EACN,KAAMA,EACN,OAAQA,EACR,OAAQA,EACR,OAAQA,EACR,OAAQA,EAER,IAAKA,EACL,QAASM,EACT,QAASN,EACT,YAAaA,EACb,WAAYM,EACZ,KAAMN,EACN,SAAUM,EACV,MAAOA,EACP,UAAWA,EACX,MAAOA,EACP,MAAOA,EAEP,eAAgBR,GAChB,kBAAmBD,EACvB,EAEE,OAAAU,EAAe,UAAYA,EAEpBA,CACT,oBCzDA,GAAI,EACF,IAAAC,GAIAC,QAKOC,GAAA,QAAUd,sBCfnB,MAAMe,GAAaC,GAAS,CAAC,CAACA,GAASA,EAAM,CAAC,IAAM,IAC9CC,GAAiBC,KAA4BjT,GAAYA,EAAU,GAEzE,MAAMkT,GAAgB,CAACC,EAAYC,IAASD,IAAe,IAAQ,CAAC,EAAEA,GAAcA,EAAWC,CAAI,GAC7FC,GAAW,CAAC9O,EAAI+O,IAAQ,OAAO/O,GAAO,WAAaA,EAAG+O,CAAG,EAAI/O,EAC7DgP,GAAc,cACdC,GAAUC,GAAaA,EAAUF,EAAW,EAIlD,MAAMG,GAAa,CAACtW,EAAQuW,KAC1BA,GAAU,OAAO,KAAKA,CAAM,EAAE,QAAQnY,GAAO,CAC3C,MAAMoY,EAAaxW,EAAO5B,CAAG,EACvBqY,EAAaF,EAAOnY,CAAG,EACzB,OAAOqY,GAAe,YAAcD,EACtCxW,EAAO5B,CAAG,EAAI,IAAI8X,IAAQ,CACxBO,EAAW,GAAGP,CAAG,EACjBM,EAAW,GAAGN,CAAG,CACzB,EAEMlW,EAAO5B,CAAG,EAAIqY,CAEpB,CAAG,EACMzW,GAEH0W,GAAeC,GAAc,CACjC,GAAI,OAAOA,GAAe,SAAU,MAAO,CACzC,IAAK,EACL,MAAO,EACP,OAAQ,EACR,KAAM,CACV,EACE,MAAMC,EAAUD,EAAW,OAAO,MAAM,MAAO,CAAC,EAAE,IAAI,UAAU,EAC1DnO,EAAO,MAAMoO,EAAQ,CAAC,CAAC,EAAiB,EAAbA,EAAQ,CAAC,EACpCC,EAAS,MAAMD,EAAQ,CAAC,CAAC,EAAiBpO,EAAboO,EAAQ,CAAC,EAC5C,MAAO,CACL,IAAApO,EACA,MAAAqO,EACA,OAAS,MAAMD,EAAQ,CAAC,CAAC,EAAiBpO,EAAboO,EAAQ,CAAC,EACtC,KAAO,MAAMA,EAAQ,CAAC,CAAC,EAAiBC,EAAbD,EAAQ,CAAC,CACxC,CACA,EACME,GAAoB7C,GAAQ,CAChC,KAAOA,GAAM,CAEX,GADAA,EAAOA,EAAK,WACR,CAACA,GAAQA,IAAS,SAAS,MAAQ,CAACA,EAAK,WAAY,OACzD,KAAM,CACJ,SAAA8C,EACA,UAAAC,EACA,UAAAC,CACN,EAAQ,iBAAiBhD,CAAI,EACzB,GAAI,6BAA6B,KAAK8C,EAAWE,EAAYD,CAAS,EAAG,OAAO/C,CACjF,CACH,EACA,SAASiD,GAAYC,EAAYC,EAAY,CAC3C,MAAO,CACL,gBAAiBD,GAAc,OAC/B,SAAUC,EAAa,EAAI,EAC/B,CACA,CACA,SAASC,GAAYC,EAAUrD,EAAM,CACnC,QAASpO,EAAI,EAAGA,EAAIyR,EAAS,OAAQzR,IACnC,GAAIyR,EAASzR,CAAC,IAAMoO,EAAM,OAAOpO,EAEnC,MAAO,EACT,CCjEA,MAAM0R,GAAiBvB,IAAS,CAC9B,CAACA,EAAO,GAAGA,CAAI,YAAc,WAAW,EAAGwB,YAAU,CAACC,SAAQC,MAAI,CAAC,CACrE,GACMC,GAAgB,CACpB,UAAWF,EAAM,OACjB,GAAGF,GAAe,MAAM,EACxB,WAAYK,EAAM,OAClB,WAAYA,EAAM,OAClB,UAAWA,EAAM,OACjB,MAAOC,EAAI,KACX,gBAAiBA,EAAI,KACrB,IAAKC,EAAM,OACX,MAAOA,EAAM,OACb,MAAoBC,QAAM,CAAC,QAAS,SAAU,KAAK,CAAC,EACpD,UAAwBA,EAAK,MAAC,CAAC,OAAQ,QAAS,MAAO,QAAQ,CAAC,EAChE,SAAuBA,QAAM,CAAC,OAAQ,SAAU,SAAS,CAAC,EAC1D,SAAuBA,QAAM,CAAC,OAAQ,UAAW,QAAQ,CAAC,CAC5D,EACMC,GAAoB,CACxB,GAAGL,GACH,eAAgBC,EAAM,OACtB,eAAgBC,EAAI,KACpB,eAAgBA,EAAI,KACpB,WAAyBL,EAAS,UAAC,CAACK,EAAI,KAAeI,QAAM,CAC3D,KAAMJ,EAAI,KACV,MAAOA,EAAI,KACX,KAAMA,EAAI,IACX,EAAC,CAAC,EACH,kBAAmBC,EAAM,OACzB,eAAgBF,EAAM,OACtB,mBAAoBH,EAAM,OAC1B,WAAyBM,EAAK,MAAC,CAAC,OAAQ,SAAS,CAAC,EAClD,eAA6BP,EAAS,UAAC,CAACC,EAAM,OAAEK,EAAM,OAAC,EACvD,WAAyBC,QAAM,CAAC,OAAQ,QAAS,SAAS,CAAC,EAC3D,iBAAkBD,EAAM,OACxB,kBAAmBA,EAAM,OACzB,OAAqBN,EAAS,UAAC,CAACK,EAAI,KAAeI,QAAM,CACvD,OAAQL,EAAM,OACd,eAAgBC,EAAI,IACrB,EAAC,CAAC,EACH,QAASJ,EAAM,OACf,YAAaC,EAAI,IACnB,EACMQ,GAA4B,CAChC,YAA0BV,EAAS,UAAC,CAACI,EAAM,OAAEF,EAAI,KAAC,EAClD,aAAcA,EAAI,IACpB,EC9CMS,GAAS,CAAC,CACd,MAAAjK,EACA,QAAA5N,EACA,UAAAxB,EACA,UAAA+H,CACF,IAAMuR,GAAQ,IAAM,CAClB,MAAMC,EAAe/X,EAAU,GAAG4N,CAAK,KAAK5N,CAAO,GAAK4N,EACxD,IAAIoK,EAAcD,EAClBvZ,GAAa,OAAO,KAAKA,CAAS,EAAE,QAAQkX,GAAQ,CAClD,MAAM5W,EAAQN,EAAUkX,CAAI,EACxB5W,IAAOkZ,GAAe,IAAID,CAAY,KAAKjZ,IAAU,GAAO4W,EAAO,GAAGA,CAAI,IAAI5W,CAAK,EAAE,GAC7F,CAAG,EACD,IAAImZ,EAAoB,OAAO1R,GAAc,WAAaA,EAAU/H,CAAS,EAAI+H,EACjF,OAAI,OAAO0R,GAAsB,WAC/BA,EAAoBA,EAAkB,OAClCA,IAAmBD,GAAe,IAAIC,CAAiB,KAEtDD,CACT,EAAG,CAACpK,EAAO5N,EAASxB,EAAW+H,CAAS,CAAC,EClBnC2R,GAAqB,qBACrBC,GAAY,WAElB,MAAMC,GAAiB,QACjBC,GAAgB,OAChBC,GAAmB,UACnBC,GAAkB,SAClBC,GAAiB,QACjBC,GAAe,UAErB,MAAMC,GAAgCrX,GAAa,EAC7CsX,GAAmCtX,GAAc,EAAE,EACnDuX,GAA+BvX,GAAc,EAAE,EAC/CwX,GAAoCxX,GAAc,EAAE,EACpDyX,GAAiCzX,GAAc,EAAE,EACjD0X,GAA+B1X,GAAc,EAAE,EAC/C2X,GAAoB,OAAO,OAAO,CACtC,MAAO,QACP,IAAK,SACL,MAAO,IACP,KAAM,OACN,IAAK,MACL,KAAM,YACN,MAAO,aACP,GAAI,UACJ,KAAM,WACR,CAAC,EACKC,GAAgC,OAAO,OAAO,CAClD,MAAO,EACP,IAAK,EACL,MAAO,EACP,SAAU,EACV,SAAU,EACV,MAAO,EACP,KAAM,EACN,UAAW,CACb,CAAC,EACKC,GAA2B,OAAO,OAAO,CAC7C,MAAO,QACP,OAAQ,SACR,KAAM,OACN,OAAQ,QACV,CAAC,EACKC,GAA8B,OAAO,OAAO,CAChD,MAAO,QACP,KAAM,MACR,CAAC,EACKC,GAA4B,OAAO,OAAO,CAC9C,SAAU,UACV,QAAS,OACT,QAAS,UACT,OAAQ,QACV,CAAC,EACKC,GAAmB,WACnBC,GAAW,OACXC,GAAe,WCnDrB,MAAMC,GAAgB,CAAC,CACrB,UAAAjT,EACA,aAAAkT,EACA,eAAAC,EACA,SAAAnH,EACA,OAAAoH,EACA,QAAAC,EACA,WAAAnE,EACA,QAAAjD,CACF,IAAM,CACJ,MAAMqH,EAAiBrE,GAAcC,EAAY,MAAM,EAoBvD,OAAoBqE,EAAI,MAAO,CAC7B,GAAG9D,GAAW,CACZ,UArBc,CAAC,CACjB,IAAAlY,CACJ,IAAQ,CACJ,OAAQA,EAAG,CACT,KAAKkb,GAAK,IACRrD,GAASnD,EAAS,CAChB,IAAA1U,EACA,OAAQob,GAAY,MAC9B,CAAS,EACD,KACH,CACL,EAWM,OAVW1b,GAAK,CACdmc,GAAU,CAACnc,EAAE,cAAc,SAASA,EAAE,aAAa,GACrDmY,GAASnD,EAAS,CAChB,OAAQ0G,GAAY,IAC5B,CAAO,CAEP,CAKK,EAAEQ,CAAc,EACjB,UAAW7B,GAAO,CAChB,MAAOK,GACP,UAAWJ,GAAQ,KAAO,CACxB,MAAO8B,EACP,eAAAC,CACR,GAAU,CAACD,EAASC,CAAc,CAAC,EAC7B,UAAAtT,CACN,CAAK,EACD,MAAO,CACL,SAAU,WACV,GAAImT,GAAkB,KAAO,OAASA,EAAe,KACtD,EACD,IAAKD,EACL,SAAUlH,CACd,CAAG,CACH,ECxDMwH,GAAmB,IAAM,CAC7B,IAAIpH,EACFqH,EAAQ,EACV,MAAO,CACL,OAAQL,GAAU,CAChBA,EAASK,IAAUA,IACnBA,EAAQ,KAAK,IAAIA,EAAO,CAAC,CAC1B,EACD,GAAI,CAACC,EAAYC,EAASC,IAAY,CAChCH,EACGrH,IAAOA,EAAQ,WAAW,IAAM,CACnCA,EAAQ,EACRuH,GACD,EAAED,CAAU,GAEbE,GAAW,MAAQA,GAEtB,EACD,IAAK,IAAM,CACLxH,IACF,aAAaA,CAAK,EAClBA,EAAQ,EAEX,CACL,CACA,ECrBMyH,GAAW,CAACC,EAASC,IAAa,CACtC,KAAM,CAACC,EAAWC,CAAY,EAAI9X,EAAS,EAMrC+X,EALWzY,EAAO,CACtB,MAAO,CAAC,EACR,WAAY,GACZ,OAAQ,GACT,EAC6B,QACxB0Y,EAAczX,GAAY,CAAC0X,EAAMC,IAAc,CAC7C,MACJ,MAAAC,CACE,EAAAJ,EACJ,GAAI,CAACE,EACHF,EAAa,MAAQ,WACZG,EACTC,EAAM,KAAKF,CAAI,MACV,CACC,MAAAG,EAAQD,EAAM,QAAQF,CAAI,EAC5BG,EAAQ,KACJD,EAAA,OAAOC,EAAO,CAAC,EACjBH,EAAK,SAAS,SAAS,aAAa,IACtCL,EAAS,QAAQ,QACJE,KAGnB,CACAC,EAAa,WAAa,GAC1BA,EAAa,OAAS,IACrB,CAACA,EAAcH,CAAQ,CAAC,EACrBS,EAAW9X,GAAY,CAAC+X,EAAYL,EAAMM,IAAc,CACtD,MACJ,MAAAJ,EACA,WAAAK,CACE,EAAAT,EACEU,EAAY,IAAM,CACtB,GAAIV,EAAa,OAAQ,OACzB,MAAMW,EAAef,EAAQ,QAAQ,iBAAiB,iBAAiB,EACjEQ,EAAA,KAAK,CAACQ,EAAGC,IAAMvE,GAAYqE,EAAcC,CAAC,EAAItE,GAAYqE,EAAcE,CAAC,CAAC,EAChFb,EAAa,OAAS,IAEpB,IAAAK,EAAQ,GACVS,EACF,OAAQP,EAAY,CAClB,KAAK/B,GAAiB,MACpB,MACF,KAAKA,GAAiB,IACVsC,EAAAZ,EACV,MACF,KAAK1B,GAAiB,MACVsC,EAAAC,GAAYA,IAAab,EAAO,OAAYa,EACtD,MACF,KAAKvC,GAAiB,MACVkC,IACFL,EAAA,EACRS,EAAUV,EAAMC,CAAK,EACrB,MACF,KAAK7B,GAAiB,KACVkC,IACVL,EAAQD,EAAM,OAAS,EACvBU,EAAUV,EAAMC,CAAK,EACrB,MACF,KAAK7B,GAAiB,UACVkC,IACFL,EAAAG,EACRM,EAAUV,EAAMC,CAAK,EACrB,MACF,KAAK7B,GAAiB,SACVkC,IACFL,EAAAI,EACJJ,EAAQ,IAAWA,EAAAD,EAAM,QAAQF,CAAI,GACzCG,IACIA,GAASD,EAAM,SAAgBC,EAAA,GACnCS,EAAUV,EAAMC,CAAK,EACrB,MACF,KAAK7B,GAAiB,SACVkC,IACFL,EAAAI,EACJJ,EAAQ,IAAWA,EAAAD,EAAM,QAAQF,CAAI,GACzCG,IACIA,EAAQ,IAAWA,EAAAD,EAAM,OAAS,GACtCU,EAAUV,EAAMC,CAAK,EACrB,MACF,QAEF,CACKS,IAAiBT,EAAA,IACtBN,EAAae,CAAO,EACpBd,EAAa,WAAaK,CAAA,EACzB,CAACT,EAASI,CAAY,CAAC,EACnB,OACL,UAAAF,EACA,SAAAQ,EACA,YAAAL,CAAA,CAEJ,EClGMe,GAAqB,CAACC,EAAaC,IAAkB,KAAK,MAAMD,CAAW,IAAMC,EAAgBD,EAAcC,EAC/GC,GAA0B5b,GAAW,CACzC,MAAM6b,EAAO7b,EAAQ,wBACrB,OAAA6b,EAAK,MAAQJ,GAAmBI,EAAK,MAAO7b,EAAQ,WAAW,EAC/D6b,EAAK,OAASJ,GAAmBI,EAAK,OAAQ7b,EAAQ,YAAY,EAC3D6b,CACT,ECHMC,GAAqB,CAACrC,EAAcY,EAAS0B,EAAYC,IAAuB,CACpF,MAAMC,EAAWL,GAAwBvB,EAAQ,OAAO,EAClD6B,EAAgBzC,EAAa,QAAQ,sBAAqB,EAC1D0C,EAAeJ,IAAe,OAAS,CAC3C,KAAM,EACN,IAAK,EACL,MAAO,SAAS,gBAAgB,YAChC,OAAQ,OAAO,WACnB,EAAMA,EAAW,wBACTzF,EAAUF,GAAa4F,CAAkB,EACzCI,EAAkB3a,GAAKA,EAAIya,EAAc,KAAOC,EAAa,KAAO7F,EAAQ,KAC5E+F,EAAmB5a,GAAKA,EAAIya,EAAc,KAAOD,EAAS,MAAQE,EAAa,MAAQ7F,EAAQ,MAC/FgG,EAAiB5a,GAAKA,EAAIwa,EAAc,IAAMC,EAAa,IAAM7F,EAAQ,IACzEiG,EAAoB7a,GAAKA,EAAIwa,EAAc,IAAMD,EAAS,OAASE,EAAa,OAAS7F,EAAQ,OA6BvG,MAAO,CACL,SAAA2F,EACA,cAAAC,EACA,gBAAAE,EACA,iBAAAC,EACA,eAAAC,EACA,kBAAAC,EACA,oBAnC0B9a,GAAK,CAC/B,IAAI+a,EAAeJ,EAAgB3a,CAAC,EACpC,GAAI+a,EAAe,EACjB/a,GAAK+a,MACA,CACL,MAAMC,EAAgBJ,EAAiB5a,CAAC,EACpCgb,EAAgB,IAClBhb,GAAKgb,EACLD,EAAeJ,EAAgB3a,CAAC,EAC5B+a,EAAe,IAAG/a,GAAK+a,GAE9B,CACD,OAAO/a,CACX,EAuBI,kBAtBwBC,GAAK,CAC7B,IAAIgb,EAAcJ,EAAe5a,CAAC,EAClC,GAAIgb,EAAc,EAChBhb,GAAKgb,MACA,CACL,MAAMC,EAAiBJ,EAAkB7a,CAAC,EACtCib,EAAiB,IACnBjb,GAAKib,EACLD,EAAcJ,EAAe5a,CAAC,EAC1Bgb,EAAc,IAAGhb,GAAKgb,GAE7B,CACD,OAAOhb,CACX,CAUA,CACA,ECvDMkb,GAAqB,CAAC,CAC1B,SAAAC,EACA,MAAAC,EACA,WAAAC,EACA,cAAAb,EACA,SAAAD,CACF,IAAM,CACJ,IAAIva,EAAIqb,EAAW,IAAMb,EAAc,IAAMY,EAAQC,EAAW,OAAS,EACzE,MAAMrX,EAASmX,EAAS,QAAQ,aAAe,KAC/C,OAAAnb,EAAI,KAAK,IAAIgE,EAAQhE,CAAC,EACtBA,EAAI,KAAK,IAAIA,EAAGua,EAAS,OAASvW,CAAM,EACjChE,CACT,ECVMsb,GAAmB,CAAC,CACxB,WAAAD,EACA,cAAAb,EACA,SAAAD,EACA,kBAAAgB,EACA,WAAAC,EACA,YAAAC,EACA,gBAAAf,EACA,iBAAAC,EACA,oBAAAe,EACA,kBAAAC,EACA,SAAAR,EACA,MAAAS,EACA,UAAAC,EACA,SAAA7W,CACF,IAAM,CACJ,IAAI8W,EAAoBD,EACpB7b,EAAIub,EACJvW,IAAa,YACfhF,EAAI2b,EAAkB3b,CAAC,EACnBgF,IAAa,WACfhF,EAAI,KAAK,IAAIA,EAAGqb,EAAW,OAASb,EAAc,GAAG,EACrDxa,EAAI,KAAK,IAAIA,EAAGqb,EAAW,IAAMb,EAAc,IAAMD,EAAS,MAAM,IAGxE,IAAIxa,EAAG+a,EAAcC,EACrB,OAAIe,IAAsB,QACxB/b,EAAIyb,EACAxW,IAAa,YACf8V,EAAeJ,EAAgB3a,CAAC,EAC5B+a,EAAe,IACjBC,EAAgBJ,EAAiBc,CAAW,GACxCV,GAAiB,GAAK,CAACD,EAAeC,KACxChb,EAAI0b,EACJK,EAAoB,aAK1B/b,EAAI0b,EACAzW,IAAa,YACf+V,EAAgBJ,EAAiB5a,CAAC,EAC9Bgb,EAAgB,IAClBD,EAAeJ,EAAgBc,CAAU,GACrCV,GAAgB,GAAK,CAACA,EAAeC,KACvChb,EAAIyb,EACJM,EAAoB,WAKxB9W,IAAa,SAAQjF,EAAI2b,EAAoB3b,CAAC,GAQ3C,CACL,OARa6b,EAAQV,GAAmB,CACxC,MAAOlb,EACP,SAAAmb,EACA,WAAAE,EACA,cAAAb,EACA,SAAAD,CACD,GAAI,OAGH,EAAAxa,EACA,EAAAC,EACA,kBAAA8b,CACJ,CACA,ECnEMC,GAAuB,CAAC,CAC5B,SAAAZ,EACA,MAAAa,EACA,WAAAX,EACA,cAAAb,EACA,SAAAD,CACF,IAAM,CACJ,IAAIxa,EAAIsb,EAAW,KAAOb,EAAc,KAAOwB,EAAQX,EAAW,MAAQ,EAC1E,MAAMrX,EAASmX,EAAS,QAAQ,YAAc,KAC9C,OAAApb,EAAI,KAAK,IAAIiE,EAAQjE,CAAC,EACtBA,EAAI,KAAK,IAAIA,EAAGwa,EAAS,MAAQvW,CAAM,EAChCjE,CACT,ECVMkc,GAAmB,CAAC,CACxB,WAAAZ,EACA,cAAAb,EACA,SAAAD,EACA,kBAAA2B,EACA,UAAAC,EACA,aAAAC,EACA,eAAAxB,EACA,kBAAAC,EACA,oBAAAa,EACA,kBAAAC,EACA,SAAAR,EACA,MAAAS,EACA,UAAAC,EACA,SAAA7W,CACF,IAAM,CACJ,IAAI8W,EAAoBD,IAAc,MAAQ,MAAQ,SAClD9b,EAAImc,EACJlX,IAAa,YACfjF,EAAI2b,EAAoB3b,CAAC,EACrBiF,IAAa,WACfjF,EAAI,KAAK,IAAIA,EAAGsb,EAAW,MAAQb,EAAc,IAAI,EACrDza,EAAI,KAAK,IAAIA,EAAGsb,EAAW,KAAOb,EAAc,KAAOD,EAAS,KAAK,IAGzE,IAAIva,EAAGgb,EAAaC,EACpB,OAAIa,IAAsB,OACxB9b,EAAImc,EACAnX,IAAa,YACfgW,EAAcJ,EAAe5a,CAAC,EAC1Bgb,EAAc,IAChBC,EAAiBJ,EAAkBuB,CAAY,GAC3CnB,GAAkB,GAAK,CAACD,EAAcC,KACxCjb,EAAIoc,EACJN,EAAoB,cAK1B9b,EAAIoc,EACApX,IAAa,YACfiW,EAAiBJ,EAAkB7a,CAAC,EAChCib,EAAiB,IACnBD,EAAcJ,EAAeuB,CAAS,GAClCnB,GAAe,GAAK,CAACA,EAAcC,KACrCjb,EAAImc,EACJL,EAAoB,UAKxB9W,IAAa,SAAQhF,EAAI2b,EAAkB3b,CAAC,GAQzC,CACL,OARa4b,EAAQG,GAAqB,CAC1C,MAAOhc,EACP,SAAAob,EACA,WAAAE,EACA,cAAAb,EACA,SAAAD,CACD,GAAI,OAGH,EAAAxa,EACA,EAAAC,EACA,kBAAA8b,CACJ,CACA,EChEMO,GAAe,CAAC,CACpB,MAAAT,EACA,MAAAU,EACA,UAAAT,EACA,IAAAU,EACA,MAAAvd,EACA,SAAAgG,EACA,WAAAqW,EACA,SAAAF,EACA,gBAAAqB,CACF,IAAM,CACJ,KAAM,CACJ,SAAAjC,EACA,cAAAC,CACD,EAAGgC,EACEC,EAAeZ,IAAc,QAAUA,IAAc,QAC3D,IAAIa,EAAmBD,EAAeF,EAAMvd,EACxC2d,EAAiBF,EAAezd,EAAQud,EAC5C,GAAIX,EAAO,CACT,MAAMgB,EAAWzB,EAAS,QACtBsB,EACFC,GAAoBE,EAAS,YAE7BD,GAAkBC,EAAS,YAE9B,CACD,MAAMpB,EAAaH,EAAW,KAAOb,EAAc,KAAOD,EAAS,MAAQmC,EACrEjB,EAAcJ,EAAW,MAAQb,EAAc,KAAOkC,EACtDP,EAAYd,EAAW,IAAMb,EAAc,IAAMD,EAAS,OAASoC,EACnEP,EAAef,EAAW,OAASb,EAAc,IAAMmC,EAC7D,IAAIT,EAAmBX,EACnBe,IAAU,OACZJ,EAAoBb,EAAW,MAAQb,EAAc,KAAOD,EAAS,MACrEgB,EAAoBF,EAAW,OAASb,EAAc,IAAMD,EAAS,QAC5D+B,IAAU,UACnBJ,EAAoBb,EAAW,KAAOb,EAAc,MAAQD,EAAS,MAAQc,EAAW,OAAS,EACjGE,EAAoBF,EAAW,IAAMb,EAAc,KAAOD,EAAS,OAASc,EAAW,QAAU,IAEjGa,EAAoBb,EAAW,KAAOb,EAAc,KACpDe,EAAoBF,EAAW,IAAMb,EAAc,KAErD0B,GAAqBQ,EACrBnB,GAAqBoB,EACrB,MAAM9b,EAAU,CACd,GAAG2b,EACH,WAAAnB,EACA,WAAAG,EACA,YAAAC,EACA,kBAAAF,EACA,UAAAY,EACA,aAAAC,EACA,kBAAAF,EACA,SAAAf,EACA,MAAAS,EACA,UAAAC,EACA,SAAA7W,CACJ,EACE,OAAQ6W,EAAS,CACf,IAAK,OACL,IAAK,QACH,OAAOP,GAAiBza,CAAO,EACjC,IAAK,MACL,IAAK,SACL,QACE,OAAOob,GAAiBpb,CAAO,CAClC,CACH,ECnEMgc,GAA4B,OAAO,OAAW,KAAe,OAAO,OAAO,SAAa,KAAe,OAAO,OAAO,SAAS,cAAkB,IAAcpc,GAAkBC,GCAtL,SAASO,GAAOZ,EAAKyc,EAAU,CAC7B,OAAOzc,GAAQ,WAAaA,EAAIyc,CAAQ,EAAIzc,EAAI,QAAUyc,CAC5D,CACA,MAAMC,GAAiB,CAACC,EAAMC,IAAS7G,GAAQ,IACxC4G,EACAC,EACEH,GAAY,CACjB7b,GAAO+b,EAAMF,CAAQ,EACrB7b,GAAOgc,EAAMH,CAAQ,CACzB,EAJoBE,EADAC,EAMjB,CAACD,EAAMC,CAAI,CAAC,ECETC,GAAY,MACZC,GAAW,CAAC,CAChB,UAAAC,EACA,cAAAC,EACA,UAAAC,EACA,MAAA1B,EACA,WAAA2B,EAAa,CAAC,EACd,YAAAC,EACA,UAAAC,EACA,aAAA1F,EACA,eAAAC,EACA,WAAA0F,EACA,YAAAC,EACA,mBAAAC,EACA,MAAAtB,EAAQ,QACR,UAAAT,EAAY,SACZ,SAAA7W,EAAW,OACX,SAAA+P,EAAW,UACX,gBAAA8I,EACA,eAAAC,EACA,aAAAC,EAAe,GACf,MAAApK,EACA,cAAAqK,EACA,WAAA7I,EACA,cAAA8I,EACA,IAAA1B,EAAM,EACN,MAAAvd,EAAQ,EACR,SAAA6R,EACA,QAAAC,EACA,GAAGoN,CACL,IAAM,CACJ,KAAM,CAACC,EAAcC,CAAe,EAAIpd,EAAS,CAC/C,EAAGkc,GACH,EAAGA,EAAA,CACJ,EACK,CAACmB,EAAeC,EAAgB,EAAItd,EAAS,CAAE,GAC/C,CAACud,EAAcC,EAAe,EAAIxd,EAAS,EAC3C,CAACyd,EAAmBC,EAAoB,EAAI1d,EAAS6a,CAAS,EAC9D,CAAC8C,EAAU,EAAI3d,EAASqX,EAAgB,EACxC,CAACuG,GAAcC,CAAiB,EAAIC,GAAgBC,KAAI,EAAG,CAAC,EAC5D,CACJ,WAAAhL,GACA,eAAAiL,GACA,mBAAA1E,GACA,YAAA2E,GACA,cAAAC,GACA,eAAAC,GACA,WAAAC,GACA,WAAAC,GACA,kBAAAC,EAAA,EACEzf,GAAWwX,EAAe,EACxB,CACJ,WAAYkI,GACZ,aAAcC,EAAY1B,CAAA,EACxBje,GAAWqX,EAAe,EACxByB,GAAUrY,EAAO,IAAI,EACrBsY,GAAWtY,IACX6a,GAAW7a,IACXmf,EAAWnf,EAAO,EAAK,EACvB,CACJ,UAAAuY,GACA,SAAAQ,EACA,YAAAL,CAAA,EACEN,GAASC,GAASC,EAAQ,EACxBX,EAASvE,GAAWC,CAAK,EACzB+L,GAAiB5L,GAAcC,GAAY,MAAM,EACjD4L,GAAkB7L,GAAcC,GAAY,OAAO,EACnD6L,GAAcT,GAAe,QAC7BU,GAAiB/jB,GAAA,CACrB,OAAQA,EAAE,IAAK,CACb,KAAKwb,GAAK,KACR+B,EAAS9B,GAAiB,KAAK,EAC/B,MACF,KAAKD,GAAK,IACR+B,EAAS9B,GAAiB,IAAI,EAC9B,MACF,KAAKD,GAAK,GACC+B,EAAA9B,GAAiB,SAAUsB,EAAS,EAC7C,MACF,KAAKvB,GAAK,KACC+B,EAAA9B,GAAiB,SAAUsB,EAAS,EAC7C,MACF,KAAKvB,GAAK,MACJxb,EAAE,QAAUA,EAAE,OAAO,UAAU,QAAQ2a,EAAS,IAAM,IACxD3a,EAAE,eAAe,EAEnB,OACF,QACE,MACJ,CACAA,EAAE,eAAe,EACjBA,EAAE,gBAAgB,GAEdgkB,GAAiB,IAAM,CACvBnM,IAAU,WACI6K,KAElBvK,GAAS+J,CAAa,GAElB+B,GAAqBjkB,GAAA,CACzBA,EAAE,gBAAgB,EACP6iB,GAAA,GAAGW,GAAmB,IAAM,CACrCjG,EAAS9B,GAAiB,KAAK,EAC/BqB,GAAS,QAAQ,OAAM,CACxB,GAEGoH,GAAsBlkB,GAAA,CACtBA,EAAE,SAAWA,EAAE,kBAA0B,KAAI,EAE7CmkB,GAAiB1e,GAA+B2e,GAAA,CAChD,IAAAC,GACE,MAAA9E,GAAaoC,GAAa0C,GAAqB1C,EAAU,UAAY,KAAO,OAAS0C,GAAmB,sBAAsB,EAAI3C,EAAc,CACpJ,KAAMA,EAAY,EAClB,MAAOA,EAAY,EACnB,IAAKA,EAAY,EACjB,OAAQA,EAAY,EACpB,MAAO,EACP,OAAQ,CACN,OACJ,GAAI,CAACnC,GAIH,OAEGuE,GAAY,OACfA,GAAY,MAAQZ,GAAiBA,GAAe,QAAUlK,GAAkBmK,GAAY,OAAO,IAAM,QAE3G,MAAMzC,GAAkBpC,GAAmBrC,EAAcY,GAASiH,GAAY,KAAMtF,EAAkB,EAClG,IACF,OAAA8F,GACA,OAAAC,GACA,EAAAtgB,GACA,EAAAC,GACA,kBAAA8b,IACEO,GAAa,CACf,MAAAT,EACA,MAAAU,EACA,UAAAT,EACA,IAAAU,EACA,MAAAvd,EACA,SAAAgG,EACA,WAAAqW,GACA,SAAAF,GACA,gBAAAqB,EAAA,CACD,EACK,MACJ,SAAAjC,EACE,EAAAiC,GACE8D,GAAa/F,GAAS,OACxB,IAAC2F,GAAmBnL,IAAa,UAAW,CACxC,MACJ,eAAA6F,GACA,kBAAAC,EACE,EAAA2B,GACJ,IAAIzY,GAAQwc,GACN,MAAAtF,GAAiBJ,GAAkB7a,EAAC,EAC1C,GAAIib,GAAiB,EACnBlX,GAASuc,GAAarF,GACtBsF,GAActF,OACT,CACC,MAAAD,GAAcJ,GAAe5a,EAAC,EAChCgb,GAAc,IAChBjX,GAASuc,GAAatF,GACtBuF,GAAc,EAAIvF,GACdjX,IAAU,IAAQ/D,IAAAgb,IAE1B,CACIjX,IAAU,GACIya,GAAA,CACd,OAAAza,GACA,YAAAwc,EAAA,CACD,CAEL,CACI3E,GAAwB0C,GAAA,CAC1B,EAAG8B,GACH,EAAGC,EAAA,CACJ,EACejC,EAAA,CACd,EAAAre,GACA,EAAAC,EAAA,CACD,EACD0e,GAAqB5C,EAAiB,GACrC,CAACF,EAAOU,EAAOhC,GAAoBuB,EAAWU,EAAKvd,EAAOgG,EAAU+P,EAAUyI,EAAaC,EAAW1F,EAAciH,GAAgBC,GAAaW,EAAW,CAAC,EAChK/C,GAA0B,IAAM,CAC1B5E,IACagI,KACXR,EAAS,SAA2BZ,KAE1CY,EAAS,QAAUxH,CAClB,GAACA,EAAQgI,GAAgBT,CAAS,CAAC,EACtC3C,GAA0B,IAAM,CAC1B0B,GAAgB,CAACV,IAAiBlF,GAAQ,QAAQ,UAAY,IACjE,CAAC4F,EAAcV,CAAe,CAAC,EAClChB,GAA0B,IAAM7D,EAAa,CAACA,CAAW,CAAC,EAC1DtY,GAAU,IAAM,CACV,IACF,KAAM2Z,CACJ,EAAAuF,GACA,IAAC3H,GAAU,CAACoC,EAAY,OAExB,GADSA,IAAW,iBAAmBA,EAAa,OACpD,CAACuF,GAAY,QAAS,CACxBA,GAAY,QAAU,GACtB,IAAIY,GAAe1L,GAAkBoK,IAAiBA,GAAc,OAAO,EACpE,KAAAsB,IAAgBA,KAAiBnG,GAC1BuF,GAAA,QAAQ,KAAKY,EAAY,EACrCA,GAAe1L,GAAkB0L,EAAY,CAEjD,CACA,IAAIC,GAASpB,GAEb,GADIO,GAAY,QAAQ,QAAUa,KAAW,YAAoBA,GAAA,QAC7DA,KAAW,UAAW,OAC1B,MAAMC,GAAe,IAAM,CACrBD,KAAW,OACE7M,GAAA,IAAMqM,GAAe,EAAI,CAAC,EAEzChM,GAASnD,EAAS,CAChB,OAAQ0G,GAAY,OACrB,CACH,EAEImJ,GAAkBf,GAAY,QAAQ,OAAOP,KAAe,UAAYhF,EAAa,EAAE,EAC7F,OAAAsG,GAAgB,QAAaC,OAAE,iBAAiB,SAAUF,EAAY,CAAC,EAChE,IAAMC,GAAgB,QAAQC,IAAKA,GAAE,oBAAoB,SAAUF,EAAY,CAAC,GACtF,CAACxB,GAAeU,GAAa3H,EAAQnH,EAASuO,GAAYY,EAAc,CAAC,EAC5E,MAAMY,GAAc,CAAC,CAACtC,GAAgBA,EAAa,YAAc,EACjE7d,GAAU,IAAM,CACd,GAAImgB,IAAe,CAAC5I,GAAU,CAAC2F,EAAoB,OAC7C,MAAA8C,EAAe,IAAM9M,GAAeqM,EAAc,EAClDa,GAAelD,EAAmB,QAC3B,OAAAkD,GAAA,iBAAiB,SAAUJ,CAAY,EAC7C,IAAMI,GAAa,oBAAoB,SAAUJ,CAAY,GACnE,CAACzI,EAAQ4I,GAAajD,EAAoBqC,EAAc,CAAC,EAC5Dvf,GAAU,IAAM,CACd,GAAI,CAACuX,GAAU,OAAO,gBAAmB,YAAcmH,KAAe,UAAW,OACjF,MAAM2B,EAAa,GACbC,GAAiB,IAAI,eAA0BC,OAAQ,QAAQ,CAAC,CACpE,OAAAjjB,EAAA,IACI,CACA+iB,EAAW,QAAQ/iB,EAAM,EAAI,EAC/B+iB,EAAW,KAAK/iB,EAAM,EAEtBkjB,GAAU,IAAM,CACCjB,KACGpB,GAAA,CACnB,CAEJ,EAAC,EACIsC,GAAwB,CAC5B,IAAK,cAEQH,GAAA,QAAQrI,GAAQ,QAASwI,EAAqB,EAC7D,MAAMC,GAAS3D,GAAa,KAAO,OAASA,EAAU,QAC5C,OAAA2D,IAAAJ,GAAe,QAAQI,GAAQD,EAAqB,EACvD,IAAMH,GAAe,cAC3B,CAAC/I,EAAQmH,GAAY3B,EAAWwC,EAAc,CAAC,EAClDvf,GAAU,IAAM,CACd,GAAI,CAACuX,EAAQ,CACXoB,EAAS9B,GAAiB,KAAK,EAC1BoI,IAAiCnB,KACtC,MACF,CACM,MACJ,SAAAxZ,EACA,aAAAqc,EAAA,EACEpD,GAAiB,GACfqD,GAAe,IAAM,CACrBtc,IAAayS,GAAe,MAC9B4B,EAAS9B,GAAiB,KAAK,EACtBvS,IAAayS,GAAe,KACrC4B,EAAS9B,GAAiB,IAAI,EACrBvS,GAAY,IACZqU,EAAA9B,GAAiB,UAAW,OAAWvS,CAAQ,CAC1D,EAEF,GAAIqc,GACWC,aACJvD,EAAc,CACjB,MAAAvY,GAAK,WAAW,IAAM,CAC1B,MAAM+b,GAAU5I,GAAQ,QACpB4I,IAAW,CAACA,GAAQ,SAAS,SAAS,aAAa,IACrD3I,GAAS,QAAQ,QACJ0I,KACf,EACC5B,GAAiB,IAAM,GAAG,EACtB,UAAM,aAAala,EAAE,CAC9B,GACC,CAACyS,EAAQyH,GAAgBC,GAAiB5B,EAAcE,EAAe5E,CAAQ,CAAC,EAC7E,MAAAmI,GAAcpL,GAAQ,KAAO,CACjC,aAAc6B,EACd,WAAA0G,GACA,SAAAtF,EACA,YAAAL,CAAA,GACE,CAACf,EAAQ0G,GAAYtF,EAAUL,CAAW,CAAC,EAC/C,IAAIyI,GAAWlB,GACXhC,IACFV,EAAkB0C,GAAchC,EAAa,YAAckD,GAAYlD,EAAa,QAEhF,MAAAmD,GAActL,GAAQ,KAAO,CACjC,aAAAwI,GACA,WAAAD,GACA,SAAA5J,EACA,YAAAwL,GACA,cAAe5H,GACf,UAAW8F,CAAA,GACT,CAACG,GAAcD,GAAY5J,EAAUwL,GAAa9B,CAAiB,CAAC,EAClEkD,GAAgBF,IAAa,EAAI,CACrC,UAAAA,GACA,SAAA1M,CACE,SACEjY,GAAYsZ,GAAQ,KAAO,CAC/B,MAAAzC,EACA,MAAA2I,EACA,IAAKmC,CACH,IAAC9K,EAAO2I,EAAOmC,CAAiB,CAAC,EAC/BmD,GAAiBxL,GAAQ,KAAO,CACpC,IAAKqI,CAAA,GACH,CAACA,CAAiB,CAAC,EACjBoD,GAAkB1L,GAAO,CAC7B,MAAOM,GACP,QAASC,GACT,UAAWkL,GACX,UAAWrE,EAAW,UACvB,EACK3S,KAAyB,KAAM,CACnC,KAAM,OACN,aAAcwS,EACd,GAAGlI,GAAYC,CAAU,EACzB,GAAGb,GAAW,CACZ,eAAgBiL,IAAoB,KAAO,OAASA,GAAiB,IACrE,cAAAQ,GACA,eAAAC,GACA,UAAAH,GACA,eAAAC,IACC5B,CAAS,EACZ,IAAKnB,GAAeY,EAAahF,EAAO,EACxC,UAAWxC,GAAO,CAChB,MAAOM,GACP,UAAA3Z,GACA,UAAWugB,CAAA,CACZ,EACD,MAAO,CACL,GAAGC,EACH,GAAGqE,GACH,OAAQ,EACR,QAAShO,IAAU,SAAW,OAAS,OACvC,SAAUgE,GACV,KAAMwG,EAAa,EACnB,IAAKA,EAAa,CACpB,EACA,SAAU,CAAc/F,EAAI,KAAM,CAChC,SAAU,GACV,KAAMR,GACN,MAAO,CACL,SAAUD,GACV,KAAM,EACN,IAAK,EACL,QAAS,QACT,QAAS,MACX,EACA,IAAKiB,GACL,GAAG8E,CAAA,CACJ,EAAG9B,GAAsBxD,EAAI,KAAM,CAClC,KAAMR,GACN,GAAG2F,EACH,UAAWsE,GACX,MAAO,CACL,QAAS,QACT,SAAUlK,GACV,KAAM0G,EAAc,EACpB,IAAKA,EAAc,EACnB,GAAGd,EAAW,KAChB,EACA,IAAKpC,EAAA,CACN,EAAoB/C,EAAAlB,GAAgB,SAAU,CAC7C,MAAOwK,GACP,SAA2BtJ,EAAAnB,GAAoB,SAAU,CACvD,MAAOuK,GACP,SAA2BpJ,EAAApB,GAAiB,SAAU,CACpD,MAAO6B,GACP,SAAU5E,GAASpD,EAAU/T,EAAS,EACvC,EACF,EACF,CAAC,EACH,EACM,OAAAkb,IAAkCF,GAAe,CACtD,GAAGE,EACH,OAAAC,EACA,SAAUrN,EACX,GAAIA,EACP,EC5YMkX,GAAyCC,GAAA,SAAwB,CACrE,aAAc3E,EACd,UAAAvY,EACA,eAAAmT,EACA,eAAAgK,EACA,eAAAC,EACA,WAAAlO,EACA,kBAAAmO,EACA,eAAAlD,EACA,mBAAA1E,EACA,WAAA8E,EAAa,OACb,iBAAA+C,EAAmB,IACnB,kBAAA7C,EAAoB,IACpB,WAAAD,EAAa,UACb,OAAA+C,EACA,QAAAlK,EACA,YAAAmK,EACA,GAAGnE,CACL,EAAGP,EAAa,CACR,MAAA5F,EAAezX,EAAO,IAAI,EAC1B6e,EAAiB7e,EAAO,EAAE,EAC1B,CACJ,UAAAmd,EACA,MAAA9J,EACA,QAAA7C,CACE,EAAAoN,EACEpQ,EAAWsI,GAAQ,KAAO,CAC9B,eAAA4L,EACA,eAAAC,EACA,WAAAlO,EACA,kBAAAmO,EACA,eAAAlD,EACA,mBAAA1E,EACA,YAAavC,EACb,cAAe0F,EACf,eAAA0B,EACA,WAAAC,EACA,WAAAC,EACA,iBAAA8C,EACA,kBAAA7C,CACE,IAAC0C,EAAgBC,EAAgBlO,EAAYmO,EAAmBzE,EAAWuB,EAAgB1E,EAAoB8E,EAAYC,EAAY8C,EAAkB7C,CAAiB,CAAC,EACzKgD,EAAgBlM,GAAQ,KAAO,CACnC,YAAYtY,EAAOykB,EAAgB,CAC5BzkB,EAAM,iBAAiBmW,GAASoO,EAAavkB,CAAK,EACvD,IAAI0kB,EAAW1kB,EAAM,SACjB0kB,IAAa,SACJA,EAAAD,GAAkBzkB,EAAM,MAAQwZ,GAAK,OAE7CkL,GACHvO,GAASnD,EAAS,CAChB,MAAOhT,EAAM,MACb,IAAKA,EAAM,IACX,OAAQ0Z,GAAY,MACrB,CAEL,EACA,YAAYpb,EAAK,CACf6X,GAASnD,EAAS,CAChB,IAAA1U,EACA,OAAQob,GAAY,MACrB,CACH,CACE,IAAC6K,EAAavR,CAAO,CAAC,EACtB,IAAC6C,EAAc,YACb,MAAA8O,EAA4BrK,EAAAf,GAAgB,SAAU,CAC1D,MAAOvJ,EACP,SAA2BsK,EAAAjB,GAAqB,SAAU,CACxD,MAAOmL,EACP,WAA2BnF,GAAU,CACnC,GAAGe,EACH,UAAWd,GAAa,OACxB,YAAAO,EACA,aAAA5F,EACA,eAAgB,CACd,UAAAlT,EACA,aAAAkT,EACA,eAAAC,EACA,QAAAE,EACA,WAAAnE,EACA,QAAAjD,CACF,EACD,EACF,EACF,EACD,OAAIsR,IAAW,IAAQ,OAAO,SAAa,IACrBM,GAAaD,EAAU,SAAS,IAAI,EAC/CL,EACFA,EAAO,OAAmCM,GAAAD,EAAUL,EAAO,MAAM,EAAIA,EAAO,eAAiB,KAAOK,EAEtGA,CACT,CAAC,ECnGKE,GAAY,EACZC,GAAW,EACXC,GAAU,EACVC,GAAW,EACXC,GAAU,EACVC,GAAS,EACTC,GAAY,EACZC,GAAS,CAAC,WAAY,WAAY,UAAW,UAAW,UAAW,SAAU,WAAW,EACxFC,GAAWC,IAAW,CAC1B,GAAIA,EACJ,OAAQF,GAAOE,CAAM,EACrB,QAASA,EAASN,GAClB,UAAWM,IAAWH,GACtB,WAAYG,IAAWP,IAAWO,EAASL,EAC7C,GACMM,GAAaC,GAAaA,EAAYL,GAAYD,GAClDO,GAAe,CAACH,EAAQI,IAAkB,CAC9C,OAAQJ,EAAM,CACZ,KAAKR,GACL,KAAKD,GACH,OAAOE,GACT,KAAKE,GACL,KAAKD,GACH,OAAOO,GAAWG,CAAa,CAClC,CACH,EACMC,GAAaC,GAAW,OAAOA,GAAY,SAAW,CAACA,EAAQ,MAAOA,EAAQ,IAAI,EAAI,CAACA,EAASA,CAAO,ECvBvGC,GAAc,CAACP,EAAQQ,EAAUC,EAAaC,EAAWC,IAAa,CAC1E,aAAaD,EAAU,OAAO,EAC9B,MAAMnQ,EAAQwP,GAASC,CAAM,EAC7BQ,EAASjQ,CAAK,EACdkQ,EAAY,QAAUlQ,EACtBoQ,GAAYA,EAAS,CACnB,QAASpQ,CACb,CAAG,CACH,EACMqQ,GAAgB,CAAC,CACrB,MAAAC,EAAQ,GACR,KAAArY,EAAO,GACP,SAAAsY,EACA,QAAAC,EACA,QAAAT,EACA,eAAAU,EACA,aAAAC,EACA,cAAAb,EACA,cAAeO,CACjB,EAAI,KAAO,CACT,KAAM,CAACpQ,EAAOiQ,CAAQ,EAAI5iB,EAAS,IAAMmiB,GAASiB,EAAiBvB,GAAUQ,GAAWgB,CAAY,CAAC,CAAC,EAChGR,EAAcvjB,EAAOqT,CAAK,EAC1BmQ,EAAYxjB,IACZ,CAACgkB,EAAcC,CAAW,EAAId,GAAWC,CAAO,EAChD1F,EAAgBzc,GAAY,IAAM,CACtC,MAAM6hB,EAASG,GAAaM,EAAY,QAAQ,GAAIL,CAAa,EACjEJ,GAAUO,GAAYP,EAAQQ,EAAUC,EAAaC,EAAWC,CAAQ,CAC5E,EAAK,CAACA,EAAUP,CAAa,CAAC,EACtBgB,EAASjjB,GAAYkjB,GAAW,CACpC,MAAMC,EAAetB,GAAU,CAE7B,OADAO,GAAYP,EAAQQ,EAAUC,EAAaC,EAAWC,CAAQ,EACtDX,EAAM,CACZ,KAAKR,GACC0B,GAAgB,IAAGR,EAAU,QAAU,WAAW9F,EAAesG,CAAY,GACjF,MACF,KAAKvB,GACCwB,GAAe,IAAGT,EAAU,QAAU,WAAW9F,EAAeuG,CAAW,GAC/E,MACF,KAAK5B,GACL,KAAKG,GACHgB,EAAU,QAAU,WAAW,IAAMY,EAAatB,EAAS,CAAC,EAAG,CAAC,EAChE,KACH,CACP,EACUuB,EAAad,EAAY,QAAQ,QACnC,OAAOY,GAAY,YAAWA,EAAU,CAACE,GACzCF,EACF,CAACE,GAAcD,EAAaT,EAAQC,EAAWvB,GAAYC,GAAWC,EAAO,EAE7E8B,GAAcD,EAAa9Y,EAAOuY,EAAUrB,GAAWC,GAAUM,GAAWG,CAAa,CAAC,CAE7F,EAAE,CAACxF,EAAe+F,EAAUE,EAAOrY,EAAMsY,EAAUC,EAASG,EAAcC,EAAaf,CAAa,CAAC,EACtG9iB,UAAU,IAAM,IAAM,aAAaojB,EAAU,OAAO,EAAG,EAAE,EAClD,CAACnQ,EAAO6Q,EAAQxG,CAAa,CACtC,ECrDA,MAAM4G,GAAe,CAAC,CACpB,YAAAC,EACA,eAAA7C,EACA,eAAAC,EACA,WAAAlO,EACA,kBAAAmO,EAAoB,GACtB,EAAI,KAAO,CACT,KAAM,CAAC,CACL,OAAAkB,CACJ,EAAK0B,EAAY9G,CAAa,EAAIgG,GAAc,CAC5C,eAAgBa,EAChB,aAAc,CAAC7C,EACf,cAAeC,EACf,QAASC,EACT,MAAOpO,GAAcC,EAAY,MAAM,EACvC,KAAMD,GAAcC,EAAY,OAAO,CAC3C,CAAG,EACD,MAAO,CAAC,CACN,MAAO2D,GAAa0L,CAAM,EAC1B,cAAApF,CACD,EAAE8G,CAAU,CACf,ECtBMC,GAAuBlkB,GAAW,CACtC,KAAM,CAACmkB,EAAWF,CAAU,EAAIF,GAAa/jB,CAAO,EAC9C,CAACod,EAAegH,CAAgB,EAAIjkB,EAAQ,EAC5CkkB,EAAW,CAAClgB,EAAUqc,IAAiB,CAC3C4D,EAAiB,CACf,SAAAjgB,EACA,aAAAqc,CACN,CAAK,EACDyD,EAAW,EAAI,CACnB,EACE,MAAO,CAAC,CACN,cAAA7G,EACA,GAAG+G,CACP,EAAKF,EAAYI,CAAQ,CACzB,ECfMC,GAAW,CAACxR,EAAOyR,IAAa,CAIpC,KAAM,CAACC,CAAQ,EAAIrkB,EAAS,CAAE,GACvB,OACL,YAAa,IAAM,CACRqkB,EAAA,EAAI1R,GAASA,IAAU,QAClC,EACA,WAAc0R,EAAS,EAAIA,EAAS,EAAI,GAAQD,EAAS,GAAMtpB,CAAC,EAEpE,ECVMwpB,GAAgB,CAACC,EAActN,IAAW,CAC9C,MAAMwH,EAAWnf,EAAO2X,CAAM,EAC9BvX,GAAU,IAAM,CACV+e,EAAS,UAAYxH,GAAQhE,GAASsR,EAAc,CACtD,KAAMtN,CACZ,CAAK,EACDwH,EAAS,QAAUxH,CACvB,EAAK,CAACsN,EAActN,CAAM,CAAC,CAC3B,ECCMuN,GAA+BzD,GAAA,SAAc,CACjD,aAAc3E,EACd,aAAclW,EACd,YAAaue,EACb,WAAAC,EACA,YAAAC,EACA,aAAAJ,EACA,GAAGrH,CACL,EAAGP,EAAa,CACd,KAAM,CAACiI,EAAYd,EAAYI,CAAQ,EAAIH,GAAqB7G,CAAS,EACnE,CACJ,MAAAvK,CACE,EAAAiS,EACE3N,EAASvE,GAAWC,CAAK,EACzBkS,EAAYvlB,EAAO,IAAI,EACvBwlB,EAAcX,GAASxR,EAAO,CAACzM,EAAGpL,IAAMopB,EAAUppB,EAAE,OAAgC,OAAvB2b,GAAe,KAAiB,CAAC,EAC9FsO,EAAcxkB,GAAiBzF,GAAA,CACnCgpB,EAAW,EAAK,EACZhpB,EAAE,KAAe+pB,EAAA,QAAQ,MAAM,GAClC,CAACf,CAAU,CAAC,EACTjF,EAAiB/jB,GAAA,CACrB,OAAQA,EAAE,IAAK,CACb,KAAKwb,GAAK,GACR4N,EAASzN,GAAe,IAAI,EAC5B,MACF,KAAKH,GAAK,KACR4N,EAASzN,GAAe,KAAK,EAC7B,MACF,QACE,MACJ,CACA3b,EAAE,eAAe,GAEbkqB,EAAS/R,GAASyR,EAAY,CAClC,KAAMzN,CAAA,CACP,EACG,IAAC+N,GAAU,CAACA,EAAO,KAAY,UAAI,MAAM,kCAAkC,EAC/E,MAAMC,EAAc,CAClB,IAAKlJ,GAAeiJ,EAAO,IAAKH,CAAS,EACzC,GAAGvR,GAAW,CACZ,UAAAuL,EACA,GAAGiG,CAAA,EACFE,EAAO,KAAK,GAEb5R,GAAQ4R,EAAO,IAAI,IAAM,eAC3BC,EAAY,OAAShO,GAEjB,MAAAiO,EAAyCC,GAAAH,EAAQC,CAAW,EAClE,OAAAX,GAAcC,EAActN,CAAM,EAClCmO,GAAoBT,EAAa,KAAO,CACtC,SAAAT,EACA,UAAW,IAAMJ,EAAW,EAAK,CACjC,MACuBuB,EAAU,CACjC,SAAU,CAACH,EAA2B9N,EAAI0J,GAAgB,CACxD,GAAG5D,EACH,GAAG0H,EACH,aAAcxI,IAAc,OAAO4I,EAAO,MAAM,UAAa,SAAWA,EAAO,MAAM,SAAW,QAChG,UAAWH,EACX,IAAKlI,EACL,QAASoI,CAAA,CACV,CAAC,EACH,CACH,CAAC,ECvEKO,GAAe,CAACtS,EAAMuS,IAAqB,CAC/C,MAAMC,EAAyBC,GAAKF,CAAgB,EAC9CG,EAA4B3E,GAAW,CAACxd,EAAOlE,IAAQ,CAC3D,MAAMsmB,EAAUrmB,EAAO,IAAI,EAC3B,OAAoB8X,EAAIoO,EAAW,CACjC,GAAGjiB,EACH,QAASoiB,EACT,YAAatmB,EACb,WAAYR,GAAWmX,EAAgB,IAAM2P,EAAQ,OAC3D,CAAK,CACL,CAAG,EACD,OAAAD,EAAa,YAAc,gBAAgB1S,CAAI,IACxC0S,CACT,ECfME,GAAgB,CAACzR,EAAYwR,EAAS3N,IAAgB,CAC1D6D,GAA0B,IAAM,CAI9B,GAAI1H,EAAY,OAChB,MAAM8D,EAAO0N,EAAQ,QACrB,OAAA3N,EAAYC,EAAM,EAAI,EACf,IAAM,CACXD,EAAYC,CAAI,EAEjB,GAAC9D,EAAYwR,EAAS3N,CAAW,CAAC,CACvC,ECCM6N,GAAuBP,GAAa,UAAW,SAAiB,CACpE,aAAclJ,EACd,UAAAvY,EACA,SAAAiiB,EACA,UAAAjL,EACA,MAAAkL,EACA,YAAAC,EACA,aAAAzB,EACA,WAAAnQ,EACA,YAAAuQ,EACA,QAAAgB,EACA,aAAclB,EACd,eAAgBwB,EAChB,UAAAC,EAAY,CAAC,EACb,GAAGhJ,CACL,EAAG,CACK,MAAApQ,EAAWjO,GAAWwX,EAAe,EACrC,CACJ,YAAA4H,EACA,iBAAAkD,EACA,kBAAA7C,CACE,EAAAxR,EACE,CACJ,cAAAqZ,EACA,UAAAC,EACA,SAAUC,CAAA,EACRxnB,GAAWqX,EAAe,EACxB,CACJ,aAAAoQ,EACA,WAAA3I,EACA,SAAAtF,EACA,YAAAL,CAAA,EACEnZ,GAAWoX,EAAmB,EAC5BsQ,EAAWF,IAAmB,UAC9B,CAACzB,EAAYd,EAAY0C,CAAS,EAAIzC,GAAqBjX,CAAQ,EACnE,CACJ,MAAA6F,CACE,EAAAiS,EACEzQ,GAAa,CAAC,CAAC2R,EACf7O,EAASvE,GAAWC,CAAK,EACzBoE,GAAezX,EAAO,IAAI,EAC1B,CAACmnB,CAAO,EAAIzmB,EAAS,CACzB,EAAG,EACJ,EACK0mB,GAAY,IAAM,CACtB/I,EAAW,IAAI,EACX8I,EAAQ,IACV,aAAaA,EAAQ,CAAC,EACtBA,EAAQ,EAAI,EACd,EAEIvC,GAAW,IAAIyC,IAAS,CAClBD,KACDE,KACR,CAAAzS,IAAcqS,EAAU,GAAGG,CAAI,GAE5BC,GAAW,IAAM,CAACxS,GAAc,CAACD,IAAckE,EAAS9B,GAAiB,IAAKoP,EAAQ,OAAO,EAC7FkB,EAAqBnjB,GAAA,CAChBkjB,KACJZ,IAAqBS,EAAA,EAAI,WAAW,IAAM7T,GAAesR,EAAQ,EAAG,KAAK,IAAIxgB,EAAO,CAAC,CAAC,IAEvFqb,GAAqBjkB,GAAA,CACrBqZ,KACJrZ,EAAE,gBAAgB,EACd,EAAA2rB,EAAQ,GAAKxP,IACN0G,EAAA,GAAGW,EAAmB,IAAMuI,EAAU1F,EAAmB7C,CAAiB,EAAG,IAAMuI,EAAU1F,CAAgB,CAAC,IAErHnC,GAAiB,IAAM,CACjB0H,KACLzP,GAAQoB,EAAS9B,GAAiB,MAAOoP,EAAQ,OAAO,GAEzD9G,GAAiB/jB,GAAA,CACrB,GAAKsZ,EACL,OAAQtZ,EAAE,IAAK,CACb,KAAKwb,GAAK,MACRxb,EAAE,eAAe,EACnB,KAAKwb,GAAK,MACV,KAAKA,GAAK,MACQ0P,IAAA,QAAU9B,GAASzN,GAAe,KAAK,CAC3D,GAEIqQ,GAAuBhsB,GAAA,CAC3B,IAAIisB,GAAU,GACd,OAAQjsB,EAAE,IAAK,CACb,KAAKwb,GAAK,KACJW,IACF0O,EAAQ,QAAQ,QAChB7B,EAAW,EAAK,EACNiD,GAAA,IAEZ,MACF,KAAKzQ,GAAK,MACHW,IAAkB8P,GAAA,IACvB,KACJ,CACIA,KACFjsB,EAAE,eAAe,EACjBA,EAAE,gBAAgB,EACpB,EAEY8qB,GAAAzR,GAAYwR,EAAS3N,CAAW,EAC9CsM,GAAcC,EAActN,CAAM,EACxBvX,GAAA,IAAMie,EAAW,OAAO1G,CAAM,EAAG,CAAC0G,EAAY1G,CAAM,CAAC,EACrDvX,GAAA,IAAM,IAAM,aAAa+mB,EAAQ,CAAC,EAAG,CAACA,CAAO,CAAC,EACxD/mB,GAAU,IAAM,CACV0U,GAAckS,EAChBX,EAAQ,QAAQ,QAEhB7B,EAAW,EAAK,GAEjB,CAAC1P,EAAYkS,EAAcxC,EAAY6B,CAAO,CAAC,EAClDP,GAAoBT,EAAa,KAAO,CACtC,SAAU,IAAIgC,IAAS,CACLL,GAAApC,GAAS,GAAGyC,CAAI,CAClC,EACA,UAAW,IAAM,CACX1P,IACF0O,EAAQ,QAAQ,QAChB7B,EAAW,EAAK,EAEpB,CACA,IACI,MAAAhoB,GAAYsZ,GAAQ,KAAO,CAC/B,KAAM6B,EACN,MAAO7C,EACP,SAAUD,GACV,QAAS,EACP,IAAC8C,EAAQ7C,EAAYD,EAAU,CAAC,EAC9B,CACJ,IAAK6S,GACL,UAAWC,GACX,GAAGC,EACD,EAAAhB,EACEiB,GAAkB7T,GAAW,CACjC,eAAgBqK,EAAW,IAC3B,cAAAoB,GACA,eAAAC,GACA,UAAAH,GACA,QAAS,IAAMmH,IAAgB,QAAU9B,GAAS,GACjDgD,EAAa,EACVE,GAAc,IAAM,CAClB,MAAA3F,IAA4BtF,GAAU,CAC1C,GAAGe,EACH,GAAG0H,EACH,UAAWxI,IAAc,OAAO2J,GAAU,SAAWA,EAAQ,WAC7D,UAAWJ,EACX,aAAcY,EAAWtI,EAAclH,GACvC,UAAW8D,IAAcuL,IAAc,SAAWA,IAAc,OAASA,EAAY,SACrF,mBAAoBG,GAAYJ,EAChC,WAAAhS,EAAA,CACD,EACKkT,GAAYpJ,EAAY,QAC9B,OAAOsI,GAAYc,GAAsC3F,GAAAD,EAAU4F,EAAS,EAAI5F,CAAA,EAElF,SAAyB,KAAM,CAC7B,UAAWtM,GAAO,CAChB,MAAOM,GACP,QAASM,GACT,UAAAlS,CAAA,CACD,EACD,MAAO,CACL,SAAU,UACZ,EACA,KAAM+S,GACN,IAAKG,GACL,UAAW+P,GACX,SAAU,CAAc1P,EAAI,MAAO,CACjC,KAAMP,GACN,gBAAiB,GACjB,gBAAiBI,EACjB,GAAG/C,GAAYC,GAAYC,CAAU,EACrC,GAAG+S,GACH,IAAKpL,GAAeiL,GAAiBrB,CAAO,EAC5C,UAAWxQ,GAAO,CAChB,MAAOM,GACP,QAASE,GACT,UAAA7Z,GACA,UAAWmrB,EAAA,CACZ,EACD,SAAU7R,GAAQ,IAAMnC,GAAS8S,EAAOjqB,EAAS,EAAG,CAACiqB,EAAOjqB,EAAS,CAAC,EACvE,EAAG6W,GAASyU,IAAa,EAC3B,CACH,CAAC,ECjMKE,GAAe,CAAC3B,EAAS/N,EAAUxD,EAAYD,IAAe,CAClE,KAAM,CACJ,kBAAAmK,CACJ,EAAMzf,GAAWwX,EAAe,EACxB,CACJ,aAAAiQ,EACA,WAAA3I,EACA,SAAAtF,EACA,YAAAL,CACJ,EAAMnZ,GAAWoX,EAAmB,EAC5B2Q,EAAW,IAAM,CACrB,CAACxS,GAAc,CAACD,GAAckE,EAAS9B,GAAiB,IAAKoP,EAAQ,OAAO,CAChF,EACQ4B,EAAa,IAAM,CACvB,CAACpT,GAAckE,EAAS9B,GAAiB,MAAOoP,EAAQ,OAAO,CACnE,EACQ6B,EAAS1sB,GAAK,CACdsZ,GAAc,CAACtZ,EAAE,cAAc,SAASA,EAAE,aAAa,GAAGysB,GAClE,EACQxI,EAAgBjkB,GAAK,CACpBqZ,IACHrZ,EAAE,gBAAe,EACjB6iB,EAAW,GAAGW,EAAmBsI,EAAUA,CAAQ,EAEzD,EACQ5H,EAAiB,CAAC9Y,EAAGuhB,IAAc,CACvC9J,EAAW,IAAG,EACd,CAAC8J,GAAaF,GAClB,EACE,OAAA3B,GAAczR,EAAYwR,EAAS3N,CAAW,EAC9CtY,GAAU,IAAM,CACV0U,GAAckS,GAChB1O,EAAS,SAAWA,EAAS,QAAQ,MAAK,CAE7C,EAAE,CAACA,EAAUxD,EAAYkS,CAAY,CAAC,EAChC,CACL,SAAAM,EACA,OAAAY,EACA,cAAAzI,EACA,eAAAC,CACJ,CACA,EClCM0I,GAAwBpC,GAAa,WAAY,SAAkB,CACvE,UAAAzhB,EACA,MAAAzH,EACA,KAAAurB,EACA,KAAAC,EACA,QAAAC,EACA,SAAA/B,EACA,SAAAjW,EACA,QAAApM,EACA,WAAA2Q,EACA,QAAAuR,EACA,YAAAhJ,EACA,GAAGO,CACL,EAAG,CACK,MAAA/I,EAAa,CAAC,CAAC2R,EACf,CACJ,SAAAc,EACA,GAAGkB,CACD,EAAAR,GAAa3B,EAASA,EAASvR,EAAYD,CAAU,EACnDmN,EAAgBziB,GAAWsX,EAAoB,EAC/C4R,EAAalpB,GAAWuX,EAAiB,EACzC4R,EAAUJ,IAAS,QACnBK,EAAaL,IAAS,WACtBM,EAAW,CAAC,CAACP,GAAQ,CAACxT,GAAc,CAAC6T,GAAW,CAACC,EACjDE,EAAYH,EAAUD,EAAW,QAAU3rB,EAAQ6rB,EAAa,CAAC,CAACJ,EAAU,GAC5EO,EAAmBttB,GAAA,CACvB,GAAIqZ,EAAY,CACdrZ,EAAE,gBAAgB,EAClBA,EAAE,eAAe,EACjB,MACF,CACA,MAAMgC,EAAQ,CACZ,MAAAV,EACA,eAAgBtB,CAAA,EAEdA,EAAE,MAAQ,SAAWgC,EAAM,IAAMhC,EAAE,KACnCmtB,IAAkBnrB,EAAA,QAAU,CAACqrB,GAC7BH,IAAelrB,EAAA,KAAOirB,EAAW,MACrC9U,GAASxP,EAAS3G,CAAK,EACnBkrB,GAAS/U,GAAS8U,EAAW,cAAejrB,CAAK,EACvCwkB,EAAA,YAAYxkB,EAAOmrB,GAAcD,CAAO,GAElD9mB,EAAqBpG,GAAA,CACzB,GAAKsZ,EACL,OAAQtZ,EAAE,IAAK,CACb,KAAKwb,GAAK,MACRxb,EAAE,eAAe,EACnB,KAAKwb,GAAK,MACR4R,EAAWvC,EAAQ,QAAQ,MAAM,EAAIyC,EAAYttB,CAAC,CACtD,GAEIgB,EAAYsZ,GAAQ,KAAO,CAC/B,KAAAwS,EACA,SAAUzT,EACV,MAAOC,EACP,QAAS+T,EACT,OAAQD,CAAA,GACN,CAACN,EAAMzT,EAAYC,EAAY+T,EAAWD,CAAQ,CAAC,EACjDG,EAAc/U,GAAW,CAC7B,GAAGwU,EACH,cAAelB,EACf,UAAW1lB,EACX,QAASknB,GACRlL,CAAS,EACNoL,EAAgB,CACpB,KAAMN,EAAU,gBAAkBC,EAAa,mBAAqBpR,GACpE,eAAgBmR,GAAWC,EAAaE,EAAY,OACpD,GAAGjU,GAAYC,EAAYC,CAAU,EACrC,GAAGiU,EACH,IAAKtM,GAAeY,EAAagJ,CAAO,EACxC,UAAWxQ,GAAO,CAChB,MAAOM,GACP,QAASE,GACT,UAAA7Z,EACA,UAAA+H,CAAA,CACD,EACD,SAAUuR,GAAQ,IAAMnC,GAASpD,EAAU/T,CAAS,EAAG,CAAC+T,EAAU/T,CAAS,CAAC,GAEvE,OAAAosB,IAA4B,KAAM,CACvC,KAAMtR,GACN,WAA2B,IAAK,CAC9B,KAAA+Q,EACA,GAAGW,CAAA,CACJ,EACF,EAAiBlR,EAAI,KAAM,CAC1B,GAAGkR,CAAA,CACJ,CACH,CAAC,ECvFKC,GAA6BjD,GAAa,gBAAiB,SAAuB,CACtF,UAAAzhB,EACA,SAAAiiB,EACA,SAAAjW,EACA,WAAAuE,EACA,QAAAuR,EACA,YAAAhJ,EACA,GAAGO,CACL,EAAG,CACK,MAAA/I,EAAa,CAAC,CAAC2R,EACfzmB,EAAMC,EAAO,IAAI,EACjB,CACJ,SAAAsnB,EACA,eAAA5H,EACA,GAAG8I,CACD,EAAAR,GAAa3B,EAAStmB,EAAK+U,EAAYD,CAAU,EAC/C,CACJ,YAAA4Q,CAAA,EACElmB,GAAWsX,EAAoB,EAC7Bra,EAAYsZ,GAAQ,KAAO,CAC/B,SAAUjB,EACV,MAAOC,EACP,UAAW,EACT,IAACD,EAAYC,CAAU,CAAC,EACtBoU,EAAiBpT,GAAQ,IAAMnC,GAASpD,EAAU,CACtD,GAAG/T,EACH,IAAAuD,EACA,UAAW0lB,CACZ,GAAG,CAAClV,EAAU/T,EAAWipB,CAAW,CAAC,EAChCsD,EAAc/U,GAAW,CAC7B,GAAGwU,EACH,eAAgBhtB,GAAKkkB,EAAelkB,EAAG,EAAI,EAC3C,QAAS8rB,GACR1J,CAAS,EACZ,SAAwB,KAAM,CAC5B,KAAMrG,GACN,GAAG3C,GAAYC,CAAU,EACzB,GAAGkU,EACH,IAAKtM,GAAeY,EAAagJ,CAAO,EACxC,UAAWxQ,GAAO,CAChB,MAAOM,GACP,QAASE,GACT,UAAA7Z,EACA,UAAA+H,CAAA,CACD,EACD,SAAU2kB,CAAA,CACX,CACH,CAAC,ECpDKC,GAA2BhD,GAA8B1E,GAAA,SAAqB,CAClF,UAAAld,EACA,GAAGqZ,CACL,EAAGP,EAAa,CACd,SAAwB,KAAM,CAC5B,KAAM,YACN,GAAGO,EACH,IAAKP,EACL,UAAWxH,GAAO,CAChB,MAAOM,GACP,QAASG,GACT,UAAA/R,CAAA,CACD,EACF,CACH,CAAC,CAAC,ECdI6kB,GAA0BjD,GAA8B1E,GAAA,SAAoB,CAChF,UAAAld,EACA,GAAGqZ,CACL,EAAGP,EAAa,CACd,SAAwB,KAAM,CAC5B,KAAM/F,GACN,GAAGsG,EACH,IAAKP,EACL,UAAWxH,GAAO,CAChB,MAAOM,GACP,QAASI,GACT,UAAAhS,CAAA,CACD,EACF,CACH,CAAC,CAAC,ECVI8kB,GAAoC5H,GAAA,SAAmB,CAC3D,UAAAld,EACA,MAAA8C,EACA,aAAAiiB,EACA,GAAG1L,CACL,EAAGP,EAAa,CACR,MAAAtd,EAAMC,EAAO,IAAI,EACjB,CAACqhB,EAAekI,CAAgB,EAAI7oB,EAAS,EAC7C,CACJ,SAAA+T,EACA,YAAAwL,CAAA,EACE1gB,GAAWqX,EAAe,EAC9B,OAAA2F,GAA0B,IAAM,CAC1B,IAAA4E,EACAmI,GAAgBrJ,GAAe,IACjCkB,EAAYvH,GAAwB7Z,EAAI,OAAO,EAAE,OAASkgB,EACtDkB,EAAY,IAAeA,EAAA,IAEjCoI,EAAiBpI,GAAa,EAAI,CAChC,UAAAA,EACA,SAAA1M,CAAA,EACE,MAAS,CACZ,GAAC6U,EAAc7U,EAAUwL,CAAW,CAAC,EACxC1D,GAA0B,IAAM,CAC1B8E,IAAmBthB,EAAA,QAAQ,UAAY,IAC1C,CAACshB,CAAa,CAAC,IACM,MAAO,CAC7B,GAAGzD,EACH,IAAKnB,GAAeY,EAAatd,CAAG,EACpC,UAAW8V,GAAO,CAChB,MAAOM,GACP,QAASK,GACT,UAAAjS,CAAA,CACD,EACD,MAAO,CACL,GAAG8C,EACH,GAAGga,CACL,EACD,CACH,CAAC,EC3CD,MAAMzT,GAAQ,CACZC,EAAG,GACHC,EAAG,GACHC,EAAG,GACHC,GAAI,GACJC,IAAK,GACLub,KAAM,EACR,EAEMC,GAAa,GAEbC,GAAS5lB,OAAO6lB,gBAClB,IAAIA,gBAAgB,EAAG,CAAC,EACxBxiB,SAASC,cAAc,QAAQ,EAC7BwiB,GAAMF,GAAOG,WAAW,KAAM,CAClCC,mBAAoB,EACtB,CAAC,EACDF,GAAIG,sBAAwB,GAE5B,MAAMC,GAA2B,gBAEjC,SAASC,GAAO,CAAEzkB,MAAK2J,OAAM5Q,MAAM,GAAI2rB,WAAU,GAAGjmB,CAAM,EAAG,CAC3DkL,EAAOvB,GAAMuB,CAAI,GAAKA,GAAQvB,GAAME,EACpC,MAAMqc,EAAYnqB,IACZoqB,EAAYJ,GAAyBljB,KAAKtB,CAAG,EACnD,OACE6I,EAAA,QACEtO,IAAKoqB,EACL9a,MAAO,UAAU6a,EAAW,WAAa,EAAE,IACzCT,GAAWjkB,CAAG,EAAI,YAAc,EAAE,GAEpC6B,MAAO,CACL3E,MAAOyM,EACP1L,OAAQ0L,CACV,EACAC,MAAO7Q,EAAI,GACP0F,EAAKsM,SAER,CAAC,CAAC/K,GACD6I,EAAA,OACEgc,IAAK7kB,EACL9C,MAAOyM,EACP1L,OAAQ0L,EACR5Q,MACA+rB,QAAQ,OACRC,SAAS,QACTC,cAAc,MACdC,YACEhB,GAAWjkB,CAAG,IAAMklB,QAAa,CAACN,EAC9B,YACAM,OAENC,QAAgBnvB,GAAA,CACVA,EAAEkC,OAAO+sB,cACXjvB,EAAEkC,OAAO+sB,YAAc,KACvBjvB,EAAEkC,OAAO2sB,IAAM7kB,EAEnB,EACAolB,OAAepvB,GAAA,CACT2uB,EAAUllB,UAAmBA,UAAQ4lB,QAAQC,OAAS,IACtDrB,GAAWjkB,CAAG,IAAMklB,SACpBN,GACJzlB,WAAW,IAAM,CACX,IAEI,MAAEjC,QAAOe,UAAWjI,EAAEkC,OACxBgsB,GAAOhnB,QAAUA,IAAOgnB,GAAOhnB,MAAQA,GACvCgnB,GAAOjmB,SAAWA,IAAQimB,GAAOjmB,OAASA,GAC9CmmB,GAAImB,UAAUvvB,EAAEkC,OAAQ,EAAG,CAAC,EAC5B,MAAMstB,EAAYpB,GAAIqB,aAAa,EAAG,EAAGvoB,EAAOe,CAAM,EAEhDynB,EACJF,EAAUG,KAAKjf,OACb,CAACkf,EAAO7nB,IAAMA,EAAI,IAAM,GAAK6nB,GAAS,GACxC,EAAEvc,QACCmc,EAAUG,KAAKtc,OAAS,GAC3B,GACEqc,GAEQjmB,UAAQomB,UAAUC,IAAI,WAAW,EAE7C7B,GAAWjkB,CAAG,EAAI0lB,EAClBtB,GAAI2B,UAAU,EAAG,EAAG7oB,EAAOe,CAAM,OACvB,CAEVgmB,GAAWjkB,CAAG,EAAI,EACpB,GACC,CAAC,EACN,EACD,EAEC,CAEV,CAEA,MAAegmB,MAAIvB,EAAM,ECxFnBwB,GAAOhK,GAAW,CAACxd,EAAOlE,IAAQ,OAClC2rB,MACA,IACFA,EAAiBC,GAAY,OACnB,CAAC,CACTC,OAAQjmB,SAASimB,MAAQ,IAAIC,QAAQ,KAAM,EAAE,EAAEC,OAC/CF,IAAS,KAAWA,EAAA,KAClB,MAAEG,KAAI,GAAGnO,CAAc3Z,IAGzB,GAAE2nB,GAAQA,IAAS,KAAOA,EAAKI,SAAS,GAAG,EAAG,CAChD,MAAMC,EAAaxmB,IAAIC,MAAMkmB,EAAMjmB,SAASumB,MAAM,EAC9CD,uBAAYE,eAAZF,QAA0B9c,KAAM,CAC5Bid,QAAkB3c,MAAM4c,KAAKJ,EAAWE,aAAaxL,SAAS,EACjE2L,IAAI,CAAC,CAACxwB,EAAKgB,CAAK,IAAM,GAAGhB,CAAG,IAAIywB,mBAAmBzvB,CAAK,CAAC,EAAE,EAC3D0vB,KAAK,GAAG,EACJP,IAAWQ,SAAW,IAAML,CACrC,CACF,CAEA,MAAMM,EAAWd,IAASG,GAAMY,mBAAmBf,CAAI,IAAMG,EAC7D,OACE1d,EAAA,KACEtO,MACAsoB,KAAM,IAAI0D,CAAE,GAAG,GACXnO,EACJvO,MAAO,GAAGpL,EAAMoL,OAAS,EAAE,IAAIqd,EAAW,YAAc,EAAE,GAC1DvoB,QAAgB3I,GAAA,YACVA,OAAEoW,gBAAFpW,cAAiBoxB,aAAjBpxB,QAA6BqxB,QAAQ,MAEvCrxB,EAAEyE,gBAAgB,EAEhByrB,MAAuBoB,aAAepB,IAC1CznB,IAAME,UAANF,eAAgBzI,EAClB,EACD,CAEL,CAAC,EClDD,IAAIuxB,GAAS,GAGb,MAAMC,GAAW,IAAIC,iBAAkBC,GAAc,CACnDA,EAAU3b,QAAS4b,GAAa,CAC9B,GAAIA,EAAS7E,OAAS,aAAc,CAClC,KAAM,CAAE8E,OAAQD,EAASzvB,OACrB0vB,IAAQ,MACVL,GAAS,GAETA,GAAS,GAEGA,EAAO,GACrBC,GAAA,kCACA,cACF,uBACF,GACA,SAAAK,IAAA,CACFL,OAASM,GClBT,MAAMvrB,GAAOoF,SAASomB,gBAChBlmB,GAAQ2K,iBAAiBjQ,EAAI,EAC7ByrB,GAA4B,EAElC,IAAIC,GAAiB,CAAC,EAAG,EAAG,EAAG,CAAC,EAChC,SAASC,IAAoB,CAE3B,MAAMC,EAAmBtmB,GAAMumB,iBAAiB,WAAW,EACrDC,EAAqBxmB,GAAMumB,iBAAiB,aAAa,EACzDE,EAAsBzmB,GAAMumB,iBAAiB,cAAc,EAC3DG,EAAoB1mB,GAAMumB,iBAAiB,YAAY,EAC7DH,GAAiB,CAEfznB,KAAKC,IAAI,EAAG+nB,SAASL,EAAkB,EAAE,CAAC,EAC1C3nB,KAAKC,IAAI,EAAG+nB,SAASH,EAAoB,EAAE,CAAC,EAC5C7nB,KAAKC,IAAI,EAAG+nB,SAASF,EAAqB,EAAE,CAAC,EAC7C9nB,KAAKC,IAAI,EAAG+nB,SAASD,EAAmB,EAAE,CAAC,CAAC,CAEhD,CACAE,sBAAsBP,EAAiB,EAEvC,SAASQ,GAAuBC,EAAW,GAAI,CAK7C,OAJYV,GACTnB,IAAI,CAAC8B,EAAG7qB,KAAO6qB,GAAKZ,KAA8BW,EAAS5qB,CAAC,GAAK,EAAE,EACnEipB,KAAK,GAAG,CAGb,CAGI6B,IAAIC,SAAS,+BAA+B,GAC9CxqB,OAAOmM,iBAAiB,SAAUyd,GAAmB,CAAEa,QAAS,EAAK,CAAC,EC7BzD,SAASC,IAAgB,CACtC,KAAM,CAACrf,EAAMsf,CAAO,EAAI/tB,EAAS,CAC/BgC,MAAO,KACPe,OAAQ,IACV,CAAC,EAEDtD,UAAgB,IAAM,CACpB,MAAMuuB,EAAeA,IAAM,CACzBD,EAAQ,CACN/rB,MAAOoB,OAAO6qB,WACdlrB,OAAQK,OAAO8qB,WACjB,CAAC,GAGHF,WACA5qB,OAAOmM,iBAAiB,SAAUye,EAAc,CAC9CH,QAAS,EACX,CAAC,EAEM,IAAM,CACXzqB,OAAO+qB,oBAAoB,SAAUH,CAAY,EAEpD,EAAE,CAAE,GAEEvf,CACT,CCnBA,SAAS2f,GAAM7qB,EAAO,CACd,MAAEyT,iBAAgB2N,YAAa0J,EAAc/S,OAAU/X,IACvDkL,EAAOqf,KACPnJ,EAAc0J,WAAc9pB,QAAU8pB,EAAe/uB,EAAO,EAI5DgvB,EAAW3B,KACbrR,IAAU,MACR,QACAA,IAAU,QACV,MACAA,EACFA,EAEJ,OACE3N,EAAC6W,GAAI,CACHlL,mBAAoBkU,GAAuB,EAC3C1Q,eAAgB,GAAGrO,EAAKzM,KAAK,IAAIyM,EAAK1L,MAAM,GAC5Cke,eAAc,MACV1d,EACJ+X,MAAOgT,EACP3J,cACA3N,eAAgB,CACdvT,QAAgB3I,GAAA,WACVA,EAAEkC,SAAWlC,EAAEoW,iBACjByT,OAAYpgB,UAAZogB,cAAqB4J,YAArB5J,kBAEF3N,mBAAgBvT,UAAhBuT,eAA0Blc,EAC5B,EACA,GAAGkc,CACL,EACD,CAEL,CCvCA,SAAwBwX,GAASjrB,EAAO,CACtC,MAAMoU,EAAUrY,IAChB,OACEqO,EAACkY,GAAO,IACFtiB,EACJohB,YAAahN,EAEbuO,UAAW,CACTnH,cAAsBjkB,GAAA,SAChBA,EAAE2zB,cAAgB,WACpB9W,OAAQpT,UAARoT,cAAiBuM,WAAjBvM,gBAEJ,EACAqH,eAAuBlkB,GAAA,SACjBA,EAAE2zB,cAAgB,WACpB9W,OAAQpT,UAARoT,cAAiBuM,WAAjBvM,gBAEJ,EACA,GAAGpU,EAAM2iB,SACX,EACD,CAEL,CCnBA,SAASwI,GAAY,CACnBC,UAAU,GACVC,UAAU,GACVC,eACAC,oBACAC,aACAC,aACA,GAAGzrB,CACL,EAAG,CACK,MAAEsM,WAAUpM,UAAS,GAAGyZ,CAAc3Z,IAC5C,OAAKqrB,EAWHK,EAFaN,EAAUH,GAAWJ,GAE3B,CACLpI,YAAY,YACZnL,UAAU,SACV9G,SAAS,OACTwH,IAAK,GACLvd,MAAO,EACPqe,cAAc,kBAAiB,GAC3Ba,EACJwH,WAAYiK,EAAU3E,OAAYna,EAClCkW,MAAO4I,EAAU9e,EAAWma,OAAUna,SAAA,CAEtClC,EAAC+Z,GAAQ,CAAC7jB,UAAWirB,EAAmBrrB,UAAiBoM,SACtDgf,EACO,EACTG,EACAD,CAAU,EACL,EA1BJJ,EAAgBhhB,EAAC+Z,GAAQ,IAAKnkB,EAAQ,EACtCE,EACK0hB,GAAatV,EAAU,CAC5BpM,UACD,EAEIoM,CAsBX,CCzCA,SAASqf,GAAS3rB,EAAO,CACjB,MAAEM,YAAWiiB,WAAU,GAAG5I,CAAc3Z,IAC9C,OACEoK,EAAC4a,GAAa,CAAC1kB,YAAsBiiB,WAAmBjW,SACrDA,CAAC,CAAExQ,MAAKkvB,eACP5gB,EAACod,GAAI,IACC7N,EACJ7d,MACAoE,QAASA,CAAC,CAAE0rB,QACVZ,MAAUY,IAAW,EAAI,QAAUnF,MAAS,EAE/C,EAEU,CAEnB,CCnBA,SAAwBoF,GAAY,CAAEC,YAAWxxB,MAAKiH,KAAI,EAAG,CAC3D,OACEmqB,EAAA,WAAApf,SAAA,CACGwf,GACC1hB,EAAA,UAAQ2hB,OAAQD,EAAW7iB,MAAM,mCAAoC,EAEvEmB,EAAA,OAEEgc,IAAK7kB,EACLjH,MACA8Q,MAAM,wBACN3M,MAAM,KACNe,OAAO,KACP6mB,QAAQ,OACRC,SAAS,QACTC,cAAc,OARTjsB,GAAOiH,CASb,CAAC,EACK,CAEb,CCbA,MAAMyqB,GAAmBzE,GAAoB0E,GACpC,IAAIC,OAAO,KAAKD,EAAW1D,KAAK,GAAG,CAAC,KAAM,GAAG,CACrD,EAED,SAAS4D,GAAU,CAAElsB,OAAMmsB,QAAO,EAAG,CAC/B,IAACnsB,EAAa,SAElB,GADI,EAACmsB,WAAQxhB,SACT3K,EAAKosB,QAAQ,GAAG,IAAM,GAAWpsB,SAKrC,MAAMqsB,EAAQN,GAAiBI,EAAO/D,IAAW9wB,KAAEg1B,SAAS,CAAC,EAgBtDC,OAfUvsB,EAAKwsB,MAAMH,CAAK,EAAEjE,IAAI,CAACqE,EAAMptB,IAAM,CAClD,MAAMqtB,EAAQP,EAAOQ,KAAYr1B,KAAEg1B,YAAcG,CAAI,EACrD,GAAIC,EAAO,CACH,MAAEprB,MAAKuqB,WAAca,IAC3B,OACEviB,EAACyhB,GAAW,CACVC,YACAxxB,IAAKoyB,EACLnrB,OACKmrB,EAAO,IAAMptB,CACnB,CAEL,CACOotB,SACR,CAEH,CAEA,MAAenF,MAAI4E,EAAS,ECzBtBU,GAAetF,GAAgBuF,GAAA,CACnC,MAAMxwB,EAAU,CACdywB,YAAa,QAEX,IACF,OAAO,IAAIC,KAAKC,SAASH,GAAUrG,OAAWnqB,CAAO,OAC3C,CACV,OAAO,IAAI0wB,KAAKC,SAASxG,OAAWnqB,CAAO,CAC7C,CACF,CAAC,EAEK4wB,GAAa,gBACbC,GAAmB,oCACnBC,GAAe,OACfC,GAA0B,iBAEhC,SAASC,GAAS,CAChBC,UACAhV,WACAiV,aACAC,WACAC,QACAhoB,WACAxF,SACF,EAAG,CACK,MAAEwC,QAASirB,GAAU,EACrB,CACJC,OACAC,SACAC,eACA7sB,KACAM,MACAwsB,cACA3B,SACAhmB,MACA4nB,UACET,IACE,CAAC5qB,EAAGsrB,EAAOC,CAAK,EAAIN,EAAKO,MAAMjB,EAAU,GAAK,CAAGU,EAAI,EAEtDrV,IAAqB6V,OAAM7V,UAEhC,MAAM8V,EAAkBL,EAASM,YAAY,EAAEzG,KAAK,EAC9C0G,GAAsBR,GAAe,IAAIO,cAAczG,OACvD2G,EAAuBD,EAC1B3G,QAAQuF,GAAkB,EAAE,EAC5BvF,QAAQwF,GAAc,EAAE,EACrBqB,EAAmCD,EAAqB5G,QAC5DyF,GACA,EACF,EAEMqB,EACH,CAAChB,IACCW,IAAoBE,GACnBF,IAAoBG,GACpBH,IAAoBI,GACpB5B,GAAanqB,EAAKoqB,MAAM,EAAE6B,QACxBN,EACAG,CACF,IAAM,IACVC,IAAqCb,EAAKU,cAE5C,OACE5C,EAAA,KACEtgB,MAAO,aAAaqiB,EAAW,YAAc,EAAE,IAAIC,EAAQ,QAAU,EAAE,GACvEtJ,KAAM7iB,EACN9H,OAAQiM,EAAW,SAAW,KAC9ByF,MACE4iB,EACI,GAAGA,CAAW,KAAKG,EAAQ,GAAK,GAAG,GAAGN,CAAI,IAC1C,GAAGM,EAAQ,GAAK,GAAG,GAAGN,CAAI,GAEhC1tB,QAAgB3I,GAAA,CACd,GAAImO,IACAnO,GAAEwD,SAGFmF,IAFJ3I,EAAE0B,eAAe,EACjB1B,EAAEyE,gBAAgB,EACdkE,EAAgBA,SAAQ3I,CAAC,EACzBA,KAAEuD,SAAWvD,EAAEsD,SAAWtD,EAAEwD,UAAYxD,EAAEq3B,QAAU,EAAG,CACzD,MAAMC,EAAc,KAAKtW,CAAQ,MAAMtX,CAAE,GAClCsB,YAAKssB,EAAa,QAAQ,EACjC,MACF,CACAC,EAAOC,YAAc,CACnBxB,UACAhV,YAEJ,EAAEjM,SAEDkhB,IACC9B,EAAAsD,EAAA,CAAA1iB,SAAA,CACElC,EAAC4b,GAAM,CAACzkB,IAAKusB,GAAgBD,EAAQ5H,SAAU7f,CAAM,GAAE,GAAG,CAC1D,GAEH2nB,GAAe,CAACL,EACfhC,EAAAsD,EAAA,CAAA1iB,UACElC,EAAA,KAAG+e,IAAI,OAAM7c,SACXlC,EAAC+hB,GAAS,CAAClsB,KAAM8tB,EAAa3B,SAAiB,CAC9C,GACF,CAACqB,GAAY,CAACiB,GACbhD,EAAAsD,EAAA,CAAA1iB,SAAA,CACG,IACDof,EAAA,KAAGtgB,MAAM,eAAckB,SAAA,CAAC,IAAE0hB,CAAQ,EAAI,CAAC,EACvC,CACH,EACD,EACAN,EACFtjB,EAAA,KAAAkC,SAAI0hB,EAAY,EAEhB5jB,EAAA,KAAAkC,SAAI0hB,EAAY,EAEjBP,GACC/B,EAAAsD,EAAA,CAAA1iB,SACElC,GAAK,SACLshB,EAAA,KAAGtgB,MAAM,eAAckB,SACpB4hB,GAAQ,GAAK,IACbD,EACA,CAAC,CAACC,GAAS9jB,EAAA,QAAMgB,MAAM,KAAIkB,SAAE4hB,EAAY,CAAC,EAC1C,CAAC,EACJ,CACH,EACA,CAEP,CAEA,MAAe3G,MAAI+F,EAAQ,ECnIrB2B,GAAe,CACnB,SAAU,MACVC,QAAS,SACX,EAEMC,GAAS5H,GACZuF,GACC,IAAIE,KAAKoC,aAAatC,GAAUrG,OAAW,CACzCpC,KAAM,UACR,CAAC,CACL,EAEA,SAASgL,GAAiBz0B,EAAM,CAC9B,IAAIkyB,EACAwC,EACA,OAAO10B,GAAS,WACjB,CAAEA,OAAMkyB,SAAQwC,UAAU,EAAG10B,GAEhC,GAAI,CACF,MAAMqF,EAAOkvB,GAAOrC,GAAUpqB,EAAKoqB,MAAM,EAAEyC,GAAG30B,CAAI,EAClD,GAAIqF,IAASrF,EAAM,OAAOqF,EAC1B,GAAI,CAACqvB,EAAU,CACb,MAAME,EAAcL,GAAOv0B,CAAI,EAAE20B,GAAG30B,CAAI,EACxC,GAAI40B,IAAgB50B,EAAM,OAAO40B,CACnC,CACA,OAAOF,GAAY,EACpB,MAAW,CACV,GAAIL,GAAar0B,CAAI,EACnB,GAAI,CACF,MAAMqF,EAAOkvB,GAAOF,GAAanC,CAAM,GAAKA,GAAUpqB,EAAKoqB,MAAM,EAAEyC,GACjEN,GAAar0B,CAAI,CACnB,EACA,OAAIqF,IAASgvB,GAAar0B,CAAI,EAAUqF,EACjCqvB,GAAY,QACR,EAEb,OAAAA,GAAA,EACF,EAEF,MAAAG,GAAAlI,GAAA8H,EAAA,ECtCF,SAASK,GAAY72B,EAAO,CAC1B,GAAIA,aAAiB82B,KACnB,MAAO,CAACC,MAAM/2B,EAAMg3B,QAAS,GACxB,CACCC,QAAO,IAAIH,KAAK92B,CAAK,EAC3B,MAAO,CAAC+2B,MAAME,EAAKD,QAAS,EAC9B,CACF,CAEA,MAAME,GAAiBxI,GACrB,IAAM,IAAIyF,KAAKgD,eAAe,EAAEC,gBAAgB,EAAEnD,MACpD,EACMoD,GAAM3I,GAAI,CAACuF,EAAQxrB,EAAO,KAAO,CACrC,MAAM6uB,EAAmBrD,EAAOlF,QAAQ,YAAa,EAAE,EACjDwI,EAAOC,GAAY,CAACF,CAAgB,EAAG,CAACJ,GAAgB,GAAGjD,CAAM,EACnE,IACF,OAAO,IAAIE,KAAKgD,eAAeI,EAAM9uB,CAAI,OAC/B,CAAC,CACT,IACF,OAAO,IAAI0rB,KAAKgD,eAAelD,EAAQxrB,CAAI,OACjC,CAAC,CACb,OAAO,IAAI0rB,KAAKgD,eAAevJ,OAAWnlB,CAAI,CAChD,CAAC,EACKgvB,GAAM/I,GAAgBuF,GAAA,IAAIE,KAAKuD,mBAAmBzD,GAAUrG,MAAS,CAAC,EAEtE+J,GAAS,GACTC,GAAO,GAAKD,GACZE,GAAM,GAAKD,GAEXE,GAAuBb,GAAA,CAErBc,QAAMN,GAAI5tB,EAAKoqB,MAAM,EACrB+D,GAAWf,EAAKD,QAAYF,OAAKmB,IAAS,OAC1CC,EAAahvB,KAAKivB,IAAIH,CAAO,EACnC,OAAIE,EAAaP,GACRI,EAAIK,OAAOJ,EAAS,QAAQ,EAC1BE,EAAaN,GACfG,EAAIK,OAAOlvB,KAAKmvB,MAAML,EAAUL,EAAM,EAAG,QAAQ,EAC/CO,EAAaL,GACfE,EAAIK,OAAOlvB,KAAKmvB,MAAML,EAAUJ,EAAI,EAAG,MAAM,EAE7CG,EAAIK,OAAOlvB,KAAKmvB,MAAML,EAAUH,EAAG,EAAG,KAAK,CAEtD,EAEMS,GAA2BrB,GAAA,CAE/B,MAAMe,GAAWlB,KAAKmB,IAAQhB,IAAKD,QAAa,OAChD,OAAIgB,EAAUL,GACZ9tB,EAAAC,EAAS,CAAAyuB,OAAA,CAAAC,EAEKR,EAAU,EAAI,EAAI9uB,KAAKmvB,MAAML,CAAO,CAAC,EAAA5vB,GAAA,QACnD,GACS4vB,EAAUJ,GACnB/tB,EAAAC,EAAS,CAAAyuB,OAAA,CAAAC,EAEKtvB,KAAKmvB,MAAML,EAAUL,EAAM,CAAC,EAAAvvB,GAAA,QAC1C,GAEAyB,EAAAC,EAAS,CAAAyuB,OAAA,CAAAC,EAEKtvB,KAAKmvB,MAAML,EAAUJ,EAAI,CAAC,EAAAxvB,GAAA,QACxC,EAEJ,EAEA,SAAwBqwB,GAAa,CAAEC,WAAUN,QAAO,EAAG,CACrD,IAACM,EAAiB,YAChB,MAACC,EAAaC,CAAQ,EAAIlX,GAAkB/e,KAAI,EAAG,CAAC,EACpDs0B,EAAOje,GAAQ,IAAM,IAAI8d,KAAK4B,CAAQ,EAAG,CAACA,CAAQ,CAAC,EACnD,CAACG,EAASC,EAAIxmB,CAAK,EAAI0G,GAAQ,IAAM,CACrC,IAAC6d,GAAYI,CAAI,QAAU,CAAC,GAAKyB,EAAU,GAAI,EAAE,EACjDK,MACJ,GAAIX,IAAW,QAAS,CAEhBH,YAAUnB,MACCmB,EAAIjB,UAAYC,EAAKD,WAAa,IAAOa,IAC3C,EACbkB,EAAMT,GAAerB,CAAI,EAERgB,EAAIe,YAAY,IAAM/B,EAAK+B,YAAY,EAEhD3B,KAAIxtB,EAAKoqB,OAAQ,CACrBgF,KAAMrL,OACNzd,MAAO,QACP0nB,IAAK,UACN,EAAEO,OAAOnB,CAAI,EAERI,KAAIxtB,EAAKoqB,OAAQ,CACrBiF,UAAW,QACZ,EAAEd,OAAOnB,CAAI,CAGpB,CACA,OAAK8B,IAAWjB,KAAWb,CAAI,GACxB,CAAC8B,EAAK9B,EAAKkC,YAAelC,IAAKmC,gBAAgB,CACrD,GAACnC,EAAMmB,EAAQO,CAAW,CAAC,EAE9Br1B,UAAU,IAAM,CACV,IAACuzB,GAAYI,CAAI,EAAG,OACpB3Q,MACA+S,EACJ,SAASC,GAAc,CACrBD,EAAMlI,sBAAsB,IAAM,CACvByH,IACQW,GAAA,CAClB,CACH,CACA,SAASA,GAAmB,CAI1B,MAAMvB,GAAWlB,KAAKmB,IAAQhB,IAAKD,QAAa,OAC5CgB,EAAUL,GACF9vB,aAAWyxB,EAAa,GAAM,EAC/BtB,EAAUJ,KACT/vB,aAAWyxB,EAAa,GAAM,EAE5C,CACiB,OAAAC,IACV,IAAM,CACXvlB,aAAasS,CAAO,EACpBkT,qBAAqBH,CAAG,EAE5B,EAAG,CAAE,GAGH9nB,EAAA,QAAMmnB,SAAUI,EAAIxmB,QAAamB,SAC9BolB,EACG,CAEV,kmHCpIMY,GAAU/K,GAAI,IAAM,CACxB,IAAIyF,KAAKgD,eAAc,EAAGC,gBAAe,EAAGnD,OAC5C,GAAGhqB,UAAUyvB,SAAS,CACvB,EAEKC,GAAwBA,IAC5BnC,GACEiC,GAAS,EACTG,GAA2BpK,IAAKve,GAAMA,EAAElP,KAAKgtB,QAAQ,IAAK,GAAG,CAAC,EAC9D,IACF,EAEF,SAAS8K,GAA2BC,EAAe,GAAO,CACxD,GAAIA,EAAc,CAChB,KAAM,CAAEC,oCAAqC9D,EAAOvlB,SACpD,GAAIqpB,EACF,OAAOA,CAEX,CACA,OAAOJ,GAAqB,CAC9B,CCvBA,MAAMK,GAAc,CAClB,OACA,WACA,WACA,WACA,WACA,UAAU,EAEG,SAASC,GAAYC,EAAO,CACzC,MAAMC,EAAYjxB,KAAKG,IACrBH,KAAKmvB,MAAMnvB,KAAKkxB,KAAKF,CAAK,EAAI,EAAE,EAChCF,GAAYjoB,OAAS,CACvB,EACM/R,EAAQk6B,EAAQ,MAAQC,EAC9B,OAAOtwB,EAAK6O,OAAO1Y,EAAO,CACxBuK,MAAO,OACP8vB,KAAML,GAAYG,CAAS,EAC3BG,YAAa,SACbC,sBAAuB,CACzB,CAAC,CACH,CCvBO,MAAMC,GAAS,6IACTC,GAAoBl1B,GAAY,CACzC,GAAI,OAAOA,GAAY,SACnB,MAAM,IAAI,UAAU,kCAAkC,EAE1D,MAAM+vB,EAAQ/vB,EAAQ,MAAMi1B,EAAM,EAClC,GAAI,CAAClF,EACD,MAAM,IAAI,MAAM,uCAAuC/vB,CAAO,aAAa,EAE/E,OAAA+vB,EAAM,MAAK,EACJA,CACX,EACMoF,GAAc3pB,GAAMA,IAAM,KAAOA,IAAM,KAAOA,IAAM,IACpD4pB,GAAYrJ,GAAM,CACpB,MAAM7yB,EAAI,SAAS6yB,EAAG,EAAE,EACxB,OAAO,MAAM7yB,CAAC,EAAI6yB,EAAI7yB,CAC1B,EACMm8B,GAAY,CAACre,EAAGC,IAAM,OAAOD,GAAM,OAAOC,EAAI,CAAC,OAAOD,CAAC,EAAG,OAAOC,CAAC,CAAC,EAAI,CAACD,EAAGC,CAAC,EAC5Eqe,GAAiB,CAACte,EAAGC,IAAM,CAC7B,GAAIke,GAAWne,CAAC,GAAKme,GAAWle,CAAC,EAC7B,MAAO,GACX,KAAM,CAACse,EAAIC,CAAE,EAAIH,GAAUD,GAASpe,CAAC,EAAGoe,GAASne,CAAC,CAAC,EACnD,OAAIse,EAAKC,EACE,EACPD,EAAKC,EACE,GACJ,CACX,EACaC,GAAkB,CAACze,EAAGC,IAAM,CACrC,QAAS/V,EAAI,EAAGA,EAAI,KAAK,IAAI8V,EAAE,OAAQC,EAAE,MAAM,EAAG/V,IAAK,CACnD,MAAM7H,EAAIi8B,GAAete,EAAE9V,CAAC,GAAK,IAAK+V,EAAE/V,CAAC,GAAK,GAAG,EACjD,GAAI7H,IAAM,EACN,OAAOA,CACd,CACD,MAAO,EACX,EC3Baq8B,GAAkB,CAACC,EAAIC,IAAO,CAEvC,MAAMC,EAAKX,GAAiBS,CAAE,EACxBG,EAAKZ,GAAiBU,CAAE,EAExBG,EAAKF,EAAG,MACRG,EAAKF,EAAG,MAERz8B,EAAIo8B,GAAgBI,EAAIC,CAAE,EAChC,OAAIz8B,IAAM,EACCA,EAEP08B,GAAMC,EACCP,GAAgBM,EAAG,MAAM,GAAG,EAAGC,EAAG,MAAM,GAAG,CAAC,EAE9CD,GAAMC,EACJD,EAAK,GAAK,EAEd,CACX,ECTaxF,GAAU,CAACoF,EAAIC,EAAIK,IAAa,CAEzCC,GAAoBD,CAAQ,EAG5B,MAAME,EAAMT,GAAgBC,EAAIC,CAAE,EAClC,OAAOQ,GAAeH,CAAQ,EAAE,SAASE,CAAG,CAChD,EACMC,GAAiB,CACnB,IAAK,CAAC,CAAC,EACP,KAAM,CAAC,EAAG,CAAC,EACX,IAAK,CAAC,CAAC,EACP,KAAM,CAAC,GAAI,CAAC,EACZ,IAAK,CAAC,EAAE,EACR,KAAM,CAAC,GAAI,CAAC,CAChB,EACMC,GAAmB,OAAO,KAAKD,EAAc,EAC7CF,GAAuBI,GAAO,CAChC,GAAI,OAAOA,GAAO,SACd,MAAM,IAAI,UAAU,kDAAkD,OAAOA,CAAE,EAAE,EAErF,GAAID,GAAiB,QAAQC,CAAE,IAAM,GACjC,MAAM,IAAI,MAAM,qCAAqCD,GAAiB,KAAK,GAAG,CAAC,EAAE,CAEzF,EC3BaE,GAAY,CAACv2B,EAASw2B,IAAU,CAIzC,GAFAA,EAAQA,EAAM,QAAQ,eAAgB,IAAI,EAEtCA,EAAM,SAAS,IAAI,EACnB,OAAOA,EAAM,MAAM,IAAI,EAAE,KAAMn9B,GAAMk9B,GAAUv2B,EAAS3G,CAAC,CAAC,EAEzD,GAAIm9B,EAAM,SAAS,KAAK,EAAG,CAC5B,KAAM,CAACxf,EAAGC,CAAC,EAAIuf,EAAM,MAAM,MAAO,CAAC,EACnC,OAAOD,GAAUv2B,EAAS,KAAKgX,CAAC,MAAMC,CAAC,EAAE,CAC5C,SACQuf,EAAM,SAAS,GAAG,EACvB,OAAOA,EACF,KAAM,EACN,QAAQ,UAAW,GAAG,EACtB,MAAM,GAAG,EACT,MAAOn9B,GAAMk9B,GAAUv2B,EAAS3G,CAAC,CAAC,EAG3C,MAAMoS,EAAI+qB,EAAM,MAAM,aAAa,EAC7BF,EAAK7qB,EAAIA,EAAE,CAAC,EAAI,IAEtB,GAAI6qB,IAAO,KAAOA,IAAO,IACrB,OAAO/F,GAAQvwB,EAASw2B,EAAOF,CAAE,EAErC,KAAM,CAACX,EAAIC,EAAIa,EAAM,CAAAC,CAAE,EAAIxB,GAAiBl1B,CAAO,EAC7C,CAAC22B,EAAIC,EAAIC,EAAM,CAAAC,CAAE,EAAI5B,GAAiBsB,CAAK,EAC3CzK,EAAI,CAAC4J,EAAIC,EAAIa,CAAE,EACfp9B,EAAI,CAACs9B,EAAIC,GAAoC,IAAKC,GAAoC,GAAG,EAE/F,GAAIC,IACI,CAACJ,GAEDjB,GAAgB1J,EAAG1yB,CAAC,IAAM,GAE1Bo8B,GAAgBiB,EAAG,MAAM,GAAG,EAAGI,EAAG,MAAM,GAAG,CAAC,IAAM,IAClD,MAAO,GAGf,MAAMC,EAAU19B,EAAE,UAAW0yB,GAAMA,IAAM,GAAG,EAAI,EAE1C7qB,EAAIo1B,IAAO,IAAM,EAAIS,EAAU,EAAIA,EAAU,EAKnD,MAHI,EAAAtB,GAAgB1J,EAAE,MAAM,EAAG7qB,CAAC,EAAG7H,EAAE,MAAM,EAAG6H,CAAC,CAAC,IAAM,GAGlDu0B,GAAgB1J,EAAE,MAAM7qB,CAAC,EAAG7H,EAAE,MAAM6H,CAAC,CAAC,IAAM,GAGpD,yUCzDM81B,GAAkB,YAClBC,GAAqB,sBACrBC,GAAiB,WACjBC,GAAgB,UAEtB,MAAMC,GAAmB,CACvB,kBAAmBH,GACnB,oBAAqBA,GACrB,qBAAsBA,GACtB,8BAA+BA,GAC/B,2BAA4BA,GAC5B,0BAA2BA,GAC3B,sBAAuBA,GACvB,yBAA0BA,GAC1B,iCAAkCA,GAClC,qBAAsBD,GACtB,iCAAkCA,GAClC,wBAAyBA,GACzB,iCAAkCE,GAClC,gCAAiCC,EACnC,EAEME,GAAgB,GAEtB,SAASpL,GAASqL,EAAS,SACzB,GAAI,CACF,GAAI,CAAEt3B,UAASu3B,QAAQ,EAAGC,GAAkB,EACxCC,IAAeC,QAAkB,IAAlBA,cAAsBC,WAAtBD,cAAgCrmB,OAAQ,WAEvDomB,IAAiB,aAEnBA,EAAe,YAGjB,MAAMh+B,EAAM,GAAG89B,CAAM,IAAID,CAAO,GAChC,GAAID,GAAc59B,CAAG,EAAG,OAAO49B,GAAc59B,CAAG,EAEhD,GAAI29B,GAAiBE,CAAO,EAC1B,OAAQD,GAAc59B,CAAG,EAAI29B,GAAiBE,CAAO,EAAE7yB,KAAKzE,CAAO,EAGrE,MAAMw2B,EAAQoB,GAASN,CAAO,EAC9B,GAAI,CAACd,EAAO,MAAO,GAKnB,MAAMqB,EAFkBP,EAAQvH,MAAM,cAAc,EAAE,CAAC,IAET0H,EAAavH,YAAW,EACtE,OAAQmH,GAAc59B,CAAG,EACvBo+B,GACAtB,GAAUv2B,EAASw2B,EAAO,CACxBsB,kBAAmB,GACnBC,MAAO,EACT,CAAC,CACJ,MAAW,CACV,MAAO,EACT,CACF,CC7DA,MAAMC,GAAS,WAGTC,GAAO,GACPC,GAAO,EACPC,GAAO,GACPC,GAAO,GACPC,GAAO,IACPC,GAAc,GACdC,GAAW,IACXC,GAAY,IAGZC,GAAgB,QAChBC,GAAgB,aAChBC,GAAkB,4BAGlBC,GAAS,CACd,SAAY,kDACZ,YAAa,iDACb,gBAAiB,eAClB,EAGMC,GAAgBZ,GAAOC,GACvBpF,GAAQ,KAAK,MACbgG,GAAqB,OAAO,aAUlC,SAASC,GAAM9S,EAAM,CACpB,MAAM,IAAI,WAAW2S,GAAO3S,CAAI,CAAC,CAClC,CAUA,SAASgE,GAAI+O,EAAO/6B,EAAU,CAC7B,MAAMg7B,EAAS,GACf,IAAIzsB,EAASwsB,EAAM,OACnB,KAAOxsB,KACNysB,EAAOzsB,CAAM,EAAIvO,EAAS+6B,EAAMxsB,CAAM,CAAC,EAExC,OAAOysB,CACR,CAYA,SAASC,GAAU3B,EAAQt5B,EAAU,CACpC,MAAMk7B,EAAQ5B,EAAO,MAAM,GAAG,EAC9B,IAAI0B,EAAS,GACTE,EAAM,OAAS,IAGlBF,EAASE,EAAM,CAAC,EAAI,IACpB5B,EAAS4B,EAAM,CAAC,GAGjB5B,EAASA,EAAO,QAAQoB,GAAiB,GAAM,EAC/C,MAAMS,EAAS7B,EAAO,MAAM,GAAG,EACzB8B,EAAUpP,GAAImP,EAAQn7B,CAAQ,EAAE,KAAK,GAAG,EAC9C,OAAOg7B,EAASI,CACjB,CAeA,SAASC,GAAWxmB,EAAQ,CAC3B,MAAMymB,EAAS,GACf,IAAIC,EAAU,EACd,MAAMhtB,EAASsG,EAAO,OACtB,KAAO0mB,EAAUhtB,GAAQ,CACxB,MAAM/R,EAAQqY,EAAO,WAAW0mB,GAAS,EACzC,GAAI/+B,GAAS,OAAUA,GAAS,OAAU++B,EAAUhtB,EAAQ,CAE3D,MAAMitB,EAAQ3mB,EAAO,WAAW0mB,GAAS,GACpCC,EAAQ,QAAW,MACvBF,EAAO,OAAO9+B,EAAQ,OAAU,KAAOg/B,EAAQ,MAAS,KAAO,GAI/DF,EAAO,KAAK9+B,CAAK,EACjB++B,IAEJ,MACGD,EAAO,KAAK9+B,CAAK,CAElB,CACD,OAAO8+B,CACR,CAUA,MAAMG,GAAaC,GAAc,OAAO,cAAc,GAAGA,CAAU,EAW7DC,GAAe,SAASC,EAAW,CACxC,OAAIA,GAAa,IAAQA,EAAY,GAC7B,IAAMA,EAAY,IAEtBA,GAAa,IAAQA,EAAY,GAC7BA,EAAY,GAEhBA,GAAa,IAAQA,EAAY,IAC7BA,EAAY,GAEb5B,EACR,EAaM6B,GAAe,SAASC,EAAOtwB,EAAM,CAG1C,OAAOswB,EAAQ,GAAK,IAAMA,EAAQ,MAAQtwB,GAAQ,IAAM,EACzD,EAOMuwB,GAAQ,SAASC,EAAOC,EAAWC,EAAW,CACnD,IAAIjgC,EAAI,EAGR,IAFA+/B,EAAQE,EAAYrH,GAAMmH,EAAQ5B,EAAI,EAAI4B,GAAS,EACnDA,GAASnH,GAAMmH,EAAQC,CAAS,EACFD,EAAQpB,GAAgBV,IAAQ,EAAGj+B,GAAK+9B,GACrEgC,EAAQnH,GAAMmH,EAAQpB,EAAa,EAEpC,OAAO/F,GAAM54B,GAAK2+B,GAAgB,GAAKoB,GAASA,EAAQ7B,GAAK,CAC9D,EASMgC,GAAS,SAASC,EAAO,CAE9B,MAAMd,EAAS,GACTe,EAAcD,EAAM,OAC1B,IAAIn5B,EAAI,EACJhI,EAAIq/B,GACJgC,EAAOjC,GAMPkC,EAAQH,EAAM,YAAY7B,EAAS,EACnCgC,EAAQ,IACXA,EAAQ,GAGT,QAASC,EAAI,EAAGA,EAAID,EAAO,EAAEC,EAExBJ,EAAM,WAAWI,CAAC,GAAK,KAC1B1B,GAAM,WAAW,EAElBQ,EAAO,KAAKc,EAAM,WAAWI,CAAC,CAAC,EAMhC,QAAShkB,EAAQ+jB,EAAQ,EAAIA,EAAQ,EAAI,EAAG/jB,EAAQ6jB,GAAwC,CAO3F,MAAMI,EAAOx5B,EACb,QAASy5B,EAAI,EAAGzgC,EAAI+9B,IAA0B/9B,GAAK+9B,GAAM,CAEpDxhB,GAAS6jB,GACZvB,GAAM,eAAe,EAGtB,MAAMgB,EAAQH,GAAaS,EAAM,WAAW5jB,GAAO,CAAC,EAEhDsjB,GAAS9B,IACZc,GAAM,eAAe,EAElBgB,EAAQjH,IAAOkF,GAAS92B,GAAKy5B,CAAC,GACjC5B,GAAM,UAAU,EAGjB73B,GAAK64B,EAAQY,EACb,MAAMvhC,EAAIc,GAAKqgC,EAAOrC,GAAQh+B,GAAKqgC,EAAOpC,GAAOA,GAAOj+B,EAAIqgC,EAE5D,GAAIR,EAAQ3gC,EACX,MAGD,MAAMwhC,EAAa3C,GAAO7+B,EACtBuhC,EAAI7H,GAAMkF,GAAS4C,CAAU,GAChC7B,GAAM,UAAU,EAGjB4B,GAAKC,CAEL,CAED,MAAMC,EAAMtB,EAAO,OAAS,EAC5BgB,EAAOP,GAAM94B,EAAIw5B,EAAMG,EAAKH,GAAQ,CAAC,EAIjC5H,GAAM5xB,EAAI25B,CAAG,EAAI7C,GAAS9+B,GAC7B6/B,GAAM,UAAU,EAGjB7/B,GAAK45B,GAAM5xB,EAAI25B,CAAG,EAClB35B,GAAK25B,EAGLtB,EAAO,OAAOr4B,IAAK,EAAGhI,CAAC,CAEvB,CAED,OAAO,OAAO,cAAc,GAAGqgC,CAAM,CACtC,EASMuB,GAAS,SAAST,EAAO,CAC9B,MAAMd,EAAS,GAGfc,EAAQf,GAAWe,CAAK,EAGxB,MAAMC,EAAcD,EAAM,OAG1B,IAAInhC,EAAIq/B,GACJ0B,EAAQ,EACRM,EAAOjC,GAGX,UAAWyC,KAAgBV,EACtBU,EAAe,KAClBxB,EAAO,KAAKT,GAAmBiC,CAAY,CAAC,EAI9C,MAAMC,EAAczB,EAAO,OAC3B,IAAI0B,EAAiBD,EAWrB,IALIA,GACHzB,EAAO,KAAKf,EAAS,EAIfyC,EAAiBX,GAAa,CAIpC,IAAI7uB,EAAIusB,GACR,UAAW+C,KAAgBV,EACtBU,GAAgB7hC,GAAK6hC,EAAetvB,IACvCA,EAAIsvB,GAMN,MAAMG,EAAwBD,EAAiB,EAC3CxvB,EAAIvS,EAAI45B,IAAOkF,GAASiC,GAASiB,CAAqB,GACzDnC,GAAM,UAAU,EAGjBkB,IAAUxuB,EAAIvS,GAAKgiC,EACnBhiC,EAAIuS,EAEJ,UAAWsvB,KAAgBV,EAI1B,GAHIU,EAAe7hC,GAAK,EAAE+gC,EAAQjC,IACjCe,GAAM,UAAU,EAEbgC,IAAiB7hC,EAAG,CAEvB,IAAIiiC,EAAIlB,EACR,QAAS//B,EAAI+9B,IAA0B/9B,GAAK+9B,GAAM,CACjD,MAAM7+B,EAAIc,GAAKqgC,EAAOrC,GAAQh+B,GAAKqgC,EAAOpC,GAAOA,GAAOj+B,EAAIqgC,EAC5D,GAAIY,EAAI/hC,EACP,MAED,MAAMgiC,EAAUD,EAAI/hC,EACdwhC,EAAa3C,GAAO7+B,EAC1BmgC,EAAO,KACNT,GAAmBgB,GAAa1gC,EAAIgiC,EAAUR,EAAY,CAAC,CAAC,CAClE,EACKO,EAAIrI,GAAMsI,EAAUR,CAAU,CAC9B,CAEDrB,EAAO,KAAKT,GAAmBgB,GAAaqB,EAAG,CAAC,CAAC,CAAC,EAClDZ,EAAOP,GAAMC,EAAOiB,EAAuBD,IAAmBD,CAAW,EACzEf,EAAQ,EACR,EAAEgB,CACF,CAGF,EAAEhB,EACF,EAAE/gC,CAEF,CACD,OAAOqgC,EAAO,KAAK,EAAE,CACtB,EAaM8B,GAAY,SAAShB,EAAO,CACjC,OAAOnB,GAAUmB,EAAO,SAASvnB,EAAQ,CACxC,OAAO2lB,GAAc,KAAK3lB,CAAM,EAC7BsnB,GAAOtnB,EAAO,MAAM,CAAC,EAAE,YAAW,CAAE,EACpCA,CACL,CAAE,CACF,EAaMwoB,GAAU,SAASjB,EAAO,CAC/B,OAAOnB,GAAUmB,EAAO,SAASvnB,EAAQ,CACxC,OAAO4lB,GAAc,KAAK5lB,CAAM,EAC7B,OAASgoB,GAAOhoB,CAAM,EACtBA,CACL,CAAE,CACF,EAKMyoB,GAAW,CAMhB,QAAW,QAQX,KAAQ,CACP,OAAUjC,GACV,OAAUI,EACV,EACD,OAAUU,GACV,OAAUU,GACV,QAAWQ,GACX,UAAaD,EACd,ECxbA,SAASG,GAAY35B,EAAMmsB,EAAS,GAAI,CACtC,OAAKnsB,GACD,CAACmsB,EAAOxhB,QACR3K,EAAKosB,QAAQ,GAAG,IAAM,IAG1BD,EAAO9e,QAASqf,GAAU,CACxB,KAAM,CAAEJ,YAAWT,YAAWvqB,KAAK,EAAGorB,EACtC1sB,EAAOA,EAAK2nB,QACV,IAAIsE,OAAO,IAAIK,CAAS,IAAK,GAAG,EAChC,4BAA4BT,CAAS,+FAA+FvqB,CAAG,WAAWgrB,CAAS,4FAC7J,CACF,CAAC,EAEMtsB,GAbW,EAcpB,CCZA,MAAM45B,GAAU32B,SAASC,cAAc,KAAK,EACtC22B,GAAuB,CAAC,QAAS,UAAW,SAAS,EAErDC,GAAmB,SACzB,SAASC,GAAWC,EAAM,CACxB,OAAOA,EAAKrS,QACVmS,GACCvf,IACE,CACC,IAAK,QACL,IAAK,OACL,IAAK,SACLA,CAAC,CACP,CACF,CAEA,MAAM0f,GAAa,MACbC,GAAkB,gBAClBC,GAAgB,oBAChBC,GAAgB,WAChBC,GAAmB,eACnBC,GAAyB,OACzBC,GAAuB,OACvBC,GAAoB,UACpBC,GAAuB,oBACvBC,GAAwB,kCACxBC,GAAgC,uCAChCC,GAA4B,aAElC,SAASC,GAAUb,EAAMc,EAAoB,CAC3C,GAAIA,EAAoB,CACtB,MAAMC,EAAM93B,SAASC,cAAc,UAAU,EAC7C63B,SAAIC,UAAYhB,EACTe,EAAIE,OACb,KAAO,CACL,MAAMF,EAAM93B,SAASC,cAAc,KAAK,EACxC63B,SAAIC,UAAYhB,EACTe,CACT,CACF,CAEA,SAASG,GAAgBD,EAAS55B,EAAO,GAAI,CAC3C,KAAM,CAAE8qB,SAAQgP,YAAWC,iBAAiBA,IAAM,CAAC,CAAG,EAAG/5B,EACzD,IAAIg6B,EAAkBJ,EAGtB,MAAMK,EAAMT,GAAUQ,EAAiBF,CAAS,EAC1CI,EAAUtB,GAAWr3B,KAAKy4B,CAAe,EACzCG,EAAeH,EAAgBvT,SAAS,KAAK,EAEnD,GAAIyT,EAAS,CAGX,MAAME,EAAqBH,EAAIpuB,iBAAiB,0BAA0B,EAC1E,UAAWnG,KAAQ00B,EACjB10B,EAAKwG,aAAa,SAAU,QAAQ,EAItC,MAAMmuB,EAAQJ,EAAIpuB,iBAAiB,UAAU,EAC7C,UAAWnG,KAAQ20B,EACjB,UAAWnhB,KAAKxT,EAAKogB,UACd0S,GAAqB/R,SAASvN,CAAC,GAClCxT,EAAKogB,UAAUwU,OAAOphB,CAAC,CAI/B,CAGA,GAAIghB,EAAS,CACX,MAAMG,EAAQJ,EAAIpuB,iBAAiB,SAAS,EAC5C,UAAWnG,KAAQ20B,EACbxB,GAAgBt3B,KAAKmE,EAAK60B,YAAYhU,KAAM,KAC9C7gB,EAAKogB,UAAUC,IAAI,cAAc,EACjCyU,GAAY90B,CAAI,EAGtB,CAGA,GAAIw0B,EAAS,CACX,MAAMG,EAAQJ,EAAIpuB,iBAAiB,SAAS,EACtC4uB,EAAY,GAClB,UAAW/0B,KAAQ20B,EAAO,CACxB,MAAM17B,EAAO+G,EAAKg1B,UAAUnU,KAAI,EAC1BoU,EAAcj1B,EAAK4F,cAAc,GAAG,EAE1C,GAAIwtB,GAAcv3B,KAAK5C,CAAI,EAAG,CAE5B,KAAM,CAAC0C,EAAGqrB,EAAU2H,CAAM,EAAI11B,EAAKwsB,MAAM,GAAG,EACvCwP,IAED,CAACF,EAAUG,KAAK,CAAC,CAACC,CAAC,IAAMA,IAAMnO,CAAQ,GACvC+N,EAAUG,KAAK,CAAC,CAACC,EAAGC,CAAC,IAAMD,IAAMnO,GAAYoO,IAAMzG,CAAM,GAEzD3uB,EAAKi0B,UAAY,UAAUjN,CAAQ,UACnC+N,EAAUM,KAAK,CAACrO,EAAU2H,CAAM,CAAC,GAEjC3uB,EAAKi0B,UAAY,UAAUjN,CAAQ,IAAI2H,CAAM,WAGjD3uB,EAAKogB,UAAUC,IAAI,SAAS,CAC9B,CAEIgT,GAAcx3B,KAAK5C,CAAI,IACpBg8B,IAAaj1B,EAAKi0B,UAAY,UAAUh7B,EAAKq8B,MAAM,CAAC,CAAC,WAC1Dt1B,EAAKogB,UAAUC,IAAI,UAAW,SAAS,EAE3C,CACF,CAKA,IAAIkV,EACJ,GAAIjB,EAAgBvT,SAAS,GAAG,IAAKqE,WAAQxhB,QAAQ,CACnD2xB,EAAYC,GAAiBjB,CAAG,EAChC,UAAW7tB,KAAQ6uB,EAAW,CAC5B,IAAItC,EAAOD,GAAWtsB,EAAK+uB,SAAS,EACpCxC,EAAOL,GAAYK,EAAM7N,CAAM,EAC/ByN,GAAQoB,UAAYhB,EACpBvsB,EAAKgvB,YAAY,GAAG7C,GAAQ8C,UAAU,CACxC,CACF,CAKA,GAAIlB,EAAc,CAChB,MAAMmB,EAAS,CAAC,GAAGrB,EAAIpuB,iBAAiB,GAAG,CAAC,EAAElF,OAAQ40B,GACpDvC,GAAiBz3B,KAAKg6B,EAAEb,UAAUnU,KAAM,EAC1C,EACA,UAAWlgB,KAASi1B,EAAQ,CAC1B,MAAME,EAAM55B,SAASC,cAAc,KAAK,EAExC,UAAW45B,KAAMp1B,EAAMwF,iBAAiB,IAAI,EAC1C4vB,EAAGL,YAAY;AAAA,CAAI,EAErBI,EAAI7B,UAAY,SAAStzB,EAAMszB,UAAUpT,KAAI,CAAE,UAC/ClgB,EAAM+0B,YAAYI,CAAG,CACvB,CACF,CAGA,GAAIrB,EAAc,CAGhB,MAAMuB,EAFa,CAAC,GAAGzB,EAAIpuB,iBAAiB,GAAG,CAAC,EAElBlF,OAAQ40B,GACpCtC,GAAuB13B,KAAKg6B,EAAEb,SAAS,CACzC,EAEA,UAAWr0B,KAASq1B,EAAY,CAC9B,MAAMC,EAAiB,CAACt1B,CAAK,EAC7B,IAAI8zB,EAAe,GACfyB,EAAev1B,EACnB,KAAOu1B,EAAaC,oBAAoB,CACtC,MAAMC,EAAOF,EAAaC,mBAC1B,GAAIC,GAAQA,EAAKC,UAAY,IAC3B,GAAI7C,GAAqB33B,KAAKu6B,EAAKpB,SAAS,EAAG,CAC7CiB,EAAeZ,KAAKe,CAAI,EACxB3B,EAAe,GACf,KACF,MACEwB,EAAeZ,KAAKe,CAAI,MAG1B,OAEFF,EAAeE,CACjB,CACA,GAAI3B,EAAc,CAChB,MAAMqB,EAAM55B,SAASC,cAAc,KAAK,EACxC,UAAW05B,KAAKI,EAEd,UAAWF,KAAMF,EAAE1vB,iBAAiB,IAAI,EACtC4vB,EAAGL,YAAY;AAAA,CAAI,EAGvB,MAAMY,EAAWL,EAAe5U,IAAKwU,GAAMA,EAAE5B,SAAS,EAAE1S,KAAK;AAAA;AAAA,CAAM,EACnEuU,EAAI7B,UAAY,sBAAsBqC,CAAQ,UAC9C31B,EAAM+0B,YAAYI,CAAG,EACrB,UAAWD,KAAKI,EACdJ,EAAEjB,OAAM,CAEZ,CACF,CACF,CAKA,GAAIN,EAAgBvT,SAAS,GAAG,EAAG,CACjCwU,EAAYC,GAAiBjB,CAAG,EAChC,UAAW7tB,KAAQ6uB,EAAW,CAC5B,IAAItC,EAAOD,GAAWtsB,EAAK+uB,SAAS,EAChChC,GAAkB53B,KAAKo3B,CAAI,IAC7BA,EAAOA,EAAKsD,WAAW1C,GAA2B,iBAAiB,GAErEhB,GAAQoB,UAAYhB,EAEpBvsB,EAAKgvB,YAAY,GAAG7C,GAAQ8C,UAAU,CACxC,CACF,CAKA,GAAIjC,GAAqB73B,KAAKy4B,CAAe,EAAG,CAC9CiB,EAAYC,GAAiBjB,EAAK,CAChCiC,aAAc,CAAC,GAAG,CACpB,CAAC,EACD,UAAW9vB,KAAQ6uB,EAAW,CAC5B,IAAItC,EAAOD,GAAWtsB,EAAK+uB,SAAS,EAChC9B,GAAsB93B,KAAKo3B,CAAI,IACjCA,EAAOA,EAAKsD,WACV3C,GACA,4FACF,GAEFf,GAAQoB,UAAYhB,EAEpBvsB,EAAKgvB,YAAY,GAAG7C,GAAQ8C,UAAU,CACxC,CACF,CAKA,GAAIrB,EAAgBvT,SAAS,GAAG,EAAG,CACjC,IAAI0V,EAAY,KAChB,MAAMC,EAA2B,CAAC,GAAGnC,EAAIpuB,iBAAiB,GAAG,CAAC,EAAElF,OAC9D,CAAC40B,EAAGhoB,IAAU,CACZ,IAAI8oB,EAAe,EACnB,QAASr+B,EAAI,EAAGA,EAAIu9B,EAAEF,WAAW/xB,OAAQtL,IAAK,CAC5C,MAAMoO,EAAOmvB,EAAEF,WAAWr9B,CAAC,EAE3B,GAAIoO,EAAKkwB,WAAaC,KAAKC,WAEzB,GADapwB,EAAKmuB,YAAYhU,KAAI,IACrB,GACX,MAAO,WAEAna,EAAK2vB,UAAY,KAErB,GAAI3vB,EAAK2vB,UAAY,IAAK,CAC/B,MAAMU,EAAWrwB,EAAKmuB,YAAYhU,KAAI,EACtC,GAAI,CAACkW,GAAY,CAACA,EAASC,WAAW,GAAG,EACvC,MAAO,GAEPL,GAEJ,KACE,OAAO,EAEX,CAQA,GAJIA,EAAe,GAIfA,EAAe,GAAKF,GAAa5oB,IAAU4oB,EAAY,EACzDA,SAAY5oB,EACL,EAEX,CACF,EACA,GAAI6oB,WAA0B9yB,OAC5B,UAAWiyB,KAAKa,EACdb,EAAEzV,UAAUC,IAAI,kBAAkB,EAClCwV,EAAE1xB,MAAQ0xB,EAAEb,SAGlB,CAGA,GAAIV,EAAgBvT,SAAS,MAAM,EAAG,CACpC,MAAMkW,EAAO1C,EAAIpuB,iBAAiB,KAAK,EACvC,QAAS7N,EAAI,EAAGA,EAAI2+B,EAAKrzB,OAAQtL,IAAK,CACpC,MAAM4+B,EAAMD,EAAK3+B,CAAC,EACZb,EAAQy/B,EAAIC,aAAa,OAAO,GAAKD,EAAIE,aACzC5+B,EAAS0+B,EAAIC,aAAa,QAAQ,GAAKD,EAAIG,cAC7C5/B,GAASe,GACX0+B,EAAI96B,MAAMk7B,YAAY,0BAA2B,GAAG7/B,CAAK,IAAIe,CAAM,EAAE,CAEzE,CACF,CAKA,UAAWkO,KAAQ6tB,EAAIoB,WACrB,GAAIjvB,EAAKkwB,WAAaC,KAAKC,UAAW,CACpC,MAAMS,EAAOr7B,SAASC,cAAc,MAAM,EAC1Co7B,EAAK1C,YAAcnuB,EAAKmuB,YACxBN,EAAIiD,aAAaD,EAAM7wB,CAAI,CAC7B,CAGF,OAAI2tB,GACFoD,eAAe,IAAMpD,EAAeE,CAAG,CAAC,EAInCH,EAAYG,EAAMA,EAAIN,SAC/B,CACA,MAAMyD,GAAiBnX,GAAI4T,EAAe,EAEpCwD,GAAsB,CAE1B,QAEA,MACA,QACA,QACA,OACA,MACA,QAEA,QACA,SACA,SACA,UACA,SACA,SAEA,MACA,OAEA,SACA,WACA,SAEA,QACA,SACA,WAEA,OACA,UAAU,EAENC,GAAyBj0B,OAAOk0B,YACpCF,GAAoBtW,IAAKyW,GAAa,CAACA,EAAU,EAAI,CAAC,CACxD,EAEMC,GAAmB,+BACnBC,GAAqB,GAE3B,SAASlD,GAAY90B,EAAM,OACzB,GAAI,GAACA,IAAQA,IAAK4F,gBAAL5F,eAAqB,MAGlC,GAAI,CACF,MAAMzF,EAAMyF,EAAKg1B,UAAUnU,KAAI,EACzBoX,GAAU19B,EAAI4sB,MAAM4Q,EAAgB,GAAK,CAAE,GAAE,CAAC,GAAK,GACzD,GAAI,CAACE,EAAQ,OACb,MAAMC,EAAa39B,EAAI+6B,MACrB2C,EAAOr0B,OACPq0B,EAAOr0B,OAASo0B,EAClB,EACMG,EAAS59B,EAAI+6B,MAAM2C,EAAOr0B,OAASo0B,EAAkB,EACrDI,EAAS79B,EAAI+6B,MAAM2C,EAAOr0B,MAAM,EAAEA,OAASo0B,GACjDh4B,EAAKi0B,UAAY,2BAA2BgE,CAAM,sBAChDG,EAAS,WAAa,EAAE,IACtBF,CAAU,kCAAkCC,CAAM,SACxD,MAAY,CAAC,CACf,CAEA,SAAS3C,GAAiBjB,EAAKj6B,EAAO,GAAI,OACxC,MAAMi7B,EAAY,GACZ8C,EAAkB10B,OAAO20B,OAC7B,GACAV,IACAt9B,IAAKk8B,eAALl8B,cAAmBi+B,OAAO,CAACC,EAAKC,KAC9BD,EAAIC,CAAG,EAAI,GACJD,GACN,GACL,EACME,EAAOx8B,SAASy8B,iBACpBpE,EACAqE,WAAWC,UACX,CACEC,WAAWpyB,EAAM,CACf,OAAI2xB,EAAgB3xB,EAAKib,WAAWmW,QAAQ,EACnCc,WAAWG,cAEbH,WAAWI,aACpB,CACD,EACD,EACF,EACA,IAAItyB,EACJ,KAAQA,EAAOgyB,EAAKO,YAClB1D,EAAUF,KAAK3uB,CAAI,EAErB,OAAO6uB,CACT,CC7YA,MAAM2D,GAAMh9B,SAASC,cAAc,KAAK,EACxC,SAASg9B,GAAYlG,EAAM34B,EAAM,CAC/B,GAAI,CAAC24B,EAAM,MAAO,GAClB,KAAM,CAAEmG,YAAW,EAAI9+B,GAAQ,GAE/B4+B,UAAIjF,UAAYhB,EACbrS,QAAQ,SAAU;AAAA;AAAA,CAAU,EAC5BA,QAAQ,UAAW;AAAA,CAAS,EAC/BsY,GAAI/yB,iBAAiB,IAAI,EAAEG,QAASyvB,GAAO,CACzCA,EAAGL,YAAY;AAAA,CAAI,CACrB,CAAC,EAED0D,WAAaF,IAIbA,GAAI/yB,iBAAiB,YAAY,EAAEG,QAAS+yB,GAAO,CACjDA,EAAGzE,OAAM,CACX,CAAC,EAEDsE,GAAI/yB,iBAAiB,WAAW,EAAEG,QAAS+yB,GAAO,CAChDA,EAAGC,OAAO,KAAK,CACjB,CAAC,EAEMJ,GAAIlE,UAAUpU,QAAQ,cAAe;AAAA;AAAA,CAAM,EAAEC,MACtD,CAEA,MAAeN,MAAI4Y,EAAW,EC3B9B,SAASI,GAAmBj/B,EAAM,CAChC,KAAM,CAAEk/B,WAAW,CAAE,EAAEjoB,WAAUkoB,cAAaC,WAAU,EAAIp/B,GAAQ,GACpE,OAAQ/J,GAAM,SACZ,GAAI,CAAEkC,QAAQ,EAAGlC,EAKjB,GAJAkC,EAASA,EAAOmvB,QAAQ,GAAG,EACvB,CAACnvB,GAGDlC,EAAEuD,SAAWvD,EAAEsD,SAAWtD,EAAEwD,UAAYxD,EAAEyD,QAAUzD,EAAEq3B,QAAU,EAClE,OAGF,MAAM+R,GAAWlnC,IAAOmnC,kBAAPnnC,cAAwBoiC,YACnCgF,EAAqBF,iBAAUG,SAAS,KACxCC,EAAmBtnC,EAAOuiC,UAAUgC,WAAW,GAAG,EACxD,IACIvkC,EAAO2tB,UAAU4Z,SAAS,OAAO,GACjCvnC,EAAO2tB,UAAU4Z,SAAS,SAAS,IACnCD,GACDF,GAAsB,CAACE,EACxB,CACA,MAAME,GACJxnC,EAAOmT,cAAc,MAAM,GAAKnT,GAChCuiC,UAAUnU,OACNmG,EAAWiT,EAAWrZ,QAAQ,KAAM,EAAE,EACtCrmB,EAAM9H,EAAO0kC,aAAa,MAAM,EAEhC+C,EACJV,EAAS5T,KAAMsU,GAAYA,EAAQ3/B,MAAQA,CAAG,GAC9Ci/B,EAAS5T,KACNsU,GACCA,EAAQtT,OAASI,GAAYkT,EAAQlT,WAAaA,CACtD,EACF/f,GAAOizB,EACP3pC,EAAI2pC,eAAS,EACX3pC,EAAE0B,gBAAe,EACjB1B,EAAiB,YAAE,CACb,UAAe,KACnBg2B,UACAhV,UACD,eAAA0oB,CAAA,GACF1pC,EAAA,eAAW,EACV0W,kBAA+B,EAC/B1W,MAAgB6sB,EAAA3qB,EAAE,qBAClBlC,EAAiB,YAAE,CACnB,QAAakC,EACP,SAAA8e,CACJgV,CACAhV,UACD,CAAAkoB,EAAA,CACH,MAAAU,EAAAR,GAAA,YAAAA,EAAA,cACK,GAAAlnC,EAAKgnC,UAAW,SAAE,YAAAU,EAAA,CACvB5pC,EAAA,iBACIkC,kBAAO2tB,EACT7vB,MAAgBsC,EAAAJ,EAAE,kCACD2nC,EAAA7oB,EAAE,KAAAA,CAAA,MAAA1e,CAAA,UAAAA,CAAA,GACnB,SAAS,KAASunC,CAClB,MAAaC,EAAAvS,EAAGvW,cAAgBA,MAAc1e,IAAjC,MAAAwnC,EAAiCxnC,KAAK6mC,IAAejnC,EAAA,OACpD2nC,mBAAQ7pC,EAAE,kBACxBmK,EAAQ,aAAe,UAEvBotB,SAAoB,kBAAQ1K,EAAK,CAGjC,EACA7sB,SAAgB,SAAEu3B,EAAA,cAAAr1B,EAAA,eCjEX,SAAS6nC,GAAaC,EAAUrO,EAAM,CACnD,MAAO,IACLxwB,EAAK6O,OAAOgwB,EAAU,CACpBn+B,MAAO,OACP8vB,OACAC,YAAa,MACf,CAAC,CACL,CCJA,MAAMqO,GAAgBja,GACpB,IAAM,IAAIyF,KAAKgD,eAAc,EAAGC,gBAAe,EAAGnD,MACpD,EAEM2U,GAAmBngC,GAAS,CAChC,KAAM,CAAEwrB,SAAQ4U,WAAUC,WAAUC,aAAYC,WAAU,EAAIvgC,GAAQ,GAChE6uB,EAAmBrD,EAAOlF,QAAQ,YAAa,EAAE,EACjDka,EAAMzR,GAAY,CAACF,CAAgB,EAAG,CAACqR,EAAa,EAAG1U,CAAM,EAC7DiV,EAAc,IAAIpS,KAAM,EAACkC,YAAW,EACpCv1B,EAAUulC,GAAa,CAE3B/P,KAAM4P,IAAaK,EAActb,OAAY,UAC7Czd,MAAO,QACP0nB,IAAK,UAELD,KAAMkR,EAAWlb,OAAY,UAC7B+J,OAAQmR,EAAWlb,OAAY,UAC/B,GAAGmb,GAEL,GAAI,CACF,OAAO5U,KAAKgD,eAAe8R,EAAKxlC,CAAO,CACzC,MAAY,CAAC,CACb,GAAI,CACF,OAAO0wB,KAAKgD,eAAelD,EAAQxwB,CAAO,CAC5C,MAAY,CAAC,CACb,OAAO0wB,KAAKgD,eAAevJ,OAAWnqB,CAAO,CAC/C,EACM0zB,GAAiBzI,GAAIka,EAAe,EAE1C,SAASO,GAAalS,EAAMmS,EAAS,CACnC,OAAMnS,aAAgBH,OACpBG,EAAO,IAAIH,KAAKG,CAAI,GAEVE,GAAe,CACzB0R,SAAU5R,EAAK+B,YAAa,EAC5B/E,OAAQpqB,EAAKoqB,OACb,GAAGmV,CACL,CAAC,EACoBhR,OAAOnB,CAAI,CAElC,CC3Ce,SAASoS,GAAcC,EAAK,CACzC,GAAI,CACF,OAAOz/B,EAAK6O,OAAO4wB,EAAK,CACtBC,SAAU,UACVC,aAAc,OAChB,CAAC,CACF,MAAW,CACV,OAAOF,CACT,CACF,CCLA,MAAMG,GAAiB,IAER,SAASC,GAAYjhC,EAAM,CAGxC,GAFKA,IAAMA,EAAO,IAEdwtB,EAAOyT,YAAa,CAClBzT,EAAO0T,cAAch2B,UACvBzM,GAAU,CACRwhC,SAAUe,GACVriC,KAAIyC,EAAAC,EAAE,CAAA1B,GAAA,SAAqF,CAC7F,CAAC,EAEDlB,GAAU,CACRwhC,SAAUe,GACVriC,KAAIyC,EAAAC,EAAE,CAAA1B,GAAA,SAA0E,CAClF,CAAC,EAEH,MACF,CAEA+B,KACA8rB,EAAOyT,YAAcjhC,CACvB,CCdA,SAASmhC,GAAa,CACpBC,WACAnV,UACAoV,aAAa,KACbC,kBAAkB,GAClBrqB,WACA7S,WACAm9B,WACA3iC,UACA4iC,eAAe,GACfC,YAAY,GACZC,kBACAC,kBAAkB,GAClBC,eAAe,CAAC,EAChBC,2BAA2B,EAC7B,EAAG,CACD,GAAIT,EACF,OACEhX,EAAA,OAAKtgB,MAAM,yBAAwBkB,SAAA,CACjClC,EAAC4b,GAAM,CAAC9a,KAAMy3B,EAAa,EAC3BjX,EAAA,QAAApf,UACElC,EAAA,KAAAkC,SAAG,WAAW,EACdlC,EAAK,SACLA,EAAA,QAAMgB,MAAM,qBAAoBkB,SAAC,SAAY,CAAC,EAC1C,CAAC,EACJ,EAIT,GAAI,CAACihB,EACI,YAKH,MACJtsB,KACA2sB,OACAC,SACAC,eACAC,cACAC,WACA5B,SACA7qB,MACA6hC,gBACAC,eACAj9B,MACAk9B,SACAC,OACAp9B,QACAq9B,iBACAC,YACAC,QACEnW,IACA,IAAC5qB,GAAGsrB,EAAOC,EAAK,EAAIN,EAAKO,MAAM,eAAe,GAAK,CAAGP,EAAI,EAC1DoV,IACF9U,GAAQ,IAAI8U,CAAe,IAGvBW,QAAgBL,iBAAQ1W,KAAYgX,IAAA,CAAC,CAACA,GAAEC,YAAc,CAAC,CAACD,GAAE/qC,OAE1DirC,GAAuB,GAC7B,UAAWrsC,MAAKyrC,EACTC,EAAyBpb,SAAStwB,EAAC,IACjBA,KAAC,EAAIyrC,EAAazrC,EAAC,GAG5C,MAAMssC,GACJD,GAAqBl9B,WACrBk9B,GAAqBE,YACrBF,GAAqBG,UAEvB,OACEvY,EAAA,KACEtgB,MAAM,gBACNgZ,KAAM7iB,EACN9H,OAAQiM,EAAW,SAAW,KAC9ByF,MAAO+iB,GAAQN,EAAO,IAAIA,CAAI,GAC9B1tB,QAAgB3I,IAAA,CACd,GAAImO,GAEAxF,IADJ3I,GAAE0B,eAAe,EACbiH,EAAgBA,SAAQ3I,EAAC,EACzBsrC,EAEFnhC,SAASimB,KAAO,IAAIpP,CAAQ,MAAMtX,CAAE,GAEpC6tB,EAAOC,YAAc,CACnBxB,UACAhV,YAGN,EAAEjM,UAEFlC,EAAA,OAAKgB,MAAM,mBAAkBkB,SAC3BlC,EAAC4b,GAAM,CACLzkB,IAAKqhC,EAAkB9U,EAAeD,GAAUC,EAChD5iB,KAAMy3B,EACN1c,SAAU7f,EACX,EACE,EACLslB,EAAA,QAAMtgB,MAAM,wBAAuBkB,UAChC,CAAC22B,GACA74B,EAAA4kB,EAAA,CAAA1iB,SACGyhB,EACC3jB,EAAA,KAAAkC,SACElC,EAAC+hB,GAAS,CAAClsB,KAAM8tB,EAAa3B,SAAiB,EAC9C,EAEHhiB,EAAA,KAAAkC,SAAI0hB,EAAY,EAElB,EACD,IACHtC,EAAA,QAAMtgB,MAAM,kCAAiCkB,UAC1C4hB,GAAQ,GAAK,IACbD,EACD7jB,EAAM,UACL8jB,GACAwV,GACChY,EAAAsD,EAAA,CAAA1iB,SACG,KACDlC,EAACa,EAAI,CAACD,KAAK,OAAOE,KAAK,IAAI5Q,IAAGoI,EAAAC,EAAE,CAAA1B,GAAA,QAAQ,CAAC,EAAG,CAAC,EAC7C,CACH,EACG,EACL6hC,GACCpX,EAAA,OAAKtgB,MAAM,sBAAqBkB,SAAA,CAC9BlC,EAAA85B,EAAA,CAAAjjC,GAAA,SAAAmwB,OAAA,CAAAC,EAAe6Q,GAAckB,CAAa,CAAC,CAAQ,GAClD,CAAC,CAACC,GACD3X,EAAAsD,EAAA,CAAA1iB,SAAA,CACG,IAAI,IACI,IACTlC,EAAA85B,EAAA,CAAAjjC,GAAA,SAAAmwB,OAAA,CAAAC,EAEG2Q,GAAaqB,EAAc,CAC1B1B,SAAU,GACX,CAAC,EACG,CAAC,EACR,CACH,EACE,EAENoB,GACCrX,EAAA,OAAKtgB,MAAM,sBAAqBkB,SAC7BlG,IACCgE,EAAA4kB,EAAA,CAAA1iB,SACEof,EAAA,QAAMtgB,MAAM,gBAAekB,SAAA,CACzBlC,EAACa,EAAI,CAACD,KAAK,MAAO,EAAC,IAACZ,EAAA85B,EAAA,CAAAjjC,GAAA,SAAuB,CAAC,EACxC,CACN,GAEH,CAAC,CAACkF,GACDiE,EAAA4kB,EAAA,CAAA1iB,SACEof,EAAA,QAAMtgB,MAAM,gBAAekB,SAAA,CACzBlC,EAACa,EAAI,CAACD,KAAK,QAAS,EAAC,IAACZ,EAAA85B,EAAA,CAAAjjC,GAAA,SAAmB,CAAC,EACtC,EACN,EAEH8iC,IACC35B,EAAA,OAA2BgB,MAAM,8BAA6BkB,SAC5DlC,EAAA,OAAKgB,MAAM,yBAAwBkB,SAChCw3B,GAAqBl9B,WACtBk9B,GAAqBE,WACnB55B,EAAA,QAAMgB,MAAM,cAAakB,SACvBlC,EAAA85B,EAAA,CAAAjjC,GAAA,SAAoB,CAChB,GACJ6iC,GAAqBG,UACvB75B,EAAA,QAAMgB,MAAM,cAAakB,SACvBlC,EAAA85B,EAAA,CAAAjjC,GAAA,SAAuB,CACnB,GACJ6iC,GAAqBl9B,UACvBwD,EAAA,QAAMgB,MAAM,cAAakB,SACvBlC,EAAA85B,EAAA,CAAAjjC,GAAA,SAAuB,CACnB,GACJ6iC,GAAqBE,WACvB55B,EAAA,QAAMgB,MAAM,cAAakB,SACvBlC,EAAA85B,EAAA,CAAAjjC,GAAA,SAAyB,CACrB,GACJ,KACD,GApBGiiC,EAAajiC,EAqBlB,EAEN,CAAC,CAACuiC,GACDp5B,EAAA,QAAMgB,MAAM,KAAIkB,SACdlC,EAAA85B,EAAA,CAAAjjC,GAAA,SAAAmwB,OAAA,CAAAoS,gBACuB,EAGtB,CACG,GAEP,CAAC,CAACG,GACDjY,EAAA,QAAMtgB,MAAM,iBAAgBkB,SAAA,CAC1BlC,EAACa,EAAI,CAACD,KAAK,eAAeE,KAAK,IAAI5Q,IAAGoI,EAAAC,EAAE,CAAA1B,GAAA,QAAU,CAAC,EAAG,EAAE,IACxDmJ,EAAA,QACEE,wBAAyB,CACvBC,OAAQm0B,GAAeiF,EAAc9qC,MAAO,CAAEuzB,SAAQ,CACxD,EACD,CAAC,CACE,GAEP,CAAChmB,GACA,CAACD,GACD,CAAC49B,IACD,CAACP,GACD,CAACG,GACD,CAAC,CAACF,GACAr5B,EAAA,QAAMgB,MAAM,aAAYkB,SACtBlC,EAAA85B,EAAA,CAAAjjC,GAAA,SAAAmwB,OAAA,CAAAC,EAGK2Q,GAAayB,EAAW,CACvB9B,SAAU,GACX,CAAC,EAAAwC,WAAA,CAAA9S,EAHJjnB,EAAA,QAAMmnB,SAAUkS,EAIV,CAAC,EACF,EACH,CACP,EACA,CACN,EACG,CAAC,EACN,CAEP,WC5OA,SAASW,GAAeC,EAAU/nC,EAAS,CAErC,OAAOA,GAAY,YACrBA,EAAU,CAAE,QAASA,IAGvB,KAAK,kBAAoB,KAAK,MAAM,KAAK,UAAU+nC,CAAQ,CAAC,EAC5D,KAAK,UAAYA,EACjB,KAAK,SAAW/nC,GAAW,GAC3B,KAAK,cAAgBA,GAAWA,EAAQ,cAAgB,IACxD,KAAK,IAAM,KACX,KAAK,QAAU,GACf,KAAK,UAAY,EACjB,KAAK,kBAAoB,KACzB,KAAK,oBAAsB,KAC3B,KAAK,SAAW,KAChB,KAAK,gBAAkB,KACvB,KAAK,OAAS,KAEV,KAAK,SAAS,UAChB,KAAK,gBAAkB,KAAK,UAAU,MAAM,CAAC,EAEjD,KACAgoC,GAAiBF,GAEjBA,GAAe,UAAU,MAAQ,UAAW,CAC1C,KAAK,UAAY,EACjB,KAAK,UAAY,KAAK,kBAAkB,MAAM,CAAC,CACjD,EAEAA,GAAe,UAAU,KAAO,UAAW,CACrC,KAAK,UACP,aAAa,KAAK,QAAQ,EAExB,KAAK,QACP,aAAa,KAAK,MAAM,EAG1B,KAAK,UAAkB,GACvB,KAAK,gBAAkB,IACzB,EAEAA,GAAe,UAAU,MAAQ,SAASv1B,EAAK,CAK7C,GAJI,KAAK,UACP,aAAa,KAAK,QAAQ,EAGxB,CAACA,EACH,MAAO,GAET,IAAI01B,EAAc,IAAI,KAAM,EAAC,QAAO,EACpC,GAAI11B,GAAO01B,EAAc,KAAK,iBAAmB,KAAK,cACpD,YAAK,QAAQ,KAAK11B,CAAG,EACrB,KAAK,QAAQ,QAAQ,IAAI,MAAM,iCAAiC,CAAC,EAC1D,GAGT,KAAK,QAAQ,KAAKA,CAAG,EAErB,IAAIsQ,EAAU,KAAK,UAAU,MAAK,EAClC,GAAIA,IAAY,OACd,GAAI,KAAK,gBAEP,KAAK,QAAQ,OAAO,EAAG,KAAK,QAAQ,OAAS,CAAC,EAC9CA,EAAU,KAAK,gBAAgB,MAAM,EAAE,MAEvC,OAAO,GAIX,IAAIzgB,EAAO,KACX,YAAK,OAAS,WAAW,UAAW,CAClCA,EAAK,YAEDA,EAAK,sBACPA,EAAK,SAAW,WAAW,UAAW,CACpCA,EAAK,oBAAoBA,EAAK,SAAS,CAC/C,EAASA,EAAK,iBAAiB,EAErBA,EAAK,SAAS,OACdA,EAAK,SAAS,SAIpBA,EAAK,IAAIA,EAAK,SAAS,CACxB,EAAEygB,CAAO,EAEN,KAAK,SAAS,OACd,KAAK,OAAO,QAGT,EACT,EAEAilB,GAAe,UAAU,QAAU,SAASxjC,EAAI4jC,EAAY,CAC1D,KAAK,IAAM5jC,EAEP4jC,IACEA,EAAW,UACb,KAAK,kBAAoBA,EAAW,SAElCA,EAAW,KACb,KAAK,oBAAsBA,EAAW,KAI1C,IAAI9lC,EAAO,KACP,KAAK,sBACP,KAAK,SAAW,WAAW,UAAW,CACpCA,EAAK,oBAAmB,CAC9B,EAAOA,EAAK,iBAAiB,GAG3B,KAAK,gBAAkB,IAAI,KAAM,EAAC,QAAO,EAEzC,KAAK,IAAI,KAAK,SAAS,CACzB,EAEA0lC,GAAe,UAAU,IAAM,SAASxjC,EAAI,CAC1C,QAAQ,IAAI,0CAA0C,EACtD,KAAK,QAAQA,CAAE,CACjB,EAEAwjC,GAAe,UAAU,MAAQ,SAASxjC,EAAI,CAC5C,QAAQ,IAAI,4CAA4C,EACxD,KAAK,QAAQA,CAAE,CACjB,EAEAwjC,GAAe,UAAU,MAAQA,GAAe,UAAU,IAE1DA,GAAe,UAAU,OAAS,UAAW,CAC3C,OAAO,KAAK,OACd,EAEAA,GAAe,UAAU,SAAW,UAAW,CAC7C,OAAO,KAAK,SACd,EAEAA,GAAe,UAAU,UAAY,UAAW,CAC9C,GAAI,KAAK,QAAQ,SAAW,EAC1B,OAAO,KAOT,QAJIK,EAAS,GACTC,EAAY,KACZC,EAAiB,EAEZrlC,EAAI,EAAGA,EAAI,KAAK,QAAQ,OAAQA,IAAK,CAC5C,IAAI63B,EAAQ,KAAK,QAAQ73B,CAAC,EACtBoF,EAAUyyB,EAAM,QAChBpjB,GAAS0wB,EAAO//B,CAAO,GAAK,GAAK,EAErC+/B,EAAO//B,CAAO,EAAIqP,EAEdA,GAAS4wB,IACXD,EAAYvN,EACZwN,EAAiB5wB,EAEpB,CAED,OAAO2wB,CACT,eCjKA,IAAIN,EAAiBh2B,GAErBw2B,EAAoB,mBAAStoC,EAAS,CACpC,IAAI+nC,EAAWO,EAAQ,SAAStoC,CAAO,EACvC,OAAO,IAAI8nC,EAAeC,EAAU,CAChC,QAAS/nC,IAAYA,EAAQ,SAAWA,EAAQ,UAAY,KAC5D,MAAOA,GAAWA,EAAQ,MAC1B,aAAcA,GAAWA,EAAQ,YACvC,CAAG,CACH,EAEAsoC,EAAmB,kBAAStoC,EAAS,CACnC,GAAIA,aAAmB,MACrB,MAAO,CAAE,EAAC,OAAOA,CAAO,EAG1B,IAAIgF,EAAO,CACT,QAAS,GACT,OAAQ,EACR,WAAY,EAAI,IAChB,WAAY,IACZ,UAAW,EACf,EACE,QAASzJ,KAAOyE,EACdgF,EAAKzJ,CAAG,EAAIyE,EAAQzE,CAAG,EAGzB,GAAIyJ,EAAK,WAAaA,EAAK,WACzB,MAAM,IAAI,MAAM,uCAAuC,EAIzD,QADI+iC,EAAW,GACN/kC,EAAI,EAAGA,EAAIgC,EAAK,QAAShC,IAChC+kC,EAAS,KAAK,KAAK,cAAc/kC,EAAGgC,CAAI,CAAC,EAG3C,OAAIhF,GAAWA,EAAQ,SAAW,CAAC+nC,EAAS,QAC1CA,EAAS,KAAK,KAAK,cAAc/kC,EAAGgC,CAAI,CAAC,EAI3C+iC,EAAS,KAAK,SAASjvB,EAAEC,EAAG,CAC1B,OAAOD,EAAIC,CACf,CAAG,EAEMgvB,CACT,EAEAO,EAAA,cAAwB,SAASC,EAASvjC,EAAM,CAC9C,IAAIe,EAAUf,EAAK,UACd,KAAK,OAAM,EAAK,EACjB,EAEA6d,EAAU,KAAK,MAAM9c,EAAS,KAAK,IAAIf,EAAK,WAAY,CAAC,EAAI,KAAK,IAAIA,EAAK,OAAQujC,CAAO,CAAC,EAC/F,OAAA1lB,EAAU,KAAK,IAAIA,EAAS7d,EAAK,UAAU,EAEpC6d,CACT,EAEAylB,EAAA,KAAe,SAASE,EAAKxoC,EAASyoC,EAAS,CAM7C,GALIzoC,aAAmB,QACrByoC,EAAUzoC,EACVA,EAAU,MAGR,CAACyoC,EAAS,CACZA,EAAU,GACV,QAASltC,KAAOitC,EACV,OAAOA,EAAIjtC,CAAG,GAAM,YACtBktC,EAAQ,KAAKltC,CAAG,CAGrB,CAED,QAASyH,EAAI,EAAGA,EAAIylC,EAAQ,OAAQzlC,IAAK,CACvC,IAAI0lC,EAAWD,EAAQzlC,CAAC,EACpB2lC,EAAWH,EAAIE,CAAM,EAEzBF,EAAIE,CAAM,GAAI,SAAsBC,EAAU,CAC5C,IAAIvQ,EAAWkQ,EAAQ,UAAUtoC,CAAO,EACpC8mB,EAAW,MAAM,UAAU,MAAM,KAAK,UAAW,CAAC,EAClD/mB,EAAW+mB,EAAK,MAEpBA,EAAK,KAAK,SAASvU,EAAK,CAClB6lB,EAAG,MAAM7lB,CAAG,IAGZA,IACF,UAAU,CAAC,EAAI6lB,EAAG,UAAS,GAE7Br4B,EAAS,MAAM,KAAM,SAAS,EACtC,CAAO,EAEDq4B,EAAG,QAAQ,UAAW,CACpBuQ,EAAS,MAAMH,EAAK1hB,CAAI,CAChC,CAAO,CACP,GAAM,KAAK0hB,EAAKG,CAAQ,EACpBH,EAAIE,CAAM,EAAE,QAAU1oC,CACvB,SClGH,IAAA4oC,GAAiB92B,mBCAX+2B,GAAiB,OAAO,UAAU,SAElCC,GAAUvsC,GAASssC,GAAe,KAAKtsC,CAAK,IAAM,iBAElDwsC,GAAgB,IAAI,IAAI,CAC7B,kBACA,kDACA,iDACA,cACA,yBACA,cACD,CAAC,EAEc,SAASC,GAAenO,EAAO,CAM7C,OALgBA,GACZiO,GAAQjO,CAAK,GACbA,EAAM,OAAS,aACf,OAAOA,EAAM,SAAY,SAQzBA,EAAM,UAAY,cACdA,EAAM,QAAU,OAGjBkO,GAAc,IAAIlO,EAAM,OAAO,EAT9B,EAUT,CC3BO,MAAMoO,WAAmB,KAAM,CACrC,YAAY7gC,EAAS,CACpB,QAEIA,aAAmB,OACtB,KAAK,cAAgBA,EACpB,CAAC,QAAAA,CAAO,EAAIA,IAEb,KAAK,cAAgB,IAAI,MAAMA,CAAO,EACtC,KAAK,cAAc,MAAQ,KAAK,OAGjC,KAAK,KAAO,aACZ,KAAK,QAAUA,CACf,CACF,CAEA,MAAM8gC,GAA0B,CAACrO,EAAOsO,EAAenpC,IAAY,CAElE,MAAMopC,EAAcppC,EAAQ,SAAWmpC,EAAgB,GAEvD,OAAAtO,EAAM,cAAgBsO,EACtBtO,EAAM,YAAcuO,EACbvO,CACR,EAEe,eAAewO,GAAOlN,EAAOn8B,EAAS,CACpD,OAAO,IAAI,QAAQ,CAACspC,EAASC,IAAW,CACvCvpC,EAAU,CACT,iBAAkB,CAAE,EACpB,QAAS,GACT,YAAa,IAAM,GACnB,GAAGA,CACN,EAEE,MAAMwpC,EAAYZ,GAAM,UAAU5oC,CAAO,EAEnCypC,EAAe,IAAM,OAC1BD,EAAU,KAAI,EACdD,GAAOG,EAAA1pC,EAAQ,SAAR,YAAA0pC,EAAgB,MAAM,CAChC,EAEM1pC,EAAQ,QAAU,CAACA,EAAQ,OAAO,SACrCA,EAAQ,OAAO,iBAAiB,QAASypC,EAAc,CAAC,KAAM,EAAI,CAAC,EAGpE,MAAME,EAAU,IAAM,QACrBD,EAAA1pC,EAAQ,SAAR,MAAA0pC,EAAgB,oBAAoB,QAASD,GAC7CD,EAAU,KAAI,CACjB,EAEEA,EAAU,QAAQ,MAAML,GAAiB,CACxC,GAAI,CACH,MAAMpO,EAAS,MAAMoB,EAAMgN,CAAa,EACxCQ,IACAL,EAAQvO,CAAM,CACd,OAAQF,EAAO,CACf,GAAI,CACH,GAAI,EAAEA,aAAiB,OACtB,MAAM,IAAI,UAAU,0BAA0BA,CAAK,kCAAkC,EAGtF,GAAIA,aAAiBoO,GACpB,MAAMpO,EAAM,cAGb,GAAIA,aAAiB,WAAa,CAACmO,GAAenO,CAAK,EACtD,MAAMA,EAYP,GATAqO,GAAwBrO,EAAOsO,EAAenpC,CAAO,EAE/C,MAAMA,EAAQ,YAAY66B,CAAK,IACpC2O,EAAU,KAAI,EACdD,EAAO1O,CAAK,GAGb,MAAM76B,EAAQ,gBAAgB66B,CAAK,EAE/B,CAAC2O,EAAU,MAAM3O,CAAK,EACzB,MAAM2O,EAAU,WAEjB,OAAQI,EAAY,CACpBV,GAAwBU,EAAYT,EAAenpC,CAAO,EAC1D2pC,IACAJ,EAAOK,CAAU,CACjB,CACD,CACJ,CAAG,CACH,CAAE,CACF,glHC5FA,IAAIC,GAAY,OAAO,eACnBC,GAAkB,CAACtB,EAAKjtC,EAAKgB,IAAUhB,KAAOitC,EAAMqB,GAAUrB,EAAKjtC,EAAK,CAAE,WAAY,GAAM,aAAc,GAAM,SAAU,GAAM,MAAAgB,CAAO,GAAIisC,EAAIjtC,CAAG,EAAIgB,EACtJwtC,GAAgB,CAACvB,EAAKjtC,EAAKgB,IAAUutC,GAAgBtB,EAAK,OAAOjtC,GAAQ,SAAWA,EAAM,GAAKA,EAAKgB,CAAK,EAMzGytC,GAA8B,IAAI,IAClCC,GAA0B,IAAI,QAC9BC,GAAS,EACTC,GAAmB,OAIvB,SAASC,GAAU5oC,EAAM,CACvB,OAAKA,GACDyoC,GAAQ,IAAIzoC,CAAI,IACpB0oC,IAAU,EACVD,GAAQ,IAAIzoC,EAAM0oC,GAAO,SAAU,IAC5BD,GAAQ,IAAIzoC,CAAI,GAJL,GAKpB,CACA,SAAS6oC,GAAYrqC,EAAS,CAC5B,OAAO,OAAO,KAAKA,CAAO,EAAE,KAAM,EAAC,OAChCzE,GAAQyE,EAAQzE,CAAG,IAAM,MAC9B,EAAI,IAAKA,GACE,GAAGA,CAAG,IAAIA,IAAQ,OAAS6uC,GAAUpqC,EAAQ,IAAI,EAAIA,EAAQzE,CAAG,CAAC,EACzE,EAAE,SAAQ,CACb,CACA,SAAS+uC,GAAetqC,EAAS,CAC/B,MAAM2E,EAAK0lC,GAAYrqC,CAAO,EAC9B,IAAIic,EAAW+tB,GAAY,IAAIrlC,CAAE,EACjC,GAAI,CAACsX,EAAU,CACb,MAAMiU,EAA2B,IAAI,IACrC,IAAIqa,EACJ,MAAM9d,EAAW,IAAI,qBAAsBrM,GAAY,CACrDA,EAAQ,QAASoqB,GAAU,CACzB,IAAId,EACJ,MAAMe,EAASD,EAAM,gBAAkBD,EAAW,KAAMG,GAAcF,EAAM,mBAAqBE,CAAS,EACtG1qC,EAAQ,iBAAmB,OAAOwqC,EAAM,UAAc,MACxDA,EAAM,UAAYC,IAEnBf,EAAKxZ,EAAS,IAAIsa,EAAM,MAAM,IAAM,MAAgBd,EAAG,QAAS3pC,GAAa,CAC5EA,EAAS0qC,EAAQD,CAAK,CAChC,CAAS,CACT,CAAO,CACF,EAAExqC,CAAO,EACVuqC,EAAa9d,EAAS,aAAe,MAAM,QAAQzsB,EAAQ,SAAS,EAAIA,EAAQ,UAAY,CAACA,EAAQ,WAAa,CAAC,GACnHic,EAAW,CACT,GAAAtX,EACA,SAAA8nB,EACA,SAAAyD,CACN,EACI8Z,GAAY,IAAIrlC,EAAIsX,CAAQ,CAC7B,CACD,OAAOA,CACT,CACA,SAAS8Q,GAAQtvB,EAASsC,EAAUC,EAAU,CAAE,EAAE2qC,EAAiBR,GAAkB,CACnF,GAAI,OAAO,OAAO,qBAAyB,KAAeQ,IAAmB,OAAQ,CACnF,MAAMC,EAASntC,EAAQ,wBACvB,OAAAsC,EAAS4qC,EAAgB,CACvB,eAAgBA,EAChB,OAAQltC,EACR,kBAAmB,OAAOuC,EAAQ,WAAc,SAAWA,EAAQ,UAAY,EAC/E,KAAM,EACN,mBAAoB4qC,EACpB,iBAAkBA,EAClB,WAAYA,CAClB,CAAK,EACM,IAAM,CACjB,CACG,CACD,KAAM,CAAE,GAAAjmC,EAAI,SAAA8nB,EAAU,SAAAyD,CAAQ,EAAKoa,GAAetqC,CAAO,EACnD6qC,EAAY3a,EAAS,IAAIzyB,CAAO,GAAK,GAC3C,OAAKyyB,EAAS,IAAIzyB,CAAO,GACvByyB,EAAS,IAAIzyB,EAASotC,CAAS,EAEjCA,EAAU,KAAK9qC,CAAQ,EACvB0sB,EAAS,QAAQhvB,CAAO,EACjB,UAAqB,CAC1BotC,EAAU,OAAOA,EAAU,QAAQ9qC,CAAQ,EAAG,CAAC,EAC3C8qC,EAAU,SAAW,IACvB3a,EAAS,OAAOzyB,CAAO,EACvBgvB,EAAS,UAAUhvB,CAAO,GAExByyB,EAAS,OAAS,IACpBzD,EAAS,WAAU,EACnBud,GAAY,OAAOrlC,CAAE,EAE3B,CACA,CAGA,SAASmmC,GAAgBpnC,EAAO,CAC9B,OAAO,OAAOA,EAAM,UAAa,UACnC,CACG,IAACqnC,GAAS,cAAcC,EAAgB,CACzC,YAAYtnC,EAAO,CACjB,MAAMA,CAAK,EACXqmC,GAAc,KAAM,OAAQ,IAAI,EAChCA,GAAc,KAAM,eAAgB,IAAI,EACxCA,GAAc,KAAM,aAAe34B,GAAS,CACtC,KAAK,OACP,KAAK,UAAS,EACV,CAACA,GAAQ,CAAC,KAAK,MAAM,aAAe,CAAC,KAAK,MAAM,MAClD,KAAK,SAAS,CAAE,OAAQ,CAAC,CAAC,KAAK,MAAM,cAAe,MAAO,MAAQ,IAGvE,KAAK,KAAOA,GAAc,KAC1B,KAAK,YAAW,CACtB,CAAK,EACD24B,GAAc,KAAM,eAAgB,CAACU,EAAQD,IAAU,CACjDC,GAAU,KAAK,MAAM,aACvB,KAAK,UAAS,EAEXK,GAAgB,KAAK,KAAK,GAC7B,KAAK,SAAS,CAAE,OAAAL,EAAQ,MAAAD,CAAO,GAE7B,KAAK,MAAM,UACb,KAAK,MAAM,SAASC,EAAQD,CAAK,CAEzC,CAAK,EACD,KAAK,MAAQ,CACX,OAAQ,CAAC,CAAC9mC,EAAM,cAChB,MAAO,MACb,CACG,CACD,mBAAoB,CAClB,KAAK,UAAS,EACd,KAAK,YAAW,CACjB,CACD,mBAAmBunC,EAAW,EACxBA,EAAU,aAAe,KAAK,MAAM,YAAcA,EAAU,OAAS,KAAK,MAAM,MAAQA,EAAU,YAAc,KAAK,MAAM,WAAaA,EAAU,OAAS,KAAK,MAAM,MAAQA,EAAU,kBAAoB,KAAK,MAAM,iBAAmBA,EAAU,QAAU,KAAK,MAAM,SAC3Q,KAAK,UAAS,EACd,KAAK,YAAW,EAEnB,CACD,sBAAuB,CACrB,KAAK,UAAS,CACf,CACD,aAAc,CACZ,GAAI,CAAC,KAAK,MAAQ,KAAK,MAAM,KAAM,OACnC,KAAM,CACJ,UAAAP,EACA,KAAAlpC,EACA,WAAA0pC,EACA,gBAAAC,EACA,MAAAtnC,EACA,eAAA8mC,CACN,EAAQ,KAAK,MACT,KAAK,aAAe5d,GAClB,KAAK,KACL,KAAK,aACL,CACE,UAAA2d,EACA,KAAAlpC,EACA,WAAA0pC,EAEA,gBAAAC,EAEA,MAAAtnC,CACD,EACD8mC,CACN,CACG,CACD,WAAY,CACN,KAAK,eACP,KAAK,aAAY,EACjB,KAAK,aAAe,KAEvB,CACD,QAAS,CACP,KAAM,CAAE,SAAA36B,CAAQ,EAAK,KAAK,MAC1B,GAAI,OAAOA,GAAa,WAAY,CAClC,KAAM,CAAE,OAAAy6B,EAAQ,MAAAD,GAAU,KAAK,MAC/B,OAAOx6B,EAAS,CAAE,OAAAy6B,EAAQ,MAAAD,EAAO,IAAK,KAAK,UAAU,CAAE,CACxD,CACD,KAAM,CACJ,GAAAY,EACA,YAAAC,EACA,UAAAX,EACA,KAAAlpC,EACA,WAAA0pC,EACA,SAAAhoB,EACA,KAAAooB,EACA,gBAAAH,EACA,MAAAtnC,EACA,cAAA0nC,EACA,eAAAZ,EACA,GAAGjnC,CACT,EAAQ,KAAK,MACT,OAAO8nC,GACLJ,GAAM,MACN,CAAE,IAAK,KAAK,WAAY,GAAG1nC,CAAO,EAClCsM,CACN,CACG,CACH,EAIA,SAASy7B,GAAU,CACjB,UAAAf,EACA,MAAA7mC,EACA,gBAAAsnC,EACA,WAAAD,EACA,KAAA1pC,EACA,YAAA6pC,EACA,KAAAC,EACA,cAAAC,EACA,eAAAZ,EACA,SAAAznB,CACF,EAAI,GAAI,CACN,IAAIwmB,EACJ,KAAM,CAAClqC,EAAKY,CAAM,EAAIsrC,EAAgB,IAAI,EACpC3rC,EAAW4rC,IACX,CAAC74B,EAAOiQ,CAAQ,EAAI2oB,EAAgB,CACxC,OAAQ,CAAC,CAACH,EACV,MAAO,MACX,CAAG,EACDxrC,EAAS,QAAUmjB,EACnB0oB,GACE,IAAM,CACJ,GAAIN,GAAQ,CAAC9rC,EAAK,OAClB,IAAIqsC,EACJ,OAAAA,EAAY9e,GACVvtB,EACA,CAACirC,EAAQD,IAAU,CACjBznB,EAAS,CACP,OAAA0nB,EACA,MAAAD,CACZ,CAAW,EACGzqC,EAAS,SAASA,EAAS,QAAQ0qC,EAAQD,CAAK,EAChDA,EAAM,gBAAkBa,GAAeQ,IACzCA,IACAA,EAAY,OAEf,EACD,CACE,KAAArqC,EACA,WAAA0pC,EACA,UAAAR,EAEA,gBAAAS,EAEA,MAAAtnC,CACD,EACD8mC,CACR,EACa,IAAM,CACPkB,GACFA,GAEV,CACK,EAGD,CAEE,MAAM,QAAQnB,CAAS,EAAIA,EAAU,SAAU,EAAGA,EAClDlrC,EACAgC,EACA0pC,EACAG,EACAC,EACAH,EACAR,EACA9mC,CACD,CACL,EACE,MAAMioC,GAAepC,EAAK52B,EAAM,QAAU,KAAO,OAAS42B,EAAG,OACvDqC,EAAsBJ,IACxB,CAACnsC,GAAOssC,GAAe,CAACT,GAAe,CAACC,GAAQS,EAAoB,UAAYD,IAClFC,EAAoB,QAAUD,EAC9B/oB,EAAS,CACP,OAAQ,CAAC,CAACwoB,EACV,MAAO,MACb,CAAK,GAEH,MAAMxQ,EAAS,CAAC36B,EAAQ0S,EAAM,OAAQA,EAAM,KAAK,EACjD,OAAAioB,EAAO,IAAMA,EAAO,CAAC,EACrBA,EAAO,OAASA,EAAO,CAAC,EACxBA,EAAO,MAAQA,EAAO,CAAC,EAChBA,CACT,CCtRA,MAAMiR,GAAM,GAENC,GAAY,GAElB,SAAwBC,GAAW,CAAEvnC,KAAIqL,UAAS,EAAG,CACnD,MAAMkH,EAAezX,IACf0sC,EAAQ,CAAC,CAACF,GAAUtnC,CAAE,EACtB,CAACynC,EAASC,CAAU,EAAIlsC,EAAS,EAAK,EACtC,CAACmsC,EAAcC,CAAe,EAAIpsC,EAASgsC,GAAS,EAAK,EAEzD,CAAE3sC,OAAQisC,GAAU,CACxBjqC,KAAM,KACN0pC,WAAY,IAAIc,EAAG,iBACnBb,gBAAiB,GACjBtnC,MAAO,IACPqf,SAAsBunB,GAAA,CAChBA,IACF4B,EAAW,EAAI,EACX1nC,IAAcA,IAAE,EAAI,IAE5B,EACA0mC,YAAa,GACbC,KAAMgB,GAAgBF,EACvB,EAeD,OAbAvsC,GAAU,IAAM,CACV,IAACqX,EAAaxS,QAAS,OACrB4U,QAAOpC,EAAaxS,QAAQ8nC,sBAAsB,EACpDlzB,EAAKmzB,OAAST,KACZ1yB,EAAK3T,IAAMpC,OAAO8qB,YACpBge,EAAW,EAAI,EAEfE,EAAgB,EAAI,EAElB5nC,IAAcA,IAAE,EAAI,IAE5B,EAAG,CAAE,GAED2nC,EAAqBt8B,EAGvBlC,EAAA,OACEtO,IAAK0X,EACLpI,MAAM,gCACN49B,OAAQ,CAACN,EAAQp8B,SAEjBlC,EAAA,OAAKtO,MAAUsP,MAAM,yBAAwBkB,WAExC,EACF,CAET,sWC1CM,CAAE28B,0BAAwB,EAAIC,GAC9BC,GAAmBF,GACrBA,GAAwBxc,MAAM,KAAK,EACnC,GAEE2c,GAAWC,GAAU,CACzBC,MAAO,EACPC,SAAU,GACZ,CAAC,EAED,IAAIC,GAAwB,EAE5B,SAASC,GAAiBxpC,EAAM+P,EAAQvW,EAAQ,CAqB9C,OAAAksC,GApBY,KACZ,IAAM+D,KAAkBF,EAAA,EAClBjxB,yBAA4BixB,WAAqBx5B,CAAA,IAAAvW,CAAA,uBAAAwG,CAAA,UAAAs0B,GAAA,CACrD,IAAOoV,EACL,aAAmB,MAAApV,EAAA,YAKjB,OAASqV,QACT,QAAOrV,GAAS,OACjB,MACc,CACN,kBACLsV,QAAUtV,EAAA,YACV2G,wBAAa4O,wCACbC,WAAkCC,CACxBvjC,CACZ,GAEN,CACA,UACEwjC,gBAAS1yC,GAAA,CACT2yC,IAAwBV,GAAA,GAAAL,GAAA,MAEnBK,CACKW,EAGR,CACF,MACDC,GAAA,UAIHC,GAAAC,GAAAb,GAAA,CACMW,SACN,CAAMC,EACID,cAEV,OAAiCE,EAAgC,YAEvDF,IACT,eAAAG,EAED,eAAAC,EACED,cACAC,UACAC,OACAxqC,cAAO,EACPyqC,CACAC,eACC,CAAAC,EAAAC,CAAA,EAAApuC,EAAA,WACKquC,IAA4C,EAAAruC,EAAA,MAC5C,CAACmuC,EAAmBG,CAAsB,EAAAtuC,EAAA,MAC1C,CAACuuC,GAA6C,EAAAvuC,EAAA,MAC9CwuC,EAACC,IACDC,EAA8BX,EAAI/tC,GAAa+tC,CAAA,OAC/CS,EAAoBxb,GAAAqb,CAAA,EAEpBK,EAAiBX,UAGjBY,IACAC,OAA6BhB,IAGjCI,iBAAgDJ,SAClDQ,EAAA,WAEA,GAAMvjC,CACJujC,MACI,QAAA3P,EACI,uBAAA6O,EAAE7O,WAAS6O,QAAwBF,MAAU1S,0BAAUn3B,MACrDyqC,EAAkBY,CACtBnQ,MAASoQ,EAAA7b,GAAAsa,CAAA,EACXwB,EAA4BD,CAAA,CACpBA,CACNC,gBAAgC,CAClC,MAAAC,GAAAnK,GAAA2E,EAAAhmC,GAAA,YAAAA,EAAA,mBAAAgmC,EAAA,4BAAA3E,EAAA,SAEQmK,EAAuB/kC,CAAqBglC,CAEhDC,CACFX,EAAA7P,CAAA,EACF2P,EAAA,WACAE,MAAqB7P,KAAO,IAAAj7B,EAAA,SAC5B4qC,EAAoB,gBACpBI,EAAa/P,QAAQrT,eAAW5nB,CAC9BgrC,kBACAA,eAAkC,GAEzB,MAIP9T,EAAeA,QAErB,SACU,QACVlpB,CACA48B,EAOF,OANA1uC,GAAA,KACFouC,GAEApuC,GAEc,GAAAouC,CAAA,GACZG,EACEH,GAAeW,EAAA,SAAAjrC,EAAA,QAAA0rC,IAAAP,EAEThhC,EAAAo+B,GAAA,CAEN,SAAE0C,QACFA,CAGA,sCACa5+B,YACTrB,EAAA,CAAW,iBAA+BqB,MACxClC,GAEKzH,YAAE,uBAAAwoC,CAAA,CAAAA,CAAuC,EAAC,EAAA/gC,EAAA,UAAC,KAAA0gC,EAEhD1gC,WACEgmB,MAAM0a,MACN3hB,SAAI+hB,CAAA,EACJ//B,CAA+B,EAE9B+/B,GAGK,KAGT9gC,EAAA,OACT,iCAEA,QACE7S,GAAA,CACQA,EAAA,gBACN2I,EACE3I,SAAiBm0B,EAAA,WACnB,IAAAuf,EAAE3+B,YAEF,WAAc2+B,qBAAW3+B,cACvBA,cACE/U,GAAA,CACOA,EAAA,iBACL2I,kBAAsB,EACpB3I,EAAiB,cAAA0zC,EAAA,aACCL,IAAA,YAClBK,GAAmB1oC,IACnB,EACI,eACN,iBAAE+J,QAEFlC,OAAK,CAACY,SAAK4/B,IAAA,UAAAloC,EAAA,EACX4J,CACwB3J,WAClB,GAAA1B,GAAAkqC,GAAA,CAAAQ,EAAAhB,EAAAjoC,EAAA,GAEYC,YACV,uBAAAwoC,CAAA,CAAAA,CAAiC,EAAAzoC,EAAA,GAAkBC,YACnD,uBAAAwoC,CAAA,CAAAA,CAAiC,EAAAzoC,EAAA,GAAEC,WACrC,GAAW,GAAC,IAAA+oB,EACX,aACD,mBAEVA,SAAA,CAAAA,EAAA,OAAW,uCAAkBpf,SAC3Bof,GAAA,UAAW,iCAAgCpf,SACzClC,IAAA,UACEgB,SAAM7T,GAAA,GACgB,QAAAA,EAAA,aACtBioB,GACgBxe,EACJ,SAAA4qC,GAAA,IAAA9hC,GAAA,CACZ,MAAA+hC,EAAApc,GAAA,CAECmc,YACC,eAA+B,KAEjBn8B,IACb,KAAA3F,EAAA,KACD,aAA+B,KAEnBlP,MACZ,OAACwP,EAAA,UACD,aACA,SACEN,EAAA,cAAApH,EAAA,EACGoH,CAAiBnH,YACd,UAAAgpC,GAAA,KAA0B,EAAGG,EAAA,GAAAC,CAAA,MAAAF,CAAA,GAAAE,CAAA,CAAE,GAG/BA,GAAM,IACJrgB,EAAA,QAEZ,SAAC,MAAA0f,CAAA,EACK,EAAEhhC,EACVshB,GAAA,CAAApf,UACAlC,OAAOwgC,IAAA,WAACoB,CAAM,GAAChD,IAAoB,QAAA5+B,EAAA,KAAU,MAAG,WAC7C,SACQA,EAAA85B,EAAA,CACF,YAAU53B,CACjB,KAAA4+B,GAAAxf,EAAAsD,EAAA,UAAiC,CAAA5kB,EAAA,UAGnC,MAAE8gC,qBACA5+B,OACUlB,IAAM,OAAqBglB,SAAM0a,IAAgB,EAAAE,GAAA5gC,EAAA,UAAMkC,MAC5D4+B,mCAEF,SAAEF,GAEC5/B,QAAM7T,GAAA,CACIA,EAAA,iCACV2I,EACIzG,UAAgC,CACpC,KAECuxC,GAEJ,EAGN,EACG,CACC,MAAAiB,GACN9C,IAAA,MAAAA,GAAA,OAAA+C,GAAA,SClQT,SAASC,GAAiBC,EAAS,CAC/B,OAAO,IAAI,QAAQ,CAACxG,EAASC,IAAW,CAEpCuG,EAAQ,WAAaA,EAAQ,UAAY,IAAMxG,EAAQwG,EAAQ,MAAM,EAErEA,EAAQ,QAAUA,EAAQ,QAAU,IAAMvG,EAAOuG,EAAQ,KAAK,CACtE,CAAK,CACL,CACA,SAASC,GAAYC,EAAQC,EAAW,CACpC,MAAMH,EAAU,UAAU,KAAKE,CAAM,EACrCF,EAAQ,gBAAkB,IAAMA,EAAQ,OAAO,kBAAkBG,CAAS,EAC1E,MAAMC,EAAML,GAAiBC,CAAO,EACpC,MAAO,CAACK,EAAQpwC,IAAamwC,EAAI,KAAME,GAAOrwC,EAASqwC,EAAG,YAAYH,EAAWE,CAAM,EAAE,YAAYF,CAAS,CAAC,CAAC,CACpH,CACA,IAAII,GACJ,SAASC,IAAkB,CACvB,OAAKD,KACDA,GAAsBN,GAAY,eAAgB,QAAQ,GAEvDM,EACX,CAOA,SAASE,GAAIh1C,EAAKi1C,EAAcF,KAAmB,CAC/C,OAAOE,EAAY,WAAaC,GAAUZ,GAAiBY,EAAM,IAAIl1C,CAAG,CAAC,CAAC,CAC9E,CAQA,SAASm1C,GAAIn1C,EAAKgB,EAAOi0C,EAAcF,GAAe,EAAI,CACtD,OAAOE,EAAY,YAAcC,IAC7BA,EAAM,IAAIl0C,EAAOhB,CAAG,EACbs0C,GAAiBY,EAAM,WAAW,EAC5C,CACL,CAoBA,SAASE,GAAQj1C,EAAM80C,EAAcF,KAAmB,CACpD,OAAOE,EAAY,WAAaC,GAAU,QAAQ,IAAI/0C,EAAK,IAAKH,GAAQs0C,GAAiBY,EAAM,IAAIl1C,CAAG,CAAC,CAAC,CAAC,CAAC,CAC9G,CA+BA,SAASq1C,GAAIr1C,EAAKi1C,EAAcF,KAAmB,CAC/C,OAAOE,EAAY,YAAcC,IAC7BA,EAAM,OAAOl1C,CAAG,EACTs0C,GAAiBY,EAAM,WAAW,EAC5C,CACL,CAOA,SAASI,GAAQn1C,EAAM80C,EAAcF,KAAmB,CACpD,OAAOE,EAAY,YAAcC,IAC7B/0C,EAAK,QAASH,GAAQk1C,EAAM,OAAOl1C,CAAG,CAAC,EAChCs0C,GAAiBY,EAAM,WAAW,EAC5C,CACL,CAMA,SAASK,GAAMN,EAAcF,KAAmB,CAC5C,OAAOE,EAAY,YAAcC,IAC7BA,EAAM,MAAK,EACJZ,GAAiBY,EAAM,WAAW,EAC5C,CACL,CACA,SAASM,GAAWN,EAAO1wC,EAAU,CACjC,OAAA0wC,EAAM,aAAa,UAAY,UAAY,CAClC,KAAK,SAEV1wC,EAAS,KAAK,MAAM,EACpB,KAAK,OAAO,WACpB,EACW8vC,GAAiBY,EAAM,WAAW,CAC7C,CAMA,SAAS/0C,GAAK80C,EAAcF,KAAmB,CAC3C,OAAOE,EAAY,WAAaC,GAAU,CAEtC,GAAIA,EAAM,WACN,OAAOZ,GAAiBY,EAAM,WAAU,CAAE,EAE9C,MAAMn4B,EAAQ,GACd,OAAOy4B,GAAWN,EAAQO,GAAW14B,EAAM,KAAK04B,EAAO,GAAG,CAAC,EAAE,KAAK,IAAM14B,CAAK,CACrF,CAAK,CACL,CCxIA,SAAS24B,GAAOjB,EAAQC,EAAW,CACjC,MAAMQ,EAAQV,GAAYC,EAAQC,CAAS,EAC3C,MAAO,CACLS,IAAKA,CAACn1C,EAAK21C,IAAQR,GAAIn1C,EAAK21C,EAAKT,CAAK,EACtCF,IAAMh1C,GAAQg1C,GAAIh1C,EAAKk1C,CAAK,EAC5BE,QAAUj1C,GAASi1C,GAAQj1C,EAAM+0C,CAAK,EACtCG,IAAMr1C,GAAQq1C,GAAIr1C,EAAKk1C,CAAK,EAC5BI,QAAUn1C,GAASm1C,GAAQn1C,EAAM+0C,CAAK,EACtCK,MAAOA,IAAMA,GAAML,CAAK,EACxB/0C,KAAMA,IAAMA,GAAK+0C,CAAK,EAE1B,CAEA,MAAeL,GAAA,CACbe,OAAQF,GAAO,YAAa,cAAc,EAC1CG,QAASH,GAAO,aAAc,eAAe,CAC/C,ECxBO,eAAeI,GAAmBC,EAAUC,EAAmB,GAAI,CACxE,GAAI,EAACD,WAAUhjC,QAAQ,OACvB,KAAM,CAAEkjC,OAAO,EAAG1f,GAAG,EAEf2f,EAAiBC,KACjBC,EAAmBL,EAASrO,OAAO,CAACC,EAAKpqB,KAK3C,CAACoqB,EAAIzX,SAAS3S,EAAEnU,EAAE,GAClB,CAAC4sC,EAAiBz4B,EAAEnU,EAAE,GACtBmU,EAAEnU,KAAO8sC,GAETvO,EAAInD,KAAKjnB,EAAEnU,EAAE,EAERu+B,GACN,CAAE,GACL,GAAI,CAACyO,EAAiBrjC,OAAQ,OAAO,KAErC,GAAI,CAQF,OAPsB,MAAMkjC,EAAM/Z,GAAG6Z,SAASM,cAAcvE,MAAM,CAChE1oC,GAAIgtC,CACN,CAAC,GACyC1O,OAAO,CAACC,EAAK/nC,KACrD+nC,EAAI/nC,EAAEwJ,EAAE,EAAIxJ,EACL+nC,GACN,CAAE,EAEN,MAAW,CAEV,WACA,CACF,CCpCK,MAAM2O,WAAoB,WAAY,CACzC,aAAc,CACV,QACA,KAAK,eAAiB,GACtB,KAAK,SAAQ,CAChB,CACD,WAAW,oBAAqB,CAC5B,MAAO,CAAC,UAAW,YAAY,CAClC,CACD,mBAAoB,CAChB,KAAK,iBAAiB,cAAeA,GAAY,gBAAiB,CAC9D,KAAM,EAClB,CAAS,EACD,KAAK,iBAAiB,QAAS,IAAM,KAAK,UAAW,EACxD,CACD,IAAI,SAAU,CACV,OAAO,mBAAmB,KAAK,aAAa,SAAS,GAAK,EAAE,CAC/D,CACD,IAAI,QAAQltC,EAAI,CACZ,KAAK,aAAa,UAAWA,CAAE,CAClC,CACD,IAAI,YAAa,CACb,OAAO,mBAAmB,KAAK,aAAa,YAAY,GAAK,EAAE,CAClE,CACD,IAAI,WAAWA,EAAI,CACf,KAAK,aAAa,aAAcA,CAAE,CACrC,CACD,IAAI,YAAa,CACb,OAAO,KAAK,aAAa,YAAY,GAAK,OAC7C,CACD,IAAI,WAAWkK,EAAO,CAClB,KAAK,aAAa,aAAcA,CAAK,CACxC,CACD,IAAI,WAAY,CACZ,OAAO,KAAK,aAAa,WAAW,GAAK,MAC5C,CACD,IAAI,UAAUsE,EAAM,CAChB,KAAK,aAAa,YAAaA,CAAI,CACtC,CACD,IAAI,cAAe,CACf,OAAO,KAAK,aAAa,cAAc,GAAK,GAC/C,CACD,IAAI,UAAW,CACX,OAAO,KAAK,aAAa,UAAU,CACtC,CACD,IAAI,UAAW,CACX,OAAO,KAAK,aAAa,UAAU,CACtC,CACD,IAAI,eAAgB,CAChB,OAAO,KAAK,aAAa,eAAe,GAAK,WAChD,CACD,IAAI,eAAgB,CAChB,OAAQ,KAAK,aAAa,eAAe,GACrC,MACP,CACD,IAAI,QAAS,CACT,MAAO,SAAS,KAAK,YAAY,IAAI,KAAK,aAAa,QAAQ,CAAC,EACnE,CACD,IAAI,OAAOnO,EAAM,CACb,KAAK,aAAa,SAAUA,CAAI,CACnC,CACD,UAAW,CACP,MAAM8sC,EAAY,KAAK,aAAa,CAAE,KAAM,MAAM,CAAE,EACpD,IAAIC,EAAQ,GACR,OAAO,mBACPA,EAAQ,UAAU,OAAO,gBAAgB,KAE7CD,EAAU,UAAY;AAAA,eACfC,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAsFZ,KAAK,YAAcD,EAAU,cAAc,QAAQ,EACnD,KAAK,UAAY,CACb,SAAUA,EAAU,cAAc,sBAAsB,EACxD,KAAMA,EAAU,cAAc,kBAAkB,EAChD,KAAMA,EAAU,cAAc,kBAAkB,CAC5D,EACQ,KAAK,iBAAmBA,EAAU,cAAc,aAAa,CAChE,CACD,gBAAiB,CACb,KAAK,qBAAoB,EACzB,KAAK,iBAAiB,aAAa,aAAc,GAAG,KAAK,SAAS,KAAK,KAAK,UAAU,EAAE,EACxF,KAAK,aAAa,QAAS,GAAG,KAAK,SAAS,KAAK,KAAK,UAAU,EAAE,GAC9D,KAAK,UAAY,KAAK,eAAc,IACpC,KAAK,yBAAwB,CAEpC,CACD,yBAAyB3+B,EAAM6+B,EAAQC,EAAQ,CAC3C,OAAQ9+B,EAAI,CACR,IAAK,UACL,IAAK,aACL,IAAK,aACL,IAAK,YAAa,CACV6+B,IAAWC,IACX,KAAK,eAAc,EACf,KAAK,YAAY,UAAU,SAAS,WAAW,IAC/C,KAAK,YAAY,UAAU,OAAO,WAAW,EAC7C,KAAK,WAAW,cAAc,QAAQ,EAAE,OAAM,EAC9C,KAAK,eAAiB,KAG9B,KACH,CACD,QACI,KACP,CACJ,CACD,UAAUC,EAAyB,GAAO,CACtC,GAAI,CAAC,KAAK,eAAgB,CACtB,IAAIC,EAAWD,EAAyB,EAAI,EAC5C,MAAME,EAAgB,KAAK,SAAW,YAAc,GACpD,IAAIC,EACA,KAAK,WACLA,EAAc,2BAA2B,KAAK,UAAU,IAGxDA,EAAc,GAAG,KAAK,OAAO,IAE7B,KAAK,mBACL,KAAK,OAAS,6EAA6E,KAAK,OAAO,GACvGF,EAAW,GAEf,MAAMG,EAAa;AAAA,iCACE,KAAK,UAAU;AAAA;AAAA,4BAEpBF,CAAa,cAAcC,CAAW,YAAYF,CAAQ,IAAI,KAAK,MAAM;AAAA,YAEzF,KAAK,YAAY,mBAAmB,YAAaG,CAAU,EAC3D,KAAK,YAAY,UAAU,IAAI,WAAW,EAC1C,KAAK,eAAiB,GACtB,KAAK,qBAAoB,EACzB,KAAK,cAAc,IAAI,YAAY,0BAA2B,CAC1D,OAAQ,CACJ,QAAS,KAAK,OACjB,EACD,QAAS,GACT,WAAY,EACf,EAAC,CACL,CACJ,CACD,sBAAuB,SACnB,MAAMC,EAAgB,+BAA+B,KAAK,OAAO,IAAI,KAAK,aAAa,QACjFC,EAAgB,0BAA0B,KAAK,OAAO,IAAI,KAAK,aAAa,OAClF,KAAK,UAAU,SAAS,QAAU,KAAK,cACvC,KAAK,UAAU,KAAK,OAASD,EAC7B,KAAK,UAAU,KAAK,OAASC,EAC7B,KAAK,UAAU,SAAS,IAAMA,EAC9B,KAAK,UAAU,SAAS,aAAa,aAAc,GAAG,KAAK,SAAS,KAAK,KAAK,UAAU,EAAE,GAC1FzN,GAAA2E,EAAA,KAAK,YAAL,YAAAA,EAAgB,WAAhB,MAAA3E,EAA0B,aAAa,MAAO,GAAG,KAAK,SAAS,KAAK,KAAK,UAAU,GACtF,CACD,0BAA2B,CACvB,MAAM/kC,EAAU,CACZ,KAAM,KACN,WAAY,MACZ,UAAW,CACvB,EACyB,IAAI,qBAAqB,CAACogB,EAASqM,IAAa,CAC7DrM,EAAQ,QAAQoqB,GAAS,CACjBA,EAAM,gBAAkB,CAAC,KAAK,iBAC9BqH,GAAY,gBAAe,EAC3B,KAAK,UAAU,EAAI,EACnBplB,EAAS,UAAU,IAAI,EAE3C,CAAa,CACJ,EAAEzsB,CAAO,EACD,QAAQ,IAAI,CACxB,CACD,sBAAuB,CACf,KAAK,kBACL,WAAW,IAAM,UACb+kC,GAAA2E,EAAA,KAAK,WACA,cAAc,QAAQ,IAD3B,YAAAA,EAEM,gBAFN,MAAA3E,EAEqB,YAAY,mDAA8D,IAClG,EAAE,GAAI,CAEd,CACD,gBAAiB,CACb,OAAQ,KAAK,aAAa,OAAO,IAAM,IACnC,OAAO,WAAW,mBAAmB,EAAE,OAC9C,CACD,OAAO,YAAY0N,EAAMxtC,EAAK,CAC1B,MAAMytC,EAAW,SAAS,cAAc,MAAM,EAC9CA,EAAS,IAAMD,EACfC,EAAS,KAAOztC,EAChBytC,EAAS,YAAc,OACvB,SAAS,KAAK,OAAOA,CAAQ,CAChC,CACD,OAAO,iBAAkB,CACjBb,GAAY,gBAAkB,OAAO,4BAEzCA,GAAY,YAAY,aAAc,sBAAsB,EAC5DA,GAAY,YAAY,aAAc,qBAAqB,EAC3DA,GAAY,YAAY,aAAc,yBAAyB,EAC/DA,GAAY,YAAY,aAAc,wBAAwB,EAC9DA,GAAY,YAAY,aAAc,qCAAqC,EAC3EA,GAAY,YAAY,aAAc,gCAAgC,EACtEA,GAAY,eAAiB,GAC7B,OAAO,0BAA4B,GACtC,CACL,CACAA,GAAY,eAAiB,GAC7B,eAAe,OAAO,eAAgBA,EAAW,EC5RjD,MAAMc,GAAc,IAAI,WAAW,GAAG,EACtC,QAAS3vC,EAAI,EAAGA,EAAI,GAAIA,IACpB2vC,GACI,sFAAsF,WAClF3vC,CACH,CACJ,EAAGA,EAER,MAAM4vC,GAAW,CAACtd,EAAKud,EAAOC,IAAQ,CAClC,IAAIv2C,EAAQ,EACZ,KAAOs2C,EAAQC,GACXv2C,GAAS,GACTA,GAASo2C,GAAYrd,EAAI,WAAWud,GAAO,CAAC,EAEhD,OAAOt2C,CACX,EAEMw2C,GAAM,KAAK,IACXC,GAAK,KAAK,GACVC,GAAMD,GAAK,EAEXlT,GAAI,OACJ7kC,GAAI,QACJi4C,GAAgB32C,GAClBA,EAAQ,SAAWw2C,GAAIx2C,EAAQtB,GAAI,QAAU,GAAG,EAAIsB,EAAQujC,GAE1DqT,GAAgBtlB,GAClB,CAAC,EAAEA,EAAI,QAAa5yB,GAAI83C,GAAIllB,EAAG,OAAQ,EAAI,OAASA,EAAIiS,GAAI,GAE1DsT,GAAWl0C,IAAOA,EAAI,EAAI,GAAK,GAAKA,EAAIA,EAMxCm0C,GAAWn0C,GAAM,CAEnB,IADAA,GAAK8zC,GAAK,EACH9zC,EAAI8zC,IACP9zC,GAAK+zC,GAET,MAAMK,EAAM,WAAap0C,EAAI,WAAck0C,GAAQl0C,CAAC,EACpD,MAAO,OAASk0C,GAAQE,CAAG,EAAIA,GAAOA,CAC1C,EAOO,SAASC,GAAwBC,EAAU,CAC9C,MAAMtC,EAAM0B,GAASY,EAAU,EAAG,CAAC,EACnC,MAAO,CAACtC,GAAO,GAAKA,GAAO,EAAK,IAAKA,EAAM,GAAG,CAClD,CAUO,SAASuC,GAAeD,EAAUrxC,EAAOe,EAAQwwC,EAAO,CAC3D,MAAMC,EAAWf,GAASY,EAAU,EAAG,CAAC,EAClCI,EAAQD,EAAW,EAAK,EACxBE,EAAO,CAAC,EAAEF,EAAW,GAAK,EAC1B/kC,EAAOglC,EAAOC,EAEpB,IAAI7wC,EAAI,EACJu5B,EAAI,EACJr9B,EAAI,EACJC,EAAI,EACJhE,EAAI,EACJ24C,EAAI,EACJ/6B,EAAI,EACJg7B,EAAQ,EACRC,EAAS,EACTC,EAAa,EACbC,EAAa,EACb33C,EAAQ,EAEZ,MAAM43C,GAAiBvB,GAASY,EAAU,EAAG,CAAC,EAAI,GAAK,OAAUE,EAAQ,GAEnEU,EAAS,IAAI,aAAaxlC,EAAO,CAAC,EAElCylC,EAAed,GAAwBC,CAAQ,EACrD,IAAKxwC,EAAI,EAAGA,EAAI,EAAGA,IACfoxC,EAAOpxC,CAAC,EAAIkwC,GAAamB,EAAarxC,CAAC,CAAC,EAG5C,IAAKA,EAAI,EAAGA,EAAI4L,EAAM5L,IAClBzG,EAAQq2C,GAASY,EAAU,EAAIxwC,EAAI,EAAG,EAAIA,EAAI,CAAC,EAC/CoxC,EAAOpxC,EAAI,CAAC,EAAIowC,GAAQ,CAAC,EAAE72C,EAAQ,KAAO,CAAC,EAAI43C,EAC/CC,EAAOpxC,EAAI,EAAI,CAAC,EAAIowC,GAAS,CAAC,EAAE72C,EAAQ,IAAM,GAAM,CAAC,EAAI43C,EACzDC,EAAOpxC,EAAI,EAAI,CAAC,EAAIowC,GAAS72C,EAAQ,GAAM,CAAC,EAAI43C,EAGpD,MAAMG,EAAW,IAAI,aAAaT,EAAO3wC,CAAM,EACzCqxC,EAAW,IAAI,aAAaX,EAAOzxC,CAAK,EAC9C,IAAKo6B,EAAI,EAAGA,EAAIsX,EAAMtX,IAClB,IAAKp9B,EAAI,EAAGA,EAAI+D,EAAQ/D,IACpBm1C,EAAS/X,EAAIr5B,EAAS/D,CAAC,EAAIk0C,GAASL,GAAK7zC,EAAIo9B,EAAKr5B,CAAM,EAGhE,IAAKF,EAAI,EAAGA,EAAI4wC,EAAM5wC,IAClB,IAAK9D,EAAI,EAAGA,EAAIiD,EAAOjD,IACnBq1C,EAASvxC,EAAIb,EAAQjD,CAAC,EAAIm0C,GAASL,GAAK9zC,EAAI8D,EAAKb,CAAK,EAI9D,MAAMqyC,EAAcryC,EAAQ,EACtBsyC,EAAS,IAAI,kBAAkBD,EAActxC,CAAM,EAEzD,IAAK/D,EAAI,EAAGA,EAAI+D,EAAQ/D,IACpB,IAAKD,EAAI,EAAGA,EAAIiD,EAAOjD,IAAK,CAExB,IADA/D,EAAI24C,EAAI/6B,EAAI,EACPwjB,EAAI,EAAGA,EAAIsX,EAAMtX,IAElB,IADAyX,EAASM,EAAS/X,EAAIr5B,EAAS/D,CAAC,EAC3B6D,EAAI,EAAGA,EAAI4wC,EAAM5wC,IAClB+wC,EAAQQ,EAASvxC,EAAIb,EAAQjD,CAAC,EAAI80C,EAClCC,GAAcjxC,EAAIu5B,EAAIqX,GAAQ,EAC9Bz4C,GAAKi5C,EAAOH,CAAU,EAAIF,EAC1BD,GAAKM,EAAOH,EAAa,CAAC,EAAIF,EAC9Bh7B,GAAKq7B,EAAOH,EAAa,CAAC,EAAIF,EAItCG,EAAa,EAAIh1C,EAAIC,EAAIq1C,EACzBC,EAAOP,CAAU,EAAIf,GAAah4C,CAAC,EACnCs5C,EAAOP,EAAa,CAAC,EAAIf,GAAaW,CAAC,EACvCW,EAAOP,EAAa,CAAC,EAAIf,GAAap6B,CAAC,EACvC07B,EAAOP,EAAa,CAAC,EAAI,GAC5B,CAEL,OAAOO,CACX,CClIA,MAAMC,GAAiB,CAACC,EAAc30C,EAAU,KAAO,CACrD,MAAM40C,EAAO50C,EAAQ,MAAQ,IACvByX,EAAQzX,EAAQ,OAAS,EAE/B,IAAI60C,EAAQ,EACZ,MAAMC,EAAS,CAAE,EAEjB,OAAOH,EAAa,QAAS,EAAC,OAAO,CAACI,EAAUC,IAAU,CACpDF,EAAO,QACND,GACAC,EAAOD,CAAK,GAEZC,EAAOD,CAAK,IAAMG,EAAM,UAAU,EAAGF,EAAOD,CAAK,EAAE,OAAS,CAAC,IAEhEC,EAAO,OAAOD,EAAO,CAAC,EACtBA,KAKF,MAAMI,EAAc,CAClB,GAHkBL,EAAK,OAAOC,EAAQA,EAAQp9B,EAAQ,CAAC,CAGzC,GAAGu9B,CAAK,GACtB,GAAGD,CACJ,EAID,OAAIC,EAAM,UAAU,EAAG,CAAC,IAAM,OAC5BH,IACAC,EAAOD,CAAK,EAAIG,EAAM,UAAU,EAAGA,EAAM,OAAS,CAAC,GAG9CC,CACX,EAAK,CAAE,GAAE,KAAK;AAAA,CAAI,CAClB,EAEA,IAAAC,GAAiBR,GCrCjB,MAAMS,GAAoBC,GAMxBA,EAAmB,KAAM,EAAC,QAAQ,2BAA4B,EAAE,EAO5DC,GAA+BC,GAAW,CAC9C,MAAMC,EAAiBJ,GAAiBG,CAAM,EAAE,MAAM;AAAA,CAAI,EAEpDE,EAAc,CAAE,EACtB,IAAIC,EAAiB,GACrB,QAAS,EAAI,EAAG,EAAIF,EAAe,OAAQ,GAAK,EAAG,CACjD,MAAMG,EAAOH,EAAe,CAAC,EAG7B,GAAIG,EAAK,SAAS,IAAI,EAAG,CACvBF,EAAY,KAAK,GAAGC,CAAc,GAAGC,EAAK,MAAM,EAAG,EAAE,CAAC,KAAK,EAC3DD,EAAiB,GAEjB,QACD,CAED,GAAIC,EAAK,SAAS,GAAG,EAAG,CACtBF,EAAY,KAAK,GAAGC,CAAc,GAChCC,EAAK,WAAW,GAAG,GAAKA,EAAK,WAAW,GAAG,EAAI,GAAK,GAC5D,GAASA,CAAI,EAAE,EACTD,EAAiB,GAEjB,QACD,CAEDA,GAAkBA,EAAe,OAAS,IAAIC,CAAI,GAAKA,CACxD,CAED,OAAOF,CACT,EAEA,IAAAG,GAAiB,CACjB,4BAAEN,GACA,iBAAAF,EACF,ECnDA,MAAMT,GAAiB5iC,GACjB,CAAE,4BAAAujC,EAA6B,EAAGO,GAOlCC,GAAW,CAACP,EAAQt1C,EAAU,KAAO,CACzC,MAAM81C,EAAWT,GAA4BC,CAAM,EAEnD,OAAOZ,GAAeoB,EAAU91C,CAAO,CACzC,EAEA,IAAA8pB,GAAiB+rB,mBCbjB,IAAIroC,IAAsB,IAAO,EAAE,MAAQ,QAAS,EAAE,MAAQ,QAAS,EAAE,QAAU,UAAW,IAAIA,IAAK,CAAE,GAAGsyB,IAAsB,IAAO,EAAE,oBAAsB,wBAAyB,EAAE,mBAAqB,uBAAwB,EAAE,wBAA0B,4BAA6B,IAAIA,IAAK,EAAE,EAC7S,MAAMiW,GAAI,IAAM,OAAO,QAAU,UAAW,2BAAQ,eAAgB,KAAO,KAAMC,GAAI,IAAM,OAAO,QAAU,UAAW,2BAAQ,aAAc,KAAO,KACpJ,SAASC,GAAE,EAAG,CACZ,KAAM,CAAE,YAAa,CAAC,EAAK,EAAGpW,EAAImW,KAClC,OAAOnW,GAAK,aAAaA,GAAK,YAAa,CAC7C,CACA,SAASqW,GAAE,EAAG,CACZ,MAAM,EAAIH,KACV,OAAO,EAAE,uBAAuB,YAAc,EAAE,GAAK,EAAE,uBAAuB,EAChF,CACA,SAASI,GAAE,EAAG,CACZ,KAAM,CAAE,YAAa,CAAG,EAAG,EAC3B,GAAI,CAAC,EACH,MAAO,GACT,MAAMtW,EAAIkW,KACV,OAAOlW,GAAK,aAAaA,GAAK,cAAe,CAC/C,CACA,SAASuW,GAAE,EAAG,CACZ,OAAOF,GAAE,CAAC,GAAKD,GAAE,CAAC,GAAKE,GAAE,CAAC,CAC5B,CACA,SAAS5Z,GAAE,EAAG,CACZ,OAAO0Z,GAAE,CAAC,EAAI,CACZ,EAAG,EAAE,QAAQ,CAAC,EAAE,MAChB,EAAG,EAAE,QAAQ,CAAC,EAAE,KACjB,EAAGC,GAAE,CAAC,GAAKC,GAAE,CAAC,EAAI,CACjB,EAAG,EAAE,MACL,EAAG,EAAE,KACN,EAAG,IACN,CACA,SAASE,GAAE,EAAG,CACZ,MAAO,CACL,OAAQ,EAAE,OACV,cAAe,EAAE,cACjB,YAAa,EAEb,QAAS,IAAM,CACd,CACL,CACA,CACA,SAASC,GAAE,EAAG,CACZ,UAAW,EAAI,IACf,aAAczW,EAAI,GAClB,OAAQ1gC,EAAIqO,GAAE,QACd,iBAAkBivB,EAAI,GACtB,qBAAsB5O,EAAI,GAC1B,aAAc0S,EACd,QAASgW,EACT,OAAQC,EACR,SAAUC,EACV,SAAU19B,CACZ,EAAI,GAAI,CACN,MAAM29B,EAAIppC,EAAE,EAAE,EAAG4Q,EAAI5Q,EAAE,EAAE,EAAGqpC,EAAIrpC,EAAC,EAAIwL,EAAIxL,EAAG,EAAEspC,EAAItpC,EAAE,CAAC,EAAGg6B,EAAIh6B,EAAE,IAAI,EAAGupC,EAAIC,GACtE97C,GAAOG,GAAM,CACZ+iB,EAAE,SAAWk4B,GAAEj7C,CAAC,IAAMolC,IAAM,QAAU,CAACA,EAAEplC,CAAC,IAAM0kC,GAAK1kC,EAAE,QAAS,EAAEo7C,GAAA,MAAAA,EAAIp7C,EAAG,CAAE,QAASH,CAAC,GAAKssC,EAAE,QAAU/K,GAAEphC,CAAC,EAAG+iB,EAAE,QAAU,GAAIy4B,EAAE,QAAUx7C,EAAE,cAAe2d,EAAE,QAAU,WAAW,IAAM,CACpL89B,EAAE,UAAYA,EAAE,QAAQz7C,EAAG,CAAE,QAASH,CAAC,CAAE,EAAG07C,EAAE,QAAU,GAChE,EAAS,CAAC,GACL,EACD,CAAC7W,EAAGU,EAAGgW,EAAG,CAAC,CACZ,EAAEvzC,EAAI8zC,GACJ97C,GAAM,CAACG,EAAG4kB,IAAM,CACfq2B,GAAEj7C,CAAC,GAAK+iB,EAAE,UAAYopB,EAAE,QAAU,KAAMzH,GAAK1kC,EAAE,QAAO,EAAIu7C,EAAE,QAAUD,GAAA,MAAAA,EAAIt7C,EAAG,CAAE,QAASH,CAAC,GAAMkjB,EAAE,UAAWnF,GAAA,MAAAA,EAAI5d,EAAG,CAAE,QAASH,EAAG,OAAQ+kB,GAAK+f,GAAE,kBAAkB,IAAK4W,EAAE,QAAU,GAAIx4B,EAAE,QAAU,GAAIpF,EAAE,UAAY,QAAU,aAAaA,EAAE,OAAO,EACtP,EACD,CAAC+mB,EAAG4W,EAAG19B,CAAC,CACT,EAAExL,EAAIupC,GACJ97C,GAAOG,GAAM,CACZ,GAAIq7C,GAAA,MAAAA,EAAIr7C,EAAG,CAAE,QAASH,CAAC,GAAKyhC,IAAM,IAAM6K,EAAE,QAAS,CACjD,MAAMvnB,EAAIwc,GAAEphC,CAAC,EACb,GAAI4kB,EAAG,CACL,MAAMg3B,EAAIta,IAAM,GAAK,GAAKA,EAAGua,EAAI,CAC/B,EAAG,KAAK,IAAIj3B,EAAE,EAAIunB,EAAE,QAAQ,CAAC,EAC7B,EAAG,KAAK,IAAIvnB,EAAE,EAAIunB,EAAE,QAAQ,CAAC,CACzC,GACW0P,EAAE,EAAID,GAAKC,EAAE,EAAID,IAAM/zC,EAAEhI,CAAC,EAAEG,EAAG2kC,GAAE,mBAAmB,CACtD,CACF,CACF,EACD,CAAC98B,EAAGy5B,EAAG+Z,CAAC,CACT,EAAEvZ,EAAI6Z,GACJ97C,GAAM,CACL,GAAI,IAAM,KACR,MAAO,GACT,OAAQmE,EAAC,CACP,KAAKqO,GAAE,MAAO,CACZ,MAAMrS,EAAI,CACR,YAAa07C,EAAE77C,CAAC,EAChB,YAAauS,EAAEvS,CAAC,EAChB,UAAWgI,EAAEhI,CAAC,CAC1B,EACU,OAAO6yB,IAAM1yB,EAAE,aAAgB4kB,GAAM,CACnC/c,EAAEhI,CAAC,EAAE+kB,EAAG+f,GAAE,uBAAuB,CAClC,GAAG3kC,CACL,CACD,KAAKqS,GAAE,MACL,MAAO,CACL,aAAcqpC,EAAE77C,CAAC,EACjB,YAAauS,EAAEvS,CAAC,EAChB,WAAYgI,EAAEhI,CAAC,CAC3B,EACQ,KAAKwS,GAAE,QAAS,CACd,MAAMrS,EAAI,CACR,cAAe07C,EAAE77C,CAAC,EAClB,cAAeuS,EAAEvS,CAAC,EAClB,YAAagI,EAAEhI,CAAC,CAC5B,EACU,OAAO6yB,IAAM1yB,EAAE,eAAkB4kB,GAAM/c,EAAEhI,CAAC,EAAE+kB,EAAG+f,GAAE,uBAAuB,GAAI3kC,CAC7E,CACF,CACF,EACD,CAAC,EAAG6H,EAAG6qB,EAAG1uB,EAAGoO,EAAGspC,CAAC,CACrB,EACE,OAAO/C,GAAE,IAAM,CACb,GAAI,CAAC,OACH,OACF,SAAS94C,EAAEG,EAAG,CACZ,MAAM4kB,EAAIs2B,GAAEl7C,CAAC,EACb6H,EAAC,EAAG+c,CAAC,CACN,CACD,OAAO,OAAO,iBAAiB,UAAW/kB,CAAC,EAAG,OAAO,iBAAiB,WAAYA,CAAC,EAAG,OAAO,iBAAiB,YAAaA,CAAC,EAAG,IAAM,CACnI,OAAO,oBAAoB,UAAWA,CAAC,EAAG,OAAO,oBAAoB,WAAYA,CAAC,EAAG,OAAO,oBAAoB,YAAaA,CAAC,CACpI,CACA,EAAK,CAACgI,CAAC,CAAC,EAAG8wC,GACP,IAAM,IAAM,CACVh7B,EAAE,UAAY,QAAU,aAAaA,EAAE,OAAO,CAC/C,EACD,CAAE,CACH,EAAEg7B,GAAE,IAAM,CACT8C,EAAE,QAAU,CAChB,EAAK,CAAC,CAAC,CAAC,EAAG3Z,CACX,CCxHA,SAAwBga,GAAK,CAC3BtuC,OACAmrB,OACAojB,WACAzrC,UAAUA,IAAM,CAAC,EACjB0rC,WAAWA,IAAM,CAAC,CACpB,EAAG,CACD,KAAM,CAAC7I,EAASC,CAAU,EAAIpuC,EAAS,SAAS,EAC1C,CACJi3C,UACAC,YACA1yC,KACA2yC,WACAt3C,UACAu3C,WACAC,QACAC,cACAC,aACA5nB,QACEnnB,IACEgvC,EAAgB,CAAC,CAACN,GAAa,IAAIhkB,KAAKgkB,CAAS,EAsBjDO,EAAiBN,EAAWG,EAAcC,EAChD,IAAIG,EAAiB,EAEjBD,GAAkB,IACHC,EAAA,EACRD,GAAkB,IACVC,EAAA,EACRD,GAAkB,MACVC,EAAA,GAGnB,KAAM,CAACC,EAAaC,CAAc,EAAI53C,EAAS,EAAK,EAC9C63C,EAAwBh4C,EAAQi4C,MAAal4B,KAAE23B,aAAe,IAAI,EAExE,OACEtoB,EAAA,OACE0E,OACAjH,IAAI,OACJ/d,MAAO,QAAQooC,EAAW,YAAc,EAAE,IACxC5I,IAAY,UAAY,UAAY,EAAE,GACrCt+B,SAAA,CAED8nC,GAAeE,GAA0BR,GAASJ,EAClDhoB,EAAAsD,EAAA,CAAA1iB,UACElC,EAAA,OAAKgB,MAAM,eAAckB,SACtBhQ,EAAQ+rB,IAAI,CAACmsB,EAAQl1C,IAAM,CACpB,MAAE6L,QAAO6oC,WAAYS,CAAqBD,IAC1CE,EAAQR,EACVO,EAAmBP,EACnB,EACES,EAAaD,EACfA,EAAMziB,eAAevvB,EAAKoqB,QAAUrG,OAAW,CAC7CrjB,MAAO,UACPgwB,sBAAuB+gB,CACxB,GACD,KAEES,EACJH,EAAmB,GACnBA,IACE1yC,KAAKC,IAAI,GAAG1F,EAAQ+rB,IAAKhM,GAAMA,EAAE23B,UAAU,CAAC,EAChD,OACEtoB,EAAA,OAEEtgB,MAAO,2BACLwpC,EAAY,sBAAwB,EAAE,GAExCxxC,MAAO,CACL,eAAgB,GAAGsxC,EAAQ,GAAG,GAChC,EAAEpoC,UAEFof,EAAA,OAAKtgB,MAAM,oBAAmBkB,UAC5BlC,EAAA,QAAAkC,SACElC,EAAC+hB,GAAS,CAAClsB,KAAMkL,EAAOihB,SAAiB,EACrC,EACL0nB,GAASD,EAAS9rB,SAASzoB,CAAC,GAC3BosB,EAAAsD,EAAA,CAAA1iB,SACG,KACDlC,EAACa,EAAI,CAACD,KAAK,eAAe1Q,IAAGoI,EAAAC,EAAE,CAAA1B,GAAA,QAAO,CAAC,EAAG,CAAC,EAC3C,CACH,EACE,EACLmJ,EAAA,OACEgB,MAAM,oBACND,MAAKzI,EAAAC,EAAE,CAAA1B,GAAA,SAAAmwB,OAAA,CAAAqjB,kBAAuB,CAG7B,CAAC,EAACnoC,SAEFqoC,EACE,CAAC,GA3BD,GAAGr1C,CAAC,IAAI6L,CAAK,IAAIspC,CAAgB,EA4BnC,EAER,CACE,GACJ,CAACf,GAAW,CAACI,GACZpoB,EAAA,UACEtgB,MAAM,0BACNmX,SAAUqoB,IAAY,UACtB1qC,QAAgB3I,GAAA,CACdA,EAAE0B,eAAe,EACjBo7C,EAAe,EAAK,CACtB,EAAE/nC,SAAA,CAEFlC,EAACa,EAAI,CAACD,KAAK,aAAaE,KAAK,IAAK,EAAC,IAACd,EAAA85B,EAAA,CAAAjjC,GAAA,SAA0B,CAAC,EACzD,CACT,EACD,EAEFyqB,EAAA,QACEmpB,SAAU,MAAOt9C,GAAM,CACrBA,EAAE0B,eAAe,EACjB,MAAM67C,EAAOv9C,EAAEkC,OACTs7C,EAAW,IAAIC,SAASF,CAAI,EAC5BG,EAAU,GACP3nC,UAAQ,CAACzU,EAAOhB,IAAQ,CAC3BA,IAAQ,QACVo9C,EAAQ5Y,KAAKxjC,CAAK,CACpB,CACD,EACIo8C,EAAQrqC,SACbigC,EAAW,SAAS,EACpB,MAAM4I,EAASwB,CAAO,EACtBpK,EAAW,SAAS,EACtB,EAAEv+B,UAEFlC,EAAA,OAAKgB,MAAM,eAAckB,SACtBhQ,EAAQ+rB,IAAI,CAACmsB,EAAQl1C,IAAM,CACpB,MAAE6L,OAAUqpC,IAClB,OACEpqC,EAAA,OAAKgB,MAAM,cAAakB,SACtBof,EAAA,SAAOtgB,MAAM,aAAYkB,UACvBlC,EAAA,SACEia,KAAMuvB,EAAW,WAAa,QAC9BnkC,KAAK,OACL5W,MAAOyG,EACPijB,SAAUqoB,IAAY,UACtB4I,WACD,EACDppC,EAAA,QAAMgB,MAAM,oBAAmBkB,SAC7BlC,EAAC+hB,GAAS,CAAClsB,KAAMkL,EAAOihB,SAAiB,EACrC,CAAC,EACF,EACJ,EAER,CACE,GACJ,CAAConB,GACAppC,EAAA,UACEgB,MAAM,mBACNiZ,KAAK,SACL9B,SAAUqoB,IAAY,UAAUt+B,SAEhClC,EAAA85B,EAAA,CAAAjjC,GAAA,SAAkB,EACZ,CACT,EACG,EAERyqB,EAAA,KAAGtgB,MAAM,YAAWkB,UACjB,CAAConC,GAAW,CAACF,GACZppC,EAAA,UACEia,KAAK,SACLjZ,MAAM,cACNmX,SAAUqoB,IAAY,UACtB1qC,QAAgB3I,GAAA,CACdA,EAAE0B,eAAe,EACjB4xC,EAAW,SAAS,GAEnB,UACC,MAAM9iC,EAAQ,EACd8iC,EAAW,SAAS,KAExB,EACA1/B,MAAKzI,EAAAC,EAAE,CAAA1B,GAAA,QAAS,CAAC,EAACqL,SAElBlC,EAACa,EAAI,CAACD,KAAK,UAAU1Q,IAAGoI,EAAAC,EAAE,CAAA1B,GAAA,QAAS,CAAC,EAAG,EACjC,EAET,CAAC6yC,GAAS,CAACJ,GAAW,CAACF,GAAYc,GAClC5oB,EAAA,UACErH,KAAK,SACLjZ,MAAM,cACNmX,SAAUqoB,IAAY,UACtB1qC,QAAgB3I,GAAA,CACdA,EAAE0B,eAAe,EACjBo7C,EAAe,CAACD,CAAW,CAC7B,EACAjpC,MAAOipC,EAAW1xC,EAAAC,EAAG,CAAA1B,GAAA,QAAc,GAACyB,EAAAC,EAAG,CAAA1B,GAAA,QAAc,CAAC,EAACqL,SAAA,CAEvDlC,EAACa,EAAI,CACHD,KAAMopC,EAAc,WAAa,YACjC95C,IAAK85C,EAAW1xC,EAAAC,EAAG,CAAA1B,GAAA,QAAc,GAACyB,EAAAC,EAAG,CAAA1B,GAAA,QAAc,CAAC,CACrD,GAAE,GAAG,EACA,EAET,CAACyyC,GAAW,CAACF,GAAY,IAC1BppC,EAAA85B,EAAA,CAAAjjC,GAAA,SAAAmwB,OAAA,CAAAC,EAIgC6Q,GAAc8R,CAAU,EAACkB,EAKzBhT,GAAc8R,CAAU,EAACA,YARtC,EAAA7P,WAAA,CAAA9S,EAGbjnB,EAAA,QAAMe,MAAO6oC,EAA6C,EAACkB,EAK3D9qC,EAAA,QAAMe,MAAO6oC,EAA6C,CAAC,EAGhE,EACA,CAAC,CAACD,GAAeA,IAAgBC,GAChCtoB,EAAAsD,EAAA,CAAA1iB,SAAA,CACG,IAAI,IACE,IACPlC,EAAA85B,EAAA,CAAAjjC,GAAA,SAAAmwB,OAAA,CAAAC,EAIiC6Q,GAAc6R,CAAW,EAACmB,EAM1BhT,GAAc6R,CAAW,EAACA,aATvC,EAAA5P,WAAA,CAAA9S,EAGdjnB,EAAA,QAAMe,MAAO4oC,EAA+C,EAACmB,EAM7D9qC,EAAA,QAAMe,MAAO4oC,EAA+C,CAAC,EAIlE,CAAC,EACF,EACD,IAAI,IACA,IACNL,EACGO,EACA7pC,EAAA85B,EAAA,CAAAjjC,GAAA,SAAAkjC,WAAA,CAAA9S,EACQjnB,EAACknB,GAAY,CAACC,SAAU0iB,EAAgB,CAAC,EAC1C,EAACvxC,EAAAC,EAER,CAAA1B,GAAA,QAAO,CAEP,EAAEgzC,EACJ7pC,EAAA85B,EAAA,CAAAjjC,GAAA,SAAAkjC,WAAA,CAAA9S,EACSjnB,EAACknB,GAAY,CAACC,SAAU0iB,EAAgB,CAAC,EAC3C,EAACvxC,EAAAC,EAER,CAAA1B,GAAA,QAAQ,EACT,EACA,CAAC,EACD,CAET,CCtRA,MAAMk0C,GAAgB/5C,GAAa,ECCnC,SAASg6C,GAAYC,EAAUC,EAAe,CAC5C,GAAI,EAACD,WAAUzqC,QAAQ,MAAO,GAC9B,MAAM2qC,EAAiBF,EAASptC,OAAQ27B,GAAM,CAC5C,KAAM,CAAE37B,QAAQ,EAAG27B,EACb4R,EAAavtC,EAAOwtC,QAAQ1tB,SAASutB,CAAa,EACxD,OAAKE,EACAvtC,EAAO0rC,UACL,IAAIhkB,KAAK1nB,EAAO0rC,SAAS,EAAI,IAAIhkB,KADV6lB,EADN,EAG1B,CAAC,EACD,GAAI,CAACD,EAAe3qC,OAAQ,MAAO,GAEnC,GADiB2qC,EAAerZ,KAAM0H,GAAMA,EAAE37B,OAAOytC,eAAiB,MAAM,EAE1E,MAAO,CACLC,OAAQ,QAGZ,GADeJ,EAAerZ,KAAM0H,GAAMA,EAAE37B,OAAOytC,eAAiB,MAAM,EAC9D,CACV,MAAME,EAAeL,EAAeltB,IAAKub,GAAMA,EAAE37B,OAAOkD,KAAK,EAC7D,MAAO,CACLwqC,OAAQ,OACRE,OAAQD,EACRE,UAAWF,EAAartB,KAAK,KAAK,EAEtC,CACA,MAAO,EACT,OACawtB,GAAaxuB,GAAI6tB,EAAW,EAElC,SAASY,GAAathC,EAAM4gC,EAAeW,EAAkB,OAClE,KAAM,CAAEZ,UAAU,EAAG3gC,EAGrB,GAFI,EAAC2gC,WAAUzqC,SACAqrC,KAAoBvhC,IAAK6Y,UAAL7Y,cAAczT,MAAOg1C,EAC5C,MAAO,GACnB,MAAMC,EAAcH,GAAWV,EAAUC,CAAa,EACtD,OAAKY,EACDA,EAAYP,SAAW,OADF,EAI3B,CACO,SAASQ,GAAcvhC,EAAO0gC,EAAe,CAClD,GAAI,EAAC1gC,WAAOhK,QAAQ,MAAO,GAC3B,GAAI,CAAC0qC,EAAe,OAAO1gC,EAC3B,MAAMqhC,EAAmBjI,KACzB,OAAOp5B,EAAM3M,OAAQyM,GACnBshC,GAAathC,EAAM4gC,EAAeW,CAAgB,CACpD,CACF,CCjDA,MAAM/V,GAAMh9B,SAASC,cAAc,KAAK,EACzB,SAASizC,GAAkBnc,EAAM,CAC9C,OAAKA,GACLiG,GAAIjF,UAAYhB,EAGhBiG,GAAI/yB,iBAAiB,YAAY,EAAEG,QAAS+yB,GAAO,CACjDA,EAAGzE,OAAM,CACX,CAAC,EACMsE,GAAIlE,UAAUpxB,QAPH,CAQpB,CCVayrC,SAAc,oBAAqBx2C,OAEzC,SAASqJ,GAAMjJ,EAAMmwB,EAAM,CAChC,GAAKimB,GACL,GAAI,CACEC,gBAAgBC,UAClBD,gBAAgBE,OAAM,EAExB,MAAMC,EAAY,IAAIC,yBAAyBz2C,CAAI,EAC/CmwB,IAAMqmB,EAAUrmB,KAAOA,GAC3BkmB,gBAAgBptC,MAAMutC,CAAS,CAChC,OAAQl/C,EAAG,CACVkL,MAAMlL,CAAC,CACT,CACF,CCZA,SAASo/C,GAAW93B,EAAQ,OAC1B,KAAM,CAAE+3B,cAAa1b,UAASj2B,OAAM4xC,kBAAkB,EAAGh4B,EACzD,IAAI5e,EAAO,GACX,OAAI22C,WAAa/uB,OACf5nB,GAAQ22C,EAER32C,GAAQkgC,GAAYjF,CAAO,EAE7Bj7B,EAAOA,EAAK4nB,QACR5iB,mBAAM3I,UAAN2I,QAAe2F,SACjB3K,GAAQ;AAAA;AAAA;AAAA,EAAYgF,EAAK3I,QACtB+rB,IAAKhM,GAAM,GAAGpX,EAAK2uC,SAAW,KAAO,GAAG,IAAIv3B,EAAElR,KAAK,EAAE,EACrDod,KAAK;AAAA,CAAI,CAAC,IAEXsuB,WAAkBjsC,SACpB3K,GACE,IACA42C,EACGxuB,IACExe,IACE,CACCitC,MAAO,MACPC,KAAM,MACNC,MAAO,KACPC,MAAO,KACPC,QAAS,EACX,GAAErtC,EAAEwa,IAAI,GAAK,EACjB,EACCkE,KAAK,EAAE,GAEPtoB,CACT,CCjC0F,SAASua,GAAE,EAAE2hB,EAAE3hB,EAAE,CAAC,IAAIlb,EAAE,KAAK8V,EAAE3d,EAAE,IAAI,EAAE4kB,EAAE5kB,EAAE,CAAC,EAAEmsC,EAAEnsC,EAAE,IAAI,EAAEqS,EAAErS,EAAE,EAAE,EAAE0yB,EAAE1yB,EAAG,EAACoS,EAAEpS,EAAG,EAAC,EAAEA,EAAE,CAAC,EAAE24C,EAAE34C,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAe,OAAO,OAApB,IAA2BshC,EAAE,CAACoD,GAAOA,IAAJ,GAAO,EAAE,GAAe,OAAO,GAAnB,WAAqB,MAAM,IAAI,UAAU,qBAAqB,EAAEA,EAAE,CAACA,GAAG,EAAE,IAAIvyB,EAAE,CAAC,EAAE4Q,EAAEA,GAAG,CAAE,GAAE,QAAQhf,EAAE,EAAE,aAAagf,IAAI,CAAC,CAACA,EAAE,SAAS44B,EAAE,YAAY54B,EAAE/e,EAAE,qBAAqB+e,GAAG,CAAC,CAACA,EAAE,iBAAiB28B,EAAE/D,EAAE,KAAK,IAAI,CAAC54B,EAAE,SAAS,EAAE2hB,CAAC,EAAE,KAAK7kC,GAAE,UAAU,CAAC,OAAO84C,EAAE,QAAQ,GAAG,UAAU,CAACA,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,IAAIiC,EAAE76C,GAAE,UAAU,CAAC,IAAIC,EAAE,SAASA,EAAE,CAAC,IAAIH,EAAEwS,EAAE,QAAQtS,EAAE2yB,EAAE,QAAQ,OAAOrgB,EAAE,QAAQqgB,EAAE,QAAQ,KAAK9N,EAAE,QAAQ5kB,EAAEoS,EAAE,QAAQ,EAAE,QAAQ,MAAMrS,EAAEF,CAAC,CAAC,EAAEA,EAAE,SAASG,EAAEH,EAAE,CAACyhC,GAAG,qBAAqB6K,EAAE,OAAO,EAAEA,EAAE,QAAQ7K,EAAE,sBAAsBthC,CAAC,EAAE,WAAWA,EAAEH,CAAC,CAAC,EAAEE,EAAE,SAASC,EAAE,CAAC,GAAG,CAAC24C,EAAE,QAAQ,MAAM,GAAG,IAAI94C,EAAEG,EAAE2d,EAAE,QAAQ,MAAM,CAACA,EAAE,SAAS9d,GAAG6kC,GAAG7kC,EAAE,GAAG87C,GAAG37C,EAAE4kB,EAAE,SAAS86B,CAAC,EAAE5/C,EAAE,SAASD,EAAE,CAAC,OAAOssC,EAAE,QAAQ,KAAKpoC,GAAGsO,EAAE,QAAQrS,EAAEH,CAAC,GAAGwS,EAAE,QAAQqgB,EAAE,QAAQ,KAAKtgB,EAAE,QAAQ,EAAE2Q,EAAE,SAAS/iB,GAAG,CAAC,IAAI+iB,EAAE,KAAK,IAAK,EAAC,GAAGhjB,EAAEgjB,CAAC,EAAE,OAAOjjB,EAAEijB,CAAC,EAAE,GAAG41B,EAAE,QAAQ,CAAC,IAAI9wC,EAAE68B,GAAG3hB,EAAEpF,EAAE,SAASwuB,EAAEwP,EAAE,KAAK,IAAI9zC,EAAE63C,GAAG38B,EAAE6B,EAAE,QAAQ,EAAE/c,EAAEhI,EAAEG,EAAEmsC,CAAC,CAAC,CAAC,EAAEyO,EAAE,UAAU,CAAC,GAAG,GAAG52C,EAAE,CAAC,IAAIlE,EAAE,KAAK,IAAG,EAAG6kC,EAAE5kC,EAAED,CAAC,EAAE,GAAGuS,EAAE,QAAQ,GAAG,MAAM,KAAK,SAAS,EAAEqgB,EAAE,QAAQ7qB,EAAE8V,EAAE,QAAQ7d,EAAE6kC,EAAE,CAAC,GAAG,CAACwH,EAAE,SAASwM,EAAE,QAAQ,OAAO/zB,EAAE,QAAQjH,EAAE,QAAQ9d,EAAEkjB,EAAE2hB,CAAC,EAAEvyB,EAAEnS,EAAE2d,EAAE,OAAO,EAAEvL,EAAE,QAAQ,GAAGupC,EAAE,OAAO97C,EAAEkjB,EAAE2hB,CAAC,EAAE1kC,EAAE2d,EAAE,OAAO,CAAC,CAAC,OAAOwuB,EAAE,SAAStsC,EAAEkjB,EAAE2hB,CAAC,EAAEtyB,EAAE,OAAO,CAAC,EAAE,OAAOwoC,EAAE,OAAO,UAAU,CAACzO,EAAE,UAAU7K,EAAE,qBAAqB6K,EAAE,OAAO,EAAE,aAAaA,EAAE,OAAO,GAAGvnB,EAAE,QAAQ,EAAEvS,EAAE,QAAQsL,EAAE,QAAQ+U,EAAE,QAAQyZ,EAAE,QAAQ,IAAI,EAAEyO,EAAE,UAAU,UAAU,CAAC,MAAM,CAAC,CAACzO,EAAE,OAAO,EAAEyO,EAAE,MAAM,UAAU,CAAC,OAAOzO,EAAE,QAAQrsC,EAAE,KAAK,IAAG,CAAE,EAAEsS,EAAE,OAAO,EAAEwoC,CAAC,EAAE,CAACzoC,EAAEwpC,EAAEjX,EAAEgb,EAAE37C,EAAEu9B,EAAE,EAAEt9B,CAAC,CAAC,EAAE,OAAO42C,CAAC,CAAyM,SAASh2B,GAAE5kB,EAAEH,EAAEE,EAAE,CAAC,IAAID,EAAWC,IAAT,OAAW,GAAGA,EAAE2kC,EAAE5kC,EAAE,QAAQ+H,EAAE/H,EAAE,SAAS,OAAOijB,GAAE/iB,EAAEH,EAAE,CAAC,QAAQA,EAAE,QAAiB6kC,IAAT,QAAYA,EAAE,SAAkB78B,IAAT,QAAYA,CAAC,CAAC,CAAC,CCI98D,SAAS83C,GAAmBC,EAAYC,EAAc,CACpD,IAAIC,EAAgBx7C,EAAO,IAAI,EAC3By7C,EAAkBz7C,EAAO,IAAI,EACjCy7C,EAAgB,QAAUF,EAC1B,IAAIG,EAAe17C,EAAO,IAAI,EAG9BI,GAAU,UAAY,CACpBu7C,GACJ,CAAG,EACD,IAAIA,EAAuB16C,GAAY,UAAY,CACjD,IAAI26C,EAAYF,EAAa,QACzBH,EAAeE,EAAgB,QAE/Bz9C,EAAU49C,IAAwBL,EAAeA,aAAwB,QAAUA,EAAeA,EAAa,QAAU,MAEzHC,EAAc,SAAWA,EAAc,QAAQ,UAAYx9C,GAAWw9C,EAAc,QAAQ,aAAeF,IAI3GE,EAAc,SAAWA,EAAc,QAAQ,SACjDA,EAAc,QAAQ,UAGxBA,EAAc,QAAU,CACtB,QAASx9C,EACT,WAAYs9C,EAGZ,QAASt9C,EAAUs9C,EAAWt9C,CAAO,EAAI,MAC/C,EACA,EAAK,CAACs9C,CAAU,CAAC,EAEfl7C,UAAU,UAAY,CACpB,OAAO,UAAY,CACbo7C,EAAc,SAAWA,EAAc,QAAQ,UACjDA,EAAc,QAAQ,UACtBA,EAAc,QAAU,KAEhC,CACG,EAAE,CAAE,GACEv6C,GAAY,SAAUjD,EAAS,CACpC09C,EAAa,QAAU19C,EACvB29C,GACJ,EAAK,CAACA,CAAoB,CAAC,CAC3B,CA2BA,SAASE,GAAY9Q,EAAO+Q,EAASC,EAAU,CAC7C,OAAKhR,EAAM+Q,CAAO,EAcX/Q,EAAM+Q,CAAO,EAAE,CAAC,EAAI/Q,EAAM+Q,CAAO,EAAE,CAAC,EAAEC,CAAQ,EAGrDhR,EAAM+Q,CAAO,EAAEC,CAAQ,EAhBjBD,IAAY,iBAMP/Q,EAAM,YAAYgR,IAAa,aAAe,QAAU,QAAQ,EAGzE,MAQJ,CAEA,SAASC,GAAkBz2C,EAAM,CAC3BA,IAAS,SACXA,EAAO,IAMT,IAAI02C,EAAW12C,EAAK,SAChB22C,EAAcl8C,EAAO,MAAS,EAClCk8C,EAAY,QAAUD,EACtB,IAAIxvC,EAAQlH,EAAK,OAAS,KAAK,MAE3B42C,EAAoBn8C,IAEpBS,EAAYC,EAAS,CACvB,MAAO,OACP,OAAQ,MACZ,CAAG,EACGyO,EAAO1O,EAAU,CAAC,EAClBguB,EAAUhuB,EAAU,CAAC,EAIrB27C,EAAap8C,EAAO,EAAK,EAC7BI,GAAU,UAAY,CACpB,OAAAg8C,EAAW,QAAU,GACd,UAAY,CACjBA,EAAW,QAAU,EAC3B,CACG,EAAE,CAAE,GAEL,IAAIC,EAAWr8C,EAAO,CACpB,MAAO,OACP,OAAQ,MACZ,CAAG,EAIGs8C,EAAcjB,GAAmBp6C,GAAY,SAAUjD,EAAS,CAGlE,OAAI,CAACm+C,EAAkB,SAAWA,EAAkB,QAAQ,MAAQ52C,EAAK,KAAO42C,EAAkB,QAAQ,QAAU1vC,KAClH0vC,EAAkB,QAAU,CAC1B,IAAK52C,EAAK,IACV,MAAOkH,EACP,SAAU,IAAI,eAAe,SAAUkU,EAAS,CAC9C,IAAIoqB,EAAQpqB,EAAQ,CAAC,EACjBm7B,EAAUv2C,EAAK,MAAQ,aAAe,gBAAkBA,EAAK,MAAQ,2BAA6B,4BAA8B,iBAChIg3C,EAAgBV,GAAY9Q,EAAO+Q,EAAS,YAAY,EACxDU,EAAiBX,GAAY9Q,EAAO+Q,EAAS,WAAW,EACxDW,EAAWF,EAAgB9vC,EAAM8vC,CAAa,EAAI,OAClDG,EAAYF,EAAiB/vC,EAAM+vC,CAAc,EAAI,OAEzD,GAAIH,EAAS,QAAQ,QAAUI,GAAYJ,EAAS,QAAQ,SAAWK,EAAW,CAChF,IAAIC,EAAU,CACZ,MAAOF,EACP,OAAQC,CACtB,EACYL,EAAS,QAAQ,MAAQI,EACzBJ,EAAS,QAAQ,OAASK,EAEtBR,EAAY,QACdA,EAAY,QAAQS,CAAO,EAEtBP,EAAW,SACd3tB,EAAQkuB,CAAO,CAGpB,CACX,CAAS,CACT,GAGIR,EAAkB,QAAQ,SAAS,QAAQn+C,EAAS,CAClD,IAAKuH,EAAK,GAChB,CAAK,EACM,UAAY,CACb42C,EAAkB,SACpBA,EAAkB,QAAQ,SAAS,UAAUn+C,CAAO,CAE5D,CACA,EAAK,CAACuH,EAAK,IAAKkH,CAAK,CAAC,EAAGlH,EAAK,GAAG,EAC/B,OAAOuQ,GAAQ,UAAY,CACzB,MAAO,CACL,IAAKwmC,EACL,MAAOntC,EAAK,MACZ,OAAQA,EAAK,MACnB,CACA,EAAK,CAACmtC,EAAantC,EAAK,MAAOA,EAAK,MAAM,CAAC,CAC3C,CCvLe,SAASytC,GAAa,CAAEr4C,YAAY,WAAY,EAAI,GAAI,CACrE,MAAMxE,EAAMC,IACNi8C,EAAWY,GAAqB,CAAC,CAAEp5C,QAAO,IAAM,CACpD,GAAI1D,EAAIkF,QAAS,CACf,KAAM,CAAE63C,gBAAiB/8C,EAAIkF,QAC7B,IAAI83C,EAAYD,EAAer5C,EAC/B,GAAIs5C,EAAW,CACb,KAAM,CAAEt5C,OAAQu5C,EAAS77B,WAAU,EAAInP,iBAAiBjS,EAAIkF,OAAO,EAC7Dg4C,EAAiBjvB,SAAS7M,GAAa67B,EAAS,EAAE,EACxDD,EAAYD,EAAeG,CAC7B,CACAl9C,EAAIkF,QAAQomB,UAAUnH,OAAO3f,EAAWw4C,CAAS,CACnD,CACD,EAAE,GAAG,EACNf,UAAkB,CAChBj8C,MACAm9C,IAAK,aACLjB,UACF,CAAC,EACMl8C,CACT,CCxBA,MAAeo9C,GAAA,CACbC,OAAQ,QACRC,SAAU,QACVC,QAAS,OACTC,OAAQ,UACRC,MAAO,UACT,ECNO,IAAIC,GAAY,WACZC,GAAa,WACbC,GAAS,IAAI,OAAOF,GAAW,sCAAsC,EAAE,OAAOC,GAAY,yBAAyB,ECF1HE,GAAQ,OAAO,OAAW,IACnBC,GAAU,UAAY,CAC7B,MAAO,CAACD,KAAU,iBAAkB,QAAU,UAAU,eAAiB,EAC7E,EAKO,IAAIE,GAAuB,SAAU7T,EAAI,CAC5C,IAAIxqC,EAAIwqC,EAAG,EAAGvqC,EAAIuqC,EAAG,EAAG8T,EAAQ9T,EAAG,MACnC,MAAO,WAAW,OAAO8T,EAAO,GAAG,EAAE,OAAOA,EAAO,mBAAmB,EAAE,OAAOt+C,EAAG,MAAM,EAAE,OAAOC,EAAG,QAAQ,CAChH,ECXA,IAAIyG,GAAM,KAAK,IAAKF,GAAM,KAAK,IACxB,SAAS+3C,GAAgB/T,EAAI,CAChC,IAAIgU,EAAqBhU,EAAG,mBAAoBiU,EAAiBjU,EAAG,eAAgB31B,EAAU21B,EAAG,QAASkU,EAAkBlU,EAAG,gBAC3HmU,EAAOF,EAAiBD,EAC5B,OAAIG,EAAO,EAAI9pC,GAAW,GAAK6pC,EACpB,CAACC,EAAO,EAAGA,EAAO,CAAC,EAGnB,CAACj4C,GAAIi4C,EAAO9pC,EAAS,CAAC,EAAIA,EAASrO,GAAI,EAAGm4C,EAAO9pC,CAAO,CAAC,CAExE,CCLA,IAAI+pC,GAAa,SAAU/jB,EAAMgkB,EAAO,CAC7B,OAAAA,EAAQ,GAAG,OAAOhkB,EAAM,GAAG,EAAE,OAAOgkB,CAAK,EAAIhkB,CACxD,EACIrF,GAAM,KAAK,IAAK9uB,GAAM,KAAK,IAAKo4C,GAAO,KAAK,KAC5CX,GAAQ,OAAO,OAAW,IAC1BY,GAAQZ,GAAQ,GAAQ,SAAS,KAAK,UAAU,QAAQ,EACxDa,GAAoB,SAAUl7C,EAAG,CAAE,OAAOA,IAAM,MAAQ,EACxDm7C,GAAoB,SAAUn7C,EAAG,CAAE,OAAOA,IAAM,MAAQ,EACxDo7C,GAAgB,SAAUC,EAAY,CAAE,OAAOJ,IAASI,EAAW,OAAS,EAC5EC,GAAc,SAAUrhD,EAAO,CAC/BA,EAAM,gBAAgB,EACtBA,EAAM,eAAe,CACzB,EACIshD,GAAc,SAAUzlC,EAAGC,EAAG,CAC1B,IAAA7Z,EAAI4Z,EAAE,EAAIC,EAAE,EACZ5Z,EAAI2Z,EAAE,EAAIC,EAAE,EAChB,OAAOilC,GAAK9+C,EAAIA,EAAIC,EAAIA,CAAC,CAC7B,EACIq/C,GAAiB,SAAUC,EAAcC,EAAY,CACrD,IAAIC,EAAgBJ,GAAYE,EAAa,CAAC,EAAGA,EAAa,CAAC,CAAC,EAC5DG,EAAcL,GAAYG,EAAW,CAAC,EAAGA,EAAW,CAAC,CAAC,EAC1D,OAAOE,EAAcD,CACzB,EACIE,GAAY,SAAUtiD,EAAOuiD,EAAU,CACvC,OAAOviD,EAAQuiD,EAAW,KAAQviD,EAAQuiD,EAAW,GACzD,EACIC,GAAQ,SAAUxe,EAAG,CAAE,MAAO,CAAC,KAAK,IAAIA,EAAI,KAAK,EAAE,EAAI,EAAI,EAAK,EAChEye,GAA4B,SAAUC,EAAO,CAAU,OACvD,EAAGA,EAAM,MACT,EAAGA,EAAM,MACT,EACAC,GAA8B,SAAUC,EAAS,CACjD,OAAO,MAAM,KAAKA,CAAO,EAAE,IAAIH,EAAyB,CAC5D,EACII,GAAM,SAAUtmC,EAAGC,EAAG,CAAE,OAAOD,EAAIC,CAAG,EACtCsmC,GAAe,SAAUC,EAAS,CAAU,OAC5C,EAAGA,EAAQ,IAAI,SAAU5V,EAAI,CACzB,IAAIxqC,EAAIwqC,EAAG,EACJ,OAAAxqC,CACV,GAAE,OAAOkgD,GAAK,CAAC,EAAIE,EAAQ,OAC5B,EAAGA,EAAQ,IAAI,SAAU5V,EAAI,CACzB,IAAIvqC,EAAIuqC,EAAG,EACJ,OAAAvqC,CACV,GAAE,OAAOigD,GAAK,CAAC,EAAIE,EAAQ,OAC5B,EACAC,GAAQ,SAAU35C,EAAKF,EAAKnJ,EAAO,CACnC,OAAOA,EAAQqJ,EAAMA,EAAMrJ,EAAQmJ,EAAMA,EAAMnJ,CACnD,EACIijD,GAAuB,SAAUviD,EAAO,CACjC,QAAEA,EAAM,SAAWA,EAAM,QACpC,EACIwiD,GAAiB,SAAUhiD,EAAS,CACpC,GAAIA,EAAS,CACT,IAAIiiD,EAAcjiD,EAAQ,YAAakiD,EAAeliD,EAAQ,aAE9D,GAAIiiD,GAAeC,EACf,MAAO,CAAE,MAAOD,EAAa,OAAQC,CAAa,EAGlD,IAAA74C,EAAQ,iBAAiBrJ,CAAO,EAChC0E,EAAQ,WAAW2E,EAAM,KAAK,EAC9B5D,EAAS,WAAW4D,EAAM,MAAM,EACpC,GAAI5D,GAAUf,EACH,OAAE,MAAAA,EAAc,OAAAe,EAE/B,CACA,MAAO,CAAE,MAAO,EAAG,OAAQ,CAAE,CACjC,EACI08C,GAAoB,SAAUC,EAAYC,EAAU,CAAU,OAC9D,EAAGA,EAAS,EAAID,EAAW,EAC3B,EAAGC,EAAS,EAAID,EAAW,EAC3B,EACAE,GAAgB,SAAUloB,EAAIC,EAAI,CAAE,OAAOD,EAAG,IAAMC,EAAG,GAAKD,EAAG,IAAMC,EAAG,CAAG,EAC3EkoB,GAAO,UAAY,CAAE,EACrBC,GAAY,CAAE,EAAG,EAAG,EAAG,CAAE,EACzBC,GAA2B,SAAUC,EAAQ,CAC7CC,GAAUF,EAAWC,CAAM,EAC3B,SAASD,GAAY,CACjB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,mBAAqB,KAC3BA,EAAM,mBAAqB,KAC3BA,EAAM,SAAW,EACjBA,EAAM,WAAa,GACnBA,EAAM,eAAiBC,GAAS,CAAC,EAAGL,EAAS,EAC7CI,EAAM,aAAe,KACrBA,EAAM,aAAe,GACrBA,EAAM,cAAgB,GACtBA,EAAM,kBAAoB,KAC1BA,EAAM,WAAa,EACnBA,EAAM,gBAAkB,EACxBA,EAAM,gBAAkB,KACxBA,EAAM,iBAAmB,GACzBA,EAAM,SAAW,EACjBA,EAAM,QAAUC,GAAS,CAAC,EAAGL,EAAS,EACtCI,EAAM,aAAeC,GAAS,CAAC,EAAGL,EAAS,EAC3CI,EAAM,cAAgB,KACtBA,EAAM,cAAgB,GACtBA,EAAM,cAAgB,KACtBA,EAAM,YAAc,EACpBA,EAAM,mBAAqB,EAC3BA,EAAM,eAAiBC,GAAS,CAAC,EAAGL,EAAS,EAE7CI,EAAM,iBAAmB,GAEzBA,EAAM,cAAgBE,KAChBF,EAAA,aAAe,SAAUG,EAAY,CACnCH,EAAM,mBACNA,EAAM,iBAAmB,GACzBG,EAAW,gBAAgB,EAC/B,EAEJH,EAAM,UAAY,UAAY,CACtB,IAAA3W,EACC,GAAAA,EAAK2W,EAAM,iBAAmB,MAAQ3W,IAAO,SAAkBA,EAAG,UACnE2W,EAAM,yBAAyB,EAC/BA,EAAM,cAAc,EACpBA,EAAM,QAAQ,EAClB,EAEJA,EAAM,mBAAqBA,EAAM,iBAAiB,SAAUI,EAAe,CACjEJ,EAAA,SAAWI,EAAc,QAAQ,OACnCJ,EAAM,MAAM,oCACXlC,GAAkBkC,EAAM,YAAY,GAChCnC,GAAkBmC,EAAM,YAAY,IAChCA,EAAM,aAAa,IAAMA,EAAM,QAAQ,GACpCA,EAAM,aAAa,IAAMA,EAAM,QAAQ,KACnD/B,GAAYmC,CAAa,EAEzBvC,GAAkBmC,EAAM,YAAY,GAAK,CAACA,EAAM,iBAChDA,EAAM,aAAaI,CAAa,EAEpCJ,EAAM,mBAAmBI,CAAa,EACzC,EACDJ,EAAM,qBAAuBA,EAAM,iBAAiB,SAAUK,EAAiB,CAC3EL,EAAM,WAAa,GACbA,EAAA,SAAWK,EAAgB,QAAQ,OACzCL,EAAM,iBAAiBK,CAAe,EACzC,EACDL,EAAM,oBAAsBA,EAAM,iBAAiB,SAAUM,EAAgB,CACrEN,EAAM,eAGVA,EAAM,gBAAgBM,CAAc,EAChCN,EAAM,YACNA,EAAM,mBAAmBM,CAAc,EACnCN,EAAM,cACN/B,GAAYqC,CAAc,EAE9BN,EAAM,aAAeC,GAAS,CAAC,EAAGD,EAAM,OAAO,EACzCA,EAAA,cAAgBnB,GAA4ByB,EAAe,OAAO,IAGpExC,GAAkBkC,EAAM,YAAY,EAChCA,EAAM,eACNA,EAAM,cAAc,SAAW,GAC/BM,EAAe,QAAQ,SAAW,GAC5BN,EAAA,YAAYM,EAAgBnC,GAAe6B,EAAM,cAAenB,GAA4ByB,EAAe,OAAO,CAAC,CAAC,EAGzHzC,GAAkBmC,EAAM,YAAY,GACzCA,EAAM,YAAYM,CAAc,EAEhCN,EAAM,eACN/B,GAAYqC,CAAc,EAC1BN,EAAM,QAAQ,IAGtBA,EAAM,WAAa,IACtB,EACKA,EAAA,cAAgB,SAAUhC,EAAY,CACxC,GAAI,CAAAgC,EAAM,MAAM,qBAAqBhC,CAAU,EAG/C,CAAAC,GAAYD,CAAU,EAClB,IAAAuC,EAAQvC,EAAW,MAAOwC,EAAQxC,EAAW,MAAOyC,EAASzC,EAAW,OAAQ0C,EAAY1C,EAAW,UACvG2C,EAAa,GACb5C,GAAcC,CAAU,GAAK0C,IAAc,KAC9BC,EAAA,IAEjB,IAAIC,EAAiB,CACjB,QAAS,CAEL,CAAE,MAAAL,EAAc,MAAAC,CAAa,CACjC,GAEAK,EAASb,EAAM,uBAAuBY,CAAc,EACpDE,EAASL,EAASE,EACtBX,EAAM,eAAe,EACrBA,EAAM,SAASA,EAAM,YAAcc,EAASd,EAAM,MAAM,iBAAkBa,CAAM,EAChFb,EAAM,QAAQ,EACd,aAEAA,EAAM,eACAA,EAAA,cAAgB,WAAW,UAAY,CAAE,OAAOA,EAAM,aAAgB,GAAG,IAGnFA,EAAM,UAAYA,EAAM,MAAM,UACxB,CACE,CAAC,aAAcA,EAAM,oBAAoB,EACzC,CAAC,WAAYA,EAAM,kBAAkB,EACrC,CAAC,YAAaA,EAAM,mBAAmB,GAEzC,CACE,CACI,YACAA,EAAM,SAASA,EAAM,mBAAmB,EACxCA,EAAM,MAAM,SAChB,EACA,CACI,UACAA,EAAM,SAASA,EAAM,kBAAkB,EACvCA,EAAM,MAAM,SAChB,EACA,CAAC,YAAaA,EAAM,SAASA,EAAM,oBAAoB,CAAC,EACxD,CAAC,QAASA,EAAM,YAAY,EAC5B,CAAC,QAASA,EAAM,aAAa,GAE9BA,CACX,CACAH,SAAU,UAAU,iBAAmB,SAAUjjD,EAAO,CACpD,KAAK,iBAAmB,GACxB,KAAK,MAAM,cACX,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,kBAAoB,KACzB,KAAK,gBAAkB,GACvB,KAAK,eAAiB,KAAK,QAC3B,KAAK,YAAYA,CAAK,GAE1BijD,EAAU,UAAU,YAAc,SAAUjjD,EAAO,CAC3C,IAAAgiD,EAAQ,KAAK,uBAAuBhiD,CAAK,EACzC,KAAK,gBACA,WAAMgiD,EAAO,KAAK,iBAAiB,EAGnC,kBAAaA,EAAO,KAAK,iBAAiB,EAEnD,KAAK,QAAU,KAAK,gBAAgB,KAAK,OAAO,EAChD,KAAK,kBAAoBA,CAAA,EAE7BiB,EAAU,UAAU,cAAgB,UAAY,CAC5C,KAAK,UAAY,KACjB,KAAK,mBAAqB,MAE9BA,EAAU,UAAU,gBAAkB,UAAY,CAC9C,IAAIG,EAAQ,KACR3W,EAAK,KAAK,MAAO0X,EAAkB1X,EAAG,gBAAiB2X,EAAU3X,EAAG,QACxE,GAAI,GAAC2X,GAAW,CAAC,KAAK,WAGtB,KAAItc,EAAK,KAAK,UAAW7lC,EAAI6lC,EAAG,EAAG5lC,EAAI4lC,EAAG,EAC1C,GAAI7lC,GAAKC,EAAG,CACR,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,IAAImiD,EAAc,UAAY,CAGtB,GAFCpiD,GAAAkiD,EACAjiD,GAAAiiD,EACD,CAACliD,GAAK,CAACC,EACP,OAAOkhD,EAAM,iBAEjB,IAAIkB,EAAajB,GAAS,CAAC,EAAGD,EAAM,OAAO,EAG3C,GAFAA,EAAM,WAAW,CAAE,EAAAnhD,EAAM,EAAAC,CAAM,GAC/BkhD,EAAM,QAAUA,EAAM,gBAAgBA,EAAM,OAAO,EAC/CN,GAAcwB,EAAYlB,EAAM,OAAO,EACvC,OAAOA,EAAM,iBAEjBA,EAAM,QAAQ,CAAE,YAAa,EAAM,IAEvC,KAAK,SAASiB,EAAa,CAAE,SAAU,IAAM,EACjD,IAEJpB,EAAU,UAAU,gBAAkB,SAAUxW,EAAI,CAChD,IAAIyV,EAAUzV,EAAG,QACb,GAAC,KAAK,MAAM,QAGhB,KAAI8X,EAAqBtC,GAA4BC,CAAO,EAAE,CAAC,EAC3DsC,EAAY,KAAK,mBACjBA,IACK,eAAY7B,GAAkB4B,EAAoBC,CAAS,GAEpE,KAAK,mBAAqBD,EAAA,EAE9BtB,EAAU,UAAU,eAAiB,UAAY,CAC7C,KAAK,MAAM,YACX,KAAK,KAAK,EACV,KAAK,gBAAgB,GAEzBA,EAAU,UAAU,iBAAmB,UAAY,CAC/C,KAAK,MAAM,cACX,KAAK,eAAe,EACpB,KAAK,WAAa,EAClB,KAAK,SAAW,EAChB,KAAK,gBAAkB,KACvB,KAAK,gBAAkB,IAE3BA,EAAU,UAAU,YAAc,SAAUjjD,EAAOykD,EAAU,CACzD,IAAIC,EAActC,GAAa,KAAK,kBAAkBpiD,CAAK,CAAC,EACxDugD,EAAQkE,EAAW,KAAK,WAC5B,KAAK,WAAaA,EAElB,KAAK,UAAY,EACb,KAAK,SAAW,IACX,YAAOlE,EAAOmE,CAAW,EACzB,WAAMA,EAAa,KAAK,eAAe,EACxC,KAAK,MAAM,0BACX,KAAK,QAAU,KAAK,gBAAgB,KAAK,OAAO,IAGxD,KAAK,gBAAkBA,CAAA,EAE3BzB,EAAU,UAAU,eAAiB,UAAY,CAC7C,KAAK,MAAM,YACX,KAAK,KAAK,GAEdA,EAAU,UAAU,iBAAmB,SAAUjjD,EAAO,CACpD,IAAIojD,EAAQ,KACZ,GAAI,OAAK,iBAAmB,KAAK,MAAM,gBAAkB,GAGzD,KAAIuB,EAAe,KAAK,MAAM,4BAC1B,KAAK,cAAgB,KAAK,MAAM,SAC/B,KAAK,MAAM,qBAAuB,KAAK,YAAc,EAC1D,KAAK,MAAM,cACX,KAAK,iBAAmB,GACxB,IAAIC,EAAa,KAAK,YAAc,KAAK,MAAM,cAC3CC,EAAkB,KAAK,YACvBC,EAAiB,SAAUC,EAAU,CACrC3B,EAAM,SAASyB,EAAkBE,GAAYH,EAAaC,GAAkBZ,CAAM,GAElFA,EAAS,KAAK,uBAAuBjkD,CAAK,EAC9C,KAAK,aAAe,GAChB6kD,EAAkBD,IAClBX,EAAS,KAAK,yBAElBU,EAAc,KAAK,oBAAsB,KAAK,SAASG,CAAc,IAEzE7B,EAAU,UAAU,sBAAwB,UAAY,CAChD,IAAA5mC,EAAO,KAAK,oBACZowB,EAAK,KAAK,gBAAiBvnC,EAAQunC,EAAG,MAAOxmC,EAASwmC,EAAG,OACzDxqC,EAAI,CAACw1B,GAAIvyB,EAAQ,KAAK,sBAAsB,EAAImX,EAAK,KAAK,EAAI,EAC9Dna,EAAI,CAACu1B,GAAIxxB,EAAS,KAAK,sBAAsB,EAAIoW,EAAK,MAAM,EAAI,EAC/D,oBAAiB,CAAE,EAAApa,EAAM,EAAAC,CAAK,GAEvC+gD,EAAU,UAAU,aAAe,UAAY,CAC3C,KAAK,QAAUI,GAAS,CAAC,EAAG,KAAK,cAAc,GAEnDJ,EAAU,UAAU,cAAgB,UAAY,CACxC,KAAK,MAAM,gBAAkB,KAAK,gBAGtC,KAAK,cAAgB,GACrB,KAAK,sBAAsB,EAC3B,KAAK,aAAa,IAEtBA,EAAU,UAAU,gBAAkB,SAAU/8C,EAAQ,CAChD,IAAAmW,EAAO,KAAK,oBACZowB,EAAK,KAAK,gBAAiBvnC,EAAQunC,EAAG,MAAOxmC,EAASwmC,EAAG,OACzDuY,EAAU9/C,EAAQ,KAAK,wBAA0B,KAAK,YACtD+/C,EAAWh/C,EAAS,KAAK,wBAA0B,KAAK,YACxD6hC,EAAK0Y,GAAgB,CACrB,mBAAoBnkC,EAAK,MACzB,eAAgB2oC,EAChB,QAAS,KAAK,MAAM,kBACpB,gBAAiB,KAAK,MAAM,gBAC/B,EAAGE,EAAapd,EAAG,CAAC,EAAGqd,EAAard,EAAG,CAAC,EACrCsd,EAAK5E,GAAgB,CACrB,mBAAoBnkC,EAAK,OACzB,eAAgB4oC,EAChB,QAAS,KAAK,MAAM,gBACpB,gBAAiB,KAAK,MAAM,gBAC/B,EAAGI,EAAaD,EAAG,CAAC,EAAGE,EAAaF,EAAG,CAAC,EAClC,OACH,EAAG9C,GAAM4C,EAAYC,EAAYj/C,EAAO,CAAC,EACzC,EAAGo8C,GAAM+C,EAAYC,EAAYp/C,EAAO,CAAC,EAC7C,EAEJ+8C,EAAU,UAAU,YAAc,SAAUlgD,EAAS,CACjD,IAAIqgD,EAAQ,KACR3W,EAAK4W,GAAS,CAAE,SAAU,IAAK,SAAU,IAAQtgD,CAAO,EAAGwiD,EAAM9Y,EAAG,EAAG+Y,EAAM/Y,EAAG,EAAG8T,EAAQ9T,EAAG,MAAOgZ,EAAWhZ,EAAG,SAAUzE,EAAWyE,EAAG,SAE3IxqC,EAAIsjD,EAAM,KAAK,mBACfrjD,EAAIsjD,EAAM,KAAK,mBACfX,EAAkB,KAAK,YACvBa,EAAcrC,GAAS,CAAC,EAAG,KAAK,OAAO,EACvChnC,EAAO,KAAK,oBACZspC,EAAkB,CAAE,EAAGtpC,EAAK,MAAQ,EAAG,EAAGA,EAAK,OAAS,GAK5D,GAJA,KAAK,YAAc,EACd,aAAU,CAAE,EAAG,EAAEspC,EAAgB,EAAI1jD,GAAI,EAAG,EAAE0jD,EAAgB,EAAIzjD,EAAG,EACrE,cAASq+C,EAAOoF,CAAe,EACpC,KAAK,eAAe,EAChB,CAACF,EACD,OAAO,KAAK,UAEZ,IAAAG,EAAiB,KAAK,YAAcf,EACpCgB,EAAa,CACb,EAAG,KAAK,QAAQ,EAAIH,EAAY,EAChC,EAAG,KAAK,QAAQ,EAAIA,EAAY,GAEpC,KAAK,YAAcb,EACnB,KAAK,QAAUxB,GAAS,CAAC,EAAGqC,CAAW,EACnC,IAAAI,EAAc,SAAUf,EAAU,CAClC,IAAI9iD,EAAIyjD,EAAY,EAAIG,EAAW,EAAId,EACnC7iD,EAAIwjD,EAAY,EAAIG,EAAW,EAAId,EACjC3B,EAAA,YAAcyB,EAAkBe,EAAiBb,EACjD3B,EAAA,QAAUA,EAAM,gBAAgB,CAAE,EAAGnhD,EAAG,EAAGC,EAAG,EACpDkhD,EAAM,QAAQ,GAElB,KAAK,SAAS0C,EAAa,CACvB,SAAU,UAAY,CAAE,OAAO1C,EAAM,WAAa,EAClD,SAAApb,CAAA,CACH,GAELib,EAAU,UAAU,QAAU,SAAUlgD,EAAS,CAC7C,IAAIqgD,EAAQ,KACR3W,EAAK4W,GAAS,CAAE,SAAU,IAAK,SAAU,IAAQtgD,CAAO,EAAGd,EAAIwqC,EAAG,EAAGvqC,EAAIuqC,EAAG,EAAG8T,EAAQ9T,EAAG,MAAOgZ,EAAWhZ,EAAG,SAAUzE,EAAWyE,EAAG,SACvIoY,EAAkB,KAAK,YACvBa,EAAcrC,GAAS,CAAC,EAAG,KAAK,OAAO,EAK3C,GAJA,KAAK,YAAc,EACnB,KAAK,QAAU,CAAE,EAAG,EAAG,EAAG,GAC1B,KAAK,SAAS9C,EAAO,CAAE,EAAAt+C,EAAM,EAAAC,CAAM,GACnC,KAAK,eAAe,EAChB,CAACujD,EACD,OAAO,KAAK,UAEZ,IAAAG,EAAiB,KAAK,YAAcf,EACpCgB,EAAa,CACb,EAAG,KAAK,QAAQ,EAAIH,EAAY,EAChC,EAAG,KAAK,QAAQ,EAAIA,EAAY,GAEpC,KAAK,YAAcb,EACnB,KAAK,QAAUxB,GAAS,CAAC,EAAGqC,CAAW,EACnC,IAAAI,EAAc,SAAUf,EAAU,CAClC,IAAI9iD,EAAIyjD,EAAY,EAAIG,EAAW,EAAId,EACnC7iD,EAAIwjD,EAAY,EAAIG,EAAW,EAAId,EACjC3B,EAAA,YAAcyB,EAAkBe,EAAiBb,EACvD3B,EAAM,QAAU,CAAE,EAAGnhD,EAAG,EAAGC,GAC3BkhD,EAAM,QAAQ,GAElB,KAAK,SAAS0C,EAAa,CAAE,SAAU,UAAY,CAAE,OAAO1C,EAAM,WAAU,EAAM,SAAApb,CAAoB,IAE1Gib,EAAU,UAAU,SAAW,SAAU2B,EAAYX,EAAQ,CACzD,KAAK,OAAOW,EAAa,KAAK,YAAaX,CAAM,EACjD,KAAK,QAAU,KAAK,gBAAgB,KAAK,OAAO,GAEpDhB,EAAU,UAAU,OAAS,SAAU1C,EAAO0D,EAAQ,CAC1C1D,EAAA,KAAK,iBAAiBA,CAAK,EACnC,KAAK,WAAW,CACZ,GAAIA,EAAQ,IAAM0D,EAAO,EAAI,KAAK,QAAQ,GAC1C,GAAI1D,EAAQ,IAAM0D,EAAO,EAAI,KAAK,QAAQ,GAC7C,EACD,KAAK,MAAM,cAAa,EAE5BhB,EAAU,UAAU,iBAAmB,SAAU1C,EAAO,CACpD,IAAIwF,EAAqB,KAAK,YAC9B,YAAK,aAAexF,EACf,iBAAc+B,GAAM,KAAK,MAAM,QAAS,KAAK,MAAM,QAAS,KAAK,WAAW,EAC1E,KAAK,YAAcyD,CAAA,EAE9B9C,EAAU,UAAU,SAAW,UAAY,CACvC,OAAO,KAAK,MAAM,mBAAqB,CAACrB,GAAU,KAAK,YAAa,CAAC,GAEzEqB,EAAU,UAAU,MAAQ,SAAUgB,EAAQ+B,EAAY,CACtD,GAAIA,EAAY,CACZ,IAAI9jD,EAAI,EAAE+hD,EAAO,EAAI+B,EAAW,GAC5B/jD,EAAI,EAAEgiD,EAAO,EAAI+B,EAAW,GAC3B,KAAK,MAAM,aAQRvuB,GAAIx1B,CAAC,EAAIw1B,GAAIv1B,CAAC,EACd,KAAK,WAAW,CACZ,EAAAD,EACA,EAAG,EACN,EAGD,KAAK,WAAW,CACZ,EAAAC,EACA,EAAG,EACN,EAjBL,KAAK,WAAW,CACZ,EAAAD,EACA,EAAAC,CAAA,CACH,EAiBL,KAAK,MAAM,cACf,GAEJ+gD,EAAU,UAAU,aAAe,SAAUgB,EAAQ+B,EAAY,CAC7D,GAAIA,EAAY,CACZ,IAAI9jD,EAAI,EAAE+hD,EAAO,EAAI+B,EAAW,GAC5B/jD,EAAI,EAAEgiD,EAAO,EAAI+B,EAAW,GAChC,KAAK,eAAiB,CAClB,EAAG/jD,EAAI,KAAK,eAAe,EAC3B,EAAGC,EAAI,KAAK,eAAe,EAEnC,GAEJ+gD,EAAU,UAAU,WAAa,SAAU/8C,EAAQ,CAC/C,IAAIumC,EAAK,KAAK,QAASxqC,EAAIwqC,EAAG,EAAGvqC,EAAIuqC,EAAG,EACxC,KAAK,QAAU,CACX,EAAGxqC,EAAIiE,EAAO,EACd,EAAGhE,EAAIgE,EAAO,EAClB,EAEJ+8C,EAAU,UAAU,UAAY,UAAY,CACpC,KAAK,YAAc,KAAK,MAAM,eAC9B,KAAK,cAAc,EACnB,KAAK,kBAAkB,GAElB,KAAK,mBACV,KAAK,yBAAyB,CAClC,EAEJA,EAAU,UAAU,gBAAkB,UAAY,CAC9C,IAAI/8C,EAAS,KAAK,QACd+/C,EAAkB,KAAK,gBAAgB//C,CAAM,EACjD,OAAO+/C,EAAgB,IAAM//C,EAAO,GAAK+/C,EAAgB,IAAM//C,EAAO,GAE1E+8C,EAAU,UAAU,yBAA2B,UAAY,CACvD,IAAIG,EAAQ,KACR8C,EAAe,KAAK,gBAAgB,KAAK,OAAO,EAChDR,EAAcrC,GAAS,CAAC,EAAG,KAAK,OAAO,EACvCyB,EAAiB,SAAUC,EAAU,CACrC,IAAI9iD,EAAIyjD,EAAY,EAAIX,GAAYmB,EAAa,EAAIR,EAAY,GAC7DxjD,EAAIwjD,EAAY,EAAIX,GAAYmB,EAAa,EAAIR,EAAY,GAC3DtC,EAAA,QAAU,CAAE,EAAAnhD,EAAM,EAAAC,CAAK,EAC7BkhD,EAAM,QAAQ,GAElB,KAAK,SAAS0B,CAAc,GAEhC7B,EAAU,UAAU,kBAAoB,UAAY,CAChD,IAAIG,EAAQ,KACR,QAAK,cAAgB,EAGzB,KAAIyB,EAAkB,KAAK,YACvBD,EAAa,EACbX,EAAS,KAAK,wBACda,EAAiB,SAAUC,EAAU,CACjC,IAAAoB,EAActB,EAAkBE,GAAYH,EAAaC,GACvDzB,EAAA,SAAS+C,EAAalC,CAAM,GAEtC,KAAK,SAASa,CAAc,IAEhC7B,EAAU,UAAU,sBAAwB,UAAY,CACpD,OAAO,KAAK,oBAEhBA,EAAU,UAAU,sBAAwB,UAAY,CACpD,IAAIxW,EAAK,KAAK,QAASxqC,EAAIwqC,EAAG,EAAGvqC,EAAIuqC,EAAG,EACpC2Z,EAAankD,EAAI,KAAK,eAAe,EACrCokD,EAAYnkD,EAAI,KAAK,eAAe,EACjC,OACH,EAAG,GAAKD,EAAImkD,GAAc,EAAI,KAAK,YAAc,GACjD,EAAG,GAAKlkD,EAAImkD,GAAa,EAAI,KAAK,YAAc,GACpD,EAEJpD,EAAU,UAAU,uBAAyB,SAAUjjD,EAAO,CAC1D,OAAO,KAAK,kBAAkBA,CAAK,EAAE,CAAC,GAE1CijD,EAAU,UAAU,kBAAoB,SAAUjjD,EAAO,CACjD,IAAAsmD,EAAY,KAAK,MAAM,UACvBC,EAAQD,EAAU,gBAClBE,EAAQF,EAAU,KAClB7Z,EAAK,KAAK,oBAAqB/jC,EAAM+jC,EAAG,IAAKlkC,EAAOkkC,EAAG,KACvDga,EAAYF,EAAM,WAAaC,EAAM,UACrCE,EAAaH,EAAM,YAAcC,EAAM,WACvCG,EAASj+C,EAAM+9C,EACfG,EAAUr+C,EAAOm+C,EACrB,OAAOzE,GAA4BjiD,EAAM,OAAO,EAAE,IAAI,SAAUysC,EAAI,CAChE,IAAIxqC,EAAIwqC,EAAG,EAAGvqC,EAAIuqC,EAAG,EACb,OACJ,EAAGxqC,EAAI2kD,EACP,EAAG1kD,EAAIykD,CAAA,CACX,CACH,GAEL1D,EAAU,UAAU,SAAW,SAAU4D,EAAS9jD,EAAS,CACvD,IAAIqgD,EAAQ,KACR0D,EAAY,IAAI,KAAK,EAAE,QAAQ,EAC/Bra,EAAK4W,GAAS,CAAE,OAAQvB,GAAO,SAAU,UAAY,GAAK,SAAU,KAAK,MAAM,iBAAqB,EAAA/+C,CAAO,EAAGgkD,EAASta,EAAG,OAAQ3pC,EAAW2pC,EAAG,SAAUzE,EAAWyE,EAAG,SACxK4X,EAAc,UAAY,CACtB,GAACjB,EAAM,aAGX,KAAI4D,EAAY,IAAI,KAAK,EAAE,UAAYF,EACnC/B,EAAWiC,EAAYhf,EACvBgf,GAAahf,GACb6e,EAAQ,CAAC,EACTzD,EAAM,eAAe,EACZtgD,IACTsgD,EAAM,QAAQ,IAGd2B,EAAWgC,EAAOhC,CAAQ,EAC1B8B,EAAQ9B,CAAQ,EAChB3B,EAAM,QAAQ,CAAE,YAAa,EAAM,GACnC,sBAAsBiB,CAAW,GACrC,EAEJ,KAAK,aAAe,GACpB,sBAAsBA,CAAW,GAErCpB,EAAU,UAAU,eAAiB,UAAY,CAC7C,KAAK,aAAe,IAExBA,EAAU,UAAU,KAAO,UAAY,CACnC,KAAK,gBAAkB,GACvB,KAAK,UAAU,EACf,KAAK,QAAQ,GAEjBA,EAAU,UAAU,kBAAoB,UAAY,CAC5C,IAAAtc,EAAM,KAAK,cAAc,QAC7B,OAAOA,EAAI,uBAAsB,EAErCsc,EAAU,UAAU,cAAgB,UAAY,CACxC,IAAAtc,EAAM,KAAK,cAAc,QAC7B,OAAO6b,GAAe7b,GAAQ,KAAyB,OAASA,EAAI,iBAAiB,GAEzFsc,EAAU,UAAU,yBAA2B,UAAY,CACnD,IAAA5mC,EAAO,KAAK,oBACZ1K,EAAO,KAAK,gBACZs1C,EAAc5qC,EAAK,MAAQ1K,EAAK,MAChCu1C,EAAc7qC,EAAK,OAAS1K,EAAK,OAChC,wBAAqBhJ,GAAIs+C,EAAaC,CAAW,GAE1DjE,EAAU,UAAU,YAAc,UAAY,CAC1C,IAAIG,EAAQ,KACRzc,EAAM,KAAK,cAAc,QACzB,OAAO,gBACP,KAAK,mBAAqB,IAAI,eAAe,KAAK,SAAS,EACtD,wBAAmB,QAAQA,CAAG,GAG5B,wBAAiB,SAAU,KAAK,SAAS,EAE/C,eAAU,QAAQ,SAAU8F,EAAI,CAC7B,IAAA0a,EAAY1a,EAAG,CAAC,EAAGplC,EAAKolC,EAAG,CAAC,EAAGvsC,EAASusC,EAAG,CAAC,GAC/CvsC,GAAUymC,GAAK,iBAAiBwgB,EAAW9/C,EAAI,EAAI,EACvD,EACK,WAAKs/B,EAAI,iBAAiB,KAAK,CAAC,EAAE,QAAQ,SAAUhC,EAAK,CAC3D,OAAOA,EAAI,iBAAiB,OAAQye,EAAM,SAAS,EACtD,GAELH,EAAU,UAAU,aAAe,UAAY,CAC3C,IAAIG,EAAQ,KACRzc,EAAM,KAAK,cAAc,QACzB,KAAK,qBACL,KAAK,mBAAmB,aACxB,KAAK,mBAAqB,MAEvB,2BAAoB,SAAU,KAAK,SAAS,EAC9C,eAAU,QAAQ,SAAU8F,EAAI,CAC7B,IAAA0a,EAAY1a,EAAG,CAAC,EAAGplC,EAAKolC,EAAG,CAAC,EAAGvsC,EAASusC,EAAG,CAAC,GAC/CvsC,GAAUymC,GAAK,oBAAoBwgB,EAAW9/C,EAAI,EAAI,EAC1D,EACK,WAAKs/B,EAAI,iBAAiB,KAAK,CAAC,EAAE,QAAQ,SAAUhC,EAAK,CAC3D,OAAOA,EAAI,oBAAoB,OAAQye,EAAM,SAAS,EACzD,GAELH,EAAU,UAAU,QAAU,SAAUlgD,EAAS,CAC7C,IAAIqgD,EAAQ,KACZ,GAAI,MAAK,cAGT,KAAI0C,EAAc,UAAY,CAC1B,IAAIvF,EAAQ6C,EAAM,sBAAsB,EAAIA,EAAM,YAC9CnhD,EAAI,CAACmhD,EAAM,QAAQ,EAAI7C,EACvBr+C,EAAI,CAACkhD,EAAM,QAAQ,EAAI7C,EAC3B6C,EAAM,MAAM,SAAS,CAAE,MAAA7C,EAAc,EAAAt+C,EAAM,EAAAC,EAAM,GAErD,GAAIa,GAAY,MAAsCA,EAAQ,YAC1D,OAAO+iD,EAAY,EAEvB,KAAK,cAAgB,GACrB,sBAAsB,UAAY,CAC9B1C,EAAM,cAAgB,GACV0C,GAAA,CACf,IAEL7C,EAAU,UAAU,iBAAmB,SAAU57C,EAAI,CACjD,IAAI+7C,EAAQ,KACZ,OAAO,UAAY,CAEf,QADIv5B,EAAO,GACFu9B,EAAK,EAAGA,EAAK,UAAU,OAAQA,IAC/Bv9B,EAAAu9B,CAAE,EAAI,UAAUA,CAAE,EAEvBhE,EAAM,MAAM,SACT/7C,EAAA,MAAM,OAAQwiB,CAAI,CACzB,CACJ,EAEJo5B,EAAU,UAAU,gBAAkB,SAAUoE,EAAgBrnD,EAAO,CACnE,IAAIsnD,EAAc,KAAK,aACnBA,IAAgBD,IACZC,GAAe,CAACD,IACZnG,GAAkBoG,CAAW,EAC7B,KAAK,eAAe,EAEfrG,GAAkBqG,CAAW,GAClC,KAAK,eAAe,GAGxBpG,GAAkBmG,CAAc,EAChC,KAAK,iBAAiB,EAEjBpG,GAAkBoG,CAAc,GACrC,KAAK,iBAAiBrnD,CAAK,GAGnC,KAAK,aAAeqnD,CAAA,EAExBpE,EAAU,UAAU,wBAA0B,SAAUpnC,EAAGC,EAAG,CAC1D,OAAOD,EAAIC,EAAID,EAAIC,EAAIA,EAAID,CAAA,EAE/BonC,EAAU,UAAU,cAAgB,UAAY,CAC5C,OAAI,KAAK,wBAAwB,KAAK,aAAa,EAAG,KAAK,eAAe,CAAC,EACvE,GACA,KAAK,wBAAwB,KAAK,aAAa,EAAG,KAAK,eAAe,CAAC,EACnE,CAED,EAEXA,EAAU,UAAU,mBAAqB,SAAUjjD,EAAO,CACtD,IAAIunD,EAAU,KAAK,SACnB,GAAIA,IAAY,EACL,YAAK,gBAAgB,OAAQvnD,CAAK,EAE7C,GAAIunD,IAAY,GAAK,KAAK,WACf,YAAK,gBAAgB,OAAQvnD,CAAK,EAExC,qBAAgB,KAAMA,CAAK,GAEpCijD,EAAU,UAAU,iBAAmB,SAAUjjD,EAAO,CACpD,IAAIuO,EAAO,IAAI,KAAK,EAAE,QAAQ,EAC1B,KAAK,SAAW,IAChB,KAAK,gBAAkB,GAEvBA,EAAO,KAAK,gBAAkB,KAC9B8yC,GAAYrhD,CAAK,EACjB,KAAK,iBAAiBA,CAAK,EACvBkhD,GAAkB,KAAK,YAAY,EACnC,KAAK,eAAe,EAEfD,GAAkB,KAAK,YAAY,GACxC,KAAK,eAAe,GAIxB,KAAK,aAAe,GAEpB,KAAK,WAAa,IAClB,KAAK,gBAAkB1yC,EAC3B,EAEJ00C,EAAU,UAAU,SAAW,SAAU57C,EAAI,CACzC,IAAI+7C,EAAQ,KACZ,OAAO,SAAUoE,EAAY,CACzB,IAAI7D,EAAQ6D,EAAW,MAAO5D,EAAQ4D,EAAW,MAAO18B,EAAO08B,EAAW,KACtEC,EAAQ38B,IAAS,UACjB48B,EAAU58B,IAAS,YACnB48B,IACAF,EAAW,eAAe,EAC1BpE,EAAM,iBAAmB,IAEzBA,EAAM,mBAEKoE,EAAA,QAAUC,EAAQ,GAAK,CAAC,CAAE,MAAA9D,EAAc,MAAAC,EAAc,EACjEv8C,EAEAmgD,CAAA,GAEAC,IACArE,EAAM,iBAAmB,GAC7B,CACJ,EAEJH,EAAU,UAAU,kBAAoB,UAAY,CAChD,KAAK,YAAY,EACjB,KAAK,QAAQ,GAEjBA,EAAU,UAAU,qBAAuB,UAAY,CACnD,KAAK,eAAe,EACpB,KAAK,aAAa,GAEtBA,EAAU,UAAU,OAAS,UAAY,CACrC,IAAIxW,EAAK,KAAK,MAAO15B,EAAW05B,EAAG,SAAUvyB,EAAiBuyB,EAAG,eAC7Dkb,EAAQC,GAAS,KAAK70C,CAAQ,EAC9BtM,EAAQyT,GAAkB,GAC9B,OAAQ2tC,GAAM,cAAcA,GAAM,SAAU,KACxCA,GAAM,cAAc,QAAS,KAAM1H,EAAM,EACzC0H,GAAM,cAAc,MAAOxE,GAAS,GAAI58C,EAAO,CAAE,IAAK,KAAK,cAAe,UAAWo6C,GAAWZ,GAAWx5C,EAAM,SAAS,EAAG,EAAG4hB,GAAas/B,EAAO,CAChJ,UAAW9G,GAAWX,GAAYyH,EAAM,MAAM,SAAS,EAC1D,CAAC,EAAC,EAEX1E,EAAU,aAAe,CACrB,kBAAmB,IACnB,kBAAmB,GACnB,wBAAyB,GACzB,gBAAiB,GACjB,QAAS,GACT,QAAS,GACT,gBAAiB,IACjB,kBAAmB,EACnB,QAAA5C,GACA,aAAc,GACd,QAAS,EACT,QAAS,GACT,YAAa0C,GACb,UAAWA,GACX,YAAaA,GACb,aAAcA,GACd,UAAWA,GACX,YAAaA,GACb,aAAcA,GACd,eAAgB,GAChB,qBAAAR,GACA,kCAAmC,GACnC,cAAe,EACf,gBAAiB,EACjB,iBAAkB,KAClB,cAAe,IACf,2BAA4B,GAC5B,oBAAqB,GAErB,UAAWnC,GAAQ,KAAO,OAAO,UAE9B6C,GACTv6B,EAAS,EACX,GAAI,EACI,IAAA+jB,GAA4Bqb,GAActnD,GAAsBsX,GAAoBE,GAAoBJ,GAAgBG,GCr0BjH,SAASgwC,GAAex5C,EAAM,CAC3C,GAAI,CAACA,EAAM,OACX,IAAIy5C,EAAQx/C,KAAKmvB,MAAMppB,EAAO,IAAI,EAC9B05C,EAAUz/C,KAAKmvB,MAAOppB,EAAO,KAAQ,EAAE,EACvC+oB,EAAU9uB,KAAKyG,MAAMV,EAAO,EAAE,EAElC,OAAIy5C,IAAU,EACL,GAAGC,CAAO,IAAI3wB,EAAQ4wB,WAAWC,SAAS,EAAG,GAAG,CAAC,GAEjD,GAAGH,CAAK,IAAIC,EAAQC,SAAU,EAACC,SAAS,EAAG,GAAG,CAAC,IAAI7wB,EACvD4wB,SAAU,EACVC,SAAS,EAAG,GAAG,CAAC,EAEvB,CCOA,MAAM9+C,GAAW,iCAAiCC,KAAKC,UAAUC,SAAS,EAYpE4+C,GAAe,MACfC,GAAsB5hD,GAAA,CACpB,MAAE1F,MAAK81B,OAAMvb,QAAO,GAAGzU,CAASJ,IACtC,MAAI,CAAC1F,GAAO,CAACA,EAAIutB,OAAe,KAE9B6D,EAAA,UACErH,KAAK,SACLjZ,MAAM,sBAAqB,GACvBhL,EACJF,QAAgB3I,GAAA,CACdA,EAAEyE,gBAAgB,EAClBzE,EAAE0B,eAAe,EACjB61B,EAAO+yB,aAAe,CACpBvnD,MACA81B,OAEJ,EACAjlB,MAAKzI,EAAAC,EAAE,CAAA1B,GAAA,QAAmB,CAAC,EAACqL,UAE3Bq1C,GACA,CAAC,CAAC9sC,GAASzK,EAAA,OAAAkC,SAAMuI,EAAW,CAAC,EACxB,CAEZ,EAEMitC,GAAsB,IACtBC,GAA6B,IACtBC,GAAqBz6B,GAChC06B,cAASr3C,OACLq3C,EAAQr3C,OAASk3C,IACjB,iBAAiBj/C,KAAKo/C,EAAQp6B,KAAM,GACpC,EACN,EAEA,SAASq6B,GAAM,CACb92C,MAAO9K,EAAY,GACnB2I,QACA6e,KACAsI,OACA+xB,eACAC,cACAC,cACAC,qBACAC,WACAC,mBAAmB,GACnBtiD,UAAUA,IAAM,CAAC,CACnB,EAAG,CACG,IACFuiD,WACApqD,cACAkC,OACAmoD,mBACAC,aACAC,YACArhD,MACA8iB,MACEpb,IACA,iBAAiBpG,KAAK8/C,CAAU,IACrBA,EAAA,MAET,MAAE1d,WAAW,CAAC,EAAG4d,QAAOr/C,SAAUjJ,GAAQ,GAE1CkE,EAAQ0jD,EACVld,iBAAUxmC,OACVokD,iBAAOpkD,SAASwmC,iBAAUxmC,OACxBe,EAAS2iD,EACXld,iBAAUzlC,QACVqjD,iBAAOrjD,UAAUylC,iBAAUzlC,QACzBsjD,EAAWX,EAAe5gD,EAAMohD,GAAcphD,EAC9CwhD,EAAiBZ,EACnBS,EACAF,GAAoBE,EAClBI,EAAgBvkD,GAASe,EACzByjD,EAAcD,EAChBvkD,EAAQe,EACN,YACA,WACF,KAEE0jD,EAAkBT,EAAW5S,GAAwB4S,CAAQ,EAAI,KAEjEU,EAAWpnD,IAEbqnD,MACJ,GAAI5/C,EAAO,CAMT,MAAMhI,GAAMgI,EAAMhI,EAAI,GAAK,EAAK,IAC1BC,IAAM,EAAI+H,EAAM/H,GAAK,EAAK,IAChB2nD,EAAA,GAAG5nD,EAAE6nD,QAAQ,CAAC,CAAC,KAAK5nD,GAAE4nD,QAAQ,CAAC,CAAC,GAClD,CAEA,MAAMC,GAAWvnD,IACXwnD,EAAWvmD,GAAY,CAAC,CAAExB,IAAGC,KAAGq+C,WAAY,CAC1C,MAAE94C,QAASiI,CAAUq6C,KAE3B,GAAIr6C,EAAO,CACT,MAAMpQ,EAAQghD,GAAqB,CAAEr+C,IAAGC,KAAGq+C,QAAO,EAE9CA,IAAU,EACZ7wC,EAAM7F,MAAMogD,eAAe,WAAW,EAEtCv6C,EAAM7F,MAAMk7B,YAAY,YAAazlC,CAAK,EAG5CoQ,EAAM2f,QAAQ,aAAa,EAAExlB,MAAMqgD,YACjC3J,GAAS,KAAO,QAAU,EAC9B,CACF,EAAG,CAAE,GAEC,CAAC4J,GAAkBC,CAAmB,EAAIlnD,EAAS,EAAK,EACxDmnD,GAAsB,CAC1BzqD,QAASuqD,GACTG,kBAAmB,GACnBnG,gBAAiB,GACjBoG,cAAe,EACfC,oBAAqB,GACrBtwC,eAAgB,CACdnT,UAAW,aACX8C,MAAO,CACLoN,SAAU,SAMZ,CACF,EACA+yC,YAGIS,GAASnyC,GACb,IAAOiW,EAAM9nB,GAAUoK,EAACod,GAAI,CAACM,KAAO,GAAK9nB,CAAQ,GAAI,MACrD,CAAC8nB,CAAE,CACL,EAEMm8B,GAAoBlB,EAAiBmB,GAAUnB,CAAc,EAAI,KACjEoB,EACJ9/B,IAAS,WACT4/B,IACA,6BAA6BphD,KAAKohD,GAAkBz7B,QAAQ,EACxD47B,GACJ//B,IAAS,WACT4/B,IACA,gCAAgCphD,KAAKohD,GAAkBz7B,QAAQ,EAC3D67B,GACJhgC,IAAS,SACRA,IAAS,WAAas+B,GAAc,CAACwB,GAAgB,CAACC,GAEnDE,GAAYvoD,IACZ,CAACwoD,GAAwBC,EAAyB,EAAI/nD,EAAS,EAAK,EAC1EP,GAAgB,IAAM,CAGhB,GAFA,CAACmoD,IACD,CAAClC,GACD,CAACmC,GAAUtjD,QAAS,OAClB,MAAEg7C,cAAaC,iBAAiBqI,GAAUtjD,QAC1CyjD,EAAUhmD,EAAQu9C,GAAex8C,EAASy8C,GAC5CwI,MAAmCA,CAAO,GAC7C,CAAChmD,EAAOe,CAAM,CAAC,EAElB,MAAMklD,GACJ7kD,OAAO8qB,aAAes4B,IAAgB,WAAa,IAAO,KACtD/lC,GAAY+lC,IAAgB,WAAa,EAAI,IAC7C0B,GAAoB,CACxB,kBAAmBzB,GAAmB,OAAOA,EAAgB36B,KAAK,GAAG,CAAC,KAElEq8B,GACJnmD,GAASe,EACL,CACE,UAAW,GAAGf,CAAK,KACnB,WAAY,GAAGe,CAAM,KAErB,gBAAiB,GACdf,EAAQe,EAAUuC,KAAKC,IAAIkb,GAAWwnC,EAAe,CAAC,KAEzDG,YAAa,GAAGpmD,CAAK,MAAMe,CAAM,GACjC,GAAGmlD,IAEL,CACE,GAAGA,IAGLG,GAAW9C,GAAmB3pD,CAAW,EAC3C0sD,MACF,CAAC,CAAC1C,GAAe,CAACF,GAAgB,CAAC,CAAC9pD,GAAe,CAACysD,GAEpDxC,GACA,CAACyC,IACD1sD,iBAAauS,SAAUm3C,KAENgD,EAAA,IAEnB,MAAMC,GAAUD,EAED/kD,GAAA,CACH,MAAEsM,YAAU,GAAGqN,CAAc3Z,IACnC,OACE0rB,EAAA,aAAY/R,EAASrN,SAAA,CAClBA,GACDlC,EAAA,cACEgB,MAAM,gBACNglB,OACAjH,IAAI,OACJjpB,QAAgB3I,GAAA,CACdA,EAAE0B,eAAe,EACjB1B,EAAEyE,gBAAgB,EAClB8yB,EAAO+yB,aAAe,CACpBvnD,IAAKjC,EACL+3B,OAEJ,EAAE9jB,SAEDjU,EACS,CAAC,EACP,GArBZypB,EAyBE,CAACmjC,GAAuBC,EAAwB,EAAIzoD,EAASgqB,MAAS,EAE5E,GAAI49B,GAEkB5wC,yBAAerQ,MAAM+hD,QAAU,UAEnDjpD,GAAgB,IAAM,CACf0G,IACAu/C,IACJ,SAAY,CACP,IACF,MAAMxY,MAAMmZ,EAAU,CAAEsC,KAAM,UAAW,EACzC9B,GAAStiD,QAAQolB,IAAM08B,OACb,CACV,KAED,EACF,CAACA,CAAQ,CAAC,EAGX14C,EAAC46C,GAAM,CAAA14C,SACLlC,EAAC45C,GAAM,CACLloD,IAAKwoD,GACLl5C,MAAO,qBAAqB9K,CAAS,GACrCJ,UACA,mBAAkB+iD,EAClB,eAAc,CAAC8B,GAAkBt+B,OACjC,gCAA+Bw+B,IAAyBx+B,OACxDrjB,MACE++C,EACI,CACEkD,gBAAiB,OAAO1C,CAAU,IAClC2C,eAAgBf,GACZ,GAAG9lD,CAAK,MAAMe,CAAM,KACpBinB,OACJ,GAAGk+B,IAELC,GACLt4C,SAEA61C,EACC/3C,EAACm7C,GAAc,IAAK3B,GAAmBt3C,SACrClC,EAAA,OACEtO,IAAKwnD,GACLl9B,IAAK08B,EACLxoD,IAAKjC,EACLoG,QACAe,SACA,mBAAkByjD,EAClB58B,QAAQ,QACRC,SAAS,OACTK,OAAepvB,GAAA,CACbA,EAAEkC,OAAOmvB,QAAQ,cAAc,EAAExlB,MAAMiiD,gBAAkB,GACzD9tD,EAAEkC,OAAOmvB,QAAQ,aAAa,EAAExlB,MAAM+hD,QAAU,GAChDxB,EAAoB,EAAI,CAC1B,EACAj9B,QAAgBnvB,GAAA,CACR,MAAE6uB,QAAQ7uB,EAAEkC,OAEhB2sB,KAAQ08B,GACRC,GACAD,IAAaC,IAEbxrD,EAAEkC,OAAO2sB,IAAM28B,EAEnB,EACD,EACa,EAEhBr3B,EAAAsD,EAAA,CAAA1iB,UACElC,EAAA,OACEgc,IAAK08B,EACLxoD,IAAKyqD,EAAiB,GAAK1sD,EAC3BoG,QACAe,SACA,mBAAkByjD,EAClB58B,QAAQ,OACRjjB,MAAO,CAKLoiD,eAAgBpC,GAAiB,SAGjC,kBAAmB,GAAGrhD,KAAKG,IACzBH,KAAKC,IAAID,KAAKC,IAAIvD,EAAOe,CAAM,EAAI,IAAK,CAAC,EACzC,GACF,CAAC,GACH,EACAmnB,OAAepvB,GAAA,CAEXkC,SAAOmtB,QAAQC,OAAS,GAC1B,MAAM4+B,GAASluD,EAAEkC,OAAOmvB,QAAQ,QAAQ,EACpC,IAACo6B,GAAiByC,GAAQ,CACtB,MAAErnB,eAAcC,iBAAkB9mC,EAAEkC,OAC1CgsD,GAAO7+B,QAAQq8B,YACb7kB,EAAeC,EAAgB,YAAc,WAC/ConB,GAAOriD,MAAMk7B,YAAY,UAAW,GAAGF,CAAY,IAAI,EACvDqnB,GAAOriD,MAAMk7B,YAAY,WAAY,GAAGD,CAAa,IAAI,EACzDonB,GAAOriD,MAAMyhD,YAAc,GAAGzmB,CAAY,IAAIC,CAAa,EAC7D,CAGA,GAAImkB,GAAoBiD,GAAQ,CACxB,MACJC,cACAC,eACAvnB,eACAC,kBACE9mC,EAAEkC,OAEJisD,MACAC,GACAvnB,GACAC,GAIED,KAAewnB,IACfvnB,GAAgBunB,GAEhBH,GAAO7+B,QAAQi/B,kBAAoB,OAC9B,CACCC,SACHznB,GAAgBqnB,EAAetnB,EAEhCr8B,KAAKivB,IAAI80B,GAAuBH,CAAY,EAAI,GAGhDT,GAAyB,EAAI,CAEjC,CAEJ,CACF,EACAx+B,QAAgBnvB,GAAA,CACR,MAAE6uB,QAAQ7uB,EAAEkC,OACd2sB,KAAQ08B,GAAYA,IAAaC,IACnCxrD,EAAEkC,OAAO2sB,IAAM28B,EAEnB,CACD,GACA,CAACgC,GACA36C,EAACw3C,GAAQ,CAACtnD,IAAKjC,EAAa+3B,OAAYvb,MAAO0tC,EAAW,CAC3D,EACD,EAEE,EACF,EAEDl+B,OAAS,QAAUA,IAAS,SAAW8/B,EAAc,CACxD4B,QAAc9gB,EAAS1D,SAAW,EAClCykB,GAAgB/gB,EAAS1D,SAAW,GACpC0kB,EAAQ5hC,IAAS,QAAU2hC,GAE3BE,EAAWjhB,EAAS1D,SAAW,GAC/B4kB,EAAoB7E,GAAerc,EAAS1D,QAAQ,EACpD6kB,GAAe,CAACjE,GAAgB,CAACC,GAAe6D,EAChDI,GAAiB,CAAClE,GAAgBC,GAAe6D,EACjDK,GAAerhB,EAAS1D,SAAW,EAGnCglB,GAAU;AAAA;AAAA,eAELhlD,CAAG;AAAA,kBACAohD,CAAU;AAAA,iBACXlkD,CAAK;AAAA,kBACJe,CAAM;AAAA,4BACIyjD,CAAW;AAAA;AAAA;AAAA;AAAA;AAAA,UAK7BiD,EAAW,OAAS,EAAE;AAAA;AAAA,UAGtBI,GACI,gKACA,EAAE;AAAA;AAAA,IAKNE,GAAY;AAAA;AAAA,eAEPjlD,CAAG;AAAA,kBACAohD,CAAU;AAAA,iBACXlkD,CAAK;AAAA,kBACJe,CAAM;AAAA,4BACIyjD,CAAW;AAAA;AAAA;AAAA;AAAA,UAI7BiD,EAAW,OAAS,EAAE;AAAA;AAAA;AAAA,MAK5B,OACE97C,EAAC46C,GAAM,CAAA14C,SACLof,EAACs4B,GAAM,CACL54C,MAAO,SAAS9K,CAAS,UAAU2lD,EAAQ,MAAQ,OAAO,IACxDI,GAAiB,gBAAkB,EAAE,IACnCD,GAAe,sBAAwB,EAAE,GAC7C,mBAAkBnD,EAClB,0BACGd,EAAmC17B,OAApB0/B,EAElB,aACEF,GAAS,CAAC9D,GAAgB,CAACkE,GAAiB,MAAQ5/B,OAEtD,eAAc,CAACs+B,GAAkBt+B,OAKjCrjB,MAAO,CAAC++C,GAAgByC,GACxB1kD,QAAgB3I,IAAA,CACd,GAAI6uD,GACE,IACFjD,EAASniD,QAAQylD,aACP,CAAC,CAEfvmD,EAAQ3I,EAAC,CACX,EACAmvD,aAAcA,IAAM,CAClB,GAAIN,GACE,IACFjD,EAASniD,QAAQuG,YACP,CAAC,CAEjB,EACAo/C,aAAcA,IAAM,CAClB,GAAIP,GACE,IACFjD,EAASniD,QAAQylD,aACP,CAAC,CAEjB,EACA54C,QAASA,IAAM,CACb,GAAIu4C,GACE,IACFjD,EAASniD,QAAQuG,YACP,CAAC,CAEjB,EACA0c,OAAQA,IAAM,CACZ,GAAImiC,GACE,IACFjD,EAASniD,QAAQylD,aACP,CAAC,CAEjB,EAAEn6C,SAAA,CAED61C,GAAgBkE,GACfJ,GAAS9D,EACP/3C,EAACm7C,GAAc,IAAK3B,GAAqBzqD,QAAO,GAAAmT,SAC9ClC,EAAA,OACEtO,IAAKwnD,GACLh5C,wBAAyB,CACvBC,OAAQg8C,EACV,EACD,EACa,EACdN,EACF77C,EAAA,OACEgB,MAAM,kBACNd,wBAAyB,CACvBC,OAAQg8C,EACV,EACD,EAEDn8C,EAAA,OACEgB,MAAM,kBACNd,wBAAyB,CAAEC,OAAQi8C,EAAU,EAC9C,EAEDP,EACF77C,EAAA,SACEtO,IAAKqnD,EACL/8B,IAAK7kB,EACLqlD,OAAQjE,EACRlkD,QACAe,SACA,mBAAkByjD,EAClB4D,QAAQ,OAERC,YAAW,GACXC,KAAI,GACJC,MAAK,GACLC,aACEX,GACW/uD,IAAA,CACC,MAAEkC,SAAWlC,KACbusB,GAAYrqB,mBAAQmvB,QAAQ,cAClC,GAAI9E,GAAW,CACb,MAAM6wB,GACHl7C,GAAO8qC,YAAc9qC,GAAO8nC,SAAY,IAC3Czd,GAAU1gB,MAAMk7B,YACd,aACA,GAAGqW,EAAU,GACf,CACF,CAEFluB,SAEP,EAEDiF,EAAAsD,EAAA,CAAA1iB,SAAA,CACGq2C,EACCv4C,EAAA,OACEgc,IAAKu8B,EACLroD,IAAKyqD,EAAiB,GAAK1sD,EAC3BoG,QACAe,SACA,mBAAkByjD,EAClB58B,QAAQ,OACRC,SAAS,QACTK,OAAepvB,IAAA,CACb,GAAI,CAACyrD,EAAe,CAClB,MAAMyC,GAASluD,GAAEkC,OAAOmvB,QAAQ,QAAQ,EACxC,GAAI68B,GAAQ,CACJ,MAAEpnB,iBAAeD,iBAAiB7mC,GAAEkC,OAC1CgsD,GAAO7+B,QAAQq8B,YACb7kB,GAAeC,GACX,YACA,WACNonB,GAAOriD,MAAMk7B,YACX,UACA,GAAGF,EAAY,IACjB,EACAqnB,GAAOriD,MAAMk7B,YACX,WACA,GAAGD,EAAa,IAClB,EACAonB,GAAOriD,MAAMyhD,YAAc,GAAGzmB,EAAY,IAAIC,EAAa,EAC7D,CACF,CACF,EACD,EAEDj0B,EAAA,SACEgc,IAAK7kB,EAAM,SACX9C,QACAe,SACA,mBAAkByjD,EAClB4D,QAAQ,WACRG,MAAK,GACLE,wBAAuB,GACvBC,iBAAyB5vD,IAAA,CACvB,GAAI,CAACwuD,EAAa,CACV,MAAExkB,aAAahqC,GAAEkC,OACvB,GAAI8nC,GAAU,CACN4kB,SAAoB7E,GAAe/f,EAAQ,EAC3Czd,GAAYvsB,GAAEkC,OAAOmvB,QAAQ,cAAc,EAC7C9E,KACFA,GAAU8C,QAAQu/B,kBAChBA,GAEN,CACF,CACF,EACD,EAEH/7C,EAAA,OAAKgB,MAAM,aAAYkB,SACrBlC,EAACa,EAAI,CAACD,KAAK,OAAOE,KAAK,KAAK5Q,IAAI,IAAK,EAClC,CAAC,CACN,GAEH,CAAC6nD,GAAgB,CAAC4C,GACjB36C,EAACw3C,GAAQ,CAACtnD,IAAKjC,EAAa+3B,OAAYvb,MAAO0tC,EAAW,CAC3D,EACK,EACF,UAEDl+B,IAAS,SAAW+/B,GAAc,CACrC+B,QAAoB7E,GAAerc,EAAS1D,QAAQ,EAC1D,OACEn3B,EAAC46C,GAAM,CAAA14C,SACLof,EAACs4B,GAAM,CACL54C,MAAO,qBAAqB9K,CAAS,GACrC,0BACG6hD,EAAmC17B,OAApB0/B,EAElB,eAAc,CAACpB,GAAkBt+B,OACjCvmB,UACAkD,MAAO,CAAC++C,GAAgByC,GAAYt4C,SAAA,CAEnC61C,EACC/3C,EAAA,SAAOgc,IAAKw8B,GAAarhD,EAAKslD,QAAQ,OAAOO,SAAQ,GAACC,SAAQ,GAAE,EAC9D1E,EACFv4C,EAAA,OACEgc,IAAKu8B,EACLroD,IAAKyqD,EAAiB,GAAK1sD,EAC3BoG,QACAe,SACA,mBAAkByjD,EAClB58B,QAAQ,OACRK,QAAgBnvB,IAAA,SACV,KAEFA,QAAEkC,SAAFlC,cAAUqkC,SAAVrkC,qBACU,CAAC,CACf,CACD,GACC,KACH,CAAC4qD,GACAz2B,EAAAsD,EAAA,CAAA1iB,UACElC,EAAA,OAAKgB,MAAM,aAAYkB,SACrBlC,EAACa,EAAI,CAACD,KAAK,OAAOE,KAAK,KAAK5Q,IAAI,IAAK,CAClC,GACJ,CAACyqD,GACA36C,EAACw3C,GAAQ,CAACtnD,IAAKjC,EAAa+3B,OAAYvb,MAAO0tC,EAAW,CAC3D,EACD,CACH,EACK,EACF,CAEZ,CACF,CAEA,SAAS2B,GAAU3iD,EAAK,CAEtB,OAAOC,IAAIC,MAAMF,EAAKG,SAASumB,MAAM,CACvC,CAEA,MAAe/F,MAAKggC,GAAO,CAACoF,EAAUC,IAAa,CAC3CC,QAAWF,EAASr+C,OAAS,GAC7Bw+C,EAAWF,EAASt+C,OAAS,GAEnC,OACEu+C,iBAAUvmD,OAAOwmD,iBAAUxmD,KAC3BumD,EAASjmD,MAAQkmD,EAASlmD,KAC1B+lD,EAASx/B,KAAOy/B,EAASz/B,IACzBw/B,EAASl8C,QAAUm8C,EAASn8C,KAEhC,CAAC,ECpmBKs8C,GAA2B,IAC3BC,GAAyB,IAEzBve,GAAWC,GAAU,CACzBC,MAAO,EACPC,SAAU,GACZ,CAAC,EACD,SAASqe,GAAa3mD,EAAI6sC,EAAO,CAC/B,OAAOA,EAAM/Z,GAAG6Z,SAASia,QAAQ5mD,CAAE,EAAE0oC,OACvC,CACA,MAAMme,GAAkBxd,GAAKlB,GAASwe,EAAY,CAAC,EAE7CG,GAAiB,CACrB5O,OAAQ,CAAAl4C,GAAA,QAAU,EAClBs4C,MAAO,CAAAt4C,GAAA,QAAS,EAChBm4C,SAAU,CAAAn4C,GAAA,QAAY,EACtBo4C,QAAS,CAAAp4C,GAAA,QAAkB,EAC3Bq4C,OAAQ,CAAAr4C,GAAA,QAAmB,CAC7B,EAEM+mD,GACJnoD,OAAOooD,eAAiBxhC,QACxB,mBAAmB5jB,KAAKC,UAAUC,SAAS,EAEvC6tB,GAAM,IAAI5D,KAAKuD,mBAEf23B,GAAkB,GAExB,SAASC,GAAYljD,EAAM,OACzB,OAAKA,mBAAM3I,UAAN2I,QAAe2F,OACb;AAAA,EAAQ3F,EAAK3I,QACjB+rB,IACEmsB,GACC,KAAKA,EAAOrpC,KAAK,GACfqpC,EAAOR,YAAc,EAAI,KAAKQ,EAAOR,UAAU,IAAM,EAAE,EAE7D,EACCzrB,KAAK;AAAA,CAAI,CAAC,GARsB,EASrC,CACA,SAAS6/B,GAAYvpC,EAAQ,CACrB,MAAE+3B,cAAa1b,UAASj2B,MAAS4Z,IAEpC+3B,SAAc,GAAGA,CAAW;AAAA;AAAA,EAAS,IACtCzW,GAAYjF,CAAO,EACnBitB,GAAYljD,CAAI,CAEpB,CAEA,SAASojD,GAAentB,EAAS,CAG3B,MAFA,CAACA,IACLA,EAAUA,EAAQrT,OACd,CAACqT,GAAgB,GAWd,CAAC,CAVKiF,GAAYjF,EAAS,CAChCkF,WAAqB7E,GAAA,CAEnB,UAAWnmB,KAAKmmB,EAAIpuB,iBAClB,wCACF,EACEiI,EAAEwmB,OAAO,CAEb,EACD,CAEH,CAEA,SAAS0sB,GAAyBptB,EAAS,CACzC,OAAOiF,GAAYjF,EAAS,CAC1BkF,WAAqB7E,GAAA,CAInB,UAAWnmB,KAAKmmB,EAAIpuB,iBAClB,kDACF,EACEiI,EAAEwmB,OAAO,EAIX,UAAWxmB,KAAKmmB,EAAIpuB,iBAAiB,GAAG,EAAG,CACnClN,QAAOmV,EAAE4mB,UAAUnU,KAAK,GAC1B5nB,EAAK+9B,WAAW,UAAU,GAAK/9B,EAAK+9B,WAAW,SAAS,IAC1D5oB,EAAEwmB,OAAO,CAEb,CACF,EACD,CACH,CAEA,MAAM2sB,GAAa,SACbC,GAEJA,CAAC,CAAEC,OAAMlwC,WAAUkoB,iBAAkB,CAC7B,MAAEvF,UAAS9O,SAAQs8B,WAAUloB,WAAUj/B,KAAQknD,IAE/CE,EAAS5sD,IACfG,UAAgB,IAAM,CAChB,IAACysD,EAAO3nD,QAAS,OACfu6B,QAAMmD,GAAexD,EAAS,CAClC9O,SACAgP,UAAW,GACZ,EAED,UAAWhmB,KAAKmmB,EAAIpuB,iBAAiB,0BAA0B,EACxDo7C,GAAW1lD,KAAKuS,EAAE4mB,UAAUnU,MAAM,GACrCzS,EAAE3H,gBAAgB,QAAQ,EAG9Bk7C,EAAO3nD,QAAQ4nD,gBAAgBrtB,EAAIstB,UAAU,EAAI,CAAC,CACjD,GAAC3tB,EAAS9O,EAAOxhB,MAAM,CAAC,EAGzBR,EAAA,OACEtO,IAAK6sD,EACLv4B,KAAMs4B,EACNv/B,IAAI,OACJ/d,MAAM,gBACNlL,QAASqgC,GAAmB,CAC1BC,WACAjoB,WACAkoB,cACAC,UAAWn/B,EACZ,EAcF,CAEL,EAQIunD,GAAa,CACjBl/C,EAAG,QACHC,EAAG,SACHC,EAAG,OACL,EAEMi/C,GAAaze,GAAK,MAAOrqC,GAAS,CAChC,MAAE+oD,aAAc,MAAMrlD,EAAA,0CAAO,4BAAc,2CAK7C1D,GAJJA,EAAOA,iBAAM4nB,QAIT5nB,iBAAM2K,QAAS,IACV,YAGHwlB,QADQ44B,EAAU/oD,CAAI,EACT,CAAC,EACpB,OAAImwB,WAAMA,OAAQA,iBAAM64B,UAAW,GAI1B74B,EAAKA,KAEP,IACT,CAAC,EAEK84B,GAAe,CAAAjoD,GAAA,QAAe,EAI9BkoD,GAAuB,GACvBC,GAAyBA,CAC7BV,EACAW,EAAkC,KAC/B,CACC,IAACX,EAAiB,SAChBY,QAAiB52B,GAA2B,EAAI,EAChD62B,EACJb,IAAaY,GACb,CAACj5B,GAAY,CAACq4B,CAAQ,EAAG,CAACY,CAAc,CAAC,GACzC,CAACD,EAAgCz8B,KACxB87B,OAAa5+C,GAAKumB,GAAY,CAACq4B,CAAQ,EAAG,CAAC5+C,CAAC,CAAC,CACtD,EACmB4+C,YAAWW,CAA+B,EAAI,GAC5DE,CACT,EAEA,SAASC,GAAO,CACdC,WACA5qC,SACAtG,SAAUmxC,EACVx+C,OAAO,IACPy+C,oBACAnW,WACAoW,oBACAC,gBACAnnB,WACAonB,kBACAvf,eAAgBwf,EAChBtpB,cAEAupB,eACAC,SACAC,oBAAoBA,IAAM,CAAC,EAC3BC,mBACAC,mBACAC,iBACAC,kBACAC,YACF,EAAG,iBACK,MAAE5nD,KAAMgrB,GAAU,EAExB,GAAI+U,EACF,OACEhX,EAAA,OACEtgB,MAAO,mBACLm/C,EAAa,2BAA6B,EAAE,GAC3Cj+C,UAEF,CAACi+C,GAAcngD,EAAC4b,GAAM,CAAC9a,KAAK,MAAO,EACpCwgB,EAAA,OAAKtgB,MAAM,YAAWkB,UACpBof,EAAA,OAAKtgB,MAAM,OAAMkB,SAAA,EACbpB,IAAS,KAAOq/C,IAAengD,EAAC4b,GAAM,CAAC9a,KAAK,GAAK,GAAE,eACvD,EAAK,EACLwgB,EAAA,OAAKtgB,MAAM,oBAAmBkB,SAAA,CAC3Bi+C,GAAcngD,EAAA,OAAKgB,MAAM,wBAAyB,EACnDhB,EAAA,OAAKgB,MAAO,WAAWm/C,EAAa,sBAAwB,EAAE,GAAGj+C,SAC/DlC,EAAA,KAAAkC,SAAG,gBAAgB,EAChB,CAAC,EACH,CAAC,EACH,CAAC,EACH,EAGH,MAAEwhC,QAAOv1B,WAAUiyC,iBAAkBp8B,GAAI,CAAE7V,SAAUmxC,EAAc,EACnE,CAAEnxC,SAAUkyC,GAAoBr8B,GAAI,EACpCs8B,EAAenyC,IAAakyC,EAElC,IAAIE,EAAOC,GAAUnB,IAAY5qC,iBAAQ5d,IAAIsX,CAAQ,EAC/CsyC,QAAaC,GAAYh8B,CAAM,EAKrC,GAJKjQ,IACHA,EAASgsC,EAAWE,SAASJ,CAAI,GAAKE,EAAWE,SAAStB,CAAQ,EAC3DmB,KAAU/rC,iBAAQ5d,GAAIsX,CAAQ,GAEnC,CAACsG,EACI,YAGH,MACJ0O,QAAS,CACPK,OACAC,SACAC,eACA7sB,GAAI+pD,GACJzpD,IAAK0pD,EACLl9B,eACAC,WACA5B,OAAQ8+B,GACR9kD,OACAD,QACF,EACAlF,KACAkqD,gBACAC,aACAC,gBACAC,cACAC,mBACAC,cACAvmD,QACA+hD,SACAyE,aACA7U,eACA8U,aACAhD,SAAUiD,GACVC,YACAvW,YACAwW,OACApoB,aACAqoB,cACAC,qBACA7wB,UACAsF,YACAqW,oBACAmV,UACAC,OACA1qD,OACA6qB,UACA8/B,QACAC,UAEAC,YACAC,WAGAC,iBACEztC,IAEE,CAAC0tC,GAAsBC,EAAuB,EAAI/vD,EAAS,IAAI,EACrEN,GAAU,IAAM,CAGd,GAFI,CAAC++B,GACDywB,IACAY,GAAsB,OACtB7/C,MACJA,SAAQhM,WAAW,SAAY,CAC7B,IAAI+rD,EAAW,MAAM1D,GAAWT,GAAyBptB,CAAO,CAAC,EACjEsxB,GAAwBC,CAAQ,GAC/B,GAAI,EACA,IAAM5/C,aAAaH,CAAK,GAC9B,CAACwuB,EAASywB,EAAS,CAAC,EACvB,MAAMjD,GAAWiD,IAAaY,GAGxBG,GAAsB,CAAC,EAAC7V,aAAkBjsC,QAC5C2/C,GAAcmC,KAA4BxhD,EAAA,KAExC6iC,SAAiBl8B,GAAQ,IACtBm8B,GAAoB,EAC1B,CAAE,GACC2e,GAAS96C,GAAQ,IACdk8B,IAAkBA,KAAmBid,GAC3C,CAACA,GAAWjd,EAAc,CAAC,EAExBuH,GAAgBh6C,GAAW65C,EAAa,EACxCyX,EACJ,CAACD,IAAU,CAACnZ,GAAY,CAAC/S,GAAesV,GAAWV,GAAUC,EAAa,EAExEsX,qBAAYjX,UAAW,OAClB,YAGT1nC,SAA+BhN,IAEzB4rD,UACJ,EACE5+C,GACK4Q,IACJ,KAAA+tC,EAEL,OAAAxiD,EAAA0iD,GAAA,CAEA,OAAAjuC,EAAA,WAAA+tC,aAAqD,gBACnD,aACiBC,EACbhuC,EACA+tC,oBACAr0C,WAGA,MAAAw0C,GAAA,SAAAtpB,EAAA,EACgBupB,GAAA,SAAApB,EAAA,EAChB3B,4CACD,CAAAgD,IAAAlB,IAAA9qD,IAELgsD,GAAA,CAEMF,MACAC,WAEFC,cAGJ,GACwB,KAAOhC,cAAYj9B,eAAUD,sBAAYR,EACjE2/B,GAAA3/B,CAAA,EAEIu6B,GAAC+B,EAAkBsD,CAAwC,OAAAC,GAAA,CACvD7/B,GAAiBqgB,CAASme,EAC5Bx+B,EAAS,SAAA6/B,EAAA,IAAAA,CACXF,aAA2B,CACtB,CAGDA,CACOtf,aAAuBrgB,4CAE/B8/B,GAAax7C,GAAA,IAClB,GADoBk7B,GAAA,gCACpB,2BACF,IACMugB,iBAKJ,WADIC,WAAwB17C,iBAAc,6BACV,kCAAmB,SAC5C,MACJ27C,GAAA/sB,GAAA8sB,IAAA,EAAA1C,EAAA,SAAA5pD,CAAA,EACCwsD,MAAmCA,KAAA,cAAA5C,EAAA,cAAA5pD,CAAA,EAGvC,GAAA+qD,GACA,OAAA7lD,GACGulB,EAAA,OAIC8hC,qBACWD,EACXG,qBAKM,aAAAb,GAGN1mD,SAAO,CAAAulB,EAAA,OACT,wBAEwBi/B,eACd,aACQkC,SAAWvgD,MAEzBof,EAA4Bpf,CACf,WAAa,EAAO3J,aAAE,QAAAkc,EAAA,iBAAAtG,EAAO,cAAC,KAAGnO,EAC5CA,GAAS,UAAiBmjB,QAAShV,iCAA8B,KAAArN,EAEnEd,oBACEyU,WACA4qC,YAAiC,CACjClxC,GACArN,EAEAsoC,SACA+W,6BACA,6BACCsC,GAET,UAAAnhC,EAAA,OAEA,wBAEwBi/B,eACd,cACQkC,SAAWvgD,MAEzBof,IAAA,CAAW,YAAiBpf,WAC1BlC,CAAW,EAAAA,EAAAkjB,GAAA,CAAc,QAAAzO,EAAA,QACzBzU,WAAA,gBAAAinB,EACEjnB,EAACkjB,OAAQ,IAAiBC,CAAShV,OAA8BixC,GAAA,QAAEC,EAAA,KAAAuC,GAAA,SACnE5hD,EAAmB4hD,GAAA,QAAC,SAAAzzC,EAAA,KAAArN,EAGxBd,oBACEyU,WACA4qC,kBAAqBuC,GACrBzzC,aACArN,GACAy+C,EACAnW,MACAoW,GAAiB5sD,GAAA,EACjButD,cACA7+B,EAAA,4BACCi/B,EAET,6BAGMgD,gBACDrhD,mBAAS,wBAEYq+C,eACd,eACQkC,QAAWvgD,OAEzBof,EAAA,mBAAAi/B,CAAA,iBAAA9wD,GAAAuQ,EAAAod,GAAA,CAAW,GAAAjP,EAAA,IAAAA,CAAA,MAAA1e,CAAA,SAAAA,CAAA,GAAiByS,iCACpBtB,SAAKnR,CAAA,EAAeA,CAAA,MAAKyS,CAC9Bu+C,CACM,CAEH/iC,OAAe+iC,EAAItyC,oBAA+B,IAClDnN,GAAM++C,KAAAnkB,GAAA6kB,EAAA,mBAAAF,CAAA,UAAA3kB,GAAA,QAAA2nB,GAAA7rC,EAA0BxV,GAE/BzS,QAAG,CAJCA,GAMP+zD,EAAA,EAAAnxD,EAAAstD,CAAA,EAEHz9C,uBAKDuhD,+BAKN,EAAAhD,WAEAiD,KAAwChE,EAAA,IAIlC,MAAAiE,GAAAl8C,GAAA,KAAEi8C,8DAAoBE,SAExB,QAAqBlE,GAAkB5uB,CAAA,EACrC6yB,eAAgCpG,EACpC,GAAAmG,GACGA,GACAE,IAEiBC,GAACA,EACnBxtB,MAEAgrB,QAEAI,CACAhV,GAEO,CAAAqX,GAAAC,EAAA,EAAA1xD,EAAA,IACT,CAAA2xD,GAAAC,EAAA,EAAA5xD,EAAA,IACM6xD,QACCA,QAGPN,QAaIO,GAACL,EAAyB,MAC1BM,KAAqC,EAG3C,CACA,WAEMD,CAEN,EAAmC5rD,mEAAG8rD,GAAAzsB,GAAA+qB,EAAA,EAAA2B,GAAA9C,IAAA5pB,GAAAgrB,EAAA,EAA6F,IAAA2B,GAAAnE,GAAAkB,IAAA,UAAAA,IAAA,UAACA,IAAA,WAAAiB,KAE9HiC,OAWAF,YAA6B1sB,OAMnC,GACEwoB,OACEkB,eAAoC,GAExCn0D,GAAA,MAAAA,EAAA,WAAAyuC,EAAAzuC,GAAA,YAAAA,EAAA,uBAAAyuC,EAAA,cAE2B,CACrB,cAAiBnnB,CACnB,IAIA0jB,IAA2B,cACV1jB,GAEjB,EACFgwC,GAAAh9C,GAAA,IACYglC,GAAA,KAAAxxC,GAAA,kBAAAg8B,GAAA2E,EAAA3gC,EAAA,0BAAA2gC,EAAA,aAAA3E,EAAA,KAAA2E,IAAA,GACV8oB,EAAejwC,GAChBkwC,GAAAl9C,GAAA,IACH,qBAAAk7C,KAAA,kBAGM8B,MACJG,GACG3pD,UAEL,GAAIwxC,IAAiB,CAAA2T,EAEfuE,eAAgC,EAC7BhtD,GA2CT,GAAMitD,CAOKjE,GANLj8B,EAAiB,SAAA67B,CAACH,EAAe,CACnC/nD,KACO,WAAA2oD,GACT,aAAAC,IAAAD,GAAA,KACA,EAESL,IACL,MAAGlsC,4CACHusC,GAAW6D,EAAC7D,OACZC,CACF,MAAA4D,EAAA,MAAAnhB,EAAA,oBAAA7sC,CAAA,WACAiuD,GAAeD,EAAA12C,CAAA,CACP02C,CACNC,QAA8B,MACzB,CACCD,mBAAY,IAClBC,EACF,CACA,KACU,UACVjhD,OAAe,CAAAu8C,EAERO,eAAiBlsC,EACjB,GAEX,IAOM,GALNiQ,YAAwB,EAAY,CAC9B,GAAiBjQ,EACnBpc,WAAmC,CAAA6oD,GAC5B,gBAAAC,IAAAD,GAAA,OAELA,GAAA,CAEKP,QAAa,MAAIjd,EAAA,oBAAA7sC,CAAA,gBACtBiuD,GAAGrwC,UAEH0sC,QAAoCD,4BAAkBrqD,CAAA,cACxDiuD,GAAAD,EAAA12C,CAAA,CACA,CACQ02C,QACNC,OACF,OAAApgC,EAAO,SAAA67B,CAAA,EAAA9rC,EACCowC,EACNC,CAA8B,EAEzBC,GAAA,UACT,IACElhD,cAAemhD,KAERrE,KAAasE,GACbtvD,GAAAurD,GAAA5oD,EAAA,EAEX,aAEM,QACI2sD,KAA6BzhC,EAEjC7tB,CACY4C,MACN,CAAAyuB,GAAA,gBAAyBxD,CAAI,EAAAI,GAAAJ,CAAQ,EAACjrB,EACtC,UAA2B2sD,GAAA,UAAQ,GAAAjlC,GAAA,+BAAC,CAC1CqgC,GAAA,CAAAF,EACF,aAAAgE,EAAA,EACOj3D,GACX,IAMW,GAJXu3B,YAAmC,GAC7B,GAAUjQ,EACV,WAAiB,CAAA2sC,EACnB/oD,EACO+oD,GAAA,CACT,MAAAyD,EAAA,MAAAnhB,EAAA,oBAAA7sC,CAAA,eACIiuD,GAAAD,EAAA12C,CAAA,CAEFuW,KAAOi8B,CACL,MAAGlsC,4CACH2sC,KAAaA,EACf,CACA,MAAgB,EACRyD,OACNC,qBAAsB32C,EACjB,EACC02C,EACNC,EACFK,GAAA,UACO,YACG,MAAAD,KACVrhD,KAAeohD,GAERtE,MAAiBlsC,IAE1B,CACF,oBAEM,EAAAmP,GAAAJ,CACIyhC,CACDpB,CACHluD,MAEM,CAAAkB,GAAA,SAAAmwB,OAAA,CAAAC,EAAkBrD,GAAYJ,CAAI,CAAQ,GAC1C,UAAAy7B,GAA4Bz7B,+CAAI,CAAA4hC,GAAAC,EAAA,EAAAhzD,EAAA0sD,GAAAT,GAAAW,EAAA,EAAAD,GAAAV,GAAAW,EAAA,MAAQltD,GAAA,QAAC,CAC/CusD,IAAA8G,IAAArG,GAAAT,GAAAW,EAAA,EACF,OACW,IAAAlqC,EAAA,gBACf,MAAAoqC,EAAAH,GAAAV,GAAAW,EAAA,EAUEwB,QACF,GAAM,EAKN1uD,UAAgB,aAAAgjB,CAAA,CACd,GAAAupC,GAEE8G,KACqB9G,GAErB,MAAAgH,GAAA3zD,IACF4zD,GAAA5zD,IACIojB,kBAA2BywC,EAAA,iBACvBrG,IAIFA,yBAAyC,QAAAE,CAAA,oBAC3C,MAAAvB,EACJ,CAAO,EACLQ,GAAU8G,+BAAmD,qBAE3DE,QACN,IAEE,KAAe,EACE1uD,OAEK,GAElB,MAAC6uD,CACe7uD,4BAAU8sC,IAASid,aAClB,EAAA4E,GACE,qBACjBrmB,KAAO4e,QAAP5e,SAAO4e,uCACT,MAACta,GAAA,GACL,OAAA+Q,GAAAmR,EAAA,cAAAnR,GAAA,QACA/Q,GAAO,QAAAkiB,EAAA,UAAA16C,KAAS06C,qBAAiB16C,GAASy6C,IAKxBh3D,sBAAiBg3D,QACjCjiB,WAAmBiiB,EAAA,UAAAz6C,KACf06C,sBAA6B,EACtBzzB,GAEH0zB,GAGN,CACF,MAAAniB,GACIiiB,aAAgCA,EAAA,IAClCjiB,CAEMmiB,CACK36C,aAEX,GACF,OACA,CAAO,CAELi6C,SAAoBA,IACtBW,GAAA,+BAAAtE,CAAA,EACFuE,GAAA,yCAAAvE,CAAA,EACOwE,GAAAxkC,EAAAsD,EAAA,UACI,EAAAi/B,IAAAvD,GAAAtgD,EAAA4kB,EAAA,CACTqgC,SAAM3jC,EAAA,OACR,kDACF,UAAAA,EAAAvH,GAAA,qBAGkB,CAAA/Z,EAAAa,EAAoB,eAEtC,CAAMilD,qBAEexF,QACfS,EAAA,EAAAzoD,EAAA,EACa,CAA2C4J,GACpDof,QAAmBykC,CAAY7jD,CACxB,EAACtB,CAAK,CAAS,EACpBZ,KAAA,YACiDzH,kBAAG,UAAAyH,EAAAa,EAAA,eAAO,EAAAb,EAAA,QAAC,SAAAghD,GAAA1oD,EAAA,EAG9DgpB,CACS,WACPJ,CACEhf,IACElC,EACAA,CAAAkC,WAAgB3J,CAAG,KAAS,YAACA,kDAAG,aAAA4/B,GAAA,CAAO,aAAC;AAAA,EAAAhhC,EAAA,EACxC,EAEO,CACXkqB,EAEIvrB,SAAe,CAAAkK,EAAAa,EAAA,CACD,eACVmlD,EAAa,iBACHhmD,EAAA85B,EAAA,CAAQ,YAClB,GACF,CAAC,CACH,EAAE53B,WAAAuiD,IAEG,CAAAzD,GAAA1/B,EAAA,aAAM,SAAO,SAClB,CAAAthB,EAAAa,EAAA,CAAAqB,YACE,GAAArL,EAAAijC,EAAA,IAAmB,SACf,CAAC,CACC,GAAA6qB,IAAA,GAAArjC,EAAA,OAGVmjC,eACOzjD,SAAM,CAAAhB,EAAAa,EAAA,CAAQqB,WACZ,GAAMlC,EAAA,QACXA,WAAA85B,EAAA,aAA+C,QAG9B,EAAAtT,GAAA,QAAAm+B,GACjB,QAAW,EAAQziD,WAChBrB,CAAU,EAAAb,EAAA,YACXA,CAAA,CAAAkC,CACE,eAGKskB,IAAqC,qBAAAuT,CAAA,MADxC/5B,EAEQ,MAAA4kD,KAAC,CAAAf,IAAAoB,GAEJtvD,GAAAqrD,GAAA1oD,EAAA,EAEN,CAID,GAACisD,SACU,QACf,EAAA3gC,GAAAJ,CACIyhC,CACDpB,CACHluD,MAEM,CAAAkB,GAAA,SAAAmwB,OAAA,CAAAC,EAAerD,GAAYJ,CAAI,CAAQ,GACvC,oBAAAxjB,EAAyBwjB,GAAI,cAAQ,EAAAxjB,EAAA,iBAC3CihD,GAAA,EAAAnpB,GAAAmpB,EAAA,EAAAD,GAAA1oD,EAAA,GAES,WACf,CAAE4J,IAEFlC,EACAA,YAGezH,CACT,KAAS,EAAA+oB,EAAAvH,GAAA,SAACxhB,iDACV,UAAAyH,EAAAa,EAAA,cAAQ,EAAAb,EAAA,QAAC,SAAAmhD,GAAA,EAAArpB,GAAAqpB,EAAA,EAAAD,GAAA5oD,EAAA,EAGjBgpB,CACWyjC,WACE,CAAgD7iD,IAE3DlC,EACAA,YAGgBzH,CACV,IAAQ,GAAA0nB,GAAA,4BAAAqB,EAAAvH,GAAA,SAACxhB,gDACT,UAAAyH,EAAAa,EAAA,iBAAM,EAAAb,EAAA,QAAC,SAAAohD,GAAA9oD,EAAA,EAGd2nB,CAEYklC,WACE,CAA+CjjD,IAE1DlC,EACAA,CAAAkC,WAAiB3J,CAAG,KAAY,IAACA,2CAAG,SAAA+oB,EAAAvH,GAAA,cAAU2K,EAAA,qBAAC,QAAApsB,EAAA,EAElD,CACE,WAGPurD,CAIA3hD,gBAEmB+jD,GACbvhC,WACEwhC,cAAO3tD,YAAE,EAAmB,UAAAyH,EAAAa,EAAA,CAAC,eAC7BslD,EAAeF,QACf93C,cACAi4C,GAAe,UACP7F,CACV,GACF,CAAEr+C,OAEFlC,EAAK4kB,EAAA,UAAM,EAAA86B,GAAA,CAAApB,IAAA8G,KAAAplD,EAAA8a,GAAA,IAAA4kC,EAAAp+B,EAAA,OAAO,MAClBthB,GAAA,qBAAAkC,YACE43B,GAAA,UAAAqG,GAAA,QAA+B,KAC1BqjB,GAAA,GACC,EAGZrD,cACA,MACIT,WAIA,CAAK1+C,YAA4CkB,SAC/Cof,EAASwY,EAAA,CACGqG,aAERqjB,GAAsB,CACxB,EAAAvX,IAAA3qB,EAAAvH,GAAA,CAAE7X,YAEFlC,CAAMY,MAAKylD,EAAArI,GAAAvpC,CAAA,EACXzU,GAAAkC,KACEo8C,EAAA,GAAwB,SACnB,CAAAt+C,EAAAa,EAAA,CAERorC,KACC3qB,OAAS,KACExrB,OAAM,CACPuwD,cACN,GAAc,QACZvnD,EAAwB,CAC1B,GACF,EAAEoD,SAEFlC,KAAKshB,EAAA,aAAM2qB,GAAA,qBAAO,SAClBjsC,CAAAshB,EAAAC,GAAA,CAAArf,QACE,IAAAiM,CAAA,WAAAtX,CAAA,yBAAAmJ,EAAAa,EAAA,MAAmB,YACf,EAACb,EAAA,QAEV,SAAAA,EAAA85B,EAAA,CAGWsrB,WACZ,CAAKpkD,CAAyC,CAAGkB,EACtC,CACPwb,MAAkB4D,KAAiB,CAAyBpf,YAE5DlC,CAAMY,MAAKylD,EAAArI,GAAAvpC,CAAA,EACXzU,GAAAkC,KACEo8C,EAAA,GAAwB,SACnB,CAAAt+C,EAAAa,EAAA,CAERorC,KACC3qB,OAAS,KACExrB,OAAM,CACPuwD,cACN,GAAc,QACZvnD,EAAwB,CAC1B,GACF,GAAEoD,EAEG,KAAA2hD,IAAMvD,GAAAZ,GAAA,CAAApB,IAAA8G,KAAAplD,EAAA8a,GAAA,KAAA+oC,IAAA7jD,EAAA4kB,EAAA,CAAO,SAClB5kB,EAAAuhB,GAAA,CAAArf,SACE43B,CAAA,MAAAjjC,CAAA,SAAAA,CAAA,WAAA1J,GAAA,CAAA2yD,EAAmB3yD,EAAAsnB,CAAA,GACd,SAEV,CAAAzU,EAAAa,EAAA,CAGN,oBAGF,EAAgBy/C,WAKjBp+C,YACW43B,EAAA,CACH3rB,mBACY,CACd2xC,MACF,EAAE59C,WAEDrB,CAAU,EAAAb,EAAA,QACXshB,MAAA,eAAApf,CACE,IAAAlC,EAAA,SAAAshB,EAAA,cAE2CkC,qBAAI,UAAAjrB,EAAAolD,GAAA2D,CAAA,SAAA+C,EAAA,GAAAtqB,CAAA,CAAA9S,EAA7C,EAAY,KAAAu6B,IAAwCxhD,EAAA4kB,EAAA,CAAC,SAAAtD,EAAAvH,GAAA,SAElD,KACLgqC,GAAYltD,CAAA,CAAoBqL,EACoB,SAC7C,CAAAlC,EAAAa,EAAA,CACD,eACA,EAAAygB,EAAA,SAGXkgC,cACD,CAAAt/C,GACEof,QAAS,KACQ,SAAAthB,EAAA,QACb+jD,2BACF,SAAA/jD,EAAA85B,EAAA,CAAE53B,GAAA,SAES,QACXof,iBAAApf,CACE,GAA+B,EAE/B,GAAY,CAAoBA,CAC9B,GAAAof,EAAAzqB,GAAA,MAAAM,GAAAmtD,gBAA8B,UAAAtkD,EAAAa,EAAA,MAAQ,aAACb,EAClC,eACD,oBACA,OAGdshB,SAAS,MAAOnqB,EAAY,SAAAmvD,GAAAnvD,EAAA,EAAQ+K,EAC7B,GAACtB,EAAK,OAAU,MACrBZ,kBAAA,SACQ,CAAAshB,EAAAvH,GAAA,CACN/gB,QAAO,KACLutD,GAAU,CACZ,8BAAApvD,EAAA,EAAE+K,OAKN,CAAW,WAAiBA,CACjB,EAGD,OACQ3D,OACDhG,CAAC,aAAa,EAAE,EAEzBsL,cAAe,CACflO,WAAS4C,aAAC,SAAAyH,EAAA85B,EAAA,IAAAjjC,QAAA,CAAqB,IACjC,GAAA+uD,KAAA,2CAAA3uB,GAAA,wDAAAA,GAAA,gBACF,IAAA9/B,EAAA,KAAE+K,EAAA6X,GAEG,SAAM,KACX/Z,IAAAkC,gBACE,KAAA/K,EAAA,CAAkB,CACb,OAERyuD,QACY9oD,EAITwkB,IACiB,QACT,CACF5oB,EACEvB,GACD,UACMhK,EAAG0T,EAAA,CACVgD,YACAxL,YAAKE,eAAC,cAA+B,KACvC,GAAAqtD,IAAA/B,IAAAviC,EAAAvH,GAAA,CACF,aAAE7X,GAEFlC,EAAK,GAAa,SAClBA,GAAAa,EAAA,CAAAqB,WACE,GAAAlC,EAAA,iBAAoBA,EAAA85B,EAAA,CACf,YAEV,EACA,CACJ8rB,CACU,QACQ1C,KAAAljD,EAAA8a,GAAA,KAAAynC,IAAAW,KAAAljD,EAAA+Z,GAAA,CACbkqC,iBAAiB,CACnB,IAAE/hD,MAAA2iD,EAEG,MAAAnhB,EAAA,oBAAA7sC,CAAA,EAAA+lD,GAAA,mBAAMkI,GAAAD,EAAA12C,CAAA,EACXnO,GAAA48C,GAAAtkD,EAAA,EACE,CAAwB,WACnB,CAGC4qD,MAIF,CACI2B,WAGNC,CACAnvD,EACO4C,OAAG5C,GAAAinD,GAAAtkD,EAAA,EAAsB,CAACA,GAAAC,SAAG,EAAAD,EAAA,EAAoB,CACxD,YAEAuL,EACAlO,CACO4C,EACD,SAAAqkD,GAAAt7B,EAAAsD,EAAA,WAAA5kB,EAAAa,EAAA,CAA+B,kBAACtI,sBAChC,cAA6B,KACnC+oB,EAAAsD,EAAA,CACF,UAAA5kB,EAAAa,EAAA,CACF,YAAEqB,IAGAof,QAAApf,SACElC,EAAK85B,EAAA,CAAM,YACX95B,CAAA,CAAAkC,EACE,KAAAqgD,IAAiCsD,IAAA7lD,EAAA+Z,GAAA,SAC5B,UAGTuH,IAAApf,QACO,MAAAwhC,EAAA,oBAAA7sC,CAAA,EAAAkrD,GAAA,iBAACnhD,GAAKikD,EAAA12C,CAAA,EACXnO,GAAA+hD,GAAAzpD,EAAA,EACEzB,CAA+B,WAC1B,CACP,EAAAyB,EAAA,GAOE,WACIusD,CAGNC,EACAnvD,MACEosD,CAAMxpD,UACF,CAA4B,YAACA,MAC7B,CAAwB,WAC9B,GAEAsL,CACAlO,EACQ4C,iBAAG,UAAAyH,EAAAa,EAAA,cAAsB,EAAAb,EAAA,QAAC,SAAAzH,iBAAG,KAAoB,EAAA+oB,EAAAsD,EAAA,UACzD,CAAA5kB,EAAAa,EAAA,CACF,WACF,EAAAb,EAAA,QAAEkC,SAGAof,IAAA,CAAApf,WACO,CAAM,EAAS,CACpBlC,CAAA,CAAAkC,CACE,GAAAqgD,IAAAjhC,EAAA,aAAgC,2BAC3B,CAAArB,GAAA,wBAAAqB,EAAAvH,GAAA,CAGTuH,QAAAsD,IAAA,CAAA1iB,GACElC,CAAW,WAAAyU,CAAA,CACXzU,CAAAkC,EACE,UAAAlC,EAAAa,EAAA,MAA4B,SACxB,EAACb,EAAA,QACP,SAAAA,EAAA85B,EAAA,CAKNxY,WAAA,CAAW,IAEE,OACQA,EAAAP,GAAA,CACD,wBACEtM,KACd,SAAC,CAAAzU,EAAAa,EAAA,CACH,aAAEqB,IAEFlC,OAAK,CAAM,SAAAA,EAAA85B,EAAA,CACX95B,GAAA,SAAAkC,CACE,EAAArL,CAAA,GAAmB,UACd,CAGVgtD,UACCviC,QACS,EACPJ,2BACEhf,YACElC,EAAK,SAAM,CACXA,IAAAkC,WACE,iBAAArL,CAAA,WAAAA,MAAA2vD,EAAAC,GAAA5vD,EAAAsX,CAAA,EAA+Bq4C,EAAA,YAC1B7wD,GAAA2C,EAAA,EAGA,CACE,WACb,EACkB,OACH,CAGA3C,GAAA2C,EAAA,EAET,CACMkuD,WACNA,CACA7wD,EAAS4C,KAAC,EAAc,UAAAyH,EAAAa,EAAA,MAAE,UAC5Bb,SAAY,CACV6D,aAAe,CACflO,WAAS4C,GAAC,KAAuB,IAAAgqD,IAAAsB,IAAAviC,EAAAsD,EAAA,UAAE,CAAA5kB,EAAA8a,GAAA,IAAAwG,EAAAvH,GAAA,CACrC,2BACC,KAEL2K,EAAA,iBAAExiB,QAEFlC,EAAK,QAAM,KAAAyU,CAAA,CACXvS,EACE,UAAAlC,EAAAa,EAAA,MAAqB,OACjB,EAACb,EAAA,QAEV,SAAAA,EAAA85B,EAAA,CAGO+pB,WACV,CAAA3hD,CAEW,CACG,IACVpM,CACE4uB,GAAyB,GACPvB,GACV1O,IACR,CAAAiyC,GAAAC,EAAA,EAAAt0D,EAAA,IACF,CAAAu0D,GAAAC,EAAA,EAAAx0D,EAAA,IAAE6P,GAEG89C,GAAA,CAAA6D,IAAA,CAAAxtB,GAAA,CAAA2rB,IAAA,CAAAnC,EAAAiH,GAAMC,GAAAnJ,IAAAoJ,GAAA75D,GAAA,QAAM,GAAAA,EACjB6S,cAAA,eAAAkC,MACE,QAAA+kD,EAAA,QAAAC,CAA0B,IAACtrB,GAAAzuC,EACtB,UADsB,YAAAyuC,GACtB,KAAAzuC,EACEyP,GAAAzP,EAAA,oBAEdyP,IAAAunD,GAAA,iBAAAvnD,EAAA,IAAAA,GAAA,uCACDzP,EAAA,iBAGJ05D,IACA,YAAOH,CACD,EAAmBG,EAEnBG,GAKN,EAGY75D,iBAGJ,CAAM,EAAE85D,OAASC,QAAQ,UAAgB,IAEzC,aAAa/5D,GACb,OAEEg3D,QAIFh3D,iBAAiB,CACG,GAEhBiE,GAAG61D,WACH51D,GAAG61D,oBACL,QAAAC,EAAA,GAEDC,GAAAp1D,GAAA,OAAA+yD,GAAA,CACD4B,UAAyB,GAIlBU,GAAAr1D,GAAA,IAAAmzD,GAAA,CACXmC,QAAcH,EAAA,GAEII,GAAAv1D,GAAA,0BAEtB,IAEMm1D,MAAiBlC,EAAA,MAAaL,KAC9B4C,KAAkBvC,GACbkC,UAELC,CACKD,YACV,QACuB,EAAAvjC,GAAKuhC,CAClBgC,CACV,CACKI,IACJ,EAGQ,CACItC,oBAEJtvD,MACW4C,CACL,UAA+B,KAAQ,GAACA,eACxC,EAAAkvD,GAAAz1D,GAAA,IAAA7E,GAAA,OAAAu6D,EAAA,iEAAAA,EAAyBlkC,CAAI,MAAAmkC,EAAAD,EAAA,gDAAQ,GAAAC,EAAAx6D,EAAC,gBAC5C,EACFw6D,EAAA,aACW,MAAAC,GAAAF,EAAA,sDACZE,KAELz6D,EAAA,qBAC6Bo3D,QAGzBkD,CACJ,CAGA,GACQE,GAA6BnlD,SAEnC,EAAAqhD,GAAA,UACAgE,GAAmBpb,GAAA,UAAAqb,GAAA,KAAAjpD,GAAA,EAAAA,EAAA,cAAA+4C,GAAA/4C,EAAA,cACjB1R,GAAkBsa,GAAA,KAClBkgD,OAAoB,kBACfI,EAAA,GACCH,kBAAkCplD,QAGxC,IAAA3D,EAAwB,mBACtB1R,MAAEyE,GAAgBm2D,EAAA,UAAA9sD,OAAA,oBAAA4D,EAAA,aAClB+oD,QACFG,EAAA,MACF,MAAAlpD,EACF,SAAA3J,CAAA,EACD,EAMK2yD,EACJpb,mBAKA,CAAI,QACkB,EACIvpC,QACpB,QAAA8kD,CACJ,IAAMv9C,SAGN,qBAAkBu9C,EAAA,IAAA9yD,OAAA,aAChB6yD,YAAiB,CACflpD,oBACAmpD,mBAAW,EACbtjC,EAAC,cACI,IAAA7lB,EAAA,YACLkpD,OAAiC,CAEpC,EACMA,oBAAmBlpD,mBAAOmpD,mCAAQ,EACvC1mC,MAAA,cAEEziB,EAAA,IAAsD,GACtD/I,GAAgBgyD,GAAAxJ,EAAA,GACdnxD,GAAiBsa,GAAA,WACjBta,MAAkB,EAAAu0D,GAAAC,MAAA/lB,EAAAnnB,EAAA,sBAAAmnB,EAAA,OAAA6kB,EAAA,mBAAAF,CAAA,CAClB77B,KAAsBi9B,GAAApN,GAAA9/B,EAAA,sBAAA8/B,GAAA,GAAAkM,EAAA,mBAAAF,CAAA,IAAA0H,GACTh6D,OACLqwD,mCACR,CAAAkB,EAAA0I,GAAAzI,EAAAiC,EAAAX,GAAAO,CAAA,GACF6G,GAAA1gD,GAAA,KA2BH,MA1BgBxZ,kDA0BY65D,CAxB0C,iBAEtE,KAAAh3B,CAAA,EAsB4Bg3B,SAEzBI,WAAyBp3B,CAAA,EAE1B,GAAAozB,EAAExC,GAAsCjtC,MAI3CitC,QAQElC,cAEA/S,MACCiV,KACcA,EACfX,GAAejwB,CAAA,GAEnB,OAEEo3B,MAMIC,cAA2B,EAAMzG,GAAAC,IAAA3hD,EAAAooD,GAAA,CAEnC3G,MAUA,CAAO,EAAAngC,EAAA,WACT,qBAAAi/B,EACA,IAAsBj9C,GAAA,OAChB+kD,aACF,6BAA0B,oGAAA/kD,EACxB4gD,MACFA,MACKmD,GAAAiB,CAAA,EACTf,GAAAe,CAAA,EAGAztD,IAEA2xC,CAUF,EACetqC,SACS,KACHq+C,gNAEjBj/B,aAAAmhC,GACE,cAAoBlC,cAElB4D,GADa,CAAA6C,IACb7C,UAAoB7gD,OAKpB,MAAMglD,EACJhlD,SAAMkb,QACJ,KAEJgpC,MAAYrD,GAAA,iBAAAvnD,CAAA,IAAAA,EAAA,4CACZwqD,MAAYmB,GAAA3sB,GAAA,kCAAAA,GAAA,aACZyrB,KAAY,qBACZE,KAAY,CACZE,aACF,EAAAc,EACS,IAAAtxB,GAAAktB,GAAA,gBAAAltB,GAAA,SAAAuxB,IACF,OAWLr7D,EAAA,eAAsB,EACtB05D,GAAe,CAEf,YAAex3D,CAEbuN,EACAunD,UAMIoE,WACN,EACQ,kBAAEC,KAAeD,GACvB,EACE,GAAAvB,GAAAF,GAAA,KACF,UAAAE,IAAAhnD,EAAAmT,GAAA,CACF,IAAAs1C,GACAt7D,MAAiBu5D,GAAA,cACG,GAAAE,GAAA,QACLz5D,GAAA,YAAAw5D,GACNM,sBACAC,qBACP3S,IAAAtd,GAAA2E,EAAAuoB,GAAA,sBAAAvoB,EAAA,oCAAA3E,EAAA,cAAAsd,GAAA,KAAAtd,GAED,EACD0vB,QACF,oBACKK,EAEJA,eACChnD,CACOyoD,OAED7B,aAEFD,sBAEIx5D,gCAAuB,YAAvBA,eACFg3D,CACF,EACF,gBACA1wC,mBAAQoM,GAAA,iBACW3mB,GACnB,SAAA4sD,EAAA,GACgB7F,GAAAn/C,IAAA,MAAAu1B,GAAA,CAAA+S,GAAA,CAAA4Y,IAAA,CAAAnC,GAAAv+B,EAAA,aACP,kBAAAolC,KAAA,8BAAAgC,GAAA,SAEG,CAAA1oD,EAAA2oD,GAAA,CACV,SACA7yD,QAAe,EAEf,CACF,WACS,GAEK,IAAAwC,EAAA,EAMhBwI,CAMW,WAGF4nD,CAAWxmD,EAGdpB,MAAK,eACLC,eAAKxI,aAAE,QAAAwtD,EAAA,GAAA/lD,EAAA2oD,GAAA,CAAO,SAAC,QAAAzH,GACfhxD,MAAGqI,KAAE,CAAA1B,GAAA,QAAO,CAAC,EAAAyB,EAAA,EAER,CACI,WACAytD,EAEX/lD,EACEc,IAAK,CAAAxI,EAAA,EAELyI,CAAOxI,WAAC,GAAAD,EAAA,GAAOC,WAAE,IAAQ,yBAAC,KAAE,QAC5BrI,SAAKqI,aAAC,QAAAwsD,EAAA,GAAA/kD,EAAA,UAAM,cAAC,MAAAzH,IAAE,CAAA1B,GAAA,QAAO,CAAG,EACzBmK,MAAM,oBACNJ,QAAKzT,GAAA,CACIA,EAAA,iBACFg0D,oBACE4D,IAEX/kD,UAAA,CACO,QAAA7S,EAAA,eACAoL,cAAE,iBAAA1B,IAAA,EAAM,SAAC,EACR8vD,GAAA,gBAEJx5D,SAAiB6S,EAAAa,EAAA,CACjB1T,KAAkB,QACE,aACPmL,EAAA,EAEX,CACO,WACI,EACN,EACE,GAETquD,oBAAkC,CACpC,qBAAEzkD,cAEGlC,EAAAa,EAAA,OAAM,cAAa,kBAAOtI,QAAE,CAAM,WAAC,CAAG,EACrC,EAAC2oD,IAAAlhD,EAAAa,EAAA,CAGdC,MAAS,YACG,aACRkgD,SACOhgD,IAAM1I,EAAA,EAA4B,IAAOC,SAAE,IAAA6oD,IAAAphD,EAAAa,EAAA,CAAS,iBAAC,gBAAG,KAG9Db,IAAMgB,IAAM1I,EAAA,EAA8B,IAAOC,SAAE,IAAA0pD,IAAAjiD,EAAAa,EAAA,CAAO,YAAC,WAAG,KAG9Db,IACEgB,IAAM1I,EAAA,EAED,IACFC,SAAE,IAAY,GAAAuI,IAAA,KAAAd,EAAA,KAAC,KAAA6gD,EAAC,SAIrB7gD,KAAK,MAAO,IAAAwjB,CAAA,WAAWr2B,GAAA,CAAM2T,EAAK,iBAAI5Q,kBAAGqI,iBAAE,QAAAkc,EAAA,iBAAAtG,CAAA,CAAS,EAAC,SACtDnO,EAAA4b,GAAA,CAGJ9a,IAAS4iB,GACRD,EACQo9B,WACG,SAAA7kD,EAAA,CAET+E,CAAe,WACC,CACd5T,MAAiB,YACjBA,SAAkB,CAAAm0B,EAAA,OAClBoD,MAAOC,OAAc,UACVlQ,EAAO0O,QAChBhV,kBACF,SAAAnO,EAAAkjB,GAAA,CACF,QAAAzO,EAAA,QAAEvS,sBAE2BuhB,QAAa,SAAAogC,EAAA,CAAgB7nD,EAAM,MAAA8E,IAAA,MAAAkhD,GAAAhiD,EAAA,QAGpEshB,MAAA,qBAAW,SAAAthB,EAAA85B,EAAA,CAAW53B,WACpB,CAAW,EAAMA,MACflC,IAAA,CAAAopC,GAAA,CAAAyW,EAAAv+B,EAAAlE,GAAA,CAAMpc,GAAMmN,EAAA,IAAAA,CAAA,MAAAtX,CAAA,SAAAA,CAAA,GAAWqL,QACrBlC,GAAS,YACSmjB,+CAGhBE,EAAUwgC,iBACX12D,EAAA,kBAWa2yD,GAAA,MAAAA,EAEbkC,KACa6E,GAAA,CAAoB3kD,UAC9B43B,CAAA,QAAA3sC,EAAA,aAAqB,EAErBgK,MAAQk/B,MAEJloB,UAAW,aACLhhB,CACR,CACEA,EAMAw5D,GAAA,IACF,EACAx5D,MAAiB,QAAAu5D,KAAAE,IAAA,MAAAA,GAAA,0BACjBz5D,SAAkB,CAAA86D,IAAA,CAAAE,GAAAnoD,EAAAa,EAAA,CAClBi/C,gBACoB,aACPxnD,EAAA,EAEX,CACO,YACI,QACN,aAAAyoD,EACN,CACD4F,CACF,QAEED,cAAuC53C,uBAKxCm5C,CAAoBE,EAEjBvnD,IAAKrI,EAAAolD,GAAA2D,CAAA,GACLxgD,KAAK,UAIFvI,kBAAE,kBAAA89B,GAAA,CAAA+S,GAAAppC,EAAAa,EAAA,cAAAkgD,aAAmB,IAAAzoD,EAAA,EAGtB,CAGJgpD,WAGI1gD,CACKrI,CAA4B,EACjCuI,CAAK,GAQPwgB,EAAA,+BAAAggC,IAAA,UAAAA,IAAA,UAAAhgC,EAAAsD,EAAA,WAAA5kB,EAAAa,EAAA,MAAAiuC,GAAAwS,CAAA,MAAA/oD,EAAAolD,GAAA2D,CAAA,qBAAAthD,EAAAknB,GAAA,UAAAy7B,GAAA,oBA4CNrhC,CAAA,GAAAggC,IAAY,UAAAhgC,EAAAsD,EAAA,aACT08B,OACCp/C,4BAEItB,cAAmC,GACnC1Q,QAAiC,EACzB,MACT,CAAK,IAAAuvD,GAGGz/C,EAAA4kB,EAAA,UAAW+9B,kBAAsB,+BAAU,CAAA3iD,EAAAa,EAAA,CACpD,cACN,SAEU,EAAAb,EAAA85B,EAAA,CACd53B,YACa,QAAqBA,IAC9B,mBAAAq+C,CAAA,MAAAE,EAAA,mBAAAF,CAAA,UAA6B,EAC1B,GAAK,EAAAmB,GAAA,EAAAqB,KAAA,EAAAvW,IAAA,CAAApW,GAAA,KAAAU,GAGZ2oB,QACAv9C,MAEIof,OAAKtgB,MAAM,qBAAqBkB,SAAA,CAC9BlC,EAACa,EAAI,CAACD,KAAK,UAAc,IAAAZ,EAAAkjB,GAAA,CACzBljB,QAAA+iD,GAAAlsD,WAAAmwB,MAAA,GAAAC,EAIM,CAAE,IAAAjnB,EACA,aAGR0hD,qBAEDlV,IAAA6U,GAAE7U,cACApW,MAAeU,GAAY,qBAAAwsB,GAAA,kBAC1B,2BAAsB3B,YACxB,OACArgC,IAAAi+B,IAAA,CAAKv+C,wBAAMwjD,GAAA,CAAoBtiD,EACxB,SAAMi+C,GAAAmC,GAAAhhC,EAAAsD,EAAA,CAAO,SAClB5kB,IAACkjB,IAAQ,EAAAm+B,KAAA,CAAA8B,IAAA7hC,EAAAsD,EAAA,CACPzB,SAAS4/B,iBACT50C,oDACK,KAAAmwC,GACL,WACC,IAAAsK,GAKb5oD,iBAAAzH,EAAAumD,EAAA,EACS,UAAA9+C,EAAA+hB,GACUs/B,CAIjB,KAAA7U,GAEGqX,gBACqC,CACtC,EAAAviC,EAAA,UAGD6+B,yDACCiD,GAAA,gBAAAlhD,KACG,iBAEK/U,GAACq/C,CAEOr/C,EAAA,iBACAmxD,oBACF8E,IACCwF,qBACLzF,IAAgCjhD,OAEhClC,EAAU,cAAAnJ,CAAA,IAAuC6tB,EAAG,SAAA7tB,CAAA,KAGxDssD,KACSz+B,EAAA,cAAA7tB,CAAA,MAKL1J,EACAA,SAAkB,CAAA6S,EAAAa,EAAA,CAClB,KAAiBuiD,GAAA,sBACR1+B,YAAkB,EAEhBA,CACT,WACK,CACEmkC,MAEEC,CACT,WACF,EACF,EAAE5mD,EAEG,CAACtB,OAAiC,kBAAA6rC,GAC3Bl0C,YAAG,OAAA1B,EAAA,SAAAsX,CAAW,KAAA2iB,GAAA9wB,EAAA,aAACzH,qCAAG,SAAAyH,EAAAo+C,GAAA,MAAA3pC,EAAc,SAAAtG,EAAC,YAAAkoB,CAAA,CACvC,CAAC,CACT,CAEJr2B,CAAoB,CAClBysC,OACA6R,qBACAyK,SAAQlyD,UACRsX,gCAED,KAAE2iB,GACU,WAAmCk4B,OAAW9mD,iBAC3C3J,EAAAumD,EAAA,EACVT,SAAM5pC,OACNtG,eACAkoB,QACD,OAAArU,EAAA,CAEJ,EAGHV,UAEIA,EAAA,OAAApf,wBAEIlB,SAAM,CAAAhB,EAAAa,EAAA,CACAy9C,gBACF,MAAAt+C,EAAA85B,EAAA,CACC8uB,YACL,EAA8B,CAAE1mD,aAEhC,CAAAA,8BACYkhD,GAAA,qBAAO5W,SAAaxqB,YAAe70B,EAAE,iBAC9CA,EAAA,kBAEqBkpC,IACb,OAAA3R,EAAA,SAAA7tB,CAAA,EAAiBqL,IACf,OAAAwiB,EAAA,cAAA7tB,CAAA,IAA4C6tB,EAAA,SAAA7tB,CAAA,KAGzDssD,KACSz+B,EAAA,cAAA7tB,CAAA,EACS,IAId1J,EACAA,SAAkB,CAAA6S,EAAAa,EAAA,CAClB,KAAiBuiD,GAAA,sBACR1+B,YAAkB,EAEhBA,CACT,WACK,CACEmkC,MAEEC,CACT,WACF,EACF,EAAE5mD,EAEItB,gBAAiC,OACtCwiD,UAAW7qD,OAAG,iBAAAA,EAAAumD,EAAA,QAAAtS,IAAA,CAAA4W,GAAA,UAAW,UAAApjD,EAAAo+C,GAAA,CAAC,KAAA7lD,aAAG,YAAA89B,CAAA,GAAAr2B,EAAAipD,GAAA,CAAc,GAAApyD,EAAC,SAAAsX,EAEhD,MAAA0xC,CAAA,CAGJ,EACC,GACQ,EAAAhlD,IAAAmF,EAAAmpC,GAAA,CACNz3C,KAAKs3D,GACL,KAAAnuD,GACA2I,SAAwB4lC,GAAA,CAAAkX,GAAe,CAAOjkC,EAAUna,SAExDlC,GAAY,CACVq+C,EAAM5pC,kBACNtG,EACAkoB,YAED4yB,EAAa,iBAAApuD,GAAA,iBAAAquD,GAAA,CAACryD,qBAAQsX,aAA2B0xC,EAGrD,SAAEhlD,GAEOyjD,wCACNzjD,UACUuuC,UAAakX,GACA,SAAAC,CAAA,OAAA2I,CACrBxkC,CAAOi8B,WAASJ,CAAa4I,CAC/B,CAESzlB,QAAS0lB,KAEb7pB,GACuBzO,CAAA,GAAAs0B,IAAAjlB,KAAAngC,EAAA8hC,GAAA,CACf6e,mBAAsBuI,GAC/B,KACCjG,KAAa,CAAAxD,EAAA,eAAEnB,GACpB,aAAA6D,GACA9Y,QAAuB50B,CAAA,CACdivB,OAAS0lB,IACb3L,CAAQ5iD,IACK,QAAAwoD,KAAA,YAAA/hC,EAAA,UACZupB,uDACF,KACCwe,SACQ1I,YAAsBuI,KAC/B,QACCjG,GAAa,CAAC91D,EAAC,iBACpBA,EAAA,kBAGAuyD,YAKkCiE,iBAElBrF,qBAEhBzoD,EACD,SAEDwgC,KAEA,CAGW,KAAAitB,GAAA,WACc,WAEhB,OAAAA,GAAAhrD,EAAA,GAGDzJ,GAAe,QACjB1B,CACA,EAAAmL,EAAsB,EAEtB,CACSwwD,WACT,EACF,CAAE5mD,QAEG,SAAAuqC,GAAA,WAAAoX,IAAApE,GAAA3+C,IAAA,KAAAd,EAAA,OACHY,8BAAkD,SAEnD0iD,OAAgB/qD,kDAAG,SAAAyH,EAAA83C,GAAA,CAAAjhD,QAAW,eAACyB,YAAAC,yBAAG,KAAA+lD,GAAAznD,GAAA,IAAAsX,CAAA,MAAAtX,CAAA,IAAA4oD,EAAA,wBAAAvqD,EAAA,IAAY,QAAA0qD,EAAAzyD,GAAAyyD,EAAAzyD,EAAA+H,EAAA2J,EAAA4V,CAAA,SAAC,GAGpD5V,MAGE,GAAWmB,EAAAspD,GAAA,CAAuBpnD,QAE9B,QAA2B2lD,GAA4B3lD,mBAEnDrD,sBACW0qD,GAAA,MACA,2BAAA9c,GAAA,UAAAA,GAAA,2BAAAA,GAAA,sCACU3b,iBACrB9K,QACAtI,YAAQvP,GAGRrY,eAEa8pD,WAGd,oBAAA9uB,GAAA2b,GAAA,WAfa51C,QAoBpBmJ,SAAoB6nD,IAAA,EAAAhpD,EAAA,aAAA3J,EAAA,EACZopD,mDACGuJ,cACT2B,UAAiCtnD,SAG1BqnD,gCACE1qD,EAAA,IAGyC,EAIxC,CAEJA,0GAEAo5C,iBAAaxL,0BAA4B,MAAAgV,GAAA,YAAAA,EAAA,OAAAhtC,EAAA,gBAEvCg1C,GAAAhI,GAAA,YAAAA,EAAA,sBAAAgI,GAAYhd,0DAA4BoU,IAAA,SAEpCvC,IAIA,CAEN5gC,CAGA5nB,YAEawrB,EAAA,OACQn0B,2CAAmB,SAElCkvB,MAEN+7B,gBAAgD,IAAA9/C,EAvBrCzB,EA6BtB,CAQK4qD,YAIAiI,CAEA,GACAv7C,IAAUkyC,MAAgBwD,IAE7BviC,EAAAsD,EAAA,UACH,CAAA5kB,EAAA,OAGL,MAAgBmoD,aACJ,SAAAnG,GAAAhiD,EAAA,QAAoCkC,MAC7ClC,qBAAW,SAAAA,EAAA85B,EAAA,IAAcvhC,WAAE,EAAA+oB,EAAAsD,EAAA,WAAA5kB,EAAA,QAAS,SAAAzH,EAAAolD,GAAA2D,CAAA,EAAC,YAAAhgC,EAAA,KAAK,KAAanqB,GAIzDmqB,gBAAApf,IACElC,sBAAW,UAEK,qBAAA2iD,GAAA,iBAAArhC,EAAAsD,EAAA,CAAoB1iB,SAC9B,CAAAlC,EAAAknB,GAAA,UAAAy7B,GAAqB,eAGvBrhC,EAAA,aAAApf,EAKS3J,SAAiB+oD,CAA4B,gBAC3CnqD,0BAAY,MAAAwrD,GAAA,iBAAa,SAAA0B,EAAA,CAAqB,GAGnD,EAAA7C,IAAAlgC,EAAAsD,EAAWa,CAETvjB,cACElC,KAAaA,EAAAa,EAAA,MACD8hD,aACHrqD,EAAA,EAGT,IAGN,QACQ,CACN6uB,CAAoC,CACpCpmB,gBAAoC,SAEnCsjD,IAAe,MACZ,SAAC,SAAAzB,GAAA,cAERpB,QACClgC,QACOzqB,CAAA,CACa,EAAS3G,SAAGqI,MAAE,IAAQ,MAAA2pD,IAAA,MAAAA,GAAA,SAAAliD,EAAA,OAAC,iCACzCA,GAAA,IAAA2pD,GAAA,MACW,MAAAtkD,EAET8hB,QAAmC,GAAAyiC,GAEjC7F,OACF,UAAAriC,EAAA,EAAExf,EAEDoiD,GACIuF,GAEV,OAAAvoC,EAAA,QACD,4BAAAsoC,GAAA,qBAGappD,eACjB,CAAW,IAAA6E,EAAiBnD,IACV+b,GACR,UAAAyD,EAAA,CAAErc,SAAMsE,EAAgB+X,GAALvqB,kBAAKuqB,CAAcioC,yEAC5C,GAASpnC,GAEP,SACE,QACS,4BACAqnC,GAAA,GAAoB,kBACxB1nD,SAEHlC,GAAYyhB,GAAA,CACLpc,MACAlO,WACLuqB,uBACC,MACG/X,CAAA,EACF,CAGJmgD,CACN,OAAiBxoC,EAAA,QACf,MAAcU,sBACX70B,MAECkY,eAAKmY,GAET,SAAW,CAAAnY,EAAA,IAAAsE,CAAA,CACT,EACE,EAE6B,CACxBzH,WAES,iBACLmD,4BACLlO,GAAWA,gCACgB,SAC1B6I,EACF2J,GAAK,OACFrR,EAAA,EAGZ,CACA,WAEW,CAIN+M,EACG,IAAA/M,EAAA,EAKdgpB,CAAY,WAAwCpf,CACvC,EAAkBA,qBAEzBnB,eAAKxI,SAAE,QAAAwtD,EAAA,GAAO,EAAA/lD,EAAA+gB,GAAA,CAAC,UAAAwjC,GAAA,QACZhsD,qBAAE,UAAAyH,EAAAa,EAAA,eAAU,EAAAb,EAAA,QAAC,SAAAghD,GAAA1oD,EAAA,EAEX,CACEyoD,WACEgF,CACV,EAAAztD,EAAA,GAgBQssD,WACT1jC,CACEhf,CACO,EAACtB,CAAK,CAAQ,EACnBsB,gBAAgB3J,cAAG4/B,GAAA,cAAS;AAAA,EAAAhhC,EAAA,EAACoB,EAAG,GAAO,UAAAyH,EAAAa,EAAA,CAAC,aAAO,EAACb,EAAA,QAChD,SAAAA,EAAA85B,EAAA,CAEJzY,WACW,EAEL8W,CAAY,KACG,WACHssB,IAAA,CAAAzD,IAAA1/B,EAAA,OAAQ,eAClB,UAAAthB,EAAAa,EAAA,CACF,KAAC,QACH,EAAAb,EAAA85B,EAAA,CAAE53B,WAEG,EAACtB,CAAK,CAAO,EAClBsB,iBACE,mCAAmBlC,EAAA2oD,GAAA,CACd,QAAA3H,GACC,OAAA1oD,EAAA,EAKG,CAAQ4J,GAAA,QACN,CACXlC,IAAA,EAA+C,CAC5C,WAERkC,CAED,CAAW,EAAkBA,SAGzBnB,CAAOxI,WAAC,GAAAD,EAAA,GAAQC,WAAE,IAAS,sBAAC,KAAE,SAC9BrI,MAAKqI,gBAAC,IAAO,EAAAyH,EAAA,aAAC1H,mBAAAC,eAAE,QAAA2oD,GAAA,OAAA5oD,EAAA,EAAU,CACpB,WACD,GACE2oD,IAGR,CACE,WAEPjhD,CAAA,CAAW,EAAkBkC,SAGzBnB,CAAOxI,WAAC,GAAAD,EAAA,GAAOC,WAAE,IAAQ,yBAAC,KAAE,QAC5BrI,MAAKqI,cAAC,IAAA0nB,GAAA,4BAAAjgB,EAAA,OAAM,wBAACzH,iBAAE,OAAAD,EAAA,EAAO,CAAG,WACnB,CACD,EAAAA,EAAA,EAEI0sD,CACV,WAEF/kC,CACC,CAAW,EAAQ/d,SAGfnB,CAAOxI,WAAC,GAAAD,EAAA,GAAWC,WAAE,IAAY,wBAAC,KAAE,WACpCrI,QAAKqI,KAAC,EAAAyH,EAAAygB,GAAA,SAAU,8DAACloB,YAAE,sBAAY,8BAAGyH,EAAA,OAClCgB,MAAM,SACNJ,SAAKZ,EAAA,UACIklD,cACV,MAAA5sD,EAAA,EAIK,CAEJQ,WACJ,CACM,EACD,0BACI,SAAAkH,EAAAa,EAAA,CACE,YACXkW,KACE/W,IAAW,IAAA1H,EAAA,EAEF,IACAC,SAAE,IAAM,EAAC,WACRutD,EAAA,CAAmB5jD,EAEpB,GAAM,GAAY,KAAA4hD,IAAOvrD,kBAAEpL,EAAA,SAAAA,EAAA,eAAA42D,GAAA,GAAO,WAAC/jD,EAAE+pD,GAAA,UACpCjG,GAAA,SAAA31C,EACL,mBAGN23C,IACKpiB,EAAA,oBAAAogB,EAAA,iBAGb,mBAEAA,GACD9jD,EAACiC,QACiB,yBACV9U,CACF42D,EAEF,KAAAC,IAAAhkD,EAAAiC,GAAA,CACF,QAAA9U,GAAA,CAAE+U,WAEY/U,EAAA,eACF22D,MACV31C,EAEE,SAAAnO,KAAgB2gD,CAClB,KAAAlsC,EACAtS,WACE4hD,aACAI,MACF,EACD,EACI,CAER,CACO,GAEF,CAAIh3D,CACF82D,CAAkB,SACpBqF,GAAA1zD,EAAA,CACF,MAAEsM,UAES,SAAAA,EAETiM,wBAEE81C,IACF,OAAAl1D,GAAA,CAAAy6D,EAAAtnD,EACDof,EAAA,gBAEJ,iCACO,CAAApf,EAAAlC,EAAA,cACE,KAAAgmB,EAElB,WAEA,UACE,CAAM,GAAEj3B,EAASmT,SAAU8jB,MAAMwjC,MAAoB5zD,mBACrD,SAAA0oD,EACA,OAAAyK,EACU/nD,UAAM,EAAuBpL,EAEvBowB,aAAgBgkC,EAAAr4D,IACzB63D,qBACU,KACP,IAAAz3C,EAAA,KAEZ,MAEA,YAAAupC,EACQ,WAAAzF,CAAA,EAAEpJ,UAAkB6R,4BAAUyK,MAAqBnzD,kBACnDq0D,2BAAwC,SAAAl4C,EAAA,CAExCi4C,UACN,QAIUA,EAAA,SAAE1O,yCAAazF,CACrB,MACAqU,IAAqB,CACvB,UAAA5oC,EAAA,OACA,8BACc1qB,kBAAyB,CACnCspB,MAAS,uBACV,IAAA8pC,EACH,SAAAvd,EAAA,KAAA5tC,EAAA3J,IAAA8K,EAAA,OACA,MAAa,mBACPgqD,WAAqBlS,GAAA,CACXlhD,QACd,KAAA0nD,EACF,OAAAnwC,CAAA,MAAA46C,CAAA,UAAA7zD,EAAA,IACG,CAEL,IACE,KAAAgN,KACEof,EAAA,OAAW,gCAAuBpf,SAChClC,GAAA,OAAW,yBAA4BgqD,wCACnB/rC,CACXjd,MAAM,wBAAkBkB,SAC3BlC,EAAC83C,SAAK,CACJj5C,cACAmnB,MAAMs4B,kBACN5gC,OAAQvP,IAAoB,EAC7B,QAAAhhB,GAAA,CALsC0J,iBAO1C,EAGDyqB,kBAAA,EAAW0oC,EAAA,gBAAyB9nD,EAClC,kBAAW,KAAA8nD,EAAA,qBAAAG,EAAA,IAAAnrC,GAAA,iBACRmrC,QAA0C,CAE7CnqD,CAAa,EAAuBkC,WAClCrB,EAAA,CACO,kBACC,GACmB,GACzB/K,UAAgB,CACd3I,MAAiB,wBACjBA,SAAkB6S,EAAA,UAClBgqD,cACAA,wBACEtyD,WACsB4jD,WAEJ,QACRnuD,GAAA,CACZA,EAAC,iBACHA,EAAA,kBAAE+U,UAEG,QAACtB,EAAK,kBAAc,KAAAopD,EAAA,qBAAAG,EAAA,IAAAnrC,GAAA,QACnB,kBAEVhf,CAAa,EAAuBkC,WAClCrB,EAAA,CACO,mBACC,EACN+9B,CAAmD,GAEjDzxC,GACAA,MAAkB6S,EAAA,OAClBgqD,4BACAA,OACEtyD,iBACsB4jD,MAEJ,EACR,SACX7O,EAAA,KAAA5tC,EAAA3J,IAAA8K,EAAA,QACH,sBAAA9K,IAAAi1D,EAAA,eAAEjoD,MAEG,GAAM,EAAe,CACpB,SACHkoD,GAACjzD,EAAA,QAEXo4B,GAAA,oBAAAp4B,CAAA,mDAGD,SACQkzD,GAAA9+B,EAAA,OACC,0DAAAA,CAAA,EAC4B/qB,SACnC8pD,GAAA,SAAAC,EAGE,OAAA3rB,EAE8D,SAAA18B,CAE/D,WAKX,GAFM08B,GAEN,GAAA3H,GAAA2E,EAAA2uB,GAAA,YAAAA,EAAA,iBAAA3uB,EAAA,gBAAA3E,EAAA,WAAA/0B,EAEA,MAAAsoD,IAAwB,WACtB,OAAOj7B,EAASF,OAKlB,oBAMA,YAA4B/N,EAAA,OAC1B,MAAiB,qBACnB,UAAAthB,EAAAa,EAAA,CAEA,KAAgB,OAAE0pD,SAAS3rB,iBAAQ18B,cAAY,uBAC1BA,CACJ,EAAAlC,EAAImjB,GAAStsB,CACtB2zD,QAAiBA,aAGrB,GAAW,CAAa,CAEtB,CAAW,EAAoBtoD,EACxB,GAAM,EAAY,CACvB,SAAAA,IACE,KAAAu/C,EAAA,gBAAAgJ,EAAAxjC,aACqB,SAAA9Y,CAAUq8C,SAAkB,MAAA/J,EAAEC,GAAAh8B,CAAA,EAAC,UAAA2zB,EAC7C,MAAAt3C,EACD,YAAA9S,EAEP,KAAA4hC,EAET,aAAA66B,EAEA,YAAAC,EAAgBlJ,aAAMgJ,YAAiBf,QAAYv7C,SAAY,MAAAu+B,EACvD+T,mBACA,IAAAtpD,EACJkhD,OACAt3C,WACA9S,WACA4hC,cACA66B,SACAC,IACAC,UAEAv2D,EADAw2D,SACAx2D,WACAe,cAsBF,GArBEs3C,QACAoe,iBACA3zD,kBACA8iB,cACA8wC,MACAzM,KACA0M,MACAT,KACE9I,SASJ,CAAMwJ,CAEAnqD,KAAOoqD,GAAwB,GAErCzK,EAAO0K,cAA+Bh0D,CAAA,SAAI9E,KAE1CN,QAAgB,gBAAA89B,CAAA,EACVo7B,EAAoBr4D,GAAoBw4D,KAC1CC,IACEl+D,GAAA,eAAa,EACPu3B,EAAA,gBAAE7tB,WAAIM,KAAI,MAAA9C,EAChBi3D,QAA0B,EAU9B,EACC,CAACL,CAASve,GAQE6e,KAA2B,EAAAl5D,EAAA,MAEpCm5D,UAA2B/yD,aAAS4/C,GAAA,CACpC59B,eAEiBq+B,EAAApM,GAAA2L,EAAA5S,GAAA4S,CAAA,OACjBlrD,GAAE0B,CAAe69C,EAAA,CAEf7c,QACYk7B,YACZ12D,oFACAe,YACFimB,GAAA,UACF,MAAAE,GAAAF,GAAA,iBAEDmwC,yBACH,GAEA,MAAOC,GAAeC,GAAgB,gBAAIr5D,OACtC44D,GAAYve,UAAmB,EAC3BnhB,mBAAsB,KAC5B,GAAMutB,CAEM,uBACVz9B,GAAU,qBAAAswC,IAAA,CACJ3iB,GAAI,oBAAA2iB,EAAA,EACV,GAIAtwC,GAAesT,eAEf,MAAYtT,CAAOG,CACnBD,CACA,MAAAqwC,GAAkBrwC,GAAoBoT,IAC5B7R,aACN+uC,WACA,QAAAtB,EACF,WAA4B,KACnBuB,QAAc30D,EACFC,cAAoBu0D,SAAK,IAC3C,+BACH,MAAO,aAAAC,GAAA,kBAAAH,EAAA,GAAA3qD,CAAA,GACYua,OACnB,kBAAAy9B,GAAA,OAAAA,EAAA,cAGAj1C,UACF,UAAA7D,EAAA,OACF,mBAEM4rD,iBAA0B,KAGvBlf,GAAA+e,EAAC7sB,QAAsB2rB,SAAiBroD,wBAEpB/K,QACvB9H,oBACI,IAAAy7D,GAAA,GACJ9pD,YAAoB4qD,CAGb,oBAEgB,cACvB,OACSnxC,CAAYvY,EAEV,OAAYA,kBACrB7N,GAAAe,GAAA,8BAAAf,EAAAe,CAAA,iBACgBq2D,CACdp3D,EACAe,iBACQ,sBACCkpD,EAAA,SACK,CAAAh9B,EAAA,KACdpxB,MAAyB,cACzBosB,SAAgB,CAAAtc,EAAA,QACV,eACA3Q,WAAuB,SAClBlC,GAAG6S,EAAA4kB,EAAA,CAAC,aACf,KAAAomC,GAAAhrD,EAAA4kB,EAAA,CACO,SAAA5kB,EAAAknB,GAAA,YAQP,eACD,EAEH5F,EAAA,CAAW,EAAAthB,EAAA,KAAuBs+C,cAASp8C,WACtClB,QAAmBkB,UACpB,GAAMlB,EAAM,WAAUuqB,OAAM,IAAS,OACnB,MAAEt9B,EAAS,SAC1B+8D,IACDpmC,CAAAomC,GAAAhrD,EAAAknB,GAAA,CAAAhlB,SACElC,EAAa,OAAWgrD,SAAoB,GAAS,GAExD,EAEH,EAAS,SAAY/wC,IAAA,QAAOlZ,mBAAamB,EACjC,OAERlC,SAAA,mCAAS,MAAW,qBAAc/R,mBAE7B,CACc,IAAA88D,EAAWC,QAAoB,OAAA51D,EAAS,IAEvD2L,GAAA9S,EAAA,QACA,OACL,OACG,cAEZ,YAA6B,GAAAoG,CAAA,IAAAe,CAAA,EAC3B,CACE,CACQ+B,IAEF,GACE8iB,IAAA,SACGQ,oBAAYvY,UAErB05B,EAAAzkC,EAAA,wCAAAykC,EAAA,GACE5f,GAAK+uC,GACL12D,cACAe,2BACcnH,EACN,SAAA+R,EAAA,gBACD,QAAA+rD,GACG,YACK,CAAkB,CACjC,CAED,CAGL,GAAI9xC,GAAkB,CAAAyyB,EAAA,CAChB,MAAAnhB,GAAW9yB,GAAKiyD,GAElBkB,EAAgBz0D,GAAUo0B,EAAA,EAC1B,OAAavrB,EAAA,KACX,KAAAmrD,GACEh0D,EAAA,OAASg0D,EAAA,kBAAsB1wC,+BAAYvY,mBACzC0pD,EAAA,+BAAcI,EAASD,WAAiB,QAAetxC,EAAA,SACtD6G,EAAA,OAEP,uBACF,UAAAA,EAAA,KAUF,oBACI2pC,SAAmB,CAAA3pC,EAAA,QACfiK,MAAS6+B,SACTwB,cAA0B,MAE9B,OACyBz0D,SACvB9H,eAA+B,CAC3B,SAAAk8B,EAAA,CACG,EACD+yB,iBACF,aACK7jC,aAAYvY,SAErBlC,EAAAknB,GAAA,CAAW,SAAA8jC,EAAgB9oD,OACzBof,OAAA,CAAS,EAAapf,EACpB,GAAMlB,EAAM,KAAQkB,cACb,MAAAnB,EAAM,SAAYA,CAAA,GAAGf,EAAIA,KAAA,MAAOurB,aAAct9B,GAAAy8D,GAAAE,EAAA,SAEnD38D,GAAC+8D,GAAeJ,CAAA,GAAE,EAElB,CAAA1oD,CACe,EAA+B,CAAS,SAAA6nD,GAExD,UAAA1K,EAEH,SAAAlxC,EAAiBpN,4BACT,QAAAoB,CAER,GAAgBpB,aAAsC6pD,WAAW1oD,GAC9DjU,GAA+B28D,gBAC9B,KAAAnqB,EACD,qBACJ,CAEP,IACF,MAAAwrB,EAAA,MAAAC,IACFC,EAAAF,CAAA,EAEAxrB,EAAuB,UACrB4e,OACAlxC,WAC2B,IAC3BhM,MACCmf,EAAA,OACD,GAAM,eACN,MAAoB6qC,QAEpBp6D,SAAgB,GAAAoQ,GAAAnC,EAAA,UACdygC,cACa,oBACP,QAAAt+B,EACIiqD,cACNvoD,SACAsoD,SAGAtoD,GAAQkpB,QACR0T,CACF,EACC,EACF,EAAEnf,EAAA,UAEL,SACE,CAAAthB,EAAA,MAAQ,SAAAA,EAAA85B,EAAA,CAAqB,aAEZ,GAAA0G,IAAA,SAAAxgC,EAAA,KAAe,SAAAA,EAAA85B,EAAA,CAAuB33B,YAAQD,CACpD,GAAMs+B,IAAA,WAAAlf,EAAA,KAAIpxB,SAAGqI,iBAAE,MAAAyH,EAAA85B,EAAA,aAAO,GAAC,KAAG95B,EAAA,QAGnCshB,SAAA,KAAApf,WACE,UAAAlC,EAAA,MAAAkC,SACElC,EAAA,IAAAyU,GAAA,CAAA5d,KAAA,CAA0B,UAAAwiC,CAEf,EAAA5kB,EACXvS,EACE,SAAAm3B,CAAA,EAAAxiC,OAAAyqB,EAAA,MAAoC,qBAG3B,UAAAthB,EAAA,MACXkC,SACGmqD,EAAM,QAAO,SAAAz0B,GAAA+qB,EAAA,CAAI3iD,WAAA,iBAAuB,gBAE5C,EAEH,EAAe,EACZosD,OAAqB,CACpBlqD,SAEU,SAAAiM,EAAEkrB,SAAc5kB,iBAChBkuC,YACN,YACE,GAA0B,EAAczgD,IACtC,CAAAA,CACE,CAAAA,CAC+B,GACf,EACD,CACD,SACVoqD,GAAAjO,EAAAlwC,EAAA44B,EAAA,eACD,SACI,IAAA8Z,EAGPpsC,cACAtG,kBACK,OACLsxC,EAAa,IAAAzjD,EACL,MAAAD,CACG,EACX,GAAAlF,EACA,KAAAgE,EAEP,YAAA2xC,EAEJ,SAAA8R,EAEA,SAAAkD,EAET,UAAAnoB,EAEA,QAAAvI,EACQ,iBAAA2b,EACJtpB,MAAS,OAAAnB,CAEP2B,IACAH,UAEQs9B,GADRl9B,uBACQk9B,qDACR9kD,2BACAD,MACF,GAAAwwD,EACA11D,UACAgE,IACA2xC,WACA8R,iBACAkD,KACAnoB,kBAEAoT,eACAt1C,cACA6qB;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,UAIa0C,cAAoB67B;AAAAA;AAAAA,yBAKpB//C;AAAAA,kBAGC4pC,EAAA,mBAAAA,EAAA;AAAA;AAAA,aAAMj8B;AAAAA,eAAajP;AAAAA,YACnBqhD,MACA/gD,cACN,KAAArP,EACE,iBAAAmoD,GACF,WAAAC,EAEI,UAAAC,GAGRmK,MAGA6J,OAMA,EAAA3tD,EAAA,CAGEhE,YACCojB,GACa,MAAAw6B,EAAA,EAAAtoD,GAAA,GAEMkE,GACZ+1C,mBAAOR,SAAc/O,IAAA,YAAAA,UAAkCzlC,IAAAqjD,IAAA,YAAAA,GAAA,UAAA5d,IAAA,YAAAA,GAAA,QAG/D4xB,GACSjU,IAAAqR,EAAA6C,GAGGlsD,MAIJk4C,GAAAgU,IAAAD,GACJx+D,yBACAkC,sEACAmoD,yEACAC,8CACAC,iCACArhD,oBACA8iB,SACF,OAAIpb,GACE8tD,EAAA,aAAAjU,EAAA,YAAArkD,CAAA,aAAAe,EAAA,UAAAnH,CAAA,yBAAiBwqD;AAAAA,8BAAmBgU,EAAA,YAAAp4D,CAAA,aAAAe,EAAA,qCAAAs3D,EAAA;AAAA,kBAC5BjU,EAAOpkD,eAAmBA;AAAAA,mBAKxCs4D;8BACoCF;AAAAA,kBAEVA,iBACtBr1D,iBACA;AAAA,gBASE6iD;AAAAA,2BAMUhgC,EAAmBA,QAAoB8/B;AAAAA,gBAI1C,WAAA4S,CAAA,WACXA;AAAAA,GAAY,MACM;AAAA,wBACNrO,CAAA,WAAAnnD,CAAA;AAAA,QAAAq1C,EAAA;AAAA;AAAA,yBAEoDA,CAAA;AAAA,gBAE9CggB,CAAA;AAAA;AAAA,YACNA,CAAA;AAAA;AAAA,YAEoDh9B,GAAA7L,EAAAm9B,CAAA,OAAAt9B,CAAA,cAAArsB,CAAA,qBAAAwrD,EAAA,kBAAAA,EAAA;AAAA;AAAA;AAAA,IAKjC,OAAA5a,GAAA6kB,CAAA,EAKjC,SAAAC,IACF,KAAAxO,EAIR,SAAAlwC,EACsBmwC,SAAsB,GAGlC,eAEwB,IAAAuC,EACT,YAAAl9B,EAAA,SAAAC,EAGJ,OAAAk9B,EAAA,IAAA9kD,EAMgG,MAAAD,CAAA,KAAAlF,EAKrH,KAAAgE,EACF,YAAA2xC,EAEA,SAAA8R,EAAsBD,WAAMlwC,YAAUhM,UAAW,iBAAAsqC,EACzC,IAAAt1C,EACJgsB,QAAS,EACPhsB,EACAwsB,UACAC,mBACQk9B,aACR9kD,cACAD,2BACF,cACAlF,oBACAgE,UACA2xC,cACA8R,SACAkD,QAEA1wB,CACA2b,WACAt1C,CACA6qB,EACEq8B,CAEJ,CAAMuO,aAA4BvO,CAClC,SACEr+C,EAAA,MAAQ,SAAAA,EAAA85B,EAAA,CAAmB,aAEvB,CAAa,IAAexY,EAAA,QAAcxrB,SAASqM,KAAQD,SACzDlC,GAAK,MAACY,SAAKZ,EAAA85B,EAAA,IAAOvhC,WAAE,EAAAyH,EAAA,+BAAO,YAAC,QAAA7S,GAAA,CAAGA,EAAA,eAGnC6S,EAAAkC,WACEA,SACElC,CAAA,GAAAnJ,EAAA,eAAwB,SACtB,aAENyqB,GAAA,CAAe,8BAAAsrC,CAAA,EAAI1qD,GACjB5J,EAAA,EACE,CAAuB,WAEzB,EACQ,CACE,UACQA,EAAA,EAEhB,CACI,WAEHs0D,EAEHtrC,CACO,GAEC,UAAAthB,EAAAa,EAAA,CACQtC,gBACV5I,SAAS2C,OAAAC,eAAC,cAAkB,QAACk0C,GAAA,MAAAA,EAAC,SAAAnrB,EAAA,qBACvBn0B,EAAG,KACV0W,SAAQkpB,IAAO,CACfp3B,WAAS4C,GAAC,EAAAyH,EAAA,yBAA0B,SAAAysC,EAAA,IAAA5tC,GAAEmB,EAAA,MACxC,SAAAA,EAAA,KACF,KAAAnB,EAAA,WAAAA,EAAA,IAAEqD,OAEDrB,SAAU,YACXb,SAAAnB,EAAA,WAAAA,EAAA,IAAAqD,CACE,EAAArD,EAAA,GAAkB,EACd,CAAC,CACD,GACP,CAAC,EAAC4tC,WAAkBjsC,qBACnB,CAAA0B,UACElC,EAAA,KAAAkC,SACElC,EAAA85B,EAAA,CAAAjjC,GAAA,SAAgC,EAC/B,EACHmJ,EAAA,MAAIgB,SAAM8/C,EAAA,IAAAv+B,GAAYrgB,EACF+b,MAChB,SACE,CAAAqD,EAAA,WAAApf,YACE,UACE8X,OAAYw+B,YACL,yCACC,EAAAx4C,EAAA,OAAAkC,8BAGP,IAAAqgB,EAAA,QACD,IAAAA,EAAA,aAEP,WACE,YAGS/hB,wBAEd,QAAA0B,EACE,OAAAof,EAAA,QAA6B,cAAAiB,EAAA,eAE/BviB,EAAA,KAAAA,EAAA,KAAAkC,KACiB+b,MACb,gBACE/b,SACEof,GAAApf,cACE,GACEyf,MAAcD,wBACR,SAAA1hB,EAAA,KAERA,OAAA,UACEgB,OAAM,SACNgb,SAAW7kB,GACXjH,SAASqyB,EAAMJ,EAAS,CAClB,YACC,IACC,OACC,OAAAI,EACT,WAEJ,GAAyB,MAAAP,GAAA,MAAAA,EACzBhiB,SAAAshB,EAAA,uBAAenqB,cAAY6I,EAAA85B,EAAA,IAASgzB,QAAQ,EAAC,GAAA9sD,OAI5CuiB,CACC,SACGP,EAAA,IAAIO,KAEUb,eAAkB,CAAAJ,EAAA,oBAAiB,CAAAthB,EAAA,UAAAkC,mBAChD,2CAAwBlC,EAAA,aAG5B,4BACMuiB,EAAA,QACN,IAAAA,EAAA,aAEP,WACE,YAGE/hB,wBAEP,QAAA0B,EACE,OAAAof,EAAA,QAAqB,cAAAiB,EAAA,eAEvBviB,EAAA,KAAAA,EAAA,KAAAkC,KACU+b,MACN,gBACE/b,SACEof,GAAApf,cACE,GACEyf,MAAcD,wBACR,SAAA1hB,EAAA,KAERA,OAAA,UACEgB,OAAM,SACNgb,SAAW7kB,GACXjH,SAASqyB,EAAMJ,EAAS,CAClB,YACC,IACC,OACC,OAAAI,EACT,WAEJ,GAAyB,GAAAviB,EAAM,UAC/BA,CAAA,WAAe7I,kBAAY,CAAA6I,EAAA,cAAiBA,EAAA85B,EAAA,IAAC,UAK3C,GAAAxY,EACG,MAED,YAAeI,eAAkB1hB,EAAA85B,EAAA,IAAiB,SAAA53B,CAChD,GAAAlC,EAAA,eAAwBA,EAAA85B,EAAA,CAAC,GAG7B,SAAE,CACI,KA9BK3X,KA+BX,CAEP,SAAAniB,EAAA85B,EAAA,CACE,YAGT,EAAA53B,SACE,CAAAA,SACElC,EAAA85B,EAAA,CAAA53B,WACE,GAAoB,GACnB,CACHof,CAAA,CAAApf,CACE,CAAAA,UACE,SAAAlC,EAAA85B,EAAA,YAGO,CAAC,CAEV,CAAA53B,cACE,8CAEO,CAAC,OAEVlC,CAAAkC,EACE,aAAAlC,EAGO,KAAC,SAEVA,EAAA,SAAAkC,aACE,IAAArL,QAAA,EAAoD,EACjD,GACF,GACA,CAAC,CAEV,CACE,SAAA8xD,GAAA,SAAAzuC,EAAsB,MAAAvQ,EAExB,MACQzT,EAAA,MAAA6K,EACmB,IAAA7Q,EAAmB,KAAA4Q,EAAA,KAAAF,EAClC,SAAAK,EAEZjB,IAAAkC,UACEA,IACE,UAAmDnB,GAAA,WAAAA,EAC9C,CAAAA,GAAA,GAEJ,OAAA7Q,GAAA,WACJA,EAAA,CAAAA,GAAA,GAIT,MAASy4D,EAAaoE,CAAA,EAAA16D,EAAA0O,EAAA,QACpBmZ,kBACAvQ,eACOzT,GACP6K,YACA7Q,cAEA0Q,YACWosD,EAAA98D,EAAA,QAER0F,WACF0rB,EAAA,UACG,cACM,MAAA2rC,EACV,eAAAnsD,EAAA,cAAA5K,CAAA,IAAAgkB,EAAA,eACI,YACKhqB,IACT/C,EAAA,iBAEMA,EAAA,gBAA4B,EAC5B2I,KAEN/D,EACE,GAAA6D,EACiBmL,eACJ7Q,OACN,KAAA+Q,EACUF,KACJ7Q,UAAK00B,EAAO,CACzB,cAAA5kB,EAAA,SACWe,QAEb,SACE+2B,GAAAnuB,CAAA,EACO,GACEsjD,GACPjsD,CAC0B,CAGxB,SAAAslD,GAAcnvD,EAAA,CACdhK,MAAiB,OACjBA,MAAEyE,EAAgB,UAAAuF,CAAA,EAClBrB,CACF,KAAAo3D,EAAE,SAAA9uC,CACOlc,IAEHtB,sBAAkBK,gDAAeksD,KAAQ,SAC5CxjD,cACDujD,CAAA,EAAAtpC,EAAAtC,EAAAsD,EAAA,CAAA1iB,SAAA,CACG,IACDlC,IAAA,UAAAshB,EAAA,QAAOvgB,MAAO4I,qBAAMzH,SAAE41B,MAAcnuB,CAAK,CAAS,CAAC,EACnD,EACH3J,EAAA,QACK,2BAEZ,SAAAotD,CAEA,GACE,EACA,CACA,SAAMhF,GAAA,CAAE8E,QAAM9uC,CACd,MAAMgvC,EADqBC,MACG,YAAS9M,CAAA,EAEjC,IAAA+M,EAAcC,YACpB,MACErrD,KAGIA,UAGE,EAAAorD,EAAgCprD,KAAWrL,EAAAsX,CAAA,MAAOsG,EAAC,iBAGrDzU,CAAA,UAAAqhD,EAAY,YAAA7U,EAA0B,QACvC,CACD,OAAA/oB,EAEN,aAAAC,EAEA,IAAA1nB,CAAuB,EAAEukD,GAAQ,WAAAe,EACzBb,UACA6M,WACF,SAAAriB,CAEE,EAAAx2B,EAAMtG,GAAJtX,MAAIsX,eAAS,MAAIm/C,UACnB74C,EAAmB5d,GAAY4d,CAAA,IACjBvjB,GAAA65C,EAAA,EAEdyX,EAAA7W,GAAAV,EAAAC,CAAA,EACJmW,kDACA7U,gDACSlrB,EAAA,WAAEmC,oEAAQC,cAAc1nB,uBAAI,SAAK,CAAAgE,EAAA4b,GAAA,CAC1C0lC,SACAxwB,WACAwtB,WACArT,wBACEx2B,QACA4sC,OACA,WAEEmM,SAAQhN,EAAU3pD,EAAY,KAC9B42D,yCAEAviB,QACAsX,YAAwBvX,QAE1BuX,SAAuBxiD,EAAA85B,EAAA,CAErB4zB,WAEN,EACE,CACS,EAAA1tD,EAAA,QAGE,SAAA0tD,CAAA,CACWF,GAAMtrD,IAE1BlC,OAAO,UAAsByjB,EAAkBznB,EAAM,CACrDgE,CAAA,EACQ,CACCytD,SACDnP,aACIp8C,aAGR,SAAAiM,EAAS,eAAA9E,EAA0CqkD,GAAexrD,mBAChEA,QACE,eAAuB,EAAA3J,CAEzB,EAAAgrB,GAAOmqC,EAAcjN,EAAQC,GAAAh8B,CAAA,EAG/B1kB,CAAA,GAAAkC,EAAOurD,QAAqB,CAE1B,OAAAhqC,EACC,aAAAC,EAEb,IAAA1nB,EAEA,MAAAD,CACE0Y,EACA+tC,YACAr0C,qBAEA4xC,IACAF,MACC6N,GAAAlL,GAAA,YAAAA,EAAA,eACKG,EAAA,SAAAtpB,CAAA,EAAE9gC,kBAAgB,CAAAo1D,EAAAC,CAAA,EAAAv7D,EAAA,IAClBouD,KAA+B,KAC/BmN,EAAA,KACAvO,CACJl8B,UAAS,IAAEM,gBAAQC,eAAc1nB,kBAAKD,CAAM,EAC5Cs9B,OACAioB,aACAM,iDACEntC,2BACEo5C,IAAajM,yBACb8L,EAAiBlL,GAAyB,IAAA5mB,EAAA6kB,EAAA,mBAAAF,CAAA,UAAA3kB,EAAA,QAC1C+mB,gBACN,MAAuBpW,OAAW93B,EAAOmtC,eAAgB,gBAAAkM,EAAA,0BAEzD,GAAAzkD,EAGIukD,cAAgBzgE,GAAA,CAElBA,EAAA,iBACaygE,EAAA,GACG,EACdG,GAAQC,EAAA,EACRC,SAAkB,CAAA3sC,EAAA,gCAAA4sC,EAEtB,yBAAArO,EAAA,mBAEA,cACA,SAAaW,OAAiB3pD,CACxBq3D,mDAKAC,QACAh3D,6BAIgB,IAGpB,GACE6J,EAWIqI,6CAGFlc,CAAiB,CACjBygE,YAAgB,CAClB,SAAAF,CAAA,CACsB,GAACxrD,MAEvBof,KAAA,CACsB4sC,SACb,SAAAlyD,CAA8C,CAC5C,EAAAslB,EAAA,QAAIpf,6BAGXlB,SAAM,CAAAhB,EAAA,QACC0tD,wCACSG,EAAA7tD,EAAA85B,EAAA,CACZjrC,GAAe,SACjB++D,WAAgB,CAClB,EAAA5tD,EAAAkjB,GAAA,CAAEhhB,QAEFuS,EAAA,QAAAvS,UACE,GAAsB,EAAAlC,EAAAa,EAAA,CAExBb,KAAA8uC,GAAAwS,CAAA,EAAOoM,aAAsB,SAE/B1tD,CAAa0jB,CAAgBD,CAAkBznB,SAC/CslB,SAAA,CAAAthB,EAAAkjB,GAAA,CAAY,QAAAzO,EAAA,QAAsBvS,UAChC,CAAY,MAAAlC,EAAAa,EAAA,CAAwBqB,KACjC2rD,GACCvM,CAAA,MAAA/oD,EAAAolD,GAAA2D,CAAA,YAAAr6B,QACW,mBAAiB9D,kDAAShV,iCAAqB,cAAA1e,CAAA,CAACq7C,EACzD9qC,GAAK,CACHY,EAAmC,GAAA0gB,EAC9B/oB,EAAiB+oD,CAAW,SAC5B,CAAAthD,EAAAkjB,GAAA,CAAG,QACTzO,EAAA,QAAC,SAAAtG,CAAA,CAEG,EAEPmT,SAAApf,QACWo/C,CAAA,EAACn+B,SAAgBA,IAAShV,SAAqB,EAAE,IAC1DnO,EAACa,GAAI,CACHD,WACA1Q,OAAsBoxD,OAAW,EACjCxgD,CAAK,EAEP,GAAAwgB,EACGm/B,QAGG,MAAsB,yBAA0Bv+C,aACzCof,EAAAsD,EAAA,UAER,CAAA5kB,EAAA4b,GAAA,CACE,IAAAgmC,EAAA,sBAAAA,EAAA,eAGTtgC,SAAAtlB,CAAAkG,OACW,GAACihB,CAAgBA,EAAShV,KAEjCvN,cAAmC,QAC9BrI,GAAiB+oD,CAAWn0D,EACjC2T,SAAK3T,EAAA,eAAAygE,EAEP5tD,EAAa,CAAW2iD,EAAsB,SAAUrhC,EAAA,UACxD,uBACH,MAEHA,QAAA,SAAY,CAAAthB,EAAA,UAAwBkC,KACjC2rD,SACC3rD,oBACS,QACA0/C,MAAel+B,IAA+BD,SACzCznB,KAAI,KACV,QAGK1D,EAAA,EAEZ,CAENq1D,WAEWxgE,CACJA,CACFygE,EAAiB,CACnB,EAAAtsC,EAAA,UACF,UAAAthB,EAAA,KAAEkC,8BAEM,SAAAlC,EAAA85B,EAAA,CAA6B,YAAO53B,CAC1C,CACO,MAAAwrD,CAAA,IACC1tD,EAAA,QACNlK,SAAe83D,KAAmB1rD,SAElClC,EAACa,GAAI,CAACD,IAAKwtD,EAAIl+D,MAAGqI,mBAAE,aAAAq1D,EAAA,GAAO,EAAC,iBAAAr1D,EAAAumD,EAAA,EAAG,SAAA9+C,EAAAo/C,GAAA,CAEjC99B,SAAApf,WACW,SAAuBA,WAC9B,IAAsB,CAAC,EAEV,EAEjB,GAAe,CAAIA,CACZ,CACEksD,SACCt2C,GAAA,KAAAjhB,EACFM,WAEFy2D,SAAiB,IACnB,CACA,IAAA/2D,GAAA,CAAAsX,EAAA,OAAgCjM,MAExBuS,GAAgBtG,SAAyBuyC,GAAAh8B,CAAA,EAAA67B,EAAYC,GAAA3pD,EAAAsX,CAAA,EAAAkgD,EAAE5N,EAAA,aAAAF,CAAA,EAAA+N,EAC3DD,GAAA,YAAAA,EAAA,QAAAl/B,EAAAj6B,EAAAq5D,MAAA,UAAAC,KAAA,MAAAr/B,EAAA,OAAAj6B,GAAA,GAAAo5D,GAAA,MAAAA,EACD,UAAAvnB,EACJ,UAERunB,EAAA,IAAAn/B,GACEnvB,EAAAo+B,GAAA,CAET,GAAAjP,EAAA,SAAAA,EAAA,GAEM85B,cAAqB,CAAGpyD,iDAAIsX,yBAAkB,iBAAA5V,EAAAumD,EAAA,EAAQ,SAAA9+C,EAAAo/C,GAAA,CAC/C,SAAWjwB,EAAA,GAChB,SAAAA,EAAA,SAAE52B,SAAgB,OAAAwuC,EAAA,EAClB0Z,oBACN,CAAMF,CACA8N,aAAoBI,KAC1B,EAII,CACJ,GAEOH,SAAwB,CAAApR,EAAAC,IAAA,CAC7B,MACctmD,SAAsBqL,IAG9Bwb,IACA1c,CACA,OAAA6jD,EAAgC3iD,IAEzB,EAAAi7C,EACOtmD,+BACAsX,gCCprHxB,IAAIugD,GAAI,GAAIC,GAAI,GAChB,KAAOD,MAAOC,IAAOD,GAAI,SAAS,EAAE,EAE7B,SAAS12D,GAAI42D,EAAK,CAExB,QADIpnC,EAAI,GAAIuQ,EAAM62B,GAAO,GAClB72B,KAAOvQ,GAAOmnC,GAAI,KAAK,OAAQ,EAAG,GAAK,CAAC,EAC/C,OAAOnnC,CACR,CCEA,SAASqnC,GAAQpgE,EAAO,CACtB,OAAQ,MAAM,QAEV,MAAM,QAAQA,CAAK,EADnBqgE,GAAOrgE,CAAK,IAAM,gBAExB,CAGA,MAAMsgE,GAAW,IACjB,SAASC,GAAavgE,EAAO,CAE3B,GAAI,OAAOA,GAAS,SAClB,OAAOA,EAET,IAAIw+B,EAASx+B,EAAQ,GACrB,OAAOw+B,GAAU,KAAO,EAAIx+B,GAAS,CAACsgE,GAAW,KAAO9hC,CAC1D,CAEA,SAASoqB,GAAS5oD,EAAO,CACvB,OAAOA,GAAS,KAAO,GAAKugE,GAAavgE,CAAK,CAChD,CAEA,SAASwgE,GAASxgE,EAAO,CACvB,OAAO,OAAOA,GAAU,QAC1B,CAEA,SAASygE,GAASzgE,EAAO,CACvB,OAAO,OAAOA,GAAU,QAC1B,CAGA,SAAS0gE,GAAU1gE,EAAO,CACxB,OACEA,IAAU,IACVA,IAAU,IACT2gE,GAAa3gE,CAAK,GAAKqgE,GAAOrgE,CAAK,GAAK,kBAE7C,CAEA,SAAS4gE,GAAS5gE,EAAO,CACvB,OAAO,OAAOA,GAAU,QAC1B,CAGA,SAAS2gE,GAAa3gE,EAAO,CAC3B,OAAO4gE,GAAS5gE,CAAK,GAAKA,IAAU,IACtC,CAEA,SAAS6gE,GAAU7gE,EAAO,CACxB,OAA8BA,GAAU,IAC1C,CAEA,SAAS8gE,GAAQ9gE,EAAO,CACtB,MAAO,CAACA,EAAM,KAAI,EAAG,MACvB,CAIA,SAASqgE,GAAOrgE,EAAO,CACrB,OAAOA,GAAS,KACZA,IAAU,OACR,qBACA,gBACF,OAAO,UAAU,SAAS,KAAKA,CAAK,CAC1C,CAIA,MAAM+gE,GAAuB,yBAEvBC,GAAwChiE,GAC5C,yBAAyBA,CAAG,GAExBiiE,GAA4B93D,GAChC,iCAAiCA,CAAG,IAEhC+3D,GAAwBtqD,GAAS,WAAWA,CAAI,mBAEhDuqD,GAA4BniE,GAChC,6BAA6BA,CAAG,+BAE5BoiE,GAAS,OAAO,UAAU,eAEhC,MAAMC,EAAS,CACb,YAAYliE,EAAM,CAChB,KAAK,MAAQ,GACb,KAAK,QAAU,GAEf,IAAImiE,EAAc,EAElBniE,EAAK,QAASH,GAAQ,CACpB,IAAIitC,EAAMs1B,GAAUviE,CAAG,EAEvB,KAAK,MAAM,KAAKitC,CAAG,EACnB,KAAK,QAAQA,EAAI,EAAE,EAAIA,EAEvBq1B,GAAer1B,EAAI,MACzB,CAAK,EAGD,KAAK,MAAM,QAASjtC,GAAQ,CAC1BA,EAAI,QAAUsiE,CACpB,CAAK,CACF,CACD,IAAIE,EAAO,CACT,OAAO,KAAK,QAAQA,CAAK,CAC1B,CACD,MAAO,CACL,OAAO,KAAK,KACb,CACD,QAAS,CACP,OAAO,KAAK,UAAU,KAAK,KAAK,CACjC,CACH,CAEA,SAASD,GAAUviE,EAAK,CACtB,IAAI2/D,EAAO,KACPv2D,EAAK,KACLmlB,EAAM,KACNk0C,EAAS,EACTC,EAAQ,KAEZ,GAAIlB,GAASxhE,CAAG,GAAKohE,GAAQphE,CAAG,EAC9BuuB,EAAMvuB,EACN2/D,EAAOgD,GAAc3iE,CAAG,EACxBoJ,EAAKw5D,GAAY5iE,CAAG,MACf,CACL,GAAI,CAACoiE,GAAO,KAAKpiE,EAAK,MAAM,EAC1B,MAAM,IAAI,MAAMkiE,GAAqB,MAAM,CAAC,EAG9C,MAAMtqD,EAAO5X,EAAI,KAGjB,GAFAuuB,EAAM3W,EAEFwqD,GAAO,KAAKpiE,EAAK,QAAQ,IAC3ByiE,EAASziE,EAAI,OAETyiE,GAAU,GACZ,MAAM,IAAI,MAAMN,GAAyBvqD,CAAI,CAAC,EAIlD+nD,EAAOgD,GAAc/qD,CAAI,EACzBxO,EAAKw5D,GAAYhrD,CAAI,EACrB8qD,EAAQ1iE,EAAI,KACb,CAED,MAAO,CAAE,KAAA2/D,EAAM,GAAAv2D,EAAI,OAAAq5D,EAAQ,IAAAl0C,EAAK,MAAAm0C,CAAO,CACzC,CAEA,SAASC,GAAc3iE,EAAK,CAC1B,OAAOohE,GAAQphE,CAAG,EAAIA,EAAMA,EAAI,MAAM,GAAG,CAC3C,CAEA,SAAS4iE,GAAY5iE,EAAK,CACxB,OAAOohE,GAAQphE,CAAG,EAAIA,EAAI,KAAK,GAAG,EAAIA,CACxC,CAEA,SAASg1C,GAAI/H,EAAK0yB,EAAM,CACtB,IAAIlxD,EAAO,GACPqyD,EAAM,GAEV,MAAM+B,EAAU,CAAC51B,EAAK0yB,EAAM3iD,IAAU,CACpC,GAAK6kD,GAAU50B,CAAG,EAGlB,GAAI,CAAC0yB,EAAK3iD,CAAK,EAEbvO,EAAK,KAAKw+B,CAAG,MACR,CACL,IAAIjtC,EAAM2/D,EAAK3iD,CAAK,EAEpB,MAAMhc,EAAQisC,EAAIjtC,CAAG,EAErB,GAAI,CAAC6hE,GAAU7gE,CAAK,EAClB,OAKF,GACEgc,IAAU2iD,EAAK,OAAS,IACvB6B,GAASxgE,CAAK,GAAKygE,GAASzgE,CAAK,GAAK0gE,GAAU1gE,CAAK,GAEtDyN,EAAK,KAAKm7C,GAAS5oD,CAAK,CAAC,UAChBogE,GAAQpgE,CAAK,EAAG,CACzB8/D,EAAM,GAEN,QAASr5D,EAAI,EAAG05D,EAAMngE,EAAM,OAAQyG,EAAI05D,EAAK15D,GAAK,EAChDo7D,EAAQ7hE,EAAMyG,CAAC,EAAGk4D,EAAM3iD,EAAQ,CAAC,CAE3C,MAAiB2iD,EAAK,QAEdkD,EAAQ7hE,EAAO2+D,EAAM3iD,EAAQ,CAAC,CAEjC,CACL,EAGE,OAAA6lD,EAAQ51B,EAAKu0B,GAAS7B,CAAI,EAAIA,EAAK,MAAM,GAAG,EAAIA,EAAM,CAAC,EAEhDmB,EAAMryD,EAAOA,EAAK,CAAC,CAC5B,CAEA,MAAMq0D,GAAe,CAInB,eAAgB,GAGhB,eAAgB,GAEhB,mBAAoB,CACtB,EAEMC,GAAe,CAGnB,gBAAiB,GAEjB,aAAc,GAEd,KAAM,CAAE,EAER,WAAY,GAEZ,OAAQ,CAACxlD,EAAGC,IACVD,EAAE,QAAUC,EAAE,MAASD,EAAE,IAAMC,EAAE,IAAM,GAAK,EAAKD,EAAE,MAAQC,EAAE,MAAQ,GAAK,CAC9E,EAEMwlD,GAAe,CAEnB,SAAU,EAGV,UAAW,GAMX,SAAU,GACZ,EAEMC,GAAkB,CAEtB,kBAAmB,GAGnB,MAAOjuB,GAIP,eAAgB,GAIhB,gBAAiB,GAEjB,gBAAiB,CACnB,EAEA,IAAIkuB,EAAS,CACX,GAAGH,GACH,GAAGD,GACH,GAAGE,GACH,GAAGC,EACL,EAEA,MAAME,GAAQ,SAId,SAASC,GAAKX,EAAS,EAAGY,EAAW,EAAG,CACtC,MAAMC,EAAQ,IAAI,IACZtxD,EAAI,KAAK,IAAI,GAAIqxD,CAAQ,EAE/B,MAAO,CACL,IAAIriE,EAAO,CACT,MAAMuiE,EAAYviE,EAAM,MAAMmiE,EAAK,EAAE,OAErC,GAAIG,EAAM,IAAIC,CAAS,EACrB,OAAOD,EAAM,IAAIC,CAAS,EAI5B,MAAMH,EAAO,EAAI,KAAK,IAAIG,EAAW,GAAMd,CAAM,EAG3ChjE,EAAI,WAAW,KAAK,MAAM2jE,EAAOpxD,CAAC,EAAIA,CAAC,EAE7C,OAAAsxD,EAAM,IAAIC,EAAW9jE,CAAC,EAEfA,CACR,EACD,OAAQ,CACN6jE,EAAM,MAAK,CACZ,CACF,CACH,CAEA,MAAME,EAAU,CACd,YAAY,CACV,MAAAd,EAAQQ,EAAO,MACf,gBAAAO,EAAkBP,EAAO,eAC1B,EAAG,GAAI,CACN,KAAK,KAAOE,GAAKK,EAAiB,CAAC,EACnC,KAAK,MAAQf,EACb,KAAK,UAAY,GAEjB,KAAK,gBAAe,CACrB,CACD,WAAWgB,EAAO,GAAI,CACpB,KAAK,KAAOA,CACb,CACD,gBAAgBC,EAAU,GAAI,CAC5B,KAAK,QAAUA,CAChB,CACD,QAAQxjE,EAAO,GAAI,CACjB,KAAK,KAAOA,EACZ,KAAK,SAAW,GAChBA,EAAK,QAAQ,CAACH,EAAK4jE,IAAQ,CACzB,KAAK,SAAS5jE,EAAI,EAAE,EAAI4jE,CAC9B,CAAK,CACF,CACD,QAAS,CACH,KAAK,WAAa,CAAC,KAAK,KAAK,SAIjC,KAAK,UAAY,GAGbpC,GAAS,KAAK,KAAK,CAAC,CAAC,EACvB,KAAK,KAAK,QAAQ,CAACqC,EAAKC,IAAa,CACnC,KAAK,WAAWD,EAAKC,CAAQ,CACrC,CAAO,EAGD,KAAK,KAAK,QAAQ,CAACD,EAAKC,IAAa,CACnC,KAAK,WAAWD,EAAKC,CAAQ,CACrC,CAAO,EAGH,KAAK,KAAK,QACX,CAED,IAAID,EAAK,CACP,MAAMD,EAAM,KAAK,OAEbpC,GAASqC,CAAG,EACd,KAAK,WAAWA,EAAKD,CAAG,EAExB,KAAK,WAAWC,EAAKD,CAAG,CAE3B,CAED,SAASA,EAAK,CACZ,KAAK,QAAQ,OAAOA,EAAK,CAAC,EAG1B,QAASn8D,EAAIm8D,EAAKzC,EAAM,KAAK,KAAM,EAAE15D,EAAI05D,EAAK15D,GAAK,EACjD,KAAK,QAAQA,CAAC,EAAE,GAAK,CAExB,CACD,uBAAuBoV,EAAM2lD,EAAO,CAClC,OAAO3lD,EAAK,KAAK,SAAS2lD,CAAK,CAAC,CACjC,CACD,MAAO,CACL,OAAO,KAAK,QAAQ,MACrB,CACD,WAAWqB,EAAKC,EAAU,CACxB,GAAI,CAACjC,GAAUgC,CAAG,GAAK/B,GAAQ+B,CAAG,EAChC,OAGF,IAAIE,EAAS,CACX,EAAGF,EACH,EAAGC,EACH,EAAG,KAAK,KAAK,IAAID,CAAG,CAC1B,EAEI,KAAK,QAAQ,KAAKE,CAAM,CACzB,CACD,WAAWF,EAAKC,EAAU,CACxB,IAAIC,EAAS,CAAE,EAAGD,EAAU,EAAG,CAAE,GAGjC,KAAK,KAAK,QAAQ,CAAC9jE,EAAKgkE,IAAa,CACnC,IAAIhjE,EAAQhB,EAAI,MAAQA,EAAI,MAAM6jE,CAAG,EAAI,KAAK,MAAMA,EAAK7jE,EAAI,IAAI,EAEjE,GAAK6hE,GAAU7gE,CAAK,GAIpB,GAAIogE,GAAQpgE,CAAK,EAAG,CAClB,IAAIijE,EAAa,GACjB,MAAMC,EAAQ,CAAC,CAAE,eAAgB,GAAI,MAAAljE,CAAK,CAAE,EAE5C,KAAOkjE,EAAM,QAAQ,CACnB,KAAM,CAAE,eAAAC,EAAgB,MAAAnjE,CAAO,EAAGkjE,EAAM,IAAG,EAE3C,GAAKrC,GAAU7gE,CAAK,EAIpB,GAAIwgE,GAASxgE,CAAK,GAAK,CAAC8gE,GAAQ9gE,CAAK,EAAG,CACtC,IAAIojE,EAAY,CACd,EAAGpjE,EACH,EAAGmjE,EACH,EAAG,KAAK,KAAK,IAAInjE,CAAK,CACpC,EAEYijE,EAAW,KAAKG,CAAS,CACrC,MAAqBhD,GAAQpgE,CAAK,GACtBA,EAAM,QAAQ,CAAC6b,EAAMpc,IAAM,CACzByjE,EAAM,KAAK,CACT,eAAgBzjE,EAChB,MAAOoc,CACvB,CAAe,CACf,CAAa,CAEJ,CACDknD,EAAO,EAAEC,CAAQ,EAAIC,CAC7B,SAAiBzC,GAASxgE,CAAK,GAAK,CAAC8gE,GAAQ9gE,CAAK,EAAG,CAC7C,IAAIojE,EAAY,CACd,EAAGpjE,EACH,EAAG,KAAK,KAAK,IAAIA,CAAK,CAChC,EAEQ+iE,EAAO,EAAEC,CAAQ,EAAII,CACtB,EACP,CAAK,EAED,KAAK,QAAQ,KAAKL,CAAM,CACzB,CACD,QAAS,CACP,MAAO,CACL,KAAM,KAAK,KACX,QAAS,KAAK,OACf,CACF,CACH,CAEA,SAASM,GACPlkE,EACAujE,EACA,CAAE,MAAAhB,EAAQQ,EAAO,MAAO,gBAAAO,EAAkBP,EAAO,eAAe,EAAK,CAAE,EACvE,CACA,MAAMoB,EAAU,IAAId,GAAU,CAAE,MAAAd,EAAO,gBAAAe,CAAiB,GACxD,OAAAa,EAAQ,QAAQnkE,EAAK,IAAIoiE,EAAS,CAAC,EACnC+B,EAAQ,WAAWZ,CAAI,EACvBY,EAAQ,OAAM,EACPA,CACT,CAEA,SAASC,GACPl1C,EACA,CAAE,MAAAqzC,EAAQQ,EAAO,MAAO,gBAAAO,EAAkBP,EAAO,eAAe,EAAK,CAAE,EACvE,CACA,KAAM,CAAE,KAAA/iE,EAAM,QAAAwjE,CAAS,EAAGt0C,EACpBi1C,EAAU,IAAId,GAAU,CAAE,MAAAd,EAAO,gBAAAe,CAAiB,GACxD,OAAAa,EAAQ,QAAQnkE,CAAI,EACpBmkE,EAAQ,gBAAgBX,CAAO,EACxBW,CACT,CAEA,SAASE,GACPC,EACA,CACE,OAAAtlC,EAAS,EACT,gBAAAulC,EAAkB,EAClB,iBAAAC,EAAmB,EACnB,SAAAC,EAAW1B,EAAO,SAClB,eAAA2B,EAAiB3B,EAAO,cAC5B,EAAM,CAAE,EACN,CACA,MAAM9R,EAAWjyB,EAASslC,EAAQ,OAElC,GAAII,EACF,OAAOzT,EAGT,MAAM0T,EAAY,KAAK,IAAIH,EAAmBD,CAAe,EAE7D,OAAKE,EAKExT,EAAW0T,EAAYF,EAHrBE,EAAY,EAAM1T,CAI7B,CAEA,SAAS2T,GACPC,EAAY,CAAE,EACdC,EAAqB/B,EAAO,mBAC5B,CACA,IAAI3I,EAAU,GACVjjB,EAAQ,GACRC,EAAM,GACN9vC,EAAI,EAER,QAAS05D,EAAM6D,EAAU,OAAQv9D,EAAI05D,EAAK15D,GAAK,EAAG,CAChD,IAAI6uB,EAAQ0uC,EAAUv9D,CAAC,EACnB6uB,GAASghB,IAAU,GACrBA,EAAQ7vC,EACC,CAAC6uB,GAASghB,IAAU,KAC7BC,EAAM9vC,EAAI,EACN8vC,EAAMD,EAAQ,GAAK2tB,GACrB1K,EAAQ,KAAK,CAACjjB,EAAOC,CAAG,CAAC,EAE3BD,EAAQ,GAEX,CAGD,OAAI0tB,EAAUv9D,EAAI,CAAC,GAAKA,EAAI6vC,GAAS2tB,GACnC1K,EAAQ,KAAK,CAACjjB,EAAO7vC,EAAI,CAAC,CAAC,EAGtB8yD,CACT,CAGA,MAAM2K,GAAW,GAEjB,SAASx2D,GACPtG,EACAq8D,EACAU,EACA,CACE,SAAAt7D,EAAWq5D,EAAO,SAClB,SAAA0B,EAAW1B,EAAO,SAClB,UAAA/zB,EAAY+zB,EAAO,UACnB,eAAAkC,EAAiBlC,EAAO,eACxB,mBAAA+B,EAAqB/B,EAAO,mBAC5B,eAAAmC,EAAiBnC,EAAO,eACxB,eAAA2B,EAAiB3B,EAAO,cAC5B,EAAM,CAAE,EACN,CACA,GAAIuB,EAAQ,OAASS,GACnB,MAAM,IAAI,MAAMjD,GAAyBiD,EAAQ,CAAC,EAGpD,MAAMI,EAAab,EAAQ,OAErBc,EAAUn9D,EAAK,OAEfu8D,EAAmB,KAAK,IAAI,EAAG,KAAK,IAAI96D,EAAU07D,CAAO,CAAC,EAEhE,IAAIC,EAAmBr2B,EAEnBs2B,EAAed,EAInB,MAAMe,EAAiBT,EAAqB,GAAKI,EAE3CM,EAAYD,EAAiB,MAAMH,CAAO,EAAI,GAEpD,IAAIvoD,EAGJ,MAAQA,EAAQ5U,EAAK,QAAQq8D,EAASgB,CAAY,GAAK,IAAI,CACzD,IAAIG,EAAQpB,GAAeC,EAAS,CAClC,gBAAiBznD,EACjB,iBAAA2nD,EACA,SAAAC,EACA,eAAAC,CACN,CAAK,EAKD,GAHAW,EAAmB,KAAK,IAAII,EAAOJ,CAAgB,EACnDC,EAAezoD,EAAQsoD,EAEnBI,EAAgB,CAClB,IAAIj+D,EAAI,EACR,KAAOA,EAAI69D,GACTK,EAAU3oD,EAAQvV,CAAC,EAAI,EACvBA,GAAK,CAER,CACF,CAGDg+D,EAAe,GAEf,IAAII,EAAa,GACbC,EAAa,EACbC,EAAST,EAAaC,EAE1B,MAAMS,EAAO,GAAMV,EAAa,EAEhC,QAAS79D,EAAI,EAAGA,EAAI69D,EAAY79D,GAAK,EAAG,CAItC,IAAIw+D,EAAS,EACTC,EAASH,EAEb,KAAOE,EAASC,GACA1B,GAAeC,EAAS,CACpC,OAAQh9D,EACR,gBAAiBk9D,EAAmBuB,EACpC,iBAAAvB,EACA,SAAAC,EACA,eAAAC,CACR,CAAO,GAEYW,EACXS,EAASC,EAETH,EAASG,EAGXA,EAAS,KAAK,OAAOH,EAASE,GAAU,EAAIA,CAAM,EAIpDF,EAASG,EAET,IAAI5uB,EAAQ,KAAK,IAAI,EAAGqtB,EAAmBuB,EAAS,CAAC,EACjDC,EAASf,EACTG,EACA,KAAK,IAAIZ,EAAmBuB,EAAQX,CAAO,EAAID,EAG/Cc,EAAS,MAAMD,EAAS,CAAC,EAE7BC,EAAOD,EAAS,CAAC,GAAK,GAAK1+D,GAAK,EAEhC,QAASu5B,EAAImlC,EAAQnlC,GAAKsW,EAAOtW,GAAK,EAAG,CACvC,IAAI0jC,GAAkB1jC,EAAI,EACtBqlC,EAAYlB,EAAgB/8D,EAAK,OAAOs8D,EAAe,CAAC,EAgB5D,GAdIgB,IAEFC,EAAUjB,EAAe,EAAI,CAAC,CAAC,CAAC2B,GAIlCD,EAAOplC,CAAC,GAAMolC,EAAOplC,EAAI,CAAC,GAAK,EAAK,GAAKqlC,EAGrC5+D,IACF2+D,EAAOplC,CAAC,IACJ6kC,EAAW7kC,EAAI,CAAC,EAAI6kC,EAAW7kC,CAAC,IAAM,EAAK,EAAI6kC,EAAW7kC,EAAI,CAAC,GAGjEolC,EAAOplC,CAAC,EAAIglC,IACdF,EAAatB,GAAeC,EAAS,CACnC,OAAQh9D,EACR,gBAAAi9D,GACA,iBAAAC,EACA,SAAAC,EACA,eAAAC,CACV,CAAS,EAIGiB,GAAcN,GAAkB,CAMlC,GAJAA,EAAmBM,EACnBL,EAAef,GAGXe,GAAgBd,EAClB,MAIFrtB,EAAQ,KAAK,IAAI,EAAG,EAAIqtB,EAAmBc,CAAY,CACxD,CAEJ,CAWD,GARcjB,GAAeC,EAAS,CACpC,OAAQh9D,EAAI,EACZ,gBAAiBk9D,EACjB,iBAAAA,EACA,SAAAC,EACA,eAAAC,CACN,CAAK,EAEWW,EACV,MAGFK,EAAaO,CACd,CAED,MAAM5mC,EAAS,CACb,QAASimC,GAAgB,EAEzB,MAAO,KAAK,IAAI,KAAOK,CAAU,CACrC,EAEE,GAAIJ,EAAgB,CAClB,MAAMnL,EAAUwK,GAAqBY,EAAWV,CAAkB,EAC7D1K,EAAQ,OAEF8K,IACT7lC,EAAO,QAAU+6B,GAFjB/6B,EAAO,QAAU,EAIpB,CAED,OAAOA,CACT,CAEA,SAAS8mC,GAAsB7B,EAAS,CACtC,IAAIuB,EAAO,GAEX,QAASv+D,EAAI,EAAG05D,EAAMsD,EAAQ,OAAQh9D,EAAI05D,EAAK15D,GAAK,EAAG,CACrD,MAAM4xC,EAAOorB,EAAQ,OAAOh9D,CAAC,EAC7Bu+D,EAAK3sB,CAAI,GAAK2sB,EAAK3sB,CAAI,GAAK,GAAM,GAAM8nB,EAAM15D,EAAI,CACnD,CAED,OAAOu+D,CACT,CAEA,MAAMO,EAAY,CAChB,YACE9B,EACA,CACE,SAAA56D,EAAWq5D,EAAO,SAClB,UAAA/zB,EAAY+zB,EAAO,UACnB,SAAA0B,EAAW1B,EAAO,SAClB,eAAAmC,EAAiBnC,EAAO,eACxB,eAAAkC,EAAiBlC,EAAO,eACxB,mBAAA+B,EAAqB/B,EAAO,mBAC5B,gBAAAsD,EAAkBtD,EAAO,gBACzB,eAAA2B,EAAiB3B,EAAO,cAC9B,EAAQ,CAAE,EACN,CAgBA,GAfA,KAAK,QAAU,CACb,SAAAr5D,EACA,UAAAslC,EACA,SAAAy1B,EACA,eAAAS,EACA,eAAAD,EACA,mBAAAH,EACA,gBAAAuB,EACA,eAAA3B,CACN,EAEI,KAAK,QAAU2B,EAAkB/B,EAAUA,EAAQ,YAAW,EAE9D,KAAK,OAAS,GAEV,CAAC,KAAK,QAAQ,OAChB,OAGF,MAAMgC,EAAW,CAAChC,EAASiC,IAAe,CACxC,KAAK,OAAO,KAAK,CACf,QAAAjC,EACA,SAAU6B,GAAsB7B,CAAO,EACvC,WAAAiC,CACR,CAAO,CACP,EAEUvF,EAAM,KAAK,QAAQ,OAEzB,GAAIA,EAAM+D,GAAU,CAClB,IAAIz9D,EAAI,EACR,MAAMk/D,EAAYxF,EAAM+D,GAClB3tB,EAAM4pB,EAAMwF,EAElB,KAAOl/D,EAAI8vC,GACTkvB,EAAS,KAAK,QAAQ,OAAOh/D,EAAGy9D,EAAQ,EAAGz9D,CAAC,EAC5CA,GAAKy9D,GAGP,GAAIyB,EAAW,CACb,MAAMD,EAAavF,EAAM+D,GACzBuB,EAAS,KAAK,QAAQ,OAAOC,CAAU,EAAGA,CAAU,CACrD,CACP,MACMD,EAAS,KAAK,QAAS,CAAC,CAE3B,CAED,SAASr+D,EAAM,CACb,KAAM,CAAE,gBAAAo+D,EAAiB,eAAAnB,GAAmB,KAAK,QAOjD,GALKmB,IACHp+D,EAAOA,EAAK,eAIV,KAAK,UAAYA,EAAM,CACzB,IAAIo3B,EAAS,CACX,QAAS,GACT,MAAO,CACf,EAEM,OAAI6lC,IACF7lC,EAAO,QAAU,CAAC,CAAC,EAAGp3B,EAAK,OAAS,CAAC,CAAC,GAGjCo3B,CACR,CAGD,KAAM,CACJ,SAAA31B,EACA,SAAA+6D,EACA,UAAAz1B,EACA,eAAAi2B,EACA,mBAAAH,EACA,eAAAJ,CACN,EAAQ,KAAK,QAET,IAAI+B,EAAa,GACbC,EAAa,EACbC,EAAa,GAEjB,KAAK,OAAO,QAAQ,CAAC,CAAE,QAAArC,EAAS,SAAAsC,EAAU,WAAAL,KAAiB,CACzD,KAAM,CAAE,QAAAM,EAAS,MAAApB,EAAO,QAAArL,CAAO,EAAK7rD,GAAOtG,EAAMq8D,EAASsC,EAAU,CAClE,SAAUl9D,EAAW68D,EACrB,SAAA9B,EACA,UAAAz1B,EACA,eAAAi2B,EACA,mBAAAH,EACA,eAAAI,EACA,eAAAR,CACR,CAAO,EAEGmC,IACFF,EAAa,IAGfD,GAAcjB,EAEVoB,GAAWzM,IACbqM,EAAa,CAAC,GAAGA,EAAY,GAAGrM,CAAO,EAE/C,CAAK,EAED,IAAI/6B,EAAS,CACX,QAASsnC,EACT,MAAOA,EAAaD,EAAa,KAAK,OAAO,OAAS,CAC5D,EAEI,OAAIC,GAAczB,IAChB7lC,EAAO,QAAUonC,GAGZpnC,CACR,CACH,CAEA,MAAMynC,EAAU,CACd,YAAYxC,EAAS,CACnB,KAAK,QAAUA,CAChB,CACD,OAAO,aAAaA,EAAS,CAC3B,OAAOyC,GAASzC,EAAS,KAAK,UAAU,CACzC,CACD,OAAO,cAAcA,EAAS,CAC5B,OAAOyC,GAASzC,EAAS,KAAK,WAAW,CAC1C,CACD,QAAiB,CAAE,CACrB,CAEA,SAASyC,GAASzC,EAAS0C,EAAK,CAC9B,MAAMC,EAAU3C,EAAQ,MAAM0C,CAAG,EACjC,OAAOC,EAAUA,EAAQ,CAAC,EAAI,IAChC,CAIA,MAAMC,WAAmBJ,EAAU,CACjC,YAAYxC,EAAS,CACnB,MAAMA,CAAO,CACd,CACD,WAAW,MAAO,CAChB,MAAO,OACR,CACD,WAAW,YAAa,CACtB,MAAO,WACR,CACD,WAAW,aAAc,CACvB,MAAO,SACR,CACD,OAAOr8D,EAAM,CACX,MAAM4+D,EAAU5+D,IAAS,KAAK,QAE9B,MAAO,CACL,QAAA4+D,EACA,MAAOA,EAAU,EAAI,EACrB,QAAS,CAAC,EAAG,KAAK,QAAQ,OAAS,CAAC,CACrC,CACF,CACH,CAIA,MAAMM,WAA0BL,EAAU,CACxC,YAAYxC,EAAS,CACnB,MAAMA,CAAO,CACd,CACD,WAAW,MAAO,CAChB,MAAO,eACR,CACD,WAAW,YAAa,CACtB,MAAO,WACR,CACD,WAAW,aAAc,CACvB,MAAO,SACR,CACD,OAAOr8D,EAAM,CAEX,MAAM4+D,EADQ5+D,EAAK,QAAQ,KAAK,OAAO,IACb,GAE1B,MAAO,CACL,QAAA4+D,EACA,MAAOA,EAAU,EAAI,EACrB,QAAS,CAAC,EAAG5+D,EAAK,OAAS,CAAC,CAC7B,CACF,CACH,CAIA,MAAMm/D,WAAyBN,EAAU,CACvC,YAAYxC,EAAS,CACnB,MAAMA,CAAO,CACd,CACD,WAAW,MAAO,CAChB,MAAO,cACR,CACD,WAAW,YAAa,CACtB,MAAO,YACR,CACD,WAAW,aAAc,CACvB,MAAO,UACR,CACD,OAAOr8D,EAAM,CACX,MAAM4+D,EAAU5+D,EAAK,WAAW,KAAK,OAAO,EAE5C,MAAO,CACL,QAAA4+D,EACA,MAAOA,EAAU,EAAI,EACrB,QAAS,CAAC,EAAG,KAAK,QAAQ,OAAS,CAAC,CACrC,CACF,CACH,CAIA,MAAMQ,WAAgCP,EAAU,CAC9C,YAAYxC,EAAS,CACnB,MAAMA,CAAO,CACd,CACD,WAAW,MAAO,CAChB,MAAO,sBACR,CACD,WAAW,YAAa,CACtB,MAAO,aACR,CACD,WAAW,aAAc,CACvB,MAAO,WACR,CACD,OAAOr8D,EAAM,CACX,MAAM4+D,EAAU,CAAC5+D,EAAK,WAAW,KAAK,OAAO,EAE7C,MAAO,CACL,QAAA4+D,EACA,MAAOA,EAAU,EAAI,EACrB,QAAS,CAAC,EAAG5+D,EAAK,OAAS,CAAC,CAC7B,CACF,CACH,CAIA,MAAMq/D,WAAyBR,EAAU,CACvC,YAAYxC,EAAS,CACnB,MAAMA,CAAO,CACd,CACD,WAAW,MAAO,CAChB,MAAO,cACR,CACD,WAAW,YAAa,CACtB,MAAO,YACR,CACD,WAAW,aAAc,CACvB,MAAO,UACR,CACD,OAAOr8D,EAAM,CACX,MAAM4+D,EAAU5+D,EAAK,SAAS,KAAK,OAAO,EAE1C,MAAO,CACL,QAAA4+D,EACA,MAAOA,EAAU,EAAI,EACrB,QAAS,CAAC5+D,EAAK,OAAS,KAAK,QAAQ,OAAQA,EAAK,OAAS,CAAC,CAC7D,CACF,CACH,CAIA,MAAMs/D,WAAgCT,EAAU,CAC9C,YAAYxC,EAAS,CACnB,MAAMA,CAAO,CACd,CACD,WAAW,MAAO,CAChB,MAAO,sBACR,CACD,WAAW,YAAa,CACtB,MAAO,aACR,CACD,WAAW,aAAc,CACvB,MAAO,WACR,CACD,OAAOr8D,EAAM,CACX,MAAM4+D,EAAU,CAAC5+D,EAAK,SAAS,KAAK,OAAO,EAC3C,MAAO,CACL,QAAA4+D,EACA,MAAOA,EAAU,EAAI,EACrB,QAAS,CAAC,EAAG5+D,EAAK,OAAS,CAAC,CAC7B,CACF,CACH,CAEA,MAAMu/D,WAAmBV,EAAU,CACjC,YACExC,EACA,CACE,SAAA56D,EAAWq5D,EAAO,SAClB,UAAA/zB,EAAY+zB,EAAO,UACnB,SAAA0B,EAAW1B,EAAO,SAClB,eAAAmC,EAAiBnC,EAAO,eACxB,eAAAkC,EAAiBlC,EAAO,eACxB,mBAAA+B,EAAqB/B,EAAO,mBAC5B,gBAAAsD,EAAkBtD,EAAO,gBACzB,eAAA2B,EAAiB3B,EAAO,cAC9B,EAAQ,CAAE,EACN,CACA,MAAMuB,CAAO,EACb,KAAK,aAAe,IAAI8B,GAAY9B,EAAS,CAC3C,SAAA56D,EACA,UAAAslC,EACA,SAAAy1B,EACA,eAAAS,EACA,eAAAD,EACA,mBAAAH,EACA,gBAAAuB,EACA,eAAA3B,CACN,CAAK,CACF,CACD,WAAW,MAAO,CAChB,MAAO,OACR,CACD,WAAW,YAAa,CACtB,MAAO,UACR,CACD,WAAW,aAAc,CACvB,MAAO,QACR,CACD,OAAOz8D,EAAM,CACX,OAAO,KAAK,aAAa,SAASA,CAAI,CACvC,CACH,CAIA,MAAMw/D,WAAqBX,EAAU,CACnC,YAAYxC,EAAS,CACnB,MAAMA,CAAO,CACd,CACD,WAAW,MAAO,CAChB,MAAO,SACR,CACD,WAAW,YAAa,CACtB,MAAO,WACR,CACD,WAAW,aAAc,CACvB,MAAO,SACR,CACD,OAAOr8D,EAAM,CACX,IAAIyB,EAAW,EACXmT,EAEJ,MAAMu9C,EAAU,GACV+K,EAAa,KAAK,QAAQ,OAGhC,MAAQtoD,EAAQ5U,EAAK,QAAQ,KAAK,QAASyB,CAAQ,GAAK,IACtDA,EAAWmT,EAAQsoD,EACnB/K,EAAQ,KAAK,CAACv9C,EAAOnT,EAAW,CAAC,CAAC,EAGpC,MAAMm9D,EAAU,CAAC,CAACzM,EAAQ,OAE1B,MAAO,CACL,QAAAyM,EACA,MAAOA,EAAU,EAAI,EACrB,QAAAzM,CACD,CACF,CACH,CAGA,MAAMsN,GAAY,CAChBR,GACAO,GACAL,GACAC,GACAE,GACAD,GACAH,GACAK,EACF,EAEMG,GAAeD,GAAU,OAGzBE,GAAW,qCACXC,GAAW,IAKjB,SAASC,GAAWxD,EAAShgE,EAAU,GAAI,CACzC,OAAOggE,EAAQ,MAAMuD,EAAQ,EAAE,IAAKnrD,GAAS,CAC3C,IAAI+2B,EAAQ/2B,EACT,KAAM,EACN,MAAMkrD,EAAQ,EACd,OAAQlrD,GAASA,GAAQ,CAAC,CAACA,EAAK,KAAI,CAAE,EAErCqrD,EAAU,GACd,QAASzgE,EAAI,EAAG05D,EAAMvtB,EAAM,OAAQnsC,EAAI05D,EAAK15D,GAAK,EAAG,CACnD,MAAM0gE,EAAYv0B,EAAMnsC,CAAC,EAGzB,IAAI2gE,EAAQ,GACRxE,EAAM,GACV,KAAO,CAACwE,GAAS,EAAExE,EAAMkE,IAAc,CACrC,MAAMO,EAAWR,GAAUjE,CAAG,EAC9B,IAAI0E,EAAQD,EAAS,aAAaF,CAAS,EACvCG,IACFJ,EAAQ,KAAK,IAAIG,EAASC,EAAO7jE,CAAO,CAAC,EACzC2jE,EAAQ,GAEX,CAED,GAAI,CAAAA,EAMJ,IADAxE,EAAM,GACC,EAAEA,EAAMkE,IAAc,CAC3B,MAAMO,EAAWR,GAAUjE,CAAG,EAC9B,IAAI0E,EAAQD,EAAS,cAAcF,CAAS,EAC5C,GAAIG,EAAO,CACTJ,EAAQ,KAAK,IAAIG,EAASC,EAAO7jE,CAAO,CAAC,EACzC,KACD,CACF,CACF,CAED,OAAOyjE,CACX,CAAG,CACH,CAIA,MAAMK,GAAgB,IAAI,IAAI,CAACZ,GAAW,KAAMC,GAAa,IAAI,CAAC,EA8BlE,MAAMY,EAAe,CACnB,YACE/D,EACA,CACE,gBAAA+B,EAAkBtD,EAAO,gBACzB,eAAAmC,EAAiBnC,EAAO,eACxB,mBAAA+B,EAAqB/B,EAAO,mBAC5B,eAAA2B,EAAiB3B,EAAO,eACxB,eAAAkC,EAAiBlC,EAAO,eACxB,SAAAr5D,EAAWq5D,EAAO,SAClB,UAAA/zB,EAAY+zB,EAAO,UACnB,SAAA0B,EAAW1B,EAAO,QACxB,EAAQ,CAAE,EACN,CACA,KAAK,MAAQ,KACb,KAAK,QAAU,CACb,gBAAAsD,EACA,eAAAnB,EACA,mBAAAJ,EACA,eAAAG,EACA,eAAAP,EACA,SAAAh7D,EACA,UAAAslC,EACA,SAAAy1B,CACN,EAEI,KAAK,QAAU4B,EAAkB/B,EAAUA,EAAQ,YAAW,EAC9D,KAAK,MAAQwD,GAAW,KAAK,QAAS,KAAK,OAAO,CACnD,CAED,OAAO,UAAUn9D,EAAGrG,EAAS,CAC3B,OAAOA,EAAQ,iBAChB,CAED,SAAS2D,EAAM,CACb,MAAMwrC,EAAQ,KAAK,MAEnB,GAAI,CAACA,EACH,MAAO,CACL,QAAS,GACT,MAAO,CACR,EAGH,KAAM,CAAE,eAAAyxB,EAAgB,gBAAAmB,GAAoB,KAAK,QAEjDp+D,EAAOo+D,EAAkBp+D,EAAOA,EAAK,YAAW,EAEhD,IAAIqgE,EAAa,EACb7B,EAAa,GACbC,EAAa,EAGjB,QAASp/D,EAAI,EAAGihE,EAAO90B,EAAM,OAAQnsC,EAAIihE,EAAMjhE,GAAK,EAAG,CACrD,MAAMogE,EAAYj0B,EAAMnsC,CAAC,EAGzBm/D,EAAW,OAAS,EACpB6B,EAAa,EAGb,QAASznC,EAAI,EAAG2nC,EAAOd,EAAU,OAAQ7mC,EAAI2nC,EAAM3nC,GAAK,EAAG,CACzD,MAAMqnC,EAAWR,EAAU7mC,CAAC,EACtB,CAAE,QAAAgmC,EAAS,QAAAzM,EAAS,MAAAqL,CAAO,EAAGyC,EAAS,OAAOjgE,CAAI,EAExD,GAAI4+D,GAGF,GAFAyB,GAAc,EACd5B,GAAcjB,EACVP,EAAgB,CAClB,MAAM74C,EAAO67C,EAAS,YAAY,KAC9BE,GAAc,IAAI/7C,CAAI,EACxBo6C,EAAa,CAAC,GAAGA,EAAY,GAAGrM,CAAO,EAEvCqM,EAAW,KAAKrM,CAAO,CAE1B,MACI,CACLsM,EAAa,EACb4B,EAAa,EACb7B,EAAW,OAAS,EACpB,KACD,CACF,CAGD,GAAI6B,EAAY,CACd,IAAIjpC,EAAS,CACX,QAAS,GACT,MAAOqnC,EAAa4B,CAC9B,EAEQ,OAAIpD,IACF7lC,EAAO,QAAUonC,GAGZpnC,CACR,CACF,CAGD,MAAO,CACL,QAAS,GACT,MAAO,CACR,CACF,CACH,CAEA,MAAMopC,GAAsB,GAE5B,SAASC,MAAYt9C,EAAM,CACzBq9C,GAAoB,KAAK,GAAGr9C,CAAI,CAClC,CAEA,SAASu9C,GAAerE,EAAShgE,EAAS,CACxC,QAASgD,EAAI,EAAG05D,EAAMyH,GAAoB,OAAQnhE,EAAI05D,EAAK15D,GAAK,EAAG,CACjE,IAAIshE,EAAgBH,GAAoBnhE,CAAC,EACzC,GAAIshE,EAAc,UAAUtE,EAAShgE,CAAO,EAC1C,OAAO,IAAIskE,EAActE,EAAShgE,CAAO,CAE5C,CAED,OAAO,IAAI8hE,GAAY9B,EAAShgE,CAAO,CACzC,CAEA,MAAMukE,GAAkB,CACtB,IAAK,OACL,GAAI,KACN,EAEMC,GAAU,CACd,KAAM,QACN,QAAS,MACX,EAEMC,GAAgBt1B,GACpB,CAAC,EAAEA,EAAMo1B,GAAgB,GAAG,GAAKp1B,EAAMo1B,GAAgB,EAAE,GAErDG,GAAUv1B,GAAU,CAAC,CAACA,EAAMq1B,GAAQ,IAAI,EAExCG,GAAUx1B,GACd,CAACwtB,GAAQxtB,CAAK,GAAKguB,GAAShuB,CAAK,GAAK,CAACs1B,GAAat1B,CAAK,EAErDy1B,GAAqBz1B,IAAW,CACpC,CAACo1B,GAAgB,GAAG,EAAG,OAAO,KAAKp1B,CAAK,EAAE,IAAK5zC,IAAS,CACtD,CAACA,CAAG,EAAG4zC,EAAM5zC,CAAG,CACpB,EAAI,CACJ,GAIA,SAAS4J,GAAMgqC,EAAOnvC,EAAS,CAAE,KAAA6kE,EAAO,EAAM,EAAG,GAAI,CACnD,MAAM/jC,EAAQqO,GAAU,CACtB,IAAIzzC,EAAO,OAAO,KAAKyzC,CAAK,EAE5B,MAAM21B,EAAcJ,GAAOv1B,CAAK,EAEhC,GAAI,CAAC21B,GAAeppE,EAAK,OAAS,GAAK,CAAC+oE,GAAat1B,CAAK,EACxD,OAAOrO,EAAK8jC,GAAkBz1B,CAAK,CAAC,EAGtC,GAAIw1B,GAAOx1B,CAAK,EAAG,CACjB,MAAM5zC,EAAMupE,EAAc31B,EAAMq1B,GAAQ,IAAI,EAAI9oE,EAAK,CAAC,EAEhDskE,EAAU8E,EAAc31B,EAAMq1B,GAAQ,OAAO,EAAIr1B,EAAM5zC,CAAG,EAEhE,GAAI,CAACwhE,GAASiD,CAAO,EACnB,MAAM,IAAI,MAAMzC,GAAqChiE,CAAG,CAAC,EAG3D,MAAMitC,EAAM,CACV,MAAO21B,GAAY5iE,CAAG,EACtB,QAAAykE,CACR,EAEM,OAAI6E,IACFr8B,EAAI,SAAW67B,GAAerE,EAAShgE,CAAO,GAGzCwoC,CACR,CAED,IAAIp3B,EAAO,CACT,SAAU,CAAE,EACZ,SAAU1V,EAAK,CAAC,CACtB,EAEI,OAAAA,EAAK,QAASH,GAAQ,CACpB,MAAMgB,EAAQ4yC,EAAM5zC,CAAG,EAEnBohE,GAAQpgE,CAAK,GACfA,EAAM,QAAS6b,GAAS,CACtBhH,EAAK,SAAS,KAAK0vB,EAAK1oB,CAAI,CAAC,CACvC,CAAS,CAET,CAAK,EAEMhH,CACX,EAEE,OAAKqzD,GAAat1B,CAAK,IACrBA,EAAQy1B,GAAkBz1B,CAAK,GAG1BrO,EAAKqO,CAAK,CACnB,CAGA,SAAS41B,GACPtB,EACA,CAAE,gBAAAuB,EAAkBvG,EAAO,eAAiB,EAC5C,CACAgF,EAAQ,QAAS1oC,GAAW,CAC1B,IAAIqnC,EAAa,EAEjBrnC,EAAO,QAAQ,QAAQ,CAAC,CAAE,IAAAx/B,EAAK,KAAAojE,EAAM,MAAAwC,KAAY,CAC/C,MAAMnD,EAASziE,EAAMA,EAAI,OAAS,KAElC6mE,GAAc,KAAK,IACjBjB,IAAU,GAAKnD,EAAS,OAAO,QAAUmD,GACxCnD,GAAU,IAAMgH,EAAkB,EAAIrG,EAC/C,CACA,CAAK,EAED5jC,EAAO,MAAQqnC,CACnB,CAAG,CACH,CAEA,SAAS6C,GAAiBlqC,EAAQnQ,EAAM,CACtC,MAAM+3C,EAAU5nC,EAAO,QACvBnQ,EAAK,QAAU,GAEVwyC,GAAUuF,CAAO,GAItBA,EAAQ,QAAS9wC,GAAU,CACzB,GAAI,CAACurC,GAAUvrC,EAAM,OAAO,GAAK,CAACA,EAAM,QAAQ,OAC9C,OAGF,KAAM,CAAE,QAAAikC,EAAS,MAAAv5D,CAAO,EAAGs1B,EAE3B,IAAI2W,EAAM,CACR,QAAAstB,EACA,MAAAv5D,CACN,EAEQs1B,EAAM,MACR2W,EAAI,IAAM3W,EAAM,IAAI,KAGlBA,EAAM,IAAM,KACd2W,EAAI,SAAW3W,EAAM,KAGvBjH,EAAK,QAAQ,KAAK4d,CAAG,CACzB,CAAG,CACH,CAEA,SAAS08B,GAAenqC,EAAQnQ,EAAM,CACpCA,EAAK,MAAQmQ,EAAO,KACtB,CAEA,SAASpG,GACP8uC,EACAxE,EACA,CACE,eAAA2B,EAAiBnC,EAAO,eACxB,aAAA0G,EAAe1G,EAAO,YAC1B,EAAM,CAAE,EACN,CACA,MAAM2G,EAAe,GAErB,OAAIxE,GAAgBwE,EAAa,KAAKH,EAAgB,EAClDE,GAAcC,EAAa,KAAKF,EAAc,EAE3CzB,EAAQ,IAAK1oC,GAAW,CAC7B,KAAM,CAAE,IAAAokC,CAAK,EAAGpkC,EAEVnQ,EAAO,CACX,KAAMq0C,EAAKE,CAAG,EACd,SAAUA,CAChB,EAEI,OAAIiG,EAAa,QACfA,EAAa,QAASC,GAAgB,CACpCA,EAAYtqC,EAAQnQ,CAAI,CAChC,CAAO,EAGIA,CACX,CAAG,CACH,CAEA,MAAM06C,EAAK,CACT,YAAYrG,EAAMj/D,EAAU,GAAIuY,EAAO,CACrC,KAAK,QAAU,CAAE,GAAGkmD,EAAQ,GAAGz+D,CAAO,EAGpC,KAAK,QAAQ,kBAMf,KAAK,UAAY,IAAI49D,GAAS,KAAK,QAAQ,IAAI,EAE/C,KAAK,cAAcqB,EAAM1mD,CAAK,CAC/B,CAED,cAAc0mD,EAAM1mD,EAAO,CAGzB,GAFA,KAAK,MAAQ0mD,EAET1mD,GAAS,EAAEA,aAAiBwmD,IAC9B,MAAM,IAAI,MAAMzB,EAAoB,EAGtC,KAAK,SACH/kD,GACAqnD,GAAY,KAAK,QAAQ,KAAM,KAAK,MAAO,CACzC,MAAO,KAAK,QAAQ,MACpB,gBAAiB,KAAK,QAAQ,eACtC,CAAO,CACJ,CAED,IAAIR,EAAK,CACFhC,GAAUgC,CAAG,IAIlB,KAAK,MAAM,KAAKA,CAAG,EACnB,KAAK,SAAS,IAAIA,CAAG,EACtB,CAED,OAAOmG,EAAY,IAAoB,GAAO,CAC5C,MAAM9B,EAAU,GAEhB,QAASzgE,EAAI,EAAG05D,EAAM,KAAK,MAAM,OAAQ15D,EAAI05D,EAAK15D,GAAK,EAAG,CACxD,MAAMo8D,EAAM,KAAK,MAAMp8D,CAAC,EACpBuiE,EAAUnG,EAAKp8D,CAAC,IAClB,KAAK,SAASA,CAAC,EACfA,GAAK,EACL05D,GAAO,EAEP+G,EAAQ,KAAKrE,CAAG,EAEnB,CAED,OAAOqE,CACR,CAED,SAAStE,EAAK,CACZ,KAAK,MAAM,OAAOA,EAAK,CAAC,EACxB,KAAK,SAAS,SAASA,CAAG,CAC3B,CAED,UAAW,CACT,OAAO,KAAK,QACb,CAED,OAAOhwB,EAAO,CAAE,MAAAnC,EAAQ,EAAE,EAAK,GAAI,CACjC,KAAM,CACJ,eAAA4zB,EACA,aAAAuE,EACA,WAAAK,EACA,OAAAC,EACA,gBAAAT,CACN,EAAQ,KAAK,QAET,IAAIvB,EAAU1G,GAAS5tB,CAAK,EACxB4tB,GAAS,KAAK,MAAM,CAAC,CAAC,EACpB,KAAK,kBAAkB5tB,CAAK,EAC5B,KAAK,kBAAkBA,CAAK,EAC9B,KAAK,eAAeA,CAAK,EAE7B,OAAA41B,GAAatB,EAAS,CAAE,gBAAAuB,CAAe,CAAE,EAErCQ,GACF/B,EAAQ,KAAKgC,CAAM,EAGjBzI,GAAShwB,CAAK,GAAKA,EAAQ,KAC7By2B,EAAUA,EAAQ,MAAM,EAAGz2B,CAAK,GAG3BrY,GAAO8uC,EAAS,KAAK,MAAO,CACjC,eAAA7C,EACA,aAAAuE,CACN,CAAK,CACF,CAED,kBAAkBh2B,EAAO,CACvB,MAAMy0B,EAAWS,GAAel1B,EAAO,KAAK,OAAO,EAC7C,CAAE,QAAA+vB,CAAO,EAAK,KAAK,SACnBuE,EAAU,GAGhB,OAAAvE,EAAQ,QAAQ,CAAC,CAAE,EAAGv7D,EAAM,EAAGw7D,EAAK,EAAGR,KAAW,CAChD,GAAI,CAACvB,GAAUz5D,CAAI,EACjB,OAGF,KAAM,CAAE,QAAA4+D,EAAS,MAAApB,EAAO,QAAArL,CAAS,EAAG8N,EAAS,SAASjgE,CAAI,EAEtD4+D,GACFkB,EAAQ,KAAK,CACX,KAAM9/D,EACN,IAAAw7D,EACA,QAAS,CAAC,CAAE,MAAAgC,EAAO,MAAOx9D,EAAM,KAAAg7D,EAAM,QAAA7I,EAAS,CACzD,CAAS,CAET,CAAK,EAEM2N,CACR,CAED,eAAet0B,EAAO,CAEpB,MAAMu2B,EAAavgE,GAAMgqC,EAAO,KAAK,OAAO,EAEtCw2B,EAAW,CAACv0D,EAAMgH,EAAM+mD,IAAQ,CACpC,GAAI,CAAC/tD,EAAK,SAAU,CAClB,KAAM,CAAE,MAAA2sD,EAAO,SAAA6F,CAAU,EAAGxyD,EAEtBuxD,EAAU,KAAK,aAAa,CAChC,IAAK,KAAK,UAAU,IAAI5E,CAAK,EAC7B,MAAO,KAAK,SAAS,uBAAuB3lD,EAAM2lD,CAAK,EACvD,SAAA6F,CACV,CAAS,EAED,OAAIjB,GAAWA,EAAQ,OACd,CACL,CACE,IAAAxD,EACA,KAAA/mD,EACA,QAAAuqD,CACD,CACF,EAGI,CAAE,CACV,CAED,MAAM1qC,EAAM,GACZ,QAASj1B,EAAI,EAAG05D,EAAMtrD,EAAK,SAAS,OAAQpO,EAAI05D,EAAK15D,GAAK,EAAG,CAC3D,MAAM4hD,EAAQxzC,EAAK,SAASpO,CAAC,EACvB+3B,EAAS4qC,EAAS/gB,EAAOxsC,EAAM+mD,CAAG,EACxC,GAAIpkC,EAAO,OACT9C,EAAI,KAAK,GAAG8C,CAAM,UACT3pB,EAAK,WAAamzD,GAAgB,IAC3C,MAAO,CAAE,CAEZ,CACD,OAAOtsC,CACb,EAEUinC,EAAU,KAAK,SAAS,QACxB0G,EAAY,GACZnC,EAAU,GAEhB,OAAAvE,EAAQ,QAAQ,CAAC,CAAE,EAAG9mD,EAAM,EAAG+mD,KAAU,CACvC,GAAI/B,GAAUhlD,CAAI,EAAG,CACnB,IAAIytD,EAAaF,EAASD,EAAYttD,EAAM+mD,CAAG,EAE3C0G,EAAW,SAERD,EAAUzG,CAAG,IAChByG,EAAUzG,CAAG,EAAI,CAAE,IAAAA,EAAK,KAAA/mD,EAAM,QAAS,IACvCqrD,EAAQ,KAAKmC,EAAUzG,CAAG,CAAC,GAE7B0G,EAAW,QAAQ,CAAC,CAAE,QAAAlD,KAAc,CAClCiD,EAAUzG,CAAG,EAAE,QAAQ,KAAK,GAAGwD,CAAO,CAClD,CAAW,EAEJ,CACP,CAAK,EAEMc,CACR,CAED,kBAAkBt0B,EAAO,CACvB,MAAMy0B,EAAWS,GAAel1B,EAAO,KAAK,OAAO,EAC7C,CAAE,KAAAzzC,EAAM,QAAAwjE,GAAY,KAAK,SACzBuE,EAAU,GAGhB,OAAAvE,EAAQ,QAAQ,CAAC,CAAE,EAAG9mD,EAAM,EAAG+mD,KAAU,CACvC,GAAI,CAAC/B,GAAUhlD,CAAI,EACjB,OAGF,IAAIuqD,EAAU,GAGdjnE,EAAK,QAAQ,CAACH,EAAKgkE,IAAa,CAC9BoD,EAAQ,KACN,GAAG,KAAK,aAAa,CACnB,IAAApnE,EACA,MAAO6c,EAAKmnD,CAAQ,EACpB,SAAAqE,CACZ,CAAW,CACX,CACA,CAAO,EAEGjB,EAAQ,QACVc,EAAQ,KAAK,CACX,IAAAtE,EACA,KAAA/mD,EACA,QAAAuqD,CACV,CAAS,CAET,CAAK,EAEMc,CACR,CACD,aAAa,CAAE,IAAAloE,EAAK,MAAAgB,EAAO,SAAAqnE,CAAQ,EAAI,CACrC,GAAI,CAACxG,GAAU7gE,CAAK,EAClB,MAAO,CAAE,EAGX,IAAIomE,EAAU,GAEd,GAAIhG,GAAQpgE,CAAK,EACfA,EAAM,QAAQ,CAAC,CAAE,EAAGoH,EAAM,EAAGw7D,EAAK,EAAGR,KAAW,CAC9C,GAAI,CAACvB,GAAUz5D,CAAI,EACjB,OAGF,KAAM,CAAE,QAAA4+D,EAAS,MAAApB,EAAO,QAAArL,CAAS,EAAG8N,EAAS,SAASjgE,CAAI,EAEtD4+D,GACFI,EAAQ,KAAK,CACX,MAAAxB,EACA,IAAA5lE,EACA,MAAOoI,EACP,IAAAw7D,EACA,KAAAR,EACA,QAAA7I,CACZ,CAAW,CAEX,CAAO,MACI,CACL,KAAM,CAAE,EAAGnyD,EAAM,EAAGg7D,CAAI,EAAKpiE,EAEvB,CAAE,QAAAgmE,EAAS,MAAApB,EAAO,QAAArL,CAAS,EAAG8N,EAAS,SAASjgE,CAAI,EAEtD4+D,GACFI,EAAQ,KAAK,CAAE,MAAAxB,EAAO,IAAA5lE,EAAK,MAAOoI,EAAM,KAAAg7D,EAAM,QAAA7I,CAAO,CAAE,CAE1D,CAED,OAAO6M,CACR,CACH,CAEA2C,GAAK,QAAU,QACfA,GAAK,YAAc1F,GACnB0F,GAAK,WAAaxF,GAClBwF,GAAK,OAAS7G,EAGZ6G,GAAK,WAAangE,GAIlBi/D,GAASL,EAAc","names":["_extends","n","e","t","r","reservedModifierKeywords","mappedKeys","mapKey","key","isHotkeyModifier","parseKeysHookInput","keys","splitKey","parseHotkey","hotkey","combinationKey","description","k","modifiers","singleCharKeys","pushToCurrentlyPressedKeys","removeFromCurrentlyPressedKeys","currentlyPressedKeys","isReadonlyArray","value","isHotkeyPressed","hotkeyArray","maybePreventDefault","preventDefault","isHotkeyEnabled","enabled","isKeyboardEventTriggeredByInput","ev","isHotkeyEnabledOnTag","event","enabledOnTags","target","composed","targetTagName","isCustomElement","tag","_targetTagName","element","isScopeActive","activeScopes","scopes","scope","isHotkeyMatchingKeyboardEvent","ignoreModifiers","alt","meta","mod","shift","ctrl","pressedKeyUppercase","code","ctrlKey","metaKey","shiftKey","altKey","keyCode","pressedKey","BoundHotkeysProxyProvider","createContext","useBoundHotkeysProxy","useContext","deepEqual","x","y","isEqual","HotkeysContext","useHotkeysContext","useDeepEqualMemo","ref","useRef","stopPropagation","useSafeLayoutEffect","useLayoutEffect","useEffect","useHotkeys","callback","options","dependencies","_useState","useState","setRef","hasTriggeredRef","_options","_keys","_deps","memoisedCB","useCallback","cbRef","memoisedOptions","_useHotkeysContext","enabledScopes","proxy","listener","isKeyUp","_e$target","rootNode","_hotkey$keys","handleKeyDown","handleKeyUp","domNode","root","factory","module","this","global","Toastify","version","divElement","property","avatarElement","closeElement","width","self","getAxisOffsetAValue","xOffset","yOffset","rootElement","elementToInsert","toastElement","topLeftOffsetSize","topRightOffsetSize","offsetSize","allToasts","classUsed","i","containsClass","height","offset","axis","elem","yourClass","window","_showToast","showToast","props","text","onClick","delay","rest","toast","className","destination","gravity","position","setTimeout","useInterval","fn","deps","immediate","savedCallback","current","id","setInterval","tick","clearInterval","openCompose","opts","url","URL","parse","location","screenWidth","screenHeight","screen","left","Math","max","top","min","winUID","uid","random","newWin","open","__COMPOSE__","alert","i18n","_","isSafari","test","navigator","userAgent","openOSK","fauxEl","document","createElement","style","opacity","body","appendChild","focus","removeChild","ICONS","__vitePreload","heart","bookmark","check-circle","x-circle","transfer","rocket","rtl","arrow-up","arrow-down","earth","lock","unlock","eye-close","eye-open","message","comment","comment2","home","notification","follow","follow-add","poll","pencil","quill","at","attachment","upload","gear","more","more2","external","popout","popin","rotate","plus","chevron-down","reply","flip","thread","group","bot","menu","list","search","hashtag","info","shortcut","user","following","pin","unpin","bus","link","history","share","sparkles","sparkles2","exit","translate","play","trash","mute","unmute","block","unblock","flag","time","refresh","emoji2","filter","filters","chart","react","layout4","layout5","announce","round","arrow-up-circle","arrow-down-circle","clipboard","account-edit","account-warning","keyboard","cloud","month","media","speak","building","history2","copy","quote","settings","heart-break","user-x","minimize","SIZES","s","m","l","xl","xxl","ICONDATA","SVGICon","moize","_jsx","viewBox","dangerouslySetInnerHTML","__html","transform","isShallowEqual","maxSize","Object","length","matchesArg","cacheKeyArg","keyArg","icon","Icon","size","title","class","iconSize","iconBlock","warn","Array","iconData","setIconData","currentIcon","iconB","useCloseWatcher","watcher","CloseWatcher","addEventListener","destroy","useCloseWatcher$1","$modalContainer","getElementById","Modal","children","onClose","minimized","modalRef","timer","focusElement","querySelector","clearTimeout","supportsCloseWatcher","escRef","keydown","keyup","$deckContainers","querySelectorAll","page","tabIndex","forEach","$deckContainer","setAttribute","removeAttribute","node","currentTarget","inert","onFocus","isFocusable","getComputedStyle","pointerEvents","console","ReactPropTypesSecret","ReactPropTypesSecret_1","require$$0","emptyFunction","emptyFunctionWithReset","factoryWithThrowingShims","shim","propName","componentName","propFullName","secret","err","getShim","ReactPropTypes","ReactIs","throwOnDirectAccess","propTypesModule","isMenuOpen","state","batchedUpdates","unstable_batchedUpdates","getTransition","transition","name","safeCall","arg","internalKey","getName","component","mergeProps","source","targetProp","sourceProp","parsePadding","paddingStr","padding","right","getScrollAncestor","overflow","overflowX","overflowY","commonProps","isDisabled","isHovering","indexOfNode","nodeList","stylePropTypes","oneOfType","string","func","menuPropTypes","object","bool","number","oneOf","rootMenuPropTypes","exact","uncontrolledMenuPropTypes","useBEM","useMemo","blockElement","classString","expandedClassName","menuContainerClass","menuClass","menuArrowClass","menuItemClass","menuDividerClass","menuHeaderClass","menuGroupClass","subMenuClass","HoverItemContext","MenuListItemContext","MenuListContext","EventHandlersContext","RadioGroupContext","SettingsContext","Keys","HoverActionTypes","CloseReason","FocusPositions","MenuStateMap","positionAbsolute","roleNone","roleMenuitem","MenuContainer","containerRef","containerProps","isOpen","theming","itemTransition","jsx","createSubmenuCtx","count","closeDelay","pending","settled","useItems","menuRef","focusRef","hoverItem","setHoverItem","mutableState","updateItems","item","isMounted","items","index","dispatch","actionType","nextIndex","hoverIndex","sortItems","orderedNodes","a","b","newItem","prevItem","getNativeDimension","transformed","untransformed","getNormalizedClientRect","rect","getPositionHelpers","menuScroll","boundingBoxPadding","menuRect","containerRect","boundingRect","getLeftOverflow","getRightOverflow","getTopOverflow","getBottomOverflow","leftOverflow","rightOverflow","topOverflow","bottomOverflow","placeArrowVertical","arrowRef","menuY","anchorRect","placeLeftorRight","placeLeftorRightY","placeLeftX","placeRightX","confineHorizontally","confineVertically","arrow","direction","computedDirection","placeArrowHorizontal","menuX","placeToporBottom","placeToporBottomX","placeTopY","placeBottomY","positionMenu","align","gap","positionHelpers","isHorizontal","horizontalOffset","verticalOffset","arrowElt","useIsomorphicLayoutEffect","instance","useCombinedRef","refA","refB","offScreen","MenuList","ariaLabel","menuClassName","menuStyle","arrowProps","anchorPoint","anchorRef","focusProps","externalRef","parentScrollingRef","setDownOverflow","repositionFlag","captureFocus","endTransition","menuItemFocus","restProps","menuPosition","setMenuPosition","arrowPosition","setArrowPosition","overflowData","setOverflowData","expandedDirection","setExpandedDirection","submenuCtx","reposSubmenu","forceReposSubmenu","useReducer","c","boundingBoxRef","rootMenuRef","rootAnchorRef","scrollNodesRef","reposition","viewScroll","submenuCloseDelay","parentSubmenuCtx","reposFlag","prevOpen","openTransition","closeTransition","scrollNodes","onKeyDown","onAnimationEnd","onPointerMove","onPointerLeave","handlePosition","noOverflowCheck","_anchorRef$current","arrowX","arrowY","menuHeight","overflowAmt","anchorScroll","scroll","handleScroll","scrollObservers","o","hasOverflow","parentScroll","targetList","resizeObserver","entries","flushSync","resizeObserverOptions","anchor","alwaysUpdate","setItemFocus","menuElt","itemContext","maxHeight","listContext","overflowStyle","arrowModifiers","_arrowClassName","ControlledMenu","forwardRef","initialMounted","unmountOnClose","transitionTimeout","submenuOpenDelay","portal","onItemClick","eventHandlers","isCheckorRadio","keepOpen","menuList","createPortal","PRE_ENTER","ENTERING","ENTERED","PRE_EXIT","EXITING","EXITED","UNMOUNTED","STATUS","getState","status","startOrEnd","unmounted","getEndStatus","unmountOnExit","getTimeout","timeout","updateState","setState","latestState","timeoutId","onChange","useTransition","enter","preEnter","preExit","initialEntered","mountOnEnter","enterTimeout","exitTimeout","toggle","toEnter","transitState","enterStage","useMenuState","initialOpen","toggleMenu","useMenuStateAndFocus","menuProps","setMenuItemFocus","openMenu","useClick","onToggle","skipOpen","useMenuChange","onMenuChange","Menu","_1","menuButton","instanceRef","stateProps","buttonRef","anchorProps","handleClose","button","buttonProps","renderButton","cloneElement","useImperativeHandle","Fragment","withHovering","WrappedComponent","Component","memo","WithHovering","itemRef","useItemEffect","SubMenu","disabled","label","openTrigger","_2","itemProps","parentMenuRef","parentDir","parentOverflow","isParentOpen","isPortal","_openMenu","timerId","stopTimer","args","setHover","delayOpen","onKeyDownOfRoot","handled","externalItemRef","itemClassName","restItemProps","mergedItemProps","getMenuList","container","useItemState","unsetHover","onBlur","keepHover","MenuItem","href","type","checked","restStateProps","radioGroup","isRadio","isCheckBox","isAnchor","isChecked","handleClick","mergedProps","menuItemProps","FocusableItem","renderChildren","MenuDivider","MenuHeader","MenuGroup","takeOverflow","setOverflowStyle","xxxl","alphaCache","canvas","OffscreenCanvas","ctx","getContext","willReadFrequently","imageSmoothingEnabled","MISSING_IMAGE_PATH_REGEX","Avatar","squircle","avatarRef","isMissing","src","loading","decoding","fetchPriority","crossOrigin","undefined","onError","onLoad","dataset","loaded","drawImage","allPixels","getImageData","hasAlpha","data","pixel","classList","add","clearRect","mem","Link","routerLocation","useLocation","hash","replace","trim","to","includes","parsedHash","origin","searchParams","searchParamsStr","from","map","encodeURIComponent","join","pathname","isActive","decodeURIComponent","parentNode","closest","prevLocation","IS_RTL","observer","MutationObserver","mutations","mutation","dir","isRTL","observe","documentElement","defaultBoundingBoxPadding","safeAreaInsets","getSafeAreaInsets","safeAreaInsetTop","getPropertyValue","safeAreaInsetRight","safeAreaInsetBottom","safeAreaInsetLeft","parseInt","requestAnimationFrame","safeBoundingBoxPadding","paddings","v","CSS","supports","passive","useWindowSize","setSize","handleResize","innerWidth","innerHeight","removeEventListener","Menu2","_instanceRef","rtlAlign","closeMenu","SubMenu2","pointerType","MenuConfirm","subMenu","confirm","confirmLabel","menuItemClassName","menuFooter","menuExtras","_jsxs","MenuLink","detail","CustomEmoji","staticUrl","srcset","shortcodesRegexp","shortcodes","RegExp","EmojiText","emojis","indexOf","regex","shortcode","elements","split","word","emoji","find","nameCollator","locale","sensitivity","Intl","Collator","ACCT_REGEX","SHORTCODES_REGEX","SPACES_REGEX","NON_ALPHA_NUMERIC_REGEX","NameText","account","showAvatar","showAcct","short","useLingui","acct","avatar","avatarStatic","displayName","username","acct1","acct2","match","api","trimmedUsername","toLowerCase","trimmedDisplayName","shortenedDisplayName","shortenedAlphaNumericDisplayName","hideUsername","compare","which","internalURL","states","showAccount","_Fragment","codeMappings","zh_HANT","IntlDN","DisplayNames","_localeCode2Text","fallback","of","anotherText","localeCode2Text","isValidDate","Date","isNaN","getTime","date","resolvedLocale","DateTimeFormat","resolvedOptions","DTF","regionlessLocale","lang","localeMatch","RTF","RelativeTimeFormat","minute","hour","day","rtfFromNow","rtf","seconds","now","absSeconds","abs","format","floor","twitterFromNow","values","0","RelativeTime","datetime","renderCount","rerender","dateStr","dt","str","getFullYear","year","dateStyle","toISOString","toLocaleString","raf","rafRerender","scheduleRerender","cancelAnimationFrame","locales","languages","localeTargetLanguages","translationTargetLanguages","getTranslateTargetLanguage","fromSettings","contentTranslationTargetLanguage","BYTES_UNITS","prettyBytes","bytes","unitIndex","log2","unit","unitDisplay","maximumFractionDigits","semver","validateAndParse","isWildcard","tryParse","forceType","compareStrings","ap","bp","compareSegments","compareVersions","v1","v2","n1","n2","p1","p2","operator","assertValidOperator","res","operatorResMap","allowedOperators","op","satisfies","range","v3","vp","r1","r2","r3","rp","nonZero","containPixelfed","notContainPixelfed","containPleroma","containAkkoma","platformFeatures","supportsCache","feature","domain","getCurrentInstance","softwareName","getCurrentNodeInfo","software","features","doesSoftwareMatch","includePrerelease","loose","maxInt","base","tMin","tMax","skew","damp","initialBias","initialN","delimiter","regexPunycode","regexNonASCII","regexSeparators","errors","baseMinusTMin","stringFromCharCode","error","array","result","mapDomain","parts","labels","encoded","ucs2decode","output","counter","extra","ucs2encode","codePoints","basicToDigit","codePoint","digitToBasic","digit","adapt","delta","numPoints","firstTime","decode","input","inputLength","bias","basic","j","oldi","w","baseMinusT","out","encode","currentValue","basicLength","handledCPCount","handledCPCountPlusOne","q","qMinusT","toUnicode","toASCII","punycode","emojifyText","fauxDiv","whitelistLinkClasses","HTML_CHARS_REGEX","escapeHTML","html","LINK_REGEX","HTTP_LINK_REGEX","MENTION_REGEX","HASHTAG_REGEX","CODE_BLOCK_REGEX","CODE_BLOCK_START_REGEX","CODE_BLOCK_END_REGEX","INLINE_CODE_REGEX","TWITTER_DOMAIN_REGEX","TWITTER_MENTION_REGEX","TWITTER_MENTION_CAPTURE_REGEX","CODE_INLINE_CAPTURE_REGEX","createDOM","isDocumentFragment","tpl","innerHTML","content","_enhanceContent","returnDOM","postEnhanceDOM","enhancedContent","dom","hasLink","hasCodeBlock","noTargetBlankLinks","links","remove","textContent","shortenLink","usernames","innerText","hasChildren","some","u","d","push","slice","textNodes","extractTextNodes","nodeValue","replaceWith","childNodes","blocks","p","pre","br","codeBlocks","nextParagraphs","currentBlock","nextElementSibling","next","tagName","codeText","replaceAll","rejectFilter","prevIndex","hashtagStuffedParagraphs","hashtagCount","nodeType","Node","TEXT_NODE","linkText","startsWith","imgs","img","getAttribute","naturalWidth","naturalHeight","setProperty","span","replaceChild","queueMicrotask","enhanceContent","defaultRejectFilter","defaultRejectFilterMap","fromEntries","nodeName","URL_PREFIX_REGEX","URL_DISPLAY_LENGTH","prefix","displayURL","suffix","cutoff","rejectFilterMap","assign","reduce","acc","cur","walk","createTreeWalker","NodeFilter","SHOW_TEXT","acceptNode","FILTER_REJECT","FILTER_ACCEPT","nextNode","div","getHTMLText","preProcess","el","append","handleContentLinks","mentions","previewMode","statusURL","prevText","previousSibling","textBeforeLinkIsAt","endsWith","textStartsWithAt","contains","targetText","mention","textBeforeLinkIsHash","hashURL","_b","i18nDuration","duration","defaultLocale","_DateTimeFormat","dateYear","hideTime","formatOpts","forceOpts","loc","currentYear","niceDateTime","dtfOpts","shortenNumber","num","notation","roundingMode","TOAST_DURATION","showCompose","composerState","AccountBlock","skeleton","avatarSize","useAvatarStatic","internal","showActivity","showStats","accountInstance","hideDisplayName","relationship","excludeRelationshipAttrs","statusesCount","lastStatusAt","fields","note","followersCount","createdAt","locked","verifiedField","f","verifiedAt","excludedRelationship","hasRelationship","followedBy","requested","Trans","components","RetryOperation","timeouts","retry_operation","currentTime","timeoutOps","counts","mainError","mainErrorCount","exports","attempt","obj","methods","method","original","retry","objectToString","isError","errorMessages","isNetworkError","AbortError","decorateErrorWithCounts","attemptNumber","retriesLeft","pRetry","resolve","reject","operation","abortHandler","_a","cleanUp","finalError","__defProp","__defNormalProp","__publicField","observerMap","RootIds","rootId","unsupportedValue","getRootId","optionsToId","createObserver","thresholds","entry","inView","threshold","fallbackInView","bounds","callbacks","isPlainChildren","InView","React.Component","prevProps","rootMargin","trackVisibility","as","triggerOnce","skip","initialInView","React.createElement","useInView","React2.useState","React2.useRef","React2.useEffect","unobserve","entryTarget","previousEntryTarget","TOP","shazamIDs","LazyShazam","hasID","visible","setVisible","visibleStart","setVisibleStart","getBoundingClientRect","bottom","hidden","PHANPY_LINGVA_INSTANCES","import","LINGVA_INSTANCES","throttle","pThrottle","limit","interval","currentLingvaInstance","_lingvaTranslate","fetchCall","fetch","ok","provider","translation","detectedSourceLanguage","detectedSource","retries","onFailedAttempt","log","TRANSLATED_MAX_AGE","lingvaTranslate","pmem","forceTranslate","sourceLanguage","onTranslate","mini","autoDetected","uiState","setUIState","targetLang","setTranslatedContent","pronunciationContent","detailsRef","translatedContent","sourceLangText","targetLangText","apiSourceLang","detectedLangText","setDetectedLang","pronunciation","query","setPronunciationContent","detectedLang","sourceLanguages","common","showCommon","native","abrupt","TranslationBlock$1","TranslationBlock","promisifyRequest","request","createStore","dbName","storeName","dbp","txMode","db","defaultGetStoreFunc","defaultGetStore","get","customStore","store","set","getMany","del","delMany","clear","eachCursor","cursor","initDB","val","drafts","catchup","fetchRelationships","accounts","relationshipsMap","masto","currentAccount","getCurrentAccountID","uniqueAccountIds","relationships","LiteYTEmbed","shadowDom","nonce","oldVal","newVal","isIntersectionObserver","autoplay","wantsNoCookie","embedTarget","iframeHTML","posterUrlWebp","posterUrlJpeg","kind","linkElem","digitLookup","decode83","start","end","pow","PI","PI2","sRGBToLinear","linearTosRGB","signSqr","fastCos","cos","getBlurHashAverageColor","blurHash","decodeBlurHash","punch","sizeFlag","numX","numY","g","basis","basisY","colorIndex","pixelIndex","maximumValue","colors","averageColor","cosinesY","cosinesX","bytesPerRow","pixels","addIndentation","splittedHtml","char","level","opened","indented","elTag","newIndented","addIndentation_1","removeEmptyLines","nonFormattedString","mergeAttributesWithElements","markup","splittedMarkup","mergedLines","currentElement","line","toLines","require$$1","prettify","splitted","A","z","U","X","Y","R","G","J","M","C","L","P","I","T","E","h","B","D","Poll","readOnly","votePoll","expired","expiresAt","multiple","ownVotes","voted","votersCount","votesCount","expiresAtDate","pollVotesCount","roundPrecision","showResults","setShowResults","optionsHaveVoteCounts","every","option","optionVotesCount","ratio","percentage","isLeading","onSubmit","form","formData","FormData","choices","1","FilterContext","_isFiltered","filtered","filterContext","appliedFilters","hasContext","context","filterAction","action","filterTitles","titles","titlesStr","isFiltered","filteredItem","currentAccountID","filterState","filteredItems","htmlContentLength","supportsTTS","speechSynthesis","speaking","cancel","utterance","SpeechSynthesisUtterance","statusPeek","spoilerText","mediaAttachments","image","gifv","video","audio","unknown","F","useResolvedElement","subscriber","refOrElement","lastReportRef","refOrElementRef","cbElementRef","evaluateSubscription","cbElement","extractSize","boxProp","sizeType","useResizeObserver","onResize","onResizeRef","resizeObserverRef","didUnmount","previous","refCallback","reportedWidth","reportedHeight","newWidth","newHeight","newSize","useTruncated","useThrottledCallback","scrollHeight","truncated","_height","computedHeight","box","visibilityIconsMap","public","unlisted","private","direct","local","styleRoot","styleChild","styles","isSsr","isTouch","make3dTransformValue","scale","getOffsetBounds","containerDimension","childDimension","centerContained","diff","classnames","other","sqrt","isMac","isDragInteraction","isZoomInteraction","isZoomGesture","wheelEvent","cancelEvent","getDistance","calculateScale","startTouches","endTouches","startDistance","endDistance","isCloseTo","expected","swing","getPointByPageCoordinates","touch","getPageCoordinatesByTouches","touches","sum","getVectorAvg","vectors","clamp","shouldInterceptWheel","getElementSize","offsetWidth","offsetHeight","calculateVelocity","startPoint","endPoint","comparePoints","noup","zeroPoint","PinchZoom","_super","__extends","_this","__assign","createRef","clickEvent","touchEndEvent","touchStartEvent","touchMoveEvent","pageX","pageY","deltaY","deltaMode","scaleDelta","likeTouchEvent","center","dScale","inertiaFriction","inertia","renderFrame","prevOffset","currentCoordinates","prevPoint","newScale","touchCenter","needZoomOut","zoomFactor","startZoomFactor","updateProgress","progress","elWidth","elHeight","minOffsetX","maxOffsetX","_c","minOffsetY","maxOffsetY","__x","__y","animated","startOffset","containerCenter","diffZoomFactor","diffOffset","updateFrame","originalZoomFactor","lastCenter","sanitizedOffset","targetOffset","scaleFactor","offsetLeft","offsetTop","_document","_html","_body","scrollTop","scrollLeft","posTop","posLeft","frameFn","startTime","timeFn","frameTime","xZoomFactor","yZoomFactor","eventName","_i","newInteraction","interaction","fingers","mouseEvent","isEnd","isStart","child","Children","React","any","formatDuration","hours","minutes","toString","padStart","dataAltLabel","AltBadge","showMediaAlt","MEDIA_CAPTION_LIMIT","MEDIA_CAPTION_LIMIT_LONGER","isMediaCaptionLong","caption","Media","showOriginal","autoAnimate","showCaption","allowLongerCaption","altIndex","checkAspectRatio","blurhash","previewRemoteUrl","previewUrl","remoteUrl","small","mediaURL","remoteMediaURL","hasDimensions","orientation","rgbAverageColor","videoRef","focalPosition","toFixed","mediaRef","onUpdate","removeProperty","touchAction","pinchZoomEnabled","setPinchZoomEnabled","quickPinchZoomProps","draggableUnZoomed","tapZoomFactor","doubleTapToggleZoom","Parent","remoteMediaURLObj","getURLObj","isVideoMaybe","isAudioMaybe","isImage","parentRef","imageSmallerThanParent","setImageSmallerThanParent","smaller","maxAspectHeight","averageColorStyle","mediaStyles","aspectRatio","longDesc","showInlineDesc","Figure","hasNaturalAspectRatio","setHasNaturalAspectRatio","display","mode","backgroundImage","backgroundSize","QuickPinchZoom","objectPosition","$media","clientWidth","clientHeight","minDimension","hasSmallDimension","displayNaturalHeight","hasDuration","shortDuration","isGIF","loopable","formattedDuration","hoverAnimate","autoGIFAnimate","showProgress","gifHTML","videoHTML","pause","onMouseEnter","onMouseLeave","poster","preload","playsinline","loop","muted","onTimeUpdate","disablePictureInPicture","onLoadedMetadata","controls","autoPlay","oldProps","newProps","oldMedia","newMedia","SHOW_COMMENT_COUNT_LIMIT","INLINE_TRANSLATE_LIMIT","fetchAccount","$select","memFetchAccount","visibilityText","isIOS","ontouchstart","REACTIONS_LIMIT","getPollText","getPostText","isTranslateble","getHTMLTextForDetectLang","HTTP_REGEX","PostContent","post","language","divRef","replaceChildren","cloneNode","SIZE_CLASS","detectLang","detectAll","accuracy","readMoreText","DIFFERENT_LANG_CHECK","checkDifferentLanguage","contentTranslationHideLanguages","targetLanguage","different","Status","statusID","propInstance","contentTextWeight","enableCommentHint","withinContext","enableTranslate","_forceTranslate","onMediaClick","quoted","onStatusLinkClick","showFollowedTags","allowContextMenu","showActionsBar","showReplyParent","mediaFirst","authenticated","currentInstance","sameInstance","sKey","statusKey","snapStates","useSnapshot","statuses","accountId","accountURL","accountEmojis","repliesCount","reblogged","reblogsCount","favourited","favouritesCount","bookmarked","sensitive","visibility","_language","editedAt","card","inReplyToId","inReplyToAccountId","reblog","uri","tags","pinned","_deleted","_pinned","emojiReactions","languageAutoDetected","setLanguageAutoDetected","detected","hasMediaAttachments","isSelf","filterInfo","debugHover","FilteredStatus","createdAtDate","editedAtDate","inReplyToAccountRef","setInReplyToAccount","inReplyToAccount","account2","catch","mentionSelf","readingExpandSpoilers","showSpoiler","readingExpandMedia","showSpoilerMedia","FollowedTagsParent","setForceTranslate","StatusParent","contentTranslation","inlineTranslate","contentTranslationAutoInline","isSizeLarge","showEdited","setShowEdited","showEmbed","setShowEmbed","contentLength","statusRef","unauthInteractionErrorMessage","createdDateText","editedDateText","canBoost","textWeight","mediaNoDesc","replyToStatus","statusMonthsAgo","confirmBoostStatus","newStatus","saveStatus","favouriteStatusNotify","favouriteStatus","done","bookmarkStatus","bookmarkStatusNotify","differentLanguage","setDifferentLanguage","reblogIterator","favouriteIterator","firstLoad","favouriteResults","reblogResults","_types","isPublic","isPinnable","StatusMenuItems","replyStatus","draftStatus","fetchBoostedLikedByAccounts","heading","fetchAccounts","showReactions","postText","nicePostURL","maxWidth","cachedStatus","getStatus","isContextMenuOpen","setIsContextMenuOpen","contextMenuProps","setContextMenuProps","bindLongPressContext","useLongPress","showContextMenu","clientX","clientY","hotkeysEnabled","fRef","dRef","captureEvent","bRef","rRef","xRef","activeStatus","spoilerButton","spoilerMediaButton","showMultipleMediaCaptions","displayedMediaAttachments","attachments","indices","showCommentHint","isThread","showCommentCount","StatusCompact","containsQuestion","nodeRef","selection","anchorNode","contextMenuRef","actionsRef","StatusButton","spoilerContentRef","spoilers","spoilersMedia","postID","contentRef","QuoteStatuses","pollResponse","newPoll","polls","then","MultipleMediaFigure","mediaContainerRef","captionChildren","_d","selfAuthor","emojiReaction","me","url2","isShortCode","EditedAtModal","carouselRef","moreThanOne","setCurrentIndex","currentIndex","getDomain","isCardPost","Byline","authors","author","selfReferential","providerName","providerUrl","authorName","authorUrl","imageDescription","embedUrl","publishedAt","hasText","isLandscape","cardStatusURL","isMastodonLinkMaybe","unfurlMastodonLink","setCardStatusURL","unfurledLinks","hasIframeHTML","blurhashImage","setBlurhashImage","blob","isPost","putImageData","convertToBlob","videoID","videoid","editHistory2","fetchStatusHistory","setEditHistory","editHistory","Loader","generateHTMLCode","id2","contentHTML","sourceMediaURL","previewMediaURL","mediaHTML","htmlCode","EmbedModal","download","setButtonTitle","setIconAlt","buttonTitle","host","iconAlt","path","urlObj","statusReply","restPath","srKey","statusPeekText","filterTitleStr","showPeek","setShowPeek","isReblog","isFollowedTags","detect","bindLongPressPeek","cancelOnMovement","ssKey","actualStatusID","statusPeekRef","quotes","uniqueQuotes","arr","q2","statusQuotes","IDX","HEX","len","isArray","getTag","INFINITY","baseToString","isString","isNumber","isBoolean","isObjectLike","isObject","isDefined","isBlank","INCORRECT_INDEX_TYPE","LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY","PATTERN_LENGTH_TOO_LARGE","MISSING_KEY_PROPERTY","INVALID_KEY_WEIGHT_VALUE","hasOwn","KeyStore","totalWeight","createKey","keyId","weight","getFn","createKeyPath","createKeyId","deepGet","MatchOptions","BasicOptions","FuzzyOptions","AdvancedOptions","Config","SPACE","norm","mantissa","cache","numTokens","FuseIndex","fieldNormWeight","docs","records","idx","doc","docIndex","record","keyIndex","subRecords","stack","nestedArrIndex","subRecord","createIndex","myIndex","parseIndex","computeScore$1","pattern","currentLocation","expectedLocation","distance","ignoreLocation","proximity","convertMaskToIndices","matchmask","minMatchCharLength","MAX_BITS","patternAlphabet","findAllMatches","includeMatches","patternLen","textLen","currentThreshold","bestLocation","computeMatches","matchMask","score","lastBitArr","finalScore","binMax","mask","binMin","binMid","finish","bitArr","charMatch","createPatternAlphabet","BitapSearch","isCaseSensitive","addChunk","startIndex","remainder","allIndices","totalScore","hasMatches","alphabet","isMatch","BaseMatch","getMatch","exp","matches","ExactMatch","InverseExactMatch","PrefixExactMatch","InversePrefixExactMatch","SuffixExactMatch","InverseSuffixExactMatch","FuzzyMatch","IncludeMatch","searchers","searchersLen","SPACE_RE","OR_TOKEN","parseQuery","results","queryItem","found","searcher","token","MultiMatchSet","ExtendedSearch","numMatches","qLen","pLen","registeredSearchers","register","createSearcher","searcherClass","LogicalOperator","KeyType","isExpression","isPath","isLeaf","convertToExplicit","auto","isQueryPath","computeScore","ignoreFieldNorm","transformMatches","transformScore","includeScore","transformers","transformer","Fuse","predicate","shouldSort","sortFn","expression","evaluate","resultMap","expResults"],"ignoreList":[0,1,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,63,64,65,66,68,78,79,80,81,82,83,86,89,90,91,92,93,94,101,102,105,106,107,108,112,113],"sources":["../../node_modules/react-hotkeys-hook/dist/react-hotkeys-hook.esm.js","../../node_modules/toastify-js/src/toastify.js","../../src/utils/show-toast.js","../../src/utils/useInterval.js","../../src/utils/open-compose.js","../../src/utils/open-osk.js","../../src/components/ICONS.jsx","../../src/components/icon.jsx","../../src/utils/useCloseWatcher.js","../../src/components/modal.jsx","../../node_modules/prop-types/lib/ReactPropTypesSecret.js","../../node_modules/prop-types/factoryWithThrowingShims.js","../../node_modules/prop-types/index.js","../../node_modules/@szhsin/react-menu/dist/es/utils/utils.js","../../node_modules/@szhsin/react-menu/dist/es/utils/propTypes.js","../../node_modules/@szhsin/react-menu/dist/es/hooks/useBEM.js","../../node_modules/@szhsin/react-menu/dist/es/utils/constants.js","../../node_modules/@szhsin/react-menu/dist/es/components/MenuContainer.js","../../node_modules/@szhsin/react-menu/dist/es/utils/submenuCtx.js","../../node_modules/@szhsin/react-menu/dist/es/hooks/useItems.js","../../node_modules/@szhsin/react-menu/dist/es/positionUtils/getNormalizedClientRect.js","../../node_modules/@szhsin/react-menu/dist/es/positionUtils/getPositionHelpers.js","../../node_modules/@szhsin/react-menu/dist/es/positionUtils/placeArrowVertical.js","../../node_modules/@szhsin/react-menu/dist/es/positionUtils/placeLeftorRight.js","../../node_modules/@szhsin/react-menu/dist/es/positionUtils/placeArrowHorizontal.js","../../node_modules/@szhsin/react-menu/dist/es/positionUtils/placeToporBottom.js","../../node_modules/@szhsin/react-menu/dist/es/positionUtils/positionMenu.js","../../node_modules/@szhsin/react-menu/dist/es/hooks/useIsomorphicLayoutEffect.js","../../node_modules/@szhsin/react-menu/dist/es/hooks/useCombinedRef.js","../../node_modules/@szhsin/react-menu/dist/es/components/MenuList.js","../../node_modules/@szhsin/react-menu/dist/es/components/ControlledMenu.js","../../node_modules/react-transition-state/dist/es/hooks/utils.js","../../node_modules/react-transition-state/dist/es/hooks/useTransition.js","../../node_modules/@szhsin/react-menu/dist/es/hooks/useMenuState.js","../../node_modules/@szhsin/react-menu/dist/es/hooks/useMenuStateAndFocus.js","../../node_modules/@szhsin/react-menu/dist/es/hooks/useClick.js","../../node_modules/@szhsin/react-menu/dist/es/hooks/useMenuChange.js","../../node_modules/@szhsin/react-menu/dist/es/components/Menu.js","../../node_modules/@szhsin/react-menu/dist/es/utils/withHovering.js","../../node_modules/@szhsin/react-menu/dist/es/hooks/useItemEffect.js","../../node_modules/@szhsin/react-menu/dist/es/components/SubMenu.js","../../node_modules/@szhsin/react-menu/dist/es/hooks/useItemState.js","../../node_modules/@szhsin/react-menu/dist/es/components/MenuItem.js","../../node_modules/@szhsin/react-menu/dist/es/components/FocusableItem.js","../../node_modules/@szhsin/react-menu/dist/es/components/MenuDivider.js","../../node_modules/@szhsin/react-menu/dist/es/components/MenuHeader.js","../../node_modules/@szhsin/react-menu/dist/es/components/MenuGroup.js","../../src/components/avatar.jsx","../../src/components/link.jsx","../../src/utils/is-rtl.js","../../src/utils/safe-bounding-box-padding.js","../../src/utils/useWindowSize.js","../../src/components/menu2.jsx","../../src/components/submenu2.jsx","../../src/components/menu-confirm.jsx","../../src/components/menu-link.jsx","../../src/components/custom-emoji.jsx","../../src/components/emoji-text.jsx","../../src/components/name-text.jsx","../../src/utils/localeCode2Text.js","../../src/components/relative-time.jsx","../../src/utils/get-translate-target-language.js","../../src/utils/pretty-bytes.js","../../node_modules/compare-versions/lib/esm/utils.js","../../node_modules/compare-versions/lib/esm/compareVersions.js","../../node_modules/compare-versions/lib/esm/compare.js","../../node_modules/compare-versions/lib/esm/satisfies.js","../../src/utils/supports.js","../../node_modules/punycode/punycode.es6.js","../../src/utils/emojify-text.js","../../src/utils/enhance-content.js","../../src/utils/getHTMLText.js","../../src/utils/handle-content-links.js","../../src/utils/i18n-duration.js","../../src/utils/nice-date-time.js","../../src/utils/shorten-number.js","../../src/utils/show-compose.js","../../src/components/account-block.jsx","../../node_modules/retry/lib/retry_operation.js","../../node_modules/retry/lib/retry.js","../../node_modules/retry/index.js","../../node_modules/is-network-error/index.js","../../node_modules/p-retry/index.js","../../node_modules/react-intersection-observer/dist/index.mjs","../../src/components/lazy-shazam.jsx","../../src/components/translation-block.jsx","../../node_modules/idb-keyval/dist/index.js","../../src/utils/db.js","../../src/utils/relationships.js","../../node_modules/@justinribeiro/lite-youtube/lite-youtube.js","../../node_modules/fast-blurhash/index.js","../../node_modules/html-prettify/src/utils/addIndentation.js","../../node_modules/html-prettify/src/utils/toLines.js","../../node_modules/html-prettify/src/index.js","../../node_modules/use-long-press/index.mjs","../../src/components/poll.jsx","../../src/utils/filter-context.js","../../src/utils/filters.js","../../src/utils/html-content-length.js","../../src/utils/speech.js","../../src/utils/status-peek.js","../../node_modules/use-debounce/dist/index.module.js","../../node_modules/use-resize-observer/dist/bundle.esm.js","../../src/utils/useTruncated.js","../../src/utils/visibility-icons-map.js","../../node_modules/react-quick-pinch-zoom/esm/PinchZoom/styles.css.js","../../node_modules/react-quick-pinch-zoom/esm/utils.js","../../node_modules/react-quick-pinch-zoom/esm/PinchZoom/getOffsetBounds.js","../../node_modules/react-quick-pinch-zoom/esm/PinchZoom/component.js","../../src/utils/format-duration.js","../../src/components/media.jsx","../../src/components/status.jsx","../../node_modules/uid/single/index.mjs","../../node_modules/fuse.js/dist/fuse.mjs"],"sourcesContent":["import { useContext, createContext, useState, useCallback, useRef, useLayoutEffect, useEffect } from 'react';\nimport { jsx } from 'react/jsx-runtime';\n\nfunction _extends() {\n return _extends = Object.assign ? Object.assign.bind() : function (n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, _extends.apply(null, arguments);\n}\n\nvar reservedModifierKeywords = ['shift', 'alt', 'meta', 'mod', 'ctrl'];\nvar mappedKeys = {\n esc: 'escape',\n \"return\": 'enter',\n '.': 'period',\n ',': 'comma',\n '-': 'slash',\n ' ': 'space',\n '`': 'backquote',\n '#': 'backslash',\n '+': 'bracketright',\n ShiftLeft: 'shift',\n ShiftRight: 'shift',\n AltLeft: 'alt',\n AltRight: 'alt',\n MetaLeft: 'meta',\n MetaRight: 'meta',\n OSLeft: 'meta',\n OSRight: 'meta',\n ControlLeft: 'ctrl',\n ControlRight: 'ctrl'\n};\nfunction mapKey(key) {\n return (key && mappedKeys[key] || key || '').trim().toLowerCase().replace(/key|digit|numpad|arrow/, '');\n}\nfunction isHotkeyModifier(key) {\n return reservedModifierKeywords.includes(key);\n}\nfunction parseKeysHookInput(keys, splitKey) {\n if (splitKey === void 0) {\n splitKey = ',';\n }\n return keys.split(splitKey);\n}\nfunction parseHotkey(hotkey, combinationKey, description) {\n if (combinationKey === void 0) {\n combinationKey = '+';\n }\n var keys = hotkey.toLocaleLowerCase().split(combinationKey).map(function (k) {\n return mapKey(k);\n });\n var modifiers = {\n alt: keys.includes('alt'),\n ctrl: keys.includes('ctrl') || keys.includes('control'),\n shift: keys.includes('shift'),\n meta: keys.includes('meta'),\n mod: keys.includes('mod')\n };\n var singleCharKeys = keys.filter(function (k) {\n return !reservedModifierKeywords.includes(k);\n });\n return _extends({}, modifiers, {\n keys: singleCharKeys,\n description: description,\n hotkey: hotkey\n });\n}\n\n(function () {\n if (typeof document !== 'undefined') {\n document.addEventListener('keydown', function (e) {\n if (e.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return;\n }\n pushToCurrentlyPressedKeys([mapKey(e.key), mapKey(e.code)]);\n });\n document.addEventListener('keyup', function (e) {\n if (e.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return;\n }\n removeFromCurrentlyPressedKeys([mapKey(e.key), mapKey(e.code)]);\n });\n }\n if (typeof window !== 'undefined') {\n window.addEventListener('blur', function () {\n currentlyPressedKeys.clear();\n });\n }\n})();\nvar currentlyPressedKeys = /*#__PURE__*/new Set();\n// https://github.com/microsoft/TypeScript/issues/17002\nfunction isReadonlyArray(value) {\n return Array.isArray(value);\n}\nfunction isHotkeyPressed(key, splitKey) {\n if (splitKey === void 0) {\n splitKey = ',';\n }\n var hotkeyArray = isReadonlyArray(key) ? key : key.split(splitKey);\n return hotkeyArray.every(function (hotkey) {\n return currentlyPressedKeys.has(hotkey.trim().toLowerCase());\n });\n}\nfunction pushToCurrentlyPressedKeys(key) {\n var hotkeyArray = Array.isArray(key) ? key : [key];\n /*\r\n Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.\r\n https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser\r\n Otherwise the set will hold all ever pressed keys while the meta key is down which leads to wrong results.\r\n */\n if (currentlyPressedKeys.has('meta')) {\n currentlyPressedKeys.forEach(function (key) {\n return !isHotkeyModifier(key) && currentlyPressedKeys[\"delete\"](key.toLowerCase());\n });\n }\n hotkeyArray.forEach(function (hotkey) {\n return currentlyPressedKeys.add(hotkey.toLowerCase());\n });\n}\nfunction removeFromCurrentlyPressedKeys(key) {\n var hotkeyArray = Array.isArray(key) ? key : [key];\n /*\r\n Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.\r\n https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser\r\n Otherwise the set will hold all ever pressed keys while the meta key is down which leads to wrong results.\r\n */\n if (key === 'meta') {\n currentlyPressedKeys.clear();\n } else {\n hotkeyArray.forEach(function (hotkey) {\n return currentlyPressedKeys[\"delete\"](hotkey.toLowerCase());\n });\n }\n}\n\nfunction maybePreventDefault(e, hotkey, preventDefault) {\n if (typeof preventDefault === 'function' && preventDefault(e, hotkey) || preventDefault === true) {\n e.preventDefault();\n }\n}\nfunction isHotkeyEnabled(e, hotkey, enabled) {\n if (typeof enabled === 'function') {\n return enabled(e, hotkey);\n }\n return enabled === true || enabled === undefined;\n}\nfunction isKeyboardEventTriggeredByInput(ev) {\n return isHotkeyEnabledOnTag(ev, ['input', 'textarea', 'select']);\n}\nfunction isHotkeyEnabledOnTag(event, enabledOnTags) {\n if (enabledOnTags === void 0) {\n enabledOnTags = false;\n }\n var target = event.target,\n composed = event.composed;\n var targetTagName = null;\n if (isCustomElement(target) && composed) {\n targetTagName = event.composedPath()[0] && event.composedPath()[0].tagName;\n } else {\n targetTagName = target && target.tagName;\n }\n if (isReadonlyArray(enabledOnTags)) {\n return Boolean(targetTagName && enabledOnTags && enabledOnTags.some(function (tag) {\n var _targetTagName;\n return tag.toLowerCase() === ((_targetTagName = targetTagName) == null ? void 0 : _targetTagName.toLowerCase());\n }));\n }\n return Boolean(targetTagName && enabledOnTags && enabledOnTags);\n}\nfunction isCustomElement(element) {\n // We just do a basic check w/o any complex RegEx or validation against the list of legacy names containing a hyphen,\n // as none of them is likely to be an event target, and it won't hurt anyway if we miss.\n // see: https://html.spec.whatwg.org/multipage/custom-elements.html#prod-potentialcustomelementname\n return !!element.tagName && !element.tagName.startsWith(\"-\") && element.tagName.includes(\"-\");\n}\nfunction isScopeActive(activeScopes, scopes) {\n if (activeScopes.length === 0 && scopes) {\n console.warn('A hotkey has the \"scopes\" option set, however no active scopes were found. If you want to use the global scopes feature, you need to wrap your app in a <HotkeysProvider>');\n return true;\n }\n if (!scopes) {\n return true;\n }\n return activeScopes.some(function (scope) {\n return scopes.includes(scope);\n }) || activeScopes.includes('*');\n}\nvar isHotkeyMatchingKeyboardEvent = function isHotkeyMatchingKeyboardEvent(e, hotkey, ignoreModifiers) {\n if (ignoreModifiers === void 0) {\n ignoreModifiers = false;\n }\n var alt = hotkey.alt,\n meta = hotkey.meta,\n mod = hotkey.mod,\n shift = hotkey.shift,\n ctrl = hotkey.ctrl,\n keys = hotkey.keys;\n var pressedKeyUppercase = e.key,\n code = e.code,\n ctrlKey = e.ctrlKey,\n metaKey = e.metaKey,\n shiftKey = e.shiftKey,\n altKey = e.altKey;\n var keyCode = mapKey(code);\n var pressedKey = pressedKeyUppercase.toLowerCase();\n if (!(keys != null && keys.includes(keyCode)) && !(keys != null && keys.includes(pressedKey)) && !['ctrl', 'control', 'unknown', 'meta', 'alt', 'shift', 'os'].includes(keyCode)) {\n return false;\n }\n if (!ignoreModifiers) {\n // We check the pressed keys for compatibility with the keyup event. In keyup events the modifier flags are not set.\n if (alt === !altKey && pressedKey !== 'alt') {\n return false;\n }\n if (shift === !shiftKey && pressedKey !== 'shift') {\n return false;\n }\n // Mod is a special key name that is checking for meta on macOS and ctrl on other platforms\n if (mod) {\n if (!metaKey && !ctrlKey) {\n return false;\n }\n } else {\n if (meta === !metaKey && pressedKey !== 'meta' && pressedKey !== 'os') {\n return false;\n }\n if (ctrl === !ctrlKey && pressedKey !== 'ctrl' && pressedKey !== 'control') {\n return false;\n }\n }\n }\n // All modifiers are correct, now check the key\n // If the key is set, we check for the key\n if (keys && keys.length === 1 && (keys.includes(pressedKey) || keys.includes(keyCode))) {\n return true;\n } else if (keys) {\n // Check if all keys are present in pressedDownKeys set\n return isHotkeyPressed(keys);\n } else if (!keys) {\n // If the key is not set, we only listen for modifiers, that check went alright, so we return true\n return true;\n }\n // There is nothing that matches.\n return false;\n};\n\nvar BoundHotkeysProxyProvider = /*#__PURE__*/createContext(undefined);\nvar useBoundHotkeysProxy = function useBoundHotkeysProxy() {\n return useContext(BoundHotkeysProxyProvider);\n};\nfunction BoundHotkeysProxyProviderProvider(_ref) {\n var addHotkey = _ref.addHotkey,\n removeHotkey = _ref.removeHotkey,\n children = _ref.children;\n return /*#__PURE__*/jsx(BoundHotkeysProxyProvider.Provider, {\n value: {\n addHotkey: addHotkey,\n removeHotkey: removeHotkey\n },\n children: children\n });\n}\n\nfunction deepEqual(x, y) {\n //@ts-ignore\n return x && y && typeof x === 'object' && typeof y === 'object' ? Object.keys(x).length === Object.keys(y).length &&\n //@ts-ignore\n Object.keys(x).reduce(function (isEqual, key) {\n return isEqual && deepEqual(x[key], y[key]);\n }, true) : x === y;\n}\n\nvar HotkeysContext = /*#__PURE__*/createContext({\n hotkeys: [],\n enabledScopes: [],\n toggleScope: function toggleScope() {},\n enableScope: function enableScope() {},\n disableScope: function disableScope() {}\n});\nvar useHotkeysContext = function useHotkeysContext() {\n return useContext(HotkeysContext);\n};\nvar HotkeysProvider = function HotkeysProvider(_ref) {\n var _ref$initiallyActiveS = _ref.initiallyActiveScopes,\n initiallyActiveScopes = _ref$initiallyActiveS === void 0 ? ['*'] : _ref$initiallyActiveS,\n children = _ref.children;\n var _useState = useState((initiallyActiveScopes == null ? void 0 : initiallyActiveScopes.length) > 0 ? initiallyActiveScopes : ['*']),\n internalActiveScopes = _useState[0],\n setInternalActiveScopes = _useState[1];\n var _useState2 = useState([]),\n boundHotkeys = _useState2[0],\n setBoundHotkeys = _useState2[1];\n var enableScope = useCallback(function (scope) {\n setInternalActiveScopes(function (prev) {\n if (prev.includes('*')) {\n return [scope];\n }\n return Array.from(new Set([].concat(prev, [scope])));\n });\n }, []);\n var disableScope = useCallback(function (scope) {\n setInternalActiveScopes(function (prev) {\n if (prev.filter(function (s) {\n return s !== scope;\n }).length === 0) {\n return ['*'];\n } else {\n return prev.filter(function (s) {\n return s !== scope;\n });\n }\n });\n }, []);\n var toggleScope = useCallback(function (scope) {\n setInternalActiveScopes(function (prev) {\n if (prev.includes(scope)) {\n if (prev.filter(function (s) {\n return s !== scope;\n }).length === 0) {\n return ['*'];\n } else {\n return prev.filter(function (s) {\n return s !== scope;\n });\n }\n } else {\n if (prev.includes('*')) {\n return [scope];\n }\n return Array.from(new Set([].concat(prev, [scope])));\n }\n });\n }, []);\n var addBoundHotkey = useCallback(function (hotkey) {\n setBoundHotkeys(function (prev) {\n return [].concat(prev, [hotkey]);\n });\n }, []);\n var removeBoundHotkey = useCallback(function (hotkey) {\n setBoundHotkeys(function (prev) {\n return prev.filter(function (h) {\n return !deepEqual(h, hotkey);\n });\n });\n }, []);\n return /*#__PURE__*/jsx(HotkeysContext.Provider, {\n value: {\n enabledScopes: internalActiveScopes,\n hotkeys: boundHotkeys,\n enableScope: enableScope,\n disableScope: disableScope,\n toggleScope: toggleScope\n },\n children: /*#__PURE__*/jsx(BoundHotkeysProxyProviderProvider, {\n addHotkey: addBoundHotkey,\n removeHotkey: removeBoundHotkey,\n children: children\n })\n });\n};\n\nfunction useDeepEqualMemo(value) {\n var ref = useRef(undefined);\n if (!deepEqual(ref.current, value)) {\n ref.current = value;\n }\n return ref.current;\n}\n\nvar stopPropagation = function stopPropagation(e) {\n e.stopPropagation();\n e.preventDefault();\n e.stopImmediatePropagation();\n};\nvar useSafeLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect;\nfunction useHotkeys(keys, callback, options, dependencies) {\n var _useState = useState(null),\n ref = _useState[0],\n setRef = _useState[1];\n var hasTriggeredRef = useRef(false);\n var _options = !(options instanceof Array) ? options : !(dependencies instanceof Array) ? dependencies : undefined;\n var _keys = isReadonlyArray(keys) ? keys.join(_options == null ? void 0 : _options.splitKey) : keys;\n var _deps = options instanceof Array ? options : dependencies instanceof Array ? dependencies : undefined;\n var memoisedCB = useCallback(callback, _deps != null ? _deps : []);\n var cbRef = useRef(memoisedCB);\n if (_deps) {\n cbRef.current = memoisedCB;\n } else {\n cbRef.current = callback;\n }\n var memoisedOptions = useDeepEqualMemo(_options);\n var _useHotkeysContext = useHotkeysContext(),\n enabledScopes = _useHotkeysContext.enabledScopes;\n var proxy = useBoundHotkeysProxy();\n useSafeLayoutEffect(function () {\n if ((memoisedOptions == null ? void 0 : memoisedOptions.enabled) === false || !isScopeActive(enabledScopes, memoisedOptions == null ? void 0 : memoisedOptions.scopes)) {\n return;\n }\n var listener = function listener(e, isKeyUp) {\n var _e$target;\n if (isKeyUp === void 0) {\n isKeyUp = false;\n }\n if (isKeyboardEventTriggeredByInput(e) && !isHotkeyEnabledOnTag(e, memoisedOptions == null ? void 0 : memoisedOptions.enableOnFormTags)) {\n return;\n }\n // TODO: SINCE THE EVENT IS NOW ATTACHED TO THE REF, THE ACTIVE ELEMENT CAN NEVER BE INSIDE THE REF. THE HOTKEY ONLY TRIGGERS IF THE\n // REF IS THE ACTIVE ELEMENT. THIS IS A PROBLEM SINCE FOCUSED SUB COMPONENTS WON'T TRIGGER THE HOTKEY.\n if (ref !== null) {\n var rootNode = ref.getRootNode();\n if ((rootNode instanceof Document || rootNode instanceof ShadowRoot) && rootNode.activeElement !== ref && !ref.contains(rootNode.activeElement)) {\n stopPropagation(e);\n return;\n }\n }\n if ((_e$target = e.target) != null && _e$target.isContentEditable && !(memoisedOptions != null && memoisedOptions.enableOnContentEditable)) {\n return;\n }\n parseKeysHookInput(_keys, memoisedOptions == null ? void 0 : memoisedOptions.splitKey).forEach(function (key) {\n var _hotkey$keys;\n var hotkey = parseHotkey(key, memoisedOptions == null ? void 0 : memoisedOptions.combinationKey);\n if (isHotkeyMatchingKeyboardEvent(e, hotkey, memoisedOptions == null ? void 0 : memoisedOptions.ignoreModifiers) || (_hotkey$keys = hotkey.keys) != null && _hotkey$keys.includes('*')) {\n if (memoisedOptions != null && memoisedOptions.ignoreEventWhen != null && memoisedOptions.ignoreEventWhen(e)) {\n return;\n }\n if (isKeyUp && hasTriggeredRef.current) {\n return;\n }\n maybePreventDefault(e, hotkey, memoisedOptions == null ? void 0 : memoisedOptions.preventDefault);\n if (!isHotkeyEnabled(e, hotkey, memoisedOptions == null ? void 0 : memoisedOptions.enabled)) {\n stopPropagation(e);\n return;\n }\n // Execute the user callback for that hotkey\n cbRef.current(e, hotkey);\n if (!isKeyUp) {\n hasTriggeredRef.current = true;\n }\n }\n });\n };\n var handleKeyDown = function handleKeyDown(event) {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return;\n }\n pushToCurrentlyPressedKeys(mapKey(event.code));\n if ((memoisedOptions == null ? void 0 : memoisedOptions.keydown) === undefined && (memoisedOptions == null ? void 0 : memoisedOptions.keyup) !== true || memoisedOptions != null && memoisedOptions.keydown) {\n listener(event);\n }\n };\n var handleKeyUp = function handleKeyUp(event) {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return;\n }\n removeFromCurrentlyPressedKeys(mapKey(event.code));\n hasTriggeredRef.current = false;\n if (memoisedOptions != null && memoisedOptions.keyup) {\n listener(event, true);\n }\n };\n var domNode = ref || (_options == null ? void 0 : _options.document) || document;\n // @ts-ignore\n domNode.addEventListener('keyup', handleKeyUp);\n // @ts-ignore\n domNode.addEventListener('keydown', handleKeyDown);\n if (proxy) {\n parseKeysHookInput(_keys, memoisedOptions == null ? void 0 : memoisedOptions.splitKey).forEach(function (key) {\n return proxy.addHotkey(parseHotkey(key, memoisedOptions == null ? void 0 : memoisedOptions.combinationKey, memoisedOptions == null ? void 0 : memoisedOptions.description));\n });\n }\n return function () {\n // @ts-ignore\n domNode.removeEventListener('keyup', handleKeyUp);\n // @ts-ignore\n domNode.removeEventListener('keydown', handleKeyDown);\n if (proxy) {\n parseKeysHookInput(_keys, memoisedOptions == null ? void 0 : memoisedOptions.splitKey).forEach(function (key) {\n return proxy.removeHotkey(parseHotkey(key, memoisedOptions == null ? void 0 : memoisedOptions.combinationKey, memoisedOptions == null ? void 0 : memoisedOptions.description));\n });\n }\n };\n }, [ref, _keys, memoisedOptions, enabledScopes]);\n return setRef;\n}\n\nfunction useRecordHotkeys() {\n var _useState = useState(new Set()),\n keys = _useState[0],\n setKeys = _useState[1];\n var _useState2 = useState(false),\n isRecording = _useState2[0],\n setIsRecording = _useState2[1];\n var handler = useCallback(function (event) {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n setKeys(function (prev) {\n var newKeys = new Set(prev);\n newKeys.add(mapKey(event.code));\n return newKeys;\n });\n }, []);\n var stop = useCallback(function () {\n if (typeof document !== 'undefined') {\n document.removeEventListener('keydown', handler);\n setIsRecording(false);\n }\n }, [handler]);\n var start = useCallback(function () {\n setKeys(new Set());\n if (typeof document !== 'undefined') {\n stop();\n document.addEventListener('keydown', handler);\n setIsRecording(true);\n }\n }, [handler, stop]);\n var resetKeys = useCallback(function () {\n setKeys(new Set());\n }, []);\n return [keys, {\n start: start,\n stop: stop,\n resetKeys: resetKeys,\n isRecording: isRecording\n }];\n}\n\nexport { HotkeysProvider, isHotkeyPressed, useHotkeys, useHotkeysContext, useRecordHotkeys };\n//# sourceMappingURL=react-hotkeys-hook.esm.js.map\n","/*!\n * Toastify js 1.12.0\n * https://github.com/apvarun/toastify-js\n * @license MIT licensed\n *\n * Copyright (C) 2018 Varun A P\n */\n(function(root, factory) {\n if (typeof module === \"object\" && module.exports) {\n module.exports = factory();\n } else {\n root.Toastify = factory();\n }\n})(this, function(global) {\n // Object initialization\n var Toastify = function(options) {\n // Returning a new init object\n return new Toastify.lib.init(options);\n },\n // Library version\n version = \"1.12.0\";\n\n // Set the default global options\n Toastify.defaults = {\n oldestFirst: true,\n text: \"Toastify is awesome!\",\n node: undefined,\n duration: 3000,\n selector: undefined,\n callback: function () {\n },\n destination: undefined,\n newWindow: false,\n close: false,\n gravity: \"toastify-top\",\n positionLeft: false,\n position: '',\n backgroundColor: '',\n avatar: \"\",\n className: \"\",\n stopOnFocus: true,\n onClick: function () {\n },\n offset: {x: 0, y: 0},\n escapeMarkup: true,\n ariaLive: 'polite',\n style: {background: ''}\n };\n\n // Defining the prototype of the object\n Toastify.lib = Toastify.prototype = {\n toastify: version,\n\n constructor: Toastify,\n\n // Initializing the object with required parameters\n init: function(options) {\n // Verifying and validating the input object\n if (!options) {\n options = {};\n }\n\n // Creating the options object\n this.options = {};\n\n this.toastElement = null;\n\n // Validating the options\n this.options.text = options.text || Toastify.defaults.text; // Display message\n this.options.node = options.node || Toastify.defaults.node; // Display content as node\n this.options.duration = options.duration === 0 ? 0 : options.duration || Toastify.defaults.duration; // Display duration\n this.options.selector = options.selector || Toastify.defaults.selector; // Parent selector\n this.options.callback = options.callback || Toastify.defaults.callback; // Callback after display\n this.options.destination = options.destination || Toastify.defaults.destination; // On-click destination\n this.options.newWindow = options.newWindow || Toastify.defaults.newWindow; // Open destination in new window\n this.options.close = options.close || Toastify.defaults.close; // Show toast close icon\n this.options.gravity = options.gravity === \"bottom\" ? \"toastify-bottom\" : Toastify.defaults.gravity; // toast position - top or bottom\n this.options.positionLeft = options.positionLeft || Toastify.defaults.positionLeft; // toast position - left or right\n this.options.position = options.position || Toastify.defaults.position; // toast position - left or right\n this.options.backgroundColor = options.backgroundColor || Toastify.defaults.backgroundColor; // toast background color\n this.options.avatar = options.avatar || Toastify.defaults.avatar; // img element src - url or a path\n this.options.className = options.className || Toastify.defaults.className; // additional class names for the toast\n this.options.stopOnFocus = options.stopOnFocus === undefined ? Toastify.defaults.stopOnFocus : options.stopOnFocus; // stop timeout on focus\n this.options.onClick = options.onClick || Toastify.defaults.onClick; // Callback after click\n this.options.offset = options.offset || Toastify.defaults.offset; // toast offset\n this.options.escapeMarkup = options.escapeMarkup !== undefined ? options.escapeMarkup : Toastify.defaults.escapeMarkup;\n this.options.ariaLive = options.ariaLive || Toastify.defaults.ariaLive;\n this.options.style = options.style || Toastify.defaults.style;\n if(options.backgroundColor) {\n this.options.style.background = options.backgroundColor;\n }\n\n // Returning the current object for chaining functions\n return this;\n },\n\n // Building the DOM element\n buildToast: function() {\n // Validating if the options are defined\n if (!this.options) {\n throw \"Toastify is not initialized\";\n }\n\n // Creating the DOM object\n var divElement = document.createElement(\"div\");\n divElement.className = \"toastify on \" + this.options.className;\n\n // Positioning toast to left or right or center\n if (!!this.options.position) {\n divElement.className += \" toastify-\" + this.options.position;\n } else {\n // To be depreciated in further versions\n if (this.options.positionLeft === true) {\n divElement.className += \" toastify-left\";\n console.warn('Property `positionLeft` will be depreciated in further versions. Please use `position` instead.')\n } else {\n // Default position\n divElement.className += \" toastify-right\";\n }\n }\n\n // Assigning gravity of element\n divElement.className += \" \" + this.options.gravity;\n\n if (this.options.backgroundColor) {\n // This is being deprecated in favor of using the style HTML DOM property\n console.warn('DEPRECATION NOTICE: \"backgroundColor\" is being deprecated. Please use the \"style.background\" property.');\n }\n\n // Loop through our style object and apply styles to divElement\n for (var property in this.options.style) {\n divElement.style[property] = this.options.style[property];\n }\n\n // Announce the toast to screen readers\n if (this.options.ariaLive) {\n divElement.setAttribute('aria-live', this.options.ariaLive)\n }\n\n // Adding the toast message/node\n if (this.options.node && this.options.node.nodeType === Node.ELEMENT_NODE) {\n // If we have a valid node, we insert it\n divElement.appendChild(this.options.node)\n } else {\n if (this.options.escapeMarkup) {\n divElement.innerText = this.options.text;\n } else {\n divElement.innerHTML = this.options.text;\n }\n\n if (this.options.avatar !== \"\") {\n var avatarElement = document.createElement(\"img\");\n avatarElement.src = this.options.avatar;\n\n avatarElement.className = \"toastify-avatar\";\n\n if (this.options.position == \"left\" || this.options.positionLeft === true) {\n // Adding close icon on the left of content\n divElement.appendChild(avatarElement);\n } else {\n // Adding close icon on the right of content\n divElement.insertAdjacentElement(\"afterbegin\", avatarElement);\n }\n }\n }\n\n // Adding a close icon to the toast\n if (this.options.close === true) {\n // Create a span for close element\n var closeElement = document.createElement(\"button\");\n closeElement.type = \"button\";\n closeElement.setAttribute(\"aria-label\", \"Close\");\n closeElement.className = \"toast-close\";\n closeElement.innerHTML = \"&#10006;\";\n\n // Triggering the removal of toast from DOM on close click\n closeElement.addEventListener(\n \"click\",\n function(event) {\n event.stopPropagation();\n this.removeElement(this.toastElement);\n window.clearTimeout(this.toastElement.timeOutValue);\n }.bind(this)\n );\n\n //Calculating screen width\n var width = window.innerWidth > 0 ? window.innerWidth : screen.width;\n\n // Adding the close icon to the toast element\n // Display on the right if screen width is less than or equal to 360px\n if ((this.options.position == \"left\" || this.options.positionLeft === true) && width > 360) {\n // Adding close icon on the left of content\n divElement.insertAdjacentElement(\"afterbegin\", closeElement);\n } else {\n // Adding close icon on the right of content\n divElement.appendChild(closeElement);\n }\n }\n\n // Clear timeout while toast is focused\n if (this.options.stopOnFocus && this.options.duration > 0) {\n var self = this;\n // stop countdown\n divElement.addEventListener(\n \"mouseover\",\n function(event) {\n window.clearTimeout(divElement.timeOutValue);\n }\n )\n // add back the timeout\n divElement.addEventListener(\n \"mouseleave\",\n function() {\n divElement.timeOutValue = window.setTimeout(\n function() {\n // Remove the toast from DOM\n self.removeElement(divElement);\n },\n self.options.duration\n )\n }\n )\n }\n\n // Adding an on-click destination path\n if (typeof this.options.destination !== \"undefined\") {\n divElement.addEventListener(\n \"click\",\n function(event) {\n event.stopPropagation();\n if (this.options.newWindow === true) {\n window.open(this.options.destination, \"_blank\");\n } else {\n window.location = this.options.destination;\n }\n }.bind(this)\n );\n }\n\n if (typeof this.options.onClick === \"function\" && typeof this.options.destination === \"undefined\") {\n divElement.addEventListener(\n \"click\",\n function(event) {\n event.stopPropagation();\n this.options.onClick();\n }.bind(this)\n );\n }\n\n // Adding offset\n if(typeof this.options.offset === \"object\") {\n\n var x = getAxisOffsetAValue(\"x\", this.options);\n var y = getAxisOffsetAValue(\"y\", this.options);\n\n var xOffset = this.options.position == \"left\" ? x : \"-\" + x;\n var yOffset = this.options.gravity == \"toastify-top\" ? y : \"-\" + y;\n\n divElement.style.transform = \"translate(\" + xOffset + \",\" + yOffset + \")\";\n\n }\n\n // Returning the generated element\n return divElement;\n },\n\n // Displaying the toast\n showToast: function() {\n // Creating the DOM object for the toast\n this.toastElement = this.buildToast();\n\n // Getting the root element to with the toast needs to be added\n var rootElement;\n if (typeof this.options.selector === \"string\") {\n rootElement = document.getElementById(this.options.selector);\n } else if (this.options.selector instanceof HTMLElement || (typeof ShadowRoot !== 'undefined' && this.options.selector instanceof ShadowRoot)) {\n rootElement = this.options.selector;\n } else {\n rootElement = document.body;\n }\n\n // Validating if root element is present in DOM\n if (!rootElement) {\n throw \"Root element is not defined\";\n }\n\n // Adding the DOM element\n var elementToInsert = Toastify.defaults.oldestFirst ? rootElement.firstChild : rootElement.lastChild;\n rootElement.insertBefore(this.toastElement, elementToInsert);\n\n // Repositioning the toasts in case multiple toasts are present\n Toastify.reposition();\n\n if (this.options.duration > 0) {\n this.toastElement.timeOutValue = window.setTimeout(\n function() {\n // Remove the toast from DOM\n this.removeElement(this.toastElement);\n }.bind(this),\n this.options.duration\n ); // Binding `this` for function invocation\n }\n\n // Supporting function chaining\n return this;\n },\n\n hideToast: function() {\n if (this.toastElement.timeOutValue) {\n clearTimeout(this.toastElement.timeOutValue);\n }\n this.removeElement(this.toastElement);\n },\n\n // Removing the element from the DOM\n removeElement: function(toastElement) {\n // Hiding the element\n // toastElement.classList.remove(\"on\");\n toastElement.className = toastElement.className.replace(\" on\", \"\");\n\n // Removing the element from DOM after transition end\n window.setTimeout(\n function() {\n // remove options node if any\n if (this.options.node && this.options.node.parentNode) {\n this.options.node.parentNode.removeChild(this.options.node);\n }\n\n // Remove the element from the DOM, only when the parent node was not removed before.\n if (toastElement.parentNode) {\n toastElement.parentNode.removeChild(toastElement);\n }\n\n // Calling the callback function\n this.options.callback.call(toastElement);\n\n // Repositioning the toasts again\n Toastify.reposition();\n }.bind(this),\n 400\n ); // Binding `this` for function invocation\n },\n };\n\n // Positioning the toasts on the DOM\n Toastify.reposition = function() {\n\n // Top margins with gravity\n var topLeftOffsetSize = {\n top: 15,\n bottom: 15,\n };\n var topRightOffsetSize = {\n top: 15,\n bottom: 15,\n };\n var offsetSize = {\n top: 15,\n bottom: 15,\n };\n\n // Get all toast messages on the DOM\n var allToasts = document.getElementsByClassName(\"toastify\");\n\n var classUsed;\n\n // Modifying the position of each toast element\n for (var i = 0; i < allToasts.length; i++) {\n // Getting the applied gravity\n if (containsClass(allToasts[i], \"toastify-top\") === true) {\n classUsed = \"toastify-top\";\n } else {\n classUsed = \"toastify-bottom\";\n }\n\n var height = allToasts[i].offsetHeight;\n classUsed = classUsed.substr(9, classUsed.length-1)\n // Spacing between toasts\n var offset = 15;\n\n var width = window.innerWidth > 0 ? window.innerWidth : screen.width;\n\n // Show toast in center if screen with less than or equal to 360px\n if (width <= 360) {\n // Setting the position\n allToasts[i].style[classUsed] = offsetSize[classUsed] + \"px\";\n\n offsetSize[classUsed] += height + offset;\n } else {\n if (containsClass(allToasts[i], \"toastify-left\") === true) {\n // Setting the position\n allToasts[i].style[classUsed] = topLeftOffsetSize[classUsed] + \"px\";\n\n topLeftOffsetSize[classUsed] += height + offset;\n } else {\n // Setting the position\n allToasts[i].style[classUsed] = topRightOffsetSize[classUsed] + \"px\";\n\n topRightOffsetSize[classUsed] += height + offset;\n }\n }\n }\n\n // Supporting function chaining\n return this;\n };\n\n // Helper function to get offset.\n function getAxisOffsetAValue(axis, options) {\n\n if(options.offset[axis]) {\n if(isNaN(options.offset[axis])) {\n return options.offset[axis];\n }\n else {\n return options.offset[axis] + 'px';\n }\n }\n\n return '0px';\n\n }\n\n function containsClass(elem, yourClass) {\n if (!elem || typeof yourClass !== \"string\") {\n return false;\n } else if (\n elem.className &&\n elem.className\n .trim()\n .split(/\\s+/gi)\n .indexOf(yourClass) > -1\n ) {\n return true;\n } else {\n return false;\n }\n }\n\n // Setting up the prototype for the init object\n Toastify.lib.init.prototype = Toastify.lib;\n\n // Returning the Toastify function to be assigned to the window object/module\n return Toastify;\n});\n","import Toastify from 'toastify-js';\n\nwindow._showToast = showToast;\n\nfunction showToast(props) {\n if (typeof props === 'string') {\n props = { text: props };\n }\n const { onClick, delay, ...rest } = props;\n const toast = Toastify({\n className: `${onClick || props.destination ? 'shiny-pill' : ''}`,\n gravity: 'bottom',\n position: 'center',\n ...rest,\n onClick: () => {\n onClick?.(toast); // Pass in the object itself!\n },\n });\n if (delay) {\n setTimeout(() => {\n toast.showToast();\n }, delay);\n } else {\n toast.showToast();\n }\n return toast;\n}\n\nexport default showToast;\n","import { useEffect, useRef } from 'preact/hooks';\n\nfunction useInterval(fn, delay, deps, immediate) {\n const savedCallback = useRef(fn);\n useEffect(() => {\n savedCallback.current = fn;\n }, [fn, deps]);\n\n useEffect(() => {\n if (!immediate || delay === null || delay === false) return;\n savedCallback.current();\n }, [immediate]);\n\n useEffect(() => {\n if (delay === null || delay === false) return;\n const tick = () => savedCallback.current();\n const id = setInterval(tick, delay);\n return () => clearInterval(id);\n }, [delay]);\n}\n\nexport default useInterval;\n","import { t, Trans } from '@lingui/macro';\n\nexport default function openCompose(opts) {\n const url = URL.parse('/compose/', window.location);\n const { width: screenWidth, height: screenHeight } = window.screen;\n const left = Math.max(0, (screenWidth - 600) / 2);\n const top = Math.max(0, (screenHeight - 450) / 2);\n const width = Math.min(screenWidth, 600);\n const height = Math.min(screenHeight, 450);\n const winUID = opts?.uid || Math.random();\n const newWin = window.open(\n url,\n 'compose' + winUID,\n `width=${width},height=${height},left=${left},top=${top}`,\n );\n\n if (newWin) {\n // if (masto) {\n // newWin.masto = masto;\n // }\n\n newWin.__COMPOSE__ = opts;\n } else {\n alert(t`Looks like your browser is blocking popups.`);\n }\n\n return newWin;\n}\n","const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); // https://stackoverflow.com/a/23522755\n\nexport default function openOSK() {\n if (isSafari) {\n const fauxEl = document.createElement('input');\n fauxEl.style.position = 'absolute';\n fauxEl.style.top = '0';\n fauxEl.style.left = '0';\n fauxEl.style.opacity = '0';\n document.body.appendChild(fauxEl);\n fauxEl.focus();\n setTimeout(() => {\n document.body.removeChild(fauxEl);\n }, 500);\n }\n}\n","export const ICONS = {\n x: () => import('@iconify-icons/mingcute/close-line'),\n heart: () => import('@iconify-icons/mingcute/heart-line'),\n bookmark: () => import('@iconify-icons/mingcute/bookmark-line'),\n 'check-circle': () => import('@iconify-icons/mingcute/check-circle-line'),\n 'x-circle': () => import('@iconify-icons/mingcute/close-circle-line'),\n transfer: () => import('@iconify-icons/mingcute/transfer-4-line'),\n rocket: () => import('@iconify-icons/mingcute/rocket-line'),\n 'arrow-left': {\n module: () => import('@iconify-icons/mingcute/arrow-left-line'),\n rtl: true,\n },\n 'arrow-right': {\n module: () => import('@iconify-icons/mingcute/arrow-right-line'),\n rtl: true,\n },\n 'arrow-up': () => import('@iconify-icons/mingcute/arrow-up-line'),\n 'arrow-down': () => import('@iconify-icons/mingcute/arrow-down-line'),\n earth: () => import('@iconify-icons/mingcute/earth-line'),\n lock: () => import('@iconify-icons/mingcute/lock-line'),\n unlock: () => import('@iconify-icons/mingcute/unlock-line'),\n 'eye-close': () => import('@iconify-icons/mingcute/eye-close-line'),\n 'eye-open': () => import('@iconify-icons/mingcute/eye-2-line'),\n message: () => import('@iconify-icons/mingcute/mail-line'),\n comment: {\n module: () => import('@iconify-icons/mingcute/chat-3-line'),\n rtl: true,\n },\n comment2: {\n module: () => import('@iconify-icons/mingcute/comment-2-line'),\n rtl: true,\n },\n home: () => import('@iconify-icons/mingcute/home-3-line'),\n notification: () => import('@iconify-icons/mingcute/notification-line'),\n follow: () => import('@iconify-icons/mingcute/user-follow-line'),\n 'follow-add': () => import('@iconify-icons/mingcute/user-add-line'),\n poll: [() => import('@iconify-icons/mingcute/chart-bar-line'), '90deg'],\n pencil: () => import('@iconify-icons/mingcute/pencil-line'),\n quill: () => import('@iconify-icons/mingcute/quill-pen-line'),\n at: () => import('@iconify-icons/mingcute/at-line'),\n attachment: () => import('@iconify-icons/mingcute/attachment-line'),\n upload: () => import('@iconify-icons/mingcute/upload-3-line'),\n gear: () => import('@iconify-icons/mingcute/settings-3-line'),\n more: () => import('@iconify-icons/mingcute/more-3-line'),\n more2: () => import('@iconify-icons/mingcute/more-1-fill'),\n external: {\n module: () => import('@iconify-icons/mingcute/external-link-line'),\n rtl: true,\n },\n popout: {\n module: () => import('@iconify-icons/mingcute/external-link-line'),\n rtl: true,\n },\n popin: {\n module: () => import('@iconify-icons/mingcute/external-link-line'),\n rotate: '180deg',\n rtl: true,\n },\n plus: () => import('@iconify-icons/mingcute/add-circle-line'),\n 'chevron-left': {\n module: () => import('@iconify-icons/mingcute/left-line'),\n rtl: true,\n },\n 'chevron-right': {\n module: () => import('@iconify-icons/mingcute/right-line'),\n rtl: true,\n },\n 'chevron-down': () => import('@iconify-icons/mingcute/down-line'),\n reply: {\n module: () => import('@iconify-icons/mingcute/share-forward-line'),\n rotate: '180deg',\n flip: 'horizontal',\n rtl: true,\n },\n thread: () => import('@iconify-icons/mingcute/route-line'),\n group: {\n module: () => import('@iconify-icons/mingcute/group-line'),\n rtl: true,\n },\n bot: () => import('@iconify-icons/mingcute/android-2-line'),\n menu: () => import('@iconify-icons/mingcute/rows-4-line'),\n list: {\n module: () => import('@iconify-icons/mingcute/list-check-line'),\n rtl: true,\n },\n search: () => import('@iconify-icons/mingcute/search-2-line'),\n hashtag: () => import('@iconify-icons/mingcute/hashtag-line'),\n info: () => import('@iconify-icons/mingcute/information-line'),\n shortcut: () => import('@iconify-icons/mingcute/lightning-line'),\n user: () => import('@iconify-icons/mingcute/user-4-line'),\n following: () => import('@iconify-icons/mingcute/walk-line'),\n pin: () => import('@iconify-icons/mingcute/pin-line'),\n unpin: [() => import('@iconify-icons/mingcute/pin-line'), '180deg'],\n bus: () => import('@iconify-icons/mingcute/bus-2-line'),\n link: () => import('@iconify-icons/mingcute/link-2-line'),\n history: () => import('@iconify-icons/mingcute/history-line'),\n share: () => import('@iconify-icons/mingcute/share-2-line'),\n sparkles: () => import('@iconify-icons/mingcute/sparkles-line'),\n sparkles2: () => import('@iconify-icons/mingcute/sparkles-2-line'),\n exit: {\n module: () => import('@iconify-icons/mingcute/exit-line'),\n rtl: true,\n },\n translate: () => import('@iconify-icons/mingcute/translate-line'),\n play: () => import('@iconify-icons/mingcute/play-fill'),\n trash: () => import('@iconify-icons/mingcute/delete-2-line'),\n mute: {\n module: () => import('@iconify-icons/mingcute/volume-mute-line'),\n rtl: true,\n },\n unmute: {\n module: () => import('@iconify-icons/mingcute/volume-line'),\n rtl: true,\n },\n block: () => import('@iconify-icons/mingcute/forbid-circle-line'),\n unblock: [\n () => import('@iconify-icons/mingcute/forbid-circle-line'),\n '180deg',\n ],\n flag: () => import('@iconify-icons/mingcute/flag-1-line'),\n time: () => import('@iconify-icons/mingcute/time-line'),\n refresh: () => import('@iconify-icons/mingcute/refresh-2-line'),\n emoji2: () => import('@iconify-icons/mingcute/emoji-2-line'),\n filter: () => import('@iconify-icons/mingcute/filter-2-line'),\n filters: () => import('@iconify-icons/mingcute/filter-line'),\n chart: () => import('@iconify-icons/mingcute/chart-line-line'),\n react: () => import('@iconify-icons/mingcute/react-line'),\n layout4: {\n module: () => import('@iconify-icons/mingcute/layout-4-line'),\n rtl: true,\n },\n layout5: () => import('@iconify-icons/mingcute/layout-5-line'),\n announce: {\n module: () => import('@iconify-icons/mingcute/announcement-line'),\n rtl: true,\n },\n alert: () => import('@iconify-icons/mingcute/alert-line'),\n round: () => import('@iconify-icons/mingcute/round-fill'),\n 'arrow-up-circle': () =>\n import('@iconify-icons/mingcute/arrow-up-circle-line'),\n 'arrow-down-circle': () =>\n import('@iconify-icons/mingcute/arrow-down-circle-line'),\n clipboard: {\n module: () => import('@iconify-icons/mingcute/clipboard-line'),\n rtl: true,\n },\n 'account-edit': () => import('@iconify-icons/mingcute/user-edit-line'),\n 'account-warning': () => import('@iconify-icons/mingcute/user-warning-line'),\n keyboard: () => import('@iconify-icons/mingcute/keyboard-line'),\n cloud: () => import('@iconify-icons/mingcute/cloud-line'),\n month: {\n module: () => import('@iconify-icons/mingcute/calendar-month-line'),\n rtl: true,\n },\n media: () => import('@iconify-icons/mingcute/photo-album-line'),\n speak: () => import('@iconify-icons/mingcute/radar-line'),\n building: () => import('@iconify-icons/mingcute/building-5-line'),\n history2: {\n module: () => import('@iconify-icons/mingcute/history-2-line'),\n rtl: true,\n },\n document: () => import('@iconify-icons/mingcute/document-line'),\n 'arrows-right': {\n module: () => import('@iconify-icons/mingcute/arrows-right-line'),\n rtl: true,\n },\n code: () => import('@iconify-icons/mingcute/code-line'),\n copy: () => import('@iconify-icons/mingcute/copy-2-line'),\n quote: {\n module: () => import('@iconify-icons/mingcute/quote-left-line'),\n rtl: true,\n },\n settings: () => import('@iconify-icons/mingcute/settings-6-line'),\n 'heart-break': () => import('@iconify-icons/mingcute/heart-crack-line'),\n 'user-x': () => import('@iconify-icons/mingcute/user-x-line'),\n minimize: () => import('@iconify-icons/mingcute/arrows-down-line'),\n};\n","import moize from 'moize';\nimport { useEffect, useRef, useState } from 'preact/hooks';\n\nimport { ICONS } from './ICONS';\n\nconst SIZES = {\n s: 12,\n m: 16,\n l: 20,\n xl: 24,\n xxl: 32,\n};\n\nconst ICONDATA = {};\n\n// Memoize the dangerouslySetInnerHTML of the SVGs\nconst SVGICon = moize(\n function ({ width, height, body, rotate, flip }) {\n return (\n <svg\n viewBox={`0 0 ${width} ${height}`}\n dangerouslySetInnerHTML={{ __html: body }}\n style={{\n transform: `${rotate ? `rotate(${rotate})` : ''} ${\n flip ? `scaleX(-1)` : ''\n }`,\n }}\n />\n );\n },\n {\n isShallowEqual: true,\n maxSize: Object.keys(ICONS).length,\n matchesArg: (cacheKeyArg, keyArg) =>\n cacheKeyArg.icon === keyArg.icon && cacheKeyArg.body === keyArg.body,\n },\n);\n\nfunction Icon({\n icon,\n size = 'm',\n alt,\n title,\n class: className = '',\n style = {},\n}) {\n if (!icon) return null;\n\n const iconSize = SIZES[size];\n let iconBlock = ICONS[icon];\n if (!iconBlock) {\n console.warn(`Icon ${icon} not found`);\n return null;\n }\n\n let rotate,\n flip,\n rtl = false;\n if (Array.isArray(iconBlock)) {\n [iconBlock, rotate, flip] = iconBlock;\n } else if (typeof iconBlock === 'object') {\n ({ rotate, flip, rtl } = iconBlock);\n iconBlock = iconBlock.module;\n }\n\n const [iconData, setIconData] = useState(ICONDATA[icon]);\n const currentIcon = useRef(icon);\n useEffect(() => {\n if (iconData && currentIcon.current === icon) return;\n (async () => {\n const iconB = await iconBlock();\n setIconData(iconB.default);\n ICONDATA[icon] = iconB.default;\n })();\n currentIcon.current = icon;\n }, [icon]);\n\n return (\n <span\n class={`icon ${className} ${rtl ? 'rtl-flip' : ''}`}\n title={title || alt}\n style={{\n width: `${iconSize}px`,\n height: `${iconSize}px`,\n ...style,\n }}\n data-icon={icon}\n >\n {iconData && (\n // <svg\n // width={iconSize}\n // height={iconSize}\n // viewBox={`0 0 ${iconData.width} ${iconData.height}`}\n // dangerouslySetInnerHTML={{ __html: iconData.body }}\n // style={{\n // transform: `${rotate ? `rotate(${rotate})` : ''} ${\n // flip ? `scaleX(-1)` : ''\n // }`,\n // }}\n // />\n <SVGICon\n icon={icon}\n width={iconData.width}\n height={iconData.height}\n body={iconData.body}\n rotate={rotate}\n flip={flip}\n />\n )}\n </span>\n );\n}\n\nexport default Icon;\n","import { useEffect } from 'preact/hooks';\n\nfunction useCloseWatcher(fn, deps = []) {\n if (!fn || typeof fn !== 'function') return;\n useEffect(() => {\n const watcher = new CloseWatcher();\n watcher.addEventListener('close', fn);\n return () => {\n watcher.destroy();\n };\n }, deps);\n}\n\nexport default window.CloseWatcher ? useCloseWatcher : () => {};\n","import './modal.css';\n\nimport { createPortal } from 'preact/compat';\nimport { useEffect, useRef } from 'preact/hooks';\nimport { useHotkeys } from 'react-hotkeys-hook';\n\nimport useCloseWatcher from '../utils/useCloseWatcher';\n\nconst $modalContainer = document.getElementById('modal-container');\n\nfunction Modal({ children, onClose, onClick, class: className, minimized }) {\n if (!children) return null;\n\n const modalRef = useRef();\n useEffect(() => {\n let timer = setTimeout(() => {\n const focusElement = modalRef.current?.querySelector('[tabindex=\"-1\"]');\n if (focusElement) {\n focusElement.focus();\n }\n }, 100);\n return () => clearTimeout(timer);\n }, []);\n\n const supportsCloseWatcher = window.CloseWatcher;\n const escRef = useHotkeys(\n 'esc',\n () => {\n setTimeout(() => {\n onClose?.();\n }, 0);\n },\n {\n enabled: !supportsCloseWatcher && !!onClose,\n // Using keyup and setTimeout above\n // This will run \"later\" to prevent clash with esc handlers from other components\n keydown: false,\n keyup: true,\n },\n [onClose],\n );\n useCloseWatcher(onClose, [onClose]);\n\n useEffect(() => {\n const $deckContainers = document.querySelectorAll('.deck-container');\n if (minimized) {\n // Similar to focusDeck in focus-deck.jsx\n // Focus last deck\n const page = $deckContainers[$deckContainers.length - 1]; // last one\n if (page && page.tabIndex === -1) {\n page.focus();\n }\n } else {\n if (children) {\n $deckContainers.forEach(($deckContainer) => {\n $deckContainer.setAttribute('inert', '');\n });\n } else {\n $deckContainers.forEach(($deckContainer) => {\n $deckContainer.removeAttribute('inert');\n });\n }\n }\n return () => {\n $deckContainers.forEach(($deckContainer) => {\n $deckContainer.removeAttribute('inert');\n });\n };\n }, [children, minimized]);\n\n const Modal = (\n <div\n ref={(node) => {\n modalRef.current = node;\n escRef(node?.querySelector?.('[tabindex=\"-1\"]') || node);\n }}\n className={className}\n onClick={(e) => {\n onClick?.(e);\n if (e.target === e.currentTarget) {\n onClose?.(e);\n }\n }}\n tabIndex={minimized ? 0 : '-1'}\n inert={minimized}\n onFocus={(e) => {\n try {\n if (e.target === e.currentTarget) {\n const focusElement =\n modalRef.current?.querySelector('[tabindex=\"-1\"]');\n const isFocusable =\n !!focusElement &&\n getComputedStyle(focusElement)?.pointerEvents !== 'none';\n if (focusElement && isFocusable) {\n focusElement.focus();\n }\n }\n } catch (err) {\n console.error(err);\n }\n }}\n >\n {children}\n </div>\n );\n\n return createPortal(Modal, $modalContainer);\n\n // return createPortal(children, $modalContainer);\n}\n\nexport default Modal;\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n };\n shim.isRequired = shim;\n function getShim() {\n return shim;\n };\n // Important!\n // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n var ReactPropTypes = {\n array: shim,\n bigint: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n elementType: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim,\n\n checkPropTypes: emptyFunctionWithReset,\n resetWarningCache: emptyFunction\n };\n\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactIs = require('react-is');\n\n // By explicitly using `prop-types` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n // By explicitly using `prop-types` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = require('./factoryWithThrowingShims')();\n}\n","import { unstable_batchedUpdates } from 'react-dom';\n\nconst isMenuOpen = state => !!state && state[0] === 'o';\nconst batchedUpdates = unstable_batchedUpdates || (callback => callback());\nconst values = Object.values || (obj => Object.keys(obj).map(key => obj[key]));\nconst getTransition = (transition, name) => transition === true || !!(transition && transition[name]);\nconst safeCall = (fn, arg) => typeof fn === 'function' ? fn(arg) : fn;\nconst internalKey = '_szhsinMenu';\nconst getName = component => component[internalKey];\nconst defineName = (name, component) => Object.defineProperty(component, internalKey, {\n value: name\n});\nconst mergeProps = (target, source) => {\n source && Object.keys(source).forEach(key => {\n const targetProp = target[key];\n const sourceProp = source[key];\n if (typeof sourceProp === 'function' && targetProp) {\n target[key] = (...arg) => {\n sourceProp(...arg);\n targetProp(...arg);\n };\n } else {\n target[key] = sourceProp;\n }\n });\n return target;\n};\nconst parsePadding = paddingStr => {\n if (typeof paddingStr !== 'string') return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n const padding = paddingStr.trim().split(/\\s+/, 4).map(parseFloat);\n const top = !isNaN(padding[0]) ? padding[0] : 0;\n const right = !isNaN(padding[1]) ? padding[1] : top;\n return {\n top,\n right,\n bottom: !isNaN(padding[2]) ? padding[2] : top,\n left: !isNaN(padding[3]) ? padding[3] : right\n };\n};\nconst getScrollAncestor = node => {\n while (node) {\n node = node.parentNode;\n if (!node || node === document.body || !node.parentNode) return;\n const {\n overflow,\n overflowX,\n overflowY\n } = getComputedStyle(node);\n if (/auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX)) return node;\n }\n};\nfunction commonProps(isDisabled, isHovering) {\n return {\n 'aria-disabled': isDisabled || undefined,\n tabIndex: isHovering ? 0 : -1\n };\n}\nfunction indexOfNode(nodeList, node) {\n for (let i = 0; i < nodeList.length; i++) {\n if (nodeList[i] === node) return i;\n }\n return -1;\n}\n\nexport { batchedUpdates, commonProps, defineName, getName, getScrollAncestor, getTransition, indexOfNode, isMenuOpen, mergeProps, parsePadding, safeCall, values };\n","import { oneOfType, string, func, object, bool, number, oneOf, exact } from 'prop-types';\n\nconst stylePropTypes = name => ({\n [name ? `${name}ClassName` : 'className']: oneOfType([string, func])\n});\nconst menuPropTypes = {\n className: string,\n ...stylePropTypes('menu'),\n arrowProps: object,\n focusProps: object,\n menuStyle: object,\n arrow: bool,\n setDownOverflow: bool,\n gap: number,\n shift: number,\n align: /*#__PURE__*/oneOf(['start', 'center', 'end']),\n direction: /*#__PURE__*/oneOf(['left', 'right', 'top', 'bottom']),\n position: /*#__PURE__*/oneOf(['auto', 'anchor', 'initial']),\n overflow: /*#__PURE__*/oneOf(['auto', 'visible', 'hidden'])\n};\nconst rootMenuPropTypes = {\n ...menuPropTypes,\n containerProps: object,\n initialMounted: bool,\n unmountOnClose: bool,\n transition: /*#__PURE__*/oneOfType([bool, /*#__PURE__*/exact({\n open: bool,\n close: bool,\n item: bool\n })]),\n transitionTimeout: number,\n boundingBoxRef: object,\n boundingBoxPadding: string,\n reposition: /*#__PURE__*/oneOf(['auto', 'initial']),\n repositionFlag: /*#__PURE__*/oneOfType([string, number]),\n viewScroll: /*#__PURE__*/oneOf(['auto', 'close', 'initial']),\n submenuOpenDelay: number,\n submenuCloseDelay: number,\n portal: /*#__PURE__*/oneOfType([bool, /*#__PURE__*/exact({\n target: object,\n stablePosition: bool\n })]),\n theming: string,\n onItemClick: func\n};\nconst uncontrolledMenuPropTypes = {\n instanceRef: /*#__PURE__*/oneOfType([object, func]),\n onMenuChange: func\n};\n\nexport { menuPropTypes, rootMenuPropTypes, stylePropTypes, uncontrolledMenuPropTypes };\n","import { useMemo } from 'react';\n\nconst useBEM = ({\n block,\n element,\n modifiers,\n className\n}) => useMemo(() => {\n const blockElement = element ? `${block}__${element}` : block;\n let classString = blockElement;\n modifiers && Object.keys(modifiers).forEach(name => {\n const value = modifiers[name];\n if (value) classString += ` ${blockElement}--${value === true ? name : `${name}-${value}`}`;\n });\n let expandedClassName = typeof className === 'function' ? className(modifiers) : className;\n if (typeof expandedClassName === 'string') {\n expandedClassName = expandedClassName.trim();\n if (expandedClassName) classString += ` ${expandedClassName}`;\n }\n return classString;\n}, [block, element, modifiers, className]);\n\nexport { useBEM };\n","import { createContext } from 'react';\n\nconst menuContainerClass = 'szh-menu-container';\nconst menuClass = 'szh-menu';\nconst menuButtonClass = 'szh-menu-button';\nconst menuArrowClass = 'arrow';\nconst menuItemClass = 'item';\nconst menuDividerClass = 'divider';\nconst menuHeaderClass = 'header';\nconst menuGroupClass = 'group';\nconst subMenuClass = 'submenu';\nconst radioGroupClass = 'radio-group';\nconst HoverItemContext = /*#__PURE__*/createContext();\nconst MenuListItemContext = /*#__PURE__*/createContext({});\nconst MenuListContext = /*#__PURE__*/createContext({});\nconst EventHandlersContext = /*#__PURE__*/createContext({});\nconst RadioGroupContext = /*#__PURE__*/createContext({});\nconst SettingsContext = /*#__PURE__*/createContext({});\nconst Keys = /*#__PURE__*/Object.freeze({\n ENTER: 'Enter',\n ESC: 'Escape',\n SPACE: ' ',\n HOME: 'Home',\n END: 'End',\n LEFT: 'ArrowLeft',\n RIGHT: 'ArrowRight',\n UP: 'ArrowUp',\n DOWN: 'ArrowDown'\n});\nconst HoverActionTypes = /*#__PURE__*/Object.freeze({\n RESET: 0,\n SET: 1,\n UNSET: 2,\n INCREASE: 3,\n DECREASE: 4,\n FIRST: 5,\n LAST: 6,\n SET_INDEX: 7\n});\nconst CloseReason = /*#__PURE__*/Object.freeze({\n CLICK: 'click',\n CANCEL: 'cancel',\n BLUR: 'blur',\n SCROLL: 'scroll'\n});\nconst FocusPositions = /*#__PURE__*/Object.freeze({\n FIRST: 'first',\n LAST: 'last'\n});\nconst MenuStateMap = /*#__PURE__*/Object.freeze({\n entering: 'opening',\n entered: 'open',\n exiting: 'closing',\n exited: 'closed'\n});\nconst positionAbsolute = 'absolute';\nconst roleNone = 'none';\nconst roleMenuitem = 'menuitem';\n\nexport { CloseReason, EventHandlersContext, FocusPositions, HoverActionTypes, HoverItemContext, Keys, MenuListContext, MenuListItemContext, MenuStateMap, RadioGroupContext, SettingsContext, menuArrowClass, menuButtonClass, menuClass, menuContainerClass, menuDividerClass, menuGroupClass, menuHeaderClass, menuItemClass, positionAbsolute, radioGroupClass, roleMenuitem, roleNone, subMenuClass };\n","import { useMemo } from 'react';\nimport { jsx } from 'react/jsx-runtime';\nimport { mergeProps, getTransition, safeCall } from '../utils/utils.js';\nimport { useBEM } from '../hooks/useBEM.js';\nimport { menuContainerClass, Keys, CloseReason } from '../utils/constants.js';\n\nconst MenuContainer = ({\n className,\n containerRef,\n containerProps,\n children,\n isOpen,\n theming,\n transition,\n onClose\n}) => {\n const itemTransition = getTransition(transition, 'item');\n const onKeyDown = ({\n key\n }) => {\n switch (key) {\n case Keys.ESC:\n safeCall(onClose, {\n key,\n reason: CloseReason.CANCEL\n });\n break;\n }\n };\n const onBlur = e => {\n if (isOpen && !e.currentTarget.contains(e.relatedTarget)) {\n safeCall(onClose, {\n reason: CloseReason.BLUR\n });\n }\n };\n return /*#__PURE__*/jsx(\"div\", {\n ...mergeProps({\n onKeyDown,\n onBlur\n }, containerProps),\n className: useBEM({\n block: menuContainerClass,\n modifiers: useMemo(() => ({\n theme: theming,\n itemTransition\n }), [theming, itemTransition]),\n className\n }),\n style: {\n position: 'absolute',\n ...(containerProps == null ? void 0 : containerProps.style)\n },\n ref: containerRef,\n children: children\n });\n};\n\nexport { MenuContainer };\n","const createSubmenuCtx = () => {\n let timer,\n count = 0;\n return {\n toggle: isOpen => {\n isOpen ? count++ : count--;\n count = Math.max(count, 0);\n },\n on: (closeDelay, pending, settled) => {\n if (count) {\n if (!timer) timer = setTimeout(() => {\n timer = 0;\n pending();\n }, closeDelay);\n } else {\n settled == null || settled();\n }\n },\n off: () => {\n if (timer) {\n clearTimeout(timer);\n timer = 0;\n }\n }\n };\n};\n\nexport { createSubmenuCtx };\n","import { useState, useRef, useCallback } from 'react';\nimport { HoverActionTypes } from '../utils/constants.js';\nimport { indexOfNode } from '../utils/utils.js';\n\nconst useItems = (menuRef, focusRef) => {\n const [hoverItem, setHoverItem] = useState();\n const stateRef = useRef({\n items: [],\n hoverIndex: -1,\n sorted: false\n });\n const mutableState = stateRef.current;\n const updateItems = useCallback((item, isMounted) => {\n const {\n items\n } = mutableState;\n if (!item) {\n mutableState.items = [];\n } else if (isMounted) {\n items.push(item);\n } else {\n const index = items.indexOf(item);\n if (index > -1) {\n items.splice(index, 1);\n if (item.contains(document.activeElement)) {\n focusRef.current.focus();\n setHoverItem();\n }\n }\n }\n mutableState.hoverIndex = -1;\n mutableState.sorted = false;\n }, [mutableState, focusRef]);\n const dispatch = useCallback((actionType, item, nextIndex) => {\n const {\n items,\n hoverIndex\n } = mutableState;\n const sortItems = () => {\n if (mutableState.sorted) return;\n const orderedNodes = menuRef.current.querySelectorAll('.szh-menu__item');\n items.sort((a, b) => indexOfNode(orderedNodes, a) - indexOfNode(orderedNodes, b));\n mutableState.sorted = true;\n };\n let index = -1,\n newItem = undefined;\n switch (actionType) {\n case HoverActionTypes.RESET:\n break;\n case HoverActionTypes.SET:\n newItem = item;\n break;\n case HoverActionTypes.UNSET:\n newItem = prevItem => prevItem === item ? undefined : prevItem;\n break;\n case HoverActionTypes.FIRST:\n sortItems();\n index = 0;\n newItem = items[index];\n break;\n case HoverActionTypes.LAST:\n sortItems();\n index = items.length - 1;\n newItem = items[index];\n break;\n case HoverActionTypes.SET_INDEX:\n sortItems();\n index = nextIndex;\n newItem = items[index];\n break;\n case HoverActionTypes.INCREASE:\n sortItems();\n index = hoverIndex;\n if (index < 0) index = items.indexOf(item);\n index++;\n if (index >= items.length) index = 0;\n newItem = items[index];\n break;\n case HoverActionTypes.DECREASE:\n sortItems();\n index = hoverIndex;\n if (index < 0) index = items.indexOf(item);\n index--;\n if (index < 0) index = items.length - 1;\n newItem = items[index];\n break;\n default:\n if (process.env.NODE_ENV !== 'production') throw new Error(`[React-Menu] Unknown hover action type: ${actionType}`);\n }\n if (!newItem) index = -1;\n setHoverItem(newItem);\n mutableState.hoverIndex = index;\n }, [menuRef, mutableState]);\n return {\n hoverItem,\n dispatch,\n updateItems\n };\n};\n\nexport { useItems };\n","const getNativeDimension = (transformed, untransformed) => Math.round(transformed) === untransformed ? transformed : untransformed;\nconst getNormalizedClientRect = element => {\n const rect = element.getBoundingClientRect();\n rect.width = getNativeDimension(rect.width, element.offsetWidth);\n rect.height = getNativeDimension(rect.height, element.offsetHeight);\n return rect;\n};\n\nexport { getNormalizedClientRect };\n","import { getNormalizedClientRect } from './getNormalizedClientRect.js';\nimport { parsePadding } from '../utils/utils.js';\n\nconst getPositionHelpers = (containerRef, menuRef, menuScroll, boundingBoxPadding) => {\n const menuRect = getNormalizedClientRect(menuRef.current);\n const containerRect = containerRef.current.getBoundingClientRect();\n const boundingRect = menuScroll === window ? {\n left: 0,\n top: 0,\n right: document.documentElement.clientWidth,\n bottom: window.innerHeight\n } : menuScroll.getBoundingClientRect();\n const padding = parsePadding(boundingBoxPadding);\n const getLeftOverflow = x => x + containerRect.left - boundingRect.left - padding.left;\n const getRightOverflow = x => x + containerRect.left + menuRect.width - boundingRect.right + padding.right;\n const getTopOverflow = y => y + containerRect.top - boundingRect.top - padding.top;\n const getBottomOverflow = y => y + containerRect.top + menuRect.height - boundingRect.bottom + padding.bottom;\n const confineHorizontally = x => {\n let leftOverflow = getLeftOverflow(x);\n if (leftOverflow < 0) {\n x -= leftOverflow;\n } else {\n const rightOverflow = getRightOverflow(x);\n if (rightOverflow > 0) {\n x -= rightOverflow;\n leftOverflow = getLeftOverflow(x);\n if (leftOverflow < 0) x -= leftOverflow;\n }\n }\n return x;\n };\n const confineVertically = y => {\n let topOverflow = getTopOverflow(y);\n if (topOverflow < 0) {\n y -= topOverflow;\n } else {\n const bottomOverflow = getBottomOverflow(y);\n if (bottomOverflow > 0) {\n y -= bottomOverflow;\n topOverflow = getTopOverflow(y);\n if (topOverflow < 0) y -= topOverflow;\n }\n }\n return y;\n };\n return {\n menuRect,\n containerRect,\n getLeftOverflow,\n getRightOverflow,\n getTopOverflow,\n getBottomOverflow,\n confineHorizontally,\n confineVertically\n };\n};\n\nexport { getPositionHelpers };\n","const placeArrowVertical = ({\n arrowRef,\n menuY,\n anchorRect,\n containerRect,\n menuRect\n}) => {\n let y = anchorRect.top - containerRect.top - menuY + anchorRect.height / 2;\n const offset = arrowRef.current.offsetHeight * 1.25;\n y = Math.max(offset, y);\n y = Math.min(y, menuRect.height - offset);\n return y;\n};\n\nexport { placeArrowVertical };\n","import { placeArrowVertical } from './placeArrowVertical.js';\n\nconst placeLeftorRight = ({\n anchorRect,\n containerRect,\n menuRect,\n placeLeftorRightY,\n placeLeftX,\n placeRightX,\n getLeftOverflow,\n getRightOverflow,\n confineHorizontally,\n confineVertically,\n arrowRef,\n arrow,\n direction,\n position\n}) => {\n let computedDirection = direction;\n let y = placeLeftorRightY;\n if (position !== 'initial') {\n y = confineVertically(y);\n if (position === 'anchor') {\n y = Math.min(y, anchorRect.bottom - containerRect.top);\n y = Math.max(y, anchorRect.top - containerRect.top - menuRect.height);\n }\n }\n let x, leftOverflow, rightOverflow;\n if (computedDirection === 'left') {\n x = placeLeftX;\n if (position !== 'initial') {\n leftOverflow = getLeftOverflow(x);\n if (leftOverflow < 0) {\n rightOverflow = getRightOverflow(placeRightX);\n if (rightOverflow <= 0 || -leftOverflow > rightOverflow) {\n x = placeRightX;\n computedDirection = 'right';\n }\n }\n }\n } else {\n x = placeRightX;\n if (position !== 'initial') {\n rightOverflow = getRightOverflow(x);\n if (rightOverflow > 0) {\n leftOverflow = getLeftOverflow(placeLeftX);\n if (leftOverflow >= 0 || -leftOverflow < rightOverflow) {\n x = placeLeftX;\n computedDirection = 'left';\n }\n }\n }\n }\n if (position === 'auto') x = confineHorizontally(x);\n const arrowY = arrow ? placeArrowVertical({\n menuY: y,\n arrowRef,\n anchorRect,\n containerRect,\n menuRect\n }) : undefined;\n return {\n arrowY,\n x,\n y,\n computedDirection\n };\n};\n\nexport { placeLeftorRight };\n","const placeArrowHorizontal = ({\n arrowRef,\n menuX,\n anchorRect,\n containerRect,\n menuRect\n}) => {\n let x = anchorRect.left - containerRect.left - menuX + anchorRect.width / 2;\n const offset = arrowRef.current.offsetWidth * 1.25;\n x = Math.max(offset, x);\n x = Math.min(x, menuRect.width - offset);\n return x;\n};\n\nexport { placeArrowHorizontal };\n","import { placeArrowHorizontal } from './placeArrowHorizontal.js';\n\nconst placeToporBottom = ({\n anchorRect,\n containerRect,\n menuRect,\n placeToporBottomX,\n placeTopY,\n placeBottomY,\n getTopOverflow,\n getBottomOverflow,\n confineHorizontally,\n confineVertically,\n arrowRef,\n arrow,\n direction,\n position\n}) => {\n let computedDirection = direction === 'top' ? 'top' : 'bottom';\n let x = placeToporBottomX;\n if (position !== 'initial') {\n x = confineHorizontally(x);\n if (position === 'anchor') {\n x = Math.min(x, anchorRect.right - containerRect.left);\n x = Math.max(x, anchorRect.left - containerRect.left - menuRect.width);\n }\n }\n let y, topOverflow, bottomOverflow;\n if (computedDirection === 'top') {\n y = placeTopY;\n if (position !== 'initial') {\n topOverflow = getTopOverflow(y);\n if (topOverflow < 0) {\n bottomOverflow = getBottomOverflow(placeBottomY);\n if (bottomOverflow <= 0 || -topOverflow > bottomOverflow) {\n y = placeBottomY;\n computedDirection = 'bottom';\n }\n }\n }\n } else {\n y = placeBottomY;\n if (position !== 'initial') {\n bottomOverflow = getBottomOverflow(y);\n if (bottomOverflow > 0) {\n topOverflow = getTopOverflow(placeTopY);\n if (topOverflow >= 0 || -topOverflow < bottomOverflow) {\n y = placeTopY;\n computedDirection = 'top';\n }\n }\n }\n }\n if (position === 'auto') y = confineVertically(y);\n const arrowX = arrow ? placeArrowHorizontal({\n menuX: x,\n arrowRef,\n anchorRect,\n containerRect,\n menuRect\n }) : undefined;\n return {\n arrowX,\n x,\n y,\n computedDirection\n };\n};\n\nexport { placeToporBottom };\n","import { placeLeftorRight } from './placeLeftorRight.js';\nimport { placeToporBottom } from './placeToporBottom.js';\n\nconst positionMenu = ({\n arrow,\n align,\n direction,\n gap,\n shift,\n position,\n anchorRect,\n arrowRef,\n positionHelpers\n}) => {\n const {\n menuRect,\n containerRect\n } = positionHelpers;\n const isHorizontal = direction === 'left' || direction === 'right';\n let horizontalOffset = isHorizontal ? gap : shift;\n let verticalOffset = isHorizontal ? shift : gap;\n if (arrow) {\n const arrowElt = arrowRef.current;\n if (isHorizontal) {\n horizontalOffset += arrowElt.offsetWidth;\n } else {\n verticalOffset += arrowElt.offsetHeight;\n }\n }\n const placeLeftX = anchorRect.left - containerRect.left - menuRect.width - horizontalOffset;\n const placeRightX = anchorRect.right - containerRect.left + horizontalOffset;\n const placeTopY = anchorRect.top - containerRect.top - menuRect.height - verticalOffset;\n const placeBottomY = anchorRect.bottom - containerRect.top + verticalOffset;\n let placeToporBottomX, placeLeftorRightY;\n if (align === 'end') {\n placeToporBottomX = anchorRect.right - containerRect.left - menuRect.width;\n placeLeftorRightY = anchorRect.bottom - containerRect.top - menuRect.height;\n } else if (align === 'center') {\n placeToporBottomX = anchorRect.left - containerRect.left - (menuRect.width - anchorRect.width) / 2;\n placeLeftorRightY = anchorRect.top - containerRect.top - (menuRect.height - anchorRect.height) / 2;\n } else {\n placeToporBottomX = anchorRect.left - containerRect.left;\n placeLeftorRightY = anchorRect.top - containerRect.top;\n }\n placeToporBottomX += horizontalOffset;\n placeLeftorRightY += verticalOffset;\n const options = {\n ...positionHelpers,\n anchorRect,\n placeLeftX,\n placeRightX,\n placeLeftorRightY,\n placeTopY,\n placeBottomY,\n placeToporBottomX,\n arrowRef,\n arrow,\n direction,\n position\n };\n switch (direction) {\n case 'left':\n case 'right':\n return placeLeftorRight(options);\n case 'top':\n case 'bottom':\n default:\n return placeToporBottom(options);\n }\n};\n\nexport { positionMenu };\n","import { useLayoutEffect, useEffect } from 'react';\n\nconst useIsomorphicLayoutEffect = typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined' ? useLayoutEffect : useEffect;\n\nexport { useIsomorphicLayoutEffect as useLayoutEffect };\n","import { useMemo } from 'react';\n\nfunction setRef(ref, instance) {\n typeof ref === 'function' ? ref(instance) : ref.current = instance;\n}\nconst useCombinedRef = (refA, refB) => useMemo(() => {\n if (!refA) return refB;\n if (!refB) return refA;\n return instance => {\n setRef(refA, instance);\n setRef(refB, instance);\n };\n}, [refA, refB]);\n\nexport { useCombinedRef };\n","import { useState, useReducer, useContext, useRef, useCallback, useEffect, useMemo } from 'react';\nimport { flushSync } from 'react-dom';\nimport { MenuContainer } from './MenuContainer.js';\nimport { jsxs, jsx } from 'react/jsx-runtime';\nimport { createSubmenuCtx } from '../utils/submenuCtx.js';\nimport { SettingsContext, MenuListContext, HoverActionTypes, menuClass, menuArrowClass, positionAbsolute, roleNone, MenuListItemContext, HoverItemContext, Keys, CloseReason, FocusPositions } from '../utils/constants.js';\nimport { useItems } from '../hooks/useItems.js';\nimport { getScrollAncestor, commonProps, mergeProps, safeCall, isMenuOpen, getTransition, batchedUpdates } from '../utils/utils.js';\nimport { getPositionHelpers } from '../positionUtils/getPositionHelpers.js';\nimport { positionMenu } from '../positionUtils/positionMenu.js';\nimport { useLayoutEffect as useIsomorphicLayoutEffect } from '../hooks/useIsomorphicLayoutEffect.js';\nimport { useBEM } from '../hooks/useBEM.js';\nimport { useCombinedRef } from '../hooks/useCombinedRef.js';\n\nconst offScreen = -9999;\nconst MenuList = ({\n ariaLabel,\n menuClassName,\n menuStyle,\n arrow,\n arrowProps = {},\n anchorPoint,\n anchorRef,\n containerRef,\n containerProps,\n focusProps,\n externalRef,\n parentScrollingRef,\n align = 'start',\n direction = 'bottom',\n position = 'auto',\n overflow = 'visible',\n setDownOverflow,\n repositionFlag,\n captureFocus = true,\n state,\n endTransition,\n isDisabled,\n menuItemFocus,\n gap = 0,\n shift = 0,\n children,\n onClose,\n ...restProps\n}) => {\n const [menuPosition, setMenuPosition] = useState({\n x: offScreen,\n y: offScreen\n });\n const [arrowPosition, setArrowPosition] = useState({});\n const [overflowData, setOverflowData] = useState();\n const [expandedDirection, setExpandedDirection] = useState(direction);\n const [submenuCtx] = useState(createSubmenuCtx);\n const [reposSubmenu, forceReposSubmenu] = useReducer(c => c + 1, 1);\n const {\n transition,\n boundingBoxRef,\n boundingBoxPadding,\n rootMenuRef,\n rootAnchorRef,\n scrollNodesRef,\n reposition,\n viewScroll,\n submenuCloseDelay\n } = useContext(SettingsContext);\n const {\n submenuCtx: parentSubmenuCtx,\n reposSubmenu: reposFlag = repositionFlag\n } = useContext(MenuListContext);\n const menuRef = useRef(null);\n const focusRef = useRef();\n const arrowRef = useRef();\n const prevOpen = useRef(false);\n const {\n hoverItem,\n dispatch,\n updateItems\n } = useItems(menuRef, focusRef);\n const isOpen = isMenuOpen(state);\n const openTransition = getTransition(transition, 'open');\n const closeTransition = getTransition(transition, 'close');\n const scrollNodes = scrollNodesRef.current;\n const onKeyDown = e => {\n switch (e.key) {\n case Keys.HOME:\n dispatch(HoverActionTypes.FIRST);\n break;\n case Keys.END:\n dispatch(HoverActionTypes.LAST);\n break;\n case Keys.UP:\n dispatch(HoverActionTypes.DECREASE, hoverItem);\n break;\n case Keys.DOWN:\n dispatch(HoverActionTypes.INCREASE, hoverItem);\n break;\n case Keys.SPACE:\n if (e.target && e.target.className.indexOf(menuClass) !== -1) {\n e.preventDefault();\n }\n return;\n default:\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n };\n const onAnimationEnd = () => {\n if (state === 'closing') {\n setOverflowData();\n }\n safeCall(endTransition);\n };\n const onPointerMove = e => {\n e.stopPropagation();\n submenuCtx.on(submenuCloseDelay, () => {\n dispatch(HoverActionTypes.RESET);\n focusRef.current.focus();\n });\n };\n const onPointerLeave = e => {\n if (e.target === e.currentTarget) submenuCtx.off();\n };\n const handlePosition = useCallback(noOverflowCheck => {\n var _anchorRef$current;\n const anchorRect = anchorRef ? (_anchorRef$current = anchorRef.current) == null ? void 0 : _anchorRef$current.getBoundingClientRect() : anchorPoint ? {\n left: anchorPoint.x,\n right: anchorPoint.x,\n top: anchorPoint.y,\n bottom: anchorPoint.y,\n width: 0,\n height: 0\n } : null;\n if (!anchorRect) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('[React-Menu] Menu might not be positioned properly as one of the anchorRef or anchorPoint prop should be provided. If `anchorRef` is provided, the anchor must be mounted before menu is open.');\n }\n return;\n }\n if (!scrollNodes.menu) {\n scrollNodes.menu = (boundingBoxRef ? boundingBoxRef.current : getScrollAncestor(rootMenuRef.current)) || window;\n }\n const positionHelpers = getPositionHelpers(containerRef, menuRef, scrollNodes.menu, boundingBoxPadding);\n let {\n arrowX,\n arrowY,\n x,\n y,\n computedDirection\n } = positionMenu({\n arrow,\n align,\n direction,\n gap,\n shift,\n position,\n anchorRect,\n arrowRef,\n positionHelpers\n });\n const {\n menuRect\n } = positionHelpers;\n const menuHeight = menuRect.height;\n if (!noOverflowCheck && overflow !== 'visible') {\n const {\n getTopOverflow,\n getBottomOverflow\n } = positionHelpers;\n let height, overflowAmt;\n const bottomOverflow = getBottomOverflow(y);\n if (bottomOverflow > 0) {\n height = menuHeight - bottomOverflow;\n overflowAmt = bottomOverflow;\n } else {\n const topOverflow = getTopOverflow(y);\n if (topOverflow < 0) {\n height = menuHeight + topOverflow;\n overflowAmt = 0 - topOverflow;\n if (height >= 0) y -= topOverflow;\n }\n }\n if (height >= 0) {\n setOverflowData({\n height,\n overflowAmt\n });\n }\n }\n if (arrow) setArrowPosition({\n x: arrowX,\n y: arrowY\n });\n setMenuPosition({\n x,\n y\n });\n setExpandedDirection(computedDirection);\n }, [arrow, align, boundingBoxPadding, direction, gap, shift, position, overflow, anchorPoint, anchorRef, containerRef, boundingBoxRef, rootMenuRef, scrollNodes]);\n useIsomorphicLayoutEffect(() => {\n if (isOpen) {\n handlePosition();\n if (prevOpen.current) forceReposSubmenu();\n }\n prevOpen.current = isOpen;\n }, [isOpen, handlePosition, reposFlag]);\n useIsomorphicLayoutEffect(() => {\n if (overflowData && !setDownOverflow) menuRef.current.scrollTop = 0;\n }, [overflowData, setDownOverflow]);\n useIsomorphicLayoutEffect(() => updateItems, [updateItems]);\n useEffect(() => {\n let {\n menu: menuScroll\n } = scrollNodes;\n if (!isOpen || !menuScroll) return;\n menuScroll = menuScroll.addEventListener ? menuScroll : window;\n if (!scrollNodes.anchors) {\n scrollNodes.anchors = [];\n let anchorScroll = getScrollAncestor(rootAnchorRef && rootAnchorRef.current);\n while (anchorScroll && anchorScroll !== menuScroll) {\n scrollNodes.anchors.push(anchorScroll);\n anchorScroll = getScrollAncestor(anchorScroll);\n }\n }\n let scroll = viewScroll;\n if (scrollNodes.anchors.length && scroll === 'initial') scroll = 'auto';\n if (scroll === 'initial') return;\n const handleScroll = () => {\n if (scroll === 'auto') {\n batchedUpdates(() => handlePosition(true));\n } else {\n safeCall(onClose, {\n reason: CloseReason.SCROLL\n });\n }\n };\n const scrollObservers = scrollNodes.anchors.concat(viewScroll !== 'initial' ? menuScroll : []);\n scrollObservers.forEach(o => o.addEventListener('scroll', handleScroll));\n return () => scrollObservers.forEach(o => o.removeEventListener('scroll', handleScroll));\n }, [rootAnchorRef, scrollNodes, isOpen, onClose, viewScroll, handlePosition]);\n const hasOverflow = !!overflowData && overflowData.overflowAmt > 0;\n useEffect(() => {\n if (hasOverflow || !isOpen || !parentScrollingRef) return;\n const handleScroll = () => batchedUpdates(handlePosition);\n const parentScroll = parentScrollingRef.current;\n parentScroll.addEventListener('scroll', handleScroll);\n return () => parentScroll.removeEventListener('scroll', handleScroll);\n }, [isOpen, hasOverflow, parentScrollingRef, handlePosition]);\n useEffect(() => {\n if (!isOpen || typeof ResizeObserver !== 'function' || reposition === 'initial') return;\n const targetList = [];\n const resizeObserver = new ResizeObserver(entries => entries.forEach(({\n target\n }) => {\n if (targetList.indexOf(target) < 0) {\n targetList.push(target);\n } else {\n flushSync(() => {\n handlePosition();\n forceReposSubmenu();\n });\n }\n }));\n const resizeObserverOptions = {\n box: 'border-box'\n };\n resizeObserver.observe(menuRef.current, resizeObserverOptions);\n const anchor = anchorRef == null ? void 0 : anchorRef.current;\n anchor && resizeObserver.observe(anchor, resizeObserverOptions);\n return () => resizeObserver.disconnect();\n }, [isOpen, reposition, anchorRef, handlePosition]);\n useEffect(() => {\n if (!isOpen) {\n dispatch(HoverActionTypes.RESET);\n if (!closeTransition) setOverflowData();\n return;\n }\n const {\n position,\n alwaysUpdate\n } = menuItemFocus || {};\n const setItemFocus = () => {\n if (position === FocusPositions.FIRST) {\n dispatch(HoverActionTypes.FIRST);\n } else if (position === FocusPositions.LAST) {\n dispatch(HoverActionTypes.LAST);\n } else if (position >= -1) {\n dispatch(HoverActionTypes.SET_INDEX, undefined, position);\n }\n };\n if (alwaysUpdate) {\n setItemFocus();\n } else if (captureFocus) {\n const id = setTimeout(() => {\n const menuElt = menuRef.current;\n if (menuElt && !menuElt.contains(document.activeElement)) {\n focusRef.current.focus();\n setItemFocus();\n }\n }, openTransition ? 170 : 100);\n return () => clearTimeout(id);\n }\n }, [isOpen, openTransition, closeTransition, captureFocus, menuItemFocus, dispatch]);\n const itemContext = useMemo(() => ({\n isParentOpen: isOpen,\n submenuCtx,\n dispatch,\n updateItems\n }), [isOpen, submenuCtx, dispatch, updateItems]);\n let maxHeight, overflowAmt;\n if (overflowData) {\n setDownOverflow ? overflowAmt = overflowData.overflowAmt : maxHeight = overflowData.height;\n }\n const listContext = useMemo(() => ({\n reposSubmenu,\n submenuCtx,\n overflow,\n overflowAmt,\n parentMenuRef: menuRef,\n parentDir: expandedDirection\n }), [reposSubmenu, submenuCtx, overflow, overflowAmt, expandedDirection]);\n const overflowStyle = maxHeight >= 0 ? {\n maxHeight,\n overflow\n } : undefined;\n const modifiers = useMemo(() => ({\n state,\n align,\n dir: expandedDirection\n }), [state, align, expandedDirection]);\n const arrowModifiers = useMemo(() => ({\n dir: expandedDirection\n }), [expandedDirection]);\n const _arrowClassName = useBEM({\n block: menuClass,\n element: menuArrowClass,\n modifiers: arrowModifiers,\n className: arrowProps.className\n });\n const menu = /*#__PURE__*/jsxs(\"ul\", {\n role: \"menu\",\n \"aria-label\": ariaLabel,\n ...commonProps(isDisabled),\n ...mergeProps({\n onPointerEnter: parentSubmenuCtx == null ? void 0 : parentSubmenuCtx.off,\n onPointerMove,\n onPointerLeave,\n onKeyDown,\n onAnimationEnd\n }, restProps),\n ref: useCombinedRef(externalRef, menuRef),\n className: useBEM({\n block: menuClass,\n modifiers,\n className: menuClassName\n }),\n style: {\n ...menuStyle,\n ...overflowStyle,\n margin: 0,\n display: state === 'closed' ? 'none' : undefined,\n position: positionAbsolute,\n left: menuPosition.x,\n top: menuPosition.y\n },\n children: [/*#__PURE__*/jsx(\"li\", {\n tabIndex: -1,\n role: roleNone,\n style: {\n position: positionAbsolute,\n left: 0,\n top: 0,\n display: 'block',\n outline: 'none'\n },\n ref: focusRef,\n ...focusProps\n }), arrow && /*#__PURE__*/jsx(\"li\", {\n role: roleNone,\n ...arrowProps,\n className: _arrowClassName,\n style: {\n display: 'block',\n position: positionAbsolute,\n left: arrowPosition.x,\n top: arrowPosition.y,\n ...arrowProps.style\n },\n ref: arrowRef\n }), /*#__PURE__*/jsx(MenuListContext.Provider, {\n value: listContext,\n children: /*#__PURE__*/jsx(MenuListItemContext.Provider, {\n value: itemContext,\n children: /*#__PURE__*/jsx(HoverItemContext.Provider, {\n value: hoverItem,\n children: safeCall(children, modifiers)\n })\n })\n })]\n });\n return containerProps ? /*#__PURE__*/jsx(MenuContainer, {\n ...containerProps,\n isOpen: isOpen,\n children: menu\n }) : menu;\n};\n\nexport { MenuList };\n","import { forwardRef, useRef, useMemo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { oneOf, exact, number, object, bool, oneOfType, string, func } from 'prop-types';\nimport { MenuList } from './MenuList.js';\nimport { jsx } from 'react/jsx-runtime';\nimport { rootMenuPropTypes } from '../utils/propTypes.js';\nimport { safeCall, values } from '../utils/utils.js';\nimport { MenuStateMap, Keys, CloseReason, SettingsContext, EventHandlersContext } from '../utils/constants.js';\n\nconst ControlledMenu = /*#__PURE__*/forwardRef(function ControlledMenu({\n 'aria-label': ariaLabel,\n className,\n containerProps,\n initialMounted,\n unmountOnClose,\n transition,\n transitionTimeout,\n boundingBoxRef,\n boundingBoxPadding,\n reposition = 'auto',\n submenuOpenDelay = 300,\n submenuCloseDelay = 150,\n viewScroll = 'initial',\n portal,\n theming,\n onItemClick,\n ...restProps\n}, externalRef) {\n const containerRef = useRef(null);\n const scrollNodesRef = useRef({});\n const {\n anchorRef,\n state,\n onClose\n } = restProps;\n const settings = useMemo(() => ({\n initialMounted,\n unmountOnClose,\n transition,\n transitionTimeout,\n boundingBoxRef,\n boundingBoxPadding,\n rootMenuRef: containerRef,\n rootAnchorRef: anchorRef,\n scrollNodesRef,\n reposition,\n viewScroll,\n submenuOpenDelay,\n submenuCloseDelay\n }), [initialMounted, unmountOnClose, transition, transitionTimeout, anchorRef, boundingBoxRef, boundingBoxPadding, reposition, viewScroll, submenuOpenDelay, submenuCloseDelay]);\n const eventHandlers = useMemo(() => ({\n handleClick(event, isCheckorRadio) {\n if (!event.stopPropagation) safeCall(onItemClick, event);\n let keepOpen = event.keepOpen;\n if (keepOpen === undefined) {\n keepOpen = isCheckorRadio && event.key === Keys.SPACE;\n }\n if (!keepOpen) {\n safeCall(onClose, {\n value: event.value,\n key: event.key,\n reason: CloseReason.CLICK\n });\n }\n },\n handleClose(key) {\n safeCall(onClose, {\n key,\n reason: CloseReason.CLICK\n });\n }\n }), [onItemClick, onClose]);\n if (!state) return null;\n const menuList = /*#__PURE__*/jsx(SettingsContext.Provider, {\n value: settings,\n children: /*#__PURE__*/jsx(EventHandlersContext.Provider, {\n value: eventHandlers,\n children: /*#__PURE__*/jsx(MenuList, {\n ...restProps,\n ariaLabel: ariaLabel || 'Menu',\n externalRef: externalRef,\n containerRef: containerRef,\n containerProps: {\n className,\n containerRef,\n containerProps,\n theming,\n transition,\n onClose\n }\n })\n })\n });\n if (portal === true && typeof document !== 'undefined') {\n return /*#__PURE__*/createPortal(menuList, document.body);\n } else if (portal) {\n return portal.target ? /*#__PURE__*/createPortal(menuList, portal.target) : portal.stablePosition ? null : menuList;\n }\n return menuList;\n});\nprocess.env.NODE_ENV !== \"production\" ? ControlledMenu.propTypes = {\n ...rootMenuPropTypes,\n state: /*#__PURE__*/oneOf( /*#__PURE__*/values(MenuStateMap)),\n anchorPoint: /*#__PURE__*/exact({\n x: number,\n y: number\n }),\n anchorRef: object,\n captureFocus: bool,\n menuItemFocus: /*#__PURE__*/exact({\n position: /*#__PURE__*/oneOfType([string, number]),\n alwaysUpdate: bool\n }),\n onClose: func\n} : void 0;\n\nexport { ControlledMenu };\n","const PRE_ENTER = 0;\nconst ENTERING = 1;\nconst ENTERED = 2;\nconst PRE_EXIT = 3;\nconst EXITING = 4;\nconst EXITED = 5;\nconst UNMOUNTED = 6;\nconst STATUS = ['preEnter', 'entering', 'entered', 'preExit', 'exiting', 'exited', 'unmounted'];\nconst getState = status => ({\n _s: status,\n status: STATUS[status],\n isEnter: status < PRE_EXIT,\n isMounted: status !== UNMOUNTED,\n isResolved: status === ENTERED || status > EXITING\n});\nconst startOrEnd = unmounted => unmounted ? UNMOUNTED : EXITED;\nconst getEndStatus = (status, unmountOnExit) => {\n switch (status) {\n case ENTERING:\n case PRE_ENTER:\n return ENTERED;\n case EXITING:\n case PRE_EXIT:\n return startOrEnd(unmountOnExit);\n }\n};\nconst getTimeout = timeout => typeof timeout === 'object' ? [timeout.enter, timeout.exit] : [timeout, timeout];\n\nexport { ENTERED, ENTERING, EXITED, EXITING, PRE_ENTER, PRE_EXIT, STATUS, UNMOUNTED, getEndStatus, getState, getTimeout, startOrEnd };\n","import { useState, useRef, useCallback, useEffect } from 'react';\nimport { getState, ENTERED, startOrEnd, getTimeout, getEndStatus, PRE_ENTER, ENTERING, PRE_EXIT, EXITING } from './utils.js';\n\nconst updateState = (status, setState, latestState, timeoutId, onChange) => {\n clearTimeout(timeoutId.current);\n const state = getState(status);\n setState(state);\n latestState.current = state;\n onChange && onChange({\n current: state\n });\n};\nconst useTransition = ({\n enter = true,\n exit = true,\n preEnter,\n preExit,\n timeout,\n initialEntered,\n mountOnEnter,\n unmountOnExit,\n onStateChange: onChange\n} = {}) => {\n const [state, setState] = useState(() => getState(initialEntered ? ENTERED : startOrEnd(mountOnEnter)));\n const latestState = useRef(state);\n const timeoutId = useRef();\n const [enterTimeout, exitTimeout] = getTimeout(timeout);\n const endTransition = useCallback(() => {\n const status = getEndStatus(latestState.current._s, unmountOnExit);\n status && updateState(status, setState, latestState, timeoutId, onChange);\n }, [onChange, unmountOnExit]);\n const toggle = useCallback(toEnter => {\n const transitState = status => {\n updateState(status, setState, latestState, timeoutId, onChange);\n switch (status) {\n case ENTERING:\n if (enterTimeout >= 0) timeoutId.current = setTimeout(endTransition, enterTimeout);\n break;\n case EXITING:\n if (exitTimeout >= 0) timeoutId.current = setTimeout(endTransition, exitTimeout);\n break;\n case PRE_ENTER:\n case PRE_EXIT:\n timeoutId.current = setTimeout(() => transitState(status + 1), 0);\n break;\n }\n };\n const enterStage = latestState.current.isEnter;\n if (typeof toEnter !== 'boolean') toEnter = !enterStage;\n if (toEnter) {\n !enterStage && transitState(enter ? preEnter ? PRE_ENTER : ENTERING : ENTERED);\n } else {\n enterStage && transitState(exit ? preExit ? PRE_EXIT : EXITING : startOrEnd(unmountOnExit));\n }\n }, [endTransition, onChange, enter, exit, preEnter, preExit, enterTimeout, exitTimeout, unmountOnExit]);\n useEffect(() => () => clearTimeout(timeoutId.current), []);\n return [state, toggle, endTransition];\n};\n\nexport { useTransition };\n","import { useTransition } from 'react-transition-state';\nimport { getTransition } from '../utils/utils.js';\nimport { MenuStateMap } from '../utils/constants.js';\n\nconst useMenuState = ({\n initialOpen,\n initialMounted,\n unmountOnClose,\n transition,\n transitionTimeout = 500\n} = {}) => {\n const [{\n status\n }, toggleMenu, endTransition] = useTransition({\n initialEntered: initialOpen,\n mountOnEnter: !initialMounted,\n unmountOnExit: unmountOnClose,\n timeout: transitionTimeout,\n enter: getTransition(transition, 'open'),\n exit: getTransition(transition, 'close')\n });\n return [{\n state: MenuStateMap[status],\n endTransition\n }, toggleMenu];\n};\n\nexport { useMenuState };\n","import { useState } from 'react';\nimport { useMenuState } from './useMenuState.js';\n\nconst useMenuStateAndFocus = options => {\n const [menuProps, toggleMenu] = useMenuState(options);\n const [menuItemFocus, setMenuItemFocus] = useState();\n const openMenu = (position, alwaysUpdate) => {\n setMenuItemFocus({\n position,\n alwaysUpdate\n });\n toggleMenu(true);\n };\n return [{\n menuItemFocus,\n ...menuProps\n }, toggleMenu, openMenu];\n};\n\nexport { useMenuStateAndFocus };\n","import { useState } from 'react';\n\nconst useClick = (state, onToggle) => {\n if (process.env.NODE_ENV !== 'production' && typeof onToggle !== 'function') {\n throw new Error('[React-Menu] useClick/useHover requires a function in the second parameter.');\n }\n const [skipOpen] = useState({});\n return {\n onMouseDown: () => {\n skipOpen.v = state && state !== 'closed';\n },\n onClick: e => skipOpen.v ? skipOpen.v = false : onToggle(true, e)\n };\n};\n\nexport { useClick };\n","import { useRef, useEffect } from 'react';\nimport { safeCall } from '../utils/utils.js';\n\nconst useMenuChange = (onMenuChange, isOpen) => {\n const prevOpen = useRef(isOpen);\n useEffect(() => {\n if (prevOpen.current !== isOpen) safeCall(onMenuChange, {\n open: isOpen\n });\n prevOpen.current = isOpen;\n }, [onMenuChange, isOpen]);\n};\n\nexport { useMenuChange };\n","import { forwardRef, useRef, useCallback, useImperativeHandle, Fragment, cloneElement } from 'react';\nimport { oneOfType, element, func } from 'prop-types';\nimport { ControlledMenu } from './ControlledMenu.js';\nimport { jsxs, jsx } from 'react/jsx-runtime';\nimport { useMenuStateAndFocus } from '../hooks/useMenuStateAndFocus.js';\nimport { useClick } from '../hooks/useClick.js';\nimport { useCombinedRef } from '../hooks/useCombinedRef.js';\nimport { safeCall, mergeProps, getName, isMenuOpen } from '../utils/utils.js';\nimport { useMenuChange } from '../hooks/useMenuChange.js';\nimport { rootMenuPropTypes, uncontrolledMenuPropTypes } from '../utils/propTypes.js';\nimport { FocusPositions, Keys } from '../utils/constants.js';\n\nconst Menu = /*#__PURE__*/forwardRef(function Menu({\n 'aria-label': ariaLabel,\n captureFocus: _,\n initialOpen: _1,\n menuButton,\n instanceRef,\n onMenuChange,\n ...restProps\n}, externalRef) {\n const [stateProps, toggleMenu, openMenu] = useMenuStateAndFocus(restProps);\n const {\n state\n } = stateProps;\n const isOpen = isMenuOpen(state);\n const buttonRef = useRef(null);\n const anchorProps = useClick(state, (_, e) => openMenu(!e.detail ? FocusPositions.FIRST : undefined));\n const handleClose = useCallback(e => {\n toggleMenu(false);\n if (e.key) buttonRef.current.focus();\n }, [toggleMenu]);\n const onKeyDown = e => {\n switch (e.key) {\n case Keys.UP:\n openMenu(FocusPositions.LAST);\n break;\n case Keys.DOWN:\n openMenu(FocusPositions.FIRST);\n break;\n default:\n return;\n }\n e.preventDefault();\n };\n const button = safeCall(menuButton, {\n open: isOpen\n });\n if (!button || !button.type) throw new Error('Menu requires a menuButton prop.');\n const buttonProps = {\n ref: useCombinedRef(button.ref, buttonRef),\n ...mergeProps({\n onKeyDown,\n ...anchorProps\n }, button.props)\n };\n if (getName(button.type) === 'MenuButton') {\n buttonProps.isOpen = isOpen;\n }\n const renderButton = /*#__PURE__*/cloneElement(button, buttonProps);\n useMenuChange(onMenuChange, isOpen);\n useImperativeHandle(instanceRef, () => ({\n openMenu,\n closeMenu: () => toggleMenu(false)\n }));\n return /*#__PURE__*/jsxs(Fragment, {\n children: [renderButton, /*#__PURE__*/jsx(ControlledMenu, {\n ...restProps,\n ...stateProps,\n \"aria-label\": ariaLabel || (typeof button.props.children === 'string' ? button.props.children : 'Menu'),\n anchorRef: buttonRef,\n ref: externalRef,\n onClose: handleClose\n })]\n });\n});\nprocess.env.NODE_ENV !== \"production\" ? Menu.propTypes = {\n ...rootMenuPropTypes,\n ...uncontrolledMenuPropTypes,\n menuButton: oneOfType([element, func]).isRequired\n} : void 0;\n\nexport { Menu };\n","import { forwardRef, useRef, useContext, memo } from 'react';\nimport { HoverItemContext } from './constants.js';\nimport { jsx } from 'react/jsx-runtime';\n\nconst withHovering = (name, WrappedComponent) => {\n const Component = /*#__PURE__*/memo(WrappedComponent);\n const WithHovering = /*#__PURE__*/forwardRef((props, ref) => {\n const itemRef = useRef(null);\n return /*#__PURE__*/jsx(Component, {\n ...props,\n itemRef: itemRef,\n externalRef: ref,\n isHovering: useContext(HoverItemContext) === itemRef.current\n });\n });\n WithHovering.displayName = `WithHovering(${name})`;\n return WithHovering;\n};\n\nexport { withHovering };\n","import { useLayoutEffect as useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect.js';\n\nconst useItemEffect = (isDisabled, itemRef, updateItems) => {\n useIsomorphicLayoutEffect(() => {\n if (process.env.NODE_ENV !== 'production' && !updateItems) {\n throw new Error(`[React-Menu] This menu item or submenu should be rendered under a menu: ${itemRef.current.outerHTML}`);\n }\n if (isDisabled) return;\n const item = itemRef.current;\n updateItems(item, true);\n return () => {\n updateItems(item);\n };\n }, [isDisabled, itemRef, updateItems]);\n};\n\nexport { useItemEffect };\n","import { useContext, useRef, useState, useEffect, useImperativeHandle, useMemo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { bool, oneOf, oneOfType, node, func, shape } from 'prop-types';\nimport { MenuList } from './MenuList.js';\nimport { jsxs, jsx } from 'react/jsx-runtime';\nimport { withHovering } from '../utils/withHovering.js';\nimport { menuPropTypes, uncontrolledMenuPropTypes, stylePropTypes } from '../utils/propTypes.js';\nimport { useMenuStateAndFocus } from '../hooks/useMenuStateAndFocus.js';\nimport { useItemEffect } from '../hooks/useItemEffect.js';\nimport { useMenuChange } from '../hooks/useMenuChange.js';\nimport { useBEM } from '../hooks/useBEM.js';\nimport { SettingsContext, MenuListContext, MenuListItemContext, menuClass, subMenuClass, roleNone, roleMenuitem, menuItemClass, HoverActionTypes, Keys, FocusPositions } from '../utils/constants.js';\nimport { useCombinedRef } from '../hooks/useCombinedRef.js';\nimport { mergeProps, commonProps, safeCall, isMenuOpen, batchedUpdates } from '../utils/utils.js';\n\nconst SubMenu = /*#__PURE__*/withHovering('SubMenu', function SubMenu({\n 'aria-label': ariaLabel,\n className,\n disabled,\n direction,\n label,\n openTrigger,\n onMenuChange,\n isHovering,\n instanceRef,\n itemRef,\n captureFocus: _1,\n repositionFlag: _2,\n itemProps = {},\n ...restProps\n}) {\n const settings = useContext(SettingsContext);\n const {\n rootMenuRef,\n submenuOpenDelay,\n submenuCloseDelay\n } = settings;\n const {\n parentMenuRef,\n parentDir,\n overflow: parentOverflow\n } = useContext(MenuListContext);\n const {\n isParentOpen,\n submenuCtx,\n dispatch,\n updateItems\n } = useContext(MenuListItemContext);\n const isPortal = parentOverflow !== 'visible';\n const [stateProps, toggleMenu, _openMenu] = useMenuStateAndFocus(settings);\n const {\n state\n } = stateProps;\n const isDisabled = !!disabled;\n const isOpen = isMenuOpen(state);\n const containerRef = useRef(null);\n const [timerId] = useState({\n v: 0\n });\n const stopTimer = () => {\n submenuCtx.off();\n if (timerId.v) {\n clearTimeout(timerId.v);\n timerId.v = 0;\n }\n };\n const openMenu = (...args) => {\n stopTimer();\n setHover();\n !isDisabled && _openMenu(...args);\n };\n const setHover = () => !isHovering && !isDisabled && dispatch(HoverActionTypes.SET, itemRef.current);\n const delayOpen = delay => {\n setHover();\n if (!openTrigger) timerId.v = setTimeout(() => batchedUpdates(openMenu), Math.max(delay, 0));\n };\n const onPointerMove = e => {\n if (isDisabled) return;\n e.stopPropagation();\n if (timerId.v || isOpen) return;\n submenuCtx.on(submenuCloseDelay, () => delayOpen(submenuOpenDelay - submenuCloseDelay), () => delayOpen(submenuOpenDelay));\n };\n const onPointerLeave = () => {\n stopTimer();\n if (!isOpen) dispatch(HoverActionTypes.UNSET, itemRef.current);\n };\n const onKeyDown = e => {\n if (!isHovering) return;\n switch (e.key) {\n case Keys.ENTER:\n e.preventDefault();\n case Keys.SPACE:\n case Keys.RIGHT:\n openTrigger !== 'none' && openMenu(FocusPositions.FIRST);\n }\n };\n const onKeyDownOfRoot = e => {\n let handled = false;\n switch (e.key) {\n case Keys.LEFT:\n if (isOpen) {\n itemRef.current.focus();\n toggleMenu(false);\n handled = true;\n }\n break;\n case Keys.RIGHT:\n if (!isOpen) handled = true;\n break;\n }\n if (handled) {\n e.preventDefault();\n e.stopPropagation();\n }\n };\n useItemEffect(isDisabled, itemRef, updateItems);\n useMenuChange(onMenuChange, isOpen);\n useEffect(() => submenuCtx.toggle(isOpen), [submenuCtx, isOpen]);\n useEffect(() => () => clearTimeout(timerId.v), [timerId]);\n useEffect(() => {\n if (isHovering && isParentOpen) {\n itemRef.current.focus();\n } else {\n toggleMenu(false);\n }\n }, [isHovering, isParentOpen, toggleMenu, itemRef]);\n useImperativeHandle(instanceRef, () => ({\n openMenu: (...args) => {\n isParentOpen && openMenu(...args);\n },\n closeMenu: () => {\n if (isOpen) {\n itemRef.current.focus();\n toggleMenu(false);\n }\n }\n }));\n const modifiers = useMemo(() => ({\n open: isOpen,\n hover: isHovering,\n disabled: isDisabled,\n submenu: true\n }), [isOpen, isHovering, isDisabled]);\n const {\n ref: externalItemRef,\n className: itemClassName,\n ...restItemProps\n } = itemProps;\n const mergedItemProps = mergeProps({\n onPointerEnter: submenuCtx.off,\n onPointerMove,\n onPointerLeave,\n onKeyDown,\n onClick: () => openTrigger !== 'none' && openMenu()\n }, restItemProps);\n const getMenuList = () => {\n const menuList = /*#__PURE__*/jsx(MenuList, {\n ...restProps,\n ...stateProps,\n ariaLabel: ariaLabel || (typeof label === 'string' ? label : 'Submenu'),\n anchorRef: itemRef,\n containerRef: isPortal ? rootMenuRef : containerRef,\n direction: direction || (parentDir === 'right' || parentDir === 'left' ? parentDir : 'right'),\n parentScrollingRef: isPortal && parentMenuRef,\n isDisabled: isDisabled\n });\n const container = rootMenuRef.current;\n return isPortal && container ? /*#__PURE__*/createPortal(menuList, container) : menuList;\n };\n return /*#__PURE__*/jsxs(\"li\", {\n className: useBEM({\n block: menuClass,\n element: subMenuClass,\n className\n }),\n style: {\n position: 'relative'\n },\n role: roleNone,\n ref: containerRef,\n onKeyDown: onKeyDownOfRoot,\n children: [/*#__PURE__*/jsx(\"div\", {\n role: roleMenuitem,\n \"aria-haspopup\": true,\n \"aria-expanded\": isOpen,\n ...commonProps(isDisabled, isHovering),\n ...mergedItemProps,\n ref: useCombinedRef(externalItemRef, itemRef),\n className: useBEM({\n block: menuClass,\n element: menuItemClass,\n modifiers,\n className: itemClassName\n }),\n children: useMemo(() => safeCall(label, modifiers), [label, modifiers])\n }), state && getMenuList()]\n });\n});\nprocess.env.NODE_ENV !== \"production\" ? SubMenu.propTypes = {\n ...menuPropTypes,\n ...uncontrolledMenuPropTypes,\n disabled: bool,\n openTrigger: /*#__PURE__*/oneOf(['none', 'clickOnly']),\n label: /*#__PURE__*/oneOfType([node, func]),\n itemProps: /*#__PURE__*/shape({\n ...stylePropTypes()\n })\n} : void 0;\n\nexport { SubMenu };\n","import { useContext, useEffect } from 'react';\nimport { useItemEffect } from './useItemEffect.js';\nimport { SettingsContext, MenuListItemContext, HoverActionTypes } from '../utils/constants.js';\n\nconst useItemState = (itemRef, focusRef, isHovering, isDisabled) => {\n const {\n submenuCloseDelay\n } = useContext(SettingsContext);\n const {\n isParentOpen,\n submenuCtx,\n dispatch,\n updateItems\n } = useContext(MenuListItemContext);\n const setHover = () => {\n !isHovering && !isDisabled && dispatch(HoverActionTypes.SET, itemRef.current);\n };\n const unsetHover = () => {\n !isDisabled && dispatch(HoverActionTypes.UNSET, itemRef.current);\n };\n const onBlur = e => {\n if (isHovering && !e.currentTarget.contains(e.relatedTarget)) unsetHover();\n };\n const onPointerMove = e => {\n if (!isDisabled) {\n e.stopPropagation();\n submenuCtx.on(submenuCloseDelay, setHover, setHover);\n }\n };\n const onPointerLeave = (_, keepHover) => {\n submenuCtx.off();\n !keepHover && unsetHover();\n };\n useItemEffect(isDisabled, itemRef, updateItems);\n useEffect(() => {\n if (isHovering && isParentOpen) {\n focusRef.current && focusRef.current.focus();\n }\n }, [focusRef, isHovering, isParentOpen]);\n return {\n setHover,\n onBlur,\n onPointerMove,\n onPointerLeave\n };\n};\n\nexport { useItemState };\n","import { useContext, useMemo } from 'react';\nimport { any, string, oneOf, bool, oneOfType, node, func } from 'prop-types';\nimport { jsx } from 'react/jsx-runtime';\nimport { useItemState } from '../hooks/useItemState.js';\nimport { EventHandlersContext, RadioGroupContext, roleMenuitem, menuClass, menuItemClass, roleNone, Keys } from '../utils/constants.js';\nimport { useCombinedRef } from '../hooks/useCombinedRef.js';\nimport { useBEM } from '../hooks/useBEM.js';\nimport { withHovering } from '../utils/withHovering.js';\nimport { stylePropTypes } from '../utils/propTypes.js';\nimport { mergeProps, commonProps, safeCall } from '../utils/utils.js';\n\nconst MenuItem = /*#__PURE__*/withHovering('MenuItem', function MenuItem({\n className,\n value,\n href,\n type,\n checked,\n disabled,\n children,\n onClick,\n isHovering,\n itemRef,\n externalRef,\n ...restProps\n}) {\n const isDisabled = !!disabled;\n const {\n setHover,\n ...restStateProps\n } = useItemState(itemRef, itemRef, isHovering, isDisabled);\n const eventHandlers = useContext(EventHandlersContext);\n const radioGroup = useContext(RadioGroupContext);\n const isRadio = type === 'radio';\n const isCheckBox = type === 'checkbox';\n const isAnchor = !!href && !isDisabled && !isRadio && !isCheckBox;\n const isChecked = isRadio ? radioGroup.value === value : isCheckBox ? !!checked : false;\n const handleClick = e => {\n if (isDisabled) {\n e.stopPropagation();\n e.preventDefault();\n return;\n }\n const event = {\n value,\n syntheticEvent: e\n };\n if (e.key !== undefined) event.key = e.key;\n if (isCheckBox) event.checked = !isChecked;\n if (isRadio) event.name = radioGroup.name;\n safeCall(onClick, event);\n if (isRadio) safeCall(radioGroup.onRadioChange, event);\n eventHandlers.handleClick(event, isCheckBox || isRadio);\n };\n const handleKeyDown = e => {\n if (!isHovering) return;\n switch (e.key) {\n case Keys.ENTER:\n e.preventDefault();\n case Keys.SPACE:\n isAnchor ? itemRef.current.click() : handleClick(e);\n }\n };\n const modifiers = useMemo(() => ({\n type,\n disabled: isDisabled,\n hover: isHovering,\n checked: isChecked,\n anchor: isAnchor\n }), [type, isDisabled, isHovering, isChecked, isAnchor]);\n const mergedProps = mergeProps({\n ...restStateProps,\n onPointerDown: setHover,\n onKeyDown: handleKeyDown,\n onClick: handleClick\n }, restProps);\n const menuItemProps = {\n role: isRadio ? 'menuitemradio' : isCheckBox ? 'menuitemcheckbox' : roleMenuitem,\n 'aria-checked': isRadio || isCheckBox ? isChecked : undefined,\n ...commonProps(isDisabled, isHovering),\n ...mergedProps,\n ref: useCombinedRef(externalRef, itemRef),\n className: useBEM({\n block: menuClass,\n element: menuItemClass,\n modifiers,\n className\n }),\n children: useMemo(() => safeCall(children, modifiers), [children, modifiers])\n };\n return isAnchor ? /*#__PURE__*/jsx(\"li\", {\n role: roleNone,\n children: /*#__PURE__*/jsx(\"a\", {\n href: href,\n ...menuItemProps\n })\n }) : /*#__PURE__*/jsx(\"li\", {\n ...menuItemProps\n });\n});\nprocess.env.NODE_ENV !== \"production\" ? MenuItem.propTypes = {\n ...stylePropTypes(),\n value: any,\n href: string,\n type: /*#__PURE__*/oneOf(['checkbox', 'radio']),\n checked: bool,\n disabled: bool,\n children: /*#__PURE__*/oneOfType([node, func]),\n onClick: func\n} : void 0;\n\nexport { MenuItem };\n","import { useRef, useContext, useMemo } from 'react';\nimport { bool, func } from 'prop-types';\nimport { jsx } from 'react/jsx-runtime';\nimport { useItemState } from '../hooks/useItemState.js';\nimport { useCombinedRef } from '../hooks/useCombinedRef.js';\nimport { useBEM } from '../hooks/useBEM.js';\nimport { withHovering } from '../utils/withHovering.js';\nimport { stylePropTypes } from '../utils/propTypes.js';\nimport { EventHandlersContext, roleMenuitem, menuClass, menuItemClass } from '../utils/constants.js';\nimport { safeCall, mergeProps, commonProps } from '../utils/utils.js';\n\nconst FocusableItem = /*#__PURE__*/withHovering('FocusableItem', function FocusableItem({\n className,\n disabled,\n children,\n isHovering,\n itemRef,\n externalRef,\n ...restProps\n}) {\n const isDisabled = !!disabled;\n const ref = useRef(null);\n const {\n setHover,\n onPointerLeave,\n ...restStateProps\n } = useItemState(itemRef, ref, isHovering, isDisabled);\n const {\n handleClose\n } = useContext(EventHandlersContext);\n const modifiers = useMemo(() => ({\n disabled: isDisabled,\n hover: isHovering,\n focusable: true\n }), [isDisabled, isHovering]);\n const renderChildren = useMemo(() => safeCall(children, {\n ...modifiers,\n ref,\n closeMenu: handleClose\n }), [children, modifiers, handleClose]);\n const mergedProps = mergeProps({\n ...restStateProps,\n onPointerLeave: e => onPointerLeave(e, true),\n onFocus: setHover\n }, restProps);\n return /*#__PURE__*/jsx(\"li\", {\n role: roleMenuitem,\n ...commonProps(isDisabled),\n ...mergedProps,\n ref: useCombinedRef(externalRef, itemRef),\n className: useBEM({\n block: menuClass,\n element: menuItemClass,\n modifiers,\n className\n }),\n children: renderChildren\n });\n});\nprocess.env.NODE_ENV !== \"production\" ? FocusableItem.propTypes = {\n ...stylePropTypes(),\n disabled: bool,\n children: func\n} : void 0;\n\nexport { FocusableItem };\n","import { memo, forwardRef } from 'react';\nimport { jsx } from 'react/jsx-runtime';\nimport { useBEM } from '../hooks/useBEM.js';\nimport { menuClass, menuDividerClass } from '../utils/constants.js';\nimport { stylePropTypes } from '../utils/propTypes.js';\n\nconst MenuDivider = /*#__PURE__*/memo( /*#__PURE__*/forwardRef(function MenuDivider({\n className,\n ...restProps\n}, externalRef) {\n return /*#__PURE__*/jsx(\"li\", {\n role: \"separator\",\n ...restProps,\n ref: externalRef,\n className: useBEM({\n block: menuClass,\n element: menuDividerClass,\n className\n })\n });\n}));\nprocess.env.NODE_ENV !== \"production\" ? MenuDivider.propTypes = {\n ...stylePropTypes()\n} : void 0;\n\nexport { MenuDivider };\n","import { memo, forwardRef } from 'react';\nimport { jsx } from 'react/jsx-runtime';\nimport { useBEM } from '../hooks/useBEM.js';\nimport { roleNone, menuClass, menuHeaderClass } from '../utils/constants.js';\nimport { stylePropTypes } from '../utils/propTypes.js';\n\nconst MenuHeader = /*#__PURE__*/memo( /*#__PURE__*/forwardRef(function MenuHeader({\n className,\n ...restProps\n}, externalRef) {\n return /*#__PURE__*/jsx(\"li\", {\n role: roleNone,\n ...restProps,\n ref: externalRef,\n className: useBEM({\n block: menuClass,\n element: menuHeaderClass,\n className\n })\n });\n}));\nprocess.env.NODE_ENV !== \"production\" ? MenuHeader.propTypes = {\n ...stylePropTypes()\n} : void 0;\n\nexport { MenuHeader };\n","import { forwardRef, useRef, useState, useContext } from 'react';\nimport { bool } from 'prop-types';\nimport { jsx } from 'react/jsx-runtime';\nimport { useLayoutEffect as useIsomorphicLayoutEffect } from '../hooks/useIsomorphicLayoutEffect.js';\nimport { getNormalizedClientRect } from '../positionUtils/getNormalizedClientRect.js';\nimport { useCombinedRef } from '../hooks/useCombinedRef.js';\nimport { useBEM } from '../hooks/useBEM.js';\nimport { MenuListContext, menuClass, menuGroupClass } from '../utils/constants.js';\nimport { stylePropTypes } from '../utils/propTypes.js';\n\nconst MenuGroup = /*#__PURE__*/forwardRef(function MenuGroup({\n className,\n style,\n takeOverflow,\n ...restProps\n}, externalRef) {\n const ref = useRef(null);\n const [overflowStyle, setOverflowStyle] = useState();\n const {\n overflow,\n overflowAmt\n } = useContext(MenuListContext);\n useIsomorphicLayoutEffect(() => {\n let maxHeight;\n if (takeOverflow && overflowAmt >= 0) {\n maxHeight = getNormalizedClientRect(ref.current).height - overflowAmt;\n if (maxHeight < 0) maxHeight = 0;\n }\n setOverflowStyle(maxHeight >= 0 ? {\n maxHeight,\n overflow\n } : undefined);\n }, [takeOverflow, overflow, overflowAmt]);\n useIsomorphicLayoutEffect(() => {\n if (overflowStyle) ref.current.scrollTop = 0;\n }, [overflowStyle]);\n return /*#__PURE__*/jsx(\"div\", {\n ...restProps,\n ref: useCombinedRef(externalRef, ref),\n className: useBEM({\n block: menuClass,\n element: menuGroupClass,\n className\n }),\n style: {\n ...style,\n ...overflowStyle\n }\n });\n});\nprocess.env.NODE_ENV !== \"production\" ? MenuGroup.propTypes = {\n ...stylePropTypes(),\n takeOverflow: bool\n} : void 0;\n\nexport { MenuGroup };\n","import './avatar.css';\n\nimport { useRef } from 'preact/hooks';\n\nimport mem from '../utils/mem';\n\nconst SIZES = {\n s: 16,\n m: 20,\n l: 24,\n xl: 32,\n xxl: 50,\n xxxl: 64,\n};\n\nconst alphaCache = {};\n\nconst canvas = window.OffscreenCanvas\n ? new OffscreenCanvas(1, 1)\n : document.createElement('canvas');\nconst ctx = canvas.getContext('2d', {\n willReadFrequently: true,\n});\nctx.imageSmoothingEnabled = false;\n\nconst MISSING_IMAGE_PATH_REGEX = /missing\\.png$/;\n\nfunction Avatar({ url, size, alt = '', squircle, ...props }) {\n size = SIZES[size] || size || SIZES.m;\n const avatarRef = useRef();\n const isMissing = MISSING_IMAGE_PATH_REGEX.test(url);\n return (\n <span\n ref={avatarRef}\n class={`avatar ${squircle ? 'squircle' : ''} ${\n alphaCache[url] ? 'has-alpha' : ''\n }`}\n style={{\n width: size,\n height: size,\n }}\n title={alt}\n {...props}\n >\n {!!url && (\n <img\n src={url}\n width={size}\n height={size}\n alt={alt}\n loading=\"lazy\"\n decoding=\"async\"\n fetchPriority=\"low\"\n crossOrigin={\n alphaCache[url] === undefined && !isMissing\n ? 'anonymous'\n : undefined\n }\n onError={(e) => {\n if (e.target.crossOrigin) {\n e.target.crossOrigin = null;\n e.target.src = url;\n }\n }}\n onLoad={(e) => {\n if (avatarRef.current) avatarRef.current.dataset.loaded = true;\n if (alphaCache[url] !== undefined) return;\n if (isMissing) return;\n setTimeout(() => {\n try {\n // Check if image has alpha channel\n const { width, height } = e.target;\n if (canvas.width !== width) canvas.width = width;\n if (canvas.height !== height) canvas.height = height;\n ctx.drawImage(e.target, 0, 0);\n const allPixels = ctx.getImageData(0, 0, width, height);\n // At least 10% of pixels have alpha <= 128\n const hasAlpha =\n allPixels.data.filter(\n (pixel, i) => i % 4 === 3 && pixel <= 128,\n ).length /\n (allPixels.data.length / 4) >\n 0.1;\n if (hasAlpha) {\n // console.log('hasAlpha', hasAlpha, allPixels.data);\n avatarRef.current.classList.add('has-alpha');\n }\n alphaCache[url] = hasAlpha;\n ctx.clearRect(0, 0, width, height);\n } catch (e) {\n // Silent fail\n alphaCache[url] = false;\n }\n }, 1);\n }}\n />\n )}\n </span>\n );\n}\n\nexport default mem(Avatar);\n","import { forwardRef } from 'preact/compat';\nimport { useLocation } from 'react-router-dom';\n\nimport states from '../utils/states';\n\n/* NOTES\n =====\n Initially this uses <NavLink> from react-router-dom, but it doesn't work:\n 1. It interferes with nested <a> inside <a> and it's difficult to preventDefault/stopPropagation from the nested <a>\n 2. isActive doesn't work properly with the weird routes that's set up in this app, due to the faux \"location\" to make the modals work and prevent unmounting\n 3. Not using <Link state/> because it modifies history.state that *persists* across page reloads. I don't need that, so using valtio's states instead.\n*/\n\nconst Link = forwardRef((props, ref) => {\n let routerLocation;\n try {\n routerLocation = useLocation();\n } catch (e) {}\n let hash = (location.hash || '').replace(/^#/, '').trim();\n if (hash === '') hash = '/';\n const { to, ...restProps } = props;\n\n // Handle encodeURIComponent of searchParams values\n if (!!hash && hash !== '/' && hash.includes('?')) {\n const parsedHash = URL.parse(hash, location.origin); // Fake base URL\n if (parsedHash?.searchParams?.size) {\n const searchParamsStr = Array.from(parsedHash.searchParams.entries())\n .map(([key, value]) => `${key}=${encodeURIComponent(value)}`)\n .join('&');\n hash = parsedHash.pathname + '?' + searchParamsStr;\n }\n }\n\n const isActive = hash === to || decodeURIComponent(hash) === to;\n return (\n <a\n ref={ref}\n href={`#${to}`}\n {...restProps}\n class={`${props.class || ''} ${isActive ? 'is-active' : ''}`}\n onClick={(e) => {\n if (e.currentTarget?.parentNode?.closest('a')) {\n // If this <a> is nested inside another <a>\n e.stopPropagation();\n }\n if (routerLocation) states.prevLocation = routerLocation;\n props.onClick?.(e);\n }}\n />\n );\n});\n\nexport default Link;\n","let IS_RTL = false;\n\n// Use MutationObserver to detect RTL\nconst observer = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n if (mutation.type === 'attributes') {\n const { dir } = mutation.target;\n if (dir === 'rtl') {\n IS_RTL = true;\n } else {\n IS_RTL = false;\n }\n console.log({ IS_RTL });\n // Fire custom event 'dirchange' on document\n // document.dispatchEvent(new Event('dirchange'));\n }\n });\n});\nobserver.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['dir'],\n});\n\nexport default function isRTL() {\n return IS_RTL;\n // return document.documentElement.dir === 'rtl';\n}\n","const root = document.documentElement;\nconst style = getComputedStyle(root);\nconst defaultBoundingBoxPadding = 8;\n\nlet safeAreaInsets = [0, 0, 0, 0];\nfunction getSafeAreaInsets() {\n // Get safe area inset variables from root\n const safeAreaInsetTop = style.getPropertyValue('--sai-top');\n const safeAreaInsetRight = style.getPropertyValue('--sai-right');\n const safeAreaInsetBottom = style.getPropertyValue('--sai-bottom');\n const safeAreaInsetLeft = style.getPropertyValue('--sai-left');\n safeAreaInsets = [\n // top, right, bottom, left (clockwise)\n Math.max(0, parseInt(safeAreaInsetTop, 10)),\n Math.max(0, parseInt(safeAreaInsetRight, 10)),\n Math.max(0, parseInt(safeAreaInsetBottom, 10)),\n Math.max(0, parseInt(safeAreaInsetLeft, 10)),\n ];\n}\nrequestAnimationFrame(getSafeAreaInsets);\n\nfunction safeBoundingBoxPadding(paddings = []) {\n const str = safeAreaInsets\n .map((v, i) => (v || defaultBoundingBoxPadding) + (paddings[i] || 0))\n .join(' ');\n // console.log(str);\n return str;\n}\n\n// Update safe area insets when orientation or resize\nif (CSS.supports('top: env(safe-area-inset-top)')) {\n window.addEventListener('resize', getSafeAreaInsets, { passive: true });\n}\n\nexport default safeBoundingBoxPadding;\n","import { useLayoutEffect, useState } from 'preact/hooks';\n\nexport default function useWindowSize() {\n const [size, setSize] = useState({\n width: null,\n height: null,\n });\n\n useLayoutEffect(() => {\n const handleResize = () => {\n setSize({\n width: window.innerWidth,\n height: window.innerHeight,\n });\n };\n\n handleResize();\n window.addEventListener('resize', handleResize, {\n passive: true,\n });\n\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n }, []);\n\n return size;\n}\n","import { Menu } from '@szhsin/react-menu';\nimport { useRef } from 'preact/hooks';\n\nimport isRTL from '../utils/is-rtl';\nimport safeBoundingBoxPadding from '../utils/safe-bounding-box-padding';\nimport useWindowSize from '../utils/useWindowSize';\n\n// It's like Menu but with sensible defaults, bug fixes and improvements.\nfunction Menu2(props) {\n const { containerProps, instanceRef: _instanceRef, align } = props;\n const size = useWindowSize();\n const instanceRef = _instanceRef?.current ? _instanceRef : useRef();\n\n // Values: start, end, center\n // Note: don't mess with 'center'\n const rtlAlign = isRTL()\n ? align === 'end'\n ? 'start'\n : align === 'start'\n ? 'end'\n : align\n : align;\n\n return (\n <Menu\n boundingBoxPadding={safeBoundingBoxPadding()}\n repositionFlag={`${size.width}x${size.height}`}\n unmountOnClose\n {...props}\n align={rtlAlign}\n instanceRef={instanceRef}\n containerProps={{\n onClick: (e) => {\n if (e.target === e.currentTarget) {\n instanceRef.current?.closeMenu?.();\n }\n containerProps?.onClick?.(e);\n },\n ...containerProps,\n }}\n />\n );\n}\n\nexport default Menu2;\n","import { SubMenu } from '@szhsin/react-menu';\nimport { useRef } from 'preact/hooks';\n\nexport default function SubMenu2(props) {\n const menuRef = useRef();\n return (\n <SubMenu\n {...props}\n instanceRef={menuRef}\n // Test fix for bug; submenus not opening on Android\n itemProps={{\n onPointerMove: (e) => {\n if (e.pointerType === 'touch') {\n menuRef.current?.openMenu?.();\n }\n },\n onPointerLeave: (e) => {\n if (e.pointerType === 'touch') {\n menuRef.current?.openMenu?.();\n }\n },\n ...props.itemProps,\n }}\n />\n );\n}\n","import { MenuItem } from '@szhsin/react-menu';\nimport { cloneElement } from 'preact';\n\nimport Menu2 from './menu2';\nimport SubMenu2 from './submenu2';\n\nfunction MenuConfirm({\n subMenu = false,\n confirm = true,\n confirmLabel,\n menuItemClassName,\n menuFooter,\n menuExtras,\n ...props\n}) {\n const { children, onClick, ...restProps } = props;\n if (!confirm) {\n if (subMenu) return <MenuItem {...props} />;\n if (onClick) {\n return cloneElement(children, {\n onClick,\n });\n }\n return children;\n }\n const Parent = subMenu ? SubMenu2 : Menu2;\n return (\n <Parent\n openTrigger=\"clickOnly\"\n direction=\"bottom\"\n overflow=\"auto\"\n gap={-8}\n shift={8}\n menuClassName=\"menu-emphasized\"\n {...restProps}\n menuButton={subMenu ? undefined : children}\n label={subMenu ? children : undefined}\n >\n <MenuItem className={menuItemClassName} onClick={onClick}>\n {confirmLabel}\n </MenuItem>\n {menuExtras}\n {menuFooter}\n </Parent>\n );\n}\n\nexport default MenuConfirm;\n","import { FocusableItem } from '@szhsin/react-menu';\n\nimport Link from './link';\n\nfunction MenuLink(props) {\n const { className, disabled, ...restProps } = props;\n return (\n <FocusableItem className={className} disabled={disabled}>\n {({ ref, closeMenu }) => (\n <Link\n {...restProps}\n ref={ref}\n onClick={({ detail }) =>\n closeMenu(detail === 0 ? 'Enter' : undefined)\n }\n />\n )}\n </FocusableItem>\n );\n}\n\nexport default MenuLink;\n","export default function CustomEmoji({ staticUrl, alt, url }) {\n return (\n <picture>\n {staticUrl && (\n <source srcset={staticUrl} media=\"(prefers-reduced-motion: reduce)\" />\n )}\n <img\n key={alt || url}\n src={url}\n alt={alt}\n class=\"shortcode-emoji emoji\"\n width=\"16\"\n height=\"16\"\n loading=\"lazy\"\n decoding=\"async\"\n fetchPriority=\"low\"\n />\n </picture>\n );\n}\n","import { memo } from 'preact/compat';\n\nimport mem from '../utils/mem';\n\nimport CustomEmoji from './custom-emoji';\n\nconst shortcodesRegexp = mem((shortcodes) => {\n return new RegExp(`:(${shortcodes.join('|')}):`, 'g');\n});\n\nfunction EmojiText({ text, emojis }) {\n if (!text) return '';\n if (!emojis?.length) return text;\n if (text.indexOf(':') === -1) return text;\n // const regex = new RegExp(\n // `:(${emojis.map((e) => e.shortcode).join('|')}):`,\n // 'g',\n // );\n const regex = shortcodesRegexp(emojis.map((e) => e.shortcode));\n const elements = text.split(regex).map((word, i) => {\n const emoji = emojis.find((e) => e.shortcode === word);\n if (emoji) {\n const { url, staticUrl } = emoji;\n return (\n <CustomEmoji\n staticUrl={staticUrl}\n alt={word}\n url={url}\n key={word + '-' + i} // Handle >= 2 same shortcodes\n />\n );\n }\n return word;\n });\n return elements;\n}\n\nexport default mem(EmojiText);\n\n// export default memo(\n// EmojiText,\n// (oldProps, newProps) =>\n// oldProps.text === newProps.text &&\n// oldProps.emojis?.length === newProps.emojis?.length,\n// );\n","import './name-text.css';\n\nimport { useLingui } from '@lingui/react';\nimport { memo } from 'preact/compat';\n\nimport { api } from '../utils/api';\nimport mem from '../utils/mem';\nimport states from '../utils/states';\n\nimport Avatar from './avatar';\nimport EmojiText from './emoji-text';\n\nconst nameCollator = mem((locale) => {\n const options = {\n sensitivity: 'base',\n };\n try {\n return new Intl.Collator(locale || undefined, options);\n } catch (e) {\n return new Intl.Collator(undefined, options);\n }\n});\n\nconst ACCT_REGEX = /([^@]+)(@.+)/i;\nconst SHORTCODES_REGEX = /(\\:(\\w|\\+|\\-)+\\:)(?=|[\\!\\.\\?]|$)/g;\nconst SPACES_REGEX = /\\s+/g;\nconst NON_ALPHA_NUMERIC_REGEX = /[^a-z0-9@\\.]/gi;\n\nfunction NameText({\n account,\n instance,\n showAvatar,\n showAcct,\n short,\n external,\n onClick,\n}) {\n const { i18n } = useLingui();\n const {\n acct,\n avatar,\n avatarStatic,\n id,\n url,\n displayName,\n emojis,\n bot,\n username,\n } = account;\n const [_, acct1, acct2] = acct.match(ACCT_REGEX) || [, acct];\n\n if (!instance) instance = api().instance;\n\n const trimmedUsername = username.toLowerCase().trim();\n const trimmedDisplayName = (displayName || '').toLowerCase().trim();\n const shortenedDisplayName = trimmedDisplayName\n .replace(SHORTCODES_REGEX, '') // Remove shortcodes, regex from https://regex101.com/r/iE9uV0/1\n .replace(SPACES_REGEX, ''); // E.g. \"My name\" === \"myname\"\n const shortenedAlphaNumericDisplayName = shortenedDisplayName.replace(\n NON_ALPHA_NUMERIC_REGEX,\n '',\n ); // Remove non-alphanumeric characters\n\n const hideUsername =\n (!short &&\n (trimmedUsername === trimmedDisplayName ||\n trimmedUsername === shortenedDisplayName ||\n trimmedUsername === shortenedAlphaNumericDisplayName ||\n nameCollator(i18n.locale).compare(\n trimmedUsername,\n shortenedDisplayName,\n ) === 0)) ||\n shortenedAlphaNumericDisplayName === acct.toLowerCase();\n\n return (\n <a\n class={`name-text ${showAcct ? 'show-acct' : ''} ${short ? 'short' : ''}`}\n href={url}\n target={external ? '_blank' : null}\n title={\n displayName\n ? `${displayName} (${acct2 ? '' : '@'}${acct})`\n : `${acct2 ? '' : '@'}${acct}`\n }\n onClick={(e) => {\n if (external) return;\n if (e.shiftKey) return; // Save link? 🤷‍♂️\n e.preventDefault();\n e.stopPropagation();\n if (onClick) return onClick(e);\n if (e.metaKey || e.ctrlKey || e.shiftKey || e.which === 2) {\n const internalURL = `#/${instance}/a/${id}`;\n window.open(internalURL, '_blank');\n return;\n }\n states.showAccount = {\n account,\n instance,\n };\n }}\n >\n {showAvatar && (\n <>\n <Avatar url={avatarStatic || avatar} squircle={bot} />{' '}\n </>\n )}\n {displayName && !short ? (\n <>\n <b dir=\"auto\">\n <EmojiText text={displayName} emojis={emojis} />\n </b>\n {!showAcct && !hideUsername && (\n <>\n {' '}\n <i class=\"bidi-isolate\">@{username}</i>\n </>\n )}\n </>\n ) : short ? (\n <i>{username}</i>\n ) : (\n <b>{username}</b>\n )}\n {showAcct && (\n <>\n <br />\n <i class=\"bidi-isolate\">\n {acct2 ? '' : '@'}\n {acct1}\n {!!acct2 && <span class=\"ib\">{acct2}</span>}\n </i>\n </>\n )}\n </a>\n );\n}\n\nexport default mem(NameText);\n\n// export default memo(NameText, (oldProps, newProps) => {\n// // Only care about account.id, the other props usually don't change\n// const { account } = oldProps;\n// const { account: newAccount } = newProps;\n// return account?.acct === newAccount?.acct;\n// });\n","import { i18n } from '@lingui/core';\n\nimport mem from './mem';\n\n// Some codes are not supported by Intl.DisplayNames\n// These are mapped to other codes as fallback\nconst codeMappings = {\n 'zh-YUE': 'YUE',\n zh_HANT: 'zh-Hant',\n};\n\nconst IntlDN = mem(\n (locale) =>\n new Intl.DisplayNames(locale || undefined, {\n type: 'language',\n }),\n);\n\nfunction _localeCode2Text(code) {\n let locale;\n let fallback;\n if (typeof code === 'object') {\n ({ code, locale, fallback } = code);\n }\n try {\n const text = IntlDN(locale || i18n.locale).of(code);\n if (text !== code) return text;\n if (!fallback) {\n const anotherText = IntlDN(code).of(code);\n if (anotherText !== code) return anotherText;\n }\n return fallback || '';\n } catch (e) {\n if (codeMappings[code]) {\n try {\n const text = IntlDN(codeMappings[locale] || locale || i18n.locale).of(\n codeMappings[code],\n );\n if (text !== codeMappings[code]) return text;\n return fallback || '';\n } catch (e2) {\n console.warn(code, e2);\n }\n }\n return fallback || '';\n }\n}\n\nexport default mem(_localeCode2Text);\n","import { i18n } from '@lingui/core';\nimport { t, Trans } from '@lingui/macro';\nimport { useEffect, useMemo, useReducer } from 'preact/hooks';\n\nimport localeMatch from '../utils/locale-match';\nimport mem from '../utils/mem';\n\nfunction isValidDate(value) {\n if (value instanceof Date) {\n return !isNaN(value.getTime());\n } else {\n const date = new Date(value);\n return !isNaN(date.getTime());\n }\n}\n\nconst resolvedLocale = mem(\n () => new Intl.DateTimeFormat().resolvedOptions().locale,\n);\nconst DTF = mem((locale, opts = {}) => {\n const regionlessLocale = locale.replace(/-[a-z]+$/i, '');\n const lang = localeMatch([regionlessLocale], [resolvedLocale()], locale);\n try {\n return new Intl.DateTimeFormat(lang, opts);\n } catch (e) {}\n try {\n return new Intl.DateTimeFormat(locale, opts);\n } catch (e) {}\n return new Intl.DateTimeFormat(undefined, opts);\n});\nconst RTF = mem((locale) => new Intl.RelativeTimeFormat(locale || undefined));\n\nconst minute = 60;\nconst hour = 60 * minute;\nconst day = 24 * hour;\n\nconst rtfFromNow = (date) => {\n // date = Date object\n const rtf = RTF(i18n.locale);\n const seconds = (date.getTime() - Date.now()) / 1000;\n const absSeconds = Math.abs(seconds);\n if (absSeconds < minute) {\n return rtf.format(seconds, 'second');\n } else if (absSeconds < hour) {\n return rtf.format(Math.floor(seconds / minute), 'minute');\n } else if (absSeconds < day) {\n return rtf.format(Math.floor(seconds / hour), 'hour');\n } else {\n return rtf.format(Math.floor(seconds / day), 'day');\n }\n};\n\nconst twitterFromNow = (date) => {\n // date = Date object\n const seconds = (Date.now() - date.getTime()) / 1000;\n if (seconds < minute) {\n return t({\n comment: 'Relative time in seconds, as short as possible',\n message: `${seconds < 1 ? 1 : Math.floor(seconds)}s`,\n });\n } else if (seconds < hour) {\n return t({\n comment: 'Relative time in minutes, as short as possible',\n message: `${Math.floor(seconds / minute)}m`,\n });\n } else {\n return t({\n comment: 'Relative time in hours, as short as possible',\n message: `${Math.floor(seconds / hour)}h`,\n });\n }\n};\n\nexport default function RelativeTime({ datetime, format }) {\n if (!datetime) return null;\n const [renderCount, rerender] = useReducer((x) => x + 1, 0);\n const date = useMemo(() => new Date(datetime), [datetime]);\n const [dateStr, dt, title] = useMemo(() => {\n if (!isValidDate(date)) return ['' + datetime, '', ''];\n let str;\n if (format === 'micro') {\n // If date <= 1 day ago or day is within this year\n const now = new Date();\n const dayDiff = (now.getTime() - date.getTime()) / 1000 / day;\n if (dayDiff <= 1) {\n str = twitterFromNow(date);\n } else {\n const sameYear = now.getFullYear() === date.getFullYear();\n if (sameYear) {\n str = DTF(i18n.locale, {\n year: undefined,\n month: 'short',\n day: 'numeric',\n }).format(date);\n } else {\n str = DTF(i18n.locale, {\n dateStyle: 'short',\n }).format(date);\n }\n }\n }\n if (!str) str = rtfFromNow(date);\n return [str, date.toISOString(), date.toLocaleString()];\n }, [date, format, renderCount]);\n\n useEffect(() => {\n if (!isValidDate(date)) return;\n let timeout;\n let raf;\n function rafRerender() {\n raf = requestAnimationFrame(() => {\n rerender();\n scheduleRerender();\n });\n }\n function scheduleRerender() {\n // If less than 1 minute, rerender every 10s\n // If less than 1 hour rerender every 1m\n // Else, don't need to rerender\n const seconds = (Date.now() - date.getTime()) / 1000;\n if (seconds < minute) {\n timeout = setTimeout(rafRerender, 10_000);\n } else if (seconds < hour) {\n timeout = setTimeout(rafRerender, 60_000);\n }\n }\n scheduleRerender();\n return () => {\n clearTimeout(timeout);\n cancelAnimationFrame(raf);\n };\n }, []);\n\n return (\n <time datetime={dt} title={title}>\n {dateStr}\n </time>\n );\n}\n","import translationTargetLanguages from '../data/lingva-target-languages';\n\nimport localeMatch from './locale-match';\nimport mem from './mem';\nimport states from './states';\n\nconst locales = mem(() => [\n new Intl.DateTimeFormat().resolvedOptions().locale,\n ...navigator.languages,\n]);\n\nconst localeTargetLanguages = () =>\n localeMatch(\n locales(),\n translationTargetLanguages.map((l) => l.code.replace('_', '-')), // The underscore will fail Intl.Locale inside `match`\n 'en',\n );\n\nfunction getTranslateTargetLanguage(fromSettings = false) {\n if (fromSettings) {\n const { contentTranslationTargetLanguage } = states.settings;\n if (contentTranslationTargetLanguage) {\n return contentTranslationTargetLanguage;\n }\n }\n return localeTargetLanguages();\n}\n\nexport default getTranslateTargetLanguage;\n","import { i18n } from '@lingui/core';\n\n// https://tc39.es/ecma402/#table-sanctioned-single-unit-identifiers\nconst BYTES_UNITS = [\n 'byte',\n 'kilobyte',\n 'megabyte',\n 'gigabyte',\n 'terabyte',\n 'petabyte',\n];\nexport default function prettyBytes(bytes) {\n const unitIndex = Math.min(\n Math.floor(Math.log2(bytes) / 10),\n BYTES_UNITS.length - 1,\n );\n const value = bytes / 1024 ** unitIndex;\n return i18n.number(value, {\n style: 'unit',\n unit: BYTES_UNITS[unitIndex],\n unitDisplay: 'narrow',\n maximumFractionDigits: 0,\n });\n}\n","export const semver = /^[v^~<>=]*?(\\d+)(?:\\.([x*]|\\d+)(?:\\.([x*]|\\d+)(?:\\.([x*]|\\d+))?(?:-([\\da-z\\-]+(?:\\.[\\da-z\\-]+)*))?(?:\\+[\\da-z\\-]+(?:\\.[\\da-z\\-]+)*)?)?)?$/i;\nexport const validateAndParse = (version) => {\n if (typeof version !== 'string') {\n throw new TypeError('Invalid argument expected string');\n }\n const match = version.match(semver);\n if (!match) {\n throw new Error(`Invalid argument not valid semver ('${version}' received)`);\n }\n match.shift();\n return match;\n};\nconst isWildcard = (s) => s === '*' || s === 'x' || s === 'X';\nconst tryParse = (v) => {\n const n = parseInt(v, 10);\n return isNaN(n) ? v : n;\n};\nconst forceType = (a, b) => typeof a !== typeof b ? [String(a), String(b)] : [a, b];\nconst compareStrings = (a, b) => {\n if (isWildcard(a) || isWildcard(b))\n return 0;\n const [ap, bp] = forceType(tryParse(a), tryParse(b));\n if (ap > bp)\n return 1;\n if (ap < bp)\n return -1;\n return 0;\n};\nexport const compareSegments = (a, b) => {\n for (let i = 0; i < Math.max(a.length, b.length); i++) {\n const r = compareStrings(a[i] || '0', b[i] || '0');\n if (r !== 0)\n return r;\n }\n return 0;\n};\n//# sourceMappingURL=utils.js.map","import { compareSegments, validateAndParse } from './utils.js';\n/**\n * Compare [semver](https://semver.org/) version strings to find greater, equal or lesser.\n * This library supports the full semver specification, including comparing versions with different number of digits like `1.0.0`, `1.0`, `1`, and pre-release versions like `1.0.0-alpha`.\n * @param v1 - First version to compare\n * @param v2 - Second version to compare\n * @returns Numeric value compatible with the [Array.sort(fn) interface](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#Parameters).\n */\nexport const compareVersions = (v1, v2) => {\n // validate input and split into segments\n const n1 = validateAndParse(v1);\n const n2 = validateAndParse(v2);\n // pop off the patch\n const p1 = n1.pop();\n const p2 = n2.pop();\n // validate numbers\n const r = compareSegments(n1, n2);\n if (r !== 0)\n return r;\n // validate pre-release\n if (p1 && p2) {\n return compareSegments(p1.split('.'), p2.split('.'));\n }\n else if (p1 || p2) {\n return p1 ? -1 : 1;\n }\n return 0;\n};\n//# sourceMappingURL=compareVersions.js.map","import { compareVersions } from './compareVersions.js';\n/**\n * Compare [semver](https://semver.org/) version strings using the specified operator.\n *\n * @param v1 First version to compare\n * @param v2 Second version to compare\n * @param operator Allowed arithmetic operator to use\n * @returns `true` if the comparison between the firstVersion and the secondVersion satisfies the operator, `false` otherwise.\n *\n * @example\n * ```\n * compare('10.1.8', '10.0.4', '>'); // return true\n * compare('10.0.1', '10.0.1', '='); // return true\n * compare('10.1.1', '10.2.2', '<'); // return true\n * compare('10.1.1', '10.2.2', '<='); // return true\n * compare('10.1.1', '10.2.2', '>='); // return false\n * ```\n */\nexport const compare = (v1, v2, operator) => {\n // validate input operator\n assertValidOperator(operator);\n // since result of compareVersions can only be -1 or 0 or 1\n // a simple map can be used to replace switch\n const res = compareVersions(v1, v2);\n return operatorResMap[operator].includes(res);\n};\nconst operatorResMap = {\n '>': [1],\n '>=': [0, 1],\n '=': [0],\n '<=': [-1, 0],\n '<': [-1],\n '!=': [-1, 1],\n};\nconst allowedOperators = Object.keys(operatorResMap);\nconst assertValidOperator = (op) => {\n if (typeof op !== 'string') {\n throw new TypeError(`Invalid operator type, expected string but got ${typeof op}`);\n }\n if (allowedOperators.indexOf(op) === -1) {\n throw new Error(`Invalid operator, expected one of ${allowedOperators.join('|')}`);\n }\n};\n//# sourceMappingURL=compare.js.map","import { compare } from './compare.js';\nimport { compareSegments, validateAndParse } from './utils.js';\n/**\n * Match [npm semver](https://docs.npmjs.com/cli/v6/using-npm/semver) version range.\n *\n * @param version Version number to match\n * @param range Range pattern for version\n * @returns `true` if the version number is within the range, `false` otherwise.\n *\n * @example\n * ```\n * satisfies('1.1.0', '^1.0.0'); // return true\n * satisfies('1.1.0', '~1.0.0'); // return false\n * ```\n */\nexport const satisfies = (version, range) => {\n // clean input\n range = range.replace(/([><=]+)\\s+/g, '$1');\n // handle multiple comparators\n if (range.includes('||')) {\n return range.split('||').some((r) => satisfies(version, r));\n }\n else if (range.includes(' - ')) {\n const [a, b] = range.split(' - ', 2);\n return satisfies(version, `>=${a} <=${b}`);\n }\n else if (range.includes(' ')) {\n return range\n .trim()\n .replace(/\\s{2,}/g, ' ')\n .split(' ')\n .every((r) => satisfies(version, r));\n }\n // if no range operator then \"=\"\n const m = range.match(/^([<>=~^]+)/);\n const op = m ? m[1] : '=';\n // if gt/lt/eq then operator compare\n if (op !== '^' && op !== '~')\n return compare(version, range, op);\n // else range of either \"~\" or \"^\" is assumed\n const [v1, v2, v3, , vp] = validateAndParse(version);\n const [r1, r2, r3, , rp] = validateAndParse(range);\n const v = [v1, v2, v3];\n const r = [r1, r2 !== null && r2 !== void 0 ? r2 : 'x', r3 !== null && r3 !== void 0 ? r3 : 'x'];\n // validate pre-release\n if (rp) {\n if (!vp)\n return false;\n if (compareSegments(v, r) !== 0)\n return false;\n if (compareSegments(vp.split('.'), rp.split('.')) === -1)\n return false;\n }\n // first non-zero number\n const nonZero = r.findIndex((v) => v !== '0') + 1;\n // pointer to where segments can be >=\n const i = op === '~' ? 2 : nonZero > 1 ? nonZero : 1;\n // before pointer must be equal\n if (compareSegments(v.slice(0, i), r.slice(0, i)) !== 0)\n return false;\n // after pointer must be >=\n if (compareSegments(v.slice(i), r.slice(i)) === -1)\n return false;\n return true;\n};\n//# sourceMappingURL=satisfies.js.map","import { satisfies } from 'compare-versions';\n\nimport features from '../data/features.json';\n\nimport { getCurrentInstance, getCurrentNodeInfo } from './store-utils';\n\n// Non-semver(?) UA string detection\nconst containPixelfed = /pixelfed/i;\nconst notContainPixelfed = /^(?!.*pixelfed).*$/i;\nconst containPleroma = /pleroma/i;\nconst containAkkoma = /akkoma/i;\nconst containGTS = /gotosocial/i;\nconst platformFeatures = {\n '@mastodon/lists': notContainPixelfed,\n '@mastodon/filters': notContainPixelfed,\n '@mastodon/mentions': notContainPixelfed,\n '@mastodon/trending-hashtags': notContainPixelfed,\n '@mastodon/trending-links': notContainPixelfed,\n '@mastodon/post-bookmark': notContainPixelfed,\n '@mastodon/post-edit': notContainPixelfed,\n '@mastodon/profile-edit': notContainPixelfed,\n '@mastodon/profile-private-note': notContainPixelfed,\n '@pixelfed/trending': containPixelfed,\n '@pixelfed/home-include-reblogs': containPixelfed,\n '@pixelfed/global-feed': containPixelfed,\n '@pleroma/local-visibility-post': containPleroma,\n '@akkoma/local-visibility-post': containAkkoma,\n};\n\nconst supportsCache = {};\n\nfunction supports(feature) {\n try {\n let { version, domain } = getCurrentInstance();\n let softwareName = getCurrentNodeInfo()?.software?.name || 'mastodon';\n\n if (softwareName === 'hometown') {\n // Hometown is a Mastodon fork and inherits its features\n softwareName = 'mastodon';\n }\n\n const key = `${domain}-${feature}`;\n if (supportsCache[key]) return supportsCache[key];\n\n if (platformFeatures[feature]) {\n return (supportsCache[key] = platformFeatures[feature].test(version));\n }\n\n const range = features[feature];\n if (!range) return false;\n\n // '@mastodon/blah' => 'mastodon'\n const featureSoftware = feature.match(/^@([a-z]+)\\//)[1];\n\n const doesSoftwareMatch = featureSoftware === softwareName.toLowerCase();\n return (supportsCache[key] =\n doesSoftwareMatch &&\n satisfies(version, range, {\n includePrerelease: true,\n loose: true,\n }));\n } catch (e) {\n return false;\n }\n}\n\nexport default supports;\n","'use strict';\n\n/** Highest positive signed 32-bit float value */\nconst maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\n\n/** Bootstring parameters */\nconst base = 36;\nconst tMin = 1;\nconst tMax = 26;\nconst skew = 38;\nconst damp = 700;\nconst initialBias = 72;\nconst initialN = 128; // 0x80\nconst delimiter = '-'; // '\\x2D'\n\n/** Regular expressions */\nconst regexPunycode = /^xn--/;\nconst regexNonASCII = /[^\\0-\\x7F]/; // Note: U+007F DEL is excluded too.\nconst regexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\n\n/** Error messages */\nconst errors = {\n\t'overflow': 'Overflow: input needs wider integers to process',\n\t'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n\t'invalid-input': 'Invalid input'\n};\n\n/** Convenience shortcuts */\nconst baseMinusTMin = base - tMin;\nconst floor = Math.floor;\nconst stringFromCharCode = String.fromCharCode;\n\n/*--------------------------------------------------------------------------*/\n\n/**\n * A generic error utility function.\n * @private\n * @param {String} type The error type.\n * @returns {Error} Throws a `RangeError` with the applicable error message.\n */\nfunction error(type) {\n\tthrow new RangeError(errors[type]);\n}\n\n/**\n * A generic `Array#map` utility function.\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} callback The function that gets called for every array\n * item.\n * @returns {Array} A new array of values returned by the callback function.\n */\nfunction map(array, callback) {\n\tconst result = [];\n\tlet length = array.length;\n\twhile (length--) {\n\t\tresult[length] = callback(array[length]);\n\t}\n\treturn result;\n}\n\n/**\n * A simple `Array#map`-like wrapper to work with domain name strings or email\n * addresses.\n * @private\n * @param {String} domain The domain name or email address.\n * @param {Function} callback The function that gets called for every\n * character.\n * @returns {String} A new string of characters returned by the callback\n * function.\n */\nfunction mapDomain(domain, callback) {\n\tconst parts = domain.split('@');\n\tlet result = '';\n\tif (parts.length > 1) {\n\t\t// In email addresses, only the domain name should be punycoded. Leave\n\t\t// the local part (i.e. everything up to `@`) intact.\n\t\tresult = parts[0] + '@';\n\t\tdomain = parts[1];\n\t}\n\t// Avoid `split(regex)` for IE8 compatibility. See #17.\n\tdomain = domain.replace(regexSeparators, '\\x2E');\n\tconst labels = domain.split('.');\n\tconst encoded = map(labels, callback).join('.');\n\treturn result + encoded;\n}\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n * @see `punycode.ucs2.encode`\n * @see <https://mathiasbynens.be/notes/javascript-encoding>\n * @memberOf punycode.ucs2\n * @name decode\n * @param {String} string The Unicode input string (UCS-2).\n * @returns {Array} The new array of code points.\n */\nfunction ucs2decode(string) {\n\tconst output = [];\n\tlet counter = 0;\n\tconst length = string.length;\n\twhile (counter < length) {\n\t\tconst value = string.charCodeAt(counter++);\n\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t// It's a high surrogate, and there is a next character.\n\t\t\tconst extra = string.charCodeAt(counter++);\n\t\t\tif ((extra & 0xFC00) == 0xDC00) { // Low surrogate.\n\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t} else {\n\t\t\t\t// It's an unmatched surrogate; only append this code unit, in case the\n\t\t\t\t// next code unit is the high surrogate of a surrogate pair.\n\t\t\t\toutput.push(value);\n\t\t\t\tcounter--;\n\t\t\t}\n\t\t} else {\n\t\t\toutput.push(value);\n\t\t}\n\t}\n\treturn output;\n}\n\n/**\n * Creates a string based on an array of numeric code points.\n * @see `punycode.ucs2.decode`\n * @memberOf punycode.ucs2\n * @name encode\n * @param {Array} codePoints The array of numeric code points.\n * @returns {String} The new Unicode string (UCS-2).\n */\nconst ucs2encode = codePoints => String.fromCodePoint(...codePoints);\n\n/**\n * Converts a basic code point into a digit/integer.\n * @see `digitToBasic()`\n * @private\n * @param {Number} codePoint The basic numeric code point value.\n * @returns {Number} The numeric value of a basic code point (for use in\n * representing integers) in the range `0` to `base - 1`, or `base` if\n * the code point does not represent a value.\n */\nconst basicToDigit = function(codePoint) {\n\tif (codePoint >= 0x30 && codePoint < 0x3A) {\n\t\treturn 26 + (codePoint - 0x30);\n\t}\n\tif (codePoint >= 0x41 && codePoint < 0x5B) {\n\t\treturn codePoint - 0x41;\n\t}\n\tif (codePoint >= 0x61 && codePoint < 0x7B) {\n\t\treturn codePoint - 0x61;\n\t}\n\treturn base;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n * @see `basicToDigit()`\n * @private\n * @param {Number} digit The numeric value of a basic code point.\n * @returns {Number} The basic code point whose value (when used for\n * representing integers) is `digit`, which needs to be in the range\n * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\n * used; else, the lowercase form is used. The behavior is undefined\n * if `flag` is non-zero and `digit` has no uppercase form.\n */\nconst digitToBasic = function(digit, flag) {\n\t// 0..25 map to ASCII a..z or A..Z\n\t// 26..35 map to ASCII 0..9\n\treturn digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n * @private\n */\nconst adapt = function(delta, numPoints, firstTime) {\n\tlet k = 0;\n\tdelta = firstTime ? floor(delta / damp) : delta >> 1;\n\tdelta += floor(delta / numPoints);\n\tfor (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {\n\t\tdelta = floor(delta / baseMinusTMin);\n\t}\n\treturn floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n};\n\n/**\n * Converts a Punycode string of ASCII-only symbols to a string of Unicode\n * symbols.\n * @memberOf punycode\n * @param {String} input The Punycode string of ASCII-only symbols.\n * @returns {String} The resulting string of Unicode symbols.\n */\nconst decode = function(input) {\n\t// Don't use UCS-2.\n\tconst output = [];\n\tconst inputLength = input.length;\n\tlet i = 0;\n\tlet n = initialN;\n\tlet bias = initialBias;\n\n\t// Handle the basic code points: let `basic` be the number of input code\n\t// points before the last delimiter, or `0` if there is none, then copy\n\t// the first basic code points to the output.\n\n\tlet basic = input.lastIndexOf(delimiter);\n\tif (basic < 0) {\n\t\tbasic = 0;\n\t}\n\n\tfor (let j = 0; j < basic; ++j) {\n\t\t// if it's not a basic code point\n\t\tif (input.charCodeAt(j) >= 0x80) {\n\t\t\terror('not-basic');\n\t\t}\n\t\toutput.push(input.charCodeAt(j));\n\t}\n\n\t// Main decoding loop: start just after the last delimiter if any basic code\n\t// points were copied; start at the beginning otherwise.\n\n\tfor (let index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {\n\n\t\t// `index` is the index of the next character to be consumed.\n\t\t// Decode a generalized variable-length integer into `delta`,\n\t\t// which gets added to `i`. The overflow checking is easier\n\t\t// if we increase `i` as we go, then subtract off its starting\n\t\t// value at the end to obtain `delta`.\n\t\tconst oldi = i;\n\t\tfor (let w = 1, k = base; /* no condition */; k += base) {\n\n\t\t\tif (index >= inputLength) {\n\t\t\t\terror('invalid-input');\n\t\t\t}\n\n\t\t\tconst digit = basicToDigit(input.charCodeAt(index++));\n\n\t\t\tif (digit >= base) {\n\t\t\t\terror('invalid-input');\n\t\t\t}\n\t\t\tif (digit > floor((maxInt - i) / w)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\ti += digit * w;\n\t\t\tconst t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\n\t\t\tif (digit < t) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst baseMinusT = base - t;\n\t\t\tif (w > floor(maxInt / baseMinusT)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tw *= baseMinusT;\n\n\t\t}\n\n\t\tconst out = output.length + 1;\n\t\tbias = adapt(i - oldi, out, oldi == 0);\n\n\t\t// `i` was supposed to wrap around from `out` to `0`,\n\t\t// incrementing `n` each time, so we'll fix that now:\n\t\tif (floor(i / out) > maxInt - n) {\n\t\t\terror('overflow');\n\t\t}\n\n\t\tn += floor(i / out);\n\t\ti %= out;\n\n\t\t// Insert `n` at position `i` of the output.\n\t\toutput.splice(i++, 0, n);\n\n\t}\n\n\treturn String.fromCodePoint(...output);\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n * @memberOf punycode\n * @param {String} input The string of Unicode symbols.\n * @returns {String} The resulting Punycode string of ASCII-only symbols.\n */\nconst encode = function(input) {\n\tconst output = [];\n\n\t// Convert the input in UCS-2 to an array of Unicode code points.\n\tinput = ucs2decode(input);\n\n\t// Cache the length.\n\tconst inputLength = input.length;\n\n\t// Initialize the state.\n\tlet n = initialN;\n\tlet delta = 0;\n\tlet bias = initialBias;\n\n\t// Handle the basic code points.\n\tfor (const currentValue of input) {\n\t\tif (currentValue < 0x80) {\n\t\t\toutput.push(stringFromCharCode(currentValue));\n\t\t}\n\t}\n\n\tconst basicLength = output.length;\n\tlet handledCPCount = basicLength;\n\n\t// `handledCPCount` is the number of code points that have been handled;\n\t// `basicLength` is the number of basic code points.\n\n\t// Finish the basic string with a delimiter unless it's empty.\n\tif (basicLength) {\n\t\toutput.push(delimiter);\n\t}\n\n\t// Main encoding loop:\n\twhile (handledCPCount < inputLength) {\n\n\t\t// All non-basic code points < n have been handled already. Find the next\n\t\t// larger one:\n\t\tlet m = maxInt;\n\t\tfor (const currentValue of input) {\n\t\t\tif (currentValue >= n && currentValue < m) {\n\t\t\t\tm = currentValue;\n\t\t\t}\n\t\t}\n\n\t\t// Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,\n\t\t// but guard against overflow.\n\t\tconst handledCPCountPlusOne = handledCPCount + 1;\n\t\tif (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n\t\t\terror('overflow');\n\t\t}\n\n\t\tdelta += (m - n) * handledCPCountPlusOne;\n\t\tn = m;\n\n\t\tfor (const currentValue of input) {\n\t\t\tif (currentValue < n && ++delta > maxInt) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\t\t\tif (currentValue === n) {\n\t\t\t\t// Represent delta as a generalized variable-length integer.\n\t\t\t\tlet q = delta;\n\t\t\t\tfor (let k = base; /* no condition */; k += base) {\n\t\t\t\t\tconst t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\t\t\t\t\tif (q < t) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tconst qMinusT = q - t;\n\t\t\t\t\tconst baseMinusT = base - t;\n\t\t\t\t\toutput.push(\n\t\t\t\t\t\tstringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))\n\t\t\t\t\t);\n\t\t\t\t\tq = floor(qMinusT / baseMinusT);\n\t\t\t\t}\n\n\t\t\t\toutput.push(stringFromCharCode(digitToBasic(q, 0)));\n\t\t\t\tbias = adapt(delta, handledCPCountPlusOne, handledCPCount === basicLength);\n\t\t\t\tdelta = 0;\n\t\t\t\t++handledCPCount;\n\t\t\t}\n\t\t}\n\n\t\t++delta;\n\t\t++n;\n\n\t}\n\treturn output.join('');\n};\n\n/**\n * Converts a Punycode string representing a domain name or an email address\n * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\n * it doesn't matter if you call it on a string that has already been\n * converted to Unicode.\n * @memberOf punycode\n * @param {String} input The Punycoded domain name or email address to\n * convert to Unicode.\n * @returns {String} The Unicode representation of the given Punycode\n * string.\n */\nconst toUnicode = function(input) {\n\treturn mapDomain(input, function(string) {\n\t\treturn regexPunycode.test(string)\n\t\t\t? decode(string.slice(4).toLowerCase())\n\t\t\t: string;\n\t});\n};\n\n/**\n * Converts a Unicode string representing a domain name or an email address to\n * Punycode. Only the non-ASCII parts of the domain name will be converted,\n * i.e. it doesn't matter if you call it with a domain that's already in\n * ASCII.\n * @memberOf punycode\n * @param {String} input The domain name or email address to convert, as a\n * Unicode string.\n * @returns {String} The Punycode representation of the given domain name or\n * email address.\n */\nconst toASCII = function(input) {\n\treturn mapDomain(input, function(string) {\n\t\treturn regexNonASCII.test(string)\n\t\t\t? 'xn--' + encode(string)\n\t\t\t: string;\n\t});\n};\n\n/*--------------------------------------------------------------------------*/\n\n/** Define the public API */\nconst punycode = {\n\t/**\n\t * A string representing the current Punycode.js version number.\n\t * @memberOf punycode\n\t * @type String\n\t */\n\t'version': '2.3.1',\n\t/**\n\t * An object of methods to convert from JavaScript's internal character\n\t * representation (UCS-2) to Unicode code points, and back.\n\t * @see <https://mathiasbynens.be/notes/javascript-encoding>\n\t * @memberOf punycode\n\t * @type Object\n\t */\n\t'ucs2': {\n\t\t'decode': ucs2decode,\n\t\t'encode': ucs2encode\n\t},\n\t'decode': decode,\n\t'encode': encode,\n\t'toASCII': toASCII,\n\t'toUnicode': toUnicode\n};\n\nexport { ucs2decode, ucs2encode, decode, encode, toASCII, toUnicode };\nexport default punycode;\n","function emojifyText(text, emojis = []) {\n if (!text) return '';\n if (!emojis.length) return text;\n if (text.indexOf(':') === -1) return text;\n // Replace shortcodes in text with emoji\n // emojis = [{ shortcode: 'smile', url: 'https://example.com/emoji.png' }]\n emojis.forEach((emoji) => {\n const { shortcode, staticUrl, url } = emoji;\n text = text.replace(\n new RegExp(`:${shortcode}:`, 'g'),\n `<picture><source srcset=\"${staticUrl}\" media=\"(prefers-reduced-motion: reduce)\"></source><img class=\"shortcode-emoji emoji\" src=\"${url}\" alt=\":${shortcode}:\" width=\"16\" height=\"16\" loading=\"lazy\" decoding=\"async\" fetchPriority=\"low\" /></picture>`,\n );\n });\n // console.log(text, emojis);\n return text;\n}\n\nexport default emojifyText;\n","import emojifyText from './emojify-text';\nimport mem from './mem';\n\nconst fauxDiv = document.createElement('div');\nconst whitelistLinkClasses = ['u-url', 'mention', 'hashtag'];\n\nconst HTML_CHARS_REGEX = /[&<>]/g;\nfunction escapeHTML(html) {\n return html.replace(\n HTML_CHARS_REGEX,\n (c) =>\n ({\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n }[c]),\n );\n}\n\nconst LINK_REGEX = /<a/i;\nconst HTTP_LINK_REGEX = /^https?:\\/\\//i;\nconst MENTION_REGEX = /^@[^@]+(@[^@]+)?$/;\nconst HASHTAG_REGEX = /^#[^#]+$/;\nconst CODE_BLOCK_REGEX = /^```[^]+```$/;\nconst CODE_BLOCK_START_REGEX = /^```/;\nconst CODE_BLOCK_END_REGEX = /```$/;\nconst INLINE_CODE_REGEX = /`[^`]+`/;\nconst TWITTER_DOMAIN_REGEX = /(twitter|x)\\.com/i;\nconst TWITTER_MENTION_REGEX = /@[a-zA-Z0-9_]+@(twitter|x)\\.com/;\nconst TWITTER_MENTION_CAPTURE_REGEX = /(@([a-zA-Z0-9_]+)@(twitter|x)\\.com)/g;\nconst CODE_INLINE_CAPTURE_REGEX = /(`[^]+?`)/g;\n\nfunction createDOM(html, isDocumentFragment) {\n if (isDocumentFragment) {\n const tpl = document.createElement('template');\n tpl.innerHTML = html;\n return tpl.content;\n } else {\n const tpl = document.createElement('div');\n tpl.innerHTML = html;\n return tpl;\n }\n}\n\nfunction _enhanceContent(content, opts = {}) {\n const { emojis, returnDOM, postEnhanceDOM = () => {} } = opts;\n let enhancedContent = content;\n // const dom = document.createElement('div');\n // dom.innerHTML = enhancedContent;\n const dom = createDOM(enhancedContent, returnDOM);\n const hasLink = LINK_REGEX.test(enhancedContent);\n const hasCodeBlock = enhancedContent.includes('```');\n\n if (hasLink) {\n // Add target=\"_blank\" to all links with no target=\"_blank\"\n // E.g. `note` in `account`\n const noTargetBlankLinks = dom.querySelectorAll('a:not([target=\"_blank\"])');\n for (const link of noTargetBlankLinks) {\n link.setAttribute('target', '_blank');\n }\n\n // Remove all classes except `u-url`, `mention`, `hashtag`\n const links = dom.querySelectorAll('a[class]');\n for (const link of links) {\n for (const c of link.classList) {\n if (!whitelistLinkClasses.includes(c)) {\n link.classList.remove(c);\n }\n }\n }\n }\n\n // Add 'has-url-text' to all links that contains a url\n if (hasLink) {\n const links = dom.querySelectorAll('a[href]');\n for (const link of links) {\n if (HTTP_LINK_REGEX.test(link.textContent.trim())) {\n link.classList.add('has-url-text');\n shortenLink(link);\n }\n }\n }\n\n // Spanify un-spanned mentions\n if (hasLink) {\n const links = dom.querySelectorAll('a[href]');\n const usernames = [];\n for (const link of links) {\n const text = link.innerText.trim();\n const hasChildren = link.querySelector('*');\n // If text looks like @username@domain, then it's a mention\n if (MENTION_REGEX.test(text)) {\n // Only show @username\n const [_, username, domain] = text.split('@');\n if (!hasChildren) {\n if (\n !usernames.some(([u]) => u === username) ||\n usernames.some(([u, d]) => u === username && d === domain)\n ) {\n link.innerHTML = `@<span>${username}</span>`;\n usernames.push([username, domain]);\n } else {\n link.innerHTML = `@<span>${username}@${domain}</span>`;\n }\n }\n link.classList.add('mention');\n }\n // If text looks like #hashtag, then it's a hashtag\n if (HASHTAG_REGEX.test(text)) {\n if (!hasChildren) link.innerHTML = `#<span>${text.slice(1)}</span>`;\n link.classList.add('mention', 'hashtag');\n }\n }\n }\n\n // EMOJIS\n // ======\n // Convert :shortcode: to <img />\n let textNodes;\n if (enhancedContent.includes(':') && emojis?.length) {\n textNodes = extractTextNodes(dom);\n for (const node of textNodes) {\n let html = escapeHTML(node.nodeValue);\n html = emojifyText(html, emojis);\n fauxDiv.innerHTML = html;\n node.replaceWith(...fauxDiv.childNodes);\n }\n }\n\n // CODE BLOCKS\n // ===========\n // Convert ```code``` to <pre><code>code</code></pre>\n if (hasCodeBlock) {\n const blocks = [...dom.querySelectorAll('p')].filter((p) =>\n CODE_BLOCK_REGEX.test(p.innerText.trim()),\n );\n for (const block of blocks) {\n const pre = document.createElement('pre');\n // Replace <br /> with newlines\n for (const br of block.querySelectorAll('br')) {\n br.replaceWith('\\n');\n }\n pre.innerHTML = `<code>${block.innerHTML.trim()}</code>`;\n block.replaceWith(pre);\n }\n }\n\n // Convert multi-paragraph code blocks to <pre><code>code</code></pre>\n if (hasCodeBlock) {\n const paragraphs = [...dom.querySelectorAll('p')];\n // Filter out paragraphs with ``` in beginning only\n const codeBlocks = paragraphs.filter((p) =>\n CODE_BLOCK_START_REGEX.test(p.innerText),\n );\n // For each codeBlocks, get all paragraphs until the last paragraph with ``` at the end only\n for (const block of codeBlocks) {\n const nextParagraphs = [block];\n let hasCodeBlock = false;\n let currentBlock = block;\n while (currentBlock.nextElementSibling) {\n const next = currentBlock.nextElementSibling;\n if (next && next.tagName === 'P') {\n if (CODE_BLOCK_END_REGEX.test(next.innerText)) {\n nextParagraphs.push(next);\n hasCodeBlock = true;\n break;\n } else {\n nextParagraphs.push(next);\n }\n } else {\n break;\n }\n currentBlock = next;\n }\n if (hasCodeBlock) {\n const pre = document.createElement('pre');\n for (const p of nextParagraphs) {\n // Replace <br /> with newlines\n for (const br of p.querySelectorAll('br')) {\n br.replaceWith('\\n');\n }\n }\n const codeText = nextParagraphs.map((p) => p.innerHTML).join('\\n\\n');\n pre.innerHTML = `<code tabindex=\"0\">${codeText}</code>`;\n block.replaceWith(pre);\n for (const p of nextParagraphs) {\n p.remove();\n }\n }\n }\n }\n\n // INLINE CODE\n // ===========\n // Convert `code` to <code>code</code>\n if (enhancedContent.includes('`')) {\n textNodes = extractTextNodes(dom);\n for (const node of textNodes) {\n let html = escapeHTML(node.nodeValue);\n if (INLINE_CODE_REGEX.test(html)) {\n html = html.replaceAll(CODE_INLINE_CAPTURE_REGEX, '<code>$1</code>');\n }\n fauxDiv.innerHTML = html;\n // const nodes = [...fauxDiv.childNodes];\n node.replaceWith(...fauxDiv.childNodes);\n }\n }\n\n // TWITTER USERNAMES\n // =================\n // Convert @username@twitter.com to <a href=\"https://twitter.com/username\">@username@twitter.com</a>\n if (TWITTER_DOMAIN_REGEX.test(enhancedContent)) {\n textNodes = extractTextNodes(dom, {\n rejectFilter: ['A'],\n });\n for (const node of textNodes) {\n let html = escapeHTML(node.nodeValue);\n if (TWITTER_MENTION_REGEX.test(html)) {\n html = html.replaceAll(\n TWITTER_MENTION_CAPTURE_REGEX,\n '<a href=\"https://twitter.com/$2\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">$1</a>',\n );\n }\n fauxDiv.innerHTML = html;\n // const nodes = [...fauxDiv.childNodes];\n node.replaceWith(...fauxDiv.childNodes);\n }\n }\n\n // HASHTAG STUFFING\n // ================\n // Get the <p> that contains a lot of hashtags, add a class to it\n if (enhancedContent.includes('#')) {\n let prevIndex = null;\n const hashtagStuffedParagraphs = [...dom.querySelectorAll('p')].filter(\n (p, index) => {\n let hashtagCount = 0;\n for (let i = 0; i < p.childNodes.length; i++) {\n const node = p.childNodes[i];\n\n if (node.nodeType === Node.TEXT_NODE) {\n const text = node.textContent.trim();\n if (text !== '') {\n return false;\n }\n } else if (node.tagName === 'BR') {\n // Ignore <br />\n } else if (node.tagName === 'A') {\n const linkText = node.textContent.trim();\n if (!linkText || !linkText.startsWith('#')) {\n return false;\n } else {\n hashtagCount++;\n }\n } else {\n return false;\n }\n }\n // Only consider \"stuffing\" if:\n // - there are more than 3 hashtags\n // - there are more than 1 hashtag in adjacent paragraphs\n if (hashtagCount > 3) {\n prevIndex = index;\n return true;\n }\n if (hashtagCount > 1 && prevIndex && index === prevIndex + 1) {\n prevIndex = index;\n return true;\n }\n },\n );\n if (hashtagStuffedParagraphs?.length) {\n for (const p of hashtagStuffedParagraphs) {\n p.classList.add('hashtag-stuffing');\n p.title = p.innerText;\n }\n }\n }\n\n // ADD ASPECT RATIO TO ALL IMAGES\n if (enhancedContent.includes('<img')) {\n const imgs = dom.querySelectorAll('img');\n for (let i = 0; i < imgs.length; i++) {\n const img = imgs[i];\n const width = img.getAttribute('width') || img.naturalWidth;\n const height = img.getAttribute('height') || img.naturalHeight;\n if (width && height) {\n img.style.setProperty('--original-aspect-ratio', `${width}/${height}`);\n }\n }\n }\n\n // FIX CLOAK MODE FOR SAFARI\n // Workaround for Safari so that `text-decoration-thickness` works\n // Wrap child text nodes in spans\n for (const node of dom.childNodes) {\n if (node.nodeType === Node.TEXT_NODE) {\n const span = document.createElement('span');\n span.textContent = node.textContent;\n dom.replaceChild(span, node);\n }\n }\n\n if (postEnhanceDOM) {\n queueMicrotask(() => postEnhanceDOM(dom));\n // postEnhanceDOM(dom); // mutate dom\n }\n\n return returnDOM ? dom : dom.innerHTML;\n}\nconst enhanceContent = mem(_enhanceContent);\n\nconst defaultRejectFilter = [\n // Document metadata\n 'STYLE',\n // Image and multimedia\n 'IMG',\n 'VIDEO',\n 'AUDIO',\n 'AREA',\n 'MAP',\n 'TRACK',\n // Embedded content\n 'EMBED',\n 'IFRAME',\n 'OBJECT',\n 'PICTURE',\n 'PORTAL',\n 'SOURCE',\n // SVG and MathML\n 'SVG',\n 'MATH',\n // Scripting\n 'CANVAS',\n 'NOSCRIPT',\n 'SCRIPT',\n // Forms\n 'INPUT',\n 'OPTION',\n 'TEXTAREA',\n // Web Components\n 'SLOT',\n 'TEMPLATE',\n];\nconst defaultRejectFilterMap = Object.fromEntries(\n defaultRejectFilter.map((nodeName) => [nodeName, true]),\n);\n\nconst URL_PREFIX_REGEX = /^(https?:\\/\\/(www\\.)?|xmpp:)/;\nconst URL_DISPLAY_LENGTH = 30;\n// Similar to https://github.com/mastodon/mastodon/blob/1666b1955992e16f4605b414c6563ca25b3a3f18/app/lib/text_formatter.rb#L54-L69\nfunction shortenLink(link) {\n if (!link || link.querySelector?.('*')) {\n return;\n }\n try {\n const url = link.innerText.trim();\n const prefix = (url.match(URL_PREFIX_REGEX) || [])[0] || '';\n if (!prefix) return;\n const displayURL = url.slice(\n prefix.length,\n prefix.length + URL_DISPLAY_LENGTH,\n );\n const suffix = url.slice(prefix.length + URL_DISPLAY_LENGTH);\n const cutoff = url.slice(prefix.length).length > URL_DISPLAY_LENGTH;\n link.innerHTML = `<span class=\"invisible\">${prefix}</span><span class=${\n cutoff ? 'ellipsis' : ''\n }>${displayURL}</span><span class=\"invisible\">${suffix}</span>`;\n } catch (e) {}\n}\n\nfunction extractTextNodes(dom, opts = {}) {\n const textNodes = [];\n const rejectFilterMap = Object.assign(\n {},\n defaultRejectFilterMap,\n opts.rejectFilter?.reduce((acc, cur) => {\n acc[cur] = true;\n return acc;\n }, {}),\n );\n const walk = document.createTreeWalker(\n dom,\n NodeFilter.SHOW_TEXT,\n {\n acceptNode(node) {\n if (rejectFilterMap[node.parentNode.nodeName]) {\n return NodeFilter.FILTER_REJECT;\n }\n return NodeFilter.FILTER_ACCEPT;\n },\n },\n false,\n );\n let node;\n while ((node = walk.nextNode())) {\n textNodes.push(node);\n }\n return textNodes;\n}\n\nexport default enhanceContent;\n","import mem from './mem';\n\nconst div = document.createElement('div');\nfunction getHTMLText(html, opts) {\n if (!html) return '';\n const { preProcess } = opts || {};\n\n div.innerHTML = html\n .replace(/<\\/p>/g, '</p>\\n\\n')\n .replace(/<\\/li>/g, '</li>\\n');\n div.querySelectorAll('br').forEach((br) => {\n br.replaceWith('\\n');\n });\n\n preProcess?.(div);\n\n // MASTODON-SPECIFIC classes\n // Remove .invisible\n div.querySelectorAll('.invisible').forEach((el) => {\n el.remove();\n });\n // Add … at end of .ellipsis\n div.querySelectorAll('.ellipsis').forEach((el) => {\n el.append('...');\n });\n\n return div.innerText.replace(/[\\r\\n]{3,}/g, '\\n\\n').trim();\n}\n\nexport default mem(getHTMLText);\n","import states from './states';\n\nfunction handleContentLinks(opts) {\n const { mentions = [], instance, previewMode, statusURL } = opts || {};\n return (e) => {\n let { target } = e;\n target = target.closest('a');\n if (!target) return;\n\n // If cmd/ctrl/shift/alt key is pressed or middle-click, let the browser handle it\n if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey || e.which === 2) {\n return;\n }\n\n const prevText = target.previousSibling?.textContent;\n const textBeforeLinkIsAt = prevText?.endsWith('@');\n const textStartsWithAt = target.innerText.startsWith('@');\n if (\n ((target.classList.contains('u-url') ||\n target.classList.contains('mention')) &&\n textStartsWithAt) ||\n (textBeforeLinkIsAt && !textStartsWithAt)\n ) {\n const targetText = (\n target.querySelector('span') || target\n ).innerText.trim();\n const username = targetText.replace(/^@/, '');\n const url = target.getAttribute('href');\n // Only fallback to acct/username check if url doesn't match\n const mention =\n mentions.find((mention) => mention.url === url) ||\n mentions.find(\n (mention) =>\n mention.acct === username || mention.username === username,\n );\n console.warn('MENTION', mention, url);\n if (mention) {\n e.preventDefault();\n e.stopPropagation();\n states.showAccount = {\n account: mention.acct,\n instance,\n };\n } else if (!/^http/i.test(targetText)) {\n console.log('mention not found', targetText);\n e.preventDefault();\n e.stopPropagation();\n const href = target.getAttribute('href');\n states.showAccount = {\n account: href,\n instance,\n };\n }\n } else if (!previewMode) {\n const textBeforeLinkIsHash = prevText?.endsWith('#');\n if (target.classList.contains('hashtag') || textBeforeLinkIsHash) {\n e.preventDefault();\n e.stopPropagation();\n const tag = target.innerText.replace(/^#/, '').trim();\n const hashURL = instance ? `#/${instance}/t/${tag}` : `#/t/${tag}`;\n console.log({ hashURL });\n location.hash = hashURL;\n } else if (\n states.unfurledLinks[target.href]?.url &&\n statusURL !== target.href\n ) {\n // If unfurled AND not self-referential\n e.preventDefault();\n e.stopPropagation();\n states.prevLocation = {\n pathname: location.hash.replace(/^#/, ''),\n };\n location.hash = `#${states.unfurledLinks[target.href].url}`;\n }\n }\n };\n}\n\nexport default handleContentLinks;\n","import { i18n } from '@lingui/core';\n\nexport default function i18nDuration(duration, unit) {\n return () =>\n i18n.number(duration, {\n style: 'unit',\n unit,\n unitDisplay: 'long',\n });\n}\n","import { i18n } from '@lingui/core';\n\nimport localeMatch from './locale-match';\nimport mem from './mem';\n\nconst defaultLocale = mem(\n () => new Intl.DateTimeFormat().resolvedOptions().locale,\n);\n\nconst _DateTimeFormat = (opts) => {\n const { locale, dateYear, hideTime, formatOpts, forceOpts } = opts || {};\n const regionlessLocale = locale.replace(/-[a-z]+$/i, '');\n const loc = localeMatch([regionlessLocale], [defaultLocale], locale);\n const currentYear = new Date().getFullYear();\n const options = forceOpts || {\n // Show year if not current year\n year: dateYear === currentYear ? undefined : 'numeric',\n month: 'short',\n day: 'numeric',\n // Hide time if requested\n hour: hideTime ? undefined : 'numeric',\n minute: hideTime ? undefined : 'numeric',\n ...formatOpts,\n };\n try {\n return Intl.DateTimeFormat(loc, options);\n } catch (e) {}\n try {\n return Intl.DateTimeFormat(locale, options);\n } catch (e) {}\n return Intl.DateTimeFormat(undefined, options);\n};\nconst DateTimeFormat = mem(_DateTimeFormat);\n\nfunction niceDateTime(date, dtfOpts) {\n if (!(date instanceof Date)) {\n date = new Date(date);\n }\n const DTF = DateTimeFormat({\n dateYear: date.getFullYear(),\n locale: i18n.locale,\n ...dtfOpts,\n });\n const dateText = DTF.format(date);\n return dateText;\n}\n\nexport default niceDateTime;\n","import { i18n } from '@lingui/core';\n\nexport default function shortenNumber(num) {\n try {\n return i18n.number(num, {\n notation: 'compact',\n roundingMode: 'floor',\n });\n } catch (e) {\n return num;\n }\n}\n","import { t, Trans } from '@lingui/macro';\n\nimport openOSK from './open-osk';\nimport showToast from './show-toast';\nimport states from './states';\n\nconst TOAST_DURATION = 5_000; // 5 seconds\n\nexport default function showCompose(opts) {\n if (!opts) opts = true;\n\n if (states.showCompose) {\n if (states.composerState.minimized) {\n showToast({\n duration: TOAST_DURATION,\n text: t`A draft post is currently minimized. Post or discard it before creating a new one.`,\n });\n } else {\n showToast({\n duration: TOAST_DURATION,\n text: t`A post is currently open. Post or discard it before creating a new one.`,\n });\n }\n return;\n }\n\n openOSK();\n states.showCompose = opts;\n}\n","import './account-block.css';\n\nimport { Plural, t, Trans } from '@lingui/macro';\n\n// import { useNavigate } from 'react-router-dom';\nimport enhanceContent from '../utils/enhance-content';\nimport niceDateTime from '../utils/nice-date-time';\nimport shortenNumber from '../utils/shorten-number';\nimport states from '../utils/states';\n\nimport Avatar from './avatar';\nimport EmojiText from './emoji-text';\nimport Icon from './icon';\n\nfunction AccountBlock({\n skeleton,\n account,\n avatarSize = 'xl',\n useAvatarStatic = false,\n instance,\n external,\n internal,\n onClick,\n showActivity = false,\n showStats = false,\n accountInstance,\n hideDisplayName = false,\n relationship = {},\n excludeRelationshipAttrs = [],\n}) {\n if (skeleton) {\n return (\n <div class=\"account-block skeleton\">\n <Avatar size={avatarSize} />\n <span>\n <b>████████</b>\n <br />\n <span class=\"account-block-acct\">██████</span>\n </span>\n </div>\n );\n }\n\n if (!account) {\n return null;\n }\n\n // const navigate = useNavigate();\n\n const {\n id,\n acct,\n avatar,\n avatarStatic,\n displayName,\n username,\n emojis,\n url,\n statusesCount,\n lastStatusAt,\n bot,\n fields,\n note,\n group,\n followersCount,\n createdAt,\n locked,\n } = account;\n let [_, acct1, acct2] = acct.match(/([^@]+)(@.+)/i) || [, acct];\n if (accountInstance) {\n acct2 = `@${accountInstance}`;\n }\n\n const verifiedField = fields?.find((f) => !!f.verifiedAt && !!f.value);\n\n const excludedRelationship = {};\n for (const r in relationship) {\n if (!excludeRelationshipAttrs.includes(r)) {\n excludedRelationship[r] = relationship[r];\n }\n }\n const hasRelationship =\n excludedRelationship.following ||\n excludedRelationship.followedBy ||\n excludedRelationship.requested;\n\n return (\n <a\n class=\"account-block\"\n href={url}\n target={external ? '_blank' : null}\n title={acct2 ? acct : `@${acct}`}\n onClick={(e) => {\n if (external) return;\n e.preventDefault();\n if (onClick) return onClick(e);\n if (internal) {\n // navigate(`/${instance}/a/${id}`);\n location.hash = `/${instance}/a/${id}`;\n } else {\n states.showAccount = {\n account,\n instance,\n };\n }\n }}\n >\n <div class=\"avatar-container\">\n <Avatar\n url={useAvatarStatic ? avatarStatic : avatar || avatarStatic}\n size={avatarSize}\n squircle={bot}\n />\n </div>\n <span class=\"account-block-content\">\n {!hideDisplayName && (\n <>\n {displayName ? (\n <b>\n <EmojiText text={displayName} emojis={emojis} />\n </b>\n ) : (\n <b>{username}</b>\n )}\n </>\n )}{' '}\n <span class=\"account-block-acct bidi-isolate\">\n {acct2 ? '' : '@'}\n {acct1}\n <wbr />\n {acct2}\n {locked && (\n <>\n {' '}\n <Icon icon=\"lock\" size=\"s\" alt={t`Locked`} />\n </>\n )}\n </span>\n {showActivity && (\n <div class=\"account-block-stats\">\n <Trans>Posts: {shortenNumber(statusesCount)}</Trans>\n {!!lastStatusAt && (\n <>\n {' '}\n &middot;{' '}\n <Trans>\n Last posted:{' '}\n {niceDateTime(lastStatusAt, {\n hideTime: true,\n })}\n </Trans>\n </>\n )}\n </div>\n )}\n {showStats && (\n <div class=\"account-block-stats\">\n {bot && (\n <>\n <span class=\"tag collapsed\">\n <Icon icon=\"bot\" /> <Trans>Automated</Trans>\n </span>\n </>\n )}\n {!!group && (\n <>\n <span class=\"tag collapsed\">\n <Icon icon=\"group\" /> <Trans>Group</Trans>\n </span>\n </>\n )}\n {hasRelationship && (\n <div key={relationship.id} class=\"shazam-container-horizontal\">\n <div class=\"shazam-container-inner\">\n {excludedRelationship.following &&\n excludedRelationship.followedBy ? (\n <span class=\"tag minimal\">\n <Trans>Mutual</Trans>\n </span>\n ) : excludedRelationship.requested ? (\n <span class=\"tag minimal\">\n <Trans>Requested</Trans>\n </span>\n ) : excludedRelationship.following ? (\n <span class=\"tag minimal\">\n <Trans>Following</Trans>\n </span>\n ) : excludedRelationship.followedBy ? (\n <span class=\"tag minimal\">\n <Trans>Follows you</Trans>\n </span>\n ) : null}\n </div>\n </div>\n )}\n {!!followersCount && (\n <span class=\"ib\">\n <Plural\n value={followersCount}\n one=\"# follower\"\n other=\"# followers\"\n />\n </span>\n )}\n {!!verifiedField && (\n <span class=\"verified-field\">\n <Icon icon=\"check-circle\" size=\"s\" alt={t`Verified`} />{' '}\n <span\n dangerouslySetInnerHTML={{\n __html: enhanceContent(verifiedField.value, { emojis }),\n }}\n />\n </span>\n )}\n {!bot &&\n !group &&\n !hasRelationship &&\n !followersCount &&\n !verifiedField &&\n !!createdAt && (\n <span class=\"created-at\">\n <Trans>\n Joined{' '}\n <time datetime={createdAt}>\n {niceDateTime(createdAt, {\n hideTime: true,\n })}\n </time>\n </Trans>\n </span>\n )}\n </div>\n )}\n </span>\n </a>\n );\n}\n\nexport default AccountBlock;\n","function RetryOperation(timeouts, options) {\n // Compatibility for the old (timeouts, retryForever) signature\n if (typeof options === 'boolean') {\n options = { forever: options };\n }\n\n this._originalTimeouts = JSON.parse(JSON.stringify(timeouts));\n this._timeouts = timeouts;\n this._options = options || {};\n this._maxRetryTime = options && options.maxRetryTime || Infinity;\n this._fn = null;\n this._errors = [];\n this._attempts = 1;\n this._operationTimeout = null;\n this._operationTimeoutCb = null;\n this._timeout = null;\n this._operationStart = null;\n this._timer = null;\n\n if (this._options.forever) {\n this._cachedTimeouts = this._timeouts.slice(0);\n }\n}\nmodule.exports = RetryOperation;\n\nRetryOperation.prototype.reset = function() {\n this._attempts = 1;\n this._timeouts = this._originalTimeouts.slice(0);\n}\n\nRetryOperation.prototype.stop = function() {\n if (this._timeout) {\n clearTimeout(this._timeout);\n }\n if (this._timer) {\n clearTimeout(this._timer);\n }\n\n this._timeouts = [];\n this._cachedTimeouts = null;\n};\n\nRetryOperation.prototype.retry = function(err) {\n if (this._timeout) {\n clearTimeout(this._timeout);\n }\n\n if (!err) {\n return false;\n }\n var currentTime = new Date().getTime();\n if (err && currentTime - this._operationStart >= this._maxRetryTime) {\n this._errors.push(err);\n this._errors.unshift(new Error('RetryOperation timeout occurred'));\n return false;\n }\n\n this._errors.push(err);\n\n var timeout = this._timeouts.shift();\n if (timeout === undefined) {\n if (this._cachedTimeouts) {\n // retry forever, only keep last error\n this._errors.splice(0, this._errors.length - 1);\n timeout = this._cachedTimeouts.slice(-1);\n } else {\n return false;\n }\n }\n\n var self = this;\n this._timer = setTimeout(function() {\n self._attempts++;\n\n if (self._operationTimeoutCb) {\n self._timeout = setTimeout(function() {\n self._operationTimeoutCb(self._attempts);\n }, self._operationTimeout);\n\n if (self._options.unref) {\n self._timeout.unref();\n }\n }\n\n self._fn(self._attempts);\n }, timeout);\n\n if (this._options.unref) {\n this._timer.unref();\n }\n\n return true;\n};\n\nRetryOperation.prototype.attempt = function(fn, timeoutOps) {\n this._fn = fn;\n\n if (timeoutOps) {\n if (timeoutOps.timeout) {\n this._operationTimeout = timeoutOps.timeout;\n }\n if (timeoutOps.cb) {\n this._operationTimeoutCb = timeoutOps.cb;\n }\n }\n\n var self = this;\n if (this._operationTimeoutCb) {\n this._timeout = setTimeout(function() {\n self._operationTimeoutCb();\n }, self._operationTimeout);\n }\n\n this._operationStart = new Date().getTime();\n\n this._fn(this._attempts);\n};\n\nRetryOperation.prototype.try = function(fn) {\n console.log('Using RetryOperation.try() is deprecated');\n this.attempt(fn);\n};\n\nRetryOperation.prototype.start = function(fn) {\n console.log('Using RetryOperation.start() is deprecated');\n this.attempt(fn);\n};\n\nRetryOperation.prototype.start = RetryOperation.prototype.try;\n\nRetryOperation.prototype.errors = function() {\n return this._errors;\n};\n\nRetryOperation.prototype.attempts = function() {\n return this._attempts;\n};\n\nRetryOperation.prototype.mainError = function() {\n if (this._errors.length === 0) {\n return null;\n }\n\n var counts = {};\n var mainError = null;\n var mainErrorCount = 0;\n\n for (var i = 0; i < this._errors.length; i++) {\n var error = this._errors[i];\n var message = error.message;\n var count = (counts[message] || 0) + 1;\n\n counts[message] = count;\n\n if (count >= mainErrorCount) {\n mainError = error;\n mainErrorCount = count;\n }\n }\n\n return mainError;\n};\n","var RetryOperation = require('./retry_operation');\n\nexports.operation = function(options) {\n var timeouts = exports.timeouts(options);\n return new RetryOperation(timeouts, {\n forever: options && (options.forever || options.retries === Infinity),\n unref: options && options.unref,\n maxRetryTime: options && options.maxRetryTime\n });\n};\n\nexports.timeouts = function(options) {\n if (options instanceof Array) {\n return [].concat(options);\n }\n\n var opts = {\n retries: 10,\n factor: 2,\n minTimeout: 1 * 1000,\n maxTimeout: Infinity,\n randomize: false\n };\n for (var key in options) {\n opts[key] = options[key];\n }\n\n if (opts.minTimeout > opts.maxTimeout) {\n throw new Error('minTimeout is greater than maxTimeout');\n }\n\n var timeouts = [];\n for (var i = 0; i < opts.retries; i++) {\n timeouts.push(this.createTimeout(i, opts));\n }\n\n if (options && options.forever && !timeouts.length) {\n timeouts.push(this.createTimeout(i, opts));\n }\n\n // sort the array numerically ascending\n timeouts.sort(function(a,b) {\n return a - b;\n });\n\n return timeouts;\n};\n\nexports.createTimeout = function(attempt, opts) {\n var random = (opts.randomize)\n ? (Math.random() + 1)\n : 1;\n\n var timeout = Math.round(random * Math.max(opts.minTimeout, 1) * Math.pow(opts.factor, attempt));\n timeout = Math.min(timeout, opts.maxTimeout);\n\n return timeout;\n};\n\nexports.wrap = function(obj, options, methods) {\n if (options instanceof Array) {\n methods = options;\n options = null;\n }\n\n if (!methods) {\n methods = [];\n for (var key in obj) {\n if (typeof obj[key] === 'function') {\n methods.push(key);\n }\n }\n }\n\n for (var i = 0; i < methods.length; i++) {\n var method = methods[i];\n var original = obj[method];\n\n obj[method] = function retryWrapper(original) {\n var op = exports.operation(options);\n var args = Array.prototype.slice.call(arguments, 1);\n var callback = args.pop();\n\n args.push(function(err) {\n if (op.retry(err)) {\n return;\n }\n if (err) {\n arguments[0] = op.mainError();\n }\n callback.apply(this, arguments);\n });\n\n op.attempt(function() {\n original.apply(obj, args);\n });\n }.bind(obj, original);\n obj[method].options = options;\n }\n};\n","module.exports = require('./lib/retry');","const objectToString = Object.prototype.toString;\n\nconst isError = value => objectToString.call(value) === '[object Error]';\n\nconst errorMessages = new Set([\n\t'Failed to fetch', // Chrome\n\t'NetworkError when attempting to fetch resource.', // Firefox\n\t'The Internet connection appears to be offline.', // Safari 16\n\t'Load failed', // Safari 17+\n\t'Network request failed', // `cross-fetch`\n\t'fetch failed', // Undici (Node.js)\n]);\n\nexport default function isNetworkError(error) {\n\tconst isValid = error\n\t\t&& isError(error)\n\t\t&& error.name === 'TypeError'\n\t\t&& typeof error.message === 'string';\n\n\tif (!isValid) {\n\t\treturn false;\n\t}\n\n\t// We do an extra check for Safari 17+ as it has a very generic error message.\n\t// Network errors in Safari have no stack.\n\tif (error.message === 'Load failed') {\n\t\treturn error.stack === undefined;\n\t}\n\n\treturn errorMessages.has(error.message);\n}\n","import retry from 'retry';\nimport isNetworkError from 'is-network-error';\n\nexport class AbortError extends Error {\n\tconstructor(message) {\n\t\tsuper();\n\n\t\tif (message instanceof Error) {\n\t\t\tthis.originalError = message;\n\t\t\t({message} = message);\n\t\t} else {\n\t\t\tthis.originalError = new Error(message);\n\t\t\tthis.originalError.stack = this.stack;\n\t\t}\n\n\t\tthis.name = 'AbortError';\n\t\tthis.message = message;\n\t}\n}\n\nconst decorateErrorWithCounts = (error, attemptNumber, options) => {\n\t// Minus 1 from attemptNumber because the first attempt does not count as a retry\n\tconst retriesLeft = options.retries - (attemptNumber - 1);\n\n\terror.attemptNumber = attemptNumber;\n\terror.retriesLeft = retriesLeft;\n\treturn error;\n};\n\nexport default async function pRetry(input, options) {\n\treturn new Promise((resolve, reject) => {\n\t\toptions = {\n\t\t\tonFailedAttempt() {},\n\t\t\tretries: 10,\n\t\t\tshouldRetry: () => true,\n\t\t\t...options,\n\t\t};\n\n\t\tconst operation = retry.operation(options);\n\n\t\tconst abortHandler = () => {\n\t\t\toperation.stop();\n\t\t\treject(options.signal?.reason);\n\t\t};\n\n\t\tif (options.signal && !options.signal.aborted) {\n\t\t\toptions.signal.addEventListener('abort', abortHandler, {once: true});\n\t\t}\n\n\t\tconst cleanUp = () => {\n\t\t\toptions.signal?.removeEventListener('abort', abortHandler);\n\t\t\toperation.stop();\n\t\t};\n\n\t\toperation.attempt(async attemptNumber => {\n\t\t\ttry {\n\t\t\t\tconst result = await input(attemptNumber);\n\t\t\t\tcleanUp();\n\t\t\t\tresolve(result);\n\t\t\t} catch (error) {\n\t\t\t\ttry {\n\t\t\t\t\tif (!(error instanceof Error)) {\n\t\t\t\t\t\tthrow new TypeError(`Non-error was thrown: \"${error}\". You should only throw errors.`);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (error instanceof AbortError) {\n\t\t\t\t\t\tthrow error.originalError;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (error instanceof TypeError && !isNetworkError(error)) {\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\n\t\t\t\t\tdecorateErrorWithCounts(error, attemptNumber, options);\n\n\t\t\t\t\tif (!(await options.shouldRetry(error))) {\n\t\t\t\t\t\toperation.stop();\n\t\t\t\t\t\treject(error);\n\t\t\t\t\t}\n\n\t\t\t\t\tawait options.onFailedAttempt(error);\n\n\t\t\t\t\tif (!operation.retry(error)) {\n\t\t\t\t\t\tthrow operation.mainError();\n\t\t\t\t\t}\n\t\t\t\t} catch (finalError) {\n\t\t\t\t\tdecorateErrorWithCounts(finalError, attemptNumber, options);\n\t\t\t\t\tcleanUp();\n\t\t\t\t\treject(finalError);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n","\"use client\";\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n\n// src/InView.tsx\nimport * as React from \"react\";\n\n// src/observe.ts\nvar observerMap = /* @__PURE__ */ new Map();\nvar RootIds = /* @__PURE__ */ new WeakMap();\nvar rootId = 0;\nvar unsupportedValue = void 0;\nfunction defaultFallbackInView(inView) {\n unsupportedValue = inView;\n}\nfunction getRootId(root) {\n if (!root) return \"0\";\n if (RootIds.has(root)) return RootIds.get(root);\n rootId += 1;\n RootIds.set(root, rootId.toString());\n return RootIds.get(root);\n}\nfunction optionsToId(options) {\n return Object.keys(options).sort().filter(\n (key) => options[key] !== void 0\n ).map((key) => {\n return `${key}_${key === \"root\" ? getRootId(options.root) : options[key]}`;\n }).toString();\n}\nfunction createObserver(options) {\n const id = optionsToId(options);\n let instance = observerMap.get(id);\n if (!instance) {\n const elements = /* @__PURE__ */ new Map();\n let thresholds;\n const observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n var _a;\n const inView = entry.isIntersecting && thresholds.some((threshold) => entry.intersectionRatio >= threshold);\n if (options.trackVisibility && typeof entry.isVisible === \"undefined\") {\n entry.isVisible = inView;\n }\n (_a = elements.get(entry.target)) == null ? void 0 : _a.forEach((callback) => {\n callback(inView, entry);\n });\n });\n }, options);\n thresholds = observer.thresholds || (Array.isArray(options.threshold) ? options.threshold : [options.threshold || 0]);\n instance = {\n id,\n observer,\n elements\n };\n observerMap.set(id, instance);\n }\n return instance;\n}\nfunction observe(element, callback, options = {}, fallbackInView = unsupportedValue) {\n if (typeof window.IntersectionObserver === \"undefined\" && fallbackInView !== void 0) {\n const bounds = element.getBoundingClientRect();\n callback(fallbackInView, {\n isIntersecting: fallbackInView,\n target: element,\n intersectionRatio: typeof options.threshold === \"number\" ? options.threshold : 0,\n time: 0,\n boundingClientRect: bounds,\n intersectionRect: bounds,\n rootBounds: bounds\n });\n return () => {\n };\n }\n const { id, observer, elements } = createObserver(options);\n const callbacks = elements.get(element) || [];\n if (!elements.has(element)) {\n elements.set(element, callbacks);\n }\n callbacks.push(callback);\n observer.observe(element);\n return function unobserve() {\n callbacks.splice(callbacks.indexOf(callback), 1);\n if (callbacks.length === 0) {\n elements.delete(element);\n observer.unobserve(element);\n }\n if (elements.size === 0) {\n observer.disconnect();\n observerMap.delete(id);\n }\n };\n}\n\n// src/InView.tsx\nfunction isPlainChildren(props) {\n return typeof props.children !== \"function\";\n}\nvar InView = class extends React.Component {\n constructor(props) {\n super(props);\n __publicField(this, \"node\", null);\n __publicField(this, \"_unobserveCb\", null);\n __publicField(this, \"handleNode\", (node) => {\n if (this.node) {\n this.unobserve();\n if (!node && !this.props.triggerOnce && !this.props.skip) {\n this.setState({ inView: !!this.props.initialInView, entry: void 0 });\n }\n }\n this.node = node ? node : null;\n this.observeNode();\n });\n __publicField(this, \"handleChange\", (inView, entry) => {\n if (inView && this.props.triggerOnce) {\n this.unobserve();\n }\n if (!isPlainChildren(this.props)) {\n this.setState({ inView, entry });\n }\n if (this.props.onChange) {\n this.props.onChange(inView, entry);\n }\n });\n this.state = {\n inView: !!props.initialInView,\n entry: void 0\n };\n }\n componentDidMount() {\n this.unobserve();\n this.observeNode();\n }\n componentDidUpdate(prevProps) {\n if (prevProps.rootMargin !== this.props.rootMargin || prevProps.root !== this.props.root || prevProps.threshold !== this.props.threshold || prevProps.skip !== this.props.skip || prevProps.trackVisibility !== this.props.trackVisibility || prevProps.delay !== this.props.delay) {\n this.unobserve();\n this.observeNode();\n }\n }\n componentWillUnmount() {\n this.unobserve();\n }\n observeNode() {\n if (!this.node || this.props.skip) return;\n const {\n threshold,\n root,\n rootMargin,\n trackVisibility,\n delay,\n fallbackInView\n } = this.props;\n this._unobserveCb = observe(\n this.node,\n this.handleChange,\n {\n threshold,\n root,\n rootMargin,\n // @ts-ignore\n trackVisibility,\n // @ts-ignore\n delay\n },\n fallbackInView\n );\n }\n unobserve() {\n if (this._unobserveCb) {\n this._unobserveCb();\n this._unobserveCb = null;\n }\n }\n render() {\n const { children } = this.props;\n if (typeof children === \"function\") {\n const { inView, entry } = this.state;\n return children({ inView, entry, ref: this.handleNode });\n }\n const {\n as,\n triggerOnce,\n threshold,\n root,\n rootMargin,\n onChange,\n skip,\n trackVisibility,\n delay,\n initialInView,\n fallbackInView,\n ...props\n } = this.props;\n return React.createElement(\n as || \"div\",\n { ref: this.handleNode, ...props },\n children\n );\n }\n};\n\n// src/useInView.tsx\nimport * as React2 from \"react\";\nfunction useInView({\n threshold,\n delay,\n trackVisibility,\n rootMargin,\n root,\n triggerOnce,\n skip,\n initialInView,\n fallbackInView,\n onChange\n} = {}) {\n var _a;\n const [ref, setRef] = React2.useState(null);\n const callback = React2.useRef();\n const [state, setState] = React2.useState({\n inView: !!initialInView,\n entry: void 0\n });\n callback.current = onChange;\n React2.useEffect(\n () => {\n if (skip || !ref) return;\n let unobserve;\n unobserve = observe(\n ref,\n (inView, entry) => {\n setState({\n inView,\n entry\n });\n if (callback.current) callback.current(inView, entry);\n if (entry.isIntersecting && triggerOnce && unobserve) {\n unobserve();\n unobserve = void 0;\n }\n },\n {\n root,\n rootMargin,\n threshold,\n // @ts-ignore\n trackVisibility,\n // @ts-ignore\n delay\n },\n fallbackInView\n );\n return () => {\n if (unobserve) {\n unobserve();\n }\n };\n },\n // We break the rule here, because we aren't including the actual `threshold` variable\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n // If the threshold is an array, convert it to a string, so it won't change between renders.\n Array.isArray(threshold) ? threshold.toString() : threshold,\n ref,\n root,\n rootMargin,\n triggerOnce,\n skip,\n trackVisibility,\n fallbackInView,\n delay\n ]\n );\n const entryTarget = (_a = state.entry) == null ? void 0 : _a.target;\n const previousEntryTarget = React2.useRef();\n if (!ref && entryTarget && !triggerOnce && !skip && previousEntryTarget.current !== entryTarget) {\n previousEntryTarget.current = entryTarget;\n setState({\n inView: !!initialInView,\n entry: void 0\n });\n }\n const result = [setRef, state.inView, state.entry];\n result.ref = result[0];\n result.inView = result[1];\n result.entry = result[2];\n return result;\n}\nexport {\n InView,\n defaultFallbackInView,\n observe,\n useInView\n};\n//# sourceMappingURL=index.mjs.map","/*\n Rendered but hidden. Only show when visible\n*/\nimport { useEffect, useRef, useState } from 'preact/hooks';\nimport { useInView } from 'react-intersection-observer';\n\n// The sticky header, usually at the top\nconst TOP = 48;\n\nconst shazamIDs = {};\n\nexport default function LazyShazam({ id, children }) {\n const containerRef = useRef();\n const hasID = !!shazamIDs[id];\n const [visible, setVisible] = useState(false);\n const [visibleStart, setVisibleStart] = useState(hasID || false);\n\n const { ref } = useInView({\n root: null,\n rootMargin: `-${TOP}px 0px 0px 0px`,\n trackVisibility: true,\n delay: 1000,\n onChange: (inView) => {\n if (inView) {\n setVisible(true);\n if (id) shazamIDs[id] = true;\n }\n },\n triggerOnce: true,\n skip: visibleStart || visible,\n });\n\n useEffect(() => {\n if (!containerRef.current) return;\n const rect = containerRef.current.getBoundingClientRect();\n if (rect.bottom > TOP) {\n if (rect.top < window.innerHeight) {\n setVisible(true);\n } else {\n setVisibleStart(true);\n }\n if (id) shazamIDs[id] = true;\n }\n }, []);\n\n if (visibleStart) return children;\n\n return (\n <div\n ref={containerRef}\n class=\"shazam-container no-animation\"\n hidden={!visible}\n >\n <div ref={ref} class=\"shazam-container-inner\">\n {children}\n </div>\n </div>\n );\n}\n","import './translation-block.css';\n\nimport { t, Trans } from '@lingui/macro';\nimport pRetry from 'p-retry';\nimport pThrottle from 'p-throttle';\nimport { useEffect, useRef, useState } from 'preact/hooks';\n\nimport sourceLanguages from '../data/lingva-source-languages';\nimport getTranslateTargetLanguage from '../utils/get-translate-target-language';\nimport localeCode2Text from '../utils/localeCode2Text';\nimport pmem from '../utils/pmem';\n\nimport Icon from './icon';\nimport LazyShazam from './lazy-shazam';\nimport Loader from './loader';\n\nconst { PHANPY_LINGVA_INSTANCES } = import.meta.env;\nconst LINGVA_INSTANCES = PHANPY_LINGVA_INSTANCES\n ? PHANPY_LINGVA_INSTANCES.split(/\\s+/)\n : [];\n\nconst throttle = pThrottle({\n limit: 1,\n interval: 2000,\n});\n\nlet currentLingvaInstance = 0;\n\nfunction _lingvaTranslate(text, source, target) {\n console.log('TRANSLATE', text, source, target);\n const fetchCall = () => {\n let instance = LINGVA_INSTANCES[currentLingvaInstance];\n return fetch(\n `https://${instance}/api/v1/${source}/${target}/${encodeURIComponent(\n text,\n )}`,\n )\n .then((res) => {\n if (!res.ok) throw new Error(res.statusText);\n return res.json();\n })\n .then((res) => {\n return {\n provider: 'lingva',\n content: res.translation,\n detectedSourceLanguage: res.info?.detectedSource,\n info: res.info,\n };\n });\n };\n return pRetry(fetchCall, {\n retries: 3,\n onFailedAttempt: (e) => {\n currentLingvaInstance =\n (currentLingvaInstance + 1) % LINGVA_INSTANCES.length;\n console.log(\n 'Retrying translation with another instance',\n currentLingvaInstance,\n );\n },\n });\n // return masto.v1.statuses.$select(id).translate({\n // lang: DEFAULT_LANG,\n // });\n}\nconst TRANSLATED_MAX_AGE = 1000 * 60 * 60; // 1 hour\nconst lingvaTranslate = pmem(_lingvaTranslate, {\n maxAge: TRANSLATED_MAX_AGE,\n});\nconst throttledLingvaTranslate = pmem(throttle(lingvaTranslate), {\n // I know, this is double-layered memoization\n maxAge: TRANSLATED_MAX_AGE,\n});\n\nfunction TranslationBlock({\n forceTranslate,\n sourceLanguage,\n onTranslate,\n text = '',\n mini,\n autoDetected,\n}) {\n const targetLang = getTranslateTargetLanguage(true);\n const [uiState, setUIState] = useState('default');\n const [pronunciationContent, setPronunciationContent] = useState(null);\n const [translatedContent, setTranslatedContent] = useState(null);\n const [detectedLang, setDetectedLang] = useState(null);\n const detailsRef = useRef();\n\n const sourceLangText = sourceLanguage\n ? localeCode2Text(sourceLanguage)\n : null;\n const targetLangText = localeCode2Text(targetLang);\n const apiSourceLang = useRef('auto');\n\n if (!onTranslate) {\n onTranslate = mini ? throttledLingvaTranslate : lingvaTranslate;\n }\n\n const translate = async () => {\n setUIState('loading');\n try {\n const { content, detectedSourceLanguage, provider, error, ...props } =\n await onTranslate(text, apiSourceLang.current, targetLang);\n if (content) {\n if (detectedSourceLanguage) {\n const detectedLangText = localeCode2Text(detectedSourceLanguage);\n setDetectedLang(detectedLangText);\n }\n if (provider === 'lingva') {\n const pronunciation = props?.info?.pronunciation?.query;\n if (pronunciation) {\n setPronunciationContent(pronunciation);\n }\n }\n setTranslatedContent(content);\n setUIState('default');\n if (!mini && content.trim() !== text.trim()) {\n detailsRef.current.open = true;\n detailsRef.current.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n });\n }\n } else {\n if (error) console.error(error);\n setUIState('error');\n }\n } catch (e) {\n console.error(e);\n setUIState('error');\n }\n };\n\n useEffect(() => {\n if (forceTranslate) {\n translate();\n }\n }, [forceTranslate]);\n\n if (mini) {\n if (\n !!translatedContent &&\n translatedContent.trim() !== text.trim() &&\n detectedLang !== targetLangText\n ) {\n return (\n <LazyShazam>\n <div class=\"status-translation-block-mini\">\n <Icon\n icon=\"translate\"\n alt={t`Auto-translated from ${sourceLangText}`}\n />\n <output\n lang={targetLang}\n dir=\"auto\"\n title={pronunciationContent || ''}\n >\n {translatedContent}\n </output>\n </div>\n </LazyShazam>\n );\n }\n return null;\n }\n\n return (\n <div\n class=\"status-translation-block\"\n onClick={(e) => {\n e.preventDefault();\n }}\n >\n <details ref={detailsRef}>\n <summary>\n <button\n type=\"button\"\n onClick={async (e) => {\n e.preventDefault();\n e.stopPropagation();\n detailsRef.current.open = !detailsRef.current.open;\n if (uiState === 'loading') return;\n if (!translatedContent) translate();\n }}\n >\n <Icon icon=\"translate\" />{' '}\n <span>\n {uiState === 'loading'\n ? t`Translating…`\n : sourceLanguage && sourceLangText && !detectedLang\n ? autoDetected\n ? t`Translate from ${sourceLangText} (auto-detected)`\n : t`Translate from ${sourceLangText}`\n : t`Translate`}\n </span>\n </button>\n </summary>\n <div class=\"translated-block\">\n <div class=\"translation-info insignificant\">\n <select\n class=\"translated-source-select\"\n disabled={uiState === 'loading'}\n onChange={(e) => {\n apiSourceLang.current = e.target.value;\n translate();\n }}\n >\n {sourceLanguages.map((l) => {\n const common = localeCode2Text({\n code: l.code,\n fallback: l.name,\n });\n const native = localeCode2Text({\n code: l.code,\n locale: l.code,\n });\n const showCommon = common !== native;\n return (\n <option value={l.code}>\n {l.code === 'auto'\n ? t`Auto (${detectedLang ?? '…'})`\n : showCommon\n ? `${native} - ${common}`\n : native}\n </option>\n );\n })}\n </select>{' '}\n <span>→ {targetLangText}</span>\n <Loader abrupt hidden={uiState !== 'loading'} />\n </div>\n {uiState === 'error' ? (\n <p class=\"ui-state\">\n <Trans>Failed to translate</Trans>\n </p>\n ) : (\n !!translatedContent && (\n <>\n <output class=\"translated-content\" lang={targetLang} dir=\"auto\">\n {translatedContent}\n </output>\n {!!pronunciationContent && (\n <output\n class=\"translated-pronunciation-content\"\n tabIndex={-1}\n onClick={(e) => {\n e.target.classList.toggle('expand');\n }}\n >\n {pronunciationContent}\n </output>\n )}\n </>\n )\n )}\n </div>\n </details>\n </div>\n );\n}\n\nexport default LINGVA_INSTANCES?.length ? TranslationBlock : () => null;\n","function promisifyRequest(request) {\n return new Promise((resolve, reject) => {\n // @ts-ignore - file size hacks\n request.oncomplete = request.onsuccess = () => resolve(request.result);\n // @ts-ignore - file size hacks\n request.onabort = request.onerror = () => reject(request.error);\n });\n}\nfunction createStore(dbName, storeName) {\n const request = indexedDB.open(dbName);\n request.onupgradeneeded = () => request.result.createObjectStore(storeName);\n const dbp = promisifyRequest(request);\n return (txMode, callback) => dbp.then((db) => callback(db.transaction(storeName, txMode).objectStore(storeName)));\n}\nlet defaultGetStoreFunc;\nfunction defaultGetStore() {\n if (!defaultGetStoreFunc) {\n defaultGetStoreFunc = createStore('keyval-store', 'keyval');\n }\n return defaultGetStoreFunc;\n}\n/**\n * Get a value by its key.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction get(key, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => promisifyRequest(store.get(key)));\n}\n/**\n * Set a value with a key.\n *\n * @param key\n * @param value\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction set(key, value, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.put(value, key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Set multiple values at once. This is faster than calling set() multiple times.\n * It's also atomic if one of the pairs can't be added, none will be added.\n *\n * @param entries Array of entries, where each entry is an array of `[key, value]`.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction setMany(entries, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n entries.forEach((entry) => store.put(entry[1], entry[0]));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Get multiple values by their keys\n *\n * @param keys\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction getMany(keys, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => Promise.all(keys.map((key) => promisifyRequest(store.get(key)))));\n}\n/**\n * Update a value. This lets you see the old value and update it as an atomic operation.\n *\n * @param key\n * @param updater A callback that takes the old value and returns a new value.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction update(key, updater, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => \n // Need to create the promise manually.\n // If I try to chain promises, the transaction closes in browsers\n // that use a promise polyfill (IE10/11).\n new Promise((resolve, reject) => {\n store.get(key).onsuccess = function () {\n try {\n store.put(updater(this.result), key);\n resolve(promisifyRequest(store.transaction));\n }\n catch (err) {\n reject(err);\n }\n };\n }));\n}\n/**\n * Delete a particular key from the store.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction del(key, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.delete(key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Delete multiple keys at once.\n *\n * @param keys List of keys to delete.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction delMany(keys, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n keys.forEach((key) => store.delete(key));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Clear all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction clear(customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.clear();\n return promisifyRequest(store.transaction);\n });\n}\nfunction eachCursor(store, callback) {\n store.openCursor().onsuccess = function () {\n if (!this.result)\n return;\n callback(this.result);\n this.result.continue();\n };\n return promisifyRequest(store.transaction);\n}\n/**\n * Get all keys in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction keys(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAllKeys) {\n return promisifyRequest(store.getAllKeys());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.key)).then(() => items);\n });\n}\n/**\n * Get all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction values(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAll) {\n return promisifyRequest(store.getAll());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.value)).then(() => items);\n });\n}\n/**\n * Get all entries in the store. Each entry is an array of `[key, value]`.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction entries(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n // (although, hopefully we'll get a simpler path some day)\n if (store.getAll && store.getAllKeys) {\n return Promise.all([\n promisifyRequest(store.getAllKeys()),\n promisifyRequest(store.getAll()),\n ]).then(([keys, values]) => keys.map((key, i) => [key, values[i]]));\n }\n const items = [];\n return customStore('readonly', (store) => eachCursor(store, (cursor) => items.push([cursor.key, cursor.value])).then(() => items));\n });\n}\n\nexport { clear, createStore, del, delMany, entries, get, getMany, keys, promisifyRequest, set, setMany, update, values };\n","import {\n clear,\n createStore,\n del,\n delMany,\n get,\n getMany,\n keys,\n set,\n} from 'idb-keyval';\n\nfunction initDB(dbName, storeName) {\n const store = createStore(dbName, storeName);\n return {\n set: (key, val) => set(key, val, store),\n get: (key) => get(key, store),\n getMany: (keys) => getMany(keys, store),\n del: (key) => del(key, store),\n delMany: (keys) => delMany(keys, store),\n clear: () => clear(store),\n keys: () => keys(store),\n };\n}\n\nexport default {\n drafts: initDB('drafts-db', 'drafts-store'),\n catchup: initDB('catchup-db', 'catchup-store'),\n};\n","import { api } from './api';\nimport { getCurrentAccountID } from './store-utils';\n\nexport async function fetchRelationships(accounts, relationshipsMap = {}) {\n if (!accounts?.length) return;\n const { masto } = api();\n\n const currentAccount = getCurrentAccountID();\n const uniqueAccountIds = accounts.reduce((acc, a) => {\n // 1. Ignore duplicate accounts\n // 2. Ignore accounts that are already inside relationshipsMap\n // 3. Ignore currently logged in account\n if (\n !acc.includes(a.id) &&\n !relationshipsMap[a.id] &&\n a.id !== currentAccount\n ) {\n acc.push(a.id);\n }\n return acc;\n }, []);\n if (!uniqueAccountIds.length) return null;\n\n try {\n const relationships = await masto.v1.accounts.relationships.fetch({\n id: uniqueAccountIds,\n });\n const newRelationshipsMap = relationships.reduce((acc, r) => {\n acc[r.id] = r;\n return acc;\n }, {});\n return newRelationshipsMap;\n } catch (e) {\n console.error(e);\n // It's okay to fail\n return null;\n }\n}\n","export class LiteYTEmbed extends HTMLElement {\n constructor() {\n super();\n this.isIframeLoaded = false;\n this.setupDom();\n }\n static get observedAttributes() {\n return ['videoid', 'playlistid'];\n }\n connectedCallback() {\n this.addEventListener('pointerover', LiteYTEmbed.warmConnections, {\n once: true,\n });\n this.addEventListener('click', () => this.addIframe());\n }\n get videoId() {\n return encodeURIComponent(this.getAttribute('videoid') || '');\n }\n set videoId(id) {\n this.setAttribute('videoid', id);\n }\n get playlistId() {\n return encodeURIComponent(this.getAttribute('playlistid') || '');\n }\n set playlistId(id) {\n this.setAttribute('playlistid', id);\n }\n get videoTitle() {\n return this.getAttribute('videotitle') || 'Video';\n }\n set videoTitle(title) {\n this.setAttribute('videotitle', title);\n }\n get videoPlay() {\n return this.getAttribute('videoPlay') || 'Play';\n }\n set videoPlay(name) {\n this.setAttribute('videoPlay', name);\n }\n get videoStartAt() {\n return this.getAttribute('videoStartAt') || '0';\n }\n get autoLoad() {\n return this.hasAttribute('autoload');\n }\n get noCookie() {\n return this.hasAttribute('nocookie');\n }\n get posterQuality() {\n return this.getAttribute('posterquality') || 'hqdefault';\n }\n get posterLoading() {\n return (this.getAttribute('posterloading') ||\n 'lazy');\n }\n get params() {\n return `start=${this.videoStartAt}&${this.getAttribute('params')}`;\n }\n set params(opts) {\n this.setAttribute('params', opts);\n }\n setupDom() {\n const shadowDom = this.attachShadow({ mode: 'open' });\n let nonce = '';\n if (window.liteYouTubeNonce) {\n nonce = `nonce=\"${window.liteYouTubeNonce}\"`;\n }\n shadowDom.innerHTML = `\n <style ${nonce}>\n :host {\n contain: content;\n display: block;\n position: relative;\n width: 100%;\n padding-bottom: calc(100% / (16 / 9));\n }\n\n @media (max-width: 40em) {\n :host([short]) {\n padding-bottom: calc(100% / (9 / 16));\n }\n }\n\n #frame, #fallbackPlaceholder, iframe {\n position: absolute;\n width: 100%;\n height: 100%;\n left: 0;\n }\n\n #frame {\n cursor: pointer;\n }\n\n #fallbackPlaceholder {\n object-fit: cover;\n }\n\n #frame::before {\n content: '';\n display: block;\n position: absolute;\n top: 0;\n background-image: linear-gradient(180deg, #111 -20%, transparent 90%);\n height: 60px;\n width: 100%;\n z-index: 1;\n }\n\n #playButton {\n width: 68px;\n height: 48px;\n background-color: transparent;\n background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 68 48\"><path d=\"M66.52 7.74c-.78-2.93-2.49-5.41-5.42-6.19C55.79.13 34 0 34 0S12.21.13 6.9 1.55c-2.93.78-4.63 3.26-5.42 6.19C.06 13.05 0 24 0 24s.06 10.95 1.48 16.26c.78 2.93 2.49 5.41 5.42 6.19C12.21 47.87 34 48 34 48s21.79-.13 27.1-1.55c2.93-.78 4.64-3.26 5.42-6.19C67.94 34.95 68 24 68 24s-.06-10.95-1.48-16.26z\" fill=\"red\"/><path d=\"M45 24 27 14v20\" fill=\"white\"/></svg>');\n z-index: 1;\n border: 0;\n border-radius: inherit;\n }\n\n #playButton:before {\n content: '';\n border-style: solid;\n border-width: 11px 0 11px 19px;\n border-color: transparent transparent transparent #fff;\n }\n\n #playButton,\n #playButton:before {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate3d(-50%, -50%, 0);\n cursor: inherit;\n }\n\n /* Post-click styles */\n .activated {\n cursor: unset;\n }\n\n #frame.activated::before,\n #frame.activated > #playButton {\n display: none;\n }\n </style>\n <div id=\"frame\">\n <picture>\n <source id=\"webpPlaceholder\" type=\"image/webp\">\n <source id=\"jpegPlaceholder\" type=\"image/jpeg\">\n <img id=\"fallbackPlaceholder\" referrerpolicy=\"origin\" loading=\"lazy\">\n </picture>\n <button id=\"playButton\"></button>\n </div>\n `;\n this.domRefFrame = shadowDom.querySelector('#frame');\n this.domRefImg = {\n fallback: shadowDom.querySelector('#fallbackPlaceholder'),\n webp: shadowDom.querySelector('#webpPlaceholder'),\n jpeg: shadowDom.querySelector('#jpegPlaceholder'),\n };\n this.domRefPlayButton = shadowDom.querySelector('#playButton');\n }\n setupComponent() {\n this.initImagePlaceholder();\n this.domRefPlayButton.setAttribute('aria-label', `${this.videoPlay}: ${this.videoTitle}`);\n this.setAttribute('title', `${this.videoPlay}: ${this.videoTitle}`);\n if (this.autoLoad || this.isYouTubeShort()) {\n this.initIntersectionObserver();\n }\n }\n attributeChangedCallback(name, oldVal, newVal) {\n switch (name) {\n case 'videoid':\n case 'playlistid':\n case 'videoTitle':\n case 'videoPlay': {\n if (oldVal !== newVal) {\n this.setupComponent();\n if (this.domRefFrame.classList.contains('activated')) {\n this.domRefFrame.classList.remove('activated');\n this.shadowRoot.querySelector('iframe').remove();\n this.isIframeLoaded = false;\n }\n }\n break;\n }\n default:\n break;\n }\n }\n addIframe(isIntersectionObserver = false) {\n if (!this.isIframeLoaded) {\n let autoplay = isIntersectionObserver ? 0 : 1;\n const wantsNoCookie = this.noCookie ? '-nocookie' : '';\n let embedTarget;\n if (this.playlistId) {\n embedTarget = `?listType=playlist&list=${this.playlistId}&`;\n }\n else {\n embedTarget = `${this.videoId}?`;\n }\n if (this.isYouTubeShort()) {\n this.params = `loop=1&mute=1&modestbranding=1&playsinline=1&rel=0&enablejsapi=1&playlist=${this.videoId}`;\n autoplay = 1;\n }\n const iframeHTML = `\n<iframe frameborder=\"0\" title=\"${this.videoTitle}\"\n allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen\n src=\"https://www.youtube${wantsNoCookie}.com/embed/${embedTarget}autoplay=${autoplay}&${this.params}\"\n></iframe>`;\n this.domRefFrame.insertAdjacentHTML('beforeend', iframeHTML);\n this.domRefFrame.classList.add('activated');\n this.isIframeLoaded = true;\n this.attemptShortAutoPlay();\n this.dispatchEvent(new CustomEvent('liteYoutubeIframeLoaded', {\n detail: {\n videoId: this.videoId,\n },\n bubbles: true,\n cancelable: true,\n }));\n }\n }\n initImagePlaceholder() {\n const posterUrlWebp = `https://i.ytimg.com/vi_webp/${this.videoId}/${this.posterQuality}.webp`;\n const posterUrlJpeg = `https://i.ytimg.com/vi/${this.videoId}/${this.posterQuality}.jpg`;\n this.domRefImg.fallback.loading = this.posterLoading;\n this.domRefImg.webp.srcset = posterUrlWebp;\n this.domRefImg.jpeg.srcset = posterUrlJpeg;\n this.domRefImg.fallback.src = posterUrlJpeg;\n this.domRefImg.fallback.setAttribute('aria-label', `${this.videoPlay}: ${this.videoTitle}`);\n this.domRefImg?.fallback?.setAttribute('alt', `${this.videoPlay}: ${this.videoTitle}`);\n }\n initIntersectionObserver() {\n const options = {\n root: null,\n rootMargin: '0px',\n threshold: 0,\n };\n const observer = new IntersectionObserver((entries, observer) => {\n entries.forEach(entry => {\n if (entry.isIntersecting && !this.isIframeLoaded) {\n LiteYTEmbed.warmConnections();\n this.addIframe(true);\n observer.unobserve(this);\n }\n });\n }, options);\n observer.observe(this);\n }\n attemptShortAutoPlay() {\n if (this.isYouTubeShort()) {\n setTimeout(() => {\n this.shadowRoot\n .querySelector('iframe')\n ?.contentWindow?.postMessage('{\"event\":\"command\",\"func\":\"' + 'playVideo' + '\",\"args\":\"\"}', '*');\n }, 2000);\n }\n }\n isYouTubeShort() {\n return (this.getAttribute('short') === '' &&\n window.matchMedia('(max-width: 40em)').matches);\n }\n static addPrefetch(kind, url) {\n const linkElem = document.createElement('link');\n linkElem.rel = kind;\n linkElem.href = url;\n linkElem.crossOrigin = 'true';\n document.head.append(linkElem);\n }\n static warmConnections() {\n if (LiteYTEmbed.isPreconnected || window.liteYouTubeIsPreconnected)\n return;\n LiteYTEmbed.addPrefetch('preconnect', 'https://i.ytimg.com/');\n LiteYTEmbed.addPrefetch('preconnect', 'https://s.ytimg.com');\n LiteYTEmbed.addPrefetch('preconnect', 'https://www.youtube.com');\n LiteYTEmbed.addPrefetch('preconnect', 'https://www.google.com');\n LiteYTEmbed.addPrefetch('preconnect', 'https://googleads.g.doubleclick.net');\n LiteYTEmbed.addPrefetch('preconnect', 'https://static.doubleclick.net');\n LiteYTEmbed.isPreconnected = true;\n window.liteYouTubeIsPreconnected = true;\n }\n}\nLiteYTEmbed.isPreconnected = false;\ncustomElements.define('lite-youtube', LiteYTEmbed);\n//# sourceMappingURL=lite-youtube.js.map","const digitLookup = new Uint8Array(128);\nfor (let i = 0; i < 83; i++) {\n digitLookup[\n '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz#$%*+,-.:;=?@[]^_{|}~'.charCodeAt(\n i,\n )\n ] = i;\n}\nconst decode83 = (str, start, end) => {\n let value = 0;\n while (start < end) {\n value *= 83;\n value += digitLookup[str.charCodeAt(start++)];\n }\n return value;\n};\n\nconst pow = Math.pow;\nconst PI = Math.PI;\nconst PI2 = PI * 2;\n\nconst d = 3294.6;\nconst e = 269.025;\nconst sRGBToLinear = (value) =>\n value > 10.31475 ? pow(value / e + 0.052132, 2.4) : value / d;\n\nconst linearTosRGB = (v) =>\n ~~(v > 0.00001227 ? e * pow(v, 0.416666) - 13.025 : v * d + 1);\n\nconst signSqr = (x) => (x < 0 ? -1 : 1) * x * x;\n\n/**\n * Fast approximate cosine implementation\n * Based on FTrig https://github.com/netcell/FTrig\n */\nconst fastCos = (x) => {\n x += PI / 2;\n while (x > PI) {\n x -= PI2;\n }\n const cos = 1.27323954 * x - 0.405284735 * signSqr(x);\n return 0.225 * (signSqr(cos) - cos) + cos;\n};\n\n/**\n * Extracts average color from BlurHash image\n * @param {string} blurHash BlurHash image string\n * @returns {[number, number, number]}\n */\nexport function getBlurHashAverageColor(blurHash) {\n const val = decode83(blurHash, 2, 6);\n return [val >> 16, (val >> 8) & 255, val & 255];\n}\n\n/**\n * Decodes BlurHash image\n * @param {string} blurHash BlurHash image string\n * @param {number} width Output image width\n * @param {number} height Output image height\n * @param {?number} punch\n * @returns {Uint8ClampedArray}\n */\nexport function decodeBlurHash(blurHash, width, height, punch) {\n const sizeFlag = decode83(blurHash, 0, 1);\n const numX = (sizeFlag % 9) + 1;\n const numY = ~~(sizeFlag / 9) + 1;\n const size = numX * numY;\n\n let i = 0,\n j = 0,\n x = 0,\n y = 0,\n r = 0,\n g = 0,\n b = 0,\n basis = 0,\n basisY = 0,\n colorIndex = 0,\n pixelIndex = 0,\n value = 0;\n\n const maximumValue = ((decode83(blurHash, 1, 2) + 1) / 13446) * (punch | 1);\n\n const colors = new Float64Array(size * 3);\n\n const averageColor = getBlurHashAverageColor(blurHash);\n for (i = 0; i < 3; i++) {\n colors[i] = sRGBToLinear(averageColor[i]);\n }\n\n for (i = 1; i < size; i++) {\n value = decode83(blurHash, 4 + i * 2, 6 + i * 2);\n colors[i * 3] = signSqr(~~(value / 361) - 9) * maximumValue;\n colors[i * 3 + 1] = signSqr((~~(value / 19) % 19) - 9) * maximumValue;\n colors[i * 3 + 2] = signSqr((value % 19) - 9) * maximumValue;\n }\n\n const cosinesY = new Float64Array(numY * height);\n const cosinesX = new Float64Array(numX * width);\n for (j = 0; j < numY; j++) {\n for (y = 0; y < height; y++) {\n cosinesY[j * height + y] = fastCos((PI * y * j) / height);\n }\n }\n for (i = 0; i < numX; i++) {\n for (x = 0; x < width; x++) {\n cosinesX[i * width + x] = fastCos((PI * x * i) / width);\n }\n }\n\n const bytesPerRow = width * 4;\n const pixels = new Uint8ClampedArray(bytesPerRow * height);\n\n for (y = 0; y < height; y++) {\n for (x = 0; x < width; x++) {\n r = g = b = 0;\n for (j = 0; j < numY; j++) {\n basisY = cosinesY[j * height + y];\n for (i = 0; i < numX; i++) {\n basis = cosinesX[i * width + x] * basisY;\n colorIndex = (i + j * numX) * 3;\n r += colors[colorIndex] * basis;\n g += colors[colorIndex + 1] * basis;\n b += colors[colorIndex + 2] * basis;\n }\n }\n\n pixelIndex = 4 * x + y * bytesPerRow;\n pixels[pixelIndex] = linearTosRGB(r);\n pixels[pixelIndex + 1] = linearTosRGB(g);\n pixels[pixelIndex + 2] = linearTosRGB(b);\n pixels[pixelIndex + 3] = 255; // alpha\n }\n }\n return pixels;\n}\n","/**\n * @param {string[]} splittedHtml\n * @param {{ char?: string; count?: number}} options\n * @returns {string}\n */\nconst addIndentation = (splittedHtml, options = {}) => {\n const char = options.char || ' '\n const count = options.count || 2\n\n let level = 0\n const opened = []\n\n return splittedHtml.reverse().reduce((indented, elTag) => {\n if (opened.length\n && level\n && opened[level]\n /* if current element tag is the same as previously opened one */\n && opened[level] === elTag.substring(1, opened[level].length + 1)\n ) {\n opened.splice(level, 1)\n level--\n }\n\n const indentation = char.repeat(level ? level * count : 0)\n\n const newIndented = [\n `${indentation}${elTag}`,\n ...indented,\n ]\n\n // if current element tag is closing tag\n // add it to opened elements\n if (elTag.substring(0, 2) === '</') {\n level++\n opened[level] = elTag.substring(2, elTag.length - 1)\n }\n\n return newIndented\n }, []).join('\\n')\n}\n\nmodule.exports = addIndentation\n","/**\n * @param {string} nonFormattedString Any non formatted string\n * @returns {string[]} Array of strings separated on new lines\n */\nconst removeEmptyLines = (nonFormattedString) => (\n // Replace\n // - 1 or more spaces or tabs at the start of line\n // - 1 or more spaces or tabs at the end of line\n // - empty lines\n // with empty string\n nonFormattedString.trim().replace(/(^(\\s|\\t)+|(( |\\t)+)$)/gm, '')\n)\n\n/**\n * @param {string} markup\n * @returns {string[]} Array of strings splitted on new lines without empty lines\n */\nconst mergeAttributesWithElements = (markup) => {\n const splittedMarkup = removeEmptyLines(markup).split('\\n')\n\n const mergedLines = []\n let currentElement = ''\n for (let i = 0; i < splittedMarkup.length; i += 1) {\n const line = splittedMarkup[i]\n\n // If line is closing element/tag separate closing tag from rest of the line with space\n if (line.endsWith('/>')) {\n mergedLines.push(`${currentElement}${line.slice(0, -2)} />`)\n currentElement = ''\n // eslint-disable-next-line no-continue\n continue\n }\n\n if (line.endsWith('>')) {\n mergedLines.push(`${currentElement}${\n line.startsWith('>') || line.startsWith('<') ? '' : ' '\n }${line}`)\n currentElement = ''\n // eslint-disable-next-line no-continue\n continue\n }\n\n currentElement += currentElement.length ? ` ${line}` : line\n }\n\n return mergedLines\n}\n\nmodule.exports = {\n mergeAttributesWithElements,\n removeEmptyLines,\n}\n","const addIndentation = require('./utils/addIndentation')\nconst { mergeAttributesWithElements } = require('./utils/toLines')\n\n/**\n * @param {string} markup\n * @param {{ char?: string; count?: number }} options\n * @returns {string}\n */\nconst prettify = (markup, options = {}) => {\n const splitted = mergeAttributesWithElements(markup)\n\n return addIndentation(splitted, options)\n}\n\nmodule.exports = prettify\n","import { useRef as s, useCallback as h, useEffect as g } from \"react\";\nvar l = /* @__PURE__ */ ((e) => (e.Mouse = \"mouse\", e.Touch = \"touch\", e.Pointer = \"pointer\", e))(l || {}), d = /* @__PURE__ */ ((e) => (e.CancelledByMovement = \"cancelled-by-movement\", e.CancelledByRelease = \"cancelled-by-release\", e.CancelledOutsideElement = \"cancelled-outside-element\", e))(d || {});\nconst A = () => typeof window == \"object\" ? window?.PointerEvent ?? null : null, z = () => typeof window == \"object\" ? window?.TouchEvent ?? null : null;\nfunction U(e) {\n const { nativeEvent: t } = e, u = z();\n return u && t instanceof u || \"touches\" in e;\n}\nfunction X(e) {\n const t = A();\n return e.nativeEvent instanceof MouseEvent && !(t && e.nativeEvent instanceof t);\n}\nfunction Y(e) {\n const { nativeEvent: t } = e;\n if (!t)\n return !1;\n const u = A();\n return u && t instanceof u || \"pointerId\" in t;\n}\nfunction R(e) {\n return X(e) || U(e) || Y(e);\n}\nfunction j(e) {\n return U(e) ? {\n x: e.touches[0].pageX,\n y: e.touches[0].pageY\n } : X(e) || Y(e) ? {\n x: e.pageX,\n y: e.pageY\n } : null;\n}\nfunction G(e) {\n return {\n target: e.target,\n currentTarget: e.currentTarget,\n nativeEvent: e,\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n persist: () => {\n }\n };\n}\nfunction J(e, {\n threshold: t = 400,\n captureEvent: u = !1,\n detect: y = l.Pointer,\n cancelOnMovement: w = !1,\n cancelOutsideElement: v = !0,\n filterEvents: p,\n onStart: M,\n onMove: C,\n onFinish: L,\n onCancel: b\n} = {}) {\n const P = s(!1), c = s(!1), I = s(), a = s(), T = s(e), f = s(null), E = h(\n (n) => (r) => {\n c.current || R(r) && (p !== void 0 && !p(r) || (u && r.persist(), M?.(r, { context: n }), f.current = j(r), c.current = !0, I.current = r.currentTarget, a.current = setTimeout(() => {\n T.current && (T.current(r, { context: n }), P.current = !0);\n }, t)));\n },\n [u, p, M, t]\n ), i = h(\n (n) => (r, o) => {\n R(r) && c.current && (f.current = null, u && r.persist(), P.current ? L?.(r, { context: n }) : c.current && b?.(r, { context: n, reason: o ?? d.CancelledByRelease }), P.current = !1, c.current = !1, a.current !== void 0 && clearTimeout(a.current));\n },\n [u, L, b]\n ), m = h(\n (n) => (r) => {\n if (C?.(r, { context: n }), w !== !1 && f.current) {\n const o = j(r);\n if (o) {\n const B = w === !0 ? 25 : w, D = {\n x: Math.abs(o.x - f.current.x),\n y: Math.abs(o.y - f.current.y)\n };\n (D.x > B || D.y > B) && i(n)(r, d.CancelledByMovement);\n }\n }\n },\n [i, w, C]\n ), q = h(\n (n) => {\n if (e === null)\n return {};\n switch (y) {\n case l.Mouse: {\n const r = {\n onMouseDown: E(n),\n onMouseMove: m(n),\n onMouseUp: i(n)\n };\n return v && (r.onMouseLeave = (o) => {\n i(n)(o, d.CancelledOutsideElement);\n }), r;\n }\n case l.Touch:\n return {\n onTouchStart: E(n),\n onTouchMove: m(n),\n onTouchEnd: i(n)\n };\n case l.Pointer: {\n const r = {\n onPointerDown: E(n),\n onPointerMove: m(n),\n onPointerUp: i(n)\n };\n return v && (r.onPointerLeave = (o) => i(n)(o, d.CancelledOutsideElement)), r;\n }\n }\n },\n [e, i, v, y, m, E]\n );\n return g(() => {\n if (!window)\n return;\n function n(r) {\n const o = G(r);\n i()(o);\n }\n return window.addEventListener(\"mouseup\", n), window.addEventListener(\"touchend\", n), window.addEventListener(\"pointerup\", n), () => {\n window.removeEventListener(\"mouseup\", n), window.removeEventListener(\"touchend\", n), window.removeEventListener(\"pointerup\", n);\n };\n }, [i]), g(\n () => () => {\n a.current !== void 0 && clearTimeout(a.current);\n },\n []\n ), g(() => {\n T.current = e;\n }, [e]), q;\n}\nexport {\n d as LongPressCallbackReason,\n l as LongPressEventType,\n J as useLongPress\n};\n","import { Plural, plural, t, Trans } from '@lingui/macro';\nimport { useState } from 'preact/hooks';\n\nimport shortenNumber from '../utils/shorten-number';\n\nimport EmojiText from './emoji-text';\nimport Icon from './icon';\nimport RelativeTime from './relative-time';\n\nexport default function Poll({\n poll,\n lang,\n readOnly,\n refresh = () => {},\n votePoll = () => {},\n}) {\n const [uiState, setUIState] = useState('default');\n const {\n expired,\n expiresAt,\n id,\n multiple,\n options,\n ownVotes,\n voted,\n votersCount,\n votesCount,\n emojis,\n } = poll;\n const expiresAtDate = !!expiresAt && new Date(expiresAt); // Update poll at point of expiry\n // NOTE: Disable this because setTimeout runs immediately if delay is too large\n // https://stackoverflow.com/a/56718027/20838\n // useEffect(() => {\n // let timeout;\n // if (!expired && expiresAtDate) {\n // const ms = expiresAtDate.getTime() - Date.now() + 1; // +1 to give it a little buffer\n // if (ms > 0) {\n // timeout = setTimeout(() => {\n // setUIState('loading');\n // (async () => {\n // // await refresh();\n // setUIState('default');\n // })();\n // }, ms);\n // }\n // }\n // return () => {\n // clearTimeout(timeout);\n // };\n // }, [expired, expiresAtDate]);\n\n const pollVotesCount = multiple ? votersCount : votesCount;\n let roundPrecision = 0;\n\n if (pollVotesCount <= 1000) {\n roundPrecision = 0;\n } else if (pollVotesCount <= 10000) {\n roundPrecision = 1;\n } else if (pollVotesCount <= 100000) {\n roundPrecision = 2;\n }\n\n const [showResults, setShowResults] = useState(false);\n const optionsHaveVoteCounts = options.every((o) => o.votesCount !== null);\n\n return (\n <div\n lang={lang}\n dir=\"auto\"\n class={`poll ${readOnly ? 'read-only' : ''} ${\n uiState === 'loading' ? 'loading' : ''\n }`}\n >\n {(showResults && optionsHaveVoteCounts) || voted || expired ? (\n <>\n <div class=\"poll-options\">\n {options.map((option, i) => {\n const { title, votesCount: optionVotesCount } = option;\n const ratio = pollVotesCount\n ? optionVotesCount / pollVotesCount\n : 0;\n const percentage = ratio\n ? ratio.toLocaleString(i18n.locale || undefined, {\n style: 'percent',\n maximumFractionDigits: roundPrecision,\n })\n : '0%';\n\n const isLeading =\n optionVotesCount > 0 &&\n optionVotesCount ===\n Math.max(...options.map((o) => o.votesCount));\n return (\n <div\n key={`${i}-${title}-${optionVotesCount}`}\n class={`poll-option poll-result ${\n isLeading ? 'poll-option-leading' : ''\n }`}\n style={{\n '--percentage': `${ratio * 100}%`,\n }}\n >\n <div class=\"poll-option-title\">\n <span>\n <EmojiText text={title} emojis={emojis} />\n </span>\n {voted && ownVotes.includes(i) && (\n <>\n {' '}\n <Icon icon=\"check-circle\" alt={t`Voted`} />\n </>\n )}\n </div>\n <div\n class=\"poll-option-votes\"\n title={plural(optionVotesCount, {\n one: `# vote`,\n other: `# votes`,\n })}\n >\n {percentage}\n </div>\n </div>\n );\n })}\n </div>\n {!expired && !voted && (\n <button\n class=\"poll-vote-button plain2\"\n disabled={uiState === 'loading'}\n onClick={(e) => {\n e.preventDefault();\n setShowResults(false);\n }}\n >\n <Icon icon=\"arrow-left\" size=\"s\" /> <Trans>Hide results</Trans>\n </button>\n )}\n </>\n ) : (\n <form\n onSubmit={async (e) => {\n e.preventDefault();\n const form = e.target;\n const formData = new FormData(form);\n const choices = [];\n formData.forEach((value, key) => {\n if (key === 'poll') {\n choices.push(value);\n }\n });\n if (!choices.length) return;\n setUIState('loading');\n await votePoll(choices);\n setUIState('default');\n }}\n >\n <div class=\"poll-options\">\n {options.map((option, i) => {\n const { title } = option;\n return (\n <div class=\"poll-option\">\n <label class=\"poll-label\">\n <input\n type={multiple ? 'checkbox' : 'radio'}\n name=\"poll\"\n value={i}\n disabled={uiState === 'loading'}\n readOnly={readOnly}\n />\n <span class=\"poll-option-title\">\n <EmojiText text={title} emojis={emojis} />\n </span>\n </label>\n </div>\n );\n })}\n </div>\n {!readOnly && (\n <button\n class=\"poll-vote-button\"\n type=\"submit\"\n disabled={uiState === 'loading'}\n >\n <Trans>Vote</Trans>\n </button>\n )}\n </form>\n )}\n <p class=\"poll-meta\">\n {!expired && !readOnly && (\n <button\n type=\"button\"\n class=\"plain small\"\n disabled={uiState === 'loading'}\n onClick={(e) => {\n e.preventDefault();\n setUIState('loading');\n\n (async () => {\n await refresh();\n setUIState('default');\n })();\n }}\n title={t`Refresh`}\n >\n <Icon icon=\"refresh\" alt={t`Refresh`} />\n </button>\n )}\n {!voted && !expired && !readOnly && optionsHaveVoteCounts && (\n <button\n type=\"button\"\n class=\"plain small\"\n disabled={uiState === 'loading'}\n onClick={(e) => {\n e.preventDefault();\n setShowResults(!showResults);\n }}\n title={showResults ? t`Hide results` : t`Show results`}\n >\n <Icon\n icon={showResults ? 'eye-open' : 'eye-close'}\n alt={showResults ? t`Hide results` : t`Show results`}\n />{' '}\n </button>\n )}\n {!expired && !readOnly && ' '}\n <Plural\n value={votesCount}\n one={\n <Trans>\n <span title={votesCount}>{shortenNumber(votesCount)}</span> vote\n </Trans>\n }\n other={\n <Trans>\n <span title={votesCount}>{shortenNumber(votesCount)}</span> votes\n </Trans>\n }\n />\n {!!votersCount && votersCount !== votesCount && (\n <>\n {' '}\n &bull;{' '}\n <Plural\n value={votersCount}\n one={\n <Trans>\n <span title={votersCount}>{shortenNumber(votersCount)}</span>{' '}\n voter\n </Trans>\n }\n other={\n <Trans>\n <span title={votersCount}>{shortenNumber(votersCount)}</span>{' '}\n voters\n </Trans>\n }\n />\n </>\n )}{' '}\n &bull;{' '}\n {expired ? (\n !!expiresAtDate ? (\n <Trans>\n Ended <RelativeTime datetime={expiresAtDate} />\n </Trans>\n ) : (\n t`Ended`\n )\n ) : !!expiresAtDate ? (\n <Trans>\n Ending <RelativeTime datetime={expiresAtDate} />\n </Trans>\n ) : (\n t`Ending`\n )}\n </p>\n </div>\n );\n}\n","import { createContext } from 'preact';\n\nconst FilterContext = createContext();\nexport default FilterContext;\n","import mem from './mem';\nimport { getCurrentAccountID } from './store-utils';\n\nfunction _isFiltered(filtered, filterContext) {\n if (!filtered?.length) return false;\n const appliedFilters = filtered.filter((f) => {\n const { filter } = f;\n const hasContext = filter.context.includes(filterContext);\n if (!hasContext) return false;\n if (!filter.expiresAt) return hasContext;\n return new Date(filter.expiresAt) > new Date();\n });\n if (!appliedFilters.length) return false;\n const isHidden = appliedFilters.some((f) => f.filter.filterAction === 'hide');\n if (isHidden)\n return {\n action: 'hide',\n };\n const isWarn = appliedFilters.some((f) => f.filter.filterAction === 'warn');\n if (isWarn) {\n const filterTitles = appliedFilters.map((f) => f.filter.title);\n return {\n action: 'warn',\n titles: filterTitles,\n titlesStr: filterTitles.join(' • '),\n };\n }\n return false;\n}\nexport const isFiltered = mem(_isFiltered);\n\nexport function filteredItem(item, filterContext, currentAccountID) {\n const { filtered } = item;\n if (!filtered?.length) return true;\n const isSelf = currentAccountID && item.account?.id === currentAccountID;\n if (isSelf) return true;\n const filterState = isFiltered(filtered, filterContext);\n if (!filterState) return true;\n if (filterState.action === 'hide') return false;\n // item._filtered = filterState;\n return true;\n}\nexport function filteredItems(items, filterContext) {\n if (!items?.length) return [];\n if (!filterContext) return items;\n const currentAccountID = getCurrentAccountID();\n return items.filter((item) =>\n filteredItem(item, filterContext, currentAccountID),\n );\n}\n","const div = document.createElement('div');\nexport default function htmlContentLength(html) {\n if (!html) return 0;\n div.innerHTML = html;\n // .invisible spans for links\n // e.g. <span class=\"invisible\">https://</span>mastodon.social\n div.querySelectorAll('.invisible').forEach((el) => {\n el.remove();\n });\n return div.innerText.length;\n}\n","export const supportsTTS = 'speechSynthesis' in window;\n\nexport function speak(text, lang) {\n if (!supportsTTS) return;\n try {\n if (speechSynthesis.speaking) {\n speechSynthesis.cancel();\n }\n const utterance = new SpeechSynthesisUtterance(text);\n if (lang) utterance.lang = lang;\n speechSynthesis.speak(utterance);\n } catch (e) {\n alert(e);\n }\n}\n","import getHTMLText from './getHTMLText';\n\nfunction statusPeek(status) {\n const { spoilerText, content, poll, mediaAttachments } = status;\n let text = '';\n if (spoilerText?.trim()) {\n text += spoilerText;\n } else {\n text += getHTMLText(content);\n }\n text = text.trim();\n if (poll?.options?.length) {\n text += `\\n\\n📊:\\n${poll.options\n .map((o) => `${poll.multiple ? '▪️' : '•'} ${o.title}`)\n .join('\\n')}`;\n }\n if (mediaAttachments?.length) {\n text +=\n ' ' +\n mediaAttachments\n .map(\n (m) =>\n ({\n image: '🖼️',\n gifv: '🎞️',\n video: '📹',\n audio: '🎵',\n unknown: '',\n }[m.type] || ''),\n )\n .join('');\n }\n return text;\n}\n\nexport default statusPeek;\n","import{useRef as r,useEffect as n,useMemo as t,useState as e,useCallback as u}from\"react\";function c(e,u,c){var i=this,a=r(null),o=r(0),f=r(null),l=r([]),v=r(),m=r(),d=r(e),g=r(!0);d.current=e;var p=\"undefined\"!=typeof window,w=!u&&0!==u&&p;if(\"function\"!=typeof e)throw new TypeError(\"Expected a function\");u=+u||0;var s=!!(c=c||{}).leading,x=!(\"trailing\"in c)||!!c.trailing,h=\"maxWait\"in c,y=\"debounceOnServer\"in c&&!!c.debounceOnServer,F=h?Math.max(+c.maxWait||0,u):null;n(function(){return g.current=!0,function(){g.current=!1}},[]);var A=t(function(){var r=function(r){var n=l.current,t=v.current;return l.current=v.current=null,o.current=r,m.current=d.current.apply(t,n)},n=function(r,n){w&&cancelAnimationFrame(f.current),f.current=w?requestAnimationFrame(r):setTimeout(r,n)},t=function(r){if(!g.current)return!1;var n=r-a.current;return!a.current||n>=u||n<0||h&&r-o.current>=F},e=function(n){return f.current=null,x&&l.current?r(n):(l.current=v.current=null,m.current)},c=function r(){var c=Date.now();if(t(c))return e(c);if(g.current){var i=u-(c-a.current),f=h?Math.min(i,F-(c-o.current)):i;n(r,f)}},A=function(){if(p||y){var e=Date.now(),d=t(e);if(l.current=[].slice.call(arguments),v.current=i,a.current=e,d){if(!f.current&&g.current)return o.current=a.current,n(c,u),s?r(a.current):m.current;if(h)return n(c,u),r(a.current)}return f.current||n(c,u),m.current}};return A.cancel=function(){f.current&&(w?cancelAnimationFrame(f.current):clearTimeout(f.current)),o.current=0,l.current=a.current=v.current=f.current=null},A.isPending=function(){return!!f.current},A.flush=function(){return f.current?e(Date.now()):m.current},A},[s,h,u,F,x,w,p,y]);return A}function i(r,n){return r===n}function a(n,t,a){var o=a&&a.equalityFn||i,f=r(n),l=e({})[1],v=c(u(function(r){f.current=r,l({})},[l]),t,a),m=r(n);return o(m.current,n)||(v(n),m.current=n),[f.current,v]}function o(r,n,t){var e=void 0===t?{}:t,u=e.leading,i=e.trailing;return c(r,n,{maxWait:n,leading:void 0===u||u,trailing:void 0===i||i})}export{a as useDebounce,c as useDebouncedCallback,o as useThrottledCallback};\n//# sourceMappingURL=index.module.js.map\n","import { useRef, useEffect, useCallback, useState, useMemo } from 'react';\n\n// This could've been more streamlined with internal state instead of abusing\n// refs to such extent, but then composing hooks and components could not opt out of unnecessary renders.\nfunction useResolvedElement(subscriber, refOrElement) {\n var lastReportRef = useRef(null);\n var refOrElementRef = useRef(null);\n refOrElementRef.current = refOrElement;\n var cbElementRef = useRef(null); // Calling re-evaluation after each render without using a dep array,\n // as the ref object's current value could've changed since the last render.\n\n useEffect(function () {\n evaluateSubscription();\n });\n var evaluateSubscription = useCallback(function () {\n var cbElement = cbElementRef.current;\n var refOrElement = refOrElementRef.current; // Ugly ternary. But smaller than an if-else block.\n\n var element = cbElement ? cbElement : refOrElement ? refOrElement instanceof Element ? refOrElement : refOrElement.current : null;\n\n if (lastReportRef.current && lastReportRef.current.element === element && lastReportRef.current.subscriber === subscriber) {\n return;\n }\n\n if (lastReportRef.current && lastReportRef.current.cleanup) {\n lastReportRef.current.cleanup();\n }\n\n lastReportRef.current = {\n element: element,\n subscriber: subscriber,\n // Only calling the subscriber, if there's an actual element to report.\n // Setting cleanup to undefined unless a subscriber returns one, as an existing cleanup function would've been just called.\n cleanup: element ? subscriber(element) : undefined\n };\n }, [subscriber]); // making sure we call the cleanup function on unmount\n\n useEffect(function () {\n return function () {\n if (lastReportRef.current && lastReportRef.current.cleanup) {\n lastReportRef.current.cleanup();\n lastReportRef.current = null;\n }\n };\n }, []);\n return useCallback(function (element) {\n cbElementRef.current = element;\n evaluateSubscription();\n }, [evaluateSubscription]);\n}\n\n// We're only using the first element of the size sequences, until future versions of the spec solidify on how\n// exactly it'll be used for fragments in multi-column scenarios:\n// From the spec:\n// > The box size properties are exposed as FrozenArray in order to support elements that have multiple fragments,\n// > which occur in multi-column scenarios. However the current definitions of content rect and border box do not\n// > mention how those boxes are affected by multi-column layout. In this spec, there will only be a single\n// > ResizeObserverSize returned in the FrozenArray, which will correspond to the dimensions of the first column.\n// > A future version of this spec will extend the returned FrozenArray to contain the per-fragment size information.\n// (https://drafts.csswg.org/resize-observer/#resize-observer-entry-interface)\n//\n// Also, testing these new box options revealed that in both Chrome and FF everything is returned in the callback,\n// regardless of the \"box\" option.\n// The spec states the following on this:\n// > This does not have any impact on which box dimensions are returned to the defined callback when the event\n// > is fired, it solely defines which box the author wishes to observe layout changes on.\n// (https://drafts.csswg.org/resize-observer/#resize-observer-interface)\n// I'm not exactly clear on what this means, especially when you consider a later section stating the following:\n// > This section is non-normative. An author may desire to observe more than one CSS box.\n// > In this case, author will need to use multiple ResizeObservers.\n// (https://drafts.csswg.org/resize-observer/#resize-observer-interface)\n// Which is clearly not how current browser implementations behave, and seems to contradict the previous quote.\n// For this reason I decided to only return the requested size,\n// even though it seems we have access to results for all box types.\n// This also means that we get to keep the current api, being able to return a simple { width, height } pair,\n// regardless of box option.\nfunction extractSize(entry, boxProp, sizeType) {\n if (!entry[boxProp]) {\n if (boxProp === \"contentBoxSize\") {\n // The dimensions in `contentBoxSize` and `contentRect` are equivalent according to the spec.\n // See the 6th step in the description for the RO algorithm:\n // https://drafts.csswg.org/resize-observer/#create-and-populate-resizeobserverentry-h\n // > Set this.contentRect to logical this.contentBoxSize given target and observedBox of \"content-box\".\n // In real browser implementations of course these objects differ, but the width/height values should be equivalent.\n return entry.contentRect[sizeType === \"inlineSize\" ? \"width\" : \"height\"];\n }\n\n return undefined;\n } // A couple bytes smaller than calling Array.isArray() and just as effective here.\n\n\n return entry[boxProp][0] ? entry[boxProp][0][sizeType] : // TS complains about this, because the RO entry type follows the spec and does not reflect Firefox's current\n // behaviour of returning objects instead of arrays for `borderBoxSize` and `contentBoxSize`.\n // @ts-ignore\n entry[boxProp][sizeType];\n}\n\nfunction useResizeObserver(opts) {\n if (opts === void 0) {\n opts = {};\n }\n\n // Saving the callback as a ref. With this, I don't need to put onResize in the\n // effect dep array, and just passing in an anonymous function without memoising\n // will not reinstantiate the hook's ResizeObserver.\n var onResize = opts.onResize;\n var onResizeRef = useRef(undefined);\n onResizeRef.current = onResize;\n var round = opts.round || Math.round; // Using a single instance throughout the hook's lifetime\n\n var resizeObserverRef = useRef();\n\n var _useState = useState({\n width: undefined,\n height: undefined\n }),\n size = _useState[0],\n setSize = _useState[1]; // In certain edge cases the RO might want to report a size change just after\n // the component unmounted.\n\n\n var didUnmount = useRef(false);\n useEffect(function () {\n didUnmount.current = false;\n return function () {\n didUnmount.current = true;\n };\n }, []); // Using a ref to track the previous width / height to avoid unnecessary renders.\n\n var previous = useRef({\n width: undefined,\n height: undefined\n }); // This block is kinda like a useEffect, only it's called whenever a new\n // element could be resolved based on the ref option. It also has a cleanup\n // function.\n\n var refCallback = useResolvedElement(useCallback(function (element) {\n // We only use a single Resize Observer instance, and we're instantiating it on demand, only once there's something to observe.\n // This instance is also recreated when the `box` option changes, so that a new observation is fired if there was a previously observed element with a different box option.\n if (!resizeObserverRef.current || resizeObserverRef.current.box !== opts.box || resizeObserverRef.current.round !== round) {\n resizeObserverRef.current = {\n box: opts.box,\n round: round,\n instance: new ResizeObserver(function (entries) {\n var entry = entries[0];\n var boxProp = opts.box === \"border-box\" ? \"borderBoxSize\" : opts.box === \"device-pixel-content-box\" ? \"devicePixelContentBoxSize\" : \"contentBoxSize\";\n var reportedWidth = extractSize(entry, boxProp, \"inlineSize\");\n var reportedHeight = extractSize(entry, boxProp, \"blockSize\");\n var newWidth = reportedWidth ? round(reportedWidth) : undefined;\n var newHeight = reportedHeight ? round(reportedHeight) : undefined;\n\n if (previous.current.width !== newWidth || previous.current.height !== newHeight) {\n var newSize = {\n width: newWidth,\n height: newHeight\n };\n previous.current.width = newWidth;\n previous.current.height = newHeight;\n\n if (onResizeRef.current) {\n onResizeRef.current(newSize);\n } else {\n if (!didUnmount.current) {\n setSize(newSize);\n }\n }\n }\n })\n };\n }\n\n resizeObserverRef.current.instance.observe(element, {\n box: opts.box\n });\n return function () {\n if (resizeObserverRef.current) {\n resizeObserverRef.current.instance.unobserve(element);\n }\n };\n }, [opts.box, round]), opts.ref);\n return useMemo(function () {\n return {\n ref: refCallback,\n width: size.width,\n height: size.height\n };\n }, [refCallback, size.width, size.height]);\n}\n\nexport { useResizeObserver as default };\n","import { useRef } from 'preact/hooks';\nimport { useThrottledCallback } from 'use-debounce';\nimport useResizeObserver from 'use-resize-observer';\n\nexport default function useTruncated({ className = 'truncated' } = {}) {\n const ref = useRef();\n const onResize = useThrottledCallback(({ height }) => {\n if (ref.current) {\n const { scrollHeight } = ref.current;\n let truncated = scrollHeight > height;\n if (truncated) {\n const { height: _height, maxHeight } = getComputedStyle(ref.current);\n const computedHeight = parseInt(maxHeight || _height, 10);\n truncated = scrollHeight > computedHeight;\n }\n ref.current.classList.toggle(className, truncated);\n }\n }, 300);\n useResizeObserver({\n ref,\n box: 'border-box',\n onResize,\n });\n return ref;\n}\n","export default {\n public: 'earth',\n unlisted: 'group',\n private: 'lock',\n direct: 'message',\n local: 'building',\n};\n","export var styleRoot = 'kvfysmfp';\nexport var styleChild = 'ufhsfnkm';\nexport var styles = \".\".concat(styleRoot, \"{overflow:hidden;touch-action:none}.\").concat(styleChild, \"{transform-origin: 0 0}\");\n","var isSsr = typeof window === 'undefined';\nexport var isTouch = function () {\n return !isSsr && ('ontouchstart' in window || navigator.maxTouchPoints > 0);\n};\nexport var make2dTransformValue = function (_a) {\n var x = _a.x, y = _a.y, scale = _a.scale;\n return \"scale(\".concat(scale, \") translate(\").concat(x, \"px, \").concat(y, \"px)\");\n};\nexport var make3dTransformValue = function (_a) {\n var x = _a.x, y = _a.y, scale = _a.scale;\n return \"scale3d(\".concat(scale, \",\").concat(scale, \", 1) translate3d(\").concat(x, \"px, \").concat(y, \"px, 0)\");\n};\nexport var hasTranslate3DSupport = function () {\n var css = !isSsr && window.CSS;\n return css && css.supports && css.supports('transform', 'translate3d(0,0,0)');\n};\n","var min = Math.min, max = Math.max;\nexport function getOffsetBounds(_a) {\n var containerDimension = _a.containerDimension, childDimension = _a.childDimension, padding = _a.padding, centerContained = _a.centerContained;\n var diff = childDimension - containerDimension;\n if (diff + 2 * padding <= 0 && centerContained) {\n return [diff / 2, diff / 2];\n }\n else {\n return [min(diff + padding, 0) - padding, max(0, diff + padding)];\n }\n}\n","import { __assign, __extends } from \"tslib\";\nimport React, { Component, createRef, Children, cloneElement } from 'react';\nimport { styleRoot, styleChild, styles } from './styles.css';\nimport { isTouch } from '../utils';\nimport { getOffsetBounds } from './getOffsetBounds';\nvar classnames = function (base, other) {\n return other ? \"\".concat(base, \" \").concat(other) : base;\n};\nvar abs = Math.abs, min = Math.min, sqrt = Math.sqrt;\nvar isSsr = typeof window === 'undefined';\nvar isMac = isSsr ? false : /(Mac)/i.test(navigator.platform);\nvar isDragInteraction = function (i) { return i === 'drag'; };\nvar isZoomInteraction = function (i) { return i === 'zoom'; };\nvar isZoomGesture = function (wheelEvent) { return isMac && wheelEvent.ctrlKey; };\nvar cancelEvent = function (event) {\n event.stopPropagation();\n event.preventDefault();\n};\nvar getDistance = function (a, b) {\n var x = a.x - b.x;\n var y = a.y - b.y;\n return sqrt(x * x + y * y);\n};\nvar calculateScale = function (startTouches, endTouches) {\n var startDistance = getDistance(startTouches[0], startTouches[1]);\n var endDistance = getDistance(endTouches[0], endTouches[1]);\n return endDistance / startDistance;\n};\nvar isCloseTo = function (value, expected) {\n return value > expected - 0.01 && value < expected + 0.01;\n};\nvar swing = function (p) { return -Math.cos(p * Math.PI) / 2 + 0.5; };\nvar getPointByPageCoordinates = function (touch) { return ({\n x: touch.pageX,\n y: touch.pageY,\n}); };\nvar getPageCoordinatesByTouches = function (touches) {\n return Array.from(touches).map(getPointByPageCoordinates);\n};\nvar sum = function (a, b) { return a + b; };\nvar getVectorAvg = function (vectors) { return ({\n x: vectors.map(function (_a) {\n var x = _a.x;\n return x;\n }).reduce(sum, 0) / vectors.length,\n y: vectors.map(function (_a) {\n var y = _a.y;\n return y;\n }).reduce(sum, 0) / vectors.length,\n}); };\nvar clamp = function (min, max, value) {\n return value < min ? min : value > max ? max : value;\n};\nvar shouldInterceptWheel = function (event) {\n return !(event.ctrlKey || event.metaKey);\n};\nvar getElementSize = function (element) {\n if (element) {\n var offsetWidth = element.offsetWidth, offsetHeight = element.offsetHeight;\n // Any DOMElement\n if (offsetWidth && offsetHeight) {\n return { width: offsetWidth, height: offsetHeight };\n }\n // Svg support\n var style = getComputedStyle(element);\n var width = parseFloat(style.width);\n var height = parseFloat(style.height);\n if (height && width) {\n return { width: width, height: height };\n }\n }\n return { width: 0, height: 0 };\n};\nvar calculateVelocity = function (startPoint, endPoint) { return ({\n x: endPoint.x - startPoint.x,\n y: endPoint.y - startPoint.y,\n}); };\nvar comparePoints = function (p1, p2) { return p1.x === p2.x && p1.y === p2.y; };\nvar noup = function () { };\nvar zeroPoint = { x: 0, y: 0 };\nvar PinchZoom = /** @class */ (function (_super) {\n __extends(PinchZoom, _super);\n function PinchZoom() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this._prevDragMovePoint = null;\n _this._containerObserver = null;\n _this._fingers = 0;\n _this._firstMove = true;\n _this._initialOffset = __assign({}, zeroPoint);\n _this._interaction = null;\n _this._isDoubleTap = false;\n _this._isOffsetsSet = false;\n _this._lastDragPosition = null;\n _this._lastScale = 1;\n _this._lastTouchStart = 0;\n _this._lastZoomCenter = null;\n _this._listenMouseMove = false;\n _this._nthZoom = 0;\n _this._offset = __assign({}, zeroPoint);\n _this._startOffset = __assign({}, zeroPoint);\n _this._startTouches = null;\n _this._updatePlaned = false;\n _this._wheelTimeOut = null;\n _this._zoomFactor = 1;\n _this._initialZoomFactor = 1;\n _this._draggingPoint = __assign({}, zeroPoint);\n // It help reduce behavior difference between touch and mouse events\n _this._ignoreNextClick = false;\n // @ts-ignore\n _this._containerRef = createRef();\n _this._handleClick = function (clickEvent) {\n if (_this._ignoreNextClick) {\n _this._ignoreNextClick = false;\n clickEvent.stopPropagation();\n }\n };\n _this._onResize = function () {\n var _a;\n if ((_a = _this._containerRef) === null || _a === void 0 ? void 0 : _a.current) {\n _this._updateInitialZoomFactor();\n _this._setupOffsets();\n _this._update();\n }\n };\n _this._handlerOnTouchEnd = _this._handlerIfEnable(function (touchEndEvent) {\n _this._fingers = touchEndEvent.touches.length;\n if (_this.props.shouldCancelHandledTouchEndEvents &&\n (isZoomInteraction(_this._interaction) ||\n (isDragInteraction(_this._interaction) &&\n (_this._startOffset.x !== _this._offset.x ||\n _this._startOffset.y !== _this._offset.y)))) {\n cancelEvent(touchEndEvent);\n }\n if (isDragInteraction(_this._interaction) && !_this._enoughToDrag()) {\n _this._handleClick(touchEndEvent);\n }\n _this._updateInteraction(touchEndEvent);\n });\n _this._handlerOnTouchStart = _this._handlerIfEnable(function (touchStartEvent) {\n _this._firstMove = true;\n _this._fingers = touchStartEvent.touches.length;\n _this._detectDoubleTap(touchStartEvent);\n });\n _this._handlerOnTouchMove = _this._handlerIfEnable(function (touchMoveEvent) {\n if (_this._isDoubleTap) {\n return;\n }\n _this._collectInertia(touchMoveEvent);\n if (_this._firstMove) {\n _this._updateInteraction(touchMoveEvent);\n if (_this._interaction) {\n cancelEvent(touchMoveEvent);\n }\n _this._startOffset = __assign({}, _this._offset);\n _this._startTouches = getPageCoordinatesByTouches(touchMoveEvent.touches);\n }\n else {\n if (isZoomInteraction(_this._interaction)) {\n if (_this._startTouches &&\n _this._startTouches.length === 2 &&\n touchMoveEvent.touches.length === 2) {\n _this._handleZoom(touchMoveEvent, calculateScale(_this._startTouches, getPageCoordinatesByTouches(touchMoveEvent.touches)));\n }\n }\n else if (isDragInteraction(_this._interaction)) {\n _this._handleDrag(touchMoveEvent);\n }\n if (_this._interaction) {\n cancelEvent(touchMoveEvent);\n _this._update();\n }\n }\n _this._firstMove = false;\n });\n _this._handlerWheel = function (wheelEvent) {\n if (_this.props.shouldInterceptWheel(wheelEvent)) {\n return;\n }\n cancelEvent(wheelEvent);\n var pageX = wheelEvent.pageX, pageY = wheelEvent.pageY, deltaY = wheelEvent.deltaY, deltaMode = wheelEvent.deltaMode;\n var scaleDelta = 1;\n if (isZoomGesture(wheelEvent) || deltaMode === 1) {\n scaleDelta = 15;\n }\n var likeTouchEvent = {\n touches: [\n // @ts-ignore\n { pageX: pageX, pageY: pageY },\n ],\n };\n var center = _this._getOffsetByFirstTouch(likeTouchEvent);\n var dScale = deltaY * scaleDelta;\n _this._stopAnimation();\n _this._scaleTo(_this._zoomFactor - dScale / _this.props.wheelScaleFactor, center);\n _this._update();\n clearTimeout(\n // @ts-ignore\n _this._wheelTimeOut);\n _this._wheelTimeOut = setTimeout(function () { return _this._sanitize(); }, 100);\n };\n // @ts-ignore\n _this._handlers = _this.props.isTouch()\n ? [\n ['touchstart', _this._handlerOnTouchStart],\n ['touchend', _this._handlerOnTouchEnd],\n ['touchmove', _this._handlerOnTouchMove],\n ]\n : [\n [\n 'mousemove',\n _this.simulate(_this._handlerOnTouchMove),\n _this.props._document,\n ],\n [\n 'mouseup',\n _this.simulate(_this._handlerOnTouchEnd),\n _this.props._document,\n ],\n ['mousedown', _this.simulate(_this._handlerOnTouchStart)],\n ['click', _this._handleClick],\n ['wheel', _this._handlerWheel],\n ];\n return _this;\n }\n PinchZoom.prototype._handleDragStart = function (event) {\n this._ignoreNextClick = true;\n this.props.onDragStart();\n this._stopAnimation();\n this._resetInertia();\n this._lastDragPosition = null;\n this._hasInteraction = true;\n this._draggingPoint = this._offset;\n this._handleDrag(event);\n };\n PinchZoom.prototype._handleDrag = function (event) {\n var touch = this._getOffsetByFirstTouch(event);\n if (this._enoughToDrag()) {\n this._drag(touch, this._lastDragPosition);\n }\n else {\n this._virtualDrag(touch, this._lastDragPosition);\n }\n this._offset = this._sanitizeOffset(this._offset);\n this._lastDragPosition = touch;\n };\n PinchZoom.prototype._resetInertia = function () {\n this._velocity = null;\n this._prevDragMovePoint = null;\n };\n PinchZoom.prototype._realizeInertia = function () {\n var _this = this;\n var _a = this.props, inertiaFriction = _a.inertiaFriction, inertia = _a.inertia;\n if (!inertia || !this._velocity) {\n return;\n }\n var _b = this._velocity, x = _b.x, y = _b.y;\n if (x || y) {\n this._stopAnimation();\n this._resetInertia();\n var renderFrame = function () {\n x *= inertiaFriction;\n y *= inertiaFriction;\n if (!x && !y) {\n return _this._stopAnimation();\n }\n var prevOffset = __assign({}, _this._offset);\n _this._addOffset({ x: x, y: y });\n _this._offset = _this._sanitizeOffset(_this._offset);\n if (comparePoints(prevOffset, _this._offset)) {\n return _this._stopAnimation();\n }\n _this._update({ isAnimation: true });\n };\n this._animate(renderFrame, { duration: 9999 });\n }\n };\n PinchZoom.prototype._collectInertia = function (_a) {\n var touches = _a.touches;\n if (!this.props.inertia) {\n return;\n }\n var currentCoordinates = getPageCoordinatesByTouches(touches)[0];\n var prevPoint = this._prevDragMovePoint;\n if (prevPoint) {\n this._velocity = calculateVelocity(currentCoordinates, prevPoint);\n }\n this._prevDragMovePoint = currentCoordinates;\n };\n PinchZoom.prototype._handleDragEnd = function () {\n this.props.onDragEnd();\n this._end();\n this._realizeInertia();\n };\n PinchZoom.prototype._handleZoomStart = function () {\n this.props.onZoomStart();\n this._stopAnimation();\n this._lastScale = 1;\n this._nthZoom = 0;\n this._lastZoomCenter = null;\n this._hasInteraction = true;\n };\n PinchZoom.prototype._handleZoom = function (event, newScale) {\n var touchCenter = getVectorAvg(this._getOffsetTouches(event));\n var scale = newScale / this._lastScale;\n this._lastScale = newScale;\n // The first touch events are thrown away since they are not precise\n this._nthZoom += 1;\n if (this._nthZoom > 3) {\n this._scale(scale, touchCenter);\n this._drag(touchCenter, this._lastZoomCenter);\n if (this.props.enforceBoundsDuringZoom) {\n this._offset = this._sanitizeOffset(this._offset);\n }\n }\n this._lastZoomCenter = touchCenter;\n };\n PinchZoom.prototype._handleZoomEnd = function () {\n this.props.onZoomEnd();\n this._end();\n };\n PinchZoom.prototype._handleDoubleTap = function (event) {\n var _this = this;\n if (this._hasInteraction || this.props.tapZoomFactor === 0) {\n return;\n }\n var needZoomOut = (this.props.doubleTapZoomOutOnMaxScale &&\n this._zoomFactor === this.props.maxZoom) ||\n (this.props.doubleTapToggleZoom && this._zoomFactor > 1);\n this.props.onDoubleTap();\n this._ignoreNextClick = true;\n var zoomFactor = this._zoomFactor + this.props.tapZoomFactor;\n var startZoomFactor = this._zoomFactor;\n var updateProgress = function (progress) {\n _this._scaleTo(startZoomFactor + progress * (zoomFactor - startZoomFactor), center);\n };\n var center = this._getOffsetByFirstTouch(event);\n this._isDoubleTap = true;\n if (startZoomFactor > zoomFactor) {\n center = this._getCurrentZoomCenter();\n }\n needZoomOut ? this._zoomOutAnimation() : this._animate(updateProgress);\n };\n PinchZoom.prototype._computeInitialOffset = function () {\n var rect = this._getContainerRect();\n var _a = this._getChildSize(), width = _a.width, height = _a.height;\n var x = -abs(width * this._getInitialZoomFactor() - rect.width) / 2;\n var y = -abs(height * this._getInitialZoomFactor() - rect.height) / 2;\n this._initialOffset = { x: x, y: y };\n };\n PinchZoom.prototype._resetOffset = function () {\n this._offset = __assign({}, this._initialOffset);\n };\n PinchZoom.prototype._setupOffsets = function () {\n if (this.props.setOffsetsOnce && this._isOffsetsSet) {\n return;\n }\n this._isOffsetsSet = true;\n this._computeInitialOffset();\n this._resetOffset();\n };\n PinchZoom.prototype._sanitizeOffset = function (offset) {\n var rect = this._getContainerRect();\n var _a = this._getChildSize(), width = _a.width, height = _a.height;\n var elWidth = width * this._getInitialZoomFactor() * this._zoomFactor;\n var elHeight = height * this._getInitialZoomFactor() * this._zoomFactor;\n var _b = getOffsetBounds({\n containerDimension: rect.width,\n childDimension: elWidth,\n padding: this.props.horizontalPadding,\n centerContained: this.props.centerContained,\n }), minOffsetX = _b[0], maxOffsetX = _b[1];\n var _c = getOffsetBounds({\n containerDimension: rect.height,\n childDimension: elHeight,\n padding: this.props.verticalPadding,\n centerContained: this.props.centerContained,\n }), minOffsetY = _c[0], maxOffsetY = _c[1];\n return {\n x: clamp(minOffsetX, maxOffsetX, offset.x),\n y: clamp(minOffsetY, maxOffsetY, offset.y),\n };\n };\n PinchZoom.prototype.alignCenter = function (options) {\n var _this = this;\n var _a = __assign({ duration: 250, animated: true }, options), __x = _a.x, __y = _a.y, scale = _a.scale, animated = _a.animated, duration = _a.duration;\n // Bug-Fix: https://github.com/retyui/react-quick-pinch-zoom/issues/58\n var x = __x * this._initialZoomFactor;\n var y = __y * this._initialZoomFactor;\n var startZoomFactor = this._zoomFactor;\n var startOffset = __assign({}, this._offset);\n var rect = this._getContainerRect();\n var containerCenter = { x: rect.width / 2, y: rect.height / 2 };\n this._zoomFactor = 1;\n this._offset = { x: -(containerCenter.x - x), y: -(containerCenter.y - y) };\n this._scaleTo(scale, containerCenter);\n this._stopAnimation();\n if (!animated) {\n return this._update();\n }\n var diffZoomFactor = this._zoomFactor - startZoomFactor;\n var diffOffset = {\n x: this._offset.x - startOffset.x,\n y: this._offset.y - startOffset.y,\n };\n this._zoomFactor = startZoomFactor;\n this._offset = __assign({}, startOffset);\n var updateFrame = function (progress) {\n var x = startOffset.x + diffOffset.x * progress;\n var y = startOffset.y + diffOffset.y * progress;\n _this._zoomFactor = startZoomFactor + diffZoomFactor * progress;\n _this._offset = _this._sanitizeOffset({ x: x, y: y });\n _this._update();\n };\n this._animate(updateFrame, {\n callback: function () { return _this._sanitize(); },\n duration: duration,\n });\n };\n PinchZoom.prototype.scaleTo = function (options) {\n var _this = this;\n var _a = __assign({ duration: 250, animated: true }, options), x = _a.x, y = _a.y, scale = _a.scale, animated = _a.animated, duration = _a.duration;\n var startZoomFactor = this._zoomFactor;\n var startOffset = __assign({}, this._offset);\n this._zoomFactor = 1;\n this._offset = { x: 0, y: 0 };\n this._scaleTo(scale, { x: x, y: y });\n this._stopAnimation();\n if (!animated) {\n return this._update();\n }\n var diffZoomFactor = this._zoomFactor - startZoomFactor;\n var diffOffset = {\n x: this._offset.x - startOffset.x,\n y: this._offset.y - startOffset.y,\n };\n this._zoomFactor = startZoomFactor;\n this._offset = __assign({}, startOffset);\n var updateFrame = function (progress) {\n var x = startOffset.x + diffOffset.x * progress;\n var y = startOffset.y + diffOffset.y * progress;\n _this._zoomFactor = startZoomFactor + diffZoomFactor * progress;\n _this._offset = { x: x, y: y };\n _this._update();\n };\n this._animate(updateFrame, { callback: function () { return _this._sanitize(); }, duration: duration });\n };\n PinchZoom.prototype._scaleTo = function (zoomFactor, center) {\n this._scale(zoomFactor / this._zoomFactor, center);\n this._offset = this._sanitizeOffset(this._offset);\n };\n PinchZoom.prototype._scale = function (scale, center) {\n scale = this._scaleZoomFactor(scale);\n this._addOffset({\n x: (scale - 1) * (center.x + this._offset.x),\n y: (scale - 1) * (center.y + this._offset.y),\n });\n this.props.onZoomUpdate();\n };\n PinchZoom.prototype._scaleZoomFactor = function (scale) {\n var originalZoomFactor = this._zoomFactor;\n this._zoomFactor *= scale;\n this._zoomFactor = clamp(this.props.minZoom, this.props.maxZoom, this._zoomFactor);\n return this._zoomFactor / originalZoomFactor;\n };\n PinchZoom.prototype._canDrag = function () {\n return this.props.draggableUnZoomed || !isCloseTo(this._zoomFactor, 1);\n };\n PinchZoom.prototype._drag = function (center, lastCenter) {\n if (lastCenter) {\n var y = -(center.y - lastCenter.y);\n var x = -(center.x - lastCenter.x);\n if (!this.props.lockDragAxis) {\n this._addOffset({\n x: x,\n y: y,\n });\n }\n else {\n // lock scroll to position that was changed the most\n if (abs(x) > abs(y)) {\n this._addOffset({\n x: x,\n y: 0,\n });\n }\n else {\n this._addOffset({\n y: y,\n x: 0,\n });\n }\n }\n this.props.onDragUpdate();\n }\n };\n PinchZoom.prototype._virtualDrag = function (center, lastCenter) {\n if (lastCenter) {\n var y = -(center.y - lastCenter.y);\n var x = -(center.x - lastCenter.x);\n this._draggingPoint = {\n x: x + this._draggingPoint.x,\n y: y + this._draggingPoint.y,\n };\n }\n };\n PinchZoom.prototype._addOffset = function (offset) {\n var _a = this._offset, x = _a.x, y = _a.y;\n this._offset = {\n x: x + offset.x,\n y: y + offset.y,\n };\n };\n PinchZoom.prototype._sanitize = function () {\n if (this._zoomFactor < this.props.zoomOutFactor) {\n this._resetInertia();\n this._zoomOutAnimation();\n }\n else if (this._isInsaneOffset()) {\n this._sanitizeOffsetAnimation();\n }\n };\n PinchZoom.prototype._isInsaneOffset = function () {\n var offset = this._offset;\n var sanitizedOffset = this._sanitizeOffset(offset);\n return sanitizedOffset.x !== offset.x || sanitizedOffset.y !== offset.y;\n };\n PinchZoom.prototype._sanitizeOffsetAnimation = function () {\n var _this = this;\n var targetOffset = this._sanitizeOffset(this._offset);\n var startOffset = __assign({}, this._offset);\n var updateProgress = function (progress) {\n var x = startOffset.x + progress * (targetOffset.x - startOffset.x);\n var y = startOffset.y + progress * (targetOffset.y - startOffset.y);\n _this._offset = { x: x, y: y };\n _this._update();\n };\n this._animate(updateProgress);\n };\n PinchZoom.prototype._zoomOutAnimation = function () {\n var _this = this;\n if (this._zoomFactor === 1) {\n return;\n }\n var startZoomFactor = this._zoomFactor;\n var zoomFactor = 1;\n var center = this._getCurrentZoomCenter();\n var updateProgress = function (progress) {\n var scaleFactor = startZoomFactor + progress * (zoomFactor - startZoomFactor);\n _this._scaleTo(scaleFactor, center);\n };\n this._animate(updateProgress);\n };\n PinchZoom.prototype._getInitialZoomFactor = function () {\n return this._initialZoomFactor;\n };\n PinchZoom.prototype._getCurrentZoomCenter = function () {\n var _a = this._offset, x = _a.x, y = _a.y;\n var offsetLeft = x - this._initialOffset.x;\n var offsetTop = y - this._initialOffset.y;\n return {\n x: -1 * x - offsetLeft / (1 / this._zoomFactor - 1),\n y: -1 * y - offsetTop / (1 / this._zoomFactor - 1),\n };\n };\n PinchZoom.prototype._getOffsetByFirstTouch = function (event) {\n return this._getOffsetTouches(event)[0];\n };\n PinchZoom.prototype._getOffsetTouches = function (event) {\n var _document = this.props._document;\n var _html = _document.documentElement;\n var _body = _document.body;\n var _a = this._getContainerRect(), top = _a.top, left = _a.left;\n var scrollTop = _html.scrollTop || _body.scrollTop;\n var scrollLeft = _html.scrollLeft || _body.scrollLeft;\n var posTop = top + scrollTop;\n var posLeft = left + scrollLeft;\n return getPageCoordinatesByTouches(event.touches).map(function (_a) {\n var x = _a.x, y = _a.y;\n return ({\n x: x - posLeft,\n y: y - posTop,\n });\n });\n };\n PinchZoom.prototype._animate = function (frameFn, options) {\n var _this = this;\n var startTime = new Date().getTime();\n var _a = __assign({ timeFn: swing, callback: function () { }, duration: this.props.animationDuration }, options), timeFn = _a.timeFn, callback = _a.callback, duration = _a.duration;\n var renderFrame = function () {\n if (!_this._inAnimation) {\n return;\n }\n var frameTime = new Date().getTime() - startTime;\n var progress = frameTime / duration;\n if (frameTime >= duration) {\n frameFn(1);\n _this._stopAnimation();\n callback();\n _this._update();\n }\n else {\n progress = timeFn(progress);\n frameFn(progress);\n _this._update({ isAnimation: true });\n requestAnimationFrame(renderFrame);\n }\n };\n this._inAnimation = true;\n requestAnimationFrame(renderFrame);\n };\n PinchZoom.prototype._stopAnimation = function () {\n this._inAnimation = false;\n };\n PinchZoom.prototype._end = function () {\n this._hasInteraction = false;\n this._sanitize();\n this._update();\n };\n PinchZoom.prototype._getContainerRect = function () {\n var div = this._containerRef.current;\n return div.getBoundingClientRect();\n };\n PinchZoom.prototype._getChildSize = function () {\n var div = this._containerRef.current;\n return getElementSize(div === null || div === void 0 ? void 0 : div.firstElementChild);\n };\n PinchZoom.prototype._updateInitialZoomFactor = function () {\n var rect = this._getContainerRect();\n var size = this._getChildSize();\n var xZoomFactor = rect.width / size.width;\n var yZoomFactor = rect.height / size.height;\n this._initialZoomFactor = min(xZoomFactor, yZoomFactor);\n };\n PinchZoom.prototype._bindEvents = function () {\n var _this = this;\n var div = this._containerRef.current;\n if (window.ResizeObserver) {\n this._containerObserver = new ResizeObserver(this._onResize);\n this._containerObserver.observe(div);\n }\n else {\n window.addEventListener('resize', this._onResize);\n }\n this._handlers.forEach(function (_a) {\n var eventName = _a[0], fn = _a[1], target = _a[2];\n (target || div).addEventListener(eventName, fn, true);\n });\n Array.from(div.querySelectorAll('img')).forEach(function (img) {\n return img.addEventListener('load', _this._onResize);\n });\n };\n PinchZoom.prototype._unSubscribe = function () {\n var _this = this;\n var div = this._containerRef.current;\n if (this._containerObserver) {\n this._containerObserver.disconnect();\n this._containerObserver = null;\n }\n window.removeEventListener('resize', this._onResize);\n this._handlers.forEach(function (_a) {\n var eventName = _a[0], fn = _a[1], target = _a[2];\n (target || div).removeEventListener(eventName, fn, true);\n });\n Array.from(div.querySelectorAll('img')).forEach(function (img) {\n return img.removeEventListener('load', _this._onResize);\n });\n };\n PinchZoom.prototype._update = function (options) {\n var _this = this;\n if (this._updatePlaned) {\n return;\n }\n var updateFrame = function () {\n var scale = _this._getInitialZoomFactor() * _this._zoomFactor;\n var x = -_this._offset.x / scale;\n var y = -_this._offset.y / scale;\n _this.props.onUpdate({ scale: scale, x: x, y: y });\n };\n if (options === null || options === void 0 ? void 0 : options.isAnimation) {\n return updateFrame();\n }\n this._updatePlaned = true;\n requestAnimationFrame(function () {\n _this._updatePlaned = false;\n updateFrame();\n });\n };\n PinchZoom.prototype._handlerIfEnable = function (fn) {\n var _this = this;\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n if (_this.props.enabled) {\n fn.apply(void 0, args);\n }\n };\n };\n PinchZoom.prototype._setInteraction = function (newInteraction, event) {\n var interaction = this._interaction;\n if (interaction !== newInteraction) {\n if (interaction && !newInteraction) {\n if (isZoomInteraction(interaction)) {\n this._handleZoomEnd();\n }\n else if (isDragInteraction(interaction)) {\n this._handleDragEnd();\n }\n }\n if (isZoomInteraction(newInteraction)) {\n this._handleZoomStart();\n }\n else if (isDragInteraction(newInteraction)) {\n this._handleDragStart(event);\n }\n }\n this._interaction = newInteraction;\n };\n PinchZoom.prototype._distanceBetweenNumbers = function (a, b) {\n return a > b ? a - b : b - a;\n };\n PinchZoom.prototype._enoughToDrag = function () {\n if (this._distanceBetweenNumbers(this._startOffset.x, this._draggingPoint.x) >\n 5 ||\n this._distanceBetweenNumbers(this._startOffset.y, this._draggingPoint.y) >\n 5)\n return true;\n return false;\n };\n PinchZoom.prototype._updateInteraction = function (event) {\n var fingers = this._fingers;\n if (fingers === 2) {\n return this._setInteraction('zoom', event);\n }\n if (fingers === 1 && this._canDrag()) {\n return this._setInteraction('drag', event);\n }\n this._setInteraction(null, event);\n };\n PinchZoom.prototype._detectDoubleTap = function (event) {\n var time = new Date().getTime();\n if (this._fingers > 1) {\n this._lastTouchStart = 0;\n }\n if (time - this._lastTouchStart < 300) {\n cancelEvent(event);\n this._handleDoubleTap(event);\n if (isZoomInteraction(this._interaction)) {\n this._handleZoomEnd();\n }\n else if (isDragInteraction(this._interaction)) {\n this._handleDragEnd();\n }\n }\n else {\n this._isDoubleTap = false;\n }\n if (this._fingers === 1) {\n this._lastTouchStart = time;\n }\n };\n PinchZoom.prototype.simulate = function (fn) {\n var _this = this;\n return function (mouseEvent) {\n var pageX = mouseEvent.pageX, pageY = mouseEvent.pageY, type = mouseEvent.type;\n var isEnd = type === 'mouseup';\n var isStart = type === 'mousedown';\n if (isStart) {\n mouseEvent.preventDefault();\n _this._listenMouseMove = true;\n }\n if (_this._listenMouseMove) {\n // @ts-ignore\n mouseEvent.touches = isEnd ? [] : [{ pageX: pageX, pageY: pageY }];\n fn(\n // @ts-ignore\n mouseEvent);\n }\n if (isEnd) {\n _this._listenMouseMove = false;\n }\n };\n };\n PinchZoom.prototype.componentDidMount = function () {\n this._bindEvents();\n this._update();\n };\n PinchZoom.prototype.componentWillUnmount = function () {\n this._stopAnimation();\n this._unSubscribe();\n };\n PinchZoom.prototype.render = function () {\n var _a = this.props, children = _a.children, containerProps = _a.containerProps;\n var child = Children.only(children);\n var props = containerProps || {};\n return (React.createElement(React.Fragment, null,\n React.createElement(\"style\", null, styles),\n React.createElement(\"div\", __assign({}, props, { ref: this._containerRef, className: classnames(styleRoot, props.className) }), cloneElement(child, {\n className: classnames(styleChild, child.props.className),\n }))));\n };\n PinchZoom.defaultProps = {\n animationDuration: 250,\n draggableUnZoomed: true,\n enforceBoundsDuringZoom: false,\n centerContained: false,\n enabled: true,\n inertia: true,\n inertiaFriction: 0.96,\n horizontalPadding: 0,\n isTouch: isTouch,\n lockDragAxis: false,\n maxZoom: 5,\n minZoom: 0.5,\n onDoubleTap: noup,\n onDragEnd: noup,\n onDragStart: noup,\n onDragUpdate: noup,\n onZoomEnd: noup,\n onZoomStart: noup,\n onZoomUpdate: noup,\n setOffsetsOnce: false,\n shouldInterceptWheel: shouldInterceptWheel,\n shouldCancelHandledTouchEndEvents: false,\n tapZoomFactor: 1,\n verticalPadding: 0,\n wheelScaleFactor: 1500,\n zoomOutFactor: 1.3,\n doubleTapZoomOutOnMaxScale: false,\n doubleTapToggleZoom: false,\n // @ts-expect-error\n _document: isSsr ? null : window.document,\n };\n return PinchZoom;\n}(Component));\nif (process.env.NODE_ENV !== 'production') {\n var _a = require('prop-types'), any = _a.any, element = _a.element, object = _a.object, number = _a.number, func = _a.func, bool = _a.bool;\n // @ts-ignore\n PinchZoom.propTypes = {\n children: element,\n containerProps: object,\n wheelScaleFactor: number,\n animationDuration: number,\n draggableUnZoomed: bool,\n enforceBoundsDuringZoom: bool,\n centerContained: bool,\n enabled: bool,\n horizontalPadding: number,\n lockDragAxis: bool,\n onUpdate: func.isRequired,\n maxZoom: number,\n minZoom: number,\n onDoubleTap: func,\n onDragEnd: func,\n onDragStart: func,\n onDragUpdate: func,\n onZoomEnd: func,\n onZoomStart: func,\n onZoomUpdate: func,\n setOffsetsOnce: bool,\n tapZoomFactor: number,\n verticalPadding: number,\n zoomOutFactor: number,\n doubleTapZoomOutOnMaxScale: bool,\n doubleTapToggleZoom: bool,\n isTouch: func,\n _document: any,\n };\n}\nexport default PinchZoom;\n","export default function formatDuration(time) {\n if (!time) return;\n let hours = Math.floor(time / 3600);\n let minutes = Math.floor((time % 3600) / 60);\n let seconds = Math.round(time % 60);\n\n if (hours === 0) {\n return `${minutes}:${seconds.toString().padStart(2, '0')}`;\n } else {\n return `${hours}:${minutes.toString().padStart(2, '0')}:${seconds\n .toString()\n .padStart(2, '0')}`;\n }\n}\n","import { t, Trans } from '@lingui/macro';\nimport { getBlurHashAverageColor } from 'fast-blurhash';\nimport { Fragment } from 'preact';\nimport { memo } from 'preact/compat';\nimport {\n useCallback,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'preact/hooks';\nimport QuickPinchZoom, { make3dTransformValue } from 'react-quick-pinch-zoom';\n\nimport formatDuration from '../utils/format-duration';\nimport mem from '../utils/mem';\nimport states from '../utils/states';\n\nimport Icon from './icon';\nimport Link from './link';\n\nconst isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); // https://stackoverflow.com/a/23522755\n\n/*\nMedia type\n===\nunknown = unsupported or unrecognized file type\nimage = Static image\ngifv = Looping, soundless animation\nvideo = Video clip\naudio = Audio track\n*/\n\nconst dataAltLabel = 'ALT';\nconst AltBadge = (props) => {\n const { alt, lang, index, ...rest } = props;\n if (!alt || !alt.trim()) return null;\n return (\n <button\n type=\"button\"\n class=\"alt-badge clickable\"\n {...rest}\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n states.showMediaAlt = {\n alt,\n lang,\n };\n }}\n title={t`Media description`}\n >\n {dataAltLabel}\n {!!index && <sup>{index}</sup>}\n </button>\n );\n};\n\nconst MEDIA_CAPTION_LIMIT = 140;\nconst MEDIA_CAPTION_LIMIT_LONGER = 280;\nexport const isMediaCaptionLong = mem((caption) =>\n caption?.length\n ? caption.length > MEDIA_CAPTION_LIMIT ||\n /[\\n\\r].*[\\n\\r]/.test(caption.trim())\n : false,\n);\n\nfunction Media({\n class: className = '',\n media,\n to,\n lang,\n showOriginal,\n autoAnimate,\n showCaption,\n allowLongerCaption,\n altIndex,\n checkAspectRatio = true,\n onClick = () => {},\n}) {\n let {\n blurhash,\n description,\n meta,\n previewRemoteUrl,\n previewUrl,\n remoteUrl,\n url,\n type,\n } = media;\n if (/no\\-preview\\./i.test(previewUrl)) {\n previewUrl = null;\n }\n const { original = {}, small, focus } = meta || {};\n\n const width = showOriginal\n ? original?.width\n : small?.width || original?.width;\n const height = showOriginal\n ? original?.height\n : small?.height || original?.height;\n const mediaURL = showOriginal ? url : previewUrl || url;\n const remoteMediaURL = showOriginal\n ? remoteUrl\n : previewRemoteUrl || remoteUrl;\n const hasDimensions = width && height;\n const orientation = hasDimensions\n ? width > height\n ? 'landscape'\n : 'portrait'\n : null;\n\n const rgbAverageColor = blurhash ? getBlurHashAverageColor(blurhash) : null;\n\n const videoRef = useRef();\n\n let focalPosition;\n if (focus) {\n // Convert focal point to CSS background position\n // Formula from jquery-focuspoint\n // x = -1, y = 1 => 0% 0%\n // x = 0, y = 0 => 50% 50%\n // x = 1, y = -1 => 100% 100%\n const x = ((focus.x + 1) / 2) * 100;\n const y = ((1 - focus.y) / 2) * 100;\n focalPosition = `${x.toFixed(0)}% ${y.toFixed(0)}%`;\n }\n\n const mediaRef = useRef();\n const onUpdate = useCallback(({ x, y, scale }) => {\n const { current: media } = mediaRef;\n\n if (media) {\n const value = make3dTransformValue({ x, y, scale });\n\n if (scale === 1) {\n media.style.removeProperty('transform');\n } else {\n media.style.setProperty('transform', value);\n }\n\n media.closest('.media-zoom').style.touchAction =\n scale <= 1.01 ? 'pan-x' : '';\n }\n }, []);\n\n const [pinchZoomEnabled, setPinchZoomEnabled] = useState(false);\n const quickPinchZoomProps = {\n enabled: pinchZoomEnabled,\n draggableUnZoomed: false,\n inertiaFriction: 0.9,\n tapZoomFactor: 2,\n doubleTapToggleZoom: true,\n containerProps: {\n className: 'media-zoom',\n style: {\n overflow: 'visible',\n // width: 'inherit',\n // height: 'inherit',\n // justifyContent: 'inherit',\n // alignItems: 'inherit',\n // display: 'inherit',\n },\n },\n onUpdate,\n };\n\n const Parent = useMemo(\n () => (to ? (props) => <Link to={to} {...props} /> : 'div'),\n [to],\n );\n\n const remoteMediaURLObj = remoteMediaURL ? getURLObj(remoteMediaURL) : null;\n const isVideoMaybe =\n type === 'unknown' &&\n remoteMediaURLObj &&\n /\\.(mp4|m4r|m4v|mov|webm)$/i.test(remoteMediaURLObj.pathname);\n const isAudioMaybe =\n type === 'unknown' &&\n remoteMediaURLObj &&\n /\\.(mp3|ogg|wav|m4a|m4p|m4b)$/i.test(remoteMediaURLObj.pathname);\n const isImage =\n type === 'image' ||\n (type === 'unknown' && previewUrl && !isVideoMaybe && !isAudioMaybe);\n\n const parentRef = useRef();\n const [imageSmallerThanParent, setImageSmallerThanParent] = useState(false);\n useLayoutEffect(() => {\n if (!isImage) return;\n if (!showOriginal) return;\n if (!parentRef.current) return;\n const { offsetWidth, offsetHeight } = parentRef.current;\n const smaller = width < offsetWidth && height < offsetHeight;\n if (smaller) setImageSmallerThanParent(smaller);\n }, [width, height]);\n\n const maxAspectHeight =\n window.innerHeight * (orientation === 'portrait' ? 0.45 : 0.33);\n const maxHeight = orientation === 'portrait' ? 0 : 160;\n const averageColorStyle = {\n '--average-color': rgbAverageColor && `rgb(${rgbAverageColor.join(',')})`,\n };\n const mediaStyles =\n width && height\n ? {\n '--width': `${width}px`,\n '--height': `${height}px`,\n // Calculate '--aspectWidth' based on aspect ratio calculated from '--width' and '--height', max height has to be 160px\n '--aspectWidth': `${\n (width / height) * Math.max(maxHeight, maxAspectHeight)\n }px`,\n aspectRatio: `${width} / ${height}`,\n ...averageColorStyle,\n }\n : {\n ...averageColorStyle,\n };\n\n const longDesc = isMediaCaptionLong(description);\n let showInlineDesc =\n !!showCaption && !showOriginal && !!description && !longDesc;\n if (\n allowLongerCaption &&\n !showInlineDesc &&\n description?.length <= MEDIA_CAPTION_LIMIT_LONGER\n ) {\n showInlineDesc = true;\n }\n const Figure = !showInlineDesc\n ? Fragment\n : (props) => {\n const { children, ...restProps } = props;\n return (\n <figure {...restProps}>\n {children}\n <figcaption\n class=\"media-caption\"\n lang={lang}\n dir=\"auto\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n states.showMediaAlt = {\n alt: description,\n lang,\n };\n }}\n >\n {description}\n </figcaption>\n </figure>\n );\n };\n\n const [hasNaturalAspectRatio, setHasNaturalAspectRatio] = useState(undefined);\n\n if (isImage) {\n // Note: type: unknown might not have width/height\n quickPinchZoomProps.containerProps.style.display = 'inherit';\n\n useLayoutEffect(() => {\n if (!isSafari) return;\n if (!showOriginal) return;\n (async () => {\n try {\n await fetch(mediaURL, { mode: 'no-cors' });\n mediaRef.current.src = mediaURL;\n } catch (e) {\n // Ignore\n }\n })();\n }, [mediaURL]);\n\n return (\n <Figure>\n <Parent\n ref={parentRef}\n class={`media media-image ${className}`}\n onClick={onClick}\n data-orientation={orientation}\n data-has-alt={!showInlineDesc || undefined}\n data-has-natural-aspect-ratio={hasNaturalAspectRatio || undefined}\n style={\n showOriginal\n ? {\n backgroundImage: `url(${previewUrl})`,\n backgroundSize: imageSmallerThanParent\n ? `${width}px ${height}px`\n : undefined,\n ...averageColorStyle,\n }\n : mediaStyles\n }\n >\n {showOriginal ? (\n <QuickPinchZoom {...quickPinchZoomProps}>\n <img\n ref={mediaRef}\n src={mediaURL}\n alt={description}\n width={width}\n height={height}\n data-orientation={orientation}\n loading=\"eager\"\n decoding=\"sync\"\n onLoad={(e) => {\n e.target.closest('.media-image').style.backgroundImage = '';\n e.target.closest('.media-zoom').style.display = '';\n setPinchZoomEnabled(true);\n }}\n onError={(e) => {\n const { src } = e.target;\n if (\n src === mediaURL &&\n remoteMediaURL &&\n mediaURL !== remoteMediaURL\n ) {\n e.target.src = remoteMediaURL;\n }\n }}\n />\n </QuickPinchZoom>\n ) : (\n <>\n <img\n src={mediaURL}\n alt={showInlineDesc ? '' : description}\n width={width}\n height={height}\n data-orientation={orientation}\n loading=\"lazy\"\n style={{\n // backgroundColor:\n // rgbAverageColor && `rgb(${rgbAverageColor.join(',')})`,\n // backgroundPosition: focalBackgroundPosition || 'center',\n // Duration based on width or height in pixels\n objectPosition: focalPosition || 'center',\n // 100px per second (rough estimate)\n // Clamp between 5s and 120s\n '--anim-duration': `${Math.min(\n Math.max(Math.max(width, height) / 100, 5),\n 120,\n )}s`,\n }}\n onLoad={(e) => {\n // e.target.closest('.media-image').style.backgroundImage = '';\n e.target.dataset.loaded = true;\n const $media = e.target.closest('.media');\n if (!hasDimensions && $media) {\n const { naturalWidth, naturalHeight } = e.target;\n $media.dataset.orientation =\n naturalWidth > naturalHeight ? 'landscape' : 'portrait';\n $media.style.setProperty('--width', `${naturalWidth}px`);\n $media.style.setProperty('--height', `${naturalHeight}px`);\n $media.style.aspectRatio = `${naturalWidth}/${naturalHeight}`;\n }\n\n // Check natural aspect ratio vs display aspect ratio\n if (checkAspectRatio && $media) {\n const {\n clientWidth,\n clientHeight,\n naturalWidth,\n naturalHeight,\n } = e.target;\n if (\n clientWidth &&\n clientHeight &&\n naturalWidth &&\n naturalHeight\n ) {\n const minDimension = 88;\n if (\n naturalWidth < minDimension ||\n naturalHeight < minDimension\n ) {\n $media.dataset.hasSmallDimension = true;\n } else {\n const displayNaturalHeight =\n (naturalHeight * clientWidth) / naturalWidth;\n const almostSimilarHeight =\n Math.abs(displayNaturalHeight - clientHeight) < 5;\n\n if (almostSimilarHeight) {\n setHasNaturalAspectRatio(true);\n }\n }\n }\n }\n }}\n onError={(e) => {\n const { src } = e.target;\n if (src === mediaURL && mediaURL !== remoteMediaURL) {\n e.target.src = remoteMediaURL;\n }\n }}\n />\n {!showInlineDesc && (\n <AltBadge alt={description} lang={lang} index={altIndex} />\n )}\n </>\n )}\n </Parent>\n </Figure>\n );\n } else if (type === 'gifv' || type === 'video' || isVideoMaybe) {\n const hasDuration = original.duration > 0;\n const shortDuration = original.duration < 31;\n const isGIF = type === 'gifv' && shortDuration;\n // If GIF is too long, treat it as a video\n const loopable = original.duration < 61;\n const formattedDuration = formatDuration(original.duration);\n const hoverAnimate = !showOriginal && !autoAnimate && isGIF;\n const autoGIFAnimate = !showOriginal && autoAnimate && isGIF;\n const showProgress = original.duration > 5;\n\n // This string is only for autoplay + muted to work on Mobile Safari\n const gifHTML = `\n <video\n src=\"${url}\"\n poster=\"${previewUrl}\"\n width=\"${width}\"\n height=\"${height}\"\n data-orientation=\"${orientation}\"\n preload=\"auto\"\n autoplay\n muted\n playsinline\n ${loopable ? 'loop' : ''}\n ondblclick=\"this.paused ? this.play() : this.pause()\"\n ${\n showProgress\n ? \"ontimeupdate=\\\"this.closest('.media-gif') && this.closest('.media-gif').style.setProperty('--progress', `${~~((this.currentTime / this.duration) * 100)}%`)\\\"\"\n : ''\n }\n ></video>\n `;\n\n const videoHTML = `\n <video\n src=\"${url}\"\n poster=\"${previewUrl}\"\n width=\"${width}\"\n height=\"${height}\"\n data-orientation=\"${orientation}\"\n preload=\"auto\"\n autoplay\n playsinline\n ${loopable ? 'loop' : ''}\n controls\n ></video>\n `;\n\n return (\n <Figure>\n <Parent\n class={`media ${className} media-${isGIF ? 'gif' : 'video'} ${\n autoGIFAnimate ? 'media-contain' : ''\n } ${hoverAnimate ? 'media-hover-animate' : ''}`}\n data-orientation={orientation}\n data-formatted-duration={\n !showOriginal ? formattedDuration : undefined\n }\n data-label={\n isGIF && !showOriginal && !autoGIFAnimate ? 'GIF' : undefined\n }\n data-has-alt={!showInlineDesc || undefined}\n // style={{\n // backgroundColor:\n // rgbAverageColor && `rgb(${rgbAverageColor.join(',')})`,\n // }}\n style={!showOriginal && mediaStyles}\n onClick={(e) => {\n if (hoverAnimate) {\n try {\n videoRef.current.pause();\n } catch (e) {}\n }\n onClick(e);\n }}\n onMouseEnter={() => {\n if (hoverAnimate) {\n try {\n videoRef.current.play();\n } catch (e) {}\n }\n }}\n onMouseLeave={() => {\n if (hoverAnimate) {\n try {\n videoRef.current.pause();\n } catch (e) {}\n }\n }}\n onFocus={() => {\n if (hoverAnimate) {\n try {\n videoRef.current.play();\n } catch (e) {}\n }\n }}\n onBlur={() => {\n if (hoverAnimate) {\n try {\n videoRef.current.pause();\n } catch (e) {}\n }\n }}\n >\n {showOriginal || autoGIFAnimate ? (\n isGIF && showOriginal ? (\n <QuickPinchZoom {...quickPinchZoomProps} enabled>\n <div\n ref={mediaRef}\n dangerouslySetInnerHTML={{\n __html: gifHTML,\n }}\n />\n </QuickPinchZoom>\n ) : isGIF ? (\n <div\n class=\"video-container\"\n dangerouslySetInnerHTML={{\n __html: gifHTML,\n }}\n />\n ) : (\n <div\n class=\"video-container\"\n dangerouslySetInnerHTML={{ __html: videoHTML }}\n />\n )\n ) : isGIF ? (\n <video\n ref={videoRef}\n src={url}\n poster={previewUrl}\n width={width}\n height={height}\n data-orientation={orientation}\n preload=\"auto\"\n // controls\n playsinline\n loop\n muted\n onTimeUpdate={\n showProgress\n ? (e) => {\n const { target } = e;\n const container = target?.closest('.media-gif');\n if (container) {\n const percentage =\n (target.currentTime / target.duration) * 100;\n container.style.setProperty(\n '--progress',\n `${percentage}%`,\n );\n }\n }\n : undefined\n }\n />\n ) : (\n <>\n {previewUrl ? (\n <img\n src={previewUrl}\n alt={showInlineDesc ? '' : description}\n width={width}\n height={height}\n data-orientation={orientation}\n loading=\"lazy\"\n decoding=\"async\"\n onLoad={(e) => {\n if (!hasDimensions) {\n const $media = e.target.closest('.media');\n if ($media) {\n const { naturalHeight, naturalWidth } = e.target;\n $media.dataset.orientation =\n naturalWidth > naturalHeight\n ? 'landscape'\n : 'portrait';\n $media.style.setProperty(\n '--width',\n `${naturalWidth}px`,\n );\n $media.style.setProperty(\n '--height',\n `${naturalHeight}px`,\n );\n $media.style.aspectRatio = `${naturalWidth}/${naturalHeight}`;\n }\n }\n }}\n />\n ) : (\n <video\n src={url + '#t=0.1'} // Make Safari show 1st-frame preview\n width={width}\n height={height}\n data-orientation={orientation}\n preload=\"metadata\"\n muted\n disablePictureInPicture\n onLoadedMetadata={(e) => {\n if (!hasDuration) {\n const { duration } = e.target;\n if (duration) {\n const formattedDuration = formatDuration(duration);\n const container = e.target.closest('.media-video');\n if (container) {\n container.dataset.formattedDuration =\n formattedDuration;\n }\n }\n }\n }}\n />\n )}\n <div class=\"media-play\">\n <Icon icon=\"play\" size=\"xl\" alt=\"▶\" />\n </div>\n </>\n )}\n {!showOriginal && !showInlineDesc && (\n <AltBadge alt={description} lang={lang} index={altIndex} />\n )}\n </Parent>\n </Figure>\n );\n } else if (type === 'audio' || isAudioMaybe) {\n const formattedDuration = formatDuration(original.duration);\n return (\n <Figure>\n <Parent\n class={`media media-audio ${className}`}\n data-formatted-duration={\n !showOriginal ? formattedDuration : undefined\n }\n data-has-alt={!showInlineDesc || undefined}\n onClick={onClick}\n style={!showOriginal && mediaStyles}\n >\n {showOriginal ? (\n <audio src={remoteUrl || url} preload=\"none\" controls autoPlay />\n ) : previewUrl ? (\n <img\n src={previewUrl}\n alt={showInlineDesc ? '' : description}\n width={width}\n height={height}\n data-orientation={orientation}\n loading=\"lazy\"\n onError={(e) => {\n try {\n // Remove self if broken\n e.target?.remove?.();\n } catch (e) {}\n }}\n />\n ) : null}\n {!showOriginal && (\n <>\n <div class=\"media-play\">\n <Icon icon=\"play\" size=\"xl\" alt=\"▶\" />\n </div>\n {!showInlineDesc && (\n <AltBadge alt={description} lang={lang} index={altIndex} />\n )}\n </>\n )}\n </Parent>\n </Figure>\n );\n }\n}\n\nfunction getURLObj(url) {\n // Fake base URL if url doesn't have https:// prefix\n return URL.parse(url, location.origin);\n}\n\nexport default memo(Media, (oldProps, newProps) => {\n const oldMedia = oldProps.media || {};\n const newMedia = newProps.media || {};\n\n return (\n oldMedia?.id === newMedia?.id &&\n oldMedia.url === newMedia.url &&\n oldProps.to === newProps.to &&\n oldProps.class === newProps.class\n );\n});\n","import './status.css';\nimport '@justinribeiro/lite-youtube';\n\nimport { msg, plural, Plural, t, Trans } from '@lingui/macro';\nimport { useLingui } from '@lingui/react';\nimport {\n ControlledMenu,\n Menu,\n MenuDivider,\n MenuHeader,\n MenuItem,\n} from '@szhsin/react-menu';\nimport { decodeBlurHash, getBlurHashAverageColor } from 'fast-blurhash';\nimport { shallowEqual } from 'fast-equals';\nimport prettify from 'html-prettify';\nimport pThrottle from 'p-throttle';\nimport { Fragment } from 'preact';\nimport { memo } from 'preact/compat';\nimport {\n useCallback,\n useContext,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'preact/hooks';\nimport punycode from 'punycode/';\nimport { useHotkeys } from 'react-hotkeys-hook';\n// import { detectAll } from 'tinyld/light';\nimport { useLongPress } from 'use-long-press';\nimport { useSnapshot } from 'valtio';\n\nimport CustomEmoji from '../components/custom-emoji';\nimport EmojiText from '../components/emoji-text';\nimport LazyShazam from '../components/lazy-shazam';\nimport Loader from '../components/loader';\nimport MenuConfirm from '../components/menu-confirm';\nimport Menu2 from '../components/menu2';\nimport Modal from '../components/modal';\nimport NameText from '../components/name-text';\nimport Poll from '../components/poll';\nimport { api } from '../utils/api';\nimport emojifyText from '../utils/emojify-text';\nimport enhanceContent from '../utils/enhance-content';\nimport FilterContext from '../utils/filter-context';\nimport { isFiltered } from '../utils/filters';\nimport getTranslateTargetLanguage from '../utils/get-translate-target-language';\nimport getHTMLText from '../utils/getHTMLText';\nimport handleContentLinks from '../utils/handle-content-links';\nimport htmlContentLength from '../utils/html-content-length';\nimport isRTL from '../utils/is-rtl';\nimport isMastodonLinkMaybe from '../utils/isMastodonLinkMaybe';\nimport localeMatch from '../utils/locale-match';\nimport niceDateTime from '../utils/nice-date-time';\nimport openCompose from '../utils/open-compose';\nimport pmem from '../utils/pmem';\nimport safeBoundingBoxPadding from '../utils/safe-bounding-box-padding';\nimport shortenNumber from '../utils/shorten-number';\nimport showCompose from '../utils/show-compose';\nimport showToast from '../utils/show-toast';\nimport { speak, supportsTTS } from '../utils/speech';\nimport states, { getStatus, saveStatus, statusKey } from '../utils/states';\nimport statusPeek from '../utils/status-peek';\nimport store from '../utils/store';\nimport { getCurrentAccountID } from '../utils/store-utils';\nimport supports from '../utils/supports';\nimport unfurlMastodonLink from '../utils/unfurl-link';\nimport useTruncated from '../utils/useTruncated';\nimport visibilityIconsMap from '../utils/visibility-icons-map';\n\nimport Avatar from './avatar';\nimport Icon from './icon';\nimport Link from './link';\nimport Media, { isMediaCaptionLong } from './media';\nimport MenuLink from './menu-link';\nimport RelativeTime from './relative-time';\nimport TranslationBlock from './translation-block';\n\nconst SHOW_COMMENT_COUNT_LIMIT = 280;\nconst INLINE_TRANSLATE_LIMIT = 140;\n\nconst throttle = pThrottle({\n limit: 1,\n interval: 1000,\n});\nfunction fetchAccount(id, masto) {\n return masto.v1.accounts.$select(id).fetch();\n}\nconst memFetchAccount = pmem(throttle(fetchAccount));\n\nconst visibilityText = {\n public: msg`Public`,\n local: msg`Local`,\n unlisted: msg`Unlisted`,\n private: msg`Followers only`,\n direct: msg`Private mention`,\n};\n\nconst isIOS =\n window.ontouchstart !== undefined &&\n /iPad|iPhone|iPod/.test(navigator.userAgent);\n\nconst rtf = new Intl.RelativeTimeFormat();\n\nconst REACTIONS_LIMIT = 80;\n\nfunction getPollText(poll) {\n if (!poll?.options?.length) return '';\n return `📊:\\n${poll.options\n .map(\n (option) =>\n `- ${option.title}${\n option.votesCount >= 0 ? ` (${option.votesCount})` : ''\n }`,\n )\n .join('\\n')}`;\n}\nfunction getPostText(status) {\n const { spoilerText, content, poll } = status;\n return (\n (spoilerText ? `${spoilerText}\\n\\n` : '') +\n getHTMLText(content) +\n getPollText(poll)\n );\n}\n\nfunction isTranslateble(content) {\n if (!content) return false;\n content = content.trim();\n if (!content) return false;\n const text = getHTMLText(content, {\n preProcess: (dom) => {\n // Remove .mention, pre, code, a:has(.invisible)\n for (const a of dom.querySelectorAll(\n '.mention, pre, code, a:has(.invisible)',\n )) {\n a.remove();\n }\n },\n });\n return !!text;\n}\n\nfunction getHTMLTextForDetectLang(content) {\n return getHTMLText(content, {\n preProcess: (dom) => {\n // Remove anything that can skew the language detection\n\n // Remove .mention, .hashtag, pre, code, a:has(.invisible)\n for (const a of dom.querySelectorAll(\n '.mention, .hashtag, pre, code, a:has(.invisible)',\n )) {\n a.remove();\n }\n\n // Remove links that contains text that starts with https?://\n for (const a of dom.querySelectorAll('a')) {\n const text = a.innerText.trim();\n if (text.startsWith('https://') || text.startsWith('http://')) {\n a.remove();\n }\n }\n },\n });\n}\n\nconst HTTP_REGEX = /^http/i;\nconst PostContent =\n /*memo(*/\n ({ post, instance, previewMode }) => {\n const { content, emojis, language, mentions, url } = post;\n\n const divRef = useRef();\n useLayoutEffect(() => {\n if (!divRef.current) return;\n const dom = enhanceContent(content, {\n emojis,\n returnDOM: true,\n });\n // Remove target=\"_blank\" from links\n for (const a of dom.querySelectorAll('a.u-url[target=\"_blank\"]')) {\n if (!HTTP_REGEX.test(a.innerText.trim())) {\n a.removeAttribute('target');\n }\n }\n divRef.current.replaceChildren(dom.cloneNode(true));\n }, [content, emojis.length]);\n\n return (\n <div\n ref={divRef}\n lang={language}\n dir=\"auto\"\n class=\"inner-content\"\n onClick={handleContentLinks({\n mentions,\n instance,\n previewMode,\n statusURL: url,\n })}\n // dangerouslySetInnerHTML={{\n // __html: enhanceContent(content, {\n // emojis,\n // postEnhanceDOM: (dom) => {\n // // Remove target=\"_blank\" from links\n // dom.querySelectorAll('a.u-url[target=\"_blank\"]').forEach((a) => {\n // if (!/http/i.test(a.innerText.trim())) {\n // a.removeAttribute('target');\n // }\n // });\n // },\n // }),\n // }}\n />\n );\n }; /*,\n (oldProps, newProps) => {\n const { post: oldPost } = oldProps;\n const { post: newPost } = newProps;\n return oldPost.content === newPost.content;\n },\n);*/\n\nconst SIZE_CLASS = {\n s: 'small',\n m: 'medium',\n l: 'large',\n};\n\nconst detectLang = pmem(async (text) => {\n const { detectAll } = await import('tinyld/light');\n text = text?.trim();\n\n // Ref: https://github.com/komodojp/tinyld/blob/develop/docs/benchmark.md\n // 500 should be enough for now, also the default max chars for Mastodon\n if (text?.length > 500) {\n return null;\n }\n const langs = detectAll(text);\n const lang = langs[0];\n if (lang?.lang && lang?.accuracy > 0.5) {\n // If > 50% accurate, use it\n // It can be accurate if < 50% but better be safe\n // Though > 50% also can be inaccurate 🤷‍♂️\n return lang.lang;\n }\n return null;\n});\n\nconst readMoreText = msg`Read more →`;\n\n// All this work just to make sure this only lazy-run once\n// Because first run is slow due to intl-localematcher\nconst DIFFERENT_LANG_CHECK = {};\nconst checkDifferentLanguage = (\n language,\n contentTranslationHideLanguages = [],\n) => {\n if (!language) return false;\n const targetLanguage = getTranslateTargetLanguage(true);\n const different =\n language !== targetLanguage &&\n !localeMatch([language], [targetLanguage]) &&\n !contentTranslationHideLanguages.find(\n (l) => language === l || localeMatch([language], [l]),\n );\n DIFFERENT_LANG_CHECK[language + contentTranslationHideLanguages] = true;\n return different;\n};\n\nfunction Status({\n statusID,\n status,\n instance: propInstance,\n size = 'm',\n contentTextWeight,\n readOnly,\n enableCommentHint,\n withinContext,\n skeleton,\n enableTranslate,\n forceTranslate: _forceTranslate,\n previewMode,\n // allowFilters,\n onMediaClick,\n quoted,\n onStatusLinkClick = () => {},\n showFollowedTags,\n allowContextMenu,\n showActionsBar,\n showReplyParent,\n mediaFirst,\n}) {\n const { _ } = useLingui();\n\n if (skeleton) {\n return (\n <div\n class={`status skeleton ${\n mediaFirst ? 'status-media-first small' : ''\n }`}\n >\n {!mediaFirst && <Avatar size=\"xxl\" />}\n <div class=\"container\">\n <div class=\"meta\">\n {(size === 's' || mediaFirst) && <Avatar size=\"m\" />} ███ ████████\n </div>\n <div class=\"content-container\">\n {mediaFirst && <div class=\"media-first-container\" />}\n <div class={`content ${mediaFirst ? 'media-first-content' : ''}`}>\n <p>████ ████████</p>\n </div>\n </div>\n </div>\n </div>\n );\n }\n const { masto, instance, authenticated } = api({ instance: propInstance });\n const { instance: currentInstance } = api();\n const sameInstance = instance === currentInstance;\n\n let sKey = statusKey(statusID || status?.id, instance);\n const snapStates = useSnapshot(states);\n if (!status) {\n status = snapStates.statuses[sKey] || snapStates.statuses[statusID];\n sKey = statusKey(status?.id, instance);\n }\n if (!status) {\n return null;\n }\n\n const {\n account: {\n acct,\n avatar,\n avatarStatic,\n id: accountId,\n url: accountURL,\n displayName,\n username,\n emojis: accountEmojis,\n bot,\n group,\n },\n id,\n repliesCount,\n reblogged,\n reblogsCount,\n favourited,\n favouritesCount,\n bookmarked,\n poll,\n muted,\n sensitive,\n spoilerText,\n visibility, // public, unlisted, private, direct\n language: _language,\n editedAt,\n filtered,\n card,\n createdAt,\n inReplyToId,\n inReplyToAccountId,\n content,\n mentions,\n mediaAttachments,\n reblog,\n uri,\n url,\n emojis,\n tags,\n pinned,\n // Non-API props\n _deleted,\n _pinned,\n // _filtered,\n // Non-Mastodon\n emojiReactions,\n } = status;\n\n const [languageAutoDetected, setLanguageAutoDetected] = useState(null);\n useEffect(() => {\n if (!content) return;\n if (_language) return;\n if (languageAutoDetected) return;\n let timer;\n timer = setTimeout(async () => {\n let detected = await detectLang(getHTMLTextForDetectLang(content));\n setLanguageAutoDetected(detected);\n }, 1000);\n return () => clearTimeout(timer);\n }, [content, _language]);\n const language = _language || languageAutoDetected;\n\n // if (!mediaAttachments?.length) mediaFirst = false;\n const hasMediaAttachments = !!mediaAttachments?.length;\n if (mediaFirst && hasMediaAttachments) size = 's';\n\n const currentAccount = useMemo(() => {\n return getCurrentAccountID();\n }, []);\n const isSelf = useMemo(() => {\n return currentAccount && currentAccount === accountId;\n }, [accountId, currentAccount]);\n\n const filterContext = useContext(FilterContext);\n const filterInfo =\n !isSelf && !readOnly && !previewMode && isFiltered(filtered, filterContext);\n\n if (filterInfo?.action === 'hide') {\n return null;\n }\n\n console.debug('RENDER Status', id, status?.account.displayName, quoted);\n\n const debugHover = (e) => {\n if (e.shiftKey) {\n console.log({\n ...status,\n });\n }\n };\n\n if (/*allowFilters && */ size !== 'l' && filterInfo) {\n return (\n <FilteredStatus\n status={status}\n filterInfo={filterInfo}\n instance={instance}\n containerProps={{\n onMouseEnter: debugHover,\n }}\n showFollowedTags\n quoted={quoted}\n />\n );\n }\n\n const createdAtDate = new Date(createdAt);\n const editedAtDate = new Date(editedAt);\n\n let inReplyToAccountRef = mentions?.find(\n (mention) => mention.id === inReplyToAccountId,\n );\n if (!inReplyToAccountRef && inReplyToAccountId === id) {\n inReplyToAccountRef = { url: accountURL, username, displayName };\n }\n const [inReplyToAccount, setInReplyToAccount] = useState(inReplyToAccountRef);\n if (!withinContext && !inReplyToAccount && inReplyToAccountId) {\n const account = states.accounts[inReplyToAccountId];\n if (account) {\n setInReplyToAccount(account);\n } else {\n memFetchAccount(inReplyToAccountId, masto)\n .then((account) => {\n setInReplyToAccount(account);\n states.accounts[account.id] = account;\n })\n .catch((e) => {});\n }\n }\n const mentionSelf =\n inReplyToAccountId === currentAccount ||\n mentions?.find((mention) => mention.id === currentAccount);\n\n const readingExpandSpoilers = useMemo(() => {\n const prefs = store.account.get('preferences') || {};\n return !!prefs['reading:expand:spoilers'];\n }, []);\n const readingExpandMedia = useMemo(() => {\n // default | show_all | hide_all\n // Ignore hide_all because it means hide *ALL* media including non-sensitive ones\n const prefs = store.account.get('preferences') || {};\n return prefs['reading:expand:media']?.toLowerCase() || 'default';\n }, []);\n // FOR TESTING:\n // const readingExpandSpoilers = true;\n // const readingExpandMedia = 'show_all';\n const showSpoiler =\n previewMode || readingExpandSpoilers || !!snapStates.spoilers[id];\n const showSpoilerMedia =\n previewMode ||\n readingExpandMedia === 'show_all' ||\n !!snapStates.spoilersMedia[id];\n\n if (reblog) {\n // If has statusID, means useItemID (cached in states)\n\n if (group) {\n return (\n <div\n data-state-post-id={sKey}\n class=\"status-group\"\n onMouseEnter={debugHover}\n >\n <div class=\"status-pre-meta\">\n <Icon icon=\"group\" size=\"l\" alt={t`Group`} />{' '}\n <NameText account={status.account} instance={instance} showAvatar />\n </div>\n <Status\n status={statusID ? null : reblog}\n statusID={statusID ? reblog.id : null}\n instance={instance}\n size={size}\n contentTextWeight={contentTextWeight}\n readOnly={readOnly}\n mediaFirst={mediaFirst}\n />\n </div>\n );\n }\n\n return (\n <div\n data-state-post-id={sKey}\n class=\"status-reblog\"\n onMouseEnter={debugHover}\n >\n <div class=\"status-pre-meta\">\n <Icon icon=\"rocket\" size=\"l\" />{' '}\n <Trans>\n <NameText account={status.account} instance={instance} showAvatar />{' '}\n <span>boosted</span>\n </Trans>\n </div>\n <Status\n status={statusID ? null : reblog}\n statusID={statusID ? reblog.id : null}\n instance={instance}\n size={size}\n contentTextWeight={contentTextWeight}\n readOnly={readOnly}\n enableCommentHint\n mediaFirst={mediaFirst}\n />\n </div>\n );\n }\n\n // Check followedTags\n const FollowedTagsParent = useCallback(\n ({ children }) => (\n <div\n data-state-post-id={sKey}\n class=\"status-followed-tags\"\n onMouseEnter={debugHover}\n >\n <div class=\"status-pre-meta\">\n <Icon icon=\"hashtag\" size=\"l\" />{' '}\n {snapStates.statusFollowedTags[sKey].slice(0, 3).map((tag) => (\n <Link\n key={tag}\n to={instance ? `/${instance}/t/${tag}` : `/t/${tag}`}\n class=\"status-followed-tag-item\"\n >\n {tag}\n </Link>\n ))}\n </div>\n {children}\n </div>\n ),\n [sKey, instance, snapStates.statusFollowedTags[sKey]],\n );\n const StatusParent =\n showFollowedTags && !!snapStates.statusFollowedTags[sKey]?.length\n ? FollowedTagsParent\n : Fragment;\n\n const isSizeLarge = size === 'l';\n\n const [forceTranslate, setForceTranslate] = useState(_forceTranslate);\n // const targetLanguage = getTranslateTargetLanguage(true);\n // const contentTranslationHideLanguages =\n // snapStates.settings.contentTranslationHideLanguages || [];\n const { contentTranslation, contentTranslationAutoInline } =\n snapStates.settings;\n if (!contentTranslation) enableTranslate = false;\n const inlineTranslate = useMemo(() => {\n if (\n !contentTranslation ||\n !contentTranslationAutoInline ||\n readOnly ||\n (withinContext && !isSizeLarge) ||\n previewMode ||\n spoilerText ||\n sensitive ||\n poll ||\n card ||\n mediaAttachments?.length\n ) {\n return false;\n }\n const contentLength = htmlContentLength(content);\n return contentLength > 0 && contentLength <= INLINE_TRANSLATE_LIMIT;\n }, [\n contentTranslation,\n contentTranslationAutoInline,\n readOnly,\n withinContext,\n isSizeLarge,\n previewMode,\n spoilerText,\n sensitive,\n poll,\n card,\n mediaAttachments,\n content,\n ]);\n\n const [showEdited, setShowEdited] = useState(false);\n const [showEmbed, setShowEmbed] = useState(false);\n\n const spoilerContentRef = useTruncated();\n const contentRef = useTruncated();\n const mediaContainerRef = useTruncated();\n\n const statusRef = useRef(null);\n\n const unauthInteractionErrorMessage = t`Sorry, your current logged-in instance can't interact with this post from another instance.`;\n\n const textWeight = useCallback(\n () =>\n Math.max(\n Math.round((spoilerText.length + htmlContentLength(content)) / 140) ||\n 1,\n 1,\n ),\n [spoilerText, content],\n );\n\n const createdDateText = niceDateTime(createdAtDate);\n const editedDateText = editedAt && niceDateTime(editedAtDate);\n\n // Can boost if:\n // - authenticated AND\n // - visibility != direct OR\n // - visibility = private AND isSelf\n let canBoost =\n authenticated && visibility !== 'direct' && visibility !== 'private';\n if (visibility === 'private' && isSelf) {\n canBoost = true;\n }\n\n const replyStatus = (e) => {\n if (!sameInstance || !authenticated) {\n return alert(unauthInteractionErrorMessage);\n }\n // syntheticEvent comes from MenuItem\n if (e?.shiftKey || e?.syntheticEvent?.shiftKey) {\n const newWin = openCompose({\n replyToStatus: status,\n });\n if (newWin) return;\n }\n showCompose({\n replyToStatus: status,\n });\n };\n\n // Check if media has no descriptions\n const mediaNoDesc = useMemo(() => {\n return mediaAttachments.some(\n (attachment) => !attachment.description?.trim?.(),\n );\n }, [mediaAttachments]);\n\n const statusMonthsAgo = useMemo(() => {\n return Math.floor(\n (new Date() - createdAtDate) / (1000 * 60 * 60 * 24 * 30),\n );\n }, [createdAtDate]);\n\n // const boostStatus = async () => {\n // if (!sameInstance || !authenticated) {\n // alert(unauthInteractionErrorMessage);\n // return false;\n // }\n // try {\n // if (!reblogged) {\n // let confirmText = 'Boost this post?';\n // if (mediaNoDesc) {\n // confirmText += '\\n\\n⚠ Some media have no descriptions.';\n // }\n // const yes = confirm(confirmText);\n // if (!yes) {\n // return false;\n // }\n // }\n // // Optimistic\n // states.statuses[sKey] = {\n // ...status,\n // reblogged: !reblogged,\n // reblogsCount: reblogsCount + (reblogged ? -1 : 1),\n // };\n // if (reblogged) {\n // const newStatus = await masto.v1.statuses.$select(id).unreblog();\n // saveStatus(newStatus, instance);\n // return true;\n // } else {\n // const newStatus = await masto.v1.statuses.$select(id).reblog();\n // saveStatus(newStatus, instance);\n // return true;\n // }\n // } catch (e) {\n // console.error(e);\n // // Revert optimistism\n // states.statuses[sKey] = status;\n // return false;\n // }\n // };\n const confirmBoostStatus = async () => {\n if (!sameInstance || !authenticated) {\n alert(unauthInteractionErrorMessage);\n return false;\n }\n try {\n // Optimistic\n states.statuses[sKey] = {\n ...status,\n reblogged: !reblogged,\n reblogsCount: reblogsCount + (reblogged ? -1 : 1),\n };\n if (reblogged) {\n const newStatus = await masto.v1.statuses.$select(id).unreblog();\n saveStatus(newStatus, instance);\n } else {\n const newStatus = await masto.v1.statuses.$select(id).reblog();\n saveStatus(newStatus, instance);\n }\n return true;\n } catch (e) {\n console.error(e);\n // Revert optimistism\n states.statuses[sKey] = status;\n return false;\n }\n };\n\n const favouriteStatus = async () => {\n if (!sameInstance || !authenticated) {\n alert(unauthInteractionErrorMessage);\n return false;\n }\n try {\n // Optimistic\n states.statuses[sKey] = {\n ...status,\n favourited: !favourited,\n favouritesCount: favouritesCount + (favourited ? -1 : 1),\n };\n if (favourited) {\n const newStatus = await masto.v1.statuses.$select(id).unfavourite();\n saveStatus(newStatus, instance);\n } else {\n const newStatus = await masto.v1.statuses.$select(id).favourite();\n saveStatus(newStatus, instance);\n }\n return true;\n } catch (e) {\n console.error(e);\n // Revert optimistism\n states.statuses[sKey] = status;\n return false;\n }\n };\n const favouriteStatusNotify = async () => {\n try {\n const done = await favouriteStatus();\n if (!isSizeLarge && done) {\n showToast(\n favourited\n ? t`Unliked @${username || acct}'s post`\n : t`Liked @${username || acct}'s post`,\n );\n }\n } catch (e) {}\n };\n\n const bookmarkStatus = async () => {\n if (!supports('@mastodon/post-bookmark')) return;\n if (!sameInstance || !authenticated) {\n alert(unauthInteractionErrorMessage);\n return false;\n }\n try {\n // Optimistic\n states.statuses[sKey] = {\n ...status,\n bookmarked: !bookmarked,\n };\n if (bookmarked) {\n const newStatus = await masto.v1.statuses.$select(id).unbookmark();\n saveStatus(newStatus, instance);\n } else {\n const newStatus = await masto.v1.statuses.$select(id).bookmark();\n saveStatus(newStatus, instance);\n }\n return true;\n } catch (e) {\n console.error(e);\n // Revert optimistism\n states.statuses[sKey] = status;\n return false;\n }\n };\n const bookmarkStatusNotify = async () => {\n try {\n const done = await bookmarkStatus();\n if (!isSizeLarge && done) {\n showToast(\n bookmarked\n ? t`Unbookmarked @${username || acct}'s post`\n : t`Bookmarked @${username || acct}'s post`,\n );\n }\n } catch (e) {}\n };\n\n // const differentLanguage =\n // !!language &&\n // language !== targetLanguage &&\n // !localeMatch([language], [targetLanguage]) &&\n // !contentTranslationHideLanguages.find(\n // (l) => language === l || localeMatch([language], [l]),\n // );\n const contentTranslationHideLanguages =\n snapStates.settings.contentTranslationHideLanguages || [];\n const [differentLanguage, setDifferentLanguage] = useState(\n DIFFERENT_LANG_CHECK[language + contentTranslationHideLanguages]\n ? checkDifferentLanguage(language, contentTranslationHideLanguages)\n : false,\n );\n useEffect(() => {\n if (\n !language ||\n differentLanguage ||\n DIFFERENT_LANG_CHECK[language + contentTranslationHideLanguages]\n ) {\n return;\n }\n let timeout = setTimeout(() => {\n const different = checkDifferentLanguage(\n language,\n contentTranslationHideLanguages,\n );\n if (different) setDifferentLanguage(different);\n }, 1);\n return () => clearTimeout(timeout);\n }, [language, differentLanguage, contentTranslationHideLanguages]);\n\n const reblogIterator = useRef();\n const favouriteIterator = useRef();\n async function fetchBoostedLikedByAccounts(firstLoad) {\n if (firstLoad) {\n reblogIterator.current = masto.v1.statuses\n .$select(statusID)\n .rebloggedBy.list({\n limit: REACTIONS_LIMIT,\n });\n favouriteIterator.current = masto.v1.statuses\n .$select(statusID)\n .favouritedBy.list({\n limit: REACTIONS_LIMIT,\n });\n }\n const [{ value: reblogResults }, { value: favouriteResults }] =\n await Promise.allSettled([\n reblogIterator.current.next(),\n favouriteIterator.current.next(),\n ]);\n if (reblogResults.value?.length || favouriteResults.value?.length) {\n const accounts = [];\n if (reblogResults.value?.length) {\n accounts.push(\n ...reblogResults.value.map((a) => {\n a._types = ['reblog'];\n return a;\n }),\n );\n }\n if (favouriteResults.value?.length) {\n accounts.push(\n ...favouriteResults.value.map((a) => {\n a._types = ['favourite'];\n return a;\n }),\n );\n }\n return {\n value: accounts,\n done: reblogResults.done && favouriteResults.done,\n };\n }\n return {\n value: [],\n done: true,\n };\n }\n\n const actionsRef = useRef();\n const isPublic = ['public', 'unlisted'].includes(visibility);\n const isPinnable = ['public', 'unlisted', 'private'].includes(visibility);\n const StatusMenuItems = (\n <>\n {!isSizeLarge && sameInstance && (\n <>\n <div class=\"menu-control-group-horizontal status-menu\">\n <MenuItem onClick={replyStatus}>\n <Icon icon=\"comment\" />\n <span>\n {repliesCount > 0 ? shortenNumber(repliesCount) : t`Reply`}\n </span>\n </MenuItem>\n <MenuConfirm\n subMenu\n confirmLabel={\n <>\n <Icon icon=\"rocket\" />\n <span>{reblogged ? t`Unboost` : t`Boost`}</span>\n </>\n }\n className={`menu-reblog ${reblogged ? 'checked' : ''}`}\n menuExtras={\n <MenuItem\n onClick={() => {\n showCompose({\n draftStatus: {\n status: `\\n${url}`,\n },\n });\n }}\n >\n <Icon icon=\"quote\" />\n <span>\n <Trans>Quote</Trans>\n </span>\n </MenuItem>\n }\n menuFooter={\n mediaNoDesc && !reblogged ? (\n <div class=\"footer\">\n <Icon icon=\"alert\" />\n <Trans>Some media have no descriptions.</Trans>\n </div>\n ) : (\n statusMonthsAgo >= 3 && (\n <div class=\"footer\">\n <Icon icon=\"info\" />\n <span>\n <Trans>\n Old post (\n <strong>\n {rtf.format(-statusMonthsAgo, 'month')}\n </strong>\n )\n </Trans>\n </span>\n </div>\n )\n )\n }\n disabled={!canBoost}\n onClick={async () => {\n try {\n const done = await confirmBoostStatus();\n if (!isSizeLarge && done) {\n showToast(\n reblogged\n ? t`Unboosted @${username || acct}'s post`\n : t`Boosted @${username || acct}'s post`,\n );\n }\n } catch (e) {}\n }}\n >\n <Icon icon=\"rocket\" />\n <span>\n {reblogsCount > 0\n ? shortenNumber(reblogsCount)\n : reblogged\n ? t`Unboost`\n : t`Boost…`}\n </span>\n </MenuConfirm>\n <MenuItem\n onClick={favouriteStatusNotify}\n className={`menu-favourite ${favourited ? 'checked' : ''}`}\n >\n <Icon icon=\"heart\" />\n <span>\n {favouritesCount > 0\n ? shortenNumber(favouritesCount)\n : favourited\n ? t`Unlike`\n : t`Like`}\n </span>\n </MenuItem>\n {supports('@mastodon/post-bookmark') && (\n <MenuItem\n onClick={bookmarkStatusNotify}\n className={`menu-bookmark ${bookmarked ? 'checked' : ''}`}\n >\n <Icon icon=\"bookmark\" />\n <span>{bookmarked ? t`Unbookmark` : t`Bookmark`}</span>\n </MenuItem>\n )}\n </div>\n </>\n )}\n {!isSizeLarge && sameInstance && (isSizeLarge || showActionsBar) && (\n <MenuDivider />\n )}\n {(isSizeLarge || showActionsBar) && (\n <>\n <MenuItem\n onClick={() => {\n states.showGenericAccounts = {\n heading: t`Boosted/Liked by…`,\n fetchAccounts: fetchBoostedLikedByAccounts,\n instance,\n showReactions: true,\n postID: sKey,\n };\n }}\n >\n <Icon icon=\"react\" />\n <span>\n <Trans>Boosted/Liked by…</Trans>\n </span>\n </MenuItem>\n </>\n )}\n {!mediaFirst && (\n <>\n {(enableTranslate || !language || differentLanguage) && (\n <MenuDivider />\n )}\n {enableTranslate ? (\n <div class={supportsTTS ? 'menu-horizontal' : ''}>\n <MenuItem\n disabled={forceTranslate}\n onClick={() => {\n setForceTranslate(true);\n }}\n >\n <Icon icon=\"translate\" />\n <span>\n <Trans>Translate</Trans>\n </span>\n </MenuItem>\n {supportsTTS && (\n <MenuItem\n onClick={() => {\n const postText = getPostText(status);\n if (postText) {\n speak(postText, language);\n }\n }}\n >\n <Icon icon=\"speak\" />\n <span>\n <Trans>Speak</Trans>\n </span>\n </MenuItem>\n )}\n </div>\n ) : (\n (!language || differentLanguage) && (\n <div class={supportsTTS ? 'menu-horizontal' : ''}>\n <MenuLink\n to={`${instance ? `/${instance}` : ''}/s/${id}?translate=1`}\n >\n <Icon icon=\"translate\" />\n <span>\n <Trans>Translate</Trans>\n </span>\n </MenuLink>\n {supportsTTS && (\n <MenuItem\n onClick={() => {\n const postText = getPostText(status);\n if (postText) {\n speak(postText, language);\n }\n }}\n >\n <Icon icon=\"speak\" />\n <span>\n <Trans>Speak</Trans>\n </span>\n </MenuItem>\n )}\n </div>\n )\n )}\n </>\n )}\n {((!isSizeLarge && sameInstance) ||\n enableTranslate ||\n !language ||\n differentLanguage) && <MenuDivider />}\n {!isSizeLarge && (\n <>\n <MenuLink\n to={instance ? `/${instance}/s/${id}` : `/s/${id}`}\n onClick={(e) => {\n onStatusLinkClick(e, status);\n }}\n >\n <Icon icon=\"arrows-right\" />\n <small>\n <Trans>\n View post by{' '}\n <span class=\"bidi-isolate\">@{username || acct}</span>\n </Trans>\n <br />\n <span class=\"more-insignificant\">\n {_(visibilityText[visibility])} • {createdDateText}\n </span>\n </small>\n </MenuLink>\n </>\n )}\n {!!editedAt && (\n <>\n <MenuItem\n onClick={() => {\n setShowEdited(id);\n }}\n >\n <Icon icon=\"history\" />\n <small>\n <Trans>Show Edit History</Trans>\n <br />\n <span class=\"more-insignificant\">\n <Trans>Edited: {editedDateText}</Trans>\n </span>\n </small>\n </MenuItem>\n </>\n )}\n <MenuItem href={url} target=\"_blank\">\n <Icon icon=\"external\" />\n <small\n class=\"menu-double-lines\"\n style={{\n maxWidth: '16em',\n }}\n >\n {nicePostURL(url)}\n </small>\n </MenuItem>\n <div class=\"menu-horizontal\">\n <MenuItem\n onClick={() => {\n // Copy url to clipboard\n try {\n navigator.clipboard.writeText(url);\n showToast(t`Link copied`);\n } catch (e) {\n console.error(e);\n showToast(t`Unable to copy link`);\n }\n }}\n >\n <Icon icon=\"link\" />\n <span>\n <Trans>Copy</Trans>\n </span>\n </MenuItem>\n {isPublic &&\n navigator?.share &&\n navigator?.canShare?.({\n url,\n }) && (\n <MenuItem\n onClick={() => {\n try {\n navigator.share({\n url,\n });\n } catch (e) {\n console.error(e);\n alert(t`Sharing doesn't seem to work.`);\n }\n }}\n >\n <Icon icon=\"share\" />\n <span>\n <Trans>Share…</Trans>\n </span>\n </MenuItem>\n )}\n </div>\n {isPublic && isSizeLarge && (\n <MenuItem\n onClick={() => {\n setShowEmbed(true);\n }}\n >\n <Icon icon=\"code\" />\n <span>\n <Trans>Embed post</Trans>\n </span>\n </MenuItem>\n )}\n {(isSelf || mentionSelf) && <MenuDivider />}\n {(isSelf || mentionSelf) && (\n <MenuItem\n onClick={async () => {\n try {\n const newStatus = await masto.v1.statuses\n .$select(id)\n [muted ? 'unmute' : 'mute']();\n saveStatus(newStatus, instance);\n showToast(\n muted ? t`Conversation unmuted` : t`Conversation muted`,\n );\n } catch (e) {\n console.error(e);\n showToast(\n muted\n ? t`Unable to unmute conversation`\n : t`Unable to mute conversation`,\n );\n }\n }}\n >\n {muted ? (\n <>\n <Icon icon=\"unmute\" />\n <span>\n <Trans>Unmute conversation</Trans>\n </span>\n </>\n ) : (\n <>\n <Icon icon=\"mute\" />\n <span>\n <Trans>Mute conversation</Trans>\n </span>\n </>\n )}\n </MenuItem>\n )}\n {isSelf && isPinnable && (\n <MenuItem\n onClick={async () => {\n try {\n const newStatus = await masto.v1.statuses\n .$select(id)\n [pinned ? 'unpin' : 'pin']();\n saveStatus(newStatus, instance);\n showToast(\n pinned\n ? t`Post unpinned from profile`\n : t`Post pinned to profile`,\n );\n } catch (e) {\n console.error(e);\n showToast(\n pinned ? t`Unable to unpin post` : t`Unable to pin post`,\n );\n }\n }}\n >\n {pinned ? (\n <>\n <Icon icon=\"unpin\" />\n <span>\n <Trans>Unpin from profile</Trans>\n </span>\n </>\n ) : (\n <>\n <Icon icon=\"pin\" />\n <span>\n <Trans>Pin to profile</Trans>\n </span>\n </>\n )}\n </MenuItem>\n )}\n {isSelf && (\n <div class=\"menu-horizontal\">\n {supports('@mastodon/post-edit') && (\n <MenuItem\n onClick={() => {\n showCompose({\n editStatus: status,\n });\n }}\n >\n <Icon icon=\"pencil\" />\n <span>\n <Trans>Edit</Trans>\n </span>\n </MenuItem>\n )}\n {isSizeLarge && (\n <MenuConfirm\n subMenu\n confirmLabel={\n <>\n <Icon icon=\"trash\" />\n <span>\n <Trans>Delete this post?</Trans>\n </span>\n </>\n }\n itemProps={{\n className: 'danger',\n }}\n menuItemClassName=\"danger\"\n onClick={() => {\n // const yes = confirm('Delete this post?');\n // if (yes) {\n (async () => {\n try {\n await masto.v1.statuses.$select(id).remove();\n const cachedStatus = getStatus(id, instance);\n cachedStatus._deleted = true;\n showToast(t`Post deleted`);\n } catch (e) {\n console.error(e);\n showToast(t`Unable to delete post`);\n }\n })();\n // }\n }}\n >\n <Icon icon=\"trash\" />\n <span>\n <Trans>Delete…</Trans>\n </span>\n </MenuConfirm>\n )}\n </div>\n )}\n {!isSelf && isSizeLarge && (\n <>\n <MenuDivider />\n <MenuItem\n className=\"danger\"\n onClick={() => {\n states.showReportModal = {\n account: status.account,\n post: status,\n };\n }}\n >\n <Icon icon=\"flag\" />\n <span>\n <Trans>Report post…</Trans>\n </span>\n </MenuItem>\n </>\n )}\n </>\n );\n\n const contextMenuRef = useRef();\n const [isContextMenuOpen, setIsContextMenuOpen] = useState(false);\n const [contextMenuProps, setContextMenuProps] = useState({});\n\n const showContextMenu =\n allowContextMenu || (!isSizeLarge && !previewMode && !_deleted && !quoted);\n\n // Only iOS/iPadOS browsers don't support contextmenu\n // Some comments report iPadOS might support contextmenu if a mouse is connected\n const bindLongPressContext = useLongPress(\n isIOS && showContextMenu\n ? (e) => {\n if (e.pointerType === 'mouse') return;\n // There's 'pen' too, but not sure if contextmenu event would trigger from a pen\n\n const { clientX, clientY } = e.touches?.[0] || e;\n // link detection copied from onContextMenu because here it works\n const link = e.target.closest('a');\n if (\n link &&\n statusRef.current.contains(link) &&\n !link.getAttribute('href').startsWith('#')\n )\n return;\n e.preventDefault();\n setContextMenuProps({\n anchorPoint: {\n x: clientX,\n y: clientY,\n },\n direction: 'right',\n });\n setIsContextMenuOpen(true);\n }\n : null,\n {\n threshold: 600,\n captureEvent: true,\n detect: 'touch',\n cancelOnMovement: 2, // true allows movement of up to 25 pixels\n },\n );\n\n const hotkeysEnabled = !readOnly && !previewMode && !quoted;\n const rRef = useHotkeys('r, shift+r', replyStatus, {\n enabled: hotkeysEnabled,\n });\n const fRef = useHotkeys('f, l', favouriteStatusNotify, {\n enabled: hotkeysEnabled,\n });\n const dRef = useHotkeys('d', bookmarkStatusNotify, {\n enabled: hotkeysEnabled,\n });\n const bRef = useHotkeys(\n 'shift+b',\n () => {\n (async () => {\n try {\n const done = await confirmBoostStatus();\n if (!isSizeLarge && done) {\n showToast(\n reblogged\n ? t`Unboosted @${username || acct}'s post`\n : t`Boosted @${username || acct}'s post`,\n );\n }\n } catch (e) {}\n })();\n },\n {\n enabled: hotkeysEnabled && canBoost,\n },\n );\n const xRef = useHotkeys('x', (e) => {\n const activeStatus = document.activeElement.closest(\n '.status-link, .status-focus',\n );\n if (activeStatus) {\n const spoilerButton = activeStatus.querySelector(\n '.spoiler-button:not(.spoiling)',\n );\n if (spoilerButton) {\n e.stopPropagation();\n spoilerButton.click();\n } else {\n const spoilerMediaButton = activeStatus.querySelector(\n '.spoiler-media-button:not(.spoiling)',\n );\n if (spoilerMediaButton) {\n e.stopPropagation();\n spoilerMediaButton.click();\n }\n }\n }\n });\n\n const displayedMediaAttachments = mediaAttachments.slice(\n 0,\n isSizeLarge ? undefined : 4,\n );\n const showMultipleMediaCaptions =\n mediaAttachments.length > 1 &&\n displayedMediaAttachments.some(\n (media) => !!media.description && !isMediaCaptionLong(media.description),\n );\n const captionChildren = useMemo(() => {\n if (!showMultipleMediaCaptions) return null;\n const attachments = [];\n displayedMediaAttachments.forEach((media, i) => {\n if (!media.description) return;\n const index = attachments.findIndex(\n (attachment) => attachment.media.description === media.description,\n );\n if (index === -1) {\n attachments.push({\n media,\n indices: [i],\n });\n } else {\n attachments[index].indices.push(i);\n }\n });\n return attachments.map(({ media, indices }) => (\n <div\n key={media.id}\n data-caption-index={indices.map((i) => i + 1).join(' ')}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n states.showMediaAlt = {\n alt: media.description,\n lang: language,\n };\n }}\n title={media.description}\n >\n <sup>{indices.map((i) => i + 1).join(' ')}</sup> {media.description}\n </div>\n ));\n\n // return displayedMediaAttachments.map(\n // (media, i) =>\n // !!media.description && (\n // <div\n // key={media.id}\n // data-caption-index={i + 1}\n // onClick={(e) => {\n // e.preventDefault();\n // e.stopPropagation();\n // states.showMediaAlt = {\n // alt: media.description,\n // lang: language,\n // };\n // }}\n // title={media.description}\n // >\n // <sup>{i + 1}</sup> {media.description}\n // </div>\n // ),\n // );\n }, [showMultipleMediaCaptions, displayedMediaAttachments, language]);\n\n const isThread = useMemo(() => {\n return (\n (!!inReplyToId && inReplyToAccountId === status.account?.id) ||\n !!snapStates.statusThreadNumber[sKey]\n );\n }, [\n inReplyToId,\n inReplyToAccountId,\n status.account?.id,\n snapStates.statusThreadNumber[sKey],\n ]);\n\n const showCommentHint = useMemo(() => {\n return (\n enableCommentHint &&\n !isThread &&\n !withinContext &&\n !inReplyToId &&\n visibility === 'public' &&\n repliesCount > 0\n );\n }, [\n enableCommentHint,\n isThread,\n withinContext,\n inReplyToId,\n repliesCount,\n visibility,\n ]);\n const showCommentCount = useMemo(() => {\n if (\n card ||\n poll ||\n sensitive ||\n spoilerText ||\n mediaAttachments?.length ||\n isThread ||\n withinContext ||\n inReplyToId ||\n repliesCount <= 0\n ) {\n return false;\n }\n const questionRegex = /[???︖❓❔⁇⁈⁉¿‽؟]/;\n const containsQuestion = questionRegex.test(content);\n if (!containsQuestion) return false;\n const contentLength = htmlContentLength(content);\n if (contentLength > 0 && contentLength <= SHOW_COMMENT_COUNT_LIMIT) {\n return true;\n }\n }, [\n card,\n poll,\n sensitive,\n spoilerText,\n mediaAttachments,\n reblog,\n isThread,\n withinContext,\n inReplyToId,\n repliesCount,\n content,\n ]);\n\n return (\n <StatusParent>\n {showReplyParent && !!(inReplyToId && inReplyToAccountId) && (\n <StatusCompact sKey={sKey} />\n )}\n <article\n data-state-post-id={sKey}\n ref={(node) => {\n statusRef.current = node;\n // Use parent node if it's in focus\n // Use case: <a><status /></a>\n // When navigating (j/k), the <a> is focused instead of <status />\n // Hotkey binding doesn't bubble up thus this hack\n const nodeRef =\n node?.closest?.(\n '.timeline-item, .timeline-item-alt, .status-link, .status-focus',\n ) || node;\n rRef(nodeRef);\n fRef(nodeRef);\n dRef(nodeRef);\n bRef(nodeRef);\n xRef(nodeRef);\n }}\n tabindex=\"-1\"\n class={`status ${\n !withinContext && inReplyToId && inReplyToAccount\n ? 'status-reply-to'\n : ''\n } visibility-${visibility} ${_pinned ? 'status-pinned' : ''} ${\n SIZE_CLASS[size]\n } ${_deleted ? 'status-deleted' : ''} ${quoted ? 'status-card' : ''} ${\n isContextMenuOpen ? 'status-menu-open' : ''\n } ${mediaFirst && hasMediaAttachments ? 'status-media-first' : ''}`}\n onMouseEnter={debugHover}\n onContextMenu={(e) => {\n if (!showContextMenu) return;\n if (e.metaKey) return;\n // console.log('context menu', e);\n const link = e.target.closest('a');\n if (\n link &&\n statusRef.current.contains(link) &&\n !link.getAttribute('href').startsWith('#')\n )\n return;\n\n // If there's selected text, don't show custom context menu\n const selection = window.getSelection?.();\n if (selection.toString().length > 0) {\n const { anchorNode } = selection;\n if (statusRef.current?.contains(anchorNode)) {\n return;\n }\n }\n e.preventDefault();\n setContextMenuProps({\n anchorPoint: {\n x: e.clientX,\n y: e.clientY,\n },\n direction: 'right',\n });\n setIsContextMenuOpen(true);\n }}\n {...(showContextMenu ? bindLongPressContext() : {})}\n >\n {showContextMenu && (\n <ControlledMenu\n ref={contextMenuRef}\n state={isContextMenuOpen ? 'open' : undefined}\n {...contextMenuProps}\n onClose={(e) => {\n setIsContextMenuOpen(false);\n // statusRef.current?.focus?.();\n if (e?.reason === 'click') {\n statusRef.current?.closest('[tabindex]')?.focus?.();\n }\n }}\n portal={{\n target: document.body,\n }}\n containerProps={{\n style: {\n // Higher than the backdrop\n zIndex: 1001,\n },\n onClick: () => {\n contextMenuRef.current?.closeMenu?.();\n },\n }}\n overflow=\"auto\"\n boundingBoxPadding={safeBoundingBoxPadding()}\n unmountOnClose\n >\n {StatusMenuItems}\n </ControlledMenu>\n )}\n {showActionsBar &&\n size !== 'l' &&\n !previewMode &&\n !readOnly &&\n !_deleted &&\n !quoted && (\n <div\n class={`status-actions ${\n isContextMenuOpen === 'actions-bar' ? 'open' : ''\n }`}\n ref={actionsRef}\n >\n <StatusButton\n size=\"s\"\n title={t`Reply`}\n alt={t`Reply`}\n class=\"reply-button\"\n icon=\"comment\"\n iconSize=\"m\"\n onClick={replyStatus}\n />\n <StatusButton\n size=\"s\"\n checked={favourited}\n title={[t`Like`, t`Unlike`]}\n alt={[t`Like`, t`Liked`]}\n class=\"favourite-button\"\n icon=\"heart\"\n iconSize=\"m\"\n count={favouritesCount}\n onClick={favouriteStatusNotify}\n />\n <button\n type=\"button\"\n title={t`More`}\n class=\"plain more-button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setContextMenuProps({\n anchorRef: {\n current: e.currentTarget,\n },\n align: 'start',\n direction: 'left',\n gap: 0,\n shift: -8,\n });\n setIsContextMenuOpen('actions-bar');\n }}\n >\n <Icon icon=\"more2\" size=\"m\" alt={t`More`} />\n </button>\n </div>\n )}\n {size !== 'l' && (\n <div class=\"status-badge\">\n {reblogged && (\n <Icon class=\"reblog\" icon=\"rocket\" size=\"s\" alt={t`Boosted`} />\n )}\n {favourited && (\n <Icon class=\"favourite\" icon=\"heart\" size=\"s\" alt={t`Liked`} />\n )}\n {bookmarked && (\n <Icon\n class=\"bookmark\"\n icon=\"bookmark\"\n size=\"s\"\n alt={t`Bookmarked`}\n />\n )}\n {_pinned && (\n <Icon class=\"pin\" icon=\"pin\" size=\"s\" alt={t`Pinned`} />\n )}\n </div>\n )}\n {size !== 's' && (\n <a\n href={accountURL}\n tabindex=\"-1\"\n // target=\"_blank\"\n title={`@${acct}`}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n states.showAccount = {\n account: status.account,\n instance,\n };\n }}\n >\n <Avatar url={avatarStatic || avatar} size=\"xxl\" squircle={bot} />\n </a>\n )}\n <div class=\"container\">\n <div class=\"meta\">\n <span class=\"meta-name\">\n <NameText\n account={status.account}\n instance={instance}\n showAvatar={size === 's'}\n showAcct={isSizeLarge}\n />\n </span>\n {/* {inReplyToAccount && !withinContext && size !== 's' && (\n <>\n {' '}\n <span class=\"ib\">\n <Icon icon=\"arrow-right\" class=\"arrow\" />{' '}\n <NameText account={inReplyToAccount} instance={instance} short />\n </span>\n </>\n )} */}\n {/* </span> */}{' '}\n {size !== 'l' &&\n (_deleted ? (\n <span class=\"status-deleted-tag\">\n <Trans>Deleted</Trans>\n </span>\n ) : url && !previewMode && !readOnly && !quoted ? (\n <Link\n to={instance ? `/${instance}/s/${id}` : `/s/${id}`}\n onClick={(e) => {\n if (\n e.metaKey ||\n e.ctrlKey ||\n e.shiftKey ||\n e.altKey ||\n e.which === 2\n ) {\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n onStatusLinkClick?.(e, status);\n setContextMenuProps({\n anchorRef: {\n current: e.currentTarget,\n },\n align: 'end',\n direction: 'bottom',\n gap: 4,\n });\n setIsContextMenuOpen(true);\n }}\n class={`time ${\n isContextMenuOpen && contextMenuProps?.anchorRef\n ? 'is-open'\n : ''\n }`}\n >\n {showCommentHint && !showCommentCount ? (\n <Icon\n icon=\"comment2\"\n size=\"s\"\n // alt={`${repliesCount} ${\n // repliesCount === 1 ? 'reply' : 'replies'\n // }`}\n alt={plural(repliesCount, {\n one: '# reply',\n other: '# replies',\n })}\n />\n ) : (\n visibility !== 'public' &&\n visibility !== 'direct' && (\n <Icon\n icon={visibilityIconsMap[visibility]}\n alt={_(visibilityText[visibility])}\n size=\"s\"\n />\n )\n )}{' '}\n <RelativeTime datetime={createdAtDate} format=\"micro\" />\n {!previewMode && !readOnly && (\n <Icon icon=\"more2\" class=\"more\" alt={t`More`} />\n )}\n </Link>\n ) : (\n // <Menu\n // instanceRef={menuInstanceRef}\n // portal={{\n // target: document.body,\n // }}\n // containerProps={{\n // style: {\n // // Higher than the backdrop\n // zIndex: 1001,\n // },\n // onClick: (e) => {\n // if (e.target === e.currentTarget)\n // menuInstanceRef.current?.closeMenu?.();\n // },\n // }}\n // align=\"end\"\n // gap={4}\n // overflow=\"auto\"\n // viewScroll=\"close\"\n // boundingBoxPadding=\"8 8 8 8\"\n // unmountOnClose\n // menuButton={({ open }) => (\n // <Link\n // to={instance ? `/${instance}/s/${id}` : `/s/${id}`}\n // onClick={(e) => {\n // e.preventDefault();\n // e.stopPropagation();\n // onStatusLinkClick?.(e, status);\n // }}\n // class={`time ${open ? 'is-open' : ''}`}\n // >\n // <Icon\n // icon={visibilityIconsMap[visibility]}\n // alt={visibilityText[visibility]}\n // size=\"s\"\n // />{' '}\n // <RelativeTime datetime={createdAtDate} format=\"micro\" />\n // </Link>\n // )}\n // >\n // {StatusMenuItems}\n // </Menu>\n <span class=\"time\">\n {visibility !== 'public' && visibility !== 'direct' && (\n <>\n <Icon\n icon={visibilityIconsMap[visibility]}\n alt={_(visibilityText[visibility])}\n size=\"s\"\n />{' '}\n </>\n )}\n <RelativeTime datetime={createdAtDate} format=\"micro\" />\n </span>\n ))}\n </div>\n {visibility === 'direct' && (\n <>\n <div class=\"status-direct-badge\">\n <Trans>Private mention</Trans>\n </div>{' '}\n </>\n )}\n {!withinContext && (\n <>\n {isThread ? (\n <div class=\"status-thread-badge\">\n <Icon icon=\"thread\" size=\"s\" />\n <Trans>\n Thread\n {snapStates.statusThreadNumber[sKey]\n ? ` ${snapStates.statusThreadNumber[sKey]}/X`\n : ''}\n </Trans>\n </div>\n ) : (\n !!inReplyToId &&\n !!inReplyToAccount &&\n (!!spoilerText ||\n !mentions.find((mention) => {\n return mention.id === inReplyToAccountId;\n })) && (\n <div class=\"status-reply-badge\">\n <Icon icon=\"reply\" />{' '}\n <NameText\n account={inReplyToAccount}\n instance={instance}\n short\n />\n </div>\n )\n )}\n </>\n )}\n <div\n class={`content-container ${\n spoilerText || sensitive ? 'has-spoiler' : ''\n } ${showSpoiler ? 'show-spoiler' : ''} ${\n showSpoilerMedia ? 'show-media' : ''\n }`}\n data-content-text-weight={contentTextWeight ? textWeight() : null}\n style={\n (isSizeLarge || contentTextWeight) && {\n '--content-text-weight': textWeight(),\n }\n }\n >\n {mediaFirst && hasMediaAttachments ? (\n <>\n {(!!spoilerText || !!sensitive) && !readingExpandSpoilers && (\n <>\n {!!spoilerText && (\n <span\n class=\"spoiler-content media-first-spoiler-content\"\n lang={language}\n dir=\"auto\"\n ref={spoilerContentRef}\n data-read-more={_(readMoreText)}\n >\n <EmojiText text={spoilerText} emojis={emojis} />{' '}\n </span>\n )}\n <button\n class={`light spoiler-button media-first-spoiler-button ${\n showSpoiler ? 'spoiling' : ''\n }`}\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n if (showSpoiler) {\n delete states.spoilers[id];\n if (!readingExpandSpoilers) {\n delete states.spoilersMedia[id];\n }\n } else {\n states.spoilers[id] = true;\n if (!readingExpandSpoilers) {\n states.spoilersMedia[id] = true;\n }\n }\n }}\n >\n <Icon icon={showSpoiler ? 'eye-open' : 'eye-close'} />{' '}\n {showSpoiler ? t`Show less` : t`Show content`}\n </button>\n </>\n )}\n <MediaFirstContainer\n mediaAttachments={mediaAttachments}\n language={language}\n postID={id}\n instance={instance}\n />\n {!!content && (\n <div class=\"media-first-content content\" ref={contentRef}>\n <PostContent\n post={status}\n instance={instance}\n previewMode={previewMode}\n />\n </div>\n )}\n </>\n ) : (\n <>\n {!!spoilerText && (\n <>\n <div\n class=\"content spoiler-content\"\n lang={language}\n dir=\"auto\"\n ref={spoilerContentRef}\n data-read-more={_(readMoreText)}\n >\n <p>\n <EmojiText text={spoilerText} emojis={emojis} />\n </p>\n </div>\n {readingExpandSpoilers || previewMode ? (\n <div class=\"spoiler-divider\">\n <Icon icon=\"eye-open\" /> <Trans>Content warning</Trans>\n </div>\n ) : (\n <button\n class={`light spoiler-button ${\n showSpoiler ? 'spoiling' : ''\n }`}\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n if (showSpoiler) {\n delete states.spoilers[id];\n if (!readingExpandSpoilers) {\n delete states.spoilersMedia[id];\n }\n } else {\n states.spoilers[id] = true;\n if (!readingExpandSpoilers) {\n states.spoilersMedia[id] = true;\n }\n }\n }}\n >\n <Icon icon={showSpoiler ? 'eye-open' : 'eye-close'} />{' '}\n {showSpoiler ? t`Show less` : t`Show content`}\n </button>\n )}\n </>\n )}\n {!!content && (\n <div\n class=\"content\"\n ref={contentRef}\n data-read-more={_(readMoreText)}\n inert={!!spoilerText && !showSpoiler ? true : undefined}\n >\n <PostContent\n post={status}\n instance={instance}\n previewMode={previewMode}\n />\n <QuoteStatuses id={id} instance={instance} level={quoted} />\n </div>\n )}\n {!!poll && (\n <Poll\n lang={language}\n poll={poll}\n readOnly={readOnly || !sameInstance || !authenticated}\n onUpdate={(newPoll) => {\n states.statuses[sKey].poll = newPoll;\n }}\n refresh={() => {\n return masto.v1.polls\n .$select(poll.id)\n .fetch()\n .then((pollResponse) => {\n states.statuses[sKey].poll = pollResponse;\n })\n .catch((e) => {}); // Silently fail\n }}\n votePoll={(choices) => {\n return masto.v1.polls\n .$select(poll.id)\n .votes.create({\n choices,\n })\n .then((pollResponse) => {\n states.statuses[sKey].poll = pollResponse;\n })\n .catch((e) => {}); // Silently fail\n }}\n />\n )}\n {(((enableTranslate || inlineTranslate) &&\n isTranslateble(content) &&\n differentLanguage) ||\n forceTranslate) && (\n <TranslationBlock\n forceTranslate={forceTranslate || inlineTranslate}\n mini={!isSizeLarge && !withinContext}\n sourceLanguage={language}\n autoDetected={languageAutoDetected}\n text={getPostText(status)}\n />\n )}\n {!previewMode &&\n sensitive &&\n !!mediaAttachments.length &&\n readingExpandMedia !== 'show_all' && (\n <button\n class={`plain spoiler-media-button ${\n showSpoilerMedia ? 'spoiling' : ''\n }`}\n type=\"button\"\n hidden={!readingExpandSpoilers && !!spoilerText}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n if (showSpoilerMedia) {\n delete states.spoilersMedia[id];\n } else {\n states.spoilersMedia[id] = true;\n }\n }}\n >\n <Icon\n icon={showSpoilerMedia ? 'eye-open' : 'eye-close'}\n />{' '}\n {showSpoilerMedia ? t`Show less` : t`Show media`}\n </button>\n )}\n {!!mediaAttachments.length &&\n (mediaAttachments.length > 1 &&\n (isSizeLarge || (withinContext && size === 'm')) ? (\n <div class=\"media-large-container\">\n {mediaAttachments.map((media, i) => (\n <div key={media.id} class={`media-container media-eq1`}>\n <Media\n media={media}\n autoAnimate\n showCaption\n allowLongerCaption={!content}\n lang={language}\n to={`/${instance}/s/${id}?${\n withinContext ? 'media' : 'media-only'\n }=${i + 1}`}\n onClick={\n onMediaClick\n ? (e) => onMediaClick(e, i, media, status)\n : undefined\n }\n />\n </div>\n ))}\n </div>\n ) : (\n <MultipleMediaFigure\n lang={language}\n enabled={showMultipleMediaCaptions}\n captionChildren={captionChildren}\n >\n <div\n ref={mediaContainerRef}\n class={`media-container media-eq${\n mediaAttachments.length\n } ${mediaAttachments.length > 2 ? 'media-gt2' : ''} ${\n mediaAttachments.length > 4 ? 'media-gt4' : ''\n }`}\n >\n {displayedMediaAttachments.map((media, i) => (\n <Media\n key={media.id}\n media={media}\n autoAnimate={isSizeLarge}\n showCaption={mediaAttachments.length === 1}\n allowLongerCaption={\n !content && mediaAttachments.length === 1\n }\n lang={language}\n altIndex={\n showMultipleMediaCaptions &&\n !!media.description &&\n i + 1\n }\n to={`/${instance}/s/${id}?${\n withinContext ? 'media' : 'media-only'\n }=${i + 1}`}\n onClick={\n onMediaClick\n ? (e) => {\n onMediaClick(e, i, media, status);\n }\n : undefined\n }\n checkAspectRatio={mediaAttachments.length === 1}\n />\n ))}\n </div>\n </MultipleMediaFigure>\n ))}\n {!!card &&\n /^https/i.test(card?.url) &&\n !sensitive &&\n !spoilerText &&\n !poll &&\n !mediaAttachments.length &&\n !snapStates.statusQuotes[sKey] && (\n <Card\n card={card}\n selfReferential={\n card?.url === status.url || card?.url === status.uri\n }\n selfAuthor={card?.authors?.some(\n (a) => a.account?.url === accountURL,\n )}\n instance={currentInstance}\n />\n )}\n </>\n )}\n </div>\n {!isSizeLarge && showCommentCount && (\n <div class=\"content-comment-hint insignificant\">\n <Icon icon=\"comment2\" alt={t`Replies`} /> {repliesCount}\n </div>\n )}\n {isSizeLarge && (\n <>\n <div class=\"extra-meta\">\n {_deleted ? (\n <span class=\"status-deleted-tag\">\n <Trans>Deleted</Trans>\n </span>\n ) : (\n <>\n {/* <Icon\n icon={visibilityIconsMap[visibility]}\n alt={visibilityText[visibility]}\n /> */}\n <span>{_(visibilityText[visibility])}</span> &bull;{' '}\n <a href={url} target=\"_blank\" rel=\"noopener noreferrer\">\n {\n // within a day\n new Date().getTime() - createdAtDate.getTime() <\n 86400000 && (\n <>\n <RelativeTime\n datetime={createdAtDate}\n format=\"micro\"\n />{' '}\n {' '}\n </>\n )\n }\n <time\n class=\"created\"\n datetime={createdAtDate.toISOString()}\n title={createdAtDate.toLocaleString()}\n >\n {createdDateText}\n </time>\n </a>\n {editedAt && (\n <>\n {' '}\n &bull; <Icon icon=\"pencil\" alt={t`Edited`} />{' '}\n <time\n tabIndex=\"0\"\n class=\"edited\"\n datetime={editedAtDate.toISOString()}\n onClick={() => {\n setShowEdited(id);\n }}\n >\n {editedDateText}\n </time>\n </>\n )}\n </>\n )}\n </div>\n {!!emojiReactions?.length && (\n <div class=\"emoji-reactions\">\n {emojiReactions.map((emojiReaction) => {\n const { name, count, me, url, staticUrl } = emojiReaction;\n if (url) {\n // Some servers return url and staticUrl\n return (\n <span\n class={`emoji-reaction tag ${\n me ? '' : 'insignificant'\n }`}\n >\n <CustomEmoji\n alt={name}\n url={url}\n staticUrl={staticUrl}\n />{' '}\n {count}\n </span>\n );\n }\n const isShortCode = /^:.+?:$/.test(name);\n if (isShortCode) {\n const emoji = emojis.find(\n (e) =>\n e.shortcode ===\n name.replace(/^:/, '').replace(/:$/, ''),\n );\n if (emoji) {\n return (\n <span\n class={`emoji-reaction tag ${\n me ? '' : 'insignificant'\n }`}\n >\n <CustomEmoji\n alt={name}\n url={emoji.url}\n staticUrl={emoji.staticUrl}\n />{' '}\n {count}\n </span>\n );\n }\n }\n return (\n <span\n class={`emoji-reaction tag ${\n me ? '' : 'insignificant'\n }`}\n >\n {name} {count}\n </span>\n );\n })}\n </div>\n )}\n <div class={`actions ${_deleted ? 'disabled' : ''}`}>\n <div class=\"action has-count\">\n <StatusButton\n title={t`Reply`}\n alt={t`Comments`}\n class=\"reply-button\"\n icon=\"comment\"\n count={repliesCount}\n onClick={replyStatus}\n />\n </div>\n {/* <div class=\"action has-count\">\n <StatusButton\n checked={reblogged}\n title={['Boost', 'Unboost']}\n alt={['Boost', 'Boosted']}\n class=\"reblog-button\"\n icon=\"rocket\"\n count={reblogsCount}\n onClick={boostStatus}\n disabled={!canBoost}\n />\n </div> */}\n <MenuConfirm\n disabled={!canBoost}\n onClick={confirmBoostStatus}\n confirmLabel={\n <>\n <Icon icon=\"rocket\" />\n <span>{reblogged ? t`Unboost` : t`Boost`}</span>\n </>\n }\n menuExtras={\n <MenuItem\n onClick={() => {\n showCompose({\n draftStatus: {\n status: `\\n${url}`,\n },\n });\n }}\n >\n <Icon icon=\"quote\" />\n <span>\n <Trans>Quote</Trans>\n </span>\n </MenuItem>\n }\n menuFooter={\n mediaNoDesc &&\n !reblogged && (\n <div class=\"footer\">\n <Icon icon=\"alert\" />\n <Trans>Some media have no descriptions.</Trans>\n </div>\n )\n }\n >\n <div class=\"action has-count\">\n <StatusButton\n checked={reblogged}\n title={[t`Boost`, t`Unboost`]}\n alt={[t`Boost`, t`Boosted`]}\n class=\"reblog-button\"\n icon=\"rocket\"\n count={reblogsCount}\n // onClick={boostStatus}\n disabled={!canBoost}\n />\n </div>\n </MenuConfirm>\n <div class=\"action has-count\">\n <StatusButton\n checked={favourited}\n title={[t`Like`, t`Unlike`]}\n alt={[t`Like`, t`Liked`]}\n class=\"favourite-button\"\n icon=\"heart\"\n count={favouritesCount}\n onClick={favouriteStatus}\n />\n </div>\n {supports('@mastodon/post-bookmark') && (\n <div class=\"action\">\n <StatusButton\n checked={bookmarked}\n title={[t`Bookmark`, t`Unbookmark`]}\n alt={[t`Bookmark`, t`Bookmarked`]}\n class=\"bookmark-button\"\n icon=\"bookmark\"\n onClick={bookmarkStatus}\n />\n </div>\n )}\n <Menu2\n portal={{\n target:\n document.querySelector('.status-deck') || document.body,\n }}\n align=\"end\"\n gap={4}\n overflow=\"auto\"\n viewScroll=\"close\"\n menuButton={\n <div class=\"action\">\n <button\n type=\"button\"\n title={t`More`}\n class=\"plain more-button\"\n >\n <Icon icon=\"more\" size=\"l\" alt={t`More`} />\n </button>\n </div>\n }\n >\n {StatusMenuItems}\n </Menu2>\n </div>\n </>\n )}\n </div>\n {!!showEdited && (\n <Modal\n onClick={(e) => {\n if (e.target === e.currentTarget) {\n setShowEdited(false);\n // statusRef.current?.focus();\n }\n }}\n >\n <EditedAtModal\n statusID={showEdited}\n instance={instance}\n fetchStatusHistory={() => {\n return masto.v1.statuses.$select(showEdited).history.list();\n }}\n onClose={() => {\n setShowEdited(false);\n statusRef.current?.focus();\n }}\n />\n </Modal>\n )}\n {!!showEmbed && (\n <Modal\n onClick={(e) => {\n if (e.target === e.currentTarget) {\n setShowEmbed(false);\n }\n }}\n >\n <EmbedModal\n post={status}\n instance={instance}\n onClose={() => {\n setShowEmbed(false);\n }}\n />\n </Modal>\n )}\n </article>\n </StatusParent>\n );\n}\n\nfunction MultipleMediaFigure(props) {\n const { enabled, children, lang, captionChildren } = props;\n if (!enabled || !captionChildren) return children;\n return (\n <figure class=\"media-figure-multiple\">\n {children}\n <figcaption lang={lang} dir=\"auto\">\n {captionChildren}\n </figcaption>\n </figure>\n );\n}\n\nfunction MediaFirstContainer(props) {\n const { mediaAttachments, language, postID, instance } = props;\n const moreThanOne = mediaAttachments.length > 1;\n\n const carouselRef = useRef();\n const [currentIndex, setCurrentIndex] = useState(0);\n\n useEffect(() => {\n let handleScroll = () => {\n const { clientWidth, scrollLeft } = carouselRef.current;\n const index = Math.round(Math.abs(scrollLeft) / clientWidth);\n setCurrentIndex(index);\n };\n if (carouselRef.current) {\n carouselRef.current.addEventListener('scroll', handleScroll, {\n passive: true,\n });\n }\n return () => {\n if (carouselRef.current) {\n carouselRef.current.removeEventListener('scroll', handleScroll);\n }\n };\n }, []);\n\n return (\n <>\n <div class=\"media-first-container\">\n <div class=\"media-first-carousel\" ref={carouselRef}>\n {mediaAttachments.map((media, i) => (\n <div class=\"media-first-item\" key={media.id}>\n <Media\n media={media}\n lang={language}\n to={`/${instance}/s/${postID}?media=${i + 1}`}\n />\n </div>\n ))}\n </div>\n {moreThanOne && (\n <div class=\"media-carousel-controls\">\n <div class=\"carousel-indexer\">\n {currentIndex + 1}/{mediaAttachments.length}\n </div>\n <label class=\"media-carousel-button\">\n <button\n type=\"button\"\n class=\"carousel-button\"\n hidden={currentIndex === 0}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n carouselRef.current.focus();\n carouselRef.current.scrollTo({\n left:\n carouselRef.current.clientWidth *\n (currentIndex - 1) *\n (isRTL() ? -1 : 1),\n behavior: 'smooth',\n });\n }}\n >\n <Icon icon=\"arrow-left\" />\n </button>\n </label>\n <label class=\"media-carousel-button\">\n <button\n type=\"button\"\n class=\"carousel-button\"\n hidden={currentIndex === mediaAttachments.length - 1}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n carouselRef.current.focus();\n carouselRef.current.scrollTo({\n left:\n carouselRef.current.clientWidth *\n (currentIndex + 1) *\n (isRTL() ? -1 : 1),\n behavior: 'smooth',\n });\n }}\n >\n <Icon icon=\"arrow-right\" />\n </button>\n </label>\n </div>\n )}\n </div>\n {moreThanOne && (\n <div\n class=\"media-carousel-dots\"\n style={{\n '--dots-count': mediaAttachments.length,\n }}\n >\n {mediaAttachments.map((media, i) => (\n <span\n key={media.id}\n class={`carousel-dot ${i === currentIndex ? 'active' : ''}`}\n />\n ))}\n </div>\n )}\n </>\n );\n}\n\nfunction getDomain(url) {\n return punycode.toUnicode(\n URL.parse(url)\n .hostname.replace(/^www\\./, '')\n .replace(/\\/$/, ''),\n );\n}\n\n// \"Post\": Quote post + card link preview combo\n// Assume all links from these domains are \"posts\"\n// Mastodon links are \"posts\" too but they are converted to real quote posts and there's too many domains to check\n// This is just \"Progressive Enhancement\"\nfunction isCardPost(domain) {\n return ['x.com', 'twitter.com', 'threads.net', 'bsky.app'].includes(domain);\n}\n\nfunction Byline({ authors, hidden, children }) {\n if (hidden) return children;\n if (!authors?.[0]?.account?.id) return children;\n const author = authors[0].account;\n\n return (\n <div class=\"card-byline\">\n {children}\n <div class=\"card-byline-author\">\n <Icon icon=\"link\" size=\"s\" />{' '}\n <small>\n <Trans comment=\"More from [Author]\">\n More from <NameText account={author} showAvatar />\n </Trans>\n </small>\n </div>\n </div>\n );\n}\n\nfunction Card({ card, selfReferential, selfAuthor, instance }) {\n const snapStates = useSnapshot(states);\n const {\n blurhash,\n title,\n description,\n html,\n providerName,\n providerUrl,\n authorName,\n authorUrl,\n width,\n height,\n image,\n imageDescription,\n url,\n type,\n embedUrl,\n language,\n publishedAt,\n authors,\n } = card;\n\n /* type\n link = Link OEmbed\n photo = Photo OEmbed\n video = Video OEmbed\n rich = iframe OEmbed. Not currently accepted, so wont show up in practice.\n */\n\n const hasText = title || providerName || authorName;\n const isLandscape = width / height >= 1.2;\n const size = isLandscape ? 'large' : '';\n\n const [cardStatusURL, setCardStatusURL] = useState(null);\n // const [cardStatusID, setCardStatusID] = useState(null);\n useEffect(() => {\n if (hasText && image && !selfReferential && isMastodonLinkMaybe(url)) {\n unfurlMastodonLink(instance, url).then((result) => {\n if (!result) return;\n const { id, url } = result;\n setCardStatusURL('#' + url);\n\n // NOTE: This is for quote post\n // (async () => {\n // const { masto } = api({ instance });\n // const status = await masto.v1.statuses.$select(id).fetch();\n // saveStatus(status, instance);\n // setCardStatusID(id);\n // })();\n });\n }\n }, [hasText, image, selfReferential]);\n\n // if (cardStatusID) {\n // return (\n // <Status statusID={cardStatusID} instance={instance} size=\"s\" readOnly />\n // );\n // }\n\n if (snapStates.unfurledLinks[url]) return null;\n\n const hasIframeHTML = /<iframe/i.test(html);\n const handleClick = useCallback(\n (e) => {\n if (hasIframeHTML) {\n e.preventDefault();\n states.showEmbedModal = {\n html,\n url: url || embedUrl,\n width,\n height,\n };\n }\n },\n [hasIframeHTML],\n );\n\n const [blurhashImage, setBlurhashImage] = useState(null);\n if (hasText && (image || (type === 'photo' && blurhash))) {\n const domain = getDomain(url);\n const rgbAverageColor =\n image && blurhash ? getBlurHashAverageColor(blurhash) : null;\n if (!image) {\n const w = 44;\n const h = 44;\n const blurhashPixels = decodeBlurHash(blurhash, w, h);\n const canvas = window.OffscreenCanvas\n ? new OffscreenCanvas(1, 1)\n : document.createElement('canvas');\n canvas.width = w;\n canvas.height = h;\n const ctx = canvas.getContext('2d');\n ctx.imageSmoothingEnabled = false;\n const imageData = ctx.createImageData(w, h);\n imageData.data.set(blurhashPixels);\n ctx.putImageData(imageData, 0, 0);\n try {\n if (window.OffscreenCanvas) {\n canvas.convertToBlob().then((blob) => {\n setBlurhashImage(URL.createObjectURL(blob));\n });\n } else {\n setBlurhashImage(canvas.toDataURL());\n }\n } catch (e) {\n // Silently fail\n console.error(e);\n }\n }\n\n const isPost = isCardPost(domain);\n\n return (\n <Byline hidden={!!selfAuthor} authors={authors}>\n <a\n href={cardStatusURL || url}\n target={cardStatusURL ? null : '_blank'}\n rel=\"nofollow noopener noreferrer\"\n class={`card link ${isPost ? 'card-post' : ''} ${\n blurhashImage ? '' : size\n }`}\n style={{\n '--average-color':\n rgbAverageColor && `rgb(${rgbAverageColor.join(',')})`,\n }}\n onClick={handleClick}\n >\n <div class=\"card-image\">\n <img\n src={image || blurhashImage}\n width={width}\n height={height}\n loading=\"lazy\"\n decoding=\"async\"\n fetchPriority=\"low\"\n alt={imageDescription || ''}\n onError={(e) => {\n try {\n e.target.style.display = 'none';\n } catch (e) {}\n }}\n style={{\n '--anim-duration':\n width &&\n height &&\n `${Math.min(\n Math.max(Math.max(width, height) / 100, 5),\n 120,\n )}s`,\n }}\n />\n </div>\n <div class=\"meta-container\" lang={language}>\n <p class=\"meta domain\">\n <span class=\"domain\">{domain}</span>{' '}\n {!!publishedAt && <>&middot; </>}\n {!!publishedAt && (\n <>\n <RelativeTime datetime={publishedAt} format=\"micro\" />\n </>\n )}\n </p>\n <p class=\"title\" dir=\"auto\" title={title}>\n {title}\n </p>\n <p class=\"meta\" dir=\"auto\" title={description}>\n {description ||\n (!!publishedAt && (\n <RelativeTime datetime={publishedAt} format=\"micro\" />\n ))}\n </p>\n </div>\n </a>\n </Byline>\n );\n } else if (type === 'photo') {\n return (\n <a\n href={url}\n target=\"_blank\"\n rel=\"nofollow noopener noreferrer\"\n class=\"card photo\"\n onClick={handleClick}\n >\n <img\n src={embedUrl}\n width={width}\n height={height}\n alt={title || description}\n loading=\"lazy\"\n style={{\n height: 'auto',\n aspectRatio: `${width}/${height}`,\n }}\n />\n </a>\n );\n } else {\n if (type === 'video') {\n if (/youtube/i.test(providerName)) {\n // Get ID from e.g. https://www.youtube.com/watch?v=[VIDEO_ID]\n const videoID = url.match(/watch\\?v=([^&]+)/)?.[1];\n if (videoID) {\n return (\n <a class=\"card video\" onClick={handleClick}>\n <lite-youtube videoid={videoID} nocookie></lite-youtube>\n </a>\n );\n }\n }\n // return (\n // <div\n // class=\"card video\"\n // style={{\n // aspectRatio: `${width}/${height}`,\n // }}\n // dangerouslySetInnerHTML={{ __html: html }}\n // />\n // );\n }\n if (hasText && !image) {\n const domain = getDomain(url);\n const isPost = isCardPost(domain);\n return (\n <a\n href={cardStatusURL || url}\n target={cardStatusURL ? null : '_blank'}\n rel=\"nofollow noopener noreferrer\"\n class={`card link ${isPost ? 'card-post' : ''} no-image`}\n lang={language}\n dir=\"auto\"\n onClick={handleClick}\n >\n <div class=\"meta-container\">\n <p class=\"meta domain\">\n <span class=\"domain\">\n <Icon icon=\"link\" size=\"s\" /> <span>{domain}</span>\n </span>{' '}\n {!!publishedAt && <>&middot; </>}\n {!!publishedAt && (\n <>\n <RelativeTime datetime={publishedAt} format=\"micro\" />\n </>\n )}\n </p>\n <p class=\"title\" title={title}>\n {title}\n </p>\n <p class=\"meta\" title={description || providerName || authorName}>\n {description || providerName || authorName}\n </p>\n </div>\n </a>\n );\n }\n }\n}\n\nfunction EditedAtModal({\n statusID,\n instance,\n fetchStatusHistory = () => {},\n onClose,\n}) {\n const [uiState, setUIState] = useState('default');\n const [editHistory, setEditHistory] = useState([]);\n\n useEffect(() => {\n setUIState('loading');\n (async () => {\n try {\n const editHistory = await fetchStatusHistory();\n console.log(editHistory);\n setEditHistory(editHistory);\n setUIState('default');\n } catch (e) {\n console.error(e);\n setUIState('error');\n }\n })();\n }, []);\n\n return (\n <div id=\"edit-history\" class=\"sheet\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n )}\n <header>\n <h2>\n <Trans>Edit History</Trans>\n </h2>\n {uiState === 'error' && (\n <p>\n <Trans>Failed to load history</Trans>\n </p>\n )}\n {uiState === 'loading' && (\n <p>\n <Loader abrupt /> <Trans>Loading…</Trans>\n </p>\n )}\n </header>\n <main tabIndex=\"-1\">\n {editHistory.length > 0 && (\n <ol>\n {editHistory.map((status) => {\n const { createdAt } = status;\n const createdAtDate = new Date(createdAt);\n return (\n <li key={createdAt} class=\"history-item\">\n <h3>\n <time>\n {niceDateTime(createdAtDate, {\n formatOpts: {\n weekday: 'short',\n second: 'numeric',\n },\n })}\n </time>\n </h3>\n <Status\n status={status}\n instance={instance}\n size=\"s\"\n withinContext\n readOnly\n previewMode\n />\n </li>\n );\n })}\n </ol>\n )}\n </main>\n </div>\n );\n}\n\nfunction generateHTMLCode(post, instance, level = 0) {\n const {\n account: {\n url: accountURL,\n displayName,\n acct,\n username,\n emojis: accountEmojis,\n bot,\n group,\n },\n id,\n poll,\n spoilerText,\n language,\n editedAt,\n createdAt,\n content,\n mediaAttachments,\n url,\n emojis,\n } = post;\n\n const sKey = statusKey(id, instance);\n const quotes = states.statusQuotes[sKey] || [];\n const uniqueQuotes = quotes.filter(\n (q, i, arr) => arr.findIndex((q2) => q2.url === q.url) === i,\n );\n const quoteStatusesHTML =\n uniqueQuotes.length && level <= 2\n ? uniqueQuotes\n .map((quote) => {\n const { id, instance } = quote;\n const sKey = statusKey(id, instance);\n const s = states.statuses[sKey];\n if (s) {\n return generateHTMLCode(s, instance, ++level);\n }\n })\n .join('')\n : '';\n\n const createdAtDate = new Date(createdAt);\n // const editedAtDate = editedAt && new Date(editedAt);\n\n const contentHTML =\n emojifyText(content, emojis) +\n '\\n' +\n quoteStatusesHTML +\n '\\n' +\n (poll?.options?.length\n ? `\n <p>📊:</p>\n <ul>\n ${poll.options\n .map(\n (option) => `\n <li>\n ${option.title}\n ${option.votesCount >= 0 ? ` (${option.votesCount})` : ''}\n </li>\n `,\n )\n .join('')}\n </ul>`\n : '') +\n (mediaAttachments.length > 0\n ? '\\n' +\n mediaAttachments\n .map((media) => {\n const {\n description,\n meta,\n previewRemoteUrl,\n previewUrl,\n remoteUrl,\n url,\n type,\n } = media;\n const { original = {}, small } = meta || {};\n const width = small?.width || original?.width;\n const height = small?.height || original?.height;\n\n // Prefer remote over original\n const sourceMediaURL = remoteUrl || url;\n const previewMediaURL = previewRemoteUrl || previewUrl;\n const mediaURL = previewMediaURL || sourceMediaURL;\n\n const sourceMediaURLObj = sourceMediaURL\n ? URL.parse(sourceMediaURL)\n : null;\n const isVideoMaybe =\n type === 'unknown' &&\n sourceMediaURLObj &&\n /\\.(mp4|m4r|m4v|mov|webm)$/i.test(sourceMediaURLObj.pathname);\n const isAudioMaybe =\n type === 'unknown' &&\n sourceMediaURLObj &&\n /\\.(mp3|ogg|wav|m4a|m4p|m4b)$/i.test(sourceMediaURLObj.pathname);\n const isImage =\n type === 'image' ||\n (type === 'unknown' &&\n previewMediaURL &&\n !isVideoMaybe &&\n !isAudioMaybe);\n const isVideo = type === 'gifv' || type === 'video' || isVideoMaybe;\n const isAudio = type === 'audio' || isAudioMaybe;\n\n let mediaHTML = '';\n if (isImage) {\n mediaHTML = `<img src=\"${mediaURL}\" width=\"${width}\" height=\"${height}\" alt=\"${description}\" loading=\"lazy\" />`;\n } else if (isVideo) {\n mediaHTML = `\n <video src=\"${sourceMediaURL}\" width=\"${width}\" height=\"${height}\" controls preload=\"auto\" poster=\"${previewMediaURL}\" loading=\"lazy\"></video>\n ${description ? `<figcaption>${description}</figcaption>` : ''}\n `;\n } else if (isAudio) {\n mediaHTML = `\n <audio src=\"${sourceMediaURL}\" controls preload=\"auto\"></audio>\n ${description ? `<figcaption>${description}</figcaption>` : ''}\n `;\n } else {\n mediaHTML = `\n <a href=\"${sourceMediaURL}\">📄 ${\n description || sourceMediaURL\n }</a>\n `;\n }\n\n return `<figure>${mediaHTML}</figure>`;\n })\n .join('\\n')\n : '');\n\n const htmlCode = `\n <blockquote lang=\"${language}\" cite=\"${url}\" data-source=\"fediverse\">\n ${\n spoilerText\n ? `\n <details>\n <summary>${spoilerText}</summary>\n ${contentHTML}\n </details>\n `\n : contentHTML\n }\n <footer>\n — ${emojifyText(\n displayName,\n accountEmojis,\n )} (@${acct}) <a href=\"${url}\"><time datetime=\"${createdAtDate.toISOString()}\">${createdAtDate.toLocaleString()}</time></a>\n </footer>\n </blockquote>\n `;\n\n return prettify(htmlCode);\n}\n\nfunction EmbedModal({ post, instance, onClose }) {\n const {\n account: {\n url: accountURL,\n displayName,\n username,\n emojis: accountEmojis,\n bot,\n group,\n },\n id,\n poll,\n spoilerText,\n language,\n editedAt,\n createdAt,\n content,\n mediaAttachments,\n url,\n emojis,\n } = post;\n\n const htmlCode = generateHTMLCode(post, instance);\n return (\n <div id=\"embed-post\" class=\"sheet\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n )}\n <header>\n <h2>\n <Trans>Embed post</Trans>\n </h2>\n </header>\n <main tabIndex=\"-1\">\n <h3>\n <Trans>HTML Code</Trans>\n </h3>\n <textarea\n class=\"embed-code\"\n readonly\n onClick={(e) => {\n e.target.select();\n }}\n dir=\"auto\"\n >\n {htmlCode}\n </textarea>\n <button\n type=\"button\"\n onClick={() => {\n try {\n navigator.clipboard.writeText(htmlCode);\n showToast(t`HTML code copied`);\n } catch (e) {\n console.error(e);\n showToast(t`Unable to copy HTML code`);\n }\n }}\n >\n <Icon icon=\"clipboard\" />{' '}\n <span>\n <Trans>Copy</Trans>\n </span>\n </button>\n {!!mediaAttachments?.length && (\n <section>\n <p>\n <Trans>Media attachments:</Trans>\n </p>\n <ol class=\"links-list\">\n {mediaAttachments.map((media) => {\n return (\n <li key={media.id}>\n <a\n href={media.remoteUrl || media.url}\n target=\"_blank\"\n download\n >\n {media.remoteUrl || media.url}\n </a>\n </li>\n );\n })}\n </ol>\n </section>\n )}\n {!!accountEmojis?.length && (\n <section>\n <p>\n <Trans>Account Emojis:</Trans>\n </p>\n <ul>\n {accountEmojis.map((emoji) => {\n return (\n <li key={emoji.shortcode}>\n <picture>\n <source\n srcset={emoji.staticUrl}\n media=\"(prefers-reduced-motion: reduce)\"\n ></source>\n <img\n class=\"shortcode-emoji emoji\"\n src={emoji.url}\n alt={`:${emoji.shortcode}:`}\n width=\"16\"\n height=\"16\"\n loading=\"lazy\"\n decoding=\"async\"\n />\n </picture>{' '}\n <code>:{emoji.shortcode}:</code> (\n <a href={emoji.url} target=\"_blank\" download>\n URL\n </a>\n )\n {emoji.staticUrl ? (\n <>\n {' '}\n (\n <a href={emoji.staticUrl} target=\"_blank\" download>\n <Trans>static URL</Trans>\n </a>\n )\n </>\n ) : null}\n </li>\n );\n })}\n </ul>\n </section>\n )}\n {!!emojis?.length && (\n <section>\n <p>\n <Trans>Emojis:</Trans>\n </p>\n <ul>\n {emojis.map((emoji) => {\n return (\n <li key={emoji.shortcode}>\n <picture>\n <source\n srcset={emoji.staticUrl}\n media=\"(prefers-reduced-motion: reduce)\"\n ></source>\n <img\n class=\"shortcode-emoji emoji\"\n src={emoji.url}\n alt={`:${emoji.shortcode}:`}\n width=\"16\"\n height=\"16\"\n loading=\"lazy\"\n decoding=\"async\"\n />\n </picture>{' '}\n <code>:{emoji.shortcode}:</code> (\n <a href={emoji.url} target=\"_blank\" download>\n URL\n </a>\n )\n {emoji.staticUrl ? (\n <>\n {' '}\n (\n <a href={emoji.staticUrl} target=\"_blank\" download>\n <Trans>static URL</Trans>\n </a>\n )\n </>\n ) : null}\n </li>\n );\n })}\n </ul>\n </section>\n )}\n <section>\n <small>\n <p>\n <Trans>Notes:</Trans>\n </p>\n <ul>\n <li>\n <Trans>\n This is static, unstyled and scriptless. You may need to apply\n your own styles and edit as needed.\n </Trans>\n </li>\n <li>\n <Trans>\n Polls are not interactive, becomes a list with vote counts.\n </Trans>\n </li>\n <li>\n <Trans>\n Media attachments can be images, videos, audios or any file\n types.\n </Trans>\n </li>\n <li>\n <Trans>Post could be edited or deleted later.</Trans>\n </li>\n </ul>\n </small>\n </section>\n <h3>\n <Trans>Preview</Trans>\n </h3>\n <output\n class=\"embed-preview\"\n dangerouslySetInnerHTML={{ __html: htmlCode }}\n dir=\"auto\"\n />\n <p>\n <small>\n <Trans>Note: This preview is lightly styled.</Trans>\n </small>\n </p>\n </main>\n </div>\n );\n}\n\nfunction StatusButton({\n checked,\n count,\n class: className,\n title,\n alt,\n size,\n icon,\n iconSize = 'l',\n onClick,\n ...props\n}) {\n if (typeof title === 'string') {\n title = [title, title];\n }\n if (typeof alt === 'string') {\n alt = [alt, alt];\n }\n\n const [buttonTitle, setButtonTitle] = useState(title[0] || '');\n const [iconAlt, setIconAlt] = useState(alt[0] || '');\n\n useEffect(() => {\n if (checked) {\n setButtonTitle(title[1] || '');\n setIconAlt(alt[1] || '');\n } else {\n setButtonTitle(title[0] || '');\n setIconAlt(alt[0] || '');\n }\n }, [checked, title, alt]);\n\n return (\n <button\n type=\"button\"\n title={buttonTitle}\n class={`plain ${size ? 'small' : ''} ${className} ${\n checked ? 'checked' : ''\n }`}\n onClick={(e) => {\n if (!onClick) return;\n e.preventDefault();\n e.stopPropagation();\n onClick(e);\n }}\n {...props}\n >\n <Icon icon={icon} size={iconSize} alt={iconAlt} />\n {!!count && (\n <>\n {' '}\n <small title={count}>{shortenNumber(count)}</small>\n </>\n )}\n </button>\n );\n}\n\nfunction nicePostURL(url) {\n if (!url) return;\n const urlObj = URL.parse(url);\n const { host, pathname } = urlObj;\n const path = pathname.replace(/\\/$/, '');\n // split only first slash\n const [_, username, restPath] = path.match(/\\/(@[^\\/]+)\\/(.*)/) || [];\n return (\n <>\n {punycode.toUnicode(host)}\n {username ? (\n <>\n /{username}\n <wbr />\n <span class=\"more-insignificant\">/{restPath}</span>\n </>\n ) : (\n <span class=\"more-insignificant\">{path}</span>\n )}\n </>\n );\n}\n\nfunction StatusCompact({ sKey }) {\n const snapStates = useSnapshot(states);\n const statusReply = snapStates.statusReply[sKey];\n if (!statusReply) return null;\n\n const { id, instance } = statusReply;\n const status = getStatus(id, instance);\n if (!status) return null;\n\n const {\n sensitive,\n spoilerText,\n account: { avatar, avatarStatic, bot } = {},\n visibility,\n content,\n language,\n filtered,\n } = status;\n if (sensitive || spoilerText) return null;\n if (!content) return null;\n\n const srKey = statusKey(id, instance);\n const statusPeekText = statusPeek(status);\n\n const filterContext = useContext(FilterContext);\n const filterInfo = isFiltered(filtered, filterContext);\n\n if (filterInfo?.action === 'hide') return null;\n\n const filterTitleStr = filterInfo?.titlesStr || '';\n\n return (\n <article\n class={`status compact-reply ${\n visibility === 'direct' ? 'visibility-direct' : ''\n }`}\n tabindex=\"-1\"\n data-state-post-id={srKey}\n >\n <Avatar url={avatarStatic || avatar} squircle={bot} />\n <div\n class=\"content-compact\"\n title={statusPeekText}\n lang={language}\n dir=\"auto\"\n >\n {filterInfo ? (\n <b class=\"status-filtered-badge badge-meta\" title={filterTitleStr}>\n <span>\n <Trans>Filtered</Trans>\n </span>\n <span>{filterTitleStr}</span>\n </b>\n ) : (\n <span>{statusPeekText}</span>\n )}\n </div>\n </article>\n );\n}\n\nfunction FilteredStatus({\n status,\n filterInfo,\n instance,\n containerProps = {},\n showFollowedTags,\n quoted,\n}) {\n const { _ } = useLingui();\n const snapStates = useSnapshot(states);\n const {\n id: statusID,\n account: { avatar, avatarStatic, bot, group },\n createdAt,\n visibility,\n reblog,\n } = status;\n const isReblog = !!reblog;\n const filterTitleStr = filterInfo?.titlesStr || '';\n const createdAtDate = new Date(createdAt);\n const statusPeekText = statusPeek(status.reblog || status);\n\n const [showPeek, setShowPeek] = useState(false);\n const bindLongPressPeek = useLongPress(\n () => {\n setShowPeek(true);\n },\n {\n threshold: 600,\n captureEvent: true,\n detect: 'touch',\n cancelOnMovement: 2, // true allows movement of up to 25 pixels\n },\n );\n\n const statusPeekRef = useTruncated();\n const sKey = statusKey(status.id, instance);\n const ssKey =\n statusKey(status.id, instance) +\n ' ' +\n (statusKey(reblog?.id, instance) || '');\n\n const actualStatusID = reblog?.id || statusID;\n const url = instance\n ? `/${instance}/s/${actualStatusID}`\n : `/s/${actualStatusID}`;\n const isFollowedTags =\n showFollowedTags && !!snapStates.statusFollowedTags[sKey]?.length;\n\n return (\n <div\n class={\n quoted\n ? ''\n : isReblog\n ? group\n ? 'status-group'\n : 'status-reblog'\n : isFollowedTags\n ? 'status-followed-tags'\n : ''\n }\n {...containerProps}\n // title={statusPeekText}\n onContextMenu={(e) => {\n e.preventDefault();\n setShowPeek(true);\n }}\n {...bindLongPressPeek()}\n >\n <article\n data-state-post-id={ssKey}\n class={`status filtered ${quoted ? 'status-card' : ''}`}\n tabindex=\"-1\"\n >\n <b\n class=\"status-filtered-badge clickable badge-meta\"\n title={filterTitleStr}\n onClick={(e) => {\n e.preventDefault();\n setShowPeek(true);\n }}\n >\n <span>\n <Trans>Filtered</Trans>\n </span>\n <span>{filterTitleStr}</span>\n </b>{' '}\n <Avatar url={avatarStatic || avatar} squircle={bot} />\n <span class=\"status-filtered-info\">\n <span class=\"status-filtered-info-1\">\n {isReblog ? (\n <Trans comment=\"[Name] [Visibility icon] boosted\">\n <NameText account={status.account} instance={instance} />{' '}\n <Icon\n icon={visibilityIconsMap[visibility]}\n alt={_(visibilityText[visibility])}\n size=\"s\"\n />{' '}\n boosted\n </Trans>\n ) : isFollowedTags ? (\n <>\n <NameText account={status.account} instance={instance} />{' '}\n <Icon\n icon={visibilityIconsMap[visibility]}\n alt={_(visibilityText[visibility])}\n size=\"s\"\n />{' '}\n <span>\n {snapStates.statusFollowedTags[sKey]\n .slice(0, 3)\n .map((tag) => (\n <span key={tag} class=\"status-followed-tag-item\">\n #{tag}\n </span>\n ))}\n </span>\n </>\n ) : (\n <>\n <NameText account={status.account} instance={instance} />{' '}\n <Icon\n icon={visibilityIconsMap[visibility]}\n alt={_(visibilityText[visibility])}\n size=\"s\"\n />{' '}\n <RelativeTime datetime={createdAtDate} format=\"micro\" />\n </>\n )}\n </span>\n <span class=\"status-filtered-info-2\">\n {isReblog && (\n <>\n <Avatar\n url={reblog.account.avatarStatic || reblog.account.avatar}\n squircle={bot}\n />{' '}\n </>\n )}\n {statusPeekText}\n </span>\n </span>\n </article>\n {!!showPeek && (\n <Modal\n onClick={(e) => {\n if (e.target === e.currentTarget) {\n setShowPeek(false);\n }\n }}\n >\n <div id=\"filtered-status-peek\" class=\"sheet\">\n <button\n type=\"button\"\n class=\"sheet-close\"\n onClick={() => setShowPeek(false)}\n >\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n <header>\n <b class=\"status-filtered-badge\">\n <Trans>Filtered</Trans>\n </b>{' '}\n {filterTitleStr}\n </header>\n <main tabIndex=\"-1\">\n <Link\n ref={statusPeekRef}\n class=\"status-link\"\n to={url}\n onClick={() => {\n setShowPeek(false);\n }}\n data-read-more={_(readMoreText)}\n >\n <Status status={status} instance={instance} size=\"s\" readOnly />\n </Link>\n </main>\n </div>\n </Modal>\n )}\n </div>\n );\n}\n\nconst QuoteStatuses = memo(({ id, instance, level = 0 }) => {\n if (!id || !instance) return;\n const { _ } = useLingui();\n const snapStates = useSnapshot(states);\n const sKey = statusKey(id, instance);\n const quotes = snapStates.statusQuotes[sKey];\n const uniqueQuotes = quotes?.filter(\n (q, i, arr) => arr.findIndex((q2) => q2.url === q.url) === i,\n );\n\n if (!uniqueQuotes?.length) return;\n if (level > 2) return;\n\n return uniqueQuotes.map((q) => {\n return (\n <LazyShazam id={q.instance + q.id}>\n <Link\n key={q.instance + q.id}\n to={`${q.instance ? `/${q.instance}` : ''}/s/${q.id}`}\n class=\"status-card-link\"\n data-read-more={_(readMoreText)}\n >\n <Status\n statusID={q.id}\n instance={q.instance}\n size=\"s\"\n quoted={level + 1}\n enableCommentHint\n />\n </Link>\n </LazyShazam>\n );\n });\n});\n\nexport default memo(Status, (oldProps, newProps) => {\n // Shallow equal all props except 'status'\n // This will be pure static until status ID changes\n const { status, ...restOldProps } = oldProps;\n const { status: newStatus, ...restNewProps } = newProps;\n return (\n status?.id === newStatus?.id && shallowEqual(restOldProps, restNewProps)\n );\n});\n","var IDX=36, HEX='';\nwhile (IDX--) HEX += IDX.toString(36);\n\nexport function uid(len) {\n\tvar str='', num = len || 11;\n\twhile (num--) str += HEX[Math.random() * 36 | 0];\n\treturn str;\n}\n","/**\n * Fuse.js v7.0.0 - Lightweight fuzzy-search (http://fusejs.io)\n *\n * Copyright (c) 2023 Kiro Risk (http://kiro.me)\n * All Rights Reserved. Apache Software License 2.0\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nfunction isArray(value) {\n return !Array.isArray\n ? getTag(value) === '[object Array]'\n : Array.isArray(value)\n}\n\n// Adapted from: https://github.com/lodash/lodash/blob/master/.internal/baseToString.js\nconst INFINITY = 1 / 0;\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value\n }\n let result = value + '';\n return result == '0' && 1 / value == -INFINITY ? '-0' : result\n}\n\nfunction toString(value) {\n return value == null ? '' : baseToString(value)\n}\n\nfunction isString(value) {\n return typeof value === 'string'\n}\n\nfunction isNumber(value) {\n return typeof value === 'number'\n}\n\n// Adapted from: https://github.com/lodash/lodash/blob/master/isBoolean.js\nfunction isBoolean(value) {\n return (\n value === true ||\n value === false ||\n (isObjectLike(value) && getTag(value) == '[object Boolean]')\n )\n}\n\nfunction isObject(value) {\n return typeof value === 'object'\n}\n\n// Checks if `value` is object-like.\nfunction isObjectLike(value) {\n return isObject(value) && value !== null\n}\n\nfunction isDefined(value) {\n return value !== undefined && value !== null\n}\n\nfunction isBlank(value) {\n return !value.trim().length\n}\n\n// Gets the `toStringTag` of `value`.\n// Adapted from: https://github.com/lodash/lodash/blob/master/.internal/getTag.js\nfunction getTag(value) {\n return value == null\n ? value === undefined\n ? '[object Undefined]'\n : '[object Null]'\n : Object.prototype.toString.call(value)\n}\n\nconst EXTENDED_SEARCH_UNAVAILABLE = 'Extended search is not available';\n\nconst INCORRECT_INDEX_TYPE = \"Incorrect 'index' type\";\n\nconst LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY = (key) =>\n `Invalid value for key ${key}`;\n\nconst PATTERN_LENGTH_TOO_LARGE = (max) =>\n `Pattern length exceeds max of ${max}.`;\n\nconst MISSING_KEY_PROPERTY = (name) => `Missing ${name} property in key`;\n\nconst INVALID_KEY_WEIGHT_VALUE = (key) =>\n `Property 'weight' in key '${key}' must be a positive integer`;\n\nconst hasOwn = Object.prototype.hasOwnProperty;\n\nclass KeyStore {\n constructor(keys) {\n this._keys = [];\n this._keyMap = {};\n\n let totalWeight = 0;\n\n keys.forEach((key) => {\n let obj = createKey(key);\n\n this._keys.push(obj);\n this._keyMap[obj.id] = obj;\n\n totalWeight += obj.weight;\n });\n\n // Normalize weights so that their sum is equal to 1\n this._keys.forEach((key) => {\n key.weight /= totalWeight;\n });\n }\n get(keyId) {\n return this._keyMap[keyId]\n }\n keys() {\n return this._keys\n }\n toJSON() {\n return JSON.stringify(this._keys)\n }\n}\n\nfunction createKey(key) {\n let path = null;\n let id = null;\n let src = null;\n let weight = 1;\n let getFn = null;\n\n if (isString(key) || isArray(key)) {\n src = key;\n path = createKeyPath(key);\n id = createKeyId(key);\n } else {\n if (!hasOwn.call(key, 'name')) {\n throw new Error(MISSING_KEY_PROPERTY('name'))\n }\n\n const name = key.name;\n src = name;\n\n if (hasOwn.call(key, 'weight')) {\n weight = key.weight;\n\n if (weight <= 0) {\n throw new Error(INVALID_KEY_WEIGHT_VALUE(name))\n }\n }\n\n path = createKeyPath(name);\n id = createKeyId(name);\n getFn = key.getFn;\n }\n\n return { path, id, weight, src, getFn }\n}\n\nfunction createKeyPath(key) {\n return isArray(key) ? key : key.split('.')\n}\n\nfunction createKeyId(key) {\n return isArray(key) ? key.join('.') : key\n}\n\nfunction get(obj, path) {\n let list = [];\n let arr = false;\n\n const deepGet = (obj, path, index) => {\n if (!isDefined(obj)) {\n return\n }\n if (!path[index]) {\n // If there's no path left, we've arrived at the object we care about.\n list.push(obj);\n } else {\n let key = path[index];\n\n const value = obj[key];\n\n if (!isDefined(value)) {\n return\n }\n\n // If we're at the last value in the path, and if it's a string/number/bool,\n // add it to the list\n if (\n index === path.length - 1 &&\n (isString(value) || isNumber(value) || isBoolean(value))\n ) {\n list.push(toString(value));\n } else if (isArray(value)) {\n arr = true;\n // Search each item in the array.\n for (let i = 0, len = value.length; i < len; i += 1) {\n deepGet(value[i], path, index + 1);\n }\n } else if (path.length) {\n // An object. Recurse further.\n deepGet(value, path, index + 1);\n }\n }\n };\n\n // Backwards compatibility (since path used to be a string)\n deepGet(obj, isString(path) ? path.split('.') : path, 0);\n\n return arr ? list : list[0]\n}\n\nconst MatchOptions = {\n // Whether the matches should be included in the result set. When `true`, each record in the result\n // set will include the indices of the matched characters.\n // These can consequently be used for highlighting purposes.\n includeMatches: false,\n // When `true`, the matching function will continue to the end of a search pattern even if\n // a perfect match has already been located in the string.\n findAllMatches: false,\n // Minimum number of characters that must be matched before a result is considered a match\n minMatchCharLength: 1\n};\n\nconst BasicOptions = {\n // When `true`, the algorithm continues searching to the end of the input even if a perfect\n // match is found before the end of the same input.\n isCaseSensitive: false,\n // When true, the matching function will continue to the end of a search pattern even if\n includeScore: false,\n // List of properties that will be searched. This also supports nested properties.\n keys: [],\n // Whether to sort the result list, by score\n shouldSort: true,\n // Default sort function: sort by ascending score, ascending index\n sortFn: (a, b) =>\n a.score === b.score ? (a.idx < b.idx ? -1 : 1) : a.score < b.score ? -1 : 1\n};\n\nconst FuzzyOptions = {\n // Approximately where in the text is the pattern expected to be found?\n location: 0,\n // At what point does the match algorithm give up. A threshold of '0.0' requires a perfect match\n // (of both letters and location), a threshold of '1.0' would match anything.\n threshold: 0.6,\n // Determines how close the match must be to the fuzzy location (specified above).\n // An exact letter match which is 'distance' characters away from the fuzzy location\n // would score as a complete mismatch. A distance of '0' requires the match be at\n // the exact location specified, a threshold of '1000' would require a perfect match\n // to be within 800 characters of the fuzzy location to be found using a 0.8 threshold.\n distance: 100\n};\n\nconst AdvancedOptions = {\n // When `true`, it enables the use of unix-like search commands\n useExtendedSearch: false,\n // The get function to use when fetching an object's properties.\n // The default will search nested paths *ie foo.bar.baz*\n getFn: get,\n // When `true`, search will ignore `location` and `distance`, so it won't matter\n // where in the string the pattern appears.\n // More info: https://fusejs.io/concepts/scoring-theory.html#fuzziness-score\n ignoreLocation: false,\n // When `true`, the calculation for the relevance score (used for sorting) will\n // ignore the field-length norm.\n // More info: https://fusejs.io/concepts/scoring-theory.html#field-length-norm\n ignoreFieldNorm: false,\n // The weight to determine how much field length norm effects scoring.\n fieldNormWeight: 1\n};\n\nvar Config = {\n ...BasicOptions,\n ...MatchOptions,\n ...FuzzyOptions,\n ...AdvancedOptions\n};\n\nconst SPACE = /[^ ]+/g;\n\n// Field-length norm: the shorter the field, the higher the weight.\n// Set to 3 decimals to reduce index size.\nfunction norm(weight = 1, mantissa = 3) {\n const cache = new Map();\n const m = Math.pow(10, mantissa);\n\n return {\n get(value) {\n const numTokens = value.match(SPACE).length;\n\n if (cache.has(numTokens)) {\n return cache.get(numTokens)\n }\n\n // Default function is 1/sqrt(x), weight makes that variable\n const norm = 1 / Math.pow(numTokens, 0.5 * weight);\n\n // In place of `toFixed(mantissa)`, for faster computation\n const n = parseFloat(Math.round(norm * m) / m);\n\n cache.set(numTokens, n);\n\n return n\n },\n clear() {\n cache.clear();\n }\n }\n}\n\nclass FuseIndex {\n constructor({\n getFn = Config.getFn,\n fieldNormWeight = Config.fieldNormWeight\n } = {}) {\n this.norm = norm(fieldNormWeight, 3);\n this.getFn = getFn;\n this.isCreated = false;\n\n this.setIndexRecords();\n }\n setSources(docs = []) {\n this.docs = docs;\n }\n setIndexRecords(records = []) {\n this.records = records;\n }\n setKeys(keys = []) {\n this.keys = keys;\n this._keysMap = {};\n keys.forEach((key, idx) => {\n this._keysMap[key.id] = idx;\n });\n }\n create() {\n if (this.isCreated || !this.docs.length) {\n return\n }\n\n this.isCreated = true;\n\n // List is Array<String>\n if (isString(this.docs[0])) {\n this.docs.forEach((doc, docIndex) => {\n this._addString(doc, docIndex);\n });\n } else {\n // List is Array<Object>\n this.docs.forEach((doc, docIndex) => {\n this._addObject(doc, docIndex);\n });\n }\n\n this.norm.clear();\n }\n // Adds a doc to the end of the index\n add(doc) {\n const idx = this.size();\n\n if (isString(doc)) {\n this._addString(doc, idx);\n } else {\n this._addObject(doc, idx);\n }\n }\n // Removes the doc at the specified index of the index\n removeAt(idx) {\n this.records.splice(idx, 1);\n\n // Change ref index of every subsquent doc\n for (let i = idx, len = this.size(); i < len; i += 1) {\n this.records[i].i -= 1;\n }\n }\n getValueForItemAtKeyId(item, keyId) {\n return item[this._keysMap[keyId]]\n }\n size() {\n return this.records.length\n }\n _addString(doc, docIndex) {\n if (!isDefined(doc) || isBlank(doc)) {\n return\n }\n\n let record = {\n v: doc,\n i: docIndex,\n n: this.norm.get(doc)\n };\n\n this.records.push(record);\n }\n _addObject(doc, docIndex) {\n let record = { i: docIndex, $: {} };\n\n // Iterate over every key (i.e, path), and fetch the value at that key\n this.keys.forEach((key, keyIndex) => {\n let value = key.getFn ? key.getFn(doc) : this.getFn(doc, key.path);\n\n if (!isDefined(value)) {\n return\n }\n\n if (isArray(value)) {\n let subRecords = [];\n const stack = [{ nestedArrIndex: -1, value }];\n\n while (stack.length) {\n const { nestedArrIndex, value } = stack.pop();\n\n if (!isDefined(value)) {\n continue\n }\n\n if (isString(value) && !isBlank(value)) {\n let subRecord = {\n v: value,\n i: nestedArrIndex,\n n: this.norm.get(value)\n };\n\n subRecords.push(subRecord);\n } else if (isArray(value)) {\n value.forEach((item, k) => {\n stack.push({\n nestedArrIndex: k,\n value: item\n });\n });\n } else ;\n }\n record.$[keyIndex] = subRecords;\n } else if (isString(value) && !isBlank(value)) {\n let subRecord = {\n v: value,\n n: this.norm.get(value)\n };\n\n record.$[keyIndex] = subRecord;\n }\n });\n\n this.records.push(record);\n }\n toJSON() {\n return {\n keys: this.keys,\n records: this.records\n }\n }\n}\n\nfunction createIndex(\n keys,\n docs,\n { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {}\n) {\n const myIndex = new FuseIndex({ getFn, fieldNormWeight });\n myIndex.setKeys(keys.map(createKey));\n myIndex.setSources(docs);\n myIndex.create();\n return myIndex\n}\n\nfunction parseIndex(\n data,\n { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {}\n) {\n const { keys, records } = data;\n const myIndex = new FuseIndex({ getFn, fieldNormWeight });\n myIndex.setKeys(keys);\n myIndex.setIndexRecords(records);\n return myIndex\n}\n\nfunction computeScore$1(\n pattern,\n {\n errors = 0,\n currentLocation = 0,\n expectedLocation = 0,\n distance = Config.distance,\n ignoreLocation = Config.ignoreLocation\n } = {}\n) {\n const accuracy = errors / pattern.length;\n\n if (ignoreLocation) {\n return accuracy\n }\n\n const proximity = Math.abs(expectedLocation - currentLocation);\n\n if (!distance) {\n // Dodge divide by zero error.\n return proximity ? 1.0 : accuracy\n }\n\n return accuracy + proximity / distance\n}\n\nfunction convertMaskToIndices(\n matchmask = [],\n minMatchCharLength = Config.minMatchCharLength\n) {\n let indices = [];\n let start = -1;\n let end = -1;\n let i = 0;\n\n for (let len = matchmask.length; i < len; i += 1) {\n let match = matchmask[i];\n if (match && start === -1) {\n start = i;\n } else if (!match && start !== -1) {\n end = i - 1;\n if (end - start + 1 >= minMatchCharLength) {\n indices.push([start, end]);\n }\n start = -1;\n }\n }\n\n // (i-1 - start) + 1 => i - start\n if (matchmask[i - 1] && i - start >= minMatchCharLength) {\n indices.push([start, i - 1]);\n }\n\n return indices\n}\n\n// Machine word size\nconst MAX_BITS = 32;\n\nfunction search(\n text,\n pattern,\n patternAlphabet,\n {\n location = Config.location,\n distance = Config.distance,\n threshold = Config.threshold,\n findAllMatches = Config.findAllMatches,\n minMatchCharLength = Config.minMatchCharLength,\n includeMatches = Config.includeMatches,\n ignoreLocation = Config.ignoreLocation\n } = {}\n) {\n if (pattern.length > MAX_BITS) {\n throw new Error(PATTERN_LENGTH_TOO_LARGE(MAX_BITS))\n }\n\n const patternLen = pattern.length;\n // Set starting location at beginning text and initialize the alphabet.\n const textLen = text.length;\n // Handle the case when location > text.length\n const expectedLocation = Math.max(0, Math.min(location, textLen));\n // Highest score beyond which we give up.\n let currentThreshold = threshold;\n // Is there a nearby exact match? (speedup)\n let bestLocation = expectedLocation;\n\n // Performance: only computer matches when the minMatchCharLength > 1\n // OR if `includeMatches` is true.\n const computeMatches = minMatchCharLength > 1 || includeMatches;\n // A mask of the matches, used for building the indices\n const matchMask = computeMatches ? Array(textLen) : [];\n\n let index;\n\n // Get all exact matches, here for speed up\n while ((index = text.indexOf(pattern, bestLocation)) > -1) {\n let score = computeScore$1(pattern, {\n currentLocation: index,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n currentThreshold = Math.min(score, currentThreshold);\n bestLocation = index + patternLen;\n\n if (computeMatches) {\n let i = 0;\n while (i < patternLen) {\n matchMask[index + i] = 1;\n i += 1;\n }\n }\n }\n\n // Reset the best location\n bestLocation = -1;\n\n let lastBitArr = [];\n let finalScore = 1;\n let binMax = patternLen + textLen;\n\n const mask = 1 << (patternLen - 1);\n\n for (let i = 0; i < patternLen; i += 1) {\n // Scan for the best match; each iteration allows for one more error.\n // Run a binary search to determine how far from the match location we can stray\n // at this error level.\n let binMin = 0;\n let binMid = binMax;\n\n while (binMin < binMid) {\n const score = computeScore$1(pattern, {\n errors: i,\n currentLocation: expectedLocation + binMid,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n if (score <= currentThreshold) {\n binMin = binMid;\n } else {\n binMax = binMid;\n }\n\n binMid = Math.floor((binMax - binMin) / 2 + binMin);\n }\n\n // Use the result from this iteration as the maximum for the next.\n binMax = binMid;\n\n let start = Math.max(1, expectedLocation - binMid + 1);\n let finish = findAllMatches\n ? textLen\n : Math.min(expectedLocation + binMid, textLen) + patternLen;\n\n // Initialize the bit array\n let bitArr = Array(finish + 2);\n\n bitArr[finish + 1] = (1 << i) - 1;\n\n for (let j = finish; j >= start; j -= 1) {\n let currentLocation = j - 1;\n let charMatch = patternAlphabet[text.charAt(currentLocation)];\n\n if (computeMatches) {\n // Speed up: quick bool to int conversion (i.e, `charMatch ? 1 : 0`)\n matchMask[currentLocation] = +!!charMatch;\n }\n\n // First pass: exact match\n bitArr[j] = ((bitArr[j + 1] << 1) | 1) & charMatch;\n\n // Subsequent passes: fuzzy match\n if (i) {\n bitArr[j] |=\n ((lastBitArr[j + 1] | lastBitArr[j]) << 1) | 1 | lastBitArr[j + 1];\n }\n\n if (bitArr[j] & mask) {\n finalScore = computeScore$1(pattern, {\n errors: i,\n currentLocation,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n // This match will almost certainly be better than any existing match.\n // But check anyway.\n if (finalScore <= currentThreshold) {\n // Indeed it is\n currentThreshold = finalScore;\n bestLocation = currentLocation;\n\n // Already passed `loc`, downhill from here on in.\n if (bestLocation <= expectedLocation) {\n break\n }\n\n // When passing `bestLocation`, don't exceed our current distance from `expectedLocation`.\n start = Math.max(1, 2 * expectedLocation - bestLocation);\n }\n }\n }\n\n // No hope for a (better) match at greater error levels.\n const score = computeScore$1(pattern, {\n errors: i + 1,\n currentLocation: expectedLocation,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n if (score > currentThreshold) {\n break\n }\n\n lastBitArr = bitArr;\n }\n\n const result = {\n isMatch: bestLocation >= 0,\n // Count exact matches (those with a score of 0) to be \"almost\" exact\n score: Math.max(0.001, finalScore)\n };\n\n if (computeMatches) {\n const indices = convertMaskToIndices(matchMask, minMatchCharLength);\n if (!indices.length) {\n result.isMatch = false;\n } else if (includeMatches) {\n result.indices = indices;\n }\n }\n\n return result\n}\n\nfunction createPatternAlphabet(pattern) {\n let mask = {};\n\n for (let i = 0, len = pattern.length; i < len; i += 1) {\n const char = pattern.charAt(i);\n mask[char] = (mask[char] || 0) | (1 << (len - i - 1));\n }\n\n return mask\n}\n\nclass BitapSearch {\n constructor(\n pattern,\n {\n location = Config.location,\n threshold = Config.threshold,\n distance = Config.distance,\n includeMatches = Config.includeMatches,\n findAllMatches = Config.findAllMatches,\n minMatchCharLength = Config.minMatchCharLength,\n isCaseSensitive = Config.isCaseSensitive,\n ignoreLocation = Config.ignoreLocation\n } = {}\n ) {\n this.options = {\n location,\n threshold,\n distance,\n includeMatches,\n findAllMatches,\n minMatchCharLength,\n isCaseSensitive,\n ignoreLocation\n };\n\n this.pattern = isCaseSensitive ? pattern : pattern.toLowerCase();\n\n this.chunks = [];\n\n if (!this.pattern.length) {\n return\n }\n\n const addChunk = (pattern, startIndex) => {\n this.chunks.push({\n pattern,\n alphabet: createPatternAlphabet(pattern),\n startIndex\n });\n };\n\n const len = this.pattern.length;\n\n if (len > MAX_BITS) {\n let i = 0;\n const remainder = len % MAX_BITS;\n const end = len - remainder;\n\n while (i < end) {\n addChunk(this.pattern.substr(i, MAX_BITS), i);\n i += MAX_BITS;\n }\n\n if (remainder) {\n const startIndex = len - MAX_BITS;\n addChunk(this.pattern.substr(startIndex), startIndex);\n }\n } else {\n addChunk(this.pattern, 0);\n }\n }\n\n searchIn(text) {\n const { isCaseSensitive, includeMatches } = this.options;\n\n if (!isCaseSensitive) {\n text = text.toLowerCase();\n }\n\n // Exact match\n if (this.pattern === text) {\n let result = {\n isMatch: true,\n score: 0\n };\n\n if (includeMatches) {\n result.indices = [[0, text.length - 1]];\n }\n\n return result\n }\n\n // Otherwise, use Bitap algorithm\n const {\n location,\n distance,\n threshold,\n findAllMatches,\n minMatchCharLength,\n ignoreLocation\n } = this.options;\n\n let allIndices = [];\n let totalScore = 0;\n let hasMatches = false;\n\n this.chunks.forEach(({ pattern, alphabet, startIndex }) => {\n const { isMatch, score, indices } = search(text, pattern, alphabet, {\n location: location + startIndex,\n distance,\n threshold,\n findAllMatches,\n minMatchCharLength,\n includeMatches,\n ignoreLocation\n });\n\n if (isMatch) {\n hasMatches = true;\n }\n\n totalScore += score;\n\n if (isMatch && indices) {\n allIndices = [...allIndices, ...indices];\n }\n });\n\n let result = {\n isMatch: hasMatches,\n score: hasMatches ? totalScore / this.chunks.length : 1\n };\n\n if (hasMatches && includeMatches) {\n result.indices = allIndices;\n }\n\n return result\n }\n}\n\nclass BaseMatch {\n constructor(pattern) {\n this.pattern = pattern;\n }\n static isMultiMatch(pattern) {\n return getMatch(pattern, this.multiRegex)\n }\n static isSingleMatch(pattern) {\n return getMatch(pattern, this.singleRegex)\n }\n search(/*text*/) {}\n}\n\nfunction getMatch(pattern, exp) {\n const matches = pattern.match(exp);\n return matches ? matches[1] : null\n}\n\n// Token: 'file\n\nclass ExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'exact'\n }\n static get multiRegex() {\n return /^=\"(.*)\"$/\n }\n static get singleRegex() {\n return /^=(.*)$/\n }\n search(text) {\n const isMatch = text === this.pattern;\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, this.pattern.length - 1]\n }\n }\n}\n\n// Token: !fire\n\nclass InverseExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'inverse-exact'\n }\n static get multiRegex() {\n return /^!\"(.*)\"$/\n }\n static get singleRegex() {\n return /^!(.*)$/\n }\n search(text) {\n const index = text.indexOf(this.pattern);\n const isMatch = index === -1;\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, text.length - 1]\n }\n }\n}\n\n// Token: ^file\n\nclass PrefixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'prefix-exact'\n }\n static get multiRegex() {\n return /^\\^\"(.*)\"$/\n }\n static get singleRegex() {\n return /^\\^(.*)$/\n }\n search(text) {\n const isMatch = text.startsWith(this.pattern);\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, this.pattern.length - 1]\n }\n }\n}\n\n// Token: !^fire\n\nclass InversePrefixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'inverse-prefix-exact'\n }\n static get multiRegex() {\n return /^!\\^\"(.*)\"$/\n }\n static get singleRegex() {\n return /^!\\^(.*)$/\n }\n search(text) {\n const isMatch = !text.startsWith(this.pattern);\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, text.length - 1]\n }\n }\n}\n\n// Token: .file$\n\nclass SuffixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'suffix-exact'\n }\n static get multiRegex() {\n return /^\"(.*)\"\\$$/\n }\n static get singleRegex() {\n return /^(.*)\\$$/\n }\n search(text) {\n const isMatch = text.endsWith(this.pattern);\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [text.length - this.pattern.length, text.length - 1]\n }\n }\n}\n\n// Token: !.file$\n\nclass InverseSuffixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'inverse-suffix-exact'\n }\n static get multiRegex() {\n return /^!\"(.*)\"\\$$/\n }\n static get singleRegex() {\n return /^!(.*)\\$$/\n }\n search(text) {\n const isMatch = !text.endsWith(this.pattern);\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, text.length - 1]\n }\n }\n}\n\nclass FuzzyMatch extends BaseMatch {\n constructor(\n pattern,\n {\n location = Config.location,\n threshold = Config.threshold,\n distance = Config.distance,\n includeMatches = Config.includeMatches,\n findAllMatches = Config.findAllMatches,\n minMatchCharLength = Config.minMatchCharLength,\n isCaseSensitive = Config.isCaseSensitive,\n ignoreLocation = Config.ignoreLocation\n } = {}\n ) {\n super(pattern);\n this._bitapSearch = new BitapSearch(pattern, {\n location,\n threshold,\n distance,\n includeMatches,\n findAllMatches,\n minMatchCharLength,\n isCaseSensitive,\n ignoreLocation\n });\n }\n static get type() {\n return 'fuzzy'\n }\n static get multiRegex() {\n return /^\"(.*)\"$/\n }\n static get singleRegex() {\n return /^(.*)$/\n }\n search(text) {\n return this._bitapSearch.searchIn(text)\n }\n}\n\n// Token: 'file\n\nclass IncludeMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'include'\n }\n static get multiRegex() {\n return /^'\"(.*)\"$/\n }\n static get singleRegex() {\n return /^'(.*)$/\n }\n search(text) {\n let location = 0;\n let index;\n\n const indices = [];\n const patternLen = this.pattern.length;\n\n // Get all exact matches\n while ((index = text.indexOf(this.pattern, location)) > -1) {\n location = index + patternLen;\n indices.push([index, location - 1]);\n }\n\n const isMatch = !!indices.length;\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices\n }\n }\n}\n\n// ❗Order is important. DO NOT CHANGE.\nconst searchers = [\n ExactMatch,\n IncludeMatch,\n PrefixExactMatch,\n InversePrefixExactMatch,\n InverseSuffixExactMatch,\n SuffixExactMatch,\n InverseExactMatch,\n FuzzyMatch\n];\n\nconst searchersLen = searchers.length;\n\n// Regex to split by spaces, but keep anything in quotes together\nconst SPACE_RE = / +(?=(?:[^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*$)/;\nconst OR_TOKEN = '|';\n\n// Return a 2D array representation of the query, for simpler parsing.\n// Example:\n// \"^core go$ | rb$ | py$ xy$\" => [[\"^core\", \"go$\"], [\"rb$\"], [\"py$\", \"xy$\"]]\nfunction parseQuery(pattern, options = {}) {\n return pattern.split(OR_TOKEN).map((item) => {\n let query = item\n .trim()\n .split(SPACE_RE)\n .filter((item) => item && !!item.trim());\n\n let results = [];\n for (let i = 0, len = query.length; i < len; i += 1) {\n const queryItem = query[i];\n\n // 1. Handle multiple query match (i.e, once that are quoted, like `\"hello world\"`)\n let found = false;\n let idx = -1;\n while (!found && ++idx < searchersLen) {\n const searcher = searchers[idx];\n let token = searcher.isMultiMatch(queryItem);\n if (token) {\n results.push(new searcher(token, options));\n found = true;\n }\n }\n\n if (found) {\n continue\n }\n\n // 2. Handle single query matches (i.e, once that are *not* quoted)\n idx = -1;\n while (++idx < searchersLen) {\n const searcher = searchers[idx];\n let token = searcher.isSingleMatch(queryItem);\n if (token) {\n results.push(new searcher(token, options));\n break\n }\n }\n }\n\n return results\n })\n}\n\n// These extended matchers can return an array of matches, as opposed\n// to a singl match\nconst MultiMatchSet = new Set([FuzzyMatch.type, IncludeMatch.type]);\n\n/**\n * Command-like searching\n * ======================\n *\n * Given multiple search terms delimited by spaces.e.g. `^jscript .python$ ruby !java`,\n * search in a given text.\n *\n * Search syntax:\n *\n * | Token | Match type | Description |\n * | ----------- | -------------------------- | -------------------------------------- |\n * | `jscript` | fuzzy-match | Items that fuzzy match `jscript` |\n * | `=scheme` | exact-match | Items that are `scheme` |\n * | `'python` | include-match | Items that include `python` |\n * | `!ruby` | inverse-exact-match | Items that do not include `ruby` |\n * | `^java` | prefix-exact-match | Items that start with `java` |\n * | `!^earlang` | inverse-prefix-exact-match | Items that do not start with `earlang` |\n * | `.js$` | suffix-exact-match | Items that end with `.js` |\n * | `!.go$` | inverse-suffix-exact-match | Items that do not end with `.go` |\n *\n * A single pipe character acts as an OR operator. For example, the following\n * query matches entries that start with `core` and end with either`go`, `rb`,\n * or`py`.\n *\n * ```\n * ^core go$ | rb$ | py$\n * ```\n */\nclass ExtendedSearch {\n constructor(\n pattern,\n {\n isCaseSensitive = Config.isCaseSensitive,\n includeMatches = Config.includeMatches,\n minMatchCharLength = Config.minMatchCharLength,\n ignoreLocation = Config.ignoreLocation,\n findAllMatches = Config.findAllMatches,\n location = Config.location,\n threshold = Config.threshold,\n distance = Config.distance\n } = {}\n ) {\n this.query = null;\n this.options = {\n isCaseSensitive,\n includeMatches,\n minMatchCharLength,\n findAllMatches,\n ignoreLocation,\n location,\n threshold,\n distance\n };\n\n this.pattern = isCaseSensitive ? pattern : pattern.toLowerCase();\n this.query = parseQuery(this.pattern, this.options);\n }\n\n static condition(_, options) {\n return options.useExtendedSearch\n }\n\n searchIn(text) {\n const query = this.query;\n\n if (!query) {\n return {\n isMatch: false,\n score: 1\n }\n }\n\n const { includeMatches, isCaseSensitive } = this.options;\n\n text = isCaseSensitive ? text : text.toLowerCase();\n\n let numMatches = 0;\n let allIndices = [];\n let totalScore = 0;\n\n // ORs\n for (let i = 0, qLen = query.length; i < qLen; i += 1) {\n const searchers = query[i];\n\n // Reset indices\n allIndices.length = 0;\n numMatches = 0;\n\n // ANDs\n for (let j = 0, pLen = searchers.length; j < pLen; j += 1) {\n const searcher = searchers[j];\n const { isMatch, indices, score } = searcher.search(text);\n\n if (isMatch) {\n numMatches += 1;\n totalScore += score;\n if (includeMatches) {\n const type = searcher.constructor.type;\n if (MultiMatchSet.has(type)) {\n allIndices = [...allIndices, ...indices];\n } else {\n allIndices.push(indices);\n }\n }\n } else {\n totalScore = 0;\n numMatches = 0;\n allIndices.length = 0;\n break\n }\n }\n\n // OR condition, so if TRUE, return\n if (numMatches) {\n let result = {\n isMatch: true,\n score: totalScore / numMatches\n };\n\n if (includeMatches) {\n result.indices = allIndices;\n }\n\n return result\n }\n }\n\n // Nothing was matched\n return {\n isMatch: false,\n score: 1\n }\n }\n}\n\nconst registeredSearchers = [];\n\nfunction register(...args) {\n registeredSearchers.push(...args);\n}\n\nfunction createSearcher(pattern, options) {\n for (let i = 0, len = registeredSearchers.length; i < len; i += 1) {\n let searcherClass = registeredSearchers[i];\n if (searcherClass.condition(pattern, options)) {\n return new searcherClass(pattern, options)\n }\n }\n\n return new BitapSearch(pattern, options)\n}\n\nconst LogicalOperator = {\n AND: '$and',\n OR: '$or'\n};\n\nconst KeyType = {\n PATH: '$path',\n PATTERN: '$val'\n};\n\nconst isExpression = (query) =>\n !!(query[LogicalOperator.AND] || query[LogicalOperator.OR]);\n\nconst isPath = (query) => !!query[KeyType.PATH];\n\nconst isLeaf = (query) =>\n !isArray(query) && isObject(query) && !isExpression(query);\n\nconst convertToExplicit = (query) => ({\n [LogicalOperator.AND]: Object.keys(query).map((key) => ({\n [key]: query[key]\n }))\n});\n\n// When `auto` is `true`, the parse function will infer and initialize and add\n// the appropriate `Searcher` instance\nfunction parse(query, options, { auto = true } = {}) {\n const next = (query) => {\n let keys = Object.keys(query);\n\n const isQueryPath = isPath(query);\n\n if (!isQueryPath && keys.length > 1 && !isExpression(query)) {\n return next(convertToExplicit(query))\n }\n\n if (isLeaf(query)) {\n const key = isQueryPath ? query[KeyType.PATH] : keys[0];\n\n const pattern = isQueryPath ? query[KeyType.PATTERN] : query[key];\n\n if (!isString(pattern)) {\n throw new Error(LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY(key))\n }\n\n const obj = {\n keyId: createKeyId(key),\n pattern\n };\n\n if (auto) {\n obj.searcher = createSearcher(pattern, options);\n }\n\n return obj\n }\n\n let node = {\n children: [],\n operator: keys[0]\n };\n\n keys.forEach((key) => {\n const value = query[key];\n\n if (isArray(value)) {\n value.forEach((item) => {\n node.children.push(next(item));\n });\n }\n });\n\n return node\n };\n\n if (!isExpression(query)) {\n query = convertToExplicit(query);\n }\n\n return next(query)\n}\n\n// Practical scoring function\nfunction computeScore(\n results,\n { ignoreFieldNorm = Config.ignoreFieldNorm }\n) {\n results.forEach((result) => {\n let totalScore = 1;\n\n result.matches.forEach(({ key, norm, score }) => {\n const weight = key ? key.weight : null;\n\n totalScore *= Math.pow(\n score === 0 && weight ? Number.EPSILON : score,\n (weight || 1) * (ignoreFieldNorm ? 1 : norm)\n );\n });\n\n result.score = totalScore;\n });\n}\n\nfunction transformMatches(result, data) {\n const matches = result.matches;\n data.matches = [];\n\n if (!isDefined(matches)) {\n return\n }\n\n matches.forEach((match) => {\n if (!isDefined(match.indices) || !match.indices.length) {\n return\n }\n\n const { indices, value } = match;\n\n let obj = {\n indices,\n value\n };\n\n if (match.key) {\n obj.key = match.key.src;\n }\n\n if (match.idx > -1) {\n obj.refIndex = match.idx;\n }\n\n data.matches.push(obj);\n });\n}\n\nfunction transformScore(result, data) {\n data.score = result.score;\n}\n\nfunction format(\n results,\n docs,\n {\n includeMatches = Config.includeMatches,\n includeScore = Config.includeScore\n } = {}\n) {\n const transformers = [];\n\n if (includeMatches) transformers.push(transformMatches);\n if (includeScore) transformers.push(transformScore);\n\n return results.map((result) => {\n const { idx } = result;\n\n const data = {\n item: docs[idx],\n refIndex: idx\n };\n\n if (transformers.length) {\n transformers.forEach((transformer) => {\n transformer(result, data);\n });\n }\n\n return data\n })\n}\n\nclass Fuse {\n constructor(docs, options = {}, index) {\n this.options = { ...Config, ...options };\n\n if (\n this.options.useExtendedSearch &&\n !true\n ) {\n throw new Error(EXTENDED_SEARCH_UNAVAILABLE)\n }\n\n this._keyStore = new KeyStore(this.options.keys);\n\n this.setCollection(docs, index);\n }\n\n setCollection(docs, index) {\n this._docs = docs;\n\n if (index && !(index instanceof FuseIndex)) {\n throw new Error(INCORRECT_INDEX_TYPE)\n }\n\n this._myIndex =\n index ||\n createIndex(this.options.keys, this._docs, {\n getFn: this.options.getFn,\n fieldNormWeight: this.options.fieldNormWeight\n });\n }\n\n add(doc) {\n if (!isDefined(doc)) {\n return\n }\n\n this._docs.push(doc);\n this._myIndex.add(doc);\n }\n\n remove(predicate = (/* doc, idx */) => false) {\n const results = [];\n\n for (let i = 0, len = this._docs.length; i < len; i += 1) {\n const doc = this._docs[i];\n if (predicate(doc, i)) {\n this.removeAt(i);\n i -= 1;\n len -= 1;\n\n results.push(doc);\n }\n }\n\n return results\n }\n\n removeAt(idx) {\n this._docs.splice(idx, 1);\n this._myIndex.removeAt(idx);\n }\n\n getIndex() {\n return this._myIndex\n }\n\n search(query, { limit = -1 } = {}) {\n const {\n includeMatches,\n includeScore,\n shouldSort,\n sortFn,\n ignoreFieldNorm\n } = this.options;\n\n let results = isString(query)\n ? isString(this._docs[0])\n ? this._searchStringList(query)\n : this._searchObjectList(query)\n : this._searchLogical(query);\n\n computeScore(results, { ignoreFieldNorm });\n\n if (shouldSort) {\n results.sort(sortFn);\n }\n\n if (isNumber(limit) && limit > -1) {\n results = results.slice(0, limit);\n }\n\n return format(results, this._docs, {\n includeMatches,\n includeScore\n })\n }\n\n _searchStringList(query) {\n const searcher = createSearcher(query, this.options);\n const { records } = this._myIndex;\n const results = [];\n\n // Iterate over every string in the index\n records.forEach(({ v: text, i: idx, n: norm }) => {\n if (!isDefined(text)) {\n return\n }\n\n const { isMatch, score, indices } = searcher.searchIn(text);\n\n if (isMatch) {\n results.push({\n item: text,\n idx,\n matches: [{ score, value: text, norm, indices }]\n });\n }\n });\n\n return results\n }\n\n _searchLogical(query) {\n\n const expression = parse(query, this.options);\n\n const evaluate = (node, item, idx) => {\n if (!node.children) {\n const { keyId, searcher } = node;\n\n const matches = this._findMatches({\n key: this._keyStore.get(keyId),\n value: this._myIndex.getValueForItemAtKeyId(item, keyId),\n searcher\n });\n\n if (matches && matches.length) {\n return [\n {\n idx,\n item,\n matches\n }\n ]\n }\n\n return []\n }\n\n const res = [];\n for (let i = 0, len = node.children.length; i < len; i += 1) {\n const child = node.children[i];\n const result = evaluate(child, item, idx);\n if (result.length) {\n res.push(...result);\n } else if (node.operator === LogicalOperator.AND) {\n return []\n }\n }\n return res\n };\n\n const records = this._myIndex.records;\n const resultMap = {};\n const results = [];\n\n records.forEach(({ $: item, i: idx }) => {\n if (isDefined(item)) {\n let expResults = evaluate(expression, item, idx);\n\n if (expResults.length) {\n // Dedupe when adding\n if (!resultMap[idx]) {\n resultMap[idx] = { idx, item, matches: [] };\n results.push(resultMap[idx]);\n }\n expResults.forEach(({ matches }) => {\n resultMap[idx].matches.push(...matches);\n });\n }\n }\n });\n\n return results\n }\n\n _searchObjectList(query) {\n const searcher = createSearcher(query, this.options);\n const { keys, records } = this._myIndex;\n const results = [];\n\n // List is Array<Object>\n records.forEach(({ $: item, i: idx }) => {\n if (!isDefined(item)) {\n return\n }\n\n let matches = [];\n\n // Iterate over every key (i.e, path), and fetch the value at that key\n keys.forEach((key, keyIndex) => {\n matches.push(\n ...this._findMatches({\n key,\n value: item[keyIndex],\n searcher\n })\n );\n });\n\n if (matches.length) {\n results.push({\n idx,\n item,\n matches\n });\n }\n });\n\n return results\n }\n _findMatches({ key, value, searcher }) {\n if (!isDefined(value)) {\n return []\n }\n\n let matches = [];\n\n if (isArray(value)) {\n value.forEach(({ v: text, i: idx, n: norm }) => {\n if (!isDefined(text)) {\n return\n }\n\n const { isMatch, score, indices } = searcher.searchIn(text);\n\n if (isMatch) {\n matches.push({\n score,\n key,\n value: text,\n idx,\n norm,\n indices\n });\n }\n });\n } else {\n const { v: text, n: norm } = value;\n\n const { isMatch, score, indices } = searcher.searchIn(text);\n\n if (isMatch) {\n matches.push({ score, key, value: text, norm, indices });\n }\n }\n\n return matches\n }\n}\n\nFuse.version = '7.0.0';\nFuse.createIndex = createIndex;\nFuse.parseIndex = parseIndex;\nFuse.config = Config;\n\n{\n Fuse.parseQuery = parse;\n}\n\n{\n register(ExtendedSearch);\n}\n\nexport { Fuse as default };\n"],"file":"assets/fuse-zg_VFt4r.js"}