@emailmaker/emailmaker 1.0.101-alpha.7 → 1.0.101-alpha.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/asset-manifest.json +14 -14
- package/emailmaker-esm.js +1 -1
- package/emailmaker-esm.js.map +1 -1
- package/emailmaker.js +1 -1
- package/emailmaker.js.map +1 -1
- package/iframe/429.js +1 -1
- package/iframe/766.js +1 -1
- package/iframe/iframe-eblock.3b219999159c274b0005.html +1 -1
- package/iframe/iframe.3b219999159c274b0005.html +1 -1
- package/iframe/js/174.5fa023eb.js +1 -0
- package/iframe/sandbox-eblock.js +1 -1
- package/iframe/sandbox.js +1 -1
- package/package.json +1 -1
- package/static/css/7524.9e892240.chunk.css +2 -0
- package/static/css/7524.9e892240.chunk.css.map +1 -0
- package/static/js/3628.1433fac3.js +3 -0
- package/static/js/3628.1433fac3.js.map +1 -0
- package/static/js/{7524.88c832e6.js → 7524.8972d885.js} +2 -2
- package/static/js/7524.8972d885.js.map +1 -0
- package/static/js/8127.af873e4f.js +2 -0
- package/static/js/8127.af873e4f.js.map +1 -0
- package/static/js/{emailmaker_core.13a7df7a.js → emailmaker_core.0fd2d908.js} +3 -3
- package/static/js/{emailmaker_core.13a7df7a.js.map → emailmaker_core.0fd2d908.js.map} +1 -1
- package/iframe/js/174.be615ed7.js +0 -1
- package/static/css/7524.37a2aade.chunk.css +0 -2
- package/static/css/7524.37a2aade.chunk.css.map +0 -1
- package/static/js/3628.3d15c80e.js +0 -3
- package/static/js/3628.3d15c80e.js.map +0 -1
- package/static/js/7524.88c832e6.js.map +0 -1
- package/static/js/8127.a932bc50.js +0 -2
- package/static/js/8127.a932bc50.js.map +0 -1
- /package/iframe/js/{174.be615ed7.js.LICENSE.txt → 174.5fa023eb.js.LICENSE.txt} +0 -0
- /package/static/js/{3628.3d15c80e.js.LICENSE.txt → 3628.1433fac3.js.LICENSE.txt} +0 -0
- /package/static/js/{emailmaker_core.13a7df7a.js.LICENSE.txt → emailmaker_core.0fd2d908.js.LICENSE.txt} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"static/js/7524.88c832e6.js","mappings":"wUAAiBA,EAAM,IAAAC,KAAND,IAAAA,EAAM,KAapBE,QAZM,SACLC,EACAC,EACAC,EAA6CA,CAACC,EAAUC,IAAaD,IAAUC,GAE/E,GAAIJ,IAASC,EAAM,OAAO,EAC1B,MAAMI,EAASL,EAAKK,OACpB,GAAIA,IAAWJ,EAAKI,OAAQ,OAAO,EACnC,IAAK,IAAIC,EAAQ,EAAGA,EAAQD,EAAQC,IAClC,IAAKJ,EAAUF,EAAKM,GAAQL,EAAKK,IAAS,OAAO,EAEnD,OAAO,CACT,EAeCR,EAAAS,OAXM,SAAmBC,EAAUC,GAC7BA,IACHA,EAAQC,GAASA,GAEnB,MAAMC,EAAM,IAAIC,IAChB,OAAOJ,EAAIK,OAAQH,IACjB,MAAMI,EAAKL,EAAKC,GACVK,GAAUJ,EAAIK,IAAIF,GAExB,OADAH,EAAIM,IAAIH,GACDC,GAEX,E,qCCLF,SAASG,EAAmBC,GAC1B,OAAgB,MAAZA,GAAiC,KAAbA,EAHT,GAIRA,CACT,CAEA,SAASC,EAAkBC,GACzB,GAAgB,MAAZA,EAAkB,OAAOC,IAC7B,MAAMC,EAAIC,OAAOH,GACjB,OAAOG,OAAOC,SAASF,IAAMA,GAAK,EAAIA,EAAID,GAC5C,CAEA,SAASI,EAAYC,GACnB,IAAKA,EAAQ,OAAO,KACpB,MAAMC,EAAID,EAAOE,SACjB,OAAS,MAALD,EAAkB,KACfE,OAAOF,EAChB,CAEA,SAASG,EAAeC,GACtB,QAASA,GAAKA,EAAEC,QAClB,CAEA,SAASC,IAAqB,IAAAC,EAC5B,GAA8C,oBAAzB,OAAVC,iBAAU,IAAVA,YAAkB,QAARD,EAAVC,WAAYC,cAAM,IAAAF,OAAR,EAAVA,EAAoBG,YAC7B,OAAOF,WAAWC,OAAOC,aAE3B,IACE,MAAMC,EAAYH,WAAWC,QAAWD,WAAmBI,SAC3D,GAAID,GAAkD,oBAA9BA,EAAUE,gBAAgC,CAChE,MAAMjC,EAAM,IAAIkC,WAAW,IAC3BH,EAAUE,gBAAgBjC,GAC1B,IAAImC,EAAI,GACR,IAAK,IAAIC,EAAI,EAAGA,EAAIpC,EAAIH,OAAQuC,IAC9BD,GAAKnC,EAAIoC,GAAGC,SAAS,IAAIC,SAAS,EAAG,KAEvC,MAAO,MAAMH,GACf,CACF,CAAE,MACA,CAEF,MAAO,eAAeI,KAAKC,MAAMH,SAAS,OAAOI,KAAKC,MAAMD,KAAKE,SAAW3B,OAAO4B,kBAChFP,SAAS,IACTQ,MAAM,EAAG,IACd,CAaA,SAASC,EAAUC,GACjB,IAAKA,GAA4B,kBAAXA,EAAqB,OAAOzB,OAAa,OAANyB,QAAM,IAANA,EAAAA,EAAU,IACnE,MAAMC,EAAID,EACJE,EAAiB,GACjBC,EAA4B,CAAC,EAE7BC,EAAO,CAAC,OAAQ,WAAY,SAAU,YAAa,SAAU,WAAY,SAC/E,IAAK,MAAMC,KAAKC,OAAOC,KAAKN,GAAGO,OAAQ,CACrC,MAAMnC,EAAI4B,EAAEI,GACRD,EAAKK,SAASJ,GAChBH,EAAKQ,KAAK,GAAGL,KAAK9B,OAAQ,OAADF,QAAC,IAADA,EAAAA,EAAK,OAE9B8B,EAAKE,GAAKhC,CAEd,CAEA,MAAMsC,EAAUL,OAAOC,KAAKJ,GAAMrD,OAAS8D,KAAKC,UAAUV,GAAQ,GAC5DW,EAAUZ,EAAKa,KAAK,KACpBC,EAAIL,EA5BZ,SAAmBvB,GACjB,IAAI4B,EAAI,WACR,IAAK,IAAI3B,EAAI,EAAGA,EAAID,EAAEtC,OAAQuC,IAC5B2B,GAAK5B,EAAE6B,WAAW5B,GAClB2B,EAAKA,IAAMA,GAAK,IAAMA,GAAK,IAAMA,GAAK,IAAMA,GAAK,IAAMA,GAAK,OAAU,EAExE,OAAOA,EAAE1B,SAAS,GACpB,CAqBsB4B,CAAUP,GAAW,GACzC,MAAO,GAAGG,IAAUE,EAAI,IAAIA,IAAM,IACpC,CAEO,MAAMG,EAAmBC,WAAAA,GAAA,KACbC,SAAW,IAAIC,IAA2D,KAC1EC,iBAAmB,IAAID,IAExC,KACiBE,aAAe,GAAK,CAE7B/B,GAAAA,GACN,OAAOD,KAAKC,KACd,CAEQgC,cAAAA,GACN,GAAIC,KAAKL,SAASM,KAAOD,KAAKF,aAAc,CAE1C,MAAMI,EAAUC,MAAMC,KAAKJ,KAAKL,SAASO,WAAWpB,KAAK,CAACuB,EAAGC,IAAMD,EAAE,GAAGE,UAAYD,EAAE,GAAGC,WAEnFC,EAAWxC,KAAKC,MAA0B,GAApB+B,KAAKF,cACjC,IAAK,IAAInC,EAAI,EAAGA,EAAI6C,GAAY7C,EAAIuC,EAAQ9E,OAAQuC,IAAK,CACvD,MAAO9B,EAAI4E,GAAUP,EAAQvC,GAC7BqC,KAAKU,iBAAiB7E,EACxB,CACF,CACF,CAEA8E,SAAAA,CAAU9E,GAAwC,IAAA+E,EAChD,OAA4B,QAA5BA,EAAOZ,KAAKL,SAASkB,IAAIhF,UAAG,IAAA+E,OAAA,EAArBA,EAAuBE,KAChC,CAEAC,SAAAA,CAAUlF,GACR,OAAOmE,KAAKL,SAASkB,IAAIhF,EAC3B,CAEAmF,iBAAAA,CAAkBnF,GAChB,MAAMc,EAAIqD,KAAKW,UAAU9E,GACzB,OAAOc,IAAMG,EAAeH,GAAKA,OAAIsE,CACvC,CAEAC,SAAAA,CAAUrF,GACR,MAAMc,EAAIqD,KAAKW,UAAU9E,GACzB,OAAOc,GAAKG,EAAeH,GAAKA,OAAIsE,CACtC,CAEAE,cAAAA,CACEjF,EACAkF,EAAiE,CAAC,GAElE,MAAMC,EAAMpF,EAAmBC,GACzBoF,EAAStB,KAAKH,iBAAiBgB,IAAIQ,GACzC,OAAKC,EACDF,EAAKG,oBAA4BpB,MAAMC,KAAKkB,EAAOE,OACnDJ,EAAKK,YAAoBtB,MAAMC,KAAKkB,EAAOI,SACxC,IAAIvB,MAAMC,KAAKkB,EAAOI,YAAavB,MAAMC,KAAKkB,EAAOE,QAHxC,EAItB,CAEAG,YAAAA,CAAajF,GAA8B,IAAAkF,EACzC,MAAMC,EAAsC,QAA/BD,EAAG5B,KAAKL,SAASkB,IAAInE,EAAOb,WAAG,IAAA+F,EAAAA,EAAI,KAC1CE,EAAOD,EAAUA,EAAQf,MAAQ,KAEjCiB,EAAaD,EAAOrF,EAAYqF,GAAQ,KACxCE,EAAavF,EAAYC,GACzBuF,IAAeH,GAAOhF,EAAegF,GACrCI,EAAepF,EAAeJ,GAEpC,IAAIyF,EACJ,GAAIL,GAAQhF,EAAegF,IAASI,EAAc,CAChD,MAAME,EAAYN,EAAKO,cACjBC,EAAY5F,EAAO2F,mBACPpB,IAAdmB,QAAyCnB,IAAdqB,IAC7BH,EAAyBC,EAE7B,CAEA,GAAIN,IAASC,IAAeC,GAAcC,IAAiBC,GAAe,CACxE,MAAMK,EAAStG,EAAmB8F,GAC5BS,EAAYxC,KAAKH,iBAAiBgB,IAAI0B,GACxCC,IACEP,EAAcO,EAAUd,QAAQe,OAAO/F,EAAOb,IAC7C2G,EAAUhB,MAAMiB,OAAO/F,EAAOb,IACN,IAAzB2G,EAAUhB,MAAMvB,MAAyC,IAA3BuC,EAAUd,QAAQzB,MAClDD,KAAKH,iBAAiB4C,OAAOF,GAGnC,CAEA,IAAIG,EAAehG,OACYuE,IAA3BkB,IACFO,EAAe,IAAKhG,EAAQ2F,cAAeF,IAG7CnC,KAAKL,SAASgD,IAAIjG,EAAOb,GAAI,CAAEiF,MAAO,IAAK4B,GAAgBnC,UAAWP,KAAKjC,QAC3EiC,KAAKD,iBAEL,MAAM6C,EAAS3G,EAAmB+F,GAClC,IAAIa,EAAY7C,KAAKH,iBAAiBgB,IAAI+B,GACrCC,IACHA,EAAY,CAAErB,MAAO,IAAI7F,IAAe+F,QAAS,IAAI/F,KACrDqE,KAAKH,iBAAiB8C,IAAIC,EAAQC,IAEhCX,EAAcW,EAAUnB,QAAQ1F,IAAIU,EAAOb,IAC1CgH,EAAUrB,MAAMxF,IAAIU,EAAOb,GAClC,CAEAiH,yBAAAA,CAA0BlG,EAAyBmG,GACjD,GAAgB,MAAZnG,GAAmC,MAAfmG,GAAuBxG,OAAOyG,MAAMD,GAAc,OAE1E,MAAME,EAAMjD,KAAKL,SAASkB,IAAIjE,GAC9B,IAAKqG,IAAQnG,EAAemG,EAAInC,OAAQ,OAExC,MAAMoC,EAAgB,IAAKD,EAAInC,MAAOuB,cAAeU,GACrD/C,KAAKL,SAASgD,IAAI/F,EAAU,CAAEkE,MAAOoC,EAAe3C,UAAWP,KAAKjC,OACtE,CAEA2C,gBAAAA,CAAiB7E,GAAwE,IAAAsH,EACvF,MAAMF,EAA2B,QAAxBE,EAAGnD,KAAKL,SAASkB,IAAIhF,UAAG,IAAAsH,EAAAA,EAAI,KACrC,IAAKF,EAAK,MAAO,CAAEvG,OAAQ,KAAMR,SAAU,MAC3C,MAAMQ,EAASuG,EAAInC,MACbsC,EAAS3G,EAAYC,GAErB2E,EAAMpF,EAAmBmH,GACzB9B,EAAStB,KAAKH,iBAAiBgB,IAAIQ,GAUzC,OATIC,IACExE,EAAeJ,GAAS4E,EAAOI,QAAQe,OAAO5G,GAC7CyF,EAAOE,MAAMiB,OAAO5G,GACC,IAAtByF,EAAOE,MAAMvB,MAAsC,IAAxBqB,EAAOI,QAAQzB,MAC5CD,KAAKH,iBAAiB4C,OAAOpB,IAIjCrB,KAAKL,SAAS8C,OAAO5G,GACd,CAAEa,OAAQ,IAAKA,GAAUR,SAAUkH,EAC5C,CAEAC,qBAAAA,CAAsBzG,GAIpB,MAAM0G,EAAUtD,KAAKL,SAASkB,IAAIjE,GAClC,IAAK0G,IAAYxG,EAAewG,EAAQxC,OACtC,MAAO,CAAEyC,qBAAsB,GAAIC,6BAA8B,IAGnE,MAAMC,EAAyD,CAC7D,CAAE5H,GAAIe,EAAUV,SAAUO,EAAY6G,EAAQxC,SAE1C4C,EAA4D,GAC5DC,EAAiC,GAEvC,KAAOF,EAAYrI,QAAQ,CACzB,MAAMwI,EAAMH,EAAYI,QACxBH,EAAe1E,KAAK4E,GACpB,MAAMtC,EAAStB,KAAKH,iBAAiBgB,IAAI5E,EAAmB2H,EAAI/H,KAChE,GAAKyF,EAAL,CAEA,IAAK,MAAMwC,KAAiB3D,MAAMC,KAAKkB,EAAOI,SAAU,CACtD,MAAMqC,EAAW/D,KAAKL,SAASkB,IAAIiD,GAC/BC,GACFN,EAAYzE,KAAK,CAAEnD,GAAIiI,EAAe5H,SAAUO,EAAYsH,EAASjD,QAEzE,CACA,IAAK,MAAMkD,KAAO7D,MAAMC,KAAKkB,EAAOE,OAClCmC,EAAqB3E,KAAKgF,EATP,CAWvB,CAEA,MAAMR,EAAiD,GACvD,IAAK,MAAMQ,KAAOL,EAAsB,CACtC,MAAMV,EAAMjD,KAAKL,SAASkB,IAAImD,GAC9B,IAAKf,EAAK,SACV,MAAMgB,EAAOhB,EAAInC,MACXoD,EAAOjI,EAAmBQ,EAAYwH,IACtCE,EAAUnE,KAAKH,iBAAiBgB,IAAIqD,GACtCC,IACFA,EAAQ3C,MAAMiB,OAAOuB,GACM,IAAvBG,EAAQ3C,MAAMvB,MAAuC,IAAzBkE,EAAQzC,QAAQzB,MAAYD,KAAKH,iBAAiB4C,OAAOyB,IAE3FlE,KAAKL,SAAS8C,OAAOuB,GACrBR,EAA6BxE,KAAK,IAAKiF,GACzC,CAEA,MAAMV,EAAyC,GAC/C,IAAK,IAAI5F,EAAI+F,EAAetI,OAAS,EAAGuC,GAAK,EAAGA,IAAK,CACnD,MAAM,GAAE9B,EAAE,SAAEK,GAAawH,EAAe/F,GAClCsF,EAAMjD,KAAKL,SAASkB,IAAIhF,GAC9B,IAAKoH,EAAK,SACV,MAAMmB,EAASnB,EAAInC,MAEbO,EAAMpF,EAAmBmI,EAAOvI,IACtCmE,KAAKH,iBAAiB4C,OAAOpB,GAE7B,MAAM6C,EAAOjI,EAAmBC,GAC1BiI,EAAUnE,KAAKH,iBAAiBgB,IAAIqD,GACtCC,IACFA,EAAQzC,QAAQe,OAAO5G,GACI,IAAvBsI,EAAQ3C,MAAMvB,MAAuC,IAAzBkE,EAAQzC,QAAQzB,MAAYD,KAAKH,iBAAiB4C,OAAOyB,IAG3FlE,KAAKL,SAAS8C,OAAO5G,GACrB0H,EAAqBvE,KAAK,IAAKoF,GACjC,CAEA,MAAO,CAAEb,uBAAsBC,+BACjC,CAEAa,cAAAA,CAAeC,EAAkBC,GAAsD,IAAAC,EACrF,MAAMvB,EAAiC,QAA9BuB,EAAGxE,KAAKL,SAASkB,IAAIyD,UAAS,IAAAE,EAAAA,EAAI,KAC3C,IAAKvB,EAAK,OAAO,KACjB,MAAMwB,EAAMxB,EAAInC,MAGV4D,EAAUzI,EADGQ,EAAYgI,IAEzBE,EAAa3E,KAAKH,iBAAiBgB,IAAI6D,GACzCC,IACE7H,EAAe2H,GAAME,EAAWjD,QAAQe,OAAO6B,GAC9CK,EAAWnD,MAAMiB,OAAO6B,GACC,IAA1BK,EAAWnD,MAAMvB,MAA0C,IAA5B0E,EAAWjD,QAAQzB,MAAYD,KAAKH,iBAAiB4C,OAAOiC,IAGjG,MAAME,EAA0B,IAAKH,EAAK7H,SAAU2H,GAEpD,GAAIzH,EAAe2H,IAAQ3H,EAAe8H,GAAU,CAClD,MAAMC,EAAgBJ,EAAIpC,mBACJpB,IAAlB4D,IACFD,EAAQvC,cAAgBwC,EAE5B,CAEA7E,KAAKL,SAASgD,IAAI2B,EAAU,CAAExD,MAAO8D,EAASrE,UAAWP,KAAKjC,QAE9D,MAAM+G,EAAU7I,EAAmBsI,GACnC,IAAIQ,EAAa/E,KAAKH,iBAAiBgB,IAAIiE,GAQ3C,OAPKC,IACHA,EAAa,CAAEvD,MAAO,IAAI7F,IAAe+F,QAAS,IAAI/F,KACtDqE,KAAKH,iBAAiB8C,IAAImC,EAASC,IAEjCjI,EAAe8H,GAAUG,EAAWrD,QAAQ1F,IAAIsI,GAC/CS,EAAWvD,MAAMxF,IAAIsI,GAEnB,IAAKM,EACd,CAEAI,kBAAAA,CAAmBC,EAAgBC,EAAeC,GAAsD,IAAAC,EACtG,MAAMnC,EAA+B,QAA5BmC,EAAGpF,KAAKL,SAASkB,IAAIoE,UAAO,IAAAG,EAAAA,EAAI,KACzC,IAAKnC,GAAOnG,EAAemG,EAAInC,OAAQ,OAAO,KAC9C,MACMuE,EAAuB,IADhBpC,EAAInC,MACuBjF,GAAIqJ,EAAOtI,SAAUuI,GAE7D,OADAnF,KAAK2B,aAAa0D,GACX,IAAKA,EACd,CAEAC,iBAAAA,CAAkB1I,EAAkBsI,EAAeX,GAAsD,IAAAgB,EACvG,MAAMtC,EAAiC,QAA9BsC,EAAGvF,KAAKL,SAASkB,IAAIjE,UAAS,IAAA2I,EAAAA,EAAI,KAC3C,IAAKtC,IAAQnG,EAAemG,EAAInC,OAAQ,OAAO,KAC/C,MACMuE,EAAuB,IADdpC,EAAInC,MACuBjF,GAAIqJ,EAAOtI,SAAU2H,GAE/D,OADAvE,KAAK2B,aAAa0D,GACX,IAAKA,EACd,CAEAG,aAAAA,CAAc3J,EAAY4J,GAAwB,IAAAC,EAChD,MAAMzC,EAA2B,QAAxByC,EAAG1F,KAAKL,SAASkB,IAAIhF,UAAG,IAAA6J,EAAAA,EAAI,KACrC,OAAKzC,GACDwC,IAAUpJ,KACP2D,KAAKjC,MAAQkF,EAAI1C,UAAYkF,CACtC,CAEAE,KAAAA,CAAM9J,EAAY+J,GAChB,MAAM3C,EAAMjD,KAAKL,SAASkB,IAAIhF,GACzBoH,IACLA,EAAI1C,UAAc,OAAFqF,QAAE,IAAFA,EAAAA,EAAM5F,KAAKjC,MAC7B,CAEA8H,gBAAAA,CAA2CnK,GACzC,OAAOA,EAAIoK,IAAKjK,IAAE,IAAAkK,EAAAC,EAAA,OAAiC,QAAjCD,EAA0B,QAA1BC,EAAKhG,KAAKL,SAASkB,IAAIhF,UAAG,IAAAmK,OAAA,EAArBA,EAAuBlF,aAAK,IAAAiF,EAAAA,EAAI,MACzD,CAEAE,MAAAA,GACE,MAAO,CACLtG,SAAUQ,MAAMC,KAAKJ,KAAKL,SAASO,WACnCL,iBAAkBM,MAAMC,KAAKJ,KAAKH,iBAAiBK,WAAW4F,IAAI,EAAEnH,EAAGhC,KAAO,CAC5EgC,EACA,CAAE6C,MAAOrB,MAAMC,KAAKzD,EAAE6E,OAAQE,QAASvB,MAAMC,KAAKzD,EAAE+E,YAG1D,CAEA,eAAOwE,CAASC,GACd,MAAMC,EAAM,IAAI3G,EAChB,IAAK,MAAO5D,EAAIoH,KAAqB,QAAjBoD,EAAIF,EAAKxG,gBAAQ,IAAA0G,EAAAA,EAAI,GAAI,KAAAA,EAC3CD,EAAIzG,SAASgD,IAAI9G,EAAI,CAAEiF,MAAOmC,EAAInC,MAAOP,UAAW0C,EAAI1C,WAC1D,CACA,IAAK,MAAO5B,EAAG2C,KAAgC,QAAzBgF,EAAIH,EAAKtG,wBAAgB,IAAAyG,EAAAA,EAAI,GAAI,KAAAA,EACrDF,EAAIvG,iBAAiB8C,IAAIhE,EAAG,CAC1B6C,MAAO,IAAI7F,IAAI2F,EAAOE,OACtBE,QAAS,IAAI/F,IAAI2F,EAAOI,UAE5B,CACA,OAAO0E,CACT,EA4BK,MAAMG,EAgBX7G,WAAAA,CAAY8G,EAA+B,CAAC,EAAGC,EAAM,IAASC,EAAW,IAAQC,GAAoB,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,KAfpFC,MAAQ,IAAIrH,IAA2D,KACvEsH,cAAQ,OACRT,SAAG,OACHC,cAAQ,OACRC,eAAS,OAClBQ,gCAA0B,OAK1BC,8BAAwB,EAEhC,KACiBC,kBAAoB,GAGnCrH,KAAKkH,SAAW,CACdI,kBAA4C,QAA3BV,EAAEJ,EAAQc,yBAAiB,IAAAV,GAAAA,EAC5CW,kBAA4C,QAA3BV,EAAEL,EAAQe,yBAAiB,IAAAV,GAAAA,EAC5CW,2BAA8D,QAApCV,EAAEN,EAAQgB,kCAA0B,IAAAV,GAAAA,EAC9DW,mBAA8C,QAA5BV,EAAEP,EAAQiB,0BAAkB,IAAAV,EAAAA,EAAI,EAClDW,kBAA4C,QAA3BV,EAAER,EAAQkB,yBAAiB,IAAAV,EAAAA,EAAI,EAChDW,WAAYnB,EAAQmB,WACpBC,YAAapB,EAAQoB,aAEvB5H,KAAKyG,IAAMA,EACXzG,KAAK0G,SAAWA,EAChB1G,KAAK2G,UAAqB,OAATA,QAAS,IAATA,EAAAA,EAAaF,CAChC,CAEAoB,6BAAAA,CACEC,GAEA9H,KAAKmH,2BAA6BW,CACpC,CAEAC,2BAAAA,CAA4BD,GAC1B9H,KAAKoH,yBAA2BU,CAClC,CAEQ/J,GAAAA,GACN,OAAOD,KAAKC,KACd,CAEQiK,SAAAA,CAAU9L,GAChB,OAAOD,EAA2B,OAARC,QAAQ,IAARA,EAAAA,EAAY,KACxC,CAEQ+L,SAAAA,CAAU1H,GAChB,OAAiB,MAAbA,GACAP,KAAKyG,MAAQpK,KACV2D,KAAKjC,MAAQwC,EAAYP,KAAKyG,GACvC,CAEQyB,cAAAA,CAAe3H,GACrB,OAAiB,MAAbA,GACAP,KAAK0G,WAAarK,KACf2D,KAAKjC,MAAQwC,EAAYP,KAAK0G,QACvC,CAEQyB,gBAAAA,CAAiBzM,EAA2B0M,GAClD,OAAK1M,GAGEA,EAAI2M,KAAMxM,IAAQuM,EAAgBzH,UAAU9E,IAAOuM,EAAgB5C,cAAc3J,EAAImE,KAAK2G,WACnG,CAEQ2B,sBAAAA,CAAuB5L,EAAwB6L,GACrD,OAAKA,GAAyB,QAAbA,IACA,SAAbA,IAAwBzL,EAAeJ,MAC1B,WAAb6L,IAAyBzL,EAAeJ,IAE9C,CAEQ8L,eAAAA,CAAgBlH,GACtB,GAAIA,EAAOrB,MAAQD,KAAKqH,kBAAmB,OAE3C,MAAMnH,EAAUC,MAAMC,KAAKkB,EAAOpB,WAAWpB,KAC3C,CAACuB,EAAGC,KAAOA,EAAE,GAAGmI,KAAKlI,WAAa,IAAMF,EAAE,GAAGoI,KAAKlI,WAAa,IAIjE,KAAOe,EAAOrB,KAAOD,KAAKqH,mBAAqBnH,EAAQ9E,OAAS,GAAG,CACjE,MAAOiG,GAAOnB,EAAQwI,MACtBpH,EAAOmB,OAAOpB,EAChB,CACF,CAEA,yBAAMsH,CACJzM,EACAoC,EACAsK,EACAR,GACsC,IAAAS,EACtC,MAAM3E,EAAOlE,KAAKgI,UAAU9L,GACtB4M,EAAOzK,EAAgB,OAANC,QAAM,IAANA,EAAAA,EAAU,CAAC,GAElC,IAAIgD,EAAStB,KAAKiH,MAAMpG,IAAIqD,GACvB5C,IACHA,EAAS,IAAI1B,IACbI,KAAKiH,MAAMtE,IAAIuB,EAAM5C,IAGvB,IAAI2B,EAAM3B,EAAOT,IAAIiI,GACrB,IAAK7F,EAAK,CASRA,EAAM,CAAE3E,SAAQmK,KARQ,CACtBM,QAAS,KACTjI,WAAOG,EACP+H,UAAM/H,EACNgI,WAAOhI,EACPV,UAAW,EACX2I,OAAQ,OAGV5H,EAAOqB,IAAImG,EAAM7F,GACjBjD,KAAKwI,gBAAgBlH,EACvB,CAEA,GAAI2B,EAAIwF,KAAKQ,QAAUjJ,KAAKkI,eAAejF,EAAIwF,KAAKlI,WAAY,MAAM0C,EAAIwF,KAAKQ,MAE/E,GACEhG,EAAIwF,KAAK3H,QACRd,KAAKiI,UAAUhF,EAAIwF,KAAKlI,aACxBP,KAAKmI,iBAAiBlF,EAAIwF,KAAK3H,MAAOsH,KACzB,QAAdS,EAAC5F,EAAIwF,KAAKO,YAAI,IAAAH,IAAbA,EAAeM,OAChB,KAAAC,EAAAC,EACA,MAAMC,EAAWrG,EAAIwF,KAAK3H,MAAMgF,IAAKjK,GAAOuM,EAAgBzH,UAAU9E,IAAKD,OAAO2N,SAC5EhB,GAAqB,QAAVa,EAAAnG,EAAI3E,cAAM,IAAA8K,OAAA,EAAVA,EAAYb,WAAY,MAEzC,MAAO,CAAEiB,MADKF,EAAS1N,OAAQH,GAASuE,KAAKsI,uBAAuB7M,EAAM8M,OACzC,QAAjBc,EAAIpG,EAAIwF,KAAKO,YAAI,IAAAK,EAAAA,EAAI,CAAC,EACxC,CAEA,GAAIpG,EAAIwF,KAAKM,QAAS,OAAO9F,EAAIwF,KAAKM,QAEtC,MAAMU,EAAWxM,IACjBgG,EAAIwF,KAAKS,OAASO,EAElB,MAAMV,EAAU,WACd,IAAI,IAAAW,EAAAC,EAAAC,EACF,MAAM9N,QAAe8M,EAAO1M,EAAUoC,GAGhCuL,EAAiC,QAAvBH,EAAG1J,KAAKiH,MAAMpG,IAAIqD,UAAK,IAAAwF,OAAA,EAApBA,EAAsB7I,IAAIxC,EAAUC,IACvD,IAAKuL,GAAcA,EAAWpB,KAAKS,SAAWO,EAAU,CAEtD,MAAMK,EAAW,IAAIC,MAAM,aAE3B,MADAD,EAAIE,KAAO,YACLF,CACR,CAEA,IAAK,MAAMG,KAAKnO,EAAO0N,MAAOpB,EAAgBzG,aAAasI,GAE3DhH,EAAKwF,KAAK3H,MAAQhF,EAAO0N,MAAM1D,IAAKoE,GAAMA,EAAErO,IAC5C,MAAM,MAAE2N,KAAUR,GAASlN,EACrBqO,EAAgB,IAAKnB,GAC3B/F,EAAKwF,KAAKO,KAAOmB,EACjBlH,EAAKwF,KAAKO,KAAKG,OAAQ,EACvBlG,EAAKwF,KAAKQ,MAAQ,KAClBhG,EAAKwF,KAAKlI,UAAYP,KAAKjC,MAEG,kBAAnBoM,EAASC,QACdpK,KAAKmH,2BACPnH,KAAKmH,2BAAmC,OAARjL,QAAQ,IAARA,EAAAA,EAAY,KAAMiO,EAASC,MAAOhC,GAElEA,EAAgBtF,0BAA0B5G,EAAUiO,EAASC,QAIjE,MAAMC,EAA8C,QAAlCV,EAAG3J,KAAKkH,SAASQ,yBAAiB,IAAAiC,EAAAA,EAAI,EAClDW,EAAgD,QAAnCV,EAAG5J,KAAKkH,SAASO,0BAAkB,IAAAmC,EAAAA,EAAI,EACpDxN,EAAWD,EAAwB,OAANmC,QAAM,IAANA,OAAM,EAANA,EAAQlC,UACrCmO,EAAchO,OAAOC,SAASJ,GAEpC,IAAKiO,EAAe,GAAKC,EAAgB,IAAMC,EAAa,KAAAC,EAC1D,MAAMC,EAAgBvO,EAChBwO,EAAc,IAAKpM,GACnBqM,EAAiD,kBAAxBR,EAASS,WAA0BT,EAASS,WAAa,EAClFC,EAA+B,QAAfL,EAAS,OAANlM,QAAM,IAANA,OAAM,EAANA,EAAQwM,YAAI,IAAAN,EAAAA,EAAI,EACnCO,EAAgB3O,EAChB4O,EAAcpC,EACdqC,EAAcxB,EAEpByB,WAAW,KACTlL,KAAKmL,kBACHV,EACAC,EACAG,EACAF,EACAI,EACAV,EACAC,EACAlC,EACA+B,EACAa,EACAC,IAED,EACL,CAEA,OAAOnP,CACT,CAAE,MAAOgO,GACP,GAA2B,eAAnB,OAAHA,QAAG,IAAHA,OAAG,EAAHA,EAAaE,MAKhB,MAHA/G,EAAKwF,KAAKQ,MAAQ,KAClBhG,EAAKwF,KAAK3H,WAAQG,EAClBgC,EAAKwF,KAAKlI,UAAYP,KAAKjC,MACrB+L,EAKR,MAHA7G,EAAKwF,KAAKQ,MAAQa,EAClB7G,EAAKwF,KAAK3H,WAAQG,EAClBgC,EAAKwF,KAAKlI,UAAYP,KAAKjC,MACrB+L,CACR,CAAE,QACA7G,EAAKwF,KAAKM,QAAU,IACtB,CACD,EA9Ee,GAiFhB,OADA9F,EAAIwF,KAAKM,QAAUA,EACZA,CACT,CAMA,uBAAcoC,CACZjP,EACAkP,EACAC,EACAC,EACAlP,EACAiO,EACAC,EACAlC,EACAmD,EACA3C,EACA4C,GAEA,IACE,MAAMtH,EAAOlE,KAAKgI,UAAU9L,GACtBoF,EAAStB,KAAKiH,MAAMpG,IAAIqD,GAC9B,IAAK5C,EAAQ,OAEb,MAAMmK,EAAUnK,EAAOT,IAAIxC,EAAU+M,IACrC,IAAKK,EAAS,OACd,GAAqB,MAAjBD,GAAyBC,EAAQhD,KAAKS,SAAWsC,EAAe,OAEpE,MAAM3B,EAAavI,EAAOT,IAAIxC,EAAU+M,IACxC,GAAe,OAAVvB,QAAU,IAAVA,IAAAA,EAAYpB,KAAKO,KAAM,OAE5B,MAAM0C,EACuC,kBAApC7B,EAAWpB,KAAKO,KAAK4B,WAA0Bf,EAAWpB,KAAKO,KAAK4B,WAAa,EAE1F,GAAIc,IAAsBJ,EAAmB,OAE7C,MAAMK,EAAYC,UAChB,MAAMC,EAAkC,IAAKT,EAAaN,KAAMgB,GAEhE,IACE,MAAMC,QAAsBnD,EAAO1M,EAAU2P,GAEvCG,EAAYhM,KAAKiH,MAAMpG,IAAIqD,GACjC,IAAK8H,EAAW,OAChB,MAAMC,EAAaD,EAAUnL,IAAIxC,EAAU+M,IAC3C,IAAKa,EAAY,OACjB,GAAqB,MAAjBT,GAAyBS,EAAWxD,KAAKS,SAAWsC,EAAe,OAGvE,GADoBS,EAAWxD,KAAKS,SAChBsC,EAAe,OAEnC,IAAK,MAAMvB,KAAK8B,EAAcvC,MAAOpB,EAAgBzG,aAAasI,GAElE,MAAMiC,EAAU7N,EAAUwN,GAC1B,IAAIM,EAAUH,EAAUnL,IAAIqL,GAC5B,IAAKC,EAAS,CASZA,EAAU,CAAE7N,OAAQuN,EAAYpD,KARR,CACtBM,QAAS,KACTjI,WAAOG,EACP+H,UAAM/H,EACNgI,WAAOhI,EACPV,UAAW,EACX2I,OAAQ+C,EAAWxD,KAAKS,SAG1B8C,EAAUrJ,IAAIuJ,EAASC,GACvBnM,KAAKwI,gBAAgBwD,EACvB,CAEA,IAAKG,EAAQ1D,KAAK3H,OAASd,KAAKiI,UAAUkE,EAAQ1D,KAAKlI,WAAY,CACjE4L,EAAQ1D,KAAK3H,MAAQiL,EAAcvC,MAAM1D,IAAKoE,GAAMA,EAAErO,IACtD,MAAM,MAAE2N,KAAUR,GAAS+C,EAC3BI,EAAQ1D,KAAKO,KAAO,IAAKA,EAAM8B,KAAMgB,EAASlB,WAAYc,GAC1DS,EAAQ1D,KAAKlI,UAAYP,KAAKjC,KAChC,CACF,CAAE,MAAOkL,GAET,GAGF,GAAIoB,EAAe,GAAKgB,EAAcK,EACpC,IAAK,IAAI/N,EAAI,EAAGA,GAAKK,KAAKoO,IAAI/B,EAAcqB,EAAoBL,GAAc1N,IAAK,CACjF,MAAMmO,EAAUT,EAAc1N,EAExBuO,EAAU7N,EADwB,IAAK+M,EAAaN,KAAMgB,IAE1DK,EAAU7K,EAAOT,IAAIqL,GACf,OAAPC,QAAO,IAAPA,GAAAA,EAAS1D,KAAK3H,QAASd,KAAKiI,UAAUkE,EAAQ1D,KAAKlI,YACtDoL,EAAUG,EAEd,CAGF,GAAIxB,EAAgB,GAAKe,EAAc,EACrC,IAAK,IAAI1N,EAAI,EAAGA,GAAKK,KAAKoO,IAAI9B,EAAee,EAAc,GAAI1N,IAAK,CAClE,MAAMmO,EAAUT,EAAc1N,EAExBuO,EAAU7N,EADwB,IAAK+M,EAAaN,KAAMgB,IAE1DK,EAAU7K,EAAOT,IAAIqL,GACf,OAAPC,QAAO,IAAPA,GAAAA,EAAS1D,KAAK3H,QAASd,KAAKiI,UAAUkE,EAAQ1D,KAAKlI,YACtDoL,EAAUG,EAEd,CAEJ,CAAE,MAAO7C,GAGT,CACF,CAEQoD,uBAAAA,CACN/K,EACA6K,EACAL,EACAlB,EACA0B,GAEA,GAAKH,EAAQ1D,KAAK3H,OACgB,IAA9BqL,EAAQ1D,KAAK3H,MAAM1F,QACjB0Q,EAAUlB,EAAY,CACxB,MAAMsB,EAAU7N,EAAU,IAAKiO,EAAYxB,KAAMgB,IACjDxK,EAAOmB,OAAOyJ,EAChB,CAEJ,CAEQK,2BAAAA,CACNjL,EACAkL,GAEA,IAAK,MAAO,CAAEvJ,KAAQ3B,EAChB2B,EAAIwF,KAAKO,OACX/F,EAAIwF,KAAKO,KAAK4B,WAAa4B,EAGjC,CAEQC,YAAAA,CAAapM,EAAwBC,GAC3C,MAAMoM,EAAQ9N,OAAOC,KAAM,OAADwB,QAAC,IAADA,EAAAA,EAAK,CAAC,GAAGzE,OAAQ+C,GAAY,SAANA,GAAcG,OACzD6N,EAAQ/N,OAAOC,KAAM,OAADyB,QAAC,IAADA,EAAAA,EAAK,CAAC,GAAG1E,OAAQ+C,GAAY,SAANA,GAAcG,OAC/D,GAAI4N,EAAMtR,SAAWuR,EAAMvR,OAAQ,OAAO,EAC1C,IAAK,IAAIuC,EAAI,EAAGA,EAAI+O,EAAMtR,OAAQuC,IAAK,CACrC,MAAMgB,EAA+B+N,EAAM/O,GAC3C,GAAIgB,IAAMgO,EAAMhP,GACd,OAAO,EAET,GAAI0C,EAAE1B,KAAO2B,EAAE3B,GACb,OAAO,CAEX,CACA,OAAO,CACT,CAEQiO,qBAAAA,CACNtL,EACAuL,GACM,IAAAC,EACN,MAAM9D,EAAO6D,EAAQpE,KAAKO,KAC1B,IAAKA,GAA8B,kBAAfA,EAAKoB,MAAoB,OAC7C,MAAMA,EAAQ7N,OAAOyM,EAAKoB,OACpBhO,EAAWD,EAAgC,QAAf2Q,EAACD,EAAQvO,cAAM,IAAAwO,OAAA,EAAdA,EAAgB1Q,UAE7CwO,EADcrO,OAAOC,SAASJ,IAAaA,EAAW,EAC3B4B,KAAK+O,IAAI,EAAG/O,KAAKgP,KAAK5C,EAAQhO,SAAa6E,EAE5E,IAAK,MAAO,CAAEgC,KAAQ3B,EAAQ,KAAA2L,EAAAC,EACvBlN,KAAKyM,aAAuB,QAAXQ,EAAChK,EAAI3E,cAAM,IAAA2O,EAAAA,EAAI,CAAC,EAAiB,QAAhBC,EAAEL,EAAQvO,cAAM,IAAA4O,EAAAA,EAAI,CAAC,KACvDjK,EAAIwF,KAAKO,OAAM/F,EAAIwF,KAAKO,KAAO,CAAC,GACrC/F,EAAIwF,KAAKO,KAAKoB,MAAQA,OACHnJ,IAAf2J,IACF3H,EAAIwF,KAAKO,KAAK4B,WAAaA,GAE/B,CACF,CAGQuC,yBAAAA,CAA0Bb,GAChC,OAAKA,EAAWc,SAAWd,EAAWe,aAClCrN,KAAKkH,SAASS,UAEpB,CAEQ2F,iBAAAA,CACNhM,EACAiM,EACAC,EACApR,EACAwO,EACAxC,EACAkE,GAEA,IAAImB,EAAiBF,EACjBG,EAAiBF,EACjBG,GAAsB,EAI1B,IAAIC,EAAa,EAEjB,KACEH,EAAehF,KAAK3H,OACpB2M,EAAehF,KAAK3H,MAAM1F,OAASgB,GACnCsR,EAAiB9C,GACjBgD,EAPoB,KAQpB,CACAA,IAEA,MACMC,EAAcxP,EADwB,IAAKiO,EAAYxB,KAAM4C,EAAiB,IAE9EI,EAAcxM,EAAOT,IAAIgN,GAE/B,GAAgB,OAAXC,QAAW,IAAXA,IAAAA,EAAarF,KAAK3H,OAASd,KAAKiI,UAAU6F,EAAYrF,KAAKlI,WAAY,KAAAwN,EAC1EN,EAAehF,KAAKO,KAAO,IAA8B,QAA5B+E,EAAIN,EAAehF,KAAKO,YAAI,IAAA+E,EAAAA,EAAI,CAAC,EAAI5E,OAAO,GACzE,KACF,CAEA,MAAM6E,EAAS5R,EAAWqR,EAAehF,KAAK3H,MAAM1F,OAE9C6S,EADaH,EAAYrF,KAAK3H,MAAM1C,MAAM,EAAG4P,GACrBpS,OAAQC,GAAOuM,EAAgBzH,UAAU9E,IAEvE,GAA0B,IAAtBoS,EAAW7S,OAAc,KAAA8S,EAC3BT,EAAehF,KAAKO,KAAO,IAA8B,QAA5BkF,EAAIT,EAAehF,KAAKO,YAAI,IAAAkF,EAAAA,EAAI,CAAC,EAAI/E,OAAO,GACzE,KACF,CAQA,GANAsE,EAAehF,KAAK3H,MAAQ,IAAI2M,EAAehF,KAAK3H,SAAUmN,GAC9DR,EAAehF,KAAKlI,UAAYzC,KAAKC,MAErC+P,EAAYrF,KAAK3H,MAAQgN,EAAYrF,KAAK3H,MAAM1C,MAAM6P,EAAW7S,QACjE0S,EAAYrF,KAAKlI,UAAYzC,KAAKC,MAEI,IAAlC+P,EAAYrF,KAAK3H,MAAM1F,OAAc,CACvC,MAAM+S,EAAcT,EAAiB,EAC/BU,EAAeN,EAAYrF,KAAKO,KAGtC,GAAImF,GADFC,GAAmD,kBAA5BA,EAAaxD,WAA0BwD,EAAaxD,WAAa,GACpD,CACpC,MAAMsB,EAAU7N,EAAU,IAAKiO,EAAYxB,KAAMqD,IACjD7M,EAAOmB,OAAOyJ,GACdyB,GAAsB,CACxB,CACA,KACF,CAEAF,EAAiBK,EACjBJ,GACF,CAEiH,IAAAW,IAA3GZ,EAAehF,KAAK3H,OAAS2M,EAAehF,KAAK3H,MAAM1F,OAASgB,IAAasR,GAAkB9C,IACnG6C,EAAehF,KAAKO,KAAO,IAA8B,QAA5BqF,EAAIZ,EAAehF,KAAKO,YAAI,IAAAqF,EAAAA,EAAI,CAAC,EAAIlF,OAAO,IAG3E,OAAOwE,CACT,CAEQW,sBAAAA,CACNhN,EACAmM,EACAC,EACAtR,EACAwO,EACAxC,EACAkE,GACS,IAAAiC,EAAAC,EACT,IAAKf,EAAehF,KAAK3H,OAAS2M,EAAehF,KAAK3H,MAAM1F,QAAUgB,EAAU,OAAO,EAI9B,IAAAqS,EAAzD,GAAIf,GAAkBpB,EAAWxB,MAAQ,IADxB,GAGf,OADA2C,EAAehF,KAAKO,KAAO,IAA8B,QAA5ByF,EAAIhB,EAAehF,KAAKO,YAAI,IAAAyF,EAAAA,EAAI,CAAC,EAAItF,OAAO,IAClE,EAGT,MAAMuF,EAAsC,IAAKpC,EAAYxB,KAAM4C,EAAiB,GAC9EG,EAAcxP,EAAUqQ,GAC9B,IAAIZ,EAAcxM,EAAOT,IAAIgN,GACzBc,GAAoB,EAExB,GAAgB,QAAZJ,EAACT,SAAW,IAAAS,IAAXA,EAAa9F,KAAK3H,OAASd,KAAKiI,UAAU6F,EAAYrF,KAAKlI,WAAY,CAkBnE,IAAAqO,EAjBP,KAAIlB,GAAkB9C,GAmBpB,OADA6C,EAAehF,KAAKO,KAAO,IAA8B,QAA5B4F,EAAInB,EAAehF,KAAKO,YAAI,IAAA4F,EAAAA,EAAI,CAAC,EAAIzF,OAAO,IAClE,EAnByB,CAShC2E,EAAc,CAAExP,OAAQoQ,EAAgBjG,KARhB,CACtBM,QAAS,KACTjI,WAAOG,EACP+H,UAAM/H,EACNgI,WAAOhI,EACPV,UAAW,EACX2I,OAAQ,OAGV5H,EAAOqB,IAAIkL,EAAaC,GACxB9N,KAAKwI,gBAAgBlH,GACrB,MAAMuN,EAAcpB,EAAehF,KAAKO,KACpC6F,IACFf,EAAYrF,KAAKO,KAAO,IAAK6F,EAAa/D,KAAM4C,EAAiB,IAEnEiB,GAAoB,CACtB,CAIF,CAEA,MACMV,EADcR,EAAehF,KAAK3H,MAAM1C,MAAMhC,GACrBR,OAAQC,GAAOuM,EAAgBzH,UAAU9E,IACxE,GAA0B,IAAtBoS,EAAW7S,OAEb,OADIuT,GAAmBrN,EAAOmB,OAAOoL,IAC9B,EAGTJ,EAAehF,KAAK3H,MAAQ2M,EAAehF,KAAK3H,MAAM1C,MAAM,EAAGhC,GAC/DqR,EAAehF,KAAKlI,UAAYzC,KAAKC,MAErC+P,EAAYrF,KAAK3H,MAAQ,IAAImN,KAAsC,QAA1BO,EAAIV,EAAYrF,KAAK3H,aAAK,IAAA0N,EAAAA,EAAI,IACvEV,EAAYrF,KAAKlI,UAAYzC,KAAKC,MAElC,MAAM+Q,EACJhB,EAAYrF,KAAKO,MAAoD,kBAArC8E,EAAYrF,KAAKO,KAAK4B,WACpDkD,EAAYrF,KAAKO,KAAK4B,WACtBA,EAGJ,IAAK+D,EAAmB,CAUtB,GATgC3O,KAAKsO,uBACnChN,EACAwM,EACAJ,EAAiB,EACjBtR,EACA0S,EACA1G,EACAkE,GAE2B,OAAO,CACtC,CAEA,IAAKwB,EAAYrF,KAAK3H,OAA2C,IAAlCgN,EAAYrF,KAAK3H,MAAM1F,OAAc,CAClE,MAAM+S,EAAcT,EAAiB,EAC/BU,EAAeN,EAAYrF,KAAKO,KAChC8F,EACJV,GAAmD,kBAA5BA,EAAaxD,WAA0BwD,EAAaxD,WAAa,EAC1F5K,KAAKqM,wBAAwB/K,EAAQwM,EAAaK,EAAaW,EAAoBxC,EACrF,CAEA,OAAOqC,CACT,CAEQI,eAAAA,CACN9L,EACAvG,EACA0L,GACS,IAAA4G,EACT,MAAMrH,EAAa3H,KAAKkH,SAASS,WACjC,IAAKA,EAAY,OAAO,EACxB,IAAK1E,EAAIwF,KAAK3H,MAAO,OAAO,EAE5B,MAAMyH,GAAqB,QAAVyG,EAAA/L,EAAI3E,cAAM,IAAA0Q,OAAA,EAAVA,EAAYzG,WAAY,MACzC,IAAKvI,KAAKsI,uBAAuB5L,EAAQ6L,GAAW,OAAO,EAE3D,MAAM0G,EAAkBhM,EAAIwF,KAAK3H,MAAMgF,IAAKjK,GAAOuM,EAAgBzH,UAAU9E,IAC7E,GAAIoT,EAAgB5G,KAAM4B,IAAOA,GAAI,OAAO,EAE5C,IAAIiF,EAAK,EACLC,EAAKF,EAAgB7T,OACzB,KAAO8T,EAAKC,GAAI,CACd,MAAMC,EAAMpR,KAAKC,OAAOiR,EAAKC,GAAM,GAC7BE,EAAM1H,EAAWjL,EAAQuS,EAAgBG,GAAOnM,EAAI3E,QAC1D,GAAmB,kBAAR+Q,GAAoB9S,OAAOyG,MAAMqM,GAAM,OAAO,EACrDA,GAAO,EAAGH,EAAKE,EAAM,EACpBD,EAAKC,CACZ,CAEA,OAAInM,EAAIwF,KAAK3H,MAAM/B,SAASrC,EAAOb,KACjCoH,EAAIwF,KAAKlI,UAAYP,KAAKjC,OACnB,IAGTkF,EAAIwF,KAAK3H,MAAQ,IAAImC,EAAIwF,KAAK3H,MAAM1C,MAAM,EAAG8Q,GAAKxS,EAAOb,MAAOoH,EAAIwF,KAAK3H,MAAM1C,MAAM8Q,IACrFjM,EAAIwF,KAAKlI,UAAYP,KAAKjC,MACtBkF,EAAIwF,KAAKO,MAAgD,kBAAhC/F,EAAIwF,KAAKO,KAAaoB,QACjDnH,EAAIwF,KAAKO,KAAKoB,MAAQ7N,OAAO0G,EAAIwF,KAAKO,KAAKoB,OAAS,IAE/C,EACT,CAEQkF,+BAAAA,CACNC,EACA7S,EACA8S,EACApH,GACM,IAAAqH,EAAAC,EAAAC,EAAAC,EACN,MAAMC,EAAkBpT,EAAYC,GAEpC,OAAQ6S,GACN,IAAK,SACHvP,KAAK8P,oBAAoB1H,EAAiByH,GAAkB,GAC/B,QAA7BJ,EAAAzP,KAAKoH,gCAAwB,IAAAqI,GAA7BA,EAAAM,KAAA/P,KAAgC6P,GAChC,MACF,IAAK,SACL,IAAK,OACH7P,KAAK8P,oBAAoB1H,EAAiByH,EAAiB,GAC9B,QAA7BH,EAAA1P,KAAKoH,gCAAwB,IAAAsI,GAA7BA,EAAAK,KAAA/P,KAAgC6P,GAChC,MACF,IAAK,OACH7P,KAAK8P,oBAAoB1H,EAAiBoH,GAAe,GACzDxP,KAAK8P,oBAAoB1H,EAAiByH,EAAiB,GAC9B,QAA7BF,EAAA3P,KAAKoH,gCAAwB,IAAAuI,GAA7BA,EAAAI,KAAA/P,KAAgCwP,GACH,QAA7BI,EAAA5P,KAAKoH,gCAAwB,IAAAwI,GAA7BA,EAAAG,KAAA/P,KAAgC6P,GAGtC,CAEQC,mBAAAA,CAAoB1H,EAAqClM,EAAyB8T,GACxF,IAAK9T,EAAU,OAEf,MAAMkI,EAASgE,EAAgBlH,UAAUhF,GACzC,GAAIkI,GAA0C,kBAAzBA,EAAO/B,cAA4B,CACtD,MAAM4N,EAAWjS,KAAK+O,IAAI,EAAG3I,EAAO/B,cAAgB2N,GACpD5H,EAAgBtF,0BAA0B5G,EAAU+T,EACtD,CACF,CAGAC,4BAAAA,CACEhU,EACAQ,EACA6S,EACAnH,EACAoH,EACAW,GAEA,IAAKzT,EAAQ,OAEbsD,KAAKsP,gCAAgCC,EAAW7S,EAAQ8S,EAAcpH,GAEtE,MAAMlE,EAAOlE,KAAKgI,UAAU9L,GACtBoF,EAAStB,KAAKiH,MAAMpG,IAAIqD,GAC9B,GAAK5C,EAEL,IAAK,MAAO,CAAE2B,KAAQ3B,EAAQ,KAAA8O,EAAAC,EAC5B,MAAM/R,EAAmB,QAAb8R,EAAGnN,EAAI3E,cAAM,IAAA8R,EAAAA,EAAI,CAAC,EACxBtF,EAAmB,QAAfuF,EAAS,OAAN/R,QAAM,IAANA,OAAM,EAANA,EAAQwM,YAAI,IAAAuF,EAAAA,EAAI,EACvBjU,EAAWD,EAAwB,OAANmC,QAAM,IAANA,OAAM,EAANA,EAAQlC,UACrCmO,EAAchO,OAAOC,SAASJ,GAC9BkU,KAAmB,OAANhS,QAAM,IAANA,GAAAA,EAAQ8O,QAAgB,OAAN9O,QAAM,IAANA,GAAAA,EAAQ+O,WACvCkD,IAAoB,OAANjS,QAAM,IAANA,IAAAA,EAAQkS,QACtBjI,GAAiB,OAANjK,QAAM,IAANA,OAAM,EAANA,EAAQiK,WAAY,MAErC,IAAKvI,KAAKsI,uBAAuB5L,EAAQ6L,GAAW,SAEpD,GAAIgI,GAAavQ,KAAKkH,SAASU,cAAgB5H,KAAKkH,SAASU,YAAYlL,EAAQuG,EAAI3E,QAAS,KAAAmS,EAC1E,QAAlBA,EAAIxN,EAAIwF,KAAK3H,aAAK,IAAA2P,GAAdA,EAAgB1R,SAASrC,EAAOb,MAClCoH,EAAIwF,KAAK3H,MAAQmC,EAAIwF,KAAK3H,MAAMlF,OAAQC,GAAOA,IAAOa,EAAOb,IACzDoH,EAAIwF,KAAKO,MAAuC,kBAAxB/F,EAAIwF,KAAKO,KAAKoB,QACxCnH,EAAIwF,KAAKO,KAAKoB,MAAQpM,KAAK+O,IAAI,EAAG9J,EAAIwF,KAAKO,KAAKoB,MAAQ,IAE1DnH,EAAIwF,KAAKlI,UAAYzC,KAAKC,OAE5B,QACF,CAEA,IAAKkF,EAAIwF,KAAK3H,MAAO,CACfmC,EAAIwF,KAAKO,OAAM/F,EAAIwF,KAAKO,KAAKG,OAAQ,GACzClG,EAAIwF,KAAKS,OAASjM,IAEdgG,EAAIwF,KAAKiI,kBACXzN,EAAIwF,KAAKiI,gBAAgBC,QACzB1N,EAAIwF,KAAKiI,qBAAkBzP,GAE7B,QACF,CAEqBgC,EAAIwF,KAAK3H,MAAM/B,SAASrC,EAAOb,IAUpB,IAAA+U,EAAhC,GATmC5Q,KAAK6Q,2BACtC5N,EACAsM,EACA7S,EACA4T,EACA/F,EACAO,GAIA7H,EAAIwF,KAAKO,KAAO,IAAmB,QAAjB4H,EAAI3N,EAAIwF,KAAKO,YAAI,IAAA4H,EAAAA,EAAI,CAAC,EAAIzH,OAAO,GACnDlG,EAAIwF,KAAKS,OAASjM,IAEdgG,EAAIwF,KAAKiI,kBACXzN,EAAIwF,KAAKiI,gBAAgBC,QACzB1N,EAAIwF,KAAKiI,qBAAkBzP,QAK/B,OAAQsO,GACN,IAAK,SACHvP,KAAK8Q,aAAaxP,EAAQ2B,EAAK6H,EAAM1O,EAAUmO,EAAa7N,EAAQ0L,GACpE,MACF,IAAK,SACL,IAAK,OACHpI,KAAK+Q,aAAazP,EAAQ2B,EAAK6H,EAAM1O,EAAUmO,EAAa+F,EAAS5T,EAAQ0L,GAC7E,MACF,IAAK,SACHpI,KAAKgR,aAAa1P,EAAQ2B,EAAK6H,EAAM1O,EAAUmO,EAAa+F,EAASC,EAAW7T,EAAQ0L,GACxF,MACF,IAAK,OACHpI,KAAKiR,WAAW3P,EAAQ2B,EAAK6H,EAAM1O,EAAUmO,EAAa+F,EAAS5T,EAAQ8S,EAAcpH,GAG/F,CACF,CAEQyI,0BAAAA,CACN5N,EACAsM,EACA7S,EACA4T,EACA/F,EACAO,GAEA,UAAIP,GAAeO,EAAO,IAAoB,WAAdyE,GAAwC,WAAdA,GAAwC,SAAdA,QAGhFe,GAAYtQ,KAAKkH,SAASS,YAA6B,WAAd4H,GAAwC,SAAdA,MAGnEvP,KAAKiI,UAAUhF,EAAIwF,KAAKlI,WAI9B,CAEQ2Q,iBAAAA,CACNjO,EACAvG,EACA0L,EACAmC,EACAnO,GACS,IAAA+U,EAAAC,EACT,MAAM7I,GAAqB,QAAV4I,EAAAlO,EAAI3E,cAAM,IAAA6S,OAAA,EAAVA,EAAY5I,WAAY,MACzC,IAAKvI,KAAKsI,uBAAuB5L,EAAQ6L,GAAW,OAAO,EAE3D,GAAIvI,KAAKkH,SAASS,YAAc3H,KAAKkH,SAASU,YAAa,CACzD,IAAK5H,KAAKkH,SAASU,YAAYlL,EAAQuG,EAAI3E,QAAS,OAAO,EAE3D,GADiB0B,KAAK+O,gBAAgB9L,EAAKvG,EAAQ0L,GACrC,OAAO,CACvB,CAEA,MAAM9J,EAAmB,QAAb8S,EAAGnO,EAAI3E,cAAM,IAAA8S,EAAAA,EAAI,CAAC,EAE9B,WADmB9S,EAAO8O,SAAU9O,EAAO+O,aAC3BrN,KAAKmN,0BAA0B7O,QAE1CiM,GAAetH,EAAIwF,KAAK3H,MAAO1F,OAASgB,KAC3C6G,EAAIwF,KAAK3H,MAAO9B,KAAKtC,EAAOb,KACrB,GAIX,CAGQiV,YAAAA,CACNxP,EACA2B,EACA6H,EACA1O,EACAmO,EACA7N,EACA0L,GAEA,MAAMiJ,EAAepO,EAAIwF,KAAK3H,MAAO/B,SAASrC,EAAOb,IAKrD,GAJIwV,IACFpO,EAAIwF,KAAK3H,MAAQmC,EAAIwF,KAAK3H,MAAOlF,OAAQC,GAAOA,IAAOa,EAAOb,KAG5DoH,EAAIwF,KAAKO,MAAuC,kBAAxB/F,EAAIwF,KAAKO,KAAKoB,MAAoB,CAE5D,GADAnH,EAAIwF,KAAKO,KAAKoB,MAAQpM,KAAK+O,IAAI,EAAG9J,EAAIwF,KAAKO,KAAKoB,MAAQ,GACpDG,GAAehO,OAAOC,SAASJ,IAA4C,kBAAxB6G,EAAIwF,KAAKO,KAAKoB,MAAoB,CACvF,MAAMkH,EAAiBlV,EACnBkV,EAAiB,IACnBrO,EAAIwF,KAAKO,KAAK4B,WAAa5M,KAAK+O,IAAI,EAAG/O,KAAKgP,KAAK/J,EAAIwF,KAAKO,KAAKoB,MAAQkH,IAE3E,CACAtR,KAAK4M,sBAAsBtL,EAAQ2B,EACrC,CAIA,GAFAA,EAAIwF,KAAKlI,UAAYzC,KAAKC,MAEtBsT,GAAgB9G,GAAetH,EAAIwF,KAAK3H,MAAO1F,OAASgB,GAAYgM,EAAiB,KAAAmJ,EACvF,MAAMvI,EAAO/F,EAAIwF,KAAKO,KAChB4B,EAAa5B,GAAmC,kBAApBA,EAAK4B,WAA0B5B,EAAK4B,WAAa,EAUnF,GAT4B5K,KAAKsN,kBAC/BhM,EACA2B,EACA6H,EACA1O,EACAwO,EACAxC,EACU,QADKmJ,EACftO,EAAI3E,cAAM,IAAAiT,EAAAA,EAAI,CAAC,IAEUtO,EAAIwF,KAAKO,MAA4C,kBAA7B/F,EAAIwF,KAAKO,KAAK4B,WAAyB,CACxF,MAAM4B,EAAgBxO,KAAK+O,IAAI,EAAG9J,EAAIwF,KAAKO,KAAK4B,WAAa,GAC7D3H,EAAIwF,KAAKO,KAAK4B,WAAa4B,EAC3BxM,KAAKuM,4BAA4BjL,EAAQkL,EAC3C,CACF,CAEAvJ,EAAIwF,KAAKS,OAASjM,IAEdgG,EAAIwF,KAAKiI,kBACXzN,EAAIwF,KAAKiI,gBAAgBC,QACzB1N,EAAIwF,KAAKiI,qBAAkBzP,EAE/B,CAGQ8P,YAAAA,CACNzP,EACA2B,EACA6H,EACA1O,EACAmO,EACA+F,EACA5T,EACA0L,GAEA,IAAInF,EAAIwF,KAAK3H,MAAO/B,SAASrC,EAAOb,IAApC,CAEA,GAAIyU,GAAWtQ,KAAKkH,SAASI,mBAAqBtH,KAAKkH,SAASS,YAAcS,EAAiB,CAE7F,GADiBpI,KAAK+O,gBAAgB9L,EAAwCvG,EAAQ0L,IACtEnF,EAAIwF,KAAKO,MAAuC,kBAAxB/F,EAAIwF,KAAKO,KAAKoB,MAAoB,CAExE,GADAnH,EAAIwF,KAAKO,KAAKoB,OAAS,EACnBG,GAAehO,OAAOC,SAASJ,GAAW,CAC5C,MAAMkV,EAAiBlV,EACnBkV,EAAiB,IACnBrO,EAAIwF,KAAKO,KAAK4B,WAAa5M,KAAK+O,IAAI,EAAG/O,KAAKgP,KAAK/J,EAAIwF,KAAKO,KAAKoB,MAAQkH,IAE3E,CACAtR,KAAK4M,sBAAsBtL,EAAQ2B,EACrC,CACA,GAAIsH,GAAetH,EAAIwF,KAAK3H,MAAM1F,OAASgB,GAAYgM,EAAiB,KAAAoJ,EACtE,MAAMxI,EAAO/F,EAAIwF,KAAKO,KAChB4B,EAAa5B,GAAmC,kBAApBA,EAAK4B,WAA0B5B,EAAK4B,WAAa,EAUnF,GAT0B5K,KAAKsO,uBAC7BhN,EACA2B,EACA6H,EACA1O,EACAwO,EACAxC,EACU,QADKoJ,EACfvO,EAAI3E,cAAM,IAAAkT,EAAAA,EAAI,CAAC,IAEQvO,EAAIwF,KAAKO,MAA4C,kBAA7B/F,EAAIwF,KAAKO,KAAK4B,WAAyB,CACtF,MAAM4B,EAAgBvJ,EAAIwF,KAAKO,KAAK4B,WAAa,EACjD3H,EAAIwF,KAAKO,KAAK4B,WAAa4B,EAC3BxM,KAAKuM,4BAA4BjL,EAAQkL,EAC3C,CACF,CACF,MACE,IAAKjC,GAAetH,EAAIwF,KAAK3H,MAAO1F,OAASgB,EAAU,CAErD,GADA6G,EAAIwF,KAAK3H,MAAO9B,KAAKtC,EAAOb,IACxBoH,EAAIwF,KAAKO,MAAuC,kBAAxB/F,EAAIwF,KAAKO,KAAKoB,MAAoB,CAE5D,GADAnH,EAAIwF,KAAKO,KAAKoB,OAAS,EACnBG,GAAehO,OAAOC,SAASJ,GAAW,CAC5C,MAAMkV,EAAiBlV,EACnBkV,EAAiB,IACnBrO,EAAIwF,KAAKO,KAAK4B,WAAa5M,KAAK+O,IAAI,EAAG/O,KAAKgP,KAAK/J,EAAIwF,KAAKO,KAAKoB,MAAQkH,IAE3E,CACAtR,KAAK4M,sBAAsBtL,EAAQ2B,EACrC,CACAA,EAAIwF,KAAKlI,UAAYzC,KAAKC,KAC5B,KAAO,KAAA0T,EACLxO,EAAIwF,KAAKO,KAAO,IAAmB,QAAjByI,EAAIxO,EAAIwF,KAAKO,YAAI,IAAAyI,EAAAA,EAAI,CAAC,EAAItI,OAAO,EACrD,CAEFlG,EAAIwF,KAAKS,OAASjM,IAEdgG,EAAIwF,KAAKiI,kBACXzN,EAAIwF,KAAKiI,gBAAgBC,QACzB1N,EAAIwF,KAAKiI,qBAAkBzP,EAtDkB,CAwDjD,CAGQ+P,YAAAA,CACN1P,EACA2B,EACA6H,EACA1O,EACAmO,EACA+F,EACAC,EACA7T,EACA0L,GACM,IAAAsJ,EACN,MAAML,EAAepO,EAAIwF,KAAK3H,MAAO/B,SAASrC,EAAOb,IAC/C8V,EAAkB3R,KAAKsI,uBAAuB5L,GAAkB,QAAVgV,EAAAzO,EAAI3E,cAAM,IAAAoT,OAAA,EAAVA,EAAYnJ,WAAY,OAEpF,GAAI8I,IAAiBM,EAAiB,CAEpC,GADA1O,EAAIwF,KAAK3H,MAAQmC,EAAIwF,KAAK3H,MAAOlF,OAAQC,GAAOA,IAAOa,EAAOb,IAC1DoH,EAAIwF,KAAKO,MAAuC,kBAAxB/F,EAAIwF,KAAKO,KAAKoB,QACxCnH,EAAIwF,KAAKO,KAAKoB,MAAQpM,KAAK+O,IAAI,EAAG9J,EAAIwF,KAAKO,KAAKoB,MAAQ,GACpDG,GAAehO,OAAOC,SAASJ,IAA4C,kBAAxB6G,EAAIwF,KAAKO,KAAKoB,OAAoB,CACvF,MAAMkH,EAAiBlV,EACnBkV,EAAiB,IACnBrO,EAAIwF,KAAKO,KAAK4B,WAAa5M,KAAK+O,IAAI,EAAG/O,KAAKgP,KAAK/J,EAAIwF,KAAKO,KAAKoB,MAAQkH,IAE3E,CAGF,GADArO,EAAIwF,KAAKlI,UAAYzC,KAAKC,MACtBwM,GAAetH,EAAIwF,KAAK3H,MAAO1F,OAASgB,GAAYgM,EAAiB,KAAAwJ,EACvE,MAAM5I,EAAO/F,EAAIwF,KAAKO,KAChB4B,EAAa5B,GAAmC,kBAApBA,EAAK4B,WAA0B5B,EAAK4B,WAAa,EAUnF,GAT4B5K,KAAKsN,kBAC/BhM,EACA2B,EACA6H,EACA1O,EACAwO,EACAxC,EACU,QADKwJ,EACf3O,EAAI3E,cAAM,IAAAsT,EAAAA,EAAI,CAAC,IAEU3O,EAAIwF,KAAKO,MAA4C,kBAA7B/F,EAAIwF,KAAKO,KAAK4B,WAAyB,CACxF,MAAM4B,EAAgBxO,KAAK+O,IAAI,EAAG9J,EAAIwF,KAAKO,KAAK4B,WAAa,GAC7D3H,EAAIwF,KAAKO,KAAK4B,WAAa4B,EAC3BxM,KAAKuM,4BAA4BjL,EAAQkL,EAC3C,CACF,CAOA,OANAvJ,EAAIwF,KAAKS,OAASjM,SAEdgG,EAAIwF,KAAKiI,kBACXzN,EAAIwF,KAAKiI,gBAAgBC,QACzB1N,EAAIwF,KAAKiI,qBAAkBzP,GAG/B,CAEA,GAAIoQ,IAAiBf,GAAWC,GAAY,CAC1CtN,EAAIwF,KAAK3H,MAAQmC,EAAIwF,KAAK3H,MAAOlF,OAAQC,GAAOA,IAAOa,EAAOb,IAE9D,GADmBmE,KAAKkR,kBAAkBjO,EAAKvG,EAAQ0L,EAAkBmC,EAAanO,IA+BpF,GAAI6G,EAAIwF,KAAKO,MAAuC,kBAAxB/F,EAAIwF,KAAKO,KAAKoB,MAAoB,CAE5D,GADAnH,EAAIwF,KAAKO,KAAKoB,OAAS,EACnBG,GAAehO,OAAOC,SAASJ,GAAW,CAC5C,MAAMkV,EAAiBlV,EACnBkV,EAAiB,IACnBrO,EAAIwF,KAAKO,KAAK4B,WAAa5M,KAAK+O,IAAI,EAAG/O,KAAKgP,KAAK/J,EAAIwF,KAAKO,KAAKoB,MAAQkH,IAE3E,CACAtR,KAAK4M,sBAAsBtL,EAAQ2B,EACrC,MAvCe,CACf,GAAIA,EAAIwF,KAAKO,MAAuC,kBAAxB/F,EAAIwF,KAAKO,KAAKoB,MAAoB,CAE5D,GADAnH,EAAIwF,KAAKO,KAAKoB,MAAQpM,KAAK+O,IAAI,EAAG9J,EAAIwF,KAAKO,KAAKoB,MAAQ,GACpDG,GAAehO,OAAOC,SAASJ,IAA4C,kBAAxB6G,EAAIwF,KAAKO,KAAKoB,MAAoB,CACvF,MAAMkH,EAAiBlV,EACnBkV,EAAiB,IACnBrO,EAAIwF,KAAKO,KAAK4B,WAAa5M,KAAK+O,IAAI,EAAG/O,KAAKgP,KAAK/J,EAAIwF,KAAKO,KAAKoB,MAAQkH,IAE3E,CACAtR,KAAK4M,sBAAsBtL,EAAQ2B,EACrC,CACA,GAAIsH,GAAetH,EAAIwF,KAAK3H,MAAO1F,OAASgB,GAAYgM,EAAiB,KAAAyJ,EACvE,MAAM7I,EAAO/F,EAAIwF,KAAKO,KAChB4B,EAAa5B,GAAmC,kBAApBA,EAAK4B,WAA0B5B,EAAK4B,WAAa,EAUnF,GAT4B5K,KAAKsN,kBAC/BhM,EACA2B,EACA6H,EACA1O,EACAwO,EACAxC,EACU,QADKyJ,EACf5O,EAAI3E,cAAM,IAAAuT,EAAAA,EAAI,CAAC,IAEU5O,EAAIwF,KAAKO,MAA4C,kBAA7B/F,EAAIwF,KAAKO,KAAK4B,WAAyB,CACxF,MAAM4B,EAAgBxO,KAAK+O,IAAI,EAAG9J,EAAIwF,KAAKO,KAAK4B,WAAa,GAC7D3H,EAAIwF,KAAKO,KAAK4B,WAAa4B,EAC3BxM,KAAKuM,4BAA4BjL,EAAQkL,EAC3C,CACF,CACF,CAmBA,OAPAvJ,EAAIwF,KAAKlI,UAAYzC,KAAKC,MAC1BkF,EAAIwF,KAAKS,OAASjM,SAEdgG,EAAIwF,KAAKiI,kBACXzN,EAAIwF,KAAKiI,gBAAgBC,QACzB1N,EAAIwF,KAAKiI,qBAAkBzP,GAG/B,CAEA,GAAIoQ,EAQF,OAPApO,EAAIwF,KAAKlI,UAAYzC,KAAKC,MAC1BkF,EAAIwF,KAAKS,OAASjM,SAEdgG,EAAIwF,KAAKiI,kBACXzN,EAAIwF,KAAKiI,gBAAgBC,QACzB1N,EAAIwF,KAAKiI,qBAAkBzP,IAK7B,GAAI0Q,IAAoBpB,EAAW,CACjC,GAAID,GAAWtQ,KAAKkH,SAASI,mBAAqBtH,KAAKkH,SAASS,YAAcS,EAAiB,CAE7F,GADiBpI,KAAK+O,gBAAgB9L,EAAwCvG,EAAQ0L,IACtEnF,EAAIwF,KAAKO,MAAuC,kBAAxB/F,EAAIwF,KAAKO,KAAKoB,MAAoB,CAExE,GADAnH,EAAIwF,KAAKO,KAAKoB,OAAS,EACnBG,GAAehO,OAAOC,SAASJ,GAAW,CAC5C,MAAMkV,EAAiBlV,EACnBkV,EAAiB,IACnBrO,EAAIwF,KAAKO,KAAK4B,WAAa5M,KAAK+O,IAAI,EAAG/O,KAAKgP,KAAK/J,EAAIwF,KAAKO,KAAKoB,MAAQkH,IAE3E,CACAtR,KAAK4M,sBAAsBtL,EAAQ2B,EACrC,CACF,MAAO,IAAKsH,GAAetH,EAAIwF,KAAK3H,MAAO1F,OAASgB,EAAU,CAE5D,GADA6G,EAAIwF,KAAK3H,MAAO9B,KAAKtC,EAAOb,IACxBoH,EAAIwF,KAAKO,MAAuC,kBAAxB/F,EAAIwF,KAAKO,KAAKoB,MAAoB,CAE5D,GADAnH,EAAIwF,KAAKO,KAAKoB,OAAS,EACnBG,GAAehO,OAAOC,SAASJ,GAAW,CAC5C,MAAMkV,EAAiBlV,EACnBkV,EAAiB,IACnBrO,EAAIwF,KAAKO,KAAK4B,WAAa5M,KAAK+O,IAAI,EAAG/O,KAAKgP,KAAK/J,EAAIwF,KAAKO,KAAKoB,MAAQkH,IAE3E,CACAtR,KAAK4M,sBAAsBtL,EAAQ2B,EACrC,CACAA,EAAIwF,KAAKlI,UAAYzC,KAAKC,KAC5B,KAAO,KAAA+T,EACL7O,EAAIwF,KAAKO,KAAO,IAAmB,QAAjB8I,EAAI7O,EAAIwF,KAAKO,YAAI,IAAA8I,EAAAA,EAAI,CAAC,EAAI3I,OAAO,EACrD,CACAlG,EAAIwF,KAAKS,OAASjM,IAEhBgG,EAAIwF,KAAKiI,kBACXzN,EAAIwF,KAAKiI,gBAAgBC,QACzB1N,EAAIwF,KAAKiI,qBAAkBzP,EAE/B,CACF,CAEQgQ,UAAAA,CACN3P,EACA2B,EACA6H,EACA1O,EACAmO,EACA+F,EACA5T,EACA8S,EACApH,GAIA,GAFqBnF,EAAIwF,KAAK3H,MAAO/B,SAASrC,EAAOb,IAEnC,CAEhB,GADAoH,EAAIwF,KAAK3H,MAAQmC,EAAIwF,KAAK3H,MAAOlF,OAAQC,GAAOA,IAAOa,EAAOb,IAC1DoH,EAAIwF,KAAKO,MAAuC,kBAAxB/F,EAAIwF,KAAKO,KAAKoB,QACxCnH,EAAIwF,KAAKO,KAAKoB,MAAQpM,KAAK+O,IAAI,EAAG9J,EAAIwF,KAAKO,KAAKoB,MAAQ,GACpDG,GAAehO,OAAOC,SAASJ,IAA4C,kBAAxB6G,EAAIwF,KAAKO,KAAKoB,OAAoB,CACvF,MAAMkH,EAAiBlV,EACnBkV,EAAiB,IACnBrO,EAAIwF,KAAKO,KAAK4B,WAAa5M,KAAK+O,IAAI,EAAG/O,KAAKgP,KAAK/J,EAAIwF,KAAKO,KAAKoB,MAAQkH,IAE3E,CAGF,GADArO,EAAIwF,KAAKlI,UAAYzC,KAAKC,MACtBwM,GAAetH,EAAIwF,KAAK3H,MAAO1F,OAASgB,GAAYgM,EAAiB,KAAA2J,EACvE,MAAM/I,EAAO/F,EAAIwF,KAAKO,KAChB4B,EAAa5B,GAAmC,kBAApBA,EAAK4B,WAA0B5B,EAAK4B,WAAa,EAUnF,GAT4B5K,KAAKsN,kBAC/BhM,EACA2B,EACA6H,EACA1O,EACAwO,EACAxC,EACU,QADK2J,EACf9O,EAAI3E,cAAM,IAAAyT,EAAAA,EAAI,CAAC,IAEU9O,EAAIwF,KAAKO,MAA4C,kBAA7B/F,EAAIwF,KAAKO,KAAK4B,WAAyB,CACxF,MAAM4B,EAAgBxO,KAAK+O,IAAI,EAAG9J,EAAIwF,KAAKO,KAAK4B,WAAa,GAC7D3H,EAAIwF,KAAKO,KAAK4B,WAAa4B,EAC3BxM,KAAKuM,4BAA4BjL,EAAQkL,EAC3C,CACF,CACAxM,KAAK4M,sBAAsBtL,EAAQ2B,EACrC,CAGAA,EAAIwF,KAAKS,OAASjM,IAEdgG,EAAIwF,KAAKiI,kBACXzN,EAAIwF,KAAKiI,gBAAgBC,QACzB1N,EAAIwF,KAAKiI,qBAAkBzP,EAE/B,CAEA+Q,4BAAAA,CAA6B9V,GAC3B,MAAMgI,EAAOlE,KAAKgI,UAAkB,OAAR9L,QAAQ,IAARA,EAAAA,EAAY,MAClCoF,EAAStB,KAAKiH,MAAMpG,IAAIqD,GAC9B,GAAK5C,EACL,IAAK,MAAO,CAAE2B,KAAQ3B,EACpB2B,EAAIwF,KAAK3H,WAAQG,EACjBgC,EAAIwF,KAAKQ,MAAQ,KACjBhG,EAAIwF,KAAKO,UAAO/H,EAChBgC,EAAIwF,KAAKM,QAAU,KACnB9F,EAAIwF,KAAKlI,UAAY,EACrB0C,EAAIwF,KAAKS,OAASjM,IAEdgG,EAAIwF,KAAKiI,kBACXzN,EAAIwF,KAAKiI,gBAAgBC,QACzB1N,EAAIwF,KAAKiI,qBAAkBzP,EAGjC,CAEAgR,aAAAA,CAAc/V,GACZ,MAAMgI,EAAOlE,KAAKgI,UAAkB,OAAR9L,QAAQ,IAARA,EAAAA,EAAY,MAClCoF,EAAStB,KAAKiH,MAAMpG,IAAIqD,GAC9B,IAAK5C,EAAQ,OACb,IAAI4Q,EAAoD,KACxD,IAAK,MAAO,CAAEjP,KAAQ3B,EAAQ,CAC5B,MAAM0H,EAAO/F,EAAIwF,KAAKO,KACsB,IAAAmJ,EACeC,EAD3D,GAAIpJ,GAA8B,kBAAfA,EAAKoB,MACtB,IAAK8H,IAA2B,QAAnBC,EAAClP,EAAIwF,KAAKlI,iBAAS,IAAA4R,EAAAA,EAAI,GAAKD,EAAK3R,UAC5C2R,EAAO,CAAE9H,MAAO7N,OAAOyM,EAAKoB,OAAQ7J,UAA6B,QAApB6R,EAAEnP,EAAIwF,KAAKlI,iBAAS,IAAA6R,EAAAA,EAAI,EAG3E,CACA,OAAOF,EAAOA,EAAK9H,WAAQnJ,CAC7B,CAEAgF,MAAAA,GACE,MAAO,CACLgB,MAAO9G,MAAMC,KAAKJ,KAAKiH,MAAM/G,WAAW4F,IAAI,EAAEnH,EAAGhC,KAAO,CAACgC,EAAGwB,MAAMC,KAAKzD,EAAEuD,aACzEuG,IAAKzG,KAAKyG,IACVC,SAAU1G,KAAK0G,SACfC,UAAW3G,KAAK2G,UAChBO,SAAU,CACRI,kBAAmBtH,KAAKkH,SAASI,kBACjCC,kBAAmBvH,KAAKkH,SAASK,kBACjCC,2BAA4BxH,KAAKkH,SAASM,2BAC1CC,mBAAoBzH,KAAKkH,SAASO,mBAClCC,kBAAmB1H,KAAKkH,SAASQ,mBAGvC,CAEA,eAAOxB,CAASC,GACd,MAAMC,EAAM,IAAIG,EAChB,IAAK,MAAO5H,EAAGpD,KAAkB,QAAd8W,EAAIlM,EAAKc,aAAK,IAAAoL,EAAAA,EAAI,GAAI,KAAAA,EACvC,MAAM/Q,EAAS,IAAI1B,IACnB,IAAK,MAAO0S,EAAIC,KAAQhX,EACtB+F,EAAOqB,IAAI2P,EAAIC,GAEjBnM,EAAIa,MAAMtE,IAAIhE,EAAG2C,EACnB,CACA,OAAO8E,CACT,EAGK,MAAMoM,EAOHC,4BAAAA,CAA6BvW,GACnC,MAAMmF,EAAMpF,EAA2B,OAARC,QAAQ,IAARA,EAAAA,EAAY,IAC3C8D,KAAK0S,sBAAsBjQ,OAAOpB,EACpC,CAEA3B,WAAAA,CAAYiT,EAAmC,CAAC,EAAGlM,EAAM,IAASC,EAAW,KAAQ,KAXpE/G,cAAQ,OACRsH,WAAK,OACLR,SAAG,OACHC,cAAQ,OAERgM,sBAAwB,IAAI9S,IAO3CI,KAAKyG,IAAMA,EACXzG,KAAK0G,SAAWA,EAChB1G,KAAKL,SAAW,IAAIF,EACpBO,KAAKiH,MAAQ,IAAIV,EAAiBoM,EAAalM,EAAKC,GACpD1G,KAAKiH,MAAMY,8BAA8B,CAACzE,EAAQgH,EAAOwI,KACvD5S,KAAK6S,kCAAkCzP,EAAQgH,EAAc,OAAPwI,QAAO,IAAPA,EAAAA,EAAW5S,KAAKL,YAExEK,KAAKiH,MAAMc,4BAA6B7L,IACtC8D,KAAKyS,6BAA6BvW,IAEtC,CAEAyE,SAAAA,CAAU9E,GAAmC,IAAAiX,EAC3C,OAAkC,QAAlCA,EAAO9S,KAAKL,SAASgB,UAAU9E,UAAG,IAAAiX,EAAAA,EAAI,IACxC,CAEA9R,iBAAAA,CAAkBnF,GAAmC,IAAAkX,EACnD,OAA0C,QAA1CA,EAAO/S,KAAKL,SAASqB,kBAAkBnF,UAAG,IAAAkX,EAAAA,EAAI,IAChD,CAEA7R,SAAAA,CAAUrF,GAAmC,IAAAmX,EAC3C,OAAkC,QAAlCA,EAAOhT,KAAKL,SAASuB,UAAUrF,UAAG,IAAAmX,EAAAA,EAAI,IACxC,CAEA,yBAAMrK,CACJzM,EACAoC,EACAsK,GAEA,OAAO5I,KAAKiH,MAAM0B,oBAAoBzM,EAAUoC,EAAQsK,EAAQ5I,KAAKL,SACvE,CAEAgC,YAAAA,CAAajF,GACX,MAAMoF,EAAO9B,KAAKL,SAASgB,UAAUjE,EAAOb,IACtCkG,EAAaD,EAAOrF,EAAYqF,GAAQ,KACxCE,EAAavF,EAAYC,GAEzBuF,IAAeH,GAAOhF,EAAegF,GACrCI,EAAepF,EAAeJ,GAIpC,GAFAsD,KAAKL,SAASgC,aAAajF,GAEvBoF,EAAM,CACR,GAAIC,IAAeC,GAAcC,IAAiBC,EAGhD,OAFAlC,KAAKiH,MAAMiJ,6BAA6BnO,EAAYD,EAAM,SAAU9B,KAAKL,eACzEK,KAAKiH,MAAMiJ,6BAA6BlO,EAAYtF,EAAQ,SAAUsD,KAAKL,UAI7EK,KAAKiH,MAAMiJ,6BAA6BlO,EAAYtF,EAAQ,SAAUsD,KAAKL,cAAUsB,EAAWa,EAClG,MACE9B,KAAKiH,MAAMiJ,6BAA6BlO,EAAYtF,EAAQ,SAAUsD,KAAKL,SAE/E,CAEQsT,UAAAA,CAAWC,EAAoBC,GACrC,IAAIvP,EAAqBuP,EACzB,MAAMC,EAAU,IAAIzX,IAEpB,KAAOiI,IAAQwP,EAAQrX,IAAI6H,IAAM,CAC/BwP,EAAQpX,IAAI4H,GAKZ,GAHsB3H,EAAmB2H,KACd3H,EAAmBiX,GAEJ,OAAO,EAEjD,MAAMjQ,EAAMjD,KAAKL,SAASgB,UAAUiD,GACpC,IAAKX,EAAK,MAEVW,EAAMnH,EAAYwG,GACN,OAARW,IAAcA,EAhoDP,GAioDb,CACA,OAAO,CACT,CAEAyP,UAAAA,CAAW/O,EAAkBC,GAC3B,MAAMzC,EAAO9B,KAAKL,SAASgB,UAAU2D,GACrC,IAAKxC,EAAM,OAAO,KAElB,GAAIhF,EAAegF,IAA4B,OAAnByC,GACtBvE,KAAKiT,WAAW3O,EAAUC,GAC5B,OAAO,KAIX,MAAMxC,EAAatF,EAAYqF,GACzB8C,EAAU5E,KAAKL,SAAS0E,eAAeC,EAAUC,GACvD,OAAKK,GAEL5E,KAAKiH,MAAMiJ,6BAA6BnO,EAAYD,EAAM,SAAU9B,KAAKL,UACzEK,KAAKiH,MAAMiJ,6BAA6B3L,EAAgBK,EAAS,SAAU5E,KAAKL,UAEzEiF,GALc,IAMvB,CAEA0O,UAAAA,CAAWhP,EAAkBC,EAA+BW,GAC1D,MAAMjC,EAAMjD,KAAKL,SAASgB,UAAU2D,GACpC,IAAKrB,EAAK,OAAO,KAGjB,IAAInH,EAAgC,KAEpC,GAAKgB,EAAemG,GAGb,KAAAsQ,EACL,MAAMC,EAAkB,CAAClP,GACnBmP,EAAyB,GAC/B,KAAOD,EAAMpY,QAAQ,CACnB,MAAMwI,EAAM4P,EAAM3P,QAClB4P,EAAazU,KAAK4E,GAClB,MAAM8P,EAAe1T,KAAKL,SAASwB,eAAeyC,EAAK,CAAEnC,aAAa,IACtE,IAAK,MAAMkS,KAAKD,EAAcF,EAAMxU,KAAK2U,EAC3C,CAEA,MAAMC,EAAQ,IAAIhU,IAClB,IAAK,MAAMiU,KAAOJ,EAAcG,EAAMjR,IAAIkR,EAAK5W,KAG/C,IAAK,MAAM4W,KAAOJ,EAAc,KAAAK,EAC9B,MAAMC,EAAY/T,KAAKL,SAASuB,UAAU2S,GACpCG,EAAiBJ,EAAM/S,IAAIgT,GAC3BI,EAAYxX,EAAYsX,GACxBG,EAA0B,OAAdD,EAAqB1P,EAAsC,QAAxBuP,EAAIF,EAAM/S,IAAIoT,UAAU,IAAAH,EAAAA,EAAI,KAC3EK,EAA6B,IAAKJ,EAAWlY,GAAImY,EAAgBpX,SAAUsX,GACjFlU,KAAKL,SAASgC,aAAawS,EAC7B,CAGA,IAAK,MAAMN,KAAOJ,EAAc,CAC9B,MAAMW,EAAcR,EAAM/S,IAAIgT,GACxBQ,EAAUrU,KAAKL,SAASwB,eAAe0S,EAAK,CAAEtS,qBAAqB,IACzE,IAAK,MAAMyC,KAAOqQ,EAAS,CACzB,MAAMpQ,EAAOjE,KAAKL,SAASqB,kBAAkBgD,GAC7C,IAAKC,EAAM,SACX,MAAMqQ,EAAsBrX,IACtBoI,EAAuB,IAAKpB,EAAMpI,GAAIyY,EAAqB1X,SAAUwX,GAC3EpU,KAAKL,SAASgC,aAAa0D,EAC7B,CACF,CAEAvJ,EAAsD,QAAhDyX,EAAGvT,KAAKL,SAASgB,UAAUiT,EAAM/S,IAAIyD,WAAW,IAAAiP,EAAAA,EAAI,IAC5D,KAxC0B,CACxB,MAAM1X,EAAU,OAALqJ,QAAK,IAALA,EAAAA,EAASjI,IACpBnB,EAASkE,KAAKL,SAASqF,mBAAmBV,EAAUzI,EAAkB,OAAd0I,QAAc,IAAdA,EAAAA,EAAkB,KAC5E,CA4CA,OAJIzI,GACFkE,KAAKiH,MAAMiJ,6BAA6B3L,EAAgBzI,EAAQ,OAAQkE,KAAKL,UAGxE7D,CACT,CAEAyY,YAAAA,CAAajQ,GACX,MAAMrB,EAAMjD,KAAKL,SAASgB,UAAU2D,GACpC,IAAKrB,EAAK,OAAO,KAEjB,GAAInG,EAAemG,GAAM,CACvB,MAAM,qBAAEM,EAAoB,6BAAEC,GAAiCxD,KAAKL,SAAS0D,sBAAsBiB,GACnG,IAAK,MAAM4F,KAAK1G,EACdxD,KAAKiH,MAAMiJ,6BAA6BhG,EAAEtN,SAAUsN,EAAG,SAAUlK,KAAKL,UACxE,IAAK,MAAM6U,KAAMjR,EACfvD,KAAKiH,MAAMiJ,6BAA6BsE,EAAG5X,SAAU4X,EAAI,SAAUxU,KAAKL,UAC1E,OAAOsD,CACT,CAAO,CACL,MAAM,OAAEvG,EAAM,SAAER,GAAa8D,KAAKL,SAASe,iBAAiB4D,GAE5D,OADI5H,GAAQsD,KAAKiH,MAAMiJ,6BAA6BhU,EAAUQ,EAAQ,SAAUsD,KAAKL,UAC9EjD,CACT,CACF,CAEA2G,qBAAAA,CAAsBzG,GACpB,MAAM,qBAAE2G,EAAoB,6BAAEC,GAAiCxD,KAAKL,SAAS0D,sBAAsBzG,GACnG,IAAK,MAAMsN,KAAK1G,EACdxD,KAAKiH,MAAMiJ,6BAA6BhG,EAAEtN,SAAUsN,EAAG,SAAUlK,KAAKL,UACxE,IAAK,MAAM6U,KAAMjR,EACfvD,KAAKiH,MAAMiJ,6BAA6BsE,EAAG5X,SAAU4X,EAAI,SAAUxU,KAAKL,UAC1E,MAAO,CACL8U,yBAA0BjR,EAA6BsC,IAAK4O,GAAMA,EAAE7Y,IACpE8Y,iBAAkBpR,EAAqBuC,IAAK4O,GAAMA,EAAE7Y,IAExD,CAEA+Y,eAAAA,CAAgB/Y,GACd,MAAM4I,EAAMzE,KAAKL,SAASgB,UAAU9E,GACpC,IAAK4I,EAAK,OACV,MAAM2O,EAAU,IAAIzX,IACpB,GAAImB,EAAe2H,GAAM,CACvB,MAAMoQ,EAAkB,CAAChZ,GACzB,KAAOgZ,EAAMzZ,QAAQ,CACnB,MAAMwI,EAAMiR,EAAMnM,MAClB,GAAI0K,EAAQrX,IAAI6H,GAAM,SACtBwP,EAAQpX,IAAI4H,GACZ5D,KAAKiH,MAAM+K,6BAA6BpO,GACxC,MAAM8P,EAAe1T,KAAKL,SAASwB,eAAeyC,EAAK,CAAEnC,aAAa,IACtE,IAAK,MAAMqT,KAAMpB,EAAcmB,EAAM7V,KAAK8V,EAC5C,CACF,KAAO,KAAAC,EACL,MAAMnY,EAAuB,QAAfmY,EAAGtQ,EAAI7H,gBAAQ,IAAAmY,EAAAA,EAAI,KACjC/U,KAAKiH,MAAM+K,6BAA6BpV,EAC1C,CACF,CAEAuE,cAAAA,CAAejF,GACb,OAAO8D,KAAKL,SAASwB,eAAejF,EACtC,CAEA,sBAAM8Y,CAAiBpY,EAAmB,GAAIgM,GAC5C,MAAMvH,EAAMpF,EAAmBW,GACzBqY,EAAWjV,KAAK0S,sBAAsB7R,IAAIQ,GAChD,GAAI4T,EAAU,OAAOA,EAErB,MAAM1W,EAAI,WACR,IACE,MAAM6F,EAASpE,KAAKL,SAASuB,UAAUtE,GACvC,GAAIwH,GAA0C,kBAAzBA,EAAO/B,cAC1B,OAAO+B,EAAO/B,cAGhB,MAAM6S,EAAalV,KAAKiH,MAAMgL,cAAcrV,GAC5C,GAA0B,kBAAfsY,EAIT,OAHI9Q,GACFpE,KAAK6S,kCAAkCjW,EAAUsY,EAAYlV,KAAKL,UAE7DuV,EAGT,GAAItM,EAAQ,CACV,MAAMuM,QAAevM,EAAOhM,GAI5B,OAHIoD,KAAKL,SAASuB,UAAUtE,IAC1BoD,KAAK6S,kCAAkCjW,EAAUuY,EAAQnV,KAAKL,UAEzDwV,CACT,CAEA,OAAOnV,KAAKL,SAASwB,eAAevE,GAAUxB,MAChD,CAAE,MAAO6N,GAEP,MADAjJ,KAAK0S,sBAAsBjQ,OAAOpB,GAC5B4H,CACR,CAAE,QACAjJ,KAAK0S,sBAAsBjQ,OAAOpB,EACpC,CACD,EA9BS,GAiCV,OADArB,KAAK0S,sBAAsB/P,IAAItB,EAAK9C,GAC7BA,CACT,CAEA0H,MAAAA,GACE,MAAO,CAAEtG,SAAUK,KAAKL,SAASsG,SAAUgB,MAAOjH,KAAKiH,MAAMhB,SAAUQ,IAAKzG,KAAKyG,IAAKC,SAAU1G,KAAK0G,SACvG,CAEA,eAAOR,CAASC,EAAWwM,GAA8C,IAAAyC,EAAAC,EAAAC,EAAAC,EACvE,MAAMC,EAAK,IAAIhD,EAAqB,OAAXG,QAAW,IAAXA,EAAAA,EAAe,CAAC,EAAY,QAAXyC,EAAM,OAAJjP,QAAI,IAAJA,OAAI,EAAJA,EAAMM,WAAG,IAAA2O,EAAAA,EAAI,IAAuB,QAAhBC,EAAM,OAAJlP,QAAI,IAAJA,OAAI,EAAJA,EAAMO,gBAAQ,IAAA2O,EAAAA,EAAI,KAC9E5Q,EAAMhF,EAAmByG,SAAuB,QAAfoP,EAAK,OAAJnP,QAAI,IAAJA,OAAI,EAAJA,EAAMxG,gBAAQ,IAAA2V,EAAAA,EAAI,CAAC,GACrD3Y,EAAI4J,EAAiBL,SAAoB,QAAZqP,EAAK,OAAJpP,QAAI,IAAJA,OAAI,EAAJA,EAAMc,aAAK,IAAAsO,EAAAA,EAAI,CAAC,GAEnC,IAAAE,EAAAC,EAAAC,EAAAC,EAAAC,EAAblD,IACDhW,EAAUuK,SAAW,CACpBI,kBAAgD,QAA/BmO,EAAE9C,EAAYrL,yBAAiB,IAAAmO,GAAAA,EAChDlO,kBAAgD,QAA/BmO,EAAE/C,EAAYpL,yBAAiB,IAAAmO,GAAAA,EAChDlO,2BAAkE,QAAxCmO,EAAEhD,EAAYnL,kCAA0B,IAAAmO,GAAAA,EAClElO,mBAAkD,QAAhCmO,EAAEjD,EAAYlL,0BAAkB,IAAAmO,EAAAA,EAAI,EACtDlO,kBAAgD,QAA/BmO,EAAElD,EAAYjL,yBAAiB,IAAAmO,EAAAA,EAAI,EACpDlO,WAAYgL,EAAYhL,WACxBC,YAAa+K,EAAY/K,cAW7B,OARC4N,EAAW7V,SAAW8E,EACtB+Q,EAAWvO,MAAQtK,EACpBA,EAAEkL,8BAA8B,CAACzE,EAAQgH,EAAOhC,KAC9CoN,EAAG3C,kCAAkCzP,EAAQgH,EAAsB,OAAfhC,QAAe,IAAfA,EAAAA,EAAmB3D,KAEzE9H,EAAEoL,4BAA6B7L,IAC7BsZ,EAAG/C,6BAA6BvW,KAE3BsZ,CACT,CAEQ3C,iCAAAA,CACN3W,EACA4Z,EACA1N,GAEApI,KAAK+V,qCAAqC7Z,EAAU4Z,EAAa1N,GACjEpI,KAAKyS,6BAA6BvW,EACpC,CAEQ6Z,oCAAAA,CACN7Z,EACA4Z,EACA1N,GAEA,IAAKA,QAAmCnH,IAAhB6U,EAA2B,OAEnD,MAAMlZ,EAAmB,OAARV,QAAQ,IAARA,EAAAA,EAAY,KAC7B,IAAKU,EAEH,YADAwL,EAAgBtF,0BAA0BlG,EAAUkZ,GAItD,MAAME,EAAe5N,EAAgBlH,UAAUtE,GACzCqZ,EAAiC,OAAZD,QAAY,IAAZA,OAAY,EAAZA,EAAc3T,mBAEdpB,IAAvBgV,GAAoCA,IAAuBH,GAI7D9V,KAAKiH,MAAM+K,6BAA6BpV,GAG1CwL,EAAgBtF,0BAA0BlG,EAAUkZ,EACtD,E,gBC12DF,SAASI,GAAY,cAAE7T,KAAkB4B,IACvC,MAAO,IAAKA,EAAMkS,WAAY9T,EAChC,CAcA,IACa+T,GADZC,EAAAA,EAAAA,GAAWC,EAAZ,MAQE,+BAAcC,CAA0BC,GACtC,MAAM,GAAEC,GAAOzW,KAAK0W,KACdC,GA/BaC,EA+BSJ,GA7BvBI,EAASC,WAAW,KAAM,KAAKC,MAAM,KAAKlb,OAAO2N,SADlC,GADxB,IAAuBqN,EAiCnB,GAAID,EAAMvb,OAnCS,GAmCgB,CACjC,MAAM2b,EAAUN,EAAG,0CAA0CO,QAAQ,KAAMna,OApC1D,KAqCjB,MAAM,IAAIoa,EAAAA,oBAAoBF,EAAS,kBACzC,CAEA,IAAIG,EAEJ,IAAK,MAAMC,KAAQR,EAAO,KAAAS,EACxB,MAAM,MAAE5V,SAAgBxB,KAAKqX,SAAS,CAAEza,UAAiB,QAAPwa,EAAAF,SAAO,IAAAE,OAAA,EAAPA,EAASvb,KAAM,GAAI0M,SAAU,WAEzEzM,EAAS0F,EAAM8V,KAAMrT,GAASA,EAAK+F,OAASmN,GAClD,GAAIrb,EAAQ,CACV,IAAKA,EAAOkB,SAAU,CACpB,MAAM+Z,EAAUN,EAAG,+CAAmDO,QAAQ,KAAMG,GAAMH,QAAQ,KAAMR,GACxG,MAAM,IAAIS,EAAAA,oBAAoBF,EAAS,kBACzC,CACAG,EAAU,CAAErb,GAAIC,EAAOD,GAAImO,KAAMlO,EAAOkO,KAAM9N,SAAUJ,EAAOc,SACjE,KAAO,KAAA2a,EACL,IAAKvX,KAAKwX,cAAcC,aACtB,MAAM,IAAIR,EAAAA,oBACRR,EAAG,6DACH,wBAGJS,QAAgBlX,KAAKyX,aAAa,CAAEzN,KAAMmN,EAAMjb,SAAiB,QAATqb,EAAEL,SAAO,IAAAK,OAAA,EAAPA,EAAS1b,IAErE,CACF,CACA,OAAOqb,CACT,CAEQQ,cAAAA,GACN,OAAO1X,KAAKuW,0BAA0BvW,KAAK2X,aAAaC,WArEjC,QAsEzB,CAEQC,aAAAA,GACN,OAAO7X,KAAKuW,0BAA0BvW,KAAK2X,aAAaG,UAxElC,SAyExB,CAEApY,WAAAA,CACmB8X,EACAO,EAA2C,CAAC,EAC5CJ,EACAjB,EAAoBsB,EAAAA,IACrC,IAAAC,EAAAC,EAAA,KAJiBV,cAAAA,EAA8B,KAC9BO,SAAAA,EAAwC,KACxCJ,aAAAA,EAAoC,KACpCjB,KAAAA,EAAiB,KArDnByB,YAAM,OACNC,aAAO,OACPC,oBAAc,OACdC,kBAAY,OACZC,yBAAmB,EAoDlCvY,KAAKqY,eAAiBrY,KAAK2X,aAAaa,cACxCxY,KAAKoY,QAAUpY,KAAK2X,aAAac,QArFb,GAsFpBzY,KAAKsY,kBAA6CrX,IAA9BjB,KAAK+X,SAASW,aAAmC1Y,KAAK+X,SAASW,YACnF1Y,KAAKuY,oBAAsBvY,KAAKwX,cAAcmB,mBAG9C3Y,KAAKmY,OAAS,IAAI3F,EAChBuF,EAASa,eAAiB,CAAC,EACL,QADMX,EAC5BF,EAASa,qBAAa,IAAAX,OAAA,EAAtBA,EAAwBxR,IACF,QADKyR,EAC3BH,EAASa,qBAAa,IAAAV,OAAA,EAAtBA,EAAwBxR,UAa1B1G,KAAK6Y,cAAc,CACjBC,oBAAsBC,IACpB/Y,KAAKmY,OAAOvD,gBAAgBmE,IAE9BC,cAAgBD,GACP/Y,KAAKmY,OAAOxX,UAAUoY,IAGnC,CAEAF,aAAAA,CAAcI,GAA6C,IAAAC,EAAAC,EACzB,QAAhCD,GAAAC,EAAAnZ,KAAKwX,eAAcqB,qBAAa,IAAAK,GAAhCA,EAAAnJ,KAAAoJ,EAAmCF,EACrC,CAKAG,WAAAA,CAAYvd,GACV,OAAKA,EACM,SAAPA,GACO,YAAPA,EADsBmE,KAAKoY,QAExBvc,EAHSmE,KAAKoY,OAIvB,CAKQiB,aAAAA,CAAcrP,EAAiChN,GAAoB,GACzE,IAAKgN,GAA+B,IAAvBA,EAAKsP,OAAOle,OAAc,CACrC,MAAMme,EAAkCvc,EAAW,oBAAsB,mBACnE,GAAEyZ,GAAOzW,KAAK0W,KACdK,EAAqBN,EAAXzZ,EAAc,8BAAoC,6BAClE,MAAM,IAAIia,EAAAA,oBAAoBF,EAASwC,EACzC,CAEA,GADqB,gBACJC,KAAKxP,GAAO,CAC3B,MAAM,GAAEyM,GAAOzW,KAAK0W,KACd6C,EAAkCvc,EAAW,oBAAsB,kBACnE+Z,EAAU/Z,EAAWyZ,EAAG,+CAA+CO,QAAQ,KAAMhN,GAAQyM,EAAG,6CAA6CO,QAAQ,KAAMhN,GACjK,MAAM,IAAIiN,EAAAA,oBAAoBF,EAASwC,EACzC,CACF,CAMQE,yBAAAA,CAA0BtU,GAChC,MAAMuU,EAAW1Z,KAAKoZ,YAAYjU,GAElC,GAAIuU,IAAa1Z,KAAKoY,QACpB,OAEF,MAAMuB,EAAe3Z,KAAKmY,OAAOxX,UAAU+Y,GAC3C,GAAIC,IAAiBA,EAAa3c,SAAU,CAC1C,MAAM,GAAEyZ,GAAOzW,KAAK0W,KACdK,EAAUN,EAAG,4CAA8CO,QAAQ,KAAM7R,GAC/E,MAAM,IAAI8R,EAAAA,oBAAoBF,EAAS,kBACzC,CACF,CAKQ6C,uBAAAA,CACNhd,EACAoN,EACAhN,EACA6c,GAEA,MAAMC,EAAqB9Z,KAAKoZ,YAAYxc,GACtCmd,EAAc/Z,KAAKmY,OAAOhX,eAAe2Y,GAE/C,IAAK,MAAME,KAAWD,EAAa,CACjC,MAAME,EAAQja,KAAKmY,OAAOxX,UAAUqZ,GACpC,GAAIC,GAASA,EAAMjQ,OAASA,KAAUiQ,EAAMjd,WAAaA,KAAc6c,GAAaI,EAAMpe,KAAOge,GAC/F,OAAO,CAEX,CAEA,OAAO,CACT,CAKQK,WAAAA,CAAYC,EAAwBhV,GAC1C,IAAKA,EAAgB,OAAO,EAC5B,MAAMiV,EAAqBpa,KAAKoZ,YAAYjU,GACtCkV,EAAqBra,KAAKoZ,YAAYe,GAE5C,GAAIC,IAAuBC,EAAoB,OAAO,EAEtD,IAAInD,EAAiClX,KAAKmY,OAAOxX,UAAUyZ,GAC3D,MAAMhH,EAAU,IAAIzX,IAEpB,KAAOub,GAAWA,EAAQta,WACpBwW,EAAQrX,IAAImb,EAAQrb,KADU,CAElCuX,EAAQpX,IAAIkb,EAAQrb,IAEpB,MAAMgU,EAAkB7P,KAAKoZ,YAAYlC,EAAQta,UACjD,GAAIiT,IAAoBwK,EAAoB,OAAO,EAGnD,GADAnD,EAAUlX,KAAKmY,OAAOxX,UAAUkP,IAC3BqH,IAAYA,EAAQla,SAAU,KACrC,CAEA,OAAO,CACT,CAKA,cAAMqa,EAAS,SACbza,EAAQ,OACR4T,EAAM,OACNpD,EAAM,UACNC,EAAS,KACTvC,EAAI,MACJwP,EAAK,SACL/R,EAAW,QAWX,MAAMuR,EAAqB9Z,KAAKoZ,YAAoB,OAARxc,QAAQ,IAARA,EAAAA,EAAYoD,KAAKoY,SAGvDmC,EAAsBva,KAAK+X,SAASyC,iBACpCC,EAAuBza,KAAK+X,SAAS2C,kBACrCC,EAAsB3a,KAAK+X,SAAS6C,iBAGpCC,EAAoB,CAAEje,SAAUkd,EAAoBvR,YAGrDgS,IACHM,EAAarK,OAASA,GAInBiK,IACHI,EAAazN,OAAe,OAANA,QAAM,IAANA,EAAAA,EAAwB,WAAb7E,EAAwB,YAAStH,EAClE4Z,EAAaxN,UAAqB,OAATA,QAAS,IAATA,EAAAA,EAA2B,WAAb9E,EAAwB,YAAStH,GAIrE0Z,IACHE,EAAa/P,KAAOA,EACpB+P,EAAaP,MAAQA,GAIvB,MAAMQ,EAAiB,CACrBle,SAAUkd,EACVvR,WACAiI,OAAQ+J,OAAsBtZ,EAAYuP,EAC1CpD,OAAQqN,OAAuBxZ,EAAY4Z,EAAazN,OACxDC,UAAWoN,OAAuBxZ,EAAY4Z,EAAaxN,UAC3DvC,KAAM6P,OAAsB1Z,EAAY6J,EACxC1O,SAAUue,OAAsB1Z,EAAYqZ,GAIxCS,QAAqB/a,KAAKmY,OAAOxP,oBACrCmR,EACAgB,EACAlP,MAAOhP,EAAU0B,KACf,MAAMxC,QAAekE,KAAKwX,cAAcwD,SAAS,IAC5C1c,EACH1B,WACA0d,MAAO/d,OAAO+B,EAAOlC,YAEvB,MAAO,CAAEoN,MAAO1N,EAAO0N,SAAU1N,EAAOmf,cAI5C,IAsBI7Q,EAtBA5I,EAAQuZ,EAAavR,MAGzB,GAAI+Q,EACF,GAA8C,oBAAnCva,KAAK+X,SAASyC,iBACvBhZ,EAAQxB,KAAK+X,SAASyC,iBAAiBhZ,EAAOgP,QACzC,GAAIA,EAAQ,CACjB,MAAM0K,EAAc1K,EAAO2K,cAC3B3Z,EAAQA,EAAM5F,OAAQsO,IAAC,IAAAkR,EAAA,OAAW,QAAXA,EAAKlR,EAAEF,YAAI,IAAAoR,OAAA,EAANA,EAAQD,cAAcpc,SAASmc,IAC7D,CAIET,IAEAjZ,EAD6C,oBAApCxB,KAAK+X,SAAS2C,kBACf1a,KAAK+X,SAAS2C,kBAAkBlZ,EAAO4L,EAAQC,GAE/CrN,KAAKqb,uBAAuB7Z,EAAO4L,EAAQC,IAOrDjD,EADEuQ,GAAuBJ,EACjB/Y,EAAMpG,OAEN2f,EAAa3Q,MAIvB,IAAIkR,EAAiB9Z,EACrB,GAAImZ,GAAuB7P,GAAQwP,EACjC,GAA8C,oBAAnCta,KAAK+X,SAAS6C,iBACvBU,EAAiBtb,KAAK+X,SAAS6C,iBAAiBpZ,EAAOsJ,EAAMwP,OACxD,CACL,MAAMiB,GAASzQ,EAAO,GAAKwP,EACrBkB,EAAMD,EAAQjB,EACpBgB,EAAiB9Z,EAAMpD,MAAMmd,EAAOC,EACtC,CAIF,GAAIxb,KAAKwX,cAAciE,QAAUzb,KAAKwX,cAAckE,gBAAiB,CACnE,MAAMC,EAAeL,EAAexV,IAAI8F,UACtC,GAAI3H,EAAKjH,SAAU,OAAOiH,EAE1B,MAAO2X,EAAKC,SAAsBC,QAAQC,IAAI,CAC5C9X,EAAK2X,IAAME,QAAQE,QAAQ/X,EAAK2X,KAC9B5b,KAAKwX,cAAciE,OAASzb,KAAKwX,cAAciE,OAAOxX,GACtD6X,QAAQE,aAAQ/a,GAClBgD,EAAK4X,aAAeC,QAAQE,QAAQ/X,EAAK4X,cACvC7b,KAAKwX,cAAckE,gBAAkB1b,KAAKwX,cAAckE,gBAAgBzX,GACxE6X,QAAQE,aAAQ/a,KAGpB,MAAO,IAAKgD,EAAM2X,MAAKC,kBAGzBP,QAAuBQ,QAAQC,IAAIJ,EACrC,CAGA,MAAMM,EAAmD,CACvDnR,OACAwP,QACAlQ,YAEKuQ,GAAuBI,EAAanQ,YAAc,CAAEA,WAAYmQ,EAAanQ,gBAC7E+P,GAAuBI,EAAamB,aAAe,CAAEA,YAAanB,EAAamB,cAGtF,MAAO,CAAE1a,MAAO8Z,EAAexV,IAAIoQ,GAAc+E,WAAYgB,EAC/D,CAKQZ,sBAAAA,CAAuB7Z,EAAyB4L,EAAiBC,GACvE,OAAO7L,EAAM1C,KAAK,CAACuB,EAAGC,KACpB,IAAI6b,EAAgB,EAEpB,OAAQ/O,GACN,IAAK,OASL,QACE+O,GAAiB9b,EAAE2J,MAAQ,IAAIoS,cAAc9b,EAAE0J,MAAQ,UAPzD,IAAK,OACHmS,EAAgB,IAAIre,KAAKuC,EAAEgc,MAAQ,GAAGC,UAAY,IAAIxe,KAAKwC,EAAE+b,MAAQ,GAAGC,UACxE,MACF,IAAK,OACHH,GAAiB5f,OAAO8D,EAAEJ,OAAS,IAAM1D,OAAO+D,EAAEL,OAAS,GAM/D,MAAqB,SAAdoN,GAAwB8O,EAAgBA,GAEnD,CAKA,iBAAMI,CAAYtY,GAChB,MAAMuY,EAAQxc,KAAKmY,OAAOxX,UAAUsD,EAAKpI,IACzC,GAAImE,KAAKwX,cAAc+E,YACrB,aAAavc,KAAKwX,cAAc+E,YAAYC,GAE9C,MAAM,GAAE/F,GAAOzW,KAAK0W,KACpB,IAAKzS,EAAK2X,MAAQ5b,KAAKwX,cAAciE,OACnC,MAAM,IAAIxE,EAAAA,oBAAoBR,EAAG,oBAAqB,iBAGxD,MAAMmF,EAAM3X,EAAK2X,WAAc5b,KAAKwX,cAAciE,OAAQe,GAC1D,GAAIZ,EACF,aAAca,MAAMb,IAAMc,OAE5B,MAAM,IAAIzF,EAAAA,oBAAoBR,EAAG,2BAA4B,gBAC/D,CAKA,sBAAMzB,CAAiBpY,GACrB,IAAKA,EAAU,OAAO,EACtB,MAAMf,EAAKmE,KAAKoZ,YAAoB,OAARxc,QAAQ,IAARA,EAAAA,EAAYoD,KAAKoY,SAC7C,OAAOpY,KAAKmY,OAAOnD,iBAAiBnZ,EAAI+P,UACtC,MAAM,WAAEqP,SAAqBjb,KAAKwX,cAAcwD,SAAS,CAAEpe,SAAUf,EAAIye,MAAO,EAAG/R,SAAU,QAC7F,OAAiB,OAAV0S,QAAU,IAAVA,OAAU,EAAVA,EAAY7Q,QAAS,GAEhC,CAKA,iBAAMuS,CAAY1Y,GAMA,IAAA2Y,EAChB,MAAM9C,EAAqB9Z,KAAKoZ,YAAyB,QAAdwD,EAAC3Y,EAAKrH,gBAAQ,IAAAggB,EAAAA,EAAI5c,KAAKoY,SAMlE,GAHApY,KAAKqZ,cAAcpV,EAAK+F,MAAM,GAG1BhK,KAAKuY,oBAAqB,CAE5B,GADmBvY,KAAK4Z,wBAAwBE,EAAoB7V,EAAK+F,MAAM,GAC/D,CACd,MAAM,GAAEyM,GAAOzW,KAAK0W,KACdK,EAAUN,EAAG,6CAA+CO,QAAQ,KAAM/S,EAAK+F,MACrF,MAAM,IAAIiN,EAAAA,oBAAoBF,EAAS,oBACzC,CACF,CAEA,MAEMjb,EAAS,IAFMkE,KAAKmY,OAAOxX,UAAUmZ,YACpB9Z,KAAKwX,cAAcqF,WAAW,IAAK5Y,EAAMrH,SAAUkd,IAC3Bld,SAAUkd,GAEzD,OADA9Z,KAAKmY,OAAOxW,aAAa7F,GAClBA,CACT,CAEA,iBAAMghB,CAAYC,GAAyE,IAAAC,EAEzF,MAAMC,EAAgBF,EAAQvT,OAAS,GACjCrE,EAAiC,QAAnB6X,EAAGD,EAAQngB,gBAAQ,IAAAogB,EAAAA,EAAIhd,KAAKoY,QAE1C0B,EAAqB9Z,KAAKoZ,YAAYjU,GAG5C,GAAInF,KAAKuY,oBACP,IAAK,MAAMtU,KAAQgZ,EACjB,GAAIhZ,EAAK+F,KAAM,KAAAkT,EACbld,KAAKqZ,cAAcpV,EAAK+F,MAAM,GAC9B,MAAMmT,EAAend,KAAKoZ,YAAyB,QAAd8D,EAACjZ,EAAKrH,gBAAQ,IAAAsgB,EAAAA,EAAIpD,GAEvD,GADmB9Z,KAAK4Z,wBAAwBuD,EAAclZ,EAAK+F,MAAM,GACzD,CACd,MAAM,GAAEyM,GAAOzW,KAAK0W,KACdK,EAAUN,EAAG,6CAA+CO,QAAQ,KAAM/S,EAAK+F,MACrF,MAAM,IAAIiN,EAAAA,oBAAoBF,EAAS,oBACzC,CACF,CAIJ,MAAMqG,EAAepd,KAAKmY,OAAOxX,UAAUmZ,GAE3C,IAAIuD,EAAiD,CAAEC,SAAU,IAAInd,MAAM8c,EAAc7hB,QAASmiB,SAAS,GAE3G,GAAIvd,KAAKwX,cAAcsF,YAAa,CAClC,MAAMU,EAAgBP,EAAcnX,IAAKoE,IAAC,IAAAuT,EAAA,MAAM,IAC3CvT,EACHtN,SAAUoD,KAAKoZ,YAAsB,QAAXqE,EAACvT,EAAEtN,gBAAQ,IAAA6gB,EAAAA,EAAI3D,MAW3C,GAFAuD,QAN6Brd,KAAKwX,cAAcsF,YAAY,CAC1DlgB,SAAUkd,EACVtQ,MAAOgU,IAMLH,EAAYC,UAAYD,EAAYC,SAASliB,OAAQ,CACvD,IAAK,IAAIuC,EAAI,EAAGA,EAAI0f,EAAYC,SAASliB,OAAQuC,IAAK,CACpD,MAAMuZ,EAAUmG,EAAYC,SAAS3f,GACrC,GAAIuZ,GAAWA,EAAQqG,QAAS,KAAAG,EAAAC,EAC9B,MAAMC,EAAW1G,EAAQ/Q,KACnBtK,EAAiB,QAAf6hB,EAAW,OAARE,QAAQ,IAARA,OAAQ,EAARA,EAAU/hB,UAAE,IAAA6hB,EAAAA,EAAIxG,EAAQ2G,UAC7BnhB,EAAS,IAAK0gB,KAAiBQ,EAAUhhB,SAA4B,QAApB+gB,EAAU,OAARC,QAAQ,IAARA,OAAQ,EAARA,EAAUhhB,gBAAQ,IAAA+gB,EAAAA,EAAI7D,GAE/E9Z,KAAKmY,OAAOxW,aAAajF,GAEzBwa,EAAQ2G,UAAYhiB,CACtB,CACF,MAE4BoF,IAAxBoc,EAAYE,UACdF,EAAYE,SAAWF,EAAYC,SAASjV,KAAMyV,IAAOA,EAAEP,SAE/D,MAEEF,EAAYE,SAAUF,EAAYpU,SAAkBoU,EAAYE,OAEpE,KAEK,KAAIvd,KAAKwX,cAAcqF,WAiB1B,MAAM,IAAI5F,EAAAA,oBAAoB,iDAAkD,wBAhBhFoG,EAAYC,eAAiBxB,QAAQC,IACnCkB,EAAcnX,IAAI8F,UAAqB,IAAAmS,EACrC,MAAMZ,EAAend,KAAKoZ,YAAyB,QAAd2E,EAAC9Z,EAAKrH,gBAAQ,IAAAmhB,EAAAA,EAAIjE,GACvD,IAEE,MAAM8D,QAAiB5d,KAAK2c,YAAY,IAAK1Y,EAAMrH,SAAUugB,IAE7D,MAAO,CAAEthB,GAAI+hB,EAAS/hB,GAAIsK,KAAMyX,EAAUL,SAAS,EACrD,CAAE,MAAOtU,GACP,MAAO,CAAEpN,GAAIoI,EAAKpI,GAAI0hB,SAAS,EAAOtU,QACxC,KAIJoU,EAAYE,SAAWF,EAAYC,SAASjV,KAAMyV,IAAOA,EAAEP,QAG7D,CAGA,GAAIF,EAAYE,SAAWvd,KAAKsY,aAE9B,IACEtY,KAAKmY,OAAOvD,gBAAgBkF,EAC9B,CAAE,MAAO7P,GACP,CAIJ,OAAOoT,CACT,CAKA,gBAAMW,CAAW/Y,GACf,MAAMpJ,EAAKmE,KAAKoZ,YAAYnU,GAG5B,GAAIjF,KAAKqY,gBAAkBrY,KAAKsY,aAAc,CAC5C,MAAM2F,QAAcje,KAAK0X,iBAEzB,aADuB1X,KAAKke,SAAS,CAAEnF,OAAQld,EAAIsJ,eAAgB8Y,EAAMpiB,GAAImB,UAAU,GAEzF,CAGA,aAAagD,KAAKme,eAAetiB,EACnC,CAKA,iBAAMuiB,CAAYC,EAAmB7X,GAEnC,GAAIxG,KAAKqY,gBAAkBrY,KAAKsY,eAAsC,IAAtB9R,EAAQ8X,UAAoB,CAC1E,MAAML,QAAcje,KAAK0X,iBAGzB,aAFuB1X,KAAKue,UAAUN,EAAMpiB,GAAIwiB,EAGlD,CAGA,aAAare,KAAKwe,gBAAgBH,EAAS7X,EAC7C,CAKA,qBAAcgY,CAAgBH,EAAmB7X,GAC/C,IAAIiY,EAA+B,CAAElB,SAAS,EAAMD,SAAU,IAC9D,MAAMW,EAAQzX,EAAQ8X,UAAY,WAAate,KAAK0X,iBACpD,GAAI1X,KAAKwX,cAAc4G,aAKrB,GAJAK,QAAiBze,KAAKwX,cAAc4G,YAClCC,EAAQvY,IAAKjK,GAAOmE,KAAKmY,OAAOxX,UAAU9E,IAC1C2K,GAEEiY,EAASlB,QAAS,CACpB,MAAMD,EAAWmB,EAASnB,UAAYe,EAAQvY,IAAKjK,IAAE,CAAQgiB,UAAWhiB,EAAI0hB,SAAS,EAAMtU,WAAOhI,KAClG,IAAK,MAAMnF,KAAUwhB,EACfxhB,EAAOyhB,UACLU,EACFje,KAAKmY,OAAO9E,WAAWvX,EAAO+hB,UAAWI,EAAMpiB,IAE/CmE,KAAKmY,OAAO5D,aAAazY,EAAO+hB,WAIxC,OACS7d,KAAKwX,cAAckH,aAC5BD,EAASnB,eAAiBxB,QAAQC,IAChCsC,EAAQvY,IAAI8F,UACV,MAAMnQ,EAAOuE,KAAKmY,OAAOxX,UAAU9E,GACnC,IAAKJ,EAAM,CACT,MAAM8d,EAAkC,gBAClC,GAAE9C,GAAOzW,KAAK0W,KACdK,EAAUN,EAAG,+BAAiCO,QAAQ,KAAMnb,GAClE,MAAO,CAAEA,KAAI0hB,SAAS,EAAOtU,MAAO,IAAIgO,EAAAA,oBAAoBF,EAASwC,GACvE,CACA,IAOE,aANMvZ,KAAKwX,cAAckH,WAAWjjB,EAAM+K,GACtCyX,EACFje,KAAKmY,OAAO9E,WAAWxX,EAAIoiB,EAAMpiB,IAEjCmE,KAAKmY,OAAO5D,aAAa1Y,GAEpB,CAAEA,KAAI0hB,SAAS,EACxB,CAAE,MAAOtU,GACP,MAAO,CAAEpN,KAAIoN,QAAOsU,SAAS,EAC/B,KAIJkB,EAASlB,SAAWkB,EAASnB,SAASjV,KAAMvM,IAAYA,EAAOyhB,UAGjE,GAAIkB,EAASlB,SAAWU,EACtB,IACEje,KAAKmY,OAAOvD,gBAAgBqJ,EAAMpiB,GACpC,CAAE,MAAOoO,GACP,CAIJ,OAAOwU,CACT,CAKA,oBAAcN,CAAepF,GAC3B,MAAM4F,EAAa3e,KAAKmY,OAAOxX,UAAUoY,GAGzC,IAAK4F,EAAY,CACf,MAAM,GAAElI,GAAOzW,KAAK0W,KACdK,EAAUN,EAAG,wCAA0CO,QAAQ,KAAM+B,GAC3E,MAAM,IAAI9B,EAAAA,oBAAoBF,EAAS,eACzC,CAGA,SAFM/W,KAAKwX,cAAckH,WAAWC,EAAY,CAAEL,WAAW,IAC7Dte,KAAKmY,OAAO5D,aAAawE,GACrB/Y,KAAKsY,aACP,IACE,MAAM2F,QAAcje,KAAK0X,iBACrBuG,GACFje,KAAKmY,OAAOvD,gBAAgBqJ,EAAMpiB,GAEtC,CAAE,MAAOoO,GACP,CAGJ,OAAO,CACT,CAKA,kBAAMwN,EAAa,KACjBzN,EAAI,SACJ9N,EAAQ,gBACR0iB,IAMA,MAAMC,EAAiB7e,KAAKoZ,YAAoB,OAARld,QAAQ,IAARA,EAAAA,EAAY8D,KAAKoY,SAMzD,GAHApY,KAAKqZ,cAAcrP,GAAM,GAGrBhK,KAAKuY,oBAAqB,CAE5B,GADmBvY,KAAK4Z,wBAAwBiF,EAAgB7U,GAAM,GACtD,CACd,MAAM,GAAEyM,GAAOzW,KAAK0W,KACdK,EAAUN,EAAG,+CAAiDO,QAAQ,KAAMhN,GAClF,MAAM,IAAIiN,EAAAA,oBAAoBF,EAAS,sBACzC,CACF,CAEA,MAAM3S,QAAepE,KAAKwX,cAAcC,aAAazN,EAAM6U,EAAgBD,GAQ3E,OAPA5e,KAAKmY,OAAOxW,aAAa,CACvB9F,GAAIuI,EAAOvI,GACXe,SAAUiiB,EACV7U,KAAM5F,EAAO4F,KACbhN,UAAU,EACVqF,cAAe+B,EAAO/B,gBAEjB6T,EAAY9R,EACrB,CAKA,kBAAM0a,CAAaliB,GACjB,MAAMf,EAAKmE,KAAKoZ,YAAYxc,GAG5B,GAAIoD,KAAKqY,gBAAkBrY,KAAKsY,aAC9B,IACE,MAAM2F,QAAcje,KAAK0X,iBAGzB,cAFuB1X,KAAKke,SAAS,CAAEnF,OAAQld,EAAIsJ,eAAgB8Y,EAAMpiB,GAAImB,UAAU,MAGrFgD,KAAKmY,OAAO9U,sBAAsBxH,IAC3B,EAGX,CAAE,MAAOoN,GAGP,aAAajJ,KAAKme,eAAetiB,EACnC,CAGF,aAAamE,KAAKme,eAAetiB,EACnC,CAKA,kBAAMkjB,CAAaniB,EAAkBoiB,GACnC,MAAM,GAAEvI,GAAOzW,KAAK0W,KACpB,IAAK1W,KAAKwX,cAAcyH,WACtB,MAAM,IAAIhI,EAAAA,oBAAoBR,EAAG,kCAAmC,oBAEtE,MAAM5a,EAAKmE,KAAKoZ,YAAYxc,GACtBwgB,EAAepd,KAAKmY,OAAOxX,UAAU9E,GAC3C,IAAKuhB,EAAc,CACjB,MAAMrG,EAAUN,EAAG,0CAA4CO,QAAQ,KAAMpa,GAC7E,MAAM,IAAIqa,EAAAA,oBAAoBF,EAAS,iBACzC,CAIA,GAFA/W,KAAKqZ,cAAc2F,GAAS,GAExBhf,KAAKuY,oBAAqB,CAC5B,MAAMrc,EAAW8D,KAAKoZ,YAAYgE,EAAaxgB,UAE/C,GADmBoD,KAAK4Z,wBAAwB1d,EAAU8iB,GAAS,EAAMnjB,GACzD,CACd,MAAMkb,EAAUN,EAAG,+CAAiDO,QAAQ,KAAMgI,GAClF,MAAM,IAAI/H,EAAAA,oBAAoBF,EAAS,sBACzC,CACF,CAEA,MAAMjb,QAAekE,KAAKwX,cAAcyH,WAAW7B,EAAc4B,GAEjE,OADAhf,KAAKmY,OAAOxW,aAAa,IAAK3B,KAAKmY,OAAOxX,UAAU7E,EAAOD,OAAQC,IAC5DkE,KAAKmY,OAAOxX,UAAU7E,EAAOD,GACtC,CAKA,gBAAMqjB,CAAWja,EAAgB+Z,GAC/B,MAAM,GAAEvI,GAAOzW,KAAK0W,KACpB,IAAK1W,KAAKwX,cAAcyH,WACtB,MAAM,IAAIhI,EAAAA,oBAAoBR,EAAG,gCAAiC,oBAEpE,MAAMkI,EAAa3e,KAAKmY,OAAOxX,UAAUsE,GACzC,IAAK0Z,EAAY,CACf,MAAM5H,EAAUN,EAAG,wCAA0CO,QAAQ,KAAM/R,GAC3E,MAAM,IAAIgS,EAAAA,oBAAoBF,EAAS,eACzC,CACA,MAAMlb,EAAKmE,KAAKoZ,YAAYnU,GAI5B,GAFAjF,KAAKqZ,cAAc2F,GAAS,GAExBhf,KAAKuY,oBAAqB,CAC5B,MAAMrc,EAAW8D,KAAKoZ,YAAYuF,EAAW/hB,UAE7C,GADmBoD,KAAK4Z,wBAAwB1d,EAAU8iB,GAAS,EAAOnjB,GAC1D,CACd,MAAMkb,EAAUN,EAAG,6CAA+CO,QAAQ,KAAMgI,GAChF,MAAM,IAAI/H,EAAAA,oBAAoBF,EAAS,oBACzC,CACF,CAEA,MAAMoI,QAAgBnf,KAAKwX,cAAcyH,WAAWN,EAAYK,GAEhE,OADIG,GAASnf,KAAKmY,OAAOxW,aAAa,IAAK3B,KAAKmY,OAAOxX,UAAU9E,MAAQsjB,IAClEnf,KAAKmY,OAAOxX,UAAU9E,EAC/B,CAKA,cAAMqiB,EAAS,OACbnF,EAAM,eACN5T,EAAc,SACdnI,IAMA,MAAM0c,EAAW1Z,KAAKoZ,YAAYjU,GAClCnF,KAAKyZ,0BAA0BtU,GAC/B,MAAMia,EAAapf,KAAKmY,OAAOxX,UAAUoY,GACzC,IAAKqG,EAAY,CACf,MAAMX,QAAiBze,KAAKwX,cAAc0G,SACxC,CACEriB,GAAIkd,EACJnc,SAAU8c,EACV1c,SAAUA,GAEZ0c,GAGF,GAAI+E,EAAS5iB,KAAOkd,EAClB/Y,KAAKmY,OAAOxW,aAAa,IAAK8c,EAAU7hB,SAAU8c,QAC7C,CACL,IACE1Z,KAAKmY,OAAO5D,aAAawE,EAC3B,CAAE,MAAO9O,GACP,CAEFjK,KAAKmY,OAAOxW,aAAa,IAAK8c,EAAU7hB,SAAU8c,GACpD,CACA,OAAO,CACT,CAEA,MAAM,GAAEjD,GAAOzW,KAAK0W,KACpB,GAAI0I,EAAWpiB,SAAU,CACvB,GAAI+b,IAAWW,EACb,MAAM,IAAIzC,EAAAA,oBAAoBR,EAAG,kCAAmC,gBAEtE,GAAIzW,KAAKka,YAAYnB,EAAQW,GAC3B,MAAM,IAAIzC,EAAAA,oBAAoBR,EAAG,0CAA2C,qBAEhF,CAEA,GAAIzW,KAAKuY,oBAAqB,CAE5B,GAAImB,IADoB1Z,KAAKoZ,YAAYgG,EAAWxiB,WAChBwiB,EAAWpV,KAAM,CAEnD,GADmBhK,KAAK4Z,wBAAwBF,EAAU0F,EAAWpV,OAAQoV,EAAWpiB,SAAU+b,GAClF,CACd,MAAMQ,EAAkC6F,EAAWpiB,SAAW,sBAAwB,oBACtF,MAAM,IAAIia,EAAAA,oBACR,GAAGmI,EAAWpiB,SAAW,SAAW,WAAWoiB,EAAWpV,wCAC1DuP,EAEJ,CACF,CACF,CAEA,MAAMkF,QAAiBze,KAAKwX,cAAc0G,SAASkB,EAAY1F,GAE/D,GAAI+E,EAAS5iB,KAAOkd,EAAQ,CAC1B,MAAMjd,EAASkE,KAAKmY,OAAO9E,WAAW0F,EAAQW,GAE9C,OADA1Z,KAAKmY,OAAOxW,aAAa,IAAK7F,KAAW2iB,KAClC,CACT,CAAO,CACL,MAAM3iB,EAASkE,KAAKmY,OAAO5D,aAAawE,GAExC,OADA/Y,KAAKmY,OAAOxW,aAAa,IAAK7F,KAAW2iB,EAAU7hB,SAAU8c,KACtD,CACT,CACF,CAEA,eAAM6E,CAAUpZ,EAAwBkZ,GACtC,MAAM3E,EAAW1Z,KAAKoZ,YAAYjU,GAClCnF,KAAKyZ,0BAA0BtU,GAC/B,MAAMka,EAAchB,EAAQvY,IAAKiT,GAAW/Y,KAAKmY,OAAOxX,UAAUoY,IAClE,IAAK,MAAMqG,KAAcC,EACvB,GAAKD,EAAL,CAEA,GAAIA,EAAWpiB,SAAU,CACvB,MAAM,GAAEyZ,GAAOzW,KAAK0W,KACpB,GAAI0I,EAAWvjB,KAAO6d,EAAU,CAC9B,MAAM3C,EAAUN,EAAG,uCAAyCO,QAAQ,KAAMoI,EAAWpV,MACrF,MAAM,IAAIiN,EAAAA,oBAAoBF,EAAS,eACzC,CACA,GAAI/W,KAAKka,YAAYkF,EAAWvjB,GAAI6d,GAAW,CAC7C,MAAM3C,EAAUN,EAAG,+CAAiDO,QAAQ,KAAMoI,EAAWpV,MAC7F,MAAM,IAAIiN,EAAAA,oBAAoBF,EAAS,qBACzC,CACF,CAEA,GAAI/W,KAAKuY,oBAAqB,CAC5B,MAAM1I,EAAkB7P,KAAKoZ,YAAYgG,EAAWxiB,UACpD,GAAI8c,IAAa7J,GAAmBuP,EAAWpV,KAAM,CAOnD,GANmBhK,KAAK4Z,wBACtBF,EACA0F,EAAWpV,OACToV,EAAWpiB,SACboiB,EAAWvjB,IAEG,CACd,MAAM0d,EAAkC6F,EAAWpiB,SAAW,sBAAwB,oBACtF,MAAM,IAAIia,EAAAA,oBACR,GAAGmI,EAAWpiB,SAAW,SAAW,WAAWoiB,EAAWpV,wCAC1DuP,EAEJ,CACF,CACF,CA/ByB,CAkC3B,IAAI8D,EAAiD,CAAEC,SAAU,IAAInd,MAAMkf,EAAYjkB,QAASmiB,SAAS,GAEzG,GAAIvd,KAAKwX,cAAc+G,UACrBlB,QAAoBrd,KAAKwX,cAAc+G,UAAUc,EAAa3F,OACzD,KAAI1Z,KAAKwX,cAAc0G,SAoB5B,MAAM,IAAIjH,EAAAA,oBAAoB,8BAA+B,kBAnB7DoG,EAAYC,eAAiBxB,QAAQC,IACnCsC,EAAQvY,IAAI8F,MAAOmN,EAAQpb,KACzB,MAIMlC,EAJa4jB,EAAY1hB,IAIH,CAAE9B,GAAIkd,EAAQnc,SAAU,KAAMI,UAAU,EAAOgN,KAAM+O,GACjF,IACE,MAAO,CACLld,GAAIkd,EACJ5S,WAAYnG,KAAKwX,cAAc0G,SAASziB,EAAMie,GAC9C6D,SAAS,EAEb,CAAE,MAAOtU,GACP,MAAO,CAAE4U,UAAW9E,EAAQwE,SAAS,EAAOtU,QAC9C,IAKN,CAEA,GAAIoU,EAAYE,QAAS,CACvB,MAAMD,EAAWD,EAAYC,UAAYe,EAAQvY,IAAKjK,IAAE,CAAQgiB,UAAWhiB,EAAI0hB,SAAS,EAAMpX,UAAMlF,KACpG,IAAK,MAAMiW,KAAWoG,EACpB,GAAIpG,EAAQqG,QACV,GAAKrG,EAAQ/Q,MAAQ+Q,EAAQ/Q,KAAKtK,KAAOqb,EAAQ2G,UAS1C,CACL,MAAMyB,EAAUtf,KAAKmY,OAAO5D,aAAa2C,EAAQ2G,WACjD7d,KAAKmY,OAAOxW,aAAa,IAAK2d,KAAYpI,EAAQ/Q,KAAMvJ,SAAU8c,GACpE,MAVE1Z,KAAKmY,OAAO9E,WAAW6D,EAAQ2G,UAAWnE,GACtCxC,EAAQ/Q,MACVnG,KAAKmY,OAAOxW,aAAa,IACpB3B,KAAKmY,OAAOxX,UAAUuW,EAAQ2G,cAC9B3G,EAAQ/Q,KACXvJ,SAAU8c,IAQpB,OAAO2D,CACT,CAAO,CACL,MAAM,GAAE5G,GAAOzW,KAAK0W,KAEpB,MAAO,CACL6G,SAAS,EACTtU,MAHiBoU,EAAYpU,OAAS,IAAIgO,EAAAA,oBAAoBR,EAAG,qBAAsB,kBAK3F,CACF,CAKA,cAAM8I,EAAS,OACbxG,EAAM,eACN5T,IAMA,IAAKnF,KAAKwX,cAAc+H,SAAU,CAChC,MAAM,GAAE9I,GAAOzW,KAAK0W,KACpB,MAAM,IAAIO,EAAAA,oBAAoBR,EAAG,8BAA+B,iBAClE,CAEA,MAAMiD,EAAW1Z,KAAKoZ,YAAYjU,GAClCnF,KAAKyZ,0BAA0BtU,GAC/B,MAAMia,EAAapf,KAAKmY,OAAOxX,UAAUoY,GACzC,IAAKqG,EAAY,CACf,MAAMX,QAAiBze,KAAKwX,cAAc+H,SACxC,CACE1jB,GAAIkd,EACJnc,SAAU8c,GAEZA,GAKF,OAFA1Z,KAAKmY,OAAO7E,WAAWyF,EAAQW,EAAU+E,EAAS5iB,IAClDmE,KAAKmY,OAAOxW,aAAa,IAAK8c,EAAU7hB,SAAU8c,KAC3C,CACT,CAEA,GAAI1Z,KAAKuY,qBAAuB6G,EAAWpV,KAAM,CAC/C,MACM6P,EAAYH,IADM1Z,KAAKoZ,YAAYgG,EAAWxiB,UACHmc,OAAS9X,EAE1D,GADmBjB,KAAK4Z,wBAAwBF,EAAU0F,EAAWpV,OAAQoV,EAAWpiB,SAAU6c,GAClF,CACd,MAAMN,EAAkC6F,EAAWpiB,SAAW,sBAAwB,oBACtF,MAAM,IAAIia,EAAAA,oBACR,GAAGmI,EAAWpiB,SAAW,SAAW,WAAWoiB,EAAWpV,wCAC1DuP,EAEJ,CACF,CAEA,MAAMkF,QAAiBze,KAAKwX,cAAc+H,SAASH,EAAY1F,GACzD5d,EAASkE,KAAKmY,OAAO7E,WAAWyF,EAAQW,EAAU+E,EAAS5iB,IAEjE,OADAmE,KAAKmY,OAAOxW,aAAa,IAAK7F,KAAW2iB,EAAU7hB,SAAU8c,KACtD,CACT,CAEA,eAAM8F,CAAUra,EAAwBkZ,GACtC,MAAM3E,EAAW1Z,KAAKoZ,YAAYjU,GAClCnF,KAAKyZ,0BAA0BtU,GAC/B,MAAMka,EAAchB,EAAQvY,IAAKiT,GAAW/Y,KAAKmY,OAAOxX,UAAUoY,IAElE,GAAI/Y,KAAKuY,oBACP,IAAK,IAAI5a,EAAI,EAAGA,EAAI0hB,EAAYjkB,OAAQuC,IAAK,CAC3C,MAAMyhB,EAAaC,EAAY1hB,GAC/B,GAAKyhB,GACDA,EAAWpV,KAAM,CACnB,MAAM6F,EAAkB7P,KAAKoZ,YAAYgG,EAAWxiB,UAC9Cid,EAAYH,IAAa7J,EAAkBwO,EAAQ1gB,QAAKsD,EAE9D,GADmBjB,KAAK4Z,wBAAwBF,EAAU0F,EAAWpV,OAAQoV,EAAWpiB,SAAU6c,GAClF,CACd,MAAMN,EAAkC6F,EAAWpiB,SAAW,sBAAwB,oBACtF,MAAM,IAAIia,EAAAA,oBACR,GAAGmI,EAAWpiB,SAAW,SAAW,WAAWoiB,EAAWpV,wCAC1DuP,EAEJ,CACF,CACF,CAGF,IAAI8D,EAAiD,CAAEC,SAAU,IAAInd,MAAMkf,EAAYjkB,QAASmiB,SAAS,GAEzG,GAAIvd,KAAKwX,cAAcgI,UACrBnC,QAAoBrd,KAAKwX,cAAcgI,UAAUH,EAAa3F,OACzD,KAAI1Z,KAAKwX,cAAc+H,SAYvB,CACL,MAAM,GAAE9I,GAAOzW,KAAK0W,KACpB,MAAM,IAAIO,EAAAA,oBAAoBR,EAAG,+BAAgC,iBACnE,CAdE4G,EAAYC,eAAiBxB,QAAQC,IACnCsC,EAAQvY,IAAI8F,MAAOmN,EAAQpb,KACzB,MACMlC,EADa4jB,EAAY1hB,IACH,CAAE9B,GAAIkd,EAAQnc,SAAU,KAAMI,UAAU,GACpE,IACE,MAAO,CAAE6gB,UAAW9E,EAAQ5S,WAAYnG,KAAKwX,cAAc+H,SAAS9jB,EAAMie,GAAW6D,SAAS,EAChG,CAAE,MAAOtU,GACP,MAAO,CAAE4U,UAAW9E,EAAQwE,SAAS,EAAOtU,QAC9C,IAMN,CAEA,GAAIoU,EAAYE,SAAWF,EAAYC,SACrC,IAAK,IAAI3f,EAAI,EAAGvC,EAASiiB,EAAYC,SAASliB,OAAQuC,EAAIvC,EAAQuC,IAAK,CACrE,MAAMuZ,EAAUmG,EAAYC,SAAS3f,GAChB,IAAA8hB,EAArB,GAAIvI,EAAQqG,QACV,GAAgB,QAAhBkC,EAAIvI,EAAQ/Q,YAAI,IAAAsZ,GAAZA,EAAc5jB,GAAI,KAAA6jB,EACpB,MAAM5jB,EAASkE,KAAKmY,OAAO7E,WACzB4D,EAAQ2G,WACI,QAAZ6B,EAAAxI,EAAQ/Q,YAAI,IAAAuZ,OAAA,EAAZA,EAAc9iB,WAAY8c,EAC1BxC,EAAQ/Q,KAAKtK,IAEXqb,EAAQ/Q,MACVnG,KAAKmY,OAAOxW,aAAa,IAAK7F,KAAWob,EAAQ/Q,KAAMvJ,SAAU8c,GAErE,CAIJ,MACK,IAAK2D,EAAYC,SACtB,MAAM,IAAIrG,EAAAA,oBAAoB,wDAAyD,mBAGzF,OAAOoG,CACT,CAKA,qBAAMsC,CAAgBxZ,GAAoF,IAAAyZ,EACxG,GAAIzZ,EAAK0Z,SAAU,CACjB,MAAMC,QAAmB9f,KAAK6X,gBAC9B1R,EAAO,IAAKA,EAAMvJ,SAAUkjB,EAAWjkB,GACzC,CACA,MAAMie,EAAqB9Z,KAAKoZ,YAAyB,QAAdwG,EAACzZ,EAAKvJ,gBAAQ,IAAAgjB,EAAAA,EAAI5f,KAAKoY,SAE5DnU,QAAajE,KAAKwX,cAAcmI,gBAAgBxZ,EAAKyV,IAAK9B,GAEhE,OADA9Z,KAAKmY,OAAOxW,aAAa,IAAKsC,EAAMrH,SAAUkd,IACvC7V,CACT,CAKA,gBAAM8b,CAAW9a,EAAgB+a,GAC/B,MAAM,GAAEvJ,GAAOzW,KAAK0W,KACpB,IAAK1W,KAAKwX,cAAcuI,WACtB,MAAM,IAAI9I,EAAAA,oBAAoBR,EAAG,gCAAiC,wBAGpE,MAAM5a,EAAKmE,KAAKoZ,YAAYnU,GACtB0Z,EAAa3e,KAAKmY,OAAOxX,UAAU9E,GACzC,IAAK8iB,EAAY,CACf,MAAM5H,EAAUN,EAAG,wCAA0CO,QAAQ,KAAM/R,GAC3E,MAAM,IAAIgS,EAAAA,oBAAoBF,EAAS,eACzC,CAMA,GAJIiJ,EAAQhW,MAAQgW,EAAQhW,OAAS2U,EAAW3U,MAC9ChK,KAAKqZ,cAAc2G,EAAQhW,MAAM,GAG/BhK,KAAKuY,qBAAuByH,EAAQhW,MAAQgW,EAAQhW,OAAS2U,EAAW3U,KAAM,CAChF,MAAM9N,EAAW8D,KAAKoZ,YAAYuF,EAAW/hB,UAE7C,GADmBoD,KAAK4Z,wBAAwB1d,EAAU8jB,EAAQhW,MAAM,EAAOnO,GAC/D,CACd,MAAMkb,EAAUN,EAAG,6CAA+CO,QAAQ,KAAMgJ,EAAQhW,MACxF,MAAM,IAAIiN,EAAAA,oBAAoBF,EAAS,oBACzC,CACF,CAEA,MAAM9S,QAAajE,KAAKwX,cAAcuI,WAAWpB,EAAY,IAAKqB,IAElE,OADAhgB,KAAKmY,OAAOxW,aAAa,IAAK3B,KAAKmY,OAAOxX,UAAU9E,MAAQoI,KAAS+b,IAC9DhgB,KAAKmY,OAAOxX,UAAU9E,EAC/B,KACDya,E,gDC/mCM,MAAM2J,EAQXvgB,WAAAA,CACmBwgB,EACDC,EAdI,GAeJC,EAbK,QAcLxI,EAfO,QAgBPyI,GAAqC,EACpC3J,EAAoBsB,EAAAA,IACrC,KANiBkI,OAAAA,EAAuB,KACxBC,SAAAA,EAAgB,KAChBC,QAAAA,EAAe,KACfxI,UAAAA,EAAiB,KACjByI,0BAAAA,EAAkC,KACjC3J,KAAAA,EAAiB,KAbnB4J,UAAY,IAAI1gB,IAAqB,KACrC2gB,UAAY,IAAI3gB,IAAqB,KAEtD6b,YAAM,OACNC,qBAAe,OACf/C,wBAAkB,EAUhB3Y,KAAK2Y,mBAAqB3Y,KAAKkgB,OAAOvH,mBAElCuH,EAAOzE,SACTzb,KAAKyb,OAAUxX,GACbic,EAAOzE,OAAO,IACTxX,EACHpI,GAAImE,KAAKwgB,UAAUvc,EAAKpI,IAAI,GAC5Be,SAAUqH,EAAKrH,SAAWoD,KAAKwgB,UAAUvc,EAAKrH,UAAU,GAAQoD,KAAKmgB,YAIvED,EAAOxE,kBACT1b,KAAK0b,gBAAmBzX,GACtBic,EAAOxE,gBAAgB,IAClBzX,EACHpI,GAAImE,KAAKwgB,UAAUvc,EAAKpI,IAAI,GAC5Be,SAAUqH,EAAKrH,SAAWoD,KAAKwgB,UAAUvc,EAAKrH,UAAU,GAAQoD,KAAKmgB,YAGtEngB,KAAKkgB,OAAO9B,YAGfpe,KAAK0e,gBAAazd,EAFlBjB,KAAKoe,iBAAcnd,EAIhBjB,KAAKkgB,OAAO3B,UAGfve,KAAKke,cAAWjd,EAFhBjB,KAAKue,eAAYtd,EAIdjB,KAAKkgB,OAAOV,UAGfxf,KAAKuf,cAAWte,EAFhBjB,KAAKwf,eAAYve,EAIdjB,KAAKkgB,OAAOpD,YAGf9c,KAAK6c,gBAAa5b,EAFlBjB,KAAK8c,iBAAc7b,EAIrBjB,KAAKygB,iBAAiBzgB,KAAKmgB,SAC7B,CAEAtH,aAAAA,CAAcI,GAA6C,IAAAyH,EAAAC,EAChC,QAAzBD,GAAAC,EAAA3gB,KAAKkgB,QAAOrH,qBAAa,IAAA6H,GAAzBA,EAAA3Q,KAAA4Q,EAA4B,CAC1B7H,oBAAsBtC,IACpB,MAAMoK,EAAcpK,EAAKQ,QAAQ,aAAc,IACzCnb,EAAKmE,KAAKsgB,UAAUzf,IAAI+f,GAC1B/kB,GAAIod,EAAWH,oBAAoBjd,IAEzCmd,cAAgBxC,IACd,MAAMoK,EAAcpK,EAAKQ,QAAQ,aAAc,IACzCnb,EAAKmE,KAAKsgB,UAAUzf,IAAI+f,GAC9B,GAAI/kB,EAAI,CACN,MAAMC,EAASmd,EAAWD,cAAcnd,GACxC,GAAIC,EACF,MAAO,IACFA,EACHD,GAAImE,KAAKwgB,UAAU1kB,EAAOD,GAAIC,EAAOkB,UACrCJ,SAAUoD,KAAKwgB,UAAU1kB,EAAOc,SAAUd,EAAOkB,UAGvD,IAIN,CAEQyjB,gBAAAA,CAAiBjK,GACvB,GAAIA,IAASxW,KAAKmgB,SAAU,OAC5B,MAAMS,EAAcpK,EAAKK,WAAW,aAAc,IAClD,GAAI+J,IAAgB5gB,KAAK4X,UAAUf,WAAW,aAAc,IAAK,OAAO7W,KAAKogB,QAC7E,GAAIpgB,KAAKsgB,UAAUvkB,IAAI6kB,GAAc,OAAO5gB,KAAKsgB,UAAUzf,IAAI+f,GAC/D,MAAM/kB,GAAKglB,EAAAA,EAAAA,KAGX,OAFA7gB,KAAKsgB,UAAU3d,IAAIie,EAAa/kB,GAChCmE,KAAKugB,UAAU5d,IAAI9G,EAAI+kB,GAChB/kB,CACT,CAEA2kB,SAAAA,CAAU3kB,EAAYmB,EAAmB8jB,GACvC,MAAM,GAAErK,GAAOzW,KAAK0W,KACpB,GAAW,KAAP7a,QAAoBoF,IAAPpF,EAAkB,OAAOmE,KAAKmgB,SAC/C,GAAItkB,IAAOmE,KAAKogB,QAAS,OAAOpgB,KAAK4X,UACrC,IAAIpB,EAAOxW,KAAKugB,UAAU1f,IAAIhF,GAC9B,IAAK2a,EAAM,CACT,GAAKsK,EAIH,MAAO,kBAAkBjlB,IAJd,CACX,MAAMkb,EAAUN,EAAKA,EAAG,gBAAgB5a,2BAA8B,gBAAgBA,0BACtF,MAAM,IAAIob,EAAAA,oBAAoBF,EAAS,eACzC,CAGF,CAEA,IAAIgK,EAAa,EACjB,KAAOA,EAAa/gB,KAAKmgB,SAAS/kB,QAAwC,MAA9B4E,KAAKmgB,SAASY,IACxDA,IAEF,GAAIA,EAAY,CACd,IAAIpjB,EAAI,EACR,KAAOA,EAAI6Y,EAAKpb,QAAsB,MAAZob,EAAK7Y,IAC7BA,IAEF,MAAMqjB,EAAYxK,EAAKpY,MAAMT,GAC7B6Y,EAAO,IAAIyK,OAAOF,GAAcC,CAClC,CAIA,OAHIhkB,GAAYgD,KAAKqgB,4BAA8B7J,EAAK0K,SAAS,OAC/D1K,GAAc,KAETA,CACT,CAEQ2K,gBAAAA,CAAiBtlB,EAAYulB,GACnC,MAAMR,EAAcQ,EAAQpK,QAAQ,aAAc,IAC5CqK,EAAUrhB,KAAKugB,UAAU1f,IAAIhF,GAC/BwlB,GAASrhB,KAAKsgB,UAAU7d,OAAO4e,GACnCrhB,KAAKugB,UAAU5d,IAAI9G,EAAI+kB,GACvB5gB,KAAKsgB,UAAU3d,IAAIie,EAAa/kB,EAClC,CAEA,cAAMmf,CAASxU,GASb,MAAM8a,EAAa9a,EAAQ5J,SAAWoD,KAAKwgB,UAAUha,EAAQ5J,UAAU,GAAQoD,KAAKmgB,SAC9ErkB,QAAekE,KAAKkgB,OAAOlF,SAAS,IAAKxU,EAAS5J,SAAU0kB,IAE5DC,EAAczlB,EAAO0N,MAAM1D,IAAKoE,IACpC,MAAMrO,EAAKmE,KAAKygB,iBAAiBvW,EAAErO,IAC7Be,EAAWsN,EAAEtN,SAAWoD,KAAKygB,iBAAiBvW,EAAEtN,UAAYoD,KAAKygB,iBAAiBzgB,KAAKmgB,UAC7F,MAAO,IAAKjW,EAAGrO,KAAIe,cAGrB,MAAO,IAAKd,EAAQ0N,MAAO+X,EAC7B,CAEA,kBAAM9J,CAAazN,EAAc5G,EAAiBwb,GAChD,MAAM4C,EAAape,EAASpD,KAAKwgB,UAAUpd,GAAQ,GAAQpD,KAAKmgB,SAC1D/b,QAAepE,KAAKkgB,OAAOzI,aAAazN,EAAMwX,EAAY5C,GAE1D/iB,EAAKmE,KAAKygB,iBAAiBrc,EAAOvI,IAClCe,EAAWwH,EAAOxH,SAAWoD,KAAKygB,iBAAiBrc,EAAOxH,UAAYoD,KAAKygB,iBAAiBzgB,KAAKmgB,UACvG,MAAO,IAAK/b,EAAQvI,KAAIe,WAC1B,CAEA,gBAAMqiB,CAAWxjB,EAAsBujB,GACrC,MAAM,GAAEvI,GAAOzW,KAAK0W,KACpB,IAAK1W,KAAKkgB,OAAOjB,WAAY,CAC3B,MAAMlI,EAAUN,EAAKA,EAAG,iDAAmD,gDAC3E,MAAM,IAAIQ,EAAAA,oBAAoBF,EAAS,mBACzC,CAEA,MAAM0K,EAAWzhB,KAAKwgB,UAAU/kB,EAAKI,GAAIJ,EAAKuB,UACxC0kB,EAAcD,EAEpB,OAASE,SAAkB3hB,KAAKkgB,OAAOjB,WACrC,IAAKxjB,EAAMI,GAAI4lB,EAAU7kB,SAAUoD,KAAKwgB,UAAU/kB,EAAKmB,UAAU,IACjEoiB,GAaF,OAVAhf,KAAKmhB,iBAAiB1lB,EAAKI,GAAI8lB,EAAQ9lB,IAEnCJ,EAAKuB,UACPgD,KAAK4hB,0BAA0BnmB,EAAKI,GAAI6lB,EAAaC,EAAQ9lB,IAG3D8lB,EAAQ/kB,WACV+kB,EAAU,IAAKA,EAAS/kB,SAAUoD,KAAKygB,iBAAiBkB,EAAQ/kB,YAG3D,IAAK+kB,EAAS9lB,GAAImE,KAAKygB,iBAAiBkB,EAAQ9lB,IACzD,CAEA,gBAAM6iB,CAAWjjB,EAAsB+K,GACrC,MAAMib,EAAWzhB,KAAKwgB,UAAU/kB,EAAKI,GAAIJ,EAAKuB,gBACxCgD,KAAKkgB,OAAOxB,WAAW,IAAKjjB,EAAMI,GAAI4lB,EAAU7kB,SAAUoD,KAAKwgB,UAAU/kB,EAAKmB,UAAU,IAAS4J,GACvGxG,KAAK6hB,0BAA0BpmB,EAAKI,GAAI4lB,EAC1C,CAEA,gBAAM5E,CAAW5Y,GAWf,MAAMqd,EAAard,EAAKrH,SAAWoD,KAAKwgB,UAAUvc,EAAKrH,UAAU,GAAQoD,KAAKmgB,SACxEvC,QAAiB5d,KAAKkgB,OAAOrD,WAAW,IAAK5Y,EAAMrH,SAAU0kB,IAE7DzlB,EAAKmE,KAAKygB,iBAAiB7C,EAAS/hB,IACpCe,EACJghB,EAAShhB,SAAWoD,KAAKygB,iBAAiB7C,EAAShhB,UAAYoD,KAAKygB,iBAAiBzgB,KAAKmgB,UAC5F,MAAO,IAAKvC,EAAU/hB,KAAIe,WAC5B,CAEA,iBAAMkgB,CAAYC,GAAmE,IAAA+E,EAAAC,EAAAC,EAAAC,EAAAC,EACnF,MAAMC,EAA0BpF,EAAQngB,SAClCwlB,EAAmE,QAA9CN,EAAgB,QAAhBC,EAAGhF,EAAQvT,aAAK,IAAAuY,OAAA,EAAbA,EAAejc,IAAKrK,GAASA,EAAKmB,iBAAS,IAAAklB,EAAAA,EAAI,GAEvEO,EAAiBtF,EAAQngB,SAAWoD,KAAKwgB,UAAUzD,EAAQngB,UAAU,GAAQoD,KAAKmgB,SAClFmC,EAAoC,IACrCvF,EACHngB,SAAUylB,EACV7Y,MAIK,QAJAwY,EACU,QADVC,EACHlF,EAAQvT,aAAK,IAAAyY,OAAA,EAAbA,EAAenc,IAAKrK,IAAI,IACnBA,EACHmB,SAAUnB,EAAKmB,SAAWoD,KAAKwgB,UAAU/kB,EAAKmB,UAAU,GAAQylB,YAC/D,IAAAL,EAAAA,EAAI,IAGLpE,QAAiB5d,KAAKkgB,OAAOpD,YAAYwF,GAC/C,MAAO,IACF1E,EACHN,SAA2B,QAAnB4E,EAAEtE,EAASN,gBAAQ,IAAA4E,OAAA,EAAjBA,EAAmBpc,IAAI,CAACrK,EAAMJ,KAAU,IAAAknB,EAAAC,EAChD,GAAS,OAAJ/mB,QAAI,IAAJA,IAAAA,EAAM0K,KACT,OAAO1K,EAGT,MAAMgnB,EAAWhnB,EAAK0K,KAAKtK,GAAKmE,KAAKygB,iBAAiBhlB,EAAK0K,KAAKtK,SAAMoF,EAChEyhB,EACJjnB,EAAK0K,KAAKvJ,SACRoD,KAAKygB,iBAAiBhlB,EAAK0K,KAAKvJ,UACwB,QADf2lB,EACZ,QADYC,EACxCJ,EAAsB/mB,UAAM,IAAAmnB,EAAAA,EAAIL,SAAuB,IAAAI,EAAAA,EAAIviB,KAAKygB,iBAAiBzgB,KAAKmgB,UAE3F,MAAO,IACF1kB,EACH0K,KAAM,IACD1K,EAAK0K,KACRtK,GAAI4mB,EACJ7lB,SAAU8lB,MAKpB,CAEA,qBAAM/C,CAAgB/D,EAAahf,GACjC,MAAM0kB,EAAa1kB,EAAWoD,KAAKwgB,UAAU5jB,GAAU,GAAQoD,KAAKmgB,SAC9Dlc,QAAajE,KAAKkgB,OAAOP,gBAAgB/D,EAAK0F,GAE9CzlB,EAAKmE,KAAKygB,iBAAiBxc,EAAKpI,IAChC8mB,EAAgB1e,EAAKrH,SAAWoD,KAAKygB,iBAAiBxc,EAAKrH,UAAYoD,KAAKygB,iBAAiBzgB,KAAKmgB,UACxG,MAAO,IAAKlc,EAAMpI,KAAIe,SAAU+lB,EAClC,CAEA,cAAMzE,CAASziB,EAAsB0J,GACnC,MAAMsc,EAAWzhB,KAAKwgB,UAAU/kB,EAAKI,GAAIJ,EAAKuB,UACxC4lB,EAAa5iB,KAAKwgB,UAAUrb,GAAgB,GAE5CrJ,QAAekE,KAAKkgB,OAAOhC,SAC/B,IAAKziB,EAAMI,GAAI4lB,EAAU7kB,SAAUoD,KAAKwgB,UAAU/kB,EAAKmB,UAAU,IACjEgmB,GAGF5iB,KAAKmhB,iBAAiB1lB,EAAKI,GAAIC,EAAOD,IAElCJ,EAAKuB,UACPgD,KAAK4hB,0BAA0BnmB,EAAKI,GAAI4lB,EAAU3lB,EAAOD,IAG3D,MAAM4mB,EAAWziB,KAAKygB,iBAAiB3kB,EAAOD,IACxC6mB,EAAiB5mB,EAAOc,SAAWoD,KAAKygB,iBAAiB3kB,EAAOc,UAAYuI,EAClF,MAAO,IAAKrJ,EAAQD,GAAI4mB,EAAU7lB,SAAU8lB,EAC9C,CAEA,eAAMnE,CAAU/U,EAAyBrE,GACvC,MAAM,GAAEsR,GAAOzW,KAAK0W,KACpB,IAAK1W,KAAKkgB,OAAO3B,UAAW,CAC1B,MAAMxH,EAAUN,EAAKA,EAAG,gDAAkD,+CAC1E,MAAM,IAAIQ,EAAAA,oBAAoBF,EAAS,iBACzC,CAEA,MAAM6L,EAAazd,EAAiBnF,KAAKwgB,UAAUrb,GAAgB,GAAQnF,KAAKmgB,SAE1E0C,EAAarZ,EAAM1D,IAAKrK,IAAI,IAC7BA,EACHI,GAAImE,KAAKwgB,UAAU/kB,EAAKI,GAAIJ,EAAKuB,UACjCJ,SAAUnB,EAAKmB,SAAWoD,KAAKwgB,UAAU/kB,EAAKmB,UAAU,GAAQoD,KAAKmgB,YAGjErkB,QAAekE,KAAKkgB,OAAO3B,UAAUsE,EAAYD,GACjDtF,EAAoD,GAE1D,GAAIxhB,EAAOwhB,UAAYxhB,EAAOwhB,SAASliB,OAAS,EAAG,CACjD,MAAM0nB,EAAY,IAAIljB,IACtB,IAAK,IAAIjC,EAAI,EAAGA,EAAI7B,EAAOwhB,SAASliB,OAAQuC,IAAK,CAC/C,MAAMolB,EAAajnB,EAAOwhB,SAAS3f,GAC7BkgB,EAAYkF,EAAWlF,YAAclgB,EAAI6L,EAAMpO,OAASoO,EAAM7L,GAAG9B,QAAKoF,GACxE4c,GACFiF,EAAUngB,IAAIkb,EAAWkF,EAE7B,CAEA,IAAK,MAAMC,KAAgBxZ,EAAO,CAChC,MAAMuZ,EAAaD,EAAUjiB,IAAImiB,EAAannB,MAC3CC,EAAOwhB,SAASliB,SAAWoO,EAAMpO,OAASU,EAAOwhB,SAAS9T,EAAMyZ,QAAQD,SAAiB/hB,GAE5F,GAAc,OAAV8hB,QAAU,IAAVA,GAAAA,EAAYxF,SAAWwF,EAAW5c,KAAM,CAG1C,GAFAnG,KAAKmhB,iBAAiB6B,EAAannB,GAAIknB,EAAW5c,KAAKtK,IAEnDmnB,EAAahmB,SAAU,CACzB,MAAMqkB,EAAUrhB,KAAKwgB,UAAUwC,EAAannB,GAAImnB,EAAahmB,UAC7DgD,KAAK4hB,0BAA0BoB,EAAannB,GAAIwlB,EAAS0B,EAAW5c,KAAKtK,GAC3E,CAEAyhB,EAASte,KAAK,CACZ6e,UAAWmF,EAAannB,GACxB0hB,SAAS,EACTpX,KAAM,IACD4c,EAAW5c,KACdtK,GAAImE,KAAKygB,iBAAiBsC,EAAW5c,KAAKtK,IAC1Ce,SACEmmB,EAAW5c,KAAKvJ,SACdoD,KAAKygB,iBAAiBsC,EAAW5c,KAAKvJ,UACtCuI,GAAkBnF,KAAKygB,iBAAiBzgB,KAAKmgB,YAGvD,KAAO,CACL,MAAM+C,EAAezM,EAAKA,EAAG,8CAAgD,6CAC7E6G,EAASte,KAAK,CACZ6e,UAAWmF,EAAannB,GACxB0hB,SAAS,EACTtU,OAAiB,OAAV8Z,QAAU,IAAVA,OAAU,EAAVA,EAAY9Z,QAAS,CAAE8N,QAASmM,EAAcC,KAAM,mBAE/D,CACF,CACF,MACE,IAAK,MAAMH,KAAgBxZ,EAAO,CAChC,MAAM0Z,EAAezM,EAAKA,EAAG,+CAAiD,8CAC9E6G,EAASte,KAAK,CACZ6e,UAAWmF,EAAannB,GACxB0hB,SAAS,EACTtU,MAAO,CAAE8N,QAASmM,EAAcC,KAAM,mBAE1C,CAGF,MAAO,CAAE5F,QAASzhB,EAAOyhB,QAASD,WAAUrU,MAAOnN,EAAOmN,MAC5D,CAEA,eAAMuW,CAAUhW,EAAyBrE,GACvC,MAAM,GAAEsR,GAAOzW,KAAK0W,KACpB,IAAK1W,KAAKkgB,OAAOV,UAAW,CAC1B,MAAMzI,EAAUN,EAAKA,EAAG,gDAAkD,+CAC1E,MAAM,IAAIQ,EAAAA,oBAAoBF,EAAS,iBACzC,CAEA,MAAM6L,EAAazd,EAAiBnF,KAAKwgB,UAAUrb,GAAgB,GAAQnF,KAAKmgB,SAE1E0C,EAAarZ,EAAM1D,IAAKrK,IAAI,IAC7BA,EACHI,GAAImE,KAAKwgB,UAAU/kB,EAAKI,GAAIJ,EAAKuB,UACjCJ,SAAUnB,EAAKmB,SAAWoD,KAAKwgB,UAAU/kB,EAAKmB,UAAU,GAAQoD,KAAKmgB,YAGjErkB,QAAekE,KAAKkgB,OAAOV,UAAUqD,EAAYD,GACjDtF,EAAoD,GAE1D,GAAIxhB,EAAOwhB,UAAYxhB,EAAOwhB,SAASliB,OAAS,EAAG,CACjD,MAAM0nB,EAAY,IAAIljB,IACtB,IAAK,IAAIjC,EAAI,EAAGA,EAAI7B,EAAOwhB,SAASliB,OAAQuC,IAAK,CAC/C,MAAMolB,EAAajnB,EAAOwhB,SAAS3f,GAC7BkgB,EAAYkF,EAAWlF,YAAclgB,EAAI6L,EAAMpO,OAASoO,EAAM7L,GAAG9B,QAAKoF,GACxE4c,GACFiF,EAAUngB,IAAIkb,EAAWkF,EAE7B,CAEA,IAAK,MAAMC,KAAgBxZ,EAAO,KAAA4Z,EAChC,MAAML,EAAaD,EAAUjiB,IAAImiB,EAAannB,MAC3CC,EAAOwhB,SAASliB,SAAWoO,EAAMpO,OAASU,EAAOwhB,SAAS9T,EAAMyZ,QAAQD,SAAiB/hB,GAE5F,GAAc,OAAV8hB,QAAU,IAAVA,GAAAA,EAAYxF,SAA0B,QAAnB6F,EAAIL,EAAW5c,YAAI,IAAAid,GAAfA,EAAiBvnB,GAAI,CAC9C,MAAMqJ,EAAQlF,KAAKygB,iBAAiBsC,EAAW5c,KAAKtK,IAEpDyhB,EAASte,KAAK,CACZ6e,UAAWmF,EAAannB,GACxB0hB,SAAS,EACTpX,KAAM,IACD4c,EAAW5c,KACdtK,GAAIqJ,EACJtI,SACEmmB,EAAW5c,KAAKvJ,SACdoD,KAAKygB,iBAAiBsC,EAAW5c,KAAKvJ,UACtCuI,GAAkBnF,KAAKygB,iBAAiBzgB,KAAKmgB,YAGvD,KAAO,CACL,MAAM+C,EACHH,EACEA,EAAWxF,QACXwF,EAAW5c,KACX4c,EAAW5c,KAAKtK,GACjB,CAAEkb,QAASN,EAAKA,EAAG,sBAAwB,qBAAsB0M,KAAM,kBADjD,CAAEpM,QAASN,EAAKA,EAAG,6BAA+B,4BAA6B0M,KAAM,kBADxF,CAAEpM,QAASN,EAAKA,EAAG,wCAA0C,uCAAwC0M,KAAM,kBADvGJ,EAAW9Z,OAAS,CAAE8N,QAASN,EAAKA,EAAG,yBAA2B,wBAAyB0M,KAAM,kBAD5G,CAAEpM,QAASN,EAAKA,EAAG,0CAA4C,yCAA0C0M,KAAM,kBAM/H7F,EAASte,KAAK,CAAE6e,UAAWmF,EAAannB,GAAI0hB,SAAS,EAAOtU,MAAOia,GACrE,CACF,CACF,MACE,IAAK,MAAMF,KAAgBxZ,EAAO,CAChC,MAAM0Z,EAAezM,EAAKA,EAAG,2CAA6C,0CAC1E6G,EAASte,KAAK,CACZ6e,UAAWmF,EAAannB,GACxB0hB,SAAS,EACTtU,MAAO,CAAE8N,QAASmM,EAAcC,KAAM,mBAE1C,CAGF,MAAM5F,EAAUD,EAAS+F,MAAOvnB,GAAWA,EAAOyhB,SAC5C2F,EAAezM,EAAKA,EAAG,wCAA0C,uCACvE,MAAO,CAAE8G,UAASD,WAAUrU,MAAOsU,OAAUtc,EAAYnF,EAAOmN,OAAS,CAAE8N,QAASmM,EAAcC,KAAM,kBAC1G,CAEA,iBAAM/E,CAAY5U,EAAyBhD,GACzC,MAAM,GAAEiQ,GAAOzW,KAAK0W,KACpB,IAAK1W,KAAKkgB,OAAO9B,YAAa,CAC5B,MAAMrH,EAAUN,EAAKA,EAAG,kDAAoD,iDAC5E,MAAM,IAAIQ,EAAAA,oBAAoBF,EAAS,mBACzC,CAEA,MAAM8L,EAAarZ,EAAM1D,IAAKrK,IAAI,IAC7BA,EACHI,GAAImE,KAAKwgB,UAAU/kB,EAAKI,GAAIJ,EAAKuB,UACjCJ,SAAUnB,EAAKmB,SAAWoD,KAAKwgB,UAAU/kB,EAAKmB,UAAU,GAAQoD,KAAKmgB,YAGjErkB,QAAekE,KAAKkgB,OAAO9B,YAAYyE,EAAYrc,GACnD8W,EAAqC,GAE3C,GAAIxhB,EAAOwhB,UAAYxhB,EAAOwhB,SAASliB,OAAS,EAAG,CACjD,MAAM0nB,EAAY,IAAIljB,IACtB,IAAK,IAAIjC,EAAI,EAAGA,EAAI7B,EAAOwhB,SAASliB,OAAQuC,IAAK,CAC/C,MAAMolB,EAAajnB,EAAOwhB,SAAS3f,GAC7BkgB,EAAYkF,EAAWlF,YAAclgB,EAAI6L,EAAMpO,OAASoO,EAAM7L,GAAG9B,QAAKoF,GACxE4c,GACFiF,EAAUngB,IAAIkb,EAAWkF,EAE7B,CAEA,IAAK,MAAMC,KAAgBxZ,EAAO,CAChC,MAAMuZ,EAAaD,EAAUjiB,IAAImiB,EAAannB,MAC3CC,EAAOwhB,SAASliB,SAAWoO,EAAMpO,OAASU,EAAOwhB,SAAS9T,EAAMyZ,QAAQD,SAAiB/hB,GAE5F,GAAc,OAAV8hB,QAAU,IAAVA,GAAAA,EAAYxF,QAAS,CACvB,MAAMkE,EAAWzhB,KAAKwgB,UAAUwC,EAAannB,GAAImnB,EAAahmB,UAC9D,GAAIwJ,EAAQ8X,UACVte,KAAK6hB,0BAA0BmB,EAAannB,GAAI4lB,QAOhD,GALAzhB,KAAKmhB,iBACH6B,EAAannB,GACbmE,KAAK4X,UAAY,IAAM6J,GAAYuB,EAAahmB,SAAW,IAAM,KAG/DgmB,EAAahmB,SAAU,CACzB,MAAMqkB,EAAUrhB,KAAKwgB,UAAUwC,EAAannB,GAAImnB,EAAahmB,UAC7DgD,KAAK4hB,0BACHoB,EAAannB,GACbwlB,EACArhB,KAAK4X,UAAY,IAAM6J,GAAYuB,EAAahmB,SAAW,IAAM,IAErE,CAGFsgB,EAASte,KAAK,CAAE6e,UAAWmF,EAAannB,GAAI0hB,SAAS,GACvD,KAAO,CACL,MAAM2F,EAAezM,EAAKA,EAAG,2BAA6B,0BAC1D6G,EAASte,KAAK,CACZ6e,UAAWmF,EAAannB,GACxB0hB,SAAS,EACTtU,OAAiB,OAAV8Z,QAAU,IAAVA,OAAU,EAAVA,EAAY9Z,QAAS,CAAE8N,QAASmM,EAAcC,KAAM,qBAE/D,CACF,CACF,MACE,IAAK,MAAMH,KAAgBxZ,EACzB,GAAI1N,EAAOyhB,QAAS,CAClB,MAAMkE,EAAWzhB,KAAKwgB,UAAUwC,EAAannB,GAAImnB,EAAahmB,UAC9D,GAAIwJ,EAAQ8X,UACVte,KAAK6hB,0BAA0BmB,EAAannB,GAAI4lB,QAOhD,GALAzhB,KAAKmhB,iBACH6B,EAAannB,GACbmE,KAAK4X,UAAY,IAAM6J,GAAYuB,EAAahmB,SAAW,IAAM,KAG/DgmB,EAAahmB,SAAU,CACzB,MAAMqkB,EAAUrhB,KAAKwgB,UAAUwC,EAAannB,GAAImnB,EAAahmB,UAC7DgD,KAAK4hB,0BACHoB,EAAannB,GACbwlB,EACArhB,KAAK4X,UAAY,IAAM6J,GAAYuB,EAAahmB,SAAW,IAAM,IAErE,CAEFsgB,EAASte,KAAK,CAAE6e,UAAWmF,EAAannB,GAAI0hB,SAAS,GACvD,KAAO,CACL,MAAM2F,EAAezM,EAAKA,EAAG,2BAA6B,0BAC1D6G,EAASte,KAAK,CACZ6e,UAAWmF,EAAannB,GACxB0hB,SAAS,EACTtU,MAAOnN,EAAOmN,OAAS,CAAE8N,QAASmM,EAAcC,KAAM,qBAE1D,CAIJ,MAAM5F,EAAUD,EAAS+F,MAAOvnB,GAAWA,EAAOyhB,SAC5C2F,EAAezM,EAAKA,EAAG,+BAAiC,8BAC9D,MAAO,CAAE8G,UAASD,WAAUrU,MAAOsU,OAAUtc,EAAYnF,EAAOmN,OAAS,CAAE8N,QAASmM,EAAcC,KAAM,oBAC1G,CAEQvB,yBAAAA,CAA0BhlB,EAAkB0mB,EAAuBC,GACzE,MAAMC,EAAUF,EAActM,QAAQ,OAAQ,IACxCyM,EAAUF,EAAcvM,QAAQ,OAAQ,IAExCgJ,EAAkD,GAExD,IAAK,MAAO0D,EAAUC,KAAe3jB,KAAKugB,UAAUrgB,UAAW,CAC7D,MAAM0jB,EAAWD,EAAW3M,QAAQ,OAAQ,IACxC4M,IAAaJ,GAAWI,EAASC,WAAWL,EAAU,MAAMxD,EAAQhhB,KAAK,CAAEnD,GAAI6nB,EAAUrC,QAASuC,GACxG,CAEA,IAAK,MAAM,GAAE/nB,EAAE,QAAEwlB,KAAarB,EAAS,CACrC,MACM8D,EAAcL,EADHpC,EAAQ0C,UAAUP,EAAQpoB,QAE3C4E,KAAKmhB,iBAAiBtlB,EAAIioB,EAC5B,CACF,CAEQjC,yBAAAA,CAA0B9I,EAAgB0I,GAChD,MAAMuC,EAAOvC,EAASzK,QAAQ,OAAQ,IAChCiN,EAAwB,GACxBC,EAA0B,GAEhC,IAAK,MAAOR,EAAUC,KAAe3jB,KAAKugB,UAAUrgB,UAAW,CAC7D,MAAMikB,EAAaR,EAAW3M,QAAQ,OAAQ,KAC1CmN,IAAeH,GAAQG,EAAWN,WAAWG,EAAO,QACtDC,EAAYjlB,KAAK0kB,GACjBQ,EAAcllB,KAAKmlB,GAEvB,CAEA,IAAK,IAAIxmB,EAAI,EAAGA,EAAIsmB,EAAY7oB,OAAQuC,IACtCqC,KAAKugB,UAAU9d,OAAOwhB,EAAYtmB,IAClCqC,KAAKsgB,UAAU7d,OAAOyhB,EAAcvmB,GAExC,CAEA,cAAM4hB,CAAS9jB,EAAsB0J,GACnC,MAAMsc,EAAWzhB,KAAKwgB,UAAU/kB,EAAKI,GAAIJ,EAAKuB,UACxC4lB,EAAa5iB,KAAKwgB,UAAUrb,GAAgB,GAE5CrJ,QAAekE,KAAKkgB,OAAOX,SAC/B,IAAK9jB,EAAMI,GAAI4lB,EAAU7kB,SAAUoD,KAAKwgB,UAAU/kB,EAAKmB,UAAU,IACjEgmB,GAGI1d,EAAQlF,KAAKygB,iBAAiB3kB,EAAOD,IACrCe,EAAWd,EAAOc,SAAWoD,KAAKygB,iBAAiB3kB,EAAOc,UAAYuI,EAC5E,MAAO,IAAKrJ,EAAQD,GAAIqJ,EAAOtI,WACjC,CAEA,gBAAMmjB,CACJ9b,EACA+b,GAKA,MAAM,GAAEvJ,GAAOzW,KAAK0W,KACpB,IAAK1W,KAAKkgB,OAAOH,WAAY,CAC3B,MAAMhJ,EAAUN,EAAKA,EAAG,iDAAmD,gDAC3E,MAAM,IAAIQ,EAAAA,oBAAoBF,EAAS,uBACzC,CAEA,MAAMH,EAAW5W,KAAKwgB,UAAUvc,EAAKpI,IAAI,GACzC,OAASuoB,SAAgBpkB,KAAKkgB,OAAOH,WACnC,IAAK9b,EAAMpI,GAAI+a,EAAUha,SAAUoD,KAAKwgB,UAAUvc,EAAKrH,UAAU,IACjEojB,GAMF,OAHAhgB,KAAKmhB,iBAAiBld,EAAKpI,GAAIuoB,EAAMvoB,IACjCuoB,EAAMxnB,WAAUwnB,EAAQ,IAAKA,EAAOxnB,SAAUoD,KAAKygB,iBAAiB2D,EAAMxnB,YAEvE,IAAKwnB,EAAOvoB,GAAImE,KAAKygB,iBAAiB2D,EAAMvoB,IACrD,CAEA,iBAAM0gB,CAAYtY,GAChB,MAAM,GAAEwS,GAAOzW,KAAK0W,KACdE,EAAW5W,KAAKwgB,UAAUvc,EAAKpI,IAAI,GAEzC,GAAImE,KAAKkgB,OAAO3D,YACd,OAAOvc,KAAKkgB,OAAO3D,YAAY,IAAKtY,EAAMpI,GAAI+a,EAAUha,SAAUoD,KAAKwgB,UAAUvc,EAAKrH,UAAU,KAElG,MAAMgf,EAAM3X,EAAK2X,KAAQ5b,KAAKyb,cAAiBzb,KAAKyb,OAAOxX,GAC3D,IAAK2X,EAAK,CACR,MAAM7E,EAAUN,EAAKA,EAAG,yDAA2D,wDACnF,MAAM,IAAIQ,EAAAA,oBAAoBF,EAAS,gBACzC,CACA,OAAO0F,MAAMb,GAAKyI,KAAM3P,GAAMA,EAAEgI,OAClC,E,eC3lBF,MAAM4H,GAAgCC,EAAAA,EAAAA,MAAKC,EAAAA,IACrCC,GAAmBF,EAAAA,EAAAA,MAAKG,EAAAA,KAExB,SAAEC,GAAaC,EAAAA,EA6SrB,EA3SoEC,EAAGC,sBAAsB,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAC3F,MAAMC,GAAYC,EAAAA,EAAAA,OACZ,UAAEC,EAAS,QAAEC,EAAO,QAAEC,IAAYC,EAAAA,EAAAA,KAClC5P,GAAO6P,EAAAA,EAAAA,OACP,GAAE9P,GAAOC,GACT,MAAE8P,GAAU7B,KACZ,MAAE1b,EAAK,OAAEwd,IAAWC,EAAAA,EAAAA,MACpBC,GAAWC,EAAAA,EAAAA,MACXC,IAAYC,EAAAA,EAAAA,IAAYC,EAAAA,IACxBC,IAAcF,EAAAA,EAAAA,IAAYG,EAAAA,IAC1BC,IAAcJ,EAAAA,EAAAA,IAAYK,EAAAA,IAC1BC,IAAoBN,EAAAA,EAAAA,IAAYO,EAAAA,IAChCC,IAAiBR,EAAAA,EAAAA,IAAYS,EAAAA,IAC7BC,IAAeV,EAAAA,EAAAA,IAAYW,EAAAA,KAE1BC,GAASC,KAAcC,EAAAA,EAAAA,UAAoC,KAC3DC,GAAWC,KAAgBF,EAAAA,EAAAA,UAAyB,aACpDG,GAAmBC,KAAwBJ,EAAAA,EAAAA,WAAS,IACpDK,GAAkBC,KAAuBN,EAAAA,EAAAA,UAAS,IAClDO,GAAkBC,KAAuBR,EAAAA,EAAAA,UAAS,KAClDpmB,GAAO6mB,KAAYT,EAAAA,EAAAA,UAAiB,IAAM,IAE3CU,GAAeA,KACnB3B,GAAS4B,EAAAA,EAAAA,OACTrd,WAAW,IAAMyc,GAAW,IAAK,MAG7Ba,KAAqB3B,KAA2B,QAAd9B,EAAAiC,GAAYnrB,UAAE,IAAAkpB,OAAA,EAAdA,EAAgBnnB,eAA6B,OAAd0pB,SAAc,IAAdA,IAAuB,QAATtC,EAAdsC,GAAgBmB,eAAO,IAAAzD,OAAT,EAAdA,EAAyB0D,MAAMC,KAChGC,IAAiBC,EAAAA,EAAAA,SACrB,KAAM,CAAGC,IAAKtB,GAAcuB,WAAY3B,KACxC,CAACI,GAAcJ,MAGjB4B,EAAAA,EAAAA,WAAU,KACJ9B,GAAYnoB,SAAS,4BACvB4oB,GAAW,cACPiB,GAAeG,YACjBX,GAAoBQ,GAAeG,aAE5B7B,GAAYnoB,SAAS,wBAC9B4oB,GAAW,OACPiB,GAAeE,KACjBV,GAAoBQ,GAAeE,MAGnC5B,KAAgB+B,EAAAA,GAAOC,oBAAsBhC,KAAgB+B,EAAAA,GAAOE,wBACtErB,GAAa,UACJZ,KAAgB+B,EAAAA,GAAOG,uBAAyBlC,KAAgB+B,EAAAA,GAAOI,2BAChFb,IAEIR,IAAqB,GACrBE,GAAoB,IAEtBJ,GAAa,MAEfZ,KAAgB+B,EAAAA,GAAOK,2BACvBpC,KAAgB+B,EAAAA,GAAOM,+BAEvBzB,GAAa,YAEbZ,KAAgB+B,EAAAA,GAAOO,0BACvBtC,KAAgB+B,EAAAA,GAAOQ,8BAEvBjB,IAEIR,IAAqB,GACrBE,GAAoB,IAEtBJ,GAAa,gBACNZ,KAAgB+B,EAAAA,GAAOS,wBAA0BxC,KAAgB+B,EAAAA,GAAOU,4BACjFnB,IAEIR,IAAqB,GACrBE,GAAoB,IAEtBJ,GAAa,OACNZ,KAAgB+B,EAAAA,GAAOW,yBAA2B1C,KAAgB+B,EAAAA,GAAOY,8BAClFrB,IAEIR,IAAqB,GACrBE,GAAoB,IAEtBJ,GAAa,UACfnB,GAASmD,EAAAA,EAAAA,IAAgBb,EAAAA,GAAOc,sBAEhCjC,GAAa,aAEd,CAACZ,GAAaP,EAAU6B,GAAkBI,KAE7C,MAAMoB,IAAYnB,EAAAA,EAAAA,SAAQ,IACnB/D,EAIEA,EAAgBmF,SACnB,IAAIhK,EACF6E,EACAA,EAAgBrM,OAChB,QACAqM,EAAgBlN,WAChB,EACAlB,GAEF,MAZFzN,EAAMwN,EAAG,yCACF,MAYR,CAACqO,EAAiB7b,EAAOyN,IAEtBwT,IAAerB,EAAAA,EAAAA,SAAQ,IACpB,IAAIzS,EACA,OAAT4T,SAAS,IAATA,GAAAA,GAAalF,EACbmB,EAAUkE,YACV,IACKrF,EACHlN,UAAWkN,EAAgBmF,SAAW,QAAUnF,EAAgBlN,UAChEa,OAAQqM,EAAgBmF,SAAW,GAAKnF,EAAgBrM,QAE1D/B,GAED,CAACoO,EAAiBkF,GAAW/D,EAAUkE,YAAazT,IAEjD0T,IAAeC,EAAAA,EAAAA,aAClBpgB,IACC,MAAMqgB,GAAQC,EAAAA,EAAAA,IAAetgB,EAAGigB,GAAcF,IAC9C,OAAOvD,EAAO6D,GAAc,IAE9B,CAACJ,GAAcF,KAGXQ,GAAUC,EAAAA,cAACC,EAAAA,EAAe,CAACC,MAAO,CAAEC,SAAU,GAAIC,QAAS,IAAMC,MAAI,IAErEC,IAAoBV,EAAAA,EAAAA,aACvBW,IACMpwB,EAAOE,QAAQkwB,EAAQxpB,KAC1B6mB,GAAS2C,IAGb,CAACxpB,MAGIypB,KAA6BC,EAAAA,EAAAA,MAE9BC,IAAqBd,EAAAA,EAAAA,aAAYze,UACrC,GAAIse,GAAc,CAChB,MAAMjmB,EAAOzC,GAAM,GACnB,GAAIyC,EAAM,CACR,MAAM2X,EAAM3X,EAAK2X,KAAO3X,EAAK4X,cAAgB5X,EAAKmnB,UAClC,QAAZ1D,GACFf,GAAS0E,EAAAA,EAAAA,IAAgBzP,IACJ,eAAZ8L,IACTf,GAAS2E,EAAAA,EAAAA,IAAqB1P,GAElC,CACF,CAEA0M,MACC,CAAC4B,GAAcvD,EAAU4B,EAAAA,GAAY/mB,GAAOkmB,KAEzC6D,IAAalB,EAAAA,EAAAA,aACjBze,UAEE,GAAIse,IACEjmB,EAAM,CACR,MAAM2X,EAAM3X,EAAK2X,KAAO3X,EAAK4X,cAAgB5X,EAAKmnB,UAElC,QAAZ1D,GACFf,GAAS0E,EAAAA,EAAAA,IAAgBzP,IACJ,eAAZ8L,IACTf,GAAS2E,EAAAA,EAAAA,IAAqB1P,GAElC,CAGF0M,MAEF,CAAC4B,GAAcvD,EAAU4B,EAAAA,GAAYb,KAEjC8D,IAAgBnB,EAAAA,EAAAA,aAAYze,UAChC0c,MACC,CAAC3B,EAAU4B,EAAAA,MAEPkD,IAAWtlB,KAAMulB,GAAW,MAAQC,EAAAA,EAAAA,MACrCC,IAAoC,OAAT3F,QAAS,IAATA,OAAS,EAATA,EAAmB2F,2BAA2BC,EAAAA,EAAAA,IAAgBC,EAAAA,GAAOC,aAEhGC,IAAW3B,EAAAA,EAAAA,aACfze,eAAgBtN,GACd,UACQmtB,GAAQntB,GAAQ2tB,QACxB,CAAE,MAAOhiB,GAET,CACF,EACA,CAACwhB,KAMGS,IAAcrD,EAAAA,EAAAA,SAAQ,KAC1B,MAAMsD,GAA4B,OAATlG,QAAS,IAATA,OAAS,EAATA,EAAmBmG,QAAS,CAAC,EACtD,GAAKD,GAA2D,IAAxCvtB,OAAOC,KAAKstB,GAAiB/wB,OAGrD,OAAOixB,EAAAA,EAAAA,IAAqBF,IAC3B,CAAW,OAATlG,QAAS,IAATA,OAAS,EAATA,EAAmBmG,QAExB,OAAS1E,IAAWwC,GAChBO,EAAAA,cAAAA,EAAAA,SAAA,MACIjC,IACAiC,EAAAA,cAAC6B,EAAAA,EAAK,CACJC,UAAU,eACVC,UAAU,EACVC,OAAQ,KACRC,OAAQ7E,IAAaX,GAAYnoB,SAAS,iBAC1C4tB,MAAM,QAENC,KAAMzB,GACN0B,SAAUvE,IAEVmC,EAAAA,cAACqC,EAAAA,EAAI,CAACC,UAAW7C,GAAc8C,UAAWxC,IACvCN,KACgB,WAAdrC,GACC4C,EAAAA,cAAChG,EAAgB,CACfwI,OAAQ1B,GACR2B,QAAS1B,GACT2B,cAAejD,GACftF,MAAOoC,GAAYpC,MACnB3gB,KAAMkkB,GACNiC,aAAcA,GACdgD,WAAWC,EAAAA,EAAAA,IAAgB,GAAI,+BAEjC5C,EAAAA,cAACnG,EAA6B,CAC5B6I,cAAejD,GACfa,kBAAmBA,GACnBQ,WAAYA,GACZnB,aAAcA,GACd8B,YAAaA,GACboB,OAAQ,CACNF,WAAWC,EAAAA,EAAAA,IAAgB,GAAI,6BAC/BE,wBAA0E,KAA7B,QAArBtI,EAAAgB,EAAUkE,mBAAW,IAAAlF,OAAA,EAArBA,EAAuBsI,wBAC/CC,kBAAmB3F,GACnB4F,oBAAqBC,mCACrBC,aAAcD,8CACdE,kBAAmBF,mCACnBG,YAAa1F,GACbhC,YACA2H,UAAW1H,GAAWC,EACtB0H,UAAoB,OAAT9H,QAAS,IAATA,OAAS,EAATA,EAAW8H,UACtBnC,2BACAI,YACAN,YACAsC,oBAA8B,OAAT/H,QAAS,IAATA,OAAS,EAATA,EAAmB+H,qBAAsB/C,GAC9DgD,OAAQjH,GAAYiH,OAYpBrJ,MAAOoC,GAAYpC,MACnBsJ,YAAa1H,EACb2H,kBAAwC,QAAvBjJ,EAAEe,EAAUkE,mBAAW,IAAAjF,OAAA,EAArBA,EAAuBxM,YAC1C0V,kBAAwC,QAAvBjJ,EAAEc,EAAUkE,mBAAW,IAAAhF,OAAA,EAArBA,EAAuBiJ,kBAC1CC,SAAU,CACRC,kBAA8D,KAAvB,QAArBlJ,EAAAa,EAAUkE,mBAAW,IAAA/E,OAAA,EAArBA,EAAuBkJ,kBACzCC,oBAAkE,KAAzB,QAArBlJ,EAAAY,EAAUkE,mBAAW,IAAA9E,OAAA,EAArBA,EAAuBkJ,oBAC3CC,kBAA8D,KAAvB,QAArBlJ,EAAAW,EAAUkE,mBAAW,IAAA7E,OAAA,EAArBA,EAAuBkJ,kBACzCC,gBAA0D,KAArB,QAArBlJ,EAAAU,EAAUkE,mBAAW,IAAA5E,OAAA,EAArBA,EAAuBmJ,gBACvCC,kBAA8D,KAAvB,QAArBnJ,EAAAS,EAAUkE,mBAAW,IAAA3E,OAAA,EAArBA,EAAuBmJ,kBACzCC,cAAsD,KAAnB,QAArBnJ,EAAAQ,EAAUkE,mBAAW,IAAA1E,OAAA,EAArBA,EAAuBmJ,cACrCC,YAAkD,KAAjB,QAArBnJ,EAAAO,EAAUkE,mBAAW,IAAAzE,OAAA,EAArBA,EAAuBmJ,YACnCC,gBAA0D,KAArB,QAArBnJ,EAAAM,EAAUkE,mBAAW,IAAAxE,OAAA,EAArBA,EAAuBoJ,gBACvCC,kBAA8D,KAAvB,QAArBpJ,EAAAK,EAAUkE,mBAAW,IAAAvE,OAAA,EAArBA,EAAuBoJ,mBAE3CC,mBAA+D,KAAvB,QAArBpJ,EAAAI,EAAUkE,mBAAW,IAAAtE,OAAA,EAArBA,EAAuBqJ,kBAC1CC,aAAoD,KAAlB,QAArBrJ,EAAAG,EAAUkE,mBAAW,IAAArE,OAAA,EAArBA,EAAuBqJ,aACpCC,kBAAwC,QAAvBrJ,EAAEE,EAAUkE,mBAAW,IAAApE,OAAA,EAArBA,EAAuBqJ,kBAE1CC,yBAA+C,QAAvBrJ,EAAEC,EAAUkE,mBAAW,IAAAnE,OAAA,EAArBA,EAAuBqJ,+BAQ/D5E,EAAAA,cAAC6E,EAAAA,EAAyB,CACxB5C,KAAM3E,GACN8E,SAAUA,IAAM7E,IAAqB,GACrCuH,aAActH,GACduH,cAAUvuB,KAGd,K","sources":["helpers/utils/arrays.ts","modules/components/FileManager/TreeCache.ts","modules/components/FileManager/DataSource.ts","modules/components/FileManager/PathAwareDataSourceProxy.ts","modules/components/FileManager/FileManager.tsx"],"sourcesContent":["export namespace arrays {\n export function isEqual<T>(\n arr1: T[],\n arr2: T[],\n compareFn: (item1: T, item2: T) => boolean = (item1: T, item2: T) => item1 === item2,\n ): boolean {\n if (arr1 === arr2) return true;\n const length = arr1.length;\n if (length !== arr2.length) return false;\n for (let index = 0; index < length; index++) {\n if (!compareFn(arr1[index], arr2[index])) return false;\n }\n return true;\n }\n\n export function unique<T>(arr: T[]);\n export function unique<T, U>(arr: T[], idFn?: (item: T) => U);\n export function unique<T>(arr: T[], idFn?: (item: T) => any) {\n if (!idFn) {\n idFn = (item) => item;\n }\n const ids = new Set<any>();\n return arr.filter((item) => {\n const id = idFn(item);\n const result = !ids.has(id);\n ids.add(id);\n return result;\n });\n }\n}\n","import { FileSystemItem } from 'types';\n\nexport interface QueryResult<T> {\n items: T[];\n total?: number;\n totalPages?: number;\n page?: number;\n limit?: number;\n [key: string]: unknown;\n}\n\nexport interface ChildrenQueryParams {\n page?: number;\n pageSize?: number | string;\n sortBy?: string;\n sortOrder?: string;\n search?: string;\n itemType?: 'file' | 'folder' | 'all';\n [key: string]: unknown;\n}\n\nconst ROOT_KEY = '';\n\nfunction normalizeParentKey(parentId: string | null | undefined): string {\n if (parentId == null || parentId === '') return ROOT_KEY;\n return parentId;\n}\n\nfunction normalizePageSize(pageSize: unknown): number {\n if (pageSize == null) return Infinity;\n const n = Number(pageSize);\n return Number.isFinite(n) && n >= 0 ? n : Infinity;\n}\n\nfunction getFolderId(entity: FileSystemItem | undefined | null): string | null {\n if (!entity) return null;\n const v = entity.folderId;\n if (v == null) return null;\n return String(v);\n}\n\nfunction isFolderEntity(x: FileSystemItem | undefined | null): x is FileSystemItem & { isFolder: true } {\n return !!x && x.isFolder;\n}\n\nfunction generateId(): string {\n if (typeof globalThis?.crypto?.randomUUID === 'function') {\n return globalThis.crypto.randomUUID();\n }\n try {\n const cryptoObj = globalThis.crypto || (globalThis as any).msCrypto;\n if (cryptoObj && typeof cryptoObj.getRandomValues === 'function') {\n const arr = new Uint8Array(16);\n cryptoObj.getRandomValues(arr);\n let s = '';\n for (let i = 0; i < arr.length; i++) {\n s += arr[i].toString(16).padStart(2, '0');\n }\n return `id_${s}`;\n }\n } catch {\n // fallthrough\n }\n return `id_fallback_${Date.now().toString(36)}_${Math.floor(Math.random() * Number.MAX_SAFE_INTEGER)\n .toString(36)\n .slice(0, 8)}`;\n}\n\n// Лёгкий хеш (FNV-1a like) для paramsKey\nfunction shortHash(s: string): string {\n let h = 0x811c9dc5 >>> 0;\n for (let i = 0; i < s.length; i++) {\n h ^= s.charCodeAt(i);\n h = (h + ((h << 1) + (h << 4) + (h << 7) + (h << 8) + (h << 24))) >>> 0;\n }\n return h.toString(36);\n}\n\n// Компактный ключ для параметров запроса, детерминированный\nfunction paramsKey(params: unknown): string {\n if (!params || typeof params !== 'object') return String(params ?? '');\n const p = params as Record<string, any>;\n const core: string[] = [];\n const rest: Record<string, any> = {};\n\n const take = ['page', 'pageSize', 'sortBy', 'sortOrder', 'search', 'itemType', 'limit'];\n for (const k of Object.keys(p).sort()) {\n const v = p[k];\n if (take.includes(k)) {\n core.push(`${k}=${String(v ?? '')}`);\n } else {\n rest[k] = v;\n }\n }\n\n const restStr = Object.keys(rest).length ? JSON.stringify(rest) : '';\n const coreStr = core.join('|');\n const h = restStr ? shortHash(restStr) : '';\n return `${coreStr}${h ? `|${h}` : ''}`;\n}\n\nexport class EntityCacheManager {\n private readonly entities = new Map<string, { value: FileSystemItem; updatedAt: number }>();\n private readonly childrenByParent = new Map<string, { files: Set<string>; folders: Set<string> }>();\n\n // Защита от переполнения\n private readonly maxCacheSize = 10000;\n\n private now(): number {\n return Date.now();\n }\n\n private checkCacheSize(): void {\n if (this.entities.size > this.maxCacheSize) {\n // Простая стратегия: удаляем самые старые записи\n const entries = Array.from(this.entities.entries()).sort((a, b) => a[1].updatedAt - b[1].updatedAt);\n\n const toRemove = Math.floor(this.maxCacheSize * 0.1); // Удаляем 10% самых старых\n for (let i = 0; i < toRemove && i < entries.length; i++) {\n const [id, record] = entries[i];\n this.deleteEntityById(id);\n }\n }\n }\n\n getEntity(id: string): FileSystemItem | undefined {\n return this.entities.get(id)?.value;\n }\n\n getRecord(id: string): { value: FileSystemItem; updatedAt: number } | undefined {\n return this.entities.get(id);\n }\n\n getFileSystemItem(id: string): FileSystemItem | undefined {\n const v = this.getEntity(id);\n return v && !isFolderEntity(v) ? v : undefined;\n }\n\n getFolder(id: string): FileSystemItem | undefined {\n const v = this.getEntity(id);\n return v && isFolderEntity(v) ? v : undefined;\n }\n\n getChildrenIds(\n parentId: string | null,\n opts: { onlyFileSystemItems?: boolean; onlyFolders?: boolean } = {},\n ): string[] {\n const key = normalizeParentKey(parentId);\n const bucket = this.childrenByParent.get(key);\n if (!bucket) return [];\n if (opts.onlyFileSystemItems) return Array.from(bucket.files);\n if (opts.onlyFolders) return Array.from(bucket.folders);\n return [...Array.from(bucket.folders), ...Array.from(bucket.files)];\n }\n\n upsertEntity(entity: FileSystemItem): void {\n const prevRec = this.entities.get(entity.id) ?? null;\n const prev = prevRec ? prevRec.value : null;\n\n const prevParent = prev ? getFolderId(prev) : null;\n const nextParent = getFolderId(entity);\n const prevIsFolder = prev ? isFolderEntity(prev) : false;\n const nextIsFolder = isFolderEntity(entity);\n\n let preservedChildrenCount: number | undefined;\n if (prev && isFolderEntity(prev) && nextIsFolder) {\n const prevCount = prev.childrenCount;\n const nextCount = entity.childrenCount;\n if (prevCount !== undefined && nextCount === undefined) {\n preservedChildrenCount = prevCount;\n }\n }\n\n if (prev && (prevParent !== nextParent || prevIsFolder !== nextIsFolder)) {\n const oldKey = normalizeParentKey(prevParent);\n const oldBucket = this.childrenByParent.get(oldKey);\n if (oldBucket) {\n if (prevIsFolder) oldBucket.folders.delete(entity.id);\n else oldBucket.files.delete(entity.id);\n if (oldBucket.files.size === 0 && oldBucket.folders.size === 0) {\n this.childrenByParent.delete(oldKey);\n }\n }\n }\n\n let entityToSave = entity;\n if (preservedChildrenCount !== undefined) {\n entityToSave = { ...entity, childrenCount: preservedChildrenCount } as FileSystemItem;\n }\n\n this.entities.set(entity.id, { value: { ...entityToSave }, updatedAt: this.now() });\n this.checkCacheSize();\n\n const newKey = normalizeParentKey(nextParent);\n let newBucket = this.childrenByParent.get(newKey);\n if (!newBucket) {\n newBucket = { files: new Set<string>(), folders: new Set<string>() };\n this.childrenByParent.set(newKey, newBucket);\n }\n if (nextIsFolder) newBucket.folders.add(entity.id);\n else newBucket.files.add(entity.id);\n }\n\n updateServerChildrenCount(folderId: string | null, serverCount: number | undefined): void {\n if (folderId == null || serverCount == null || Number.isNaN(serverCount)) return;\n\n const rec = this.entities.get(folderId);\n if (!rec || !isFolderEntity(rec.value)) return;\n\n const updatedFolder = { ...rec.value, childrenCount: serverCount } as FileSystemItem;\n this.entities.set(folderId, { value: updatedFolder, updatedAt: this.now() });\n }\n\n deleteEntityById(id: string): { entity: FileSystemItem | null; parentId: string | null } {\n const rec = this.entities.get(id) ?? null;\n if (!rec) return { entity: null, parentId: null };\n const entity = rec.value;\n const parent = getFolderId(entity);\n\n const key = normalizeParentKey(parent);\n const bucket = this.childrenByParent.get(key);\n if (bucket) {\n if (isFolderEntity(entity)) bucket.folders.delete(id);\n else bucket.files.delete(id);\n if (bucket.files.size === 0 && bucket.folders.size === 0) {\n this.childrenByParent.delete(key);\n }\n }\n\n this.entities.delete(id);\n return { entity: { ...entity }, parentId: parent };\n }\n\n deleteFolderRecursive(folderId: string): {\n deletedFolderRecords: FileSystemItem[];\n deletedFileSystemItemRecords: FileSystemItem[];\n } {\n const rootRec = this.entities.get(folderId);\n if (!rootRec || !isFolderEntity(rootRec.value)) {\n return { deletedFolderRecords: [], deletedFileSystemItemRecords: [] };\n }\n\n const folderQueue: { id: string; parentId: string | null }[] = [\n { id: folderId, parentId: getFolderId(rootRec.value) },\n ];\n const allFolderInfos: { id: string; parentId: string | null }[] = [];\n const allFileSystemItemIds: string[] = [];\n\n while (folderQueue.length) {\n const cur = folderQueue.shift()!;\n allFolderInfos.push(cur);\n const bucket = this.childrenByParent.get(normalizeParentKey(cur.id));\n if (!bucket) continue;\n\n for (const childFolderId of Array.from(bucket.folders)) {\n const childRec = this.entities.get(childFolderId);\n if (childRec) {\n folderQueue.push({ id: childFolderId, parentId: getFolderId(childRec.value) });\n }\n }\n for (const fid of Array.from(bucket.files)) {\n allFileSystemItemIds.push(fid);\n }\n }\n\n const deletedFileSystemItemRecords: FileSystemItem[] = [];\n for (const fid of allFileSystemItemIds) {\n const rec = this.entities.get(fid);\n if (!rec) continue;\n const file = rec.value;\n const pKey = normalizeParentKey(getFolderId(file));\n const pBucket = this.childrenByParent.get(pKey);\n if (pBucket) {\n pBucket.files.delete(fid);\n if (pBucket.files.size === 0 && pBucket.folders.size === 0) this.childrenByParent.delete(pKey);\n }\n this.entities.delete(fid);\n deletedFileSystemItemRecords.push({ ...file });\n }\n\n const deletedFolderRecords: FileSystemItem[] = [];\n for (let i = allFolderInfos.length - 1; i >= 0; i--) {\n const { id, parentId } = allFolderInfos[i];\n const rec = this.entities.get(id);\n if (!rec) continue;\n const folder = rec.value;\n\n const key = normalizeParentKey(folder.id);\n this.childrenByParent.delete(key);\n\n const pKey = normalizeParentKey(parentId);\n const pBucket = this.childrenByParent.get(pKey);\n if (pBucket) {\n pBucket.folders.delete(id);\n if (pBucket.files.size === 0 && pBucket.folders.size === 0) this.childrenByParent.delete(pKey);\n }\n\n this.entities.delete(id);\n deletedFolderRecords.push({ ...folder });\n }\n\n return { deletedFolderRecords, deletedFileSystemItemRecords };\n }\n\n moveEntityById(entityId: string, targetParentId: string | null): FileSystemItem | null {\n const rec = this.entities.get(entityId) ?? null;\n if (!rec) return null;\n const ent = rec.value;\n\n const prevParent = getFolderId(ent);\n const prevKey = normalizeParentKey(prevParent);\n const prevBucket = this.childrenByParent.get(prevKey);\n if (prevBucket) {\n if (isFolderEntity(ent)) prevBucket.folders.delete(entityId);\n else prevBucket.files.delete(entityId);\n if (prevBucket.files.size === 0 && prevBucket.folders.size === 0) this.childrenByParent.delete(prevKey);\n }\n\n const updated: FileSystemItem = { ...ent, folderId: targetParentId } as FileSystemItem;\n\n if (isFolderEntity(ent) && isFolderEntity(updated)) {\n const existingCount = ent.childrenCount;\n if (existingCount !== undefined) {\n updated.childrenCount = existingCount;\n }\n }\n\n this.entities.set(entityId, { value: updated, updatedAt: this.now() });\n\n const nextKey = normalizeParentKey(targetParentId);\n let nextBucket = this.childrenByParent.get(nextKey);\n if (!nextBucket) {\n nextBucket = { files: new Set<string>(), folders: new Set<string>() };\n this.childrenByParent.set(nextKey, nextBucket);\n }\n if (isFolderEntity(updated)) nextBucket.folders.add(entityId);\n else nextBucket.files.add(entityId);\n\n return { ...updated };\n }\n\n copyFileSystemItem(fileId: string, newId: string, targetFolderId: string | null): FileSystemItem | null {\n const rec = this.entities.get(fileId) ?? null;\n if (!rec || isFolderEntity(rec.value)) return null;\n const file = rec.value;\n const copy: FileSystemItem = { ...file, id: newId, folderId: targetFolderId } as FileSystemItem;\n this.upsertEntity(copy);\n return { ...copy };\n }\n\n copyFolderShallow(folderId: string, newId: string, targetParentId: string | null): FileSystemItem | null {\n const rec = this.entities.get(folderId) ?? null;\n if (!rec || !isFolderEntity(rec.value)) return null;\n const folder = rec.value;\n const copy: FileSystemItem = { ...folder, id: newId, folderId: targetParentId } as FileSystemItem;\n this.upsertEntity(copy);\n return { ...copy };\n }\n\n isEntityStale(id: string, ttlMs: number): boolean {\n const rec = this.entities.get(id) ?? null;\n if (!rec) return true;\n if (ttlMs === Infinity) return false;\n return this.now() - rec.updatedAt > ttlMs;\n }\n\n touch(id: string, at?: number): void {\n const rec = this.entities.get(id);\n if (!rec) return;\n rec.updatedAt = at ?? this.now();\n }\n\n getEntitiesByIds<T extends FileSystemItem>(ids: string[]): (T | null)[] {\n return ids.map((id) => this.entities.get(id)?.value ?? null) as (T | null)[];\n }\n\n toJSON(): any {\n return {\n entities: Array.from(this.entities.entries()),\n childrenByParent: Array.from(this.childrenByParent.entries()).map(([k, v]) => [\n k,\n { files: Array.from(v.files), folders: Array.from(v.folders) },\n ]),\n };\n }\n\n static fromJSON(data: any): EntityCacheManager {\n const mgr = new EntityCacheManager();\n for (const [id, rec] of data.entities ?? []) {\n mgr.entities.set(id, { value: rec.value, updatedAt: rec.updatedAt });\n }\n for (const [k, bucket] of data.childrenByParent ?? []) {\n mgr.childrenByParent.set(k, {\n files: new Set(bucket.files as string[]),\n folders: new Set(bucket.folders as string[]),\n });\n }\n return mgr;\n }\n}\n\nexport interface ViewStrategyOptions {\n allowSortedInsert?: boolean;\n allowSearchInsert?: boolean;\n invalidateOnPaginationFull?: boolean;\n preloadPagesBefore?: number;\n preloadPagesAfter?: number;\n comparator?: (a: FileSystemItem, b: FileSystemItem, params?: ChildrenQueryParams) => number;\n filterMatch?: (entity: FileSystemItem, params?: ChildrenQueryParams) => boolean;\n}\n\ninterface ViewCache {\n promise?: Promise<QueryResult<FileSystemItem>> | null;\n value?: string[] | null;\n meta?: Omit<QueryResult<FileSystemItem>, 'items'> | Record<string, unknown> | null;\n error?: unknown | null;\n updatedAt: number;\n loadId?: string | null;\n abortController?: AbortController;\n}\n\ninterface ViewRecord<TParams> {\n params: TParams;\n view: ViewCache;\n}\n\nexport class ViewCacheManager {\n private readonly views = new Map<string, Map<string, ViewRecord<ChildrenQueryParams>>>();\n private readonly strategy: ViewStrategyOptions;\n private readonly ttl: number;\n private readonly errorTtl: number;\n private readonly entityTtl: number;\n private serverChildrenCountHandler?: (\n parentId: string | null,\n total: number | undefined,\n entitiesManager: EntityCacheManager,\n ) => void;\n private childrenCountInvalidator?: (parentId: string | null | undefined) => void;\n\n // Защита от переполнения\n private readonly maxViewsPerParent = 50;\n\n constructor(options: ViewStrategyOptions = {}, ttl = 300_000, errorTtl = 30_000, entityTtl?: number) {\n this.strategy = {\n allowSortedInsert: options.allowSortedInsert ?? true,\n allowSearchInsert: options.allowSearchInsert ?? true,\n invalidateOnPaginationFull: options.invalidateOnPaginationFull ?? true,\n preloadPagesBefore: options.preloadPagesBefore ?? 0,\n preloadPagesAfter: options.preloadPagesAfter ?? 1,\n comparator: options.comparator,\n filterMatch: options.filterMatch,\n };\n this.ttl = ttl;\n this.errorTtl = errorTtl;\n this.entityTtl = entityTtl ?? ttl;\n }\n\n setServerChildrenCountHandler(\n handler: (parentId: string | null, total: number | undefined, entitiesManager: EntityCacheManager) => void,\n ): void {\n this.serverChildrenCountHandler = handler;\n }\n\n setChildrenCountInvalidator(handler: (parentId: string | null | undefined) => void): void {\n this.childrenCountInvalidator = handler;\n }\n\n private now(): number {\n return Date.now();\n }\n\n private parentKey(parentId: string | null | undefined): string {\n return normalizeParentKey(parentId ?? null);\n }\n\n private isExpired(updatedAt: number | undefined): boolean {\n if (updatedAt == null) return true;\n if (this.ttl === Infinity) return false;\n return this.now() - updatedAt > this.ttl;\n }\n\n private isErrorExpired(updatedAt: number | undefined): boolean {\n if (updatedAt == null) return true;\n if (this.errorTtl === Infinity) return false;\n return this.now() - updatedAt > this.errorTtl;\n }\n\n private areEntitiesStale(ids: string[] | undefined, entitiesManager: EntityCacheManager): boolean {\n if (!ids) return true;\n\n // Проверяем, что все entity существуют и не устарели\n return ids.some((id) => !entitiesManager.getEntity(id) || entitiesManager.isEntityStale(id, this.entityTtl));\n }\n\n private isEntityTypeCompatible(entity: FileSystemItem, itemType: string | undefined): boolean {\n if (!itemType || itemType === 'all') return true;\n if (itemType === 'file' && !isFolderEntity(entity)) return true;\n if (itemType === 'folder' && isFolderEntity(entity)) return true;\n return false;\n }\n\n private cleanupOldViews(bucket: Map<string, ViewRecord<ChildrenQueryParams>>): void {\n if (bucket.size <= this.maxViewsPerParent) return;\n\n const entries = Array.from(bucket.entries()).sort(\n (a, b) => (b[1].view.updatedAt || 0) - (a[1].view.updatedAt || 0),\n ); // Сначала самые новые\n\n // Удаляем самые старые, оставляя максимум maxViewsPerParent\n while (bucket.size > this.maxViewsPerParent && entries.length > 0) {\n const [key] = entries.pop()!;\n bucket.delete(key);\n }\n }\n\n async getOrCreateChildren(\n parentId: string | null,\n params: ChildrenQueryParams,\n loader: (parentId: string | null, params: ChildrenQueryParams) => Promise<QueryResult<FileSystemItem>>,\n entitiesManager: EntityCacheManager,\n ): Promise<QueryResult<FileSystemItem>> {\n const pKey = this.parentKey(parentId);\n const qKey = paramsKey(params ?? {});\n\n let bucket = this.views.get(pKey);\n if (!bucket) {\n bucket = new Map();\n this.views.set(pKey, bucket);\n }\n\n let rec = bucket.get(qKey);\n if (!rec) {\n const view: ViewCache = {\n promise: null,\n value: undefined,\n meta: undefined,\n error: undefined,\n updatedAt: 0,\n loadId: null,\n };\n rec = { params, view };\n bucket.set(qKey, rec);\n this.cleanupOldViews(bucket);\n }\n\n if (rec.view.error && !this.isErrorExpired(rec.view.updatedAt)) throw rec.view.error;\n\n if (\n rec.view.value &&\n !this.isExpired(rec.view.updatedAt) &&\n !this.areEntitiesStale(rec.view.value, entitiesManager) &&\n !rec.view.meta?.stale\n ) {\n const allItems = rec.view.value.map((id) => entitiesManager.getEntity(id)).filter(Boolean) as FileSystemItem[];\n const itemType = rec.params?.itemType || 'all';\n const items = allItems.filter((item) => this.isEntityTypeCompatible(item, itemType));\n return { items, ...(rec.view.meta ?? {}) } as QueryResult<FileSystemItem>;\n }\n\n if (rec.view.promise) return rec.view.promise;\n\n const myLoadId = generateId();\n rec.view.loadId = myLoadId;\n\n const promise = (async (): Promise<QueryResult<FileSystemItem>> => {\n try {\n const result = await loader(parentId, params);\n\n // проверяем, актуален ли результат (loadId совпадает)\n const currentRec = this.views.get(pKey)?.get(paramsKey(params));\n if (!currentRec || currentRec.view.loadId !== myLoadId) {\n // устарело — не применять\n const err: any = new Error('StaleLoad');\n err.name = 'StaleLoad';\n throw err;\n }\n\n for (const e of result.items) entitiesManager.upsertEntity(e);\n\n rec!.view.value = result.items.map((f) => f.id);\n const { items, ...meta } = result;\n const copyMeta: any = { ...meta };\n rec!.view.meta = copyMeta;\n rec!.view.meta.stale = false;\n rec!.view.error = null;\n rec!.view.updatedAt = this.now();\n\n if (typeof copyMeta.total === 'number') {\n if (this.serverChildrenCountHandler) {\n this.serverChildrenCountHandler(parentId ?? null, copyMeta.total, entitiesManager);\n } else {\n entitiesManager.updateServerChildrenCount(parentId, copyMeta.total);\n }\n }\n\n const preloadAfter = this.strategy.preloadPagesAfter ?? 0;\n const preloadBefore = this.strategy.preloadPagesBefore ?? 0;\n const pageSize = normalizePageSize(params?.pageSize);\n const isPaginated = Number.isFinite(pageSize);\n\n if ((preloadAfter > 0 || preloadBefore > 0) && isPaginated) {\n const savedParentId = parentId;\n const savedParams = { ...params }; // Фиксируем параметры\n const savedTotalPages = typeof copyMeta.totalPages === 'number' ? copyMeta.totalPages : 1;\n const savedCurrentPage = params?.page ?? 1;\n const savedPageSize = pageSize;\n const savedLoader = loader;\n const savedLoadId = myLoadId;\n\n setTimeout(() => {\n this.preloadPagesAsync(\n savedParentId,\n savedParams,\n savedCurrentPage,\n savedTotalPages,\n savedPageSize,\n preloadAfter,\n preloadBefore,\n entitiesManager,\n copyMeta,\n savedLoader,\n savedLoadId,\n );\n }, 0);\n }\n\n return result;\n } catch (err) {\n if ((err as any)?.name === 'StaleLoad') {\n // не считать ошибкой — просто игнорируем применение\n rec!.view.error = null;\n rec!.view.value = undefined;\n rec!.view.updatedAt = this.now();\n throw err;\n }\n rec!.view.error = err;\n rec!.view.value = undefined;\n rec!.view.updatedAt = this.now();\n throw err;\n } finally {\n rec!.view.promise = null;\n }\n })();\n\n rec.view.promise = promise;\n return promise;\n }\n\n /**\n * Асинхронно предзагружает соседние страницы\n * Проверяет loadId основного view перед применением результатов\n */\n private async preloadPagesAsync(\n parentId: string | null,\n fixedParams: ChildrenQueryParams, // Используем фиксированные параметры\n currentPage: number,\n initialTotalPages: number,\n pageSize: number,\n preloadAfter: number,\n preloadBefore: number,\n entitiesManager: EntityCacheManager,\n initialMeta: any,\n loader: (parentId: string | null, params: ChildrenQueryParams) => Promise<QueryResult<FileSystemItem>>,\n initialLoadId?: string | null,\n ): Promise<void> {\n try {\n const pKey = this.parentKey(parentId);\n const bucket = this.views.get(pKey);\n if (!bucket) return;\n\n const mainRec = bucket.get(paramsKey(fixedParams));\n if (!mainRec) return;\n if (initialLoadId != null && mainRec.view.loadId !== initialLoadId) return;\n\n const currentRec = bucket.get(paramsKey(fixedParams));\n if (!currentRec?.view.meta) return;\n\n const currentTotalPages =\n typeof currentRec.view.meta.totalPages === 'number' ? currentRec.view.meta.totalPages : 1;\n\n if (currentTotalPages !== initialTotalPages) return;\n\n const doPreload = async (pageNum: number) => {\n const pageParams: ChildrenQueryParams = { ...fixedParams, page: pageNum };\n \n try {\n const preloadResult = await loader(parentId, pageParams);\n\n const bucketNow = this.views.get(pKey);\n if (!bucketNow) return;\n const mainRecNow = bucketNow.get(paramsKey(fixedParams));\n if (!mainRecNow) return;\n if (initialLoadId != null && mainRecNow.view.loadId !== initialLoadId) return;\n\n const localLoadId = mainRecNow.view.loadId;\n if (localLoadId !== initialLoadId) return;\n\n for (const e of preloadResult.items) entitiesManager.upsertEntity(e);\n\n const pageKey = paramsKey(pageParams);\n let pageRec = bucketNow.get(pageKey);\n if (!pageRec) {\n const view: ViewCache = {\n promise: null,\n value: undefined,\n meta: undefined,\n error: undefined,\n updatedAt: 0,\n loadId: mainRecNow.view.loadId,\n };\n pageRec = { params: pageParams, view };\n bucketNow.set(pageKey, pageRec);\n this.cleanupOldViews(bucketNow);\n }\n\n if (!pageRec.view.value || this.isExpired(pageRec.view.updatedAt)) {\n pageRec.view.value = preloadResult.items.map((f) => f.id);\n const { items, ...meta } = preloadResult;\n pageRec.view.meta = { ...meta, page: pageNum, totalPages: currentTotalPages };\n pageRec.view.updatedAt = this.now();\n }\n } catch (error) {\n console.debug('Preload failed silently:', error);\n }\n };\n\n if (preloadAfter > 0 && currentPage < currentTotalPages) {\n for (let i = 1; i <= Math.min(preloadAfter, currentTotalPages - currentPage); i++) {\n const pageNum = currentPage + i;\n const pageParams: ChildrenQueryParams = { ...fixedParams, page: pageNum };\n const pageKey = paramsKey(pageParams);\n const pageRec = bucket.get(pageKey);\n if (!pageRec?.view.value || this.isExpired(pageRec.view.updatedAt)) {\n doPreload(pageNum);\n }\n }\n }\n\n if (preloadBefore > 0 && currentPage > 1) {\n for (let i = 1; i <= Math.min(preloadBefore, currentPage - 1); i++) {\n const pageNum = currentPage - i;\n const pageParams: ChildrenQueryParams = { ...fixedParams, page: pageNum };\n const pageKey = paramsKey(pageParams);\n const pageRec = bucket.get(pageKey);\n if (!pageRec?.view.value || this.isExpired(pageRec.view.updatedAt)) {\n doPreload(pageNum);\n }\n }\n }\n } catch (error) {\n // Защита от непредвиденных ошибок в предзагрузке\n console.debug('Preload process failed:', error);\n }\n }\n\n private removeEmptyPageIfNeeded(\n bucket: Map<string, ViewRecord<ChildrenQueryParams>>,\n pageRec: ViewRecord<ChildrenQueryParams>,\n pageNum: number,\n totalPages: number,\n baseParams: ChildrenQueryParams,\n ): void {\n if (!pageRec.view.value) return;\n if (pageRec.view.value.length === 0) {\n if (pageNum < totalPages) {\n const pageKey = paramsKey({ ...baseParams, page: pageNum });\n bucket.delete(pageKey);\n }\n }\n }\n\n private updateTotalPagesForAllViews(\n bucket: Map<string, ViewRecord<ChildrenQueryParams>>,\n newTotalPages: number,\n ): void {\n for (const [, rec] of bucket) {\n if (rec.view.meta) {\n rec.view.meta.totalPages = newTotalPages;\n }\n }\n }\n\n private isParamsSame(a: ChildrenQueryParams, b: ChildrenQueryParams): boolean {\n const aKeys = Object.keys(a ?? {}).filter((k) => k !== 'page').sort();\n const bKeys = Object.keys(b ?? {}).filter((k) => k !== 'page').sort();\n if (aKeys.length !== bKeys.length) return false;\n for (let i = 0; i < aKeys.length; i++) {\n const k: keyof ChildrenQueryParams = aKeys[i];\n if (k !== bKeys[i]) {\n return false;\n }\n if (a[k] !== b[k]) {\n return false;\n }\n }\n return true;\n }\n\n private syncTotalsInSameViews(\n bucket: Map<string, ViewRecord<ChildrenQueryParams>>,\n baseRec: ViewRecord<ChildrenQueryParams>,\n ): void {\n const meta = baseRec.view.meta;\n if (!meta || typeof meta.total !== 'number') return;\n const total = Number(meta.total);\n const pageSize = normalizePageSize(baseRec.params?.pageSize);\n const isPaginated = Number.isFinite(pageSize) && pageSize > 0;\n const totalPages = isPaginated ? Math.max(1, Math.ceil(total / pageSize)) : undefined;\n\n for (const [, rec] of bucket) {\n if (!this.isParamsSame(rec.params ?? {}, baseRec.params ?? {})) continue;\n if (!rec.view.meta) rec.view.meta = {};\n rec.view.meta.total = total;\n if (totalPages !== undefined) {\n rec.view.meta.totalPages = totalPages;\n }\n }\n }\n\n // Если задан comparator — считаем клиентскую сортировку авторитетной\n private canSafelyModifySortedView(baseParams: ChildrenQueryParams): boolean {\n if (!baseParams.sortBy && !baseParams.sortOrder) return true;\n if (this.strategy.comparator) return true;\n return false;\n }\n\n private cascadeShiftPages(\n bucket: Map<string, ViewRecord<ChildrenQueryParams>>,\n startPageRec: ViewRecord<ChildrenQueryParams>,\n startPageNum: number,\n pageSize: number,\n totalPages: number,\n entitiesManager: EntityCacheManager,\n baseParams: ChildrenQueryParams,\n ): boolean {\n let currentPageRec = startPageRec;\n let currentPageNum = startPageNum;\n let wasEmptyPageRemoved = false;\n\n // Защита от бесконечной рекурсии\n const maxIterations = 100;\n let iterations = 0;\n\n while (\n currentPageRec.view.value &&\n currentPageRec.view.value.length < pageSize &&\n currentPageNum < totalPages &&\n iterations < maxIterations\n ) {\n iterations++;\n\n const nextPageParams: ChildrenQueryParams = { ...baseParams, page: currentPageNum + 1 };\n const nextPageKey = paramsKey(nextPageParams);\n const nextPageRec = bucket.get(nextPageKey);\n\n if (!nextPageRec?.view.value || this.isExpired(nextPageRec.view.updatedAt)) {\n currentPageRec.view.meta = { ...(currentPageRec.view.meta ?? {}), stale: true };\n break;\n }\n\n const needed = pageSize - currentPageRec.view.value.length;\n const itemsToAdd = nextPageRec.view.value.slice(0, needed);\n const validItems = itemsToAdd.filter((id) => entitiesManager.getEntity(id));\n\n if (validItems.length === 0) {\n currentPageRec.view.meta = { ...(currentPageRec.view.meta ?? {}), stale: true };\n break;\n }\n\n currentPageRec.view.value = [...currentPageRec.view.value, ...validItems];\n currentPageRec.view.updatedAt = Date.now();\n\n nextPageRec.view.value = nextPageRec.view.value.slice(validItems.length);\n nextPageRec.view.updatedAt = Date.now();\n\n if (nextPageRec.view.value.length === 0) {\n const nextPageNum = currentPageNum + 1;\n const nextPageMeta = nextPageRec.view.meta;\n const nextPageTotalPages =\n nextPageMeta && typeof nextPageMeta.totalPages === 'number' ? nextPageMeta.totalPages : 1;\n if (nextPageNum < nextPageTotalPages) {\n const pageKey = paramsKey({ ...baseParams, page: nextPageNum });\n bucket.delete(pageKey);\n wasEmptyPageRemoved = true;\n }\n break;\n }\n\n currentPageRec = nextPageRec;\n currentPageNum++;\n }\n\n if ((!currentPageRec.view.value || currentPageRec.view.value.length < pageSize) && currentPageNum >= totalPages) {\n currentPageRec.view.meta = { ...(currentPageRec.view.meta ?? {}), stale: true };\n }\n\n return wasEmptyPageRemoved;\n }\n\n private cascadeShiftToNextPage(\n bucket: Map<string, ViewRecord<ChildrenQueryParams>>,\n currentPageRec: ViewRecord<ChildrenQueryParams>,\n currentPageNum: number,\n pageSize: number,\n totalPages: number,\n entitiesManager: EntityCacheManager,\n baseParams: ChildrenQueryParams,\n ): boolean {\n if (!currentPageRec.view.value || currentPageRec.view.value.length <= pageSize) return false;\n\n // Защита от бесконечной рекурсии\n const maxDepth = 10;\n if (currentPageNum - (baseParams.page || 1) >= maxDepth) {\n currentPageRec.view.meta = { ...(currentPageRec.view.meta ?? {}), stale: true };\n return false;\n }\n\n const nextPageParams: ChildrenQueryParams = { ...baseParams, page: currentPageNum + 1 };\n const nextPageKey = paramsKey(nextPageParams);\n let nextPageRec = bucket.get(nextPageKey);\n let wasNewPageCreated = false;\n\n if (!nextPageRec?.view.value || this.isExpired(nextPageRec.view.updatedAt)) {\n if (currentPageNum >= totalPages) {\n const view: ViewCache = {\n promise: null,\n value: undefined,\n meta: undefined,\n error: undefined,\n updatedAt: 0,\n loadId: null,\n };\n nextPageRec = { params: nextPageParams, view };\n bucket.set(nextPageKey, nextPageRec);\n this.cleanupOldViews(bucket);\n const currentMeta = currentPageRec.view.meta;\n if (currentMeta) {\n nextPageRec.view.meta = { ...currentMeta, page: currentPageNum + 1 };\n }\n wasNewPageCreated = true;\n } else {\n currentPageRec.view.meta = { ...(currentPageRec.view.meta ?? {}), stale: true };\n return false;\n }\n }\n\n const excessItems = currentPageRec.view.value.slice(pageSize);\n const validItems = excessItems.filter((id) => entitiesManager.getEntity(id));\n if (validItems.length === 0) {\n if (wasNewPageCreated) bucket.delete(nextPageKey);\n return false;\n }\n\n currentPageRec.view.value = currentPageRec.view.value.slice(0, pageSize);\n currentPageRec.view.updatedAt = Date.now();\n\n nextPageRec.view.value = [...validItems, ...(nextPageRec.view.value ?? [])];\n nextPageRec.view.updatedAt = Date.now();\n\n const nextPageTotalPages =\n nextPageRec.view.meta && typeof nextPageRec.view.meta.totalPages === 'number' ?\n nextPageRec.view.meta.totalPages\n : totalPages;\n\n // Рекурсивно продолжаем только если не создали новую страницу (чтобы избежать бесконечного создания)\n if (!wasNewPageCreated) {\n const recursiveNewPageCreated = this.cascadeShiftToNextPage(\n bucket,\n nextPageRec,\n currentPageNum + 1,\n pageSize,\n nextPageTotalPages,\n entitiesManager,\n baseParams,\n );\n if (recursiveNewPageCreated) return true;\n }\n\n if (!nextPageRec.view.value || nextPageRec.view.value.length === 0) {\n const nextPageNum = currentPageNum + 1;\n const nextPageMeta = nextPageRec.view.meta;\n const nextPageTotalPages =\n nextPageMeta && typeof nextPageMeta.totalPages === 'number' ? nextPageMeta.totalPages : 1;\n this.removeEmptyPageIfNeeded(bucket, nextPageRec, nextPageNum, nextPageTotalPages, baseParams);\n }\n\n return wasNewPageCreated;\n }\n\n private tryInsertSorted(\n rec: ViewRecord<ChildrenQueryParams>,\n entity: FileSystemItem,\n entitiesManager: EntityCacheManager,\n ): boolean {\n const comparator = this.strategy.comparator;\n if (!comparator) return false;\n if (!rec.view.value) return false;\n\n const itemType = rec.params?.itemType || 'all';\n if (!this.isEntityTypeCompatible(entity, itemType)) return false;\n\n const currentEntities = rec.view.value.map((id) => entitiesManager.getEntity(id));\n if (currentEntities.some((e) => !e)) return false;\n\n let lo = 0;\n let hi = currentEntities.length;\n while (lo < hi) {\n const mid = Math.floor((lo + hi) / 2);\n const cmp = comparator(entity, currentEntities[mid]!, rec.params);\n if (typeof cmp !== 'number' || Number.isNaN(cmp)) return false;\n if (cmp >= 0) lo = mid + 1;\n else hi = mid;\n }\n\n if (rec.view.value.includes(entity.id)) {\n rec.view.updatedAt = this.now();\n return true;\n }\n\n rec.view.value = [...rec.view.value.slice(0, lo), entity.id, ...rec.view.value.slice(lo)];\n rec.view.updatedAt = this.now();\n if (rec.view.meta && typeof (rec.view.meta as any).total === 'number') {\n rec.view.meta.total = Number(rec.view.meta.total) + 1;\n }\n return true;\n }\n\n private updateChildrenCountForOperation(\n operation: string,\n entity: FileSystemItem,\n prevParentId: string | null | undefined,\n entitiesManager: EntityCacheManager,\n ): void {\n const currentParentId = getFolderId(entity);\n\n switch (operation) {\n case 'delete':\n this.adjustChildrenCount(entitiesManager, currentParentId, -1);\n this.childrenCountInvalidator?.(currentParentId);\n break;\n case 'insert':\n case 'copy':\n this.adjustChildrenCount(entitiesManager, currentParentId, 1);\n this.childrenCountInvalidator?.(currentParentId);\n break;\n case 'move':\n this.adjustChildrenCount(entitiesManager, prevParentId, -1);\n this.adjustChildrenCount(entitiesManager, currentParentId, 1);\n this.childrenCountInvalidator?.(prevParentId);\n this.childrenCountInvalidator?.(currentParentId);\n break;\n }\n }\n\n private adjustChildrenCount(entitiesManager: EntityCacheManager, parentId: string | null, delta: number): void {\n if (!parentId) return;\n\n const folder = entitiesManager.getFolder(parentId);\n if (folder && typeof folder.childrenCount === 'number') {\n const newCount = Math.max(0, folder.childrenCount + delta);\n entitiesManager.updateServerChildrenCount(parentId, newCount);\n }\n }\n\n // Разделили smartInvalidate на хелперы\n smartInvalidateChildrenViews(\n parentId: string | null,\n entity: FileSystemItem | null,\n operation: 'insert' | 'delete' | 'move' | 'copy' | 'update',\n entitiesManager: EntityCacheManager,\n prevParentId?: string | null,\n prevEntity?: FileSystemItem | null,\n ): void {\n if (!entity) return;\n // Всегда обновляем childrenCount (entitiesManager обязателен)\n this.updateChildrenCountForOperation(operation, entity, prevParentId, entitiesManager);\n\n const pKey = this.parentKey(parentId);\n const bucket = this.views.get(pKey);\n if (!bucket) return;\n\n for (const [, rec] of bucket) {\n const params = rec.params ?? {};\n const page = params?.page ?? 1;\n const pageSize = normalizePageSize(params?.pageSize);\n const isPaginated = Number.isFinite(pageSize);\n const hasSort = !!(params?.sortBy || params?.sortOrder);\n const hasSearch = !!params?.search;\n const itemType = params?.itemType || 'all';\n\n if (!this.isEntityTypeCompatible(entity, itemType)) continue;\n\n if (hasSearch && this.strategy.filterMatch && !this.strategy.filterMatch(entity, rec.params)) {\n if (rec.view.value?.includes(entity.id)) {\n rec.view.value = rec.view.value.filter((id) => id !== entity.id);\n if (rec.view.meta && typeof rec.view.meta.total === 'number') {\n rec.view.meta.total = Math.max(0, rec.view.meta.total - 1);\n }\n rec.view.updatedAt = Date.now();\n }\n continue;\n }\n\n if (!rec.view.value) {\n if (rec.view.meta) rec.view.meta.stale = true;\n rec.view.loadId = generateId();\n // Отменяем старый AbortController если был\n if (rec.view.abortController) {\n rec.view.abortController.abort();\n rec.view.abortController = undefined;\n }\n continue;\n }\n\n const entityInView = rec.view.value.includes(entity.id);\n const shouldInvalidateCompletely = this.shouldInvalidateCompletely(\n rec,\n operation,\n entity,\n hasSort,\n isPaginated,\n page,\n );\n\n if (shouldInvalidateCompletely) {\n rec.view.meta = { ...(rec.view.meta ?? {}), stale: true };\n rec.view.loadId = generateId();\n // Отменяем старый AbortController если был\n if (rec.view.abortController) {\n rec.view.abortController.abort();\n rec.view.abortController = undefined;\n }\n continue;\n }\n\n switch (operation) {\n case 'delete':\n this.handleDelete(bucket, rec, page, pageSize, isPaginated, entity, entitiesManager);\n break;\n case 'insert':\n case 'copy':\n this.handleInsert(bucket, rec, page, pageSize, isPaginated, hasSort, entity, entitiesManager);\n break;\n case 'update':\n this.handleUpdate(bucket, rec, page, pageSize, isPaginated, hasSort, hasSearch, entity, entitiesManager);\n break;\n case 'move':\n this.handleMove(bucket, rec, page, pageSize, isPaginated, hasSort, entity, prevParentId, entitiesManager);\n break;\n }\n }\n }\n\n private shouldInvalidateCompletely(\n rec: ViewRecord<ChildrenQueryParams>,\n operation: string,\n entity: FileSystemItem,\n hasSort: boolean,\n isPaginated: boolean,\n page: number,\n ): boolean {\n if (isPaginated && page > 1 && (operation === 'insert' || operation === 'delete' || operation === 'move')) {\n return true;\n }\n if (hasSort && !this.strategy.comparator && (operation === 'insert' || operation === 'move')) {\n return true;\n }\n if (this.isExpired(rec.view.updatedAt)) {\n return true;\n }\n return false;\n }\n\n private tryReinsertEntity(\n rec: ViewRecord<ChildrenQueryParams>,\n entity: FileSystemItem,\n entitiesManager: EntityCacheManager,\n isPaginated: boolean,\n pageSize: number,\n ): boolean {\n const itemType = rec.params?.itemType || 'all';\n if (!this.isEntityTypeCompatible(entity, itemType)) return false;\n\n if (this.strategy.comparator && this.strategy.filterMatch) {\n if (!this.strategy.filterMatch(entity, rec.params)) return false;\n const inserted = this.tryInsertSorted(rec, entity, entitiesManager);\n if (inserted) return true;\n }\n\n const params = rec.params ?? {};\n const hasSort = !!(params.sortBy || params.sortOrder);\n if (hasSort && !this.canSafelyModifySortedView(params)) return false;\n\n if (!isPaginated || rec.view.value!.length < pageSize) {\n rec.view.value!.push(entity.id);\n return true;\n }\n\n return false;\n }\n\n // helper: удаление\n private handleDelete(\n bucket: Map<string, ViewRecord<ChildrenQueryParams>>,\n rec: ViewRecord<ChildrenQueryParams>,\n page: number,\n pageSize: number,\n isPaginated: boolean,\n entity: FileSystemItem,\n entitiesManager?: EntityCacheManager,\n ): void {\n const entityInView = rec.view.value!.includes(entity.id);\n if (entityInView) {\n rec.view.value = rec.view.value!.filter((id) => id !== entity.id);\n }\n\n if (rec.view.meta && typeof rec.view.meta.total === 'number') {\n rec.view.meta.total = Math.max(0, rec.view.meta.total - 1);\n if (isPaginated && Number.isFinite(pageSize) && typeof rec.view.meta.total === 'number') {\n const finitePageSize = pageSize as number;\n if (finitePageSize > 0) {\n rec.view.meta.totalPages = Math.max(1, Math.ceil(rec.view.meta.total / finitePageSize));\n }\n }\n this.syncTotalsInSameViews(bucket, rec);\n }\n\n rec.view.updatedAt = Date.now();\n\n if (entityInView && isPaginated && rec.view.value!.length < pageSize && entitiesManager) {\n const meta = rec.view.meta;\n const totalPages = meta && typeof meta.totalPages === 'number' ? meta.totalPages : 1;\n const wasEmptyPageRemoved = this.cascadeShiftPages(\n bucket,\n rec,\n page,\n pageSize,\n totalPages,\n entitiesManager,\n rec.params ?? {},\n );\n if (wasEmptyPageRemoved && rec.view.meta && typeof rec.view.meta.totalPages === 'number') {\n const newTotalPages = Math.max(1, rec.view.meta.totalPages - 1);\n rec.view.meta.totalPages = newTotalPages;\n this.updateTotalPagesForAllViews(bucket, newTotalPages);\n }\n }\n\n rec.view.loadId = generateId();\n // Отменяем старый AbortController если был\n if (rec.view.abortController) {\n rec.view.abortController.abort();\n rec.view.abortController = undefined;\n }\n }\n\n // helper: вставка\n private handleInsert(\n bucket: Map<string, ViewRecord<ChildrenQueryParams>>,\n rec: ViewRecord<ChildrenQueryParams>,\n page: number,\n pageSize: number,\n isPaginated: boolean,\n hasSort: boolean,\n entity: FileSystemItem,\n entitiesManager?: EntityCacheManager,\n ): void {\n if (rec.view.value!.includes(entity.id)) return;\n\n if (hasSort && this.strategy.allowSortedInsert && this.strategy.comparator && entitiesManager) {\n const inserted = this.tryInsertSorted(rec as ViewRecord<ChildrenQueryParams>, entity, entitiesManager);\n if (inserted && rec.view.meta && typeof rec.view.meta.total === 'number') {\n rec.view.meta.total += 1;\n if (isPaginated && Number.isFinite(pageSize)) {\n const finitePageSize = pageSize as number;\n if (finitePageSize > 0) {\n rec.view.meta.totalPages = Math.max(1, Math.ceil(rec.view.meta.total / finitePageSize));\n }\n }\n this.syncTotalsInSameViews(bucket, rec);\n }\n if (isPaginated && rec.view.value.length > pageSize && entitiesManager) {\n const meta = rec.view.meta;\n const totalPages = meta && typeof meta.totalPages === 'number' ? meta.totalPages : 1;\n const wasNewPageCreated = this.cascadeShiftToNextPage(\n bucket,\n rec,\n page,\n pageSize,\n totalPages,\n entitiesManager,\n rec.params ?? {},\n );\n if (wasNewPageCreated && rec.view.meta && typeof rec.view.meta.totalPages === 'number') {\n const newTotalPages = rec.view.meta.totalPages + 1;\n rec.view.meta.totalPages = newTotalPages;\n this.updateTotalPagesForAllViews(bucket, newTotalPages);\n }\n }\n } else {\n if (!isPaginated || rec.view.value!.length < pageSize) {\n rec.view.value!.push(entity.id);\n if (rec.view.meta && typeof rec.view.meta.total === 'number') {\n rec.view.meta.total += 1;\n if (isPaginated && Number.isFinite(pageSize)) {\n const finitePageSize = pageSize as number;\n if (finitePageSize > 0) {\n rec.view.meta.totalPages = Math.max(1, Math.ceil(rec.view.meta.total / finitePageSize));\n }\n }\n this.syncTotalsInSameViews(bucket, rec);\n }\n rec.view.updatedAt = Date.now();\n } else {\n rec.view.meta = { ...(rec.view.meta ?? {}), stale: true };\n }\n }\n rec.view.loadId = generateId();\n // Отменяем старый AbortController если был\n if (rec.view.abortController) {\n rec.view.abortController.abort();\n rec.view.abortController = undefined;\n }\n }\n\n // helper: update\n private handleUpdate(\n bucket: Map<string, ViewRecord<ChildrenQueryParams>>,\n rec: ViewRecord<ChildrenQueryParams>,\n page: number,\n pageSize: number,\n isPaginated: boolean,\n hasSort: boolean,\n hasSearch: boolean,\n entity: FileSystemItem,\n entitiesManager?: EntityCacheManager,\n ): void {\n const entityInView = rec.view.value!.includes(entity.id);\n const stillCompatible = this.isEntityTypeCompatible(entity, rec.params?.itemType || 'all');\n\n if (entityInView && !stillCompatible) {\n rec.view.value = rec.view.value!.filter((id) => id !== entity.id);\n if (rec.view.meta && typeof rec.view.meta.total === 'number') {\n rec.view.meta.total = Math.max(0, rec.view.meta.total - 1);\n if (isPaginated && Number.isFinite(pageSize) && typeof rec.view.meta.total === 'number') {\n const finitePageSize = pageSize as number;\n if (finitePageSize > 0) {\n rec.view.meta.totalPages = Math.max(1, Math.ceil(rec.view.meta.total / finitePageSize));\n }\n }\n }\n rec.view.updatedAt = Date.now();\n if (isPaginated && rec.view.value!.length < pageSize && entitiesManager) {\n const meta = rec.view.meta;\n const totalPages = meta && typeof meta.totalPages === 'number' ? meta.totalPages : 1;\n const wasEmptyPageRemoved = this.cascadeShiftPages(\n bucket,\n rec,\n page,\n pageSize,\n totalPages,\n entitiesManager,\n rec.params ?? {},\n );\n if (wasEmptyPageRemoved && rec.view.meta && typeof rec.view.meta.totalPages === 'number') {\n const newTotalPages = Math.max(1, rec.view.meta.totalPages - 1);\n rec.view.meta.totalPages = newTotalPages;\n this.updateTotalPagesForAllViews(bucket, newTotalPages);\n }\n }\n rec.view.loadId = generateId();\n // Отменяем старый AbortController если был\n if (rec.view.abortController) {\n rec.view.abortController.abort();\n rec.view.abortController = undefined;\n }\n return;\n }\n\n if (entityInView && (hasSort || hasSearch)) {\n rec.view.value = rec.view.value!.filter((id) => id !== entity.id);\n const reinserted = this.tryReinsertEntity(rec, entity, entitiesManager!, isPaginated, pageSize);\n if (!reinserted) {\n if (rec.view.meta && typeof rec.view.meta.total === 'number') {\n rec.view.meta.total = Math.max(0, rec.view.meta.total - 1);\n if (isPaginated && Number.isFinite(pageSize) && typeof rec.view.meta.total === 'number') {\n const finitePageSize = pageSize as number;\n if (finitePageSize > 0) {\n rec.view.meta.totalPages = Math.max(1, Math.ceil(rec.view.meta.total / finitePageSize));\n }\n }\n this.syncTotalsInSameViews(bucket, rec);\n }\n if (isPaginated && rec.view.value!.length < pageSize && entitiesManager) {\n const meta = rec.view.meta;\n const totalPages = meta && typeof meta.totalPages === 'number' ? meta.totalPages : 1;\n const wasEmptyPageRemoved = this.cascadeShiftPages(\n bucket,\n rec,\n page,\n pageSize,\n totalPages,\n entitiesManager,\n rec.params ?? {},\n );\n if (wasEmptyPageRemoved && rec.view.meta && typeof rec.view.meta.totalPages === 'number') {\n const newTotalPages = Math.max(1, rec.view.meta.totalPages - 1);\n rec.view.meta.totalPages = newTotalPages;\n this.updateTotalPagesForAllViews(bucket, newTotalPages);\n }\n }\n } else {\n if (rec.view.meta && typeof rec.view.meta.total === 'number') {\n rec.view.meta.total += 1;\n if (isPaginated && Number.isFinite(pageSize)) {\n const finitePageSize = pageSize as number;\n if (finitePageSize > 0) {\n rec.view.meta.totalPages = Math.max(1, Math.ceil(rec.view.meta.total / finitePageSize));\n }\n }\n this.syncTotalsInSameViews(bucket, rec);\n }\n }\n rec.view.updatedAt = Date.now();\n rec.view.loadId = generateId();\n // Отменяем старый AbortController если был\n if (rec.view.abortController) {\n rec.view.abortController.abort();\n rec.view.abortController = undefined;\n }\n return;\n }\n\n if (entityInView) {\n rec.view.updatedAt = Date.now();\n rec.view.loadId = generateId();\n // Отменяем старый AbortController если был\n if (rec.view.abortController) {\n rec.view.abortController.abort();\n rec.view.abortController = undefined;\n }\n return;\n }\n\n if (stillCompatible && !hasSearch) {\n if (hasSort && this.strategy.allowSortedInsert && this.strategy.comparator && entitiesManager) {\n const inserted = this.tryInsertSorted(rec as ViewRecord<ChildrenQueryParams>, entity, entitiesManager!);\n if (inserted && rec.view.meta && typeof rec.view.meta.total === 'number') {\n rec.view.meta.total += 1;\n if (isPaginated && Number.isFinite(pageSize)) {\n const finitePageSize = pageSize as number;\n if (finitePageSize > 0) {\n rec.view.meta.totalPages = Math.max(1, Math.ceil(rec.view.meta.total / finitePageSize));\n }\n }\n this.syncTotalsInSameViews(bucket, rec);\n }\n } else if (!isPaginated || rec.view.value!.length < pageSize) {\n rec.view.value!.push(entity.id);\n if (rec.view.meta && typeof rec.view.meta.total === 'number') {\n rec.view.meta.total += 1;\n if (isPaginated && Number.isFinite(pageSize)) {\n const finitePageSize = pageSize as number;\n if (finitePageSize > 0) {\n rec.view.meta.totalPages = Math.max(1, Math.ceil(rec.view.meta.total / finitePageSize));\n }\n }\n this.syncTotalsInSameViews(bucket, rec);\n }\n rec.view.updatedAt = Date.now();\n } else {\n rec.view.meta = { ...(rec.view.meta ?? {}), stale: true };\n }\n rec.view.loadId = generateId();\n // Отменяем старый AbortController если был\n if (rec.view.abortController) {\n rec.view.abortController.abort();\n rec.view.abortController = undefined;\n }\n }\n }\n\n private handleMove(\n bucket: Map<string, ViewRecord<ChildrenQueryParams>>,\n rec: ViewRecord<ChildrenQueryParams>,\n page: number,\n pageSize: number,\n isPaginated: boolean,\n hasSort: boolean,\n entity: FileSystemItem,\n prevParentId: string | null | undefined,\n entitiesManager?: EntityCacheManager,\n ): void {\n const entityInView = rec.view.value!.includes(entity.id);\n\n if (entityInView) {\n rec.view.value = rec.view.value!.filter((id) => id !== entity.id);\n if (rec.view.meta && typeof rec.view.meta.total === 'number') {\n rec.view.meta.total = Math.max(0, rec.view.meta.total - 1);\n if (isPaginated && Number.isFinite(pageSize) && typeof rec.view.meta.total === 'number') {\n const finitePageSize = pageSize as number;\n if (finitePageSize > 0) {\n rec.view.meta.totalPages = Math.max(1, Math.ceil(rec.view.meta.total / finitePageSize));\n }\n }\n }\n rec.view.updatedAt = Date.now();\n if (isPaginated && rec.view.value!.length < pageSize && entitiesManager) {\n const meta = rec.view.meta;\n const totalPages = meta && typeof meta.totalPages === 'number' ? meta.totalPages : 1;\n const wasEmptyPageRemoved = this.cascadeShiftPages(\n bucket,\n rec,\n page,\n pageSize,\n totalPages,\n entitiesManager,\n rec.params ?? {},\n );\n if (wasEmptyPageRemoved && rec.view.meta && typeof rec.view.meta.totalPages === 'number') {\n const newTotalPages = Math.max(1, rec.view.meta.totalPages - 1);\n rec.view.meta.totalPages = newTotalPages;\n this.updateTotalPagesForAllViews(bucket, newTotalPages);\n }\n }\n this.syncTotalsInSameViews(bucket, rec);\n }\n\n // вставка в целевой bucket будет обработана отдельно в итерации для целевой папки\n rec.view.loadId = generateId();\n // Отменяем старый AbortController если был\n if (rec.view.abortController) {\n rec.view.abortController.abort();\n rec.view.abortController = undefined;\n }\n }\n\n forceInvalidateChildrenViews(parentId: string | null): void {\n const pKey = this.parentKey(parentId ?? null);\n const bucket = this.views.get(pKey);\n if (!bucket) return;\n for (const [, rec] of bucket) {\n rec.view.value = undefined;\n rec.view.error = null;\n rec.view.meta = undefined;\n rec.view.promise = null;\n rec.view.updatedAt = 0;\n rec.view.loadId = generateId();\n // Отменяем старый AbortController если был\n if (rec.view.abortController) {\n rec.view.abortController.abort();\n rec.view.abortController = undefined;\n }\n }\n }\n\n getKnownTotal(parentId: string | null): number | undefined {\n const pKey = this.parentKey(parentId ?? null);\n const bucket = this.views.get(pKey);\n if (!bucket) return undefined;\n let best: { total: number; updatedAt: number } | null = null;\n for (const [, rec] of bucket) {\n const meta = rec.view.meta;\n if (meta && typeof meta.total === 'number') {\n if (!best || (rec.view.updatedAt ?? 0) > best.updatedAt) {\n best = { total: Number(meta.total), updatedAt: rec.view.updatedAt ?? 0 };\n }\n }\n }\n return best ? best.total : undefined;\n }\n\n toJSON(): any {\n return {\n views: Array.from(this.views.entries()).map(([k, v]) => [k, Array.from(v.entries())]),\n ttl: this.ttl,\n errorTtl: this.errorTtl,\n entityTtl: this.entityTtl,\n strategy: {\n allowSortedInsert: this.strategy.allowSortedInsert,\n allowSearchInsert: this.strategy.allowSearchInsert,\n invalidateOnPaginationFull: this.strategy.invalidateOnPaginationFull,\n preloadPagesBefore: this.strategy.preloadPagesBefore,\n preloadPagesAfter: this.strategy.preloadPagesAfter,\n },\n };\n }\n\n static fromJSON(data: any): ViewCacheManager {\n const mgr = new ViewCacheManager();\n for (const [k, arr] of data.views ?? []) {\n const bucket = new Map<string, ViewRecord<ChildrenQueryParams>>();\n for (const [qk, tup] of arr as any[]) {\n bucket.set(qk, tup as ViewRecord<ChildrenQueryParams>);\n }\n mgr.views.set(k, bucket);\n }\n return mgr;\n }\n}\n\nexport class TreeCache {\n private readonly entities: EntityCacheManager;\n private readonly views: ViewCacheManager;\n private readonly ttl: number;\n private readonly errorTtl: number;\n\n private readonly childrenCountPromises = new Map<string, Promise<number>>();\n private invalidateChildrenCountCache(parentId: string | null | undefined): void {\n const key = normalizeParentKey(parentId ?? '');\n this.childrenCountPromises.delete(key);\n }\n\n constructor(viewOptions: ViewStrategyOptions = {}, ttl = 300_000, errorTtl = 30_000) {\n this.ttl = ttl;\n this.errorTtl = errorTtl;\n this.entities = new EntityCacheManager();\n this.views = new ViewCacheManager(viewOptions, ttl, errorTtl);\n this.views.setServerChildrenCountHandler((parent, total, manager) => {\n this.handleServerReportedChildrenCount(parent, total, manager ?? this.entities);\n });\n this.views.setChildrenCountInvalidator((parentId) => {\n this.invalidateChildrenCountCache(parentId);\n });\n }\n\n getEntity(id: string): FileSystemItem | null {\n return this.entities.getEntity(id) ?? null;\n }\n\n getFileSystemItem(id: string): FileSystemItem | null {\n return this.entities.getFileSystemItem(id) ?? null;\n }\n\n getFolder(id: string): FileSystemItem | null {\n return this.entities.getFolder(id) ?? null;\n }\n\n async getOrCreateChildren(\n parentId: string | null,\n params: ChildrenQueryParams,\n loader: (parentId: string | null, params: ChildrenQueryParams) => Promise<QueryResult<FileSystemItem>>,\n ): Promise<QueryResult<FileSystemItem>> {\n return this.views.getOrCreateChildren(parentId, params, loader, this.entities);\n }\n\n upsertEntity(entity: FileSystemItem): void {\n const prev = this.entities.getEntity(entity.id);\n const prevParent = prev ? getFolderId(prev) : null;\n const nextParent = getFolderId(entity);\n\n const prevIsFolder = prev ? isFolderEntity(prev) : false;\n const nextIsFolder = isFolderEntity(entity);\n\n this.entities.upsertEntity(entity);\n\n if (prev) {\n if (prevParent !== nextParent || prevIsFolder !== nextIsFolder) {\n this.views.smartInvalidateChildrenViews(prevParent, prev, 'delete', this.entities);\n this.views.smartInvalidateChildrenViews(nextParent, entity, 'insert', this.entities);\n return;\n }\n\n this.views.smartInvalidateChildrenViews(nextParent, entity, 'update', this.entities, undefined, prev);\n } else {\n this.views.smartInvalidateChildrenViews(nextParent, entity, 'insert', this.entities);\n }\n }\n\n private isAncestor(ancestorId: string, descendantId: string): boolean {\n let cur: string | null = descendantId;\n const visited = new Set<string>();\n\n while (cur && !visited.has(cur)) {\n visited.add(cur);\n\n const normalizedCur = normalizeParentKey(cur);\n const normalizedAncestor = normalizeParentKey(ancestorId);\n\n if (normalizedCur === normalizedAncestor) return true;\n\n const rec = this.entities.getEntity(cur);\n if (!rec) break;\n\n cur = getFolderId(rec);\n if (cur === null) cur = ROOT_KEY;\n }\n return false;\n }\n\n moveEntity(entityId: string, targetParentId: string | null): FileSystemItem | null {\n const prev = this.entities.getEntity(entityId);\n if (!prev) return null;\n\n if (isFolderEntity(prev) && targetParentId !== null) {\n if (this.isAncestor(entityId, targetParentId)) {\n return null;\n }\n }\n\n const prevParent = getFolderId(prev);\n const updated = this.entities.moveEntityById(entityId, targetParentId);\n if (!updated) return null;\n\n this.views.smartInvalidateChildrenViews(prevParent, prev, 'delete', this.entities);\n this.views.smartInvalidateChildrenViews(targetParentId, updated, 'insert', this.entities);\n\n return updated;\n }\n\n copyEntity(entityId: string, targetParentId: string | null, newId?: string): FileSystemItem | null {\n const rec = this.entities.getEntity(entityId);\n if (!rec) return null;\n\n // Сначала создаем все entity, потом инвалидируем\n let result: FileSystemItem | null = null;\n\n if (!isFolderEntity(rec)) {\n const id = newId ?? generateId();\n result = this.entities.copyFileSystemItem(entityId, id, targetParentId ?? null);\n } else {\n const queue: string[] = [entityId];\n const foldersOrder: string[] = [];\n while (queue.length) {\n const cur = queue.shift()!;\n foldersOrder.push(cur);\n const childFolders = this.entities.getChildrenIds(cur, { onlyFolders: true });\n for (const c of childFolders) queue.push(c);\n }\n\n const idMap = new Map<string, string>();\n for (const old of foldersOrder) idMap.set(old, generateId());\n\n // Копируем все папки\n for (const old of foldersOrder) {\n const oldFolder = this.entities.getFolder(old)!;\n const newIdForFolder = idMap.get(old)!;\n const oldParent = getFolderId(oldFolder);\n const newParent = oldParent === null ? targetParentId : (idMap.get(oldParent) ?? null);\n const folderCopy: FileSystemItem = { ...oldFolder, id: newIdForFolder, folderId: newParent } as FileSystemItem;\n this.entities.upsertEntity(folderCopy);\n }\n\n // Копируем файлы\n for (const old of foldersOrder) {\n const newFolderId = idMap.get(old)!;\n const fileIds = this.entities.getChildrenIds(old, { onlyFileSystemItems: true });\n for (const fid of fileIds) {\n const file = this.entities.getFileSystemItem(fid);\n if (!file) continue;\n const newFileSystemItemId = generateId();\n const copy: FileSystemItem = { ...file, id: newFileSystemItemId, folderId: newFolderId } as FileSystemItem;\n this.entities.upsertEntity(copy);\n }\n }\n\n result = this.entities.getEntity(idMap.get(entityId)!) ?? null;\n }\n\n // Инвалидируем только после успешного создания всех entity\n if (result) {\n this.views.smartInvalidateChildrenViews(targetParentId, result, 'copy', this.entities);\n }\n\n return result;\n }\n\n deleteEntity(entityId: string): FileSystemItem | null {\n const rec = this.entities.getEntity(entityId);\n if (!rec) return null;\n\n if (isFolderEntity(rec)) {\n const { deletedFolderRecords, deletedFileSystemItemRecords } = this.entities.deleteFolderRecursive(entityId);\n for (const f of deletedFileSystemItemRecords)\n this.views.smartInvalidateChildrenViews(f.folderId, f, 'delete', this.entities);\n for (const fo of deletedFolderRecords)\n this.views.smartInvalidateChildrenViews(fo.folderId, fo, 'delete', this.entities);\n return rec;\n } else {\n const { entity, parentId } = this.entities.deleteEntityById(entityId);\n if (entity) this.views.smartInvalidateChildrenViews(parentId, entity, 'delete', this.entities);\n return entity;\n }\n }\n\n deleteFolderRecursive(folderId: string): { deletedFileSystemItemIds: string[]; deletedFolderIds: string[] } {\n const { deletedFolderRecords, deletedFileSystemItemRecords } = this.entities.deleteFolderRecursive(folderId);\n for (const f of deletedFileSystemItemRecords)\n this.views.smartInvalidateChildrenViews(f.folderId, f, 'delete', this.entities);\n for (const fo of deletedFolderRecords)\n this.views.smartInvalidateChildrenViews(fo.folderId, fo, 'delete', this.entities);\n return {\n deletedFileSystemItemIds: deletedFileSystemItemRecords.map((r) => r.id),\n deletedFolderIds: deletedFolderRecords.map((r) => r.id),\n };\n }\n\n forceInvalidate(id: string): void {\n const ent = this.entities.getEntity(id);\n if (!ent) return;\n const visited = new Set<string>();\n if (isFolderEntity(ent)) {\n const stack: string[] = [id];\n while (stack.length) {\n const cur = stack.pop()!;\n if (visited.has(cur)) continue;\n visited.add(cur);\n this.views.forceInvalidateChildrenViews(cur);\n const childFolders = this.entities.getChildrenIds(cur, { onlyFolders: true });\n for (const cf of childFolders) stack.push(cf);\n }\n } else {\n const folderId = ent.folderId ?? null;\n this.views.forceInvalidateChildrenViews(folderId);\n }\n }\n\n getChildrenIds(parentId: string | null): string[] {\n return this.entities.getChildrenIds(parentId);\n }\n\n async getChildrenCount(folderId: string = '', loader?: (folderId: string) => Promise<number>): Promise<number> {\n const key = normalizeParentKey(folderId);\n const existing = this.childrenCountPromises.get(key);\n if (existing) return existing;\n\n const p = (async (): Promise<number> => {\n try {\n const folder = this.entities.getFolder(folderId);\n if (folder && typeof folder.childrenCount === 'number') {\n return folder.childrenCount;\n }\n\n const knownTotal = this.views.getKnownTotal(folderId);\n if (typeof knownTotal === 'number') {\n if (folder) {\n this.handleServerReportedChildrenCount(folderId, knownTotal, this.entities);\n }\n return knownTotal;\n }\n\n if (loader) {\n const loaded = await loader(folderId);\n if (this.entities.getFolder(folderId)) {\n this.handleServerReportedChildrenCount(folderId, loaded, this.entities);\n }\n return loaded;\n }\n\n return this.entities.getChildrenIds(folderId).length;\n } catch (error) {\n this.childrenCountPromises.delete(key);\n throw error;\n } finally {\n this.childrenCountPromises.delete(key);\n }\n })();\n\n this.childrenCountPromises.set(key, p);\n return p;\n }\n\n toJSON(): any {\n return { entities: this.entities.toJSON(), views: this.views.toJSON(), ttl: this.ttl, errorTtl: this.errorTtl };\n }\n\n static fromJSON(data: any, viewOptions?: ViewStrategyOptions): TreeCache {\n const tc = new TreeCache(viewOptions ?? {}, data?.ttl ?? 300_000, data?.errorTtl ?? 30_000);\n const ent = EntityCacheManager.fromJSON(data?.entities ?? {});\n const v = ViewCacheManager.fromJSON(data?.views ?? {});\n // Применяем viewOptions к ViewCacheManager после создания\n if (viewOptions) {\n (v as any).strategy = {\n allowSortedInsert: viewOptions.allowSortedInsert ?? true,\n allowSearchInsert: viewOptions.allowSearchInsert ?? true,\n invalidateOnPaginationFull: viewOptions.invalidateOnPaginationFull ?? true,\n preloadPagesBefore: viewOptions.preloadPagesBefore ?? 0,\n preloadPagesAfter: viewOptions.preloadPagesAfter ?? 1,\n comparator: viewOptions.comparator,\n filterMatch: viewOptions.filterMatch,\n };\n }\n (tc as any).entities = ent;\n (tc as any).views = v;\n v.setServerChildrenCountHandler((parent, total, entitiesManager) => {\n tc.handleServerReportedChildrenCount(parent, total, entitiesManager ?? ent);\n });\n v.setChildrenCountInvalidator((parentId) => {\n tc.invalidateChildrenCountCache(parentId);\n });\n return tc;\n }\n\n private handleServerReportedChildrenCount(\n parentId: string | null,\n serverTotal: number | undefined,\n entitiesManager: EntityCacheManager,\n ): void {\n this.checkAndResolveChildrenCountConflict(parentId, serverTotal, entitiesManager);\n this.invalidateChildrenCountCache(parentId);\n }\n\n private checkAndResolveChildrenCountConflict(\n parentId: string | null,\n serverTotal: number | undefined,\n entitiesManager?: EntityCacheManager,\n ): void {\n if (!entitiesManager || serverTotal === undefined) return;\n\n const folderId = parentId ?? null;\n if (!folderId) {\n entitiesManager.updateServerChildrenCount(folderId, serverTotal);\n return;\n }\n\n const parentFolder = entitiesManager.getFolder(folderId);\n const localChildrenCount = parentFolder?.childrenCount;\n\n if (localChildrenCount !== undefined && localChildrenCount !== serverTotal) {\n console.warn(\n `Conflict: folder \"${folderId}\" has childrenCount=${localChildrenCount} but server says total=${serverTotal}`,\n );\n this.views.forceInvalidateChildrenViews(folderId);\n }\n\n entitiesManager.updateServerChildrenCount(folderId, serverTotal);\n }\n}\n","import {\n ApiPaginationResponse,\n BatchResult,\n File,\n FileManagerDataProviders,\n Folder,\n SortState,\n UploadFileResultData,\n UploadFilesRequest,\n} from '@emailmaker/filemanager/types';\nimport { type FileManagerErrorCode } from '@emailmaker/filemanager';\nimport BindMethods from 'helpers/decorators/bindMethods';\nimport { ExportedApi, FileSystemItem, FileSystemItemUpdate, StorageProvider, StorageProviderController } from 'types';\nimport { TreeCache, ChildrenQueryParams } from './TreeCache';\nimport { I18nContext, defaultI18nContext } from 'helpers/react-i18n';\nimport { FileManagerApiError } from 'constants/errors';\n\n// Константы для стандартных идентификаторов\nconst DEFAULT_ROOT_ID = '';\nconst DEFAULT_TRASH_PATH = 'Trash';\nconst DEFAULT_TEMP_PATH = 'Edited';\nconst MAX_PATH_DEPTH = 10;\n\nfunction parseFilePath(filePath: string): string[] {\n if (!filePath) return [];\n return filePath.replaceAll('\\\\', '/').split('/').filter(Boolean);\n}\n\nfunction mapFileItem({ childrenCount, ...file }: FileSystemItem): File {\n return { ...file, childCount: childrenCount };\n}\n\nexport interface DataSourceProxyOptions {\n rootId?: string;\n trashPath?: string;\n tempPath?: string;\n useSoftDelete?: boolean;\n batchOperationFallback?: boolean;\n validateDuplicates?: boolean; // Проверка дубликатов имен на уровне кэша\n}\n\n/**\n * Прокси для работы с файловым менеджером, обеспечивающий кэширование и клиентскую обработку данных\n */\n@BindMethods\nexport class DataSourceProxy implements FileManagerDataProviders {\n private readonly _cache: TreeCache;\n private readonly _rootId: string;\n private readonly _useSoftDelete: boolean;\n private readonly _enableTrash: boolean;\n private readonly _validateDuplicates: boolean;\n\n private async _findOrCreateFolderByPath(path: string): Promise<Folder | undefined> {\n const { __ } = this.i18n;\n const parts = parseFilePath(path);\n\n if (parts.length > MAX_PATH_DEPTH) {\n const message = __('Path depth exceeds maximum limit of %s').replace('%s', String(MAX_PATH_DEPTH));\n throw new FileManagerApiError(message, 'ValidationError');\n }\n\n let current: Folder | undefined = undefined;\n\n for (const part of parts) {\n const { files } = await this.getFiles({ folderId: current?.id || '', itemType: 'folder' });\n\n const result = files.find((file) => file.name === part);\n if (result) {\n if (!result.isFolder) {\n const message = __('Path component \\'%s\\' in \\'%s\\' is not a folder').replace('%s', part).replace('%s', path);\n throw new FileManagerApiError(message, 'ValidationError');\n }\n current = { id: result.id, name: result.name, parentId: result.folderId };\n } else {\n if (!this._dataProvider.createFolder) {\n throw new FileManagerApiError(\n __('Create folder operation is not supported by data provider'),\n 'UnsupportedOperation',\n );\n }\n current = await this.createFolder({ name: part, parentId: current?.id });\n console.log('createFolder current', current);\n }\n }\n return current;\n }\n\n private getTrashFolder(): Promise<Folder> {\n return this._findOrCreateFolderByPath(this._pathOptions.trashPath || DEFAULT_TRASH_PATH);\n }\n\n private getTempFolder(): Promise<Folder> {\n return this._findOrCreateFolderByPath(this._pathOptions.tempPath || DEFAULT_TEMP_PATH);\n }\n\n constructor(\n private readonly _dataProvider: StorageProvider,\n private readonly _options: ExportedApi.FileManagerOptions = {},\n private readonly _pathOptions: DataSourceProxyOptions,\n private readonly i18n: I18nContext = defaultI18nContext,\n ) {\n // Опция мягкого удаления (перемещение в корзину вместо полного удаления)\n this._useSoftDelete = this._pathOptions.useSoftDelete;\n this._rootId = this._pathOptions.rootId || DEFAULT_ROOT_ID;\n this._enableTrash = this._options.enableTrash === undefined ? true : this._options.enableTrash;\n this._validateDuplicates = this._dataProvider.validateDuplicates;\n\n // Инициализация кэша с переданными настройками\n this._cache = new TreeCache(\n _options.cacheStrategy || {},\n _options.cacheStrategy?.ttl,\n _options.cacheStrategy?.errorTtl,\n );\n\n // if (!this._dataProvider.deleteItems) {\n // this.deleteItems = undefined;\n // }\n // if (!this._dataProvider.moveItems) {\n // this.moveItems = undefined;\n // }\n // if (!this._dataProvider.copyItems) {\n // this.copyItems = undefined;\n // }\n\n this.setController({\n invalidateItemCache: (itemId) => {\n this._cache.forceInvalidate(itemId);\n },\n getCachedItem: (itemId) => {\n return this._cache.getEntity(itemId);\n },\n });\n }\n\n setController(controller: StorageProviderController): void {\n this._dataProvider.setController?.(controller);\n }\n\n /**\n * Нормализует идентификатор с использованием текущих rootId\n */\n normalizeId(id: string | null | undefined): string {\n if (!id) return this._rootId;\n if (id === 'root') return this._rootId;\n if (id === 'folders') return this._rootId;\n return id;\n }\n\n /**\n * Проверяет валидность имени файла/папки\n */\n private _validateName(name: string | null | undefined, isFolder: boolean = false): void {\n if (!name || name.trim().length === 0) {\n const errorCode: FileManagerErrorCode = isFolder ? 'FolderInvalidName' : 'FileInvalidName';\n const { __ } = this.i18n;\n const message = isFolder ? __('Folder name cannot be empty') : __('File name cannot be empty');\n throw new FileManagerApiError(message, errorCode);\n }\n const invalidChars = /[\\/\\\\:*?\"<>|]/;\n if (invalidChars.test(name)) {\n const { __ } = this.i18n;\n const errorCode: FileManagerErrorCode = isFolder ? 'FolderInvalidName' : 'FileInvalidName';\n const message = isFolder ? __('Folder name contains invalid characters: %s').replace('%s', name) : __('File name contains invalid characters: %s').replace('%s', name);\n throw new FileManagerApiError(message, errorCode);\n }\n }\n\n /**\n * Проверяет, что целевая папка в кэше является папкой (если она есть в кэше)\n * Не проверяет существование, так как отсутствие в кэше не означает отсутствие на бэкенде\n */\n private _validateTargetFolderType(targetFolderId: string | null): void {\n const targetId = this.normalizeId(targetFolderId);\n // Для root папки не проверяем, так как она всегда существует\n if (targetId === this._rootId) {\n return;\n }\n const targetFolder = this._cache.getEntity(targetId);\n if (targetFolder && !targetFolder.isFolder) {\n const { __ } = this.i18n;\n const message = __('Target item with id \\'%s\\' is not a folder').replace('%s', targetFolderId);\n throw new FileManagerApiError(message, 'ValidationError');\n }\n }\n\n /**\n * Проверяет, существует ли элемент с указанным именем в целевой папке (только через кэш, без обращения к бэку)\n */\n private _checkNameExistsInCache(\n folderId: string | null,\n name: string,\n isFolder: boolean,\n excludeId?: string,\n ): boolean {\n const folderIdNormalized = this.normalizeId(folderId);\n const childrenIds = this._cache.getChildrenIds(folderIdNormalized);\n\n for (const childId of childrenIds) {\n const child = this._cache.getEntity(childId);\n if (child && child.name === name && !!child.isFolder === isFolder && (!excludeId || child.id !== excludeId)) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Проверяет, является ли targetFolderId дочерней папкой sourceFolderId (циклическая ссылка)\n */\n private _isAncestor(sourceFolderId: string, targetFolderId: string | null): boolean {\n if (!targetFolderId) return false;\n const targetIdNormalized = this.normalizeId(targetFolderId);\n const sourceIdNormalized = this.normalizeId(sourceFolderId);\n\n if (targetIdNormalized === sourceIdNormalized) return true;\n\n let current: FileSystemItem | null = this._cache.getEntity(targetIdNormalized);\n const visited = new Set<string>();\n\n while (current && current.folderId) {\n if (visited.has(current.id)) break;\n visited.add(current.id);\n\n const currentParentId = this.normalizeId(current.folderId);\n if (currentParentId === sourceIdNormalized) return true;\n\n current = this._cache.getEntity(currentParentId);\n if (!current || !current.isFolder) break;\n }\n\n return false;\n }\n\n /**\n * Получает список файлов и папок с поддержкой пагинации, фильтрации и сортировки\n */\n async getFiles({\n folderId,\n search,\n sortBy,\n sortOrder,\n page,\n limit,\n itemType = 'all',\n }: {\n folderId?: string | null;\n search?: string;\n sortBy?: SortState['sortBy'];\n sortOrder?: SortState['sortOrder'];\n page?: number;\n limit?: number;\n itemType: 'file' | 'folder' | 'all';\n }): Promise<{ files: File[]; pagination: Partial<ApiPaginationResponse> }> {\n // Нормализация идентификатора папки\n const folderIdNormalized = this.normalizeId(folderId ?? this._rootId);\n\n // Флаги для определения стратегии обработки\n const useClientSideFilter = this._options.clientSideFilter;\n const useClientSideSorting = this._options.clientSideSorting;\n const useClientSidePaging = this._options.clientSidePaging;\n\n // Параметры для серверного запроса\n const serverParams: any = { folderId: folderIdNormalized, itemType };\n\n // Добавляем параметры поиска, если фильтрация на стороне сервера\n if (!useClientSideFilter) {\n serverParams.search = search;\n }\n\n // Добавляем параметры сортировки, если сортировка на стороне сервера\n if (!useClientSideSorting) {\n serverParams.sortBy = sortBy ?? (itemType !== 'folder' ? 'date' : undefined);\n serverParams.sortOrder = sortOrder ?? (itemType !== 'folder' ? 'desc' : undefined);\n }\n\n // Добавляем параметры пагинации, если пагинация на стороне сервера\n if (!useClientSidePaging) {\n serverParams.page = page;\n serverParams.limit = limit;\n }\n\n // Параметры для ключа кэширования\n const cacheKeyParams = {\n folderId: folderIdNormalized,\n itemType,\n search: useClientSideFilter ? undefined : search,\n sortBy: useClientSideSorting ? undefined : serverParams.sortBy,\n sortOrder: useClientSideSorting ? undefined : serverParams.sortOrder,\n page: useClientSidePaging ? undefined : page,\n pageSize: useClientSidePaging ? undefined : limit,\n };\n\n // Получение данных из кэша или от сервера\n const serverResult = await this._cache.getOrCreateChildren(\n folderIdNormalized,\n cacheKeyParams as ChildrenQueryParams,\n async (folderId, params) => {\n const result = await this._dataProvider.getItems({\n ...params,\n folderId,\n limit: Number(params.pageSize),\n } as any);\n return { items: result.items, ...result.pagination };\n },\n );\n\n let files = serverResult.items;\n\n // Клиентская фильтрация\n if (useClientSideFilter) {\n if (typeof this._options.clientSideFilter === 'function') {\n files = this._options.clientSideFilter(files, search);\n } else if (search) {\n const searchLower = search.toLowerCase();\n files = files.filter((f) => f.name?.toLowerCase().includes(searchLower));\n }\n }\n\n // Клиентская сортировка\n if (useClientSideSorting) {\n if (typeof this._options.clientSideSorting === 'function') {\n files = this._options.clientSideSorting(files, sortBy, sortOrder);\n } else {\n files = this._defaultClientSideSort(files, sortBy, sortOrder);\n }\n }\n\n // Расчет общего количества элементов\n let total: number;\n if (useClientSidePaging || useClientSideFilter) {\n total = files.length;\n } else {\n total = serverResult.total;\n }\n\n // Клиентская пагинация\n let paginatedFiles = files;\n if (useClientSidePaging && page && limit) {\n if (typeof this._options.clientSidePaging === 'function') {\n paginatedFiles = this._options.clientSidePaging(files, page, limit);\n } else {\n const start = (page - 1) * limit;\n const end = start + limit;\n paginatedFiles = files.slice(start, end);\n }\n }\n\n // Оптимизированное получение URL и превью - делаем параллельно\n if (this._dataProvider.getUrl || this._dataProvider.getThumbnailUrl) {\n const filePromises = paginatedFiles.map(async (file) => {\n if (file.isFolder) return file;\n\n const [url, thumbnailUrl] = await Promise.all([\n file.url ? Promise.resolve(file.url)\n : this._dataProvider.getUrl ? this._dataProvider.getUrl(file)\n : Promise.resolve(undefined),\n file.thumbnailUrl ? Promise.resolve(file.thumbnailUrl)\n : this._dataProvider.getThumbnailUrl ? this._dataProvider.getThumbnailUrl(file)\n : Promise.resolve(undefined),\n ]);\n\n return { ...file, url, thumbnailUrl };\n });\n\n paginatedFiles = await Promise.all(filePromises);\n }\n\n // Формирование объекта пагинации\n const paginationResult: Partial<ApiPaginationResponse> = {\n page,\n limit,\n total,\n // Добавляем серверные данные пагинации, если не используется клиентская пагинация\n ...(!useClientSidePaging && serverResult.totalPages && { totalPages: serverResult.totalPages }),\n ...(!useClientSidePaging && serverResult.hasNextPage && { hasNextPage: serverResult.hasNextPage }),\n };\n\n return { files: paginatedFiles.map(mapFileItem), pagination: paginationResult };\n }\n\n /**\n * Стандартная клиентская сортировка файлов\n */\n private _defaultClientSideSort(files: FileSystemItem[], sortBy?: string, sortOrder?: string): FileSystemItem[] {\n return files.sort((a, b) => {\n let compareResult = 0;\n\n switch (sortBy) {\n case 'name':\n compareResult = (a.name || '').localeCompare(b.name || '');\n break;\n case 'date':\n compareResult = new Date(a.date || 0).getTime() - new Date(b.date || 0).getTime();\n break;\n case 'size':\n compareResult = (Number(a.size) || 0) - (Number(b.size) || 0);\n break;\n default:\n compareResult = (a.name || '').localeCompare(b.name || '');\n }\n\n return sortOrder === 'desc' ? -compareResult : compareResult;\n });\n }\n\n /**\n * Получает данные файла в виде Blob\n */\n async getFileData(file: File): Promise<Blob> {\n const _file = this._cache.getEntity(file.id);\n if (this._dataProvider.getFileData) {\n return await this._dataProvider.getFileData(_file);\n }\n const { __ } = this.i18n;\n if (!file.url && !this._dataProvider.getUrl) {\n throw new FileManagerApiError(__('Cannot read file'), 'FileReadError');\n }\n\n const url = file.url || (await this._dataProvider.getUrl!(_file));\n if (url) {\n return (await fetch(url)).blob();\n }\n throw new FileManagerApiError(__('Unable to get file data'), 'FileReadError');\n }\n\n /**\n * Получает количество элементов в папке\n */\n async getChildrenCount(folderId?: string): Promise<number> {\n if (!folderId) return 0;\n const id = this.normalizeId(folderId ?? this._rootId);\n return this._cache.getChildrenCount(id, async () => {\n const { pagination } = await this._dataProvider.getItems({ folderId: id, limit: 0, itemType: 'all' });\n return pagination?.total || 0;\n });\n }\n\n /**\n * Загружает файл на сервер\n */\n async _uploadFile(file: {\n name: string;\n size: number;\n type: string;\n folderId?: string | null;\n data: Blob | globalThis.File;\n }): Promise<File> {\n const folderIdNormalized = this.normalizeId(file.folderId ?? this._rootId);\n\n // Проверка валидности имени\n this._validateName(file.name, false);\n\n // Проверка на дубликат имени перед загрузкой (только через кэш, если включена валидация)\n if (this._validateDuplicates) {\n const nameExists = this._checkNameExistsInCache(folderIdNormalized, file.name, false);\n if (nameExists) {\n const { __ } = this.i18n;\n const message = __('File \\'%s\\' already exists in target folder').replace('%s', file.name);\n throw new FileManagerApiError(message, 'FileAlreadyExists');\n }\n }\n\n const cachedFolder = this._cache.getEntity(folderIdNormalized);\n const uploaded = await this._dataProvider.uploadFile({ ...file, folderId: folderIdNormalized });\n const result = { ...cachedFolder, ...uploaded, folderId: folderIdNormalized };\n this._cache.upsertEntity(result);\n return result;\n }\n\n async uploadFiles(request: UploadFilesRequest): Promise<BatchResult<UploadFileResultData>> {\n // Ожидаем, что request имеет структуру примерно { files: Array< { name, size, type, folderId?, data } >, folderId?, noFolder? }\n const filesToUpload = request.items || [];\n const targetFolderId = request.folderId ?? this._rootId;\n\n const folderIdNormalized = this.normalizeId(targetFolderId);\n\n // Проверка валидности имен и дубликатов перед загрузкой (только через кэш, если включена валидация)\n if (this._validateDuplicates) {\n for (const file of filesToUpload) {\n if (file.name) {\n this._validateName(file.name, false);\n const fileFolderId = this.normalizeId(file.folderId ?? folderIdNormalized);\n const nameExists = this._checkNameExistsInCache(fileFolderId, file.name, false);\n if (nameExists) {\n const { __ } = this.i18n;\n const message = __('File \\'%s\\' already exists in target folder').replace('%s', file.name);\n throw new FileManagerApiError(message, 'FileAlreadyExists');\n }\n }\n }\n }\n\n const cachedFolder = this._cache.getEntity(folderIdNormalized);\n\n let batchResult: BatchResult<UploadFileResultData> = { detailed: new Array(filesToUpload.length), success: true };\n\n if (this._dataProvider.uploadFiles) {\n const providerFiles = filesToUpload.map((f) => ({\n ...f,\n folderId: this.normalizeId(f.folderId ?? folderIdNormalized),\n }));\n\n const providerResult = await this._dataProvider.uploadFiles({\n folderId: folderIdNormalized,\n items: providerFiles,\n });\n\n // Ожидаем BatchResult-like ответ\n batchResult = providerResult;\n\n if (batchResult.detailed && batchResult.detailed.length) {\n for (let i = 0; i < batchResult.detailed.length; i++) {\n const current = batchResult.detailed[i];\n if (current && current.success) {\n const uploaded = current.data;\n const id = uploaded?.id ?? current.requestId;\n const entity = { ...cachedFolder, ...uploaded, folderId: uploaded?.folderId ?? folderIdNormalized };\n // Если провайдер вернул только id/data, всё равно апдейтим кэш\n this._cache.upsertEntity(entity);\n // Нормализуем id в detailed (на случай, если провайдер пропустил)\n current.requestId = id;\n }\n }\n // Если success не выставлен провайдером — вычислим его\n if (batchResult.success === undefined) {\n batchResult.success = !batchResult.detailed.some((d) => !d.success);\n }\n } else {\n // Нет подробностей — считаем весь пакет успешным, но неравномерно обновим кэш если вернулись items\n batchResult.success = batchResult.error ? false : !!batchResult.success;\n }\n }\n // Фоллбек: провайдер поддерживает только uploadFile\n else if (this._dataProvider.uploadFile) {\n batchResult.detailed = await Promise.all(\n filesToUpload.map(async (file: any) => {\n const fileFolderId = this.normalizeId(file.folderId ?? folderIdNormalized);\n try {\n // Используем приватный помощник _uploadFile, он уже нормализует и обновляет кэш\n const uploaded = await this._uploadFile({ ...file, folderId: fileFolderId });\n // В uploaded должно быть id и остальные поля\n return { id: uploaded.id, data: uploaded, success: true };\n } catch (error) {\n return { id: file.id, success: false, error };\n }\n }),\n );\n\n batchResult.success = !batchResult.detailed.some((d) => !d.success);\n } else {\n throw new FileManagerApiError('Upload files is not supported by data provider', 'UnsupportedOperation');\n }\n\n // После успешной загрузки — инвалидация кэша папки, чтобы свежая страница подтянулась при следующем запросе\n if (batchResult.success && this._enableTrash) {\n // инвалидация папки назначения\n try {\n this._cache.forceInvalidate(folderIdNormalized);\n } catch (e) {\n // Игнорируем ошибки инвалидации\n }\n }\n\n return batchResult;\n }\n\n /**\n * Удаляет файл (либо полностью, либо перемещает в корзину в зависимости от настроек)\n */\n async deleteFile(fileId: string): Promise<boolean> {\n const id = this.normalizeId(fileId);\n\n // Если включено мягкое удаление, перемещаем файл в корзину\n if (this._useSoftDelete && this._enableTrash) {\n const trash = await this.getTrashFolder();\n const response = await this.moveItem({ itemId: id, targetFolderId: trash.id, isFolder: false });\n return response;\n }\n\n // Полное удаление\n return await this.hardDeleteItem(id);\n }\n\n /**\n * Удаляет файл (либо полностью, либо перемещает в корзину в зависимости от настроек)\n */\n async deleteItems(itemIds: string[], options: { permanent: boolean }): Promise<BatchResult<{}>> {\n // Если включено мягкое удаление, перемещаем файл в корзину\n if (this._useSoftDelete && this._enableTrash && options.permanent !== true) {\n const trash = await this.getTrashFolder();\n const response = await this.moveItems(trash.id, itemIds);\n\n return response;\n }\n\n // Полное удаление\n return await this.hardDeleteItems(itemIds, options);\n }\n\n /**\n * Полностью удаляет файлы\n */\n private async hardDeleteItems(itemIds: string[], options: { permanent: boolean }): Promise<BatchResult<{}>> {\n let response: BatchResult<never> = { success: true, detailed: [] };\n const trash = options.permanent ? null : await this.getTrashFolder();\n if (this._dataProvider.deleteItems) {\n response = await this._dataProvider.deleteItems(\n itemIds.map((id) => this._cache.getEntity(id)),\n options,\n );\n if (response.success) {\n const detailed = response.detailed || itemIds.map((id) => ({ requestId: id, success: true, error: undefined }));\n for (const result of detailed) {\n if (result.success) {\n if (trash) {\n this._cache.moveEntity(result.requestId, trash.id);\n } else {\n this._cache.deleteEntity(result.requestId);\n }\n }\n }\n }\n } else if (this._dataProvider.deleteItem) {\n response.detailed = await Promise.all(\n itemIds.map(async (id) => {\n const item = this._cache.getEntity(id);\n if (!item) {\n const errorCode: FileManagerErrorCode = 'FileNotFound';\n const { __ } = this.i18n;\n const message = __('Item with id \\'%s\\' not found').replace('%s', id);\n return { id, success: false, error: new FileManagerApiError(message, errorCode) };\n }\n try {\n await this._dataProvider.deleteItem(item, options);\n if (trash) {\n this._cache.moveEntity(id, trash.id);\n } else {\n this._cache.deleteEntity(id);\n }\n return { id, success: true };\n } catch (error) {\n return { id, error, success: false };\n }\n }),\n );\n\n response.success = !response.detailed.some((result) => !result.success);\n }\n\n if (response.success && trash) {\n try {\n this._cache.forceInvalidate(trash.id);\n } catch (e) {\n // Игнорируем ошибки инвалидации\n }\n }\n\n return response;\n }\n\n /**\n * Полностью удаляет файл без возможности восстановления\n */\n private async hardDeleteItem(itemId: string): Promise<boolean> {\n const cachedFile = this._cache.getEntity(itemId);\n // Для операции удаления нужны данные элемента (передаются в провайдер)\n // Если элемента нет в кэше, мы не можем выполнить операцию без обращения к бэкенду\n if (!cachedFile) {\n const { __ } = this.i18n;\n const message = __('Item with id \\'%s\\' not found in cache').replace('%s', itemId);\n throw new FileManagerApiError(message, 'FileNotFound');\n }\n await this._dataProvider.deleteItem(cachedFile, { permanent: true });\n this._cache.deleteEntity(itemId);\n if (this._enableTrash) {\n try {\n const trash = await this.getTrashFolder();\n if (trash) {\n this._cache.forceInvalidate(trash.id);\n }\n } catch (e) {\n // Игнорируем ошибки инвалидации\n }\n }\n return true;\n }\n\n /**\n * Создает новую папку\n */\n async createFolder({\n name,\n parentId,\n is_force_create,\n }: {\n name: string;\n parentId?: string | null;\n is_force_create?: boolean;\n }): Promise<Folder> {\n const folderParentId = this.normalizeId(parentId ?? this._rootId);\n\n // Проверка валидности имени\n this._validateName(name, true);\n\n // Проверка на дубликат имени перед созданием (только через кэш, если включена валидация)\n if (this._validateDuplicates) {\n const nameExists = this._checkNameExistsInCache(folderParentId, name, true);\n if (nameExists) {\n const { __ } = this.i18n;\n const message = __('Folder \\'%s\\' already exists in parent folder').replace('%s', name);\n throw new FileManagerApiError(message, 'FolderAlreadyExists');\n }\n }\n\n const folder = await this._dataProvider.createFolder(name, folderParentId, is_force_create);\n this._cache.upsertEntity({\n id: folder.id,\n folderId: folderParentId,\n name: folder.name,\n isFolder: true,\n childrenCount: folder.childrenCount,\n });\n return mapFileItem(folder);\n }\n\n /**\n * Удаляет папку (либо полностью, либо перемещает в корзину в зависимости от настроек)\n */\n async deleteFolder(folderId: string): Promise<boolean> {\n const id = this.normalizeId(folderId);\n\n // Если включено мягкое удаление, перемещаем папку в корзину\n if (this._useSoftDelete && this._enableTrash) {\n try {\n const trash = await this.getTrashFolder();\n const response = await this.moveItem({ itemId: id, targetFolderId: trash.id, isFolder: true });\n\n if (response) {\n this._cache.deleteFolderRecursive(id);\n return true;\n }\n return false;\n } catch (error) {\n console.error('Error moving folder to trash:', error);\n // Если перемещение не удалось, пробуем полное удаление\n return await this.hardDeleteItem(id);\n }\n }\n // Полное удаление\n return await this.hardDeleteItem(id);\n }\n\n /**\n * Переименовывает папку\n */\n async renameFolder(folderId: string, newName: string): Promise<Folder> {\n const { __ } = this.i18n;\n if (!this._dataProvider.renameItem) {\n throw new FileManagerApiError(__('Rename folder is not supported'), 'RenameNotAllowed');\n }\n const id = this.normalizeId(folderId);\n const cachedFolder = this._cache.getEntity(id);\n if (!cachedFolder) {\n const message = __('Folder with id \\'%s\\' not found in cache').replace('%s', folderId);\n throw new FileManagerApiError(message, 'FolderNotFound');\n }\n\n this._validateName(newName, true);\n\n if (this._validateDuplicates) {\n const parentId = this.normalizeId(cachedFolder.folderId);\n const nameExists = this._checkNameExistsInCache(parentId, newName, true, id);\n if (nameExists) {\n const message = __('Folder \\'%s\\' already exists in parent folder').replace('%s', newName);\n throw new FileManagerApiError(message, 'FolderAlreadyExists');\n }\n }\n\n const result = await this._dataProvider.renameItem(cachedFolder, newName);\n this._cache.upsertEntity({ ...this._cache.getEntity(result.id), ...result });\n return this._cache.getEntity(result.id);\n }\n\n /**\n * Переименовывает файл\n */\n async renameFile(fileId: string, newName: string): Promise<File> {\n const { __ } = this.i18n;\n if (!this._dataProvider.renameItem) {\n throw new FileManagerApiError(__('Rename file is not supported'), 'RenameNotAllowed');\n }\n const cachedFile = this._cache.getEntity(fileId);\n if (!cachedFile) {\n const message = __('File with id \\'%s\\' not found in cache').replace('%s', fileId);\n throw new FileManagerApiError(message, 'FileNotFound');\n }\n const id = this.normalizeId(fileId);\n\n this._validateName(newName, false);\n\n if (this._validateDuplicates) {\n const parentId = this.normalizeId(cachedFile.folderId);\n const nameExists = this._checkNameExistsInCache(parentId, newName, false, id);\n if (nameExists) {\n const message = __('File \\'%s\\' already exists in parent folder').replace('%s', newName);\n throw new FileManagerApiError(message, 'FileAlreadyExists');\n }\n }\n\n const renamed = await this._dataProvider.renameItem(cachedFile, newName);\n if (renamed) this._cache.upsertEntity({ ...this._cache.getEntity(id), ...renamed });\n return this._cache.getEntity(id);\n }\n\n /**\n * Перемещает элемент (файл или папку)\n */\n async moveItem({\n itemId,\n targetFolderId,\n isFolder,\n }: {\n itemId: string;\n targetFolderId: string | null;\n isFolder: boolean;\n }): Promise<boolean> {\n const targetId = this.normalizeId(targetFolderId);\n this._validateTargetFolderType(targetFolderId);\n const cachedItem = this._cache.getEntity(itemId);\n if (!cachedItem) {\n const response = await this._dataProvider.moveItem(\n {\n id: itemId,\n folderId: targetId,\n isFolder: isFolder,\n } as FileSystemItem,\n targetId,\n );\n\n if (response.id === itemId) {\n this._cache.upsertEntity({ ...response, folderId: targetId } as FileSystemItem);\n } else {\n try {\n this._cache.deleteEntity(itemId);\n } catch (e) {\n // Игнорируем ошибку, если элемента нет в кэше\n }\n this._cache.upsertEntity({ ...response, folderId: targetId } as FileSystemItem);\n }\n return true;\n }\n\n const { __ } = this.i18n;\n if (cachedItem.isFolder) {\n if (itemId === targetId) {\n throw new FileManagerApiError(__('Cannot move folder into itself'), 'MoveIntoSelf');\n }\n if (this._isAncestor(itemId, targetId)) {\n throw new FileManagerApiError(__('Cannot move folder into its descendant'), 'MoveIntoDescendant');\n }\n }\n\n if (this._validateDuplicates) {\n const currentParentId = this.normalizeId(cachedItem.folderId);\n if (targetId !== currentParentId && cachedItem.name) {\n const nameExists = this._checkNameExistsInCache(targetId, cachedItem.name, !!cachedItem.isFolder, itemId);\n if (nameExists) {\n const errorCode: FileManagerErrorCode = cachedItem.isFolder ? 'FolderAlreadyExists' : 'FileAlreadyExists';\n throw new FileManagerApiError(\n `${cachedItem.isFolder ? 'Folder' : 'File'} '${cachedItem.name}' already exists in target folder`,\n errorCode,\n );\n }\n }\n }\n\n const response = await this._dataProvider.moveItem(cachedItem, targetId);\n\n if (response.id === itemId) {\n const result = this._cache.moveEntity(itemId, targetId);\n this._cache.upsertEntity({ ...result, ...response });\n return true;\n } else {\n const result = this._cache.deleteEntity(itemId);\n this._cache.upsertEntity({ ...result, ...response, folderId: targetId });\n return true;\n }\n }\n\n async moveItems(targetFolderId: string, itemIds: string[]): Promise<BatchResult<{}>> {\n const targetId = this.normalizeId(targetFolderId);\n this._validateTargetFolderType(targetFolderId);\n const cachedItems = itemIds.map((itemId) => this._cache.getEntity(itemId));\n for (const cachedItem of cachedItems) {\n if (!cachedItem) continue;\n\n if (cachedItem.isFolder) {\n const { __ } = this.i18n;\n if (cachedItem.id === targetId) {\n const message = __('Cannot move folder \\'%s\\' into itself').replace('%s', cachedItem.name);\n throw new FileManagerApiError(message, 'MoveIntoSelf');\n }\n if (this._isAncestor(cachedItem.id, targetId)) {\n const message = __('Cannot move folder \\'%s\\' into its descendant').replace('%s', cachedItem.name);\n throw new FileManagerApiError(message, 'MoveIntoDescendant');\n }\n }\n\n if (this._validateDuplicates) {\n const currentParentId = this.normalizeId(cachedItem.folderId);\n if (targetId !== currentParentId && cachedItem.name) {\n const nameExists = this._checkNameExistsInCache(\n targetId,\n cachedItem.name,\n !!cachedItem.isFolder,\n cachedItem.id,\n );\n if (nameExists) {\n const errorCode: FileManagerErrorCode = cachedItem.isFolder ? 'FolderAlreadyExists' : 'FileAlreadyExists';\n throw new FileManagerApiError(\n `${cachedItem.isFolder ? 'Folder' : 'File'} '${cachedItem.name}' already exists in target folder`,\n errorCode,\n );\n }\n }\n }\n }\n\n let batchResult: BatchResult<FileSystemItemUpdate> = { detailed: new Array(cachedItems.length), success: true };\n\n if (this._dataProvider.moveItems) {\n batchResult = await this._dataProvider.moveItems(cachedItems, targetId);\n } else if (this._dataProvider.moveItem) {\n batchResult.detailed = await Promise.all(\n itemIds.map(async (itemId, i) => {\n const cachedItem = cachedItems[i];\n // Для операции перемещения нужны данные элемента (передаются в провайдер)\n // Если элемента нет в кэше, создаем минимальный объект с обязательными полями\n // Провайдер сам проверит существование элемента\n const item = cachedItem || ({ id: itemId, folderId: null, isFolder: false, name: itemId } as FileSystemItem);\n try {\n return {\n id: itemId,\n data: await this._dataProvider.moveItem(item, targetId),\n success: true,\n };\n } catch (error) {\n return { requestId: itemId, success: false, error };\n }\n }),\n );\n } else {\n throw new FileManagerApiError('Move items is not supported', 'MoveNotAllowed');\n }\n\n if (batchResult.success) {\n const detailed = batchResult.detailed || itemIds.map((id) => ({ requestId: id, success: true, data: undefined }));\n for (const current of detailed) {\n if (current.success) {\n if (!current.data || current.data.id === current.requestId) {\n // ID не изменился - просто перемещаем\n this._cache.moveEntity(current.requestId, targetId);\n if (current.data)\n this._cache.upsertEntity({\n ...this._cache.getEntity(current.requestId),\n ...current.data,\n folderId: targetId,\n });\n } else {\n const deleted = this._cache.deleteEntity(current.requestId);\n this._cache.upsertEntity({ ...deleted, ...current.data, folderId: targetId });\n }\n }\n }\n return batchResult;\n } else {\n const { __ } = this.i18n;\n const error: any = batchResult.error || new FileManagerApiError(__('Move items failed'), 'MoveNotAllowed');\n return {\n success: false,\n error,\n };\n }\n }\n\n /**\n * Копирует элемент (файл или папку)\n */\n async copyItem({\n itemId,\n targetFolderId,\n }: {\n itemId: string;\n targetFolderId: string | null;\n isFolder: boolean;\n }): Promise<boolean> {\n if (!this._dataProvider.copyItem) {\n const { __ } = this.i18n;\n throw new FileManagerApiError(__('Copy item is not supported'), 'CopyNotAllowed');\n }\n\n const targetId = this.normalizeId(targetFolderId);\n this._validateTargetFolderType(targetFolderId);\n const cachedItem = this._cache.getEntity(itemId);\n if (!cachedItem) {\n const response = await this._dataProvider.copyItem(\n {\n id: itemId,\n folderId: targetId,\n } as FileSystemItem,\n targetId,\n );\n\n this._cache.copyEntity(itemId, targetId, response.id);\n this._cache.upsertEntity({ ...response, folderId: targetId } as FileSystemItem);\n return true;\n }\n\n if (this._validateDuplicates && cachedItem.name) {\n const currentParentId = this.normalizeId(cachedItem.folderId);\n const excludeId = targetId === currentParentId ? itemId : undefined;\n const nameExists = this._checkNameExistsInCache(targetId, cachedItem.name, !!cachedItem.isFolder, excludeId);\n if (nameExists) {\n const errorCode: FileManagerErrorCode = cachedItem.isFolder ? 'FolderAlreadyExists' : 'FileAlreadyExists';\n throw new FileManagerApiError(\n `${cachedItem.isFolder ? 'Folder' : 'File'} '${cachedItem.name}' already exists in target folder`,\n errorCode,\n );\n }\n }\n\n const response = await this._dataProvider.copyItem(cachedItem, targetId);\n const result = this._cache.copyEntity(itemId, targetId, response.id);\n this._cache.upsertEntity({ ...result, ...response, folderId: targetId });\n return true;\n }\n\n async copyItems(targetFolderId: string, itemIds: string[]): Promise<BatchResult<{}>> {\n const targetId = this.normalizeId(targetFolderId);\n this._validateTargetFolderType(targetFolderId);\n const cachedItems = itemIds.map((itemId) => this._cache.getEntity(itemId));\n\n if (this._validateDuplicates) {\n for (let i = 0; i < cachedItems.length; i++) {\n const cachedItem = cachedItems[i];\n if (!cachedItem) continue;\n if (cachedItem.name) {\n const currentParentId = this.normalizeId(cachedItem.folderId);\n const excludeId = targetId === currentParentId ? itemIds[i] : undefined;\n const nameExists = this._checkNameExistsInCache(targetId, cachedItem.name, !!cachedItem.isFolder, excludeId);\n if (nameExists) {\n const errorCode: FileManagerErrorCode = cachedItem.isFolder ? 'FolderAlreadyExists' : 'FileAlreadyExists';\n throw new FileManagerApiError(\n `${cachedItem.isFolder ? 'Folder' : 'File'} '${cachedItem.name}' already exists in target folder`,\n errorCode,\n );\n }\n }\n }\n }\n\n let batchResult: BatchResult<FileSystemItemUpdate> = { detailed: new Array(cachedItems.length), success: true };\n\n if (this._dataProvider.copyItems) {\n batchResult = await this._dataProvider.copyItems(cachedItems, targetId);\n } else if (this._dataProvider.copyItem) {\n batchResult.detailed = await Promise.all(\n itemIds.map(async (itemId, i) => {\n const cachedItem = cachedItems[i];\n const item = cachedItem || ({ id: itemId, folderId: null, isFolder: false } as FileSystemItem);\n try {\n return { requestId: itemId, data: await this._dataProvider.copyItem(item, targetId), success: true };\n } catch (error) {\n return { requestId: itemId, success: false, error };\n }\n }),\n );\n } else {\n const { __ } = this.i18n;\n throw new FileManagerApiError(__('Copy items is not supported'), 'CopyNotAllowed');\n }\n\n if (batchResult.success && batchResult.detailed) {\n for (let i = 0, length = batchResult.detailed.length; i < length; i++) {\n const current = batchResult.detailed[i];\n if (current.success) {\n if (current.data?.id) {\n const result = this._cache.copyEntity(\n current.requestId,\n current.data?.folderId || targetId,\n current.data.id,\n );\n if (current.data) {\n this._cache.upsertEntity({ ...result, ...current.data, folderId: targetId });\n }\n } else {\n console.error('batchResult in copy method must have ids');\n }\n }\n }\n } else if (!batchResult.detailed) {\n throw new FileManagerApiError('batchResult in copy method must have detailed results', 'ValidationError');\n }\n\n return batchResult;\n }\n\n /**\n * Загружает файл по URL\n */\n async uploadFileByUrl(data: { url: string; folderId?: string | null; noFolder?: boolean }): Promise<File> {\n if (data.noFolder) {\n const tempFolder = await this.getTempFolder();\n data = { ...data, folderId: tempFolder.id };\n }\n const folderIdNormalized = this.normalizeId(data.folderId ?? this._rootId);\n\n const file = await this._dataProvider.uploadFileByUrl(data.url, folderIdNormalized);\n this._cache.upsertEntity({ ...file, folderId: folderIdNormalized });\n return file;\n }\n\n /**\n * Обновляет данные файла\n */\n async updateFile(fileId: string, updates: Partial<Omit<File, 'id'>>): Promise<File> {\n const { __ } = this.i18n;\n if (!this._dataProvider.updateFile) {\n throw new FileManagerApiError(__('Update file is not supported'), 'UnsupportedOperation');\n }\n\n const id = this.normalizeId(fileId);\n const cachedFile = this._cache.getEntity(id);\n if (!cachedFile) {\n const message = __('File with id \\'%s\\' not found in cache').replace('%s', fileId);\n throw new FileManagerApiError(message, 'FileNotFound');\n }\n\n if (updates.name && updates.name !== cachedFile.name) {\n this._validateName(updates.name, false);\n }\n\n if (this._validateDuplicates && updates.name && updates.name !== cachedFile.name) {\n const parentId = this.normalizeId(cachedFile.folderId);\n const nameExists = this._checkNameExistsInCache(parentId, updates.name, false, id);\n if (nameExists) {\n const message = __('File \\'%s\\' already exists in parent folder').replace('%s', updates.name);\n throw new FileManagerApiError(message, 'FileAlreadyExists');\n }\n }\n\n const file = await this._dataProvider.updateFile(cachedFile, { ...updates });\n this._cache.upsertEntity({ ...this._cache.getEntity(id), ...file, ...updates });\n return this._cache.getEntity(id);\n }\n}\n","import { v4 as uuidv4 } from 'uuid';\nimport {\n FileSystemItem,\n SortState,\n ApiPaginationResponse,\n StorageProvider,\n FileSystemItemUpdate,\n MayBePromise,\n StorageProviderController,\n OperationResult,\n BatchResult,\n UploadFilesRequest,\n FileManagerApiErrorInfo,\n} from 'types';\nimport { I18nContext, defaultI18nContext } from 'helpers/react-i18n';\nimport { FileManagerApiError } from 'constants/errors';\n\nconst DEFAULT_ROOT_ID = '';\nconst DEFAULT_TRASH_PATH = 'Trash';\nconst DEFAULT_TRASH_ID = 'Trash';\n\nexport class PathAwareDataSourceProxy implements StorageProvider {\n private readonly _pathToId = new Map<string, string>();\n private readonly _idToPath = new Map<string, string>();\n \n getUrl?: (file: FileSystemItem) => MayBePromise<string>;\n getThumbnailUrl?: (file: FileSystemItem) => MayBePromise<string>;\n validateDuplicates: boolean;\n\n constructor(\n private readonly _inner: StorageProvider,\n public readonly rootPath: string = DEFAULT_ROOT_ID,\n public readonly trashId: string = DEFAULT_TRASH_ID,\n public readonly trashPath: string = DEFAULT_TRASH_PATH,\n public readonly ensureFolderTrailingSlash: boolean = true,\n private readonly i18n: I18nContext = defaultI18nContext,\n ) {\n this.validateDuplicates = this._inner.validateDuplicates;\n // Прокси для getUrl / getThumbnailUrl\n if (_inner.getUrl) {\n this.getUrl = (file) =>\n _inner.getUrl({\n ...file,\n id: this.pathForId(file.id, false),\n folderId: file.folderId ? this.pathForId(file.folderId, true) : this.rootPath,\n });\n }\n\n if (_inner.getThumbnailUrl) {\n this.getThumbnailUrl = (file) =>\n _inner.getThumbnailUrl({\n ...file,\n id: this.pathForId(file.id, false),\n folderId: file.folderId ? this.pathForId(file.folderId, true) : this.rootPath,\n });\n }\n if (!this._inner.deleteItems) {\n this.deleteItems = undefined;\n } else {\n this.deleteItem = undefined;\n }\n if (!this._inner.moveItems) {\n this.moveItems = undefined;\n } else {\n this.moveItem = undefined;\n }\n if (!this._inner.copyItems) {\n this.copyItems = undefined;\n } else {\n this.copyItem = undefined;\n }\n if (!this._inner.uploadFiles) {\n this.uploadFiles = undefined;\n } else {\n this.uploadFile = undefined;\n }\n this._getOrGenerateId(this.rootPath);\n }\n\n setController(controller: StorageProviderController): void {\n this._inner.setController?.({\n invalidateItemCache: (path) => {\n const cleanedPath = path.replace(/^\\/+|\\/+$/g, '');\n const id = this._pathToId.get(cleanedPath);\n if (id) controller.invalidateItemCache(id);\n },\n getCachedItem: (path) => {\n const cleanedPath = path.replace(/^\\/+|\\/+$/g, '');\n const id = this._pathToId.get(cleanedPath);\n if (id) {\n const result = controller.getCachedItem(id);\n if (result) {\n return {\n ...result,\n id: this.pathForId(result.id, result.isFolder),\n folderId: this.pathForId(result.folderId, result.isFolder),\n };\n }\n }\n return undefined;\n },\n });\n }\n\n private _getOrGenerateId(path: string): string {\n if (path === this.rootPath) return;\n const cleanedPath = path.replaceAll(/^\\/+|\\/+$/g, '');\n if (cleanedPath === this.trashPath.replaceAll(/^\\/+|\\/+$/g, '')) return this.trashId;\n if (this._pathToId.has(cleanedPath)) return this._pathToId.get(cleanedPath)!;\n const id = uuidv4();\n this._pathToId.set(cleanedPath, id);\n this._idToPath.set(id, cleanedPath);\n return id;\n }\n\n pathForId(id: string, isFolder: boolean, silent?: boolean): string {\n const { __ } = this.i18n;\n if (id === '' || id === undefined) return this.rootPath;\n if (id === this.trashId) return this.trashPath;\n let path = this._idToPath.get(id);\n if (!path) {\n if (!silent) {\n const message = __ ? __(`Path for id '${id}' not found in mapping`) : `Path for id '${id}' not found in mapping`;\n throw new FileManagerApiError(message, 'FileNotFound');\n } else {\n return `unknown folder ${id}`;\n }\n }\n\n let slashCount = 0;\n while (slashCount < this.rootPath.length && this.rootPath[slashCount] === '/') {\n slashCount++;\n }\n if (slashCount) {\n let i = 0;\n while (i < path.length && path[i] === '/') {\n i++;\n }\n const cleanPath = path.slice(i);\n path = '/'.repeat(slashCount) + cleanPath;\n }\n if (isFolder && this.ensureFolderTrailingSlash && !path.endsWith('/')) {\n path = path + '/';\n }\n return path;\n }\n\n private _updateIdMapping(id: string, newPath: string) {\n const cleanedPath = newPath.replace(/^\\/+|\\/+$/g, '');\n const oldPath = this._idToPath.get(id);\n if (oldPath) this._pathToId.delete(oldPath);\n this._idToPath.set(id, cleanedPath);\n this._pathToId.set(cleanedPath, id);\n }\n\n async getItems(options: {\n folderId?: string;\n search?: string;\n sortBy?: SortState['sortBy'];\n sortOrder?: SortState['sortOrder'];\n page?: number;\n limit?: number;\n itemType: 'all' | 'file' | 'folder';\n }): Promise<{ items: FileSystemItem[]; pagination?: Partial<ApiPaginationResponse> }> {\n const folderPath = options.folderId ? this.pathForId(options.folderId, true) : this.rootPath;\n const result = await this._inner.getItems({ ...options, folderId: folderPath });\n\n const mappedItems = result.items.map((f) => {\n const id = this._getOrGenerateId(f.id);\n const folderId = f.folderId ? this._getOrGenerateId(f.folderId) : this._getOrGenerateId(this.rootPath);\n return { ...f, id, folderId };\n });\n\n return { ...result, items: mappedItems };\n }\n\n async createFolder(name: string, parent?: string, is_force_create?: boolean): Promise<FileSystemItem> {\n const parentPath = parent ? this.pathForId(parent, true) : this.rootPath;\n const folder = await this._inner.createFolder(name, parentPath, is_force_create);\n\n const id = this._getOrGenerateId(folder.id);\n const folderId = folder.folderId ? this._getOrGenerateId(folder.folderId) : this._getOrGenerateId(this.rootPath);\n return { ...folder, id, folderId };\n }\n\n async renameItem(item: FileSystemItem, newName: string): Promise<FileSystemItemUpdate> {\n const { __ } = this.i18n;\n if (!this._inner.renameItem) {\n const message = __ ? __('Rename item is not supported by inner storage') : 'Rename item is not supported by inner storage';\n throw new FileManagerApiError(message, 'RenameNotAllowed');\n }\n\n const itemPath = this.pathForId(item.id, item.isFolder);\n const oldItemPath = itemPath;\n\n let { ...newItem } = await this._inner.renameItem(\n { ...item, id: itemPath, folderId: this.pathForId(item.folderId, true) },\n newName,\n );\n\n this._updateIdMapping(item.id, newItem.id);\n\n if (item.isFolder) {\n this.remapCachedFolderContents(item.id, oldItemPath, newItem.id);\n }\n\n if (newItem.folderId) {\n newItem = { ...newItem, folderId: this._getOrGenerateId(newItem.folderId) };\n }\n\n return { ...newItem, id: this._getOrGenerateId(newItem.id) };\n }\n\n async deleteItem(item: FileSystemItem, options: { permanent: boolean }): Promise<void> {\n const itemPath = this.pathForId(item.id, item.isFolder);\n await this._inner.deleteItem({ ...item, id: itemPath, folderId: this.pathForId(item.folderId, true) }, options);\n this.recursivelyRemoveMappings(item.id, itemPath);\n }\n\n async uploadFile(file: {\n name: string;\n size: number;\n type: string;\n folderId?: string | null;\n data: Blob | globalThis.File;\n thumbnail?: string;\n dimensions?: string;\n aspectRatio?: string;\n extension?: string;\n }): Promise<FileSystemItemUpdate> {\n const folderPath = file.folderId ? this.pathForId(file.folderId, true) : this.rootPath;\n const uploaded = await this._inner.uploadFile({ ...file, folderId: folderPath });\n\n const id = this._getOrGenerateId(uploaded.id);\n const folderId =\n uploaded.folderId ? this._getOrGenerateId(uploaded.folderId) : this._getOrGenerateId(this.rootPath);\n return { ...uploaded, id, folderId };\n }\n\n async uploadFiles(request: UploadFilesRequest): Promise<BatchResult<FileSystemItem>> {\n const originalRequestFolderId = request.folderId;\n const originalItemFolderIds = request.items?.map((item) => item.folderId) ?? [];\n\n const rootFolderPath = request.folderId ? this.pathForId(request.folderId, true) : this.rootPath;\n const mappedRequest: UploadFilesRequest = {\n ...request,\n folderId: rootFolderPath,\n items:\n request.items?.map((item) => ({\n ...item,\n folderId: item.folderId ? this.pathForId(item.folderId, true) : rootFolderPath,\n })) ?? [],\n };\n\n const uploaded = await this._inner.uploadFiles(mappedRequest);\n return {\n ...uploaded,\n detailed: uploaded.detailed?.map((item, index) => {\n if (!item?.data) {\n return item;\n }\n\n const mappedId = item.data.id ? this._getOrGenerateId(item.data.id) : undefined;\n const mappedFolderId =\n item.data.folderId ?\n this._getOrGenerateId(item.data.folderId)\n : (originalItemFolderIds[index] ?? originalRequestFolderId ?? this._getOrGenerateId(this.rootPath));\n\n return {\n ...item,\n data: {\n ...item.data,\n id: mappedId,\n folderId: mappedFolderId,\n },\n };\n }),\n };\n }\n\n async uploadFileByUrl(url: string, folderId?: string | null): Promise<FileSystemItem> {\n const folderPath = folderId ? this.pathForId(folderId, true) : this.rootPath;\n const file = await this._inner.uploadFileByUrl(url, folderPath);\n\n const id = this._getOrGenerateId(file.id);\n const finalFolderId = file.folderId ? this._getOrGenerateId(file.folderId) : this._getOrGenerateId(this.rootPath);\n return { ...file, id, folderId: finalFolderId };\n }\n\n async moveItem(item: FileSystemItem, targetFolderId: string): Promise<FileSystemItemUpdate> {\n const itemPath = this.pathForId(item.id, item.isFolder);\n const targetPath = this.pathForId(targetFolderId, true);\n\n const result = await this._inner.moveItem(\n { ...item, id: itemPath, folderId: this.pathForId(item.folderId, true) },\n targetPath,\n );\n\n this._updateIdMapping(item.id, result.id);\n\n if (item.isFolder) {\n this.remapCachedFolderContents(item.id, itemPath, result.id);\n }\n\n const mappedId = this._getOrGenerateId(result.id);\n const mappedFolderId = result.folderId ? this._getOrGenerateId(result.folderId) : targetFolderId;\n return { ...result, id: mappedId, folderId: mappedFolderId };\n }\n\n async moveItems(items: FileSystemItem[], targetFolderId?: string): Promise<BatchResult<FileSystemItemUpdate>> {\n const { __ } = this.i18n;\n if (!this._inner.moveItems) {\n const message = __ ? __('Move items is not supported by inner storage') : 'Move items is not supported by inner storage';\n throw new FileManagerApiError(message, 'MoveNotAllowed');\n }\n\n const targetPath = targetFolderId ? this.pathForId(targetFolderId, true) : this.rootPath;\n\n const innerItems = items.map((item) => ({\n ...item,\n id: this.pathForId(item.id, item.isFolder),\n folderId: item.folderId ? this.pathForId(item.folderId, true) : this.rootPath,\n }));\n\n const result = await this._inner.moveItems(innerItems, targetPath);\n const detailed: OperationResult<FileSystemItemUpdate>[] = [];\n\n if (result.detailed && result.detailed.length > 0) {\n const resultMap = new Map<string, OperationResult<FileSystemItemUpdate>>();\n for (let i = 0; i < result.detailed.length; i++) {\n const itemResult = result.detailed[i];\n const requestId = itemResult.requestId || (i < items.length ? items[i].id : undefined);\n if (requestId) {\n resultMap.set(requestId, itemResult);\n }\n }\n\n for (const originalItem of items) {\n const itemResult = resultMap.get(originalItem.id) || \n (result.detailed.length === items.length ? result.detailed[items.indexOf(originalItem)] : undefined);\n\n if (itemResult?.success && itemResult.data) {\n this._updateIdMapping(originalItem.id, itemResult.data.id);\n\n if (originalItem.isFolder) {\n const oldPath = this.pathForId(originalItem.id, originalItem.isFolder);\n this.remapCachedFolderContents(originalItem.id, oldPath, itemResult.data.id);\n }\n\n detailed.push({\n requestId: originalItem.id,\n success: true,\n data: {\n ...itemResult.data,\n id: this._getOrGenerateId(itemResult.data.id),\n folderId:\n itemResult.data.folderId ?\n this._getOrGenerateId(itemResult.data.folderId)\n : targetFolderId || this._getOrGenerateId(this.rootPath),\n },\n });\n } else {\n const errorMessage = __ ? __('Move operation failed - no detailed result') : 'Move operation failed - no detailed result';\n detailed.push({\n requestId: originalItem.id,\n success: false,\n error: itemResult?.error || { message: errorMessage, code: 'MoveNotAllowed' },\n });\n }\n }\n } else {\n for (const originalItem of items) {\n const errorMessage = __ ? __('Move operation failed - no detailed results') : 'Move operation failed - no detailed results';\n detailed.push({\n requestId: originalItem.id,\n success: false,\n error: { message: errorMessage, code: 'MoveNotAllowed' },\n });\n }\n }\n\n return { success: result.success, detailed, error: result.error };\n }\n\n async copyItems(items: FileSystemItem[], targetFolderId?: string): Promise<BatchResult<FileSystemItemUpdate>> {\n const { __ } = this.i18n;\n if (!this._inner.copyItems) {\n const message = __ ? __('Copy items is not supported by inner storage') : 'Copy items is not supported by inner storage';\n throw new FileManagerApiError(message, 'CopyNotAllowed');\n }\n\n const targetPath = targetFolderId ? this.pathForId(targetFolderId, true) : this.rootPath;\n\n const innerItems = items.map((item) => ({\n ...item,\n id: this.pathForId(item.id, item.isFolder),\n folderId: item.folderId ? this.pathForId(item.folderId, true) : this.rootPath,\n }));\n\n const result = await this._inner.copyItems(innerItems, targetPath);\n const detailed: OperationResult<FileSystemItemUpdate>[] = [];\n\n if (result.detailed && result.detailed.length > 0) {\n const resultMap = new Map<string, OperationResult<FileSystemItemUpdate>>();\n for (let i = 0; i < result.detailed.length; i++) {\n const itemResult = result.detailed[i];\n const requestId = itemResult.requestId || (i < items.length ? items[i].id : undefined);\n if (requestId) {\n resultMap.set(requestId, itemResult);\n }\n }\n\n for (const originalItem of items) {\n const itemResult = resultMap.get(originalItem.id) || \n (result.detailed.length === items.length ? result.detailed[items.indexOf(originalItem)] : undefined);\n\n if (itemResult?.success && itemResult.data?.id) {\n const newId = this._getOrGenerateId(itemResult.data.id);\n\n detailed.push({\n requestId: originalItem.id,\n success: true,\n data: {\n ...itemResult.data,\n id: newId,\n folderId:\n itemResult.data.folderId ?\n this._getOrGenerateId(itemResult.data.folderId)\n : targetFolderId || this._getOrGenerateId(this.rootPath),\n },\n });\n } else {\n const errorMessage: FileManagerApiErrorInfo =\n !itemResult ? { message: __ ? __('No detailed result from copy operation') : 'No detailed result from copy operation', code: 'CopyNotAllowed' }\n : !itemResult.success ? (itemResult.error || { message: __ ? __('Copy operation failed') : 'Copy operation failed', code: 'CopyNotAllowed' })\n : !itemResult.data ? { message: __ ? __('No data returned from copy operation') : 'No data returned from copy operation', code: 'CopyNotAllowed' }\n : !itemResult.data.id ? { message: __ ? __('No ID in copied item data') : 'No ID in copied item data', code: 'CopyNotAllowed' }\n : { message: __ ? __('Unknown copy error') : 'Unknown copy error', code: 'CopyNotAllowed' };\n\n detailed.push({ requestId: originalItem.id, success: false, error: errorMessage });\n }\n }\n } else {\n for (const originalItem of items) {\n const errorMessage = __ ? __('No detailed results from copy operation') : 'No detailed results from copy operation';\n detailed.push({\n requestId: originalItem.id,\n success: false,\n error: { message: errorMessage, code: 'CopyNotAllowed' },\n });\n }\n }\n\n const success = detailed.every((result) => result.success);\n const errorMessage = __ ? __('Copy operation completed with errors') : 'Copy operation completed with errors';\n return { success, detailed, error: success ? undefined : result.error || { message: errorMessage, code: 'CopyNotAllowed' } };\n }\n\n async deleteItems(items: FileSystemItem[], options: { permanent: boolean }): Promise<BatchResult<never>> {\n const { __ } = this.i18n;\n if (!this._inner.deleteItems) {\n const message = __ ? __('Delete items is not supported by inner storage') : 'Delete items is not supported by inner storage';\n throw new FileManagerApiError(message, 'DeleteNotAllowed');\n }\n\n const innerItems = items.map((item) => ({\n ...item,\n id: this.pathForId(item.id, item.isFolder),\n folderId: item.folderId ? this.pathForId(item.folderId, true) : this.rootPath,\n }));\n\n const result = await this._inner.deleteItems(innerItems, options);\n const detailed: OperationResult<never>[] = [];\n\n if (result.detailed && result.detailed.length > 0) {\n const resultMap = new Map<string, OperationResult<never>>();\n for (let i = 0; i < result.detailed.length; i++) {\n const itemResult = result.detailed[i];\n const requestId = itemResult.requestId || (i < items.length ? items[i].id : undefined);\n if (requestId) {\n resultMap.set(requestId, itemResult);\n }\n }\n\n for (const originalItem of items) {\n const itemResult = resultMap.get(originalItem.id) || \n (result.detailed.length === items.length ? result.detailed[items.indexOf(originalItem)] : undefined);\n\n if (itemResult?.success) {\n const itemPath = this.pathForId(originalItem.id, originalItem.isFolder);\n if (options.permanent) {\n this.recursivelyRemoveMappings(originalItem.id, itemPath);\n } else {\n this._updateIdMapping(\n originalItem.id,\n this.trashPath + '/' + itemPath + (originalItem.isFolder ? '/' : ''),\n );\n\n if (originalItem.isFolder) {\n const oldPath = this.pathForId(originalItem.id, originalItem.isFolder);\n this.remapCachedFolderContents(\n originalItem.id,\n oldPath,\n this.trashPath + '/' + itemPath + (originalItem.isFolder ? '/' : ''),\n );\n }\n }\n\n detailed.push({ requestId: originalItem.id, success: true });\n } else {\n const errorMessage = __ ? __('Delete operation failed') : 'Delete operation failed';\n detailed.push({\n requestId: originalItem.id,\n success: false,\n error: itemResult?.error || { message: errorMessage, code: 'DeleteNotAllowed' },\n });\n }\n }\n } else {\n for (const originalItem of items) {\n if (result.success) {\n const itemPath = this.pathForId(originalItem.id, originalItem.isFolder);\n if (options.permanent) {\n this.recursivelyRemoveMappings(originalItem.id, itemPath);\n } else {\n this._updateIdMapping(\n originalItem.id,\n this.trashPath + '/' + itemPath + (originalItem.isFolder ? '/' : ''),\n );\n\n if (originalItem.isFolder) {\n const oldPath = this.pathForId(originalItem.id, originalItem.isFolder);\n this.remapCachedFolderContents(\n originalItem.id,\n oldPath,\n this.trashPath + '/' + itemPath + (originalItem.isFolder ? '/' : ''),\n );\n }\n }\n detailed.push({ requestId: originalItem.id, success: true });\n } else {\n const errorMessage = __ ? __('Delete operation failed') : 'Delete operation failed';\n detailed.push({\n requestId: originalItem.id,\n success: false,\n error: result.error || { message: errorMessage, code: 'DeleteNotAllowed' },\n });\n }\n }\n }\n\n const success = detailed.every((result) => result.success);\n const errorMessage = __ ? __('Some items failed to delete') : 'Some items failed to delete';\n return { success, detailed, error: success ? undefined : result.error || { message: errorMessage, code: 'DeleteNotAllowed' } };\n }\n\n private remapCachedFolderContents(folderId: string, oldFolderPath: string, newFolderPath: string) {\n const oldNorm = oldFolderPath.replace(/\\/+$/, '');\n const newNorm = newFolderPath.replace(/\\/+$/, '');\n\n const updates: Array<{ id: string; oldPath: string }> = [];\n\n for (const [cachedId, cachedPath] of this._idToPath.entries()) {\n const normPath = cachedPath.replace(/\\/+$/, '');\n if (normPath !== oldNorm && normPath.startsWith(oldNorm + '/')) updates.push({ id: cachedId, oldPath: normPath });\n }\n\n for (const { id, oldPath } of updates) {\n const relative = oldPath.substring(oldNorm.length);\n const newItemPath = newNorm + relative;\n this._updateIdMapping(id, newItemPath);\n }\n }\n\n private recursivelyRemoveMappings(itemId: string, itemPath: string) {\n const norm = itemPath.replace(/\\/+$/, '');\n const idsToRemove: string[] = [];\n const pathsToRemove: string[] = [];\n\n for (const [cachedId, cachedPath] of this._idToPath.entries()) {\n const normCached = cachedPath.replace(/\\/+$/, '');\n if (normCached === norm || normCached.startsWith(norm + '/')) {\n idsToRemove.push(cachedId);\n pathsToRemove.push(normCached);\n }\n }\n\n for (let i = 0; i < idsToRemove.length; i++) {\n this._idToPath.delete(idsToRemove[i]);\n this._pathToId.delete(pathsToRemove[i]);\n }\n }\n\n async copyItem(item: FileSystemItem, targetFolderId: string): Promise<FileSystemItemUpdate> {\n const itemPath = this.pathForId(item.id, item.isFolder);\n const targetPath = this.pathForId(targetFolderId, true);\n\n const result = await this._inner.copyItem(\n { ...item, id: itemPath, folderId: this.pathForId(item.folderId, true) },\n targetPath,\n );\n\n const newId = this._getOrGenerateId(result.id);\n const folderId = result.folderId ? this._getOrGenerateId(result.folderId) : targetFolderId;\n return { ...result, id: newId, folderId };\n }\n\n async updateFile(\n file: FileSystemItem,\n updates: {\n name?: string;\n data?: Blob | string;\n },\n ): Promise<FileSystemItemUpdate> {\n const { __ } = this.i18n;\n if (!this._inner.updateFile) {\n const message = __ ? __('Update file is not supported by inner storage') : 'Update file is not supported by inner storage';\n throw new FileManagerApiError(message, 'UnsupportedOperation');\n }\n\n const filePath = this.pathForId(file.id, false);\n let { ...patch } = await this._inner.updateFile(\n { ...file, id: filePath, folderId: this.pathForId(file.folderId, true) },\n updates,\n );\n\n this._updateIdMapping(file.id, patch.id);\n if (patch.folderId) patch = { ...patch, folderId: this._getOrGenerateId(patch.folderId) };\n\n return { ...patch, id: this._getOrGenerateId(patch.id) };\n }\n\n async getFileData(file: FileSystemItem): Promise<Blob> {\n const { __ } = this.i18n;\n const filePath = this.pathForId(file.id, false);\n\n if (this._inner.getFileData)\n return this._inner.getFileData({ ...file, id: filePath, folderId: this.pathForId(file.folderId, true) });\n\n const url = file.url || (this.getUrl && (await this.getUrl(file)));\n if (!url) {\n const message = __ ? __('Cannot get file data: no url and no inner.getFileData') : 'Cannot get file data: no url and no inner.getFileData';\n throw new FileManagerApiError(message, 'FileReadError');\n }\n return fetch(url).then((r) => r.blob());\n }\n}\n","import React, { memo, useCallback, useEffect, useMemo, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useParams } from 'react-router-dom';\nimport { Modal, Spin, theme } from 'antd';\nimport { LoadingOutlined } from '@ant-design/icons';\n\n// SERVICES\nimport { useLazyGetAiImageSSEQuery, useLazySendAiImageRequestQuery } from 'services/imageApi';\n\n// ACTIONS and SELECTORS\nimport { selectedCurrentUser, selectedIsUserPaySmth } from 'slices/userSlice';\nimport { closeModal, openSecondModal, selectActiveModal } from 'slices/projectsPageSlice';\nimport { selectCurrentBackground, selectCurrentImage, setCurrentBackground, setCurrentImage } from 'slices/imageSlice';\n// import { selectEmail } from 'slices/emailSlice';\nimport { selectProject } from 'slices/projectSlice';\n\n// COMPONENTS\nimport ModalToChangeConfigOnFree from 'modules/components/ModalToChangeConfigOnFree/ModalToChangeConfigOnFree';\n\n// HELPERS\nimport { useAppConfig } from 'helpers/config';\nimport { useNotification } from 'modules/common/Notifications';\nimport { useEventEmitter } from 'helpers/events/react';\nimport { arrays } from 'helpers/utils/arrays';\nimport { useI18n } from 'helpers/react-i18n';\n\nimport { events } from 'constants/events';\nimport { DataSourceProxy } from './DataSource';\n\nimport { FileManagerAppWithContext, PixieOnlyApp } from '@emailmaker/filemanager';\nimport type { File, LibraryMenuKey } from '@emailmaker/filemanager/types';\nimport type { NotifyEvent, StorageProvider } from 'types';\n\n// CONSTANTS\nimport { MODALS } from 'constants/index';\n\n// STYLES\nimport '@emailmaker/filemanager/file-manager.css';\nimport './FileManager.scss';\nimport { PathAwareDataSourceProxy } from './PathAwareDataSourceProxy';\nimport { buildAssetsPath, normalizeEvent, normalizeCustomIcons } from './helpers';\n\nconst FileManagerAppWithContextMemo = memo(FileManagerAppWithContext);\nconst PixieOnlyAppMemo = memo(PixieOnlyApp);\n\nconst { useToken } = theme;\n\nconst FileManager: React.FC<{ storageProvider: StorageProvider }> = ({ storageProvider }) => {\n const appConfig = useAppConfig();\n const { projectId, emailId, blockId } = useParams();\n const i18n = useI18n();\n const { __ } = i18n;\n const { token } = useToken();\n const { error, notify } = useNotification();\n const dispatch = useDispatch();\n const isUserPay = useSelector(selectedIsUserPaySmth);\n const currentUser = useSelector(selectedCurrentUser);\n const activeModal = useSelector(selectActiveModal);\n const currentBackground = useSelector(selectCurrentBackground);\n const currentProject = useSelector(selectProject);\n const currentImage = useSelector(selectCurrentImage);\n\n const [imgType, setImgType] = useState<'img' | 'background' | ''>('');\n const [modalType, setModalType] = useState<LibraryMenuKey>('my_files');\n const [unPaidModalIsOpen, setUnPaidModalIsOpen] = useState(false);\n const [unPaidModalSlide, setUnPaidModalSlide] = useState(0);\n const [currentImageLink, setCurrentImageLink] = useState('');\n const [files, setFiles] = useState<File[]>(() => []);\n\n const onCloseModal = () => {\n dispatch(closeModal());\n setTimeout(() => setImgType(''), 600); // делаем задержку для того что бы сработала анимация закрытия модалки\n };\n\n const freeModeFireWall = !(isUserPay || currentUser.id?.toString() !== currentProject?.members?.owner.ID);\n const currentPicture = useMemo(\n () => ({ img: currentImage, background: currentBackground }),\n [currentImage, currentBackground],\n );\n\n useEffect(() => {\n if (activeModal.includes('UPLOAD_BACKGROUND_MODAL')) {\n setImgType('background');\n if (currentPicture.background) {\n setCurrentImageLink(currentPicture.background);\n }\n } else if (activeModal.includes('UPLOAD_IMAGE_MODAL')) {\n setImgType('img');\n if (currentPicture.img) {\n setCurrentImageLink(currentPicture.img);\n }\n }\n if (activeModal === MODALS.UPLOAD_IMAGE_MODAL || activeModal === MODALS.UPLOAD_BACKGROUND_MODAL) {\n setModalType('editor');\n } else if (activeModal === MODALS.UPLOAD_IMAGE_MODAL_AI || activeModal === MODALS.UPLOAD_BACKGROUND_MODAL_AI) {\n freeModeFireWall ?\n (() => {\n setUnPaidModalIsOpen(true);\n setUnPaidModalSlide(2);\n })()\n : setModalType('ai');\n } else if (\n activeModal === MODALS.UPLOAD_IMAGE_MODAL_UPLOAD ||\n activeModal === MODALS.UPLOAD_BACKGROUND_MODAL_UPLOAD\n ) {\n setModalType('my_files');\n } else if (\n activeModal === MODALS.UPLOAD_IMAGE_MODAL_STOCK ||\n activeModal === MODALS.UPLOAD_BACKGROUND_MODAL_STOCK\n ) {\n freeModeFireWall ?\n (() => {\n setUnPaidModalIsOpen(true);\n setUnPaidModalSlide(3);\n })()\n : setModalType('stock_images');\n } else if (activeModal === MODALS.UPLOAD_IMAGE_MODAL_GIF || activeModal === MODALS.UPLOAD_BACKGROUND_MODAL_GIF) {\n freeModeFireWall ?\n (() => {\n setUnPaidModalIsOpen(true);\n setUnPaidModalSlide(3);\n })()\n : setModalType('gif');\n } else if (activeModal === MODALS.UPLOAD_IMAGE_MODAL_EDIT || activeModal === MODALS.UPLOAD_BACKGROUND_MODAL_EDIT) {\n freeModeFireWall ?\n (() => {\n setUnPaidModalIsOpen(true);\n setUnPaidModalSlide(5);\n })()\n : setModalType('editor');\n dispatch(openSecondModal(MODALS.IMAGE_EDITOR_MODAL));\n } else {\n setModalType('my_files');\n }\n }, [activeModal, dispatch, freeModeFireWall, currentPicture]);\n\n const pathProxy = useMemo(() => {\n if (!storageProvider) {\n error(__('Error when initializing file manager'));\n return null;\n }\n return storageProvider.pathMode ?\n new PathAwareDataSourceProxy(\n storageProvider,\n storageProvider.rootId,\n 'Trash',\n storageProvider.trashPath,\n true,\n i18n,\n )\n : null;\n }, [storageProvider, error, i18n]);\n\n const dataProvider = useMemo(() => {\n return new DataSourceProxy(\n pathProxy ?? storageProvider,\n appConfig.fileManager,\n {\n ...storageProvider,\n trashPath: storageProvider.pathMode ? 'trash' : storageProvider.trashPath,\n rootId: storageProvider.pathMode ? '' : storageProvider.rootId,\n },\n i18n,\n );\n }, [storageProvider, pathProxy, appConfig.fileManager, i18n]);\n\n const handleNotify = useCallback(\n (e: NotifyEvent) => {\n const event = normalizeEvent(e, dataProvider, pathProxy);\n return notify(event as any, true);\n },\n [dataProvider, pathProxy],\n );\n\n const antIcon = <LoadingOutlined style={{ fontSize: 32, margin: -16 }} spin />;\n\n const onChangeSelection = useCallback(\n (_files: File[]) => {\n if (!arrays.isEqual(_files, files)) {\n setFiles(_files);\n }\n },\n [files],\n );\n\n const [sendAIImageRequestDefault] = useLazySendAiImageRequestQuery();\n /** Кнопка подтверждения */\n const handleConfirmModal = useCallback(async () => {\n if (dataProvider) {\n const file = files[0];\n if (file) {\n const url = file.url || file.thumbnailUrl || file.thumbnail;\n if (imgType === 'img') {\n dispatch(setCurrentImage(url));\n } else if (imgType === 'background') {\n dispatch(setCurrentBackground(url));\n }\n }\n }\n\n onCloseModal();\n }, [dataProvider, dispatch, closeModal, files, imgType]);\n\n const onEditorOk = useCallback(\n async (file: File) => {\n console.log('file', file);\n if (dataProvider) {\n if (file) {\n const url = file.url || file.thumbnailUrl || file.thumbnail;\n console.log('url', url);\n if (imgType === 'img') {\n dispatch(setCurrentImage(url));\n } else if (imgType === 'background') {\n dispatch(setCurrentBackground(url));\n }\n }\n }\n\n onCloseModal();\n },\n [dataProvider, dispatch, closeModal, imgType],\n );\n const onEditorClose = useCallback(async () => {\n onCloseModal();\n }, [dispatch, closeModal]);\n\n const [trigger, { data: messages = [] }] = useLazyGetAiImageSSEQuery();\n const handleLimitUsageEmitter = (appConfig as any)?.handleLimitUsageEmitter || useEventEmitter(events.ON_LIMIT_ID);\n\n const sseQuery = useCallback(\n async function (params?: any) {\n try {\n await trigger(params).unwrap();\n } catch (e) {\n console.error('Ошибка запроса:', e);\n }\n },\n [trigger],\n );\n\n // Преобразуем иконки из appConfig в формат React компонентов\n // Поддерживаются форматы: React компонент или HTML строка (SVG/img теги)\n // HTML строки автоматически санитизируются и преобразуются в React компоненты\n const customIcons = useMemo(() => {\n const iconsFromConfig = (appConfig as any)?.icons || {};\n if (!iconsFromConfig || Object.keys(iconsFromConfig).length === 0) {\n return undefined;\n }\n return normalizeCustomIcons(iconsFromConfig);\n }, [(appConfig as any)?.icons]);\n\n return !!imgType && dataProvider ?\n <>\n {!freeModeFireWall && (\n <Modal\n className=\"file-manager\"\n closable={true}\n footer={null}\n open={!!modalType && activeModal.includes('UPLOAD_IMAGE_')}\n width=\"100vw\"\n // style={{ top: 0, height: '100vh', padding: 10, maxWidth: 'none' }}\n onOk={handleConfirmModal}\n onCancel={onCloseModal}\n >\n <Spin spinning={!dataProvider} indicator={antIcon}>\n {dataProvider &&\n (modalType === 'editor' ?\n <PixieOnlyAppMemo\n onSave={onEditorOk}\n onClose={onEditorClose}\n dataProviders={dataProvider}\n theme={currentUser.theme as any}\n file={currentImageLink}\n handleNotify={handleNotify}\n assetsUrl={buildAssetsPath('', 'static/media/image-editor')}\n />\n : <FileManagerAppWithContextMemo\n dataProviders={dataProvider}\n onChangeSelection={onChangeSelection}\n onEditorOk={onEditorOk}\n handleNotify={handleNotify}\n customIcons={customIcons}\n config={{\n assetsUrl: buildAssetsPath('', 'static/media/image-editor'),\n expandRootFolderOnInit: appConfig.fileManager?.expandRootFolderOnInit !== false,\n activeLibraryItem: modalType,\n REACT_APP_GIPHY_KEY: process.env.REACT_APP_GIPHY_KEY,\n UNSPLASH_KEY: process.env.REACT_APP_UNSPLASH_KEY,\n APP_NAME_UNSPLASH: process.env.REACT_APP_GIPHY_KEY,\n fileForEdit: currentImageLink,\n projectId,\n elementId: emailId || blockId,\n pushToGTM: appConfig?.pushToGTM,\n handleLimitUsageEmitter,\n sseQuery,\n messages,\n sendAIImageRequest: (appConfig as any)?.sendAIImageRequest || sendAIImageRequestDefault,\n locale: currentUser.locale,\n // customLocale: { // @TODO: для тестирования кастомных локалей (DEV-12462)\n // // кастомные переводы\n // 'Upload file': 'customLocale',\n //\n // // кастомные переводы pixie\n // pixie: {\n // close: 'не Закрыть',\n // Cancel: 'не Отмена',\n // apply: 'не Применить',\n // },\n // },\n theme: currentUser.theme as any,\n customTheme: token as any,\n enableTrashFolder: appConfig.fileManager?.enableTrash,\n showNotifications: appConfig.fileManager?.showNotifications,\n features: {\n enableRenameFile: appConfig.fileManager?.enableRenameFile !== false,\n enableRenameFolder: appConfig.fileManager?.enableRenameFolder !== false,\n enableUpdateFile: appConfig.fileManager?.enableUpdateFile !== false,\n enableCopyItem: appConfig.fileManager?.enableCopyFile !== false,\n enableCopyFolder: appConfig.fileManager?.enableCopyFolder !== false,\n enableDelete: appConfig.fileManager?.enableDelete !== false,\n enableEdit: appConfig.fileManager?.enableEdit !== false,\n enableMoveItem: appConfig.fileManager?.enableMoveFile !== false,\n enableMoveFolder: appConfig.fileManager?.enableMoveFolder !== false,\n },\n disablePagination: appConfig.fileManager?.enablePagination === false,\n multiSelect: appConfig.fileManager?.multiSelect !== false,\n defaultFolderName: appConfig.fileManager?.defaultFolderName,\n // @ts-ignore\n availableImageExtensions: appConfig.fileManager?.availableImageExtensions, // ['jpg', 'jpeg', 'png', 'gif', 'svg',],\n // enableTrashFolder: true, // наличие папки-корзины (активировать при следующем обновлении FM)\n }}\n />)}\n </Spin>\n {/** МОДАЛКА - На редерект к оплате */}\n </Modal>\n )}\n <ModalToChangeConfigOnFree\n open={unPaidModalIsOpen}\n onCancel={() => setUnPaidModalIsOpen(false)}\n initialSlide={unPaidModalSlide}\n sideOnOk={undefined}\n />\n </>\n : null;\n};\n\nexport default FileManager;\n"],"names":["arrays","_arrays","isEqual","arr1","arr2","compareFn","item1","item2","length","index","unique","arr","idFn","item","ids","Set","filter","id","result","has","add","normalizeParentKey","parentId","normalizePageSize","pageSize","Infinity","n","Number","isFinite","getFolderId","entity","v","folderId","String","isFolderEntity","x","isFolder","generateId","_globalThis$crypto","globalThis","crypto","randomUUID","cryptoObj","msCrypto","getRandomValues","Uint8Array","s","i","toString","padStart","Date","now","Math","floor","random","MAX_SAFE_INTEGER","slice","paramsKey","params","p","core","rest","take","k","Object","keys","sort","includes","push","restStr","JSON","stringify","coreStr","join","h","charCodeAt","shortHash","EntityCacheManager","constructor","entities","Map","childrenByParent","maxCacheSize","checkCacheSize","this","size","entries","Array","from","a","b","updatedAt","toRemove","record","deleteEntityById","getEntity","_this$entities$get","get","value","getRecord","getFileSystemItem","undefined","getFolder","getChildrenIds","opts","key","bucket","onlyFileSystemItems","files","onlyFolders","folders","upsertEntity","_this$entities$get2","prevRec","prev","prevParent","nextParent","prevIsFolder","nextIsFolder","preservedChildrenCount","prevCount","childrenCount","nextCount","oldKey","oldBucket","delete","entityToSave","set","newKey","newBucket","updateServerChildrenCount","serverCount","isNaN","rec","updatedFolder","_this$entities$get3","parent","deleteFolderRecursive","rootRec","deletedFolderRecords","deletedFileSystemItemRecords","folderQueue","allFolderInfos","allFileSystemItemIds","cur","shift","childFolderId","childRec","fid","file","pKey","pBucket","folder","moveEntityById","entityId","targetParentId","_this$entities$get4","ent","prevKey","prevBucket","updated","existingCount","nextKey","nextBucket","copyFileSystemItem","fileId","newId","targetFolderId","_this$entities$get5","copy","copyFolderShallow","_this$entities$get6","isEntityStale","ttlMs","_this$entities$get7","touch","at","getEntitiesByIds","map","_this$entities$get$va","_this$entities$get8","toJSON","fromJSON","data","mgr","_data$entities","_data$childrenByParen","ViewCacheManager","options","ttl","errorTtl","entityTtl","_options$allowSortedI","_options$allowSearchI","_options$invalidateOn","_options$preloadPages","_options$preloadPages2","views","strategy","serverChildrenCountHandler","childrenCountInvalidator","maxViewsPerParent","allowSortedInsert","allowSearchInsert","invalidateOnPaginationFull","preloadPagesBefore","preloadPagesAfter","comparator","filterMatch","setServerChildrenCountHandler","handler","setChildrenCountInvalidator","parentKey","isExpired","isErrorExpired","areEntitiesStale","entitiesManager","some","isEntityTypeCompatible","itemType","cleanupOldViews","view","pop","getOrCreateChildren","loader","_rec$view$meta","qKey","promise","meta","error","loadId","stale","_rec$params","_rec$view$meta2","allItems","Boolean","items","myLoadId","_this$views$get","_this$strategy$preloa","_this$strategy$preloa2","currentRec","err","Error","name","e","f","copyMeta","total","preloadAfter","preloadBefore","isPaginated","_params$page","savedParentId","savedParams","savedTotalPages","totalPages","savedCurrentPage","page","savedPageSize","savedLoader","savedLoadId","setTimeout","preloadPagesAsync","fixedParams","currentPage","initialTotalPages","initialMeta","initialLoadId","mainRec","currentTotalPages","doPreload","async","pageParams","pageNum","preloadResult","bucketNow","mainRecNow","pageKey","pageRec","min","removeEmptyPageIfNeeded","baseParams","updateTotalPagesForAllViews","newTotalPages","isParamsSame","aKeys","bKeys","syncTotalsInSameViews","baseRec","_baseRec$params","max","ceil","_rec$params2","_baseRec$params2","canSafelyModifySortedView","sortBy","sortOrder","cascadeShiftPages","startPageRec","startPageNum","currentPageRec","currentPageNum","wasEmptyPageRemoved","iterations","nextPageKey","nextPageRec","_currentPageRec$view$","needed","validItems","_currentPageRec$view$2","nextPageNum","nextPageMeta","_currentPageRec$view$3","cascadeShiftToNextPage","_nextPageRec","_nextPageRec$view$val","_currentPageRec$view$4","nextPageParams","wasNewPageCreated","_currentPageRec$view$5","currentMeta","nextPageTotalPages","tryInsertSorted","_rec$params3","currentEntities","lo","hi","mid","cmp","updateChildrenCountForOperation","operation","prevParentId","_this$childrenCountIn","_this$childrenCountIn2","_this$childrenCountIn3","_this$childrenCountIn4","currentParentId","adjustChildrenCount","call","delta","newCount","smartInvalidateChildrenViews","prevEntity","_rec$params4","_params$page2","hasSort","hasSearch","search","_rec$view$value","abortController","abort","_rec$view$meta3","shouldInvalidateCompletely","handleDelete","handleInsert","handleUpdate","handleMove","tryReinsertEntity","_rec$params5","_rec$params6","entityInView","finitePageSize","_rec$params7","_rec$params8","_rec$view$meta4","_rec$params9","stillCompatible","_rec$params0","_rec$params1","_rec$view$meta5","_rec$params10","forceInvalidateChildrenViews","getKnownTotal","best","_rec$view$updatedAt","_rec$view$updatedAt2","_data$views","qk","tup","TreeCache","invalidateChildrenCountCache","childrenCountPromises","viewOptions","manager","handleServerReportedChildrenCount","_this$entities$getEnt","_this$entities$getFil","_this$entities$getFol","isAncestor","ancestorId","descendantId","visited","moveEntity","copyEntity","_this$entities$getEnt2","queue","foldersOrder","childFolders","c","idMap","old","_idMap$get","oldFolder","newIdForFolder","oldParent","newParent","folderCopy","newFolderId","fileIds","newFileSystemItemId","deleteEntity","fo","deletedFileSystemItemIds","r","deletedFolderIds","forceInvalidate","stack","cf","_ent$folderId","getChildrenCount","existing","knownTotal","loaded","_data$ttl","_data$errorTtl","_data$entities2","_data$views2","tc","_viewOptions$allowSor","_viewOptions$allowSea","_viewOptions$invalida","_viewOptions$preloadP","_viewOptions$preloadP2","serverTotal","checkAndResolveChildrenCountConflict","parentFolder","localChildrenCount","mapFileItem","childCount","DataSourceProxy","BindMethods","_class","_findOrCreateFolderByPath","path","__","i18n","parts","filePath","replaceAll","split","message","replace","FileManagerApiError","current","part","_current","getFiles","find","_current2","_dataProvider","createFolder","getTrashFolder","_pathOptions","trashPath","getTempFolder","tempPath","_options","defaultI18nContext","_options$cacheStrateg","_options$cacheStrateg2","_cache","_rootId","_useSoftDelete","_enableTrash","_validateDuplicates","useSoftDelete","rootId","enableTrash","validateDuplicates","cacheStrategy","setController","invalidateItemCache","itemId","getCachedItem","controller","_this$_dataProvider$s","_this$_dataProvider","normalizeId","_validateName","trim","errorCode","test","_validateTargetFolderType","targetId","targetFolder","_checkNameExistsInCache","excludeId","folderIdNormalized","childrenIds","childId","child","_isAncestor","sourceFolderId","targetIdNormalized","sourceIdNormalized","limit","useClientSideFilter","clientSideFilter","useClientSideSorting","clientSideSorting","useClientSidePaging","clientSidePaging","serverParams","cacheKeyParams","serverResult","getItems","pagination","searchLower","toLowerCase","_f$name","_defaultClientSideSort","paginatedFiles","start","end","getUrl","getThumbnailUrl","filePromises","url","thumbnailUrl","Promise","all","resolve","paginationResult","hasNextPage","compareResult","localeCompare","date","getTime","getFileData","_file","fetch","blob","_uploadFile","_file$folderId","uploadFile","uploadFiles","request","_request$folderId","filesToUpload","_file$folderId2","fileFolderId","cachedFolder","batchResult","detailed","success","providerFiles","_f$folderId","_uploaded$id","_uploaded$folderId","uploaded","requestId","d","_file$folderId3","deleteFile","trash","moveItem","hardDeleteItem","deleteItems","itemIds","permanent","moveItems","hardDeleteItems","response","deleteItem","cachedFile","is_force_create","folderParentId","deleteFolder","renameFolder","newName","renameItem","renameFile","renamed","cachedItem","cachedItems","deleted","copyItem","copyItems","_current$data","_current$data2","uploadFileByUrl","_data$folderId","noFolder","tempFolder","updateFile","updates","PathAwareDataSourceProxy","_inner","rootPath","trashId","ensureFolderTrailingSlash","_pathToId","_idToPath","pathForId","_getOrGenerateId","_this$_inner$setContr","_this$_inner","cleanedPath","uuidv4","silent","slashCount","cleanPath","repeat","endsWith","_updateIdMapping","newPath","oldPath","folderPath","mappedItems","parentPath","itemPath","oldItemPath","newItem","remapCachedFolderContents","recursivelyRemoveMappings","_request$items$map","_request$items","_request$items$map2","_request$items2","_uploaded$detailed","originalRequestFolderId","originalItemFolderIds","rootFolderPath","mappedRequest","_ref","_originalItemFolderId","mappedId","mappedFolderId","finalFolderId","targetPath","innerItems","resultMap","itemResult","originalItem","indexOf","errorMessage","code","_itemResult$data","every","oldFolderPath","newFolderPath","oldNorm","newNorm","cachedId","cachedPath","normPath","startsWith","newItemPath","substring","norm","idsToRemove","pathsToRemove","normCached","patch","then","FileManagerAppWithContextMemo","memo","FileManagerAppWithContext","PixieOnlyAppMemo","PixieOnlyApp","useToken","theme","FileManager","storageProvider","_currentUser$id","_currentProject$membe","_appConfig$fileManage","_appConfig$fileManage2","_appConfig$fileManage3","_appConfig$fileManage4","_appConfig$fileManage5","_appConfig$fileManage6","_appConfig$fileManage7","_appConfig$fileManage8","_appConfig$fileManage9","_appConfig$fileManage0","_appConfig$fileManage1","_appConfig$fileManage10","_appConfig$fileManage11","_appConfig$fileManage12","_appConfig$fileManage13","_appConfig$fileManage14","appConfig","useAppConfig","projectId","emailId","blockId","useParams","useI18n","token","notify","useNotification","dispatch","useDispatch","isUserPay","useSelector","selectedIsUserPaySmth","currentUser","selectedCurrentUser","activeModal","selectActiveModal","currentBackground","selectCurrentBackground","currentProject","selectProject","currentImage","selectCurrentImage","imgType","setImgType","useState","modalType","setModalType","unPaidModalIsOpen","setUnPaidModalIsOpen","unPaidModalSlide","setUnPaidModalSlide","currentImageLink","setCurrentImageLink","setFiles","onCloseModal","closeModal","freeModeFireWall","members","owner","ID","currentPicture","useMemo","img","background","useEffect","MODALS","UPLOAD_IMAGE_MODAL","UPLOAD_BACKGROUND_MODAL","UPLOAD_IMAGE_MODAL_AI","UPLOAD_BACKGROUND_MODAL_AI","UPLOAD_IMAGE_MODAL_UPLOAD","UPLOAD_BACKGROUND_MODAL_UPLOAD","UPLOAD_IMAGE_MODAL_STOCK","UPLOAD_BACKGROUND_MODAL_STOCK","UPLOAD_IMAGE_MODAL_GIF","UPLOAD_BACKGROUND_MODAL_GIF","UPLOAD_IMAGE_MODAL_EDIT","UPLOAD_BACKGROUND_MODAL_EDIT","openSecondModal","IMAGE_EDITOR_MODAL","pathProxy","pathMode","dataProvider","fileManager","handleNotify","useCallback","event","normalizeEvent","antIcon","React","LoadingOutlined","style","fontSize","margin","spin","onChangeSelection","_files","sendAIImageRequestDefault","useLazySendAiImageRequestQuery","handleConfirmModal","thumbnail","setCurrentImage","setCurrentBackground","onEditorOk","onEditorClose","trigger","messages","useLazyGetAiImageSSEQuery","handleLimitUsageEmitter","useEventEmitter","events","ON_LIMIT_ID","sseQuery","unwrap","customIcons","iconsFromConfig","icons","normalizeCustomIcons","Modal","className","closable","footer","open","width","onOk","onCancel","Spin","spinning","indicator","onSave","onClose","dataProviders","assetsUrl","buildAssetsPath","config","expandRootFolderOnInit","activeLibraryItem","REACT_APP_GIPHY_KEY","process","UNSPLASH_KEY","APP_NAME_UNSPLASH","fileForEdit","elementId","pushToGTM","sendAIImageRequest","locale","customTheme","enableTrashFolder","showNotifications","features","enableRenameFile","enableRenameFolder","enableUpdateFile","enableCopyItem","enableCopyFile","enableCopyFolder","enableDelete","enableEdit","enableMoveItem","enableMoveFile","enableMoveFolder","disablePagination","enablePagination","multiSelect","defaultFolderName","availableImageExtensions","ModalToChangeConfigOnFree","initialSlide","sideOnOk"],"sourceRoot":""}
|